am 6216c4ac: (-s ours) am a9f1a9f9: (-s ours) am 705405df: (-s ours) am a3d541b5: (-s ours) Merge "DO NOT MERGE ANYWHERE: bumping cts to 5.1r3" into lollipop-mr1-cts-dev

* commit '6216c4acbbe36b7c14f20ab757948dfe53243211':
  DO NOT MERGE ANYWHERE: bumping cts to 5.1r3
diff --git a/CtsBuild.mk b/CtsBuild.mk
index 1b12293..c745885 100644
--- a/CtsBuild.mk
+++ b/CtsBuild.mk
@@ -17,7 +17,7 @@
 # Functions to get the paths of the build outputs.
 
 define cts-get-lib-paths
-	$(foreach lib,$(1),$(HOST_OUT_JAVA_LIBRARIES)/$(lib).jar)
+	$(foreach lib,$(1),$(CTS_TESTCASES_OUT)/$(lib).jar)
 endef
 
 define cts-get-ui-lib-paths
@@ -25,7 +25,7 @@
 endef
 
 define cts-get-native-paths
-	$(foreach exe,$(1),$(call intermediates-dir-for,EXECUTABLES,$(exe),,,$(3))/$(exe)$(2))
+	$(foreach exe,$(1),$(CTS_TESTCASES_OUT)/$(exe)$(2))
 endef
 
 define cts-get-package-paths
diff --git a/CtsTestCaseList.mk b/CtsTestCaseList.mk
index 6f475cc..4d30dda 100644
--- a/CtsTestCaseList.mk
+++ b/CtsTestCaseList.mk
@@ -19,6 +19,8 @@
     CtsDocumentClient \
     CtsExternalStorageApp \
     CtsInstrumentationAppDiffCert \
+    CtsUsePermissionApp \
+    CtsUsePermissionAppCompat \
     CtsPermissionDeclareApp \
     CtsPermissionDeclareAppCompat \
     CtsReadExternalStorageApp \
@@ -57,13 +59,33 @@
     CtsKeySetSigningBUpgradeB \
     CtsKeySetSigningAAndBUpgradeA \
     CtsKeySetSigningAAndCUpgradeB \
-    CtsKeySetSigningAUpgradeNone
+    CtsKeySetSigningAUpgradeNone \
+    CtsKeySetSharedUserSigningAUpgradeB \
+    CtsKeySetSharedUserSigningBUpgradeB \
+    CtsKeySetSigningABadUpgradeB \
+    CtsKeySetSigningCBadAUpgradeAB \
+    CtsKeySetSigningANoDefUpgradeB \
+    CtsKeySetSigningAUpgradeEcA \
+    CtsKeySetSigningEcAUpgradeA
+
+cts_account_support_packages := \
+    CtsUnaffiliatedAccountAuthenticators
 
 cts_support_packages := \
     CtsAccelerationTestStubs \
+    CtsAlarmClockService \
     CtsAppTestStubs \
+    CtsAssistService \
+    CtsAssistApp \
+    CtsAtraceTestApp \
+    CtsCertInstallerApp \
     CtsDeviceAdmin \
     CtsDeviceOpenGl \
+    CtsWifiConfigCreator \
+    CtsDeviceAndProfileOwnerApp \
+    CtsDeviceAppUsageTestApp \
+    CtsDeviceInfo \
+    CtsDeviceOsTestApp \
     CtsDeviceOwnerApp \
     CtsDeviceTaskswitchingAppA \
     CtsDeviceTaskswitchingAppB \
@@ -74,15 +96,23 @@
     CtsIntentSenderApp \
     CtsLauncherAppsTests \
     CtsLauncherAppsTestsSupport \
+    CtsLeanbackJank \
     CtsManagedProfileApp \
     CtsMonkeyApp \
     CtsMonkeyApp2 \
+    CtsPermissionApp \
     CtsSimpleApp \
+    CtsSimplePreMApp \
     CtsSomeAccessibilityServices \
     CtsThemeDeviceApp \
     TestDeviceSetup \
     CtsUiAutomatorApp \
     CtsUsbSerialTestApp \
+    CtsVoiceInteractionService \
+    CtsVoiceInteractionApp \
+    CtsVoiceSettingsService \
+    CtsWidgetProviderApp \
+    $(cts_account_support_packages) \
     $(cts_security_apps_list) \
     $(cts_security_keysets_list)
 
@@ -111,11 +141,14 @@
     CtsAccessibilityServiceTestCases \
     CtsAccessibilityTestCases \
     CtsAdminTestCases \
+    CtsAlarmClockTestCases \
     CtsAnimationTestCases \
     CtsAppTestCases \
     CtsAppWidgetTestCases \
+    CtsAssistTestCases \
     CtsBluetoothTestCases \
     CtsCalendarcommon2TestCases \
+    CtsCallLogTestCases \
     CtsContentTestCases \
     CtsDatabaseTestCases \
     CtsDisplayTestCases \
@@ -128,16 +161,21 @@
     CtsGraphicsTestCases \
     CtsGraphics2TestCases \
     CtsHardwareTestCases \
+    CtsJankTestCases \
+    CtsLeanbackJankTestCases \
     CtsJobSchedulerDeviceTestCases \
     CtsJniTestCases \
     CtsKeystoreTestCases \
+    CtsLibcoreLegacy22TestCases \
     CtsLocationTestCases \
     CtsLocation2TestCases \
     CtsMediaStressTestCases \
     CtsMediaTestCases \
+    CtsMidiTestCases \
     CtsNativeOpenGLTestCases \
     CtsNdefTestCases \
     CtsNetTestCases \
+    CtsNetTestCasesLegacyApi22 \
     CtsOpenGLTestCases \
     CtsOpenGlPerfTestCases \
     CtsOsTestCases \
@@ -154,18 +192,22 @@
     CtsSecurityTestCases \
     CtsSignatureTestCases \
     CtsSpeechTestCases \
+    CtsTelecomTestCases \
+    CtsTelecomTestCases2 \
     CtsTelephonyTestCases \
     CtsTextTestCases \
     CtsTextureViewTestCases \
     CtsThemeTestCases \
+    CtsTransitionTestCases \
     CtsTvTestCases \
     CtsUiAutomationTestCases \
     CtsUiRenderingTestCases \
     CtsUsageStatsTestCases \
     CtsUtilTestCases \
     CtsViewTestCases \
+    CtsVoiceInteractionTestCases \
+    CtsVoiceSettingsTestCases \
     CtsWebkitTestCases \
-    CtsWebGLTestCases \
     CtsWidgetTestCases
 
 # All APKs that need to be scanned by the coverage utilities.
@@ -177,6 +219,7 @@
 cts_host_libraries := \
     CtsAdbTests \
     CtsAppSecurityTests \
+    CtsAtraceHostTestCases \
     CtsDevicePolicyManagerTestCases \
     CtsDumpsysHostTestCases \
     CtsHostJank \
@@ -184,7 +227,9 @@
     CtsHostUi \
     CtsJdwpSecurityHostTestCases \
     CtsMonkeyTestCases \
+    CtsOsHostTestCases \
     CtsThemeHostTestCases \
+    CtsUsageHostTestCases \
     CtsSecurityHostTestCases \
     CtsUsbTests
 
@@ -205,16 +250,14 @@
 
 cts_device_jars := \
     CtsDeviceJank \
-    CtsJdwpApp \
-    CtsPrintInstrument
-
-cts_device_executables := \
-    print-instrument
+    CtsJdwpApp
 
 cts_target_junit_tests := \
     CtsJdwp
 
 cts_deqp_test_apis := \
+    egl \
+    gles2 \
     gles3 \
     gles31
 
@@ -225,14 +268,8 @@
     $(call cts-get-ui-lib-paths,$(cts_ui_tests)) \
     $(call cts-get-ui-lib-paths,$(cts_device_jars)) \
     $(call cts-get-ui-lib-paths,$(cts_target_junit_tests)) \
-    $(call cts-get-executable-paths,$(cts_device_executables))
-
-# NOTE: If compiling on a 64 bit target, TARGET_2ND_ARCH will be non-empty
-# and will cause the function to expand to the secondary arch object
-# directory. If compiling on a 32 bit target, TARGET_2ND_ARCH will be
-# empty and will cause the function to expand to the primary arch object
-# directory.
-CTS_TEST_CASES += $(call cts-get-native-paths,$(cts_native_tests),32,$(TARGET_2ND_ARCH))
+    $(call cts-get-executable-paths,$(cts_device_executables)) \
+    $(call cts-get-native-paths,$(cts_native_tests),32)
 
 ifeq ($(TARGET_IS_64_BIT),true)
 CTS_TEST_CASES += $(call cts-get-native-paths,$(cts_native_tests),64)
diff --git a/apps/CameraITS/CameraITS.pdf b/apps/CameraITS/CameraITS.pdf
index 2430420..8953af9 100644
--- a/apps/CameraITS/CameraITS.pdf
+++ b/apps/CameraITS/CameraITS.pdf
Binary files differ
diff --git a/apps/CameraITS/pymodules/its/caps.py b/apps/CameraITS/pymodules/its/caps.py
index 24f4e75..95f19d9 100644
--- a/apps/CameraITS/pymodules/its/caps.py
+++ b/apps/CameraITS/pymodules/its/caps.py
@@ -133,6 +133,17 @@
     """
     return len(its.objects.get_available_output_sizes("raw10", props)) > 0
 
+def raw12(props):
+    """Returns whether a device supports RAW12 output.
+
+    Args:
+        props: Camera properties object.
+
+    Returns:
+        Boolean.
+    """
+    return len(its.objects.get_available_output_sizes("raw12", props)) > 0
+
 def sensor_fusion(props):
     """Returns whether the camera and motion sensor timestamps for the device
     are in the same time domain and can be compared directly.
@@ -222,6 +233,109 @@
     return props.has_key("android.control.aeCompensationRange") and \
            props["android.control.aeCompensationRange"] != [0, 0]
 
+def ae_lock(props):
+    """Returns whether a device supports AE lock
+
+    Args:
+        props: Camera properties object.
+
+    Return:
+        Boolean.
+    """
+    return props.has_key("android.control.aeLockAvailable") and \
+           props["android.control.aeLockAvailable"] == 1
+
+def awb_lock(props):
+    """Returns whether a device supports AWB lock
+
+    Args:
+        props: Camera properties object.
+
+    Return:
+        Boolean.
+    """
+    return props.has_key("android.control.awbLockAvailable") and \
+           props["android.control.awbLockAvailable"] == 1
+
+def lsc_map(props):
+    """Returns whether a device supports lens shading map output
+
+    Args:
+        props: Camera properties object.
+
+    Return:
+        Boolean.
+    """
+    return props.has_key(
+            "android.statistics.info.availableLensShadingMapModes") and \
+        1 in props["android.statistics.info.availableLensShadingMapModes"]
+
+def lsc_off(props):
+    """Returns whether a device supports disabling lens shading correction
+
+    Args:
+        props: Camera properties object.
+
+    Return:
+        Boolean.
+    """
+    return props.has_key(
+            "android.shading.availableModes") and \
+        0 in props["android.shading.availableModes"]
+
+def yuv_reprocess(props):
+    """Returns whether a device supports YUV reprocessing.
+
+    Args:
+        props: Camera properties object.
+
+    Returns:
+        Boolean.
+    """
+    return props.has_key("android.request.availableCapabilities") and \
+           7 in props["android.request.availableCapabilities"]
+
+def private_reprocess(props):
+    """Returns whether a device supports PRIVATE reprocessing.
+
+    Args:
+        props: Camera properties object.
+
+    Returns:
+        Boolean.
+    """
+    return props.has_key("android.request.availableCapabilities") and \
+           4 in props["android.request.availableCapabilities"]
+
+def noise_reduction_mode(props, mode):
+    """Returns whether a device supports the noise reduction mode.
+
+    Args:
+        props: Camera properties objects.
+        mode: Integer, indicating the noise reduction mode to check for
+              availability.
+
+    Returns:
+        Boolean.
+    """
+    return props.has_key(
+            "android.noiseReduction.availableNoiseReductionModes") and mode \
+            in props["android.noiseReduction.availableNoiseReductionModes"];
+
+def edge_mode(props, mode):
+    """Returns whether a device supports the edge mode.
+
+    Args:
+        props: Camera properties objects.
+        mode: Integer, indicating the edge mode to check for availability.
+
+    Returns:
+        Boolean.
+    """
+    return props.has_key(
+            "android.edge.availableEdgeModes") and mode \
+            in props["android.edge.availableEdgeModes"];
+
 class __UnitTest(unittest.TestCase):
     """Run a suite of unit tests on this module.
     """
diff --git a/apps/CameraITS/pymodules/its/device.py b/apps/CameraITS/pymodules/its/device.py
index ad9786e..756f959 100644
--- a/apps/CameraITS/pymodules/its/device.py
+++ b/apps/CameraITS/pymodules/its/device.py
@@ -41,12 +41,21 @@
         sock: The open socket.
     """
 
-    # Open a connection to localhost:6000, forwarded to port 6000 on the device.
-    # TODO: Support multiple devices running over different TCP ports.
+    # Open a connection to localhost:<host_port>, forwarded to port 6000 on the
+    # device. <host_port> is determined at run-time to support multiple
+    # connected devices.
     IPADDR = '127.0.0.1'
-    PORT = 6000
+    REMOTE_PORT = 6000
     BUFFER_SIZE = 4096
 
+    # LOCK_PORT is used as a mutex lock to protect the list of forwarded ports
+    # among all processes. The script assumes LOCK_PORT is available and will
+    # try to use ports between CLIENT_PORT_START and
+    # CLIENT_PORT_START+MAX_NUM_PORTS-1 on host for ITS sessions.
+    CLIENT_PORT_START = 6000
+    MAX_NUM_PORTS = 100
+    LOCK_PORT = CLIENT_PORT_START + MAX_NUM_PORTS
+
     # Seconds timeout on each socket operation.
     SOCK_TIMEOUT = 10.0
     SEC_TO_NSEC = 1000*1000*1000.0
@@ -58,8 +67,8 @@
     EXTRA_SUCCESS = 'camera.its.extra.SUCCESS'
     EXTRA_SUMMARY = 'camera.its.extra.SUMMARY'
 
-    # TODO: Handle multiple connected devices.
-    ADB = "adb -d"
+    adb = "adb -d"
+    device_id = ""
 
     # Definitions for some of the common output format options for do_capture().
     # Each gets images of full resolution for each requested format.
@@ -75,12 +84,83 @@
     CAP_RAW_YUV_JPEG = [{"format":"raw"}, {"format":"yuv"}, {"format":"jpeg"}]
     CAP_DNG_YUV_JPEG = [{"format":"dng"}, {"format":"yuv"}, {"format":"jpeg"}]
 
-    # Method to handle the case where the service isn't already running.
-    # This occurs when a test is invoked directly from the command line, rather
-    # than as a part of a separate test harness which is setting up the device
-    # and the TCP forwarding.
-    def __pre_init(self):
+    # Initialize the socket port for the host to forward requests to the device.
+    # This method assumes localhost's LOCK_PORT is available and will try to
+    # use ports between CLIENT_PORT_START and CLIENT_PORT_START+MAX_NUM_PORTS-1
+    def __init_socket_port(self):
+        NUM_RETRIES = 100
+        RETRY_WAIT_TIME_SEC = 0.05
 
+        # Bind a socket to use as mutex lock
+        socket_lock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        for i in range(NUM_RETRIES):
+            try:
+                socket_lock.bind((ItsSession.IPADDR, ItsSession.LOCK_PORT))
+                break
+            except socket.error:
+                if i == NUM_RETRIES - 1:
+                    raise its.error.Error(self.device_id,
+                                          "acquiring socket lock timed out")
+                else:
+                    time.sleep(RETRY_WAIT_TIME_SEC)
+
+        # Check if a port is already assigned to the device.
+        command = "adb forward --list"
+        proc = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
+        output, error = proc.communicate()
+
+        port = None
+        used_ports = []
+        for line in output.split(os.linesep):
+            # each line should be formatted as:
+            # "<device_id> tcp:<host_port> tcp:<remote_port>"
+            forward_info = line.split()
+            if len(forward_info) >= 3 and \
+               len(forward_info[1]) > 4 and forward_info[1][:4] == "tcp:" and \
+               len(forward_info[2]) > 4 and forward_info[2][:4] == "tcp:":
+                local_p = int(forward_info[1][4:])
+                remote_p = int(forward_info[2][4:])
+                if forward_info[0] == self.device_id and \
+                   remote_p == ItsSession.REMOTE_PORT:
+                    port = local_p
+                    break;
+                else:
+                    used_ports.append(local_p)
+
+        # Find the first available port if no port is assigned to the device.
+        if port is None:
+            for p in range(ItsSession.CLIENT_PORT_START,
+                           ItsSession.CLIENT_PORT_START +
+                           ItsSession.MAX_NUM_PORTS):
+                if p not in used_ports:
+                    # Try to run "adb forward" with the port
+                    command = "%s forward tcp:%d tcp:%d" % \
+                              (self.adb, p, self.REMOTE_PORT)
+                    proc = subprocess.Popen(command.split(),
+                                            stdout=subprocess.PIPE,
+                                            stderr=subprocess.PIPE)
+                    output, error = proc.communicate()
+
+                    # Check if there is no error
+                    if error is None or error.find("error") < 0:
+                        port = p
+                        break
+
+        if port is None:
+            raise its.error.Error(self.device_id, " cannot find an available " +
+                                  "port")
+
+        # Release the socket as mutex unlock
+        socket_lock.close()
+
+        # Connect to the socket
+        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        self.sock.connect((self.IPADDR, port))
+        self.sock.settimeout(self.SOCK_TIMEOUT)
+
+    # Reboot the device if needed and wait for the service to be ready for
+    # connection.
+    def __wait_for_service(self):
         # This also includes the optional reboot handling: if the user
         # provides a "reboot" or "reboot=N" arg, then reboot the device,
         # waiting for N seconds (default 30) before returning.
@@ -90,19 +170,19 @@
                 if len(s) > 7 and s[6] == "=":
                     duration = int(s[7:])
                 print "Rebooting device"
-                _run("%s reboot" % (ItsSession.ADB));
-                _run("%s wait-for-device" % (ItsSession.ADB))
+                _run("%s reboot" % (self.adb));
+                _run("%s wait-for-device" % (self.adb))
                 time.sleep(duration)
                 print "Reboot complete"
 
         # TODO: Figure out why "--user 0" is needed, and fix the problem.
-        _run('%s shell am force-stop --user 0 %s' % (ItsSession.ADB, self.PACKAGE))
+        _run('%s shell am force-stop --user 0 %s' % (self.adb, self.PACKAGE))
         _run(('%s shell am startservice --user 0 -t text/plain '
-              '-a %s') % (ItsSession.ADB, self.INTENT_START))
+              '-a %s') % (self.adb, self.INTENT_START))
 
         # Wait until the socket is ready to accept a connection.
         proc = subprocess.Popen(
-                ItsSession.ADB.split() + ["logcat"],
+                self.adb.split() + ["logcat"],
                 stdout=subprocess.PIPE)
         logcat = proc.stdout
         while True:
@@ -111,15 +191,14 @@
                 break
         proc.kill()
 
-        # Setup the TCP-over-ADB forwarding.
-        _run('%s forward tcp:%d tcp:%d' % (ItsSession.ADB,self.PORT,self.PORT))
-
     def __init__(self):
-        if "noinit" not in sys.argv:
-            self.__pre_init()
-        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-        self.sock.connect((self.IPADDR, self.PORT))
-        self.sock.settimeout(self.SOCK_TIMEOUT)
+        # Initialize device id and adb command.
+        self.device_id = get_device_id()
+        self.adb = "adb -s " + self.device_id
+
+        self.__wait_for_service()
+        self.__init_socket_port()
+
         self.__close_camera()
         self.__open_camera()
 
@@ -360,7 +439,7 @@
             raise its.error.Error('3A failed to converge')
         return ae_sens, ae_exp, awb_gains, awb_transform, af_dist
 
-    def do_capture(self, cap_request, out_surfaces=None):
+    def do_capture(self, cap_request, out_surfaces=None, reprocess_format=None):
         """Issue capture request(s), and read back the image(s) and metadata.
 
         The main top-level function for capturing one or more images using the
@@ -369,7 +448,7 @@
 
         The out_surfaces field can specify the width(s), height(s), and
         format(s) of the captured image. The formats may be "yuv", "jpeg",
-        "dng", "raw", or "raw10". The default is a YUV420 frame ("yuv")
+        "dng", "raw", "raw10", or "raw12". The default is a YUV420 frame ("yuv")
         corresponding to a full sensor frame.
 
         Note that one or more surfaces can be specified, allowing a capture to
@@ -379,6 +458,18 @@
         surface. At most one output surface can be specified for a given format,
         and raw+dng, raw10+dng, and raw+raw10 are not supported as combinations.
 
+        If reprocess_format is not None, for each request, an intermediate
+        buffer of the given reprocess_format will be captured from camera and
+        the intermediate buffer will be reprocessed to the output surfaces. The
+        following settings will be turned off when capturing the intermediate
+        buffer and will be applied when reprocessing the intermediate buffer.
+            1. android.noiseReduction.mode
+            2. android.edge.mode
+            3. android.reprocess.effectiveExposureFactor
+
+        Supported reprocess format are "yuv" and "private". Supported output
+        surface formats when reprocessing is enabled are "yuv" and "jpeg".
+
         Example of a single capture request:
 
             {
@@ -450,6 +541,8 @@
                 will be converted to JSON and sent to the device.
             out_surfaces: (Optional) specifications of the output image formats
                 and sizes to use for each capture.
+            reprocess_format: (Optional) The reprocessing format. If not None,
+                reprocessing will be enabled.
 
         Returns:
             An object, list of objects, or list of lists of objects, where each
@@ -461,7 +554,11 @@
             * metadata: the capture result object (Python dictionary).
         """
         cmd = {}
-        cmd["cmdName"] = "doCapture"
+        if reprocess_format != None:
+            cmd["cmdName"] = "doReprocessCapture"
+            cmd["reprocessFormat"] = reprocess_format
+        else:
+            cmd["cmdName"] = "doCapture"
         if not isinstance(cap_request, list):
             cmd["captureRequests"] = [cap_request]
         else:
@@ -540,10 +637,52 @@
         self.sock.settimeout(self.SOCK_TIMEOUT)
         return rets if len(rets)>1 else rets[0]
 
-def report_result(camera_id, success, summary_path=None):
+def get_device_id():
+    """ Return the ID of the device that the test is running on.
+
+    Return the device ID provided in the command line if it's connected. If no
+    device ID is provided in the command line and there is only one device
+    connected, return the device ID by parsing the result of "adb devices".
+
+    Raise an exception if no device is connected; or the device ID provided in
+    the command line is not connected; or no device ID is provided in the
+    command line and there are more than 1 device connected.
+
+    Returns:
+        Device ID string.
+    """
+    device_id = None
+    for s in sys.argv[1:]:
+        if s[:7] == "device=" and len(s) > 7:
+            device_id = str(s[7:])
+
+    # Get a list of connected devices
+    devices = []
+    command = "adb devices"
+    proc = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
+    output, error = proc.communicate()
+    for line in output.split(os.linesep):
+        device_info = line.split()
+        if len(device_info) == 2 and device_info[1] == "device":
+            devices.append(device_info[0])
+
+    if len(devices) == 0:
+        raise its.error.Error("No device is connected!")
+    elif device_id is not None and device_id not in devices:
+        raise its.error.Error(device_id + " is not connected!")
+    elif device_id is None and len(devices) >= 2:
+        raise its.error.Error("More than 1 device are connected. " +
+                "Use device=<device_id> to specify a device to test.")
+    elif len(devices) == 1:
+        device_id = devices[0]
+
+    return device_id
+
+def report_result(device_id, camera_id, success, summary_path=None):
     """Send a pass/fail result to the device, via an intent.
 
     Args:
+        device_id: The ID string of the device to report the results to.
         camera_id: The ID string of the camera for which to report pass/fail.
         success: Boolean, indicating if the result was pass or fail.
         summary_path: (Optional) path to ITS summary file on host PC
@@ -551,18 +690,19 @@
     Returns:
         Nothing.
     """
+    adb = "adb -s " + device_id
     device_summary_path = "/sdcard/camera_" + camera_id + "_its_summary.txt"
     if summary_path is not None:
         _run("%s push %s %s" % (
-                ItsSession.ADB, summary_path, device_summary_path))
+                adb, summary_path, device_summary_path))
         _run("%s shell am broadcast -a %s --es %s %s --es %s %s --es %s %s" % (
-                ItsSession.ADB, ItsSession.ACTION_ITS_RESULT,
+                adb, ItsSession.ACTION_ITS_RESULT,
                 ItsSession.EXTRA_CAMERA_ID, camera_id,
                 ItsSession.EXTRA_SUCCESS, 'True' if success else 'False',
                 ItsSession.EXTRA_SUMMARY, device_summary_path))
     else:
         _run("%s shell am broadcast -a %s --es %s %s --es %s %s --es %s %s" % (
-                ItsSession.ADB, ItsSession.ACTION_ITS_RESULT,
+                adb, ItsSession.ACTION_ITS_RESULT,
                 ItsSession.EXTRA_CAMERA_ID, camera_id,
                 ItsSession.EXTRA_SUCCESS, 'True' if success else 'False',
                 ItsSession.EXTRA_SUMMARY, "null"))
diff --git a/apps/CameraITS/pymodules/its/image.py b/apps/CameraITS/pymodules/its/image.py
index b3bdb65..ea01a3e 100644
--- a/apps/CameraITS/pymodules/its/image.py
+++ b/apps/CameraITS/pymodules/its/image.py
@@ -64,11 +64,14 @@
     if cap["format"] == "raw10":
         assert(props is not None)
         cap = unpack_raw10_capture(cap, props)
+    if cap["format"] == "raw12":
+        assert(props is not None)
+        cap = unpack_raw12_capture(cap, props)
     if cap["format"] == "yuv":
         y = cap["data"][0:w*h]
         u = cap["data"][w*h:w*h*5/4]
         v = cap["data"][w*h*5/4:w*h*6/4]
-        return convert_yuv420_to_rgb_image(y, u, v, w, h)
+        return convert_yuv420_planar_to_rgb_image(y, u, v, w, h)
     elif cap["format"] == "jpeg":
         return decompress_jpeg_to_rgb_image(cap["data"])
     elif cap["format"] == "raw":
@@ -114,12 +117,12 @@
         raise its.error.Error('Invalid raw-10 buffer width')
     w = img.shape[1]*4/5
     h = img.shape[0]
-    # Cut out the 4x8b MSBs and shift to bits [10:2] in 16b words.
+    # Cut out the 4x8b MSBs and shift to bits [9:2] in 16b words.
     msbs = numpy.delete(img, numpy.s_[4::5], 1)
     msbs = msbs.astype(numpy.uint16)
     msbs = numpy.left_shift(msbs, 2)
     msbs = msbs.reshape(h,w)
-    # Cut out the 4x2b LSBs and put each in bits [2:0] of their own 8b words.
+    # Cut out the 4x2b LSBs and put each in bits [1:0] of their own 8b words.
     lsbs = img[::, 4::5].reshape(h,w/4)
     lsbs = numpy.right_shift(
             numpy.packbits(numpy.unpackbits(lsbs).reshape(h,w/4,4,2),3), 6)
@@ -128,6 +131,56 @@
     img16 = numpy.bitwise_or(msbs, lsbs).reshape(h,w)
     return img16
 
+def unpack_raw12_capture(cap, props):
+    """Unpack a raw-12 capture to a raw-16 capture.
+
+    Args:
+        cap: A raw-12 capture object.
+        props: Camera properties object.
+
+    Returns:
+        New capture object with raw-16 data.
+    """
+    # Data is packed as 4x10b pixels in 5 bytes, with the first 4 bytes holding
+    # the MSBs of the pixels, and the 5th byte holding 4x2b LSBs.
+    w,h = cap["width"], cap["height"]
+    if w % 2 != 0:
+        raise its.error.Error('Invalid raw-12 buffer width')
+    cap = copy.deepcopy(cap)
+    cap["data"] = unpack_raw12_image(cap["data"].reshape(h,w*3/2))
+    cap["format"] = "raw"
+    return cap
+
+def unpack_raw12_image(img):
+    """Unpack a raw-12 image to a raw-16 image.
+
+    Output image will have the 12 LSBs filled in each 16b word, and the 4 MSBs
+    will be set to zero.
+
+    Args:
+        img: A raw-12 image, as a uint8 numpy array.
+
+    Returns:
+        Image as a uint16 numpy array, with all row padding stripped.
+    """
+    if img.shape[1] % 3 != 0:
+        raise its.error.Error('Invalid raw-12 buffer width')
+    w = img.shape[1]*2/3
+    h = img.shape[0]
+    # Cut out the 2x8b MSBs and shift to bits [11:4] in 16b words.
+    msbs = numpy.delete(img, numpy.s_[2::3], 1)
+    msbs = msbs.astype(numpy.uint16)
+    msbs = numpy.left_shift(msbs, 4)
+    msbs = msbs.reshape(h,w)
+    # Cut out the 2x4b LSBs and put each in bits [3:0] of their own 8b words.
+    lsbs = img[::, 2::3].reshape(h,w/2)
+    lsbs = numpy.right_shift(
+            numpy.packbits(numpy.unpackbits(lsbs).reshape(h,w/2,2,4),3), 4)
+    lsbs = lsbs.reshape(h,w)
+    # Fuse the MSBs and LSBs back together
+    img16 = numpy.bitwise_or(msbs, lsbs).reshape(h,w)
+    return img16
+
 def convert_capture_to_planes(cap, props=None):
     """Convert a captured image object to separate image planes.
 
@@ -158,6 +211,9 @@
     if cap["format"] == "raw10":
         assert(props is not None)
         cap = unpack_raw10_capture(cap, props)
+    if cap["format"] == "raw12":
+        assert(props is not None)
+        cap = unpack_raw12_capture(cap, props)
     if cap["format"] == "yuv":
         y = cap["data"][0:w*h]
         u = cap["data"][w*h:w*h*5/4]
@@ -176,6 +232,36 @@
         img = numpy.ndarray(shape=(h*w,), dtype='<u2',
                             buffer=cap["data"][0:w*h*2])
         img = img.astype(numpy.float32).reshape(h,w) / white_level
+        # Crop the raw image to the active array region.
+        if props.has_key("android.sensor.info.activeArraySize") \
+                and props["android.sensor.info.activeArraySize"] is not None \
+                and props.has_key("android.sensor.info.pixelArraySize") \
+                and props["android.sensor.info.pixelArraySize"] is not None:
+            # Note that the Rect class is defined such that the left,top values
+            # are "inside" while the right,bottom values are "outside"; that is,
+            # it's inclusive of the top,left sides only. So, the width is
+            # computed as right-left, rather than right-left+1, etc.
+            wfull = props["android.sensor.info.pixelArraySize"]["width"]
+            hfull = props["android.sensor.info.pixelArraySize"]["height"]
+            xcrop = props["android.sensor.info.activeArraySize"]["left"]
+            ycrop = props["android.sensor.info.activeArraySize"]["top"]
+            wcrop = props["android.sensor.info.activeArraySize"]["right"]-xcrop
+            hcrop = props["android.sensor.info.activeArraySize"]["bottom"]-ycrop
+            assert(wfull >= wcrop >= 0)
+            assert(hfull >= hcrop >= 0)
+            assert(wfull - wcrop >= xcrop >= 0)
+            assert(hfull - hcrop >= ycrop >= 0)
+            if w == wfull and h == hfull:
+                # Crop needed; extract the center region.
+                img = img[ycrop:ycrop+hcrop,xcrop:xcrop+wcrop]
+                w = wcrop
+                h = hcrop
+            elif w == wcrop and h == hcrop:
+                # No crop needed; image is already cropped to the active array.
+                None
+            else:
+                raise its.error.Error('Invalid image size metadata')
+        # Separate the image planes.
         imgs = [img[::2].reshape(w*h/2)[::2].reshape(h/2,w/2,1),
                 img[::2].reshape(w*h/2)[1::2].reshape(h/2,w/2,1),
                 img[1::2].reshape(w*h/2)[::2].reshape(h/2,w/2,1),
@@ -285,10 +371,10 @@
     img = numpy.dot(img.reshape(w*h,3), ccm.T).reshape(h,w,3).clip(0.0,1.0)
     return img
 
-def convert_yuv420_to_rgb_image(y_plane, u_plane, v_plane,
-                                w, h,
-                                ccm_yuv_to_rgb=DEFAULT_YUV_TO_RGB_CCM,
-                                yuv_off=DEFAULT_YUV_OFFSETS):
+def convert_yuv420_planar_to_rgb_image(y_plane, u_plane, v_plane,
+                                       w, h,
+                                       ccm_yuv_to_rgb=DEFAULT_YUV_TO_RGB_CCM,
+                                       yuv_off=DEFAULT_YUV_OFFSETS):
     """Convert a YUV420 8-bit planar image to an RGB image.
 
     Args:
@@ -316,16 +402,44 @@
     rgb.reshape(w*h*3)[:] = flt.reshape(w*h*3)[:]
     return rgb.astype(numpy.float32) / 255.0
 
+def load_rgb_image(fname):
+    """Load a standard image file (JPG, PNG, etc.).
+
+    Args:
+        fname: The path of the file to load.
+
+    Returns:
+        RGB float-3 image array, with pixel values in [0.0, 1.0].
+    """
+    img = Image.open(fname)
+    w = img.size[0]
+    h = img.size[1]
+    a = numpy.array(img)
+    if len(a.shape) == 3 and a.shape[2] == 3:
+        # RGB
+        return a.reshape(h,w,3) / 255.0
+    elif len(a.shape) == 2 or len(a.shape) == 3 and a.shape[2] == 1:
+        # Greyscale; convert to RGB
+        return a.reshape(h*w).repeat(3).reshape(h,w,3) / 255.0
+    else:
+        raise its.error.Error('Unsupported image type')
+
 def load_yuv420_to_rgb_image(yuv_fname,
                              w, h,
+                             layout="planar",
                              ccm_yuv_to_rgb=DEFAULT_YUV_TO_RGB_CCM,
                              yuv_off=DEFAULT_YUV_OFFSETS):
     """Load a YUV420 image file, and return as an RGB image.
 
+    Supported layouts include "planar" and "nv21". The "yuv" formatted captures
+    returned from the device via do_capture are in the "planar" layout; other
+    layouts may only be needed for loading files from other sources.
+
     Args:
         yuv_fname: The path of the YUV420 file.
         w: The width of the image.
         h: The height of the image.
+        layout: (Optional) the layout of the YUV data (as a string).
         ccm_yuv_to_rgb: (Optional) the 3x3 CCM to convert from YUV to RGB.
         yuv_off: (Optional) offsets to subtract from each of Y,U,V values.
 
@@ -333,13 +447,24 @@
         RGB float-3 image array, with pixel values in [0.0, 1.0].
     """
     with open(yuv_fname, "rb") as f:
-        y = numpy.fromfile(f, numpy.uint8, w*h, "")
-        v = numpy.fromfile(f, numpy.uint8, w*h/4, "")
-        u = numpy.fromfile(f, numpy.uint8, w*h/4, "")
-        return convert_yuv420_to_rgb_image(y,u,v,w,h,ccm_yuv_to_rgb,yuv_off)
+        if layout == "planar":
+            # Plane of Y, plane of V, plane of U.
+            y = numpy.fromfile(f, numpy.uint8, w*h, "")
+            v = numpy.fromfile(f, numpy.uint8, w*h/4, "")
+            u = numpy.fromfile(f, numpy.uint8, w*h/4, "")
+        elif layout == "nv21":
+            # Plane of Y, plane of interleaved VUVUVU...
+            y = numpy.fromfile(f, numpy.uint8, w*h, "")
+            vu = numpy.fromfile(f, numpy.uint8, w*h/2, "")
+            v = vu[0::2]
+            u = vu[1::2]
+        else:
+            raise its.error.Error('Unsupported image layout')
+        return convert_yuv420_planar_to_rgb_image(
+                y,u,v,w,h,ccm_yuv_to_rgb,yuv_off)
 
-def load_yuv420_to_yuv_planes(yuv_fname, w, h):
-    """Load a YUV420 image file, and return separate Y, U, and V plane images.
+def load_yuv420_planar_to_yuv_planes(yuv_fname, w, h):
+    """Load a YUV420 planar image file, and return Y, U, and V plane images.
 
     Args:
         yuv_fname: The path of the YUV420 file.
@@ -540,169 +665,24 @@
     img = numpy.vstack(chs).T.reshape(h/f,w/f,chans)
     return img
 
-def __get_color_checker_patch(img, xc,yc, patch_size):
-    r = patch_size/2
-    tile = img[yc-r:yc+r:, xc-r:xc+r:, ::]
-    return tile
-
-def __measure_color_checker_patch(img, xc,yc, patch_size):
-    tile = __get_color_checker_patch(img, xc,yc, patch_size)
-    means = tile.mean(1).mean(0)
-    return means
-
-def get_color_checker_chart_patches(img, debug_fname_prefix=None):
-    """Return the center coords of each patch in a color checker chart.
-
-    Assumptions:
-    * Chart is vertical or horizontal w.r.t. camera, but not diagonal.
-    * Chart is (roughly) planar-parallel to the camera.
-    * Chart is centered in frame (roughly).
-    * Around/behind chart is white/grey background.
-    * The only black pixels in the image are from the chart.
-    * Chart is 100% visible and contained within image.
-    * No other objects within image.
-    * Image is well-exposed.
-    * Standard color checker chart with standard-sized black borders.
-
-    The values returned are in the coordinate system of the chart; that is,
-    patch (0,0) is the brown patch that is in the chart's top-left corner when
-    it is in the normal upright/horizontal orientation. (The chart may be any
-    of the four main orientations in the image.)
+def compute_image_sharpness(img):
+    """Calculate the sharpness of input image.
 
     Args:
-        img: Input image, as a numpy array with pixels in [0,1].
-        debug_fname_prefix: If not None, the (string) name of a file prefix to
-            use to save a number of debug images for visualizing the output of
-            this function; can be used to see if the patches are being found
-            successfully.
+        img: Numpy float RGB/luma image array, with pixel values in [0,1].
 
     Returns:
-        6x4 list of lists of integer (x,y) coords of the center of each patch,
-        ordered in the "chart order" (6x4 row major).
+        A sharpness estimation value based on the average of gradient magnitude.
+        Larger value means the image is sharper.
     """
+    chans = img.shape[2]
+    assert(chans == 1 or chans == 3)
+    luma = img
+    if (chans == 3):
+        luma = 0.299 * img[:,:,0] + 0.587 * img[:,:,1] + 0.114 * img[:,:,2]
 
-    # Shrink the original image.
-    DOWNSCALE_FACTOR = 4
-    img_small = downscale_image(img, DOWNSCALE_FACTOR)
-
-    # Make a threshold image, which is 1.0 where the image is black,
-    # and 0.0 elsewhere.
-    BLACK_PIXEL_THRESH = 0.2
-    mask_img = scipy.stats.threshold(
-                img_small.max(2), BLACK_PIXEL_THRESH, 1.1, 0.0)
-    mask_img = 1.0 - scipy.stats.threshold(mask_img, -0.1, 0.1, 1.0)
-
-    if debug_fname_prefix is not None:
-        h,w = mask_img.shape
-        write_image(img, debug_fname_prefix+"_0.jpg")
-        write_image(mask_img.repeat(3).reshape(h,w,3),
-                debug_fname_prefix+"_1.jpg")
-
-    # Mask image flattened to a single row or column (by averaging).
-    # Also apply a threshold to these arrays.
-    FLAT_PIXEL_THRESH = 0.05
-    flat_row = mask_img.mean(0)
-    flat_col = mask_img.mean(1)
-    flat_row = [0 if v < FLAT_PIXEL_THRESH else 1 for v in flat_row]
-    flat_col = [0 if v < FLAT_PIXEL_THRESH else 1 for v in flat_col]
-
-    # Start and end of the non-zero region of the flattened row/column.
-    flat_row_nonzero = [i for i in range(len(flat_row)) if flat_row[i]>0]
-    flat_col_nonzero = [i for i in range(len(flat_col)) if flat_col[i]>0]
-    flat_row_min, flat_row_max = min(flat_row_nonzero), max(flat_row_nonzero)
-    flat_col_min, flat_col_max = min(flat_col_nonzero), max(flat_col_nonzero)
-
-    # Orientation of chart, and number of grid cells horz. and vertically.
-    orient = "h" if flat_row_max-flat_row_min>flat_col_max-flat_col_min else "v"
-    xgrids = 6 if orient=="h" else 4
-    ygrids = 6 if orient=="v" else 4
-
-    # Get better bounds on the patches region, lopping off some of the excess
-    # black border.
-    HRZ_BORDER_PAD_FRAC = 0.0138
-    VERT_BORDER_PAD_FRAC = 0.0395
-    xpad = HRZ_BORDER_PAD_FRAC if orient=="h" else VERT_BORDER_PAD_FRAC
-    ypad = HRZ_BORDER_PAD_FRAC if orient=="v" else VERT_BORDER_PAD_FRAC
-    xchart = flat_row_min + (flat_row_max - flat_row_min) * xpad
-    ychart = flat_col_min + (flat_col_max - flat_col_min) * ypad
-    wchart = (flat_row_max - flat_row_min) * (1 - 2*xpad)
-    hchart = (flat_col_max - flat_col_min) * (1 - 2*ypad)
-
-    # Get the colors of the 4 corner patches, in clockwise order, by measuring
-    # the average value of a small patch at each of the 4 patch centers.
-    colors = []
-    centers = []
-    for (x,y) in [(0,0), (xgrids-1,0), (xgrids-1,ygrids-1), (0,ygrids-1)]:
-        xc = xchart + (x + 0.5)*wchart/xgrids
-        yc = ychart + (y + 0.5)*hchart/ygrids
-        xc = int(xc * DOWNSCALE_FACTOR + 0.5)
-        yc = int(yc * DOWNSCALE_FACTOR + 0.5)
-        centers.append((xc,yc))
-        chan_means = __measure_color_checker_patch(img, xc,yc, 32)
-        colors.append(sum(chan_means) / len(chan_means))
-
-    # The brightest corner is the white patch, the darkest is the black patch.
-    # The black patch should be counter-clockwise from the white patch.
-    white_patch_index = None
-    for i in range(4):
-        if colors[i] == max(colors) and \
-                colors[(i-1+4)%4] == min(colors):
-            white_patch_index = i%4
-    assert(white_patch_index is not None)
-
-    # Return the coords of the origin (top-left when the chart is in the normal
-    # upright orientation) patch's center, and the vector displacement to the
-    # center of the second patch on the first row of the chart (when in the
-    # normal upright orientation).
-    origin_index = (white_patch_index+1)%4
-    prev_index = (origin_index-1+4)%4
-    next_index = (origin_index+1)%4
-    origin_center = centers[origin_index]
-    prev_center = centers[prev_index]
-    next_center = centers[next_index]
-    vec_across = tuple([(next_center[i]-origin_center[i])/5.0 for i in [0,1]])
-    vec_down = tuple([(prev_center[i]-origin_center[i])/3.0 for i in [0,1]])
-
-    # Compute the center of each patch.
-    patches = [[],[],[],[]]
-    for yi in range(4):
-        for xi in range(6):
-            x0,y0 = origin_center
-            dxh,dyh = vec_across
-            dxv,dyv = vec_down
-            xc = int(x0 + dxh*xi + dxv*yi)
-            yc = int(y0 + dyh*xi + dyv*yi)
-            patches[yi].append((xc,yc))
-
-    # Sanity check: test that the R,G,B,black,white patches are correct.
-    sanity_failed = False
-    patch_info = [(2,2,[0]), # Red
-                  (2,1,[1]), # Green
-                  (2,0,[2]), # Blue
-                  (3,0,[0,1,2]), # White
-                  (3,5,[])] # Black
-    for i in range(len(patch_info)):
-        yi,xi,high_chans = patch_info[i]
-        low_chans = [i for i in [0,1,2] if i not in high_chans]
-        xc,yc = patches[yi][xi]
-        means = __measure_color_checker_patch(img, xc,yc, 64)
-        if (min([means[i] for i in high_chans]+[1]) < \
-                max([means[i] for i in low_chans]+[0])):
-            sanity_failed = True
-
-    if debug_fname_prefix is not None:
-        gridimg = numpy.zeros([4*(32+2), 6*(32+2), 3])
-        for yi in range(4):
-            for xi in range(6):
-                xc,yc = patches[yi][xi]
-                tile = __get_color_checker_patch(img, xc,yc, 32)
-                gridimg[yi*(32+2)+1:yi*(32+2)+1+32,
-                        xi*(32+2)+1:xi*(32+2)+1+32, :] = tile
-        write_image(gridimg, debug_fname_prefix+"_2.png")
-
-    assert(not sanity_failed)
-
-    return patches
+    [gy, gx] = numpy.gradient(luma)
+    return numpy.average(numpy.sqrt(gy*gy + gx*gx))
 
 class __UnitTest(unittest.TestCase):
     """Run a suite of unit tests on this module.
diff --git a/apps/CameraITS/pymodules/its/objects.py b/apps/CameraITS/pymodules/its/objects.py
index e1541a1..82346ec 100644
--- a/apps/CameraITS/pymodules/its/objects.py
+++ b/apps/CameraITS/pymodules/its/objects.py
@@ -70,7 +70,8 @@
     else:
         return float(r["numerator"]) / float(r["denominator"])
 
-def manual_capture_request(sensitivity, exp_time, linear_tonemap=False):
+def manual_capture_request(
+        sensitivity, exp_time, linear_tonemap=False, props=None):
     """Return a capture request with everything set to manual.
 
     Uses identity/unit color correction, and the default tonemap curve.
@@ -82,6 +83,9 @@
             with.
         linear_tonemap: [Optional] whether a linear tonemap should be used
             in this request.
+        props: [Optional] the object returned from
+            its.device.get_camera_properties(). Must present when
+            linear_tonemap is True.
 
     Returns:
         The default manual capture request, ready to be passed to the
@@ -105,10 +109,20 @@
         "android.shading.mode": 1
         }
     if linear_tonemap:
-        req["android.tonemap.mode"] = 0
-        req["android.tonemap.curveRed"] = [0.0,0.0, 1.0,1.0]
-        req["android.tonemap.curveGreen"] = [0.0,0.0, 1.0,1.0]
-        req["android.tonemap.curveBlue"] = [0.0,0.0, 1.0,1.0]
+        assert(props is not None)
+        #CONTRAST_CURVE mode
+        if 0 in props["android.tonemap.availableToneMapModes"]:
+            req["android.tonemap.mode"] = 0
+            req["android.tonemap.curveRed"] = [0.0,0.0, 1.0,1.0]
+            req["android.tonemap.curveGreen"] = [0.0,0.0, 1.0,1.0]
+            req["android.tonemap.curveBlue"] = [0.0,0.0, 1.0,1.0]
+        #GAMMA_VALUE mode
+        elif 3 in props["android.tonemap.availableToneMapModes"]:
+            req["android.tonemap.mode"] = 3
+            req["android.tonemap.gamma"] = 1.0
+        else:
+            print "Linear tonemap is not supported"
+            assert(False)
     return req
 
 def auto_capture_request():
@@ -142,13 +156,15 @@
     """Return a sorted list of available output sizes for a given format.
 
     Args:
-        fmt: the output format, as a string in ["jpg", "yuv", "raw"].
+        fmt: the output format, as a string in
+            ["jpg", "yuv", "raw", "raw10", "raw12"].
         props: the object returned from its.device.get_camera_properties().
 
     Returns:
         A sorted list of (w,h) tuples (sorted large-to-small).
     """
-    fmt_codes = {"raw":0x20, "raw10":0x25, "yuv":0x23, "jpg":0x100, "jpeg":0x100}
+    fmt_codes = {"raw":0x20, "raw10":0x25, "raw12":0x26, "yuv":0x23,
+                 "jpg":0x100, "jpeg":0x100}
     configs = props['android.scaler.streamConfigurationMap']\
                    ['availableStreamConfigurations']
     fmt_configs = [cfg for cfg in configs if cfg['format'] == fmt_codes[fmt]]
diff --git a/apps/CameraITS/tests/dng_noise_model/DngNoiseModel.pdf b/apps/CameraITS/tests/dng_noise_model/DngNoiseModel.pdf
index 01389fa..d979a06 100644
--- a/apps/CameraITS/tests/dng_noise_model/DngNoiseModel.pdf
+++ b/apps/CameraITS/tests/dng_noise_model/DngNoiseModel.pdf
Binary files differ
diff --git a/apps/CameraITS/tests/dng_noise_model/dng_noise_model.py b/apps/CameraITS/tests/dng_noise_model/dng_noise_model.py
index 19b6c92..8f4682a 100644
--- a/apps/CameraITS/tests/dng_noise_model/dng_noise_model.py
+++ b/apps/CameraITS/tests/dng_noise_model/dng_noise_model.py
@@ -13,144 +13,249 @@
 # limitations under the License.
 
 import its.device
+import its.caps
 import its.objects
 import its.image
-import pprint
-import pylab
 import os.path
+import pylab
 import matplotlib
-import matplotlib.pyplot
-import numpy
+import matplotlib.pyplot as plt
 import math
+import Image
+import time
+import numpy as np
+import scipy.stats
+import scipy.signal
+
+# Convert a 2D array a to a 4D array with dimensions [tile_size,
+# tile_size, row, col] where row, col are tile indices.
+def tile(a, tile_size):
+    tile_rows, tile_cols = a.shape[0]/tile_size, a.shape[1]/tile_size
+    a = a.reshape([tile_rows, tile_size, tile_cols, tile_size])
+    a = a.transpose([1, 3, 0, 2])
+    return a
 
 def main():
-    """Compute the DNG noise model from a color checker chart.
-
-    TODO: Make this more robust; some manual futzing may be needed.
+    """Capture a set of raw images with increasing gains and measure the noise.
     """
     NAME = os.path.basename(__file__).split(".")[0]
 
-    with its.device.ItsSession() as cam:
+    # How many sensitivities per stop to sample.
+    steps_per_stop = 2
+    # How large of tiles to use to compute mean/variance.
+    tile_size = 64
+    # Exposure bracketing range in stops
+    bracket_stops = 4
+    # How high to allow the mean of the tiles to go.
+    max_signal_level = 0.5
+    # Colors used for plotting the data for each exposure.
+    colors = 'rygcbm'
 
+    # Define a first order high pass filter to eliminate low frequency
+    # signal content when computing variance.
+    f = np.array([-1, 1]).astype('float32')
+    # Make it a higher order filter by convolving the first order
+    # filter with itself a few times.
+    f = np.convolve(f, f)
+    f = np.convolve(f, f)
+
+    # Compute the normalization of the filter to preserve noise
+    # power. Let a be the normalization factor we're looking for, and
+    # Let X and X' be the random variables representing the noise
+    # before and after filtering, respectively. First, compute
+    # Var[a*X']:
+    #
+    #   Var[a*X'] = a^2*Var[X*f_0 + X*f_1 + ... + X*f_N-1]
+    #             = a^2*(f_0^2*Var[X] + f_1^2*Var[X] + ... + (f_N-1)^2*Var[X])
+    #             = sum(f_i^2)*a^2*Var[X]
+    #
+    # We want Var[a*X'] to be equal to Var[X]:
+    #
+    #    sum(f_i^2)*a^2*Var[X] = Var[X] -> a = sqrt(1/sum(f_i^2))
+    #
+    # We can just bake this normalization factor into the high pass
+    # filter kernel.
+    f = f/math.sqrt(np.dot(f, f))
+
+    bracket_factor = math.pow(2, bracket_stops)
+
+    with its.device.ItsSession() as cam:
         props = cam.get_camera_properties()
 
-        white_level = float(props['android.sensor.info.whiteLevel'])
+        # Get basic properties we need.
+        sens_min, sens_max = props['android.sensor.info.sensitivityRange']
+        sens_max_analog = props['android.sensor.maxAnalogSensitivity']
+        white_level = props['android.sensor.info.whiteLevel']
         black_levels = props['android.sensor.blackLevelPattern']
         idxs = its.image.get_canonical_cfa_order(props)
         black_levels = [black_levels[i] for i in idxs]
 
-        # Expose for the scene with min sensitivity
-        sens_min, sens_max = props['android.sensor.info.sensitivityRange']
-        s_ae,e_ae,awb_gains,awb_ccm,_  = cam.do_3a(get_results=True)
-        s_e_prod = s_ae * e_ae
+        print "Sensitivity range: [%f, %f]" % (sens_min, sens_max)
+        print "Max analog sensitivity: %f" % (sens_max_analog)
 
-        # Make the image brighter since the script looks at linear Bayer
-        # raw patches rather than gamma-encoded YUV patches (and the AE
-        # probably under-exposes a little for this use-case).
-        s_e_prod *= 2
+        # Do AE to get a rough idea of where we are.
+        s_ae,e_ae,_,_,_  = \
+            cam.do_3a(get_results=True, do_awb=False, do_af=False)
+        # Underexpose to get more data for low signal levels.
+        auto_e = s_ae*e_ae/bracket_factor
 
-        # Capture raw frames across the full sensitivity range.
-        NUM_SENS_STEPS = 9
-        sens_step = int((sens_max - sens_min - 1) / float(NUM_SENS_STEPS))
-        reqs = []
-        sens = []
-        for s in range(sens_min, sens_max, sens_step):
-            e = int(s_e_prod / float(s))
-            req = its.objects.manual_capture_request(s, e)
-            req["android.colorCorrection.transform"] = \
-                    its.objects.float_to_rational(awb_ccm)
-            req["android.colorCorrection.gains"] = awb_gains
-            reqs.append(req)
-            sens.append(s)
+        # If the auto-exposure result is too bright for the highest
+        # sensitivity or too dark for the lowest sensitivity, report
+        # an error.
+        min_exposure_ns, max_exposure_ns = \
+            props['android.sensor.info.exposureTimeRange']
+        if auto_e < min_exposure_ns*sens_max:
+            raise its.error.Error("Scene is too bright to properly expose \
+                                  at the highest sensitivity")
+        if auto_e*bracket_factor > max_exposure_ns*sens_min:
+            raise its.error.Error("Scene is too dark to properly expose \
+                                  at the lowest sensitivity")
 
-        caps = cam.do_capture(reqs, cam.CAP_RAW)
+        # Start the sensitivities at the minimum.
+        s = sens_min
 
-        # A list of the (x,y) coords of the center pixel of a collection of
-        # patches of a color checker chart. Each patch should be uniform,
-        # however the actual color doesn't matter. Note that the coords are
-        # relative to the *converted* RGB image, which is 1/2 x 1/2 of the
-        # full size; convert back to full.
-        img = its.image.convert_capture_to_rgb_image(caps[0], props=props)
-        patches = its.image.get_color_checker_chart_patches(img, NAME+"_debug")
-        patches = [(2*x,2*y) for (x,y) in sum(patches,[])]
+        samples = []
+        plots = []
+        measured_models = []
+        while s <= sens_max + 1:
+            print "ISO %d" % round(s)
+            fig = plt.figure()
+            plt_s = fig.gca()
+            plt_s.set_title("ISO %d" % round(s))
+            plt_s.set_xlabel("Mean signal level")
+            plt_s.set_ylabel("Variance")
 
-        lines = []
-        for iouter, (s,cap) in enumerate(zip(sens,caps)):
-            # For each capture, compute the mean value in each patch, for each
-            # Bayer plane; discard patches where pixels are close to clamped.
-            # Also compute the variance.
-            CLAMP_THRESH = 0.2
-            planes = its.image.convert_capture_to_planes(cap, props)
-            points = []
-            for i,plane in enumerate(planes):
-                plane = (plane * white_level - black_levels[i]) / (
-                        white_level - black_levels[i])
-                for j,(x,y) in enumerate(patches):
-                    tile = plane[y/2-16:y/2+16:,x/2-16:x/2+16:,::]
-                    mean = its.image.compute_image_means(tile)[0]
-                    var = its.image.compute_image_variances(tile)[0]
-                    if (mean > CLAMP_THRESH and mean < 1.0-CLAMP_THRESH):
-                        # Each point is a (mean,variance) tuple for a patch;
-                        # for a given ISO, there should be a linear
-                        # relationship between these values.
-                        points.append((mean,var))
+            samples_s = []
+            for b in range(0, bracket_stops + 1):
+                # Get the exposure for this sensitivity and exposure time.
+                e = int(math.pow(2, b)*auto_e/float(s))
+                req = its.objects.manual_capture_request(round(s), e)
+                cap = cam.do_capture(req, cam.CAP_RAW)
+                planes = its.image.convert_capture_to_planes(cap, props)
 
-            # Fit a line to the points, with a line equation: y = mx + b.
-            # This line is the relationship between mean and variance (i.e.)
-            # between signal level and noise, for this particular sensor.
-            # In the DNG noise model, the gradient (m) is "S", and the offset
-            # (b) is "O".
-            points.sort()
-            xs = [x for (x,y) in points]
-            ys = [y for (x,y) in points]
-            m,b = numpy.polyfit(xs, ys, 1)
-            lines.append((s,m,b))
-            print s, "->", m, b
+                samples_e = []
+                for (pidx, p) in enumerate(planes):
+                    p = p.squeeze()
 
-            # TODO: Clean up these checks (which currently fail in some cases).
-            # Some sanity checks:
-            # * Noise levels should increase with brightness.
-            # * Extrapolating to a black image, the noise should be positive.
-            # Basically, the "b" value should correspond to the read noise,
-            # which is the noise level if the sensor was operating in zero
-            # light.
-            #assert(m > 0)
-            #assert(b >= 0)
+                    # Crop the plane to be a multiple of the tile size.
+                    p = p[0:p.shape[0] - p.shape[0]%tile_size, 
+                          0:p.shape[1] - p.shape[1]%tile_size]
 
-            if iouter == 0:
-                pylab.plot(xs, ys, 'r', label="Measured")
-                pylab.plot([0,xs[-1]],[b,m*xs[-1]+b],'b', label="Fit")
-            else:
-                pylab.plot(xs, ys, 'r')
-                pylab.plot([0,xs[-1]],[b,m*xs[-1]+b],'b')
+                    # convert_capture_to_planes normalizes the range
+                    # to [0, 1], but without subtracting the black
+                    # level.
+                    black_level = black_levels[pidx]
+                    p = p*white_level
+                    p = (p - black_level)/(white_level - black_level)
 
-        pylab.xlabel("Mean")
-        pylab.ylabel("Variance")
-        pylab.legend()
-        matplotlib.pyplot.savefig("%s_plot_mean_vs_variance.png" % (NAME))
+                    # Use our high pass filter to filter this plane.
+                    hp = scipy.signal.sepfir2d(p, f, f).astype('float32')
 
-        # Now fit a line across the (m,b) line parameters for each sensitivity.
-        # The gradient (m) params are fit to the "S" line, and the offset (b)
-        # params are fit to the "O" line, both as a function of sensitivity.
-        gains = [d[0] for d in lines]
-        Ss = [d[1] for d in lines]
-        Os = [d[2] for d in lines]
-        mS,bS = numpy.polyfit(gains, Ss, 1)
-        mO,bO = numpy.polyfit(gains, Os, 1)
+                    means_tiled = \
+                        np.mean(tile(p, tile_size), axis=(0, 1)).flatten()
+                    vars_tiled = \
+                        np.var(tile(hp, tile_size), axis=(0, 1)).flatten()
 
-        # Plot curve "O" as 10x, so it fits in the same scale as curve "S".
-        fig = matplotlib.pyplot.figure()
-        pylab.plot(gains, [10*o for o in Os], 'r', label="Measured")
-        pylab.plot([gains[0],gains[-1]],
-                [10*mO*gains[0]+10*bO, 10*mO*gains[-1]+10*bO],'r--',label="Fit")
-        pylab.plot(gains, Ss, 'b', label="Measured")
-        pylab.plot([gains[0],gains[-1]], [mS*gains[0]+bS,mS*gains[-1]+bS],'b--',
-                label="Fit")
-        pylab.xlabel("Sensitivity")
-        pylab.ylabel("Model parameter: S (blue), O x10 (red)")
-        pylab.legend()
-        matplotlib.pyplot.savefig("%s_plot_S_O.png" % (NAME))
+                    for (mean, var) in zip(means_tiled, vars_tiled):
+                        # Don't include the tile if it has samples that might 
+                        # be clipped.
+                        if mean + 2*math.sqrt(var) < max_signal_level:
+                            samples_e.append([mean, var])
 
+                    means_e, vars_e = zip(*samples_e)
+                    plt_s.plot(means_e, vars_e, colors[b%len(colors)] + ',')
+
+                    samples_s.extend(samples_e)
+
+            [S, O, R, p, stderr] = scipy.stats.linregress(samples_s)
+            measured_models.append([round(s), S, O])
+            print "Sensitivity %d: %e*y + %e (R=%f)" % (round(s), S, O, R)
+
+            # Add the samples for this sensitivity to the global samples list.
+            samples.extend([(round(s), mean, var) for (mean, var) in samples_s])
+
+            # Add the linear fit to the plot for this sensitivity.
+            plt_s.plot([0, max_signal_level], [O, O + S*max_signal_level], 'r-', 
+                       label="Linear fit")
+            xmax = max([x for (x, _) in samples_s])*1.25
+            plt_s.set_xlim(xmin=0, xmax=xmax)
+            plt_s.set_ylim(ymin=0, ymax=(O + S*xmax)*1.25)
+            fig.savefig("%s_samples_iso%04d.png" % (NAME, round(s)))
+            plots.append([round(s), fig])
+
+            # Move to the next sensitivity.
+            s = s*math.pow(2, 1.0/steps_per_stop)
+
+        # Grab the sensitivities and line parameters from each sensitivity.
+        S_measured = [e[1] for e in measured_models]
+        O_measured = [e[2] for e in measured_models]
+        sens = np.asarray([e[0] for e in measured_models])
+        sens_sq = np.square(sens)
+
+        # Use a global linear optimization to fit the noise model.
+        gains = np.asarray([s[0] for s in samples])
+        means = np.asarray([s[1] for s in samples])
+        vars_ = np.asarray([s[2] for s in samples])
+
+        # Define digital gain as the gain above the max analog gain
+        # per the Camera2 spec. Also, define a corresponding C
+        # expression snippet to use in the generated model code.
+        digital_gains = np.maximum(gains/sens_max_analog, 1)
+        digital_gain_cdef = "(sens / %d.0) < 1.0 ? 1.0 : (sens / %d.0)" % \
+            (sens_max_analog, sens_max_analog)
+
+        # Find the noise model parameters via least squares fit.
+        ad = gains*means
+        bd = means
+        cd = gains*gains
+        dd = digital_gains*digital_gains
+        a = np.asarray([ad, bd, cd, dd]).T
+        b = vars_
+
+        # To avoid overfitting to high ISOs (high variances), divide the system
+        # by the gains.
+        a = a/(np.tile(gains, (a.shape[1], 1)).T)
+        b = b/gains
+
+        [A, B, C, D], _, _, _ = np.linalg.lstsq(a, b)
+
+        # Plot the noise model components with the values predicted by the 
+        # noise model.
+        S_model = A*sens + B
+        O_model = \
+            C*sens_sq + D*np.square(np.maximum(sens/sens_max_analog, 1))
+
+        (fig, (plt_S, plt_O)) = plt.subplots(2, 1)
+        plt_S.set_title("Noise model")
+        plt_S.set_ylabel("S")
+        plt_S.loglog(sens, S_measured, 'r+', basex=10, basey=10, 
+                     label="Measured")
+        plt_S.loglog(sens, S_model, 'bx', basex=10, basey=10, label="Model")
+        plt_S.legend(loc=2)
+
+        plt_O.set_xlabel("ISO")
+        plt_O.set_ylabel("O")
+        plt_O.loglog(sens, O_measured, 'r+', basex=10, basey=10, 
+                     label="Measured")
+        plt_O.loglog(sens, O_model, 'bx', basex=10, basey=10, label="Model")
+        fig.savefig("%s.png" % (NAME))
+
+        for [s, fig] in plots:
+            plt_s = fig.gca()
+
+            dg = max(s/sens_max_analog, 1)
+            S = A*s + B
+            O = C*s*s + D*dg*dg
+            plt_s.plot([0, max_signal_level], [O, O + S*max_signal_level], 'b-', 
+                       label="Model")
+            plt_s.legend(loc=2)
+
+            plt.figure(fig.number)
+
+            # Re-save the plot with the global model.
+            fig.savefig("%s_samples_iso%04d.png" % (NAME, round(s)))
+
+        # Generate the noise model implementation.
         print """
         /* Generated test code to dump a table of data for external validation
          * of the noise model parameters.
@@ -176,11 +281,13 @@
             double s = %e * sens + %e;
             return s < 0.0 ? 0.0 : s;
         }
+
         double compute_noise_model_entry_O(int sens) {
-            double o = %e * sens + %e;
+            double digital_gain = %s;
+            double o = %e * sens * sens + %e * digital_gain * digital_gain;
             return o < 0.0 ? 0.0 : o;
         }
-        """%(sens_min,sens_max,mS,bS,mO,bO)
+        """ % (sens_min, sens_max, A, B, digital_gain_cdef, C, D)
 
 if __name__ == '__main__':
     main()
diff --git a/apps/CameraITS/tests/inprog/test_burst_sameness_auto.py b/apps/CameraITS/tests/inprog/test_burst_sameness_auto.py
index 87500c7..6629df8 100644
--- a/apps/CameraITS/tests/inprog/test_burst_sameness_auto.py
+++ b/apps/CameraITS/tests/inprog/test_burst_sameness_auto.py
@@ -39,7 +39,8 @@
 
         # Capture at the smallest resolution.
         props = cam.get_camera_properties()
-        its.caps.skip_unless(its.caps.manual_sensor(props))
+        its.caps.skip_unless(its.caps.manual_sensor(props) and
+                             its.caps.awb_lock(props))
 
         _, fmt = its.objects.get_fastest_manual_capture_settings(props)
         w,h = fmt["width"], fmt["height"]
diff --git a/apps/CameraITS/tests/inprog/test_burst_sameness_fullres_auto.py b/apps/CameraITS/tests/inprog/test_burst_sameness_fullres_auto.py
index 932c051..fa37174 100644
--- a/apps/CameraITS/tests/inprog/test_burst_sameness_fullres_auto.py
+++ b/apps/CameraITS/tests/inprog/test_burst_sameness_fullres_auto.py
@@ -15,6 +15,7 @@
 import its.image
 import its.device
 import its.objects
+import its.caps
 import os.path
 import numpy
 import pylab
@@ -41,6 +42,8 @@
 
         # Capture at full resolution.
         props = cam.get_camera_properties()
+        its.caps.skip_unless(its.caps.manual_sensor(props) and
+                             its.caps.awb_lock(props))
         w,h = its.objects.get_available_output_sizes("yuv", props)[0]
 
         # Converge 3A prior to capture.
diff --git a/apps/CameraITS/tests/inprog/test_faces.py b/apps/CameraITS/tests/inprog/test_faces.py
deleted file mode 100644
index 228dac8..0000000
--- a/apps/CameraITS/tests/inprog/test_faces.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2014 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.
-
-import its.image
-import its.device
-import its.objects
-import os.path
-
-def main():
-    """Test face detection.
-    """
-    NAME = os.path.basename(__file__).split(".")[0]
-
-    with its.device.ItsSession() as cam:
-        cam.do_3a()
-        req = its.objects.auto_capture_request()
-        req['android.statistics.faceDetectMode'] = 2
-        caps = cam.do_capture([req]*5)
-        for i,cap in enumerate(caps):
-            md = cap['metadata']
-            print "Frame %d face metadata:" % i
-            print "  Ids:", md['android.statistics.faceIds']
-            print "  Landmarks:", md['android.statistics.faceLandmarks']
-            print "  Rectangles:", md['android.statistics.faceRectangles']
-            print "  Scores:", md['android.statistics.faceScores']
-            print ""
-
-if __name__ == '__main__':
-    main()
-
diff --git a/apps/CameraITS/tests/scene1/test_crop_region_raw.py b/apps/CameraITS/tests/scene1/test_crop_region_raw.py
index 189e987..7973755 100644
--- a/apps/CameraITS/tests/scene1/test_crop_region_raw.py
+++ b/apps/CameraITS/tests/scene1/test_crop_region_raw.py
@@ -64,7 +64,7 @@
         # Use a manual request with a linear tonemap so that the YUV and RAW
         # should look the same (once converted by the its.image module).
         e, s = its.target.get_target_exposure_combos(cam)["minSensitivity"]
-        req = its.objects.manual_capture_request(s,e, True)
+        req = its.objects.manual_capture_request(s,e, True, props)
         cap1_raw, cap1_yuv = cam.do_capture(req, cam.CAP_RAW_YUV)
 
         # Capture with a crop region.
diff --git a/apps/CameraITS/tests/scene1/test_ev_compensation_advanced.py b/apps/CameraITS/tests/scene1/test_ev_compensation_advanced.py
index 9b43a74..5fd8f73 100644
--- a/apps/CameraITS/tests/scene1/test_ev_compensation_advanced.py
+++ b/apps/CameraITS/tests/scene1/test_ev_compensation_advanced.py
@@ -41,10 +41,12 @@
         range_max = ev_compensation_range[1]
         ev_per_step = its.objects.rational_to_float(
                 props['android.control.aeCompensationStep'])
-        steps_per_ev = int(1.0 / ev_per_step)
-        evs = range(range_min, range_max + 1, steps_per_ev)
+        steps_per_ev = int(round(1.0 / ev_per_step))
+        ev_steps = range(range_min, range_max + 1, steps_per_ev)
+        imid = len(ev_steps) / 2
+        ev_shifts = [pow(2, step * ev_per_step) for step in ev_steps]
         lumas = []
-        for ev in evs:
+        for ev in ev_steps:
             # Re-converge 3A, and lock AE once converged. skip AF trigger as
             # dark/bright scene could make AF convergence fail and this test
             # doesn't care the image sharpness.
@@ -65,19 +67,16 @@
             tile = its.image.get_image_patch(y, 0.45,0.45,0.1,0.1)
             lumas.append(its.image.compute_image_means(tile)[0])
 
-        luma_increase_per_step = pow(2, ev_per_step)
         print "ev_step_size_in_stops", ev_per_step
-        imid = len(lumas) / 2
-        expected_lumas = [lumas[imid] / pow(luma_increase_per_step, i)
-                          for i in range(imid , 0, -1)]  + \
-                         [lumas[imid] * pow(luma_increase_per_step, i-imid)
-                          for i in range(imid, len(evs))]
+        shift_mid = ev_shifts[imid]
+        luma_normal = lumas[imid] / shift_mid
+        expected_lumas = [luma_normal * ev_shift for ev_shift in ev_shifts]
 
-        pylab.plot(evs, lumas, 'r')
-        pylab.plot(evs, expected_lumas, 'b')
+        pylab.plot(ev_steps, lumas, 'r')
+        pylab.plot(ev_steps, expected_lumas, 'b')
         matplotlib.pyplot.savefig("%s_plot_means.png" % (NAME))
 
-        luma_diffs = [expected_lumas[i] - lumas[i] for i in range(len(evs))]
+        luma_diffs = [expected_lumas[i] - lumas[i] for i in range(len(ev_steps))]
         max_diff = max(abs(i) for i in luma_diffs)
         avg_diff = abs(numpy.array(luma_diffs)).mean()
         print "Max delta between modeled and measured lumas:", max_diff
diff --git a/apps/CameraITS/tests/scene1/test_ev_compensation_basic.py b/apps/CameraITS/tests/scene1/test_ev_compensation_basic.py
index d09f2fd..e3755eb 100644
--- a/apps/CameraITS/tests/scene1/test_ev_compensation_basic.py
+++ b/apps/CameraITS/tests/scene1/test_ev_compensation_basic.py
@@ -29,7 +29,8 @@
 
     with its.device.ItsSession() as cam:
         props = cam.get_camera_properties()
-        its.caps.skip_unless(its.caps.ev_compensation(props))
+        its.caps.skip_unless(its.caps.ev_compensation(props) and
+                             its.caps.ae_lock(props))
 
         ev_per_step = its.objects.rational_to_float(
                 props['android.control.aeCompensationStep'])
diff --git a/apps/CameraITS/tests/scene1/test_exposure.py b/apps/CameraITS/tests/scene1/test_exposure.py
index d217bdb..26c398d 100644
--- a/apps/CameraITS/tests/scene1/test_exposure.py
+++ b/apps/CameraITS/tests/scene1/test_exposure.py
@@ -36,11 +36,13 @@
     THRESHOLD_MIN_LEVEL = 0.1
     THRESHOLD_MAX_LEVEL = 0.9
     THRESHOLD_MAX_LEVEL_DIFF = 0.025
+    THRESHOLD_MAX_LEVEL_DIFF_WIDE_RANGE = 0.05
 
     mults = []
     r_means = []
     g_means = []
     b_means = []
+    threshold_max_level_diff = THRESHOLD_MAX_LEVEL_DIFF
 
     with its.device.ItsSession() as cam:
         props = cam.get_camera_properties()
@@ -57,13 +59,18 @@
             req = its.objects.manual_capture_request(s*m, e/m)
             cap = cam.do_capture(req)
             img = its.image.convert_capture_to_rgb_image(cap)
-            its.image.write_image(img, "%s_mult=%02d.jpg" % (NAME, m))
+            its.image.write_image(img, "%s_mult=%3.2f.jpg" % (NAME, m))
             tile = its.image.get_image_patch(img, 0.45, 0.45, 0.1, 0.1)
             rgb_means = its.image.compute_image_means(tile)
             r_means.append(rgb_means[0])
             g_means.append(rgb_means[1])
             b_means.append(rgb_means[2])
-            m = m + 4
+            # Test 3 steps per 2x gain
+            m = m * pow(2, 1.0 / 3)
+
+        # Allow more threshold for devices with wider exposure range
+        if m >= 64.0:
+            threshold_max_level_diff = THRESHOLD_MAX_LEVEL_DIFF_WIDE_RANGE
 
     # Draw a plot.
     pylab.plot(mults, r_means, 'r')
@@ -83,7 +90,7 @@
         max_diff = max_val - min_val
         print "Channel %d line fit (y = mx+b): m = %f, b = %f" % (chan, m, b)
         print "Channel max %f min %f diff %f" % (max_val, min_val, max_diff)
-        assert(max_diff < THRESHOLD_MAX_LEVEL_DIFF)
+        assert(max_diff < threshold_max_level_diff)
         assert(b > THRESHOLD_MIN_LEVEL and b < THRESHOLD_MAX_LEVEL)
         for v in values:
             assert(v > THRESHOLD_MIN_LEVEL and v < THRESHOLD_MAX_LEVEL)
diff --git a/apps/CameraITS/tests/scene1/test_jpeg.py b/apps/CameraITS/tests/scene1/test_jpeg.py
index 25c2038..7bc038d 100644
--- a/apps/CameraITS/tests/scene1/test_jpeg.py
+++ b/apps/CameraITS/tests/scene1/test_jpeg.py
@@ -33,7 +33,7 @@
                              its.caps.per_frame_control(props))
 
         e, s = its.target.get_target_exposure_combos(cam)["midExposureTime"]
-        req = its.objects.manual_capture_request(s, e, True)
+        req = its.objects.manual_capture_request(s, e, True, props)
 
         # YUV
         size = its.objects.get_available_output_sizes("yuv", props)[0]
diff --git a/apps/CameraITS/tests/scene1/test_latching.py b/apps/CameraITS/tests/scene1/test_latching.py
index 3bc4356..176f01b 100644
--- a/apps/CameraITS/tests/scene1/test_latching.py
+++ b/apps/CameraITS/tests/scene1/test_latching.py
@@ -45,20 +45,20 @@
         b_means = []
 
         reqs = [
-            its.objects.manual_capture_request(s,  e,   True),
-            its.objects.manual_capture_request(s,  e,   True),
-            its.objects.manual_capture_request(s*2,e,   True),
-            its.objects.manual_capture_request(s*2,e,   True),
-            its.objects.manual_capture_request(s,  e,   True),
-            its.objects.manual_capture_request(s,  e,   True),
-            its.objects.manual_capture_request(s,  e*2, True),
-            its.objects.manual_capture_request(s,  e,   True),
-            its.objects.manual_capture_request(s*2,e,   True),
-            its.objects.manual_capture_request(s,  e,   True),
-            its.objects.manual_capture_request(s,  e*2, True),
-            its.objects.manual_capture_request(s,  e,   True),
-            its.objects.manual_capture_request(s,  e*2, True),
-            its.objects.manual_capture_request(s,  e*2, True),
+            its.objects.manual_capture_request(s,  e,   True, props),
+            its.objects.manual_capture_request(s,  e,   True, props),
+            its.objects.manual_capture_request(s*2,e,   True, props),
+            its.objects.manual_capture_request(s*2,e,   True, props),
+            its.objects.manual_capture_request(s,  e,   True, props),
+            its.objects.manual_capture_request(s,  e,   True, props),
+            its.objects.manual_capture_request(s,  e*2, True, props),
+            its.objects.manual_capture_request(s,  e,   True, props),
+            its.objects.manual_capture_request(s*2,e,   True, props),
+            its.objects.manual_capture_request(s,  e,   True, props),
+            its.objects.manual_capture_request(s,  e*2, True, props),
+            its.objects.manual_capture_request(s,  e,   True, props),
+            its.objects.manual_capture_request(s,  e*2, True, props),
+            its.objects.manual_capture_request(s,  e*2, True, props),
             ]
 
         caps = cam.do_capture(reqs, fmt)
diff --git a/apps/CameraITS/tests/scene1/test_locked_burst.py b/apps/CameraITS/tests/scene1/test_locked_burst.py
index a33a9f8..6552c73 100644
--- a/apps/CameraITS/tests/scene1/test_locked_burst.py
+++ b/apps/CameraITS/tests/scene1/test_locked_burst.py
@@ -38,6 +38,8 @@
 
     with its.device.ItsSession() as cam:
         props = cam.get_camera_properties()
+        its.caps.skip_unless(its.caps.ae_lock(props) and
+                             its.caps.awb_lock(props))
 
         # Converge 3A prior to capture.
         cam.do_3a(do_af=True, lock_ae=True, lock_awb=True)
diff --git a/apps/CameraITS/tests/scene1/test_param_color_correction.py b/apps/CameraITS/tests/scene1/test_param_color_correction.py
index b7fdc7b..09b3707 100644
--- a/apps/CameraITS/tests/scene1/test_param_color_correction.py
+++ b/apps/CameraITS/tests/scene1/test_param_color_correction.py
@@ -42,7 +42,7 @@
 
         # Baseline request
         e, s = its.target.get_target_exposure_combos(cam)["midSensitivity"]
-        req = its.objects.manual_capture_request(s, e, True)
+        req = its.objects.manual_capture_request(s, e, True, props)
         req["android.colorCorrection.mode"] = 0
 
         # Transforms:
diff --git a/apps/CameraITS/tests/scene1/test_param_exposure_time.py b/apps/CameraITS/tests/scene1/test_param_exposure_time.py
index e6078d9..0c0aab1 100644
--- a/apps/CameraITS/tests/scene1/test_param_exposure_time.py
+++ b/apps/CameraITS/tests/scene1/test_param_exposure_time.py
@@ -39,7 +39,7 @@
 
         e,s = its.target.get_target_exposure_combos(cam)["midExposureTime"]
         for i,e_mult in enumerate([0.8, 0.9, 1.0, 1.1, 1.2]):
-            req = its.objects.manual_capture_request(s, e * e_mult, True)
+            req = its.objects.manual_capture_request(s, e * e_mult, True, props)
             cap = cam.do_capture(req)
             img = its.image.convert_capture_to_rgb_image(cap)
             its.image.write_image(
diff --git a/apps/CameraITS/tests/scene1/test_param_flash_mode.py b/apps/CameraITS/tests/scene1/test_param_flash_mode.py
index aae56aa..38f864f 100644
--- a/apps/CameraITS/tests/scene1/test_param_flash_mode.py
+++ b/apps/CameraITS/tests/scene1/test_param_flash_mode.py
@@ -39,7 +39,7 @@
         # linear tonemap.
         e, s = its.target.get_target_exposure_combos(cam)["midExposureTime"]
         e /= 4
-        req = its.objects.manual_capture_request(s, e, True)
+        req = its.objects.manual_capture_request(s, e, True, props)
 
         for f in [0,1,2]:
             req["android.flash.mode"] = f
diff --git a/apps/CameraITS/tests/scene1/test_param_noise_reduction.py b/apps/CameraITS/tests/scene1/test_param_noise_reduction.py
index 219927d..35cfc07 100644
--- a/apps/CameraITS/tests/scene1/test_param_noise_reduction.py
+++ b/apps/CameraITS/tests/scene1/test_param_noise_reduction.py
@@ -17,10 +17,11 @@
 import its.device
 import its.objects
 import its.target
-import pylab
-import os.path
 import matplotlib
 import matplotlib.pyplot
+import numpy
+import os.path
+import pylab
 
 def main():
     """Test that the android.noiseReduction.mode param is applied when set.
@@ -34,6 +35,7 @@
     """
     NAME = os.path.basename(__file__).split(".")[0]
 
+    RELATIVE_ERROR_TOLERANCE = 0.1
     # List of variances for R,G,B.
     variances = [[],[],[]]
 
@@ -45,7 +47,8 @@
     with its.device.ItsSession() as cam:
         props = cam.get_camera_properties()
         its.caps.skip_unless(its.caps.compute_target_exposure(props) and
-                             its.caps.per_frame_control(props))
+                             its.caps.per_frame_control(props) and
+                             its.caps.noise_reduction_mode(props, 0))
 
         # NR mode 0 with low gain
         e, s = its.target.get_target_exposure_combos(cam)["minSensitivity"]
@@ -61,17 +64,24 @@
         print "Ref variances:", ref_variance
 
         e, s = its.target.get_target_exposure_combos(cam)["maxSensitivity"]
-        for i in range(3):
-            # NR modes 0, 1, 2 with high gain
+        # NR modes 0, 1, 2, 3, 4 with high gain
+        for mode in range(5):
+            # Skip unavailable modes
+            if not its.caps.noise_reduction_mode(props, mode):
+                nr_modes_reported.append(mode)
+                for channel in range(3):
+                    variances[channel].append(0)
+                continue;
+
             req = its.objects.manual_capture_request(s, e)
-            req["android.noiseReduction.mode"] = i
+            req["android.noiseReduction.mode"] = mode
             cap = cam.do_capture(req)
             rgb_image = its.image.convert_capture_to_rgb_image(cap)
             nr_modes_reported.append(
                     cap["metadata"]["android.noiseReduction.mode"])
             its.image.write_image(
                     rgb_image,
-                    "%s_high_gain_nr=%d.jpg" % (NAME, i))
+                    "%s_high_gain_nr=%d.jpg" % (NAME, mode))
             rgb_tile = its.image.get_image_patch(
                     rgb_image, 0.45, 0.45, 0.1, 0.1)
             rgb_vars = its.image.compute_image_variances(rgb_tile)
@@ -82,16 +92,36 @@
 
     # Draw a plot.
     for j in range(3):
-        pylab.plot(range(3), variances[j], "rgb"[j])
+        pylab.plot(range(5), variances[j], "rgb"[j])
     matplotlib.pyplot.savefig("%s_plot_variances.png" % (NAME))
 
-    assert(nr_modes_reported == [0,1,2])
+    assert(nr_modes_reported == [0,1,2,3,4])
 
-    # Check that the variance of the NR=0 image is higher than for the
-    # NR=1 and NR=2 images.
     for j in range(3):
-        for i in range(1,3):
-            assert(variances[j][i] < variances[j][0])
+        # Smaller variance is better
+        # Verify OFF(0) is not better than FAST(1)
+        assert(variances[j][0] >
+               variances[j][1] * (1.0 - RELATIVE_ERROR_TOLERANCE))
+        # Verify FAST(1) is not better than HQ(2)
+        assert(variances[j][1] >
+               variances[j][2] * (1.0 - RELATIVE_ERROR_TOLERANCE))
+        # Verify HQ(2) is better than OFF(0)
+        assert(variances[j][0] > variances[j][2])
+        if its.caps.noise_reduction_mode(props, 3):
+            # Verify OFF(0) is not better than MINIMAL(3)
+            assert(variances[j][0] >
+                   variances[j][3] * (1.0 - RELATIVE_ERROR_TOLERANCE))
+            # Verify MINIMAL(3) is not better than HQ(2)
+            assert(variances[j][3] >
+                   variances[j][2] * (1.0 - RELATIVE_ERROR_TOLERANCE))
+            if its.caps.noise_reduction_mode(props, 4):
+                # Verify ZSL(4) is close to MINIMAL(3)
+                assert(numpy.isclose(variances[j][4], variances[j][3],
+                                     RELATIVE_ERROR_TOLERANCE))
+        elif its.caps.noise_reduction_mode(props, 4):
+            # Verify ZSL(4) is close to OFF(0)
+            assert(numpy.isclose(variances[j][4], variances[j][0],
+                                 RELATIVE_ERROR_TOLERANCE))
 
 if __name__ == '__main__':
     main()
diff --git a/apps/CameraITS/tests/scene1/test_param_shading_mode.py b/apps/CameraITS/tests/scene1/test_param_shading_mode.py
new file mode 100644
index 0000000..8538675
--- /dev/null
+++ b/apps/CameraITS/tests/scene1/test_param_shading_mode.py
@@ -0,0 +1,115 @@
+# Copyright 2015 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.
+
+import its.caps
+import its.device
+import its.objects
+import matplotlib
+import numpy
+import os
+import os.path
+import pylab
+
+def main():
+    """Test that the android.shading.mode param is applied.
+
+    Switching shading modes and checks that the lens shading maps are
+    modified as expected.
+    """
+    NAME = os.path.basename(__file__).split(".")[0]
+
+    NUM_SHADING_MODE_SWITCH_LOOPS = 3
+    THRESHOLD_DIFF_RATIO = 0.15
+
+    with its.device.ItsSession() as cam:
+        props = cam.get_camera_properties()
+
+        its.caps.skip_unless(its.caps.per_frame_control(props) and
+                             its.caps.lsc_map(props) and
+                             its.caps.lsc_off(props))
+
+        assert(props.has_key("android.lens.info.shadingMapSize") and
+               props["android.lens.info.shadingMapSize"] != None)
+
+        # lsc_off devices should always support OFF(0), FAST(1), and HQ(2)
+        assert(props.has_key("android.shading.availableModes") and
+               set(props["android.shading.availableModes"]) == set([0, 1, 2]))
+
+        num_map_gains = props["android.lens.info.shadingMapSize"]["width"] * \
+                        props["android.lens.info.shadingMapSize"]["height"] * 4
+
+        # Test 1: Switching shading modes several times and verify:
+        #   1. Lens shading maps with mode OFF are all 1.0
+        #   2. Lens shading maps with mode FAST are similar after switching
+        #      shading modes.
+        #   3. Lens shading maps with mode HIGH_QUALITY are similar after
+        #      switching shading modes.
+        cam.do_3a();
+
+        # Get the reference lens shading maps for OFF, FAST, and HIGH_QUALITY
+        # in different sessions.
+        # reference_maps[mode]
+        reference_maps = [[] for mode in range(3)]
+        reference_maps[0] = [1.0] * num_map_gains
+        for mode in range(1, 3):
+            req = its.objects.auto_capture_request();
+            req["android.statistics.lensShadingMapMode"] = 1
+            req["android.shading.mode"] = mode
+            reference_maps[mode] = cam.do_capture(req)["metadata"] \
+                    ["android.statistics.lensShadingMap"]
+
+        # Get the lens shading maps while switching modes in one session.
+        reqs = []
+        for i in range(NUM_SHADING_MODE_SWITCH_LOOPS):
+            for mode in range(3):
+                req = its.objects.auto_capture_request();
+                req["android.statistics.lensShadingMapMode"] = 1
+                req["android.shading.mode"] = mode
+                reqs.append(req);
+
+        caps = cam.do_capture(reqs)
+
+        # shading_maps[mode][loop]
+        shading_maps = [[[] for loop in range(NUM_SHADING_MODE_SWITCH_LOOPS)]
+                for mode in range(3)]
+
+        # Get the shading maps out of capture results
+        for i in range(len(caps)):
+            shading_maps[i % 3][i / 3] = \
+                    caps[i]["metadata"]["android.statistics.lensShadingMap"]
+
+        # Draw the maps
+        for mode in range(3):
+            for i in range(NUM_SHADING_MODE_SWITCH_LOOPS):
+                pylab.clf()
+                pylab.plot(range(num_map_gains), shading_maps[mode][i], 'r')
+                pylab.plot(range(num_map_gains), reference_maps[mode], 'g')
+                pylab.xlim([0, num_map_gains])
+                pylab.ylim([0.9, 4.0])
+                matplotlib.pyplot.savefig("%s_ls_maps_mode_%d_loop_%d.png" %
+                                          (NAME, mode, i))
+
+        print "Verifying lens shading maps with mode OFF are all 1.0"
+        for i in range(NUM_SHADING_MODE_SWITCH_LOOPS):
+            assert(numpy.allclose(shading_maps[0][i], reference_maps[0]))
+
+        for mode in range(1, 3):
+            print "Verifying lens shading maps with mode", mode, "are similar"
+            for i in range(NUM_SHADING_MODE_SWITCH_LOOPS):
+                assert(numpy.allclose(shading_maps[mode][i],
+                                      reference_maps[mode],
+                                      THRESHOLD_DIFF_RATIO))
+
+if __name__ == '__main__':
+    main()
diff --git a/apps/CameraITS/tests/scene1/test_reprocess_noise_reduction.py b/apps/CameraITS/tests/scene1/test_reprocess_noise_reduction.py
new file mode 100644
index 0000000..757dfeb
--- /dev/null
+++ b/apps/CameraITS/tests/scene1/test_reprocess_noise_reduction.py
@@ -0,0 +1,148 @@
+# Copyright 2015 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.
+
+import its.image
+import its.caps
+import its.device
+import its.objects
+import its.target
+import math
+import matplotlib
+import matplotlib.pyplot
+import numpy
+import os.path
+import pylab
+
+def main():
+    """Test that the android.noiseReduction.mode param is applied when set for
+       reprocessing requests.
+
+    Capture reprocessed images with the camera dimly lit. Uses a high analog
+    gain to ensure the captured image is noisy.
+
+    Captures three reprocessed images, for NR off, "fast", and "high quality".
+    Also captures a reprocessed image with low gain and NR off, and uses the
+    variance of this as the baseline.
+    """
+
+    NAME = os.path.basename(__file__).split(".")[0]
+
+    RELATIVE_ERROR_TOLERANCE = 0.1
+
+    with its.device.ItsSession() as cam:
+        props = cam.get_camera_properties()
+
+        its.caps.skip_unless(its.caps.compute_target_exposure(props) and
+                             its.caps.per_frame_control(props) and
+                             its.caps.noise_reduction_mode(props, 0) and
+                             (its.caps.yuv_reprocess(props) or
+                              its.caps.private_reprocess(props)))
+
+        # If reprocessing is supported, ZSL NR mode must be avaiable.
+        assert(its.caps.noise_reduction_mode(props, 4))
+
+        reprocess_formats = []
+        if (its.caps.yuv_reprocess(props)):
+            reprocess_formats.append("yuv")
+        if (its.caps.private_reprocess(props)):
+            reprocess_formats.append("private")
+
+        for reprocess_format in reprocess_formats:
+            # List of variances for R, G, B.
+            variances = []
+            nr_modes_reported = []
+
+            # NR mode 0 with low gain
+            e, s = its.target.get_target_exposure_combos(cam)["minSensitivity"]
+            req = its.objects.manual_capture_request(s, e)
+            req["android.noiseReduction.mode"] = 0
+
+            # Test reprocess_format->JPEG reprocessing
+            # TODO: Switch to reprocess_format->YUV when YUV reprocessing is
+            #       supported.
+            size = its.objects.get_available_output_sizes("jpg", props)[0]
+            out_surface = {"width":size[0], "height":size[1], "format":"jpg"}
+            cap = cam.do_capture(req, out_surface, reprocess_format)
+            img = its.image.decompress_jpeg_to_rgb_image(cap["data"])
+            its.image.write_image(img, "%s_low_gain_fmt=jpg.jpg" % (NAME))
+            tile = its.image.get_image_patch(img, 0.45, 0.45, 0.1, 0.1)
+            ref_variance = its.image.compute_image_variances(tile)
+            print "Ref variances:", ref_variance
+
+            for nr_mode in range(5):
+                # Skip unavailable modes
+                if not its.caps.noise_reduction_mode(props, nr_mode):
+                    nr_modes_reported.append(nr_mode)
+                    variances.append(0)
+                    continue
+
+                # NR modes with high gain
+                e, s = its.target.get_target_exposure_combos(cam) \
+                    ["maxSensitivity"]
+                req = its.objects.manual_capture_request(s, e)
+                req["android.noiseReduction.mode"] = nr_mode
+                cap = cam.do_capture(req, out_surface, reprocess_format)
+                nr_modes_reported.append(
+                    cap["metadata"]["android.noiseReduction.mode"])
+
+                img = its.image.decompress_jpeg_to_rgb_image(cap["data"])
+                its.image.write_image(
+                    img, "%s_high_gain_nr=%d_fmt=jpg.jpg" % (NAME, nr_mode))
+                tile = its.image.get_image_patch(img, 0.45, 0.45, 0.1, 0.1)
+                # Get the variances for R, G, and B channels
+                variance = its.image.compute_image_variances(tile)
+                variances.append(
+                    [variance[chan] / ref_variance[chan] for chan in range(3)])
+            print "Variances with NR mode [0,1,2,3,4]:", variances
+
+            # Draw a plot.
+            for chan in range(3):
+                line = []
+                for nr_mode in range(5):
+                    line.append(variances[nr_mode][chan])
+                pylab.plot(range(5), line, "rgb"[chan])
+
+            matplotlib.pyplot.savefig("%s_plot_%s_variances.png" %
+                                      (NAME, reprocess_format))
+
+            assert(nr_modes_reported == [0,1,2,3,4])
+
+            for j in range(3):
+                # Smaller variance is better
+                # Verify OFF(0) is not better than FAST(1)
+                assert(variances[0][j] >
+                       variances[1][j] * (1.0 - RELATIVE_ERROR_TOLERANCE))
+                # Verify FAST(1) is not better than HQ(2)
+                assert(variances[1][j] >
+                       variances[2][j] * (1.0 - RELATIVE_ERROR_TOLERANCE))
+                # Verify HQ(2) is better than OFF(0)
+                assert(variances[0][j] > variances[2][j])
+                if its.caps.noise_reduction_mode(props, 3):
+                    # Verify OFF(0) is not better than MINIMAL(3)
+                    assert(variances[0][j] >
+                           variances[3][j] * (1.0 - RELATIVE_ERROR_TOLERANCE))
+                    # Verify MINIMAL(3) is not better than HQ(2)
+                    assert(variances[3][j] >
+                           variances[2][j] * (1.0 - RELATIVE_ERROR_TOLERANCE))
+                    # Verify ZSL(4) is close to MINIMAL(3)
+                    assert(numpy.isclose(variances[4][j], variances[3][j],
+                                         RELATIVE_ERROR_TOLERANCE))
+                else:
+                    # Verify ZSL(4) is close to OFF(0)
+                    assert(numpy.isclose(variances[4][j], variances[0][j],
+                                         RELATIVE_ERROR_TOLERANCE))
+
+if __name__ == '__main__':
+    main()
+
diff --git a/apps/CameraITS/tests/scene1/test_tonemap_sequence.py b/apps/CameraITS/tests/scene1/test_tonemap_sequence.py
index 18ca506..7c87ca2 100644
--- a/apps/CameraITS/tests/scene1/test_tonemap_sequence.py
+++ b/apps/CameraITS/tests/scene1/test_tonemap_sequence.py
@@ -40,7 +40,7 @@
         means = []
 
         # Capture 3 manual shots with a linear tonemap.
-        req = its.objects.manual_capture_request(sens, exp_time, True)
+        req = its.objects.manual_capture_request(sens, exp_time, True, props)
         for i in [0,1,2]:
             cap = cam.do_capture(req)
             img = its.image.convert_capture_to_rgb_image(cap)
diff --git a/apps/CameraITS/tests/scene1/test_yuv_jpeg_all.py b/apps/CameraITS/tests/scene1/test_yuv_jpeg_all.py
index 1b278ef..0c428fc 100644
--- a/apps/CameraITS/tests/scene1/test_yuv_jpeg_all.py
+++ b/apps/CameraITS/tests/scene1/test_yuv_jpeg_all.py
@@ -35,7 +35,7 @@
         # Use a manual request with a linear tonemap so that the YUV and JPEG
         # should look the same (once converted by the its.image module).
         e, s = its.target.get_target_exposure_combos(cam)["midExposureTime"]
-        req = its.objects.manual_capture_request(s, e, True)
+        req = its.objects.manual_capture_request(s, e, True, props)
 
         rgbs = []
 
diff --git a/apps/CameraITS/tests/scene1/test_yuv_plus_jpeg.py b/apps/CameraITS/tests/scene1/test_yuv_plus_jpeg.py
index 6daa243..9ce8d76 100644
--- a/apps/CameraITS/tests/scene1/test_yuv_plus_jpeg.py
+++ b/apps/CameraITS/tests/scene1/test_yuv_plus_jpeg.py
@@ -37,7 +37,7 @@
         # Use a manual request with a linear tonemap so that the YUV and JPEG
         # should look the same (once converted by the its.image module).
         e, s = its.target.get_target_exposure_combos(cam)["midExposureTime"]
-        req = its.objects.manual_capture_request(s, e, True)
+        req = its.objects.manual_capture_request(s, e, True, props)
 
         cap_yuv, cap_jpeg = cam.do_capture(req, [fmt_yuv, fmt_jpeg])
 
diff --git a/apps/CameraITS/tests/scene1/test_yuv_plus_raw.py b/apps/CameraITS/tests/scene1/test_yuv_plus_raw.py
index eb01c1a..f13801b 100644
--- a/apps/CameraITS/tests/scene1/test_yuv_plus_raw.py
+++ b/apps/CameraITS/tests/scene1/test_yuv_plus_raw.py
@@ -36,7 +36,7 @@
         # Use a manual request with a linear tonemap so that the YUV and RAW
         # should look the same (once converted by the its.image module).
         e, s = its.target.get_target_exposure_combos(cam)["midExposureTime"]
-        req = its.objects.manual_capture_request(s, e, True)
+        req = its.objects.manual_capture_request(s, e, True, props)
 
         cap_raw, cap_yuv = cam.do_capture(req, cam.CAP_RAW_YUV)
 
diff --git a/apps/CameraITS/tests/scene1/test_yuv_plus_raw10.py b/apps/CameraITS/tests/scene1/test_yuv_plus_raw10.py
index 910a8ea..e52946d 100644
--- a/apps/CameraITS/tests/scene1/test_yuv_plus_raw10.py
+++ b/apps/CameraITS/tests/scene1/test_yuv_plus_raw10.py
@@ -36,7 +36,7 @@
         # Use a manual request with a linear tonemap so that the YUV and RAW
         # should look the same (once converted by the its.image module).
         e, s = its.target.get_target_exposure_combos(cam)["midExposureTime"]
-        req = its.objects.manual_capture_request(s, e, True)
+        req = its.objects.manual_capture_request(s, e, True, props)
 
         cap_raw, cap_yuv = cam.do_capture(req,
                 [{"format":"raw10"}, {"format":"yuv"}])
diff --git a/apps/CameraITS/tests/scene1/test_yuv_plus_raw12.py b/apps/CameraITS/tests/scene1/test_yuv_plus_raw12.py
new file mode 100644
index 0000000..c5c3c73
--- /dev/null
+++ b/apps/CameraITS/tests/scene1/test_yuv_plus_raw12.py
@@ -0,0 +1,63 @@
+# Copyright 2015 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.
+
+import its.image
+import its.caps
+import its.device
+import its.objects
+import its.target
+import os.path
+import math
+
+def main():
+    """Test capturing a single frame as both RAW12 and YUV outputs.
+    """
+    NAME = os.path.basename(__file__).split(".")[0]
+
+    THRESHOLD_MAX_RMS_DIFF = 0.035
+
+    with its.device.ItsSession() as cam:
+        props = cam.get_camera_properties()
+        its.caps.skip_unless(its.caps.compute_target_exposure(props) and
+                             its.caps.raw12(props) and
+                             its.caps.per_frame_control(props))
+
+        # Use a manual request with a linear tonemap so that the YUV and RAW
+        # should look the same (once converted by the its.image module).
+        e, s = its.target.get_target_exposure_combos(cam)["midExposureTime"]
+        req = its.objects.manual_capture_request(s, e, True, props)
+
+        cap_raw, cap_yuv = cam.do_capture(req,
+                [{"format":"raw12"}, {"format":"yuv"}])
+
+        img = its.image.convert_capture_to_rgb_image(cap_yuv)
+        its.image.write_image(img, "%s_yuv.jpg" % (NAME), True)
+        tile = its.image.get_image_patch(img, 0.45, 0.45, 0.1, 0.1)
+        rgb0 = its.image.compute_image_means(tile)
+
+        # Raw shots are 1/2 x 1/2 smaller after conversion to RGB, so scale the
+        # tile appropriately.
+        img = its.image.convert_capture_to_rgb_image(cap_raw, props=props)
+        its.image.write_image(img, "%s_raw.jpg" % (NAME), True)
+        tile = its.image.get_image_patch(img, 0.475, 0.475, 0.05, 0.05)
+        rgb1 = its.image.compute_image_means(tile)
+
+        rms_diff = math.sqrt(
+                sum([pow(rgb0[i] - rgb1[i], 2.0) for i in range(3)]) / 3.0)
+        print "RMS difference:", rms_diff
+        assert(rms_diff < THRESHOLD_MAX_RMS_DIFF)
+
+if __name__ == '__main__':
+    main()
+
diff --git a/apps/CameraITS/tests/scene2/SampleTarget.jpg b/apps/CameraITS/tests/scene2/SampleTarget.jpg
new file mode 100644
index 0000000..c054f7e
--- /dev/null
+++ b/apps/CameraITS/tests/scene2/SampleTarget.jpg
Binary files differ
diff --git a/apps/CameraITS/tests/scene2/test_faces.py b/apps/CameraITS/tests/scene2/test_faces.py
new file mode 100644
index 0000000..cce74e7
--- /dev/null
+++ b/apps/CameraITS/tests/scene2/test_faces.py
@@ -0,0 +1,102 @@
+# Copyright 2014 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.
+
+import its.image
+import its.device
+import its.objects
+import os.path
+
+def main():
+    """Test face detection.
+    """
+    NAME = os.path.basename(__file__).split(".")[0]
+    NUM_TEST_FRAMES = 20
+    FD_MODE_OFF = 0
+    FD_MODE_SIMPLE = 1
+    FD_MODE_FULL = 2
+
+    with its.device.ItsSession() as cam:
+        props = cam.get_camera_properties()
+        fd_modes = props['android.statistics.info.availableFaceDetectModes']
+        a = props['android.sensor.info.activeArraySize']
+        aw, ah = a['right'] - a['left'], a['bottom'] - a['top']
+        cam.do_3a()
+        for fd_mode in fd_modes:
+            assert(FD_MODE_OFF <= fd_mode <= FD_MODE_FULL)
+            req = its.objects.auto_capture_request()
+            req['android.statistics.faceDetectMode'] = fd_mode
+            caps = cam.do_capture([req]*NUM_TEST_FRAMES)
+            for i,cap in enumerate(caps):
+                md = cap['metadata']
+                assert(md['android.statistics.faceDetectMode'] == fd_mode)
+                faces = md['android.statistics.faces']
+
+                # 0 faces should be returned for OFF mode
+                if fd_mode == FD_MODE_OFF:
+                    assert(len(faces) == 0)
+                    continue
+                # Face detection could take several frames to warm up,
+                # but it should detect at least one face in last frame
+                if i == NUM_TEST_FRAMES - 1:
+                    if len(faces) == 0:
+                        print "Error: no face detected in mode", fd_mode
+                        assert(0)
+                if len(faces) == 0:
+                    continue
+
+                print "Frame %d face metadata:" % i
+                print "  Faces:", faces
+                print ""
+
+                face_scores = [face['score'] for face in faces]
+                face_rectangles = [face['bounds'] for face in faces]
+                for score in face_scores:
+                    assert(score >= 1 and score <= 100)
+                # Face bounds should be within active array
+                for rect in face_rectangles:
+                    assert(rect['top'] < rect['bottom'])
+                    assert(rect['left'] < rect['right'])
+                    assert(0 <= rect['top'] <= ah)
+                    assert(0 <= rect['bottom'] <= ah)
+                    assert(0 <= rect['left'] <= aw)
+                    assert(0 <= rect['right'] <= aw)
+
+                # Face landmarks are reported if and only if fd_mode is FULL
+                # Face ID should be -1 for SIMPLE and unique for FULL
+                if fd_mode == FD_MODE_SIMPLE:
+                    for face in faces:
+                        assert('leftEye' not in face)
+                        assert('rightEye' not in face)
+                        assert('mouth' not in face)
+                        assert(face['id'] == -1)
+                elif fd_mode == FD_MODE_FULL:
+                    face_ids = [face['id'] for face in faces]
+                    assert(len(face_ids) == len(set(face_ids)))
+                    # Face landmarks should be within face bounds
+                    for face in faces:
+                        left_eye = face['leftEye']
+                        right_eye = face['rightEye']
+                        mouth = face['mouth']
+                        l, r = face['bounds']['left'], face['bounds']['right']
+                        t, b = face['bounds']['top'], face['bounds']['bottom']
+                        assert(l <= left_eye['x'] <= r)
+                        assert(t <= left_eye['y'] <= b)
+                        assert(l <= right_eye['x'] <= r)
+                        assert(t <= right_eye['y'] <= b)
+                        assert(l <= mouth['x'] <= r)
+                        assert(t <= mouth['y'] <= b)
+
+if __name__ == '__main__':
+    main()
+
diff --git a/apps/CameraITS/tests/scene3/test_reprocess_edge_enhancement.py b/apps/CameraITS/tests/scene3/test_reprocess_edge_enhancement.py
new file mode 100644
index 0000000..73834cb
--- /dev/null
+++ b/apps/CameraITS/tests/scene3/test_reprocess_edge_enhancement.py
@@ -0,0 +1,202 @@
+# Copyright 2015 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.
+
+import its.image
+import its.caps
+import its.device
+import its.objects
+import its.target
+import math
+import matplotlib
+import matplotlib.pyplot
+import numpy
+import os.path
+import pylab
+
+
+def test_edge_mode(cam, edge_mode, sensitivity, exp, fd, out_surface,
+                   reprocess_format=None):
+    """Return sharpness of the output image and the capture result metadata
+       for a capture request with the given edge mode, sensitivity, exposure
+       time, focus distance, output surface parameter, and reprocess format
+       (None for a regular request.)
+
+    Args:
+        cam: An open device session.
+        edge_mode: Edge mode for the request as defined in android.edge.mode
+        sensitivity: Sensitivity for the request as defined in
+            android.sensor.sensitivity
+        exp: Exposure time for the request as defined in
+            android.sensor.exposureTime.
+        fd: Focus distance for the request as defined in
+            android.lens.focusDistance
+        output_surface: Specifications of the output image format and size.
+        reprocess_format: (Optional) The reprocessing format. If not None,
+                reprocessing will be enabled.
+
+    Returns:
+        Object containing reported edge mode and the sharpness of the output
+        image, keyed by the following strings:
+            "edge_mode"
+            "sharpness"
+    """
+
+    NAME = os.path.basename(__file__).split(".")[0]
+
+    req = its.objects.manual_capture_request(sensitivity, exp)
+    req["android.lens.focusDistance"] = fd
+    req["android.edge.mode"] = edge_mode
+    if (reprocess_format != None):
+        req["android.reprocess.effectiveExposureFactor"] = 1.0
+    cap = cam.do_capture(req, out_surface, reprocess_format)
+
+    img = its.image.decompress_jpeg_to_rgb_image(cap["data"])
+    its.image.write_image(img, "%s_edge=%d_reprocess_fmt_%s.jpg" %
+        (NAME, edge_mode, reprocess_format))
+    tile = its.image.get_image_patch(img, 0.45, 0.45, 0.1, 0.1)
+
+    ret = {}
+    ret["edge_mode"] = cap["metadata"]["android.edge.mode"]
+    ret["sharpness"] = its.image.compute_image_sharpness(tile)
+
+    return ret
+
+def main():
+    """Test that the android.edge.mode param is applied when set for
+       reprocessing requests.
+
+    Capture non-reprocess images for each edge mode and calculate their
+    sharpness as a baseline.
+
+    Capture reprocessed images for each supported reprocess format and edge_mode
+    mode. Calculate the sharpness of reprocessed images and compare them against
+    the sharpess of non-reprocess images.
+    """
+
+    THRESHOLD_RELATIVE_SHARPNESS_DIFF = 0.1
+
+    with its.device.ItsSession() as cam:
+        props = cam.get_camera_properties()
+
+        its.caps.skip_unless(its.caps.read_3a(props) and
+                             its.caps.per_frame_control(props) and
+                             its.caps.edge_mode(props, 0) and
+                             (its.caps.yuv_reprocess(props) or
+                              its.caps.private_reprocess(props)))
+
+        # If reprocessing is supported, ZSL EE mode must be avaiable.
+        assert(its.caps.edge_mode(props, 3))
+
+        reprocess_formats = []
+        if (its.caps.yuv_reprocess(props)):
+            reprocess_formats.append("yuv")
+        if (its.caps.private_reprocess(props)):
+            reprocess_formats.append("private")
+
+        size = its.objects.get_available_output_sizes("jpg", props)[0]
+        out_surface = {"width":size[0], "height":size[1], "format":"jpg"}
+
+        # Get proper sensitivity, exposure time, and focus distance.
+        s,e,_,_,fd = cam.do_3a(get_results=True)
+
+        # Get the sharpness for each edge mode for regular requests
+        sharpness_regular = []
+        edge_mode_reported_regular = []
+        for edge_mode in range(4):
+            # Skip unavailable modes
+            if not its.caps.edge_mode(props, edge_mode):
+                edge_mode_reported_regular.append(edge_mode)
+                sharpness_regular.append(0)
+                continue
+            ret = test_edge_mode(cam, edge_mode, s, e, fd, out_surface)
+            edge_mode_reported_regular.append(ret["edge_mode"])
+            sharpness_regular.append(ret["sharpness"])
+
+        print "Reported edge modes:", edge_mode_reported_regular
+        print "Sharpness with EE mode [0,1,2,3]:", sharpness_regular
+
+        # Get the sharpness for each reprocess format and edge mode for
+        # reprocess requests.
+        sharpnesses_reprocess = []
+        edge_mode_reported_reprocess = []
+
+        for reprocess_format in reprocess_formats:
+            # List of sharpness
+            sharpnesses = []
+            edge_mode_reported = []
+            for edge_mode in range(4):
+                # Skip unavailable modes
+                if not its.caps.edge_mode(props, edge_mode):
+                    edge_mode_reported.append(edge_mode)
+                    sharpnesses.append(0)
+                    continue
+
+                ret = test_edge_mode(cam, edge_mode, s, e, fd, out_surface,
+                    reprocess_format)
+                edge_mode_reported.append(ret["edge_mode"])
+                sharpnesses.append(ret["sharpness"])
+
+            sharpnesses_reprocess.append(sharpnesses)
+            edge_mode_reported_reprocess.append(edge_mode_reported)
+
+            print "Reported edge modes:", edge_mode_reported
+            print "Sharpness with EE mode [0,1,2,3] for %s reprocess:" % \
+                (reprocess_format) , sharpnesses
+
+
+        # Verify HQ(2) is sharper than OFF(0)
+        assert(sharpness_regular[2] > sharpness_regular[0])
+
+        # Verify ZSL(3) is similar to OFF(0)
+        assert(numpy.isclose(sharpness_regular[3], sharpness_regular[0],
+                             THRESHOLD_RELATIVE_SHARPNESS_DIFF))
+
+        # Verify OFF(0) is not sharper than FAST(1)
+        assert(sharpness_regular[1] >
+               sharpness_regular[0] * (1.0 - THRESHOLD_RELATIVE_SHARPNESS_DIFF))
+
+        # Verify FAST(1) is not sharper than HQ(2)
+        assert(sharpness_regular[2] >
+               sharpness_regular[1] * (1.0 - THRESHOLD_RELATIVE_SHARPNESS_DIFF))
+
+        for reprocess_format in range(len(reprocess_formats)):
+            # Verify HQ(2) is sharper than OFF(0)
+            assert(sharpnesses_reprocess[reprocess_format][2] >
+                   sharpnesses_reprocess[reprocess_format][0])
+
+            # Verify ZSL(3) is similar to OFF(0)
+            assert(numpy.isclose(sharpnesses_reprocess[reprocess_format][3],
+                                 sharpnesses_reprocess[reprocess_format][0],
+                                 THRESHOLD_RELATIVE_SHARPNESS_DIFF))
+
+            # Verify OFF(0) is not sharper than FAST(1)
+            assert(sharpnesses_reprocess[reprocess_format][1] >
+                   sharpnesses_reprocess[reprocess_format][0] *
+                   (1.0 - THRESHOLD_RELATIVE_SHARPNESS_DIFF))
+
+            # Verify FAST(1) is not sharper than HQ(2)
+            assert(sharpnesses_reprocess[reprocess_format][2] >
+                   sharpnesses_reprocess[reprocess_format][1] *
+                   (1.0 - THRESHOLD_RELATIVE_SHARPNESS_DIFF))
+
+            # Verify reprocessing HQ(2) is similar to regular HQ(2) relative to
+            # OFF(0)
+            assert(numpy.isclose(sharpnesses_reprocess[reprocess_format][2] /
+                                    sharpnesses_reprocess[reprocess_format][0],
+                                 sharpness_regular[2] / sharpness_regular[0],
+                                 THRESHOLD_RELATIVE_SHARPNESS_DIFF))
+
+if __name__ == '__main__':
+    main()
+
diff --git a/apps/CameraITS/tools/config.py b/apps/CameraITS/tools/config.py
index 6e83412..52929aa 100644
--- a/apps/CameraITS/tools/config.py
+++ b/apps/CameraITS/tools/config.py
@@ -44,7 +44,7 @@
     # Command line args, ignoring any args that will be passed down to the
     # ItsSession constructor.
     args = [s for s in sys.argv if s[:6] not in \
-            ["reboot", "camera", "target", "noinit"]]
+            ["reboot", "camera", "target", "device"]]
 
     if len(args) == 1:
         with its.device.ItsSession() as cam:
diff --git a/apps/CameraITS/tools/convert_yuv_to_jpg.py b/apps/CameraITS/tools/convert_yuv_to_jpg.py
new file mode 100644
index 0000000..4498c2a
--- /dev/null
+++ b/apps/CameraITS/tools/convert_yuv_to_jpg.py
@@ -0,0 +1,37 @@
+# Copyright 2015 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.
+
+import its.image
+import sys
+
+def main():
+    """Open a YUV420 file and save it as a JPEG.
+
+    Command line args:
+        filename.yuv: The YUV420 file to open.
+        w: The width of the image.
+        h: The height of the image.
+        layout: The layout of the data, in ["planar", "nv21"].
+    """
+    if len(sys.argv) != 5:
+        print "Usage: python %s <filename.yuv> <w> <h> <layout>"%(sys.argv[0])
+    else:
+        fname, w,h = sys.argv[1], int(sys.argv[2]), int(sys.argv[3])
+        layout = sys.argv[4]
+        img = its.image.load_yuv420_to_rgb_image(fname, w,h, layout=layout)
+        its.image.write_image(img, fname.replace(".yuv",".jpg"), False)
+
+if __name__ == '__main__':
+    main()
+
diff --git a/apps/CameraITS/tools/run_all_tests.py b/apps/CameraITS/tools/run_all_tests.py
index 2bbd387..dd12512 100644
--- a/apps/CameraITS/tools/run_all_tests.py
+++ b/apps/CameraITS/tools/run_all_tests.py
@@ -41,12 +41,20 @@
             "test_ev_compensation_advanced",
             "test_ev_compensation_basic",
             "test_yuv_plus_jpeg"
-        ]
+        ],
+        "scene2":[],
+        "scene3":[]
     }
 
     # Get all the scene0 and scene1 tests, which can be run using the same
     # physical setup.
-    scenes = ["scene0", "scene1"]
+    scenes = ["scene0", "scene1", "scene2", "scene3"]
+    scene_req = {
+        "scene0" : None,
+        "scene1" : "A grey card covering at least the middle 30% of the scene",
+        "scene2" : "A picture containing human faces",
+        "scene3" : "A chart containing sharp edges like ISO 12233"
+    }
     tests = []
     for d in scenes:
         tests += [(d,s[:-3],os.path.join("tests", d, s))
@@ -58,6 +66,10 @@
     topdir = tempfile.mkdtemp()
     print "Saving output files to:", topdir, "\n"
 
+    device_id = its.device.get_device_id()
+    device_id_arg = "device=" + device_id
+    print "Testing device " + device_id
+
     camera_ids = []
     for s in sys.argv[1:]:
         if s[:7] == "camera=" and len(s) > 7:
@@ -68,7 +80,8 @@
         camera_ids_path = os.path.join(topdir, "camera_ids.txt")
         out_arg = "out=" + camera_ids_path
         cmd = ['python',
-               os.path.join(os.getcwd(),"tools/get_camera_ids.py"), out_arg]
+               os.path.join(os.getcwd(),"tools/get_camera_ids.py"), out_arg,
+               device_id_arg]
         retcode = subprocess.call(cmd,cwd=topdir)
         assert(retcode == 0)
         with open(camera_ids_path, "r") as f:
@@ -86,14 +99,6 @@
         for d in scenes:
             os.mkdir(os.path.join(topdir, camera_id, d))
 
-        out_path = os.path.join(topdir, camera_id, "scene.jpg")
-        out_arg = "out=" + out_path
-        cmd = ['python',
-               os.path.join(os.getcwd(),"tools/validate_scene.py"),
-               camera_id_arg, out_arg]
-        retcode = subprocess.call(cmd,cwd=topdir)
-        assert(retcode == 0)
-
         print "Start running ITS on camera: ", camera_id
         # Run each test, capturing stdout and stderr.
         summary = "ITS test result summary for camera " + camera_id + "\n"
@@ -102,7 +107,19 @@
         numnotmandatedfail = 0
         numfail = 0
 
+        prev_scene = ""
         for (scene,testname,testpath) in tests:
+            if scene != prev_scene and scene_req[scene] != None:
+                out_path = os.path.join(topdir, camera_id, scene+".jpg")
+                out_arg = "out=" + out_path
+                scene_arg = "scene=" + scene_req[scene]
+                cmd = ['python',
+                        os.path.join(os.getcwd(),"tools/validate_scene.py"),
+                        camera_id_arg, out_arg, scene_arg, device_id_arg]
+                retcode = subprocess.call(cmd,cwd=topdir)
+                assert(retcode == 0)
+                print "Start running tests for", scene
+            prev_scene = scene
             cmd = ['python', os.path.join(os.getcwd(),testpath)] + \
                   sys.argv[1:] + [camera_id_arg]
             outdir = os.path.join(topdir,camera_id,scene)
@@ -158,7 +175,7 @@
         summary_path = os.path.join(topdir, camera_id, "summary.txt")
         with open(summary_path, "w") as f:
             f.write(summary)
-        its.device.report_result(camera_id, result, summary_path)
+        its.device.report_result(device_id, camera_id, result, summary_path)
 
     print "ITS tests finished. Please go back to CtsVerifier and proceed"
 
diff --git a/apps/CameraITS/tools/validate_scene.py b/apps/CameraITS/tools/validate_scene.py
index e1e89f2..1f35163 100644
--- a/apps/CameraITS/tools/validate_scene.py
+++ b/apps/CameraITS/tools/validate_scene.py
@@ -16,17 +16,26 @@
 import its.device
 import its.objects
 import its.image
+import its.caps
+import re
 
 def main():
     """capture a yuv image and save it to argv[1]
     """
     camera_id = -1
     out_path = ""
+    scene_name = ""
+    scene_desc = "No requirement"
     for s in sys.argv[1:]:
         if s[:7] == "camera=" and len(s) > 7:
             camera_id = s[7:]
         elif s[:4] == "out=" and len(s) > 4:
             out_path = s[4:]
+        elif s[:6] == "scene=" and len(s) > 6:
+            scene_desc = s[6:]
+
+    if out_path != "":
+        scene_name = re.split("/|\.", out_path)[-2]
 
     if camera_id == -1:
         print "Error: need to specify which camera to use"
@@ -34,13 +43,16 @@
 
     with its.device.ItsSession() as cam:
         raw_input("Press Enter after placing camera " + camera_id +
-                " to frame the test scene")
+                " to frame the test scene: " + scene_name +
+                "\nThe scene setup should be: " + scene_desc )
         # Converge 3A prior to capture.
         cam.do_3a(do_af=True, lock_ae=True, lock_awb=True)
         props = cam.get_camera_properties()
         req = its.objects.fastest_auto_capture_request(props)
-        req["android.control.awbLock"] = True
-        req["android.control.aeLock"] = True
+        if its.caps.ae_lock(props):
+            req["android.control.awbLock"] = True
+        if its.caps.awb_lock(props):
+            req["android.control.aeLock"] = True
         while True:
             print "Capture an image to check the test scene"
             cap = cam.do_capture(req)
@@ -49,7 +61,8 @@
                 its.image.write_image(img, out_path)
             print "Please check scene setup in", out_path
             choice = raw_input(
-                "Is the image okay for ITS scene1? (Y/N)").lower()
+                "Is the image okay for ITS " + scene_name +\
+                "? (Y/N)").lower()
             if choice == "y":
                 break
             else:
diff --git a/apps/CtsVerifier/Android.mk b/apps/CtsVerifier/Android.mk
index dc5fda5..8cec7ea 100644
--- a/apps/CtsVerifier/Android.mk
+++ b/apps/CtsVerifier/Android.mk
@@ -30,11 +30,20 @@
                                compatibility-common-util-devicesidelib_v2 \
                                cts-sensors-tests \
                                ctstestrunner \
+                               apache-commons-math \
+                               androidplot \
+                               ctsverifier-opencv \
+                               core-tests \
+                               android-support-v4  \
+                               mockito-target \
+                               mockwebserver \
+                               compatibility-device-util_v2 \
 
 LOCAL_PACKAGE_NAME := CtsVerifier
 
-LOCAL_JNI_SHARED_LIBRARIES := libctsverifier_jni \
-	#libcameraanalyzer # Needed for the disabled CameraAnalyzer tests
+LOCAL_AAPT_FLAGS += --version-name "6.0_r0 $(BUILD_NUMBER)"
+
+LOCAL_JNI_SHARED_LIBRARIES := libctsverifier_jni libaudioloopback_jni
 
 LOCAL_PROGUARD_FLAG_FILES := proguard.flags
 
@@ -44,13 +53,25 @@
 
 include $(BUILD_PACKAGE)
 
+
+# opencv library
+include $(CLEAR_VARS)
+
+LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
+        ctsverifier-opencv:libs/opencv-android.jar
+
+include $(BUILD_MULTI_PREBUILT)
+
+
 notification-bot := $(call intermediates-dir-for,APPS,NotificationBot)/package.apk
+permission-app := $(call intermediates-dir-for,APPS,CtsPermissionApp)/package.apk
 
 # Builds and launches CTS Verifier on a device.
 .PHONY: cts-verifier
-cts-verifier: CtsVerifier adb NotificationBot
+cts-verifier: CtsVerifier adb NotificationBot CtsPermissionApp
 	adb install -r $(PRODUCT_OUT)/data/app/CtsVerifier/CtsVerifier.apk \
 		&& adb install -r $(notification-bot) \
+		&& adb install -r $(permission-app) \
 		&& adb shell "am start -n com.android.cts.verifier/.CtsVerifierActivity"
 
 #
@@ -87,10 +108,12 @@
 endif
 $(verifier-zip) : $(HOST_OUT)/CameraITS
 $(verifier-zip) : $(notification-bot)
+$(verifier-zip) : $(permission-app)
 $(verifier-zip) : $(call intermediates-dir-for,APPS,CtsVerifier)/package.apk | $(ACP)
 		$(hide) mkdir -p $(verifier-dir)
 		$(hide) $(ACP) -fp $< $(verifier-dir)/CtsVerifier.apk
 		$(ACP) -fp $(notification-bot) $(verifier-dir)/NotificationBot.apk
+		$(ACP) -fp $(permission-app) $(verifier-dir)/CtsPermissionApp.apk
 ifeq ($(HOST_OS),linux)
 		$(hide) $(ACP) -fp $(HOST_OUT)/bin/cts-usb-accessory $(verifier-dir)/cts-usb-accessory
 endif
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index ae62f843..217913c 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -17,10 +17,9 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="com.android.cts.verifier"
-      android:versionCode="5"
-      android:versionName="5.1_r1">
+      android:versionCode="5">
 
-    <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="21"/>
+    <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="23"/>
 
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
@@ -57,6 +56,7 @@
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
     <uses-permission android:name="com.android.providers.tv.permission.READ_EPG_DATA" />
     <uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />
+    <uses-permission android:name="android.permission.USE_FINGERPRINT"/>
 
     <!-- Needed by the Audio Quality Verifier to store the sound samples that will be mailed. -->
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
@@ -353,6 +353,28 @@
             <meta-data android:name="test_category" android:value="@string/test_category_security" />
         </activity>
 
+        <activity android:name=".security.FingerprintBoundKeysTest"
+                android:label="@string/sec_fingerprint_bound_key_test"
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_security" />
+            <meta-data android:name="test_excluded_features"
+                       android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+        </activity>
+        <activity android:name=".security.ScreenLockBoundKeysTest"
+                android:label="@string/sec_lock_bound_key_test"
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_security" />
+            <meta-data android:name="test_excluded_features"
+                       android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+        </activity>
         <activity android:name=".security.LockConfirmBypassTest"
                 android:label="@string/lock_confirm_test_title"
                 android:configChanges="keyboardHidden|orientation|screenSize" >
@@ -430,6 +452,10 @@
                 android:label="@string/nfc_ndef_push_receiver"
                 android:configChanges="keyboardHidden|orientation|screenSize" />
 
+        <activity android:name=".nfc.LlcpVersionActivity"
+                android:label="@string/nfc_llcp_version_check"
+                android:configChanges="keyboardHidden|orientation|screenSize" />
+
         <activity android:name=".nfc.TagVerifierActivity"
                 android:label="@string/nfc_tag_verifier"
                 android:configChanges="keyboardHidden|orientation|screenSize" />
@@ -720,6 +746,33 @@
                        android:value="android.hardware.sensor.compass" />
         </activity>
 
+        <activity
+            android:name=".sensors.RVCVXCheckTestActivity"
+            android:keepScreenOn="true"
+            android:label="@string/snsr_rvcvxchk_test"
+            android:screenOrientation="locked" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST"/>
+            </intent-filter>
+
+            <meta-data
+                android:name="test_category"
+                android:value="@string/test_category_sensors" />
+            <meta-data
+                android:name="test_required_features"
+                android:value="android.hardware.sensor.accelerometer:android.hardware.sensor.gyroscope:android.hardware.sensor.compass:android.hardware.camera.any" />
+            <meta-data android:name="test_excluded_features"
+                    android:value="android.hardware.type.television" />
+        </activity>
+        <activity
+            android:name=".sensors.RVCVRecordActivity"
+            android:keepScreenOn="true"
+            android:label="@string/snsr_rvcvxchk_test_rec"
+            android:screenOrientation="locked" >
+        </activity>
+
+
         <!-- TODO: enable when a full set of verifications can be implemented -->
         <!--activity android:name=".sensors.RotationVectorTestActivity"
                   android:label="@string/snsr_rot_vec_test"
@@ -872,23 +925,6 @@
 
             <meta-data android:name="test_required_features" android:value="android.hardware.camera.any"/>
         </activity>
-<!-- Experimental. If re-enabling, libcameraanalyzer must be included in the build
-        <activity android:name=".camera.analyzer.CameraAnalyzerActivity"
-                 android:label="@string/camera_analyzer"
-                 android:screenOrientation="landscape">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.cts.intent.category.MANUAL_TEST" />
-            </intent-filter>
-            <meta-data android:name="test_category" android:value="@string/test_category_camera" />
-
-            <intent-filter>
-                <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
-            </intent-filter>
-            <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
-                android:resource="@xml/accessory_filter_adk" />
-        </activity>
--->
 
         <activity android:name=".camera.intents.CameraIntentsActivity"
                  android:label="@string/camera_intents">
@@ -962,6 +998,17 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.camera.any" />
         </activity>
 
+        <activity android:name=".camera.flashlight.CameraFlashlightActivity"
+                  android:label="@string/camera_flashlight_test"
+                  android:configChanges="keyboardHidden|orientation|screenSize">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_camera" />
+            <meta-data android:name="test_required_features" android:value="android.hardware.camera.flash" />
+        </activity>
+
         <activity android:name=".usb.UsbAccessoryTestActivity"
                 android:label="@string/usb_accessory_test"
                 android:configChanges="keyboardHidden|orientation|screenSize">
@@ -1069,6 +1116,22 @@
                     android:value="android.software.leanback" />
         </activity>
 
+        <activity android:name=".security.KeyChainTest"
+                android:label="@string/keychain_test">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_security" />
+            <!-- KeyChain is only installed on communication-oriented devices inheriting core.mk -->
+            <meta-data android:name="test_excluded_features"
+                    android:value="android.hardware.type.watch" />
+            <meta-data android:name="test_excluded_features"
+                    android:value="android.hardware.type.television" />
+            <meta-data android:name="test_excluded_features"
+                    android:value="android.software.leanback" />
+        </activity>
+
         <activity android:name=".p2p.GoNegRequesterTestListActivity"
                 android:label="@string/p2p_go_neg_requester"
                 android:configChanges="keyboardHidden|orientation|screenSize" />
@@ -1133,8 +1196,6 @@
             <meta-data android:name="test_category" android:value="@string/test_category_other" />
             <meta-data android:name="test_required_features"
                     android:value="android.software.app_widgets" />
-            <meta-data android:name="test_excluded_features"
-                       android:value="android.software.leanback" />
         </activity>
 
         <activity android:name=".deskclock.DeskClockTestsActivity"
@@ -1166,6 +1227,23 @@
                        android:value="android.hardware.type.television:android.software.leanback" />
         </activity>
 -->
+          <activity
+                android:name="com.android.cts.verifier.sensors.DeviceSuspendTestActivity"
+                android:label="@string/snsr_device_suspend_test"
+                android:screenOrientation="nosensor" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_sensors" />
+        </activity>
+
+        <receiver android:name="com.android.cts.verifier.sensors.DeviceSuspendTestActivity$AlarmReceiver">
+        </receiver>
+
+        <receiver android:name="com.android.cts.verifier.sensors.SignificantMotionTestActivity$AlarmReceiver">
+        </receiver>
+
         <activity
             android:name="com.android.cts.verifier.sensors.SignificantMotionTestActivity"
             android:label="@string/snsr_significant_motion_test"
@@ -1266,16 +1344,58 @@
                  android:label="@string/projection_service_name"
                  android:process=":projectionservice" />
 
-        <activity android:name=".managedprovisioning.DeviceOwnerTestActivity"
+        <activity android:name=".managedprovisioning.DeviceOwnerNegativeTestActivity"
                 android:label="@string/provisioning_device_owner">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.cts.intent.category.MANUAL_TEST" />
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_managed_provisioning" />
-            <meta-data android:name="test_required_features" android:value="android.software.managed_users:android.software.device_admin" />
+            <meta-data android:name="test_required_features" android:value="android.software.device_admin" />
         </activity>
 
+        <activity android:name=".managedprovisioning.DeviceOwnerPositiveTestActivity"
+                android:label="@string/positive_device_owner">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_managed_provisioning" />
+            <meta-data android:name="test_required_features" android:value="android.software.device_admin" />
+        </activity>
+
+        <activity android:name=".managedprovisioning.DeviceOwnerPositiveTestActivity$CommandReceiver"
+                android:exported="false"
+                android:theme="@android:style/Theme.NoDisplay"
+                android:noHistory="true"
+                android:autoRemoveFromRecents="true"
+                android:stateNotNeeded="true">
+        </activity>
+
+        <activity android:name=".managedprovisioning.KeyguardDisabledFeaturesActivity"
+                android:label="@string/provisioning_byod_keyguard_disabled_features">
+        </activity>
+
+        <activity android:name=".managedprovisioning.WifiLockdownTestActivity"
+                android:label="@string/device_owner_wifi_lockdown_test">
+        </activity>
+
+        <activity android:name=".managedprovisioning.PermissionLockdownTestActivity"
+                android:label="@string/device_profile_owner_permission_lockdown_test">
+            <intent-filter>
+                <action android:name="com.android.cts.verifier.managedprovisioning.action.CHECK_PERMISSION_LOCKDOWN" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
+        <activity-alias
+                android:name=".managedprovisioning.ManagedProfilePermissionLockdownTestActivity"
+                android:targetActivity=".managedprovisioning.PermissionLockdownTestActivity">
+            <intent-filter>
+                <action android:name="com.android.cts.verifier.managedprovisioning.action.MANAGED_PROFILE_CHECK_PERMISSION_LOCKDOWN" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity-alias>
 
         <activity android:name=".managedprovisioning.ByodFlowTestActivity"
                 android:launchMode="singleTask"
@@ -1297,9 +1417,12 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.BYOD_QUERY" />
                 <action android:name="com.android.cts.verifier.managedprovisioning.BYOD_REMOVE" />
                 <action android:name="com.android.cts.verifier.managedprovisioning.BYOD_INSTALL_APK" />
+                <action android:name="com.android.cts.verifier.managedprovisioning.action.CHECK_INTENT_FILTERS" />
                 <action android:name="com.android.cts.verifier.managedprovisioning.BYOD_CAPTURE_AND_CHECK_IMAGE" />
                 <action android:name="com.android.cts.verifier.managedprovisioning.BYOD_CAPTURE_AND_CHECK_VIDEO" />
                 <action android:name="com.android.cts.verifier.managedprovisioning.BYOD_CAPTURE_AND_CHECK_AUDIO" />
+                <action android:name="com.android.cts.verifier.managedprovisioning.BYOD_KEYGUARD_DISABLED_FEATURES" />
+                <action android:name="com.android.cts.verifier.managedprovisioning.BYOD_LOCKNOW" />
                 <action android:name="com.android.cts.verifier.managedprovisioning.TEST_NFC_BEAM" />
                 <category android:name="android.intent.category.DEFAULT"></category>
             </intent-filter>
@@ -1333,16 +1456,25 @@
             </intent-filter>
         </activity>
 
+        <activity android:name=".managedprovisioning.WorkStatusTestActivity">
+            <intent-filter>
+                <action android:name="com.android.cts.verifier.managedprovisioning.WORK_STATUS_ICON" />
+                <action android:name="com.android.cts.verifier.managedprovisioning.WORK_STATUS_TOAST" />
+                <category android:name="android.intent.category.DEFAULT"></category>
+            </intent-filter>
+        </activity>
+
         <activity android:name=".managedprovisioning.WorkNotificationTestActivity">
             <intent-filter>
                 <action android:name="com.android.cts.verifier.managedprovisioning.WORK_NOTIFICATION" />
+                <action android:name="com.android.cts.verifier.managedprovisioning.LOCKSCREEN_NOTIFICATION" />
                 <action android:name="com.android.cts.verifier.managedprovisioning.CLEAR_WORK_NOTIFICATION" />
                 <category android:name="android.intent.category.DEFAULT"></category>
             </intent-filter>
         </activity>
 
         <receiver android:name=".managedprovisioning.DeviceAdminTestReceiver"
-                android:label="@string/provisioning_byod_device_admin"
+                android:label="@string/afw_device_admin"
                 android:permission="android.permission.BIND_DEVICE_ADMIN">
             <meta-data android:name="android.app.device_admin"
                        android:resource="@xml/device_admin_byod" />
@@ -1427,6 +1559,17 @@
                     android:value="android.software.live_tv" />
         </activity>
 
+        <activity android:name=".tv.TimeShiftTestActivity"
+                android:label="@string/tv_time_shift_test">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_tv" />
+            <meta-data android:name="test_required_features"
+                    android:value="android.software.live_tv" />
+        </activity>
+
         <activity android:name=".screenpinning.ScreenPinningTestActivity"
             android:label="@string/screen_pinning_test">
             <intent-filter>
@@ -1438,16 +1581,102 @@
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
         </activity>
 
-        <activity android:name=".tv.MockTvInputSettingsActivity">
+        <activity android:name=".tv.MockTvInputSetupActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
             </intent-filter>
         </activity>
 
-        <activity android:name=".tv.MockTvInputSetupActivity">
+        <activity android:name=".audio.HifiUltrasoundTestActivity"
+                android:label="@string/hifi_ultrasound_test"
+                android:screenOrientation="locked">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
             </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_audio" />
+            <meta-data android:name="test_required_features" android:value="android.hardware.microphone" />
+        </activity>
+
+        <activity android:name=".audio.HifiUltrasoundSpeakerTestActivity"
+                android:label="@string/hifi_ultrasound_speaker_test"
+                android:screenOrientation="locked">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_audio" />
+            <meta-data android:name="test_required_features" android:value="android.hardware.microphone" />
+        </activity>
+
+        <activity android:name=".audio.AudioDeviceNotificationsActivity"
+                  android:label="@string/audio_devices_notifications_test">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_audio" />
+            <!--
+            <meta-data android:name="test_required_features" android:value="android.hardware.microphone" />
+            -->
+        </activity>
+
+        <activity android:name=".audio.AudioRoutingNotificationsActivity"
+                  android:label="@string/audio_routingnotifications_test">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_audio" />
+            <!--
+            <meta-data android:name="test_required_features" android:value="android.hardware.microphone" />
+            -->
+        </activity>
+
+        <activity android:name=".audio.AudioLoopbackActivity"
+                  android:label="@string/audio_loopback_test">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_audio" />
+            <meta-data android:name="test_required_features" android:value="android.hardware.microphone" />
+            <meta-data android:name="test_excluded_features" android:value="android.hardware.type.watch" />
+            <meta-data android:name="test_excluded_features" android:value="android.hardware.type.television" />
+        </activity>
+
+        <activity android:name=".audio.AudioFrequencyLineActivity"
+                  android:label="@string/audio_frequency_line_test">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_audio" />
+            <meta-data android:name="test_required_features" android:value="android.hardware.microphone" />
+            <meta-data android:name="test_required_features" android:value="android.hardware.audio.output" />
+        </activity>
+
+        <activity android:name=".audio.AudioFrequencySpeakerActivity"
+                  android:label="@string/audio_frequency_speaker_test">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_audio" />
+            <meta-data android:name="test_required_features" android:value="android.hardware.audio.output" />
+            <meta-data android:name="test_required_features" android:value="android.hardware.usb.host" />
+        </activity>
+
+        <activity android:name=".audio.AudioFrequencyMicActivity"
+                  android:label="@string/audio_frequency_mic_test">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_audio" />
+            <meta-data android:name="test_required_features" android:value="android.hardware.microphone" />
+            <meta-data android:name="test_required_features" android:value="android.hardware.audio.output" />
+            <meta-data android:name="test_required_features" android:value="android.hardware.usb.host" />
         </activity>
 
         <service android:name=".tv.MockTvInputService"
diff --git a/apps/CtsVerifier/create_test_certs.sh b/apps/CtsVerifier/create_test_certs.sh
new file mode 100755
index 0000000..b59974a
--- /dev/null
+++ b/apps/CtsVerifier/create_test_certs.sh
@@ -0,0 +1,85 @@
+#!/bin/bash
+
+#
+# Creates or overwrites 3 files in ./res/raw:
+#   - cacert.der
+#   - userkey.der
+#   - usercert.der
+#
+
+tmpdir=$(mktemp -d './XXXXXXXX')
+trap 'rm -r ${tmpdir}; echo; exit 1' EXIT INT QUIT
+
+# CA_default defined in openssl.cnf
+CA_DIR='demoCA'
+
+SUBJECT=\
+'/C=US'\
+'/ST=CA'\
+'/L=Mountain View'\
+'/O=Android'\
+'/CN=localhost'
+PASSWORD='androidtest'
+
+echo "Creating directory '$CA_DIR'..."
+mkdir -p "$tmpdir"/"$CA_DIR"/newcerts \
+    && echo '01' > "$tmpdir"/"$CA_DIR"/serial \
+    && touch "$tmpdir"/"$CA_DIR"/index.txt
+
+echo "Generating CA certificate..."
+(cd "$tmpdir" \
+    && openssl req \
+        -new \
+        -x509 \
+        -days 3650 \
+        -extensions v3_ca \
+        -keyout 'cakey.pem' \
+        -out 'cacert.pem' \
+        -subj "$SUBJECT" \
+        -passout 'pass:'"$PASSWORD" \
+    && openssl x509 \
+        -outform DER \
+        -in 'cacert.pem' \
+        -out 'cacert.der')
+
+echo "Generating user key..."
+(cd "$tmpdir" \
+    && openssl req \
+        -newkey rsa:2048 \
+        -sha256 \
+        -keyout 'userkey.pem' \
+        -nodes \
+        -days 3650 \
+        -out 'userkey.req' \
+        -subj "$SUBJECT" \
+    && openssl pkcs8 \
+        -topk8 \
+        -outform DER \
+        -in 'userkey.pem' \
+        -out 'userkey.der' \
+        -nocrypt)
+
+echo "Generating user certificate..."
+(cd "$tmpdir" \
+    && openssl ca \
+        -out 'usercert.pem' \
+        -in 'userkey.req' \
+        -cert 'cacert.pem' \
+        -keyfile 'cakey.pem' \
+        -days 3650 \
+        -passin 'pass:'"$PASSWORD" \
+        -batch \
+    && openssl x509 \
+        -outform DER \
+        -in 'usercert.pem' \
+        -out 'usercert.der')
+
+# Copy important files to raw resources directory
+cp \
+    "$tmpdir"/cacert.der \
+    "$tmpdir"/userkey.der \
+    "$tmpdir"/usercert.der \
+    'res/raw/'
+
+echo "Finished"
+exit
diff --git a/apps/CtsVerifier/jni/audio_loopback/Android.mk b/apps/CtsVerifier/jni/audio_loopback/Android.mk
new file mode 100644
index 0000000..3dfbc34
--- /dev/null
+++ b/apps/CtsVerifier/jni/audio_loopback/Android.mk
@@ -0,0 +1,28 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE      := libaudioloopback_jni
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES   := \
+	sles.cpp \
+	jni_sles.c
+
+LOCAL_C_INCLUDES := \
+        system/media/audio_utils/include \
+        frameworks/wilhelm/include
+
+LOCAL_SHARED_LIBRARIES := \
+	libutils \
+	libcutils \
+	libOpenSLES \
+	libnbaio \
+	liblog \
+	libaudioutils
+
+LOCAL_PRELINK_MODULE := false
+
+LOCAL_LDFLAGS := -Wl,--hash-style=sysv
+LOCAL_CFLAGS := -DSTDC_HEADERS
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/apps/CtsVerifier/jni/audio_loopback/jni_sles.c b/apps/CtsVerifier/jni/audio_loopback/jni_sles.c
new file mode 100644
index 0000000..a865078
--- /dev/null
+++ b/apps/CtsVerifier/jni/audio_loopback/jni_sles.c
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#include <android/log.h>
+#include "sles.h"
+#include "jni_sles.h"
+#include <stdio.h>
+#include <stddef.h>
+
+/////
+JNIEXPORT jlong JNICALL Java_com_android_cts_verifier_audio_NativeAudioThread_slesInit
+  (JNIEnv *env __unused, jobject obj __unused, jint samplingRate, jint frameCount, jint micSource) {
+
+    sles_data * pSles = NULL;
+
+    if (slesInit(&pSles, samplingRate, frameCount, micSource) != SLES_FAIL) {
+
+        return (long)pSles;
+    }
+    // FIXME This should be stored as a (long) field in the object,
+    //       so that incorrect Java code could not synthesize a bad sles pointer.
+    return 0;
+}
+
+JNIEXPORT jint JNICALL Java_com_android_cts_verifier_audio_NativeAudioThread_slesProcessNext
+  (JNIEnv *env __unused, jobject obj __unused, jlong sles, jdoubleArray samplesArray,
+          jlong offset) {
+    sles_data * pSles= (sles_data*) ((long)sles);
+
+    long maxSamples = (*env)->GetArrayLength(env, samplesArray);
+    double *pSamples = (*env)->GetDoubleArrayElements(env, samplesArray,0);
+
+    long availableSamples = maxSamples-offset;
+    double *pCurrentSample = pSamples+offset;
+
+    SLES_PRINTF("jni slesProcessNext pSles:%p, currentSample %p, availableSamples %ld ", pSles,
+            pCurrentSample, availableSamples);
+
+    int samplesRead = slesProcessNext(pSles, pCurrentSample, availableSamples);
+
+    return samplesRead;
+}
+
+JNIEXPORT jint JNICALL Java_com_android_cts_verifier_audio_NativeAudioThread_slesDestroy
+  (JNIEnv *env __unused, jobject obj __unused, jlong sles) {
+    sles_data * pSles= (sles_data*) ((long) sles);
+
+    int status = slesDestroy(&pSles);
+
+    return status;
+}
diff --git a/apps/CtsVerifier/jni/audio_loopback/jni_sles.h b/apps/CtsVerifier/jni/audio_loopback/jni_sles.h
new file mode 100644
index 0000000..7bff040
--- /dev/null
+++ b/apps/CtsVerifier/jni/audio_loopback/jni_sles.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#include <jni.h>
+
+#ifndef _Included_org_drrickorang_loopback_jni
+#define _Included_org_drrickorang_loopback_jni
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+////////////////////////
+JNIEXPORT jlong JNICALL Java_com_android_cts_verifier_audio_NativeAudioThread_slesInit
+  (JNIEnv *, jobject, jint, jint, jint );
+
+JNIEXPORT jint JNICALL Java_com_android_cts_verifier_audio_NativeAudioThread_slesProcessNext
+  (JNIEnv *, jobject , jlong, jdoubleArray, jlong );
+
+JNIEXPORT jint JNICALL Java_com_android_cts_verifier_audio_NativeAudioThread_slesDestroy
+  (JNIEnv *, jobject , jlong );
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif //_Included_org_drrickorang_loopback_jni
diff --git a/apps/CtsVerifier/jni/audio_loopback/sles.cpp b/apps/CtsVerifier/jni/audio_loopback/sles.cpp
new file mode 100644
index 0000000..7859d35
--- /dev/null
+++ b/apps/CtsVerifier/jni/audio_loopback/sles.cpp
@@ -0,0 +1,655 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+
+////////////////////////////////////////////
+/// Actual sles functions.
+
+
+// Test program to record from default audio input and playback to default audio output.
+// It will generate feedback (Larsen effect) if played through on-device speakers,
+// or acts as a delay if played through headset.
+
+#include "sles.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+
+#include <assert.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+int slesInit(sles_data ** ppSles, int samplingRate, int frameCount, int micSource) {
+    int status = SLES_FAIL;
+    if (ppSles != NULL) {
+        sles_data * pSles = (sles_data*) calloc(1, sizeof (sles_data));
+
+        SLES_PRINTF("malloc %d bytes at %p",sizeof(sles_data), pSles);
+        *ppSles = pSles;
+        if (pSles != NULL)
+        {
+            SLES_PRINTF("creating server. Sampling rate =%d, frame count = %d",samplingRate,
+                    frameCount);
+            status = slesCreateServer(pSles, samplingRate, frameCount, micSource);
+            SLES_PRINTF("slesCreateServer =%d",status);
+        }
+    }
+    return status;
+}
+int slesDestroy(sles_data ** ppSles) {
+    int status = SLES_FAIL;
+    if (ppSles != NULL) {
+        slesDestroyServer(*ppSles);
+
+        if (*ppSles != NULL)
+        {
+            free(*ppSles);
+            *ppSles = 0;
+        }
+        status = SLES_SUCCESS;
+    }
+    return status;
+}
+
+#define ASSERT_EQ(x, y) do { if ((x) == (y)) ; else { fprintf(stderr, "0x%x != 0x%x\n", \
+        (unsigned) (x), (unsigned) (y)); assert((x) == (y)); } } while (0)
+
+
+// Called after audio recorder fills a buffer with data
+static void recorderCallback(SLAndroidSimpleBufferQueueItf caller __unused, void *context) {
+    sles_data *pSles = (sles_data*) context;
+    if (pSles != NULL) {
+
+
+
+        SLresult result;
+
+        pthread_mutex_lock(&(pSles->mutex));
+        //ee  SLES_PRINTF("<R");
+
+        // We should only be called when a recording buffer is done
+        assert(pSles->rxFront <= pSles->rxBufCount);
+        assert(pSles->rxRear <= pSles->rxBufCount);
+        assert(pSles->rxFront != pSles->rxRear);
+        char *buffer = pSles->rxBuffers[pSles->rxFront];
+
+        // Remove buffer from record queue
+        if (++pSles->rxFront > pSles->rxBufCount) {
+            pSles->rxFront = 0;
+        }
+
+        ssize_t actual = audio_utils_fifo_write(&(pSles->fifo), buffer,
+                (size_t) pSles->bufSizeInFrames);
+        if (actual != (ssize_t) pSles->bufSizeInFrames) {
+            write(1, "?", 1);
+        }
+
+        // This is called by a realtime (SCHED_FIFO) thread,
+        // and it is unsafe to do I/O as it could block for unbounded time.
+        // Flash filesystem is especially notorious for blocking.
+        if (pSles->fifo2Buffer != NULL) {
+            actual = audio_utils_fifo_write(&(pSles->fifo2), buffer,
+                    (size_t) pSles->bufSizeInFrames);
+            if (actual != (ssize_t) pSles->bufSizeInFrames) {
+                write(1, "?", 1);
+            }
+        }
+
+        // Enqueue this same buffer for the recorder to fill again.
+        result = (*(pSles->recorderBufferQueue))->Enqueue(pSles->recorderBufferQueue, buffer,
+                pSles->bufSizeInBytes);
+        ASSERT_EQ(SL_RESULT_SUCCESS, result);
+
+        // Update our model of the record queue
+        SLuint32 rxRearNext = pSles->rxRear+1;
+        if (rxRearNext > pSles->rxBufCount) {
+            rxRearNext = 0;
+        }
+        assert(rxRearNext != pSles->rxFront);
+        pSles->rxBuffers[pSles->rxRear] = buffer;
+        pSles->rxRear = rxRearNext;
+
+
+
+        //ee  SLES_PRINTF("r>");
+        pthread_mutex_unlock(&(pSles->mutex));
+
+    } //pSles not null
+}
+
+
+// Called after audio player empties a buffer of data
+static void playerCallback(SLBufferQueueItf caller __unused, void *context) {
+    sles_data *pSles = (sles_data*) context;
+    if (pSles != NULL) {
+
+        SLresult result;
+
+        pthread_mutex_lock(&(pSles->mutex));
+        //ee  SLES_PRINTF("<P");
+
+        // Get the buffer that just finished playing
+        assert(pSles->txFront <= pSles->txBufCount);
+        assert(pSles->txRear <= pSles->txBufCount);
+        assert(pSles->txFront != pSles->txRear);
+        char *buffer = pSles->txBuffers[pSles->txFront];
+        if (++pSles->txFront > pSles->txBufCount) {
+            pSles->txFront = 0;
+        }
+
+
+        ssize_t actual = audio_utils_fifo_read(&(pSles->fifo), buffer, pSles->bufSizeInFrames);
+        if (actual != (ssize_t) pSles->bufSizeInFrames) {
+            write(1, "/", 1);
+            // on underrun from pipe, substitute silence
+            memset(buffer, 0, pSles->bufSizeInFrames * pSles->channels * sizeof(short));
+        }
+
+        if (pSles->injectImpulse == -1) {
+            // Experimentally, a single frame impulse was insufficient to trigger feedback.
+            // Also a Nyquist frequency signal was also insufficient, probably because
+            // the response of output and/or input path was not adequate at high frequencies.
+            // This short burst of a few cycles of square wave at Nyquist/4 was found to work well.
+            for (unsigned i = 0; i < pSles->bufSizeInFrames / 8; i += 8) {
+                for (int j = 0; j < 8; j++) {
+                    for (unsigned k = 0; k < pSles->channels; k++) {
+                        ((short *)buffer)[(i+j)*pSles->channels+k] = j < 4 ? 0x7FFF : 0x8000;
+                    }
+                }
+            }
+            pSles->injectImpulse = 0;
+        }
+
+        // Enqueue the filled buffer for playing
+        result = (*(pSles->playerBufferQueue))->Enqueue(pSles->playerBufferQueue, buffer,
+                pSles->bufSizeInBytes);
+        ASSERT_EQ(SL_RESULT_SUCCESS, result);
+
+        // Update our model of the player queue
+        assert(pSles->txFront <= pSles->txBufCount);
+        assert(pSles->txRear <= pSles->txBufCount);
+        SLuint32 txRearNext = pSles->txRear+1;
+        if (txRearNext > pSles->txBufCount) {
+            txRearNext = 0;
+        }
+        assert(txRearNext != pSles->txFront);
+        pSles->txBuffers[pSles->txRear] = buffer;
+        pSles->txRear = txRearNext;
+
+
+        //ee    SLES_PRINTF("p>");
+        pthread_mutex_unlock(&(pSles->mutex));
+
+    } //pSles not null
+}
+
+int slesCreateServer(sles_data *pSles, int samplingRate, int frameCount, int micSource) {
+    int status = SLES_FAIL;
+
+    if (pSles == NULL) {
+        return status;
+    }
+
+    //        adb shell slesTest_feedback -r1 -t1 -s48000 -f240 -i300 -e3 -o/sdcard/log.wav
+    //            r1 and t1 are the receive and transmit buffer counts, typically 1
+    //            s is the sample rate, typically 48000 or 44100
+    //            f is the frame count per buffer, typically 240 or 256
+    //            i is the number of milliseconds before impulse.  You may need to adjust this.
+    //            e is number of seconds to record
+    //            o is output .wav file name
+
+
+    //        // default values
+    //        SLuint32 rxBufCount = 1;     // -r#
+    //        SLuint32 txBufCount = 1;     // -t#
+    //        SLuint32 bufSizeInFrames = 240;  // -f#
+    //        SLuint32 channels = 1;       // -c#
+    //        SLuint32 sampleRate = 48000; // -s#
+    //        SLuint32 exitAfterSeconds = 3; // -e#
+    //        SLuint32 freeBufCount = 0;   // calculated
+    //        SLuint32 bufSizeInBytes = 0; // calculated
+    //        int injectImpulse = 300; // -i#i
+    //
+    //        // Storage area for the buffer queues
+    //        char **rxBuffers;
+    //        char **txBuffers;
+    //        char **freeBuffers;
+    //
+    //        // Buffer indices
+    //        SLuint32 rxFront;    // oldest recording
+    //        SLuint32 rxRear;     // next to be recorded
+    //        SLuint32 txFront;    // oldest playing
+    //        SLuint32 txRear;     // next to be played
+    //        SLuint32 freeFront;  // oldest free
+    //        SLuint32 freeRear;   // next to be freed
+    //
+    //        audio_utils_fifo fifo; //(*)
+    //        SLAndroidSimpleBufferQueueItf recorderBufferQueue;
+    //        SLBufferQueueItf playerBufferQueue;
+
+    // default values
+    pSles->rxBufCount = 1;     // -r#
+    pSles->txBufCount = 1;     // -t#
+    pSles->bufSizeInFrames = frameCount;//240;  // -f#
+    pSles->channels = 1;       // -c#
+    pSles->sampleRate = samplingRate;//48000; // -s#
+    pSles->exitAfterSeconds = 3; // -e#
+    pSles->freeBufCount = 0;   // calculated
+    pSles->bufSizeInBytes = 0; // calculated
+    pSles->injectImpulse = 300; // -i#i
+
+    // Storage area for the buffer queues
+    //        char **rxBuffers;
+    //        char **txBuffers;
+    //        char **freeBuffers;
+
+    // Buffer indices
+    pSles->rxFront;    // oldest recording
+    pSles->rxRear;     // next to be recorded
+    pSles->txFront;    // oldest playing
+    pSles->txRear;     // next to be played
+    pSles->freeFront;  // oldest free
+    pSles->freeRear;   // next to be freed
+
+    pSles->fifo; //(*)
+    pSles->fifo2Buffer = NULL;
+    pSles->recorderBufferQueue;
+    pSles->playerBufferQueue;
+
+    // compute total free buffers as -r plus -t
+    pSles->freeBufCount = pSles->rxBufCount + pSles->txBufCount;
+    // compute buffer size
+    pSles->bufSizeInBytes = pSles->channels * pSles->bufSizeInFrames * sizeof(short);
+
+    // Initialize free buffers
+    pSles->freeBuffers = (char **) calloc(pSles->freeBufCount+1, sizeof(char *));
+    unsigned j;
+    for (j = 0; j < pSles->freeBufCount; ++j) {
+        pSles->freeBuffers[j] = (char *) malloc(pSles->bufSizeInBytes);
+    }
+    pSles->freeFront = 0;
+    pSles->freeRear = pSles->freeBufCount;
+    pSles->freeBuffers[j] = NULL;
+
+    // Initialize record queue
+    pSles->rxBuffers = (char **) calloc(pSles->rxBufCount+1, sizeof(char *));
+    pSles->rxFront = 0;
+    pSles->rxRear = 0;
+
+    // Initialize play queue
+    pSles->txBuffers = (char **) calloc(pSles->txBufCount+1, sizeof(char *));
+    pSles->txFront = 0;
+    pSles->txRear = 0;
+
+    size_t frameSize = pSles->channels * sizeof(short);
+#define FIFO_FRAMES 1024
+    pSles->fifoBuffer = new short[FIFO_FRAMES * pSles->channels];
+    audio_utils_fifo_init(&(pSles->fifo), FIFO_FRAMES, frameSize, pSles->fifoBuffer);
+
+    //        SNDFILE *sndfile;
+    //        if (outFileName != NULL) {
+    // create .wav writer
+    //            SF_INFO info;
+    //            info.frames = 0;
+    //            info.samplerate = sampleRate;
+    //            info.channels = channels;
+    //            info.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16;
+    //            sndfile = sf_open(outFileName, SFM_WRITE, &info);
+    //            if (sndfile != NULL) {
+#define FIFO2_FRAMES 65536
+    pSles->fifo2Buffer = new short[FIFO2_FRAMES * pSles->channels];
+    audio_utils_fifo_init(&(pSles->fifo2), FIFO2_FRAMES, frameSize, pSles->fifo2Buffer);
+    //            } else {
+    //                fprintf(stderr, "sf_open failed\n");
+    //            }
+    //        } else {
+    //            sndfile = NULL;
+    //        }
+
+    SLresult result;
+
+    // create engine
+    pSles->engineObject;
+    result = slCreateEngine(&(pSles->engineObject), 0, NULL, 0, NULL, NULL);
+    ASSERT_EQ(SL_RESULT_SUCCESS, result);
+    result = (*(pSles->engineObject))->Realize(pSles->engineObject, SL_BOOLEAN_FALSE);
+    ASSERT_EQ(SL_RESULT_SUCCESS, result);
+    SLEngineItf engineEngine;
+    result = (*(pSles->engineObject))->GetInterface(pSles->engineObject, SL_IID_ENGINE,
+            &engineEngine);
+    ASSERT_EQ(SL_RESULT_SUCCESS, result);
+
+    // create output mix
+    pSles->outputmixObject;
+    result = (*engineEngine)->CreateOutputMix(engineEngine, &(pSles->outputmixObject), 0, NULL,
+            NULL);
+    ASSERT_EQ(SL_RESULT_SUCCESS, result);
+    result = (*(pSles->outputmixObject))->Realize(pSles->outputmixObject, SL_BOOLEAN_FALSE);
+    ASSERT_EQ(SL_RESULT_SUCCESS, result);
+
+    // create an audio player with buffer queue source and output mix sink
+    SLDataSource audiosrc;
+    SLDataSink audiosnk;
+    SLDataFormat_PCM pcm;
+    SLDataLocator_OutputMix locator_outputmix;
+    SLDataLocator_BufferQueue locator_bufferqueue_tx;
+    locator_bufferqueue_tx.locatorType = SL_DATALOCATOR_BUFFERQUEUE;
+    locator_bufferqueue_tx.numBuffers = pSles->txBufCount;
+    locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX;
+    locator_outputmix.outputMix = pSles->outputmixObject;
+    pcm.formatType = SL_DATAFORMAT_PCM;
+    pcm.numChannels = pSles->channels;
+    pcm.samplesPerSec = pSles->sampleRate * 1000;
+    pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
+    pcm.containerSize = 16;
+    pcm.channelMask = pSles->channels == 1 ? SL_SPEAKER_FRONT_CENTER :
+            (SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT);
+    pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;
+    audiosrc.pLocator = &locator_bufferqueue_tx;
+    audiosrc.pFormat = &pcm;
+    audiosnk.pLocator = &locator_outputmix;
+    audiosnk.pFormat = NULL;
+    pSles->playerObject = NULL;
+    pSles->recorderObject = NULL;
+    SLInterfaceID ids_tx[1] = {SL_IID_BUFFERQUEUE};
+    SLboolean flags_tx[1] = {SL_BOOLEAN_TRUE};
+    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &(pSles->playerObject),
+            &audiosrc, &audiosnk, 1, ids_tx, flags_tx);
+    if (SL_RESULT_CONTENT_UNSUPPORTED == result) {
+        fprintf(stderr, "Could not create audio player (result %x), check sample rate\n",
+                result);
+        SLES_PRINTF("ERROR: Could not create audio player (result %x), check sample rate\n",
+                result);
+        goto cleanup;
+    }
+    ASSERT_EQ(SL_RESULT_SUCCESS, result);
+    result = (*(pSles->playerObject))->Realize(pSles->playerObject, SL_BOOLEAN_FALSE);
+    ASSERT_EQ(SL_RESULT_SUCCESS, result);
+    SLPlayItf playerPlay;
+    result = (*(pSles->playerObject))->GetInterface(pSles->playerObject, SL_IID_PLAY,
+            &playerPlay);
+    ASSERT_EQ(SL_RESULT_SUCCESS, result);
+    result = (*(pSles->playerObject))->GetInterface(pSles->playerObject, SL_IID_BUFFERQUEUE,
+            &(pSles->playerBufferQueue));
+    ASSERT_EQ(SL_RESULT_SUCCESS, result);
+    result = (*(pSles->playerBufferQueue))->RegisterCallback(pSles->playerBufferQueue,
+            playerCallback, pSles);
+    ASSERT_EQ(SL_RESULT_SUCCESS, result);
+
+    // Enqueue some zero buffers for the player
+    for (j = 0; j < pSles->txBufCount; ++j) {
+
+        // allocate a free buffer
+        assert(pSles->freeFront != pSles->freeRear);
+        char *buffer = pSles->freeBuffers[pSles->freeFront];
+        if (++pSles->freeFront > pSles->freeBufCount) {
+            pSles->freeFront = 0;
+        }
+
+        // put on play queue
+        SLuint32 txRearNext = pSles->txRear + 1;
+        if (txRearNext > pSles->txBufCount) {
+            txRearNext = 0;
+        }
+        assert(txRearNext != pSles->txFront);
+        pSles->txBuffers[pSles->txRear] = buffer;
+        pSles->txRear = txRearNext;
+        result = (*(pSles->playerBufferQueue))->Enqueue(pSles->playerBufferQueue,
+                buffer, pSles->bufSizeInBytes);
+        ASSERT_EQ(SL_RESULT_SUCCESS, result);
+    }
+
+    result = (*playerPlay)->SetPlayState(playerPlay, SL_PLAYSTATE_PLAYING);
+    ASSERT_EQ(SL_RESULT_SUCCESS, result);
+
+    // Create an audio recorder with microphone device source and buffer queue sink.
+    // The buffer queue as sink is an Android-specific extension.
+
+    SLDataLocator_IODevice locator_iodevice;
+    SLDataLocator_AndroidSimpleBufferQueue locator_bufferqueue_rx;
+    locator_iodevice.locatorType = SL_DATALOCATOR_IODEVICE;
+    locator_iodevice.deviceType = SL_IODEVICE_AUDIOINPUT;
+    locator_iodevice.deviceID = SL_DEFAULTDEVICEID_AUDIOINPUT;
+    locator_iodevice.device = NULL;
+    audiosrc.pLocator = &locator_iodevice;
+    audiosrc.pFormat = NULL;
+    locator_bufferqueue_rx.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE;
+    locator_bufferqueue_rx.numBuffers = pSles->rxBufCount;
+    audiosnk.pLocator = &locator_bufferqueue_rx;
+    audiosnk.pFormat = &pcm;
+    {
+        SLInterfaceID ids_rx[2] = {SL_IID_ANDROIDSIMPLEBUFFERQUEUE,
+                SL_IID_ANDROIDCONFIGURATION};
+        SLboolean flags_rx[2] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE};
+        result = (*engineEngine)->CreateAudioRecorder(engineEngine, &(pSles->recorderObject),
+                &audiosrc, &audiosnk, 2, ids_rx, flags_rx);
+        if (SL_RESULT_SUCCESS != result) {
+            fprintf(stderr, "Could not create audio recorder (result %x), "
+                    "check sample rate and channel count\n", result);
+            status = SLES_FAIL;
+
+            SLES_PRINTF("ERROR: Could not create audio recorder (result %x), "
+                    "check sample rate and channel count\n", result);
+            goto cleanup;
+        }
+    }
+    ASSERT_EQ(SL_RESULT_SUCCESS, result);
+
+    {
+        /* Get the Android configuration interface which is explicit */
+        SLAndroidConfigurationItf configItf;
+        result = (*(pSles->recorderObject))->GetInterface(pSles->recorderObject,
+                SL_IID_ANDROIDCONFIGURATION, (void*)&configItf);
+        ASSERT_EQ(SL_RESULT_SUCCESS, result);
+        SLuint32 presetValue = micSource;
+        /* Use the configuration interface to configure the recorder before it's realized */
+        if (presetValue != SL_ANDROID_RECORDING_PRESET_NONE) {
+            result = (*configItf)->SetConfiguration(configItf, SL_ANDROID_KEY_RECORDING_PRESET,
+                    &presetValue, sizeof(SLuint32));
+            ASSERT_EQ(SL_RESULT_SUCCESS, result);
+        }
+
+    }
+
+    result = (*(pSles->recorderObject))->Realize(pSles->recorderObject, SL_BOOLEAN_FALSE);
+    ASSERT_EQ(SL_RESULT_SUCCESS, result);
+    SLRecordItf recorderRecord;
+    result = (*(pSles->recorderObject))->GetInterface(pSles->recorderObject, SL_IID_RECORD,
+            &recorderRecord);
+    ASSERT_EQ(SL_RESULT_SUCCESS, result);
+    result = (*(pSles->recorderObject))->GetInterface(pSles->recorderObject,
+            SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &(pSles->recorderBufferQueue));
+    ASSERT_EQ(SL_RESULT_SUCCESS, result);
+    result = (*(pSles->recorderBufferQueue))->RegisterCallback(pSles->recorderBufferQueue,
+            recorderCallback, pSles);
+    ASSERT_EQ(SL_RESULT_SUCCESS, result);
+
+    // Enqueue some empty buffers for the recorder
+    for (j = 0; j < pSles->rxBufCount; ++j) {
+
+        // allocate a free buffer
+        assert(pSles->freeFront != pSles->freeRear);
+        char *buffer = pSles->freeBuffers[pSles->freeFront];
+        if (++pSles->freeFront > pSles->freeBufCount) {
+            pSles->freeFront = 0;
+        }
+
+        // put on record queue
+        SLuint32 rxRearNext = pSles->rxRear + 1;
+        if (rxRearNext > pSles->rxBufCount) {
+            rxRearNext = 0;
+        }
+        assert(rxRearNext != pSles->rxFront);
+        pSles->rxBuffers[pSles->rxRear] = buffer;
+        pSles->rxRear = rxRearNext;
+        result = (*(pSles->recorderBufferQueue))->Enqueue(pSles->recorderBufferQueue,
+                buffer, pSles->bufSizeInBytes);
+        ASSERT_EQ(SL_RESULT_SUCCESS, result);
+    }
+
+    // Kick off the recorder
+    result = (*recorderRecord)->SetRecordState(recorderRecord, SL_RECORDSTATE_RECORDING);
+    ASSERT_EQ(SL_RESULT_SUCCESS, result);
+
+    // Tear down the objects and exit
+    status = SLES_SUCCESS;
+    cleanup:
+    SLES_PRINTF("Finished initialization with status: %d", status);
+
+    return status;
+}
+
+int slesProcessNext(sles_data *pSles, double *pSamples, long maxSamples) {
+    //int status = SLES_FAIL;
+
+    SLES_PRINTF("slesProcessNext: pSles = %p, currentSample: %p,  maxSamples = %ld", pSles,
+            pSamples, maxSamples);
+
+    int samplesRead = 0;
+
+    int currentSample = 0;
+    double *pCurrentSample = pSamples;
+    int maxValue = 32768;
+
+    if (pSles == NULL) {
+        return samplesRead;
+    }
+
+    SLresult result;
+    for (int i = 0; i < 10; i++) {
+        usleep(100000);
+        if (pSles->fifo2Buffer != NULL) {
+            for (;;) {
+                short buffer[pSles->bufSizeInFrames * pSles->channels];
+                ssize_t actual = audio_utils_fifo_read(&(pSles->fifo2), buffer,
+                        pSles->bufSizeInFrames);
+                if (actual <= 0)
+                    break;
+                {
+                    for (int jj =0; jj<actual && currentSample < maxSamples; jj++) {
+                        *(pCurrentSample++) = ((double)buffer[jj])/maxValue;
+                        currentSample++;
+                    }
+                }
+                samplesRead +=actual;
+            }
+        }
+        if (pSles->injectImpulse > 0) {
+            if (pSles->injectImpulse <= 100) {
+                pSles->injectImpulse = -1;
+                write(1, "I", 1);
+            } else {
+                if ((pSles->injectImpulse % 1000) < 100) {
+                    write(1, "i", 1);
+                }
+                pSles->injectImpulse -= 100;
+            }
+        } else if (i == 9) {
+            write(1, ".", 1);
+        }
+    }
+    SLBufferQueueState playerBQState;
+    result = (*(pSles->playerBufferQueue))->GetState(pSles->playerBufferQueue,
+            &playerBQState);
+    ASSERT_EQ(SL_RESULT_SUCCESS, result);
+    SLAndroidSimpleBufferQueueState recorderBQState;
+    result = (*(pSles->recorderBufferQueue))->GetState(pSles->recorderBufferQueue,
+            &recorderBQState);
+    ASSERT_EQ(SL_RESULT_SUCCESS, result);
+
+    SLES_PRINTF("End of slesProcessNext: pSles = %p, samplesRead = %d, maxSamples= %ld", pSles,
+            samplesRead, maxSamples);
+
+    return samplesRead;
+}
+
+int slesDestroyServer(sles_data *pSles) {
+    int status = SLES_FAIL;
+
+    SLES_PRINTF("Start slesDestroyServer: pSles = %p", pSles);
+    if (pSles == NULL) {
+        return status;
+    }
+
+    if (NULL != pSles->playerObject) {
+
+        SLES_PRINTF("stopping player...");
+        SLPlayItf playerPlay;
+        SLresult result = (*(pSles->playerObject))->GetInterface(pSles->playerObject,
+                SL_IID_PLAY, &playerPlay);
+
+        ASSERT_EQ(SL_RESULT_SUCCESS, result);
+
+        //stop player and recorder if they exist
+        result = (*playerPlay)->SetPlayState(playerPlay, SL_PLAYSTATE_STOPPED);
+        ASSERT_EQ(SL_RESULT_SUCCESS, result);
+    }
+
+    if (NULL != pSles->recorderObject) {
+        SLES_PRINTF("stopping recorder...");
+        SLRecordItf recorderRecord;
+        SLresult result = (*(pSles->recorderObject))->GetInterface(pSles->recorderObject,
+                SL_IID_RECORD, &recorderRecord);
+        ASSERT_EQ(SL_RESULT_SUCCESS, result);
+
+        result = (*recorderRecord)->SetRecordState(recorderRecord, SL_RECORDSTATE_STOPPED);
+        ASSERT_EQ(SL_RESULT_SUCCESS, result);
+    }
+
+    usleep(1000);
+
+    audio_utils_fifo_deinit(&(pSles->fifo));
+    delete[] pSles->fifoBuffer;
+
+    SLES_PRINTF("slesDestroyServer 2");
+
+    //        if (sndfile != NULL) {
+    audio_utils_fifo_deinit(&(pSles->fifo2));
+    delete[] pSles->fifo2Buffer;
+
+    SLES_PRINTF("slesDestroyServer 3");
+
+    //            sf_close(sndfile);
+    //        }
+    if (NULL != pSles->playerObject) {
+        (*(pSles->playerObject))->Destroy(pSles->playerObject);
+    }
+
+    SLES_PRINTF("slesDestroyServer 4");
+
+    if (NULL != pSles->recorderObject) {
+        (*(pSles->recorderObject))->Destroy(pSles->recorderObject);
+    }
+
+    SLES_PRINTF("slesDestroyServer 5");
+
+    (*(pSles->outputmixObject))->Destroy(pSles->outputmixObject);
+    SLES_PRINTF("slesDestroyServer 6");
+    (*(pSles->engineObject))->Destroy(pSles->engineObject);
+    SLES_PRINTF("slesDestroyServer 7");
+
+    //        free(pSles);
+    //        pSles=NULL;
+
+    status = SLES_SUCCESS;
+
+    SLES_PRINTF("End slesDestroyServer: status = %d", status);
+    return status;
+}
+
diff --git a/apps/CtsVerifier/jni/audio_loopback/sles.h b/apps/CtsVerifier/jni/audio_loopback/sles.h
new file mode 100644
index 0000000..2550b81
--- /dev/null
+++ b/apps/CtsVerifier/jni/audio_loopback/sles.h
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#include <SLES/OpenSLES.h>
+#include <SLES/OpenSLES_Android.h>
+#include <pthread.h>
+#include <android/log.h>
+
+#ifndef _Included_org_drrickorang_loopback_sles
+#define _Included_org_drrickorang_loopback_sles
+
+//struct audio_utils_fifo;
+#define SLES_PRINTF(...)  __android_log_print(ANDROID_LOG_INFO, "sles_jni", __VA_ARGS__);
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <audio_utils/fifo.h>
+
+typedef struct {
+    SLuint32 rxBufCount;     // -r#
+    SLuint32 txBufCount;     // -t#
+    SLuint32 bufSizeInFrames;  // -f#
+    SLuint32 channels;       // -c#
+    SLuint32 sampleRate; // -s#
+    SLuint32 exitAfterSeconds; // -e#
+    SLuint32 freeBufCount;   // calculated
+    SLuint32 bufSizeInBytes; // calculated
+    int injectImpulse; // -i#i
+
+    // Storage area for the buffer queues
+    char **rxBuffers;
+    char **txBuffers;
+    char **freeBuffers;
+
+    // Buffer indices
+    SLuint32 rxFront;    // oldest recording
+    SLuint32 rxRear;     // next to be recorded
+    SLuint32 txFront;    // oldest playing
+    SLuint32 txRear;     // next to be played
+    SLuint32 freeFront;  // oldest free
+    SLuint32 freeRear;   // next to be freed
+
+    struct audio_utils_fifo fifo; //(*)
+    struct audio_utils_fifo fifo2;
+    short *fifo2Buffer;
+    short *fifoBuffer;
+    SLAndroidSimpleBufferQueueItf recorderBufferQueue;
+    SLBufferQueueItf playerBufferQueue;
+
+    pthread_mutex_t mutex;// = PTHREAD_MUTEX_INITIALIZER;
+
+    //other things that belong here
+    SLObjectItf playerObject;
+    SLObjectItf recorderObject;
+    SLObjectItf outputmixObject;
+    SLObjectItf engineObject;
+} sles_data;
+
+enum {
+    SLES_SUCCESS = 0,
+    SLES_FAIL = 1,
+} SLES_STATUS_ENUM;
+
+int slesInit(sles_data ** ppSles, int samplingRate, int frameCount, int micSource);
+
+//note the double pointer to properly free the memory of the structure
+int slesDestroy(sles_data ** ppSles);
+
+///full
+int slesFull(sles_data *pSles);
+
+int slesCreateServer(sles_data *pSles, int samplingRate, int frameCount, int micSource);
+int slesProcessNext(sles_data *pSles, double *pSamples, long maxSamples);
+int slesDestroyServer(sles_data *pSles);
+
+#ifdef __cplusplus
+}
+#endif
+#endif //_Included_org_drrickorang_loopback_sles
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/Android.mk b/apps/CtsVerifier/jni/cameraanalyzer/Android.mk
deleted file mode 100644
index d595a20..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/Android.mk
+++ /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.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-
-LOCAL_MODULE := libcameraanalyzer
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := com_android_cts_verifier_camera_analyzer_CameraTests.cpp \
-                com_android_cts_verifier_camera_analyzer_ColorCheckerTest.cpp \
-                com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.cpp \
-                com_android_cts_verifier_camera_analyzer_AutoLockTest.cpp \
-                com_android_cts_verifier_camera_analyzer_MeteringTest.cpp \
-                com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.cpp
-
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../include/colorchecker $(JNI_H_INCLUDE)
-
-LOCAL_CXX_STL := libc++
-LOCAL_STATIC_LIBRARIES := libcolorchecker
-LOCAL_SHARED_LIBRARIES := \
-    libjnigraphics \
-    libcutils \
-    libutils \
-    liblog \
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_AutoLockTest.cpp b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_AutoLockTest.cpp
deleted file mode 100644
index fac39e1..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_AutoLockTest.cpp
+++ /dev/null
@@ -1,95 +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.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "AutoLockJNI"
-#include <utils/Log.h>
-#include "com_android_cts_verifier_camera_analyzer_AutoLockTest.h"
-
-#include <vector>
-#include <string>
-#include <string.h>
-
-#include "testingimage.h"
-#include "autolocktest.h"
-#include "vec2.h"
-#include "android/bitmap.h"
-
-jlong Java_com_android_cts_verifier_camera_analyzer_AutoLockTest_createAutoLockTest(
-        JNIEnv*      env,
-        jobject      thiz) {
-
-    AutoLockTest* testHandler = new AutoLockTest();
-    long handlerAddress = (long)testHandler;
-    return handlerAddress;
-}
-
-void Java_com_android_cts_verifier_camera_analyzer_AutoLockTest_createAutoLockClass(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputImageAddress,
-        jlong        inputHandlerAddress,
-        jlong        checkercenterAddress,
-        jlong        checkerradiusAddress) {
-
-    ALOGV("JNI createAutoLockClass starts!");
-    long imageAddress = (long)inputImageAddress;
-    long handlerAddress = (long)inputHandlerAddress;
-
-    TestingImage *image = (TestingImage*) imageAddress;
-    AutoLockTest *testHandler = (AutoLockTest*) handlerAddress;
-
-    std::vector<std::vector< Vec2f > >* checkerCenter =
-            (std::vector<std::vector< Vec2f > >*) (long) checkercenterAddress;
-    std::vector<std::vector< float > >* checkerRadius =
-            (std::vector<std::vector< float > >*) (long) checkerradiusAddress;
-    ALOGV("Classes recovered");
-
-    // Uses only the gray patches on the color checker for comparison.
-    testHandler->addDataToList(image->getColorChecker(3, 4, 0, 6,
-                                                      checkerCenter,
-                                                      checkerRadius));
-
-    delete image;
-}
-
-void Java_com_android_cts_verifier_camera_analyzer_AutoLockTest_processAutoLockTest(
-        JNIEnv*          env,
-        jobject          thiz,
-        jlong            inputHandlerAddress,
-        jbooleanArray    tempArray) {
-
-    ALOGV("Processing Auto Lock data!");
-
-    long handlerAddress = (long) inputHandlerAddress;
-    AutoLockTest *testHandler = (AutoLockTest*) handlerAddress;
-
-    testHandler->processData();
-
-    // Converts the native boolean array into a java boolean array.
-    const std::vector<bool>* nativeComparisonResults =
-            testHandler->getComparisonResults();
-    jboolean comparisonResults[nativeComparisonResults->size()];
-
-    for (int i = 0; i < nativeComparisonResults->size(); ++i) {
-        comparisonResults[i] = (jboolean) (*nativeComparisonResults)[i];
-    }
-
-    env->SetBooleanArrayRegion(tempArray,
-                               0, nativeComparisonResults->size(),
-                               comparisonResults);
-    testHandler->clearData();
-}
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_AutoLockTest.h b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_AutoLockTest.h
deleted file mode 100644
index dc40bc2..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_AutoLockTest.h
+++ /dev/null
@@ -1,52 +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.
- */
-
-#ifndef JNI_CAMERAANALYZER_AUTOLOCKTEST_H
-#define JNI_CAMERAANALYZER_AUTOLOCKTEST_H
-
-#include <jni.h>
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-JNIEXPORT jlong JNICALL
-Java_com_android_cts_verifier_camera_analyzer_AutoLockTest_createAutoLockTest(
-        JNIEnv*      env,
-        jobject      thiz);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_AutoLockTest_createAutoLockClass(
-        JNIEnv *env,
-        jobject thiz,
-        jlong inputImageAddress,
-        jlong inputHandlerAddress,
-        jlong checkercenterAddress,
-        jlong checkerradiusAddress);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_AutoLockTest_processAutoLockTest(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress,
-        jbooleanArray    tempArray);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_CameraTests.cpp b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_CameraTests.cpp
deleted file mode 100644
index ed91233..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_CameraTests.cpp
+++ /dev/null
@@ -1,223 +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.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "CameraTestsJNI"
-#include <utils/Log.h>
-#include "com_android_cts_verifier_camera_analyzer_CameraTests.h"
-#include "android/bitmap.h"
-#include "testingimage.h"
-#include "imagetesthandler.h"
-
-#include <string.h>
-
-jlong Java_com_android_cts_verifier_camera_analyzer_CameraTests_findNative(
-        JNIEnv*      env,
-        jobject      thiz,
-        jobject      inputBitmap) {
-
-    ALOGV("JNI findNative starts!");
-
-    // Verify that we can handle the input bitmap
-    AndroidBitmapInfo inputInfo;
-    AndroidBitmap_getInfo(env, inputBitmap, &inputInfo);
-    if (inputInfo.format != ANDROID_BITMAP_FORMAT_RGBA_8888 &&
-        inputInfo.format != ANDROID_BITMAP_FORMAT_RGB_565) {
-        ALOGE("Only RGBA_8888 and RGB_565 bitmaps are supported, type was %d.",
-             inputInfo.format);
-    }
-
-    // Get some references to the fields and class type of ColorChecker
-    jclass thizCls = env->GetObjectClass(thiz);
-    ALOGV("ColorChecker field and classes reference finished!");
-
-    // Get raw inputs and outputs ready
-    uint8_t *inputBuffer = NULL;
-    int result = AndroidBitmap_lockPixels(
-            env,
-            inputBitmap,
-            reinterpret_cast<void**>(&inputBuffer));
-
-    if (result != ANDROID_BITMAP_RESULT_SUCCESS) {
-        ALOGE("Unable to lock input bitmap");
-    }
-
-    uint8_t *outputImage = NULL;
-    int outputWidth, outputHeight;
-
-    ALOGV("Input and output images created!");
-
-    // Find the color checker
-    bool success;
-    uint8_t *inputBufferRGBA = NULL;
-    int inputStride;
-    bool freeInputRGBA = false;
-    switch (inputInfo.format) {
-        case ANDROID_BITMAP_FORMAT_RGB_565: {
-            // First convert to RGBA_8888
-            inputBufferRGBA = new uint8_t[inputInfo.width *
-                                          inputInfo.height *
-                                          4];
-            inputStride = inputInfo.width * 4;
-            uint8_t *outP = inputBufferRGBA;
-            for (int y = 0; y < inputInfo.height; y++ ) {
-                uint16_t *inP = (uint16_t*)(&inputBuffer[y * inputInfo.stride]);
-                for (int x = 0; x < inputInfo.width; x++) {
-                    *(outP++) = ( ((*inP) >> 0) & 0x001F) << 3;
-                    *(outP++) = ( ((*inP) >> 5) & 0x003F) << 2;
-                    *(outP++) = ( ((*inP) >> 11) & 0x001F) << 3;
-                    outP++;
-                    inP++;
-                }
-            }
-            freeInputRGBA = true;
-
-            ALOGV("RGB_565 Format with width, height and stride as %d, %d, %d",
-                 inputInfo.width, inputInfo.height, inputStride);
-            break;
-        }
-        case ANDROID_BITMAP_FORMAT_RGBA_8888: {
-            // Already in RGBA
-            inputBufferRGBA = inputBuffer;
-            inputStride = inputInfo.stride;
-            ALOGV("RGB_8888 Format with width, height and stride as %d, %d, %d",
-                 inputInfo.width, inputInfo.height, inputStride);
-            break;
-        }
-    }
-
-    TestingImage *input_testing_image =
-            new TestingImage(inputBufferRGBA, inputInfo.height, inputInfo.width,
-                             4, inputStride, 120, 160);
-
-    long lp = (long)input_testing_image;
-
-    result = AndroidBitmap_unlockPixels(env, inputBitmap);
-    if (result != ANDROID_BITMAP_RESULT_SUCCESS) {
-        ALOGE("Unable to unlock input bitmap");
-    }
-
-    if (freeInputRGBA) {
-        ALOGV("Deleteing inputbufferRGBA");
-        delete[] inputBufferRGBA;
-    }
-
-    return lp;
-    ALOGV("Input format switched!");
-}
-
-jlong Java_com_android_cts_verifier_camera_analyzer_CameraTests_createImageTestHandler(
-        JNIEnv*      env,
-        jobject      thiz,
-        jint         debugHeight,
-        jint         debugWidth) {
-
-    ImageTestHandler* testHandler =
-            new ImageTestHandler(debugHeight, debugWidth);
-    long handlerAddress = (long)testHandler;
-    return handlerAddress;
-}
-
-void Java_com_android_cts_verifier_camera_analyzer_CameraTests_cleanUpHandler(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress) {
-
-    ImageTestHandler* testHandler = (ImageTestHandler*) (long) inputHandlerAddress;
-    delete testHandler;
-}
-
-void Java_com_android_cts_verifier_camera_analyzer_CameraTests_displayHandlerDebugOutput(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress) {
-
-    jclass thizCls = env->GetObjectClass(thiz);
-    jfieldID outputId = env->GetFieldID(thizCls, "mDebugOutput",
-                                        "Landroid/graphics/Bitmap;");
-
-    ImageTestHandler* testHandler = (ImageTestHandler*) (long) inputHandlerAddress;
-    uint8_t *outputImage =  new uint8_t[testHandler->getDebugHeight() *
-                                        testHandler->getDebugWidth() * 4];
-
-    const unsigned char *debugoutput = testHandler->debug_output();
-    memcpy(outputImage, debugoutput, testHandler->getDebugHeight() *
-            testHandler->getDebugWidth() * 4);
-
-    int outputWidth = testHandler->getDebugWidth();
-    int outputHeight = testHandler->getDebugHeight();
-    bool success = false;
-
-    if (outputImage == NULL) {
-        ALOGV("output Image is null!");
-    } else {
-        ALOGV("output Image is ready!");
-    }
-
-    // Create debug bitmap from output image data
-    if (outputImage != NULL) {
-        // Get method handles, create inputs to createBitmap
-        jclass bitmapClass =
-                env->FindClass("android/graphics/Bitmap");
-        jclass bitmapConfigClass =
-                env->FindClass("android/graphics/Bitmap$Config");
-
-        jmethodID createBitmap = env->GetStaticMethodID(
-            bitmapClass, "createBitmap",
-            "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;");
-
-        jmethodID getConfig = env->GetStaticMethodID(
-            bitmapConfigClass, "valueOf",
-            "(Ljava/lang/String;)Landroid/graphics/Bitmap$Config;");
-
-        // Create bitmap config and bitmap
-        jstring bitmapConfigValue = env->NewStringUTF("ARGB_8888");
-        jobject rgbaConfig = env->CallStaticObjectMethod(bitmapConfigClass,
-                                                         getConfig,
-                                                         bitmapConfigValue);
-        jobject outputBitmap = env->CallStaticObjectMethod(bitmapClass,
-                                                           createBitmap,
-                                                           outputWidth,
-                                                           outputHeight,
-                                                           rgbaConfig);
-        // Copy output image into it
-        uint8_t *outputBuffer;
-        int result = AndroidBitmap_lockPixels(
-                env,
-                outputBitmap,
-                reinterpret_cast<void**>(&outputBuffer) );
-
-        if (result != ANDROID_BITMAP_RESULT_SUCCESS) {
-            ALOGE("Unable to lock output bitmap");
-        }
-
-        memcpy(outputBuffer, outputImage, outputWidth * outputHeight * 4);
-
-        result = AndroidBitmap_unlockPixels(env, outputBitmap);
-        if (result != ANDROID_BITMAP_RESULT_SUCCESS) {
-            ALOGE("Unable to unlock output bitmap");
-        }
-
-        // Write new Bitmap reference into mDebugOutput class member
-        env->SetObjectField(thiz, outputId, outputBitmap);
-        ALOGV("Copied to outputBitmap");
-        delete [] outputImage;
-        env->DeleteLocalRef(outputBitmap);
-        env->DeleteLocalRef(rgbaConfig);
-        env->DeleteLocalRef(bitmapClass);
-        env->DeleteLocalRef(bitmapConfigClass);
-    }
-}
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_CameraTests.h b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_CameraTests.h
deleted file mode 100644
index e071dc1..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_CameraTests.h
+++ /dev/null
@@ -1,57 +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.
- */
-
-#ifndef JNI_CAMERAANALYZER_CAMERATESTS_H
-#define JNI_CAMERAANALYZER_CAMERATESTS_H
-
-#include <jni.h>
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-JNIEXPORT jlong JNICALL
-Java_com_android_cts_verifier_camera_analyzer_CameraTests_findNative(
-        JNIEnv *env,
-        jobject thiz,
-        jobject inputBitmap);
-
-JNIEXPORT jlong JNICALL
-Java_com_android_cts_verifier_camera_analyzer_CameraTests_createImageTestHandler(
-        JNIEnv*      env,
-        jobject      thiz,
-        jint         debugHeight,
-        jint         debugWidth);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_CameraTests_cleanUpHandler(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_CameraTests_displayHandlerDebugOutput(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorCheckerTest.cpp b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorCheckerTest.cpp
deleted file mode 100644
index 94e3ac2..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorCheckerTest.cpp
+++ /dev/null
@@ -1,84 +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.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "FindColorCheckerJNI"
-#include <utils/Log.h>
-#include "com_android_cts_verifier_camera_analyzer_ColorCheckerTest.h"
-
-#include <string.h>
-#include "android/bitmap.h"
-#include "colorcheckertest.h"
-#include "testingimage.h"
-
-jlong Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_createColorCheckerTest(
-        JNIEnv*      env,
-        jobject      thiz,
-        jint         debugHeight,
-        jint         debugWidth) {
-    ColorCheckerTest* testHandler = new ColorCheckerTest(debugHeight,
-                                                         debugWidth);
-    long testHandlerAddress = (long)testHandler;
-    return testHandlerAddress;
-}
-
-void Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_createColorCheckerClass(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputImageAddress,
-        jlong        inputHandlerAddress) {
-    ALOGV("JNI createColorCheckerClass starts!");
-
-    TestingImage *testImage = (TestingImage*) (long) inputImageAddress;
-    ColorCheckerTest *testHandler = (ColorCheckerTest*)
-            (long) inputHandlerAddress;
-
-    testHandler->addTestingImage(testImage);
-}
-
-jboolean Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_processColorCheckerTest(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress) {
-
-    ColorCheckerTest *testHandler = (ColorCheckerTest*)
-            (long) inputHandlerAddress;
-    testHandler->processData();
-    return testHandler->getSuccess();
-}
-
-jlong Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_getColorCheckerRadiusAdd(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress) {
-
-    ColorCheckerTest *testHandler = (ColorCheckerTest*)
-            (long) inputHandlerAddress;
-    long rtn = (long) testHandler->getCheckerRadiusAdd();
-    return rtn;
-}
-
-jlong Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_getColorCheckerCenterAdd(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress) {
-
-    ColorCheckerTest *testHandler = (ColorCheckerTest*)
-            (long) inputHandlerAddress;
-
-    long rtn = (long) testHandler->getCheckerCenterAdd();
-    return rtn;
-}
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorCheckerTest.h b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorCheckerTest.h
deleted file mode 100644
index fb87735..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorCheckerTest.h
+++ /dev/null
@@ -1,63 +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.
- */
-
-#ifndef JNI_CAMERAANALYZER_COLORCHECKERTEST_H
-#define JNI_CAMERAANALYZER_COLORCHECKERTEST_H
-
-#include <jni.h>
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-JNIEXPORT jlong JNICALL
-Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_createColorCheckerTest(
-    JNIEnv*      env,
-    jobject      thiz,
-    jint         output_height,
-    jint         output_width);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_createColorCheckerClass(
-    JNIEnv *env,
-    jobject thiz,
-    jlong buffer_address,
-    jlong handler_address);
-
-JNIEXPORT jlong JNICALL
-Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_getColorCheckerRadiusAdd(
-    JNIEnv *env,
-    jobject thiz,
-    jlong handler_address);
-
-JNIEXPORT jlong JNICALL
-Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_getColorCheckerCenterAdd(
-    JNIEnv *env,
-    jobject thiz,
-    jlong handler_address);
-
-JNIEXPORT jboolean JNICALL
-Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_processColorCheckerTest(
-    JNIEnv*      env,
-    jobject      thiz,
-    jlong        handler_address);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.cpp b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.cpp
deleted file mode 100644
index 0224639..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.cpp
+++ /dev/null
@@ -1,88 +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.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "ExposureCompensationJNI"
-#include <utils/Log.h>
-#include <vector>
-#include <string.h>
-
-#include "android/bitmap.h"
-#include "testingimage.h"
-#include "exposurecompensationtest.h"
-#include "vec2.h"
-
-#include "com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.h"
-
-jlong Java_com_android_cts_verifier_camera_analyzer_ExposureCompensationTest_createExposureCompensationTest(
-      JNIEnv*      env,
-      jobject      thiz,
-      jint         debugHeight,
-      jint         debugWidth) {
-
-    ExposureCompensationTest* testHandler =
-            new ExposureCompensationTest(debugHeight, debugWidth);
-    long handlerAddress = (long)testHandler;
-
-    return handlerAddress;
-}
-
-void Java_com_android_cts_verifier_camera_analyzer_ExposureCompensationTest_createExposureCompensationClass(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputImageAddress,
-        jlong        inputHandlerAddress,
-        jlong        checkerCenterAddress,
-        jlong        checkerRadiusAddress,
-        jfloat       exposureValue) {
-
-    ALOGV("JNI createExposureCompensationClass starts!");
-
-    long imageAddress = (long)inputImageAddress;
-    long handlerAddress = (long)inputHandlerAddress;
-
-    TestingImage *inputImage = (TestingImage*) imageAddress;
-    ExposureCompensationTest *testHandler =
-            (ExposureCompensationTest*) handlerAddress;
-
-    std::vector<std::vector< Vec2f > >* checkerCenter =
-            (std::vector<std::vector< Vec2f > >*) (long) checkerCenterAddress;
-    std::vector<std::vector< float > >* checkerRadius =
-            (std::vector<std::vector< float > >*) (long) checkerRadiusAddress;
-
-    const std::vector<Vec3f>* checkerValue =
-            inputImage->getColorChecker(3, 4, 0, 6,
-                                        checkerCenter, checkerRadius);
-    testHandler->addDataToList((float) exposureValue, checkerValue);
-    delete inputImage;
-    delete checkerValue;
-}
-
-jstring Java_com_android_cts_verifier_camera_analyzer_ExposureCompensationTest_processExposureCompensationTest(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress) {
-
-    long handlerAddress = (long) inputHandlerAddress;
-    ExposureCompensationTest *testHandler =
-            (ExposureCompensationTest*) handlerAddress;
-
-    testHandler->processData();
-
-    const char* nativeDebugText = testHandler->getDebugText();
-    ALOGV("%s", nativeDebugText);
-    return env->NewStringUTF(nativeDebugText);
-}
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.h b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.h
deleted file mode 100644
index 8e8761d..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.h
+++ /dev/null
@@ -1,54 +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.
- */
-
-#ifndef JNI_CAMERAANALYZER_EXPOSURECOMPENSATIONTEST_H
-#define JNI_CAMERAANALYZER_EXPOSURECOMPENSATIONTEST_H
-
-#include <jni.h>
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-JNIEXPORT jlong JNICALL
-Java_com_android_cts_verifier_camera_analyzer_ExposureCompensationTest_createExposureCompensationTest(
-        JNIEnv*      env,
-        jobject      thiz,
-        jint         debugHeight,
-        jint         debugWidth);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_ExposureCompensationTest_createExposureCompensationClass(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputImageAddress,
-        jlong        inputHandlerAddress,
-        jlong        checkerCenterAddress,
-        jlong        checkerRadiusAddress,
-        jfloat       exposureValue);
-
-
-JNIEXPORT jstring JNICALL
-Java_com_android_cts_verifier_camera_analyzer_ExposureCompensationTest_processExposureCompensationTest(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputHandlerAddress);
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_MeteringTest.cpp b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_MeteringTest.cpp
deleted file mode 100644
index faebe21..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_MeteringTest.cpp
+++ /dev/null
@@ -1,142 +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.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "MeteringJNI"
-#include <utils/Log.h>
-#include "com_android_cts_verifier_camera_analyzer_MeteringTest.h"
-
-#include <vector>
-#include <string>
-#include <string.h>
-#include <math.h>
-
-#include "testingimage.h"
-#include "meteringtest.h"
-#include "vec2.h"
-#include "android/bitmap.h"
-
-jlong Java_com_android_cts_verifier_camera_analyzer_MeteringTest_createMeteringTest(
-        JNIEnv*      env,
-        jobject      thiz) {
-
-    MeteringTest* testHandler = new MeteringTest();
-    long handlerAddress = (long)testHandler;
-    return handlerAddress;
-}
-
-void Java_com_android_cts_verifier_camera_analyzer_MeteringTest_createMeteringClass(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputImageAddress,
-        jlong        inputHandlerAddress,
-        jlong        checkercenterAddress,
-        jlong        checkerradiusAddress){
-
-    ALOGV("JNI createMeteringClass starts!");
-    long imageAddress = (long)inputImageAddress;
-    long handlerAddress = (long)inputHandlerAddress;
-
-    TestingImage *image = (TestingImage*) imageAddress;
-    MeteringTest *testHandler = (MeteringTest*) handlerAddress;
-
-    std::vector<std::vector< Vec2f > >* checkerCenter =
-            (std::vector<std::vector< Vec2f > >*) (long) checkercenterAddress;
-    std::vector<std::vector< float > >* checkerRadius =
-            (std::vector<std::vector< float > >*) (long) checkerradiusAddress;
-    ALOGV("Classes recovered");
-
-    testHandler->addDataToList(image->getColorChecker(3, 4, 0, 6,
-                                                      checkerCenter,
-                                                      checkerRadius));
-
-    delete image;
-}
-
-void Java_com_android_cts_verifier_camera_analyzer_MeteringTest_processMeteringTest(
-        JNIEnv*          env,
-        jobject          thiz,
-        jlong            inputHandlerAddress,
-        jbooleanArray    tempArray) {
-
-    ALOGV("Processing Auto Lock data!");
-
-    long handlerAddress = (long) inputHandlerAddress;
-    MeteringTest *testHandler = (MeteringTest*) handlerAddress;
-
-    testHandler->processData();
-
-    const std::vector<bool>* nativeComparisonResults =
-            testHandler->getComparisonResults();
-    jboolean jComparisonResults[nativeComparisonResults->size()];
-
-    for (int i = 0; i < nativeComparisonResults->size(); ++i) {
-        jComparisonResults[i] = (jboolean) (*nativeComparisonResults)[i];
-    }
-
-    env->SetBooleanArrayRegion(tempArray,
-                               0, nativeComparisonResults->size(),
-                               jComparisonResults);
-    testHandler->clearData();
-}
-
-// Find the gray checker borders from the native array of checker center and
-// radius. Convert the coordinate to the coordinates accepted by Android
-// Camera.Area type, which defines the top left corner to (-1000, -1000) and
-// bottom right corner to (1000, 1000).
-void Java_com_android_cts_verifier_camera_analyzer_MeteringTest_findGreyCoordinates(
-        JNIEnv*      env,
-        jobject      thiz,
-        jintArray    greyCoordinates,
-        jlong        checkercenterAddress,
-        jlong        checkerradiusAddress){
-
-    ALOGV("Start finding grey coordinates");
-
-    std::vector<std::vector< Vec2f > >* checkerCenter =
-            (std::vector<std::vector< Vec2f > >*) (long) checkercenterAddress;
-    std::vector<std::vector< float > >* checkerRadius =
-            (std::vector<std::vector< float > >*) (long) checkerradiusAddress;
-
-    ALOGV("Checker recovered!");
-    int nativeGreyCoordinates[24];
-
-    for (int i = 0; i < 6; ++i) {
-        float radius = sqrt((*checkerRadius)[3][i]);
-        nativeGreyCoordinates[i * 4] = static_cast<int>(
-                ((*checkerCenter)[3][i].y() - radius)
-                / 160.0 * 2000.0 - 1000.0);
-        nativeGreyCoordinates[i * 4 + 1] = static_cast<int>(
-                ((*checkerCenter)[3][i].x() - radius)
-                / 120.0 * 2000.0 - 1000.0);
-        nativeGreyCoordinates[i * 4 + 2] = static_cast<int>(
-                ((*checkerCenter)[3][i].y() + radius)
-                / 160.0 * 2000.0 - 1000.0);
-        nativeGreyCoordinates[i * 4 + 3] = static_cast<int>(
-                ((*checkerCenter)[3][i].x() + radius)
-                / 120.0 * 2000.0 - 1000.0);
-
-        ALOGV("checker is bounded by %f, %f, %f",
-             (*checkerCenter)[3][i].x(), (*checkerCenter)[3][i].y(), radius);
-
-        ALOGV("Square is bounded by %d, %d, %d, %d",
-             nativeGreyCoordinates[i * 4], nativeGreyCoordinates[i * 4 + 1],
-             nativeGreyCoordinates[i * 4 + 2],
-             nativeGreyCoordinates[i * 4 + 3]);
-    }
-
-    env->SetIntArrayRegion(greyCoordinates, 0, 24, nativeGreyCoordinates);
-}
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_MeteringTest.h b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_MeteringTest.h
deleted file mode 100644
index ecc1b96..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_MeteringTest.h
+++ /dev/null
@@ -1,60 +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.
- */
-
-#ifndef JNI_CAMERAANALYZER_METERINGTEST_H
-#define JNI_CAMERAANALYZER_METERINGTEST_H
-
-#include <jni.h>
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-JNIEXPORT jlong JNICALL
-Java_com_android_cts_verifier_camera_analyzer_MeteringTest_createMeteringTest(
-        JNIEnv*      env,
-        jobject      thiz);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_MeteringTest_createMeteringClass(
-        JNIEnv *env,
-        jobject thiz,
-        jlong inputAddress,
-        jlong handlerAddress,
-        jlong checkercenterAddress,
-        jlong checkerradiusAddress);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_MeteringTest_processMeteringTest(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        handlerAddress,
-        jbooleanArray    tempArray);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_MeteringTest_findGreyCoordinates(
-        JNIEnv*      env,
-        jobject      thiz,
-        jintArray    greyCoordinates,
-        jlong        checkercenterAddress,
-        jlong        checkerradiusAddress);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.cpp b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.cpp
deleted file mode 100644
index bce0fca..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.cpp
+++ /dev/null
@@ -1,90 +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.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "WhiteBalanceJNI"
-#include <utils/Log.h>
-#include "com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.h"
-
-#include <vector>
-#include <string>
-#include <string.h>
-
-#include "testingimage.h"
-#include "whitebalancetest.h"
-#include "vec2.h"
-#include "android/bitmap.h"
-
-jlong Java_com_android_cts_verifier_camera_analyzer_WhiteBalanceTest_createWhiteBalanceTest(
-        JNIEnv*      env,
-        jobject      thiz) {
-
-    WhiteBalanceTest* testHandler = new WhiteBalanceTest();
-    long handlerAddress = (long)testHandler;
-    return handlerAddress;
-}
-
-void Java_com_android_cts_verifier_camera_analyzer_WhiteBalanceTest_createWhiteBalanceClass(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        inputImageAddress,
-        jlong        inputHandlerAddress,
-        jlong        checkercenterAddress,
-        jlong        checkerradiusAddress,
-        jstring      whiteBalance){
-
-    ALOGV("JNI createWhiteBalanceClass starts!");
-    long imageAddress = (long)inputImageAddress;
-    long handlerAddress = (long)inputHandlerAddress;
-
-    TestingImage *image = (TestingImage*) imageAddress;
-    WhiteBalanceTest *testHandler = (WhiteBalanceTest*) handlerAddress;
-
-    std::vector<std::vector< Vec2f > >* checkerCenter =
-        (std::vector<std::vector< Vec2f > >*) (long) checkercenterAddress;
-    std::vector<std::vector< float > >* checkerRadius =
-        (std::vector<std::vector< float > >*) (long) checkerradiusAddress;
-    ALOGV("Classes recovered");
-
-    jboolean isCopy;
-    const char* stringWhiteBalance =
-            env->GetStringUTFChars(whiteBalance, &isCopy);
-    ALOGV("White Balance is %s", stringWhiteBalance);
-
-    // Adds the gray checker's RGB values to the test handler.
-    testHandler->addDataToList(stringWhiteBalance,
-                               image->getColorChecker(3, 4, 0, 6,
-                                                      checkerCenter,
-                                                      checkerRadius));
-
-    env->ReleaseStringUTFChars(whiteBalance, stringWhiteBalance);
-    delete image;
-}
-
-jint Java_com_android_cts_verifier_camera_analyzer_WhiteBalanceTest_processWhiteBalanceTest(
-    JNIEnv*      env,
-    jobject      thiz,
-    jlong        inputHandlerAddress) {
-  ALOGV("Processing white balance test");
-
-  long handlerAddress = (long) inputHandlerAddress;
-  WhiteBalanceTest *testHandler = (WhiteBalanceTest*) handlerAddress;
-
-  testHandler->processData();
-
-  ALOGV("CCT is %d", testHandler->getCorrelatedColorTemp());
-  return testHandler->getCorrelatedColorTemp();
-}
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.h b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.h
deleted file mode 100644
index 88cf52e..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.h
+++ /dev/null
@@ -1,53 +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.
- */
-
-#ifndef JNI_CAMERAANALYZER_WHITEBALANCETEST_H
-#define JNI_CAMERAANALYZER_WHITEBALANCETEST_H
-
-#include <jni.h>
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-JNIEXPORT jlong JNICALL
-Java_com_android_cts_verifier_camera_analyzer_WhiteBalanceTest_createWhiteBalanceTest(
-        JNIEnv*      env,
-        jobject      thiz);
-
-JNIEXPORT void JNICALL
-Java_com_android_cts_verifier_camera_analyzer_WhiteBalanceTest_createWhiteBalanceClass(
-        JNIEnv *env,
-        jobject thiz,
-        jlong inputAddress,
-        jlong handlerAddress,
-        jlong checkercenterAddress,
-        jlong checkerradiusAddress,
-        jstring whiteBalance);
-
-JNIEXPORT jint JNICALL
-Java_com_android_cts_verifier_camera_analyzer_WhiteBalanceTest_processWhiteBalanceTest(
-        JNIEnv*      env,
-        jobject      thiz,
-        jlong        handlerAddress);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/apps/CtsVerifier/lib/Android.mk b/apps/CtsVerifier/lib/Android.mk
deleted file mode 100644
index 56a3fa8..0000000
--- a/apps/CtsVerifier/lib/Android.mk
+++ /dev/null
@@ -1,17 +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.
-#
-
-include $(call all-subdir-makefiles)
diff --git a/apps/CtsVerifier/lib/colorchecker/Android.mk b/apps/CtsVerifier/lib/colorchecker/Android.mk
deleted file mode 100644
index 48f1356..0000000
--- a/apps/CtsVerifier/lib/colorchecker/Android.mk
+++ /dev/null
@@ -1,43 +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.
-#
-
-LOCAL_PATH := $(call my-dir)
-
-#####################
-# Build image analysis library
-
-include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE := libcolorchecker
-
-LOCAL_SRC_FILES += testingimage.cpp \
-                   vec3.cpp \
-                   vec2.cpp \
-                   imagetesthandler.cpp \
-                   colorcheckertest.cpp \
-                   exposurecompensationtest.cpp \
-                   autolocktest.cpp \
-                   meteringtest.cpp \
-                   whitebalancetest.cpp
-
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../include/colorchecker
-LOCAL_CXX_STL := libc++
-LOCAL_SHARED_LIBRARIES := \
-    libcutils \
-    libutils \
-
-include $(BUILD_STATIC_LIBRARY)
diff --git a/apps/CtsVerifier/lib/colorchecker/autolocktest.cpp b/apps/CtsVerifier/lib/colorchecker/autolocktest.cpp
deleted file mode 100644
index 6bfa922..0000000
--- a/apps/CtsVerifier/lib/colorchecker/autolocktest.cpp
+++ /dev/null
@@ -1,101 +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.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "AutoLockTest"
-#include <utils/Log.h>
-#include <utils/Timers.h>
-#include <cmath>
-#include <string>
-
-#include "vec2.h"
-#include "vec3.h"
-#include "autolocktest.h"
-
-const float kOverExposure = 230.f;
-const float kEqThreshold = 0.05f;
-// Processes the color checker values and compare the two values from
-// the same individual test.
-void AutoLockTest::processData() {
-    ALOGV("Start Processing Auto Lock Test Data!");
-
-    int numTests = mCheckerColors.size() / 2;
-    mNumPatches = 0;
-
-    if (numTests > 0) {
-        mNumPatches = mCheckerColors[0].size();
-    }
-
-    for (int i = 0; i < numTests; ++i) {
-        mComparisonResults.push_back(
-                IsBrighterThan((&mCheckerColors[i * 2]),
-                               (&mCheckerColors[i * 2 + 1])));
-        mComparisonResults.push_back(
-                IsEquivalentTo((&mCheckerColors[i * 2]),
-                               (&mCheckerColors[i * 2 + 1])));
-    }
-}
-
-// Compares whether one array of gray color patches is brighter than
-// another one.
-bool AutoLockTest::IsBrighterThan(
-        const std::vector<Vec3f>* colorCheckers1,
-        const std::vector<Vec3f>* colorCheckers2) const {
-    float meanRatio = 0.f;
-    int meanNumCount = 0;
-
-    for (int i = 0; i < mNumPatches; ++i) {
-        float luminance1 = (*colorCheckers1)[i].convertToLuminance();
-        float luminance2 = (*colorCheckers2)[i].convertToLuminance();
-
-        // Consider a 5% raise as a considerably large increase.
-        if ((luminance1 < kOverExposure) && (luminance2 != 0.f)) {
-            meanRatio += luminance1 / luminance2;
-            ++meanNumCount;
-        }
-    }
-    meanRatio = meanRatio / meanNumCount;
-
-    return (meanRatio > 1 + kEqThreshold);
-}
-
-// Compares whether one array of gray color patches is within a small range
-// of the other one to be considered equivalent.
-bool AutoLockTest::IsEquivalentTo(
-        const std::vector<Vec3f>* colorCheckers1,
-        const std::vector<Vec3f>* colorCheckers2) const {
-    float meanRatio = 0.f;
-    int meanNumCount = 0;
-
-    for (int i = 0; i < mNumPatches; ++i) {
-        float luminance1 = (*colorCheckers1)[i].convertToLuminance();
-        float luminance2 = (*colorCheckers2)[i].convertToLuminance();
-        ALOGV("Luma_1 and Luma_2 is %f, %f", luminance1, luminance2);
-
-        if ((luminance1 < kOverExposure) && (luminance2 < kOverExposure)) {
-              meanRatio += luminance2 / luminance1;
-              ++meanNumCount;
-        }
-    }
-    meanRatio = meanRatio / meanNumCount;
-
-    return ((meanRatio >= 1 - kEqThreshold) && (meanRatio <= 1 + kEqThreshold));
-}
-
-void AutoLockTest::clearData() {
-    mCheckerColors.clear();
-    mComparisonResults.clear();
-}
diff --git a/apps/CtsVerifier/lib/colorchecker/colorcheckertest.cpp b/apps/CtsVerifier/lib/colorchecker/colorcheckertest.cpp
deleted file mode 100644
index ef7d2c6..0000000
--- a/apps/CtsVerifier/lib/colorchecker/colorcheckertest.cpp
+++ /dev/null
@@ -1,979 +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.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "ColorCheckerTest"
-#include <utils/Log.h>
-#include <utils/Timers.h>
-#include <cmath>
-#include <string>
-
-#include "vec2.h"
-#include "vec3.h"
-#include "colorcheckertest.h"
-
-const float GAMMA_CORRECTION = 2.2f;
-const float COLOR_ERROR_THRESHOLD = 200.f;
-ColorCheckerTest::~ColorCheckerTest() {
-    ALOGV("Deleting color checker test handler");
-
-    if (mImage != NULL) {
-        delete mImage;
-    }
-    ALOGV("Image deleted");
-
-    int numHorizontalLines = mCandidateColors.size();
-    int numVerticalLines = mCandidateColors[0].size();
-
-    for (int i = 0; i < numHorizontalLines; ++i) {
-        for (int j = 0; j < numVerticalLines; ++j) {
-            if (mCandidateColors[i][j] != NULL) {
-                delete mCandidateColors[i][j];
-            }
-            if (mCandidatePositions[i][j] != NULL) {
-                delete mCandidatePositions[i][j];
-            }
-        }
-    }
-    ALOGV("Candidates deleted!");
-
-    for (int i = 0; i < 4; ++i) {
-        for (int j = 0; j < 6; ++j) {
-            if (mMatchPositions[i][j] != NULL) {
-                delete mMatchPositions[i][j];
-            }
-            if (mReferenceColors[i][j] != NULL) {
-                delete mReferenceColors[i][j];
-            }
-            if (mMatchColors[i][j] != NULL) {
-                delete mMatchColors[i][j];
-            }
-        }
-    }
-}
-
-// Adds a new image to the test handler.
-void ColorCheckerTest::addTestingImage(TestingImage* inputImage) {
-    if (mImage != NULL) {
-        delete mImage;
-    }
-    mImage = NULL;
-    ALOGV("Original image deleted");
-    mImage = inputImage;
-
-    if ((mImage->getHeight() == getDebugHeight()) &&
-        (mImage->getWidth() == getDebugWidth())) {
-        copyDebugImage(getDebugHeight(), getDebugWidth(), mImage->getImage());
-    }
-}
-
-void ColorCheckerTest::processData() {
-    mSuccess = false;
-    initializeRefColor();
-    edgeDetection();
-}
-
-void ColorCheckerTest::initializeRefColor() {
-    mReferenceColors.resize(4, std::vector<Vec3i*>(6, NULL));
-    mMatchPositions.resize(4, std::vector<Vec2f*>(6, NULL));
-    mMatchColors.resize(4, std::vector<Vec3f*>(6, NULL));
-    mMatchRadius.resize(4, std::vector<float>(6, 0.f));
-
-    mReferenceColors[0][0]= new Vec3i(115, 82, 68);
-    mReferenceColors[0][1]= new Vec3i(194, 150, 130);
-    mReferenceColors[0][2]= new Vec3i(98, 122, 157);
-    mReferenceColors[0][3]= new Vec3i(87, 108, 67);
-    mReferenceColors[0][4]= new Vec3i(133, 128, 177);
-    mReferenceColors[0][5]= new Vec3i(103, 189, 170);
-    mReferenceColors[1][0]= new Vec3i(214, 126, 44);
-    mReferenceColors[1][1]= new Vec3i(80, 91, 166);
-    mReferenceColors[1][2]= new Vec3i(193, 90, 99);
-    mReferenceColors[1][3]= new Vec3i(94,  60, 108);
-    mReferenceColors[1][4]= new Vec3i(157, 188, 64);
-    mReferenceColors[1][5]= new Vec3i(224, 163, 46);
-    mReferenceColors[2][0]= new Vec3i(56, 61, 150);
-    mReferenceColors[2][1]= new Vec3i(70, 148, 73);
-    mReferenceColors[2][2]= new Vec3i(175, 54, 60);
-    mReferenceColors[2][3]= new Vec3i(231, 199, 31);
-    mReferenceColors[2][4]= new Vec3i(187, 86, 149);
-    mReferenceColors[2][5]= new Vec3i(8, 133, 161);
-    mReferenceColors[3][0]= new Vec3i(243, 243, 242);
-    mReferenceColors[3][1]= new Vec3i(200, 200, 200);
-    mReferenceColors[3][2]= new Vec3i(160, 160, 160);
-    mReferenceColors[3][3]= new Vec3i(122, 122, 121);
-    mReferenceColors[3][4]= new Vec3i(85, 85, 85);
-    mReferenceColors[3][5]= new Vec3i(52, 52, 52);
-}
-
-void ColorCheckerTest::edgeDetection() {
-    int width = mImage->getWidth();
-    int height = mImage->getHeight();
-
-    bool* edgeMap = new bool[height * width];
-    unsigned char* grayImage = new unsigned char[height * width];
-
-    // If the image is a color image and can be converted to a luminance layer
-    if (mImage->rgbToGrayScale(grayImage)) {
-        float* gradientMap = new float[height * width * 2];
-
-        // Computes the gradient image on the luminance layer.
-        computeGradient(grayImage, gradientMap);
-
-        float* gradientMagnitude = new float[height * width];
-        int* gradientDirectionInt = new int[height * width];
-        float* gradientDirection = new float[height * width];
-
-        // Computes the absolute gradient of the image without padding.
-        for (int i = 1; i < height - 1; ++i) {
-            for (int j = 1; j < width - 1; ++j) {
-                gradientMagnitude[i * width + j] =
-                        sqrt(gradientMap[(i * width + j) * 2] *
-                             gradientMap[(i * width + j) * 2] +
-                             gradientMap[(i * width + j ) * 2 + 1] *
-                             gradientMap[(i * width + j ) * 2 + 1]);
-
-                // Computes the gradient direction of the image.
-                if (gradientMap[(i * width + j) * 2] == 0 ) {
-                    // If the vertical gradient is 0, the edge is horizontal
-                    // Mark the gradient direction as 90 degrees.
-                    gradientDirectionInt[i * width + j] = 2;
-                    gradientDirection[i * width + j] = 90.0f;
-                } else {
-                    // Otherwise the atan operation is valid and can decide
-                    // the gradient direction of the edge.
-                    float gradient = atan(gradientMap[(i * width + j) * 2 + 1]
-                            / gradientMap[(i * width + j) * 2])
-                            / (M_PI / 4);
-
-                    gradientDirection[i * width + j] = gradient * 45.0f;
-
-                    // Maps the gradient direction to 4 major directions with
-                    // 0 mapped to up and 2 mapped to right.
-                    if (gradient - floor(gradient) > 0.5) {
-                        gradientDirectionInt[i * width + j] =
-                                (static_cast<int>(ceil(gradient)) + 4) % 4;
-                    } else {
-                        gradientDirectionInt[i * width + j] =
-                                (static_cast<int>(floor(gradient)) + 4) % 4;
-                    }
-                }
-            }
-        }
-
-        // Compute a boolean map to show whether a pixel is on the edge.
-        for (int i = 1; i < height - 1; ++i) {
-            for (int j = 1; j < width - 1; ++j) {
-                edgeMap[i * width + j] = false;
-
-                switch (gradientDirectionInt[i * width + j]) {
-                    case 0:
-                        // If the gradient points rightwards, the pixel is
-                        // on an edge if it has a larger absolute gradient than
-                        // pixels on its left and right sides.
-                        if ((gradientMagnitude[i * width + j] >=
-                                gradientMagnitude[i * width + j + 1]) &&
-                            (gradientMagnitude[i * width + j] >=
-                                gradientMagnitude[i * width + j - 1])) {
-                            edgeMap[i * width + j] = true;
-                        }
-                        break;
-                    case 1:
-                        // If the gradient points right-downwards, the pixel is
-                        // on an edge if it has a larger absolute gradient than
-                        // pixels on its upper left and bottom right sides.
-                        if ((gradientMagnitude[i * width + j] >=
-                                gradientMagnitude[(i + 1) * width + j + 1]) &&
-                            (gradientMagnitude[i * width + j] >=
-                                gradientMagnitude[(i - 1) * width + j - 1])) {
-                            edgeMap[i * width + j] = true;
-                        }
-                        break;
-                    case 2:
-                        // If the gradient points upwards, the pixel is
-                        // on an edge if it has a larger absolute gradient than
-                        // pixels on its up and down sides.
-                        if ((gradientMagnitude[i * width + j] >=
-                                gradientMagnitude[(i + 1) * width + j]) &&
-                            (gradientMagnitude[i * width + j] >=
-                                gradientMagnitude[(i - 1) * width + j])) {
-                            edgeMap[i * width + j] = true;
-                        }
-                        break;
-                    case 3:
-                        // If the gradient points right-upwards, the pixel is
-                        // on an edge if it has a larger absolute gradient than
-                        // pixels on its bottom left and upper right sides.
-                        if ((gradientMagnitude[i * width + j] >=
-                                gradientMagnitude[(i - 1) * width + j + 1]) &&
-                            (gradientMagnitude[i * width + j] >=
-                                gradientMagnitude[(i + 1) * width + j - 1])) {
-                            edgeMap[i * width + j] = true;
-                        }
-                  }
-
-             }
-        }
-
-        houghLineDetection(edgeMap, gradientMagnitude, gradientDirection);
-
-        // Cleans up
-        delete[] gradientMap;
-        delete[] gradientDirectionInt;
-        delete[] gradientMagnitude;
-        delete[] gradientDirection;
-
-    } else {
-        ALOGE("Not a color image!");
-    }
-
-    delete[] edgeMap;
-    delete[] grayImage;
-}
-
-// Runs the hough voting algorithm to find the grid of the color checker
-// with the edge map, gradient direction and gradient magnitude as inputs.
-void ColorCheckerTest::houghLineDetection(bool* edgeMap,
-                                          float* gradientMagnitude,
-                                          float* gradientDirection) {
-    // Constructs a graph for Hough voting. The vertical axis counts the vote
-    // for a certain angle. The horizontal axis counts the vote for the distance
-    // of a line from the origin of the image.
-    int houghHeight = 180;
-    int houghWidth = 200;
-    int houghCounts[houghHeight][houghWidth];
-    int houghSum[houghHeight][houghWidth];
-
-    int** houghVote;
-    houghVote = new int*[180];
-    for (int i = 0; i < 180; ++i) {
-        houghVote[i] = new int[200];
-    }
-
-    for (int i = 0; i < houghHeight; ++i) {
-        for (int j = 0; j < houghWidth; ++j) {
-            houghCounts[i][j] = 0;
-            houghVote[i][j] = 0;
-            houghSum[i][j] = 0;
-        }
-    }
-
-    // Vectors to record lines in two orthogonal directions.
-    // Each line is represented by its direction and its distance to the origin.
-    std::vector<std::vector<int> > verticalLines;
-    std::vector<std::vector<int> > horizontalLines;
-    float radius;
-    int height = mImage->getHeight();
-    int width = mImage->getWidth();
-
-    // Processes the signicant edge pixels and cast vote for the corresponding
-    // edge passing this pixel.
-    for (int i = 1; i < height - 1; ++i) {
-        for (int j = 1; j < width - 1; ++j) {
-            // Sets threashold for the gradient magnitude to discount noises
-            if (edgeMap[i * width + j] &&
-                (gradientMagnitude[i * width + j] > 15)) {
-                int shiftedAngle;
-
-                // Shifts angles for 45 degrees so the vertical and horizontal
-                // direction is mapped to 45 and 135 degrees to avoid padding.
-                // This uses the assumption that the color checker is placed
-                // roughly parallel to the image boarders. So that the edges
-                // at the angle of 45 will be rare.
-                shiftedAngle = (static_cast<int>(
-                        -gradientDirection[i * width + j]) + 225 % 180);
-                float shiftedAngleRad = static_cast<float>(shiftedAngle)
-                        * M_PI / 180.0f;
-
-                // Computes the distance of the line from the origin.
-                float a, b;
-                a = static_cast<float>(i - j) / sqrt(2.0f);
-                b = static_cast<float>(i + j) / sqrt(2.0f);
-                radius = a * sin(shiftedAngleRad) - b * cos(shiftedAngleRad);
-
-                // Adds one vote for the line. The line's angle is shifted by
-                // 45 degrees to avoid avoid padding for the vertical lines,
-                // which is more common than diagonal lines. The line's
-                // distance is mapped to [0, 200] from [-200, 200].
-                ++houghCounts[shiftedAngle][static_cast<int>((radius / 2.0f) +
-                                                              100.0f)];
-
-                drawPoint(i, j, Vec3i(255, 255, 255));
-            }
-        }
-    }
-
-    int houghAngleSum[houghHeight];
-    int primaryVerticalAngle, primaryHorizontalAngle;
-    int max1 = 0;
-    int max2 = 0;
-
-    // Looking for the two primary angles of the lines.
-    for (int i = 5; i < houghHeight - 5; ++i) {
-        houghAngleSum[i] = 0;
-        for (int j = 0; j < houghWidth; ++j) {
-            for (int l = -5; l <= 5; ++l) {
-                houghSum[i][j] += houghCounts[i + l][j];
-            }
-            houghAngleSum[i] += houghSum[i][j];
-        }
-
-        if ((i < houghHeight / 2) && (houghAngleSum[i] > max1)) {
-            max1 = houghAngleSum[i];
-            primaryVerticalAngle = i;
-        } else if ((i > houghHeight / 2) && (houghAngleSum[i] > max2)) {
-            max2 = houghAngleSum[i];
-            primaryHorizontalAngle = i;
-        }
-    }
-
-    ALOGV("Primary angles are %d, %d",
-         primaryVerticalAngle, primaryHorizontalAngle);
-
-    int angle;
-
-    // For each primary angle, look for the highest voted lines.
-    for (int k = 0; k < 2; ++k) {
-        if (k == 0) {
-            angle = primaryVerticalAngle;
-        } else {
-            angle = primaryHorizontalAngle;
-        }
-
-        std::vector<int> line(2);
-        for (int j = 2; j < houghWidth - 2; ++j) {
-            houghVote[angle][j] = houghSum[angle][j];
-            houghSum[angle][j] = 0;
-        }
-
-        // For each radius, average the vote with nearby ones.
-        for (int j = 2; j < houghWidth - 2; ++j) {
-            for (int m = -2; m <= 2; ++m) {
-                houghSum[angle][j] += houghVote[angle][j + m];
-            }
-        }
-
-        bool isCandidate[houghWidth];
-
-        // Find whether a lines is a candidate by rejecting the ones that have
-        // lower vote than others in the neighborhood.
-        for (int j = 2; j < houghWidth - 2; ++j) {
-            isCandidate[j] = true;
-            for (int m = -2; ((isCandidate[j]) && (m <= 2)); ++m) {
-                if ((houghSum[angle][j] < 20) ||
-                    (houghSum[angle][j] < houghSum[angle][j + m])) {
-                    isCandidate[j] = false;
-                }
-            }
-        }
-
-        int iter1 = 0;
-        int iter2 = 0;
-        int count = 0;
-
-        // Finds the lines that are not too close to each other and add to the
-        // detected lines.
-        while (iter2 < houghWidth) {
-            while ((!isCandidate[iter2]) && (iter2 < houghWidth)) {
-                ++iter2;
-            }
-            if ((isCandidate[iter2]) && (iter2 - iter1 < 5)) {
-                iter1 = (iter2 + iter1) / 2;
-                ++iter2;
-            } else {
-                line[0] = angle;
-                line[1] = (iter1 - 100) * 2;
-                if (iter1 != 0) {
-                    if (k == 0) {
-                        verticalLines.push_back(line);
-                        Vec3i color(verticalLines.size() * 20, 0, 0);
-                        drawLine(line[0], line[1], color);
-                    } else {
-                        horizontalLines.push_back(line);
-                        Vec3i color(0, horizontalLines.size() * 20, 0);
-                        drawLine(line[0], line[1], color);
-                    }
-                }
-                iter1 = iter2;
-                ++iter2;
-                ALOGV("pushing back line %d %d", line[0], line[1]);
-            }
-        }
-    }
-
-    ALOGV("Numbers of lines in each direction is %d, %d",
-         verticalLines.size(), horizontalLines.size());
-
-    for (int i = 0; i < 180; ++i) {
-        delete[] houghVote[i];
-    }
-    delete[] houghVote;
-
-    findCheckerBoards(verticalLines, horizontalLines);
-}
-
-// Computes the gradient in both x and y direction of a layer
-void ColorCheckerTest::computeGradient(unsigned char* layer,
-                                       float* gradientMap) {
-    int width = mImage->getWidth();
-    int height = mImage->getHeight();
-
-    // Computes the gradient in the whole image except the image boarders.
-    for (int i = 1; i < height - 1; ++i) {
-        for (int j = 1; j < width - 1; ++j) {
-            gradientMap[(i * width + j) * 2] =
-                    0.5f * (layer[i * width + j + 1] -
-                            layer[i * width + j - 1]);
-            gradientMap[(i * width + j) * 2 + 1] =
-                    0.5f * (layer[(i + 1) * width + j] -
-                           layer[(i - 1) * width + j]);
-        }
-    }
-}
-
-// Tries to find the checker boards with the highest voted lines
-void ColorCheckerTest::findCheckerBoards(
-        std::vector<std::vector<int> > verticalLines,
-        std::vector<std::vector<int> > horizontalLines) {
-    ALOGV("Start looking for Color checker");
-
-    int numHorizontalLines = mCandidateColors.size();
-    int numVerticalLines;
-    if (numHorizontalLines > 0) {
-        numVerticalLines = mCandidateColors[0].size();
-        for (int i = 0; i < numHorizontalLines; ++i) {
-            for (int j = 0; j < numVerticalLines; ++j) {
-                if (mCandidateColors[i][j] != NULL) {
-                    delete mCandidateColors[i][j];
-                }
-                if (mCandidatePositions[i][j] != NULL) {
-                    delete mCandidatePositions[i][j];
-                }
-            }
-            mCandidateColors[i].clear();
-            mCandidatePositions[i].clear();
-        }
-    }
-    mCandidateColors.clear();
-    mCandidatePositions.clear();
-
-    ALOGV("Candidates deleted!");
-
-    numVerticalLines = verticalLines.size();
-    numHorizontalLines = horizontalLines.size();
-    Vec2f pointUpperLeft;
-    Vec2f pointBottomRight;
-
-    mCandidateColors.resize(numHorizontalLines - 1);
-    mCandidatePositions.resize(numHorizontalLines - 1);
-
-    for (int i = numVerticalLines - 1; i >= 1; --i) {
-        for (int j = 0; j < numHorizontalLines - 1; ++j) {
-            // Finds the upper left and bottom right corner of each rectangle
-            // formed by two neighboring highest voted lines.
-            pointUpperLeft = findCrossing(verticalLines[i], horizontalLines[j]);
-            pointBottomRight = findCrossing(verticalLines[i - 1],
-                                            horizontalLines[j + 1]);
-
-            Vec3i* color = new Vec3i();
-            Vec2f* pointCenter = new Vec2f();
-            // Verifies if they are separated by a reasonable distance.
-            if (verifyPointPair(pointUpperLeft, pointBottomRight,
-                                pointCenter, color)) {
-                mCandidatePositions[j].push_back(pointCenter);
-                mCandidateColors[j].push_back(color);
-                ALOGV("Color at (%d, %d) is (%d, %d, %d)", j, i,color->r(), color->g(), color->b());
-
-            } else {
-                mCandidatePositions[j].push_back(NULL);
-                mCandidateColors[j].push_back(NULL);
-                delete color;
-                delete pointCenter;
-            }
-        }
-    }
-
-    ALOGV("Candidates Number (%d, %d)", mCandidateColors.size(), mCandidateColors[0].size());
-    // Verifies whether the current line candidates form a valid color checker.
-    verifyColorGrid();
-}
-
-// Returns the corssing point of two lines given the lines.
-Vec2f ColorCheckerTest::findCrossing(std::vector<int> line1,
-                                     std::vector<int> line2) {
-    Vec2f crossingPoint;
-    float r1 = static_cast<float>(line1[1]);
-    float r2 = static_cast<float>(line2[1]);
-    float ang1, ang2;
-    float y1, y2;
-
-    ang1 = static_cast<float>(line1[0]) / 180.0f * M_PI;
-    ang2 = static_cast<float>(line2[0]) / 180.0f * M_PI;
-
-    float x, y;
-    x = (r1 * cos(ang2) - r2 * cos(ang1)) / sin(ang1 - ang2);
-    y = (r1 * sin(ang2) - r2 * sin(ang1)) / sin(ang1 - ang2);
-
-    crossingPoint.set((x + y) / sqrt(2.0), (y - x) / sqrt(2.0));
-
-    //ALOGV("Crosspoint at (%f, %f)", crossingPoint.x(), crossingPoint.y());
-    return crossingPoint;
-}
-
-// Verifies whether two opposite corners on a quadrilateral actually can be
-// the two corners of a color checker.
-bool ColorCheckerTest::verifyPointPair(Vec2f pointUpperLeft,
-                                       Vec2f pointBottomRight,
-                                       Vec2f* pointCenter,
-                                       Vec3i* color) {
-    bool success = true;
-
-    /** 5 and 30 are the threshold tuned for resolution 640*480*/
-    if ((pointUpperLeft.x() < 0) ||
-        (pointUpperLeft.x() >= mImage->getHeight()) ||
-        (pointUpperLeft.y() < 0) ||
-        (pointUpperLeft.y() >= mImage->getWidth()) ||
-        (pointBottomRight.x() < 0) ||
-        (pointBottomRight.x() >= mImage->getHeight()) ||
-        (pointBottomRight.y() < 0) ||
-        (pointBottomRight.y() >= mImage->getWidth()) ||
-        (std::abs(pointUpperLeft.x() - pointBottomRight.x()) <= 5) ||
-        (std::abs(pointUpperLeft.y() - pointBottomRight.y()) <= 5) ||
-        (std::abs(pointUpperLeft.x() - pointBottomRight.x()) >= 30) ||
-        (std::abs(pointUpperLeft.y() - pointBottomRight.y()) >= 30)) {
-
-        // If any of the quadrilateral corners are out of the image or if
-        // the distance between them are too large or too big, the quadrilateral
-        // could not be one of the checkers
-        success = false;
-    } else {
-        // Find the checker center if the corners of the rectangle meet criteria
-        pointCenter->set((pointUpperLeft.x() + pointBottomRight.x()) / 2.0f,
-                       (pointUpperLeft.y() + pointBottomRight.y()) / 2.0f);
-        color->set(mImage->getPixelValue(*pointCenter).r(),
-                   mImage->getPixelValue(*pointCenter).g(),
-                   mImage->getPixelValue(*pointCenter).b());
-        ALOGV("Color at (%f, %f) is (%d, %d, %d)", pointCenter->x(), pointCenter->y(),color->r(), color->g(), color->b());
-    }
-    return success;
-}
-
-// Verifies the color checker centers and finds the match between the detected
-// color checker and the reference MacBeth color checker
-void ColorCheckerTest::verifyColorGrid() {
-    ALOGV("Start looking for Color Grid");
-    int numHorizontalLines = mCandidateColors.size();
-    int numVerticalLines = mCandidateColors[0].size();
-    bool success = false;
-
-    // Computes the standard deviation of one row/column of the proposed color
-    // checker. Discards the row/column if the std is below a threshold.
-    for (int i = 0; i < numHorizontalLines; ++i) {
-        Vec3f meanColor(0.f, 0.f, 0.f);
-        int numNonZero = 0;
-
-        for (int j = 0; j < numVerticalLines; ++j) {
-            if (mCandidateColors[i][j] != NULL) {
-                ALOGV("candidate color (%d, %d) is (%d, %d, %d)", i, j, mCandidateColors[i][j]->r(), mCandidateColors[i][j]->g(), mCandidateColors[i][j]->b());
-
-                meanColor = meanColor + (*mCandidateColors[i][j]);
-                ++numNonZero;
-            }
-        }
-        if (numNonZero > 0) {
-            meanColor = meanColor / numNonZero;
-        }
-        ALOGV("Mean color for vertical direction computed!");
-
-        float std = 0;
-        for (int j = 0; j < numVerticalLines; ++j) {
-            if (mCandidateColors[i][j] != NULL) {
-                std += mCandidateColors[i][j]->squareDistance<float>(meanColor);
-            }
-        }
-        if (numNonZero > 0) {
-            std = sqrt(std / (3 * numNonZero));
-        }
-        ALOGV("st. deviation for the %d dir1 is %d", i, static_cast<int>(std));
-
-        if ((std <= 30) && (numNonZero > 1)) {
-            for (int j = 0; j < numVerticalLines; ++j) {
-                if (mCandidateColors[i][j] != NULL) {
-                    delete mCandidateColors[i][j];
-                    mCandidateColors[i][j] = NULL;
-                }
-            }
-        }
-    }
-
-    // Discards the column/row of the color checker if the std is below a
-    // threshold.
-    for (int j = 0; j < numVerticalLines; ++j) {
-        Vec3f meanColor(0.f, 0.f, 0.f);
-        int numNonZero = 0;
-
-        for (int i = 0; i < numHorizontalLines; ++i) {
-            if (mCandidateColors[i][j] != NULL) {
-                meanColor = meanColor + (*mCandidateColors[i][j]);
-                ++numNonZero;
-            }
-        }
-        if (numNonZero > 0) {
-            meanColor = meanColor / numNonZero;
-        }
-
-        float std = 0;
-        for (int i = 0; i < numHorizontalLines; ++i) {
-            if (mCandidateColors[i][j] != NULL) {
-                std += mCandidateColors[i][j]->squareDistance<float>(meanColor);
-            }
-        }
-        if (numNonZero > 0) {
-            std = sqrt(std / (3 * numNonZero));
-        }
-
-        ALOGV("st. deviation for the %d dir2 is %d", j, static_cast<int>(std));
-
-        if ((std <= 30) && (numNonZero > 1)) {
-            for (int i = 0; i < numHorizontalLines; ++i) {
-                if (mCandidateColors[i][j] != NULL) {
-                    delete mCandidateColors[i][j];
-                    mCandidateColors[i][j] = NULL;
-                }
-            }
-        }
-    }
-
-    for (int i = 0; i < numHorizontalLines; ++i) {
-        for (int j = 0; j < numVerticalLines; ++j) {
-            if (mCandidateColors[i][j] != NULL) {
-                ALOGV("position (%d, %d) is at (%f, %f) with color (%d, %d, %d)",
-                     i, j,
-                     mCandidatePositions[i][j]->x(),
-                     mCandidatePositions[i][j]->y(),
-                     mCandidateColors[i][j]->r(),
-                     mCandidateColors[i][j]->g(),
-                     mCandidateColors[i][j]->b());
-            } else {
-                ALOGV("position (%d, %d) is 0", i, j);
-            }
-        }
-    }
-
-    // Finds the match between the detected color checker and the reference
-    // MacBeth color checker.
-    int rowStart = 0;
-    int rowEnd = 0;
-
-    // Loops until all dectected color checker has been processed.
-    while (!success) {
-        int columnStart = 0;
-        int columnEnd = 0;
-        bool isRowStart = false;
-        bool isRowEnd = true;
-
-        // Finds the row start of the next block of detected color checkers.
-        while ((!isRowStart) && (rowStart <  numHorizontalLines)) {
-            for (int j = 0; j < numVerticalLines; ++j) {
-                if (mCandidateColors[rowStart][j] != NULL) {
-                    isRowStart = true;
-                }
-            }
-            ++rowStart;
-        }
-        rowStart--;
-        rowEnd = rowStart;
-        ALOGV("rowStart is %d", rowStart);
-
-        // Finds the row end of the next block of detected color checkers.
-        while ((isRowEnd) && (rowEnd < numHorizontalLines)) {
-            isRowEnd = false;
-            for (int j = 0; j < numVerticalLines; ++j) {
-                if (mCandidateColors[rowEnd][j] != NULL) {
-                    isRowEnd= true;
-                }
-            }
-            if (isRowEnd) {
-                ++rowEnd;
-            }
-        }
-        if ((!isRowEnd) && isRowStart) {
-            rowEnd--;
-        }
-        if ((isRowEnd) && (rowEnd == numHorizontalLines)) {
-            rowEnd--;
-            isRowEnd = false;
-        }
-        ALOGV("rowEnd is %d", rowEnd);
-
-        // Matches color checkers between the start row and the end row.
-        bool successVertical = false;
-
-        while (!successVertical) {
-            bool isColumnEnd = true;
-            bool isColumnStart = false;
-
-            // Finds the start column of the next block of color checker
-            while ((!isColumnStart) && (columnStart < numVerticalLines)) {
-                if (mCandidateColors[rowStart][columnStart] != NULL) {
-                    isColumnStart = true;
-                }
-                ++columnStart;
-            }
-            columnStart--;
-            columnEnd = columnStart;
-
-            // Finds the end column of the next block of color checker
-            while ((isColumnEnd) && (columnEnd < numVerticalLines)) {
-                isColumnEnd = false;
-                if (mCandidateColors[rowStart][columnEnd] != NULL)
-                    isColumnEnd = true;
-                if (isColumnEnd) {
-                    ++columnEnd;
-                }
-            }
-
-            if ((!isColumnEnd) && isColumnStart) {
-                columnEnd--;
-            }
-            if ((isColumnEnd) && (columnEnd == numVerticalLines)) {
-                columnEnd--;
-                isColumnEnd = false;
-            }
-
-            // Finds the best match on the MacBeth reference color checker for
-            // the continuous block of detected color checker
-            if (isRowStart && (!isRowEnd) &&
-                isColumnStart && (!isColumnEnd)) {
-                findBestMatch(rowStart, rowEnd, columnStart, columnEnd);
-            }
-            ALOGV("FindBestMatch for %d, %d, %d, %d", rowStart,
-                 rowEnd, columnStart, columnEnd);
-
-            // If the column search finishes, go out of the loop
-            if (columnEnd >= numVerticalLines - 1) {
-                successVertical = true;
-            } else {
-                columnStart = columnEnd + 1;
-            }
-        }
-        ALOGV("Continuing to search for direction 1");
-
-        // If the row search finishes, go out of the loop
-        if (rowEnd >= numHorizontalLines - 1) {
-            success = true;
-        } else {
-            rowStart = rowEnd + 1;
-        }
-    }
-
-    for (int i = 0; i < 4; ++i) {
-        for (int j = 0; j < 6; ++j) {
-            if (mMatchPositions[i][j] != NULL) {
-                ALOGV("Reference Match position for (%d, %d) is (%f, %f)", i, j,
-                     mMatchPositions[i][j]->x(), mMatchPositions[i][j]->y());
-            }
-        }
-    }
-
-    fillRefColorGrid();
-}
-
-// Finds the best match on the MacBeth color checker for the continuous block of
-// detected color checkers bounded by row i1, row i2 and column j1 and column j2
-// Assumes that the subsample is less than 4*6.
-void ColorCheckerTest::findBestMatch(int i1, int i2, int j1, int j2) {
-    int numHorizontalGrid = i2 - i1 + 1;
-    int numVerticalGrid = j2 - j1 + 1;
-
-    if (((numHorizontalGrid > 1) || (numVerticalGrid > 1)) &&
-        (numHorizontalGrid <= 4) && (numVerticalGrid <= 6)) {
-        ALOGV("i1, j2, j1, j2 is %d, %d, %d, %d", i1, i2, j1, j2);
-        float minError;
-        float error = 0.f;
-        int horizontalMatch, verticalMatch;
-
-        // Finds the match start point where the error is minimized.
-        for (int i = 0; i < numHorizontalGrid; ++i) {
-            for (int j = 0; j < numVerticalGrid; ++j) {
-                if (mCandidateColors[i1 + i][j1 + j] != NULL) {
-                    error += mCandidateColors[i1 + i][j1 + j]->squareDistance<int>(
-                            *mReferenceColors[i][j]);
-                }
-            }
-        }
-        ALOGV("Error is %f", error);
-        minError = error;
-        horizontalMatch = 0;
-        verticalMatch = 0;
-
-        for (int i = 0; i <= 4 - numHorizontalGrid; ++i) {
-            for (int j = 0; j <= 6 - numVerticalGrid; ++j) {
-                error = 0.f;
-
-                for (int id = 0; id < numHorizontalGrid; ++id) {
-                    for (int jd = 0; jd < numVerticalGrid; ++jd) {
-                        if (mCandidateColors[i1 + id][j1 + jd] != NULL) {
-                            error += mCandidateColors[i1 + id][j1 + jd]->
-                                    squareDistance<int>(
-                                            *mReferenceColors[i + id][j + jd]);
-                        }
-                    }
-                }
-
-                if (error < minError) {
-                    minError = error;
-                    horizontalMatch = i;
-                    verticalMatch = j;
-                }
-                ALOGV("Processed %d, %d and error is %f", i, j, error );
-            }
-        }
-
-        for (int id = 0; id < numHorizontalGrid; ++id) {
-            for (int jd = 0; jd < numVerticalGrid; ++jd) {
-                if (mCandidatePositions[i1 + id][j1 + jd] != NULL) {
-                    mMatchPositions[horizontalMatch + id][verticalMatch + jd] =
-                            new Vec2f(mCandidatePositions[i1 + id][j1 + jd]->x(),
-                                      mCandidatePositions[i1 + id][j1 + jd]->y());
-                }
-            }
-        }
-        ALOGV("Grid match starts at %d, %d", horizontalMatch, verticalMatch);
-    }
-}
-
-// Finds the boundary of a color checker by its color similarity to the center.
-// Also predicts the location of unmatched checkers.
-void ColorCheckerTest::fillRefColorGrid() {
-    int rowStart = 0;
-    int columnStart = 0;
-    bool foundStart = true;
-
-    for (int i = 0; (i < 4) && foundStart; ++i) {
-        for (int j = 0; (j < 6) && foundStart; ++j) {
-            if (mMatchPositions[i][j] != NULL) {
-                rowStart = i;
-                columnStart = j;
-                foundStart = false;
-            }
-        }
-    }
-    ALOGV("First match found at (%d, %d)", rowStart, columnStart);
-
-    float rowDistance, columnDistance;
-    rowDistance = 0;
-    columnDistance = 0;
-    int numRowGrids = 0;
-    int numColumnGrids = 0;
-
-    for (int i = rowStart; i < 4; ++i) {
-        for (int j = columnStart; j < 6; ++j) {
-            if (mMatchPositions[i][j] != NULL) {
-                if (i > rowStart) {
-                    ++numRowGrids;
-                    rowDistance += (mMatchPositions[i][j]->x() -
-                                mMatchPositions[rowStart][columnStart]->x()) /
-                                static_cast<float>(i - rowStart);
-                }
-                if (j > columnStart) {
-                    ++numColumnGrids;
-                    columnDistance += (mMatchPositions[i][j]->y() -
-                                mMatchPositions[rowStart][columnStart]->y()) /
-                                static_cast<float>(j - columnStart);
-                }
-            }
-        }
-    }
-
-    if ((numRowGrids > 0) && (numColumnGrids > 0)) {
-        rowDistance = rowDistance / numRowGrids;
-        columnDistance = columnDistance / numColumnGrids;
-        ALOGV("delta is %f, %f", rowDistance, columnDistance);
-
-        for (int i = 0; i < 4; ++i) {
-            for (int j = 0 ; j < 6; ++j) {
-                if (mMatchPositions[i][j] == NULL) {
-                    mMatchPositions[i][j] = new Vec2f(
-                            mMatchPositions[rowStart][columnStart]->x() +
-                                    (i - rowStart) * rowDistance,
-                            mMatchPositions[rowStart][columnStart]->y() +
-                                    (j - columnStart) * columnDistance);
-                }
-            }
-        }
-        for (int i = 0; i < 4; ++i) {
-            for (int j = 0; j < 6; ++j) {
-                float radius = 0;
-                Vec3i color = mImage->getPixelValue(*mMatchPositions[i][j]);
-                Vec3f meanColor(0.f , 0.f, 0.f);
-
-                int numPixels = 0;
-                for (int ii  = static_cast<int>(mMatchPositions[i][j]->x() -
-                                                rowDistance/2);
-                     ii <= static_cast<int>(mMatchPositions[i][j]->x() +
-                                            rowDistance/2);
-                     ++ii) {
-                    for (int jj = static_cast<int>(mMatchPositions[i][j]->y() -
-                                                   columnDistance/2);
-                         jj <= static_cast<int>(mMatchPositions[i][j]->y() +
-                                                columnDistance/2);
-                         ++jj) {
-                        if ((ii >= 0) && (ii < mImage->getHeight()) &&
-                            (jj >= 0) && (jj < mImage->getWidth())) {
-                            Vec3i pixelColor = mImage->getPixelValue(ii,jj);
-                            float error = color.squareDistance<int>(pixelColor);
-
-                            if (error < COLOR_ERROR_THRESHOLD) {
-                                drawPoint(ii, jj, *mReferenceColors[i][j]);
-                                meanColor = meanColor + pixelColor;
-                                numPixels++;
-                                Vec2i pixelPosition(ii, jj);
-
-                                if (pixelPosition.squareDistance<float>(
-                                        *mMatchPositions[i][j]) > radius) {
-                                    radius = pixelPosition.squareDistance<float>(
-                                            *mMatchPositions[i][j]);
-                                }
-                            }
-                        }
-                    }
-                }
-
-                /** Computes the radius of the checker.
-                 * The above computed radius is the squared distance to the
-                 * furthest point with a matching color. To be conservative, we
-                 * only consider an area with radius half of the above computed
-                 * value. Since radius is computed as a squared root, the one
-                 * that will be recorded is 1/4 of the above computed value.
-                 */
-                mMatchRadius[i][j] = radius / 4.f;
-                mMatchColors[i][j] = new Vec3f(meanColor / numPixels);
-
-                ALOGV("Reference color at (%d, %d) is (%d, %d, %d)", i, j,
-                     mReferenceColors[i][j]->r(),
-                     mReferenceColors[i][j]->g(),
-                     mReferenceColors[i][j]->b());
-                ALOGV("Average color at (%d, %d) is (%f, %f, %f)", i, j,
-                     mMatchColors[i][j]->r(),
-                     mMatchColors[i][j]->g(),
-                     mMatchColors[i][j]->b());
-                ALOGV("Radius is %f", mMatchRadius[i][j]);
-            }
-        }
-
-        mSuccess = true;
-    }
-}
diff --git a/apps/CtsVerifier/lib/colorchecker/exposurecompensationtest.cpp b/apps/CtsVerifier/lib/colorchecker/exposurecompensationtest.cpp
deleted file mode 100644
index da9fc40..0000000
--- a/apps/CtsVerifier/lib/colorchecker/exposurecompensationtest.cpp
+++ /dev/null
@@ -1,96 +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.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "ExposureCompensationTest"
-#include <utils/Log.h>
-#include <utils/Timers.h>
-#include <cmath>
-#include <string>
-#include <stdio.h>
-
-#include "vec2.h"
-#include "vec3.h"
-#include "exposurecompensationtest.h"
-
-const float GAMMA_CORRECTION = 2.2f;
-void ExposureCompensationTest::processData() {
-    ALOGV("Start Processing Exposure Compensation Test Data!");
-    clearDebugImage();
-
-    if (mDebugText != NULL) {
-        delete mDebugText;
-        mDebugText = NULL;
-    }
-
-    int numTests = mExposureValues.size();
-    int numPatches = mCheckerColors[0].size();
-    ALOGV("Processing %d tests with %d patches", numTests, numPatches);
-
-    mDebugText = new char[320 * numTests];
-    mDebugText[0] = 0;
-    char* debugText = new char[50];
-
-    Vec3i red(255, 0, 0);
-    Vec3i green(0, 255, 0);
-    Vec3i blue(0, 0, 255);
-
-    float minExposure = -3.0f;
-    float scale = 9.0f;
-    for (int i = 0; i < numTests; ++i) {
-        snprintf(debugText, 50, "Exposure is %f \n", mExposureValues[i]);
-        strcat(mDebugText, debugText);
-        for (int j = 0; j < numPatches; ++j) {
-            int exposureRed = static_cast<int>((
-                log(static_cast<float>(mReferenceColors[j].r()))
-                / log(2.0f) * GAMMA_CORRECTION +
-                mExposureValues[i] - minExposure) * scale);
-            int exposureGreen = static_cast<int>((
-                log(static_cast<float>(mReferenceColors[j].g()))
-                / log(2.0f) * GAMMA_CORRECTION +
-                mExposureValues[i] - minExposure) * scale);
-            int exposureBlue = static_cast<int>((
-                log(static_cast<float>(mReferenceColors[j].b()))
-                / log(2.0f) * GAMMA_CORRECTION +
-                mExposureValues[i] - minExposure) * scale);
-
-            snprintf(debugText, 50, "%d %f %d %f %d %f \n",
-                    exposureRed, mCheckerColors[i][j].r(),
-                    exposureGreen, mCheckerColors[i][j].g(),
-                    exposureBlue, mCheckerColors[i][j].b());
-
-            ALOGV("%s", debugText);
-            strcat(mDebugText, debugText);
-
-            drawPoint(200 - exposureRed, mCheckerColors[i][j].r(), red);
-            drawPoint(200 - exposureGreen, mCheckerColors[i][j].g(), green);
-            drawPoint(200 - exposureBlue, mCheckerColors[i][j].b(), blue);
-        }
-    }
-    mExposureValues.clear();
-    mCheckerColors.clear();
-}
-
-void ExposureCompensationTest::initializeReferenceColors() {
-    mReferenceColors.resize(6);
-
-    mReferenceColors[0].set(243, 243, 242);
-    mReferenceColors[1].set(200, 200, 200);
-    mReferenceColors[2].set(160, 160, 160);
-    mReferenceColors[3].set(122, 122, 121);
-    mReferenceColors[4].set(85, 85, 85);
-    mReferenceColors[5].set(52, 52, 52);
-}
diff --git a/apps/CtsVerifier/lib/colorchecker/imagetesthandler.cpp b/apps/CtsVerifier/lib/colorchecker/imagetesthandler.cpp
deleted file mode 100644
index cc3bca9..0000000
--- a/apps/CtsVerifier/lib/colorchecker/imagetesthandler.cpp
+++ /dev/null
@@ -1,102 +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.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "ImageTestHandler"
-#include <utils/Log.h>
-#include <utils/Timers.h>
-#include <cmath>
-#include <cstring>
-
-#include "vec2.h"
-#include "vec3.h"
-#include "imagetesthandler.h"
-
-void ImageTestHandler::initDebugImage() {
-    mDebugOutput = NULL;
-}
-
-// Initializes the  debug image with a given height and width.
-void ImageTestHandler::initDebugImage(int debugHeight,
-                                      int debugWidth) {
-    mDebugOutput = NULL;
-    mDebugOutput = new unsigned char[debugHeight * debugWidth * 4];
-    memset(mDebugOutput, 0, debugHeight * debugWidth * 4);
-
-    mDebugHeight = debugHeight;
-    mDebugWidth = debugWidth;
-}
-
-// Copies an existing image to the debug image.
-void ImageTestHandler::copyDebugImage(int inputHeight, int inputWidth,
-                                      const unsigned char* inputImage) {
-    if ((inputHeight == mDebugHeight) && (inputWidth == mDebugWidth)) {
-        ALOGV("Copying debug images");
-        memcpy(mDebugOutput, inputImage, mDebugHeight * mDebugWidth * 4);
-    }
-}
-
-void ImageTestHandler::clearDebugImage() {
-    if (mDebugOutput != NULL) {
-        delete[] mDebugOutput;
-        mDebugOutput = new unsigned char[mDebugHeight * mDebugWidth * 4];
-        memset(mDebugOutput, 0, mDebugHeight * mDebugWidth * 4);
-    }
-}
-
-
-// Draws a point of a given color.
-void ImageTestHandler::drawPoint(int row, int column, const Vec3i &color) {
-    if ((row >= 0) && (column >= 0) &&
-        (column < mDebugWidth) && (row < mDebugHeight)) {
-        mDebugOutput[(row*mDebugWidth + column) * 4] = color.r();
-        mDebugOutput[(row*mDebugWidth + column) * 4+1] = color.g();
-        mDebugOutput[(row*mDebugWidth + column) * 4+2] = color.b();
-        mDebugOutput[(row*mDebugWidth + column) * 4+3] = 255;
-    }
-}
-
-// Draws a point in Vec2 format of a given color.
-void ImageTestHandler::drawPoint(const Vec2i &point, const Vec3i &color) {
-    drawPoint((int) point.y(), (int) point.x(), color);
-}
-
-// Draws a line of a given color.
-void ImageTestHandler::drawLine(int angle, int radius, const Vec3i &color) {
-    const int r = color.r();
-    const int g = color.g();
-    const int b = color.b();
-    const int a = 255;
-
-    int shiftedMin = -113;
-    int shiftedMax = 83;
-
-    float radiusDouble = static_cast<float>(radius);
-
-    float angleRad = static_cast<float>(angle) * M_PI / 180.0;
-
-    //ALOGV("draw line for (%d, %d)", angle, radius);
-    for (int i = shiftedMin; i <= shiftedMax; ++i) {
-        float j;
-
-        assert(angle != 0);
-        j = (i - radiusDouble / sin(angleRad)) * tan(angleRad);
-        float x = (static_cast<float>(i) + j) / sqrt(2.0);
-        float y = (j - static_cast<float>(i)) / sqrt(2.0);
-
-        drawPoint(x, y, color);
-    }
-}
diff --git a/apps/CtsVerifier/lib/colorchecker/meteringtest.cpp b/apps/CtsVerifier/lib/colorchecker/meteringtest.cpp
deleted file mode 100644
index 47de5d8..0000000
--- a/apps/CtsVerifier/lib/colorchecker/meteringtest.cpp
+++ /dev/null
@@ -1,102 +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.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "MeteringTest"
-#include <utils/Log.h>
-#include <utils/Timers.h>
-#include <cmath>
-#include <string>
-
-#include "vec2.h"
-#include "vec3.h"
-#include "meteringtest.h"
-
-const float kOverExposure = 230.f;
-const float kEqThreshold = 0.05f;
-// Processes the checker colors stored by comparing the pixel values from the
-// two scenarios in a test.
-void MeteringTest::processData() {
-    ALOGV("Start Processing Metering Test Data!");
-
-    int numTests = mCheckerColors.size() / 2;
-    mNumPatches = 0;
-
-    if (numTests > 0) {
-        mNumPatches = mCheckerColors[0].size();
-    }
-
-    for (int i = 0; i < numTests; ++i) {
-        mComparisonResults.push_back(
-                isEquivalentTo((&mCheckerColors[i * 2]),
-                               (&mCheckerColors[i * 2 + 1])));
-        mComparisonResults.push_back(
-                isDarkerThan((&mCheckerColors[i * 2]),
-                             (&mCheckerColors[i * 2 + 1])));
-    }
-}
-
-void MeteringTest::clearData() {
-    mComparisonResults.clear();
-    mCheckerColors.clear();
-}
-
-// Compares two given arrays of pixel values and decide whether the first one is
-// significantly darker than the second one.
-bool MeteringTest::isDarkerThan(
-        const std::vector<Vec3f>* checkerColors1,
-        const std::vector<Vec3f>* checkerColors2) const {
-    float meanRatio = 0.f;
-    int meanNumCount = 0;
-
-    for (int i = 0; i < mNumPatches; ++i) {
-        float luminance1 = (*checkerColors1)[i].convertToLuminance();
-        float luminance2 = (*checkerColors2)[i].convertToLuminance();
-
-        // Out of the saturation rage, define 5% as a margin for being
-        // significantly brighter.
-        if ((luminance2 < kOverExposure) && (luminance1 != 0.f)) {
-            meanRatio += luminance2 / luminance1;
-            ++meanNumCount;
-        }
-    }
-    meanRatio = meanRatio / meanNumCount;
-
-    return (meanRatio > 1 + kEqThreshold);
-}
-
-// Compares the two givn arrays of pixel values and decide whether they are
-// equivalent within an acceptable range.
-bool MeteringTest::isEquivalentTo(
-        const std::vector<Vec3f>* checkerColors1,
-        const std::vector<Vec3f>* checkerColors2) const {
-    float meanRatio = 0.f;
-    int meanNumCount = 0;
-
-    for (int i = 0; i < mNumPatches; ++i) {
-        float luminance1 = (*checkerColors1)[i].convertToLuminance();
-        float luminance2 = (*checkerColors2)[i].convertToLuminance();
-        ALOGV("Luma_1 and Luma_2 is %f, %f", luminance1, luminance2);
-
-        if ((luminance1 < kOverExposure) && (luminance2 < kOverExposure)) {
-              meanRatio += luminance2 / luminance1;
-              ++meanNumCount;
-        }
-    }
-    meanRatio = meanRatio / meanNumCount;
-
-    return ((meanRatio >= 1 - kEqThreshold) && (meanRatio <= 1 + kEqThreshold));
-}
diff --git a/apps/CtsVerifier/lib/colorchecker/testingimage.cpp b/apps/CtsVerifier/lib/colorchecker/testingimage.cpp
deleted file mode 100644
index 28f025f..0000000
--- a/apps/CtsVerifier/lib/colorchecker/testingimage.cpp
+++ /dev/null
@@ -1,190 +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.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "TestingImage"
-#include <utils/Log.h>
-#include <utils/Timers.h>
-#include <string.h>
-#include <cmath>
-#include <vector>
-#include <assert.h>
-#include "vec3.h"
-
-#include "testingimage.h"
-
-const float GAMMA_CORRECTION = 2.2f;
-
-// Constructs an instance with the given image byte array.
-TestingImage::TestingImage(const unsigned char* inputImage,
-                           int inputHeight, int inputWidth,
-                           int inputChannel, int inputRowSpan) {
-    mImage = new unsigned char[inputRowSpan * inputHeight];
-
-    ALOGV("mImage format created! with size as %d, %d, %d",
-         inputRowSpan, inputHeight, inputChannel);
-    mWidth = inputWidth;
-    mHeight = inputHeight;
-    mChannels = inputChannel;
-    mRowSpan = mWidth * mChannels;
-
-    for (int i = 0; i < mHeight; ++i) {
-        for (int j = 0; j < mWidth; ++j) {
-            for (int k = 0; k < mChannels; ++k) {
-                mImage[i * mRowSpan + j* mChannels + k] =
-                        inputImage[i * inputRowSpan + j * inputChannel + k];
-            }
-        }
-    }
-    ALOGV("mImage converted!");
-}
-
-// Constructs an instance with the given image and resize it to a new size.
-TestingImage::TestingImage(const unsigned char* inputImage,
-                           int inputHeight, int inputWidth,
-                           int inputChannel, int inputRowSpan,
-                           int newHeight, int newWidth) {
-    mImage = new unsigned char[newHeight * newWidth * inputChannel];
-
-    ALOGV("mImage format created! with size as %d, %d, %d",
-         newHeight, newWidth, inputChannel);
-    mHeight = newHeight;
-    mWidth = newWidth;
-    mChannels = inputChannel;
-    mRowSpan = mWidth * mChannels;
-
-    // Computes how many pixels in the original image corresponds to one pixel
-    // in the new image.
-    int heightScale = inputHeight / newHeight;
-    int widthScale = inputWidth / newWidth;
-
-    // Average the corresponding pixels in the original image to compute the
-    // pixel value of the new image.
-    for (int i = 0; i < mHeight; ++i) {
-        for (int j = 0; j < mWidth; ++j) {
-            for (int k = 0; k < mChannels; ++k) {
-                int pixelValue = 0;
-
-                for (int l = 0; l < heightScale; ++l) {
-                    for (int m = 0; m < widthScale; ++m) {
-                        pixelValue += inputImage[
-                                (i * heightScale + l) * inputRowSpan
-                                + (j * widthScale + m) * inputChannel + k];
-                    }
-                }
-                pixelValue = pixelValue / (heightScale * widthScale);
-                mImage[i * mRowSpan + j * mChannels + k] =
-                        (unsigned char) pixelValue;
-            }
-        }
-    }
-}
-
-TestingImage::~TestingImage() {
-    if (mImage!=NULL) {
-        delete[] mImage;
-    }
-}
-
-int TestingImage::getPixelValue(int row, int column, int channel) const {
-    assert ((row >= 0) && (row < mHeight));
-    assert ((column >= 0) && (column < mWidth));
-    assert ((channel >= 0) && (channel < mChannels));
-    return (int)mImage[row * mRowSpan + column * mChannels + channel];
-}
-
-Vec3i TestingImage::getPixelValue(int row, int column) const {
-    Vec3i current_color(getPixelValue(row, column, 0),
-                        getPixelValue(row, column, 1),
-                        getPixelValue(row, column, 2));
-    return current_color;
-}
-
-Vec3i TestingImage::getPixelValue(const Vec2i &pixelPosition) const {
-    return getPixelValue(pixelPosition.x(), pixelPosition.y());
-}
-
-Vec3i TestingImage::getPixelValue(const Vec2f &pixelPosition) const {
-    return getPixelValue(static_cast<int>(pixelPosition.x()),
-                         static_cast<int>(pixelPosition.y()));
-}
-
-// Returns a vector of the colors in the requested block of color checkers.
-// The vector is formatted by going through the block from left to right and
-// from top to bottom.
-const std::vector<Vec3f>* TestingImage::getColorChecker(
-      int rowStart, int rowEnd, int columnStart, int columnEnd,
-      const std::vector<std::vector< Vec2f > >* centerAddress,
-      const std::vector<std::vector< float > >* radiusAddress) const {
-    std::vector<Vec3f>* checkerColors = new std::vector<Vec3f>;
-
-    // Average the pixel values of the pixels within the given radius to the
-    // given center position.
-    for (int i = rowStart; i < rowEnd; ++i) {
-        for (int j = columnStart; j < columnEnd; ++j) {
-            float radius = sqrt((*radiusAddress)[i][j]);
-            Vec2f center((*centerAddress)[i][j].x(),
-                               (*centerAddress)[i][j].y());
-            Vec3f meanColor(0.f, 0.f, 0.f);
-            int numPixels = 0;
-
-            for (int ii = static_cast<int>(center.x() - radius);
-                 ii < static_cast<int>(center.x() + radius); ++ii) {
-                for (int jj = static_cast<int>(center.y() - radius);
-                     jj < static_cast<int>(center.y() + radius); ++jj) {
-
-                    Vec2i pixelPosition(ii,jj);
-                    if (pixelPosition.squareDistance<float>(center) <
-                        (*radiusAddress)[i][j]) {
-                        meanColor = meanColor + getPixelValue(pixelPosition);
-                        ++numPixels;
-                    }
-                }
-            }
-            meanColor = meanColor / numPixels;
-            checkerColors->push_back(meanColor);
-        }
-    }
-
-    return checkerColors;
-}
-
-bool TestingImage::rgbToGrayScale(unsigned char* grayLayer) const {
-    if (mChannels == 4) {
-        for (int i = 0; i < mWidth; i++) {
-            for (int j = 0; j < mHeight; j++) {
-                float redLinear = pow(getPixelValue(j, i, 0),
-                                       GAMMA_CORRECTION);
-                float greenLinear = pow(getPixelValue(j,i,1),
-                                         GAMMA_CORRECTION);
-                float blueLinear = pow(getPixelValue(j,i,2),
-                                        GAMMA_CORRECTION);
-
-                // Computes the luminance value
-                grayLayer[j * mWidth + i] =
-                        (unsigned char)((int)pow((0.299f * redLinear
-                                                  + 0.587f * greenLinear
-                                                  + 0.114f * blueLinear),
-                                                  1/GAMMA_CORRECTION));
-            }
-        }
-
-        return true;
-    } else {
-
-        return false;
-    }
-}
diff --git a/apps/CtsVerifier/lib/colorchecker/vec2.cpp b/apps/CtsVerifier/lib/colorchecker/vec2.cpp
deleted file mode 100644
index 29736bb..0000000
--- a/apps/CtsVerifier/lib/colorchecker/vec2.cpp
+++ /dev/null
@@ -1,22 +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.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "Vec2"
-#include <utils/Log.h>
-#include <utils/Timers.h>
-
-#include "vec2.h"
diff --git a/apps/CtsVerifier/lib/colorchecker/vec3.cpp b/apps/CtsVerifier/lib/colorchecker/vec3.cpp
deleted file mode 100644
index ac16620..0000000
--- a/apps/CtsVerifier/lib/colorchecker/vec3.cpp
+++ /dev/null
@@ -1,22 +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.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "Vec3"
-#include <utils/Log.h>
-#include <utils/Timers.h>
-
-#include "vec3.h"
diff --git a/apps/CtsVerifier/lib/colorchecker/whitebalancetest.cpp b/apps/CtsVerifier/lib/colorchecker/whitebalancetest.cpp
deleted file mode 100644
index 6413a2b..0000000
--- a/apps/CtsVerifier/lib/colorchecker/whitebalancetest.cpp
+++ /dev/null
@@ -1,122 +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.
- */
-#define LOG_NDEBUG 0
-
-#define LOG_TAG "WhiteBalanceTest"
-#include <utils/Log.h>
-#include <utils/Timers.h>
-#include <cmath>
-#include <string>
-
-#include "vec2.h"
-#include "vec3.h"
-#include "whitebalancetest.h"
-
-// White point in XYZ color space under 5200k illumination.
-const Vec3f kDaylightWhitePoint(0.9781f, 1.f, 0.9021f);
-
-// Process the data of checker colors collected under different white balance.
-// Assuming the Daylight CCT is set to 5200k, compute the CCT of other white
-// balance modes.
-void WhiteBalanceTest::processData() {
-    ALOGV("Start Processing White Balance Test Data!");
-
-    int numPatches = mCheckerColors.size();
-    ALOGV("Processing %d tests with %d patches", 2, numPatches);
-
-    std::vector<Vec3f> xyzColors(numPatches);
-    for (int j = 0; j < numPatches; ++j) {
-        Vec3f xyzCheckerColor = initializeFromRGB(mCheckerColors[j]);
-        xyzColors[j] = xyzCheckerColor;
-        ALOGV("XYZ coordinate is %f, %f, %f", xyzCheckerColor.r(),
-              xyzCheckerColor.g(), xyzCheckerColor.b());
-    }
-
-    Vec3f meanScale(0.f, 0.f, 0.f);
-
-    if (mMode == "daylight") {
-        mXyzColorsDaylight = xyzColors;
-        // For testing the auto white balance mode. Compute a CCT that would
-        // map the gray checkers to a white point.
-        for (int j = 1; j < numPatches; ++j) {
-            meanScale = meanScale +
-                    (mXyzColorsDaylight[j] / kDaylightWhitePoint);
-        }
-    } else {
-        for (int j = 1; j < numPatches; ++j) {
-            meanScale = meanScale + (mXyzColorsDaylight[j] / xyzColors[j]);
-        }
-    }
-
-    meanScale = meanScale / (numPatches - 1);
-    ALOGV("Scale: %f, %f, %f", meanScale.r(), meanScale.g(), meanScale.b());
-
-    Vec3f whitePoint;
-    whitePoint = meanScale * kDaylightWhitePoint;
-
-    ALOGV("White point is %f, %f, %f", whitePoint.r(),
-         whitePoint.g(), whitePoint.b());
-
-    mCorrelatedColorTemp = findCorrelatedColorTemp(whitePoint);
-    ALOGV("CCT is %d", mCorrelatedColorTemp);
-}
-
-// Given a white point, find the correlated color temperature.
-// Formula taken from the paper "Calculating Correlated Color Temperatures
-// Across the Entire Gamut of Daylight and Skylight Chromaticities" by Hernandez
-// Andres et al. in 1999. The numbers are fitting parameters.
-int WhiteBalanceTest::findCorrelatedColorTemp(const Vec3f &whitePoint) {
-    Vec2f chromaOfWhitePoint(
-        whitePoint.r() / (whitePoint.r() + whitePoint.g() + whitePoint.b()),
-        whitePoint.g() / (whitePoint.r() + whitePoint.g() + whitePoint.b()));
-
-    float n = (chromaOfWhitePoint.x() - 0.3366f)
-                / (chromaOfWhitePoint.y() - 0.1735f);
-    float y = -949.86315f + 6253.80338f * exp(-n / 0.92159f)
-               + 28.70599f * exp(-n / 0.20039f) + 0.00004f * exp(-n / 0.07125f);
-
-    return static_cast<int>(y);
-}
-
-// Converts a RGB pixel value to XYZ color space.
-Vec3f WhiteBalanceTest::initializeFromRGB(const Vec3f &rgb) {
-    float linearRed = convertToLinear(rgb.r());
-    float linearGreen = convertToLinear(rgb.g());
-    float linearBlue = convertToLinear(rgb.b());
-
-    float x = 0.4124f * linearRed + 0.3576f * linearGreen +
-            0.1805f * linearBlue;
-    float y = 0.2126f * linearRed + 0.7152f * linearGreen +
-            0.0722f * linearBlue;
-    float z = 0.0193f * linearRed + 0.1192f * linearGreen +
-            0.9505f * linearBlue;
-
-    return Vec3f(x, y, z);
-}
-
-float WhiteBalanceTest::convertToLinear(float color) {
-    float norm = color/ 255.0f;
-    float linearColor;
-
-    // Convert from sRGB space to linear RGB value
-    if (norm > 0.04045f) {
-        linearColor = pow(((norm + 0.055f) / 1.055f), 2.4f);
-    } else {
-        linearColor = norm / 12.92f;
-    }
-
-    return linearColor;
-}
diff --git a/apps/CtsVerifier/libs/opencv-android.jar b/apps/CtsVerifier/libs/opencv-android.jar
new file mode 100644
index 0000000..1c13eee
--- /dev/null
+++ b/apps/CtsVerifier/libs/opencv-android.jar
Binary files differ
diff --git a/apps/CtsVerifier/libs/opencv-android_LICENSE b/apps/CtsVerifier/libs/opencv-android_LICENSE
new file mode 100644
index 0000000..5e32d88
--- /dev/null
+++ b/apps/CtsVerifier/libs/opencv-android_LICENSE
@@ -0,0 +1,33 @@
+By downloading, copying, installing or using the software you agree to this license.
+If you do not agree to this license, do not download, install,
+copy or use the software.
+
+
+                          License Agreement
+               For Open Source Computer Vision Library
+                       (3-clause BSD License)
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+  * Redistributions of source code must retain the above copyright notice,
+    this list of conditions and the following disclaimer.
+
+  * Redistributions in binary form must reproduce the above copyright notice,
+    this list of conditions and the following disclaimer in the documentation
+    and/or other materials provided with the distribution.
+
+  * Neither the names of the copyright holders nor the names of the contributors
+    may be used to endorse or promote products derived from this software
+    without specific prior written permission.
+
+This software is provided by the copyright holders and contributors "as is" and
+any express or implied warranties, including, but not limited to, the implied
+warranties of merchantability and fitness for a particular purpose are disclaimed.
+In no event shall copyright holders or contributors be liable for any direct,
+indirect, incidental, special, exemplary, or consequential damages
+(including, but not limited to, procurement of substitute goods or services;
+loss of use, data, or profits; or business interruption) however caused
+and on any theory of liability, whether in contract, strict liability,
+or tort (including negligence or otherwise) arising in any way out of
+the use of this software, even if advised of the possibility of such damage.
diff --git a/apps/CtsVerifier/proguard.flags b/apps/CtsVerifier/proguard.flags
index ca4680f..5a2beb5 100644
--- a/apps/CtsVerifier/proguard.flags
+++ b/apps/CtsVerifier/proguard.flags
@@ -16,6 +16,14 @@
 
 -keepclasseswithmembers class * extends com.android.cts.verifier.location.LocationModeTestActivity
 
+# keep mockito methods
+-keep class org.mockito.** { *; }
+-keep interface org.mockito.** { *; }
+-keep class com.google.dexmaker.** { *; }
+-keep interface com.google.dexmaker.** { *; }
+
 -dontwarn android.hardware.Sensor
 -dontwarn android.test.AndroidTestRunner
 -dontwarn java.util.concurrent.ConcurrentLinkedDeque
+-dontwarn android.cts.util.**
+-dontwarn junit.**
diff --git a/apps/CtsVerifier/res/drawable/prompt_x.png b/apps/CtsVerifier/res/drawable/prompt_x.png
new file mode 100644
index 0000000..64302dc
--- /dev/null
+++ b/apps/CtsVerifier/res/drawable/prompt_x.png
Binary files differ
diff --git a/apps/CtsVerifier/res/drawable/prompt_y.png b/apps/CtsVerifier/res/drawable/prompt_y.png
new file mode 100644
index 0000000..01926b5
--- /dev/null
+++ b/apps/CtsVerifier/res/drawable/prompt_y.png
Binary files differ
diff --git a/apps/CtsVerifier/res/drawable/prompt_z.png b/apps/CtsVerifier/res/drawable/prompt_z.png
new file mode 100644
index 0000000..f4d86d6
--- /dev/null
+++ b/apps/CtsVerifier/res/drawable/prompt_z.png
Binary files differ
diff --git a/apps/CtsVerifier/res/drawable/stat_sys_managed_profile_status.xml b/apps/CtsVerifier/res/drawable/stat_sys_managed_profile_status.xml
new file mode 100644
index 0000000..b04059e
--- /dev/null
+++ b/apps/CtsVerifier/res/drawable/stat_sys_managed_profile_status.xml
@@ -0,0 +1,29 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="23.0dp"
+        android:height="18.0dp"
+        android:viewportWidth="21.0"
+        android:viewportHeight="17.0">
+    <group android:translateX="2.0">
+        <path
+            android:fillColor="#FFFFFFFF"
+            android:pathData="M9.9,11.6H7v-1.1H2.1v2.8c0,0.8,0.6,1.4,1.4,1.4h9.9c0.8,0,1.4,-0.6,1.4,-1.4v-2.8H9.9V11.6z"/>
+        <path
+            android:fillColor="#FFFFFFFF"
+            android:pathData="M14.1,4.2h-2.5V3.2l-1.1,-1.1H6.3L5.3,3.2v1H2.8C2,4.2,1.4,4.9,1.4,5.6v2.8c0,0.8,0.6,1.4,1.4,1.4H7V8.8h2.8v1.1h4.2     c0.8,0,1.4,-0.6,1.4,-1.4V5.6C15.5,4.9,14.8,4.2,14.1,4.2z M10.6,4.2H6.3V3.2h4.2V4.2z"/>
+    </group>
+</vector>
diff --git a/apps/CtsVerifier/res/layout/audio_dev_notify.xml b/apps/CtsVerifier/res/layout/audio_dev_notify.xml
new file mode 100644
index 0000000..98dbd8b
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/audio_dev_notify.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="10dip"
+        android:orientation="vertical">
+
+  <TextView
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:scrollbars="vertical"
+      android:gravity="bottom"
+      android:id="@+id/info_text"
+      android:text="@string/audio_devices_notification_instructions" />
+
+  <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:orientation="vertical">
+      <Button
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+          android:id="@+id/audio_dev_notification_connect_clearmsgs_btn"
+          android:text="@string/audio_dev_notification_clearmsgs"/>
+
+      <TextView
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+          android:id="@+id/audio_dev_notification_connect_msg"/>
+
+      <TextView
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+          android:id="@+id/audio_dev_notification_disconnect_msg"/>
+
+    </LinearLayout>
+
+  <include layout="@layout/pass_fail_buttons" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/audio_frequency_line_activity.xml b/apps/CtsVerifier/res/layout/audio_frequency_line_activity.xml
new file mode 100644
index 0000000..69e3bc7
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/audio_frequency_line_activity.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="10dip"
+        android:orientation="vertical">
+
+  <TextView
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:scrollbars="vertical"
+      android:gravity="bottom"
+      android:id="@+id/info_text"
+      android:text="@string/audio_frequency_line_instructions" />
+  <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:orientation="vertical">
+      <Button
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+          android:id="@+id/audio_frequency_line_plug_ready_btn"
+          android:text="@string/audio_frequency_line_plug_ready_btn"/>
+
+    <LinearLayout
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+     <LinearLayout
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:orientation="horizontal"
+          android:id="@+id/audio_frequency_line_layout">
+            <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/audio_frequency_line_test_btn"
+                android:id="@+id/audio_frequency_line_test_btn"/>
+
+            <ProgressBar
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:id="@+id/audio_frequency_line_progress_bar"/>
+        </LinearLayout>
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/audio_frequency_line_results_text"
+            android:id="@+id/audio_frequency_line_results_text"/>
+
+    </LinearLayout>
+    </LinearLayout>
+
+  <include layout="@layout/pass_fail_buttons" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/audio_frequency_mic_activity.xml b/apps/CtsVerifier/res/layout/audio_frequency_mic_activity.xml
new file mode 100644
index 0000000..10b0003
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/audio_frequency_mic_activity.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:padding="10dip"
+    android:orientation="vertical">
+
+    <ScrollView
+       android:layout_width="match_parent"
+       android:layout_height="match_parent"
+       android:id="@+id/scrollView">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+        <LinearLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal">
+          <TextView
+              android:layout_width="wrap_content"
+              android:layout_height="wrap_content"
+              android:layout_weight="1"
+              android:id="@+id/info_text"
+              android:text="@string/audio_frequency_mic_instructions"/>
+
+           <ProgressBar
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1"
+                        android:id="@+id/audio_frequency_mic_progress_bar"/>
+         </LinearLayout>
+
+          <Button
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:id="@+id/audio_frequency_mic_speakers_ready_btn"
+              android:text="@string/audio_frequency_mic_speakers_ready_btn"/>
+
+          <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:scrollbars="vertical"
+                android:gravity="bottom"
+                android:id="@+id/audio_frequency_mic_speakers_ready_status"
+                android:text="@string/audio_frequency_mic_speakers_ready_status"/>
+
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:orientation="vertical"
+                android:id="@+id/audio_frequency_mic_layout_test1">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/audio_frequency_mic_instructions2"
+                android:id="@+id/audio_frequency_mic_instructions2"/>
+
+              <Button
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/audio_frequency_mic_test1_btn"
+                    android:id="@+id/audio_frequency_mic_test1_btn"/>
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/audio_frequency_mic_results_text"
+                    android:id="@+id/audio_frequency_mic_results1_text"/>
+          </LinearLayout>
+
+          <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical"
+                android:id="@+id/audio_frequency_mic_layout_test2a">
+
+            <Button
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:id="@+id/audio_frequency_mic_mic_ready_btn"
+                android:text="@string/audio_frequency_mic_mic_ready_btn"/>
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/audio_frequency_mic_usb_status"
+                android:id="@+id/audio_frequency_mic_usb_status"/>
+           </LinearLayout>
+
+          <LinearLayout
+              android:orientation="vertical"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:id="@+id/audio_frequency_mic_layout_test2b">
+
+            <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/audio_frequency_mic_test2_btn"
+                android:id="@+id/audio_frequency_mic_test2_btn"/>
+
+              <TextView
+                  android:layout_width="wrap_content"
+                  android:layout_height="wrap_content"
+                  android:text="@string/audio_frequency_mic_results_text"
+                  android:id="@+id/audio_frequency_mic_results_text"/>
+
+        </LinearLayout>
+
+        <include layout="@layout/pass_fail_buttons"/>
+        </LinearLayout>
+      </ScrollView>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/audio_frequency_speaker_activity.xml b/apps/CtsVerifier/res/layout/audio_frequency_speaker_activity.xml
new file mode 100644
index 0000000..5dd55b1
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/audio_frequency_speaker_activity.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:padding="10dip"
+    android:orientation="vertical">
+
+    <ScrollView
+       android:layout_width="match_parent"
+       android:layout_height="match_parent"
+       android:id="@+id/scrollView">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:scrollbars="vertical"
+            android:gravity="bottom"
+            android:id="@+id/info_text"
+            android:text="@string/audio_frequency_speaker_instructions"/>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+            <Button
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:id="@+id/audio_frequency_speaker_mic_ready_btn"
+                android:text="@string/audio_frequency_speaker_mic_ready_btn"/>
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/audio_frequency_speaker_usb_status"
+                android:id="@+id/audio_frequency_speaker_usb_status"/>
+
+            <LinearLayout
+                android:orientation="vertical"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+                <LinearLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal"
+                    android:id="@+id/audio_frequency_speaker_layout">
+                    <Button
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="@string/audio_frequency_speaker_test_btn"
+                        android:id="@+id/audio_frequency_speaker_test_btn"/>
+
+                    <ProgressBar
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:id="@+id/audio_frequency_speaker_progress_bar"/>
+                </LinearLayout>
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/audio_frequency_speaker_results_text"
+                    android:id="@+id/audio_frequency_speaker_results_text"/>
+
+            </LinearLayout>
+        </LinearLayout>
+
+        <include layout="@layout/pass_fail_buttons"/>
+        </LinearLayout>
+      </ScrollView>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/audio_loopback_activity.xml b/apps/CtsVerifier/res/layout/audio_loopback_activity.xml
new file mode 100644
index 0000000..626ac4f
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/audio_loopback_activity.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="10dip"
+        android:orientation="vertical">
+
+  <TextView
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:scrollbars="vertical"
+      android:gravity="bottom"
+      android:id="@+id/info_text"
+      android:text="@string/audio_loopback_instructions" />
+  <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:orientation="vertical">
+      <Button
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+          android:id="@+id/audio_loopback_plug_ready_btn"
+          android:text="@string/audio_loopback_plug_ready_btn"/>
+
+    <LinearLayout
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:id="@+id/audio_loopback_layout">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/audio_loopback_instructions2"
+            android:id="@+id/audio_loopback_instructions2"/>
+
+        <SeekBar
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:id="@+id/audio_loopback_level_seekbar"/>
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/audio_loopback_level_text"
+            android:id="@+id/audio_loopback_level_text"/>
+
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/audio_loopback_test_btn"
+            android:id="@+id/audio_loopback_test_btn"/>
+
+        <ProgressBar
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:id="@+id/audio_loopback_progress_bar"/>
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/audio_loopback_results_text"
+            android:id="@+id/audio_loopback_results_text"/>
+    </LinearLayout>
+    </LinearLayout>
+
+  <include layout="@layout/pass_fail_buttons" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/audio_routingnotifications_test.xml b/apps/CtsVerifier/res/layout/audio_routingnotifications_test.xml
new file mode 100644
index 0000000..cef30d6
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/audio_routingnotifications_test.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="10dip"
+        android:orientation="vertical">
+
+  <TextView
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:scrollbars="vertical"
+      android:gravity="bottom"
+      android:id="@+id/info_text"
+      android:text="@string/audio_dev_routingnotification_instructions" />
+
+  <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:orientation="vertical"
+      android:id="@+id/audioTrackRoutingLayout">
+      <TextView
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+              android:text="@string/audio_routingnotification_playHeader"/>
+
+      <TextView
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+          android:id="@+id/audio_routingnotification_audioTrack_change"/>
+
+      <LinearLayout
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:orientation="horizontal">
+          <Button
+              android:layout_width="wrap_content"
+              android:layout_height="wrap_content"
+              android:id="@+id/audio_routingnotification_playBtn"
+              android:text="@string/audio_routingnotification_playBtn"/>
+
+          <Button
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:id="@+id/audio_routingnotification_playStopBtn"
+              android:text="@string/audio_routingnotification_playStopBtn"/>
+      </LinearLayout>
+    </LinearLayout>
+
+  <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:orientation="vertical"
+      android:id="@+id/audioRecordRoutingLayout">
+      <TextView
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+              android:text="@string/audio_routingnotification_recHeader"/>
+
+      <TextView
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+          android:id="@+id/audio_routingnotification_audioRecord_change"/>
+
+      <LinearLayout
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:orientation="horizontal">
+          <Button
+              android:layout_width="wrap_content"
+              android:layout_height="wrap_content"
+              android:id="@+id/audio_routingnotification_recordBtn"
+              android:text="@string/audio_routingnotification_recBtn"/>
+
+          <Button
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:id="@+id/audio_routingnotification_recordStopBtn"
+              android:text="@string/audio_routingnotification_recStopBtn"/>
+      </LinearLayout>
+    </LinearLayout>
+
+  <include layout="@layout/pass_fail_buttons" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/ca_main.xml b/apps/CtsVerifier/res/layout/ca_main.xml
deleted file mode 100644
index 274430d..0000000
--- a/apps/CtsVerifier/res/layout/ca_main.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!-- 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.
--->
-<android.support.wearable.view.BoxInsetLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-    <LinearLayout app:layout_box="all"
-      android:orientation="vertical" android:layout_width="fill_parent"
-      android:layout_height="fill_parent">
-
-
-      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-        android:orientation="horizontal" android:layout_width="fill_parent"
-        android:layout_height="wrap_content">
-        <!--Button android:id="@+id/focusmodesbutton" android:layout_width="0px"
-          android:layout_height="wrap_content" android:text="@string/ca_focus_modes_label"
-          android:layout_weight="1" /-->
-        <Button android:id="@+id/findcheckerboardbutton" android:layout_width="0px"
-          android:layout_height="wrap_content" android:text="@string/ca_find_checkerboard_label"
-          android:layout_weight="1" />
-
-        <Button android:id="@+id/meteringbutton" android:layout_width="0px"
-          android:layout_height="wrap_content" android:text="@string/ca_metering_label"
-          android:layout_weight="1" />
-
-        <Button android:id="@+id/exposurecompensationbutton" android:layout_width="0px"
-          android:layout_height="wrap_content" android:text="@string/ca_exposure_test_label"
-          android:layout_weight="1"/>
-
-        <Button android:id="@+id/whitebalancebutton" android:layout_width="0px"
-          android:layout_height="wrap_content" android:text="@string/ca_wb_test_label"
-          android:layout_weight="1" />
-
-        <Button android:id="@+id/lockbutton" android:layout_width="0px"
-          android:layout_height="wrap_content" android:text="@string/ca_lock_test_label"
-          android:layout_weight="1" />
-      </LinearLayout>
-
-      <LinearLayout android:orientation="horizontal"
-        android:layout_width="fill_parent" android:layout_height="0px"
-        android:layout_weight="1">
-
-        <SurfaceView android:id="@+id/cameraview" android:layout_height="fill_parent"
-          android:layout_width="wrap_content"
-          android:layout_weight="0" />
-
-        <LinearLayout android:orientation="vertical"
-          android:layout_width="fill_parent" android:layout_height="match_parent"
-          android:layout_weight="1">
-
-           <ListView android:id="@+id/ca_tests"
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_weight="1"
-                android:layout_marginLeft="10px"/>
-
-          <ImageView android:id="@+id/resultview" android:layout_height="wrap_content"
-            android:layout_width="fill_parent"
-            android:layout_weight="1" />
-        </LinearLayout>
-
-      </LinearLayout>
-
-      <include layout="@layout/pass_fail_buttons" />
-
-    </LinearLayout>
-</android.support.wearable.view.BoxInsetLayout>
diff --git a/apps/CtsVerifier/res/layout/cam_preview_overlay.xml b/apps/CtsVerifier/res/layout/cam_preview_overlay.xml
new file mode 100644
index 0000000..41bbeb1
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/cam_preview_overlay.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical" android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:keepScreenOn="true">
+    <view
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        class="com.android.cts.verifier.sensors.RVCVCameraPreview"
+        android:id="@+id/cam_preview"
+        android:layout_centerVertical="true"
+        android:layout_centerHorizontal="true" />
+
+    <!--
+    <ImageView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_centerVertical="true"
+        android:id="@+id/cam_overlay"
+        android:src="@drawable/icon"
+        android:scaleType="fitStart"
+        />
+    -->
+    <view
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        class="com.android.cts.verifier.sensors.MotionIndicatorView"
+        android:id="@+id/cam_indicator"
+        android:layout_centerVertical="true"
+        android:layout_centerHorizontal="true" />
+
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerInParent="true"
+        android:id="@+id/cam_overlay"
+        android:scaleType="fitStart"
+        />
+</RelativeLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/camera_flashlight.xml b/apps/CtsVerifier/res/layout/camera_flashlight.xml
new file mode 100644
index 0000000..2d4378c
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/camera_flashlight.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2015 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_gravity="bottom"
+    android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/flash_instruction_text"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="2"
+            android:gravity="center"
+            android:text="@string/camera_flashlight_start_text" />
+
+        <Button
+            android:id="@+id/flash_instruction_button"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="100dp"
+            android:layout_marginRight="100dp"
+            android:text="@string/camera_flashlight_start_button" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:layout_marginLeft="50dp"
+            android:layout_marginRight="50dp"
+            android:layout_marginBottom="50dp"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/flash_on_button"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:text="@string/camera_flashlight_on_button" />
+
+            <Button
+                android:id="@+id/flash_off_button"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:text="@string/camera_flashlight_off_button" />
+
+        </LinearLayout>
+
+    <include layout="@layout/pass_fail_buttons"/>
+
+</LinearLayout>
diff --git a/apps/CtsVerifier/res/layout/byod_custom_view.xml b/apps/CtsVerifier/res/layout/dialog_custom_view.xml
similarity index 100%
rename from apps/CtsVerifier/res/layout/byod_custom_view.xml
rename to apps/CtsVerifier/res/layout/dialog_custom_view.xml
diff --git a/apps/CtsVerifier/res/layout/hifi_ultrasound.xml b/apps/CtsVerifier/res/layout/hifi_ultrasound.xml
new file mode 100644
index 0000000..7d2de5a
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/hifi_ultrasound.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical">
+
+  <TextView
+      android:layout_width="match_parent"
+      android:layout_height="0dp"
+      android:layout_weight="7"
+      android:scrollbars="vertical"
+      android:gravity="bottom"
+      android:id="@+id/info_text"/>
+
+  <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="0dp"
+      android:layout_weight="3"
+      android:orientation="horizontal">
+    <Button
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="5"
+        android:text="@string/hifi_ultrasound_test_record"
+        android:id="@+id/recorder_button"/>
+    <Button
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="5"
+        android:text="@string/hifi_ultrasound_test_play"
+        android:id="@+id/player_button"/>
+  </LinearLayout>
+
+  <include layout="@layout/pass_fail_buttons" />
+
+</LinearLayout>
diff --git a/apps/CtsVerifier/res/layout/hifi_ultrasound_popup.xml b/apps/CtsVerifier/res/layout/hifi_ultrasound_popup.xml
new file mode 100644
index 0000000..afff2c9
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/hifi_ultrasound_popup.xml
@@ -0,0 +1,33 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:background="@android:color/white"
+              android:gravity="center"
+              android:orientation="vertical" >
+
+    <com.androidplot.xy.XYPlot
+        android:id="@+id/responseChart"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="9"
+        androidPlot.domainLabel="kHz"
+        androidPlot.rangeLabel="dB"
+        androidPlot.domainLabelWidget.labelPaint.textSize="16dp"
+        androidPlot.rangeLabelWidget.labelPaint.textSize="16dp"
+        androidPlot.graphWidget.rangeLabelPaint.textSize="16dp"
+        androidPlot.graphWidget.rangeOriginLabelPaint.textSize="16dp"
+        androidPlot.graphWidget.domainLabelPaint.textSize="16dp"
+        androidPlot.graphWidget.domainOriginLabelPaint.textSize="16dp"
+        androidPlot.legendWidget.textPaint.textSize="16dp"
+        androidPlot.legendWidget.iconSizeMetrics.heightMetric.value="16dp"
+        androidPlot.legendWidget.iconSizeMetrics.widthMetric.value="16dp"
+        androidPlot.legendWidget.heightMetric.value="16dp"
+        androidPlot.graphWidget.gridLinePaint.color="#000000" />
+
+    <Button
+        android:id="@+id/dismiss"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        android:text="@string/hifi_ultrasound_test_dismiss" />
+</LinearLayout>
diff --git a/apps/CtsVerifier/res/layout/hifi_ultrasound_popup_instru.xml b/apps/CtsVerifier/res/layout/hifi_ultrasound_popup_instru.xml
new file mode 100644
index 0000000..42af6e9
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/hifi_ultrasound_popup_instru.xml
@@ -0,0 +1,21 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="wrap_content"
+              android:layout_height="wrap_content"
+              android:gravity="center"
+              android:background="@android:color/black"
+              android:padding="5dp"
+              android:orientation="vertical" >
+
+  <TextView
+      android:id="@+id/instru"
+      android:layout_width="match_parent"
+      android:layout_height="match_parent"
+      android:layout_weight="5" />
+
+  <Button
+      android:id="@+id/ok"
+      android:layout_width="match_parent"
+      android:layout_height="match_parent"
+      android:text="@string/hifi_ultrasound_test_ok"
+      android:layout_weight="1" />
+</LinearLayout>
diff --git a/apps/CtsVerifier/res/layout/keychain_main.xml b/apps/CtsVerifier/res/layout/keychain_main.xml
new file mode 100644
index 0000000..01eb255
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/keychain_main.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<android.support.wearable.view.BoxInsetLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:padding="10dip" >
+
+        <TextView
+            android:id="@+id/test_instruction"
+            style="@style/InstructionsFont"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_weight="0" />
+
+        <TextView
+            android:id="@+id/test_log"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="1"
+            android:layout_gravity="bottom"
+            android:orientation="vertical" />
+
+        <LinearLayout
+            android:id="@+id/action_buttons"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_weight="0"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/action_reset"
+                android:text="@string/keychain_reset"
+                android:layout_weight="1"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content" />
+
+            <Button
+                android:id="@+id/action_skip"
+                android:text="@string/keychain_skip"
+                android:layout_weight="1"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content" />
+
+            <Button
+                android:id="@+id/action_next"
+                android:text="@string/next_button_text"
+                android:layout_weight="1"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content" />
+
+        </LinearLayout>
+
+        <include
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_weight="0"
+            layout="@layout/pass_fail_buttons" />
+
+    </LinearLayout>
+</android.support.wearable.view.BoxInsetLayout>
diff --git a/apps/CtsVerifier/res/layout/permission_lockdown.xml b/apps/CtsVerifier/res/layout/permission_lockdown.xml
new file mode 100644
index 0000000..ea295dd
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/permission_lockdown.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/permission_lockdown_activity"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <ScrollView
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="1"
+            android:paddingTop="4dp">
+        <TextView
+                android:id="@+id/test_instructions"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/device_profile_owner_permission_lockdown_test_instructions"
+                android:textSize="18sp"
+                android:padding="10dp" />
+    </ScrollView>
+
+    <ScrollView
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="1">
+        <LinearLayout
+                android:orientation="vertical"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_gravity="center_vertical"
+                android:paddingStart="10dp"
+                android:paddingEnd="10dp">
+
+            <LinearLayout
+                    android:orientation="horizontal"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:paddingTop="4dp">
+                <ImageView
+                        android:id="@+id/package_icon"
+                        android:layout_width="48dp"
+                        android:layout_height="48dp"
+                        android:scaleType="centerInside"
+                        android:gravity="center" />
+                <TextView
+                        android:id="@+id/package_name"
+                        android:layout_width="wrap_content"
+                        android:layout_height="match_parent"
+                        android:gravity="center_vertical"
+                        android:paddingLeft="10dp"
+                        android:textSize="16sp"
+                        android:singleLine="true"
+                        android:ellipsize="end" />
+            </LinearLayout>
+
+            <TextView
+                    android:id="@+id/permission_name"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:textSize="16sp"
+                    android:paddingTop="4dp" />
+
+            <RadioGroup
+                    android:id="@+id/permission_group"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical"
+                    android:paddingTop="4dp">
+                <RadioButton
+                        android:id="@+id/permission_allow"
+                        android:text="@string/permission_allow"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content" />
+                <RadioButton
+                        android:id="@+id/permission_default"
+                        android:text="@string/permission_default"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content" />
+                <RadioButton
+                        android:id="@+id/permission_deny"
+                        android:text="@string/permission_deny"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content" />
+            </RadioGroup>
+
+            <Button
+                    android:id="@+id/open_settings"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center_horizontal"
+                    android:text="@string/open_settings_button_label"
+                    android:onClick="openSettings" />
+        </LinearLayout>
+    </ScrollView>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/positive_device_owner.xml b/apps/CtsVerifier/res/layout/positive_device_owner.xml
new file mode 100644
index 0000000..f5d10e0
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/positive_device_owner.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        >
+
+    <ScrollView
+            android:layout_width="match_parent"
+            android:layout_height="320dp"
+            android:layout_weight="2">
+        <TextView
+                android:id="@+id/positive_device_owner_instructions"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:padding="10dip"
+                android:text="@string/device_owner_positive_tests_instructions"
+                android:textSize="18dip" />
+    </ScrollView>
+
+    <Button
+        android:id="@+id/set_device_owner_button"
+        android:layout_width="204dp"
+        android:layout_height="wrap_content"
+        android:text="@string/set_device_owner_button_label" />
+
+    <ListView
+        android:id="@+id/android:list"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_weight="3" />
+
+    <include layout="@layout/pass_fail_buttons" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/provisioning_byod.xml b/apps/CtsVerifier/res/layout/provisioning_byod.xml
index b1b75ba..375c3ab 100644
--- a/apps/CtsVerifier/res/layout/provisioning_byod.xml
+++ b/apps/CtsVerifier/res/layout/provisioning_byod.xml
@@ -24,19 +24,17 @@
             android:layout_height="320dp"
             android:layout_weight="2">
         <TextView
-                android:id="@+id/byod_instructions"
+                android:id="@+id/test_instructions"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:padding="10dip"
-                android:text="@string/provisioning_byod_instructions"
                 android:textSize="18dip" />
     </ScrollView>
 
     <Button
-        android:id="@+id/byod_start"
+        android:id="@+id/prepare_test_button"
         android:layout_width="204dp"
-        android:layout_height="wrap_content"
-        android:text="@string/provisioning_byod_start" />
+        android:layout_height="wrap_content" />
 
     <ListView
         android:id="@+id/android:list"
diff --git a/apps/CtsVerifier/res/layout/sec_screen_lock_keys_main.xml b/apps/CtsVerifier/res/layout/sec_screen_lock_keys_main.xml
new file mode 100644
index 0000000..af53335
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/sec_screen_lock_keys_main.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:padding="10dip"
+        >
+
+    <Button android:id="@+id/sec_start_test_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerInParent="true"
+            android:text="@string/sec_start_test"
+            />
+
+    <include android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            layout="@layout/pass_fail_buttons"
+            />
+
+</RelativeLayout>
+
diff --git a/apps/CtsVerifier/res/layout/wifi_lockdown.xml b/apps/CtsVerifier/res/layout/wifi_lockdown.xml
new file mode 100644
index 0000000..ae6ea0c
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/wifi_lockdown.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        >
+
+    <ScrollView
+            android:layout_width="match_parent"
+            android:layout_height="320dp"
+            android:layout_weight="2">
+        <TextView
+                android:id="@+id/device_owner_wifi_lockdown_info"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:padding="10dip"
+                android:text="@string/device_owner_wifi_lockdown_info"
+                android:textSize="18dip" />
+    </ScrollView>
+
+    <EditText
+        android:id="@+id/device_owner_wifi_ssid"
+        android:hint="(SSID)"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+    <RadioGroup
+        android:id="@+id/device_owner_keyManagementMethods"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+        <RadioButton
+            android:id="@+id/device_owner_keymgmnt_none"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/device_owner_wifi_key_management_none_button" />
+        <RadioButton
+            android:id="@+id/device_owner_keymgmnt_wpa"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/device_owner_wifi_key_management_wpa_button" />
+        <RadioButton
+            android:id="@+id/device_owner_keymgmnt_wep"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/device_owner_wifi_key_management_wep_button" />
+    </RadioGroup>
+
+    <Button
+        android:id="@+id/create_wifi_config_button"
+        android:layout_width="204dp"
+        android:layout_height="wrap_content"
+        android:text="@string/create_wifi_config_button_label" />
+
+    <ListView
+        android:id="@+id/android:list"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_weight="3" />
+
+    <include layout="@layout/pass_fail_buttons" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/raw/cacert.der b/apps/CtsVerifier/res/raw/cacert.der
new file mode 100644
index 0000000..3934e1b
--- /dev/null
+++ b/apps/CtsVerifier/res/raw/cacert.der
Binary files differ
diff --git a/apps/CtsVerifier/res/raw/next_axis.mp3 b/apps/CtsVerifier/res/raw/next_axis.mp3
new file mode 100644
index 0000000..0a3174d
--- /dev/null
+++ b/apps/CtsVerifier/res/raw/next_axis.mp3
Binary files differ
diff --git a/apps/CtsVerifier/res/raw/stereo_mono_white_noise_48.mp3 b/apps/CtsVerifier/res/raw/stereo_mono_white_noise_48.mp3
new file mode 100644
index 0000000..e877fc1
--- /dev/null
+++ b/apps/CtsVerifier/res/raw/stereo_mono_white_noise_48.mp3
Binary files differ
diff --git a/apps/CtsVerifier/res/raw/usercert.der b/apps/CtsVerifier/res/raw/usercert.der
new file mode 100644
index 0000000..cdfb8f7
--- /dev/null
+++ b/apps/CtsVerifier/res/raw/usercert.der
Binary files differ
diff --git a/apps/CtsVerifier/res/raw/userkey.der b/apps/CtsVerifier/res/raw/userkey.der
new file mode 100644
index 0000000..31f1f8c
--- /dev/null
+++ b/apps/CtsVerifier/res/raw/userkey.der
Binary files differ
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index 07f7654..c5469a7 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -22,6 +22,7 @@
     <string name="info_button_text">Info</string>
     <string name="fail_button_text">Fail</string>
     <string name="next_button_text">Next</string>
+    <string name="go_button_text">Go</string>
 
     <!-- Strings for TestListActivity -->
     <string name="test_category_audio">Audio</string>
@@ -43,6 +44,7 @@
     <string name="test_results_cleared">Test results cleared.</string>
     <string name="view">View</string>
     <string name="test_results_error">Couldn\'t create test results report.</string>
+    <string name="runtime_permissions_error">Cannot continue. Please grant runtime permissions</string>
     <string name="export">Export</string>
     <string name="no_storage">Cannot save report to external storage, see log for details.</string>
     <string name="report_saved">Report saved to: %s</string>
@@ -126,6 +128,24 @@
     <string name="da_lock_success">It appears the screen was locked successfully!</string>
     <string name="da_lock_error">It does not look like the screen was locked...</string>
 
+    <!-- Strings for lock bound keys test -->
+    <string name="sec_lock_bound_key_test">Lock Bound Keys Test</string>
+    <string name="sec_lock_bound_key_test_info">
+        This test ensures that Keystore cryptographic keys that are bound to lock screen authentication
+        are unusable without a recent enough authentication. You need to set up a screen lock in order to
+        complete this test. If available, this test should be run by using fingerprint authentication
+        as well as PIN/pattern/password authentication.
+    </string>
+    <string name="sec_fingerprint_bound_key_test">Fingerprint Bound Keys Test</string>
+    <string name="sec_fingerprint_bound_key_test_info">
+        This test ensures that Keystore cryptographic keys that are bound to fingerprint authentication
+        are unusable without an authentication. You need to set up a fingerprint order to
+        complete this test.
+    </string>
+    <string name="sec_fp_dialog_message">Authenticate now with fingerprint</string>
+    <string name="sec_fp_auth_failed">Authentication failed</string>
+    <string name="sec_start_test">Start Test</string>
+
     <!-- Strings for BluetoothActivity -->
     <string name="bluetooth_test">Bluetooth Test</string>
     <string name="bluetooth_test_info">The Bluetooth Control tests check whether or not the device
@@ -298,6 +318,55 @@
 
     <string name="empty"></string>
 
+    <!-- Strings for HifiUltrasoundTestActivity -->
+    <string name="hifi_ultrasound_test">Hifi Ultrasound Microphone Test</string>
+    <string name="hifi_ultrasound_test_info">
+        This is a test for near-ultrasound (18500Hz - 20000Hz) microphone response.\n
+        This test requires two devices.\n</string>
+    <string name="hifi_ultrasound_test_play">PLAY</string>
+    <string name="hifi_ultrasound_test_record">RECORD</string>
+    <string name="hifi_ultrasound_test_plot">PLOT</string>
+    <string name="hifi_ultrasound_test_dismiss">DISMISS</string>
+    <string name="hifi_ultrasound_test_ok">OK</string>
+    <string name="hifi_ultrasound_test_instruction1">
+        Open Hifi Ultrasound Microphone Test on the test device and the reference device.\n
+        Set the media volume of the reference device at 70% and hold it with one hand.\n
+        Hold the testing device with the other hand\n
+        Press the RECORD button on the testing device, then the PLAY button on the reference device within one second.\n
+        After the test, report result on the testing (recording) device.\n</string>
+    <string name="hifi_ultrasound_test_pass">PASS</string>
+    <string name="hifi_ultrasound_test_fail">FAIL</string>
+    <string name="hifi_ultrasound_test_default_false_string">false</string>
+    <string name="hifi_ultrasound_test_mic_no_support">
+        Device does not support near-ultrasound recording.\n
+        All new phones and tablets MUST support near-ultrasound recording.\n
+        Report FAIL if this is a new device, report PASS if this is an updating device.\n</string>
+    <string name="hifi_ultrasound_test_spkr_no_support">
+        Device does not support near-ultrasound playback.\n
+        If this is your reference device, please use a different reference device.\n</string>
+
+    <string name="hifi_ultrasound_speaker_test">Hifi Ultrasound Speaker Test</string>
+    <string name="hifi_ultrasound_speaker_test_info">
+        This is a test for near-ultrasound (18500Hz - 20000Hz) speaker response.\n
+        This test requires two devices.\n</string>
+    <string name="hifi_ultrasound_speaker_test_instruction1">
+        Open Hifi Ultrasound Speaker Test on the test device and the reference device.\n
+        Set the media volume of the testing device at 70% and hold it with one hand.\n
+        Hold the reference device with the other hand\n
+        Press the RECORD button on the reference device, then the PLAY button on the testing device within one second.\n
+        After the test, report result on the testing (playback) device.\n</string>
+    <string name="hifi_ultrasound_speaker_test_mic_no_support">
+        Device does not support near-ultrasound recording.\n
+        If this is your reference device, please use a different reference device.\n</string>
+    <string name="hifi_ultrasound_speaker_test_spkr_no_support">
+        Device does not support near-ultrasound playback.\n
+        All new phones and tablets MUST support near-ultrasound playback.\n
+        Report FAIL if this is a new device, report PASS if this is an updating device.\n</string>
+    <string name="hifi_ultrasound_speaker_test_test_side">
+        Please wait for the result on the reference device then report here.</string>
+    <string name="hifi_ultrasound_speaker_test_reference_side">
+        Please report on the testing device.\n</string>
+
     <!-- Strings for Location tests -->
     <string name="location_gps_test">GPS Test</string>
     <string name="location_gps_test_info">This test verifies basic GPS behavior
@@ -331,6 +400,7 @@
     <string name="nfc_pee_2_pee">Peer-to-Peer Data Exchange</string>
     <string name="nfc_ndef_push_sender">NDEF Push Sender</string>
     <string name="nfc_ndef_push_receiver">NDEF Push Receiver</string>
+    <string name="nfc_llcp_version_check">LLCP version check</string>
 
     <string name="nfc_tag_verification">Tag Verification</string>
     <string name="nfc_ndef">NDEF</string>
@@ -352,6 +422,13 @@
     <string name="nfc_ndef_push_receive_failure">Failed to receive the correct NDEF push
         message.</string>
 
+    <string name="nfc_llcp_version_check_info">This test requires two candidate devices
+       with NFC enabled to exchange P2P messages. Start the \"LLCP version check\" test on
+       the other candidate device also, and touch the devices back to back. This test
+       then verifies that the candidate device correctly advises the LLCP version as 1.2</string>
+    <string name="nfc_llcp_version_check_failure">The candidate devices does not report LLCP
+       version 1.2 or higher.</string>
+    <string name="nfc_llcp_version_check_success">The candidate device has a valid LLCP version.</string>
     <string name="nfc_tag_verifier">NFC Tag Verifier</string>
     <string name="nfc_tag_verifier_info">Follow the on-screen instructions to write and read
         a tag of the chosen technology.</string>
@@ -496,6 +573,8 @@
     <string name="snsr_test_skipped">SKIPPED</string>
     <string name="snsr_test_fail">FAIL</string>
     <string name="snsr_execution_time">Test execution time %1$s sec</string>
+    <string name="snsr_rvcvxchk_test">Rotation Vector CV XCheck</string>
+    <string name="snsr_rvcvxchk_test_rec">Rotation Vector CV XCheck Recording</string>
 
     <!-- Strings to interact with users in Sensor Tests -->
     <string name="snsr_test_play_sound">A sound will be played once the verification is complete...</string>
@@ -600,6 +679,14 @@
     <string name="snsr_step_counter_event">%1$d | Step Counter event. count=%2$d.</string>
     <string name="snsr_step_detector_event">%1$d | Step Detector event.</string>
 
+    <!-- Device suspend tests -->
+    <string name="snsr_device_suspend_test">Device Suspend Tests</string>
+    <string name="snsr_device_did_not_go_into_suspend">Device did not go into suspend mode during test execution </string>
+    <string name="snsr_batch_did_not_arrive_at_expected_time">Batch did not arrive at the expected time estimatedBatchArrivalMs=%1$d
+    firstEventReceivedMs=%2$d diffMs=%3$d toleranceMs=%4$d </string>
+    <string name="snsr_device_suspend_test_instr">One you begin the test, disconnect USB, turn off the display and allow
+    the device to go into suspend mode. The screen will turn on and a sound will be played once all the tests are completed.</string>
+
     <!-- Significant Motion -->
     <string name="snsr_significant_motion_test">Significant Motion Tests</string>
     <string name="snsr_significant_motion_event_arrival">Event expected to trigger. Triggered=%1$s.</string>
@@ -614,6 +701,9 @@
     <string name="snsr_significant_motion_test_deactivation">Once you begin the test, you will need to walk to ensure Significant Motion triggers only once.</string>
     <string name="snsr_significant_motion_registration">Expected to be able to register for TriggerSensor. Found=%1$b.</string>
     <string name="snsr_significant_motion_cancelation">Expected to be able to cancel TriggerSensor. Found=%b.</string>
+    <string name="snsr_significant_motion_ap_suspend">One you begin the test, disconnect USB, turn off the display and allow the device to go into suspend.
+    You will need to walk to ensure that Significant Motion triggers. The screen will turn on and a sound will be played once the test completes.</string>
+    <string name="snsr_device_did_not_wake_up_at_trigger">Device did not wakeup at tigger time. wakeTime=%1$d ms triggerTime=%2$d ms</string>
 
     <!-- Strings for Sensor CTS tests inside CtsVerifier -->
     <string name="snsr_single_sensor_tests">CTS Single Sensor Tests</string>
@@ -636,18 +726,6 @@
     <string name="congratulations">Congratulations!</string>
     <string name="no_suid_files">No unauthorized suid files detected!</string>
 
-    <!-- Strings for Camera Analyzer -->
-    <string name="camera_analyzer">Camera Analyzer</string>
-    <string name="ca_find_checkerboard_label">Find target</string>
-    <string name="ca_check_formats_label">Output formats</string>
-    <string name="ca_exposure_test_label">Exposure Comp.</string>
-    <string name="ca_result_label">Results will be here</string>
-    <string name="ca_wb_test_label">White Balance</string>
-    <string name="ca_lock_test_label">AE Lock</string>
-    <string name="ca_metering_label">Metering Area</string>
-    <string name="ca_focus_modes_label">Focus Modes</string>
-    <string name="ca_info">This test checks the image quality of the camera of this device. It requires a MacBeth 4x6 color checker. With an ADK board and a lamp connected to it on the Relay 1 port, all tests can be run automatically. Without the ADK board, all the tests except the Auto Exposure Lock Test can be run automatically and the Auto Exposure Lock Test will require users to turn on/off a lamp according to the instruction given. </string>
-
     <!-- Strings for Camera Orientation -->
     <string name="camera_orientation">Camera Orientation</string>
     <string name="co_info">This test verifies the orientation capabilities of
@@ -815,6 +893,25 @@
     <string name="its_test_passed">All Camera ITS tests passed.  Pass button enabled!</string>
     <string name="its_test_failed">Some Camera ITS tests failed.</string>
 
+    <!-- Strings for the Camera Flashlight test activity -->
+    <string name="camera_flashlight_test">Camera Flashlight</string>
+    <string name="camera_flashlight_info">
+        This test checks the flashlight functionality. It will turn on and off the flashlight of
+        each camera device that has a flash unit. Follow the instructions on screen and observe the
+        flashlight status changing.
+    </string>
+    <string name="camera_flashlight_start_button">Start</string>
+    <string name="camera_flashlight_next_button">Next</string>
+    <string name="camera_flashlight_done_button">Done</string>
+    <string name="camera_flashlight_on_button">On</string>
+    <string name="camera_flashlight_off_button">Off</string>
+    <string name="camera_flashlight_start_text">Press Start to start flashlight test.</string>
+    <string name="camera_flashlight_question_text">Is Camera %1$s flashlight on or off?</string>
+    <string name="camera_flashlight_next_text">Ok. Press next.</string>
+    <string name="camera_flashlight_failed_text">Test failed. Press Done or Fail button.</string>
+    <string name="camera_flashlight_passed_text">All tests passed. Press Done or Pass button.
+    </string>
+
     <!-- Strings for StreamingVideoActivity -->
     <string name="streaming_video">Streaming Video Quality Verifier</string>
     <string name="streaming_video_info">This is a test for assessing the quality of streaming videos.  Play each stream and verify that the video is smooth and in sync with the audio, and that there are no quality problems.</string>
@@ -1001,13 +1098,12 @@
         respecting user preferences about notification ranking and filtering.
     </string>
     <string name="attention_ready">I\'m done</string>
-    <string name="attention_filter_all">Please set the notification filter to \"All\" in the dialog
-        that appears when you change the device\'s volume.</string>
-    <string name="attention_filter_priority">Please set the notification filter to \"Priority\" in
-        the dialog that appears when you change the device\'s volume, and allow messages from
-        starred contacts.</string>
-    <string name="attention_filter_none">Please set the notification filter to \"None\" in the dialog
-        that appears when you change the device\'s volume.</string>
+    <string name="attention_filter_all">Please disable \"Do not disturb\" by tapping the Quick Settings tile.</string>
+    <string name="attention_filter_priority">Please select \"Priority only\" in the dialog that appears
+        when you tap the \"Do not disturb\" tile in Quick Settings, and customize the setting to allow messages from
+        starred contacts only by tapping "More settings".</string>
+    <string name="attention_filter_none">Please select \"Total silence\" in the dialog that appears
+        when you tap the \"Do not disturb\" tile in Quick Settings.</string>
     <string name="attention_create_contacts">Create contacts for notification annotations.</string>
     <string name="attention_delete_contacts">Delete test contacts.</string>
     <string name="attention_default_order">Check that ranker defaults to time order.</string>
@@ -1109,6 +1205,23 @@
     <string name="caboot_reboot_desc">Please reboot the device and return to this test.</string>
     <string name="caboot_after_boot">AFTER REBOOTING: Check that there is a notification that the network may be monitored. Opening that notification should show a dialog box giving more information, with a button to check trusted credentials. This should open up the same view of trusted credentials that you get via the "Check credentials" button.</string>
 
+    <!-- Strings for KeyChain -->
+    <string name="keychain_test">KeyChain Storage Test</string>
+    <string name="keychain_info">This test checks that credentials installed to the system can be granted, retrieved, and used to create valid HTTPS connections.</string>
+    <string name="keychain_reset">Reset</string>
+    <string name="keychain_skip">Skip</string>
+    <string name="keychain_setup_desc">The first step sets up an internal KeyStore and generates credentials to use for the remainder of the test.\n\n
+ Touch \'Next\' to begin.</string>
+    <string name="keychain_install_desc">Credentials generated. Touch \'Next\' to install them to the system keychain.\n\n
+The container for the credentials will not be protected with a password; if prompted for one, leave that field blank.\n\n
+During installation you may be prompted for a name - accept the default suggestion.\n\n
+In the case that these credentials were already installed, you may skip this step.</string>
+    <string name="keychain_https_desc">The last test involves setting up an HTTPS connection using credentials from the KeyChain.\n\n
+You should be prompted to select credentials; choose the ones you just installed in the previous step.</string>
+    <string name="keychain_reset_desc">Before marking this test as passed, touch \'Next\' to open security settings and reset the following items:\n
+ 1. Clear device credentials.\n
+ 2. Change the lock screen type to \'None\'.</string>
+
     <!-- Strings for Widget -->
     <string name="widget_framework_test">Widget Framework Test</string>
     <string name="widget_framework_test_info">This test checks some basic features of the widget
@@ -1293,9 +1406,11 @@
     <string name="snsr_rotation_vector_set_final">Place the device back to the reference position.</string>
     <string name="snsr_rotation_vector_verification">Angular deviation [%1$4.1f %2$4.1f %3$4.1f]. Current: %4$f deg. Max tolerated: %5$f.</string>
 
+    <!-- Strings common for BYOD and DO managed provisioning tests. -->
+    <string name="afw_device_admin">CTS Verifier - AfW Admin</string>
+
     <!-- Strings for BYOD managed provisioning tests (ByodFlowTestActivity) -->
     <string name="test_category_managed_provisioning">Managed Provisioning</string>
-    <string name="provisioning_byod_device_admin">CTS Verifier - BYOD Admin</string>
     <string name="provisioning_byod">BYOD Managed Provisioning</string>
     <string name="provisioning_byod_info">
         This test exercises the BYOD managed provisioning flow.
@@ -1334,6 +1449,42 @@
         \n
         Verify that you are prompted with the above choices and both options work as intended. Then mark this test accordingly.
     </string>
+    <string name="provisioning_byod_keyguard_disabled_features">Keyguard disabled features</string>
+    <string name="provisioning_byod_keyguard_disabled_features_info">
+        This test exercises Keyguard Disabled Features. Follow instructions above.
+    </string>
+    <string name="provisioning_byod_keyguard_disabled_features_instruction">
+        Please press the \"Prepare test\" button to disable trust agents.\n
+        Then please press through the following verification steps.\n
+        Note: Device password will be set to \"testpassword\". After leaving the screen device password be cleared.
+    </string>
+    <string name="provisioning_byod_keyguard_disabled_features_prepare_button">Prepare test</string>
+    <string name="provisioning_byod_disable_trust_agents">Disable trust agents</string>
+    <string name="provisioning_byod_disable_trust_agents_instruction">
+        Please press the Go button to go to Settings > Security. Then go to Trusted agents and\n
+        check if the agents are shown as disabled by the administrator.
+        Then please press Back and mark the test as \"Pass\" or \"Fail\".
+    </string>
+    <string name="provisioning_byod_fingerprint_disabled_in_settings">Fingerprint is disabled in Settings</string>
+    <string name="provisioning_byod_fingerprint_disabled_in_settings_instruction">
+        Please press the Go button to go to Settings > Security. Then go to Fingerprint and\n
+        check if the screen is shown as disabled by the administrator.
+        Then please press Back and mark the test as \"Pass\" or \"Fail\".
+    </string>
+    <string name="provisioning_byod_disable_fingerprint">Fingerprint disabled on keyguard</string>
+    <string name="provisioning_byod_disable_fingerprint_instruction">
+        Please press the Go button to lock the screen. Then try to log in using the fingerprint reader.\n
+        Expected result is you cannot log in using your fingerprint.\n
+        After you log back in, please navigate back to CtsVerifier and mark the test as \"Pass\" or \"Fail\".
+    </string>
+    <string name="provisioning_byod_disable_notifications">Notifications disabled on keyguard</string>
+    <string name="provisioning_byod_disable_notifications_instruction">
+        Please press the Go button to lock the screen. Wait a couple of seconds and look out for a
+        notification from CtsVerifier.\n
+        Expected result is the notification is shown as \"Contents hidden\", you can not see the contents
+        (Which would read \"This is a work notification\").\n
+        After you log back in, please navigate back to CtsVerifier and mark the test as \"Pass\" or \"Fail\".
+    </string>
     <string name="provisioning_byod_work_notification">Work notification is badged</string>
     <string name="provisioning_byod_work_notification_instruction">
         Please press the Go button to trigger a notification.\n
@@ -1341,6 +1492,32 @@
         Verify that the notification is badged (see sample badge below). Then mark this test accordingly.
     </string>
     <string name="provisioning_byod_work_notification_title">This is a work notification</string>
+    <string name="provisioning_byod_work_status_icon">Work status icon is displayed</string>
+    <string name="provisioning_byod_work_status_icon_instruction">
+        Verify that the current status bar does not have a work status icon (see sample icon below).
+        \n\n
+        Please press the Go button to launch a work activity.
+        \n\n
+        Verify that the status bar now has a work status icon. Then mark this test accordingly.
+    </string>
+    <string name="provisioning_byod_work_status_icon_activity">
+        Verify that the current status bar has a work status notification.
+        \n\n
+        Please press finish to return to the tests and then mark this test accordingly.
+    </string>
+    <string name="provisioning_byod_work_status_toast">Work status toast is displayed</string>
+    <string name="provisioning_byod_work_status_toast_instruction">
+        Please press the Go button to launch a work activity.
+        \n\n
+        Follow instructions and then return and mark this test accordingly.
+    </string>
+    <string name="provisioning_byod_work_status_toast_activity">
+        Turn off the screen and wait a few seconds then turn on the screen again.
+        \n\n
+        Verify that a toast was displayed saying you are in the work profile.
+        \n\n
+        Please press finish to return to the tests and then mark this test accordingly.
+    </string>
     <string name="provisioning_byod_profile_visible_instruction">
         Please press the Go button to open the Settings page.
         Navigate to Accounts and confirm that:\n
@@ -1355,7 +1532,7 @@
         Navigate to Device administrators and confirm that:\n
         \n
         - Both Personal and Work categories exist.\n
-        - \"CTS Verifier - BYOD Admin\" exists under the Work category, and is activated.\n
+        - \"CTS Verifier - AfW Admin\" exists under the Work category, and is activated.\n
         \n
         Use the Back button to return to this page.
     </string>
@@ -1388,6 +1565,29 @@
         Then use the Back button to return to this test and mark accordingly.
     </string>
 
+    <string name="provisioning_byod_battery_settings">Profile-aware battery settings</string>
+    <string name="provisioning_byod_battery_settings_instruction">
+        Please press the Go button to open Battery page in settings.\n
+        \n
+        Verify that Battery page shows both badged and unbadged apps in the usage list.\n
+        \n
+        Note that the usage list only displays usage since last charge,
+        so you may need to unplug your device and use a badged and unbadged app
+        for a little while before they will appear in the list.\n
+        \n
+        Then use the Back button to return to this test and mark accordingly.
+    </string>
+
+    <string name="provisioning_byod_data_usage_settings">Profile-aware data usage settings</string>
+    <string name="provisioning_byod_data_usage_settings_instruction">
+        Please press the Go button to open the Settings page.\n
+        \n
+        Navigate to Data usage page and confirm that it includes a Work profile section,
+        and that tapping it shows just work profile data usage.\n
+        \n
+        Then use the Back button to return to this test and mark accordingly.
+    </string>
+
     <string name="provisioning_byod_cred_settings">Profile-aware trusted credential settings</string>
     <string name="provisioning_byod_cred_settings_instruction">
         Please press the Go button to open the Security settings.
@@ -1409,6 +1609,8 @@
         Then use the Back button to return to this test and mark accordingly.
     </string>
 
+    <string name="provisioning_byod_cross_profile_intent_filters">Cross profile intent filters are set</string>
+
     <string name="provisioning_byod_nfc_beam">Disable Nfc beam</string>
     <string name="provisioning_byod_nfc_beam_allowed_instruction">
         Please press the Go button to test if Nfc beam can be triggered in the work profile.\n
@@ -1434,7 +1636,6 @@
     <string name="provisioning_byod_delete_profile">Initiate deletion of work profile.</string>
     <string name="provisioning_byod_profile_deleted">Work profile deleted.</string>
     <string name="provisioning_byod_disabled">Device provisioning is not enabled.</string>
-    <string name="provisioning_byod_go">Go</string>
     <string name="provisioning_button_finish">Finish</string>
     <string name="provisioning_cross_profile_chooser">Choose an app to complete action</string>
 
@@ -1446,6 +1647,165 @@
     <string name="device_owner_negative_test">Device owner negative test</string>
     <string name="device_owner_negative_test_info">Please click the "Start provisioning" button, and when you see a warning dialog telling the device is already set up, select "pass". Otherwise, select "fail".</string>
     <string name="start_device_owner_provisioning_button">Start provisioning</string>
+    <string name="positive_device_owner">Device Owner Tests</string>
+    <string name="device_owner_positive_tests">Device Owner positive tests</string>
+    <string name="device_owner_positive_tests_instructions">
+            The positive device owner tests verify policies on a corporate owned device.\n
+            Press below button first, follow steps described in the dialog that pops up,
+            then proceed to the test cases.\n
+            Pressing \'back\', \'pass\' or \'fail\' on this test page will remove the device owner.\n
+            Alternatively, you can run the \'Remove device owner\' test. Ideally, that test should
+            be run last so that it does not interfere with other tests.
+    </string>
+    <string name="device_owner_positive_tests_info">
+            The positive device owner tests verify policies on a corporate owned device.\n
+            Press below button first, follow steps described in the dialog that pops up,
+            then proceed to the test cases.\n
+            Pressing \'back\', \'pass\' or \'fail\' on this test page will remove the device owner.\n
+            Alternatively, you can run the \'Remove device owner\' test. Ideally, that test should
+            be run last so that it does not interfere with other tests.
+    </string>
+    <string name="device_owner_positive_category">Device Owner Tests</string>
+    <string name="set_device_owner_button_label">Set up device owner</string>
+    <string name="set_device_owner_dialog_title">Set up device owner</string>
+    <string name="set_device_owner_dialog_text">
+            Please set the device owner by enabling USB debugging on the device and issuing the following command on the host:\n
+            adb shell dpm set-device-owner \'com.android.cts.verifier/com.android.cts.verifier.managedprovisioning.DeviceAdminTestReceiver\'
+    </string>
+    <string name="device_owner_remove_device_owner_test">Remove device owner</string>
+    <string name="device_owner_remove_device_owner_test_info">
+            Please check in Settings &gt; Security &gt; Device Administrators if CTSVerifier is
+            Device Owner. Then press the button below, and check that CTSVerifier is NOT Device
+            Owner anymore.
+    </string>
+    <string name="remove_device_owner_button">Remove device owner</string>
+    <string name="device_owner_check_device_owner_test">Check device owner</string>
+    <string name="device_owner_incorrect_device_owner">Missing or incorrect device owner: CTSVerifier is not DO!</string>
+    <string name="device_owner_wifi_lockdown_test">WiFi configuration lockdown</string>
+    <string name="device_owner_wifi_lockdown_info">
+            Please enter the SSID and auth method of an available WiFi Access Point and press the button to create a
+            WiFi configuration. This configuration can be seen on Settings &gt; WiFi. The test cases
+            are going use this config. Please go through test cases in order (from top to bottom).
+    </string>
+    <string name="switch_wifi_lockdown_off_button">WiFi config lockdown off</string>
+    <string name="switch_wifi_lockdown_on_button">WiFi config lockdown on</string>
+    <string name="wifi_lockdown_go_settings_wifi_button">Go to WiFi Settings</string>
+    <string name="device_owner_wifi_key_management_none_button">None</string>
+    <string name="device_owner_wifi_key_management_wpa_button">WPA</string>
+    <string name="device_owner_wifi_key_management_wep_button">WEP</string>
+    <string name="create_wifi_config_button_label">Create WiFi configuration</string>
+    <string name="wifi_lockdown_add_network_failed_dialog_title">WiFi configuration could not be created</string>
+    <string name="wifi_lockdown_add_network_failed_dialog_text">
+            There was an error during creation of WiFi configuration. Check if WiFi is switched on.
+    </string>
+    <string name="device_owner_wifi_config_unlocked_modification_test">Unlocked config is modifiable in Settings</string>
+    <string name="device_owner_wifi_config_unlocked_modification_test_info">
+            Please press the button to ensure WiFi config lockdown is NOT in effect. Then go to
+            Settings &gt; WiFi and see if the CTSVerifier created WiFi configuration can be edited.
+            Please make sure you can connect to it. The test is successful if the config is editable
+            and can be connected to.
+    </string>
+    <string name="device_owner_wifi_config_locked_modification_test">Locked config is not modifiable in Settings</string>
+    <string name="device_owner_wifi_config_locked_modification_test_info">
+            Please press the button to ensure WiFi config lockdown is in effect. Then go to
+            Settings &gt; WiFi and see if the CTSVerifier created WiFi configuration can NOT be edited
+            or removed. The test is successful if the config is NOT modifiable.
+    </string>
+    <string name="device_owner_wifi_config_locked_connection_test">Locked config can be connected to</string>
+    <string name="device_owner_wifi_config_locked_connection_test_info">
+            Please press the button to ensure WiFi config lockdown is in effect. Then go to
+            Settings &gt; WiFi and see if the CTSVerifier created WiFi configuration can be connected
+            to manually. The test is successful if the connection can be established.
+    </string>
+    <string name="device_owner_wifi_config_unlocked_removal_test">Unlocked config can be forgotten in Settings</string>
+    <string name="device_owner_wifi_config_unlocked_removal_test_info">
+            Please press the button to ensure WiFi config lockdown is NOT in effect. Then go to
+            Settings &gt; WiFi and see if the CTSVerifier created WiFi configuration can be forgotten.
+            The test is successful if the config could be forgotten and is removed from the list of saved configs.
+    </string>
+    <string name="device_owner_disable_statusbar_test">Disable status bar</string>
+    <string name="device_owner_disable_statusbar_test_info">
+            Please press the below button to disable the status bar and verify that quick settings, notifications
+            and the assist gesture are no longer available.\n
+            Next, press the button to reenable the status bar and verify that quick settings, notification
+            and the assist gesture are available again.\n
+            Please mark the test accordingly.
+    </string>
+    <string name="device_owner_disable_statusbar_button">Disable status bar</string>
+    <string name="device_owner_reenable_statusbar_button">Reenable status bar</string>
+    <string name="device_owner_disable_keyguard_test">Disable keyguard</string>
+    <string name="device_owner_disable_keyguard_test_info">
+            Note that any device passwords that you might have set will be deleted during this test.\n
+            Please press the below button to disable the keyguard. Press the power button on your device to
+            switch off the screen. Then press the power button to switch the screen back on and verify that
+            no keyguard was shown.\n
+            Next, press the button to reenable the keyguard and repeat the above steps, this time verifying that
+            a keyguard was shown again.\n
+            Please mark the test accordingly.
+    </string>
+    <string name="device_owner_disable_keyguard_button">Disable keyguard</string>
+    <string name="device_owner_reenable_keyguard_button">Reenable keyguard</string>
+    <string name="device_profile_owner_permission_lockdown_test">Permissions lockdown</string>
+    <string name="device_profile_owner_permission_lockdown_test_instructions">
+            Select each of the three grant states for the permission shown below in turn.\n
+            Now open application settings, select Permissions, and verify if the following behaviour is observed.\n
+            <b>Allow:</b> Permission is granted to the app and cannot be changed through the settings UI.\n
+            <b>Let user decide:</b> Permission state can be changed through the settings UI.\n
+            <b>Deny:</b> Permission is denied to the app and cannot be changed through the settings UI.\n
+            Please mark the test accordingly.
+    </string>
+    <string name="device_owner_permission_lockdown_test_info">
+        This test checks if the permissions state in settings UI is locked down according to the state set by the device owner.
+    </string>
+    <string name="profile_owner_permission_lockdown_test_info">
+        <b>
+        Before proceeding, check if com.android.cts.permissionapp (aka CtsPermissionApp) is installed in work profile by going to Settings &gt; Apps. If not, please install the app before proceeding.\n\n
+        </b>
+        This test checks if the permissions state in settings UI is locked down correctly depending on the state set by the profile owner.
+    </string>
+    <string name="package_not_found">You must install %s (aka CtsPermissionApp).</string>
+    <string name="permission_allow">Grant</string>
+    <string name="permission_default">Let user decide</string>
+    <string name="permission_deny">Deny</string>
+    <string name="not_profile_owner">%s is not profile owner.</string>
+    <string name="not_device_owner">%s is not device owner.</string>
+    <string name="activity_not_found">No activity found to handle intent: %s</string>
+    <string name="open_settings_button_label">Open Application Settings</string>
+    <string name="finish_button_label">Finish</string>
+    <string name="device_owner_device_admin_visible">Device administrator settings</string>
+    <string name="device_owner_device_admin_visible_info">
+        Please press the Go button to open the Security page in Settings.
+        Navigate to Device administrators and confirm that:\n
+        \n
+        - \"CTS Verifier - AfW Admin\" exists and is activated.\n
+        - \"CTS Verifier - AfW Admin\" cannot be disabled.\n
+        \n
+        Use the Back button to return to this page.
+    </string>
+    <string name="device_owner_disallow_config_bt">Disallow configuring Bluetooth</string>
+    <string name="device_owner_disallow_config_bt_info">
+        Please press the Set restriction button to set the user restriction.
+        Then press Go to open the Bluetooth page in Settings.
+        Confirm that:\n
+        \n
+        - You cannot view Bluetooth devices in range.\n
+        - You cannot edit, add or remove any already paired devices.\n
+        \n
+        Use the Back button to return to this page.
+    </string>
+    <string name="device_owner_disallow_config_wifi">Disallow configuring WiFi</string>
+    <string name="device_owner_disallow_config_wifi_info">
+        Please press the Set restriction button to set the user restriction.
+        Then press Go to open the WiFi page in Settings.
+        Confirm that:\n
+        \n
+        - You cannot view WiFi networks in range.\n
+        - You cannot edit, add or remove any existing WiFi configs.\n
+        \n
+        Use the Back button to return to this page.
+    </string>
+    <string name="device_owner_user_restriction_set">Set restriction</string>
+    <string name="device_owner_settings_go">Go</string>
 
     <!-- Strings for JobScheduler Tests -->
     <string name="js_test_description">This test is mostly automated, but requires some user interaction. You can pass this test once the list items below are checked.</string>
@@ -1561,6 +1921,41 @@
     The Spanish audio track should be selected.
     </string>
 
+    <string name="tv_time_shift_test">TV app time shift test</string>
+    <string name="tv_time_shift_test_info">
+    This test verifies that the TV app invokes proper time shift APIs in the framwork.
+    </string>
+    <string name="tv_time_shift_test_pause_resume">
+    Press the \"Launch TV app\" button. Verify that the playback control is available.
+    Pause the playback and then resume it.
+    </string>
+    <string name="tv_time_shift_test_verify_resume_after_pause">
+    The playback should be resumed after pause.
+    </string>
+    <string name="tv_time_shift_test_verify_position_tracking">
+    The playback position tracking should be activated.
+    </string>
+    <string name="tv_time_shift_test_speed_rate">
+    Press the \"Launch TV app\" button. Verify that the playback control is available.
+    Rewind the playback and in a few seconds fast-forward it.
+    </string>
+    <string name="tv_time_shift_test_verify_rewind">
+    The playback should be rewinded.
+    </string>
+    <string name="tv_time_shift_test_verify_fast_forward">
+    The playback should be fast-forwarded.
+    </string>
+    <string name="tv_time_shift_test_seek">
+    Press the \"Launch TV app\" button. Verify that the playback control is available.
+    Seek to previous and then seek to next.
+    </string>
+    <string name="tv_time_shift_test_verify_seek_to_previous">
+    The playback position should be moved to the previous position.
+    </string>
+    <string name="tv_time_shift_test_verify_seek_to_next">
+    The playback position should be moved to the next position.
+    </string>
+
     <string name="overlay_view_text">Overlay View Dummy Text</string>
     <string name="fake_rating">Fake</string>
 
@@ -1580,4 +1975,116 @@
     <string name="error_screen_pinning_did_not_start">Screen was not pinned.</string>
     <string name="error_screen_pinning_did_not_exit">Screen was not unpinned.</string>
     <string name="error_screen_pinning_couldnt_exit">Could not exit screen pinning through API.</string>
+
+    <!--  Audio Devices Notifcations Test -->
+    <string name="audio_devices_notifications_test">Audio Devices Notifications Test</string>
+    <string name="audio_devices_notification_instructions">
+          Click the "Clear Messages" button then connect and disconnect a wired headset.
+          Note if the appropriate notification messages appear below.
+    </string>
+    <string name="audio_dev_notification_clearmsgs">Clear Messages</string>
+    <string name="audio_dev_notification_connectMsg">CONNECT DETECTED</string>
+    <string name="audio_dev_notification_disconnectMsg">DISCONNECT DETECTED</string>
+
+    <!--  Audio Routing Notifcations Test -->
+    <string name="audio_routingnotifications_test">Audio Routing Notifications Test</string>
+    <string name="audio_dev_routingnotification_instructions">
+          Click on the "Play" button in the AudioTrack Routing Notifictions section below to
+          start (silent) playback. Insert a wired headset. Observe a message acknowledging the
+          rerouting event below. Remove the wired headset and observe the new routing message.
+          Click on the "Stop" button to stop playback.\n
+          Repeat the process with "Record" and "Stop" button in the AudioRecord Routing
+          Notifications section below.
+    </string>
+    <string name="audio_routingnotification_playBtn">Play</string>
+    <string name="audio_routingnotification_playStopBtn">Stop</string>
+    <string name="audio_routingnotification_recBtn">Record</string>
+    <string name="audio_routingnotification_recStopBtn">Stop</string>
+    <string name="audio_routingnotification_playHeader">AudioTrack Routing Notifications</string>
+    <string name="audio_routingnotification_recHeader">AudioRecord Routing Notifications</string>
+    <string name="audio_routingnotification_trackRoutingMsg">AudioTrack rerouting</string>
+    <string name="audio_routingnotification_recordRoutingMsg">AudioRecord rerouting</string>
+
+    <!-- Audio Loopback Latency Test -->
+    <string name="audio_loopback_test">Audio Loopback Latency Test</string>
+     <string name="audio_loopback_info">
+          This test requires the Loopback Plug. Please connect a Loopback Plug on the headset
+          connector, and proceed with the instructions on the screen.
+          The system will measure the input-output audio latency by injecting a pulse on the output,
+          and computing the distance between replicas of the pulse.
+          You can vary the Audio Level slider to ensure the pulse will feed back at adecuate levels.
+          Repeat until a confidence level >= 0.6 is achieved.
+    </string>
+    <string name="audio_loopback_instructions">
+          Please connect a "Loopback Plug" and press "Loopback Plug Ready".
+    </string>
+    <string name="audio_loopback_plug_ready_btn">Loopback Plug Ready</string>
+    <string name="audio_loopback_instructions2">
+          Set the audio level to a suitable value, then press Test button.
+          It might require multiple tries until a confidence >= 0.6 is achieved.
+    </string>
+    <string name="audio_loopback_level_text">Audio Level</string>
+    <string name="audio_loopback_test_btn">Test</string>
+    <string name="audio_loopback_results_text">Results...</string>
+
+   <!-- Audio Frequency Line Test -->
+    <string name="audio_frequency_line_test">Audio Frequency Line Test</string>
+    <string name="audio_frequency_line_info">
+        The system will measure the frequency response of the left and right line outputs,
+        by feeding them back thru the microphone conection with the loopback jack.
+        This test requires the Loopback Plug. Please connect a Loopback Plug on the headset
+        connector, and proceed with the instructions on the screen.
+        </string>
+    <string name="audio_frequency_line_instructions">
+          Please connect a "Loopback Plug" and press "Loopback Plug Ready".
+    </string>
+    <string name="audio_frequency_line_plug_ready_btn">Loopback Plug Ready</string>
+
+    <string name="audio_frequency_line_test_btn">Test</string>
+    <string name="audio_frequency_line_results_text">Results...</string>
+
+    <!-- Audio Frequency Speaker Test -->
+    <string name="audio_frequency_speaker_test">Audio Frequency Speaker Test</string>
+    <string name="audio_frequency_speaker_info">
+        This test requires an external USB reference microphone. Please connect the USB microphone and proceed with the instructions on the screen.
+        The system will measure frequency response of the left and right speakers (if there are two speakers), or twice the response of the mono speaker.
+       </string>
+    <string name="audio_frequency_speaker_instructions">
+          Please connect an USB reference microphone and press "USB Reference microphone ready"
+    </string>
+    <string name="audio_frequency_speaker_usb_status">Waiting for USB microphone...</string>
+    <string name="audio_frequency_speaker_mic_ready_btn">USB Reference microphone ready</string>
+    <string name="audio_frequency_speaker_mic_ready_text">USB Audio device detected\n\nPlease set up Device Under test
+    in quiet room, and Microphone 20 cms perpendicular to center of screen, then press TEST</string>
+    <string name="audio_frequency_speaker_mic_not_ready_text">"No USB Audio device detected. Please reconnect."</string>
+    <string name="audio_frequency_speaker_test_btn">Test</string>
+    <string name="audio_frequency_speaker_results_text">Results...</string>
+
+    <!-- Audio Frequency Microphone Test -->
+    <string name="audio_frequency_mic_test">Audio Frequency Microphone Test</string>
+    <string name="audio_frequency_mic_info">
+        This test requires an external USB reference microphone and external speakers.
+        Please use the headphone connector to connect external speakers. Position the device 40 cms
+        from the speakers and proceed with the instructions on the screen.
+        The system will measure frequency response of the built in microphone.
+       </string>
+    <string name="audio_frequency_mic_instructions">
+          Please connect external speakers using the headphone connector. Please unplug any USB audio device (if any)
+    </string>
+    <string name="audio_frequency_mic_speakers_ready_btn">External speakers ready</string>
+    <string name="audio_frequency_mic_speakers_ready_status">...</string>
+    <string name="audio_frequency_mic_instructions2">
+          Please position the speakers 40 cms from the device under test and press TEST 1
+    </string>
+    <string name="audio_frequency_mic_test1_btn">Test 1</string>
+    <string name="audio_frequency_mic_usb_status">Waiting for USB microphone...</string>
+    <string name="audio_frequency_mic_connect_mic">Please Connect USB microphone, position it next to
+    the built in microphone in the device and press USB reference microphone</string>
+    <string name="audio_frequency_mic_mic_ready_btn">USB Reference microphone ready</string>
+    <string name="audio_frequency_mic_mic_ready_text">USB Audio device detected\n\nPlease set up Device Under test
+    in quiet room, and Microphone 20 cms perpendicular to center of screen, then press TEST</string>
+    <string name="audio_frequency_mic_mic_not_ready_text">"No USB Audio device detected. Please reconnect."</string>
+    <string name="audio_frequency_mic_test2_btn">Test 2</string>
+    <string name="audio_frequency_mic_results_text">Results...</string>
+
 </resources>
diff --git a/apps/CtsVerifier/res/xml/device_admin_byod.xml b/apps/CtsVerifier/res/xml/device_admin_byod.xml
index 0408ce2..ce44794 100644
--- a/apps/CtsVerifier/res/xml/device_admin_byod.xml
+++ b/apps/CtsVerifier/res/xml/device_admin_byod.xml
@@ -19,6 +19,9 @@
     <uses-policies>
         <encrypted-storage />
         <wipe-data />
+        <reset-password />
+        <disable-keyguard-features />
+        <force-lock />
     </uses-policies>
 </device-admin>
 <!-- END_INCLUDE(meta_data) -->
diff --git a/apps/CtsVerifier/res/xml/mock_tv_input_service.xml b/apps/CtsVerifier/res/xml/mock_tv_input_service.xml
index 1a2cf86..d9cb867 100644
--- a/apps/CtsVerifier/res/xml/mock_tv_input_service.xml
+++ b/apps/CtsVerifier/res/xml/mock_tv_input_service.xml
@@ -15,5 +15,4 @@
 -->
 
 <tv-input xmlns:android="http://schemas.android.com/apk/res/android"
-    android:setupActivity="com.android.cts.verifier.tv.MockTvInputSetupActivity"
-    android:settingsActivity="com.android.cts.verifier.tv.MockTvInputSettingsActivity" />
+    android:setupActivity="com.android.cts.verifier.tv.MockTvInputSetupActivity" />
diff --git a/apps/CtsVerifier/res/xml/ultrasound_line_formatter_median.xml b/apps/CtsVerifier/res/xml/ultrasound_line_formatter_median.xml
new file mode 100644
index 0000000..9c6de77
--- /dev/null
+++ b/apps/CtsVerifier/res/xml/ultrasound_line_formatter_median.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<config
+        linePaint.strokeWidth="3dp"
+        linePaint.color="#AA0000"
+        vertexPaint.color="#770000"
+        fillPaint.color="#00000000" />
diff --git a/apps/CtsVerifier/res/xml/ultrasound_line_formatter_noise.xml b/apps/CtsVerifier/res/xml/ultrasound_line_formatter_noise.xml
new file mode 100644
index 0000000..8fb236e
--- /dev/null
+++ b/apps/CtsVerifier/res/xml/ultrasound_line_formatter_noise.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<config
+        linePaint.strokeWidth="2dp"
+        linePaint.color="#777777"
+        vertexPaint.color="777777"
+        fillPaint.color="#00000000" />
diff --git a/apps/CtsVerifier/res/xml/ultrasound_line_formatter_pass.xml b/apps/CtsVerifier/res/xml/ultrasound_line_formatter_pass.xml
new file mode 100644
index 0000000..9a6c29a
--- /dev/null
+++ b/apps/CtsVerifier/res/xml/ultrasound_line_formatter_pass.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<config
+        linePaint.strokeWidth="2dp"
+        linePaint.color="#007700"
+        vertexPaint.color="#007700"
+        fillPaint.color="#00000000" />
diff --git a/apps/CtsVerifier/res/xml/ultrasound_line_formatter_trials.xml b/apps/CtsVerifier/res/xml/ultrasound_line_formatter_trials.xml
new file mode 100644
index 0000000..3f9ffc2
--- /dev/null
+++ b/apps/CtsVerifier/res/xml/ultrasound_line_formatter_trials.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<config
+        linePaint.strokeWidth="1dp"
+        linePaint.color="#AAAAAA"
+        vertexPaint.color="#777777"
+        fillPaint.color="#00000000" />
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/AbstractTestListActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/AbstractTestListActivity.java
index 409b0db..3132219 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/AbstractTestListActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/AbstractTestListActivity.java
@@ -44,8 +44,13 @@
     }
 
     @Override
-    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+    protected final void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
+        handleActivityResult(requestCode, resultCode, data);
+    }
+
+    /** Override this in subclasses instead of onActivityResult */
+    protected void handleActivityResult(int requestCode, int resultCode, Intent data) {
         switch (requestCode) {
             case LAUNCH_TEST_REQUEST_CODE:
                 handleLaunchTestResult(resultCode, data);
@@ -66,7 +71,7 @@
         setContentView(R.layout.list_content);
     }
 
-    private void handleLaunchTestResult(int resultCode, Intent data) {
+    protected void handleLaunchTestResult(int resultCode, Intent data) {
         if (resultCode == RESULT_OK) {
             TestResult testResult = TestResult.fromActivityResult(resultCode, data);
             mAdapter.setTestResult(testResult);
@@ -75,8 +80,13 @@
 
     /** Launch the activity when its {@link ListView} item is clicked. */
     @Override
-    protected void onListItemClick(ListView listView, View view, int position, long id) {
+    protected final void onListItemClick(ListView listView, View view, int position, long id) {
         super.onListItemClick(listView, view, position, id);
+        handleItemClick(listView, view, position, id);
+    }
+
+    /** Override this in subclasses instead of onListItemClick */
+    protected void handleItemClick(ListView listView, View view, int position, long id) {
         Intent intent = getIntent(position);
         startActivityForResult(intent, LAUNCH_TEST_REQUEST_CODE);
     }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/DialogTestListActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/DialogTestListActivity.java
new file mode 100644
index 0000000..789effa
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/DialogTestListActivity.java
@@ -0,0 +1,276 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier;
+
+import android.app.AlertDialog;
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.database.DataSetObserver;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.android.cts.verifier.R;
+
+/**
+ * Test list activity that supports showing dialogs with pass/fail buttons instead of
+ * starting new activities.
+ * In addition to that dialogs have a 'go' button that can be configured to launch an intent.
+ * Instructions are shown on top of the screen and a test preparation button is provided.
+ */
+public abstract class DialogTestListActivity extends PassFailButtons.TestListActivity {
+    private final int mLayoutId;
+    private final int mTitleStringId;
+    private final int mInfoStringId;
+    private final int mInstructionsStringId;
+
+    protected Button mPrepareTestButton;
+
+    protected int mCurrentTestPosition;
+
+    protected DialogTestListActivity(int layoutId, int titleStringId, int infoStringId,
+            int instructionsStringId) {
+        mLayoutId = layoutId;
+        mTitleStringId = titleStringId;
+        mInfoStringId = infoStringId;
+        mInstructionsStringId = instructionsStringId;
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(mLayoutId);
+        setInfoResources(mTitleStringId, mInfoStringId, -1);
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(false);
+        setResult(RESULT_CANCELED);
+
+        ArrayTestListAdapter adapter = new ArrayTestListAdapter(this);
+
+        setupTests(adapter);
+
+        adapter.registerDataSetObserver(new DataSetObserver() {
+            @Override
+            public void onChanged() {
+                updatePassButton();
+            }
+        });
+
+        setTestListAdapter(adapter);
+
+        mCurrentTestPosition = 0;
+
+        TextView instructionTextView = (TextView)findViewById(R.id.test_instructions);
+        instructionTextView.setText(mInstructionsStringId);
+        mPrepareTestButton = (Button)findViewById(R.id.prepare_test_button);
+    }
+
+    /**
+     * Subclasses must add their tests items to the provided adapter(usually instances of
+     * {@link DialogTestListItem} or {@link DialogTestListItemWithIcon} but any class deriving from
+     * {@link TestListAdapter.TestListItem} will do).
+     * @param adapter The adapter to add test items to.
+     */
+    protected abstract void setupTests(ArrayTestListAdapter adapter);
+
+    // Enable Pass Button when all tests passed.
+    private void updatePassButton() {
+        getPassButton().setEnabled(mAdapter.allTestsPassed());
+    }
+
+    public class DefaultTestCallback implements DialogTestListItem.TestCallback {
+        final private DialogTestListItem mTest;
+
+        public DefaultTestCallback(DialogTestListItem test) {
+            mTest = test;
+        }
+
+        @Override
+        public void onPass() {
+            clearRemainingState(mTest);
+            setTestResult(mTest, TestResult.TEST_RESULT_PASSED);
+        }
+
+        @Override
+        public void onFail() {
+            clearRemainingState(mTest);
+            setTestResult(mTest, TestResult.TEST_RESULT_FAILED);
+        }
+    }
+
+    public void showManualTestDialog(final DialogTestListItem test) {
+        showManualTestDialog(test, new DefaultTestCallback(test));
+    }
+
+    public void showManualTestDialog(final DialogTestListItem test,
+            final DialogTestListItem.TestCallback callback) {
+        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this)
+                .setIcon(android.R.drawable.ic_dialog_info)
+                .setTitle(mTitleStringId)
+                .setNeutralButton(R.string.go_button_text, null)
+                .setPositiveButton(R.string.pass_button_text, new AlertDialog.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        callback.onPass();
+                    }
+                })
+                .setNegativeButton(R.string.fail_button_text, new AlertDialog.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        callback.onFail();
+                    }
+                });
+        View customView = test.getCustomView();
+        if (customView != null) {
+            dialogBuilder.setView(customView);
+        } else {
+            dialogBuilder.setMessage(test.getManualTestInstruction());
+        }
+        final AlertDialog dialog = dialogBuilder.show();
+        // Note: Setting the OnClickListener on the Dialog rather than the Builder, prevents the
+        // dialog being dismissed on onClick.
+        dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (!startTestIntent(test)) {
+                    dialog.dismiss();
+                }
+            }
+        });
+    }
+
+    @Override
+    protected void handleItemClick(ListView l, View v, int position, long id) {
+        TestListAdapter.TestListItem test = (TestListAdapter.TestListItem) getListAdapter()
+                .getItem(position);
+        if (test instanceof DialogTestListItem) {
+            mCurrentTestPosition = position;
+            ((DialogTestListItem)test).performTest(this);
+        } else {
+            super.handleItemClick(l, v, position, id);
+        }
+    }
+
+
+    /**
+     * Start a test's manual intent
+     * @param test The test the manual intent of which is to be started.
+     * @return true if activity could be started successfully, false otherwise.
+     */
+    boolean startTestIntent(final DialogTestListItem test) {
+        final Intent intent = test.intent;
+        try {
+            startActivity(intent);
+        } catch (ActivityNotFoundException e) {
+            Toast.makeText(this, "Cannot start " + intent, Toast.LENGTH_LONG).show();
+            setTestResult(test, TestResult.TEST_RESULT_FAILED);
+            return false;
+        }
+        return true;
+    }
+
+    protected void clearRemainingState(final DialogTestListItem test) {
+        // do nothing, override in subclass if needed
+    }
+
+    protected void setTestResult(DialogTestListItem test, int result) {
+        // Bundle result in an intent to feed into handleLaunchTestResult
+        Intent resultIntent = new Intent();
+        TestResult.addResultData(resultIntent, result, test.testName, /* testDetails */ null,
+                /* reportLog */ null);
+        handleLaunchTestResult(RESULT_OK, resultIntent);
+        getListView().smoothScrollToPosition(mCurrentTestPosition + 1);
+    }
+
+    protected void showToast(int messageId) {
+        String message = getString(messageId);
+        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
+    }
+
+    protected static class DialogTestListItem extends TestListAdapter.TestListItem {
+
+        public interface TestCallback {
+            void onPass();
+            void onFail();
+        }
+
+        private String mManualInstruction;
+
+        public DialogTestListItem(Context context, int nameResId, String testId) {
+            super(context.getString(nameResId), testId, null, null, null, null);
+        }
+
+        public DialogTestListItem(Context context, int nameResId, String testId,
+                int testInstructionResId, Intent testIntent) {
+            super(context.getString(nameResId), testId, testIntent, null, null, null);
+            mManualInstruction = context.getString(testInstructionResId);
+        }
+
+        public void performTest(DialogTestListActivity activity) {
+            activity.showManualTestDialog(this);
+        }
+
+        public String getManualTestInstruction() {
+            return mManualInstruction;
+        }
+
+        public Intent getManualTestIntent() {
+            return intent;
+        }
+
+        public View getCustomView() {
+            return null;
+        }
+
+        @Override
+        boolean isTest() {
+            return true;
+        }
+    }
+
+    protected static class DialogTestListItemWithIcon extends DialogTestListItem {
+
+        private final int mImageResId;
+        private final Context mContext;
+
+        public DialogTestListItemWithIcon(Context context, int nameResId, String testId,
+                int testInstructionResId, Intent testIntent, int imageResId) {
+            super(context, nameResId, testId, testInstructionResId, testIntent);
+            mContext = context;
+            mImageResId = imageResId;
+        }
+
+        @Override
+        public View getCustomView() {
+            LayoutInflater layoutInflater = LayoutInflater.from(mContext);
+            View view = layoutInflater.inflate(R.layout.dialog_custom_view,
+                    null /* root */);
+            ((ImageView) view.findViewById(R.id.sample_icon)).setImageResource(mImageResId);
+            ((TextView) view.findViewById(R.id.message)).setText(getManualTestInstruction());
+            return view;
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/TestListActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/TestListActivity.java
index 8cfc6df..976ff32 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/TestListActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/TestListActivity.java
@@ -16,8 +16,10 @@
 
 package com.android.cts.verifier;
 
+import android.Manifest;
 import android.app.ListActivity;
 import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.Menu;
@@ -32,6 +34,20 @@
 /** Top-level {@link ListActivity} for launching tests and managing results. */
 public class TestListActivity extends AbstractTestListActivity implements View.OnClickListener {
 
+    private static final String [] RUNTIME_PERMISSIONS = {
+        Manifest.permission.ACCESS_FINE_LOCATION,
+        Manifest.permission.BODY_SENSORS,
+        Manifest.permission.READ_EXTERNAL_STORAGE,
+        Manifest.permission.READ_PHONE_STATE,
+        Manifest.permission.CALL_PHONE,
+        Manifest.permission.WRITE_CONTACTS,
+        Manifest.permission.CAMERA,
+        Manifest.permission.WRITE_EXTERNAL_STORAGE,
+        Manifest.permission.RECORD_AUDIO,
+        Manifest.permission.READ_CONTACTS
+    };
+    private static final int CTS_VERIFIER_PERMISSION_REQUEST = 1;
+
     private static final String TAG = TestListActivity.class.getSimpleName();
 
     @Override
@@ -43,6 +59,18 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
+        for (String runtimePermission : RUNTIME_PERMISSIONS) {
+            Log.v(TAG, "Checking permissions for: " + runtimePermission);
+            if (checkSelfPermission(runtimePermission) != PackageManager.PERMISSION_GRANTED) {
+                requestPermissions(RUNTIME_PERMISSIONS, CTS_VERIFIER_PERMISSION_REQUEST);
+                return;
+            }
+
+        }
+        createContinue();
+    }
+
+    private void createContinue() {
         if (!isTaskRoot()) {
             finish();
         }
@@ -63,6 +91,19 @@
     }
 
     @Override
+    public void onRequestPermissionsResult(
+            int requestCode, String permissions[], int[] grantResults) {
+        if (requestCode == CTS_VERIFIER_PERMISSION_REQUEST) {
+            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+                createContinue();
+                return;
+            }
+            Log.v(TAG, "Permission not granted.");
+            Toast.makeText(this, R.string.runtime_permissions_error, Toast.LENGTH_SHORT).show();
+        }
+    }
+
+    @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         MenuInflater inflater = getMenuInflater();
         inflater.inflate(R.menu.test_list_menu, menu);
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/TestListAdapter.java b/apps/CtsVerifier/src/com/android/cts/verifier/TestListAdapter.java
index 2160902..ce092cc 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/TestListAdapter.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/TestListAdapter.java
@@ -141,7 +141,7 @@
             return new TestListItem(title, null, null, null, null, null);
         }
 
-        private TestListItem(String title, String testName, Intent intent,
+        protected TestListItem(String title, String testName, Intent intent,
                 String[] requiredFeatures, String[] excludedFeatures, String[] applicableFeatures) {
             this.title = title;
             this.testName = testName;
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/TestResult.java b/apps/CtsVerifier/src/com/android/cts/verifier/TestResult.java
index d8a675c..c5d2d52 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/TestResult.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/TestResult.java
@@ -71,13 +71,18 @@
     private static Intent createResult(Activity activity, int testResult, String testName,
             String testDetails, ReportLog reportLog) {
         Intent data = new Intent(activity, activity.getClass());
-        data.putExtra(TEST_NAME, testName);
-        data.putExtra(TEST_RESULT, testResult);
-        data.putExtra(TEST_DETAILS, testDetails);
-        data.putExtra(TEST_METRICS, reportLog);
+        addResultData(data, testResult, testName, testDetails, reportLog);
         return data;
     }
 
+    public static void addResultData(Intent intent, int testResult, String testName,
+            String testDetails, ReportLog reportLog) {
+        intent.putExtra(TEST_NAME, testName);
+        intent.putExtra(TEST_RESULT, testResult);
+        intent.putExtra(TEST_DETAILS, testDetails);
+        intent.putExtra(TEST_METRICS, reportLog);
+    }
+
     /**
      * Convert the test activity's result into a {@link TestResult}. Only meant to be used by
      * {@link TestListActivity}.
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsReport.java b/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsReport.java
index dc2502c..05c5e77 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsReport.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsReport.java
@@ -96,6 +96,7 @@
         xml.startTag(null, VERIFIER_INFO_TAG);
         xml.attribute(null, "version-name", Version.getVersionName(mContext));
         xml.attribute(null, "version-code", Integer.toString(Version.getVersionCode(mContext)));
+        xml.attribute(null, "build", Version.getBuildNumber(mContext));
         xml.endTag(null, VERIFIER_INFO_TAG);
 
         xml.startTag(null, DEVICE_INFO_TAG);
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/Version.java b/apps/CtsVerifier/src/com/android/cts/verifier/Version.java
index e7b6121..dfe9508 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/Version.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/Version.java
@@ -24,13 +24,21 @@
 class Version {
 
     static String getVersionName(Context context) {
-        return getPackageInfo(context).versionName;
+        return getVersionNameStrings(context)[0];
     }
 
     static int getVersionCode(Context context) {
         return getPackageInfo(context).versionCode;
     }
 
+    static String getBuildNumber(Context context) {
+        return getVersionNameStrings(context)[1];
+    }
+
+    static private String[] getVersionNameStrings(Context context) {
+        return getPackageInfo(context).versionName.split(" ");
+    }
+
     static PackageInfo getPackageInfo(Context context) {
         try {
             PackageManager packageManager = context.getPackageManager();
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioBandSpecs.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioBandSpecs.java
new file mode 100644
index 0000000..9af4af1
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioBandSpecs.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio;
+
+public class AudioBandSpecs {
+    double mFreqStart;
+    double mFreqStop;
+    double mRippleStartTop;
+    double mRippleStartBottom;
+
+    double mRippleStopTop;
+    double mRippleStopBottom;
+
+    double mOffset;
+
+    public AudioBandSpecs(double fStart, double fStop, double startTop, double startBottom,
+            double stopTop, double stopBottom) {
+        initFreq(fStart, fStop);
+        initRipple(startTop, startBottom, stopTop, stopBottom);
+        setOffset(0);
+    }
+
+    public void initRipple(double startTop, double startBottom, double stopTop, double stopBottom) {
+        mRippleStartTop = startTop;
+        mRippleStartBottom = startBottom;
+        mRippleStopTop = stopTop;
+        mRippleStopBottom = stopBottom;
+        // note: top should be >= bottom, but no check is done here.
+    }
+
+    public void initFreq(double fStart, double fStop) {
+        mFreqStart = fStart;
+        mFreqStop = fStop;
+    }
+
+    public void setOffset(double offset) {
+        mOffset = offset;
+    }
+
+    /**
+     * Check if the given point is in bounds in this band.
+     */
+    public boolean isInBounds(double freq, double value) {
+        if (freq < mFreqStart || freq > mFreqStop) {
+            return false;
+        }
+
+        double d = mFreqStop - mFreqStart;
+        if (d <= 0) {
+            return false;
+        }
+
+        double e = freq - mFreqStart;
+        double vTop = (e / d) * (mRippleStopTop - mRippleStartTop) + mRippleStartTop + mOffset;
+        if (value > vTop) {
+            return false;
+        }
+
+        double vBottom = (e / d) * (mRippleStopBottom - mRippleStartBottom) + mRippleStartBottom
+                + mOffset;
+
+        if (value < vBottom) {
+            return false;
+        }
+        return true;
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(String.format("Freq %.1f - %.1f |", mFreqStart, mFreqStop));
+        sb.append(String.format("start [%.1f : %.1f] |", mRippleStartTop, mRippleStartBottom));
+        sb.append(String.format("stop  [%.1f : %.1f] |", mRippleStopTop, mRippleStopBottom));
+        sb.append(String.format("offset %.1f", mOffset));
+        return sb.toString();
+    }
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioDeviceNotificationsActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioDeviceNotificationsActivity.java
new file mode 100644
index 0000000..93e0507
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioDeviceNotificationsActivity.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.content.Context;
+
+import android.media.AudioDeviceCallback;
+import android.media.AudioDeviceInfo;
+import android.media.AudioManager;
+
+import android.os.Bundle;
+
+import android.view.View;
+import android.view.View.OnClickListener;
+
+import android.widget.Button;
+import android.widget.TextView;
+
+/**
+ * Tests Audio Device Connection events by prompting the user to insert/remove a wired headset
+ * and noting the presence (or absence) of notifictions.
+ */
+public class AudioDeviceNotificationsActivity extends PassFailButtons.Activity {
+    Context mContext;
+
+    TextView mConnectView;
+    TextView mDisconnectView;
+    Button mClearMsgsBtn;
+
+    private class TestAudioDeviceCallback extends AudioDeviceCallback {
+        public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
+            if (addedDevices.length != 0) {
+                mConnectView.setText(
+                    mContext.getResources().getString(R.string.audio_dev_notification_connectMsg));
+            }
+        }
+
+        public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
+            if (removedDevices.length != 0) {
+                mDisconnectView.setText(
+                    mContext.getResources().getString(
+                        R.string.audio_dev_notification_disconnectMsg));
+            }
+        }
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.audio_dev_notify);
+
+        mContext = this;
+
+        mConnectView = (TextView)findViewById(R.id.audio_dev_notification_connect_msg);
+        mDisconnectView = (TextView)findViewById(R.id.audio_dev_notification_disconnect_msg);
+
+        mClearMsgsBtn = (Button)findViewById(R.id.audio_dev_notification_connect_clearmsgs_btn);
+        mClearMsgsBtn.setOnClickListener(new View.OnClickListener() {
+            public void onClick(View v) {
+                mConnectView.setText("");
+                mDisconnectView.setText("");
+            }
+        });
+
+        AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
+        audioManager.registerAudioDeviceCallback(new TestAudioDeviceCallback(), null);
+
+        setPassFailButtonClickListeners();
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioFrequencyLineActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioFrequencyLineActivity.java
new file mode 100644
index 0000000..d3e2571
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioFrequencyLineActivity.java
@@ -0,0 +1,664 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.audio.wavelib.*;
+import com.android.compatibility.common.util.ReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
+import android.content.Context;
+
+import android.media.AudioDeviceCallback;
+import android.media.AudioDeviceInfo;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+import android.media.AudioRecord;
+import android.media.MediaRecorder;
+
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.SystemClock;
+
+import android.util.Log;
+
+import android.view.View;
+import android.view.View.OnClickListener;
+
+import android.widget.Button;
+import android.widget.TextView;
+import android.widget.SeekBar;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+
+/**
+ * Tests Audio Device roundtrip latency by using a loopback plug.
+ */
+public class AudioFrequencyLineActivity extends PassFailButtons.Activity implements Runnable,
+    AudioRecord.OnRecordPositionUpdateListener {
+    private static final String TAG = "AudioFrequencyLineActivity";
+
+    static final int TEST_STARTED = 900;
+    static final int TEST_ENDED = 901;
+    static final int TEST_MESSAGE = 902;
+    static final double MIN_ENERGY_BAND_1 = -20.0;
+    static final double MIN_FRACTION_POINTS_IN_BAND = 0.3;
+
+    OnBtnClickListener mBtnClickListener = new OnBtnClickListener();
+    Context mContext;
+
+    Button mLoopbackPlugReady;
+    LinearLayout mLinearLayout;
+    Button mTestButton;
+    TextView mResultText;
+    ProgressBar mProgressBar;
+    //recording
+    private boolean mIsRecording = false;
+    private final Object mRecordingLock = new Object();
+    private AudioRecord mRecorder;
+    private int mMinRecordBufferSizeInSamples = 0;
+    private short[] mAudioShortArray;
+    private short[] mAudioShortArray2;
+
+    private final int mBlockSizeSamples = 1024;
+    private final int mSamplingRate = 48000;
+    private final int mSelectedRecordSource = MediaRecorder.AudioSource.VOICE_RECOGNITION;
+    private final int mChannelConfig = AudioFormat.CHANNEL_IN_MONO;
+    private final int mAudioFormat = AudioFormat.ENCODING_PCM_16BIT;
+    private volatile Thread mRecordThread;
+    private boolean mRecordThreadShutdown = false;
+
+    PipeShort mPipe = new PipeShort(65536);
+    SoundPlayerObject mSPlayer;
+
+    private DspBufferComplex mC;
+    private DspBufferDouble mData;
+
+    private DspWindow mWindow;
+    private DspFftServer mFftServer;
+    private VectorAverage mFreqAverageMain = new VectorAverage();
+
+    private VectorAverage mFreqAverage0 = new VectorAverage();
+    private VectorAverage mFreqAverage1 = new VectorAverage();
+
+    private int mCurrentTest = -1;
+    int mBands = 4;
+    AudioBandSpecs[] bandSpecsArray = new AudioBandSpecs[mBands];
+
+    int mMaxLevel;
+    private class OnBtnClickListener implements OnClickListener {
+        @Override
+        public void onClick(View v) {
+            switch (v.getId()) {
+                case R.id.audio_frequency_line_plug_ready_btn:
+                    Log.i(TAG, "audio loopback plug ready");
+                    //enable all the other views.
+                    enableLayout(true);
+                    break;
+                case R.id.audio_frequency_line_test_btn:
+                    Log.i(TAG, "audio loopback test");
+                    startAudioTest();
+                    break;
+            }
+        }
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.audio_frequency_line_activity);
+
+        mContext = this;
+
+        mLoopbackPlugReady = (Button)findViewById(R.id.audio_frequency_line_plug_ready_btn);
+        mLoopbackPlugReady.setOnClickListener(mBtnClickListener);
+        mLinearLayout = (LinearLayout)findViewById(R.id.audio_frequency_line_layout);
+        mTestButton = (Button)findViewById(R.id.audio_frequency_line_test_btn);
+        mTestButton.setOnClickListener(mBtnClickListener);
+        mResultText = (TextView)findViewById(R.id.audio_frequency_line_results_text);
+        mProgressBar = (ProgressBar)findViewById(R.id.audio_frequency_line_progress_bar);
+        showWait(false);
+        enableLayout(false);         //disabled all content
+
+        mSPlayer = new SoundPlayerObject();
+        mSPlayer.setSoundWithResId(getApplicationContext(), R.raw.stereo_mono_white_noise_48);
+        mSPlayer.setBalance(0.5f);
+
+        //Init FFT stuff
+        mAudioShortArray2 = new short[mBlockSizeSamples*2];
+        mData = new DspBufferDouble(mBlockSizeSamples);
+        mC = new DspBufferComplex(mBlockSizeSamples);
+        mFftServer = new DspFftServer(mBlockSizeSamples);
+
+        int overlap = mBlockSizeSamples / 2;
+
+        mWindow = new DspWindow(DspWindow.WINDOW_HANNING, mBlockSizeSamples, overlap);
+
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(false);
+        setInfoResources(R.string.audio_frequency_line_test,
+                R.string.audio_frequency_line_info, -1);
+
+        //Init bands
+        bandSpecsArray[0] = new AudioBandSpecs(
+                50, 500,        /* frequency start,stop */
+                -20.0, -50,     /* start top,bottom value */
+                4.0, -4.0       /* stop top,bottom value */);
+
+        bandSpecsArray[1] = new AudioBandSpecs(
+                500,4000,       /* frequency start,stop */
+                4.0, -4.0,      /* start top,bottom value */
+                4.0, -4.0        /* stop top,bottom value */);
+
+        bandSpecsArray[2] = new AudioBandSpecs(
+                4000, 12000,    /* frequency start,stop */
+                4.0, -4.0,      /* start top,bottom value */
+                5.0, -5.0       /* stop top,bottom value */);
+
+        bandSpecsArray[3] = new AudioBandSpecs(
+                12000, 20000,   /* frequency start,stop */
+                5.0, -5.0,      /* start top,bottom value */
+                5.0, -30.0      /* stop top,bottom value */);
+    }
+
+    /**
+     * enable test ui elements
+     */
+    private void enableLayout(boolean enable) {
+        for (int i = 0; i < mLinearLayout.getChildCount(); i++) {
+            View view = mLinearLayout.getChildAt(i);
+            view.setEnabled(enable);
+        }
+    }
+
+    /**
+     * show active progress bar
+     */
+    private void showWait(boolean show) {
+        if (show) {
+            mProgressBar.setVisibility(View.VISIBLE);
+        } else {
+            mProgressBar.setVisibility(View.INVISIBLE);
+        }
+    }
+
+    private void setMaxLevel() {
+        AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+        mMaxLevel = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
+        am.setStreamVolume(AudioManager.STREAM_MUSIC, (int)(mMaxLevel), 0);
+    }
+
+    /**
+     *  Start the loopback audio test
+     */
+    private void startAudioTest() {
+        if (mTestThread != null && !mTestThread.isAlive()) {
+            mTestThread = null; //kill it.
+        }
+
+        if (mTestThread == null) {
+            Log.v(TAG,"Executing test Thread");
+            mTestThread = new Thread(mPlayRunnable);
+            getPassButton().setEnabled(false);
+            if (!mSPlayer.isAlive())
+                mSPlayer.start();
+            mTestThread.start();
+        } else {
+            Log.v(TAG,"test Thread already running.");
+        }
+    }
+
+    Thread mTestThread;
+    Runnable mPlayRunnable = new Runnable() {
+        public void run() {
+            Message msg = Message.obtain();
+            msg.what = TEST_STARTED;
+            mMessageHandler.sendMessage(msg);
+            setMaxLevel();
+
+            sendMessage("Testing Left Capture");
+            mCurrentTest = 0;
+            mFreqAverage0.reset();
+            mSPlayer.setBalance(0.0f);
+            play();
+
+            sendMessage("Testing Right Capture");
+            mCurrentTest = 1;
+            mFreqAverage1.reset();
+            mSPlayer.setBalance(1.0f);
+            play();
+
+            mCurrentTest = -1;
+            sendMessage("Testing Completed");
+
+            Message msg2 = Message.obtain();
+            msg2.what = TEST_ENDED;
+            mMessageHandler.sendMessage(msg2);
+        }
+
+        private void play() {
+            startRecording();
+            mSPlayer.play(true);
+
+            try {
+                Thread.sleep(2000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+
+            mSPlayer.play(false);
+            stopRecording();
+        }
+
+        private void sendMessage(String str) {
+            Message msg = Message.obtain();
+            msg.what = TEST_MESSAGE;
+            msg.obj = str;
+            mMessageHandler.sendMessage(msg);
+        }
+    };
+
+    private Handler mMessageHandler = new Handler() {
+        public void handleMessage(Message msg) {
+            super.handleMessage(msg);
+            switch (msg.what) {
+            case TEST_STARTED:
+                showWait(true);
+                getPassButton().setEnabled(false);
+                break;
+            case TEST_ENDED:
+                showWait(false);
+                computeResults();
+                break;
+            case TEST_MESSAGE:
+                String str = (String)msg.obj;
+                if (str != null) {
+                    mResultText.setText(str);
+                }
+                break;
+            default:
+                Log.e(TAG, String.format("Unknown message: %d", msg.what));
+            }
+        }
+    };
+
+    private class Results {
+        private String mLabel;
+        public double[] mValuesLog;
+        int[] mPointsPerBand = new int[mBands];
+        double[] mAverageEnergyPerBand = new double[mBands];
+        int[] mInBoundPointsPerBand = new int[mBands];
+        public Results(String label) {
+            mLabel = label;
+        }
+
+        //append results
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append(String.format("Channel %s\n", mLabel));
+            sb.append("Level in Band 1 : " + (testLevel() ? "OK" :"FAILED") +"\n");
+            for (int b = 0; b < mBands; b++) {
+                double percent = 0;
+                if (mPointsPerBand[b] > 0) {
+                    percent = 100.0 * (double)mInBoundPointsPerBand[b] / mPointsPerBand[b];
+                }
+                sb.append(String.format(
+                        " Band %d: Av. Level: %.1f dB InBand: %d/%d (%.1f%%) %s\n",
+                        b, mAverageEnergyPerBand[b],
+                        mInBoundPointsPerBand[b],
+                        mPointsPerBand[b],
+                        percent,
+                        (testInBand(b) ? "OK" : "FAILED")));
+            }
+            return sb.toString();
+        }
+
+        public boolean testLevel() {
+            if (mAverageEnergyPerBand[1] >= MIN_ENERGY_BAND_1) {
+                return true;
+            }
+            return false;
+        }
+
+        public boolean testInBand(int b) {
+            if (b >= 0 && b < mBands && mPointsPerBand[b] > 0) {
+                if ((double)mInBoundPointsPerBand[b] / mPointsPerBand[b] >
+                MIN_FRACTION_POINTS_IN_BAND)
+                    return true;
+            }
+            return false;
+        }
+
+        public boolean testAll() {
+            if (!testLevel()) {
+                return false;
+            }
+            for (int b = 0; b < mBands; b++) {
+                if (!testInBand(b)) {
+                    return false;
+                }
+            }
+            return true;
+        }
+    }
+
+    /**
+     * compute test results
+     */
+    private void computeResults() {
+        Results resultsLeft = new Results("Left");
+        computeResultsForVector(mFreqAverage0, resultsLeft);
+        Results resultsRight = new Results("Right");
+        computeResultsForVector(mFreqAverage1, resultsRight);
+        if (resultsLeft.testAll() && resultsRight.testAll()) {
+            //enable button
+            getPassButton().setEnabled(true);
+        }
+    }
+
+    private void computeResultsForVector(VectorAverage freqAverage,Results results) {
+
+        int points = freqAverage.getSize();
+        if (points > 0) {
+            //compute vector in db
+            double[] values = new double[points];
+            freqAverage.getData(values, false);
+            results.mValuesLog = new double[points];
+            for (int i = 0; i < points; i++) {
+                results.mValuesLog[i] = 20 * Math.log10(values[i]);
+            }
+
+            int currentBand = 0;
+            for (int i = 0; i < points; i++) {
+                double freq = (double)mSamplingRate * i / (double)mBlockSizeSamples;
+                if (freq > bandSpecsArray[currentBand].mFreqStop) {
+                    currentBand++;
+                    if (currentBand >= mBands)
+                        break;
+                }
+
+                if (freq >= bandSpecsArray[currentBand].mFreqStart) {
+                    results.mAverageEnergyPerBand[currentBand] += results.mValuesLog[i];
+                    results.mPointsPerBand[currentBand]++;
+                }
+            }
+
+            for (int b = 0; b < mBands; b++) {
+                if (results.mPointsPerBand[b] > 0) {
+                    results.mAverageEnergyPerBand[b] =
+                            results.mAverageEnergyPerBand[b] / results.mPointsPerBand[b];
+                }
+            }
+
+            //set offset relative to band 1 level
+            for (int b = 0; b < mBands; b++) {
+                bandSpecsArray[b].setOffset(results.mAverageEnergyPerBand[1]);
+            }
+
+            //test points in band.
+            currentBand = 0;
+            for (int i = 0; i < points; i++) {
+                double freq = (double)mSamplingRate * i / (double)mBlockSizeSamples;
+                if (freq >  bandSpecsArray[currentBand].mFreqStop) {
+                    currentBand++;
+                    if (currentBand >= mBands)
+                        break;
+                }
+
+                if (freq >= bandSpecsArray[currentBand].mFreqStart) {
+                    double value = results.mValuesLog[i];
+                    if (bandSpecsArray[currentBand].isInBounds(freq, value)) {
+                        results.mInBoundPointsPerBand[currentBand]++;
+                    }
+                }
+            }
+
+            appendResultsToScreen(results.toString());
+            //store results
+            recordTestResults(results);
+        } else {
+            appendResultsToScreen("Failed testing channel " + results.mLabel);
+        }
+    }
+
+    //append results
+    private void appendResultsToScreen(String str) {
+        String currentText = mResultText.getText().toString();
+        mResultText.setText(currentText + "\n" + str);
+    }
+
+    /**
+     * Store test results in log
+     */
+    private void recordTestResults(Results results) {
+        String channelLabel = "channel_" + results.mLabel;
+
+        for (int b = 0; b < mBands; b++) {
+            String bandLabel = String.format(channelLabel + "_%d", b);
+            getReportLog().addValue(
+                    bandLabel + "_Level",
+                    results.mAverageEnergyPerBand[b],
+                    ResultType.HIGHER_BETTER,
+                    ResultUnit.NONE);
+
+            getReportLog().addValue(
+                    bandLabel + "_pointsinbound",
+                    results.mInBoundPointsPerBand[b],
+                    ResultType.HIGHER_BETTER,
+                    ResultUnit.COUNT);
+
+            getReportLog().addValue(
+                    bandLabel + "_pointstotal",
+                    results.mPointsPerBand[b],
+                    ResultType.NEUTRAL,
+                    ResultUnit.COUNT);
+        }
+
+        getReportLog().addValues(channelLabel + "_magnitudeSpectrumLog",
+                results.mValuesLog,
+                ResultType.NEUTRAL,
+                ResultUnit.NONE);
+
+        Log.v(TAG, "Results Recorded");
+    }
+
+    private void startRecording() {
+        synchronized (mRecordingLock) {
+            mIsRecording = true;
+        }
+
+        boolean successful = initRecord();
+        if (successful) {
+            startRecordingForReal();
+        } else {
+            Log.v(TAG, "Recorder initialization error.");
+            synchronized (mRecordingLock) {
+                mIsRecording = false;
+            }
+        }
+    }
+
+    private void startRecordingForReal() {
+        // start streaming
+        if (mRecordThread == null) {
+            mRecordThread = new Thread(AudioFrequencyLineActivity.this);
+            mRecordThread.setName("FrequencyAnalyzerThread");
+            mRecordThreadShutdown = false;
+        }
+        if (!mRecordThread.isAlive()) {
+            mRecordThread.start();
+        }
+
+        mPipe.flush();
+
+        long startTime = SystemClock.uptimeMillis();
+        mRecorder.startRecording();
+        if (mRecorder.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
+            stopRecording();
+            return;
+        }
+        Log.v(TAG, "Start time: " + (long) (SystemClock.uptimeMillis() - startTime) + " ms");
+    }
+
+    private void stopRecording() {
+        synchronized (mRecordingLock) {
+            stopRecordingForReal();
+            mIsRecording = false;
+        }
+    }
+
+    private void stopRecordingForReal() {
+
+        // stop streaming
+        Thread zeThread = mRecordThread;
+        mRecordThread = null;
+        mRecordThreadShutdown = true;
+        if (zeThread != null) {
+            zeThread.interrupt();
+            try {
+                zeThread.join();
+            } catch(InterruptedException e) {
+                Log.v(TAG,"Error shutting down recording thread " + e);
+                //we don't really care about this error, just logging it.
+            }
+        }
+         // release recording resources
+        if (mRecorder != null) {
+            mRecorder.stop();
+            mRecorder.release();
+            mRecorder = null;
+        }
+    }
+
+    private boolean initRecord() {
+        int minRecordBuffSizeInBytes = AudioRecord.getMinBufferSize(mSamplingRate,
+                mChannelConfig, mAudioFormat);
+        Log.v(TAG,"FrequencyAnalyzer: min buff size = " + minRecordBuffSizeInBytes + " bytes");
+        if (minRecordBuffSizeInBytes <= 0) {
+            return false;
+        }
+
+        mMinRecordBufferSizeInSamples = minRecordBuffSizeInBytes / 2;
+        // allocate the byte array to read the audio data
+
+        mAudioShortArray = new short[mMinRecordBufferSizeInSamples];
+
+        Log.v(TAG, "Initiating record:");
+        Log.v(TAG, "      using source " + mSelectedRecordSource);
+        Log.v(TAG, "      at " + mSamplingRate + "Hz");
+
+        try {
+            mRecorder = new AudioRecord(mSelectedRecordSource, mSamplingRate,
+                    mChannelConfig, mAudioFormat, 2 * minRecordBuffSizeInBytes);
+        } catch (IllegalArgumentException e) {
+            return false;
+        }
+        if (mRecorder.getState() != AudioRecord.STATE_INITIALIZED) {
+            mRecorder.release();
+            mRecorder = null;
+            return false;
+        }
+        mRecorder.setRecordPositionUpdateListener(this);
+        mRecorder.setPositionNotificationPeriod(mBlockSizeSamples / 2);
+        return true;
+    }
+
+    // ---------------------------------------------------------
+    // Implementation of AudioRecord.OnPeriodicNotificationListener
+    // --------------------
+    public void onPeriodicNotification(AudioRecord recorder) {
+        int samplesAvailable = mPipe.availableToRead();
+        int samplesNeeded = mBlockSizeSamples;
+        if (samplesAvailable >= samplesNeeded) {
+            mPipe.read(mAudioShortArray2, 0, samplesNeeded);
+
+            //compute stuff.
+            double maxval = Math.pow(2, 15);
+            int clipcount = 0;
+            double cliplevel = (maxval-10) / maxval;
+            double sum = 0;
+            double maxabs = 0;
+            int i;
+            int index = 0;
+
+            for (i = 0; i < samplesNeeded; i++) {
+                double value = mAudioShortArray2[i] / maxval;
+                double valueabs = Math.abs(value);
+
+                if (valueabs > maxabs) {
+                    maxabs = valueabs;
+                }
+
+                if (valueabs > cliplevel) {
+                    clipcount++;
+                }
+
+                sum += value * value;
+                //fft stuff
+                if (index < mBlockSizeSamples) {
+                    mData.mData[index] = value;
+                }
+                index++;
+            }
+
+            //for the current frame, compute FFT and send to the viewer.
+
+            //apply window and pack as complex for now.
+            DspBufferMath.mult(mData, mData, mWindow.mBuffer);
+            DspBufferMath.set(mC, mData);
+            mFftServer.fft(mC, 1);
+
+            double[] halfMagnitude = new double[mBlockSizeSamples / 2];
+            for (i = 0; i < mBlockSizeSamples / 2; i++) {
+                halfMagnitude[i] = Math.sqrt(mC.mReal[i] * mC.mReal[i] + mC.mImag[i] * mC.mImag[i]);
+            }
+
+            mFreqAverageMain.setData(halfMagnitude, false); //average all of them!
+
+            switch(mCurrentTest) {
+                case 0:
+                    mFreqAverage0.setData(halfMagnitude, false);
+                    break;
+                case 1:
+                    mFreqAverage1.setData(halfMagnitude, false);
+                    break;
+            }
+        }
+    }
+
+    public void onMarkerReached(AudioRecord track) {
+    }
+
+    // ---------------------------------------------------------
+    // Implementation of Runnable for the audio recording + playback
+    // --------------------
+    public void run() {
+        int nSamplesRead = 0;
+
+        Thread thisThread = Thread.currentThread();
+        while (mRecordThread == thisThread && !mRecordThreadShutdown) {
+            // read from native recorder
+            nSamplesRead = mRecorder.read(mAudioShortArray, 0, mMinRecordBufferSizeInSamples);
+            if (nSamplesRead > 0) {
+                mPipe.write(mAudioShortArray, 0, nSamplesRead);
+            }
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioFrequencyMicActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioFrequencyMicActivity.java
new file mode 100644
index 0000000..b37a721
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioFrequencyMicActivity.java
@@ -0,0 +1,851 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.audio.wavelib.*;
+import com.android.compatibility.common.util.ReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
+import android.content.Context;
+import android.content.BroadcastReceiver;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+import android.media.AudioDeviceCallback;
+import android.media.AudioDeviceInfo;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+import android.media.AudioRecord;
+import android.media.MediaRecorder;
+
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.SystemClock;
+
+import android.util.Log;
+
+import android.view.View;
+import android.view.View.OnClickListener;
+
+import android.widget.Button;
+import android.widget.TextView;
+import android.widget.SeekBar;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+
+/**
+ * Tests Audio built in Microphone response using external speakers and USB reference microphone.
+ */
+public class AudioFrequencyMicActivity extends PassFailButtons.Activity implements Runnable,
+    AudioRecord.OnRecordPositionUpdateListener {
+    private static final String TAG = "AudioFrequencyMicActivity";
+
+    private static final int TEST_STARTED = 900;
+    private static final int TEST_ENDED = 901;
+    private static final int TEST_MESSAGE = 902;
+    private static final int TEST1_MESSAGE = 903;
+    private static final int TEST1_ENDED = 904;
+    private static final double MIN_ENERGY_BAND_1 = -50.0;          //dB Full Scale
+    private static final double MAX_ENERGY_BAND_1_BASE = -60.0;     //dB Full Scale
+    private static final double MIN_FRACTION_POINTS_IN_BAND = 0.3;
+    private static final double MAX_VAL = Math.pow(2, 15);
+    private static final double CLIP_LEVEL = (MAX_VAL-10) / MAX_VAL;
+
+    final OnBtnClickListener mBtnClickListener = new OnBtnClickListener();
+    Context mContext;
+
+    Button mSpeakersReady;              //user signal to have connected external speakers
+    Button mTest1Button;                //execute test 1
+    Button mUsbMicReady;          //user signal to have connected USB Microphone
+    Button mTest2Button;                 //user to start test
+    String mUsbDevicesInfo;             //usb device info for report
+    LinearLayout mLayoutTest1;
+    LinearLayout mLayoutTest2a;
+    LinearLayout mLayoutTest2b;
+
+    TextView mSpeakerReadyText;
+    TextView mTest2Result;
+    TextView mUsbStatusText;
+    TextView mTest1Result;
+    ProgressBar mProgressBar;
+
+    private boolean mIsRecording = false;
+    private final Object mRecordingLock = new Object();
+    private AudioRecord mRecorder;
+    private int mMinRecordBufferSizeInSamples = 0;
+    private short[] mAudioShortArray;
+    private short[] mAudioShortArray2;
+
+    private final int mBlockSizeSamples = 1024;
+    private final int mSamplingRate = 48000;
+    private final int mSelectedRecordSource = MediaRecorder.AudioSource.VOICE_RECOGNITION;
+    private final int mChannelConfig = AudioFormat.CHANNEL_IN_MONO;
+    private final int mAudioFormat = AudioFormat.ENCODING_PCM_16BIT;
+    private Thread mRecordThread;
+
+    PipeShort mPipe = new PipeShort(65536);
+    SoundPlayerObject mSPlayer;
+
+    private DspBufferComplex mC;
+    private DspBufferDouble mData;
+
+    private DspWindow mWindow;
+    private DspFftServer mFftServer;
+    private VectorAverage mFreqAverageMain = new VectorAverage();
+
+    private VectorAverage mFreqAverageBase = new VectorAverage();
+    private VectorAverage mFreqAverageBuiltIn = new VectorAverage();
+    private VectorAverage mFreqAverageReference = new VectorAverage();
+
+    private int mCurrentTest = -1;
+    int mBands = 4;
+    AudioBandSpecs[] bandSpecsArray = new AudioBandSpecs[mBands];
+    AudioBandSpecs[] baseBandSpecsArray = new AudioBandSpecs[mBands];
+
+    int mMaxLevel;
+    private class OnBtnClickListener implements OnClickListener {
+        @Override
+        public void onClick(View v) {
+            switch (v.getId()) {
+            case R.id.audio_frequency_mic_speakers_ready_btn:
+                testSpeakersReady();
+                break;
+            case R.id.audio_frequency_mic_test1_btn:
+                startTest1();
+                break;
+            case R.id.audio_frequency_mic_mic_ready_btn:
+                testUSB();
+                break;
+            case R.id.audio_frequency_mic_test2_btn:
+                startTest2();
+                break;
+            }
+        }
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.audio_frequency_mic_activity);
+        mContext = this;
+        mSpeakerReadyText = (TextView) findViewById(R.id.audio_frequency_mic_speakers_ready_status);
+
+        mSpeakersReady  = (Button)findViewById(R.id.audio_frequency_mic_speakers_ready_btn);
+        mSpeakersReady.setOnClickListener(mBtnClickListener);
+        mTest1Button = (Button)findViewById(R.id.audio_frequency_mic_test1_btn);
+        mTest1Button.setOnClickListener(mBtnClickListener);
+        mTest1Result = (TextView)findViewById(R.id.audio_frequency_mic_results1_text);
+        mLayoutTest1 = (LinearLayout) findViewById(R.id.audio_frequency_mic_layout_test1);
+        mLayoutTest2a = (LinearLayout) findViewById(R.id.audio_frequency_mic_layout_test2a);
+        mLayoutTest2b = (LinearLayout) findViewById(R.id.audio_frequency_mic_layout_test2b);
+        mUsbMicReady = (Button)findViewById(R.id.audio_frequency_mic_mic_ready_btn);
+        mUsbMicReady.setOnClickListener(mBtnClickListener);
+
+        mUsbStatusText = (TextView)findViewById(R.id.audio_frequency_mic_usb_status);
+        mTest2Button = (Button)findViewById(R.id.audio_frequency_mic_test2_btn);
+        mTest2Button.setOnClickListener(mBtnClickListener);
+        mTest2Result = (TextView)findViewById(R.id.audio_frequency_mic_results_text);
+        mProgressBar = (ProgressBar)findViewById(R.id.audio_frequency_mic_progress_bar);
+        showWait(false);
+        enableLayout(mLayoutTest1, false);
+        enableLayout(mLayoutTest2a, false);
+        enableLayout(mLayoutTest2b, false);
+
+        mSPlayer = new SoundPlayerObject();
+        mSPlayer.setSoundWithResId(getApplicationContext(), R.raw.stereo_mono_white_noise_48);
+        mSPlayer.setBalance(0.5f);
+
+        //Init FFT stuff
+        mAudioShortArray2 = new short[mBlockSizeSamples*2];
+        mData = new DspBufferDouble(mBlockSizeSamples);
+        mC = new DspBufferComplex(mBlockSizeSamples);
+        mFftServer = new DspFftServer(mBlockSizeSamples);
+
+        int overlap = mBlockSizeSamples / 2;
+
+        mWindow = new DspWindow(DspWindow.WINDOW_HANNING, mBlockSizeSamples, overlap);
+
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(false);
+        setInfoResources(R.string.audio_frequency_mic_test,
+                R.string.audio_frequency_mic_info, -1);
+
+        //Init bands for BuiltIn/Reference test
+        bandSpecsArray[0] = new AudioBandSpecs(
+                50, 500,        /* frequency start,stop */
+                -20.0, -50,     /* start top,bottom value */
+                4.0, -4.0       /* stop top,bottom value */);
+
+        bandSpecsArray[1] = new AudioBandSpecs(
+                500,4000,       /* frequency start,stop */
+                4.0, -4.0,      /* start top,bottom value */
+                4.0, -4.0        /* stop top,bottom value */);
+
+        bandSpecsArray[2] = new AudioBandSpecs(
+                4000, 12000,    /* frequency start,stop */
+                4.0, -4.0,      /* start top,bottom value */
+                5.0, -5.0       /* stop top,bottom value */);
+
+        bandSpecsArray[3] = new AudioBandSpecs(
+                12000, 20000,   /* frequency start,stop */
+                5.0, -5.0,      /* start top,bottom value */
+                5.0, -30.0      /* stop top,bottom value */);
+
+        //Init base bands for silence
+        baseBandSpecsArray[0] = new AudioBandSpecs(
+                50, 500,        /* frequency start,stop */
+                40.0, -50.0,     /* start top,bottom value */
+                5.0, -50.0       /* stop top,bottom value */);
+
+        baseBandSpecsArray[1] = new AudioBandSpecs(
+                500,4000,       /* frequency start,stop */
+                5.0, -50.0,      /* start top,bottom value */
+                5.0, -50.0        /* stop top,bottom value */);
+
+        baseBandSpecsArray[2] = new AudioBandSpecs(
+                4000, 12000,    /* frequency start,stop */
+                5.0, -50.0,      /* start top,bottom value */
+                5.0, -50.0       /* stop top,bottom value */);
+
+        baseBandSpecsArray[3] = new AudioBandSpecs(
+                12000, 20000,   /* frequency start,stop */
+                5.0, -50.0,      /* start top,bottom value */
+                5.0, -50.0      /* stop top,bottom value */);
+
+    }
+
+    /**
+     * enable test ui elements
+     */
+    private void enableLayout(LinearLayout layout, boolean enable) {
+        for (int i = 0; i < layout.getChildCount(); i++) {
+            View view = layout.getChildAt(i);
+            view.setEnabled(enable);
+        }
+    }
+
+    /**
+     * show active progress bar
+     */
+    private void showWait(boolean show) {
+        if (show) {
+            mProgressBar.setVisibility(View.VISIBLE);
+        } else {
+            mProgressBar.setVisibility(View.INVISIBLE);
+        }
+    }
+
+    private void setMaxLevel() {
+        AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+        mMaxLevel = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
+        am.setStreamVolume(AudioManager.STREAM_MUSIC, (int)(mMaxLevel), 0);
+    }
+
+    private void setMinLevel() {
+        AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+        am.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);
+    }
+
+    /**
+     *  Start the loopback audio test
+     */
+    private void startTest1() {
+        if (mTestThread != null && !mTestThread.isAlive()) {
+            mTestThread = null; //kill it.
+        }
+
+        if (mTestThread == null) {
+            Log.v(TAG,"Executing test Thread");
+            mTestThread = new Thread(mTest1Runnable);
+            //getPassButton().setEnabled(false);
+            if (!mSPlayer.isAlive())
+                mSPlayer.start();
+            mTestThread.start();
+        } else {
+            Log.v(TAG,"test Thread already running.");
+        }
+    }
+
+    Thread mTestThread;
+    Runnable mTest1Runnable = new Runnable() {
+        public void run() {
+            Message msg = Message.obtain();
+            msg.what = TEST_STARTED;
+            mMessageHandler.sendMessage(msg);
+
+            setMinLevel();
+            sendMessage("Testing Background Environment");
+            mCurrentTest = 0;
+            mSPlayer.setBalance(0.5f);
+            mFreqAverageBase.reset();
+            play();
+
+            setMaxLevel();
+            sendMessage("Testing Built in Microphone");
+            mCurrentTest = 1;
+            mFreqAverageBuiltIn.reset();
+            mSPlayer.setBalance(0.5f);
+            play();
+
+            mCurrentTest = -1;
+            sendMessage("Testing Completed");
+
+            Message msg2 = Message.obtain();
+            msg2.what = TEST1_ENDED;
+            mMessageHandler.sendMessage(msg2);
+        }
+
+        private void play() {
+            startRecording();
+            mSPlayer.play(true);
+
+            try {
+                Thread.sleep(2000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+                //restore interrupted status
+                Thread.currentThread().interrupt();
+            }
+
+            mSPlayer.play(false);
+            stopRecording();
+        }
+
+        private void sendMessage(String str) {
+            Message msg = Message.obtain();
+            msg.what = TEST1_MESSAGE;
+            msg.obj = str;
+            mMessageHandler.sendMessage(msg);
+        }
+    };
+
+    /**
+     *  Start the loopback audio test
+     */
+    private void startTest2() {
+        if (mTestThread != null && !mTestThread.isAlive()) {
+            mTestThread = null; //kill it.
+        }
+
+        if (mTestThread == null) {
+            Log.v(TAG,"Executing test2 Thread");
+            mTestThread = new Thread(mTest2Runnable);
+            //getPassButton().setEnabled(false);
+            if (!mSPlayer.isAlive())
+                mSPlayer.start();
+            mTestThread.start();
+        } else {
+            Log.v(TAG,"test Thread already running.");
+        }
+    }
+
+    Runnable mTest2Runnable = new Runnable() {
+        public void run() {
+            Message msg = Message.obtain();
+            msg.what = TEST_STARTED;
+            mMessageHandler.sendMessage(msg);
+
+            sendMessage("Testing Reference USB Microphone");
+            mCurrentTest = 2;
+            mFreqAverageReference.reset();
+            mSPlayer.setBalance(0.5f);
+            play();
+
+            mCurrentTest = -1;
+            sendMessage("Testing Completed");
+
+            Message msg2 = Message.obtain();
+            msg2.what = TEST_ENDED;
+            mMessageHandler.sendMessage(msg2);
+        }
+
+        private void play() {
+            startRecording();
+            mSPlayer.play(true);
+
+            try {
+                Thread.sleep(2000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+                //restore interrupted status
+                Thread.currentThread().interrupt();
+            }
+
+            mSPlayer.play(false);
+            stopRecording();
+        }
+
+        private void sendMessage(String str) {
+            Message msg = Message.obtain();
+            msg.what = TEST_MESSAGE;
+            msg.obj = str;
+            mMessageHandler.sendMessage(msg);
+        }
+    };
+
+    private Handler mMessageHandler = new Handler() {
+        public void handleMessage(Message msg) {
+            super.handleMessage(msg);
+            switch (msg.what) {
+            case TEST_STARTED:
+                showWait(true);
+                getPassButton().setEnabled(false);
+                break;
+            case TEST_ENDED:
+                showWait(false);
+                computeTest2Results();
+                break;
+            case TEST1_MESSAGE: {
+                    String str = (String)msg.obj;
+                    if (str != null) {
+                        mTest1Result.setText(str);
+                    }
+                }
+                break;
+            case TEST1_ENDED:
+                showWait(false);
+                computeTest1Results();
+                break;
+            case TEST_MESSAGE: {
+                    String str = (String)msg.obj;
+                    if (str != null) {
+                        mTest2Result.setText(str);
+                    }
+                }
+                break;
+            default:
+                Log.e(TAG, String.format("Unknown message: %d", msg.what));
+            }
+        }
+    };
+
+    private class Results {
+        private String mLabel;
+        public double[] mValuesLog;
+        int[] mPointsPerBand = new int[mBands];
+        double[] mAverageEnergyPerBand = new double[mBands];
+        int[] mInBoundPointsPerBand = new int[mBands];
+        public boolean mIsBaseMeasurement = false;
+        public Results(String label) {
+            mLabel = label;
+        }
+
+        //append results
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append(String.format("Channel %s\n", mLabel));
+            sb.append("Level in Band 1 : " + (testLevel() ? "OK" :"FAILED") +
+                    (mIsBaseMeasurement ? " (Base Meas.)" : "") + "\n");
+            for (int b = 0; b < mBands; b++) {
+                double percent = 0;
+                if (mPointsPerBand[b] > 0) {
+                    percent = 100.0 * (double) mInBoundPointsPerBand[b] / mPointsPerBand[b];
+                }
+                sb.append(String.format(
+                        " Band %d: Av. Level: %.1f dB InBand: %d/%d (%.1f%%) %s\n",
+                        b, mAverageEnergyPerBand[b],
+                        mInBoundPointsPerBand[b],
+                        mPointsPerBand[b],
+                        percent,
+                        (testInBand(b) ? "OK" : "FAILED")));
+            }
+            return sb.toString();
+        }
+
+        public boolean testLevel() {
+            if (mIsBaseMeasurement && mAverageEnergyPerBand[1] <= MAX_ENERGY_BAND_1_BASE) {
+                return true;
+            } else if (mAverageEnergyPerBand[1] >= MIN_ENERGY_BAND_1) {
+                return true;
+            }
+            return false;
+        }
+
+        public boolean testInBand(int b) {
+            if (b >= 0 && b < mBands && mPointsPerBand[b] > 0) {
+                if ((double) mInBoundPointsPerBand[b] / mPointsPerBand[b] >
+                    MIN_FRACTION_POINTS_IN_BAND) {
+                        return true;
+                }
+            }
+            return false;
+        }
+
+        public boolean testAll() {
+            if (!testLevel()) {
+                return false;
+            }
+            for (int b = 0; b < mBands; b++) {
+                if (!testInBand(b)) {
+                    return false;
+                }
+            }
+            return true;
+        }
+    }
+
+
+    /**
+     * compute test1 results
+     */
+    private void computeTest1Results() {
+
+        Results resultsBase = new Results("Base");
+        if (computeResultsForVector(mFreqAverageBase, resultsBase, true, baseBandSpecsArray)) {
+            appendResultsToScreen(resultsBase.toString(), mTest1Result);
+            recordTestResults(resultsBase);
+        }
+
+        Results resultsBuiltIn = new Results("BuiltIn");
+        if (computeResultsForVector(mFreqAverageBuiltIn, resultsBuiltIn, false, bandSpecsArray)) {
+            appendResultsToScreen(resultsBuiltIn.toString(), mTest1Result);
+            recordTestResults(resultsBuiltIn);
+        }
+
+        //tell user to connect USB Microphone
+        appendResultsToScreen("\n\n" +
+                getResources().getText(R.string.audio_frequency_mic_connect_mic), mTest1Result);
+        enableLayout(mLayoutTest2a, true);
+    }
+
+    /**
+     * compute test results
+     */
+    private void computeTest2Results() {
+        Results resultsReference = new Results("Reference");
+        if (computeResultsForVector(mFreqAverageReference, resultsReference,
+                false, bandSpecsArray)) {
+            appendResultsToScreen(resultsReference.toString(),mTest2Result);
+            recordTestResults(resultsReference);
+            getPassButton().setEnabled(true);
+        }
+    }
+
+    private boolean computeResultsForVector(VectorAverage freqAverage, Results results,
+            boolean isBase, AudioBandSpecs[] bandSpecs) {
+
+        results.mIsBaseMeasurement = isBase;
+        int points = freqAverage.getSize();
+        if (points > 0) {
+            //compute vector in db
+            double[] values = new double[points];
+            freqAverage.getData(values, false);
+            results.mValuesLog = new double[points];
+            for (int i = 0; i < points; i++) {
+                results.mValuesLog[i] = 20 * Math.log10(values[i]);
+            }
+
+            int currentBand = 0;
+            for (int i = 0; i < points; i++) {
+                double freq = (double)mSamplingRate * i / (double)mBlockSizeSamples;
+                if (freq > bandSpecs[currentBand].mFreqStop) {
+                    currentBand++;
+                    if (currentBand >= mBands)
+                        break;
+                }
+
+                if (freq >= bandSpecs[currentBand].mFreqStart) {
+                    results.mAverageEnergyPerBand[currentBand] += results.mValuesLog[i];
+                    results.mPointsPerBand[currentBand]++;
+                }
+            }
+
+            for (int b = 0; b < mBands; b++) {
+                if (results.mPointsPerBand[b] > 0) {
+                    results.mAverageEnergyPerBand[b] =
+                            results.mAverageEnergyPerBand[b] / results.mPointsPerBand[b];
+                }
+            }
+
+            //set offset relative to band 1 level
+            for (int b = 0; b < mBands; b++) {
+                bandSpecs[b].setOffset(results.mAverageEnergyPerBand[1]);
+            }
+
+            //test points in band.
+            currentBand = 0;
+            for (int i = 0; i < points; i++) {
+                double freq = (double)mSamplingRate * i / (double)mBlockSizeSamples;
+                if (freq >  bandSpecs[currentBand].mFreqStop) {
+                    currentBand++;
+                    if (currentBand >= mBands)
+                        break;
+                }
+
+                if (freq >= bandSpecs[currentBand].mFreqStart) {
+                    double value = results.mValuesLog[i];
+                    if (bandSpecs[currentBand].isInBounds(freq, value)) {
+                        results.mInBoundPointsPerBand[currentBand]++;
+                    }
+                }
+            }
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    //append results
+    private void appendResultsToScreen(String str, TextView text) {
+        String currentText = text.getText().toString();
+        text.setText(currentText + "\n" + str);
+    }
+
+    /**
+     * Store test results in log
+     */
+    private void recordTestResults(Results results) {
+        String channelLabel = "channel_" + results.mLabel;
+
+        for (int b = 0; b < mBands; b++) {
+            String bandLabel = String.format(channelLabel + "_%d", b);
+            getReportLog().addValue(
+                    bandLabel + "_Level",
+                    results.mAverageEnergyPerBand[b],
+                    ResultType.HIGHER_BETTER,
+                    ResultUnit.NONE);
+
+            getReportLog().addValue(
+                    bandLabel + "_pointsinbound",
+                    results.mInBoundPointsPerBand[b],
+                    ResultType.HIGHER_BETTER,
+                    ResultUnit.COUNT);
+
+            getReportLog().addValue(
+                    bandLabel + "_pointstotal",
+                    results.mPointsPerBand[b],
+                    ResultType.NEUTRAL,
+                    ResultUnit.COUNT);
+        }
+
+        getReportLog().addValues(channelLabel + "_magnitudeSpectrumLog",
+                results.mValuesLog,
+                ResultType.NEUTRAL,
+                ResultUnit.NONE);
+
+        Log.v(TAG, "Results Recorded");
+    }
+
+    private void startRecording() {
+        synchronized (mRecordingLock) {
+            mIsRecording = true;
+        }
+
+        boolean successful = initRecord();
+        if (successful) {
+            startRecordingForReal();
+        } else {
+            Log.v(TAG, "Recorder initialization error.");
+            synchronized (mRecordingLock) {
+                mIsRecording = false;
+            }
+        }
+    }
+
+    private void startRecordingForReal() {
+        // start streaming
+        if (mRecordThread == null) {
+            mRecordThread = new Thread(AudioFrequencyMicActivity.this);
+            mRecordThread.setName("FrequencyAnalyzerThread");
+        }
+        if (!mRecordThread.isAlive()) {
+            mRecordThread.start();
+        }
+
+        mPipe.flush();
+
+        long startTime = SystemClock.uptimeMillis();
+        mRecorder.startRecording();
+        if (mRecorder.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
+            stopRecording();
+            return;
+        }
+        Log.v(TAG, "Start time: " + (long) (SystemClock.uptimeMillis() - startTime) + " ms");
+    }
+
+    private void stopRecording() {
+        synchronized (mRecordingLock) {
+            stopRecordingForReal();
+            mIsRecording = false;
+        }
+    }
+
+    private void stopRecordingForReal() {
+
+        // stop streaming
+        Thread zeThread = mRecordThread;
+        mRecordThread = null;
+        if (zeThread != null) {
+            zeThread.interrupt();
+            try {
+                zeThread.join();
+            } catch(InterruptedException e) {
+                //restore interrupted status of recording thread
+                zeThread.interrupt();
+            }
+        }
+         // release recording resources
+        if (mRecorder != null) {
+            mRecorder.stop();
+            mRecorder.release();
+            mRecorder = null;
+        }
+    }
+
+    private boolean initRecord() {
+        int minRecordBuffSizeInBytes = AudioRecord.getMinBufferSize(mSamplingRate,
+                mChannelConfig, mAudioFormat);
+        Log.v(TAG,"FrequencyAnalyzer: min buff size = " + minRecordBuffSizeInBytes + " bytes");
+        if (minRecordBuffSizeInBytes <= 0) {
+            return false;
+        }
+
+        mMinRecordBufferSizeInSamples = minRecordBuffSizeInBytes / 2;
+        // allocate the byte array to read the audio data
+
+        mAudioShortArray = new short[mMinRecordBufferSizeInSamples];
+
+        Log.v(TAG, "Initiating record:");
+        Log.v(TAG, "      using source " + mSelectedRecordSource);
+        Log.v(TAG, "      at " + mSamplingRate + "Hz");
+
+        try {
+            mRecorder = new AudioRecord(mSelectedRecordSource, mSamplingRate,
+                    mChannelConfig, mAudioFormat, 2 * minRecordBuffSizeInBytes);
+        } catch (IllegalArgumentException e) {
+            return false;
+        }
+        if (mRecorder.getState() != AudioRecord.STATE_INITIALIZED) {
+            mRecorder.release();
+            mRecorder = null;
+            return false;
+        }
+        mRecorder.setRecordPositionUpdateListener(this);
+        mRecorder.setPositionNotificationPeriod(mBlockSizeSamples / 2);
+        return true;
+    }
+
+    // ---------------------------------------------------------
+    // Implementation of AudioRecord.OnPeriodicNotificationListener
+    // --------------------
+    public void onPeriodicNotification(AudioRecord recorder) {
+        int samplesAvailable = mPipe.availableToRead();
+        int samplesNeeded = mBlockSizeSamples;
+        if (samplesAvailable >= samplesNeeded) {
+            mPipe.read(mAudioShortArray2, 0, samplesNeeded);
+
+            //compute stuff.
+            int clipcount = 0;
+            double sum = 0;
+            double maxabs = 0;
+            int i;
+
+            for (i = 0; i < samplesNeeded; i++) {
+                double value = mAudioShortArray2[i] / MAX_VAL;
+                double valueabs = Math.abs(value);
+
+                if (valueabs > maxabs) {
+                    maxabs = valueabs;
+                }
+
+                if (valueabs > CLIP_LEVEL) {
+                    clipcount++;
+                }
+
+                sum += value * value;
+                //fft stuff
+                mData.mData[i] = value;
+            }
+
+            //for the current frame, compute FFT and send to the viewer.
+
+            //apply window and pack as complex for now.
+            DspBufferMath.mult(mData, mData, mWindow.mBuffer);
+            DspBufferMath.set(mC, mData);
+            mFftServer.fft(mC, 1);
+
+            double[] halfMagnitude = new double[mBlockSizeSamples / 2];
+            for (i = 0; i < mBlockSizeSamples / 2; i++) {
+                halfMagnitude[i] = Math.sqrt(mC.mReal[i] * mC.mReal[i] + mC.mImag[i] * mC.mImag[i]);
+            }
+
+            mFreqAverageMain.setData(halfMagnitude, false); //average all of them!
+
+            switch(mCurrentTest) {
+                case 0:
+                    mFreqAverageBase.setData(halfMagnitude, false);
+                    break;
+                case 1:
+                    mFreqAverageBuiltIn.setData(halfMagnitude, false);
+                    break;
+                case 2:
+                    mFreqAverageReference.setData(halfMagnitude, false);
+                    break;
+            }
+        }
+    }
+
+    public void onMarkerReached(AudioRecord track) {
+    }
+
+    // ---------------------------------------------------------
+    // Implementation of Runnable for the audio recording + playback
+    // --------------------
+    public void run() {
+        Thread thisThread = Thread.currentThread();
+        while (!thisThread.isInterrupted()) {
+            // read from native recorder
+            int nSamplesRead = mRecorder.read(mAudioShortArray, 0, mMinRecordBufferSizeInSamples);
+            if (nSamplesRead > 0) {
+                mPipe.write(mAudioShortArray, 0, nSamplesRead);
+            }
+        }
+    }
+
+    private void testSpeakersReady() {
+        boolean isUsbConnected =
+                UsbMicrophoneTester.getIsMicrophoneConnected(getApplicationContext());
+        if (isUsbConnected) {
+            mSpeakerReadyText.setText(" USB device detected, please remove it");
+            enableLayout(mLayoutTest1, false);
+            //fail
+        } else {
+            mSpeakerReadyText.setText(" No USB device detected. OK");
+            enableLayout(mLayoutTest1, true);
+        }
+    }
+
+    private void testUSB() {
+        boolean isConnected = UsbMicrophoneTester.getIsMicrophoneConnected(getApplicationContext());
+        mUsbDevicesInfo = UsbMicrophoneTester.getUSBDeviceListString(getApplicationContext());
+
+        if (isConnected) {
+            mUsbStatusText.setText(
+                    getResources().getText(R.string.audio_frequency_mic_mic_ready_text));
+            enableLayout(mLayoutTest2b, true);
+        } else {
+            mUsbStatusText.setText(
+                    getResources().getText(R.string.audio_frequency_mic_mic_not_ready_text));
+            enableLayout(mLayoutTest2b, false);
+        }
+    }
+
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioFrequencySpeakerActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioFrequencySpeakerActivity.java
new file mode 100644
index 0000000..f9334b3
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioFrequencySpeakerActivity.java
@@ -0,0 +1,732 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.audio.wavelib.*;
+import com.android.compatibility.common.util.ReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
+import android.content.Context;
+import android.content.BroadcastReceiver;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+import android.media.AudioDeviceCallback;
+import android.media.AudioDeviceInfo;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+import android.media.AudioRecord;
+import android.media.MediaRecorder;
+
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.SystemClock;
+
+import android.util.Log;
+
+import android.view.View;
+import android.view.View.OnClickListener;
+
+import android.widget.Button;
+import android.widget.TextView;
+import android.widget.SeekBar;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+
+/**
+ * Tests Audio Device roundtrip latency by using a loopback plug.
+ */
+public class AudioFrequencySpeakerActivity extends PassFailButtons.Activity implements Runnable,
+    AudioRecord.OnRecordPositionUpdateListener {
+    private static final String TAG = "AudioFrequencySpeakerActivity";
+
+    static final int TEST_STARTED = 900;
+    static final int TEST_ENDED = 901;
+    static final int TEST_MESSAGE = 902;
+    static final double MIN_ENERGY_BAND_1 = -50.0;          //dB Full Scale
+    static final double MAX_ENERGY_BAND_1_BASE = -60.0;     //dB Full Scale
+    static final double MIN_FRACTION_POINTS_IN_BAND = 0.3;
+
+    final OnBtnClickListener mBtnClickListener = new OnBtnClickListener();
+    Context mContext;
+
+    Button mLoopbackPlugReady;          //user signal to have connected USB Microphone
+    Button mTestButton;                 //user to start test
+    String mUsbDevicesInfo;             //usb device info for report
+    LinearLayout mLinearLayout;
+    TextView mResultText;
+    TextView mUsbStatusText;
+    ProgressBar mProgressBar;
+
+    private boolean mIsRecording = false;
+    private final Object mRecordingLock = new Object();
+    private AudioRecord mRecorder;
+    private int mMinRecordBufferSizeInSamples = 0;
+    private short[] mAudioShortArray;
+    private short[] mAudioShortArray2;
+
+    private final int mBlockSizeSamples = 1024;
+    private final int mSamplingRate = 48000;
+    private final int mSelectedRecordSource = MediaRecorder.AudioSource.VOICE_RECOGNITION;
+    private final int mChannelConfig = AudioFormat.CHANNEL_IN_MONO;
+    private final int mAudioFormat = AudioFormat.ENCODING_PCM_16BIT;
+    private Thread mRecordThread;
+    private boolean mRecordThreadShutdown = false;
+
+    PipeShort mPipe = new PipeShort(65536);
+    SoundPlayerObject mSPlayer;
+
+    private DspBufferComplex mC;
+    private DspBufferDouble mData;
+
+    private DspWindow mWindow;
+    private DspFftServer mFftServer;
+    private VectorAverage mFreqAverageMain = new VectorAverage();
+
+    private VectorAverage mFreqAverageBase = new VectorAverage();
+    private VectorAverage mFreqAverageLeft = new VectorAverage();
+    private VectorAverage mFreqAverageRight = new VectorAverage();
+
+    private int mCurrentTest = -1;
+    int mBands = 4;
+    AudioBandSpecs[] bandSpecsArray = new AudioBandSpecs[mBands];
+    AudioBandSpecs[] baseBandSpecsArray = new AudioBandSpecs[mBands];
+
+    int mMaxLevel;
+    private class OnBtnClickListener implements OnClickListener {
+        @Override
+        public void onClick(View v) {
+            switch (v.getId()) {
+            case R.id.audio_frequency_speaker_mic_ready_btn:
+                testUSB();
+                break;
+            case R.id.audio_frequency_speaker_test_btn:
+                startAudioTest();
+                break;
+            }
+        }
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.audio_frequency_speaker_activity);
+
+        mContext = this;
+
+        mLoopbackPlugReady = (Button)findViewById(R.id.audio_frequency_speaker_mic_ready_btn);
+        mLoopbackPlugReady.setOnClickListener(mBtnClickListener);
+        mLinearLayout = (LinearLayout)findViewById(R.id.audio_frequency_speaker_layout);
+        mUsbStatusText = (TextView)findViewById(R.id.audio_frequency_speaker_usb_status);
+        mTestButton = (Button)findViewById(R.id.audio_frequency_speaker_test_btn);
+        mTestButton.setOnClickListener(mBtnClickListener);
+        mResultText = (TextView)findViewById(R.id.audio_frequency_speaker_results_text);
+        mProgressBar = (ProgressBar)findViewById(R.id.audio_frequency_speaker_progress_bar);
+        showWait(false);
+        enableLayout(false);         //disabled all content
+
+        mSPlayer = new SoundPlayerObject();
+        mSPlayer.setSoundWithResId(getApplicationContext(), R.raw.stereo_mono_white_noise_48);
+        mSPlayer.setBalance(0.5f);
+
+        //Init FFT stuff
+        mAudioShortArray2 = new short[mBlockSizeSamples*2];
+        mData = new DspBufferDouble(mBlockSizeSamples);
+        mC = new DspBufferComplex(mBlockSizeSamples);
+        mFftServer = new DspFftServer(mBlockSizeSamples);
+
+        int overlap = mBlockSizeSamples / 2;
+
+        mWindow = new DspWindow(DspWindow.WINDOW_HANNING, mBlockSizeSamples, overlap);
+
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(false);
+        setInfoResources(R.string.audio_frequency_speaker_test,
+                R.string.audio_frequency_speaker_info, -1);
+
+        //Init bands for Left/Right test
+        bandSpecsArray[0] = new AudioBandSpecs(
+                50, 500,        /* frequency start,stop */
+                -20.0, -50,     /* start top,bottom value */
+                4.0, -4.0       /* stop top,bottom value */);
+
+        bandSpecsArray[1] = new AudioBandSpecs(
+                500,4000,       /* frequency start,stop */
+                4.0, -4.0,      /* start top,bottom value */
+                4.0, -4.0        /* stop top,bottom value */);
+
+        bandSpecsArray[2] = new AudioBandSpecs(
+                4000, 12000,    /* frequency start,stop */
+                4.0, -4.0,      /* start top,bottom value */
+                5.0, -5.0       /* stop top,bottom value */);
+
+        bandSpecsArray[3] = new AudioBandSpecs(
+                12000, 20000,   /* frequency start,stop */
+                5.0, -5.0,      /* start top,bottom value */
+                5.0, -30.0      /* stop top,bottom value */);
+
+        //Init base bands for silence
+        baseBandSpecsArray[0] = new AudioBandSpecs(
+                50, 500,        /* frequency start,stop */
+                40.0, -50.0,     /* start top,bottom value */
+                5.0, -50.0       /* stop top,bottom value */);
+
+        baseBandSpecsArray[1] = new AudioBandSpecs(
+                500,4000,       /* frequency start,stop */
+                5.0, -50.0,      /* start top,bottom value */
+                5.0, -50.0        /* stop top,bottom value */);
+
+        baseBandSpecsArray[2] = new AudioBandSpecs(
+                4000, 12000,    /* frequency start,stop */
+                5.0, -50.0,      /* start top,bottom value */
+                5.0, -50.0       /* stop top,bottom value */);
+
+        baseBandSpecsArray[3] = new AudioBandSpecs(
+                12000, 20000,   /* frequency start,stop */
+                5.0, -50.0,      /* start top,bottom value */
+                5.0, -50.0      /* stop top,bottom value */);
+
+    }
+
+    /**
+     * enable test ui elements
+     */
+    private void enableLayout(boolean enable) {
+        for (int i = 0; i < mLinearLayout.getChildCount(); i++) {
+            View view = mLinearLayout.getChildAt(i);
+            view.setEnabled(enable);
+        }
+    }
+
+    /**
+     * show active progress bar
+     */
+    private void showWait(boolean show) {
+        if (show) {
+            mProgressBar.setVisibility(View.VISIBLE);
+        } else {
+            mProgressBar.setVisibility(View.INVISIBLE);
+        }
+    }
+
+    private void setMaxLevel() {
+        AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+        mMaxLevel = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
+        am.setStreamVolume(AudioManager.STREAM_MUSIC, (int)(mMaxLevel), 0);
+    }
+
+    private void setMinLevel() {
+        AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+        am.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);
+    }
+
+    /**
+     *  Start the loopback audio test
+     */
+    private void startAudioTest() {
+        if (mTestThread != null && !mTestThread.isAlive()) {
+            mTestThread = null; //kill it.
+        }
+
+        if (mTestThread == null) {
+            Log.v(TAG,"Executing test Thread");
+            mTestThread = new Thread(mPlayRunnable);
+            getPassButton().setEnabled(false);
+            if (!mSPlayer.isAlive())
+                mSPlayer.start();
+            mTestThread.start();
+        } else {
+            Log.v(TAG,"test Thread already running.");
+        }
+    }
+
+    Thread mTestThread;
+    Runnable mPlayRunnable = new Runnable() {
+        public void run() {
+            Message msg = Message.obtain();
+            msg.what = TEST_STARTED;
+            mMessageHandler.sendMessage(msg);
+
+            setMinLevel();
+            sendMessage("Testing Background Environment");
+            mCurrentTest = 0;
+            mSPlayer.setBalance(0.5f);
+            mFreqAverageBase.reset();
+            play();
+
+            setMaxLevel();
+            sendMessage("Testing Left Capture");
+            mCurrentTest = 1;
+            mFreqAverageLeft.reset();
+            mSPlayer.setBalance(0.0f);
+            play();
+
+            sendMessage("Testing Right Capture");
+            mCurrentTest = 2;
+            mFreqAverageRight.reset();
+            mSPlayer.setBalance(1.0f);
+            play();
+
+            mCurrentTest = -1;
+            sendMessage("Testing Completed");
+
+            Message msg2 = Message.obtain();
+            msg2.what = TEST_ENDED;
+            mMessageHandler.sendMessage(msg2);
+        }
+
+        private void play() {
+            startRecording();
+            mSPlayer.play(true);
+
+            try {
+                Thread.sleep(2000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+
+            mSPlayer.play(false);
+            stopRecording();
+        }
+
+        private void sendMessage(String str) {
+            Message msg = Message.obtain();
+            msg.what = TEST_MESSAGE;
+            msg.obj = str;
+            mMessageHandler.sendMessage(msg);
+        }
+    };
+
+    private Handler mMessageHandler = new Handler() {
+        public void handleMessage(Message msg) {
+            super.handleMessage(msg);
+            switch (msg.what) {
+            case TEST_STARTED:
+                showWait(true);
+                getPassButton().setEnabled(false);
+                break;
+            case TEST_ENDED:
+                showWait(false);
+                computeResults();
+                break;
+            case TEST_MESSAGE:
+                String str = (String)msg.obj;
+                if (str != null) {
+                    mResultText.setText(str);
+                }
+                break;
+            default:
+                Log.e(TAG, String.format("Unknown message: %d", msg.what));
+            }
+        }
+    };
+
+    private class Results {
+        private String mLabel;
+        public double[] mValuesLog;
+        int[] mPointsPerBand = new int[mBands];
+        double[] mAverageEnergyPerBand = new double[mBands];
+        int[] mInBoundPointsPerBand = new int[mBands];
+        public boolean mIsBaseMeasurement = false;
+        public Results(String label) {
+            mLabel = label;
+        }
+
+        //append results
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append(String.format("Channel %s\n", mLabel));
+            sb.append("Level in Band 1 : " + (testLevel() ? "OK" :"FAILED") +
+                    (mIsBaseMeasurement ? " (Base Meas.)" : "") + "\n");
+            for (int b = 0; b < mBands; b++) {
+                double percent = 0;
+                if (mPointsPerBand[b] > 0) {
+                    percent = 100.0 * (double)mInBoundPointsPerBand[b] / mPointsPerBand[b];
+                }
+                sb.append(String.format(
+                        " Band %d: Av. Level: %.1f dB InBand: %d/%d (%.1f%%) %s\n",
+                        b, mAverageEnergyPerBand[b],
+                        mInBoundPointsPerBand[b],
+                        mPointsPerBand[b],
+                        percent,
+                        (testInBand(b) ? "OK" : "FAILED")));
+            }
+            return sb.toString();
+        }
+
+        public boolean testLevel() {
+            if (mIsBaseMeasurement && mAverageEnergyPerBand[1] <= MAX_ENERGY_BAND_1_BASE) {
+                return true;
+            } else if (mAverageEnergyPerBand[1] >= MIN_ENERGY_BAND_1) {
+                return true;
+            }
+            return false;
+        }
+
+        public boolean testInBand(int b) {
+            if (b >= 0 && b < mBands && mPointsPerBand[b] > 0) {
+                if ((double)mInBoundPointsPerBand[b] / mPointsPerBand[b] >
+                MIN_FRACTION_POINTS_IN_BAND)
+                    return true;
+            }
+            return false;
+        }
+
+        public boolean testAll() {
+            if (!testLevel()) {
+                return false;
+            }
+            for (int b = 0; b < mBands; b++) {
+                if (!testInBand(b)) {
+                    return false;
+                }
+            }
+            return true;
+        }
+    }
+
+    /**
+     * compute test results
+     */
+    private void computeResults() {
+
+        Results resultsBase = new Results("Base");
+        computeResultsForVector(mFreqAverageBase, resultsBase, true, baseBandSpecsArray);
+        Results resultsLeft = new Results("Left");
+        computeResultsForVector(mFreqAverageLeft, resultsLeft, false, bandSpecsArray);
+        Results resultsRight = new Results("Right");
+        computeResultsForVector(mFreqAverageRight, resultsRight, false, bandSpecsArray);
+        if (resultsLeft.testAll() && resultsRight.testAll() && resultsBase.testAll()) {
+            //enable button
+            getPassButton().setEnabled(true);
+        }
+    }
+
+    private void computeResultsForVector(VectorAverage freqAverage,Results results, boolean isBase,
+            AudioBandSpecs[] bandSpecs) {
+
+        results.mIsBaseMeasurement = isBase;
+        int points = freqAverage.getSize();
+        if (points > 0) {
+            //compute vector in db
+            double[] values = new double[points];
+            freqAverage.getData(values, false);
+            results.mValuesLog = new double[points];
+            for (int i = 0; i < points; i++) {
+                results.mValuesLog[i] = 20 * Math.log10(values[i]);
+            }
+
+            int currentBand = 0;
+            for (int i = 0; i < points; i++) {
+                double freq = (double)mSamplingRate * i / (double)mBlockSizeSamples;
+                if (freq > bandSpecs[currentBand].mFreqStop) {
+                    currentBand++;
+                    if (currentBand >= mBands)
+                        break;
+                }
+
+                if (freq >= bandSpecs[currentBand].mFreqStart) {
+                    results.mAverageEnergyPerBand[currentBand] += results.mValuesLog[i];
+                    results.mPointsPerBand[currentBand]++;
+                }
+            }
+
+            for (int b = 0; b < mBands; b++) {
+                if (results.mPointsPerBand[b] > 0) {
+                    results.mAverageEnergyPerBand[b] =
+                            results.mAverageEnergyPerBand[b] / results.mPointsPerBand[b];
+                }
+            }
+
+            //set offset relative to band 1 level
+            for (int b = 0; b < mBands; b++) {
+                bandSpecs[b].setOffset(results.mAverageEnergyPerBand[1]);
+            }
+
+            //test points in band.
+            currentBand = 0;
+            for (int i = 0; i < points; i++) {
+                double freq = (double)mSamplingRate * i / (double)mBlockSizeSamples;
+                if (freq >  bandSpecs[currentBand].mFreqStop) {
+                    currentBand++;
+                    if (currentBand >= mBands)
+                        break;
+                }
+
+                if (freq >= bandSpecs[currentBand].mFreqStart) {
+                    double value = results.mValuesLog[i];
+                    if (bandSpecs[currentBand].isInBounds(freq, value)) {
+                        results.mInBoundPointsPerBand[currentBand]++;
+                    }
+                }
+            }
+
+            appendResultsToScreen(results.toString());
+            //store results
+            recordTestResults(results);
+        } else {
+            appendResultsToScreen("Failed testing channel " + results.mLabel);
+        }
+    }
+
+    //append results
+    private void appendResultsToScreen(String str) {
+        String currentText = mResultText.getText().toString();
+        mResultText.setText(currentText + "\n" + str);
+    }
+
+    /**
+     * Store test results in log
+     */
+    private void recordTestResults(Results results) {
+        String channelLabel = "channel_" + results.mLabel;
+
+        for (int b = 0; b < mBands; b++) {
+            String bandLabel = String.format(channelLabel + "_%d", b);
+            getReportLog().addValue(
+                    bandLabel + "_Level",
+                    results.mAverageEnergyPerBand[b],
+                    ResultType.HIGHER_BETTER,
+                    ResultUnit.NONE);
+
+            getReportLog().addValue(
+                    bandLabel + "_pointsinbound",
+                    results.mInBoundPointsPerBand[b],
+                    ResultType.HIGHER_BETTER,
+                    ResultUnit.COUNT);
+
+            getReportLog().addValue(
+                    bandLabel + "_pointstotal",
+                    results.mPointsPerBand[b],
+                    ResultType.NEUTRAL,
+                    ResultUnit.COUNT);
+        }
+
+        getReportLog().addValues(channelLabel + "_magnitudeSpectrumLog",
+                results.mValuesLog,
+                ResultType.NEUTRAL,
+                ResultUnit.NONE);
+
+        Log.v(TAG, "Results Recorded");
+    }
+
+    private void startRecording() {
+        synchronized (mRecordingLock) {
+            mIsRecording = true;
+        }
+
+        boolean successful = initRecord();
+        if (successful) {
+            startRecordingForReal();
+        } else {
+            Log.v(TAG, "Recorder initialization error.");
+            synchronized (mRecordingLock) {
+                mIsRecording = false;
+            }
+        }
+    }
+
+    private void startRecordingForReal() {
+        // start streaming
+        if (mRecordThread == null) {
+            mRecordThread = new Thread(AudioFrequencySpeakerActivity.this);
+            mRecordThread.setName("FrequencyAnalyzerThread");
+            mRecordThreadShutdown = false;
+        }
+        if (!mRecordThread.isAlive()) {
+            mRecordThread.start();
+        }
+
+        mPipe.flush();
+
+        long startTime = SystemClock.uptimeMillis();
+        mRecorder.startRecording();
+        if (mRecorder.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
+            stopRecording();
+            return;
+        }
+        Log.v(TAG, "Start time: " + (long) (SystemClock.uptimeMillis() - startTime) + " ms");
+    }
+
+    private void stopRecording() {
+        synchronized (mRecordingLock) {
+            stopRecordingForReal();
+            mIsRecording = false;
+        }
+    }
+
+    private void stopRecordingForReal() {
+
+        // stop streaming
+        Thread zeThread = mRecordThread;
+        mRecordThread = null;
+        mRecordThreadShutdown = true;
+        if (zeThread != null) {
+            zeThread.interrupt();
+            try {
+                zeThread.join();
+            } catch(InterruptedException e) {
+                Log.v(TAG,"Error shutting down recording thread " + e);
+                //we don't really care about this error, just logging it.
+            }
+        }
+         // release recording resources
+        if (mRecorder != null) {
+            mRecorder.stop();
+            mRecorder.release();
+            mRecorder = null;
+        }
+    }
+
+    private boolean initRecord() {
+        int minRecordBuffSizeInBytes = AudioRecord.getMinBufferSize(mSamplingRate,
+                mChannelConfig, mAudioFormat);
+        Log.v(TAG,"FrequencyAnalyzer: min buff size = " + minRecordBuffSizeInBytes + " bytes");
+        if (minRecordBuffSizeInBytes <= 0) {
+            return false;
+        }
+
+        mMinRecordBufferSizeInSamples = minRecordBuffSizeInBytes / 2;
+        // allocate the byte array to read the audio data
+
+        mAudioShortArray = new short[mMinRecordBufferSizeInSamples];
+
+        Log.v(TAG, "Initiating record:");
+        Log.v(TAG, "      using source " + mSelectedRecordSource);
+        Log.v(TAG, "      at " + mSamplingRate + "Hz");
+
+        try {
+            mRecorder = new AudioRecord(mSelectedRecordSource, mSamplingRate,
+                    mChannelConfig, mAudioFormat, 2 * minRecordBuffSizeInBytes);
+        } catch (IllegalArgumentException e) {
+            return false;
+        }
+        if (mRecorder.getState() != AudioRecord.STATE_INITIALIZED) {
+            mRecorder.release();
+            mRecorder = null;
+            return false;
+        }
+        mRecorder.setRecordPositionUpdateListener(this);
+        mRecorder.setPositionNotificationPeriod(mBlockSizeSamples / 2);
+        return true;
+    }
+
+    // ---------------------------------------------------------
+    // Implementation of AudioRecord.OnPeriodicNotificationListener
+    // --------------------
+    public void onPeriodicNotification(AudioRecord recorder) {
+        int samplesAvailable = mPipe.availableToRead();
+        int samplesNeeded = mBlockSizeSamples;
+        if (samplesAvailable >= samplesNeeded) {
+            mPipe.read(mAudioShortArray2, 0, samplesNeeded);
+
+            //compute stuff.
+            double maxval = Math.pow(2, 15);
+            int clipcount = 0;
+            double cliplevel = (maxval-10) / maxval;
+            double sum = 0;
+            double maxabs = 0;
+            int i;
+            int index = 0;
+
+            for (i = 0; i < samplesNeeded; i++) {
+                double value = mAudioShortArray2[i] / maxval;
+                double valueabs = Math.abs(value);
+
+                if (valueabs > maxabs) {
+                    maxabs = valueabs;
+                }
+
+                if (valueabs > cliplevel) {
+                    clipcount++;
+                }
+
+                sum += value * value;
+                //fft stuff
+                if (index < mBlockSizeSamples) {
+                    mData.mData[index] = value;
+                }
+                index++;
+            }
+
+            //for the current frame, compute FFT and send to the viewer.
+
+            //apply window and pack as complex for now.
+            DspBufferMath.mult(mData, mData, mWindow.mBuffer);
+            DspBufferMath.set(mC, mData);
+            mFftServer.fft(mC, 1);
+
+            double[] halfMagnitude = new double[mBlockSizeSamples / 2];
+            for (i = 0; i < mBlockSizeSamples / 2; i++) {
+                halfMagnitude[i] = Math.sqrt(mC.mReal[i] * mC.mReal[i] + mC.mImag[i] * mC.mImag[i]);
+            }
+
+            mFreqAverageMain.setData(halfMagnitude, false); //average all of them!
+
+            switch(mCurrentTest) {
+                case 0:
+                    mFreqAverageBase.setData(halfMagnitude, false);
+                    break;
+                case 1:
+                    mFreqAverageLeft.setData(halfMagnitude, false);
+                    break;
+                case 2:
+                    mFreqAverageRight.setData(halfMagnitude, false);
+                    break;
+            }
+        }
+    }
+
+    public void onMarkerReached(AudioRecord track) {
+    }
+
+    // ---------------------------------------------------------
+    // Implementation of Runnable for the audio recording + playback
+    // --------------------
+    public void run() {
+        int nSamplesRead = 0;
+
+        Thread thisThread = Thread.currentThread();
+        while (mRecordThread == thisThread && !mRecordThreadShutdown) {
+            // read from native recorder
+            nSamplesRead = mRecorder.read(mAudioShortArray, 0, mMinRecordBufferSizeInSamples);
+            if (nSamplesRead > 0) {
+                mPipe.write(mAudioShortArray, 0, nSamplesRead);
+            }
+        }
+    }
+
+    private void testUSB() {
+        boolean isConnected = UsbMicrophoneTester.getIsMicrophoneConnected(getApplicationContext());
+        mUsbDevicesInfo = UsbMicrophoneTester.getUSBDeviceListString(getApplicationContext());
+
+        if (isConnected) {
+            mUsbStatusText.setText(
+                    getResources().getText(R.string.audio_frequency_speaker_mic_ready_text));
+            enableLayout(true);
+        } else {
+            mUsbStatusText.setText(
+                    getResources().getText(R.string.audio_frequency_speaker_mic_not_ready_text));
+            enableLayout(false);
+        }
+    }
+
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioLoopbackActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioLoopbackActivity.java
new file mode 100644
index 0000000..e603a69
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioLoopbackActivity.java
@@ -0,0 +1,307 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+import com.android.compatibility.common.util.ReportLog;
+import com.android.compatibility.common.util.ResultType;
+import com.android.compatibility.common.util.ResultUnit;
+import android.content.Context;
+
+import android.media.AudioDeviceCallback;
+import android.media.AudioDeviceInfo;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+
+import android.util.Log;
+
+import android.view.View;
+import android.view.View.OnClickListener;
+
+import android.widget.Button;
+import android.widget.TextView;
+import android.widget.SeekBar;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+
+/**
+ * Tests Audio Device roundtrip latency by using a loopback plug.
+ */
+public class AudioLoopbackActivity extends PassFailButtons.Activity {
+    private static final String TAG = "AudioLoopbackActivity";
+
+    public static final int BYTES_PER_FRAME = 2;
+
+    NativeAudioThread nativeAudioThread = null;
+
+    private int mSamplingRate = 44100;
+    private int mMinBufferSizeInFrames = 0;
+    private static final double CONFIDENCE_THRESHOLD = 0.6;
+    private Correlation mCorrelation = new Correlation();
+
+    OnBtnClickListener mBtnClickListener = new OnBtnClickListener();
+    Context mContext;
+
+    Button mLoopbackPlugReady;
+    TextView mAudioLevelText;
+    SeekBar mAudioLevelSeekbar;
+    LinearLayout mLinearLayout;
+    Button mTestButton;
+    TextView mResultText;
+    ProgressBar mProgressBar;
+
+    int mMaxLevel;
+    private class OnBtnClickListener implements OnClickListener {
+        @Override
+        public void onClick(View v) {
+            switch (v.getId()) {
+                case R.id.audio_loopback_plug_ready_btn:
+                    Log.i(TAG, "audio loopback plug ready");
+                    //enable all the other views.
+                    enableLayout(true);
+                    break;
+                case R.id.audio_loopback_test_btn:
+                    Log.i(TAG, "audio loopback test");
+                    startAudioTest();
+                    break;
+
+            }
+        }
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.audio_loopback_activity);
+
+        mContext = this;
+
+        mLoopbackPlugReady = (Button)findViewById(R.id.audio_loopback_plug_ready_btn);
+        mLoopbackPlugReady.setOnClickListener(mBtnClickListener);
+        mLinearLayout = (LinearLayout)findViewById(R.id.audio_loopback_layout);
+        mAudioLevelText = (TextView)findViewById(R.id.audio_loopback_level_text);
+        mAudioLevelSeekbar = (SeekBar)findViewById(R.id.audio_loopback_level_seekbar);
+        mTestButton =(Button)findViewById(R.id.audio_loopback_test_btn);
+        mTestButton.setOnClickListener(mBtnClickListener);
+        mResultText = (TextView)findViewById(R.id.audio_loopback_results_text);
+        mProgressBar = (ProgressBar)findViewById(R.id.audio_loopback_progress_bar);
+        showWait(false);
+
+        enableLayout(false);         //disabled all content
+        AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+        mMaxLevel = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
+        mAudioLevelSeekbar.setMax(mMaxLevel);
+        am.setStreamVolume(AudioManager.STREAM_MUSIC, (int)(0.7 * mMaxLevel), 0);
+        refreshLevel();
+
+        mAudioLevelSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+            @Override
+            public void onStopTrackingTouch(SeekBar seekBar) {
+            }
+
+            @Override
+            public void onStartTrackingTouch(SeekBar seekBar) {
+            }
+
+            @Override
+            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+
+                AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+                am.setStreamVolume(AudioManager.STREAM_MUSIC,
+                        progress, 0);
+                refreshLevel();
+                Log.i(TAG,"Changed stream volume to: " + progress);
+            }
+        });
+
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(false);
+        setInfoResources(R.string.sample_test, R.string.audio_loopback_info, -1);
+    }
+
+    /**
+     * refresh Audio Level seekbar and text
+     */
+    private void refreshLevel() {
+        AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+
+        int currentLevel = am.getStreamVolume(AudioManager.STREAM_MUSIC);
+        mAudioLevelSeekbar.setProgress(currentLevel);
+
+        String levelText = String.format("%s: %d/%d",
+                getResources().getString(R.string.audio_loopback_level_text),
+                currentLevel, mMaxLevel);
+        mAudioLevelText.setText(levelText);
+    }
+
+    /**
+     * enable test ui elements
+     */
+    private void enableLayout(boolean enable) {
+        for (int i = 0; i<mLinearLayout.getChildCount(); i++) {
+            View view = mLinearLayout.getChildAt(i);
+            view.setEnabled(enable);
+        }
+    }
+
+    /**
+     * show active progress bar
+     */
+    private void showWait(boolean show) {
+        if (show) {
+            mProgressBar.setVisibility(View.VISIBLE) ;
+        } else {
+            mProgressBar.setVisibility(View.INVISIBLE) ;
+        }
+    }
+
+    /**
+     *  Start the loopback audio test
+     */
+    private void startAudioTest() {
+        getPassButton().setEnabled(false);
+
+        //get system defaults for sampling rate, buffers.
+        AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+        String value = am.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
+        mMinBufferSizeInFrames = Integer.parseInt(value);
+
+        int minBufferSizeInBytes = BYTES_PER_FRAME * mMinBufferSizeInFrames;
+
+        mSamplingRate = AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_MUSIC);
+
+        Log.i(TAG, String.format("startAudioTest sr:%d , buffer:%d frames",
+                mSamplingRate, mMinBufferSizeInFrames));
+
+        nativeAudioThread = new NativeAudioThread();
+        if (nativeAudioThread != null) {
+            nativeAudioThread.setMessageHandler(mMessageHandler);
+            nativeAudioThread.mSessionId = 0;
+            nativeAudioThread.setParams(mSamplingRate,
+                    minBufferSizeInBytes,
+                    minBufferSizeInBytes,
+                    0x03 /*voice recognition*/);
+            nativeAudioThread.start();
+
+            try {
+                Thread.sleep(200);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+
+            nativeAudioThread.runTest();
+
+        }
+    }
+
+    /**
+     * handler for messages from audio thread
+     */
+    private Handler mMessageHandler = new Handler() {
+        public void handleMessage(Message msg) {
+            super.handleMessage(msg);
+            switch(msg.what) {
+                case NativeAudioThread.NATIVE_AUDIO_THREAD_MESSAGE_REC_STARTED:
+                    Log.v(TAG,"got message native rec started!!");
+                    showWait(true);
+                    mResultText.setText("Test Running...");
+                    break;
+                case NativeAudioThread.NATIVE_AUDIO_THREAD_MESSAGE_REC_ERROR:
+                    Log.v(TAG,"got message native rec can't start!!");
+                    showWait(false);
+                    mResultText.setText("Test Error.");
+                    break;
+                case NativeAudioThread.NATIVE_AUDIO_THREAD_MESSAGE_REC_COMPLETE:
+                case NativeAudioThread.NATIVE_AUDIO_THREAD_MESSAGE_REC_COMPLETE_ERRORS:
+                    if (nativeAudioThread != null) {
+                        Log.v(TAG,"Finished recording.");
+                        double [] waveData = nativeAudioThread.getWaveData();
+                        mCorrelation.computeCorrelation(waveData, mSamplingRate);
+                        mResultText.setText(String.format(
+                                "Test Finished\nLatency:%.2f ms\nConfidence: %.2f",
+                                mCorrelation.mEstimatedLatencyMs,
+                                mCorrelation.mEstimatedLatencyConfidence));
+
+                        recordTestResults();
+                        if (mCorrelation.mEstimatedLatencyConfidence >= CONFIDENCE_THRESHOLD) {
+                            getPassButton().setEnabled(true);
+                        }
+
+                        //close
+                        if (nativeAudioThread != null) {
+                            nativeAudioThread.isRunning = false;
+                            try {
+                                nativeAudioThread.finish();
+                                nativeAudioThread.join();
+                            } catch (InterruptedException e) {
+                                e.printStackTrace();
+                            }
+                            nativeAudioThread = null;
+                        }
+                        showWait(false);
+                    }
+                    break;
+                default:
+                    break;
+            }
+        }
+    };
+
+    /**
+     * Store test results in log
+     */
+    private void recordTestResults() {
+
+        getReportLog().addValue(
+                "Estimated Latency",
+                mCorrelation.mEstimatedLatencyMs,
+                ResultType.LOWER_BETTER,
+                ResultUnit.MS);
+
+        getReportLog().addValue(
+                "Confidence",
+                mCorrelation.mEstimatedLatencyConfidence,
+                ResultType.HIGHER_BETTER,
+                ResultUnit.NONE);
+
+        int audioLevel = mAudioLevelSeekbar.getProgress();
+        getReportLog().addValue(
+                "Audio Level",
+                audioLevel,
+                ResultType.NEUTRAL,
+                ResultUnit.NONE);
+
+        getReportLog().addValue(
+                "Frames Buffer Size",
+                mMinBufferSizeInFrames,
+                ResultType.NEUTRAL,
+                ResultUnit.NONE);
+
+        getReportLog().addValue(
+                "Sampling Rate",
+                mSamplingRate,
+                ResultType.NEUTRAL,
+                ResultUnit.NONE);
+
+        Log.v(TAG,"Results Recorded");
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioRecordHelper.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioRecordHelper.java
new file mode 100644
index 0000000..80dd250
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioRecordHelper.java
@@ -0,0 +1,144 @@
+package com.android.cts.verifier.audio;
+
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioRecord;
+import android.media.AudioTrack;
+import android.media.MediaRecorder;
+import android.util.Log;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+/**
+ * A wrapper on AudioRecord class.
+ */
+public class AudioRecordHelper {
+
+  private static final int[] SOURCE = {
+      MediaRecorder.AudioSource.MIC, MediaRecorder.AudioSource.VOICE_RECOGNITION};
+  private static final int[] SAMPLE_RATES_HZ = {
+    AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_MUSIC), 48000, 44100};
+
+  private static final int CHANNEL = AudioFormat.CHANNEL_CONFIGURATION_MONO;
+  private static final int ENCODING = AudioFormat.ENCODING_PCM_16BIT;
+  private static final String TAG = "AudioRecordHelper";
+  private static AudioRecordHelper instance;
+  private final int bufferSize;
+  private final int sampleRate;
+  private final int source;
+  private ByteArrayOutputStream os;
+  private AudioRecord audioRecord;
+  private volatile boolean isRecording = false;
+
+  private AudioRecordHelper() {
+    int tmpBufferSize = 0;
+    int tmpSampleRate = 0;
+    int tmpSource = 0;
+    initialization:
+    for (int source : SOURCE) {
+      for (int rate : SAMPLE_RATES_HZ) {
+        tmpBufferSize = AudioRecord.getMinBufferSize(rate, CHANNEL, ENCODING);
+        AudioRecord testAudioRecord = new AudioRecord(source, rate, CHANNEL, ENCODING,
+            tmpBufferSize);
+        if (testAudioRecord.getState() == AudioRecord.STATE_INITIALIZED) {
+          testAudioRecord.release();
+          tmpSampleRate = rate;
+          tmpSource = source;
+          break initialization;
+        }
+      }
+    }
+    if (tmpBufferSize == 0 || tmpSampleRate == 0) {
+      Log.e(TAG, "Failed to initialize");
+    }
+    bufferSize = tmpBufferSize;
+    sampleRate = tmpSampleRate;
+    source = tmpSource;
+    Log.d(TAG, "Sample rate = " + sampleRate + "Hz, Source = "
+        + source + " (VOICE_RECOGNITION = 6 , MIC = 1)");
+  }
+
+  public static AudioRecordHelper getInstance() {
+    if (instance == null) {
+      instance = new AudioRecordHelper();
+    }
+    return instance;
+  }
+
+  /**
+   * Start recording.
+   */
+  public void start() {
+    if (!isRecording) {
+      isRecording = true;
+      os = new ByteArrayOutputStream();
+      audioRecord = new AudioRecord(source, sampleRate, CHANNEL, ENCODING, bufferSize);
+      audioRecord.startRecording();
+      startPullingData();
+    }
+  }
+
+  /**
+   * Stop recording
+   */
+  public void stop() {
+    if (isRecording) {
+      isRecording = false;
+      audioRecord.stop();
+      audioRecord.release();
+      audioRecord = null;
+      try {
+        os.close();
+      } catch (IOException e) {
+        e.printStackTrace();
+      }
+    }
+  }
+
+  private void startPullingData() {
+    new Thread() {
+      @Override
+      public void run(){
+        byte data[] = new byte[bufferSize];
+        while (isRecording) {
+          int read = audioRecord.read(data, 0, bufferSize);
+          if (read > 0) {
+            os.write(data, 0, read);
+          }
+          if (read < 0) {
+            break;
+          }
+        }
+      }
+    }.start();
+  }
+
+  /**
+   * Returns the sample rate for this recorder.
+   */
+  public int getSampleRate() {
+    return sampleRate;
+  }
+
+  /**
+   * Returns the audio source currently being used.
+   */
+  public int getAudioSource() {
+    return source;
+  }
+
+  /**
+   * Returns true if recorder is recording; False if not.
+   */
+  public boolean isRecording() {
+    return isRecording;
+  }
+
+  /**
+   * Returns the raw data.
+   */
+  public byte[] getByte() {
+    return os.toByteArray();
+  }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioRoutingNotificationsActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioRoutingNotificationsActivity.java
new file mode 100644
index 0000000..b6a4255
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/AudioRoutingNotificationsActivity.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.content.Context;
+
+import android.media.AudioDeviceCallback;
+import android.media.AudioDeviceInfo;
+import android.media.AudioManager;
+import android.media.AudioRecord;
+import android.media.AudioTrack;
+
+import android.os.Bundle;
+import android.os.Handler;
+
+import android.util.Log;
+
+import android.view.View;
+import android.view.View.OnClickListener;
+
+import android.widget.Button;
+import android.widget.TextView;
+
+/**
+ * Tests AudioTrack and AudioRecord (re)Routing messages.
+ */
+public class AudioRoutingNotificationsActivity extends PassFailButtons.Activity {
+    private static final String TAG = "AudioRoutingNotificationsActivity";
+
+    Context mContext;
+
+    OnBtnClickListener mBtnClickListener = new OnBtnClickListener();
+
+    int mNumTrackNotifications = 0;
+    int mNumRecordNotifications = 0;
+
+    TrivialPlayer mAudioPlayer = new TrivialPlayer();
+    TrivialRecorder mAudioRecorder = new TrivialRecorder();
+
+    private class OnBtnClickListener implements OnClickListener {
+        @Override
+        public void onClick(View v) {
+            switch (v.getId()) {
+                case R.id.audio_routingnotification_playBtn:
+                    Log.i(TAG, "audio_routingnotification_playBtn");
+                    mAudioPlayer.start();
+                    break;
+
+                case R.id.audio_routingnotification_playStopBtn:
+                    Log.i(TAG, "audio_routingnotification_playStopBtn");
+                    mAudioPlayer.stop();
+                    break;
+
+                case R.id.audio_routingnotification_recordBtn:
+                    break;
+
+                case R.id.audio_routingnotification_recordStopBtn:
+                    break;
+            }
+        }
+    }
+
+    private class AudioTrackRoutingChangeListener implements AudioTrack.OnRoutingChangedListener {
+        public void onRoutingChanged(AudioTrack audioTrack) {
+            mNumTrackNotifications++;
+            TextView textView =
+                (TextView)findViewById(R.id.audio_routingnotification_audioTrack_change);
+            String msg = mContext.getResources().getString(
+                    R.string.audio_routingnotification_trackRoutingMsg);
+            AudioDeviceInfo routedDevice = audioTrack.getRoutedDevice();
+            CharSequence deviceName = routedDevice != null ? routedDevice.getProductName() : "none";
+            int deviceType = routedDevice != null ? routedDevice.getType() : -1;
+            textView.setText(msg + " - " +
+                             deviceName + " [0x" + Integer.toHexString(deviceType) + "]" +
+                             " - " + mNumTrackNotifications);
+        }
+    }
+
+    private class AudioRecordRoutingChangeListener implements AudioRecord.OnRoutingChangedListener {
+        public void onRoutingChanged(AudioRecord audioRecord) {
+            mNumRecordNotifications++;
+            TextView textView =
+                    (TextView)findViewById(R.id.audio_routingnotification_audioRecord_change);
+            String msg = mContext.getResources().getString(
+                    R.string.audio_routingnotification_recordRoutingMsg);
+            AudioDeviceInfo routedDevice = audioRecord.getRoutedDevice();
+            CharSequence deviceName = routedDevice != null ? routedDevice.getProductName() : "none";
+            int deviceType = routedDevice != null ? routedDevice.getType() : -1;
+            textView.setText(msg + " - " +
+                             deviceName + " [0x" + Integer.toHexString(deviceType) + "]" +
+                             " - " + mNumRecordNotifications);
+        }
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.audio_routingnotifications_test);
+
+        Button btn;
+        btn = (Button)findViewById(R.id.audio_routingnotification_playBtn);
+        btn.setOnClickListener(mBtnClickListener);
+        btn = (Button)findViewById(R.id.audio_routingnotification_playStopBtn);
+        btn.setOnClickListener(mBtnClickListener);
+        btn = (Button)findViewById(R.id.audio_routingnotification_recordBtn);
+        btn.setOnClickListener(mBtnClickListener);
+        btn = (Button)findViewById(R.id.audio_routingnotification_recordStopBtn);
+        btn.setOnClickListener(mBtnClickListener);
+
+        mContext = this;
+
+        AudioTrack audioTrack = mAudioPlayer.getAudioTrack();
+        audioTrack.addOnRoutingChangedListener(
+            new AudioTrackRoutingChangeListener(), new Handler());
+
+        AudioRecord audioRecord = mAudioRecorder.getAudioRecord();
+        audioRecord.addOnRoutingChangedListener(
+            new AudioRecordRoutingChangeListener(), new Handler());
+
+        setPassFailButtonClickListeners();
+    }
+
+    @Override
+    public void onBackPressed () {
+        mAudioPlayer.shutDown();
+        mAudioRecorder.shutDown();
+        super.onBackPressed();
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/Common.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/Common.java
new file mode 100644
index 0000000..df7460a
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/Common.java
@@ -0,0 +1,142 @@
+package com.android.cts.verifier.audio;
+
+import android.media.AudioManager;
+import android.media.AudioTrack;
+
+import java.util.ArrayList;
+import java.util.Random;
+
+/**
+ * This class stores common constants and methods.
+ */
+public class Common {
+
+  public static final int RECORDING_SAMPLE_RATE_HZ
+      = AudioRecordHelper.getInstance().getSampleRate();
+  public static final int PLAYING_SAMPLE_RATE_HZ
+      = AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_MUSIC);
+
+  // Default constants.
+  public static final double PASSING_THRESHOLD_DB = -40.0;
+  public static final double PIP_DURATION_S = 0.004;
+  public static final double PAUSE_DURATION_S = 0.016;
+  public static final int PREFIX_NUM_CHIPS = 1023;
+  public static final int PREFIX_SAMPLES_PER_CHIP = 4;
+  public static final double PREFIX_LENGTH_S = 0.1;
+  public static final double PAUSE_BEFORE_PREFIX_DURATION_S = 0.5;
+  public static final double PAUSE_AFTER_PREFIX_DURATION_S = 0.4;
+  public static final double MIN_FREQUENCY_HZ = 500;
+  public static final double MAX_FREQUENCY_HZ = 21000;
+  public static final double FREQUENCY_STEP_HZ = 100;
+  public static final int SIGNAL_MIN_STRENGTH_DB_ABOVE_NOISE = 10;
+  public static final int REPETITIONS = 5;
+  public static final int NOISE_SAMPLES = 3;
+
+  public static final double[] FREQUENCIES_ORIGINAL = originalFrequencies();
+  public static final int PIP_NUM = FREQUENCIES_ORIGINAL.length;
+  public static final int[] ORDER = order();
+  public static final double[] FREQUENCIES = frequencies();
+
+  public static final double[] WINDOW_FOR_RECORDER =
+      hann(Util.toLength(PIP_DURATION_S, RECORDING_SAMPLE_RATE_HZ));
+  public static final double[] WINDOW_FOR_PLAYER =
+      hann(Util.toLength(PIP_DURATION_S, PLAYING_SAMPLE_RATE_HZ));
+
+  public static final double[] PREFIX_FOR_RECORDER = prefix(RECORDING_SAMPLE_RATE_HZ);
+  public static final double[] PREFIX_FOR_PLAYER = prefix(PLAYING_SAMPLE_RATE_HZ);
+
+  /**
+   * Get a Hann window.
+   */
+  private static double[] hann(int windowWidth) {
+    double[] envelopeArray = new double[windowWidth];
+    for (int i = 0; i < windowWidth; i++) {
+      envelopeArray[i] = 0.5
+          * (1 - Math.cos(2 * Math.PI * i / windowWidth));
+    }
+    return envelopeArray;
+  }
+
+  /**
+   * Get a maximum length sequence, used as prefix to indicate start of signal.
+   */
+  private static double[] prefix(int rate) {
+    double[] codeSequence = new double[PREFIX_NUM_CHIPS];
+    for (int i = 0; i < PREFIX_NUM_CHIPS; i++) {
+      if (i < 10) {
+        codeSequence[i] = 1;
+      } else {
+        codeSequence[i] = -codeSequence[i - 6] * codeSequence[i - 7]
+            * codeSequence[i - 9] * codeSequence[i - 10];
+      }
+    }
+    double[] prefixArray = new double[PREFIX_NUM_CHIPS * PREFIX_SAMPLES_PER_CHIP];
+    int offset = 0;
+    for (int i = 0; i < PREFIX_NUM_CHIPS; i++) {
+      double value = codeSequence[i];
+      for (int j = 0; j < PREFIX_SAMPLES_PER_CHIP; j++) {
+        prefixArray[offset + j] = value;
+      }
+      offset += PREFIX_SAMPLES_PER_CHIP;
+    }
+    int prefixLength = (int) Math.round(PREFIX_LENGTH_S * rate);
+    double[] samplePrefixArray = new double[prefixLength];
+    for (int i = 0; i < prefixLength; i++) {
+      double index = (double) i / prefixLength * (prefixArray.length - 1);
+      samplePrefixArray[i] = (1 - index + Math.floor(index)) * prefixArray[(int) Math.floor(index)]
+          + (1 + index - Math.ceil(index)) * prefixArray[(int) Math.ceil(index)];
+    }
+    return samplePrefixArray;
+  }
+
+  /**
+   * Returns array consists the frequencies of the test pips in the order that will be used in test.
+   */
+  private static double[] frequencies() {
+    double[] originalFrequencies = originalFrequencies();
+
+    double[] randomFrequencies = new double[Common.REPETITIONS * originalFrequencies.length];
+    for (int i = 0; i < REPETITIONS * originalFrequencies.length; i++) {
+      randomFrequencies[i] = originalFrequencies[ORDER[i] % originalFrequencies.length];
+    }
+
+    return randomFrequencies;
+  }
+
+  /**
+   * Returns array consists the frequencies of the test pips.
+   */
+  private static double[] originalFrequencies() {
+    ArrayList<Double> frequencies = new ArrayList<Double>();
+    double frequency = Common.MIN_FREQUENCY_HZ;
+    while (frequency <= Common.MAX_FREQUENCY_HZ) {
+      frequencies.add(new Double(frequency));
+      if ((frequency >= 18500) && (frequency < 20000)) {
+        frequency += Common.FREQUENCY_STEP_HZ;
+      } else {
+        frequency += Common.FREQUENCY_STEP_HZ * 10;
+      }
+    }
+    Double[] frequenciesArray = frequencies.toArray(new Double[frequencies.size()]);
+    double[] frequenciesPrimitiveArray = new double[frequenciesArray.length];
+    for (int i = 0; i < frequenciesArray.length; i++) {
+      frequenciesPrimitiveArray[i] = frequenciesArray[i];
+    }
+    return frequenciesPrimitiveArray;
+  }
+
+  /**
+   * Fisher-Yates shuffle.
+   */
+  private static int[] order() {
+    int[] order = new int[REPETITIONS * PIP_NUM];
+    long seed = 0;
+    Random generator = new Random(seed);
+    for (int i = 0; i < REPETITIONS * PIP_NUM; i++) {
+      int j = generator.nextInt(i + 1);
+      order[i] = order[j];
+      order[j] = i;
+    }
+    return order;
+  }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/Correlation.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/Correlation.java
new file mode 100644
index 0000000..75b04eb
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/Correlation.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio;
+
+import android.util.Log;
+
+
+public class Correlation {
+
+    private int mBlockSize = 4096;
+    private int mSamplingRate = 44100;
+    private double [] mDataDownsampled = new double [mBlockSize];
+    private double [] mDataAutocorrelated = new double[mBlockSize];
+
+    public double mEstimatedLatencySamples = 0;
+    public double mEstimatedLatencyMs = 0;
+    public double mEstimatedLatencyConfidence = 0.0;
+
+    public void init(int blockSize, int samplingRate) {
+        mBlockSize = blockSize;
+        mSamplingRate = samplingRate;
+    }
+
+    public boolean computeCorrelation(double [] data, int samplingRate) {
+        boolean status = false;
+        log("Started Auto Correlation for data with " + data.length + " points");
+        mSamplingRate = samplingRate;
+
+        downsampleData(data, mDataDownsampled);
+
+        //correlation vector
+        autocorrelation(mDataDownsampled, mDataAutocorrelated);
+
+        int N = data.length; //all samples available
+        double groupSize =  (double) N / mBlockSize;  //samples per downsample point.
+
+        double maxValue = 0;
+        int maxIndex = -1;
+
+        double minLatencyMs = 8; //min latency expected. This algorithm should be improved.
+        int minIndex = (int)(0.5 + minLatencyMs * mSamplingRate / (groupSize*1000));
+
+        double average = 0;
+        double rms = 0;
+        //find max
+        for (int i=minIndex; i<mDataAutocorrelated.length; i++) {
+            average += mDataAutocorrelated[i];
+            rms += mDataAutocorrelated[i]*mDataAutocorrelated[i];
+            if (mDataAutocorrelated[i] > maxValue) {
+                maxValue = mDataAutocorrelated[i];
+                maxIndex = i;
+            }
+        }
+
+        rms = Math.sqrt(rms/mDataAutocorrelated.length);
+        average = average/mDataAutocorrelated.length;
+        log(String.format(" Maxvalue %f, max Index : %d/%d (%d)  minIndex=%d",maxValue, maxIndex,
+                mDataAutocorrelated.length, data.length, minIndex));
+
+        log(String.format("  average : %.3f  rms: %.3f", average, rms));
+
+        mEstimatedLatencyConfidence = 0.0;
+        if (average>0) {
+            double factor = 3.0;
+
+            double raw = (rms-average) /(factor*average);
+            log(String.format("Raw: %.3f",raw));
+            mEstimatedLatencyConfidence = Math.max(Math.min(raw, 1.0),0.0);
+        }
+
+        log(String.format(" ****Confidence: %.2f",mEstimatedLatencyConfidence));
+
+        mEstimatedLatencySamples = maxIndex*groupSize;
+
+        mEstimatedLatencyMs = mEstimatedLatencySamples *1000/mSamplingRate;
+
+        log(String.format(" latencySamples: %.2f  %.2f ms", mEstimatedLatencySamples,
+                mEstimatedLatencyMs));
+
+        status = true;
+        return status;
+    }
+
+    private boolean downsampleData(double [] data, double [] dataDownsampled) {
+
+        boolean status = false;
+        // mDataDownsampled = new double[mBlockSize];
+        for (int i=0; i<mBlockSize; i++) {
+            dataDownsampled[i] = 0;
+        }
+
+        int N = data.length; //all samples available
+        double groupSize =  (double) N / mBlockSize;
+
+        int currentIndex = 0;
+        double nextGroup = groupSize;
+        for (int i = 0; i<N && currentIndex<mBlockSize; i++) {
+
+            if (i> nextGroup) { //advanced to next group.
+                currentIndex++;
+                nextGroup += groupSize;
+            }
+
+            if (currentIndex>=mBlockSize) {
+                break;
+            }
+            dataDownsampled[currentIndex] += Math.abs(data[i]);
+        }
+
+        status = true;
+        return status;
+    }
+
+    private boolean autocorrelation(double [] data, double [] dataOut) {
+        boolean status = false;
+
+        double sumsquared = 0;
+        int N = data.length;
+        for (int i=0; i<N; i++) {
+            double value = data[i];
+            sumsquared += value*value;
+        }
+
+        if (sumsquared>0) {
+            for (int i = 0; i < N; i++) {
+                dataOut[i] = 0;
+                for (int j = 0; j < N - i; j++) {
+
+                    dataOut[i] += data[j] * data[i + j];
+                }
+                dataOut[i] = dataOut[i] / sumsquared;
+            }
+            status = true;
+        }
+
+        return status;
+    }
+
+    private static void log(String msg) {
+        Log.v("Recorder", msg);
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/HifiUltrasoundSpeakerTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/HifiUltrasoundSpeakerTestActivity.java
new file mode 100644
index 0000000..dc81e19
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/HifiUltrasoundSpeakerTestActivity.java
@@ -0,0 +1,430 @@
+/*
+ * 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 com.android.cts.verifier.audio;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.content.Context;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.text.method.ScrollingMovementMethod;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.LinearLayout.LayoutParams;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+import java.util.Arrays;
+
+import com.androidplot.xy.SimpleXYSeries;
+import com.androidplot.xy.XYSeries;
+import com.androidplot.xy.*;
+
+public class HifiUltrasoundSpeakerTestActivity extends PassFailButtons.Activity {
+
+  public enum Status {
+    START, RECORDING, DONE, PLAYER
+  }
+
+  private static final String TAG = "HifiUltrasoundTestActivity";
+
+  private Status status = Status.START;
+  private boolean onPlotScreen = false;
+  private boolean onInstruScreen = false;
+  private TextView info;
+  private Button playerButton;
+  private Button recorderButton;
+  private AudioTrack audioTrack;
+  private LayoutInflater layoutInflater;
+  private View popupView;
+  private View instruView;
+  private PopupWindow popupWindow;
+  private PopupWindow instruWindow;
+  private boolean micSupport = true;
+  private boolean spkrSupport = true;
+
+  @Override
+  public void onBackPressed () {
+    if (onPlotScreen) {
+      popupWindow.dismiss();
+      onPlotScreen = false;
+      recorderButton.setEnabled(true);
+    } else if (onInstruScreen) {
+      instruWindow.dismiss();
+      onInstruScreen = false;
+      if (status == Status.PLAYER) {
+        playerButton.setEnabled(spkrSupport);
+      } else {
+        recorderButton.setEnabled(micSupport);
+      }
+      if (status == Status.PLAYER) {
+        getPassButton().setEnabled(true);
+      }
+    } else {
+      super.onBackPressed();
+    }
+  }
+
+  @Override
+  protected void onCreate(Bundle savedInstanceState) {
+    super.onCreate(savedInstanceState);
+    setContentView(R.layout.hifi_ultrasound);
+    setInfoResources(R.string.hifi_ultrasound_speaker_test,
+        R.string.hifi_ultrasound_speaker_test_info, -1);
+    setPassFailButtonClickListeners();
+    getPassButton().setEnabled(false);
+
+    info = (TextView) findViewById(R.id.info_text);
+    info.setMovementMethod(new ScrollingMovementMethod());
+    info.setText(R.string.hifi_ultrasound_speaker_test_instruction1);
+
+    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+    String micSupportString = audioManager.getProperty(
+        AudioManager.PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND);
+    String spkrSupportString = audioManager.getProperty(
+        AudioManager.PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND);
+    Log.d(TAG, "PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND = " + micSupportString);
+    Log.d(TAG, "PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND = " + spkrSupportString);
+
+    if (micSupportString == null) {
+      micSupportString = "null";
+    }
+    if (spkrSupportString == null) {
+      spkrSupportString = "null";
+    }
+    if (micSupportString.equalsIgnoreCase(getResources().getString(
+        R.string.hifi_ultrasound_test_default_false_string))) {
+      micSupport = false;
+      getPassButton().setEnabled(true);
+      info.append(getResources().getString(R.string.hifi_ultrasound_speaker_test_mic_no_support));
+    }
+    if (spkrSupportString.equalsIgnoreCase(getResources().getString(
+        R.string.hifi_ultrasound_test_default_false_string))) {
+      spkrSupport = false;
+      info.append(getResources().getString(R.string.hifi_ultrasound_speaker_test_spkr_no_support));
+    }
+
+    layoutInflater = (LayoutInflater) getBaseContext().getSystemService(
+        LAYOUT_INFLATER_SERVICE);
+    popupView = layoutInflater.inflate(R.layout.hifi_ultrasound_popup, null);
+    popupWindow = new PopupWindow(
+        popupView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+    instruView = layoutInflater.inflate(R.layout.hifi_ultrasound_popup_instru, null);
+    instruWindow = new PopupWindow(
+        instruView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+
+    final AudioRecordHelper audioRecorder = AudioRecordHelper.getInstance();
+    final int recordRate = audioRecorder.getSampleRate();
+
+    recorderButton = (Button) findViewById(R.id.recorder_button);
+    recorderButton.setEnabled(micSupport);
+    recorderButton.setOnClickListener(new View.OnClickListener() {
+      private WavAnalyzerTask wavAnalyzerTask = null;
+      private void stopRecording() {
+        audioRecorder.stop();
+        wavAnalyzerTask = new WavAnalyzerTask(audioRecorder.getByte());
+        wavAnalyzerTask.execute();
+        status = Status.DONE;
+      }
+      @Override
+      public void onClick(View v) {
+        switch (status) {
+          case START:
+            info.append("Recording at " + recordRate + "Hz using ");
+            final int source = audioRecorder.getAudioSource();
+            switch (source) {
+              case 1:
+                info.append("MIC");
+                break;
+              case 6:
+                info.append("VOICE_RECOGNITION");
+                break;
+              default:
+                info.append("UNEXPECTED " + source);
+                break;
+            }
+            info.append("\n");
+            status = Status.RECORDING;
+            playerButton.setEnabled(false);
+            recorderButton.setEnabled(false);
+            audioRecorder.start();
+
+            final View finalV = v;
+            new Thread() {
+              @Override
+              public void run() {
+                Double recordingDuration_millis = new Double(1000 * (2.5
+                    + Common.PREFIX_LENGTH_S
+                    + Common.PAUSE_BEFORE_PREFIX_DURATION_S
+                    + Common.PAUSE_AFTER_PREFIX_DURATION_S
+                    + Common.PIP_NUM * (Common.PIP_DURATION_S + Common.PAUSE_DURATION_S)
+                    * Common.REPETITIONS));
+                Log.d(TAG, "Recording for " + recordingDuration_millis + "ms");
+                try {
+                  Thread.sleep(recordingDuration_millis.intValue());
+                } catch (InterruptedException e) {
+                  throw new RuntimeException(e);
+                }
+                runOnUiThread(new Runnable() {
+                  @Override
+                  public void run() {
+                    stopRecording();
+                  }
+                });
+              }
+            }.start();
+
+            break;
+
+          case DONE:
+            plotResponse(wavAnalyzerTask);
+            break;
+
+          default: break;
+        }
+      }
+    });
+
+    playerButton = (Button) findViewById(R.id.player_button);
+    playerButton.setEnabled(spkrSupport);
+    playerButton.setOnClickListener(new View.OnClickListener() {
+      @Override
+      public void onClick(View v) {
+        recorderButton.setEnabled(false);
+        status = Status.PLAYER;
+        play();
+
+        Button okButton = (Button)instruView.findViewById(R.id.ok);
+        okButton.setOnClickListener(new Button.OnClickListener() {
+          @Override
+          public void onClick(View v) {
+            instruWindow.dismiss();
+            onInstruScreen = false;
+            if (status == Status.PLAYER) {
+              playerButton.setEnabled(spkrSupport);
+            } else {
+              recorderButton.setEnabled(micSupport);
+            }
+            getPassButton().setEnabled(true);
+          }
+        });
+        TextView instruction = (TextView)instruView.findViewById(R.id.instru);
+        instruction.setText(R.string.hifi_ultrasound_speaker_test_test_side);
+        instruWindow.showAtLocation(info, Gravity.CENTER, 0, 0);
+        recorderButton.setEnabled(false);
+        playerButton.setEnabled(false);
+        onInstruScreen = true;
+      }
+    });
+  }
+
+  private void plotResponse(WavAnalyzerTask wavAnalyzerTask) {
+    Button dismissButton = (Button)popupView.findViewById(R.id.dismiss);
+    dismissButton.setOnClickListener(new Button.OnClickListener(){
+      @Override
+      public void onClick(View v) {
+        popupWindow.dismiss();
+        onPlotScreen = false;
+        recorderButton.setEnabled(true);
+      }});
+    popupWindow.showAtLocation(info, Gravity.CENTER, 0, 0);
+    onPlotScreen = true;
+
+    recorderButton.setEnabled(false);
+
+    XYPlot plot = (XYPlot) popupView.findViewById(R.id.responseChart);
+    plot.setDomainStep(XYStepMode.INCREMENT_BY_VAL, 2000);
+
+    Double[] frequencies = new Double[Common.PIP_NUM];
+    for (int i = 0; i < Common.PIP_NUM; i++) {
+      frequencies[i] = new Double(Common.FREQUENCIES_ORIGINAL[i]);
+    }
+
+    if (wavAnalyzerTask != null) {
+
+      double[][] power = wavAnalyzerTask.getPower();
+      for(int i = 0; i < Common.REPETITIONS; i++) {
+        Double[] powerWrap = new Double[Common.PIP_NUM];
+        for (int j = 0; j < Common.PIP_NUM; j++) {
+          powerWrap[j] = new Double(10 * Math.log10(power[j][i]));
+        }
+        XYSeries series = new SimpleXYSeries(
+            Arrays.asList(frequencies),
+            Arrays.asList(powerWrap),
+            "");
+        LineAndPointFormatter seriesFormat = new LineAndPointFormatter();
+        seriesFormat.configure(getApplicationContext(),
+            R.xml.ultrasound_line_formatter_trials);
+        seriesFormat.setPointLabelFormatter(null);
+        plot.addSeries(series, seriesFormat);
+      }
+
+      double[] noiseDB = wavAnalyzerTask.getNoiseDB();
+      Double[] noiseDBWrap = new Double[Common.PIP_NUM];
+      for (int i = 0; i < Common.PIP_NUM; i++) {
+        noiseDBWrap[i] = new Double(noiseDB[i]);
+      }
+
+      XYSeries noiseSeries = new SimpleXYSeries(
+          Arrays.asList(frequencies),
+          Arrays.asList(noiseDBWrap),
+          "background noise");
+      LineAndPointFormatter noiseSeriesFormat = new LineAndPointFormatter();
+      noiseSeriesFormat.configure(getApplicationContext(),
+          R.xml.ultrasound_line_formatter_noise);
+      noiseSeriesFormat.setPointLabelFormatter(null);
+      plot.addSeries(noiseSeries, noiseSeriesFormat);
+
+      double[] dB = wavAnalyzerTask.getDB();
+      Double[] dBWrap = new Double[Common.PIP_NUM];
+      for (int i = 0; i < Common.PIP_NUM; i++) {
+        dBWrap[i] = new Double(dB[i]);
+      }
+
+      XYSeries series = new SimpleXYSeries(
+          Arrays.asList(frequencies),
+          Arrays.asList(dBWrap),
+          "median");
+      LineAndPointFormatter seriesFormat = new LineAndPointFormatter();
+      seriesFormat.configure(getApplicationContext(),
+          R.xml.ultrasound_line_formatter_median);
+      seriesFormat.setPointLabelFormatter(null);
+      plot.addSeries(series, seriesFormat);
+
+      Double[] passX = new Double[] {Common.MIN_FREQUENCY_HZ, Common.MAX_FREQUENCY_HZ};
+      Double[] passY = new Double[] {wavAnalyzerTask.getThreshold(), wavAnalyzerTask.getThreshold()};
+      XYSeries passSeries = new SimpleXYSeries(
+          Arrays.asList(passX), Arrays.asList(passY), "passing");
+      LineAndPointFormatter passSeriesFormat = new LineAndPointFormatter();
+      passSeriesFormat.configure(getApplicationContext(),
+          R.xml.ultrasound_line_formatter_pass);
+      passSeriesFormat.setPointLabelFormatter(null);
+      plot.addSeries(passSeries, passSeriesFormat);
+    }
+  }
+
+  /**
+   * Plays the generated pips.
+   */
+  private void play() {
+    play(SoundGenerator.getInstance().getByte(), Common.PLAYING_SAMPLE_RATE_HZ);
+  }
+
+  /**
+   * Plays the sound data.
+   */
+  private void play(byte[] data, int sampleRate) {
+    if (audioTrack != null) {
+      audioTrack.stop();
+      audioTrack.release();
+    }
+    audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
+        sampleRate, AudioFormat.CHANNEL_OUT_MONO,
+        AudioFormat.ENCODING_PCM_16BIT, Math.max(data.length, AudioTrack.getMinBufferSize(
+        sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT)),
+        AudioTrack.MODE_STATIC);
+    audioTrack.write(data, 0, data.length);
+    audioTrack.play();
+  }
+
+  /**
+   * AsyncTask class for the analyzing.
+   */
+  private class WavAnalyzerTask extends AsyncTask<Void, String, String>
+      implements WavAnalyzer.Listener {
+
+    private static final String TAG = "WavAnalyzerTask";
+    WavAnalyzer wavAnalyzer;
+
+    public WavAnalyzerTask(byte[] recording) {
+      wavAnalyzer = new WavAnalyzer(recording, Common.RECORDING_SAMPLE_RATE_HZ,
+          WavAnalyzerTask.this);
+    }
+
+    double[] getDB() {
+      return wavAnalyzer.getDB();
+    }
+
+    double[][] getPower() {
+      return wavAnalyzer.getPower();
+    }
+
+    double[] getNoiseDB() {
+      return wavAnalyzer.getNoiseDB();
+    }
+
+    double getThreshold() {
+      return wavAnalyzer.getThreshold();
+    }
+
+    @Override
+    protected String doInBackground(Void... params) {
+      boolean result = wavAnalyzer.doWork();
+      if (result) {
+        return getString(R.string.hifi_ultrasound_test_pass);
+      }
+      return getString(R.string.hifi_ultrasound_test_fail);
+    }
+
+    @Override
+    protected void onPostExecute(String result) {
+      info.append(result);
+      recorderButton.setEnabled(true);
+      recorderButton.setText(R.string.hifi_ultrasound_test_plot);
+
+      Button okButton = (Button)instruView.findViewById(R.id.ok);
+      okButton.setOnClickListener(new Button.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+          instruWindow.dismiss();
+          onInstruScreen = false;
+          if (status == HifiUltrasoundSpeakerTestActivity.Status.PLAYER) {
+            playerButton.setEnabled(spkrSupport);
+          } else {
+            recorderButton.setEnabled(micSupport);
+          }
+        }
+      });
+      TextView instruction = (TextView) instruView.findViewById(R.id.instru);
+      instruction.setText(R.string.hifi_ultrasound_speaker_test_reference_side);
+      instruWindow.showAtLocation(info, Gravity.CENTER, 0, 0);
+      recorderButton.setEnabled(false);
+      playerButton.setEnabled(false);
+      onInstruScreen = true;
+    }
+
+    @Override
+    protected void onProgressUpdate(String... values) {
+      for (String message : values) {
+        info.append(message);
+        Log.d(TAG, message);
+      }
+    }
+
+    @Override
+    public void sendMessage(String message) {
+      publishProgress(message);
+    }
+  }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/HifiUltrasoundTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/HifiUltrasoundTestActivity.java
new file mode 100644
index 0000000..85b3e37
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/HifiUltrasoundTestActivity.java
@@ -0,0 +1,374 @@
+/*
+ * 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 com.android.cts.verifier.audio;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.content.Context;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.text.method.ScrollingMovementMethod;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.LinearLayout.LayoutParams;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+import java.util.Arrays;
+
+import com.androidplot.xy.SimpleXYSeries;
+import com.androidplot.xy.XYSeries;
+import com.androidplot.xy.*;
+
+public class HifiUltrasoundTestActivity extends PassFailButtons.Activity {
+
+  public enum Status {
+    START, RECORDING, DONE, PLAYER
+  }
+
+  private static final String TAG = "HifiUltrasoundTestActivity";
+
+  private Status status = Status.START;
+  private boolean onPlotScreen = false;
+  private TextView info;
+  private Button playerButton;
+  private Button recorderButton;
+  private AudioTrack audioTrack;
+  private LayoutInflater layoutInflater;
+  private View popupView;
+  private PopupWindow popupWindow;
+  private boolean micSupport = true;
+  private boolean spkrSupport = true;
+
+  @Override
+  public void onBackPressed () {
+    if (onPlotScreen) {
+      popupWindow.dismiss();
+      onPlotScreen = false;
+      recorderButton.setEnabled(true);
+    } else {
+      super.onBackPressed();
+    }
+  }
+
+  @Override
+  protected void onCreate(Bundle savedInstanceState) {
+    super.onCreate(savedInstanceState);
+    setContentView(R.layout.hifi_ultrasound);
+    setInfoResources(R.string.hifi_ultrasound_test, R.string.hifi_ultrasound_test_info, -1);
+    setPassFailButtonClickListeners();
+    getPassButton().setEnabled(false);
+
+    info = (TextView) findViewById(R.id.info_text);
+    info.setMovementMethod(new ScrollingMovementMethod());
+    info.setText(R.string.hifi_ultrasound_test_instruction1);
+
+    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+    String micSupportString = audioManager.getProperty(
+        AudioManager.PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND);
+    String spkrSupportString = audioManager.getProperty(
+        AudioManager.PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND);
+    Log.d(TAG, "PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND = " + micSupportString);
+    Log.d(TAG, "PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND = " + spkrSupportString);
+
+    if (micSupportString == null) {
+      micSupportString = "null";
+    }
+    if (spkrSupportString == null) {
+      spkrSupportString = "null";
+    }
+    if (micSupportString.equalsIgnoreCase(getResources().getString(
+        R.string.hifi_ultrasound_test_default_false_string))) {
+      micSupport = false;
+      getPassButton().setEnabled(true);
+      info.append(getResources().getString(R.string.hifi_ultrasound_test_mic_no_support));
+    }
+    if (spkrSupportString.equalsIgnoreCase(getResources().getString(
+        R.string.hifi_ultrasound_test_default_false_string))) {
+      spkrSupport = false;
+      info.append(getResources().getString(R.string.hifi_ultrasound_test_spkr_no_support));
+    }
+
+    layoutInflater = (LayoutInflater) getBaseContext().getSystemService(
+        LAYOUT_INFLATER_SERVICE);
+    popupView = layoutInflater.inflate(R.layout.hifi_ultrasound_popup, null);
+    popupWindow = new PopupWindow(
+        popupView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+
+    final AudioRecordHelper audioRecorder = AudioRecordHelper.getInstance();
+    final int recordRate = audioRecorder.getSampleRate();
+
+    recorderButton = (Button) findViewById(R.id.recorder_button);
+    recorderButton.setEnabled(micSupport);
+    recorderButton.setOnClickListener(new View.OnClickListener() {
+      private WavAnalyzerTask wavAnalyzerTask = null;
+      private void stopRecording() {
+        audioRecorder.stop();
+        wavAnalyzerTask = new WavAnalyzerTask(audioRecorder.getByte());
+        wavAnalyzerTask.execute();
+        status = Status.DONE;
+      }
+      @Override
+      public void onClick(View v) {
+        switch (status) {
+          case START:
+            info.append("Recording at " + recordRate + "Hz using ");
+            final int source = audioRecorder.getAudioSource();
+            switch (source) {
+              case 1:
+                info.append("MIC");
+                break;
+              case 6:
+                info.append("VOICE_RECOGNITION");
+                break;
+              default:
+                info.append("UNEXPECTED " + source);
+                break;
+            }
+            info.append("\n");
+            status = Status.RECORDING;
+            playerButton.setEnabled(false);
+            recorderButton.setEnabled(false);
+            audioRecorder.start();
+
+            final View finalV = v;
+            new Thread() {
+              @Override
+              public void run() {
+                Double recordingDuration_millis = new Double(1000 * (2.5
+                    + Common.PREFIX_LENGTH_S
+                    + Common.PAUSE_BEFORE_PREFIX_DURATION_S
+                    + Common.PAUSE_AFTER_PREFIX_DURATION_S
+                    + Common.PIP_NUM * (Common.PIP_DURATION_S + Common.PAUSE_DURATION_S)
+                    * Common.REPETITIONS));
+                Log.d(TAG, "Recording for " + recordingDuration_millis + "ms");
+                try {
+                  Thread.sleep(recordingDuration_millis.intValue());
+                } catch (InterruptedException e) {
+                  throw new RuntimeException(e);
+                }
+                runOnUiThread(new Runnable() {
+                  @Override
+                  public void run() {
+                    stopRecording();
+                  }
+                });
+              }
+            }.start();
+
+            break;
+
+          case DONE:
+            plotResponse(wavAnalyzerTask);
+            break;
+
+          default: break;
+        }
+      }
+    });
+
+    playerButton = (Button) findViewById(R.id.player_button);
+    playerButton.setEnabled(spkrSupport);
+    playerButton.setOnClickListener(new View.OnClickListener() {
+      @Override
+      public void onClick(View v) {
+        recorderButton.setEnabled(false);
+        status = Status.PLAYER;
+        play();
+      }
+    });
+  }
+
+  private void plotResponse(WavAnalyzerTask wavAnalyzerTask) {
+    Button dismissButton = (Button)popupView.findViewById(R.id.dismiss);
+    dismissButton.setOnClickListener(new Button.OnClickListener(){
+      @Override
+      public void onClick(View v) {
+        popupWindow.dismiss();
+        onPlotScreen = false;
+        recorderButton.setEnabled(true);
+      }});
+    popupWindow.showAtLocation(info, Gravity.CENTER, 0, 0);
+    onPlotScreen = true;
+
+    recorderButton.setEnabled(false);
+
+    XYPlot plot = (XYPlot) popupView.findViewById(R.id.responseChart);
+    plot.setDomainStep(XYStepMode.INCREMENT_BY_VAL, 2000);
+
+    Double[] frequencies = new Double[Common.PIP_NUM];
+    for (int i = 0; i < Common.PIP_NUM; i++) {
+      frequencies[i] = new Double(Common.FREQUENCIES_ORIGINAL[i]);
+    }
+
+    if (wavAnalyzerTask != null) {
+
+      double[][] power = wavAnalyzerTask.getPower();
+      for(int i = 0; i < Common.REPETITIONS; i++) {
+        Double[] powerWrap = new Double[Common.PIP_NUM];
+        for (int j = 0; j < Common.PIP_NUM; j++) {
+          powerWrap[j] = new Double(10 * Math.log10(power[j][i]));
+        }
+        XYSeries series = new SimpleXYSeries(
+            Arrays.asList(frequencies),
+            Arrays.asList(powerWrap),
+            "");
+        LineAndPointFormatter seriesFormat = new LineAndPointFormatter();
+        seriesFormat.configure(getApplicationContext(),
+            R.xml.ultrasound_line_formatter_trials);
+        seriesFormat.setPointLabelFormatter(null);
+        plot.addSeries(series, seriesFormat);
+      }
+
+      double[] noiseDB = wavAnalyzerTask.getNoiseDB();
+      Double[] noiseDBWrap = new Double[Common.PIP_NUM];
+      for (int i = 0; i < Common.PIP_NUM; i++) {
+        noiseDBWrap[i] = new Double(noiseDB[i]);
+      }
+
+      XYSeries noiseSeries = new SimpleXYSeries(
+          Arrays.asList(frequencies),
+          Arrays.asList(noiseDBWrap),
+          "background noise");
+      LineAndPointFormatter noiseSeriesFormat = new LineAndPointFormatter();
+      noiseSeriesFormat.configure(getApplicationContext(),
+          R.xml.ultrasound_line_formatter_noise);
+      noiseSeriesFormat.setPointLabelFormatter(null);
+      plot.addSeries(noiseSeries, noiseSeriesFormat);
+
+      double[] dB = wavAnalyzerTask.getDB();
+      Double[] dBWrap = new Double[Common.PIP_NUM];
+      for (int i = 0; i < Common.PIP_NUM; i++) {
+        dBWrap[i] = new Double(dB[i]);
+      }
+
+      XYSeries series = new SimpleXYSeries(
+          Arrays.asList(frequencies),
+          Arrays.asList(dBWrap),
+          "median");
+      LineAndPointFormatter seriesFormat = new LineAndPointFormatter();
+      seriesFormat.configure(getApplicationContext(),
+          R.xml.ultrasound_line_formatter_median);
+      seriesFormat.setPointLabelFormatter(null);
+      plot.addSeries(series, seriesFormat);
+
+      Double[] passX = new Double[] {Common.MIN_FREQUENCY_HZ, Common.MAX_FREQUENCY_HZ};
+      Double[] passY = new Double[] {wavAnalyzerTask.getThreshold(), wavAnalyzerTask.getThreshold()};
+      XYSeries passSeries = new SimpleXYSeries(
+          Arrays.asList(passX), Arrays.asList(passY), "passing");
+      LineAndPointFormatter passSeriesFormat = new LineAndPointFormatter();
+      passSeriesFormat.configure(getApplicationContext(),
+          R.xml.ultrasound_line_formatter_pass);
+      passSeriesFormat.setPointLabelFormatter(null);
+      plot.addSeries(passSeries, passSeriesFormat);
+    }
+  }
+
+  /**
+   * Plays the generated pips.
+   */
+  private void play() {
+    play(SoundGenerator.getInstance().getByte(), Common.PLAYING_SAMPLE_RATE_HZ);
+  }
+
+  /**
+   * Plays the sound data.
+   */
+  private void play(byte[] data, int sampleRate) {
+    if (audioTrack != null) {
+      audioTrack.stop();
+      audioTrack.release();
+    }
+    audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
+        sampleRate, AudioFormat.CHANNEL_OUT_MONO,
+        AudioFormat.ENCODING_PCM_16BIT, Math.max(data.length, AudioTrack.getMinBufferSize(
+        sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT)),
+        AudioTrack.MODE_STATIC);
+    audioTrack.write(data, 0, data.length);
+    audioTrack.play();
+  }
+
+  /**
+   * AsyncTask class for the analyzing.
+   */
+  private class WavAnalyzerTask extends AsyncTask<Void, String, String>
+      implements WavAnalyzer.Listener {
+
+    private static final String TAG = "WavAnalyzerTask";
+    WavAnalyzer wavAnalyzer;
+
+    public WavAnalyzerTask(byte[] recording) {
+      wavAnalyzer = new WavAnalyzer(recording, Common.RECORDING_SAMPLE_RATE_HZ,
+          WavAnalyzerTask.this);
+    }
+
+    double[] getDB() {
+      return wavAnalyzer.getDB();
+    }
+
+    double[][] getPower() {
+      return wavAnalyzer.getPower();
+    }
+
+    double[] getNoiseDB() {
+      return wavAnalyzer.getNoiseDB();
+    }
+
+    double getThreshold() {
+      return wavAnalyzer.getThreshold();
+    }
+
+    @Override
+    protected String doInBackground(Void... params) {
+      boolean result = wavAnalyzer.doWork();
+      if (result) {
+        return getString(R.string.hifi_ultrasound_test_pass);
+      }
+      return getString(R.string.hifi_ultrasound_test_fail);
+    }
+
+    @Override
+    protected void onPostExecute(String result) {
+      info.append(result);
+      recorderButton.setEnabled(true);
+      if (wavAnalyzer.getResult()) {
+        getPassButton().setEnabled(true);
+      }
+      recorderButton.setText(R.string.hifi_ultrasound_test_plot);
+    }
+
+    @Override
+    protected void onProgressUpdate(String... values) {
+      for (String message : values) {
+        info.append(message);
+        Log.d(TAG, message);
+      }
+    }
+
+    @Override
+    public void sendMessage(String message) {
+      publishProgress(message);
+    }
+  }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/NativeAudioThread.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/NativeAudioThread.java
new file mode 100644
index 0000000..224d4c8
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/NativeAudioThread.java
@@ -0,0 +1,273 @@
+/*
+ * Copyright (C) 2015 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 org.drrickorang.loopback;
+
+package com.android.cts.verifier.audio;
+
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+//import android.media.MediaPlayer;
+import android.media.AudioRecord;
+import android.media.MediaRecorder;
+import android.util.Log;
+
+import android.os.Handler;
+import  android.os.Message;
+
+/**
+ * A thread/audio track based audio synth.
+ */
+public class NativeAudioThread extends Thread {
+
+    public boolean isRunning = false;
+    double twoPi = 6.28318530718;
+
+    public int mSessionId;
+
+    public double[] mvSamples; //captured samples
+    int mSamplesIndex;
+
+    private final int mSecondsToRun = 2;
+    public int mSamplingRate = 48000;
+    private int mChannelConfigIn = AudioFormat.CHANNEL_IN_MONO;
+    private int mAudioFormat = AudioFormat.ENCODING_PCM_16BIT;
+
+    int mMinPlayBufferSizeInBytes = 0;
+    int mMinRecordBuffSizeInBytes = 0;
+    private int mChannelConfigOut = AudioFormat.CHANNEL_OUT_MONO;
+
+    int mMicSource = 0;
+
+//    private double [] samples = new double[50000];
+
+    boolean isPlaying = false;
+    private Handler mMessageHandler;
+    boolean isDestroying = false;
+    boolean hasDestroyingErrors = false;
+
+    static final int NATIVE_AUDIO_THREAD_MESSAGE_REC_STARTED = 892;
+    static final int NATIVE_AUDIO_THREAD_MESSAGE_REC_ERROR = 893;
+    static final int NATIVE_AUDIO_THREAD_MESSAGE_REC_COMPLETE = 894;
+    static final int NATIVE_AUDIO_THREAD_MESSAGE_REC_COMPLETE_ERRORS = 895;
+
+    public void setParams(int samplingRate, int playBufferInBytes, int recBufferInBytes,
+            int micSource) {
+        mSamplingRate = samplingRate;
+        mMinPlayBufferSizeInBytes = playBufferInBytes;
+        mMinRecordBuffSizeInBytes = recBufferInBytes;
+        mMicSource = micSource;
+    }
+
+    //JNI load
+    static {
+        try {
+            System.loadLibrary("audioloopback_jni");
+        } catch (UnsatisfiedLinkError e) {
+            log("Error loading loopback JNI library");
+            e.printStackTrace();
+        }
+
+        /* TODO: gracefully fail/notify if the library can't be loaded */
+    }
+
+    //jni calls
+    public native long slesInit(int samplingRate, int frameCount, int micSource);
+    public native int slesProcessNext(long sles_data, double[] samples, long offset);
+    public native int slesDestroy(long sles_data);
+
+    public void run() {
+
+        setPriority(Thread.MAX_PRIORITY);
+        isRunning = true;
+
+        //erase output buffer
+        if (mvSamples != null)
+            mvSamples = null;
+
+        //resize
+        int nNewSize = (int)(1.1* mSamplingRate * mSecondsToRun ); //10% more just in case
+        mvSamples = new double[nNewSize];
+        mSamplesIndex = 0; //reset index
+
+        //clear samples
+        for (int i=0; i<nNewSize; i++) {
+            mvSamples[i] = 0;
+        }
+
+        //start playing
+        isPlaying = true;
+
+
+        log(" Started capture test");
+        if (mMessageHandler != null) {
+            Message msg = Message.obtain();
+            msg.what = NATIVE_AUDIO_THREAD_MESSAGE_REC_STARTED;
+            mMessageHandler.sendMessage(msg);
+        }
+
+
+
+        log(String.format("about to init, sampling rate: %d, buffer:%d", mSamplingRate,
+                mMinPlayBufferSizeInBytes/2 ));
+        long sles_data = slesInit(mSamplingRate, mMinPlayBufferSizeInBytes/2, mMicSource);
+        log(String.format("sles_data = 0x%X",sles_data));
+
+        if (sles_data == 0 ) {
+            log(" ERROR at JNI initialization");
+            if (mMessageHandler != null) {
+                Message msg = Message.obtain();
+                msg.what = NATIVE_AUDIO_THREAD_MESSAGE_REC_ERROR;
+                mMessageHandler.sendMessage(msg);
+            }
+        }  else {
+
+            //wait a little bit...
+            try {
+                sleep(10); //just to let it start properly?
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+
+
+
+            mSamplesIndex = 0;
+            int totalSamplesRead = 0;
+            long offset = 0;
+            for (int ii = 0; ii < mSecondsToRun; ii++) {
+                log(String.format("block %d...", ii));
+                int samplesRead = slesProcessNext(sles_data, mvSamples,offset);
+                totalSamplesRead += samplesRead;
+
+                offset += samplesRead;
+                log(" [" + ii + "] jni samples read:" + samplesRead + "  currentOffset:" + offset);
+            }
+
+            log(String.format(" samplesRead: %d, sampleOffset:%d", totalSamplesRead, offset));
+            log(String.format("about to destroy..."));
+
+            runDestroy(sles_data);
+
+            int maxTry = 20;
+            int tryCount = 0;
+            //isDestroying = true;
+            while (isDestroying) {
+
+                try {
+                    sleep(40);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+
+                tryCount++;
+
+                log("destroy try: " + tryCount);
+
+                if (tryCount >= maxTry) {
+                    hasDestroyingErrors = true;
+                    log("WARNING: waited for max time to properly destroy JNI.");
+                    break;
+                }
+            }
+            log(String.format("after destroying. TotalSamplesRead = %d", totalSamplesRead));
+
+            if (totalSamplesRead==0)
+            {
+                hasDestroyingErrors = true;
+            }
+
+            endTest();
+        }
+    }
+
+    public void setMessageHandler(Handler messageHandler) {
+        mMessageHandler = messageHandler;
+    }
+
+    private void runDestroy(final long sles_data ) {
+        isDestroying = true;
+
+        //start thread
+
+        final long local_sles_data = sles_data;
+        ////
+        Thread thread = new Thread(new Runnable() {
+            public void run() {
+                isDestroying = true;
+                log("**Start runnable destroy");
+
+                int status = slesDestroy(local_sles_data);
+                log(String.format("**End runnable destroy sles delete status: %d", status));
+                isDestroying = false;
+            }
+        });
+
+        thread.start();
+
+
+
+        log("end of runDestroy()");
+
+
+    }
+
+    public void togglePlay() {
+
+    }
+
+    public void runTest() {
+
+
+    }
+
+   public void endTest() {
+       log("--Ending capture test--");
+       isPlaying = false;
+
+
+       if (mMessageHandler != null) {
+           Message msg = Message.obtain();
+           if (hasDestroyingErrors)
+               msg.what = NATIVE_AUDIO_THREAD_MESSAGE_REC_COMPLETE_ERRORS;
+           else
+               msg.what = NATIVE_AUDIO_THREAD_MESSAGE_REC_COMPLETE;
+           mMessageHandler.sendMessage(msg);
+       }
+
+   }
+
+    public void finish() {
+
+        if (isRunning) {
+            isRunning = false;
+            try {
+                sleep(20);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    private static void log(String msg) {
+        Log.v("Loopback", msg);
+    }
+
+    double [] getWaveData () {
+        return mvSamples;
+    }
+
+}  //end thread.
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/SoundGenerator.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/SoundGenerator.java
new file mode 100644
index 0000000..0ad9371
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/SoundGenerator.java
@@ -0,0 +1,81 @@
+package com.android.cts.verifier.audio;
+
+/**
+ * Sound generator.
+ */
+public class SoundGenerator {
+
+  private static SoundGenerator instance;
+
+  private final byte[] generatedSound;
+  private final double[] sample;
+
+  private SoundGenerator() {
+    // Initialize sample.
+    int pipNum = Common.PIP_NUM;
+    int prefixTotalLength = Util.toLength(Common.PREFIX_LENGTH_S, Common.PLAYING_SAMPLE_RATE_HZ)
+        + Util.toLength(Common.PAUSE_BEFORE_PREFIX_DURATION_S, Common.PLAYING_SAMPLE_RATE_HZ)
+        + Util.toLength(Common.PAUSE_AFTER_PREFIX_DURATION_S, Common.PLAYING_SAMPLE_RATE_HZ);
+    int repetitionLength = pipNum * Util.toLength(
+        Common.PIP_DURATION_S + Common.PAUSE_DURATION_S, Common.PLAYING_SAMPLE_RATE_HZ);
+    int sampleLength = prefixTotalLength + Common.REPETITIONS * repetitionLength;
+    sample = new double[sampleLength];
+
+    // Fill sample with prefix.
+    System.arraycopy(Common.PREFIX_FOR_PLAYER, 0, sample,
+        Util.toLength(Common.PAUSE_BEFORE_PREFIX_DURATION_S, Common.PLAYING_SAMPLE_RATE_HZ),
+        Common.PREFIX_FOR_PLAYER.length);
+
+    // Fill the sample.
+    for (int i = 0; i < pipNum * Common.REPETITIONS; i++) {
+      double[] pip = getPip(Common.WINDOW_FOR_PLAYER, Common.FREQUENCIES[i]);
+      System.arraycopy(pip, 0, sample,
+          prefixTotalLength + i * Util.toLength(
+              Common.PIP_DURATION_S + Common.PAUSE_DURATION_S, Common.PLAYING_SAMPLE_RATE_HZ),
+          pip.length);
+    }
+
+    // Convert sample to byte.
+    generatedSound = new byte[2 * sample.length];
+    int i = 0;
+    for (double dVal : sample) {
+      short val = (short) ((dVal * 32767));
+      generatedSound[i++] = (byte) (val & 0x00ff);
+      generatedSound[i++] = (byte) ((val & 0xff00) >>> 8);
+    }
+  }
+
+  public static SoundGenerator getInstance() {
+    if (instance == null) {
+      instance = new SoundGenerator();
+    }
+    return instance;
+  }
+
+  /**
+   * Gets a pip sample.
+   */
+  private static double[] getPip(double[] window, double frequency) {
+    int pipArrayLength = window.length;
+    double[] pipArray = new double[pipArrayLength];
+    double radPerSample = 2 * Math.PI / (Common.PLAYING_SAMPLE_RATE_HZ / frequency);
+    for (int i = 0; i < pipArrayLength; i++) {
+      pipArray[i] = window[i] * Math.sin(i * radPerSample);
+    }
+    return pipArray;
+  }
+
+  /**
+   * Get generated sound in byte[].
+   */
+  public byte[] getByte() {
+    return generatedSound;
+  }
+
+  /**
+   * Get sample in double[].
+   */
+  public double[] getSample() {
+    return sample;
+  }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/SoundPlayerObject.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/SoundPlayerObject.java
new file mode 100644
index 0000000..23b71c0
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/SoundPlayerObject.java
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio;
+
+import android.content.Context;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+import android.media.MediaPlayer;
+import android.net.Uri;
+import android.net.rtp.AudioStream;
+import android.util.Log;
+
+import com.android.cts.verifier.audio.wavelib.PipeShort;
+
+import java.io.IOException;
+
+public class SoundPlayerObject extends Thread {
+    private static final String LOGTAG = "SoundPlayerObject";
+    private MediaPlayer mMediaPlayer;
+    private boolean isInitialized = false;
+    private boolean isRunning = false;
+
+    public PipeShort mPipe = new PipeShort(65536);
+    private short[] mAudioShortArray;
+
+    public AudioTrack mAudioTrack;
+    public int mSamplingRate = 48000;
+    private int mChannelConfigOut = AudioFormat.CHANNEL_OUT_MONO;
+    private int mAudioFormat = AudioFormat.ENCODING_PCM_16BIT;
+    int mMinPlayBufferSizeInBytes = 0;
+    int mMinBufferSizeInSamples = 0;
+
+    private int mStreamType = AudioManager.STREAM_MUSIC;
+    private int mResId = -1;
+    private boolean mUseMediaPlayer = true;
+    private float mBalance = 0.5f; //0 left, 1 right
+
+    public int getCurrentResId() {
+        return mResId;
+    }
+
+    public int getStreamType () {
+        return mStreamType;
+    }
+
+    public void run() {
+        setPriority(Thread.MAX_PRIORITY);
+        isRunning = true;
+        while (isRunning) {
+
+            if (!mUseMediaPlayer && isInitialized && isPlaying()) {
+                int valuesAvailable = mPipe.availableToRead();
+                if (valuesAvailable > 0) {
+
+                    int valuesOfInterest = valuesAvailable;
+                    if (mMinBufferSizeInSamples < valuesOfInterest) {
+                        valuesOfInterest = mMinBufferSizeInSamples;
+                    }
+                    mPipe.read(mAudioShortArray, 0,valuesOfInterest);
+                    //inject into output.
+                    mAudioTrack.write(mAudioShortArray, 0, valuesOfInterest);
+                }
+            } else {
+                try {
+                    sleep(10);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    public void setBalance(float balance) {
+        mBalance = balance;
+        if (mUseMediaPlayer) {
+            if (mMediaPlayer != null) {
+                float left = Math.min(2.0f * (1.0f - mBalance), 1.0f);
+                float right = Math.min(2.0f * mBalance, 1.0f);
+                mMediaPlayer.setVolume(left, right);
+                log(String.format("Setting balance to %f", mBalance));
+            }
+        }
+    }
+
+    public void setStreamType(int streamType) {
+        mStreamType = streamType;
+    }
+
+    public void rewind() {
+        if (mUseMediaPlayer) {
+            if (mMediaPlayer != null) {
+                mMediaPlayer.seekTo(0);
+            }
+        }
+    }
+
+    public void setSoundWithResId(Context context, int resId) {
+        boolean playing = isPlaying();
+        //release player
+        releasePlayer();
+        mResId = resId;
+        if (mUseMediaPlayer) {
+            mMediaPlayer = new MediaPlayer();
+            try {
+                log("opening resource with stream type: " + mStreamType);
+                mMediaPlayer.setAudioStreamType(mStreamType);
+                mMediaPlayer.setDataSource(context.getApplicationContext(),
+                        Uri.parse("android.resource://com.android.cts.verifier/" + resId));
+                mMediaPlayer.prepare();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            mMediaPlayer.setLooping(true);
+            setBalance(mBalance);
+        } else {
+            mMinPlayBufferSizeInBytes = AudioTrack.getMinBufferSize(mSamplingRate,
+                    mChannelConfigOut, mAudioFormat);
+
+            mMinBufferSizeInSamples = mMinPlayBufferSizeInBytes / 2;
+            mAudioShortArray = new short[mMinBufferSizeInSamples * 4];
+
+            mAudioTrack = new AudioTrack(mStreamType,
+                    mSamplingRate,
+                    mChannelConfigOut,
+                    mAudioFormat,
+                    mMinPlayBufferSizeInBytes,
+                    AudioTrack.MODE_STREAM /* FIXME runtime test for API level 9 ,
+                mSessionId */);
+            mPipe.flush();
+            isInitialized = true;
+        }
+
+        log("done preparing media player");
+        if (playing)
+            play(true); //start playing if it was playing before
+    }
+
+    public boolean isPlaying() {
+        boolean result = false;
+        if (mUseMediaPlayer) {
+            if (mMediaPlayer != null) {
+                result = mMediaPlayer.isPlaying();
+            }
+        } else {
+            if (mAudioTrack != null) {
+                result = mAudioTrack.getPlayState() == AudioTrack.PLAYSTATE_PLAYING;
+            }
+        }
+        return result;
+    }
+
+    public void play(boolean play) {
+        if (mUseMediaPlayer) {
+            if (mMediaPlayer != null) {
+                if (play) {
+                    mMediaPlayer.start();
+                } else {
+                    mMediaPlayer.pause();
+                }
+            }
+        } else {
+            if (mAudioTrack != null && isInitialized) {
+                if (play) {
+                    mPipe.flush();
+                    mAudioTrack.flush();
+                    mAudioTrack.play();
+                } else {
+                    mAudioTrack.pause();
+                }
+            }
+        }
+    }
+
+    public void finish() {
+        play(false);
+        releasePlayer();
+    }
+
+    private void releasePlayer() {
+        if (mMediaPlayer != null) {
+            mMediaPlayer.stop();
+            mMediaPlayer.release();
+            mMediaPlayer = null;
+        }
+
+        if (mAudioTrack != null) {
+            mAudioTrack.stop();
+            mAudioTrack.release();
+            mAudioTrack = null;
+        }
+        isInitialized = false;
+    }
+
+    /*
+       Misc
+    */
+    private static void log(String msg) {
+        Log.v(LOGTAG, msg);
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/TrivialPlayer.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/TrivialPlayer.java
new file mode 100644
index 0000000..af09504
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/TrivialPlayer.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio;
+
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+
+import java.lang.InterruptedException;
+import java.lang.Math;
+import java.lang.Runnable;
+
+public class TrivialPlayer implements Runnable {
+    AudioTrack mAudioTrack;
+    int mBufferSize;
+
+    boolean mPlay;
+    boolean mIsPlaying;
+
+    short[] mAudioData;
+
+    Thread mFillerThread = null;
+
+    public TrivialPlayer() {
+        mBufferSize =
+                AudioTrack.getMinBufferSize(
+                    41000,
+                    AudioFormat.CHANNEL_OUT_STEREO,
+                    AudioFormat.ENCODING_PCM_16BIT);
+        mAudioTrack =
+            new AudioTrack(
+                AudioManager.STREAM_MUSIC,
+                41000,
+                AudioFormat.CHANNEL_OUT_STEREO,
+                AudioFormat.ENCODING_PCM_16BIT,
+                mBufferSize,
+                AudioTrack.MODE_STREAM);
+
+        mPlay = false;
+        mIsPlaying = false;
+
+        // setup audio data (silence will suffice)
+        mAudioData = new short[mBufferSize];
+        for (int index = 0; index < mBufferSize; index++) {
+            // mAudioData[index] = 0;
+            // keep this code since one might want to hear the playnig audio
+            // for debugging/verification.
+            mAudioData[index] =
+                (short)(((Math.random() * 2.0) - 1.0) * (double)Short.MAX_VALUE/2.0);
+        }
+    }
+
+    public AudioTrack getAudioTrack() { return mAudioTrack; }
+
+    public boolean isPlaying() {
+        synchronized (this) {
+            return mIsPlaying;
+        }
+    }
+
+    public void start() {
+        mPlay = true;
+        mFillerThread = new Thread(this);
+        mFillerThread.start();
+    }
+
+    public void stop() {
+        mPlay = false;
+        mFillerThread = null;
+    }
+
+    public void shutDown() {
+        stop();
+        while (isPlaying()) {
+            try {
+                Thread.sleep(10);
+            } catch (InterruptedException ex) {
+            }
+        }
+        mAudioTrack.release();
+    }
+
+    @Override
+    public void run() {
+        mAudioTrack.play();
+        synchronized (this) {
+            mIsPlaying = true;
+        }
+        while (mAudioTrack != null && mPlay) {
+            mAudioTrack.write(mAudioData, 0, mBufferSize);
+        }
+        synchronized (this) {
+            mIsPlaying = false;
+        }
+        mAudioTrack.stop();
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/TrivialRecorder.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/TrivialRecorder.java
new file mode 100644
index 0000000..f684681
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/TrivialRecorder.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio;
+
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioRecord;
+
+import android.media.MediaRecorder;
+
+import java.lang.InterruptedException;
+import java.lang.Runnable;
+
+public class TrivialRecorder implements Runnable {
+    AudioRecord mAudioRecord;
+    int mBufferSize;
+
+    boolean mRecord;
+    boolean mIsRecording;
+
+    short[] mAudioData;
+
+    Thread mReaderThread = null;
+
+    public TrivialRecorder() {
+        mBufferSize =
+                AudioRecord.getMinBufferSize(
+                    41000,
+                    AudioFormat.CHANNEL_IN_MONO,
+                    AudioFormat.ENCODING_PCM_16BIT);
+        mAudioRecord =
+            new AudioRecord(
+                MediaRecorder.AudioSource.DEFAULT,
+                41000,
+                AudioFormat.CHANNEL_IN_MONO,
+                AudioFormat.ENCODING_PCM_16BIT,
+                mBufferSize);
+
+        mRecord = false;
+        mIsRecording = false;
+
+        // setup audio data (silence will suffice)
+        mAudioData = new short[mBufferSize];
+    }
+
+    public AudioRecord getAudioRecord() { return mAudioRecord; }
+
+    public boolean mIsRecording() {
+        synchronized (this) {
+            return mIsRecording;
+        }
+    }
+
+    public void start() {
+        mRecord = true;
+        mReaderThread = new Thread(this);
+        mReaderThread.start();
+    }
+
+    public void stop() {
+        mRecord = false;
+        mReaderThread = null;
+    }
+
+    public void shutDown() {
+        stop();
+        while (mIsRecording()) {
+            try {
+                Thread.sleep(10);
+            } catch (InterruptedException ex) {
+            }
+        }
+        mAudioRecord.release();
+    }
+
+    @Override
+    public void run() {
+        mAudioRecord.startRecording();
+        synchronized (this) {
+            mIsRecording = true;
+        }
+       while (mRecord) {
+            mAudioRecord.read(mAudioData, 0, mBufferSize);
+        }
+        mAudioRecord.stop();
+        synchronized (this) {
+            mIsRecording = false;
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/UsbMicrophoneTester.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/UsbMicrophoneTester.java
new file mode 100644
index 0000000..c0b6b6a
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/UsbMicrophoneTester.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio;
+
+import android.content.Context;
+
+import android.hardware.usb.UsbAccessory;
+import android.hardware.usb.UsbConstants;
+import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbInterface;
+import android.hardware.usb.UsbManager;
+
+import java.util.HashMap;
+import java.util.Iterator;
+
+public class UsbMicrophoneTester {
+
+    public static String getUSBDeviceListString(Context context) {
+        UsbManager manager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
+        StringBuilder sb = new StringBuilder();
+        HashMap<String, UsbDevice> devicelist = manager.getDeviceList();
+        for(UsbDevice usbDevice : devicelist.values()) {
+            sb.append("Model    : " + usbDevice.getDeviceName() + "\n");
+            sb.append(" Id      : " + usbDevice.getDeviceId() + "\n");
+            sb.append(" Class   : " + usbDevice.getDeviceClass() + "\n");
+            sb.append(" Prod.Id : " + usbDevice.getProductId() + "\n");
+            sb.append(" Vendor.Id : " + usbDevice.getVendorId() + "\n");
+            int iCount = usbDevice.getInterfaceCount();
+            for (int i = 0; i < iCount; i++) {
+                UsbInterface usbInterface = usbDevice.getInterface(i);
+                sb.append("    Interface " + i + " :\n");
+                sb.append("     Class: " + usbInterface.getInterfaceClass() + "\n");
+            }
+        }
+        return sb.toString();
+    }
+
+    public static boolean getIsMicrophoneConnected(Context context) {
+        UsbManager manager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
+        StringBuilder sb = new StringBuilder();
+        HashMap<String, UsbDevice> devicelist = manager.getDeviceList();
+        for(UsbDevice usbDevice : devicelist.values()) {
+            int iCount = usbDevice.getInterfaceCount();
+            for (int i = 0; i < iCount; i++) {
+                UsbInterface usbInterface = usbDevice.getInterface(i);
+                if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_AUDIO) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/Util.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/Util.java
new file mode 100644
index 0000000..4ef62d9
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/Util.java
@@ -0,0 +1,152 @@
+package com.android.cts.verifier.audio;
+
+import org.apache.commons.math.complex.Complex;
+import org.apache.commons.math.stat.descriptive.moment.Mean;
+import org.apache.commons.math.stat.descriptive.moment.StandardDeviation;
+import org.apache.commons.math.stat.descriptive.rank.Median;
+import org.apache.commons.math.transform.FastFourierTransformer;
+
+/**
+ * This class contains util functions used in the WavAnalyzer.
+ */
+public class Util {
+
+  /**
+   * Convert time in second to sample array length.
+   */
+  public static int toLength(double duration, int sampleRate) {
+    return (int) Math.round(duration * sampleRate);
+  }
+
+  /**
+   * Calculate mean of data.
+   */
+  public static double mean(double[] data) {
+    Mean mean = new Mean();
+    return mean.evaluate(data);
+  }
+
+  /**
+   * Calculate standard deviation of data.
+   */
+  public static double std(double[] data) {
+    StandardDeviation std = new StandardDeviation();
+    return std.evaluate(data);
+  }
+
+  /**
+   * Calculate median of data.
+   */
+  public static double median(double[] data) {
+    Median median = new Median();
+    median.setData(data);
+    return median.evaluate();
+  }
+
+  /**
+   * Pad zeros at the end, total length of array will be specified as length. If length is smaller
+   * than the length of the data, it returns the data truncated to the length.
+   */
+  public static Complex[] padZeros(Complex[] data, int length) {
+    Complex[] result = new Complex[length];
+    if (length < data.length) {
+      System.arraycopy(data, 0, result, 0, length);
+    } else {
+      System.arraycopy(data, 0, result, 0, data.length);
+      for (int i = data.length; i < result.length; i++) {
+        result[i] = new Complex(0, 0);
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Calculate cross correlation using FFT with periodic boundary handling.
+   */
+  public static double[] computeCrossCorrelation(Complex[] data1, Complex[] data2) {
+    FastFourierTransformer fft = new FastFourierTransformer();
+    int n = nextPowerOfTwo(Math.max(data1.length, data2.length));
+    Complex[] data1Fft = fft.transform(padZeros(data1, n));
+    Complex[] data2Fft = fft.transform(padZeros(data2, n));
+    Complex[] dottedData = new Complex[n];
+    for (int i = 0; i < n; i++) {
+      dottedData[i] = data1Fft[i].multiply(data2Fft[i].conjugate());
+    }
+    Complex[] resultComplex = fft.inversetransform(dottedData);
+    double[] resultDouble = new double[resultComplex.length];
+    for (int i = 0; i < resultComplex.length; i++) {
+      resultDouble[i] = resultComplex[i].abs();
+    }
+    return resultDouble;
+  }
+
+  /**
+   * Convert an short array to a double array.
+   */
+  public static double[] toDouble(short[] data) {
+    double[] result = new double[data.length];
+    for (int i = 0; i < data.length; i++) {
+      result[i] = data[i];
+    }
+    return result;
+  }
+
+  /**
+   * Convert a double array to a complex array.
+   */
+  public static Complex[] toComplex(double[] data) {
+    Complex[] result = new Complex[data.length];
+    for (int i = 0; i < data.length; i++) {
+      result[i] = new Complex(data[i], 0.0);
+    }
+    return result;
+  }
+
+  /**
+   * Calculates the next power of 2, greater than or equal to the input positive integer. If the
+   * input is not a positive integer, it returns 1.
+   */
+  public static int nextPowerOfTwo(int n) {
+    return 1 << (32 - Integer.numberOfLeadingZeros(n - 1));
+  }
+
+  /**
+   * Find the index with the max value in an array.
+   */
+  public static int findMaxIndex(double[] data) {
+    return findMaxIndex(data, 0, data.length - 1);
+  }
+
+  /**
+   * Find the index with the max value in a sub-array.
+   */
+  public static int findMaxIndex(double[] data, int startIndex, int endIndex) {
+    int maxIndex = startIndex;
+    for (int i = startIndex + 1; i <= endIndex; i++) {
+      if (data[i] > data[maxIndex]) {
+        maxIndex = i;
+      }
+    }
+    return maxIndex;
+  }
+
+  /**
+   * Returns the index of an array with the array value closest to the desired value.
+   */
+  public static int findClosest(double[] array, double value) {
+    double[] diffArray = new double[array.length];
+    for (int i = 0; i < array.length; i++) {
+      diffArray[i] = Math.abs(value - array[i]);
+    }
+    int index = 0;
+    for (int i = 1; i < array.length; i++) {
+      if (diffArray[i] < diffArray[index]) {
+        index = i;
+        if (diffArray[index] == 0) {
+          break;
+        }
+      }
+    }
+    return index;
+  }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/WavAnalyzer.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/WavAnalyzer.java
new file mode 100644
index 0000000..b75c40b
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/WavAnalyzer.java
@@ -0,0 +1,263 @@
+package com.android.cts.verifier.audio;
+
+import org.apache.commons.math.complex.Complex;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Class contains the analysis to calculate frequency response.
+ */
+public class WavAnalyzer {
+  private final Listener listener;
+  private final int sampleRate;  // Recording sampling rate.
+  private double[] data;  // Whole recording data.
+  private double[] dB;  // Average response
+  private double[][] power;  // power of each trial
+  private double[] noiseDB;  // background noise
+  private double[][] noisePower;
+  private double threshold;  // threshold of passing, drop off compared to 2000 kHz
+  private boolean result = false;  // result of the test
+
+  /**
+   * Constructor of WavAnalyzer.
+   */
+  public WavAnalyzer(byte[] byteData, int sampleRate, Listener listener) {
+    this.listener = listener;
+    this.sampleRate = sampleRate;
+
+    short[] shortData = new short[byteData.length >> 1];
+    ByteBuffer.wrap(byteData).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shortData);
+    this.data = Util.toDouble(shortData);
+    for (int i = 0; i < data.length; i++) {
+      data[i] = data[i] / Short.MAX_VALUE;
+    }
+  }
+
+  /**
+   * Do the analysis. Returns true if passing, false if failing.
+   */
+  public boolean doWork() {
+    if (isClipped()) {
+      return false;
+    }
+    // Calculating the pip strength.
+    listener.sendMessage("Calculating... Please wait...\n");
+    try {
+      dB = measurePipStrength();
+    } catch (IndexOutOfBoundsException e) {
+      listener.sendMessage("WARNING: May have missed the prefix."
+          + " Turn up the volume of the playback device or move to a quieter location.\n");
+      return false;
+    }
+    if (!isConsistent()) {
+      return false;
+    }
+    result = responsePassesHifiTest(dB);
+    return result;
+  }
+
+  /**
+   * Check if the recording is clipped.
+   */
+  boolean isClipped() {
+    for (int i = 1; i < data.length; i++) {
+      if ((Math.abs(data[i]) >= Short.MAX_VALUE) && (Math.abs(data[i - 1]) >= Short.MAX_VALUE)) {
+        listener.sendMessage("WARNING: Data is clipped."
+            + " Turn down the volume of the playback device and redo the procedure.\n");
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Check if the result is consistant across trials.
+   */
+  boolean isConsistent() {
+    double[] coeffOfVar = new double[Common.PIP_NUM];
+    for (int i = 0; i < Common.PIP_NUM; i++) {
+      double[] powerAtFreq = new double[Common.REPETITIONS];
+      for (int j = 0; j < Common.REPETITIONS; j++) {
+        powerAtFreq[j] = power[i][j];
+      }
+      coeffOfVar[i] = Util.std(powerAtFreq) / Util.mean(powerAtFreq);
+    }
+    if (Util.mean(coeffOfVar) > 1.0) {
+      listener.sendMessage("WARNING: Inconsistent result across trials."
+          + " Turn up the volume of the playback device or move to a quieter location.\n");
+      return false;
+    }
+    return true;
+  }
+
+  /**
+   * Determine test pass/fail using the frequency response. Package visible for unit testing.
+   */
+  boolean responsePassesHifiTest(double[] dB) {
+    for (int i = 0; i < dB.length; i++) {
+      // Precautionary; NaN should not happen.
+      if (Double.isNaN(dB[i])) {
+        listener.sendMessage(
+            "WARNING: Unexpected NaN in result. Redo the test.\n");
+        return false;
+      }
+    }
+
+    if (Util.mean(dB) - Util.mean(noiseDB) < Common.SIGNAL_MIN_STRENGTH_DB_ABOVE_NOISE) {
+      listener.sendMessage("WARNING: Signal is too weak or background noise is too strong."
+          + " Turn up the volume of the playback device or move to a quieter location.\n");
+      return false;
+    }
+
+    int indexOf2000Hz = Util.findClosest(Common.FREQUENCIES_ORIGINAL, 2000.0);
+    threshold = dB[indexOf2000Hz] + Common.PASSING_THRESHOLD_DB;
+    int indexOf18500Hz = Util.findClosest(Common.FREQUENCIES_ORIGINAL, 18500.0);
+    int indexOf20000Hz = Util.findClosest(Common.FREQUENCIES_ORIGINAL, 20000.0);
+    double[] responseInRange = new double[indexOf20000Hz - indexOf18500Hz];
+    System.arraycopy(dB, indexOf18500Hz, responseInRange, 0, responseInRange.length);
+    if (Util.mean(responseInRange) < threshold) {
+      listener.sendMessage(
+          "WARNING: Failed. Retry with different orientations or report failed.\n");
+      return false;
+    }
+    return true;
+  }
+
+  /**
+   * Calculate the Fourier Coefficient at the pip frequency to calculate the frequency response.
+   * Package visible for unit testing.
+   */
+  double[] measurePipStrength() {
+    listener.sendMessage("Aligning data... Please wait...\n");
+    final int dataStartI = alignData();
+    final int prefixTotalLength = dataStartI
+        + Util.toLength(Common.PREFIX_LENGTH_S + Common.PAUSE_AFTER_PREFIX_DURATION_S, sampleRate);
+    listener.sendMessage("Done.\n");
+    listener.sendMessage("Prefix starts at " + (double) dataStartI / sampleRate + " s \n");
+    if (dataStartI > Math.round(sampleRate * (Common.PREFIX_LENGTH_S
+            + Common.PAUSE_BEFORE_PREFIX_DURATION_S + Common.PAUSE_AFTER_PREFIX_DURATION_S))) {
+      listener.sendMessage("WARNING: Unexpected prefix start time. May have missed the prefix.\n"
+          + "PLAY button should be pressed on the playback device within one second"
+          + " after RECORD is pressed on the recording device.\n"
+          + "If this happens repeatedly,"
+          + " turn up the volume of the playback device or move to a quieter location.\n");
+    }
+
+    listener.sendMessage("Analyzing noise strength... Please wait...\n");
+    noisePower = new double[Common.PIP_NUM][Common.NOISE_SAMPLES];
+    noiseDB = new double[Common.PIP_NUM];
+    for (int s = 0; s < Common.NOISE_SAMPLES; s++) {
+      double[] noisePoints = new double[Common.WINDOW_FOR_RECORDER.length];
+      System.arraycopy(data, dataStartI - (s + 1) * noisePoints.length - 1,
+          noisePoints, 0, noisePoints.length);
+      for (int j = 0; j < noisePoints.length; j++) {
+        noisePoints[j] = noisePoints[j] * Common.WINDOW_FOR_RECORDER[j];
+      }
+      for (int i = 0; i < Common.PIP_NUM; i++) {
+        double freq = Common.FREQUENCIES_ORIGINAL[i];
+        Complex fourierCoeff = new Complex(0, 0);
+        final Complex rotator = new Complex(0,
+            -2.0 * Math.PI * freq / sampleRate).exp();
+        Complex phasor = new Complex(1, 0);
+        for (int j = 0; j < noisePoints.length; j++) {
+          fourierCoeff = fourierCoeff.add(phasor.multiply(noisePoints[j]));
+          phasor = phasor.multiply(rotator);
+        }
+        fourierCoeff = fourierCoeff.multiply(1.0 / noisePoints.length);
+        noisePower[i][s] = fourierCoeff.multiply(fourierCoeff.conjugate()).abs();
+      }
+    }
+    for (int i = 0; i < Common.PIP_NUM; i++) {
+      double meanNoisePower = 0;
+      for (int j = 0; j < Common.NOISE_SAMPLES; j++) {
+        meanNoisePower += noisePower[i][j];
+      }
+      meanNoisePower /= Common.NOISE_SAMPLES;
+      noiseDB[i] = 10 * Math.log10(meanNoisePower);
+    }
+
+    listener.sendMessage("Analyzing pips... Please wait...\n");
+    power = new double[Common.PIP_NUM][Common.REPETITIONS];
+    for (int i = 0; i < Common.PIP_NUM * Common.REPETITIONS; i++) {
+      if (i % Common.PIP_NUM == 0) {
+        listener.sendMessage("#" + (i / Common.PIP_NUM + 1) + "\n");
+      }
+
+      int pipExpectedStartI;
+      pipExpectedStartI = prefixTotalLength
+          + Util.toLength(i * (Common.PIP_DURATION_S + Common.PAUSE_DURATION_S), sampleRate);
+      // Cut out the data points for the current pip.
+      double[] pipPoints = new double[Common.WINDOW_FOR_RECORDER.length];
+      System.arraycopy(data, pipExpectedStartI, pipPoints, 0, pipPoints.length);
+      for (int j = 0; j < Common.WINDOW_FOR_RECORDER.length; j++) {
+        pipPoints[j] = pipPoints[j] * Common.WINDOW_FOR_RECORDER[j];
+      }
+      Complex fourierCoeff = new Complex(0, 0);
+      final Complex rotator = new Complex(0,
+          -2.0 * Math.PI * Common.FREQUENCIES[i] / sampleRate).exp();
+      Complex phasor = new Complex(1, 0);
+      for (int j = 0; j < pipPoints.length; j++) {
+        fourierCoeff = fourierCoeff.add(phasor.multiply(pipPoints[j]));
+        phasor = phasor.multiply(rotator);
+      }
+      fourierCoeff = fourierCoeff.multiply(1.0 / pipPoints.length);
+      int j = Common.ORDER[i];
+      power[j % Common.PIP_NUM][j / Common.PIP_NUM] =
+          fourierCoeff.multiply(fourierCoeff.conjugate()).abs();
+    }
+
+    // Calculate median of trials.
+    double[] dB = new double[Common.PIP_NUM];
+    for (int i = 0; i < Common.PIP_NUM; i++) {
+      dB[i] = 10 * Math.log10(Util.median(power[i]));
+    }
+    return dB;
+  }
+
+  /**
+   * Align data using prefix. Package visible for unit testing.
+   */
+  int alignData() {
+    // Zeropadding samples to add in the correlation to avoid FFT wraparound.
+    final int zeroPad = Util.toLength(Common.PREFIX_LENGTH_S, Common.RECORDING_SAMPLE_RATE_HZ) - 1;
+    int fftSize = Util.nextPowerOfTwo((int) Math.round(sampleRate * (Common.PREFIX_LENGTH_S
+            + Common.PAUSE_BEFORE_PREFIX_DURATION_S + Common.PAUSE_AFTER_PREFIX_DURATION_S + 0.5))
+        + zeroPad);
+
+    double[] dataCut = new double[fftSize - zeroPad];
+    System.arraycopy(data, 0, dataCut, 0, fftSize - zeroPad);
+    double[] xCorrDataPrefix = Util.computeCrossCorrelation(
+        Util.padZeros(Util.toComplex(dataCut), fftSize),
+        Util.padZeros(Util.toComplex(Common.PREFIX_FOR_RECORDER), fftSize));
+    return Util.findMaxIndex(xCorrDataPrefix);
+  }
+
+  double[] getDB() {
+    return dB;
+  }
+
+  double[][] getPower() {
+    return power;
+  }
+
+  double[] getNoiseDB() {
+    return noiseDB;
+  }
+
+  double getThreshold() {
+    return threshold;
+  }
+
+  boolean getResult() {
+    return result;
+  }
+
+  /**
+   * An interface for listening a message publishing the progress of the analyzer.
+   */
+  public interface Listener {
+
+    void sendMessage(String message);
+  }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/DspBufferBase.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/DspBufferBase.java
new file mode 100644
index 0000000..0a8bdde
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/DspBufferBase.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio.wavelib;
+
+public abstract class DspBufferBase {
+    private int mSize;
+
+    public DspBufferBase() {
+        setSize(0);
+    }
+
+    public DspBufferBase(int size) {
+        setSize(size);
+    }
+
+    public int getSize() {
+        return mSize;
+    }
+
+    public void setSize(int size) {
+        mSize = size;
+    }
+
+    public abstract void setValue(int index, double value);
+
+    public abstract void setValues(int index, double... values);
+
+    @Override
+    public String toString() {
+        return String.format("Size: %d", mSize);
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/DspBufferComplex.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/DspBufferComplex.java
new file mode 100644
index 0000000..2b71343
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/DspBufferComplex.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio.wavelib;
+
+public class DspBufferComplex extends DspBufferBase {
+    public double[] mReal;
+    public double[] mImag;
+
+    public DspBufferComplex(int size) {
+        super(size);
+    }
+
+    @Override
+    public void setSize(int size) {
+        if (size == getSize()) {
+            return;
+        }
+        mReal = new double[size];
+        mImag = new double[size];
+        super.setSize(size);
+    }
+
+    // Warning, these methods don't check for bounds!
+    @Override
+    public void setValues(int index, double... values) {
+        mReal[index] = values[0];
+        mImag[index] = values[1];
+    }
+
+    @Override
+    public void setValue(int index, double value) {
+        mReal[index] = value;
+        mImag[index] = 0;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        int size = getSize();
+        sb.append(String.format("Size: %d { ", size));
+        for (int i = 0; i < size; i++) {
+            sb.append(String.format("(%.3f, %3f) ", mReal[i], mImag[i]));
+        }
+        sb.append("}");
+        return sb.toString();
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/DspBufferDouble.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/DspBufferDouble.java
new file mode 100644
index 0000000..1b75da6
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/DspBufferDouble.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio.wavelib;
+
+public class DspBufferDouble extends DspBufferBase {
+    public double[] mData;
+
+    public DspBufferDouble(int size) {
+        super(size);
+    }
+
+    @Override
+    public void setSize(int size) {
+        if (size == getSize()) {
+            return;
+        }
+        mData = new double[size];
+        super.setSize(size);
+    }
+
+    // Warning, these methods don't check for bounds!
+    @Override
+    public void setValues(int index, double... values) {
+        mData[index] = values[0];
+    }
+
+    @Override
+    public void setValue(int index, double value) {
+        mData[index] = value;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        int size = getSize();
+        sb.append(String.format("Size: %d { ", size));
+        int i = 0;
+        for (; i < size - 1; i++) {
+            sb.append(String.format("%.3f, ", mData[i]));
+        }
+        for(; i < size; i++) {
+            sb.append(String.format("%.3f", mData[i]));
+        }
+        sb.append(" }");
+        return sb.toString();
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/DspBufferMath.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/DspBufferMath.java
new file mode 100644
index 0000000..a9cbbd0
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/DspBufferMath.java
@@ -0,0 +1,329 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio.wavelib;
+
+import android.util.Log;
+
+public class DspBufferMath {
+    private static final String TAG = "DspBufferMath";
+    public static final int OPERANDS_TYPE_UNKNOWN  = -1;
+    public static final int OPERANDS_TYPE_REAL     = 0;
+    public static final int OPERANDS_TYPE_COMPLEX  = 1;
+    public static final int OPERANDS_TYPE_MIXED    = 2;
+
+    public static final int MATH_RESULT_UNDEFINED  = -1;
+    public static final int MATH_RESULT_SUCCESS    = 0;
+    public static final int MATH_RESULT_ERROR      = 1;
+
+    static private<T extends DspBufferBase> int estimateOperandsType(T a, T b) {
+        if (a instanceof DspBufferComplex) {
+            if (b instanceof DspBufferComplex) {
+                return OPERANDS_TYPE_COMPLEX;
+            } else if (b instanceof DspBufferDouble) {
+                return OPERANDS_TYPE_MIXED;
+            }
+        } else if (a instanceof DspBufferDouble) {
+            if (b instanceof DspBufferComplex) {
+                return OPERANDS_TYPE_MIXED;
+            } else if (b instanceof DspBufferDouble) {
+                return OPERANDS_TYPE_REAL;
+            }
+        }
+        return OPERANDS_TYPE_UNKNOWN;
+    }
+
+    /**
+     * adds r = a + b; element by element
+     *
+     * If the result is double vector, the imaginary part of complex operations is ignored.
+     */
+    static public <T extends DspBufferBase> int add(T r, T a, T b) {
+        int size = Math.min(a.getSize(), b.getSize());
+        r.setSize(size);
+
+        T x = a;
+        T y = b;
+        int opType = estimateOperandsType(a, b);
+
+        if (opType == OPERANDS_TYPE_MIXED) {
+            if (a instanceof  DspBufferDouble)  {
+                x = b; //Complex first
+                y = a;
+            }
+        }
+
+        if (opType == OPERANDS_TYPE_UNKNOWN) {
+            return MATH_RESULT_UNDEFINED;
+        }
+
+        if (r instanceof DspBufferComplex) {
+            switch (opType) {
+                case OPERANDS_TYPE_REAL:
+                    for (int i = 0; i < size; i++) {
+                        ((DspBufferComplex) r).mReal[i] =
+                                ((DspBufferDouble) x).mData[i] + ((DspBufferDouble) y).mData[i];
+                        ((DspBufferComplex) r).mImag[i] = 0;
+                    }
+                    return MATH_RESULT_SUCCESS;
+                case OPERANDS_TYPE_COMPLEX:
+                    for (int i = 0; i < size; i++) {
+                        ((DspBufferComplex) r).mReal[i] =
+                                ((DspBufferComplex) x).mReal[i] + ((DspBufferComplex) y).mReal[i];
+                        ((DspBufferComplex) r).mImag[i] =
+                                ((DspBufferComplex) x).mImag[i] + ((DspBufferComplex) y).mImag[i];
+                    }
+                    return MATH_RESULT_SUCCESS;
+                case OPERANDS_TYPE_MIXED:
+                    for (int i = 0; i < size; i++) {
+                        ((DspBufferComplex) r).mReal[i] =
+                                ((DspBufferComplex) x).mReal[i] + ((DspBufferDouble) y).mData[i];
+                        ((DspBufferComplex) r).mImag[i] = ((DspBufferComplex) x).mImag[i];
+                    }
+                    return MATH_RESULT_SUCCESS;
+            }
+        } else if (r instanceof DspBufferDouble) {
+            switch (opType) {
+                case OPERANDS_TYPE_REAL:
+                    for (int i = 0; i < size; i++) {
+                        ((DspBufferDouble) r).mData[i] =
+                                ((DspBufferDouble) x).mData[i] + ((DspBufferDouble) y).mData[i];
+                    }
+                    return MATH_RESULT_SUCCESS;
+                case OPERANDS_TYPE_COMPLEX:
+                    for (int i = 0; i < size; i++) {
+                        ((DspBufferDouble) r).mData[i] =
+                                ((DspBufferComplex) x).mReal[i] + ((DspBufferComplex) y).mReal[i];
+                    }
+                    return MATH_RESULT_SUCCESS;
+                case OPERANDS_TYPE_MIXED:
+                    for (int i = 0; i < size; i++) {
+                        ((DspBufferDouble) r).mData[i] =
+                                ((DspBufferComplex) x).mReal[i] + ((DspBufferDouble) y).mData[i];
+                    }
+                    return MATH_RESULT_SUCCESS;
+            }
+        }
+        return MATH_RESULT_ERROR;
+    }
+
+    /**
+     * mult r = a * b; element by element
+     */
+    static public <T extends DspBufferBase> int mult(T r, T a, T b) {
+        int size = Math.min(a.getSize(), b.getSize());
+        r.setSize(size);
+
+        T x = a;
+        T y = b;
+        int opType = estimateOperandsType(a, b);
+
+        if (opType == OPERANDS_TYPE_MIXED) {
+            if (a instanceof  DspBufferDouble)  {
+                x = b; //Complex first
+                y = a;
+            }
+        }
+
+        if (opType == OPERANDS_TYPE_UNKNOWN) {
+            return MATH_RESULT_UNDEFINED;
+        }
+
+        if (r instanceof DspBufferComplex) {
+            switch (opType) {
+                case OPERANDS_TYPE_REAL:
+                    for (int i = 0; i < size; i++) {
+                        ((DspBufferComplex) r).mReal[i] =
+                                ((DspBufferDouble) x).mData[i] * ((DspBufferDouble) y).mData[i];
+                        ((DspBufferComplex) r).mImag[i] = 0;
+                    }
+                    return MATH_RESULT_SUCCESS;
+                case OPERANDS_TYPE_COMPLEX:
+                    for (int i = 0; i < size; i++) {
+                        double A = ((DspBufferComplex) x).mReal[i];
+                        double B = ((DspBufferComplex) x).mImag[i];
+                        double C = ((DspBufferComplex) y).mReal[i];
+                        double D = ((DspBufferComplex) y).mImag[i];
+                        ((DspBufferComplex) r).mReal[i] = (C * A) - (B * D);
+                        ((DspBufferComplex) r).mImag[i] = (C * B) + (A * D);
+                    }
+                    return MATH_RESULT_SUCCESS;
+                case OPERANDS_TYPE_MIXED:
+                    for (int i = 0; i < size; i++) {
+                        double A = ((DspBufferComplex) x).mReal[i];
+                        double B = ((DspBufferComplex) x).mImag[i];
+                        double C = ((DspBufferDouble) y).mData[i];
+                        //double D = 0;
+                        ((DspBufferComplex) r).mReal[i] = C * A;
+                        ((DspBufferComplex) r).mImag[i] = C * B;
+                    }
+                    return MATH_RESULT_SUCCESS;
+            }
+        } else if (r instanceof DspBufferDouble) {
+            switch (opType) {
+                case OPERANDS_TYPE_REAL:
+                    for (int i = 0; i < size; i++) {
+                        ((DspBufferDouble) r).mData[i] =
+                                ((DspBufferDouble) x).mData[i] * ((DspBufferDouble) y).mData[i];
+                    }
+                    return MATH_RESULT_SUCCESS;
+                case OPERANDS_TYPE_COMPLEX:
+                    for (int i = 0; i < size; i++) {
+                        double A = ((DspBufferComplex) x).mReal[i];
+                        double B = ((DspBufferComplex) x).mImag[i];
+                        double C = ((DspBufferComplex) y).mReal[i];
+                        double D = ((DspBufferComplex) y).mImag[i];
+                        ((DspBufferDouble) r).mData[i] = (C * A) - (B * D);
+                    }
+                    return MATH_RESULT_SUCCESS;
+                case OPERANDS_TYPE_MIXED:
+                    for (int i = 0; i < size; i++) {
+                        double A = ((DspBufferComplex) x).mReal[i];
+                        double B = ((DspBufferComplex) x).mImag[i];
+                        double C = ((DspBufferDouble) y).mData[i];
+                        //double D = 0;
+                        ((DspBufferDouble) r).mData[i] = C * A;
+                    }
+                    return MATH_RESULT_SUCCESS;
+            }
+        }
+        return MATH_RESULT_ERROR;
+    }
+
+    /**
+     * mult r = a * v; element by element
+     */
+    static public <T extends DspBufferBase> int mult(T r, T a, double v) {
+        int size = a.getSize();
+        r.setSize(size);
+
+        T x = a;
+        int opType = estimateOperandsType(r, a);
+
+        if (opType == OPERANDS_TYPE_UNKNOWN) {
+            return MATH_RESULT_UNDEFINED;
+        }
+
+        if (r instanceof DspBufferComplex) {
+            switch (opType) {
+                case OPERANDS_TYPE_MIXED:
+                    for (int i = 0; i < size; i++) {
+                        ((DspBufferComplex) r).mReal[i] = ((DspBufferDouble) x).mData[i] * v;
+                        ((DspBufferComplex) r).mImag[i] = 0;
+                    }
+                    return MATH_RESULT_SUCCESS;
+                case OPERANDS_TYPE_COMPLEX:
+                    for (int i = 0; i < size; i++) {
+                        ((DspBufferComplex) r).mReal[i] = ((DspBufferComplex) x).mReal[i] * v;
+                        ((DspBufferComplex) r).mImag[i] = ((DspBufferComplex) x).mImag[i] * v;
+                    }
+                    return MATH_RESULT_SUCCESS;
+            }
+        } else if (r instanceof DspBufferDouble) {
+            switch (opType) {
+                case OPERANDS_TYPE_REAL:
+                    for (int i = 0; i < size; i++) {
+                        ((DspBufferDouble) r).mData[i] = ((DspBufferDouble) x).mData[i] * v;
+                    }
+                    return MATH_RESULT_SUCCESS;
+                case OPERANDS_TYPE_MIXED:
+                    for (int i = 0; i < size; i++) {
+                        ((DspBufferDouble) r).mData[i] = ((DspBufferComplex) x).mReal[i] * v;
+                    }
+                    return MATH_RESULT_SUCCESS;
+            }
+        }
+        return MATH_RESULT_ERROR;
+    }
+
+    /**
+     * set r = a ; element by element
+     */
+    static public <T extends DspBufferBase> int set(T r, T a) {
+        int size = a.getSize();
+        r.setSize(size);
+
+        T x = a;
+        int opType = estimateOperandsType(r, a);
+
+        if (opType == OPERANDS_TYPE_UNKNOWN) {
+            return MATH_RESULT_UNDEFINED;
+        }
+
+        if (r instanceof DspBufferComplex) {
+            switch (opType) {
+                case OPERANDS_TYPE_MIXED:
+                    for (int i = 0; i < size; i++) {
+                        ((DspBufferComplex) r).mReal[i] = ((DspBufferDouble) x).mData[i];
+                        ((DspBufferComplex) r).mImag[i] = 0;
+                    }
+                    return MATH_RESULT_SUCCESS;
+                case OPERANDS_TYPE_COMPLEX:
+                    for (int i = 0; i < size; i++) {
+                        ((DspBufferComplex) r).mReal[i] = ((DspBufferComplex) x).mReal[i];
+                        ((DspBufferComplex) r).mImag[i] = ((DspBufferComplex) x).mImag[i];
+                    }
+                    return MATH_RESULT_SUCCESS;
+            }
+        } else if (r instanceof DspBufferDouble) {
+            switch(opType) {
+                case OPERANDS_TYPE_REAL:
+                    for (int i = 0; i < size; i++) {
+                        ((DspBufferDouble) r).mData[i] = ((DspBufferDouble) x).mData[i];
+                    }
+                    return MATH_RESULT_SUCCESS;
+                case OPERANDS_TYPE_MIXED:
+                    for (int i = 0; i < size; i++) {
+                        ((DspBufferDouble) r).mData[i] = ((DspBufferComplex) x).mReal[i];
+                    }
+                    return MATH_RESULT_SUCCESS;
+            }
+        }
+        return MATH_RESULT_ERROR;
+    }
+
+
+    /**
+     * set r = v ; all elements the same
+     * It keeps the size of the return vector
+     */
+    static public <T extends DspBufferBase> int set(T r, double ...values) {
+        int size = r.getSize();
+
+        double a = 0;
+        double b = 0;
+        if (values.length > 0) {
+            a = values[0];
+        }
+        if (values.length > 1) {
+            b = values[1];
+        }
+
+        if (r instanceof DspBufferComplex) {
+            for (int i = 0; i < size; i++) {
+                ((DspBufferComplex) r).mReal[i] = a;
+                ((DspBufferComplex) r).mImag[i] = b;
+            }
+            return MATH_RESULT_SUCCESS;
+        } else if (r instanceof DspBufferDouble) {
+            for (int i = 0; i < size; i++) {
+                ((DspBufferDouble) r).mData[i] = a;
+            }
+            return MATH_RESULT_SUCCESS;
+        }
+        return MATH_RESULT_ERROR;
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/DspFftServer.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/DspFftServer.java
new file mode 100644
index 0000000..09337f1
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/DspFftServer.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio.wavelib;
+
+public class DspFftServer {
+    private int mN = 0;
+    private int mOrder = 0;
+
+    DspBufferDouble mCos;
+    DspBufferDouble mSin;
+    public boolean isInitialized = false;
+
+    public DspFftServer(int size) {
+        init(size);
+    }
+
+    public boolean init(int size) {
+        boolean status = false;
+        mN=size;
+
+        mOrder = (int) (Math.log(mN) / Math.log(2));
+        if (mN == (1 << mOrder)) {
+            mCos = new DspBufferDouble(mN / 2);
+            mSin = new DspBufferDouble(mN / 2);
+            for (int i = 0; i < mN / 2; i++) {
+                mCos.mData[i] = Math.cos(-2 * Math.PI * i / mN);
+                mSin.mData[i] = Math.sin(-2 * Math.PI * i / mN);
+            }
+            status = true;
+        } else {
+            mN = 0;
+            throw new RuntimeException("FFT must be power of 2");
+        }
+        isInitialized = status;
+        return status;
+    }
+
+    public void fft(DspBufferComplex r, int sign) {
+        int ii, jj, kk, n1, n2, aa;
+        double cc, ss, t1, t2;
+
+        // Bit-reverse
+        jj = 0;
+        n2 = mN / 2;
+        for (ii = 1; ii < mN - 1; ii++) {
+            n1 = n2;
+            while (jj >= n1) {
+                jj = jj - n1;
+                n1 = n1 / 2;
+            }
+            jj = jj + n1;
+
+            if (ii < jj) {
+                t1 =  r.mReal[ii];
+                r.mReal[ii] = r.mReal[jj];
+                r.mReal[jj] = t1;
+                t1 = r.mImag[ii];
+                r.mImag[ii] = r.mImag[jj];
+                r.mImag[jj] = t1;
+            }
+        }
+
+        // FFT
+        n1 = 0;
+        n2 = 1;
+        for (ii = 0; ii < mOrder; ii++) {
+            n1 = n2;
+            n2 = n2 + n2;
+            aa = 0;
+
+            for (jj = 0; jj < n1; jj++) {
+                cc = mCos.mData[aa];
+                ss = sign * mSin.mData[aa];
+                aa += 1 << (mOrder - ii - 1);
+                for (kk = jj; kk < mN; kk = kk + n2) {
+                    t1 = cc * r.mReal[kk + n1] - ss * r.mImag[kk + n1];
+                    t2 = ss * r.mReal[kk + n1] + cc * r.mImag[kk + n1];
+                    r.mReal[kk + n1] = r.mReal[kk] - t1;
+                    r.mImag[kk + n1] = r.mImag[kk] - t2;
+                    r.mReal[kk] = r.mReal[kk] + t1;
+                    r.mImag[kk] = r.mImag[kk] + t2;
+                }
+            }
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/DspWindow.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/DspWindow.java
new file mode 100644
index 0000000..3ccca43
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/DspWindow.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio.wavelib;
+
+public class DspWindow {
+    public DspBufferDouble mBuffer;
+    private int mWindowType = WINDOW_RECTANGULAR;
+    private int mSize;
+    private int mOverlap;
+
+    private static final double TWOPI = Math.PI * 2;
+
+    public static final int WINDOW_RECTANGULAR = 0;
+    public static final int WINDOW_TRIANGULAR = 1;
+    public static final int WINDOW_TRIANGULAR_FLAT_TOP = 2;
+    public static final int WINDOW_HAMMING = 3;
+    public static final int WINDOW_HAMMING_FLAT_TOP = 4;
+    public static final int WINDOW_HANNING = 5;
+    public static final int WINDOW_HANNING_FLAT_TOP = 6;
+
+    public DspWindow(int windowType, int size, int overlap) {
+        init(windowType, size, overlap);
+    }
+
+    public DspWindow(int windowType, int size)  {
+        init(windowType, size, size / 2);
+    }
+
+    public void init(int windowType, int size, int overlap) {
+        if (size > 0 && overlap > 0) {
+            mSize = size;
+            mOverlap = overlap;
+            if (mOverlap > mSize / 2) {
+                mOverlap = mSize / 2;
+            }
+
+            mBuffer = new DspBufferDouble(mSize);
+            if (fillWindow(mBuffer, windowType, mOverlap)) {
+                mWindowType = windowType;
+            }
+        }
+    }
+
+    public void scale(double scale) {
+        DspBufferMath.mult(mBuffer, mBuffer, scale);
+    }
+
+    public static boolean fillWindow(DspBufferDouble r, int type, int overlap) {
+        boolean status = false;
+        int size = r.getSize();
+        if (overlap > size / 2) {
+            overlap = size / 2;
+        }
+
+        switch(type) {
+            case WINDOW_RECTANGULAR:
+                status = fillRectangular(r);
+                break;
+            case WINDOW_TRIANGULAR:
+                status = fillTriangular(r, size / 2);
+                break;
+            case WINDOW_TRIANGULAR_FLAT_TOP:
+                status = fillTriangular(r, overlap);
+                break;
+            case WINDOW_HAMMING:
+                status = fillHamming(r, size / 2);
+                break;
+            case WINDOW_HAMMING_FLAT_TOP:
+                status = fillHamming(r, overlap);
+                break;
+            case WINDOW_HANNING:
+                status = fillHanning(r, size / 2);
+                break;
+            case WINDOW_HANNING_FLAT_TOP:
+                status = fillHanning(r, overlap);
+                break;
+        }
+        return status;
+    }
+
+    private static boolean fillRectangular(DspBufferDouble r) {
+        if (DspBufferMath.set(r, 1.0) == DspBufferMath.MATH_RESULT_SUCCESS) {
+            return true;
+        }
+        return false;
+    }
+
+    private static boolean fillTriangular(DspBufferDouble b, int overlap) {
+        int size = b.getSize();
+        if (overlap > size / 2) {
+            overlap = size / 2;
+        }
+
+        double value;
+        //ramp up
+        int i = 0;
+        if (overlap > 0) {
+            for (i = 0; i < overlap; i++) {
+                value = (2.0 * i + 1) / (2 * overlap);
+                b.mData[i] = value;
+            }
+        }
+
+        //flat top
+        for (; i < size - overlap; i++) {
+            b.mData[i] = 1.0;
+        }
+
+        //ramp down
+        if (overlap > 0) {
+            for (; i < size; i++) {
+                value = (2.0 * (size - i) - 1) / (2 * overlap);
+                b.mData[i] = value;
+            }
+        }
+        return true;
+    }
+
+    private static boolean fillHamming(DspBufferDouble b, int overlap) {
+        int size = b.getSize();
+        if (overlap > size / 2)
+            overlap = size / 2;
+
+        //create window, then copy
+        double value;
+
+        int twoOverlap = 2 * overlap;
+        //ramp up
+        int i = 0;
+        if (overlap > 0) {
+            for (i = 0; i < overlap; i++) {
+                value = 0.54 - 0.46 * Math.cos(TWOPI * i / (twoOverlap - 1));
+                b.mData[i] = value;
+            }
+        }
+
+        //flat top
+        for (; i < size - overlap; i++) {
+            b.mData[i] = 1.0;
+        }
+
+        //ramp down
+        int k;
+        if (overlap > 0) {
+            for (; i < size; i++) {
+                k = i - (size - 2 * overlap);
+                value = 0.54 - 0.46 * Math.cos(TWOPI * k / (twoOverlap - 1));
+                b.mData[i] = value;
+            }
+        }
+        return true;
+    }
+
+    private static boolean fillHanning(DspBufferDouble b, int overlap) {
+        int size = b.getSize();
+        if (overlap > size / 2)
+            overlap = size / 2;
+
+        //create window, then copy
+        double value;
+
+        int twoOverlap = 2*overlap;
+        //ramp up
+        int i = 0;
+        if (overlap > 0) {
+            for (i = 0; i < overlap; i++) {
+                value = 0.5 * (1.0 - Math.cos(TWOPI * i / (twoOverlap - 1)));
+                b.mData[i] = value;
+            }
+        }
+
+        //flat top
+        for (; i < size - overlap; i++) {
+            b.mData[i] = 1.0;
+        }
+
+        //ramp down
+        if (overlap > 0) {
+            for (; i < size; i++) {
+                int k = i - (size - 2 * overlap);
+                value = 0.5 * (1.0 - Math.cos(TWOPI * k / (twoOverlap - 1)));
+                b.mData[i] = value;
+            }
+        }
+        return true;
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/PipeShort.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/PipeShort.java
new file mode 100644
index 0000000..83b171f
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/PipeShort.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio.wavelib;
+
+// Non-blocking pipe supports a single writer and single reader.
+// The write side of a pipe permits overruns; flow control is the caller's responsibility.
+
+public class PipeShort {
+    private int mFront;
+    private int mRear;
+    private short mBuffer[];
+    private volatile int mVolatileRear; // written by write(), read by read()
+    private int mMaxValues;
+    private int mBytesOverrun;
+    private int mOverruns;
+    public static final int OVERRUN = -2;
+
+    // maxBytes will be rounded up to a power of 2, and all slots are available. Must be >= 2.
+    public PipeShort(int maxValues)
+    {
+        mMaxValues = roundup(maxValues);
+        mBuffer = new short[mMaxValues];
+    }
+
+    // buffer must != null.
+    // offset must be >= 0.
+    // count is maximum number of bytes to copy, and must be >= 0.
+    // offset + count must be <= buffer.length.
+    // Returns actual number of bytes copied >= 0.
+    public int write(short[] buffer, int offset, int count)
+    {
+        int rear = mRear & (mMaxValues - 1);
+        int written = mMaxValues - rear;
+        if (written > count) {
+            written = count;
+        }
+        System.arraycopy(buffer, offset, mBuffer, rear, written);
+        if (rear + written == mMaxValues) {
+            if ((count -= written) > rear) {
+                count = rear;
+            }
+            if (count > 0) {
+                System.arraycopy(buffer, offset + written, mBuffer, 0, count);
+                written += count;
+            }
+        }
+        mRear += written;
+        mVolatileRear = mRear;
+        return written;
+    }
+
+    public int availableToRead()
+    {
+        int rear = mVolatileRear;
+        int avail = rear - mFront;
+        if (avail > mMaxValues) {
+            // Discard 1/16 of the most recent data in pipe to avoid another overrun immediately
+            int oldFront = mFront;
+            mFront = rear - mMaxValues + (mMaxValues >> 4);
+            mBytesOverrun += mFront - oldFront;
+            ++mOverruns;
+            return OVERRUN;
+        }
+        return avail;
+    }
+
+    // buffer must != null.
+    // offset must be >= 0.
+    // count is maximum number of bytes to copy, and must be >= 0.
+    // offset + count must be <= buffer.length.
+    // Returns actual number of bytes copied >= 0.
+    public int read(short[] buffer, int offset, int count)
+    {
+        int avail = availableToRead();
+        if (avail <= 0) {
+            return avail;
+        }
+        // An overrun can occur from here on and be silently ignored,
+        // but it will be caught at next read()
+        if (count > avail) {
+            count = avail;
+        }
+        int front = mFront & (mMaxValues - 1);
+        int red = mMaxValues - front;
+        if (red > count) {
+            red = count;
+        }
+        // In particular, an overrun during the System.arraycopy will result in reading corrupt data
+        System.arraycopy(mBuffer, front, buffer, offset, red);
+        // We could re-read the rear pointer here to detect the corruption, but why bother?
+        if (front + red == mMaxValues) {
+            if ((count -= red) > front) {
+                count = front;
+            }
+            if (count > 0) {
+                System.arraycopy(mBuffer, 0, buffer, offset + red, count);
+                red += count;
+            }
+        }
+        mFront += red;
+        return red;
+    }
+
+    public void flush()
+    {
+        mRear = mFront;
+        mVolatileRear = mFront;
+    }
+
+    // Round up to the next highest power of 2
+    private static int roundup(int v)
+    {
+        // Integer.numberOfLeadingZeros() returns 32 for zero input
+        if (v == 0) {
+            v = 1;
+        }
+        int lz = Integer.numberOfLeadingZeros(v);
+        int rounded = 0x80000000 >>> lz;
+        // 0x800000001 and higher are actually rounded _down_ to prevent overflow
+        if (v > rounded && lz > 0) {
+            rounded <<= 1;
+        }
+        return rounded;
+    }
+
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/VectorAverage.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/VectorAverage.java
new file mode 100644
index 0000000..41f0411
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/wavelib/VectorAverage.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.audio.wavelib;
+
+import android.util.Log;
+
+public class VectorAverage {
+    private static final String LOGTAG = "VectorAverage";
+    private static final int mVersion = 0;
+    private double[] mData;
+    private int mValueCount = 0;
+
+    public void setData(double[] data, boolean replace) {
+        int size = data.length;
+        if (mData == null || mData.length != size) {
+            mData = new double[size];
+            mValueCount = 0;
+        }
+        if (replace || mValueCount == 0) {
+            System.arraycopy(data, 0, mData, 0, size);
+            mValueCount = 1;
+        } else {
+            for (int i = 0; i < size; i++) {
+                mData[i] += data[i];
+            }
+            mValueCount++;
+        }
+    }
+
+    public int getData(double[] data, boolean raw) {
+        int nCount = 0;
+        if (mData != null && mData.length <= data.length) {
+            nCount = mData.length;
+            if (mValueCount == 0) {
+                for (int i = 0; i < nCount; i++) {
+                    data[i] = 0;
+                }
+            } else if (!raw && mValueCount > 1) {
+                for (int i = 0; i < nCount; i++) {
+                    data[i] = mData[i] / mValueCount;
+                }
+            } else {
+                for (int i = 0; i < nCount; i++) {
+                    data[i] = mData[i];
+                }
+            }
+        }
+        return nCount;
+    }
+
+    public int getCount() {
+        return mValueCount;
+    }
+
+    public int getSize() {
+        if (mData != null) {
+            return mData.length;
+        }
+        return 0;
+    }
+
+    public void reset() {
+        mValueCount = 0;
+    }
+
+    private final String SERIALIZED_VERSION = "VECTOR_AVERAGE_VERSION";
+    private final String SERIALIZED_COUNT = "COUNT";
+
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+
+        //version
+        sb.append(SERIALIZED_VERSION +"="+ mVersion +"\n");
+
+        double[] data = new double[getSize()];
+        getData(data,false);
+
+        //element count
+        int nCount = data.length;
+        sb.append(SERIALIZED_COUNT + "=" + nCount +"\n");
+
+        for (int i = 0; i < nCount; i++) {
+            sb.append(String.format("%f\n",data[i]));
+        }
+
+        return sb.toString();
+    }
+
+    public boolean initFromString(String string) {
+        boolean success = false;
+
+        String[] lines = string.split(System.getProperty("line.separator"));
+
+        int lineCount = lines.length;
+        if (lineCount > 3) {
+            int nVersion = -1;
+            int nCount = -1;
+            int nIndex = 0;
+
+            //search for version:
+            while (nIndex < lineCount) {
+                String[] separated = lines[nIndex].split("=");
+                nIndex++;
+                if (separated.length > 1 && separated[0].equalsIgnoreCase(SERIALIZED_VERSION)) {
+                    nVersion = Integer.parseInt(separated[1]);
+                    break;
+                }
+            }
+
+            if (nVersion >= 0) {
+                //get count
+
+                while (nIndex < lineCount) {
+                    String[] separated = lines[nIndex].split("=");
+                    nIndex++;
+                    if (separated.length > 1 && separated[0].equalsIgnoreCase(SERIALIZED_COUNT)) {
+                        nCount = Integer.parseInt(separated[1]);
+                        break;
+                    }
+                }
+
+                if (nCount > 0 && nCount <= lineCount-2 && nCount < 20000) { //foolproof
+                    //now add nCount to the vector.
+                    double[] data = new double[nCount];
+                    int dataIndex=0;
+
+                    while (nIndex < lineCount) {
+                        double value = Double.parseDouble(lines[nIndex]);
+                        data[dataIndex++] = value;
+                        nIndex++;
+                    }
+                    setData(data, true);
+                    success = true;
+                }
+            }
+        }
+
+        return success;
+    }
+
+    private static void log(String msg) {
+        Log.v(LOGTAG, msg);
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleAdvertiserService.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleAdvertiserService.java
index b4a6416..5a60ad0 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleAdvertiserService.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleAdvertiserService.java
@@ -42,7 +42,7 @@
 public class BleAdvertiserService extends Service {
 
     public static final boolean DEBUG = true;
-    public static final String TAG = "BleAdvertiseService";
+    public static final String TAG = "BleAdvertiserService";
 
     public static final int COMMAND_START_ADVERTISE = 0;
     public static final int COMMAND_STOP_ADVERTISE = 1;
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/AutoLockTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/AutoLockTest.java
deleted file mode 100644
index 9181b29..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/AutoLockTest.java
+++ /dev/null
@@ -1,1078 +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 com.android.cts.verifier.camera.analyzer;
-
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.ImageFormat;
-import android.hardware.Camera;
-import android.hardware.usb.UsbAccessory;
-import android.hardware.usb.UsbManager;
-import android.os.ParcelFileDescriptor;
-import android.util.Log;
-import android.view.SurfaceView;
-import android.widget.ImageView;
-import android.widget.Toast;
-
-import java.io.FileDescriptor;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Implements a test to verify whether the Auto Exposure Lock functions as
- * described in the API.
- *
- * The test consists three sub-categories. The first set of tests focus on
- * testing whether the auto exposure lock works in various situations.
- * For all tests in this set, the lock is set during the period when the camera
- * preview is open. In this way the lock locks exposure according to the
- * lighting at the moment of setting the lock. The second set of tests focus on
- * testing whether the auto exposure lock works as expected after turning the
- * preview off and on. The lock is set during the period when the camera
- * preview is turned off. The lock is expected to lock an exposure level
- * identical to the one before the preview is turned off. One special case in
- * this category is to set lock before the preview is turned on for the first
- * time.
- */
-public class AutoLockTest extends CameraTests {
-
-    private static final String TAG = "AutoLockTest";
-    /** USB permission to connect to ADK. */
-    private static final String ACTION_USB_PERMISSION = "com.android.cts.verifier.USB_PERMISSION";
-    /** Defines a long sleep period.*/
-    private static final int SHORT_SLEEP = 2000;
-    /** Defines a short sleep period. */
-    private static final int LONG_SLEEP = 4000;
-
-    /** Test results in text format. */
-    private String mDebugText = new String();
-    /** Detailed report. */
-    private String mResultText = new String();
-    /** Thread lock of the camera callbacks. */
-    private final Object mProcessingImage = new Object();
-    /** Memory address of the native test handler. */
-    private long mTestHandler;
-    /** Array storing the reference test results. */
-    private ArrayList<Boolean> mReferenceCompareResults;
-    /** Array storing the reference test scenario logs. */
-    private ArrayList<String> mReferenceLogs;
-    /** Number of tests so far. */
-    private int mTestCount;
-
-    /** Usb Manager of the USB connections. */
-    private UsbManager mUsbManager;
-    /** Intent for getting the permission to access the ADK. */
-    private PendingIntent mPermissionIntent;
-    /** Boolean to represent whether a permission is gained. */
-    private boolean mPermissionRequestPending;
-    /** USB accessory pointing to the ADK. */
-    private UsbAccessory mAccessory;
-    /** File descriptor of the USB communication port. */
-    private ParcelFileDescriptor mFileDescriptor;
-    /** Output stream to write commands for ADK to. */
-    private FileOutputStream mOutputStream;
-
-    /** Pointer to the CameraAnalyzerActivity activity. */
-    private CameraAnalyzerActivity mActivity;
-    /** Boolean to tell whether the accessory is opened. */
-    private boolean mSetupReady;
-    /** Thread lock for setting up the usb. */
-    private final Object mUsbSetup = new Object();
-    /** Boolean to indicate whether there is an ADK attached. */
-    private boolean mUsingUsb = false;
-    /** Test results.*/
-    private int[] mTestResults;
-    /** Number of tests. */
-    private int mNumTests;
-    /** Singleton test instance.*/
-    private static AutoLockTest singletonTest = null;
-
-    /**
-     * Receives the notice of whether the connection to ADK is granted or
-     * denied.
-     */
-    private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            Log.v(TAG, String.format("Received USB broadcast with action %s ", action));
-
-            if (ACTION_USB_PERMISSION.equals(action)) {
-                synchronized (this) {
-                    UsbAccessory accessory =
-                        (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
-
-                    if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
-                        // Grants the permission to connect to the ADK.
-                        Log.v(TAG, "Open accessory 3");
-                        openAccessory(accessory);
-                        // Overwrites the old camera instsance with the one currently opened
-                        // by the CameraAnalyzerActivity instance, since the permission
-                        // dialogue pauses the CameraAnalyzerActivity and forces the camera to
-                        // be released and reopened when the dialogue disappears.
-                        mTestCamera = mActivity.getCameraInstance();
-                    } else {
-                        // Denies the permission to connect to the ADK.
-                        Log.d(TAG, "permission denied for accessory " + accessory);
-                    }
-                    // Marks that the permission request has been processed.
-                    mPermissionRequestPending = false;
-                }
-            } else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
-                // Invokes when the USB is detached.
-                // Closes the accessory if it has not been closed.
-                Log.v(TAG, "Usb device detached");
-                mUsingUsb = false;
-                UsbAccessory accessory =
-                    (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
-                if (accessory != null && accessory.equals(mAccessory)) {
-                    closeAccessory();
-                }
-            }
-        }
-    };
-
-    /**
-     * Opens the ADK from USB and attaches the output stream with it.
-     *
-     * Notifies the tread lock that the USB setup is ready.
-     */
-    private void openAccessory(UsbAccessory accessory) {
-        Log.d(TAG, "openAccessory: " + accessory);
-        mFileDescriptor = mUsbManager.openAccessory(accessory);
-
-        if (mFileDescriptor != null) {
-            mAccessory = accessory;
-            FileDescriptor fd = mFileDescriptor.getFileDescriptor();
-            mOutputStream = new FileOutputStream(fd);
-            Log.d(TAG, "accessory opened");
-        } else {
-            Log.d(TAG, "accessory open fail");
-        }
-
-        // Unlocks the thread lock of waiting for the USB to be ready.
-        synchronized (mUsbSetup) {
-            mSetupReady = true;
-            Log.v(TAG, "Setup ready");
-            mUsbSetup.notifyAll();
-        }
-    }
-
-    /**
-     * Closes the ADK and detaches the output stream from it.
-     */
-    private void closeAccessory() {
-        try {
-            if (mFileDescriptor != null) {
-                mFileDescriptor.close();
-            }
-        } catch (IOException e) {
-        } finally {
-            mFileDescriptor = null;
-            mAccessory = null;
-        }
-    }
-
-    /**
-     * Constructs the AutoLockTest class, which can execute a series of tests
-     * to verify whether the device's Auto Exposure Lock is working properly.
-     *
-     * The test uses the LED lights on an ADK device as light source to change
-     * the lighting condition of the environment. The usb connection to the
-     * ADK board is established in the constructor.
-     *
-     * @param hostActivity pointer to the <code>CameraAnalyzerActivity</code>
-     * that instructs the Auto Lock Test
-     * @param mCamera pointer to the current camera instance
-     */
-    private AutoLockTest(){
-        super();
-    }
-
-    public static synchronized AutoLockTest getSingletonTest() {
-        if (singletonTest == null) {
-            Log.v(TAG, "Creating a new AutoLockTest instance");
-            singletonTest = new AutoLockTest();
-            singletonTest.initializeTest();
-        }
-        return singletonTest;
-    }
-
-    private void initializeTest() {
-        // Creates a native test handler with a 120x160 pixel debug output
-        mTestHandler = createAutoLockTest();
-        mReferenceCompareResults = new ArrayList<Boolean>();
-        mReferenceLogs = new ArrayList<String>();
-        mNumTests = 4;
-        mTestResults = new int[mNumTests];
-        for (int i = 0; i < mNumTests; ++i) {
-            mTestResults[i] = CameraTests.CAMERA_TEST_NOT_RUN;
-        }
-    }
-
-    public void updateCamera() {}
-
-    public void setActivity(CameraAnalyzerActivity hostActivity){
-        if (mUsingUsb) {
-            closeConnection();
-        }
-
-        mActivity = hostActivity;
-
-        mSetupReady = false;
-
-        Log.v(TAG, "Start to test ADK connection");
-        // Starts to establish the connection to the ADK board.
-        mUsbManager = (UsbManager) mActivity.getSystemService(Context.USB_SERVICE);
-        mPermissionIntent = PendingIntent.getBroadcast(mActivity, 0,
-                                                       new Intent(ACTION_USB_PERMISSION), 0);
-        IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
-        filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);
-        filter.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);
-        mActivity.registerReceiver(mUsbReceiver, filter);
-
-        if (mActivity.getLastNonConfigurationInstance() != null) {
-            mAccessory = (UsbAccessory) mActivity.getLastNonConfigurationInstance();
-            Log.v(TAG, "Open acceossory 1");
-            openAccessory(mAccessory);
-        }
-
-        // Skips the permission listener if the user already grants the ADK
-        // permission previously in the app.
-        UsbAccessory[] accessories = mUsbManager.getAccessoryList();
-        UsbAccessory accessory = (accessories == null ? null : accessories[0]);
-        if (accessory != null) {
-            if (mUsbManager.hasPermission(accessory)) {
-                Log.v(TAG, "Open accessory 2");
-                openAccessory(accessory);
-            } else {
-                synchronized (mUsbReceiver) {
-                    if (!mPermissionRequestPending) {
-                        mUsbManager.requestPermission(accessory, mPermissionIntent);
-                        mPermissionRequestPending = true;
-                    }
-                }
-            }
-            mUsingUsb = true;
-        } else {
-            Log.d(TAG, "accessory is null");
-            mUsingUsb = false;
-        }
-
-    }
-
-    /**
-     * Closes the accessories and unregister the USB listener at the end of
-     * tests.
-     */
-    public void closeConnection() {
-        closeAccessory();
-        mActivity.unregisterReceiver(mUsbReceiver);
-    }
-
-    protected void finalize ()  {
-        if (mUsingUsb) {
-            closeConnection();
-        }
-    }
-
-    /**
-     * Runs the Auto Lock tests. A total of 19 tests have been coded and
-     * included. Developers can freely comment out tests not interested. In
-     * the release version, all tests will be executed.
-     */
-    @Override
-    public synchronized void run(int index){
-        if (index == 0) {
-            for (int i = 1; i < mNumTests; ++i) {
-                run(i);
-            }
-            return;
-        }
-
-        Log.v(TAG, "AutoLockTest thread started!");
-
-        if (mUsingUsb && (!mSetupReady)) {
-            // USB connection is not set up. Locks thread and wait.
-            Log.v(TAG, "Setup not ready, waiting");
-            synchronized (mUsbSetup) {
-                try{
-                    Log.v(TAG, "Start waiting for Image");
-                    mUsbSetup.wait();
-                } catch (InterruptedException e) {
-                    Log.v(TAG, "Callback wait fails!");
-                }
-            }
-        }
-
-        // Restarts the camera intance and attach the preview to the corrent
-        // UI elements.
-        restartCamera();
-        startPreview();
-
-        mTestCount = 0;
-        switch (index) {
-            case 1:
-                Log.v(TAG, "SP -> TP1 -> SP -> +1 -> Lock -> -1 -> TP2");
-                test0();
-                Log.v(TAG, "SP -> TP1 -> SP -> Lock -> +1 -> TP2 -> -1");
-                test1();
-                Log.v(TAG, "SP -> Lock -> +1 -> TP1 -> SP -> -1 -> Lock -> TP2");
-                test2();
-                Log.v(TAG, "SP -> Lock -> +1 -> TP1 -> SP -> Lock -> -1 -> TP2");
-                test3();
-                break;
-            case 2:
-                Log.v(TAG, "SP -> +1 -> TP1 -> -1 -> Lock -> SP -> TP2");
-                test4();
-                Log.v(TAG, "SP -> +1 -> TP1 -> Lock -> SP -> -1 -> TP2");
-                test5();
-                Log.v(TAG, "SP -> TP1 -> +1 -> Lock -> SP -> -1 -> TP2");
-                test6();
-                Log.v(TAG, "SP -> TP1 -> +1 -> Lock -> SP -> TP2");
-                test7();
-                Log.v(TAG, "SP -> TP1 -> Lock -> SP -> +1 -> TP2");
-                test8();
-                Log.v(TAG, "SP -> +1 -> Lock -> -1 -> TP1 -> Lock -> SP -> TP2");
-                test9();
-                Log.v(TAG, "SP -> +1 -> Lock -> TP1 -> -1 -> Lock -> SP -> TP2");
-                test10();
-                Log.v(TAG, "SP -> Lock -> TP1 -> +1 -> Lock -> SP -> -1 -> TP2");
-                test11();
-                break;
-            case 3:
-                Log.v(TAG, "Restart -> Lock -> SP -> TP1 -> Restart -> Lock -> SP -> +1 -> TP2");
-                test12();
-                Log.v(TAG, "Restart -> Lock -> SP -> +1 -> TP1 -> -1 -> Lock -> SP -> TP2");
-                test13();
-                Log.v(TAG, "Restart -> Lock -> SP -> +1 -> TP1 -> Lock -> SP -> -1 -> TP2");
-                test14();
-                Log.v(TAG, "Restart -> Lock -> SP -> TP1 -> +1 -> Lock -> SP -> -1 -> TP2");
-                test15();
-                Log.v(TAG, "Restart -> Lock -> SP -> TP1 -> +1 -> Lock -> SP -> TP2");
-                test16();
-                Log.v(TAG, "Restart -> Lock -> SP -> TP1 -> Lock -> SP -> +1 -> TP2");
-                test17();
-                Log.v(TAG, "Restart -> Lock -> SP -> TP1 -> Lock -> SP -> TP2");
-                test18();
-                break;
-            default:
-                break;
-        }
-
-        releaseLock();
-
-        Log.v(TAG, "Ready to process data");
-        boolean[] testCompareResults = new boolean[2 * mTestCount];
-
-        // Processes the data stored in the native test handler instance.
-        // Stores the test results into a boolean array.
-        processAutoLockTest(mTestHandler, testCompareResults);
-
-        // Prepares the test result text output with the booelan result array.
-        prepareDebugText(testCompareResults, index);
-        mReferenceCompareResults.clear();
-        mReferenceLogs.clear();
-    }
-
-    /**
-     * Compares two images taken under the same lighting, Image 1 without AE
-     * lock and Image 2 with AE locked under a bright light. Image 1 is
-     * expected to be brighter than Image 2.
-     * Tests whether AE lock works compared to no AE lock.
-     */
-    private void test0() {
-        releaseLock();
-        takePicture();
-        startPreview();
-        turnOnLight();
-        setLock();
-        turnOffLight();
-        takePicture();
-        startPreview();
-        releaseLock();
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Same lighting condition with one different lock");
-        ++mTestCount;
-    }
-
-    /**
-     * Compares two images taken under different lighting, Image 1 without AE
-     * lock and Image 2 with with AE locked under the same light Image 1 is
-     * taken. Image 2 is taken under a bright light. Image 1 is expected to be
-     * darker than Image 2.
-     * Tests whether AE lock works compared to no AE lock.
-     */
-    private void test1() {
-        releaseLock();
-        takePicture();
-        startPreview();
-        setLock();
-        turnOnLight();
-        takePicture();
-        turnOffLight();
-        startPreview();
-        releaseLock();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("One same lock with different lighting");
-        ++mTestCount;
-    }
-
-    /**
-     * Compares two images taken under different light, both with AE locked
-     * under the same lighting. Image 1 is taken under a brighter light.
-     * Image 1 is expected to be brighter than Image 2.
-     * Tests whether AE locks the exposure to the same level in the same
-     * lighting condition after preview restarts.
-     */
-     private void test2() {
-        releaseLock();
-        setLock();
-        turnOnLight();
-        takePicture();
-        startPreview();
-        turnOffLight();
-        setLock();
-        takePicture();
-        startPreview();
-        releaseLock();
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Same locking locations with different lighting");
-        ++mTestCount;
-    }
-
-    /**
-     * Compares two images taken under different light, Image 1 with AE locked
-     * under normal light and Image 2 with AE locked under a bright light.
-     * Image 1 is taken under a bright light and Image 2 is taken in the normal
-     * lighting. Image 1 is expected to be brighter than Image 2.
-     * Tests whether AE lock can adjust to change of lighting conditions.
-     */
-    private void test3() {
-        releaseLock();
-        setLock();
-        turnOnLight();
-        takePicture();
-        startPreview();
-        setLock();
-        turnOffLight();
-        takePicture();
-        startPreview();
-        releaseLock();
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Different locking locations with different lighting");
-        ++mTestCount;
-    }
-
-    /**
-     * Compares two images taken under different lighting, Image 1 without
-     * AE lock and Image 2 with AE lock set before camera preview resumes.
-     * Image 1 is taken under a bright light and the light is turned off before
-     * camera preview starts again. Image 1 is expected to be brighter than
-     * Image 2.
-     * Tests whether setting AE lock between camera preview stops and restarts
-     * can retain the exposure level of the previous AE-unlocked photo.
-     */
-    private void test4() {
-        releaseLock();
-        turnOnLight();
-        takePicture();
-        turnOffLight();
-        setLock();
-        startPreview();
-        takePicture();
-        startPreview();
-        releaseLock();
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock after takePicture and light change, before preview");
-        ++mTestCount;
-    }
-
-    /**
-     * Compares two images taken under different lighting, Image 1 without
-     * AE lock and Image 2 with AE lock set before camera preview resumes.
-     * Image 1 is taken under a bright light and the light is turned off after
-     * preview restars but before Image 2 is taken. Image 1 is expected to be
-     * brighter than Image 2.
-     * Tests whether setting AE lock between camera preview stops and restarts
-     * can retain the exposure level of the previous AE-unlocked photo.
-     */
-    private void test5() {
-        releaseLock();
-        turnOnLight();
-        takePicture();
-        setLock();
-        startPreview();
-        turnOffLight();
-        takePicture();
-        startPreview();
-        releaseLock();
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock between takePicture and light change, w/o light change");
-        ++mTestCount;
-    }
-
-    private void test6() {
-        releaseLock();
-        takePicture();
-        turnOnLight();
-        setLock();
-        startPreview();
-        turnOffLight();
-        takePicture();
-        startPreview();
-        releaseLock();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add("Lock after takePicture and light change, before preview.");
-        ++mTestCount;
-    }
-
-    private void test7() {
-        releaseLock();
-        takePicture();
-        turnOnLight();
-        setLock();
-        startPreview();
-        takePicture();
-        startPreview();
-        releaseLock();
-        turnOffLight();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock after takePicture and light change, before preview.");
-        ++mTestCount;
-    }
-
-    private void test8() {
-        releaseLock();
-        takePicture();
-        setLock();
-        startPreview();
-        turnOnLight();
-        takePicture();
-        startPreview();
-        releaseLock();
-        turnOffLight();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock after takePicture and before startPreview.");
-        ++mTestCount;
-    }
-
-    private void test9() {
-        releaseLock();
-        turnOnLight();
-        setLock();
-        turnOffLight();
-        takePicture();
-        setLock();
-        startPreview();
-        takePicture();
-        releaseLock();
-        startPreview();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add("Lock after first lock with changing light");
-        ++mTestCount;
-    }
-
-    private void test10() {
-        releaseLock();
-        turnOnLight();
-        setLock();
-        takePicture();
-        turnOffLight();
-        setLock();
-        startPreview();
-        takePicture();
-        releaseLock();
-        startPreview();
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock after first lock with changing light");
-        ++mTestCount;
-    }
-
-    private void test11() {
-        releaseLock();
-        setLock();
-        takePicture();
-        turnOnLight();
-        setLock();
-        startPreview();
-        turnOffLight();
-        takePicture();
-        releaseLock();
-        startPreview();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add("Lock after first lock with changing light");
-        ++mTestCount;
-    }
-
-    private void test12() {
-        //"Restart -> Lock -> SP -> TP1 -> Restart -> Lock -> SP -> +1 -> TP2"
-        restartCamera();
-        setLock();
-        startPreview();
-        takePicture();
-        releaseLock();
-        restartCamera();
-        setLock();
-        startPreview();
-        turnOnLight();
-        takePicture();
-        releaseLock();
-        turnOffLight();
-        startPreview();
-        //mTestCamera.release();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock before first preview");
-        ++mTestCount;
-    }
-
-    private void test13() {
-        //"Restart -> Lock -> SP -> +1 -> TP1 -> -1 -> Lock -> SP -> TP2"
-        restartCamera();
-        setLock();
-        startPreview();
-        turnOnLight();
-        takePicture();
-        turnOffLight();
-        setLock();
-        startPreview();
-        takePicture();
-        releaseLock();
-        startPreview();
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock after first lock with changing light");
-        ++mTestCount;
-    }
-
-    private void test14() {
-        //"Restart -> Lock -> SP -> +1 -> TP1 -> Lock -> SP -> -1 -> TP2"
-        restartCamera();
-        setLock();
-        startPreview();
-        turnOnLight();
-        takePicture();
-        setLock();
-        startPreview();
-        turnOffLight();
-        takePicture();
-        releaseLock();
-        startPreview();
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock after first lock with changing light");
-        ++mTestCount;
-    }
-
-    private void test15() {
-        //"Restart -> Lock -> SP -> TP1 -> +1 -> Lock -> SP -> -1 -> TP2"
-         restartCamera();
-        setLock();
-        startPreview();
-        takePicture();
-        turnOnLight();
-        setLock();
-        startPreview();
-        turnOffLight();
-        takePicture();
-        releaseLock();
-        startPreview();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add("Lock after first lock with changing light");
-        ++mTestCount;
-    }
-
-    private void test16() {
-        //"Restart -> Lock -> SP -> TP1 -> +1 -> Lock -> SP -> TP2"
-        restartCamera();
-        setLock();
-        startPreview();
-        takePicture();
-        turnOnLight();
-        setLock();
-        startPreview();
-        takePicture();
-        turnOffLight();
-        releaseLock();
-        startPreview();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock after first lock with changing light");
-        ++mTestCount;
-    }
-
-    private void test17() {
-        //"Restart -> Lock -> SP -> TP1 -> Lock -> SP -> +1 -> TP2"
-        restartCamera();
-        setLock();
-        startPreview();
-        takePicture();
-        setLock();
-        startPreview();
-        turnOnLight();
-        takePicture();
-        turnOffLight();
-        releaseLock();
-        startPreview();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add("Lock after first lock with changing light");
-        ++mTestCount;
-    }
-
-    private void test18() {
-        //"Restart -> Lock -> SP -> TP1 -> Lock -> SP -> TP2"
-        restartCamera();
-        setLock();
-        startPreview();
-        takePicture();
-        setLock();
-        startPreview();
-        takePicture();
-        releaseLock();
-        startPreview();
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add("Lock after first lock with changing light");
-        ++mTestCount;
-    }
-
-    /**
-     * Restarts the camera by releasing the current instance and get a new
-     * instance. Also connects this new camera instance's preview to the proper
-     * UI surfaceview.
-     */
-    private void restartCamera() {
-        Log.v(TAG, "Restarting Camera");
-
-        mTestCamera.release();
-        Log.v(TAG, "Camera released");
-
-        try {
-            mTestCamera = Camera.open(mActivity.getCameraIdx());
-        } catch (RuntimeException e) {
-            throw new RuntimeException("Failed to open the camera", e);
-        }
-
-        Camera.Parameters params = mTestCamera.getParameters();
-        params.setPictureFormat(ImageFormat.JPEG);
-        params.setPictureSize(640, 480);
-        mTestCamera.setParameters(params);
-
-        try {
-            mTestCamera.setPreviewDisplay(super.getCameraView().getHolder());
-        } catch (IOException e) {
-            throw new RuntimeException("Unable to connect camera to display: " + e);
-        }
-    }
-
-    /**
-     * Starts Camera preview with a delay of 2 seconds to let it adjust to
-     * the lighting condition.
-     */
-    private void startPreview() {
-        mTestCamera.startPreview();
-        try{
-            Log.v(TAG, "Waiting");
-            Thread.sleep(2000);
-            Log.v(TAG, "END Waiting");
-        } catch (InterruptedException e){}
-    }
-
-    /**
-     * Sends command to ADK to turn on all the LED lights to white.
-     * Waits for 4 seconds for the camera to adjust to the new lighting.
-     */
-    private void turnOnLight() {
-        Log.v(TAG, "Turn on light");
-        if (mUsingUsb) {
-            byte[] buffer = new byte[3];
-
-            buffer[0] = (byte) 3;
-            buffer[1] = (byte) 0;
-            buffer[2] = (byte) 1;
-            if (mOutputStream != null && buffer[1] != -1) {
-                try {
-                    mOutputStream.write(buffer);
-                } catch (IOException e) {
-                    Log.e(TAG, "write failed", e);
-                }
-            }
-        } else {
-            mActivity.runOnUiThread(new Runnable() {
-                public void run() {
-                    Toast.makeText(mActivity.getApplicationContext(), "Turn on light!", 4).show();
-
-                }
-            });
-        }
-
-        try{
-            Log.v(TAG, "Waiting, Please Turn on light");
-            Thread.sleep(LONG_SLEEP);
-            Log.v(TAG, "END Waiting");
-        } catch (InterruptedException e){}
-    }
-
-    /**
-     * Sends command to ADK to turn off all LED lights.
-     * Waits for 4 seconds for the camera to adjust to the new lighting.
-     */
-    private void turnOffLight() {
-        Log.v(TAG, "Turn off light");
-        if (mUsingUsb) {
-            byte[] buffer = new byte[3];
-
-            buffer[0] = (byte) 3;
-            buffer[1] = (byte) 0;
-            buffer[2] = (byte) 0;
-            if (mOutputStream != null && buffer[1] != -1) {
-                try {
-                    mOutputStream.write(buffer);
-                } catch (IOException e) {
-                    Log.e(TAG, "write failed", e);
-                }
-            }
-        } else {
-            mActivity.runOnUiThread(new Runnable() {
-                public void run() {
-                    Toast.makeText(mActivity.getApplicationContext(), "Turn off light!", 4).show();
-
-                }
-            });
-        }
-
-        try{
-            Log.v(TAG, "Waiting, Please Turn off light");
-            Thread.sleep(LONG_SLEEP);
-            Log.v(TAG, "END Waiting");
-        } catch (InterruptedException e){}
-    }
-
-    /**
-     * Sets the Auto Exposure Lock.
-     * Waits for 2 seonds for the lock to function.
-     */
-    private void setLock() {
-        Camera.Parameters params = mTestCamera.getParameters();
-
-        params.setAutoExposureLock(true);
-        params.setAutoWhiteBalanceLock(true);
-        mTestCamera.setParameters(params);
-        try{
-            Log.v(TAG, "Waiting to set lock");
-            Thread.sleep(2000);
-            Log.v(TAG, "END Waiting");
-        } catch (InterruptedException e){}
-    }
-
-    /**
-     * Releases the Auto Exposure Lock.
-     * Waits for 4 seconds afterwards for the Auto Exposure to be adjusted
-     * to the lighting condition.
-     */
-    private void releaseLock() {
-        Camera.Parameters params = mTestCamera.getParameters();
-
-        params.setAutoExposureLock(false);
-        params.setAutoWhiteBalanceLock(false);
-        mTestCamera.setParameters(params);
-        try{
-            Log.v(TAG, "Waiting to release lock");
-            Thread.sleep(LONG_SLEEP);
-            Log.v(TAG, "END Waiting");
-        } catch (InterruptedException e){}
-
-    }
-
-    /**
-     * Takes a picture and locks thread until the picture callback finishes.
-     */
-    private void takePicture(){
-        mTestCamera.takePicture(null, null, null, mTestJpegListener);
-
-        synchronized (mProcessingImage) {
-            try{
-                Log.v(TAG, "Start waiting for Image");
-              //  System.gc();
-                mProcessingImage.wait();
-            } catch (InterruptedException e){
-                 Log.v(TAG, "Callback wait fails!");
-            }
-        }
-    }
-
-    /**
-     * Prepare for the result to be shown in the UI. The result for each single
-     * test is shown in green if it matches the reference result. It is shown
-     * in red otherwise.
-     */
-    private void prepareDebugText(boolean[] testCompareResults, int index) {
-        boolean groupTestPassed = true;
-         for (int i = 0; i < mTestCount; ++i) {
-              String testLog;
-              boolean testPassed = true;
-              testLog = mReferenceLogs.get(i);
-              mDebugText += (testLog + "<br/>");
-
-              if (testCompareResults[i * 2] == mReferenceCompareResults.get(i * 2)) {
-                  mDebugText += String.format(
-                      "Picture 1 brighter than Picture 2 is %b \n",
-                      testCompareResults[i * 2]);
-              } else {
-                  mDebugText += String.format(
-                      "Picture 1 brighter than Picture 2 is %b \n",
-                      testCompareResults[i * 2]);
-                  testPassed = false;
-              }
-
-              if (testCompareResults[i * 2 + 1] == mReferenceCompareResults.get(i * 2 + 1)) {
-                  mDebugText += String.format(
-                      "Picture 1 is equivalent to Picture 2 is %b \n",
-                      testCompareResults[i * 2 + 1]);
-              } else {
-                  mDebugText += String.format(
-                      "Picture 1 is equivalent to Picture 2 is %b \n",
-                      testCompareResults[i * 2 + 1]);
-                  testPassed = false;
-              }
-
-              if (testPassed) {
-                  mDebugText += "Test passed! \n";
-              } else {
-                  mDebugText += "Test failed! \n";
-                  groupTestPassed = false;
-              }
-         }
-        if (groupTestPassed) {
-            mTestResults[index] = CameraTests.CAMERA_TEST_SUCCESS;
-        } else {
-            mTestResults[index] = CameraTests.CAMERA_TEST_FAILURE;
-        }
-    }
-
-    /**
-     * Clears the debug text so that new test results can be added.
-     */
-    public void clearDebugText() {
-        mDebugText = "";
-    }
-
-    @Override
-    public String getDebugText() {
-        return mDebugText;
-    }
-
-    @Override
-    public String getResultText() {
-        return mDebugText;
-    }
-
-    @Override
-    public String getTestName() {
-        return "Auto Exposure Lock test: \n";
-    }
-
-    @Override
-    public String getTestName(int index) {
-        switch (index) {
-            case 0:
-                return "Run all tests";
-            case 1:
-                return "Compulsory tests";
-            case 2:
-                return "Recommended tests (preview behavior)";
-            case 3:
-                return "Optional tests (default lock)";
-            default:
-                return "";
-        }
-    }
-
-    @Override
-    public int getResult(int index) {
-        return mTestResults[index];
-    }
-
-    @Override
-    public int getNumTests() {
-        return mNumTests;
-    }
-
-    private Camera.PictureCallback mTestJpegListener = new Camera.PictureCallback() {
-        public void onPictureTaken(byte[] data, Camera mCamera) {
-            Log.v(TAG, "Shutter pressed down!");
-            Bitmap inputImage;
-
-            // Decodes the camera input data into Bitmap.
-            // Constructs a native image class with the image.
-            inputImage = BitmapFactory.decodeByteArray(data, 0, data.length);
-            long bufferAddress = findNative(inputImage);
-            Log.v(TAG, "findNative method finishes");
-
-            // Cleans up memory taken by the Bitmap.
-            data = null;
-            inputImage.recycle();
-            inputImage = null;
-            System.gc();
-
-            // Passes data from the native image class to the native
-            // test handler.
-            createAutoLockClass(bufferAddress, mTestHandler,
-                                getCheckerCenter(), getCheckerRadius());
-
-            // Unlocks the thread lock.
-            synchronized (mProcessingImage) {
-                mProcessingImage.notifyAll();
-            }
-        }
-    };
-
-    private native long createAutoLockTest();
-
-    private native void createAutoLockClass(long bufferAddress, long handlerAddress,
-                                            long checkerCenterAddress,
-                                            long checkerRadiusAddress);
-
-    private native void processAutoLockTest(long handlerAddress, boolean[] testCompareResults);
-
-    static {
-        System.loadLibrary("cameraanalyzer");
-    }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraAnalyzerActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraAnalyzerActivity.java
deleted file mode 100644
index 34e8d2d..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraAnalyzerActivity.java
+++ /dev/null
@@ -1,500 +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 com.android.cts.verifier.camera.analyzer;
-
-import com.android.cts.verifier.PassFailButtons;
-import com.android.cts.verifier.R;
-
-import android.app.Activity;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Color;
-import android.graphics.ImageFormat;
-import android.hardware.Camera;
-import android.hardware.Camera.CameraInfo;
-import android.hardware.Camera.Size;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.text.Html;
-import android.text.method.ScrollingMovementMethod;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.SurfaceHolder;
-import android.view.SurfaceView;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.TextView;
-import android.widget.Button;
-import android.os.PowerManager;
-import android.os.PowerManager.WakeLock;
-import android.content.Context;
-
-import java.io.IOException;
-import java.lang.Thread;
-import java.util.List;
-
-/**
- * Controls the UI activities of the camera quality test app. It is created
- * as soon as the app started. Users can launch different quality tests with
- * the buttons in the UI. This class will manage the threading for different
- * tests. Also it will provide debug output or debug text results for tests.
- */
-public class CameraAnalyzerActivity extends PassFailButtons.Activity {
-
-    private static final String TAG = "CameraAnalyzer";
-    private SurfaceView mCameraView;
-    private ImageView mResultView;
-    private Button mFindCheckerButton;
-    private Button mExposureCompensationButton;
-    private Button mWhiteBalanceButton;
-    private Button mAutoLockButton;
-    private Button mMeteringButton;
-    private ListView mTestList;
-    private TwoColumnAdapter mAdapter;
-
-    private Camera mCamera;
-    private int mCameraIdx = 0;
-    private boolean mIsCameraOpen = false;
-
-    private PowerManager mPowerManager;
-    private PowerManager.WakeLock mWakeLock;
-
-    private boolean mProcessingPicture = false;
-    private boolean mTestInProgress = false;
-    private final Object mProcessingTest = new Object();
-    private CameraTests mCurrentTest = null;
-
-    private long mCheckerCenterAddress;
-    private long mCheckerRadiusAddress;
-
-    private String mResultReport = "";
-    static final String[] TESTS = new String[] {"Test1", "Test2"};
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.ca_main);
-        setPassFailButtonClickListeners();
-        setInfoResources(R.string.camera_analyzer, R.string.ca_info, -1);
-
-        mFindCheckerButton = (Button) findViewById(R.id.findcheckerboardbutton);
-        mExposureCompensationButton = (Button) findViewById(R.id.exposurecompensationbutton);
-        mWhiteBalanceButton = (Button) findViewById(R.id.whitebalancebutton);
-        mAutoLockButton = (Button) findViewById(R.id.lockbutton);
-        mMeteringButton = (Button) findViewById(R.id.meteringbutton);
-        mCameraView = (SurfaceView) findViewById(R.id.cameraview);
-        mResultView = (ImageView) findViewById(R.id.resultview);
-        mTestList = (ListView) findViewById(R.id.ca_tests);
-        mAdapter = new TwoColumnAdapter(this);
-
-        // Initialize the list view.
-        initializeAdapter();
-        mTestList.setAdapter(mAdapter);
-        mTestList.setOnItemClickListener(mListListener);
-
-        mFindCheckerButton.setOnClickListener(mFindCheckerListener);
-        mExposureCompensationButton.setOnClickListener(mExposureCompensationListener);
-        mWhiteBalanceButton.setOnClickListener(mWhiteBalanceListener);
-        mAutoLockButton.setOnClickListener(mAutoLockListener);
-        mMeteringButton.setOnClickListener(mMeteringListener);
-        mCameraView.getHolder().addCallback(mSurfaceChangeListener);
-
-        // Disables all test buttons except the color checker test one.
-        // They will be enabled after the color checker is located.
-        mExposureCompensationButton.setEnabled(false);
-        mWhiteBalanceButton.setEnabled(false);
-        mAutoLockButton.setEnabled(false);
-        mMeteringButton.setEnabled(false);
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-
-        openCamera(mCameraIdx);
-        Camera.Parameters params = mCamera.getParameters();
-        params.setPictureFormat(ImageFormat.JPEG);
-        params.setPictureSize(640, 480);
-        mCamera.setParameters(params);
-        Log.v(TAG, "Set resolution to 640*480");
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        CameraTests.getCamera().release();
-        mIsCameraOpen = false;
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        MenuInflater inflater = getMenuInflater();
-        inflater.inflate(R.menu.ca_menu, menu);
-
-        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
-        int cameraCount = Camera.getNumberOfCameras();
-        for (int camIdx = 0; camIdx < cameraCount; ++camIdx) {
-            MenuItem cameraMenuItem = menu.add(0, camIdx, Menu.NONE,
-                                               String.format("Open Camera %d", camIdx));
-        }
-      return true;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        if (item.getItemId() != mCameraIdx) {
-            mCameraIdx = item.getItemId();
-            new SwitchCameraTask().execute(mCameraIdx);
-        }
-        return false;
-    }
-
-    private class SwitchCameraTask extends AsyncTask<Integer, Void, Void> {
-        @Override
-        protected Void doInBackground(Integer... camIdx) {
-            if (mTestInProgress) {
-                synchronized (mProcessingTest) {
-                    try{
-                        Log.v(TAG, "Waiting for test to finish");
-                        mProcessingTest.wait();
-                    } catch (InterruptedException e){
-                         Log.v(TAG, "test wait fails!");
-                    }
-                }
-            }
-
-            openCamera((int)camIdx[0]);
-            return null;
-        }
-    }
-
-    private synchronized void openCamera(int camIdx) {
-        if (mIsCameraOpen) {
-            CameraTests.getCamera().release();
-            Log.v(TAG, "Releasing the cameratests camera");
-        }
-        try {
-            mCamera = Camera.open(camIdx);
-            mIsCameraOpen = true;
-        } catch (RuntimeException e) {
-            throw new RuntimeException("Failed to open the camera", e);
-        }
-
-        try {
-            mCamera.setPreviewDisplay(mCameraView.getHolder());
-        } catch (IOException e) {
-            throw new RuntimeException("Unable to connect camera to display: " + e);
-        }
-        mCamera.startPreview();
-        CameraTests.setCamera(mCamera);
-
-        ColorCheckerTest.getSingletonTest().updateCamera();
-        WhiteBalanceTest.getSingletonTest().updateCamera();
-        ExposureCompensationTest.getSingletonTest().updateCamera();
-        MeteringTest.getSingletonTest().updateCamera();
-        AutoLockTest.getSingletonTest().updateCamera();
-    }
-
-    public Camera getCameraInstance() {
-        return mCamera;
-    }
-
-    public void disableAll() {
-        mExposureCompensationButton.setEnabled(false);
-        mWhiteBalanceButton.setEnabled(false);
-        mAutoLockButton.setEnabled(false);
-        mMeteringButton.setEnabled(false);
-        mFindCheckerButton.setEnabled(false);
-    }
-
-    public void enableAll() {
-        mExposureCompensationButton.setEnabled(true);
-        mWhiteBalanceButton.setEnabled(true);
-        mAutoLockButton.setEnabled(true);
-        mMeteringButton.setEnabled(true);
-        mFindCheckerButton.setEnabled(true);
-    }
-
-    /**
-     * Provides an abstraction for the Camera tests. The camera tests will
-     * run in the background and the results will be shown in the UI thread
-     * after the tests are processed.
-     */
-    private class DebugOutputProcessingTask extends AsyncTask<Integer,
-                                                              Integer,
-                                                              Integer> {
-        @Override
-        protected Integer doInBackground(Integer... cameraTestIndex) {
-            Log.v(TAG, "Do in Background started!");
-
-            mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
-            mWakeLock = mPowerManager.newWakeLock(
-                    PowerManager.SCREEN_DIM_WAKE_LOCK, "CameraQualityTest");
-            mWakeLock.acquire();
-
-            mTestInProgress = true;
-
-            // Processes the camera tests one by one and publishes their
-            // debug output or debug text results after each test is done.
-            mCurrentTest.run((int)cameraTestIndex[0]);
-            publishProgress(cameraTestIndex);
-
-            Log.v(TAG, "Do in Background thread returns!");
-            return cameraTestIndex[0];
-        }
-
-        @Override
-        protected void onProgressUpdate(Integer... cameraTestIndex) {
-            Log.v(TAG, "Prepare to get debug output!");
-
-            // Copies the debug output image or text results to the UI.
-            mResultView.setImageBitmap(mCurrentTest.getDebugOutput());
-            mResultReport += (mCurrentTest.getTestName() + mCurrentTest.getDebugText());
-            mAdapter.notifyDataSetChanged();
-        }
-
-        @Override
-        protected void onPostExecute(Integer cameraTestIndex) {
-
-            // If the test is to find the color checker, copy the memory
-            // address of the found color checker centers and radius to the
-            // CameraTests class' static fields.
-            if (mCurrentTest.copyCheckerAddress()) {
-                mCheckerCenterAddress = CameraTests.getCheckerCenter();
-                mCheckerRadiusAddress = CameraTests.getCheckerRadius();
-            }
-
-            if (mCurrentTest.copyCheckerAddress() ||
-                !mCurrentTest.getTestName().contains("Color Checker")) {
-                // Enables the button of all other tests after the color checker
-                // is found. Now the user can start all other available tests.
-                enableAll();
-            }
-
-            mWakeLock.release();
-            mTestInProgress = false;
-            synchronized (mProcessingTest) {
-                mProcessingTest.notifyAll();
-            }
-
-        }
-    }
-
-    // Creates and runs a new test to find color checker in the captured image.
-    // It is invoked when users press the Find color checker button in the UI.
-    private View.OnClickListener mFindCheckerListener = new View.OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            Log.v(TAG, "Running new color checker finding tests!");
-            ColorCheckerTest colorCheckerTest = ColorCheckerTest.getSingletonTest();
-
-            mCurrentTest = colorCheckerTest;
-            initializeAdapter();
-        }
-    };
-
-    // Creates and runs a new test to test the exposure compensation function.
-    // It is invoked when users press the Exposure Compensation Test button
-    // in the UI.
-    private View.OnClickListener mExposureCompensationListener = new View.OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            Log.v(TAG, "Running new exposure compensation tests!");
-
-            ExposureCompensationTest exposureCompensationTest =
-                    ExposureCompensationTest.getSingletonTest();
-
-            mCurrentTest = exposureCompensationTest;
-            initializeAdapter();
-
-            // Loads the memory address of the checker centers and radius
-            // from the this class and set the two values for the new test.
-            ExposureCompensationTest.setCheckerAddress(mCheckerCenterAddress,
-                                                   mCheckerRadiusAddress);
-        }
-    };
-
-    // Creates and runs a new test to test the white balance function.
-    // It is invoked when users press the White Balance Test button in the UI.
-    private View.OnClickListener mWhiteBalanceListener = new View.OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            Log.v(TAG, "Running new white balance tests!");
-
-            WhiteBalanceTest whiteBalanceTest = WhiteBalanceTest.getSingletonTest();
-
-            mCurrentTest = whiteBalanceTest;
-            initializeAdapter();
-
-            // Loads the memory address of the checker centers and radius
-            // from the this class and set the two values for the new test.
-            WhiteBalanceTest.setCheckerAddress(mCheckerCenterAddress, mCheckerRadiusAddress);
-        }
-    };
-
-    // Creates and runs a new test to test the camera metering function.
-    // It is invoked when users press the Metering Test button in the UI.
-    private View.OnClickListener mMeteringListener = new View.OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            Log.v(TAG, "Running new metering tests!");
-
-            MeteringTest meteringTest = MeteringTest.getSingletonTest();
-
-            mCurrentTest = meteringTest;
-            initializeAdapter();
-
-            // Loads the memory address of the checker centers and radius
-            // from the this class and set the two values for the new test.
-            MeteringTest.setCheckerAddress(mCheckerCenterAddress, mCheckerRadiusAddress);
-        }
-    };
-
-    // Creates and runs new tests to test the camera auto exposure lock.
-    // It is invoked when users press the AWB and AE Lock Test button
-    // in the UI.
-    private View.OnClickListener mAutoLockListener = new View.OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            Log.v(TAG, "Running New auto exposure/wb lock tests!");
-
-            // Loads the memory address of the checker centers and radius
-            // from the this class and set the two values for the new test.
-            AutoLockTest.setCheckerAddress(mCheckerCenterAddress, mCheckerRadiusAddress);
-
-            // Construct all base case test scenearios for the Auto Lock test.
-            // Detailed documentation on each test can be found in native code.
-            AutoLockTest autoLockTest = AutoLockTest.getSingletonTest();
-            autoLockTest.setActivity(CameraAnalyzerActivity.this);
-
-            mCurrentTest = autoLockTest;
-            initializeAdapter();
-
-        }
-    };
-
-    // Creates a list listner that launches the experiment with the user's click
-    private AdapterView.OnItemClickListener mListListener = new AdapterView.OnItemClickListener() {
-        @Override
-        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-            Log.v(TAG, String.format("Item %d selected!", position));
-            if (!mTestInProgress) {
-                DebugOutputProcessingTask captureTask = new DebugOutputProcessingTask();
-                disableAll();
-                captureTask.execute(position);
-            }
-        }
-    };
-
-    private SurfaceHolder.Callback mSurfaceChangeListener =
-            new SurfaceHolder.Callback() {
-
-        // Sets the aspect ratio of the camera preview to 4:3
-        @Override
-        public void surfaceChanged(SurfaceHolder holder,
-                                   int format,
-                                   int width,
-                                   int height) {
-            int x = mCameraView.getWidth();
-            int y = mCameraView.getHeight();
-            Log.v(TAG, String.format("Measures are %d, %d", x, y));
-
-            if ( x > 4.0 / 3.0 * y) {
-                android.view.ViewGroup.LayoutParams lp = mCameraView.getLayoutParams();
-                lp.height =  y;
-                lp.width = (int)(4.0 / 3.0 * lp.height);
-                Log.v(TAG, String.format("params are %d, %d", lp.width, lp.height));
-                mCameraView.setLayoutParams(lp);
-            }
-
-            try {
-                mCamera.setPreviewDisplay(mCameraView.getHolder());
-            } catch (IOException e) {
-                throw new RuntimeException("Unable to connect camera to display: " + e);
-            }
-            CameraTests.setCameraView(mCameraView);
-            mCamera.startPreview();
-        }
-
-        @Override
-        public void surfaceCreated(SurfaceHolder holder) {}
-
-        @Override
-        public void surfaceDestroyed(SurfaceHolder holder) {}
-    };
-
-    @Override
-    public String getTestDetails() {
-        return mResultReport;
-    }
-
-    class TwoColumnAdapter extends ArrayAdapter<String> {
-        TwoColumnAdapter(Context context) {
-            super(context, R.layout.ca_row);
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            LayoutInflater inflater = getLayoutInflater();
-            View row = inflater.inflate(R.layout.ca_row, parent, false);
-            ImageView iconField = (ImageView) row.findViewById(R.id.caTestIcon);
-            TextView nameField = (TextView) row.findViewById(R.id.caTestName);
-            TextView resultField = (TextView) row.findViewById(R.id.caTestResult);
-            if (mCurrentTest != null) {
-                nameField.setText(mCurrentTest.getTestName(position));
-                int result = mCurrentTest.getResult(position);
-                switch (result) {
-                    case CameraTests.CAMERA_TEST_SUCCESS:
-                        resultField.setText("Success");
-                        iconField.setBackgroundColor(Color.rgb(0x99,0xCC,00));
-                        resultField.setTextColor(Color.rgb(0x99,0xCC,00));
-                        break;
-                    case CameraTests.CAMERA_TEST_FAILURE:
-                        resultField.setText("Failed!");
-                        iconField.setBackgroundColor(Color.rgb(0xFF,0x44,0x44));
-                        resultField.setTextColor(Color.rgb(0xFF,0x44,0x44));
-                        break;
-                    case CameraTests.CAMERA_TEST_NOT_RUN:
-                        resultField.setText("Tap to run");
-                        iconField.setBackgroundColor(Color.rgb(0x00,0x99,0xCC));
-                        resultField.setTextColor(Color.rgb(0x33,0xB5,0xE5));
-                        break;
-                }
-            }
-            return row;
-        }
-    }
-
-    private void initializeAdapter() {
-        mAdapter.clear();
-        if (mCurrentTest != null) {
-            for (int i = 0; i < mCurrentTest.getNumTests(); ++i) {
-                mAdapter.add(mCurrentTest.getTestName(i));
-            }
-        }
-    }
-
-    public int getCameraIdx() {
-        return mCameraIdx;
-    }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraTests.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraTests.java
deleted file mode 100644
index ed99524..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraTests.java
+++ /dev/null
@@ -1,201 +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 com.android.cts.verifier.camera.analyzer;
-
-import android.graphics.Bitmap;
-import android.hardware.Camera;
-import android.os.Environment;
-import android.util.Log;
-import android.view.SurfaceView;
-
-import java.io.FileOutputStream;
-import java.io.File;
-import java.lang.Runnable;
-
-/**
- * Provides an abstraction for all camera tests and allows communication
- * between camera test classes with the UI thread. This base class provides
- * functions to contruct and access debug output images. It can access and
- * set the pointer address of checkerboard centers and radius. It also provides
- * native methods to convert an image shot by the camera into a native
- * character array. Another native method it provides is to create a native
- * test handler with desired debug height and width.
- */
-public abstract class CameraTests{
-
-    public static final int CAMERA_TEST_NOT_RUN = 0;
-    public static final int CAMERA_TEST_SUCCESS = 1;
-    public static final int CAMERA_TEST_FAILURE = 2;
-
-    private static final String TAG = "CameraTests";
-
-    /** Memory address of the color checker centers. */
-    private static long sCheckerCenterAddress = 0;
-    /** Memory address of the color checker radius. */
-    private static long sCheckerRadiusAddress = 0;
-    /** The surface view linked with the camera preview. */
-    private static SurfaceView sCameraView;
-    /** Image debug output. */
-    private Bitmap mDebugOutput;
-    /** Shared camera instance. */
-    protected static Camera mTestCamera = null;
-
-    /**
-     * Constructs the base CameraTests class.
-     */
-    public CameraTests() {}
-
-    /**
-     * Returns debug Bitmap image. In the test to find the color checker,
-     * the debug image will be the captured image with a matched color checker
-     * overlay on top. In the exposure compensation test, the debug image
-     * will be the response curve of the camera.
-     * @return A low-resolution Bitmap to be displayed in the UI.
-     */
-    public Bitmap getDebugOutput() {
-        return mDebugOutput;
-    }
-
-    public String getDebugText() {
-        return "";
-    }
-
-    public abstract String getTestName();
-
-    /**
-     * Gets the detailed report for CTS output.
-     */
-    public String getResultText(){
-        return "Details not available \n";
-    }
-
-    /**
-     * Provides a polymorphism to start the run() method for all child classes.
-     */
-    public abstract void run(int index);
-
-    public SurfaceView getCameraView() {
-        return sCameraView;
-    }
-
-    public static void setCameraView(SurfaceView cameraView) {
-        sCameraView = cameraView;
-    }
-
-    /**
-     * Refreshes the camera instance when the activity opens a new camera.
-     */
-    public static void setCamera(Camera newCamera) {
-        mTestCamera = newCamera;
-    }
-
-    public static Camera getCamera() {
-        return mTestCamera;
-    }
-
-    /**
-     * Sets the memory address of the checker centers and checker radius.
-     *
-     * @param inputCenterAddress the new memory address of
-     *                           the color checker centers
-     * @param inputRadiusAddress the new memory address of
-     *                           the color checker radius
-     */
-    public static void setCheckerAddress(long inputCenterAddress, long inputRadiusAddress) {
-        sCheckerCenterAddress = inputCenterAddress;
-        sCheckerRadiusAddress = inputRadiusAddress;
-    }
-
-    /**
-     * Provides polymorphism to indicate whether the checker memory addresses
-     * should be copied.
-     *
-     * @return <code>true</code> if the class invoking the method needs to
-     *                           update the memory address of the color checker
-     *                           centers and radius;
-     *         <code>false</code> if the class invoking the method does NOT
-     *                           update the memory address of the color checker
-     *                           centers and radius.
-     */
-    public boolean copyCheckerAddress() {
-        return false;
-    }
-
-    public void cleanUp() {
-    }
-
-    public static long getCheckerCenter() {
-        return sCheckerCenterAddress;
-    }
-
-    public static long getCheckerRadius() {
-        return sCheckerRadiusAddress;
-    }
-
-    public abstract String getTestName(int index);
-
-    public abstract int getResult(int index);
-
-    public abstract int getNumTests();
-
-    /**
-     * Provides a native method to convert the input Bitmap of the captured
-     * image into a native character array and constructs a native image class
-     * with this character array. This method currently supports conversion
-     * of Bitmaps in the formats of RGB_565 and RGB_8888.
-     *
-     * @param input the input Bitmap, which is decoded from the camrea data.
-     *
-     * @return the memory address of the native image class which contains
-     * the character array.
-     */
-    public native long findNative(Bitmap input);
-
-    /**
-     * Provides a native method to create a native image handler class. The
-     * native image handler class is the base class for all test classes and
-     * contains the debug output as a character array.
-     *
-     * @param outputHeight the desired height for the debug output
-     * @param outputWidth the desired width for the debug output
-     *
-     * @return the memory address of the native test handler class.
-     */
-    public native long createImageTestHandler(int outputHeight, int outputWidth);
-
-    /**
-     * Provides a native method to clean up the memory taken by the handler.
-     *
-     * @param handlerAddress the memory address of the native test handler,
-     * which contains the debug output.
-     */
-    public native void cleanUpHandler(long handlerAddress);
-
-    /**
-     * Provides a native method to convert the native debug output from
-     * character array back to Bitmap and copy it to the debug output of this
-     * class.
-     *
-     * @param handlerAddress the memory address of the native test handler,
-     * which contains the debug output.
-     */
-    public native void displayHandlerDebugOutput(long handlerAddress);
-
-    static {
-        System.loadLibrary("cameraanalyzer");
-    }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ColorCheckerTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ColorCheckerTest.java
deleted file mode 100644
index ad171b4..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ColorCheckerTest.java
+++ /dev/null
@@ -1,299 +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 com.android.cts.verifier.camera.analyzer;
-
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.hardware.Camera;
-import android.util.Log;
-import android.widget.ImageView;
-
-import java.util.List;
-
-/** Locates a Xrite Classic Color Checker grid pattern in an image, stores the
- * center positions and the color checker radius, and provides a function to
- * get the memory address of these two properties.
- *
- * The pattern is a 6x4 grid of square color patches. The detection routine
- * assumes the pattern is placed roughly facing the camera, with the long size
- * roughly horizontal. It also assumes that the grey squares are in the bottom
- * row.
- */
-public class ColorCheckerTest extends CameraTests {
-
-    private static final String TAG = "ColorCheckerTest";
-
-    /** Memory address of the image class instance that contains the image. */
-    private long mClassAddress;
-    /** Memory address of the image test class instance. */
-    private long mTestHandler;
-    /** Thread lock. */
-    private final Object mProcessingImage = new Object();
-    /** Boolean to tell whether auto focus has succeded.*/
-    private boolean mAutoFocusSuccess;
-    /** Boolean to tell whether auto focus is supported.*/
-    private boolean mAutoFocusEnabled = false;
-    /** Singleton instance of the class.*/
-    private static ColorCheckerTest singletonTest = null;
-
-    private boolean mFindCheckerSuccess = false;
-    private boolean mHasRunOnce = false;
-
-    /**
-     * Constructs a <code>ColorCheckerTest</code> instance with a given
-     * Camera pointer.
-     */
-    private ColorCheckerTest() {
-        super();
-    }
-
-    /**
-     * Updates the camera and parameter when the activity switches camera.
-     */
-    public void updateCamera() {
-        Camera.Parameters params = mTestCamera.getParameters();
-        List<String> supportedFocusModes = params.getSupportedFocusModes();
-
-        // Sets camera focus mode to Auto focus if it is supported.
-        if (supportedFocusModes.contains(params.FOCUS_MODE_AUTO)) {
-            Log.v(TAG, "Auto focus possible");
-            params.setFocusMode(params.FOCUS_MODE_AUTO);
-            mTestCamera.setParameters(params);
-            mAutoFocusEnabled = true;
-        } else {
-            mAutoFocusEnabled = false;
-        }
-    }
-
-    public static synchronized ColorCheckerTest getSingletonTest() {
-        if (singletonTest == null) {
-            Log.v(TAG, "Creating a new ColorCheckerTest instance");
-            singletonTest = new ColorCheckerTest();
-            singletonTest.initializeTest();
-        }
-        return singletonTest;
-    }
-
-    private void initializeTest() {
-        // Creates a native test handler with a 120x160 pixel debug output
-        mTestHandler = createColorCheckerTest(120, 160);
-    }
-
-    @Override
-    public synchronized void run(int index) {
-        Log.v(TAG, "ColorCheckerTest thread started!");
-        mAutoFocusSuccess = false;
-        mFindCheckerSuccess = false;
-        mHasRunOnce = true;
-        // Sets camera focus mode to Auto focus if it is supported.
-        if (mAutoFocusEnabled) {
-            while (!mAutoFocusSuccess) {
-                // Starts the auto focus process of the camera.
-                mTestCamera.autoFocus(mAutoFocusListener);
-
-                // Locks thread until the camera finishes taking picture.
-                synchronized (mProcessingImage) {
-                    try{
-                        Log.v(TAG, "Start waiting for Image");
-                        mProcessingImage.wait();
-                    } catch (InterruptedException e) {
-                        Log.v(TAG, "Callback wait fails!");
-                    }
-                }
-            }
-        } else {
-            mTestCamera.takePicture(null, null, null, mTestJpegListener);
-            synchronized (mProcessingImage) {
-                try{
-                    Log.v(TAG, "Start waiting for Image");
-                    mProcessingImage.wait();
-                } catch (InterruptedException e) {
-                    Log.v(TAG, "Callback wait fails!");
-                }
-            }
-        }
-
-        // Launches the native method to find the color checker in the image.
-        mFindCheckerSuccess = processColorCheckerTest(mTestHandler);
-        // Displays the debug output from the native test handler instance.
-        displayHandlerDebugOutput(mTestHandler);
-
-        Log.v(TAG, "Callback has returned!");
-    }
-
-    private Camera.AutoFocusCallback mAutoFocusListener = new Camera.AutoFocusCallback() {
-        public void onAutoFocus(boolean mSuccess, Camera mCamera) {
-            if (mSuccess) {
-                mAutoFocusSuccess = true;
-                Log.v(TAG, "Autofocus success!");
-                mCamera.takePicture(null, null, null, mTestJpegListener);
-            } else {
-                try{
-                    Log.v(TAG, "Autofocus failed. Please adjust!");
-                    Thread.sleep(4000);
-                    Log.v(TAG, "END Waiting");
-                } catch (InterruptedException e){}
-
-                synchronized (mProcessingImage) {
-                    mProcessingImage.notifyAll();
-                }
-            }
-        }
-    };
-
-    private Camera.PictureCallback mTestJpegListener = new Camera.PictureCallback() {
-        public void onPictureTaken(byte[] data, Camera mCamera) {
-            Log.v(TAG, "Shutter pressed down!");
-
-            // Changes the focus mode to fixed to avoid focus shift after
-            // auto focus is successful.
-            //Camera.Parameters params = mCamera.getParameters();
-            //params.setFocusMode(params.FOCUS_MODE_FIXED);
-            //mCamera.setParameters(params);
-
-            // Decodes the camera data to Bitmap and creates a native image
-            // class with the Bitmap.
-            Bitmap inputImage;
-            inputImage = BitmapFactory.decodeByteArray(data, 0, data.length);
-            long bufferAddress = findNative(inputImage);
-            Log.v(TAG, "findNative method finishes");
-
-            // Cleans up the Bitmap memory space.
-            inputImage.recycle();
-            data = null;
-            inputImage = null;
-            System.gc();
-
-            // Constructs a test handler class to handle the image.
-            createColorCheckerClass(bufferAddress, mTestHandler);
-
-            mCamera.startPreview();
-
-            // Notifies the thread lock the image capture is done.
-            synchronized (mProcessingImage) {
-                mProcessingImage.notifyAll();
-            }
-        }
-    };
-
-    /**
-     * Overrides the base class method and use the memory addresses of the
-     * checker centers and radius computed by the native test handler class
-     * to update the values stored in the base class.
-     *
-     * @return <code>true</code> indicating a memory address upload is needed.
-     */
-    @Override
-    public boolean copyCheckerAddress() {
-        if (mFindCheckerSuccess) {
-            setCheckerAddress(getColorCheckerCenterAdd(mTestHandler),
-                              getColorCheckerRadiusAdd(mTestHandler));
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    @Override
-    public void cleanUp() {
-        cleanUpHandler(mTestHandler);
-    }
-
-    @Override
-    public String getTestName() {
-        return "Color Checker test: \n";
-    }
-
-    @Override
-    public String getTestName(int index) {
-        return "Find color checker";
-    }
-
-    @Override
-    public int getResult(int index) {
-        if (mFindCheckerSuccess) {
-            return CameraTests.CAMERA_TEST_SUCCESS;
-        } else {
-            if (mHasRunOnce) {
-                return CameraTests.CAMERA_TEST_FAILURE;
-            } else {
-                return CameraTests.CAMERA_TEST_NOT_RUN;
-            }
-        }
-    }
-
-    @Override
-    public int getNumTests() {
-        return 1;
-    }
-
-    /**
-     * Gets the memory address of the vector storing the color checker centers
-     * from the native test handler instance.
-     *
-     * @param handlerAddress the memory address of the native test handler
-     * instance
-     *
-     * @return memory address of the native vector storing the color checker
-     * centers' coordinates
-     */
-    private native long getColorCheckerRadiusAdd(long handlerAddress);
-
-    /**
-     * Gets the memory address of the vector storing the color checker radius
-     * from the native test handler instance.
-     *
-     * @param handlerAddress the memory address of the native test handler
-     * instance.
-     *
-     * @return memory address of the native vector storing the color checker
-     * centers' coordinates
-     */
-    private native long getColorCheckerCenterAdd(long handlerAddress);
-
-    /**
-     * Creates a native color checker test handler instance.
-     *
-     * @param outputWidth the desired width for the debug output
-     * @param outputHeight the desired height of the debug output
-     *
-     * @return memory address of the native test handler instance
-     */
-    private native long createColorCheckerTest(int outputWidth, int outputHeight);
-
-    /**
-     * Loads a native image class instances and extracts data from it to add
-     * to the test handler.
-     *
-     * @param bufferAddress the memory address of the image class instance
-     * @param handlerAddress the memory address of the test handler instance
-     */
-    private native void createColorCheckerClass(long bufferAddress, long handlerAddress);
-
-    /**
-     * Processes the data in the native test handler instance. Computes test
-     * results with all the data and construct a debug image or debug text
-     * outputs.
-     *
-     * @param handlerAddress the memory address of the test handler instance
-     */
-    private native boolean processColorCheckerTest(long handlerAddress);
-
-    static {
-        System.loadLibrary("cameraanalyzer");
-    }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ExposureCompensationTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ExposureCompensationTest.java
deleted file mode 100644
index 9a8d9f0..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ExposureCompensationTest.java
+++ /dev/null
@@ -1,215 +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 com.android.cts.verifier.camera.analyzer;
-
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.ImageFormat;
-import android.hardware.Camera;
-import android.util.Log;
-import android.widget.ImageView;
-
-import java.io.FileOutputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.Random;
-
-public class ExposureCompensationTest extends CameraTests {
-
-    private static final String TAG = "ExposureCompensationTest";
-
-    /** Records the current exposure level. */
-    private float mExposureLevel;
-    /** Lock for the camera object.*/
-    private final Object mProcessingImage = new Object();
-    /** Lock for the camera's auto focusing task.*/
-    private final Object mAutoFocusing = new Object();
-    /** Memory address of the native test handler.*/
-    private long mTestHandler;
-    /** Test results. */
-    private int[] mTestResults;
-    /** Number of sub-tests. */
-    private int mNumTests;
-    /** Camera Parameters. */
-    private Camera.Parameters mParams;
-    /** Debug results in text. */
-    private String mDebugText;
-
-    private static ExposureCompensationTest singletonTest = null;
-
-    private ExposureCompensationTest(){
-        super();
-    }
-
-    /** Prepares the camera and the related parameters for the test.*/
-    public void updateCamera() {
-        mParams = mTestCamera.getParameters();
-        Log.v(TAG, String.format("Exposure level is from %d to %d",
-                                 mParams.getMinExposureCompensation(),
-                                 mParams.getMaxExposureCompensation()));
-        mNumTests = (int) ((float) (mParams.getMaxExposureCompensation() -
-                                    mParams.getMinExposureCompensation())
-                            * mParams.getExposureCompensationStep());
-        mTestResults = new int[mNumTests + 1];
-        for (int i = 0; i < mNumTests + 1; ++i) {
-            mTestResults[i] = CameraTests.CAMERA_TEST_NOT_RUN;
-        }
-    }
-
-    public static synchronized ExposureCompensationTest getSingletonTest() {
-        if (singletonTest == null) {
-            Log.v(TAG, "Creating a new ExposureCompensationTest instance");
-            singletonTest = new ExposureCompensationTest();
-            singletonTest.initializeTest();
-        }
-        return singletonTest;
-    }
-
-    private void initializeTest() {
-        mDebugText = new String();
-        // Creates a native test handler with a 120x160 pixel debug output
-        mTestHandler = createExposureCompensationTest(200, 280);
-    }
-
-    @Override
-    public synchronized void run(int index){
-        Log.v(TAG, "ExposureCompensationTest thread started!");
-
-        int testRangeMin, testRangeMax;
-        if (index == 0) {
-            testRangeMin = mParams.getMinExposureCompensation();
-            testRangeMax = mParams.getMaxExposureCompensation();
-        } else {
-            testRangeMin = (int) ((float)(index - 1) / mParams.getExposureCompensationStep())
-                    + mParams.getMinExposureCompensation();
-            testRangeMax = (int) ((float)(index) / mParams.getExposureCompensationStep())
-                    + mParams.getMinExposureCompensation();
-        }
-
-        /** Checks for each exposure compensation setting within the test range.*/
-        for (int i = testRangeMin;
-                i <= testRangeMax; i += 1){
-            mExposureLevel = i * mParams.getExposureCompensationStep();
-            Log.v(TAG, String.format("Current exposure level is %d", i));
-            int mCameraExposure;
-
-            do{
-                mParams.setExposureCompensation(i);
-                mTestCamera.setParameters(mParams);
-
-                try{
-                    Log.v(TAG, "Waiting");
-                    Thread.sleep(4000);
-                    Log.v(TAG, "END Waiting");
-                } catch (InterruptedException e){
-                    //TODO: error handling.
-                }
-
-                mParams = mTestCamera.getParameters();
-                mCameraExposure = mParams.getExposureCompensation();
-                Log.v(TAG, String.format("Camera exposure level is %d", mCameraExposure));
-            } while (mCameraExposure != i);
-
-            mTestCamera.takePicture(null, null, null, mTestJpegListener);
-
-            synchronized (mProcessingImage) {
-                try{
-                    Log.v(TAG, "Start waiting for Image");
-                    mProcessingImage.wait();
-                } catch (InterruptedException e){
-                    Log.v(TAG, "Callback wait fails!");
-                }
-            }
-        }
-
-        mDebugText = processExposureCompensationTest(mTestHandler);
-        displayHandlerDebugOutput(mTestHandler);
-
-        Log.v(TAG, "Callback has returned!");
-        mParams.setExposureCompensation(0);
-        mTestCamera.setParameters(mParams);
-    }
-
-    private Camera.PictureCallback mTestJpegListener = new Camera.PictureCallback() {
-        public void onPictureTaken(byte[] data, Camera mCamera) {
-            Log.v(TAG, "Shutter pressed down!");
-            Log.v(TAG, String.format("Current exposure is %f", mExposureLevel));
-
-            Bitmap inputImage;
-
-            inputImage = BitmapFactory.decodeByteArray(data, 0, data.length);
-            long bufferAddress = findNative(inputImage);
-            Log.v(TAG, "findNative method finishes");
-
-            inputImage.recycle();
-            data = null;
-            inputImage = null;
-            System.gc();
-
-            createExposureCompensationClass(bufferAddress, mTestHandler,
-                                            getCheckerCenter(), getCheckerRadius(),
-                                            mExposureLevel);
-            mCamera.startPreview();
-
-            synchronized (mProcessingImage) {
-                mProcessingImage.notifyAll();
-            }
-        }
-    };
-
-    @Override
-    public String getTestName(int index) {
-        switch (index) {
-            case 0:
-                return "EC All Range";
-            default:
-                return String.format("EC %d -> %d", (index - mNumTests / 2 - 1) * 10,
-                                     (index - mNumTests / 2) * 10);
-        }
-    }
-
-    @Override
-    public int getResult(int index) {
-        return mTestResults[index];
-    }
-
-    @Override
-    public int getNumTests() {
-        return mNumTests + 1;
-    }
-
-    @Override
-    public String getTestName() {
-        return "Exposure Compensation Test: \n";
-    }
-
-    @Override
-    public String getDebugText() {
-        return mDebugText;
-    }
-
-    private native long createExposureCompensationTest(int outputHeight, int outputWidth);
-
-    private native void createExposureCompensationClass(long bufferAddress, long handlerAddress,
-            long checkerCenterAddress, long checkerAadiusAddress, float mExposureLevel);
-
-    private native String processExposureCompensationTest(long handlerAddress);
-
-    static {
-        System.loadLibrary("cameraanalyzer");
-    }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/MeteringTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/MeteringTest.java
deleted file mode 100644
index 9ff559f..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/MeteringTest.java
+++ /dev/null
@@ -1,685 +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 com.android.cts.verifier.camera.analyzer;
-
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.ImageFormat;
-import android.graphics.Rect;
-import android.hardware.Camera;
-import android.hardware.Camera.Area;
-import android.util.Log;
-import android.widget.ImageView;
-
-import java.io.FileOutputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-
-/**
- * Implements a test to verify whether the camera metering system works as
- * described in the API.
- *
- * The test consists two sub-categories. The first one has tests with only
- * one metering area defined. The second one has tests with two metering areas
- * defined. For each single sub-test, we use a random number generator to
- * decide where to put some of the metering areas to and how much weight should
- * be assigned to each area. For different tests, we use different ways to
- * define other metering areas and their weight, in order to cover all possible
- * fail cases. The metering areas are contrained to the grey squares in the
- * bottom of the color checker.
- */
-public class MeteringTest extends CameraTests {
-
-    private static final String TAG = "MeteringTest";
-
-    /** A long wait.*/
-    private static final int LONG_SLEEP = 4000;
-    /** Debug result in text. */
-    private String mDebugText;
-    /** Thread lock. */
-    private final Object mProcessingImage = new Object();
-    /** Memory address of the native test handler. */
-    private long mTestHandler;
-    /** The maximum number of metering area the device supports. */
-    private int mMaxNumMeteringArea;
-    /** The metering areas. */
-    private List<Camera.Area> mGreyAreas;
-    /** The coordinates of the grey squares on the color checker. */
-    private int[] mGreyCoordinates = new int[24];
-    /** Random number generator. */
-    private final Random mRandomGenerator = new Random();
-    /** Reference comparison result for tests. */
-    private ArrayList<Boolean>  mReferenceCompareResults;
-    /** Number of tests in the same instance. */
-    private int mTestCount;
-    /** Reference test logs. */
-    private ArrayList<String> mReferenceLogs;
-    /** Test result to show. */
-    private int[] mTestResults;
-    /** Number of tests. */
-    private int mNumTests;
-    /** Camera Parameters. */
-    private Camera.Parameters mParams;
-    /** Singleton test instance. */
-    private static MeteringTest singletonTest = null;
-
-    /** Constructs a <code>MeteringTest</code> instance with the given
-     * camera pointer.
-     */
-    private MeteringTest() {
-        super();
-    }
-
-    public void updateCamera() {
-        // Looks up how many metering area the device supports.
-        mParams = mTestCamera.getParameters();
-        mMaxNumMeteringArea = mParams.getMaxNumMeteringAreas();
-        Log.v(TAG, String.format("Maximum number if metering area is %d", mMaxNumMeteringArea));
-        if (mMaxNumMeteringArea == 0) {
-            mDebugText = "Custom Metering not supported!";
-            Log.v(TAG, "Custom Metering not supported");
-        }
-    }
-
-    public static synchronized MeteringTest getSingletonTest() {
-        if (singletonTest == null) {
-            Log.v(TAG, "Creating a new MeteringTest instance");
-            singletonTest = new MeteringTest();
-            singletonTest.initializeTest();
-        }
-        return singletonTest;
-    }
-
-    private void initializeTest() {
-        // Creates a native metering test handler.
-        mTestHandler = createMeteringTest();
-        mDebugText = new String();
-        mReferenceCompareResults = new ArrayList<Boolean>();
-        mReferenceLogs = new ArrayList<String>();
-        mNumTests = 3;
-        mTestResults = new int[mNumTests];
-        for (int i = 0; i < mNumTests; ++i) {
-            mTestResults[i] = CameraTests.CAMERA_TEST_NOT_RUN;
-        }
-    }
-
-    /**
-     * Runs the metering test instance.
-     */
-    @Override
-    public synchronized void run(int index) {
-        if (index == 0) {
-            run(1);
-            run(2);
-            return;
-        }
-        Log.v(TAG, "MeteringTest thread started!");
-
-        // Finds the coordinates of the grey squares on the color checker.
-        // The coordinate system has (-1000, -1000) on the upper left corner.
-        // And (1000, 1000) on the bottom right corner.
-        findGreyCoordinates(mGreyCoordinates, getCheckerCenter(), getCheckerRadius());
-
-        if (mMaxNumMeteringArea > 0) {
-            mTestCount = 0;
-            // Runs the metering tests category by category.
-            switch (index) {
-                case 1:
-                    runOneAreaTest();
-                    break;
-                case 2:
-                    if (mMaxNumMeteringArea > 1) {
-                        runTwoAreasTest();
-                    }
-                    break;
-                default:
-                    break;
-            }
-        }
-
-        mParams = mTestCamera.getParameters();
-        mParams.setMeteringAreas(null);
-        mTestCamera.setParameters(mParams);
-
-        boolean[] testCompareResults = new boolean[2 * mTestCount];
-
-        // Processes the image data taken so far and stores the test results.
-        processMeteringTest(mTestHandler, testCompareResults);
-        // Prepares debug output based on the test results.
-        prepareDebugText(testCompareResults, index);
-
-        mReferenceCompareResults.clear();
-        mReferenceLogs.clear();
-    }
-
-    /**
-     * Prepares the test results in HTML text string to show in the UI.
-     *
-     * If the test result is the same as the reference result, the text will be
-     * shown in green. Otherwise it would be shown as red.
-     *
-     * @param testCompareResults the array storing the comparison results from
-     * the data taken by the camera so far.
-     */
-    private void prepareDebugText(boolean[] testCompareResults, int index) {
-        mDebugText = "";
-        boolean groupTestPassed = true;
-        for (int i = 0; i < mTestCount; ++i) {
-              String testLog;
-              boolean testPassed = true;
-              testLog = mReferenceLogs.get(i);
-              mDebugText += (testLog + "<br/>");
-
-              if (testCompareResults[i * 2] == mReferenceCompareResults.get(i * 2)) {
-                  mDebugText += String.format(
-                      "Picture 1 equivalent to Picture 2 is %b \n",
-                      testCompareResults[i * 2]);
-              } else {
-                  mDebugText += String.format(
-                      "Picture 1 equivalent to Picture 2 is %b \n",
-                      testCompareResults[i * 2]);
-                  testPassed = false;
-              }
-
-              if (testCompareResults[i * 2 + 1] == mReferenceCompareResults.get(i * 2 + 1)) {
-                  mDebugText += String.format(
-                      "Picture 1 darker than Picture 2 is %b \n",
-                      testCompareResults[i * 2 + 1]);
-              } else {
-                  mDebugText += String.format(
-                      "Picture 1 darker than Picture 2 is %b \n",
-                      testCompareResults[i * 2 + 1]);
-                  testPassed = false;
-              }
-
-              if (testPassed) {
-                  mDebugText += "Test passed! \n";
-              } else {
-                  mDebugText += "Test failed! \n";
-                  groupTestPassed = false;
-              }
-              Log.v(TAG, String.format("%s", mDebugText));
-         }
-
-        if (groupTestPassed) {
-            mTestResults[index] = CameraTests.CAMERA_TEST_SUCCESS;
-        } else {
-            mTestResults[index] = CameraTests.CAMERA_TEST_FAILURE;
-        }
-
-    }
-
-    /**
-     * Runs tests to check whether the metering functionalities work properly
-     * when one metering area is added.
-     */
-    private void runOneAreaTest() {
-        int weight1;
-        int weight2;
-        int square1;
-        int square2;
-
-        Log.v(TAG, "Running one area Test");
-
-        // Test case 1: Two images have the same metering area. Image 1 has
-        // a diffent weight than Image 2. The result images should be
-        // identical.
-        // Tests whether weight normalization works.
-        square1 = mRandomGenerator.nextInt(6);
-        weight1 = mRandomGenerator.nextInt(100) + 1;
-        runSingleTest(square1, square1, weight1);
-
-        square2 = square1;
-        weight2 = mRandomGenerator.nextInt(100) + 901;
-        runSingleTest(square2, square2, weight2);
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        Log.v(TAG, String.format("Running test for %d square with weights %d, %d",
-                                 square1, weight1, weight2));
-        mReferenceLogs.add(String.format(
-            "Running test for %d 1x1 square with weights %d, %d", square1, weight1, weight2));
-        ++mTestCount;
-
-        // Test case 2: Two images have different metering areas. Image 1 has
-        // one of the grey squares as its metering area. Image 2 has a darker
-        // grey square as its metering area. The weights for both images are
-        // the same. Image 1 is expected to be darker than Image 2.
-        // Tests whether metering on uni-brightness patches work.
-        square1 = mRandomGenerator.nextInt(5);
-        weight1 = mRandomGenerator.nextInt(1000) + 1;
-        runSingleTest(square1, square1, weight1);
-
-        square2 = mRandomGenerator.nextInt(6 - square1 - 1) + square1 + 1;
-        weight2 = weight1;
-        runSingleTest(square2, square2, weight2);
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add(String.format(
-            "Running test for %d, %d 1x1 square with weight %d", square1, square2, weight1));
-        ++mTestCount;
-
-        // Test case 3: Two images have different metering areas. Image one has
-        // one of the grey squares as its metering area. Image 2 has a
-        // rectangle which contains Image 1's metering area and the neighboring
-        // darker grey square. The weights for both tests are the same. Image 1
-        // is expected to be darker than Image 2.
-        // Tests whether metering on patches with different brightness works.
-        square1 = mRandomGenerator.nextInt(5);
-        weight1 = mRandomGenerator.nextInt(1000) + 1;
-        runSingleTest(square1, square1, weight1);
-
-        square2 = square1;
-        weight2 = weight1;
-        runSingleTest(square2, square2 + 1, weight2);
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add(String.format(
-            "Running test for %d 1x1, 1x2 square with weight %d", square1, weight1));
-        ++mTestCount;
-
-        // Test case 4: Two images have different metering areas. Image one has
-        // two neighboring grey squares as its metering area. Image 2 has two
-        // darker neighboring grey squares as its metering area. Weights are
-        // the same for both images. Image 1 is expected to be darker than
-        // Image 2.
-        // Tests whether metering on two mixed-brightness patches work.
-        square1 = mRandomGenerator.nextInt(4);
-        weight1 = mRandomGenerator.nextInt(1000) + 1;
-        runSingleTest(square1, square1 + 1, weight1);
-
-        square2 = mRandomGenerator.nextInt(5 - square1 - 1) + square1 + 1;
-        weight2 = weight1;
-        runSingleTest(square2, square2 + 1, weight2);
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add(String.format(
-            "Running test for %d, %d 1x2 square with weight %d", square1, square2, weight1));
-        ++mTestCount;
-
-        // Test case 5: Two images have different metering areas. Image one has
-        // three neighboring grey squares as its metering area. Image 2 has
-        // three darker neighboring grey squares as its metering area. Weights
-        // are the same. Image 1 is expected to be darker than Image 2.
-        // Tests whether metering on three mixed-brightness patches work.
-        square1 = mRandomGenerator.nextInt(3);
-        weight1 = mRandomGenerator.nextInt(1000) + 1;
-        runSingleTest(square1, square1 + 2, weight1);
-
-        square2 = mRandomGenerator.nextInt(4 - square1 - 1) + square1 + 1;
-        weight2 = weight1;
-        runSingleTest(square2, square2 + 2, weight2);
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add(String.format(
-            "Running test for %d, %d 1x3 square with weight %d", square1, square2, weight1));
-        ++mTestCount;
-    }
-
-    /**
-     * Runs metering tests to verify the functionalities when there are two
-     * areas set as the metering area.
-     */
-    private void runTwoAreasTest() {
-        int[] weight1 = new int[2];
-        int[] weight2 = new int[2];
-        int[] square1Start = new int[2];
-        int[] square2Start = new int[2];
-        int[] square1End = new int[2];
-        int[] square2End = new int[2];
-
-        Log.v(TAG, "Running two-area Test");
-
-        // Test case 1: Image 1 has two metering areas. They are two adjacent
-        // grey squares (each set as a metering area). The two areas have the
-        // same weight. Image 2 has one metering area, which is the combination
-        // of Image 1's two metering areas as a rectangle. The weight is the
-        // same as that of Image 1's individual area. Image 1 is expected to
-        // be equivalent to Image 2.
-        // Tests whether having seperating a metering area into two will yield
-        // the same result.
-        square1Start[0] = mRandomGenerator.nextInt(5);
-        square1End[0] = square1Start[0];
-        weight1[0] = mRandomGenerator.nextInt(1000) + 1;
-        square1Start[1] = square1Start[0] + 1;
-        square1End[1] = square1Start[1];
-        weight1[1] = weight1[0];
-        runMultipleAreaTest(square1Start, square1End, weight1);
-
-        square2Start[0] = square1Start[0];
-        weight2[0] = weight1[0];
-        runSingleTest(square2Start[0], square2Start[0] + 1, weight2[0]);
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add(String.format(
-            "Running test for %d, %d 1x1 square with weight %d",
-            square1Start[0], square1Start[1], weight1[0]));
-        ++mTestCount;
-
-        // Test case 2: Image 1 has two metering areas. They are two random
-        // grey squareson the color checker. The brighter square has a larger
-        // weight than the darker square. Image 2 has the same two metering
-        // areas as Image 1. The weights for both are equal to the weight of
-        // the darker square in Image 1, which is smaller than the weight of
-        // the brighter square in Image 1. Image 1 is expected to be darker
-        // than Image 2.
-        // Tests whether giving one of the two metering areas a different
-        // weight would change the image in the correct way.
-        square1Start[0] = mRandomGenerator.nextInt(4);
-        square1End[0] = square1Start[0];
-        weight1[0] = mRandomGenerator.nextInt(100) + 901;
-        square1Start[1] = mRandomGenerator.nextInt(5 - square1Start[0] - 1) + square1Start[0] + 1;
-        square1End[1] = square1Start[1];
-        weight1[1] = mRandomGenerator.nextInt(100) + 1;
-        runMultipleAreaTest(square1Start, square1End, weight1);
-
-        square2Start[0] = square1Start[0];
-        square2End[0] = square2Start[0];
-        weight2[0] = weight1[1];
-        square2Start[1] = square1Start[1];
-        square2End[1] = square1End[1];
-        weight2[1] = weight2[0];
-        runMultipleAreaTest(square2Start, square2End, weight2);
-        mReferenceCompareResults.add(false);
-        mReferenceCompareResults.add(true);
-        mReferenceLogs.add(String.format(
-            "Running test for %d, %d 1x1 square with weight %d, %d",
-            square1Start[0], square1Start[1], weight1[0], weight2[1]));
-        ++mTestCount;
-
-        // Test case 3: Image 1 has two metering areas. Both are set to the
-        // same random grey square on the color checker. The weight for both
-        // are the same. Image 2 has one meterig area, which is the same as
-        // Image 1's chosen grey square. The weight for it is the same as
-        // Image 1's weight for one metering area. Image 1 is expected to be
-        // equivalent to Image 2.
-        // Tests whether defining overlapping metering area works.
-        square1Start[0] = mRandomGenerator.nextInt(6);
-        square1End[0] = square1Start[0];
-        weight1[0] = mRandomGenerator.nextInt(1000) + 1;
-        square1Start[1] = square1Start[0];
-        square1End[1] = square1Start[1];
-        weight1[1] = weight1[0];
-        runMultipleAreaTest(square1Start, square1End, weight1);
-
-        square2Start[0] = square1Start[0];
-        square2End[0] = square2Start[0];
-        weight2[0] = weight1[0];
-        runSingleTest(square2Start[0], square2End[0], weight2[0]);
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add(String.format(
-            "Running test for %d 1x1 square with weight %d,", square1Start[0], weight1[0]));
-        ++mTestCount;
-
-        // Test case 4: Image 1 has two metering areas. The first one is a
-        // grey square on the color checker. The second one is a rectangle
-        // containing the first metering area's grey square and its neighboring
-        // darker square. The weights for both metering area are the same.
-        // Image 2 has two metering areas. The first one is the same grey
-        // square as Image 1's first metering area. The second one is the
-        // neighboring darker grey square. The weight for the brighter square
-        // is double the weight of Image 1's weights for each metering area.
-        // The weight for the Image 2's darker grey square is the same as
-        // Image 1's weight for each of its metering areas. Image 1 is expected
-        // to be equivalent to Image 2.
-        // Tests whether the weights for overlapping metering area add up.
-        square1Start[0] = mRandomGenerator.nextInt(2);
-        square1End[0] = square1Start[0];
-        weight1[0] = mRandomGenerator.nextInt(500) + 1;
-        square1Start[1] = square1Start[0];
-        square1End[1] = square1Start[1] + 1;
-        weight1[1] = weight1[0];
-        runMultipleAreaTest(square1Start, square1End, weight1);
-
-        square2Start[0] = square1Start[0];
-        square2End[0] = square1End[0];
-        weight2[0] = weight1[0] * 2;
-        square2Start[1] = square2Start[0] + 1;
-        square2End[1] = square2Start[1];
-        weight2[1] = weight1[1];
-        runMultipleAreaTest(square2Start, square2End, weight2);
-        mReferenceCompareResults.add(true);
-        mReferenceCompareResults.add(false);
-        mReferenceLogs.add(String.format(
-            "Running test for %d 1x2 1x1 and 1x2 square with weight %d,",
-            square1Start[0], weight1[0]));
-        ++mTestCount;
-    }
-
-    /**
-     * Runs the metering test when multiple metering areas are defined.
-     *
-     * @param startIndex the array storing the index of the grey square where
-     * one metering area starts
-     * @param endIndex the array storing the index of the grey square where one
-     * metering area ends.
-     * @param weight the array storing the weight for each metering area.
-     */
-    private void runMultipleAreaTest(int[] startIndex, int[] endIndex, int[] weight) {
-        int numAreas = startIndex.length;
-        mParams = mTestCamera.getParameters();
-        List<Camera.Area> meteringAreas = new ArrayList<Camera.Area>();
-
-        for (int i = 0; i < numAreas; ++i) {
-            meteringAreas.add(makeArea(startIndex[i], endIndex[i], weight[i]));
-            Log.v(TAG, String.format("Add metering area for %d, %d, %d",
-                                     startIndex[i], endIndex[i], weight[i]));
-        }
-        mParams.setMeteringAreas(meteringAreas);
-        mTestCamera.setParameters(mParams);
-        takePicture();
-    }
-
-    /**
-     * Runs the metering test when one metering area is defined.
-     *
-     * @param startIndex the index of the grey square where the metering area
-     * starts
-     * @param endIndex the index of the grey square where the metering area
-     * ends.
-     * @param weight the weight for the metering area.
-     */
-    private void runSingleTest(int startIndex, int endIndex, int weight) {
-        mParams = mTestCamera.getParameters();
-        List<Camera.Area> meteringAreas = new ArrayList<Camera.Area>();
-
-        Log.v(TAG, String.format("Single test for %d, %d, %d", startIndex, endIndex, weight));
-        meteringAreas.add(makeArea(startIndex, endIndex, weight));
-        mParams.setMeteringAreas(meteringAreas);
-        mTestCamera.setParameters(mParams);
-        takePicture();
-    }
-
-    /**
-     * Takes picture with the camera instance linked to this test class.
-     */
-    private void takePicture() {
-        // Waits for the metering to be stable
-        try{
-            Log.v(TAG, "Waiting for metering");
-            Thread.sleep(LONG_SLEEP);
-            Log.v(TAG, "END Waiting");
-        } catch (InterruptedException e) {}
-
-        mTestCamera.takePicture(null, null, null, mTestJpegListener);
-
-        // Locks thread until picture is taken and ready for processing.
-        synchronized (mProcessingImage) {
-            try{
-                Log.v(TAG, "Start waiting for Image");
-
-                mProcessingImage.wait();
-            } catch (InterruptedException e) {
-                Log.v(TAG, "Callback wait fails!");
-            }
-        }
-    }
-
-    /**
-     * Constructs a <code>Camera.Area</code> object of the metering area.
-     * Given the start and end index of one metering area, it takes the upper
-     * left corner of the starting square and the bottom right corner of the
-     * end square to construct an Area.
-     *
-     * @param startIndex the index of the grey square where the metering area
-     * starts
-     * @param endIndex the index of the grey square where the metering area
-     * ends
-     * @param weight the weight of this metering area.
-     *
-     * @return a <code>Camera.Area</code> object which represents this metering
-     * area
-     */
-    private Camera.Area makeArea(int startIndex, int endIndex, int weight) {
-        Rect areaRect = new Rect(mGreyCoordinates[startIndex * 4],
-                                 mGreyCoordinates[startIndex * 4 + 1],
-                                 mGreyCoordinates[endIndex * 4 + 2],
-                                 mGreyCoordinates[endIndex * 4 + 3]);
-        Camera.Area area = new Camera.Area(areaRect, weight);
-
-        return area;
-    }
-
-    @Override
-    public String getDebugText() {
-        return mDebugText;
-    }
-
-    @Override
-    public String getResultText() {
-        return mDebugText;
-    }
-
-    @Override
-    public String getTestName() {
-        return "Metering Test: \n";
-    }
-
-    @Override
-    public String getTestName(int index) {
-        switch (index) {
-            case 0:
-                return "Run all tests";
-            case 1:
-                return "One metering area tests";
-            case 2:
-                return "Multiple metering areas tests";
-            default:
-                return "";
-        }
-    }
-
-    @Override
-    public int getResult(int index) {
-        return mTestResults[index];
-    }
-
-    @Override
-    public int getNumTests() {
-        return mNumTests;
-    }
-
-    private Camera.PictureCallback mTestJpegListener = new Camera.PictureCallback() {
-        public void onPictureTaken(byte[] data, Camera mCamera) {
-            Log.v(TAG, "Shutter pressed down!");
-            Bitmap inputImage;
-            try {
-                FileOutputStream outStream = new FileOutputStream(
-                    String.format("/sdcard/metering%d.jpg", System.currentTimeMillis()));
-                outStream.write(data);
-                outStream.close();
-            } catch (FileNotFoundException e) {
-            } catch (IOException e) {}
-
-            // Decodes the input data of the camera.
-            inputImage = BitmapFactory.decodeByteArray(data, 0, data.length);
-
-            // Records the memory address of the native image class instance.
-            long bufferAddress = findNative(inputImage);
-            Log.v(TAG, "findNative method finishes");
-
-            // Cleans up the memory taken by the bitmap.
-            inputImage.recycle();
-            data = null;
-            inputImage = null;
-            System.gc();
-
-            // Add the image data to the native test handler.
-            createMeteringClass(bufferAddress, mTestHandler,
-                                getCheckerCenter(), getCheckerRadius());
-            mCamera.startPreview();
-
-            // Releases thread lock after the image is processed.
-            synchronized (mProcessingImage) {
-                mProcessingImage.notifyAll();
-            }
-        }
-    };
-
-    /**
-     * Finds the coordinates of the grey squares on the color checker.
-     * The coordinates are computed by using the checker center and radius.
-     * The coordinates are converted to a system with (-1000, -1000) in the
-     * upper left corner and (1000, 1000) in the  bottom right corner.
-     *
-     * @param greyCoordinates the array to store the coordinates of the grey
-     * squares
-     * @param checkerCenterAddress the memory address pointing to the vector
-     * storing the color checker's centers.
-     * @param checkerRadiusAddress the memory address pointing to the vetor
-     * storing the color checker's radius.
-     */
-    private native void findGreyCoordinates(int[] greyCoordinates,
-                                            long checkerCenterAddress, long checkerRadiusAddress);
-
-    /**
-     * Creates the native metering test handler with no debug image.
-     *
-     * @return the memory address pointing to the native test handler instance
-     */
-    private native long createMeteringTest();
-
-    /**
-     * Adds the data from the native image class instance to the native test
-     * handler.
-     *
-     * @param bufferAddress the meory address of the native image class
-     * @param handlerAddress the memory address of the native test handler
-     * @param checkerCenterAddress the memory address of the checker cneters
-     * @param checkerRadiusAddress the meory address of the checker radius
-     */
-    private native void createMeteringClass(long bufferAddress, long handlerAddress,
-                                            long checkerCenterAddress,
-                                            long checkerRadiusAddress);
-
-    /**
-     * Process the data stored in the native test handler and stores the
-     * comparison results.
-     *
-     * @param handlerAddress the memory address of the native test handler
-     * @param testCompareResults the boolean array to store the test comparison
-     * results
-     */
-    private native void processMeteringTest(long handlerAddress, boolean[] testCompareResults);
-
-    static {
-        System.loadLibrary("cameraanalyzer");
-    }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/WhiteBalanceTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/WhiteBalanceTest.java
deleted file mode 100644
index a4111eb..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/WhiteBalanceTest.java
+++ /dev/null
@@ -1,398 +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 com.android.cts.verifier.camera.analyzer;
-
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.ImageFormat;
-import android.hardware.Camera;
-import android.util.Log;
-import android.widget.ImageView;
-import java.io.FileOutputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-
-import java.util.List;
-
-/**
- * Implements a test to verify whether the correlated color temperatures (CTT)
- * of the supported white balance modes are inside the range camera
- * manufacturers generally agree on.
- *
- * The test assumes that the Daylight white balance mode has a CCT of 5200K,
- * which is widely agreed in industry and academics. It then use this as a
- * benchmark and compare images taken with other white balance settings.
- * Using the pixel values of the grey squares on the color checker, the CCT
- * of other white balance modes can be computed. The reference ranges were
- * summarized with the help of online resources. For the Auto mode, the
- * reference CCT is computed as the CCT that will keep the grey squares appear
- * grey in the result image.
- */
-public class WhiteBalanceTest extends CameraTests {
-
-    private static final String TAG = "WhiteBalanceTest";
-
-    /** Current white balance mode. */
-    private String mWhiteBalance;
-    /** Array to store the reference CCT's of each mode. */
-    private int[][] mReferenceTemperature;
-    /** List of supported white balance mode on a device. */
-    private List<String> mWhiteBalanceList;
-    /** The index of the white balance mode "Auto". */
-    private int mAutoId;
-
-    /** Debug results in text. */
-    private String mDebugText;
-    /** Memory address of the native test handler instance. */
-    private long mTestHandler;
-    /** Thread lock. */
-    private final Object mProcessingImage = new Object();
-    /** Test result to show. */
-    private int[] mTestResults;
-    /** Number of test. */
-    private int mNumTests;
-    /** Camera Parameters. */
-    private Camera.Parameters mParams;
-    /** Singleton test instance. */
-    private static WhiteBalanceTest singletonTest = null;
-    /** Boolean to check whehter daylight wb has been recorded. */
-    private boolean mHasDaylight = false;
-
-    /**
-     * Constructs a <code>WhiteBalanceTest</code> instance with a given
-     * Camera pointer.
-     */
-    private WhiteBalanceTest() {
-        super();
-    }
-
-    public void updateCamera() {
-        mAutoId = 0;
-        mHasDaylight = false;
-        mParams = mTestCamera.getParameters();
-        mWhiteBalanceList = mParams.getSupportedWhiteBalance();
-        mNumTests = mWhiteBalanceList.size() + 1;
-        mTestResults = new int[mNumTests];
-        for (int i = 0; i < mNumTests; ++i) {
-            mTestResults[i] = CameraTests.CAMERA_TEST_NOT_RUN;
-        }
-
-        if (mWhiteBalanceList != null) {
-            mReferenceTemperature = new int[mWhiteBalanceList.size()][2];
-
-            // Sets the reference CCT of the supported white balance modes
-            for (int i = 0; i < mWhiteBalanceList.size(); i++) {
-                setReferenceTemperature(i, mWhiteBalanceList.get(i));
-                if (mWhiteBalanceList.get(i).equals("auto")) {
-                    mAutoId = i;
-                }
-            }
-        }
-    }
-
-    public static synchronized WhiteBalanceTest getSingletonTest() {
-        if (singletonTest == null) {
-            Log.v(TAG, "Creating a new WhiteBalanceTest instance");
-            singletonTest = new WhiteBalanceTest();
-            singletonTest.initializeTest();
-        }
-        return singletonTest;
-    }
-
-    private void initializeTest() {
-        mDebugText = new String();
-        // Creates a native white balance test handler.
-        // mTestHandler stores the memory address of this instance.
-        mTestHandler = createWhiteBalanceTest();
-    }
-
-    private void initializeWhiteBalanceTest() {
-        mWhiteBalance = "daylight";
-        takePicture(mWhiteBalance);
-        int colorTemperature = processWhiteBalanceTest(mTestHandler);
-
-        setReferenceTemperature(mAutoId, colorTemperature);
-        mHasDaylight = true;
-    }
-
-    private void takePicture(String whiteBalance) {
-        mParams.setWhiteBalance(whiteBalance);
-        mTestCamera.setParameters(mParams);
-
-        try{
-            Log.v(TAG, "Waiting for white balance to adjust");
-            Thread.sleep(4000);
-            Log.v(TAG, "END Waiting");
-        } catch (InterruptedException e) {}
-
-        mTestCamera.takePicture(null, null, null, mTestJpegListener);
-
-        // Thread locks until image capture is done
-        synchronized (mProcessingImage) {
-            try{
-                Log.v(TAG, "Start waiting for Image");
-                mProcessingImage.wait();
-            } catch (InterruptedException e) {
-                Log.v(TAG, "Callback wait fails!");
-            }
-        }
-    }
-
-    /**
-     * Runs the white balance camera test instance.
-     */
-    @Override
-    public synchronized void run(int index) {
-        Log.v(TAG, "WhiteBalanceTest thread started!");
-
-        if (!mHasDaylight) {
-            initializeWhiteBalanceTest();
-        }
-
-        if (index != 0) {
-            // Retrieves the list of supported white balance mode.
-            mParams = mTestCamera.getParameters();
-
-            int i = index - 1;
-            mWhiteBalance = mWhiteBalanceList.get(i);
-
-            Log.v(TAG, "Current white balance is " + mWhiteBalance);
-
-            takePicture(mWhiteBalance);
-
-            // Processes the white balance test data in the native code.
-            // Returns an array of CCT of each white balance modes, given the CCT
-            // of the "Daylight" mode is 5200K.
-            int colorTemperature = 0;
-
-            Log.v(TAG, "Finished taking picture, ready to process");
-            colorTemperature = processWhiteBalanceTest(mTestHandler);
-
-            // Records the index of the "Auto" white balance mode
-            if (mWhiteBalance.equals("daylight")) {
-                setReferenceTemperature(mAutoId, colorTemperature);
-                prepareDebugText(5200, index);
-                // Computes the reference CCT range of the "Auto" mode. Assuming that
-                // all grey squares on the color checker should be imaged as grey under
-                // a CCT, this CCT is used as a middle point to provide a range.
-                //setReferenceTemperature(mAutoId, colorTemperature[mWhiteBalanceList.size()]);
-            } else {
-                // Prepares the debug output.
-                prepareDebugText(colorTemperature, index);
-            }
-        } else {
-            for (int i = 0; i < mWhiteBalanceList.size(); i++) {
-                run(i + 1);
-            }
-        }
-
-        mParams.setWhiteBalance("auto");
-        mTestCamera.setParameters(mParams);
-    }
-
-    /**
-     * Prepares the debug results in HTML text. For each white balance mode,
-     * the CCT will be printed in green if it is in the reference range and
-     * red otherwise. The reference CCT range is also printed below, with
-     * green meaning the CCT range is satisfied and red otherwise.
-     *
-     * @param colorTemperature the CCT of the supported white balance modes
-     */
-    private void prepareDebugText(int colorTemperature, int index) {
-        mDebugText += String.format("CCT Ref is %d, %d, and CCT is %d",
-                                  mReferenceTemperature[index - 1][0],
-                                  mReferenceTemperature[index - 1][1],
-                                  colorTemperature);
-        Log.v(TAG, String.format("CCT Ref is %d, %d, and CCT is %d",
-                                  mReferenceTemperature[index - 1][0],
-                                  mReferenceTemperature[index - 1][1],
-                                  colorTemperature));
-        if ((colorTemperature >= mReferenceTemperature[index - 1][0]) &&
-                (colorTemperature <= mReferenceTemperature[index - 1][1])) {
-            mTestResults[index] = CameraTests.CAMERA_TEST_SUCCESS;
-        } else {
-            mTestResults[index] = CameraTests.CAMERA_TEST_FAILURE;
-        }
-
-    }
-
-    @Override
-    public String getDebugText() {
-        return mDebugText;
-    }
-
-    @Override
-    public String getResultText() {
-        return mDebugText;
-    }
-
-    @Override
-    public String getTestName() {
-        return "White Balance Test: \n";
-    }
-
-    @Override
-    public String getTestName(int index) {
-        if (index != 0){
-            return String.format("%s mode test", mWhiteBalanceList.get(index - 1));
-        } else {
-            return "Run all tests";
-        }
-    }
-
-    @Override
-    public int getResult(int index) {
-        return mTestResults[index];
-    }
-
-    @Override
-    public int getNumTests() {
-        return mNumTests;
-    }
-
-    /**
-     * Sets the reference temperatures for the white balance modes of
-     * incandescent, fluorescent, warm-fluorescent, daylight, cloudy, shade
-     * and twilight. These are the currently supported White balance mode
-     * listed on the Android camera API.
-     *
-     * The reference range are summarized based on the published settings of
-     * Canon, Nikon and the references from Wikipedia on color temperature.
-     *
-     * @param i the index of the current white balance mode
-     * @param referenceWhiteBalance the name of the white balance mode.
-     */
-    private void setReferenceTemperature(int i, String referenceWhiteBalance) {
-        if (referenceWhiteBalance.equals("incandescent")) {
-            mReferenceTemperature[i][0] = 2500;
-            mReferenceTemperature[i][1] = 3500;
-        } else if (referenceWhiteBalance.equals("fluorescent")) {
-            mReferenceTemperature[i][0] = 3000;
-            mReferenceTemperature[i][1] = 6500;
-        } else if (referenceWhiteBalance.equals("warm-fluorescent")) {
-            mReferenceTemperature[i][0] = 2500;
-            mReferenceTemperature[i][1] = 3000;
-        } else if (referenceWhiteBalance.equals("daylight")) {
-            mReferenceTemperature[i][0] = 5000;
-            mReferenceTemperature[i][1] = 5400;
-        } else if (referenceWhiteBalance.equals("cloudy-daylight")) {
-            mReferenceTemperature[i][0] = 5500;
-            mReferenceTemperature[i][1] = 7500;
-        } else if (referenceWhiteBalance.equals("shade")) {
-            mReferenceTemperature[i][0] = 6800;
-            mReferenceTemperature[i][1] = 8000;
-        } else if (referenceWhiteBalance.equals("twilight")) {
-            mReferenceTemperature[i][0] = 10000;
-            mReferenceTemperature[i][1] = 14000;
-        }
-    }
-
-    /** Sets a reference range of CCT based on a given middle point CCT.
-     * The rerence range is from -10% of the CCT value to +10%.
-     *
-     * @param i the index of the current white balance mode
-     * @param t the middle point CCT.
-     */
-    private void setReferenceTemperature(int i, int t) {
-        mReferenceTemperature[i][0] = (int)((double)t * 0.9);
-        mReferenceTemperature[i][1] = (int)((double)t * 1.1);
-    }
-
-    private Camera.PictureCallback mTestJpegListener = new Camera.PictureCallback() {
-        public void onPictureTaken(byte[] data, Camera mCamera) {
-            Log.v(TAG, "Shutter pressed down!");
-            Bitmap inputImage;
-            try {
-                FileOutputStream outStream = new FileOutputStream(
-                        String.format("/sdcard/wb%d.jpg", System.currentTimeMillis()));
-                outStream.write(data);
-                outStream.close();
-            } catch (FileNotFoundException e) {
-            } catch (IOException e) {}
-            // Decodes the camera data to Bitmap and creates a native image
-            // class with the Bitmap.
-            inputImage = BitmapFactory.decodeByteArray(data, 0, data.length);
-            long bufferAddress = findNative(inputImage);
-            Log.v(TAG, "findNative method finishes");
-
-            // Cleans up the Bitmap memory space.
-            inputImage.recycle();
-            data = null;
-            inputImage = null;
-            System.gc();
-
-            // Adds the data from the current image base class to the native
-            // white balance test handler.
-            createWhiteBalanceClass(bufferAddress, mTestHandler,
-                                    getCheckerCenter(), getCheckerRadius(), mWhiteBalance);
-
-            mCamera.startPreview();
-
-            // Notifies the thread lock that the image capture is finished
-            synchronized (mProcessingImage) {
-                mProcessingImage.notifyAll();
-            }
-        }
-    };
-
-    /**
-     * Creates a native white balance test handler.
-     *
-     * @return the memory address of the test handler
-     */
-    private native long createWhiteBalanceTest();
-
-    /**
-     * Adds the data of interest from the image class pointed by
-     * <code>bufferAddress</code> to the handler class pointed by
-     * <code>handlerAddress</code> by using the color checker coordinates.
-     * Also sets the white balance of this test.
-     *
-     * @param bufferAddress the memory address of the native image class
-     * containing the current camera captured image
-     * @param handlerAddress the memory address of the native white balance
-     * test handler instance
-     * @param checkerCenterAddress the memory address of the color checker
-     * center coordinates
-     * @param checkerRadiusAddress the memory address of the color checker
-     * radius
-     * @param whiteBalance the white balance mode used for shooting the image
-     */
-    private native void createWhiteBalanceClass(long bufferAddress, long handlerAddress,
-                                                long checkerCenterAddress,
-                                                long checkerRadiusAddress,
-                                                String whiteBalance);
-
-    /**
-     * Processes the white balance test in the native code. This is executed
-     * after the images are taken with all possible white balance modes. It
-     * uses the "Daylight" white balance mode as reference and computes the
-     * CCT of other white balance modes.
-     *
-     * @param handlerAddress the memory address of the native white balance
-     * test handler instance.
-     * @param colorTemperature the array to store the computed CCT of all white
-     * balance modes.
-     */
-    private native int processWhiteBalanceTest(long handlerAddress);
-
-    private native int getAutoTemperature(long handlerAddress);
-
-    static {
-        System.loadLibrary("cameraanalyzer");
-    }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/flashlight/CameraFlashlightActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/flashlight/CameraFlashlightActivity.java
new file mode 100644
index 0000000..4d37b3ee
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/flashlight/CameraFlashlightActivity.java
@@ -0,0 +1,275 @@
+/*
+ * Copyright 2015 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 com.android.cts.verifier.camera.flashlight;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.content.Context;
+import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.CameraCharacteristics;
+import android.os.Bundle;
+import android.os.Handler;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import java.util.HashSet;
+import java.util.HashMap;
+
+/**
+ * This test checks the flashlight functionality by turning on and off the flashlight. After it
+ * turns on or off the flashlight, it asks for user input to verify the flashlight status. The
+ * test will pass when the user input is correct for all camera devices with a flash unit.
+ */
+public class CameraFlashlightActivity extends PassFailButtons.Activity {
+
+    private static final String TAG = "CameraFlashlight";
+
+    private CameraManager mCameraManager;
+    private TestState mTestState;
+    private final HashSet<String> mPendingCameraIds = new HashSet<>();
+    private String mCurrentCameraId;
+
+    private Button mInstructionButton;
+    private Button mOnButton;
+    private Button mOffButton;
+    private TextView mInstructionTextView;
+    private final HashSet<View> mAllButtons = new HashSet<>();
+    // TestState -> enabled buttons
+    private final HashMap<TestState, HashSet<View>> mStateButtonsMap = new HashMap<>();
+
+    private enum TestState {
+        NOT_STARTED,
+        TESTING_ON,
+        WAITING_ON_CALLBACK_ON,
+        RESPONDED_ON_CORRECTLY,
+        WAITING_ON_CALLBACK_OFF,
+        TESTING_OFF,
+        RESPONDED_OFF_CORRECTLY,
+        ALL_PASSED,
+        FAILED
+    }
+
+    private final View.OnClickListener mInstructionButtonListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            switch (mTestState) {
+                case NOT_STARTED:
+                    // Start testing turning on the first camera's flashlight.
+                    // Fall through.
+                case RESPONDED_OFF_CORRECTLY:
+                    // Current camera passed. Start testing turning on next camera's flashlight.
+                    if (mPendingCameraIds.size() == 0) {
+                        // Passed
+                        mTestState = TestState.ALL_PASSED;
+                        updateButtonsAndInstructionLocked();
+                        return;
+                    }
+
+                    mCurrentCameraId = (String)mPendingCameraIds.toArray()[0];
+                    mPendingCameraIds.remove(mCurrentCameraId);
+
+                    try {
+                        mCameraManager.setTorchMode(mCurrentCameraId, true);
+                        mTestState = TestState.WAITING_ON_CALLBACK_ON;
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        mTestState = TestState.FAILED;
+                    }
+                    break;
+
+                case RESPONDED_ON_CORRECTLY:
+                    // Flashlight is on and user responded correctly.
+                    // Turning off the flashlight.
+                    try {
+                        mCameraManager.setTorchMode(mCurrentCameraId, false);
+                        mTestState = TestState.WAITING_ON_CALLBACK_OFF;
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        mTestState = TestState.FAILED;
+                    }
+                    break;
+
+                case FAILED:
+                    // The test failed, report failure.
+                    if (mCurrentCameraId != null) {
+                        try {
+                            mCameraManager.setTorchMode(mCurrentCameraId, false);
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                            Log.e(TAG, "Test failed but cannot turn off the torch");
+                        }
+                    }
+                    setTestResultAndFinish(false);
+                    break;
+
+                case ALL_PASSED:
+                    // The test passed, report pass.
+                    setTestResultAndFinish(true);
+                    break;
+            }
+
+            updateButtonsAndInstructionLocked();
+        }
+    };
+
+    private final View.OnClickListener mOnButtonListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            // Check if user responded correctly.
+            if (mTestState == TestState.TESTING_ON) {
+                mTestState = TestState.RESPONDED_ON_CORRECTLY;
+            } else {
+                mTestState = TestState.FAILED;
+            }
+            updateButtonsAndInstructionLocked();
+        }
+    };
+
+    private final View.OnClickListener mOffButtonListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            // Check if user responded correctly.
+            if (mTestState == TestState.TESTING_OFF) {
+                mTestState = TestState.RESPONDED_OFF_CORRECTLY;
+            } else {
+                mTestState = TestState.FAILED;
+            }
+            updateButtonsAndInstructionLocked();
+        }
+    };
+
+    private final CameraManager.TorchCallback mTorchCallback = new CameraManager.TorchCallback() {
+        @Override
+        public void onTorchModeChanged(String cameraId, boolean enabled) {
+            if (!cameraId.equals(mCurrentCameraId)) {
+                return;
+            }
+
+            // Move to next state after receiving the expected callback.
+            if (mTestState == TestState.WAITING_ON_CALLBACK_ON && enabled) {
+                mTestState = TestState.TESTING_ON;
+            } else if (mTestState == TestState.WAITING_ON_CALLBACK_OFF && !enabled) {
+                mTestState = TestState.TESTING_OFF;
+            }
+            updateButtonsAndInstructionLocked();
+        }
+    };
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // initialize state -> buttons map
+        for (TestState state : TestState.values()) {
+            mStateButtonsMap.put(state, new HashSet<View>());
+        }
+
+        mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
+
+        try {
+            String[] cameraIds = mCameraManager.getCameraIdList();
+            for (String id : cameraIds) {
+                CameraCharacteristics info = mCameraManager.getCameraCharacteristics(id);
+                if (info.get(CameraCharacteristics.FLASH_INFO_AVAILABLE).booleanValue() ==
+                        true) {
+                    mPendingCameraIds.add(id);
+                }
+            }
+            mCameraManager.registerTorchCallback(mTorchCallback, new Handler());
+        } catch (Exception e) {
+            e.printStackTrace();
+            mTestState = TestState.FAILED;
+            updateButtonsAndInstructionLocked();
+            return;
+        }
+
+        // Setup the UI.
+        setContentView(R.layout.camera_flashlight);
+        setPassFailButtonClickListeners();
+        setInfoResources(R.string.camera_flashlight_test, R.string.camera_flashlight_info, -1);
+
+        mInstructionTextView = (TextView) findViewById(R.id.flash_instruction_text);
+
+        // Get the buttons and attach the listener.
+        mInstructionButton = (Button) findViewById(R.id.flash_instruction_button);
+        mInstructionButton.setOnClickListener(mInstructionButtonListener);
+        mStateButtonsMap.get(TestState.NOT_STARTED).add(mInstructionButton);
+        mStateButtonsMap.get(TestState.RESPONDED_ON_CORRECTLY).add(mInstructionButton);
+        mStateButtonsMap.get(TestState.RESPONDED_OFF_CORRECTLY).add(mInstructionButton);
+        mStateButtonsMap.get(TestState.ALL_PASSED).add(mInstructionButton);
+        mStateButtonsMap.get(TestState.FAILED).add(mInstructionButton);
+        mAllButtons.add(mInstructionButton);
+
+        mOnButton = (Button) findViewById(R.id.flash_on_button);
+        mOnButton.setOnClickListener(mOnButtonListener);
+        mStateButtonsMap.get(TestState.TESTING_ON).add(mOnButton);
+        mStateButtonsMap.get(TestState.TESTING_OFF).add(mOnButton);
+        mAllButtons.add(mOnButton);
+
+        mOffButton = (Button) findViewById(R.id.flash_off_button);
+        mOffButton.setOnClickListener(mOffButtonListener);
+        mStateButtonsMap.get(TestState.TESTING_ON).add(mOffButton);
+        mStateButtonsMap.get(TestState.TESTING_OFF).add(mOffButton);
+        mAllButtons.add(mOffButton);
+
+        View passButton = getPassButton();
+        mStateButtonsMap.get(TestState.ALL_PASSED).add(passButton);
+        mAllButtons.add(passButton);
+
+        mTestState = TestState.NOT_STARTED;
+        updateButtonsAndInstructionLocked();
+    }
+
+
+    private void updateButtonsAndInstructionLocked() {
+        for (View v : mAllButtons) {
+            v.setEnabled(false);
+        }
+
+        // Only enable the buttons for this state.
+        HashSet<View> views = mStateButtonsMap.get(mTestState);
+        for (View v : views) {
+            v.setEnabled(true);
+        }
+
+        switch (mTestState) {
+            case TESTING_ON:
+            case TESTING_OFF:
+                mInstructionTextView.setText(String.format(
+                        getString(R.string.camera_flashlight_question_text), mCurrentCameraId));
+                break;
+            case RESPONDED_ON_CORRECTLY:
+            case RESPONDED_OFF_CORRECTLY:
+                mInstructionTextView.setText(R.string.camera_flashlight_next_text);
+                mInstructionButton.setText(R.string.camera_flashlight_next_button);
+                break;
+            case FAILED:
+                mInstructionTextView.setText(R.string.camera_flashlight_failed_text);
+                mInstructionButton.setText(R.string.camera_flashlight_done_button);
+                break;
+            case ALL_PASSED:
+                mInstructionTextView.setText(R.string.camera_flashlight_passed_text);
+                mInstructionButton.setText(R.string.camera_flashlight_done_button);
+                break;
+            default:
+                break;
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsSerializer.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsSerializer.java
index cf8365a..9abfa9a 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsSerializer.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsSerializer.java
@@ -116,9 +116,15 @@
         faceObj.put("bounds", serializeRect(face.getBounds()));
         faceObj.put("score", face.getScore());
         faceObj.put("id", face.getId());
-        faceObj.put("leftEye", serializePoint(face.getLeftEyePosition()));
-        faceObj.put("rightEye", serializePoint(face.getRightEyePosition()));
-        faceObj.put("mouth", serializePoint(face.getMouthPosition()));
+        if (face.getLeftEyePosition() != null) {
+            faceObj.put("leftEye", serializePoint(face.getLeftEyePosition()));
+        }
+        if (face.getRightEyePosition() != null) {
+            faceObj.put("rightEye", serializePoint(face.getRightEyePosition()));
+        }
+        if (face.getMouthPosition() != null) {
+            faceObj.put("mouth", serializePoint(face.getMouthPosition()));
+        }
         return faceObj;
     }
 
@@ -145,6 +151,19 @@
                         cfgArray.put(obj);
                     }
                 }
+                sizes = map.getHighResolutionOutputSizes(fmts[fi]);
+                if (sizes != null) {
+                    for (int si = 0; si < Array.getLength(sizes); si++) {
+                        JSONObject obj = new JSONObject();
+                        obj.put("format", fmts[fi]);
+                        obj.put("width",sizes[si].getWidth());
+                        obj.put("height", sizes[si].getHeight());
+                        obj.put("input", false);
+                        obj.put("minFrameDuration",
+                                map.getOutputMinFrameDuration(fmts[fi],sizes[si]));
+                        cfgArray.put(obj);
+                    }
+                }
             }
         }
         mapObj.put("availableStreamConfigurations", cfgArray);
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
index ce10535..27f8c28 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
@@ -30,6 +30,7 @@
 import android.hardware.camera2.CaptureResult;
 import android.hardware.camera2.DngCreator;
 import android.hardware.camera2.TotalCaptureResult;
+import android.hardware.camera2.params.InputConfiguration;
 import android.hardware.camera2.params.MeteringRectangle;
 import android.hardware.Sensor;
 import android.hardware.SensorEvent;
@@ -37,6 +38,7 @@
 import android.hardware.SensorManager;
 import android.media.Image;
 import android.media.ImageReader;
+import android.media.ImageWriter;
 import android.net.Uri;
 import android.os.ConditionVariable;
 import android.os.Handler;
@@ -67,7 +69,6 @@
 import java.math.BigInteger;
 import java.net.ServerSocket;
 import java.net.Socket;
-import java.net.SocketTimeoutException;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
 import java.security.MessageDigest;
@@ -78,6 +79,7 @@
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.LinkedBlockingDeque;
+import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -121,7 +123,8 @@
     private BlockingStateCallback mCameraListener = null;
     private CameraDevice mCamera = null;
     private CameraCaptureSession mSession = null;
-    private ImageReader[] mCaptureReaders = null;
+    private ImageReader[] mOutputImageReaders = null;
+    private ImageReader mInputImageReader = null;
     private CameraCharacteristics mCameraCharacteristics = null;
 
     private Vibrator mVibrator = null;
@@ -146,6 +149,7 @@
     private AtomicInteger mCountCallbacksRemaining = new AtomicInteger();
     private AtomicInteger mCountRawOrDng = new AtomicInteger();
     private AtomicInteger mCountRaw10 = new AtomicInteger();
+    private AtomicInteger mCountRaw12 = new AtomicInteger();
     private AtomicInteger mCountJpg = new AtomicInteger();
     private AtomicInteger mCountYuv = new AtomicInteger();
     private AtomicInteger mCountCapRes = new AtomicInteger();
@@ -493,6 +497,7 @@
                         mSocketWriteQueue.clear();
                         mOpenSocket.close();
                         mOpenSocket = null;
+                        mSocketWriteRunnable.setOpenSocket(null);
                         Logt.i(TAG, "Socket disconnected");
                     }
                 } catch (java.io.IOException e) {
@@ -505,9 +510,12 @@
             Logt.i(TAG, "Socket server loop exited");
             mThreadExitFlag = true;
             try {
-                if (mOpenSocket != null) {
-                    mOpenSocket.close();
-                    mOpenSocket = null;
+                synchronized(mSocketWriteDrainLock) {
+                    if (mOpenSocket != null) {
+                        mOpenSocket.close();
+                        mOpenSocket = null;
+                        mSocketWriteRunnable.setOpenSocket(null);
+                    }
                 }
             } catch (java.io.IOException e) {
                 Logt.w(TAG, "Exception closing socket");
@@ -546,6 +554,8 @@
                     doVibrate(cmdObj);
                 } else if ("getCameraIds".equals(cmdObj.getString("cmdName"))) {
                     doGetCameraIds();
+                } else if ("doReprocessCapture".equals(cmdObj.getString("cmdName"))) {
+                    doReprocessCapture(cmdObj);
                 } else {
                     throw new ItsException("Unknown command: " + cmd);
                 }
@@ -658,6 +668,8 @@
                         jsonSurface.put("format", "raw");
                     } else if (format == ImageFormat.RAW10) {
                         jsonSurface.put("format", "raw10");
+                    } else if (format == ImageFormat.RAW12) {
+                        jsonSurface.put("format", "raw12");
                     } else if (format == ImageFormat.JPEG) {
                         jsonSurface.put("format", "jpeg");
                     } else if (format == ImageFormat.YUV_420_888) {
@@ -763,18 +775,42 @@
         }
     }
 
-    private void prepareCaptureReader(int[] widths, int[] heights, int formats[], int numSurfaces) {
-        if (mCaptureReaders != null) {
-            for (int i = 0; i < mCaptureReaders.length; i++) {
-                if (mCaptureReaders[i] != null) {
-                    mCaptureReaders[i].close();
+    private void prepareImageReaders(Size[] outputSizes, int[] outputFormats, Size inputSize,
+            int inputFormat, int maxInputBuffers) {
+        closeImageReaders();
+        mOutputImageReaders = new ImageReader[outputSizes.length];
+        for (int i = 0; i < outputSizes.length; i++) {
+            // Check if the output image reader can be shared with the input image reader.
+            if (outputSizes[i].equals(inputSize) && outputFormats[i] == inputFormat) {
+                mOutputImageReaders[i] = ImageReader.newInstance(outputSizes[i].getWidth(),
+                        outputSizes[i].getHeight(), outputFormats[i],
+                        MAX_CONCURRENT_READER_BUFFERS + maxInputBuffers);
+                mInputImageReader = mOutputImageReaders[i];
+            } else {
+                mOutputImageReaders[i] = ImageReader.newInstance(outputSizes[i].getWidth(),
+                        outputSizes[i].getHeight(), outputFormats[i],
+                        MAX_CONCURRENT_READER_BUFFERS);
+            }
+        }
+
+        if (inputSize != null && mInputImageReader == null) {
+            mInputImageReader = ImageReader.newInstance(inputSize.getWidth(), inputSize.getHeight(),
+                    inputFormat, maxInputBuffers);
+        }
+    }
+
+    private void closeImageReaders() {
+        if (mOutputImageReaders != null) {
+            for (int i = 0; i < mOutputImageReaders.length; i++) {
+                if (mOutputImageReaders[i] != null) {
+                    mOutputImageReaders[i].close();
+                    mOutputImageReaders[i] = null;
                 }
             }
         }
-        mCaptureReaders = new ImageReader[numSurfaces];
-        for (int i = 0; i < numSurfaces; i++) {
-            mCaptureReaders[i] = ImageReader.newInstance(widths[i], heights[i], formats[i],
-                    MAX_CONCURRENT_READER_BUFFERS);
+        if (mInputImageReader != null) {
+            mInputImageReader.close();
+            mInputImageReader = null;
         }
     }
 
@@ -785,18 +821,17 @@
 
             // 3A happens on full-res frames.
             Size sizes[] = ItsUtils.getYuvOutputSizes(mCameraCharacteristics);
-            int widths[] = new int[1];
-            int heights[] = new int[1];
-            int formats[] = new int[1];
-            widths[0] = sizes[0].getWidth();
-            heights[0] = sizes[0].getHeight();
-            formats[0] = ImageFormat.YUV_420_888;
-            int width = widths[0];
-            int height = heights[0];
+            int outputFormats[] = new int[1];
+            outputFormats[0] = ImageFormat.YUV_420_888;
+            Size[] outputSizes = new Size[1];
+            outputSizes[0] = sizes[0];
+            int width = outputSizes[0].getWidth();
+            int height = outputSizes[0].getHeight();
 
-            prepareCaptureReader(widths, heights, formats, 1);
+            prepareImageReaders(outputSizes, outputFormats, /*inputSize*/null, /*inputFormat*/0,
+                    /*maxInputBuffers*/0);
             List<Surface> outputSurfaces = new ArrayList<Surface>(1);
-            outputSurfaces.add(mCaptureReaders[0].getSurface());
+            outputSurfaces.add(mOutputImageReaders[0].getSurface());
             BlockingSessionCallback sessionListener = new BlockingSessionCallback();
             mCamera.createCaptureSession(outputSurfaces, sessionListener, mCameraHandler);
             mSession = sessionListener.waitAndGetSession(TIMEOUT_IDLE_MS);
@@ -804,7 +839,7 @@
             // Add a listener that just recycles buffers; they aren't saved anywhere.
             ImageReader.OnImageAvailableListener readerListener =
                     createAvailableListenerDropper(mCaptureCallback);
-            mCaptureReaders[0].setOnImageAvailableListener(readerListener, mSaveHandlers[0]);
+            mOutputImageReaders[0].setOnImageAvailableListener(readerListener, mSaveHandlers[0]);
 
             // Get the user-specified regions for AE, AWB, AF.
             // Note that the user specifies normalized [x,y,w,h], which is converted below
@@ -950,7 +985,7 @@
                         triggeredAF = true;
                     }
 
-                    req.addTarget(mCaptureReaders[0].getSurface());
+                    req.addTarget(mOutputImageReaders[0].getSurface());
 
                     mIssuedRequest3A = true;
                     mSession.capture(req.build(), mCaptureResultListener, mResultHandler);
@@ -988,88 +1023,116 @@
         }
     }
 
+    /**
+     * Parse jsonOutputSpecs to get output surface sizes and formats. Create input and output
+     * image readers for the parsed output surface sizes, output formats, and the given input
+     * size and format.
+     */
+    private void prepareImageReadersWithOutputSpecs(JSONArray jsonOutputSpecs, Size inputSize,
+            int inputFormat, int maxInputBuffers) throws ItsException {
+        Size outputSizes[];
+        int outputFormats[];
+        int numSurfaces = 0;
+
+        if (jsonOutputSpecs != null) {
+            try {
+                numSurfaces = jsonOutputSpecs.length();
+                if (numSurfaces > MAX_NUM_OUTPUT_SURFACES) {
+                    throw new ItsException("Too many output surfaces");
+                }
+
+                outputSizes = new Size[numSurfaces];
+                outputFormats = new int[numSurfaces];
+                for (int i = 0; i < numSurfaces; i++) {
+                    // Get the specified surface.
+                    JSONObject surfaceObj = jsonOutputSpecs.getJSONObject(i);
+                    String sformat = surfaceObj.optString("format");
+                    Size sizes[];
+                    if ("yuv".equals(sformat) || "".equals(sformat)) {
+                        // Default to YUV if no format is specified.
+                        outputFormats[i] = ImageFormat.YUV_420_888;
+                        sizes = ItsUtils.getYuvOutputSizes(mCameraCharacteristics);
+                    } else if ("jpg".equals(sformat) || "jpeg".equals(sformat)) {
+                        outputFormats[i] = ImageFormat.JPEG;
+                        sizes = ItsUtils.getJpegOutputSizes(mCameraCharacteristics);
+                    } else if ("raw".equals(sformat)) {
+                        outputFormats[i] = ImageFormat.RAW_SENSOR;
+                        sizes = ItsUtils.getRaw16OutputSizes(mCameraCharacteristics);
+                    } else if ("raw10".equals(sformat)) {
+                        outputFormats[i] = ImageFormat.RAW10;
+                        sizes = ItsUtils.getRaw10OutputSizes(mCameraCharacteristics);
+                    } else if ("raw12".equals(sformat)) {
+                        outputFormats[i] = ImageFormat.RAW12;
+                        sizes = ItsUtils.getRaw12OutputSizes(mCameraCharacteristics);
+                    } else if ("dng".equals(sformat)) {
+                        outputFormats[i] = ImageFormat.RAW_SENSOR;
+                        sizes = ItsUtils.getRaw16OutputSizes(mCameraCharacteristics);
+                        mCaptureRawIsDng = true;
+                    } else {
+                        throw new ItsException("Unsupported format: " + sformat);
+                    }
+                    // If the size is omitted, then default to the largest allowed size for the
+                    // format.
+                    int width = surfaceObj.optInt("width");
+                    int height = surfaceObj.optInt("height");
+                    if (width <= 0) {
+                        if (sizes == null || sizes.length == 0) {
+                            throw new ItsException(String.format(
+                                    "Zero stream configs available for requested format: %s",
+                                    sformat));
+                        }
+                        width = ItsUtils.getMaxSize(sizes).getWidth();
+                    }
+                    if (height <= 0) {
+                        height = ItsUtils.getMaxSize(sizes).getHeight();
+                    }
+
+                    outputSizes[i] = new Size(width, height);
+                }
+            } catch (org.json.JSONException e) {
+                throw new ItsException("JSON error", e);
+            }
+        } else {
+            // No surface(s) specified at all.
+            // Default: a single output surface which is full-res YUV.
+            Size sizes[] = ItsUtils.getYuvOutputSizes(mCameraCharacteristics);
+            numSurfaces = 1;
+
+            outputSizes = new Size[1];
+            outputFormats = new int[1];
+            outputSizes[0] = sizes[0];
+            outputFormats[0] = ImageFormat.YUV_420_888;
+        }
+
+        prepareImageReaders(outputSizes, outputFormats, inputSize, inputFormat, maxInputBuffers);
+    }
+
     private void doCapture(JSONObject params) throws ItsException {
         try {
             // Parse the JSON to get the list of capture requests.
             List<CaptureRequest.Builder> requests = ItsSerializer.deserializeRequestList(
                     mCamera, params);
 
-            // Set the output surface(s) and listeners.
-            int widths[] = new int[MAX_NUM_OUTPUT_SURFACES];
-            int heights[] = new int[MAX_NUM_OUTPUT_SURFACES];
-            int formats[] = new int[MAX_NUM_OUTPUT_SURFACES];
             int numSurfaces = 0;
             try {
                 mCountRawOrDng.set(0);
                 mCountJpg.set(0);
                 mCountYuv.set(0);
                 mCountRaw10.set(0);
+                mCountRaw12.set(0);
                 mCountCapRes.set(0);
                 mCaptureRawIsDng = false;
                 mCaptureResults = new CaptureResult[requests.size()];
 
                 JSONArray jsonOutputSpecs = ItsUtils.getOutputSpecs(params);
-                if (jsonOutputSpecs != null) {
-                    numSurfaces = jsonOutputSpecs.length();
-                    if (numSurfaces > MAX_NUM_OUTPUT_SURFACES) {
-                        throw new ItsException("Too many output surfaces");
-                    }
-                    for (int i = 0; i < numSurfaces; i++) {
-                        // Get the specified surface.
-                        JSONObject surfaceObj = jsonOutputSpecs.getJSONObject(i);
-                        String sformat = surfaceObj.optString("format");
-                        Size sizes[];
-                        if ("yuv".equals(sformat) || "".equals(sformat)) {
-                            // Default to YUV if no format is specified.
-                            formats[i] = ImageFormat.YUV_420_888;
-                            sizes = ItsUtils.getYuvOutputSizes(mCameraCharacteristics);
-                        } else if ("jpg".equals(sformat) || "jpeg".equals(sformat)) {
-                            formats[i] = ImageFormat.JPEG;
-                            sizes = ItsUtils.getJpegOutputSizes(mCameraCharacteristics);
-                        } else if ("raw".equals(sformat)) {
-                            formats[i] = ImageFormat.RAW_SENSOR;
-                            sizes = ItsUtils.getRawOutputSizes(mCameraCharacteristics);
-                        } else if ("raw10".equals(sformat)) {
-                            formats[i] = ImageFormat.RAW10;
-                            sizes = ItsUtils.getRawOutputSizes(mCameraCharacteristics);
-                        } else if ("dng".equals(sformat)) {
-                            formats[i] = ImageFormat.RAW_SENSOR;
-                            sizes = ItsUtils.getRawOutputSizes(mCameraCharacteristics);
-                            mCaptureRawIsDng = true;
-                        } else {
-                            throw new ItsException("Unsupported format: " + sformat);
-                        }
-                        // If the size is omitted, then default to the largest allowed size for the
-                        // format.
-                        widths[i] = surfaceObj.optInt("width");
-                        heights[i] = surfaceObj.optInt("height");
-                        if (widths[i] <= 0) {
-                            if (sizes == null || sizes.length == 0) {
-                                throw new ItsException(String.format(
-                                        "Zero stream configs available for requested format: %s",
-                                        sformat));
-                            }
-                            widths[i] = sizes[0].getWidth();
-                        }
-                        if (heights[i] <= 0) {
-                            heights[i] = sizes[0].getHeight();
-                        }
-                    }
-                } else {
-                    // No surface(s) specified at all.
-                    // Default: a single output surface which is full-res YUV.
-                    Size sizes[] =
-                            ItsUtils.getYuvOutputSizes(mCameraCharacteristics);
-                    numSurfaces = 1;
-                    widths[0] = sizes[0].getWidth();
-                    heights[0] = sizes[0].getHeight();
-                    formats[0] = ImageFormat.YUV_420_888;
-                }
 
-                prepareCaptureReader(widths, heights, formats, numSurfaces);
+                prepareImageReadersWithOutputSpecs(jsonOutputSpecs, /*inputSize*/null,
+                        /*inputFormat*/0, /*maxInputBuffers*/0);
+                numSurfaces = mOutputImageReaders.length;
+
                 List<Surface> outputSurfaces = new ArrayList<Surface>(numSurfaces);
                 for (int i = 0; i < numSurfaces; i++) {
-                    outputSurfaces.add(mCaptureReaders[i].getSurface());
+                    outputSurfaces.add(mOutputImageReaders[i].getSurface());
                 }
                 BlockingSessionCallback sessionListener = new BlockingSessionCallback();
                 mCamera.createCaptureSession(outputSurfaces, sessionListener, mCameraHandler);
@@ -1078,7 +1141,8 @@
                 for (int i = 0; i < numSurfaces; i++) {
                     ImageReader.OnImageAvailableListener readerListener =
                             createAvailableListener(mCaptureCallback);
-                    mCaptureReaders[i].setOnImageAvailableListener(readerListener,mSaveHandlers[i]);
+                    mOutputImageReaders[i].setOnImageAvailableListener(readerListener,
+                            mSaveHandlers[i]);
                 }
 
                 // Plan for how many callbacks need to be received throughout the duration of this
@@ -1089,8 +1153,6 @@
 
             } catch (CameraAccessException e) {
                 throw new ItsException("Error configuring outputs", e);
-            } catch (org.json.JSONException e) {
-                throw new ItsException("JSON error", e);
             }
 
             // Initiate the captures.
@@ -1107,7 +1169,7 @@
                 }
 
                 for (int j = 0; j < numSurfaces; j++) {
-                    req.addTarget(mCaptureReaders[j].getSurface());
+                    req.addTarget(mOutputImageReaders[j].getSurface());
                 }
                 mSession.capture(req.build(), mCaptureResultListener, mResultHandler);
             }
@@ -1137,6 +1199,181 @@
         }
     }
 
+    /**
+     * Perform reprocess captures.
+     *
+     * It takes captureRequests in a JSON object and perform capture requests in two steps:
+     * regular capture request to get reprocess input and reprocess capture request to get
+     * reprocess outputs.
+     *
+     * Regular capture requests:
+     *   1. For each capture request in the JSON object, create a full-size capture request with
+     *      the settings in the JSON object.
+     *   2. Remember and clear noise reduction, edge enhancement, and effective exposure factor
+     *      from the regular capture requests. (Those settings will be used for reprocess requests.)
+     *   3. Submit the regular capture requests.
+     *
+     * Reprocess capture requests:
+     *   4. Wait for the regular capture results and use them to create reprocess capture requests.
+     *   5. Wait for the regular capture output images and queue them to the image writer.
+     *   6. Set the noise reduction, edge enhancement, and effective exposure factor from #2.
+     *   7. Submit the reprocess capture requests.
+     *
+     * The output images and results for the regular capture requests won't be written to socket.
+     * The output images and results for the reprocess capture requests will be written to socket.
+     */
+    private void doReprocessCapture(JSONObject params) throws ItsException {
+        ImageWriter imageWriter = null;
+        ArrayList<Integer> noiseReductionModes = new ArrayList<>();
+        ArrayList<Integer> edgeModes = new ArrayList<>();
+        ArrayList<Float> effectiveExposureFactors = new ArrayList<>();
+
+        mCountRawOrDng.set(0);
+        mCountJpg.set(0);
+        mCountYuv.set(0);
+        mCountRaw10.set(0);
+        mCountRaw12.set(0);
+        mCountCapRes.set(0);
+        mCaptureRawIsDng = false;
+
+        try {
+            // Parse the JSON to get the list of capture requests.
+            List<CaptureRequest.Builder> inputRequests =
+                    ItsSerializer.deserializeRequestList(mCamera, params);
+
+            // Prepare the image readers for reprocess input and reprocess outputs.
+            int inputFormat = getReprocessInputFormat(params);
+            Size inputSize = ItsUtils.getMaxOutputSize(mCameraCharacteristics, inputFormat);
+            JSONArray jsonOutputSpecs = ItsUtils.getOutputSpecs(params);
+            prepareImageReadersWithOutputSpecs(jsonOutputSpecs, inputSize, inputFormat,
+                    inputRequests.size());
+
+            // Prepare a reprocessable session.
+            int numOutputSurfaces = mOutputImageReaders.length;
+            InputConfiguration inputConfig = new InputConfiguration(inputSize.getWidth(),
+                    inputSize.getHeight(), inputFormat);
+            List<Surface> outputSurfaces = new ArrayList<Surface>();
+            boolean addSurfaceForInput = true;
+            for (int i = 0; i < numOutputSurfaces; i++) {
+                outputSurfaces.add(mOutputImageReaders[i].getSurface());
+                if (mOutputImageReaders[i] == mInputImageReader) {
+                    // If input and one of the outputs share the same image reader, avoid
+                    // adding the same surfaces twice.
+                    addSurfaceForInput = false;
+                }
+            }
+
+            if (addSurfaceForInput) {
+                // Besides the output surfaces specified in JSON object, add an additional one
+                // for reprocess input.
+                outputSurfaces.add(mInputImageReader.getSurface());
+            }
+
+            BlockingSessionCallback sessionListener = new BlockingSessionCallback();
+            mCamera.createReprocessableCaptureSession(inputConfig, outputSurfaces, sessionListener,
+                    mCameraHandler);
+            mSession = sessionListener.waitAndGetSession(TIMEOUT_IDLE_MS);
+
+            // Create an image writer for reprocess input.
+            Surface inputSurface = mSession.getInputSurface();
+            imageWriter = ImageWriter.newInstance(inputSurface, inputRequests.size());
+
+            // Set up input reader listener and capture callback listener to get
+            // reprocess input buffers and the results in order to create reprocess capture
+            // requests.
+            ImageReaderListenerWaiter inputReaderListener = new ImageReaderListenerWaiter();
+            mInputImageReader.setOnImageAvailableListener(inputReaderListener, mSaveHandlers[0]);
+
+            CaptureCallbackWaiter captureCallbackWaiter = new CaptureCallbackWaiter();
+            // Prepare the reprocess input request
+            for (CaptureRequest.Builder inputReqest : inputRequests) {
+                // Remember and clear noise reduction, edge enhancement, and effective exposure
+                // factors.
+                noiseReductionModes.add(inputReqest.get(CaptureRequest.NOISE_REDUCTION_MODE));
+                edgeModes.add(inputReqest.get(CaptureRequest.EDGE_MODE));
+                effectiveExposureFactors.add(inputReqest.get(
+                        CaptureRequest.REPROCESS_EFFECTIVE_EXPOSURE_FACTOR));
+
+                inputReqest.set(CaptureRequest.NOISE_REDUCTION_MODE,
+                        CaptureRequest.NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG);
+                inputReqest.set(CaptureRequest.EDGE_MODE, CaptureRequest.EDGE_MODE_ZERO_SHUTTER_LAG);
+                inputReqest.set(CaptureRequest.REPROCESS_EFFECTIVE_EXPOSURE_FACTOR, null);
+                inputReqest.addTarget(mInputImageReader.getSurface());
+                mSession.capture(inputReqest.build(), captureCallbackWaiter, mResultHandler);
+            }
+
+            // Wait for reprocess input images
+            ArrayList<CaptureRequest.Builder> reprocessOutputRequests = new ArrayList<>();
+            for (int i = 0; i < inputRequests.size(); i++) {
+                TotalCaptureResult result =
+                        captureCallbackWaiter.getResult(TIMEOUT_CALLBACK * 1000);
+                reprocessOutputRequests.add(mCamera.createReprocessCaptureRequest(result));
+                imageWriter.queueInputImage(inputReaderListener.getImage(TIMEOUT_CALLBACK * 1000));
+            }
+
+            // Start performing reprocess captures.
+
+            mCaptureResults = new CaptureResult[inputRequests.size()];
+
+            // Prepare reprocess capture requests.
+            for (int i = 0; i < numOutputSurfaces; i++) {
+                ImageReader.OnImageAvailableListener outputReaderListener =
+                        createAvailableListener(mCaptureCallback);
+                mOutputImageReaders[i].setOnImageAvailableListener(outputReaderListener,
+                        mSaveHandlers[i]);
+            }
+
+            // Initiate the captures.
+            for (int i = 0; i < reprocessOutputRequests.size(); i++) {
+                CaptureRequest.Builder req = reprocessOutputRequests.get(i);
+                for (ImageReader outputImageReader : mOutputImageReaders) {
+                    req.addTarget(outputImageReader.getSurface());
+                }
+
+                req.set(CaptureRequest.NOISE_REDUCTION_MODE, noiseReductionModes.get(i));
+                req.set(CaptureRequest.EDGE_MODE, edgeModes.get(i));
+                req.set(CaptureRequest.REPROCESS_EFFECTIVE_EXPOSURE_FACTOR,
+                        effectiveExposureFactors.get(i));
+
+                mSession.capture(req.build(), mCaptureResultListener, mResultHandler);
+            }
+
+            // Plan for how many callbacks need to be received throughout the duration of this
+            // sequence of capture requests. There is one callback per image surface, and one
+            // callback for the CaptureResult, for each capture.
+            int numCaptures = reprocessOutputRequests.size();
+            mCountCallbacksRemaining.set(numCaptures * (numOutputSurfaces + 1));
+
+            // Make sure all callbacks have been hit (wait until captures are done).
+            // If no timeouts are received after a timeout, then fail.
+            int currentCount = mCountCallbacksRemaining.get();
+            while (currentCount > 0) {
+                try {
+                    Thread.sleep(TIMEOUT_CALLBACK*1000);
+                } catch (InterruptedException e) {
+                    throw new ItsException("Timeout failure", e);
+                }
+                int newCount = mCountCallbacksRemaining.get();
+                if (newCount == currentCount) {
+                    throw new ItsException(
+                            "No callback received within timeout");
+                }
+                currentCount = newCount;
+            }
+        } catch (android.hardware.camera2.CameraAccessException e) {
+            throw new ItsException("Access error: ", e);
+        } finally {
+            closeImageReaders();
+            if (mSession != null) {
+                mSession.close();
+                mSession = null;
+            }
+            if (imageWriter != null) {
+                imageWriter.close();
+            }
+        }
+    }
+
     @Override
     public final void onSensorChanged(SensorEvent event) {
         synchronized(mEventLock) {
@@ -1179,6 +1416,12 @@
                     ByteBuffer buf = ByteBuffer.wrap(img);
                     int count = mCountRaw10.getAndIncrement();
                     mSocketRunnableObj.sendResponseCaptureBuffer("raw10Image", buf);
+                } else if (format == ImageFormat.RAW12) {
+                    Logt.i(TAG, "Received RAW12 capture");
+                    byte[] img = ItsUtils.getDataFromImage(capture);
+                    ByteBuffer buf = ByteBuffer.wrap(img);
+                    int count = mCountRaw12.getAndIncrement();
+                    mSocketRunnableObj.sendResponseCaptureBuffer("raw12Image", buf);
                 } else if (format == ImageFormat.RAW_SENSOR) {
                     Logt.i(TAG, "Received RAW16 capture");
                     int count = mCountRawOrDng.getAndIncrement();
@@ -1379,7 +1622,7 @@
                     int count = mCountCapRes.getAndIncrement();
                     mCaptureResults[count] = result;
                     mSocketRunnableObj.sendResponseCaptureResult(mCameraCharacteristics,
-                            request, result, mCaptureReaders);
+                            request, result, mOutputImageReaders);
                     mCountCallbacksRemaining.decrementAndGet();
                 }
             } catch (ItsException e) {
@@ -1395,4 +1638,93 @@
             Logt.e(TAG, "Script error: capture failed");
         }
     };
+
+    private class CaptureCallbackWaiter extends CameraCaptureSession.CaptureCallback {
+        private final LinkedBlockingQueue<TotalCaptureResult> mResultQueue =
+                new LinkedBlockingQueue<>();
+
+        @Override
+        public void onCaptureStarted(CameraCaptureSession session, CaptureRequest request,
+                long timestamp, long frameNumber) {
+        }
+
+        @Override
+        public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
+                TotalCaptureResult result) {
+            try {
+                mResultQueue.put(result);
+            } catch (InterruptedException e) {
+                throw new UnsupportedOperationException(
+                        "Can't handle InterruptedException in onImageAvailable");
+            }
+        }
+
+        @Override
+        public void onCaptureFailed(CameraCaptureSession session, CaptureRequest request,
+                CaptureFailure failure) {
+            Logt.e(TAG, "Script error: capture failed");
+        }
+
+        public TotalCaptureResult getResult(long timeoutMs) throws ItsException {
+            TotalCaptureResult result;
+            try {
+                result = mResultQueue.poll(timeoutMs, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException e) {
+                throw new ItsException(e);
+            }
+
+            if (result == null) {
+                throw new ItsException("Getting an image timed out after " + timeoutMs +
+                        "ms");
+            }
+
+            return result;
+        }
+    }
+
+    private static class ImageReaderListenerWaiter implements ImageReader.OnImageAvailableListener {
+        private final LinkedBlockingQueue<Image> mImageQueue = new LinkedBlockingQueue<>();
+
+        @Override
+        public void onImageAvailable(ImageReader reader) {
+            try {
+                mImageQueue.put(reader.acquireNextImage());
+            } catch (InterruptedException e) {
+                throw new UnsupportedOperationException(
+                        "Can't handle InterruptedException in onImageAvailable");
+            }
+        }
+
+        public Image getImage(long timeoutMs) throws ItsException {
+            Image image;
+            try {
+                image = mImageQueue.poll(timeoutMs, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException e) {
+                throw new ItsException(e);
+            }
+
+            if (image == null) {
+                throw new ItsException("Getting an image timed out after " + timeoutMs +
+                        "ms");
+            }
+            return image;
+        }
+    }
+
+    private int getReprocessInputFormat(JSONObject params) throws ItsException {
+        String reprocessFormat;
+        try {
+            reprocessFormat = params.getString("reprocessFormat");
+        } catch (org.json.JSONException e) {
+            throw new ItsException("Error parsing reprocess format: " + e);
+        }
+
+        if (reprocessFormat.equals("yuv")) {
+            return ImageFormat.YUV_420_888;
+        } else if (reprocessFormat.equals("private")) {
+            return ImageFormat.PRIVATE;
+        }
+
+        throw new ItsException("Uknown reprocess format: " + reprocessFormat);
+    }
 }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java
index 2011314..6fd050b 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java
@@ -91,11 +91,21 @@
         }
     }
 
-    public static Size[] getRawOutputSizes(CameraCharacteristics ccs)
+    public static Size[] getRaw16OutputSizes(CameraCharacteristics ccs)
             throws ItsException {
         return getOutputSizes(ccs, ImageFormat.RAW_SENSOR);
     }
 
+    public static Size[] getRaw10OutputSizes(CameraCharacteristics ccs)
+            throws ItsException {
+        return getOutputSizes(ccs, ImageFormat.RAW10);
+    }
+
+    public static Size[] getRaw12OutputSizes(CameraCharacteristics ccs)
+            throws ItsException {
+        return getOutputSizes(ccs, ImageFormat.RAW12);
+    }
+
     public static Size[] getJpegOutputSizes(CameraCharacteristics ccs)
             throws ItsException {
         return getOutputSizes(ccs, ImageFormat.JPEG);
@@ -106,6 +116,11 @@
         return getOutputSizes(ccs, ImageFormat.YUV_420_888);
     }
 
+    public static Size getMaxOutputSize(CameraCharacteristics ccs, int format)
+            throws ItsException {
+        return getMaxSize(getOutputSizes(ccs, format));
+    }
+
     private static Size[] getOutputSizes(CameraCharacteristics ccs, int format)
             throws ItsException {
         StreamConfigurationMap configMap = ccs.get(
@@ -113,7 +128,37 @@
         if (configMap == null) {
             throw new ItsException("Failed to get stream config");
         }
-        return configMap.getOutputSizes(format);
+        Size[] normalSizes = configMap.getOutputSizes(format);
+        Size[] slowSizes = configMap.getHighResolutionOutputSizes(format);
+        Size[] allSizes = null;
+        if (normalSizes != null && slowSizes != null) {
+            allSizes = new Size[normalSizes.length + slowSizes.length];
+            System.arraycopy(normalSizes, 0, allSizes, 0,
+                    normalSizes.length);
+            System.arraycopy(slowSizes, 0, allSizes, normalSizes.length,
+                    slowSizes.length);
+        } else if (normalSizes != null) {
+            allSizes = normalSizes;
+        } else if (slowSizes != null) {
+            allSizes = slowSizes;
+        }
+        return allSizes;
+    }
+
+    public static Size getMaxSize(Size[] sizes) {
+        if (sizes == null || sizes.length == 0) {
+            throw new IllegalArgumentException("sizes was empty");
+        }
+
+        Size maxSize = sizes[0];
+        for (int i = 1; i < sizes.length; i++) {
+            if (sizes[i].getWidth() * sizes[i].getHeight() >
+                    maxSize.getWidth() * maxSize.getHeight()) {
+                maxSize = sizes[i];
+            }
+        }
+
+        return maxSize;
     }
 
     public static byte[] getDataFromImage(Image image)
@@ -139,7 +184,7 @@
             buffer.get(data);
             return data;
         } else if (format == ImageFormat.YUV_420_888 || format == ImageFormat.RAW_SENSOR
-                || format == ImageFormat.RAW10) {
+                || format == ImageFormat.RAW10 || format == ImageFormat.RAW12) {
             int offset = 0;
             data = new byte[width * height * ImageFormat.getBitsPerPixel(format) / 8];
             int maxRowSize = planes[0].getRowStride();
@@ -213,6 +258,7 @@
                 return 3 == planes.length;
             case ImageFormat.RAW_SENSOR:
             case ImageFormat.RAW10:
+            case ImageFormat.RAW12:
             case ImageFormat.JPEG:
                 return 1 == planes.length;
             default:
@@ -220,4 +266,3 @@
         }
     }
 }
-
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java
index 36acf42..51e0a62 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java
@@ -230,6 +230,10 @@
             new Feature("android.software.voice_recognizers", false),
     };
 
+    public static final Feature[] ALL_MNC_FEATURES = {
+            new Feature(PackageManager.FEATURE_MIDI, false),
+    };
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -261,6 +265,9 @@
 
         // add features from latest to last so that the latest requirements are put in the set first
         int apiVersion = Build.VERSION.SDK_INT;
+        if (apiVersion >= Build.VERSION_CODES.M) {
+            Collections.addAll(features, ALL_MNC_FEATURES);
+        }
         if (apiVersion >= Build.VERSION_CODES.LOLLIPOP) {
             Collections.addAll(features, ALL_LOLLIPOP_FEATURES);
         }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodFlowTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodFlowTestActivity.java
index af3a7d5..0200a4f 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodFlowTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodFlowTestActivity.java
@@ -16,33 +16,24 @@
 
 package com.android.cts.verifier.managedprovisioning;
 
-import android.app.AlertDialog;
 import android.app.admin.DevicePolicyManager;
 import android.content.ActivityNotFoundException;
 import android.content.ComponentName;
-import android.content.Context;
-import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
 import android.provider.Settings;
 import android.util.Log;
-import android.view.LayoutInflater;
 import android.view.View;
-import android.view.ViewGroup;
 import android.view.View.OnClickListener;
-import android.widget.ArrayAdapter;
-import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.TextView;
 import android.widget.Toast;
 
-import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.ArrayTestListAdapter;
+import com.android.cts.verifier.DialogTestListActivity;
 import com.android.cts.verifier.R;
 import com.android.cts.verifier.TestListActivity;
-
-import java.util.ArrayList;
-import java.util.List;
+import com.android.cts.verifier.TestListAdapter.TestListItem;
+import com.android.cts.verifier.TestResult;
 
 /**
  * CTS verifier test for BYOD managed provisioning flow.
@@ -55,61 +46,53 @@
  * The first two verifications are performed automatically, by interacting with profile owner using
  * cross-profile intents, while the last two are carried out manually by the user.
  */
-public class ByodFlowTestActivity extends PassFailButtons.ListActivity {
+public class ByodFlowTestActivity extends DialogTestListActivity {
 
     private final String TAG = "ByodFlowTestActivity";
-    private static final int REQUEST_STATUS = 1;
+    private static final int REQUEST_MANAGED_PROVISIONING = 0;
+    private static final int REQUEST_PROFILE_OWNER_STATUS = 1;
+    private static final int REQUEST_INTENT_FILTERS_STATUS = 2;
 
     private ComponentName mAdminReceiverComponent;
 
-    private TestAdapter mTestListAdapter;
-    private View mStartProvisioningButton;
-    private List<TestItem> mTests = new ArrayList<TestItem>();
+    private DialogTestListItem mProfileOwnerInstalled;
+    private DialogTestListItem mProfileAccountVisibleTest;
+    private DialogTestListItem mDeviceAdminVisibleTest;
+    private DialogTestListItem mWorkAppVisibleTest;
+    private DialogTestListItem mCrossProfileIntentFiltersTest;
+    private DialogTestListItem mDisableNonMarketTest;
+    private DialogTestListItem mEnableNonMarketTest;
+    private DialogTestListItem mWorkNotificationBadgedTest;
+    private DialogTestListItem mWorkStatusBarIconTest;
+    private DialogTestListItem mWorkStatusBarToastTest;
+    private DialogTestListItem mAppSettingsVisibleTest;
+    private DialogTestListItem mLocationSettingsVisibleTest;
+    private DialogTestListItem mBatterySettingsVisibleTest;
+    private DialogTestListItem mDataUsageSettingsVisibleTest;
+    private DialogTestListItem mCredSettingsVisibleTest;
+    private DialogTestListItem mPrintSettingsVisibleTest;
+    private DialogTestListItem mIntentFiltersTest;
+    private DialogTestListItem mPermissionLockdownTest;
+    private DialogTestListItem mCrossProfileImageCaptureSupportTest;
+    private DialogTestListItem mCrossProfileVideoCaptureSupportTest;
+    private DialogTestListItem mCrossProfileAudioCaptureSupportTest;
+    private TestListItem mKeyguardDisabledFeaturesTest;
+    private DialogTestListItem mDisableNfcBeamTest;
 
-    protected DevicePolicyManager mDevicePolicyManager;
-
-    private TestItem mProfileOwnerInstalled;
-    private TestItem mProfileAccountVisibleTest;
-    private TestItem mDeviceAdminVisibleTest;
-    private TestItem mWorkAppVisibleTest;
-    private TestItem mCrossProfileIntentFiltersTest;
-    private TestItem mDisableNonMarketTest;
-    private TestItem mEnableNonMarketTest;
-    private TestItem mWorkNotificationBadgedTest;
-    private TestItem mAppSettingsVisibleTest;
-    private TestItem mLocationSettingsVisibleTest;
-    private TestItem mCredSettingsVisibleTest;
-    private TestItem mPrintSettingsVisibleTest;
-    private TestItem mCrossProfileImageCaptureSupportTest;
-    private TestItem mCrossProfileVideoCaptureSupportTest;
-    private TestItem mCrossProfileAudioCaptureSupportTest;
-    private TestItem mDisableNfcBeamTest;
-
-    private int mCurrentTestPosition;
+    public ByodFlowTestActivity() {
+        super(R.layout.provisioning_byod,
+                R.string.provisioning_byod, R.string.provisioning_byod_info,
+                R.string.provisioning_byod_instructions);
+    }
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mAdminReceiverComponent = new ComponentName(this, DeviceAdminTestReceiver.class.getName());
-        mDevicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
+
         disableComponent();
-
-        setContentView(R.layout.provisioning_byod);
-        setInfoResources(R.string.provisioning_byod, R.string.provisioning_byod_info, -1);
-        setPassFailButtonClickListeners();
-        getPassButton().setEnabled(false);
-        setResult(RESULT_CANCELED);
-
-        setupTests();
-
-        mTestListAdapter = new TestAdapter(this);
-        setListAdapter(mTestListAdapter);
-        mTestListAdapter.addAll(mTests);
-
-        mCurrentTestPosition = 0;
-
-        mStartProvisioningButton = findViewById(R.id.byod_start);
-        mStartProvisioningButton.setOnClickListener(new OnClickListener() {
+        mPrepareTestButton.setText(R.string.provisioning_byod_start);
+        mPrepareTestButton.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View v) {
                 startByodProvisioning();
@@ -135,22 +118,34 @@
         // This is called when managed provisioning completes successfully without reboot.
         super.onNewIntent(intent);
         if (ByodHelperActivity.ACTION_PROFILE_OWNER_STATUS.equals(intent.getAction())) {
-            handleStatusUpdate(intent);
+            handleStatusUpdate(RESULT_OK, intent);
         }
     }
 
     @Override
-    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        // Called after queryProfileOwner()
-        super.onActivityResult(requestCode, resultCode, data);
-        if (requestCode == REQUEST_STATUS && resultCode == RESULT_OK) {
-            handleStatusUpdate(data);
+    protected void handleActivityResult(int requestCode, int resultCode, Intent data) {
+        switch (requestCode) {
+            case REQUEST_MANAGED_PROVISIONING:
+                return;
+            case REQUEST_PROFILE_OWNER_STATUS: {
+                // Called after queryProfileOwner()
+                handleStatusUpdate(resultCode, data);
+            } break;
+            case REQUEST_INTENT_FILTERS_STATUS: {
+                // Called after checkIntentFilters()
+                handleIntentFiltersStatus(resultCode);
+            } break;
+            default: {
+                super.handleActivityResult(requestCode, resultCode, data);
+            }
         }
     }
 
-    private void handleStatusUpdate(Intent data) {
-        boolean provisioned = data.getBooleanExtra(ByodHelperActivity.EXTRA_PROVISIONED, false);
-        setTestResult(mProfileOwnerInstalled, provisioned ? TestResult.Passed : TestResult.Failed);
+    private void handleStatusUpdate(int resultCode, Intent data) {
+        boolean provisioned = data != null &&
+                data.getBooleanExtra(ByodHelperActivity.EXTRA_PROVISIONED, false);
+        setTestResult(mProfileOwnerInstalled, (provisioned && resultCode == RESULT_OK) ?
+                TestResult.TEST_RESULT_PASSED : TestResult.TEST_RESULT_FAILED);
     }
 
     @Override
@@ -161,10 +156,13 @@
         super.finish();
     }
 
-    private void setupTests() {
-        mProfileOwnerInstalled = new TestItem(this, R.string.provisioning_byod_profileowner) {
+    @Override
+    protected void setupTests(ArrayTestListAdapter adapter) {
+        mProfileOwnerInstalled = new DialogTestListItem(this,
+                R.string.provisioning_byod_profileowner,
+                "BYOD_ProfileOwnerInstalled") {
             @Override
-            public void performTest(ByodFlowTestActivity activity) {
+            public void performTest(DialogTestListActivity activity) {
                 queryProfileOwner(true);
             }
         };
@@ -173,86 +171,164 @@
          * To keep the image in this test up to date, use the instructions in
          * {@link ByodIconSamplerActivity}.
          */
-        mWorkAppVisibleTest = new TestItemWithIcon(this,
+        mWorkAppVisibleTest = new DialogTestListItemWithIcon(this,
                 R.string.provisioning_byod_workapps_visible,
+                "BYOD_WorkAppVisibleTest",
                 R.string.provisioning_byod_workapps_visible_instruction,
                 new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),
                 R.drawable.badged_icon);
 
-        mWorkNotificationBadgedTest = new TestItemWithIcon(this,
+        mWorkNotificationBadgedTest = new DialogTestListItemWithIcon(this,
                 R.string.provisioning_byod_work_notification,
+                "BYOD_WorkNotificationBadgedTest",
                 R.string.provisioning_byod_work_notification_instruction,
                 new Intent(WorkNotificationTestActivity.ACTION_WORK_NOTIFICATION),
                 R.drawable.ic_corp_icon);
 
-        mDisableNonMarketTest = new TestItem(this, R.string.provisioning_byod_nonmarket_deny,
+        Intent workStatusIcon = new Intent(WorkStatusTestActivity.ACTION_WORK_STATUS_ICON);
+        workStatusIcon.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mWorkStatusBarIconTest = new DialogTestListItemWithIcon(this,
+                R.string.provisioning_byod_work_status_icon,
+                "BYOD_WorkStatusBarIconTest",
+                R.string.provisioning_byod_work_status_icon_instruction,
+                workStatusIcon,
+                R.drawable.stat_sys_managed_profile_status);
+
+        Intent workStatusToast = new Intent(WorkStatusTestActivity.ACTION_WORK_STATUS_TOAST);
+        workStatusToast.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mWorkStatusBarToastTest = new DialogTestListItem(this,
+                R.string.provisioning_byod_work_status_toast,
+                "BYOD_WorkStatusBarToastTest",
+                R.string.provisioning_byod_work_status_toast_instruction,
+                workStatusToast);
+
+        mDisableNonMarketTest = new DialogTestListItem(this,
+                R.string.provisioning_byod_nonmarket_deny,
+                "BYOD_DisableNonMarketTest",
                 R.string.provisioning_byod_nonmarket_deny_info,
                 new Intent(ByodHelperActivity.ACTION_INSTALL_APK)
                         .putExtra(ByodHelperActivity.EXTRA_ALLOW_NON_MARKET_APPS, false));
 
-        mEnableNonMarketTest = new TestItem(this, R.string.provisioning_byod_nonmarket_allow,
+        mEnableNonMarketTest = new DialogTestListItem(this,
+                R.string.provisioning_byod_nonmarket_allow,
+                "BYOD_EnableNonMarketTest",
                 R.string.provisioning_byod_nonmarket_allow_info,
                 new Intent(ByodHelperActivity.ACTION_INSTALL_APK)
                         .putExtra(ByodHelperActivity.EXTRA_ALLOW_NON_MARKET_APPS, true));
 
-        mProfileAccountVisibleTest = new TestItem(this, R.string.provisioning_byod_profile_visible,
+        mProfileAccountVisibleTest = new DialogTestListItem(this,
+                R.string.provisioning_byod_profile_visible,
+                "BYOD_ProfileAccountVisibleTest",
                 R.string.provisioning_byod_profile_visible_instruction,
                 new Intent(Settings.ACTION_SETTINGS));
 
-        mAppSettingsVisibleTest = new TestItem(this, R.string.provisioning_byod_app_settings,
+        mAppSettingsVisibleTest = new DialogTestListItem(this,
+                R.string.provisioning_byod_app_settings,
+                "BYOD_AppSettingsVisibleTest",
                 R.string.provisioning_byod_app_settings_instruction,
                 new Intent(Settings.ACTION_APPLICATION_SETTINGS));
 
-        mDeviceAdminVisibleTest = new TestItem(this, R.string.provisioning_byod_admin_visible,
+        mDeviceAdminVisibleTest = new DialogTestListItem(this,
+                R.string.provisioning_byod_admin_visible,
+                "BYOD_DeviceAdminVisibleTest",
                 R.string.provisioning_byod_admin_visible_instruction,
                 new Intent(Settings.ACTION_SECURITY_SETTINGS));
 
-        mCredSettingsVisibleTest = new TestItem(this, R.string.provisioning_byod_cred_settings,
+        mCredSettingsVisibleTest = new DialogTestListItem(this,
+                R.string.provisioning_byod_cred_settings,
+                "BYOD_CredSettingsVisibleTest",
                 R.string.provisioning_byod_cred_settings_instruction,
                 new Intent(Settings.ACTION_SECURITY_SETTINGS));
 
-        mLocationSettingsVisibleTest = new TestItem(this,
+        mLocationSettingsVisibleTest = new DialogTestListItem(this,
                 R.string.provisioning_byod_location_settings,
+                "BYOD_LocationSettingsVisibleTest",
                 R.string.provisioning_byod_location_settings_instruction,
                 new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
 
-        mPrintSettingsVisibleTest = new TestItem(this, R.string.provisioning_byod_print_settings,
+        mBatterySettingsVisibleTest = new DialogTestListItem(this,
+                R.string.provisioning_byod_battery_settings,
+                "BYOD_BatterySettingsVisibleTest",
+                R.string.provisioning_byod_battery_settings_instruction,
+                new Intent(Intent.ACTION_POWER_USAGE_SUMMARY));
+
+        mDataUsageSettingsVisibleTest = new DialogTestListItem(this,
+                R.string.provisioning_byod_data_usage_settings,
+                "BYOD_DataUsageSettingsVisibleTest",
+                R.string.provisioning_byod_data_usage_settings_instruction,
+                new Intent(Settings.ACTION_SETTINGS));
+
+        mPrintSettingsVisibleTest = new DialogTestListItem(this,
+                R.string.provisioning_byod_print_settings,
+                "BYOD_PrintSettingsVisibleTest",
                 R.string.provisioning_byod_print_settings_instruction,
                 new Intent(Settings.ACTION_PRINT_SETTINGS));
 
         Intent intent = new Intent(CrossProfileTestActivity.ACTION_CROSS_PROFILE);
         Intent chooser = Intent.createChooser(intent,
                 getResources().getString(R.string.provisioning_cross_profile_chooser));
-        mCrossProfileIntentFiltersTest = new TestItem(this,
+        mCrossProfileIntentFiltersTest = new DialogTestListItem(this,
                 R.string.provisioning_byod_cross_profile,
+                "BYOD_CrossProfileIntentFiltersTest",
                 R.string.provisioning_byod_cross_profile_instruction,
                 chooser);
 
-        mTests.add(mProfileOwnerInstalled);
+        mKeyguardDisabledFeaturesTest = TestListItem.newTest(this,
+                R.string.provisioning_byod_keyguard_disabled_features,
+                KeyguardDisabledFeaturesActivity.class.getName(),
+                new Intent(this, KeyguardDisabledFeaturesActivity.class), null);
+
+        // Test for checking if the required intent filters are set during managed provisioning.
+        mIntentFiltersTest = new DialogTestListItem(this,
+                R.string.provisioning_byod_cross_profile_intent_filters,
+                "BYOD_IntentFiltersTest") {
+            @Override
+            public void performTest(DialogTestListActivity activity) {
+                checkIntentFilters();
+            }
+        };
+        
+        Intent permissionCheckIntent = new Intent(
+                PermissionLockdownTestActivity.ACTION_MANAGED_PROFILE_CHECK_PERMISSION_LOCKDOWN);
+        mPermissionLockdownTest = new DialogTestListItem(this,
+                R.string.device_profile_owner_permission_lockdown_test,
+                "BYOD_PermissionLockdownTest",
+                R.string.profile_owner_permission_lockdown_test_info,
+                permissionCheckIntent);
+
+        adapter.add(mProfileOwnerInstalled);
 
         // Badge related tests
-        mTests.add(mWorkAppVisibleTest);
-        mTests.add(mWorkNotificationBadgedTest);
+        adapter.add(mWorkAppVisibleTest);
+        adapter.add(mWorkNotificationBadgedTest);
+        adapter.add(mWorkStatusBarIconTest);
+        adapter.add(mWorkStatusBarToastTest);
 
         // Settings related tests.
-        mTests.add(mProfileAccountVisibleTest);
-        mTests.add(mDeviceAdminVisibleTest);
-        mTests.add(mCredSettingsVisibleTest);
-        mTests.add(mAppSettingsVisibleTest);
-        mTests.add(mLocationSettingsVisibleTest);
-        mTests.add(mPrintSettingsVisibleTest);
+        adapter.add(mProfileAccountVisibleTest);
+        adapter.add(mDeviceAdminVisibleTest);
+        adapter.add(mCredSettingsVisibleTest);
+        adapter.add(mAppSettingsVisibleTest);
+        adapter.add(mLocationSettingsVisibleTest);
+        adapter.add(mBatterySettingsVisibleTest);
+        adapter.add(mDataUsageSettingsVisibleTest);
+        adapter.add(mPrintSettingsVisibleTest);
 
-        mTests.add(mCrossProfileIntentFiltersTest);
-        mTests.add(mDisableNonMarketTest);
-        mTests.add(mEnableNonMarketTest);
+        adapter.add(mCrossProfileIntentFiltersTest);
+        adapter.add(mDisableNonMarketTest);
+        adapter.add(mEnableNonMarketTest);
+        adapter.add(mIntentFiltersTest);
+        adapter.add(mPermissionLockdownTest);
+        adapter.add(mKeyguardDisabledFeaturesTest);
 
         if (canResolveIntent(ByodHelperActivity.getCaptureImageIntent())) {
             // Capture image intent can be resolved in primary profile, so test.
-            mCrossProfileImageCaptureSupportTest = new TestItem(this,
+            mCrossProfileImageCaptureSupportTest = new DialogTestListItem(this,
                     R.string.provisioning_byod_capture_image_support,
+                    "BYOD_CrossProfileImageCaptureSupportTest",
                     R.string.provisioning_byod_capture_image_support_info,
                     new Intent(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_IMAGE));
-            mTests.add(mCrossProfileImageCaptureSupportTest);
+            adapter.add(mCrossProfileImageCaptureSupportTest);
         } else {
             // Capture image intent cannot be resolved in primary profile, so skip test.
             Toast.makeText(ByodFlowTestActivity.this,
@@ -262,11 +338,12 @@
 
         if (canResolveIntent(ByodHelperActivity.getCaptureVideoIntent())) {
             // Capture video intent can be resolved in primary profile, so test.
-            mCrossProfileVideoCaptureSupportTest = new TestItem(this,
+            mCrossProfileVideoCaptureSupportTest = new DialogTestListItem(this,
                     R.string.provisioning_byod_capture_video_support,
+                    "BYOD_CrossProfileVideoCaptureSupportTest",
                     R.string.provisioning_byod_capture_video_support_info,
                     new Intent(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_VIDEO));
-            mTests.add(mCrossProfileVideoCaptureSupportTest);
+            adapter.add(mCrossProfileVideoCaptureSupportTest);
         } else {
             // Capture video intent cannot be resolved in primary profile, so skip test.
             Toast.makeText(ByodFlowTestActivity.this,
@@ -275,11 +352,12 @@
         }
 
         if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC)) {
-            mDisableNfcBeamTest = new TestItem(this, R.string.provisioning_byod_nfc_beam,
+            mDisableNfcBeamTest = new DialogTestListItem(this, R.string.provisioning_byod_nfc_beam,
+                    "BYOD_DisableNfcBeamTest",
                     R.string.provisioning_byod_nfc_beam_allowed_instruction,
                     new Intent(ByodHelperActivity.ACTION_TEST_NFC_BEAM)) {
                 @Override
-                public void performTest(final ByodFlowTestActivity activity) {
+                public void performTest(final DialogTestListActivity activity) {
                     activity.showManualTestDialog(mDisableNfcBeamTest,
                             new DefaultTestCallback(mDisableNfcBeamTest) {
                         @Override
@@ -289,8 +367,10 @@
                                     ByodHelperActivity.ACTION_TEST_NFC_BEAM);
                             testNfcBeamIntent.putExtra(NfcTestActivity.EXTRA_DISALLOW_BY_POLICY,
                                     true);
-                            TestItem disableNfcBeamTest2 = new TestItem(activity,
+                            DialogTestListItem disableNfcBeamTest2 =
+                                    new DialogTestListItem(activity,
                                     R.string.provisioning_byod_nfc_beam,
+                                    "BYOD_DisableNfcBeamTest",
                                     R.string.provisioning_byod_nfc_beam_disallowed_instruction,
                                     testNfcBeamIntent);
                             // The result should be reflected on the original test.
@@ -300,17 +380,18 @@
                     });
                 }
             };
-            mTests.add(mDisableNfcBeamTest);
+            adapter.add(mDisableNfcBeamTest);
         }
 
         /* TODO: reinstate when bug b/20131958 is fixed
         if (canResolveIntent(ByodHelperActivity.getCaptureAudioIntent())) {
             // Capture audio intent can be resolved in primary profile, so test.
-            mCrossProfileAudioCaptureSupportTest = new TestItem(this,
+            mCrossProfileAudioCaptureSupportTest = new DialogTestListItem(this,
                     R.string.provisioning_byod_capture_audio_support,
+                    "BYOD_CrossProfileAudioCaptureSupportTest",
                     R.string.provisioning_byod_capture_audio_support_info,
                     new Intent(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_AUDIO));
-            mTests.add(mCrossProfileAudioCaptureSupportTest);
+            adapter.add(mCrossProfileAudioCaptureSupportTest);
         } else {
             // Capture audio intent cannot be resolved in primary profile, so skip test.
             Toast.makeText(ByodFlowTestActivity.this,
@@ -320,89 +401,18 @@
         */
     }
 
-    @Override
-    protected void onListItemClick(ListView l, View v, int position, long id) {
-        super.onListItemClick(l, v, position, id);
-        mCurrentTestPosition = position;
-        TestItem test = (TestItem) getListAdapter().getItem(position);
-        test.performTest(this);
-    }
-
     // Return whether the intent can be resolved in the current profile
     private boolean canResolveIntent(Intent intent) {
         return intent.resolveActivity(getPackageManager()) != null;
     }
 
-    private class DefaultTestCallback implements TestItem.TestCallback {
-        final private TestItem mTest;
-
-        public DefaultTestCallback(TestItem test) {
-            mTest = test;
-        }
-
-        @Override
-        public void onPass() {
-            clearRemainingState(mTest);
-            setTestResult(mTest, TestResult.Passed);
-        }
-
-        @Override
-        public void onFail() {
-            clearRemainingState(mTest);
-            setTestResult(mTest, TestResult.Failed);
-        }
-    }
-
-    private void showManualTestDialog(final TestItem test) {
-        showManualTestDialog(test, new DefaultTestCallback(test));
-    }
-
-    private void showManualTestDialog(final TestItem test, final TestItem.TestCallback callback) {
-        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this)
-                .setIcon(android.R.drawable.ic_dialog_info)
-                .setTitle(R.string.provisioning_byod)
-                .setNeutralButton(R.string.provisioning_byod_go, null)
-                .setPositiveButton(R.string.pass_button_text, new AlertDialog.OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialog, int which) {
-                        callback.onPass();
-                    }
-                })
-                .setNegativeButton(R.string.fail_button_text, new AlertDialog.OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialog, int which) {
-                        callback.onFail();
-                    }
-                });
-        View customView = test.getCustomView();
-        if (customView != null) {
-            dialogBuilder.setView(customView);
-        } else {
-            dialogBuilder.setMessage(test.getManualTestInstruction());
-        }
-        final AlertDialog dialog = dialogBuilder.show();
-        // Note: Setting the OnClickListener on the Dialog rather than the Builder, prevents the
-        // dialog being dismissed on onClick.
-        dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                try {
-                    ByodFlowTestActivity.this.startActivity(test.getManualTestIntent());
-                } catch (ActivityNotFoundException e) {
-                    Toast.makeText(ByodFlowTestActivity.this,
-                            "Cannot start " + test.getManualTestIntent(), Toast.LENGTH_LONG).show();
-                    setTestResult(test, TestResult.Failed);
-                    dialog.dismiss();
-                }
-            }
-        });
-    }
-
-    private void clearRemainingState(final TestItem test) {
+    @Override
+    protected void clearRemainingState(final DialogTestListItem test) {
+        super.clearRemainingState(test);
         if (WorkNotificationTestActivity.ACTION_WORK_NOTIFICATION.equals(
                 test.getManualTestIntent().getAction())) {
             try {
-                ByodFlowTestActivity.this.startActivity(new Intent(
+                startActivity(new Intent(
                         WorkNotificationTestActivity.ACTION_CLEAR_WORK_NOTIFICATION));
             } catch (ActivityNotFoundException e) {
                 // User shouldn't run this test before work profile is set up.
@@ -410,29 +420,15 @@
         }
     }
 
-    private void setTestResult(TestItem test, TestResult result) {
-        test.setPassFailState(result);
-
-        boolean testSucceeds = true;
-        for(TestItem aTest : mTests) {
-            testSucceeds &= (aTest.getPassFailState() == TestResult.Passed);
-        }
-        getPassButton().setEnabled(testSucceeds);
-        mTestListAdapter.notifyDataSetChanged();
-
-        this.getListView().smoothScrollToPosition(mCurrentTestPosition + 1);
-    }
-
     private void startByodProvisioning() {
         Intent sending = new Intent(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE);
-        sending.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME,
-                mAdminReceiverComponent.getPackageName());
-        sending.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mAdminReceiverComponent);
+        sending.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME,
+                mAdminReceiverComponent);
 
         if (sending.resolveActivity(getPackageManager()) != null) {
             // ManagedProvisioning must be started with startActivityForResult, but we don't
             // care about the result, so passing 0 as a requestCode
-            startActivityForResult(sending, 0);
+            startActivityForResult(sending, REQUEST_MANAGED_PROVISIONING);
         } else {
             showToast(R.string.provisioning_byod_disabled);
         }
@@ -441,11 +437,11 @@
     private void queryProfileOwner(boolean showToast) {
         try {
             Intent intent = new Intent(ByodHelperActivity.ACTION_QUERY_PROFILE_OWNER);
-            startActivityForResult(intent, REQUEST_STATUS);
+            startActivityForResult(intent, REQUEST_PROFILE_OWNER_STATUS);
         }
         catch (ActivityNotFoundException e) {
             Log.d(TAG, "queryProfileOwner: ActivityNotFoundException", e);
-            setTestResult(mProfileOwnerInstalled, TestResult.Failed);
+            setTestResult(mProfileOwnerInstalled, TestResult.TEST_RESULT_FAILED);
             if (showToast) {
                 showToast(R.string.provisioning_byod_no_activity);
             }
@@ -463,140 +459,48 @@
         }
     }
 
+    private void checkIntentFilters() {
+        try {
+            // We disable the ByodHelperActivity in the primary profile. So, this intent
+            // will be handled by the ByodHelperActivity in the managed profile.
+            Intent intent = new Intent(ByodHelperActivity.ACTION_CHECK_INTENT_FILTERS);
+            startActivityForResult(intent, REQUEST_INTENT_FILTERS_STATUS);
+        } catch (ActivityNotFoundException e) {
+            Log.d(TAG, "checkIntentFilters: ActivityNotFoundException", e);
+            setTestResult(mIntentFiltersTest, TestResult.TEST_RESULT_FAILED);
+            showToast(R.string.provisioning_byod_no_activity);
+        }
+    }
+
+    private void handleIntentFiltersStatus(int resultCode) {
+        // we use the resultCode from ByodHelperActivity in the managed profile to know if certain
+        // intents fired from the managed profile are forwarded.
+        final boolean intentFiltersSetForManagedIntents = (resultCode == RESULT_OK);
+        // Since the ByodFlowTestActivity is running in the primary profile, we directly use
+        // the IntentFiltersTestHelper to know if certain intents fired from the primary profile
+        // are forwarded.
+        final boolean intentFiltersSetForPrimaryIntents =
+                new IntentFiltersTestHelper(this).checkCrossProfileIntentFilters(
+                        IntentFiltersTestHelper.FLAG_INTENTS_FROM_PRIMARY);
+        final boolean intentFiltersSet =
+                intentFiltersSetForPrimaryIntents & intentFiltersSetForManagedIntents;
+        setTestResult(mIntentFiltersTest,
+                intentFiltersSet ? TestResult.TEST_RESULT_PASSED : TestResult.TEST_RESULT_FAILED);
+    }
+
     private void disableComponent() {
         // Disable app components in the current profile, so only the counterpart in the other profile
         // can respond (via cross-profile intent filter)
-        getPackageManager().setComponentEnabledSetting(new ComponentName(
-                this, ByodHelperActivity.class),
-                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
-                PackageManager.DONT_KILL_APP);
-        getPackageManager().setComponentEnabledSetting(new ComponentName(
-                this, WorkNotificationTestActivity.class),
-                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
-                PackageManager.DONT_KILL_APP);
-    }
-
-    private void showToast(int messageId) {
-        String message = getString(messageId);
-        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
-    }
-
-    enum TestResult {
-        Unknown, Failed, Passed
-    }
-
-    static class TestItem {
-
-        public interface TestCallback {
-            void onPass();
-            void onFail();
-        }
-
-        private String mDisplayName;
-        private TestResult mPassed;
-        private boolean mManualTest;
-        private String mManualInstruction;
-        private Intent mManualIntent;
-
-        public TestItem(Context context, int nameResId) {
-            mDisplayName = context.getString(nameResId);
-            mPassed = TestResult.Unknown;
-            mManualTest = false;
-        }
-
-        public void performTest(ByodFlowTestActivity activity) {
-            if (isManualTest()) {
-                activity.showManualTestDialog(this);
-            }
-        }
-
-        public TestItem(Context context, int nameResId, int testInstructionResId, Intent testIntent) {
-            mDisplayName = context.getString(nameResId);
-            mPassed = TestResult.Unknown;
-            mManualTest = true;
-            mManualInstruction = context.getString(testInstructionResId);
-            mManualIntent = testIntent;
-        }
-
-        @Override
-        public String toString() {
-            return mDisplayName;
-        }
-
-        TestResult getPassFailState() {
-            return mPassed;
-        }
-
-        void setPassFailState(TestResult state) {
-            mPassed = state;
-        }
-
-        public boolean isManualTest() {
-            return mManualTest;
-        }
-
-        public String getManualTestInstruction() {
-            return mManualInstruction;
-        }
-
-        public Intent getManualTestIntent() {
-            return mManualIntent;
-        }
-
-        public View getCustomView() {
-            return null;
-        }
-    }
-
-    static class TestItemWithIcon extends TestItem {
-
-        private int mImageResId;
-        private Context mContext;
-
-        public TestItemWithIcon(Context context, int nameResId, int testInstructionResId,
-                Intent testIntent, int imageResId) {
-            super(context, nameResId, testInstructionResId, testIntent);
-            mContext = context;
-            mImageResId = imageResId;
-        }
-
-        @Override
-        public View getCustomView() {
-            LayoutInflater layoutInflater = LayoutInflater.from(mContext);
-            View view = layoutInflater.inflate(R.layout.byod_custom_view,
-                    null /* root */);
-            ((ImageView) view.findViewById(R.id.sample_icon)).setImageResource(mImageResId);
-            ((TextView) view.findViewById(R.id.message)).setText(getManualTestInstruction());
-            return view;
-        }
-    }
-
-    static class TestAdapter extends ArrayAdapter<TestItem> {
-
-        public TestAdapter(Context context) {
-            super(context, android.R.layout.simple_list_item_1);
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            TextView view = (TextView) super.getView(position, convertView, parent);
-
-            TestItem item = getItem(position);
-            int backgroundResource = 0;
-            int iconResource = 0;
-            if (item.getPassFailState() == TestResult.Passed) {
-                backgroundResource = R.drawable.test_pass_gradient;
-                iconResource = R.drawable.fs_good;
-            } else if (item.getPassFailState() == TestResult.Failed){
-                backgroundResource = R.drawable.test_fail_gradient;
-                iconResource = R.drawable.fs_error;
-            }
-            view.setBackgroundResource(backgroundResource);
-            view.setPadding(10, 0, 10, 0);
-            view.setCompoundDrawablePadding(10);
-            view.setCompoundDrawablesWithIntrinsicBounds(0, 0, iconResource, 0);
-
-            return view;
+        final String[] components = {
+            ByodHelperActivity.class.getName(),
+            WorkNotificationTestActivity.class.getName(),
+            WorkStatusTestActivity.class.getName(),
+            PermissionLockdownTestActivity.ACTIVITY_ALIAS
+        };
+        for (String component : components) {
+            getPackageManager().setComponentEnabledSetting(new ComponentName(this, component),
+                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+                    PackageManager.DONT_KILL_APP);
         }
     }
 }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodHelperActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodHelperActivity.java
index 800137a..3fec414 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodHelperActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodHelperActivity.java
@@ -39,7 +39,6 @@
 import java.util.ArrayList;
 
 import com.android.cts.verifier.R;
-import com.android.cts.verifier.managedprovisioning.ByodFlowTestActivity.TestResult;
 import com.android.cts.verifier.managedprovisioning.ByodPresentMediaDialog.DialogCallback;
 
 /**
@@ -68,14 +67,25 @@
     public static final String ACTION_CAPTURE_AND_CHECK_VIDEO = "com.android.cts.verifier.managedprovisioning.BYOD_CAPTURE_AND_CHECK_VIDEO";
     // Primage -> managed intent: request to capture and check an audio recording
     public static final String ACTION_CAPTURE_AND_CHECK_AUDIO = "com.android.cts.verifier.managedprovisioning.BYOD_CAPTURE_AND_CHECK_AUDIO";
+    public static final String ACTION_KEYGUARD_DISABLED_FEATURES =
+            "com.android.cts.verifier.managedprovisioning.BYOD_KEYGUARD_DISABLED_FEATURES";
+    public static final String ACTION_LOCKNOW =
+            "com.android.cts.verifier.managedprovisioning.BYOD_LOCKNOW";
     public static final String ACTION_TEST_NFC_BEAM = "com.android.cts.verifier.managedprovisioning.TEST_NFC_BEAM";
 
     public static final String EXTRA_PROVISIONED = "extra_provisioned";
+    public static final String EXTRA_PARAMETER_1 = "extra_parameter_1";
 
     // Primary -> managed intent: set unknown sources restriction and install package
     public static final String ACTION_INSTALL_APK = "com.android.cts.verifier.managedprovisioning.BYOD_INSTALL_APK";
     public static final String EXTRA_ALLOW_NON_MARKET_APPS = INSTALL_NON_MARKET_APPS;
 
+    // Primary -> managed intent: check if the required cross profile intent filters are set.
+    public static final String ACTION_CHECK_INTENT_FILTERS =
+            "com.android.cts.verifier.managedprovisioning.action.CHECK_INTENT_FILTERS";
+
+    public static final int RESULT_FAILED = RESULT_FIRST_USER;
+
     private static final int REQUEST_INSTALL_PACKAGE = 1;
     private static final int REQUEST_IMAGE_CAPTURE = 2;
     private static final int REQUEST_VIDEO_CAPTURE = 3;
@@ -143,6 +153,12 @@
 
             // Not yet ready to finish- wait until the result comes back
             return;
+            // Queried by CtsVerifier in the primary side using startActivityForResult.
+        } else if (action.equals(ACTION_CHECK_INTENT_FILTERS)) {
+            final boolean intentFiltersSetForManagedIntents =
+                    new IntentFiltersTestHelper(this).checkCrossProfileIntentFilters(
+                            IntentFiltersTestHelper.FLAG_INTENTS_FROM_MANAGED);
+            setResult(intentFiltersSetForManagedIntents? RESULT_OK : RESULT_FAILED, null);
         } else if (action.equals(ACTION_CAPTURE_AND_CHECK_IMAGE)) {
             Intent captureImageIntent = getCaptureImageIntent();
             mImageUri = getTempUri("image.jpg");
@@ -177,6 +193,14 @@
                 finish();
             }
             return;
+        } else if (ACTION_KEYGUARD_DISABLED_FEATURES.equals(action)) {
+            final int value = intent.getIntExtra(EXTRA_PARAMETER_1,
+                    DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_NONE);
+            ComponentName admin = DeviceAdminTestReceiver.getReceiverComponentName();
+            mDevicePolicyManager.setKeyguardDisabledFeatures(admin, value);
+        } else if (ACTION_LOCKNOW.equals(action)) {
+            mDevicePolicyManager.lockNow();
+            setResult(RESULT_OK);
         } else if (action.equals(ACTION_TEST_NFC_BEAM)) {
             Intent testNfcBeamIntent = new Intent(this, NfcTestActivity.class);
             testNfcBeamIntent.putExtras(intent);
@@ -263,6 +287,10 @@
         return new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
     }
 
+    public static Intent createLockIntent() {
+        return new Intent(ACTION_LOCKNOW);
+    }
+
     private Uri getTempUri(String fileName) {
         final File file = new File(getFilesDir() + File.separator + "images"
                 + File.separator + fileName);
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceAdminTestReceiver.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceAdminTestReceiver.java
index 15349ab..008091b 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceAdminTestReceiver.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceAdminTestReceiver.java
@@ -22,9 +22,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.content.pm.PackageManager;
 import android.util.Log;
-import android.widget.Toast;
 
 /**
  * Profile owner receiver for BYOD flow test.
@@ -32,6 +30,16 @@
  */
 public class DeviceAdminTestReceiver extends DeviceAdminReceiver {
         private static final String TAG = "DeviceAdminTestReceiver";
+        private static final String DEVICE_OWNER_PKG =
+                "com.android.cts.verifier";
+        private static final String ADMIN_RECEIVER_TEST_CLASS =
+                DEVICE_OWNER_PKG + ".managedprovisioning.DeviceAdminTestReceiver";
+        private static final ComponentName RECEIVER_COMPONENT_NAME = new ComponentName(
+                DEVICE_OWNER_PKG, ADMIN_RECEIVER_TEST_CLASS);
+
+        public static ComponentName getReceiverComponentName() {
+            return RECEIVER_COMPONENT_NAME;
+        }
 
         @Override
         public void onProfileProvisioningComplete(Context context, Intent intent) {
@@ -49,13 +57,21 @@
             filter.addAction(ByodHelperActivity.ACTION_QUERY_PROFILE_OWNER);
             filter.addAction(ByodHelperActivity.ACTION_REMOVE_PROFILE_OWNER);
             filter.addAction(ByodHelperActivity.ACTION_INSTALL_APK);
+            filter.addAction(ByodHelperActivity.ACTION_CHECK_INTENT_FILTERS);
             filter.addAction(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_IMAGE);
             filter.addAction(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_VIDEO);
             filter.addAction(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_AUDIO);
+            filter.addAction(ByodHelperActivity.ACTION_KEYGUARD_DISABLED_FEATURES);
+            filter.addAction(ByodHelperActivity.ACTION_LOCKNOW);
             filter.addAction(ByodHelperActivity.ACTION_TEST_NFC_BEAM);
             filter.addAction(CrossProfileTestActivity.ACTION_CROSS_PROFILE);
             filter.addAction(WorkNotificationTestActivity.ACTION_WORK_NOTIFICATION);
+            filter.addAction(WorkNotificationTestActivity.ACTION_WORK_NOTIFICATION_ON_LOCKSCREEN);
             filter.addAction(WorkNotificationTestActivity.ACTION_CLEAR_WORK_NOTIFICATION);
+            filter.addAction(WorkStatusTestActivity.ACTION_WORK_STATUS_TOAST);
+            filter.addAction(WorkStatusTestActivity.ACTION_WORK_STATUS_ICON);
+            filter.addAction(
+                    PermissionLockdownTestActivity.ACTION_MANAGED_PROFILE_CHECK_PERMISSION_LOCKDOWN);
             dpm.addCrossProfileIntentFilter(getWho(context), filter,
                     DevicePolicyManager.FLAG_MANAGED_CAN_ACCESS_PARENT);
 
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceOwnerNegativeTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceOwnerNegativeTestActivity.java
new file mode 100644
index 0000000..c7e785c
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceOwnerNegativeTestActivity.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.managedprovisioning;
+
+import android.content.Intent;
+import android.database.DataSetObserver;
+import android.os.Bundle;
+
+import com.android.cts.verifier.ArrayTestListAdapter;
+import com.android.cts.verifier.IntentDrivenTestActivity;
+import com.android.cts.verifier.IntentDrivenTestActivity.ButtonInfo;
+import com.android.cts.verifier.IntentDrivenTestActivity.TestInfo;
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.TestListAdapter.TestListItem;
+
+/**
+ * Activity that lists all device owner negative tests.
+ */
+public class DeviceOwnerNegativeTestActivity extends PassFailButtons.TestListActivity {
+
+    private static final String ACTION_PROVISION_MANAGED_DEVICE
+        = "com.android.managedprovisioning.ACTION_PROVISION_MANAGED_DEVICE";
+    private static final Intent PROVISION_DEVICE_INTENT =
+            new Intent(ACTION_PROVISION_MANAGED_DEVICE);
+
+    private static final String DEVICE_OWNER_NEGATIVE_TEST = "DEVICE_OWNER_PROVISIONING_NEGATIVE";
+    private static final TestInfo DEVICE_OWNER_NEGATIVE_TEST_INFO = new TestInfo(
+                    DEVICE_OWNER_NEGATIVE_TEST,
+                    R.string.device_owner_negative_test,
+                    R.string.device_owner_negative_test_info,
+                    new ButtonInfo(
+                            R.string.start_device_owner_provisioning_button,
+                            PROVISION_DEVICE_INTENT));
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_list);
+        setInfoResources(R.string.device_owner_provisioning_tests,
+                R.string.device_owner_provisioning_tests_info, 0);
+        setPassFailButtonClickListeners();
+
+        final ArrayTestListAdapter adapter = new ArrayTestListAdapter(this);
+        adapter.add(TestListItem.newCategory(this, R.string.device_owner_provisioning_category));
+
+        Intent startTestIntent = new Intent(this, IntentDrivenTestActivity.class)
+                    .putExtra(IntentDrivenTestActivity.EXTRA_ID,
+                            DEVICE_OWNER_NEGATIVE_TEST_INFO.getTestId())
+                    .putExtra(IntentDrivenTestActivity.EXTRA_TITLE,
+                            DEVICE_OWNER_NEGATIVE_TEST_INFO.getTitle())
+                    .putExtra(IntentDrivenTestActivity.EXTRA_INFO,
+                            DEVICE_OWNER_NEGATIVE_TEST_INFO.getInfoText())
+                    .putExtra(IntentDrivenTestActivity.EXTRA_BUTTONS,
+                            DEVICE_OWNER_NEGATIVE_TEST_INFO.getButtons());
+
+
+        adapter.add(TestListItem.newTest(this, DEVICE_OWNER_NEGATIVE_TEST_INFO.getTitle(),
+                DEVICE_OWNER_NEGATIVE_TEST_INFO.getTestId(), startTestIntent, null));
+
+        adapter.registerDataSetObserver(new DataSetObserver() {
+            @Override
+            public void onChanged() {
+                updatePassButton();
+            }
+        });
+
+        setTestListAdapter(adapter);
+    }
+
+    /**
+     * Enable Pass Button when the all tests passed.
+     */
+    private void updatePassButton() {
+        getPassButton().setEnabled(mAdapter.allTestsPassed());
+    }
+}
+
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceOwnerPositiveTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceOwnerPositiveTestActivity.java
new file mode 100644
index 0000000..a6a5e5a
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceOwnerPositiveTestActivity.java
@@ -0,0 +1,333 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.managedprovisioning;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.database.DataSetObserver;
+import android.os.Bundle;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.util.Log;
+import android.view.View;
+import android.view.View.OnClickListener;
+
+import com.android.cts.verifier.ArrayTestListAdapter;
+import com.android.cts.verifier.IntentDrivenTestActivity;
+import com.android.cts.verifier.IntentDrivenTestActivity.ButtonInfo;
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.TestListAdapter.TestListItem;
+import com.android.cts.verifier.TestResult;
+
+/**
+ * Activity that lists all positive device owner tests. Requires the following adb command be issued
+ * by the user prior to starting the tests:
+ *
+ * adb shell dpm set-device-owner
+ *  'com.android.cts.verifier/com.android.cts.verifier.managedprovisioning.DeviceAdminTestReceiver'
+ */
+public class DeviceOwnerPositiveTestActivity extends PassFailButtons.TestListActivity {
+    private static final String TAG = "DeviceOwnerPositiveTestActivity";
+
+    static final String EXTRA_COMMAND = "extra-command";
+    static final String EXTRA_TEST_ID = "extra-test-id";
+    static final String COMMAND_SET_POLICY = "set-policy";
+    static final String EXTRA_POLICY = "extra-policy";
+    static final String EXTRA_PARAMETER_1 = "extra_parameter_1";
+    static final String EXTRA_PARAMETER_2 = "extra_parameter_2";
+    static final String COMMAND_ADD_USER_RESTRICTION = "add-user-restriction";
+    static final String COMMAND_CLEAR_USER_RESTRICTION = "clear-user-restriction";
+    static final String EXTRA_RESTRICTION = "extra-restriction";
+    static final String COMMAND_TEAR_DOWN = "tear-down";
+    static final String COMMAND_CHECK_DEVICE_OWNER = "check-device-owner";
+    static final String COMMAND_SET_GLOBAL_SETTING = "set-global-setting";
+    static final String COMMAND_SET_STATUSBAR_DISABLED = "set-statusbar-disabled";
+    static final String COMMAND_SET_KEYGUARD_DISABLED = "set-keyguard-disabled";
+    static final String COMMAND_CHECK_PERMISSION_LOCKDOWN = "check-permission-lockdown";
+    static final String EXTRA_SETTING = "extra-setting";
+
+    private static final String CHECK_DEVICE_OWNER_TEST_ID = "CHECK_DEVICE_OWNER";
+    private static final String DEVICE_ADMIN_SETTINGS_ID = "DEVICE_ADMIN_SETTINGS";
+    private static final String WIFI_LOCKDOWN_TEST_ID = WifiLockdownTestActivity.class.getName();
+    private static final String DISABLE_STATUS_BAR_TEST_ID = "DISABLE_STATUS_BAR";
+    private static final String DISABLE_KEYGUARD_TEST_ID = "DISABLE_KEYGUARD";
+    private static final String CHECK_PERMISSION_LOCKDOWN_TEST_ID =
+            PermissionLockdownTestActivity.class.getName();
+    private static final String DISALLOW_CONFIG_BT_ID = "DISALLOW_CONFIG_BT";
+    private static final String DISALLOW_CONFIG_WIFI_ID = "DISALLOW_CONFIG_WIFI";
+    private static final String REMOVE_DEVICE_OWNER_TEST_ID = "REMOVE_DEVICE_OWNER";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.positive_device_owner);
+        setInfoResources(R.string.device_owner_positive_tests,
+                R.string.device_owner_positive_tests_info, 0);
+        setPassFailButtonClickListeners();
+
+        final ArrayTestListAdapter adapter = new ArrayTestListAdapter(this);
+        adapter.add(TestListItem.newCategory(this, R.string.device_owner_positive_category));
+
+        addTestsToAdapter(adapter);
+
+        adapter.registerDataSetObserver(new DataSetObserver() {
+            @Override
+            public void onChanged() {
+                updatePassButton();
+            }
+        });
+
+        setTestListAdapter(adapter);
+
+        View setDeviceOwnerButton = findViewById(R.id.set_device_owner_button);
+        setDeviceOwnerButton.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                new AlertDialog.Builder(
+                        DeviceOwnerPositiveTestActivity.this)
+                        .setIcon(android.R.drawable.ic_dialog_info)
+                        .setTitle(R.string.set_device_owner_dialog_title)
+                        .setMessage(R.string.set_device_owner_dialog_text)
+                        .setPositiveButton(android.R.string.ok, null)
+                        .show();
+            }
+        });
+
+    }
+
+    @Override
+    public void finish() {
+        // Pass and fail buttons are known to call finish() when clicked, and this is when we want
+        // to remove the device owner.
+        startActivity(createTearDownIntent());
+        super.finish();
+    }
+
+    /**
+     * Enable Pass Button when all tests passed.
+     */
+    private void updatePassButton() {
+        getPassButton().setEnabled(mAdapter.allTestsPassed());
+    }
+
+    private void addTestsToAdapter(final ArrayTestListAdapter adapter) {
+        adapter.add(createTestItem(this, CHECK_DEVICE_OWNER_TEST_ID,
+                R.string.device_owner_check_device_owner_test,
+                new Intent(this, CommandReceiver.class)
+                        .putExtra(EXTRA_COMMAND, COMMAND_CHECK_DEVICE_OWNER)
+                        ));
+
+        // device admin settings
+        adapter.add(createInteractiveTestItem(this, DEVICE_ADMIN_SETTINGS_ID,
+                R.string.device_owner_device_admin_visible,
+                R.string.device_owner_device_admin_visible_info,
+                new ButtonInfo(
+                        R.string.device_owner_settings_go,
+                        new Intent(Settings.ACTION_SECURITY_SETTINGS))));
+
+        PackageManager packageManager = getPackageManager();
+        if (packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)) {
+            // WiFi Lock down tests
+            adapter.add(createTestItem(this, WIFI_LOCKDOWN_TEST_ID,
+                    R.string.device_owner_wifi_lockdown_test,
+                    new Intent(this, WifiLockdownTestActivity.class)));
+
+            // DISALLOW_CONFIG_WIFI
+            adapter.add(createInteractiveTestItem(this, DISALLOW_CONFIG_WIFI_ID,
+                    R.string.device_owner_disallow_config_wifi,
+                    R.string.device_owner_disallow_config_wifi_info,
+                    new ButtonInfo[] {
+                            new ButtonInfo(
+                                    R.string.device_owner_user_restriction_set,
+                                    createSetUserRestrictionIntent(
+                                            UserManager.DISALLOW_CONFIG_WIFI)),
+                            new ButtonInfo(
+                                    R.string.device_owner_settings_go,
+                                    new Intent(Settings.ACTION_WIFI_SETTINGS))}));
+        }
+
+        // DISALLOW_CONFIG_BLUETOOTH
+        if (packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {
+            adapter.add(createInteractiveTestItem(this, DISALLOW_CONFIG_BT_ID,
+                    R.string.device_owner_disallow_config_bt,
+                    R.string.device_owner_disallow_config_bt_info,
+                    new ButtonInfo[] {
+                            new ButtonInfo(
+                                    R.string.device_owner_user_restriction_set,
+                                    createSetUserRestrictionIntent(
+                                            UserManager.DISALLOW_CONFIG_BLUETOOTH)),
+                            new ButtonInfo(
+                                    R.string.device_owner_settings_go,
+                                    new Intent(Settings.ACTION_BLUETOOTH_SETTINGS))}));
+        }
+
+        // setStatusBarDisabled
+        adapter.add(createInteractiveTestItem(this, DISABLE_STATUS_BAR_TEST_ID,
+                R.string.device_owner_disable_statusbar_test,
+                R.string.device_owner_disable_statusbar_test_info,
+                new ButtonInfo[] {
+                        new ButtonInfo(
+                                R.string.device_owner_disable_statusbar_button,
+                                createDeviceOwnerIntentWithBooleanParameter(
+                                        COMMAND_SET_STATUSBAR_DISABLED, true)),
+                        new ButtonInfo(
+                                R.string.device_owner_reenable_statusbar_button,
+                                createDeviceOwnerIntentWithBooleanParameter(
+                                        COMMAND_SET_STATUSBAR_DISABLED, false))}));
+
+        // setKeyguardDisabled
+        adapter.add(createInteractiveTestItem(this, DISABLE_KEYGUARD_TEST_ID,
+                R.string.device_owner_disable_keyguard_test,
+                R.string.device_owner_disable_keyguard_test_info,
+                new ButtonInfo[] {
+                        new ButtonInfo(
+                                R.string.device_owner_disable_keyguard_button,
+                                createDeviceOwnerIntentWithBooleanParameter(
+                                        COMMAND_SET_KEYGUARD_DISABLED, true)),
+                        new ButtonInfo(
+                                R.string.device_owner_reenable_keyguard_button,
+                                createDeviceOwnerIntentWithBooleanParameter(
+                                        COMMAND_SET_KEYGUARD_DISABLED, false))}));
+
+        // setPermissionGrantState
+        adapter.add(createTestItem(this, CHECK_PERMISSION_LOCKDOWN_TEST_ID,
+                R.string.device_profile_owner_permission_lockdown_test,
+                new Intent(PermissionLockdownTestActivity.ACTION_CHECK_PERMISSION_LOCKDOWN)));
+
+        // removeDeviceOwner
+        adapter.add(createInteractiveTestItem(this, REMOVE_DEVICE_OWNER_TEST_ID,
+                R.string.device_owner_remove_device_owner_test,
+                R.string.device_owner_remove_device_owner_test_info,
+                new ButtonInfo(
+                        R.string.remove_device_owner_button,
+                        createTearDownIntent())));
+    }
+
+    static TestListItem createInteractiveTestItem(Activity activity, String id, int titleRes,
+            int infoRes, ButtonInfo buttonInfo) {
+        return createInteractiveTestItem(activity, id, titleRes, infoRes,
+                new ButtonInfo[] { buttonInfo });
+    }
+
+    static TestListItem createInteractiveTestItem(Activity activity, String id, int titleRes,
+            int infoRes, ButtonInfo[] buttonInfos) {
+        return TestListItem.newTest(activity, titleRes,
+                id, new Intent(activity, IntentDrivenTestActivity.class)
+                .putExtra(IntentDrivenTestActivity.EXTRA_ID, id)
+                .putExtra(IntentDrivenTestActivity.EXTRA_TITLE, titleRes)
+                .putExtra(IntentDrivenTestActivity.EXTRA_INFO, infoRes)
+                .putExtra(IntentDrivenTestActivity.EXTRA_BUTTONS, buttonInfos),
+                null);
+    }
+
+    static TestListItem createTestItem(Activity activity, String id, int titleRes,
+            Intent intent) {
+        return TestListItem.newTest(activity, titleRes, id, intent.putExtra(EXTRA_TEST_ID, id),
+                null);
+    }
+
+    private Intent createTearDownIntent() {
+        return new Intent(this, CommandReceiver.class)
+                .putExtra(EXTRA_COMMAND, COMMAND_TEAR_DOWN);
+    }
+
+    private Intent createDeviceOwnerIntentWithBooleanParameter(String command, boolean value) {
+        return new Intent(this, CommandReceiver.class)
+                .putExtra(EXTRA_COMMAND, command)
+                .putExtra(EXTRA_PARAMETER_1, value);
+    }
+
+    private Intent createSetUserRestrictionIntent(String restriction) {
+        return new Intent(this, CommandReceiver.class)
+                .putExtra(EXTRA_COMMAND, COMMAND_ADD_USER_RESTRICTION)
+                .putExtra(EXTRA_RESTRICTION, restriction);
+    }
+
+    public static class CommandReceiver extends Activity {
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            Intent intent = getIntent();
+            String command = intent.getStringExtra(EXTRA_COMMAND);
+            try {
+                DevicePolicyManager dpm = (DevicePolicyManager)
+                        getSystemService(Context.DEVICE_POLICY_SERVICE);
+                ComponentName admin = DeviceAdminTestReceiver.getReceiverComponentName();
+                Log.i(TAG, "Command: " + command);
+
+                if (COMMAND_ADD_USER_RESTRICTION.equals(command)) {
+                    String restrictionKey = intent.getStringExtra(EXTRA_RESTRICTION);
+                    dpm.addUserRestriction(admin, restrictionKey);
+                    Log.i(TAG, "Added user restriction " + restrictionKey);
+                } else if (COMMAND_CLEAR_USER_RESTRICTION.equals(command)) {
+                    String restrictionKey = intent.getStringExtra(EXTRA_RESTRICTION);
+                    dpm.clearUserRestriction(admin, restrictionKey);
+                    Log.i(TAG, "Cleared user restriction " + restrictionKey);
+                } else if (COMMAND_TEAR_DOWN.equals(command)) {
+                    tearDown(dpm, admin);
+                } else if (COMMAND_SET_GLOBAL_SETTING.equals(command)) {
+                    final String setting = intent.getStringExtra(EXTRA_SETTING);
+                    final String value = intent.getStringExtra(EXTRA_PARAMETER_1);
+                    dpm.setGlobalSetting(admin, setting, value);
+                } else if (COMMAND_SET_STATUSBAR_DISABLED.equals(command)) {
+                    final boolean value = intent.getBooleanExtra(EXTRA_PARAMETER_1, false);
+                    dpm.setStatusBarDisabled(admin, value);
+                } else if (COMMAND_SET_KEYGUARD_DISABLED.equals(command)) {
+                    final boolean value = intent.getBooleanExtra(EXTRA_PARAMETER_1, false);
+                    if (value) {
+                        dpm.resetPassword(null, 0);
+                    }
+                    dpm.setKeyguardDisabled(admin, value);
+                } else if (COMMAND_CHECK_DEVICE_OWNER.equals(command)) {
+                    if (dpm.isDeviceOwnerApp(getPackageName())) {
+                        TestResult.setPassedResult(this, intent.getStringExtra(EXTRA_TEST_ID),
+                                null, null);
+                    } else {
+                        TestResult.setFailedResult(this, intent.getStringExtra(EXTRA_TEST_ID),
+                                getString(R.string.device_owner_incorrect_device_owner), null);
+                    }
+                } else {
+                    Log.e(TAG, "Invalid command: " + command);
+                }
+            } catch (Exception e) {
+                Log.e(TAG, "Command " + command + " failed with exception " + e);
+            } finally {
+                // No matter what happened, don't let the activity run
+                finish();
+            }
+        }
+
+        private void tearDown(DevicePolicyManager dpm, ComponentName admin) {
+            if (dpm == null || !dpm.isDeviceOwnerApp(getPackageName())) {
+                return;
+            }
+
+            dpm.setStatusBarDisabled(admin, false);
+            dpm.setKeyguardDisabled(admin, false);
+            dpm.clearUserRestriction(admin, UserManager.DISALLOW_CONFIG_BLUETOOTH);
+            dpm.clearUserRestriction(admin, UserManager.DISALLOW_CONFIG_WIFI);
+            dpm.clearDeviceOwnerApp(getPackageName());
+        }
+    }
+}
+
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceOwnerTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceOwnerTestActivity.java
deleted file mode 100644
index 7cb3825..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/DeviceOwnerTestActivity.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package com.android.cts.verifier.managedprovisioning;
-
-import android.app.AlertDialog;
-import android.app.admin.DevicePolicyManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.database.DataSetObserver;
-import android.os.Bundle;
-import android.provider.Settings;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.View.OnClickListener;
-import android.widget.ArrayAdapter;
-import android.widget.ListView;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.android.cts.verifier.ArrayTestListAdapter;
-import com.android.cts.verifier.IntentDrivenTestActivity;
-import com.android.cts.verifier.IntentDrivenTestActivity.ButtonInfo;
-import com.android.cts.verifier.IntentDrivenTestActivity.TestInfo;
-import com.android.cts.verifier.PassFailButtons;
-import com.android.cts.verifier.R;
-import com.android.cts.verifier.TestListAdapter.TestListItem;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Activity that lists all device owner provisioning tests.
- */
-public class DeviceOwnerTestActivity extends PassFailButtons.TestListActivity {
-
-    private static final String ACTION_PROVISION_MANAGED_DEVICE
-        = "com.android.managedprovisioning.ACTION_PROVISION_MANAGED_DEVICE";
-    private static final Intent PROVISION_DEVICE_INTENT =
-            new Intent(ACTION_PROVISION_MANAGED_DEVICE);
-
-    private static final String DEVICE_OWNER_NEGATIVE_TEST = "DEVICE_OWNER_PROVISIONING_NEGATIVE";
-    private static final TestInfo DEVICE_OWNER_NEGATIVE_TEST_INFO = new TestInfo(
-                    DEVICE_OWNER_NEGATIVE_TEST,
-                    R.string.device_owner_negative_test,
-                    R.string.device_owner_negative_test_info,
-                    new ButtonInfo(
-                            R.string.start_device_owner_provisioning_button,
-                            PROVISION_DEVICE_INTENT));
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.pass_fail_list);
-        setInfoResources(R.string.device_owner_provisioning_tests,
-                R.string.device_owner_provisioning_tests_info, 0);
-        setPassFailButtonClickListeners();
-
-        final ArrayTestListAdapter adapter = new ArrayTestListAdapter(this);
-        adapter.add(TestListItem.newCategory(this, R.string.device_owner_provisioning_category));
-
-        Intent startTestIntent = new Intent(this, IntentDrivenTestActivity.class)
-                    .putExtra(IntentDrivenTestActivity.EXTRA_ID,
-                            DEVICE_OWNER_NEGATIVE_TEST_INFO.getTestId())
-                    .putExtra(IntentDrivenTestActivity.EXTRA_TITLE,
-                            DEVICE_OWNER_NEGATIVE_TEST_INFO.getTitle())
-                    .putExtra(IntentDrivenTestActivity.EXTRA_INFO,
-                            DEVICE_OWNER_NEGATIVE_TEST_INFO.getInfoText())
-                    .putExtra(IntentDrivenTestActivity.EXTRA_BUTTONS,
-                            DEVICE_OWNER_NEGATIVE_TEST_INFO.getButtons());
-
-
-        adapter.add(TestListItem.newTest(this, DEVICE_OWNER_NEGATIVE_TEST_INFO.getTitle(),
-                DEVICE_OWNER_NEGATIVE_TEST_INFO.getTestId(), startTestIntent, null));
-
-        adapter.registerDataSetObserver(new DataSetObserver() {
-            @Override
-            public void onChanged() {
-                updatePassButton();
-            }
-        });
-
-        setTestListAdapter(adapter);
-    }
-
-    /**
-     * Enable Pass Button when the all tests passed.
-     */
-    private void updatePassButton() {
-        getPassButton().setEnabled(mAdapter.allTestsPassed());
-    }
-}
-
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/IntentFiltersTestHelper.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/IntentFiltersTestHelper.java
new file mode 100644
index 0000000..579cbcc
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/IntentFiltersTestHelper.java
@@ -0,0 +1,309 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.managedprovisioning;
+
+import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.media.audiofx.AudioEffect;
+import android.net.Uri;
+import android.nfc.cardemulation.CardEmulation;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.provider.AlarmClock;
+import android.provider.CalendarContract.Events;
+import android.provider.MediaStore;
+import android.provider.Settings;
+import android.speech.RecognizerIntent;
+import android.util.Log;
+import android.widget.Toast;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Helper class for testing if the required cross profile intent filters are set during the
+ * managed provisioning.
+ */
+public class IntentFiltersTestHelper {
+
+    private static final String TAG = "IntentFiltersTestHelper";
+
+    // These are the intents which can be forwarded to the managed profile.
+    private static final Intent[] forwardedIntentsFromPrimary = new Intent[] {
+        new Intent(Intent.ACTION_SEND).setType("*/*"),
+        new Intent(Intent.ACTION_SEND_MULTIPLE).setType("*/*")
+    };
+
+    // These are the intents which can be forwarded to the primary profile.
+    private static final Intent[] forwardedIntentsFromManaged = new Intent[] {
+        new Intent(AlarmClock.ACTION_SET_ALARM),
+        new Intent(AlarmClock.ACTION_SET_TIMER),
+        new Intent(AlarmClock.ACTION_SHOW_ALARMS),
+        new Intent(MediaStore.ACTION_IMAGE_CAPTURE),
+        new Intent(MediaStore.ACTION_VIDEO_CAPTURE),
+        new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA),
+        new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA),
+        new Intent(MediaStore.ACTION_IMAGE_CAPTURE_SECURE),
+        new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE),
+        new Intent(Intent.ACTION_SENDTO).setData(Uri.parse("sms:07700900100")),
+        new Intent(Intent.ACTION_SENDTO).setData(Uri.parse("smsto:07700900100")),
+        new Intent(Intent.ACTION_SENDTO).setData(Uri.parse("mms:07700900100")),
+        new Intent(Intent.ACTION_SENDTO).setData(Uri.parse("mmsto:07700900100")),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("sms:07700900100?body=Hello%20world")).addCategory(
+                Intent.CATEGORY_BROWSABLE),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("smsto:07700900100?body=Hello%20world")).addCategory(
+                Intent.CATEGORY_BROWSABLE),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("mms:07700900100?body=Hello%20world")).addCategory(
+                Intent.CATEGORY_BROWSABLE),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("mmsto:07700900100?body=Hello%20world")).addCategory(
+                Intent.CATEGORY_BROWSABLE),
+        new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS),
+        new Intent(Settings.ACTION_AIRPLANE_MODE_SETTINGS),
+        new Intent(Settings.ACTION_APN_SETTINGS),
+        new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS),
+        new Intent(Settings.ACTION_CAPTIONING_SETTINGS),
+        new Intent(Settings.ACTION_DATA_ROAMING_SETTINGS),
+        new Intent(Settings.ACTION_DATE_SETTINGS),
+        new Intent(Settings.ACTION_DEVICE_INFO_SETTINGS),
+        new Intent(Settings.ACTION_DISPLAY_SETTINGS),
+        new Intent(Settings.ACTION_DREAM_SETTINGS),
+        new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS),
+        new Intent(Settings.ACTION_INPUT_METHOD_SUBTYPE_SETTINGS),
+        new Intent(Settings.ACTION_LOCALE_SETTINGS),
+        new Intent(Settings.ACTION_NETWORK_OPERATOR_SETTINGS),
+        new Intent(Settings.ACTION_NFC_SETTINGS),
+        new Intent(Settings.ACTION_NFCSHARING_SETTINGS),
+        new Intent(Settings.ACTION_PRIVACY_SETTINGS),
+        new Intent(Settings.ACTION_SETTINGS),
+        new Intent(Settings.ACTION_SOUND_SETTINGS),
+        new Intent(Settings.ACTION_WIRELESS_SETTINGS),
+        new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD),
+        new Intent("android.net.vpn.SETTINGS"),
+        new Intent(CardEmulation.ACTION_CHANGE_DEFAULT),
+        new Intent("android.settings.ACCOUNT_SYNC_SETTINGS"),
+        new Intent(Settings.ACTION_BATTERY_SAVER_SETTINGS),
+        new Intent(Settings.ACTION_HOME_SETTINGS),
+        new Intent("android.settings.LICENSE"),
+        new Intent("android.settings.NOTIFICATION_SETTINGS"),
+        new Intent(Settings.ACTION_SHOW_REGULATORY_INFO),
+        new Intent("android.settings.USER_SETTINGS"),
+        new Intent("android.settings.ZEN_MODE_SETTINGS"),
+        new Intent("com.android.settings.ACCESSIBILITY_COLOR_SPACE_SETTINGS"),
+        new Intent("com.android.settings.STORAGE_USB_SETTINGS"),
+        new Intent("com.android.settings.TTS_SETTINGS"),
+        new Intent("com.android.settings.USER_DICTIONARY_EDIT"),
+        new Intent(Intent.ACTION_CALL).setData(Uri.parse("tel:123")),
+        new Intent("android.intent.action.CALL_EMERGENCY").setData(Uri.parse("tel:123")),
+        new Intent("android.intent.action.CALL_PRIVILEGED").setData(Uri.parse("tel:123")),
+        new Intent(Intent.ACTION_DIAL).setData(Uri.parse("tel:123")),
+        new Intent(Intent.ACTION_VIEW).setData(Uri.parse("tel:123")).addCategory(
+                Intent.CATEGORY_BROWSABLE),
+        new Intent(Settings.ACTION_MEMORY_CARD_SETTINGS),
+        new Intent(Settings.ACTION_NFC_PAYMENT_SETTINGS),
+        new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS),
+        new Intent(Settings.ACTION_INTERNAL_STORAGE_SETTINGS),
+        new Intent(Settings.ACTION_SYNC_SETTINGS),
+        new Intent(Settings.ACTION_ADD_ACCOUNT),
+        new Intent(Intent.ACTION_GET_CONTENT).setType("*/*").addCategory(
+                Intent.CATEGORY_OPENABLE),
+        new Intent(Intent.ACTION_OPEN_DOCUMENT).setType("*/*").addCategory(
+                Intent.CATEGORY_OPENABLE),
+        new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
+    };
+
+    // These are the intents which cannot be forwarded to the primary profile.
+    private static final Intent[] notForwardedIntentsFromManaged = new Intent[] {
+        new Intent(Intent.ACTION_INSERT).setData(
+                Uri.parse("content://browser/bookmarks")),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("http://www.example.com")).addCategory(
+                Intent.CATEGORY_BROWSABLE),
+        new Intent(Intent.ACTION_SENDTO).setData(
+                Uri.parse("mailto:user@example.com")),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("mailto:user@example.com")).addCategory(
+                Intent.CATEGORY_BROWSABLE),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("geo:0,0?q=BuckinghamPalace")),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("http://example.com/oceans.mp4")).setType("video/mp4"),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("http://www.example.com/horse.mp3")).setType("audio/*"),
+        new Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH),
+        new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION),
+        new Intent(Intent.ACTION_VIEW).setData(
+                Uri.parse("market://details?id=com.android.chrome")).addCategory(
+                Intent.CATEGORY_BROWSABLE),
+        new Intent(Intent.ACTION_WEB_SEARCH),
+        new Intent(Settings.ACTION_SEARCH_SETTINGS),
+        new Intent(Settings.ACTION_PRINT_SETTINGS),
+        new Intent(Intent.ACTION_MANAGE_NETWORK_USAGE),
+        new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS),
+        new Intent(Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS),
+        new Intent(Settings.ACTION_APPLICATION_SETTINGS),
+        new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).setData(
+                Uri.parse("package:com.android.chrome")),
+        new Intent("android.settings.ACTION_OTHER_SOUND_SETTINGS"),
+        new Intent(Settings.ACTION_WIFI_IP_SETTINGS),
+        new Intent(Settings.ACTION_WIFI_SETTINGS),
+        new Intent("android.settings.SHOW_INPUT_METHOD_PICKER"),
+        new Intent(Intent.ACTION_INSERT).setData(Events.CONTENT_URI),
+        new Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL)
+    };
+
+    // This flag specifies we are dealing with intents fired from the primary profile.
+    public static final int FLAG_INTENTS_FROM_PRIMARY = 1;
+    // This flag specifies we are dealing with intents fired from the managed profile.
+    public static final int FLAG_INTENTS_FROM_MANAGED = 2;
+
+    private Context mContext;
+
+    IntentFiltersTestHelper(Context context) {
+        mContext = context;
+    }
+
+    public boolean checkCrossProfileIntentFilters(int flag) {
+        boolean crossProfileIntentFiltersSet;
+        if (flag == FLAG_INTENTS_FROM_PRIMARY) {
+            crossProfileIntentFiltersSet = checkForIntentsFromPrimary();
+        } else {
+            crossProfileIntentFiltersSet = checkForIntentsFromManaged();
+        }
+        return crossProfileIntentFiltersSet;
+    }
+
+    /**
+     * Checks if required cross profile intent filters are set for the intents fired from the
+     * primary profile.
+     */
+    private boolean checkForIntentsFromPrimary() {
+        // Get the class name of the intentForwarderActivity in the primary profile by firing an
+        // intent which we know will be forwarded from primary profile to managed profile.
+        ActivityInfo forwarderActivityInfo =
+                getForwarderActivityInfo(ByodHelperActivity.ACTION_QUERY_PROFILE_OWNER);
+        if (forwarderActivityInfo == null) {
+            return false;
+        }
+
+        // Check for intents which can be forwarded to the managed profile.
+        Intent intent = checkForIntentsNotHandled(forwardedIntentsFromPrimary,
+                forwarderActivityInfo, true);
+        if (intent != null) {
+            Log.d(TAG, intent + " from primary profile should be forwarded to the " +
+                    "managed profile but is not.");
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Checks if required cross profile intent filters are set for the intents fired from the
+     * managed profile.
+     */
+    private boolean checkForIntentsFromManaged() {
+        // Get the class name of the intentForwarderActivity in the managed profile by firing an
+        // intent which we know will be forwarded from managed profile to primary profile.
+        ActivityInfo forwarderActivityInfo =
+                getForwarderActivityInfo(ByodHelperActivity.ACTION_PROFILE_OWNER_STATUS);
+        if (forwarderActivityInfo == null) {
+            return false;
+        }
+
+        // Check for intents which can be forwarded to the primary profile.
+        Intent intent = checkForIntentsNotHandled(forwardedIntentsFromManaged,
+                forwarderActivityInfo, true);
+        if (intent != null) {
+            Log.d(TAG, intent + " from managed profile should be forwarded to the " +
+                    "primary profile but is not.");
+            return false;
+        }
+
+        // Check for intents which cannot be forwarded to the primary profile.
+        intent = checkForIntentsNotHandled(notForwardedIntentsFromManaged,
+                forwarderActivityInfo, false);
+        if (intent != null) {
+            Log.d(TAG, intent + " from managed profile should not be forwarded to the " +
+                    "primary profile but it is.");
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Checks if the intentForwarderActivity can handle the intent passed.
+     */
+    private boolean canForwarderActivityHandleIntent(Intent intent,
+            ActivityInfo forwarderActivityInfo) {
+        // Get all the activities which can handle the intent.
+        List<ResolveInfo> resolveInfoList =
+                mContext.getPackageManager().queryIntentActivities(intent,
+                        PackageManager.MATCH_DEFAULT_ONLY);
+        // Check if intentForwarderActivity is part of the list.
+        for (ResolveInfo resolveInfo : resolveInfoList) {
+            if (forwarderActivityInfo.packageName.equals(resolveInfo.activityInfo.packageName)
+                    && forwarderActivityInfo.name.equals(resolveInfo.activityInfo.name)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Returns the class name of the intentForwarderActivity.
+     */
+    private ActivityInfo getForwarderActivityInfo(String action) {
+        Intent intent = new Intent(action);
+        List<ResolveInfo> resolveInfoList =
+                mContext.getPackageManager().queryIntentActivities(intent,
+                        PackageManager.MATCH_DEFAULT_ONLY);
+        if (resolveInfoList.isEmpty() || resolveInfoList.size() > 1) {
+            Log.d(TAG, "There should be exactly one activity IntentForwarder which " +
+                    "handles the intent " + intent);
+            return null;
+        }
+        return resolveInfoList.get(0).activityInfo;
+    }
+
+    /**
+     * Checks if the intents passed are correctly handled.
+     * @return {@code null} if all the intents are correctly handled
+     *         otherwise, the first intent in the list which is not handled correctly.
+     */
+    private Intent checkForIntentsNotHandled(Intent[] intentList,
+            ActivityInfo expectedForwarderActivityInfo, boolean canResolve) {
+        for (Intent intent : intentList) {
+            if (canForwarderActivityHandleIntent(intent,
+                    expectedForwarderActivityInfo) != canResolve) {
+                return intent;
+            }
+        }
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/KeyguardDisabledFeaturesActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/KeyguardDisabledFeaturesActivity.java
new file mode 100644
index 0000000..0fdc498
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/KeyguardDisabledFeaturesActivity.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.managedprovisioning;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.Intent;
+import android.hardware.fingerprint.FingerprintManager;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.view.View;
+import android.view.View.OnClickListener;
+
+import com.android.cts.verifier.ArrayTestListAdapter;
+import com.android.cts.verifier.DialogTestListActivity;
+import com.android.cts.verifier.R;
+
+public class KeyguardDisabledFeaturesActivity extends DialogTestListActivity {
+
+    public KeyguardDisabledFeaturesActivity() {
+        super(R.layout.provisioning_byod,
+                R.string.provisioning_byod_keyguard_disabled_features,
+                R.string.provisioning_byod_keyguard_disabled_features_info,
+                R.string.provisioning_byod_keyguard_disabled_features_instruction);
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mPrepareTestButton.setText(
+                R.string.provisioning_byod_keyguard_disabled_features_prepare_button);
+        mPrepareTestButton.setOnClickListener(new OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    resetPassword("testpassword");
+                    setKeyguardDisabledFeatures(DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS |
+                            DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT |
+                            DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS);
+                }
+            });
+    }
+
+    @Override
+    public void finish() {
+        // Pass and fail buttons are known to call finish() when clicked, and this is when we want to
+        // clear the password.
+        resetPassword(null);
+        super.finish();
+    }
+
+    private void setKeyguardDisabledFeatures(final int flags) {
+        Intent setKeyguardDisabledFeaturesIntent =
+                new Intent(ByodHelperActivity.ACTION_KEYGUARD_DISABLED_FEATURES)
+                .putExtra(ByodHelperActivity.EXTRA_PARAMETER_1, flags);
+        startActivity(setKeyguardDisabledFeaturesIntent);
+    }
+
+    /**
+     * Reset device password
+     * @param password password to reset to (may be null)
+     */
+    private void resetPassword(String password) {
+        DevicePolicyManager dpm = (DevicePolicyManager)
+                getSystemService(Context.DEVICE_POLICY_SERVICE);
+        dpm.resetPassword(password, 0);
+    }
+
+    @Override
+    protected void setupTests(ArrayTestListAdapter adapter) {
+        adapter.add(new DialogTestListItem(this, R.string.provisioning_byod_disable_trust_agents,
+                "BYOD_DisableTrustAgentsTest",
+                R.string.provisioning_byod_disable_trust_agents_instruction,
+                new Intent(Settings.ACTION_SECURITY_SETTINGS)));
+        adapter.add(new DialogTestListItemWithIcon(this,
+                R.string.provisioning_byod_disable_notifications,
+                "BYOD_DisableUnredactedNotifications",
+                R.string.provisioning_byod_disable_notifications_instruction,
+                new Intent(WorkNotificationTestActivity.ACTION_WORK_NOTIFICATION_ON_LOCKSCREEN),
+                R.drawable.ic_corp_icon));
+        FingerprintManager fpm = (FingerprintManager) getSystemService(Context.FINGERPRINT_SERVICE);
+        if (fpm.isHardwareDetected()) {
+            adapter.add(new DialogTestListItem(this,
+                    R.string.provisioning_byod_fingerprint_disabled_in_settings,
+                    "BYOD_FingerprintDisabledInSettings",
+                    R.string.provisioning_byod_fingerprint_disabled_in_settings_instruction,
+                    new Intent(Settings.ACTION_SECURITY_SETTINGS)));
+            adapter.add(new DialogTestListItem(this, R.string.provisioning_byod_disable_fingerprint,
+                    "BYOD_DisableFingerprint",
+                    R.string.provisioning_byod_disable_fingerprint_instruction,
+                    ByodHelperActivity.createLockIntent()));
+        }
+    }
+
+    @Override
+    protected void clearRemainingState(final DialogTestListItem test) {
+        super.clearRemainingState(test);
+        if (WorkNotificationTestActivity.ACTION_WORK_NOTIFICATION_ON_LOCKSCREEN.equals(
+                test.getManualTestIntent().getAction())) {
+            try {
+                startActivity(new Intent(
+                        WorkNotificationTestActivity.ACTION_CLEAR_WORK_NOTIFICATION));
+            } catch (ActivityNotFoundException e) {
+                // User shouldn't run this test before work profile is set up.
+            }
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PermissionLockdownTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PermissionLockdownTestActivity.java
new file mode 100644
index 0000000..ea7e801
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PermissionLockdownTestActivity.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.managedprovisioning;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.ActivityNotFoundException;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.RadioGroup;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+public class PermissionLockdownTestActivity extends PassFailButtons.Activity
+        implements RadioGroup.OnCheckedChangeListener {
+    private static final String PERMISSION_APP_PACKAGE = "com.android.cts.permissionapp";
+
+    // Alias used for starting the activity from ByodFlowTestActivity (Managed profile tests).
+    static final String ACTIVITY_ALIAS
+            = "com.android.cts.verifier.managedprovisioning" +
+                    ".ManagedProfilePermissionLockdownTestActivity";
+
+    private static final String MANAGED_PROVISIONING_ACTION_PREFIX
+            = "com.android.cts.verifier.managedprovisioning.action.";
+    // Indicates that activity is started for device owner case.
+    static final String ACTION_CHECK_PERMISSION_LOCKDOWN
+            = MANAGED_PROVISIONING_ACTION_PREFIX + "CHECK_PERMISSION_LOCKDOWN";
+    // Indicates that activity is started for profile owner case.
+    static final String ACTION_MANAGED_PROFILE_CHECK_PERMISSION_LOCKDOWN
+            = MANAGED_PROVISIONING_ACTION_PREFIX + "MANAGED_PROFILE_CHECK_PERMISSION_LOCKDOWN";
+
+    // Permission grant states will be set on this permission.
+    private static final String CONTACTS_PERMISSION = android.Manifest.permission.READ_CONTACTS;
+
+    private boolean mDeviceOwnerTest;
+    private DevicePolicyManager mDevicePolicyManager;
+    private ComponentName mAdmin;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.permission_lockdown);
+
+        mDevicePolicyManager =
+                (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
+        mAdmin = DeviceAdminTestReceiver.getReceiverComponentName();
+
+        mDeviceOwnerTest =
+                ACTION_CHECK_PERMISSION_LOCKDOWN.equals(getIntent().getAction()) ? true : false;
+        // Return immediately if we are neither profile nor device owner.
+        if (!isProfileOrDeviceOwner()) {
+            setTestResultAndFinish(false);
+            return;
+        }
+
+        buildLayout();
+    }
+
+    private void buildLayout() {
+        PackageManager packageManager = getPackageManager();
+        ApplicationInfo applicationInfo = null;
+        try {
+            // We need to make sure that the CtsPermissionApp is installed on the device or
+            // work profile.
+            applicationInfo = packageManager.getApplicationInfo(
+                    PERMISSION_APP_PACKAGE, 0 /* flags */);
+        } catch (PackageManager.NameNotFoundException e) {
+            showToast(getString(R.string.package_not_found, PERMISSION_APP_PACKAGE));
+            setTestResultAndFinish(false);
+            return;
+        }
+
+        ImageView packageIconImageView = (ImageView) findViewById(R.id.package_icon);
+        packageIconImageView.setImageDrawable(packageManager.getApplicationIcon(applicationInfo));
+        TextView packageNameTextView = (TextView) findViewById(R.id.package_name);
+        packageNameTextView.setText(packageManager.getApplicationLabel(applicationInfo));
+
+        TextView permissionNameTextView = (TextView) findViewById(R.id.permission_name);
+        permissionNameTextView.setText(CONTACTS_PERMISSION);
+
+        // Get the current permission grant state for initializing the RadioGroup.
+        int currentPermissionState = mDevicePolicyManager.getPermissionGrantState(mAdmin,
+                    PERMISSION_APP_PACKAGE, CONTACTS_PERMISSION);
+        RadioGroup permissionRadioGroup = (RadioGroup) findViewById(R.id.permission_group);
+        switch (currentPermissionState) {
+            case DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED: {
+                permissionRadioGroup.check(R.id.permission_allow);
+            } break;
+            case DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT: {
+                permissionRadioGroup.check(R.id.permission_default);
+            } break;
+            case  DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED: {
+                permissionRadioGroup.check(R.id.permission_deny);
+            } break;
+        }
+        permissionRadioGroup.setOnCheckedChangeListener(this);
+
+        addFinishOrPassFailButtons();
+    }
+
+    private void addFinishOrPassFailButtons() {
+        // In case of device owner, we include the pass-fail buttons where as in case of profile
+        // owner, we add a finish button.
+        ViewGroup parentView = (ViewGroup) findViewById(R.id.permission_lockdown_activity);
+        if (mDeviceOwnerTest) {
+            parentView.addView(
+                    getLayoutInflater().inflate(R.layout.pass_fail_buttons, parentView, false));
+            setInfoResources(R.string.device_profile_owner_permission_lockdown_test,
+                    R.string.device_owner_permission_lockdown_test_info, 0);
+            setPassFailButtonClickListeners();
+        } else {
+            Button finishButton = new Button(this);
+            finishButton.setText(R.string.finish_button_label);
+            finishButton.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    PermissionLockdownTestActivity.this.setTestResultAndFinish(false);
+                }
+            });
+            parentView.addView(finishButton);
+        }
+    }
+
+    // Dispatches an intent to open the Settings screen for CtsPermissionApp.
+    public void openSettings(View v) {
+        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
+                .setData(Uri.fromParts("package", PERMISSION_APP_PACKAGE, null))
+                .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        try {
+            startActivity(intent);
+        } catch (ActivityNotFoundException e) {
+            showToast(getString(R.string.activity_not_found, intent));
+        }
+    }
+
+    @Override
+    public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
+        int permissionGrantState = -1;
+        switch (checkedId) {
+            case R.id.permission_allow: {
+                permissionGrantState = DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED;
+            } break;
+            case R.id.permission_default: {
+                permissionGrantState = DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT;
+            } break;
+            case R.id.permission_deny: {
+                permissionGrantState = DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED;
+            } break;
+        }
+        mDevicePolicyManager.setPermissionGrantState(mAdmin, PERMISSION_APP_PACKAGE,
+                CONTACTS_PERMISSION, permissionGrantState);
+    }
+
+    private boolean isProfileOrDeviceOwner() {
+        String adminPackage = mAdmin.getPackageName();
+        if (mDeviceOwnerTest && !mDevicePolicyManager.isDeviceOwnerApp(adminPackage)) {
+            showToast(getString(R.string.not_device_owner, adminPackage));
+            return false;
+        } else if (!mDeviceOwnerTest && !mDevicePolicyManager.isProfileOwnerApp(adminPackage)) {
+            showToast(getString(R.string.not_profile_owner, adminPackage));
+            return false;
+        }
+        return true;
+    }
+
+    private void showToast(String toast) {
+        Toast.makeText(this, toast, Toast.LENGTH_LONG).show();
+    }
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/WifiLockdownTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/WifiLockdownTestActivity.java
new file mode 100644
index 0000000..4a292eb
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/WifiLockdownTestActivity.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.managedprovisioning;
+
+import android.app.AlertDialog;
+import android.content.Intent;
+import android.database.DataSetObserver;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.EditText;
+import android.widget.RadioGroup;
+
+import com.android.cts.verifier.ArrayTestListAdapter;
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.IntentDrivenTestActivity.ButtonInfo;
+
+import com.android.compatibility.common.util.WifiConfigCreator;
+import static com.android.compatibility.common.util.WifiConfigCreator.SECURITY_TYPE_NONE;
+import static com.android.compatibility.common.util.WifiConfigCreator.SECURITY_TYPE_WPA;
+import static com.android.compatibility.common.util.WifiConfigCreator.SECURITY_TYPE_WEP;
+
+/**
+ * Activity to test WiFi configuration lockdown functionality. A locked down WiFi config
+ * must not be editable/forgettable in Settings.
+ */
+public class WifiLockdownTestActivity extends PassFailButtons.TestListActivity {
+    private static final String TAG = "WifiLockdownTestActivity";
+
+    private static final int NONE = R.id.device_owner_keymgmnt_none;
+    private static final int WPA = R.id.device_owner_keymgmnt_wpa;
+    private static final int WEP = R.id.device_owner_keymgmnt_wep;
+
+    private static final String CONFIG_MODIFIABLE_WHEN_UNLOCKED_TEST_ID = "UNLOCKED_MODIFICATION";
+    private static final String CONFIG_NOT_MODIFIABLE_WHEN_LOCKED_TEST_ID = "LOCKED_MODIFICATION";
+    private static final String CONFIG_CONNECTABLE_WHEN_LOCKED_TEST_ID = "LOCKED_CONNECT";
+    private static final String CONFIG_REMOVABLE_WHEN_UNLOCKED_TEST_ID = "UNLOCKED_REMOVE";
+
+    private WifiConfigCreator mConfigCreator;
+    private ButtonInfo[] mSwitchLockdownOffButtonInfos;
+    private ButtonInfo[] mSwitchLockdownOnButtonInfos;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mConfigCreator = new WifiConfigCreator(this);
+        setContentView(R.layout.wifi_lockdown);
+        setInfoResources(R.string.device_owner_wifi_lockdown_test,
+                R.string.device_owner_wifi_lockdown_info, 0);
+        setPassFailButtonClickListeners();
+
+        final ArrayTestListAdapter adapter = new ArrayTestListAdapter(this);
+
+        final ButtonInfo goToWifiSettings = new ButtonInfo(
+                R.string.wifi_lockdown_go_settings_wifi_button,
+                new Intent(Settings.ACTION_WIFI_SETTINGS));
+        mSwitchLockdownOffButtonInfos = new ButtonInfo[] { new ButtonInfo(
+                R.string.switch_wifi_lockdown_off_button,
+                new Intent(this, DeviceOwnerPositiveTestActivity.CommandReceiver.class)
+                        .putExtra(DeviceOwnerPositiveTestActivity.EXTRA_COMMAND,
+                                DeviceOwnerPositiveTestActivity.COMMAND_SET_GLOBAL_SETTING)
+                        .putExtra(DeviceOwnerPositiveTestActivity.EXTRA_SETTING,
+                                Settings.Global.WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN)
+                        .putExtra(DeviceOwnerPositiveTestActivity.EXTRA_PARAMETER_1, "0"
+                )), goToWifiSettings };
+        mSwitchLockdownOnButtonInfos = new ButtonInfo[] { new ButtonInfo(
+                R.string.switch_wifi_lockdown_on_button,
+                new Intent(this, DeviceOwnerPositiveTestActivity.CommandReceiver.class)
+                        .putExtra(DeviceOwnerPositiveTestActivity.EXTRA_COMMAND,
+                                DeviceOwnerPositiveTestActivity.COMMAND_SET_GLOBAL_SETTING)
+                        .putExtra(DeviceOwnerPositiveTestActivity.EXTRA_SETTING,
+                                Settings.Global.WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN)
+                        .putExtra(DeviceOwnerPositiveTestActivity.EXTRA_PARAMETER_1, "1"
+                )), goToWifiSettings };
+
+        addTestsToAdapter(adapter);
+
+        adapter.registerDataSetObserver(new DataSetObserver() {
+            @Override
+            public void onChanged() {
+                updatePassButton();
+            }
+        });
+
+        setTestListAdapter(adapter);
+
+        View createConfigButton = findViewById(R.id.create_wifi_config_button);
+        createConfigButton .setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                EditText ssidEditor = (EditText) findViewById(R.id.device_owner_wifi_ssid);
+                RadioGroup authMethods = (RadioGroup) findViewById(
+                        R.id.device_owner_keyManagementMethods);
+                int checkedRadioId = authMethods.getCheckedRadioButtonId();
+                if (checkedRadioId == -1) {
+                    checkedRadioId = NONE;
+                }
+                int netId = mConfigCreator.addNetwork(ssidEditor.getText().toString(), false,
+                        convertKeyManagement(checkedRadioId), "defaultpassword");
+                if (netId == -1) {
+                    new AlertDialog.Builder(
+                            WifiLockdownTestActivity.this)
+                            .setIcon(android.R.drawable.ic_dialog_info)
+                            .setTitle(R.string.wifi_lockdown_add_network_failed_dialog_title)
+                            .setMessage(R.string.wifi_lockdown_add_network_failed_dialog_text)
+                            .setPositiveButton(android.R.string.ok, null)
+                            .show();
+                }
+            }
+        });
+    }
+
+    /**
+     * Enable Pass Button when all tests passed.
+     */
+    private void updatePassButton() {
+        getPassButton().setEnabled(mAdapter.allTestsPassed());
+    }
+
+    private void addTestsToAdapter(final ArrayTestListAdapter adapter) {
+        adapter.add(DeviceOwnerPositiveTestActivity.createInteractiveTestItem(this,
+                CONFIG_MODIFIABLE_WHEN_UNLOCKED_TEST_ID,
+                R.string.device_owner_wifi_config_unlocked_modification_test,
+                R.string.device_owner_wifi_config_unlocked_modification_test_info,
+                mSwitchLockdownOffButtonInfos));
+        adapter.add(DeviceOwnerPositiveTestActivity.createInteractiveTestItem(this,
+                CONFIG_NOT_MODIFIABLE_WHEN_LOCKED_TEST_ID,
+                R.string.device_owner_wifi_config_locked_modification_test,
+                R.string.device_owner_wifi_config_locked_modification_test_info,
+                mSwitchLockdownOnButtonInfos));
+        adapter.add(DeviceOwnerPositiveTestActivity.createInteractiveTestItem(this,
+                CONFIG_CONNECTABLE_WHEN_LOCKED_TEST_ID,
+                R.string.device_owner_wifi_config_locked_connection_test,
+                R.string.device_owner_wifi_config_locked_connection_test_info,
+                mSwitchLockdownOnButtonInfos));
+        adapter.add(DeviceOwnerPositiveTestActivity.createInteractiveTestItem(this,
+                CONFIG_REMOVABLE_WHEN_UNLOCKED_TEST_ID,
+                R.string.device_owner_wifi_config_unlocked_removal_test,
+                R.string.device_owner_wifi_config_unlocked_removal_test_info,
+                mSwitchLockdownOffButtonInfos));
+    }
+
+    private int convertKeyManagement(int radioButtonId) {
+        switch (radioButtonId) {
+            case NONE: {
+                return SECURITY_TYPE_NONE;
+            }
+            case WPA: {
+                return SECURITY_TYPE_WPA;
+            }
+            case WEP: {
+                return SECURITY_TYPE_WEP;
+            }
+        }
+        return SECURITY_TYPE_NONE;
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/WorkNotificationTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/WorkNotificationTestActivity.java
index c85ccf5..a912d2c 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/WorkNotificationTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/WorkNotificationTestActivity.java
@@ -19,7 +19,9 @@
 import android.app.Activity;
 import android.app.Notification;
 import android.app.NotificationManager;
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
+import android.content.Intent;
 import android.os.Bundle;
 
 import com.android.cts.verifier.R;
@@ -30,26 +32,37 @@
 public class WorkNotificationTestActivity extends Activity {
     public static final String ACTION_WORK_NOTIFICATION =
             "com.android.cts.verifier.managedprovisioning.WORK_NOTIFICATION";
+    public static final String ACTION_WORK_NOTIFICATION_ON_LOCKSCREEN =
+            "com.android.cts.verifier.managedprovisioning.LOCKSCREEN_NOTIFICATION";
     public static final String ACTION_CLEAR_WORK_NOTIFICATION =
             "com.android.cts.verifier.managedprovisioning.CLEAR_WORK_NOTIFICATION";
     private static final int NOTIFICATION_ID = 7;
+    private NotificationManager mNotificationManager;
+
+    private void showWorkNotification(int visibility) {
+        final Notification notification = new Notification.Builder(this)
+                .setSmallIcon(R.drawable.icon)
+                .setContentTitle(getString(R.string.provisioning_byod_work_notification_title))
+                .setVisibility(visibility)
+                .setAutoCancel(true)
+                .build();
+        mNotificationManager.notify(NOTIFICATION_ID, notification);
+    }
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         final String action = getIntent().getAction();
-        final NotificationManager notificationManager = (NotificationManager)
-                getSystemService(Context.NOTIFICATION_SERVICE);
+        mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
         if (ACTION_WORK_NOTIFICATION.equals(action)) {
-            final Notification notification = new Notification.Builder(this)
-                .setSmallIcon(R.drawable.icon)
-                .setContentTitle(getString(R.string.provisioning_byod_work_notification_title))
-                .setVisibility(Notification.VISIBILITY_PUBLIC)
-                .setAutoCancel(true)
-                .build();
-            notificationManager.notify(NOTIFICATION_ID, notification);
+            showWorkNotification(Notification.VISIBILITY_PUBLIC);
+        } else if (ACTION_WORK_NOTIFICATION_ON_LOCKSCREEN.equals(action)) {
+            DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(
+                    Context.DEVICE_POLICY_SERVICE);
+            dpm.lockNow();
+            showWorkNotification(Notification.VISIBILITY_PRIVATE);
         } else if (ACTION_CLEAR_WORK_NOTIFICATION.equals(action)) {
-            notificationManager.cancel(NOTIFICATION_ID);
+            mNotificationManager.cancel(NOTIFICATION_ID);
         }
         finish();
     }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/WorkStatusTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/WorkStatusTestActivity.java
new file mode 100644
index 0000000..ee9aa44
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/WorkStatusTestActivity.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.verifier.managedprovisioning;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.TextView;
+
+import com.android.cts.verifier.R;
+
+/**
+ * Test activity for work status tests.
+ */
+public class WorkStatusTestActivity extends Activity {
+    public static final String ACTION_WORK_STATUS_ICON
+            = "com.android.cts.verifier.managedprovisioning.WORK_STATUS_ICON";
+    public static final String ACTION_WORK_STATUS_TOAST
+            = "com.android.cts.verifier.managedprovisioning.WORK_STATUS_TOAST";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.provisioning_cross_profile);
+
+        findViewById(R.id.button_finish).setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                WorkStatusTestActivity.this.finish();
+            }
+        });
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        String action = getIntent().getAction();
+        TextView textView = (TextView) findViewById(R.id.text);
+        if (ACTION_WORK_STATUS_ICON.equals(action)) {
+            textView.setText(R.string.provisioning_byod_work_status_icon_activity);
+        } else if (ACTION_WORK_STATUS_TOAST.equals(action)) {
+            textView.setText(R.string.provisioning_byod_work_status_toast_activity);
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/LlcpVersionActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/LlcpVersionActivity.java
new file mode 100644
index 0000000..ce5a3d4
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/LlcpVersionActivity.java
@@ -0,0 +1,123 @@
+/*
+ * 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 com.android.cts.verifier.nfc;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.nfc.NdefMessage;
+import android.nfc.NdefRecord;
+import android.nfc.NfcAdapter;
+import android.nfc.NfcEvent;
+import android.nfc.NfcManager;
+import android.os.Build;
+import android.os.Bundle;
+import android.widget.TextView;
+
+import java.nio.charset.Charset;
+
+/**
+ * Test activity that sends a particular NDEF Push message to another NFC device.
+ */
+public class LlcpVersionActivity extends PassFailButtons.Activity implements
+        NfcAdapter.CreateNdefMessageCallback {
+
+    private static final int NFC_NOT_ENABLED_DIALOG_ID = 1;
+    private static final int NDEF_PUSH_NOT_ENABLED_DIALOG_ID = 2;
+
+    private NfcAdapter mNfcAdapter;
+    private TextView mTextView;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_text);
+        setInfoResources(R.string.nfc_llcp_version_check, R.string.nfc_llcp_version_check_info, 0);
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(false);
+
+        mTextView = (TextView) findViewById(R.id.text);
+        mTextView.setText(R.string.nfc_llcp_version_check_info);
+
+        NfcManager nfcManager = (NfcManager) getSystemService(NFC_SERVICE);
+        mNfcAdapter = nfcManager.getDefaultAdapter();
+    }
+
+    private static NdefMessage getTestMessage() {
+        byte[] mimeBytes = "application/com.android.cts.verifier.nfc"
+                .getBytes(Charset.forName("US-ASCII"));
+        byte[] id = new byte[] {1, 3, 3, 7};
+        byte[] payload = "CTS Verifier NDEF Push Tag".getBytes(Charset.forName("US-ASCII"));
+        return new NdefMessage(new NdefRecord[] {
+                new NdefRecord(NdefRecord.TNF_MIME_MEDIA, mimeBytes, id, payload)
+        });
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+
+        if (!mNfcAdapter.isEnabled()) {
+            showDialog(NFC_NOT_ENABLED_DIALOG_ID);
+        } else if (!mNfcAdapter.isNdefPushEnabled()) {
+            /* Sender must have NDEF push enabled */
+            showDialog(NDEF_PUSH_NOT_ENABLED_DIALOG_ID);
+        }
+
+        mNfcAdapter.setNdefPushMessageCallback(this, this);
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+    }
+
+    @Override
+    public Dialog onCreateDialog(int id, Bundle args) {
+        switch (id) {
+            case NFC_NOT_ENABLED_DIALOG_ID:
+                return NfcDialogs.createNotEnabledDialog(this);
+            case NDEF_PUSH_NOT_ENABLED_DIALOG_ID:
+                return NfcDialogs.createNdefPushNotEnabledDialog(this);
+            default:
+                return super.onCreateDialog(id, args);
+        }
+    }
+
+    @Override
+    public NdefMessage createNdefMessage(NfcEvent event) {
+        if (event.peerLlcpMajorVersion <= 1 && event.peerLlcpMinorVersion < 2) {
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    mTextView.setText(R.string.nfc_llcp_version_check_failure);
+                }
+            });
+        } else {
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    getPassButton().setEnabled(true);
+                    mTextView.setText(R.string.nfc_llcp_version_check_success);
+                }
+            });
+        }
+        return null;
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NdefPushSenderActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NdefPushSenderActivity.java
index f3f37c4..2f77895 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NdefPushSenderActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NdefPushSenderActivity.java
@@ -23,6 +23,7 @@
 import android.nfc.NdefMessage;
 import android.nfc.NdefRecord;
 import android.nfc.NfcAdapter;
+import android.nfc.NfcEvent;
 import android.nfc.NfcManager;
 import android.os.Bundle;
 import android.widget.TextView;
@@ -32,7 +33,8 @@
 /**
  * Test activity that sends a particular NDEF Push message to another NFC device.
  */
-public class NdefPushSenderActivity extends PassFailButtons.Activity {
+public class NdefPushSenderActivity extends PassFailButtons.Activity implements
+        NfcAdapter.CreateNdefMessageCallback {
 
     static final NdefMessage TEST_MESSAGE = getTestMessage();
 
@@ -76,13 +78,12 @@
             showDialog(NDEF_PUSH_NOT_ENABLED_DIALOG_ID);
         }
 
-        mNfcAdapter.enableForegroundNdefPush(this, TEST_MESSAGE);
+        mNfcAdapter.setNdefPushMessageCallback(this, this);
     }
 
     @Override
     protected void onPause() {
         super.onPause();
-        mNfcAdapter.disableForegroundNdefPush(this);
     }
 
     @Override
@@ -96,4 +97,9 @@
                 return super.onCreateDialog(id, args);
         }
     }
+
+    @Override
+    public NdefMessage createNdefMessage(NfcEvent event) {
+        return getTestMessage();
+    }
 }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcTestActivity.java
index cb90241..68fc027 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcTestActivity.java
@@ -28,6 +28,7 @@
 import android.nfc.tech.MifareUltralight;
 import android.nfc.tech.Ndef;
 import android.nfc.tech.TagTechnology;
+import android.os.Build;
 import android.os.Bundle;
 
 /** Activity that lists all the NFC tests. */
@@ -58,6 +59,11 @@
                 NdefPushReceiverActivity.class.getName(),
                 new Intent(this, NdefPushReceiverActivity.class), null));
 
+        if ("MNC".equals(Build.VERSION.CODENAME) || Build.VERSION.SDK_INT >= 23) {
+            adapter.add(TestListItem.newTest(this, R.string.nfc_llcp_version_check,
+                    LlcpVersionActivity.class.getName(),
+                    new Intent(this, LlcpVersionActivity.class), null));
+        }
         adapter.add(TestListItem.newCategory(this, R.string.nfc_tag_verification));
         adapter.add(TestListItem.newTest(this, R.string.nfc_ndef,
                 NDEF_ID, getTagIntent(Ndef.class), null));
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/HceReaderTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/HceReaderTestActivity.java
index 035ce86..879916b 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/HceReaderTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/HceReaderTestActivity.java
@@ -40,12 +40,6 @@
 
         if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)) {
             adapter.add(TestListItem.newCategory(this, R.string.nfc_hce_reader_tests));
-            /*
-             * Only add this test when supported in platform
-            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_default_route_reader,
-                    SimpleReaderActivity.class.getName(),
-                    DefaultRouteEmulatorActivity.buildReaderIntent(this), null));
-             */
 
             adapter.add(TestListItem.newTest(this, R.string.nfc_hce_protocol_params_reader,
                     ProtocolParamsReaderActivity.class.getName(),
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/notifications/AttentionManagementVerifierActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/notifications/AttentionManagementVerifierActivity.java
index d8f196a..4898ab2 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/notifications/AttentionManagementVerifierActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/notifications/AttentionManagementVerifierActivity.java
@@ -85,6 +85,7 @@
         tests.add(new InsertContactsTest());
         tests.add(new SetModeNoneTest());
         tests.add(new NoneInterceptsAllTest());
+        tests.add(new SetModeAllTest());
         tests.add(new SetModePriorityTest());
         tests.add(new PriorityInterceptsSomeTest());
         tests.add(new SetModeAllTest());
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/notifications/InteractiveVerifierActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/notifications/InteractiveVerifierActivity.java
index 07d9cc9..25a36b6 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/notifications/InteractiveVerifierActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/notifications/InteractiveVerifierActivity.java
@@ -165,8 +165,9 @@
     protected void onSaveInstanceState (Bundle outState) {
         final int stateIndex = mTestList.indexOf(mCurrentTest);
         outState.putInt(STATE, stateIndex);
-        outState.putInt(STATUS, mCurrentTest.status);
-        Log.i(TAG, "saved state(" + stateIndex + "}, status(" + (mCurrentTest.status) + ")");
+        final int status = mCurrentTest == null ? SETUP : mCurrentTest.status;
+        outState.putInt(STATUS, status);
+        Log.i(TAG, "saved state(" + stateIndex + "}, status(" + status + ")");
     }
 
     @Override
@@ -383,6 +384,7 @@
 
         @Override
         void test() {
+            mNm.cancelAll();
             Intent settings = new Intent(NOTIFICATION_LISTENER_SETTINGS);
             if (settings.resolveActivity(mPackageManager) == null) {
                 logFail("no settings activity");
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/P2pTestListActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/P2pTestListActivity.java
index d133eda..920c9ae 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/P2pTestListActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/P2pTestListActivity.java
@@ -125,12 +125,12 @@
      * If WiFi Direct is disabled, show the dialog to jump to system setting activity.
      **/
     @Override
-    protected void onListItemClick(ListView listView, View view, int position, long id) {
+    protected void handleItemClick(ListView listView, View view, int position, long id) {
         if (!mIsP2pEnabled) {
             showP2pEnableDialog();
             return;
         }
-        super.onListItemClick(listView, view, position, id);
+        super.handleItemClick(listView, view, position, id);
     }
 
     /**
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/security/FingerprintBoundKeysTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/security/FingerprintBoundKeysTest.java
new file mode 100644
index 0000000..70899c6
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/security/FingerprintBoundKeysTest.java
@@ -0,0 +1,247 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.security;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.Manifest;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.app.KeyguardManager;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.hardware.fingerprint.FingerprintManager;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.util.Log;
+import android.security.keystore.KeyGenParameterSpec;
+import android.security.keystore.KeyPermanentlyInvalidatedException;
+import android.security.keystore.KeyProperties;
+import android.security.keystore.UserNotAuthenticatedException;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.Toast;
+
+import java.io.IOException;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.KeyGenerator;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.SecretKey;
+
+public class FingerprintBoundKeysTest extends PassFailButtons.Activity {
+    private static final String TAG = "FingerprintBoundKeysTest";
+
+    /** Alias for our key in the Android Key Store. */
+    private static final String KEY_NAME = "my_key";
+    private static final byte[] SECRET_BYTE_ARRAY = new byte[] {1, 2, 3, 4, 5, 6};
+    private static final int AUTHENTICATION_DURATION_SECONDS = 5;
+    private static final int CONFIRM_CREDENTIALS_REQUEST_CODE = 1;
+    private static final int FINGERPRINT_PERMISSION_REQUEST_CODE = 0;
+
+    private FingerprintManager mFingerprintManager;
+    private KeyguardManager mKeyguardManager;
+    private FingerprintAuthDialogFragment mFingerprintDialog;
+    private Cipher mCipher;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.sec_screen_lock_keys_main);
+        setPassFailButtonClickListeners();
+        setInfoResources(R.string.sec_fingerprint_bound_key_test, R.string.sec_fingerprint_bound_key_test_info, -1);
+        getPassButton().setEnabled(false);
+        requestPermissions(new String[]{Manifest.permission.USE_FINGERPRINT},
+                FINGERPRINT_PERMISSION_REQUEST_CODE);
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] state) {
+        if (requestCode == FINGERPRINT_PERMISSION_REQUEST_CODE && state[0] == PackageManager.PERMISSION_GRANTED) {
+            mFingerprintManager = (FingerprintManager) getSystemService(Context.FINGERPRINT_SERVICE);
+            mKeyguardManager = (KeyguardManager) getSystemService(KeyguardManager.class);
+
+            try {
+                KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
+                keyStore.load(null);
+                SecretKey secretKey = (SecretKey) keyStore.getKey(KEY_NAME, null);
+                mCipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"
+                            + KeyProperties.BLOCK_MODE_CBC + "/"
+                            + KeyProperties.ENCRYPTION_PADDING_PKCS7);
+
+                mCipher.init(Cipher.ENCRYPT_MODE, secretKey);
+            } catch (KeyPermanentlyInvalidatedException e) {
+                createKey();
+                showToast("The key has been invalidated, please try again.\n");
+            } catch (NoSuchPaddingException | KeyStoreException | CertificateException | UnrecoverableKeyException | IOException
+                    | NoSuchAlgorithmException | InvalidKeyException e) {
+                throw new RuntimeException("Failed to init Cipher", e);
+            }
+
+            Button startTestButton = (Button) findViewById(R.id.sec_start_test_button);
+            startTestButton.setOnClickListener(new OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    if (tryEncrypt()) {
+                        showToast("Test failed. Key accessible without auth.");
+                    } else {
+                        showAuthenticationScreen();
+                    }
+                }
+
+            });
+
+            if (!mKeyguardManager.isKeyguardSecure()) {
+                // Show a message that the user hasn't set up a lock screen.
+                showToast( "Secure lock screen hasn't been set up.\n"
+                                + "Go to 'Settings -> Security -> Screen lock' to set up a lock screen");
+                startTestButton.setEnabled(false);
+            } else if (!mFingerprintManager.hasEnrolledFingerprints()) {
+                showToast("No fingerprints enrolled.\n"
+                                + "Go to 'Settings -> Security -> Fingerprint' to set up a fingerprint");
+                startTestButton.setEnabled(false);
+            } else {
+                createKey();
+            }
+        }
+    }
+
+    /**
+     * Creates a symmetric key in the Android Key Store which can only be used after the user has
+     * authenticated with device credentials within the last X seconds.
+     */
+    private void createKey() {
+        // Generate a key to decrypt payment credentials, tokens, etc.
+        // This will most likely be a registration step for the user when they are setting up your app.
+        try {
+            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
+            keyStore.load(null);
+            KeyGenerator keyGenerator = KeyGenerator.getInstance(
+                    KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
+
+            // Set the alias of the entry in Android KeyStore where the key will appear
+            // and the constrains (purposes) in the constructor of the Builder
+            keyGenerator.init(new KeyGenParameterSpec.Builder(KEY_NAME,
+                    KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
+                    .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
+                    .setUserAuthenticationRequired(true)
+                    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
+                    .build());
+            keyGenerator.generateKey();
+        } catch (NoSuchAlgorithmException | NoSuchProviderException
+                | InvalidAlgorithmParameterException | KeyStoreException
+                | CertificateException | IOException e) {
+            throw new RuntimeException("Failed to create a symmetric key", e);
+        }
+    }
+
+    /**
+     * Tries to encrypt some data with the generated key in {@link #createKey} which is
+     * only works if the user has just authenticated via device credentials.
+     */
+    private boolean tryEncrypt() {
+        try {
+            mCipher.doFinal(SECRET_BYTE_ARRAY);
+            return true;
+        } catch (BadPaddingException | IllegalBlockSizeException e) {
+            return false;
+        }
+    }
+
+    private void showAuthenticationScreen() {
+        mFingerprintDialog = new FingerprintAuthDialogFragment();
+        mFingerprintDialog.show(getFragmentManager(), "fingerprint_dialog");
+    }
+
+    private void showToast(String message) {
+        Toast.makeText(this, message, Toast.LENGTH_LONG)
+            .show();
+    }
+
+    public class FingerprintAuthDialogFragment extends DialogFragment {
+
+        private CancellationSignal mCancellationSignal;
+        private FingerprintManagerCallback mFingerprintManagerCallback;
+        private boolean mSelfCancelled;
+
+        class FingerprintManagerCallback extends FingerprintManager.AuthenticationCallback {
+            @Override
+            public void onAuthenticationError(int errMsgId, CharSequence errString) {
+                if (!mSelfCancelled) {
+                    showToast(errString.toString());
+                }
+            }
+
+            @Override
+            public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
+                showToast(helpString.toString());
+            }
+
+            @Override
+            public void onAuthenticationFailed() {
+                showToast(getString(R.string.sec_fp_auth_failed));
+            }
+
+            @Override
+            public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
+                if (tryEncrypt()) {
+                    showToast("Test passed.");
+                    getPassButton().setEnabled(true);
+                    FingerprintAuthDialogFragment.this.dismiss();
+                } else {
+                    showToast("Test failed. Key not accessible after auth");
+                }
+            }
+        }
+
+        @Override
+        public void onDismiss(DialogInterface dialog) {
+            mCancellationSignal.cancel();
+            mSelfCancelled = true;
+        }
+
+        @Override
+        public Dialog onCreateDialog(Bundle savedInstanceState) {
+            mCancellationSignal = new CancellationSignal();
+            mSelfCancelled = false;
+            mFingerprintManagerCallback = new FingerprintManagerCallback();
+            mFingerprintManager.authenticate(new FingerprintManager.CryptoObject(mCipher),
+                    mCancellationSignal, 0, mFingerprintManagerCallback, null);
+            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+            builder.setMessage(R.string.sec_fp_dialog_message);
+            return builder.create();
+        }
+
+    }
+}
+
+
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/security/KeyChainTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/security/KeyChainTest.java
new file mode 100644
index 0000000..ebdb4c0
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/security/KeyChainTest.java
@@ -0,0 +1,464 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.security;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.security.KeyChain;
+import android.security.KeyChainAliasCallback;
+import android.security.KeyChainException;
+import android.text.method.ScrollingMovementMethod;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import com.google.mockwebserver.MockResponse;
+import com.google.mockwebserver.MockWebServer;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.ByteArrayOutputStream;
+import java.net.Socket;
+import java.net.URL;
+import java.security.GeneralSecurityException;
+import java.security.Key;
+import java.security.KeyFactory;
+import java.security.KeyStore;
+import java.security.Principal;
+import java.security.PrivateKey;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.util.ArrayList;
+import java.util.concurrent.TimeUnit;
+import java.util.List;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.X509ExtendedKeyManager;
+
+import libcore.java.security.TestKeyStore;
+import libcore.javax.net.ssl.TestSSLContext;
+
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
+
+/**
+ * Simple activity based test that exercises the KeyChain API
+ */
+public class KeyChainTest extends PassFailButtons.Activity implements View.OnClickListener {
+
+    private static final String TAG = "KeyChainTest";
+
+    private static final int REQUEST_CA_INSTALL = 1;
+
+    private TextView mInstructionView;
+    private TextView mLogView;
+    private Button mResetButton;
+    private Button mSkipButton;
+    private Button mNextButton;
+
+    private List<Step> mSteps;
+    int mCurrentStep;
+
+    private KeyStore mKeyStore;
+    private static final char[] KEYSTORE_PASSWORD = "".toCharArray();
+
+    // How long to wait before giving up on the user selecting a key alias.
+    private static final int KEYCHAIN_ALIAS_TIMEOUT_MS = (int) TimeUnit.MINUTES.toMillis(5L);
+
+    @Override public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        View root = getLayoutInflater().inflate(R.layout.keychain_main, null);
+        setContentView(root);
+
+        setInfoResources(R.string.keychain_test, R.string.keychain_info, -1);
+        setPassFailButtonClickListeners();
+
+        mInstructionView = (TextView) root.findViewById(R.id.test_instruction);
+        mLogView = (TextView) root.findViewById(R.id.test_log);
+        mLogView.setMovementMethod(new ScrollingMovementMethod());
+
+        mNextButton = (Button) root.findViewById(R.id.action_next);
+        mNextButton.setOnClickListener(this);
+
+        mResetButton = (Button) root.findViewById(R.id.action_reset);
+        mResetButton.setOnClickListener(this);
+
+        mSkipButton = (Button) root.findViewById(R.id.action_skip);
+        mSkipButton.setOnClickListener(this);
+
+        resetProgress();
+    }
+
+    @Override
+    public void onClick(View v) {
+        Step step = mSteps.get(mCurrentStep);
+        if (v == mNextButton) {
+            switch (step.task.getStatus()) {
+                case PENDING: {
+                    step.task.execute();
+                    break;
+                }
+                case FINISHED: {
+                    if (mCurrentStep + 1 < mSteps.size()) {
+                        mCurrentStep += 1;
+                        updateUi();
+                    } else {
+                        mSkipButton.setVisibility(View.INVISIBLE);
+                        mNextButton.setVisibility(View.INVISIBLE);
+                    }
+                    break;
+                }
+            }
+        } else if (v == mSkipButton) {
+            step.task.cancel(false);
+            mCurrentStep += 1;
+            updateUi();
+        } else if (v == mResetButton) {
+            resetProgress();
+        }
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        switch (requestCode) {
+            case REQUEST_CA_INSTALL: {
+                if (resultCode == RESULT_OK) {
+                    log("CA Certificate installed successfully");
+                } else {
+                    log("REQUEST_CA_INSTALL failed with result code: " + resultCode);
+                }
+                break;
+            }
+            default:
+                throw new IllegalStateException("requestCode == " + requestCode);
+        }
+    }
+
+    private void resetProgress() {
+        getPassButton().setEnabled(false);
+        mLogView.setText("");
+
+        mSteps = new ArrayList<>();
+        mSteps.add(new Step(R.string.keychain_setup_desc, false, new SetupTestKeyStoreTask()));
+        mSteps.add(new Step(R.string.keychain_install_desc, true, new InstallCredentialsTask()));
+        mSteps.add(new Step(R.string.keychain_https_desc, false, new TestHttpsRequestTask()));
+        mSteps.add(new Step(R.string.keychain_reset_desc, true, new ClearCredentialsTask()));
+        mCurrentStep = 0;
+
+        updateUi();
+    }
+
+    private void updateUi() {
+        mLogView.setText("");
+
+        if (mCurrentStep >= mSteps.size()) {
+            mSkipButton.setVisibility(View.INVISIBLE);
+            mNextButton.setVisibility(View.INVISIBLE);
+            getPassButton().setEnabled(true);
+            return;
+        }
+
+        final Step step = mSteps.get(mCurrentStep);
+        if (step.task.getStatus() == AsyncTask.Status.PENDING) {
+            mInstructionView.setText(step.instructionTextId);
+        }
+        mSkipButton.setVisibility(step.skippable ? View.VISIBLE : View.INVISIBLE);
+        mNextButton.setVisibility(View.VISIBLE);
+    }
+
+    private class SetupTestKeyStoreTask extends AsyncTask<Void, Void, Void> {
+        @Override
+        protected Void doInBackground(Void... params) {
+            final Certificate[] chain = new Certificate[2];
+            final Key privKey;
+
+            log("Reading resources");
+            Resources res = getResources();
+            ByteArrayOutputStream userKey = new ByteArrayOutputStream();
+            try {
+                InputStream is = res.openRawResource(R.raw.userkey);
+                byte[] buffer = new byte[4096];
+                for (int n; (n = is.read(buffer, 0, buffer.length)) != -1;) {
+                    userKey.write(buffer, 0, n);
+                }
+            } catch (IOException e) {
+                Log.e(TAG, "Reading private key failed", e);
+                return null;
+            }
+            log("Private key length: " + userKey.size() + " bytes");
+
+            log("Setting up KeyStore");
+            try {
+                KeyFactory keyFact = KeyFactory.getInstance("RSA");
+                privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(userKey.toByteArray()));
+
+                final CertificateFactory f = CertificateFactory.getInstance("X.509");
+                chain[0] = f.generateCertificate(res.openRawResource(R.raw.usercert));
+                chain[1] = f.generateCertificate(res.openRawResource(R.raw.cacert));
+            } catch (GeneralSecurityException gse) {
+                Log.w(TAG, "Certificate generation failed", gse);
+                return null;
+            }
+
+            try {
+                // Create a PKCS12 keystore populated with key + certificate chain
+                KeyStore ks = KeyStore.getInstance("PKCS12");
+                ks.load(null, null);
+                ks.setKeyEntry("alias", privKey, KEYSTORE_PASSWORD, chain);
+                mKeyStore = ks;
+                log("KeyStore initialized");
+            } catch (Exception e) {
+                log("KeyStore initialization failed");
+                Log.e(TAG, "", e);
+            }
+            return null;
+        }
+    }
+
+    private class InstallCredentialsTask extends AsyncTask<Void, Void, Void> {
+        @Override
+        protected Void doInBackground(Void... params) {
+            try {
+                Intent intent = KeyChain.createInstallIntent();
+                intent.putExtra(KeyChain.EXTRA_NAME, TAG);
+
+                // Write keystore to byte array for installation
+                ByteArrayOutputStream pkcs12 = new ByteArrayOutputStream();
+                mKeyStore.store(pkcs12, KEYSTORE_PASSWORD);
+                if (pkcs12.size() == 0) {
+                    throw new AssertionError("Credential archive is empty");
+                }
+                log("Requesting install of server's credentials");
+                intent.putExtra(KeyChain.EXTRA_PKCS12, pkcs12.toByteArray());
+                startActivityForResult(intent, REQUEST_CA_INSTALL);
+            } catch (Exception e) {
+                log("Failed to install credentials: " + e);
+            }
+            return null;
+        }
+    }
+
+    private class TestHttpsRequestTask extends AsyncTask<Void, Void, Void> {
+        @Override
+        protected Void doInBackground(Void... params) {
+            try {
+                URL url = startWebServer();
+                makeHttpsRequest(url);
+            } catch (Exception e) {
+                Log.e(TAG, "HTTPS request unsuccessful", e);
+                log("Connection failed");
+                return null;
+            }
+
+            runOnUiThread(new Runnable() {
+                @Override public void run() {
+                    getPassButton().setEnabled(true);
+                }
+            });
+            return null;
+        }
+
+        /**
+         * Create a mock web server.
+         * The server authenticates itself to the client using the key pair and certificate from the
+         * PKCS#12 keystore used in this test. Client authentication uses default trust management:
+         * the server trusts only the certificates installed in the credential storage of this
+         * user/profile.
+         */
+        private URL startWebServer() throws Exception {
+            log("Starting web server");
+            String kmfAlgoritm = KeyManagerFactory.getDefaultAlgorithm();
+            KeyManagerFactory kmf = KeyManagerFactory.getInstance(kmfAlgoritm);
+            kmf.init(mKeyStore, KEYSTORE_PASSWORD);
+            SSLContext serverContext = SSLContext.getInstance("TLS");
+            serverContext.init(kmf.getKeyManagers(),
+                    null /* TrustManager[] */,
+                    null /* SecureRandom */);
+            SSLSocketFactory sf = serverContext.getSocketFactory();
+            SSLSocketFactory needsClientAuth = TestSSLContext.clientAuth(sf,
+                    false /* Want client auth */,
+                    true /* Need client auth */);
+            MockWebServer server = new MockWebServer();
+            server.useHttps(needsClientAuth, false /* tunnelProxy */);
+            server.enqueue(new MockResponse().setBody("this response comes via HTTPS"));
+            server.play();
+            return server.getUrl("/");
+        }
+
+        /**
+         * Open a new connection to the server.
+         * The client authenticates itself to the server using a private key and certificate
+         * supplied by KeyChain. Server authentication uses default trust management: the client
+         * trusts only certificates installed in the credential storage of this user/profile. This
+         * setup is expected to work because the server uses a private key whose certificate was
+         * installed earlier during this test.
+         */
+        private void makeHttpsRequest(URL url) throws Exception {
+            log("Making https request to " + url);
+            SSLContext clientContext = SSLContext.getInstance("TLS");
+            clientContext.init(new KeyManager[] { new KeyChainKeyManager() },
+                    null /* TrustManager[] */,
+                    null /* SecureRandom */);
+            HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
+            connection.setSSLSocketFactory(clientContext.getSocketFactory());
+            if (connection.getResponseCode() != 200) {
+                log("Connection failed. Response code: " + connection.getResponseCode());
+                throw new AssertionError();
+            }
+            log("Connection succeeded.");
+        }
+    }
+
+    private class ClearCredentialsTask extends AsyncTask<Void, Void, Void> {
+        @Override
+        protected Void doInBackground(Void... params) {
+            final Intent securitySettingsIntent = new Intent(Settings.ACTION_SECURITY_SETTINGS);
+            startActivity(securitySettingsIntent);
+            log("Started action: " + Settings.ACTION_SECURITY_SETTINGS);
+            log("All tests complete!");
+            return null;
+        }
+    }
+
+    /**
+     * Key manager which synchronously prompts for its aliases via KeyChain
+     */
+    private class KeyChainKeyManager extends X509ExtendedKeyManager {
+        @Override
+        public String chooseClientAlias(String[] keyTypes, Principal[] issuers, Socket socket) {
+            log("KeyChainKeyManager chooseClientAlias");
+            KeyChainAliasCallback aliasCallback = Mockito.mock(KeyChainAliasCallback.class);
+            KeyChain.choosePrivateKeyAlias(KeyChainTest.this, aliasCallback,
+                                           keyTypes, issuers,
+                                           socket.getInetAddress().getHostName(), socket.getPort(),
+                                           null);
+
+            ArgumentCaptor<String> aliasCaptor = ArgumentCaptor.forClass(String.class);
+            Mockito.verify(aliasCallback, Mockito.timeout((int) KEYCHAIN_ALIAS_TIMEOUT_MS))
+                    .alias(aliasCaptor.capture());
+
+            log("Certificate alias: \"" + aliasCaptor.getValue() + "\"");
+            return aliasCaptor.getValue();
+        }
+
+        @Override
+        public String chooseServerAlias(String keyType,
+                                                  Principal[] issuers,
+                                                  Socket socket) {
+            // Not a client SSLSocket callback
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public X509Certificate[] getCertificateChain(String alias) {
+            try {
+                log("KeyChainKeyManager getCertificateChain");
+                X509Certificate[] certificateChain =
+                        KeyChain.getCertificateChain(KeyChainTest.this, alias);
+                if (certificateChain == null) {
+                    log("Null certificate chain!");
+                    return null;
+                }
+                log("Returned " + certificateChain.length + " certificates in chain");
+                for (int i = 0; i < certificateChain.length; i++) {
+                    Log.d(TAG, "certificate[" + i + "]=" + certificateChain[i]);
+                }
+                return certificateChain;
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                return null;
+            } catch (KeyChainException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        @Override
+        public String[] getClientAliases(String keyType, Principal[] issuers) {
+            // not a client SSLSocket callback
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public String[] getServerAliases(String keyType, Principal[] issuers) {
+            // not a client SSLSocket callback
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public PrivateKey getPrivateKey(String alias) {
+            try {
+                log("KeyChainKeyManager.getPrivateKey(\"" + alias + "\")");
+                PrivateKey privateKey = KeyChain.getPrivateKey(KeyChainTest.this, alias);
+                Log.d(TAG, "privateKey = " + privateKey);
+                return privateKey;
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                return null;
+            } catch (KeyChainException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    /**
+     * Write a message to the log, also to a visible TextView if available.
+     */
+    private void log(final String message) {
+        Log.d(TAG, message);
+        if (mLogView != null) {
+            runOnUiThread(new Runnable() {
+                @Override public void run() {
+                    mLogView.append(message + "\n");
+                }
+            });
+        }
+    }
+
+    /**
+     * Utility class to store one step per object.
+     */
+    private static class Step {
+        // Instruction message to show before running
+        int instructionTextId;
+
+        // Whether to allow a 'skip' button for this step
+        boolean skippable;
+
+        // Set of commands to run when 'next' is pressed
+        AsyncTask<Void, Void, Void> task;
+
+        public Step(int instructionTextId, boolean skippable, AsyncTask<Void, Void, Void> task) {
+            this.instructionTextId = instructionTextId;
+            this.skippable = skippable;
+            this.task = task;
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/security/ScreenLockBoundKeysTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/security/ScreenLockBoundKeysTest.java
new file mode 100644
index 0000000..863488b
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/security/ScreenLockBoundKeysTest.java
@@ -0,0 +1,204 @@
+/*
+ * 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 com.android.cts.verifier.security;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.app.AlertDialog;
+import android.app.KeyguardManager;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.security.keystore.KeyGenParameterSpec;
+import android.security.keystore.KeyPermanentlyInvalidatedException;
+import android.security.keystore.KeyProperties;
+import android.security.keystore.UserNotAuthenticatedException;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.Toast;
+
+import java.io.IOException;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.KeyGenerator;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.SecretKey;
+
+public class ScreenLockBoundKeysTest extends PassFailButtons.Activity {
+
+    /** Alias for our key in the Android Key Store. */
+    private static final String KEY_NAME = "my_lock_key";
+    private static final byte[] SECRET_BYTE_ARRAY = new byte[] {1, 2, 3, 4, 5, 6};
+    private static final int AUTHENTICATION_DURATION_SECONDS = 5;
+    private static final int CONFIRM_CREDENTIALS_REQUEST_CODE = 1;
+
+    private KeyguardManager mKeyguardManager;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.sec_screen_lock_keys_main);
+        setPassFailButtonClickListeners();
+        setInfoResources(R.string.sec_lock_bound_key_test, R.string.sec_lock_bound_key_test_info, -1);
+
+        mKeyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
+
+        getPassButton().setEnabled(false);
+
+        Button startTestButton = (Button) findViewById(R.id.sec_start_test_button);
+        startTestButton.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                showToast("Test running...");
+                v.postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        if (tryEncrypt()) {
+                            showToast("Test failed. Key accessible without auth.");
+                        } else {
+                            showAuthenticationScreen();
+                        }
+                    }
+                },
+                AUTHENTICATION_DURATION_SECONDS * 1000);
+            }
+
+        });
+
+        if (!mKeyguardManager.isKeyguardSecure()) {
+            // Show a message that the user hasn't set up a lock screen.
+            Toast.makeText(this,
+                    "Secure lock screen hasn't set up.\n"
+                            + "Go to 'Settings -> Security -> Screenlock' to set up a lock screen",
+                    Toast.LENGTH_LONG).show();
+            startTestButton.setEnabled(false);
+            return;
+        }
+
+        createKey();
+    }
+
+    /**
+     * Creates a symmetric key in the Android Key Store which can only be used after the user has
+     * authenticated with device credentials within the last X seconds.
+     */
+    private void createKey() {
+        // Generate a key to decrypt payment credentials, tokens, etc.
+        // This will most likely be a registration step for the user when they are setting up your app.
+        try {
+            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
+            keyStore.load(null);
+            KeyGenerator keyGenerator = KeyGenerator.getInstance(
+                    KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
+
+            // Set the alias of the entry in Android KeyStore where the key will appear
+            // and the constrains (purposes) in the constructor of the Builder
+            keyGenerator.init(new KeyGenParameterSpec.Builder(KEY_NAME,
+                    KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
+                    .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
+                    .setUserAuthenticationRequired(true)
+                            // Require that the user has unlocked in the last 30 seconds
+                    .setUserAuthenticationValidityDurationSeconds(AUTHENTICATION_DURATION_SECONDS)
+                    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
+                    .build());
+            keyGenerator.generateKey();
+        } catch (NoSuchAlgorithmException | NoSuchProviderException
+                | InvalidAlgorithmParameterException | KeyStoreException
+                | CertificateException | IOException e) {
+            throw new RuntimeException("Failed to create a symmetric key", e);
+        }
+    }
+
+    /**
+     * Tries to encrypt some data with the generated key in {@link #createKey} which is
+     * only works if the user has just authenticated via device credentials.
+     */
+    private boolean tryEncrypt() {
+        try {
+            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
+            keyStore.load(null);
+            SecretKey secretKey = (SecretKey) keyStore.getKey(KEY_NAME, null);
+            Cipher cipher = Cipher.getInstance(
+                    KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/"
+                            + KeyProperties.ENCRYPTION_PADDING_PKCS7);
+
+            // Try encrypting something, it will only work if the user authenticated within
+            // the last AUTHENTICATION_DURATION_SECONDS seconds.
+            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
+            cipher.doFinal(SECRET_BYTE_ARRAY);
+            return true;
+        } catch (UserNotAuthenticatedException e) {
+            // User is not authenticated, let's authenticate with device credentials.
+            return false;
+        } catch (KeyPermanentlyInvalidatedException e) {
+            // This happens if the lock screen has been disabled or reset after the key was
+            // generated after the key was generated.
+            createKey();
+            Toast.makeText(this, "Set up lockscreen after test ran. Retry the test.\n"
+                            + e.getMessage(),
+                    Toast.LENGTH_LONG).show();
+            return false;
+        } catch (BadPaddingException | IllegalBlockSizeException | KeyStoreException |
+                CertificateException | UnrecoverableKeyException | IOException
+                | NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private void showAuthenticationScreen() {
+        // Create the Confirm Credentials screen. You can customize the title and description. Or
+        // we will provide a generic one for you if you leave it null
+        Intent intent = mKeyguardManager.createConfirmDeviceCredentialIntent(null, null);
+        if (intent != null) {
+            startActivityForResult(intent, CONFIRM_CREDENTIALS_REQUEST_CODE);
+        }
+    }
+
+    private void showToast(String message) {
+        Toast.makeText(this, message, Toast.LENGTH_LONG)
+            .show();
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        switch (requestCode) {
+            case CONFIRM_CREDENTIALS_REQUEST_CODE:
+                if (resultCode == RESULT_OK) {
+                    if (tryEncrypt()) {
+                        showToast("Test passed.");
+                        getPassButton().setEnabled(true);
+                    } else {
+                        showToast("Test failed. Key not accessible after auth");
+                    }
+                }
+        }
+    }
+}
+
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/CtsMediaOutputSurface.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/CtsMediaOutputSurface.java
new file mode 100644
index 0000000..b28e06b
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/CtsMediaOutputSurface.java
@@ -0,0 +1,322 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.sensors;
+
+import android.graphics.SurfaceTexture;
+import android.opengl.EGL14;
+import android.opengl.EGLConfig;
+import android.opengl.EGLContext;
+import android.opengl.EGLDisplay;
+import android.opengl.EGLSurface;
+import android.util.Log;
+import android.view.Surface;
+
+
+//
+// This file is copied from android.hardware.cts.media
+//
+
+/**
+ * Holds state associated with a Surface used for MediaCodec decoder output.
+ * <p>
+ * The (width,height) constructor for this class will prepare GL, create a SurfaceTexture,
+ * and then create a Surface for that SurfaceTexture.  The Surface can be passed to
+ * MediaCodec.configure() to receive decoder output.  When a frame arrives, we latch the
+ * texture with updateTexImage, then render the texture with GL to a pbuffer.
+ * <p>
+ * The no-arg constructor skips the GL preparation step and doesn't allocate a pbuffer.
+ * Instead, it just creates the Surface and SurfaceTexture, and when a frame arrives
+ * we just draw it on whatever surface is current.
+ * <p>
+ * By default, the Surface will be using a BufferQueue in asynchronous mode, so we
+ * can potentially drop frames.
+ */
+class CtsMediaOutputSurface implements SurfaceTexture.OnFrameAvailableListener {
+    private static final String TAG = "OutputSurface";
+    private static final boolean VERBOSE = false;
+
+    private EGLDisplay mEGLDisplay = EGL14.EGL_NO_DISPLAY;
+    private EGLContext mEGLContext = EGL14.EGL_NO_CONTEXT;
+    private EGLSurface mEGLSurface = EGL14.EGL_NO_SURFACE;
+
+    private SurfaceTexture mSurfaceTexture;
+    private Surface mSurface;
+
+    private Object mFrameSyncObject = new Object();     // guards mFrameAvailable
+    private boolean mFrameAvailable;
+
+    private CtsMediaTextureRender mTextureRender;
+
+    /**
+     * Creates an OutputSurface backed by a pbuffer with the specifed dimensions.  The new
+     * EGL context and surface will be made current.  Creates a Surface that can be passed
+     * to MediaCodec.configure().
+     */
+    public CtsMediaOutputSurface(int width, int height) {
+        if (width <= 0 || height <= 0) {
+            throw new IllegalArgumentException();
+        }
+
+        eglSetup(width, height);
+        makeCurrent();
+
+        setup(this);
+    }
+
+    /**
+     * Creates an OutputSurface using the current EGL context (rather than establishing a
+     * new one).  Creates a Surface that can be passed to MediaCodec.configure().
+     */
+    public CtsMediaOutputSurface() {
+        setup(this);
+    }
+
+    public CtsMediaOutputSurface(final SurfaceTexture.OnFrameAvailableListener listener) {
+        setup(listener);
+    }
+
+    /**
+     * Creates instances of TextureRender and SurfaceTexture, and a Surface associated
+     * with the SurfaceTexture.
+     */
+    private void setup(SurfaceTexture.OnFrameAvailableListener listener) {
+        mTextureRender = new CtsMediaTextureRender();
+        mTextureRender.surfaceCreated();
+
+        // Even if we don't access the SurfaceTexture after the constructor returns, we
+        // still need to keep a reference to it.  The Surface doesn't retain a reference
+        // at the Java level, so if we don't either then the object can get GCed, which
+        // causes the native finalizer to run.
+        if (VERBOSE) Log.d(TAG, "textureID=" + mTextureRender.getTextureId());
+        mSurfaceTexture = new SurfaceTexture(mTextureRender.getTextureId());
+
+        // This doesn't work if OutputSurface is created on the thread that CTS started for
+        // these test cases.
+        //
+        // The CTS-created thread has a Looper, and the SurfaceTexture constructor will
+        // create a Handler that uses it.  The "frame available" message is delivered
+        // there, but since we're not a Looper-based thread we'll never see it.  For
+        // this to do anything useful, OutputSurface must be created on a thread without
+        // a Looper, so that SurfaceTexture uses the main application Looper instead.
+        //
+        // Java language note: passing "this" out of a constructor is generally unwise,
+        // but we should be able to get away with it here.
+        mSurfaceTexture.setOnFrameAvailableListener(listener);
+
+        mSurface = new Surface(mSurfaceTexture);
+    }
+
+    /**
+     * Prepares EGL.  We want a GLES 2.0 context and a surface that supports pbuffer.
+     */
+    private void eglSetup(int width, int height) {
+        mEGLDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
+        if (mEGLDisplay == EGL14.EGL_NO_DISPLAY) {
+            throw new RuntimeException("unable to get EGL14 display");
+        }
+        int[] version = new int[2];
+        if (!EGL14.eglInitialize(mEGLDisplay, version, 0, version, 1)) {
+            mEGLDisplay = null;
+            throw new RuntimeException("unable to initialize EGL14");
+        }
+
+        // Configure EGL for pbuffer and OpenGL ES 2.0.  We want enough RGB bits
+        // to be able to tell if the frame is reasonable.
+        int[] attribList = {
+                EGL14.EGL_RED_SIZE, 8,
+                EGL14.EGL_GREEN_SIZE, 8,
+                EGL14.EGL_BLUE_SIZE, 8,
+                EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT,
+                EGL14.EGL_SURFACE_TYPE, EGL14.EGL_PBUFFER_BIT,
+                EGL14.EGL_NONE
+        };
+        EGLConfig[] configs = new EGLConfig[1];
+        int[] numConfigs = new int[1];
+        if (!EGL14.eglChooseConfig(mEGLDisplay, attribList, 0, configs, 0, configs.length,
+                numConfigs, 0)) {
+            throw new RuntimeException("unable to find RGB888+recordable ES2 EGL config");
+        }
+
+        // Configure context for OpenGL ES 2.0.
+        int[] attrib_list = {
+                EGL14.EGL_CONTEXT_CLIENT_VERSION, 2,
+                EGL14.EGL_NONE
+        };
+        mEGLContext = EGL14.eglCreateContext(mEGLDisplay, configs[0], EGL14.EGL_NO_CONTEXT,
+                attrib_list, 0);
+        checkEglError("eglCreateContext");
+        if (mEGLContext == null) {
+            throw new RuntimeException("null context");
+        }
+
+        // Create a pbuffer surface.  By using this for output, we can use glReadPixels
+        // to test values in the output.
+        int[] surfaceAttribs = {
+                EGL14.EGL_WIDTH, width,
+                EGL14.EGL_HEIGHT, height,
+                EGL14.EGL_NONE
+        };
+        mEGLSurface = EGL14.eglCreatePbufferSurface(mEGLDisplay, configs[0], surfaceAttribs, 0);
+        checkEglError("eglCreatePbufferSurface");
+        if (mEGLSurface == null) {
+            throw new RuntimeException("surface was null");
+        }
+    }
+
+    /**
+     * Discard all resources held by this class, notably the EGL context.
+     */
+    public void release() {
+        if (mEGLDisplay != EGL14.EGL_NO_DISPLAY) {
+            EGL14.eglDestroySurface(mEGLDisplay, mEGLSurface);
+            EGL14.eglDestroyContext(mEGLDisplay, mEGLContext);
+            EGL14.eglReleaseThread();
+            EGL14.eglTerminate(mEGLDisplay);
+        }
+
+        mSurface.release();
+
+        // this causes a bunch of warnings that appear harmless but might confuse someone:
+        //  W BufferQueue: [unnamed-3997-2] cancelBuffer: BufferQueue has been abandoned!
+        //mSurfaceTexture.release();
+
+        mEGLDisplay = EGL14.EGL_NO_DISPLAY;
+        mEGLContext = EGL14.EGL_NO_CONTEXT;
+        mEGLSurface = EGL14.EGL_NO_SURFACE;
+
+        mTextureRender = null;
+        mSurface = null;
+        mSurfaceTexture = null;
+    }
+
+    /**
+     * Makes our EGL context and surface current.
+     */
+    public void makeCurrent() {
+        if (!EGL14.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext)) {
+            throw new RuntimeException("eglMakeCurrent failed");
+        }
+    }
+
+    /**
+     * Returns the Surface that we draw onto.
+     */
+    public Surface getSurface() {
+        return mSurface;
+    }
+
+    /**
+     * Replaces the fragment shader.
+     */
+    public void changeFragmentShader(String fragmentShader) {
+        mTextureRender.changeFragmentShader(fragmentShader);
+    }
+
+    /**
+     * Latches the next buffer into the texture.  Must be called from the thread that created
+     * the OutputSurface object, after the onFrameAvailable callback has signaled that new
+     * data is available.
+     */
+    public void awaitNewImage() {
+        final int TIMEOUT_MS = 500;
+
+        synchronized (mFrameSyncObject) {
+            while (!mFrameAvailable) {
+                try {
+                    // Wait for onFrameAvailable() to signal us.  Use a timeout to avoid
+                    // stalling the test if it doesn't arrive.
+                    mFrameSyncObject.wait(TIMEOUT_MS);
+                    if (!mFrameAvailable) {
+                        // TODO: if "spurious wakeup", continue while loop
+                        throw new RuntimeException("Surface frame wait timed out");
+                    }
+                } catch (InterruptedException ie) {
+                    // shouldn't happen
+                    throw new RuntimeException(ie);
+                }
+            }
+            mFrameAvailable = false;
+        }
+
+        // Latch the data.
+        mTextureRender.checkGlError("before updateTexImage");
+        mSurfaceTexture.updateTexImage();
+    }
+
+    /**
+     * Wait up to given timeout until new image become available.
+     * @param timeoutMs
+     * @return true if new image is available. false for no new image until timeout.
+     */
+    public boolean checkForNewImage(int timeoutMs) {
+        synchronized (mFrameSyncObject) {
+            while (!mFrameAvailable) {
+                try {
+                    // Wait for onFrameAvailable() to signal us.  Use a timeout to avoid
+                    // stalling the test if it doesn't arrive.
+                    mFrameSyncObject.wait(timeoutMs);
+                    if (!mFrameAvailable) {
+                        return false;
+                    }
+                } catch (InterruptedException ie) {
+                    // shouldn't happen
+                    throw new RuntimeException(ie);
+                }
+            }
+            mFrameAvailable = false;
+        }
+
+        // Latch the data.
+        mTextureRender.checkGlError("before updateTexImage");
+        mSurfaceTexture.updateTexImage();
+        return true;
+    }
+
+    /**
+     * Draws the data from SurfaceTexture onto the current EGL surface.
+     */
+    public void drawImage() {
+        mTextureRender.drawFrame(mSurfaceTexture);
+    }
+
+    public void latchImage() {
+        mTextureRender.checkGlError("before updateTexImage");
+        mSurfaceTexture.updateTexImage();
+    }
+
+    @Override
+    public void onFrameAvailable(SurfaceTexture st) {
+        if (VERBOSE) Log.d(TAG, "new frame available");
+        synchronized (mFrameSyncObject) {
+            if (mFrameAvailable) {
+                throw new RuntimeException("mFrameAvailable already set, frame could be dropped");
+            }
+            mFrameAvailable = true;
+            mFrameSyncObject.notifyAll();
+        }
+    }
+
+    /**
+     * Checks for EGL errors.
+     */
+    private void checkEglError(String msg) {
+        int error;
+        if ((error = EGL14.eglGetError()) != EGL14.EGL_SUCCESS) {
+            throw new RuntimeException(msg + ": EGL error: 0x" + Integer.toHexString(error));
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/CtsMediaTextureRender.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/CtsMediaTextureRender.java
new file mode 100644
index 0000000..a96033d
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/CtsMediaTextureRender.java
@@ -0,0 +1,306 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.sensors;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+import android.graphics.Bitmap;
+import android.graphics.SurfaceTexture;
+import android.opengl.GLES11Ext;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.util.Log;
+
+
+//
+// This file is copied from android.hardware.cts.media
+//
+
+/**
+ * Code for rendering a texture onto a surface using OpenGL ES 2.0.
+ */
+class CtsMediaTextureRender {
+    private static final String TAG = "TextureRender";
+
+    private static final int FLOAT_SIZE_BYTES = 4;
+    private static final int TRIANGLE_VERTICES_DATA_STRIDE_BYTES = 5 * FLOAT_SIZE_BYTES;
+    private static final int TRIANGLE_VERTICES_DATA_POS_OFFSET = 0;
+    private static final int TRIANGLE_VERTICES_DATA_UV_OFFSET = 3;
+    private final float[] mTriangleVerticesData = {
+        // X, Y, Z, U, V
+        -1.0f, -1.0f, 0, 0.f, 0.f,
+         1.0f, -1.0f, 0, 1.f, 0.f,
+        -1.0f,  1.0f, 0, 0.f, 1.f,
+         1.0f,  1.0f, 0, 1.f, 1.f,
+    };
+
+    private FloatBuffer mTriangleVertices;
+
+    private static final String VERTEX_SHADER =
+            "uniform mat4 uMVPMatrix;\n" +
+            "uniform mat4 uSTMatrix;\n" +
+            "attribute vec4 aPosition;\n" +
+            "attribute vec4 aTextureCoord;\n" +
+            "varying vec2 vTextureCoord;\n" +
+            "void main() {\n" +
+            "  gl_Position = uMVPMatrix * aPosition;\n" +
+            "  vTextureCoord = (uSTMatrix * aTextureCoord).xy;\n" +
+            "}\n";
+
+    private static final String FRAGMENT_SHADER =
+            "#extension GL_OES_EGL_image_external : require\n" +
+            "precision mediump float;\n" +      // highp here doesn't seem to matter
+            "varying vec2 vTextureCoord;\n" +
+            "uniform samplerExternalOES sTexture;\n" +
+            "void main() {\n" +
+            "  gl_FragColor = texture2D(sTexture, vTextureCoord);\n" +
+            "}\n";
+
+    private float[] mMVPMatrix = new float[16];
+    private float[] mSTMatrix = new float[16];
+
+    private int mProgram;
+    private int mTextureID = -12345;
+    private int muMVPMatrixHandle;
+    private int muSTMatrixHandle;
+    private int maPositionHandle;
+    private int maTextureHandle;
+
+    public CtsMediaTextureRender() {
+        mTriangleVertices = ByteBuffer.allocateDirect(
+            mTriangleVerticesData.length * FLOAT_SIZE_BYTES)
+                .order(ByteOrder.nativeOrder()).asFloatBuffer();
+        mTriangleVertices.put(mTriangleVerticesData).position(0);
+
+        Matrix.setIdentityM(mSTMatrix, 0);
+    }
+
+    public int getTextureId() {
+        return mTextureID;
+    }
+
+    public void drawFrame(SurfaceTexture st) {
+        checkGlError("onDrawFrame start");
+        st.getTransformMatrix(mSTMatrix);
+
+        GLES20.glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
+        GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+
+        GLES20.glUseProgram(mProgram);
+        checkGlError("glUseProgram");
+
+        GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
+        GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID);
+
+        mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET);
+        GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,
+            TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
+        checkGlError("glVertexAttribPointer maPosition");
+        GLES20.glEnableVertexAttribArray(maPositionHandle);
+        checkGlError("glEnableVertexAttribArray maPositionHandle");
+
+        mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET);
+        GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false,
+            TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
+        checkGlError("glVertexAttribPointer maTextureHandle");
+        GLES20.glEnableVertexAttribArray(maTextureHandle);
+        checkGlError("glEnableVertexAttribArray maTextureHandle");
+
+        Matrix.setIdentityM(mMVPMatrix, 0);
+        GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0);
+        GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0);
+
+        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
+        checkGlError("glDrawArrays");
+        GLES20.glFinish();
+    }
+
+    /**
+     * Initializes GL state.  Call this after the EGL surface has been created and made current.
+     */
+    public void surfaceCreated() {
+        mProgram = createProgram(VERTEX_SHADER, FRAGMENT_SHADER);
+        if (mProgram == 0) {
+            throw new RuntimeException("failed creating program");
+        }
+        maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
+        checkGlError("glGetAttribLocation aPosition");
+        if (maPositionHandle == -1) {
+            throw new RuntimeException("Could not get attrib location for aPosition");
+        }
+        maTextureHandle = GLES20.glGetAttribLocation(mProgram, "aTextureCoord");
+        checkGlError("glGetAttribLocation aTextureCoord");
+        if (maTextureHandle == -1) {
+            throw new RuntimeException("Could not get attrib location for aTextureCoord");
+        }
+
+        muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
+        checkGlError("glGetUniformLocation uMVPMatrix");
+        if (muMVPMatrixHandle == -1) {
+            throw new RuntimeException("Could not get attrib location for uMVPMatrix");
+        }
+
+        muSTMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uSTMatrix");
+        checkGlError("glGetUniformLocation uSTMatrix");
+        if (muSTMatrixHandle == -1) {
+            throw new RuntimeException("Could not get attrib location for uSTMatrix");
+        }
+
+
+        int[] textures = new int[1];
+        GLES20.glGenTextures(1, textures, 0);
+
+        mTextureID = textures[0];
+        GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID);
+        checkGlError("glBindTexture mTextureID");
+
+        GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER,
+                GLES20.GL_NEAREST);
+        GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER,
+                GLES20.GL_LINEAR);
+        GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S,
+                GLES20.GL_CLAMP_TO_EDGE);
+        GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T,
+                GLES20.GL_CLAMP_TO_EDGE);
+        checkGlError("glTexParameter");
+    }
+
+    /**
+     * Replaces the fragment shader.
+     */
+    public void changeFragmentShader(String fragmentShader) {
+        GLES20.glDeleteProgram(mProgram);
+        mProgram = createProgram(VERTEX_SHADER, fragmentShader);
+        if (mProgram == 0) {
+            throw new RuntimeException("failed creating program");
+        }
+    }
+
+    private int loadShader(int shaderType, String source) {
+        int shader = GLES20.glCreateShader(shaderType);
+        checkGlError("glCreateShader type=" + shaderType);
+        GLES20.glShaderSource(shader, source);
+        GLES20.glCompileShader(shader);
+        int[] compiled = new int[1];
+        GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);
+        if (compiled[0] == 0) {
+            Log.e(TAG, "Could not compile shader " + shaderType + ":");
+            Log.e(TAG, " " + GLES20.glGetShaderInfoLog(shader));
+            GLES20.glDeleteShader(shader);
+            shader = 0;
+        }
+        return shader;
+    }
+
+    private int createProgram(String vertexSource, String fragmentSource) {
+        int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);
+        if (vertexShader == 0) {
+            return 0;
+        }
+        int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
+        if (pixelShader == 0) {
+            return 0;
+        }
+
+        int program = GLES20.glCreateProgram();
+        checkGlError("glCreateProgram");
+        if (program == 0) {
+            Log.e(TAG, "Could not create program");
+        }
+        GLES20.glAttachShader(program, vertexShader);
+        checkGlError("glAttachShader");
+        GLES20.glAttachShader(program, pixelShader);
+        checkGlError("glAttachShader");
+        GLES20.glLinkProgram(program);
+        int[] linkStatus = new int[1];
+        GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
+        if (linkStatus[0] != GLES20.GL_TRUE) {
+            Log.e(TAG, "Could not link program: ");
+            Log.e(TAG, GLES20.glGetProgramInfoLog(program));
+            GLES20.glDeleteProgram(program);
+            program = 0;
+        }
+        return program;
+    }
+
+    public void checkGlError(String op) {
+        int error;
+        while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
+            Log.e(TAG, op + ": glError " + error);
+            throw new RuntimeException(op + ": glError " + error);
+        }
+    }
+
+    /**
+     * Saves the current frame to disk as a PNG image.  Frame starts from (0,0).
+     * <p>
+     * Useful for debugging.
+     */
+    public static void saveFrame(String filename, int width, int height) {
+        // glReadPixels gives us a ByteBuffer filled with what is essentially big-endian RGBA
+        // data (i.e. a byte of red, followed by a byte of green...).  We need an int[] filled
+        // with native-order ARGB data to feed to Bitmap.
+        //
+        // If we implement this as a series of buf.get() calls, we can spend 2.5 seconds just
+        // copying data around for a 720p frame.  It's better to do a bulk get() and then
+        // rearrange the data in memory.  (For comparison, the PNG compress takes about 500ms
+        // for a trivial frame.)
+        //
+        // So... we set the ByteBuffer to little-endian, which should turn the bulk IntBuffer
+        // get() into a straight memcpy on most Android devices.  Our ints will hold ABGR data.
+        // Swapping B and R gives us ARGB.  We need about 30ms for the bulk get(), and another
+        // 270ms for the color swap.
+        //
+        // Making this even more interesting is the upside-down nature of GL, which means we
+        // may want to flip the image vertically here.
+
+        ByteBuffer buf = ByteBuffer.allocateDirect(width * height * 4);
+        buf.order(ByteOrder.LITTLE_ENDIAN);
+        GLES20.glReadPixels(0, 0, width, height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buf);
+        buf.rewind();
+
+        int pixelCount = width * height;
+        int[] colors = new int[pixelCount];
+        buf.asIntBuffer().get(colors);
+        for (int i = 0; i < pixelCount; i++) {
+            int c = colors[i];
+            colors[i] = (c & 0xff00ff00) | ((c & 0x00ff0000) >> 16) | ((c & 0x000000ff) << 16);
+        }
+
+        FileOutputStream fos = null;
+        try {
+            fos = new FileOutputStream(filename);
+            Bitmap bmp = Bitmap.createBitmap(colors, width, height, Bitmap.Config.ARGB_8888);
+            bmp.compress(Bitmap.CompressFormat.PNG, 90, fos);
+            bmp.recycle();
+        } catch (IOException ioe) {
+            throw new RuntimeException("Failed to write file " + filename, ioe);
+        } finally {
+            try {
+                if (fos != null) fos.close();
+            } catch (IOException ioe2) {
+                throw new RuntimeException("Failed to close file " + filename, ioe2);
+            }
+        }
+        Log.d(TAG, "Saved " + width + "x" + height + " frame as '" + filename + "'");
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/DeviceSuspendTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/DeviceSuspendTestActivity.java
new file mode 100644
index 0000000..83e3054
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/DeviceSuspendTestActivity.java
@@ -0,0 +1,321 @@
+package com.android.cts.verifier.sensors;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
+import com.android.cts.verifier.sensors.helpers.SensorTestScreenManipulator;
+
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.hardware.TriggerEvent;
+import android.hardware.TriggerEventListener;
+import android.hardware.cts.helpers.MovementDetectorHelper;
+import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.SensorTestStateNotSupportedException;
+import android.hardware.cts.helpers.TestSensorEnvironment;
+import android.hardware.cts.helpers.TestSensorEvent;
+import android.hardware.cts.helpers.TestSensorEventListener;
+import android.hardware.cts.helpers.TestSensorManager;
+import android.hardware.cts.helpers.sensoroperations.TestSensorOperation;
+import android.hardware.cts.helpers.SensorNotSupportedException;
+import android.hardware.cts.helpers.sensorverification.BatchArrivalVerification;
+import android.os.PowerManager;
+import android.os.PowerManager.WakeLock;
+import android.os.SystemClock;
+import android.support.v4.content.LocalBroadcastManager;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+
+import junit.framework.Assert;
+
+public class DeviceSuspendTestActivity
+            extends SensorCtsVerifierTestActivity {
+        public DeviceSuspendTestActivity() {
+            super(DeviceSuspendTestActivity.class);
+        }
+
+        private SensorTestScreenManipulator mScreenManipulator;
+        private PowerManager.WakeLock mDeviceSuspendLock;
+        private PendingIntent mPendingIntent;
+        private AlarmManager mAlarmManager;
+        private static String ACTION_ALARM = "DeviceSuspendTestActivity.ACTION_ALARM";
+        private static String TAG = "DeviceSuspendSensorTest";
+        private SensorManager mSensorManager;
+
+        @Override
+        protected void activitySetUp() throws InterruptedException {
+            mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
+            mScreenManipulator = new SensorTestScreenManipulator(this);
+            mScreenManipulator.initialize(this);
+            LocalBroadcastManager.getInstance(this).registerReceiver(myBroadCastReceiver,
+                                            new IntentFilter(ACTION_ALARM));
+
+            Intent intent = new Intent(this, AlarmReceiver.class);
+            mPendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
+
+            mAlarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
+
+            PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
+            mDeviceSuspendLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
+                                                "DeviceSuspendTestActivity");
+            mDeviceSuspendLock.acquire();
+            SensorTestLogger logger = getTestLogger();
+            logger.logInstructions(R.string.snsr_device_suspend_test_instr);
+            waitForUserToBegin();
+        }
+
+        @Override
+        protected void activityCleanUp() {
+            mScreenManipulator.turnScreenOn();
+            try {
+                playSound();
+            } catch(InterruptedException e) {
+              // Ignore.
+            }
+            LocalBroadcastManager.getInstance(this).unregisterReceiver(myBroadCastReceiver);
+        }
+
+        @Override
+        protected void onDestroy() {
+            super.onDestroy();
+            if (mScreenManipulator != null) {
+                mScreenManipulator.releaseScreenOn();
+                mScreenManipulator.close();
+            }
+            if (mDeviceSuspendLock.isHeld()) {
+                mDeviceSuspendLock.release();
+            }
+        }
+
+        public static class AlarmReceiver extends BroadcastReceiver {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                Intent alarm_intent = new Intent(context, DeviceSuspendTestActivity.class);
+                alarm_intent.setAction(DeviceSuspendTestActivity.ACTION_ALARM);
+                LocalBroadcastManager.getInstance(context).sendBroadcastSync(alarm_intent);
+            }
+        }
+
+        public BroadcastReceiver myBroadCastReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                if (!mDeviceSuspendLock.isHeld()) {
+                    mDeviceSuspendLock.acquire();
+                }
+            }
+        };
+
+        public String testAPWakeUpWhenReportLatencyExpiresAccel() throws Throwable {
+            Sensor wakeUpSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER, true);
+            if (wakeUpSensor == null) {
+                throw new SensorNotSupportedException(Sensor.TYPE_ACCELEROMETER, true);
+            }
+            return runAPWakeUpWhenReportLatencyExpires(wakeUpSensor);
+        }
+
+        public String testAPWakeUpWhenReportLatencyExpiresGyro() throws Throwable {
+            Sensor wakeUpSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE, true);
+            if (wakeUpSensor == null) {
+                throw new SensorNotSupportedException(Sensor.TYPE_GYROSCOPE, true);
+            }
+            return runAPWakeUpWhenReportLatencyExpires(wakeUpSensor);
+        }
+
+        public String testAPWakeUpWhenReportLatencyExpiresMag() throws Throwable {
+            Sensor wakeUpSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD,true);
+            if (wakeUpSensor == null) {
+                throw new SensorNotSupportedException(Sensor.TYPE_MAGNETIC_FIELD, true);
+            }
+            return runAPWakeUpWhenFIFOFull(wakeUpSensor);
+        }
+
+        public String testAPWakeUpWhenFIFOFullAccel() throws Throwable {
+            Sensor wakeUpSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER, true);
+            if (wakeUpSensor == null) {
+                throw new SensorNotSupportedException(Sensor.TYPE_ACCELEROMETER, true);
+            }
+            return runAPWakeUpWhenFIFOFull(wakeUpSensor);
+        }
+
+        public String testAPWakeUpWhenFIFOFullGyro() throws Throwable {
+            Sensor wakeUpSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE, true);
+            if (wakeUpSensor == null) {
+                throw new SensorNotSupportedException(Sensor.TYPE_GYROSCOPE, true);
+            }
+            return runAPWakeUpWhenFIFOFull(wakeUpSensor);
+        }
+
+        public String testAPWakeUpWhenFIFOFullMag() throws Throwable {
+            Sensor wakeUpSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD,true);
+            if (wakeUpSensor == null) {
+                throw new SensorNotSupportedException(Sensor.TYPE_MAGNETIC_FIELD, true);
+            }
+            return runAPWakeUpWhenFIFOFull(wakeUpSensor);
+        }
+
+        public String testAccelBatchingInAPSuspendLargeReportLatency() throws Throwable {
+            Sensor accel = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
+            if (accel == null) {
+                throw new SensorNotSupportedException(Sensor.TYPE_ACCELEROMETER, false);
+            }
+            return runAPWakeUpByAlarmNonWakeSensor(accel, (int)TimeUnit.SECONDS.toMicros(1000));
+        }
+
+        public String testAccelBatchingInAPSuspendZeroReportLatency() throws Throwable {
+            Sensor accel = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
+           if (accel == null) {
+                throw new SensorNotSupportedException(Sensor.TYPE_ACCELEROMETER, false);
+            }
+            return runAPWakeUpByAlarmNonWakeSensor(accel, 0);
+        }
+
+        public String runAPWakeUpWhenReportLatencyExpires(Sensor sensor) throws Throwable {
+            int fifoMaxEventCount = sensor.getFifoMaxEventCount();
+            if (fifoMaxEventCount == 0) {
+                throw new SensorTestStateNotSupportedException("Batching not supported.");
+            }
+            int maximumExpectedSamplingPeriodUs = sensor.getMaxDelay();
+            if (maximumExpectedSamplingPeriodUs == 0) {
+                // If maxDelay is not defined, set the value for 5 Hz.
+                maximumExpectedSamplingPeriodUs = 200000;
+            }
+            int fifoBasedReportLatencyUs = fifoMaxEventCount * maximumExpectedSamplingPeriodUs;
+
+            // Ensure that FIFO based report latency is at least 20 seconds, we need at least 10
+            // seconds of time to allow the device to be in suspend state.
+            if (fifoBasedReportLatencyUs < 20000000L) {
+                throw new SensorTestStateNotSupportedException("FIFO too small to test reliably");
+            }
+
+            final int MAX_REPORT_LATENCY_US = 15000000; // 15 seconds
+            TestSensorEnvironment environment = new TestSensorEnvironment(
+                    this,
+                    sensor,
+                    false,
+                    maximumExpectedSamplingPeriodUs,
+                    MAX_REPORT_LATENCY_US,
+                    true /*isDeviceSuspendTest*/);
+
+            TestSensorOperation op = TestSensorOperation.createOperation(environment,
+                                                                          mDeviceSuspendLock,
+                                                                          false);
+            final int ALARM_WAKE_UP_DELAY_MS = MAX_REPORT_LATENCY_US/1000 +
+                (int)TimeUnit.SECONDS.toMillis(10);
+            op.addVerification(BatchArrivalVerification.getDefault(environment));
+            mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,
+                                    SystemClock.elapsedRealtime() + ALARM_WAKE_UP_DELAY_MS,
+                                    mPendingIntent);
+            try {
+                Log.i(TAG, "Running .. " + getCurrentTestNode().getName() + " " + sensor.getName());
+                op.execute(getCurrentTestNode());
+            } finally {
+                mAlarmManager.cancel(mPendingIntent);
+            }
+            return null;
+        }
+
+        public String runAPWakeUpWhenFIFOFull(Sensor sensor) throws Throwable {
+            int fifoMaxEventCount = sensor.getFifoMaxEventCount();
+            if (fifoMaxEventCount == 0) {
+                throw new SensorTestStateNotSupportedException("Batching not supported.");
+            }
+            // Try to fill the FIFO at the fastest rate and check if the time is enough to run
+            // the manual test.
+            int maximumExpectedSamplingPeriodUs = sensor.getMinDelay();
+            int fifoBasedReportLatencyUs = fifoMaxEventCount * maximumExpectedSamplingPeriodUs;
+
+            final int MIN_LATENCY_US = (int)TimeUnit.SECONDS.toMicros(20);
+            // Ensure that FIFO based report latency is at least 20 seconds, we need at least 10
+            // seconds of time to allow the device to be in suspend state.
+            if (fifoBasedReportLatencyUs < MIN_LATENCY_US) {
+                maximumExpectedSamplingPeriodUs = MIN_LATENCY_US/fifoMaxEventCount;
+                fifoBasedReportLatencyUs = MIN_LATENCY_US;
+            }
+
+            final int MAX_REPORT_LATENCY_US = Integer.MAX_VALUE;
+            final int ALARM_WAKE_UP_DELAY_MS = fifoBasedReportLatencyUs/1000 +
+                (int)TimeUnit.SECONDS.toMillis(10);
+            TestSensorEnvironment environment = new TestSensorEnvironment(
+                    this,
+                    sensor,
+                    false,
+                    maximumExpectedSamplingPeriodUs,
+                    MAX_REPORT_LATENCY_US,
+                    true /*isDeviceSuspendTest*/);
+
+           TestSensorOperation op = TestSensorOperation.createOperation(environment,
+                                                                        mDeviceSuspendLock,
+                                                                        true);
+            mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,
+                                    SystemClock.elapsedRealtime() + ALARM_WAKE_UP_DELAY_MS,
+                                    mPendingIntent);
+            op.addDefaultVerifications();
+            try {
+                Log.i(TAG, "Running .. " + getCurrentTestNode().getName() + " " + sensor.getName());
+                op.execute(getCurrentTestNode());
+            } finally {
+                mAlarmManager.cancel(mPendingIntent);
+            }
+            return null;
+        }
+
+        public String runAPWakeUpByAlarmNonWakeSensor(Sensor sensor, int maxReportLatencyUs)
+            throws  Throwable {
+            int fifoMaxEventCount = sensor.getFifoMaxEventCount();
+            if (fifoMaxEventCount == 0) {
+                throw new SensorTestStateNotSupportedException("Batching not supported.");
+            }
+            int maximumExpectedSamplingPeriodUs = sensor.getMaxDelay();
+            if (maximumExpectedSamplingPeriodUs == 0 ||
+                    maximumExpectedSamplingPeriodUs > 200000) {
+                // If maxDelay is not defined, set the value for 5 Hz.
+                maximumExpectedSamplingPeriodUs = 200000;
+            }
+            int fifoBasedReportLatencyUs = fifoMaxEventCount * maximumExpectedSamplingPeriodUs;
+
+            // Ensure that FIFO based report latency is at least 20 seconds, we need at least 10
+            // seconds of time to allow the device to be in suspend state.
+            if (fifoBasedReportLatencyUs < 20000000L) {
+                throw new SensorTestStateNotSupportedException("FIFO too small to test reliably");
+            }
+
+            TestSensorEnvironment environment = new TestSensorEnvironment(
+                    this,
+                    sensor,
+                    false,
+                    maximumExpectedSamplingPeriodUs,
+                    maxReportLatencyUs,
+                    true /*isDeviceSuspendTest*/);
+
+            final int ALARM_WAKE_UP_DELAY_MS = 20000;
+            TestSensorOperation op = TestSensorOperation.createOperation(environment,
+                                                                         mDeviceSuspendLock,
+                                                                         true);
+            mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,
+                                    SystemClock.elapsedRealtime() + ALARM_WAKE_UP_DELAY_MS,
+                                    mPendingIntent);
+            try {
+                Log.i(TAG, "Running .. " + getCurrentTestNode().getName() + " " + sensor.getName());
+                op.execute(getCurrentTestNode());
+            } finally {
+                mAlarmManager.cancel(mPendingIntent);
+            }
+            return null;
+        }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MotionIndicatorView.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MotionIndicatorView.java
new file mode 100644
index 0000000..12d4582
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MotionIndicatorView.java
@@ -0,0 +1,409 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.sensors;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.RectF;
+import android.hardware.SensorManager;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+
+/**
+ * A view class that draws the user prompt
+ *
+ * The following piece of code should show how to use this view.
+ *
+ *  public void testUI()  {
+ *     final int MAX_TILT_ANGLE = 70; // +/- 70
+ *
+ *     final int TILT_ANGLE_STEP = 5; // 5 degree(s) per step
+ *     final int YAW_ANGLE_STEP = 10; // 10 degree(s) per step
+ *
+ *     RangeCoveredRegister xCovered, yCovered, zCovered;
+ *     xCovered = new RangeCoveredRegister(-MAX_TILT_ANGLE, +MAX_TILT_ANGLE, TILT_ANGLE_STEP);
+ *
+ *     yCovered = new RangeCoveredRegister(-MAX_TILT_ANGLE, +MAX_TILT_ANGLE, TILT_ANGLE_STEP);
+ *     zCovered = new RangeCoveredRegister(YAW_ANGLE_STEP);
+ *
+ *     xCovered.update(40);
+ *     xCovered.update(-40);
+ *     xCovered.update(12);
+ *
+ *     yCovered.update(50);
+ *     yCovered.update(-51);
+ *
+ *     zCovered.update(150);
+ *     zCovered.update(42);
+ *
+ *     setDataProvider(xCovered, yCovered, zCovered);
+ *     enableAxis(RVCVRecordActivity.AXIS_ALL); //debug mode, show all three axis
+ * }
+ */
+public class MotionIndicatorView extends View {
+    private final String TAG = "MotionIndicatorView";
+    private final boolean LOCAL_LOGV = false;
+
+    private Paint mCursorPaint;
+    private Paint mLimitPaint;
+    private Paint mCoveredPaint;
+    private Paint mRangePaint;
+    private Paint mEraserPaint;
+
+    // UI settings
+    private final int XBAR_WIDTH = 50;
+    private final int XBAR_MARGIN = 50;
+    private final int XBAR_CURSOR_ADD = 20;
+
+    private final int YBAR_WIDTH = 50;
+    private final int YBAR_MARGIN = 50;
+    private final int YBAR_CURSOR_ADD = 20;
+
+    private final int ZRING_WIDTH = 50;
+    private final int ZRING_CURSOR_ADD = 30;
+
+
+    private int mXSize, mYSize;
+    private RectF mZBoundOut, mZBoundOut2, mZBoundIn, mZBoundIn2;
+
+    private RangeCoveredRegister mXCovered, mYCovered, mZCovered;
+
+    private boolean mXEnabled, mYEnabled, mZEnabled;
+
+    /**
+     * Constructor
+     * @param context
+     */
+    public MotionIndicatorView(Context context) {
+        super(context);
+        init();
+    }
+
+    /**
+     * Constructor
+     * @param context Application context
+     * @param attrs
+     */
+    public MotionIndicatorView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init();
+    }
+
+    /**
+     * Initialize the Paint objects
+     */
+    private void init() {
+
+        mCursorPaint = new Paint();
+        mCursorPaint.setColor(Color.BLUE);
+
+        mLimitPaint = new Paint();
+        mLimitPaint.setColor(Color.YELLOW);
+
+        mCoveredPaint = new Paint();
+        mCoveredPaint.setColor(Color.CYAN);
+
+        mRangePaint = new Paint();
+        mRangePaint.setColor(Color.DKGRAY);
+
+        mEraserPaint = new Paint();
+        mEraserPaint.setColor(Color.TRANSPARENT);
+        // ensure the erasing effect
+        mEraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
+    }
+
+    /**
+     * Connect the view to certain data provider objects
+     * @param x Data provider for x direction tilt angle
+     * @param y Data provider for y direction tilt angle
+     * @param z Data provider for z rotation
+     */
+    public void setDataProvider(RangeCoveredRegister x,
+                                RangeCoveredRegister y,
+                                RangeCoveredRegister z)    {
+        mXCovered = x;
+        mYCovered = y;
+        mZCovered = z;
+    }
+
+    /**
+     * Set the active axis for display
+     *
+     * @param axis AXIS_X, AXIS_Y, AXIS_Z for x, y, z axis indicators, or AXIS_ALL for all three.
+     */
+    public void enableAxis(int axis)  {
+        mXEnabled = mYEnabled = mZEnabled = false;
+
+        switch(axis)
+        {
+            case SensorManager.AXIS_X:
+                mXEnabled = true;
+                break;
+            case SensorManager.AXIS_Y:
+                mYEnabled = true;
+                break;
+            case SensorManager.AXIS_Z:
+                mZEnabled = true;
+                break;
+            case RVCVRecordActivity.AXIS_ALL:
+                mXEnabled = mYEnabled = mZEnabled = true;
+        }
+    }
+
+    /**
+     * Doing some pre-calculation that only changes when view dimensions are changed.
+     * @param w
+     * @param h
+     * @param oldw
+     * @param oldh
+     */
+    @Override
+    protected void onSizeChanged (int w, int h, int oldw, int oldh) {
+        mXSize = w;
+        mYSize = h;
+
+        mZBoundOut = new RectF(w/2-w/2.5f, h/2-w/2.5f, w/2+w/2.5f, h/2+w/2.5f);
+        mZBoundOut2 = new RectF(
+                w/2-w/2.5f-ZRING_CURSOR_ADD, h/2-w/2.5f-ZRING_CURSOR_ADD,
+                w/2+w/2.5f+ZRING_CURSOR_ADD, h/2+w/2.5f+ZRING_CURSOR_ADD);
+        mZBoundIn = new RectF(
+                w/2-w/2.5f+ZRING_WIDTH, h/2-w/2.5f+ZRING_WIDTH,
+                w/2+w/2.5f-ZRING_WIDTH, h/2+w/2.5f-ZRING_WIDTH);
+        mZBoundIn2 = new RectF(
+                w/2-w/2.5f+ZRING_WIDTH+ZRING_CURSOR_ADD, h/2-w/2.5f+ZRING_WIDTH+ZRING_CURSOR_ADD,
+                w/2+w/2.5f-ZRING_WIDTH-ZRING_CURSOR_ADD, h/2+w/2.5f-ZRING_WIDTH-ZRING_CURSOR_ADD);
+
+        if (LOCAL_LOGV) Log.v(TAG, "New view size = ("+w+", "+h+")");
+    }
+
+    /**
+     * Draw UI depends on the selected axis and registered value
+     *
+     * @param canvas the canvas to draw on
+     */
+    @Override
+    protected void onDraw(Canvas canvas) {
+        super.onDraw(canvas);
+        int i,t;
+
+        Paint p = new Paint();
+        p.setColor(Color.YELLOW);
+        canvas.drawRect(10,10, 50, 50, p);
+
+        if (mXEnabled && mXCovered != null) {
+            int xNStep = mXCovered.getNSteps() + 4; // two on each side as a buffer
+            int xStepSize = mXSize * 3/4 / xNStep;
+            int xLeft = mXSize * 1/8 + (mXSize * 3/4 % xNStep)/2;
+
+            // base bar
+            canvas.drawRect(xLeft, XBAR_MARGIN,
+                    xLeft+xStepSize*xNStep-1, XBAR_WIDTH+XBAR_MARGIN, mRangePaint);
+
+            // covered range
+            for (i=0; i<mXCovered.getNSteps(); ++i) {
+                if (mXCovered.isCovered(i)) {
+                    canvas.drawRect(
+                            xLeft+xStepSize*(i+2), XBAR_MARGIN,
+                            xLeft+xStepSize*(i+3)-1, XBAR_WIDTH + XBAR_MARGIN,
+                            mCoveredPaint);
+                }
+            }
+
+            // limit
+            canvas.drawRect(xLeft+xStepSize*2-4, XBAR_MARGIN,
+                    xLeft+xStepSize*2+3, XBAR_WIDTH+XBAR_MARGIN, mLimitPaint);
+            canvas.drawRect(xLeft+xStepSize*(xNStep-2)-4, XBAR_MARGIN,
+                    xLeft+xStepSize*(xNStep-2)+3, XBAR_WIDTH+XBAR_MARGIN, mLimitPaint);
+
+            // cursor
+            t = (int)(xLeft+xStepSize*(mXCovered.getLastValue()+2));
+            canvas.drawRect(t-4, XBAR_MARGIN-XBAR_CURSOR_ADD, t+3,
+                    XBAR_WIDTH+XBAR_MARGIN+XBAR_CURSOR_ADD, mCursorPaint);
+        }
+        if (mYEnabled && mYCovered != null) {
+            int yNStep = mYCovered.getNSteps() + 4; // two on each side as a buffer
+            int yStepSize = mYSize * 3/4 / yNStep;
+            int yLeft = mYSize * 1/8 + (mYSize * 3/4 % yNStep)/2;
+
+            // base bar
+            canvas.drawRect(YBAR_MARGIN, yLeft,
+                    YBAR_WIDTH+YBAR_MARGIN, yLeft+yStepSize*yNStep-1, mRangePaint);
+
+            // covered range
+            for (i=0; i<mYCovered.getNSteps(); ++i) {
+                if (mYCovered.isCovered(i)) {
+                    canvas.drawRect(
+                            YBAR_MARGIN, yLeft+yStepSize*(i+2),
+                            YBAR_WIDTH + YBAR_MARGIN, yLeft+yStepSize*(i+3)-1,
+                            mCoveredPaint);
+                }
+            }
+
+            // limit
+            canvas.drawRect(YBAR_MARGIN, yLeft + yStepSize * 2 - 4,
+                    YBAR_WIDTH + YBAR_MARGIN, yLeft + yStepSize * 2 + 3, mLimitPaint);
+            canvas.drawRect(YBAR_MARGIN, yLeft + yStepSize * (yNStep - 2) - 4,
+                    YBAR_WIDTH + YBAR_MARGIN, yLeft + yStepSize * (yNStep - 2) + 3, mLimitPaint);
+
+            // cursor
+            t = (int)(yLeft+yStepSize*(mYCovered.getLastValue()+2));
+            canvas.drawRect( YBAR_MARGIN-YBAR_CURSOR_ADD, t-4,
+                    YBAR_WIDTH+YBAR_MARGIN+YBAR_CURSOR_ADD, t+3, mCursorPaint);
+        }
+
+        if (mZEnabled && mZCovered != null) {
+            float stepSize  = 360.0f/mZCovered.getNSteps();
+
+            // base bar
+            canvas.drawArc(mZBoundOut,0, 360, true, mRangePaint);
+
+            // covered range
+            for (i=0; i<mZCovered.getNSteps(); ++i) {
+                if (mZCovered.isCovered(i)) {
+                    canvas.drawArc(mZBoundOut,i*stepSize-0.2f, stepSize+0.4f,
+                            true, mCoveredPaint);
+                }
+            }
+            // clear center
+            canvas.drawArc(mZBoundIn, 0, 360, true, mEraserPaint);
+            // cursor
+            canvas.drawArc(mZBoundOut2, mZCovered.getLastValue()*stepSize- 1, 2,
+                    true, mCursorPaint);
+            canvas.drawArc(mZBoundIn2, mZCovered.getLastValue()*stepSize-1.5f, 3,
+                    true, mEraserPaint);
+        }
+    }
+}
+
+/**
+ *  A range register class for the RVCVRecord Activity
+ */
+class RangeCoveredRegister {
+    enum MODE {
+        LINEAR,
+        ROTATE2D
+    }
+
+    private boolean[] mCovered;
+    private MODE mMode;
+    private int mStep;
+    private int mLow, mHigh;
+    private int mLastData;
+
+    // high is not inclusive
+    RangeCoveredRegister(int low, int high, int step) {
+        mMode = MODE.LINEAR;
+        mStep = step;
+        mLow = low;
+        mHigh = high;
+        init();
+    }
+
+    RangeCoveredRegister(int step) {
+        mMode = MODE.ROTATE2D;
+        mStep = step;
+        mLow = 0;
+        mHigh = 360;
+        init();
+    }
+
+    private void init() {
+        if (mMode == MODE.LINEAR) {
+            mCovered = new boolean[(mHigh-mLow)/mStep];
+        }else {
+            mCovered = new boolean[360/mStep];
+        }
+    }
+
+    /**
+     * Test if the range defined is fully covered.
+     *
+     * @return if the range is fully covered, return true; otherwise false.
+     */
+    public boolean isFullyCovered() {
+        for (boolean i:mCovered) {
+            if (!i) return false;
+        }
+        return true;
+    }
+
+    /**
+     * Test if a specific step is covered.
+     *
+     * @param i the step number
+     * @return if the step specified is covered, return true; otherwise false.
+     */
+    public boolean isCovered(int i) {
+        return mCovered[i];
+    }
+
+    /**
+     *
+     *
+     * @param data
+     * @return if this update changes the status of
+     */
+    public boolean update(int data) {
+        mLastData = data;
+
+        if (mMode == MODE.ROTATE2D) {
+            data %= 360;
+        }
+
+        int iStep = (data - mLow)/mStep;
+
+        if (iStep>=0 && iStep<getNSteps()) {
+            // only record valid data
+            mLastData = data;
+
+            if (mCovered[iStep]) {
+                return false;
+            } else {
+                mCovered[iStep] = true;
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Get the number of steps in this register
+     *
+     * @return The number of steps in this register
+     */
+    public int getNSteps() {
+        //if (mCovered == null) {
+        //return 0;
+        //}
+        return mCovered.length;
+    }
+
+    /**
+     * Get the last value updated
+     *
+     * @return The last value updated
+     */
+    public float getLastValue() {
+        // ensure float division
+        return ((float)(mLastData - mLow))/mStep;
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVCameraPreview.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVCameraPreview.java
new file mode 100644
index 0000000..a5b58f6
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVCameraPreview.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.sensors;
+
+// ----------------------------------------------------------------------
+
+import android.content.Context;
+import android.hardware.Camera;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+
+import java.io.IOException;
+import java.util.List;
+
+/** Camera preview class */
+public class RVCVCameraPreview extends SurfaceView implements SurfaceHolder.Callback {
+    private static final String TAG = "RVCVCameraPreview";
+    private static final boolean LOCAL_LOGD = true;
+
+    private SurfaceHolder mHolder;
+    private Camera mCamera;
+
+    /**
+     * Constructor
+     * @param context Activity context
+     * @param camera Camera object to be previewed
+     */
+    public RVCVCameraPreview(Context context, Camera camera) {
+        super(context);
+        mCamera = camera;
+        initSurface();
+    }
+
+    /**
+     * Constructor
+     * @param context Activity context
+     * @param attrs
+     */
+    public RVCVCameraPreview(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public void init(Camera camera) {
+        this.mCamera = camera;
+        initSurface();
+    }
+
+    private void initSurface() {
+        // Install a SurfaceHolder.Callback so we get notified when the
+        // underlying surface is created and destroyed.
+        mHolder = getHolder();
+        mHolder.addCallback(this);
+
+        // deprecated
+        // TODO: update this code to match new API level.
+        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
+    }
+
+    /**
+     *  SurfaceHolder.Callback
+     *  Surface is created, it is OK to start the camera preview now.
+     */
+    public void surfaceCreated(SurfaceHolder holder) {
+        // The Surface has been created, now tell the camera where to draw the preview.
+
+        if (mCamera == null) {
+            // preview camera does not exist
+            return;
+        }
+
+        try {
+            mCamera.setPreviewDisplay(holder);
+            mCamera.startPreview();
+        } catch (IOException e) {
+            if (LOCAL_LOGD) Log.d(TAG, "Error when starting camera preview: " + e.getMessage());
+        }
+    }
+    /**
+     *  SurfaceHolder.Callback
+     */
+    public void surfaceDestroyed(SurfaceHolder holder) {
+        // empty. Take care of releasing the Camera preview in your activity.
+    }
+
+    /**
+     *  SurfaceHolder.Callback
+     *  Restart camera preview if surface changed
+     */
+    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
+
+        if (mHolder.getSurface() == null || mCamera == null){
+            // preview surface or camera does not exist
+            return;
+        }
+
+        // stop preview before making changes
+        mCamera.stopPreview();
+
+        // the activity using this view is locked to this orientation, so hard code is fine
+        mCamera.setDisplayOrientation(90);
+
+        //do the same as if it is created again
+        surfaceCreated(holder);
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVRecordActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVRecordActivity.java
new file mode 100644
index 0000000..f90b27c
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVRecordActivity.java
@@ -0,0 +1,902 @@
+/*
+ * Copyright (C) 2007 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 com.android.cts.verifier.sensors;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.hardware.Camera;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.media.AudioManager;
+import android.media.CamcorderProfile;
+import android.media.MediaRecorder;
+import android.media.SoundPool;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Environment;
+import android.util.JsonWriter;
+import android.util.Log;
+import android.view.Window;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+import com.android.cts.verifier.R;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+
+// ----------------------------------------------------------------------
+
+/**
+ *  An activity that does recording of the camera video and rotation vector data at the same time.
+ */
+public class RVCVRecordActivity extends Activity {
+    private static final String TAG = "RVCVRecordActivity";
+    private static final boolean LOCAL_LOGV = false;
+
+    private MotionIndicatorView mIndicatorView;
+
+    private SoundPool mSoundPool;
+    private int [] mSoundPoolLookup;
+
+    private File mRecordDir;
+    private RecordProcedureController mController;
+    private VideoRecorder           mVideoRecorder;
+    private RVSensorLogger          mRVSensorLogger;
+    private CoverageManager         mCoverManager;
+    private CameraPreviewer         mPreviewer;
+
+    public static final int AXIS_NONE = 0;
+    public static final int AXIS_ALL = SensorManager.AXIS_X +
+                                       SensorManager.AXIS_Y +
+                                       SensorManager.AXIS_Z;
+
+    // For Rotation Vector algorithm research use
+    private final static boolean     LOG_RAW_SENSORS = false;
+    private RawSensorLogger          mRawSensorLogger;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // Hide the window title.
+        requestWindowFeature(Window.FEATURE_NO_TITLE);
+
+        // inflate xml
+        setContentView(R.layout.cam_preview_overlay);
+
+        // locate views
+        mIndicatorView = (MotionIndicatorView) findViewById(R.id.cam_indicator);
+
+        initStoragePath();
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        mController.quit();
+
+        mPreviewer.end();
+        endSoundPool();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        // delay the initialization as much as possible
+        init();
+    }
+
+    /** display toast message
+     *
+     * @param msg Message content
+     */
+    private void message(String msg) {
+
+        Context context = getApplicationContext();
+        int duration = Toast.LENGTH_SHORT;
+
+        Toast toast = Toast.makeText(context, msg, duration);
+        toast.show();
+    }
+
+    /**
+     *  Initialize components
+     *
+     */
+    private void init() {
+        mPreviewer = new CameraPreviewer();
+        mPreviewer.init();
+
+        mCoverManager = new CoverageManager();
+        mIndicatorView.setDataProvider(
+                mCoverManager.getAxis(SensorManager.AXIS_X),
+                mCoverManager.getAxis(SensorManager.AXIS_Y),
+                mCoverManager.getAxis(SensorManager.AXIS_Z)  );
+
+        initSoundPool();
+        mRVSensorLogger = new RVSensorLogger(this);
+
+        mVideoRecorder = new VideoRecorder(mPreviewer.getCamera());
+
+        if (LOG_RAW_SENSORS) {
+            mRawSensorLogger = new RawSensorLogger(mRecordDir);
+        }
+
+        mController = new RecordProcedureController(this);
+    }
+
+    /**
+     * Notify recording is completed. This is the successful exit.
+     */
+    public void notifyComplete() {
+        message("Capture completed!");
+
+        Uri resultUri = Uri.fromFile(mRecordDir);
+        Intent result = new Intent();
+        result.setData(resultUri);
+        setResult(Activity.RESULT_OK, result);
+
+        finish();
+    }
+
+    /**
+     * Notify the user what to do next in text
+     *
+     * @param axis SensorManager.AXIS_X or SensorManager.AXIS_Y or SensorManager.AXIS_Z
+     */
+    private void notifyPrompt(int axis) {
+        // It is not XYZ because of earlier design have different definition of
+        // X and Y
+        final String axisName = "YXZ";
+
+        message("Manipulate the device in " + axisName.charAt(axis-1) + " axis (as illustrated) about the pattern.");
+    }
+
+    /**
+     *  Ask indicator view to redraw
+     */
+    private void redrawIndicator() {
+        mIndicatorView.invalidate();
+    }
+
+    /**
+     * Switch to a different axis for display and logging
+     * @param axis
+     */
+    private void switchAxis(int axis) {
+        ImageView imageView = (ImageView) findViewById(R.id.cam_overlay);
+
+        final int [] prompts = {R.drawable.prompt_x, R.drawable.prompt_y, R.drawable.prompt_z};
+
+        if (axis >=SensorManager.AXIS_X && axis <=SensorManager.AXIS_Z) {
+            imageView.setImageResource(prompts[axis-1]);
+            mIndicatorView.enableAxis(axis);
+            mRVSensorLogger.updateRegister(mCoverManager.getAxis(axis), axis);
+            notifyPrompt(axis);
+        } else {
+            imageView.setImageDrawable(null);
+            mIndicatorView.enableAxis(AXIS_NONE);
+        }
+        redrawIndicator();
+    }
+
+    /**
+     * Asynchronized way to call switchAxis. Use this if caller is not on UI thread.
+     * @param axis @param axis SensorManager.AXIS_X or SensorManager.AXIS_Y or SensorManager.AXIS_Z
+     */
+    public void switchAxisAsync(int axis) {
+        // intended to be called from a non-UI thread
+        final int fAxis = axis;
+        runOnUiThread(new Runnable() {
+            public void run() {
+                // UI code goes here
+                switchAxis(fAxis);
+            }
+        });
+    }
+
+    /**
+     * Initialize sound pool for user notification
+     */
+    private void initSoundPool() {
+        final int MAX_STREAM = 10;
+        int i=0;
+        mSoundPool = new SoundPool(MAX_STREAM, AudioManager.STREAM_MUSIC, 0);
+        mSoundPoolLookup = new int[MAX_STREAM];
+
+        // TODO: add different sound into this
+        mSoundPoolLookup[i++] = mSoundPool.load(this, R.raw.next_axis, 1);
+        mSoundPoolLookup[i++] = mSoundPool.load(this, R.raw.next_axis, 1);
+        mSoundPoolLookup[i++] = mSoundPool.load(this, R.raw.next_axis, 1);
+
+    }
+    private void endSoundPool() {
+        mSoundPool.release();
+    }
+
+    /**
+     * Play notify sound to user
+     * @param id ID of the sound to be played
+     */
+    public void playNotifySound(int id) {
+        mSoundPool.play(mSoundPoolLookup[id], 1, 1, 0, 0, 1);
+    }
+
+    /**
+     * Start the sensor recording
+     */
+    public void startRecordSensor() {
+        mRVSensorLogger.init();
+        if (LOG_RAW_SENSORS) {
+            mRawSensorLogger.init();
+        }
+    }
+
+    /**
+     * Stop the sensor recording
+     */
+    public void stopRecordSensor() {
+        mRVSensorLogger.end();
+        if (LOG_RAW_SENSORS) {
+            mRawSensorLogger.end();
+        }
+    }
+
+    /**
+     * Start video recording
+     */
+    public void startRecordVideo() {
+        mVideoRecorder.init();
+    }
+
+    /**
+     * Stop video recording
+     */
+    public void stopRecordVideo() {
+        mVideoRecorder.end();
+    }
+
+    /**
+     * Wait until a sensor recording for a certain axis is fully covered
+     * @param axis
+     */
+    public void waitUntilCovered(int axis) {
+        mCoverManager.waitUntilCovered(axis);
+    }
+
+
+    /**
+     *
+     */
+    private void initStoragePath() {
+        File rxcvRecDataDir = new File(Environment.getExternalStorageDirectory(),"RVCVRecData");
+
+        // Create the storage directory if it does not exist
+        if (! rxcvRecDataDir.exists()) {
+            if (! rxcvRecDataDir.mkdirs()) {
+                Log.e(TAG, "failed to create main data directory");
+            }
+        }
+
+        mRecordDir = new File(rxcvRecDataDir, new SimpleDateFormat("yyMMdd-hhmmss").format(new Date()));
+
+        if (! mRecordDir.mkdirs()) {
+            Log.e(TAG, "failed to create rec data directory");
+        }
+    }
+
+    /**
+     * Get the sensor log file path
+     * @return Path of the sensor log file
+     */
+    public String getSensorLogFilePath() {
+        return new File(mRecordDir, "sensor.log").getPath();
+    }
+
+    /**
+     * Get the video recording file path
+     * @return Path of the video recording file
+     */
+    public String getVideoRecFilePath() {
+        return new File(mRecordDir, "video.mp4").getPath();
+    }
+
+    /**
+     * Write out important camera/video information to a JSON file
+     * @param width         width of frame
+     * @param height        height of frame
+     * @param frameRate     frame rate in fps
+     * @param fovW          field of view in width direction
+     * @param fovH          field of view in height direction
+     */
+    public void writeVideoMetaInfo(int width, int height, float frameRate, float fovW, float fovH) {
+        try {
+            JsonWriter writer =
+                    new JsonWriter(
+                        new OutputStreamWriter(
+                                new FileOutputStream(
+                                        new File(mRecordDir, "videometa.json").getPath()
+                                )
+                        )
+                    );
+            writer.beginObject();
+            writer.name("fovW").value(fovW);
+            writer.name("fovH").value(fovH);
+            writer.name("width").value(width);
+            writer.name("height").value(height);
+            writer.name("frameRate").value(frameRate);
+            writer.endObject();
+
+            writer.close();
+        }catch (FileNotFoundException e) {
+            // Not very likely to happen
+            e.printStackTrace();
+        }catch (IOException e) {
+            // do nothing
+            e.printStackTrace();
+            Log.e(TAG, "Writing video meta data failed.");
+        }
+    }
+
+    /**
+     * Camera preview control class
+     */
+    class CameraPreviewer {
+        private Camera mCamera;
+
+        CameraPreviewer() {
+            try {
+                mCamera = Camera.open(); // attempt to get a default Camera instance
+            }
+            catch (Exception e) {
+                // Camera is not available (in use or does not exist)
+                Log.e(TAG, "Cannot obtain Camera!");
+            }
+        }
+
+        /**
+         * Get the camera to be previewed
+         * @return Reference to Camera used
+         */
+        public Camera getCamera() {
+            return mCamera;
+        }
+
+        /**
+         * Setup the camera
+         */
+        public void init() {
+            if (mCamera != null) {
+                double alpha = mCamera.getParameters().getHorizontalViewAngle()*Math.PI/180.0;
+                int width = 1920;
+                double fx = width/2/Math.tan(alpha/2.0);
+
+                if (LOCAL_LOGV) Log.v(TAG, "View angle="
+                        + mCamera.getParameters().getHorizontalViewAngle() +"  Estimated fx = "+fx);
+
+                RVCVCameraPreview cameraPreview =
+                        (RVCVCameraPreview) findViewById(R.id.cam_preview);
+                cameraPreview.init(mCamera);
+            } else {
+                message("Cannot open camera!");
+                finish();
+            }
+        }
+
+        /**
+         * End the camera preview
+         */
+        public void end() {
+            if (mCamera != null) {
+                mCamera.release();        // release the camera for other applications
+                mCamera = null;
+            }
+        }
+    }
+
+    /**
+     * Manage a set of RangeCoveredRegister objects
+     */
+    class CoverageManager {
+        // settings
+        private final int MAX_TILT_ANGLE = 60; // +/- 60
+        //private final int REQUIRED_TILT_ANGLE = 50; // +/- 50
+        private final int TILT_ANGLE_STEP = 5; // 5 degree(s) per step
+        private final int YAW_ANGLE_STEP = 10; // 10 degree(s) per step
+
+        RangeCoveredRegister[] mAxisCovered;
+
+        CoverageManager() {
+            mAxisCovered = new RangeCoveredRegister[3];
+            // X AXIS
+            mAxisCovered[0] = new RangeCoveredRegister(-MAX_TILT_ANGLE, +MAX_TILT_ANGLE, TILT_ANGLE_STEP);
+            // Y AXIS
+            mAxisCovered[1] = new RangeCoveredRegister(-MAX_TILT_ANGLE, +MAX_TILT_ANGLE, TILT_ANGLE_STEP);
+            // Z AXIS
+            mAxisCovered[2] = new RangeCoveredRegister(YAW_ANGLE_STEP);
+        }
+
+        public RangeCoveredRegister getAxis(int axis) {
+            // SensorManager.AXIS_X = 1, need offset -1 for mAxisCovered array
+            return mAxisCovered[axis-1];
+        }
+
+        public void waitUntilCovered(int axis) {
+            // SensorManager.AXIS_X = 1, need offset -1 for mAxisCovered array
+            while(!mAxisCovered[axis-1].isFullyCovered()) {
+                try {
+                    Thread.sleep(500);
+                } catch (InterruptedException e) {
+                    if (LOCAL_LOGV) {
+                        Log.v(TAG, "waitUntilCovered axis = "+ axis + " is interrupted");
+                    }
+                }
+            }
+        }
+    }
+    ////////////////////////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * A class controls the video recording
+     */
+    class VideoRecorder
+    {
+        private MediaRecorder mRecorder;
+        private Camera mCamera;
+        private boolean mRunning = false;
+
+        private int [] mPreferredProfiles = {   CamcorderProfile.QUALITY_480P,  // smaller -> faster
+                                        CamcorderProfile.QUALITY_720P,
+                                        CamcorderProfile.QUALITY_1080P,
+                                        CamcorderProfile.QUALITY_HIGH // existence guaranteed
+                                    };
+
+
+        VideoRecorder(Camera camera) {
+            mCamera = camera;
+        }
+
+        /**
+         * Initialize and start recording
+         */
+        public void init() {
+            float fovW =  mCamera.getParameters().getHorizontalViewAngle();
+            float fovH =  mCamera.getParameters().getVerticalViewAngle();
+
+            mRecorder = new MediaRecorder();
+            mCamera.unlock();
+            mRecorder.setCamera(mCamera);
+
+            mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
+            mRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
+
+            CamcorderProfile profile = null;
+            for (int i: mPreferredProfiles) {
+                if (CamcorderProfile.hasProfile(i)) {
+                    profile = CamcorderProfile.get(i);
+                    mRecorder.setProfile(profile);
+                    break;
+                }
+            }
+
+            writeVideoMetaInfo(profile.videoFrameWidth, profile.videoFrameHeight,
+                    profile.videoFrameRate, fovW, fovH);
+
+            try {
+                mRecorder.setOutputFile(getVideoRecFilePath());
+                mRecorder.prepare();
+            } catch (IOException e) {
+                Log.e(TAG, "Preparation for recording failed.");
+                return;
+            }
+
+            try {
+                mRecorder.start();
+            } catch (RuntimeException e) {
+                Log.e(TAG, "Starting recording failed.");
+                mRecorder.reset();
+                mRecorder.release();
+                mCamera.lock();
+                return;
+            }
+            mRunning = true;
+        }
+
+        /**
+         * Stop recording
+         */
+        public void end() {
+            if (mRunning) {
+                try {
+                    mRecorder.stop();
+                    mRecorder.reset();
+                    mRecorder.release();
+                    mCamera.lock();
+                } catch (RuntimeException e) {
+                    e.printStackTrace();
+                    Log.e(TAG, "Runtime error in stopping recording.");
+                }
+            }
+            mRecorder = null;
+        }
+
+    }
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////
+
+    /**
+     *  Log all raw sensor readings, for Rotation Vector sensor algorithms research
+     */
+    class RawSensorLogger implements SensorEventListener {
+        private final String TAG = "RawSensorLogger";
+
+        private final static int SENSOR_RATE = SensorManager.SENSOR_DELAY_FASTEST;
+        private File mRecPath;
+
+        SensorManager mSensorManager;
+        Sensor mAccSensor, mGyroSensor, mMagSensor;
+        OutputStreamWriter mAccLogWriter, mGyroLogWriter, mMagLogWriter;
+
+        private float[] mRTemp = new float[16];
+
+        RawSensorLogger(File recPath) {
+            mRecPath = recPath;
+        }
+
+        /**
+         * Initialize and start recording
+         */
+        public void init() {
+            mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
+
+            mAccSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
+            mGyroSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE_UNCALIBRATED);
+            mMagSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED);
+
+            mSensorManager.registerListener(this, mAccSensor, SENSOR_RATE);
+            mSensorManager.registerListener(this, mGyroSensor, SENSOR_RATE);
+            mSensorManager.registerListener(this, mMagSensor, SENSOR_RATE);
+
+            try {
+                mAccLogWriter= new OutputStreamWriter(
+                        new FileOutputStream(new File(mRecPath, "raw_acc.log")));
+                mGyroLogWriter= new OutputStreamWriter(
+                        new FileOutputStream(new File(mRecPath, "raw_uncal_gyro.log")));
+                mMagLogWriter= new OutputStreamWriter(
+                        new FileOutputStream(new File(mRecPath, "raw_uncal_mag.log")));
+
+            } catch (FileNotFoundException e) {
+                Log.e(TAG, "Sensor log file open failed: " + e.toString());
+            }
+        }
+
+        /**
+         * Stop recording and clean up
+         */
+        public void end() {
+            mSensorManager.flush(this);
+            mSensorManager.unregisterListener(this);
+
+            try {
+                if (mAccLogWriter != null) {
+                    OutputStreamWriter writer = mAccLogWriter;
+                    mAccLogWriter = null;
+                    writer.close();
+                }
+                if (mGyroLogWriter != null) {
+                    OutputStreamWriter writer = mGyroLogWriter;
+                    mGyroLogWriter = null;
+                    writer.close();
+                }
+                if (mMagLogWriter != null) {
+                    OutputStreamWriter writer = mMagLogWriter;
+                    mMagLogWriter = null;
+                    writer.close();
+                }
+
+            } catch (IOException e) {
+                Log.e(TAG, "Sensor log file close failed: " + e.toString());
+            }
+        }
+
+        @Override
+        public void onAccuracyChanged(Sensor sensor, int i) {
+            // do not care
+        }
+
+        @Override
+        public void onSensorChanged(SensorEvent event) {
+            OutputStreamWriter writer=null;
+            switch(event.sensor.getType()) {
+                case Sensor.TYPE_ACCELEROMETER:
+                    writer = mAccLogWriter;
+                    break;
+                case Sensor.TYPE_GYROSCOPE_UNCALIBRATED:
+                    writer = mGyroLogWriter;
+                    break;
+                case Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED:
+                    writer = mMagLogWriter;
+                    break;
+
+            }
+            if (writer!=null)  {
+                float[] data = event.values;
+                try {
+                    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
+                        writer.write(String.format("%d %f %f %f\r\n",
+                                event.timestamp, data[0], data[1], data[2]));
+                    }else // TYPE_GYROSCOPE_UNCALIBRATED and TYPE_MAGNETIC_FIELD_UNCALIBRATED
+                    {
+                        writer.write(String.format("%d %f %f %f %f %f %f\r\n", event.timestamp,
+                                data[0], data[1], data[2], data[3], data[4], data[5]));
+                    }
+                }catch (IOException e)
+                {
+                    Log.e(TAG, "Write to raw sensor log file failed.");
+                }
+
+            }
+        }
+    }
+
+    /**
+     *  Rotation sensor logger class
+     */
+    class RVSensorLogger implements SensorEventListener {
+        private final String TAG = "RVSensorLogger";
+
+        private final static int SENSOR_RATE = SensorManager.SENSOR_DELAY_FASTEST;
+        RangeCoveredRegister mRegister;
+        int mAxis;
+        RVCVRecordActivity mActivity;
+
+        SensorManager mSensorManager;
+        Sensor mRVSensor;
+        OutputStreamWriter mLogWriter;
+
+        private float[] mRTemp = new float[16];
+
+        RVSensorLogger(RVCVRecordActivity activity) {
+            mActivity = activity;
+        }
+
+        /**
+         * Initialize and start recording
+         */
+        public void init() {
+            mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
+            mRVSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
+            mSensorManager.registerListener(this, mRVSensor, SENSOR_RATE);
+
+            try {
+                mLogWriter= new OutputStreamWriter(
+                        new FileOutputStream(mActivity.getSensorLogFilePath()));
+            } catch (FileNotFoundException e) {
+                Log.e(TAG, "Sensor log file open failed: " + e.toString());
+            }
+        }
+
+        /**
+         * Stop recording and clean up
+         */
+        public void end() {
+            mSensorManager.flush(this);
+            mSensorManager.unregisterListener(this);
+
+            try {
+                if (mLogWriter != null) {
+                    OutputStreamWriter writer = mLogWriter;
+                    mLogWriter = null;
+                    writer.close();
+                }
+            } catch (IOException e) {
+                Log.e(TAG, "Sensor log file close failed: " + e.toString());
+            }
+
+            updateRegister(null, AXIS_NONE);
+        }
+
+        private void onNewData(float[] data, long timestamp) {
+            // LOG
+            try {
+                if (mLogWriter != null) {
+                    mLogWriter.write(String.format("%d %f %f %f %f\r\n", timestamp,
+                            data[3], data[0], data[1], data[2]));
+                }
+            } catch (IOException e) {
+                Log.e(TAG, "Sensor log file write failed: " + e.toString());
+            }
+
+            // Update UI
+            if (mRegister != null) {
+                int d = 0;
+                int dx, dy, dz;
+                boolean valid = false;
+                SensorManager.getRotationMatrixFromVector(mRTemp, data);
+
+                dx = (int)(Math.asin(mRTemp[8])*(180.0/Math.PI));
+                dy = (int)(Math.asin(mRTemp[9])*(180.0/Math.PI));
+                dz = (int)((Math.atan2(mRTemp[4], mRTemp[0])+Math.PI)*(180.0/Math.PI));
+
+                switch(mAxis) {
+                    case SensorManager.AXIS_X:
+                        d = dx;
+                        valid = (Math.abs(dy) < 30);
+                        break;
+                    case SensorManager.AXIS_Y:
+                        d = dy;
+                        valid = (Math.abs(dx) < 30);
+                        break;
+                    case SensorManager.AXIS_Z:
+                        d = dz;
+                        valid = (Math.abs(dx) < 20 && Math.abs(dy) < 20);
+                        break;
+                }
+
+                if (valid) {
+                    mRegister.update(d);
+                    mActivity.redrawIndicator();
+                }
+            }
+
+        }
+
+        public void updateRegister(RangeCoveredRegister reg, int axis) {
+            mRegister = reg;
+            mAxis = axis;
+        }
+
+
+        @Override
+        public void onAccuracyChanged(Sensor sensor, int i) {
+            // do not care
+        }
+
+        @Override
+        public void onSensorChanged(SensorEvent event) {
+            if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
+                onNewData(event.values, event.timestamp);
+            }
+        }
+    }
+
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * Controls the over all logic of record procedure: first x-direction, then y-direction and
+     * then z-direction.
+     */
+    class RecordProcedureController implements Runnable {
+        private static final boolean LOCAL_LOGV = false;
+
+        private final RVCVRecordActivity mActivity;
+        private Thread mThread = null;
+
+        RecordProcedureController(RVCVRecordActivity activity) {
+            mActivity = activity;
+            mThread = new Thread(this);
+            mThread.start();
+        }
+
+        /**
+         * Run the record procedure
+         */
+        public void run() {
+            if (LOCAL_LOGV) Log.v(TAG, "Controller Thread Started.");
+            //start recording & logging
+            delay(2000);
+
+            init();
+            if (LOCAL_LOGV) Log.v(TAG, "Controller Thread init() finished.");
+
+            // test 3 axis
+            // It is in YXZ order because UI element design use opposite definition
+            // of XY axis. To ensure the user see X Y Z, it is flipped here.
+            recordAxis(SensorManager.AXIS_Y);
+            if (LOCAL_LOGV) Log.v(TAG, "Controller Thread axis 0 finished.");
+
+            recordAxis(SensorManager.AXIS_X);
+            if (LOCAL_LOGV) Log.v(TAG, "Controller Thread axis 1 finished.");
+
+            recordAxis(SensorManager.AXIS_Z);
+            if (LOCAL_LOGV) Log.v(TAG, "Controller Thread axis 2 finished.");
+
+            delay(1000);
+            end();
+            if (LOCAL_LOGV) Log.v(TAG, "Controller Thread End.");
+        }
+
+        private void delay(int milli) {
+            try{
+                Thread.sleep(milli);
+            } catch(InterruptedException e) {
+                if (LOCAL_LOGV) Log.v(TAG, "Controller Thread Interrupted.");
+            }
+        }
+        private void init() {
+            // start video recording
+            mActivity.startRecordVideo();
+
+            // start sensor logging & listening
+            mActivity.startRecordSensor();
+        }
+
+        private void end() {
+            // stop video recording
+            mActivity.stopRecordVideo();
+
+            // stop sensor logging
+            mActivity.stopRecordSensor();
+
+            // notify ui complete
+            runOnUiThread(new Runnable(){
+                public void run() {
+                    mActivity.notifyComplete();
+                }
+            });
+        }
+
+        private void recordAxis(int axis) {
+            // delay 2 seconds?
+            delay(1000);
+
+            // change ui
+            mActivity.switchAxisAsync(axis);
+
+            // play start sound
+            mActivity.playNotifySound(0);
+
+            // wait until axis covered
+            mActivity.waitUntilCovered(axis);
+
+            // play stop sound
+            mActivity.playNotifySound(1);
+        }
+
+        /**
+         * Force quit
+         */
+        public void quit() {
+            mThread.interrupt();
+            try {
+                if (LOCAL_LOGV) Log.v(TAG, "Wait for controller to end");
+
+                // stop video recording
+                mActivity.stopRecordVideo();
+
+                // stop sensor logging
+                mActivity.stopRecordSensor();
+
+            } catch (Exception e)
+            {
+                e.printStackTrace();
+            }
+        }
+    }
+
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckAnalyzer.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckAnalyzer.java
new file mode 100644
index 0000000..9afd1a9
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckAnalyzer.java
@@ -0,0 +1,1295 @@
+package com.android.cts.verifier.sensors;
+
+/*
+ * Copyright (C) 2014 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.
+ */
+
+import android.media.MediaCodec;
+import android.media.MediaExtractor;
+import android.media.MediaFormat;
+import android.os.Debug;
+import android.os.Environment;
+import android.util.JsonWriter;
+import android.util.Log;
+
+import org.opencv.core.Mat;
+import org.opencv.core.CvType;
+import org.opencv.core.MatOfDouble;
+import org.opencv.core.MatOfFloat;
+import org.opencv.core.MatOfPoint2f;
+import org.opencv.core.MatOfPoint3f;
+import org.opencv.core.Size;
+import org.opencv.highgui.Highgui;
+import org.opencv.imgproc.Imgproc;
+import org.opencv.calib3d.Calib3d;
+import org.opencv.core.Core;
+
+import org.json.JSONObject;
+import org.json.JSONException;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+
+import android.opengl.GLES20;
+import javax.microedition.khronos.opengles.GL10;
+
+/**
+ *  This class does analysis on the recorded RVCVCXCheck data sets.
+ */
+public class RVCVXCheckAnalyzer {
+    private static final String TAG = "RVCVXAnalysis";
+    private static final boolean LOCAL_LOGV = false;
+    private static final boolean LOCAL_LOGD = true;
+    private final String mPath;
+
+    private static final boolean OUTPUT_DEBUG_IMAGE = false;
+    private static final double VALID_FRAME_THRESHOLD = 0.8;
+    private static final double REPROJECTION_THREASHOLD = 4.0;
+    private static final boolean FORCE_CV_ANALYSIS  = false;
+    private static final boolean TRACE_VIDEO_ANALYSIS = false;
+    private static final double DECIMATION_FPS_TARGET = 15.0;
+
+    RVCVXCheckAnalyzer(String path)
+    {
+        mPath = path;
+    }
+
+    /**
+     * A class that contains  the analysis results
+     *
+     */
+    class AnalyzeReport {
+        public boolean error=true;
+        public String reason = "incomplete";
+
+        // roll pitch yaw RMS error ( \sqrt{\frac{1}{n} \sum e_i^2 })
+        // unit in rad
+        public double roll_rms_error;
+        public double pitch_rms_error;
+        public double yaw_rms_error;
+
+        // roll pitch yaw max error
+        // unit in rad
+        public double roll_max_error;
+        public double pitch_max_error;
+        public double yaw_max_error;
+
+        // optimal t delta between sensor and camera data set to make best match
+        public double optimal_delta_t;
+        // the associate yaw offset based on initial values
+        public double yaw_offset;
+
+        public int n_of_frame;
+        public int n_of_valid_frame;
+
+        // both data below are in [sec]
+        public double sensor_period_avg;
+        public double sensor_period_stdev;
+
+        /**
+         * write Json format serialization to a file in case future processing need the data
+         */
+        public void writeToFile(File file) {
+            try {
+                writeJSONToStream(new FileOutputStream(file));
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+                Log.e(TAG, "Cannot create analyze report file.");
+            }
+        }
+
+        /**
+         * Get the JSON format serialization
+         *@return Json format serialization as String
+         */
+        @Override
+        public String toString() {
+            ByteArrayOutputStream s = new ByteArrayOutputStream();
+            writeJSONToStream(s);
+            return new String(s.toByteArray(),  java.nio.charset.StandardCharsets.UTF_8);
+        }
+
+        private void writeJSONToStream(OutputStream s) {
+            try{
+                JsonWriter writer =
+                        new JsonWriter(
+                                new OutputStreamWriter( s )
+                        );
+                writer.beginObject();
+                writer.setLenient(true);
+
+                writer.name("roll_rms_error").value(roll_rms_error);
+                writer.name("pitch_rms_error").value(pitch_rms_error);
+                writer.name("yaw_rms_error").value(yaw_rms_error);
+                writer.name("roll_max_error").value(roll_max_error);
+                writer.name("pitch_max_error").value(pitch_max_error);
+                writer.name("yaw_max_error").value(yaw_max_error);
+                writer.name("optimal_delta_t").value(optimal_delta_t);
+                writer.name("yaw_offset").value(yaw_offset);
+                writer.name("n_of_frame").value(n_of_frame);
+                writer.name("n_of_valid_frame").value(n_of_valid_frame);
+                writer.name("sensor_period_avg").value(sensor_period_avg);
+                writer.name("sensor_period_stdev").value(sensor_period_stdev);
+
+                writer.endObject();
+
+                writer.close();
+            } catch (IOException e) {
+                // do nothing
+                Log.e(TAG, "Error in serialize analyze report to JSON");
+            } catch (IllegalArgumentException e) {
+                e.printStackTrace();
+                Log.e(TAG, "Invalid parameter to write into JSON format");
+            }
+        }
+    }
+
+    /**
+     *  Process data set stored in the path specified in constructor
+     *  and return an analyze report to caller
+     *
+     *  @return An AnalyzeReport that contains detailed information about analysis
+     */
+    public AnalyzeReport processDataSet() {
+        int nframe;// number of frames in video
+        int nslog; // number of sensor log
+        int nvlog; // number of video generated log
+
+
+        AnalyzeReport report = new AnalyzeReport();
+
+        ArrayList<AttitudeRec> srecs = new ArrayList<>();
+        ArrayList<AttitudeRec> vrecs = new ArrayList<>();
+        ArrayList<AttitudeRec> srecs2 = new ArrayList<>();
+
+
+        final boolean use_solved = new File(mPath, "vision_rpy.log").exists() && !FORCE_CV_ANALYSIS;
+
+        if (use_solved) {
+            nframe = nvlog = loadAttitudeRecs(new File(mPath, "vision_rpy.log"), vrecs);
+            nslog = loadAttitudeRecs(new File(mPath, "sensor_rpy.log"),srecs);
+        }else {
+            nframe = analyzeVideo(vrecs);
+            nvlog = vrecs.size();
+
+            if (LOCAL_LOGV) {
+                Log.v(TAG, "Post video analysis nvlog = " + nvlog + " nframe=" + nframe);
+            }
+            if (nvlog <= 0 || nframe <= 0) {
+                // invalid results
+                report.reason = "Unable to to load recorded video.";
+                return report;
+            }
+            if ((double) nvlog / nframe < VALID_FRAME_THRESHOLD) {
+                // too many invalid frames
+                Log.w(TAG, "Too many invalid frames, n valid frame = " + nvlog +
+                        ", n total frame = " + nframe);
+                report.reason = "Too many invalid frames.";
+                return report;
+            }
+
+            fixFlippedAxis(vrecs);
+
+            nslog = loadSensorLog(srecs);
+        }
+
+        // Gradient descent will have faster performance than this simple search,
+        // but the performance is dominated by the vision part, so it is not very necessary.
+        double delta_t;
+        double min_rms = Double.MAX_VALUE;
+        double min_delta_t =0.;
+        double min_yaw_offset =0.;
+
+        // pre-allocation
+        for (AttitudeRec i: vrecs) {
+            srecs2.add(new AttitudeRec(0,0,0,0));
+        }
+
+        // find optimal offset
+        for (delta_t = -2.0; delta_t<2.0; delta_t +=0.01) {
+            double rms;
+            resampleSensorLog(srecs, vrecs, delta_t, 0.0, srecs2);
+            rms = Math.sqrt(calcSqrErr(vrecs, srecs2, 0)+ calcSqrErr(vrecs, srecs2, 1));
+            if (rms < min_rms) {
+                min_rms = rms;
+                min_delta_t = delta_t;
+                min_yaw_offset = vrecs.get(0).yaw - srecs2.get(0).yaw;
+            }
+        }
+        // sample at optimal offset
+        resampleSensorLog(srecs, vrecs, min_delta_t, min_yaw_offset, srecs2);
+
+        if (!use_solved) {
+            dumpAttitudeRecs(new File(mPath, "vision_rpy.log"), vrecs);
+            dumpAttitudeRecs(new File(mPath, "sensor_rpy.log"), srecs);
+        }
+        dumpAttitudeRecs(new File(mPath, "sensor_rpy_resampled.log"), srecs2);
+        dumpAttitudeError(new File(mPath, "attitude_error.log"), vrecs, srecs2);
+
+        // fill report fields
+        report.roll_rms_error = Math.sqrt(calcSqrErr(vrecs, srecs2, 0));
+        report.pitch_rms_error = Math.sqrt(calcSqrErr(vrecs, srecs2, 1));
+        report.yaw_rms_error = Math.sqrt(calcSqrErr(vrecs, srecs2, 2));
+
+        report.roll_max_error = calcMaxErr(vrecs, srecs2, 0);
+        report.pitch_max_error = calcMaxErr(vrecs, srecs2, 1);
+        report.yaw_max_error = calcMaxErr(vrecs, srecs2, 2);
+
+        report.optimal_delta_t = min_delta_t;
+        report.yaw_offset = (min_yaw_offset);
+
+        report.n_of_frame = nframe;
+        report.n_of_valid_frame = nvlog;
+
+        double [] sensor_period_stat = calcSensorPeriodStat(srecs);
+        report.sensor_period_avg = sensor_period_stat[0];
+        report.sensor_period_stdev = sensor_period_stat[1];
+
+        // output report to file and log in JSON format as well
+        report.writeToFile(new File(mPath, "report.json"));
+        if (LOCAL_LOGV)    Log.v(TAG, "Report in JSON:" + report.toString());
+
+        report.reason = "Completed";
+        report.error = false;
+        return report;
+    }
+
+    /**
+     * Generate pattern geometry like this one
+     * http://docs.opencv.org/trunk/_downloads/acircles_pattern.png
+     *
+     * @return Array of 3D points
+     */
+    private MatOfPoint3f asymmetricalCircleGrid(Size size) {
+        final int cn = 3;
+
+        int n = (int)(size.width * size.height);
+        float positions[] = new float[n * cn];
+        float unit=0.02f;
+        MatOfPoint3f grid = new MatOfPoint3f();
+
+        for (int i = 0; i < size.height; i++) {
+            for (int j = 0; j < size.width * cn; j += cn) {
+                positions[(int) (i * size.width * cn + j + 0)] =
+                        (2 * (j / cn) + i % 2) * (float) unit;
+                positions[(int) (i * size.width * cn + j + 1)] =
+                        i * unit;
+                positions[(int) (i * size.width * cn + j + 2)] = 0;
+            }
+        }
+        grid.create(n, 1, CvType.CV_32FC3);
+        grid.put(0, 0, positions);
+        return grid;
+    }
+
+    /**
+     *  Create a camera intrinsic matrix using input parameters
+     *
+     *  The camera intrinsic matrix will be like:
+     *
+     *       +-                       -+
+     *       |  f   0    center.width  |
+     *   A = |  0   f    center.height |
+     *       |  0   0         1        |
+     *       +-                       -+
+     *
+     *  @return An approximated (not actually calibrated) camera matrix
+     */
+    private static Mat cameraMatrix(float f, Size center) {
+        final double [] data = {f, 0, center.width, 0, f, center.height, 0, 0, 1f};
+        Mat m = new Mat(3,3, CvType.CV_64F);
+        m.put(0, 0, data);
+        return m;
+    }
+
+    /**
+     *  Attitude record in time roll pitch yaw format.
+     *
+     */
+    private class AttitudeRec {
+        public double time;
+        public double roll;
+        public double pitch;
+        public double yaw;
+
+        // ctor
+        AttitudeRec(double atime, double aroll, double apitch, double ayaw) {
+            time = atime;
+            roll = aroll;
+            pitch = apitch;
+            yaw = ayaw;
+        }
+
+        // ctor
+        AttitudeRec(double atime, double [] rpy) {
+            time = atime;
+            roll = rpy[0];
+            pitch = rpy[1];
+            yaw = rpy[2];
+        }
+
+        // copy value of another to this
+        void assign(AttitudeRec rec) {
+            time = rec.time;
+            roll = rec.time;
+            pitch = rec.pitch;
+            yaw = rec.yaw;
+        }
+
+        // copy roll-pitch-yaw value but leave the time specified by atime
+        void assign(AttitudeRec rec, double atime) {
+            time = atime;
+            roll = rec.time;
+            pitch = rec.pitch;
+            yaw = rec.yaw;
+        }
+
+        // set each field separately
+        void set(double atime, double aroll, double apitch, double ayaw) {
+            time = atime;
+            roll = aroll;
+            pitch = apitch;
+            yaw = ayaw;
+        }
+    }
+
+
+    /**
+     *  Load the sensor log in (time Roll-pitch-yaw) format to a ArrayList<AttitudeRec>
+     *
+     *  @return the number of sensor log items
+     */
+    private int loadSensorLog(ArrayList<AttitudeRec> recs) {
+        //ArrayList<AttitudeRec> recs = new ArrayList<AttitudeRec>();
+        File csvFile = new File(mPath, "sensor.log");
+        BufferedReader br=null;
+        String line;
+
+        // preallocate and reuse
+        double [] quat = new double[4];
+        double [] rpy = new double[3];
+
+        double t0 = -1;
+
+        try {
+            br = new BufferedReader(new FileReader(csvFile));
+            while ((line = br.readLine()) != null) {
+                //space separator
+                String[] items = line.split(" ");
+
+                if (items.length != 5) {
+                    recs.clear();
+                    return -1;
+                }
+
+                quat[0] = Double.parseDouble(items[1]);
+                quat[1] = Double.parseDouble(items[2]);
+                quat[2] = Double.parseDouble(items[3]);
+                quat[3] = Double.parseDouble(items[4]);
+
+                //
+                quat2rpy(quat, rpy);
+
+                if (t0 < 0) {
+                    t0 = Long.parseLong(items[0])/1e9;
+                }
+                recs.add(new AttitudeRec(Long.parseLong(items[0])/1e9-t0, rpy));
+            }
+
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+            Log.e(TAG, "Cannot find sensor logging data");
+        } catch (IOException e) {
+            e.printStackTrace();
+            Log.e(TAG, "Cannot read sensor logging data");
+        } finally {
+            if (br != null) {
+                try {
+                    br.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        return recs.size();
+    }
+
+    /**
+     * Read video meta info
+     */
+    private class VideoMetaInfo {
+        public double fps;
+        public int frameWidth;
+        public int frameHeight;
+        public double fovWidth;
+        public double fovHeight;
+        public boolean valid = false;
+
+        VideoMetaInfo(File file) {
+
+            BufferedReader br=null;
+            String line;
+            String content="";
+            try {
+                br = new BufferedReader(new FileReader(file));
+                while ((line = br.readLine()) != null) {
+                    content = content +line;
+                }
+
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+                Log.e(TAG, "Cannot find video meta info file");
+            } catch (IOException e) {
+                e.printStackTrace();
+                Log.e(TAG, "Cannot read video meta info file");
+            } finally {
+                if (br != null) {
+                    try {
+                        br.close();
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+
+            if (content.isEmpty()) {
+                return;
+            }
+
+            try {
+                JSONObject json = new JSONObject(content);
+                frameWidth = json.getInt("width");
+                frameHeight = json.getInt("height");
+                fps = json.getDouble("frameRate");
+                fovWidth = json.getDouble("fovW")*Math.PI/180.0;
+                fovHeight = json.getDouble("fovH")*Math.PI/180.0;
+            } catch (JSONException e) {
+                return;
+            }
+
+            valid = true;
+
+        }
+    }
+
+
+
+    /**
+     * Debugging helper function, load ArrayList<AttitudeRec> from a file dumped out by
+     * dumpAttitudeRecs
+     */
+    private int loadAttitudeRecs(File file, ArrayList<AttitudeRec> recs) {
+        BufferedReader br=null;
+        String line;
+        double time;
+        double [] rpy = new double[3];
+
+        try {
+            br = new BufferedReader(new FileReader(file));
+            while ((line = br.readLine()) != null) {
+                //space separator
+                String[] items = line.split(" ");
+
+                if (items.length != 4) {
+                    recs.clear();
+                    return -1;
+                }
+
+                time = Double.parseDouble(items[0]);
+                rpy[0] = Double.parseDouble(items[1]);
+                rpy[1] = Double.parseDouble(items[2]);
+                rpy[2] = Double.parseDouble(items[3]);
+
+                recs.add(new AttitudeRec(time, rpy));
+            }
+
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+            Log.e(TAG, "Cannot find AttitudeRecs file specified.");
+        } catch (IOException e) {
+            e.printStackTrace();
+            Log.e(TAG, "Read AttitudeRecs file failure");
+        } finally {
+            if (br != null) {
+                try {
+                    br.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        return recs.size();
+    }
+    /**
+     * Debugging helper function, Dump an ArrayList<AttitudeRec> to a file
+     */
+    private void dumpAttitudeRecs(File file, ArrayList<AttitudeRec> recs) {
+        OutputStreamWriter w=null;
+        try {
+            w = new OutputStreamWriter(new FileOutputStream(file));
+
+            for (AttitudeRec r : recs) {
+                w.write(String.format("%f %f %f %f\r\n", r.time, r.roll, r.pitch, r.yaw));
+            }
+            w.close();
+        } catch(FileNotFoundException e) {
+            e.printStackTrace();
+            Log.e(TAG, "Cannot create AttitudeRecs file.");
+        } catch (IOException e) {
+            Log.e(TAG, "Write AttitudeRecs file failure");
+        } finally {
+            if (w!=null) {
+                try {
+                    w.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     *  Read the sensor log in ArrayList<AttitudeRec> format and find out the sensor sample time
+     *  statistics: mean and standard deviation.
+     *
+     *  @return The returned value will be a double array with exact 2 items, first [0] will be
+     *  mean and the second [1]  will be the standard deviation.
+     *
+     */
+    private double [] calcSensorPeriodStat(ArrayList<AttitudeRec> srec)   {
+        double tp = srec.get(0).time;
+        int i;
+        double sum = 0.0;
+        double sumsq = 0.0;
+        for(i=1; i<srec.size(); ++i) {
+            double dt;
+            dt = srec.get(i).time - tp;
+            sum += dt;
+            sumsq += dt*dt;
+            tp += dt;
+        }
+        double [] ret = new double[2];
+        ret[0] = sum/srec.size();
+        ret[1] = Math.sqrt(sumsq/srec.size() - ret[0]*ret[0]);
+        return ret;
+    }
+
+    /**
+     * Flipping the axis as the image are flipped upside down in OpenGL frames
+     */
+    private void fixFlippedAxis(ArrayList<AttitudeRec> vrecs)   {
+        for (AttitudeRec i: vrecs) {
+            i.yaw = -i.yaw;
+        }
+    }
+
+    /**
+     *  Calculate the maximum error on the specified axis between two time aligned (resampled)
+     *  ArrayList<AttitudeRec>. Yaw axis needs special treatment as 0 and 2pi error are same thing
+     *
+     * @param ra  one ArrayList of AttitudeRec
+     * @param rb  the other ArrayList of AttitudeRec
+     * @param axis axis id for the comparison (0 = roll, 1 = pitch, 2 = yaw)
+     * @return Maximum error
+     */
+    private double calcMaxErr(ArrayList<AttitudeRec> ra, ArrayList<AttitudeRec> rb, int axis)  {
+        // check if they are valid and comparable data
+        if (ra.size() != rb.size()) {
+            throw new ArrayIndexOutOfBoundsException("Two array has to be the same");
+        }
+        // check input parameter validity
+        if (axis<0 || axis > 2) {
+            throw new IllegalArgumentException("Invalid data axis.");
+        }
+
+        int i;
+        double max = 0.0;
+        double diff = 0.0;
+        for(i=0; i<ra.size(); ++i) {
+            // make sure they are aligned data
+            if (ra.get(i).time != rb.get(i).time) {
+                throw new IllegalArgumentException("Element "+i+
+                        " of two inputs has different time.");
+            }
+            switch(axis) {
+                case 0:
+                    diff = ra.get(i).roll - rb.get(i).roll; // they always opposite of each other..
+                    break;
+                case 1:
+                    diff = ra.get(i).pitch - rb.get(i).pitch;
+                    break;
+                case 2:
+                    diff = Math.abs(((4*Math.PI + ra.get(i).yaw - rb.get(i).yaw)%(2*Math.PI))
+                            -Math.PI)-Math.PI;
+                    break;
+            }
+            diff = Math.abs(diff);
+            if (diff>max) {
+                max = diff;
+            }
+        }
+        return max;
+    }
+
+    /**
+     *  Calculate the RMS error on the specified axis between two time aligned (resampled)
+     *  ArrayList<AttitudeRec>. Yaw axis needs special treatment as 0 and 2pi error are same thing
+     *
+     * @param ra  one ArrayList of AttitudeRec
+     * @param rb  the other ArrayList of AttitudeRec
+     * @param axis axis id for the comparison (0 = roll, 1 = pitch, 2 = yaw)
+     * @return Mean square error
+     */
+    private double calcSqrErr(ArrayList<AttitudeRec> ra, ArrayList<AttitudeRec> rb, int axis) {
+        // check if they are valid and comparable data
+        if (ra.size() != rb.size()) {
+            throw new ArrayIndexOutOfBoundsException("Two array has to be the same");
+        }
+        // check input parameter validity
+        if (axis<0 || axis > 2) {
+            throw new IllegalArgumentException("Invalid data axis.");
+        }
+
+        int i;
+        double sum = 0.0;
+        double diff = 0.0;
+        for(i=0; i<ra.size(); ++i) {
+            // check input data validity
+            if (ra.get(i).time != rb.get(i).time) {
+                throw new IllegalArgumentException("Element "+i+
+                        " of two inputs has different time.");
+            }
+
+            switch(axis) {
+                case 0:
+                    diff = ra.get(i).roll - rb.get(i).roll;
+                    break;
+                case 1:
+                    diff = ra.get(i).pitch - rb.get(i).pitch;
+                    break;
+                case 2:
+                    diff = Math.abs(((4*Math.PI + ra.get(i).yaw - rb.get(i).yaw)%(2*Math.PI))-
+                            Math.PI)-Math.PI;
+                    break;
+            }
+
+            sum += diff*diff;
+        }
+        return sum/ra.size();
+    }
+
+    /**
+     * Debugging helper function. Dump the error between two time aligned ArrayList<AttitudeRec>'s
+     *
+     * @param file File to write to
+     * @param ra  one ArrayList of AttitudeRec
+     * @param rb  the other ArrayList of AttitudeRec
+     */
+    private void dumpAttitudeError(File file, ArrayList<AttitudeRec> ra, ArrayList<AttitudeRec> rb){
+        if (ra.size() != rb.size()) {
+            throw new ArrayIndexOutOfBoundsException("Two array has to be the same");
+        }
+
+        int i;
+
+        ArrayList<AttitudeRec> rerr = new ArrayList<>();
+        for(i=0; i<ra.size(); ++i) {
+            if (ra.get(i).time != rb.get(i).time) {
+                throw new IllegalArgumentException("Element "+ i
+                        + " of two inputs has different time.");
+            }
+
+            rerr.add(new AttitudeRec(ra.get(i).time, ra.get(i).roll - rb.get(i).roll,
+                    ra.get(i).pitch - rb.get(i).pitch,
+                    (Math.abs(((4*Math.PI + ra.get(i).yaw - rb.get(i).yaw)%(2*Math.PI))
+                            -Math.PI)-Math.PI)));
+
+        }
+        dumpAttitudeRecs(file, rerr);
+    }
+
+    /**
+     * Resample one ArrayList<AttitudeRec> with respect to another ArrayList<AttitudeRec>
+     *
+     * @param rec           the ArrayList of AttitudeRec to be sampled
+     * @param timebase      the other ArrayList of AttitudeRec that serves as time base
+     * @param delta_t       offset in time before resample
+     * @param yaw_offset    offset in yaw axis
+     * @param resampled     output ArrayList of AttitudeRec
+     */
+
+    private void resampleSensorLog(ArrayList<AttitudeRec> rec, ArrayList<AttitudeRec> timebase,
+            double delta_t, double yaw_offset, ArrayList<AttitudeRec> resampled)    {
+        int i;
+        int j = -1;
+        for(i=0; i<timebase.size(); i++) {
+            double time = timebase.get(i).time + delta_t;
+
+            while(j<rec.size()-1 && rec.get(j+1).time < time) j++;
+
+            if (j == -1) {
+                //use first
+                resampled.get(i).assign(rec.get(0), timebase.get(i).time);
+            } else if (j == rec.size()-1) {
+                // use last
+                resampled.get(i).assign(rec.get(j), timebase.get(i).time);
+            } else {
+                // do linear resample
+                double alpha = (time - rec.get(j).time)/((rec.get(j+1).time - rec.get(j).time));
+                double roll = (1-alpha) * rec.get(j).roll + alpha * rec.get(j+1).roll;
+                double pitch = (1-alpha) * rec.get(j).pitch + alpha * rec.get(j+1).pitch;
+                double yaw = (1-alpha) * rec.get(j).yaw + alpha * rec.get(j+1).yaw + yaw_offset;
+                resampled.get(i).set(timebase.get(i).time, roll, pitch, yaw);
+            }
+        }
+    }
+
+    /**
+     * Analyze video frames using computer vision approach and generate a ArrayList<AttitudeRec>
+     *
+     * @param recs  output ArrayList of AttitudeRec
+     * @return total number of frame of the video
+     */
+    private int analyzeVideo(ArrayList<AttitudeRec> recs) {
+        VideoMetaInfo meta = new VideoMetaInfo(new File(mPath, "videometa.json"));
+
+        int decimation = 1;
+
+        if (meta.fps > DECIMATION_FPS_TARGET) {
+            decimation = (int)(meta.fps / DECIMATION_FPS_TARGET);
+            meta.fps /=decimation;
+        }
+
+        VideoDecoderForOpenCV videoDecoder = new VideoDecoderForOpenCV(
+                new File(mPath, "video.mp4"), decimation); // every 3 frame process 1 frame
+
+
+        Mat frame;
+        Mat gray = new Mat();
+        int i = -1;
+
+        Size frameSize = videoDecoder.getSize();
+
+        if (frameSize.width != meta.frameWidth || frameSize.height != meta.frameHeight) {
+            // this is very unlikely
+            return -1;
+        }
+
+        if (TRACE_VIDEO_ANALYSIS) {
+            Debug.startMethodTracing("cvprocess");
+        }
+
+        Size patternSize = new Size(4,11);
+
+        float fc = (float)(meta.frameWidth/2.0/Math.tan(meta.fovWidth/2.0));
+        Mat camMat = cameraMatrix(fc, new Size(frameSize.width/2, frameSize.height/2));
+        MatOfDouble coeff = new MatOfDouble(); // dummy
+
+        MatOfPoint2f centers = new MatOfPoint2f();
+        MatOfPoint3f grid = asymmetricalCircleGrid(patternSize);
+        Mat rvec = new MatOfFloat();
+        Mat tvec = new MatOfFloat();
+
+        MatOfPoint2f reprojCenters = new MatOfPoint2f();
+
+        if (LOCAL_LOGV) {
+            Log.v(TAG, "Camera Mat = \n" + camMat.dump());
+        }
+
+        long startTime = System.nanoTime();
+
+        while ((frame = videoDecoder.getFrame()) !=null) {
+            if (LOCAL_LOGV) {
+                Log.v(TAG, "got a frame " + i);
+            }
+
+            // has to be in front, as there are cases where execution
+            // will skip the later part of this while
+            i++;
+
+            // convert to gray manually as by default findCirclesGridDefault uses COLOR_BGR2GRAY
+            Imgproc.cvtColor(frame, gray, Imgproc.COLOR_RGB2GRAY);
+
+            boolean foundPattern = Calib3d.findCirclesGridDefault(
+                    gray,  patternSize, centers, Calib3d.CALIB_CB_ASYMMETRIC_GRID);
+
+            if (!foundPattern) {
+                // skip to next frame
+                continue;
+            }
+
+            if (OUTPUT_DEBUG_IMAGE) {
+                Calib3d.drawChessboardCorners(frame, patternSize, centers, true);
+            }
+
+            // figure out the extrinsic parameters using real ground truth 3D points and the pixel
+            // position of blobs found in findCircleGrid, an estimated camera matrix and
+            // no-distortion are assumed.
+            boolean foundSolution =
+                    Calib3d.solvePnP(grid, centers, camMat, coeff, rvec, tvec,
+                            false, Calib3d.CV_ITERATIVE);
+
+            if (!foundSolution) {
+                // skip to next frame
+                if (LOCAL_LOGV) {
+                    Log.v(TAG, "cannot find pnp solution in frame " + i + ", skipped.");
+                }
+                continue;
+            }
+
+            // reproject points to for evaluation of result accuracy of solvePnP
+            Calib3d.projectPoints(grid, rvec, tvec, camMat, coeff, reprojCenters);
+
+            // error is evaluated in norm2, which is real error in pixel distance / sqrt(2)
+            double error = Core.norm(centers, reprojCenters, Core.NORM_L2);
+
+            if (LOCAL_LOGV) {
+                Log.v(TAG, "Found attitude, re-projection error = " + error);
+            }
+
+            // if error is reasonable, add it into the results
+            if (error < REPROJECTION_THREASHOLD) {
+                double [] rv = new double[3];
+                rvec.get(0,0, rv);
+                recs.add(new AttitudeRec((double) i / meta.fps, rodr2rpy(rv)));
+            }
+
+            if (OUTPUT_DEBUG_IMAGE) {
+                Calib3d.drawChessboardCorners(frame, patternSize, reprojCenters, true);
+                Highgui.imwrite(Environment.getExternalStorageDirectory().getPath()
+                        + "/RVCVRecData/DebugCV/img" + i + ".png", frame);
+            }
+        }
+
+        if (LOCAL_LOGV) {
+            Log.v(TAG, "Finished decoding");
+        }
+
+        if (TRACE_VIDEO_ANALYSIS) {
+            Debug.stopMethodTracing();
+        }
+
+        if (LOCAL_LOGV) {
+            // time analysis
+            double totalTime = (System.nanoTime()-startTime)/1e9;
+            Log.i(TAG, "Total time: "+totalTime +"s, Per frame time: "+totalTime/i );
+        }
+        return i;
+    }
+
+    /**
+     * OpenCV for Android have not support the VideoCapture from file
+     * This is a make shift solution before it is supported.
+     * One issue right now is that the glReadPixels is quite slow .. around 6.5ms for a 720p frame
+     */
+    private class VideoDecoderForOpenCV implements Runnable {
+        private MediaExtractor extractor=null;
+        private MediaCodec decoder=null;
+        private CtsMediaOutputSurface surface=null;
+
+        private MatBuffer mMatBuffer;
+
+        private final File mVideoFile;
+
+        private boolean valid;
+        private Object setupSignal;
+
+        private Thread mThread;
+        private int mDecimation;
+
+        /**
+         * Constructor
+         * @param file video file
+         * @param decimation process every "decimation" number of frame
+         */
+        VideoDecoderForOpenCV(File file, int decimation) {
+            mVideoFile = file;
+            mDecimation = decimation;
+            valid = false;
+
+            start();
+        }
+
+        /**
+         * Constructor
+         * @param file video file
+         */
+        VideoDecoderForOpenCV(File file)   {
+            this(file, 1);
+        }
+
+        /**
+         * Test if video decoder is in valid states ready to output video.
+         * @return true of force.
+         */
+        public boolean isValid() {
+            return valid;
+        }
+
+        private void start() {
+            setupSignal = new Object();
+            mThread = new Thread(this);
+            mThread.start();
+
+            synchronized (setupSignal) {
+                try {
+                    setupSignal.wait();
+                } catch (InterruptedException e) {
+                    Log.e(TAG, "Interrupted when waiting for video decoder setup ready");
+                }
+            }
+        }
+        private void stop() {
+            if (mThread != null) {
+                mThread.interrupt();
+                try {
+                    mThread.join();
+                } catch (InterruptedException e) {
+                    Log.e(TAG, "Interrupted when waiting for video decoder thread to stop");
+                }
+                try {
+                    decoder.stop();
+                }catch (IllegalStateException e) {
+                    Log.e(TAG, "Video decoder is not in a state that can be stopped");
+                }
+            }
+            mThread = null;
+        }
+
+        void teardown() {
+            if (decoder!=null) {
+                decoder.release();
+                decoder = null;
+            }
+            if (surface!=null) {
+                surface.release();
+                surface = null;
+            }
+            if (extractor!=null) {
+                extractor.release();
+                extractor = null;
+            }
+        }
+
+        void setup() {
+            int width=0, height=0;
+
+            extractor = new MediaExtractor();
+
+            try {
+                extractor.setDataSource(mVideoFile.getPath());
+            } catch (IOException e) {
+                return;
+            }
+
+            for (int i = 0; i < extractor.getTrackCount(); i++) {
+                MediaFormat format = extractor.getTrackFormat(i);
+                String mime = format.getString(MediaFormat.KEY_MIME);
+                width = format.getInteger(MediaFormat.KEY_WIDTH);
+                height = format.getInteger(MediaFormat.KEY_HEIGHT);
+
+                if (mime.startsWith("video/")) {
+                    extractor.selectTrack(i);
+                    try {
+                        decoder = MediaCodec.createDecoderByType(mime);
+                    }catch (IOException e) {
+                        continue;
+                    }
+                    // Decode to surface
+                    //decoder.configure(format, surface, null, 0);
+
+                    // Decode to offscreen surface
+                    surface = new CtsMediaOutputSurface(width, height);
+                    mMatBuffer = new MatBuffer(width, height);
+
+                    decoder.configure(format, surface.getSurface(), null, 0);
+                    break;
+                }
+            }
+
+            if (decoder == null) {
+                Log.e("VideoDecoderForOpenCV", "Can't find video info!");
+                return;
+            }
+            valid = true;
+        }
+
+        @Override
+        public void run() {
+            setup();
+
+            synchronized (setupSignal) {
+                setupSignal.notify();
+            }
+
+            if (!valid) {
+                return;
+            }
+
+            decoder.start();
+
+            ByteBuffer[] inputBuffers = decoder.getInputBuffers();
+            ByteBuffer[] outputBuffers = decoder.getOutputBuffers();
+            MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
+
+            boolean isEOS = false;
+            long startMs = System.currentTimeMillis();
+            long timeoutUs = 10000;
+
+            int iframe = 0;
+
+            while (!Thread.interrupted()) {
+                if (!isEOS) {
+                    int inIndex = decoder.dequeueInputBuffer(10000);
+                    if (inIndex >= 0) {
+                        ByteBuffer buffer = inputBuffers[inIndex];
+                        int sampleSize = extractor.readSampleData(buffer, 0);
+                        if (sampleSize < 0) {
+                            if (LOCAL_LOGD) {
+                                Log.d("VideoDecoderForOpenCV",
+                                        "InputBuffer BUFFER_FLAG_END_OF_STREAM");
+                            }
+                            decoder.queueInputBuffer(inIndex, 0, 0, 0,
+                                    MediaCodec.BUFFER_FLAG_END_OF_STREAM);
+                            isEOS = true;
+                        } else {
+                            decoder.queueInputBuffer(inIndex, 0, sampleSize,
+                                    extractor.getSampleTime(), 0);
+                            extractor.advance();
+                        }
+                    }
+                }
+
+                int outIndex = decoder.dequeueOutputBuffer(info, 10000);
+                MediaFormat outFormat;
+                switch (outIndex) {
+                    case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
+                        if (LOCAL_LOGD) {
+                            Log.d("VideoDecoderForOpenCV", "INFO_OUTPUT_BUFFERS_CHANGED");
+                        }
+                        outputBuffers = decoder.getOutputBuffers();
+                        break;
+                    case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
+                        outFormat = decoder.getOutputFormat();
+                        if (LOCAL_LOGD) {
+                            Log.d("VideoDecoderForOpenCV", "New format " + outFormat);
+                        }
+                        break;
+                    case MediaCodec.INFO_TRY_AGAIN_LATER:
+                        if (LOCAL_LOGD) {
+                            Log.d("VideoDecoderForOpenCV", "dequeueOutputBuffer timed out!");
+                        }
+                        break;
+                    default:
+
+                        ByteBuffer buffer = outputBuffers[outIndex];
+                        boolean doRender = (info.size != 0);
+
+                        // As soon as we call releaseOutputBuffer, the buffer will be forwarded
+                        // to SurfaceTexture to convert to a texture.  The API doesn't
+                        // guarantee that the texture will be available before the call
+                        // returns, so we need to wait for the onFrameAvailable callback to
+                        // fire.  If we don't wait, we risk rendering from the previous frame.
+                        decoder.releaseOutputBuffer(outIndex, doRender);
+
+                        if (doRender) {
+                            surface.awaitNewImage();
+                            surface.drawImage();
+                            if (LOCAL_LOGD) {
+                                Log.d("VideoDecoderForOpenCV", "Finish drawing a frame!");
+                            }
+                            if ((iframe++ % mDecimation) == 0) {
+                                //Send the frame for processing
+                                mMatBuffer.put();
+                            }
+                        }
+                        break;
+                }
+
+                if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
+                    if (LOCAL_LOGD) {
+                        Log.d("VideoDecoderForOpenCV", "OutputBuffer BUFFER_FLAG_END_OF_STREAM");
+                    }
+                    break;
+                }
+            }
+            mMatBuffer.invalidate();
+
+            decoder.stop();
+
+            teardown();
+            mThread = null;
+        }
+
+
+        /**
+         * Get next valid frame
+         * @return Frame in OpenCV mat
+         */
+        public Mat getFrame() {
+            return mMatBuffer.get();
+        }
+
+        /**
+         * Get the size of the frame
+         * @return size of the frame
+         */
+        Size getSize() {
+            return mMatBuffer.getSize();
+        }
+
+        /**
+         * A synchronized buffer
+         */
+        class MatBuffer {
+            private Mat mat;
+            private byte[] bytes;
+            private ByteBuffer buf;
+            private boolean full;
+
+            private int mWidth, mHeight;
+            private boolean mValid = false;
+
+            MatBuffer(int width, int height) {
+                mWidth = width;
+                mHeight = height;
+
+                mat = new Mat(height, width, CvType.CV_8UC4); //RGBA
+                buf = ByteBuffer.allocateDirect(width*height*4);
+                bytes = new byte[width*height*4];
+
+                mValid = true;
+                full = false;
+            }
+
+            public synchronized void invalidate() {
+                mValid = false;
+                notifyAll();
+            }
+
+            public synchronized Mat get() {
+
+                if (!mValid) return null;
+                while (full == false) {
+                    try {
+                        wait();
+                        if (!mValid) return null;
+                    } catch (InterruptedException e) {
+                        return null;
+                    }
+                }
+                mat.put(0,0, bytes);
+                full = false;
+                notifyAll();
+                return mat;
+            }
+            public synchronized void put() {
+                while (full) {
+                    try {
+                        wait();
+                    } catch (InterruptedException e) {
+                        Log.e(TAG, "Interrupted when waiting for space in buffer");
+                    }
+                }
+                GLES20.glReadPixels(0, 0, mWidth, mHeight, GL10.GL_RGBA,
+                        GL10.GL_UNSIGNED_BYTE, buf);
+                buf.get(bytes);
+                buf.rewind();
+
+                full = true;
+                notifyAll();
+            }
+
+            public Size getSize() {
+                if (valid) {
+                    return mat.size();
+                }
+                return new Size();
+            }
+        }
+    }
+
+
+    /* a small set of math functions */
+    private static double [] quat2rpy( double [] q) {
+        double [] rpy = {Math.atan2(2*(q[0]*q[1]+q[2]*q[3]), 1-2*(q[1]*q[1]+q[2]*q[2])),
+                Math.asin(2*(q[0]*q[2] - q[3]*q[1])),
+                Math.atan2(2*(q[0]*q[3]+q[1]*q[2]), 1-2*(q[2]*q[2]+q[3]*q[3]))};
+        return rpy;
+    }
+
+    private static void quat2rpy( double [] q, double[] rpy) {
+        rpy[0] = Math.atan2(2*(q[0]*q[1]+q[2]*q[3]), 1-2*(q[1]*q[1]+q[2]*q[2]));
+        rpy[1] = Math.asin(2*(q[0]*q[2] - q[3]*q[1]));
+        rpy[2] = Math.atan2(2*(q[0]*q[3]+q[1]*q[2]), 1-2*(q[2]*q[2]+q[3]*q[3]));
+    }
+
+    private static Mat quat2rpy(Mat quat) {
+        double [] q = new double[4];
+        quat.get(0,0,q);
+
+        double [] rpy = {Math.atan2(2*(q[0]*q[1]+q[2]*q[3]), 1-2*(q[1]*q[1]+q[2]*q[2])),
+                Math.asin(2*(q[0]*q[2] - q[3]*q[1])),
+                Math.atan2(2*(q[0]*q[3]+q[1]*q[2]), 1-2*(q[2]*q[2]+q[3]*q[3]))};
+
+        Mat rpym = new Mat(3,1, CvType.CV_64F);
+        rpym.put(0,0, rpy);
+        return rpym;
+    }
+
+    private static double [] rodr2quat( double [] r) {
+        double t = Math.sqrt(r[0]*r[0]+r[1]*r[1]+r[2]*r[2]);
+        double [] quat = {Math.cos(t/2), Math.sin(t/2)*r[0]/t,Math.sin(t/2)*r[1]/t,
+                Math.sin(t/2)*r[2]/t};
+        return quat;
+    }
+
+    private static void rodr2quat( double [] r, double [] quat) {
+        double t = Math.sqrt(r[0]*r[0]+r[1]*r[1]+r[2]*r[2]);
+        quat[0] = Math.cos(t/2);
+        quat[1] = Math.sin(t/2)*r[0]/t;
+        quat[2] = Math.sin(t/2)*r[1]/t;
+        quat[3] = Math.sin(t/2)*r[2]/t;
+    }
+
+    private static Mat rodr2quat(Mat rodr) {
+        double t = Core.norm(rodr);
+        double [] r = new double[3];
+        rodr.get(0,0,r);
+
+        double [] quat = {Math.cos(t/2), Math.sin(t/2)*r[0]/t,Math.sin(t/2)*r[1]/t,
+                Math.sin(t/2)*r[2]/t};
+        Mat quatm = new Mat(4,1, CvType.CV_64F);
+        quatm.put(0, 0, quat);
+        return quatm;
+    }
+
+    private static double [] rodr2rpy( double [] r) {
+        return quat2rpy(rodr2quat(r));
+    }
+    //////////////////
+
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckTestActivity.java
new file mode 100644
index 0000000..9a74a0e
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckTestActivity.java
@@ -0,0 +1,337 @@
+/*
+ * Copyright (C) 2014 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 com.android.cts.verifier.sensors;
+
+
+import android.hardware.cts.helpers.SensorTestStateNotSupportedException;
+import android.os.Bundle;
+
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
+import com.android.cts.verifier.sensors.helpers.OpenCVLibrary;
+
+import junit.framework.Assert;
+
+import android.content.Intent;
+
+import java.util.concurrent.CountDownLatch;
+
+/**
+ * This test (Rotation Vector - Computer Vision Cross Check, or RXCVXCheck for short) verifies that
+ * mobile device can detect the orientation of itself in a relatively accurate manner.
+ *
+ * Currently only ROTATION_VECTOR sensor is used.
+ *
+ */
+public class RVCVXCheckTestActivity
+        extends SensorCtsVerifierTestActivity {
+    public RVCVXCheckTestActivity() {
+        super(RVCVXCheckTestActivity.class);
+    }
+
+    CountDownLatch mRecordActivityFinishedSignal = null;
+
+    private static final int REQ_CODE_TXCVRECORD = 0x012345678;
+    private static final boolean TEST_USING_DEBUGGING_DATA = false;
+    private static final String PATH_DEBUGGING_DATA = "/sdcard/RXCVRecData/150313-014443/";
+
+    private String mRecPath;
+
+    RVCVXCheckAnalyzer.AnalyzeReport mReport = null;
+
+    private boolean mRecordSuccessful = false;
+    private boolean mOpenCVLoadSuccessful = false;
+
+    private static class Criterion {
+        public static final float roll_rms_error = 0.15f;
+        public static final float pitch_rms_error = 0.15f;
+        public static final float yaw_rms_error = 0.25f;
+
+        public static final float roll_max_error = 0.30f;
+        public static final float pitch_max_error = 0.30f;
+        public static final float yaw_max_error = 0.45f;
+
+        public static final float sensor_period_stdev = 0.25e-3f;
+    };
+
+
+    /**
+     * The activity setup collects all the required data for test cases.
+     * This approach allows to test all sensors at once.
+     */
+    @Override
+    protected void activitySetUp() throws InterruptedException {
+
+        mRecPath = "";
+
+        showUserMessage("Loading OpenCV Library...");
+        int retry = 10;
+
+        while(retry-->0) {
+            try {
+                Thread.sleep(100);
+            } catch (InterruptedException e) {
+                //
+            }
+            if (OpenCVLibrary.isLoaded()) {
+                break;
+            }
+        }
+        if (!OpenCVLibrary.isLoaded()) {
+            // failed requirement test
+            clearText();
+            return;
+        }
+        showUserMessage("OpenCV Library Successfully Loaded");
+
+        mOpenCVLoadSuccessful = true;
+
+        if (TEST_USING_DEBUGGING_DATA) {
+            mRecPath = PATH_DEBUGGING_DATA;
+
+            // assume the data is there already
+            mRecordSuccessful = true;
+        } else {
+            showUserMessage("Take the test as instructed below:\n" +
+                "1. Print out the test pattern and place it on a "+
+                   "horizontal surface.\n" +
+                "2. Start the test and align the yellow square on the screen "+
+                   "roughly to the yellow sqaure.\n" +
+                "3. Follow the prompt to rotate the phone while keeping the "+
+                   "entire test pattern inside view of camera. This requires " +
+                   "orbiting the phone around and aiming the "+
+                   "camera at the test pattern at the same time.\n" +
+                "4. Wait patiently for the analysis to finish.\n");
+
+            waitForUserToContinue();
+
+            // prepare sync signal
+            mRecordActivityFinishedSignal = new CountDownLatch(1);
+
+            // record both sensor and camera
+            Intent intent = new Intent(this, RVCVRecordActivity.class);
+            startActivityForResult(intent, REQ_CODE_TXCVRECORD);
+
+            // wait for record finish
+            mRecordActivityFinishedSignal.await();
+
+            if ("".equals(mRecPath)) {
+                showUserMessage("Recording failed or exited prematurely.");
+                waitForUserToContinue();
+            } else {
+                showUserMessage("Recording is done!");
+                showUserMessage("Result are in path: " + mRecPath);
+                mRecordSuccessful = true;
+            }
+        }
+
+
+        if (mRecordSuccessful) {
+            showUserMessage("Please wait for the analysis ... \n"+
+                            "It may take a few minutes, you will be noted when "+
+                            "its finished by sound and vibration. ");
+
+            // Analysis of recorded video and sensor data using RVCXAnalyzer
+            RVCVXCheckAnalyzer analyzer = new RVCVXCheckAnalyzer(mRecPath);
+            mReport = analyzer.processDataSet();
+
+            playSound();
+            vibrate(500);
+
+            if (mReport == null) {
+                showUserMessage("Analysis failed due to unknown reason!");
+            } else {
+                if (mReport.error) {
+                    showUserMessage("Analysis failed: " + mReport.reason);
+                } else {
+                    showUserMessage(String.format("Analysis finished!\n" +
+                                    "Roll error (Rms, max) = %4.3f, %4.3f rad\n" +
+                                    "Pitch error (Rms, max) = %4.3f, %4.3f rad\n" +
+                                    "Yaw error (Rms, max) = %4.3f, %4.3f rad\n" +
+                                    "N of Frame (valid, total) = %d, %d\n" +
+                                    "Sensor period (mean, stdev) = %4.3f, %4.3f ms\n" +
+                                    "Time offset: %4.3f s \n" +
+                                    "Yaw offset: %4.3f rad \n\n",
+                            mReport.roll_rms_error, mReport.roll_max_error,
+                            mReport.pitch_rms_error, mReport.pitch_max_error,
+                            mReport.yaw_rms_error, mReport.yaw_max_error,
+                            mReport.n_of_valid_frame, mReport.n_of_frame,
+                            mReport.sensor_period_avg * 1000.0, mReport.sensor_period_stdev*1000.0,
+                            mReport.optimal_delta_t, mReport.yaw_offset));
+                    showUserMessage("Please click next after details reviewed.");
+                    waitForUserToContinue();
+                }
+            }
+        }
+        clearText();
+    }
+
+    /**
+    Receiving the results from the RVCVRecordActivity, which is a patch where the recorded
+    video and sensor data is stored.
+    */
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        // Check which request we're responding to
+        if (requestCode == REQ_CODE_TXCVRECORD) {
+            // Make sure the request was successful
+
+            if (resultCode == RESULT_OK) {
+                mRecPath = data.getData().getPath();
+            }
+
+            // notify it is finished
+            mRecordActivityFinishedSignal.countDown();
+        }
+        super.onActivityResult(requestCode, resultCode, data);
+    }
+
+    /**
+     * Test cases.
+     */
+
+    public String test00OpenCV() throws Throwable {
+
+        String message = "OpenCV is loaded";
+        Assert.assertTrue("OpenCV library cannot be loaded.", mOpenCVLoadSuccessful);
+        return message;
+    }
+
+
+    public String test01Recording() throws Throwable {
+
+        loadOpenCVSuccessfulOrSkip();
+
+        String message = "Record is successful.";
+        Assert.assertTrue("Record is not successful.", mRecordSuccessful);
+        return message;
+    }
+
+    public String test02Analysis() throws Throwable {
+
+        loadOpenCVSuccessfulOrSkip();
+        recordSuccessfulOrSkip();
+
+        String message = "Analysis result: " + mReport.reason;
+        Assert.assertTrue(message, (mReport!=null && !mReport.error));
+        return message;
+    }
+
+    public String test1RollAxis() throws Throwable {
+
+        loadOpenCVSuccessfulOrSkip();
+        recordSuccessfulOrSkip();
+        analyzeSuccessfulOrSkip();
+
+        String message = "Test Roll Axis Accuracy";
+
+        Assert.assertEquals("Roll RMS error", 0.0, mReport.roll_rms_error,
+                Criterion.roll_rms_error);
+        Assert.assertEquals("Roll max error", 0.0, mReport.roll_max_error,
+                Criterion.roll_max_error);
+        return message;
+    }
+
+    public String test2PitchAxis() throws Throwable {
+
+        loadOpenCVSuccessfulOrSkip();
+        recordSuccessfulOrSkip();
+        analyzeSuccessfulOrSkip();
+
+        String message = "Test Pitch Axis Accuracy";
+
+        Assert.assertEquals("Pitch RMS error", 0.0, mReport.pitch_rms_error,
+                Criterion.pitch_rms_error);
+        Assert.assertEquals("Pitch max error", 0.0, mReport.pitch_max_error,
+                Criterion.pitch_max_error);
+        return message;
+    }
+
+    public String test3YawAxis() throws Throwable {
+
+        loadOpenCVSuccessfulOrSkip();
+        recordSuccessfulOrSkip();
+        analyzeSuccessfulOrSkip();
+
+        String message = "Test Yaw Axis Accuracy";
+
+        Assert.assertEquals("Yaw RMS error", 0.0, mReport.yaw_rms_error,
+                Criterion.yaw_rms_error);
+        Assert.assertEquals("Yaw max error", 0.0, mReport.yaw_max_error,
+                Criterion.yaw_max_error);
+        return message;
+    }
+
+    public String test4SensorPeriod() throws Throwable {
+
+        loadOpenCVSuccessfulOrSkip();
+        recordSuccessfulOrSkip();
+        analyzeSuccessfulOrSkip();
+
+        String message = "Test Sensor Period";
+
+        // we do not know what the maximum frequency can be, so just test the stdev value
+        Assert.assertEquals("Sensor sample period stdev.", 0.0, mReport.sensor_period_stdev,
+                Criterion.sensor_period_stdev);
+        return message;
+    }
+
+    private void loadOpenCVSuccessfulOrSkip() throws SensorTestStateNotSupportedException {
+        if (!mOpenCVLoadSuccessful)
+            throw new SensorTestStateNotSupportedException("Skipped due to OpenCV cannot be loaded");
+    }
+
+    private void recordSuccessfulOrSkip() throws SensorTestStateNotSupportedException {
+        if (!mRecordSuccessful)
+            throw new SensorTestStateNotSupportedException("Skipped due to record failure.");
+    }
+
+    private void analyzeSuccessfulOrSkip() throws SensorTestStateNotSupportedException {
+        if (mReport == null || mReport.error)
+            throw new SensorTestStateNotSupportedException("Skipped due to CV Analysis failure.");
+    }
+
+    /*
+     *  This function serves as a proxy as showUserMessage is marked to be deprecated.
+     *  When appendText is removed, this function will have a different implementation.
+     *
+     */
+    void showUserMessage(String s) {
+        appendText(s);
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+
+        super.onCreate(savedInstanceState);
+
+        // GlSurfaceView is not necessary for this test
+        closeGlSurfaceView();
+
+        OpenCVLibrary.loadAsync(this);
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SignificantMotionTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SignificantMotionTestActivity.java
index faba445..6dbf8cc 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SignificantMotionTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SignificantMotionTestActivity.java
@@ -16,22 +16,36 @@
 
 package com.android.cts.verifier.sensors;
 
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
 import com.android.cts.verifier.R;
 import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
+import com.android.cts.verifier.sensors.helpers.SensorTestScreenManipulator;
 
-import junit.framework.Assert;
-
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
 import android.hardware.Sensor;
 import android.hardware.SensorManager;
 import android.hardware.TriggerEvent;
 import android.hardware.TriggerEventListener;
 import android.hardware.cts.helpers.SensorNotSupportedException;
 import android.hardware.cts.helpers.TestSensorEnvironment;
+import android.hardware.cts.helpers.SuspendStateMonitor;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.PowerManager;
 import android.os.SystemClock;
+import android.support.v4.content.LocalBroadcastManager;
+import android.util.Log;
 
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
+import junit.framework.Assert;
 
 /**
  * Test cases for Significant Motion sensor.
@@ -46,20 +60,30 @@
     private static final long MAX_ACCEPTABLE_EVENT_TIME_DELAY_NANOS =
             TimeUnit.MILLISECONDS.toNanos(500);
 
+    // acceptable time difference between event time and AP wake up time.
+    private static final long MAX_ACCEPTABLE_DELAY_EVENT_AP_WAKE_UP_NS =
+            TimeUnit.MILLISECONDS.toNanos(2000);
+
+    // time to wait for SMD after the device has gone into suspend. Even after
+    // 45 secs if SMD does not trigger, the test will fail.
+    private static final long ALARM_WAKE_TIME_DELAY_MS = TimeUnit.SECONDS.toMillis(45);
+
     // time for the test to wait for a trigger
     private static final int TRIGGER_MAX_DELAY_SECONDS = 30;
     private static final int VIBRATE_DURATION_MILLIS = 10000;
 
     private static final int EVENT_VALUES_LENGTH = 1;
     private static final float EXPECTED_EVENT_VALUE = 1.0f;
+    private static String ACTION_ALARM = "SignificantMotionTestActivity.ACTION_ALARM";
 
     private SensorManager mSensorManager;
     private Sensor mSensorSignificantMotion;
+    private TriggerVerifier mVerifier;
+    private SensorTestScreenManipulator mScreenManipulator;
 
     /**
      * Test cases.
      */
-
     @SuppressWarnings("unused")
     public String testTrigger() throws Throwable {
         return runTest(
@@ -131,6 +155,69 @@
         return result;
     }
 
+    public static class AlarmReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Intent alarm_intent = new Intent(context, SignificantMotionTestActivity.class);
+            alarm_intent.setAction(SignificantMotionTestActivity.ACTION_ALARM);
+            LocalBroadcastManager.getInstance(context).sendBroadcastSync(alarm_intent);
+        }
+    }
+
+    public BroadcastReceiver myBroadCastReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            mVerifier.releaseLatch();
+            mScreenManipulator.turnScreenOn();
+            try {
+                playSound();
+            } catch (InterruptedException e) {
+                // Ignore ...
+            }
+        }
+    };
+
+    @SuppressWarnings("unused")
+    public String testAPWakeUpOnSMDTrigger() throws Throwable {
+        SensorTestLogger logger = getTestLogger();
+        logger.logInstructions(R.string.snsr_significant_motion_ap_suspend);
+        waitForUserToBegin();
+        mVerifier = new TriggerVerifier();
+        mSensorManager.requestTriggerSensor(mVerifier, mSensorSignificantMotion);
+        long testStartTimeNs = SystemClock.elapsedRealtimeNanos();
+        Handler handler = new Handler(Looper.getMainLooper());
+        SuspendStateMonitor suspendStateMonitor = new SuspendStateMonitor();
+
+        Intent intent = new Intent(this, AlarmReceiver.class);
+        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
+
+        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
+        am.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,
+                     SystemClock.elapsedRealtime() + ALARM_WAKE_TIME_DELAY_MS, pendingIntent);
+        try {
+            // Wait for the first event to trigger. Device is expected to go into suspend here.
+            mVerifier.verifyEventTriggered();
+            long eventTimeStampNs = mVerifier.getTimeStampForTriggerEvent();
+            long endTimeNs = SystemClock.elapsedRealtimeNanos();
+            long lastWakeupTimeNs = TimeUnit.MILLISECONDS.toNanos(
+                    suspendStateMonitor.getLastWakeUpTime());
+            Assert.assertTrue(getString(R.string.snsr_device_did_not_go_into_suspend),
+                              testStartTimeNs < lastWakeupTimeNs && lastWakeupTimeNs < endTimeNs);
+            long timestampDelta = Math.abs(lastWakeupTimeNs - eventTimeStampNs);
+            Assert.assertTrue(
+                    String.format(getString(R.string.snsr_device_did_not_wake_up_at_trigger),
+                              TimeUnit.NANOSECONDS.toMillis(lastWakeupTimeNs),
+                              TimeUnit.NANOSECONDS.toMillis(eventTimeStampNs)),
+                              timestampDelta < MAX_ACCEPTABLE_DELAY_EVENT_AP_WAKE_UP_NS);
+        } finally {
+            am.cancel(pendingIntent);
+            suspendStateMonitor.cancel();
+            mScreenManipulator.turnScreenOn();
+            playSound();
+        }
+        return null;
+    }
+
     /**
      * @param instructionsResId Instruction to be shown to testers
      * @param isMotionExpected Should the device detect significant motion event
@@ -187,6 +274,27 @@
         if (mSensorSignificantMotion == null) {
             throw new SensorNotSupportedException(Sensor.TYPE_SIGNIFICANT_MOTION);
         }
+
+        mScreenManipulator = new SensorTestScreenManipulator(this);
+        try {
+            mScreenManipulator.initialize(this);
+        } catch (InterruptedException e) {
+        }
+        PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
+        LocalBroadcastManager.getInstance(this).registerReceiver(myBroadCastReceiver,
+                                            new IntentFilter(ACTION_ALARM));
+    }
+
+    @Override
+    protected void activityCleanUp() {
+        mScreenManipulator.turnScreenOff();
+        LocalBroadcastManager.getInstance(this).unregisterReceiver(myBroadCastReceiver);
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        mScreenManipulator.close();
     }
 
     /**
@@ -196,6 +304,7 @@
     private class TriggerVerifier extends TriggerEventListener {
         private volatile CountDownLatch mCountDownLatch;
         private volatile TriggerEventRegistry mEventRegistry;
+        private volatile long mTimestampForTriggeredEvent = 0;
 
         // TODO: refactor out if needed
         private class TriggerEventRegistry {
@@ -214,6 +323,16 @@
             mCountDownLatch.countDown();
         }
 
+        public void releaseLatch() {
+            if (mCountDownLatch != null) {
+                mCountDownLatch.countDown();
+            }
+        }
+
+        public long getTimeStampForTriggerEvent() {
+            return mTimestampForTriggeredEvent;
+        }
+
         public String verifyEventTriggered() throws Throwable {
             TriggerEventRegistry registry = awaitForEvent();
 
@@ -269,10 +388,14 @@
         private TriggerEventRegistry awaitForEvent() throws InterruptedException {
             mCountDownLatch = new CountDownLatch(1);
             mCountDownLatch.await(TRIGGER_MAX_DELAY_SECONDS, TimeUnit.SECONDS);
-
             TriggerEventRegistry registry = mEventRegistry;
-            mEventRegistry = null;
 
+            // Save the last timestamp when the event triggered.
+            if (mEventRegistry != null && mEventRegistry.triggerEvent != null) {
+                mTimestampForTriggeredEvent = mEventRegistry.triggerEvent.timestamp;
+            }
+
+            mEventRegistry = null;
             playSound();
             return registry != null ? registry : new TriggerEventRegistry(null, 0);
         }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/OpenCVLibrary.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/OpenCVLibrary.java
new file mode 100644
index 0000000..2f5c873
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/OpenCVLibrary.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.sensors.helpers;
+
+import android.content.Context;
+import android.os.Looper;
+import android.util.Log;
+
+import org.opencv.android.BaseLoaderCallback;
+import org.opencv.android.LoaderCallbackInterface;
+import org.opencv.android.OpenCVLoader;
+
+import java.util.concurrent.CountDownLatch;
+
+/**
+ * OpenCV library loader class
+ */
+public class OpenCVLibrary {
+
+    private static String TAG = "OpenCVLibraryProbe";
+    private static boolean mLoaded = false;
+
+    /**
+     * Load OpenCV Library in async mode
+     * @param context Activity context
+     */
+    public static void loadAsync(Context context) {
+        // only need to load once
+        if (isLoaded())  return;
+
+        // Load the library through loader
+        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, context,
+                new BaseLoaderCallback(context) {
+                    @Override
+                    public void onManagerConnected(int status) {
+                        Log.v(TAG, "New Loading status: "+status);
+                        switch (status) {
+                            case LoaderCallbackInterface.SUCCESS: {
+                                mLoaded = true;
+                            }
+                            break;
+                            default: {
+                                super.onManagerConnected(status);
+                            }
+                            break;
+                        }
+                    }
+                });
+    }
+
+    /**
+     * Test if the library is loaded
+     * @return a boolean indicates whether the OpenCV library is loaded.
+     */
+    public static boolean isLoaded() {
+        return mLoaded;
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/tv/MockTvInputService.java b/apps/CtsVerifier/src/com/android/cts/verifier/tv/MockTvInputService.java
index e7d1d79..f875684 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/tv/MockTvInputService.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/tv/MockTvInputService.java
@@ -16,9 +16,9 @@
 
 package com.android.cts.verifier.tv;
 
-import com.android.cts.verifier.R;
-
+import android.annotation.SuppressLint;
 import android.content.BroadcastReceiver;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -27,20 +27,29 @@
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.Rect;
+import android.media.PlaybackParams;
 import android.media.tv.TvContentRating;
+import android.media.tv.TvContract;
 import android.media.tv.TvInputManager;
 import android.media.tv.TvInputService;
 import android.media.tv.TvTrackInfo;
 import android.net.Uri;
 import android.os.Bundle;
-import android.view.Surface;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.util.Log;
 import android.view.LayoutInflater;
+import android.view.Surface;
 import android.view.View;
 import android.widget.TextView;
 
+import com.android.cts.verifier.R;
+
 import java.util.ArrayList;
 import java.util.List;
 
+@SuppressLint("NewApi")
 public class MockTvInputService extends TvInputService {
     private static final String TAG = "MockTvInputService";
 
@@ -48,6 +57,7 @@
     private static final String SELECT_TRACK_TYPE = "type";
     private static final String SELECT_TRACK_ID = "id";
     private static final String CAPTION_ENABLED = "enabled";
+    private static final String PAUSE_CALLED = "pause_called";
 
     private static Object sLock = new Object();
     private static Callback sTuneCallback = null;
@@ -56,6 +66,14 @@
     private static Callback sUnblockContentCallback = null;
     private static Callback sSelectTrackCallback = null;
     private static Callback sSetCaptionEnabledCallback = null;
+    // Callbacks for time shift.
+    private static Callback sResumeAfterPauseCallback = null;
+    private static Callback sPositionTrackingCallback = null;
+    private static Callback sRewindCallback = null;
+    private static Callback sFastForwardCallback = null;
+    private static Callback sSeekToPreviousCallback = null;
+    private static Callback sSeekToNextCallback = null;
+
     private static TvContentRating sRating = null;
 
     static final TvTrackInfo sEngAudioTrack =
@@ -142,6 +160,47 @@
         }
     }
 
+    static void expectResumeAfterPause(View postTarget, Runnable successCallback) {
+        synchronized (sLock) {
+            sResumeAfterPauseCallback = new Callback(postTarget, successCallback);
+        }
+    }
+
+    static void expectPositionTracking(View postTarget, Runnable successCallback) {
+        synchronized (sLock) {
+            sPositionTrackingCallback = new Callback(postTarget, successCallback);
+        }
+    }
+
+    static void expectRewind(View postTarget, Runnable successCallback) {
+        synchronized (sLock) {
+            sRewindCallback = new Callback(postTarget, successCallback);
+        }
+    }
+
+    static void expectFastForward(View postTarget, Runnable successCallback) {
+        synchronized (sLock) {
+            sFastForwardCallback = new Callback(postTarget, successCallback);
+        }
+    }
+
+    static void expectSeekToPrevious(View postTarget, Runnable successCallback) {
+        synchronized (sLock) {
+            sSeekToPreviousCallback = new Callback(postTarget, successCallback);
+        }
+    }
+
+    static void expectSeekToNext(View postTarget, Runnable successCallback) {
+        synchronized (sLock) {
+            sSeekToNextCallback = new Callback(postTarget, successCallback);
+        }
+    }
+
+    static String getInputId(Context context) {
+        return TvContract.buildInputId(new ComponentName(context,
+                        MockTvInputService.class.getName()));
+    }
+
     @Override
     public void onCreate() {
         super.onCreate();
@@ -165,10 +224,45 @@
     }
 
     private static class MockSessionImpl extends Session {
+        private static final int MSG_SEEK = 1000;
+        private static final int SEEK_DELAY_MS = 300;
+
         private final Context mContext;
         private Surface mSurface = null;
         private List<TvTrackInfo> mTracks = new ArrayList<>();
 
+        private long mRecordStartTimeMs;
+        private long mPausedTimeMs;
+        // The time in milliseconds when the current position is lastly updated.
+        private long mLastCurrentPositionUpdateTimeMs;
+        // The current playback position.
+        private long mCurrentPositionMs;
+        // The current playback speed rate.
+        private float mSpeed;
+
+        private final Handler mHandler = new Handler(Looper.getMainLooper()) {
+            @Override
+            public void handleMessage(Message msg) {
+                if (msg.what == MSG_SEEK) {
+                    // Actually, this input doesn't play any videos, it just shows the image.
+                    // So we should simulate the playback here by changing the current playback
+                    // position periodically in order to test the time shift.
+                    // If the playback is paused, the current playback position doesn't need to be
+                    // changed.
+                    if (mPausedTimeMs == 0) {
+                        long currentTimeMs = System.currentTimeMillis();
+                        mCurrentPositionMs += (long) ((currentTimeMs
+                                - mLastCurrentPositionUpdateTimeMs) * mSpeed);
+                        mCurrentPositionMs = Math.max(mRecordStartTimeMs,
+                                Math.min(mCurrentPositionMs, currentTimeMs));
+                        mLastCurrentPositionUpdateTimeMs = currentTimeMs;
+                    }
+                    sendEmptyMessageDelayed(MSG_SEEK, SEEK_DELAY_MS);
+                }
+                super.handleMessage(msg);
+            }
+        };
+
         private MockSessionImpl(Context context) {
             super(context);
             mContext = context;
@@ -256,6 +350,12 @@
             notifyTracksChanged(mTracks);
             notifyTrackSelected(TvTrackInfo.TYPE_AUDIO, sEngAudioTrack.getId());
             notifyTrackSelected(TvTrackInfo.TYPE_SUBTITLE, null);
+            notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE);
+            mRecordStartTimeMs = mCurrentPositionMs = mLastCurrentPositionUpdateTimeMs
+                    = System.currentTimeMillis();
+            mPausedTimeMs = 0;
+            mHandler.sendEmptyMessageDelayed(MSG_SEEK, SEEK_DELAY_MS);
+            mSpeed = 1;
             return true;
         }
 
@@ -298,6 +398,88 @@
                 }
             }
         }
+
+        @Override
+        public long onTimeShiftGetCurrentPosition() {
+            synchronized (sLock) {
+                if (sPositionTrackingCallback != null) {
+                    sPositionTrackingCallback.post();
+                    sPositionTrackingCallback = null;
+                }
+            }
+            Log.d(TAG, "currentPositionMs=" + mCurrentPositionMs);
+            return mCurrentPositionMs;
+        }
+
+        @Override
+        public long onTimeShiftGetStartPosition() {
+            return mRecordStartTimeMs;
+        }
+
+        @Override
+        public void onTimeShiftPause() {
+            synchronized (sLock) {
+                if (sResumeAfterPauseCallback != null) {
+                    sResumeAfterPauseCallback.mBundle.putBoolean(PAUSE_CALLED, true);
+                }
+            }
+            mCurrentPositionMs = mPausedTimeMs = mLastCurrentPositionUpdateTimeMs
+                    = System.currentTimeMillis();
+        }
+
+        @Override
+        public void onTimeShiftResume() {
+            synchronized (sLock) {
+                if (sResumeAfterPauseCallback != null
+                        && sResumeAfterPauseCallback.mBundle.getBoolean(PAUSE_CALLED)) {
+                    sResumeAfterPauseCallback.post();
+                    sResumeAfterPauseCallback = null;
+                }
+            }
+            mSpeed = 1;
+            mPausedTimeMs = 0;
+            mLastCurrentPositionUpdateTimeMs = System.currentTimeMillis();
+        }
+
+        @Override
+        public void onTimeShiftSeekTo(long timeMs) {
+            synchronized (sLock) {
+                if (mCurrentPositionMs > timeMs) {
+                    if (sSeekToPreviousCallback != null) {
+                        sSeekToPreviousCallback.post();
+                        sSeekToPreviousCallback = null;
+                    }
+                } else if (mCurrentPositionMs < timeMs) {
+                    if (sSeekToNextCallback != null) {
+                        sSeekToNextCallback.post();
+                        sSeekToNextCallback = null;
+                    }
+                }
+            }
+            mLastCurrentPositionUpdateTimeMs = System.currentTimeMillis();
+            mCurrentPositionMs = Math.max(mRecordStartTimeMs,
+                    Math.min(timeMs, mLastCurrentPositionUpdateTimeMs));
+        }
+
+        @Override
+        public void onTimeShiftSetPlaybackParams(PlaybackParams params) {
+            synchronized(sLock) {
+                if (params != null) {
+                    if (params.getSpeed() > 1) {
+                        if (sFastForwardCallback != null) {
+                            sFastForwardCallback.post();
+                            sFastForwardCallback = null;
+                        }
+                    } else if (params.getSpeed() < 1) {
+                        if (sRewindCallback != null) {
+                            sRewindCallback.post();
+                            sRewindCallback = null;
+                        }
+                    }
+                }
+            }
+            mSpeed = params.getSpeed();
+        }
     }
 
     private static class Callback {
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/tv/MockTvInputSettingsActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/tv/MockTvInputSettingsActivity.java
deleted file mode 100644
index 4231db7..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/tv/MockTvInputSettingsActivity.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.android.cts.verifier.tv;
-
-import android.preference.PreferenceActivity;
-
-public class MockTvInputSettingsActivity extends PreferenceActivity {
-
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/tv/MultipleTracksTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/tv/MultipleTracksTestActivity.java
index 66af4c6..a912cc6 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/tv/MultipleTracksTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/tv/MultipleTracksTestActivity.java
@@ -17,7 +17,7 @@
 package com.android.cts.verifier.tv;
 
 import com.android.cts.verifier.R;
-
+import android.annotation.SuppressLint;
 import android.content.Intent;
 import android.database.Cursor;
 import android.media.tv.TvContentRating;
@@ -36,6 +36,7 @@
 /**
  * Tests for verifying TV app behavior on multiple tracks and subtitle.
  */
+@SuppressLint("NewApi")
 public class MultipleTracksTestActivity extends TvAppVerifierActivity
         implements View.OnClickListener {
     private static final String TAG = "MultipleTracksTestActivity";
@@ -113,7 +114,8 @@
         }
         if (mTvAppIntent == null) {
             String[] projection = { TvContract.Channels._ID };
-            try (Cursor cursor = getContentResolver().query(TvContract.Channels.CONTENT_URI,
+            try (Cursor cursor = getContentResolver().query(
+                    TvContract.buildChannelsUriForInput(MockTvInputService.getInputId(this)),
                     projection, null, null, null)) {
                 if (cursor != null && cursor.moveToNext()) {
                     mTvAppIntent = new Intent(Intent.ACTION_VIEW,
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/tv/ParentalControlTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/tv/ParentalControlTestActivity.java
index 284b485..c99da46 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/tv/ParentalControlTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/tv/ParentalControlTestActivity.java
@@ -17,7 +17,7 @@
 package com.android.cts.verifier.tv;
 
 import com.android.cts.verifier.R;
-
+import android.annotation.SuppressLint;
 import android.content.Intent;
 import android.database.Cursor;
 import android.media.tv.TvContentRating;
@@ -35,6 +35,7 @@
 /**
  * Tests for verifying TV app behavior on parental control.
  */
+@SuppressLint("NewApi")
 public class ParentalControlTestActivity extends TvAppVerifierActivity
         implements View.OnClickListener {
     private static final String TAG = "ParentalControlTestActivity";
@@ -110,7 +111,8 @@
         }
         if (mTvAppIntent == null) {
             String[] projection = { TvContract.Channels._ID };
-            try (Cursor cursor = getContentResolver().query(TvContract.Channels.CONTENT_URI,
+            try (Cursor cursor = getContentResolver().query(
+                    TvContract.buildChannelsUriForInput(MockTvInputService.getInputId(this)),
                     projection, null, null, null)) {
                 if (cursor != null && cursor.moveToNext()) {
                     mTvAppIntent = new Intent(Intent.ACTION_VIEW,
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/tv/TimeShiftTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/tv/TimeShiftTestActivity.java
new file mode 100644
index 0000000..5e4036c
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/tv/TimeShiftTestActivity.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.verifier.tv;
+
+import android.content.Intent;
+import android.database.Cursor;
+import android.media.tv.TvContract;
+import android.view.View;
+import android.widget.Toast;
+
+import com.android.cts.verifier.R;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Tests for verifying TV app behavior on time shift.
+ */
+public class TimeShiftTestActivity extends TvAppVerifierActivity
+        implements View.OnClickListener {
+    private static final long TIMEOUT_MS = TimeUnit.MINUTES.toMillis(5);
+    private static final boolean NOT_PASSED = false;
+    private static final boolean PASSED = true;
+
+    private View mPauseResumeItem;
+    private View mVerifyResumeAfterPauseItem;
+    private View mVerifyPositionTrackingItem;
+
+    private View mSetPlaybackParamsItem;
+    private View mVerifyRewindItem;
+    private View mVerifyFastForwardItem;
+
+    private View mSeekToItem;
+    private View mVerifySeekToPreviousItem;
+    private View mVerifySeekToNextItem;
+
+    private Intent mTvAppIntent = null;
+
+    @Override
+    public void onClick(View v) {
+        final View postTarget = getPostTarget();
+
+        if (containsButton(mPauseResumeItem, v)) {
+            mVerifyResumeAfterPauseItem.setTag(NOT_PASSED);
+            mVerifyPositionTrackingItem.setTag(NOT_PASSED);
+
+            final Runnable failCallback = new Runnable() {
+                @Override
+                public void run() {
+                    setPassState(mVerifyResumeAfterPauseItem, false);
+                    setPassState(mVerifyPositionTrackingItem, false);
+                }
+            };
+            postTarget.postDelayed(failCallback, TIMEOUT_MS);
+            MockTvInputService.expectResumeAfterPause(postTarget, new Runnable() {
+                @Override
+                public void run() {
+                    postTarget.removeCallbacks(failCallback);
+                    setPassState(mPauseResumeItem, true);
+                    setPassState(mVerifyResumeAfterPauseItem, true);
+                    mVerifyResumeAfterPauseItem.setTag(PASSED);
+                    if (isPassedState(mVerifyResumeAfterPauseItem)
+                            && isPassedState(mVerifyPositionTrackingItem)) {
+                        setButtonEnabled(mSetPlaybackParamsItem, true);
+                    }
+                }
+            });
+            MockTvInputService.expectPositionTracking(postTarget, new Runnable() {
+                @Override
+                public void run() {
+                    postTarget.removeCallbacks(failCallback);
+                    setPassState(mPauseResumeItem, true);
+                    setPassState(mVerifyPositionTrackingItem, true);
+                    mVerifyPositionTrackingItem.setTag(PASSED);
+                    if (isPassedState(mVerifyResumeAfterPauseItem)
+                            && isPassedState(mVerifyPositionTrackingItem)) {
+                        setButtonEnabled(mSetPlaybackParamsItem, true);
+                    }
+                }
+            });
+        } else if (containsButton(mSetPlaybackParamsItem, v)) {
+            mVerifyRewindItem.setTag(NOT_PASSED);
+            mVerifyFastForwardItem.setTag(NOT_PASSED);
+
+            final Runnable failCallback = new Runnable() {
+                @Override
+                public void run() {
+                    setPassState(mVerifyRewindItem, false);
+                    setPassState(mVerifyFastForwardItem, false);
+                }
+            };
+            postTarget.postDelayed(failCallback, TIMEOUT_MS);
+            MockTvInputService.expectRewind(postTarget, new Runnable() {
+                @Override
+                public void run() {
+                    postTarget.removeCallbacks(failCallback);
+                    setPassState(mSetPlaybackParamsItem, true);
+                    setPassState(mVerifyRewindItem, true);
+                    mVerifyRewindItem.setTag(PASSED);
+                    if (isPassedState(mVerifyRewindItem) && isPassedState(mVerifyFastForwardItem)) {
+                        setButtonEnabled(mSeekToItem, true);
+                    }
+                }
+            });
+            MockTvInputService.expectFastForward(postTarget, new Runnable() {
+                @Override
+                public void run() {
+                    postTarget.removeCallbacks(failCallback);
+                    setPassState(mSetPlaybackParamsItem, true);
+                    setPassState(mVerifyFastForwardItem, true);
+                    mVerifyFastForwardItem.setTag(PASSED);
+                    if (isPassedState(mVerifyRewindItem) && isPassedState(mVerifyFastForwardItem)) {
+                        setButtonEnabled(mSeekToItem, true);
+                    }
+                }
+            });
+        } else if (containsButton(mSeekToItem, v)) {
+            mVerifySeekToPreviousItem.setTag(NOT_PASSED);
+            mVerifySeekToNextItem.setTag(NOT_PASSED);
+
+            final Runnable failCallback = new Runnable() {
+                @Override
+                public void run() {
+                    setPassState(mVerifySeekToPreviousItem, false);
+                    setPassState(mVerifySeekToNextItem, false);
+                }
+            };
+            postTarget.postDelayed(failCallback, TIMEOUT_MS);
+            MockTvInputService.expectSeekToPrevious(postTarget, new Runnable() {
+                @Override
+                public void run() {
+                    postTarget.removeCallbacks(failCallback);
+                    setPassState(mSeekToItem, true);
+                    setPassState(mVerifySeekToPreviousItem, true);
+                    mVerifySeekToPreviousItem.setTag(PASSED);
+                    if (isPassedState(mVerifySeekToPreviousItem)
+                            && isPassedState(mVerifySeekToNextItem)) {
+                        getPassButton().setEnabled(true);
+                    }
+                }
+            });
+            MockTvInputService.expectSeekToNext(postTarget, new Runnable() {
+                @Override
+                public void run() {
+                    postTarget.removeCallbacks(failCallback);
+                    setPassState(mSeekToItem, true);
+                    setPassState(mVerifySeekToNextItem, true);
+                    mVerifySeekToNextItem.setTag(PASSED);
+                    if (isPassedState(mVerifySeekToPreviousItem)
+                            && isPassedState(mVerifySeekToNextItem)) {
+                        getPassButton().setEnabled(true);
+                    }
+                }
+            });
+        }
+        if (mTvAppIntent == null) {
+            String[] projection = { TvContract.Channels._ID };
+            try (Cursor cursor = getContentResolver().query(
+                    TvContract.buildChannelsUriForInput(MockTvInputService.getInputId(this)),
+                    projection, null, null, null)) {
+                if (cursor != null && cursor.moveToNext()) {
+                    mTvAppIntent = new Intent(Intent.ACTION_VIEW,
+                            TvContract.buildChannelUri(cursor.getLong(0)));
+                }
+            }
+            if (mTvAppIntent == null) {
+                Toast.makeText(this, R.string.tv_channel_not_found, Toast.LENGTH_SHORT).show();
+                return;
+            }
+        }
+        startActivity(mTvAppIntent);
+    }
+
+    @Override
+    protected void createTestItems() {
+        mPauseResumeItem = createUserItem(
+                R.string.tv_time_shift_test_pause_resume,
+                R.string.tv_launch_tv_app, this);
+        setButtonEnabled(mPauseResumeItem, true);
+        mVerifyResumeAfterPauseItem = createAutoItem(
+                R.string.tv_time_shift_test_verify_resume_after_pause);
+        mVerifyPositionTrackingItem = createAutoItem(
+                R.string.tv_time_shift_test_verify_position_tracking);
+        mSetPlaybackParamsItem = createUserItem(
+                R.string.tv_time_shift_test_speed_rate,
+                R.string.tv_launch_tv_app, this);
+        mVerifyRewindItem = createAutoItem(
+                R.string.tv_time_shift_test_verify_rewind);
+        mVerifyFastForwardItem = createAutoItem(
+                R.string.tv_time_shift_test_verify_fast_forward);
+        mSeekToItem = createUserItem(
+                R.string.tv_time_shift_test_seek,
+                R.string.tv_launch_tv_app, this);
+        mVerifySeekToPreviousItem = createAutoItem(
+                R.string.tv_time_shift_test_verify_seek_to_previous);
+        mVerifySeekToNextItem = createAutoItem(
+                R.string.tv_time_shift_test_verify_seek_to_next);
+    }
+
+    @Override
+    protected void setInfoResources() {
+        setInfoResources(R.string.tv_time_shift_test,
+                R.string.tv_time_shift_test_info, -1);
+    }
+
+    private boolean isPassedState(View view) {
+        return ((Boolean) view.getTag()) == PASSED;
+    }
+}
diff --git a/apps/PermissionApp/Android.mk b/apps/PermissionApp/Android.mk
new file mode 100644
index 0000000..57950da
--- /dev/null
+++ b/apps/PermissionApp/Android.mk
@@ -0,0 +1,31 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# Don't include this package in any target.
+LOCAL_MODULE_TAGS := optional
+
+# When built, explicitly put it in the data partition.
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsPermissionApp
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/apps/PermissionApp/AndroidManifest.xml b/apps/PermissionApp/AndroidManifest.xml
new file mode 100644
index 0000000..82e3617
--- /dev/null
+++ b/apps/PermissionApp/AndroidManifest.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.permissionapp">
+
+    <uses-sdk android:minSdkVersion="23"/>
+
+    <uses-permission android:name="android.permission.READ_CONTACTS"/>
+
+    <application android:label="CtsPermissionApp"
+            android:icon="@drawable/ic_permissionapp">
+        <activity android:name=".PermissionActivity" >
+            <intent-filter>
+                <action android:name="com.android.cts.permission.action.CHECK_HAS_PERMISSION" />
+                <action android:name="com.android.cts.permission.action.REQUEST_PERMISSION" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
+
diff --git a/apps/PermissionApp/res/drawable-hdpi/ic_permissionapp.png b/apps/PermissionApp/res/drawable-hdpi/ic_permissionapp.png
new file mode 100644
index 0000000..6fe4112
--- /dev/null
+++ b/apps/PermissionApp/res/drawable-hdpi/ic_permissionapp.png
Binary files differ
diff --git a/apps/PermissionApp/res/drawable-mdpi/ic_permissionapp.png b/apps/PermissionApp/res/drawable-mdpi/ic_permissionapp.png
new file mode 100644
index 0000000..a7a5666
--- /dev/null
+++ b/apps/PermissionApp/res/drawable-mdpi/ic_permissionapp.png
Binary files differ
diff --git a/apps/PermissionApp/res/drawable-xhdpi/ic_permissionapp.png b/apps/PermissionApp/res/drawable-xhdpi/ic_permissionapp.png
new file mode 100644
index 0000000..1e47732
--- /dev/null
+++ b/apps/PermissionApp/res/drawable-xhdpi/ic_permissionapp.png
Binary files differ
diff --git a/apps/PermissionApp/res/drawable-xxhdpi/ic_permissionapp.png b/apps/PermissionApp/res/drawable-xxhdpi/ic_permissionapp.png
new file mode 100644
index 0000000..0e849b3
--- /dev/null
+++ b/apps/PermissionApp/res/drawable-xxhdpi/ic_permissionapp.png
Binary files differ
diff --git a/apps/PermissionApp/res/drawable-xxxhdpi/ic_permissionapp.png b/apps/PermissionApp/res/drawable-xxxhdpi/ic_permissionapp.png
new file mode 100644
index 0000000..242a6b1
--- /dev/null
+++ b/apps/PermissionApp/res/drawable-xxxhdpi/ic_permissionapp.png
Binary files differ
diff --git a/apps/PermissionApp/src/com/android/cts/permission/permissionapp/PermissionActivity.java b/apps/PermissionApp/src/com/android/cts/permission/permissionapp/PermissionActivity.java
new file mode 100644
index 0000000..01b60d3
--- /dev/null
+++ b/apps/PermissionApp/src/com/android/cts/permission/permissionapp/PermissionActivity.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.permissionapp;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+import java.lang.Override;
+
+/**
+ * A simple activity that requests permissions and returns the result.
+ */
+public class PermissionActivity extends Activity {
+    private static final String TAG = "PermissionActivity";
+
+    private static final String ACTION_CHECK_HAS_PERMISSION
+            = "com.android.cts.permission.action.CHECK_HAS_PERMISSION";
+    private static final String ACTION_REQUEST_PERMISSION
+            = "com.android.cts.permission.action.REQUEST_PERMISSION";
+    private static final String ACTION_PERMISSION_RESULT
+            = "com.android.cts.permission.action.PERMISSION_RESULT";
+    private static final String EXTRA_PERMISSION
+            = "com.android.cts.permission.extra.PERMISSION";
+    private static final String EXTRA_GRANT_STATE
+            = "com.android.cts.permission.extra.GRANT_STATE";
+    private static final int PERMISSION_ERROR = -2;
+    private static final int PERMISSIONS_REQUEST_CODE = 100;
+
+    private String mPermission;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        final Intent received = getIntent();
+        Log.d(TAG, "Started with " + received);
+
+        final String action = received.getAction();
+        mPermission = received.getStringExtra(EXTRA_PERMISSION);
+        if (ACTION_REQUEST_PERMISSION.equals(action)) {
+            Log.d(TAG, "Requesting permission " + mPermission);
+            requestPermissions(new String[] {mPermission}, PERMISSIONS_REQUEST_CODE);
+        } else if (ACTION_CHECK_HAS_PERMISSION.equals(action)) {
+            Log.d(TAG, "Checking permission " + mPermission);
+            sendResultBroadcast(checkSelfPermission(mPermission));
+        } else {
+            Log.w(TAG, "Unknown intent received: " + received);
+            finish();
+        }
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, String[] permissions,
+            int[] grantResults) {
+        if (requestCode != PERMISSIONS_REQUEST_CODE ||
+                permissions.length != 1 ||
+                !permissions[0].equals(mPermission)) {
+            Log.d(TAG, "Received wrong permissions result");
+            sendResultBroadcast(PERMISSION_ERROR);
+        } else {
+            Log.d(TAG, "Received valid permission result: " + grantResults[0]);
+            sendResultBroadcast(grantResults[0]);
+        }
+    }
+
+    private void sendResultBroadcast(int result) {
+        Log.d(TAG, "Sending result broadcast: " + result);
+        Intent broadcast = new Intent(ACTION_PERMISSION_RESULT);
+        broadcast.putExtra(EXTRA_GRANT_STATE, result);
+        sendBroadcast(broadcast);
+        finish();
+    }
+}
diff --git a/build/config.mk b/build/config.mk
index a836f92..56d4ae6 100644
--- a/build/config.mk
+++ b/build/config.mk
@@ -14,7 +14,7 @@
 
 # Test XMLs, native executables, and packages will be placed in this
 # directory before creating the final CTS distribution.
-CTS_TESTCASES_OUT := $(HOST_OUT)/cts-testcases
+CTS_TESTCASES_OUT := $(HOST_OUT)/cts/android-cts/repository/testcases
 
 # Scanners of source files for tests which are then inputed into
 # the XML generator to produce test XMLs.
@@ -34,6 +34,9 @@
 # Holds the target architecture to build for.
 CTS_TARGET_ARCH := $(TARGET_ARCH)
 
+# default module config filename
+CTS_MODULE_TEST_CONFIG := AndroidTest.xml
+
 # CTS build rules
 BUILD_CTS_EXECUTABLE := cts/build/test_executable.mk
 BUILD_CTS_PACKAGE := cts/build/test_package.mk
@@ -42,3 +45,6 @@
 BUILD_CTS_TARGET_JAVA_LIBRARY := cts/build/test_target_java_library.mk
 BUILD_CTS_UI_JAVA_LIBRARY := cts/build/test_uiautomator.mk
 BUILD_CTS_DEQP_PACKAGE := cts/build/test_deqp_package.mk
+BUILD_CTS_SUPPORT_PACKAGE := cts/build/support_package.mk
+BUILD_CTS_MODULE_TEST_CONFIG := cts/build/module_test_config.mk
+BUILD_CTS_DEVICE_INFO_PACKAGE := cts/build/device_info_package.mk
diff --git a/build/device_info_package.mk b/build/device_info_package.mk
new file mode 100644
index 0000000..600f6a1
--- /dev/null
+++ b/build/device_info_package.mk
@@ -0,0 +1,67 @@
+# Copyright (C) 2015 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.
+
+#
+# Builds a package which can be instrumented to retrieve information about the device under test.
+#
+
+DEVICE_INFO_PACKAGE := com.android.compatibility.common.deviceinfo
+DEVICE_INFO_INSTRUMENT := com.android.compatibility.common.deviceinfo.DeviceInfoInstrument
+DEVICE_INFO_PERMISSIONS += android.permission.WRITE_EXTERNAL_STORAGE
+DEVICE_INFO_ACTIVITIES += $(DEVICE_INFO_PACKAGE).GenericDeviceInfo
+
+# Add the base device info
+LOCAL_STATIC_JAVA_LIBRARIES += compatibility-device-info
+
+# Generator of APK manifests.
+MANIFEST_GENERATOR_JAR := $(HOST_OUT_JAVA_LIBRARIES)/compatibility-manifest-generator.jar
+MANIFEST_GENERATOR := java -jar $(MANIFEST_GENERATOR_JAR)
+
+# Generate the manifest
+manifest_xml := $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME))/AndroidManifest.xml
+$(manifest_xml): PRIVATE_INFO_PERMISSIONS := $(foreach permission, $(DEVICE_INFO_PERMISSIONS),-r $(permission))
+$(manifest_xml): PRIVATE_INFO_ACTIVITIES := $(foreach activity,$(DEVICE_INFO_ACTIVITIES),-a $(activity))
+$(manifest_xml): PRIVATE_PACKAGE := $(DEVICE_INFO_PACKAGE)
+$(manifest_xml): PRIVATE_INSTRUMENT := $(DEVICE_INFO_INSTRUMENT)
+
+# Regenerate manifest.xml if the generator jar, */cts-device-info/Android.mk, or this file is changed.
+$(manifest_xml): $(MANIFEST_GENERATOR_JAR) $(LOCAL_PATH)/Android.mk cts/build/device_info_package.mk
+	$(hide) echo Generating manifest for $(PRIVATE_NAME)
+	$(hide) mkdir -p $(dir $@)
+	$(hide) $(MANIFEST_GENERATOR) \
+						$(PRIVATE_INFO_PERMISSIONS) \
+						$(PRIVATE_INFO_ACTIVITIES) \
+						-p $(PRIVATE_PACKAGE) \
+						-i $(PRIVATE_INSTRUMENT) \
+						-o $@
+
+# Reset variables
+DEVICE_INFO_PACKAGE :=
+DEVICE_INFO_INSTRUMENT :=
+DEVICE_INFO_PERMISSIONS :=
+DEVICE_INFO_ACTIVITIES :=
+
+LOCAL_FULL_MANIFEST_FILE := $(manifest_xml)
+# Disable by default
+LOCAL_DEX_PREOPT := false
+LOCAL_PROGUARD_ENABLED := disabled
+
+# Don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# And when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/build/module_test_config.mk b/build/module_test_config.mk
new file mode 100644
index 0000000..6584ef2
--- /dev/null
+++ b/build/module_test_config.mk
@@ -0,0 +1,21 @@
+# Copyright (C) 2015 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.
+
+cts_module_test_config := $(if $(wildcard \
+	$(LOCAL_PATH)/$(CTS_MODULE_TEST_CONFIG)), \
+	$(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).config)
+ifneq ($(cts_module_test_config),)
+$(cts_module_test_config): $(LOCAL_PATH)/$(CTS_MODULE_TEST_CONFIG) | $(ACP)
+	$(call copy-file-to-target)
+endif
diff --git a/build/support_package.mk b/build/support_package.mk
new file mode 100644
index 0000000..16a254e
--- /dev/null
+++ b/build/support_package.mk
@@ -0,0 +1,36 @@
+# Copyright (C) 2015 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.
+
+#
+# Builds a package which is needed by a test package and copies it to CTS
+#
+# Replace "include $(BUILD_PACKAGE)" with "include $(BUILD_CTS_SUPPORT_PACKAGE)"
+#
+
+# Disable by default so "m cts" will work in emulator builds
+LOCAL_DEX_PREOPT := false
+LOCAL_PROGUARD_ENABLED := disabled
+
+include $(BUILD_PACKAGE)
+
+cts_support_apks :=
+$(foreach fp, $(ALL_MODULES.$(LOCAL_PACKAGE_NAME).BUILT_INSTALLED),\
+  $(eval pair := $(subst :,$(space),$(fp)))\
+  $(eval built := $(word 1,$(pair)))\
+  $(eval installed := $(CTS_TESTCASES_OUT)/$(notdir $(word 2,$(pair))))\
+  $(eval $(call copy-one-file, $(built), $(installed)))\
+  $(eval cts_support_apks += $(installed)))
+
+# Have the module name depend on the cts files; so the cts files get generated when you run mm/mmm/mma/mmma.
+$(my_register_name) : $(cts_support_apks)
diff --git a/build/test_deqp_package.mk b/build/test_deqp_package.mk
index b07876d..8fbae26 100644
--- a/build/test_deqp_package.mk
+++ b/build/test_deqp_package.mk
@@ -19,15 +19,14 @@
 CTS_DEQP_CONFIG_PATH := $(call my-dir)
 
 cts_library_xml := $(CTS_TESTCASES_OUT)/com.drawelements.deqp.$(DEQP_API).xml
-
-$(cts_library_xml): MUSTPASS_XML_FILE := external/deqp/android/cts/com.drawelements.deqp.$(DEQP_API).xml
+$(cts_library_xml): MUSTPASS_XML_FILE := external/deqp/android/cts/master/com.drawelements.deqp.$(DEQP_API).xml
 $(cts_library_xml): PRIVATE_TEST_NAME := $(DEQP_TEST_NAME)
 $(cts_library_xml): PRIVATE_TEST_PACKAGE := com.drawelements.deqp.$(DEQP_API)
 $(cts_library_xml): PRIVATE_DUMMY_CASELIST := $(CTS_DEQP_CONFIG_PATH)/deqp_dummy_test_list
-$(cts_library_xml): $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME))/package.apk external/deqp/android/cts/com.drawelements.deqp.$(DEQP_API).xml $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_XML_GENERATOR)
+$(cts_library_xml): external/deqp/android/cts/master/com.drawelements.deqp.$(DEQP_API).xml $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_XML_GENERATOR)
 	$(hide) echo Generating test description for $(PRIVATE_TEST_NAME)
 	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	
+
 # Query build ABIs by routing a dummy test list through xml generator and parse result
 	$(hide) $(eval supported_abi_attr := $(shell $(CTS_XML_GENERATOR) -t dummyTest \
 										-n dummyName \
@@ -37,8 +36,8 @@
 										-a $(CTS_TARGET_ARCH) \
 										< $(PRIVATE_DUMMY_CASELIST) \
 										| grep --only-matching -e " abis=\"[^\"]*\""))
-	
+
 # Patch xml caselist with supported abi
-	$(hide) $(SED_EXTENDED) -e 's:^<Test (.*)/>$$:<Test \1 $(supported_abi_attr) />:' \
+	$(hide) $(SED_EXTENDED) -e 's:^(\s*)<Test ((.[^/]|[^/])*)(/?)>$$:\1<Test \2 $(supported_abi_attr)\4>:' \
 				< $(MUSTPASS_XML_FILE) \
 				> $@
diff --git a/build/test_executable.mk b/build/test_executable.mk
index 3cabdf3..979f59e 100644
--- a/build/test_executable.mk
+++ b/build/test_executable.mk
@@ -25,14 +25,22 @@
 
 LOCAL_CXX_STL := libc++
 include $(BUILD_EXECUTABLE)
+include $(BUILD_CTS_MODULE_TEST_CONFIG)
+
+cts_executable_bin :=
+$(foreach fp, $(ALL_MODULES.$(LOCAL_MODULE).BUILT) $(ALL_MODULES.$(LOCAL_MODULE)$(TARGET_2ND_ARCH_MODULE_SUFFIX).BUILT),\
+  $(eval installed := $(CTS_TESTCASES_OUT)/$(notdir $(fp)))\
+  $(eval $(call copy-one-file, $(fp), $(installed)))\
+  $(eval cts_executable_bin += $(installed)))
 
 cts_executable_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).xml
-
 $(cts_executable_xml): PRIVATE_TEST_PACKAGE := $(LOCAL_CTS_TEST_PACKAGE)
 $(cts_executable_xml): PRIVATE_EXECUTABLE := $(LOCAL_MODULE)
 $(cts_executable_xml): PRIVATE_LIST_EXECUTABLE := $(HOST_OUT_EXECUTABLES)/$(LOCAL_MODULE)_list
 $(cts_executable_xml): $(HOST_OUT_EXECUTABLES)/$(LOCAL_MODULE)_list
-$(cts_executable_xml): $(addprefix $(LOCAL_PATH)/,$(LOCAL_SRC_FILES)) $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_NATIVE_TEST_SCANNER) $(CTS_XML_GENERATOR) $(cts_list_executable)
+$(cts_executable_xml): $(cts_executable_bin)
+$(cts_executable_xml): $(cts_module_test_config)
+$(cts_executable_xml): $(addprefix $(LOCAL_PATH)/,$(LOCAL_SRC_FILES)) $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_NATIVE_TEST_SCANNER) $(CTS_XML_GENERATOR)
 	$(hide) echo Generating test description for native package $(PRIVATE_TEST_PACKAGE)
 	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
 	$(hide) $(PRIVATE_LIST_EXECUTABLE) --gtest_list_tests | \
@@ -46,4 +54,4 @@
 						-o $@
 
 # Have the module name depend on the cts files; so the cts files get generated when you run mm/mmm/mma/mmma.
-$(my_register_name) : $(cts_executable_xml)
+$(my_register_name) : $(cts_executable_bin) $(cts_executable_xml) $(cts_module_test_config)
diff --git a/build/test_gtest_package.mk b/build/test_gtest_package.mk
index dd1269b..6f71830 100644
--- a/build/test_gtest_package.mk
+++ b/build/test_gtest_package.mk
@@ -23,23 +23,19 @@
 LOCAL_DEX_PREOPT := false
 LOCAL_PROGUARD_ENABLED := disabled
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
+include $(BUILD_CTS_MODULE_TEST_CONFIG)
 
-cts_package_apk := $(CTS_TESTCASES_OUT)/$(LOCAL_PACKAGE_NAME).apk
 cts_package_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_PACKAGE_NAME).xml
-cts_test_list := $(LOCAL_PATH)/$(LOCAL_MODULE)_list.txt
-
-$(cts_package_apk): PRIVATE_PACKAGE := $(LOCAL_PACKAGE_NAME)
-$(cts_package_apk): $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME))/package.apk | $(ACP)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(hide) $(ACP) -fp $(call intermediates-dir-for,APPS,$(PRIVATE_PACKAGE))/package.apk $@
-
 $(cts_package_xml): PRIVATE_PATH := $(LOCAL_PATH)
 $(cts_package_xml): PRIVATE_TEST_PACKAGE := android.$(notdir $(LOCAL_PATH))
 $(cts_package_xml): PRIVATE_EXECUTABLE := $(LOCAL_MODULE)
 $(cts_package_xml): PRIVATE_MANIFEST := $(LOCAL_PATH)/AndroidManifest.xml
-$(cts_package_xml): PRIVATE_TEST_LIST := $(cts_test_list)
-$(cts_package_xml): $(addprefix $(LOCAL_PATH)/,$(LOCAL_SRC_FILES))  $(CTS_NATIVE_TEST_SCANNER) $(CTS_XML_GENERATOR) $(cts_test_list)
+$(cts_package_xml): PRIVATE_TEST_LIST := $(LOCAL_PATH)/$(LOCAL_MODULE)_list.txt
+$(cts_package_xml): $(LOCAL_PATH)/$(LOCAL_MODULE)_list.txt
+$(cts_package_xml): $(cts_support_apks)
+$(cts_package_xml): $(cts_module_test_config)
+$(cts_package_xml): $(addprefix $(LOCAL_PATH)/,$(LOCAL_SRC_FILES))  $(CTS_NATIVE_TEST_SCANNER) $(CTS_XML_GENERATOR)
 	$(hide) echo Generating test description for wrapped native package $(PRIVATE_EXECUTABLE)
 	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
 	$(hide) cat $(PRIVATE_TEST_LIST) | \
@@ -54,4 +50,4 @@
 						-o $@
 
 # Have the module name depend on the cts files; so the cts files get generated when you run mm/mmm/mma/mmma.
-$(my_register_name) : $(cts_package_apk) $(cts_package_xml)
+$(my_register_name) : $(cts_package_xml) $(cts_module_test_config)
diff --git a/build/test_host_java_library.mk b/build/test_host_java_library.mk
index 8ed5670..7fdefb5 100644
--- a/build/test_host_java_library.mk
+++ b/build/test_host_java_library.mk
@@ -18,18 +18,24 @@
 #
 
 include $(BUILD_HOST_JAVA_LIBRARY)
+include $(BUILD_CTS_MODULE_TEST_CONFIG)
 
-cts_library_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).xml
+cts_library_jar := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).jar
+$(cts_library_jar): $(LOCAL_BUILT_MODULE)
+	$(copy-file-to-target)
 
 cts_src_dirs := $(LOCAL_PATH)/src
 cts_src_dirs += $(sort $(dir $(LOCAL_GENERATED_SOURCES)))
 cts_src_dirs := $(addprefix -s , $(cts_src_dirs))
 
+cts_library_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).xml
 $(cts_library_xml): PRIVATE_SRC_DIRS := $(cts_src_dirs)
 $(cts_library_xml): PRIVATE_TEST_PACKAGE := $(LOCAL_CTS_TEST_PACKAGE)
 $(cts_library_xml): PRIVATE_LIBRARY := $(LOCAL_MODULE)
 $(cts_library_xml): PRIVATE_JAR_PATH := $(LOCAL_MODULE).jar
-$(cts_library_xml): $(HOST_OUT_JAVA_LIBRARIES)/$(LOCAL_MODULE).jar $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_JAVA_TEST_SCANNER_DOCLET) $(CTS_JAVA_TEST_SCANNER) $(CTS_XML_GENERATOR)
+$(cts_library_xml): $(cts_library_jar)
+$(cts_library_xml): $(cts_module_test_config)
+$(cts_library_xml): $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_JAVA_TEST_SCANNER_DOCLET) $(CTS_JAVA_TEST_SCANNER) $(CTS_XML_GENERATOR)
 	$(hide) echo Generating test description for host library $(PRIVATE_LIBRARY)
 	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
 	$(hide) $(CTS_JAVA_TEST_SCANNER) $(PRIVATE_SRC_DIRS) \
@@ -44,4 +50,4 @@
 						-o $@
 
 # Have the module name depend on the cts files; so the cts files get generated when you run mm/mmm/mma/mmma.
-$(my_register_name) : $(cts_library_xml)
+$(my_register_name) : $(cts_library_jar) $(cts_library_xml) $(cts_module_test_config)
diff --git a/build/test_package.mk b/build/test_package.mk
index 7589787..c6b0865 100644
--- a/build/test_package.mk
+++ b/build/test_package.mk
@@ -23,20 +23,14 @@
 LOCAL_DEX_PREOPT := false
 LOCAL_PROGUARD_ENABLED := disabled
 
-include $(BUILD_PACKAGE)
-
-cts_package_apk := $(CTS_TESTCASES_OUT)/$(LOCAL_PACKAGE_NAME).apk
-cts_package_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_PACKAGE_NAME).xml
+include $(BUILD_CTS_SUPPORT_PACKAGE)
+include $(BUILD_CTS_MODULE_TEST_CONFIG)
 
 cts_src_dirs := $(LOCAL_PATH)
 cts_src_dirs += $(sort $(dir $(LOCAL_GENERATED_SOURCES)))
 cts_src_dirs := $(addprefix -s , $(cts_src_dirs))
 
-$(cts_package_apk): PRIVATE_PACKAGE := $(LOCAL_PACKAGE_NAME)
-$(cts_package_apk): $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME))/package.apk | $(ACP)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(hide) $(ACP) -fp $(call intermediates-dir-for,APPS,$(PRIVATE_PACKAGE))/package.apk $@
-
+cts_package_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_PACKAGE_NAME).xml
 $(cts_package_xml): PRIVATE_SRC_DIRS := $(cts_src_dirs)
 $(cts_package_xml): PRIVATE_INSTRUMENTATION := $(LOCAL_INSTRUMENTATION_FOR)
 $(cts_package_xml): PRIVATE_PACKAGE := $(LOCAL_PACKAGE_NAME)
@@ -48,7 +42,9 @@
 $(cts_package_xml): PRIVATE_TEST_PACKAGE := $(PRIVATE_CTS_TEST_PACKAGE_NAME_)
 $(cts_package_xml): PRIVATE_MANIFEST := $(LOCAL_PATH)/AndroidManifest.xml
 $(cts_package_xml): PRIVATE_TEST_TYPE := $(if $(LOCAL_CTS_TEST_RUNNER),$(LOCAL_CTS_TEST_RUNNER),'')
-$(cts_package_xml): $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME))/package.apk $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_JAVA_TEST_SCANNER_DOCLET) $(CTS_JAVA_TEST_SCANNER) $(CTS_XML_GENERATOR)
+$(cts_package_xml): $(cts_support_apks)
+$(cts_package_xml): $(cts_module_test_config)
+$(cts_package_xml): $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_JAVA_TEST_SCANNER_DOCLET) $(CTS_JAVA_TEST_SCANNER) $(CTS_XML_GENERATOR)
 	$(hide) echo Generating test description for java package $(PRIVATE_PACKAGE)
 	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
 	$(hide) $(CTS_JAVA_TEST_SCANNER) \
@@ -64,6 +60,5 @@
 						-b $(CTS_UNSUPPORTED_ABIS) \
 						-a $(CTS_TARGET_ARCH) \
 						-o $@
-
 # Have the module name depend on the cts files; so the cts files get generated when you run mm/mmm/mma/mmma.
-$(my_register_name) : $(cts_package_apk) $(cts_package_xml)
+$(my_register_name) : $(cts_package_xml) $(cts_module_test_config)
diff --git a/build/test_target_java_library.mk b/build/test_target_java_library.mk
index 04fffb9..fe1000a 100644
--- a/build/test_target_java_library.mk
+++ b/build/test_target_java_library.mk
@@ -19,8 +19,10 @@
 # Disable by default so "m cts" will work in emulator builds
 LOCAL_DEX_PREOPT := false
 include $(BUILD_JAVA_LIBRARY)
+include $(BUILD_CTS_MODULE_TEST_CONFIG)
+
 cts_library_jar := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).jar
-$(cts_library_jar): $(LOCAL_BUILT_MODULE) | $(ACP)
+$(cts_library_jar): $(LOCAL_BUILT_MODULE)
 	$(copy-file-to-target)
 
 cts_library_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).xml
@@ -30,7 +32,9 @@
 $(cts_library_xml): PRIVATE_LIBRARY := $(LOCAL_MODULE)
 $(cts_library_xml): PRIVATE_JAR_PATH := $(LOCAL_MODULE).jar
 $(cts_library_xml): PRIVATE_RUNTIME_ARGS := $(LOCAL_CTS_TARGET_RUNTIME_ARGS)
-$(cts_library_xml): $(TARGET_OUT_JAVA_LIBRARIES)/$(LOCAL_MODULE).jar $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_JAVA_TEST_SCANNER_DOCLET) $(CTS_JAVA_TEST_SCANNER) $(CTS_XML_GENERATOR)
+$(cts_library_xml): $(cts_library_jar)
+$(cts_library_xml): $(cts_module_test_config)
+$(cts_library_xml): $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_JAVA_TEST_SCANNER_DOCLET) $(CTS_JAVA_TEST_SCANNER) $(CTS_XML_GENERATOR)
 	$(hide) echo Generating test description for target library $(PRIVATE_LIBRARY)
 	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
 	$(hide) $(CTS_JAVA_TEST_SCANNER) -s $(PRIVATE_PATH) \
@@ -46,4 +50,4 @@
 						-o $@
 
 # Have the module name depend on the cts files; so the cts files get generated when you run mm/mmm/mma/mmma.
-$(my_register_name) : $(cts_library_jar) $(cts_library_xml)
+$(my_register_name) : $(cts_library_jar) $(cts_library_xml $(cts_module_test_config))
diff --git a/build/test_uiautomator.mk b/build/test_uiautomator.mk
index cad6e4f..a191d72 100644
--- a/build/test_uiautomator.mk
+++ b/build/test_uiautomator.mk
@@ -20,26 +20,26 @@
 LOCAL_DEX_PREOPT := false
 
 include $(BUILD_JAVA_LIBRARY)
+include $(BUILD_CTS_MODULE_TEST_CONFIG)
 
-cts_library_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).xml 
 cts_library_jar := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).jar
+$(cts_library_jar): $(LOCAL_BUILT_MODULE)
+	$(call copy-file-to-target)
 
 cts_src_dirs := $(LOCAL_PATH)/src
 cts_src_dirs += $(sort $(dir $(LOCAL_GENERATED_SOURCES)))
 cts_src_dirs := $(addprefix -s , $(cts_src_dirs))
 
-$(cts_library_jar): PRIVATE_MODULE := $(LOCAL_MODULE)
-$(cts_library_jar): $(call intermediates-dir-for,JAVA_LIBRARIES,$(LOCAL_MODULE))/javalib.jar | $(ACP)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(hide) $(ACP) -fp $(call intermediates-dir-for,JAVA_LIBRARIES,$(PRIVATE_MODULE))/javalib.jar $@
-
+cts_library_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).xml
 $(cts_library_xml): PRIVATE_SRC_DIRS := $(cts_src_dirs)
 $(cts_library_xml): PRIVATE_TEST_APP_PACKAGE := $(LOCAL_CTS_TEST_APP_PACKAGE)
 $(cts_library_xml): PRIVATE_TEST_PACKAGE := $(LOCAL_CTS_TEST_PACKAGE)
 $(cts_library_xml): PRIVATE_TEST_APK := $(LOCAL_CTS_TEST_APK)
 $(cts_library_xml): PRIVATE_LIBRARY := $(LOCAL_MODULE)
 $(cts_library_xml): PRIVATE_JAR_PATH := $(LOCAL_MODULE).jar
-$(cts_library_xml): $(call intermediates-dir-for,JAVA_LIBRARIES,$(LOCAL_MODULE))/javalib.jar $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_JAVA_TEST_SCANNER_DOCLET) $(CTS_JAVA_TEST_SCANNER) $(CTS_XML_GENERATOR)
+$(cts_library_xml): $(cts_library_jar)
+$(cts_library_xml): $(cts_module_test_config)
+$(cts_library_xml): $(CTS_EXPECTATIONS) $(CTS_UNSUPPORTED_ABIS) $(CTS_JAVA_TEST_SCANNER_DOCLET) $(CTS_JAVA_TEST_SCANNER) $(CTS_XML_GENERATOR)
 	$(hide) echo Generating test description for uiautomator library $(PRIVATE_LIBRARY)
 	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
 	$(hide) $(CTS_JAVA_TEST_SCANNER) $(PRIVATE_SRC_DIRS) \
@@ -57,4 +57,4 @@
 						-o $@
 
 # Have the module name depend on the cts files; so the cts files get generated when you run mm/mmm/mma/mmma.
-$(my_register_name) : $(cts_library_jar) $(cts_library_xml)
+$(my_register_name) : $(cts_library_jar) $(cts_library_xml) $(cts_module_test_config)
diff --git a/common/device-side/device-info/Android.mk b/common/device-side/device-info/Android.mk
new file mode 100644
index 0000000..8c5052b
--- /dev/null
+++ b/common/device-side/device-info/Android.mk
@@ -0,0 +1,29 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE := compatibility-device-info
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/DeviceInfoActivity.java b/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/DeviceInfoActivity.java
new file mode 100644
index 0000000..f9de6eb
--- /dev/null
+++ b/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/DeviceInfoActivity.java
@@ -0,0 +1,450 @@
+/*
+ * Copyright (C) 2015 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 com.android.compatibility.common.deviceinfo;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Environment;
+import android.text.TextUtils;
+import android.util.JsonWriter;
+import android.util.Log;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStreamWriter;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.concurrent.CountDownLatch;
+
+/**
+ * Collect device information on target device and write to a JSON file.
+ */
+public abstract class DeviceInfoActivity extends Activity {
+
+    /** Device info result code: collector failed to complete. */
+    private static final int DEVICE_INFO_RESULT_FAILED = -2;
+    /** Device info result code: collector completed with error. */
+    private static final int DEVICE_INFO_RESULT_ERROR = -1;
+    /** Device info result code: collector has started but not completed. */
+    private static final int DEVICE_INFO_RESULT_STARTED = 0;
+    /** Device info result code: collector completed success. */
+    private static final int DEVICE_INFO_RESULT_OK = 1;
+
+    private static final int MAX_STRING_VALUE_LENGTH = 1000;
+    private static final int MAX_ARRAY_LENGTH = 1000;
+
+    private static final String LOG_TAG = "DeviceInfoActivity";
+
+    private CountDownLatch mDone = new CountDownLatch(1);
+    private JsonWriter mJsonWriter = null;
+    private String mResultFilePath = null;
+    private String mErrorMessage = "Collector has started.";
+    private int mResultCode = DEVICE_INFO_RESULT_STARTED;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        if (createFilePath()) {
+            createJsonWriter();
+            startJsonWriter();
+            collectDeviceInfo();
+            closeJsonWriter();
+
+            if (mResultCode == DEVICE_INFO_RESULT_STARTED) {
+                mResultCode = DEVICE_INFO_RESULT_OK;
+            }
+        }
+
+        Intent data = new Intent();
+        if (mResultCode == DEVICE_INFO_RESULT_OK) {
+            data.setData(Uri.parse(mResultFilePath));
+            setResult(RESULT_OK, data);
+        } else {
+            data.setData(Uri.parse(mErrorMessage));
+            setResult(RESULT_CANCELED, data);
+        }
+
+        mDone.countDown();
+        finish();
+    }
+
+    /**
+     * Method to collect device information.
+     */
+    protected abstract void collectDeviceInfo();
+
+    void waitForActivityToFinish() {
+        try {
+            mDone.await();
+        } catch (Exception e) {
+            failed("Exception while waiting for activity to finish: " + e.getMessage());
+        }
+    }
+
+    /**
+     * Returns the error message if collector did not complete successfully.
+     */
+    String getErrorMessage() {
+        if (mResultCode == DEVICE_INFO_RESULT_OK) {
+            return null;
+        }
+        return mErrorMessage;
+    }
+
+    /**
+     * Returns the path to the json file if collector completed successfully.
+     */
+    String getResultFilePath() {
+        if (mResultCode == DEVICE_INFO_RESULT_OK) {
+            return mResultFilePath;
+        }
+        return null;
+    }
+
+    private void error(String message) {
+        mResultCode = DEVICE_INFO_RESULT_ERROR;
+        mErrorMessage = message;
+        Log.e(LOG_TAG, message);
+    }
+
+    private void failed(String message) {
+        mResultCode = DEVICE_INFO_RESULT_FAILED;
+        mErrorMessage = message;
+        Log.e(LOG_TAG, message);
+    }
+
+    private boolean createFilePath() {
+        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
+            failed("External storage is not mounted");
+            return false;
+        }
+        final File dir = new File(Environment.getExternalStorageDirectory(), "device-info-files");
+        if (!dir.mkdirs() && !dir.isDirectory()) {
+            failed("Cannot create directory for device info files");
+            return false;
+        }
+
+        // Create file at /sdcard/device-info-files/<class_name>.deviceinfo.json
+        final File jsonFile = new File(dir, getClass().getSimpleName() + ".deviceinfo.json");
+        try {
+            jsonFile.createNewFile();
+        } catch (Exception e) {
+            failed("Cannot create file to collect device info");
+            return false;
+        }
+        mResultFilePath = jsonFile.getAbsolutePath();
+        return true;
+    }
+
+    private void createJsonWriter() {
+        try {
+            FileOutputStream out = new FileOutputStream(mResultFilePath);
+            mJsonWriter = new JsonWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8));
+            // TODO(agathaman): remove to make json output less pretty
+            mJsonWriter.setIndent("  ");
+        } catch (Exception e) {
+            failed("Failed to create JSON writer: " + e.getMessage());
+        }
+    }
+
+    private void startJsonWriter() {
+        try {
+            mJsonWriter.beginObject();
+        } catch (Exception e) {
+            failed("Failed to begin JSON object: " + e.getMessage());
+        }
+    }
+
+    private void closeJsonWriter() {
+        try {
+            mJsonWriter.endObject();
+            mJsonWriter.close();
+        } catch (Exception e) {
+            failed("Failed to close JSON object: " + e.getMessage());
+        }
+    }
+
+    /**
+     * Start a new group of result.
+     */
+    public void startGroup() {
+        try {
+            mJsonWriter.beginObject();
+        } catch (Exception e) {
+            error("Failed to begin JSON group: " + e.getMessage());
+        }
+    }
+
+    /**
+     * Start a new group of result with specified name.
+     */
+    public void startGroup(String name) {
+        try {
+            mJsonWriter.name(name);
+            mJsonWriter.beginObject();
+        } catch (Exception e) {
+            error("Failed to begin JSON group: " + e.getMessage());
+        }
+    }
+
+    /**
+     * Complete adding result to the last started group.
+     */
+    public void endGroup() {
+        try {
+            mJsonWriter.endObject();
+        } catch (Exception e) {
+            error("Failed to end JSON group: " + e.getMessage());
+        }
+    }
+
+    /**
+     * Start a new array of result.
+     */
+    public void startArray() {
+        try {
+            mJsonWriter.beginArray();
+        } catch (Exception e) {
+            error("Failed to begin JSON array: " + e.getMessage());
+        }
+    }
+
+    /**
+     * Start a new array of result with specified name.
+     */
+    public void startArray(String name) {
+        checkName(name);
+        try {
+            mJsonWriter.name(name);
+            mJsonWriter.beginArray();
+        } catch (Exception e) {
+            error("Failed to begin JSON array: " + e.getMessage());
+        }
+    }
+
+    /**
+     * Complete adding result to the last started array.
+     */
+    public void endArray() {
+        try {
+            mJsonWriter.endArray();
+        } catch (Exception e) {
+            error("Failed to end JSON group: " + e.getMessage());
+        }
+    }
+
+    /**
+     * Add a double value result.
+     */
+    public void addResult(String name, double value) {
+        checkName(name);
+        try {
+            mJsonWriter.name(name).value(value);
+        } catch (Exception e) {
+            error("Failed to add result for type double: " + e.getMessage());
+        }
+    }
+
+    /**
+    * Add a long value result.
+    */
+    public void addResult(String name, long value) {
+        checkName(name);
+        try {
+            mJsonWriter.name(name).value(value);
+        } catch (Exception e) {
+            error("Failed to add result for type long: " + e.getMessage());
+        }
+    }
+
+    /**
+     * Add an int value result.
+     */
+    public void addResult(String name, int value) {
+        checkName(name);
+        try {
+            mJsonWriter.name(name).value((Number) value);
+        } catch (Exception e) {
+            error("Failed to add result for type int: " + e.getMessage());
+        }
+    }
+
+    /**
+     * Add a boolean value result.
+     */
+    public void addResult(String name, boolean value) {
+        checkName(name);
+        try {
+            mJsonWriter.name(name).value(value);
+        } catch (Exception e) {
+            error("Failed to add result for type boolean: " + e.getMessage());
+        }
+    }
+
+    /**
+     * Add a String value result.
+     */
+    public void addResult(String name, String value) {
+        checkName(name);
+        try {
+            mJsonWriter.name(name).value(checkString(value));
+        } catch (Exception e) {
+            error("Failed to add result for type String: " + e.getMessage());
+        }
+    }
+
+    /**
+     * Add a double array result.
+     */
+    public void addArray(String name, double[] list) {
+        checkName(name);
+        try {
+            mJsonWriter.name(name);
+            mJsonWriter.beginArray();
+            for (double value : checkArray(list)) {
+                mJsonWriter.value(value);
+            }
+            mJsonWriter.endArray();
+        } catch (Exception e) {
+            error("Failed to add result array for type double: " + e.getMessage());
+        }
+    }
+
+    /**
+     * Add a long array result.
+     */
+    public void addArray(String name, long[] list) {
+        checkName(name);
+        try {
+        mJsonWriter.name(name);
+        mJsonWriter.beginArray();
+        for (long value : checkArray(list)) {
+            mJsonWriter.value(value);
+        }
+            mJsonWriter.endArray();
+        } catch (Exception e) {
+            error("Failed to add result array for type long: " + e.getMessage());
+        }
+    }
+
+    /**
+     * Add an int array result.
+     */
+    public void addArray(String name, int[] list) {
+        checkName(name);
+        try {
+            mJsonWriter.name(name);
+            mJsonWriter.beginArray();
+            for (int value : checkArray(list)) {
+                mJsonWriter.value((Number) value);
+            }
+            mJsonWriter.endArray();
+        } catch (Exception e) {
+            error("Failed to add result array for type int: " + e.getMessage());
+        }
+    }
+
+    /**
+     * Add a boolean array result.
+     */
+    public void addArray(String name, boolean[] list) {
+        checkName(name);
+        try {
+            mJsonWriter.name(name);
+            mJsonWriter.beginArray();
+            for (boolean value : checkArray(list)) {
+                mJsonWriter.value(value);
+            }
+            mJsonWriter.endArray();
+        } catch (Exception e) {
+            error("Failed to add result array for type boolean: " + e.getMessage());
+        }
+    }
+
+    /**
+     * Add a String array result.
+     */
+    public void addArray(String name, String[] list) {
+        checkName(name);
+        try {
+            mJsonWriter.name(name);
+            mJsonWriter.beginArray();
+            for (String value : checkArray(list)) {
+                mJsonWriter.value(checkString(value));
+            }
+            mJsonWriter.endArray();
+        } catch (Exception e) {
+            error("Failed to add result array for type Sting: " + e.getMessage());
+        }
+    }
+
+    private static boolean[] checkArray(boolean[] values) {
+        if (values.length > MAX_ARRAY_LENGTH) {
+            return Arrays.copyOf(values, MAX_ARRAY_LENGTH);
+        } else {
+            return values;
+        }
+    }
+
+    private static double[] checkArray(double[] values) {
+        if (values.length > MAX_ARRAY_LENGTH) {
+            return Arrays.copyOf(values, MAX_ARRAY_LENGTH);
+        } else {
+            return values;
+        }
+    }
+
+    private static int[] checkArray(int[] values) {
+        if (values.length > MAX_ARRAY_LENGTH) {
+            return Arrays.copyOf(values, MAX_ARRAY_LENGTH);
+        } else {
+            return values;
+        }
+    }
+
+    private static long[] checkArray(long[] values) {
+        if (values.length > MAX_ARRAY_LENGTH) {
+            return Arrays.copyOf(values, MAX_ARRAY_LENGTH);
+        } else {
+            return values;
+        }
+    }
+
+    private static String[] checkArray(String[] values) {
+        if (values.length > MAX_ARRAY_LENGTH) {
+            return Arrays.copyOf(values, MAX_ARRAY_LENGTH);
+        } else {
+            return values;
+        }
+    }
+
+    private static String checkString(String value) {
+        if (value.length() > MAX_STRING_VALUE_LENGTH) {
+            return value.substring(0, MAX_STRING_VALUE_LENGTH);
+        }
+        return value;
+    }
+
+    private static String checkName(String value) {
+        if (TextUtils.isEmpty(value)) {
+            throw new NullPointerException();
+        }
+        return value;
+    }
+}
+
diff --git a/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/DeviceInfoInstrument.java b/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/DeviceInfoInstrument.java
new file mode 100644
index 0000000..f3af0bc
--- /dev/null
+++ b/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/DeviceInfoInstrument.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2015 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 com.android.compatibility.common.deviceinfo;
+
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+
+/**
+ * An instrumentation that runs all activities that extends DeviceInfoActivity.
+ */
+public class DeviceInfoInstrument extends Instrumentation {
+
+    private static final String LOG_TAG = "ExtendedDeviceInfo";
+    private static final int DEVICE_INFO_ACTIVITY_REQUEST = 1;
+
+    private Bundle mBundle = new Bundle();
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        start();
+    }
+
+    @Override
+    public void onStart() {
+        try {
+            Context context = getContext();
+            ActivityInfo[] activities = context.getPackageManager().getPackageInfo(
+                    context.getPackageName(), PackageManager.GET_ACTIVITIES).activities;
+
+            for (ActivityInfo activityInfo : activities) {
+                Class cls = Class.forName(activityInfo.name);
+                if (cls != DeviceInfoActivity.class &&
+                        DeviceInfoActivity.class.isAssignableFrom(cls)) {
+                    runActivity(activityInfo.name);
+                }
+            }
+        } catch (Exception e) {
+            Log.e(LOG_TAG, "Exception occurred while running activities.", e);
+            // Returns INSTRUMENTATION_CODE: 0
+            finish(Activity.RESULT_CANCELED, mBundle);
+        }
+        // Returns INSTRUMENTATION_CODE: -1
+        finish(Activity.RESULT_OK, mBundle);
+    }
+
+    /**
+     * Runs a device info activity and return the file path where the results are written to.
+     */
+    private void runActivity(String activityName) throws Exception {
+        Intent intent = new Intent();
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        intent.setClassName(this.getContext(), activityName);
+
+        DeviceInfoActivity activity = (DeviceInfoActivity) startActivitySync(intent);
+        waitForIdleSync();
+        activity.waitForActivityToFinish();
+
+        String className = Class.forName(activityName).getSimpleName();
+        String errorMessage = activity.getErrorMessage();
+        if (TextUtils.isEmpty(errorMessage)) {
+            mBundle.putString(className, activity.getResultFilePath());
+        } else {
+            mBundle.putString(className, errorMessage);
+            throw new Exception(errorMessage);
+        }
+    }
+}
+
diff --git a/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/GenericDeviceInfo.java b/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/GenericDeviceInfo.java
new file mode 100644
index 0000000..f6e7c57
--- /dev/null
+++ b/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/GenericDeviceInfo.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2015 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 com.android.compatibility.common.deviceinfo;
+
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.FeatureInfo;
+import android.content.pm.PackageManager;
+import android.content.res.Configuration;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.UserManager;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.Display;
+import android.view.WindowManager;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Scanner;
+import java.util.Set;
+
+import com.android.compatibility.common.deviceinfo.DeviceInfoActivity;
+
+/**
+ * Generic device info collector.
+ */
+public class GenericDeviceInfo extends DeviceInfoActivity {
+
+    public static final String BUILD_ID = "build_id";
+    public static final String BUILD_PRODUCT = "build_product";
+    public static final String BUILD_DEVICE = "build_device";
+    public static final String BUILD_BOARD = "build_board";
+    public static final String BUILD_MANUFACTURER = "build_manufacturer";
+    public static final String BUILD_BRAND = "build_brand";
+    public static final String BUILD_MODEL = "build_model";
+    public static final String BUILD_TYPE = "build_type";
+    public static final String BUILD_FINGERPRINT = "build_fingerprint";
+    public static final String BUILD_ABI = "build_abi";
+    public static final String BUILD_ABI2 = "build_abi2";
+    public static final String BUILD_ABIS = "build_abis";
+    public static final String BUILD_ABIS_32 = "build_abis_32";
+    public static final String BUILD_ABIS_64 = "build_abis_64";
+    public static final String BUILD_SERIAL = "build_serial";
+    public static final String BUILD_VERSION_RELEASE = "build_version_release";
+    public static final String BUILD_VERSION_SDK = "build_version_sdk";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+
+    @Override
+    protected void collectDeviceInfo() {
+        addResult(BUILD_ID, Build.ID);
+        addResult(BUILD_PRODUCT, Build.PRODUCT);
+        addResult(BUILD_DEVICE, Build.DEVICE);
+        addResult(BUILD_BOARD, Build.BOARD);
+        addResult(BUILD_MANUFACTURER, Build.MANUFACTURER);
+        addResult(BUILD_BRAND, Build.BRAND);
+        addResult(BUILD_MODEL, Build.MODEL);
+        addResult(BUILD_TYPE, Build.TYPE);
+        addResult(BUILD_FINGERPRINT, Build.FINGERPRINT);
+        addResult(BUILD_ABI, Build.CPU_ABI);
+        addResult(BUILD_ABI2, Build.CPU_ABI2);
+        addResult(BUILD_ABIS, TextUtils.join(",", Build.SUPPORTED_ABIS));
+        addResult(BUILD_ABIS_32, TextUtils.join(",", Build.SUPPORTED_32_BIT_ABIS));
+        addResult(BUILD_ABIS_64, TextUtils.join(",", Build.SUPPORTED_64_BIT_ABIS));
+        addResult(BUILD_SERIAL, Build.SERIAL);
+        addResult(BUILD_VERSION_RELEASE, Build.VERSION.RELEASE);
+        addResult(BUILD_VERSION_SDK, Build.VERSION.SDK);
+    }
+}
\ No newline at end of file
diff --git a/common/device-side/device-info/tests/Android.mk b/common/device-side/device-info/tests/Android.mk
new file mode 100644
index 0000000..e24c5c1
--- /dev/null
+++ b/common/device-side/device-info/tests/Android.mk
@@ -0,0 +1,30 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_STATIC_JAVA_LIBRARIES := compatibility-device-info
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE := compatibility-device-info-tests
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
diff --git a/common/device-side/device-info/tests/src/com/android/compatibility/common/deviceinfo/DeviceInfoActivityTest.java b/common/device-side/device-info/tests/src/com/android/compatibility/common/deviceinfo/DeviceInfoActivityTest.java
new file mode 100644
index 0000000..d092f4e
--- /dev/null
+++ b/common/device-side/device-info/tests/src/com/android/compatibility/common/deviceinfo/DeviceInfoActivityTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2015 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 com.android.compatibility.common.deviceinfo;
+
+import android.test.ActivityInstrumentationTestCase2;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+/**
+ * Test for {@link DeviceInfoActivity}.
+ */
+public class DeviceInfoActivityTest extends ActivityInstrumentationTestCase2<TestDeviceInfo> {
+
+    private static final String EXPECTED_FILE_PATH =
+            "/storage/emulated/0/device-info-files/TestDeviceInfo.deviceinfo.json";
+
+    private TestDeviceInfo mActivity;
+
+    public DeviceInfoActivityTest() {
+        super(TestDeviceInfo.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        // Start the activity and get a reference to it.
+        mActivity = getActivity();
+        // Wait for the activity to finish.
+        mActivity.waitForActivityToFinish();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mActivity = null;
+        super.tearDown();
+    }
+
+    public void testJsonFile() throws IOException {
+        String resultFilePath = mActivity.getResultFilePath();
+        // Check file path exist
+        assertNotNull("Expected a non-null resultFilePath", resultFilePath);
+        // Check file path location
+        assertEquals("Incorrect file path", EXPECTED_FILE_PATH, resultFilePath);
+        // Check json file content
+        String jsonContent = readFile(resultFilePath);
+        assertEquals("Incorrect json output", ExampleObjects.testDeviceInfoJson(), jsonContent);
+    }
+
+    private String readFile(String filePath) throws IOException {
+        InputStreamReader inputStreamReader = new InputStreamReader(
+                new FileInputStream(filePath), "UTF-8");
+        StringBuilder stringBuilder = new StringBuilder();
+        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
+        String line;
+        while((line = bufferedReader.readLine()) != null) {
+            stringBuilder.append(line);
+            stringBuilder.append('\n');
+        }
+        bufferedReader.close();
+        return stringBuilder.toString();
+    }
+}
+
diff --git a/common/device-side/device-info/tests/src/com/android/compatibility/common/deviceinfo/ExampleObjects.java b/common/device-side/device-info/tests/src/com/android/compatibility/common/deviceinfo/ExampleObjects.java
new file mode 100644
index 0000000..570bdd5
--- /dev/null
+++ b/common/device-side/device-info/tests/src/com/android/compatibility/common/deviceinfo/ExampleObjects.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2015 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 com.android.compatibility.common.deviceinfo;
+
+/**
+ * Example Objects for {@link DeviceInfoActivity} test package.
+ */
+public final class ExampleObjects {
+
+    // Must match DeviceInfoActivity.MAX_STRING_VALUE_LENGTH and
+    // DeviceInfoActivity.MAX_ARRAY_LENGTH
+    private static final int MAX_LENGTH = 1000;
+
+    private static final String TEST_DEVICE_INFO_JSON = "{\n" +
+        "  \"test_boolean\": true,\n" +
+        "  \"test_double\": 1.23456789,\n" +
+        "  \"test_int\": 123456789,\n" +
+        "  \"test_long\": 9223372036854775807,\n" +
+        "  \"test_string\": \"test string\",\n" +
+        "  \"test_strings\": [\n" +
+        "    \"test string 1\",\n" +
+        "    \"test string 2\",\n" +
+        "    \"test string 3\"\n" +
+        "  ],\n" +
+        "  \"test_group\": {\n" +
+        "    \"test_boolean\": false,\n" +
+        "    \"test_double\": 9.87654321,\n" +
+        "    \"test_int\": 987654321,\n" +
+        "    \"test_long\": 9223372036854775807,\n" +
+        "    \"test_string\": \"test group string\",\n" +
+        "    \"test_strings\": [\n" +
+        "      \"test group string 1\",\n" +
+        "      \"test group string 2\",\n" +
+        "      \"test group string 3\"\n" +
+        "    ]\n" +
+        "  },\n" +
+        "  \"test_groups\": [\n" +
+        "    {\n" +
+        "      \"test_string\": \"test groups string 1\",\n" +
+        "      \"test_strings\": [\n" +
+        "        \"test groups string 1-1\",\n" +
+        "        \"test groups string 1-2\",\n" +
+        "        \"test groups string 1-3\"\n" +
+        "      ]\n" +
+        "    },\n" +
+        "    {\n" +
+        "      \"test_string\": \"test groups string 2\",\n" +
+        "      \"test_strings\": [\n" +
+        "        \"test groups string 2-1\",\n" +
+        "        \"test groups string 2-2\",\n" +
+        "        \"test groups string 2-3\"\n" +
+        "      ]\n" +
+        "    },\n" +
+        "    {\n" +
+        "      \"test_string\": \"test groups string 3\",\n" +
+        "      \"test_strings\": [\n" +
+        "        \"test groups string 3-1\",\n" +
+        "        \"test groups string 3-2\",\n" +
+        "        \"test groups string 3-3\"\n" +
+        "      ]\n" +
+        "    }\n" +
+        "  ],\n" +
+        "  \"max_length_string\": \"%s\",\n" +
+        "  \"max_num_ints\": [\n%s" +
+        "  ]\n" +
+        "}\n";
+
+    public static String testDeviceInfoJson() {
+        StringBuilder longStringSb = new StringBuilder();
+        StringBuilder longArraySb = new StringBuilder();
+        int lastNum = MAX_LENGTH - 1;
+        for (int i = 0; i < MAX_LENGTH; i++) {
+            longStringSb.append("a");
+            longArraySb.append(String.format("    %d%s\n", i, ((i == lastNum)? "" : ",")));
+        }
+        return String.format(TEST_DEVICE_INFO_JSON,
+            longStringSb.toString(), longArraySb.toString());
+    }
+}
\ No newline at end of file
diff --git a/common/device-side/device-info/tests/src/com/android/compatibility/common/deviceinfo/SampleDeviceInfo.java b/common/device-side/device-info/tests/src/com/android/compatibility/common/deviceinfo/SampleDeviceInfo.java
new file mode 100644
index 0000000..7da9951
--- /dev/null
+++ b/common/device-side/device-info/tests/src/com/android/compatibility/common/deviceinfo/SampleDeviceInfo.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2015 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 com.android.compatibility.common.deviceinfo;
+
+import android.os.Bundle;
+
+import java.lang.StringBuilder;
+
+/**
+ * Sample device info collector.
+ */
+public class SampleDeviceInfo extends DeviceInfoActivity {
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+
+    @Override
+    protected void collectDeviceInfo() {
+        boolean[] booleans = {Boolean.TRUE, Boolean.FALSE};
+        double[] doubles = {Double.MAX_VALUE, Double.MIN_VALUE};
+        int[] ints = {Integer.MAX_VALUE, Integer.MIN_VALUE};
+        long[] longs = {Long.MAX_VALUE, Long.MIN_VALUE};
+
+        // Group Foo
+        startGroup("foo");
+        addResult("foo_boolean", Boolean.TRUE);
+
+        // Group Bar
+        startGroup("bar");
+        addArray("bar_string", new String[] {
+                "bar-string-1",
+                "bar-string-2",
+                "bar-string-3"});
+
+        addArray("bar_boolean", booleans);
+        addArray("bar_double", doubles);
+        addArray("bar_int", ints);
+        addArray("bar_long", longs);
+        endGroup(); // bar
+
+        addResult("foo_double", Double.MAX_VALUE);
+        addResult("foo_int", Integer.MAX_VALUE);
+        addResult("foo_long", Long.MAX_VALUE);
+        addResult("foo_string", "foo-string");
+
+        StringBuilder sb = new StringBuilder();
+        int[] arr = new int[1001];
+        for (int i = 0; i < 1001; i++) {
+            sb.append("a");
+            arr[i] = i;
+        }
+        addResult("long_string", sb.toString());
+        addArray("long_int_array", arr);
+
+        endGroup(); // foo
+    }
+}
+
diff --git a/common/device-side/device-info/tests/src/com/android/compatibility/common/deviceinfo/TestDeviceInfo.java b/common/device-side/device-info/tests/src/com/android/compatibility/common/deviceinfo/TestDeviceInfo.java
new file mode 100644
index 0000000..7f82942
--- /dev/null
+++ b/common/device-side/device-info/tests/src/com/android/compatibility/common/deviceinfo/TestDeviceInfo.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2015 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 com.android.compatibility.common.deviceinfo;
+
+import android.os.Bundle;
+
+import java.lang.StringBuilder;
+
+/**
+ * Collector for testing DeviceInfoActivity
+ */
+public class TestDeviceInfo extends DeviceInfoActivity {
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+
+    @Override
+    protected void collectDeviceInfo() {
+
+        // Test primitive results
+        addResult("test_boolean", true);
+        addResult("test_double", 1.23456789);
+        addResult("test_int", 123456789);
+        addResult("test_long", Long.MAX_VALUE);
+        addResult("test_string", "test string");
+        addArray("test_strings", new String[] {
+            "test string 1",
+            "test string 2",
+            "test string 3",
+        });
+
+        // Test group
+        startGroup("test_group");
+        addResult("test_boolean", false);
+        addResult("test_double", 9.87654321);
+        addResult("test_int", 987654321);
+        addResult("test_long", Long.MAX_VALUE);
+        addResult("test_string", "test group string");
+        addArray("test_strings", new String[] {
+            "test group string 1",
+            "test group string 2",
+            "test group string 3"
+        });
+        endGroup(); // test_group
+
+        // Test array of groups
+        startArray("test_groups");
+        for (int i = 1; i < 4; i++) {
+            startGroup();
+            addResult("test_string", "test groups string " + i);
+            addArray("test_strings", new String[] {
+                "test groups string " + i + "-1",
+                "test groups string " + i + "-2",
+                "test groups string " + i + "-3"
+            });
+            endGroup();
+        }
+        endArray(); // test_groups
+
+        // Test max
+        StringBuilder sb = new StringBuilder();
+        int[] arr = new int[1001];
+        for (int i = 0; i < 1001; i++) {
+            sb.append("a");
+            arr[i] = i;
+        }
+        addResult("max_length_string", sb.toString());
+        addArray("max_num_ints", arr);
+    }
+}
diff --git a/common/device-side/util/src/com/android/compatibility/common/util/WifiConfigCreator.java b/common/device-side/util/src/com/android/compatibility/common/util/WifiConfigCreator.java
new file mode 100644
index 0000000..d01978a
--- /dev/null
+++ b/common/device-side/util/src/com/android/compatibility/common/util/WifiConfigCreator.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) 2015 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 com.android.compatibility.common.util;
+
+import android.content.Context;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiManager;
+import android.text.TextUtils;
+import android.util.Log;
+
+import java.util.List;
+
+/**
+ * A simple activity to create and manage wifi configurations.
+ */
+public class WifiConfigCreator {
+    public static final String ACTION_CREATE_WIFI_CONFIG =
+            "com.android.compatibility.common.util.CREATE_WIFI_CONFIG";
+    public static final String ACTION_UPDATE_WIFI_CONFIG =
+            "com.android.compatibility.common.util.UPDATE_WIFI_CONFIG";
+    public static final String ACTION_REMOVE_WIFI_CONFIG =
+            "com.android.compatibility.common.util.REMOVE_WIFI_CONFIG";
+    public static final String EXTRA_NETID = "extra-netid";
+    public static final String EXTRA_SSID = "extra-ssid";
+    public static final String EXTRA_SECURITY_TYPE = "extra-security-type";
+    public static final String EXTRA_PASSWORD = "extra-password";
+
+    public static final int SECURITY_TYPE_NONE = 1;
+    public static final int SECURITY_TYPE_WPA = 2;
+    public static final int SECURITY_TYPE_WEP = 3;
+
+    private static final String TAG = "WifiConfigCreator";
+
+    private final WifiManager mWifiManager;
+
+    public WifiConfigCreator(Context context) {
+        mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+    }
+
+    /**
+     * Adds a new WiFi network.
+     * @return network id or -1 in case of error
+     */
+    public int addNetwork(String ssid, boolean hidden, int securityType,
+            String password) throws SecurityException {
+        if (!mWifiManager.isWifiEnabled()) {
+            mWifiManager.setWifiEnabled(true);
+        }
+
+        WifiConfiguration wifiConf = createConfig(ssid, hidden, securityType, password);
+
+        int netId = mWifiManager.addNetwork(wifiConf);
+
+        if (netId != -1) {
+            mWifiManager.enableNetwork(netId, true);
+        } else {
+            Log.w(TAG, "Unable to add SSID '" + ssid + "': netId = " + netId);
+        }
+        return netId;
+    }
+
+    /**
+     * Updates a new WiFi network.
+     * @return network id (may differ from original) or -1 in case of error
+     */
+    public int updateNetwork(WifiConfiguration wifiConf, String ssid, boolean hidden,
+            int securityType, String password) throws SecurityException {
+        if (!mWifiManager.isWifiEnabled()) {
+            mWifiManager.setWifiEnabled(true);
+        }
+        if (wifiConf == null) {
+            return -1;
+        }
+
+        WifiConfiguration conf = createConfig(ssid, hidden, securityType, password);
+        conf.networkId = wifiConf.networkId;
+
+        int newNetId = mWifiManager.updateNetwork(conf);
+
+        if (newNetId != -1) {
+            mWifiManager.saveConfiguration();
+            mWifiManager.enableNetwork(newNetId, true);
+        } else {
+            Log.w(TAG, "Unable to update SSID '" + ssid + "': netId = " + newNetId);
+        }
+        return newNetId;
+    }
+
+    /**
+     * Updates a new WiFi network.
+     * @return network id (may differ from original) or -1 in case of error
+     */
+    public int updateNetwork(int netId, String ssid, boolean hidden,
+            int securityType, String password) throws SecurityException {
+        if (!mWifiManager.isWifiEnabled()) {
+            mWifiManager.setWifiEnabled(true);
+        }
+
+        WifiConfiguration wifiConf = null;
+        List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
+        for (WifiConfiguration config : configs) {
+            if (config.networkId == netId) {
+                wifiConf = config;
+                break;
+            }
+        }
+        return updateNetwork(wifiConf, ssid, hidden, securityType, password);
+    }
+
+    public boolean removeNetwork(int netId) {
+        return mWifiManager.removeNetwork(netId);
+    }
+
+    /**
+     * Creates a WifiConfiguration set up according to given parameters
+     * @param ssid SSID of the network
+     * @param hidden Is SSID not broadcast?
+     * @param securityType One of {@link #SECURITY_TYPE_NONE}, {@link #SECURITY_TYPE_WPA} or
+     *                     {@link #SECURITY_TYPE_WEP}
+     * @param password Password for WPA or WEP
+     * @return Created configuration object
+     */
+    private WifiConfiguration createConfig(String ssid, boolean hidden, int securityType,
+            String password) {
+        WifiConfiguration wifiConf = new WifiConfiguration();
+        if (!TextUtils.isEmpty(ssid)) {
+            wifiConf.SSID = '"' + ssid + '"';
+        }
+        wifiConf.status = WifiConfiguration.Status.ENABLED;
+        wifiConf.hiddenSSID = hidden;
+        switch (securityType) {
+            case SECURITY_TYPE_NONE:
+                wifiConf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+                break;
+            case SECURITY_TYPE_WPA:
+                updateForWPAConfiguration(wifiConf, password);
+                break;
+            case SECURITY_TYPE_WEP:
+                updateForWEPConfiguration(wifiConf, password);
+                break;
+        }
+        return wifiConf;
+    }
+
+    private void updateForWPAConfiguration(WifiConfiguration wifiConf, String wifiPassword) {
+        wifiConf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
+        if (!TextUtils.isEmpty(wifiPassword)) {
+            wifiConf.preSharedKey = '"' + wifiPassword + '"';
+        }
+    }
+
+    private void updateForWEPConfiguration(WifiConfiguration wifiConf, String password) {
+        wifiConf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+        wifiConf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
+        wifiConf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
+        if (!TextUtils.isEmpty(password)) {
+            int length = password.length();
+            if ((length == 10 || length == 26
+                    || length == 58) && password.matches("[0-9A-Fa-f]*")) {
+                wifiConf.wepKeys[0] = password;
+            } else {
+                wifiConf.wepKeys[0] = '"' + password + '"';
+            }
+            wifiConf.wepTxKeyIndex = 0;
+        }
+    }
+}
+
diff --git a/common/host-side/manifest-generator/Android.mk b/common/host-side/manifest-generator/Android.mk
new file mode 100644
index 0000000..ca08928
--- /dev/null
+++ b/common/host-side/manifest-generator/Android.mk
@@ -0,0 +1,33 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_STATIC_JAVA_LIBRARIES := kxml2-2.3.0
+
+LOCAL_JAR_MANIFEST := MANIFEST.mf
+
+LOCAL_CLASSPATH := $(HOST_JDK_TOOLS_JAR)
+
+LOCAL_MODULE := compatibility-manifest-generator
+
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_HOST_JAVA_LIBRARY)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/common/host-side/manifest-generator/MANIFEST.mf b/common/host-side/manifest-generator/MANIFEST.mf
new file mode 100644
index 0000000..4f62631
--- /dev/null
+++ b/common/host-side/manifest-generator/MANIFEST.mf
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+Main-Class: com.android.compatibility.common.generator.ManifestGenerator
diff --git a/common/host-side/manifest-generator/src/com/android/compatibility/common/generator/ManifestGenerator.java b/common/host-side/manifest-generator/src/com/android/compatibility/common/generator/ManifestGenerator.java
new file mode 100644
index 0000000..e23e254
--- /dev/null
+++ b/common/host-side/manifest-generator/src/com/android/compatibility/common/generator/ManifestGenerator.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2015 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 com.android.compatibility.common.generator;
+
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.kxml2.io.KXmlSerializer;
+
+public class ManifestGenerator {
+
+    private static final String USAGE = "Usage: "
+        + "manifest-generator -n NAME -p PACKAGE_NAME -o OUTPUT_FILE -i INSTRUMENT_NAME "
+        + "[-r PERMISSION]+ [-a ACTIVITY]+";
+    private static final String MANIFEST = "manifest";
+    private static final String USES_SDK = "uses-sdk";
+    private static final String USES_PERMISSION = "uses-permission";
+    private static final String APPLICATION = "application";
+    private static final String INSTRUMENTATION = "instrumentation";
+    private static final String ACTIVITY = "activity";
+
+    public static void main(String[] args) {
+        String pkgName = null;
+        String instrumentName = null;
+        List<String> permissions = new ArrayList<>();
+        List<String> activities = new ArrayList<>();
+        String output = null;
+
+        for (int i = 0; i < args.length - 1; i++) {
+            if (args[i].equals("-p")) {
+                pkgName = args[++i];
+            } else if (args[i].equals("-a")) {
+                activities.add(args[++i]);
+            } else if (args[i].equals("-o")) {
+                output = args[++i];
+            } else if (args[i].equals("-i")) {
+                instrumentName = args[++i];
+            } else if (args[i].equals("-r")) {
+                permissions.add(args[++i]);
+            }
+        }
+
+        if (pkgName == null) {
+            error("Missing package name");
+        } else if (instrumentName == null) {
+            error("Missing instrumentation name");
+        } else if (activities.isEmpty()) {
+            error("No activities");
+        } else if (output == null) {
+            error("Missing output file");
+        }
+
+        FileOutputStream out = null;
+        try {
+          out = new FileOutputStream(output);
+          generate(out, pkgName, instrumentName, permissions, activities);
+        } catch (Exception e) {
+          System.err.println("Couldn't create manifest file");
+        } finally {
+          if (out != null) {
+              try {
+                  out.close();
+              } catch (Exception e) {
+                  // Ignore
+              }
+          }
+        }
+    }
+
+    /*package*/ static void generate(OutputStream out, String pkgName, String instrumentName,
+            List<String> permissions, List<String> activities) throws Exception {
+        final String ns = null;
+        KXmlSerializer serializer = new KXmlSerializer();
+        serializer.setOutput(out, "UTF-8");
+        serializer.startDocument("UTF-8", true);
+        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
+        serializer.startTag(ns, MANIFEST);
+        serializer.attribute(ns, "xmlns:android", "http://schemas.android.com/apk/res/android");
+        serializer.attribute(ns, "package", pkgName);
+        serializer.startTag(ns, USES_SDK);
+        serializer.attribute(ns, "android:minSdkVersion", "8");
+        serializer.endTag(ns, USES_SDK);
+        for (String permission : permissions) {
+            serializer.startTag(ns, USES_PERMISSION);
+            serializer.attribute(ns, "android:name", permission);
+            serializer.endTag(ns, USES_PERMISSION);
+        }
+        serializer.startTag(ns, APPLICATION);
+        for (String activity : activities) {
+            serializer.startTag(ns, ACTIVITY);
+            serializer.attribute(ns, "android:name", activity);
+            serializer.endTag(ns, ACTIVITY);
+        }
+        serializer.endTag(ns, APPLICATION);
+        serializer.startTag(ns, INSTRUMENTATION);
+        serializer.attribute(ns, "android:name", instrumentName);
+        serializer.attribute(ns, "android:targetPackage", pkgName);
+        serializer.endTag(ns, INSTRUMENTATION);
+        serializer.endTag(ns, MANIFEST);
+        serializer.endDocument();
+        out.flush();
+    }
+
+    private static void error(String message) {
+        System.err.println(message);
+        System.err.println(USAGE);
+        System.exit(1);
+    }
+
+}
diff --git a/common/host-side/manifest-generator/tests/Android.mk b/common/host-side/manifest-generator/tests/Android.mk
new file mode 100644
index 0000000..2eb5d2f
--- /dev/null
+++ b/common/host-side/manifest-generator/tests/Android.mk
@@ -0,0 +1,27 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_JAVA_LIBRARIES := compatibility-manifest-generator junit
+
+LOCAL_MODULE := compatibility-manifest-generator-tests
+
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/common/host-side/manifest-generator/tests/src/com/android/compatibility/common/generator/ManifestGeneratorTest.java b/common/host-side/manifest-generator/tests/src/com/android/compatibility/common/generator/ManifestGeneratorTest.java
new file mode 100644
index 0000000..457bbb8
--- /dev/null
+++ b/common/host-side/manifest-generator/tests/src/com/android/compatibility/common/generator/ManifestGeneratorTest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2015 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 com.android.compatibility.common.generator;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+/** Unit tests for {@link ManifestGenerator}. */
+public class ManifestGeneratorTest extends TestCase {
+
+    private static final String PACKAGE = "test.package";
+    private static final String INSTRUMENT = "test.package.TestInstrument";
+    private static final String MANIFEST = "<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\r\n"
+        + "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" "
+        + "package=\"test.package\">\r\n"
+        + "  <uses-sdk android:minSdkVersion=\"8\" />\r\n"
+        + "%s"
+        + "  <application>\r\n"
+        + "%s"
+        + "  </application>\r\n"
+        + "  <instrumentation android:name=\"test.package.TestInstrument\" "
+        + "android:targetPackage=\"test.package\" />\r\n"
+        + "</manifest>";
+    private static final String PERMISSION = "  <uses-permission android:name=\"%s\" />\r\n";
+    private static final String PERMISSION_A = "android.permission.PermissionA";
+    private static final String PERMISSION_B = "android.permission.PermissionB";
+    private static final String ACTIVITY = "    <activity android:name=\"%s\" />\r\n";
+    private static final String ACTIVITY_A = "test.package.ActivityA";
+    private static final String ACTIVITY_B = "test.package.ActivityB";
+
+    public void testManifest() throws Exception {
+        List<String> permissions = new ArrayList<>();
+        permissions.add(PERMISSION_A);
+        permissions.add(PERMISSION_B);
+        List<String> activities = new ArrayList<>();
+        activities.add(ACTIVITY_A);
+        activities.add(ACTIVITY_B);
+        OutputStream output = new OutputStream() {
+            private StringBuilder string = new StringBuilder();
+            @Override
+            public void write(int b) throws IOException {
+                this.string.append((char) b);
+            }
+
+            @Override
+            public String toString(){
+                return this.string.toString();
+            }
+        };
+        ManifestGenerator.generate(output, PACKAGE, INSTRUMENT, permissions, activities);
+        String permissionXml = String.format(PERMISSION, PERMISSION_A)
+                + String.format(PERMISSION, PERMISSION_B);
+        String activityXml = String.format(ACTIVITY, ACTIVITY_A)
+                + String.format(ACTIVITY, ACTIVITY_B);
+        String expected = String.format(MANIFEST, permissionXml, activityXml);
+        assertEquals("Wrong manifest output", expected, output.toString());
+    }
+
+}
diff --git a/common/host-side/xml-plan-generator/src/com/android/compatibility/common/xmlgenerator/XmlPlanGenerator.java b/common/host-side/xml-plan-generator/src/com/android/compatibility/common/xmlgenerator/XmlPlanGenerator.java
index d0a3a37..efb53d5 100644
--- a/common/host-side/xml-plan-generator/src/com/android/compatibility/common/xmlgenerator/XmlPlanGenerator.java
+++ b/common/host-side/xml-plan-generator/src/com/android/compatibility/common/xmlgenerator/XmlPlanGenerator.java
@@ -22,9 +22,9 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
-import vogar.Expectation;
 import vogar.ExpectationStore;
 import vogar.ModeId;
+import vogar.Result;
 
 import java.io.File;
 import java.io.FileOutputStream;
@@ -161,7 +161,7 @@
     }
 
     public static boolean isKnownFailure(ExpectationStore store, String fullname) {
-        return store != null && store.get(fullname) != Expectation.SUCCESS;
+        return store != null && store.get(fullname).getResult() != Result.SUCCESS;
     }
 
     public static void main(String[] args) throws Exception {
diff --git a/common/util/src/com/android/compatibility/common/util/MetricsReportLog.java b/common/util/src/com/android/compatibility/common/util/MetricsReportLog.java
new file mode 100644
index 0000000..4675231
--- /dev/null
+++ b/common/util/src/com/android/compatibility/common/util/MetricsReportLog.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2015 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 com.android.compatibility.common.util;
+
+/**
+ * A {@link ReportLog} that can be used with the in memory metrics store used for host side metrics.
+ */
+public final class MetricsReportLog extends ReportLog {
+    private final String mDeviceSerial;
+    private final String mAbi;
+    private final String mClassMethodName;
+
+    /**
+     * @param deviceSerial serial number of the device
+     * @param abi abi the test was run on
+     * @param classMethodName class name and method name of the test in class#method format.
+     *        Note that ReportLog.getClassMethodNames() provide this.
+     */
+    public MetricsReportLog(String deviceSerial, String abi, String classMethodName) {
+        mDeviceSerial = deviceSerial;
+        mAbi = abi;
+        mClassMethodName = classMethodName;
+    }
+
+    public void submit() {
+        MetricsStore.storeResult(mDeviceSerial, mAbi, mClassMethodName, this);
+    }
+}
diff --git a/common/util/src/com/android/compatibility/common/util/MetricsStore.java b/common/util/src/com/android/compatibility/common/util/MetricsStore.java
new file mode 100644
index 0000000..9eeb94a
--- /dev/null
+++ b/common/util/src/com/android/compatibility/common/util/MetricsStore.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2015 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 com.android.compatibility.common.util;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * A simple in-memory store for metrics results. This should be used for hostside metrics reporting.
+ */
+public class MetricsStore {
+
+    // needs concurrent version as there can be multiple client accessing this.
+    // But there is no additional protection for the same key as that should not happen.
+    private static final ConcurrentHashMap<String, ReportLog> mMap =
+            new ConcurrentHashMap<String, ReportLog>();
+
+    /**
+     * Stores a result. Existing result with the same key will be replaced.
+     * Note that key is generated in the form of device_serial#class#method name.
+     * So there should be no concurrent test for the same (serial, class, method).
+     * @param deviceSerial
+     * @param abi
+     * @param classMethodName
+     * @param reportLog Contains the result to be stored
+     */
+    public static void storeResult(
+            String deviceSerial, String abi, String classMethodName, ReportLog reportLog) {
+        mMap.put(generateTestKey(deviceSerial, abi, classMethodName), reportLog);
+    }
+
+    /**
+     * retrieves a metric result for the given condition and remove it from the internal
+     * storage. If there is no result for the given condition, it will return null.
+     */
+    public static ReportLog removeResult(String deviceSerial, String abi, String classMethodName) {
+        return mMap.remove(generateTestKey(deviceSerial, abi, classMethodName));
+    }
+
+    /**
+     * @return test key in the form of device_serial#abi#class_name#method_name
+     */
+    private static String generateTestKey(String deviceSerial, String abi, String classMethodName) {
+        return String.format("%s#%s#%s", deviceSerial, abi, classMethodName);
+    }
+}
diff --git a/common/util/src/com/android/compatibility/common/util/ReportLog.java b/common/util/src/com/android/compatibility/common/util/ReportLog.java
index 8cfc086..7209ac8 100644
--- a/common/util/src/com/android/compatibility/common/util/ReportLog.java
+++ b/common/util/src/com/android/compatibility/common/util/ReportLog.java
@@ -16,28 +16,37 @@
 
 package com.android.compatibility.common.util;
 
-import org.xmlpull.v1.XmlSerializer;
-
-import java.io.IOException;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.StringTokenizer;
+import java.util.regex.Pattern;
 
 /**
  * Utility class to add results to the report.
  */
-public abstract class ReportLog implements Serializable {
+public class ReportLog implements Serializable {
 
+    private static final String LOG_SEPARATOR = "+++";
+    private static final String SUMMARY_SEPARATOR = "++++";
+    private static final String LOG_ELEM_SEPARATOR = "|";
+    private static final String EMPTY_CHAR = " ";
     private Result mSummary;
     private final List<Result> mDetails = new ArrayList<Result>();
 
-    class Result implements Serializable {
-        private static final int CALLER_STACKTRACE_DEPTH = 5;
+    static class Result implements Serializable {
         private String mLocation;
         private String mMessage;
         private double[] mValues;
         private ResultType mType;
         private ResultUnit mUnit;
+        private Double mTarget;
+
+
+        private Result(String location, String message, double[] values,
+                ResultType type, ResultUnit unit) {
+            this(location, message, values, null /*target*/, type, unit);
+        }
 
         /**
          * Creates a result object to be included in the report. Each object has a message
@@ -47,23 +56,22 @@
          *
          * @param message A string describing the values
          * @param values An array of the values
+         * @param target Nullable. The target value.
          * @param type Represents how to interpret the values (eg. A lower score is better)
          * @param unit Represents the unit in which the values are (eg. Milliseconds)
-         * @param depth A number used to increase the depth the stack is queried. This should only
-         * be given in the case that the report is populated by a helper function, in which case it
-         * would be 1, or else 0.
          */
-        private Result(String message, double[] values, ResultType type,
-                ResultUnit unit, int depth) {
-            final StackTraceElement[] trace = Thread.currentThread().getStackTrace();
-            final StackTraceElement e =
-                    trace[Math.min(CALLER_STACKTRACE_DEPTH + depth, trace.length - 1)];
-            mLocation = String.format(
-                    "%s#%s:%d", e.getClassName(), e.getMethodName(), e.getLineNumber());
+        private Result(String location, String message, double[] values,
+                Double target, ResultType type, ResultUnit unit) {
+            mLocation = location;
             mMessage = message;
             mValues = values;
             mType = type;
             mUnit = unit;
+            mTarget = target;
+        }
+
+        public double getTarget() {
+            return mTarget;
         }
 
         public String getLocation() {
@@ -85,51 +93,89 @@
         public ResultUnit getUnit() {
             return mUnit;
         }
+
+        /**
+         * Format:
+         * location|message|target|type|unit|value[s], target can be " " if there is no target set.
+         * log for array = classMethodName:line_number|message|unit|type|space separated values
+         */
+        String toEncodedString() {
+            StringBuilder builder = new StringBuilder()
+                    .append(mLocation)
+                    .append(LOG_ELEM_SEPARATOR)
+                    .append(mMessage)
+                    .append(LOG_ELEM_SEPARATOR)
+                    .append(mTarget != null ? mTarget : EMPTY_CHAR)
+                    .append(LOG_ELEM_SEPARATOR)
+                    .append(mType.name())
+                    .append(LOG_ELEM_SEPARATOR)
+                    .append(mUnit.name())
+                    .append(LOG_ELEM_SEPARATOR);
+            for (double value : mValues) {
+                builder.append(value).append(" ");
+            }
+            return builder.toString();
+        }
+
+        static Result fromEncodedString(String encodedString) {
+            String[] elems = encodedString.split(Pattern.quote(LOG_ELEM_SEPARATOR));
+            if (elems.length < 5) {
+                return null;
+            }
+
+            String[] valueStrArray = elems[5].split(" ");
+            double[] valueArray = new double[valueStrArray.length];
+            for (int i = 0; i < valueStrArray.length; i++) {
+                valueArray[i] = Double.parseDouble(valueStrArray[i]);
+            }
+            return new Result(
+                    elems[0], /*location*/
+                    elems[1], /*message*/
+                    valueArray, /*values*/
+                    elems[2].equals(EMPTY_CHAR) ? null : Double.parseDouble(elems[2]), /*target*/
+                    ResultType.valueOf(elems[3]), /*type*/
+                    ResultUnit.valueOf(elems[4])  /*unit*/);
+        }
     }
 
     /**
      * Adds an array of values to the report.
      */
     public void addValues(String message, double[] values, ResultType type, ResultUnit unit) {
-        mDetails.add(new Result(message, values, type, unit, 0));
+        mDetails.add(new Result(Stacktrace.getTestCallerClassMethodNameLineNumber(),
+                message, values, type, unit));
     }
 
     /**
      * Adds an array of values to the report.
      */
-    public void addValues(String message, double[] values, ResultType type,
-            ResultUnit unit, int depth) {
-        mDetails.add(new Result(message, values, type, unit, depth));
+    public void addValues(
+            String message, double[] values, ResultType type, ResultUnit unit, String location) {
+        mDetails.add(new Result(location, message, values, type, unit));
     }
 
     /**
      * Adds a value to the report.
      */
     public void addValue(String message, double value, ResultType type, ResultUnit unit) {
-        mDetails.add(new Result(message, new double[] {value}, type, unit, 0));
+        mDetails.add(new Result(Stacktrace.getTestCallerClassMethodNameLineNumber(), message,
+                new double[] {value}, type, unit));
     }
 
     /**
      * Adds a value to the report.
      */
     public void addValue(String message, double value, ResultType type,
-            ResultUnit unit, int depth) {
-        mDetails.add(new Result(message, new double[] {value}, type, unit, depth));
+            ResultUnit unit, String location) {
+        mDetails.add(new Result(location, message, new double[] {value}, type, unit));
     }
 
     /**
      * Sets the summary of the report.
      */
     public void setSummary(String message, double value, ResultType type, ResultUnit unit) {
-        mSummary = new Result(message, new double[] {value}, type, unit, 0);
-    }
-
-    /**
-     * Sets the summary of the report.
-     */
-    public void setSummary(String message, double value, ResultType type,
-            ResultUnit unit, int depth) {
-        mSummary = new Result(message, new double[] {value}, type, unit, depth);
+        mSummary = new Result(Stacktrace.getTestCallerClassMethodNameLineNumber(),
+                message, new double[] {value}, type, unit);
     }
 
     public Result getSummary() {
@@ -139,4 +185,46 @@
     public List<Result> getDetailedMetrics() {
         return new ArrayList<Result>(mDetails);
     }
+
+    /**
+     * Parse a String encoded {@link com.android.compatibility.common.util.ReportLog}
+     */
+    public static ReportLog fromEncodedString(String encodedString) {
+        ReportLog reportLog = new ReportLog();
+        StringTokenizer tok = new StringTokenizer(encodedString, SUMMARY_SEPARATOR);
+        if (tok.hasMoreTokens()) {
+            // Extract the summary
+            reportLog.mSummary = Result.fromEncodedString(tok.nextToken());
+        }
+        if (tok.hasMoreTokens()) {
+            // Extract the detailed results
+            StringTokenizer detailedTok = new StringTokenizer(tok.nextToken(), LOG_SEPARATOR);
+            while (detailedTok.hasMoreTokens()) {
+                reportLog.mDetails.add(Result.fromEncodedString(detailedTok.nextToken()));
+            }
+        }
+        return reportLog;
+    }
+
+    /**
+     * @return a String representation of this report or null if not collected
+     */
+    protected String toEncodedString() {
+        if ((mSummary == null) && mDetails.isEmpty()) {
+            // just return empty string
+            return null;
+        }
+        StringBuilder builder = new StringBuilder();
+        builder.append(mSummary.toEncodedString());
+        builder.append(SUMMARY_SEPARATOR);
+        for (Result result : mDetails) {
+            builder.append(result.toEncodedString());
+            builder.append(LOG_SEPARATOR);
+        }
+        // delete the last separator
+        if (builder.length() >= LOG_SEPARATOR.length()) {
+            builder.delete(builder.length() - LOG_SEPARATOR.length(), builder.length());
+        }
+        return builder.toString();
+    }
 }
diff --git a/common/util/src/com/android/compatibility/common/util/Stacktrace.java b/common/util/src/com/android/compatibility/common/util/Stacktrace.java
new file mode 100644
index 0000000..27bf9ca
--- /dev/null
+++ b/common/util/src/com/android/compatibility/common/util/Stacktrace.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2015 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 com.android.compatibility.common.util;
+
+/**
+ * Helper methods for dealing with stack traces
+ */
+public class Stacktrace {
+
+    private static final int SAFETY_DEPTH = 4;
+    private static final String TEST_POSTFIX = "Test";
+
+    private Stacktrace() {}
+
+    /**
+     * @return classname#methodname from call stack of the current thread
+     */
+    public static String getTestCallerClassMethodName() {
+        return getTestCallerClassMethodName(false /*includeLineNumber*/);
+    }
+
+    /**
+     * @return classname#methodname from call stack of the current thread
+     */
+    public static String getTestCallerClassMethodNameLineNumber() {
+        return getTestCallerClassMethodName(true /*includeLineNumber*/);
+    }
+
+    /**
+     * @return classname#methodname from call stack of the current thread
+     */
+    private static String getTestCallerClassMethodName(boolean includeLineNumber) {
+        StackTraceElement[] elements = Thread.currentThread().getStackTrace();
+        // Look for the first class name in the elements array that ends with Test
+        for (int i = 0; i < elements.length; i++) {
+            if (elements[i].getClassName().endsWith(TEST_POSTFIX)) {
+                return buildClassMethodName(elements, i, includeLineNumber);
+            }
+        }
+
+        // Use a reasonable default if the test name isn't found
+        return buildClassMethodName(elements, SAFETY_DEPTH, includeLineNumber);
+    }
+
+    private static String buildClassMethodName(
+            StackTraceElement[] elements, int depth, boolean includeLineNumber) {
+        depth = Math.min(depth, elements.length - 1);
+        StringBuilder builder = new StringBuilder();
+        builder.append(elements[depth].getClassName()).append("#")
+                .append(elements[depth].getMethodName());
+        if (includeLineNumber) {
+            builder.append(":").append(elements[depth].getLineNumber());
+        }
+        return builder.toString();
+    }
+}
diff --git a/common/util/tests/src/com/android/compatibility/common/util/MetricsStoreTest.java b/common/util/tests/src/com/android/compatibility/common/util/MetricsStoreTest.java
new file mode 100644
index 0000000..944cc43
--- /dev/null
+++ b/common/util/tests/src/com/android/compatibility/common/util/MetricsStoreTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2015 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 com.android.compatibility.common.util;
+
+import junit.framework.TestCase;
+
+/**
+ * Unit tests for {@link MetricsStore}
+ */
+public class MetricsStoreTest extends TestCase {
+
+    private static final String DEVICE_SERIAL = "DEVICE_SERIAL";
+    private static final String ABI = "ABI";
+    private static final String CLASSMETHOD_NAME = "CLASSMETHOD_NAME";
+
+    private static final double[] VALUES = new double[] {1, 11, 21, 1211, 111221};
+
+    private ReportLog mReportLog;
+
+    @Override
+    protected void setUp() throws Exception {
+        this.mReportLog = new ReportLog();
+    }
+
+    public void testStoreAndRemove() {
+        mReportLog.setSummary("Sample Summary", 1.0, ResultType.HIGHER_BETTER, ResultUnit.BYTE);
+        mReportLog.addValues("Details", VALUES, ResultType.NEUTRAL, ResultUnit.FPS);
+        MetricsStore.storeResult(DEVICE_SERIAL, ABI, CLASSMETHOD_NAME, mReportLog);
+
+        ReportLog reportLog = MetricsStore.removeResult(DEVICE_SERIAL, ABI, CLASSMETHOD_NAME);
+        assertSame(mReportLog, reportLog);
+        assertNull(MetricsStore.removeResult("blah", ABI, CLASSMETHOD_NAME));
+    }
+
+}
diff --git a/common/util/tests/src/com/android/compatibility/common/util/MetricsXmlSerializerTest.java b/common/util/tests/src/com/android/compatibility/common/util/MetricsXmlSerializerTest.java
index 70da820..05e69d8 100644
--- a/common/util/tests/src/com/android/compatibility/common/util/MetricsXmlSerializerTest.java
+++ b/common/util/tests/src/com/android/compatibility/common/util/MetricsXmlSerializerTest.java
@@ -36,7 +36,8 @@
             HEADER
             + "<Summary message=\"Sample\" scoreType=\"higher_better\" unit=\"byte\">1.0</Summary>"
             + "<Details>"
-                    + "<ValueArray source=\"sun.reflect.NativeMethodAccessorImpl#invoke0:-2\""
+                    + "<ValueArray source=\"com.android.compatibility.common.util."
+                    + "MetricsXmlSerializerTest#testSerialize:84\""
                     + " message=\"Details\" scoreType=\"neutral\" unit=\"fps\">"
                         + "<Value>1.0</Value>"
                         + "<Value>11.0</Value>"
diff --git a/common/util/tests/src/com/android/compatibility/common/util/ReportLogTest.java b/common/util/tests/src/com/android/compatibility/common/util/ReportLogTest.java
new file mode 100644
index 0000000..a5f3306
--- /dev/null
+++ b/common/util/tests/src/com/android/compatibility/common/util/ReportLogTest.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2015 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 com.android.compatibility.common.util;
+
+import junit.framework.TestCase;
+
+import java.util.Arrays;
+
+/**
+ * Unit tests for {@link ReportLog}
+ */
+public class ReportLogTest extends TestCase {
+
+    private static final double[] VALUES = new double[] {1, 11, 21, 1211, 111221};
+
+    private static final String EXPECTED_ENCODED_REPORT_LOG =
+            "com.android.compatibility.common.util.ReportLogTest#testEncodeDecode:44|" +
+            "Sample Summary| |HIGHER_BETTER|BYTE|1.0 ++++" +
+            "com.android.compatibility.common.util.ReportLogTest#testEncodeDecode:45|" +
+            "Details| |NEUTRAL|FPS|1.0 11.0 21.0 1211.0 111221.0 ";
+    private ReportLog reportLog;
+
+    @Override
+    protected void setUp() throws Exception {
+        this.reportLog = new ReportLog();
+    }
+
+    public void testEncodeDecode() {
+
+        reportLog.setSummary("Sample Summary", 1.0, ResultType.HIGHER_BETTER, ResultUnit.BYTE);
+        reportLog.addValues("Details", VALUES, ResultType.NEUTRAL, ResultUnit.FPS);
+
+        String encodedReportLog = reportLog.toEncodedString();
+        assertEquals(EXPECTED_ENCODED_REPORT_LOG, encodedReportLog);
+
+        ReportLog decodedReportLog = ReportLog.fromEncodedString(encodedReportLog);
+        ReportLog.Result summary = reportLog.getSummary();
+        assertEquals("Sample Summary", summary.getMessage());
+        assertFalse(summary.getLocation().isEmpty());
+        assertEquals(ResultType.HIGHER_BETTER, summary.getType());
+        assertEquals(ResultUnit.BYTE, summary.getUnit());
+        assertTrue(Arrays.equals(new double[] {1.0}, summary.getValues()));
+
+        assertEquals(1, decodedReportLog.getDetailedMetrics().size());
+        ReportLog.Result detail = decodedReportLog.getDetailedMetrics().get(0);
+        assertEquals("Details", detail.getMessage());
+        assertFalse(detail.getLocation().isEmpty());
+        assertEquals(ResultType.NEUTRAL, detail.getType());
+        assertEquals(ResultUnit.FPS, detail.getUnit());
+        assertTrue(Arrays.equals(VALUES, detail.getValues()));
+
+        assertEquals(encodedReportLog, decodedReportLog.toEncodedString());
+    }
+}
diff --git a/common/util/tests/src/com/android/compatibility/common/util/UnitTests.java b/common/util/tests/src/com/android/compatibility/common/util/UnitTests.java
index b9a17e1..348c680 100644
--- a/common/util/tests/src/com/android/compatibility/common/util/UnitTests.java
+++ b/common/util/tests/src/com/android/compatibility/common/util/UnitTests.java
@@ -26,6 +26,8 @@
     public UnitTests() {
         super();
 
+        addTestSuite(MetricsStoreTest.class);
         addTestSuite(MetricsXmlSerializerTest.class);
+        addTestSuite(ReportLogTest.class);
     }
 }
diff --git a/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-dsa-a.pk8 b/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-dsa-a.pk8
new file mode 100644
index 0000000..ac0b0c1
--- /dev/null
+++ b/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-dsa-a.pk8
Binary files differ
diff --git a/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-ec-a.pk8 b/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-ec-a.pk8
new file mode 100644
index 0000000..ec27be1
--- /dev/null
+++ b/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-ec-a.pk8
Binary files differ
diff --git a/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-ec-a.x509.pem b/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-ec-a.x509.pem
new file mode 100644
index 0000000..183691d
--- /dev/null
+++ b/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-ec-a.x509.pem
@@ -0,0 +1,10 @@
+-----BEGIN CERTIFICATE-----
+MIIBejCCAR+gAwIBAgIJAMsY4Fz5jr/IMAoGCCqGSM49BAMCMBkxFzAVBgNVBAMM
+DnVuaXRfdGVzdF9lY19hMB4XDTE1MDYwMTIxNDU1M1oXDTQyMTAxNzIxNDU1M1ow
+GTEXMBUGA1UEAwwOdW5pdF90ZXN0X2VjX2EwWTATBgcqhkjOPQIBBggqhkjOPQMB
+BwNCAAR8Q+7lg4KSOs2Be0XhFwlFCsiCCIh3iX2t6fE+V/MD+QBT1265hIyBKEH/
+oAsTpLy8FdGKLC0x+TwuCedui0SBo1AwTjAdBgNVHQ4EFgQUX4h7gPTgwQXorm0H
+7R12wN2yNrwwHwYDVR0jBBgwFoAUX4h7gPTgwQXorm0H7R12wN2yNrwwDAYDVR0T
+BAUwAwEB/zAKBggqhkjOPQQDAgNJADBGAiEA5kHO4aK20dwt81mCABAywD7Y6V1O
+vqoff9yIx3USW8oCIQDTzo8tbHuPc+i3vBsb5Uo1+4BE/pcOe/je6PGlRHG8rg==
+-----END CERTIFICATE-----
diff --git a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AdoptableHostTest.java b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AdoptableHostTest.java
new file mode 100644
index 0000000..70414ca
--- /dev/null
+++ b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AdoptableHostTest.java
@@ -0,0 +1,350 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.appsecurity;
+
+import static com.android.cts.appsecurity.SplitTests.ABI_TO_APK;
+import static com.android.cts.appsecurity.SplitTests.APK;
+import static com.android.cts.appsecurity.SplitTests.APK_mdpi;
+import static com.android.cts.appsecurity.SplitTests.APK_xxhdpi;
+import static com.android.cts.appsecurity.SplitTests.CLASS;
+import static com.android.cts.appsecurity.SplitTests.PKG;
+
+import com.android.cts.appsecurity.SplitTests.BaseInstallMultiple;
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
+import com.android.tradefed.testtype.IBuildReceiver;
+
+import java.util.Arrays;
+
+/**
+ * Set of tests that verify behavior of adopted storage media, if supported.
+ */
+public class AdoptableHostTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
+    private IAbi mAbi;
+    private CtsBuildHelper mCtsBuild;
+
+    @Override
+    public void setAbi(IAbi abi) {
+        mAbi = abi;
+    }
+
+    @Override
+    public void setBuild(IBuildInfo buildInfo) {
+        mCtsBuild = CtsBuildHelper.createBuildHelper(buildInfo);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        assertNotNull(mAbi);
+        assertNotNull(mCtsBuild);
+
+        getDevice().uninstallPackage(PKG);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+
+        getDevice().uninstallPackage(PKG);
+    }
+
+    public void testApps() throws Exception {
+        if (!hasAdoptable()) return;
+        final String diskId = getAdoptionDisk();
+        try {
+            final String abi = mAbi.getName();
+            final String apk = ABI_TO_APK.get(abi);
+            assertNotNull("Failed to find APK for ABI " + abi, apk);
+
+            // Install simple app on internal
+            new InstallMultiple().useNaturalAbi().addApk(APK).addApk(apk).run();
+            runDeviceTests(PKG, CLASS, "testDataInternal");
+            runDeviceTests(PKG, CLASS, "testDataWrite");
+            runDeviceTests(PKG, CLASS, "testDataRead");
+            runDeviceTests(PKG, CLASS, "testNative");
+
+            // Adopt that disk!
+            assertEmpty(getDevice().executeShellCommand("sm partition " + diskId + " private"));
+            final LocalVolumeInfo vol = getAdoptionVolume();
+
+            // Move app and verify
+            assertSuccess(getDevice().executeShellCommand("pm move-package " + PKG + " " + vol.uuid));
+            runDeviceTests(PKG, CLASS, "testDataNotInternal");
+            runDeviceTests(PKG, CLASS, "testDataRead");
+            runDeviceTests(PKG, CLASS, "testNative");
+
+            // Unmount, remount and verify
+            getDevice().executeShellCommand("sm unmount " + vol.volId);
+            getDevice().executeShellCommand("sm mount " + vol.volId);
+            runDeviceTests(PKG, CLASS, "testDataNotInternal");
+            runDeviceTests(PKG, CLASS, "testDataRead");
+            runDeviceTests(PKG, CLASS, "testNative");
+
+            // Move app back and verify
+            assertSuccess(getDevice().executeShellCommand("pm move-package " + PKG + " internal"));
+            runDeviceTests(PKG, CLASS, "testDataInternal");
+            runDeviceTests(PKG, CLASS, "testDataRead");
+            runDeviceTests(PKG, CLASS, "testNative");
+
+            // Un-adopt volume and app should still be fine
+            getDevice().executeShellCommand("sm partition " + diskId + " public");
+            runDeviceTests(PKG, CLASS, "testDataInternal");
+            runDeviceTests(PKG, CLASS, "testDataRead");
+            runDeviceTests(PKG, CLASS, "testNative");
+
+        } finally {
+            cleanUp(diskId);
+        }
+    }
+
+    public void testPrimaryStorage() throws Exception {
+        if (!hasAdoptable()) return;
+        final String diskId = getAdoptionDisk();
+        try {
+            final String originalVol = getDevice()
+                    .executeShellCommand("sm get-primary-storage-uuid").trim();
+
+            if ("null".equals(originalVol)) {
+                verifyPrimaryInternal(diskId);
+            } else if ("primary_physical".equals(originalVol)) {
+                verifyPrimaryPhysical(diskId);
+            }
+        } finally {
+            cleanUp(diskId);
+        }
+    }
+
+    private void verifyPrimaryInternal(String diskId) throws Exception {
+        // Write some data to shared storage
+        new InstallMultiple().addApk(APK).run();
+        runDeviceTests(PKG, CLASS, "testPrimaryOnSameVolume");
+        runDeviceTests(PKG, CLASS, "testPrimaryInternal");
+        runDeviceTests(PKG, CLASS, "testPrimaryDataWrite");
+        runDeviceTests(PKG, CLASS, "testPrimaryDataRead");
+
+        // Adopt that disk!
+        assertEmpty(getDevice().executeShellCommand("sm partition " + diskId + " private"));
+        final LocalVolumeInfo vol = getAdoptionVolume();
+
+        // Move storage there and verify that data went along for ride
+        assertSuccess(getDevice().executeShellCommand("pm move-primary-storage " + vol.uuid));
+        runDeviceTests(PKG, CLASS, "testPrimaryAdopted");
+        runDeviceTests(PKG, CLASS, "testPrimaryDataRead");
+
+        // Unmount and verify
+        getDevice().executeShellCommand("sm unmount " + vol.volId);
+        runDeviceTests(PKG, CLASS, "testPrimaryUnmounted");
+        getDevice().executeShellCommand("sm mount " + vol.volId);
+        runDeviceTests(PKG, CLASS, "testPrimaryAdopted");
+        runDeviceTests(PKG, CLASS, "testPrimaryDataRead");
+
+        // Move app and verify backing storage volume is same
+        assertSuccess(getDevice().executeShellCommand("pm move-package " + PKG + " " + vol.uuid));
+        runDeviceTests(PKG, CLASS, "testPrimaryOnSameVolume");
+        runDeviceTests(PKG, CLASS, "testPrimaryDataRead");
+
+        // And move back to internal
+        assertSuccess(getDevice().executeShellCommand("pm move-primary-storage internal"));
+        runDeviceTests(PKG, CLASS, "testPrimaryInternal");
+        runDeviceTests(PKG, CLASS, "testPrimaryDataRead");
+
+        assertSuccess(getDevice().executeShellCommand("pm move-package " + PKG + " internal"));
+        runDeviceTests(PKG, CLASS, "testPrimaryOnSameVolume");
+        runDeviceTests(PKG, CLASS, "testPrimaryDataRead");
+    }
+
+    private void verifyPrimaryPhysical(String diskId) throws Exception {
+        // Write some data to shared storage
+        new InstallMultiple().addApk(APK).run();
+        runDeviceTests(PKG, CLASS, "testPrimaryPhysical");
+        runDeviceTests(PKG, CLASS, "testPrimaryDataWrite");
+        runDeviceTests(PKG, CLASS, "testPrimaryDataRead");
+
+        // Adopt that disk!
+        assertEmpty(getDevice().executeShellCommand("sm partition " + diskId + " private"));
+        final LocalVolumeInfo vol = getAdoptionVolume();
+
+        // Move primary storage there, but since we just nuked primary physical
+        // the storage device will be empty
+        assertSuccess(getDevice().executeShellCommand("pm move-primary-storage " + vol.uuid));
+        runDeviceTests(PKG, CLASS, "testPrimaryAdopted");
+        runDeviceTests(PKG, CLASS, "testPrimaryDataWrite");
+        runDeviceTests(PKG, CLASS, "testPrimaryDataRead");
+
+        // Unmount and verify
+        getDevice().executeShellCommand("sm unmount " + vol.volId);
+        runDeviceTests(PKG, CLASS, "testPrimaryUnmounted");
+        getDevice().executeShellCommand("sm mount " + vol.volId);
+        runDeviceTests(PKG, CLASS, "testPrimaryAdopted");
+        runDeviceTests(PKG, CLASS, "testPrimaryDataRead");
+
+        // And move to internal
+        assertSuccess(getDevice().executeShellCommand("pm move-primary-storage internal"));
+        runDeviceTests(PKG, CLASS, "testPrimaryOnSameVolume");
+        runDeviceTests(PKG, CLASS, "testPrimaryInternal");
+        runDeviceTests(PKG, CLASS, "testPrimaryDataRead");
+    }
+
+    /**
+     * Verify that we can install both new and inherited packages directly on
+     * adopted volumes.
+     */
+    public void testPackageInstaller() throws Exception {
+        if (!hasAdoptable()) return;
+        final String diskId = getAdoptionDisk();
+        try {
+            assertEmpty(getDevice().executeShellCommand("sm partition " + diskId + " private"));
+            final LocalVolumeInfo vol = getAdoptionVolume();
+
+            // Install directly onto adopted volume
+            new InstallMultiple().locationAuto().forceUuid(vol.uuid)
+                    .addApk(APK).addApk(APK_mdpi).run();
+            runDeviceTests(PKG, CLASS, "testDataNotInternal");
+            runDeviceTests(PKG, CLASS, "testDensityBest1");
+
+            // Now splice in an additional split which offers better resources
+            new InstallMultiple().locationAuto().inheritFrom(PKG)
+                    .addApk(APK_xxhdpi).run();
+            runDeviceTests(PKG, CLASS, "testDataNotInternal");
+            runDeviceTests(PKG, CLASS, "testDensityBest2");
+
+        } finally {
+            cleanUp(diskId);
+        }
+    }
+
+    /**
+     * Verify behavior when changes occur while adopted device is ejected and
+     * returned at a later time.
+     */
+    public void testEjected() throws Exception {
+        if (!hasAdoptable()) return;
+        final String diskId = getAdoptionDisk();
+        try {
+            assertEmpty(getDevice().executeShellCommand("sm partition " + diskId + " private"));
+            final LocalVolumeInfo vol = getAdoptionVolume();
+
+            // Install directly onto adopted volume, and write data there
+            new InstallMultiple().locationAuto().forceUuid(vol.uuid).addApk(APK).run();
+            runDeviceTests(PKG, CLASS, "testDataNotInternal");
+            runDeviceTests(PKG, CLASS, "testDataWrite");
+            runDeviceTests(PKG, CLASS, "testDataRead");
+
+            // Now unmount and uninstall; leaving stale package on adopted volume
+            getDevice().executeShellCommand("sm unmount " + vol.volId);
+            getDevice().uninstallPackage(PKG);
+
+            // Install second copy on internal, but don't write anything
+            new InstallMultiple().locationInternalOnly().addApk(APK).run();
+            runDeviceTests(PKG, CLASS, "testDataInternal");
+
+            // Kick through a remount cycle, which should purge the adopted app
+            getDevice().executeShellCommand("sm mount " + vol.volId);
+            runDeviceTests(PKG, CLASS, "testDataInternal");
+            try {
+                runDeviceTests(PKG, CLASS, "testDataRead");
+                fail("Unexpected data from adopted volume picked up");
+            } catch (AssertionError expected) {
+            }
+            getDevice().executeShellCommand("sm unmount " + vol.volId);
+
+            // Uninstall the internal copy and remount; we should have no record of app
+            getDevice().uninstallPackage(PKG);
+            getDevice().executeShellCommand("sm mount " + vol.volId);
+
+            assertEmpty(getDevice().executeShellCommand("pm list packages " + PKG));
+        } finally {
+            cleanUp(diskId);
+        }
+    }
+
+    private boolean hasAdoptable() throws Exception {
+        return Boolean.parseBoolean(getDevice().executeShellCommand("sm has-adoptable").trim());
+    }
+
+    private String getAdoptionDisk() throws Exception {
+        final String disks = getDevice().executeShellCommand("sm list-disks adoptable");
+        if (disks == null || disks.length() == 0) {
+            throw new AssertionError("Devices that claim to support adoptable storage must have "
+                    + "adoptable media inserted during CTS to verify correct behavior");
+        }
+        return disks.split("\n")[0].trim();
+    }
+
+    private LocalVolumeInfo getAdoptionVolume() throws Exception {
+        String[] lines = null;
+        int attempt = 0;
+        while (attempt++ < 5) {
+            lines = getDevice().executeShellCommand("sm list-volumes private").split("\n");
+            for (String line : lines) {
+                final LocalVolumeInfo info = new LocalVolumeInfo(line.trim());
+                if (!"private".equals(info.volId) && "mounted".equals(info.state)) {
+                    return info;
+                }
+            }
+            Thread.sleep(1000);
+        }
+        throw new AssertionError("Expected private volume; found " + Arrays.toString(lines));
+    }
+
+    private void cleanUp(String diskId) throws Exception {
+        getDevice().executeShellCommand("sm partition " + diskId + " public");
+        getDevice().executeShellCommand("sm forget all");
+    }
+
+    private void runDeviceTests(String packageName, String testClassName, String testMethodName)
+            throws DeviceNotAvailableException {
+        Utils.runDeviceTests(getDevice(), packageName, testClassName, testMethodName);
+    }
+
+    private static void assertSuccess(String str) {
+        if (str == null || !str.startsWith("Success")) {
+            throw new AssertionError("Expected success string but found " + str);
+        }
+    }
+
+    private static void assertEmpty(String str) {
+        if (str != null && str.trim().length() > 0) {
+            throw new AssertionError("Expected empty string but found " + str);
+        }
+    }
+
+    private static class LocalVolumeInfo {
+        public String volId;
+        public String state;
+        public String uuid;
+
+        public LocalVolumeInfo(String line) {
+            final String[] split = line.split(" ");
+            volId = split[0];
+            state = split[1];
+            uuid = split[2];
+        }
+    }
+
+    private class InstallMultiple extends BaseInstallMultiple<InstallMultiple> {
+        public InstallMultiple() {
+            super(getDevice(), mCtsBuild, mAbi);
+        }
+    }
+}
diff --git a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
index 4d9ef00..bf9e81c 100644
--- a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
+++ b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
@@ -19,16 +19,8 @@
 import com.android.cts.tradefed.build.CtsBuildHelper;
 import com.android.cts.util.AbiUtils;
 import com.android.ddmlib.Log;
-import com.android.ddmlib.testrunner.InstrumentationResultParser;
-import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
-import com.android.ddmlib.testrunner.TestIdentifier;
-import com.android.ddmlib.testrunner.TestResult;
-import com.android.ddmlib.testrunner.TestResult.TestStatus;
-import com.android.ddmlib.testrunner.TestRunResult;
 import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.device.ITestDevice;
-import com.android.tradefed.result.CollectingTestListener;
 import com.android.tradefed.testtype.DeviceTestCase;
 import com.android.tradefed.testtype.IAbi;
 import com.android.tradefed.testtype.IAbiReceiver;
@@ -36,15 +28,13 @@
 
 import java.io.File;
 import java.io.FileNotFoundException;
-import java.util.Map;
 
 /**
- * Set of tests that verify various security checks involving multiple apps are properly enforced.
+ * Set of tests that verify various security checks involving multiple apps are
+ * properly enforced.
  */
 public class AppSecurityTests extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
 
-    private static final String RUNNER = "android.support.test.runner.AndroidJUnitRunner";
-
     // testSharedUidDifferentCerts constants
     private static final String SHARED_UI_APK = "CtsSharedUidInstall.apk";
     private static final String SHARED_UI_PKG = "com.android.cts.shareuidinstall";
@@ -69,18 +59,6 @@
     private static final String APP_ACCESS_DATA_APK = "CtsAppAccessData.apk";
     private static final String APP_ACCESS_DATA_PKG = "com.android.cts.appaccessdata";
 
-    // External storage constants
-    private static final String COMMON_EXTERNAL_STORAGE_APP_CLASS = "com.android.cts.externalstorageapp.CommonExternalStorageTest";
-    private static final String EXTERNAL_STORAGE_APP_APK = "CtsExternalStorageApp.apk";
-    private static final String EXTERNAL_STORAGE_APP_PKG = "com.android.cts.externalstorageapp";
-    private static final String EXTERNAL_STORAGE_APP_CLASS = EXTERNAL_STORAGE_APP_PKG + ".ExternalStorageTest";
-    private static final String READ_EXTERNAL_STORAGE_APP_APK = "CtsReadExternalStorageApp.apk";
-    private static final String READ_EXTERNAL_STORAGE_APP_PKG = "com.android.cts.readexternalstorageapp";
-    private static final String READ_EXTERNAL_STORAGE_APP_CLASS = READ_EXTERNAL_STORAGE_APP_PKG + ".ReadExternalStorageTest";
-    private static final String WRITE_EXTERNAL_STORAGE_APP_APK = "CtsWriteExternalStorageApp.apk";
-    private static final String WRITE_EXTERNAL_STORAGE_APP_PKG = "com.android.cts.writeexternalstorageapp";
-    private static final String WRITE_EXTERNAL_STORAGE_APP_CLASS = WRITE_EXTERNAL_STORAGE_APP_PKG + ".WriteExternalStorageTest";
-
     // testInstrumentationDiffCert constants
     private static final String TARGET_INSTRUMENT_APK = "CtsTargetInstrumentationApp.apk";
     private static final String TARGET_INSTRUMENT_PKG = "com.android.cts.targetinstrumentationapp";
@@ -98,13 +76,6 @@
     private static final String PERMISSION_DIFF_CERT_PKG =
         "com.android.cts.usespermissiondiffcertapp";
 
-    private static final String READ_EXTERNAL_STORAGE = "android.permission.READ_EXTERNAL_STORAGE";
-
-    private static final String MULTIUSER_STORAGE_APK = "CtsMultiUserStorageApp.apk";
-    private static final String MULTIUSER_STORAGE_PKG = "com.android.cts.multiuserstorageapp";
-    private static final String MULTIUSER_STORAGE_CLASS = MULTIUSER_STORAGE_PKG
-            + ".MultiUserStorageTest";
-
     private static final String LOG_TAG = "AppSecurityTests";
 
     private IAbi mAbi;
@@ -155,8 +126,7 @@
             assertNotNull("shared uid app with different cert than existing app installed " +
                     "successfully", installResult);
             assertEquals("INSTALL_FAILED_SHARED_USER_INCOMPATIBLE", installResult);
-        }
-        finally {
+        } finally {
             getDevice().uninstallPackage(SHARED_UI_PKG);
             getDevice().uninstallPackage(SHARED_UI_DIFF_CERT_PKG);
         }
@@ -182,8 +152,7 @@
             assertNotNull("app upgrade with different cert than existing app installed " +
                     "successfully", installResult);
             assertEquals("INSTALL_FAILED_UPDATE_INCOMPATIBLE", installResult);
-        }
-        finally {
+        } finally {
             getDevice().uninstallPackage(SIMPLE_APP_PKG);
         }
     }
@@ -204,115 +173,21 @@
             assertNull(String.format("failed to install app with data. Reason: %s", installResult),
                     installResult);
             // run appwithdata's tests to create private data
-            assertTrue("failed to create app's private data", runDeviceTests(APP_WITH_DATA_PKG,
-                    APP_WITH_DATA_CLASS, APP_WITH_DATA_CREATE_METHOD));
+            runDeviceTests(APP_WITH_DATA_PKG, APP_WITH_DATA_CLASS, APP_WITH_DATA_CREATE_METHOD);
 
             installResult = getDevice().installPackage(getTestAppFile(APP_ACCESS_DATA_APK),
                     false, options);
             assertNull(String.format("failed to install app access data. Reason: %s",
                     installResult), installResult);
             // run appaccessdata's tests which attempt to access appwithdata's private data
-            assertTrue("could access app's private data", runDeviceTests(APP_ACCESS_DATA_PKG));
-        }
-        finally {
+            runDeviceTests(APP_ACCESS_DATA_PKG);
+        } finally {
             getDevice().uninstallPackage(APP_WITH_DATA_PKG);
             getDevice().uninstallPackage(APP_ACCESS_DATA_PKG);
         }
     }
 
     /**
-     * Verify that app with no external storage permissions works correctly.
-     */
-    public void testExternalStorageNone() throws Exception {
-        try {
-            wipePrimaryExternalStorage(getDevice());
-
-            getDevice().uninstallPackage(EXTERNAL_STORAGE_APP_PKG);
-            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
-            assertNull(getDevice()
-                    .installPackage(getTestAppFile(EXTERNAL_STORAGE_APP_APK), false, options));
-            assertTrue("Failed external storage with no permissions",
-                    runDeviceTests(EXTERNAL_STORAGE_APP_PKG));
-        } finally {
-            getDevice().uninstallPackage(EXTERNAL_STORAGE_APP_PKG);
-        }
-    }
-
-    /**
-     * Verify that app with
-     * {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} works
-     * correctly.
-     */
-    public void testExternalStorageRead() throws Exception {
-        try {
-            wipePrimaryExternalStorage(getDevice());
-
-            getDevice().uninstallPackage(READ_EXTERNAL_STORAGE_APP_PKG);
-            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
-            assertNull(getDevice()
-                    .installPackage(getTestAppFile(READ_EXTERNAL_STORAGE_APP_APK), false, options));
-            assertTrue("Failed external storage with read permissions",
-                    runDeviceTests(READ_EXTERNAL_STORAGE_APP_PKG));
-        } finally {
-            getDevice().uninstallPackage(READ_EXTERNAL_STORAGE_APP_PKG);
-        }
-    }
-
-    /**
-     * Verify that app with
-     * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} works
-     * correctly.
-     */
-    public void testExternalStorageWrite() throws Exception {
-        try {
-            wipePrimaryExternalStorage(getDevice());
-
-            getDevice().uninstallPackage(WRITE_EXTERNAL_STORAGE_APP_PKG);
-            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
-            assertNull(getDevice()
-                    .installPackage(getTestAppFile(WRITE_EXTERNAL_STORAGE_APP_APK), false, options));
-            assertTrue("Failed external storage with write permissions",
-                    runDeviceTests(WRITE_EXTERNAL_STORAGE_APP_PKG));
-        } finally {
-            getDevice().uninstallPackage(WRITE_EXTERNAL_STORAGE_APP_PKG);
-        }
-    }
-
-    /**
-     * Verify that app with WRITE_EXTERNAL can leave gifts in external storage
-     * directories belonging to other apps, and those apps can read.
-     */
-    public void testExternalStorageGifts() throws Exception {
-        try {
-            wipePrimaryExternalStorage(getDevice());
-
-            getDevice().uninstallPackage(EXTERNAL_STORAGE_APP_PKG);
-            getDevice().uninstallPackage(READ_EXTERNAL_STORAGE_APP_PKG);
-            getDevice().uninstallPackage(WRITE_EXTERNAL_STORAGE_APP_PKG);
-            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
-            assertNull(getDevice()
-                    .installPackage(getTestAppFile(EXTERNAL_STORAGE_APP_APK), false, options));
-            assertNull(getDevice()
-                    .installPackage(getTestAppFile(READ_EXTERNAL_STORAGE_APP_APK), false, options));
-            assertNull(getDevice()
-                    .installPackage(getTestAppFile(WRITE_EXTERNAL_STORAGE_APP_APK), false, options));
-
-            assertTrue("Failed to write gifts", runDeviceTests(WRITE_EXTERNAL_STORAGE_APP_PKG,
-                    WRITE_EXTERNAL_STORAGE_APP_CLASS, "doWriteGifts"));
-
-            assertTrue("Read failed to verify gifts", runDeviceTests(READ_EXTERNAL_STORAGE_APP_PKG,
-                    READ_EXTERNAL_STORAGE_APP_CLASS, "doVerifyGifts"));
-            assertTrue("None failed to verify gifts", runDeviceTests(EXTERNAL_STORAGE_APP_PKG,
-                    EXTERNAL_STORAGE_APP_CLASS, "doVerifyGifts"));
-
-        } finally {
-            getDevice().uninstallPackage(EXTERNAL_STORAGE_APP_PKG);
-            getDevice().uninstallPackage(READ_EXTERNAL_STORAGE_APP_PKG);
-            getDevice().uninstallPackage(WRITE_EXTERNAL_STORAGE_APP_PKG);
-        }
-    }
-
-    /**
      * Test that uninstall of an app removes its private data.
      */
     public void testUninstallRemovesData() throws Exception {
@@ -327,8 +202,7 @@
             assertNull(String.format("failed to install app with data. Reason: %s", installResult),
                     installResult);
             // run appwithdata's tests to create private data
-            assertTrue("failed to create app's private data", runDeviceTests(APP_WITH_DATA_PKG,
-                    APP_WITH_DATA_CLASS, APP_WITH_DATA_CREATE_METHOD));
+            runDeviceTests(APP_WITH_DATA_PKG, APP_WITH_DATA_CLASS, APP_WITH_DATA_CREATE_METHOD);
 
             getDevice().uninstallPackage(APP_WITH_DATA_PKG);
 
@@ -337,11 +211,9 @@
             assertNull(String.format("failed to install app with data second time. Reason: %s",
                     installResult), installResult);
             // run appwithdata's 'check if file exists' test
-            assertTrue("app's private data still exists after install", runDeviceTests(
-                    APP_WITH_DATA_PKG, APP_WITH_DATA_CLASS, APP_WITH_DATA_CHECK_NOEXIST_METHOD));
-
-        }
-        finally {
+            runDeviceTests(APP_WITH_DATA_PKG, APP_WITH_DATA_CLASS,
+                    APP_WITH_DATA_CHECK_NOEXIST_METHOD);
+        } finally {
             getDevice().uninstallPackage(APP_WITH_DATA_PKG);
         }
     }
@@ -371,10 +243,8 @@
             // run INSTRUMENT_DIFF_CERT_PKG tests
             // this test will attempt to call startInstrumentation directly and verify
             // SecurityException is thrown
-            assertTrue("running instrumentation with diff cert unexpectedly succeeded",
-                    runDeviceTests(INSTRUMENT_DIFF_CERT_PKG));
-        }
-        finally {
+            runDeviceTests(INSTRUMENT_DIFF_CERT_PKG);
+        } finally {
             getDevice().uninstallPackage(TARGET_INSTRUMENT_PKG);
             getDevice().uninstallPackage(INSTRUMENT_DIFF_CERT_PKG);
         }
@@ -409,191 +279,20 @@
             assertNull(String.format("failed to install permission app with diff cert. Reason: %s",
                     installResult), installResult);
             // run PERMISSION_DIFF_CERT_PKG tests which try to access the permission
-            TestRunResult result = doRunTests(PERMISSION_DIFF_CERT_PKG, null, null);
-            assertDeviceTestsPass(result);
-        }
-        finally {
+            runDeviceTests(PERMISSION_DIFF_CERT_PKG);
+        } finally {
             getDevice().uninstallPackage(DECLARE_PERMISSION_PKG);
             getDevice().uninstallPackage(DECLARE_PERMISSION_COMPAT_PKG);
             getDevice().uninstallPackage(PERMISSION_DIFF_CERT_PKG);
         }
     }
 
-    /**
-     * Test multi-user emulated storage environment, ensuring that each user has
-     * isolated storage.
-     */
-    public void testMultiUserStorage() throws Exception {
-        final String PACKAGE = MULTIUSER_STORAGE_PKG;
-        final String CLAZZ = MULTIUSER_STORAGE_CLASS;
-
-        if (!isMultiUserSupportedOnDevice(getDevice())) {
-            Log.d(LOG_TAG, "Single user device; skipping isolated storage tests");
-            return;
-        }
-
-        int owner = 0;
-        int secondary = -1;
-        try {
-            // Create secondary user
-            secondary = createUserOnDevice(getDevice());
-
-            // Install our test app
-            getDevice().uninstallPackage(MULTIUSER_STORAGE_PKG);
-            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
-            final String installResult = getDevice()
-                    .installPackage(getTestAppFile(MULTIUSER_STORAGE_APK), false, options);
-            assertNull("Failed to install: " + installResult, installResult);
-
-            // Clear data from previous tests
-            assertDeviceTestsPass(
-                    doRunTestsAsUser(PACKAGE, CLAZZ, "cleanIsolatedStorage", owner));
-            assertDeviceTestsPass(
-                    doRunTestsAsUser(PACKAGE, CLAZZ, "cleanIsolatedStorage", secondary));
-
-            // Have both users try writing into isolated storage
-            assertDeviceTestsPass(
-                    doRunTestsAsUser(PACKAGE, CLAZZ, "writeIsolatedStorage", owner));
-            assertDeviceTestsPass(
-                    doRunTestsAsUser(PACKAGE, CLAZZ, "writeIsolatedStorage", secondary));
-
-            // Verify they both have isolated view of storage
-            assertDeviceTestsPass(
-                    doRunTestsAsUser(PACKAGE, CLAZZ, "readIsolatedStorage", owner));
-            assertDeviceTestsPass(
-                    doRunTestsAsUser(PACKAGE, CLAZZ, "readIsolatedStorage", secondary));
-        } finally {
-            getDevice().uninstallPackage(MULTIUSER_STORAGE_PKG);
-            if (secondary != -1) {
-                removeUserOnDevice(getDevice(), secondary);
-            }
-        }
+    private void runDeviceTests(String packageName) throws DeviceNotAvailableException {
+        Utils.runDeviceTests(getDevice(), packageName);
     }
 
-    /**
-     * Helper method that checks that all tests in given result passed, and attempts to generate
-     * a meaningful error message if they failed.
-     *
-     * @param result
-     */
-    private void assertDeviceTestsPass(TestRunResult result) {
-        // TODO: consider rerunning if this occurred
-        assertFalse(String.format("Failed to successfully run device tests for %s. Reason: %s",
-                result.getName(), result.getRunFailureMessage()), result.isRunFailure());
-
-        if (result.hasFailedTests()) {
-            // build a meaningful error message
-            StringBuilder errorBuilder = new StringBuilder("on-device tests failed:\n");
-            for (Map.Entry<TestIdentifier, TestResult> resultEntry :
-                result.getTestResults().entrySet()) {
-                if (!resultEntry.getValue().getStatus().equals(TestStatus.PASSED)) {
-                    errorBuilder.append(resultEntry.getKey().toString());
-                    errorBuilder.append(":\n");
-                    errorBuilder.append(resultEntry.getValue().getStackTrace());
-                }
-            }
-            fail(errorBuilder.toString());
-        }
-    }
-
-    /**
-     * Helper method that will the specified packages tests on device.
-     *
-     * @param pkgName Android application package for tests
-     * @return <code>true</code> if all tests passed.
-     * @throws DeviceNotAvailableException if connection to device was lost.
-     */
-    private boolean runDeviceTests(String pkgName) throws DeviceNotAvailableException {
-        return runDeviceTests(pkgName, null, null);
-    }
-
-    /**
-     * Helper method that will the specified packages tests on device.
-     *
-     * @param pkgName Android application package for tests
-     * @return <code>true</code> if all tests passed.
-     * @throws DeviceNotAvailableException if connection to device was lost.
-     */
-    private boolean runDeviceTests(String pkgName, String testClassName, String testMethodName)
+    private void runDeviceTests(String packageName, String testClassName, String testMethodName)
             throws DeviceNotAvailableException {
-        TestRunResult runResult = doRunTests(pkgName, testClassName, testMethodName);
-        return !runResult.hasFailedTests();
-    }
-
-    /**
-     * Helper method to run tests and return the listener that collected the results.
-     *
-     * @param pkgName Android application package for tests
-     * @return the {@link TestRunResult}
-     * @throws DeviceNotAvailableException if connection to device was lost.
-     */
-    private TestRunResult doRunTests(String pkgName, String testClassName,
-            String testMethodName) throws DeviceNotAvailableException {
-
-        RemoteAndroidTestRunner testRunner = new RemoteAndroidTestRunner(pkgName,
-                RUNNER, getDevice().getIDevice());
-        if (testClassName != null && testMethodName != null) {
-            testRunner.setMethodName(testClassName, testMethodName);
-        }
-        CollectingTestListener listener = new CollectingTestListener();
-        getDevice().runInstrumentationTests(testRunner, listener);
-        return listener.getCurrentRunResults();
-    }
-
-    private static boolean isMultiUserSupportedOnDevice(ITestDevice device)
-            throws DeviceNotAvailableException {
-        // TODO: move this to ITestDevice once it supports users
-        final String output = device.executeShellCommand("pm get-max-users");
-        try {
-            return Integer.parseInt(output.substring(output.lastIndexOf(" ")).trim()) > 1;
-        } catch (NumberFormatException e) {
-            fail("Failed to parse result: " + output);
-        }
-        return false;
-    }
-
-    private static int createUserOnDevice(ITestDevice device) throws DeviceNotAvailableException {
-        // TODO: move this to ITestDevice once it supports users
-        final String name = "CTS_" + System.currentTimeMillis();
-        final String output = device.executeShellCommand("pm create-user " + name);
-        if (output.startsWith("Success")) {
-            try {
-                return Integer.parseInt(output.substring(output.lastIndexOf(" ")).trim());
-            } catch (NumberFormatException e) {
-                fail("Failed to parse result: " + output);
-            }
-        } else {
-            fail("Failed to create user: " + output);
-        }
-        throw new IllegalStateException();
-    }
-
-    private static void removeUserOnDevice(ITestDevice device, int userId)
-            throws DeviceNotAvailableException {
-        // TODO: move this to ITestDevice once it supports users
-        final String output = device.executeShellCommand("pm remove-user " + userId);
-        if (output.startsWith("Error")) {
-            fail("Failed to remove user: " + output);
-        }
-    }
-
-    private TestRunResult doRunTestsAsUser(
-            String pkgName, String testClassName, String testMethodName, int userId)
-            throws DeviceNotAvailableException {
-        // TODO: move this to RemoteAndroidTestRunner once it supports users
-        final String cmd = "am instrument --user " + userId + " -w -r -e class " + testClassName
-                + "#" + testMethodName + " " + pkgName + "/" + RUNNER;
-        Log.i(LOG_TAG, "Running " + cmd + " on " + getDevice().getSerialNumber());
-
-        CollectingTestListener listener = new CollectingTestListener();
-        InstrumentationResultParser parser = new InstrumentationResultParser(pkgName, listener);
-
-        getDevice().executeShellCommand(cmd, parser);
-        return listener.getCurrentRunResults();
-    }
-
-    private static void wipePrimaryExternalStorage(ITestDevice device)
-            throws DeviceNotAvailableException {
-        device.executeShellCommand("rm -rf /sdcard/*");
+        Utils.runDeviceTests(getDevice(), packageName, testClassName, testMethodName);
     }
 }
diff --git a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/DocumentsTest.java b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/DocumentsTest.java
index fbde558..a4ec65a 100644
--- a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/DocumentsTest.java
+++ b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/DocumentsTest.java
@@ -24,6 +24,10 @@
 import com.android.tradefed.testtype.IAbiReceiver;
 import com.android.tradefed.testtype.IBuildReceiver;
 
+/**
+ * Set of tests that verify behavior of
+ * {@link android.provider.DocumentsContract} and related intents.
+ */
 public class DocumentsTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
     private static final String PROVIDER_PKG = "com.android.cts.documentprovider";
     private static final String PROVIDER_APK = "CtsDocumentProvider.apk";
diff --git a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/ExternalStorageHostTest.java b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/ExternalStorageHostTest.java
new file mode 100644
index 0000000..cb67c63
--- /dev/null
+++ b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/ExternalStorageHostTest.java
@@ -0,0 +1,249 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.appsecurity;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.util.AbiUtils;
+import com.android.ddmlib.Log;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
+import com.android.tradefed.testtype.IBuildReceiver;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+
+/**
+ * Set of tests that verify behavior of external storage devices.
+ */
+public class ExternalStorageHostTest extends DeviceTestCase
+        implements IAbiReceiver, IBuildReceiver {
+    private static final String TAG = "ExternalStorageHostTest";
+
+    private static final String COMMON_CLASS =
+            "com.android.cts.externalstorageapp.CommonExternalStorageTest";
+
+    private static final String NONE_APK = "CtsExternalStorageApp.apk";
+    private static final String NONE_PKG = "com.android.cts.externalstorageapp";
+    private static final String NONE_CLASS = ".ExternalStorageTest";
+    private static final String READ_APK = "CtsReadExternalStorageApp.apk";
+    private static final String READ_PKG = "com.android.cts.readexternalstorageapp";
+    private static final String READ_CLASS = ".ReadExternalStorageTest";
+    private static final String WRITE_APK = "CtsWriteExternalStorageApp.apk";
+    private static final String WRITE_PKG = "com.android.cts.writeexternalstorageapp";
+    private static final String WRITE_CLASS = ".WriteExternalStorageTest";
+    private static final String MULTIUSER_APK = "CtsMultiUserStorageApp.apk";
+    private static final String MULTIUSER_PKG = "com.android.cts.multiuserstorageapp";
+    private static final String MULTIUSER_CLASS = ".MultiUserStorageTest";
+
+    private IAbi mAbi;
+    private CtsBuildHelper mCtsBuild;
+
+    @Override
+    public void setAbi(IAbi abi) {
+        mAbi = abi;
+    }
+
+    @Override
+    public void setBuild(IBuildInfo buildInfo) {
+        mCtsBuild = CtsBuildHelper.createBuildHelper(buildInfo);
+    }
+
+    private File getTestAppFile(String fileName) throws FileNotFoundException {
+        return mCtsBuild.getTestApp(fileName);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        assertNotNull(mAbi);
+        assertNotNull(mCtsBuild);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    /**
+     * Verify that app with no external storage permissions works correctly.
+     */
+    public void testExternalStorageNone() throws Exception {
+        final int[] users = createUsersForTest();
+        try {
+            wipePrimaryExternalStorage();
+
+            getDevice().uninstallPackage(NONE_PKG);
+            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+            assertNull(getDevice().installPackage(getTestAppFile(NONE_APK), false, options));
+
+            for (int user : users) {
+                runDeviceTests(NONE_PKG, COMMON_CLASS, user);
+                runDeviceTests(NONE_PKG, NONE_CLASS, user);
+            }
+        } finally {
+            getDevice().uninstallPackage(NONE_PKG);
+            removeUsersForTest(users);
+        }
+    }
+
+    /**
+     * Verify that app with
+     * {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} works
+     * correctly.
+     */
+    public void testExternalStorageRead() throws Exception {
+        final int[] users = createUsersForTest();
+        try {
+            wipePrimaryExternalStorage();
+
+            getDevice().uninstallPackage(READ_PKG);
+            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+            assertNull(getDevice().installPackage(getTestAppFile(READ_APK), false, options));
+
+            for (int user : users) {
+                runDeviceTests(READ_PKG, COMMON_CLASS, user);
+                runDeviceTests(READ_PKG, READ_CLASS, user);
+            }
+        } finally {
+            getDevice().uninstallPackage(READ_PKG);
+            removeUsersForTest(users);
+        }
+    }
+
+    /**
+     * Verify that app with
+     * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} works
+     * correctly.
+     */
+    public void testExternalStorageWrite() throws Exception {
+        final int[] users = createUsersForTest();
+        try {
+            wipePrimaryExternalStorage();
+
+            getDevice().uninstallPackage(WRITE_PKG);
+            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+            assertNull(getDevice().installPackage(getTestAppFile(WRITE_APK), false, options));
+
+            for (int user : users) {
+                runDeviceTests(WRITE_PKG, COMMON_CLASS, user);
+                runDeviceTests(WRITE_PKG, WRITE_CLASS, user);
+            }
+        } finally {
+            getDevice().uninstallPackage(WRITE_PKG);
+            removeUsersForTest(users);
+        }
+    }
+
+    /**
+     * Verify that app with WRITE_EXTERNAL can leave gifts in external storage
+     * directories belonging to other apps, and those apps can read.
+     */
+    public void testExternalStorageGifts() throws Exception {
+        final int[] users = createUsersForTest();
+        try {
+            wipePrimaryExternalStorage();
+
+            getDevice().uninstallPackage(NONE_PKG);
+            getDevice().uninstallPackage(READ_PKG);
+            getDevice().uninstallPackage(WRITE_PKG);
+            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+            assertNull(getDevice().installPackage(getTestAppFile(NONE_APK), false, options));
+            assertNull(getDevice().installPackage(getTestAppFile(READ_APK), false, options));
+            assertNull(getDevice().installPackage(getTestAppFile(WRITE_APK), false, options));
+
+            for (int user : users) {
+                runDeviceTests(WRITE_PKG, "WriteGiftTest", user);
+                runDeviceTests(READ_PKG, "ReadGiftTest", user);
+                runDeviceTests(NONE_PKG, "GiftTest", user);
+            }
+        } finally {
+            getDevice().uninstallPackage(NONE_PKG);
+            getDevice().uninstallPackage(READ_PKG);
+            getDevice().uninstallPackage(WRITE_PKG);
+            removeUsersForTest(users);
+        }
+    }
+
+    /**
+     * Test multi-user emulated storage environment, ensuring that each user has
+     * isolated storage.
+     */
+    public void testMultiUserStorageIsolated() throws Exception {
+        final int[] users = createUsersForTest();
+        try {
+            if (users.length == 1) {
+                Log.d(TAG, "Single user device; skipping isolated storage tests");
+                return;
+            }
+
+            final int owner = users[0];
+            final int secondary = users[1];
+
+            // Install our test app
+            getDevice().uninstallPackage(MULTIUSER_PKG);
+            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+            final String installResult = getDevice()
+                    .installPackage(getTestAppFile(MULTIUSER_APK), false, options);
+            assertNull("Failed to install: " + installResult, installResult);
+
+            // Clear data from previous tests
+            runDeviceTests(MULTIUSER_PKG, MULTIUSER_CLASS, "testCleanIsolatedStorage", owner);
+            runDeviceTests(MULTIUSER_PKG, MULTIUSER_CLASS, "testCleanIsolatedStorage", secondary);
+
+            // Have both users try writing into isolated storage
+            runDeviceTests(MULTIUSER_PKG, MULTIUSER_CLASS, "testWriteIsolatedStorage", owner);
+            runDeviceTests(MULTIUSER_PKG, MULTIUSER_CLASS, "testWriteIsolatedStorage", secondary);
+
+            // Verify they both have isolated view of storage
+            runDeviceTests(MULTIUSER_PKG, MULTIUSER_CLASS, "testReadIsolatedStorage", owner);
+            runDeviceTests(MULTIUSER_PKG, MULTIUSER_CLASS, "testReadIsolatedStorage", secondary);
+
+            // Verify they can't poke at each other
+            runDeviceTests(MULTIUSER_PKG, MULTIUSER_CLASS, "testUserIsolation", owner);
+            runDeviceTests(MULTIUSER_PKG, MULTIUSER_CLASS, "testUserIsolation", secondary);
+        } finally {
+            getDevice().uninstallPackage(MULTIUSER_PKG);
+            removeUsersForTest(users);
+        }
+    }
+
+    private void wipePrimaryExternalStorage() throws DeviceNotAvailableException {
+        getDevice().executeShellCommand("rm -rf /sdcard/*");
+    }
+
+    private int[] createUsersForTest() throws DeviceNotAvailableException {
+        return Utils.createUsersForTest(getDevice());
+    }
+
+    private void removeUsersForTest(int[] users) throws DeviceNotAvailableException {
+        Utils.removeUsersForTest(getDevice(), users);
+    }
+
+    private void runDeviceTests(String packageName, String testClassName, int userId)
+            throws DeviceNotAvailableException {
+        Utils.runDeviceTests(getDevice(), packageName, testClassName, userId);
+    }
+
+    private void runDeviceTests(String packageName, String testClassName, String testMethodName,
+            int userId) throws DeviceNotAvailableException {
+        Utils.runDeviceTests(getDevice(), packageName, testClassName, testMethodName, userId);
+    }
+}
diff --git a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/KeySetHostTest.java b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/KeySetHostTest.java
index dae5ee7..9637a6c 100644
--- a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/KeySetHostTest.java
+++ b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/KeySetHostTest.java
@@ -66,6 +66,20 @@
             "CtsKeySetSigningAAndBUpgradeB.apk";
     private static final String A_AND_C_SIGNED_B_UPGRADE =
             "CtsKeySetSigningAAndCUpgradeB.apk";
+    private static final String SHARED_USR_A_SIGNED_B_UPGRADE =
+            "CtsKeySetSharedUserSigningAUpgradeB.apk";
+    private static final String SHARED_USR_B_SIGNED_B_UPGRADE =
+            "CtsKeySetSharedUserSigningBUpgradeB.apk";
+    private static final String A_SIGNED_BAD_B_B_UPGRADE =
+            "CtsKeySetSigningABadUpgradeB.apk";
+    private static final String C_SIGNED_BAD_A_AB_UPGRADE =
+            "CtsKeySetSigningCBadAUpgradeAB.apk";
+    private static final String A_SIGNED_NO_B_B_UPGRADE =
+            "CtsKeySetSigningANoDefUpgradeB.apk";
+    private static final String A_SIGNED_EC_A_UPGRADE =
+            "CtsKeySetSigningAUpgradeEcA.apk";
+    private static final String EC_A_SIGNED_A_UPGRADE =
+            "CtsKeySetSigningEcAUpgradeA.apk";
 
     /* package which defines the KEYSET_PERM_NAME signature permission */
     private static final String KEYSET_PERM_DEF_PKG =
@@ -432,4 +446,70 @@
         testKeyRotationPerm(PERM_DEF_A_SIGNED, PERM_USE_A_SIGNED, PERM_DEF_B_SIGNED,
                 true, false);
     }
-}
\ No newline at end of file
+
+    /*
+     * Check if an apk which indicates it uses a sharedUserId and defines an
+     * upgrade keyset is allowed to rotate to that keyset.
+     */
+    public void testUpgradeSharedUser() throws Exception {
+        String installResult = testPackageUpgrade(KEYSET_PKG, SHARED_USR_A_SIGNED_B_UPGRADE,
+                SHARED_USR_B_SIGNED_B_UPGRADE);
+        assertNotNull("upgrade allowed for app with shareduserid!", installResult);
+    }
+
+    /*
+     * Check that an apk with an upgrade key represented by a bad public key
+     * fails to install.
+     */
+    public void testBadUpgradeBadPubKey() throws Exception {
+        mDevice.uninstallPackage(KEYSET_PKG);
+        String installResult = mDevice.installPackage(getTestAppFile(A_SIGNED_BAD_B_B_UPGRADE),
+                false);
+        assertNotNull("Installation of apk with upgrade key referring to a bad public key succeeded!",
+                installResult);
+    }
+
+    /*
+     * Check that an apk with an upgrade keyset that includes a bad public key fails to install.
+     */
+    public void testBadUpgradeMissingPubKey() throws Exception {
+        mDevice.uninstallPackage(KEYSET_PKG);
+        String installResult = mDevice.installPackage(getTestAppFile(C_SIGNED_BAD_A_AB_UPGRADE),
+                false);
+        assertNotNull("Installation of apk with upgrade key referring to a bad public key succeeded!",
+                installResult);
+    }
+
+    /*
+     * Check that an apk with an upgrade key that has no corresponding public key fails to install.
+     */
+    public void testBadUpgradeNoPubKey() throws Exception {
+        mDevice.uninstallPackage(KEYSET_PKG);
+        String installResult = mDevice.installPackage(getTestAppFile(A_SIGNED_NO_B_B_UPGRADE),
+                false);
+        assertNotNull("Installation of apk with upgrade key referring to a bad public key succeeded!",
+                installResult);
+    }
+
+    /*
+     * Check if an apk signed by RSA pub key can upgrade to apk signed by EC key.
+     */
+    public void testUpgradeKSRsaToEC() throws Exception {
+        String installResult = testPackageUpgrade(KEYSET_PKG, A_SIGNED_EC_A_UPGRADE,
+                EC_A_SIGNED_A_UPGRADE);
+        assertNull(String.format("failed to upgrade keyset app from one signed by RSA key"
+                 + "to version signed by EC upgrade-key-set, Reason: %s", installResult),
+                 installResult);
+    }
+
+    /*
+     * Check if an apk signed by EC pub key can upgrade to apk signed by RSA key.
+     */
+    public void testUpgradeKSECToRSA() throws Exception {
+        String installResult = testPackageUpgrade(KEYSET_PKG, EC_A_SIGNED_A_UPGRADE,
+                A_SIGNED_EC_A_UPGRADE);
+        assertNull(String.format("failed to upgrade keyset app from one signed by EC key"
+                 + "to version signed by RSA upgrade-key-set, Reason: %s", installResult),
+                 installResult);
+    }
+}
diff --git a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/PermissionsHostTest.java b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/PermissionsHostTest.java
new file mode 100644
index 0000000..20a92aa
--- /dev/null
+++ b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/PermissionsHostTest.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.appsecurity;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
+import com.android.tradefed.testtype.IBuildReceiver;
+
+/**
+ * Set of tests that verify behavior of runtime permissions, including both
+ * dynamic granting and behavior of legacy apps.
+ */
+public class PermissionsHostTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
+    private static final String PKG = "com.android.cts.usepermission";
+
+    private static final String APK = "CtsUsePermissionApp.apk";
+    private static final String APK_COMPAT = "CtsUsePermissionAppCompat.apk";
+
+    private IAbi mAbi;
+    private CtsBuildHelper mCtsBuild;
+
+    @Override
+    public void setAbi(IAbi abi) {
+        mAbi = abi;
+    }
+
+    @Override
+    public void setBuild(IBuildInfo buildInfo) {
+        mCtsBuild = CtsBuildHelper.createBuildHelper(buildInfo);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        assertNotNull(mAbi);
+        assertNotNull(mCtsBuild);
+
+        getDevice().uninstallPackage(PKG);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+
+        getDevice().uninstallPackage(PKG);
+    }
+
+    public void testFail() throws Exception {
+        // Sanity check that remote failure is host failure
+        assertNull(getDevice().installPackage(mCtsBuild.getTestApp(APK), false, false));
+        try {
+            runDeviceTests(PKG, ".UsePermissionTest", "testFail");
+            fail("Expected remote failure");
+        } catch (AssertionError expected) {
+        }
+    }
+
+    public void testKill() throws Exception {
+        // Sanity check that remote kill is host failure
+        assertNull(getDevice().installPackage(mCtsBuild.getTestApp(APK), false, false));
+        try {
+            runDeviceTests(PKG, ".UsePermissionTest", "testKill");
+            fail("Expected remote failure");
+        } catch (AssertionError expected) {
+        }
+    }
+
+    public void testDefault() throws Exception {
+        assertNull(getDevice().installPackage(mCtsBuild.getTestApp(APK), false, false));
+        runDeviceTests(PKG, ".UsePermissionTest", "testDefault");
+    }
+
+    public void testGranted() throws Exception {
+        assertNull(getDevice().installPackage(mCtsBuild.getTestApp(APK), false, false));
+        grantPermission(PKG, "android.permission.READ_EXTERNAL_STORAGE");
+        grantPermission(PKG, "android.permission.WRITE_EXTERNAL_STORAGE");
+        runDeviceTests(PKG, ".UsePermissionTest", "testGranted");
+    }
+
+    public void testInteractiveGrant() throws Exception {
+        assertNull(getDevice().installPackage(mCtsBuild.getTestApp(APK), false, false));
+        runDeviceTests(PKG, ".UsePermissionTest", "testInteractiveGrant");
+    }
+
+    public void testRuntimeGroupGrantSpecificity() throws Exception {
+        assertNull(getDevice().installPackage(mCtsBuild.getTestApp(APK), false, false));
+        runDeviceTests(PKG, ".UsePermissionTest", "testRuntimeGroupGrantSpecificity");
+    }
+
+    public void testRuntimeGroupGrantExpansion() throws Exception {
+        assertNull(getDevice().installPackage(mCtsBuild.getTestApp(APK), false, false));
+        runDeviceTests(PKG, ".UsePermissionTest", "testRuntimeGroupGrantExpansion");
+    }
+
+    public void testCompatDefault() throws Exception {
+        assertNull(getDevice().installPackage(mCtsBuild.getTestApp(APK_COMPAT), false, false));
+        runDeviceTests(PKG, ".UsePermissionCompatTest", "testCompatDefault");
+    }
+
+    public void testCompatRevoked() throws Exception {
+        assertNull(getDevice().installPackage(mCtsBuild.getTestApp(APK_COMPAT), false, false));
+        setAppOps(PKG, "android:read_external_storage", "deny");
+        setAppOps(PKG, "android:write_external_storage", "deny");
+        runDeviceTests(PKG, ".UsePermissionCompatTest", "testCompatRevoked");
+    }
+
+    private void runDeviceTests(String packageName, String testClassName, String testMethodName)
+            throws DeviceNotAvailableException {
+        Utils.runDeviceTests(getDevice(), packageName, testClassName, testMethodName);
+    }
+
+    private void grantPermission(String pkg, String permission) throws Exception {
+        assertEmpty(getDevice().executeShellCommand("pm grant " + pkg + " " + permission));
+    }
+
+    private void revokePermission(String pkg, String permission) throws Exception {
+        assertEmpty(getDevice().executeShellCommand("pm revoke " + pkg + " " + permission));
+    }
+
+    private void setAppOps(String pkg, String op, String mode) throws Exception {
+        assertEmpty(getDevice().executeShellCommand("appops set " + pkg + " " + op + " " + mode));
+    }
+
+    private static void assertEmpty(String str) {
+        if (str == null || str.length() == 0) {
+            return;
+        } else {
+            fail("Expected empty string but found " + str);
+        }
+    }
+}
diff --git a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/SplitTests.java b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/SplitTests.java
index 90cbed9..ef3af8d 100644
--- a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/SplitTests.java
+++ b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/SplitTests.java
@@ -36,14 +36,15 @@
  * Tests that verify installing of various split APKs from host side.
  */
 public class SplitTests extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
-    private static final String PKG = "com.android.cts.splitapp";
+    static final String PKG = "com.android.cts.splitapp";
+    static final String CLASS = ".SplitAppTest";
 
-    private static final String APK = "CtsSplitApp.apk";
+    static final String APK = "CtsSplitApp.apk";
 
-    private static final String APK_mdpi = "CtsSplitApp_mdpi-v4.apk";
-    private static final String APK_hdpi = "CtsSplitApp_hdpi-v4.apk";
-    private static final String APK_xhdpi = "CtsSplitApp_xhdpi-v4.apk";
-    private static final String APK_xxhdpi = "CtsSplitApp_xxhdpi-v4.apk";
+    static final String APK_mdpi = "CtsSplitApp_mdpi-v4.apk";
+    static final String APK_hdpi = "CtsSplitApp_hdpi-v4.apk";
+    static final String APK_xhdpi = "CtsSplitApp_xhdpi-v4.apk";
+    static final String APK_xxhdpi = "CtsSplitApp_xxhdpi-v4.apk";
 
     private static final String APK_v7 = "CtsSplitApp_v7.apk";
     private static final String APK_fr = "CtsSplitApp_fr.apk";
@@ -69,7 +70,7 @@
     private static final String APK_FEATURE = "CtsSplitAppFeature.apk";
     private static final String APK_FEATURE_v7 = "CtsSplitAppFeature_v7.apk";
 
-    private static final HashMap<String, String> ABI_TO_APK = new HashMap<>();
+    static final HashMap<String, String> ABI_TO_APK = new HashMap<>();
 
     static {
         ABI_TO_APK.put("x86", APK_x86);
@@ -113,18 +114,18 @@
 
     public void testSingleBase() throws Exception {
         new InstallMultiple().addApk(APK).run();
-        runDeviceTests(PKG, ".SplitAppTest", "testSingleBase");
+        runDeviceTests(PKG, CLASS, "testSingleBase");
     }
 
     public void testDensitySingle() throws Exception {
         new InstallMultiple().addApk(APK).addApk(APK_mdpi).run();
-        runDeviceTests(PKG, ".SplitAppTest", "testDensitySingle");
+        runDeviceTests(PKG, CLASS, "testDensitySingle");
     }
 
     public void testDensityAll() throws Exception {
         new InstallMultiple().addApk(APK).addApk(APK_mdpi).addApk(APK_hdpi).addApk(APK_xhdpi)
                 .addApk(APK_xxhdpi).run();
-        runDeviceTests(PKG, ".SplitAppTest", "testDensityAll");
+        runDeviceTests(PKG, CLASS, "testDensityAll");
     }
 
     /**
@@ -133,11 +134,11 @@
      */
     public void testDensityBest() throws Exception {
         new InstallMultiple().addApk(APK).addApk(APK_mdpi).run();
-        runDeviceTests(PKG, ".SplitAppTest", "testDensityBest1");
+        runDeviceTests(PKG, CLASS, "testDensityBest1");
 
         // Now splice in an additional split which offers better resources
         new InstallMultiple().inheritFrom(PKG).addApk(APK_xxhdpi).run();
-        runDeviceTests(PKG, ".SplitAppTest", "testDensityBest2");
+        runDeviceTests(PKG, CLASS, "testDensityBest2");
     }
 
     /**
@@ -146,12 +147,12 @@
      */
     public void testApi() throws Exception {
         new InstallMultiple().addApk(APK).addApk(APK_v7).run();
-        runDeviceTests(PKG, ".SplitAppTest", "testApi");
+        runDeviceTests(PKG, CLASS, "testApi");
     }
 
     public void testLocale() throws Exception {
         new InstallMultiple().addApk(APK).addApk(APK_de).addApk(APK_fr).run();
-        runDeviceTests(PKG, ".SplitAppTest", "testLocale");
+        runDeviceTests(PKG, CLASS, "testLocale");
     }
 
     /**
@@ -164,7 +165,7 @@
         assertNotNull("Failed to find APK for ABI " + abi, apk);
 
         new InstallMultiple().addApk(APK).addApk(apk).run();
-        runDeviceTests(PKG, ".SplitAppTest", "testNative");
+        runDeviceTests(PKG, CLASS, "testNative");
     }
 
     /**
@@ -179,7 +180,7 @@
         assertNotNull("Failed to find APK for ABI " + abi, apk);
 
         new InstallMultiple().useNaturalAbi().addApk(APK).addApk(apk).run();
-        runDeviceTests(PKG, ".SplitAppTest", "testNative");
+        runDeviceTests(PKG, CLASS, "testNative");
     }
 
     /**
@@ -192,7 +193,7 @@
             inst.addApk(apk);
         }
         inst.run();
-        runDeviceTests(PKG, ".SplitAppTest", "testNative");
+        runDeviceTests(PKG, CLASS, "testNative");
     }
 
     /**
@@ -207,7 +208,7 @@
             inst.addApk(apk);
         }
         inst.run();
-        runDeviceTests(PKG, ".SplitAppTest", "testNative");
+        runDeviceTests(PKG, CLASS, "testNative");
     }
 
     public void testDuplicateBase() throws Exception {
@@ -238,21 +239,21 @@
 
     public void testDiffRevision() throws Exception {
         new InstallMultiple().addApk(APK).addApk(APK_DIFF_REVISION_v7).run();
-        runDeviceTests(PKG, ".SplitAppTest", "testRevision0_12");
+        runDeviceTests(PKG, CLASS, "testRevision0_12");
     }
 
     public void testDiffRevisionInheritBase() throws Exception {
         new InstallMultiple().addApk(APK).addApk(APK_v7).run();
-        runDeviceTests(PKG, ".SplitAppTest", "testRevision0_0");
+        runDeviceTests(PKG, CLASS, "testRevision0_0");
         new InstallMultiple().inheritFrom(PKG).addApk(APK_DIFF_REVISION_v7).run();
-        runDeviceTests(PKG, ".SplitAppTest", "testRevision0_12");
+        runDeviceTests(PKG, CLASS, "testRevision0_12");
     }
 
     public void testDiffRevisionInheritSplit() throws Exception {
         new InstallMultiple().addApk(APK).addApk(APK_v7).run();
-        runDeviceTests(PKG, ".SplitAppTest", "testRevision0_0");
+        runDeviceTests(PKG, CLASS, "testRevision0_0");
         new InstallMultiple().inheritFrom(PKG).addApk(APK_DIFF_REVISION).run();
-        runDeviceTests(PKG, ".SplitAppTest", "testRevision12_0");
+        runDeviceTests(PKG, CLASS, "testRevision12_0");
     }
 
     public void testDiffRevisionDowngrade() throws Exception {
@@ -262,12 +263,12 @@
 
     public void testFeatureBase() throws Exception {
         new InstallMultiple().addApk(APK).addApk(APK_FEATURE).run();
-        runDeviceTests(PKG, ".SplitAppTest", "testFeatureBase");
+        runDeviceTests(PKG, CLASS, "testFeatureBase");
     }
 
     public void testFeatureApi() throws Exception {
         new InstallMultiple().addApk(APK).addApk(APK_FEATURE).addApk(APK_FEATURE_v7).run();
-        runDeviceTests(PKG, ".SplitAppTest", "testFeatureApi");
+        runDeviceTests(PKG, CLASS, "testFeatureApi");
     }
 
     public void testInheritUpdatedBase() throws Exception {
@@ -283,35 +284,72 @@
      */
     public void testClearCodeCache() throws Exception {
         new InstallMultiple().addApk(APK).run();
-        runDeviceTests(PKG, ".SplitAppTest", "testCodeCacheWrite");
+        runDeviceTests(PKG, CLASS, "testCodeCacheWrite");
         new InstallMultiple().addArg("-r").addApk(APK_DIFF_VERSION).run();
-        runDeviceTests(PKG, ".SplitAppTest", "testCodeCacheRead");
+        runDeviceTests(PKG, CLASS, "testCodeCacheRead");
     }
 
-    class InstallMultiple {
-        private List<String> mArgs = new ArrayList<>();
-        private List<File> mApks = new ArrayList<>();
+    private class InstallMultiple extends BaseInstallMultiple<InstallMultiple> {
+        public InstallMultiple() {
+            super(getDevice(), mCtsBuild, mAbi);
+        }
+    }
+
+    public static class BaseInstallMultiple<T extends BaseInstallMultiple<?>> {
+        private final ITestDevice mDevice;
+        private final CtsBuildHelper mBuild;
+        private final IAbi mAbi;
+
+        private final List<String> mArgs = new ArrayList<>();
+        private final List<File> mApks = new ArrayList<>();
         private boolean mUseNaturalAbi;
 
-        InstallMultiple addArg(String arg) {
+        public BaseInstallMultiple(ITestDevice device, CtsBuildHelper build, IAbi abi) {
+            mDevice = device;
+            mBuild = build;
+            mAbi = abi;
+            addArg("-g");
+        }
+
+        T addArg(String arg) {
             mArgs.add(arg);
-            return this;
+            return (T) this;
         }
 
-        InstallMultiple addApk(String apk) throws FileNotFoundException {
-            mApks.add(mCtsBuild.getTestApp(apk));
-            return this;
+        T addApk(String apk) throws FileNotFoundException {
+            mApks.add(mBuild.getTestApp(apk));
+            return (T) this;
         }
 
-        InstallMultiple inheritFrom(String packageName) {
+        T inheritFrom(String packageName) {
             addArg("-r");
             addArg("-p " + packageName);
-            return this;
+            return (T) this;
         }
 
-        InstallMultiple useNaturalAbi() {
+        T useNaturalAbi() {
             mUseNaturalAbi = true;
-            return this;
+            return (T) this;
+        }
+
+        T locationAuto() {
+            addArg("--install-location 0");
+            return (T) this;
+        }
+
+        T locationInternalOnly() {
+            addArg("--install-location 1");
+            return (T) this;
+        }
+
+        T locationPreferExternal() {
+            addArg("--install-location 2");
+            return (T) this;
+        }
+
+        T forceUuid(String uuid) {
+            addArg("--force-uuid " + uuid);
+            return (T) this;
         }
 
         void run() throws DeviceNotAvailableException {
@@ -323,7 +361,7 @@
         }
 
         private void run(boolean expectingSuccess) throws DeviceNotAvailableException {
-            final ITestDevice device = getDevice();
+            final ITestDevice device = mDevice;
 
             // Create an install session
             final StringBuilder cmd = new StringBuilder();
diff --git a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/Utils.java b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/Utils.java
index c58d6bf..fdf84d3 100644
--- a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/Utils.java
+++ b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/Utils.java
@@ -16,6 +16,7 @@
 
 package com.android.cts.appsecurity;
 
+import com.android.ddmlib.Log;
 import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
 import com.android.ddmlib.testrunner.TestIdentifier;
 import com.android.ddmlib.testrunner.TestResult;
@@ -28,13 +29,37 @@
 import java.util.Map;
 
 public class Utils {
+    private static final String TAG = "AppSecurity";
+
+    public static final int USER_OWNER = 0;
+
     public static void runDeviceTests(ITestDevice device, String packageName)
             throws DeviceNotAvailableException {
-        runDeviceTests(device, packageName, null, null);
+        runDeviceTests(device, packageName, null, null, USER_OWNER);
+    }
+
+    public static void runDeviceTests(ITestDevice device, String packageName, int userId)
+            throws DeviceNotAvailableException {
+        runDeviceTests(device, packageName, null, null, userId);
+    }
+
+    public static void runDeviceTests(ITestDevice device, String packageName, String testClassName)
+            throws DeviceNotAvailableException {
+        runDeviceTests(device, packageName, testClassName, null, USER_OWNER);
+    }
+
+    public static void runDeviceTests(ITestDevice device, String packageName, String testClassName,
+            int userId) throws DeviceNotAvailableException {
+        runDeviceTests(device, packageName, testClassName, null, userId);
     }
 
     public static void runDeviceTests(ITestDevice device, String packageName, String testClassName,
             String testMethodName) throws DeviceNotAvailableException {
+        runDeviceTests(device, packageName, testClassName, testMethodName, USER_OWNER);
+    }
+
+    public static void runDeviceTests(ITestDevice device, String packageName, String testClassName,
+            String testMethodName, int userId) throws DeviceNotAvailableException {
         if (testClassName != null && testClassName.startsWith(".")) {
             testClassName = packageName + testClassName;
         }
@@ -43,6 +68,13 @@
                 "android.support.test.runner.AndroidJUnitRunner", device.getIDevice());
         if (testClassName != null && testMethodName != null) {
             testRunner.setMethodName(testClassName, testMethodName);
+        } else if (testClassName != null) {
+            testRunner.setClassName(testClassName);
+        }
+
+        if (userId != USER_OWNER) {
+            // TODO: move this to RemoteAndroidTestRunner once it supports users
+            testRunner.addInstrumentationArg("hack_key", "hack_value --user " + userId);
         }
 
         final CollectingTestListener listener = new CollectingTestListener();
@@ -68,4 +100,66 @@
             throw new AssertionError(errorBuilder.toString());
         }
     }
+
+    private static boolean isMultiUserSupportedOnDevice(ITestDevice device)
+            throws DeviceNotAvailableException {
+        // TODO: move this to ITestDevice once it supports users
+        final String output = device.executeShellCommand("pm get-max-users");
+        try {
+            return Integer.parseInt(output.substring(output.lastIndexOf(" ")).trim()) > 1;
+        } catch (NumberFormatException e) {
+            throw new AssertionError("Failed to parse result: " + output);
+        }
+    }
+
+    /**
+     * Return set of users that test should be run for, creating a secondary
+     * user if the device supports it. Always call
+     * {@link #removeUsersForTest(ITestDevice, int[])} when finished.
+     */
+    public static int[] createUsersForTest(ITestDevice device) throws DeviceNotAvailableException {
+        if (isMultiUserSupportedOnDevice(device)) {
+            return new int[] { USER_OWNER, createUserOnDevice(device) };
+        } else {
+            Log.d(TAG, "Single user device; skipping isolated storage tests");
+            return new int[] { USER_OWNER };
+        }
+    }
+
+    public static void removeUsersForTest(ITestDevice device, int[] users)
+            throws DeviceNotAvailableException {
+        for (int user : users) {
+            if (user != USER_OWNER) {
+                removeUserOnDevice(device, user);
+            }
+        }
+    }
+
+    private static int createUserOnDevice(ITestDevice device) throws DeviceNotAvailableException {
+        // TODO: move this to ITestDevice once it supports users
+        final String name = "CTS_" + System.currentTimeMillis();
+        final String output = device.executeShellCommand("pm create-user " + name);
+        if (output.startsWith("Success")) {
+            try {
+                final int userId = Integer.parseInt(
+                        output.substring(output.lastIndexOf(" ")).trim());
+                device.executeShellCommand("am start-user " + userId);
+                return userId;
+            } catch (NumberFormatException e) {
+                throw new AssertionError("Failed to parse result: " + output);
+            }
+        } else {
+            throw new AssertionError("Failed to create user: " + output);
+        }
+    }
+
+    private static void removeUserOnDevice(ITestDevice device, int userId)
+            throws DeviceNotAvailableException {
+        // TODO: move this to ITestDevice once it supports users
+        final String output = device.executeShellCommand("pm remove-user " + userId);
+        if (output.startsWith("Error")) {
+            throw new AssertionError("Failed to remove user: " + output);
+        }
+    }
+
 }
diff --git a/hostsidetests/appsecurity/test-apps/AppAccessData/Android.mk b/hostsidetests/appsecurity/test-apps/AppAccessData/Android.mk
index 2c9c624..4459e69 100644
--- a/hostsidetests/appsecurity/test-apps/AppAccessData/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/AppAccessData/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/AppWithData/Android.mk b/hostsidetests/appsecurity/test-apps/AppWithData/Android.mk
index 098ce9c..0916254 100644
--- a/hostsidetests/appsecurity/test-apps/AppWithData/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/AppWithData/Android.mk
@@ -29,4 +29,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/DocumentClient/Android.mk b/hostsidetests/appsecurity/test-apps/DocumentClient/Android.mk
index 910e3cd..272ef28 100644
--- a/hostsidetests/appsecurity/test-apps/DocumentClient/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/DocumentClient/Android.mk
@@ -31,4 +31,4 @@
 LOCAL_PROGUARD_ENABLED := disabled
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/DocumentProvider/Android.mk b/hostsidetests/appsecurity/test-apps/DocumentProvider/Android.mk
index a886fb2..bbf7734 100644
--- a/hostsidetests/appsecurity/test-apps/DocumentProvider/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/DocumentProvider/Android.mk
@@ -31,4 +31,4 @@
 LOCAL_PROGUARD_ENABLED := disabled
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/DocumentProvider/src/com/android/cts/documentprovider/MyDocumentsProvider.java b/hostsidetests/appsecurity/test-apps/DocumentProvider/src/com/android/cts/documentprovider/MyDocumentsProvider.java
index fb8993c..14f215c 100644
--- a/hostsidetests/appsecurity/test-apps/DocumentProvider/src/com/android/cts/documentprovider/MyDocumentsProvider.java
+++ b/hostsidetests/appsecurity/test-apps/DocumentProvider/src/com/android/cts/documentprovider/MyDocumentsProvider.java
@@ -239,13 +239,16 @@
             new AsyncTask<Void, Void, Void>() {
                 @Override
                 protected Void doInBackground(Void... params) {
-                    try {
-                        final InputStream is = new ParcelFileDescriptor.AutoCloseInputStream(
-                                pipe[0]);
-                        doc.contents = readFullyNoClose(is);
-                        is.close();
-                    } catch (IOException e) {
-                        Log.w(TAG, "Failed to stream", e);
+                    synchronized (doc) {
+                        try {
+                            final InputStream is = new ParcelFileDescriptor.AutoCloseInputStream(
+                                    pipe[0]);
+                            doc.contents = readFullyNoClose(is);
+                            is.close();
+                            doc.notifyAll();
+                        } catch (IOException e) {
+                            Log.w(TAG, "Failed to stream", e);
+                        }
                     }
                     return null;
                 }
@@ -255,13 +258,20 @@
             new AsyncTask<Void, Void, Void>() {
                 @Override
                 protected Void doInBackground(Void... params) {
-                    try {
-                        final OutputStream os = new ParcelFileDescriptor.AutoCloseOutputStream(
-                                pipe[1]);
-                        os.write(doc.contents);
-                        os.close();
-                    } catch (IOException e) {
-                        Log.w(TAG, "Failed to stream", e);
+                    synchronized (doc) {
+                        try {
+                            final OutputStream os = new ParcelFileDescriptor.AutoCloseOutputStream(
+                                    pipe[1]);
+                            while (doc.contents == null) {
+                                doc.wait();
+                            }
+                            os.write(doc.contents);
+                            os.close();
+                        } catch (IOException e) {
+                            Log.w(TAG, "Failed to stream", e);
+                        } catch (InterruptedException e) {
+                            Log.w(TAG, "Interuppted", e);
+                        }
                     }
                     return null;
                 }
diff --git a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/Android.mk b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/Android.mk
index afc8764..a7de92a 100644
--- a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/Android.mk
@@ -25,4 +25,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/AndroidManifest.xml
index 9d8f615..98fe92a 100644
--- a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/AndroidManifest.xml
@@ -23,4 +23,6 @@
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
         android:targetPackage="com.android.cts.externalstorageapp" />
 
+    <uses-permission android:name="android.permission.INTERNET" />
+
 </manifest>
diff --git a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
index 5b4d9f7..7fe0b80 100644
--- a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
+++ b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
@@ -16,18 +16,29 @@
 
 package com.android.cts.externalstorageapp;
 
+import android.content.ContentResolver;
+import android.content.ContentValues;
 import android.content.Context;
+import android.net.Uri;
 import android.os.Environment;
+import android.provider.MediaStore;
+import android.provider.MediaStore.Images;
 import android.test.AndroidTestCase;
 import android.util.Log;
 
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
+import java.io.FileReader;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
@@ -43,6 +54,14 @@
     public static final String PACKAGE_WRITE = "com.android.cts.writeexternalstorageapp";
 
     /**
+     * Dump helpful debugging details.
+     */
+    public void testDumpDebug() throws Exception {
+        logCommand("/system/bin/id");
+        logCommand("/system/bin/cat", "/proc/self/mountinfo");
+    }
+
+    /**
      * Primary storage must always be mounted.
      */
     public void testExternalStorageMounted() {
@@ -88,7 +107,7 @@
         for (File path : paths) {
             assertNotNull("Valid media must be inserted during CTS", path);
             assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
-                    Environment.getStorageState(path));
+                    Environment.getExternalStorageState(path));
 
             assertDirReadWriteAccess(path);
 
@@ -149,6 +168,21 @@
         return paths;
     }
 
+    public static List<File> getMountPaths() throws IOException {
+        final List<File> paths = new ArrayList<>();
+        final BufferedReader br = new BufferedReader(new FileReader("/proc/self/mounts"));
+        try {
+            String line;
+            while ((line = br.readLine()) != null) {
+                final String[] fields = line.split(" ");
+                paths.add(new File(fields[1]));
+            }
+        } finally {
+            br.close();
+        }
+        return paths;
+    }
+
     private static File[] dropFirst(File[] before) {
         final File[] after = new File[before.length - 1];
         System.arraycopy(before, 1, after, 0, after.length);
@@ -274,6 +308,35 @@
         }
     }
 
+    public static void assertMediaNoAccess(ContentResolver resolver) throws Exception {
+        final ContentValues values = new ContentValues();
+        values.put(Images.Media.MIME_TYPE, "image/jpeg");
+        values.put(Images.Media.DATA,
+                buildProbeFile(Environment.getExternalStorageDirectory()).getAbsolutePath());
+
+        try {
+            resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
+            fail("Expected access to be blocked");
+        } catch (Exception expected) {
+        }
+    }
+
+    public static void assertMediaReadWriteAccess(ContentResolver resolver) throws Exception {
+        final ContentValues values = new ContentValues();
+        values.put(Images.Media.MIME_TYPE, "image/jpeg");
+        values.put(Images.Media.DATA,
+                buildProbeFile(Environment.getExternalStorageDirectory()).getAbsolutePath());
+
+        final Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
+        try {
+            resolver.openFileDescriptor(uri, "rw").close();
+            resolver.openFileDescriptor(uri, "w").close();
+            resolver.openFileDescriptor(uri, "r").close();
+        } finally {
+            resolver.delete(uri, null, null);
+        }
+    }
+
     private static boolean isWhiteList(File file) {
         final String[] whiteLists = {
                 "autorun.inf", ".android_secure", "android_secure"
@@ -315,7 +378,9 @@
             }
 
             File[] dirs = removeWhiteList(dir.listFiles());
-            assertEquals(0, dirs.length);
+            if (dirs.length != 0) {
+                fail("Expected wiped storage but found: " + Arrays.toString(dirs));
+            }
         }
     }
 
@@ -336,4 +401,27 @@
             is.close();
         }
     }
+
+    public static void logCommand(String... cmd) throws Exception {
+        final Process proc = new ProcessBuilder(cmd).redirectErrorStream(true).start();
+
+        final ByteArrayOutputStream buf = new ByteArrayOutputStream();
+        copy(proc.getInputStream(), buf);
+        final int res = proc.waitFor();
+
+        Log.d(TAG, Arrays.toString(cmd) + " result " + res + ":");
+        Log.d(TAG, buf.toString());
+    }
+
+    /** Shamelessly lifted from libcore.io.Streams */
+    public static int copy(InputStream in, OutputStream out) throws IOException {
+        int total = 0;
+        byte[] buffer = new byte[8192];
+        int c;
+        while ((c = in.read(buffer)) != -1) {
+            total += c;
+            out.write(buffer, 0, c);
+        }
+        return total;
+    }
 }
diff --git a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/ExternalStorageTest.java b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/ExternalStorageTest.java
index 425815f..6030f1c 100644
--- a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/ExternalStorageTest.java
+++ b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/ExternalStorageTest.java
@@ -16,21 +16,31 @@
 
 package com.android.cts.externalstorageapp;
 
-import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_NONE;
-import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_READ;
-import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_WRITE;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirNoAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirNoWriteAccess;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirReadWriteAccess;
-import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertFileNoAccess;
-import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertFileReadWriteAccess;
-import static com.android.cts.externalstorageapp.CommonExternalStorageTest.buildGiftForPackage;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.getAllPackageSpecificPaths;
-import static com.android.cts.externalstorageapp.CommonExternalStorageTest.readInt;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.getMountPaths;
 
+import android.app.DownloadManager;
+import android.app.DownloadManager.Query;
+import android.app.DownloadManager.Request;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.database.Cursor;
+import android.net.Uri;
 import android.os.Environment;
+import android.os.SystemClock;
 import android.test.AndroidTestCase;
+import android.text.format.DateUtils;
 
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.FileReader;
+import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
 
 /**
@@ -62,7 +72,7 @@
             }
 
             // Keep walking up until we leave device
-            while (Environment.MEDIA_MOUNTED.equals(Environment.getStorageState(path))) {
+            while (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState(path))) {
                 assertDirNoAccess(path);
                 path = path.getParentFile();
             }
@@ -70,17 +80,123 @@
     }
 
     /**
-     * Verify we can read only our gifts.
+     * Verify that we don't have read access to any storage mountpoints.
      */
-    public void doVerifyGifts() throws Exception {
-        final File none = buildGiftForPackage(getContext(), PACKAGE_NONE);
-        assertFileReadWriteAccess(none);
-        assertEquals(100, readInt(none));
+    public void testMountPointsNotReadable() throws Exception {
+        final String userId = Integer.toString(android.os.Process.myUid() / 100000);
+        final List<File> mountPaths = getMountPaths();
+        for (File path : mountPaths) {
+            if (path.getAbsolutePath().startsWith("/mnt/")
+                    || path.getAbsolutePath().startsWith("/storage/")) {
+                // Mount points could be multi-user aware, so try probing both
+                // top level and user-specific directory.
+                final File userPath = new File(path, userId);
 
-        final File read = buildGiftForPackage(getContext(), PACKAGE_READ);
-        assertFileNoAccess(read);
+                assertDirNoAccess(path);
+                assertDirNoAccess(userPath);
+            }
+        }
+    }
 
-        final File write = buildGiftForPackage(getContext(), PACKAGE_WRITE);
-        assertFileNoAccess(write);
+    /**
+     * Verify that we can't download things outside package directory.
+     */
+    public void testDownloadManager() throws Exception {
+        final DownloadManager dm = getContext().getSystemService(DownloadManager.class);
+        try {
+            final Uri source = Uri.parse("http://www.example.com");
+            final File target = new File(
+                    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "meow");
+            dm.enqueue(new Request(source).setDestinationUri(Uri.fromFile(target)));
+            fail("Unexpected success writing outside package directory");
+        } catch (SecurityException expected) {
+        }
+    }
+
+    /**
+     * Verify that we can download things into our package directory.
+     */
+    public void testDownloadManagerPackage() throws Exception {
+        final DownloadManager dm = getContext().getSystemService(DownloadManager.class);
+        final DownloadCompleteReceiver receiver = new DownloadCompleteReceiver();
+        try {
+            IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
+            mContext.registerReceiver(receiver, intentFilter);
+
+            final Uri source = Uri.parse("http://www.example.com");
+            final File target = new File(
+                    getContext().getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "meow");
+
+            final long id = dm.enqueue(new Request(source).setDestinationUri(Uri.fromFile(target)));
+            receiver.waitForDownloadComplete(30 * DateUtils.SECOND_IN_MILLIS, id);
+            assertSuccessfulDownload(id, target);
+        } finally {
+            mContext.unregisterReceiver(receiver);
+        }
+    }
+
+    /**
+     * Shamelessly borrowed from DownloadManagerTest.java
+     */
+    private static class DownloadCompleteReceiver extends BroadcastReceiver {
+        private HashSet<Long> mCompleteIds = new HashSet<>();
+
+        public DownloadCompleteReceiver() {
+        }
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            synchronized (mCompleteIds) {
+                mCompleteIds.add(intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1));
+                mCompleteIds.notifyAll();
+            }
+        }
+
+        private boolean isCompleteLocked(long... ids) {
+            for (long id : ids) {
+                if (!mCompleteIds.contains(id)) {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        public void waitForDownloadComplete(long timeoutMillis, long... waitForIds)
+                throws InterruptedException {
+            if (waitForIds.length == 0) {
+                throw new IllegalArgumentException("Missing IDs to wait for");
+            }
+
+            final long startTime = SystemClock.elapsedRealtime();
+            do {
+                synchronized (mCompleteIds) {
+                    mCompleteIds.wait(timeoutMillis);
+                    if (isCompleteLocked(waitForIds)) return;
+                }
+            } while ((SystemClock.elapsedRealtime() - startTime) < timeoutMillis);
+
+            throw new InterruptedException("Timeout waiting for IDs " + Arrays.toString(waitForIds)
+                    + "; received " + mCompleteIds.toString()
+                    + ".  Make sure you have WiFi or some other connectivity for this test.");
+        }
+    }
+
+    private void assertSuccessfulDownload(long id, File location) {
+        final DownloadManager dm = getContext().getSystemService(DownloadManager.class);
+
+        Cursor cursor = null;
+        try {
+            cursor = dm.query(new Query().setFilterById(id));
+            assertTrue(cursor.moveToNext());
+            assertEquals(DownloadManager.STATUS_SUCCESSFUL, cursor.getInt(
+                    cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)));
+            assertEquals(Uri.fromFile(location).toString(),
+                    cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)));
+            assertTrue(location.exists());
+        } finally {
+            if (cursor != null) {
+                cursor.close();
+            }
+        }
     }
 }
diff --git a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/GiftTest.java b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/GiftTest.java
new file mode 100644
index 0000000..e482b2f
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/GiftTest.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.externalstorageapp;
+
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_NONE;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_READ;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_WRITE;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertFileNoAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertFileReadWriteAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.buildGiftForPackage;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.readInt;
+
+import android.test.AndroidTestCase;
+
+import java.io.File;
+
+public class GiftTest extends AndroidTestCase {
+    /**
+     * Verify we can read only our gifts.
+     */
+    public void testGifts() throws Exception {
+        final File none = buildGiftForPackage(getContext(), PACKAGE_NONE);
+        assertFileReadWriteAccess(none);
+        assertEquals(100, readInt(none));
+
+        final File read = buildGiftForPackage(getContext(), PACKAGE_READ);
+        assertFileNoAccess(read);
+
+        final File write = buildGiftForPackage(getContext(), PACKAGE_WRITE);
+        assertFileNoAccess(write);
+    }
+}
diff --git a/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/Android.mk b/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/Android.mk
index e8ce3b8..4c64204 100644
--- a/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/Android.mk b/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/Android.mk
index 1dd109a..c37d052 100644
--- a/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/Android.mk
@@ -27,4 +27,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/src/com/android/cts/multiuserstorageapp/MultiUserStorageTest.java b/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/src/com/android/cts/multiuserstorageapp/MultiUserStorageTest.java
index 2a80c75..d9f00d2 100644
--- a/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/src/com/android/cts/multiuserstorageapp/MultiUserStorageTest.java
+++ b/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/src/com/android/cts/multiuserstorageapp/MultiUserStorageTest.java
@@ -16,6 +16,7 @@
 
 package com.android.cts.multiuserstorageapp;
 
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirNoAccess;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.getAllPackageSpecificPathsExceptObb;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.readInt;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.writeInt;
@@ -45,7 +46,9 @@
 
     private void wipeTestFiles(File dir) {
         dir.mkdirs();
-        for (File file : dir.listFiles()) {
+        final File[] files = dir.listFiles();
+        if (files == null) return;
+        for (File file : files) {
             if (file.getName().startsWith(FILE_PREFIX)) {
                 Log.d(TAG, "Wiping " + file);
                 file.delete();
@@ -53,11 +56,11 @@
         }
     }
 
-    public void cleanIsolatedStorage() throws Exception {
+    public void testCleanIsolatedStorage() throws Exception {
         wipeTestFiles(Environment.getExternalStorageDirectory());
     }
 
-    public void writeIsolatedStorage() throws Exception {
+    public void testWriteIsolatedStorage() throws Exception {
         final int uid = android.os.Process.myUid();
 
         writeInt(buildApiPath(FILE_SINGLETON), uid);
@@ -67,13 +70,13 @@
         for (File path : getAllPackageSpecificPathsExceptObb(getContext())) {
             assertNotNull("Valid media must be inserted during CTS", path);
             assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
-                    Environment.getStorageState(path));
+                    Environment.getExternalStorageState(path));
 
             writeInt(new File(path, FILE_SINGLETON), uid);
         }
     }
 
-    public void readIsolatedStorage() throws Exception {
+    public void testReadIsolatedStorage() throws Exception {
         final int uid = android.os.Process.myUid();
 
         // Expect that the value we wrote earlier is still valid and wasn't
@@ -91,23 +94,23 @@
         for (File path : getAllPackageSpecificPathsExceptObb(getContext())) {
             assertNotNull("Valid media must be inserted during CTS", path);
             assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
-                    Environment.getStorageState(path));
+                    Environment.getExternalStorageState(path));
 
             assertEquals("Unexpected value in singleton file at " + path, uid,
                     readInt(new File(path, FILE_SINGLETON)));
         }
     }
 
-    public void cleanObbStorage() throws Exception {
+    public void testCleanObbStorage() throws Exception {
         wipeTestFiles(getContext().getObbDir());
     }
 
-    public void writeObbStorage() throws Exception {
+    public void testWriteObbStorage() throws Exception {
         writeInt(buildApiObbPath(FILE_OBB_API_SINGLETON), OBB_API_VALUE);
         writeInt(buildEnvObbPath(FILE_OBB_SINGLETON), OBB_VALUE);
     }
 
-    public void readObbStorage() throws Exception {
+    public void testReadObbStorage() throws Exception {
         assertEquals("Failed to read OBB file from API path", OBB_API_VALUE,
                 readInt(buildApiObbPath(FILE_OBB_API_SINGLETON)));
 
@@ -117,6 +120,24 @@
                 readInt(buildRawObbPath(FILE_OBB_SINGLETON)));
     }
 
+    /**
+     * Verify that we can't poke at storage of other users.
+     */
+    public void testUserIsolation() throws Exception {
+        final File myPath = Environment.getExternalStorageDirectory();
+        final int myId = android.os.Process.myUid() / 100000;
+        assertEquals(String.valueOf(myId), myPath.getName());
+
+        Log.d(TAG, "My path is " + myPath);
+        final File basePath = myPath.getParentFile();
+        for (int i = 0; i < 128; i++) {
+            if (i == myId) continue;
+
+            final File otherPath = new File(basePath, String.valueOf(i));
+            assertDirNoAccess(otherPath);
+        }
+    }
+
     private File buildApiObbPath(String file) {
         return new File(getContext().getObbDir(), file);
     }
diff --git a/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/Android.mk b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/Android.mk
index 60d6fad..43d3547 100644
--- a/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/PermissionDeclareAppCompat/Android.mk b/hostsidetests/appsecurity/test-apps/PermissionDeclareAppCompat/Android.mk
index ba7285c..5109c99 100644
--- a/hostsidetests/appsecurity/test-apps/PermissionDeclareAppCompat/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/PermissionDeclareAppCompat/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/Android.mk b/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/Android.mk
index 3e392e3..c662d39 100644
--- a/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/Android.mk
@@ -27,4 +27,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/src/com/android/cts/readexternalstorageapp/ReadExternalStorageTest.java b/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/src/com/android/cts/readexternalstorageapp/ReadExternalStorageTest.java
index bbd1e7a..995da90 100644
--- a/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/src/com/android/cts/readexternalstorageapp/ReadExternalStorageTest.java
+++ b/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/src/com/android/cts/readexternalstorageapp/ReadExternalStorageTest.java
@@ -16,16 +16,11 @@
 
 package com.android.cts.readexternalstorageapp;
 
-import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_NONE;
-import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_READ;
-import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_WRITE;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirNoWriteAccess;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirReadOnlyAccess;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirReadWriteAccess;
-import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertFileReadOnlyAccess;
-import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertFileReadWriteAccess;
-import static com.android.cts.externalstorageapp.CommonExternalStorageTest.buildGiftForPackage;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.getAllPackageSpecificPaths;
-import static com.android.cts.externalstorageapp.CommonExternalStorageTest.readInt;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.getMountPaths;
 
 import android.os.Environment;
 import android.test.AndroidTestCase;
@@ -54,7 +49,7 @@
         for (File path : paths) {
             assertNotNull("Valid media must be inserted during CTS", path);
             assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
-                    Environment.getStorageState(path));
+                    Environment.getExternalStorageState(path));
 
             assertTrue(path.getAbsolutePath().contains(packageName));
 
@@ -65,7 +60,7 @@
             }
 
             // Keep walking up until we leave device
-            while (Environment.MEDIA_MOUNTED.equals(Environment.getStorageState(path))) {
+            while (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState(path))) {
                 assertDirReadOnlyAccess(path);
                 path = path.getParentFile();
             }
@@ -73,19 +68,21 @@
     }
 
     /**
-     * Verify we can read all gifts.
+     * Verify that we don't have write access to any mountpoints.
      */
-    public void doVerifyGifts() throws Exception {
-        final File none = buildGiftForPackage(getContext(), PACKAGE_NONE);
-        assertFileReadOnlyAccess(none);
-        assertEquals(100, readInt(none));
+    public void testMountPointsNotWritable() throws Exception {
+        final String userId = Integer.toString(android.os.Process.myUid() / 100000);
+        final List<File> mountPaths = getMountPaths();
+        for (File path : mountPaths) {
+            if (path.getAbsolutePath().startsWith("/mnt/")
+                    || path.getAbsolutePath().startsWith("/storage/")) {
+                // Mount points could be multi-user aware, so try probing both
+                // top level and user-specific directory.
+                final File userPath = new File(path, userId);
 
-        final File read = buildGiftForPackage(getContext(), PACKAGE_READ);
-        assertFileReadWriteAccess(read);
-        assertEquals(101, readInt(read));
-
-        final File write = buildGiftForPackage(getContext(), PACKAGE_WRITE);
-        assertFileReadOnlyAccess(write);
-        assertEquals(102, readInt(write));
+                assertDirNoWriteAccess(path);
+                assertDirNoWriteAccess(userPath);
+            }
+        }
     }
 }
diff --git a/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/src/com/android/cts/readexternalstorageapp/ReadGiftTest.java b/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/src/com/android/cts/readexternalstorageapp/ReadGiftTest.java
new file mode 100644
index 0000000..e72be77
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/src/com/android/cts/readexternalstorageapp/ReadGiftTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.readexternalstorageapp;
+
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_NONE;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_READ;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_WRITE;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertFileReadOnlyAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertFileReadWriteAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.buildGiftForPackage;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.readInt;
+
+import android.test.AndroidTestCase;
+
+import java.io.File;
+
+public class ReadGiftTest extends AndroidTestCase {
+    /**
+     * Verify we can read all gifts.
+     */
+    public void testGifts() throws Exception {
+        final File none = buildGiftForPackage(getContext(), PACKAGE_NONE);
+        assertFileReadOnlyAccess(none);
+        assertEquals(100, readInt(none));
+
+        final File read = buildGiftForPackage(getContext(), PACKAGE_READ);
+        assertFileReadWriteAccess(read);
+        assertEquals(101, readInt(read));
+
+        final File write = buildGiftForPackage(getContext(), PACKAGE_WRITE);
+        assertFileReadOnlyAccess(write);
+        assertEquals(102, readInt(write));
+    }
+}
diff --git a/hostsidetests/appsecurity/test-apps/SharedUidInstall/Android.mk b/hostsidetests/appsecurity/test-apps/SharedUidInstall/Android.mk
index 76187ab..05438ef 100644
--- a/hostsidetests/appsecurity/test-apps/SharedUidInstall/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SharedUidInstall/Android.mk
@@ -32,4 +32,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SharedUidInstallDiffCert/Android.mk b/hostsidetests/appsecurity/test-apps/SharedUidInstallDiffCert/Android.mk
index c1422ec..eaed910 100644
--- a/hostsidetests/appsecurity/test-apps/SharedUidInstallDiffCert/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SharedUidInstallDiffCert/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SimpleAppInstall/Android.mk b/hostsidetests/appsecurity/test-apps/SimpleAppInstall/Android.mk
index fb925cd..01cffdb 100644
--- a/hostsidetests/appsecurity/test-apps/SimpleAppInstall/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SimpleAppInstall/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/Android.mk b/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/Android.mk
index 2224d72..032ef57 100644
--- a/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/Android.mk
index bf89576..de46dea 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/Android.mk
@@ -35,7 +35,7 @@
 LOCAL_PROGUARD_ENABLED := disabled
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 
 #################################################
@@ -59,7 +59,7 @@
 LOCAL_PROGUARD_ENABLED := disabled
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 
 ################################################
@@ -82,7 +82,7 @@
 LOCAL_PROGUARD_ENABLED := disabled
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 
 ################################################
@@ -105,7 +105,7 @@
 LOCAL_PROGUARD_ENABLED := disabled
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 
 ifeq (,$(ONE_SHOT_MAKEFILE))
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/feature/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/feature/Android.mk
index 809a6b8..fbb7764 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/feature/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/feature/Android.mk
@@ -35,4 +35,4 @@
 
 LOCAL_AAPT_FLAGS += --feature-of $(featureOfApk)
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/arm64-v8a/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/arm64-v8a/Android.mk
index 543e4ac..9faaba1 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/arm64-v8a/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/arm64-v8a/Android.mk
@@ -25,4 +25,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi-v7a/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi-v7a/Android.mk
index 7cdef62..87b32aa 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi-v7a/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi-v7a/Android.mk
@@ -25,4 +25,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi/Android.mk
index 26ec5bd..fe289e0 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi/Android.mk
@@ -25,4 +25,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips/Android.mk
index fea0603..d66d674 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips/Android.mk
@@ -25,4 +25,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips64/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips64/Android.mk
index 3cc5609..7232324 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips64/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips64/Android.mk
@@ -25,4 +25,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86/Android.mk
index d45ca8f..f1cd994 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86/Android.mk
@@ -25,4 +25,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86_64/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86_64/Android.mk
index fa0e488..521f6f2 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86_64/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86_64/Android.mk
@@ -25,4 +25,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/src/com/android/cts/splitapp/SplitAppTest.java b/hostsidetests/appsecurity/test-apps/SplitApp/src/com/android/cts/splitapp/SplitAppTest.java
index 3d6cee7..c5f0fd0 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/src/com/android/cts/splitapp/SplitAppTest.java
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/src/com/android/cts/splitapp/SplitAppTest.java
@@ -19,6 +19,7 @@
 import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
 import static org.xmlpull.v1.XmlPullParser.START_TAG;
 
+import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
@@ -27,9 +28,17 @@
 import android.content.pm.ResolveInfo;
 import android.content.res.Configuration;
 import android.content.res.Resources;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.drawable.Drawable;
+import android.os.Environment;
+import android.os.ParcelFileDescriptor;
+import android.os.StatFs;
+import android.system.Os;
+import android.system.OsConstants;
+import android.system.StructStat;
 import android.test.AndroidTestCase;
 import android.test.MoreAsserts;
 import android.util.DisplayMetrics;
@@ -39,7 +48,12 @@
 import org.xmlpull.v1.XmlPullParserException;
 
 import java.io.BufferedReader;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
 import java.io.File;
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.lang.reflect.Field;
@@ -51,9 +65,14 @@
     private static final String TAG = "SplitAppTest";
     private static final String PKG = "com.android.cts.splitapp";
 
+    private static final long MB_IN_BYTES = 1 * 1024 * 1024;
+
     public static boolean sFeatureTouched = false;
     public static String sFeatureValue = null;
 
+    public void testNothing() throws Exception {
+    }
+
     public void testSingleBase() throws Exception {
         final Resources r = getContext().getResources();
         final PackageManager pm = getContext().getPackageManager();
@@ -311,6 +330,131 @@
         assertEquals(0, result.size());
     }
 
+    /**
+     * Write app data in a number of locations that expect to remain intact over
+     * long periods of time, such as across app moves.
+     */
+    public void testDataWrite() throws Exception {
+        final String token = String.valueOf(android.os.Process.myUid());
+        writeString(getContext().getFileStreamPath("my_int"), token);
+
+        final SQLiteDatabase db = getContext().openOrCreateDatabase("my_db",
+                Context.MODE_PRIVATE, null);
+        try {
+            db.execSQL("DROP TABLE IF EXISTS my_table");
+            db.execSQL("CREATE TABLE my_table(value INTEGER)");
+            db.execSQL("INSERT INTO my_table VALUES (101), (102), (103)");
+        } finally {
+            db.close();
+        }
+    }
+
+    /**
+     * Verify that data written by {@link #testDataWrite()} is still intact.
+     */
+    public void testDataRead() throws Exception {
+        final String token = String.valueOf(android.os.Process.myUid());
+        assertEquals(token, readString(getContext().getFileStreamPath("my_int")));
+
+        final SQLiteDatabase db = getContext().openOrCreateDatabase("my_db",
+                Context.MODE_PRIVATE, null);
+        try {
+            final Cursor cursor = db.query("my_table", null, null, null, null, null, "value ASC");
+            try {
+                assertEquals(3, cursor.getCount());
+                assertTrue(cursor.moveToPosition(0));
+                assertEquals(101, cursor.getInt(0));
+                assertTrue(cursor.moveToPosition(1));
+                assertEquals(102, cursor.getInt(0));
+                assertTrue(cursor.moveToPosition(2));
+                assertEquals(103, cursor.getInt(0));
+            } finally {
+                cursor.close();
+            }
+        } finally {
+            db.close();
+        }
+    }
+
+    /**
+     * Verify that app is installed on internal storage.
+     */
+    public void testDataInternal() throws Exception {
+        final StructStat internal = Os.stat(Environment.getDataDirectory().getAbsolutePath());
+        final StructStat actual = Os.stat(getContext().getFilesDir().getAbsolutePath());
+        assertEquals(internal.st_dev, actual.st_dev);
+    }
+
+    /**
+     * Verify that app is not installed on internal storage.
+     */
+    public void testDataNotInternal() throws Exception {
+        final StructStat internal = Os.stat(Environment.getDataDirectory().getAbsolutePath());
+        final StructStat actual = Os.stat(getContext().getFilesDir().getAbsolutePath());
+        MoreAsserts.assertNotEqual(internal.st_dev, actual.st_dev);
+    }
+
+    public void testPrimaryDataWrite() throws Exception {
+        final String token = String.valueOf(android.os.Process.myUid());
+        writeString(new File(getContext().getExternalFilesDir(null), "my_ext"), token);
+    }
+
+    public void testPrimaryDataRead() throws Exception {
+        final String token = String.valueOf(android.os.Process.myUid());
+        assertEquals(token, readString(new File(getContext().getExternalFilesDir(null), "my_ext")));
+    }
+
+    /**
+     * Verify shared storage behavior when on internal storage.
+     */
+    public void testPrimaryInternal() throws Exception {
+        assertTrue("emulated", Environment.isExternalStorageEmulated());
+        assertFalse("removable", Environment.isExternalStorageRemovable());
+        assertEquals(Environment.MEDIA_MOUNTED, Environment.getExternalStorageState());
+    }
+
+    /**
+     * Verify shared storage behavior when on physical storage.
+     */
+    public void testPrimaryPhysical() throws Exception {
+        assertFalse("emulated", Environment.isExternalStorageEmulated());
+        assertTrue("removable", Environment.isExternalStorageRemovable());
+        assertEquals(Environment.MEDIA_MOUNTED, Environment.getExternalStorageState());
+    }
+
+    /**
+     * Verify shared storage behavior when on adopted storage.
+     */
+    public void testPrimaryAdopted() throws Exception {
+        assertTrue("emulated", Environment.isExternalStorageEmulated());
+        assertTrue("removable", Environment.isExternalStorageRemovable());
+        assertEquals(Environment.MEDIA_MOUNTED, Environment.getExternalStorageState());
+    }
+
+    /**
+     * Verify that shared storage is unmounted.
+     */
+    public void testPrimaryUnmounted() throws Exception {
+        MoreAsserts.assertNotEqual(Environment.MEDIA_MOUNTED,
+                Environment.getExternalStorageState());
+    }
+
+    /**
+     * Verify that shared storage lives on same volume as app.
+     */
+    public void testPrimaryOnSameVolume() throws Exception {
+        final File current = getContext().getFilesDir();
+        final File primary = Environment.getExternalStorageDirectory();
+
+        // Shared storage may jump through another filesystem for permission
+        // enforcement, so we verify that total/free space are identical.
+        final long totalDelta = Math.abs(current.getTotalSpace() - primary.getTotalSpace());
+        final long freeDelta = Math.abs(current.getFreeSpace() - primary.getFreeSpace());
+        if (totalDelta > MB_IN_BYTES || freeDelta > MB_IN_BYTES) {
+            fail("Expected primary storage to be on same volume as app");
+        }
+    }
+
     public void testCodeCacheWrite() throws Exception {
         assertTrue(new File(getContext().getFilesDir(), "normal.raw").createNewFile());
         assertTrue(new File(getContext().getCodeCacheDir(), "cache.raw").createNewFile());
@@ -390,4 +534,22 @@
             if (in != null) in.close();
         }
     }
+
+    private static void writeString(File file, String value) throws IOException {
+        final DataOutputStream os = new DataOutputStream(new FileOutputStream(file));
+        try {
+            os.writeUTF(value);
+        } finally {
+            os.close();
+        }
+    }
+
+    private static String readString(File file) throws IOException {
+        final DataInputStream is = new DataInputStream(new FileInputStream(file));
+        try {
+            return is.readUTF();
+        } finally {
+            is.close();
+        }
+    }
 }
diff --git a/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/Android.mk b/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/Android.mk
index 38a0511..f5ac52f 100644
--- a/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionApp/Android.mk b/hostsidetests/appsecurity/test-apps/UsePermissionApp/Android.mk
new file mode 100644
index 0000000..f91d0c4
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionApp/Android.mk
@@ -0,0 +1,35 @@
+#
+# Copyright (C) 2015 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+LOCAL_SDK_VERSION := current
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ctsdeviceutil ctstestrunner ub-uiautomator
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+    ../ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
+
+LOCAL_PACKAGE_NAME := CtsUsePermissionApp
+
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey2
+
+LOCAL_PROGUARD_ENABLED := disabled
+LOCAL_DEX_PREOPT := false
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionApp/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/UsePermissionApp/AndroidManifest.xml
new file mode 100644
index 0000000..ece4ebe
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionApp/AndroidManifest.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.usepermission">
+    <application>
+        <uses-library android:name="android.test.runner" />
+        <activity android:name=".MyActivity" />
+    </application>
+    <instrumentation
+        android:name="android.support.test.runner.AndroidJUnitRunner"
+        android:targetPackage="com.android.cts.usepermission" />
+
+    <!-- Note that WRITE_EXTERNAL_STORAGE implies READ_EXTERNAL_STORAGE;
+         this is a special case. -->
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
+    <!-- Deliberately request WRITE_CONTACTS but *not* READ_CONTACTS -->
+    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
+
+    <!-- Request two different permissions within the same group -->
+    <uses-permission android:name="android.permission.SEND_SMS" />
+    <uses-permission android:name="android.permission.RECEIVE_SMS" />
+
+</manifest>
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionApp/src/com/android/cts/usepermission/MyActivity.java b/hostsidetests/appsecurity/test-apps/UsePermissionApp/src/com/android/cts/usepermission/MyActivity.java
new file mode 100644
index 0000000..5af3886
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionApp/src/com/android/cts/usepermission/MyActivity.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.usepermission;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.WindowManager;
+
+import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.TimeUnit;
+
+public class MyActivity extends Activity {
+    private final SynchronousQueue<Result> mResult = new SynchronousQueue<>();
+
+    public static class Result {
+        public final int requestCode;
+        public final String[] permissions;
+        public final int[] grantResults;
+
+        public Result(int requestCode, String[] permissions, int[] grantResults) {
+            this.requestCode = requestCode;
+            this.permissions = permissions;
+            this.grantResults = grantResults;
+        }
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
+                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
+                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, String[] permissions,
+            int[] grantResults) {
+        try {
+            mResult.offer(new Result(requestCode, permissions, grantResults), 5, TimeUnit.SECONDS);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public Result getResult() {
+        try {
+            return mResult.take();
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionApp/src/com/android/cts/usepermission/UsePermissionTest.java b/hostsidetests/appsecurity/test-apps/UsePermissionApp/src/com/android/cts/usepermission/UsePermissionTest.java
new file mode 100644
index 0000000..8d3b976
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionApp/src/com/android/cts/usepermission/UsePermissionTest.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.usepermission;
+
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirNoAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirReadWriteAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertMediaNoAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertMediaReadWriteAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.logCommand;
+
+import android.content.pm.PackageManager;
+import android.os.Environment;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiObject;
+import android.support.test.uiautomator.UiSelector;
+import android.test.InstrumentationTestCase;
+
+public class UsePermissionTest extends InstrumentationTestCase {
+    private static final String TAG = "UsePermissionTest";
+
+    private UiDevice mDevice;
+    private MyActivity mActivity;
+
+    public void testFail() throws Exception {
+        fail("Expected");
+    }
+
+    public void testKill() throws Exception {
+        android.os.Process.killProcess(android.os.Process.myPid());
+    }
+
+    public void testDefault() throws Exception {
+        logCommand("/system/bin/cat", "/proc/self/mountinfo");
+
+        // New permission model is denied by default
+        assertEquals(PackageManager.PERMISSION_DENIED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE));
+        assertEquals(PackageManager.PERMISSION_DENIED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE));
+        assertEquals(Environment.MEDIA_MOUNTED, Environment.getExternalStorageState());
+        assertDirNoAccess(Environment.getExternalStorageDirectory());
+        assertDirReadWriteAccess(getInstrumentation().getContext().getExternalCacheDir());
+        assertMediaNoAccess(getInstrumentation().getContext().getContentResolver());
+    }
+
+    public void testGranted() throws Exception {
+        logCommand("/system/bin/cat", "/proc/self/mountinfo");
+
+        assertEquals(PackageManager.PERMISSION_GRANTED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE));
+        assertEquals(PackageManager.PERMISSION_GRANTED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE));
+        assertEquals(Environment.MEDIA_MOUNTED, Environment.getExternalStorageState());
+        assertDirReadWriteAccess(Environment.getExternalStorageDirectory());
+        assertDirReadWriteAccess(getInstrumentation().getContext().getExternalCacheDir());
+        assertMediaReadWriteAccess(getInstrumentation().getContext().getContentResolver());
+    }
+
+    public void testInteractiveGrant() throws Exception {
+        logCommand("/system/bin/cat", "/proc/self/mountinfo");
+
+        // Start out without permission
+        assertEquals(PackageManager.PERMISSION_DENIED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE));
+        assertEquals(PackageManager.PERMISSION_DENIED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE));
+        assertEquals(Environment.MEDIA_MOUNTED, Environment.getExternalStorageState());
+        assertDirNoAccess(Environment.getExternalStorageDirectory());
+        assertDirReadWriteAccess(getInstrumentation().getContext().getExternalCacheDir());
+        assertMediaNoAccess(getInstrumentation().getContext().getContentResolver());
+
+        // Go through normal grant flow
+        mDevice = UiDevice.getInstance(getInstrumentation());
+        mActivity = launchActivity(getInstrumentation().getTargetContext().getPackageName(),
+                MyActivity.class, null);
+        mDevice.waitForIdle();
+
+        mActivity.requestPermissions(new String[] {
+                android.Manifest.permission.READ_EXTERNAL_STORAGE,
+                android.Manifest.permission.WRITE_EXTERNAL_STORAGE }, 42);
+        mDevice.waitForIdle();
+
+        new UiObject(new UiSelector()
+                .resourceId("com.android.packageinstaller:id/permission_allow_button")).click();
+        mDevice.waitForIdle();
+
+        MyActivity.Result result = mActivity.getResult();
+        assertEquals(42, result.requestCode);
+        assertEquals(android.Manifest.permission.READ_EXTERNAL_STORAGE, result.permissions[0]);
+        assertEquals(android.Manifest.permission.WRITE_EXTERNAL_STORAGE, result.permissions[1]);
+        assertEquals(PackageManager.PERMISSION_GRANTED, result.grantResults[0]);
+        assertEquals(PackageManager.PERMISSION_GRANTED, result.grantResults[1]);
+
+        logCommand("/system/bin/cat", "/proc/self/mountinfo");
+
+        // We should have permission now!
+        assertEquals(PackageManager.PERMISSION_GRANTED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE));
+        assertEquals(PackageManager.PERMISSION_GRANTED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE));
+        assertEquals(Environment.MEDIA_MOUNTED, Environment.getExternalStorageState());
+        assertDirReadWriteAccess(Environment.getExternalStorageDirectory());
+        assertDirReadWriteAccess(getInstrumentation().getContext().getExternalCacheDir());
+        assertMediaReadWriteAccess(getInstrumentation().getContext().getContentResolver());
+
+        mActivity.finish();
+    }
+
+    public void testRuntimeGroupGrantSpecificity() throws Exception {
+        // Start out without permission
+        assertEquals(PackageManager.PERMISSION_DENIED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.WRITE_CONTACTS));
+        assertEquals(PackageManager.PERMISSION_DENIED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.READ_CONTACTS));
+
+        // Go through normal grant flow
+        mDevice = UiDevice.getInstance(getInstrumentation());
+        mActivity = launchActivity(getInstrumentation().getTargetContext().getPackageName(),
+                MyActivity.class, null);
+        mDevice.waitForIdle();
+
+        // request only one permission from the 'contacts' permission group
+        mActivity.requestPermissions(new String[] {
+                android.Manifest.permission.WRITE_CONTACTS }, 43);
+        mDevice.waitForIdle();
+
+        new UiObject(new UiSelector()
+                .resourceId("com.android.packageinstaller:id/permission_allow_button")).click();
+        mDevice.waitForIdle();
+
+        MyActivity.Result result = mActivity.getResult();
+        assertEquals(43, result.requestCode);
+        assertEquals(android.Manifest.permission.WRITE_CONTACTS, result.permissions[0]);
+        assertEquals(PackageManager.PERMISSION_GRANTED, result.grantResults[0]);
+
+        // We should have only the explicitly requested permission from this group
+        assertEquals(PackageManager.PERMISSION_GRANTED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.WRITE_CONTACTS));
+        assertEquals(PackageManager.PERMISSION_DENIED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.READ_CONTACTS));
+
+        mActivity.finish();
+    }
+
+    public void testRuntimeGroupGrantExpansion() throws Exception {
+        // Start out without permission
+        assertEquals(PackageManager.PERMISSION_DENIED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.RECEIVE_SMS));
+        assertEquals(PackageManager.PERMISSION_DENIED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.SEND_SMS));
+
+        // Go through normal grant flow
+        mDevice = UiDevice.getInstance(getInstrumentation());
+        mActivity = launchActivity(getInstrumentation().getTargetContext().getPackageName(),
+                MyActivity.class, null);
+        mDevice.waitForIdle();
+
+        // request only one permission from the 'SMS' permission group at runtime,
+        // but two from this group are <uses-permission> in the manifest
+        mActivity.requestPermissions(new String[] {
+                android.Manifest.permission.RECEIVE_SMS }, 44);
+        mDevice.waitForIdle();
+
+        new UiObject(new UiSelector()
+                .resourceId("com.android.packageinstaller:id/permission_allow_button")).click();
+        mDevice.waitForIdle();
+
+        MyActivity.Result result = mActivity.getResult();
+        assertEquals(44, result.requestCode);
+        assertEquals(android.Manifest.permission.RECEIVE_SMS, result.permissions[0]);
+        assertEquals(PackageManager.PERMISSION_GRANTED, result.grantResults[0]);
+
+        // We should now have been granted both of the permissions from this group
+        // that are mentioned in our manifest
+        assertEquals(PackageManager.PERMISSION_GRANTED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.RECEIVE_SMS));
+        assertEquals(PackageManager.PERMISSION_GRANTED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.SEND_SMS));
+
+        mActivity.finish();
+    }
+}
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionAppCompat/Android.mk b/hostsidetests/appsecurity/test-apps/UsePermissionAppCompat/Android.mk
new file mode 100644
index 0000000..70b4b0f
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionAppCompat/Android.mk
@@ -0,0 +1,35 @@
+#
+# Copyright (C) 2015 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+LOCAL_SDK_VERSION := 21
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ctsdeviceutil ctstestrunner ub-uiautomator
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+    ../ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
+
+LOCAL_PACKAGE_NAME := CtsUsePermissionAppCompat
+
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey2
+
+LOCAL_PROGUARD_ENABLED := disabled
+LOCAL_DEX_PREOPT := false
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionAppCompat/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/UsePermissionAppCompat/AndroidManifest.xml
new file mode 100644
index 0000000..253d85d
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionAppCompat/AndroidManifest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.usepermission">
+    <application>
+        <uses-library android:name="android.test.runner" />
+        <activity android:name=".MyActivity" />
+    </application>
+    <instrumentation
+        android:name="android.support.test.runner.AndroidJUnitRunner"
+        android:targetPackage="com.android.cts.usepermission" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+</manifest>
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionAppCompat/src/com/android/cts/usepermission/UsePermissionCompatTest.java b/hostsidetests/appsecurity/test-apps/UsePermissionAppCompat/src/com/android/cts/usepermission/UsePermissionCompatTest.java
new file mode 100644
index 0000000..7f21d3400
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionAppCompat/src/com/android/cts/usepermission/UsePermissionCompatTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.usepermission;
+
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirNoAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirReadWriteAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertMediaNoAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertMediaReadWriteAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.getAllPackageSpecificPaths;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.logCommand;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Environment;
+import android.os.Process;
+import android.test.InstrumentationTestCase;
+
+import java.io.File;
+
+public class UsePermissionCompatTest extends InstrumentationTestCase {
+    private static final String TAG = "UsePermissionTest";
+
+    public void testCompatDefault() throws Exception {
+        final Context context = getInstrumentation().getContext();
+        logCommand("/system/bin/cat", "/proc/self/mountinfo");
+
+        // Legacy permission model is granted by default
+        assertEquals(PackageManager.PERMISSION_GRANTED,
+                context.checkPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE,
+                        Process.myPid(), Process.myUid()));
+        assertEquals(PackageManager.PERMISSION_GRANTED,
+                context.checkPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
+                        Process.myPid(), Process.myUid()));
+        assertEquals(Environment.MEDIA_MOUNTED, Environment.getExternalStorageState());
+        assertDirReadWriteAccess(Environment.getExternalStorageDirectory());
+        for (File path : getAllPackageSpecificPaths(context)) {
+            if (path != null) {
+                assertDirReadWriteAccess(path);
+            }
+        }
+        assertMediaReadWriteAccess(getInstrumentation().getContext().getContentResolver());
+    }
+
+    public void testCompatRevoked() throws Exception {
+        final Context context = getInstrumentation().getContext();
+        logCommand("/system/bin/cat", "/proc/self/mountinfo");
+
+        // Legacy permission model appears granted, but storage looks and
+        // behaves like it's ejected
+        assertEquals(PackageManager.PERMISSION_GRANTED,
+                context.checkPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE,
+                        Process.myPid(), Process.myUid()));
+        assertEquals(PackageManager.PERMISSION_GRANTED,
+                context.checkPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
+                        Process.myPid(), Process.myUid()));
+        assertEquals(Environment.MEDIA_UNMOUNTED, Environment.getExternalStorageState());
+        assertDirNoAccess(Environment.getExternalStorageDirectory());
+        for (File dir : getAllPackageSpecificPaths(context)) {
+            if (dir != null) {
+                assertDirNoAccess(dir);
+            }
+        }
+        assertMediaNoAccess(getInstrumentation().getContext().getContentResolver());
+
+        // Just to be sure, poke explicit path
+        assertDirNoAccess(new File(Environment.getExternalStorageDirectory(),
+                "/Android/data/" + getInstrumentation().getContext().getPackageName()));
+    }
+}
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/Android.mk b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/Android.mk
index 8878c47..6e0d090 100644
--- a/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/Android.mk
@@ -31,4 +31,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/Android.mk b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/Android.mk
index a98fcea..cdd77e8 100644
--- a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/Android.mk
@@ -27,4 +27,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/src/com/android/cts/writeexternalstorageapp/WriteExternalStorageTest.java b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/src/com/android/cts/writeexternalstorageapp/WriteExternalStorageTest.java
index 6857236..5e6aa3e 100644
--- a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/src/com/android/cts/writeexternalstorageapp/WriteExternalStorageTest.java
+++ b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/src/com/android/cts/writeexternalstorageapp/WriteExternalStorageTest.java
@@ -17,17 +17,14 @@
 package com.android.cts.writeexternalstorageapp;
 
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_NONE;
-import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_READ;
-import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_WRITE;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.TAG;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirNoWriteAccess;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirReadOnlyAccess;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirReadWriteAccess;
-import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertFileReadWriteAccess;
-import static com.android.cts.externalstorageapp.CommonExternalStorageTest.buildGiftForPackage;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.buildProbeFile;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.deleteContents;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.getAllPackageSpecificPaths;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.getMountPaths;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.getPrimaryPackageSpecificPaths;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.getSecondaryPackageSpecificPaths;
 import static com.android.cts.externalstorageapp.CommonExternalStorageTest.readInt;
@@ -39,9 +36,7 @@
 
 import com.android.cts.externalstorageapp.CommonExternalStorageTest;
 
-import java.io.BufferedReader;
 import java.io.File;
-import java.io.FileReader;
 import java.util.List;
 import java.util.Random;
 
@@ -93,6 +88,17 @@
         assertEquals(readInt(TEST_FILE), 32);
     }
 
+    public void testWriteExternalStorageDirs() throws Exception {
+        final File probe = new File(
+                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM),
+                "100CTS");
+
+        assertFalse(probe.exists());
+        assertTrue(probe.mkdirs());
+
+        assertDirReadWriteAccess(probe);
+    }
+
     /**
      * Verify that legacy filesystem paths continue working, and that they all
      * point to same location.
@@ -131,12 +137,12 @@
         for (File path : paths) {
             assertNotNull("Valid media must be inserted during CTS", path);
             assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
-                    Environment.getStorageState(path));
+                    Environment.getExternalStorageState(path));
 
             assertTrue(path.getAbsolutePath().contains(packageName));
 
             // Walk until we leave device, writing the whole way
-            while (Environment.MEDIA_MOUNTED.equals(Environment.getStorageState(path))) {
+            while (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState(path))) {
                 assertDirReadWriteAccess(path);
                 path = path.getParentFile();
             }
@@ -168,7 +174,7 @@
         int depth = 0;
         while (depth++ < 32) {
             assertDirReadWriteAccess(path);
-            assertEquals(Environment.MEDIA_MOUNTED, Environment.getStorageState(path));
+            assertEquals(Environment.MEDIA_MOUNTED, Environment.getExternalStorageState(path));
 
             if (path.getAbsolutePath().equals(top.getAbsolutePath())) {
                 break;
@@ -183,7 +189,7 @@
         // And going one step further should be outside our reach
         path = path.getParentFile();
         assertDirNoWriteAccess(path);
-        assertEquals(Environment.MEDIA_UNKNOWN, Environment.getStorageState(path));
+        assertEquals(Environment.MEDIA_UNKNOWN, Environment.getExternalStorageState(path));
     }
 
     /**
@@ -191,11 +197,11 @@
      */
     public void testMountStatus() {
         assertEquals(Environment.MEDIA_UNKNOWN,
-                Environment.getStorageState(new File("/meow-should-never-exist")));
+                Environment.getExternalStorageState(new File("/meow-should-never-exist")));
 
         // Internal data isn't a mount point
         assertEquals(Environment.MEDIA_UNKNOWN,
-                Environment.getStorageState(getContext().getCacheDir()));
+                Environment.getExternalStorageState(getContext().getCacheDir()));
     }
 
     /**
@@ -209,7 +215,7 @@
         for (File path : paths) {
             assertNotNull("Valid media must be inserted during CTS", path);
             assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
-                    Environment.getStorageState(path));
+                    Environment.getExternalStorageState(path));
 
             assertTrue(path.getAbsolutePath().contains(packageName));
 
@@ -220,7 +226,7 @@
             }
 
             // Keep walking up until we leave device
-            while (Environment.MEDIA_MOUNTED.equals(Environment.getStorageState(path))) {
+            while (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState(path))) {
                 assertDirReadOnlyAccess(path);
                 path = path.getParentFile();
             }
@@ -239,12 +245,12 @@
         for (File path : paths) {
             assertNotNull("Valid media must be inserted during CTS", path);
             assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
-                    Environment.getStorageState(path));
+                    Environment.getExternalStorageState(path));
 
             final File start = path;
 
             boolean found = false;
-            while (Environment.MEDIA_MOUNTED.equals(Environment.getStorageState(path))) {
+            while (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState(path))) {
                 final File test = new File(path, ".nomedia");
                 if (test.exists()) {
                     found = true;
@@ -266,57 +272,29 @@
      * {@link CommonExternalStorageTest#testAllPackageDirsWritable()}.
      */
     public void testSecondaryMountPointsNotWritable() throws Exception {
+        // Probe path could be /storage/emulated/0 or /storage/1234-5678
         final File probe = buildProbeFile(Environment.getExternalStorageDirectory());
         assertTrue(probe.createNewFile());
 
-        final BufferedReader br = new BufferedReader(new FileReader("/proc/self/mounts"));
-        try {
-            String line;
-            while ((line = br.readLine()) != null) {
-                final String[] fields = line.split(" ");
-                final File testMount = new File(fields[1]);
-                final File testProbe = new File(testMount, probe.getName());
-                if (testProbe.exists()) {
-                    Log.d(TAG, "Primary external mountpoint " + testMount);
-                } else {
-                    // This mountpoint is not primary external storage; we must
-                    // not be able to write.
-                    Log.d(TAG, "Other mountpoint " + testMount);
-                    assertDirNoWriteAccess(testProbe.getParentFile());
-                }
+        final String userId = Integer.toString(android.os.Process.myUid() / 100000);
+        final List<File> mountPaths = getMountPaths();
+        for (File path : mountPaths) {
+            // Mount points could be multi-user aware, so try probing both top
+            // level and user-specific directory.
+            final File userPath = new File(path, userId);
+
+            final File testProbe = new File(path, probe.getName());
+            final File testUserProbe = new File(userPath, probe.getName());
+
+            if (testProbe.exists() || testUserProbe.exists()) {
+                Log.d(TAG, "Primary external mountpoint " + path);
+            } else {
+                // This mountpoint is not primary external storage; we must
+                // not be able to write.
+                Log.d(TAG, "Other mountpoint " + path);
+                assertDirNoWriteAccess(path);
+                assertDirNoWriteAccess(userPath);
             }
-       } finally {
-           br.close();
-           probe.delete();
-       }
-    }
-
-    /**
-     * Leave gifts for other packages in their primary external cache dirs.
-     */
-    public void doWriteGifts() throws Exception {
-        final File none = buildGiftForPackage(getContext(), PACKAGE_NONE);
-        none.getParentFile().mkdirs();
-        none.createNewFile();
-        assertFileReadWriteAccess(none);
-
-        writeInt(none, 100);
-        assertEquals(100, readInt(none));
-
-        final File read = buildGiftForPackage(getContext(), PACKAGE_READ);
-        read.getParentFile().mkdirs();
-        read.createNewFile();
-        assertFileReadWriteAccess(read);
-
-        writeInt(read, 101);
-        assertEquals(101, readInt(read));
-
-        final File write = buildGiftForPackage(getContext(), PACKAGE_WRITE);
-        write.getParentFile().mkdirs();
-        write.createNewFile();
-        assertFileReadWriteAccess(write);
-
-        writeInt(write, 102);
-        assertEquals(102, readInt(write));
+        }
     }
 }
diff --git a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/src/com/android/cts/writeexternalstorageapp/WriteGiftTest.java b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/src/com/android/cts/writeexternalstorageapp/WriteGiftTest.java
new file mode 100644
index 0000000..5da42da
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/src/com/android/cts/writeexternalstorageapp/WriteGiftTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.writeexternalstorageapp;
+
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_NONE;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_READ;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_WRITE;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertFileReadWriteAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.buildGiftForPackage;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.readInt;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.writeInt;
+
+import android.test.AndroidTestCase;
+
+import java.io.File;
+
+public class WriteGiftTest extends AndroidTestCase {
+    /**
+     * Leave gifts for other packages in their primary external cache dirs.
+     */
+    public void testGifts() throws Exception {
+        final File none = buildGiftForPackage(getContext(), PACKAGE_NONE);
+        none.getParentFile().mkdirs();
+        none.createNewFile();
+        assertFileReadWriteAccess(none);
+
+        writeInt(none, 100);
+        assertEquals(100, readInt(none));
+
+        final File read = buildGiftForPackage(getContext(), PACKAGE_READ);
+        read.getParentFile().mkdirs();
+        read.createNewFile();
+        assertFileReadWriteAccess(read);
+
+        writeInt(read, 101);
+        assertEquals(101, readInt(read));
+
+        final File write = buildGiftForPackage(getContext(), PACKAGE_WRITE);
+        write.getParentFile().mkdirs();
+        write.createNewFile();
+        assertFileReadWriteAccess(write);
+
+        writeInt(write, 102);
+        assertEquals(102, readInt(write));
+    }
+}
diff --git a/hostsidetests/appsecurity/test-apps/keysets/malBadKey/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/malBadKey/Android.mk
new file mode 100644
index 0000000..207160f
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/keysets/malBadKey/Android.mk
@@ -0,0 +1,27 @@
+# Copyright (C) 2014 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+#apks signed cts-keyset-test-a
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+LOCAL_SDK_VERSION := current
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_PACKAGE_NAME := CtsKeySetSigningABadUpgradeB
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
+LOCAL_DEX_PREOPT := false
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/malBadKey/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/keysets/malBadKey/AndroidManifest.xml
new file mode 100644
index 0000000..e18bde5
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/keysets/malBadKey/AndroidManifest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.keysets">
+    <application android:hasCode="false">
+    </application>
+    <key-sets>
+        <key-set android:name="B" >
+          <public-key android:name="keyB"
+                      android:value="makebadpubkeyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoeFZqMqTbZiozFTXMkXtSKJRzn2qODZgvVXAAwKTi50xYcbPcHTfKxtif8+q7OCp/50JYDH32bg6wkUunn5+dEaHkxZY8d7uw46tQtl5dNGi+6cc4MezVLCS6nkqNDusAgdvgLU6Fl6SGi02KTp1vkt6CwLO977YJP7kt9ouDRTG7ASJiq3OyRRoOqYHhD9gpsbUq4w+1bXGfuuZujA1dXyovXtvrHUGOdFIEBYOVYGfCcwh3lXPmjNJMlHtKQkurq8/LH7a1B5ocoXCGsyR8YHdlWfrqRAfzgOB1KCnNNmWqskU9LOci3uQn9IDeMEFmAd8FqF8SwV+4Ludk/xWGQIDAQAB" />
+        </key-set>
+        <upgrade-key-set android:name="B"/>
+    </key-sets>
+</manifest>
diff --git a/hostsidetests/appsecurity/test-apps/keysets/malNoDef/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/malNoDef/Android.mk
new file mode 100644
index 0000000..84f3f75
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/keysets/malNoDef/Android.mk
@@ -0,0 +1,27 @@
+# Copyright (C) 2014 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+#apks signed cts-keyset-test-a
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+LOCAL_SDK_VERSION := current
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_PACKAGE_NAME := CtsKeySetSigningANoDefUpgradeB
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
+LOCAL_DEX_PREOPT := false
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/malNoDef/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/keysets/malNoDef/AndroidManifest.xml
new file mode 100644
index 0000000..aac717b
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/keysets/malNoDef/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.keysets">
+    <application android:hasCode="false">
+    </application>
+    <key-sets>
+        <upgrade-key-set android:name="B"/>
+    </key-sets>
+</manifest>
diff --git a/hostsidetests/appsecurity/test-apps/keysets/malOneDef/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/malOneDef/Android.mk
new file mode 100644
index 0000000..7290f06
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/keysets/malOneDef/Android.mk
@@ -0,0 +1,27 @@
+# Copyright (C) 2014 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+#apks signed cts-keyset-test-a
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+LOCAL_SDK_VERSION := current
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_PACKAGE_NAME := CtsKeySetSigningCBadAUpgradeAB
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-c
+LOCAL_DEX_PREOPT := false
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/malOneDef/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/keysets/malOneDef/AndroidManifest.xml
new file mode 100644
index 0000000..8242f6c
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/keysets/malOneDef/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.keysets">
+    <application android:hasCode="false">
+    </application>
+    <key-sets>
+        <key-set android:name="AB" >
+          <public-key android:name="keyA"
+                      android:value="makebadpubkeyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwf5zJblvYSB7Ym7or/7GggAAu7mp7RrykPJsXhod8doFhVT5s7eF3A4MCE55vvANP7HvwMw2b+T6qx7Pq0VJtbbSDtlBHBtIc47Pjq0CsDg590BUcgKp7PdJ9J6UVgtzDnV6cGEpXmSag3sY+lqiW04ytPhCVwzYTWGdYe9+TIl47cBrveRfLOlGrcuFQe+zCTmDFqzBKCRHK9b7l5PDWvXXyg65Uu/MBUA/TZWO0fEqOlxZG/nn6DUKQLhPdmJRXWJ3WqMNMhJGD+nKtkmdX703xRqmg4h+6g0S7M9Y3IQ2NUGyw05AYzCguHB/Mv6uVIiW659wpbyb45TgKG3UhQIDAQAB" />
+          <public-key android:name="keyB"
+                      android:value="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoeFZqMqTbZiozFTXMkXtSKJRzn2qODZgvVXAAwKTi50xYcbPcHTfKxtif8+q7OCp/50JYDH32bg6wkUunn5+dEaHkxZY8d7uw46tQtl5dNGi+6cc4MezVLCS6nkqNDusAgdvgLU6Fl6SGi02KTp1vkt6CwLO977YJP7kt9ouDRTG7ASJiq3OyRRoOqYHhD9gpsbUq4w+1bXGfuuZujA1dXyovXtvrHUGOdFIEBYOVYGfCcwh3lXPmjNJMlHtKQkurq8/LH7a1B5ocoXCGsyR8YHdlWfrqRAfzgOB1KCnNNmWqskU9LOci3uQn9IDeMEFmAd8FqF8SwV+4Ludk/xWGQIDAQAB" />
+        </key-set>
+        <upgrade-key-set android:name="AB"/>
+    </key-sets>
+</manifest>
diff --git a/hostsidetests/appsecurity/test-apps/keysets/permDef/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/permDef/Android.mk
index 715905a..f5a7286 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/permDef/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/keysets/permDef/Android.mk
@@ -24,7 +24,7 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 #apks signed cts-keyset-test-b
 include $(CLEAR_VARS)
@@ -36,4 +36,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-b
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/permUse/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/permUse/Android.mk
index eceea38..678d89d 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/permUse/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/keysets/permUse/Android.mk
@@ -24,7 +24,7 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 #apks signed cts-keyset-test-b
 include $(CLEAR_VARS)
@@ -36,4 +36,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-b
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/testApp/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/testApp/Android.mk
index ed6db690..b8acc99 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/testApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/keysets/testApp/Android.mk
@@ -23,4 +23,4 @@
 LOCAL_PACKAGE_NAME := CtsKeySetTestApp
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uA/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/uA/Android.mk
index efba345..79d053b 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/uA/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/keysets/uA/Android.mk
@@ -24,7 +24,7 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 #apks signed by cts-keyset-test-b
 include $(CLEAR_VARS)
@@ -35,7 +35,19 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-b
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
+
+#apks signed by cts-keyset-test-ec-a
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+LOCAL_SDK_VERSION := current
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_PACKAGE_NAME := CtsKeySetSigningEcAUpgradeA
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-ec-a
+LOCAL_DEX_PREOPT := false
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 #apks signed by cts-keyset-test-a and cts-keyset-test-b
 include $(CLEAR_VARS)
@@ -47,4 +59,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
 LOCAL_ADDITIONAL_CERTIFICATES := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-b
 LOCAL_DEX_PREOPT := false
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uAB/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/uAB/Android.mk
index 219689e..406529c 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/uAB/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/keysets/uAB/Android.mk
@@ -24,4 +24,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uAuB/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/uAuB/Android.mk
index 040c378..23d6b17 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/uAuB/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/keysets/uAuB/Android.mk
@@ -24,4 +24,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uB/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/uB/Android.mk
index 62b5461..f2cedf9 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/uB/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/keysets/uB/Android.mk
@@ -24,7 +24,7 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 #apks signed cts-keyset-test-b
 include $(CLEAR_VARS)
@@ -36,7 +36,7 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-b
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 #apks signed by cts-keyset-test-a and cts-keyset-test-c
 include $(CLEAR_VARS)
@@ -49,4 +49,4 @@
 LOCAL_ADDITIONAL_CERTIFICATES := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-c
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uBsharedUser/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/uBsharedUser/Android.mk
new file mode 100644
index 0000000..1d6d5a5
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/keysets/uBsharedUser/Android.mk
@@ -0,0 +1,39 @@
+# Copyright (C) 2014 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+#apks signed cts-keyset-test-a
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+LOCAL_SDK_VERSION := current
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_PACKAGE_NAME := CtsKeySetSharedUserSigningAUpgradeB
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
+LOCAL_DEX_PREOPT := false
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
+
+#apks signed cts-keyset-test-b
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+LOCAL_SDK_VERSION := current
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_PACKAGE_NAME := CtsKeySetSharedUserSigningBUpgradeB
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-b
+LOCAL_DEX_PREOPT := false
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uBsharedUser/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/keysets/uBsharedUser/AndroidManifest.xml
new file mode 100644
index 0000000..55a1c24
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/keysets/uBsharedUser/AndroidManifest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.keysets"
+        android:sharedUserId="com.android.cts.keysets.shareduser">
+    <application android:hasCode="false">
+    </application>
+    <key-sets>
+        <key-set android:name="B" >
+          <public-key android:name="keyB"
+                      android:value="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoeFZqMqTbZiozFTXMkXtSKJRzn2qODZgvVXAAwKTi50xYcbPcHTfKxtif8+q7OCp/50JYDH32bg6wkUunn5+dEaHkxZY8d7uw46tQtl5dNGi+6cc4MezVLCS6nkqNDusAgdvgLU6Fl6SGi02KTp1vkt6CwLO977YJP7kt9ouDRTG7ASJiq3OyRRoOqYHhD9gpsbUq4w+1bXGfuuZujA1dXyovXtvrHUGOdFIEBYOVYGfCcwh3lXPmjNJMlHtKQkurq8/LH7a1B5ocoXCGsyR8YHdlWfrqRAfzgOB1KCnNNmWqskU9LOci3uQn9IDeMEFmAd8FqF8SwV+4Ludk/xWGQIDAQAB" />
+        </key-set>
+        <upgrade-key-set android:name="B"/>
+    </key-sets>
+</manifest>
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uEcA/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/uEcA/Android.mk
new file mode 100644
index 0000000..3d0109a
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/keysets/uEcA/Android.mk
@@ -0,0 +1,27 @@
+# Copyright (C) 2014 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+#apks signed by cts-keyset-test-a
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+LOCAL_SDK_VERSION := current
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_PACKAGE_NAME := CtsKeySetSigningAUpgradeEcA
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
+LOCAL_DEX_PREOPT := false
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uEcA/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/keysets/uEcA/AndroidManifest.xml
new file mode 100644
index 0000000..a84704a
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/keysets/uEcA/AndroidManifest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.keysets">
+    <application android:hasCode="false">
+    </application>
+    <key-sets>
+        <key-set android:name="EcA" >
+          <public-key android:name="keyEcA"
+                      android:value="MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEfEPu5YOCkjrNgXtF4RcJRQrIggiId4l9renxPlfzA/kAU9duuYSMgShB/6ALE6S8vBXRiiwtMfk8LgnnbotEgQ=="/>
+        </key-set>
+        <upgrade-key-set android:name="EcA"/>
+    </key-sets>
+</manifest>
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uNone/Android.mk b/hostsidetests/appsecurity/test-apps/keysets/uNone/Android.mk
index 5fc4ab9..9b327fe 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/uNone/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/keysets/uNone/Android.mk
@@ -24,4 +24,4 @@
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/keysets/cts-keyset-test-a
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/atrace/Android.mk b/hostsidetests/atrace/Android.mk
new file mode 100644
index 0000000..1fd7102
--- /dev/null
+++ b/hostsidetests/atrace/Android.mk
@@ -0,0 +1,30 @@
+# Copyright (C) 2014 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.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+# Must match the package name in CtsTestCaseList.mk
+LOCAL_MODULE := CtsAtraceHostTestCases
+
+LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt
+
+LOCAL_CTS_TEST_PACKAGE := android.host.atrace
+
+include $(BUILD_CTS_HOST_JAVA_LIBRARY)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hostsidetests/atrace/AtraceTestApp/Android.mk b/hostsidetests/atrace/AtraceTestApp/Android.mk
new file mode 100644
index 0000000..0eb7cfd
--- /dev/null
+++ b/hostsidetests/atrace/AtraceTestApp/Android.mk
@@ -0,0 +1,33 @@
+# 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+
+LOCAL_PACKAGE_NAME := CtsAtraceTestApp
+
+# sign this app with a different cert than CtsSimpleAppInstallDiffCert
+#LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
+
+#LOCAL_DEX_PREOPT := false
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/atrace/AtraceTestApp/AndroidManifest.xml b/hostsidetests/atrace/AtraceTestApp/AndroidManifest.xml
new file mode 100644
index 0000000..a86f7f0
--- /dev/null
+++ b/hostsidetests/atrace/AtraceTestApp/AndroidManifest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+       package="com.android.cts.atracetestapp">
+    <!--
+    A simple app with a tracing section to test that apps tracing signals are
+    emitted by atrace.
+    -->
+    <application>
+        <activity android:name=".AtraceTestAppActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/hostsidetests/atrace/AtraceTestApp/src/com/android/cts/atracetestapp/AtraceTestAppActivity.java b/hostsidetests/atrace/AtraceTestApp/src/com/android/cts/atracetestapp/AtraceTestAppActivity.java
new file mode 100644
index 0000000..0269d0d
--- /dev/null
+++ b/hostsidetests/atrace/AtraceTestApp/src/com/android/cts/atracetestapp/AtraceTestAppActivity.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.atracetestapp;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.Trace;
+
+public class AtraceTestAppActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        Trace.beginSection("traceable-app-test-section");
+        super.onCreate(savedInstanceState);
+        Trace.endSection();
+    }
+}
diff --git a/hostsidetests/atrace/src/android/atrace/cts/AtraceHostTest.java b/hostsidetests/atrace/src/android/atrace/cts/AtraceHostTest.java
new file mode 100644
index 0000000..c8a2d8e
--- /dev/null
+++ b/hostsidetests/atrace/src/android/atrace/cts/AtraceHostTest.java
@@ -0,0 +1,290 @@
+/*
+ * Copyright (C) 2015 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.atrace.cts;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.ddmlib.Log;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Test to check that atrace is usable, to enable usage of systrace.
+ */
+public class AtraceHostTest extends DeviceTestCase implements IBuildReceiver {
+    private static final String TEST_APK = "CtsAtraceTestApp.apk";
+    private static final String TEST_PKG = "com.android.cts.atracetestapp";
+
+    private interface FtraceEntryCallback {
+        void onTraceEntry(String threadName, int pid, int tid, String eventType, String args);
+        void onFinished();
+    }
+
+    /**
+     * Helper for parsing ftrace data.
+     * Regexs copied from (and should be kept in sync with) ftrace importer in catapult.
+     */
+    private static class FtraceParser {
+        // Matches the trace record in 3.2 and later with the print-tgid option:
+        //          <idle>-0    0 [001] d...  1.23: sched_switch
+        private static final Pattern sLineWithTgid = Pattern.compile(
+                "^\\s*(.+)-(\\d+)\\s+\\(\\s*(\\d+|-+)\\)\\s\\[(\\d+)\\]"
+                + "\\s+[dX.][N.][Hhs.][0-9a-f.]"
+                + "\\s+(\\d+\\.\\d+):\\s+(\\S+):\\s(.*)");
+
+        // Matches the default trace record in 3.2 and later (includes irq-info):
+        //          <idle>-0     [001] d...  1.23: sched_switch
+        private static final Pattern sLineWithIrqInfo = Pattern.compile(
+                "^\\s*(.+)-(\\d+)\\s+\\[(\\d+)\\]"
+                + "\\s+[dX.][N.][Hhs.][0-9a-f.]"
+                + "\\s+(\\d+\\.\\d+):\\s+(\\S+):\\s(.*)$");
+
+        // Matches the default trace record pre-3.2:
+        //          <idle>-0     [001]  1.23: sched_switch
+        private static final Pattern sLineLegacy = Pattern.compile(
+                "^\\s*(.+)-(\\d+)\\s+\\[(\\d+)\\]\\s*(\\d+\\.\\d+):\\s+(\\S+):\\s(.*)");
+        private static void parseLine(String line, FtraceEntryCallback callback) {
+            Matcher m = sLineWithTgid.matcher(line);
+            if (m.matches()) {
+                callback.onTraceEntry(
+                        /*threadname*/ m.group(1),
+                        /*pid*/ m.group(3).startsWith("-") ? -1 : Integer.parseInt(m.group(3)),
+                        /*tid*/ Integer.parseInt(m.group(2)),
+                        /*eventName*/ m.group(6),
+                        /*details*/ m.group(7));
+                return;
+            }
+
+            m = sLineWithIrqInfo.matcher(line);
+            if (m.matches()) {
+                callback.onTraceEntry(
+                        /*threadname*/ m.group(1),
+                        /*pid*/ -1,
+                        /*tid*/ Integer.parseInt(m.group(2)),
+                        /*eventName*/ m.group(5),
+                        /*details*/ m.group(6));
+                return;
+            }
+
+            m = sLineLegacy.matcher(line);
+            if (m.matches()) {
+                callback.onTraceEntry(
+                        /*threadname*/ m.group(1),
+                        /*pid*/ -1,
+                        /*tid*/ Integer.parseInt(m.group(2)),
+                        /*eventName*/ m.group(5),
+                        /*details*/ m.group(6));
+                return;
+            }
+            System.err.println("line doesn't match: " + line);
+        }
+
+        private static void parse(Reader reader, FtraceEntryCallback callback) throws Exception {
+            try {
+                BufferedReader bufferedReader = new BufferedReader(reader);
+                String line;
+                while ((line = bufferedReader.readLine()) != null) {
+                    FtraceParser.parseLine(line, callback);
+                }
+            } finally {
+                callback.onFinished();
+            }
+        }
+    }
+
+    private CtsBuildHelper mCtsBuild;
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setBuild(IBuildInfo buildInfo) {
+        mCtsBuild = CtsBuildHelper.createBuildHelper(buildInfo);
+    }
+
+    // Collection of all userspace tags, and 'sched'
+    private static final List<String> sRequiredCategoriesList = Arrays.asList(
+            "sched",
+            "gfx",
+            "input",
+            "view",
+            "webview",
+            "wm",
+            "am",
+            "sm",
+            "audio",
+            "video",
+            "camera",
+            "hal",
+            "app",
+            "res",
+            "dalvik",
+            "rs",
+            "bionic",
+            "power"
+    );
+
+    /**
+     * Tests that atrace exists and is runnable with no args
+     */
+    public void testSimpleRun() throws Exception {
+        String output = getDevice().executeShellCommand("atrace");
+        String[] lines = output.split("\\r?\\n");
+
+        // check for expected stdout
+        assertEquals("capturing trace... done", lines[0]);
+        assertEquals("TRACE:", lines[1]);
+
+        // commented trace marker starts here
+        assertEquals("# tracer: nop", lines[2]);
+    }
+
+    /**
+     * Tests the output of "atrace --list_categories" to ensure required categories exist.
+     */
+    public void testCategories() throws Exception {
+        String output = getDevice().executeShellCommand("atrace --list_categories");
+        String[] categories = output.split("\\r?\\n");
+
+        Set<String> requiredCategories = new HashSet<String>(sRequiredCategoriesList);
+
+        for (String category : categories) {
+            int dashIndex = category.indexOf("-");
+
+            assertTrue(dashIndex > 1); // must match category output format
+            category = category.substring(0, dashIndex).trim();
+
+            requiredCategories.remove(category);
+        }
+
+        if (!requiredCategories.isEmpty()) {
+            for (String missingCategory : requiredCategories) {
+                System.err.println("missing category: " + missingCategory);
+            }
+            fail("Expected categories missing from atrace");
+        }
+    }
+
+    /**
+     * Tests that atrace captures app launch, including app level tracing
+     */
+    public void testTracingContent() throws Exception {
+        String atraceOutput = null;
+        try {
+            // cleanup test apps that might be installed from previous partial test run
+            getDevice().uninstallPackage(TEST_PKG);
+
+            // install the test app
+            File testAppFile = mCtsBuild.getTestApp(TEST_APK);
+            String installResult = getDevice().installPackage(testAppFile, false);
+            assertNull(
+                    String.format("failed to install atrace test app. Reason: %s", installResult),
+                    installResult);
+
+            // capture a launch of the app with async tracing
+            // content traced by 'view' tag tested below, 'sched' used to ensure tgid printed
+            String atraceArgs = "-a " + TEST_PKG + " -c -b 16000 view sched"; // TODO: zipping
+            getDevice().executeShellCommand("atrace --async_stop " + atraceArgs);
+            getDevice().executeShellCommand("atrace --async_start " + atraceArgs);
+            getDevice().executeShellCommand("am start " + TEST_PKG);
+            getDevice().executeShellCommand("sleep 1");
+            atraceOutput = getDevice().executeShellCommand("atrace --async_stop " + atraceArgs);
+        } finally {
+            assertNotNull("unable to capture atrace output", atraceOutput);
+            getDevice().uninstallPackage(TEST_PKG);
+        }
+
+
+        // now parse the trace data (see external/chromium-trace/systrace.py)
+        final String MARKER = "TRACE:";
+        int dataStart = atraceOutput.indexOf(MARKER);
+        assertTrue(dataStart >= 0);
+        String traceData = atraceOutput.substring(dataStart + MARKER.length());
+
+        FtraceEntryCallback callback = new FtraceEntryCallback() {
+            private int matches = 0;
+            private int nextSectionIndex = 0;
+            private int appPid = -1;
+
+            // list of tags expected to be seen on app launch, in order.
+            private final String[] requiredSectionList = {
+                    "traceable-app-test-section",
+                    "inflate",
+                    "Choreographer#doFrame",
+                    "traversal",
+                    "measure",
+                    "layout",
+                    "draw",
+                    "Record View#draw()"
+            };
+
+            @Override
+            public void onTraceEntry(String truncatedThreadName, int pid, int tid,
+                    String eventName, String details) {
+                if (!"tracing_mark_write".equals(eventName)) {
+                    // not userspace trace, ignore
+                    return;
+                }
+
+                matches++;
+                assertNotNull(truncatedThreadName);
+                assertTrue(tid > 0);
+                if (TEST_PKG.endsWith(truncatedThreadName)) {
+                    matches++;
+
+                    if (pid >= 0) {
+                        // verify pid, if present
+                        if (appPid == -1) {
+                            appPid = pid;
+                        } else {
+                            assertEquals(appPid, pid);
+                        }
+                    }
+
+                    if (nextSectionIndex < requiredSectionList.length
+                            && details != null
+                            && details.startsWith("B|")
+                            && details.endsWith("|" + requiredSectionList[nextSectionIndex])) {
+                        nextSectionIndex++;
+                    }
+                }
+            }
+
+            @Override
+            public void onFinished() {
+                assertTrue("Unable to parse any userspace sections from atrace output",
+                        matches != 0);
+                assertEquals("Didn't see required list of traced sections, in order",
+                        requiredSectionList.length, nextSectionIndex);
+            }
+        };
+
+        FtraceParser.parse(new StringReader(traceData), callback);
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/CertInstaller/Android.mk b/hostsidetests/devicepolicy/app/CertInstaller/Android.mk
new file mode 100644
index 0000000..22a78e2
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/CertInstaller/Android.mk
@@ -0,0 +1,31 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_PACKAGE_NAME := CtsCertInstallerApp
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/devicepolicy/app/CertInstaller/AndroidManifest.xml b/hostsidetests/devicepolicy/app/CertInstaller/AndroidManifest.xml
new file mode 100644
index 0000000..c50e5fd
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/CertInstaller/AndroidManifest.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.certinstaller">
+
+    <uses-sdk android:minSdkVersion="22"/>
+
+    <application>
+        <activity android:name="CertInstallerActivity">
+            <intent-filter>
+                <action android:name="com.android.cts.certinstaller.install_cert" />
+                <action android:name="com.android.cts.certinstaller.remove_cert" />
+                <action android:name="com.android.cts.certinstaller.verify_cert" />
+                <action android:name="com.android.cts.certinstaller.install_keypair" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
diff --git a/hostsidetests/devicepolicy/app/CertInstaller/src/com/android/cts/certinstaller/CertInstallerActivity.java b/hostsidetests/devicepolicy/app/CertInstaller/src/com/android/cts/certinstaller/CertInstallerActivity.java
new file mode 100644
index 0000000..b14822b
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/CertInstaller/src/com/android/cts/certinstaller/CertInstallerActivity.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.certinstaller;
+
+import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Base64;
+import android.util.Base64InputStream;
+import android.util.Log;
+
+import java.io.ByteArrayInputStream;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.cert.Certificate;
+import java.util.List;
+
+/**
+ * Delegated certificate installer app that responds to specific intents and executes various DPM
+ * certificate manipulation APIs. The following APIs are exercised:
+ * {@link DevicePolicyManager#installCaCert},
+ * {@link DevicePolicyManager#uninstallCaCert},
+ * {@link DevicePolicyManager#hasCaCertInstalled},
+ * {@link DevicePolicyManager#getInstalledCaCerts},
+ * {@link DevicePolicyManager#installKeyPair}.
+ */
+public class CertInstallerActivity extends Activity {
+
+    private static final String TAG = "DelegatedCertInstaller";
+    // exercises {@link DevicePolicyManager#installCaCert} and
+    // {@link DevicePolicyManager#hasCaCertInstalled},
+    private static final String ACTION_INSTALL_CERT = "com.android.cts.certinstaller.install_cert";
+    // exercises {@link DevicePolicyManager#uninstallCaCert} and
+    // {@link DevicePolicyManager#hasCaCertInstalled},
+    private static final String ACTION_REMOVE_CERT = "com.android.cts.certinstaller.remove_cert";
+    // exercises {@link DevicePolicyManager#getInstalledCaCerts},
+    private static final String ACTION_VERIFY_CERT = "com.android.cts.certinstaller.verify_cert";
+    // exercises {@link DevicePolicyManager#installKeyPair},
+    private static final String ACTION_INSTALL_KEYPAIR =
+            "com.android.cts.certinstaller.install_keypair";
+
+    private static final String ACTION_CERT_OPERATION_DONE = "com.android.cts.certinstaller.done";
+
+    private static final String EXTRA_CERT_DATA = "extra_cert_data";
+    private static final String EXTRA_KEY_DATA = "extra_key_data";
+    private static final String EXTRA_KEY_ALIAS = "extra_key_alias";
+    private static final String EXTRA_RESULT_VALUE = "extra_result_value";
+    private static final String EXTRA_RESULT_EXCEPTION = "extra_result_exception";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Intent intent = getIntent();
+        if (intent == null) {
+            finish();
+            return;
+        }
+
+        String action = intent.getAction();
+        DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(
+                Context.DEVICE_POLICY_SERVICE);
+
+        byte[] certBuffer;
+
+        if (ACTION_INSTALL_CERT.equals(action)) {
+            try {
+                certBuffer = intent.getByteArrayExtra(EXTRA_CERT_DATA);
+                // Verify cert is not currently installed.
+                if (dpm.hasCaCertInstalled(null, certBuffer)) {
+                    throw new RuntimeException("Cert already on device?");
+                }
+                if (!dpm.installCaCert(null, certBuffer)) {
+                    throw new RuntimeException("installCaCert returned false.");
+                }
+                if (!dpm.hasCaCertInstalled(null, certBuffer)) {
+                    throw new RuntimeException("Cannot find cert after installation.");
+                }
+                sendResult(true, null);
+            } catch (Exception e) {
+                Log.e(TAG, "Exception raised duing ACTION_INSTALL_CERT", e);
+                sendResult(false, e);
+            }
+        } else if (ACTION_REMOVE_CERT.equals(action)) {
+            try {
+                certBuffer = intent.getByteArrayExtra(EXTRA_CERT_DATA);
+                if (!dpm.hasCaCertInstalled(null, certBuffer)) {
+                    throw new RuntimeException("Trying to uninstall a non-existent cert.");
+                }
+                dpm.uninstallCaCert(null, certBuffer);
+                sendResult(!dpm.hasCaCertInstalled(null, certBuffer), null);
+            } catch (Exception e) {
+                Log.e(TAG, "Exception raised duing ACTION_REMOVE_CERT", e);
+                sendResult(false, e);
+            }
+        } else if (ACTION_VERIFY_CERT.equals(action)) {
+            try {
+                certBuffer = intent.getByteArrayExtra(EXTRA_CERT_DATA);
+                sendResult(containsCertificate(dpm.getInstalledCaCerts(null), certBuffer), null);
+            } catch (Exception e) {
+                Log.e(TAG, "Exception raised duing ACTION_VERIFY_CERT", e);
+                sendResult(false, e);
+            }
+        } else if (ACTION_INSTALL_KEYPAIR.equals(action)) {
+            String alias = intent.getStringExtra(EXTRA_KEY_ALIAS);
+            String key = intent.getStringExtra(EXTRA_KEY_DATA);
+            String cert = intent.getStringExtra(EXTRA_CERT_DATA);
+            try {
+                PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(
+                        Base64.decode(key, Base64.DEFAULT));
+                KeyFactory kf = KeyFactory.getInstance("RSA");
+                PrivateKey privatekey = kf.generatePrivate(keySpec);
+
+                Certificate certificate = CertificateFactory.getInstance("X.509")
+                        .generateCertificate(
+                                new Base64InputStream(new ByteArrayInputStream(cert.getBytes()),
+                                        Base64.DEFAULT));
+                // Unfortunately there is no programmatically way to check if the given private key
+                // is indeed in the key store as a unprivileged app. So we just rely on
+                // installKeyPair() returning true as the success criteria of this test. Separate
+                // CTS keychain tests will make sure the API's behaviour is correct.
+                // Note: installKeyPair() will silently return false if there is no lockscreen
+                // password, however the test setup should have set one already.
+                sendResult(dpm.installKeyPair(null, privatekey, certificate,  alias), null);
+            } catch (Exception e) {
+                Log.e(TAG, "Exception raised duing ACTION_INSTALL_KEYPAIR", e);
+                sendResult(false, e);
+            }
+        }
+        finish();
+    }
+
+    private void sendResult(boolean succeed, Exception e) {
+        Intent intent = new Intent();
+        intent.setAction(ACTION_CERT_OPERATION_DONE);
+        intent.putExtra(EXTRA_RESULT_VALUE, succeed);
+        if (e != null) {
+            intent.putExtra(EXTRA_RESULT_EXCEPTION, e);
+        }
+        sendBroadcast(intent);
+    }
+
+    private boolean containsCertificate(List<byte[]> certificates, byte[] toMatch)
+            throws CertificateException {
+        Certificate certificateToMatch = readCertificate(toMatch);
+        for (byte[] certBuffer : certificates) {
+            Certificate cert = readCertificate(certBuffer);
+            if (certificateToMatch.equals(cert)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private Certificate readCertificate(byte[] certBuffer) throws CertificateException {
+        final CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
+        return certFactory.generateCertificate(new ByteArrayInputStream(certBuffer));
+    }
+
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/Android.mk b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/Android.mk
new file mode 100644
index 0000000..0548af6
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/Android.mk
@@ -0,0 +1,33 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_PACKAGE_NAME := CtsDeviceAndProfileOwnerApp
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_JAVA_LIBRARIES := android.test.runner cts-junit
+
+LOCAL_STATIC_JAVA_LIBRARIES = android-support-v4 ctstestrunner ub-uiautomator
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/AndroidManifest.xml b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/AndroidManifest.xml
new file mode 100644
index 0000000..ed920e9
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/AndroidManifest.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.deviceandprofileowner">
+
+    <uses-sdk android:minSdkVersion="23"/>
+    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
+    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
+    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+        <receiver
+            android:name="com.android.cts.deviceandprofileowner.BaseDeviceAdminTest$BasicAdminReceiver"
+            android:permission="android.permission.BIND_DEVICE_ADMIN">
+            <meta-data android:name="android.app.device_admin"
+                       android:resource="@xml/device_admin" />
+            <intent-filter>
+                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
+            </intent-filter>
+        </receiver>
+        <activity
+            android:name="com.android.cts.deviceandprofileowner.ApplicationRestrictionsActivity" />
+        <activity
+            android:name="com.android.cts.deviceandprofileowner.ScreenCaptureDisabledActivity" />
+        <activity
+            android:name="com.android.cts.deviceandprofileowner.ExampleIntentReceivingActivity1">
+            <intent-filter>
+                <action android:name="com.android.cts.deviceandprofileowner.EXAMPLE_ACTION" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
+        <activity
+            android:name="com.android.cts.deviceandprofileowner.ExampleIntentReceivingActivity2">
+            <intent-filter>
+                <action android:name="com.android.cts.deviceandprofileowner.EXAMPLE_ACTION" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
+        <service android:name=".MockAccountService" android:exported="true">
+            <intent-filter>
+                <action android:name="android.accounts.AccountAuthenticator" />
+            </intent-filter>
+
+            <meta-data android:name="android.accounts.AccountAuthenticator"
+                       android:resource="@xml/authenticator" />
+        </service>
+
+    </application>
+
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="com.android.cts.deviceandprofileowner"
+                     android:label="Profile and Device Owner CTS Tests"/>
+</manifest>
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/res/values/strings.xml b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/res/values/strings.xml
new file mode 100644
index 0000000..4aca824
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/res/values/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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">
+    <!-- Label for this package -->
+    <string name="authenticator_label">Android CTS - Device and Profile Owner</string>
+</resources>
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/res/xml/authenticator.xml b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/res/xml/authenticator.xml
new file mode 100644
index 0000000..0d8ecd8
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/res/xml/authenticator.xml
@@ -0,0 +1,22 @@
+<!-- Copyright (C) 2015 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.
+-->
+
+<!-- The attributes in this XML file provide configuration information -->
+<!-- for the Account Manager. -->
+
+<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
+    android:accountType="com.android.cts.deviceandprofileowner.account.type"
+    android:label="@string/authenticator_label"
+/>
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/res/xml/device_admin.xml b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/res/xml/device_admin.xml
new file mode 100644
index 0000000..69a661c
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/res/xml/device_admin.xml
@@ -0,0 +1,18 @@
+<!-- Copyright (C) 2015 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.
+-->
+<device-admin xmlns:android="http://schemas.android.com/apk/res/android" android:visible="false">
+    <uses-policies>
+    </uses-policies>
+</device-admin>
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AccountManagementTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AccountManagementTest.java
new file mode 100644
index 0000000..2d30ee3
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AccountManagementTest.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.deviceandprofileowner;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AccountManagerFuture;
+import android.accounts.AuthenticatorException;
+import android.accounts.OperationCanceledException;
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.os.Bundle;
+
+import java.io.IOException;
+
+/**
+ * Functionality tests for {@link DevicePolicyManager#setAccountManagementDisabled}
+ *
+ * Fire up a remote unprivileged service and attempt to add/remove/list
+ * accounts from it to verify the enforcement is in place.
+ *
+ * This test depend on {@link MockAccountService}, which provides authenticator of type
+ * {@link MockAccountService#ACCOUNT_TYPE}.
+ */
+public class AccountManagementTest extends BaseDeviceAdminTest {
+
+    // Account type for MockAccountAuthenticator
+    private final static String ACCOUNT_TYPE_1 = MockAccountAuthenticator.ACCOUNT_TYPE;
+    private final static String ACCOUNT_TYPE_2 = "com.dummy.account";
+    private final static Account ACCOUNT_0 = new Account("user0", ACCOUNT_TYPE_1);
+    private final static Account ACCOUNT_1 = new Account("user1", ACCOUNT_TYPE_1);
+
+    private AccountManager mAccountManager;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mAccountManager = (AccountManager) mContext.getSystemService(Context.ACCOUNT_SERVICE);
+        clearAllAccountManagementDisabled();
+        AccountUtilsTest.removeAllAccountsForType(mAccountManager, ACCOUNT_TYPE_1);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        clearAllAccountManagementDisabled();
+        AccountUtilsTest.removeAllAccountsForType(mAccountManager, ACCOUNT_TYPE_1);
+        super.tearDown();
+    }
+
+    public void testAccountManagementDisabled_setterAndGetter() {
+        // Some local tests: adding and removing disabled accounts and make sure
+        // DevicePolicyManager keeps track of the disabled set correctly
+        assertEquals(0, mDevicePolicyManager.getAccountTypesWithManagementDisabled().length);
+
+        mDevicePolicyManager.setAccountManagementDisabled(ADMIN_RECEIVER_COMPONENT, ACCOUNT_TYPE_1,
+                true);
+        assertEquals(1, mDevicePolicyManager.getAccountTypesWithManagementDisabled().length);
+        assertEquals(ACCOUNT_TYPE_1,
+                mDevicePolicyManager.getAccountTypesWithManagementDisabled()[0]);
+
+        mDevicePolicyManager.setAccountManagementDisabled(ADMIN_RECEIVER_COMPONENT, ACCOUNT_TYPE_1,
+                false);
+        assertEquals(0, mDevicePolicyManager.getAccountTypesWithManagementDisabled().length);
+    }
+
+    public void testAccountManagementDisabled_addAccount() throws AuthenticatorException,
+            IOException, OperationCanceledException {
+        // Test for restriction on addAccount()
+        mDevicePolicyManager.setAccountManagementDisabled(ADMIN_RECEIVER_COMPONENT, ACCOUNT_TYPE_1,
+                true);
+        // Test if disabling ACCOUNT_TYPE_2 affects ACCOUNT_TYPE_1
+        mDevicePolicyManager.setAccountManagementDisabled(ADMIN_RECEIVER_COMPONENT, ACCOUNT_TYPE_2,
+                false);
+        assertEquals(1, mDevicePolicyManager.getAccountTypesWithManagementDisabled().length);
+
+        assertEquals(0, mAccountManager.getAccountsByType(ACCOUNT_TYPE_1).length);
+        // Management is disabled, adding account should fail.
+        try {
+            mAccountManager.addAccount(ACCOUNT_TYPE_1, null, null, null, null, null, null)
+                    .getResult();
+            fail("Expected OperationCanceledException is not thrown.");
+        } catch (OperationCanceledException e) {
+            // Expected
+        }
+        assertEquals(0, mAccountManager.getAccountsByType(ACCOUNT_TYPE_1).length);
+
+        // Management is re-enabled, adding account should succeed.
+        mDevicePolicyManager.setAccountManagementDisabled(ADMIN_RECEIVER_COMPONENT, ACCOUNT_TYPE_1,
+                false);
+        assertEquals(0, mDevicePolicyManager.getAccountTypesWithManagementDisabled().length);
+        Bundle result = mAccountManager.addAccount(ACCOUNT_TYPE_1,
+                null, null, null, null, null, null).getResult();
+
+        // Normally the expected result of addAccount() is AccountManager returning
+        // an intent to start the authenticator activity for adding new accounts.
+        // But MockAccountAuthenticator returns a new account straightway.
+        assertEquals(ACCOUNT_TYPE_1, result.getString(AccountManager.KEY_ACCOUNT_TYPE));
+    }
+
+    public void testAccountManagementDisabled_removeAccount() throws AuthenticatorException,
+            IOException, OperationCanceledException {
+        // Test for restriction on removeAccount()
+        mDevicePolicyManager.setAccountManagementDisabled(ADMIN_RECEIVER_COMPONENT, ACCOUNT_TYPE_1,
+                true);
+        mDevicePolicyManager.setAccountManagementDisabled(ADMIN_RECEIVER_COMPONENT, ACCOUNT_TYPE_2,
+                false);
+        assertEquals(1, mDevicePolicyManager.getAccountTypesWithManagementDisabled().length);
+
+        assertEquals(0, mAccountManager.getAccountsByType(ACCOUNT_TYPE_1).length);
+        // First prepare some accounts by manually adding them,
+        // setAccountManagementDisabled(true) should not stop addAccountExplicitly().
+        assertTrue(mAccountManager.addAccountExplicitly(ACCOUNT_0, "password", null));
+        assertTrue(mAccountManager.addAccountExplicitly(ACCOUNT_1, "password", null));
+        assertEquals(2, mAccountManager.getAccountsByType(ACCOUNT_TYPE_1).length);
+
+        // Removing account should fail, as we just disabled it.
+        try {
+            mAccountManager.removeAccount(ACCOUNT_0, null, null).getResult();
+            fail("Expected OperationCanceledException is not thrown.");
+        } catch (OperationCanceledException e) {
+            // Expected
+        }
+        assertEquals(2, mAccountManager.getAccountsByType(ACCOUNT_TYPE_1).length);
+
+        // Re-enable management, so we can successfully remove account this time.
+        mDevicePolicyManager.setAccountManagementDisabled(ADMIN_RECEIVER_COMPONENT, ACCOUNT_TYPE_1,
+                false);
+        assertEquals(0, mDevicePolicyManager.getAccountTypesWithManagementDisabled().length);
+        assertTrue(mAccountManager.removeAccount(ACCOUNT_0, null, null).getResult());
+
+        // Make sure the removal actually succeeds.
+        Account[] accounts = mAccountManager.getAccountsByType(ACCOUNT_TYPE_1);
+        assertEquals(1, accounts.length);
+        assertEquals(ACCOUNT_1, accounts[0]);
+
+        // Disable account type 2, we should still be able to remove from type 1.
+        mDevicePolicyManager.setAccountManagementDisabled(ADMIN_RECEIVER_COMPONENT, ACCOUNT_TYPE_2,
+                true);
+        assertEquals(1, mDevicePolicyManager.getAccountTypesWithManagementDisabled().length);
+        assertTrue(mAccountManager.removeAccount(ACCOUNT_1, null, null).getResult());
+
+        // Make sure the removal actually succeeds.
+        assertEquals(0, mAccountManager.getAccountsByType(ACCOUNT_TYPE_1).length);
+    }
+
+    private void clearAllAccountManagementDisabled() {
+        for (String accountType : mDevicePolicyManager.getAccountTypesWithManagementDisabled()) {
+            mDevicePolicyManager.setAccountManagementDisabled(ADMIN_RECEIVER_COMPONENT, accountType,
+                    false);
+        }
+        assertEquals(0, mDevicePolicyManager.getAccountTypesWithManagementDisabled().length);
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AccountUtilsTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AccountUtilsTest.java
new file mode 100644
index 0000000..7a9e5ad
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AccountUtilsTest.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.deviceandprofileowner;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AccountManagerFuture;
+import android.content.Context;
+import android.os.Bundle;
+import android.test.AndroidTestCase;
+
+/**
+ * Utility class that allows adding and removing accounts.
+ *
+ * This test depend on {@link MockAccountService}, which provides authenticator of type
+ * {@link MockAccountService#ACCOUNT_TYPE}.
+ */
+public class AccountUtilsTest extends AndroidTestCase {
+
+    private final static Account ACCOUNT_0 = new Account("user0",
+            MockAccountAuthenticator.ACCOUNT_TYPE);
+    private AccountManager mAccountManager;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mAccountManager = (AccountManager) getContext().getSystemService(Context.ACCOUNT_SERVICE);
+    }
+
+    public void testAddAccount() throws Exception {
+        assertEquals(0, mAccountManager.getAccountsByType(MockAccountAuthenticator.ACCOUNT_TYPE)
+                .length);
+        assertTrue(mAccountManager.addAccountExplicitly(ACCOUNT_0, "password", null));
+        assertEquals(1, mAccountManager.getAccountsByType(MockAccountAuthenticator.ACCOUNT_TYPE)
+                .length);
+    }
+
+    public void testRemoveAccounts() throws Exception {
+        removeAllAccountsForType(mAccountManager, MockAccountAuthenticator.ACCOUNT_TYPE);
+    }
+
+    static void removeAllAccountsForType(AccountManager am, String accountType)
+            throws Exception {
+        Account[] accounts = am.getAccountsByType(accountType);
+        for (Account account : accounts) {
+            AccountManagerFuture<Boolean> result = am.removeAccount(account, null, null);
+            assertTrue(result.getResult());
+        }
+        assertEquals(0, am.getAccountsByType(accountType).length);
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ApplicationHiddenTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ApplicationHiddenTest.java
new file mode 100644
index 0000000..d8be42f
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ApplicationHiddenTest.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.deviceandprofileowner;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.Uri;
+import android.util.Log;
+
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Tests for {@link DevicePolicyManager#setApplicationHidden} and
+ * {@link DevicePolicyManager#isApplicationHidden} APIs.
+ */
+public class ApplicationHiddenTest extends BaseDeviceAdminTest {
+
+    private static final String TAG = "ApplicationHiddenTest";
+
+    private static final String PACKAGE_TO_HIDE = "com.android.cts.permissionapp";
+    private static final String NONEXISTING_PACKAGE_NAME = "a.b.c.d";
+
+    private static final IntentFilter PACKAGE_INTENT_FILTER;
+    static {
+        PACKAGE_INTENT_FILTER = new IntentFilter();
+        PACKAGE_INTENT_FILTER.addAction(Intent.ACTION_PACKAGE_ADDED);
+        PACKAGE_INTENT_FILTER.addAction(Intent.ACTION_PACKAGE_REMOVED);
+        PACKAGE_INTENT_FILTER.addDataScheme("package");
+    }
+    private final ApplicationHiddenReceiver mReceiver = new ApplicationHiddenReceiver();
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mContext.registerReceiver(mReceiver, PACKAGE_INTENT_FILTER);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mContext.unregisterReceiver(mReceiver);
+        mDevicePolicyManager.setApplicationHidden(ADMIN_RECEIVER_COMPONENT, PACKAGE_TO_HIDE, false);
+        super.tearDown();
+    }
+
+    public void testSetApplicationHidden() throws Exception {
+        assertTrue(mDevicePolicyManager.setApplicationHidden(ADMIN_RECEIVER_COMPONENT,
+                PACKAGE_TO_HIDE, true));
+        assertTrue(mDevicePolicyManager.isApplicationHidden(ADMIN_RECEIVER_COMPONENT,
+                PACKAGE_TO_HIDE));
+        mReceiver.waitForRemovedBroadcast();
+        assertTrue(mDevicePolicyManager.setApplicationHidden(ADMIN_RECEIVER_COMPONENT,
+                PACKAGE_TO_HIDE, false));
+        assertFalse(mDevicePolicyManager.isApplicationHidden(ADMIN_RECEIVER_COMPONENT,
+                PACKAGE_TO_HIDE));
+        mReceiver.waitForAddedBroadcast();
+    }
+
+    public void testCannotHideActiveAdmin() throws Exception {
+        assertFalse(mDevicePolicyManager.setApplicationHidden(ADMIN_RECEIVER_COMPONENT,
+                PACKAGE_NAME, true));
+    }
+
+    public void testCannotHideNonExistingPackage() throws Exception {
+        assertFalse(mDevicePolicyManager.setApplicationHidden(ADMIN_RECEIVER_COMPONENT,
+                NONEXISTING_PACKAGE_NAME, true));
+    }
+
+    private class ApplicationHiddenReceiver extends BroadcastReceiver {
+        private final Semaphore mAddedSemaphore = new Semaphore(0);
+        private final Semaphore mRemovedSemaphore = new Semaphore(0);
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Uri uri = intent.getData();
+            if (uri == null) {
+                return;
+            }
+            String pkgName = uri.getSchemeSpecificPart();
+            if (!PACKAGE_TO_HIDE.equals(pkgName)) {
+                return;
+            }
+            if (Intent.ACTION_PACKAGE_ADDED.equals(intent.getAction())) {
+                Log.d(TAG, "Received PACKAGE_ADDED broadcast");
+                mAddedSemaphore.release();
+            } else if (Intent.ACTION_PACKAGE_REMOVED.equals(intent.getAction())) {
+                Log.d(TAG, "Received PACKAGE_REMOVED broadcast");
+                mRemovedSemaphore.release();
+            }
+        }
+
+        public void waitForAddedBroadcast() throws Exception {
+            if (!mAddedSemaphore.tryAcquire(60, TimeUnit.SECONDS)) {
+                fail("Did not receive PACKAGE_ADDED broadcast.");
+            }
+        }
+
+        public void waitForRemovedBroadcast() throws Exception {
+            if (!mRemovedSemaphore.tryAcquire(60, TimeUnit.SECONDS)) {
+                fail("Did not receive PACKAGE_REMOVED broadcast.");
+            }
+        }
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ApplicationRestrictionsActivity.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ApplicationRestrictionsActivity.java
new file mode 100644
index 0000000..ccf8222
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ApplicationRestrictionsActivity.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2014 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 com.android.cts.deviceandprofileowner;
+
+import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.os.UserManager;
+
+/**
+ * Test activity for setApplicationRestrictions().
+ *
+ * The actual test will set restrictions for this package, and the purpose of this
+ * activity is to listen for the ACTION_APPLICATION_RESTRICTIONS_CHANGED broadcast
+ * and relay the retrieved restriction bundle back to the test for validation.
+ */
+public class ApplicationRestrictionsActivity extends Activity {
+
+    // Incoming intent type
+    public static final String FINISH = "finishActivity";
+
+    // Outgoing broadcast
+    public static final String REGISTERED_ACTION =
+            "com.android.cts.deviceandprofileowner.APP_RESTRICTION_REGISTERED";
+    public static final String RESTRICTION_ACTION =
+            "com.android.cts.deviceandprofileowner.APP_RESTRICTION_VALUE";
+
+    private UserManager mUserManager;
+
+    private final BroadcastReceiver mAppRestrictionReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            broadcastRestriction();
+        }
+    };
+
+    private void broadcastRestriction() {
+        Bundle restrictions = mUserManager.getApplicationRestrictions(getPackageName());
+        Intent intent = new Intent(RESTRICTION_ACTION);
+        intent.putExtra("value", restrictions);
+        sendBroadcast(intent);
+    }
+
+    @Override
+    protected void onNewIntent(Intent intent) {
+        super.onNewIntent(intent);
+        handleIntent(intent);
+    }
+
+    @Override
+    protected void onCreate(android.os.Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        handleIntent(getIntent());
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mUserManager = (UserManager) getSystemService(Context.USER_SERVICE);
+        IntentFilter filter = new IntentFilter(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED);
+        registerReceiver(mAppRestrictionReceiver, filter);
+        sendBroadcast(new Intent(REGISTERED_ACTION));
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        unregisterReceiver(mAppRestrictionReceiver);
+    }
+
+    private void handleIntent(Intent intent) {
+        if (intent.getBooleanExtra(FINISH, false)) {
+            finish();
+        }
+    }
+
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ApplicationRestrictionsTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ApplicationRestrictionsTest.java
new file mode 100644
index 0000000..98ae202
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ApplicationRestrictionsTest.java
@@ -0,0 +1,241 @@
+/*
+ * Copyright (C) 2014 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 com.android.cts.deviceandprofileowner;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.os.Parcelable;
+
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Functionality tests for setApplicationRestrictions and getApplicationRestrictions
+ * in DevicePolicyManager.
+ *
+ * First of all, these two APIs are executed locally to assert that what you set
+ * can later be retrieved via the getter. It also fires up an external activity
+ * (which runs in com.google.android.xts.gmscore, unlike the test code itself
+ * which runs in the test target package com.google.android.gms due to
+ * instrumentation) to observe an application's view of its restrictions.
+ * The activity listens to ACTION_APPLICATION_RESTRICTIONS_CHANGED broadcast
+ * which is fired by the system whenever its restriction is modified,
+ * and relays the value back to this test for verification.
+ */
+public class ApplicationRestrictionsTest extends BaseDeviceAdminTest {
+
+    private static final String[] testStrings = new String[] {
+            "<bad/>",
+            ">worse!\"£$%^&*()'<",
+            "<JSON>\"{ \\\"One\\\": { \\\"OneOne\\\": \\\"11\\\", \\\""
+                    + "OneTwo\\\": \\\"12\\\" }, \\\"Two\\\": \\\"2\\\" } <JSON/>\""
+    };
+
+    private final Semaphore mOnRegisteredSemaphore = new Semaphore(0);
+    private final Semaphore mOnRestrictionSemaphore = new Semaphore(0);
+    private Bundle mReceivedRestrictions;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(ApplicationRestrictionsActivity.REGISTERED_ACTION);
+        filter.addAction(ApplicationRestrictionsActivity.RESTRICTION_ACTION);
+        mContext.registerReceiver(mReceiver, filter);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mContext.unregisterReceiver(mReceiver);
+        super.tearDown();
+    }
+
+    public void testSetApplicationRestrictions() {
+        final String CTS_PACKAGE = PACKAGE_NAME;
+        final String OTHER_PACKAGE = CTS_PACKAGE + "dummy";
+
+        startAndWait();
+
+        Bundle bundle0 = createBundle0();
+        Bundle bundle1 = createBundle1();
+
+        // Test setting restrictions
+        mDevicePolicyManager.setApplicationRestrictions(ADMIN_RECEIVER_COMPONENT, CTS_PACKAGE,
+                bundle0);
+        mDevicePolicyManager.setApplicationRestrictions(ADMIN_RECEIVER_COMPONENT, OTHER_PACKAGE,
+                bundle1);
+
+        // Retrieve restrictions locally and make sure they are what we put in.
+        assertBundle0(mDevicePolicyManager.getApplicationRestrictions(ADMIN_RECEIVER_COMPONENT,
+                CTS_PACKAGE));
+        assertBundle1(mDevicePolicyManager.getApplicationRestrictions(ADMIN_RECEIVER_COMPONENT,
+                OTHER_PACKAGE));
+
+        // The test activity should have received a change_restriction broadcast
+        // and relay the value back to us.
+        assertBundle0(waitForChangedRestriction());
+
+        // Test overwriting
+        mDevicePolicyManager.setApplicationRestrictions(ADMIN_RECEIVER_COMPONENT, CTS_PACKAGE,
+                bundle1);
+        assertBundle1(mDevicePolicyManager.getApplicationRestrictions(ADMIN_RECEIVER_COMPONENT,
+                CTS_PACKAGE));
+        assertBundle1(waitForChangedRestriction());
+
+        // Cleanup
+        mDevicePolicyManager.setApplicationRestrictions(ADMIN_RECEIVER_COMPONENT, CTS_PACKAGE,
+                new Bundle());
+        assertTrue(mDevicePolicyManager.getApplicationRestrictions(
+                ADMIN_RECEIVER_COMPONENT, CTS_PACKAGE).isEmpty());
+        assertTrue(waitForChangedRestriction().isEmpty());
+        mDevicePolicyManager.setApplicationRestrictions(ADMIN_RECEIVER_COMPONENT, OTHER_PACKAGE,
+                new Bundle());
+        assertTrue(mDevicePolicyManager.getApplicationRestrictions(
+                ADMIN_RECEIVER_COMPONENT, OTHER_PACKAGE).isEmpty());
+
+        finish();
+    }
+
+    // Should be consistent with assertBundle0
+    private Bundle createBundle0() {
+        Bundle result = new Bundle();
+        // Tests for 6 allowed types: Integer, Boolean, String, String[], Bundle and Parcelable[]
+        // Also test for string escaping handling
+        result.putBoolean("boolean_0", false);
+        result.putBoolean("boolean_1", true);
+        result.putInt("integer", 0x7fffffff);
+        // If a null is stored, "" will be read back
+        result.putString("empty", "");
+        result.putString("string", "text");
+        result.putStringArray("string[]", testStrings);
+
+        // Adding a bundle, which contain 2 nested restrictions - bundle_string and bundle_int
+        Bundle bundle = new Bundle();
+        bundle.putString("bundle_string", "bundle_string");
+        bundle.putInt("bundle_int", 1);
+        result.putBundle("bundle", bundle);
+
+        // Adding an array of 2 bundles
+        Bundle[] bundleArray = new Bundle[2];
+        bundleArray[0] = new Bundle();
+        bundleArray[0].putString("bundle_array_string", "bundle_array_string");
+        // Put bundle inside bundle
+        bundleArray[0].putBundle("bundle_array_bundle", bundle);
+        bundleArray[1] = new Bundle();
+        bundleArray[1].putString("bundle_array_string2", "bundle_array_string2");
+        result.putParcelableArray("bundle_array", bundleArray);
+        return result;
+    }
+
+    // Should be consistent with createBundle0
+    private void assertBundle0(Bundle bundle) {
+        assertEquals(8, bundle.size());
+        assertEquals(false, bundle.getBoolean("boolean_0"));
+        assertEquals(true, bundle.getBoolean("boolean_1"));
+        assertEquals(0x7fffffff, bundle.getInt("integer"));
+        assertEquals("", bundle.getString("empty"));
+        assertEquals("text", bundle.getString("string"));
+
+        String[] strings = bundle.getStringArray("string[]");
+        assertTrue(strings != null && strings.length == testStrings.length);
+        for (int i = 0; i < strings.length; i++) {
+            assertEquals(strings[i], testStrings[i]);
+        }
+
+        Bundle childBundle = bundle.getBundle("bundle");
+        assertEquals("bundle_string", childBundle.getString("bundle_string"));
+        assertEquals(1, childBundle.getInt("bundle_int"));
+
+        Parcelable[] bundleArray = bundle.getParcelableArray("bundle_array");
+        assertEquals(2, bundleArray.length);
+        // Verifying bundle_array[0]
+        Bundle bundle1 = (Bundle) bundleArray[0];
+        assertEquals("bundle_array_string", bundle1.getString("bundle_array_string"));
+        Bundle bundle1ChildBundle = bundle1.getBundle("bundle_array_bundle");
+        assertNotNull(bundle1ChildBundle);
+        assertEquals("bundle_string", bundle1ChildBundle.getString("bundle_string"));
+        assertEquals(1, bundle1ChildBundle.getInt("bundle_int"));
+        // Verifying bundle_array[1]
+        Bundle bundle2 = (Bundle) bundleArray[1];
+        assertEquals("bundle_array_string2", bundle2.getString("bundle_array_string2"));
+    }
+
+    // Should be consistent with assertBundle1
+    private Bundle createBundle1() {
+        Bundle result = new Bundle();
+        result.putInt("dummy", 1);
+        return result;
+    }
+
+    // Should be consistent with createBundle1
+    private void assertBundle1(Bundle bundle) {
+        assertEquals(1, bundle.size());
+        assertEquals(1, bundle.getInt("dummy"));
+    }
+
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (ApplicationRestrictionsActivity.REGISTERED_ACTION.equals(action)) {
+                mOnRegisteredSemaphore.release();
+            } else if (ApplicationRestrictionsActivity.RESTRICTION_ACTION.equals(action)) {
+                mReceivedRestrictions = intent.getBundleExtra("value");
+                mOnRestrictionSemaphore.release();
+            }
+        }
+    };
+
+    private void startTestActivity(String command) {
+        Intent intent = new Intent();
+        intent.setClassName(PACKAGE_NAME, ApplicationRestrictionsActivity.class.getName());
+        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
+
+        if (command != null) {
+            intent.putExtra(command, true);
+        }
+        mContext.startActivity(intent);
+    }
+
+    private void startAndWait() {
+        startTestActivity(null);
+        // Wait until the activity has registered its broadcast receiver and ready for incoming
+        // restriction changes.
+        try {
+            assertTrue(mOnRegisteredSemaphore.tryAcquire(5, TimeUnit.SECONDS));
+        } catch (InterruptedException e) {
+            fail("Start ApplicationRestrictionActivity interrupted");
+        }
+    }
+
+    private Bundle waitForChangedRestriction() {
+        try {
+            assertTrue(mOnRestrictionSemaphore.tryAcquire(5, TimeUnit.SECONDS));
+        } catch (InterruptedException e) {
+            fail("getRestrictionsAndWait() interrupted");
+        }
+
+        return mReceivedRestrictions;
+    }
+
+    private void finish() {
+        startTestActivity(ApplicationRestrictionsActivity.FINISH);
+    }
+
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/BaseDeviceAdminTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/BaseDeviceAdminTest.java
new file mode 100644
index 0000000..148d8a8
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/BaseDeviceAdminTest.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.deviceandprofileowner;
+
+import android.app.admin.DeviceAdminReceiver;
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.test.InstrumentationTestCase;
+
+/**
+ * Base class for profile and device based tests.
+ *
+ * This class handles making sure that the test is the profile or device owner and that it has an
+ * active admin registered, so that all tests may assume these are done.
+ */
+public class BaseDeviceAdminTest extends InstrumentationTestCase {
+
+    public static class BasicAdminReceiver extends DeviceAdminReceiver {
+    }
+
+    public static final String PACKAGE_NAME = BasicAdminReceiver.class.getPackage().getName();
+    public static final ComponentName ADMIN_RECEIVER_COMPONENT = new ComponentName(
+            PACKAGE_NAME, BasicAdminReceiver.class.getName());
+
+    protected DevicePolicyManager mDevicePolicyManager;
+    protected Context mContext;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mContext = getInstrumentation().getContext();
+
+        mDevicePolicyManager = (DevicePolicyManager)
+            mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
+        assertNotNull(mDevicePolicyManager);
+
+        assertTrue(mDevicePolicyManager.isAdminActive(ADMIN_RECEIVER_COMPONENT));
+        assertTrue("App is neither device nor profile owner",
+                mDevicePolicyManager.isProfileOwnerApp(PACKAGE_NAME) ||
+                mDevicePolicyManager.isDeviceOwnerApp(PACKAGE_NAME));
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ClearDeviceOwnerTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ClearDeviceOwnerTest.java
new file mode 100644
index 0000000..2fe0569
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ClearDeviceOwnerTest.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.deviceandprofileowner;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.test.AndroidTestCase;
+
+public class ClearDeviceOwnerTest extends AndroidTestCase {
+
+    private DevicePolicyManager mDevicePolicyManager;
+
+    @Override
+    protected void tearDown() throws Exception {
+        mDevicePolicyManager = (DevicePolicyManager)
+                mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
+        if (mDevicePolicyManager != null) {
+            removeActiveAdmin(BaseDeviceAdminTest.ADMIN_RECEIVER_COMPONENT);
+            if (mDevicePolicyManager.isDeviceOwnerApp(BaseDeviceAdminTest.PACKAGE_NAME)) {
+                mDevicePolicyManager.clearDeviceOwnerApp(BaseDeviceAdminTest.PACKAGE_NAME);
+            }
+            assertFalse(mDevicePolicyManager.isAdminActive(
+                    BaseDeviceAdminTest.ADMIN_RECEIVER_COMPONENT));
+            assertFalse(mDevicePolicyManager.isDeviceOwnerApp(BaseDeviceAdminTest.PACKAGE_NAME));
+        }
+
+        super.tearDown();
+    }
+
+    // This test clears the device owner and active admin on tearDown(). To be called from the host
+    // side test once a test case is finished.
+    public void testClearDeviceOwner() {
+    }
+
+    private void removeActiveAdmin(ComponentName cn) throws InterruptedException {
+        if (mDevicePolicyManager.isAdminActive(cn)) {
+            mDevicePolicyManager.removeActiveAdmin(cn);
+            for (int i = 0; i < 1000 && mDevicePolicyManager.isAdminActive(cn); i++) {
+                Thread.sleep(100);
+            }
+        }
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ExampleIntentReceivingActivity1.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ExampleIntentReceivingActivity1.java
new file mode 100644
index 0000000..bbcc3b1
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ExampleIntentReceivingActivity1.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2014 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 com.android.cts.deviceandprofileowner;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+
+public class ExampleIntentReceivingActivity1 extends Activity {
+    static final String CONFIRM_ACTION = "com.android.cts.deviceandprofileowner.CONFIRM_1";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        if (getIntent().getAction().equals(PersistentIntentResolvingTest.EXAMPLE_ACTION)) {
+            sendBroadcast(new Intent(CONFIRM_ACTION));
+        }
+        finish();
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ExampleIntentReceivingActivity2.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ExampleIntentReceivingActivity2.java
new file mode 100644
index 0000000..5122b06
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ExampleIntentReceivingActivity2.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2014 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 com.android.cts.deviceandprofileowner;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+
+public class ExampleIntentReceivingActivity2 extends Activity {
+    static final String CONFIRM_ACTION = "com.android.cts.deviceandprofileowner.CONFIRM_2";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        if (getIntent().getAction().equals(PersistentIntentResolvingTest.EXAMPLE_ACTION)) {
+            sendBroadcast(new Intent(CONFIRM_ACTION));
+        }
+        finish();
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/MockAccountAuthenticator.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/MockAccountAuthenticator.java
new file mode 100644
index 0000000..e8e5b45
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/MockAccountAuthenticator.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.deviceandprofileowner;
+
+import android.accounts.AbstractAccountAuthenticator;
+import android.accounts.Account;
+import android.accounts.AccountAuthenticatorResponse;
+import android.accounts.AccountManager;
+import android.accounts.NetworkErrorException;
+import android.content.Context;
+import android.os.Bundle;
+
+/* package */ class MockAccountAuthenticator extends AbstractAccountAuthenticator {
+    private static MockAccountAuthenticator sMockAuthenticator = null;
+    private static final String ACCOUNT_NAME = "com.android.cts.deviceandprofileowner.account.name";
+    static final String ACCOUNT_TYPE = "com.android.cts.deviceandprofileowner.account.type";
+    private static final String AUTH_TOKEN = "mockAuthToken";
+    private static final String AUTH_TOKEN_LABEL = "mockAuthTokenLabel";
+
+    private MockAccountAuthenticator(Context context) {
+        super(context);
+    }
+
+    private Bundle createResultBundle() {
+        Bundle result = new Bundle();
+        result.putString(AccountManager.KEY_ACCOUNT_NAME, ACCOUNT_NAME);
+        result.putString(AccountManager.KEY_ACCOUNT_TYPE, ACCOUNT_TYPE);
+        result.putString(AccountManager.KEY_AUTHTOKEN, AUTH_TOKEN);
+
+        return result;
+    }
+
+    @Override
+    public Bundle addAccount(AccountAuthenticatorResponse response, String accountType,
+            String authTokenType, String[] requiredFeatures, Bundle options)
+            throws NetworkErrorException {
+        return createResultBundle();
+    }
+
+    @Override
+    public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
+        return createResultBundle();
+    }
+
+    @Override
+    public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account,
+            String authTokenType, Bundle options) throws NetworkErrorException {
+        return createResultBundle();
+    }
+
+    @Override
+    public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account,
+            Bundle options) throws NetworkErrorException {
+
+        Bundle result = new Bundle();
+        result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true);
+        return result;
+    }
+
+    @Override
+    public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account,
+            String authTokenType, Bundle options) throws NetworkErrorException {
+        return createResultBundle();
+    }
+
+    @Override
+    public String getAuthTokenLabel(String authTokenType) {
+        return AUTH_TOKEN_LABEL;
+    }
+
+    @Override
+    public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account,
+            String[] features) throws NetworkErrorException {
+
+        Bundle result = new Bundle();
+        result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true);
+        return result;
+    }
+
+    public static synchronized MockAccountAuthenticator getMockAuthenticator(Context context) {
+        if (null == sMockAuthenticator) {
+            sMockAuthenticator = new MockAccountAuthenticator(context);
+        }
+        return sMockAuthenticator;
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/MockAccountService.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/MockAccountService.java
new file mode 100644
index 0000000..dfedccb
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/MockAccountService.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.deviceandprofileowner;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+
+/**
+ * a basic Mock Service for wrapping the MockAccountAuthenticator
+ */
+public class MockAccountService extends Service {
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        return MockAccountAuthenticator.getMockAuthenticator(this).getIBinder();
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/PermissionsTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/PermissionsTest.java
new file mode 100644
index 0000000..d181ad5
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/PermissionsTest.java
@@ -0,0 +1,320 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.deviceandprofileowner;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.os.UserManager;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.BySelector;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiObject2;
+import android.support.test.uiautomator.UiWatcher;
+import android.support.test.uiautomator.Until;
+import android.util.Log;
+
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Test Runtime Permissions APIs in DevicePolicyManager.
+ */
+public class PermissionsTest extends BaseDeviceAdminTest {
+    private static final String TAG = "PermissionsTest";
+
+    private static final String PERMISSION_APP_PACKAGE_NAME
+            = "com.android.cts.permissionapp";
+    private static final String SIMPLE_PRE_M_APP_PACKAGE_NAME =
+            "com.android.cts.launcherapps.simplepremapp";
+    private static final String PERMISSION_NAME = "android.permission.READ_CONTACTS";
+
+    private static final String PERMISSIONS_ACTIVITY_NAME
+            = PERMISSION_APP_PACKAGE_NAME + ".PermissionActivity";
+    private static final String ACTION_CHECK_HAS_PERMISSION
+            = "com.android.cts.permission.action.CHECK_HAS_PERMISSION";
+    private static final String ACTION_REQUEST_PERMISSION
+            = "com.android.cts.permission.action.REQUEST_PERMISSION";
+    private static final String ACTION_PERMISSION_RESULT
+            = "com.android.cts.permission.action.PERMISSION_RESULT";
+    private static final String EXTRA_PERMISSION
+            = "com.android.cts.permission.extra.PERMISSION";
+    private static final String EXTRA_GRANT_STATE
+            = "com.android.cts.permission.extra.GRANT_STATE";
+    private static final int PERMISSION_ERROR = -2;
+    private static final BySelector CRASH_POPUP_BUTTON_SELECTOR = By
+            .clazz(android.widget.Button.class.getName())
+            .text("OK")
+            .pkg("android");
+    private static final BySelector CRASH_POPUP_TEXT_SELECTOR = By
+            .clazz(android.widget.TextView.class.getName())
+            .pkg("android");
+    private static final String CRASH_WATCHER_ID = "CRASH";
+
+    private PermissionBroadcastReceiver mReceiver;
+    private PackageManager mPackageManager;
+    private UiDevice mDevice;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mReceiver = new PermissionBroadcastReceiver();
+        mContext.registerReceiver(mReceiver, new IntentFilter(ACTION_PERMISSION_RESULT));
+        mPackageManager = mContext.getPackageManager();
+        mDevice = UiDevice.getInstance(getInstrumentation());
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mContext.unregisterReceiver(mReceiver);
+        mDevice.removeWatcher(CRASH_WATCHER_ID);
+        super.tearDown();
+    }
+
+    public void testPermissionGrantState() throws Exception {
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
+        assertPermissionGrantState(PackageManager.PERMISSION_DENIED);
+        assertPermissionRequest(PackageManager.PERMISSION_DENIED);
+
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
+        // Should stay denied
+        assertPermissionGrantState(PackageManager.PERMISSION_DENIED);
+
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED);
+        assertPermissionGrantState(PackageManager.PERMISSION_GRANTED);
+        assertPermissionRequest(PackageManager.PERMISSION_GRANTED);
+
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
+        // Should stay granted
+        assertPermissionGrantState(PackageManager.PERMISSION_GRANTED);
+    }
+
+    public void testPermissionPolicy() throws Exception {
+        // reset permission to denied and unlocked
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
+
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_AUTO_DENY);
+        assertPermissionRequest(PackageManager.PERMISSION_DENIED);
+        // permission should be locked, so changing the policy should not change the grant state
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_PROMPT);
+        assertPermissionRequest(PackageManager.PERMISSION_DENIED);
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_AUTO_GRANT);
+        assertPermissionRequest(PackageManager.PERMISSION_DENIED);
+
+        // reset permission to denied and unlocked
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
+
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_AUTO_GRANT);
+        assertPermissionRequest(PackageManager.PERMISSION_GRANTED);
+        // permission should be locked, so changing the policy should not change the grant state
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_PROMPT);
+        assertPermissionRequest(PackageManager.PERMISSION_GRANTED);
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_AUTO_DENY);
+        assertPermissionRequest(PackageManager.PERMISSION_GRANTED);
+
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_PROMPT);
+    }
+
+    public void testPermissionMixedPolicies() throws Exception {
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_AUTO_GRANT);
+        assertPermissionRequest(PackageManager.PERMISSION_DENIED);
+
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_AUTO_DENY);
+        assertPermissionRequest(PackageManager.PERMISSION_DENIED);
+
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_PROMPT);
+        assertPermissionRequest(PackageManager.PERMISSION_DENIED);
+
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED);
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_AUTO_GRANT);
+        assertPermissionRequest(PackageManager.PERMISSION_GRANTED);
+
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_AUTO_DENY);
+        assertPermissionRequest(PackageManager.PERMISSION_GRANTED);
+
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_PROMPT);
+        assertPermissionRequest(PackageManager.PERMISSION_GRANTED);
+    }
+
+    public void testPermissionPrompts() throws Exception {
+        // register a crash watcher
+        mDevice.registerWatcher(CRASH_WATCHER_ID, new UiWatcher() {
+            @Override
+            public boolean checkForCondition() {
+                UiObject2 button = mDevice.findObject(CRASH_POPUP_BUTTON_SELECTOR);
+                if (button != null) {
+                    UiObject2 text = mDevice.findObject(CRASH_POPUP_TEXT_SELECTOR);
+                    Log.d(TAG, "Removing an error dialog: " + text != null ? text.getText() : null);
+                    button.click();
+                    return true;
+                }
+                return false;
+            }
+        });
+        mDevice.runWatchers();
+
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_PROMPT);
+        assertPermissionRequest(PackageManager.PERMISSION_DENIED, "permission_deny_button");
+        assertPermissionRequest(PackageManager.PERMISSION_GRANTED, "permission_allow_button");
+    }
+
+    public void testPermissionUpdate_setDeniedState() throws Exception {
+        assertEquals(mDevicePolicyManager.getPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
+                PERMISSION_APP_PACKAGE_NAME, PERMISSION_NAME),
+                DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
+    }
+
+    public void testPermissionUpdate_setAutoDeniedPolicy() throws Exception {
+        assertEquals(mDevicePolicyManager.getPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
+                PERMISSION_APP_PACKAGE_NAME, PERMISSION_NAME),
+                DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_AUTO_DENY);
+        assertPermissionRequest(PackageManager.PERMISSION_DENIED);
+    }
+
+    public void testPermissionUpdate_checkDenied() throws Exception {
+        assertPermissionRequest(PackageManager.PERMISSION_DENIED);
+        assertPermissionGrantState(PackageManager.PERMISSION_DENIED);
+    }
+
+    public void testPermissionUpdate_setGrantedState() throws Exception {
+        assertEquals(mDevicePolicyManager.getPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
+                PERMISSION_APP_PACKAGE_NAME, PERMISSION_NAME),
+                DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED);
+    }
+
+    public void testPermissionUpdate_setAutoGrantedPolicy() throws Exception {
+        assertEquals(mDevicePolicyManager.getPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
+                PERMISSION_APP_PACKAGE_NAME, PERMISSION_NAME),
+                DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_AUTO_GRANT);
+        assertPermissionRequest(PackageManager.PERMISSION_GRANTED);
+    }
+
+    public void testPermissionUpdate_checkGranted() throws Exception {
+        assertPermissionRequest(PackageManager.PERMISSION_GRANTED);
+        assertPermissionGrantState(PackageManager.PERMISSION_GRANTED);
+    }
+
+    public void testPermissionGrantStatePreMApp() throws Exception {
+        // These tests are to make sure that pre-M apps are not granted runtime permissions
+        // by a profile owner
+        assertSetPermissionGrantStatePreMApp(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
+        assertSetPermissionGrantStatePreMApp(DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED);
+    }
+
+    private void assertPermissionRequest(int expected) throws Exception {
+        assertPermissionRequest(expected, null);
+    }
+
+    private void assertPermissionRequest(int expected, String buttonResource) throws Exception {
+        Intent launchIntent = new Intent();
+        launchIntent.setComponent(new ComponentName(PERMISSION_APP_PACKAGE_NAME,
+                PERMISSIONS_ACTIVITY_NAME));
+        launchIntent.putExtra(EXTRA_PERMISSION, PERMISSION_NAME);
+        launchIntent.setAction(ACTION_REQUEST_PERMISSION);
+        launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
+        mContext.startActivity(launchIntent);
+        pressPermissionPromptButton(buttonResource);
+        assertEquals(expected, mReceiver.waitForBroadcast());
+        assertEquals(expected, mPackageManager.checkPermission(PERMISSION_NAME,
+                PERMISSION_APP_PACKAGE_NAME));
+    }
+
+    private void assertPermissionGrantState(int expected) throws Exception {
+        assertEquals(expected, mPackageManager.checkPermission(PERMISSION_NAME,
+                PERMISSION_APP_PACKAGE_NAME));
+        Intent launchIntent = new Intent();
+        launchIntent.setComponent(new ComponentName(PERMISSION_APP_PACKAGE_NAME,
+                PERMISSIONS_ACTIVITY_NAME));
+        launchIntent.putExtra(EXTRA_PERMISSION, PERMISSION_NAME);
+        launchIntent.setAction(ACTION_CHECK_HAS_PERMISSION);
+        launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
+        mContext.startActivity(launchIntent);
+        assertEquals(expected, mReceiver.waitForBroadcast());
+    }
+
+    private void assertSetPermissionPolicy(int value) throws Exception {
+        mDevicePolicyManager.setPermissionPolicy(ADMIN_RECEIVER_COMPONENT,
+                value);
+        assertEquals(mDevicePolicyManager.getPermissionPolicy(ADMIN_RECEIVER_COMPONENT),
+                value);
+    }
+
+    private void assertSetPermissionGrantState(int value) throws Exception {
+        mDevicePolicyManager.setPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
+                PERMISSION_APP_PACKAGE_NAME, PERMISSION_NAME,
+                value);
+        assertEquals(mDevicePolicyManager.getPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
+                PERMISSION_APP_PACKAGE_NAME, PERMISSION_NAME),
+                value);
+    }
+
+    private void assertSetPermissionGrantStatePreMApp(int value) throws Exception {
+        assertFalse(mDevicePolicyManager.setPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
+                SIMPLE_PRE_M_APP_PACKAGE_NAME, PERMISSION_NAME,
+                value));
+        assertEquals(mDevicePolicyManager.getPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
+                SIMPLE_PRE_M_APP_PACKAGE_NAME, PERMISSION_NAME),
+                DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
+        // Install time permissions should always be granted
+        assertEquals(mPackageManager.checkPermission(PERMISSION_NAME,
+                SIMPLE_PRE_M_APP_PACKAGE_NAME),
+                PackageManager.PERMISSION_GRANTED);
+    }
+
+    private void pressPermissionPromptButton(String resName) throws Exception {
+        if (resName == null) {
+            return;
+        }
+
+        BySelector selector = By
+                .clazz(android.widget.Button.class.getName())
+                .res("com.android.packageinstaller", resName);
+        mDevice.wait(Until.hasObject(selector), 5000);
+        UiObject2 button = mDevice.findObject(selector);
+        assertNotNull("Couldn't find button with resource id: " + resName, button);
+        button.click();
+    }
+
+    private class PermissionBroadcastReceiver extends BroadcastReceiver {
+        private BlockingQueue<Integer> mQueue = new ArrayBlockingQueue<Integer> (1);
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Integer result = new Integer(intent.getIntExtra(EXTRA_GRANT_STATE, PERMISSION_ERROR));
+            Log.d(TAG, "Grant state received " + result);
+            assertTrue(mQueue.add(result));
+        }
+
+        public int waitForBroadcast() throws Exception {
+            Integer result = mQueue.poll(30, TimeUnit.SECONDS);
+            mQueue.clear();
+            assertNotNull(result);
+            Log.d(TAG, "Grant state retrieved " + result.intValue());
+            return result.intValue();
+        }
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/PersistentIntentResolvingTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/PersistentIntentResolvingTest.java
new file mode 100644
index 0000000..41526ec
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/PersistentIntentResolvingTest.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2014 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 com.android.cts.deviceandprofileowner;
+
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.SystemClock;
+
+public class PersistentIntentResolvingTest extends BaseDeviceAdminTest {
+    static final String EXAMPLE_ACTION = "com.android.cts.deviceandprofileowner.EXAMPLE_ACTION";
+
+    private boolean mReceivedConfirmationFrom1;
+    private boolean mReceivedConfirmationFrom2;
+    private BroadcastReceiver mReceiver;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(ExampleIntentReceivingActivity1.CONFIRM_ACTION);
+        filter.addAction(ExampleIntentReceivingActivity2.CONFIRM_ACTION);
+
+        mReceiver = new ConfirmReceiver();
+        mContext.registerReceiver(mReceiver, filter);
+
+        synchronized(this) {
+            mReceivedConfirmationFrom1 = false;
+            mReceivedConfirmationFrom2 = false;
+        }
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mDevicePolicyManager.clearPackagePersistentPreferredActivities(ADMIN_RECEIVER_COMPONENT,
+                PACKAGE_NAME);
+        mContext.unregisterReceiver(mReceiver);
+
+        super.tearDown();
+    }
+
+    public void testNoPersistentPreferredActivityYieldsResolverActivity() {
+        sendExampleIntent();
+        SystemClock.sleep(5000);
+
+        // Default behavior: intent results in resolver activity, since there are two potential
+        // receivers. No intent is received.
+        synchronized(this) {
+            assertFalse(mReceivedConfirmationFrom1);
+            assertFalse(mReceivedConfirmationFrom2);
+        }
+    }
+
+    public void testAddPersistentPreferredActivityYieldsReceptionAtTarget() {
+        addPersistentPreferredActivity();
+        sendExampleIntent();
+        SystemClock.sleep(5000);
+
+        // Persistent preferred activity present: intent should be received by activity 2.
+        synchronized(this) {
+            assertFalse(mReceivedConfirmationFrom1);
+            assertTrue(mReceivedConfirmationFrom2);
+        }
+    }
+
+    public void testAddAndClearPersistentPreferredActivitiesYieldsResolverActivity() {
+        addPersistentPreferredActivity();
+        mDevicePolicyManager.clearPackagePersistentPreferredActivities(ADMIN_RECEIVER_COMPONENT,
+                PACKAGE_NAME);
+
+        sendExampleIntent();
+        SystemClock.sleep(5000);
+
+        // Default behavior: intent results in resolver activity, since there are two potential
+        // receivers. No intent is received.
+        synchronized(this) {
+            assertFalse(mReceivedConfirmationFrom1);
+            assertFalse(mReceivedConfirmationFrom2);
+        }
+    }
+
+    public class ConfirmReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (intent.getAction().equals(ExampleIntentReceivingActivity1.CONFIRM_ACTION)) {
+                synchronized (PersistentIntentResolvingTest.this) {
+                    mReceivedConfirmationFrom1 = true;
+                }
+            } else if (intent.getAction().equals(ExampleIntentReceivingActivity2
+                            .CONFIRM_ACTION)) {
+                synchronized (PersistentIntentResolvingTest.this) {
+                    mReceivedConfirmationFrom2 = true;
+                }
+            }
+        }
+    }
+
+    private void sendExampleIntent() {
+        Intent exampleIntent = new Intent(EXAMPLE_ACTION);
+        exampleIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mContext.startActivity(exampleIntent);
+    }
+
+    private void addPersistentPreferredActivity() {
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(EXAMPLE_ACTION);
+        filter.addCategory(Intent.CATEGORY_DEFAULT);
+        ComponentName targetComponent = new ComponentName(PACKAGE_NAME,
+                ExampleIntentReceivingActivity2.class.getName());
+        mDevicePolicyManager.addPersistentPreferredActivity(ADMIN_RECEIVER_COMPONENT, filter,
+                targetComponent);
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ScreenCaptureDisabledActivity.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ScreenCaptureDisabledActivity.java
new file mode 100644
index 0000000..b5b4fdc
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ScreenCaptureDisabledActivity.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.deviceandprofileowner;
+
+import android.app.Activity;
+import android.content.Intent;
+
+/**
+ * Test activity for setScreenCaptureDisabled().
+ */
+public class ScreenCaptureDisabledActivity extends Activity {
+
+    static final String ACTIVITY_RESUMED =
+            "com.android.cts.deviceandprofileowner.ACTIVITY_RESUMED";
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        sendBroadcast(new Intent(ACTIVITY_RESUMED));
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ScreenCaptureDisabledTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ScreenCaptureDisabledTest.java
new file mode 100644
index 0000000..e2deaa4
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ScreenCaptureDisabledTest.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2014 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 com.android.cts.deviceandprofileowner;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.util.Log;
+
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Tests for {@link DevicePolicyManager#setScreenCaptureDisabled} and
+ * {@link DevicePolicyManager#getScreenCaptureDisabled} APIs.
+ */
+public class ScreenCaptureDisabledTest extends BaseDeviceAdminTest {
+
+    private static final String TAG = "ScreenCaptureDisabledTest";
+
+    private ScreenCaptureBroadcastReceiver mReceiver = new ScreenCaptureBroadcastReceiver();
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        mContext.registerReceiver(mReceiver, new IntentFilter(
+                ScreenCaptureDisabledActivity.ACTIVITY_RESUMED));
+    }
+
+    protected void tearDown() throws Exception {
+        mContext.unregisterReceiver(mReceiver);
+        super.tearDown();
+    }
+
+    public void testSetScreenCaptureDisabled_false() throws Exception {
+        mDevicePolicyManager.setScreenCaptureDisabled(ADMIN_RECEIVER_COMPONENT, false);
+        assertFalse(mDevicePolicyManager.getScreenCaptureDisabled(ADMIN_RECEIVER_COMPONENT));
+        assertFalse(mDevicePolicyManager.getScreenCaptureDisabled(null /* any admin */));
+        startTestActivity();
+        assertNotNull(getInstrumentation().getUiAutomation().takeScreenshot());
+    }
+
+    public void testSetScreenCaptureDisabled_true() throws Exception {
+        mDevicePolicyManager.setScreenCaptureDisabled(ADMIN_RECEIVER_COMPONENT, true);
+        assertTrue(mDevicePolicyManager.getScreenCaptureDisabled(ADMIN_RECEIVER_COMPONENT));
+        assertTrue(mDevicePolicyManager.getScreenCaptureDisabled(null /* any admin */));
+        startTestActivity();
+        assertNull(getInstrumentation().getUiAutomation().takeScreenshot());
+    }
+
+    public void testScreenCapturePossible() throws Exception {
+        assertNotNull(getInstrumentation().getUiAutomation().takeScreenshot());
+    }
+
+    // We need to launch an activity before trying to take a screen shot, because screenshots are
+    // only blocked on a per-user basis in the profile owner case depending on the owner of the
+    // foreground activity.
+    private void startTestActivity() throws Exception {
+        Intent launchIntent = new Intent();
+        launchIntent.setComponent(new ComponentName(PACKAGE_NAME,
+                ScreenCaptureDisabledActivity.class.getName()));
+        launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mContext.startActivity(launchIntent);
+        assertTrue(mReceiver.waitForBroadcast());
+        Thread.sleep(1000);
+    }
+
+    private class ScreenCaptureBroadcastReceiver extends BroadcastReceiver {
+        private final Semaphore mSemaphore = new Semaphore(0);
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Log.d(TAG, "Broadcast received");
+            mSemaphore.release();
+        }
+
+        public boolean waitForBroadcast() throws Exception {
+            if (mSemaphore.tryAcquire(5, TimeUnit.SECONDS)) {
+                return true;
+            }
+            return false;
+        }
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/Android.mk b/hostsidetests/devicepolicy/app/DeviceOwner/Android.mk
index e621933..314f996 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/Android.mk
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/Android.mk
@@ -26,6 +26,8 @@
 
 LOCAL_JAVA_LIBRARIES := android.test.runner cts-junit
 
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner compatibility-device-util_v2
+
 LOCAL_SDK_VERSION := current
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/AndroidManifest.xml b/hostsidetests/devicepolicy/app/DeviceOwner/AndroidManifest.xml
index dfc7e9c..e424f18 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/AndroidManifest.xml
@@ -21,6 +21,8 @@
 
     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
 
     <application>
         <uses-library android:name="android.test.runner" />
@@ -33,22 +35,15 @@
                 <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
             </intent-filter>
         </receiver>
-        <activity android:name="com.android.cts.deviceowner.ExampleIntentReceivingActivity1">
-            <intent-filter>
-                <action android:name="com.android.cts.deviceowner.EXAMPLE_ACTION" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-        </activity>
 
-        <activity android:name="com.android.cts.deviceowner.ExampleIntentReceivingActivity2">
-            <intent-filter>
-                <action android:name="com.android.cts.deviceowner.EXAMPLE_ACTION" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-        </activity>
+        <activity
+            android:name="com.android.cts.deviceowner.KeyManagementActivity" />
 
         <activity
             android:name="com.android.cts.deviceowner.LockTaskUtilityActivity" />
+        <activity
+            android:name="com.android.cts.deviceowner.LockTaskUtilityActivityIfWhitelisted"
+            android:lockTaskMode="if_whitelisted" />
 
         <!-- we need to give a different taskAffinity so that when we use
              FLAG_ACTIVITY_NEW_TASK, the system tries to start it in a different task
@@ -57,11 +52,9 @@
             android:name="com.android.cts.deviceowner.LockTaskTest$IntentReceivingActivity"
             android:taskAffinity="com.android.cts.deviceowner.LockTaskTest.IntentReceivingActivity"
             />
-        <activity
-            android:name="com.android.cts.deviceowner.ApplicationRestrictionActivity" />
     </application>
 
-    <instrumentation android:name="android.test.InstrumentationTestRunner"
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
                      android:targetPackage="com.android.cts.deviceowner"
                      android:label="Device Owner CTS tests"/>
 </manifest>
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ApplicationRestrictionActivity.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ApplicationRestrictionActivity.java
deleted file mode 100644
index 4d8e4f2..0000000
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ApplicationRestrictionActivity.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.android.cts.deviceowner;
-
-import android.app.Activity;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.os.UserManager;
-
-/**
- * Test activity for setApplicationRestrictions().
- *
- * The actual test will set restrictions for this package, and the purpose of this
- * activity is to listen for the ACTION_APPLICATION_RESTRICTIONS_CHANGED broadcast
- * and relay the retrieved restriction bundle back to the test for validation.
- */
-public class ApplicationRestrictionActivity extends Activity {
-
-    // Incoming intent type
-    public static final String FINISH = "finishActivity";
-
-    // Outgoing broadcast
-    public static final String REGISTERED_ACTION =
-            "com.android.cts.deviceowner.APP_RESTRICTION_REGISTERED";
-    public static final String RESTRICTION_ACTION =
-            "com.android.cts.deviceowner.APP_RESTRICTION_VALUE";
-
-    private UserManager mUserManager;
-
-    private final BroadcastReceiver mAppRestrictionReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            broadcastRestriction();
-        }
-    };
-
-    private void broadcastRestriction() {
-        Bundle restrictions = mUserManager.getApplicationRestrictions(getPackageName());
-        Intent intent = new Intent(RESTRICTION_ACTION);
-        intent.putExtra("value", restrictions);
-        sendBroadcast(intent);
-    }
-
-    @Override
-    protected void onNewIntent(Intent intent) {
-        super.onNewIntent(intent);
-        handleIntent(intent);
-    }
-
-    @Override
-    protected void onCreate(android.os.Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        handleIntent(getIntent());
-    }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-        mUserManager = (UserManager) getSystemService(Context.USER_SERVICE);
-        IntentFilter filter = new IntentFilter(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED);
-        registerReceiver(mAppRestrictionReceiver, filter);
-        sendBroadcast(new Intent(REGISTERED_ACTION));
-    }
-
-    @Override
-    protected void onPause() {
-        super.onPause();
-        unregisterReceiver(mAppRestrictionReceiver);
-    }
-
-    private void handleIntent(Intent intent) {
-        if (intent.getBooleanExtra(FINISH, false)) {
-            finish();
-        }
-    }
-
-}
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ApplicationRestrictionsTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ApplicationRestrictionsTest.java
deleted file mode 100644
index 5e03de9..0000000
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ApplicationRestrictionsTest.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.android.cts.deviceowner;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Functionality tests for setApplicationRestrictions and getApplicationRestrictions
- * in DevicePolicyManager.
- *
- * First of all, these two APIs are executed locally to assert that what you set
- * can later be retrieved via the getter. It also fires up an external activity
- * (which runs in com.google.android.xts.gmscore, unlike the test code itself
- * which runs in the test target package com.google.android.gms due to
- * instrumentation) to observe an application's view of its restrictions.
- * The activity listens to ACTION_APPLICATION_RESTRICTIONS_CHANGED broadcast
- * which is fired by the system whenever its restriction is modified,
- * and relays the value back to this test for verification.
- */
-public class ApplicationRestrictionsTest extends BaseDeviceOwnerTest {
-
-    private static final String[] testStrings = new String[] {
-            "<bad/>",
-            ">worse!\"£$%^&*()'<",
-            "<JSON>\"{ \\\"One\\\": { \\\"OneOne\\\": \\\"11\\\", \\\""
-                    + "OneTwo\\\": \\\"12\\\" }, \\\"Two\\\": \\\"2\\\" } <JSON/>\""
-    };
-
-    private final Semaphore mOnRegisteredSemaphore = new Semaphore(0);
-    private final Semaphore mOnRestrictionSemaphore = new Semaphore(0);
-    private Bundle mReceivedRestrictions;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(ApplicationRestrictionActivity.REGISTERED_ACTION);
-        filter.addAction(ApplicationRestrictionActivity.RESTRICTION_ACTION);
-        mContext.registerReceiver(mReceiver, filter);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        mContext.unregisterReceiver(mReceiver);
-        super.tearDown();
-    }
-
-    public void testSetApplicationRestrictions() {
-        final String CTS_PACKAGE = PACKAGE_NAME;
-        final String OTHER_PACKAGE = CTS_PACKAGE + "dummy";
-
-        startAndWait();
-
-        Bundle bundle0 = createBundle0();
-        Bundle bundle1 = createBundle1();
-
-        // Test setting restrictions
-        mDevicePolicyManager.setApplicationRestrictions(getWho(), CTS_PACKAGE, bundle0);
-        mDevicePolicyManager.setApplicationRestrictions(getWho(), OTHER_PACKAGE, bundle1);
-
-        // Retrieve restrictions locally and make sure they are what we put in.
-        assertBundle0(mDevicePolicyManager.getApplicationRestrictions(getWho(), CTS_PACKAGE));
-        assertBundle1(mDevicePolicyManager.getApplicationRestrictions(getWho(), OTHER_PACKAGE));
-
-        // The test activity should have received a change_restriction broadcast
-        // and relay the value back to us.
-        assertBundle0(waitForChangedRestriction());
-
-        // Test overwriting
-        mDevicePolicyManager.setApplicationRestrictions(getWho(), CTS_PACKAGE, bundle1);
-        assertBundle1(mDevicePolicyManager.getApplicationRestrictions(getWho(), CTS_PACKAGE));
-        assertBundle1(waitForChangedRestriction());
-
-        // Cleanup
-        mDevicePolicyManager.setApplicationRestrictions(getWho(), CTS_PACKAGE, new Bundle());
-        assertTrue(
-                mDevicePolicyManager.getApplicationRestrictions(getWho(), CTS_PACKAGE).isEmpty());
-        assertTrue(waitForChangedRestriction().isEmpty());
-        mDevicePolicyManager.setApplicationRestrictions(getWho(), OTHER_PACKAGE, new Bundle());
-        assertTrue(
-                mDevicePolicyManager.getApplicationRestrictions(getWho(), OTHER_PACKAGE).isEmpty());
-
-        finish();
-    }
-
-    // Should be consistent with assertBundle0
-    private Bundle createBundle0() {
-        Bundle result = new Bundle();
-        // Tests for four allowed types: Integer, Boolean, String and String[]
-        // Also test for string escaping handling
-        result.putBoolean("boolean_0", false);
-        result.putBoolean("boolean_1", true);
-        result.putInt("integer", 0x7fffffff);
-        // If a null is stored, "" will be read back
-        result.putString("empty", "");
-        result.putString("string", "text");
-        result.putStringArray("string[]", testStrings);
-        return result;
-    }
-
-    // Should be consistent with createBundle0
-    private void assertBundle0(Bundle bundle) {
-        assertEquals(6, bundle.size());
-        assertEquals(false, bundle.getBoolean("boolean_0"));
-        assertEquals(true, bundle.getBoolean("boolean_1"));
-        assertEquals(0x7fffffff, bundle.getInt("integer"));
-        assertEquals("", bundle.getString("empty"));
-        assertEquals("text", bundle.getString("string"));
-
-        String[] strings = bundle.getStringArray("string[]");
-        assertTrue(strings != null && strings.length == testStrings.length);
-        for (int i = 0; i < strings.length; i++) {
-            assertEquals(strings[i], testStrings[i]);
-        }
-    }
-
-    // Should be consistent with assertBundle1
-    private Bundle createBundle1() {
-        Bundle result = new Bundle();
-        result.putInt("dummy", 1);
-        return result;
-    }
-
-    // Should be consistent with createBundle1
-    private void assertBundle1(Bundle bundle) {
-        assertEquals(1, bundle.size());
-        assertEquals(1, bundle.getInt("dummy"));
-    }
-
-    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (ApplicationRestrictionActivity.REGISTERED_ACTION.equals(action)) {
-                mOnRegisteredSemaphore.release();
-            } else if (ApplicationRestrictionActivity.RESTRICTION_ACTION.equals(action)) {
-                mReceivedRestrictions = intent.getBundleExtra("value");
-                mOnRestrictionSemaphore.release();
-            }
-        }
-    };
-
-    private void startTestActivity(String command) {
-        Intent intent = new Intent();
-        intent.setClassName(PACKAGE_NAME, ApplicationRestrictionActivity.class.getName());
-        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
-
-        if (command != null) {
-            intent.putExtra(command, true);
-        }
-        mContext.startActivity(intent);
-    }
-
-    private void startAndWait() {
-        startTestActivity(null);
-        // Wait until the activity has registered its broadcast receiver and ready for incoming
-        // restriction changes.
-        try {
-            assertTrue(mOnRegisteredSemaphore.tryAcquire(5, TimeUnit.SECONDS));
-        } catch (InterruptedException e) {
-            fail("Start ApplicationRestrictionActivity interrupted");
-        }
-    }
-
-    private Bundle waitForChangedRestriction() {
-        try {
-            assertTrue(mOnRestrictionSemaphore.tryAcquire(5, TimeUnit.SECONDS));
-        } catch (InterruptedException e) {
-            fail("getRestrictionsAndWait() interrupted");
-        }
-
-        return mReceivedRestrictions;
-    }
-
-    private void finish() {
-        startTestActivity(ApplicationRestrictionActivity.FINISH);
-    }
-
-}
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/BaseDeviceOwnerTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/BaseDeviceOwnerTest.java
index e4f5134b..b6815fd 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/BaseDeviceOwnerTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/BaseDeviceOwnerTest.java
@@ -19,6 +19,9 @@
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Process;
 import android.test.AndroidTestCase;
 
 /**
@@ -32,6 +35,14 @@
 public class BaseDeviceOwnerTest extends AndroidTestCase {
 
     public static class BasicAdminReceiver extends DeviceAdminReceiver {
+        @Override
+        public String onChoosePrivateKeyAlias(Context context, Intent intent, int uid, Uri uri,
+                String suggestedAlias) {
+            if (uid != Process.myUid() || uri == null) {
+                return null;
+            }
+            return uri.getQueryParameter("alias");
+        }
     }
 
     public static final String PACKAGE_NAME = BaseDeviceOwnerTest.class.getPackage().getName();
@@ -44,11 +55,16 @@
 
         mDevicePolicyManager = (DevicePolicyManager)
                 mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
-        assertTrue(mDevicePolicyManager.isAdminActive(getWho()));
-        assertTrue(mDevicePolicyManager.isDeviceOwnerApp(PACKAGE_NAME));
+        assertDeviceOwner(mDevicePolicyManager);
     }
 
-    public static ComponentName getWho() {
+    static void assertDeviceOwner(DevicePolicyManager dpm) {
+        assertNotNull(dpm);
+        assertTrue(dpm.isAdminActive(getWho()));
+        assertTrue(dpm.isDeviceOwnerApp(PACKAGE_NAME));
+    }
+
+    protected static ComponentName getWho() {
         return new ComponentName(PACKAGE_NAME, BasicAdminReceiver.class.getName());
     }
-}
\ No newline at end of file
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ExampleIntentReceivingActivity1.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ExampleIntentReceivingActivity1.java
deleted file mode 100644
index 03ca9a4..0000000
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ExampleIntentReceivingActivity1.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.android.cts.deviceowner;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-
-public class ExampleIntentReceivingActivity1 extends Activity {
-    public static final String CONFIRM_ACTION = "com.android.cts.deviceowner.CONFIRM_1";
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        if (getIntent().getAction().equals(PersistentIntentResolvingTest.EXAMPLE_ACTION)) {
-            sendBroadcast(new Intent(CONFIRM_ACTION));
-        }
-        finish();
-    }
-}
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ExampleIntentReceivingActivity2.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ExampleIntentReceivingActivity2.java
deleted file mode 100644
index 65ccb36..0000000
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ExampleIntentReceivingActivity2.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.android.cts.deviceowner;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-
-public class ExampleIntentReceivingActivity2 extends Activity {
-    public static final String CONFIRM_ACTION = "com.android.cts.deviceowner.CONFIRM_2";
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        if (getIntent().getAction().equals(PersistentIntentResolvingTest.EXAMPLE_ACTION)) {
-            sendBroadcast(new Intent(CONFIRM_ACTION));
-        }
-        finish();
-    }
-}
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/KeyManagementActivity.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/KeyManagementActivity.java
new file mode 100644
index 0000000..c108d24
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/KeyManagementActivity.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2014 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 com.android.cts.deviceowner;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+
+public class KeyManagementActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        finish();
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/KeyManagementTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/KeyManagementTest.java
index fe2bdda..5774b0c 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/KeyManagementTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/KeyManagementTest.java
@@ -15,11 +15,21 @@
  */
 package com.android.cts.deviceowner;
 
+import static com.android.cts.deviceowner.BaseDeviceOwnerTest.getWho;
 import static com.android.cts.deviceowner.FakeKeys.FAKE_RSA_1;
 
+import android.app.Activity;
 import android.app.admin.DevicePolicyManager;
+import android.net.Uri;
+import android.os.Handler;
+import android.security.KeyChain;
+import android.security.KeyChainAliasCallback;
+import android.security.KeyChainException;
+import android.test.ActivityInstrumentationTestCase2;
 
 import java.io.ByteArrayInputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
 import java.security.cert.CertificateException;
 import java.security.cert.CertificateFactory;
 import java.security.cert.Certificate;
@@ -28,17 +38,38 @@
 import java.security.PrivateKey;
 import java.security.spec.InvalidKeySpecException;
 import java.security.spec.PKCS8EncodedKeySpec;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
-public class KeyManagementTest extends BaseDeviceOwnerTest {
+import android.content.ComponentName;
+import android.content.Context;
+
+public class KeyManagementTest extends
+        ActivityInstrumentationTestCase2<KeyManagementActivity> {
+
+    private static final int KEYCHAIN_TIMEOUT_MS = 8000;
+    private DevicePolicyManager mDevicePolicyManager;
+
+    public KeyManagementTest() {
+        super(KeyManagementActivity.class);
+    }
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+
+        // Confirm our DeviceOwner is set up
+        mDevicePolicyManager = (DevicePolicyManager)
+                getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
+        BaseDeviceOwnerTest.assertDeviceOwner(mDevicePolicyManager);
+
+        // Enable credential storage by setting a nonempty password.
         assertTrue(mDevicePolicyManager.resetPassword("test", 0));
     }
 
     @Override
     protected void tearDown() throws Exception {
+        // Delete all keys by resetting our password to null, which clears the keystore.
         mDevicePolicyManager.setPasswordQuality(getWho(),
                 DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
         mDevicePolicyManager.setPasswordMinimumLength(getWho(), 0);
@@ -47,27 +78,32 @@
     }
 
     public void testCanInstallValidRsaKeypair()
-            throws CertificateException, NoSuchAlgorithmException, InvalidKeySpecException {
+            throws CertificateException, NoSuchAlgorithmException, InvalidKeySpecException,
+                    KeyChainException, InterruptedException, UnsupportedEncodingException {
         final String alias = "com.android.test.valid-rsa-key-1";
         final PrivateKey privKey = getPrivateKey(FAKE_RSA_1.privateKey , "RSA");
         final Certificate cert = getCertificate(FAKE_RSA_1.caCertificate);
         assertTrue(mDevicePolicyManager.installKeyPair(getWho(), privKey, cert, alias));
+
+        assertEquals(alias, new KeyChainAliasFuture(alias).get());
+        final PrivateKey retrievedKey = KeyChain.getPrivateKey(getActivity(), alias);
+        assertEquals(retrievedKey.getAlgorithm(), "RSA");
     }
 
-    public void testNullKeyParamsFailGracefully()
+    public void testNullKeyParamsFailPredictably()
             throws CertificateException, NoSuchAlgorithmException, InvalidKeySpecException {
         final String alias = "com.android.test.null-key-1";
         final PrivateKey privKey = getPrivateKey(FAKE_RSA_1.privateKey, "RSA");
         final Certificate cert = getCertificate(FAKE_RSA_1.caCertificate);
         try {
-            assertFalse(mDevicePolicyManager.installKeyPair(getWho(), null, cert, alias));
-        } catch (NullPointerException accept) {
-            // Accept either false return value or NPE
+            mDevicePolicyManager.installKeyPair(getWho(), null, cert, alias);
+            fail("Exception should have been thrown for null PrivateKey");
+        } catch (NullPointerException expected) {
         }
         try {
-            assertFalse(mDevicePolicyManager.installKeyPair(getWho(), privKey, null, alias));
-        } catch (NullPointerException accept) {
-            // Accept either false return value or NPE
+            mDevicePolicyManager.installKeyPair(getWho(), privKey, null, alias);
+            fail("Exception should have been thrown for null Certificate");
+        } catch (NullPointerException expected) {
         }
     }
 
@@ -77,21 +113,46 @@
         final PrivateKey privKey = getPrivateKey(FAKE_RSA_1.privateKey, "RSA");
         final Certificate cert = getCertificate(FAKE_RSA_1.caCertificate);
         try {
-            assertFalse(mDevicePolicyManager.installKeyPair(null, privKey, cert, alias));
+            mDevicePolicyManager.installKeyPair(null, privKey, cert, alias);
             fail("Exception should have been thrown for null ComponentName");
-        } catch (SecurityException | NullPointerException expected) {
+        } catch (SecurityException expected) {
         }
     }
 
-    PrivateKey getPrivateKey(final byte[] key, String type)
+    private static PrivateKey getPrivateKey(final byte[] key, String type)
             throws NoSuchAlgorithmException, InvalidKeySpecException {
         return KeyFactory.getInstance(type).generatePrivate(
                 new PKCS8EncodedKeySpec(key));
     }
 
-    Certificate getCertificate(byte[] cert) throws CertificateException {
+    private static Certificate getCertificate(byte[] cert) throws CertificateException {
         return CertificateFactory.getInstance("X.509").generateCertificate(
                 new ByteArrayInputStream(cert));
     }
 
+    private class KeyChainAliasFuture implements KeyChainAliasCallback {
+        private final CountDownLatch mLatch = new CountDownLatch(1);
+        private String mChosenAlias = null;
+
+        @Override
+        public void alias(final String chosenAlias) {
+            mChosenAlias = chosenAlias;
+            mLatch.countDown();
+        }
+
+        public KeyChainAliasFuture(String alias) throws UnsupportedEncodingException {
+            /* Pass the alias as a GET to an imaginary server instead of explicitly asking for it,
+             * to make sure the DPC actually has to do some work to grant the cert.
+             */
+            final Uri uri =
+                    Uri.parse("https://example.org/?alias=" + URLEncoder.encode(alias, "UTF-8"));
+            KeyChain.choosePrivateKeyAlias(getActivity(), this,
+                    null /* keyTypes */, null /* issuers */, uri, null /* alias */);
+        }
+
+        public String get() throws InterruptedException {
+            assertTrue("Chooser timeout", mLatch.await(KEYCHAIN_TIMEOUT_MS, TimeUnit.MILLISECONDS));
+            return mChosenAlias;
+        }
+    };
 }
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/LockTaskTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/LockTaskTest.java
index 69c5bf7..f6f8dbbc 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/LockTaskTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/LockTaskTest.java
@@ -18,6 +18,7 @@
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.content.BroadcastReceiver;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -32,12 +33,24 @@
 
     private static final String TEST_PACKAGE = "com.google.android.example.somepackage";
 
+    private static final String UTILITY_ACTIVITY
+            = "com.android.cts.deviceowner.LockTaskUtilityActivity";
+    private static final String UTILITY_ACTIVITY_IF_WHITELISTED
+            = "com.android.cts.deviceowner.LockTaskUtilityActivityIfWhitelisted";
+
+    private static final String RECEIVING_ACTIVITY_PACKAGE_NAME
+            = "com.android.cts.intent.receiver";
+    private static final String RECEIVING_ACTIVITY_NAME
+            = "com.android.cts.intent.receiver.IntentReceiverActivity";
+    private static final String ACTION_JUST_CREATE =
+            "com.android.cts.action.JUST_CREATE";
+
     private static final int ACTIVITY_RESUMED_TIMEOUT_MILLIS = 20000;  // 20 seconds
     private static final int ACTIVITY_RUNNING_TIMEOUT_MILLIS = 10000;  // 10 seconds
     private static final int ACTIVITY_DESTROYED_TIMEOUT_MILLIS = 60000;  // 60 seconds
-
+    private static final int UPDATE_LOCK_TASK_TIMEOUT_MILLIS = 1000; // 1 second
     public static final String RECEIVING_ACTIVITY_CREATED_ACTION
-            = "com.android.cts.deviceowner.RECEIVER_ACTIVITY_STARTED_ACTION";
+            = "com.android.cts.deviceowner.RECEIVING_ACTIVITY_CREATED_ACTION";
     /**
      * The tests below need to keep detailed track of the state of the activity
      * that is started and stopped frequently.  To do this it sends a number of
@@ -102,9 +115,13 @@
     private final Object mReceivingActivityCreatedLock = new Object();
     private Boolean mIntentHandled;
 
+    private ActivityManager mActivityManager;
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[0]);
+        mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
         IntentFilter filter = new IntentFilter();
         filter.addAction(LockTaskUtilityActivity.CREATE_ACTION);
         filter.addAction(LockTaskUtilityActivity.DESTROY_ACTION);
@@ -117,10 +134,12 @@
 
     @Override
     protected void tearDown() throws Exception {
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[0]);
         mContext.unregisterReceiver(mReceiver);
         super.tearDown();
     }
 
+    // Setting and unsetting the lock task packages.
     public void testSetLockTaskPackages() {
         mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { TEST_PACKAGE });
         assertTrue(mDevicePolicyManager.isLockTaskPermitted(TEST_PACKAGE));
@@ -132,45 +151,60 @@
     // Start lock task, verify that ActivityManager knows thats what is going on.
     public void testStartLockTask() {
         mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME });
-        startLockTask();
+        startLockTask(UTILITY_ACTIVITY);
         waitForResume();
 
         // Verify that activity open and activity manager is in lock task.
-        ActivityManager activityManager = (ActivityManager)
-                mContext.getSystemService(Context.ACTIVITY_SERVICE);
-        assertTrue(activityManager.isInLockTaskMode());
+        assertLockTaskModeActive();
         assertTrue(mIsActivityRunning);
         assertTrue(mIsActivityResumed);
 
-        stopAndFinish(activityManager);
+        stopAndFinish(UTILITY_ACTIVITY);
     }
 
     // Verifies that the act of finishing is blocked by ActivityManager in lock task.
     // This results in onDestroy not being called until stopLockTask is called before finish.
     public void testCannotFinish() {
         mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME });
-        startLockTask();
+        startLockTask(UTILITY_ACTIVITY);
 
         // If lock task has not exited then the activity shouldn't actually receive onDestroy.
-        finishAndWait();
-        ActivityManager activityManager = (ActivityManager)
-                mContext.getSystemService(Context.ACTIVITY_SERVICE);
-        assertTrue(activityManager.isInLockTaskMode());
+        finishAndWait(UTILITY_ACTIVITY);
+        assertLockTaskModeActive();
         assertTrue(mIsActivityRunning);
 
-        stopAndFinish(activityManager);
+        stopAndFinish(UTILITY_ACTIVITY);
+    }
+
+    // Verifies that updating the whitelisting during lock task mode finishes the locked task.
+    public void testUpdateWhitelisting() {
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME });
+        startLockTask(UTILITY_ACTIVITY);
+
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[0]);
+
+        synchronized (mActivityRunningLock) {
+            try {
+                mActivityRunningLock.wait(UPDATE_LOCK_TASK_TIMEOUT_MILLIS);
+            } catch (InterruptedException e) {
+            }
+        }
+
+        assertLockTaskModeInactive();
+        assertFalse(mIsActivityRunning);
+        assertFalse(mIsActivityResumed);
     }
 
     // This launches an activity that is in the current task.
-    // this should be permitted as a part of lock task (since it isn't a new task).
-    public void testStartActivityWithinTask() {
+    // This should always be permitted as a part of lock task (since it isn't a new task).
+    public void testStartActivity_withinTask() {
         mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME });
-        startLockTask();
+        startLockTask(UTILITY_ACTIVITY);
         waitForResume();
 
         mReceivingActivityWasCreated = false;
-        Intent launchIntent = new Intent(mContext, IntentReceivingActivity.class);
-        Intent lockTaskUtility = getLockTaskUtility();
+        Intent launchIntent = getIntentReceivingActivityIntent(0);
+        Intent lockTaskUtility = getLockTaskUtility(UTILITY_ACTIVITY);
         lockTaskUtility.putExtra(LockTaskUtilityActivity.START_ACTIVITY, launchIntent);
         mContext.startActivity(lockTaskUtility);
 
@@ -181,18 +215,19 @@
             }
             assertTrue(mReceivingActivityWasCreated);
         }
-        stopAndFinish(null);
+        stopAndFinish(UTILITY_ACTIVITY);
     }
 
-    // This launches an activity that is not part of the current task and therefore
-    // should be blocked.
-    public void testCannotStartActivityOutsideTask() {
-        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME });
-        startLockTask();
+    // This launches a whitelisted activity that is not part of the current task.
+    // This should be permitted as a part of lock task.
+    public void testStartActivity_outsideTaskWhitelisted() {
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME,
+                RECEIVING_ACTIVITY_PACKAGE_NAME });
+        startLockTask(UTILITY_ACTIVITY);
         waitForResume();
 
         mReceivingActivityWasCreated = false;
-        Intent launchIntent = new Intent(mContext, IntentReceivingActivity.class);
+        Intent launchIntent = getIntentReceivingActivityIntent(0);
         launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         mContext.startActivity(launchIntent);
         synchronized (mReceivingActivityCreatedLock) {
@@ -200,9 +235,108 @@
                 mReceivingActivityCreatedLock.wait(ACTIVITY_RESUMED_TIMEOUT_MILLIS);
             } catch (InterruptedException e) {
             }
+            assertTrue(mReceivingActivityWasCreated);
+        }
+        stopAndFinish(UTILITY_ACTIVITY);
+    }
+
+    // This launches a non-whitelisted activity that is not part of the current task.
+    // This should be blocked.
+    public void testStartActivity_outsideTaskNonWhitelisted() {
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME });
+        startLockTask(UTILITY_ACTIVITY);
+        waitForResume();
+
+        Intent launchIntent = getIntentReceivingActivityIntent(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mContext.startActivity(launchIntent);
+        synchronized (mActivityResumedLock) {
+            try {
+                mActivityResumedLock.wait(ACTIVITY_RESUMED_TIMEOUT_MILLIS);
+            } catch (InterruptedException e) {
+            }
             assertFalse(mReceivingActivityWasCreated);
         }
-        stopAndFinish(null);
+        stopAndFinish(UTILITY_ACTIVITY);
+    }
+
+    // Test the lockTaskMode flag for an activity declaring if_whitelisted.
+    // Whitelist the activity and verify that lock task mode is started.
+    public void testManifestArgument_whitelisted() {
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME });
+        startAndWait(getLockTaskUtility(UTILITY_ACTIVITY_IF_WHITELISTED));
+        waitForResume();
+
+        assertLockTaskModeActive();
+        assertTrue(mIsActivityRunning);
+        assertTrue(mIsActivityResumed);
+
+        stopAndFinish(UTILITY_ACTIVITY_IF_WHITELISTED);
+    }
+
+    // Test the lockTaskMode flag for an activity declaring if_whitelisted.
+    // Don't whitelist the activity and verify that lock task mode is not started.
+    public void testManifestArgument_nonWhitelisted() {
+        startAndWait(getLockTaskUtility(UTILITY_ACTIVITY_IF_WHITELISTED));
+        waitForResume();
+
+        assertLockTaskModeInactive();
+        assertTrue(mIsActivityRunning);
+        assertTrue(mIsActivityResumed);
+
+        stopAndFinish(UTILITY_ACTIVITY_IF_WHITELISTED);
+    }
+
+    // Test the lockTaskMode flag for an activity declaring if_whitelisted.
+    // An activity locked via manifest argument cannot finish without calling stopLockTask.
+    public void testManifestArgument_cannotFinish() {
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME });
+        startAndWait(getLockTaskUtility(UTILITY_ACTIVITY_IF_WHITELISTED));
+        waitForResume();
+
+        // If lock task has not exited then the activity shouldn't actually receive onDestroy.
+        finishAndWait(UTILITY_ACTIVITY_IF_WHITELISTED);
+        assertLockTaskModeActive();
+        assertTrue(mIsActivityRunning);
+
+        stopAndFinish(UTILITY_ACTIVITY_IF_WHITELISTED);
+    }
+
+    // Test the lockTaskMode flag for an activity declaring if_whitelisted.
+    // Verifies that updating the whitelisting during lock task mode finishes the locked task.
+    public void testManifestArgument_updateWhitelisting() {
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[] { PACKAGE_NAME });
+        startAndWait(getLockTaskUtility(UTILITY_ACTIVITY_IF_WHITELISTED));
+        waitForResume();
+
+        mDevicePolicyManager.setLockTaskPackages(getWho(), new String[0]);
+
+        synchronized (mActivityRunningLock) {
+            try {
+                mActivityRunningLock.wait(UPDATE_LOCK_TASK_TIMEOUT_MILLIS);
+            } catch (InterruptedException e) {
+            }
+        }
+
+        assertLockTaskModeInactive();
+        assertFalse(mIsActivityRunning);
+        assertFalse(mIsActivityResumed);
+    }
+
+    /**
+     * Checks that lock task mode is active and fails the test if it isn't.
+     */
+    private void assertLockTaskModeActive() {
+        assertTrue(mActivityManager.isInLockTaskMode());
+        assertEquals(ActivityManager.LOCK_TASK_MODE_LOCKED,
+                mActivityManager.getLockTaskModeState());
+    }
+
+    /**
+     * Checks that lock task mode is not active and fails the test if it is.
+     */
+    private void assertLockTaskModeInactive() {
+        assertFalse(mActivityManager.isInLockTaskMode());
+        assertEquals(ActivityManager.LOCK_TASK_MODE_NONE, mActivityManager.getLockTaskModeState());
     }
 
     /**
@@ -213,12 +347,10 @@
      * If activityManager is not null then verify that the ActivityManager
      * is no longer in lock task mode.
      */
-    private void stopAndFinish(ActivityManager activityManager) {
-        stopLockTask();
-        finishAndWait();
-        if (activityManager != null) {
-            assertFalse(activityManager.isInLockTaskMode());
-        }
+    private void stopAndFinish(String className) {
+        stopLockTask(className);
+        finishAndWait(className);
+        assertLockTaskModeInactive();
         assertFalse(mIsActivityRunning);
     }
 
@@ -226,9 +358,9 @@
      * Call finish on the LockTaskUtilityActivity and wait for
      * onDestroy to be called.
      */
-    private void finishAndWait() {
+    private void finishAndWait(String className) {
         synchronized (mActivityRunningLock) {
-            finish();
+            finish(className);
             if (mIsActivityRunning) {
                 try {
                     mActivityRunningLock.wait(ACTIVITY_DESTROYED_TIMEOUT_MILLIS);
@@ -256,8 +388,8 @@
     /**
      * Calls startLockTask on the LockTaskUtilityActivity
      */
-    private void startLockTask() {
-        Intent intent = getLockTaskUtility();
+    private void startLockTask(String className) {
+        Intent intent = getLockTaskUtility(className);
         intent.putExtra(LockTaskUtilityActivity.START_LOCK_TASK, true);
         startAndWait(intent);
     }
@@ -265,8 +397,8 @@
     /**
      * Calls stopLockTask on the LockTaskUtilityActivity
      */
-    private void stopLockTask() {
-        Intent intent = getLockTaskUtility();
+    private void stopLockTask(String className) {
+        Intent intent = getLockTaskUtility(className);
         intent.putExtra(LockTaskUtilityActivity.STOP_LOCK_TASK, true);
         startAndWait(intent);
     }
@@ -274,8 +406,8 @@
     /**
      * Calls finish on the LockTaskUtilityActivity
      */
-    private void finish() {
-        Intent intent = getLockTaskUtility();
+    private void finish(String className) {
+        Intent intent = getLockTaskUtility(className);
         intent.putExtra(LockTaskUtilityActivity.FINISH, true);
         startAndWait(intent);
     }
@@ -303,10 +435,19 @@
      *
      * This intent includes the flags to make it act as single top.
      */
-    private Intent getLockTaskUtility() {
+    private Intent getLockTaskUtility(String className) {
         Intent intent = new Intent();
-        intent.setClassName(PACKAGE_NAME, LockTaskUtilityActivity.class.getName());
+        intent.setClassName(PACKAGE_NAME, className);
         intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
         return intent;
     }
+
+    private Intent getIntentReceivingActivityIntent(int flags) {
+        Intent intent = new Intent();
+        intent.setComponent(
+                new ComponentName(RECEIVING_ACTIVITY_PACKAGE_NAME, RECEIVING_ACTIVITY_NAME));
+        intent.setAction(ACTION_JUST_CREATE);
+        intent.setFlags(flags);
+        return intent;
+    }
 }
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/LockTaskUtilityActivityIfWhitelisted.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/LockTaskUtilityActivityIfWhitelisted.java
new file mode 100644
index 0000000..4cf6efa
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/LockTaskUtilityActivityIfWhitelisted.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.deviceowner;
+
+public class LockTaskUtilityActivityIfWhitelisted extends LockTaskUtilityActivity {
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/PackageInstallTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/PackageInstallTest.java
new file mode 100644
index 0000000..0eddbee
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/PackageInstallTest.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.deviceowner;
+
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.IntentSender;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageInstaller;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * This class tests silent package install and uninstall by a device owner.
+ */
+public class PackageInstallTest extends BaseDeviceOwnerTest {
+    private static final String TEST_APP_LOCATION = "/data/local/tmp/CtsSimpleApp.apk";
+    private static final String TEST_APP_PKG = "com.android.cts.launcherapps.simpleapp";
+    private static final int PACKAGE_INSTALLER_TIMEOUT_MS = 60000; // 60 seconds
+    private static final String ACTION_INSTALL_COMMIT =
+            "com.android.cts.deviceowner.INTENT_PACKAGE_INSTALL_COMMIT";
+    private static final int PACKAGE_INSTALLER_STATUS_UNDEFINED = -1000;
+
+    private PackageManager mPackageManager;
+    private PackageInstaller mPackageInstaller;
+    private PackageInstaller.Session mSession;
+    private boolean mCallbackReceived;
+    private int mCallbackStatus;
+
+    private final Object mPackageInstallerTimeoutLock = new Object();
+
+    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            mContext.unregisterReceiver(this);
+            synchronized (mPackageInstallerTimeoutLock) {
+                mCallbackStatus = intent.getIntExtra(PackageInstaller.EXTRA_STATUS,
+                        PACKAGE_INSTALLER_STATUS_UNDEFINED);
+                if (mCallbackStatus == PackageInstaller.STATUS_SUCCESS) {
+                    assertEquals(TEST_APP_PKG, intent.getStringExtra(
+                            PackageInstaller.EXTRA_PACKAGE_NAME));
+                }
+                mCallbackReceived = true;
+                mPackageInstallerTimeoutLock.notify();
+            }
+        }
+    };
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mPackageManager = mContext.getPackageManager();
+        mPackageInstaller = mPackageManager.getPackageInstaller();
+        assertNotNull(mPackageInstaller);
+
+        // check that app is not already installed
+        assertFalse(isPackageInstalled(TEST_APP_PKG));
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mDevicePolicyManager.setUninstallBlocked(getWho(), TEST_APP_PKG, false);
+        try {
+            mContext.unregisterReceiver(mBroadcastReceiver);
+        } catch (IllegalArgumentException e) {
+            // ignore
+        }
+        if (mSession != null) {
+            mSession.abandon();
+        }
+        super.tearDown();
+    }
+
+    public void testSilentInstallUninstall() throws Exception {
+        // install the app
+        assertInstallPackage();
+
+        // uninstall the app again
+        assertTrue(tryUninstallPackage());
+        assertFalse(isPackageInstalled(TEST_APP_PKG));
+    }
+
+    public void testUninstallBlocked() throws Exception {
+        // install the app
+        assertInstallPackage();
+
+        mDevicePolicyManager.setUninstallBlocked(getWho(), TEST_APP_PKG, true);
+        assertTrue(mDevicePolicyManager.isUninstallBlocked(getWho(), TEST_APP_PKG));
+        assertTrue(mDevicePolicyManager.isUninstallBlocked(null, TEST_APP_PKG));
+        assertFalse(tryUninstallPackage());
+        assertTrue(isPackageInstalled(TEST_APP_PKG));
+
+        mDevicePolicyManager.setUninstallBlocked(getWho(), TEST_APP_PKG, false);
+        assertFalse(mDevicePolicyManager.isUninstallBlocked(getWho(), TEST_APP_PKG));
+        assertFalse(mDevicePolicyManager.isUninstallBlocked(null, TEST_APP_PKG));
+        assertTrue(tryUninstallPackage());
+        assertFalse(isPackageInstalled(TEST_APP_PKG));
+    }
+
+    private void assertInstallPackage() throws Exception {
+        synchronized (mPackageInstallerTimeoutLock) {
+            mCallbackReceived = false;
+            mCallbackStatus = PACKAGE_INSTALLER_STATUS_UNDEFINED;
+        }
+        installPackage(TEST_APP_LOCATION);
+        synchronized (mPackageInstallerTimeoutLock) {
+            try {
+                mPackageInstallerTimeoutLock.wait(PACKAGE_INSTALLER_TIMEOUT_MS);
+            } catch (InterruptedException e) {
+            }
+            assertTrue(mCallbackReceived);
+            assertEquals(PackageInstaller.STATUS_SUCCESS, mCallbackStatus);
+        }
+        assertTrue(isPackageInstalled(TEST_APP_PKG));
+    }
+
+    private boolean tryUninstallPackage() throws Exception {
+        assertTrue(isPackageInstalled(TEST_APP_PKG));
+        synchronized (mPackageInstallerTimeoutLock) {
+            mCallbackReceived = false;
+            mCallbackStatus = PACKAGE_INSTALLER_STATUS_UNDEFINED;
+        }
+        mPackageInstaller.uninstall(TEST_APP_PKG, getCommitCallback(0));
+        synchronized (mPackageInstallerTimeoutLock) {
+            try {
+                mPackageInstallerTimeoutLock.wait(PACKAGE_INSTALLER_TIMEOUT_MS);
+            } catch (InterruptedException e) {
+            }
+            assertTrue(mCallbackReceived);
+            return mCallbackStatus == PackageInstaller.STATUS_SUCCESS;
+        }
+    }
+
+    private void installPackage(String packageLocation) throws Exception {
+        PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
+                PackageInstaller.SessionParams.MODE_FULL_INSTALL);
+        int sessionId = mPackageInstaller.createSession(params);
+        mSession = mPackageInstaller.openSession(sessionId);
+
+        File file = new File(packageLocation);
+        InputStream in = new FileInputStream(file);
+        OutputStream out = mSession.openWrite("SilentPackageInstallerTest", 0, file.length());
+        byte[] buffer = new byte[65536];
+        int c;
+        while ((c = in.read(buffer)) != -1) {
+            out.write(buffer, 0, c);
+        }
+        mSession.fsync(out);
+        out.close();
+        mSession.commit(getCommitCallback(sessionId));
+        mSession.close();
+    }
+
+    private IntentSender getCommitCallback(int sessionId) {
+        // Create an intent-filter and register the receiver
+        String action = ACTION_INSTALL_COMMIT + "." + sessionId;
+        IntentFilter intentFilter = new IntentFilter();
+        intentFilter.addAction(action);
+        mContext.registerReceiver(mBroadcastReceiver, intentFilter);
+
+        // Create a PendingIntent and use it to generate the IntentSender
+        Intent broadcastIntent = new Intent(action);
+        PendingIntent pendingIntent = PendingIntent.getBroadcast(
+                mContext,
+                sessionId,
+                broadcastIntent,
+                PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
+        return pendingIntent.getIntentSender();
+    }
+
+    private boolean isPackageInstalled(String packageName) {
+        try {
+            PackageInfo pi = mPackageManager.getPackageInfo(packageName, 0);
+            return pi != null;
+        } catch (PackageManager.NameNotFoundException e) {
+            return false;
+        }
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/PersistentIntentResolvingTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/PersistentIntentResolvingTest.java
deleted file mode 100644
index fcef05f..0000000
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/PersistentIntentResolvingTest.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.android.cts.deviceowner;
-
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.SystemClock;
-
-public class PersistentIntentResolvingTest extends BaseDeviceOwnerTest {
-    public static final String EXAMPLE_ACTION = "com.android.cts.deviceowner.EXAMPLE_ACTION";
-
-    private boolean mReceivedConfirmationFrom1;
-    private boolean mReceivedConfirmationFrom2;
-    private BroadcastReceiver mReceiver;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(ExampleIntentReceivingActivity1.CONFIRM_ACTION);
-        filter.addAction(ExampleIntentReceivingActivity2.CONFIRM_ACTION);
-
-        mReceiver = new ConfirmReceiver();
-        mContext.registerReceiver(mReceiver, filter);
-
-        synchronized(this) {
-            mReceivedConfirmationFrom1 = false;
-            mReceivedConfirmationFrom2 = false;
-        }
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        mDevicePolicyManager.clearPackagePersistentPreferredActivities(getWho(), PACKAGE_NAME);
-        mContext.unregisterReceiver(mReceiver);
-
-        super.tearDown();
-    }
-
-    public void testNoPersistentPreferredActivityYieldsResolverActivity() {
-        sendExampleIntent();
-        SystemClock.sleep(5000);
-
-        // Default behavior: intent results in resolver activity, since there are two potential
-        // receivers. No intent is received.
-        synchronized(this) {
-            assertFalse(mReceivedConfirmationFrom1);
-            assertFalse(mReceivedConfirmationFrom2);
-        }
-    }
-
-    public void testAddPersistentPreferredActivityYieldsReceptionAtTarget() {
-        addPersistentPreferredActivity();
-        sendExampleIntent();
-        SystemClock.sleep(5000);
-
-        // Persistent preferred activity present: intent should be received by activity 2.
-        synchronized(this) {
-            assertFalse(mReceivedConfirmationFrom1);
-            assertTrue(mReceivedConfirmationFrom2);
-        }
-    }
-
-    public void testAddAndClearPersistentPreferredActivitiesYieldsResolverActivity() {
-        addPersistentPreferredActivity();
-        mDevicePolicyManager.clearPackagePersistentPreferredActivities(getWho(), PACKAGE_NAME);
-
-        sendExampleIntent();
-        SystemClock.sleep(5000);
-
-        // Default behavior: intent results in resolver activity, since there are two potential
-        // receivers. No intent is received.
-        synchronized(this) {
-            assertFalse(mReceivedConfirmationFrom1);
-            assertFalse(mReceivedConfirmationFrom2);
-        }
-    }
-
-    public class ConfirmReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (intent.getAction().equals(ExampleIntentReceivingActivity1.CONFIRM_ACTION)) {
-                synchronized (PersistentIntentResolvingTest.this) {
-                    mReceivedConfirmationFrom1 = true;
-                }
-            } else if (intent.getAction().equals(ExampleIntentReceivingActivity2
-                            .CONFIRM_ACTION)) {
-                synchronized (PersistentIntentResolvingTest.this) {
-                    mReceivedConfirmationFrom2 = true;
-                }
-            }
-        }
-    }
-
-    private void sendExampleIntent() {
-        Intent exampleIntent = new Intent(EXAMPLE_ACTION);
-        exampleIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        mContext.startActivity(exampleIntent);
-    }
-
-    private void addPersistentPreferredActivity() {
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(EXAMPLE_ACTION);
-        filter.addCategory(Intent.CATEGORY_DEFAULT);
-        ComponentName targetComponent = new ComponentName(PACKAGE_NAME,
-                ExampleIntentReceivingActivity2.class.getName());
-        mDevicePolicyManager.addPersistentPreferredActivity(getWho(), filter, targetComponent);
-    }
-}
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ScreenCaptureDisabledTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ScreenCaptureDisabledTest.java
deleted file mode 100644
index 59b9773..0000000
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/ScreenCaptureDisabledTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.android.cts.deviceowner;
-
-import android.app.admin.DevicePolicyManager;
-
-/**
- * Tests for {@link DevicePolicyManager#setScreenCaptureDisabled} and
- * {@link DevicePolicyManager#getScreenCaptureDisabled} APIs.
- */
-public class ScreenCaptureDisabledTest extends BaseDeviceOwnerTest {
-
-    public void testSetScreenCaptureDisabled_false() throws Exception {
-        mDevicePolicyManager.setScreenCaptureDisabled(getWho(), false);
-        assertFalse(mDevicePolicyManager.getScreenCaptureDisabled(getWho()));
-    }
-
-    public void testSetScreenCaptureDisabled_true() throws Exception {
-        mDevicePolicyManager.setScreenCaptureDisabled(getWho(), true);
-        assertTrue(mDevicePolicyManager.getScreenCaptureDisabled(getWho()));
-    }
-
-    public void testSetScreenCaptureDisabled_anyAdminTrue() {
-        mDevicePolicyManager.setScreenCaptureDisabled(getWho(), true);
-        assertTrue(mDevicePolicyManager.getScreenCaptureDisabled(null /* any admin */));
-    }
-
-    public void testSetScreenCaptureDisabled_anyAdminFalse() {
-        mDevicePolicyManager.setScreenCaptureDisabled(getWho(), false);
-        assertFalse(mDevicePolicyManager.getScreenCaptureDisabled(null /* any admin */));
-    }
-}
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/SystemUpdatePolicyTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/SystemUpdatePolicyTest.java
new file mode 100644
index 0000000..ac96e0b
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/SystemUpdatePolicyTest.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.deviceowner;
+
+import android.app.admin.DevicePolicyManager;
+import android.app.admin.SystemUpdatePolicy;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Build;
+
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Test {@link SystemUpdatePolicy}, {@link DevicePolicyManager#setSystemUpdatePolicy} and
+ * {@link DevicePolicyManager#getSystemUpdatePolicy}
+ */
+public class SystemUpdatePolicyTest extends BaseDeviceOwnerTest {
+
+    private static final int TIMEOUT_MS = 20_000;
+
+    private final Semaphore mPolicyChangedSemaphore = new Semaphore(0);
+    private final BroadcastReceiver policyChangedReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context arg0, Intent arg1) {
+            mPolicyChangedSemaphore.release();
+        }
+    };
+    private boolean mHasFeature;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mHasFeature = Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1;
+
+        if (mHasFeature) {
+            IntentFilter filter = new IntentFilter();
+            filter.addAction(DevicePolicyManager.ACTION_SYSTEM_UPDATE_POLICY_CHANGED);
+            mContext.registerReceiver(policyChangedReceiver, filter);
+        }
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mHasFeature) {
+            mContext.unregisterReceiver(policyChangedReceiver);
+            mDevicePolicyManager.setSystemUpdatePolicy(getWho(), null);
+        }
+        super.tearDown();
+    }
+
+    public void testSetEmptytInstallPolicy() {
+        if (!mHasFeature) {
+            return;
+        }
+        testPolicy(null);
+    }
+
+    public void testSetAutomaticInstallPolicy() {
+        if (!mHasFeature) {
+            return;
+        }
+        testPolicy(SystemUpdatePolicy.createAutomaticInstallPolicy());
+    }
+
+    public void testSetWindowedInstallPolicy() {
+        if (!mHasFeature) {
+            return;
+        }
+        testPolicy(SystemUpdatePolicy.createWindowedInstallPolicy(0, 720));
+    }
+
+    public void testSetPostponeInstallPolicy() {
+        if (!mHasFeature) {
+            return;
+        }
+        testPolicy(SystemUpdatePolicy.createPostponeInstallPolicy());
+    }
+
+    public void testShouldFailInvalidWindowPolicy() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        try {
+            SystemUpdatePolicy.createWindowedInstallPolicy(24 * 60 + 1, 720);
+            fail("Invalid window start should not be accepted.");
+        } catch (IllegalArgumentException expected) { }
+        try {
+            SystemUpdatePolicy.createWindowedInstallPolicy(-1, 720);
+            fail("Invalid window start should not be accepted.");
+        } catch (IllegalArgumentException expected) { }
+        try {
+            SystemUpdatePolicy.createWindowedInstallPolicy(0, 24 * 60 + 1);
+            fail("Invalid window end should not be accepted.");
+        } catch (IllegalArgumentException expected) { }
+        try {
+            SystemUpdatePolicy.createWindowedInstallPolicy(0, -1);
+            fail("Invalid window end should not be accepted.");
+        } catch (IllegalArgumentException expected) { }
+    }
+
+    private void testPolicy(SystemUpdatePolicy policy) {
+        mDevicePolicyManager.setSystemUpdatePolicy(getWho(), policy);
+        waitForBroadcast();
+        SystemUpdatePolicy newPolicy = mDevicePolicyManager.getSystemUpdatePolicy();
+        if (policy == null) {
+            assertNull(newPolicy);
+        } else {
+            assertNotNull(newPolicy);
+            assertEquals(policy.toString(), newPolicy.toString());
+            assertEquals(policy.getPolicyType(), newPolicy.getPolicyType());
+            if (policy.getPolicyType() == SystemUpdatePolicy.TYPE_INSTALL_WINDOWED) {
+                assertEquals(policy.getInstallWindowStart(), newPolicy.getInstallWindowStart());
+                assertEquals(policy.getInstallWindowEnd(), newPolicy.getInstallWindowEnd());
+            }
+        }
+    }
+    private void waitForBroadcast() {
+        try {
+            assertTrue("Timeout while waiting for broadcast.",
+                    mPolicyChangedSemaphore.tryAcquire(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+        } catch (InterruptedException e) {
+            fail("Interrupted while waiting for broadcast.");
+        }
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/WifiConfigLockdownTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/WifiConfigLockdownTest.java
new file mode 100644
index 0000000..1627961
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/WifiConfigLockdownTest.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.deviceowner;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiManager;
+import android.provider.Settings;
+
+import com.android.compatibility.common.util.WifiConfigCreator;
+
+import java.util.List;
+
+import static com.android.compatibility.common.util.WifiConfigCreator.ACTION_CREATE_WIFI_CONFIG;
+import static com.android.compatibility.common.util.WifiConfigCreator.EXTRA_NETID;
+import static com.android.compatibility.common.util.WifiConfigCreator.EXTRA_PASSWORD;
+import static com.android.compatibility.common.util.WifiConfigCreator.EXTRA_SECURITY_TYPE;
+import static com.android.compatibility.common.util.WifiConfigCreator.EXTRA_SSID;
+import static com.android.compatibility.common.util.WifiConfigCreator.ACTION_REMOVE_WIFI_CONFIG;
+import static com.android.compatibility.common.util.WifiConfigCreator.SECURITY_TYPE_NONE;
+import static com.android.compatibility.common.util.WifiConfigCreator.SECURITY_TYPE_WPA;
+import static com.android.compatibility.common.util.WifiConfigCreator.ACTION_UPDATE_WIFI_CONFIG;
+
+/**
+ * Testing WiFi configuration lockdown by Device Owner
+ */
+public class WifiConfigLockdownTest extends BaseDeviceOwnerTest {
+    private static final String TAG = "WifiConfigLockdownTest";
+    private static final String ORIGINAL_DEVICE_OWNER_SSID = "DOCTSTest";
+    private static final String CHANGED_DEVICE_OWNER_SSID = "DOChangedCTSTest";
+    private static final String ORIGINAL_REGULAR_SSID = "RegularCTSTest";
+    private static final String CHANGED_REGULAR_SSID = "RegularChangedCTSTest";
+    private static final String ORIGINAL_PASSWORD = "originalpassword";
+    private WifiManager mWifiManager;
+    private WifiConfigCreator mConfigCreator;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
+        mConfigCreator = new WifiConfigCreator(mContext);
+        mDevicePolicyManager.setGlobalSetting(getWho(),
+                Settings.Global.WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN, "1");
+        mConfigCreator.addNetwork(ORIGINAL_DEVICE_OWNER_SSID, true, SECURITY_TYPE_WPA,
+                ORIGINAL_PASSWORD);
+        startRegularActivity(ACTION_CREATE_WIFI_CONFIG, -1, ORIGINAL_REGULAR_SSID,
+                SECURITY_TYPE_WPA, ORIGINAL_PASSWORD);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mDevicePolicyManager.setGlobalSetting(getWho(),
+                Settings.Global.WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN, "0");
+        List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
+        for (WifiConfiguration config : configs) {
+            if (areMatchingSsids(ORIGINAL_DEVICE_OWNER_SSID, config.SSID) ||
+                    areMatchingSsids(CHANGED_DEVICE_OWNER_SSID, config.SSID) ||
+                    areMatchingSsids(ORIGINAL_REGULAR_SSID, config.SSID) ||
+                    areMatchingSsids(CHANGED_REGULAR_SSID, config.SSID)) {
+                mWifiManager.removeNetwork(config.networkId);
+            }
+        }
+        super.tearDown();
+    }
+
+    public void testDeviceOwnerCanUpdateConfig() throws Exception {
+        List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
+        int updateCount = 0;
+        for (WifiConfiguration config : configs) {
+            if (areMatchingSsids(ORIGINAL_DEVICE_OWNER_SSID, config.SSID)) {
+                assertFalse(-1 == mConfigCreator.updateNetwork(config,
+                        CHANGED_DEVICE_OWNER_SSID, true, SECURITY_TYPE_NONE, null));
+                ++updateCount;
+            }
+            if (areMatchingSsids(ORIGINAL_REGULAR_SSID, config.SSID)) {
+                assertFalse(-1 == mConfigCreator.updateNetwork(config,
+                        CHANGED_REGULAR_SSID, true, SECURITY_TYPE_NONE, null));
+                ++updateCount;
+            }
+        }
+        assertEquals("Expected to update two configs: the DO created one and the regular one." +
+                " Instead updated: " + updateCount, 2, updateCount);
+    }
+
+    public void testDeviceOwnerCanRemoveConfig() throws Exception {
+        List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
+        int removeCount = 0;
+        for (WifiConfiguration config : configs) {
+            if (areMatchingSsids(ORIGINAL_DEVICE_OWNER_SSID, config.SSID) ||
+                    areMatchingSsids(ORIGINAL_REGULAR_SSID, config.SSID)) {
+                assertTrue(mWifiManager.removeNetwork(config.networkId));
+                ++removeCount;
+            }
+        }
+        assertEquals("Expected to remove two configs: the DO created one and the regular one." +
+                " Instead removed: " + removeCount, 2, removeCount);
+    }
+
+    public void testRegularAppCannotUpdateDeviceOwnerConfig() throws Exception {
+        List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
+        int updateCount = 0;
+        for (WifiConfiguration config : configs) {
+            if (areMatchingSsids(ORIGINAL_DEVICE_OWNER_SSID, config.SSID)) {
+                startRegularActivity(ACTION_UPDATE_WIFI_CONFIG, config.networkId,
+                        CHANGED_DEVICE_OWNER_SSID, SECURITY_TYPE_NONE, null);
+                ++updateCount;
+            }
+        }
+        assertEquals("Expected to have tried to update one config: the DO created one" +
+                " Instead tried to update: " + updateCount, 1, updateCount);
+
+        // Assert nothing has changed
+        configs = mWifiManager.getConfiguredNetworks();
+        int notChangedCount = 0;
+        for (WifiConfiguration config : configs) {
+            assertFalse(areMatchingSsids(CHANGED_DEVICE_OWNER_SSID, config.SSID));
+            if (areMatchingSsids(ORIGINAL_DEVICE_OWNER_SSID, config.SSID)) {
+                ++notChangedCount;
+            }
+        }
+        assertEquals("Expected to see one unchanged config, saw instead: " + notChangedCount, 1,
+                notChangedCount);
+    }
+
+    public void testRegularAppCannotRemoveDeviceOwnerConfig() throws Exception {
+        List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
+        int removeCount = 0;
+        for (WifiConfiguration config : configs) {
+            if (areMatchingSsids(ORIGINAL_DEVICE_OWNER_SSID, config.SSID)) {
+                startRegularActivity(ACTION_REMOVE_WIFI_CONFIG, config.networkId,
+                        null, SECURITY_TYPE_NONE, null);
+                ++removeCount;
+            }
+        }
+        assertEquals("Expected to try to remove one config: the DO created one." +
+                " Instead tried to remove: " + removeCount, 1, removeCount);
+
+        // Assert nothing has changed
+        configs = mWifiManager.getConfiguredNetworks();
+        int notChangedCount = 0;
+        for (WifiConfiguration config : configs) {
+            if (areMatchingSsids(ORIGINAL_DEVICE_OWNER_SSID, config.SSID)) {
+                ++notChangedCount;
+            }
+        }
+        assertEquals("Expected to see one unchanged config, saw instead: " + notChangedCount, 1,
+                notChangedCount);
+    }
+
+    private void startRegularActivity(String action, int netId, String ssid, int securityType,
+            String password) throws InterruptedException {
+        Intent createRegularConfig = new Intent(action);
+        createRegularConfig.putExtra(EXTRA_NETID, netId);
+        createRegularConfig.putExtra(EXTRA_SSID, ssid);
+        createRegularConfig.putExtra(EXTRA_SECURITY_TYPE, securityType);
+        createRegularConfig.putExtra(EXTRA_PASSWORD, password);
+        createRegularConfig.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mContext.startActivity(createRegularConfig);
+
+        // Give some time for the other app to finish the action
+        Thread.sleep(2000);
+    }
+
+    private boolean areMatchingSsids(String s1, String s2) {
+        if (s1 == null || s2 == null) {
+            return false;
+        }
+        return s1.replace("\"", "").equals(s2.replace("\"", ""));
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/IntentReceiver/Android.mk b/hostsidetests/devicepolicy/app/IntentReceiver/Android.mk
index 62c7f28..98cdf52 100644
--- a/hostsidetests/devicepolicy/app/IntentReceiver/Android.mk
+++ b/hostsidetests/devicepolicy/app/IntentReceiver/Android.mk
@@ -26,6 +26,8 @@
 
 LOCAL_JAVA_LIBRARIES := android.test.runner
 
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 ctstestrunner
+
 LOCAL_SDK_VERSION := current
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/devicepolicy/app/IntentReceiver/AndroidManifest.xml b/hostsidetests/devicepolicy/app/IntentReceiver/AndroidManifest.xml
index 5bbdf76..1512bb2 100644
--- a/hostsidetests/devicepolicy/app/IntentReceiver/AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/IntentReceiver/AndroidManifest.xml
@@ -22,15 +22,53 @@
     <uses-permission android:name="com.android.cts.managedprofile.permission.SAMPLE"/>
 
     <application>
+
+        <uses-library android:name="android.test.runner" />
+
         <activity android:name="com.android.cts.intent.receiver.IntentReceiverActivity">
             <intent-filter>
                 <action android:name="com.android.cts.action.COPY_TO_CLIPBOARD" />
                 <action android:name="com.android.cts.action.READ_FROM_URI" />
                 <action android:name="com.android.cts.action.TAKE_PERSISTABLE_URI_PERMISSION" />
                 <action android:name="com.android.cts.action.WRITE_TO_URI" />
+                <action android:name="com.android.cts.action.JUST_CREATE" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
+
+        <activity android:name=".SimpleIntentReceiverActivity" android:exported="true"/>
+
+        <activity-alias android:name=".BrowserActivity"
+            android:targetActivity=".SimpleIntentReceiverActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+                <category android:name="android.intent.category.BROWSABLE"/>
+                <data android:scheme="http"/>
+            </intent-filter>
+        </activity-alias>
+
+        <activity-alias android:name=".AppLinkActivity"
+            android:targetActivity=".SimpleIntentReceiverActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+                <category android:name="android.intent.category.BROWSABLE"/>
+                <data android:scheme="http" android:host="com.android.cts.intent.receiver"/>
+            </intent-filter>
+        </activity-alias>
+
+        <receiver android:name=".BroadcastIntentReceiver">
+            <intent-filter>
+                <action android:name="android.app.action.DEVICE_OWNER_CHANGED"/>
+            </intent-filter>
+        </receiver>
+
     </application>
 
+    <instrumentation
+        android:name="android.support.test.runner.AndroidJUnitRunner"
+        android:targetPackage="com.android.cts.intent.receiver"
+        android:label="Intent Receiver CTS Tests" />
+
 </manifest>
diff --git a/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/BroadcastIntentReceiver.java b/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/BroadcastIntentReceiver.java
new file mode 100644
index 0000000..34b8798
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/BroadcastIntentReceiver.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.intent.receiver;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+
+public class BroadcastIntentReceiver extends BroadcastReceiver {
+
+    static final String OWNER_CHANGED_BROADCAST_RECEIVED_KEY
+         = "owner-changed-broadcast-received";
+
+    static final String PREFERENCES_NAME = "BroadcastIntentReceiver";
+
+    @Override
+    public void onReceive(Context c, Intent i) {
+        SharedPreferences prefs = c.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE);
+        SharedPreferences.Editor editor = prefs.edit();
+        editor.putBoolean(OWNER_CHANGED_BROADCAST_RECEIVED_KEY, true);
+        editor.apply();
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/IntentReceiverActivity.java b/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/IntentReceiverActivity.java
index 294c678..9aa948e 100644
--- a/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/IntentReceiverActivity.java
+++ b/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/IntentReceiverActivity.java
@@ -49,6 +49,11 @@
     private static final String ACTION_WRITE_TO_URI =
             "com.android.cts.action.WRITE_TO_URI";
 
+    private static final String ACTION_JUST_CREATE =
+            "com.android.cts.action.JUST_CREATE";
+
+    public static final String RECEIVING_ACTIVITY_CREATED_ACTION
+            = "com.android.cts.deviceowner.RECEIVING_ACTIVITY_CREATED_ACTION";
 
     private static final String EXTRA_CAUGHT_SECURITY_EXCEPTION = "extra_caught_security_exception";
 
@@ -98,6 +103,8 @@
                 Log.i(TAG, "Caught a IOException while trying to write to " + uri, e);
             }
             setResult(Activity.RESULT_OK, result);
+        } else if (ACTION_JUST_CREATE.equals(action)) {
+            sendBroadcast(new Intent(RECEIVING_ACTIVITY_CREATED_ACTION));
         }
         finish();
     }
diff --git a/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/OwnerChangedBroadcastTest.java b/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/OwnerChangedBroadcastTest.java
new file mode 100644
index 0000000..5cad040
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/OwnerChangedBroadcastTest.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.intent.receiver;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
+import android.test.InstrumentationTestCase;
+
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+import java.lang.InterruptedException;
+
+public class OwnerChangedBroadcastTest extends InstrumentationTestCase {
+
+    private SharedPreferences mPreferences;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        Context context = getInstrumentation().getTargetContext();
+        mPreferences = context.getSharedPreferences(
+                BroadcastIntentReceiver.PREFERENCES_NAME, Context.MODE_PRIVATE);
+    }
+
+    // We can't just register a broadcast receiver in the code because the broadcast
+    // may have been sent before this test is run. So we have a manifest receiver
+    // listening to the broadcast and writing to a shared preference when it receives it.
+    public void testOwnerChangedBroadcastReceived() throws InterruptedException {
+        final Semaphore mPreferenceChanged = new Semaphore(0);
+
+        OnSharedPreferenceChangeListener listener = new OnSharedPreferenceChangeListener() {
+            @Override
+            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+                if (key.equals(BroadcastIntentReceiver.OWNER_CHANGED_BROADCAST_RECEIVED_KEY)) {
+                    mPreferenceChanged.release();
+                }
+            }
+        };
+        mPreferences.registerOnSharedPreferenceChangeListener(listener);
+
+        if (mPreferences.getBoolean(BroadcastIntentReceiver.OWNER_CHANGED_BROADCAST_RECEIVED_KEY,
+                false)) {
+            // The broadcast intent has already been received? good
+            // Otherwise, we'll wait until we receive it.
+            return;
+        }
+        assertTrue(mPreferenceChanged.tryAcquire(40, TimeUnit.SECONDS));
+        assertTrue(mPreferences.getBoolean(
+                BroadcastIntentReceiver.OWNER_CHANGED_BROADCAST_RECEIVED_KEY, false));
+    }
+
+    public void testOwnerChangedBroadcastNotReceived() {
+        assertFalse(mPreferences.getBoolean(
+                BroadcastIntentReceiver.OWNER_CHANGED_BROADCAST_RECEIVED_KEY, false));
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/SimpleIntentReceiverActivity.java b/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/SimpleIntentReceiverActivity.java
new file mode 100644
index 0000000..23755df
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/IntentReceiver/src/com/android/cts/intent/receiver/SimpleIntentReceiverActivity.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.intent.receiver;
+
+import android.app.admin.DevicePolicyManager;
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+import android.os.Bundle;
+
+/**
+ * An activity that receives an intent and returns immediately, indicating its own name and if it is
+ * running in a managed profile.
+ */
+public class SimpleIntentReceiverActivity extends Activity {
+    private static final String TAG = "SimpleIntentReceiverActivity";
+
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        String className = getIntent().getComponent().getClassName();
+
+        // We try to check if we are in a managed profile or not.
+        // To do this, check if com.android.cts.managedprofile is the profile owner.
+        DevicePolicyManager dpm =
+                (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
+        boolean inManagedProfile = dpm.isProfileOwnerApp("com.android.cts.managedprofile");
+
+        Log.i(TAG, "activity " + className + " started, is in managed profile: "
+                + inManagedProfile);
+        Intent result = new Intent();
+        result.putExtra("extra_receiver_class", className);
+        result.putExtra("extra_in_managed_profile", inManagedProfile);
+        setResult(Activity.RESULT_OK, result);
+        finish();
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/IntentSender/Android.mk b/hostsidetests/devicepolicy/app/IntentSender/Android.mk
index e45ec31..e5246c5 100644
--- a/hostsidetests/devicepolicy/app/IntentSender/Android.mk
+++ b/hostsidetests/devicepolicy/app/IntentSender/Android.mk
@@ -26,7 +26,7 @@
 
 LOCAL_JAVA_LIBRARIES := android.test.runner
 
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 ctstestrunner
 
 LOCAL_SDK_VERSION := current
 
diff --git a/hostsidetests/devicepolicy/app/IntentSender/AndroidManifest.xml b/hostsidetests/devicepolicy/app/IntentSender/AndroidManifest.xml
index 070ef40..cc27298 100644
--- a/hostsidetests/devicepolicy/app/IntentSender/AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/IntentSender/AndroidManifest.xml
@@ -52,7 +52,7 @@
     </application>
 
     <instrumentation
-        android:name="android.test.InstrumentationTestRunner"
+        android:name="android.support.test.runner.AndroidJUnitRunner"
         android:targetPackage="com.android.cts.intent.sender"
         android:label="Intent Sender CTS Tests" />
 
diff --git a/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/AppLinkTest.java b/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/AppLinkTest.java
new file mode 100644
index 0000000..51ff362
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/AppLinkTest.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.intent.sender;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.test.InstrumentationTestCase;
+import android.util.Log;
+
+public class AppLinkTest extends InstrumentationTestCase {
+
+    private static final String TAG = "AppLinkTest";
+
+    private Context mContext;
+    private IntentSenderActivity mActivity;
+
+    private static final String EXTRA_IN_MANAGED_PROFILE = "extra_in_managed_profile";
+    private static final String EXTRA_RECEIVER_CLASS = "extra_receiver_class";
+    private static final String APP_LINK_ACTIVITY
+            = "com.android.cts.intent.receiver.AppLinkActivity";
+    private static final String BROWSER_ACTIVITY
+            = "com.android.cts.intent.receiver.BrowserActivity";
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mContext = getInstrumentation().getTargetContext();
+        mActivity = launchActivity(mContext.getPackageName(), IntentSenderActivity.class, null);
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        mActivity.finish();
+        super.tearDown();
+    }
+
+    public void testReceivedByAppLinkActivityInPrimary() throws Exception {
+        checkHttpIntentResult(APP_LINK_ACTIVITY, false);
+    }
+
+    public void testReceivedByAppLinkActivityInManaged() throws Exception {
+        checkHttpIntentResult(APP_LINK_ACTIVITY, true);
+    }
+
+    public void testReceivedByBrowserActivityInManaged() throws Exception {
+        checkHttpIntentResult(BROWSER_ACTIVITY, true);
+    }
+
+    public void testTwoReceivers() {
+        assertNumberOfReceivers(2);
+    }
+
+    public void testThreeReceivers() {
+        assertNumberOfReceivers(3);
+    }
+
+    // Should not be called if there are several possible receivers to the intent
+    // (see getHttpIntent)
+    private void checkHttpIntentResult(String receiverClassName, boolean inManagedProfile)
+            throws Exception {
+        PackageManager pm = mContext.getPackageManager();
+
+        Intent result = mActivity.getResult(getHttpIntent());
+        // If it is received in the other profile, we cannot check the class from the ResolveInfo
+        // returned by queryIntentActivities. So we rely on the receiver telling us its class.
+        assertEquals(receiverClassName, result.getStringExtra(EXTRA_RECEIVER_CLASS));
+        assertTrue(result.hasExtra(EXTRA_IN_MANAGED_PROFILE));
+        assertEquals(inManagedProfile, result.getBooleanExtra(EXTRA_IN_MANAGED_PROFILE, false));
+    }
+
+    private void assertNumberOfReceivers(int n) {
+        PackageManager pm = mContext.getPackageManager();
+        assertEquals(n, pm.queryIntentActivities(getHttpIntent(), /* flags = */ 0).size());
+    }
+
+    private Intent getHttpIntent() {
+        Intent i = new Intent(Intent.ACTION_VIEW);
+        i.addCategory(Intent.CATEGORY_BROWSABLE);
+        i.setData(Uri.parse("http://com.android.cts.intent.receiver"));
+        return i;
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/CopyPasteTest.java b/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/CopyPasteTest.java
index a5d83db..46fc0c4 100644
--- a/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/CopyPasteTest.java
+++ b/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/CopyPasteTest.java
@@ -44,7 +44,7 @@
         super.setUp();
         Context context = getInstrumentation().getTargetContext();
         mActivity = launchActivity(context.getPackageName(), IntentSenderActivity.class, null);
-        mClipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
+        mClipboard = (ClipboardManager) mActivity.getSystemService(Context.CLIPBOARD_SERVICE);
     }
 
     @Override
diff --git a/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/IntentSenderActivity.java b/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/IntentSenderActivity.java
index fd421ac..eb64d47 100644
--- a/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/IntentSenderActivity.java
+++ b/hostsidetests/devicepolicy/app/IntentSender/src/com/android/cts/intent/sender/IntentSenderActivity.java
@@ -66,8 +66,12 @@
     }
 
     public Intent getResult(Intent intent) throws Exception {
+        Log.d(TAG, "Sending intent " + intent);
         startActivityForResult(intent, 42);
         final Result result = mResult.poll(30, TimeUnit.SECONDS);
+        if (result != null) {
+            Log.d(TAG, "Result intent: " + result.data);
+        }
         return (result != null) ? result.data : null;
     }
 
diff --git a/hostsidetests/devicepolicy/app/LauncherTests/Android.mk b/hostsidetests/devicepolicy/app/LauncherTests/Android.mk
index 4517ea2..5f645b6 100644
--- a/hostsidetests/devicepolicy/app/LauncherTests/Android.mk
+++ b/hostsidetests/devicepolicy/app/LauncherTests/Android.mk
@@ -26,6 +26,8 @@
 
 LOCAL_JAVA_LIBRARIES := android.test.runner cts-junit
 
+LOCAL_STATIC_JAVA_LIBRARIES = android-support-v4 ctstestrunner
+
 LOCAL_SDK_VERSION := current
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/devicepolicy/app/LauncherTests/AndroidManifest.xml b/hostsidetests/devicepolicy/app/LauncherTests/AndroidManifest.xml
index a21b8c2..5ded006 100644
--- a/hostsidetests/devicepolicy/app/LauncherTests/AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/LauncherTests/AndroidManifest.xml
@@ -23,7 +23,7 @@
         <uses-library android:name="android.test.runner" />
     </application>
 
-    <instrumentation android:name="android.test.InstrumentationTestRunner"
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
                      android:targetPackage="com.android.cts.launchertests"
                      android:label="Launcher Apps CTS Tests"/>
 </manifest>
diff --git a/hostsidetests/devicepolicy/app/LauncherTests/src/com/android/cts/launchertests/LauncherAppsTests.java b/hostsidetests/devicepolicy/app/LauncherTests/src/com/android/cts/launchertests/LauncherAppsTests.java
index e076fc3..35c16ea 100644
--- a/hostsidetests/devicepolicy/app/LauncherTests/src/com/android/cts/launchertests/LauncherAppsTests.java
+++ b/hostsidetests/devicepolicy/app/LauncherTests/src/com/android/cts/launchertests/LauncherAppsTests.java
@@ -38,8 +38,8 @@
 import android.os.ResultReceiver;
 import android.os.UserHandle;
 import android.os.UserManager;
-import android.test.InstrumentationTestCase;
-import android.test.InstrumentationTestRunner;
+import android.support.test.InstrumentationRegistry;
+import android.test.AndroidTestCase;
 import android.util.Pair;
 
 import java.util.concurrent.Semaphore;
@@ -49,7 +49,7 @@
 /**
  * Tests for LauncherApps service
  */
-public class LauncherAppsTests extends InstrumentationTestCase {
+public class LauncherAppsTests extends AndroidTestCase {
 
     public static final String SIMPLE_APP_PACKAGE = "com.android.cts.launcherapps.simpleapp";
 
@@ -69,7 +69,7 @@
 
     private LauncherApps mLauncherApps;
     private UserHandle mUser;
-    private InstrumentationTestRunner mInstrumentation;
+    private Instrumentation mInstrumentation;
     private Messenger mService;
     private Connection mConnection;
     private Result mResult;
@@ -78,8 +78,8 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mInstrumentation = (InstrumentationTestRunner) getInstrumentation();
-        Bundle arguments = mInstrumentation.getArguments();
+        mInstrumentation = InstrumentationRegistry.getInstrumentation();
+        Bundle arguments = InstrumentationRegistry.getArguments();
         UserManager userManager = (UserManager) mInstrumentation.getContext().getSystemService(
                 Context.USER_SERVICE);
         mUser = getUserHandleArgument(userManager, "testUser", arguments);
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/Android.mk b/hostsidetests/devicepolicy/app/ManagedProfile/Android.mk
index 46e3cf7..b31e74b 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/Android.mk
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/Android.mk
@@ -26,7 +26,8 @@
 
 LOCAL_JAVA_LIBRARIES := android.test.runner cts-junit
 
-LOCAL_STATIC_JAVA_LIBRARIES = android-support-v4
+LOCAL_STATIC_JAVA_LIBRARIES = android-support-v4 ctstestrunner compatibility-device-util_v2 \
+	ub-uiautomator
 
 LOCAL_SDK_VERSION := current
 
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml b/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml
index e430785..8e27e72 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml
@@ -18,10 +18,12 @@
     package="com.android.cts.managedprofile">
 
     <uses-sdk android:minSdkVersion="20"/>
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
     <uses-permission android:name="android.permission.BLUETOOTH" />
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
     <uses-permission android:name="android.permission.READ_CONTACTS" />
     <uses-permission android:name="android.permission.WRITE_CONTACTS" />
+    <uses-permission android:name="android.permission.CAMERA" />
 
     <application>
         <uses-library android:name="android.test.runner" />
@@ -34,6 +36,15 @@
                 <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
             </intent-filter>
         </receiver>
+        <receiver
+            android:name="com.android.cts.managedprofile.PrimaryUserDeviceAdmin"
+            android:permission="android.permission.BIND_DEVICE_ADMIN">
+            <meta-data android:name="android.app.device_admin"
+                       android:resource="@xml/primary_device_admin" />
+            <intent-filter>
+                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
+            </intent-filter>
+        </receiver>
         <activity android:name=".PrimaryUserFilterSetterActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -41,12 +52,7 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-        <activity android:name=".ComponentDisablingActivity" >
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.DEFAULT"/>
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
+        <activity android:name=".ComponentDisablingActivity" android:exported="true">
         </activity>
         <activity android:name=".ManagedProfileActivity">
             <intent-filter>
@@ -66,7 +72,7 @@
                 <action android:name="com.android.cts.managedprofile.ACTION_TEST_ALL_ACTIVITY" />
             </intent-filter>
         </activity>
-        <activity android:name=".UserRestrictionActivity" >
+        <activity android:name=".SetPolicyActivity" >
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.DEFAULT"/>
@@ -75,7 +81,7 @@
         <activity android:name=".TestActivity" />
     </application>
 
-    <instrumentation android:name="android.test.InstrumentationTestRunner"
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
                      android:targetPackage="com.android.cts.managedprofile"
                      android:label="Managed Profile CTS Tests"/>
 </manifest>
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/res/xml/device_admin.xml b/hostsidetests/devicepolicy/app/ManagedProfile/res/xml/device_admin.xml
index 8f39ed0..c3d5c98 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/res/xml/device_admin.xml
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/res/xml/device_admin.xml
@@ -15,5 +15,6 @@
 <device-admin xmlns:android="http://schemas.android.com/apk/res/android" android:visible="false">
     <uses-policies>
         <wipe-data />
+        <disable-camera />
     </uses-policies>
 </device-admin>
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/res/xml/primary_device_admin.xml b/hostsidetests/devicepolicy/app/ManagedProfile/res/xml/primary_device_admin.xml
new file mode 100644
index 0000000..0ec3d1e
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/res/xml/primary_device_admin.xml
@@ -0,0 +1,21 @@
+<!-- Copyright (C) 2015 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.
+-->
+<device-admin xmlns:android="http://schemas.android.com/apk/res/android" android:visible="false">
+    <uses-policies>
+         <reset-password />
+         <limit-password />
+         <disable-camera />
+    </uses-policies>
+</device-admin>
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/BaseManagedProfileTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/BaseManagedProfileTest.java
index 2a54d97..49754d0 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/BaseManagedProfileTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/BaseManagedProfileTest.java
@@ -19,7 +19,8 @@
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
 import android.content.Context;
-import android.test.AndroidTestCase;
+import android.support.test.uiautomator.UiDevice;
+import android.test.InstrumentationTestCase;
 
 /**
  * Base class for profile-owner based tests.
@@ -27,7 +28,7 @@
  * This class handles making sure that the test is the profile owner and that it has an active admin
  * registered, so that all tests may assume these are done.
  */
-public class BaseManagedProfileTest extends AndroidTestCase {
+public class BaseManagedProfileTest extends InstrumentationTestCase {
 
     public static class BasicAdminReceiver extends DeviceAdminReceiver {
     }
@@ -36,21 +37,23 @@
             BasicAdminReceiver.class.getPackage().getName(), BasicAdminReceiver.class.getName());
 
     protected DevicePolicyManager mDevicePolicyManager;
+    protected Context mContext;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+        mContext = getInstrumentation().getContext();
 
-       mDevicePolicyManager = (DevicePolicyManager)
-               mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
-       assertNotNull(mDevicePolicyManager);
+        mDevicePolicyManager = (DevicePolicyManager)
+                mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
+        assertNotNull(mDevicePolicyManager);
 
-       // TODO: Only check the below if we are running as the profile user. If running under the
-       // user owner, can we check that there is a profile and that the below holds for it? If we
-       // don't want to do these checks every time we could get rid of this class altogether and
-       // just have a single test case running under the profile user that do them.
-       assertTrue(mDevicePolicyManager.isAdminActive(ADMIN_RECEIVER_COMPONENT));
-       assertTrue(mDevicePolicyManager.isProfileOwnerApp(
-               ADMIN_RECEIVER_COMPONENT.getPackageName()));
+        // TODO: Only check the below if we are running as the profile user. If running under the
+        // user owner, can we check that there is a profile and that the below holds for it? If we
+        // don't want to do these checks every time we could get rid of this class altogether and
+        // just have a single test case running under the profile user that do them.
+        assertTrue(mDevicePolicyManager.isAdminActive(ADMIN_RECEIVER_COMPONENT));
+        assertTrue(mDevicePolicyManager.isProfileOwnerApp(
+                ADMIN_RECEIVER_COMPONENT.getPackageName()));
     }
 }
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CameraPolicyTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CameraPolicyTest.java
new file mode 100644
index 0000000..25e0b94
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CameraPolicyTest.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.managedprofile;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.hardware.camera2.CameraManager;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.test.AndroidTestCase;
+
+
+public class CameraPolicyTest extends AndroidTestCase {
+
+    protected static final String MANAGED_PROFILE_PKG = "com.android.cts.managedprofile";
+
+    private static final String PRIMARY_ADMIN_RECEIVER_TEST_CLASS =
+            MANAGED_PROFILE_PKG + ".PrimaryUserDeviceAdmin";
+
+    private static final String MANAGED_PROFILE_ADMIN_RECEIVER_TEST_CLASS =
+            MANAGED_PROFILE_PKG + ".BaseManagedProfileTest$BasicAdminReceiver";
+
+    private DevicePolicyManager mDevicePolicyManager;
+
+    private CameraManager mCameraManager;
+
+    private ComponentName mPrimaryAdminComponent;
+
+    private ComponentName mManagedProfileAdminComponent;
+
+    private HandlerThread mBackgroundThread;
+
+    /**
+     * A {@link Handler} for running tasks in the background.
+     */
+    private Handler mBackgroundHandler;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mDevicePolicyManager = (DevicePolicyManager) getContext()
+                .getSystemService(Context.DEVICE_POLICY_SERVICE);
+        mCameraManager = (CameraManager) getContext().getSystemService(Context.CAMERA_SERVICE);
+        mPrimaryAdminComponent = new ComponentName(MANAGED_PROFILE_PKG,
+                PRIMARY_ADMIN_RECEIVER_TEST_CLASS);
+        mManagedProfileAdminComponent = new ComponentName(MANAGED_PROFILE_PKG,
+                MANAGED_PROFILE_ADMIN_RECEIVER_TEST_CLASS);
+        startBackgroundThread();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        stopBackgroundThread();
+        super.tearDown();
+    }
+
+    public void testDisableCameraInManagedProfile() throws Exception {
+        mDevicePolicyManager.setCameraDisabled(mManagedProfileAdminComponent, true);
+        assertTrue(mDevicePolicyManager.getCameraDisabled(mManagedProfileAdminComponent));
+        assertTrue(mDevicePolicyManager.getCameraDisabled(null));
+        checkCanOpenCamera(false);
+    }
+
+    public void testEnableCameraInManagedProfile() throws Exception {
+        mDevicePolicyManager.setCameraDisabled(mManagedProfileAdminComponent, false);
+        assertFalse(mDevicePolicyManager.getCameraDisabled(mManagedProfileAdminComponent));
+        assertFalse(mDevicePolicyManager.getCameraDisabled(null));
+        checkCanOpenCamera(true);
+    }
+
+    public void testDisableCameraInPrimaryProfile() throws Exception {
+        mDevicePolicyManager.setCameraDisabled(mPrimaryAdminComponent, true);
+        assertTrue(mDevicePolicyManager.getCameraDisabled(mPrimaryAdminComponent));
+        assertTrue(mDevicePolicyManager.getCameraDisabled(null));
+        checkCanOpenCamera(false);
+    }
+
+    public void testEnableCameraInPrimaryProfile() throws Exception {
+        mDevicePolicyManager.setCameraDisabled(mPrimaryAdminComponent, false);
+        assertFalse(mDevicePolicyManager.getCameraDisabled(mPrimaryAdminComponent));
+        assertFalse(mDevicePolicyManager.getCameraDisabled(null));
+        checkCanOpenCamera(true);
+    }
+
+    public void testIsCameraEnabledInPrimaryProfile() throws Exception {
+        assertFalse(mDevicePolicyManager.getCameraDisabled(mPrimaryAdminComponent));
+        assertFalse(mDevicePolicyManager.getCameraDisabled(null));
+        checkCanOpenCamera(true);
+    }
+
+    public void testIsCameraEnabledInManagedProfile() throws Exception {
+        assertFalse(mDevicePolicyManager.getCameraDisabled(mManagedProfileAdminComponent));
+        assertFalse(mDevicePolicyManager.getCameraDisabled(null));
+        checkCanOpenCamera(true);
+    }
+
+    private void checkCanOpenCamera(boolean canOpen) {
+        boolean successToOpen = CameraUtils
+                .blockUntilOpenCamera(mCameraManager, mBackgroundHandler);
+        assertEquals(canOpen, successToOpen);
+    }
+
+    /**
+     * Starts a background thread and its {@link Handler}.
+     */
+    private void startBackgroundThread() {
+        mBackgroundThread = new HandlerThread("CameraBackground");
+        mBackgroundThread.start();
+        mBackgroundHandler = new Handler(mBackgroundThread.getLooper());
+    }
+
+    /**
+     * Stops the background thread and its {@link Handler}.
+     */
+    private void stopBackgroundThread() {
+        mBackgroundThread.quitSafely();
+        try {
+            mBackgroundThread.join();
+            mBackgroundThread = null;
+            mBackgroundHandler = null;
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CameraUtils.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CameraUtils.java
new file mode 100644
index 0000000..516e244
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CameraUtils.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.managedprofile;
+
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CameraManager;
+import android.os.Handler;
+import android.util.Log;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * A util class to help open camera in a blocking way.
+ */
+class CameraUtils {
+
+    private static final String TAG = "CameraUtils";
+
+    /**
+     * @return true if success to open camera, false otherwise.
+     */
+    public static boolean blockUntilOpenCamera(CameraManager cameraManager, Handler handler) {
+        try {
+            String[] cameraIdList = cameraManager.getCameraIdList();
+            if (cameraIdList == null || cameraIdList.length == 0) {
+                return false;
+            }
+            String cameraId = cameraIdList[0];
+            CameraCallback callback = new CameraCallback();
+            cameraManager.openCamera(cameraId, callback, handler);
+            return callback.waitForResult();
+        } catch (Exception ex) {
+            // No matter what is going wrong, it means fail to open camera.
+            ex.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * {@link CameraDevice.StateCallback} is called when {@link CameraDevice} changes its state.
+     */
+    private static class CameraCallback extends CameraDevice.StateCallback {
+
+        private static final int OPEN_TIMEOUT_SECONDS = 5;
+
+        private final CountDownLatch mLatch = new CountDownLatch(1);
+
+        private AtomicBoolean mResult = new AtomicBoolean(false);
+
+        @Override
+        public void onOpened(CameraDevice cameraDevice) {
+            Log.d(TAG, "open camera successfully");
+            mResult.set(true);
+            if (cameraDevice != null) {
+                cameraDevice.close();
+            }
+            mLatch.countDown();
+        }
+
+        @Override
+        public void onDisconnected(CameraDevice cameraDevice) {
+            Log.d(TAG, "disconnect camera");
+            mLatch.countDown();
+        }
+
+        @Override
+        public void onError(CameraDevice cameraDevice, int error) {
+            Log.e(TAG, "Fail to open camera, error code = " + error);
+            mLatch.countDown();
+        }
+
+        public boolean waitForResult() throws InterruptedException {
+            mLatch.await(OPEN_TIMEOUT_SECONDS, TimeUnit.SECONDS);
+            return mResult.get();
+        }
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ContactsTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ContactsTest.java
index faee6dc..77ecfe1 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ContactsTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ContactsTest.java
@@ -28,13 +28,16 @@
 import android.os.Build;
 import android.os.RemoteException;
 import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.Email;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.ContactsContract.CommonDataKinds.Photo;
+import android.provider.ContactsContract.Data;
 import android.provider.ContactsContract.PhoneLookup;
 import android.provider.ContactsContract.RawContacts;
 import android.test.AndroidTestCase;
 
 import java.io.ByteArrayOutputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -44,15 +47,30 @@
 
     private static final String TEST_ACCOUNT_NAME = "CTS";
     private static final String TEST_ACCOUNT_TYPE = "com.android.cts.test";
+    // details of a sample primary contact
     private static final String PRIMARY_CONTACT_DISPLAY_NAME = "Primary";
     private static final String PRIMARY_CONTACT_PHONE = "00000001";
+    private static final String PRIMARY_CONTACT_EMAIL = "one@primary.com";
+    private static final String PRIMARY_CONTACT_SIP = "foo@sip";
+
+    // details of a sample managed contact
     private static final String MANAGED_CONTACT_DISPLAY_NAME = "Managed";
     private static final String MANAGED_CONTACT_PHONE = "6891999";
+    private static final String MANAGED_CONTACT_EMAIL = "one@managed.com";
+    private static final String MANAGED_CONTACT_SIP = "bar@sip";
+
+    // details of a sample primary and a sample managed contact, with the same phone & email
+    private static final String PRIMARY_CONTACT_DISPLAY_NAME_2 = "PrimaryShared";
+    private static final String MANAGED_CONTACT_DISPLAY_NAME_2 = "ManagedShared";
+    private static final String SHARED_CONTACT_PHONE = "00000002";
+    private static final String SHARED_CONTACT_EMAIL = "shared@shared.com";
+    private static final String SHARED_CONTACT_SIP = "baz@sip";
 
     private DevicePolicyManager mDevicePolicyManager;
     private ContentResolver mResolver;
 
-    private static class ContactInfo {
+    private class ContactInfo { // Not static to access outer world.
+
         String contactId;
         String displayName;
         String photoUri;
@@ -68,8 +86,14 @@
             this.photoId = photoId;
         }
 
-        private boolean hasPhotoUri() {
-            return photoUri != null && photoThumbnailUri != null;
+        private void assertNoPhotoUri() {
+            assertNull(photoUri);
+            assertNull(photoThumbnailUri);
+        }
+
+        private void assertPhotoUrisReadable() throws IOException {
+            assertPhotoUriReadable(photoUri);
+            assertPhotoUriReadable(photoThumbnailUri);
         }
 
         private boolean hasPhotoId() {
@@ -85,72 +109,254 @@
                 .getSystemService(Context.DEVICE_POLICY_SERVICE);
     }
 
-    public void testPrimaryProfilePhoneLookup_insertedAndfound() throws RemoteException,
+    public void testPrimaryProfilePhoneAndEmailLookup_insertedAndfound() throws RemoteException,
             OperationApplicationException, NotFoundException, IOException {
         assertFalse(isManagedProfile());
         // Do not insert to primary contact
-        insertContact(PRIMARY_CONTACT_DISPLAY_NAME, PRIMARY_CONTACT_PHONE, 0);
+        insertContact(PRIMARY_CONTACT_DISPLAY_NAME, PRIMARY_CONTACT_PHONE,
+                PRIMARY_CONTACT_EMAIL, PRIMARY_CONTACT_SIP, 0);
 
         ContactInfo contactInfo = getContactInfo(PRIMARY_CONTACT_PHONE);
         assertNotNull(contactInfo);
         assertEquals(PRIMARY_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertFalse(contactInfo.hasPhotoUri());
+        contactInfo.assertNoPhotoUri();
         assertFalse(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
+
+        contactInfo = getContactInfoFromEmail(PRIMARY_CONTACT_EMAIL);
+        assertNotNull(contactInfo);
+        assertEquals(PRIMARY_CONTACT_DISPLAY_NAME, contactInfo.displayName);
+        contactInfo.assertNoPhotoUri();
+        assertFalse(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+
     }
 
-    public void testManagedProfilePhoneLookup_insertedAndfound() throws RemoteException,
+    public void testManagedProfilePhoneAndEmailLookup_insertedAndfound() throws RemoteException,
             OperationApplicationException, NotFoundException, IOException {
         assertTrue(isManagedProfile());
         // Insert ic_contact_picture as photo in managed contact
-        insertContact(MANAGED_CONTACT_DISPLAY_NAME, MANAGED_CONTACT_PHONE,
+        insertContact(MANAGED_CONTACT_DISPLAY_NAME,
+                MANAGED_CONTACT_PHONE,
+                MANAGED_CONTACT_EMAIL,
+                MANAGED_CONTACT_SIP,
                 com.android.cts.managedprofile.R.raw.ic_contact_picture);
 
         ContactInfo contactInfo = getContactInfo(MANAGED_CONTACT_PHONE);
         assertNotNull(contactInfo);
         assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertTrue(contactInfo.hasPhotoUri());
+        contactInfo.assertPhotoUrisReadable();
+        assertTrue(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+
+        contactInfo = getContactInfoFromEmail(MANAGED_CONTACT_EMAIL);
+        assertNotNull(contactInfo);
+        assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
+        contactInfo.assertPhotoUrisReadable();
         assertTrue(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
     }
 
-    public void testPrimaryProfileEnterprisePhoneLookup_canAccessEnterpriseContact() {
+    public void testPrimaryProfileDuplicatedPhoneEmailContact_insertedAndfound() throws
+            RemoteException, OperationApplicationException, NotFoundException, IOException {
+        assertFalse(isManagedProfile());
+        insertContact(PRIMARY_CONTACT_DISPLAY_NAME_2,
+                SHARED_CONTACT_PHONE,
+                SHARED_CONTACT_EMAIL,
+                SHARED_CONTACT_SIP,
+                com.android.cts.managedprofile.R.raw.ic_contact_picture);
+
+        ContactInfo contactInfo = getContactInfo(SHARED_CONTACT_PHONE);
+        assertNotNull(contactInfo);
+        assertEquals(PRIMARY_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
+        contactInfo.assertPhotoUrisReadable();
+        assertTrue(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+
+        contactInfo = getContactInfoFromEmail(SHARED_CONTACT_EMAIL);
+        assertNotNull(contactInfo);
+        assertEquals(PRIMARY_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
+        contactInfo.assertPhotoUrisReadable();
+        assertTrue(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testManagedProfileDuplicatedPhoneEmailContact_insertedAndfound() throws
+            RemoteException, OperationApplicationException, NotFoundException, IOException {
+        assertTrue(isManagedProfile());
+        insertContact(MANAGED_CONTACT_DISPLAY_NAME_2, SHARED_CONTACT_PHONE,
+                SHARED_CONTACT_EMAIL, SHARED_CONTACT_SIP , 0);
+
+        ContactInfo contactInfo = getContactInfo(SHARED_CONTACT_PHONE);
+        assertNotNull(contactInfo);
+        assertEquals(MANAGED_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
+        contactInfo.assertNoPhotoUri();
+        assertFalse(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+
+        contactInfo = getContactInfoFromEmail(SHARED_CONTACT_EMAIL);
+        assertNotNull(contactInfo);
+        assertEquals(MANAGED_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
+        contactInfo.assertNoPhotoUri();
+        assertFalse(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testPrimaryProfileEnterprisePhoneLookup_canAccessEnterpriseContact()
+            throws IOException {
         assertFalse(isManagedProfile());
         ContactInfo contactInfo = getEnterpriseContactInfo(MANAGED_CONTACT_PHONE);
         assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertTrue(contactInfo.hasPhotoUri());
+        contactInfo.assertPhotoUrisReadable();
         // Cannot get photo id in ENTERPRISE_CONTENT_FILTER_URI
         assertFalse(contactInfo.hasPhotoId());
         assertTrue(isEnterpriseContactId(contactInfo.contactId));
     }
 
-    public void testPrimaryProfilePhoneLookup_canAccessPrimaryContact() {
+    public void testPrimaryProfileEnterpriseSipLookup_canAccessEnterpriseContact()
+            throws IOException {
         assertFalse(isManagedProfile());
-        ContactInfo contactInfo = getEnterpriseContactInfo(PRIMARY_CONTACT_PHONE);
-        assertEquals(PRIMARY_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertFalse(contactInfo.hasPhotoUri());
+        ContactInfo contactInfo = getEnterpriseContactInfoFromSipAddress(MANAGED_CONTACT_SIP);
+        assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
+        contactInfo.assertPhotoUrisReadable();
+        assertFalse(contactInfo.hasPhotoId());
+
+        // Quirk: the _id column from the SIP lookup is actually of the data id, not the contact id.
+        // assertTrue(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testPrimaryProfileEnterpriseEmailLookup_canAccessEnterpriseContact()
+            throws IOException {
+        assertFalse(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfoFromEmail(MANAGED_CONTACT_EMAIL);
+        assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
+        contactInfo.assertPhotoUrisReadable();
+        // Cannot get photo id in ENTERPRISE_CONTENT_FILTER_URI
+        assertFalse(contactInfo.hasPhotoId());
+        assertTrue(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testPrimaryProfileEnterprisePhoneLookupDuplicated_canAccessPrimaryContact()
+            throws IOException {
+        assertFalse(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfo(SHARED_CONTACT_PHONE);
+        assertEquals(PRIMARY_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
+        contactInfo.assertPhotoUrisReadable();
+        assertTrue(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testPrimaryProfileEnterpriseEmailLookupDuplicated_canAccessPrimaryContact()
+            throws IOException {
+        assertFalse(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfoFromEmail(SHARED_CONTACT_EMAIL);
+        assertEquals(PRIMARY_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
+        contactInfo.assertPhotoUrisReadable();
+        assertTrue(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testManagedProfileEnterprisePhoneLookupDuplicated_canAccessEnterpriseContact() {
+        assertTrue(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfo(SHARED_CONTACT_PHONE);
+        assertEquals(MANAGED_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
+        contactInfo.assertNoPhotoUri();
         assertFalse(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
     }
 
-    public void testManagedProfilePhoneLookup_canAccessEnterpriseContact() {
+    public void testManagedProfileEnterpriseEmailLookupDuplicated_canAccessEnterpriseContact() {
         assertTrue(isManagedProfile());
-        ContactInfo contactInfo = getEnterpriseContactInfo(MANAGED_CONTACT_PHONE);
-        assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
-        assertTrue(contactInfo.hasPhotoUri());
-        assertTrue(contactInfo.hasPhotoId());
+        ContactInfo contactInfo = getEnterpriseContactInfoFromEmail(SHARED_CONTACT_EMAIL);
+        assertEquals(MANAGED_CONTACT_DISPLAY_NAME_2, contactInfo.displayName);
+        contactInfo.assertNoPhotoUri();
+        assertFalse(contactInfo.hasPhotoId());
         assertFalse(isEnterpriseContactId(contactInfo.contactId));
     }
 
     public void testPrimaryProfilePhoneLookup_canNotAccessEnterpriseContact() {
         assertFalse(isManagedProfile());
+        ContactInfo contactInfo = getContactInfo(MANAGED_CONTACT_PHONE);
+        assertNull(contactInfo);
+    }
+
+    public void testPrimaryProfileEmailLookup_canNotAccessEnterpriseContact() {
+        assertFalse(isManagedProfile());
+        ContactInfo contactInfo = getContactInfoFromEmail(MANAGED_CONTACT_EMAIL);
+        assertNull(contactInfo);
+    }
+
+    public void testPrimaryProfileEnterprisePhoneLookup_canAccessPrimaryContact() {
+        assertFalse(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfo(PRIMARY_CONTACT_PHONE);
+        assertEquals(PRIMARY_CONTACT_DISPLAY_NAME, contactInfo.displayName);
+        contactInfo.assertNoPhotoUri();
+        assertFalse(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testPrimaryProfileEnterpriseEmailLookup_canAccessPrimaryContact() {
+        assertFalse(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfoFromEmail(PRIMARY_CONTACT_EMAIL);
+        assertEquals(PRIMARY_CONTACT_DISPLAY_NAME, contactInfo.displayName);
+        contactInfo.assertNoPhotoUri();
+        assertFalse(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testManagedProfileEnterprisePhoneLookup_canAccessEnterpriseContact()
+            throws IOException {
+        assertTrue(isManagedProfile());
         ContactInfo contactInfo = getEnterpriseContactInfo(MANAGED_CONTACT_PHONE);
+        assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
+        contactInfo.assertPhotoUrisReadable();
+        assertTrue(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testManagedProfileEnterpriseEmailLookup_canAccessEnterpriseContact()
+            throws IOException {
+        assertTrue(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfoFromEmail(MANAGED_CONTACT_EMAIL);
+        assertEquals(MANAGED_CONTACT_DISPLAY_NAME, contactInfo.displayName);
+        contactInfo.assertPhotoUrisReadable();
+        assertTrue(contactInfo.hasPhotoId());
+        assertFalse(isEnterpriseContactId(contactInfo.contactId));
+    }
+
+    public void testManagedProfileEnterprisePhoneLookup_canNotAccessPrimaryContact() {
+        assertTrue(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfo(PRIMARY_CONTACT_PHONE);
+        assertNull(contactInfo);
+    }
+
+    public void testManagedProfileEnterpriseEmailLookup_canNotAccessPrimaryContact() {
+        assertTrue(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfoFromEmail(PRIMARY_CONTACT_EMAIL);
         assertNull(contactInfo);
     }
 
     public void testManagedProfilePhoneLookup_canNotAccessPrimaryContact() {
         assertTrue(isManagedProfile());
-        ContactInfo contactInfo = getEnterpriseContactInfo(PRIMARY_CONTACT_PHONE);
+        ContactInfo contactInfo = getContactInfo(PRIMARY_CONTACT_PHONE);
+        assertNull(contactInfo);
+    }
+
+    public void testManagedProfileEmailLookup_canNotAccessPrimaryContact() {
+        assertTrue(isManagedProfile());
+        ContactInfo contactInfo = getContactInfoFromEmail(PRIMARY_CONTACT_EMAIL);
+        assertNull(contactInfo);
+    }
+
+    public void testPrimaryProfileEnterpriseEmailLookup_canNotAccessEnterpriseContact() {
+        assertFalse(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfoFromEmail(MANAGED_CONTACT_EMAIL);
+        assertNull(contactInfo);
+    }
+
+    public void testPrimaryProfileEnterprisePhoneLookup_canNotAccessEnterpriseContact() {
+        assertFalse(isManagedProfile());
+        ContactInfo contactInfo = getEnterpriseContactInfo(MANAGED_CONTACT_PHONE);
         assertNull(contactInfo);
     }
 
@@ -170,14 +376,25 @@
         removeAllTestContactsInProfile();
     }
 
+    public void testSetBluetoothContactSharingDisabled_setterAndGetter() {
+        mDevicePolicyManager.setBluetoothContactSharingDisabled(
+                BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT, false);
+        assertFalse(mDevicePolicyManager.getBluetoothContactSharingDisabled(
+                BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT));
+        mDevicePolicyManager.setBluetoothContactSharingDisabled(
+                BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT, true);
+        assertTrue(mDevicePolicyManager.getBluetoothContactSharingDisabled(
+                BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT));
+    }
+
     private boolean isManagedProfile() {
         String adminPackage = BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT.getPackageName();
         return mDevicePolicyManager.isProfileOwnerApp(adminPackage);
     }
 
-    private void insertContact(String displayName, String phoneNumber, int photoResId)
-            throws RemoteException,
-            OperationApplicationException, NotFoundException, IOException {
+    private void insertContact(String displayName, String phoneNumber, String email,
+            String sipAddress, int photoResId)
+            throws RemoteException, OperationApplicationException, NotFoundException, IOException {
         ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
         ops.add(ContentProviderOperation
                 .newInsert(ContactsContract.RawContacts.CONTENT_URI)
@@ -205,25 +422,61 @@
                 .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
                         Phone.TYPE_MOBILE)
                 .build());
+        ops.add(ContentProviderOperation
+                .newInsert(ContactsContract.Data.CONTENT_URI)
+                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
+                .withValue(
+                        ContactsContract.Data.MIMETYPE,
+                        ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
+                .withValue(ContactsContract.CommonDataKinds.Email.ADDRESS,
+                        email)
+                .withValue(ContactsContract.CommonDataKinds.Email.TYPE,
+                        Email.TYPE_WORK)
+                .build());
+        ops.add(ContentProviderOperation
+                .newInsert(ContactsContract.Data.CONTENT_URI)
+                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
+                .withValue(
+                        ContactsContract.Data.MIMETYPE,
+                        ContactsContract.CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE)
+                .withValue(ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS,
+                        sipAddress)
+                .withValue(ContactsContract.CommonDataKinds.SipAddress.TYPE,
+                        ContactsContract.CommonDataKinds.SipAddress.TYPE_WORK)
+                .build());
+
         if (photoResId != 0) {
             InputStream phoneInputStream = mContext.getResources().openRawResource(photoResId);
-            byte[] rawPhoto = getByteFromStream(phoneInputStream);
-            ops.add(ContentProviderOperation
-                    .newInsert(ContactsContract.Data.CONTENT_URI)
-                    .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
-                    .withValue(
-                            ContactsContract.Data.MIMETYPE,
-                            ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
-                    .withValue(Photo.PHOTO, rawPhoto)
-                    .build());
+            try {
+                byte[] rawPhoto = getByteFromStream(phoneInputStream);
+                ops.add(ContentProviderOperation
+                        .newInsert(ContactsContract.Data.CONTENT_URI)
+                        .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
+                        .withValue(
+                                ContactsContract.Data.MIMETYPE,
+                                ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
+                        .withValue(Photo.PHOTO, rawPhoto)
+                        .build());
+            } finally {
+                phoneInputStream.close();
+            }
         }
 
         mResolver.applyBatch(ContactsContract.AUTHORITY, ops);
     }
 
     private ContactInfo getContactInfoFromUri(Uri phoneLookupUri, String phoneNumber) {
-        Uri uri = Uri.withAppendedPath(phoneLookupUri,
-                Uri.encode(phoneNumber));
+        return getContactInfoFromPhoneLookup(Uri.withAppendedPath(phoneLookupUri,
+                        Uri.encode(phoneNumber)), /* forSip =*/ false);
+    }
+
+    private ContactInfo getContactInfoFromSipUri(Uri phoneLookupUri, String sipAddress) {
+        return getContactInfoFromPhoneLookup(
+                phoneLookupUri.buildUpon().appendEncodedPath(sipAddress).appendQueryParameter(
+                        PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS, "1").build(), /* forSip =*/ true);
+    }
+
+    private ContactInfo getContactInfoFromPhoneLookup(Uri uri, boolean isForSip) {
         Cursor cursor = mResolver.query(uri,
                 new String[] {
                         PhoneLookup._ID, PhoneLookup.DISPLAY_NAME, PhoneLookup.PHOTO_URI,
@@ -245,17 +498,61 @@
         return result;
     }
 
+    private ContactInfo getContactInfoFromEmailUri(Uri emailLookupUri, String email) {
+        Uri uri = Uri.withAppendedPath(emailLookupUri, Uri.encode(email));
+        Cursor cursor = mResolver.query(uri,
+                new String[] {
+                        Email.CONTACT_ID,
+                        Email.DISPLAY_NAME_PRIMARY,
+                        Email.PHOTO_URI,
+                        Email.PHOTO_ID,
+                        Email.PHOTO_THUMBNAIL_URI,
+                }, null, null, null);
+        if (cursor == null) {
+            return null;
+        }
+        ContactInfo result = null;
+        if (cursor.moveToFirst()) {
+            result = new ContactInfo(
+                    cursor.getString(cursor.getColumnIndexOrThrow(
+                        Email.CONTACT_ID)),
+                    cursor.getString(cursor.getColumnIndexOrThrow(
+                        Email.DISPLAY_NAME_PRIMARY)),
+                    cursor.getString(cursor.getColumnIndexOrThrow(
+                        Email.PHOTO_URI)),
+                    cursor.getString(cursor.getColumnIndexOrThrow(
+                        Email.PHOTO_THUMBNAIL_URI)),
+                    cursor.getString(cursor.getColumnIndexOrThrow(
+                        Email.PHOTO_ID)));
+        }
+        cursor.close();
+        return result;
+    }
+
     private ContactInfo getContactInfo(String phoneNumber) {
         return getContactInfoFromUri(PhoneLookup.CONTENT_FILTER_URI,
                 phoneNumber);
     }
 
+    private ContactInfo getContactInfoFromEmail(String email) {
+        return getContactInfoFromEmailUri(Email.CONTENT_LOOKUP_URI, email);
+    }
+
     private ContactInfo getEnterpriseContactInfo(String phoneNumber) {
         return getContactInfoFromUri(
                 PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI,
                 phoneNumber);
     }
 
+    private ContactInfo getEnterpriseContactInfoFromSipAddress(String phoneNumber) {
+        return getContactInfoFromSipUri(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI,
+                phoneNumber);
+    }
+
+    private ContactInfo getEnterpriseContactInfoFromEmail(String email) {
+        return getContactInfoFromEmailUri(Email.ENTERPRISE_CONTENT_LOOKUP_URI, email);
+    }
+
     private void removeAllTestContactsInProfile() {
         ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
         ops.add(ContentProviderOperation.newDelete(RawContacts.CONTENT_URI)
@@ -282,4 +579,18 @@
     private boolean isEnterpriseContactId(String contactId) {
         return ContactsContract.Contacts.isEnterpriseContactId(Long.valueOf(contactId));
     }
+
+    private void assertPhotoUriReadable(String uri) throws IOException {
+        assertNotNull(uri);
+        final InputStream is = mResolver.openInputStream(Uri.parse(uri));
+        try {
+            // Make sure it's readabe.  Don't have to read all content.
+            is.read();
+        } finally {
+            try {
+                is.close();
+            } catch (IOException ignore) {
+            }
+        }
+    }
 }
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileUtils.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileUtils.java
index 49001e9..6a63cea 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileUtils.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileUtils.java
@@ -20,9 +20,16 @@
 
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
+import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
 import android.os.UserManager;
 import android.test.AndroidTestCase;
+import android.util.Log;
+
+import java.util.List;
 
 /**
  * The methods in this class are not really tests.
@@ -31,6 +38,8 @@
  * device-side methods from the host.
  */
 public class CrossProfileUtils extends AndroidTestCase {
+    private static final String TAG = "CrossProfileUtils";
+
     private static final String ACTION_READ_FROM_URI = "com.android.cts.action.READ_FROM_URI";
 
     private static final String ACTION_WRITE_TO_URI = "com.android.cts.action.WRITE_TO_URI";
@@ -40,8 +49,8 @@
 
     private static String ACTION_COPY_TO_CLIPBOARD = "com.android.cts.action.COPY_TO_CLIPBOARD";
 
-    public void addParentCanAccessManagedFilters() {
-        removeAllFilters();
+    public void testAddParentCanAccessManagedFilters() {
+        testRemoveAllFilters();
 
         final DevicePolicyManager dpm = (DevicePolicyManager) getContext().getSystemService(
                 Context.DEVICE_POLICY_SERVICE);
@@ -49,8 +58,8 @@
                 DevicePolicyManager.FLAG_PARENT_CAN_ACCESS_MANAGED);
     }
 
-    public void addManagedCanAccessParentFilters() {
-        removeAllFilters();
+    public void testAddManagedCanAccessParentFilters() {
+        testRemoveAllFilters();
 
         final DevicePolicyManager dpm = (DevicePolicyManager) getContext().getSystemService(
                 Context.DEVICE_POLICY_SERVICE);
@@ -67,23 +76,37 @@
         return intentFilter;
     }
 
-    public void removeAllFilters() {
+    public void testRemoveAllFilters() {
         final DevicePolicyManager dpm = (DevicePolicyManager) getContext().getSystemService(
                 Context.DEVICE_POLICY_SERVICE);
         dpm.clearCrossProfileIntentFilters(ADMIN_RECEIVER_COMPONENT);
     }
 
-    public void disallowCrossProfileCopyPaste() {
+    public void testDisallowCrossProfileCopyPaste() {
         DevicePolicyManager dpm = (DevicePolicyManager)
                getContext().getSystemService(Context.DEVICE_POLICY_SERVICE);
         dpm.addUserRestriction(ADMIN_RECEIVER_COMPONENT,
                 UserManager.DISALLOW_CROSS_PROFILE_COPY_PASTE);
     }
 
-    public void allowCrossProfileCopyPaste() {
+    public void testAllowCrossProfileCopyPaste() {
         DevicePolicyManager dpm = (DevicePolicyManager)
                getContext().getSystemService(Context.DEVICE_POLICY_SERVICE);
         dpm.clearUserRestriction(ADMIN_RECEIVER_COMPONENT,
                 UserManager.DISALLOW_CROSS_PROFILE_COPY_PASTE);
     }
+
+    // Disables all browsers in current user
+    public void testDisableAllBrowsers() {
+        PackageManager pm = (PackageManager) getContext().getPackageManager();
+        DevicePolicyManager dpm = (DevicePolicyManager)
+               getContext().getSystemService(Context.DEVICE_POLICY_SERVICE);
+        Intent webIntent = new Intent(Intent.ACTION_VIEW);
+        webIntent.setData(Uri.parse("http://com.android.cts.intent.receiver"));
+        List<ResolveInfo> ris = pm.queryIntentActivities(webIntent, 0 /* no flags*/);
+        for (ResolveInfo ri : ris) {
+            Log.d(TAG, "Hiding " + ri.activityInfo.packageName);
+            dpm.setApplicationHidden(ADMIN_RECEIVER_COMPONENT, ri.activityInfo.packageName, true);
+        }
+    }
 }
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileWidgetPrimaryUserTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileWidgetPrimaryUserTest.java
new file mode 100644
index 0000000..bb1640b
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileWidgetPrimaryUserTest.java
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.managedprofile;
+
+import android.app.Instrumentation;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Messenger;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * This class contains tests for cross profile widget providers that are run on the primary users.
+ * The tests connect to a {@link android.appwidget.AppWidgetHost} and check whether the cross
+ * cross-profile widget can / cannot be found from the primary user.
+ * The tests cannot be run independently, but are part of one hostside test.
+ */
+public class CrossProfileWidgetPrimaryUserTest extends AndroidTestCase {
+    private static final String TAG = "CrossProfileWidgetPrimaryUserTest";
+
+    private static final int MSG_RESULT = 0;
+    private static final int MSG_PROVIDER_PRESENT = 1;
+    private static final int MSG_PROVIDER_UPDATES = 2;
+
+    private static final int RESULT_UNKNOWN = 0;
+    private static final int RESULT_PRESENT = 1;
+    private static final int RESULT_NOTPRESENT = 2;
+    private static final int RESULT_INTERRUPTED = 3;
+    private static final int RESULT_TIMEOUT = 4;
+
+    private static final String PACKAGE_EXTRA = "package-extra";
+
+    private Messenger mService;
+    private Connection mConnection;
+    private Result mResult;
+    private Messenger mResultMessenger;
+
+    @Override
+    protected void setUp() throws Exception {
+        final Intent intent = new Intent();
+        intent.setComponent(new ComponentName(CrossProfileWidgetTest.WIDGET_PROVIDER_PKG,
+                CrossProfileWidgetTest.WIDGET_PROVIDER_PKG + ".SimpleAppWidgetHostService"));
+        mConnection = new Connection();
+        getContext().bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
+        mConnection.waitForService();
+        mResult = new Result(Looper.getMainLooper());
+        mResultMessenger = new Messenger(mResult);
+    }
+
+    public void testHasCrossProfileWidgetProvider_false() throws Exception {
+        int result = sendMessageToCallbacksService(MSG_PROVIDER_PRESENT,
+                CrossProfileWidgetTest.WIDGET_PROVIDER_PKG);
+        assertEquals(RESULT_NOTPRESENT, result);
+    }
+
+    public void testHostReceivesWidgetUpdates_false() throws Exception {
+        int result = sendMessageToCallbacksService(MSG_PROVIDER_UPDATES,
+                CrossProfileWidgetTest.WIDGET_PROVIDER_PKG);
+        assertEquals(RESULT_NOTPRESENT, result);
+    }
+
+    public void testHasCrossProfileWidgetProvider_true() throws Exception {
+        int result = sendMessageToCallbacksService(MSG_PROVIDER_PRESENT,
+                CrossProfileWidgetTest.WIDGET_PROVIDER_PKG);
+        assertEquals(RESULT_PRESENT, result);
+    }
+
+    public void testHostReceivesWidgetUpdates_true() throws Exception {
+        int result = sendMessageToCallbacksService(MSG_PROVIDER_UPDATES,
+                CrossProfileWidgetTest.WIDGET_PROVIDER_PKG);
+        assertEquals(RESULT_PRESENT, result);
+    }
+
+    private int sendMessageToCallbacksService(int msg, String packageName)
+            throws Exception {
+        Bundle params = new Bundle();
+        params.putString(PACKAGE_EXTRA, packageName);
+
+        Message message = Message.obtain(null, msg, params);
+        message.replyTo = mResultMessenger;
+
+        mService.send(message);
+
+        return mResult.waitForResult();
+    }
+
+    private static class Result extends Handler {
+
+        private final Semaphore mSemaphore = new Semaphore(0);
+        public int result = 0;
+
+        public Result(Looper looper) {
+            super(looper);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            if (msg.what == MSG_RESULT) {
+                result = msg.arg1;
+                mSemaphore.release();
+            } else {
+                super.handleMessage(msg);
+            }
+        }
+
+        public int waitForResult() {
+            try {
+                if (mSemaphore.tryAcquire(120, TimeUnit.SECONDS)) {
+                    return result;
+                }
+            } catch (InterruptedException e) {
+                Log.e(TAG, "Interrupted when talking to service", e);
+            }
+            return RESULT_TIMEOUT;
+        }
+    }
+
+    private class Connection implements ServiceConnection {
+        private final Semaphore mSemaphore = new Semaphore(0);
+
+        @Override
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            mService = new Messenger(service);
+            mSemaphore.release();
+        }
+
+        @Override
+        public void onServiceDisconnected(ComponentName className) {
+            mService = null;
+        }
+
+        public void waitForService() {
+            try {
+                if (mSemaphore.tryAcquire(5, TimeUnit.SECONDS)) {
+                    return;
+                }
+            } catch (InterruptedException e) {
+                Log.e(TAG, "Interrupted when connecting to service", e);
+            }
+            fail("failed to connect to service");
+        }
+    };
+
+}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileWidgetTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileWidgetTest.java
new file mode 100644
index 0000000..085d56f
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileWidgetTest.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.managedprofile;
+
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProviderInfo;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Process;
+import android.os.UserHandle;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * This class contains tests for cross profile widget providers that are run on the managed
+ * profile. Policies are set using {@link SetPolicyActivity} and then verified in these tests.
+ * The tests cannot be run independently, but are part of one hostside test.
+ */
+public class CrossProfileWidgetTest extends BaseManagedProfileTest {
+    static final String WIDGET_PROVIDER_PKG = "com.android.cts.widgetprovider";
+
+    private AppWidgetManager mAppWidgetManager;
+
+    public void setUp() throws Exception {
+        super.setUp();
+        mAppWidgetManager = (AppWidgetManager) mContext.getSystemService(Context.APPWIDGET_SERVICE);
+    }
+
+    /**
+     * This test checks that the widget provider was successfully whitelisted and verifies that
+     * if was added successfully and can be found inside the profile.
+     */
+    public void testCrossProfileWidgetProviderAdded() {
+        List<String> providers = mDevicePolicyManager.getCrossProfileWidgetProviders(
+                ADMIN_RECEIVER_COMPONENT);
+        assertEquals(1, providers.size());
+        assertTrue(providers.contains(WIDGET_PROVIDER_PKG));
+        // check that widget can be found inside the profile
+        assertTrue(containsWidgetProviderPkg(mAppWidgetManager.getInstalledProviders()));
+    }
+
+    /**
+     * This test verifies that the widget provider was successfully removed from the whitelist.
+     */
+    public void testCrossProfileWidgetProviderRemoved() {
+        List<String> providers = mDevicePolicyManager.getCrossProfileWidgetProviders(
+                ADMIN_RECEIVER_COMPONENT);
+        assertTrue(providers.isEmpty());
+        // check that widget can still be found inside the profile
+        // This does not currently work correctly: http://b/issues/21180997
+        // assertTrue(containsWidgetProviderPkg(mAppWidgetManager.getInstalledProviders()));
+    }
+
+    private boolean containsWidgetProviderPkg(List<AppWidgetProviderInfo> widgets) {
+        for (AppWidgetProviderInfo widget : widgets) {
+            if (WIDGET_PROVIDER_PKG.equals(widget.provider.getPackageName())) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/DelegatedCertInstallerTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/DelegatedCertInstallerTest.java
new file mode 100644
index 0000000..de859b4
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/DelegatedCertInstallerTest.java
@@ -0,0 +1,293 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.managedprofile;
+
+import android.app.KeyguardManager;
+import android.app.admin.DevicePolicyManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.security.KeyChain;
+import android.security.KeyChainException;
+import android.test.AndroidTestCase;
+import android.util.Base64;
+import android.util.Base64InputStream;
+
+import java.io.ByteArrayInputStream;
+import java.security.KeyFactory;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+import static com.android.cts.managedprofile.BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT;
+
+/**
+ * Exercise delegated cert installer APIs in {@link DevicePolicyManager} by setting the test app
+ * (CtsCertInstallerApp) as a delegated cert installer and then asking it to invoke various
+ * cert-related APIs. The expected certificate changes are validated both remotely and locally.
+ */
+public class DelegatedCertInstallerTest extends AndroidTestCase {
+
+    private static final String CERT_INSTALLER_PACKAGE = "com.android.cts.certinstaller";
+
+    private static final String ACTION_INSTALL_CERT = "com.android.cts.certinstaller.install_cert";
+    private static final String ACTION_REMOVE_CERT = "com.android.cts.certinstaller.remove_cert";
+    private static final String ACTION_VERIFY_CERT = "com.android.cts.certinstaller.verify_cert";
+    private static final String ACTION_INSTALL_KEYPAIR =
+            "com.android.cts.certinstaller.install_keypair";
+    private static final String ACTION_CERT_OPERATION_DONE = "com.android.cts.certinstaller.done";
+
+    private static final String EXTRA_CERT_DATA = "extra_cert_data";
+    private static final String EXTRA_KEY_DATA = "extra_key_data";
+    private static final String EXTRA_KEY_ALIAS = "extra_key_alias";
+    private static final String EXTRA_RESULT_VALUE = "extra_result_value";
+    private static final String EXTRA_RESULT_EXCEPTION = "extra_result_exception";
+
+    /*
+     * The CA and keypair below are generated with:
+     *
+     * openssl req -new -x509 -days 3650 -extensions v3_ca -keyout cakey.pem -out cacert.pem
+     * openssl req -newkey rsa:1024 -keyout userkey.pem -nodes -days 3650 -out userkey.req
+     * mkdir -p demoCA/newcerts
+     * touch demoCA/index.txt
+     * echo "01" > demoCA/serial
+     * openssl ca -out usercert.pem -in userkey.req -cert cacert.pem -keyfile cakey.pem -days 3650
+     */
+
+     // Content from cacert.pem
+    private static final String TEST_CA =
+            "-----BEGIN CERTIFICATE-----\n" +
+            "MIIDXTCCAkWgAwIBAgIJAK9Tl/F9V8kSMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV\n" +
+            "BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX\n" +
+            "aWRnaXRzIFB0eSBMdGQwHhcNMTUwMzA2MTczMjExWhcNMjUwMzAzMTczMjExWjBF\n" +
+            "MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50\n" +
+            "ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\n" +
+            "CgKCAQEAvItOutsE75WBTgTyNAHt4JXQ3JoseaGqcC3WQij6vhrleWi5KJ0jh1/M\n" +
+            "Rpry7Fajtwwb4t8VZa0NuM2h2YALv52w1xivql88zce/HU1y7XzbXhxis9o6SCI+\n" +
+            "oVQSbPeXRgBPppFzBEh3ZqYTVhAqw451XhwdA4Aqs3wts7ddjwlUzyMdU44osCUg\n" +
+            "kVg7lfPf9sTm5IoHVcfLSCWH5n6Nr9sH3o2ksyTwxuOAvsN11F/a0mmUoPciYPp+\n" +
+            "q7DzQzdi7akRG601DZ4YVOwo6UITGvDyuAAdxl5isovUXqe6Jmz2/myTSpAKxGFs\n" +
+            "jk9oRoG6WXWB1kni490GIPjJ1OceyQIDAQABo1AwTjAdBgNVHQ4EFgQUH1QIlPKL\n" +
+            "p2OQ/AoLOjKvBW4zK3AwHwYDVR0jBBgwFoAUH1QIlPKLp2OQ/AoLOjKvBW4zK3Aw\n" +
+            "DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAcMi4voMMJHeQLjtq8Oky\n" +
+            "Azpyk8moDwgCd4llcGj7izOkIIFqq/lyqKdtykVKUWz2bSHO5cLrtaOCiBWVlaCV\n" +
+            "DYAnnVLM8aqaA6hJDIfaGs4zmwz0dY8hVMFCuCBiLWuPfiYtbEmjHGSmpQTG6Qxn\n" +
+            "ZJlaK5CZyt5pgh5EdNdvQmDEbKGmu0wpCq9qjZImwdyAul1t/B0DrsWApZMgZpeI\n" +
+            "d2od0VBrCICB1K4p+C51D93xyQiva7xQcCne+TAnGNy9+gjQ/MyR8MRpwRLv5ikD\n" +
+            "u0anJCN8pXo6IMglfMAsoton1J6o5/ae5uhC6caQU8bNUsCK570gpNfjkzo6rbP0\n" +
+            "wQ==\n" +
+            "-----END CERTIFICATE-----";
+    // Content from userkey.pem without the private key header and footer.
+    private static final String TEST_KEY =
+            "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALCYprGsTU+5L3KM\n" +
+            "fhkm0gXM2xjGUH+543YLiMPGVr3eVS7biue1/tQlL+fJsw3rqsPKJe71RbVWlpqU\n" +
+            "mhegxG4s3IvGYVB0KZoRIjDKmnnvlx6nngL2ZJ8O27U42pHsw4z4MKlcQlWkjL3T\n" +
+            "9sV6zW2Wzri+f5mvzKjhnArbLktHAgMBAAECgYBlfVVPhtZnmuXJzzQpAEZzTugb\n" +
+            "tN1OimZO0RIocTQoqj4KT+HkiJOLGFQPwbtFpMre+q4SRqNpM/oZnI1yRtKcCmIc\n" +
+            "mZgkwJ2k6pdSxqO0ofxFFTdT9czJ3rCnqBHy1g6BqUQFXT4olcygkxUpKYUwzlz1\n" +
+            "oAl487CoPxyr4sVEAQJBANwiUOHcdGd2RoRILDzw5WOXWBoWPOKzX/K9wt0yL+mO\n" +
+            "wlFNFSymqo9eLheHcEq/VD9qK9rT700dCewJfWj6+bECQQDNXmWNYIxGii5NJilT\n" +
+            "OBOHiMD/F0NE178j+/kmacbhDJwpkbLYXaP8rW4+Iswrm4ORJ59lvjNuXaZ28+sx\n" +
+            "fFp3AkA6Z7Bl/IO135+eATgbgx6ZadIqObQ1wbm3Qbmtzl7/7KyJvZXcnuup1icM\n" +
+            "fxa//jtwB89S4+Ad6ZJ0WaA4dj5BAkEAuG7V9KmIULE388EZy8rIfyepa22Q0/qN\n" +
+            "hdt8XasRGHsio5Jdc0JlSz7ViqflhCQde/aBh/XQaoVgQeO8jKyI8QJBAJHekZDj\n" +
+            "WA0w1RsBVVReN1dVXgjm1CykeAT8Qx8TUmBUfiDX6w6+eGQjKtS7f4KC2IdRTV6+\n" +
+            "bDzDoHBChHNC9ms=\n";
+
+    // Content from usercert.pem without the header and footer.
+    private static final String TEST_CERT =
+            "MIIDEjCCAfqgAwIBAgIBATANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJBVTET\n" +
+            "MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ\n" +
+            "dHkgTHRkMB4XDTE1MDUwMTE2NTQwNVoXDTI1MDQyODE2NTQwNVowWzELMAkGA1UE\n" +
+            "BhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdp\n" +
+            "ZGdpdHMgUHR5IEx0ZDEUMBIGA1UEAwwLY2xpZW50IGNlcnQwgZ8wDQYJKoZIhvcN\n" +
+            "AQEBBQADgY0AMIGJAoGBALCYprGsTU+5L3KMfhkm0gXM2xjGUH+543YLiMPGVr3e\n" +
+            "VS7biue1/tQlL+fJsw3rqsPKJe71RbVWlpqUmhegxG4s3IvGYVB0KZoRIjDKmnnv\n" +
+            "lx6nngL2ZJ8O27U42pHsw4z4MKlcQlWkjL3T9sV6zW2Wzri+f5mvzKjhnArbLktH\n" +
+            "AgMBAAGjezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2Vu\n" +
+            "ZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBQ8GL+jKSarvTn9fVNA2AzjY7qq\n" +
+            "gjAfBgNVHSMEGDAWgBRzBBA5sNWyT/fK8GrhN3tOqO5tgjANBgkqhkiG9w0BAQsF\n" +
+            "AAOCAQEAgwQEd2bktIDZZi/UOwU1jJUgGq7NiuBDPHcqgzjxhGFLQ8SQAAP3v3PR\n" +
+            "mLzcfxsxnzGynqN5iHQT4rYXxxaqrp1iIdj9xl9Wl5FxjZgXITxhlRscOd/UOBvG\n" +
+            "oMrazVczjjdoRIFFnjtU3Jf0Mich68HD1Z0S3o7X6sDYh6FTVR5KbLcxbk6RcoG4\n" +
+            "VCI5boR5LUXgb5Ed5UxczxvN12S71fyxHYVpuuI0z0HTIbAxKeRw43I6HWOmR1/0\n" +
+            "G6byGCNL/1Fz7Y+264fGqABSNTKdZwIU2K4ANEH7F+9scnhoO6OBp+gjBe5O+7jb\n" +
+            "wZmUCAoTka4hmoaOCj7cqt/IkmxozQ==\n";
+
+    private DevicePolicyManager mDpm;
+    private volatile boolean mReceivedResult;
+    private volatile Exception mReceivedException;
+    private Semaphore mAvailableResultSemaphore;
+
+    private final BroadcastReceiver receiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (ACTION_CERT_OPERATION_DONE.equals(intent.getAction())) {
+                synchronized (DelegatedCertInstallerTest.this) {
+                    mReceivedResult = intent.getBooleanExtra(EXTRA_RESULT_VALUE, false);
+                    mReceivedException =
+                            (Exception) intent.getSerializableExtra(EXTRA_RESULT_EXCEPTION);
+                    mAvailableResultSemaphore.release();
+                }
+            }
+        }
+    };
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        mDpm = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
+        mAvailableResultSemaphore = new Semaphore(0);
+        mReceivedResult = false;
+        mReceivedException = null;
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(ACTION_CERT_OPERATION_DONE);
+        getContext().registerReceiver(receiver, filter);
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        getContext().unregisterReceiver(receiver);
+        mDpm.uninstallCaCert(ADMIN_RECEIVER_COMPONENT, TEST_CA.getBytes());
+        // Installed private key pair will be removed once the lockscreen password is cleared,
+        // which is done in the hostside test.
+        mDpm.setCertInstallerPackage(ADMIN_RECEIVER_COMPONENT, null);
+        super.tearDown();
+    }
+
+    public void testCaCertsOperations() throws InterruptedException {
+        byte[] cert = TEST_CA.getBytes();
+
+        mDpm.setCertInstallerPackage(ADMIN_RECEIVER_COMPONENT, CERT_INSTALLER_PACKAGE);
+        assertEquals(CERT_INSTALLER_PACKAGE,
+                mDpm.getCertInstallerPackage(ADMIN_RECEIVER_COMPONENT));
+
+        // Exercise installCaCert()
+        installCaCert(cert);
+        assertResult("installCaCert", true);
+        assertTrue("Certificate is not installed properly", mDpm.hasCaCertInstalled(
+                ADMIN_RECEIVER_COMPONENT, cert));
+
+        // Exercise getInstalledCaCerts()
+        verifyCaCert(cert);
+        assertResult("getInstalledCaCerts()", true);
+
+        // Exercise uninstallCaCert()
+        removeCaCert(cert);
+        assertResult("uninstallCaCert()", true);
+        assertFalse("Certificate is not removed properly", mDpm.hasCaCertInstalled(
+                ADMIN_RECEIVER_COMPONENT, cert));
+
+        // Clear delegated cert installer.
+        // Tests after this are expected to fail.
+        mDpm.setCertInstallerPackage(ADMIN_RECEIVER_COMPONENT, null);
+
+        installCaCert(cert);
+        assertResult("installCaCert", false);
+    }
+
+    public void testInstallKeyPair() throws InterruptedException, KeyChainException {
+        final String alias = "delegated-cert-installer-test-key";
+
+        // Clear delegated cert installer.
+        mDpm.setCertInstallerPackage(ADMIN_RECEIVER_COMPONENT, null);
+        // The app is not the cert installer , it shouldn't have have privilege to call
+        // installKeyPair().
+        installKeyPair(TEST_KEY, TEST_CERT, alias);
+        assertResult("installKeyPair", false);
+
+        // Set the app to be cert installer.
+        mDpm.setCertInstallerPackage(ADMIN_RECEIVER_COMPONENT, CERT_INSTALLER_PACKAGE);
+        assertEquals(CERT_INSTALLER_PACKAGE,
+                mDpm.getCertInstallerPackage(ADMIN_RECEIVER_COMPONENT));
+
+        // Exercise installKeyPair()
+        checkKeyguardPrecondition();
+        installKeyPair(TEST_KEY, TEST_CERT, alias);
+        assertResult("installKeyPair", true);
+    }
+
+    /**
+     * installKeyPair() requires the system to have a lockscreen password, which should have been
+     * set by the host side test.
+     */
+    private void checkKeyguardPrecondition() throws InterruptedException {
+        KeyguardManager km = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
+        if (!km.isKeyguardSecure()) {
+            Thread.sleep(5000);
+          }
+          assertTrue("A lockscreen password is required before keypair can be installed",
+                          km.isKeyguardSecure());
+    }
+
+    private void installCaCert(byte[] cert) {
+        Intent intent = new Intent();
+        intent.setAction(ACTION_INSTALL_CERT);
+        intent.putExtra(EXTRA_CERT_DATA, cert);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        getContext().startActivity(intent);
+    }
+
+    private void removeCaCert(byte[] cert) {
+        Intent intent = new Intent();
+        intent.setAction(ACTION_REMOVE_CERT);
+        intent.putExtra(EXTRA_CERT_DATA, cert);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        getContext().startActivity(intent);
+    }
+
+    private void verifyCaCert(byte[] cert) {
+        Intent intent = new Intent();
+        intent.setAction(ACTION_VERIFY_CERT);
+        intent.putExtra(EXTRA_CERT_DATA, cert);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        getContext().startActivity(intent);
+    }
+
+    private void assertResult(String testName, Boolean expectSuccess) throws InterruptedException {
+        assertTrue("Cert installer did not respond in time.",
+                mAvailableResultSemaphore.tryAcquire(5, TimeUnit.SECONDS));
+        synchronized (this) {
+            if (expectSuccess) {
+                assertTrue(testName + " failed unexpectedly.", mReceivedResult);
+                assertNull(testName + " raised exception", mReceivedException);
+            } else {
+                assertFalse(testName + " succeeded unexpectedly.", mReceivedResult);
+                assertTrue(testName + " did not raise SecurityException",
+                        mReceivedException != null &&
+                        mReceivedException instanceof SecurityException);
+            }
+        }
+    }
+
+    private void installKeyPair(String key, String cert, String alias) {
+        Intent intent = new Intent();
+        intent.setAction(ACTION_INSTALL_KEYPAIR);
+        intent.putExtra(EXTRA_CERT_DATA, cert);
+        intent.putExtra(EXTRA_KEY_DATA, key);
+        intent.putExtra(EXTRA_KEY_ALIAS, alias);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        getContext().startActivity(intent);
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ManagedProfileTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ManagedProfileTest.java
index 47ecfcb..e655d7b 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ManagedProfileTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ManagedProfileTest.java
@@ -21,6 +21,7 @@
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
 import android.test.ActivityInstrumentationTestCase2;
+import android.support.test.InstrumentationRegistry;
 
 import static com.android.cts.managedprofile.BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT;
 
@@ -43,6 +44,10 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+        // As the way to access Instrumentation is changed in the new runner, we need to inject it
+        // manually into ActivityInstrumentationTestCase2. ActivityInstrumentationTestCase2 will
+        // be marked as deprecated and replaced with ActivityTestRule.
+        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
         mPackageManager = getActivity().getPackageManager();
         mDevicePolicyManager = (DevicePolicyManager)
                 getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserAdminHelper.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserAdminHelper.java
new file mode 100644
index 0000000..af0ac25
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserAdminHelper.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.managedprofile;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.test.AndroidTestCase;
+
+/**
+ * This test executes helper tasks as active device admin in the primary user. Current tasks are
+ * setting and clearing lockscreen password used by the host side delegated cert installer test.
+ */
+public class PrimaryUserAdminHelper extends AndroidTestCase {
+
+    private DevicePolicyManager mDpm;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mDpm = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
+    }
+
+    /**
+     * Device admin can only be deactivated by itself and this test should be executed before the
+     * device admin package can be uninstalled.
+     */
+    public void testClearDeviceAdmin() throws Exception {
+        ComponentName cn = PrimaryUserDeviceAdmin.ADMIN_RECEIVER_COMPONENT;
+        if (mDpm.isAdminActive(cn)) {
+            mDpm.removeActiveAdmin(cn);
+            // Wait until device admin is not active (with 2 minutes timeout).
+            for (int i = 0; i < 2 * 60 && mDpm.isAdminActive(cn); i++) {
+                Thread.sleep(1000);  // 1 second.
+            }
+        }
+        assertFalse(mDpm.isAdminActive(cn));
+    }
+
+    /**
+     * Set lockscreen password.
+     */
+    public void testSetPassword() {
+        // Enable credential storage by setting a nonempty password.
+        assertTrue(mDpm.resetPassword("test", 0));
+    }
+
+    /**
+     * Clear lockscreen password.
+     */
+    public void testClearPassword() {
+        mDpm.setPasswordQuality(PrimaryUserDeviceAdmin.ADMIN_RECEIVER_COMPONENT,
+                DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
+        mDpm.setPasswordMinimumLength(
+                PrimaryUserDeviceAdmin.ADMIN_RECEIVER_COMPONENT, 0);
+        assertTrue(mDpm.resetPassword("", 0));
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserDeviceAdmin.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserDeviceAdmin.java
new file mode 100644
index 0000000..8662daf
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserDeviceAdmin.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.managedprofile;
+
+import android.app.admin.DeviceAdminReceiver;
+import android.content.ComponentName;
+
+/**
+ * A device admin class running in the primary user. Currently used by delegated cert installer
+ * test to set a lockscreen password which is prerequisite of installKeyPair().
+ */
+public class PrimaryUserDeviceAdmin extends DeviceAdminReceiver {
+    public static final ComponentName ADMIN_RECEIVER_COMPONENT = new ComponentName(
+            PrimaryUserDeviceAdmin.class.getPackage().getName(),
+            PrimaryUserDeviceAdmin.class.getName());
+}
\ No newline at end of file
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserTest.java
index 40ff6c5..4163ba8 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PrimaryUserTest.java
@@ -20,6 +20,7 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.test.ActivityInstrumentationTestCase2;
+import android.support.test.InstrumentationRegistry;
 
 /**
  * Test for {@link DevicePolicyManager#addCrossProfileIntentFilter} API, for
@@ -43,6 +44,10 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+        // As the way to access Instrumentation is changed in the new runner, we need to inject it
+        // manually into ActivityInstrumentationTestCase2. ActivityInstrumentationTestCase2 will
+        // be marked as deprecated and replaced with ActivityTestRule.
+        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
         mPackageManager = getActivity().getPackageManager();
     }
 
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/SetPolicyActivity.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/SetPolicyActivity.java
new file mode 100644
index 0000000..f59363b
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/SetPolicyActivity.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2014 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 com.android.cts.managedprofile;
+
+import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Process;
+import android.util.Log;
+
+import com.android.cts.managedprofile.BaseManagedProfileTest;
+
+/**
+ * Simple activity that adds or clears a user restriction depending on the value of the extras.
+ */
+public class SetPolicyActivity extends Activity {
+
+    private static final String TAG = SetPolicyActivity.class.getName();
+
+    private static final String EXTRA_RESTRICTION_KEY = "extra-restriction-key";
+    private static final String EXTRA_PACKAGE_NAME = "extra-package-name";
+    private static final String EXTRA_COMMAND = "extra-command";
+
+    private static final String ADD_RESTRICTION_COMMAND = "add-restriction";
+    private static final String CLEAR_RESTRICTION_COMMAND = "clear-restriction";
+    private static final String ADD_CROSS_PROFILE_WIDGET_COMMAND = "add-cross-profile-widget";
+    private static final String REMOVE_CROSS_PROFILE_WIDGET_COMMAND = "remove-cross-profile-widget";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        handleIntent(getIntent());
+    }
+
+    // Overriding this method in case another intent is sent to this activity before finish()
+    @Override
+    public void onNewIntent(Intent intent) {
+        super.onNewIntent(intent);
+        handleIntent(intent);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        // Calling finish() here because doing it in onCreate(), onStart() or onResume() makes
+        // "adb shell am start" timeout if using the -W option.
+        finish();
+    }
+
+    private void handleIntent(Intent intent) {
+        DevicePolicyManager dpm = (DevicePolicyManager)
+                getSystemService(Context.DEVICE_POLICY_SERVICE);
+        String command = intent.getStringExtra(EXTRA_COMMAND);
+        Log.i(TAG, "Command: \"" + command);
+
+        if (ADD_RESTRICTION_COMMAND.equals(command)) {
+            String restrictionKey = intent.getStringExtra(EXTRA_RESTRICTION_KEY);
+            dpm.addUserRestriction(BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT, restrictionKey);
+            Log.i(TAG, "Added user restriction " + restrictionKey
+                    + " for user " + Process.myUserHandle());
+        } else if (CLEAR_RESTRICTION_COMMAND.equals(command)) {
+            String restrictionKey = intent.getStringExtra(EXTRA_RESTRICTION_KEY);
+            dpm.clearUserRestriction(
+                    BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT, restrictionKey);
+            Log.i(TAG, "Cleared user restriction " + restrictionKey
+                    + " for user " + Process.myUserHandle());
+        } else if (ADD_CROSS_PROFILE_WIDGET_COMMAND.equals(command)) {
+            String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME);
+            dpm.addCrossProfileWidgetProvider(BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT,
+                    packageName);
+            Log.i(TAG, "Added cross-profile widget provider for package:" + packageName
+                    + " for user " + Process.myUserHandle());
+        } else if (REMOVE_CROSS_PROFILE_WIDGET_COMMAND.equals(command)) {
+            String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME);
+            dpm.removeCrossProfileWidgetProvider(BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT,
+                    packageName);
+            Log.i(TAG, "Removed cross-profile widget provider for package:" + packageName
+                    + " for user " + Process.myUserHandle());
+        } else {
+            Log.e(TAG, "Invalid command: " + command);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/UserRestrictionActivity.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/UserRestrictionActivity.java
deleted file mode 100644
index e8decf8..0000000
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/UserRestrictionActivity.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.android.cts.managedprofile;
-
-import android.app.Activity;
-import android.app.admin.DevicePolicyManager;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Process;
-import android.util.Log;
-
-import com.android.cts.managedprofile.BaseManagedProfileTest;
-
-/**
- * Simple activity that adds or clears a user restriction depending on the value of the extras.
- */
-public class UserRestrictionActivity extends Activity {
-
-    private static final String TAG = UserRestrictionActivity.class.getName();
-
-    private static final String EXTRA_RESTRICTION_KEY = "extra-restriction-key";
-    private static final String EXTRA_COMMAND = "extra-command";
-
-    private static final String ADD_COMMAND = "add-restriction";
-    private static final String CLEAR_COMMAND = "clear-restriction";
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        handleIntent(getIntent());
-    }
-
-    // Overriding this method in case another intent is sent to this activity before finish()
-    @Override
-    public void onNewIntent(Intent intent) {
-        super.onNewIntent(intent);
-        handleIntent(intent);
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        // Calling finish() here because doing it in onCreate(), onStart() or onResume() makes
-        // "adb shell am start" timeout if using the -W option.
-        finish();
-    }
-
-    private void handleIntent(Intent intent) {
-        DevicePolicyManager dpm = (DevicePolicyManager)
-                getSystemService(Context.DEVICE_POLICY_SERVICE);
-        String restrictionKey = intent.getStringExtra(EXTRA_RESTRICTION_KEY);
-        String command = intent.getStringExtra(EXTRA_COMMAND);
-        Log.i(TAG, "Command: \"" + command + "\". Restriction: \"" + restrictionKey + "\"");
-
-        if (ADD_COMMAND.equals(command)) {
-            dpm.addUserRestriction(BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT, restrictionKey);
-            Log.i(TAG, "Added user restriction " + restrictionKey
-                    + " for user " + Process.myUserHandle());
-        } else if (CLEAR_COMMAND.equals(command)) {
-            dpm.clearUserRestriction(
-                    BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT, restrictionKey);
-            Log.i(TAG, "Cleared user restriction " + restrictionKey
-                    + " for user " + Process.myUserHandle());
-        } else {
-            Log.e(TAG, "Invalid command: " + command);
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/WifiTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/WifiTest.java
new file mode 100644
index 0000000..c4c02e8
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/WifiTest.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.managedprofile;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiManager;
+import android.os.SystemClock;
+import android.test.AndroidTestCase;
+
+import java.util.concurrent.TimeUnit;
+
+import static com.android.compatibility.common.util.WifiConfigCreator.ACTION_CREATE_WIFI_CONFIG;
+import static com.android.compatibility.common.util.WifiConfigCreator.ACTION_REMOVE_WIFI_CONFIG;
+import static com.android.compatibility.common.util.WifiConfigCreator.EXTRA_NETID;
+import static com.android.compatibility.common.util.WifiConfigCreator.EXTRA_SSID;
+
+/**
+ * Driven by the host-side test: com.android.cts.devicepolicy.ManagedProfileTest
+ *
+ * Each of these tests can run independently but have side-effects. The side-effects are used as
+ * building blocks to test various cleanup routines, for example that networks belonging to one
+ * user are deleted
+ */
+public class WifiTest extends AndroidTestCase {
+    private static final String TAG = WifiTest.class.getSimpleName();
+
+    // Unique SSID to use for this test (max SSID length is 32)
+    private static final String NETWORK_SSID = "com.android.cts.xwde7ktvh8rmjuhr";
+
+    // Time duration to allow before assuming that a WiFi operation failed and ceasing to wait.
+    private static final long UPDATE_TIMEOUT_MS = TimeUnit.SECONDS.toMillis(30);
+    private static final long UPDATE_INTERVAL_MS = TimeUnit.SECONDS.toMillis(1);
+
+    // Shared WifiManager instance.
+    private WifiManager mWifiManager;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        mWifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
+    }
+
+    /**
+     * Add a network through the WifiManager API. Verifies that the network was actually added.
+     *
+     * <p>Side effects:
+     * <ul>
+     *   <li>Network with SSID {@link WifiTest#NETWORK_SSID} is created.</li>
+     * </ul>
+     */
+    public void testAddWifiNetwork() throws Exception {
+        Intent intent = new Intent(ACTION_CREATE_WIFI_CONFIG);
+        intent.putExtra(EXTRA_SSID, NETWORK_SSID);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        getContext().startActivity(intent);
+
+        // Wait for configuration to appear in networks list.
+        assertTrue(awaitNetworkState(NETWORK_SSID, /* exists */ true));
+    }
+
+    /**
+     * Remove any network through the WifiManager API with a certain SSID. Verifies that the network
+     * was actually removed.
+     *
+     * <p>Side effects:
+     * <ul>
+     *   <li>If a network with SSID {@link WifiTest#NETWORK_SSID} exists, it will be deleted.</li>
+     * </ul>
+     */
+    public void testRemoveWifiNetworkIfExists() throws Exception {
+        WifiConfiguration config = getNetworkForSsid(NETWORK_SSID);
+
+        if (config != null && config.networkId != -1) {
+            Intent intent = new Intent(ACTION_REMOVE_WIFI_CONFIG);
+            intent.putExtra(EXTRA_NETID, config.networkId);
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            getContext().startActivity(intent);
+        }
+
+        assertTrue(awaitNetworkState(NETWORK_SSID, /* exists */ false));
+    }
+
+    /**
+     * Verify that no network exists with a certain SSID.
+     *
+     * <p>The SSID that will be checked for is {@link WifiTest#NETWORK_SSID}.
+     */
+    public void testWifiNetworkDoesNotExist() throws Exception {
+        assertTrue(awaitNetworkState(NETWORK_SSID, /* exists */ false));
+    }
+
+    /**
+     * Block until a network configuration with a certain SSID either exists or ceases to.
+     * Wait for up to {@link WifiTest#UPDATE_TIMEOUT_MS} milliseconds, in increments of
+     * {@link WifiTest#UPDATE_INTERVAL_MS}.
+     */
+    private boolean awaitNetworkState(String ssid, boolean exists) {
+        for (int probes = 0; probes * UPDATE_INTERVAL_MS <= UPDATE_TIMEOUT_MS; probes++) {
+            if (probes != 0) {
+                SystemClock.sleep(UPDATE_INTERVAL_MS);
+            }
+            if ((getNetworkForSsid(ssid) != null) == exists) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Internal method to find an existing {@link WifiConfiguration} with the given SSID.
+     *
+     * @return A {@link WifiConfiguration} matching the specification, or {@code null} if no such
+     *         configuration exists.
+     */
+    private WifiConfiguration getNetworkForSsid(String ssid) {
+        if (!ssid.startsWith("\"")) {
+            ssid = '"' + ssid + '"';
+        }
+        for (WifiConfiguration config : mWifiManager.getConfiguredNetworks()) {
+            if (ssid.equals(config.SSID)) {
+                return config;
+            }
+        }
+        return null;
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/WipeDataTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/WipeDataTest.java
index 76a9e44..9646e61 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/WipeDataTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/WipeDataTest.java
@@ -64,11 +64,4 @@
         // Verify the profile is deleted
         assertFalse(mUserManager.getUserProfiles().contains(currentUser));
     }
-
-    // Override this test inherited from base class, as it will trigger another round of setUp()
-    // which would fail because the managed profile has been removed by this test.
-    @Override
-    @Ignore
-    public void testAndroidTestCaseSetupProperly() {
-    }
 }
diff --git a/hostsidetests/devicepolicy/app/SimpleApp/AndroidManifest.xml b/hostsidetests/devicepolicy/app/SimpleApp/AndroidManifest.xml
index 848317c..791ae56 100644
--- a/hostsidetests/devicepolicy/app/SimpleApp/AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/SimpleApp/AndroidManifest.xml
@@ -18,6 +18,8 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.cts.launcherapps.simpleapp">
 
+    <uses-permission android:name="android.permission.READ_CONTACTS"/>
+
     <application>
         <activity android:name=".SimpleActivity" >
             <intent-filter>
@@ -31,6 +33,18 @@
         <activity android:name=".NonLauncherActivity">
             android:exported="true">
         </activity>
+        <activity android:name=".SimpleActivityImmediateExit" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".SimpleActivityChainExit" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
     </application>
 
 </manifest>
diff --git a/hostsidetests/devicepolicy/app/SimpleApp/src/com/android/cts/launcherapps/simpleapp/SimpleActivityChainExit.java b/hostsidetests/devicepolicy/app/SimpleApp/src/com/android/cts/launcherapps/simpleapp/SimpleActivityChainExit.java
new file mode 100644
index 0000000..49f14da
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/SimpleApp/src/com/android/cts/launcherapps/simpleapp/SimpleActivityChainExit.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.launcherapps.simpleapp;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+/**
+ * This activity starts another activity. Once the other activity gets terminated, this one will
+ * terminate as well.
+ */
+public class SimpleActivityChainExit extends Activity {
+    private static final String TAG = "SimpleActivityChainExit";
+    // This action.
+    private final static String ACTIVITY_CHAIN_EXIT_ACTION =
+            "com.android.cts.launchertests.LauncherAppsTests.CHAIN_EXIT_ACTION";
+    // The action which will be called from here and then immediately exit again.
+    private static final String SIMPLE_ACTIVITY_IMMEDIATE_EXIT = ".SimpleActivityImmediateExit";
+    // Our package name.
+    private static final String SIMPLE_PACKAGE_NAME = "com.android.cts.launcherapps.simpleapp";
+    // Set to true once the activity was paused. Upon next resume the activity gets finished.
+    private boolean mPaused = false;
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        Log.i(TAG, "Created SimpleActivityChainExit.");
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        // Start our second activity which will quit itself immediately giving back control.
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setClassName(SIMPLE_PACKAGE_NAME,
+                SIMPLE_PACKAGE_NAME + SIMPLE_ACTIVITY_IMMEDIATE_EXIT);
+        startActivityForResult(intent, 0);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        mPaused = true;
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        // We ignore any resumes coming in before we got at least paused once.
+        if (mPaused) {
+            // Since we were paused once we can finish ourselves now.
+            finish();
+        }
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        // Notify a listener that this activity will end now.
+        Intent reply = new Intent();
+        reply.setAction(ACTIVITY_CHAIN_EXIT_ACTION);
+        sendBroadcast(reply);
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/SimpleApp/src/com/android/cts/launcherapps/simpleapp/SimpleActivityImmediateExit.java b/hostsidetests/devicepolicy/app/SimpleApp/src/com/android/cts/launcherapps/simpleapp/SimpleActivityImmediateExit.java
new file mode 100644
index 0000000..15cc3f6
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/SimpleApp/src/com/android/cts/launcherapps/simpleapp/SimpleActivityImmediateExit.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.launcherapps.simpleapp;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+/**
+ * A simple activity which quits itself immediately after starting.
+ */
+public class SimpleActivityImmediateExit extends Activity {
+    private final static String ACTIVITY_EXIT_ACTION =
+            "com.android.cts.launchertests.LauncherAppsTests.EXIT_ACTION";
+    private static final String TAG = "SimpleActivityImmediateExit";
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        Log.i(TAG, "Created SimpleActivityImmediateExit.");
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        finish();
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        // Notify any listener that this activity is about to end now.
+        Intent reply = new Intent();
+        reply.setAction(ACTIVITY_EXIT_ACTION);
+        sendBroadcast(reply);
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/SimplePreMApp/Android.mk b/hostsidetests/devicepolicy/app/SimplePreMApp/Android.mk
new file mode 100644
index 0000000..7460552
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/SimplePreMApp/Android.mk
@@ -0,0 +1,33 @@
+# Copyright (C) 2015 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.
+
+# This app is meant for testing device policy permission APIs on legacy apps (pre-M)
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# Don't include this package in any target.
+LOCAL_MODULE_TAGS := optional
+
+# When built, explicitly put it in the data partition.
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsSimplePreMApp
+
+LOCAL_SDK_VERSION := 21
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/devicepolicy/app/SimplePreMApp/AndroidManifest.xml b/hostsidetests/devicepolicy/app/SimplePreMApp/AndroidManifest.xml
new file mode 100644
index 0000000..85962a1
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/SimplePreMApp/AndroidManifest.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.launcherapps.simplepremapp">
+
+    <uses-sdk android:targetSdkVersion="21"/>
+
+    <uses-permission android:name="android.permission.READ_CONTACTS"/>
+
+    <application>
+        <activity android:name=".SimpleActivity" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
+
diff --git a/hostsidetests/devicepolicy/app/SimplePreMApp/src/com/android/cts/launcherapps/simplepremapp/SimpleActivity.java b/hostsidetests/devicepolicy/app/SimplePreMApp/src/com/android/cts/launcherapps/simplepremapp/SimpleActivity.java
new file mode 100644
index 0000000..0dba719
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/SimplePreMApp/src/com/android/cts/launcherapps/simplepremapp/SimpleActivity.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.launcherapps.simplepremapp;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+import java.lang.Override;
+
+/**
+ * A simple activity to install for various users to test LauncherApps.
+ */
+public class SimpleActivity extends Activity {
+
+    private static final String TAG = "SimpleActivity";
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        Log.i(TAG, "Created for user " + android.os.Process.myUserHandle());
+    }
+
+}
diff --git a/hostsidetests/devicepolicy/app/WidgetProvider/Android.mk b/hostsidetests/devicepolicy/app/WidgetProvider/Android.mk
new file mode 100644
index 0000000..c0e35fa
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/WidgetProvider/Android.mk
@@ -0,0 +1,29 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_PACKAGE_NAME := CtsWidgetProviderApp
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/devicepolicy/app/WidgetProvider/AndroidManifest.xml b/hostsidetests/devicepolicy/app/WidgetProvider/AndroidManifest.xml
new file mode 100644
index 0000000..77246b5
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/WidgetProvider/AndroidManifest.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.widgetprovider">
+
+    <uses-permission android:name="android.permission.BIND_APPWIDGET"/>
+
+    <application>
+        <receiver android:name="SimpleWidgetProvider" >
+            <intent-filter>
+                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
+            </intent-filter>
+            <meta-data android:name="android.appwidget.provider"
+                       android:resource="@xml/simple_widget_provider_info" />
+        </receiver>
+        <service android:name=".SimpleAppWidgetHostService" >
+            <intent-filter>
+                <action android:name="com.android.cts.widgetprovider.REGISTER_CALLBACK" />
+            </intent-filter>
+        </service>
+    </application>
+
+</manifest>
+
diff --git a/hostsidetests/devicepolicy/app/WidgetProvider/res/layout/simple_widget.xml b/hostsidetests/devicepolicy/app/WidgetProvider/res/layout/simple_widget.xml
new file mode 100644
index 0000000..338c57a
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/WidgetProvider/res/layout/simple_widget.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2015 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.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="horizontal"
+    android:padding="10dip">
+
+    <ImageView
+        android:id="@+id/pkg_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"/>
+
+    <TextView
+        android:id="@+id/pkg_name"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_centerVertical="true"
+        android:paddingLeft="10dip"
+        android:layout_toRightOf="@id/pkg_icon"/>
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/hostsidetests/devicepolicy/app/WidgetProvider/res/xml/simple_widget_provider_info.xml b/hostsidetests/devicepolicy/app/WidgetProvider/res/xml/simple_widget_provider_info.xml
new file mode 100644
index 0000000..8a002d2
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/WidgetProvider/res/xml/simple_widget_provider_info.xml
@@ -0,0 +1,20 @@
+<!-- Copyright (C) 2015 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.
+-->
+<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
+    android:minWidth="40dp"
+    android:minHeight="40dp"
+    android:resizeMode="horizontal|vertical"
+    android:widgetCategory="home_screen">
+</appwidget-provider>
\ No newline at end of file
diff --git a/hostsidetests/devicepolicy/app/WidgetProvider/src/com/android/cts/widgetprovider/SimpleAppWidgetHostService.java b/hostsidetests/devicepolicy/app/WidgetProvider/src/com/android/cts/widgetprovider/SimpleAppWidgetHostService.java
new file mode 100644
index 0000000..b5b6003
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/WidgetProvider/src/com/android/cts/widgetprovider/SimpleAppWidgetHostService.java
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.widgetprovider;
+
+import android.app.Service;
+import android.appwidget.AppWidgetHost;
+import android.appwidget.AppWidgetHostView;
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProviderInfo;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.Log;
+import android.widget.RemoteViews;
+
+import java.util.List;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Service that acts as AppWidgetHost that listens to onProvidersChanged callbacks and updates the
+ * internally stored list of profile widgets. The service reacts to messages sent from the device
+ * side tests and returns whether the expected widget provider is currently present or not.
+ */
+public class SimpleAppWidgetHostService extends Service {
+    private static final String TAG = "SimpleAppWidgetHostService";
+
+    private static final int MSG_RESULT = 0;
+    private static final int MSG_PROVIDER_PRESENT = 1;
+    private static final int MSG_PROVIDER_UPDATES = 2;
+
+    private static final int RESULT_UNKNOWN = 0;
+    private static final int RESULT_PRESENT = 1;
+    private static final int RESULT_NOT_PRESENT = 2;
+    private static final int RESULT_INTERRUPTED = 3;
+    private static final int RESULT_TIMEOUT = 4;
+
+    public static final String USER_EXTRA = "user-extra";
+    public static final String PACKAGE_EXTRA = "package-extra";
+    public static final String REPLY_EXTRA = "reply-extra";
+
+    private AppWidgetManager mAppWidgetManager;
+    private SimpleAppWidgetHost mAppWidgetHost;
+    private SimpleAppWidgetHostView mAppWidgetHostView;
+    private int mAppWidgetId;
+    private Messenger mMessenger;
+    private UserHandle mUserHandle;
+    private Semaphore mWidgetUpdateSemaphore = new Semaphore(0);
+    private RemoteViews mRemoteViews;
+
+    class CheckHandler extends Handler {
+        public CheckHandler(Looper looper) {
+            super(looper);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            Bundle params = null;
+            if (msg.obj instanceof Bundle) {
+                params = (Bundle) (msg.obj);
+            }
+            try {
+                switch (msg.what) {
+                    case MSG_PROVIDER_PRESENT: {
+                        Log.d(TAG, "MSG_PROVIDER_PRESENT");
+                        int result = RESULT_UNKNOWN;
+                        try {
+                            AppWidgetProviderInfo info = mAppWidgetHost.getProvider(params);
+                            result = (info != null) ? RESULT_PRESENT : RESULT_NOT_PRESENT;
+                            if (info != null) {
+                                bindAppWidget(info);
+                            }
+                        } catch (InterruptedException e) {
+                            result = RESULT_INTERRUPTED;
+                        }
+                        msg.replyTo.send(Message.obtain(null, MSG_RESULT, result
+                                , 0 /* not used */));
+                        break;
+                    }
+                    case MSG_PROVIDER_UPDATES: {
+                        Log.d(TAG, "MSG_PROVIDER_UPDATES");
+                        int result = RESULT_UNKNOWN;
+                        try {
+                            updateWidgetViaWidgetId();
+                            boolean update = waitForUpdate();
+                            result = update ? RESULT_PRESENT : RESULT_NOT_PRESENT;
+                        } catch (InterruptedException e) {
+                            result = RESULT_INTERRUPTED;
+                        }
+                        msg.replyTo.send(Message.obtain(null, MSG_RESULT, result
+                                , 0 /* not used */));
+                        break;
+                    }
+                    default:
+                        super.handleMessage(msg);
+                }
+            } catch (RemoteException e) {
+                Log.e(TAG, "Failed to report test status");
+            }
+        }
+    }
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        if (intent == null) {
+            return START_NOT_STICKY;
+        }
+        if ("com.android.cts.widgetprovider.REGISTER_CALLBACK".equals(intent.getAction())) {
+            mUserHandle = getUserHandleArgument(this, USER_EXTRA, intent);
+            Log.d(TAG, "mUserHandle=" + mUserHandle);
+            setup();
+        }
+        return START_STICKY;
+    }
+
+    private void setup() {
+        HandlerThread handlerThread = new HandlerThread("Widget test callback handler");
+        handlerThread.start();
+        mMessenger = new Messenger(new CheckHandler(handlerThread.getLooper()));
+        mAppWidgetManager = (AppWidgetManager) getSystemService(Context.APPWIDGET_SERVICE);
+        mAppWidgetHost = new SimpleAppWidgetHost(this, 0);
+        mAppWidgetHost.deleteHost();
+        mAppWidgetHost.startListening();
+    }
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        return mMessenger.getBinder();
+    }
+
+    @Override
+    public void onDestroy() {
+        mAppWidgetHost.stopListening();
+        mAppWidgetHost.deleteAppWidgetId(mAppWidgetId);
+        mAppWidgetHost.deleteHost();
+    }
+
+    private void bindAppWidget(AppWidgetProviderInfo info) {
+        mAppWidgetId = mAppWidgetHost.allocateAppWidgetId();
+        Log.d(TAG, "Registering app widget with id:" + mAppWidgetId);
+        mAppWidgetManager.bindAppWidgetIdIfAllowed(mAppWidgetId, mUserHandle, info.provider, null);
+        mAppWidgetHostView = (SimpleAppWidgetHostView) mAppWidgetHost.createView(this,
+                mAppWidgetId, info);
+        mRemoteViews = new RemoteViews(info.provider.getPackageName(), R.layout.simple_widget);
+    }
+
+    private UserHandle getUserHandleArgument(Context context, String key,
+            Intent intent) {
+        UserManager um = (UserManager) getSystemService(Context.USER_SERVICE);
+        int serial = intent.getIntExtra(key, 0);
+        Log.d(TAG, "userId=" + serial);
+        return um.getUserForSerialNumber(serial);
+    }
+
+    private void updateWidgetViaWidgetId() {
+        Log.d(TAG, "Forcing widget update via widget id");
+        mWidgetUpdateSemaphore.drainPermits();
+        // trigger a widget update
+        mAppWidgetManager.updateAppWidget(mAppWidgetId, mRemoteViews);
+    }
+
+    private boolean waitForUpdate() throws InterruptedException {
+        // wait for updateAppWidget to arrive
+        return mWidgetUpdateSemaphore.tryAcquire(20, TimeUnit.SECONDS);
+    }
+
+    private class SimpleAppWidgetHost extends AppWidgetHost {
+        private List<AppWidgetProviderInfo> mProviders;
+        private Semaphore mSemaphore = new Semaphore(0);
+        public SimpleAppWidgetHost(Context context, int hostId) {
+            super(context, hostId);
+            synchronized (this) {
+                mProviders = mAppWidgetManager.getInstalledProvidersForProfile(mUserHandle);
+            }
+        }
+
+        @Override
+        protected void onProvidersChanged() {
+            super.onProvidersChanged();
+            Log.d(TAG, "onProvidersChanged callback received");
+            synchronized (this) {
+                mProviders = mAppWidgetManager.getInstalledProvidersForProfile(mUserHandle);
+            }
+            mSemaphore.release();
+        }
+
+        @Override
+        protected AppWidgetHostView onCreateView(Context context, int id, AppWidgetProviderInfo info) {
+            return new SimpleAppWidgetHostView(context);
+        }
+
+        public AppWidgetProviderInfo getProvider(Bundle params) throws InterruptedException {
+            String packageName = params.getString(PACKAGE_EXTRA);
+            while (mSemaphore.tryAcquire(30, TimeUnit.SECONDS)) {
+                mSemaphore.drainPermits();
+                Log.d(TAG, "checking for " + packageName + " " + mUserHandle);
+                synchronized (this) {
+                    for (AppWidgetProviderInfo providerInfo : mProviders) {
+                        if (providerInfo.provider.getPackageName().equals(packageName)) {
+                            Log.d(TAG, "Provider exists " + packageName
+                                    + " for user " + mUserHandle);
+                            return providerInfo;
+                        }
+                    }
+                }
+            }
+            return null;
+        }
+    }
+
+    private class SimpleAppWidgetHostView extends AppWidgetHostView {
+        public SimpleAppWidgetHostView(Context context) {
+            super(context);
+        }
+
+        @Override
+        public void updateAppWidget(RemoteViews views) {
+            super.updateAppWidget(views);
+            Log.d(TAG, "Host view received widget update");
+            mWidgetUpdateSemaphore.release();
+        }
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/WidgetProvider/src/com/android/cts/widgetprovider/SimpleWidgetProvider.java b/hostsidetests/devicepolicy/app/WidgetProvider/src/com/android/cts/widgetprovider/SimpleWidgetProvider.java
new file mode 100644
index 0000000..3bd4530
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/WidgetProvider/src/com/android/cts/widgetprovider/SimpleWidgetProvider.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.widgetprovider;
+
+import android.appwidget.AppWidgetProvider;
+
+/**
+ * A simple widget provider to test cross-profile widgets.
+ */
+public class SimpleWidgetProvider extends AppWidgetProvider {}
diff --git a/hostsidetests/devicepolicy/app/WifiConfigCreator/Android.mk b/hostsidetests/devicepolicy/app/WifiConfigCreator/Android.mk
new file mode 100644
index 0000000..47db44e
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/WifiConfigCreator/Android.mk
@@ -0,0 +1,33 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# Don't include this package in any target.
+LOCAL_MODULE_TAGS := optional
+
+# When built, explicitly put it in the data partition.
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsWifiConfigCreator
+
+LOCAL_STATIC_JAVA_LIBRARIES := compatibility-device-util_v2
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/devicepolicy/app/WifiConfigCreator/AndroidManifest.xml b/hostsidetests/devicepolicy/app/WifiConfigCreator/AndroidManifest.xml
new file mode 100644
index 0000000..1b98259
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/WifiConfigCreator/AndroidManifest.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.deviceowner.wificonfigcreator">
+
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
+
+    <application>
+        <activity android:name=".WifiConfigCreatorActivity"
+            android:exported="true"
+            android:theme="@android:style/Theme.NoDisplay"
+            android:noHistory="true"
+            android:autoRemoveFromRecents="true"
+            android:stateNotNeeded="true" >
+            <intent-filter>
+                <action android:name="com.android.compatibility.common.util.CREATE_WIFI_CONFIG" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <intent-filter>
+                <action android:name="com.android.compatibility.common.util.UPDATE_WIFI_CONFIG" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <intent-filter>
+                <action android:name="com.android.compatibility.common.util.REMOVE_WIFI_CONFIG" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
+
diff --git a/hostsidetests/devicepolicy/app/WifiConfigCreator/src/com/android/cts/deviceowner/wificonfigcreator/WifiConfigCreatorActivity.java b/hostsidetests/devicepolicy/app/WifiConfigCreator/src/com/android/cts/deviceowner/wificonfigcreator/WifiConfigCreatorActivity.java
new file mode 100644
index 0000000..af31030
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/WifiConfigCreator/src/com/android/cts/deviceowner/wificonfigcreator/WifiConfigCreatorActivity.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.deviceowner.wificonfigcreator;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+import com.android.compatibility.common.util.WifiConfigCreator;
+import static com.android.compatibility.common.util.WifiConfigCreator.ACTION_CREATE_WIFI_CONFIG;
+import static com.android.compatibility.common.util.WifiConfigCreator.EXTRA_NETID;
+import static com.android.compatibility.common.util.WifiConfigCreator.EXTRA_PASSWORD;
+import static com.android.compatibility.common.util.WifiConfigCreator.EXTRA_SECURITY_TYPE;
+import static com.android.compatibility.common.util.WifiConfigCreator.EXTRA_SSID;
+import static com.android.compatibility.common.util.WifiConfigCreator.ACTION_REMOVE_WIFI_CONFIG;
+import static com.android.compatibility.common.util.WifiConfigCreator.SECURITY_TYPE_NONE;
+import static com.android.compatibility.common.util.WifiConfigCreator.ACTION_UPDATE_WIFI_CONFIG;
+
+/**
+ * A simple activity to create and manage wifi configurations.
+ */
+public class WifiConfigCreatorActivity extends Activity {
+    private static final String TAG = "WifiConfigCreatorActivity";
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        Log.i(TAG, "Created for user " + android.os.Process.myUserHandle());
+        WifiConfigCreator configCreator = new WifiConfigCreator(this);
+        try {
+            Intent intent = getIntent();
+            String action = intent.getAction();
+            if (ACTION_CREATE_WIFI_CONFIG.equals(action)) {
+                String ssid = intent.getStringExtra(EXTRA_SSID);
+                int securityType = intent.getIntExtra(EXTRA_SECURITY_TYPE, SECURITY_TYPE_NONE);
+                String password = intent.getStringExtra(EXTRA_PASSWORD);
+                configCreator.addNetwork(ssid, false, securityType, password);
+            } else if (ACTION_UPDATE_WIFI_CONFIG.equals(action)) {
+                int netId = intent.getIntExtra(EXTRA_NETID, -1);
+                String ssid = intent.getStringExtra(EXTRA_SSID);
+                int securityType = intent.getIntExtra(EXTRA_SECURITY_TYPE, SECURITY_TYPE_NONE);
+                String password = intent.getStringExtra(EXTRA_PASSWORD);
+                configCreator.updateNetwork(netId, ssid, false, securityType, password);
+            } else if (ACTION_REMOVE_WIFI_CONFIG.equals(action)) {
+                int netId = intent.getIntExtra(EXTRA_NETID, -1);
+                if (netId != -1) {
+                    configCreator.removeNetwork(netId);
+                }
+            } else {
+                Log.i(TAG, "Unknown command: " + action);
+            }
+        } finally {
+            finish();
+        }
+    }
+}
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java
index 5149a74..650e963 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java
@@ -47,15 +47,11 @@
  */
 public class BaseDevicePolicyTest extends DeviceTestCase implements IBuildReceiver {
 
-    protected static final String MANAGED_PROFILE_PKG = "com.android.cts.managedprofile";
-    protected static final String MANAGED_PROFILE_APK = "CtsManagedProfileApp.apk";
-    protected static final String ADMIN_RECEIVER_TEST_CLASS =
-            MANAGED_PROFILE_PKG + ".BaseManagedProfileTest$BasicAdminReceiver";
+    private static final String RUNNER = "android.support.test.runner.AndroidJUnitRunner";
 
-    private static final String RUNNER = "android.test.InstrumentationTestRunner";
+    protected CtsBuildHelper mCtsBuild;
 
-    private CtsBuildHelper mCtsBuild;
-
+    private String mPackageVerifier;
     private HashSet<String> mAvailableFeatures;
     protected boolean mHasFeature;
 
@@ -70,6 +66,18 @@
         assertNotNull(mCtsBuild);  // ensure build has been set before test is run.
         mHasFeature = getDevice().getApiLevel() >= 21 /* Build.VERSION_CODES.L */
                 && hasDeviceFeature("android.software.device_admin");
+        // disable the package verifier to avoid the dialog when installing an app
+        mPackageVerifier = getDevice().executeShellCommand(
+                "settings get global package_verifier_enable");
+        getDevice().executeShellCommand("settings put global package_verifier_enable 0");
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        // reset the package verifier setting to its original value
+        getDevice().executeShellCommand("settings put global package_verifier_enable "
+                + mPackageVerifier);
+        super.tearDown();
     }
 
     protected void installApp(String fileName)
@@ -91,7 +99,7 @@
         }
 
         final String result = device.executeShellCommand(
-                "pm install --user " + userId + " " + remotePath);
+                "pm install -r --user " + userId + " " + remotePath);
         assertTrue(result, result.contains("\nSuccess"));
     }
 
@@ -103,8 +111,6 @@
         CLog.logAndDisplay(LogLevel.INFO, "Output for command " + command + ": " + commandOutput);
         assertTrue(commandOutput + " expected to start with \"Success:\"",
                 commandOutput.startsWith("Success:"));
-        // Wait 60 seconds for intents generated to be handled.
-        Thread.sleep(60 * 1000);
     }
 
     protected int getMaxNumberOfUsersSupported() throws DeviceNotAvailableException {
@@ -144,12 +150,22 @@
     }
 
     protected void removeUser(int userId) throws Exception  {
+        String stopUserCommand = "am stop-user -w " + userId;
+        CLog.logAndDisplay(LogLevel.INFO, "starting command \"" + stopUserCommand + "\" and waiting.");
+        CLog.logAndDisplay(LogLevel.INFO, "Output for command " + stopUserCommand + ": "
+                + getDevice().executeShellCommand(stopUserCommand));
         String removeUserCommand = "pm remove-user " + userId;
         CLog.logAndDisplay(LogLevel.INFO, "starting command " + removeUserCommand);
         CLog.logAndDisplay(LogLevel.INFO, "Output for command " + removeUserCommand + ": "
                 + getDevice().executeShellCommand(removeUserCommand));
-        // Wait 60 seconds for user to finish being removed.
-        Thread.sleep(60 * 1000);
+    }
+
+    protected void removeTestUsers() throws Exception {
+        for (int userId : listUsers()) {
+            if (userId != 0) {
+                removeUser(userId);
+            }
+        }
     }
 
     /** Returns true if the specified tests passed. Tests are run as user owner. */
@@ -169,9 +185,6 @@
     protected boolean runDeviceTestsAsUser(
             String pkgName, @Nullable String testClassName, String testMethodName, int userId)
             throws DeviceNotAvailableException {
-        if (testClassName.startsWith(".")) {
-            testClassName = pkgName + testClassName;
-        }
         return runDeviceTests(pkgName, testClassName, testMethodName, userId);
     }
 
@@ -184,6 +197,9 @@
     protected boolean runDeviceTests(String pkgName, @Nullable String testClassName,
             @Nullable String testMethodName, @Nullable Integer userId, @Nullable String params)
                    throws DeviceNotAvailableException {
+        if (testClassName != null && testClassName.startsWith(".")) {
+            testClassName = pkgName + testClassName;
+        }
         TestRunResult runResult = (userId == null && params == null)
                 ? doRunTests(pkgName, testClassName, testMethodName)
                 : doRunTestsAsUser(pkgName, testClassName, testMethodName,
@@ -280,8 +296,6 @@
         String[] tokens = commandOutput.split("\\s+");
         assertTrue(tokens.length > 0);
         assertEquals("Success:", tokens[0]);
-        // Wait 60 seconds for intents generated to be handled.
-        Thread.sleep(60 * 1000);
         return Integer.parseInt(tokens[tokens.length-1]);
     }
 
@@ -300,7 +314,6 @@
         return Integer.parseInt(tokens[tokens.length-1]);
     }
 
-
     protected int getUserSerialNumber(int userId) throws DeviceNotAvailableException{
         // dumpsys user return lines like "UserInfo{0:Owner:13} serialNo=0"
         String commandOutput = getDevice().executeShellCommand("dumpsys user");
@@ -320,12 +333,34 @@
         return -1;
     }
 
-    protected void setProfileOwner(String componentName, int userId)
+    protected boolean setProfileOwner(String componentName, int userId)
             throws DeviceNotAvailableException {
-        String command = "dpm set-profile-owner '" + componentName + "' " + userId;
+        String command = "dpm set-profile-owner --user " + userId + " '" + componentName + "'";
+        String commandOutput = getDevice().executeShellCommand(command);
+        CLog.logAndDisplay(LogLevel.INFO, "Output for command " + command + ": " + commandOutput);
+        return commandOutput.startsWith("Success:");
+    }
+
+    protected void setProfileOwnerOrFail(String componentName, int userId)
+            throws Exception {
+        if (!setProfileOwner(componentName, userId)) {
+            removeUser(userId);
+            fail("Failed to set profile owner");
+        }
+    }
+
+    protected void setDeviceAdmin(String componentName) throws DeviceNotAvailableException {
+        String command = "dpm set-active-admin '" + componentName + "'";
         String commandOutput = getDevice().executeShellCommand(command);
         CLog.logAndDisplay(LogLevel.INFO, "Output for command " + command + ": " + commandOutput);
         assertTrue(commandOutput + " expected to start with \"Success:\"",
                 commandOutput.startsWith("Success:"));
     }
+
+    protected boolean setDeviceOwner(String componentName) throws DeviceNotAvailableException {
+        String command = "dpm set-device-owner '" + componentName + "'";
+        String commandOutput = getDevice().executeShellCommand(command);
+        CLog.logAndDisplay(LogLevel.INFO, "Output for command " + command + ": " + commandOutput);
+        return commandOutput.startsWith("Success:");
+    }
 }
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseLauncherAppsTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseLauncherAppsTest.java
index dec8bd2..b106ffd 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseLauncherAppsTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseLauncherAppsTest.java
@@ -45,14 +45,6 @@
         getDevice().uninstallPackage(SIMPLE_APP_PKG);
     }
 
-    protected void removeTestUsers() throws Exception {
-        for (int userId : listUsers()) {
-            if (userId != 0) {
-                removeUser(userId);
-            }
-        }
-    }
-
     protected void startCallbackService() throws Exception {
         String command = "am startservice --user 0 "
                 + "-a " + LAUNCHER_TESTS_SUPPORT_PKG + ".REGISTER_CALLBACK "
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/CustomDeviceOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/CustomDeviceOwnerTest.java
new file mode 100644
index 0000000..7cb8f3b
--- /dev/null
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/CustomDeviceOwnerTest.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.devicepolicy;
+
+import com.android.ddmlib.Log.LogLevel;
+import com.android.tradefed.log.LogUtil.CLog;
+
+import java.lang.Exception;
+
+/**
+ * This class is used for tests that need to do something special before setting the device
+ * owner, so they cannot use the regular DeviceOwnerTest class
+ */
+public class CustomDeviceOwnerTest extends BaseDevicePolicyTest {
+
+    private static final String DEVICE_OWNER_PKG = "com.android.cts.deviceowner";
+    private static final String DEVICE_OWNER_APK = "CtsDeviceOwnerApp.apk";
+    private static final String DEVICE_OWNER_ADMIN
+            = DEVICE_OWNER_PKG + ".BaseDeviceOwnerTest$BasicAdminReceiver";
+    private static final String DEVICE_OWNER_ADMIN_COMPONENT
+            = DEVICE_OWNER_PKG + "/" + DEVICE_OWNER_ADMIN;
+    private static final String DEVICE_OWNER_CLEAR
+            = DEVICE_OWNER_PKG + ".ClearDeviceOwnerTest";
+
+    private static final String DEVICE_AND_PROFILE_OWNER_PKG
+            = "com.android.cts.deviceandprofileowner";
+    protected static final String DEVICE_AND_PROFILE_OWNER_APK = "CtsDeviceAndProfileOwnerApp.apk";
+    protected static final String DEVICE_AND_PROFILE_OWNER_ADMIN
+            = ".BaseDeviceAdminTest$BasicAdminReceiver";
+    protected static final String DEVICE_AND_PROFILE_OWNER_ADMIN_COMPONENT
+            = DEVICE_AND_PROFILE_OWNER_PKG + "/" + DEVICE_AND_PROFILE_OWNER_ADMIN;
+    protected static final String DEVICE_AND_PROFILE_OWNER_CLEAR
+            = DEVICE_AND_PROFILE_OWNER_PKG + ".ClearDeviceOwnerTest";
+
+    private static final String INTENT_RECEIVER_PKG = "com.android.cts.intent.receiver";
+    private static final String INTENT_RECEIVER_APK = "CtsIntentReceiverApp.apk";
+
+    public void tearDown() throws Exception {
+        if (mHasFeature) {
+            getDevice().uninstallPackage(DEVICE_OWNER_PKG);
+            getDevice().uninstallPackage(DEVICE_AND_PROFILE_OWNER_PKG);
+        }
+
+        super.tearDown();
+    }
+
+    public void testOwnerChangedBroadcast() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        installApp(DEVICE_OWNER_APK);
+        try {
+            installApp(INTENT_RECEIVER_APK);
+
+            String testClass = INTENT_RECEIVER_PKG + ".OwnerChangedBroadcastTest";
+
+            // Running this test also gets the intent receiver app out of the stopped state, so it
+            // can receive broadcast intents.
+            assertTrue(runDeviceTests(INTENT_RECEIVER_PKG, testClass,
+                    "testOwnerChangedBroadcastNotReceived", 0));
+
+            // Setting the device owner should send the owner changed broadcast.
+            assertTrue(setDeviceOwner(DEVICE_OWNER_ADMIN_COMPONENT));
+
+            assertTrue(runDeviceTests(INTENT_RECEIVER_PKG, testClass,
+                    "testOwnerChangedBroadcastReceived", 0));
+        } finally {
+            getDevice().uninstallPackage(INTENT_RECEIVER_PKG);
+            assertTrue("Failed to remove device owner.",
+                    runDeviceTests(DEVICE_OWNER_PKG, DEVICE_OWNER_CLEAR));
+        }
+    }
+
+    public void testCannotSetDeviceOwnerWhenSecondaryUserPresent() throws Exception {
+        if (!mHasFeature || getMaxNumberOfUsersSupported() < 2) {
+            return;
+        }
+        int userId = -1;
+        installApp(DEVICE_OWNER_APK);
+        try {
+            userId = createUser();
+            assertFalse(setDeviceOwner(DEVICE_OWNER_ADMIN_COMPONENT));
+        } finally {
+            removeUser(userId);
+            // make sure we clean up in case we succeeded in setting the device owner
+            runDeviceTests(DEVICE_OWNER_PKG, DEVICE_OWNER_CLEAR);
+        }
+    }
+
+    public void testCannotSetDeviceOwnerWhenAccountPresent() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        installApp(DEVICE_AND_PROFILE_OWNER_APK);
+        try {
+            assertTrue(runDeviceTestsAsUser(DEVICE_AND_PROFILE_OWNER_PKG, ".AccountUtilsTest",
+                    "testAddAccount", 0));
+            assertFalse(setDeviceOwner(DEVICE_AND_PROFILE_OWNER_ADMIN_COMPONENT));
+        } finally {
+            // make sure we clean up in case we succeeded in setting the device owner
+            runDeviceTests(DEVICE_AND_PROFILE_OWNER_PKG, DEVICE_AND_PROFILE_OWNER_CLEAR);
+            assertTrue(runDeviceTestsAsUser(DEVICE_AND_PROFILE_OWNER_PKG, ".AccountUtilsTest",
+                    "testRemoveAccounts", 0));
+        }
+    }
+}
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceAndProfileOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceAndProfileOwnerTest.java
new file mode 100644
index 0000000..36dab2c
--- /dev/null
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceAndProfileOwnerTest.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.devicepolicy;
+
+/**
+ * Set of tests for usecases that apply to profile and device owner.
+ * This class is the base class of MixedProfileOwnerTest and MixedDeviceOwnerTest and is abstract
+ * to avoid running spurious tests.
+ */
+public abstract class DeviceAndProfileOwnerTest extends BaseDevicePolicyTest {
+
+    protected static final String DEVICE_ADMIN_PKG = "com.android.cts.deviceandprofileowner";
+    protected static final String DEVICE_ADMIN_APK = "CtsDeviceAndProfileOwnerApp.apk";
+    protected static final String ADMIN_RECEIVER_TEST_CLASS
+            = ".BaseDeviceAdminTest$BasicAdminReceiver";
+
+    private static final String PERMISSIONS_APP_PKG = "com.android.cts.permissionapp";
+    private static final String PERMISSIONS_APP_APK = "CtsPermissionApp.apk";
+
+    private static final String SIMPLE_PRE_M_APP_PKG = "com.android.cts.launcherapps.simplepremapp";
+    private static final String SIMPLE_PRE_M_APP_APK = "CtsSimplePreMApp.apk";
+
+    protected static final int USER_OWNER = 0;
+
+    // ID of the user all tests are run as. For device owner this will be 0, for profile owner it
+    // is the user id of the created profile.
+    protected int mUserId;
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mHasFeature) {
+            getDevice().uninstallPackage(DEVICE_ADMIN_PKG);
+            getDevice().uninstallPackage(PERMISSIONS_APP_PKG);
+            getDevice().uninstallPackage(SIMPLE_PRE_M_APP_PKG);
+        }
+        super.tearDown();
+    }
+
+    public void testApplicationRestrictions() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        executeDeviceTestClass(".ApplicationRestrictionsTest");
+    }
+
+    public void testPermissionGrant() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        installAppAsUser(PERMISSIONS_APP_APK, mUserId);
+        executeDeviceTestMethod(".PermissionsTest", "testPermissionGrantState");
+    }
+
+    public void testPermissionPolicy() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        installAppAsUser(PERMISSIONS_APP_APK, mUserId);
+        executeDeviceTestMethod(".PermissionsTest", "testPermissionPolicy");
+    }
+
+    public void testPermissionMixedPolicies() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        installAppAsUser(PERMISSIONS_APP_APK, mUserId);
+        executeDeviceTestMethod(".PermissionsTest", "testPermissionMixedPolicies");
+    }
+
+    public void testPermissionPrompts() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        installAppAsUser(PERMISSIONS_APP_APK, mUserId);
+        executeDeviceTestMethod(".PermissionsTest", "testPermissionPrompts");
+    }
+
+    public void testPermissionAppUpdate() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        installAppAsUser(PERMISSIONS_APP_APK, mUserId);
+        executeDeviceTestMethod(".PermissionsTest", "testPermissionUpdate_setDeniedState");
+        executeDeviceTestMethod(".PermissionsTest", "testPermissionUpdate_checkDenied");
+        installAppAsUser(PERMISSIONS_APP_APK, mUserId);
+        executeDeviceTestMethod(".PermissionsTest", "testPermissionUpdate_checkDenied");
+
+        assertNull(getDevice().uninstallPackage(PERMISSIONS_APP_PKG));
+        installAppAsUser(PERMISSIONS_APP_APK, mUserId);
+        executeDeviceTestMethod(".PermissionsTest", "testPermissionUpdate_setGrantedState");
+        executeDeviceTestMethod(".PermissionsTest", "testPermissionUpdate_checkGranted");
+        installAppAsUser(PERMISSIONS_APP_APK, mUserId);
+        executeDeviceTestMethod(".PermissionsTest", "testPermissionUpdate_checkGranted");
+
+        assertNull(getDevice().uninstallPackage(PERMISSIONS_APP_PKG));
+        installAppAsUser(PERMISSIONS_APP_APK, mUserId);
+        executeDeviceTestMethod(".PermissionsTest", "testPermissionUpdate_setAutoDeniedPolicy");
+        executeDeviceTestMethod(".PermissionsTest", "testPermissionUpdate_checkDenied");
+        installAppAsUser(PERMISSIONS_APP_APK, mUserId);
+        executeDeviceTestMethod(".PermissionsTest", "testPermissionUpdate_checkDenied");
+
+        assertNull(getDevice().uninstallPackage(PERMISSIONS_APP_PKG));
+        installAppAsUser(PERMISSIONS_APP_APK, mUserId);
+        executeDeviceTestMethod(".PermissionsTest", "testPermissionUpdate_setAutoGrantedPolicy");
+        executeDeviceTestMethod(".PermissionsTest", "testPermissionUpdate_checkGranted");
+        installAppAsUser(PERMISSIONS_APP_APK, mUserId);
+        executeDeviceTestMethod(".PermissionsTest", "testPermissionUpdate_checkGranted");
+    }
+
+    public void testPermissionGrantPreMApp() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        installAppAsUser(SIMPLE_PRE_M_APP_APK, mUserId);
+        executeDeviceTestMethod(".PermissionsTest", "testPermissionGrantStatePreMApp");
+    }
+
+    public void testPersistentIntentResolving() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        executeDeviceTestClass(".PersistentIntentResolvingTest");
+    }
+
+    public void testScreenCaptureDisabled() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        // We need to ensure that the policy is deactivated for the device owner case, so making
+        // sure the second test is run even if the first one fails
+        try {
+            executeDeviceTestMethod(".ScreenCaptureDisabledTest",
+                    "testSetScreenCaptureDisabled_true");
+        } finally {
+            executeDeviceTestMethod(".ScreenCaptureDisabledTest",
+                    "testSetScreenCaptureDisabled_false");
+        }
+    }
+
+    public void testApplicationHidden() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        installAppAsUser(PERMISSIONS_APP_APK, mUserId);
+        executeDeviceTestClass(".ApplicationHiddenTest");
+    }
+
+    // TODO: Remove AccountManagementTest from XTS after GTS is released for MNC.
+    public void testAccountManagement() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+
+        executeDeviceTestClass(".AccountManagementTest");
+    }
+
+    protected void executeDeviceTestClass(String className) throws Exception {
+        assertTrue(runDeviceTestsAsUser(DEVICE_ADMIN_PKG, className, mUserId));
+    }
+
+    protected void executeDeviceTestMethod(String className, String testName) throws Exception {
+        assertTrue(runDeviceTestsAsUser(DEVICE_ADMIN_PKG, className, testName, mUserId));
+    }
+}
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java
index b84e9fe..4f267d1 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java
@@ -20,6 +20,8 @@
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.log.LogUtil.CLog;
 
+import java.io.File;
+
 /**
  * Set of tests for Device Owner use cases.
  */
@@ -28,6 +30,22 @@
     private static final String DEVICE_OWNER_PKG = "com.android.cts.deviceowner";
     private static final String DEVICE_OWNER_APK = "CtsDeviceOwnerApp.apk";
 
+    private static final String MANAGED_PROFILE_PKG = "com.android.cts.managedprofile";
+    private static final String MANAGED_PROFILE_APK = "CtsManagedProfileApp.apk";
+    private static final String MANAGED_PROFILE_ADMIN =
+            MANAGED_PROFILE_PKG + ".BaseManagedProfileTest$BasicAdminReceiver";
+
+    private static final String TEST_APP_APK = "CtsSimpleApp.apk";
+    private static final String TEST_APP_PKG = "com.android.cts.launcherapps.simpleapp";
+    private static final String TEST_APP_LOCATION = "/data/local/tmp/";
+
+    private static final String INTENT_RECEIVER_PKG = "com.android.cts.intent.receiver";
+    private static final String INTENT_RECEIVER_APK = "CtsIntentReceiverApp.apk";
+
+    private static final String WIFI_CONFIG_CREATOR_PKG =
+            "com.android.cts.deviceowner.wificonfigcreator";
+    private static final String WIFI_CONFIG_CREATOR_APK = "CtsWifiConfigCreator.apk";
+
     private static final String ADMIN_RECEIVER_TEST_CLASS =
             DEVICE_OWNER_PKG + ".BaseDeviceOwnerTest$BasicAdminReceiver";
     private static final String CLEAR_DEVICE_OWNER_TEST_CLASS =
@@ -38,7 +56,8 @@
         super.setUp();
         if (mHasFeature) {
             installApp(DEVICE_OWNER_APK);
-            setDeviceOwner(DEVICE_OWNER_PKG + "/" + ADMIN_RECEIVER_TEST_CLASS);
+            assertTrue("Failed to set device owner",
+                    setDeviceOwner(DEVICE_OWNER_PKG + "/" + ADMIN_RECEIVER_TEST_CLASS));
         }
     }
 
@@ -53,10 +72,6 @@
         super.tearDown();
     }
 
-    public void testApplicationRestrictions() throws Exception {
-        executeDeviceOwnerTest("ApplicationRestrictionsTest");
-    }
-
     public void testCaCertManagement() throws Exception {
         executeDeviceOwnerTest("CaCertManagementTest");
     }
@@ -70,15 +85,57 @@
     }
 
     public void testLockTask() throws Exception {
-        executeDeviceOwnerTest("LockTaskTest");
+        try {
+            installApp(INTENT_RECEIVER_APK);
+            executeDeviceOwnerTest("LockTaskTest");
+        } finally {
+            getDevice().uninstallPackage(INTENT_RECEIVER_PKG);
+        }
     }
 
-    public void testPersistentIntentResolving() throws Exception {
-        executeDeviceOwnerTest("PersistentIntentResolvingTest");
+    public void testPackageInstall() throws Exception {
+        final File apk = mCtsBuild.getTestApp(TEST_APP_APK);
+        try {
+            getDevice().uninstallPackage(TEST_APP_PKG);
+            assertTrue(getDevice().pushFile(apk, TEST_APP_LOCATION + apk.getName()));
+            executeDeviceOwnerTest("PackageInstallTest");
+        } finally {
+            String command = "rm " + TEST_APP_LOCATION + apk.getName();
+            String commandOutput = getDevice().executeShellCommand(command);
+            getDevice().uninstallPackage(TEST_APP_PKG);
+        }
     }
 
-    public void testScreenCaptureDisabled() throws Exception {
-        executeDeviceOwnerTest("ScreenCaptureDisabledTest");
+    public void testSystemUpdatePolicy() throws Exception {
+        executeDeviceOwnerTest("SystemUpdatePolicyTest");
+    }
+
+    public void testWifiConfigLockdown() throws Exception {
+        final boolean hasWifi = hasDeviceFeature("android.hardware.wifi");
+        if (hasWifi && mHasFeature) {
+            try {
+                installApp(WIFI_CONFIG_CREATOR_APK);
+                executeDeviceOwnerTest("WifiConfigLockdownTest");
+            } finally {
+                getDevice().uninstallPackage(WIFI_CONFIG_CREATOR_PKG);
+            }
+        }
+    }
+
+    public void testCannotSetDeviceOwnerAgain() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        // verify that we can't set the same admin receiver as device owner again
+        assertFalse(setDeviceOwner(DEVICE_OWNER_PKG + "/" + ADMIN_RECEIVER_TEST_CLASS));
+
+        // verify that we can't set a different admin receiver as device owner
+        try {
+            installApp(MANAGED_PROFILE_APK);
+            assertFalse(setDeviceOwner(MANAGED_PROFILE_PKG + "/" + MANAGED_PROFILE_ADMIN));
+        } finally {
+            getDevice().uninstallPackage(MANAGED_PROFILE_PKG);
+        }
     }
 
     private void executeDeviceOwnerTest(String testClassName) throws Exception {
@@ -88,13 +145,4 @@
         String testClass = DEVICE_OWNER_PKG + "." + testClassName;
         assertTrue(testClass + " failed.", runDeviceTests(DEVICE_OWNER_PKG, testClass));
     }
-
-    private void setDeviceOwner(String componentName) throws DeviceNotAvailableException {
-        String command = "dpm set-device-owner '" + componentName + "'";
-        String commandOutput = getDevice().executeShellCommand(command);
-        CLog.logAndDisplay(LogLevel.INFO, "Output for command " + command + ": " + commandOutput);
-        assertTrue(commandOutput + " expected to start with \"Success:\"",
-                commandOutput.startsWith("Success:"));
-    }
-
 }
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/LauncherAppsProfileTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/LauncherAppsProfileTest.java
index 43f1f5a..bb26df1 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/LauncherAppsProfileTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/LauncherAppsProfileTest.java
@@ -25,6 +25,11 @@
  */
 public class LauncherAppsProfileTest extends BaseLauncherAppsTest {
 
+    private static final String MANAGED_PROFILE_PKG = "com.android.cts.managedprofile";
+    private static final String MANAGED_PROFILE_APK = "CtsManagedProfileApp.apk";
+    private static final String ADMIN_RECEIVER_TEST_CLASS =
+            MANAGED_PROFILE_PKG + ".BaseManagedProfileTest$BasicAdminReceiver";
+
     private int mProfileUserId;
     private int mProfileSerialNumber;
     private int mMainUserSerialNumber;
@@ -39,7 +44,8 @@
             // Create a managed profile
             mProfileUserId = createManagedProfile();
             installApp(MANAGED_PROFILE_APK);
-            setProfileOwner(MANAGED_PROFILE_PKG + "/" + ADMIN_RECEIVER_TEST_CLASS, mProfileUserId);
+            setProfileOwnerOrFail(MANAGED_PROFILE_PKG + "/" + ADMIN_RECEIVER_TEST_CLASS,
+                    mProfileUserId);
             mProfileSerialNumber = getUserSerialNumber(mProfileUserId);
             mMainUserSerialNumber = getUserSerialNumber(0);
             startUser(mProfileUserId);
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java
index f8fa222..acc5b26 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java
@@ -20,6 +20,8 @@
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.log.LogUtil.CLog;
 
+import junit.framework.AssertionFailedError;
+
 /**
  * Set of tests for Managed Profile use cases.
  */
@@ -28,19 +30,44 @@
     private static final String MANAGED_PROFILE_PKG = "com.android.cts.managedprofile";
     private static final String MANAGED_PROFILE_APK = "CtsManagedProfileApp.apk";
 
+    private static final String DEVICE_OWNER_PKG = "com.android.cts.deviceowner";
+    private static final String DEVICE_OWNER_APK = "CtsDeviceOwnerApp.apk";
+    private static final String DEVICE_OWNER_ADMIN =
+            DEVICE_OWNER_PKG + ".BaseDeviceOwnerTest$BasicAdminReceiver";
+    private static final String DEVICE_OWNER_CLEAR = DEVICE_OWNER_PKG + ".ClearDeviceOwnerTest";
+
     private static final String INTENT_SENDER_PKG = "com.android.cts.intent.sender";
     private static final String INTENT_SENDER_APK = "CtsIntentSenderApp.apk";
 
     private static final String INTENT_RECEIVER_PKG = "com.android.cts.intent.receiver";
     private static final String INTENT_RECEIVER_APK = "CtsIntentReceiverApp.apk";
 
+    private static final String CERT_INSTALLER_PKG = "com.android.cts.certinstaller";
+    private static final String CERT_INSTALLER_APK = "CtsCertInstallerApp.apk";
+
+    private static final String WIFI_CONFIG_CREATOR_PKG = "com.android.cts.wificonfigcreator";
+    private static final String WIFI_CONFIG_CREATOR_APK = "CtsWifiConfigCreator.apk";
+
+    private static final String WIDGET_PROVIDER_APK = "CtsWidgetProviderApp.apk";
+    private static final String WIDGET_PROVIDER_PKG = "com.android.cts.widgetprovider";
+
     private static final String ADMIN_RECEIVER_TEST_CLASS =
             MANAGED_PROFILE_PKG + ".BaseManagedProfileTest$BasicAdminReceiver";
 
     private static final String FEATURE_BLUETOOTH = "android.hardware.bluetooth";
+    private static final String FEATURE_CAMERA = "android.hardware.camera";
+    private static final String FEATURE_WIFI = "android.hardware.wifi";
+
+    private static final String ADD_RESTRICTION_COMMAND = "add-restriction";
+
+    private static final int USER_OWNER = 0;
+
+    // ID of the profile we'll create. This will always be a profile of USER_OWNER.
     private int mUserId;
+    private String mPackageVerifier;
+
     private boolean mHasNfcFeature;
-    
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -51,11 +78,11 @@
         mHasNfcFeature = hasDeviceFeature("android.hardware.nfc");
 
         if (mHasFeature) {
+            removeTestUsers();
             mUserId = createManagedProfile();
+
             installApp(MANAGED_PROFILE_APK);
-            installApp(INTENT_RECEIVER_APK);
-            installApp(INTENT_SENDER_APK);
-            setProfileOwner(MANAGED_PROFILE_PKG + "/" + ADMIN_RECEIVER_TEST_CLASS, mUserId);
+            setProfileOwnerOrFail(MANAGED_PROFILE_PKG + "/" + ADMIN_RECEIVER_TEST_CLASS, mUserId);
             startUser(mUserId);
         }
     }
@@ -67,6 +94,7 @@
             getDevice().uninstallPackage(MANAGED_PROFILE_PKG);
             getDevice().uninstallPackage(INTENT_SENDER_PKG);
             getDevice().uninstallPackage(INTENT_RECEIVER_PKG);
+            getDevice().uninstallPackage(CERT_INSTALLER_PKG);
         }
         super.tearDown();
     }
@@ -94,6 +122,42 @@
         assertFalse(listUsers().contains(mUserId));
     }
 
+    public void testMaxOneManagedProfile() throws Exception {
+        int newUserId = -1;
+        try {
+            newUserId = createManagedProfile();
+        } catch (AssertionFailedError expected) {
+        }
+        if (newUserId > 0) {
+            removeUser(newUserId);
+            fail(mHasFeature ? "Device must allow creating only one managed profile"
+                    : "Device must not allow creating a managed profile");
+        }
+    }
+
+    /**
+     * Verify that removing a managed profile will remove all networks owned by that profile.
+     */
+    public void testProfileWifiCleanup() throws Exception {
+        if (!mHasFeature || !hasDeviceFeature(FEATURE_WIFI)) {
+            return;
+        }
+        assertTrue("WiFi config already exists and could not be removed", runDeviceTestsAsUser(
+                MANAGED_PROFILE_PKG, ".WifiTest", "testRemoveWifiNetworkIfExists", USER_OWNER));
+        try {
+            installApp(WIFI_CONFIG_CREATOR_APK);
+            assertTrue("Failed to add WiFi config", runDeviceTestsAsUser(
+                    MANAGED_PROFILE_PKG, ".WifiTest", "testAddWifiNetwork", mUserId));
+
+            // Now delete the user - should undo the effect of testAddWifiNetwork.
+            removeUser(mUserId);
+            assertTrue("WiFi config not removed after deleting profile", runDeviceTestsAsUser(
+                    MANAGED_PROFILE_PKG, ".WifiTest", "testWifiNetworkDoesNotExist", USER_OWNER));
+        } finally {
+            getDevice().uninstallPackage(WIFI_CONFIG_CREATOR_APK);
+        }
+    }
+
     public void testCrossProfileIntentFilters() throws Exception {
         if (!mHasFeature) {
             return;
@@ -115,6 +179,49 @@
         // TODO: Test with startActivity
     }
 
+    public void testAppLinks() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        // Disable all pre-existing browsers in the managed profile so they don't interfere with
+        // intents resolution.
+        assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CrossProfileUtils",
+                "testDisableAllBrowsers", mUserId));
+        installApp(INTENT_RECEIVER_APK);
+        installApp(INTENT_SENDER_APK);
+
+        changeVerificationStatus(USER_OWNER, INTENT_RECEIVER_PKG, "ask");
+        changeVerificationStatus(mUserId, INTENT_RECEIVER_PKG, "ask");
+        // We should have two receivers: IntentReceiverActivity and BrowserActivity in the
+        // managed profile
+        assertAppLinkResult("testTwoReceivers");
+
+        changeUserRestrictionForUser("allow_parent_profile_app_linking", ADD_RESTRICTION_COMMAND,
+                mUserId);
+        // Now we should also have one receiver in the primary user, so three receivers in total.
+        assertAppLinkResult("testThreeReceivers");
+
+        changeVerificationStatus(USER_OWNER, INTENT_RECEIVER_PKG, "never");
+        // The primary user one has been set to never: we should only have the managed profile ones.
+        assertAppLinkResult("testTwoReceivers");
+
+        changeVerificationStatus(mUserId, INTENT_RECEIVER_PKG, "never");
+        // Now there's only the browser in the managed profile left
+        assertAppLinkResult("testReceivedByBrowserActivityInManaged");
+
+        changeVerificationStatus(USER_OWNER, INTENT_RECEIVER_PKG, "always");
+        changeVerificationStatus(mUserId, INTENT_RECEIVER_PKG, "ask");
+        // We've set the receiver in the primary user to always: only this one should receive the
+        // intent.
+        assertAppLinkResult("testReceivedByAppLinkActivityInPrimary");
+
+        changeVerificationStatus(mUserId, INTENT_RECEIVER_PKG, "always");
+        // We have one always in the primary user and one always in the managed profile: the managed
+        // profile one should have precedence.
+        assertAppLinkResult("testReceivedByAppLinkActivityInManaged");
+    }
+
+
     public void testSettingsIntents() throws Exception {
         if (!mHasFeature) {
             return;
@@ -127,19 +234,21 @@
         if (!mHasFeature) {
             return;
         }
+        installApp(INTENT_RECEIVER_APK);
+        installApp(INTENT_SENDER_APK);
 
         // Test from parent to managed
         assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CrossProfileUtils",
-                "removeAllFilters", mUserId));
+                "testRemoveAllFilters", mUserId));
         assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CrossProfileUtils",
-                "addManagedCanAccessParentFilters", mUserId));
+                "testAddManagedCanAccessParentFilters", mUserId));
         assertTrue(runDeviceTestsAsUser(INTENT_SENDER_PKG, ".ContentTest", 0));
 
         // Test from managed to parent
         assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CrossProfileUtils",
-                "removeAllFilters", mUserId));
+                "testRemoveAllFilters", mUserId));
         assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CrossProfileUtils",
-                "addParentCanAccessManagedFilters", mUserId));
+                "testAddParentCanAccessManagedFilters", mUserId));
         assertTrue(runDeviceTestsAsUser(INTENT_SENDER_PKG, ".ContentTest", mUserId));
 
     }
@@ -148,16 +257,18 @@
         if (!mHasFeature) {
             return;
         }
+        installApp(INTENT_RECEIVER_APK);
+        installApp(INTENT_SENDER_APK);
 
         assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CrossProfileUtils",
-                "allowCrossProfileCopyPaste", mUserId));
+                "testAllowCrossProfileCopyPaste", mUserId));
         // Test that managed can see what is copied in the parent.
         testCrossProfileCopyPasteInternal(mUserId, true);
         // Test that the parent can see what is copied in managed.
         testCrossProfileCopyPasteInternal(0, true);
 
         assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CrossProfileUtils",
-                "disallowCrossProfileCopyPaste", mUserId));
+                "testDisallowCrossProfileCopyPaste", mUserId));
         // Test that managed can still see what is copied in the parent.
         testCrossProfileCopyPasteInternal(mUserId, true);
         // Test that the parent cannot see what is copied in managed.
@@ -166,10 +277,11 @@
 
     private void testCrossProfileCopyPasteInternal(int userId, boolean shouldSucceed)
             throws DeviceNotAvailableException {
-        final String direction = (userId == 0) ? "addManagedCanAccessParentFilters"
-                : "addParentCanAccessManagedFilters";
+        final String direction = (userId == 0)
+                ? "testAddManagedCanAccessParentFilters"
+                : "testAddParentCanAccessManagedFilters";
         assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CrossProfileUtils",
-                "removeAllFilters", mUserId));
+                "testRemoveAllFilters", mUserId));
         assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CrossProfileUtils",
                 direction, mUserId));
         if (shouldSucceed) {
@@ -191,18 +303,25 @@
         if (!mHasFeature) {
             return;
         }
+        // If adb is running as root, then the adb uid is 0 instead of SHELL_UID,
+        // so the DISALLOW_DEBUGGING_FEATURES restriction does not work and this test
+        // fails.
+        if (getDevice().isAdbRoot()) {
+            CLog.logAndDisplay(LogLevel.INFO,
+                    "Cannot test testNoDebuggingFeaturesRestriction() in eng/userdebug build");
+            return;
+        }
         String restriction = "no_debugging_features";  // UserManager.DISALLOW_DEBUGGING_FEATURES
-        String command = "add-restriction";
 
         String addRestrictionCommandOutput =
-                changeUserRestrictionForUser(restriction, command, mUserId);
+                changeUserRestrictionForUser(restriction, ADD_RESTRICTION_COMMAND, mUserId);
         assertTrue("Command was expected to succeed " + addRestrictionCommandOutput,
                 addRestrictionCommandOutput.contains("Status: ok"));
 
         // This should now fail, as the shell is not available to start activities under a different
         // user once the restriction is in place.
         addRestrictionCommandOutput =
-                changeUserRestrictionForUser(restriction, command, mUserId);
+                changeUserRestrictionForUser(restriction, ADD_RESTRICTION_COMMAND, mUserId);
         assertTrue(
                 "Expected SecurityException when starting the activity "
                         + addRestrictionCommandOutput,
@@ -226,6 +345,52 @@
                 "testGetRemoteDevice", mUserId));
     }
 
+    public void testCameraPolicy() throws Exception {
+        boolean hasCamera = hasDeviceFeature(FEATURE_CAMERA);
+        if (!mHasFeature || !hasCamera) {
+            return;
+        }
+        try {
+            setDeviceAdmin(MANAGED_PROFILE_PKG + "/.PrimaryUserDeviceAdmin");
+
+            // Disable managed profile camera.
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CameraPolicyTest",
+                    "testDisableCameraInManagedProfile",
+                    mUserId));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CameraPolicyTest",
+                    "testIsCameraEnabledInPrimaryProfile",
+                    0));
+
+            // Enable managed profile camera.
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CameraPolicyTest",
+                    "testEnableCameraInManagedProfile",
+                    mUserId));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CameraPolicyTest",
+                    "testIsCameraEnabledInPrimaryProfile",
+                    0));
+
+            // Disable primary profile camera.
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CameraPolicyTest",
+                    "testDisableCameraInPrimaryProfile",
+                    0));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CameraPolicyTest",
+                    "testIsCameraEnabledInManagedProfile",
+                    mUserId));
+
+            // Enable primary profile camera.
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CameraPolicyTest",
+                    "testEnableCameraInPrimaryProfile",
+                    0));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".CameraPolicyTest",
+                    "testIsCameraEnabledInManagedProfile",
+                    mUserId));
+        } finally {
+            final String adminHelperClass = ".PrimaryUserAdminHelper";
+            assertTrue("Clear device admin failed", runDeviceTestsAsUser(MANAGED_PROFILE_PKG,
+                    adminHelperClass, "testClearDeviceAdmin", 0 /* user 0 */));
+        }
+    }
+
     public void testManagedContacts() throws Exception {
         if (!mHasFeature) {
             return;
@@ -234,39 +399,115 @@
         try {
             // Insert Primary profile Contacts
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
-                    "testPrimaryProfilePhoneLookup_insertedAndfound", 0));
+                    "testPrimaryProfilePhoneAndEmailLookup_insertedAndfound", 0));
             // Insert Managed profile Contacts
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
-                    "testManagedProfilePhoneLookup_insertedAndfound", mUserId));
+                    "testManagedProfilePhoneAndEmailLookup_insertedAndfound", mUserId));
+            // Insert a primary contact with same phone & email as other enterprise contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileDuplicatedPhoneEmailContact_insertedAndfound", 0));
+            // Insert a enterprise contact with same phone & email as other primary contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileDuplicatedPhoneEmailContact_insertedAndfound", mUserId));
+
 
             // Set cross profile caller id to enabled
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
                     "testSetCrossProfileCallerIdDisabled_false", mUserId));
 
-            // Managed user can use ENTERPRISE_CONTENT_FILTER_URI
-            // To access managed contacts but not primary contacts
+            // Primary user cannot use ordinary phone/email lookup api to access managed contacts
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
-                    "testManagedProfilePhoneLookup_canAccessEnterpriseContact", mUserId));
+                    "testPrimaryProfilePhoneLookup_canNotAccessEnterpriseContact", 0));
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
-                    "testManagedProfilePhoneLookup_canNotAccessPrimaryContact", mUserId));
-
-            // Primary user can use ENTERPRISE_CONTENT_FILTER_URI
-            // To access both primary and managed contacts
+                    "testPrimaryProfileEmailLookup_canNotAccessEnterpriseContact", 0));
+            // Primary user can use ENTERPRISE_CONTENT_FILTER_URI to access primary contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEnterprisePhoneLookup_canAccessPrimaryContact", 0));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEnterpriseEmailLookup_canAccessPrimaryContact", 0));
+            // Primary user can use ENTERPRISE_CONTENT_FILTER_URI to access managed profile contacts
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
                     "testPrimaryProfileEnterprisePhoneLookup_canAccessEnterpriseContact", 0));
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
-                    "testPrimaryProfilePhoneLookup_canAccessPrimaryContact", 0));
+                    "testPrimaryProfileEnterpriseEmailLookup_canAccessEnterpriseContact", 0));
+            // When there exist contacts with the same phone/email in primary & enterprise,
+            // primary user can use ENTERPRISE_CONTENT_FILTER_URI to access the primary contact.
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEnterpriseEmailLookupDuplicated_canAccessPrimaryContact",
+                    0));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEnterprisePhoneLookupDuplicated_canAccessPrimaryContact",
+                    0));
+
+            // Make sure SIP enterprise lookup works too.
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEnterpriseSipLookup_canAccessEnterpriseContact", 0));
+
+            // Managed user cannot use ordinary phone/email lookup api to access primary contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfilePhoneLookup_canNotAccessPrimaryContact", mUserId));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEmailLookup_canNotAccessPrimaryContact", mUserId));
+            // Managed user can use ENTERPRISE_CONTENT_FILTER_URI to access enterprise contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterprisePhoneLookup_canAccessEnterpriseContact", mUserId));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterpriseEmailLookup_canAccessEnterpriseContact", mUserId));
+            // Managed user cannot use ENTERPRISE_CONTENT_FILTER_URI to access primary contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterprisePhoneLookup_canNotAccessPrimaryContact", mUserId));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterpriseEmailLookup_canNotAccessPrimaryContact", mUserId));
+            // When there exist contacts with the same phone/email in primary & enterprise,
+            // managed user can use ENTERPRISE_CONTENT_FILTER_URI to access the enterprise contact.
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterpriseEmailLookupDuplicated_canAccessEnterpriseContact",
+                    mUserId));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterprisePhoneLookupDuplicated_canAccessEnterpriseContact",
+                    mUserId));
 
             // Set cross profile caller id to disabled
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
                     "testSetCrossProfileCallerIdDisabled_true", mUserId));
 
-            // Primary user cannot use ENTERPRISE_CONTENT_FILTER_URI to access managed contacts
+            // Primary user cannot use ordinary phone/email lookup api to access managed contacts
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
                     "testPrimaryProfilePhoneLookup_canNotAccessEnterpriseContact", 0));
-            // Managed user cannot use ENTERPRISE_CONTENT_FILTER_URI to access primary contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEmailLookup_canNotAccessEnterpriseContact", 0));
+            // Primary user cannot use ENTERPRISE_CONTENT_FILTER_URI to access managed contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEnterprisePhoneLookup_canNotAccessEnterpriseContact", 0));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEnterpriseEmailLookup_canNotAccessEnterpriseContact", 0));
+            // When there exist contacts with the same phone/email in primary & enterprise,
+            // primary user can use ENTERPRISE_CONTENT_FILTER_URI to access primary contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEnterpriseEmailLookupDuplicated_canAccessPrimaryContact",
+                    0));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testPrimaryProfileEnterprisePhoneLookupDuplicated_canAccessPrimaryContact",
+                    0));
+
+            // Managed user cannot use ordinary phone/email lookup api to access primary contacts
             assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
                     "testManagedProfilePhoneLookup_canNotAccessPrimaryContact", mUserId));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEmailLookup_canNotAccessPrimaryContact", mUserId));
+            // Managed user cannot use ENTERPRISE_CONTENT_FILTER_URI to access primary contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterprisePhoneLookup_canNotAccessPrimaryContact", mUserId));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterpriseEmailLookup_canNotAccessPrimaryContact", mUserId));
+            // When there exist contacts with the same phone/email in primary & enterprise,
+            // managed user can use ENTERPRISE_CONTENT_FILTER_URI to access enterprise contacts
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterpriseEmailLookupDuplicated_canAccessEnterpriseContact",
+                    mUserId));
+            assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                    "testManagedProfileEnterprisePhoneLookupDuplicated_canAccessEnterpriseContact",
+                    mUserId));
         } finally {
             // Clean up in managed profile and primary profile
             runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
@@ -276,6 +517,64 @@
         }
     }
 
+    public void testBluetoothContactSharingDisabled() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".ContactsTest",
+                "testSetBluetoothContactSharingDisabled_setterAndGetter", mUserId));
+    }
+
+    public void testDelegatedCertInstaller() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        installApp(CERT_INSTALLER_APK);
+        setDeviceAdmin(MANAGED_PROFILE_PKG + "/.PrimaryUserDeviceAdmin");
+
+        final String adminHelperClass = ".PrimaryUserAdminHelper";
+        try {
+            assertTrue("Set lockscreen password failed", runDeviceTestsAsUser(MANAGED_PROFILE_PKG,
+                    adminHelperClass, "testSetPassword", 0 /* user 0 */));
+            assertTrue("DelegatedCertInstaller failed", runDeviceTestsAsUser(MANAGED_PROFILE_PKG,
+                    ".DelegatedCertInstallerTest", mUserId));
+        } finally {
+            // Reset lockscreen password and remove device admin.
+            assertTrue("Clear lockscreen password failed", runDeviceTestsAsUser(MANAGED_PROFILE_PKG,
+                    adminHelperClass, "testClearPassword", 0 /* user 0 */));
+            assertTrue("Clear device admin failed", runDeviceTestsAsUser(MANAGED_PROFILE_PKG,
+                    adminHelperClass, "testClearDeviceAdmin", 0 /* user 0 */));
+        }
+    }
+
+    public void testCannotSetProfileOwnerAgain() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        // verify that we can't set the same admin receiver as profile owner again
+        assertFalse(setProfileOwner(
+                MANAGED_PROFILE_PKG + "/" + ADMIN_RECEIVER_TEST_CLASS, mUserId));
+
+        // verify that we can't set a different admin receiver as profile owner
+        installAppAsUser(DEVICE_OWNER_APK, mUserId);
+        assertFalse(setProfileOwner(DEVICE_OWNER_PKG + "/" + DEVICE_OWNER_ADMIN, mUserId));
+    }
+
+    public void testCannotSetDeviceOwnerWhenProfilePresent() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+
+        try {
+            installApp(DEVICE_OWNER_APK);
+            assertFalse(setDeviceOwner(DEVICE_OWNER_PKG + "/" + DEVICE_OWNER_ADMIN));
+        } finally {
+            // make sure we clean up in case we succeeded in setting the device owner
+            runDeviceTests(DEVICE_OWNER_PKG, DEVICE_OWNER_CLEAR);
+            getDevice().uninstallPackage(DEVICE_OWNER_PKG);
+        }
+    }
+
     public void testNfcRestriction() throws Exception {
         if (!mHasFeature || !mHasNfcFeature) {
             return;
@@ -300,6 +599,47 @@
                 "testNfcShareEnabled", 0));
     }
 
+    public void testCrossProfileWidgets() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+
+        try {
+            installApp(WIDGET_PROVIDER_APK);
+            getDevice().executeShellCommand("appwidget grantbind --user 0 --package "
+                    + WIDGET_PROVIDER_PKG);
+            startWidgetHostService();
+
+            String commandOutput = changeCrossProfileWidgetForUser(WIDGET_PROVIDER_PKG,
+                    "add-cross-profile-widget", mUserId);
+            assertTrue("Command was expected to succeed " + commandOutput,
+                    commandOutput.contains("Status: ok"));
+
+            assertTrue(runDeviceTests(MANAGED_PROFILE_PKG, ".CrossProfileWidgetTest",
+                    "testCrossProfileWidgetProviderAdded", mUserId));
+            assertTrue(runDeviceTests(MANAGED_PROFILE_PKG, ".CrossProfileWidgetPrimaryUserTest",
+                    "testHasCrossProfileWidgetProvider_true", 0));
+            assertTrue(runDeviceTests(MANAGED_PROFILE_PKG, ".CrossProfileWidgetPrimaryUserTest",
+                    "testHostReceivesWidgetUpdates_true", 0));
+
+            commandOutput = changeCrossProfileWidgetForUser(WIDGET_PROVIDER_PKG,
+                    "remove-cross-profile-widget", mUserId);
+            assertTrue("Command was expected to succeed " + commandOutput,
+                    commandOutput.contains("Status: ok"));
+
+            assertTrue(runDeviceTests(MANAGED_PROFILE_PKG, ".CrossProfileWidgetTest",
+                    "testCrossProfileWidgetProviderRemoved", mUserId));
+            assertTrue(runDeviceTests(MANAGED_PROFILE_PKG, ".CrossProfileWidgetPrimaryUserTest",
+                    "testHasCrossProfileWidgetProvider_false", 0));
+            assertTrue(runDeviceTests(MANAGED_PROFILE_PKG, ".CrossProfileWidgetPrimaryUserTest",
+                    "testHostReceivesWidgetUpdates_false", 0));
+        } finally {
+            changeCrossProfileWidgetForUser(WIDGET_PROVIDER_PKG, "remove-cross-profile-widget",
+                    mUserId);
+            getDevice().uninstallPackage(WIDGET_PROVIDER_PKG);
+        }
+    }
+
     private void disableActivityForUser(String activityName, int userId)
             throws DeviceNotAvailableException {
         String command = "am start -W --user " + userId
@@ -316,10 +656,44 @@
                 + " -c android.intent.category.DEFAULT "
                 + " --es extra-command " + command
                 + " --es extra-restriction-key " + key
-                + " " + MANAGED_PROFILE_PKG + "/.UserRestrictionActivity";
+                + " " + MANAGED_PROFILE_PKG + "/.SetPolicyActivity";
         String commandOutput = getDevice().executeShellCommand(adbCommand);
         CLog.logAndDisplay(LogLevel.INFO,
                 "Output for command " + adbCommand + ": " + commandOutput);
         return commandOutput;
     }
+
+    private String changeCrossProfileWidgetForUser(String packageName, String command, int userId)
+            throws DeviceNotAvailableException {
+        String adbCommand = "am start -W --user " + userId
+                + " -c android.intent.category.DEFAULT "
+                + " --es extra-command " + command
+                + " --es extra-package-name " + packageName
+                + " " + MANAGED_PROFILE_PKG + "/.SetPolicyActivity";
+        String commandOutput = getDevice().executeShellCommand(adbCommand);
+        CLog.logAndDisplay(LogLevel.INFO,
+                "Output for command " + adbCommand + ": " + commandOutput);
+        return commandOutput;
+    }
+
+    // status should be one of never, undefined, ask, always
+    private void changeVerificationStatus(int userId, String packageName, String status)
+            throws DeviceNotAvailableException {
+        String command = "pm set-app-link --user " + userId + " " + packageName + " " + status;
+        CLog.logAndDisplay(LogLevel.INFO, "Output for command " + command + ": "
+                + getDevice().executeShellCommand(command));
+    }
+
+    protected void startWidgetHostService() throws Exception {
+        String command = "am startservice --user 0 "
+                + "-a " + WIDGET_PROVIDER_PKG + ".REGISTER_CALLBACK "
+                + "--ei user-extra " + getUserSerialNumber(mUserId)
+                + " " + WIDGET_PROVIDER_PKG + "/.SimpleAppWidgetHostService";
+        CLog.logAndDisplay(LogLevel.INFO, "Output for command " + command + ": "
+              + getDevice().executeShellCommand(command));
+    }
+
+    private void assertAppLinkResult(String methodName) throws DeviceNotAvailableException {
+        assertTrue(runDeviceTestsAsUser(INTENT_SENDER_PKG, ".AppLinkTest", methodName, mUserId));
+    }
 }
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedDeviceOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedDeviceOwnerTest.java
new file mode 100644
index 0000000..b996de3
--- /dev/null
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedDeviceOwnerTest.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.devicepolicy;
+
+import com.android.ddmlib.Log.LogLevel;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.log.LogUtil.CLog;
+
+import junit.framework.AssertionFailedError;
+
+/**
+ * Set of tests for device owner use cases that also apply to profile owners.
+ * Tests that should be run identically in both cases are added in DeviceAndProfileOwnerTest.
+ */
+public class MixedDeviceOwnerTest extends DeviceAndProfileOwnerTest {
+
+    private static final String CLEAR_DEVICE_OWNER_TEST_CLASS =
+            DEVICE_ADMIN_PKG + ".ClearDeviceOwnerTest";
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        if (mHasFeature) {
+            mUserId = USER_OWNER;
+
+            installApp(DEVICE_ADMIN_APK);
+            assertTrue("Failed to set device owner",
+                    setDeviceOwner(DEVICE_ADMIN_PKG + "/" + ADMIN_RECEIVER_TEST_CLASS));
+        }
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mHasFeature) {
+            assertTrue("Failed to remove device owner.",
+                    runDeviceTests(DEVICE_ADMIN_PKG, CLEAR_DEVICE_OWNER_TEST_CLASS));
+        }
+        super.tearDown();
+    }
+
+    // All tests for this class are defined in DeviceAndProfileOwnerTest
+}
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedProfileOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedProfileOwnerTest.java
new file mode 100644
index 0000000..bcc5bf9
--- /dev/null
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedProfileOwnerTest.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.devicepolicy;
+
+import com.android.ddmlib.Log.LogLevel;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.log.LogUtil.CLog;
+
+import junit.framework.AssertionFailedError;
+
+/**
+ * Set of tests for profile owner use cases that also apply to device owners.
+ * Tests that should be run identically in both cases are added in DeviceAndProfileOwnerTest.
+ */
+public class MixedProfileOwnerTest extends DeviceAndProfileOwnerTest {
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        // We need managed users to be supported in order to create a profile of the user owner.
+        mHasFeature &= hasDeviceFeature("android.software.managed_users");
+
+        if (mHasFeature) {
+            removeTestUsers();
+            mUserId = createManagedProfile();
+
+            installAppAsUser(DEVICE_ADMIN_APK, mUserId);
+            setProfileOwnerOrFail(DEVICE_ADMIN_PKG + "/" + ADMIN_RECEIVER_TEST_CLASS, mUserId);
+            startUser(mUserId);
+        }
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mHasFeature) {
+            removeUser(mUserId);
+        }
+        super.tearDown();
+    }
+
+    // Most tests for this class are defined in DeviceAndProfileOwnerTest
+
+    /**
+     * Verify that screenshots are still possible for activities in the primary user when the policy
+     * is set on the profile owner.
+     */
+    public void testScreenCaptureDisabled_allowedPrimaryUser() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        executeDeviceTestMethod(".ScreenCaptureDisabledTest", "testSetScreenCaptureDisabled_true");
+        // start the ScreenCaptureDisabledActivity in the primary user
+        installAppAsUser(DEVICE_ADMIN_APK, USER_OWNER);
+        String command = "am start -W --user 0 " + DEVICE_ADMIN_PKG + "/"
+                + DEVICE_ADMIN_PKG + ".ScreenCaptureDisabledActivity";
+        getDevice().executeShellCommand(command);
+        executeDeviceTestMethod(".ScreenCaptureDisabledTest", "testScreenCapturePossible");
+    }
+}
diff --git a/hostsidetests/dumpsys/Android.mk b/hostsidetests/dumpsys/Android.mk
index 51ea31f..5b63199 100644
--- a/hostsidetests/dumpsys/Android.mk
+++ b/hostsidetests/dumpsys/Android.mk
@@ -18,8 +18,6 @@
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
-LOCAL_MODULE_TAGS := optional
-
 # Must match the package name in CtsTestCaseList.mk
 LOCAL_MODULE := CtsDumpsysHostTestCases
 
diff --git a/hostsidetests/dumpsys/src/android/dumpsys/cts/DumpsysHostTest.java b/hostsidetests/dumpsys/src/android/dumpsys/cts/DumpsysHostTest.java
index e12135a..a787cdd 100644
--- a/hostsidetests/dumpsys/src/android/dumpsys/cts/DumpsysHostTest.java
+++ b/hostsidetests/dumpsys/src/android/dumpsys/cts/DumpsysHostTest.java
@@ -49,11 +49,6 @@
      * @throws Exception
      */
     public void testProcstatsOutput() throws Exception {
-        if (mDevice.getApiLevel() < 19) {
-            Log.i(TAG, "No Procstats output before KitKat, skipping test.");
-            return;
-        }
-
         String procstats = mDevice.executeShellCommand("dumpsys procstats -c");
         assertNotNull(procstats);
         assertTrue(procstats.length() > 0);
@@ -338,11 +333,6 @@
      * @throws Exception
      */
     public void testBatterystatsOutput() throws Exception {
-        if (mDevice.getApiLevel() < 21) {
-            Log.i(TAG, "Batterystats output before Lollipop, skipping test.");
-            return;
-        }
-
         String batterystats = mDevice.executeShellCommand("dumpsys batterystats --checkin");
         assertNotNull(batterystats);
         assertTrue(batterystats.length() > 0);
@@ -359,7 +349,12 @@
                     continue;
                 }
 
-                String[] parts = line.split(",");
+
+                // With a default limit of 0, empty strings at the end are discarded.
+                // We still consider the empty string as a valid value in some cases.
+                // Using any negative number for the limit will preserve a trailing empty string.
+                // @see String#split(String, int)
+                String[] parts = line.split(",", -1);
                 assertInteger(parts[0]); // old version
                 assertInteger(parts[1]); // UID
                 switch (parts[2]) { // aggregation type
@@ -658,23 +653,22 @@
     }
 
     private void checkMisc(String[] parts) {
-        assertTrue(parts.length >= 20);
+        assertTrue(parts.length >= 19);
         assertInteger(parts[4]);      // screenOnTime
         assertInteger(parts[5]);      // phoneOnTime
-        assertInteger(parts[6]);      // wifiOnTime
-        assertInteger(parts[7]);      // wifiRunningTime
-        assertInteger(parts[8]);      // bluetoothOnTime
-        assertInteger(parts[9]);      // mobileRxTotalBytes
-        assertInteger(parts[10]);     // mobileTxTotalBytes
-        assertInteger(parts[11]);     // wifiRxTotalBytes
-        assertInteger(parts[12]);     // wifiTxTotalBytes
-        assertInteger(parts[13]);     // fullWakeLockTimeTotal
-        assertInteger(parts[14]);     // partialWakeLockTimeTotal
-        assertEquals("0", parts[15]); // legacy input event count
-        assertInteger(parts[16]);     // mobileRadioActiveTime
-        assertInteger(parts[17]);     // mobileRadioActiveAdjustedTime
-        assertInteger(parts[18]);     // interactiveTime
-        assertInteger(parts[19]);     // lowPowerModeEnabledTime
+        assertInteger(parts[6]);      // fullWakeLockTimeTotal
+        assertInteger(parts[7]);      // partialWakeLockTimeTotal
+        assertInteger(parts[8]);      // mobileRadioActiveTime
+        assertInteger(parts[9]);      // mobileRadioActiveAdjustedTime
+        assertInteger(parts[10]);     // interactiveTime
+        assertInteger(parts[11]);     // lowPowerModeEnabledTime
+        assertInteger(parts[12]);     // connChanges
+        assertInteger(parts[13]);     // deviceIdleModeEnabledTime
+        assertInteger(parts[14]);     // deviceIdleModeEnabledCount
+        assertInteger(parts[15]);     // deviceIdlingTime
+        assertInteger(parts[16]);     // deviceIdlingCount
+        assertInteger(parts[17]);     // mobileRadioActiveCount
+        assertInteger(parts[18]);     // mobileRadioActiveUnknownTime
     }
 
     private void checkGlobalNetwork(String[] parts) {
@@ -794,13 +788,14 @@
     }
 
     private void checkChargeDischargeStep(String[] parts) {
-        assertEquals(8, parts.length);
+        assertEquals(9, parts.length);
         assertInteger(parts[4]); // duration
         if (!parts[5].equals("?")) {
             assertInteger(parts[5]); // level
         }
         assertNotNull(parts[6]); // screen
         assertNotNull(parts[7]); // power-save
+        assertNotNull(parts[8]); // device-idle
     }
 
     private void checkDischargeTimeRemain(String[] parts) {
@@ -813,11 +808,77 @@
         assertInteger(parts[4]); // chargeTimeRemaining
     }
 
-    private static void assertInteger(String input) {
+    /**
+     * Tests the output of "dumpsys gfxinfo framestats".
+     *
+     * @throws Exception
+     */
+    public void testGfxinfoFramestats() throws Exception {
+        final String MARKER = "---PROFILEDATA---";
+        final int TIMESTAMP_COUNT = 14;
+
+        String frameinfo = mDevice.executeShellCommand("dumpsys gfxinfo com.android.systemui framestats");
+        assertNotNull(frameinfo);
+        assertTrue(frameinfo.length() > 0);
+        int profileStart = frameinfo.indexOf(MARKER);
+        int profileEnd = frameinfo.indexOf(MARKER, profileStart + 1);
+        assertTrue(profileStart >= 0);
+        assertTrue(profileEnd > profileStart);
+        String profileData = frameinfo.substring(profileStart + MARKER.length(), profileEnd);
+        assertTrue(profileData.length() > 0);
+        boolean foundAtLeastOneRow = false;
+        try (BufferedReader reader = new BufferedReader(
+                new StringReader(profileData))) {
+            String line;
+            // First line needs to be the headers
+            while ((line = reader.readLine()) != null && line.isEmpty()) {}
+
+            assertNotNull(line);
+            assertTrue("First line was not the expected header",
+                    line.startsWith("Flags,IntendedVsync,Vsync,OldestInputEvent" +
+                            ",NewestInputEvent,HandleInputStart,AnimationStart" +
+                            ",PerformTraversalsStart,DrawStart,SyncQueued,SyncStart" +
+                            ",IssueDrawCommandsStart,SwapBuffers,FrameCompleted"));
+
+            long[] numparts = new long[TIMESTAMP_COUNT];
+            while ((line = reader.readLine()) != null && !line.isEmpty()) {
+
+                String[] parts = line.split(",");
+                assertTrue(parts.length >= TIMESTAMP_COUNT);
+                for (int i = 0; i < TIMESTAMP_COUNT; i++) {
+                    numparts[i] = assertInteger(parts[i]);
+                }
+                if (numparts[0] != 0) {
+                    continue;
+                }
+                // assert VSYNC >= INTENDED_VSYNC
+                assertTrue(numparts[2] >= numparts[1]);
+                // assert time is flowing forwards, skipping index 3 & 4
+                // as those are input timestamps that may or may not be present
+                assertTrue(numparts[5] >= numparts[2]);
+                for (int i = 6; i < TIMESTAMP_COUNT; i++) {
+                    assertTrue("Index " + i + " did not flow forward, " +
+                            numparts[i] + " not larger than " + numparts[i - 1],
+                            numparts[i] >= numparts[i-1]);
+                }
+                long totalDuration = numparts[13] - numparts[1];
+                assertTrue("Frame did not take a positive amount of time to process",
+                        totalDuration > 0);
+                assertTrue("Bogus frame duration, exceeds 100 seconds",
+                        totalDuration < 100000000000L);
+                foundAtLeastOneRow = true;
+            }
+        }
+        assertTrue(foundAtLeastOneRow);
+    }
+
+    private static long assertInteger(String input) {
         try {
-            Long.parseLong(input);
+            return Long.parseLong(input);
         } catch (NumberFormatException e) {
             fail("Expected an integer but found \"" + input + "\"");
+            // Won't be hit, above throws AssertException
+            return -1;
         }
     }
 
diff --git a/hostsidetests/monkey/test-apps/CtsMonkeyApp/Android.mk b/hostsidetests/monkey/test-apps/CtsMonkeyApp/Android.mk
index f6543fb..c04d4b2 100644
--- a/hostsidetests/monkey/test-apps/CtsMonkeyApp/Android.mk
+++ b/hostsidetests/monkey/test-apps/CtsMonkeyApp/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/monkey/test-apps/CtsMonkeyApp/AndroidManifest.xml b/hostsidetests/monkey/test-apps/CtsMonkeyApp/AndroidManifest.xml
index a3dfc83..efb1288 100644
--- a/hostsidetests/monkey/test-apps/CtsMonkeyApp/AndroidManifest.xml
+++ b/hostsidetests/monkey/test-apps/CtsMonkeyApp/AndroidManifest.xml
@@ -18,14 +18,18 @@
 
     <application android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
 
-        <activity android:name=".MonkeyActivity">
+        <activity
+            android:name=".MonkeyActivity"
+            android:screenOrientation="locked">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-        
-        <activity android:name=".BaboonActivity">
+
+        <activity
+            android:name=".BaboonActivity"
+            android:screenOrientation="locked">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.MONKEY" />
diff --git a/hostsidetests/monkey/test-apps/CtsMonkeyApp2/Android.mk b/hostsidetests/monkey/test-apps/CtsMonkeyApp2/Android.mk
index 29bf9d6..b3cb181 100644
--- a/hostsidetests/monkey/test-apps/CtsMonkeyApp2/Android.mk
+++ b/hostsidetests/monkey/test-apps/CtsMonkeyApp2/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/net/app/Android.mk b/hostsidetests/net/app/Android.mk
index 29b620d..055287a 100644
--- a/hostsidetests/net/app/Android.mk
+++ b/hostsidetests/net/app/Android.mk
@@ -29,4 +29,4 @@
 LOCAL_PROGUARD_ENABLED := disabled
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/os/Android.mk b/hostsidetests/os/Android.mk
new file mode 100644
index 0000000..6962e0c
--- /dev/null
+++ b/hostsidetests/os/Android.mk
@@ -0,0 +1,35 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+# Must match the package name in CtsTestCaseList.mk
+LOCAL_MODULE := CtsOsHostTestCases
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt
+
+LOCAL_CTS_TEST_PACKAGE := android.host.os
+
+LOCAL_CTS_MODULE_CONFIG := $(LOCAL_PATH)/$(CTS_MODULE_TEST_CONFIG)
+
+include $(BUILD_CTS_HOST_JAVA_LIBRARY)
+
+# Build the test APKs using their own makefiles
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hostsidetests/os/AndroidTest.xml b/hostsidetests/os/AndroidTest.xml
new file mode 100644
index 0000000..6694c30
--- /dev/null
+++ b/hostsidetests/os/AndroidTest.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="CTS package preparer for install/uninstall of the apk used as a test operation target">
+    <include name="common-config" />
+    <option name="cts-apk-installer:test-file-name" value="CtsDeviceOsTestApp.apk" />
+</configuration>
diff --git a/hostsidetests/os/app/Android.mk b/hostsidetests/os/app/Android.mk
new file mode 100644
index 0000000..46861d69
--- /dev/null
+++ b/hostsidetests/os/app/Android.mk
@@ -0,0 +1,28 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# Don't include this package in any target.
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_PACKAGE_NAME := CtsDeviceOsTestApp
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/os/app/AndroidManifest.xml b/hostsidetests/os/app/AndroidManifest.xml
new file mode 100755
index 0000000..103cf63
--- /dev/null
+++ b/hostsidetests/os/app/AndroidManifest.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.app.os.test">
+
+    <application>
+        <activity android:name=".TestNonExported"
+                android:exported="false" />
+    </application>
+</manifest>
+
diff --git a/hostsidetests/os/app/src/com/android/cts/app/os/test/TestNonExported.java b/hostsidetests/os/app/src/com/android/cts/app/os/test/TestNonExported.java
new file mode 100644
index 0000000..c865c89
--- /dev/null
+++ b/hostsidetests/os/app/src/com/android/cts/app/os/test/TestNonExported.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.app.os.test;
+
+import android.app.Activity;
+
+/**
+ * Should never be launched: intentionally not exported
+ */
+public class TestNonExported extends Activity {
+}
diff --git a/hostsidetests/os/src/com/android/cts/app/os/OsHostTests.java b/hostsidetests/os/src/com/android/cts/app/os/OsHostTests.java
new file mode 100644
index 0000000..d01a521
--- /dev/null
+++ b/hostsidetests/os/src/com/android/cts/app/os/OsHostTests.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.app.os;
+
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.CollectingOutputReceiver;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+
+public class OsHostTests extends DeviceTestCase implements IBuildReceiver {
+    private static final String TEST_APP_PACKAGE = "com.android.cts.app.os.test";
+    private static final String TEST_NON_EXPORTED_ACTIVITY_CLASS = "TestNonExported";
+
+    private static final String START_NON_EXPORTED_ACTIVITY_COMMAND = String.format(
+            "am start -n %s/%s.%s",
+            TEST_APP_PACKAGE, TEST_APP_PACKAGE, TEST_NON_EXPORTED_ACTIVITY_CLASS);
+
+    /**
+     * A reference to the device under test.
+     */
+    private ITestDevice mDevice;
+
+    @Override
+    public void setBuild(IBuildInfo buildInfo) {
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        // Get the device, this gives a handle to run commands and install APKs.
+        mDevice = getDevice();
+    }
+
+    /**
+     * Test whether non-exported activities are properly not launchable.
+     *
+     * @throws Exception
+     */
+    public void testNonExportedActivities() throws Exception {
+        // Attempt to launch the non-exported activity in the test app
+        CollectingOutputReceiver outputReceiver = new CollectingOutputReceiver();
+        mDevice.executeShellCommand(START_NON_EXPORTED_ACTIVITY_COMMAND, outputReceiver);
+        final String output = outputReceiver.getOutput();
+
+        assertTrue(output.contains("Permission Denial") && output.contains(" not exported"));
+    }
+}
diff --git a/hostsidetests/theme/Android.mk b/hostsidetests/theme/Android.mk
index 71027c7..188bf7a 100644
--- a/hostsidetests/theme/Android.mk
+++ b/hostsidetests/theme/Android.mk
@@ -29,6 +29,8 @@
 
 LOCAL_CTS_TEST_PACKAGE := android.host.theme
 
+LOCAL_SDK_VERSION := current
+
 include $(BUILD_CTS_HOST_JAVA_LIBRARY)
 
 include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hostsidetests/theme/README b/hostsidetests/theme/README
new file mode 100644
index 0000000..bce711a
--- /dev/null
+++ b/hostsidetests/theme/README
@@ -0,0 +1,73 @@
+* Copyright (C) 2015 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.
+
+
+INTRODUCTION
+
+The Android theme tests ensure that the Holo and Material themes have not been
+modified. They consist of API-specific sets of reference images representing
+specific themes and widgets that must be identical across devices. To pass the
+theme tests, a device must be able to generate images that are identical to the
+reference images.
+
+NOTE: Reference images should only be updated by the CTS test maintainers. Any
+      modifications to the reference images will invalidate the test results.
+
+
+INSTRUCTIONS
+
+I. Generating reference images (CTS maintainers only)
+
+Reference images are typically only generated for new API revisions. To
+generate a new set of reference images, do the following:
+
+  1. Connect one device for each DPI bucket (ldpi, xxxhdpi, etc.) that you wish
+     to generate references images for. Confirm that all devices are connected
+     with:
+
+     adb devices
+
+  2. Image generation occurs on all devices in parallel. Resulting sets of
+     reference images are saved in assets/<api>/<dpi>.zip and will overwrite
+     any existing sets. Image generation may be started using:
+
+     .cts/hostsidetests/theme/generate_images.sh
+
+A complete collection of reference images for a given API revision must include
+a set for each possible DPI bucket (tvdpi, xxhdpi, etc.) that may be tested.
+
+
+II. Building theme tests
+
+1. If you have not already built the CTS tests, run an initial make:
+
+   make cts -j32
+
+2. Subsequent changes to the theme tests, including changes to the reference
+   images, may be built using mmm:
+
+   mmm cts/hostsidetests/theme -j32
+
+
+III. Running theme tests
+
+1. Connect the device that you wish to test. Confirm that is is connected with:
+
+   adb devices
+
+2. Run the theme tests using cts-tradefed:
+
+   cts-tradefed run cts -c android.theme.cts.ThemeHostTest
+
+3. Wait for the tests to complete. This should take less than five minutes.
diff --git a/hostsidetests/theme/android_device.py b/hostsidetests/theme/android_device.py
new file mode 100644
index 0000000..97b5fdd
--- /dev/null
+++ b/hostsidetests/theme/android_device.py
@@ -0,0 +1,107 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2015 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.
+#
+
+import os
+import re
+import sys
+import threading
+import subprocess
+import time
+
+# class for running android device from python
+# it will fork the device processor
+class androidDevice(object):
+    def __init__(self, adbDevice):
+        self._adbDevice = adbDevice
+
+    def runAdbCommand(self, cmd):
+        self.waitForAdbDevice()
+        adbCmd = "adb -s %s %s" %(self._adbDevice, cmd)
+        adbProcess = subprocess.Popen(adbCmd.split(" "), bufsize = -1, stdout = subprocess.PIPE)
+        return adbProcess.communicate()
+
+    def runShellCommand(self, cmd):
+        return self.runAdbCommand("shell " + cmd)
+
+    def waitForAdbDevice(self):
+        os.system("adb -s %s wait-for-device" %self._adbDevice)
+
+    def waitForBootComplete(self, timeout = 240):
+        boot_complete = False
+        attempts = 0
+        wait_period = 5
+        while not boot_complete and (attempts*wait_period) < timeout:
+            (output, err) = self.runShellCommand("getprop dev.bootcomplete")
+            output = output.strip()
+            if output == "1":
+                boot_complete = True
+            else:
+                time.sleep(wait_period)
+                attempts += 1
+        if not boot_complete:
+            print "***boot not complete within timeout. will proceed to the next step"
+        return boot_complete
+
+    def installApk(self, apkPath):
+        (out, err) = self.runAdbCommand("install -r -d -g " + apkPath)
+        result = out.split()
+        return (out, err, "Success" in result)
+
+    def uninstallApk(self, package):
+        (out, err) = self.runAdbCommand("uninstall " + package)
+        result = out.split()
+        return "Success" in result
+
+    def runInstrumentationTest(self, option):
+        return self.runShellCommand("am instrument -w " + option)
+
+    def isProcessAlive(self, processName):
+        (out, err) = self.runShellCommand("ps")
+        names = out.split()
+        # very lazy implementation as it does not filter out things like uid
+        # should work mostly unless processName is too simple to overlap with
+        # uid. So only use name like com.android.xyz
+        return processName in names
+
+    def getDensity(self):
+        if "emulator" in self._adbDevice:
+          return int(self.runShellCommand("getprop qemu.sf.lcd_density")[0])
+        else:
+          return int(self.runShellCommand("getprop ro.sf.lcd_density")[0])
+
+    def getSdkLevel(self):
+        return int(self.runShellCommand("getprop ro.build.version.sdk")[0])
+
+    def getOrientation(self):
+        return int(self.runShellCommand("dumpsys | grep SurfaceOrientation")[0].split()[1])
+
+def runAdbDevices():
+    devices = subprocess.check_output(["adb", "devices"])
+    devices = devices.split('\n')[1:]
+
+    deviceSerial = []
+
+    for device in devices:
+        if device is not "":
+            info = device.split('\t')
+            if info[1] == "device":
+                deviceSerial.append(info[0])
+
+    return deviceSerial
+
+if __name__ == '__main__':
+    main(sys.argv)
diff --git a/hostsidetests/theme/app/Android.mk b/hostsidetests/theme/app/Android.mk
index 70623cb..1be2983 100644
--- a/hostsidetests/theme/app/Android.mk
+++ b/hostsidetests/theme/app/Android.mk
@@ -26,6 +26,8 @@
 
 LOCAL_PROGUARD_ENABLED := disabled
 
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 #Flags to tell the Android Asset Packaging Tool not to strip for some densities
diff --git a/hostsidetests/theme/app/AndroidManifest.xml b/hostsidetests/theme/app/AndroidManifest.xml
index 81a4d9d..4e81ab0 100755
--- a/hostsidetests/theme/app/AndroidManifest.xml
+++ b/hostsidetests/theme/app/AndroidManifest.xml
@@ -22,9 +22,10 @@
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
     <application>
         <uses-library android:name="android.test.runner" />
-        <activity android:name=".HoloDeviceActivity">
+        <activity android:name=".ThemeDeviceActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
@@ -37,6 +38,13 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+        <activity android:name=".GenerateImagesActivity"
+                  android:exported="true" />
     </application>
 
+    <!--  self-instrumenting test package. -->
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="android.theme.app"
+                     android:label="Generates Theme reference images"/>
+
 </manifest>
diff --git a/hostsidetests/theme/app/res/layout/holo_test.xml b/hostsidetests/theme/app/res/layout/theme_test.xml
similarity index 100%
rename from hostsidetests/theme/app/res/layout/holo_test.xml
rename to hostsidetests/theme/app/res/layout/theme_test.xml
diff --git a/hostsidetests/theme/app/res/values/strings.xml b/hostsidetests/theme/app/res/values/strings.xml
index a69a2e0..d9d6602 100644
--- a/hostsidetests/theme/app/res/values/strings.xml
+++ b/hostsidetests/theme/app/res/values/strings.xml
@@ -14,8 +14,6 @@
      limitations under the License.
 -->
 <resources>
-    <string name="holo_test_utilities">Holo Test Utilities</string>
-
     <string name="display_info">Display Info</string>
     <string name="display_info_text">Density DPI: %1$d\nDensity Bucket: %2$s\nWidth DP: %3$d\nHeight DP: %4$d</string>
 
diff --git a/hostsidetests/theme/app/src/android/theme/app/DisplayInfoActivity.java b/hostsidetests/theme/app/src/android/theme/app/DisplayInfoActivity.java
index f263eef..530675d 100644
--- a/hostsidetests/theme/app/src/android/theme/app/DisplayInfoActivity.java
+++ b/hostsidetests/theme/app/src/android/theme/app/DisplayInfoActivity.java
@@ -25,7 +25,8 @@
 import android.widget.TextView;
 
 /**
- * An activity to display information about the device, including density bucket and dimensions.
+ * An activity to display information about the device, including density
+ * bucket and dimensions.
  */
 public class DisplayInfoActivity extends Activity {
 
@@ -62,9 +63,15 @@
             case DisplayMetrics.DENSITY_XHIGH:
                 return "xhdpi";
 
+            case DisplayMetrics.DENSITY_360:
+                return "360dpi";
+
             case DisplayMetrics.DENSITY_400:
                 return "400dpi";
 
+            case DisplayMetrics.DENSITY_420:
+                return "420dpi";
+
             case DisplayMetrics.DENSITY_XXHIGH:
                 return "xxhdpi";
 
diff --git a/hostsidetests/theme/app/src/android/theme/app/GenerateBitmapTask.java b/hostsidetests/theme/app/src/android/theme/app/GenerateBitmapTask.java
new file mode 100644
index 0000000..05b6dcf
--- /dev/null
+++ b/hostsidetests/theme/app/src/android/theme/app/GenerateBitmapTask.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2015 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.theme.app;
+
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.CompressFormat;
+import android.graphics.Canvas;
+import android.os.AsyncTask;
+import android.os.Environment;
+import android.util.Log;
+import android.view.View;
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+/**
+ * A task which gets the UI element to render to a bitmap and then saves that
+ * as a PNG asynchronously.
+ */
+class GenerateBitmapTask extends AsyncTask<Void, Void, Boolean> {
+    private static final String TAG = "GenerateBitmapTask";
+
+    private final View mView;
+    private final File mOutDir;
+
+    private Bitmap mBitmap;
+
+    protected final String mName;
+
+    public GenerateBitmapTask(View view, File outDir, String name) {
+        mView = view;
+        mOutDir = outDir;
+        mName = name;
+    }
+
+    @Override
+    protected void onPreExecute() {
+        if (mView.getWidth() == 0 || mView.getHeight() == 0) {
+            Log.e(TAG, "Unable to draw view due to incorrect size: " + mName);
+            return;
+        }
+
+        mBitmap = Bitmap.createBitmap(mView.getWidth(), mView.getHeight(),
+                Bitmap.Config.ARGB_8888);
+
+        final Canvas canvas = new Canvas(mBitmap);
+        mView.draw(canvas);
+    }
+
+    @Override
+    protected Boolean doInBackground(Void... ignored) {
+        final Bitmap bitmap = mBitmap;
+        if (bitmap == null) {
+            return false;
+        }
+
+        final File file = new File(mOutDir, mName + ".png");
+        if (file.exists() && !file.canWrite()) {
+            Log.e(TAG, "Unable to write file: " + file.getAbsolutePath());
+            return false;
+        }
+
+        boolean success = false;
+        try {
+            FileOutputStream stream = null;
+            try {
+                stream = new FileOutputStream(file);
+                success = bitmap.compress(CompressFormat.PNG, 100, stream);
+            } finally {
+                if (stream != null) {
+                    stream.flush();
+                    stream.close();
+                }
+            }
+        } catch (Exception e) {
+            Log.e(TAG, e.getMessage());
+        } finally {
+            bitmap.recycle();
+        }
+
+        return success;
+    }
+}
diff --git a/hostsidetests/theme/app/src/android/theme/app/GenerateImagesActivity.java b/hostsidetests/theme/app/src/android/theme/app/GenerateImagesActivity.java
new file mode 100644
index 0000000..e7f5aa2
--- /dev/null
+++ b/hostsidetests/theme/app/src/android/theme/app/GenerateImagesActivity.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2015 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.theme.app;
+
+import android.Manifest.permission;
+import android.app.Activity;
+import android.app.KeyguardManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Build.VERSION;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Handler;
+import android.util.Log;
+import android.view.WindowManager.LayoutParams;
+
+import java.io.File;
+import java.util.concurrent.CountDownLatch;
+
+/**
+ * Generates images by iterating through all themes and launching instances of
+ * {@link ThemeDeviceActivity}.
+ */
+public class GenerateImagesActivity extends Activity {
+    private static final String TAG = "GenerateImagesActivity";
+
+    private static final String OUT_DIR = "cts-theme-assets";
+    private static final int REQUEST_CODE = 1;
+
+    private final CountDownLatch mLatch = new CountDownLatch(1);
+
+    private File mOutputDir;
+    private int mCurrentTheme;
+    private String mFinishReason;
+    private boolean mFinishSuccess;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON
+                | LayoutParams.FLAG_TURN_SCREEN_ON
+                | LayoutParams.FLAG_DISMISS_KEYGUARD);
+
+        mOutputDir = new File(Environment.getExternalStorageDirectory(), OUT_DIR);
+        ThemeTestUtils.deleteDirectory(mOutputDir);
+        mOutputDir.mkdirs();
+
+        if (!mOutputDir.exists()) {
+            finish("Failed to create output directory " + mOutputDir.getAbsolutePath(), false);
+            return;
+        }
+
+        final boolean canDisableKeyguard = checkCallingOrSelfPermission(
+                permission.DISABLE_KEYGUARD) == PackageManager.PERMISSION_GRANTED;
+        if (!canDisableKeyguard) {
+            finish("Not granted permission to disable keyguard", false);
+            return;
+        }
+
+        new KeyguardCheck(this) {
+            @Override
+            public void onSuccess() {
+                generateNextImage();
+            }
+
+            @Override
+            public void onFailure() {
+                finish("Device is locked", false);
+            }
+        }.start();
+    }
+
+    private void finish(String reason, boolean success) {
+        mFinishSuccess = success;
+        mFinishReason = reason;
+
+        Log.i(TAG, (success ? "OKAY" : "FAIL") + ":" + reason);
+        finish();
+    }
+
+    public boolean isFinishSuccess() {
+        return mFinishSuccess;
+    }
+
+    public String getFinishReason() {
+        return mFinishReason;
+    }
+
+    static abstract class KeyguardCheck implements Runnable {
+        private static final int MAX_RETRIES = 3;
+        private static final int RETRY_DELAY = 500;
+
+        private final Handler mHandler;
+        private final KeyguardManager mKeyguard;
+
+        private int mRetries;
+
+        public KeyguardCheck(Context context) {
+            mHandler = new Handler(context.getMainLooper());
+            mKeyguard = (KeyguardManager) context.getSystemService(KEYGUARD_SERVICE);
+        }
+
+        public void start() {
+            mRetries = 0;
+
+            mHandler.removeCallbacks(this);
+            mHandler.post(this);
+        }
+
+        public void cancel() {
+            mHandler.removeCallbacks(this);
+        }
+
+        @Override
+        public void run() {
+            if (!mKeyguard.isKeyguardLocked()) {
+                onSuccess();
+            } else if (mRetries < MAX_RETRIES) {
+                mRetries++;
+                mHandler.postDelayed(this, RETRY_DELAY);
+            } else {
+                onFailure();
+            }
+
+        }
+
+        public abstract void onSuccess();
+        public abstract void onFailure();
+    }
+
+    public File getOutputDir() {
+        return mOutputDir;
+    }
+
+    /**
+     * Starts the activity to generate the next image.
+     */
+    private boolean generateNextImage() {
+        final ThemeDeviceActivity.Theme theme = ThemeDeviceActivity.THEMES[mCurrentTheme];
+        if (theme.apiLevel > VERSION.SDK_INT) {
+            Log.v(TAG, "Skipping theme \"" + theme.name
+                    + "\" (requires API " + theme.apiLevel + ")");
+            return false;
+        }
+
+        Log.v(TAG, "Generating images for theme \"" + theme.name + "\"...");
+
+        final Intent intent = new Intent(this, ThemeDeviceActivity.class);
+        intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
+        intent.putExtra(ThemeDeviceActivity.EXTRA_THEME, mCurrentTheme);
+        intent.putExtra(ThemeDeviceActivity.EXTRA_OUTPUT_DIR, mOutputDir.getAbsolutePath());
+        startActivityForResult(intent, REQUEST_CODE);
+        return true;
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (resultCode != RESULT_OK) {
+            Log.i(TAG, "FAIL:Failed to generate images for theme " + mCurrentTheme);
+            finish();
+            return;
+        }
+
+        // Keep trying themes until one works.
+        boolean success = false;
+        while (++mCurrentTheme < ThemeDeviceActivity.THEMES.length && !success) {
+            success = generateNextImage();
+        }
+
+        // If we ran out of themes, we're done.
+        if (!success) {
+            finish("Image generation complete!", true);
+        }
+    }
+
+    public void finish() {
+        mLatch.countDown();
+        super.finish();
+    }
+
+    public void waitForCompletion() throws InterruptedException {
+        mLatch.await();
+    }
+}
diff --git a/hostsidetests/theme/app/src/android/theme/app/HoloDeviceActivity.java b/hostsidetests/theme/app/src/android/theme/app/HoloDeviceActivity.java
deleted file mode 100644
index 8ae9fc8..0000000
--- a/hostsidetests/theme/app/src/android/theme/app/HoloDeviceActivity.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * Copyright (C) 2014 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.theme.app;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.Bitmap.CompressFormat;
-import android.graphics.Canvas;
-import android.os.AsyncTask;
-import android.os.Environment;
-import android.os.Bundle;
-import android.os.Handler;
-import android.theme.app.modifiers.DatePickerModifier;
-import android.theme.app.modifiers.ProgressBarModifier;
-import android.theme.app.modifiers.SearchViewModifier;
-import android.theme.app.modifiers.TimePickerModifier;
-import android.theme.app.modifiers.ViewCheckedModifier;
-import android.theme.app.modifiers.ViewPressedModifier;
-import android.theme.app.R;
-import android.theme.app.ReferenceViewGroup;
-import android.util.Log;
-import android.view.View;
-import android.widget.CheckBox;
-import android.widget.DatePicker;
-import android.widget.LinearLayout;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.lang.Override;
-
-/**
- * A activity which display various UI elements with Holo theme.
- */
-public class HoloDeviceActivity extends Activity {
-
-    public static final String EXTRA_THEME = "holo_theme_extra";
-
-    private static final String TAG = HoloDeviceActivity.class.getSimpleName();
-
-    /**
-     * The duration of the CalendarView adjustement to settle to its final position.
-     */
-    private static final long CALENDAR_VIEW_ADJUSTMENT_DURATION = 540;
-
-    private Theme mTheme;
-
-    private ReferenceViewGroup mViewGroup;
-
-    private int mLayoutIndex;
-
-    @Override
-    protected void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-
-        mTheme = THEMES[getIntent().getIntExtra(EXTRA_THEME, 0)];
-        setTheme(mTheme.mId);
-        setContentView(R.layout.holo_test);
-        mViewGroup = (ReferenceViewGroup) findViewById(R.id.reference_view_group);
-    }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-        setNextLayout();
-    }
-
-    @Override
-    protected void onPause() {
-        if (!isFinishing()) {
-            // The Activity got paused for some reasons, for finish it as the host won't move on to
-            // the next theme otherwise.
-            Log.w(TAG, "onPause called without a call to finish().");
-            finish();
-        }
-        super.onPause();
-    }
-
-    @Override
-    protected void onDestroy() {
-        if (mLayoutIndex != LAYOUTS.length) {
-            Log.w(TAG, "Not all layouts got rendered: " + mLayoutIndex);
-        }
-        Log.i(TAG, "OKAY:" + mTheme.mName);
-        super.onDestroy();
-    }
-
-    /**
-     * Sets the next layout in the UI.
-     */
-    private void setNextLayout() {
-        if (mLayoutIndex >= LAYOUTS.length) {
-            finish();
-            return;
-        }
-        final Layout layout = LAYOUTS[mLayoutIndex++];
-        final String layoutName = String.format("%s_%s", mTheme.mName, layout.mName);
-
-        mViewGroup.removeAllViews();
-        final View view = getLayoutInflater().inflate(layout.mId, mViewGroup, false);
-        if (layout.mModifier != null) {
-            layout.mModifier.modifyView(view);
-        }
-        mViewGroup.addView(view);
-        view.setFocusable(false);
-
-        final Runnable generateBitmapRunnable = new Runnable() {
-            @Override
-            public void run() {
-                new GenerateBitmapTask(view, layoutName).execute();
-            }
-        };
-
-        if (view instanceof DatePicker) {
-            // DatePicker uses a CalendarView that has a non-configurable adjustment duration of
-            // 540ms
-            view.postDelayed(generateBitmapRunnable, CALENDAR_VIEW_ADJUSTMENT_DURATION);
-        } else {
-            view.post(generateBitmapRunnable);
-        }
-    }
-
-    /**
-     * A task which gets the UI element to render to a bitmap and then saves that as a png
-     * asynchronously
-     */
-    private class GenerateBitmapTask extends AsyncTask<Void, Void, Boolean> {
-
-        private final View mView;
-
-        private final String mName;
-
-        public GenerateBitmapTask(final View view, final String name) {
-            super();
-            mView = view;
-            mName = name;
-        }
-
-        @Override
-        protected Boolean doInBackground(Void... ignored) {
-            if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
-                Log.i(TAG, "External storage for saving bitmaps is not mounted");
-                return false;
-            }
-            if (mView.getWidth() == 0 || mView.getHeight() == 0) {
-                Log.w(TAG, "Unable to draw View due to incorrect size: " + mName);
-                return false;
-            }
-
-            final Bitmap bitmap = Bitmap.createBitmap(
-                    mView.getWidth(), mView.getHeight(), Bitmap.Config.ARGB_8888);
-            final Canvas canvas = new Canvas(bitmap);
-
-            mView.draw(canvas);
-            final File dir = new File(Environment.getExternalStorageDirectory(), "cts-holo-assets");
-            dir.mkdirs();
-            boolean success = false;
-            try {
-                final File file = new File(dir, mName + ".png");
-                FileOutputStream stream = null;
-                try {
-                    stream = new FileOutputStream(file);
-                    success = bitmap.compress(CompressFormat.PNG, 100, stream);
-                } finally {
-                    if (stream != null) {
-                        stream.close();
-                    }
-                }
-            } catch (Exception e) {
-                Log.e(TAG, e.getMessage());
-            } finally {
-                bitmap.recycle();
-            }
-            return success;
-        }
-
-        @Override
-        protected void onPostExecute(Boolean success) {
-            setNextLayout();
-        }
-    }
-
-    /**
-     * A class to encapsulate information about a holo theme.
-     */
-    private static class Theme {
-
-        public final int mId;
-
-        public final String mName;
-
-        private Theme(int id, String name) {
-            mId = id;
-            mName = name;
-        }
-    }
-
-    private static final Theme[] THEMES = {
-            new Theme(android.R.style.Theme_Holo,
-                    "holo"),
-            new Theme(android.R.style.Theme_Holo_Dialog,
-                    "holo_dialog"),
-            new Theme(android.R.style.Theme_Holo_Dialog_MinWidth,
-                    "holo_dialog_minwidth"),
-            new Theme(android.R.style.Theme_Holo_Dialog_NoActionBar,
-                    "holo_dialog_noactionbar"),
-            new Theme(android.R.style.Theme_Holo_Dialog_NoActionBar_MinWidth,
-                    "holo_dialog_noactionbar_minwidth"),
-            new Theme(android.R.style.Theme_Holo_DialogWhenLarge,
-                    "holo_dialogwhenlarge"),
-            new Theme(android.R.style.Theme_Holo_DialogWhenLarge_NoActionBar,
-                    "holo_dialogwhenlarge_noactionbar"),
-            new Theme(android.R.style.Theme_Holo_InputMethod,
-                    "holo_inputmethod"),
-            new Theme(android.R.style.Theme_Holo_Light,
-                    "holo_light"),
-            new Theme(android.R.style.Theme_Holo_Light_DarkActionBar,
-                    "holo_light_darkactionbar"),
-            new Theme(android.R.style.Theme_Holo_Light_Dialog,
-                    "holo_light_dialog"),
-            new Theme(android.R.style.Theme_Holo_Light_Dialog_MinWidth,
-                    "holo_light_dialog_minwidth"),
-            new Theme(android.R.style.Theme_Holo_Light_Dialog_NoActionBar,
-                    "holo_light_dialog_noactionbar"),
-            new Theme(android.R.style.Theme_Holo_Light_Dialog_NoActionBar_MinWidth,
-                    "holo_light_dialog_noactionbar_minwidth"),
-            new Theme(android.R.style.Theme_Holo_Light_DialogWhenLarge,
-                    "holo_light_dialogwhenlarge"),
-            new Theme(android.R.style.Theme_Holo_Light_DialogWhenLarge_NoActionBar,
-                    "holo_light_dialogwhenlarge_noactionbar"),
-            new Theme(android.R.style.Theme_Holo_Light_NoActionBar,
-                    "holo_light_noactionbar"),
-            new Theme(android.R.style.Theme_Holo_Light_NoActionBar_Fullscreen,
-                    "holo_light_noactionbar_fullscreen"),
-            new Theme(android.R.style.Theme_Holo_Light_Panel,
-                    "holo_light_panel"),
-            new Theme(android.R.style.Theme_Holo_NoActionBar,
-                    "holo_noactionbar"),
-            new Theme(android.R.style.Theme_Holo_NoActionBar_Fullscreen,
-                    "holo_noactionbar_fullscreen"),
-            new Theme(android.R.style.Theme_Holo_Panel,
-                    "holo_panel"),
-            new Theme(android.R.style.Theme_Holo_Wallpaper,
-                    "holo_wallpaper"),
-            new Theme(android.R.style.Theme_Holo_Wallpaper_NoTitleBar,
-                    "holo_wallpaper_notitlebar")
-    };
-
-    /**
-     * A class to encapsulate information about a holo layout.
-     */
-    private static class Layout {
-
-        public final int mId;
-
-        public final String mName;
-
-        public final LayoutModifier mModifier;
-
-        private Layout(int id, String name, LayoutModifier modifier) {
-            mId = id;
-            mName = name;
-            mModifier = modifier;
-        }
-    }
-
-    private static final Layout[] LAYOUTS = {
-            new Layout(R.layout.button, "button", null),
-            new Layout(R.layout.button, "button_pressed", new ViewPressedModifier()),
-            new Layout(R.layout.checkbox, "checkbox", null),
-            new Layout(R.layout.checkbox, "checkbox_checked", new ViewCheckedModifier()),
-            new Layout(R.layout.chronometer, "chronometer", null),
-            new Layout(R.layout.color_blue_bright, "color_blue_bright", null),
-            new Layout(R.layout.color_blue_dark, "color_blue_dark", null),
-            new Layout(R.layout.color_blue_light, "color_blue_light", null),
-            new Layout(R.layout.color_green_dark, "color_green_dark", null),
-            new Layout(R.layout.color_green_light, "color_green_light", null),
-            new Layout(R.layout.color_orange_dark, "color_orange_dark", null),
-            new Layout(R.layout.color_orange_light, "color_orange_light", null),
-            new Layout(R.layout.color_purple, "color_purple", null),
-            new Layout(R.layout.color_red_dark, "color_red_dark", null),
-            new Layout(R.layout.color_red_light, "color_red_light", null),
-            new Layout(R.layout.datepicker, "datepicker", new DatePickerModifier()),
-            new Layout(R.layout.display_info, "display_info", null),
-            new Layout(R.layout.edittext, "edittext", null),
-            new Layout(R.layout.progressbar_horizontal_0, "progressbar_horizontal_0", null),
-            new Layout(R.layout.progressbar_horizontal_100, "progressbar_horizontal_100", null),
-            new Layout(R.layout.progressbar_horizontal_50, "progressbar_horizontal_50", null),
-            new Layout(R.layout.progressbar_large, "progressbar_large", new ProgressBarModifier()),
-            new Layout(R.layout.progressbar_small, "progressbar_small", new ProgressBarModifier()),
-            new Layout(R.layout.progressbar, "progressbar", new ProgressBarModifier()),
-            new Layout(R.layout.radiobutton_checked, "radiobutton_checked", null),
-            new Layout(R.layout.radiobutton, "radiobutton", null),
-            new Layout(R.layout.radiogroup_horizontal, "radiogroup_horizontal", null),
-            new Layout(R.layout.radiogroup_vertical, "radiogroup_vertical", null),
-            new Layout(R.layout.ratingbar_0, "ratingbar_0", null),
-            new Layout(R.layout.ratingbar_2point5, "ratingbar_2point5", null),
-            new Layout(R.layout.ratingbar_5, "ratingbar_5", null),
-            new Layout(R.layout.ratingbar_0, "ratingbar_0_pressed", new ViewPressedModifier()),
-            new Layout(R.layout.ratingbar_2point5, "ratingbar_2point5_pressed", new ViewPressedModifier()),
-            new Layout(R.layout.ratingbar_5, "ratingbar_5_pressed", new ViewPressedModifier()),
-            new Layout(R.layout.searchview, "searchview_query", new SearchViewModifier(SearchViewModifier.QUERY)),
-            new Layout(R.layout.searchview, "searchview_query_hint", new SearchViewModifier(SearchViewModifier.QUERY_HINT)),
-            new Layout(R.layout.seekbar_0, "seekbar_0", null),
-            new Layout(R.layout.seekbar_100, "seekbar_100", null),
-            new Layout(R.layout.seekbar_50, "seekbar_50", null),
-            new Layout(R.layout.spinner, "spinner", null),
-            new Layout(R.layout.switch_button_checked, "switch_button_checked", null),
-            new Layout(R.layout.switch_button, "switch_button", null),
-            new Layout(R.layout.textview, "textview", null),
-            new Layout(R.layout.timepicker, "timepicker", new TimePickerModifier()),
-            new Layout(R.layout.togglebutton_checked, "togglebutton_checked", null),
-            new Layout(R.layout.togglebutton, "togglebutton", null),
-            new Layout(R.layout.zoomcontrols, "zoomcontrols", null),
-    };
-}
diff --git a/hostsidetests/theme/app/src/android/theme/app/ReferenceImagesTest.java b/hostsidetests/theme/app/src/android/theme/app/ReferenceImagesTest.java
new file mode 100644
index 0000000..7569252
--- /dev/null
+++ b/hostsidetests/theme/app/src/android/theme/app/ReferenceImagesTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2015 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.theme.app;
+
+import android.test.ActivityInstrumentationTestCase2;
+
+import java.io.File;
+
+/**
+ * Activity test case used to instrument generation of reference images.
+ */
+public class ReferenceImagesTest extends ActivityInstrumentationTestCase2<GenerateImagesActivity> {
+
+    public ReferenceImagesTest() {
+        super(GenerateImagesActivity.class);
+    }
+
+    public void testGenerateReferenceImages() throws Exception {
+        setActivityInitialTouchMode(true);
+
+        final GenerateImagesActivity activity = getActivity();
+        activity.waitForCompletion();
+
+        assertTrue(activity.getFinishReason(), activity.isFinishSuccess());
+
+        final File outputDir = activity.getOutputDir();
+        final File outputZip = new File(outputDir.getParentFile(), outputDir.getName() + ".zip");
+        if (outputZip.exists()) {
+            // Remove any old test results.
+            outputZip.delete();
+        }
+
+        ThemeTestUtils.compressDirectory(outputDir, outputZip);
+        ThemeTestUtils.deleteDirectory(outputDir);
+
+        assertTrue("Generated reference image ZIP", outputZip.exists());
+    }
+}
diff --git a/hostsidetests/theme/app/src/android/theme/app/ThemeDeviceActivity.java b/hostsidetests/theme/app/src/android/theme/app/ThemeDeviceActivity.java
new file mode 100644
index 0000000..d8b1f30
--- /dev/null
+++ b/hostsidetests/theme/app/src/android/theme/app/ThemeDeviceActivity.java
@@ -0,0 +1,414 @@
+/*
+ * Copyright (C) 2015 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.theme.app;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+import android.theme.app.modifiers.DatePickerModifier;
+import android.theme.app.modifiers.ProgressBarModifier;
+import android.theme.app.modifiers.SearchViewModifier;
+import android.theme.app.modifiers.TimePickerModifier;
+import android.theme.app.modifiers.ViewCheckedModifier;
+import android.theme.app.modifiers.ViewPressedModifier;
+import android.util.Log;
+import android.view.View;
+import android.view.WindowManager.LayoutParams;
+import android.widget.DatePicker;
+
+import java.io.File;
+import java.lang.Override;
+
+/**
+ * A activity which display various UI elements with non-modifiable themes.
+ */
+public class ThemeDeviceActivity extends Activity {
+    public static final String EXTRA_THEME = "theme";
+    public static final String EXTRA_OUTPUT_DIR = "outputDir";
+
+    private static final String TAG = "ThemeDeviceActivity";
+
+    /**
+     * The duration of the CalendarView adjustment to settle to its final
+     * position.
+     */
+    private static final long CALENDAR_VIEW_ADJUSTMENT_DURATION = 540;
+
+    private Theme mTheme;
+    private ReferenceViewGroup mViewGroup;
+    private File mOutputDir;
+    private int mLayoutIndex;
+    private boolean mIsRunning;
+
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+
+        final Intent intent = getIntent();
+        final int themeIndex = intent.getIntExtra(EXTRA_THEME, -1);
+        if (themeIndex < 0) {
+            Log.e(TAG, "No theme specified");
+            finish();
+        }
+
+        final String outputDir = intent.getStringExtra(EXTRA_OUTPUT_DIR);
+        if (outputDir == null) {
+            Log.e(TAG, "No output directory specified");
+            finish();
+        }
+
+        mOutputDir = new File(outputDir);
+        mTheme = THEMES[themeIndex];
+
+        setTheme(mTheme.id);
+        setContentView(R.layout.theme_test);
+
+        mViewGroup = (ReferenceViewGroup) findViewById(R.id.reference_view_group);
+
+        getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON
+                | LayoutParams.FLAG_TURN_SCREEN_ON
+                | LayoutParams.FLAG_DISMISS_KEYGUARD );
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+
+        mIsRunning = true;
+
+        setNextLayout();
+    }
+
+    @Override
+    protected void onPause() {
+        mIsRunning = false;
+
+        if (!isFinishing()) {
+            // The activity paused for some reason, likely a system crash
+            // dialog. Finish it so we can move to the next theme.
+            Log.w(TAG, "onPause() called without a call to finish()", new RuntimeException());
+            finish();
+        }
+
+        super.onPause();
+    }
+
+    @Override
+    protected void onDestroy() {
+        if (mLayoutIndex < LAYOUTS.length) {
+            Log.e(TAG, "Not all layouts got rendered: " + mLayoutIndex);
+            setResult(RESULT_CANCELED);
+        }
+
+        super.onDestroy();
+    }
+
+    /**
+     * Sets the next layout in the UI.
+     */
+    private void setNextLayout() {
+        if (mLayoutIndex >= LAYOUTS.length) {
+            setResult(RESULT_OK);
+            finish();
+            return;
+        }
+
+        mViewGroup.removeAllViews();
+
+        final Layout layout = LAYOUTS[mLayoutIndex++];
+        final String layoutName = String.format("%s_%s", mTheme.name, layout.name);
+        final View view = getLayoutInflater().inflate(layout.id, mViewGroup, false);
+        if (layout.modifier != null) {
+            layout.modifier.modifyView(view);
+        }
+
+        mViewGroup.addView(view);
+        view.setFocusable(false);
+
+        Log.v(TAG, "Rendering layout " + layoutName
+                + " (" + mLayoutIndex + "/" + LAYOUTS.length + ")");
+
+        final Runnable generateBitmapRunnable = new Runnable() {
+            @Override
+            public void run() {
+                new BitmapTask(view, layoutName).execute();
+            }
+        };
+
+        if (view instanceof DatePicker) {
+            // The Holo-styled DatePicker uses a CalendarView that has a
+            // non-configurable adjustment duration of 540ms.
+            view.postDelayed(generateBitmapRunnable, CALENDAR_VIEW_ADJUSTMENT_DURATION);
+        } else {
+            view.post(generateBitmapRunnable);
+        }
+    }
+
+    private class BitmapTask extends GenerateBitmapTask {
+        public BitmapTask(View view, String name) {
+            super(view, mOutputDir, name);
+        }
+
+        @Override
+        protected void onPostExecute(Boolean success) {
+            if (success && mIsRunning) {
+                setNextLayout();
+            } else {
+                Log.e(TAG, "Failed to render view to bitmap: " + mName + " (activity running? "
+                        + mIsRunning + ")");
+                finish();
+            }
+        }
+    }
+
+    /**
+     * A class to encapsulate information about a theme.
+     */
+    static class Theme {
+        public final int id;
+        public final int apiLevel;
+        public final String name;
+
+        private Theme(int id, int apiLevel, String name) {
+            this.id = id;
+            this.apiLevel = apiLevel;
+            this.name = name;
+        }
+    }
+
+    // List of themes to verify.
+    static final Theme[] THEMES = {
+            // Holo
+            new Theme(android.R.style.Theme_Holo,
+                    Build.VERSION_CODES.HONEYCOMB, "holo"),
+            new Theme(android.R.style.Theme_Holo_Dialog,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_dialog"),
+            new Theme(android.R.style.Theme_Holo_Dialog_MinWidth,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_dialog_minwidth"),
+            new Theme(android.R.style.Theme_Holo_Dialog_NoActionBar,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_dialog_noactionbar"),
+            new Theme(android.R.style.Theme_Holo_Dialog_NoActionBar_MinWidth,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_dialog_noactionbar_minwidth"),
+            new Theme(android.R.style.Theme_Holo_DialogWhenLarge,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_dialogwhenlarge"),
+            new Theme(android.R.style.Theme_Holo_DialogWhenLarge_NoActionBar,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_dialogwhenlarge_noactionbar"),
+            new Theme(android.R.style.Theme_Holo_InputMethod,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_inputmethod"),
+            new Theme(android.R.style.Theme_Holo_NoActionBar,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_noactionbar"),
+            new Theme(android.R.style.Theme_Holo_NoActionBar_Fullscreen,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_noactionbar_fullscreen"),
+            new Theme(android.R.style.Theme_Holo_NoActionBar_Overscan,
+                    Build.VERSION_CODES.JELLY_BEAN_MR2, "holo_noactionbar_overscan"),
+            new Theme(android.R.style.Theme_Holo_NoActionBar_TranslucentDecor,
+                    Build.VERSION_CODES.KITKAT, "holo_noactionbar_translucentdecor"),
+            new Theme(android.R.style.Theme_Holo_Panel,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_panel"),
+            new Theme(android.R.style.Theme_Holo_Wallpaper,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_wallpaper"),
+            new Theme(android.R.style.Theme_Holo_Wallpaper_NoTitleBar,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_wallpaper_notitlebar"),
+
+            // Holo Light
+            new Theme(android.R.style.Theme_Holo_Light,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_light"),
+            new Theme(android.R.style.Theme_Holo_Light_DarkActionBar,
+                    Build.VERSION_CODES.ICE_CREAM_SANDWICH, "holo_light_darkactionbar"),
+            new Theme(android.R.style.Theme_Holo_Light_Dialog,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_light_dialog"),
+            new Theme(android.R.style.Theme_Holo_Light_Dialog_MinWidth,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_light_dialog_minwidth"),
+            new Theme(android.R.style.Theme_Holo_Light_Dialog_NoActionBar,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_light_dialog_noactionbar"),
+            new Theme(android.R.style.Theme_Holo_Light_Dialog_NoActionBar_MinWidth,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_light_dialog_noactionbar_minwidth"),
+            new Theme(android.R.style.Theme_Holo_Light_DialogWhenLarge,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_light_dialogwhenlarge"),
+            new Theme(android.R.style.Theme_Holo_Light_DialogWhenLarge_NoActionBar,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_light_dialogwhenlarge_noactionbar"),
+            new Theme(android.R.style.Theme_Holo_Light_NoActionBar,
+                    Build.VERSION_CODES.HONEYCOMB_MR2, "holo_light_noactionbar"),
+            new Theme(android.R.style.Theme_Holo_Light_NoActionBar_Fullscreen,
+                    Build.VERSION_CODES.HONEYCOMB_MR2, "holo_light_noactionbar_fullscreen"),
+            new Theme(android.R.style.Theme_Holo_Light_NoActionBar_Overscan,
+                    Build.VERSION_CODES.JELLY_BEAN_MR2, "holo_light_noactionbar_overscan"),
+            new Theme(android.R.style.Theme_Holo_Light_NoActionBar_TranslucentDecor,
+                    Build.VERSION_CODES.KITKAT, "holo_light_noactionbar_translucentdecor"),
+            new Theme(android.R.style.Theme_Holo_Light_Panel,
+                    Build.VERSION_CODES.HONEYCOMB, "holo_light_panel"),
+
+            // Material
+            new Theme(android.R.style.Theme_Material,
+                    Build.VERSION_CODES.LOLLIPOP, "material"),
+            new Theme(android.R.style.Theme_Material_Dialog,
+                    Build.VERSION_CODES.LOLLIPOP, "material_dialog"),
+            new Theme(android.R.style.Theme_Material_Dialog_Alert,
+                    Build.VERSION_CODES.LOLLIPOP, "material_dialog_alert"),
+            new Theme(android.R.style.Theme_Material_Dialog_MinWidth,
+                    Build.VERSION_CODES.LOLLIPOP, "material_dialog_minwidth"),
+            new Theme(android.R.style.Theme_Material_Dialog_NoActionBar,
+                    Build.VERSION_CODES.LOLLIPOP, "material_dialog_noactionbar"),
+            new Theme(android.R.style.Theme_Material_Dialog_NoActionBar_MinWidth,
+                    Build.VERSION_CODES.LOLLIPOP, "material_dialog_noactionbar_minwidth"),
+            new Theme(android.R.style.Theme_Material_Dialog_Presentation,
+                    Build.VERSION_CODES.LOLLIPOP, "material_dialog_presentation"),
+            new Theme(android.R.style.Theme_Material_DialogWhenLarge,
+                    Build.VERSION_CODES.LOLLIPOP, "material_dialogwhenlarge"),
+            new Theme(android.R.style.Theme_Material_DialogWhenLarge_NoActionBar,
+                    Build.VERSION_CODES.LOLLIPOP, "material_dialogwhenlarge_noactionbar"),
+            new Theme(android.R.style.Theme_Material_InputMethod,
+                    Build.VERSION_CODES.LOLLIPOP, "material_inputmethod"),
+            new Theme(android.R.style.Theme_Material_NoActionBar,
+                    Build.VERSION_CODES.LOLLIPOP, "material_noactionbar"),
+            new Theme(android.R.style.Theme_Material_NoActionBar_Fullscreen,
+                    Build.VERSION_CODES.LOLLIPOP, "material_noactionbar_fullscreen"),
+            new Theme(android.R.style.Theme_Material_NoActionBar_Overscan,
+                    Build.VERSION_CODES.LOLLIPOP, "material_noactionbar_overscan"),
+            new Theme(android.R.style.Theme_Material_NoActionBar_TranslucentDecor,
+                    Build.VERSION_CODES.LOLLIPOP, "material_noactionbar_translucentdecor"),
+            new Theme(android.R.style.Theme_Material_Panel,
+                    Build.VERSION_CODES.LOLLIPOP, "material_panel"),
+            new Theme(android.R.style.Theme_Material_Settings,
+                    Build.VERSION_CODES.LOLLIPOP, "material_settings"),
+            new Theme(android.R.style.Theme_Material_Voice,
+                    Build.VERSION_CODES.LOLLIPOP, "material_voice"),
+            new Theme(android.R.style.Theme_Material_Wallpaper,
+                    Build.VERSION_CODES.LOLLIPOP, "material_wallpaper"),
+            new Theme(android.R.style.Theme_Material_Wallpaper_NoTitleBar,
+                    Build.VERSION_CODES.LOLLIPOP, "material_wallpaper_notitlebar"),
+
+            // Material Light
+            new Theme(android.R.style.Theme_Material_Light,
+                    Build.VERSION_CODES.LOLLIPOP, "material_light"),
+            new Theme(android.R.style.Theme_Material_Light_DarkActionBar,
+                    Build.VERSION_CODES.LOLLIPOP, "material_light_darkactionbar"),
+            new Theme(android.R.style.Theme_Material_Light_Dialog,
+                    Build.VERSION_CODES.LOLLIPOP, "material_light_dialog"),
+            new Theme(android.R.style.Theme_Material_Light_Dialog_Alert,
+                    Build.VERSION_CODES.LOLLIPOP, "material_light_dialog_alert"),
+            new Theme(android.R.style.Theme_Material_Light_Dialog_MinWidth,
+                    Build.VERSION_CODES.LOLLIPOP, "material_light_dialog_minwidth"),
+            new Theme(android.R.style.Theme_Material_Light_Dialog_NoActionBar,
+                    Build.VERSION_CODES.LOLLIPOP, "material_light_dialog_noactionbar"),
+            new Theme(android.R.style.Theme_Material_Light_Dialog_NoActionBar_MinWidth,
+                    Build.VERSION_CODES.LOLLIPOP, "material_light_dialog_noactionbar_minwidth"),
+            new Theme(android.R.style.Theme_Material_Light_Dialog_Presentation,
+                    Build.VERSION_CODES.LOLLIPOP, "material_light_dialog_presentation"),
+            new Theme(android.R.style.Theme_Material_Light_DialogWhenLarge,
+                    Build.VERSION_CODES.LOLLIPOP, "material_light_dialogwhenlarge"),
+            new Theme(android.R.style.Theme_Material_Light_DialogWhenLarge_NoActionBar,
+                    Build.VERSION_CODES.LOLLIPOP, "material_light_dialogwhenlarge_noactionbar"),
+            new Theme(android.R.style.Theme_Material_Light_LightStatusBar,
+                    Build.VERSION_CODES.M, "material_light_lightstatusbar"),
+            new Theme(android.R.style.Theme_Material_Light_NoActionBar,
+                    Build.VERSION_CODES.LOLLIPOP, "material_light_noactionbar"),
+            new Theme(android.R.style.Theme_Material_Light_NoActionBar_Fullscreen,
+                    Build.VERSION_CODES.LOLLIPOP, "material_light_noactionbar_fullscreen"),
+            new Theme(android.R.style.Theme_Material_Light_NoActionBar_Overscan,
+                    Build.VERSION_CODES.LOLLIPOP, "material_light_noactionbar_overscan"),
+            new Theme(android.R.style.Theme_Material_Light_NoActionBar_TranslucentDecor,
+                    Build.VERSION_CODES.LOLLIPOP, "material_light_noactionbar_translucentdecor"),
+            new Theme(android.R.style.Theme_Material_Light_Panel,
+                    Build.VERSION_CODES.LOLLIPOP, "material_light_panel"),
+            new Theme(android.R.style.Theme_Material_Light_Voice,
+                    Build.VERSION_CODES.LOLLIPOP, "material_light_voice")
+    };
+
+    /**
+     * A class to encapsulate information about a layout.
+     */
+    private static class Layout {
+        public final int id;
+        public final String name;
+        public final LayoutModifier modifier;
+
+        private Layout(int id, String name) {
+            this(id, name, null);
+        }
+
+        private Layout(int id, String name, LayoutModifier modifier) {
+            this.id = id;
+            this.name = name;
+            this.modifier = modifier;
+        }
+    }
+
+    // List of layouts to verify for each theme.
+    private static final Layout[] LAYOUTS = {
+            new Layout(R.layout.button, "button"),
+            new Layout(R.layout.button, "button_pressed",
+                    new ViewPressedModifier()),
+            new Layout(R.layout.checkbox, "checkbox"),
+            new Layout(R.layout.checkbox, "checkbox_checked",
+                    new ViewCheckedModifier()),
+            new Layout(R.layout.chronometer, "chronometer"),
+            new Layout(R.layout.color_blue_bright, "color_blue_bright"),
+            new Layout(R.layout.color_blue_dark, "color_blue_dark"),
+            new Layout(R.layout.color_blue_light, "color_blue_light"),
+            new Layout(R.layout.color_green_dark, "color_green_dark"),
+            new Layout(R.layout.color_green_light, "color_green_light"),
+            new Layout(R.layout.color_orange_dark, "color_orange_dark"),
+            new Layout(R.layout.color_orange_light, "color_orange_light"),
+            new Layout(R.layout.color_purple, "color_purple"),
+            new Layout(R.layout.color_red_dark, "color_red_dark"),
+            new Layout(R.layout.color_red_light, "color_red_light"),
+            new Layout(R.layout.datepicker, "datepicker",
+                    new DatePickerModifier()),
+            new Layout(R.layout.display_info, "display_info"),
+            new Layout(R.layout.edittext, "edittext"),
+            new Layout(R.layout.progressbar_horizontal_0, "progressbar_horizontal_0"),
+            new Layout(R.layout.progressbar_horizontal_100, "progressbar_horizontal_100"),
+            new Layout(R.layout.progressbar_horizontal_50, "progressbar_horizontal_50"),
+            new Layout(R.layout.progressbar_large, "progressbar_large",
+                    new ProgressBarModifier()),
+            new Layout(R.layout.progressbar_small, "progressbar_small",
+                    new ProgressBarModifier()),
+            new Layout(R.layout.progressbar, "progressbar",
+                    new ProgressBarModifier()),
+            new Layout(R.layout.radiobutton_checked, "radiobutton_checked"),
+            new Layout(R.layout.radiobutton, "radiobutton"),
+            new Layout(R.layout.radiogroup_horizontal, "radiogroup_horizontal"),
+            new Layout(R.layout.radiogroup_vertical, "radiogroup_vertical"),
+            new Layout(R.layout.ratingbar_0, "ratingbar_0"),
+            new Layout(R.layout.ratingbar_2point5, "ratingbar_2point5"),
+            new Layout(R.layout.ratingbar_5, "ratingbar_5"),
+            new Layout(R.layout.ratingbar_0, "ratingbar_0_pressed",
+                    new ViewPressedModifier()),
+            new Layout(R.layout.ratingbar_2point5, "ratingbar_2point5_pressed",
+                    new ViewPressedModifier()),
+            new Layout(R.layout.ratingbar_5, "ratingbar_5_pressed",
+                    new ViewPressedModifier()),
+            new Layout(R.layout.searchview, "searchview_query",
+                    new SearchViewModifier(SearchViewModifier.QUERY)),
+            new Layout(R.layout.searchview, "searchview_query_hint",
+                    new SearchViewModifier(SearchViewModifier.QUERY_HINT)),
+            new Layout(R.layout.seekbar_0, "seekbar_0"),
+            new Layout(R.layout.seekbar_100, "seekbar_100"),
+            new Layout(R.layout.seekbar_50, "seekbar_50"),
+            new Layout(R.layout.spinner, "spinner"),
+            new Layout(R.layout.switch_button_checked, "switch_button_checked"),
+            new Layout(R.layout.switch_button, "switch_button"),
+            new Layout(R.layout.textview, "textview"),
+            new Layout(R.layout.timepicker, "timepicker",
+                    new TimePickerModifier()),
+            new Layout(R.layout.togglebutton_checked, "togglebutton_checked"),
+            new Layout(R.layout.togglebutton, "togglebutton"),
+            new Layout(R.layout.zoomcontrols, "zoomcontrols"),
+    };
+}
diff --git a/hostsidetests/theme/app/src/android/theme/app/ThemeTestUtils.java b/hostsidetests/theme/app/src/android/theme/app/ThemeTestUtils.java
new file mode 100644
index 0000000..4daca6c
--- /dev/null
+++ b/hostsidetests/theme/app/src/android/theme/app/ThemeTestUtils.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2015 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.theme.app;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+public class ThemeTestUtils {
+
+    /**
+     * Compresses the contents of a directory to a ZIP file.
+     *
+     * @param dir the directory to compress
+     * @return {@code true} on success, {@code false} on failure
+     */
+    public static boolean compressDirectory(File dir, File file) throws IOException {
+        if (dir == null || !dir.exists() || file == null || file.exists()) {
+            return false;
+        }
+
+        final File[] srcFiles = dir.listFiles();
+        if (srcFiles.length == 0) {
+            return false;
+        }
+
+        final ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(file));
+        final byte[] data = new byte[4096];
+        for (int i = 0; i < srcFiles.length; i++) {
+            final FileInputStream fileIn = new FileInputStream(srcFiles[i]);
+            final ZipEntry entry = new ZipEntry(srcFiles[i].getName());
+            zipOut.putNextEntry(entry);
+
+            int count;
+            while ((count = fileIn.read(data, 0, data.length)) != -1) {
+                zipOut.write(data, 0, count);
+                zipOut.flush();
+            }
+
+            zipOut.closeEntry();
+            fileIn.close();
+        }
+
+        zipOut.close();
+        return true;
+    }
+
+    /**
+     * Recursively deletes a directory and its contents.
+     *
+     * @param dir the directory to delete
+     * @return {@code true} on success, {@code false} on failure
+     */
+    public static boolean deleteDirectory(File dir) {
+        final File files[] = dir.listFiles();
+        if (files != null) {
+            for (File file : files) {
+                deleteDirectory(file);
+            }
+        }
+        return dir.delete();
+    }
+}
diff --git a/hostsidetests/theme/assets/23/400dpi.zip b/hostsidetests/theme/assets/23/400dpi.zip
new file mode 100644
index 0000000..be0891f
--- /dev/null
+++ b/hostsidetests/theme/assets/23/400dpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/23/560dpi.zip b/hostsidetests/theme/assets/23/560dpi.zip
new file mode 100644
index 0000000..cf0a559
--- /dev/null
+++ b/hostsidetests/theme/assets/23/560dpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/23/hdpi.zip b/hostsidetests/theme/assets/23/hdpi.zip
new file mode 100644
index 0000000..80c12a7
--- /dev/null
+++ b/hostsidetests/theme/assets/23/hdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/23/ldpi.zip b/hostsidetests/theme/assets/23/ldpi.zip
new file mode 100644
index 0000000..937914a
--- /dev/null
+++ b/hostsidetests/theme/assets/23/ldpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/23/mdpi.zip b/hostsidetests/theme/assets/23/mdpi.zip
new file mode 100644
index 0000000..f842676
--- /dev/null
+++ b/hostsidetests/theme/assets/23/mdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/23/tvdpi.zip b/hostsidetests/theme/assets/23/tvdpi.zip
new file mode 100644
index 0000000..77386e5
--- /dev/null
+++ b/hostsidetests/theme/assets/23/tvdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/23/xhdpi.zip b/hostsidetests/theme/assets/23/xhdpi.zip
new file mode 100644
index 0000000..a8310d5
--- /dev/null
+++ b/hostsidetests/theme/assets/23/xhdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/23/xxhdpi.zip b/hostsidetests/theme/assets/23/xxhdpi.zip
new file mode 100644
index 0000000..f88711f
--- /dev/null
+++ b/hostsidetests/theme/assets/23/xxhdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/generate_images.sh b/hostsidetests/theme/generate_images.sh
new file mode 100755
index 0000000..9bcc3e5
--- /dev/null
+++ b/hostsidetests/theme/generate_images.sh
@@ -0,0 +1,55 @@
+#!/bin/sh
+# Copyright (C) 2015 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.
+
+# This script is used to generate reference images for the CTS theme tests.
+# See the accompanying README file for more information.
+
+# retry <command> <tries> <message> <delay>
+function retry {
+  RETRY="0"
+  while true; do
+    if (("$RETRY" >= "$2")); then
+      echo $OUTPUT
+      exit
+    fi
+
+    OUTPUT=`$1 |& grep error`
+
+    if [ -z "$OUTPUT" ]; then
+      break
+    fi
+
+    echo $3
+    sleep $4
+    RETRY=$[$RETRY + 1]
+  done
+}
+
+themeApkPath="$ANDROID_HOST_OUT/cts/android-cts/repository/testcases/CtsThemeDeviceApp.apk"
+outDir="$ANDROID_BUILD_TOP/cts/hostsidetests/theme/assets"
+exe="$ANDROID_BUILD_TOP/cts/hostsidetests/theme/run_theme_capture_device.py"
+
+if [ -z "$ANDROID_BUILD_TOP" ]; then
+  echo "Missing environment variables. Did you run build/envsetup.sh and lunch?"
+  exit
+fi
+
+if [ ! -e "$themeApkPath" ]; then
+  echo "Couldn't find test APK. Did you run make cts?"
+  exit
+fi
+
+adb devices
+python $exe $themeApkPath $outDir
diff --git a/hostsidetests/theme/run_theme_capture_device.py b/hostsidetests/theme/run_theme_capture_device.py
new file mode 100755
index 0000000..23171db
--- /dev/null
+++ b/hostsidetests/theme/run_theme_capture_device.py
@@ -0,0 +1,170 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2015 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.
+#
+
+import os
+import sys
+import threading
+import time
+import Queue
+sys.path.append(sys.path[0])
+from android_device import *
+
+CTS_THEME_dict = {
+    120 : "ldpi",
+    160 : "mdpi",
+    213 : "tvdpi",
+    240 : "hdpi",
+    320 : "xhdpi",
+    400 : "400dpi",
+    480 : "xxhdpi",
+    560 : "560dpi",
+    640 : "xxxhdpi",
+}
+
+OUT_FILE = "/sdcard/cts-theme-assets.zip"
+
+# pass a function with number of instances to be executed in parallel
+# each thread continues until config q is empty.
+def executeParallel(tasks, setup, q, numberThreads):
+    class ParallelExecutor(threading.Thread):
+        def __init__(self, tasks, q):
+            threading.Thread.__init__(self)
+            self._q = q
+            self._tasks = tasks
+            self._setup = setup
+            self._result = 0
+
+        def run(self):
+            try:
+                while True:
+                    config = q.get(block=True, timeout=2)
+                    for t in self._tasks:
+                        try:
+                            if t(self._setup, config):
+                                self._result += 1
+                        except KeyboardInterrupt:
+                            raise
+                        except:
+                            print "Failed to execute thread:", sys.exc_info()[0]
+                    q.task_done()
+            except KeyboardInterrupt:
+                raise
+            except Queue.Empty:
+                pass
+
+        def getResult(self):
+            return self._result
+
+    result = 0;
+    threads = []
+    for i in range(numberThreads):
+        t = ParallelExecutor(tasks, q)
+        t.start()
+        threads.append(t)
+    for t in threads:
+        t.join()
+        result += t.getResult()
+    return result;
+
+def printAdbResult(device, out, err):
+    print "device: " + device
+    if out is not None:
+        print "out:\n" + out
+    if err is not None:
+        print "err:\n" + err
+
+def getResDir(outPath, resName):
+    resDir = outPath + "/" + resName
+    return resDir
+
+def doCapturing(setup, deviceSerial):
+    (themeApkPath, outPath) = setup
+
+    print "Found device: " + deviceSerial
+    device = androidDevice(deviceSerial)
+
+    # outPath = outPath + "/%d/" % (device.getSdkLevel()) + deviceSerial
+    outPath = outPath + "/%d" % (device.getSdkLevel())
+    density = device.getDensity()
+    resName = CTS_THEME_dict[density]
+
+    device.uninstallApk("android.theme.app")
+
+    (out, err, success) = device.installApk(themeApkPath)
+    if not success:
+        print "Failed to install APK on " + deviceSerial
+        printAdbResult(device, out, err)
+        return False
+
+    print "Generating images on " + deviceSerial + "..."
+    try:
+        (out, err) = device.runInstrumentationTest("android.theme.app/android.support.test.runner.AndroidJUnitRunner")
+    except KeyboardInterrupt:
+        raise
+    except:
+        (out, err) = device.runInstrumentationTest("android.theme.app/android.test.InstrumentationTestRunner")
+
+    # Detect test failure and abort.
+    if "FAILURES!!!" in out.split():
+        printAdbResult(deviceSerial, out, err)
+        return False
+
+    # Make sure that the run is complete by checking the process itself
+    print "Waiting for " + deviceSerial + "..."
+    waitTime = 0
+    while device.isProcessAlive("android.theme.app"):
+        time.sleep(1)
+        waitTime = waitTime + 1
+        if waitTime > 180:
+            print "Timed out"
+            break
+
+    time.sleep(10)
+    resDir = getResDir(outPath, resName)
+
+    print "Pulling images from " + deviceSerial + " to " + resDir + ".zip"
+    device.runAdbCommand("pull " + OUT_FILE + " " + resDir + ".zip")
+    device.runAdbCommand("shell rm -rf " + OUT_FILE)
+    return True
+
+def main(argv):
+    if len(argv) < 3:
+        print "run_theme_capture_device.py themeApkPath outDir"
+        sys.exit(1)
+    themeApkPath = argv[1]
+    outPath = os.path.abspath(argv[2])
+    os.system("mkdir -p " + outPath)
+
+    tasks = []
+    tasks.append(doCapturing)
+
+    devices = runAdbDevices();
+    numberThreads = len(devices)
+
+    configQ = Queue.Queue()
+    for device in devices:
+        configQ.put(device)
+    setup = (themeApkPath, outPath)
+    result = executeParallel(tasks, setup, configQ, numberThreads)
+
+    if result > 0:
+        print 'Generated reference images for %(count)d devices' % {"count": result}
+    else:
+        print 'Failed to generate reference images'
+
+if __name__ == '__main__':
+    main(sys.argv)
diff --git a/hostsidetests/theme/src/android/theme/cts/ComparisonTask.java b/hostsidetests/theme/src/android/theme/cts/ComparisonTask.java
index ba880d7..63c7472 100644
--- a/hostsidetests/theme/src/android/theme/cts/ComparisonTask.java
+++ b/hostsidetests/theme/src/android/theme/cts/ComparisonTask.java
@@ -23,6 +23,7 @@
 import java.awt.Color;
 import java.awt.image.BufferedImage;
 import java.io.File;
+import java.io.IOException;
 import java.lang.String;
 import java.util.concurrent.Callable;
 
@@ -32,70 +33,62 @@
  * Compares the images generated by the device with the reference images.
  */
 public class ComparisonTask implements Callable<Boolean> {
-
-    private static final String TAG = ComparisonTask.class.getSimpleName();
+    private static final String TAG = "ComparisonTask";
 
     private static final int IMAGE_THRESHOLD = 2;
 
-    private static final String STORAGE_PATH_DEVICE = "/sdcard/cts-holo-assets/%s.png";
-
     private final ITestDevice mDevice;
+    private final File mExpected;
+    private final File mActual;
 
-    private final File mReference;
-
-    private final String mName;
-
-    public ComparisonTask(ITestDevice device, File reference, String name) {
+    public ComparisonTask(ITestDevice device, File expected, File actual) {
         mDevice = device;
-        mReference = reference;
-        mName = name;
+        mExpected = expected;
+        mActual = actual;
     }
 
     public Boolean call() {
         boolean success = false;
-        File generated = null;
+
         try {
-            generated = File.createTempFile("gen_" + mName, ".png");
-
-            final String remoteGenerated = String.format(STORAGE_PATH_DEVICE, mName);
-            if (!mDevice.doesFileExist(remoteGenerated)) {
-                Log.logAndDisplay(LogLevel.ERROR, TAG, "File " + remoteGenerated + " have not been saved on device");
-                return false;
-            }
-            mDevice.pullFile(remoteGenerated, generated);
-
-            final BufferedImage ref = ImageIO.read(mReference);
-            final BufferedImage gen = ImageIO.read(generated);
-            if (compare(ref, gen, IMAGE_THRESHOLD)) {
+            final BufferedImage expected = ImageIO.read(mExpected);
+            final BufferedImage actual = ImageIO.read(mActual);
+            if (compare(expected, actual, IMAGE_THRESHOLD)) {
                 success = true;
             } else {
-                File diff = File.createTempFile("diff_" + mName, ".png");
-                createDiff(ref, gen, diff);
+                final File diff = File.createTempFile("diff_" + mExpected.getName(), ".png");
+                createDiff(expected, actual, diff);
                 Log.logAndDisplay(LogLevel.INFO, TAG, "Diff created: " + diff.getPath());
             }
-        } catch (Exception e) {
-            Log.logAndDisplay(LogLevel.ERROR, TAG, String.format(STORAGE_PATH_DEVICE, mName));
+        } catch (IOException e) {
             Log.logAndDisplay(LogLevel.ERROR, TAG, e.toString());
             e.printStackTrace();
-        } finally {
-            if (generated != null) {
-                generated.delete();
-            }
         }
+
         return success;
     }
 
-    private static boolean compare(BufferedImage reference, BufferedImage generated, int threshold) {
-        final int w = generated.getWidth();
-        final int h = generated.getHeight();
-        if (w != reference.getWidth() || h != reference.getHeight()) {
+    /**
+     * Verifies that the pixels of reference and generated images are similar
+     * within a specified threshold.
+     *
+     * @param expected expected image
+     * @param actual actual image
+     * @param threshold maximum difference per channel
+     * @return {@code true} if the images are similar, false otherwise
+     */
+    private static boolean compare(BufferedImage expected, BufferedImage actual,
+            int threshold) {
+        final int w = actual.getWidth();
+        final int h = actual.getHeight();
+        if (w != expected.getWidth() || h != expected.getHeight()) {
             return false;
         }
 
         for (int i = 0; i < w; i++) {
             for (int j = 0; j < h; j++) {
-                final int p1 = reference.getRGB(i, j);
-                final int p2 = generated.getRGB(i, j);
+                final int p1 = expected.getRGB(i, j);
+                final int p2 = actual.getRGB(i, j);
                 final int dr = (p1 & 0x000000FF) - (p2 & 0x000000FF);
                 final int dg = ((p1 & 0x0000FF00) - (p2 & 0x0000FF00)) >> 8;
                 final int db = ((p1 & 0x00FF0000) - (p2 & 0x00FF0000)) >> 16;
@@ -112,45 +105,49 @@
         return true;
     }
 
-    private static void createDiff(BufferedImage image1, BufferedImage image2, File out)
-            throws Exception {
-        final int w1 = image1.getWidth();
-        final int h1 = image1.getHeight();
-        final int w2 = image2.getWidth();
-        final int h2 = image2.getHeight();
+    private static void createDiff(BufferedImage expected, BufferedImage actual, File out)
+            throws IOException {
+        final int w1 = expected.getWidth();
+        final int h1 = expected.getHeight();
+        final int w2 = actual.getWidth();
+        final int h2 = actual.getHeight();
         final int width = Math.max(w1, w2);
         final int height = Math.max(h1, h2);
+
         // The diff will contain image1, image2 and the difference between the two.
-        final BufferedImage diff = new BufferedImage(width * 3, height, BufferedImage.TYPE_INT_ARGB);
+        final BufferedImage diff = new BufferedImage(
+                width * 3, height, BufferedImage.TYPE_INT_ARGB);
 
         for (int i = 0; i < width; i++) {
             for (int j = 0; j < height; j++) {
                 final boolean inBounds1 = i < w1 && j < h1;
                 final boolean inBounds2 = i < w2 && j < h2;
-                int color1 = Color.WHITE.getRGB();
-                int color2 = Color.WHITE.getRGB();
-                int color3;
+                int colorExpected = Color.WHITE.getRGB();
+                int colorActual = Color.WHITE.getRGB();
+                int colorDiff;
                 if (inBounds1 && inBounds2) {
-                    color1 = image1.getRGB(i, j);
-                    color2 = image2.getRGB(i, j);
-                    color3 = color1 == color2 ? color1 : Color.RED.getRGB();
+                    colorExpected = expected.getRGB(i, j);
+                    colorActual = actual.getRGB(i, j);
+                    colorDiff = colorExpected == colorActual ? colorExpected : Color.RED.getRGB();
                 } else if (inBounds1 && !inBounds2) {
-                    color1 = image1.getRGB(i, j);
-                    color3 = Color.BLUE.getRGB();
+                    colorExpected = expected.getRGB(i, j);
+                    colorDiff = Color.BLUE.getRGB();
                 } else if (!inBounds1 && inBounds2) {
-                    color2 = image2.getRGB(i, j);
-                    color3 = Color.GREEN.getRGB();
+                    colorActual = actual.getRGB(i, j);
+                    colorDiff = Color.GREEN.getRGB();
                 } else {
-                    color3 = Color.MAGENTA.getRGB();
+                    colorDiff = Color.MAGENTA.getRGB();
                 }
+
                 int x = i;
-                diff.setRGB(x, j, color1);
+                diff.setRGB(x, j, colorExpected);
                 x += width;
-                diff.setRGB(x, j, color2);
+                diff.setRGB(x, j, colorActual);
                 x += width;
-                diff.setRGB(x, j, color3);
+                diff.setRGB(x, j, colorDiff);
             }
         }
+
         ImageIO.write(diff, "png", out);
     }
 
diff --git a/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java b/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
index 8326b1f..b4bb748 100644
--- a/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
+++ b/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
@@ -21,8 +21,8 @@
 import com.android.cts.util.TimeoutReq;
 import com.android.ddmlib.Log;
 import com.android.ddmlib.Log.LogLevel;
-import com.android.ddmlib.IShellOutputReceiver;
 import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceTestCase;
 import com.android.tradefed.testtype.IAbi;
@@ -30,145 +30,44 @@
 import com.android.tradefed.testtype.IBuildReceiver;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.lang.String;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Scanner;
-import java.util.concurrent.Callable;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ExecutorCompletionService;
 import java.util.concurrent.ExecutorService;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
 /**
- * Test to check the Holo theme has not been changed.
+ * Test to check non-modifiable themes have not been changed.
  */
 public class ThemeHostTest extends DeviceTestCase implements IAbiReceiver, IBuildReceiver {
+    private static final String LOG_TAG = "ThemeHostTest";
+    private static final String APK_NAME = "CtsThemeDeviceApp";
+    private static final String APP_PACKAGE_NAME = "android.theme.app";
 
-    private static final String TAG = ThemeHostTest.class.getSimpleName();
-
-    private static final int ADB_TIMEOUT = 60 * 60 * 1000;//60mins in ms
-
-    /** The package name of the APK. */
-    private static final String PACKAGE = "android.theme.app";
-
-    /** The file name of the APK. */
-    private static final String APK = "CtsThemeDeviceApp.apk";
+    private static final String GENERATED_ASSETS_ZIP = "/sdcard/cts-theme-assets.zip";
 
     /** The class name of the main activity in the APK. */
-    private static final String CLASS = "HoloDeviceActivity";
+    private static final String CLASS = "GenerateImagesActivity";
 
     /** The command to launch the main activity. */
     private static final String START_CMD = String.format(
-            "am start -W -a android.intent.action.MAIN -n %s/%s.%s", PACKAGE, PACKAGE, CLASS);
+            "am start -W -a android.intent.action.MAIN -n %s/%s.%s", APP_PACKAGE_NAME,
+            APP_PACKAGE_NAME, CLASS);
 
-    private static final String CLEAR_GENERATED_CMD = "rm -rf /sdcard/cts-holo-assets/*.png";
-
-    private static final String STOP_CMD = String.format("am force-stop %s", PACKAGE);
-
+    private static final String CLEAR_GENERATED_CMD = "rm -rf %s/*.png";
+    private static final String STOP_CMD = String.format("am force-stop %s", APP_PACKAGE_NAME);
     private static final String HARDWARE_TYPE_CMD = "dumpsys | grep android.hardware.type";
-
     private static final String DENSITY_PROP_DEVICE = "ro.sf.lcd_density";
-
     private static final String DENSITY_PROP_EMULATOR = "qemu.sf.lcd_density";
 
-    // Intent extras
-    protected final static String INTENT_STRING_EXTRA = " --es %s %s";
-
-    protected final static String INTENT_BOOLEAN_EXTRA = " --ez %s %b";
-
-    protected final static String INTENT_INTEGER_EXTRA = " --ei %s %d";
-
-    // Intent extra keys
-    private static final String EXTRA_THEME = "holo_theme_extra";
-
-    private static final String[] THEMES = {
-            "holo",
-            "holo_dialog",
-            "holo_dialog_minwidth",
-            "holo_dialog_noactionbar",
-            "holo_dialog_noactionbar_minwidth",
-            "holo_dialogwhenlarge",
-            "holo_dialogwhenlarge_noactionbar",
-            "holo_inputmethod",
-            "holo_light",
-            "holo_light_darkactionbar",
-            "holo_light_dialog",
-            "holo_light_dialog_minwidth",
-            "holo_light_dialog_noactionbar",
-            "holo_light_dialog_noactionbar_minwidth",
-            "holo_light_dialogwhenlarge",
-            "holo_light_dialogwhenlarge_noactionbar",
-            "holo_light_noactionbar",
-            "holo_light_noactionbar_fullscreen",
-            "holo_light_panel",
-            "holo_noactionbar",
-            "holo_noactionbar_fullscreen",
-            "holo_panel",
-            "holo_wallpaper",
-            "holo_wallpaper_notitlebar",
-    };
-
-    private final int NUM_THEMES = THEMES.length;
-
-    private static final String[] LAYOUTS = {
-            "button",
-            "button_pressed",
-            "checkbox",
-            "checkbox_checked",
-            "chronometer",
-            "color_blue_bright",
-            "color_blue_dark",
-            "color_blue_light",
-            "color_green_dark",
-            "color_green_light",
-            "color_orange_dark",
-            "color_orange_light",
-            "color_purple",
-            "color_red_dark",
-            "color_red_light",
-            "datepicker",
-            "display_info",
-            "edittext",
-            "progressbar_horizontal_0",
-            "progressbar_horizontal_100",
-            "progressbar_horizontal_50",
-            "progressbar_large",
-            "progressbar_small",
-            "progressbar",
-            "radiobutton_checked",
-            "radiobutton",
-            "radiogroup_horizontal",
-            "radiogroup_vertical",
-            "ratingbar_0",
-            "ratingbar_2point5",
-            "ratingbar_5",
-            "ratingbar_0_pressed",
-            "ratingbar_2point5_pressed",
-            "ratingbar_5_pressed",
-            "searchview_query",
-            "searchview_query_hint",
-            "seekbar_0",
-            "seekbar_100",
-            "seekbar_50",
-            "spinner",
-            "switch_button_checked",
-            "switch_button",
-            "textview",
-            "timepicker",
-            "togglebutton_checked",
-            "togglebutton",
-            "zoomcontrols",
-    };
-
-    private final int NUM_LAYOUTS = LAYOUTS.length;
-
-    private final HashMap<String, File> mReferences = new HashMap<String, File>();
+    private final HashMap<String, File> mReferences = new HashMap<>();
 
     /** The ABI to use. */
     private IAbi mAbi;
@@ -197,32 +96,21 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        // Get the device, this gives a handle to run commands and install APKs.
+
         mDevice = getDevice();
-        // Remove any previously installed versions of this APK.
-        mDevice.uninstallPackage(PACKAGE);
+        mDevice.uninstallPackage(APP_PACKAGE_NAME);
+
         // Get the APK from the build.
-        File app = mBuild.getTestApp(APK);
-        // Get the ABI flag.
-        String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
-        // Install the APK on the device.
+        final File app = mBuild.getTestApp(String.format("%s.apk", APK_NAME));
+        final String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
+
         mDevice.installPackage(app, false, options);
-        // Remove previously generated images.
-        mDevice.executeShellCommand(CLEAR_GENERATED_CMD);
-        final String densityProp;
 
-        if (mDevice.getSerialNumber().startsWith("emulator-")) {
-            densityProp = DENSITY_PROP_EMULATOR;
-        } else {
-            densityProp = DENSITY_PROP_DEVICE;
-        }
+        final String density = getDensityBucketForDevice(mDevice);
+        final String zipFile = String.format("/%s.zip", density);
+        Log.logAndDisplay(LogLevel.INFO, LOG_TAG, "Loading resources from " + zipFile);
 
-        final String zip = String.format("/%s.zip",
-                getDensityBucket(Integer.parseInt(mDevice.getProperty(densityProp))));
-        Log.logAndDisplay(LogLevel.INFO, TAG, "Loading resources from " + zip);
-
-
-        final InputStream zipStream = this.getClass().getResourceAsStream(zip);
+        final InputStream zipStream = ThemeHostTest.class.getResourceAsStream(zipFile);
         if (zipStream != null) {
             final ZipInputStream in = new ZipInputStream(zipStream);
             try {
@@ -232,21 +120,28 @@
                     final String name = ze.getName();
                     final File tmp = File.createTempFile("ref_" + name, ".png");
                     final FileOutputStream out = new FileOutputStream(tmp);
+
                     int count;
                     while ((count = in.read(buffer)) != -1) {
                         out.write(buffer, 0, count);
                     }
+
                     out.flush();
                     out.close();
                     mReferences.put(name, tmp);
                 }
+            } catch (IOException e) {
+                Log.logAndDisplay(LogLevel.ERROR, LOG_TAG, "Failed to unzip assets: " + zipFile);
             } finally {
                 in.close();
             }
+        } else {
+            Log.logAndDisplay(LogLevel.ERROR, LOG_TAG, "Failed to get resource: " + zipFile);
         }
 
-        mExecutionService = Executors.newFixedThreadPool(2);// 2 worker threads
-        mCompletionService = new ExecutorCompletionService<Boolean>(mExecutionService);
+        final int numCores = Runtime.getRuntime().availableProcessors();
+        mExecutionService = Executors.newFixedThreadPool(numCores * 2);
+        mCompletionService = new ExecutorCompletionService<>(mExecutionService);
     }
 
     @Override
@@ -255,86 +150,148 @@
         for (File ref : mReferences.values()) {
             ref.delete();
         }
+
         mExecutionService.shutdown();
+
         // Remove the APK.
-        mDevice.uninstallPackage(PACKAGE);
+        mDevice.uninstallPackage(APP_PACKAGE_NAME);
+
         // Remove generated images.
         mDevice.executeShellCommand(CLEAR_GENERATED_CMD);
+
         super.tearDown();
     }
 
     @TimeoutReq(minutes = 60)
-    public void testHoloThemes() throws Exception {
-        if (checkHardwareTypeSkipTest(
-                mDevice.executeShellCommand(HARDWARE_TYPE_CMD).trim())) {
-            Log.logAndDisplay(LogLevel.INFO, TAG, "Skipped HoloThemes test for watch and TV");
+    public void testThemes() throws Exception {
+        if (checkHardwareTypeSkipTest(mDevice.executeShellCommand(HARDWARE_TYPE_CMD).trim())) {
+            Log.logAndDisplay(LogLevel.INFO, LOG_TAG, "Skipped themes test for watch");
             return;
         }
 
         if (mReferences.isEmpty()) {
-            Log.logAndDisplay(LogLevel.INFO, TAG,
-                    "Skipped HoloThemes test due to no reference images");
+            Log.logAndDisplay(LogLevel.INFO, LOG_TAG, "Skipped themes test due to no reference images");
             return;
         }
 
+        Log.logAndDisplay(LogLevel.INFO, LOG_TAG, "Generating device images...");
+
+        assertTrue("Aborted image generation", generateDeviceImages());
+
+        // Pull ZIP file from remote device.
+        final File localZip = File.createTempFile("generated", ".zip");
+        mDevice.pullFile(GENERATED_ASSETS_ZIP, localZip);
+
         int numTasks = 0;
-        for (int i = 0; i < NUM_THEMES; i++) {
-            final String themeName = THEMES[i];
-            runCapture(i, themeName);
-            for (int j = 0; j < NUM_LAYOUTS; j++) {
-                final String name = String.format("%s_%s", themeName, LAYOUTS[j]);
-                final File ref = mReferences.get(name + ".png");
-                if (!ref.exists()) {
-                    Log.logAndDisplay(LogLevel.INFO, TAG,
-                            "Skipping theme test due to missing reference for reference image " +
-                            name);
-                    continue;
+
+        Log.logAndDisplay(LogLevel.INFO, LOG_TAG, "Extracting generated images...");
+
+        // Extract generated images to temporary files.
+        final byte[] data = new byte[4096];
+        final ZipInputStream zipInput = new ZipInputStream(new FileInputStream(localZip));
+        ZipEntry entry;
+        while ((entry = zipInput.getNextEntry()) != null) {
+            final String name = entry.getName();
+            final File expected = mReferences.get(name);
+            if (expected != null && expected.exists()) {
+                final File actual = File.createTempFile("actual_" + name, ".png");
+                final FileOutputStream pngOutput = new FileOutputStream(actual);
+
+                int count;
+                while ((count = zipInput.read(data, 0, data.length)) != -1) {
+                    pngOutput.write(data, 0, count);
                 }
-                mCompletionService.submit(new ComparisonTask(mDevice, ref, name));
+
+                pngOutput.flush();
+                pngOutput.close();
+
+                mCompletionService.submit(new ComparisonTask(mDevice, expected, actual));
                 numTasks++;
+            } else {
+                Log.logAndDisplay(LogLevel.INFO, LOG_TAG, "Missing reference image for " + name);
             }
+
+            zipInput.closeEntry();
         }
+
+        zipInput.close();
+
+        Log.logAndDisplay(LogLevel.INFO, LOG_TAG, "Waiting for comparison tasks...");
+
         int failures = 0;
-        for (int i = 0; i < numTasks; i++) {
+        for (int i = numTasks; i > 0; i--) {
             failures += mCompletionService.take().get() ? 0 : 1;
         }
+
         assertTrue(failures + " failures in theme test", failures == 0);
+
+        Log.logAndDisplay(LogLevel.INFO, LOG_TAG, "Finished!");
     }
 
-    private void runCapture(int themeId, String themeName) throws Exception {
-        final StringBuilder sb = new StringBuilder(START_CMD);
-        sb.append(String.format(INTENT_INTEGER_EXTRA, EXTRA_THEME, themeId));
-        final String startCommand = sb.toString();
+    private boolean generateDeviceImages() throws Exception {
         // Clear logcat
         mDevice.executeAdbCommand("logcat", "-c");
+
         // Stop any existing instances
         mDevice.executeShellCommand(STOP_CMD);
-        // Start activity
-        mDevice.executeShellCommand(startCommand);
 
+        // Start activity
+        mDevice.executeShellCommand(START_CMD);
+
+        Log.logAndDisplay(LogLevel.VERBOSE, LOG_TAG, "Starting image generation...");
+
+        boolean aborted = false;
         boolean waiting = true;
         do {
             // Dump logcat.
             final String logs = mDevice.executeAdbCommand(
                     "logcat", "-v", "brief", "-d", CLASS + ":I", "*:S");
+
             // Search for string.
             final Scanner in = new Scanner(logs);
             while (in.hasNextLine()) {
                 final String line = in.nextLine();
                 if (line.startsWith("I/" + CLASS)) {
                     final String[] lineSplit = line.split(":");
-                    final String s = lineSplit[1].trim();
-                    final String themeNameGenerated = lineSplit[2].trim();
-                    if (s.equals("OKAY") && themeNameGenerated.equals(themeName)) {
-                        waiting = false;
+                    if (lineSplit.length >= 3) {
+                        final String cmd = lineSplit[1].trim();
+                        final String arg = lineSplit[2].trim();
+                        switch (cmd) {
+                            case "FAIL":
+                                Log.logAndDisplay(LogLevel.WARN, LOG_TAG, line);
+                                Log.logAndDisplay(LogLevel.WARN, LOG_TAG, "Aborting! Check host logs for details.");
+                                aborted = true;
+                                // fall-through
+                            case "OKAY":
+                                waiting = false;
+                                break;
+                        }
                     }
                 }
             }
             in.close();
-        } while (waiting);
+        } while (waiting && !aborted);
+
+        Log.logAndDisplay(LogLevel.VERBOSE, LOG_TAG, "Image generation completed!");
+
+        return !aborted;
     }
 
-    private static String getDensityBucket(int density) {
+    private static String getDensityBucketForDevice(ITestDevice device) {
+        final String densityProp;
+        if (device.getSerialNumber().startsWith("emulator-")) {
+            densityProp = DENSITY_PROP_EMULATOR;
+        } else {
+            densityProp = DENSITY_PROP_DEVICE;
+        }
+
+        final int density;
+        try {
+            density = Integer.parseInt(device.getProperty(densityProp));
+        } catch (DeviceNotAvailableException e) {
+            return "unknown";
+        }
+
         switch (density) {
             case 120:
                 return "ldpi";
@@ -363,9 +320,7 @@
         if (hardwareTypeString.contains("android.hardware.type.watch")) {
             return true;
         }
-        if (hardwareTypeString.contains("android.hardware.type.television")) {
-            return true;
-        }
+
         return false;
     }
 }
diff --git a/hostsidetests/usage/Android.mk b/hostsidetests/usage/Android.mk
new file mode 100644
index 0000000..1d4e36d
--- /dev/null
+++ b/hostsidetests/usage/Android.mk
@@ -0,0 +1,30 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+# Must match the package name in CtsTestCaseList.mk
+LOCAL_MODULE := CtsUsageHostTestCases
+
+LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt
+
+LOCAL_CTS_TEST_PACKAGE := android.host.app.usage
+
+include $(BUILD_CTS_HOST_JAVA_LIBRARY)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hostsidetests/usage/app/Android.mk b/hostsidetests/usage/app/Android.mk
new file mode 100644
index 0000000..b23efbc
--- /dev/null
+++ b/hostsidetests/usage/app/Android.mk
@@ -0,0 +1,28 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# Don't include this package in any target.
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_PACKAGE_NAME := CtsDeviceAppUsageTestApp
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/hostsidetests/usage/app/AndroidManifest.xml b/hostsidetests/usage/app/AndroidManifest.xml
new file mode 100755
index 0000000..bad453f
--- /dev/null
+++ b/hostsidetests/usage/app/AndroidManifest.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.app.usage.test">
+
+    <application>
+        <activity android:name=".TestActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
+
diff --git a/hostsidetests/usage/app/src/com/android/cts/app/usage/test/TestActivity.java b/hostsidetests/usage/app/src/com/android/cts/app/usage/test/TestActivity.java
new file mode 100644
index 0000000..9432477
--- /dev/null
+++ b/hostsidetests/usage/app/src/com/android/cts/app/usage/test/TestActivity.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.app.usage.test;
+
+import android.app.Activity;
+
+public class TestActivity extends Activity {
+}
\ No newline at end of file
diff --git a/hostsidetests/usage/src/com/android/cts/app/usage/AppIdleHostTest.java b/hostsidetests/usage/src/com/android/cts/app/usage/AppIdleHostTest.java
new file mode 100644
index 0000000..b94d086
--- /dev/null
+++ b/hostsidetests/usage/src/com/android/cts/app/usage/AppIdleHostTest.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.app.usage;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+
+public class AppIdleHostTest extends DeviceTestCase implements IBuildReceiver {
+    private static final String SETTINGS_APP_IDLE_CONSTANTS = "app_idle_constants";
+
+    private static final String TEST_APP_PACKAGE = "com.android.cts.app.usage.test";
+    private static final String TEST_APP_APK = "CtsDeviceAppUsageTestApp.apk";
+    private static final String TEST_APP_CLASS = "TestActivity";
+
+    private static final long ACTIVITY_LAUNCH_WAIT_MILLIS = 500;
+
+    /**
+     * A reference to the build.
+     */
+    private CtsBuildHelper mBuild;
+
+    /**
+     * A reference to the device under test.
+     */
+    private ITestDevice mDevice;
+
+    @Override
+    public void setBuild(IBuildInfo buildInfo) {
+        // Get the build, this is used to access the APK.
+        mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        // Get the device, this gives a handle to run commands and install APKs.
+        mDevice = getDevice();
+
+        // Remove any previously installed versions of this APK.
+        mDevice.uninstallPackage(TEST_APP_PACKAGE);
+
+        // Install the APK on the device.
+        mDevice.installPackage(mBuild.getTestApp(TEST_APP_APK), false);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        // Remove the package once complete.
+        mDevice.uninstallPackage(TEST_APP_PACKAGE);
+        super.tearDown();
+    }
+
+    /**
+     * Checks whether an package is idle.
+     * @param appPackage The package to check for idleness.
+     * @return true if the package is idle
+     * @throws DeviceNotAvailableException
+     */
+    private boolean isAppIdle(String appPackage) throws DeviceNotAvailableException {
+        String result = mDevice.executeShellCommand(String.format("am get-inactive %s", appPackage));
+        return result.contains("Idle=true");
+    }
+
+    /**
+     * Set the app idle settings.
+     * @param settingsStr The settings string, a comma separated key=value list.
+     * @throws DeviceNotAvailableException
+     */
+    private void setAppIdleSettings(String settingsStr) throws DeviceNotAvailableException {
+        mDevice.executeShellCommand(String.format("settings put global %s \"%s\"",
+                SETTINGS_APP_IDLE_CONSTANTS, settingsStr));
+    }
+
+    /**
+     * Get the current app idle settings.
+     * @throws DeviceNotAvailableException
+     */
+    private String getAppIdleSettings() throws DeviceNotAvailableException {
+        String result = mDevice.executeShellCommand(String.format("settings get global %s",
+                SETTINGS_APP_IDLE_CONSTANTS));
+        return result.trim();
+    }
+
+    /**
+     * Launch the test app for a few hundred milliseconds then launch home.
+     * @throws DeviceNotAvailableException
+     */
+    private void startAndStopTestApp() throws DeviceNotAvailableException {
+        // Launch the app.
+        mDevice.executeShellCommand(
+                String.format("am start -W -a android.intent.action.MAIN -n %s/%s.%s",
+                        TEST_APP_PACKAGE, TEST_APP_PACKAGE, TEST_APP_CLASS));
+
+        // Wait for some time.
+        sleepUninterrupted(ACTIVITY_LAUNCH_WAIT_MILLIS);
+
+        // Launch home.
+        mDevice.executeShellCommand(
+                "am start -W -a android.intent.action.MAIN -c android.intent.category.HOME");
+    }
+
+    /**
+     * Tests that the app is not idle right after it is launched.
+     */
+    public void testAppIsNotIdleAfterBeingLaunched() throws Exception {
+        final String previousState = getAppIdleSettings();
+        try {
+            // Set the app idle time to something large.
+            setAppIdleSettings("idle_duration=10000,wallclock_threshold=10000");
+            startAndStopTestApp();
+            assertFalse(isAppIdle(TEST_APP_PACKAGE));
+        } finally {
+            setAppIdleSettings(previousState);
+        }
+    }
+
+    private static void sleepUninterrupted(long timeMillis) {
+        boolean interrupted;
+        do {
+            try {
+                Thread.sleep(timeMillis);
+                interrupted = false;
+            } catch (InterruptedException e) {
+                interrupted = true;
+            }
+        } while (interrupted);
+    }
+}
diff --git a/libs/commonutil/src/com/android/cts/util/ReportLog.java b/libs/commonutil/src/com/android/cts/util/ReportLog.java
index 56b431a..dd4b414 100644
--- a/libs/commonutil/src/com/android/cts/util/ReportLog.java
+++ b/libs/commonutil/src/com/android/cts/util/ReportLog.java
@@ -42,26 +42,55 @@
 
     /**
      * print array of values to output log
+     * <p>Note: test identifier is inferred from call stack trace based on class and method name
      */
     public void printArray(String message, double[] values, ResultType type, ResultUnit unit) {
         doPrintArray(message, values, type, unit);
     }
 
     /**
+     * print array of values to output log
+     */
+    public void printArray(String testId, String message,
+            double[] values, ResultType type, ResultUnit unit) {
+        doPrintArray(testId, message, values, type, unit);
+    }
+
+    /**
      * Print a value to output log
+     * <p>Note: test identifier is inferred from call stack trace based on class and method name
      */
     public void printValue(String message, double value, ResultType type, ResultUnit unit) {
         double[] vals = { value };
         doPrintArray(message, vals, type, unit);
     }
 
+    /**
+     * Print a value to output log
+     */
+    public void printValue(String testId, String message,
+            double value, ResultType type, ResultUnit unit) {
+        double[] vals = { value };
+        doPrintArray(testId, message, vals, type, unit);
+    }
+
     private void doPrintArray(String message, double[] values, ResultType type, ResultUnit unit) {
+        doPrintArray(getClassMethodNames(mDepth + 1, true), message, values, type, unit);
+    }
+
+    private void doPrintArray(String testId, String message,
+            double[] values, ResultType type, ResultUnit unit) {
         StringBuilder builder = new StringBuilder();
         // note mDepth + 1 as this function will be called by printVaue or printArray
         // and we need caller of printValue / printArray
-        builder.append(getClassMethodNames(mDepth + 1, true) + LOG_ELEM_SEPARATOR + message +
-                LOG_ELEM_SEPARATOR + type.getXmlString() + LOG_ELEM_SEPARATOR +
-                unit.getXmlString() + LOG_ELEM_SEPARATOR);
+        builder.append(testId);
+        builder.append(LOG_ELEM_SEPARATOR);
+        builder.append(message);
+        builder.append(LOG_ELEM_SEPARATOR);
+        builder.append(type.getXmlString());
+        builder.append(LOG_ELEM_SEPARATOR);
+        builder.append(unit.getXmlString());
+        builder.append(LOG_ELEM_SEPARATOR);
         for (double v : values) {
             builder.append(v);
             builder.append(" ");
diff --git a/libs/deviceutil/src/android/cts/util/LocationUtils.java b/libs/deviceutil/src/android/cts/util/LocationUtils.java
new file mode 100644
index 0000000..1f7af86
--- /dev/null
+++ b/libs/deviceutil/src/android/cts/util/LocationUtils.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2015 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.cts.util;
+
+import android.app.Instrumentation;
+import android.util.Log;
+
+import java.io.IOException;
+
+public class LocationUtils {
+    private static String TAG = "LocationUtils";
+
+    public static void registerMockLocationProvider(Instrumentation instrumentation,
+            boolean enable) {
+        StringBuilder command = new StringBuilder();
+        command.append("appops set ");
+        command.append(instrumentation.getContext().getPackageName());
+        command.append(" android:mock_location ");
+        command.append(enable ? "allow" : "deny");
+        try {
+            SystemUtil.runShellCommand(instrumentation, command.toString());
+        } catch (IOException e) {
+            Log.e(TAG, "Error managing mock location app. Command: " + command, e);
+        }
+    }
+}
diff --git a/libs/deviceutil/src/android/cts/util/MediaUtils.java b/libs/deviceutil/src/android/cts/util/MediaUtils.java
index 5908923..7e2bfe3 100755
--- a/libs/deviceutil/src/android/cts/util/MediaUtils.java
+++ b/libs/deviceutil/src/android/cts/util/MediaUtils.java
@@ -19,13 +19,22 @@
 import android.content.res.AssetFileDescriptor;
 import android.media.MediaCodec;
 import android.media.MediaCodecInfo;
+import android.media.MediaCodecInfo.CodecCapabilities;
+import android.media.MediaCodecInfo.VideoCapabilities;
 import android.media.MediaCodecList;
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
 import android.net.Uri;
+import android.util.Range;
+
+import com.android.cts.util.ReportLog;
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+
 import java.lang.reflect.Method;
 import static java.lang.reflect.Modifier.isPublic;
 import static java.lang.reflect.Modifier.isStatic;
+import java.util.Arrays;
 import java.util.Map;
 import android.util.Log;
 
@@ -159,6 +168,40 @@
         return true;
     }
 
+    public static boolean supports(String codecName, String mime, int w, int h) {
+        MediaCodec codec;
+        try {
+            codec = MediaCodec.createByCodecName(codecName);
+        } catch (IOException e) {
+            return false;
+        }
+
+        CodecCapabilities cap = null;
+        try {
+            cap = codec.getCodecInfo().getCapabilitiesForType(mime);
+        } catch (IllegalArgumentException e) {
+            Log.w(TAG, "not supported mime: " + mime);
+            codec.release();
+            return false;
+        }
+
+        VideoCapabilities vidCap = cap.getVideoCapabilities();
+        if (vidCap == null) {
+            Log.w(TAG, "not a video codec: " + codecName);
+            codec.release();
+            return false;
+        }
+        try {
+            Range<Double> fps = vidCap.getSupportedFrameRatesFor(w, h);
+        } catch (IllegalArgumentException e) {
+            Log.w(TAG, "unsupported size " + w + "x" + h);
+            codec.release();
+            return false;
+        }
+        codec.release();
+        return true;
+    }
+
     public static boolean hasCodecForTrack(MediaExtractor ex, int track) {
         int count = ex.getTrackCount();
         if (track < 0 || track >= count) {
@@ -346,4 +389,152 @@
     public static boolean checkDecoderForFormat(MediaFormat format) {
         return check(canDecode(format), "no decoder for " + format);
     }
+
+    public static MediaExtractor createMediaExtractorForMimeType(
+            Context context, int resourceId, String mimeTypePrefix)
+            throws IOException {
+        MediaExtractor extractor = new MediaExtractor();
+        AssetFileDescriptor afd = context.getResources().openRawResourceFd(resourceId);
+        try {
+            extractor.setDataSource(
+                    afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
+        } finally {
+            afd.close();
+        }
+        int trackIndex;
+        for (trackIndex = 0; trackIndex < extractor.getTrackCount(); trackIndex++) {
+            MediaFormat trackMediaFormat = extractor.getTrackFormat(trackIndex);
+            if (trackMediaFormat.getString(MediaFormat.KEY_MIME).startsWith(mimeTypePrefix)) {
+                extractor.selectTrack(trackIndex);
+                break;
+            }
+        }
+        if (trackIndex == extractor.getTrackCount()) {
+            extractor.release();
+            throw new IllegalStateException("couldn't get a track for " + mimeTypePrefix);
+        }
+
+        return extractor;
+    }
+
+    /**
+     * return the average value of the passed array.
+     */
+    public static double getAverage(double[] data) {
+        int num = data.length;
+        if (num == 0) {
+            return 0;
+        }
+
+        double sum = data[0];
+        for (int i = 1; i < num; i++) {
+            sum += data[i];
+        }
+        return sum / num;
+    }
+
+    /**
+     * return the standard deviation value of the passed array
+     */
+    public static double getStdev(double[] data) {
+        double average = getAverage(data);
+        int num = data.length;
+        if (num == 0) {
+            return 0;
+        }
+        double variance = 0;
+        for (int i = 0; i < num; ++i) {
+            variance += (data[i] - average) * (data[i] - average);
+        }
+        variance /= num;
+        return Math.sqrt(variance);
+    }
+
+    public static double[] calculateMovingAverage(double[] array, int n) {
+        int num = array.length;
+        if (num < n) {
+            return null;
+        }
+        int avgsNum = num - n + 1;
+        double[] avgs = new double[avgsNum];
+        double sum = array[0];
+        for (int i = 1; i < n; ++i) {
+            sum += array[i];
+        }
+        avgs[0] = sum / n;
+
+        for (int i = n; i < num; ++i) {
+            sum = sum - array[i - n] + array[i];
+            avgs[i - n + 1] = sum / n;
+        }
+        return avgs;
+    }
+
+    public static String logResults(ReportLog log, String prefix,
+            double min, double max, double avg, double stdev) {
+        String msg = prefix;
+        msg += " min=" + Math.round(min / 1000) + " max=" + Math.round(max / 1000) +
+                " avg=" + Math.round(avg / 1000) + " stdev=" + Math.round(stdev / 1000);
+        log.printValue(msg, 1000000000 / min, ResultType.HIGHER_BETTER, ResultUnit.FPS);
+        return msg;
+    }
+
+    public static VideoCapabilities getVideoCapabilities(String codecName, String mime) {
+        for (MediaCodecInfo info : sMCL.getCodecInfos()) {
+            if (!info.getName().equalsIgnoreCase(codecName)) {
+                continue;
+            }
+            CodecCapabilities caps;
+            try {
+                caps = info.getCapabilitiesForType(mime);
+            } catch (IllegalArgumentException e) {
+                // mime is not supported
+                continue;
+            }
+            return caps.getVideoCapabilities();
+        }
+        return null;
+    }
+
+    public static Range<Double> getAchievableFrameRatesFor(
+            String codecName, String mimeType, int width, int height) {
+        VideoCapabilities cap = getVideoCapabilities(codecName, mimeType);
+        if (cap == null) {
+            return null;
+        }
+        return cap.getAchievableFrameRatesFor(width, height);
+    }
+
+    private static final double FRAMERATE_TOLERANCE = Math.sqrt(12.1);
+    public static boolean verifyResults(String name, String mime, int w, int h, double measured) {
+        Range<Double> reported = getAchievableFrameRatesFor(name, mime, w, h);
+        if (reported == null) {
+            Log.d(TAG, "Failed to getAchievableFrameRatesFor " +
+                    name + " " + mime + " " + w + "x" + h);
+            return false;
+        }
+        double lowerBoundary1 = reported.getLower() / FRAMERATE_TOLERANCE;
+        double upperBoundary1 = reported.getUpper() * FRAMERATE_TOLERANCE;
+        double lowerBoundary2 = reported.getUpper() / Math.pow(FRAMERATE_TOLERANCE, 2);
+        double upperBoundary2 = reported.getLower() * Math.pow(FRAMERATE_TOLERANCE, 2);
+        Log.d(TAG, name + " " + mime + " " + w + "x" + h + " " +
+                "lowerBoundary1 " + lowerBoundary1 + " upperBoundary1 " + upperBoundary1 +
+                " lowerBoundary2 " + lowerBoundary2 + " upperBoundary2 " + upperBoundary2 +
+                " measured " + measured);
+        return (measured >= lowerBoundary1 && measured <= upperBoundary1 &&
+                measured >= lowerBoundary2 && measured <= upperBoundary2);
+    }
+
+    public static String getErrorMessage(
+            Range<Double> reportedRange, double[] measuredFps, String[] rawData) {
+        String msg = "";
+        if (reportedRange == null) {
+            msg += "Failed to get achievable frame rate.\n";
+        } else {
+            msg += "Expected achievable frame rate range: " + reportedRange + ".\n";
+        }
+        msg += "Measured frame rate: " + Arrays.toString(measuredFps) + ".\n";
+        msg += "Raw data: " + Arrays.toString(rawData) + ".\n";
+        return msg;
+    }
 }
diff --git a/libs/deviceutil/src/android/cts/util/SystemUtil.java b/libs/deviceutil/src/android/cts/util/SystemUtil.java
index e6222cb..6e7fd38 100644
--- a/libs/deviceutil/src/android/cts/util/SystemUtil.java
+++ b/libs/deviceutil/src/android/cts/util/SystemUtil.java
@@ -18,9 +18,14 @@
 
 import android.app.ActivityManager;
 import android.app.ActivityManager.MemoryInfo;
+import android.app.Instrumentation;
 import android.content.Context;
+import android.os.ParcelFileDescriptor;
 import android.os.StatFs;
 
+import java.io.FileInputStream;
+import java.io.IOException;
+
 public class SystemUtil {
     public static long getFreeDiskSize(Context context) {
         StatFs statFs = new StatFs(context.getFilesDir().getAbsolutePath());
@@ -40,4 +45,28 @@
         activityManager.getMemoryInfo(info);
         return info.totalMem; // TODO totalMem N/A in ICS.
     }
+
+    /**
+     * Executes a shell command using shell user identity, and return the standard output in string
+     * <p>Note: calling this function requires API level 21 or above
+     * @param instrumentation {@link Instrumentation} instance, obtained from a test running in
+     * instrumentation framework
+     * @param cmd the command to run
+     * @return the standard output of the command
+     * @throws Exception
+     */
+    public static String runShellCommand(Instrumentation instrumentation, String cmd)
+            throws IOException {
+        ParcelFileDescriptor pfd = instrumentation.getUiAutomation().executeShellCommand(cmd);
+        byte[] buf = new byte[512];
+        int bytesRead;
+        FileInputStream fis = new ParcelFileDescriptor.AutoCloseInputStream(pfd);
+        StringBuffer stdout = new StringBuffer();
+        while ((bytesRead = fis.read(buf)) != -1) {
+            stdout.append(new String(buf, 0, bytesRead));
+        }
+        fis.close();
+        return stdout.toString();
+    }
+
 }
diff --git a/libs/deviceutillegacy/src/android/webkit/cts/WebViewOnUiThread.java b/libs/deviceutillegacy/src/android/webkit/cts/WebViewOnUiThread.java
index b9d3af1..2933b0b 100644
--- a/libs/deviceutillegacy/src/android/webkit/cts/WebViewOnUiThread.java
+++ b/libs/deviceutillegacy/src/android/webkit/cts/WebViewOnUiThread.java
@@ -21,6 +21,7 @@
 import android.graphics.Bitmap;
 import android.graphics.Picture;
 import android.graphics.Rect;
+import android.net.Uri;
 import android.os.Bundle;
 import android.os.Looper;
 import android.os.Message;
@@ -36,9 +37,12 @@
 import android.webkit.ValueCallback;
 import android.webkit.WebBackForwardList;
 import android.webkit.WebChromeClient;
+import android.webkit.WebMessage;
+import android.webkit.WebMessagePort;
 import android.webkit.WebSettings;
 import android.webkit.WebView.HitTestResult;
 import android.webkit.WebView.PictureListener;
+import android.webkit.WebView.VisualStateCallback;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
 
@@ -306,6 +310,24 @@
         });
     }
 
+    public WebMessagePort[] createWebMessageChannel() {
+        return getValue(new ValueGetter<WebMessagePort[]>() {
+            @Override
+            public WebMessagePort[] capture() {
+                return mWebView.createWebMessageChannel();
+            }
+        });
+    }
+
+    public void postWebMessage(final WebMessage message, final Uri targetOrigin) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.postWebMessage(message, targetOrigin);
+            }
+        });
+    }
+
     public void addJavascriptInterface(final Object object, final String name) {
         runOnUiThread(new Runnable() {
             @Override
@@ -628,6 +650,15 @@
         });
     }
 
+    public void postVisualStateCallback(final long requestId, final VisualStateCallback callback) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.postVisualStateCallback(requestId, callback);
+            }
+        });
+    }
+
     public int[] getLocationOnScreen() {
         final int[] location = new int[2];
         return getValue(new ValueGetter<int[]>() {
diff --git a/libs/testserver/Android.mk b/libs/testserver/Android.mk
index dfe357b..488af53 100644
--- a/libs/testserver/Android.mk
+++ b/libs/testserver/Android.mk
@@ -22,4 +22,6 @@
 
 LOCAL_MODULE := ctstestserver
 
+LOCAL_SDK_VERSION := 16
+
 include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/libs/testserver/src/android/webkit/cts/CtsTestServer.java b/libs/testserver/src/android/webkit/cts/CtsTestServer.java
index 22cbb7b..de88f3b 100644
--- a/libs/testserver/src/android/webkit/cts/CtsTestServer.java
+++ b/libs/testserver/src/android/webkit/cts/CtsTestServer.java
@@ -15,7 +15,6 @@
  */
 package android.webkit.cts;
 
-import libcore.io.Base64;
 import org.apache.http.Header;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpEntityEnclosingRequest;
@@ -44,6 +43,7 @@
 import android.content.res.Resources;
 import android.net.Uri;
 import android.os.Environment;
+import android.util.Base64;
 import android.util.Log;
 import android.webkit.MimeTypeMap;
 
@@ -229,12 +229,30 @@
             // request for shutdown and having the server's one thread
             // sequentially call accept() and close().
             URL url = new URL(mServerUri + SHUTDOWN_PREFIX);
-            URLConnection connection = openConnection(url);
-            connection.connect();
+            if (url.getProtocol().equalsIgnoreCase("http")) {
+                // Use Socket instead of HttpURLConnection when the server is in cleartext HTTP mode
+                // to avoid the request being blocked by NetworkSecurityPolicy.
+                Socket socket = null;
+                try {
+                    socket = new Socket(url.getHost(), url.getPort());
+                    socket.getOutputStream().write(
+                        ("GET " + SHUTDOWN_PREFIX + " HTTP/1.0\r\n\r\n").getBytes("US-ASCII"));
+                    socket.getOutputStream().flush();
+                } finally {
+                    if (socket != null) {
+                        try {
+                            socket.close();
+                        } catch (Exception ignored) {}
+                    }
+                }
+            } else {
+                URLConnection connection = openConnection(url);
+                connection.connect();
 
-            // Read the input from the stream to send the request.
-            InputStream is = connection.getInputStream();
-            is.close();
+                // Read the input from the stream to send the request.
+                InputStream is = connection.getInputStream();
+                is.close();
+            }
 
             // Block until the server thread is done shutting down.
             mServerThread.join();
@@ -947,7 +965,7 @@
          * for the result.
          */
         private static KeyManager[] getKeyManagers() throws Exception {
-            byte[] bytes = Base64.decode(SERVER_KEYS_BKS.getBytes());
+            byte[] bytes = Base64.decode(SERVER_KEYS_BKS.getBytes(), Base64.DEFAULT);
             InputStream inputStream = new ByteArrayInputStream(bytes);
 
             KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
@@ -1014,7 +1032,7 @@
                         conn.receiveRequestEntity( (HttpEntityEnclosingRequest) request);
                     }
 
-                    mExecutorService.submit(new HandleResponseTask(conn, request));
+                    mExecutorService.execute(new HandleResponseTask(conn, request));
                 } catch (IOException e) {
                     // normal during shutdown, ignore
                     Log.w(TAG, e);
@@ -1045,7 +1063,7 @@
             return path.equals(SHUTDOWN_PREFIX);
         }
 
-        private class HandleResponseTask implements Callable<Void> {
+        private class HandleResponseTask implements Runnable {
 
             private DefaultHttpServerConnection mConnection;
 
@@ -1058,12 +1076,15 @@
             }
 
             @Override
-            public Void call() throws Exception {
-                HttpResponse response = mServer.getResponse(mRequest);
-                mConnection.sendResponseHeader(response);
-                mConnection.sendResponseEntity(response);
-                mConnection.close();
-                return null;
+            public void run() {
+                try {
+                    HttpResponse response = mServer.getResponse(mRequest);
+                    mConnection.sendResponseHeader(response);
+                    mConnection.sendResponseEntity(response);
+                    mConnection.close();
+                } catch (Exception e) {
+                    Log.e(TAG, "Error handling request:", e);
+                }
             }
         }
     }
diff --git a/libs/vogar-expect/src/vogar/Expectation.java b/libs/vogar-expect/src/vogar/Expectation.java
index f065f42..ddbc233f 100644
--- a/libs/vogar-expect/src/vogar/Expectation.java
+++ b/libs/vogar-expect/src/vogar/Expectation.java
@@ -16,7 +16,6 @@
 
 package vogar;
 
-import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.Set;
 import java.util.regex.Pattern;
@@ -37,14 +36,6 @@
  */
 public final class Expectation {
 
-    /** The pattern to use when no expected output is specified */
-    public static final Pattern MATCH_ALL_PATTERN
-            = Pattern.compile(".*", Pattern.MULTILINE | Pattern.DOTALL);
-
-    /** The expectation of a general successful run. */
-    public static final Expectation SUCCESS = new Expectation(Result.SUCCESS, MATCH_ALL_PATTERN,
-            Collections.<String>emptySet(), "", -1);
-
     /** Justification for this expectation */
     private final String description;
 
diff --git a/libs/vogar-expect/src/vogar/ExpectationStore.java b/libs/vogar-expect/src/vogar/ExpectationStore.java
index cfa20e9..090322d 100644
--- a/libs/vogar-expect/src/vogar/ExpectationStore.java
+++ b/libs/vogar-expect/src/vogar/ExpectationStore.java
@@ -26,6 +26,7 @@
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
+import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -50,7 +51,17 @@
  * expectation, the outcome expectation will be returned.
  */
 public final class ExpectationStore {
+
+    /** The pattern to use when no expected output is specified */
+    private static final Pattern MATCH_ALL_PATTERN
+            = Pattern.compile(".*", Pattern.MULTILINE | Pattern.DOTALL);
+
+    /** The expectation of a general successful run. */
+    private static final Expectation SUCCESS = new Expectation(Result.SUCCESS, MATCH_ALL_PATTERN,
+            Collections.<String>emptySet(), "", -1);
+
     private static final int PATTERN_FLAGS = Pattern.MULTILINE | Pattern.DOTALL;
+
     private final Map<String, Expectation> outcomes = new LinkedHashMap<String, Expectation>();
     private final Map<String, Expectation> failures = new LinkedHashMap<String, Expectation>();
 
@@ -62,7 +73,7 @@
      */
     public Expectation get(String name) {
         Expectation byName = getByNameOrPackage(name);
-        return byName != null ? byName : Expectation.SUCCESS;
+        return byName != null ? byName : SUCCESS;
     }
 
     /**
@@ -87,7 +98,7 @@
         }
 
         Expectation byName = getByNameOrPackage(outcome.getName());
-        return byName != null ? byName : Expectation.SUCCESS;
+        return byName != null ? byName : SUCCESS;
     }
 
     private Expectation getByNameOrPackage(String name) {
@@ -141,8 +152,8 @@
 
     private void readExpectation(JsonReader reader, ModeId mode) throws IOException {
         boolean isFailure = false;
-        Result result = Result.SUCCESS;
-        Pattern pattern = Expectation.MATCH_ALL_PATTERN;
+        Result result = Result.EXEC_FAILED;
+        Pattern pattern = MATCH_ALL_PATTERN;
         Set<String> names = new LinkedHashSet<String>();
         Set<String> tags = new LinkedHashSet<String>();
         Set<ModeId> modes = null;
@@ -159,6 +170,12 @@
             } else if (name.equals("names")) {
                 readStrings(reader, names);
             } else if (name.equals("failure")) {
+                // isFailure is somewhat arbitrarily keyed on the existence of a "failure"
+                // element instead of looking at the "result" field. There are only about 5
+                // expectations in our entire expectation store that have this tag.
+                //
+                // TODO: Get rid of it and the "failures" map and just use the outcomes
+                // map for everything. Both uses seem useless.
                 isFailure = true;
                 names.add(reader.nextString());
             } else if (name.equals("pattern")) {
diff --git a/suite/cts/deviceTests/jank2/Android.mk b/suite/cts/deviceTests/jank2/Android.mk
new file mode 100644
index 0000000..346297e
--- /dev/null
+++ b/suite/cts/deviceTests/jank2/Android.mk
@@ -0,0 +1,29 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsJankTestCases
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner ub-uiautomator ub-janktesthelper
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/suite/cts/deviceTests/jank2/AndroidManifest.xml b/suite/cts/deviceTests/jank2/AndroidManifest.xml
new file mode 100644
index 0000000..a4c8337
--- /dev/null
+++ b/suite/cts/deviceTests/jank2/AndroidManifest.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="android.cts.jank">
+
+  <application>
+      <uses-library android:name="android.test.runner"/>
+  </application>
+
+  <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                   android:targetPackage="android.cts.jank"
+                   android:label="Jank tests">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+
+</manifest>
diff --git a/suite/cts/deviceTests/jank2/AndroidTest.xml b/suite/cts/deviceTests/jank2/AndroidTest.xml
new file mode 100644
index 0000000..2fbbac7
--- /dev/null
+++ b/suite/cts/deviceTests/jank2/AndroidTest.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="CTS Jank test config">
+    <include name="common-config" />
+    <option name="cts-apk-installer:test-file-name" value="CtsDeviceUi.apk" />
+</configuration>
diff --git a/suite/cts/deviceTests/jank2/src/android/cts/jank/CtsJankTestBase.java b/suite/cts/deviceTests/jank2/src/android/cts/jank/CtsJankTestBase.java
new file mode 100644
index 0000000..cb5c122
--- /dev/null
+++ b/suite/cts/deviceTests/jank2/src/android/cts/jank/CtsJankTestBase.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2015 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.cts.jank;
+
+import android.cts.util.DeviceReportLog;
+import android.os.Bundle;
+import android.support.test.jank.JankTestBase;
+import android.support.test.jank.WindowContentFrameStatsMonitor;
+import android.support.test.uiautomator.UiDevice;
+
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+
+public abstract class CtsJankTestBase extends JankTestBase {
+
+    private UiDevice mDevice;
+    private DeviceReportLog mLog;
+
+    @Override
+    public void afterTest(Bundle metrics) {
+        String source = String.format("%s#%s", getClass().getCanonicalName(), getName());
+        mLog.printValue(source, WindowContentFrameStatsMonitor.KEY_AVG_FPS,
+                metrics.getDouble(WindowContentFrameStatsMonitor.KEY_AVG_FPS),
+                ResultType.HIGHER_BETTER, ResultUnit.FPS);
+        mLog.printValue(source, WindowContentFrameStatsMonitor.KEY_AVG_LONGEST_FRAME,
+                metrics.getDouble(WindowContentFrameStatsMonitor.KEY_AVG_LONGEST_FRAME),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        mLog.printValue(source, WindowContentFrameStatsMonitor.KEY_MAX_NUM_JANKY,
+                metrics.getInt(WindowContentFrameStatsMonitor.KEY_MAX_NUM_JANKY),
+                ResultType.LOWER_BETTER, ResultUnit.COUNT);
+        mLog.printSummary(WindowContentFrameStatsMonitor.KEY_AVG_NUM_JANKY,
+                metrics.getDouble(WindowContentFrameStatsMonitor.KEY_AVG_NUM_JANKY),
+                ResultType.LOWER_BETTER, ResultUnit.COUNT);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mLog = new DeviceReportLog();
+        // fix device orientation
+        mDevice = UiDevice.getInstance(getInstrumentation());
+        mDevice.setOrientationNatural();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mLog.deliverReportToHost(getInstrumentation());
+        // restore device orientation
+        mDevice.unfreezeRotation();
+        super.tearDown();
+    }
+
+    protected UiDevice getUiDevice() {
+        return mDevice;
+    }
+}
diff --git a/suite/cts/deviceTests/jank2/src/android/cts/jank/ui/CtsDeviceJankUi.java b/suite/cts/deviceTests/jank2/src/android/cts/jank/ui/CtsDeviceJankUi.java
new file mode 100644
index 0000000..884f83c
--- /dev/null
+++ b/suite/cts/deviceTests/jank2/src/android/cts/jank/ui/CtsDeviceJankUi.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2015 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.cts.jank.ui;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.cts.jank.CtsJankTestBase;
+import android.os.SystemClock;
+import android.support.test.jank.JankTest;
+import android.support.test.jank.WindowContentFrameStatsMonitor;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.Direction;
+import android.support.test.uiautomator.Until;
+import android.widget.ListView;
+
+import java.io.IOException;
+
+public class CtsDeviceJankUi extends CtsJankTestBase {
+    private final static int NUM_ELEMENTS = 1000;
+    private static final long DEFAULT_ANIMATION_TIME = 2 * 1000;
+    private static final long POST_SCROLL_IDLE_TIME = 2 *1000;
+    private final static String PACKAGE = "com.android.cts.ui";
+    private final static String CLASS = PACKAGE + ".ScrollingActivity";
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        // launch the activity as part of the set up
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setComponent(new ComponentName(PACKAGE, CLASS));
+        intent.putExtra("num_elements", NUM_ELEMENTS);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        getInstrumentation().getTargetContext().startActivity(intent);
+        getUiDevice().wait(Until.hasObject(By.pkg(PACKAGE)), DEFAULT_ANIMATION_TIME);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        getUiDevice().pressHome();
+        super.tearDown();
+    }
+
+    @JankTest(expectedFrames=50, defaultIterationCount=5)
+    @WindowContentFrameStatsMonitor
+    public void testScrolling() throws IOException {
+        getUiDevice().findObject(By.clazz(ListView.class)).fling(Direction.DOWN);
+        SystemClock.sleep(POST_SCROLL_IDLE_TIME);
+    }
+}
diff --git a/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/CodecInfo.java b/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/CodecInfo.java
index 462794b..ccb3126 100644
--- a/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/CodecInfo.java
+++ b/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/CodecInfo.java
@@ -16,6 +16,7 @@
 
 package com.android.cts.videoperf;
 
+import android.media.MediaCodec;
 import android.media.MediaCodecInfo;
 import android.media.MediaCodecInfo.CodecCapabilities;
 import android.media.MediaCodecInfo.CodecProfileLevel;
@@ -23,7 +24,9 @@
 import android.media.MediaCodecList;
 import android.media.MediaFormat;
 import android.util.Log;
+import android.util.Range;
 
+import java.io.IOException;
 
 /**
  * Utility class for getting codec information like bit rate, fps, and etc.
@@ -43,32 +46,25 @@
     private static final String VIDEO_AVC = MediaFormat.MIMETYPE_VIDEO_AVC;
     /**
      * Check if given codec with given (w,h) is supported.
+     * @param codecName codec name
      * @param mimeType codec type in mime format like MediaFormat.MIMETYPE_VIDEO_AVC
      * @param w video width
      * @param h video height
-     * @param isEncoder whether the codec is encoder or decoder
      * @return null if the configuration is not supported.
      */
     public static CodecInfo getSupportedFormatInfo(
-            String mimeType, int w, int h, boolean isEncoder) {
-        MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
-        MediaFormat format = MediaFormat.createVideoFormat(mimeType, w, h);
-        String codec = isEncoder
-                ? mcl.findEncoderForFormat(format)
-                : mcl.findDecoderForFormat(format);
-        if (codec == null) { // not supported
+            String codecName, String mimeType, int w, int h) {
+        MediaCodec codec;
+        try {
+            codec = MediaCodec.createByCodecName(codecName);
+        } catch (IOException e) {
             return null;
         }
-        CodecCapabilities cap = null;
-        for (MediaCodecInfo info : mcl.getCodecInfos()) {
-            if (info.getName().equals(codec)) {
-                cap = info.getCapabilitiesForType(mimeType);
-                break;
-            }
-        }
 
+        CodecCapabilities cap = codec.getCodecInfo().getCapabilitiesForType(mimeType);
         if (cap.colorFormats.length == 0) {
             Log.w(TAG, "no supported color format");
+            codec.release();
             return null;
         }
 
@@ -84,25 +80,16 @@
         printIntArray("supported colors", cap.colorFormats);
 
         VideoCapabilities vidCap = cap.getVideoCapabilities();
-        if (mimeType.equals(VIDEO_AVC)) {
+        try {
             info.mFps = vidCap.getSupportedFrameRatesFor(w, h).getUpper().intValue();
-            info.mBitRate = vidCap.getBitrateRange().getUpper();
-
-            // we don't parse bitrate-range on L, so need to adjust bitrate to supported
-            // baseline or main profiles only.
-            int maxBitRate = 0;
-            for (CodecProfileLevel pl : cap.profileLevels) {
-                if (pl.profile == pl.AVCProfileBaseline || pl.profile == pl.AVCProfileMain) {
-                    VideoCapabilities vidCapPL =
-                        CodecCapabilities.createFromProfileLevel(mimeType, pl.profile, pl.level)
-                                .getVideoCapabilities();
-                    maxBitRate = Math.max(maxBitRate, vidCapPL.getBitrateRange().getUpper());
-                }
-            }
-            info.mBitRate = Math.min(info.mBitRate, maxBitRate);
-
-            Log.i(TAG, "AVC bit rate " + info.mBitRate + " fps " + info.mFps);
+        } catch (IllegalArgumentException e) {
+            Log.w(TAG, "unsupported size");
+            codec.release();
+            return null;
         }
+        info.mBitRate = vidCap.getBitrateRange().getUpper();
+        Log.i(TAG, "test bit rate " + info.mBitRate + " fps " + info.mFps);
+        codec.release();
         return info;
     }
 
diff --git a/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java b/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java
index bf02d9c..62f37c5 100644
--- a/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java
+++ b/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java
@@ -16,6 +16,8 @@
 
 package com.android.cts.videoperf;
 
+import android.cts.util.MediaUtils;
+import android.cts.util.DeviceReportLog;
 import android.graphics.ImageFormat;
 import android.graphics.Point;
 import android.media.cts.CodecImage;
@@ -23,19 +25,28 @@
 import android.media.Image;
 import android.media.Image.Plane;
 import android.media.MediaCodec;
-import android.media.MediaCodecList;
+import android.media.MediaCodec.BufferInfo;
+import android.media.MediaCodecInfo;
 import android.media.MediaCodecInfo.CodecCapabilities;
+import android.media.MediaCodecList;
 import android.media.MediaFormat;
 import android.util.Log;
+import android.util.Pair;
+import android.util.Range;
+import android.util.Size;
 
 import android.cts.util.CtsAndroidTestCase;
 import com.android.cts.util.ResultType;
 import com.android.cts.util.ResultUnit;
 import com.android.cts.util.Stat;
+import com.android.cts.util.TimeoutReq;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.lang.System;
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.Random;
 import java.util.Vector;
 
@@ -57,10 +68,15 @@
     private static final long VIDEO_CODEC_WAIT_TIME_US = 5000;
     private static final boolean VERBOSE = false;
     private static final String VIDEO_AVC = MediaFormat.MIMETYPE_VIDEO_AVC;
-    private static final int TOTAL_FRAMES = 300;
-    private static final int NUMBER_OF_REPEAT = 10;
+    private static final String VIDEO_VP8 = MediaFormat.MIMETYPE_VIDEO_VP8;
+    private static final String VIDEO_H263 = MediaFormat.MIMETYPE_VIDEO_H263;
+    private static final String VIDEO_MPEG4 = MediaFormat.MIMETYPE_VIDEO_MPEG4;
+    private int mCurrentTestRound = 0;
+    private double[][] mEncoderFrameTimeDiff = null;
+    private double[][] mDecoderFrameTimeDiff = null;
     // i frame interval for encoder
     private static final int KEY_I_FRAME_INTERVAL = 5;
+    private static final int MOVING_AVERAGE_NUM = 10;
 
     private static final int Y_CLAMP_MIN = 16;
     private static final int Y_CLAMP_MAX = 235;
@@ -75,20 +91,40 @@
     private int mVideoHeight;
     private int mFrameRate;
 
-    private Vector<ByteBuffer> mEncodedOutputBuffer;
+    private MediaFormat mEncInputFormat;
+    private MediaFormat mEncOutputFormat;
+    private MediaFormat mDecOutputFormat;
+
+    private LinkedList<Pair<ByteBuffer, BufferInfo>> mEncodedOutputBuffer;
     // check this many pixels per each decoded frame
     // checking too many points decreases decoder frame rates a lot.
     private static final int PIXEL_CHECK_PER_FRAME = 1000;
     // RMS error in pixel values above this will be treated as error.
     private static final double PIXEL_RMS_ERROR_MARGAIN = 20.0;
+    private double mRmsErrorMargain = PIXEL_RMS_ERROR_MARGAIN;
     private Random mRandom;
 
+    private class TestConfig {
+        public boolean mTestPixels = true;
+        public boolean mTestResult = false;
+        public boolean mReportFrameTime = false;
+        public int mTotalFrames = 300;
+        public int mMaxTimeMs = 120000;  // 2 minutes
+        public int mNumberOfRepeat = 10;
+    }
+
+    private TestConfig mTestConfig;
+
+    private DeviceReportLog mReportLog;
+
     @Override
     protected void setUp() throws Exception {
-        mEncodedOutputBuffer = new Vector<ByteBuffer>(TOTAL_FRAMES * 2);
+        mEncodedOutputBuffer = new LinkedList<Pair<ByteBuffer, BufferInfo>>();
         // Use time as a seed, hoping to prevent checking pixels in the same pattern
         long now = System.currentTimeMillis();
         mRandom = new Random(now);
+        mTestConfig = new TestConfig();
+        mReportLog = new DeviceReportLog();
         super.setUp();
     }
 
@@ -101,23 +137,77 @@
         mYDirectBuffer = null;
         mUVDirectBuffer = null;
         mRandom = null;
+        mTestConfig = null;
+        mReportLog.deliverReportToHost(getInstrumentation());
         super.tearDown();
     }
 
+    private String getEncoderName(String mime) {
+        return getCodecName(mime, true /* isEncoder */);
+    }
+
+    private String getDecoderName(String mime) {
+        return getCodecName(mime, false /* isEncoder */);
+    }
+
+    private String getCodecName(String mime, boolean isEncoder) {
+        MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
+        for (MediaCodecInfo info : mcl.getCodecInfos()) {
+            if (info.isEncoder() != isEncoder) {
+                continue;
+            }
+            CodecCapabilities caps = null;
+            try {
+                caps = info.getCapabilitiesForType(mime);
+            } catch (IllegalArgumentException e) {  // mime is not supported
+                continue;
+            }
+            return info.getName();
+        }
+        return null;
+    }
+
+    private String[] getEncoderName(String mime, boolean isGoog) {
+        return getCodecName(mime, isGoog, true /* isEncoder */);
+    }
+
+    private String[] getDecoderName(String mime, boolean isGoog) {
+        return getCodecName(mime, isGoog, false /* isEncoder */);
+    }
+
+    private String[] getCodecName(String mime, boolean isGoog, boolean isEncoder) {
+        MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
+        ArrayList<String> result = new ArrayList<String>();
+        for (MediaCodecInfo info : mcl.getCodecInfos()) {
+            if (info.isEncoder() != isEncoder
+                    || info.getName().toLowerCase().startsWith("omx.google.") != isGoog) {
+                continue;
+            }
+            CodecCapabilities caps = null;
+            try {
+                caps = info.getCapabilitiesForType(mime);
+            } catch (IllegalArgumentException e) {  // mime is not supported
+                continue;
+            }
+            result.add(info.getName());
+        }
+        return result.toArray(new String[result.size()]);
+    }
+
     public void testAvc0176x0144() throws Exception {
-        doTest(VIDEO_AVC, 176, 144, NUMBER_OF_REPEAT);
+        doTestDefault(VIDEO_AVC, 176, 144);
     }
 
     public void testAvc0352x0288() throws Exception {
-        doTest(VIDEO_AVC, 352, 288, NUMBER_OF_REPEAT);
+        doTestDefault(VIDEO_AVC, 352, 288);
     }
 
     public void testAvc0720x0480() throws Exception {
-        doTest(VIDEO_AVC, 720, 480, NUMBER_OF_REPEAT);
+        doTestDefault(VIDEO_AVC, 720, 480);
     }
 
     public void testAvc1280x0720() throws Exception {
-        doTest(VIDEO_AVC, 1280, 720, NUMBER_OF_REPEAT);
+        doTestDefault(VIDEO_AVC, 1280, 720);
     }
 
     /**
@@ -126,7 +216,133 @@
      * which is not specified in API documentation.
      */
     public void testAvc1920x1072() throws Exception {
-        doTest(VIDEO_AVC, 1920, 1072, NUMBER_OF_REPEAT);
+        doTestDefault(VIDEO_AVC, 1920, 1072);
+    }
+
+    // Avc tests
+    public void testAvc0320x0240Other() throws Exception {
+        doTestOther(VIDEO_AVC, 320, 240);
+    }
+
+    public void testAvc0320x0240Goog() throws Exception {
+        doTestGoog(VIDEO_AVC, 320, 240);
+    }
+
+    public void testAvc0720x0480Other() throws Exception {
+        doTestOther(VIDEO_AVC, 720, 480);
+    }
+
+    public void testAvc0720x0480Goog() throws Exception {
+        doTestGoog(VIDEO_AVC, 720, 480);
+    }
+
+    @TimeoutReq(minutes = 10)
+    public void testAvc1280x0720Other() throws Exception {
+        doTestOther(VIDEO_AVC, 1280, 720);
+    }
+
+    @TimeoutReq(minutes = 10)
+    public void testAvc1280x0720Goog() throws Exception {
+        doTestGoog(VIDEO_AVC, 1280, 720);
+    }
+
+    @TimeoutReq(minutes = 10)
+    public void testAvc1920x1080Other() throws Exception {
+        doTestOther(VIDEO_AVC, 1920, 1080);
+    }
+
+    @TimeoutReq(minutes = 10)
+    public void testAvc1920x1080Goog() throws Exception {
+        doTestGoog(VIDEO_AVC, 1920, 1080);
+    }
+
+    // Vp8 tests
+    public void testVp80320x0180Other() throws Exception {
+        doTestOther(VIDEO_VP8, 320, 180);
+    }
+
+    public void testVp80320x0180Goog() throws Exception {
+        doTestGoog(VIDEO_VP8, 320, 180);
+    }
+
+    public void testVp80640x0360Other() throws Exception {
+        doTestOther(VIDEO_VP8, 640, 360);
+    }
+
+    public void testVp80640x0360Goog() throws Exception {
+        doTestGoog(VIDEO_VP8, 640, 360);
+    }
+
+    @TimeoutReq(minutes = 10)
+    public void testVp81280x0720Other() throws Exception {
+        doTestOther(VIDEO_VP8, 1280, 720);
+    }
+
+    @TimeoutReq(minutes = 10)
+    public void testVp81280x0720Goog() throws Exception {
+        doTestGoog(VIDEO_VP8, 1280, 720);
+    }
+
+    @TimeoutReq(minutes = 10)
+    public void testVp81920x1080Other() throws Exception {
+        doTestOther(VIDEO_VP8, 1920, 1080);
+    }
+
+    @TimeoutReq(minutes = 10)
+    public void testVp81920x1080Goog() throws Exception {
+        doTestGoog(VIDEO_VP8, 1920, 1080);
+    }
+
+    // H263 tests
+    public void testH2630176x0144Other() throws Exception {
+        doTestOther(VIDEO_H263, 176, 144);
+    }
+
+    public void testH2630176x0144Goog() throws Exception {
+        doTestGoog(VIDEO_H263, 176, 144);
+    }
+
+    public void testH2630352x0288Other() throws Exception {
+        doTestOther(VIDEO_H263, 352, 288);
+    }
+
+    public void testH2630352x0288Goog() throws Exception {
+        doTestGoog(VIDEO_H263, 352, 288);
+    }
+
+    // Mpeg4 tests
+    public void testMpeg40176x0144Other() throws Exception {
+        doTestOther(VIDEO_MPEG4, 176, 144);
+    }
+
+    public void testMpeg40176x0144Goog() throws Exception {
+        doTestGoog(VIDEO_MPEG4, 176, 144);
+    }
+
+    public void testMpeg40352x0288Other() throws Exception {
+        doTestOther(VIDEO_MPEG4, 352, 288);
+    }
+
+    public void testMpeg40352x0288Goog() throws Exception {
+        doTestGoog(VIDEO_MPEG4, 352, 288);
+    }
+
+    public void testMpeg40640x0480Other() throws Exception {
+        doTestOther(VIDEO_MPEG4, 640, 480);
+    }
+
+    public void testMpeg40640x0480Goog() throws Exception {
+        doTestGoog(VIDEO_MPEG4, 640, 480);
+    }
+
+    @TimeoutReq(minutes = 10)
+    public void testMpeg41280x0720Other() throws Exception {
+        doTestOther(VIDEO_MPEG4, 1280, 720);
+    }
+
+    @TimeoutReq(minutes = 10)
+    public void testMpeg41280x0720Goog() throws Exception {
+        doTestGoog(VIDEO_MPEG4, 1280, 720);
     }
 
     private boolean isSrcSemiPlanar() {
@@ -156,20 +372,77 @@
         }
     }
 
+    private void doTestGoog(String mimeType, int w, int h) throws Exception {
+        mTestConfig.mTestPixels = false;
+        mTestConfig.mTestResult = true;
+        mTestConfig.mTotalFrames = 3000;
+        mTestConfig.mNumberOfRepeat = 2;
+        doTest(true /* isGoog */, mimeType, w, h);
+    }
+
+    private void doTestOther(String mimeType, int w, int h) throws Exception {
+        mTestConfig.mTestPixels = false;
+        mTestConfig.mTestResult = true;
+        mTestConfig.mTotalFrames = 3000;
+        mTestConfig.mNumberOfRepeat = 2;
+        doTest(false /* isGoog */, mimeType, w, h);
+    }
+
+    private void doTestDefault(String mimeType, int w, int h) throws Exception {
+        String encoderName = getEncoderName(mimeType);
+        if (encoderName == null) {
+            Log.i(TAG, "Encoder for " + mimeType + " not found");
+            return;
+        }
+
+        String decoderName = getDecoderName(mimeType);
+        if (decoderName == null) {
+            Log.i(TAG, "Encoder for " + mimeType + " not found");
+            return;
+        }
+
+        doTestByName(encoderName, decoderName, mimeType, w, h);
+    }
+
     /**
      * Run encoding / decoding test for given mimeType of codec
+     * @param isGoog test google or non-google codec.
      * @param mimeType like video/avc
      * @param w video width
      * @param h video height
-     * @param numberRepeat how many times to repeat the encoding / decoding process
      */
-    private void doTest(String mimeType, int w, int h, int numberRepeat) throws Exception {
-        CodecInfo infoEnc = CodecInfo.getSupportedFormatInfo(mimeType, w, h, true /* encoder */);
+    private void doTest(boolean isGoog, String mimeType, int w, int h)
+            throws Exception {
+        String[] encoderNames = getEncoderName(mimeType, isGoog);
+        if (encoderNames.length == 0) {
+            Log.i(TAG, isGoog ? "Google " : "Non-google "
+                    + "encoder for " + mimeType + " not found");
+            return;
+        }
+
+        String[] decoderNames = getDecoderName(mimeType, isGoog);
+        if (decoderNames.length == 0) {
+            Log.i(TAG, isGoog ? "Google " : "Non-google "
+                    + "decoder for " + mimeType + " not found");
+            return;
+        }
+
+        for (String encoderName: encoderNames) {
+            for (String decoderName: decoderNames) {
+                doTestByName(encoderName, decoderName, mimeType, w, h);
+            }
+        }
+    }
+
+    private void doTestByName(
+            String encoderName, String decoderName, String mimeType, int w, int h)
+            throws Exception {
+        CodecInfo infoEnc = CodecInfo.getSupportedFormatInfo(encoderName, mimeType, w, h);
         if (infoEnc == null) {
             Log.i(TAG, "Encoder " + mimeType + " with " + w + "," + h + " not supported");
             return;
         }
-        CodecInfo infoDec = CodecInfo.getSupportedFormatInfo(mimeType, w, h, false /* encoder */);
+        CodecInfo infoDec = CodecInfo.getSupportedFormatInfo(decoderName, mimeType, w, h);
         assertNotNull(infoDec);
         mVideoWidth = w;
         mVideoHeight = h;
@@ -181,12 +454,17 @@
                    ", dec format " + mDstColorFormat);
 
         initYUVPlane(w + YUV_PLANE_ADDITIONAL_LENGTH, h + YUV_PLANE_ADDITIONAL_LENGTH);
-        double[] encoderFpsResults = new double[numberRepeat];
-        double[] decoderFpsResults = new double[numberRepeat];
-        double[] totalFpsResults = new double[numberRepeat];
-        double[] decoderRmsErrorResults = new double[numberRepeat];
+        mEncoderFrameTimeDiff =
+                new double[mTestConfig.mNumberOfRepeat][mTestConfig.mTotalFrames - 1];
+        mDecoderFrameTimeDiff =
+                new double[mTestConfig.mNumberOfRepeat][mTestConfig.mTotalFrames - 1];
+        double[] encoderFpsResults = new double[mTestConfig.mNumberOfRepeat];
+        double[] decoderFpsResults = new double[mTestConfig.mNumberOfRepeat];
+        double[] totalFpsResults = new double[mTestConfig.mNumberOfRepeat];
+        double[] decoderRmsErrorResults = new double[mTestConfig.mNumberOfRepeat];
         boolean success = true;
-        for (int i = 0; i < numberRepeat && success; i++) {
+        for (int i = 0; i < mTestConfig.mNumberOfRepeat && success; i++) {
+            mCurrentTestRound = i;
             MediaFormat format = new MediaFormat();
             format.setString(MediaFormat.KEY_MIME, mimeType);
             format.setInteger(MediaFormat.KEY_BIT_RATE, infoEnc.mBitRate);
@@ -196,22 +474,24 @@
             format.setInteger(MediaFormat.KEY_FRAME_RATE, infoEnc.mFps);
             mFrameRate = infoEnc.mFps;
             format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, KEY_I_FRAME_INTERVAL);
-            double encodingTime = runEncoder(VIDEO_AVC, format, TOTAL_FRAMES);
+
+            double encodingTime = runEncoder(encoderName, format, mTestConfig.mTotalFrames);
             // re-initialize format for decoder
             format = new MediaFormat();
             format.setString(MediaFormat.KEY_MIME, mimeType);
             format.setInteger(MediaFormat.KEY_WIDTH, w);
             format.setInteger(MediaFormat.KEY_HEIGHT, h);
             format.setInteger(MediaFormat.KEY_COLOR_FORMAT, mDstColorFormat);
-            double[] decoderResult = runDecoder(VIDEO_AVC, format);
+            double[] decoderResult = runDecoder(decoderName, format);
             if (decoderResult == null) {
                 success = false;
             } else {
                 double decodingTime = decoderResult[0];
                 decoderRmsErrorResults[i] = decoderResult[1];
-                encoderFpsResults[i] = (double)TOTAL_FRAMES / encodingTime * 1000.0;
-                decoderFpsResults[i] = (double)TOTAL_FRAMES / decodingTime * 1000.0;
-                totalFpsResults[i] = (double)TOTAL_FRAMES / (encodingTime + decodingTime) * 1000.0;
+                encoderFpsResults[i] = (double)mTestConfig.mTotalFrames / encodingTime * 1000.0;
+                decoderFpsResults[i] = (double)mTestConfig.mTotalFrames / decodingTime * 1000.0;
+                totalFpsResults[i] =
+                        (double)mTestConfig.mTotalFrames / (encodingTime + decodingTime) * 1000.0;
             }
 
             // clear things for re-start
@@ -219,34 +499,106 @@
             // it will be good to clean everything to make every run the same.
             System.gc();
         }
-        getReportLog().printArray("encoder", encoderFpsResults, ResultType.HIGHER_BETTER,
+        mReportLog.printArray("encoder", encoderFpsResults, ResultType.HIGHER_BETTER,
                 ResultUnit.FPS);
-        getReportLog().printArray("rms error", decoderRmsErrorResults, ResultType.LOWER_BETTER,
+        mReportLog.printArray("rms error", decoderRmsErrorResults, ResultType.LOWER_BETTER,
                 ResultUnit.NONE);
-        getReportLog().printArray("decoder", decoderFpsResults, ResultType.HIGHER_BETTER,
+        mReportLog.printArray("decoder", decoderFpsResults, ResultType.HIGHER_BETTER,
                 ResultUnit.FPS);
-        getReportLog().printArray("encoder decoder", totalFpsResults, ResultType.HIGHER_BETTER,
+        mReportLog.printArray("encoder decoder", totalFpsResults, ResultType.HIGHER_BETTER,
                 ResultUnit.FPS);
-        getReportLog().printSummary("encoder decoder", Stat.getAverage(totalFpsResults),
+        mReportLog.printValue(mimeType + " encoder average fps for " + w + "x" + h,
+                Stat.getAverage(encoderFpsResults), ResultType.HIGHER_BETTER, ResultUnit.FPS);
+        mReportLog.printValue(mimeType + " decoder average fps for " + w + "x" + h,
+                Stat.getAverage(decoderFpsResults), ResultType.HIGHER_BETTER, ResultUnit.FPS);
+        mReportLog.printSummary("encoder decoder", Stat.getAverage(totalFpsResults),
                 ResultType.HIGHER_BETTER, ResultUnit.FPS);
-        // make sure that rms error is not too big.
-        for (int i = 0; i < numberRepeat; i++) {
-            assertTrue(decoderRmsErrorResults[i] < PIXEL_RMS_ERROR_MARGAIN);
+
+        boolean encTestPassed = false;
+        boolean decTestPassed = false;
+        double[] measuredFps = new double[mTestConfig.mNumberOfRepeat];
+        String[] resultRawData = new String[mTestConfig.mNumberOfRepeat];
+        for (int i = 0; i < mTestConfig.mNumberOfRepeat; i++) {
+            // make sure that rms error is not too big.
+            if (decoderRmsErrorResults[i] >= mRmsErrorMargain) {
+                fail("rms error is bigger than the limit "
+                        + decoderRmsErrorResults[i] + " vs " + mRmsErrorMargain);
+            }
+
+            if (mTestConfig.mReportFrameTime) {
+                mReportLog.printValue(
+                        "encodertest#" + i + ": " + Arrays.toString(mEncoderFrameTimeDiff[i]),
+                        0, ResultType.NEUTRAL, ResultUnit.NONE);
+                mReportLog.printValue(
+                        "decodertest#" + i + ": " + Arrays.toString(mDecoderFrameTimeDiff[i]),
+                        0, ResultType.NEUTRAL, ResultUnit.NONE);
+            }
+
+            if (mTestConfig.mTestResult) {
+                double[] avgs = MediaUtils.calculateMovingAverage(
+                        mEncoderFrameTimeDiff[i], MOVING_AVERAGE_NUM);
+                double encMin = Stat.getMin(avgs);
+                double encMax = Stat.getMax(avgs);
+                double encAvg = MediaUtils.getAverage(mEncoderFrameTimeDiff[i]);
+                double encStdev = MediaUtils.getStdev(avgs);
+                String prefix = "codec=" + encoderName + " round=" + i +
+                        " EncInputFormat=" + mEncInputFormat +
+                        " EncOutputFormat=" + mEncOutputFormat;
+                String result =
+                        MediaUtils.logResults(mReportLog, prefix, encMin, encMax, encAvg, encStdev);
+                double measuredEncFps = 1000000000 / encMin;
+                resultRawData[i] = result;
+                measuredFps[i] = measuredEncFps;
+                if (!encTestPassed) {
+                    encTestPassed = MediaUtils.verifyResults(
+                            encoderName, mimeType, w, h, measuredEncFps);
+                }
+
+                avgs = MediaUtils.calculateMovingAverage(
+                        mDecoderFrameTimeDiff[i], MOVING_AVERAGE_NUM);
+                double decMin = Stat.getMin(avgs);
+                double decMax = Stat.getMax(avgs);
+                double decAvg = MediaUtils.getAverage(mDecoderFrameTimeDiff[i]);
+                double decStdev = MediaUtils.getStdev(avgs);
+                prefix = "codec=" + decoderName + " size=" + w + "x" + h + " round=" + i +
+                        " DecOutputFormat=" + mDecOutputFormat;
+                MediaUtils.logResults(mReportLog, prefix, decMin, decMax, decAvg, decStdev);
+                double measuredDecFps = 1000000000 / decMin;
+                if (!decTestPassed) {
+                    decTestPassed = MediaUtils.verifyResults(
+                            decoderName, mimeType, w, h, measuredDecFps);
+                }
+            }
         }
+
+        if (mTestConfig.mTestResult) {
+            if (!encTestPassed) {
+                Range<Double> reportedRange =
+                    MediaUtils.getAchievableFrameRatesFor(encoderName, mimeType, w, h);
+                String failMessage =
+                    MediaUtils.getErrorMessage(reportedRange, measuredFps, resultRawData);
+                fail(failMessage);
+            }
+            // Decoder result will be verified in VideoDecoderPerfTest
+            // if (!decTestPassed) {
+            //     fail("Measured fps for " + decoderName +
+            //             " doesn't match with reported achievable frame rates.");
+            // }
+        }
+        measuredFps = null;
+        resultRawData = null;
     }
 
     /**
      * run encoder benchmarking
-     * @param mimeType encoder type like video/avc
+     * @param encoderName encoder name
      * @param format format of media to encode
      * @param totalFrames total number of frames to encode
      * @return time taken in ms to encode the frames. This does not include initialization time.
      */
-    private double runEncoder(String mimeType, MediaFormat format, int totalFrames) {
+    private double runEncoder(String encoderName, MediaFormat format, int totalFrames) {
         MediaCodec codec = null;
         try {
-            MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
-            String encoderName = mcl.findEncoderForFormat(format);
             codec = MediaCodec.createByCodecName(encoderName);
             codec.configure(
                     format,
@@ -254,19 +606,21 @@
                     null /* crypto */,
                     MediaCodec.CONFIGURE_FLAG_ENCODE);
         } catch (IllegalStateException e) {
-            Log.e(TAG, "codec '" + mimeType + "' failed configuration.");
+            Log.e(TAG, "codec '" + encoderName + "' failed configuration.");
             codec.release();
-            assertTrue("codec '" + mimeType + "' failed configuration.", false);
+            assertTrue("codec '" + encoderName + "' failed configuration.", false);
         } catch (IOException | NullPointerException e) {
             Log.i(TAG, "could not find codec for " + format);
             return Double.NaN;
         }
         codec.start();
+        mEncInputFormat = codec.getInputFormat();
         ByteBuffer[] codecOutputBuffers = codec.getOutputBuffers();
 
         int numBytesSubmitted = 0;
         int numBytesDequeued = 0;
         int inFramesCount = 0;
+        long lastOutputTimeNs = 0;
         long start = System.currentTimeMillis();
         while (true) {
             int index;
@@ -275,6 +629,10 @@
                 index = codec.dequeueInputBuffer(VIDEO_CODEC_WAIT_TIME_US /* timeoutUs */);
                 if (index != MediaCodec.INFO_TRY_AGAIN_LATER) {
                     int size;
+                    boolean eos = (inFramesCount == (totalFrames - 1));
+                    if (!eos && ((System.currentTimeMillis() - start) > mTestConfig.mMaxTimeMs)) {
+                        eos = true;
+                    }
                     // when encoder only supports flexYUV, use Image only; otherwise,
                     // use ByteBuffer & Image each on half of the frames to test both
                     if (isSrcFlexYUV() || inFramesCount % 2 == 0) {
@@ -283,14 +641,12 @@
                         assertTrue(image != null);
                         size = queueInputImageEncoder(
                                 codec, image, index, inFramesCount,
-                                (inFramesCount == (totalFrames - 1)) ?
-                                        MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
+                                eos ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
                     } else {
                         ByteBuffer buffer = codec.getInputBuffer(index);
                         size = queueInputBufferEncoder(
                                 codec, buffer, index, inFramesCount,
-                                (inFramesCount == (totalFrames - 1)) ?
-                                        MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
+                                eos ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
                     }
                     inFramesCount++;
                     numBytesSubmitted += size;
@@ -305,9 +661,19 @@
             index = codec.dequeueOutputBuffer(info, VIDEO_CODEC_WAIT_TIME_US /* timeoutUs */);
             if (index == MediaCodec.INFO_TRY_AGAIN_LATER) {
             } else if (index == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
+                mEncOutputFormat = codec.getOutputFormat();
             } else if (index == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
                 codecOutputBuffers = codec.getOutputBuffers();
             } else if (index >= 0) {
+                if (lastOutputTimeNs > 0) {
+                    int pos = mEncodedOutputBuffer.size() - 1;
+                    if (pos < mEncoderFrameTimeDiff[mCurrentTestRound].length) {
+                        long diff = System.nanoTime() - lastOutputTimeNs;
+                        mEncoderFrameTimeDiff[mCurrentTestRound][pos] = diff;
+                    }
+                }
+                lastOutputTimeNs = System.nanoTime();
+
                 dequeueOutputBufferEncoder(codec, codecOutputBuffers, index, info);
                 numBytesDequeued += info.size;
                 if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
@@ -322,6 +688,10 @@
             }
         }
         long finish = System.currentTimeMillis();
+        int validDataNum = Math.min(mEncodedOutputBuffer.size() - 1,
+                mEncoderFrameTimeDiff[mCurrentTestRound].length);
+        mEncoderFrameTimeDiff[mCurrentTestRound] =
+                Arrays.copyOf(mEncoderFrameTimeDiff[mCurrentTestRound], validDataNum);
         if (VERBOSE) {
             Log.d(TAG, "queued a total of " + numBytesSubmitted + "bytes, "
                     + "dequeued " + numBytesDequeued + " bytes.");
@@ -532,28 +902,27 @@
             MediaCodec codec, ByteBuffer[] outputBuffers,
             int index, MediaCodec.BufferInfo info) {
         ByteBuffer output = outputBuffers[index];
-        output.clear();
         int l = info.size;
         ByteBuffer copied = ByteBuffer.allocate(l);
         output.get(copied.array(), 0, l);
-        mEncodedOutputBuffer.add(copied);
+        BufferInfo savedInfo = new BufferInfo();
+        savedInfo.set(0, l, info.presentationTimeUs, info.flags);
+        mEncodedOutputBuffer.addLast(Pair.create(copied, savedInfo));
         codec.releaseOutputBuffer(index, false /* render */);
     }
 
     /**
      * run encoder benchmarking with encoded stream stored from encoding phase
-     * @param mimeType encoder type like video/avc
+     * @param decoderName decoder name
      * @param format format of media to decode
      * @return returns length-2 array with 0: time for decoding, 1 : rms error of pixels
      */
-    private double[] runDecoder(String mimeType, MediaFormat format) {
-        MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
-        String decoderName = mcl.findDecoderForFormat(format);
+    private double[] runDecoder(String decoderName, MediaFormat format) {
         MediaCodec codec = null;
         try {
             codec = MediaCodec.createByCodecName(decoderName);
         } catch (IOException | NullPointerException e) {
-            Log.i(TAG, "could not find codec for " + format);
+            Log.i(TAG, "could not find decoder for " + format);
             return null;
         }
         codec.configure(format, null /* surface */, null /* crypto */, 0 /* flags */);
@@ -569,6 +938,7 @@
         int outFrameCount = 0;
         YUVValue expected = new YUVValue();
         YUVValue decoded = new YUVValue();
+        long lastOutputTimeNs = 0;
         long start = System.currentTimeMillis();
         while (!sawOutputEOS) {
             if (inputLeft > 0) {
@@ -577,15 +947,22 @@
                 if (inputBufIndex >= 0) {
                     ByteBuffer dstBuf = codecInputBuffers[inputBufIndex];
                     dstBuf.clear();
-                    ByteBuffer src = mEncodedOutputBuffer.get(inputBufferCount);
+                    ByteBuffer src = mEncodedOutputBuffer.get(inputBufferCount).first;
+                    BufferInfo srcInfo = mEncodedOutputBuffer.get(inputBufferCount).second;
                     int writeSize = src.capacity();
                     dstBuf.put(src.array(), 0, writeSize);
+
+                    int flags = srcInfo.flags;
+                    if ((System.currentTimeMillis() - start) > mTestConfig.mMaxTimeMs) {
+                        flags |= MediaCodec.BUFFER_FLAG_END_OF_STREAM;
+                    }
+
                     codec.queueInputBuffer(
                             inputBufIndex,
                             0 /* offset */,
                             writeSize,
-                            0,
-                            (inputLeft == 1) ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
+                            srcInfo.presentationTimeUs,
+                            flags);
                     inputLeft --;
                     inputBufferCount ++;
                 }
@@ -597,29 +974,57 @@
 
                 // only do YUV compare on EOS frame if the buffer size is none-zero
                 if (info.size > 0) {
-                    Point origin = getOrigin(outFrameCount);
-                    int i;
-
-                    // if decoder supports planar or semiplanar, check output with
-                    // ByteBuffer & Image each on half of the points
-                    int pixelCheckPerFrame = PIXEL_CHECK_PER_FRAME;
-                    if (!isDstFlexYUV()) {
-                        pixelCheckPerFrame /= 2;
-                        ByteBuffer buf = codec.getOutputBuffer(outputBufIndex);
-                        if (VERBOSE && (outFrameCount == 0)) {
-                            printByteBuffer("Y ", buf, 0, 20);
-                            printByteBuffer("UV ", buf, mVideoWidth * mVideoHeight, 20);
-                            printByteBuffer("UV ", buf,
-                                    mVideoWidth * mVideoHeight + mVideoWidth * 60, 20);
+                    if (lastOutputTimeNs > 0) {
+                        int pos = outFrameCount - 1;
+                        if (pos < mDecoderFrameTimeDiff[mCurrentTestRound].length) {
+                            long diff = System.nanoTime() - lastOutputTimeNs;
+                            mDecoderFrameTimeDiff[mCurrentTestRound][pos] = diff;
                         }
+                    }
+                    lastOutputTimeNs = System.nanoTime();
+
+                    if (mTestConfig.mTestPixels) {
+                        Point origin = getOrigin(outFrameCount);
+                        int i;
+
+                        // if decoder supports planar or semiplanar, check output with
+                        // ByteBuffer & Image each on half of the points
+                        int pixelCheckPerFrame = PIXEL_CHECK_PER_FRAME;
+                        if (!isDstFlexYUV()) {
+                            pixelCheckPerFrame /= 2;
+                            ByteBuffer buf = codec.getOutputBuffer(outputBufIndex);
+                            if (VERBOSE && (outFrameCount == 0)) {
+                                printByteBuffer("Y ", buf, 0, 20);
+                                printByteBuffer("UV ", buf, mVideoWidth * mVideoHeight, 20);
+                                printByteBuffer("UV ", buf,
+                                        mVideoWidth * mVideoHeight + mVideoWidth * 60, 20);
+                            }
+                            for (i = 0; i < pixelCheckPerFrame; i++) {
+                                int w = mRandom.nextInt(mVideoWidth);
+                                int h = mRandom.nextInt(mVideoHeight);
+                                getPixelValuesFromYUVBuffers(origin.x, origin.y, w, h, expected);
+                                getPixelValuesFromOutputBuffer(buf, w, h, decoded);
+                                if (VERBOSE) {
+                                    Log.i(TAG, outFrameCount + "-" + i + "- th round: ByteBuffer:"
+                                            + " expected "
+                                            + expected.mY + "," + expected.mU + "," + expected.mV
+                                            + " decoded "
+                                            + decoded.mY + "," + decoded.mU + "," + decoded.mV);
+                                }
+                                totalErrorSquared += expected.calcErrorSquared(decoded);
+                            }
+                        }
+
+                        Image image = codec.getOutputImage(outputBufIndex);
+                        assertTrue(image != null);
                         for (i = 0; i < pixelCheckPerFrame; i++) {
                             int w = mRandom.nextInt(mVideoWidth);
                             int h = mRandom.nextInt(mVideoHeight);
                             getPixelValuesFromYUVBuffers(origin.x, origin.y, w, h, expected);
-                            getPixelValuesFromOutputBuffer(buf, w, h, decoded);
+                            getPixelValuesFromImage(image, w, h, decoded);
                             if (VERBOSE) {
-                                Log.i(TAG, outFrameCount + "-" + i + "- th round: ByteBuffer:"
-                                        + " expected "
+                                Log.i(TAG, outFrameCount + "-" + i + "- th round: FlexYUV:"
+                                        + " expcted "
                                         + expected.mY + "," + expected.mU + "," + expected.mV
                                         + " decoded "
                                         + decoded.mY + "," + decoded.mU + "," + decoded.mV);
@@ -627,23 +1032,6 @@
                             totalErrorSquared += expected.calcErrorSquared(decoded);
                         }
                     }
-
-                    Image image = codec.getOutputImage(outputBufIndex);
-                    assertTrue(image != null);
-                    for (i = 0; i < pixelCheckPerFrame; i++) {
-                        int w = mRandom.nextInt(mVideoWidth);
-                        int h = mRandom.nextInt(mVideoHeight);
-                        getPixelValuesFromYUVBuffers(origin.x, origin.y, w, h, expected);
-                        getPixelValuesFromImage(image, w, h, decoded);
-                        if (VERBOSE) {
-                            Log.i(TAG, outFrameCount + "-" + i + "- th round: FlexYUV:"
-                                    + " expcted "
-                                    + expected.mY + "," + expected.mU + "," + expected.mV
-                                    + " decoded "
-                                    + decoded.mY + "," + decoded.mU + "," + decoded.mV);
-                        }
-                        totalErrorSquared += expected.calcErrorSquared(decoded);
-                    }
                     outFrameCount++;
                 }
                 codec.releaseOutputBuffer(outputBufIndex, false /* render */);
@@ -652,9 +1040,9 @@
                     sawOutputEOS = true;
                 }
             } else if (res == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
-                MediaFormat oformat = codec.getOutputFormat();
-                Log.d(TAG, "output format has changed to " + oformat);
-                int colorFormat = oformat.getInteger(MediaFormat.KEY_COLOR_FORMAT);
+                mDecOutputFormat = codec.getOutputFormat();
+                Log.d(TAG, "output format has changed to " + mDecOutputFormat);
+                int colorFormat = mDecOutputFormat.getInteger(MediaFormat.KEY_COLOR_FORMAT);
                 if (colorFormat == CodecCapabilities.COLOR_FormatYUV420SemiPlanar
                         || colorFormat == CodecCapabilities.COLOR_FormatYUV420Planar) {
                     mDstColorFormat = colorFormat;
@@ -666,10 +1054,14 @@
             }
         }
         long finish = System.currentTimeMillis();
+        int validDataNum = Math.min(outFrameCount - 1,
+                mDecoderFrameTimeDiff[mCurrentTestRound].length);
+        mDecoderFrameTimeDiff[mCurrentTestRound] =
+                Arrays.copyOf(mDecoderFrameTimeDiff[mCurrentTestRound], validDataNum);
         codec.stop();
         codec.release();
         codec = null;
-        assertTrue(outFrameCount >= TOTAL_FRAMES);
+
         // divide by 3 as sum is done for Y, U, V.
         double errorRms = Math.sqrt(totalErrorSquared / PIXEL_CHECK_PER_FRAME / outFrameCount / 3);
         double[] result = { (double) finish - start, errorRms };
diff --git a/suite/cts/hostTests/jank/app/src/com/android/cts/jank/ui/CtsDeviceJankUi.java b/suite/cts/hostTests/jank/app/src/com/android/cts/jank/ui/CtsDeviceJankUi.java
deleted file mode 100644
index ea1f685..0000000
--- a/suite/cts/hostTests/jank/app/src/com/android/cts/jank/ui/CtsDeviceJankUi.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2013 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 com.android.cts.jank.ui;
-
-import android.util.Log;
-import android.widget.ListView;
-
-import com.android.cts.jank.CtsJankTestBase;
-import com.android.uiautomator.core.UiScrollable;
-import com.android.uiautomator.core.UiSelector;
-import com.android.uiautomator.platform.SurfaceFlingerHelper;
-
-public class CtsDeviceJankUi extends CtsJankTestBase {
-    private final static String TAG = CtsDeviceJankUi.class.getName();
-    private final static String PACKAGE = "com.android.cts.ui";
-    private final static String COMPONENT =
-            PACKAGE + "/" + PACKAGE + ".ScrollingActivity";
-    private final static int NUM_ELEMENTS = 1000;
-    private static String APP_WINDOW_NAME = COMPONENT;
-
-    // TODO(stuartscott): expand deviceTests/ui app to have a more complex UI
-    /**
-     * Runs the ScrollingActivity and measures jank during a scroll.
-     */
-    public void testScrolling() throws Exception {
-        // Start activity command
-        final StringBuilder sb = new StringBuilder();
-        sb.append(String.format(START_CMD, COMPONENT));
-        sb.append(String.format(INTENT_INTEGER_EXTRA, "num_elements", NUM_ELEMENTS));
-        final String startCommand = sb.toString();
-        final String stopCommand = String.format(STOP_CMD, PACKAGE);
-
-        Log.i(TAG, "Start command: " + startCommand);
-        Log.i(TAG, "Stop command: " + stopCommand);
-
-        setIteration(NUM_ITERATIONS);
-        for (int i = 0; i < NUM_ITERATIONS; i++) {
-            // Stop any existing instances
-            runShellCommand(stopCommand);
-            // Start activity
-            runShellCommand(startCommand);
-
-            // Wait for the activity to start
-            sleep(SLEEP_TIME / 2);
-
-            UiScrollable list = new UiScrollable(
-                    new UiSelector().className(ListView.class.getName()));
-
-            // Start systrace
-            startTrace(mTestCaseName, i);
-
-            // Clear SurfaceFlinger buffer
-            Log.i(TAG, "Clearing SurfaceFlinger buffer");
-            SurfaceFlingerHelper.clearBuffer(APP_WINDOW_NAME);
-
-            list.flingToEnd(2);
-
-            // Dump SurfaceFlinger buffer
-            Log.i(TAG, "Dumping SurfaceFlinger buffer");
-            boolean result = SurfaceFlingerHelper.dumpFrameLatency(APP_WINDOW_NAME, true);
-            assertTrue("SurfaceFlingerHelper could not get timestamps", result);
-
-            // Stop systrace
-            endTrace();
-
-            // Record results
-            recordResults(mTestCaseName, i);
-        }
-        // Save aggregated results
-        saveResults(mTestCaseName);
-        // Stop any remaining instances
-        runShellCommand(stopCommand);
-    }
-}
diff --git a/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java b/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java
deleted file mode 100644
index a07171e..0000000
--- a/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2013 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 com.android.cts.jank.ui;
-
-import com.android.cts.jank.CtsHostJankTest;
-import com.android.cts.util.AbiUtils;
-import java.io.File;
-
-public class CtsHostJankUi extends CtsHostJankTest {
-
-    private static final String APK_PACKAGE = "com.android.cts";
-    private static final String APK = "CtsDeviceUi.apk";
-    private static final String PACKAGE = "com.android.cts.jank.ui";
-    private static final String HOST_CLASS = CtsHostJankUi.class.getName();
-    private static final String DEVICE_CLASS = PACKAGE + ".CtsDeviceJankUi";
-    private static final String JAR_NAME = "CtsDeviceJank.jar";
-
-    public CtsHostJankUi() {
-        super(JAR_NAME, DEVICE_CLASS, HOST_CLASS);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        // Install the app.
-        mDevice.uninstallPackage(APK_PACKAGE);
-        File app = mBuild.getTestApp(APK);
-        String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
-        mDevice.installPackage(app, false, options);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        // Uninstall the app.
-        mDevice.uninstallPackage(APK_PACKAGE);
-        super.tearDown();
-    }
-
-    public void testScrolling() throws Exception {
-        runUiAutomatorTest("testScrolling");
-    }
-}
diff --git a/suite/cts/hostTests/uihost/appA/Android.mk b/suite/cts/hostTests/uihost/appA/Android.mk
index 3e76fdb..17f076f 100644
--- a/suite/cts/hostTests/uihost/appA/Android.mk
+++ b/suite/cts/hostTests/uihost/appA/Android.mk
@@ -26,8 +26,6 @@
 
 LOCAL_PACKAGE_NAME := CtsDeviceTaskswitchingAppA
 
-LOCAL_SDK_VERSION := 16
+LOCAL_SDK_VERSION := current
 
-include $(BUILD_CTS_PACKAGE)
-
-
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/suite/cts/hostTests/uihost/appB/Android.mk b/suite/cts/hostTests/uihost/appB/Android.mk
index 13af40f..ebb36d2 100644
--- a/suite/cts/hostTests/uihost/appB/Android.mk
+++ b/suite/cts/hostTests/uihost/appB/Android.mk
@@ -26,8 +26,6 @@
 
 LOCAL_PACKAGE_NAME := CtsDeviceTaskswitchingAppB
 
-LOCAL_SDK_VERSION := 16
+LOCAL_SDK_VERSION := current
 
-include $(BUILD_CTS_PACKAGE)
-
-
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/suite/cts/hostTests/uihost/control/Android.mk b/suite/cts/hostTests/uihost/control/Android.mk
index 3770918..4de9ae8 100644
--- a/suite/cts/hostTests/uihost/control/Android.mk
+++ b/suite/cts/hostTests/uihost/control/Android.mk
@@ -26,6 +26,6 @@
 
 LOCAL_PACKAGE_NAME := CtsDeviceTaskswitchingControl
 
-LOCAL_SDK_VERSION := 16
+LOCAL_SDK_VERSION := current
 
-include $(BUILD_CTS_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
index 894b824..2d33436 100644
--- a/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
+++ b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
@@ -115,7 +115,9 @@
         @Override
         public void testEnded(TestIdentifier test, Map<String, String> testMetrics) {
             // necessary as testMetrics passed from CollectingTestListerner is empty
-            mCtsReport = testMetrics.get("CTS_TEST_RESULT");
+            if (testMetrics.containsKey("CTS_TEST_RESULT")) {
+                mCtsReport = testMetrics.get("CTS_TEST_RESULT");
+            }
             super.testEnded(test, testMetrics);
         }
     }
diff --git a/tests/JobScheduler/src/android/jobscheduler/MockJobService.java b/tests/JobScheduler/src/android/jobscheduler/MockJobService.java
index 38a753d..4f549f8 100644
--- a/tests/JobScheduler/src/android/jobscheduler/MockJobService.java
+++ b/tests/JobScheduler/src/android/jobscheduler/MockJobService.java
@@ -46,7 +46,7 @@
     public boolean onStartJob(JobParameters params) {
         Log.i(TAG, "Test job executing: " + params.getJobId());
 
-        TestEnvironment.getTestEnvironment().notifyExecution(params.getJobId());
+        TestEnvironment.getTestEnvironment().notifyExecution(params);
         return false;  // No work to do.
     }
 
@@ -63,10 +63,10 @@
     public static final class TestEnvironment {
 
         private static TestEnvironment kTestEnvironment;
-        public static final int INVALID_JOB_ID = -1;
+        //public static final int INVALID_JOB_ID = -1;
 
         private CountDownLatch mLatch;
-        private int mExecutedJobId;
+        private JobParameters mExecutedJobParameters;
 
         public static TestEnvironment getTestEnvironment() {
             if (kTestEnvironment == null) {
@@ -75,6 +75,10 @@
             return kTestEnvironment;
         }
 
+        public JobParameters getLastJobParameters() {
+            return mExecutedJobParameters;
+        }
+
         /**
          * Block the test thread, waiting on the JobScheduler to execute some previously scheduled
          * job on this service.
@@ -93,9 +97,9 @@
             return !mLatch.await(DEFAULT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
         }
 
-        private void notifyExecution(int jobId) {
-            Log.d(TAG, "Job executed:" + jobId);
-            mExecutedJobId = jobId;
+        private void notifyExecution(JobParameters params) {
+            Log.d(TAG, "Job executed:" + params.getJobId());
+            mExecutedJobParameters = params;
             mLatch.countDown();
         }
 
@@ -111,7 +115,7 @@
         /** Called in each testCase#setup */
         public void setUp() {
             mLatch = null;
-            mExecutedJobId = INVALID_JOB_ID;
+            mExecutedJobParameters = null;
         }
 
     }
diff --git a/tests/JobScheduler/src/android/jobscheduler/cts/TimingConstraintsTest.java b/tests/JobScheduler/src/android/jobscheduler/cts/TimingConstraintsTest.java
index ed9cadd..40b67c8 100644
--- a/tests/JobScheduler/src/android/jobscheduler/cts/TimingConstraintsTest.java
+++ b/tests/JobScheduler/src/android/jobscheduler/cts/TimingConstraintsTest.java
@@ -17,6 +17,7 @@
 
 import android.annotation.TargetApi;
 import android.app.job.JobInfo;
+import android.app.job.JobParameters;
 
 /**
  * Schedules jobs with various timing constraints and ensures that they are executed when
@@ -26,6 +27,8 @@
 public class TimingConstraintsTest extends ConstraintTest {
     private static final int TIMING_JOB_ID = TimingConstraintsTest.class.hashCode() + 0;
     private static final int CANCEL_JOB_ID = TimingConstraintsTest.class.hashCode() + 1;
+    private static final int EXPIRED_JOB_ID = TimingConstraintsTest.class.hashCode() + 2;
+    private static final int UNEXPIRED_JOB_ID = TimingConstraintsTest.class.hashCode() + 3;
 
     public void testScheduleOnce() throws Exception {
         JobInfo oneTimeJob = new JobInfo.Builder(TIMING_JOB_ID, kJobServiceComponent)
@@ -63,4 +66,44 @@
         assertTrue("Cancel failed: job executed when it shouldn't have.",
                 kTestEnvironment.awaitTimeout());
     }
+
+    /**
+     * Ensure that when a job is executed because its deadline has expired, that
+     * {@link JobParameters#isOverrideDeadlineExpired()} returns the correct value.
+     */
+    public void testJobParameters_expiredDeadline() throws Exception {
+
+        JobInfo deadlineJob =
+                new JobInfo.Builder(EXPIRED_JOB_ID, kJobServiceComponent)
+                        .setOverrideDeadline(2000L)
+                        .build();
+        kTestEnvironment.setExpectedExecutions(1);
+        mJobScheduler.schedule(deadlineJob);
+        assertTrue("Failed to execute deadline job", kTestEnvironment.awaitExecution());
+        assertTrue("Job that had its deadline expire didn't have" +
+                        " JobParameters#isOverrideDeadlineExpired=true",
+                kTestEnvironment.getLastJobParameters().isOverrideDeadlineExpired());
+    }
+
+
+    /**
+     * Ensure that when a job is executed and its deadline hasn't expired, that
+     * {@link JobParameters#isOverrideDeadlineExpired()} returns the correct value.
+     */
+    public void testJobParameters_unexpiredDeadline() throws Exception {
+
+        JobInfo deadlineJob =
+                new JobInfo.Builder(UNEXPIRED_JOB_ID, kJobServiceComponent)
+                        .setMinimumLatency(500L)
+                        .setRequiresCharging(true)
+                        .build();
+        kTestEnvironment.setExpectedExecutions(1);
+        mJobScheduler.schedule(deadlineJob);
+        // Run everything by pretending the device was just plugged in.
+        sendExpediteStableChargingBroadcast();
+        assertTrue("Failed to execute non-deadline job", kTestEnvironment.awaitExecution());
+        assertFalse("Job that ran early (unexpired) didn't have" +
+                        " JobParameters#isOverrideDeadlineExpired=false",
+                kTestEnvironment.getLastJobParameters().isOverrideDeadlineExpired());
+    }
 }
\ No newline at end of file
diff --git a/tests/acceleration/Android.mk b/tests/acceleration/Android.mk
index a6d6022..f36b64b 100644
--- a/tests/acceleration/Android.mk
+++ b/tests/acceleration/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/accessibility/Android.mk b/tests/accessibility/Android.mk
index 43fa291..bddbb58 100644
--- a/tests/accessibility/Android.mk
+++ b/tests/accessibility/Android.mk
@@ -28,4 +28,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/app/Android.mk b/tests/app/Android.mk
index 69bf590..f4f0a13 100644
--- a/tests/app/Android.mk
+++ b/tests/app/Android.mk
@@ -23,7 +23,7 @@
 
 LOCAL_PROGUARD_ENABLED := disabled
 
-LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common voip-common
+LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common voip-common org.apache.http.legacy
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner ctstestserver
 
@@ -32,4 +32,4 @@
 
 LOCAL_PACKAGE_NAME := CtsAppTestStubs
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/app/AndroidManifest.xml b/tests/app/AndroidManifest.xml
index 0d61e20..8d7729e 100644
--- a/tests/app/AndroidManifest.xml
+++ b/tests/app/AndroidManifest.xml
@@ -49,6 +49,7 @@
                 android:name="android.app.cts.MockApplication"
                 android:supportsRtl="true">
         <uses-library android:name="android.test.runner" />
+        <uses-library android:name="org.apache.http.legacy" android:required="false" />
 
         <activity android:name="android.app.cts.ActionBarActivity" />
 
diff --git a/tests/core/runner/src/com/android/cts/runner/CtsTestRunListener.java b/tests/core/runner/src/com/android/cts/runner/CtsTestRunListener.java
index 7564f32..57dc7c6 100644
--- a/tests/core/runner/src/com/android/cts/runner/CtsTestRunListener.java
+++ b/tests/core/runner/src/com/android/cts/runner/CtsTestRunListener.java
@@ -21,6 +21,7 @@
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.support.test.internal.runner.listener.InstrumentationRunListener;
+import android.text.TextUtils;
 import android.util.Log;
 
 import junit.framework.TestCase;
@@ -28,6 +29,7 @@
 import org.junit.runner.Description;
 import org.junit.runner.notification.RunListener;
 
+import java.io.BufferedReader;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStreamReader;
@@ -119,6 +121,39 @@
         Log.d(TAG, "Total memory  : " + total);
         Log.d(TAG, "Used memory   : " + used);
         Log.d(TAG, "Free memory   : " + free);
+
+        String tempdir = System.getProperty("java.io.tmpdir", "");
+        // TODO: Remove these extra Logs added to debug a specific timeout problem.
+        Log.d(TAG, "java.io.tmpdir is:" + tempdir);
+
+        if (!TextUtils.isEmpty(tempdir)) {
+            String[] commands = {"df", tempdir};
+            BufferedReader in = null;
+            try {
+                Log.d(TAG, "About to .exec df");
+                Process proc = runtime.exec(commands);
+                Log.d(TAG, ".exec returned");
+                in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+                Log.d(TAG, "Stream reader created");
+                String line;
+                while ((line = in.readLine()) != null) {
+                    Log.d(TAG, line);
+                }
+            } catch (IOException e) {
+                Log.d(TAG, "Exception: " + e.toString());
+                // Well, we tried
+            } finally {
+                Log.d(TAG, "In finally");
+                if (in != null) {
+                    try {
+                        in.close();
+                    } catch (IOException e) {
+                        // Meh
+                    }
+                }
+            }
+        }
+
         Log.d(TAG, "Now executing : " + testClass.getName());
     }
 
@@ -177,8 +212,8 @@
             mSslSocketFactory = HttpsURLConnection.getDefaultSSLSocketFactory();
 
             mProperties.setProperty("user.home", "");
-            mProperties.setProperty("java.io.tmpdir", System.getProperty("java.io.tmpdir"));
-            // The CDD mandates that devices that support WiFi are the only ones that will have 
+            mProperties.setProperty("java.io.tmpdir", context.getCacheDir().getAbsolutePath());
+            // The CDD mandates that devices that support WiFi are the only ones that will have
             // multicast.
             PackageManager pm = context.getPackageManager();
             mProperties.setProperty("android.cts.device.multicast",
diff --git a/tests/deviceadmin/Android.mk b/tests/deviceadmin/Android.mk
index 9ab9cb8..2e89d34 100644
--- a/tests/deviceadmin/Android.mk
+++ b/tests/deviceadmin/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/deviceadmin/res/xml/device_admin.xml b/tests/deviceadmin/res/xml/device_admin.xml
index 263fda6..f7d394e 100644
--- a/tests/deviceadmin/res/xml/device_admin.xml
+++ b/tests/deviceadmin/res/xml/device_admin.xml
@@ -22,6 +22,7 @@
         <force-lock />
         <wipe-data />
         <expire-password />
+        <disable-keyguard-features />
     </uses-policies>
 </device-admin>
 
diff --git a/tests/expectations/knownfailures.txt b/tests/expectations/knownfailures.txt
index 76b528b..754e38a 100644
--- a/tests/expectations/knownfailures.txt
+++ b/tests/expectations/knownfailures.txt
@@ -1,12 +1,5 @@
 [
 {
-  description: "testWindowContentFrameStats is flaky without 75b55d0846159543aafc1b7420915497fce9b3f1",
-  names: [
-    "android.app.uiautomation.cts.UiAutomationTest#testWindowContentFrameStats"
-  ],
-  bug: 18039218
-},
-{
   description: "the UsageStats is not yet stable enough",
   names: [
     "android.app.usage.cts.UsageStatsTest"
@@ -14,13 +7,6 @@
   bug: 17536113
 },
 {
-  description: "the ConnectivityConstraintTest are not yet stable",
-  names: [
-    "android.jobscheduler.cts.ConnectivityConstraintTest"
-  ],
-  bug: 18117279
-},
-{
   description: "tests a fragile by nature as they rely on hardcoded behavior",
   names: [
     "android.accessibilityservice.cts.AccessibilityTextTraversalTest#testActionNextAndPreviousAtGranularityPageOverText",
@@ -83,18 +69,24 @@
   bug: 16720689
 },
 {
-  description: "Disable WebGL conformance tests in CTS",
+  description: "test can only run properly on a user build device when the bug is resolved",
   names: [
-    "android.webgl.cts.WebGLTest"
+    "android.appwidget.cts.AppWidgetTest#testAppWidgetProviderCallbacks",
+    "android.appwidget.cts.AppWidgetTest#testBindAppWidget",
+    "android.appwidget.cts.AppWidgetTest#testCollectionWidgets",
+    "android.appwidget.cts.AppWidgetTest#testDeleteHost",
+    "android.appwidget.cts.AppWidgetTest#testDeleteHosts",
+    "android.appwidget.cts.AppWidgetTest#testGetAppWidgetIds",
+    "android.appwidget.cts.AppWidgetTest#testGetAppWidgetInfo",
+    "android.appwidget.cts.AppWidgetTest#testGetAppWidgetOptions",
+    "android.appwidget.cts.AppWidgetTest#testPartiallyUpdateAppWidgetViaWidgetId",
+    "android.appwidget.cts.AppWidgetTest#testPartiallyUpdateAppWidgetViaWidgetIds",
+    "android.appwidget.cts.AppWidgetTest#testTwoAppWidgetProviderCallbacks",
+    "android.appwidget.cts.AppWidgetTest#testUpdateAppWidgetViaComponentName",
+    "android.appwidget.cts.AppWidgetTest#testUpdateAppWidgetViaWidgetId",
+    "android.appwidget.cts.AppWidgetTest#testUpdateAppWidgetViaWidgetIds"
   ],
-  bug: 20937460
-},
-{
-  description: "WebGL test uniformMatrixBadArgs is too strict. Disabled until it's fixed upstream.",
-  names: [
-    "android.webgl.cts.WebGLTest#test_conformance_more_functions_uniformMatrixBadArgs_html"
-  ],
-  bug: 18638404
+  bug: 17993121
 },
 {
   description: "permissions for the API previously used in the test has changed, making it impossible to pass",
@@ -147,172 +139,6 @@
   bug: 17605875
 },
 {
-  description: "Failures on these tests are known on several devices.",
-  names: [
-    "android.hardware.cts.SensorBatchingTests#testAccelerometer_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testAccelerometer_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testAccelerometer_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testAccelerometer_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testMagneticField_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testMagneticField_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testMagneticField_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testMagneticField_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testOrientation_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testOrientation_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testOrientation_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testOrientation_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testGyroscope_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testGyroscope_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testGyroscope_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testGyroscope_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testPressure_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testPressure_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testPressure_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testPressure_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testGravity_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testGravity_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testGravity_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testGravity_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testRotationVector_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testRotationVector_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testRotationVector_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testRotationVector_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testMagneticFieldUncalibrated_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testMagneticFieldUncalibrated_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testMagneticFieldUncalibrated_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testMagneticFieldUncalibrated_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testGameRotationVector_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testGameRotationVector_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testGameRotationVector_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testGameRotationVector_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testGyroscopeUncalibrated_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testGyroscopeUncalibrated_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testGyroscopeUncalibrated_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testGyroscopeUncalibrated_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testLinearAcceleration_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testLinearAcceleration_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testLinearAcceleration_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testLinearAcceleration_50hz_flush",
-    "android.hardware.cts.SensorBatchingTests#testGeomagneticRotationVector_fastest_batching",
-    "android.hardware.cts.SensorBatchingTests#testGeomagneticRotationVector_50hz_batching",
-    "android.hardware.cts.SensorBatchingTests#testGeomagneticRotationVector_fastest_flush",
-    "android.hardware.cts.SensorBatchingTests#testGeomagneticRotationVector_50hz_flush",
-    "android.hardware.cts.SensorIntegrationTests#testSensorsWithSeveralClients",
-    "android.hardware.cts.SensorIntegrationTests#testSensorsMovingRates",
-    "android.hardware.cts.SensorIntegrationTests#testAccelerometerAccelerometerStopping",
-    "android.hardware.cts.SensorIntegrationTests#testAccelerometerGyroscopeStopping",
-    "android.hardware.cts.SensorIntegrationTests#testAccelerometerMagneticFieldStopping",
-    "android.hardware.cts.SensorIntegrationTests#testGyroscopeAccelerometerStopping",
-    "android.hardware.cts.SensorIntegrationTests#testGyroscopeGyroscopeStopping",
-    "android.hardware.cts.SensorIntegrationTests#testGyroscopeMagneticFieldStopping",
-    "android.hardware.cts.SensorIntegrationTests#testMagneticFieldAccelerometerStopping",
-    "android.hardware.cts.SensorIntegrationTests#testMagneticFieldGyroscopeStopping",
-    "android.hardware.cts.SensorIntegrationTests#testMagneticFieldMagneticFieldStopping",
-    "android.hardware.cts.SingleSensorTests#testSensorProperties",
-    "android.hardware.cts.SingleSensorTests#testAccelerometer_fastest",
-    "android.hardware.cts.SingleSensorTests#testAccelerometer_100hz",
-    "android.hardware.cts.SingleSensorTests#testAccelerometer_200hz",
-    "android.hardware.cts.SingleSensorTests#testAccelerometer_50hz",
-    "android.hardware.cts.SingleSensorTests#testAccelerometer_25hz",
-    "android.hardware.cts.SingleSensorTests#testAccelerometer_15hz",
-    "android.hardware.cts.SingleSensorTests#testAccelerometer_10hz",
-    "android.hardware.cts.SingleSensorTests#testAccelerometer_5hz",
-    "android.hardware.cts.SingleSensorTests#testAccelerometer_1hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticField_fastest",
-    "android.hardware.cts.SingleSensorTests#testMagneticField_200hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticField_100hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticField_50hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticField_25hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticField_15hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticField_10hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticField_5hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticField_1hz",
-    "android.hardware.cts.SingleSensorTests#testOrientation_fastest",
-    "android.hardware.cts.SingleSensorTests#testOrientation_200hz",
-    "android.hardware.cts.SingleSensorTests#testOrientation_100hz",
-    "android.hardware.cts.SingleSensorTests#testOrientation_50hz",
-    "android.hardware.cts.SingleSensorTests#testOrientation_25hz",
-    "android.hardware.cts.SingleSensorTests#testOrientation_15hz",
-    "android.hardware.cts.SingleSensorTests#testOrientation_10hz",
-    "android.hardware.cts.SingleSensorTests#testOrientation_5hz",
-    "android.hardware.cts.SingleSensorTests#testOrientation_1hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscope_fastest",
-    "android.hardware.cts.SingleSensorTests#testGyroscope_200hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscope_100hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscope_50hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscope_25hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscope_15hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscope_10hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscope_5hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscope_1hz",
-    "android.hardware.cts.SingleSensorTests#testPressure_fastest",
-    "android.hardware.cts.SingleSensorTests#testPressure_200hz",
-    "android.hardware.cts.SingleSensorTests#testPressure_100hz",
-    "android.hardware.cts.SingleSensorTests#testPressure_50hz",
-    "android.hardware.cts.SingleSensorTests#testPressure_25hz",
-    "android.hardware.cts.SingleSensorTests#testPressure_15hz",
-    "android.hardware.cts.SingleSensorTests#testPressure_10hz",
-    "android.hardware.cts.SingleSensorTests#testPressure_5hz",
-    "android.hardware.cts.SingleSensorTests#testPressure_1hz",
-    "android.hardware.cts.SingleSensorTests#testGravity_fastest",
-    "android.hardware.cts.SingleSensorTests#testGravity_200hz",
-    "android.hardware.cts.SingleSensorTests#testGravity_100hz",
-    "android.hardware.cts.SingleSensorTests#testGravity_50hz",
-    "android.hardware.cts.SingleSensorTests#testGravity_25hz",
-    "android.hardware.cts.SingleSensorTests#testGravity_15hz",
-    "android.hardware.cts.SingleSensorTests#testGravity_10hz",
-    "android.hardware.cts.SingleSensorTests#testGravity_5hz",
-    "android.hardware.cts.SingleSensorTests#testGravity_1hz",
-    "android.hardware.cts.SingleSensorTests#testRotationVector_fastest",
-    "android.hardware.cts.SingleSensorTests#testRotationVector_200hz",
-    "android.hardware.cts.SingleSensorTests#testRotationVector_100hz",
-    "android.hardware.cts.SingleSensorTests#testRotationVector_50hz",
-    "android.hardware.cts.SingleSensorTests#testRotationVector_25hz",
-    "android.hardware.cts.SingleSensorTests#testRotationVector_15hz",
-    "android.hardware.cts.SingleSensorTests#testRotationVector_10hz",
-    "android.hardware.cts.SingleSensorTests#testRotationVector_5hz",
-    "android.hardware.cts.SingleSensorTests#testRotationVector_1hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticFieldUncalibrated_fastest",
-    "android.hardware.cts.SingleSensorTests#testMagneticFieldUncalibrated_200hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticFieldUncalibrated_100hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticFieldUncalibrated_50hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticFieldUncalibrated_25hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticFieldUncalibrated_15hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticFieldUncalibrated_10hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticFieldUncalibrated_5hz",
-    "android.hardware.cts.SingleSensorTests#testMagneticFieldUncalibrated_1hz",
-    "android.hardware.cts.SingleSensorTests#testGameRotationVector_fastest",
-    "android.hardware.cts.SingleSensorTests#testGameRotationVector_200hz",
-    "android.hardware.cts.SingleSensorTests#testGameRotationVector_100hz",
-    "android.hardware.cts.SingleSensorTests#testGameRotationVector_50hz",
-    "android.hardware.cts.SingleSensorTests#testGameRotationVector_25hz",
-    "android.hardware.cts.SingleSensorTests#testGameRotationVector_15hz",
-    "android.hardware.cts.SingleSensorTests#testGameRotationVector_10hz",
-    "android.hardware.cts.SingleSensorTests#testGameRotationVector_5hz",
-    "android.hardware.cts.SingleSensorTests#testGameRotationVector_1hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscopeUncalibrated_fastest",
-    "android.hardware.cts.SingleSensorTests#testGyroscopeUncalibrated_200hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscopeUncalibrated_100hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscopeUncalibrated_50hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscopeUncalibrated_25hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscopeUncalibrated_15hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscopeUncalibrated_10hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscopeUncalibrated_5hz",
-    "android.hardware.cts.SingleSensorTests#testGyroscopeUncalibrated_1hz",
-    "android.hardware.cts.SingleSensorTests#testGeomagneticRotationVector_fastest",
-    "android.hardware.cts.SingleSensorTests#testLinearAcceleration_200hz",
-    "android.hardware.cts.SingleSensorTests#testLinearAcceleration_100hz",
-    "android.hardware.cts.SingleSensorTests#testLinearAcceleration_50hz",
-    "android.hardware.cts.SingleSensorTests#testLinearAcceleration_25hz",
-    "android.hardware.cts.SingleSensorTests#testLinearAcceleration_15hz",
-    "android.hardware.cts.SingleSensorTests#testLinearAcceleration_10hz",
-    "android.hardware.cts.SingleSensorTests#testLinearAcceleration_5hz",
-    "android.hardware.cts.SingleSensorTests#testLinearAcceleration_1hz",
-    "android.hardware.cts.SensorTest#testSensorTimeStamps"
-  ],
-  bug: 17675466
-},
-{
   description: "This test failed on hw decoder that doesn't output frame with the configured format.",
   names: [
     "android.media.cts.ImageReaderDecoderTest#testHwAVCDecode360pForFlexibleYuv"
@@ -320,13 +146,6 @@
   bug: 17144778
 },
 {
-  description: "Roboto font tests are not yet known good on all devices",
-  names: [
-    "android.uirendering.cts.testclasses.FontRenderingTests"
-  ],
-  bug: 17109280
-},
-{
   description: "android.keystore tests will replace these tests",
   names: [
     "com.android.org.conscrypt.MacTest#test_getInstance_OpenSSL_ENGINE",
@@ -348,5 +167,72 @@
     "android.hardware.camera2.cts.ImageReaderTest#testAllOutputYUVResolutions"
   ],
   bug: 18689511
+},
+{
+  description: "The new prepare performance test is not yet passing on all devices",
+  names: [
+    "android.hardware.camera2.cts.SurfaceViewPreviewTest#testPreparePerformance"
+  ],
+  bug: 17989532
+},
+{
+  description: "The new AE/AF trigger tests are not yet passing on all devices",
+  names: [
+    "android.hardware.camera2.cts.RobustnessTest#testBasicTriggerSequence",
+    "android.hardware.camera2.cts.RobustnessTest#testSimultaneousTriggers",
+    "android.hardware.camera2.cts.RobustnessTest#testAfThenAeTrigger",
+    "android.hardware.camera2.cts.RobustnessTest#testAeThenAfTrigger"
+  ],
+  bug: 22180706
+},
+{
+  description: "The new create session test is not yet passing on all devices",
+  names: [
+    "android.hardware.camera2.cts.CameraDeviceTest#testCreateSessions"
+  ],
+  bug: 22092756
+},
+{
+  description: "The new long processing test is not yet passing on all devices",
+  names: [
+    "android.hardware.camera2.cts.ImageReaderTest#testLongProcessingRepeatingRaw",
+    "android.hardware.camera2.cts.ImageReaderTest#testLongProcessingRepeatingFlexibleYuv"
+  ],
+  bug: 22861512
+},
+{
+  description: "The timing measurements for preview callbacks are not reliable",
+  names: [
+    "android.hardware.cts.CameraTest#testPreviewFpsRange"
+  ],
+  bug: 23008511
+},
+{
+  description: "known failures",
+  names: [
+    "android.hardware.cts.SensorBatchingTests#testAccelerometer_50hz_batching",
+    "android.hardware.cts.SensorBatchingTests#testAccelerometer_fastest_batching",
+    "android.hardware.cts.SensorBatchingTests#testGyroscope_50hz_batching",
+    "android.hardware.cts.SensorBatchingTests#testGyroscope_50hz_flush",
+    "android.hardware.cts.SensorBatchingTests#testMagneticField_50hz_batching",
+    "android.hardware.cts.SensorBatchingTests#testMagneticField_fastest_batching",
+    "android.hardware.cts.SensorBatchingTests#testMagneticFieldUncalibrated_50hz_batching",
+    "android.hardware.cts.SensorBatchingTests#testMagneticFieldUncalibrated_fastest_batching",
+    "android.hardware.cts.SensorBatchingTests#testPressure_50hz_batching",
+    "android.hardware.cts.SensorBatchingTests#testPressure_fastest_batching",
+    "android.hardware.cts.SensorBatchingTests#testRotationVector_50hz_flush",
+    "android.hardware.cts.SensorBatchingTests#testRotationVector_fastest_batching",
+    "android.hardware.cts.SensorIntegrationTests#testSensorsMovingRates",
+    "android.hardware.cts.SensorIntegrationTests#testSensorsWithSeveralClients",
+    "android.hardware.cts.SensorTest#testSensorTimeStamps",
+    "android.hardware.cts.SensorTest#testBatchAndFlush",
+    "android.hardware.cts.SingleSensorTests#testGyroscope_15hz",
+    "android.hardware.cts.SingleSensorTests#testGyroscope_1hz",
+    "android.hardware.cts.SingleSensorTests#testMagneticField_1hz",
+    "android.hardware.cts.SingleSensorTests#testMagneticField_50hz",
+    "android.hardware.cts.SingleSensorTests#testMagneticFieldUncalibrated_200hz",
+    "android.hardware.cts.SingleSensorTests#testOrientation_5hz"
+  ],
+  bug: 22922206
 }
 ]
diff --git a/tests/leanbackjank/Android.mk b/tests/leanbackjank/Android.mk
new file mode 100644
index 0000000..b3adfb1
--- /dev/null
+++ b/tests/leanbackjank/Android.mk
@@ -0,0 +1,33 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+        ./app/src/android/cts/jank/leanback/IntentKeys.java
+
+LOCAL_PACKAGE_NAME := CtsLeanbackJankTestCases
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner ub-uiautomator ub-janktesthelper android-support-v17-leanback
+
+include $(BUILD_CTS_PACKAGE)
+
+include $(call all-makefiles-under, $(LOCAL_PATH))
+
diff --git a/tests/leanbackjank/AndroidManifest.xml b/tests/leanbackjank/AndroidManifest.xml
new file mode 100644
index 0000000..1cd552d
--- /dev/null
+++ b/tests/leanbackjank/AndroidManifest.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="android.cts.leanbackjank">
+
+  <application>
+      <uses-library android:name="android.test.runner"/>
+  </application>
+
+  <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                   android:targetPackage="android.cts.leanbackjank"
+                   android:label="Jank tests">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+
+</manifest>
diff --git a/tests/leanbackjank/AndroidTest.xml b/tests/leanbackjank/AndroidTest.xml
new file mode 100644
index 0000000..e61c58d
--- /dev/null
+++ b/tests/leanbackjank/AndroidTest.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="CTS Jank test config">
+    <include name="common-config" />
+    <option name="cts-apk-installer:test-file-name" value="CtsLeanbackJank.apk" />
+</configuration>
diff --git a/tests/leanbackjank/app/Android.mk b/tests/leanbackjank/app/Android.mk
new file mode 100644
index 0000000..5abe1a7
--- /dev/null
+++ b/tests/leanbackjank/app/Android.mk
@@ -0,0 +1,47 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsLeanbackJank
+
+LOCAL_RESOURCE_DIR := \
+    $(TOP)/frameworks/support/v17/leanback/res \
+    $(TOP)/frameworks/support/v7/recyclerview/res \
+    $(LOCAL_PATH)/res
+
+LOCAL_STATIC_JAVA_LIBRARIES := \
+    ctsdeviceutil \
+    ctstestrunner \
+    ub-uiautomator \
+    ub-janktesthelper \
+    android-support-v4 \
+    android-support-v7-recyclerview \
+    android-support-v17-leanback \
+    glide
+
+LOCAL_AAPT_FLAGS := \
+        --auto-add-overlay \
+        --extra-packages android.support.v17.leanback \
+        --extra-packages android.support.v7.recyclerview
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/leanbackjank/app/AndroidManifest.xml b/tests/leanbackjank/app/AndroidManifest.xml
new file mode 100644
index 0000000..333399e
--- /dev/null
+++ b/tests/leanbackjank/app/AndroidManifest.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.cts.jank.leanback"
+    android:versionCode="1"
+    android:versionName="1.1" >
+
+    <uses-sdk
+        android:minSdkVersion="21"
+        android:targetSdkVersion="23" />
+
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+
+    <uses-feature
+        android:name="android.hardware.touchscreen"
+        android:required="false" />
+
+    <uses-feature android:name="android.software.leanback"
+        android:required="true" />
+
+    <application
+        android:allowBackup="false"
+        android:icon="@drawable/videos_by_google_banner"
+        android:label="@string/app_name"
+        android:logo="@drawable/videos_by_google_banner"
+        android:theme="@style/Theme.Example.Leanback" >
+        <activity
+            android:name=".ui.MainActivity"
+            android:icon="@drawable/videos_by_google_banner"
+            android:label="@string/app_name"
+            android:logo="@drawable/videos_by_google_banner"
+            android:screenOrientation="landscape" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/tests/leanbackjank/app/res/drawable-hdpi/app_icon_quantum.png b/tests/leanbackjank/app/res/drawable-hdpi/app_icon_quantum.png
new file mode 100644
index 0000000..fda9a74
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-hdpi/app_icon_quantum.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-hdpi/app_icon_quantum_card.png b/tests/leanbackjank/app/res/drawable-hdpi/app_icon_quantum_card.png
new file mode 100644
index 0000000..498cf66
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-hdpi/app_icon_quantum_card.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-hdpi/ic_launcher.png b/tests/leanbackjank/app/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..96a442e
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-hdpi/ic_main_icon.png b/tests/leanbackjank/app/res/drawable-hdpi/ic_main_icon.png
new file mode 100644
index 0000000..6f0c962
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-hdpi/ic_main_icon.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-hdpi/videos_by_google_banner.png b/tests/leanbackjank/app/res/drawable-hdpi/videos_by_google_banner.png
new file mode 100644
index 0000000..4cedb52
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-hdpi/videos_by_google_banner.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-hdpi/videos_by_google_icon.png b/tests/leanbackjank/app/res/drawable-hdpi/videos_by_google_icon.png
new file mode 100644
index 0000000..20fd898
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-hdpi/videos_by_google_icon.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-ldpi/ic_launcher.png b/tests/leanbackjank/app/res/drawable-ldpi/ic_launcher.png
new file mode 100644
index 0000000..9923872
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-ldpi/ic_launcher.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-mdpi/app_icon_quantum.png b/tests/leanbackjank/app/res/drawable-mdpi/app_icon_quantum.png
new file mode 100644
index 0000000..6b62138
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-mdpi/app_icon_quantum.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-mdpi/app_icon_quantum_card.png b/tests/leanbackjank/app/res/drawable-mdpi/app_icon_quantum_card.png
new file mode 100644
index 0000000..ac9cc30
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-mdpi/app_icon_quantum_card.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-mdpi/ic_launcher.png b/tests/leanbackjank/app/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..359047d
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-mdpi/ic_main_icon.png b/tests/leanbackjank/app/res/drawable-mdpi/ic_main_icon.png
new file mode 100644
index 0000000..e9effc8
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-mdpi/ic_main_icon.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-mdpi/videos_by_google_banner.png b/tests/leanbackjank/app/res/drawable-mdpi/videos_by_google_banner.png
new file mode 100644
index 0000000..b191626
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-mdpi/videos_by_google_banner.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-mdpi/videos_by_google_icon.png b/tests/leanbackjank/app/res/drawable-mdpi/videos_by_google_icon.png
new file mode 100644
index 0000000..8a7c6dc
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-mdpi/videos_by_google_icon.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-xhdpi/app_icon_quantum.png b/tests/leanbackjank/app/res/drawable-xhdpi/app_icon_quantum.png
new file mode 100644
index 0000000..825ef63
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-xhdpi/app_icon_quantum.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-xhdpi/app_icon_quantum_card.png b/tests/leanbackjank/app/res/drawable-xhdpi/app_icon_quantum_card.png
new file mode 100644
index 0000000..9b1703d
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-xhdpi/app_icon_quantum_card.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-xhdpi/bg.png b/tests/leanbackjank/app/res/drawable-xhdpi/bg.png
new file mode 100644
index 0000000..476c698
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-xhdpi/bg.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-xhdpi/card_background_default.9.png b/tests/leanbackjank/app/res/drawable-xhdpi/card_background_default.9.png
new file mode 100644
index 0000000..29f4e01
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-xhdpi/card_background_default.9.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-xhdpi/default_background.xml b/tests/leanbackjank/app/res/drawable-xhdpi/default_background.xml
new file mode 100644
index 0000000..07b0589
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-xhdpi/default_background.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <gradient
+            android:startColor="@color/background_gradient_start"
+            android:endColor="@color/background_gradient_end"
+            android:angle="-270" />
+</shape>
\ No newline at end of file
diff --git a/tests/leanbackjank/app/res/drawable-xhdpi/grid_bg.png b/tests/leanbackjank/app/res/drawable-xhdpi/grid_bg.png
new file mode 100644
index 0000000..476c698
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-xhdpi/grid_bg.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-xhdpi/ic_launcher.png b/tests/leanbackjank/app/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..71c6d76
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-xhdpi/ic_main_icon.png b/tests/leanbackjank/app/res/drawable-xhdpi/ic_main_icon.png
new file mode 100644
index 0000000..2e56516
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-xhdpi/ic_main_icon.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-xhdpi/shadow7.9.png b/tests/leanbackjank/app/res/drawable-xhdpi/shadow7.9.png
new file mode 100644
index 0000000..6d00d09
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-xhdpi/shadow7.9.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-xhdpi/videos_by_google_banner.png b/tests/leanbackjank/app/res/drawable-xhdpi/videos_by_google_banner.png
new file mode 100644
index 0000000..bdcf41e
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-xhdpi/videos_by_google_banner.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-xhdpi/videos_by_google_icon.png b/tests/leanbackjank/app/res/drawable-xhdpi/videos_by_google_icon.png
new file mode 100644
index 0000000..9bc4836
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-xhdpi/videos_by_google_icon.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-xxhdpi/app_icon_quantum.png b/tests/leanbackjank/app/res/drawable-xxhdpi/app_icon_quantum.png
new file mode 100644
index 0000000..c82f94c
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-xxhdpi/app_icon_quantum.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-xxhdpi/app_icon_quantum_card.png b/tests/leanbackjank/app/res/drawable-xxhdpi/app_icon_quantum_card.png
new file mode 100644
index 0000000..6c50e8f
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-xxhdpi/app_icon_quantum_card.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-xxhdpi/videos_by_google_banner.png b/tests/leanbackjank/app/res/drawable-xxhdpi/videos_by_google_banner.png
new file mode 100644
index 0000000..6c121e61
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-xxhdpi/videos_by_google_banner.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable-xxhdpi/videos_by_google_icon.png b/tests/leanbackjank/app/res/drawable-xxhdpi/videos_by_google_icon.png
new file mode 100644
index 0000000..4258160e
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable-xxhdpi/videos_by_google_icon.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable/android_header.png b/tests/leanbackjank/app/res/drawable/android_header.png
new file mode 100644
index 0000000..56206ec
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable/android_header.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable/app_icon_quantum.png b/tests/leanbackjank/app/res/drawable/app_icon_quantum.png
new file mode 100644
index 0000000..fda9a74
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable/app_icon_quantum.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable/app_icon_quantum_card.png b/tests/leanbackjank/app/res/drawable/app_icon_quantum_card.png
new file mode 100644
index 0000000..498cf66
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable/app_icon_quantum_card.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable/gradation.png b/tests/leanbackjank/app/res/drawable/gradation.png
new file mode 100644
index 0000000..ba43a90
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable/gradation.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable/ic_action_a.png b/tests/leanbackjank/app/res/drawable/ic_action_a.png
new file mode 100644
index 0000000..3d555ef
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable/ic_action_a.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable/ic_title.png b/tests/leanbackjank/app/res/drawable/ic_title.png
new file mode 100644
index 0000000..1c62b2e
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable/ic_title.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable/movie.png b/tests/leanbackjank/app/res/drawable/movie.png
new file mode 100644
index 0000000..cb5cb6d
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable/movie.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable/player_bg_gradient_dark.xml b/tests/leanbackjank/app/res/drawable/player_bg_gradient_dark.xml
new file mode 100644
index 0000000..4450cb6
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable/player_bg_gradient_dark.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <gradient
+        android:angle="90"
+        android:centerColor="#00000000"
+        android:endColor="#B2000000"
+        android:startColor="#B2000000"
+        android:type="linear" />
+
+</shape>
\ No newline at end of file
diff --git a/tests/leanbackjank/app/res/drawable/shadow7.9.png b/tests/leanbackjank/app/res/drawable/shadow7.9.png
new file mode 100644
index 0000000..6d00d09
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable/shadow7.9.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable/text_bg.xml b/tests/leanbackjank/app/res/drawable/text_bg.xml
new file mode 100644
index 0000000..43fbeaf
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable/text_bg.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <gradient
+        android:startColor="#FFFF0000"
+        android:endColor="#FFFF00FF"
+        android:angle="45" />
+    <padding
+        android:left="7dp"
+        android:top="7dp"
+        android:right="7dp"
+        android:bottom="7dp" />
+    <size
+        android:height="160dp"
+        android:width="100dp" />
+</shape>
diff --git a/tests/leanbackjank/app/res/drawable/videos_by_google_banner.png b/tests/leanbackjank/app/res/drawable/videos_by_google_banner.png
new file mode 100644
index 0000000..4cedb52
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable/videos_by_google_banner.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/drawable/videos_by_google_icon.png b/tests/leanbackjank/app/res/drawable/videos_by_google_icon.png
new file mode 100644
index 0000000..20fd898
--- /dev/null
+++ b/tests/leanbackjank/app/res/drawable/videos_by_google_icon.png
Binary files differ
diff --git a/tests/leanbackjank/app/res/layout/icon_header_item.xml b/tests/leanbackjank/app/res/layout/icon_header_item.xml
new file mode 100644
index 0000000..586881d
--- /dev/null
+++ b/tests/leanbackjank/app/res/layout/icon_header_item.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 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.
+-->
+<android.support.v17.leanback.widget.NonOverlappingLinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="horizontal"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ImageView
+        android:id="@+id/header_icon"
+        android:layout_width="32dp"
+        android:layout_height="32dp" />
+
+    <TextView
+        android:id="@+id/header_label"
+        android:layout_marginTop="6dp"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+</android.support.v17.leanback.widget.NonOverlappingLinearLayout>
diff --git a/tests/leanbackjank/app/res/layout/main.xml b/tests/leanbackjank/app/res/layout/main.xml
new file mode 100644
index 0000000..7a83b69
--- /dev/null
+++ b/tests/leanbackjank/app/res/layout/main.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/main_frame"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <fragment
+        android:name="android.cts.jank.leanback.ui.MainFragment"
+        android:id="@+id/main_browse_fragment"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+</FrameLayout>
diff --git a/tests/leanbackjank/app/res/layout/movie_card.xml b/tests/leanbackjank/app/res/layout/movie_card.xml
new file mode 100644
index 0000000..c63841d
--- /dev/null
+++ b/tests/leanbackjank/app/res/layout/movie_card.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<android.support.v17.leanback.widget.NonOverlappingLinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="vertical"
+              android:layout_height="wrap_content"
+              android:layout_width="wrap_content"
+              android:scaleType="centerCrop"
+              android:focusable="true"
+              android:focusableInTouchMode="true">
+    <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:id="@+id/poster" android:layout_gravity="center"/>
+    <TextView
+       android:id="@+id/poster_text"
+       android:layout_width="wrap_content"
+       android:layout_height="wrap_content"
+       android:paddingTop="10dp"
+       android:paddingRight="10dp"
+       android:paddingBottom="10dp"
+       android:paddingLeft="10dp" />
+</android.support.v17.leanback.widget.NonOverlappingLinearLayout>
\ No newline at end of file
diff --git a/tests/leanbackjank/app/res/values/colors.xml b/tests/leanbackjank/app/res/values/colors.xml
new file mode 100644
index 0000000..7e246ed
--- /dev/null
+++ b/tests/leanbackjank/app/res/values/colors.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="background_gradient_start">#000000</color>
+    <color name="background_gradient_end">#DDDDDD</color>
+    <color name="fastlane_background">#0096a6</color>
+    <color name="search_opaque">#ffaa3f</color>
+    <color name="selected_background">#ffaa3f</color>
+    <color name="soft_opaque">#30000000</color>
+    <color name="img_soft_opaque">#30FF0000</color>
+    <color name="img_full_opaque">#00000000</color>
+    <color name="black_opaque">#AA000000</color>
+    <color name="black">#59000000</color>
+    <color name="white">#FFFFFF</color>
+    <color name="orange_transparent">#AAFADCA7</color>
+    <color name="orange">#FADCA7</color>
+    <color name="yellow">#EEFF41</color>
+    <color name="default_background">#0096a6</color>
+    <color name="icon_background">#4A4F51</color>
+    <color name="icon_alt_background">#2A2F51</color>
+</resources>
\ No newline at end of file
diff --git a/tests/leanbackjank/app/res/values/strings.xml b/tests/leanbackjank/app/res/values/strings.xml
new file mode 100644
index 0000000..17edf95
--- /dev/null
+++ b/tests/leanbackjank/app/res/values/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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>
+    <string name="app_name"><![CDATA[Leanback launcher jank test application]]></string>
+    <string name="browse_title"><![CDATA[Leanback launcher jank test application]]></string>
+    <string name="error">Error</string>
+    <string name="ok">OK</string>
+    <string name="grid_item_template">Item %1$d</string>
+    <string name="settings">Settings</string>
+
+    <!-- Error messages -->
+    <string name="error_fragment_message">An error occurred</string>
+    <string name="dismiss_error">Dismiss</string>
+</resources>
diff --git a/tests/leanbackjank/app/res/values/themes.xml b/tests/leanbackjank/app/res/values/themes.xml
new file mode 100644
index 0000000..4a1e06d
--- /dev/null
+++ b/tests/leanbackjank/app/res/values/themes.xml
@@ -0,0 +1,15 @@
+<resources>
+    <style name="Theme.Example.Leanback" parent="Theme.Leanback">
+        <item name="android:colorPrimary">@color/search_opaque</item>
+        <item name="android:windowEnterTransition">@android:transition/fade</item>
+        <item name="android:windowExitTransition">@android:transition/fade</item>
+        <item name="android:windowSharedElementExitTransition">@android:transition/move</item>
+        <item name="android:windowSharedElementEnterTransition">@android:transition/move</item>
+        <!-- Set to display colorPrimary when apps launches -->
+        <item name="android:windowAllowReturnTransitionOverlap">true</item>
+        <item name="android:windowAllowEnterTransitionOverlap">false</item>
+        <item name="android:windowContentTransitions">true</item>
+    </style>
+    <style name="Widget.Example.Leanback.Title.Text" parent="Widget.Leanback.Title.Text" >
+    </style>
+</resources>
diff --git a/tests/leanbackjank/app/src/android/cts/jank/leanback/IntentKeys.java b/tests/leanbackjank/app/src/android/cts/jank/leanback/IntentKeys.java
new file mode 100644
index 0000000..e9c5e6e
--- /dev/null
+++ b/tests/leanbackjank/app/src/android/cts/jank/leanback/IntentKeys.java
@@ -0,0 +1,10 @@
+package android.cts.jank.leanback;
+
+/**
+ * Intent key strings of the leanback jank test helper app.
+ */
+public class IntentKeys {
+    public static final String SCROLL_COUNT = "SCROLL_COUNT";
+    public static final String SCROLL_DELAY = "SCROLL_DELAY";
+    public static final String SCROLL_INTERVAL = "SCROLL_INTERVAL";
+}
diff --git a/tests/leanbackjank/app/src/android/cts/jank/leanback/Utils.java b/tests/leanbackjank/app/src/android/cts/jank/leanback/Utils.java
new file mode 100644
index 0000000..de6d6af
--- /dev/null
+++ b/tests/leanbackjank/app/src/android/cts/jank/leanback/Utils.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2015 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.cts.jank.leanback;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Point;
+import android.media.MediaMetadataRetriever;
+import android.os.Build;
+import android.util.DisplayMetrics;
+import android.view.Display;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
+import android.widget.Toast;
+import android.widget.VideoView;
+
+import java.util.HashMap;
+
+/**
+ * A collection of utility methods, all static.
+ */
+public class Utils {
+
+    public interface MediaDimensions {
+        double MEDIA_HEIGHT = 0.95;
+        double MEDIA_WIDTH = 0.95;
+        double MEDIA_TOP_MARGIN = 0.025;
+        double MEDIA_RIGHT_MARGIN = 0.025;
+        double MEDIA_BOTTOM_MARGIN = 0.025;
+        double MEDIA_LEFT_MARGIN = 0.025;
+    }
+
+    /*
+     * Making sure public utility methods remain static
+     */
+    private Utils() {
+    }
+
+    /**
+     * Returns the screen/display size
+     */
+    public static Point getDisplaySize(Context context) {
+        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
+        Display display = wm.getDefaultDisplay();
+        Point size = new Point();
+        display.getSize(size);
+        return size;
+    }
+
+    /**
+     * Shows a (long) toast
+     */
+    public static void showToast(Context context, String msg) {
+        Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
+    }
+
+    /**
+     * Shows a (long) toast.
+     */
+    public static void showToast(Context context, int resourceId) {
+        Toast.makeText(context, context.getString(resourceId), Toast.LENGTH_LONG).show();
+    }
+
+    public static int convertDpToPixel(Context ctx, int dp) {
+        float density = ctx.getResources().getDisplayMetrics().density;
+        return Math.round((float) dp * density);
+    }
+
+
+    /**
+     * Example for handling resizing content for overscan.  Typically you won't need to resize
+     * when using the Leanback support library.
+     */
+    public void overScan(Activity activity, VideoView videoView) {
+        DisplayMetrics metrics = new DisplayMetrics();
+        activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
+        int w = (int) (metrics.widthPixels * MediaDimensions.MEDIA_WIDTH);
+        int h = (int) (metrics.heightPixels * MediaDimensions.MEDIA_HEIGHT);
+        int marginLeft = (int) (metrics.widthPixels * MediaDimensions.MEDIA_LEFT_MARGIN);
+        int marginTop = (int) (metrics.heightPixels * MediaDimensions.MEDIA_TOP_MARGIN);
+        int marginRight = (int) (metrics.widthPixels * MediaDimensions.MEDIA_RIGHT_MARGIN);
+        int marginBottom = (int) (metrics.heightPixels * MediaDimensions.MEDIA_BOTTOM_MARGIN);
+        FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(w, h);
+        lp.setMargins(marginLeft, marginTop, marginRight, marginBottom);
+        videoView.setLayoutParams(lp);
+    }
+
+
+    public static long getDuration(String videoUrl) {
+        MediaMetadataRetriever mmr = new MediaMetadataRetriever();
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+            mmr.setDataSource(videoUrl, new HashMap<String, String>());
+        } else {
+            mmr.setDataSource(videoUrl);
+        }
+        return Long.parseLong(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION));
+    }
+}
diff --git a/tests/leanbackjank/app/src/android/cts/jank/leanback/data/VideoProvider.java b/tests/leanbackjank/app/src/android/cts/jank/leanback/data/VideoProvider.java
new file mode 100644
index 0000000..fa317ed
--- /dev/null
+++ b/tests/leanbackjank/app/src/android/cts/jank/leanback/data/VideoProvider.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2015 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.cts.jank.leanback.data;
+
+import android.cts.jank.leanback.model.Movie;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Provides synthesized movie data.
+ */
+public class VideoProvider {
+    private static HashMap<String, List<Movie>> sMovieList;
+    private static HashMap<String, Movie> sMovieListById;
+
+    public static Movie getMovieById(String mediaId) {
+        return sMovieListById.get(mediaId);
+    }
+
+    public static HashMap<String, List<Movie>> getMovieList() {
+        return sMovieList;
+    }
+
+    public static HashMap<String, List<Movie>> buildMedia(int nCategories) {
+        if (null != sMovieList) {
+            return sMovieList;
+        }
+        sMovieList = new HashMap<>();
+        sMovieListById = new HashMap<>();
+
+        String title = new String();
+        String studio = new String();
+        for (int i = 0; i < nCategories; i++) {
+            String category_name = String.format("Category %d",  i);
+            List<Movie> categoryList = new ArrayList<Movie>();
+            for (int j = 0; j < 20; j++) {
+                String description = "This is description of a movie.";
+                title = String.format("Video %d-%d", i, j);
+                studio = String.format("Studio %d", (i + j) % 7);
+                Movie movie = buildMovieInfo(category_name, title, description, studio);
+                sMovieListById.put(movie.getId(), movie);
+                categoryList.add(movie);
+            }
+            sMovieList.put(category_name, categoryList);
+        }
+        return sMovieList;
+    }
+
+    private static Movie buildMovieInfo(String category,
+                                        String title,
+                                        String description,
+                                        String studio) {
+        Movie movie = new Movie();
+        movie.setId(Movie.getCount());
+        Movie.incrementCount();
+        movie.setTitle(title);
+        movie.setDescription(description);
+        movie.setStudio(studio);
+        movie.setCategory(category);
+
+        return movie;
+    }
+}
diff --git a/tests/leanbackjank/app/src/android/cts/jank/leanback/model/Movie.java b/tests/leanbackjank/app/src/android/cts/jank/leanback/model/Movie.java
new file mode 100644
index 0000000..874bb00
--- /dev/null
+++ b/tests/leanbackjank/app/src/android/cts/jank/leanback/model/Movie.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2015 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.cts.jank.leanback.model;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Movie class represents video entity with title, description, image thumbs and video url.
+ */
+public class Movie implements Parcelable {
+    static final long serialVersionUID = 727566175075960653L;
+    private static int sCount = 0;
+    private String mId;
+    private String mTitle;
+    private String mDescription;
+    private String mStudio;
+    private String mCategory;
+
+    public Movie() {
+    }
+
+    public Movie(Parcel in){
+        String[] data = new String[5];
+
+        in.readStringArray(data);
+        mId = data[0];
+        mTitle = data[1];
+        mDescription = data[2];
+        mStudio = data[3];
+        mCategory = data[4];
+    }
+
+    public static String getCount() {
+        return Integer.toString(sCount);
+    }
+
+    public static void incrementCount() {
+        sCount++;
+    }
+
+    public String getId() {
+        return mId;
+    }
+
+    public void setId(String id) {
+        mId = id;
+    }
+
+    public String getTitle() {
+        return mTitle;
+    }
+
+    public void setTitle(String title) {
+        mTitle = title;
+    }
+
+    public String getDescription() {
+        return mDescription;
+    }
+
+    public void setDescription(String description) {
+        mDescription = description;
+    }
+
+    public String getStudio() {
+        return mStudio;
+    }
+
+    public void setStudio(String studio) {
+        mStudio = studio;
+    }
+
+    public String getCategory() {
+        return mCategory;
+    }
+
+    public void setCategory(String category) {
+        mCategory = category;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeStringArray(new String[] {mId,
+                mTitle,
+                mDescription,
+                mStudio,
+                mCategory});
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder(200);
+        sb.append("Movie{");
+        sb.append("mId=" + mId);
+        sb.append(", mTitle='" + mTitle + '\'');
+        sb.append('}');
+        return sb.toString();
+    }
+
+    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+        public Movie createFromParcel(Parcel in) {
+            return new Movie(in);
+        }
+
+        public Movie[] newArray(int size) {
+            return new Movie[size];
+        }
+    };
+}
diff --git a/tests/leanbackjank/app/src/android/cts/jank/leanback/presenter/CardPresenter.java b/tests/leanbackjank/app/src/android/cts/jank/leanback/presenter/CardPresenter.java
new file mode 100644
index 0000000..9f425ca
--- /dev/null
+++ b/tests/leanbackjank/app/src/android/cts/jank/leanback/presenter/CardPresenter.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2015 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.cts.jank.leanback.presenter;
+
+import android.graphics.drawable.Drawable;
+import android.support.v17.leanback.widget.ImageCardView;
+import android.support.v17.leanback.widget.Presenter;
+import android.view.ViewGroup;
+
+import com.bumptech.glide.Glide;
+import android.cts.jank.leanback.R;
+import android.cts.jank.leanback.model.Movie;
+
+/**
+ * A CardPresenter is used to generate Views and bind Objects to them on demand.
+ * It contains an Image CardView
+ */
+public class CardPresenter extends Presenter {
+    private static int CARD_WIDTH = 313;
+    private static int CARD_HEIGHT = 176;
+    private static int sSelectedBackgroundColor;
+    private static int sDefaultBackgroundColor;
+    private Drawable mDefaultCardImage;
+
+    @Override
+    public ViewHolder onCreateViewHolder(ViewGroup parent) {
+        sDefaultBackgroundColor = parent.getResources().getColor(R.color.default_background, null);
+        sSelectedBackgroundColor =
+                parent.getResources().getColor(R.color.selected_background, null);
+        mDefaultCardImage = parent.getResources().getDrawable(R.drawable.movie, null);
+
+        ImageCardView cardView = new ImageCardView(parent.getContext()) {
+            @Override
+            public void setSelected(boolean selected) {
+                updateCardBackgroundColor(this, selected);
+                super.setSelected(selected);
+            }
+        };
+
+        cardView.setFocusable(true);
+        cardView.setFocusableInTouchMode(true);
+        updateCardBackgroundColor(cardView, false);
+        return new ViewHolder(cardView);
+    }
+
+    private static void updateCardBackgroundColor(ImageCardView view, boolean selected) {
+        int color = selected ? sSelectedBackgroundColor : sDefaultBackgroundColor;
+        // Both background colors should be set because the view's background is temporarily visible
+        // during animations.
+        view.setBackgroundColor(color);
+        view.findViewById(R.id.info_field).setBackgroundColor(color);
+    }
+
+    @Override
+    public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
+        Movie movie = (Movie) item;
+        ImageCardView cardView = (ImageCardView) viewHolder.view;
+
+        cardView.setTitleText(movie.getTitle());
+        cardView.setContentText(movie.getStudio());
+        cardView.setMainImageDimensions(CARD_WIDTH, CARD_HEIGHT);
+        Glide.with(viewHolder.view.getContext())
+                .load(R.drawable.gradation)
+                .centerCrop()
+                .error(mDefaultCardImage)
+                .into(cardView.getMainImageView());
+    }
+
+    @Override
+    public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
+        ImageCardView cardView = (ImageCardView) viewHolder.view;
+        // Remove references to images so that the garbage collector can free up memory
+        cardView.setBadgeImage(null);
+        cardView.setMainImage(null);
+    }
+}
diff --git a/tests/leanbackjank/app/src/android/cts/jank/leanback/presenter/GridItemPresenter.java b/tests/leanbackjank/app/src/android/cts/jank/leanback/presenter/GridItemPresenter.java
new file mode 100644
index 0000000..4084383
--- /dev/null
+++ b/tests/leanbackjank/app/src/android/cts/jank/leanback/presenter/GridItemPresenter.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2015 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.cts.jank.leanback.presenter;
+
+import android.graphics.Color;
+import android.support.v17.leanback.widget.Presenter;
+import android.view.Gravity;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import android.cts.jank.leanback.R;
+import android.cts.jank.leanback.ui.MainFragment;
+
+public class GridItemPresenter extends Presenter {
+    private static int GRID_ITEM_WIDTH = 200;
+    private static int GRID_ITEM_HEIGHT = 200;
+
+    private MainFragment mainFragment;
+
+    public GridItemPresenter(MainFragment mainFragment) {
+        this.mainFragment = mainFragment;
+    }
+
+    @Override
+    public ViewHolder onCreateViewHolder(ViewGroup parent) {
+        TextView view = new TextView(parent.getContext());
+        view.setLayoutParams(new ViewGroup.LayoutParams(GRID_ITEM_WIDTH, GRID_ITEM_HEIGHT));
+        view.setFocusable(true);
+        view.setFocusableInTouchMode(true);
+        view.setBackgroundColor(
+            mainFragment.getResources().getColor(R.color.default_background, null));
+        view.setTextColor(Color.WHITE);
+        view.setGravity(Gravity.CENTER);
+        return new ViewHolder(view);
+    }
+
+    @Override
+    public void onBindViewHolder(ViewHolder viewHolder, Object item) {
+        ((TextView) viewHolder.view).setText((String) item);
+    }
+
+    @Override
+    public void onUnbindViewHolder(ViewHolder viewHolder) {
+    }
+}
diff --git a/tests/leanbackjank/app/src/android/cts/jank/leanback/presenter/IconHeaderItemPresenter.java b/tests/leanbackjank/app/src/android/cts/jank/leanback/presenter/IconHeaderItemPresenter.java
new file mode 100644
index 0000000..42e4c0c
--- /dev/null
+++ b/tests/leanbackjank/app/src/android/cts/jank/leanback/presenter/IconHeaderItemPresenter.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2015 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.cts.jank.leanback.presenter;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.RowHeaderPresenter;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import android.cts.jank.leanback.R;
+
+public class IconHeaderItemPresenter extends RowHeaderPresenter {
+    private float mUnselectedAlpha;
+
+    @Override
+    public ViewHolder onCreateViewHolder(ViewGroup viewGroup) {
+        mUnselectedAlpha = viewGroup.getResources()
+                .getFraction(R.fraction.lb_browse_header_unselect_alpha, 1, 1);
+        LayoutInflater inflater = (LayoutInflater) viewGroup.getContext()
+                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+        View view = inflater.inflate(R.layout.icon_header_item, null);
+
+        return new ViewHolder(view);
+    }
+
+    @Override
+    public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object o) {
+        HeaderItem headerItem = ((ListRow) o).getHeaderItem();
+        View rootView = viewHolder.view;
+
+        ImageView iconView = (ImageView) rootView.findViewById(R.id.header_icon);
+        Drawable icon = rootView.getResources().getDrawable(R.drawable.android_header, null);
+        iconView.setImageDrawable(icon);
+
+        TextView label = (TextView) rootView.findViewById(R.id.header_label);
+        label.setText(headerItem.getName());
+    }
+
+    @Override
+    public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
+    }
+
+    // TODO: TEMP - remove me when leanback onCreateViewHolder no longer sets the mUnselectAlpha,AND
+    // also assumes the xml inflation will return a RowHeaderView
+    @Override
+    protected void onSelectLevelChanged(RowHeaderPresenter.ViewHolder holder) {
+        // this is a temporary fix
+        holder.view.setAlpha(mUnselectedAlpha + holder.getSelectLevel() *
+                (1.0f - mUnselectedAlpha));
+    }
+}
\ No newline at end of file
diff --git a/tests/leanbackjank/app/src/android/cts/jank/leanback/ui/MainActivity.java b/tests/leanbackjank/app/src/android/cts/jank/leanback/ui/MainActivity.java
new file mode 100644
index 0000000..fb27fa1
--- /dev/null
+++ b/tests/leanbackjank/app/src/android/cts/jank/leanback/ui/MainActivity.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2015 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.cts.jank.leanback.ui;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.cts.jank.leanback.R;
+
+/**
+ * MainActivity class that loads MainFragment
+ */
+public class MainActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.main);
+    }
+
+    @Override
+    public boolean onSearchRequested() {
+        return false;
+    }
+}
diff --git a/tests/leanbackjank/app/src/android/cts/jank/leanback/ui/MainFragment.java b/tests/leanbackjank/app/src/android/cts/jank/leanback/ui/MainFragment.java
new file mode 100644
index 0000000..e645f6b
--- /dev/null
+++ b/tests/leanbackjank/app/src/android/cts/jank/leanback/ui/MainFragment.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2015 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.cts.jank.leanback.ui;
+
+import android.content.Intent;
+import android.content.res.Resources.Theme;
+import android.cts.jank.leanback.IntentKeys;
+import android.cts.jank.leanback.R;
+import android.cts.jank.leanback.data.VideoProvider;
+import android.cts.jank.leanback.model.Movie;
+import android.cts.jank.leanback.presenter.CardPresenter;
+import android.cts.jank.leanback.presenter.GridItemPresenter;
+import android.cts.jank.leanback.presenter.IconHeaderItemPresenter;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v17.leanback.app.BackgroundManager;
+import android.support.v17.leanback.app.BrowseFragment;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.PresenterSelector;
+import android.util.DisplayMetrics;
+import android.view.View;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * Main class to show BrowseFragment with header and rows of videos
+ */
+public class MainFragment extends BrowseFragment {
+    private static final int NUM_ROWS = 20;
+    private final Handler mHandler = new Handler();
+    private Timer mAutoScrollTimer;
+    private int mAutoScrollCount;
+
+    private ArrayObjectAdapter mRowsAdapter;
+    private DisplayMetrics mMetrics;
+    private BackgroundManager mBackgroundManager;
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        buildRowAdapterItems(VideoProvider.buildMedia(NUM_ROWS));
+        prepareBackgroundManager();
+        setupUIElements();
+        setupEventListeners();
+        Intent intent = getActivity().getIntent();
+        if (intent.getExtras() != null) {
+            int initialDelay = intent.getExtras().getInt(IntentKeys.SCROLL_DELAY);
+            int scrollCount = intent.getExtras().getInt(IntentKeys.SCROLL_COUNT);
+            int scrollInterval = intent.getExtras().getInt(IntentKeys.SCROLL_INTERVAL);
+            if (scrollInterval != 0 && scrollCount != 0) {
+                startAutoScrollTimer(initialDelay, scrollInterval, scrollCount);
+            }
+        }
+    }
+
+    @Override
+    public void onDestroy() {
+        if (null != mAutoScrollTimer) {
+            mAutoScrollTimer.cancel();
+            mAutoScrollTimer = null;
+        }
+        super.onDestroy();
+    }
+
+    @Override
+    public void onStop() {
+        mBackgroundManager.release();
+        super.onStop();
+    }
+
+    private void prepareBackgroundManager() {
+        mBackgroundManager = BackgroundManager.getInstance(getActivity());
+        mBackgroundManager.attach(getActivity().getWindow());
+        mBackgroundManager.setDrawable(getActivity().getResources().getDrawable(
+                R.drawable.default_background, getContext().getTheme()));
+        mMetrics = new DisplayMetrics();
+        getActivity().getWindowManager().getDefaultDisplay().getMetrics(mMetrics);
+    }
+
+    private void setupUIElements() {
+        setBadgeDrawable(getActivity().getResources().getDrawable(
+                R.drawable.videos_by_google_banner, getContext().getTheme()));
+        setTitle(getString(R.string.browse_title));
+        setHeadersState(HEADERS_ENABLED);
+        setHeadersTransitionOnBackEnabled(true);
+
+        Theme theme = getContext().getTheme();
+        setBrandColor(getResources().getColor(R.color.fastlane_background, theme));
+
+        setSearchAffordanceColor(getResources().getColor(R.color.search_opaque, theme));
+
+        setHeaderPresenterSelector(new PresenterSelector() {
+            @Override
+            public Presenter getPresenter(Object o) {
+                return new IconHeaderItemPresenter();
+            }
+        });
+    }
+
+    private void setupEventListeners() {
+        // Add lister to show the search button.
+        setOnSearchClickedListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+            }
+        });
+    }
+
+    public void buildRowAdapterItems(HashMap<String, List<Movie>> data) {
+        mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
+        CardPresenter cardPresenter = new CardPresenter();
+
+        int i = 0;
+
+        for (Map.Entry<String, List<Movie>> entry : data.entrySet()) {
+            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);
+            List<Movie> list = entry.getValue();
+
+            for (int j = 0; j < list.size(); j++) {
+                listRowAdapter.add(list.get(j));
+            }
+            HeaderItem header = new HeaderItem(i, entry.getKey());
+            i++;
+            mRowsAdapter.add(new ListRow(header, listRowAdapter));
+        }
+
+        HeaderItem gridHeader = new HeaderItem(i, getString(R.string.settings));
+
+        GridItemPresenter gridPresenter = new GridItemPresenter(this);
+        ArrayObjectAdapter gridRowAdapter = new ArrayObjectAdapter(gridPresenter);
+        for (int j = 0; j < 10; j++) {
+            gridRowAdapter.add(getString(R.string.grid_item_template, j));
+        }
+        mRowsAdapter.add(new ListRow(gridHeader, gridRowAdapter));
+
+        setAdapter(mRowsAdapter);
+    }
+
+    private class UpdateAutoScrollTask extends TimerTask {
+        @Override
+        public void run() {
+            mHandler.post(new Runnable() {
+                @Override
+                public void run() {
+                    if (mAutoScrollCount == 0) {
+                      mAutoScrollTimer.cancel();
+                      return;
+                    }
+                    if (mAutoScrollCount % 2 == 0) {
+                      setSelectedPosition(NUM_ROWS - 1);
+                    } else {
+                      setSelectedPosition(0);
+                    }
+                    mAutoScrollCount--;
+                }
+            });
+        }
+    }
+
+    private void startAutoScrollTimer(int initialDelay, int interval, int count) {
+        if (null != mAutoScrollTimer) {
+            mAutoScrollTimer.cancel();
+        }
+        mAutoScrollCount = count;
+        mAutoScrollTimer = new Timer();
+        mAutoScrollTimer.schedule(new UpdateAutoScrollTask(), initialDelay, interval);
+    }
+
+    public void selectRow(int row) {
+        setSelectedPosition(row);
+    }
+}
diff --git a/tests/leanbackjank/src/android/cts/leanbackjank/CtsDeviceLeanback.java b/tests/leanbackjank/src/android/cts/leanbackjank/CtsDeviceLeanback.java
new file mode 100644
index 0000000..a86a707
--- /dev/null
+++ b/tests/leanbackjank/src/android/cts/leanbackjank/CtsDeviceLeanback.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2015 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.cts.leanbackjank;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.cts.jank.leanback.IntentKeys;
+import android.os.SystemClock;
+import android.support.test.jank.GfxMonitor;
+import android.support.test.jank.JankTest;
+import android.support.test.jank.WindowContentFrameStatsMonitor;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.Until;
+import android.util.Log;
+
+public class CtsDeviceLeanback extends CtsJankTestBase {
+    private static final String TAG = "CtsDeviceLeanback";
+    private static final int MILLIS_PER_SECOND = 1000;
+    private static final long WAIT_TIMEOUT = 5 * MILLIS_PER_SECOND;
+    private static final int SCROLL_COUNT = 100;
+    private static final int SCROLL_INTERVAL_MILLIS = 200;
+    private static final int PRE_SCROLL_DELAY_MILLIS = 0;
+    private static final int PRE_SCROLL_IDLE_TIME = 2 * MILLIS_PER_SECOND;
+    private static final int SAMPLING_DURATION_SECONDS = 3;
+    private static final int SAMPLING_DURATION_MILLIS =
+            SAMPLING_DURATION_SECONDS * MILLIS_PER_SECOND;
+    private final static String APP_PACKAGE = "android.cts.jank.leanback";
+    private final static String JAVA_PACKAGE = "android.cts.jank.leanback.ui";
+    private final static String CLASS = JAVA_PACKAGE + ".MainActivity";
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setComponent(new ComponentName(APP_PACKAGE, CLASS));
+
+        // Trigger automated scroll of the helper app.
+        intent.putExtra(IntentKeys.SCROLL_DELAY, PRE_SCROLL_DELAY_MILLIS);
+        intent.putExtra(IntentKeys.SCROLL_COUNT, SCROLL_COUNT);
+        intent.putExtra(IntentKeys.SCROLL_INTERVAL, SCROLL_INTERVAL_MILLIS);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        getInstrumentation().getTargetContext().startActivity(intent);
+        if (!getUiDevice().wait(Until.hasObject(By.pkg(APP_PACKAGE)), WAIT_TIMEOUT)) {
+            fail("Test helper app package not found on device");
+        }
+
+        // Wait until scroll animation starts.
+        SystemClock.sleep(PRE_SCROLL_IDLE_TIME);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        getUiDevice().pressHome();
+        super.tearDown();
+    }
+
+    // Requires at least 30 fps on average to pass the test.
+    @JankTest(expectedFrames = 30 * SAMPLING_DURATION_SECONDS, defaultIterationCount = 2)
+    @GfxMonitor(processName = APP_PACKAGE)
+    @WindowContentFrameStatsMonitor
+    public void testScrollingByTimer() {
+        SystemClock.sleep(SAMPLING_DURATION_MILLIS);
+    }
+}
diff --git a/tests/leanbackjank/src/android/cts/leanbackjank/CtsJankTestBase.java b/tests/leanbackjank/src/android/cts/leanbackjank/CtsJankTestBase.java
new file mode 100644
index 0000000..4de0702
--- /dev/null
+++ b/tests/leanbackjank/src/android/cts/leanbackjank/CtsJankTestBase.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2015 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.cts.leanbackjank;
+
+import android.cts.util.DeviceReportLog;
+import android.os.Bundle;
+import android.support.test.jank.GfxMonitor;
+import android.support.test.jank.JankTestBase;
+import android.support.test.jank.WindowContentFrameStatsMonitor;
+import android.support.test.uiautomator.UiDevice;
+
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+
+public abstract class CtsJankTestBase extends JankTestBase {
+
+    private UiDevice mDevice;
+    private DeviceReportLog mLog;
+
+    private void printIntValueWithKey(String source, Bundle metrics, String key,
+            ResultType resultType, ResultUnit resultUnit) {
+        if (!metrics.containsKey(key)) {
+            return;
+        }
+        mLog.printValue(source, key, metrics.getInt(key), resultType, resultUnit);
+    }
+
+    private void printDoubleValueWithKey(String source, Bundle metrics, String key,
+            ResultType resultType, ResultUnit resultUnit) {
+        if (!metrics.containsKey(key)) {
+            return;
+        }
+        mLog.printValue(source, key, metrics.getDouble(key), resultType, resultUnit);
+    }
+
+    @Override
+    public void afterTest(Bundle metrics) {
+        String source = String.format("%s#%s", getClass().getCanonicalName(), getName());
+        printDoubleValueWithKey(source, metrics, WindowContentFrameStatsMonitor.KEY_AVG_FPS,
+                ResultType.HIGHER_BETTER, ResultUnit.FPS);
+        printDoubleValueWithKey(source, metrics,
+                WindowContentFrameStatsMonitor.KEY_AVG_LONGEST_FRAME,
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        printIntValueWithKey(source, metrics, WindowContentFrameStatsMonitor.KEY_MAX_NUM_JANKY,
+                ResultType.LOWER_BETTER, ResultUnit.COUNT);
+        mLog.printSummary(WindowContentFrameStatsMonitor.KEY_AVG_NUM_JANKY,
+                metrics.getDouble(WindowContentFrameStatsMonitor.KEY_AVG_NUM_JANKY),
+                ResultType.LOWER_BETTER, ResultUnit.COUNT);
+
+        printDoubleValueWithKey(source, metrics, GfxMonitor.KEY_AVG_NUM_JANKY,
+                ResultType.LOWER_BETTER, ResultUnit.COUNT);
+        printDoubleValueWithKey(source, metrics, GfxMonitor.KEY_AVG_FRAME_TIME_90TH_PERCENTILE,
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        printDoubleValueWithKey(source, metrics, GfxMonitor.KEY_AVG_FRAME_TIME_95TH_PERCENTILE,
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        printDoubleValueWithKey(source, metrics, GfxMonitor.KEY_AVG_FRAME_TIME_99TH_PERCENTILE,
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        printDoubleValueWithKey(source, metrics, GfxMonitor.KEY_AVG_MISSED_VSYNC,
+                ResultType.LOWER_BETTER, ResultUnit.COUNT);
+        printDoubleValueWithKey(source, metrics, GfxMonitor.KEY_AVG_SLOW_UI_THREAD,
+                ResultType.LOWER_BETTER, ResultUnit.COUNT);
+        printDoubleValueWithKey(source, metrics, GfxMonitor.KEY_AVG_SLOW_BITMAP_UPLOADS,
+                ResultType.LOWER_BETTER, ResultUnit.COUNT);
+        printDoubleValueWithKey(source, metrics, GfxMonitor.KEY_AVG_SLOW_DRAW,
+                ResultType.LOWER_BETTER, ResultUnit.COUNT);
+        printDoubleValueWithKey(source, metrics, GfxMonitor.KEY_AVG_HIGH_INPUT_LATENCY,
+                ResultType.LOWER_BETTER, ResultUnit.COUNT);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mLog = new DeviceReportLog();
+        // fix device orientation
+        mDevice = UiDevice.getInstance(getInstrumentation());
+        mDevice.setOrientationNatural();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mLog.deliverReportToHost(getInstrumentation());
+        // restore device orientation
+        mDevice.unfreezeRotation();
+        super.tearDown();
+    }
+
+    protected UiDevice getUiDevice() {
+        return mDevice;
+    }
+}
diff --git a/tests/netsecpolicy/Android.mk b/tests/netsecpolicy/Android.mk
new file mode 100644
index 0000000..137672e
--- /dev/null
+++ b/tests/netsecpolicy/Android.mk
@@ -0,0 +1,17 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/netsecpolicy/usescleartexttraffic-false/Android.mk b/tests/netsecpolicy/usescleartexttraffic-false/Android.mk
new file mode 100644
index 0000000..1af3b49
--- /dev/null
+++ b/tests/netsecpolicy/usescleartexttraffic-false/Android.mk
@@ -0,0 +1,30 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, \
+    ../usescleartexttraffic-shared/src)
+
+LOCAL_PACKAGE_NAME := CtsNetSecPolicyUsesCleartextTrafficFalse
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/netsecpolicy/usescleartexttraffic-false/AndroidManifest.xml b/tests/netsecpolicy/usescleartexttraffic-false/AndroidManifest.xml
new file mode 100644
index 0000000..013821e
--- /dev/null
+++ b/tests/netsecpolicy/usescleartexttraffic-false/AndroidManifest.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="android.netsecpolicy.usescleartext.false.cts">
+    <uses-permission android:name="android.permission.INTERNET"/>
+    <application android:usesCleartextTraffic="false">
+    </application>
+</manifest>
diff --git a/tests/netsecpolicy/usescleartexttraffic-shared/src/Dummy.java b/tests/netsecpolicy/usescleartexttraffic-shared/src/Dummy.java
new file mode 100644
index 0000000..2705a5f
--- /dev/null
+++ b/tests/netsecpolicy/usescleartexttraffic-shared/src/Dummy.java
@@ -0,0 +1,2 @@
+public class Dummy {
+}
diff --git a/tests/netsecpolicy/usescleartexttraffic-true/Android.mk b/tests/netsecpolicy/usescleartexttraffic-true/Android.mk
new file mode 100644
index 0000000..5effc57
--- /dev/null
+++ b/tests/netsecpolicy/usescleartexttraffic-true/Android.mk
@@ -0,0 +1,30 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, \
+    ../usescleartexttraffic-shared/src)
+
+LOCAL_PACKAGE_NAME := CtsNetSecPolicyUsesCleartextTrafficTrue
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/netsecpolicy/usescleartexttraffic-true/AndroidManifest.xml b/tests/netsecpolicy/usescleartexttraffic-true/AndroidManifest.xml
new file mode 100644
index 0000000..f50295e
--- /dev/null
+++ b/tests/netsecpolicy/usescleartexttraffic-true/AndroidManifest.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="android.netsecpolicy.usescleartext.true.cts">
+    <uses-permission android:name="android.permission.INTERNET"/>
+    <uses-library android:name="org.apache.http.legacy"/>
+
+    <application android:usesCleartextTraffic="true">
+    </application>
+</manifest>
diff --git a/tests/netsecpolicy/usescleartexttraffic-unspecified/Android.mk b/tests/netsecpolicy/usescleartexttraffic-unspecified/Android.mk
new file mode 100644
index 0000000..685a16f
--- /dev/null
+++ b/tests/netsecpolicy/usescleartexttraffic-unspecified/Android.mk
@@ -0,0 +1,30 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, \
+    ../usescleartexttraffic-shared/src)
+
+LOCAL_PACKAGE_NAME := CtsNetSecPolicyUsesCleartextTrafficUnspecified
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/netsecpolicy/usescleartexttraffic-unspecified/AndroidManifest.xml b/tests/netsecpolicy/usescleartexttraffic-unspecified/AndroidManifest.xml
new file mode 100644
index 0000000..7e735c7
--- /dev/null
+++ b/tests/netsecpolicy/usescleartexttraffic-unspecified/AndroidManifest.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="android.netsecpolicy.usescleartext.unspecified.cts">
+     <uses-permission android:name="android.permission.INTERNET"/>
+    <application>
+    </application>
+</manifest>
diff --git a/tests/print/Android.mk b/tests/print/Android.mk
deleted file mode 100644
index fea7dc0..0000000
--- a/tests/print/Android.mk
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright (C) 2014 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.
-
-LOCAL_PATH:= $(call my-dir)
-
-##################################################
-# Build the print instrument library
-##################################################
-include $(CLEAR_VARS)
-LOCAL_MODULE := CtsPrintInstrument
-LOCAL_SRC_FILES := $(call all-subdir-java-files) \
-    src/android/print/cts/IPrivilegedOperations.aidl
-LOCAL_MODULE_TAGS := optional
-LOCAL_DEX_PREOPT := false
-
-include $(BUILD_JAVA_LIBRARY)
-
-# Copy the shell script to run the print instrument Jar to the CTS out folder.
-$(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).jar : $(LOCAL_BUILT_MODULE) | $(ACP) 
-	$(copy-file-to-target)
-
-# Copy the built print instrument library Jar to the CTS out folder.
-$(CTS_TESTCASES_OUT)/print-instrument : $(LOCAL_PATH)/print-instrument | $(ACP)
-	$(copy-file-to-target)
-
diff --git a/tests/print/print-instrument b/tests/print/print-instrument
deleted file mode 100755
index a79cb8a..0000000
--- a/tests/print/print-instrument
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright (C) 2014 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.
-
-# Script to start "print-instrument" on the device
-#
-# The script sets up an alternative dalvik cache when running as
-# non-root. Jar files needs to be dexopt'd to run in Dalvik. For
-# plain jar files, this is done at first use. shell user does not
-# have write permission to default system Dalvik cache so we
-# redirect to an alternative cache.
-
-RUN_BASE=/data/local/tmp
-
-# If not running as root, use an alternative dex cache.
-if [ ${USER_ID} -ne 0 ]; then
-  tmp_cache=${RUN_BASE}/dalvik-cache
-  if [ ! -d ${tmp_cache} ]; then
-    mkdir -p ${tmp_cache}
-  fi
-  export ANDROID_DATA=${RUN_BASE}
-fi
-
-# Run print-instrument.
-export CLASSPATH=${RUN_BASE}/CtsPrintInstrument.jar
-
-exec app_process ${RUN_BASE} android.print.cts.PrintInstrument ${@}
diff --git a/tests/print/src/android/print/cts/IPrivilegedOperations.aidl b/tests/print/src/android/print/cts/IPrivilegedOperations.aidl
deleted file mode 100644
index 93c8c3e..0000000
--- a/tests/print/src/android/print/cts/IPrivilegedOperations.aidl
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2014 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.print.cts;
-
-interface IPrivilegedOperations {
-    boolean clearApplicationUserData(String packageName);
-}
diff --git a/tests/print/src/android/print/cts/PrintInstrument.java b/tests/print/src/android/print/cts/PrintInstrument.java
deleted file mode 100644
index 1c568a1..0000000
--- a/tests/print/src/android/print/cts/PrintInstrument.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * Copyright (C) 2014 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.print.cts;
-
-import android.app.ActivityManagerNative;
-import android.app.IActivityManager;
-import android.app.IInstrumentationWatcher;
-import android.app.Instrumentation;
-import android.app.UiAutomationConnection;
-import android.content.ComponentName;
-import android.content.pm.IPackageDataObserver;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.UserHandle;
-import android.util.AndroidException;
-import android.view.IWindowManager;
-
-import com.android.internal.os.BaseCommand;
-
-import java.io.PrintStream;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-public final class PrintInstrument extends BaseCommand {
-
-    private static final String ARG_PRIVILEGED_OPS = "ARG_PRIVILEGED_OPS";
-
-    private IActivityManager mAm;
-
-    public static void main(String[] args) {
-        PrintInstrument instrumenter = new PrintInstrument();
-        instrumenter.run(args);
-    }
-
-    @Override
-    public void onRun() throws Exception {
-        mAm = ActivityManagerNative.getDefault();
-        if (mAm == null) {
-            System.err.println(NO_SYSTEM_ERROR_CODE);
-            throw new AndroidException("Can't connect to activity manager;"
-                    + " is the system running?");
-        }
-
-        String op = nextArgRequired();
-
-        if (op.equals("instrument")) {
-            runInstrument();
-        } else {
-            showError("Error: unknown command '" + op + "'");
-        }
-    }
-
-    @Override
-    public void onShowUsage(PrintStream out) {
-        /* do nothing */
-    }
-
-    @SuppressWarnings("deprecation")
-    private void runInstrument() throws Exception {
-        String profileFile = null;
-        boolean wait = false;
-        boolean rawMode = false;
-        boolean no_window_animation = false;
-        int userId = UserHandle.USER_CURRENT;
-        Bundle args = new Bundle();
-        String argKey = null, argValue = null;
-        IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
-
-        String opt;
-        while ((opt=nextOption()) != null) {
-            if (opt.equals("-p")) {
-                profileFile = nextArgRequired();
-            } else if (opt.equals("-w")) {
-                wait = true;
-            } else if (opt.equals("-r")) {
-                rawMode = true;
-            } else if (opt.equals("-e")) {
-                argKey = nextArgRequired();
-                argValue = nextArgRequired();
-                args.putString(argKey, argValue);
-            } else if (opt.equals("--no_window_animation")
-                    || opt.equals("--no-window-animation")) {
-                no_window_animation = true;
-            } else if (opt.equals("--user")) {
-                userId = parseUserArg(nextArgRequired());
-            } else {
-                System.err.println("Error: Unknown option: " + opt);
-                return;
-            }
-        }
-
-        if (userId == UserHandle.USER_ALL) {
-            System.err.println("Error: Can't start instrumentation with user 'all'");
-            return;
-        }
-
-        String cnArg = nextArgRequired();
-        ComponentName cn = ComponentName.unflattenFromString(cnArg);
-        if (cn == null) throw new IllegalArgumentException("Bad component name: " + cnArg);
-
-        InstrumentationWatcher watcher = null;
-        UiAutomationConnection connection = null;
-        if (wait) {
-            watcher = new InstrumentationWatcher();
-            watcher.setRawOutput(rawMode);
-            connection = new UiAutomationConnection();
-        }
-
-        float[] oldAnims = null;
-        if (no_window_animation) {
-            oldAnims = wm.getAnimationScales();
-            wm.setAnimationScale(0, 0.0f);
-            wm.setAnimationScale(1, 0.0f);
-        }
-
-        args.putIBinder(ARG_PRIVILEGED_OPS, new PrivilegedOperations(mAm));
-
-        if (!mAm.startInstrumentation(cn, profileFile, 0, args, watcher, connection, userId, null)) {
-            throw new AndroidException("INSTRUMENTATION_FAILED: " + cn.flattenToString());
-        }
-
-        if (watcher != null) {
-            if (!watcher.waitForFinish()) {
-                System.out.println("INSTRUMENTATION_ABORTED: System has crashed.");
-            }
-        }
-
-        if (oldAnims != null) {
-            wm.setAnimationScales(oldAnims);
-        }
-    }
-
-    private int parseUserArg(String arg) {
-        int userId;
-        if ("all".equals(arg)) {
-            userId = UserHandle.USER_ALL;
-        } else if ("current".equals(arg) || "cur".equals(arg)) {
-            userId = UserHandle.USER_CURRENT;
-        } else {
-            userId = Integer.parseInt(arg);
-        }
-        return userId;
-    }
-
-    private class InstrumentationWatcher extends IInstrumentationWatcher.Stub {
-        private boolean mFinished = false;
-        private boolean mRawMode = false;
-
-        /**
-         * Set or reset "raw mode".  In "raw mode", all bundles are dumped.  In "pretty mode",
-         * if a bundle includes Instrumentation.REPORT_KEY_STREAMRESULT, just print that.
-         * @param rawMode true for raw mode, false for pretty mode.
-         */
-        public void setRawOutput(boolean rawMode) {
-            mRawMode = rawMode;
-        }
-
-        @Override
-        public void instrumentationStatus(ComponentName name, int resultCode, Bundle results) {
-            synchronized (this) {
-                // pretty printer mode?
-                String pretty = null;
-                if (!mRawMode && results != null) {
-                    pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT);
-                }
-                if (pretty != null) {
-                    System.out.print(pretty);
-                } else {
-                    if (results != null) {
-                        for (String key : results.keySet()) {
-                            System.out.println(
-                                    "INSTRUMENTATION_STATUS: " + key + "=" + results.get(key));
-                        }
-                    }
-                    System.out.println("INSTRUMENTATION_STATUS_CODE: " + resultCode);
-                }
-                notifyAll();
-            }
-        }
-
-        @Override
-        public void instrumentationFinished(ComponentName name, int resultCode,
-                Bundle results) {
-            synchronized (this) {
-                // pretty printer mode?
-                String pretty = null;
-                if (!mRawMode && results != null) {
-                    pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT);
-                }
-                if (pretty != null) {
-                    System.out.println(pretty);
-                } else {
-                    if (results != null) {
-                        for (String key : results.keySet()) {
-                            System.out.println(
-                                    "INSTRUMENTATION_RESULT: " + key + "=" + results.get(key));
-                        }
-                    }
-                    System.out.println("INSTRUMENTATION_CODE: " + resultCode);
-                }
-                mFinished = true;
-                notifyAll();
-            }
-        }
-
-        public boolean waitForFinish() {
-            synchronized (this) {
-                while (!mFinished) {
-                    try {
-                        if (!mAm.asBinder().pingBinder()) {
-                            return false;
-                        }
-                        wait(1000);
-                    } catch (InterruptedException e) {
-                        throw new IllegalStateException(e);
-                    }
-                }
-            }
-            return true;
-        }
-    }
-
-    private static final class PrivilegedOperations extends IPrivilegedOperations.Stub {
-        private final IActivityManager mAm;
-
-        public PrivilegedOperations(IActivityManager am) {
-            mAm = am;
-        }
-
-        @Override
-        public boolean clearApplicationUserData(final String clearedPackageName)
-                throws RemoteException {
-            final long identity = Binder.clearCallingIdentity();
-            try {
-                final AtomicBoolean success = new AtomicBoolean();
-                final CountDownLatch completionLatch = new CountDownLatch(1);
-
-                mAm.clearApplicationUserData(clearedPackageName,
-                        new IPackageDataObserver.Stub() {
-                            @Override
-                            public void onRemoveCompleted(String packageName, boolean succeeded) {
-                                if (clearedPackageName.equals(packageName) && succeeded) {
-                                    success.set(true);
-                                } else {
-                                    success.set(false);
-                                }
-                                completionLatch.countDown();
-                            }
-                }, UserHandle.USER_CURRENT);
-
-                try {
-                    completionLatch.await();
-                } catch (InterruptedException ie) {
-                    /* ignore */
-                }
-
-                return success.get();
-            } finally {
-                Binder.restoreCallingIdentity(identity);
-            }
-        }
-    }
-}
diff --git a/tests/tests/accessibility/Android.mk b/tests/tests/accessibility/Android.mk
index 9f98b16..263c47b 100644
--- a/tests/tests/accessibility/Android.mk
+++ b/tests/tests/accessibility/Android.mk
@@ -26,7 +26,6 @@
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
 
-# This test runner sets up/cleans up the device before/after running the tests.
-LOCAL_CTS_TEST_RUNNER := com.android.cts.tradefed.testtype.AccessibilityTestRunner
+LOCAL_SDK_VERSION := current
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/accessibility/AndroidManifest.xml b/tests/tests/accessibility/AndroidManifest.xml
index 319fb49..b3bcbc8 100644
--- a/tests/tests/accessibility/AndroidManifest.xml
+++ b/tests/tests/accessibility/AndroidManifest.xml
@@ -17,18 +17,19 @@
  -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-        package="android.view.cts.accessibility">
+          package="android.view.cts.accessibility">
 
-  <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
-  <application android:theme="@android:style/Theme.Holo.NoActionBar" >
-      <uses-library android:name="android.test.runner"/>
-  </application>
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
 
-  <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-                   android:targetPackage="android.view.cts.accessibility"
-                   android:label="Tests for the accessibility APIs.">
+    <application android:theme="@android:style/Theme.Holo.NoActionBar" >
+        <uses-library android:name="android.test.runner"/>
+    </application>
+
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="android.view.cts.accessibility"
+                     android:label="Tests for the accessibility APIs.">
         <meta-data android:name="listener"
-            android:value="com.android.cts.runner.CtsTestRunListener" />
+                   android:value="com.android.cts.runner.CtsTestRunListener" />
     </instrumentation>
 
 </manifest>
diff --git a/tests/tests/accessibility/AndroidTest.xml b/tests/tests/accessibility/AndroidTest.xml
new file mode 100644
index 0000000..7832508
--- /dev/null
+++ b/tests/tests/accessibility/AndroidTest.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="Base config for CTS package preparer">
+    <include name="common-config" />
+    <option name="run-command:run-command" value="settings put secure enabled_accessibility_services android.view.accessibility.services/.SpeakingAccessibilityService:android.view.accessibility.services/.VibratingAccessibilityService" />
+    <option name="run-command:run-command" value="settings put secure touch_exploration_granted_accessibility_services android.view.accessibility.services/.SpeakingAccessibilityService:android.view.accessibility.services/.VibratingAccessibilityService" />
+    <option name="run-command:run-command" value="settings put secure accessibility_enabled 1" />
+    <option name="run-command:teardown-command" value="settings put secure enabled_accessibility_services &quot;&quot;" />
+    <option name="run-command:teardown-command" value="settings put secure touch_exploration_granted_accessibility_services &quot;&quot;" />
+    <option name="run-command:teardown-command" value="settings put secure accessibility_enabled 0" />
+    <option name="cts-apk-installer:test-file-name" value="CtsSomeAccessibilityServices.apk" />
+</configuration>
diff --git a/tests/tests/accessibility/src/android/view/accessibility/cts/AccessibilityEventTest.java b/tests/tests/accessibility/src/android/view/accessibility/cts/AccessibilityEventTest.java
index 8be2b99..db4e54b 100644
--- a/tests/tests/accessibility/src/android/view/accessibility/cts/AccessibilityEventTest.java
+++ b/tests/tests/accessibility/src/android/view/accessibility/cts/AccessibilityEventTest.java
@@ -113,6 +113,8 @@
                 AccessibilityEvent.TYPE_VIEW_HOVER_EXIT));
         assertEquals("TYPE_VIEW_LONG_CLICKED", AccessibilityEvent.eventTypeToString(
                 AccessibilityEvent.TYPE_VIEW_LONG_CLICKED));
+        assertEquals("TYPE_VIEW_CONTEXT_CLICKED", AccessibilityEvent.eventTypeToString(
+                AccessibilityEvent.TYPE_VIEW_CONTEXT_CLICKED));
         assertEquals("TYPE_VIEW_SCROLLED", AccessibilityEvent.eventTypeToString(
                 AccessibilityEvent.TYPE_VIEW_SCROLLED));
         assertEquals("TYPE_VIEW_SELECTED", AccessibilityEvent.eventTypeToString(
diff --git a/tests/tests/accessibility/src/android/view/accessibility/cts/AccessibilityNodeInfoTest.java b/tests/tests/accessibility/src/android/view/accessibility/cts/AccessibilityNodeInfoTest.java
index f5e1d48..506c022 100644
--- a/tests/tests/accessibility/src/android/view/accessibility/cts/AccessibilityNodeInfoTest.java
+++ b/tests/tests/accessibility/src/android/view/accessibility/cts/AccessibilityNodeInfoTest.java
@@ -185,6 +185,7 @@
         info.setFocusable(true);
         info.setFocused(true);
         info.setLongClickable(true);
+        info.setContextClickable(true);
         info.setPassword(true);
         info.setScrollable(true);
         info.setSelected(true);
@@ -235,6 +236,8 @@
                 receivedInfo.isFocused());
         assertSame("longClickable has incorrect value", expectedInfo.isLongClickable(),
                 receivedInfo.isLongClickable());
+        assertSame("contextClickable has incorrect value", expectedInfo.isContextClickable(),
+                receivedInfo.isContextClickable());
         assertSame("password has incorrect value", expectedInfo.isPassword(),
                 receivedInfo.isPassword());
         assertSame("scrollable has incorrect value", expectedInfo.isScrollable(),
@@ -281,6 +284,7 @@
         assertFalse("focusable not properly recycled", info.isFocusable());
         assertFalse("focused not properly recycled", info.isFocused());
         assertFalse("longClickable not properly recycled", info.isLongClickable());
+        assertFalse("contextClickable not properly recycled", info.isContextClickable());
         assertFalse("password not properly recycled", info.isPassword());
         assertFalse("scrollable not properly recycled", info.isScrollable());
         assertFalse("selected not properly recycled", info.isSelected());
diff --git a/tests/tests/accessibility/src/android/view/accessibility/cts/CaptioningManagerTest.java b/tests/tests/accessibility/src/android/view/accessibility/cts/CaptioningManagerTest.java
new file mode 100644
index 0000000..53eb215
--- /dev/null
+++ b/tests/tests/accessibility/src/android/view/accessibility/cts/CaptioningManagerTest.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2015 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.view.accessibility.cts;
+
+import android.app.UiAutomation;
+import android.os.ParcelFileDescriptor;
+import android.test.InstrumentationTestCase;
+import android.view.accessibility.CaptioningManager;
+import android.view.accessibility.CaptioningManager.CaptionStyle;
+import android.view.accessibility.CaptioningManager.CaptioningChangeListener;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Locale;
+
+/**
+ * Tests whether the CaptioningManager APIs are functional.
+ */
+public class CaptioningManagerTest extends InstrumentationTestCase {
+    private CaptioningManager mManager;
+    private UiAutomation mUiAutomation;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        mManager = getInstrumentation().getTargetContext().getSystemService(
+                CaptioningManager.class);
+
+        assertNotNull("Obtained captioning manager", mManager);
+
+        mUiAutomation = getInstrumentation().getUiAutomation();
+    }
+
+    /**
+     * Tests whether a client can observe changes in caption properties.
+     */
+    public void testChangeListener() {
+        putSecureSetting("accessibility_captioning_enabled","0");
+        putSecureSetting("accessibility_captioning_preset", "1");
+        putSecureSetting("accessibility_captioning_locale", "en_US");
+        putSecureSetting("accessibility_captioning_font_scale", "1.0");
+
+        MockCaptioningChangeListener listener = new MockCaptioningChangeListener();
+        mManager.addCaptioningChangeListener(listener);
+
+        putSecureSetting("accessibility_captioning_enabled", "1");
+        assertTrue("Observed enabled change", listener.wasEnabledChangedCalled);
+
+        putSecureSetting("accessibility_captioning_preset", "-1");
+        assertTrue("Observed user style change", listener.wasUserStyleChangedCalled);
+
+        putSecureSetting("accessibility_captioning_locale", "ja_JP");
+        assertTrue("Observed locale change", listener.wasLocaleChangedCalled);
+
+        putSecureSetting("accessibility_captioning_font_scale", "2.0");
+        assertTrue("Observed font scale change", listener.wasFontScaleChangedCalled);
+
+        mManager.removeCaptioningChangeListener(listener);
+
+        listener.reset();
+
+        putSecureSetting("accessibility_captioning_enabled","0");
+        assertFalse("Did not observe enabled change", listener.wasEnabledChangedCalled);
+
+        try {
+            mManager.removeCaptioningChangeListener(listener);
+        } catch (Exception e) {
+            throw new AssertionError("Fails silently when removing listener twice", e);
+        }
+    }
+
+    public void testProperties() {
+        putSecureSetting("accessibility_captioning_font_scale", "2.0");
+        putSecureSetting("accessibility_captioning_locale", "ja_JP");
+        putSecureSetting("accessibility_captioning_enabled", "1");
+
+        assertEquals("Test runner set font scale to 2.0", 2.0f, mManager.getFontScale());
+        assertEquals("Test runner set locale to Japanese", Locale.JAPAN, mManager.getLocale());
+        assertEquals("Test runner set enabled to true", true, mManager.isEnabled());
+    }
+
+    public void testUserStyle() {
+        putSecureSetting("accessibility_captioning_preset", "-1");
+        putSecureSetting("accessibility_captioning_foreground_color", "511");
+        putSecureSetting("accessibility_captioning_background_color", "511");
+        putSecureSetting("accessibility_captioning_window_color", "511");
+        putSecureSetting("accessibility_captioning_edge_color", "511");
+        putSecureSetting("accessibility_captioning_edge_type", "-1");
+        deleteSecureSetting("accessibility_captioning_typeface");
+
+        CaptionStyle userStyle = mManager.getUserStyle();
+        assertNotNull("Default user style is not null", userStyle);
+        assertFalse("Default user style has no edge type", userStyle.hasEdgeType());
+        assertFalse("Default user style has no edge color", userStyle.hasEdgeColor());
+        assertFalse("Default user style has no foreground color", userStyle.hasForegroundColor());
+        assertFalse("Default user style has no background color", userStyle.hasBackgroundColor());
+        assertFalse("Default user style has no window color", userStyle.hasWindowColor());
+        assertNull("Default user style has no typeface", userStyle.getTypeface());
+    }
+
+    private void deleteSecureSetting(String name) {
+        execShellCommand("settings delete secure " + name);
+    }
+
+    private void putSecureSetting(String name, String value) {
+        execShellCommand("settings put secure " + name + " " + value);
+    }
+
+    private void execShellCommand(String cmd) {
+        ParcelFileDescriptor pfd = mUiAutomation.executeShellCommand(cmd);
+        InputStream is = new FileInputStream(pfd.getFileDescriptor());
+        try {
+            final byte[] buffer = new byte[8192];
+            while ((is.read(buffer)) != -1);
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to exec: " + cmd);
+        }
+    }
+
+    private static class MockCaptioningChangeListener extends CaptioningChangeListener {
+        boolean wasEnabledChangedCalled = false;
+        boolean wasUserStyleChangedCalled = false;
+        boolean wasLocaleChangedCalled = false;
+        boolean wasFontScaleChangedCalled = false;
+
+        @Override
+        public void onEnabledChanged(boolean enabled) {
+            super.onEnabledChanged(enabled);
+            wasEnabledChangedCalled = true;
+        }
+
+        @Override
+        public void onUserStyleChanged(CaptionStyle userStyle) {
+            super.onUserStyleChanged(userStyle);
+            wasUserStyleChangedCalled = true;
+        }
+
+        @Override
+        public void onLocaleChanged(Locale locale) {
+            super.onLocaleChanged(locale);
+            wasLocaleChangedCalled = true;
+        }
+
+        @Override
+        public void onFontScaleChanged(float fontScale) {
+            super.onFontScaleChanged(fontScale);
+            wasFontScaleChangedCalled = true;
+        }
+
+        public void reset() {
+            wasEnabledChangedCalled = false;
+            wasUserStyleChangedCalled = false;
+            wasLocaleChangedCalled = false;
+            wasFontScaleChangedCalled = false;
+        }
+    }
+}
diff --git a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityEndToEndTest.java b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityEndToEndTest.java
index b11248a..71bf6cf 100644
--- a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityEndToEndTest.java
+++ b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityEndToEndTest.java
@@ -313,12 +313,14 @@
 
         // create the notification to send
         final int notificationId = 1;
-        final Notification notification = new Notification();
-        notification.icon = android.R.drawable.stat_notify_call_mute;
-        notification.contentIntent = PendingIntent.getActivity(getActivity(), 0, new Intent(),
-                PendingIntent.FLAG_CANCEL_CURRENT);
-        notification.tickerText = message;
-        notification.setLatestEventInfo(getActivity(), "", "", notification.contentIntent);
+        final Notification notification = new Notification.Builder(getActivity())
+                .setSmallIcon(android.R.drawable.stat_notify_call_mute)
+                .setContentIntent(PendingIntent.getActivity(getActivity(), 0, new Intent(),
+                        PendingIntent.FLAG_CANCEL_CURRENT))
+                .setTicker(message)
+                .setContentTitle("")
+                .setContentText("")
+                .build();
 
         // create and populate the expected event
         final AccessibilityEvent expected = AccessibilityEvent.obtain();
diff --git a/tests/tests/accounts/Android.mk b/tests/tests/accounts/Android.mk
index 1579822..6ed35c6 100644
--- a/tests/tests/accounts/Android.mk
+++ b/tests/tests/accounts/Android.mk
@@ -21,7 +21,7 @@
 # and when built explicitly put it in the data partition
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := CtsAccountTestsCommon ctstestrunner
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
@@ -30,3 +30,4 @@
 LOCAL_SDK_VERSION := current
 
 include $(BUILD_CTS_PACKAGE)
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/tests/accounts/AndroidManifest.xml b/tests/tests/accounts/AndroidManifest.xml
index c671ff0..d882690 100644
--- a/tests/tests/accounts/AndroidManifest.xml
+++ b/tests/tests/accounts/AndroidManifest.xml
@@ -18,11 +18,9 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="android.accounts.cts">
 
-    <!-- Used for AccountManagerService test, don't delete this permission -->
-    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
-    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
-    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
-    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
+    <!-- Don't need GET_ACCOUNTS because share a Uid with the relevant
+         authenticators -->
+
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
 
     <application>
@@ -43,10 +41,21 @@
             <intent-filter>
                 <action android:name="android.accounts.AccountAuthenticator" />
             </intent-filter>
-
             <meta-data android:name="android.accounts.AccountAuthenticator"
                        android:resource="@xml/authenticator" />
         </service>
+
+        <service android:name="MockCustomTokenAccountService" android:exported="true"
+                 android:process="android.accounts.cts">
+            <intent-filter>
+                <action android:name="android.accounts.AccountAuthenticator" />
+            </intent-filter>
+            <meta-data android:name="android.accounts.AccountAuthenticator"
+                       android:resource="@xml/custom_token_authenticator" />
+            <meta-data android:name="android.accounts.AccountAuthenticator.customTokens"
+                       android:value="1" />
+
+        </service>
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/tests/tests/accounts/AndroidTest.xml b/tests/tests/accounts/AndroidTest.xml
new file mode 100644
index 0000000..3e29c9c
--- /dev/null
+++ b/tests/tests/accounts/AndroidTest.xml
@@ -0,0 +1,18 @@
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="Test module config for Account apis">
+    <include name="common-config" />
+    <option name="cts-apk-installer:test-file-name" value="CtsUnaffiliatedAccountAuthenticators.apk" />
+</configuration>
diff --git a/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/Android.mk b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/Android.mk
new file mode 100644
index 0000000..cb504da
--- /dev/null
+++ b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/Android.mk
@@ -0,0 +1,42 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# LOCAL_MODULE_TAGS := tests
+
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_STATIC_JAVA_LIBRARIES := \
+        ctstestrunner \
+	CtsAccountTestsCommon
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/res
+
+LOCAL_PACKAGE_NAME := CtsUnaffiliatedAccountAuthenticators
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey2
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/AndroidManifest.xml b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/AndroidManifest.xml
new file mode 100644
index 0000000..c32f89f
--- /dev/null
+++ b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/AndroidManifest.xml
@@ -0,0 +1,56 @@
+<?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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.accounts.cts.unaffiliated">
+
+    <!-- Used for AccountManagerService test, don't delete this permission -->
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+
+    <application>
+
+        <activity
+                android:name="android.accounts.cts.common.TestAuthenticatorActivity"
+                android:exported="true" />
+
+        <provider
+                android:name="android.accounts.cts.common.AuthenticatorContentProvider"
+                android:authorities="android.accounts.cts.unaffiliated.authenticators.provider"
+                android:exported="true" />
+
+        <service
+                android:name=".StdAccountAuthService"
+                android:exported="false">
+            <intent-filter>
+                <action android:name="android.accounts.AccountAuthenticator" />
+            </intent-filter>
+            <meta-data android:name="android.accounts.AccountAuthenticator"
+                       android:resource="@xml/standard_authenticator" />
+        </service>
+<!--
+        <service android:name=".CustomAccountAuthService" android:exported="false">
+            <intent-filter>
+                <action android:name="android.accounts.AccountAuthenticator" />
+            </intent-filter>
+            <meta-data android:name="android.accounts.AccountAuthenticator"
+                       android:resource="@xml/custom_authenticator" />
+        </service>
+        -->
+
+    </application>
+</manifest>
+
diff --git a/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/drawable/ic_cts_minitab_selected.png b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/drawable/ic_cts_minitab_selected.png
new file mode 100644
index 0000000..c730050
--- /dev/null
+++ b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/drawable/ic_cts_minitab_selected.png
Binary files differ
diff --git a/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/drawable/ic_cts_minitab_selected_custom_account.png b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/drawable/ic_cts_minitab_selected_custom_account.png
new file mode 100644
index 0000000..3fbbc94
--- /dev/null
+++ b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/drawable/ic_cts_minitab_selected_custom_account.png
Binary files differ
diff --git a/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/drawable/ic_cts_selected.png b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/drawable/ic_cts_selected.png
new file mode 100644
index 0000000..72a065c
--- /dev/null
+++ b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/drawable/ic_cts_selected.png
Binary files differ
diff --git a/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/drawable/ic_cts_selected_custom_account.png b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/drawable/ic_cts_selected_custom_account.png
new file mode 100644
index 0000000..70e35c0
--- /dev/null
+++ b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/drawable/ic_cts_selected_custom_account.png
Binary files differ
diff --git a/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/values/strings.xml b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/values/strings.xml
new file mode 100644
index 0000000..442669b
--- /dev/null
+++ b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/values/strings.xml
@@ -0,0 +1,23 @@
+<?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">
+    <!-- Label for this package -->
+    <string name="label">Android CTS - Account</string>
+</resources>
\ No newline at end of file
diff --git a/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/xml/custom_authenticator.xml b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/xml/custom_authenticator.xml
new file mode 100644
index 0000000..3485f76
--- /dev/null
+++ b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/xml/custom_authenticator.xml
@@ -0,0 +1,29 @@
+<?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.
+ */
+-->
+
+<!-- The attributes in this XML file provide configuration information -->
+<!-- for the Account Manager. -->
+
+<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
+    android:accountType="android.accounts.test.custom"
+    android:icon="@drawable/ic_cts_selected_custom_account"
+    android:smallIcon="@drawable/ic_cts_minitab_selected_custom_account"
+    android:customTokens="true"
+    android:label="@string/label"
+/>
diff --git a/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/xml/standard_authenticator.xml b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/xml/standard_authenticator.xml
new file mode 100644
index 0000000..0c843b9
--- /dev/null
+++ b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/res/xml/standard_authenticator.xml
@@ -0,0 +1,28 @@
+<?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.
+ */
+-->
+
+<!-- The attributes in this XML file provide configuration information -->
+<!-- for the Account Manager. -->
+
+<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
+    android:accountType="android.accounts.test.standard.unaffiliated"
+    android:icon="@drawable/ic_cts_selected"
+    android:smallIcon="@drawable/ic_cts_minitab_selected"
+    android:label="@string/label"
+/>
diff --git a/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/src/android/accounts/cts/unaffiliated/StdAccountAuthService.java b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/src/android/accounts/cts/unaffiliated/StdAccountAuthService.java
new file mode 100644
index 0000000..de87ac7
--- /dev/null
+++ b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/src/android/accounts/cts/unaffiliated/StdAccountAuthService.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2015 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.accounts.cts.unaffiliated;
+
+import android.accounts.cts.common.Fixtures;
+import android.accounts.cts.common.TestAccountAuthenticator;
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+
+/**
+ * a basic Mock Service for wrapping the MockAccountAuthenticator
+ */
+public class StdAccountAuthService extends Service {
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        TestAccountAuthenticator auth =
+                new TestAccountAuthenticator(this, Fixtures.TYPE_STANDARD_UNAFFILIATED);
+        return auth.getIBinder();
+    }
+}
diff --git a/tests/tests/accounts/common/Android.mk b/tests/tests/accounts/common/Android.mk
new file mode 100644
index 0000000..cac9c5e
--- /dev/null
+++ b/tests/tests/accounts/common/Android.mk
@@ -0,0 +1,36 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+# Includes all the java files, and explicitly declares any aidl files
+LOCAL_SRC_FILES := \
+    $(call all-java-files-under, src) \
+    $(call all-Iaidl-files-under, src)
+
+LOCAL_AIDL_INCLUDES += $(LOCAL_PATH)/src
+
+LOCAL_MODULE:= CtsAccountTestsCommon
+
+LOCAL_SDK_VERSION := current
+
+# Build the actual static library
+include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/tests/tests/accounts/common/AndroidManifest.xml b/tests/tests/accounts/common/AndroidManifest.xml
new file mode 100644
index 0000000..6e6d107
--- /dev/null
+++ b/tests/tests/accounts/common/AndroidManifest.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.accounts.test.shared">
+    <uses-sdk
+        android:minSdkVersion="4" />
+    <application />
+</manifest>
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/AuthenticatorContentProvider.java b/tests/tests/accounts/common/src/android/accounts/cts/common/AuthenticatorContentProvider.java
new file mode 100644
index 0000000..b52dae3
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/AuthenticatorContentProvider.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2015 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.accounts.cts.common;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AuthenticatorDescription;
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Parcelable;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+public class AuthenticatorContentProvider extends ContentProvider {
+
+    public static final String AUTHORITY =
+            "android.accounts.cts.unaffiliated.authenticators.provider";
+
+    public static final int RESULT_SUCCESS = 1;
+    public static final int RESULT_FAIL = 2;
+
+    public static final String METHOD_GET = "get";
+    public static final String METHOD_SETUP = "setup";
+    public static final String METHOD_TEARDOWN = "setup";
+
+    public static final int ACTION_GET = 1;
+    public static final int ACTION_SETUP = 2;
+    public static final int ACTION_TEARDOWN = 3;
+
+    public static final int ARG_UNAFFILIATED = 10;
+    public static final int ARG_AFFILIATED = 11;
+
+    public static final String KEY_CALLBACK = "callback";
+    public static final String KEY_TX = "tx";
+
+    public static final AtomicReference<Parcelable> sLastTx = new AtomicReference<>();
+
+    public static void setTx(Parcelable tx) {
+        sLastTx.set(tx);
+    }
+
+    @Override
+    // public void handleMessage(Message msg) {
+    public Bundle call(String method, String arg, Bundle extras) {
+        super.call(method, arg, extras);
+        Bundle result = new Bundle();
+        if (METHOD_GET.equals(method)) {
+            result.putParcelable(KEY_TX, sLastTx.get());
+            return result;
+        } else if (METHOD_SETUP.equals(method)) {
+            setup();
+            return result;
+        } else if (METHOD_TEARDOWN.equals(method)) {
+            teardown();
+            return result;
+        } else {
+            throw new IllegalArgumentException("Unrecognized method!");
+        }
+    }
+
+    public void setup() {
+        Context context = getContext();
+        AccountManager am = AccountManager.get(context);
+        AuthenticatorDescription[] authenticators = am.getAuthenticatorTypes();
+        for (AuthenticatorDescription a : authenticators) {
+            /*
+             * Populate relevant test information for authenticators in the
+             * same package as the TestAuthenticatorSupportHandler.
+             */
+            if (a.packageName.equals(context.getPackageName())) {
+                for (String name : Fixtures.getFixtureAccountNames()) {
+                    Account account = new Account(name, a.type);
+                    am.addAccountExplicitly(account, Fixtures.PREFIX_PASSWORD + name, null);
+                }
+            }
+        }
+    }
+
+    public void teardown() {
+        Context context = getContext();
+        AccountManager am = AccountManager.get(context);
+        AuthenticatorDescription[] authenticators = am.getAuthenticatorTypes();
+        for (AuthenticatorDescription a : authenticators) {
+            /*
+             * Populate relevant test information for authenticators in the
+             * same package as the TestAuthenticatorSupportHandler.
+             */
+            if (a.packageName.equals(context.getPackageName())) {
+                Account[] accountsToRemove = am.getAccountsByType(a.type);
+                for (Account account : accountsToRemove) {
+                    am.removeAccountExplicitly(account);
+                }
+            }
+        }
+    }
+
+    @Override
+    public boolean onCreate() {
+        return true;   
+    }
+
+    @Override
+    public Cursor query(
+            Uri uri, 
+            String[] projection,
+            String selection,
+            String[] selectionArgs,
+            String sortOrder) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getType(Uri uri) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Uri insert(Uri uri, ContentValues values) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public int delete(Uri uri, String selection, String[] selectionArgs) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+        throw new UnsupportedOperationException();
+    }
+}
+
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/Fixtures.java b/tests/tests/accounts/common/src/android/accounts/cts/common/Fixtures.java
new file mode 100644
index 0000000..f8636a0
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/Fixtures.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2015 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.accounts.cts.common;
+
+import android.accounts.Account;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Constants shared amongst account hostside tests.
+ */
+public final class Fixtures {
+
+    public static final String TYPE_CUSTOM = "android.accounts.test.custom";
+    public static final String TYPE_STANDARD = "android.accounts.test.standard";
+
+    public static final String TYPE_STANDARD_UNAFFILIATED =
+            "android.accounts.test.standard.unaffiliated";
+
+    public static final String PREFIX_TOKEN = "token:";
+    public static final String PREFIX_PASSWORD = "password:";
+
+    public static final String SUFFIX_NAME_FIXTURE = "fixture.com";
+    public static final String SUFFIX_NAME_TEST = "test.com";
+
+    public static final String PREFIX_NAME_SUCCESS = "success_on_return";
+    public static final String PREFIX_NAME_ERROR = "error";
+    public static final String PREFIX_NAME_INTERVENE = "intervene";
+
+    private static final String[] accountNamePrefixes = new String[] {
+            PREFIX_NAME_SUCCESS,
+            PREFIX_NAME_ERROR,
+            PREFIX_NAME_INTERVENE
+    };
+
+    public static final Account ACCOUNT_UNAFFILIATED_FIXTURE_SUCCESS = new Account(
+            PREFIX_NAME_SUCCESS + "@" + SUFFIX_NAME_FIXTURE,
+            TYPE_STANDARD_UNAFFILIATED);
+
+    public static List<String> getFixtureAccountNames() {
+        List<String> accountNames = new ArrayList<>(accountNamePrefixes.length);
+        for (String prefix : accountNamePrefixes) {
+            accountNames.add(prefix + "@" + SUFFIX_NAME_FIXTURE);
+        }
+        return accountNames;
+    }
+
+    public static final int TEST_SUPPORT_RESULT_SUCCESS = 1;
+    public static final int TEST_SUPPORT_RESULT_FAIL = 2;
+
+    public static final String KEY_ACCOUNT_NAME = "test:account_name";
+
+    public static final String KEY_CALLBACK = "test:callback";
+    public static final String KEY_CALLBACK_REQUIRED = "test:callback_required";
+    public static final String KEY_RESULT = "test:result";
+    public static final String KEY_TOKEN_EXPIRY = "test:token_duration";
+
+    private Fixtures() {}
+}
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/TestAccountAuthenticator.java b/tests/tests/accounts/common/src/android/accounts/cts/common/TestAccountAuthenticator.java
new file mode 100644
index 0000000..1fac1ea
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/TestAccountAuthenticator.java
@@ -0,0 +1,326 @@
+/*
+ * Copyright (C) 2015 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.accounts.cts.common;
+
+import android.accounts.AbstractAccountAuthenticator;
+import android.accounts.Account;
+import android.accounts.AccountAuthenticatorResponse;
+import android.accounts.AccountManager;
+import android.accounts.NetworkErrorException;
+import android.accounts.cts.common.tx.AddAccountTx;
+import android.accounts.cts.common.tx.ConfirmCredentialsTx;
+import android.accounts.cts.common.tx.GetAuthTokenLabelTx;
+import android.accounts.cts.common.tx.GetAuthTokenTx;
+import android.accounts.cts.common.tx.HasFeaturesTx;
+import android.accounts.cts.common.tx.UpdateCredentialsTx;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import java.util.Arrays;
+
+public class TestAccountAuthenticator extends AbstractAccountAuthenticator {
+
+    private final String mAccountType;
+    private final Context mContext;
+    private volatile int mCounter = 0;
+
+    public TestAccountAuthenticator(Context context, String accountType) {
+        super(context);
+        mContext = context;
+        mAccountType = accountType;
+    }
+
+    @Override
+    public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
+        throw new UnsupportedOperationException(
+                "editProperties should be tested using the MockAuthenticator");
+    }
+
+    @Override
+    public Bundle addAccount(
+            AccountAuthenticatorResponse response,
+            String accountType,
+            String authTokenType,
+            String[] requiredFeatures,
+            Bundle options) throws NetworkErrorException {
+        if (!mAccountType.equals(accountType)) {
+            throw new IllegalArgumentException("Request to the wrong authenticator!");
+        }
+        String accountName = null;
+        boolean isCallbackRequired = false;
+        if (options != null) {
+            accountName = options.getString(Fixtures.KEY_ACCOUNT_NAME);
+            isCallbackRequired = options.getBoolean(Fixtures.KEY_CALLBACK_REQUIRED, false);
+        }
+        Bundle result = new Bundle();
+        AuthenticatorContentProvider.setTx(
+                new AddAccountTx(accountType, authTokenType, requiredFeatures, options, result));
+        if (accountName.startsWith(Fixtures.PREFIX_NAME_SUCCESS)) {
+            // fill bundle with a success result.
+            result.putString(AccountManager.KEY_ACCOUNT_NAME, accountName);
+            result.putString(AccountManager.KEY_ACCOUNT_TYPE, mAccountType);
+        } else if (accountName.startsWith(Fixtures.PREFIX_NAME_INTERVENE)) {
+            // Specify data to be returned by the eventual activity.
+            Intent eventualActivityResultData = new Intent();
+            eventualActivityResultData.putExtra(AccountManager.KEY_ACCOUNT_NAME, accountName);
+            eventualActivityResultData.putExtra(AccountManager.KEY_ACCOUNT_TYPE, accountType);
+            // Fill result with Intent.
+            Intent intent = new Intent(mContext, TestAuthenticatorActivity.class);
+            intent.putExtra(Fixtures.KEY_RESULT, eventualActivityResultData);
+            intent.putExtra(Fixtures.KEY_CALLBACK, response);
+
+            result.putParcelable(AccountManager.KEY_INTENT, intent);
+        } else {
+            // fill with error
+            int errorCode = AccountManager.ERROR_CODE_INVALID_RESPONSE;
+            String errorMsg = "Default Error Message";
+            if (options != null) {
+                errorCode = options.getInt(AccountManager.KEY_ERROR_CODE);
+                errorMsg = options.getString(AccountManager.KEY_ERROR_MESSAGE);
+            }
+            result.putInt(AccountManager.KEY_ERROR_CODE, errorCode);
+            result.putString(AccountManager.KEY_ERROR_MESSAGE, errorMsg);
+        }
+
+        try {
+            return (isCallbackRequired) ? null : result;
+        } finally {
+            if (isCallbackRequired) {
+                response.onResult(result);
+            }
+        }
+    }
+
+    @Override
+    public Bundle confirmCredentials(
+            AccountAuthenticatorResponse response,
+            Account account,
+            Bundle options) throws NetworkErrorException {
+        if (!mAccountType.equals(account.type)) {
+            throw new IllegalArgumentException("Request to the wrong authenticator!");
+        }
+        Bundle result = new Bundle();
+        AuthenticatorContentProvider.setTx(
+                new ConfirmCredentialsTx(account, options, result));
+
+        boolean isCallbackRequired =
+                options != null && options.getBoolean(Fixtures.KEY_CALLBACK_REQUIRED);
+        if (account.name.startsWith(Fixtures.PREFIX_NAME_SUCCESS)) {
+            // fill bundle with a success result.
+            result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true);
+            result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
+            result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
+        } else if (account.name.startsWith(Fixtures.PREFIX_NAME_INTERVENE)) {
+            // Specify data to be returned by the eventual activity.
+            Intent eventualActivityResultData = new Intent();
+            eventualActivityResultData.putExtra(AccountManager.KEY_BOOLEAN_RESULT, true);
+            eventualActivityResultData.putExtra(AccountManager.KEY_ACCOUNT_NAME, account.name);
+            eventualActivityResultData.putExtra(AccountManager.KEY_ACCOUNT_TYPE, account.type);
+
+            // Fill result with Intent.
+            Intent intent = new Intent(mContext, TestAuthenticatorActivity.class);
+            intent.putExtra(Fixtures.KEY_RESULT, eventualActivityResultData);
+            intent.putExtra(Fixtures.KEY_CALLBACK, response);
+
+            result.putParcelable(AccountManager.KEY_INTENT, intent);
+        } else {
+            // fill with error
+            // fill with error
+            int errorCode = AccountManager.ERROR_CODE_INVALID_RESPONSE;
+            String errorMsg = "Default Error Message";
+            if (options != null) {
+                errorCode = options.getInt(AccountManager.KEY_ERROR_CODE);
+                errorMsg = options.getString(AccountManager.KEY_ERROR_MESSAGE);
+            }
+            result.putInt(AccountManager.KEY_ERROR_CODE, errorCode);
+            result.putString(AccountManager.KEY_ERROR_MESSAGE, errorMsg);
+        }
+
+        try {
+            return (isCallbackRequired) ? null : result;
+        } finally {
+            if (isCallbackRequired) {
+                response.onResult(result);
+            }
+        }
+    }
+
+    @Override
+    public Bundle getAuthToken(
+            AccountAuthenticatorResponse response,
+            Account account,
+            String authTokenType,
+            Bundle options) throws NetworkErrorException {
+        if (!mAccountType.equals(account.type)) {
+            throw new IllegalArgumentException("Request to the wrong authenticator!");
+        }
+        Bundle result = new Bundle();
+        AuthenticatorContentProvider.setTx(
+                new GetAuthTokenTx(account, authTokenType, options, result));
+        boolean isCallbackRequired =
+                options != null && options.getBoolean(Fixtures.KEY_CALLBACK_REQUIRED);
+        long expiryMillis = (options == null) ? 0 : options.getLong(Fixtures.KEY_TOKEN_EXPIRY);
+        if (account.name.startsWith(Fixtures.PREFIX_NAME_SUCCESS)) {
+            // fill bundle with a success result.
+            result.putString(
+                    AccountManager.KEY_AUTHTOKEN, Fixtures.PREFIX_TOKEN + mCounter++);
+            result.putLong(
+                    AbstractAccountAuthenticator.KEY_CUSTOM_TOKEN_EXPIRY,
+                    expiryMillis);
+            result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
+            result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
+        } else if (account.name.startsWith(Fixtures.PREFIX_NAME_INTERVENE)) {
+            // Specify data to be returned by the eventual activity.
+            Intent eventualActivityResultData = new Intent();
+            eventualActivityResultData.putExtra(
+                    AccountManager.KEY_AUTHTOKEN, Fixtures.PREFIX_TOKEN + mCounter++);
+            eventualActivityResultData.putExtra(
+                    AbstractAccountAuthenticator.KEY_CUSTOM_TOKEN_EXPIRY,
+                    expiryMillis);
+            eventualActivityResultData.putExtra(AccountManager.KEY_ACCOUNT_NAME, account.name);
+            eventualActivityResultData.putExtra(AccountManager.KEY_ACCOUNT_TYPE, account.type);
+
+            // Fill result with Intent.
+            Intent intent = new Intent(mContext, TestAuthenticatorActivity.class);
+            intent.putExtra(Fixtures.KEY_RESULT, eventualActivityResultData);
+            intent.putExtra(Fixtures.KEY_CALLBACK, response);
+
+            result.putParcelable(AccountManager.KEY_INTENT, intent);
+
+        } else {
+            // fill with error
+            int errorCode = AccountManager.ERROR_CODE_INVALID_RESPONSE;
+            String errorMsg = "Default Error Message";
+            if (options != null) {
+                errorCode = options.getInt(AccountManager.KEY_ERROR_CODE);
+                errorMsg = options.getString(AccountManager.KEY_ERROR_MESSAGE);
+            }
+            result.putInt(AccountManager.KEY_ERROR_CODE, errorCode);
+            result.putString(AccountManager.KEY_ERROR_MESSAGE, errorMsg);
+        }
+
+        try {
+            return (isCallbackRequired) ? null : result;
+        } finally {
+            if (isCallbackRequired) {
+                response.onResult(result);
+            }
+        }
+    }
+
+    @Override
+    public String getAuthTokenLabel(String authTokenType) {
+        String result = "Label:" + authTokenType;
+        AuthenticatorContentProvider.setTx(
+                new GetAuthTokenLabelTx(authTokenType, result));
+        return result;
+    }
+
+    @Override
+    public Bundle updateCredentials(
+            AccountAuthenticatorResponse response,
+            Account account,
+            String authTokenType,
+            Bundle options) throws NetworkErrorException {
+        if (!mAccountType.equals(account.type)) {
+            throw new IllegalArgumentException("Request to the wrong authenticator!");
+        }
+        Bundle result = new Bundle();
+        AuthenticatorContentProvider.setTx(
+                new UpdateCredentialsTx(account, authTokenType, options, result));
+
+        boolean isCallbackRequired =
+                options != null && options.getBoolean(Fixtures.KEY_CALLBACK_REQUIRED);
+        if (account.name.startsWith(Fixtures.PREFIX_NAME_SUCCESS)) {
+            // fill bundle with a success result.
+            result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
+            result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
+        } else if (account.name.startsWith(Fixtures.PREFIX_NAME_INTERVENE)) {
+            // Specify data to be returned by the eventual activity.
+            Intent eventualActivityResultData = new Intent();
+            eventualActivityResultData.putExtra(AccountManager.KEY_ACCOUNT_NAME, account.name);
+            eventualActivityResultData.putExtra(AccountManager.KEY_ACCOUNT_TYPE, account.type);
+
+            // Fill result with Intent.
+            Intent intent = new Intent(mContext, TestAuthenticatorActivity.class);
+            intent.putExtra(Fixtures.KEY_RESULT, eventualActivityResultData);
+            intent.putExtra(Fixtures.KEY_CALLBACK, response);
+
+            result.putParcelable(AccountManager.KEY_INTENT, intent);
+        } else {
+            // fill with error
+            // fill with error
+            int errorCode = AccountManager.ERROR_CODE_INVALID_RESPONSE;
+            String errorMsg = "Default Error Message";
+            if (options != null) {
+                errorCode = options.getInt(AccountManager.KEY_ERROR_CODE);
+                errorMsg = options.getString(AccountManager.KEY_ERROR_MESSAGE);
+            }
+            result.putInt(AccountManager.KEY_ERROR_CODE, errorCode);
+            result.putString(AccountManager.KEY_ERROR_MESSAGE, errorMsg);
+        }
+
+        try {
+            return (isCallbackRequired) ? null : result;
+        } finally {
+            if (isCallbackRequired) {
+                response.onResult(result);
+            }
+        }
+    }
+
+    @Override
+    public Bundle hasFeatures(
+            AccountAuthenticatorResponse response,
+            Account account,
+            String[] features) throws NetworkErrorException {
+        if (!mAccountType.equals(account.type)) {
+            throw new IllegalArgumentException("Request to the wrong authenticator!");
+        }
+        Bundle result = new Bundle();
+        AuthenticatorContentProvider.setTx(
+                new HasFeaturesTx(account, features, result));
+        boolean isCallbackRequired =
+                Arrays.asList(features).contains(Fixtures.KEY_CALLBACK_REQUIRED);
+        if (account.name.startsWith(Fixtures.PREFIX_NAME_SUCCESS)) {
+            // fill bundle with a success result.
+            result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true);
+        } else if (account.name.startsWith(Fixtures.PREFIX_NAME_INTERVENE)) {
+            // Specify data to be returned by the eventual activity.
+            Intent eventualActivityResultData = new Intent();
+            eventualActivityResultData.putExtra(AccountManager.KEY_BOOLEAN_RESULT, true);
+
+            Intent intent = new Intent(mContext, TestAuthenticatorActivity.class);
+            intent.putExtra(Fixtures.KEY_RESULT, eventualActivityResultData);
+            intent.putExtra(Fixtures.KEY_CALLBACK, response);
+
+            result.putParcelable(AccountManager.KEY_INTENT, intent);
+        } else {
+            // fill with error
+        }
+
+        try {
+            return (isCallbackRequired) ? null : result;
+        } finally {
+            if (isCallbackRequired) {
+                response.onResult(result);
+            }
+        }
+    }
+}
+
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/TestAuthenticatorActivity.java b/tests/tests/accounts/common/src/android/accounts/cts/common/TestAuthenticatorActivity.java
new file mode 100644
index 0000000..83c0533
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/TestAuthenticatorActivity.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2015 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.accounts.cts.common;
+
+import android.accounts.AccountAuthenticatorResponse;
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+
+public class TestAuthenticatorActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        Intent intent = getIntent();
+        AccountAuthenticatorResponse response = intent.getParcelableExtra(Fixtures.KEY_CALLBACK);
+        Intent result = intent.getParcelableExtra(Fixtures.KEY_RESULT);
+        if (response != null) {
+            response.onResult(result.getExtras());
+        }
+        setResult(RESULT_OK, result);
+        finish();
+    }
+}
+
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/tx/AddAccountTx.aidl b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/AddAccountTx.aidl
new file mode 100644
index 0000000..912322a
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/AddAccountTx.aidl
@@ -0,0 +1,3 @@
+package android.accounts.cts.common.tx;
+
+parcelable AddAccountTx;
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/tx/AddAccountTx.java b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/AddAccountTx.java
new file mode 100644
index 0000000..3d829315
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/AddAccountTx.java
@@ -0,0 +1,70 @@
+package android.accounts.cts.common.tx;
+
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AddAccountTx implements Parcelable {
+
+    public static final Parcelable.Creator<AddAccountTx> CREATOR =
+            new Parcelable.Creator<AddAccountTx>() {
+
+                @Override
+                public AddAccountTx createFromParcel(Parcel in) {
+                    return new AddAccountTx(in);
+                }
+
+                @Override
+                public AddAccountTx[] newArray(int size) {
+                    return new AddAccountTx[size];
+                }
+            };
+
+    public final String accountType;
+    public final String authTokenType;
+    public final List<String> requiredFeatures = new ArrayList<>();
+    public final Bundle options;
+    public final Bundle result;
+
+    private AddAccountTx(Parcel in) {
+        accountType = in.readString();
+        authTokenType = in.readString();
+        in.readStringList(requiredFeatures);
+        options = in.readBundle();
+        result = in.readBundle();
+    }
+
+    public AddAccountTx(
+            String accountType,
+            String authTokenType,
+            String[] requiredFeatures,
+            Bundle options,
+            Bundle result) {
+        this.accountType = accountType;
+        this.authTokenType = authTokenType;
+        if (requiredFeatures != null) {
+            for (String feature : requiredFeatures) {
+                this.requiredFeatures.add(feature);
+            }
+        }
+        this.options = options;
+        this.result = result;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeString(accountType);
+        out.writeString(authTokenType);
+        out.writeStringList(requiredFeatures);
+        out.writeBundle(options);
+        out.writeBundle(result);
+    }
+}
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/tx/ConfirmCredentialsTx.aidl b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/ConfirmCredentialsTx.aidl
new file mode 100644
index 0000000..98a6367
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/ConfirmCredentialsTx.aidl
@@ -0,0 +1,3 @@
+package android.accounts.cts.common.tx;
+
+parcelable ConfirmCredentialsTx;
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/tx/ConfirmCredentialsTx.java b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/ConfirmCredentialsTx.java
new file mode 100644
index 0000000..d73b0a5
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/ConfirmCredentialsTx.java
@@ -0,0 +1,54 @@
+package android.accounts.cts.common.tx;
+
+import android.accounts.Account;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class ConfirmCredentialsTx implements Parcelable {
+
+    public static final Parcelable.Creator<ConfirmCredentialsTx> CREATOR =
+            new Parcelable.Creator<ConfirmCredentialsTx>() {
+
+                @Override
+                public ConfirmCredentialsTx createFromParcel(Parcel in) {
+                    return new ConfirmCredentialsTx(in);
+                }
+
+                @Override
+                public ConfirmCredentialsTx[] newArray(int size) {
+                    return new ConfirmCredentialsTx[size];
+                }
+            };
+
+    public final Account account;
+    public final Bundle options;
+    public final Bundle result;
+
+    private ConfirmCredentialsTx(Parcel in) {
+        account = in.readParcelable(null);
+        options = in.readBundle();
+        result = in.readBundle();
+    }
+
+    public ConfirmCredentialsTx(
+            Account account,
+            Bundle options,
+            Bundle result) {
+        this.account = account;
+        this.options = options;
+        this.result = result;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeParcelable(account, flags);
+        out.writeBundle(options);
+        out.writeBundle(result);
+    }
+}
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/tx/EditPropertiesTx.aidl b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/EditPropertiesTx.aidl
new file mode 100644
index 0000000..d9e813f
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/EditPropertiesTx.aidl
@@ -0,0 +1,3 @@
+package android.accounts.cts.common.tx;
+
+parcelable EditPropertiesTx;
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/tx/EditPropertiesTx.java b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/EditPropertiesTx.java
new file mode 100644
index 0000000..4eba64d
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/EditPropertiesTx.java
@@ -0,0 +1,48 @@
+package android.accounts.cts.common.tx;
+
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class EditPropertiesTx implements Parcelable {
+
+    public static final Parcelable.Creator<EditPropertiesTx> CREATOR =
+            new Parcelable.Creator<EditPropertiesTx>() {
+
+                @Override
+                public EditPropertiesTx createFromParcel(Parcel in) {
+                    return new EditPropertiesTx(in);
+                }
+
+                @Override
+                public EditPropertiesTx[] newArray(int size) {
+                    return new EditPropertiesTx[size];
+                }
+            };
+
+    public final String accountType;
+    public final Bundle result;
+
+    private EditPropertiesTx(Parcel in) {
+        accountType = in.readString();
+        result = in.readBundle();
+    }
+
+    public EditPropertiesTx(
+            String accountType,
+            Bundle result) {
+        this.accountType = accountType;
+        this.result = result;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeString(accountType);
+        out.writeBundle(result);
+    }
+}
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/tx/GetAccountRemovalAllowedTx.aidl b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/GetAccountRemovalAllowedTx.aidl
new file mode 100644
index 0000000..cbcd99d
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/GetAccountRemovalAllowedTx.aidl
@@ -0,0 +1,3 @@
+package android.accounts.cts.common.tx;
+
+parcelable GetAccountRemovalAllowedTx;
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/tx/GetAccountRemovalAllowedTx.java b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/GetAccountRemovalAllowedTx.java
new file mode 100644
index 0000000..0e456b0
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/GetAccountRemovalAllowedTx.java
@@ -0,0 +1,49 @@
+package android.accounts.cts.common.tx;
+
+import android.accounts.Account;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class GetAccountRemovalAllowedTx implements Parcelable {
+
+    public static final Parcelable.Creator<GetAccountRemovalAllowedTx> CREATOR =
+            new Parcelable.Creator<GetAccountRemovalAllowedTx>() {
+
+                @Override
+                public GetAccountRemovalAllowedTx createFromParcel(Parcel in) {
+                    return new GetAccountRemovalAllowedTx(in);
+                }
+
+                @Override
+                public GetAccountRemovalAllowedTx[] newArray(int size) {
+                    return new GetAccountRemovalAllowedTx[size];
+                }
+            };
+
+    public final Account account;
+    public final Bundle result;
+
+    private GetAccountRemovalAllowedTx(Parcel in) {
+        account = in.readParcelable(null);
+        result = in.readBundle();
+    }
+
+    public GetAccountRemovalAllowedTx(
+            Account account,
+            Bundle result) {
+        this.account = account;
+        this.result = result;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeParcelable(account, flags);
+        out.writeBundle(result);
+    }
+}
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/tx/GetAuthTokenLabelTx.aidl b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/GetAuthTokenLabelTx.aidl
new file mode 100644
index 0000000..82aeb9e
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/GetAuthTokenLabelTx.aidl
@@ -0,0 +1,3 @@
+package android.accounts.cts.common.tx;
+
+parcelable GetAuthTokenLabelTx;
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/tx/GetAuthTokenLabelTx.java b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/GetAuthTokenLabelTx.java
new file mode 100644
index 0000000..4a017dd
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/GetAuthTokenLabelTx.java
@@ -0,0 +1,47 @@
+package android.accounts.cts.common.tx;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class GetAuthTokenLabelTx implements Parcelable {
+
+    public static final Parcelable.Creator<GetAuthTokenLabelTx> CREATOR =
+            new Parcelable.Creator<GetAuthTokenLabelTx>() {
+
+                @Override
+                public GetAuthTokenLabelTx createFromParcel(Parcel in) {
+                    return new GetAuthTokenLabelTx(in);
+                }
+
+                @Override
+                public GetAuthTokenLabelTx[] newArray(int size) {
+                    return new GetAuthTokenLabelTx[size];
+                }
+            };
+
+    public final String authTokenType;
+    public final String result;
+
+    private GetAuthTokenLabelTx(Parcel in) {
+        authTokenType = in.readString();
+        result = in.readString();
+    }
+
+    public GetAuthTokenLabelTx(
+            String authTokenType,
+            String result) {
+        this.authTokenType = authTokenType;
+        this.result = result;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeString(authTokenType);
+        out.writeString(result);
+    }
+}
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/tx/GetAuthTokenTx.aidl b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/GetAuthTokenTx.aidl
new file mode 100644
index 0000000..4ff5abb
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/GetAuthTokenTx.aidl
@@ -0,0 +1,3 @@
+package android.accounts.cts.common.tx;
+
+parcelable GetAuthTokenTx;
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/tx/GetAuthTokenTx.java b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/GetAuthTokenTx.java
new file mode 100644
index 0000000..c328353
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/GetAuthTokenTx.java
@@ -0,0 +1,59 @@
+package android.accounts.cts.common.tx;
+
+import android.accounts.Account;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class GetAuthTokenTx implements Parcelable {
+
+    public static final Parcelable.Creator<GetAuthTokenTx> CREATOR =
+            new Parcelable.Creator<GetAuthTokenTx>() {
+
+                @Override
+                public GetAuthTokenTx createFromParcel(Parcel in) {
+                    return new GetAuthTokenTx(in);
+                }
+
+                @Override
+                public GetAuthTokenTx[] newArray(int size) {
+                    return new GetAuthTokenTx[size];
+                }
+            };
+
+    public final Account account;
+    public final String authTokenType;
+    public final Bundle options;
+    public final Bundle result;
+
+    private GetAuthTokenTx(Parcel in) {
+        account = in.readParcelable(null);
+        authTokenType = in.readString();
+        options = in.readBundle();
+        result = in.readBundle();
+    }
+
+    public GetAuthTokenTx(
+            Account account,
+            String authTokenType,
+            Bundle options,
+            Bundle result) {
+        this.account = account;
+        this.authTokenType = authTokenType;
+        this.options = options;
+        this.result = result;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeParcelable(account, flags);
+        out.writeString(authTokenType);
+        out.writeBundle(options);
+        out.writeBundle(result);
+    }
+}
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/tx/HasFeaturesTx.aidl b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/HasFeaturesTx.aidl
new file mode 100644
index 0000000..20b4a67
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/HasFeaturesTx.aidl
@@ -0,0 +1,3 @@
+package android.accounts.cts.common.tx;
+
+parcelable HasFeaturesTx;
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/tx/HasFeaturesTx.java b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/HasFeaturesTx.java
new file mode 100644
index 0000000..81d3446
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/HasFeaturesTx.java
@@ -0,0 +1,61 @@
+package android.accounts.cts.common.tx;
+
+import android.accounts.Account;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class HasFeaturesTx implements Parcelable {
+
+    public static final Parcelable.Creator<HasFeaturesTx> CREATOR =
+            new Parcelable.Creator<HasFeaturesTx>() {
+
+                @Override
+                public HasFeaturesTx createFromParcel(Parcel in) {
+                    return new HasFeaturesTx(in);
+                }
+
+                @Override
+                public HasFeaturesTx[] newArray(int size) {
+                    return new HasFeaturesTx[size];
+                }
+            };
+
+    public final Account account;
+    public final List<String> features = new ArrayList<>();
+    public final Bundle result;
+
+    private HasFeaturesTx(Parcel in) {
+        account = in.readParcelable(null);
+        in.readStringList(features);
+        result = in.readBundle();
+    }
+
+    public HasFeaturesTx(
+            Account account,
+            String[] features,
+            Bundle result) {
+        this.account = account;
+        if (features != null) {
+            for (String feature : features) {
+                this.features.add(feature);
+            }
+        }
+        this.result = result;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeParcelable(account, flags);
+        out.writeStringList(features);
+        out.writeBundle(result);
+    }
+}
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/tx/UpdateCredentialsTx.aidl b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/UpdateCredentialsTx.aidl
new file mode 100644
index 0000000..8106242
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/UpdateCredentialsTx.aidl
@@ -0,0 +1,3 @@
+package android.accounts.cts.common.tx;
+
+parcelable UpdateCredentialsTx;
diff --git a/tests/tests/accounts/common/src/android/accounts/cts/common/tx/UpdateCredentialsTx.java b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/UpdateCredentialsTx.java
new file mode 100644
index 0000000..ed2e082
--- /dev/null
+++ b/tests/tests/accounts/common/src/android/accounts/cts/common/tx/UpdateCredentialsTx.java
@@ -0,0 +1,59 @@
+package android.accounts.cts.common.tx;
+
+import android.accounts.Account;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class UpdateCredentialsTx implements Parcelable {
+
+    public static final Parcelable.Creator<UpdateCredentialsTx> CREATOR =
+            new Parcelable.Creator<UpdateCredentialsTx>() {
+
+                @Override
+                public UpdateCredentialsTx createFromParcel(Parcel in) {
+                    return new UpdateCredentialsTx(in);
+                }
+
+                @Override
+                public UpdateCredentialsTx[] newArray(int size) {
+                    return new UpdateCredentialsTx[size];
+                }
+            };
+
+    public final Account account;
+    public final String authTokenType;
+    public final Bundle options;
+    public final Bundle result;
+
+    private UpdateCredentialsTx(Parcel in) {
+        account = in.readParcelable(null);
+        authTokenType = in.readString();
+        options = in.readBundle();
+        result = in.readBundle();
+    }
+
+    public UpdateCredentialsTx(
+            Account account,
+            String authTokenType,
+            Bundle options,
+            Bundle result) {
+        this.account = account;
+        this.authTokenType = authTokenType;
+        this.options = options;
+        this.result = result;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeParcelable(account, flags);
+        out.writeString(authTokenType);
+        out.writeBundle(options);
+        out.writeBundle(result);
+    }
+}
diff --git a/tests/tests/accounts/res/drawable/ic_cts_minitab_selected_custom_account.png b/tests/tests/accounts/res/drawable/ic_cts_minitab_selected_custom_account.png
new file mode 100644
index 0000000..3fbbc94
--- /dev/null
+++ b/tests/tests/accounts/res/drawable/ic_cts_minitab_selected_custom_account.png
Binary files differ
diff --git a/tests/tests/accounts/res/drawable/ic_cts_selected_custom_account.png b/tests/tests/accounts/res/drawable/ic_cts_selected_custom_account.png
new file mode 100644
index 0000000..70e35c0
--- /dev/null
+++ b/tests/tests/accounts/res/drawable/ic_cts_selected_custom_account.png
Binary files differ
diff --git a/tests/tests/accounts/res/xml/custom_token_authenticator.xml b/tests/tests/accounts/res/xml/custom_token_authenticator.xml
new file mode 100644
index 0000000..3337917
--- /dev/null
+++ b/tests/tests/accounts/res/xml/custom_token_authenticator.xml
@@ -0,0 +1,29 @@
+<?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.
+ */
+-->
+
+<!-- The attributes in this XML file provide configuration information -->
+<!-- for the Account Manager. -->
+
+<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
+    android:accountType="android.accounts.cts.custom.account.type"
+    android:icon="@drawable/ic_cts_selected_custom_account"
+    android:smallIcon="@drawable/ic_cts_minitab_selected_custom_account"
+    android:customTokens="true"
+    android:label="@string/label"
+/>
diff --git a/tests/tests/accounts/src/android/accounts/cts/AccountManagerTest.java b/tests/tests/accounts/src/android/accounts/cts/AccountManagerTest.java
index b2a48e6..4350191 100644
--- a/tests/tests/accounts/src/android/accounts/cts/AccountManagerTest.java
+++ b/tests/tests/accounts/src/android/accounts/cts/AccountManagerTest.java
@@ -26,16 +26,19 @@
 import android.accounts.OperationCanceledException;
 import android.app.Activity;
 import android.content.Context;
-import android.content.Intent;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.HandlerThread;
 import android.os.Looper;
 import android.os.StrictMode;
 import android.test.ActivityInstrumentationTestCase2;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * You can run those unit tests with the following command line:
@@ -52,13 +55,15 @@
     public static final String ACCOUNT_NAME_OTHER = "android.accounts.cts.account.name.other";
 
     public static final String ACCOUNT_TYPE = "android.accounts.cts.account.type";
-    public static final String ACCOUNT_TYPE_OTHER = "android.accounts.cts.account.type.other";
+    public static final String ACCOUNT_TYPE_CUSTOM = "android.accounts.cts.custom.account.type";
+    public static final String ACCOUNT_TYPE_ABSENT = "android.accounts.cts.account.type.absent";
 
     public static final String ACCOUNT_PASSWORD = "android.accounts.cts.account.password";
 
-    public static final String AUTH_TOKEN = "mockAuthToken";
     public static final String AUTH_TOKEN_TYPE = "mockAuthTokenType";
+    public static final String AUTH_EXPIRING_TOKEN_TYPE = "mockAuthExpiringTokenType";
     public static final String AUTH_TOKEN_LABEL = "mockAuthTokenLabel";
+    public static final long AUTH_TOKEN_DURATION_MILLIS = 10000L; // Ten seconds.
 
     public static final String FEATURE_1 = "feature.1";
     public static final String FEATURE_2 = "feature.2";
@@ -86,6 +91,9 @@
             MockAccountAuthenticator.ACCOUNT_NAME_FOR_NEW_REMOVE_API, ACCOUNT_TYPE);
     public static final Account ACCOUNT_SAME_TYPE = new Account(ACCOUNT_NAME_OTHER, ACCOUNT_TYPE);
 
+    public static final Account CUSTOM_TOKEN_ACCOUNT =
+            new Account(ACCOUNT_NAME,ACCOUNT_TYPE_CUSTOM);
+
     private static MockAccountAuthenticator mockAuthenticator;
     private static final int LATCH_TIMEOUT_MS = 500;
     private static AccountManager am;
@@ -130,16 +138,101 @@
         assertTrue(removeAccount(am, ACCOUNT_SAME_TYPE, mActivity, null /* callback */).getBoolean(
                 AccountManager.KEY_BOOLEAN_RESULT));
 
+        // Clean out any other accounts added during the tests.
+        Account[] ctsAccounts = am.getAccountsByType(ACCOUNT_TYPE);
+        Account[] ctsCustomAccounts = am.getAccountsByType(ACCOUNT_TYPE_CUSTOM);
+        ArrayList<Account> accounts = new ArrayList<>(Arrays.asList(ctsAccounts));
+        accounts.addAll(Arrays.asList(ctsCustomAccounts));
+        for (Account ctsAccount : accounts) {
+            removeAccount(am, ctsAccount, mActivity, null /* callback */);
+        }
+
         // need to clean up the authenticator cached data
         mockAuthenticator.clearData();
 
         super.tearDown();
     }
 
-    private void validateAccountAndAuthTokenResult(Bundle result) {
-        assertEquals(ACCOUNT_NAME, result.get(AccountManager.KEY_ACCOUNT_NAME));
-        assertEquals(ACCOUNT_TYPE, result.get(AccountManager.KEY_ACCOUNT_TYPE));
-        assertEquals(AUTH_TOKEN, result.get(AccountManager.KEY_AUTHTOKEN));
+    interface TokenFetcher {
+        public Bundle fetch(String tokenType)
+                throws OperationCanceledException, AuthenticatorException, IOException;
+        public Account getAccount();
+    }
+
+    private void validateSuccessfulTokenFetchingLifecycle(TokenFetcher fetcher, String tokenType)
+            throws OperationCanceledException, AuthenticatorException, IOException {
+        Account account = fetcher.getAccount();
+        Bundle expected = new Bundle();
+        expected.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
+        expected.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
+
+        // First fetch.
+        Bundle actual = fetcher.fetch(tokenType);
+        assertTrue(mockAuthenticator.isRecentlyCalled());
+        validateAccountAndAuthTokenResult(expected, actual);
+
+        /*
+         * On the second fetch the cache will be populated if we are using a authenticator with
+         * customTokens=false or we are using a scope that will cause the authenticator to set an
+         * expiration time (and that expiration time hasn't been reached).
+         */
+        actual = fetcher.fetch(tokenType);
+
+        boolean isCachingExpected =
+                ACCOUNT_TYPE.equals(account.type) || AUTH_EXPIRING_TOKEN_TYPE.equals(tokenType);
+        assertEquals(isCachingExpected, !mockAuthenticator.isRecentlyCalled());
+        validateAccountAndAuthTokenResult(expected, actual);
+
+        try {
+            // Delay further execution until expiring tokens can actually expire.
+            Thread.sleep(mockAuthenticator.getTokenDurationMillis() + 1L);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+
+        /*
+         * With the time shift above, the third request will result in cache hits only from
+         * customToken=false authenticators.
+         */
+        actual = fetcher.fetch(tokenType);
+        isCachingExpected = ACCOUNT_TYPE.equals(account.type);
+        assertEquals(isCachingExpected, !mockAuthenticator.isRecentlyCalled());
+        validateAccountAndAuthTokenResult(expected, actual);
+
+        // invalidate token
+        String token = actual.getString(AccountManager.KEY_AUTHTOKEN);
+        am.invalidateAuthToken(account.type, token);
+
+        /*
+         * Upon invalidating the token, the cache should be clear regardless of authenticator.
+         */
+        actual = fetcher.fetch(tokenType);
+        assertTrue(mockAuthenticator.isRecentlyCalled());
+        validateAccountAndAuthTokenResult(expected, actual);
+    }
+
+    private void validateAccountAndAuthTokenResult(Bundle actual) {
+        assertEquals(
+                ACCOUNT.name,
+                actual.get(AccountManager.KEY_ACCOUNT_NAME));
+        assertEquals(
+                ACCOUNT.type,
+                actual.get(AccountManager.KEY_ACCOUNT_TYPE));
+        assertEquals(
+                mockAuthenticator.getLastTokenServed(),
+                actual.get(AccountManager.KEY_AUTHTOKEN));
+    }
+
+    private void validateAccountAndAuthTokenResult(Bundle expected, Bundle actual) {
+        assertEquals(
+                expected.get(AccountManager.KEY_ACCOUNT_NAME),
+                actual.get(AccountManager.KEY_ACCOUNT_NAME));
+        assertEquals(
+                expected.get(AccountManager.KEY_ACCOUNT_TYPE),
+                actual.get(AccountManager.KEY_ACCOUNT_TYPE));
+        assertEquals(
+                mockAuthenticator.getLastTokenServed(),
+                actual.get(AccountManager.KEY_AUTHTOKEN));
     }
 
     private void validateAccountAndNoAuthTokenResult(Bundle result) {
@@ -224,7 +317,6 @@
     private boolean removeAccount(AccountManager am, Account account,
             AccountManagerCallback<Boolean> callback) throws IOException, AuthenticatorException,
                 OperationCanceledException {
-
         AccountManagerFuture<Boolean> futureBoolean = am.removeAccount(account,
                 callback,
                 null /* handler */);
@@ -357,6 +449,7 @@
         final CountDownLatch latch = new CountDownLatch(1);
 
         AccountManagerCallback<Bundle> callback = new AccountManagerCallback<Bundle>() {
+            @Override
             public void run(AccountManagerFuture<Bundle> bundleFuture) {
                 Bundle resultBundle = null;
                 try {
@@ -483,9 +576,7 @@
     /**
      * Test addAccountExplicitly() and removeAccountExplictly().
      */
-    public void testAddAccountExplicitlyAndRemoveAccountExplicitly() throws IOException,
-            AuthenticatorException, OperationCanceledException {
-
+    public void testAddAccountExplicitlyAndRemoveAccountExplicitly() {
         final int expectedAccountsCount = getAccountsCount();
 
         addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
@@ -581,7 +672,7 @@
         assertEquals(2, accounts.length);
 
         // Check if we dont have any account from the other type
-        accounts = am.getAccountsByType(ACCOUNT_TYPE_OTHER);
+        accounts = am.getAccountsByType(ACCOUNT_TYPE_ABSENT);
         assertEquals(0, accounts.length);
     }
 
@@ -684,6 +775,7 @@
         final CountDownLatch latch1 = new CountDownLatch(1);
 
         AccountManagerCallback<Account[]> callback1 = new AccountManagerCallback<Account[]>() {
+            @Override
             public void run(AccountManagerFuture<Account[]> accountsFuture) {
                 try {
                     Account[] accounts = accountsFuture.getResult();
@@ -724,6 +816,7 @@
         final CountDownLatch latch2 = new CountDownLatch(1);
 
         AccountManagerCallback<Account[]> callback2 = new AccountManagerCallback<Account[]>() {
+            @Override
             public void run(AccountManagerFuture<Account[]> accountsFuture) {
                 try {
                     Account[] accounts = accountsFuture.getResult();
@@ -765,25 +858,24 @@
      */
     public void testSetAndPeekAndInvalidateAuthToken() {
         addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
-
-        am.setAuthToken(ACCOUNT, AUTH_TOKEN_TYPE, AUTH_TOKEN);
+        String expected = "x";
+        am.setAuthToken(ACCOUNT, AUTH_TOKEN_TYPE, expected);
 
         // Ask for the AuthToken
         String token = am.peekAuthToken(ACCOUNT, AUTH_TOKEN_TYPE);
         assertNotNull(token);
-        assertEquals(AUTH_TOKEN, token);
+        assertEquals(expected, token);
 
-        am.invalidateAuthToken(ACCOUNT_TYPE, AUTH_TOKEN);
+        am.invalidateAuthToken(ACCOUNT_TYPE, token);
         token = am.peekAuthToken(ACCOUNT, AUTH_TOKEN_TYPE);
         assertNull(token);
     }
 
     /**
-     * Test blockingGetAuthToken()
+     * Test successful blockingGetAuthToken() with customTokens=false authenticator.
      */
-    public void testBlockingGetAuthToken() throws IOException, AuthenticatorException,
-            OperationCanceledException {
-
+    public void testBlockingGetAuthToken_DefaultToken_Success()
+            throws IOException, AuthenticatorException, OperationCanceledException {
         addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null);
 
         String token = am.blockingGetAuthToken(ACCOUNT,
@@ -792,17 +884,61 @@
 
         // Ask for the AuthToken
         assertNotNull(token);
-        assertEquals(AUTH_TOKEN, token);
+        assertEquals(mockAuthenticator.getLastTokenServed(), token);
+    }
+
+    private static class BlockingGetAuthTokenFetcher implements TokenFetcher {
+        private final Account mAccount;
+
+        BlockingGetAuthTokenFetcher(Account account) {
+            mAccount = account;
+        }
+
+        @Override
+        public Bundle fetch(String tokenType)
+                throws OperationCanceledException, AuthenticatorException, IOException {
+            String token = am.blockingGetAuthToken(
+                    getAccount(),
+                    tokenType,
+                    false /* no failure notification */);
+            Bundle result = new Bundle();
+            result.putString(AccountManager.KEY_AUTHTOKEN, token);
+            result.putString(AccountManager.KEY_ACCOUNT_NAME, mAccount.name);
+            result.putString(AccountManager.KEY_ACCOUNT_TYPE, mAccount.type);
+            return result;
+        }
+        @Override
+        public Account getAccount() {
+            return CUSTOM_TOKEN_ACCOUNT;
+        }
     }
 
     /**
-     * Test getAuthToken()
+     * Test successful blockingGetAuthToken() with customTokens=true authenticator.
      */
-    public void testGetAuthToken() throws IOException, AuthenticatorException,
-            OperationCanceledException {
+    public void testBlockingGetAuthToken_CustomToken_NoCaching_Success()
+            throws IOException, AuthenticatorException, OperationCanceledException {
+        addAccountExplicitly(CUSTOM_TOKEN_ACCOUNT, ACCOUNT_PASSWORD, null);
+        TokenFetcher f = new BlockingGetAuthTokenFetcher(CUSTOM_TOKEN_ACCOUNT);
+        validateSuccessfulTokenFetchingLifecycle(f, AUTH_TOKEN_TYPE);
+    }
 
+    /**
+     * Test successful blockingGetAuthToken() with customTokens=true authenticator.
+     */
+    public void testBlockingGetAuthToken_CustomToken_ExpiringCache_Success()
+            throws IOException, AuthenticatorException, OperationCanceledException {
+        addAccountExplicitly(CUSTOM_TOKEN_ACCOUNT, ACCOUNT_PASSWORD, null);
+        TokenFetcher f = new BlockingGetAuthTokenFetcher(CUSTOM_TOKEN_ACCOUNT);
+        validateSuccessfulTokenFetchingLifecycle(f, AUTH_EXPIRING_TOKEN_TYPE);
+    }
+
+    /**
+     * Test successful getAuthToken() using a future with customTokens=false authenticator.
+     */
+    public void testDeprecatedGetAuthTokenWithFuture_NoOptions_DefaultToken_Success()
+            throws IOException, AuthenticatorException, OperationCanceledException {
         addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
-
         AccountManagerFuture<Bundle> futureBundle = am.getAuthToken(ACCOUNT,
                 AUTH_TOKEN_TYPE,
                 false /* no failure notification */,
@@ -820,6 +956,226 @@
     }
 
     /**
+     * Test successful getAuthToken() using a future with customTokens=false without
+     * expiring tokens.
+     */
+    public void testDeprecatedGetAuthTokenWithFuture_NoOptions_CustomToken_Success()
+            throws IOException, AuthenticatorException, OperationCanceledException {
+        addAccountExplicitly(CUSTOM_TOKEN_ACCOUNT, ACCOUNT_PASSWORD, null);
+        // validateSuccessfulTokenFetchingLifecycle(AccountManager am, TokenFetcher fetcher, String tokenType)
+        TokenFetcher f = new TokenFetcher() {
+            @Override
+            public Bundle fetch(String tokenType)
+                    throws OperationCanceledException, AuthenticatorException, IOException {
+                AccountManagerFuture<Bundle> futureBundle = am.getAuthToken(
+                        getAccount(),
+                        tokenType,
+                        false /* no failure notification */,
+                        null /* no callback */,
+                        null /* no handler */
+                );
+                Bundle actual = futureBundle.getResult();
+                assertTrue(futureBundle.isDone());
+                assertNotNull(actual);
+                return actual;
+            }
+
+            @Override
+            public Account getAccount() {
+                return CUSTOM_TOKEN_ACCOUNT;
+            }
+        };
+        validateSuccessfulTokenFetchingLifecycle(f, AUTH_EXPIRING_TOKEN_TYPE);
+        validateSuccessfulTokenFetchingLifecycle(f, AUTH_TOKEN_TYPE);
+    }
+
+    /**
+     * Test successful getAuthToken() using a future with customTokens=false without
+     * expiring tokens.
+     */
+    public void testGetAuthTokenWithFuture_Options_DefaultToken_Success()
+            throws IOException, AuthenticatorException, OperationCanceledException {
+        addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
+
+        AccountManagerFuture<Bundle> futureBundle = am.getAuthToken(ACCOUNT,
+                AUTH_TOKEN_TYPE,
+                OPTIONS_BUNDLE,
+                mActivity,
+                null /* no callback */,
+                null /* no handler */
+        );
+
+        Bundle resultBundle = futureBundle.getResult();
+
+        assertTrue(futureBundle.isDone());
+        assertNotNull(resultBundle);
+
+        // Assert returned result
+        validateAccountAndAuthTokenResult(resultBundle);
+
+        validateOptions(null, mockAuthenticator.mOptionsAddAccount);
+        validateOptions(null, mockAuthenticator.mOptionsUpdateCredentials);
+        validateOptions(null, mockAuthenticator.mOptionsConfirmCredentials);
+        validateOptions(OPTIONS_BUNDLE, mockAuthenticator.mOptionsGetAuthToken);
+        validateSystemOptions(mockAuthenticator.mOptionsGetAuthToken);
+    }
+
+    /**
+     * Test successful getAuthToken() using a future with customTokens=false without
+     * expiring tokens.
+     */
+    public void testGetAuthTokenWithFuture_Options_CustomToken_Success()
+            throws IOException, AuthenticatorException, OperationCanceledException {
+        addAccountExplicitly(CUSTOM_TOKEN_ACCOUNT, ACCOUNT_PASSWORD, null);
+        TokenFetcher fetcherWithOptions = new TokenFetcher() {
+            @Override
+            public Bundle fetch(String tokenType)
+                    throws OperationCanceledException, AuthenticatorException, IOException {
+                AccountManagerFuture<Bundle> futureBundle = am.getAuthToken(
+                        getAccount(),
+                        tokenType,
+                        OPTIONS_BUNDLE,
+                        false /* no failure notification */,
+                        null /* no callback */,
+                        null /* no handler */
+                );
+                Bundle actual = futureBundle.getResult();
+                assertTrue(futureBundle.isDone());
+                assertNotNull(actual);
+                return actual;
+            }
+
+            @Override
+            public Account getAccount() {
+                return CUSTOM_TOKEN_ACCOUNT;
+            }
+        };
+        validateSuccessfulTokenFetchingLifecycle(fetcherWithOptions, AUTH_TOKEN_TYPE);
+        validateSuccessfulTokenFetchingLifecycle(fetcherWithOptions, AUTH_EXPIRING_TOKEN_TYPE);
+    }
+
+
+    /**
+     * Test successful getAuthToken() using a future with customTokens=false without
+     * expiring tokens.
+     */
+    public void testGetAuthTokenWithCallback_Options_Handler_DefaultToken_Success()
+            throws IOException, AuthenticatorException, OperationCanceledException {
+        addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null);
+        final HandlerThread handlerThread = new HandlerThread("accounts.test");
+        handlerThread.start();
+        TokenFetcher fetcherWithOptions = new TokenFetcher() {
+            @Override
+            public Bundle fetch(String tokenType)
+                    throws OperationCanceledException, AuthenticatorException, IOException {
+                final AtomicReference<Bundle> actualRef = new AtomicReference<>();
+                final CountDownLatch latch = new CountDownLatch(1);
+
+                AccountManagerCallback<Bundle> callback = new AccountManagerCallback<Bundle>() {
+                    @Override
+                    public void run(AccountManagerFuture<Bundle> bundleFuture) {
+                        Bundle resultBundle = null;
+                        try {
+                            resultBundle = bundleFuture.getResult();
+                            actualRef.set(resultBundle);
+                        } catch (OperationCanceledException e) {
+                            fail("should not throw an OperationCanceledException");
+                        } catch (IOException e) {
+                            fail("should not throw an IOException");
+                        } catch (AuthenticatorException e) {
+                            fail("should not throw an AuthenticatorException");
+                        } finally {
+                            latch.countDown();
+                        }
+                    }
+                };
+
+                am.getAuthToken(getAccount(),
+                        tokenType,
+                        OPTIONS_BUNDLE,
+                        false /* no failure notification */,
+                        callback,
+                        new Handler(handlerThread.getLooper()));
+
+                // Wait with timeout for the callback to do its work
+                try {
+                    latch.await(LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+                } catch (InterruptedException e) {
+                    fail("should not throw an InterruptedException");
+                }
+                return actualRef.get();
+            }
+
+            @Override
+            public Account getAccount() {
+                return ACCOUNT;
+            }
+        };
+        validateSuccessfulTokenFetchingLifecycle(fetcherWithOptions, AUTH_TOKEN_TYPE);
+        validateSuccessfulTokenFetchingLifecycle(fetcherWithOptions, AUTH_EXPIRING_TOKEN_TYPE);
+    }
+
+    /**
+     * Test successful getAuthToken() using a future with customTokens=false without
+     * expiring tokens.
+     */
+    public void testGetAuthTokenWithCallback_Options_Handler_CustomToken_Success()
+            throws IOException, AuthenticatorException, OperationCanceledException {
+        addAccountExplicitly(CUSTOM_TOKEN_ACCOUNT, ACCOUNT_PASSWORD, null);
+        final HandlerThread handlerThread = new HandlerThread("accounts.test");
+        handlerThread.start();
+        TokenFetcher fetcherWithOptions = new TokenFetcher() {
+            @Override
+            public Bundle fetch(String tokenType)
+                    throws OperationCanceledException, AuthenticatorException, IOException {
+                final AtomicReference<Bundle> actualRef = new AtomicReference<>();
+                final CountDownLatch latch = new CountDownLatch(1);
+
+                AccountManagerCallback<Bundle> callback = new AccountManagerCallback<Bundle>() {
+                    @Override
+                    public void run(AccountManagerFuture<Bundle> bundleFuture) {
+                        Bundle resultBundle = null;
+                        try {
+                            resultBundle = bundleFuture.getResult();
+                            actualRef.set(resultBundle);
+                        } catch (OperationCanceledException e) {
+                            fail("should not throw an OperationCanceledException");
+                        } catch (IOException e) {
+                            fail("should not throw an IOException");
+                        } catch (AuthenticatorException e) {
+                            fail("should not throw an AuthenticatorException");
+                        } finally {
+                            latch.countDown();
+                        }
+                    }
+                };
+
+                am.getAuthToken(getAccount(),
+                        tokenType,
+                        OPTIONS_BUNDLE,
+                        false /* no failure notification */,
+                        callback,
+                        new Handler(handlerThread.getLooper()));
+
+                // Wait with timeout for the callback to do its work
+                try {
+                    latch.await(LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+                } catch (InterruptedException e) {
+                    fail("should not throw an InterruptedException");
+                }
+                return actualRef.get();
+            }
+
+            @Override
+            public Account getAccount() {
+                return CUSTOM_TOKEN_ACCOUNT;
+            }
+        };
+        validateSuccessfulTokenFetchingLifecycle(fetcherWithOptions, AUTH_TOKEN_TYPE);
+        validateSuccessfulTokenFetchingLifecycle(fetcherWithOptions, AUTH_EXPIRING_TOKEN_TYPE);
+    }
+
+    /**
      * Test getAuthToken() with callback and handler
      */
     public void testGetAuthTokenWithCallbackAndHandler() throws IOException, AuthenticatorException,
@@ -837,6 +1193,7 @@
         final CountDownLatch latch = new CountDownLatch(1);
 
         AccountManagerCallback<Bundle> callback = new AccountManagerCallback<Bundle>() {
+            @Override
             public void run(AccountManagerFuture<Bundle> bundleFuture) {
 
                 Bundle resultBundle = null;
@@ -880,37 +1237,6 @@
     }
 
     /**
-     * test getAuthToken() with options
-     */
-    public void testGetAuthTokenWithOptions() throws IOException, AuthenticatorException,
-            OperationCanceledException {
-
-        addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
-
-        AccountManagerFuture<Bundle> futureBundle = am.getAuthToken(ACCOUNT,
-                AUTH_TOKEN_TYPE,
-                OPTIONS_BUNDLE,
-                mActivity,
-                null /* no callback */,
-                null /* no handler */
-        );
-
-        Bundle resultBundle = futureBundle.getResult();
-
-        assertTrue(futureBundle.isDone());
-        assertNotNull(resultBundle);
-
-        // Assert returned result
-        validateAccountAndAuthTokenResult(resultBundle);
-
-        validateOptions(null, mockAuthenticator.mOptionsAddAccount);
-        validateOptions(null, mockAuthenticator.mOptionsUpdateCredentials);
-        validateOptions(null, mockAuthenticator.mOptionsConfirmCredentials);
-        validateOptions(OPTIONS_BUNDLE, mockAuthenticator.mOptionsGetAuthToken);
-        validateSystemOptions(mockAuthenticator.mOptionsGetAuthToken);
-    }
-
-    /**
      * test getAuthToken() with options and callback and handler
      */
     public void testGetAuthTokenWithOptionsAndCallback() throws IOException,
@@ -928,15 +1254,14 @@
         final CountDownLatch latch = new CountDownLatch(1);
 
         AccountManagerCallback<Bundle> callback = new AccountManagerCallback<Bundle>() {
+            @Override
             public void run(AccountManagerFuture<Bundle> bundleFuture) {
 
                 Bundle resultBundle = null;
                 try {
                     resultBundle = bundleFuture.getResult();
-
                     // Assert returned result
                     validateAccountAndAuthTokenResult(resultBundle);
-
                 } catch (OperationCanceledException e) {
                     fail("should not throw an OperationCanceledException");
                 } catch (IOException e) {
@@ -1039,7 +1364,6 @@
         validateOptions(null, mockAuthenticator.mOptionsUpdateCredentials);
         validateOptions(null, mockAuthenticator.mOptionsConfirmCredentials);
         validateOptions(null, mockAuthenticator.mOptionsGetAuthToken);
-
     }
 
     /**
@@ -1063,10 +1387,85 @@
     }
 
     /**
+     * Tests the setting of lastAuthenticatedTime on adding account
+     */
+    public void testLastAuthenticatedTimeAfterAddAccount() throws IOException,
+            AuthenticatorException, OperationCanceledException {
+        assertTrue(addAccountAndReturnAccountAddedTime(ACCOUNT, ACCOUNT_PASSWORD) > 0);
+    }
+
+    /**
+     * Test confirmCredentials() for account not on device. Just that no error
+     * should be thrown.
+     */
+    public void testConfirmCredentialsAccountNotOnDevice() throws IOException,
+            AuthenticatorException, OperationCanceledException {
+
+        Account account = new Account("AccountNotOnThisDevice", ACCOUNT_TYPE);
+        AccountManagerFuture<Bundle> futureBundle = am.confirmCredentials(account,
+                OPTIONS_BUNDLE,
+                mActivity,
+                null /* callback */,
+                null /* handler */);
+
+        futureBundle.getResult();
+    }
+
+    /**
+     * Tests the setting of lastAuthenticatedTime on confirmCredentials being
+     * successful.
+     */
+    public void testLastAuthenticatedTimeAfterConfirmCredentialsSuccess() throws IOException,
+            AuthenticatorException, OperationCanceledException {
+
+        long accountAddTime = addAccountAndReturnAccountAddedTime(ACCOUNT, ACCOUNT_PASSWORD);
+
+        // Now this confirm credentials call returns true, which in turn
+        // should update the last authenticated timestamp.
+        Bundle result = am.confirmCredentials(ACCOUNT,
+                OPTIONS_BUNDLE, /* options */
+                null, /* activity */
+                null /* callback */,
+                null /* handler */).getResult();
+        long confirmedCredTime = result.getLong(
+                AccountManager.KEY_LAST_AUTHENTICATED_TIME, -1);
+        assertTrue(confirmedCredTime > accountAddTime);
+    }
+
+    /**
+     * Tests the setting of lastAuthenticatedTime on updateCredentials being
+     * successful.
+     */
+    public void testLastAuthenticatedTimeAfterUpdateCredentialsSuccess() throws IOException,
+            AuthenticatorException, OperationCanceledException {
+
+        long accountAddTime = addAccountAndReturnAccountAddedTime(ACCOUNT, ACCOUNT_PASSWORD);
+
+        am.updateCredentials(ACCOUNT,
+                AUTH_TOKEN_TYPE,
+                OPTIONS_BUNDLE,
+                mActivity,
+                null /* callback */,
+                null /* handler */).getResult();
+        long updateCredTime = getLastAuthenticatedTime(ACCOUNT);
+        assertTrue(updateCredTime > accountAddTime);
+    }
+
+    /**
+     * LastAuthenticatedTime on setPassword should not be disturbed.
+     */
+    public void testLastAuthenticatedTimeAfterSetPassword() throws IOException,
+            AuthenticatorException, OperationCanceledException {
+        long accountAddTime = addAccountAndReturnAccountAddedTime(ACCOUNT, ACCOUNT_PASSWORD);
+        mockAuthenticator.callSetPassword();
+        long setPasswordTime = getLastAuthenticatedTime(ACCOUNT);
+        assertTrue(setPasswordTime == accountAddTime);
+    }
+
+    /**
      * Test confirmCredentials() with callback
      */
-    public void testConfirmCredentialsWithCallbackAndHandler() throws IOException,
-            AuthenticatorException, OperationCanceledException {
+    public void testConfirmCredentialsWithCallbackAndHandler() {
 
         addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
 
@@ -1074,12 +1473,10 @@
         testConfirmCredentialsWithCallbackAndHandler(new Handler(Looper.getMainLooper()));
     }
 
-    private void testConfirmCredentialsWithCallbackAndHandler(Handler handler) throws IOException,
-            AuthenticatorException, OperationCanceledException {
-
+    private void testConfirmCredentialsWithCallbackAndHandler(Handler handler) {
         final CountDownLatch latch = new CountDownLatch(1);
-
         AccountManagerCallback<Bundle> callback = new AccountManagerCallback<Bundle>() {
+            @Override
             public void run(AccountManagerFuture<Bundle> bundleFuture) {
 
                 Bundle resultBundle = null;
@@ -1102,18 +1499,14 @@
                 }
             }
         };
-
         AccountManagerFuture<Bundle> futureBundle = am.confirmCredentials(ACCOUNT,
                 OPTIONS_BUNDLE,
                 mActivity,
                 callback,
                 handler);
-
-        futureBundle.getResult();
-
         // Wait with timeout for the callback to do its work
         try {
-            latch.await(LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+            latch.await(3 * LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
         } catch (InterruptedException e) {
             fail("should not throw an InterruptedException");
         }
@@ -1160,6 +1553,7 @@
         final CountDownLatch latch = new CountDownLatch(1);
 
         AccountManagerCallback<Bundle> callback = new AccountManagerCallback<Bundle>() {
+            @Override
             public void run(AccountManagerFuture<Bundle> bundleFuture) {
 
                 Bundle resultBundle = null;
@@ -1231,6 +1625,7 @@
         final CountDownLatch latch = new CountDownLatch(1);
 
         AccountManagerCallback<Bundle> callback = new AccountManagerCallback<Bundle>() {
+            @Override
             public void run(AccountManagerFuture<Bundle> bundleFuture) {
                 try {
                     // Assert returned result
@@ -1292,6 +1687,7 @@
         final CountDownLatch latch = new CountDownLatch(1);
 
         OnAccountsUpdateListener listener = new OnAccountsUpdateListener() {
+            @Override
             public void onAccountsUpdated(Account[] accounts) {
                 latch.countDown();
             }
@@ -1334,6 +1730,7 @@
         final CountDownLatch latch = new CountDownLatch(1);
 
         OnAccountsUpdateListener listener = new OnAccountsUpdateListener() {
+            @Override
             public void onAccountsUpdated(Account[] accounts) {
                 fail("should not be called");
             }
@@ -1424,6 +1821,7 @@
 
     private AccountManagerCallback<Boolean> getAssertTrueCallback(final CountDownLatch latch) {
         return new AccountManagerCallback<Boolean>() {
+            @Override
             public void run(AccountManagerFuture<Boolean> booleanFuture) {
                 try {
                     // Assert returned result should be TRUE
@@ -1439,6 +1837,7 @@
 
     private AccountManagerCallback<Boolean> getAssertFalseCallback(final CountDownLatch latch) {
         return new AccountManagerCallback<Boolean>() {
+            @Override
             public void run(AccountManagerFuture<Boolean> booleanFuture) {
                 try {
                     // Assert returned result should be FALSE
@@ -1519,11 +1918,37 @@
         waitForLatch(latch);
     }
 
+    private long getLastAuthenticatedTime(Account account) throws OperationCanceledException,
+            AuthenticatorException, IOException {
+        Bundle options = new Bundle();
+        options.putBoolean(MockAccountAuthenticator.KEY_RETURN_INTENT, true);
+        // Not really confirming, but a way to get last authenticated timestamp
+        Bundle result = am.confirmCredentials(account,
+                options,// OPTIONS_BUNDLE,
+                null, /* activity */
+                null /* callback */,
+                null /* handler */).getResult();
+        return result.getLong(
+                AccountManager.KEY_LAST_AUTHENTICATED_TIME, -1);
+    }
+
+    private long addAccountAndReturnAccountAddedTime(Account account, String password)
+            throws OperationCanceledException, AuthenticatorException, IOException {
+        addAccount(am,
+                ACCOUNT_TYPE,
+                AUTH_TOKEN_TYPE,
+                REQUIRED_FEATURES,
+                OPTIONS_BUNDLE,
+                mActivity,
+                null /* callback */,
+                null /* handler */);
+        return getLastAuthenticatedTime(account);
+    }
+
     /**
      * Tests that AccountManagerService is properly caching data.
      */
-    public void testGetsAreCached() throws IOException, AuthenticatorException,
-            OperationCanceledException {
+    public void testGetsAreCached() {
 
         // Add an account,
         assertEquals(false, isAccountPresent(am.getAccounts(), ACCOUNT));
diff --git a/tests/tests/accounts/src/android/accounts/cts/AccountManagerUnaffiliatedAuthenticatorTests.java b/tests/tests/accounts/src/android/accounts/cts/AccountManagerUnaffiliatedAuthenticatorTests.java
new file mode 100644
index 0000000..2068f4c
--- /dev/null
+++ b/tests/tests/accounts/src/android/accounts/cts/AccountManagerUnaffiliatedAuthenticatorTests.java
@@ -0,0 +1,226 @@
+/*
+ * Copyright (C) 2015 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.accounts.cts;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AccountManagerFuture;
+import android.accounts.AuthenticatorException;
+import android.accounts.OperationCanceledException;
+import android.accounts.cts.common.AuthenticatorContentProvider;
+import android.accounts.cts.common.Fixtures;
+import android.content.ContentProviderClient;
+import android.content.ContentResolver;
+import android.os.RemoteException;
+import android.test.AndroidTestCase;
+
+import java.io.IOException;
+
+/**
+ * Tests for AccountManager and AbstractAccountAuthenticator related behavior using {@link
+ * android.accounts.cts.common.TestAccountAuthenticator} instances signed with different keys than
+ * the caller. This is important to test that portion of the {@link AccountManager} API intended
+ * for {@link android.accounts.AbstractAccountAuthenticator} implementers.
+ * <p>
+ * You can run those unit tests with the following command line:
+ * <p>
+ *  adb shell am instrument
+ *   -e debug false -w
+ *   -e class android.accounts.cts.AccountManagerUnaffiliatedAuthenticatorTests
+ * android.accounts.cts/android.support.test.runner.AndroidJUnitRunner
+ */
+public class AccountManagerUnaffiliatedAuthenticatorTests extends AndroidTestCase {
+
+    private AccountManager mAccountManager;
+    private ContentProviderClient mProviderClient;
+
+    @Override
+    public void setUp() throws Exception {
+        // bind to the diagnostic service and set it up.
+        mAccountManager = AccountManager.get(getContext());
+        ContentResolver resolver = getContext().getContentResolver();
+        mProviderClient = resolver.acquireContentProviderClient(
+                AuthenticatorContentProvider.AUTHORITY);
+        /*
+         * This will install a bunch of accounts on the device
+         * (see Fixtures.getFixtureAccountNames()).
+         */
+        mProviderClient.call(AuthenticatorContentProvider.METHOD_SETUP, null, null);
+    }
+
+    @Override
+    public void tearDown() throws RemoteException {
+        try {
+            mProviderClient.call(AuthenticatorContentProvider.METHOD_TEARDOWN, null, null);
+        } finally {
+            mProviderClient.release();
+        }
+    }
+
+    public void testNotifyAccountAuthenticated() {
+        try {
+            mAccountManager.notifyAccountAuthenticated(
+                    Fixtures.ACCOUNT_UNAFFILIATED_FIXTURE_SUCCESS);
+            fail("Expected to just barf if the caller doesn't share a signature.");
+        } catch (SecurityException expected) {}
+    }
+
+    public void testEditProperties()  {
+        try {
+            mAccountManager.editProperties(
+                    Fixtures.TYPE_STANDARD_UNAFFILIATED,
+                    null, // activity
+                    null, // callback
+                    null); // handler
+            fail("Expecting a OperationCanceledException.");
+        } catch (SecurityException expected) {
+            
+        }
+    }
+
+    public void testAddAccountExplicitly() {
+        try {
+            mAccountManager.addAccountExplicitly(
+                    Fixtures.ACCOUNT_UNAFFILIATED_FIXTURE_SUCCESS,
+                    "shouldn't matter", // password
+                    null); // bundle
+            fail("addAccountExplicitly should just barf if the caller isn't permitted.");
+        } catch (SecurityException expected) {}
+    }
+
+    public void testRemoveAccount_withBooleanResult() {
+        try {
+            mAccountManager.removeAccount(
+                    Fixtures.ACCOUNT_UNAFFILIATED_FIXTURE_SUCCESS,
+                    null,
+                    null);
+            fail("removeAccount should just barf if the caller isn't permitted.");
+        } catch (SecurityException expected) {}
+    }
+
+    public void testRemoveAccount_withBundleResult() {
+        try {
+            mAccountManager.removeAccount(
+                    Fixtures.ACCOUNT_UNAFFILIATED_FIXTURE_SUCCESS,
+                    null, // Activity
+                    null,
+                    null);
+            fail("removeAccount should just barf if the caller isn't permitted.");
+        } catch (SecurityException expected) {}
+    }
+
+    public void testRemoveAccountExplicitly() {
+        try {
+            mAccountManager.removeAccountExplicitly(
+                    Fixtures.ACCOUNT_UNAFFILIATED_FIXTURE_SUCCESS);
+            fail("removeAccountExplicitly should just barf if the caller isn't permitted.");
+        } catch (SecurityException expected) {}
+    }
+
+    public void testGetPassword() {
+        try {
+            mAccountManager.getPassword(
+                    Fixtures.ACCOUNT_UNAFFILIATED_FIXTURE_SUCCESS);
+            fail("getPassword should just barf if the caller isn't permitted.");
+        } catch (SecurityException expected) {}
+    }
+
+    public void testSetPassword() {
+        try {
+            mAccountManager.setPassword(
+                    Fixtures.ACCOUNT_UNAFFILIATED_FIXTURE_SUCCESS,
+                    "Doesn't matter");
+            fail("setPassword should just barf if the caller isn't permitted.");
+        } catch (SecurityException expected) {}
+    }
+
+    public void testClearPassword() {
+        try {
+            mAccountManager.clearPassword(
+                    Fixtures.ACCOUNT_UNAFFILIATED_FIXTURE_SUCCESS);
+            fail("clearPassword should just barf if the caller isn't permitted.");
+        } catch (SecurityException expected) {}
+    }
+
+    public void testGetUserData() {
+        try {
+            mAccountManager.getUserData(
+                    Fixtures.ACCOUNT_UNAFFILIATED_FIXTURE_SUCCESS,
+                    "key");
+            fail("getUserData should just barf if the caller isn't permitted.");
+        } catch (SecurityException expected) {}
+    }
+
+    public void testSetUserData() {
+        try {
+            mAccountManager.setUserData(
+                    Fixtures.ACCOUNT_UNAFFILIATED_FIXTURE_SUCCESS,
+                    "key",
+                    "value");
+            fail("setUserData should just barf if the caller isn't permitted.");
+        } catch (SecurityException expected) {}
+    }
+
+    public void setAuthToken() {
+        try {
+            mAccountManager.setAuthToken(
+                    Fixtures.ACCOUNT_UNAFFILIATED_FIXTURE_SUCCESS,
+                    "tokenType",
+                    "token");
+            fail("setAuthToken should just barf if the caller isn't permitted.");
+        } catch (SecurityException expected) {}
+    }
+
+    public void testPeekAuthToken() {
+        try {
+            mAccountManager.peekAuthToken(
+                    Fixtures.ACCOUNT_UNAFFILIATED_FIXTURE_SUCCESS,
+                    "tokenType");
+            fail("peekAuthToken should just barf if the caller isn't permitted.");
+        } catch (SecurityException expected) {}
+    }
+
+    public void testGetAccounts() {
+        Account[] accounts = mAccountManager.getAccounts();
+        assertEquals(0, accounts.length);
+    }
+
+    public void testGetAccountsByType() {
+        Account[] accounts = mAccountManager.getAccountsByType(
+                Fixtures.TYPE_STANDARD_UNAFFILIATED);
+        assertEquals(0, accounts.length);
+    }
+
+    public void testGetAccountsByTypeAndFeatures()
+            throws OperationCanceledException, AuthenticatorException, IOException {
+        AccountManagerFuture<Account[]> future = mAccountManager.getAccountsByTypeAndFeatures(
+                Fixtures.TYPE_STANDARD_UNAFFILIATED,
+                new String[] { "doesn't matter" },
+                null,  // Callback
+                null);  // Handler
+        Account[] accounts = future.getResult();
+        assertEquals(0, accounts.length);
+    }
+
+    public void testGetAccountsByTypeForPackage() {
+        Account[] accounts = mAccountManager.getAccountsByTypeForPackage(
+                Fixtures.TYPE_STANDARD_UNAFFILIATED,
+                getContext().getPackageName());
+        assertEquals(0, accounts.length);
+    }
+}
+
diff --git a/tests/tests/accounts/src/android/accounts/cts/MockAccountAuthenticator.java b/tests/tests/accounts/src/android/accounts/cts/MockAccountAuthenticator.java
index b5804d9..c1b08de 100644
--- a/tests/tests/accounts/src/android/accounts/cts/MockAccountAuthenticator.java
+++ b/tests/tests/accounts/src/android/accounts/cts/MockAccountAuthenticator.java
@@ -24,19 +24,29 @@
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
+import android.util.Log;
 
 import java.util.ArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * A simple Mock Account Authenticator
  */
 public class MockAccountAuthenticator extends AbstractAccountAuthenticator {
+    private static String TAG = "AccountManagerTest";
 
     public static String KEY_ACCOUNT_INFO = "key_account_info";
     public static String KEY_ACCOUNT_AUTHENTICATOR_RESPONSE = "key_account_authenticator_response";
     public static String ACCOUNT_NAME_FOR_NEW_REMOVE_API = "call new removeAccount api";
+    // Key for triggering return intent flow
+    public static String KEY_RETURN_INTENT = "return an intent";
+    public static String ACCOUNT_NAME_FOR_NEW_REMOVE_API1 = "call new removeAccount api";
 
     private final Context mContext;
+    private final AtomicInteger mTokenCounter  = new AtomicInteger(0);
+    private final AtomicBoolean mIsRecentlyCalled = new AtomicBoolean(false);
+
     AccountAuthenticatorResponse mResponse;
     String mAccountType;
     String mAuthTokenType;
@@ -49,6 +59,7 @@
     String[] mFeatures;
 
     final ArrayList<String> mockFeatureList = new ArrayList<String>();
+    private final long mTokenDurationMillis = 1000; // 1 second
 
     public MockAccountAuthenticator(Context context) {
         super(context);
@@ -59,6 +70,18 @@
         mockFeatureList.add(AccountManagerTest.FEATURE_2);
     }
 
+    public long getTokenDurationMillis() {
+        return mTokenDurationMillis;
+    }
+
+    public boolean isRecentlyCalled() {
+        return mIsRecentlyCalled.getAndSet(false);
+    }
+
+    public String getLastTokenServed() {
+        return Integer.toString(mTokenCounter.get());
+    }
+
     public AccountAuthenticatorResponse getResponse() {
         return mResponse;
     }
@@ -96,12 +119,23 @@
         mFeatures = null;
     }
 
+    public void callAccountAuthenticated() {
+        AccountManager am = AccountManager.get(mContext);
+        am.notifyAccountAuthenticated(mAccount);
+    }
+
+    public void callSetPassword() {
+        AccountManager am = AccountManager.get(mContext);
+        am.setPassword(mAccount, "password");
+    }
+
     private Bundle createResultBundle() {
         Bundle result = new Bundle();
         result.putString(AccountManager.KEY_ACCOUNT_NAME, AccountManagerTest.ACCOUNT_NAME);
         result.putString(AccountManager.KEY_ACCOUNT_TYPE, AccountManagerTest.ACCOUNT_TYPE);
-        result.putString(AccountManager.KEY_AUTHTOKEN, AccountManagerTest.AUTH_TOKEN);
-
+        result.putString(
+                AccountManager.KEY_AUTHTOKEN,
+                Integer.toString(mTokenCounter.incrementAndGet()));
         return result;
     }
 
@@ -112,13 +146,13 @@
     public Bundle addAccount(AccountAuthenticatorResponse response, String accountType,
             String authTokenType, String[] requiredFeatures, Bundle options)
             throws NetworkErrorException {
-
         this.mResponse = response;
         this.mAccountType = accountType;
         this.mAuthTokenType = authTokenType;
         this.mRequiredFeatures = requiredFeatures;
         this.mOptionsAddAccount = options;
-
+        AccountManager am = AccountManager.get(mContext);
+        am.addAccountExplicitly(AccountManagerTest.ACCOUNT, "fakePassword", null);
         return createResultBundle();
     }
 
@@ -128,12 +162,10 @@
     @Override
     public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account,
             String authTokenType, Bundle options) throws NetworkErrorException {
-
         this.mResponse = response;
         this.mAccount = account;
         this.mAuthTokenType = authTokenType;
         this.mOptionsUpdateCredentials = options;
-
         return createResultBundle();
     }
 
@@ -144,10 +176,8 @@
      */
     @Override
     public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
-
         this.mResponse = response;
         this.mAccountType = accountType;
-
         return createResultBundle();
     }
 
@@ -157,13 +187,17 @@
     @Override
     public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account,
             Bundle options) throws NetworkErrorException {
-
         this.mResponse = response;
         this.mAccount = account;
         this.mOptionsConfirmCredentials = options;
-
         Bundle result = new Bundle();
-        result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true);
+        if (options.containsKey(KEY_RETURN_INTENT)) {
+            Intent intent = new Intent();
+            intent.setClassName("android.accounts.cts", "android.accounts.cts.AccountDummyActivity");
+            result.putParcelable(AccountManager.KEY_INTENT, intent);
+        } else {
+            result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true);
+        }
 
         return result;
     }
@@ -172,15 +206,35 @@
      * Gets the authtoken for an account.
      */
     @Override
-    public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account,
-            String authTokenType, Bundle options) throws NetworkErrorException {
-
+    public Bundle getAuthToken(
+            AccountAuthenticatorResponse response,
+            Account account,
+            String authTokenType,
+            Bundle options) throws NetworkErrorException {
+        Log.w(TAG, "MockAuth - getAuthToken@" + System.currentTimeMillis());
+        mIsRecentlyCalled.set(true);
         this.mResponse = response;
         this.mAccount = account;
         this.mAuthTokenType = authTokenType;
         this.mOptionsGetAuthToken = options;
+        Bundle result = new Bundle();
 
-        return createResultBundle();
+        result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
+        result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
+        String token;
+        if (AccountManagerTest.AUTH_EXPIRING_TOKEN_TYPE.equals(authTokenType)) {
+            /*
+             * The resultant token should simply be the expiration timestamp. E.g. the time after
+             * which getting a new AUTH_EXPIRING_TOKEN_TYPE typed token will return a different
+             * value.
+             */
+            long expiry = System.currentTimeMillis() + mTokenDurationMillis;
+            result.putLong(AbstractAccountAuthenticator.KEY_CUSTOM_TOKEN_EXPIRY, expiry);
+        }
+        result.putString(
+                AccountManager.KEY_AUTHTOKEN,
+                Integer.toString(mTokenCounter.incrementAndGet()));
+        return result;
     }
 
     /**
@@ -189,7 +243,6 @@
     @Override
     public String getAuthTokenLabel(String authTokenType) {
         this.mAuthTokenType = authTokenType;
-
         return AccountManagerTest.AUTH_TOKEN_LABEL;
     }
 
@@ -242,4 +295,4 @@
         }
         return result;
     }
-}
\ No newline at end of file
+}
diff --git a/tests/tests/accounts/src/android/accounts/cts/MockCustomTokenAccountService.java b/tests/tests/accounts/src/android/accounts/cts/MockCustomTokenAccountService.java
new file mode 100644
index 0000000..ea06a41
--- /dev/null
+++ b/tests/tests/accounts/src/android/accounts/cts/MockCustomTokenAccountService.java
@@ -0,0 +1,13 @@
+package android.accounts.cts;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+
+public class MockCustomTokenAccountService extends Service {
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        return AccountManagerTest.getMockAuthenticator(this).getIBinder();
+    }
+}
diff --git a/tests/tests/admin/AndroidTest.xml b/tests/tests/admin/AndroidTest.xml
new file mode 100644
index 0000000..c29d404
--- /dev/null
+++ b/tests/tests/admin/AndroidTest.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="CTS device admin test config">
+    <include name="common-config" />
+    <option name="run-command:run-command" value="dpm set-active-admin android.deviceadmin.cts/.CtsDeviceAdminReceiver" />
+    <option name="run-command:run-command" value="dpm set-active-admin android.deviceadmin.cts/.CtsDeviceAdminReceiver2" />
+</configuration>
diff --git a/tests/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java b/tests/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java
index 513b67e..66e12c0 100644
--- a/tests/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java
+++ b/tests/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java
@@ -68,6 +68,8 @@
             "VcUyQ1/e7WQgOaBHi9TefUJi+4PSVSluOXon\n" +
             "-----END CERTIFICATE-----";
 
+    private static final String MANAGED_PROVISIONING_PKG = "com.android.managedprovisioning";
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -133,26 +135,29 @@
                 mDevicePolicyManager.getPasswordQuality(mComponent));
         assertFalse(mDevicePolicyManager.isActivePasswordSufficient());
 
-        assertTrue(mDevicePolicyManager.resetPassword("123", 0));
-        assertTrue(mDevicePolicyManager.resetPassword("abcd", 0));
-        assertTrue(mDevicePolicyManager.resetPassword("abcd123", 0));
-        assertTrue(mDevicePolicyManager.isActivePasswordSufficient());
+        String caseDescription = "initial";
+        assertPasswordSucceeds("1234", caseDescription);
+        assertPasswordSucceeds("abcd", caseDescription);
+        assertPasswordSucceeds("abcd1234", caseDescription);
 
         mDevicePolicyManager.setPasswordMinimumLength(mComponent, 10);
+        caseDescription = "minimum password length = 10";
         assertEquals(10, mDevicePolicyManager.getPasswordMinimumLength(mComponent));
         assertFalse(mDevicePolicyManager.isActivePasswordSufficient());
 
-        assertFalse(mDevicePolicyManager.resetPassword("123", 0));
-        assertFalse(mDevicePolicyManager.resetPassword("abcd", 0));
-        assertFalse(mDevicePolicyManager.resetPassword("abcd123", 0));
+        assertPasswordFails("1234", caseDescription);
+        assertPasswordFails("abcd", caseDescription);
+        assertPasswordFails("abcd1234", caseDescription);
 
-        mDevicePolicyManager.setPasswordMinimumLength(mComponent, 3);
-        assertEquals(3, mDevicePolicyManager.getPasswordMinimumLength(mComponent));
+        mDevicePolicyManager.setPasswordMinimumLength(mComponent, 4);
+        caseDescription = "minimum password length = 4";
+        assertEquals(4, mDevicePolicyManager.getPasswordMinimumLength(
+                mComponent));
         assertTrue(mDevicePolicyManager.isActivePasswordSufficient());
 
-        assertTrue(mDevicePolicyManager.resetPassword("123", 0));
-        assertTrue(mDevicePolicyManager.resetPassword("abcd", 0));
-        assertTrue(mDevicePolicyManager.resetPassword("abcd123", 0));
+        assertPasswordSucceeds("1234", caseDescription);
+        assertPasswordSucceeds("abcd", caseDescription);
+        assertPasswordSucceeds("abcd1234", caseDescription);
     }
 
     public void testPasswordQuality_numeric() {
@@ -166,26 +171,29 @@
                 mDevicePolicyManager.getPasswordQuality(mComponent));
         assertFalse(mDevicePolicyManager.isActivePasswordSufficient());
 
-        assertTrue(mDevicePolicyManager.resetPassword("123", 0));
-        assertTrue(mDevicePolicyManager.resetPassword("abcd", 0));
-        assertTrue(mDevicePolicyManager.resetPassword("abcd123", 0));
-        assertTrue(mDevicePolicyManager.isActivePasswordSufficient());
+        String caseDescription = "initial";
+        assertPasswordSucceeds("1234", caseDescription);
+        assertPasswordSucceeds("abcd", caseDescription);
+        assertPasswordSucceeds("abcd1234", caseDescription);
 
         mDevicePolicyManager.setPasswordMinimumLength(mComponent, 10);
+        caseDescription = "minimum password length = 10";
         assertEquals(10, mDevicePolicyManager.getPasswordMinimumLength(mComponent));
         assertFalse(mDevicePolicyManager.isActivePasswordSufficient());
 
-        assertFalse(mDevicePolicyManager.resetPassword("123", 0));
-        assertFalse(mDevicePolicyManager.resetPassword("abcd", 0));
-        assertFalse(mDevicePolicyManager.resetPassword("abcd123", 0));
+        assertPasswordFails("1234", caseDescription);
+        assertPasswordFails("abcd", caseDescription);
+        assertPasswordFails("abcd1234", caseDescription);
 
-        mDevicePolicyManager.setPasswordMinimumLength(mComponent, 3);
-        assertEquals(3, mDevicePolicyManager.getPasswordMinimumLength(mComponent));
+        mDevicePolicyManager.setPasswordMinimumLength(mComponent, 4);
+        caseDescription = "minimum password length = 4";
+        assertEquals(4, mDevicePolicyManager.getPasswordMinimumLength(
+                mComponent));
         assertTrue(mDevicePolicyManager.isActivePasswordSufficient());
 
-        assertTrue(mDevicePolicyManager.resetPassword("123", 0));
-        assertTrue(mDevicePolicyManager.resetPassword("abcd", 0));
-        assertTrue(mDevicePolicyManager.resetPassword("abcd123", 0));
+        assertPasswordSucceeds("1234", caseDescription);
+        assertPasswordSucceeds("abcd", caseDescription);
+        assertPasswordSucceeds("abcd1234", caseDescription);
     }
 
     public void testPasswordQuality_alphabetic() {
@@ -199,26 +207,29 @@
                 mDevicePolicyManager.getPasswordQuality(mComponent));
         assertFalse(mDevicePolicyManager.isActivePasswordSufficient());
 
-        assertFalse(mDevicePolicyManager.resetPassword("123", 0));
-        assertTrue(mDevicePolicyManager.resetPassword("abcd", 0));
-        assertTrue(mDevicePolicyManager.resetPassword("abcd123", 0));
-        assertTrue(mDevicePolicyManager.isActivePasswordSufficient());
+        String caseDescription = "initial";
+        assertPasswordFails("1234", caseDescription);
+        assertPasswordSucceeds("abcd", caseDescription);
+        assertPasswordSucceeds("abcd1234", caseDescription);
 
         mDevicePolicyManager.setPasswordMinimumLength(mComponent, 10);
+        caseDescription = "minimum password length = 10";
         assertEquals(10, mDevicePolicyManager.getPasswordMinimumLength(mComponent));
         assertFalse(mDevicePolicyManager.isActivePasswordSufficient());
 
-        assertFalse(mDevicePolicyManager.resetPassword("123", 0));
-        assertFalse(mDevicePolicyManager.resetPassword("abcd", 0));
-        assertFalse(mDevicePolicyManager.resetPassword("abcd123", 0));
+        assertPasswordFails("1234", caseDescription);
+        assertPasswordFails("abcd", caseDescription);
+        assertPasswordFails("abcd1234", caseDescription);
 
-        mDevicePolicyManager.setPasswordMinimumLength(mComponent, 3);
-        assertEquals(3, mDevicePolicyManager.getPasswordMinimumLength(mComponent));
+        mDevicePolicyManager.setPasswordMinimumLength(mComponent, 4);
+        caseDescription = "minimum password length = 4";
+        assertEquals(4, mDevicePolicyManager.getPasswordMinimumLength(
+                mComponent));
         assertTrue(mDevicePolicyManager.isActivePasswordSufficient());
 
-        assertFalse(mDevicePolicyManager.resetPassword("123", 0));
-        assertTrue(mDevicePolicyManager.resetPassword("abcd", 0));
-        assertTrue(mDevicePolicyManager.resetPassword("abcd123", 0));
+        assertPasswordFails("1234", caseDescription);
+        assertPasswordSucceeds("abcd", caseDescription);
+        assertPasswordSucceeds("abcd1234", caseDescription);
     }
 
     public void testPasswordQuality_alphanumeric() {
@@ -232,26 +243,29 @@
                 mDevicePolicyManager.getPasswordQuality(mComponent));
         assertFalse(mDevicePolicyManager.isActivePasswordSufficient());
 
-        assertFalse(mDevicePolicyManager.resetPassword("123", 0));
-        assertFalse(mDevicePolicyManager.resetPassword("abcd", 0));
-        assertTrue(mDevicePolicyManager.resetPassword("abcd123", 0));
-        assertTrue(mDevicePolicyManager.isActivePasswordSufficient());
+        String caseDescription = "initial";
+        assertPasswordFails("1234", caseDescription);
+        assertPasswordFails("abcd", caseDescription);
+        assertPasswordSucceeds("abcd1234", caseDescription);
 
         mDevicePolicyManager.setPasswordMinimumLength(mComponent, 10);
+        caseDescription = "minimum password length = 10";
         assertEquals(10, mDevicePolicyManager.getPasswordMinimumLength(mComponent));
         assertFalse(mDevicePolicyManager.isActivePasswordSufficient());
 
-        assertFalse(mDevicePolicyManager.resetPassword("123", 0));
-        assertFalse(mDevicePolicyManager.resetPassword("abcd", 0));
-        assertFalse(mDevicePolicyManager.resetPassword("abcd123", 0));
+        assertPasswordFails("1234", caseDescription);
+        assertPasswordFails("abcd", caseDescription);
+        assertPasswordFails("abcd1234", caseDescription);
 
-        mDevicePolicyManager.setPasswordMinimumLength(mComponent, 3);
-        assertEquals(3, mDevicePolicyManager.getPasswordMinimumLength(mComponent));
+        mDevicePolicyManager.setPasswordMinimumLength(mComponent, 4);
+        caseDescription = "minimum password length = 4";
+        assertEquals(4, mDevicePolicyManager.getPasswordMinimumLength(
+                mComponent));
         assertTrue(mDevicePolicyManager.isActivePasswordSufficient());
 
-        assertFalse(mDevicePolicyManager.resetPassword("123", 0));
-        assertFalse(mDevicePolicyManager.resetPassword("abcd", 0));
-        assertTrue(mDevicePolicyManager.resetPassword("abcd123", 0));
+        assertPasswordFails("1234", caseDescription);
+        assertPasswordFails("abcd", caseDescription);
+        assertPasswordSucceeds("abcd1234", caseDescription);
     }
 
     public void testPasswordQuality_complexUpperCase() {
@@ -265,26 +279,29 @@
         resetComplexPasswordRestrictions();
 
         String caseDescription = "minimum UpperCase=0";
-        assertPasswordSucceeds("abc", caseDescription);
-        assertPasswordSucceeds("aBc", caseDescription);
-        assertPasswordSucceeds("ABC", caseDescription);
+        assertPasswordSucceeds("abc1", caseDescription);
+        assertPasswordSucceeds("aBc1", caseDescription);
+        assertPasswordSucceeds("ABC1", caseDescription);
         assertPasswordSucceeds("ABCD", caseDescription);
+        assertPasswordFails("123", caseDescription); // too short
 
         mDevicePolicyManager.setPasswordMinimumUpperCase(mComponent, 1);
         assertEquals(1, mDevicePolicyManager.getPasswordMinimumUpperCase(mComponent));
         caseDescription = "minimum UpperCase=1";
-        assertPasswordFails("abc", caseDescription);
-        assertPasswordSucceeds("aBc", caseDescription);
-        assertPasswordSucceeds("ABC", caseDescription);
+        assertPasswordFails("abc1", caseDescription);
+        assertPasswordSucceeds("aBc1", caseDescription);
+        assertPasswordSucceeds("ABC1", caseDescription);
         assertPasswordSucceeds("ABCD", caseDescription);
+        assertPasswordFails("123", caseDescription); // too short
 
         mDevicePolicyManager.setPasswordMinimumUpperCase(mComponent, 3);
         assertEquals(3, mDevicePolicyManager.getPasswordMinimumUpperCase(mComponent));
         caseDescription = "minimum UpperCase=3";
-        assertPasswordFails("abc", caseDescription);
-        assertPasswordFails("aBC", caseDescription);
-        assertPasswordSucceeds("ABC", caseDescription);
+        assertPasswordFails("abc1", caseDescription);
+        assertPasswordFails("aBC1", caseDescription);
+        assertPasswordSucceeds("ABC1", caseDescription);
         assertPasswordSucceeds("ABCD", caseDescription);
+        assertPasswordFails("123", caseDescription); // too short
     }
 
     public void testPasswordQuality_complexLowerCase() {
@@ -299,25 +316,28 @@
 
         String caseDescription = "minimum LowerCase=0";
         assertPasswordSucceeds("ABCD", caseDescription);
-        assertPasswordSucceeds("aBC", caseDescription);
-        assertPasswordSucceeds("abc", caseDescription);
+        assertPasswordSucceeds("aBC1", caseDescription);
+        assertPasswordSucceeds("abc1", caseDescription);
         assertPasswordSucceeds("abcd", caseDescription);
+        assertPasswordFails("123", caseDescription); // too short
 
         mDevicePolicyManager.setPasswordMinimumLowerCase(mComponent, 1);
         assertEquals(1, mDevicePolicyManager.getPasswordMinimumLowerCase(mComponent));
         caseDescription = "minimum LowerCase=1";
         assertPasswordFails("ABCD", caseDescription);
-        assertPasswordSucceeds("aBC", caseDescription);
-        assertPasswordSucceeds("abc", caseDescription);
+        assertPasswordSucceeds("aBC1", caseDescription);
+        assertPasswordSucceeds("abc1", caseDescription);
         assertPasswordSucceeds("abcd", caseDescription);
+        assertPasswordFails("123", caseDescription); // too short
 
         mDevicePolicyManager.setPasswordMinimumLowerCase(mComponent, 3);
         assertEquals(3, mDevicePolicyManager.getPasswordMinimumLowerCase(mComponent));
         caseDescription = "minimum LowerCase=3";
         assertPasswordFails("ABCD", caseDescription);
-        assertPasswordFails("aBC", caseDescription);
-        assertPasswordSucceeds("abc", caseDescription);
+        assertPasswordFails("aBC1", caseDescription);
+        assertPasswordSucceeds("abc1", caseDescription);
         assertPasswordSucceeds("abcd", caseDescription);
+        assertPasswordFails("123", caseDescription); // too short
     }
 
     public void testPasswordQuality_complexLetters() {
@@ -332,25 +352,28 @@
 
         String caseDescription = "minimum Letters=0";
         assertPasswordSucceeds("1234", caseDescription);
-        assertPasswordSucceeds("a23", caseDescription);
-        assertPasswordSucceeds("abc", caseDescription);
+        assertPasswordSucceeds("a123", caseDescription);
+        assertPasswordSucceeds("abc1", caseDescription);
         assertPasswordSucceeds("abcd", caseDescription);
+        assertPasswordFails("123", caseDescription); // too short
 
         mDevicePolicyManager.setPasswordMinimumLetters(mComponent, 1);
         assertEquals(1, mDevicePolicyManager.getPasswordMinimumLetters(mComponent));
         caseDescription = "minimum Letters=1";
         assertPasswordFails("1234", caseDescription);
-        assertPasswordSucceeds("a23", caseDescription);
-        assertPasswordSucceeds("abc", caseDescription);
+        assertPasswordSucceeds("a123", caseDescription);
+        assertPasswordSucceeds("abc1", caseDescription);
         assertPasswordSucceeds("abcd", caseDescription);
+        assertPasswordFails("123", caseDescription); // too short
 
         mDevicePolicyManager.setPasswordMinimumLetters(mComponent, 3);
         assertEquals(3, mDevicePolicyManager.getPasswordMinimumLetters(mComponent));
         caseDescription = "minimum Letters=3";
         assertPasswordFails("1234", caseDescription);
-        assertPasswordFails("a23", caseDescription);
-        assertPasswordSucceeds("abc", caseDescription);
+        assertPasswordFails("a123", caseDescription);
+        assertPasswordSucceeds("abc1", caseDescription);
         assertPasswordSucceeds("abcd", caseDescription);
+        assertPasswordFails("123", caseDescription); // too short
     }
 
     public void testPasswordQuality_complexNumeric() {
@@ -365,25 +388,28 @@
 
         String caseDescription = "minimum Numeric=0";
         assertPasswordSucceeds("abcd", caseDescription);
-        assertPasswordSucceeds("1bc", caseDescription);
-        assertPasswordSucceeds("123", caseDescription);
+        assertPasswordSucceeds("1abc", caseDescription);
+        assertPasswordSucceeds("123a", caseDescription);
         assertPasswordSucceeds("1234", caseDescription);
+        assertPasswordFails("123", caseDescription); // too short
 
         mDevicePolicyManager.setPasswordMinimumNumeric(mComponent, 1);
         assertEquals(1, mDevicePolicyManager.getPasswordMinimumNumeric(mComponent));
         caseDescription = "minimum Numeric=1";
         assertPasswordFails("abcd", caseDescription);
-        assertPasswordSucceeds("1bc", caseDescription);
-        assertPasswordSucceeds("123", caseDescription);
+        assertPasswordSucceeds("1abc", caseDescription);
+        assertPasswordSucceeds("123a", caseDescription);
         assertPasswordSucceeds("1234", caseDescription);
+        assertPasswordFails("123", caseDescription); // too short
 
         mDevicePolicyManager.setPasswordMinimumNumeric(mComponent, 3);
         assertEquals(3, mDevicePolicyManager.getPasswordMinimumNumeric(mComponent));
         caseDescription = "minimum Numeric=3";
         assertPasswordFails("abcd", caseDescription);
-        assertPasswordFails("1bc", caseDescription);
-        assertPasswordSucceeds("123", caseDescription);
+        assertPasswordFails("1abc", caseDescription);
+        assertPasswordSucceeds("123a", caseDescription);
         assertPasswordSucceeds("1234", caseDescription);
+        assertPasswordFails("123", caseDescription); // too short
     }
 
     public void testPasswordQuality_complexSymbols() {
@@ -398,25 +424,28 @@
 
         String caseDescription = "minimum Symbols=0";
         assertPasswordSucceeds("abcd", caseDescription);
-        assertPasswordSucceeds("_bc", caseDescription);
-        assertPasswordSucceeds("@#!", caseDescription);
+        assertPasswordSucceeds("_bc1", caseDescription);
+        assertPasswordSucceeds("@#!1", caseDescription);
         assertPasswordSucceeds("_@#!", caseDescription);
+        assertPasswordFails("123", caseDescription); // too short
 
         mDevicePolicyManager.setPasswordMinimumSymbols(mComponent, 1);
         assertEquals(1, mDevicePolicyManager.getPasswordMinimumSymbols(mComponent));
         caseDescription = "minimum Symbols=1";
         assertPasswordFails("abcd", caseDescription);
-        assertPasswordSucceeds("_bc", caseDescription);
-        assertPasswordSucceeds("@#!", caseDescription);
+        assertPasswordSucceeds("_bc1", caseDescription);
+        assertPasswordSucceeds("@#!1", caseDescription);
         assertPasswordSucceeds("_@#!", caseDescription);
+        assertPasswordFails("123", caseDescription); // too short
 
         mDevicePolicyManager.setPasswordMinimumSymbols(mComponent, 3);
         assertEquals(3, mDevicePolicyManager.getPasswordMinimumSymbols(mComponent));
         caseDescription = "minimum Symbols=3";
         assertPasswordFails("abcd", caseDescription);
-        assertPasswordFails("_bc", caseDescription);
-        assertPasswordSucceeds("@#!", caseDescription);
+        assertPasswordFails("_bc1", caseDescription);
+        assertPasswordSucceeds("@#!1", caseDescription);
         assertPasswordSucceeds("_@#!", caseDescription);
+        assertPasswordFails("123", caseDescription); // too short
     }
 
     public void testPasswordQuality_complexNonLetter() {
@@ -435,6 +464,7 @@
         assertPasswordSucceeds("3bcd", caseDescription);
         assertPasswordSucceeds("_@3c", caseDescription);
         assertPasswordSucceeds("_25!", caseDescription);
+        assertPasswordFails("123", caseDescription); // too short
 
         mDevicePolicyManager.setPasswordMinimumNonLetter(mComponent, 1);
         assertEquals(1, mDevicePolicyManager.getPasswordMinimumNonLetter(mComponent));
@@ -444,6 +474,7 @@
         assertPasswordSucceeds("3bcd", caseDescription);
         assertPasswordSucceeds("_@3c", caseDescription);
         assertPasswordSucceeds("_25!", caseDescription);
+        assertPasswordFails("123", caseDescription); // too short
 
         mDevicePolicyManager.setPasswordMinimumNonLetter(mComponent, 3);
         assertEquals(3, mDevicePolicyManager.getPasswordMinimumNonLetter(mComponent));
@@ -451,8 +482,9 @@
         assertPasswordFails("Abcd", caseDescription);
         assertPasswordFails("_bcd", caseDescription);
         assertPasswordFails("3bcd", caseDescription);
-        assertPasswordSucceeds("c_@3c", caseDescription);
+        assertPasswordSucceeds("_@3c", caseDescription);
         assertPasswordSucceeds("_25!", caseDescription);
+        assertPasswordFails("123", caseDescription); // too short
     }
 
     public void testPasswordHistoryLength() {
@@ -494,6 +526,23 @@
         }
     }
 
+    public void testKeyguardDisabledFeatures() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testKeyguardDisabledFeatures");
+            return;
+        }
+        int originalValue = mDevicePolicyManager.getKeyguardDisabledFeatures(mComponent);
+        try {
+            for (int which = DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_NONE;
+                    which < 2 * DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT; ++which) {
+                mDevicePolicyManager.setKeyguardDisabledFeatures(mComponent, which);
+                assertEquals(which, mDevicePolicyManager.getKeyguardDisabledFeatures(mComponent));
+            }
+        } finally {
+            mDevicePolicyManager.setKeyguardDisabledFeatures(mComponent, originalValue);
+        }
+    }
+
     public void testCreateUser_failIfNotDeviceOwner() {
         if (!mDeviceAdmin) {
             Log.w(TAG, "Skipping testCreateUser_failIfNotDeviceOwner");
@@ -679,6 +728,19 @@
         }
     }
 
+    public void testInstallCaCert_failIfNotCertInstaller() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testInstallCaCert_failIfNotCertInstaller");
+            return;
+        }
+        try {
+            // Delegated cert installer is identified by using null as the first argument.
+            mDevicePolicyManager.installCaCert(null, TEST_CA_STRING1.getBytes());
+            fail("did not throw expected SecurityException");
+        } catch (SecurityException expected) {
+        }
+    }
+
     public void testUninstallCaCert_failIfNotProfileOwner() {
         if (!mDeviceAdmin) {
             Log.w(TAG, "Skipping testUninstallCaCert_failIfNotProfileOwner");
@@ -693,6 +755,19 @@
         }
     }
 
+    public void testUninstallCaCert_failIfNotCertInstaller() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testUninstallCaCert_failIfNotCertInstaller");
+            return;
+        }
+        try {
+            // Delegated cert installer is identified by using null as the first argument.
+            mDevicePolicyManager.uninstallCaCert(null, TEST_CA_STRING1.getBytes());
+            fail("did not throw expected SecurityException");
+        } catch (SecurityException expected) {
+        }
+    }
+
     public void testGetInstalledCaCerts_failIfNotProfileOwner() {
         if (!mDeviceAdmin) {
             Log.w(TAG, "Skipping testGetInstalledCaCerts_failIfNotProfileOwner");
@@ -706,6 +781,19 @@
         }
     }
 
+    public void testGetInstalledCaCerts_failIfNotCertInstaller() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testGetInstalledCaCerts_failIfNotCertInstaller");
+            return;
+        }
+        try {
+            // Delegated cert installer is identified by using null as the first argument.
+            mDevicePolicyManager.getInstalledCaCerts(null);
+            fail("did not throw expected SecurityException");
+        } catch (SecurityException expected) {
+        }
+    }
+
     public void testHasCaCertInstalled_failIfNotProfileOwner() {
         if (!mDeviceAdmin) {
             Log.w(TAG, "Skipping testHasCaCertInstalled_failIfNotProfileOwner");
@@ -720,6 +808,19 @@
         }
     }
 
+    public void testHasCaCertInstalled_failIfNotCertInstaller() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testHasCaCertInstalled_failIfNotCertInstaller");
+            return;
+        }
+        try {
+            // Delegated cert installer is identified by using null as the first argument.
+            mDevicePolicyManager.hasCaCertInstalled(null, TEST_CA_STRING1.getBytes());
+            fail("did not throw expected SecurityException");
+        } catch (SecurityException expected) {
+        }
+    }
+
     public void testUninstallAllUserCaCerts_failIfNotProfileOwner() {
         if (!mDeviceAdmin) {
             Log.w(TAG, "Skipping testUninstallAllUserCaCerts_failIfNotProfileOwner");
@@ -733,6 +834,19 @@
         }
     }
 
+    public void testUninstallAllUserCaCerts_failIfNotCertInstaller() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testUninstallAllUserCaCerts_failIfNotCertInstaller");
+            return;
+        }
+        try {
+            // Delegated cert installer is identified by using null as the first argument.
+            mDevicePolicyManager.uninstallAllUserCaCerts(null);
+            fail("did not throw expected SecurityException");
+        } catch (SecurityException expected) {
+        }
+    }
+
     public void testSetScreenCaptureDisabled_failIfNotProfileOwner() {
         if (!mDeviceAdmin) {
             Log.w(TAG, "Skipping testSetScreenCaptureDisabled_failIfNotProfileOwner");
@@ -871,6 +985,19 @@
         }
     }
 
+    public void testSetBluetoothContactSharingDisabled_failIfNotProfileOwner() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testSetBluetoothContactSharingDisabled_failIfNotProfileOwner");
+            return;
+        }
+        try {
+            mDevicePolicyManager.setBluetoothContactSharingDisabled(mComponent, true);
+            fail("did not throw expected SecurityException");
+        } catch (SecurityException e) {
+            assertProfileOwnerMessage(e.getMessage());
+        }
+    }
+
     public void testSetPermittedInputMethods_failIfNotProfileOwner() {
         if (!mDeviceAdmin) {
             Log.w(TAG, "Skipping testSetPermittedInputMethods_failIfNotProfileOwner");
@@ -910,6 +1037,14 @@
         fail("No system launcher with version L+ present present on device.");
     }
 
+    /**
+     * Test that managed provisioning is pre-installed if and only if the device declares the
+     * device admin feature.
+     */
+    public void testManagedProvisioningPreInstalled() throws Exception {
+        assertEquals(mDeviceAdmin, isPackageInstalledOnSystemImage(MANAGED_PROVISIONING_PKG));
+    }
+
     private void assertDeviceOwnerMessage(String message) {
         assertTrue("message is: "+ message, message.contains("does not own the device")
                 || message.contains("can only be called by the device owner"));
@@ -938,9 +1073,13 @@
     }
 
     private void assertPasswordFails(String password, String restriction) {
-        boolean passwordResetResult = mDevicePolicyManager.resetPassword(password, /* flags= */0);
-        assertFalse("Password '" + password + "' should have failed on " + restriction,
-                passwordResetResult);
+        try {
+            boolean passwordResetResult = mDevicePolicyManager.resetPassword(password, /* flags= */0);
+            assertFalse("Password '" + password + "' should have failed on " + restriction,
+                    passwordResetResult);
+        } catch (IllegalArgumentException e) {
+            // yesss, we have failed!
+        }
     }
 
     private void assertPasswordSucceeds(String password, String restriction) {
@@ -948,4 +1087,53 @@
         assertTrue("Password '" + password + "' failed on " + restriction, passwordResetResult);
         assertTrue(mDevicePolicyManager.isActivePasswordSufficient());
     }
+
+    public void testSetDelegatedCertInstaller_failIfNotProfileOwner() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testSetDelegatedCertInstaller_failIfNotProfileOwner");
+            return;
+        }
+        try {
+            mDevicePolicyManager.setCertInstallerPackage(mComponent, "com.test.package");
+            fail("did not throw expected SecurityException");
+        } catch (SecurityException e) {
+            assertProfileOwnerMessage(e.getMessage());
+        }
+    }
+
+    public void testGetDelegatedCertInstaller_failIfNotProfileOwner() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testGetDelegatedCertInstaller_failIfNotProfileOwner");
+            return;
+        }
+        try {
+            mDevicePolicyManager.getCertInstallerPackage(mComponent);
+            fail("did not throw expected SecurityException");
+        } catch (SecurityException e) {
+            assertProfileOwnerMessage(e.getMessage());
+        }
+    }
+
+    public void testSetSystemUpdatePolicy_failIfNotDeviceOwner() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testSetSystemUpdatePolicy_failIfNotDeviceOwner");
+            return;
+        }
+        try {
+            mDevicePolicyManager.setSystemUpdatePolicy(mComponent, null);
+            fail("did not throw expected SecurityException");
+        } catch (SecurityException e) {
+            assertDeviceOwnerMessage(e.getMessage());
+        }
+    }
+
+    private boolean isPackageInstalledOnSystemImage(String packagename) {
+        try {
+            ApplicationInfo info = mPackageManager.getApplicationInfo(packagename,
+                    0 /* default flags */);
+            return (info.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
+        } catch (NameNotFoundException e) {
+            return false;
+        }
+    }
 }
diff --git a/tests/tests/alarmclock/Android.mk b/tests/tests/alarmclock/Android.mk
new file mode 100644
index 0000000..6c30bc7
--- /dev/null
+++ b/tests/tests/alarmclock/Android.mk
@@ -0,0 +1,33 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := CtsAlarmClockCommon ctstestrunner ctsdeviceutil
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsAlarmClockTestCases
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/tests/alarmclock/AndroidManifest.xml b/tests/tests/alarmclock/AndroidManifest.xml
new file mode 100644
index 0000000..c0193dd
--- /dev/null
+++ b/tests/tests/alarmclock/AndroidManifest.xml
@@ -0,0 +1,47 @@
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.alarmclock.cts">
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+
+        <activity android:name="TestStartActivity"
+                  android:label="The Target Activity for AlarmClock CTS Test">
+            <intent-filter>
+                <action android:name="android.intent.action.TEST_START_ACTIVITY_DISMISS_ALARM" />
+                <action android:name="android.intent.action.TEST_START_ACTIVITY_SET_ALARM" />
+                <action android:name=
+                        "android.intent.action.TEST_START_ACTIVITY_SET_ALARM_FOR_DISMISSAL" />
+                <action android:name="android.intent.action.TEST_START_ACTIVITY_SNOOZE_ALARM" />
+                <category android:name="android.intent.category.LAUNCHER" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+    </application>
+
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="android.alarmclock.cts"
+                     android:label="CTS tests of android.alarmclock">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+</manifest>
+
diff --git a/tests/tests/alarmclock/AndroidTest.xml b/tests/tests/alarmclock/AndroidTest.xml
new file mode 100644
index 0000000..1cdd7f4
--- /dev/null
+++ b/tests/tests/alarmclock/AndroidTest.xml
@@ -0,0 +1,23 @@
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="Test module config for AlarmClock">
+    <include name="common-config" />
+    <option name="cts-apk-installer:test-file-name" value="CtsAlarmClockService.apk" />
+    <option name="run-command:run-command"
+         value="settings put secure voice_interaction_service android.alarmclock.service/.MainInteractionService" />
+    <option name="run-command:teardown-command"
+         value="settings put secure voice_interaction_service com.google.android.googlequicksearchbox/com.google.android.voiceinteraction.GsaVoiceInteractionService" />
+    <option name="cts-apk-installer:test-file-name" value="CtsAlarmClockTestCases.apk" />
+</configuration>
diff --git a/tests/tests/alarmclock/common/Android.mk b/tests/tests/alarmclock/common/Android.mk
new file mode 100644
index 0000000..d460ade
--- /dev/null
+++ b/tests/tests/alarmclock/common/Android.mk
@@ -0,0 +1,30 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_MODULE := CtsAlarmClockCommon
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/tests/tests/alarmclock/common/src/android/alarmclock/common/Utils.java b/tests/tests/alarmclock/common/src/android/alarmclock/common/Utils.java
new file mode 100644
index 0000000..d469592
--- /dev/null
+++ b/tests/tests/alarmclock/common/src/android/alarmclock/common/Utils.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2015 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.alarmclock.common;
+
+import android.os.Bundle;
+
+public class Utils {
+    // private constructor - so it can't be instantiated.
+    private Utils() {
+    }
+
+    public enum TestcaseType {
+        DISMISS_ALARM,
+        SET_ALARM,
+        SET_ALARM_FOR_DISMISSAL,
+        SNOOZE_ALARM,
+    }
+    public static final String TESTCASE_TYPE = "Testcase_type";
+    public static final String BROADCAST_INTENT =
+            "android.intent.action.FROM_ALARMCLOCK_CTS_TEST_";
+    public static final String TEST_RESULT = "test_result";
+    public static final String COMPLETION_RESULT = "completion";
+    public static final String ABORT_RESULT = "abort";
+
+    public static final String toBundleString(Bundle bundle) {
+        if (bundle == null) {
+            return "*** Bundle is null ****";
+        }
+        StringBuilder buf = new StringBuilder();
+        if (bundle != null) {
+            buf.append("extras: ");
+            for (String s : bundle.keySet()) {
+                buf.append("(" + s + " = " + bundle.get(s) + "), ");
+            }
+        }
+        return buf.toString();
+    }
+}
diff --git a/tests/tests/alarmclock/res/xml/interaction_service.xml b/tests/tests/alarmclock/res/xml/interaction_service.xml
new file mode 100644
index 0000000..e37017c
--- /dev/null
+++ b/tests/tests/alarmclock/res/xml/interaction_service.xml
@@ -0,0 +1,20 @@
+<!-- Copyright (C) 2015 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.
+-->
+
+<voice-interaction-service xmlns:android="http://schemas.android.com/apk/res/android"
+    android:sessionService="android.alarmclock.service.MainInteractionSessionService"
+    android:recognitionService="android.alarmclock.service.MainRecognitionService"
+    android:settingsActivity="android.alarmclock.service.SettingsActivity"
+    android:supportsAssist="false" />
diff --git a/tests/tests/alarmclock/service/Android.mk b/tests/tests/alarmclock/service/Android.mk
new file mode 100644
index 0000000..53dc564
--- /dev/null
+++ b/tests/tests/alarmclock/service/Android.mk
@@ -0,0 +1,32 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := CtsAlarmClockCommon ctstestrunner ctsdeviceutil
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsAlarmClockService
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/tests/alarmclock/service/AndroidManifest.xml b/tests/tests/alarmclock/service/AndroidManifest.xml
new file mode 100644
index 0000000..074df26
--- /dev/null
+++ b/tests/tests/alarmclock/service/AndroidManifest.xml
@@ -0,0 +1,64 @@
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.alarmclock.service">
+    <uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+        <service android:name=".MainInteractionService"
+                android:label="CTS test voice interaction service"
+                android:permission="android.permission.BIND_VOICE_INTERACTION"
+                android:process=":interactor"
+                android:exported="true">
+            <meta-data android:name="android.voice_interaction"
+                       android:resource="@xml/interaction_service" />
+            <intent-filter>
+                <action android:name="android.service.voice.VoiceInteractionService" />
+            </intent-filter>
+        </service>
+        <activity android:name=".VoiceInteractionMain" >
+            <intent-filter>
+                <action android:name="android.intent.action.VIMAIN_DISMISS_ALARM" />
+                <action android:name="android.intent.action.VIMAIN_SET_ALARM" />
+                <action android:name="android.intent.action.VIMAIN_SET_ALARM_FOR_DISMISSAL" />
+                <action android:name="android.intent.action.VIMAIN_SNOOZE_ALARM" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".SettingsActivity"
+                  android:label="Voice Interaction Settings">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+        <service android:name=".MainInteractionSessionService"
+                android:permission="android.permission.BIND_VOICE_INTERACTION"
+                android:process=":session">
+        </service>
+        <service android:name=".MainRecognitionService"
+                android:label="CTS Voice Recognition Service">
+            <intent-filter>
+                <action android:name="android.speech.RecognitionService" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <meta-data android:name="android.speech" android:resource="@xml/recognition_service" />
+        </service>
+    </application>
+</manifest>
+
diff --git a/tests/tests/alarmclock/service/res/xml/interaction_service.xml b/tests/tests/alarmclock/service/res/xml/interaction_service.xml
new file mode 100644
index 0000000..e37017c
--- /dev/null
+++ b/tests/tests/alarmclock/service/res/xml/interaction_service.xml
@@ -0,0 +1,20 @@
+<!-- Copyright (C) 2015 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.
+-->
+
+<voice-interaction-service xmlns:android="http://schemas.android.com/apk/res/android"
+    android:sessionService="android.alarmclock.service.MainInteractionSessionService"
+    android:recognitionService="android.alarmclock.service.MainRecognitionService"
+    android:settingsActivity="android.alarmclock.service.SettingsActivity"
+    android:supportsAssist="false" />
diff --git a/tests/tests/alarmclock/service/res/xml/recognition_service.xml b/tests/tests/alarmclock/service/res/xml/recognition_service.xml
new file mode 100644
index 0000000..132c987
--- /dev/null
+++ b/tests/tests/alarmclock/service/res/xml/recognition_service.xml
@@ -0,0 +1,17 @@
+<!-- Copyright (C) 2015 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.
+-->
+
+<recognition-service xmlns:android="http://schemas.android.com/apk/res/android"
+    android:settingsActivity="android.alarmclock.service.SettingsActivity" />
diff --git a/tests/tests/alarmclock/service/src/android/alarmclock/service/MainInteractionService.java b/tests/tests/alarmclock/service/src/android/alarmclock/service/MainInteractionService.java
new file mode 100644
index 0000000..f96140e
--- /dev/null
+++ b/tests/tests/alarmclock/service/src/android/alarmclock/service/MainInteractionService.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2015 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.alarmclock.service;
+
+import android.alarmclock.common.Utils;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.os.Bundle;
+import android.service.voice.VoiceInteractionService;
+import android.util.Log;
+
+public class MainInteractionService extends VoiceInteractionService {
+    static final String TAG = "MainInteractionService";
+    private Intent mIntent;
+    private boolean mReady = false;
+
+    @Override
+    public void onReady() {
+        super.onReady();
+        mReady = true;
+    }
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        Log.i(TAG, "onStartCommand received");
+        mIntent = intent;
+        Log.i(TAG, "received_testcasetype = " + mIntent.getStringExtra(Utils.TESTCASE_TYPE));
+        maybeStart();
+        return START_NOT_STICKY;
+    }
+
+    private void maybeStart() {
+       if (mIntent == null || !mReady) {
+            Log.wtf(TAG, "Can't start session because either intent is null or onReady() "
+                    + "is not called yet. mIntent = " + mIntent + ", mReady = " + mReady);
+        } else {
+            Log.i(TAG,
+                    "Yay! about to start MainInteractionSession as the voice_interaction_service");
+            if (isActiveService(this, new ComponentName(this, getClass()))) {
+                Bundle args = new Bundle();
+                args.putString(Utils.TESTCASE_TYPE, mIntent.getStringExtra(Utils.TESTCASE_TYPE));
+                Log.i(TAG, "xferring_testcasetype = " + args.getString(Utils.TESTCASE_TYPE));
+                showSession(args, 0);
+            } else {
+                Log.wtf(TAG, "**** Not starting MainInteractionService because" +
+                    " it is not set as the current voice_interaction_service");
+            }
+        }
+    }
+}
diff --git a/tests/tests/alarmclock/service/src/android/alarmclock/service/MainInteractionSession.java b/tests/tests/alarmclock/service/src/android/alarmclock/service/MainInteractionSession.java
new file mode 100644
index 0000000..ede762a
--- /dev/null
+++ b/tests/tests/alarmclock/service/src/android/alarmclock/service/MainInteractionSession.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2015 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.alarmclock.service;
+
+import android.alarmclock.common.Utils;
+import android.alarmclock.common.Utils.TestcaseType;
+import android.content.Context;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.provider.AlarmClock;
+import android.service.voice.VoiceInteractionSession;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MainInteractionSession extends VoiceInteractionSession {
+    static final String TAG = "MainInteractionSession";
+
+    private List<MyTask> mUsedTasks = new ArrayList<MyTask>();
+    private Context mContext;
+    private TestcaseType mTestType;
+    private String mTestResult = "";
+
+    MainInteractionSession(Context context) {
+        super(context);
+        mContext = context;
+    }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+    }
+
+    @Override
+    public void onDestroy() {
+        Log.i(TAG, "Canceling the Asynctasks in onDestroy()");
+        for (MyTask t : mUsedTasks) {
+            t.cancel(true);
+        }
+        super.onDestroy();
+    }
+
+    @Override
+    public void onShow(Bundle args, int showFlags) {
+        super.onShow(args, showFlags);
+        String testCaseType = args.getString(Utils.TESTCASE_TYPE);
+        Log.i(TAG, "received_testcasetype = " + testCaseType);
+        try {
+            mTestType = TestcaseType.valueOf(testCaseType);
+        } catch (IllegalArgumentException e) {
+            Log.wtf(TAG, e);
+            return;
+        } catch (NullPointerException e) {
+            Log.wtf(TAG, e);
+            return;
+        }
+        Intent intent;
+        switch(mTestType) {
+            case DISMISS_ALARM:
+                intent = new Intent(AlarmClock.ACTION_DISMISS_ALARM);
+                intent.putExtra(AlarmClock.EXTRA_ALARM_SEARCH_MODE,
+                        AlarmClock.ALARM_SEARCH_MODE_NEXT);
+                break;
+
+            case SET_ALARM_FOR_DISMISSAL:
+            case SET_ALARM:
+                intent = new Intent(AlarmClock.ACTION_SET_ALARM);
+                intent.putExtra(AlarmClock.EXTRA_HOUR, 14);
+                break;
+
+            case SNOOZE_ALARM:
+                intent = new Intent(AlarmClock.ACTION_SNOOZE_ALARM);
+                break;
+
+            default:
+                Log.e(TAG, "Unexpected value");
+                return;
+        }
+        Log.i(TAG, "starting_voiceactivity: " + intent.toString());
+        startVoiceActivity(intent);
+    }
+
+    @Override
+    public void onTaskFinished(Intent intent, int taskId) {
+        // extras contain the info on what the activity started above did.
+        // we probably could verify this also.
+        Bundle extras = intent.getExtras();
+        Log.i(TAG, "in onTaskFinished: testcasetype = " + mTestType + ", intent: " +
+                intent.toString() + Utils.toBundleString(extras));
+        Intent broadcastIntent = new Intent(Utils.BROADCAST_INTENT + mTestType.toString());
+        broadcastIntent.putExtra(Utils.TEST_RESULT, mTestResult);
+        broadcastIntent.putExtra(Utils.TESTCASE_TYPE, mTestType.toString());
+        Log.i(TAG, "sending_broadcast for testcase+type = " +
+                broadcastIntent.getStringExtra(Utils.TESTCASE_TYPE) +
+                ", test_result = " + broadcastIntent.getStringExtra(Utils.TEST_RESULT));
+        mContext.sendBroadcast(broadcastIntent);
+    }
+
+    synchronized MyTask newTask() {
+        MyTask t = new MyTask();
+        mUsedTasks.add(t);
+        return t;
+    }
+
+    @Override
+    public void onRequestCompleteVoice(CompleteVoiceRequest request) {
+        mTestResult = Utils.COMPLETION_RESULT;
+        CharSequence prompt = request.getVoicePrompt().getVoicePromptAt(0);
+        Log.i(TAG, "in Session testcasetype = " + mTestType +
+                ", onRequestCompleteVoice recvd. message = " + prompt);
+        AsyncTaskArg asyncTaskArg = new AsyncTaskArg().setRequest(request).setCompleteReq(true);
+        newTask().execute(asyncTaskArg);
+    }
+
+    @Override
+    public void onRequestAbortVoice(AbortVoiceRequest request) {
+        mTestResult = Utils.ABORT_RESULT;
+        AsyncTaskArg asyncTaskArg = new AsyncTaskArg().setRequest(request).setCompleteReq(false);
+        Log.i(TAG, "in Session sending sendAbortResult for testcasetype = " + mTestType);
+        newTask().execute(asyncTaskArg);
+    }
+
+    private class AsyncTaskArg {
+        CompleteVoiceRequest mCompReq;
+        AbortVoiceRequest mAbortReq;
+        boolean isCompleteRequest = true;
+
+        AsyncTaskArg setRequest(CompleteVoiceRequest r) {
+            mCompReq = r;
+            return this;
+        }
+
+        AsyncTaskArg setRequest(AbortVoiceRequest r) {
+            mAbortReq = r;
+            return this;
+        }
+
+        AsyncTaskArg setCompleteReq(boolean flag) {
+            isCompleteRequest = flag;
+            return this;
+        }
+    }
+
+    private class MyTask extends AsyncTask<AsyncTaskArg, Void, Void> {
+        @Override
+        protected Void doInBackground(AsyncTaskArg... params) {
+            AsyncTaskArg arg = params[0];
+            Log.i(TAG, "in MyTask - doInBackground: testType = " +
+                    MainInteractionSession.this.mTestType);
+            if (arg.isCompleteRequest) {
+                arg.mCompReq.sendCompleteResult(new Bundle());
+            } else {
+                arg.mAbortReq.sendAbortResult(new Bundle());
+            }
+            return null;
+        }
+    }
+}
diff --git a/tests/tests/alarmclock/service/src/android/alarmclock/service/MainInteractionSessionService.java b/tests/tests/alarmclock/service/src/android/alarmclock/service/MainInteractionSessionService.java
new file mode 100644
index 0000000..a83c115
--- /dev/null
+++ b/tests/tests/alarmclock/service/src/android/alarmclock/service/MainInteractionSessionService.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2015 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.alarmclock.service;
+
+import android.os.Bundle;
+import android.service.voice.VoiceInteractionSession;
+import android.service.voice.VoiceInteractionSessionService;
+
+public class MainInteractionSessionService extends VoiceInteractionSessionService {
+    @Override
+    public VoiceInteractionSession onNewSession(Bundle args) {
+        return new MainInteractionSession(this);
+    }
+}
diff --git a/tests/tests/alarmclock/service/src/android/alarmclock/service/MainRecognitionService.java b/tests/tests/alarmclock/service/src/android/alarmclock/service/MainRecognitionService.java
new file mode 100644
index 0000000..15a32d4
--- /dev/null
+++ b/tests/tests/alarmclock/service/src/android/alarmclock/service/MainRecognitionService.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2015 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.alarmclock.service;
+
+import android.content.Intent;
+import android.speech.RecognitionService;
+import android.util.Log;
+
+/**
+ * Stub recognition service needed to be a complete voice interactor.
+ */
+public class MainRecognitionService extends RecognitionService {
+    private static final String TAG = "MainRecognitionService";
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        Log.i(TAG, "onCreate");
+    }
+
+    @Override
+    protected void onStartListening(Intent recognizerIntent, Callback listener) {
+        Log.i(TAG, "onStartListening");
+    }
+
+    @Override
+    protected void onCancel(Callback listener) {
+        Log.i(TAG, "onCancel");
+    }
+
+    @Override
+    protected void onStopListening(Callback listener) {
+        Log.i(TAG, "onStopListening");
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        Log.i(TAG, "onDestroy");
+    }
+}
diff --git a/tests/tests/alarmclock/service/src/android/alarmclock/service/SettingsActivity.java b/tests/tests/alarmclock/service/src/android/alarmclock/service/SettingsActivity.java
new file mode 100644
index 0000000..0c4d289
--- /dev/null
+++ b/tests/tests/alarmclock/service/src/android/alarmclock/service/SettingsActivity.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2015 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.alarmclock.service;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * Stub activity to test out settings selection for voice interactor.
+ */
+public class SettingsActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+}
diff --git a/tests/tests/alarmclock/service/src/android/alarmclock/service/VoiceInteractionMain.java b/tests/tests/alarmclock/service/src/android/alarmclock/service/VoiceInteractionMain.java
new file mode 100644
index 0000000..c1f23a0
--- /dev/null
+++ b/tests/tests/alarmclock/service/src/android/alarmclock/service/VoiceInteractionMain.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2015 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.alarmclock.service;
+
+import android.alarmclock.common.Utils;
+import android.app.Activity;
+import android.content.Intent;
+import android.content.ComponentName;
+import android.os.Bundle;
+import android.util.Log;
+
+public class VoiceInteractionMain extends Activity {
+    static final String TAG = "VoiceInteractionMain";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Intent intent = new Intent();
+        String testCaseType = getIntent().getStringExtra(Utils.TESTCASE_TYPE);
+        Log.i(TAG, "received_testcasetype = " + testCaseType);
+        intent.putExtra(Utils.TESTCASE_TYPE, testCaseType);
+        intent.setComponent(new ComponentName(this, MainInteractionService.class));
+        ComponentName serviceName = startService(intent);
+        Log.i(TAG, "Started service: " + serviceName);
+    }
+}
diff --git a/tests/tests/alarmclock/src/android/alarmclock/cts/AlarmClockTestBase.java b/tests/tests/alarmclock/src/android/alarmclock/cts/AlarmClockTestBase.java
new file mode 100644
index 0000000..0089e69
--- /dev/null
+++ b/tests/tests/alarmclock/src/android/alarmclock/cts/AlarmClockTestBase.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2015 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.alarmclock.cts;
+
+import android.alarmclock.common.Utils;
+import android.alarmclock.common.Utils.TestcaseType;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+public class AlarmClockTestBase extends ActivityInstrumentationTestCase2<TestStartActivity> {
+    static final String TAG = "AlarmClockTestBase";
+    protected static final int TIMEOUT_MS = 20 * 1000;
+
+    private Context mContext;
+    private String mTestResult;
+    private CountDownLatch mLatch;
+    private ActivityDoneReceiver mActivityDoneReceiver = null;
+    private TestStartActivity mActivity;
+    private TestcaseType mTestCaseType;
+
+    public AlarmClockTestBase() {
+        super(TestStartActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mContext = getInstrumentation().getTargetContext();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mContext.unregisterReceiver(mActivityDoneReceiver);
+        super.tearDown();
+    }
+
+    private void registerBroadcastReceiver(TestcaseType testCaseType) throws Exception {
+        mTestCaseType = testCaseType;
+        mLatch = new CountDownLatch(1);
+        if (mActivityDoneReceiver != null) {
+            mContext.unregisterReceiver(mActivityDoneReceiver);
+        }
+        mActivityDoneReceiver = new ActivityDoneReceiver();
+        mContext.registerReceiver(mActivityDoneReceiver,
+                new IntentFilter(Utils.BROADCAST_INTENT + testCaseType.toString()));
+    }
+
+    protected String runTest(TestcaseType testCaseType) throws Exception {
+        Log.i(TAG, "Begin Testing: " + testCaseType);
+        if (!startTestActivity(testCaseType)) {
+            fail("test activity start failed for testcase = " + testCaseType);
+            return "";
+        }
+
+        registerBroadcastReceiver(testCaseType);
+        mActivity.startTest(testCaseType.toString());
+        if (!mLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+            fail("Failed to receive broadcast in " + TIMEOUT_MS + "msec");
+            return "";
+        }
+        return mTestResult;
+    }
+
+    private boolean startTestActivity(TestcaseType testCaseType) {
+        Log.i(TAG, "Starting test activity for test: " + testCaseType);
+        Intent intent = new Intent();
+        intent.setAction("android.intent.action.TEST_START_ACTIVITY_" + testCaseType.toString());
+        intent.setComponent(new ComponentName(getInstrumentation().getContext(),
+                TestStartActivity.class));
+        setActivityIntent(intent);
+        mActivity = getActivity();
+        return mActivity != null;
+    }
+
+    class ActivityDoneReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (intent.getAction().equals(
+                    Utils.BROADCAST_INTENT + AlarmClockTestBase.this.mTestCaseType.toString())) {
+                AlarmClockTestBase.this.mTestResult = intent.getStringExtra(Utils.TEST_RESULT);
+                Log.i(TAG, "received_broadcast for testcase_type = " +
+                        Utils.BROADCAST_INTENT + AlarmClockTestBase.this.mTestCaseType +
+                        ", test_result = " + AlarmClockTestBase.this.mTestResult);
+                mLatch.countDown();
+            }
+        }
+    }
+}
diff --git a/tests/tests/alarmclock/src/android/alarmclock/cts/DismissAlarmTest.java b/tests/tests/alarmclock/src/android/alarmclock/cts/DismissAlarmTest.java
new file mode 100644
index 0000000..64ecf86
--- /dev/null
+++ b/tests/tests/alarmclock/src/android/alarmclock/cts/DismissAlarmTest.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2015 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.alarmclock.cts;
+
+import android.alarmclock.common.Utils;
+import android.alarmclock.common.Utils.TestcaseType;
+
+public class DismissAlarmTest extends AlarmClockTestBase {
+    public DismissAlarmTest() {
+        super();
+    }
+
+    public void testAll() throws Exception {
+        assertEquals(Utils.COMPLETION_RESULT, runTest(TestcaseType.SET_ALARM_FOR_DISMISSAL));
+        assertEquals(Utils.COMPLETION_RESULT, runTest(TestcaseType.DISMISS_ALARM));
+    }
+}
diff --git a/tests/tests/alarmclock/src/android/alarmclock/cts/SetAlarmTest.java b/tests/tests/alarmclock/src/android/alarmclock/cts/SetAlarmTest.java
new file mode 100644
index 0000000..a95a1dd
--- /dev/null
+++ b/tests/tests/alarmclock/src/android/alarmclock/cts/SetAlarmTest.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2015 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.alarmclock.cts;
+
+import android.alarmclock.common.Utils;
+import android.alarmclock.common.Utils.TestcaseType;
+
+public class SetAlarmTest extends AlarmClockTestBase {
+    public SetAlarmTest() {
+        super();
+    }
+
+    public void testAll() throws Exception {
+        assertEquals(Utils.COMPLETION_RESULT, runTest(TestcaseType.SET_ALARM));
+    }
+}
diff --git a/tests/tests/alarmclock/src/android/alarmclock/cts/SnoozeAlarmTest.java b/tests/tests/alarmclock/src/android/alarmclock/cts/SnoozeAlarmTest.java
new file mode 100644
index 0000000..b67a7cf
--- /dev/null
+++ b/tests/tests/alarmclock/src/android/alarmclock/cts/SnoozeAlarmTest.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2015 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.alarmclock.cts;
+
+import android.alarmclock.common.Utils;
+import android.alarmclock.common.Utils.TestcaseType;
+
+public class SnoozeAlarmTest extends AlarmClockTestBase {
+    public SnoozeAlarmTest() {
+        super();
+    }
+
+    public void testAll() throws Exception {
+        String result = runTest(TestcaseType.SNOOZE_ALARM);
+        // Since there is no way to figure out if there is a currently-firing alarm,
+        // we should expect either of the 2 results:
+        //      Utils.COMPLETION_RESULT
+        //      Utils.ABORT_RESULT
+        // For CTS test purposes, all we can do is to know that snooze-alarm intent
+        // was picked up and processed by the voice_interaction_service and the associated app.
+        // The above call to runTest() would have failed the test otherwise.
+        assertTrue(result.equals(Utils.ABORT_RESULT) || result.equals(Utils.COMPLETION_RESULT));
+    }
+}
diff --git a/tests/tests/alarmclock/src/android/alarmclock/cts/TestStartActivity.java b/tests/tests/alarmclock/src/android/alarmclock/cts/TestStartActivity.java
new file mode 100644
index 0000000..1a3c4eb
--- /dev/null
+++ b/tests/tests/alarmclock/src/android/alarmclock/cts/TestStartActivity.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2015 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.alarmclock.cts;
+
+import android.alarmclock.common.Utils;
+import android.app.Activity;
+import android.content.Intent;
+import android.content.ComponentName;
+import android.os.Bundle;
+import android.util.Log;
+
+public class TestStartActivity extends Activity {
+    static final String TAG = "TestStartActivity";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Log.i(TAG, " in onCreate");
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        Log.i(TAG, " in onResume");
+    }
+
+    void startTest(String testCaseType) {
+        Intent intent = new Intent();
+        Log.i(TAG, "received_testcasetype = " + testCaseType);
+        intent.putExtra(Utils.TESTCASE_TYPE, testCaseType);
+        intent.setAction("android.intent.action.VIMAIN_" + testCaseType);
+        intent.setComponent(new ComponentName("android.alarmclock.service",
+                "android.alarmclock.service.VoiceInteractionMain"));
+        startActivity(intent);
+    }
+
+    @Override
+    protected void onPause() {
+        Log.i(TAG, " in onPause");
+        super.onPause();
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        Log.i(TAG, " in onStart");
+    }
+
+    @Override
+    protected void onRestart() {
+        super.onRestart();
+        Log.i(TAG, " in onRestart");
+    }
+
+    @Override
+    protected void onStop() {
+        Log.i(TAG, " in onStop");
+        super.onStop();
+    }
+
+    @Override
+    protected void onDestroy() {
+        Log.i(TAG, " in onDestroy");
+        super.onDestroy();
+    }
+}
diff --git a/tests/tests/app.usage/AndroidManifest.xml b/tests/tests/app.usage/AndroidManifest.xml
index 11065d4..7869223 100644
--- a/tests/tests/app.usage/AndroidManifest.xml
+++ b/tests/tests/app.usage/AndroidManifest.xml
@@ -21,6 +21,10 @@
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
     <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
     <uses-permission android:name="android.permission.SET_TIME" />
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
 
     <application>
         <uses-library android:name="android.test.runner" />
@@ -29,6 +33,7 @@
         <activity android:name=".Activities$ActivityTwo" />
         <activity android:name=".Activities$ActivityThree" />
         <activity android:name=".Activities$ActivityFour" />
+        <activity android:name=".ActivityTransitionActivity" />
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/tests/tests/app.usage/res/layout/end.xml b/tests/tests/app.usage/res/layout/end.xml
new file mode 100644
index 0000000..2847249
--- /dev/null
+++ b/tests/tests/app.usage/res/layout/end.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical">
+    <View android:layout_width="10dp"
+          android:layout_height="10dp"
+          android:background="#F00"
+          android:id="@+id/redSquare"/>
+    <TextView android:layout_width="wrap_content"
+              android:layout_height="wrap_content"
+              android:transitionName="target"
+              android:text="@string/hello"/>
+    <View android:layout_width="10dp"
+          android:layout_height="10dp"
+          android:background="#0F0"
+          android:id="@+id/greenSquare"/>
+</LinearLayout>
diff --git a/tests/tests/app.usage/res/layout/start.xml b/tests/tests/app.usage/res/layout/start.xml
new file mode 100644
index 0000000..793e9b5
--- /dev/null
+++ b/tests/tests/app.usage/res/layout/start.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical">
+    <View android:layout_width="10dp"
+          android:layout_height="10dp"
+          android:background="#0F0"
+          android:id="@+id/greenSquare"/>
+    <View android:layout_width="10dp"
+          android:layout_height="10dp"
+          android:background="#F00"
+          android:id="@+id/redSquare"/>
+    <TextView android:layout_width="wrap_content"
+              android:layout_height="wrap_content"
+              android:transitionName="source"
+              android:id="@+id/hello"
+              android:text="@string/hello"/>
+</LinearLayout>
diff --git a/tests/tests/app.usage/res/values/strings.xml b/tests/tests/app.usage/res/values/strings.xml
new file mode 100644
index 0000000..8ca6f73
--- /dev/null
+++ b/tests/tests/app.usage/res/values/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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>
+    <string name="hello">Hello</string>
+</resources>
diff --git a/tests/tests/app.usage/src/android/app/usage/cts/ActivityTransitionActivity.java b/tests/tests/app.usage/src/android/app/usage/cts/ActivityTransitionActivity.java
new file mode 100644
index 0000000..10ac4ea
--- /dev/null
+++ b/tests/tests/app.usage/src/android/app/usage/cts/ActivityTransitionActivity.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2014 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.app.usage.cts;
+
+import android.app.Activity;
+import android.app.SharedElementCallback;
+import android.app.usage.cts.R;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.ResultReceiver;
+import android.os.SystemClock;
+import android.transition.ChangeBounds;
+import android.transition.Explode;
+import android.transition.Fade;
+import android.transition.Transition;
+import android.transition.Transition.TransitionListener;
+import android.view.View;
+
+import java.util.List;
+
+/**
+ * A simple activity containing the start state for an Activity Transition
+ */
+public class ActivityTransitionActivity extends Activity {
+    private static final long DURATION = 50;
+    private static final long SHARED_ELEMENT_READY_DELAY = 50;
+    public static final String LAYOUT_ID = "layoutId";
+    public static final String TEST = "test";
+    public static final String RESULT_RECEIVER = "resultReceiver";
+
+    public static final int NO_TEST = 0;
+    public static final int TEST_ARRIVE = 1;
+
+    public static final String ARRIVE_COUNT = "numArrived";
+    public static final String ARRIVE_ENTER_START_VISIBILITY = "arriveEnterStartVisibility";
+    public static final String ARRIVE_ENTER_DELAY_VISIBILITY = "arriveEnterDelayVisibility";
+    public static final String ARRIVE_ENTER_TIME_READY = "arriveEnterTimeReady";
+    public static final String ARRIVE_ENTER_TIME = "arriveEnterTime";
+    public static final String ARRIVE_RETURN_TIME_READY = "arriveReturnTimeReady";
+    public static final String ARRIVE_RETURN_TIME = "arriveReturnTime";
+
+    private int mLayoutId;
+    private int mTest;
+    private ResultReceiver mResultReceiver;
+    private int mNumSharedElementsArrivedCalled = 0;
+    private boolean mEntering = true;
+
+    public int resultCode = 0;
+    public Bundle result = new Bundle();
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        getWindow().setSharedElementEnterTransition(new ChangeBounds().setDuration(DURATION));
+        getWindow().setSharedElementReturnTransition(new ChangeBounds().setDuration(DURATION));
+        getWindow().setEnterTransition(new Explode().setDuration(DURATION));
+        getWindow().setReturnTransition(new Explode().setDuration(DURATION));
+        getWindow().setExitTransition(new Fade().setDuration(DURATION));
+        mLayoutId = 0;
+        if (icicle != null) {
+            mLayoutId =  icicle.getInt(LAYOUT_ID);
+            mTest = icicle.getInt(TEST);
+            mResultReceiver = icicle.getParcelable(RESULT_RECEIVER);
+        }
+
+        if (mLayoutId == 0) {
+            Intent intent = getIntent();
+            mLayoutId = intent.getIntExtra(LAYOUT_ID, R.layout.start);
+            mTest = intent.getIntExtra(TEST, 0);
+            mResultReceiver = intent.getParcelableExtra(RESULT_RECEIVER);
+        }
+
+        setContentView(mLayoutId);
+
+        startTest();
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        outState.putInt(LAYOUT_ID, mLayoutId);
+        outState.putInt(TEST, mTest);
+        outState.putParcelable(RESULT_RECEIVER, mResultReceiver);
+    }
+
+    private void startTest() {
+        if (mTest == TEST_ARRIVE) {
+            setEnterSharedElementCallback(new SharedElementCallback() {
+                @Override
+                public void onSharedElementsArrived(List<String> sharedElementNames,
+                        final List<View> sharedElements,
+                        final OnSharedElementsReadyListener listener) {
+                    mNumSharedElementsArrivedCalled++;
+                    result.putInt(ARRIVE_COUNT, mNumSharedElementsArrivedCalled);
+                    if (mEntering) {
+                        result.putInt(ARRIVE_ENTER_START_VISIBILITY, sharedElements.get(0).getVisibility());
+                        result.putLong(ARRIVE_ENTER_TIME, SystemClock.uptimeMillis());
+                    } else {
+                        result.putLong(ARRIVE_RETURN_TIME, SystemClock.uptimeMillis());
+                    }
+
+                    getWindow().getDecorView().postDelayed(new Runnable() {
+                        @Override
+                        public void run() {
+                            if (mEntering) {
+                                result.putInt(ARRIVE_ENTER_DELAY_VISIBILITY,
+                                        sharedElements.get(0).getVisibility());
+                                result.putLong(ARRIVE_ENTER_TIME_READY, SystemClock.uptimeMillis());
+                            } else {
+                                result.putLong(ARRIVE_RETURN_TIME_READY,
+                                        SystemClock.uptimeMillis());
+                                mResultReceiver.send(RESULT_OK, result);
+                            }
+                            listener.onSharedElementsReady();
+                        }
+                    }, SHARED_ELEMENT_READY_DELAY);
+                }
+            });
+            getWindow().getEnterTransition().addListener(new TransitionListener() {
+                @Override
+                public void onTransitionStart(Transition transition) {
+                }
+
+                @Override
+                public void onTransitionEnd(Transition transition) {
+                    mEntering = false;
+                    setResult(RESULT_OK);
+                    getWindow().getDecorView().post(new Runnable() {
+                        @Override
+                        public void run() {
+                            finishAfterTransition();
+                        }
+                    });
+                }
+
+                @Override
+                public void onTransitionCancel(Transition transition) {
+                }
+
+                @Override
+                public void onTransitionPause(Transition transition) {
+                }
+
+                @Override
+                public void onTransitionResume(Transition transition) {
+                }
+            });
+        }
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        synchronized (this) {
+            super.onActivityResult(requestCode, resultCode, data);
+            this.resultCode = resultCode;
+            this.notifyAll();
+        }
+    }
+}
diff --git a/tests/tests/app.usage/src/android/app/usage/cts/ActivityTransitionTest.java b/tests/tests/app.usage/src/android/app/usage/cts/ActivityTransitionTest.java
new file mode 100644
index 0000000..ef126fe
--- /dev/null
+++ b/tests/tests/app.usage/src/android/app/usage/cts/ActivityTransitionTest.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2015 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.app.usage.cts;
+
+import android.app.ActivityOptions;
+import android.app.SharedElementCallback;
+import android.app.usage.cts.R;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.ResultReceiver;
+import android.os.SystemClock;
+import android.test.ActivityInstrumentationTestCase2;
+import android.view.View;
+
+import java.util.List;
+
+public class ActivityTransitionTest extends
+        ActivityInstrumentationTestCase2<ActivityTransitionActivity> {
+    protected ActivityTransitionActivity mActivity;
+
+    private int mNumArrivedCalls;
+    private PassInfo mReceiver;
+    private long mExitTime;
+    private long mExitTimeReady;
+    private long mReenterTime;
+    private long mReenterTimeReady;
+
+    public ActivityTransitionTest() {
+        super(ActivityTransitionActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        setActivityInitialTouchMode(false);
+        mActivity = getActivity();
+        mNumArrivedCalls = 0;
+    }
+
+    public void testOnSharedElementsArrived() throws Throwable {
+        getInstrumentation().waitForIdleSync();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mReceiver = new PassInfo(new Handler());
+                mActivity.setExitSharedElementCallback(new SharedElementCallback() {
+                    @Override
+                    public void onSharedElementsArrived(List<String> sharedElementNames,
+                            List<View> sharedElements,
+                            final OnSharedElementsReadyListener listener) {
+                        mNumArrivedCalls++;
+                        final boolean isExiting = mExitTimeReady == 0;
+                        if (isExiting) {
+                            mExitTime = SystemClock.uptimeMillis();
+                        } else {
+                            mReenterTime = SystemClock.uptimeMillis();
+                        }
+                        mActivity.getWindow().getDecorView().postDelayed(new Runnable() {
+                            @Override
+                            public void run() {
+                                if (isExiting) {
+                                    mExitTimeReady = SystemClock.uptimeMillis();
+                                } else {
+                                    mReenterTimeReady = SystemClock.uptimeMillis();
+                                }
+                                listener.onSharedElementsReady();
+                            }
+                        }, 60);
+                    }
+                });
+
+                Bundle options = ActivityOptions.makeSceneTransitionAnimation(mActivity,
+                        mActivity.findViewById(R.id.hello), "target").toBundle();
+                Intent intent = new Intent(mActivity, ActivityTransitionActivity.class);
+                intent.putExtra(ActivityTransitionActivity.TEST,
+                        ActivityTransitionActivity.TEST_ARRIVE);
+                intent.putExtra(ActivityTransitionActivity.LAYOUT_ID, R.layout.end);
+                intent.putExtra(ActivityTransitionActivity.RESULT_RECEIVER, mReceiver);
+                mActivity.startActivityForResult(intent, 0, options);
+            }
+        });
+
+        long endTime = SystemClock.uptimeMillis() + 1500;
+        synchronized (mActivity) {
+            while (mActivity.resultCode == 0) {
+                long waitTime = endTime - SystemClock.uptimeMillis();
+                if (waitTime <= 0) {
+                    fail("Activity didn't finish!");
+                }
+                mActivity.wait(waitTime);
+            }
+        }
+        assertNotNull(mReceiver.resultData);
+        assertEquals(2, mReceiver.resultData.getInt(
+                ActivityTransitionActivity.ARRIVE_COUNT, -1));
+        assertEquals(2, mNumArrivedCalls);
+        assertNotSame(View.VISIBLE, mReceiver.resultData.getInt(
+                ActivityTransitionActivity.ARRIVE_ENTER_START_VISIBILITY));
+        assertNotSame(View.VISIBLE, mReceiver.resultData.getInt(
+                ActivityTransitionActivity.ARRIVE_ENTER_DELAY_VISIBILITY));
+        long enterTimeReady = mReceiver.resultData.getLong(
+                ActivityTransitionActivity.ARRIVE_ENTER_TIME_READY);
+        long returnTimeReady = mReceiver.resultData.getLong(
+                ActivityTransitionActivity.ARRIVE_RETURN_TIME_READY);
+        long enterTime = mReceiver.resultData.getLong(
+                ActivityTransitionActivity.ARRIVE_ENTER_TIME);
+        long returnTime = mReceiver.resultData.getLong(
+                ActivityTransitionActivity.ARRIVE_RETURN_TIME);
+
+        assertTrue(mExitTime < mExitTimeReady);
+        assertTrue(mExitTimeReady <= enterTime);
+        assertTrue(enterTime < enterTimeReady);
+        assertTrue(enterTimeReady <= returnTime);
+        assertTrue(returnTime < returnTimeReady);
+        assertTrue(returnTimeReady <= mReenterTime);
+        assertTrue(mReenterTime < mReenterTimeReady);
+    }
+
+    public static class PassInfo extends ResultReceiver {
+        public int resultCode;
+        public Bundle resultData;
+
+        public PassInfo(Handler handler) {
+            super(handler);
+        }
+
+        @Override
+        protected void onReceiveResult(int resultCode, Bundle resultData) {
+            this.resultCode = resultCode;
+            this.resultData = resultData;
+        }
+    }
+}
diff --git a/tests/tests/app.usage/src/android/app/usage/cts/NetworkUsageStatsTest.java b/tests/tests/app.usage/src/android/app/usage/cts/NetworkUsageStatsTest.java
new file mode 100644
index 0000000..b6fef4a
--- /dev/null
+++ b/tests/tests/app.usage/src/android/app/usage/cts/NetworkUsageStatsTest.java
@@ -0,0 +1,446 @@
+/**
+ * Copyright (C) 2015 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.app.usage.cts;
+
+import android.app.AppOpsManager;
+import android.app.usage.NetworkStatsManager;
+import android.app.usage.NetworkStats;
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.NetworkRequest;
+import android.os.ParcelFileDescriptor;
+import android.os.Process;
+import android.os.RemoteException;
+import android.telephony.TelephonyManager;
+import android.test.InstrumentationTestCase;
+import android.util.Log;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.text.MessageFormat;
+import java.util.Scanner;
+import javax.net.ssl.HttpsURLConnection;
+
+import libcore.io.IoUtils;
+import libcore.io.Streams;
+
+public class NetworkUsageStatsTest extends InstrumentationTestCase {
+    private static final String LOG_TAG = "NetworkUsageStatsTest";
+    private static final String APPOPS_SET_SHELL_COMMAND = "appops set {0} {1} {2}";
+    private static final String APPOPS_GET_SHELL_COMMAND = "appops get {0} {1}";
+
+    private static final long MINUTE = 1000 * 60;
+
+    private static final int[] sNetworkTypesToTest = new int[] {
+        ConnectivityManager.TYPE_WIFI,
+        ConnectivityManager.TYPE_MOBILE,
+    };
+
+    // Order corresponds to sNetworkTypesToTest
+    private static final int[] sTransportTypesToTest = new int[] {
+        NetworkCapabilities.TRANSPORT_WIFI,
+        NetworkCapabilities.TRANSPORT_CELLULAR,
+    };
+
+    private NetworkStatsManager mNsm;
+    private ConnectivityManager mCm;
+    private long mStartTime;
+    private long mEndTime;
+
+    private long mBytesRead;
+    private String mWriteSettingsMode;
+    private String mUsageStatsMode;
+
+    private void exerciseRemoteHost(int transportType) throws Exception {
+        final int timeout = 15000;
+        mCm.requestNetwork(new NetworkRequest.Builder()
+            .addTransportType(transportType)
+            .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+            .build(), new ConnectivityManager.NetworkCallback() {
+                @Override
+                public void onAvailable(Network network) {
+                    NetworkInfo networkInfo = mCm.getNetworkInfo(network);
+                    if (networkInfo == null) {
+                        Log.w(LOG_TAG, "Network info is null");
+                    } else {
+                        Log.w(LOG_TAG, "Network: " + networkInfo.toString());
+                    }
+                    InputStreamReader in = null;
+                    HttpsURLConnection urlc = null;
+                    String originalKeepAlive = System.getProperty("http.keepAlive");
+                    System.setProperty("http.keepAlive", "false");
+                    try {
+                        urlc = (HttpsURLConnection) network.openConnection(new URL(
+                                "https://www.google.com"));
+                        urlc.setConnectTimeout(timeout);
+                        urlc.setUseCaches(false);
+                        urlc.connect();
+                        boolean ping = urlc.getResponseCode() == 200;
+                        if (ping) {
+                            in = new InputStreamReader(
+                                    (InputStream) urlc.getContent());
+
+                            mBytesRead = 0;
+                            while (in.read() != -1) ++mBytesRead;
+                        }
+                    } catch (Exception e) {
+                        Log.i(LOG_TAG, "Badness during exercising remote server: " + e);
+                    } finally {
+                        if (in != null) {
+                            try {
+                                in.close();
+                            } catch (IOException e) {
+                                // don't care
+                            }
+                        }
+                        if (urlc != null) {
+                            urlc.disconnect();
+                        }
+                        if (originalKeepAlive == null) {
+                            System.clearProperty("http.keepAlive");
+                        } else {
+                            System.setProperty("http.keepAlive", originalKeepAlive);
+                        }
+                    }
+                }
+            });
+        try {
+            Thread.sleep(timeout);
+        } catch (InterruptedException e) {
+        }
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mNsm = (NetworkStatsManager) getInstrumentation().getContext()
+                .getSystemService(Context.NETWORK_STATS_SERVICE);
+
+        mCm = (ConnectivityManager) getInstrumentation().getContext()
+                .getSystemService(Context.CONNECTIVITY_SERVICE);
+
+        mWriteSettingsMode = getAppOpsMode(AppOpsManager.OPSTR_WRITE_SETTINGS);
+        setAppOpsMode(AppOpsManager.OPSTR_WRITE_SETTINGS, "allow");
+        mUsageStatsMode = getAppOpsMode(AppOpsManager.OPSTR_GET_USAGE_STATS);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mWriteSettingsMode != null) {
+            setAppOpsMode(AppOpsManager.OPSTR_WRITE_SETTINGS, mWriteSettingsMode);
+        }
+        if (mUsageStatsMode != null) {
+            setAppOpsMode(AppOpsManager.OPSTR_GET_USAGE_STATS, mUsageStatsMode);
+        }
+        super.tearDown();
+    }
+
+    private void setAppOpsMode(String appop, String mode) throws Exception {
+        final String command = MessageFormat.format(APPOPS_SET_SHELL_COMMAND,
+                getInstrumentation().getContext().getPackageName(), appop, mode);
+        ParcelFileDescriptor pfd = getInstrumentation().getUiAutomation()
+                .executeShellCommand(command);
+        try {
+            Streams.readFully(new FileInputStream(pfd.getFileDescriptor()));
+        } finally {
+            IoUtils.closeQuietly(pfd.getFileDescriptor());
+        }
+    }
+
+    private String getAppOpsMode(String appop) throws Exception {
+        String result;
+        final String command = MessageFormat.format(APPOPS_GET_SHELL_COMMAND,
+                getInstrumentation().getContext().getPackageName(), appop);
+        ParcelFileDescriptor pfd = getInstrumentation().getUiAutomation()
+                .executeShellCommand(command);
+        try {
+            result = convertStreamToString(new FileInputStream(pfd.getFileDescriptor()));
+        } finally {
+            IoUtils.closeQuietly(pfd.getFileDescriptor());
+        }
+        if (result == null) {
+            Log.w(LOG_TAG, "App op " + appop + " could not be read.");
+        }
+        return result;
+    }
+
+    private static String convertStreamToString(InputStream is) {
+        try (Scanner scanner = new Scanner(is).useDelimiter("\\A")) {
+            return scanner.hasNext() ? scanner.next() : null;
+        }
+    }
+
+    private boolean shouldTestThisNetworkType(int networkTypeIndex, long tolerance)
+            throws Exception {
+        NetworkInfo networkInfo = mCm.getNetworkInfo(sNetworkTypesToTest[networkTypeIndex]);
+        if (networkInfo == null || !networkInfo.isAvailable()) {
+            return false;
+        }
+        mStartTime = System.currentTimeMillis() - tolerance;
+        exerciseRemoteHost(sTransportTypesToTest[networkTypeIndex]);
+        mEndTime = System.currentTimeMillis() + tolerance;
+        return true;
+    }
+
+    private String getSubscriberId(int networkType) {
+        if (ConnectivityManager.TYPE_MOBILE == networkType) {
+            TelephonyManager tm = (TelephonyManager) getInstrumentation().getContext()
+                    .getSystemService(Context.TELEPHONY_SERVICE);
+            return tm.getSubscriberId();
+        }
+        return "";
+    }
+
+    public void testDeviceSummary() throws Exception {
+        for (int i = 0; i < sNetworkTypesToTest.length; ++i) {
+            if (!shouldTestThisNetworkType(i, MINUTE/2)) {
+                continue;
+            }
+            setAppOpsMode(AppOpsManager.OPSTR_GET_USAGE_STATS, "allow");
+            NetworkStats.Bucket bucket = null;
+            try {
+                bucket = mNsm.querySummaryForDevice(
+                        sNetworkTypesToTest[i], getSubscriberId(sNetworkTypesToTest[i]),
+                        mStartTime, mEndTime);
+            } catch (RemoteException | SecurityException e) {
+                fail("testDeviceSummary fails with exception: " + e.toString());
+            }
+            assertNotNull(bucket);
+            assertTimestamps(bucket);
+            assertEquals(bucket.getState(), NetworkStats.Bucket.STATE_ALL);
+            assertEquals(bucket.getUid(), NetworkStats.Bucket.UID_ALL);
+            setAppOpsMode(AppOpsManager.OPSTR_GET_USAGE_STATS, "deny");
+            try {
+                bucket = mNsm.querySummaryForDevice(
+                        sNetworkTypesToTest[i], getSubscriberId(sNetworkTypesToTest[i]),
+                        mStartTime, mEndTime);
+                fail("negative testDeviceSummary fails: no exception thrown.");
+            } catch (RemoteException e) {
+                fail("testDeviceSummary fails with exception: " + e.toString());
+            } catch (SecurityException e) {
+                // expected outcome
+            }
+        }
+    }
+
+    public void testUserSummary() throws Exception {
+        for (int i = 0; i < sNetworkTypesToTest.length; ++i) {
+            if (!shouldTestThisNetworkType(i, MINUTE/2)) {
+                continue;
+            }
+            setAppOpsMode(AppOpsManager.OPSTR_GET_USAGE_STATS, "allow");
+            NetworkStats.Bucket bucket = null;
+            try {
+                bucket = mNsm.querySummaryForUser(
+                        sNetworkTypesToTest[i], getSubscriberId(sNetworkTypesToTest[i]),
+                        mStartTime, mEndTime);
+            } catch (RemoteException | SecurityException e) {
+                fail("testUserSummary fails with exception: " + e.toString());
+            }
+            assertNotNull(bucket);
+            assertTimestamps(bucket);
+            assertEquals(bucket.getState(), NetworkStats.Bucket.STATE_ALL);
+            assertEquals(bucket.getUid(), NetworkStats.Bucket.UID_ALL);
+            setAppOpsMode(AppOpsManager.OPSTR_GET_USAGE_STATS, "deny");
+            try {
+                bucket = mNsm.querySummaryForUser(
+                        sNetworkTypesToTest[i], getSubscriberId(sNetworkTypesToTest[i]),
+                        mStartTime, mEndTime);
+                fail("negative testUserSummary fails: no exception thrown.");
+            } catch (RemoteException e) {
+                fail("testUserSummary fails with exception: " + e.toString());
+            } catch (SecurityException e) {
+                // expected outcome
+            }
+        }
+    }
+
+    public void testAppSummary() throws Exception {
+        for (int i = 0; i < sNetworkTypesToTest.length; ++i) {
+            if (!shouldTestThisNetworkType(i, MINUTE/2)) {
+                continue;
+            }
+            setAppOpsMode(AppOpsManager.OPSTR_GET_USAGE_STATS, "allow");
+            NetworkStats result = null;
+            try {
+                result = mNsm.querySummary(
+                        sNetworkTypesToTest[i], getSubscriberId(sNetworkTypesToTest[i]),
+                        mStartTime, mEndTime);
+                assertTrue(result != null);
+                NetworkStats.Bucket bucket = new NetworkStats.Bucket();
+                long totalTxPackets = 0;
+                long totalRxPackets = 0;
+                long totalTxBytes = 0;
+                long totalRxBytes = 0;
+                while (result.hasNextBucket()) {
+                    assertTrue(result.getNextBucket(bucket));
+                    assertTimestamps(bucket);
+                    if (bucket.getUid() == Process.myUid()) {
+                        totalTxPackets += bucket.getTxPackets();
+                        totalRxPackets += bucket.getRxPackets();
+                        totalTxBytes += bucket.getTxBytes();
+                        totalRxBytes += bucket.getRxBytes();
+                    }
+                }
+                assertFalse(result.getNextBucket(bucket));
+                assertTrue("No Rx bytes usage for uid " + Process.myUid(), totalRxBytes > 0);
+                assertTrue("No Rx packets usage for uid " + Process.myUid(), totalRxPackets > 0);
+                assertTrue("No Tx bytes usage for uid " + Process.myUid(), totalTxBytes > 0);
+                assertTrue("No Tx packets usage for uid " + Process.myUid(), totalTxPackets > 0);
+            } catch (RemoteException | SecurityException e) {
+                fail("testAppSummary fails with exception: " + e.toString());
+            } finally {
+                if (result != null) {
+                    result.close();
+                }
+            }
+            setAppOpsMode(AppOpsManager.OPSTR_GET_USAGE_STATS, "deny");
+            try {
+                result = mNsm.querySummary(
+                        sNetworkTypesToTest[i], getSubscriberId(sNetworkTypesToTest[i]),
+                        mStartTime, mEndTime);
+                fail("negative testAppSummary fails: no exception thrown.");
+            } catch (RemoteException e) {
+                fail("testAppSummary fails with exception: " + e.toString());
+            } catch (SecurityException e) {
+                // expected outcome
+            }
+        }
+    }
+
+    public void testAppDetails() throws Exception {
+        for (int i = 0; i < sNetworkTypesToTest.length; ++i) {
+            // Relatively large tolerance to accommodate for history bucket size.
+            if (!shouldTestThisNetworkType(i, MINUTE * 120)) {
+                continue;
+            }
+            setAppOpsMode(AppOpsManager.OPSTR_GET_USAGE_STATS, "allow");
+            NetworkStats result = null;
+            try {
+                result = mNsm.queryDetails(
+                        sNetworkTypesToTest[i], getSubscriberId(sNetworkTypesToTest[i]),
+                        mStartTime, mEndTime);
+                assertTrue(result != null);
+                NetworkStats.Bucket bucket = new NetworkStats.Bucket();
+                long totalTxPackets = 0;
+                long totalRxPackets = 0;
+                long totalTxBytes = 0;
+                long totalRxBytes = 0;
+                while (result.hasNextBucket()) {
+                    assertTrue(result.getNextBucket(bucket));
+                    assertTimestamps(bucket);
+                    assertEquals(bucket.getState(), NetworkStats.Bucket.STATE_ALL);
+                    if (bucket.getUid() == Process.myUid()) {
+                        totalTxPackets += bucket.getTxPackets();
+                        totalRxPackets += bucket.getRxPackets();
+                        totalTxBytes += bucket.getTxBytes();
+                        totalRxBytes += bucket.getRxBytes();
+                    }
+                }
+                assertFalse(result.getNextBucket(bucket));
+                assertTrue("No Rx bytes usage for uid " + Process.myUid(), totalRxBytes > 0);
+                assertTrue("No Rx packets usage for uid " + Process.myUid(), totalRxPackets > 0);
+                assertTrue("No Tx bytes usage for uid " + Process.myUid(), totalTxBytes > 0);
+                assertTrue("No Tx packets usage for uid " + Process.myUid(), totalTxPackets > 0);
+            } catch (RemoteException | SecurityException e) {
+                fail("testAppDetails fails with exception: " + e.toString());
+            } finally {
+                if (result != null) {
+                    result.close();
+                }
+            }
+            setAppOpsMode(AppOpsManager.OPSTR_GET_USAGE_STATS, "deny");
+            try {
+                result = mNsm.queryDetails(
+                        sNetworkTypesToTest[i], getSubscriberId(sNetworkTypesToTest[i]),
+                        mStartTime, mEndTime);
+                fail("negative testAppDetails fails: no exception thrown.");
+            } catch (RemoteException e) {
+                fail("testAppDetails fails with exception: " + e.toString());
+            } catch (SecurityException e) {
+                // expected outcome
+            }
+        }
+    }
+
+    public void testUidDetails() throws Exception {
+        for (int i = 0; i < sNetworkTypesToTest.length; ++i) {
+            // Relatively large tolerance to accommodate for history bucket size.
+            if (!shouldTestThisNetworkType(i, MINUTE * 120)) {
+                continue;
+            }
+            setAppOpsMode(AppOpsManager.OPSTR_GET_USAGE_STATS, "allow");
+            NetworkStats result = null;
+            try {
+                result = mNsm.queryDetailsForUid(
+                        sNetworkTypesToTest[i], getSubscriberId(sNetworkTypesToTest[i]),
+                        mStartTime, mEndTime, Process.myUid());
+                assertTrue(result != null);
+                NetworkStats.Bucket bucket = new NetworkStats.Bucket();
+                long totalTxPackets = 0;
+                long totalRxPackets = 0;
+                long totalTxBytes = 0;
+                long totalRxBytes = 0;
+                while (result.hasNextBucket()) {
+                    assertTrue(result.getNextBucket(bucket));
+                    assertTimestamps(bucket);
+                    assertEquals(bucket.getState(), NetworkStats.Bucket.STATE_ALL);
+                    assertEquals(bucket.getUid(), Process.myUid());
+                    totalTxPackets += bucket.getTxPackets();
+                    totalRxPackets += bucket.getRxPackets();
+                    totalTxBytes += bucket.getTxBytes();
+                    totalRxBytes += bucket.getRxBytes();
+                }
+                assertFalse(result.getNextBucket(bucket));
+                assertTrue("No Rx bytes usage for uid " + Process.myUid(), totalRxBytes > 0);
+                assertTrue("No Rx packets usage for uid " + Process.myUid(), totalRxPackets > 0);
+                assertTrue("No Tx bytes usage for uid " + Process.myUid(), totalTxBytes > 0);
+                assertTrue("No Tx packets usage for uid " + Process.myUid(), totalTxPackets > 0);
+            } catch (RemoteException | SecurityException e) {
+                fail("testUidDetails fails with exception: " + e.toString());
+            } finally {
+                if (result != null) {
+                    result.close();
+                }
+            }
+            setAppOpsMode(AppOpsManager.OPSTR_GET_USAGE_STATS, "deny");
+            try {
+                result = mNsm.queryDetailsForUid(
+                        sNetworkTypesToTest[i], getSubscriberId(sNetworkTypesToTest[i]),
+                        mStartTime, mEndTime, Process.myUid());
+                fail("negative testUidDetails fails: no exception thrown.");
+            } catch (RemoteException e) {
+                fail("testUidDetails fails with exception: " + e.toString());
+            } catch (SecurityException e) {
+                // expected outcome
+            }
+        }
+    }
+
+    private void assertTimestamps(final NetworkStats.Bucket bucket) {
+        assertTrue("Start timestamp " + bucket.getStartTimeStamp() + " is less than " +
+                mStartTime, bucket.getStartTimeStamp() >= mStartTime);
+        assertTrue("End timestamp " + bucket.getEndTimeStamp() + " is greater than " +
+                mEndTime, bucket.getEndTimeStamp() <= mEndTime);
+    }
+}
diff --git a/tests/tests/app/Android.mk b/tests/tests/app/Android.mk
index 39be0dc..301f931 100644
--- a/tests/tests/app/Android.mk
+++ b/tests/tests/app/Android.mk
@@ -21,7 +21,7 @@
 # and when built explicitly put it in the data partition
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
-LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common voip-common
+LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common voip-common org.apache.http.legacy
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner ctstestserver
 
@@ -31,4 +31,6 @@
 
 LOCAL_INSTRUMENTATION_FOR := CtsAppTestStubs
 
+LOCAL_SDK_VERSION := current
+
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/app/AndroidManifest.xml b/tests/tests/app/AndroidManifest.xml
index 7c09cd2..d05648c 100644
--- a/tests/tests/app/AndroidManifest.xml
+++ b/tests/tests/app/AndroidManifest.xml
@@ -18,10 +18,12 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.cts.app">
 
+    <uses-sdk android:minSdkVersion="11" />
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
     <uses-permission android:name="android.permission.BODY_SENSORS" />
     <application>
         <uses-library android:name="android.test.runner" />
+        <uses-library android:name="org.apache.http.legacy" android:required="false" />
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/tests/tests/app/AndroidTest.xml b/tests/tests/app/AndroidTest.xml
new file mode 100644
index 0000000..01ebbcb
--- /dev/null
+++ b/tests/tests/app/AndroidTest.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="Base config for CTS package preparer">
+    <include name="common-config" />
+    <option name="cts-apk-installer:test-file-name" value="CtsSimpleApp.apk" />
+</configuration>
diff --git a/tests/tests/app/src/android/app/cts/ActivityManagerMemoryClassTest.java b/tests/tests/app/src/android/app/cts/ActivityManagerMemoryClassTest.java
index 5deff5a..dfa278a 100644
--- a/tests/tests/app/src/android/app/cts/ActivityManagerMemoryClassTest.java
+++ b/tests/tests/app/src/android/app/cts/ActivityManagerMemoryClassTest.java
@@ -52,9 +52,11 @@
             expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_MEDIUM, 32);
             expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_TV, 48);
             expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_HIGH, 48);
-            expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_XHIGH, 48);
             expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_280, 48);
+            expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_XHIGH, 48);
+            expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_360, 64);
             expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_400, 96);
+            expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_420, 112);
             expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_XXHIGH, 128);
             expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_560, 192);
             expectedMemorySizeForSmallNormalScreen.put(DisplayMetrics.DENSITY_XXXHIGH, 256);
@@ -65,9 +67,11 @@
             expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_MEDIUM, 64);
             expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_TV, 80);
             expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_HIGH, 80);
-            expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_XHIGH, 128);
             expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_280, 96);
+            expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_XHIGH, 128);
+            expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_360, 160);
             expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_400, 192);
+            expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_420, 228);
             expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_XXHIGH, 256);
             expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_560, 384);
             expectedMemorySizeForLargeScreen.put(DisplayMetrics.DENSITY_XXXHIGH, 512);
@@ -78,9 +82,11 @@
             expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_MEDIUM, 80);
             expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_TV, 96);
             expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_HIGH, 96);
-            expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_XHIGH, 192);
             expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_280, 144);
+            expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_XHIGH, 192);
+            expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_360, 240);
             expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_400, 288);
+            expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_420, 336);
             expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_XXHIGH, 384);
             expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_560, 576);
             expectedMemorySizeForXLargeScreen.put(DisplayMetrics.DENSITY_XXXHIGH, 768);
diff --git a/tests/tests/app/src/android/app/cts/ActivityManagerMemoryInfoTest.java b/tests/tests/app/src/android/app/cts/ActivityManagerMemoryInfoTest.java
index 3248caa..8ac5afb 100644
--- a/tests/tests/app/src/android/app/cts/ActivityManagerMemoryInfoTest.java
+++ b/tests/tests/app/src/android/app/cts/ActivityManagerMemoryInfoTest.java
@@ -34,7 +34,7 @@
     }
 
     public void testWriteToParcel() throws Exception {
-        final long AVAILMEM = Process.getFreeMemory();
+        final long AVAILMEM = 1000l;
         mMemory.availMem = AVAILMEM;
         final long THRESHOLD = 500l;
         mMemory.threshold = THRESHOLD;
@@ -59,7 +59,7 @@
     }
 
     public void testReadFromParcel() throws Exception {
-        final long AVAILMEM = Process.getFreeMemory();
+        final long AVAILMEM = 1000l;
         mMemory.availMem = AVAILMEM;
         final long THRESHOLD = 500l;
         mMemory.threshold = THRESHOLD;
diff --git a/tests/tests/app/src/android/app/cts/ActivityManagerTest.java b/tests/tests/app/src/android/app/cts/ActivityManagerTest.java
index e633f1f..02d13ef 100644
--- a/tests/tests/app/src/android/app/cts/ActivityManagerTest.java
+++ b/tests/tests/app/src/android/app/cts/ActivityManagerTest.java
@@ -16,21 +16,23 @@
 package android.app.cts;
 
 import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.List;
 
 import android.app.Activity;
 import android.app.ActivityManager;
-import android.app.Instrumentation;
-import android.app.ActivityManager.ProcessErrorStateInfo;
 import android.app.ActivityManager.RecentTaskInfo;
 import android.app.ActivityManager.RunningAppProcessInfo;
 import android.app.ActivityManager.RunningServiceInfo;
 import android.app.ActivityManager.RunningTaskInfo;
+import android.app.ActivityOptions;
+import android.app.Instrumentation;
 import android.app.Instrumentation.ActivityMonitor;
 import android.app.Instrumentation.ActivityResult;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.pm.ConfigurationInfo;
 import android.test.InstrumentationTestCase;
 
@@ -39,6 +41,27 @@
     private static final int WAITFOR_MSEC = 5000;
     private static final String SERVICE_NAME = "android.app.cts.MockService";
     private static final int WAIT_TIME = 2000;
+    // A secondary test activity from another APK.
+    private static final String SIMPLE_PACKAGE_NAME = "com.android.cts.launcherapps.simpleapp";
+    private static final String SIMPLE_ACTIVITY = ".SimpleActivity";
+    private static final String SIMPLE_ACTIVITY_IMMEDIATE_EXIT = ".SimpleActivityImmediateExit";
+    private static final String SIMPLE_ACTIVITY_CHAIN_EXIT = ".SimpleActivityChainExit";
+    // The action sent back by the SIMPLE_APP after a restart.
+    private static final String ACTIVITY_LAUNCHED_ACTION =
+            "com.android.cts.launchertests.LauncherAppsTests.LAUNCHED_ACTION";
+    // The action sent back by the SIMPLE_APP_IMMEDIATE_EXIT when it terminates.
+    private static final String ACTIVITY_EXIT_ACTION =
+            "com.android.cts.launchertests.LauncherAppsTests.EXIT_ACTION";
+    // The action sent back by the SIMPLE_APP_CHAIN_EXIT when the task chain ends. 
+    private static final String ACTIVITY_CHAIN_EXIT_ACTION =
+            "com.android.cts.launchertests.LauncherAppsTests.CHAIN_EXIT_ACTION";
+    // The action sent to identify the time track info.
+    private static final String ACTIVITY_TIME_TRACK_INFO = "com.android.cts.TIME_TRACK_INFO";
+    // Return states of the ActivityReceiverFilter.
+    public static final int RESULT_PASS = 1;
+    public static final int RESULT_FAIL = 2;
+    public static final int RESULT_TIMEOUT = 3;
+
     private Context mContext;
     private ActivityManager mActivityManager;
     private Intent mIntent;
@@ -119,6 +142,79 @@
         }
     }
 
+    public void testGetRecentTasksLimitedToCurrentAPK() throws Exception {
+        int maxNum = 0;
+        int flags = 0;
+
+        // Check the number of tasks at this time.
+        List<RecentTaskInfo>  recentTaskList;
+        recentTaskList = mActivityManager.getRecentTasks(maxNum, flags);
+        int numberOfEntriesFirstRun = recentTaskList.size();
+
+        // Start another activity from another APK.
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setClassName(SIMPLE_PACKAGE_NAME, SIMPLE_PACKAGE_NAME + SIMPLE_ACTIVITY);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        ActivityReceiverFilter receiver = new ActivityReceiverFilter(ACTIVITY_LAUNCHED_ACTION);
+        mContext.startActivity(intent);
+
+        // Make sure the activity has really started.
+        assertEquals(RESULT_PASS, receiver.waitForActivity());
+        receiver.close();
+
+        // There shouldn't be any more tasks in this list at this time.
+        recentTaskList = mActivityManager.getRecentTasks(maxNum, flags);
+        int numberOfEntriesSecondRun = recentTaskList.size();
+        assertTrue(numberOfEntriesSecondRun == numberOfEntriesFirstRun);
+    }
+
+    // The receiver filter needs to be instantiated with the command to filter for before calling
+    // startActivity.
+    private class ActivityReceiverFilter extends BroadcastReceiver {
+        // The activity we want to filter for.
+        private String mActivityToFilter;
+        private int result = RESULT_TIMEOUT;
+        public long mTimeUsed = 0;
+        private static final int TIMEOUT_IN_MS = 1000;
+
+        // Create the filter with the intent to look for.
+        public ActivityReceiverFilter(String activityToFilter) {
+            mActivityToFilter = activityToFilter;
+            IntentFilter filter = new IntentFilter();
+            filter.addAction(mActivityToFilter);
+            mInstrumentation.getTargetContext().registerReceiver(this, filter);
+        }
+
+        // Turn off the filter.
+        public void close() {
+            mInstrumentation.getTargetContext().unregisterReceiver(this);
+        }
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (intent.getAction().equals(mActivityToFilter)) {
+                synchronized(this) {
+                   result = RESULT_PASS;
+                   if (mActivityToFilter.equals(ACTIVITY_TIME_TRACK_INFO)) {
+                       mTimeUsed = intent.getExtras().getLong(
+                               ActivityOptions.EXTRA_USAGE_TIME_REPORT);
+                   }
+                   notifyAll();
+                }
+            }
+        }
+
+        public int waitForActivity() {
+            synchronized(this) {
+                try {
+                    wait(TIMEOUT_IN_MS);
+                } catch (InterruptedException e) {
+                }
+            }
+            return result;
+        }
+    }
+
     private final <T extends Activity> void startSubActivity(Class<T> activityClass) {
         final Instrumentation.ActivityResult result = new ActivityResult(0, new Intent());
         final ActivityMonitor monitor = new ActivityMonitor(activityClass.getName(), result, false);
@@ -219,7 +315,8 @@
                 hasTestProcess = true;
             }
         }
-        assertTrue(hasSystemProcess && hasTestProcess);
+        // For security reasons the system process is not exposed.
+        assertTrue(!hasSystemProcess && hasTestProcess);
 
         for (RunningAppProcessInfo ra : list) {
             if (ra.processName.equals("com.android.cts.app.stub:remote")) {
@@ -272,4 +369,158 @@
         assertFalse("isRunningInTestHarness must be false in production builds",
                 ActivityManager.isRunningInTestHarness());
     }
+
+    /**
+     * Go back to the home screen since running applications can interfere with application
+     * lifetime tests.
+     */
+    private void launchHome() throws Exception {
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.addCategory(Intent.CATEGORY_HOME);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mContext.startActivity(intent);
+        Thread.sleep(WAIT_TIME);
+    }
+
+    /**
+     * Verify that the TimeTrackingAPI works properly when starting and ending an activity.
+     */
+    public void testTimeTrackingAPI_SimpleStartExit() throws Exception {
+        launchHome();
+        // Prepare to start an activity from another APK.
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setClassName(SIMPLE_PACKAGE_NAME,
+                SIMPLE_PACKAGE_NAME + SIMPLE_ACTIVITY_IMMEDIATE_EXIT);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+        // Prepare the time receiver action.
+        Context context = mInstrumentation.getTargetContext();
+        ActivityOptions options = ActivityOptions.makeBasic();
+        Intent receiveIntent = new Intent(ACTIVITY_TIME_TRACK_INFO);
+        options.requestUsageTimeReport(PendingIntent.getBroadcast(context,
+                0, receiveIntent, PendingIntent.FLAG_CANCEL_CURRENT));
+
+        // The application finished tracker.
+        ActivityReceiverFilter appEndReceiver = new ActivityReceiverFilter(ACTIVITY_EXIT_ACTION);
+
+        // The filter for the time event.
+        ActivityReceiverFilter timeReceiver = new ActivityReceiverFilter(ACTIVITY_TIME_TRACK_INFO);
+
+        // Run the activity.
+        mContext.startActivity(intent, options.toBundle());
+
+        // Wait until it finishes and end the reciever then.
+        assertEquals(RESULT_PASS, appEndReceiver.waitForActivity());
+        appEndReceiver.close();
+
+        // At this time the timerReceiver should not fire, even though the activity has shut down,
+        // because we are back to the home screen.
+        assertEquals(RESULT_TIMEOUT, timeReceiver.waitForActivity());
+        assertTrue(timeReceiver.mTimeUsed == 0);
+
+        // Issuing now another activity will trigger the timing information release.
+        final Intent dummyIntent = new Intent(context, MockApplicationActivity.class);
+        dummyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        final Activity activity = mInstrumentation.startActivitySync(dummyIntent);
+
+        // Wait until it finishes and end the reciever then.
+        assertEquals(RESULT_PASS, timeReceiver.waitForActivity());
+        timeReceiver.close();
+        assertTrue(timeReceiver.mTimeUsed != 0);
+    }
+
+    /**
+     * Verify that the TimeTrackingAPI works properly when switching away from the monitored task.
+     */
+    public void testTimeTrackingAPI_SwitchAwayTriggers() throws Exception {
+        launchHome();
+
+        // Prepare to start an activity from another APK.
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setClassName(SIMPLE_PACKAGE_NAME, SIMPLE_PACKAGE_NAME + SIMPLE_ACTIVITY);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+        // Prepare the time receiver action.
+        Context context = mInstrumentation.getTargetContext();
+        ActivityOptions options = ActivityOptions.makeBasic();
+        Intent receiveIntent = new Intent(ACTIVITY_TIME_TRACK_INFO);
+        options.requestUsageTimeReport(PendingIntent.getBroadcast(context,
+                0, receiveIntent, PendingIntent.FLAG_CANCEL_CURRENT));
+
+        // The application started tracker.
+        ActivityReceiverFilter appStartedReceiver = new ActivityReceiverFilter(
+                ACTIVITY_LAUNCHED_ACTION);
+
+        // The filter for the time event.
+        ActivityReceiverFilter timeReceiver = new ActivityReceiverFilter(ACTIVITY_TIME_TRACK_INFO);
+
+        // Run the activity.
+        mContext.startActivity(intent, options.toBundle());
+
+        // Wait until it finishes and end the reciever then.
+        assertEquals(RESULT_PASS, appStartedReceiver.waitForActivity());
+        appStartedReceiver.close();
+
+        // At this time the timerReceiver should not fire since our app is running.
+        assertEquals(RESULT_TIMEOUT, timeReceiver.waitForActivity());
+        assertTrue(timeReceiver.mTimeUsed == 0);
+
+        // Starting now another activity will put ours into the back hence releasing the timing.
+        final Intent dummyIntent = new Intent(context, MockApplicationActivity.class);
+        dummyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        final Activity activity = mInstrumentation.startActivitySync(dummyIntent);
+
+        // Wait until it finishes and end the reciever then.
+        assertEquals(RESULT_PASS, timeReceiver.waitForActivity());
+        timeReceiver.close();
+        assertTrue(timeReceiver.mTimeUsed != 0);
+    }
+
+    /**
+     * Verify that the TimeTrackingAPI works properly when handling an activity chain gets started
+     * and ended.
+     */
+    public void testTimeTrackingAPI_ChainedActivityExit() throws Exception {
+        launchHome();
+        // Prepare to start an activity from another APK.
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setClassName(SIMPLE_PACKAGE_NAME,
+                SIMPLE_PACKAGE_NAME + SIMPLE_ACTIVITY_CHAIN_EXIT);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+        // Prepare the time receiver action.
+        Context context = mInstrumentation.getTargetContext();
+        ActivityOptions options = ActivityOptions.makeBasic();
+        Intent receiveIntent = new Intent(ACTIVITY_TIME_TRACK_INFO);
+        options.requestUsageTimeReport(PendingIntent.getBroadcast(context,
+                0, receiveIntent, PendingIntent.FLAG_CANCEL_CURRENT));
+
+        // The application finished tracker.
+        ActivityReceiverFilter appEndReceiver = new ActivityReceiverFilter(
+                ACTIVITY_CHAIN_EXIT_ACTION);
+
+        // The filter for the time event.
+        ActivityReceiverFilter timeReceiver = new ActivityReceiverFilter(ACTIVITY_TIME_TRACK_INFO);
+
+        // Run the activity.
+        mContext.startActivity(intent, options.toBundle());
+
+        // Wait until it finishes and end the reciever then.
+        assertEquals(RESULT_PASS, appEndReceiver.waitForActivity());
+        appEndReceiver.close();
+
+        // At this time the timerReceiver should not fire, even though the activity has shut down.
+        assertEquals(RESULT_TIMEOUT, timeReceiver.waitForActivity());
+        assertTrue(timeReceiver.mTimeUsed == 0);
+
+        // Issue another activity so that the timing information gets released.
+        final Intent dummyIntent = new Intent(context, MockApplicationActivity.class);
+        dummyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        final Activity activity = mInstrumentation.startActivitySync(dummyIntent);
+
+        // Wait until it finishes and end the reciever then.
+        assertEquals(RESULT_PASS, timeReceiver.waitForActivity());
+        timeReceiver.close();
+        assertTrue(timeReceiver.mTimeUsed != 0);
+    }
 }
diff --git a/tests/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java b/tests/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java
index 9554438..58e69b8 100644
--- a/tests/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java
+++ b/tests/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java
@@ -577,26 +577,6 @@
         assertEquals(view, mView);
     }
 
-    public void testSetViewCustom() throws Throwable {
-        final int viewSpacingLeft = 10;
-        final int viewSpacingTop = 20;
-        final int viewSpacingRight = 30;
-        final int viewSpacingBottom = 40;
-        final View view = new View(mContext);
-        view.setId(100);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mBuilder = new AlertDialog.Builder(mContext);
-                mBuilder.setView(view, viewSpacingLeft, viewSpacingTop, viewSpacingRight,
-                        viewSpacingBottom);
-                mDialog = mBuilder.show();
-                mView = mDialog.getWindow().findViewById(100);
-            }
-        });
-        mInstrumentation.waitForIdleSync();
-        assertEquals(view, mView);
-    }
-
     public void testSetInverseBackgroundForced() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
diff --git a/tests/tests/app/src/android/app/cts/DownloadManagerTest.java b/tests/tests/app/src/android/app/cts/DownloadManagerTest.java
index a68d860..55ad392 100644
--- a/tests/tests/app/src/android/app/cts/DownloadManagerTest.java
+++ b/tests/tests/app/src/android/app/cts/DownloadManagerTest.java
@@ -32,13 +32,9 @@
 import android.text.format.DateUtils;
 import android.webkit.cts.CtsTestServer;
 
-import com.google.android.collect.Sets;
-
 import java.io.File;
 import java.util.Arrays;
 import java.util.HashSet;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
 
 public class DownloadManagerTest extends AndroidTestCase {
 
@@ -96,6 +92,82 @@
         }
     }
 
+    public void testDownloadManagerSupportsHttp() throws Exception {
+        final DownloadCompleteReceiver receiver = new DownloadCompleteReceiver();
+        try {
+            IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
+            mContext.registerReceiver(receiver, intentFilter);
+
+            long id = mDownloadManager.enqueue(new Request(getGoodUrl()));
+
+            assertEquals(1, getTotalNumberDownloads());
+
+            assertDownloadQueryableById(id);
+
+            receiver.waitForDownloadComplete(SHORT_TIMEOUT, id);
+
+            assertDownloadQueryableByStatus(DownloadManager.STATUS_SUCCESSFUL);
+
+            assertRemoveDownload(id, 0);
+        } finally {
+            mContext.unregisterReceiver(receiver);
+        }
+    }
+
+    public void testDownloadManagerSupportsHttpWithExternalWebServer() throws Exception {
+        // As a result of testDownloadManagerSupportsHttpsWithExternalWebServer relying on an
+        // external resource https://www.example.com this test uses http://www.example.com to help
+        // disambiguate errors from testDownloadManagerSupportsHttpsWithExternalWebServer.
+
+        final DownloadCompleteReceiver receiver = new DownloadCompleteReceiver();
+        try {
+            IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
+            mContext.registerReceiver(receiver, intentFilter);
+
+            long id = mDownloadManager.enqueue(new Request(Uri.parse("http://www.example.com")));
+
+            assertEquals(1, getTotalNumberDownloads());
+
+            assertDownloadQueryableById(id);
+
+            receiver.waitForDownloadComplete(LONG_TIMEOUT, id);
+
+            assertDownloadQueryableByStatus(DownloadManager.STATUS_SUCCESSFUL);
+
+            assertRemoveDownload(id, 0);
+        } finally {
+            mContext.unregisterReceiver(receiver);
+        }
+    }
+
+    public void testDownloadManagerSupportsHttpsWithExternalWebServer() throws Exception {
+        // For HTTPS, DownloadManager trusts only SSL server certs issued by CAs trusted by the
+        // system. Unfortunately, this means that it cannot trust the mock web server's SSL cert.
+        // Until this is resolved (e.g., by making it possible to specify additional CA certs to
+        // trust for a particular download), this test relies on https://www.example.com being
+        // operational and reachable from the Android under test.
+
+        final DownloadCompleteReceiver receiver = new DownloadCompleteReceiver();
+        try {
+            IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
+            mContext.registerReceiver(receiver, intentFilter);
+
+            long id = mDownloadManager.enqueue(new Request(Uri.parse("https://www.example.com")));
+
+            assertEquals(1, getTotalNumberDownloads());
+
+            assertDownloadQueryableById(id);
+
+            receiver.waitForDownloadComplete(LONG_TIMEOUT, id);
+
+            assertDownloadQueryableByStatus(DownloadManager.STATUS_SUCCESSFUL);
+
+            assertRemoveDownload(id, 0);
+        } finally {
+            mContext.unregisterReceiver(receiver);
+        }
+    }
+
     public void testMinimumDownload() throws Exception {
         final DownloadCompleteReceiver receiver = new DownloadCompleteReceiver();
         try {
@@ -233,7 +305,7 @@
     }
 
     private class DownloadCompleteReceiver extends BroadcastReceiver {
-        private HashSet<Long> mCompleteIds = Sets.newHashSet();
+        private HashSet<Long> mCompleteIds = new HashSet<>();
 
         public DownloadCompleteReceiver() {
         }
diff --git a/tests/tests/app/src/android/app/cts/FragmentTest.java b/tests/tests/app/src/android/app/cts/FragmentTest.java
index 006f0a9..5873ee0 100644
--- a/tests/tests/app/src/android/app/cts/FragmentTest.java
+++ b/tests/tests/app/src/android/app/cts/FragmentTest.java
@@ -17,15 +17,8 @@
 package android.app.cts;
 
 import android.app.Fragment;
-import android.content.Context;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(Fragment.class)
 public class FragmentTest extends AndroidTestCase {
 
     public static class TestFragment extends Fragment {
diff --git a/tests/tests/app/src/android/app/cts/InstrumentationTest.java b/tests/tests/app/src/android/app/cts/InstrumentationTest.java
index b21148e..25403f3 100644
--- a/tests/tests/app/src/android/app/cts/InstrumentationTest.java
+++ b/tests/tests/app/src/android/app/cts/InstrumentationTest.java
@@ -540,7 +540,6 @@
             public void openPanel(int featureId, KeyEvent event) {
             }
 
-            @Override
             public void alwaysReadCloseOnTouchAttr() {
             }
 
diff --git a/tests/tests/app/src/android/app/cts/NotificationManagerTest.java b/tests/tests/app/src/android/app/cts/NotificationManagerTest.java
index 9a895ea..5781442 100644
--- a/tests/tests/app/src/android/app/cts/NotificationManagerTest.java
+++ b/tests/tests/app/src/android/app/cts/NotificationManagerTest.java
@@ -22,12 +22,16 @@
 import android.content.Context;
 import android.content.Intent;
 import android.provider.Telephony.Threads;
+import android.service.notification.StatusBarNotification;
 import android.test.AndroidTestCase;
+import android.util.Log;
 
 import com.android.cts.app.stub.R;
 
 
 public class NotificationManagerTest extends AndroidTestCase {
+    final String TAG = NotificationManagerTest.class.getSimpleName();
+    final boolean DEBUG = false;
 
     private NotificationManager mNotificationManager;
 
@@ -36,6 +40,8 @@
         super.setUp();
         mNotificationManager = (NotificationManager) mContext.getSystemService(
                 Context.NOTIFICATION_SERVICE);
+        // clear the deck so that our getActiveNotifications results are predictable
+        mNotificationManager.cancelAll();
     }
 
     @Override
@@ -45,27 +51,55 @@
     }
 
     public void testNotify() {
+        mNotificationManager.cancelAll();
+
         final int id = 1;
         sendNotification(id, R.drawable.black);
+        // test updating the same notification
+        sendNotification(id, R.drawable.blue);
+        sendNotification(id, R.drawable.yellow);
+
+        // assume that sendNotification tested to make sure individual notifications were present
+        StatusBarNotification[] sbns = mNotificationManager.getActiveNotifications();
+        for (StatusBarNotification sbn : sbns) {
+            if (sbn.getId() != id) {
+                fail("we got back other notifications besides the one we posted: "
+                        + sbn.getKey());
+            }
+        }
     }
 
     public void testCancel() {
         final int id = 9;
         sendNotification(id, R.drawable.black);
         mNotificationManager.cancel(id);
+
+        StatusBarNotification[] sbns = mNotificationManager.getActiveNotifications();
+        for (StatusBarNotification sbn : sbns) {
+            assertFalse("canceled notification was still alive, id=" + id, sbn.getId() == id);
+        }
     }
 
     public void testCancelAll() {
         sendNotification(1, R.drawable.black);
         sendNotification(2, R.drawable.blue);
         sendNotification(3, R.drawable.yellow);
+
+        if (DEBUG) {
+            Log.d(TAG, "posted 3 notifications, here they are: ");
+            StatusBarNotification[] sbns = mNotificationManager.getActiveNotifications();
+            for (StatusBarNotification sbn : sbns) {
+                Log.d(TAG, "  " + sbn);
+            }
+            Log.d(TAG, "about to cancel...");
+        }
         mNotificationManager.cancelAll();
+
+        StatusBarNotification[] sbns = mNotificationManager.getActiveNotifications();
+        assertTrue("notification list was not empty after cancelAll", sbns.length == 0);
     }
 
     private void sendNotification(final int id, final int icon) {
-        final Notification notification = new Notification(
-                icon, "No intent", System.currentTimeMillis());
-
         final Intent intent = new Intent(Intent.ACTION_MAIN, Threads.CONTENT_URI);
 
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP
@@ -73,9 +107,19 @@
         intent.setAction(Intent.ACTION_MAIN);
 
         final PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
-        notification.setLatestEventInfo(mContext, "notify#" + id, "This is #" + id
-                + "notification  ", pendingIntent);
+        final Notification notification = new Notification.Builder(mContext)
+                .setSmallIcon(icon)
+                .setWhen(System.currentTimeMillis())
+                .setContentTitle("notify#" + id)
+                .setContentText("This is #" + id + "notification  ")
+                .setContentIntent(pendingIntent)
+                .build();
         mNotificationManager.notify(id, notification);
-    }
 
+        StatusBarNotification[] sbns = mNotificationManager.getActiveNotifications();
+        for (StatusBarNotification sbn : sbns) {
+            if (sbn.getId() == id) return;
+        }
+        fail("couldn't find posted notification id=" + id);
+    }
 }
diff --git a/tests/tests/app/src/android/app/cts/NotificationTest.java b/tests/tests/app/src/android/app/cts/NotificationTest.java
index c2f62c3..6179922 100644
--- a/tests/tests/app/src/android/app/cts/NotificationTest.java
+++ b/tests/tests/app/src/android/app/cts/NotificationTest.java
@@ -77,7 +77,7 @@
         mNotification.tickerText = TICKER_TEXT;
 
         final RemoteViews contentView = new RemoteViews(mContext.getPackageName(),
-                com.android.internal.R.layout.status_bar_latest_event_content);
+                android.R.layout.simple_list_item_1);
         mNotification.contentView = contentView;
         mNotification.defaults = 0;
         mNotification.flags = 0;
@@ -150,13 +150,19 @@
         assertNull(result.sound);
     }
 
-    public void testSetLatestEventInfo() {
-        mNotification = new Notification();
-        mNotification.icon = 1;
+    public void testBuilder() {
         final Intent intent = new Intent();
         final PendingIntent contentIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);
-        mNotification.setLatestEventInfo(mContext, CONTENT_TITLE, CONTENT_TEXT, contentIntent);
-        assertTrue(mNotification.contentView instanceof RemoteViews);
+        mNotification = new Notification.Builder(mContext)
+                .setSmallIcon(1)
+                .setContentTitle(CONTENT_TITLE)
+                .setContentText(CONTENT_TEXT)
+                .setContentIntent(contentIntent)
+                .build();
+        assertEquals(CONTENT_TEXT, mNotification.extras.getString(Notification.EXTRA_TEXT));
+        assertEquals(CONTENT_TITLE, mNotification.extras.getString(Notification.EXTRA_TITLE));
+        assertEquals(1, mNotification.icon);
+        assertEquals(contentIntent, mNotification.contentIntent);
         assertNotNull(mNotification.contentView);
     }
 
diff --git a/tests/tests/app/src/android/app/cts/ProgressDialogTest.java b/tests/tests/app/src/android/app/cts/ProgressDialogTest.java
index 038b57b..b2037b6 100644
--- a/tests/tests/app/src/android/app/cts/ProgressDialogTest.java
+++ b/tests/tests/app/src/android/app/cts/ProgressDialogTest.java
@@ -97,8 +97,7 @@
 
     @UiThreadTest
     public void testShow2() {
-        ProgressDialog dialog = buildDialog();
-        dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, false);
+        ProgressDialog dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, false);
 
         /*
          * note: the progress bar's style only supports indeterminate mode,
@@ -120,11 +119,11 @@
         // cancelable is false
         runTestOnUiThread(new Runnable() {
             public void run() {
-                ProgressDialog dialog = buildDialog();
-                dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, false);
+                ProgressDialog dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, false);
 
                 dialog.setOnCancelListener(cL);
                 dialog.onBackPressed();
+                dialog.dismiss();
             }
         });
         mInstrumentation.waitForIdleSync();
@@ -134,8 +133,7 @@
         // cancelable is true
         runTestOnUiThread(new Runnable() {
             public void run() {
-                ProgressDialog dialog = buildDialog();
-                dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, true);
+                ProgressDialog dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, true);
                 assertFalse(mCanceled);
                 dialog.setOnCancelListener(cL);
                 dialog.onBackPressed();
@@ -156,10 +154,11 @@
         // cancelable is false
         runTestOnUiThread(new Runnable() {
             public void run() {
-                ProgressDialog dialog = buildDialog();
-                dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, false, cL);
+                ProgressDialog dialog = ProgressDialog.show(
+                        mContext, TITLE, MESSAGE, true, false, cL);
 
                 dialog.onBackPressed();
+                dialog.dismiss();;
             }
         });
         mInstrumentation.waitForIdleSync();
@@ -169,8 +168,8 @@
         // cancelable is true
         runTestOnUiThread(new Runnable() {
             public void run() {
-                ProgressDialog dialog = buildDialog();
-                dialog = ProgressDialog.show(mContext, TITLE, MESSAGE, true, true, cL);
+                ProgressDialog dialog = ProgressDialog.show(
+                        mContext, TITLE, MESSAGE, true, true, cL);
 
                 assertFalse(mCanceled);
                 dialog.onBackPressed();
diff --git a/tests/tests/assist/Android.mk b/tests/tests/assist/Android.mk
new file mode 100644
index 0000000..89d2c49
--- /dev/null
+++ b/tests/tests/assist/Android.mk
@@ -0,0 +1,33 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := CtsAssistCommon ctstestrunner ctsdeviceutil
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsAssistTestCases
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/tests/assist/AndroidManifest.xml b/tests/tests/assist/AndroidManifest.xml
new file mode 100644
index 0000000..fefdf54
--- /dev/null
+++ b/tests/tests/assist/AndroidManifest.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.assist.cts">
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.BIND_VOICE_INTERACTION" />
+
+    <application>
+      <uses-library android:name="android.test.runner" />
+      <activity android:name="android.assist.cts.TestStartActivity"
+                android:label="Assist Structure Test App"
+                android:theme="@android:style/Theme.Material.Light">
+          <intent-filter>
+              <action android:name="android.intent.action.TEST_START_ACTIVITY_ASSIST_STRUCTURE" />
+              <action android:name="android.intent.action.TEST_START_ACTIVITY_DISABLE_CONTEXT" />
+              <action android:name="android.intent.action.TEST_START_ACTIVITY_FLAG_SECURE" />
+              <action android:name="android.intent.action.TEST_START_ACTIVITY_LIFECYCLE" />
+              <category android:name="android.intent.category.LAUNCHER" />
+              <category android:name="android.intent.category.DEFAULT" />
+          </intent-filter>
+      </activity>
+    </application>
+
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="android.assist.cts"
+                     android:label="CTS tests of android.assist">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+</manifest>
+
diff --git a/tests/tests/assist/AndroidTest.xml b/tests/tests/assist/AndroidTest.xml
new file mode 100644
index 0000000..f7c56ad
--- /dev/null
+++ b/tests/tests/assist/AndroidTest.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="Test module config for Assist">
+    <include name="common-config" />
+    <option name="cts-apk-installer:test-file-name" value="CtsAssistService.apk" />
+    <option name="cts-apk-installer:test-file-name" value="CtsAssistApp.apk" />
+    <option name="run-command:run-command"
+         value="settings put secure voice_interaction_service android.assist.service/.MainInteractionService" />
+    <option name="run-command:teardown-command"
+         value="settings put secure voice_interaction_service com.google.android.googlequicksearchbox/com.google.android.voiceinteraction.GsaVoiceInteractionService" />
+    <option name="cts-apk-installer:test-file-name" value="CtsAssistTestCases.apk" />
+</configuration>
diff --git a/tests/tests/assist/common/Android.mk b/tests/tests/assist/common/Android.mk
new file mode 100644
index 0000000..88c90ee
--- /dev/null
+++ b/tests/tests/assist/common/Android.mk
@@ -0,0 +1,30 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_MODULE := CtsAssistCommon
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/tests/tests/assist/common/src/android/assist/common/Utils.java b/tests/tests/assist/common/src/android/assist/common/Utils.java
new file mode 100644
index 0000000..4bf9412
--- /dev/null
+++ b/tests/tests/assist/common/src/android/assist/common/Utils.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2015 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.assist.common;
+
+import android.R;
+import android.content.ComponentName;
+import android.os.Bundle;
+
+import java.util.ArrayList;
+
+public class Utils {
+    public static final String TESTCASE_TYPE = "testcase_type";
+    public static final String TESTINFO = "testinfo";
+    public static final String ACTION_PREFIX = "android.intent.action.";
+    public static final String BROADCAST_INTENT = ACTION_PREFIX + "ASSIST_TESTAPP";
+    public static final String BROADCAST_ASSIST_DATA_INTENT = ACTION_PREFIX + "ASSIST_DATA";
+    public static final String BROADCAST_INTENT_START_ASSIST = ACTION_PREFIX + "START_ASSIST";
+    public static final String ASSIST_RECEIVER_REGISTERED = ACTION_PREFIX + "ASSIST_READY";
+    public static final String TEST_ERROR = "Error In Test:";
+
+    public static final String ASSIST_STRUCTURE_KEY = "assist_structure";
+    public static final String ASSIST_CONTENT_KEY = "assist_content";
+    public static final String ASSIST_BUNDLE_KEY = "assist_bundle";
+    public static final String ASSIST_SCREENSHOT_KEY = "assist_screenshot";
+
+
+    /** Lifecycle Test intent constants */
+    public static final String LIFECYCLE_PREFIX = ACTION_PREFIX + "lifecycle_";
+    public static final String LIFECYCLE_HASRESUMED = LIFECYCLE_PREFIX + "hasResumed";
+    public static final String LIFECYCLE_ONPAUSE = LIFECYCLE_PREFIX + "onpause";
+    public static final String LIFECYCLE_ONSTOP = LIFECYCLE_PREFIX + "onstop";
+    public static final String LIFECYCLE_ONDESTROY = LIFECYCLE_PREFIX + "ondestroy";
+
+    /** Flag Secure Test intent constants */
+    public static final String FLAG_SECURE_HASRESUMED = ACTION_PREFIX + "flag_secure_hasResumed";
+    public static final String ASSIST_STRUCTURE_HASRESUMED = ACTION_PREFIX
+            + "assist_structure_hasResumed";
+
+    /** Two second timeout for getting back assist context */
+    public static final int TIMEOUT_MS = 2 * 1000;
+    public static final int ACTIVITY_ONRESUME_TIMEOUT_MS = 4000;
+    public static final String EXTRA_REGISTER_RECEIVER = "register_receiver";
+
+    /** Test name suffixes */
+    public static final String ASSIST_STRUCTURE = "ASSIST_STRUCTURE";
+    public static final String DISABLE_CONTEXT = "DISABLE_CONTEXT";
+    public static final String FLAG_SECURE = "FLAG_SECURE";
+    public static final String LIFECYCLE = "LIFECYCLE";
+
+    /** Session intent constants */
+    public static final String HIDE_SESSION = "android.intent.action.hide_session";
+
+    /**
+     * The shim activity that starts the service associated with each test.
+     */
+    public static final String getTestActivity(String testCaseType) {
+        switch (testCaseType) {
+            case DISABLE_CONTEXT:
+                return "service.DisableContextActivity";
+            case ASSIST_STRUCTURE:
+            case FLAG_SECURE:
+            case LIFECYCLE:
+                return "service.DelayedAssistantActivity";
+            default:
+                return "";
+        }
+    }
+
+    /**
+     * The test app associated with each test.
+     */
+    public static final ComponentName getTestAppComponent(String testCaseType) {
+        switch (testCaseType) {
+            case ASSIST_STRUCTURE:
+                return new ComponentName(
+                        "android.assist.testapp", "android.assist.testapp.TestApp");
+            case DISABLE_CONTEXT:
+                return new ComponentName(
+                        "android.assist.testapp", "android.assist.testapp.DisableContextActivity");
+            case FLAG_SECURE:
+                return new ComponentName(
+                        "android.assist.testapp", "android.assist.testapp.SecureActivity");
+            case LIFECYCLE:
+                return new ComponentName(
+                        "android.assist.testapp", "android.assist.testapp.LifecycleActivity");
+            default:
+                return new ComponentName("","");
+        }
+    }
+
+    public static final String toBundleString(Bundle bundle) {
+        if (bundle == null) {
+            return "*** Bundle is null ****";
+        }
+        StringBuffer buf = new StringBuffer("Bundle is: ");
+        String testType = bundle.getString(TESTCASE_TYPE);
+        if (testType != null) {
+            buf.append("testcase type = " + testType);
+        }
+        ArrayList<String> info = bundle.getStringArrayList(TESTINFO);
+        if (info != null) {
+            for (String s : info) {
+                buf.append(s + "\n\t\t");
+            }
+        }
+        return buf.toString();
+    }
+
+    public static final void addErrorResult(final Bundle testinfo, final String msg) {
+        testinfo.getStringArrayList(testinfo.getString(Utils.TESTCASE_TYPE))
+            .add(TEST_ERROR + " " + msg);
+    }
+}
diff --git a/tests/tests/assist/res/layout/test_app.xml b/tests/tests/assist/res/layout/test_app.xml
new file mode 100644
index 0000000..3fbfd6d
--- /dev/null
+++ b/tests/tests/assist/res/layout/test_app.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/welcome" />
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="350dp"
+        android:orientation="vertical"
+        android:layout_gravity="bottom">
+        <FrameLayout
+            android:id="@+id/card1"
+            android:layout_width="match_parent"
+            android:layout_height="150dp"
+            android:layout_marginStart="8dp"
+            android:layout_marginEnd="8dp"
+            android:layout_marginTop="16dp"
+            android:elevation="3dp">
+        </FrameLayout>
+        <View
+            android:id="@+id/card2"
+            android:layout_width="match_parent"
+            android:layout_height="200dp"
+            android:layout_marginStart="8dp"
+            android:layout_marginEnd="8dp"
+            android:layout_marginTop="16dp"
+            android:elevation="3dp"/>
+    </LinearLayout>
+</RelativeLayout>
\ No newline at end of file
diff --git a/tests/tests/assist/res/values/strings.xml b/tests/tests/assist/res/values/strings.xml
new file mode 100644
index 0000000..ae4f16e
--- /dev/null
+++ b/tests/tests/assist/res/values/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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>
+    <string name="welcome">Hello there!</string>
+</resources>
diff --git a/tests/tests/assist/res/xml/interaction_service.xml b/tests/tests/assist/res/xml/interaction_service.xml
new file mode 100644
index 0000000..c968795
--- /dev/null
+++ b/tests/tests/assist/res/xml/interaction_service.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<voice-interaction-service xmlns:android="http://schemas.android.com/apk/res/android"
+    android:sessionService="android.assist.service.MainInteractionSessionService"
+    android:recognitionService="android.assist.service.MainRecognitionService"
+    android:settingsActivity="android.assist.service.SettingsActivity"
+    android:supportsAssist="false" />
diff --git a/tests/tests/assist/service/Android.mk b/tests/tests/assist/service/Android.mk
new file mode 100644
index 0000000..07dc228
--- /dev/null
+++ b/tests/tests/assist/service/Android.mk
@@ -0,0 +1,32 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := CtsAssistCommon ctstestrunner ctsdeviceutil
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsAssistService
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/tests/assist/service/AndroidManifest.xml b/tests/tests/assist/service/AndroidManifest.xml
new file mode 100644
index 0000000..5a22d31
--- /dev/null
+++ b/tests/tests/assist/service/AndroidManifest.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.assist.service">
+
+    <application>
+      <uses-library android:name="android.test.runner" />
+      <service android:name=".MainInteractionService"
+              android:label="CTS test voice interaction service"
+              android:permission="android.permission.BIND_VOICE_INTERACTION"
+              android:process=":interactor"
+              android:exported="true">
+          <meta-data android:name="android.voice_interaction"
+                     android:resource="@xml/interaction_service" />
+          <intent-filter>
+              <action android:name="android.service.voice.VoiceInteractionService" />
+          </intent-filter>
+      </service>
+      <activity android:name=".DisableContextActivity" >
+          <intent-filter>
+              <action android:name="android.intent.action.START_TEST_DISABLE_CONTEXT" />
+              <category android:name="android.intent.category.DEFAULT" />
+          </intent-filter>
+      </activity>
+      <activity android:name=".DelayedAssistantActivity"
+                android:label="Delay Assistant Start Activity">
+          <intent-filter>
+              <action android:name="android.intent.action.START_TEST_ASSIST_STRUCTURE" />
+              <action android:name="android.intent.action.START_TEST_LIFECYCLE" />
+              <action android:name="android.intent.action.START_TEST_FLAG_SECURE" />
+              <category android:name="android.intent.category.DEFAULT" />
+          </intent-filter>
+      </activity>
+      <service android:name=".MainInteractionSessionService"
+              android:permission="android.permission.BIND_VOICE_INTERACTION"
+              android:process=":session">
+      </service>
+      <service android:name=".MainRecognitionService"
+              android:label="CTS Voice Recognition Service">
+          <intent-filter>
+              <action android:name="android.speech.RecognitionService" />
+              <category android:name="android.intent.category.DEFAULT" />
+          </intent-filter>
+          <meta-data android:name="android.speech" android:resource="@xml/recognition_service" />
+      </service>
+    </application>
+</manifest>
+
diff --git a/tests/tests/assist/service/res/layout/assist_layer.xml b/tests/tests/assist/service/res/layout/assist_layer.xml
new file mode 100644
index 0000000..49f35c9
--- /dev/null
+++ b/tests/tests/assist/service/res/layout/assist_layer.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/assist_layer"
+        android:layout_width="match_parent"
+        android:background="@color/assist_layer_background"
+        android:layout_height="match_parent">
+    <TextView
+        android:layout_centerInParent="true"
+        android:text="@string/test_assistant_text"
+        android:textColor="@android:color/white"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+</RelativeLayout>
diff --git a/tests/tests/assist/service/res/values/colors.xml b/tests/tests/assist/service/res/values/colors.xml
new file mode 100644
index 0000000..4423140
--- /dev/null
+++ b/tests/tests/assist/service/res/values/colors.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="assist_layer_background">#aa000000</color>
+</resources>
diff --git a/tests/tests/assist/service/res/values/strings.xml b/tests/tests/assist/service/res/values/strings.xml
new file mode 100644
index 0000000..ea959e6
--- /dev/null
+++ b/tests/tests/assist/service/res/values/strings.xml
@@ -0,0 +1,18 @@
+<!--
+  Copyright 2015 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>
+    <string name="test_assistant_text">I am an Assistant</string>
+</resources>
diff --git a/tests/tests/assist/service/res/xml/interaction_service.xml b/tests/tests/assist/service/res/xml/interaction_service.xml
new file mode 100644
index 0000000..3ca7161
--- /dev/null
+++ b/tests/tests/assist/service/res/xml/interaction_service.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<voice-interaction-service xmlns:android="http://schemas.android.com/apk/res/android"
+    android:sessionService="android.assist.service.MainInteractionSessionService"
+    android:recognitionService="android.assist.service.MainRecognitionService"
+    android:settingsActivity="android.assist.service.SettingsActivity"
+    android:supportsAssist="true" />
diff --git a/tests/tests/assist/service/res/xml/recognition_service.xml b/tests/tests/assist/service/res/xml/recognition_service.xml
new file mode 100644
index 0000000..3f763b1
--- /dev/null
+++ b/tests/tests/assist/service/res/xml/recognition_service.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<recognition-service xmlns:android="http://schemas.android.com/apk/res/android"
+    android:settingsActivity="android.assist.service.SettingsActivity" />
diff --git a/tests/tests/assist/service/src/android/voiceinteraction/service/DelayedAssistantActivity.java b/tests/tests/assist/service/src/android/voiceinteraction/service/DelayedAssistantActivity.java
new file mode 100644
index 0000000..b7d67f1
--- /dev/null
+++ b/tests/tests/assist/service/src/android/voiceinteraction/service/DelayedAssistantActivity.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2014 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.assist.service;
+
+import android.app.Activity;
+import android.assist.common.Utils;
+import android.content.Intent;
+import android.content.ComponentName;
+import android.os.Bundle;
+import android.util.Log;
+
+public class DelayedAssistantActivity extends Activity {
+    static final String TAG = "DelayedAssistantActivity";
+
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Intent intent = new Intent();
+        intent.setComponent(new ComponentName(this, MainInteractionService.class));
+        intent.putExtra(Utils.EXTRA_REGISTER_RECEIVER, true);
+        finish();
+        ComponentName serviceName = startService(intent);
+        Log.i(TAG, "Started service: " + serviceName);
+    }
+}
diff --git a/tests/tests/assist/service/src/android/voiceinteraction/service/DisableContextActivity.java b/tests/tests/assist/service/src/android/voiceinteraction/service/DisableContextActivity.java
new file mode 100644
index 0000000..2fd540b
--- /dev/null
+++ b/tests/tests/assist/service/src/android/voiceinteraction/service/DisableContextActivity.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2014 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.assist.service;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.ComponentName;
+import android.os.Bundle;
+import android.util.Log;
+
+public class DisableContextActivity extends Activity {
+    static final String TAG = "DisableContextActivity";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        Intent intent = new Intent();
+        intent.setComponent(new ComponentName(this, MainInteractionService.class));
+        Log.i(TAG, "Starting service.");
+        finish();
+        startService(intent);
+    }
+}
diff --git a/tests/tests/assist/service/src/android/voiceinteraction/service/MainInteractionService.java b/tests/tests/assist/service/src/android/voiceinteraction/service/MainInteractionService.java
new file mode 100644
index 0000000..fc19e1c
--- /dev/null
+++ b/tests/tests/assist/service/src/android/voiceinteraction/service/MainInteractionService.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2015 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.assist.service;
+
+import static android.service.voice.VoiceInteractionSession.SHOW_WITH_ASSIST;
+import static android.service.voice.VoiceInteractionSession.SHOW_WITH_SCREENSHOT;
+
+import android.assist.common.Utils;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.service.voice.VoiceInteractionService;
+import android.service.voice.VoiceInteractionSession;
+import android.util.Log;
+
+public class MainInteractionService extends VoiceInteractionService {
+    static final String TAG = "MainInteractionService";
+    private Intent mIntent;
+    private boolean mReady = false;
+    private BroadcastReceiver mBroadcastReceiver;
+
+    @Override
+    public void onReady() {
+        super.onReady();
+        mReady = true;
+    }
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        Log.i(TAG, "onStartCommand received - intent: " + intent);
+        mIntent = intent;
+        maybeStart();
+        return START_NOT_STICKY;
+    }
+
+    private void maybeStart() {
+        if (mIntent == null || !mReady) {
+            Log.wtf(TAG, "Can't start session because either intent is null or onReady() "
+                    + "has not been called yet. mIntent = " + mIntent + ", mReady = " + mReady);
+        } else {
+            if (isActiveService(this, new ComponentName(this, getClass()))) {
+                if (mIntent.getBooleanExtra(Utils.EXTRA_REGISTER_RECEIVER, false)) {
+                    Log.i(TAG, "Registering receiver to start session later");
+                    if (mBroadcastReceiver == null) {
+                        mBroadcastReceiver = new MainInteractionServiceBroadcastReceiver();
+                        registerReceiver(mBroadcastReceiver,
+                                new IntentFilter(Utils.BROADCAST_INTENT_START_ASSIST));
+                    }
+                    sendBroadcast(new Intent(Utils.ASSIST_RECEIVER_REGISTERED));
+              } else {
+                  Log.i(TAG, "Yay! about to start session");
+                  showSession(new Bundle(), VoiceInteractionSession.SHOW_WITH_ASSIST |
+                          VoiceInteractionSession.SHOW_WITH_SCREENSHOT);
+              }
+            } else {
+                Log.wtf(TAG, "**** Not starting MainInteractionService because" +
+                        " it is not set as the current voice interaction service");
+            }
+        }
+    }
+
+    private class MainInteractionServiceBroadcastReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Log.i(MainInteractionService.TAG, "Recieved broadcast to start session now.");
+            if (intent.getAction().equals(Utils.BROADCAST_INTENT_START_ASSIST)) {
+                showSession(new Bundle(), SHOW_WITH_ASSIST | SHOW_WITH_SCREENSHOT);
+            }
+        }
+    }
+
+    @Override
+    public void onDestroy() {
+        if (mBroadcastReceiver != null) {
+            unregisterReceiver(mBroadcastReceiver);
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/assist/service/src/android/voiceinteraction/service/MainInteractionSession.java b/tests/tests/assist/service/src/android/voiceinteraction/service/MainInteractionSession.java
new file mode 100644
index 0000000..38d03f8
--- /dev/null
+++ b/tests/tests/assist/service/src/android/voiceinteraction/service/MainInteractionSession.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2015 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.assist.service;
+
+import android.app.assist.AssistContent;
+import android.app.assist.AssistStructure;
+import android.assist.service.R;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import android.service.voice.VoiceInteractionSession;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+
+import java.io.ByteArrayOutputStream;
+
+import android.assist.common.Utils;
+
+public class MainInteractionSession extends VoiceInteractionSession {
+    static final String TAG = "MainInteractionSession";
+
+    Intent mStartIntent;
+    Context mContext;
+    Bundle mAssistData = new Bundle();
+
+    private boolean hasReceivedAssistData = false;
+    private boolean hasReceivedScreenshot = false;
+    private BroadcastReceiver mReceiver;
+
+    MainInteractionSession(Context context) {
+        super(context);
+        mContext = context;
+    }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        mReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                String action = intent.getAction();
+                if (action.equals(Utils.HIDE_SESSION)) {
+                    hide();
+                }
+            }
+        };
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(Utils.HIDE_SESSION);
+        mContext.registerReceiver(mReceiver, filter);
+    }
+
+    @Override
+    public void onDestroy() {
+        Log.i(TAG, "onDestroy()");
+        super.onDestroy();
+        if (mReceiver != null) {
+            mContext.unregisterReceiver(mReceiver);
+        }
+    }
+
+    @Override
+    public void onShow(Bundle args, int showFlags) {
+        // set some content view.
+        // TODO: check that the view takes up the whole screen.
+        // check that interactor mode is for assist
+        if ((showFlags & SHOW_WITH_ASSIST) == 0) {
+            return;
+        }
+        super.onShow(args, showFlags);
+    }
+
+    @Override
+    public void onHandleAssist(/*@Nullable */Bundle data, /*@Nullable*/ AssistStructure structure,
+        /*@Nullable*/ AssistContent content) {
+        Log.i(TAG, "onHandleAssist");
+        Log.i(TAG,
+                String.format("Bundle: %s, Structure: %s, Content: %s", data, structure, content));
+        super.onHandleAssist(data, structure, content);
+
+        // send to test to verify that this is accurate.
+        mAssistData.putParcelable(Utils.ASSIST_STRUCTURE_KEY, structure);
+        mAssistData.putParcelable(Utils.ASSIST_CONTENT_KEY, content);
+        mAssistData.putBundle(Utils.ASSIST_BUNDLE_KEY, data);
+        hasReceivedAssistData = true;
+        maybeBroadcastResults();
+    }
+
+    @Override
+    public void onHandleScreenshot(/*@Nullable*/ Bitmap screenshot) {
+        Log.i(TAG, String.format("onHandleScreenshot - Screenshot: %s", screenshot));
+        super.onHandleScreenshot(screenshot);
+        ByteArrayOutputStream bs = new ByteArrayOutputStream();
+        if (screenshot != null) {
+            screenshot.compress(Bitmap.CompressFormat.PNG, 50, bs);
+            mAssistData.putByteArray(Utils.ASSIST_SCREENSHOT_KEY, bs.toByteArray());
+        } else {
+            mAssistData.putByteArray(Utils.ASSIST_SCREENSHOT_KEY, null);
+        }
+        hasReceivedScreenshot = true;
+        maybeBroadcastResults();
+    }
+
+    private void maybeBroadcastResults() {
+        if (!hasReceivedAssistData) {
+            Log.i(TAG, "waiting for assist data before broadcasting results");
+        } else if (!hasReceivedScreenshot) {
+            Log.i(TAG, "waiting for screenshot before broadcasting results");
+        } else {
+            Intent intent = new Intent(Utils.BROADCAST_ASSIST_DATA_INTENT);
+            intent.putExtras(mAssistData);
+            Log.i(TAG,
+                    "broadcasting: " + intent.toString() + ", Bundle = " + mAssistData.toString());
+            mContext.sendBroadcast(intent);
+
+            hasReceivedAssistData = false;
+            hasReceivedScreenshot = false;
+        }
+    }
+
+    @Override
+    public View onCreateContentView() {
+        LayoutInflater f = getLayoutInflater();
+        if (f == null) {
+            Log.wtf(TAG, "layout inflater was null");
+        }
+        return f.inflate(R.layout.assist_layer,null);
+    }
+
+    class DoneReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Log.i(TAG, "Done_broadcast " + intent.getAction());
+        }
+    }
+}
diff --git a/tests/tests/assist/service/src/android/voiceinteraction/service/MainInteractionSessionService.java b/tests/tests/assist/service/src/android/voiceinteraction/service/MainInteractionSessionService.java
new file mode 100644
index 0000000..ad356a6
--- /dev/null
+++ b/tests/tests/assist/service/src/android/voiceinteraction/service/MainInteractionSessionService.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2015 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.assist.service;
+
+import android.os.Bundle;
+import android.service.voice.VoiceInteractionSession;
+import android.service.voice.VoiceInteractionSessionService;
+
+public class MainInteractionSessionService extends VoiceInteractionSessionService {
+    @Override
+    public VoiceInteractionSession onNewSession(Bundle args) {
+        return new MainInteractionSession(this);
+    }
+}
diff --git a/tests/tests/assist/service/src/android/voiceinteraction/service/MainRecognitionService.java b/tests/tests/assist/service/src/android/voiceinteraction/service/MainRecognitionService.java
new file mode 100644
index 0000000..520f913
--- /dev/null
+++ b/tests/tests/assist/service/src/android/voiceinteraction/service/MainRecognitionService.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2014 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.assist.service;
+
+import android.content.Intent;
+import android.speech.RecognitionService;
+import android.util.Log;
+
+/**
+ * Stub recognition service needed to be a complete voice interactor.
+ */
+public class MainRecognitionService extends RecognitionService {
+    private static final String TAG = "MainRecognitionService";
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        Log.i(TAG, "onCreate");
+    }
+
+    @Override
+    protected void onStartListening(Intent recognizerIntent, Callback listener) {
+        Log.i(TAG, "onStartListening");
+    }
+
+    @Override
+    protected void onCancel(Callback listener) {
+        Log.i(TAG, "onCancel");
+    }
+
+    @Override
+    protected void onStopListening(Callback listener) {
+        Log.i(TAG, "onStopListening");
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        Log.i(TAG, "onDestroy");
+    }
+}
diff --git a/tests/tests/assist/src/android/assist/cts/AssistStructureTest.java b/tests/tests/assist/src/android/assist/cts/AssistStructureTest.java
new file mode 100644
index 0000000..8ff235b
--- /dev/null
+++ b/tests/tests/assist/src/android/assist/cts/AssistStructureTest.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2015 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.assist.cts;
+
+import android.assist.common.Utils;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.provider.Settings;
+import android.util.Log;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+
+/**
+ *  Test that the AssistStructure returned is properly formatted.
+ */
+
+public class AssistStructureTest extends AssistTestBase {
+    private static final String TEST_CASE_TYPE = Utils.ASSIST_STRUCTURE;
+
+    private BroadcastReceiver mReceiver;
+    private CountDownLatch mHasResumedLatch = new CountDownLatch(1);
+
+    public AssistStructureTest() {
+        super();
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        setUpAndRegisterReceiver();
+        startTestActivity(TEST_CASE_TYPE);
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        super.tearDown();
+        if (mReceiver != null) {
+            mContext.unregisterReceiver(mReceiver);
+            mReceiver = null;
+        }
+    }
+
+    private void setUpAndRegisterReceiver() {
+        if (mReceiver != null) {
+            mContext.unregisterReceiver(mReceiver);
+        }
+        mReceiver = new AssistStructureTestBroadcastReceiver();
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(Utils.ASSIST_STRUCTURE_HASRESUMED);
+        filter.addAction(Utils.ASSIST_RECEIVER_REGISTERED);
+        mContext.registerReceiver(mReceiver, filter);
+    }
+
+    private void waitForOnResume() throws Exception {
+        Log.i(TAG, "waiting for onResume() before continuing");
+        if (!mHasResumedLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+            fail("Activity failed to resume in " + Utils.ACTIVITY_ONRESUME_TIMEOUT_MS + "msec");
+        }
+    }
+
+    public void testAssistStructure() throws Exception {
+        mTestActivity.start3pApp(TEST_CASE_TYPE);
+        mTestActivity.startTest(TEST_CASE_TYPE);
+        waitForAssistantToBeReady();
+        waitForOnResume();
+        startSession();
+        waitForContext();
+        verifyAssistDataNullness(false, false, false, false);
+
+        verifyAssistStructure(Utils.getTestAppComponent(TEST_CASE_TYPE),
+                false /*FLAG_SECURE set*/);
+    }
+
+    private class AssistStructureTestBroadcastReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (action.equals(Utils.ASSIST_STRUCTURE_HASRESUMED)) {
+                mHasResumedLatch.countDown();
+            } else if (action.equals(Utils.ASSIST_RECEIVER_REGISTERED)) {
+                mAssistantReadyLatch.countDown();
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/assist/src/android/assist/cts/AssistTestBase.java b/tests/tests/assist/src/android/assist/cts/AssistTestBase.java
new file mode 100644
index 0000000..25460e5
--- /dev/null
+++ b/tests/tests/assist/src/android/assist/cts/AssistTestBase.java
@@ -0,0 +1,353 @@
+/*
+ * Copyright (C) 2015 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.assist.cts;
+
+import android.assist.cts.TestStartActivity;
+import android.assist.common.Utils;
+
+import android.app.assist.AssistContent;
+import android.app.assist.AssistStructure;
+import android.app.assist.AssistStructure.ViewNode;
+import android.app.assist.AssistStructure.WindowNode;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.Resources;
+import android.content.res.XmlResourceParser;
+import android.cts.util.SystemUtil;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.widget.TextView;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+public class AssistTestBase extends ActivityInstrumentationTestCase2<TestStartActivity> {
+    static final String TAG = "AssistTestBase";
+
+    protected TestStartActivity mTestActivity;
+    protected AssistContent mAssistContent;
+    protected AssistStructure mAssistStructure;
+    protected Bitmap mScreenshot;
+    protected BroadcastReceiver mReceiver;
+    protected Bundle mAssistBundle;
+    protected Context mContext;
+    protected CountDownLatch mLatch, mAssistantReadyLatch;
+
+    private String mTestName;
+    private View mView;
+
+    public AssistTestBase() {
+        super(TestStartActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mAssistantReadyLatch = new CountDownLatch(1);
+        mContext = getInstrumentation().getTargetContext();
+        SystemUtil.runShellCommand(getInstrumentation(),
+                "settings put secure assist_structure_enabled 1");
+        SystemUtil.runShellCommand(getInstrumentation(),
+                "settings put secure assist_screenshot_enabled 1");
+        logContextAndScreenshotSetting();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mContext.unregisterReceiver(mReceiver);
+        mTestActivity.finish();
+        super.tearDown();
+        mContext.sendBroadcast(new Intent(Utils.HIDE_SESSION));
+    }
+
+    protected void startTestActivity(String testName) {
+        Intent intent = new Intent();
+        mTestName = testName;
+        intent.setAction("android.intent.action.TEST_START_ACTIVITY_" + testName);
+        intent.setComponent(new ComponentName(getInstrumentation().getContext(),
+                TestStartActivity.class));
+        setActivityIntent(intent);
+        mTestActivity = getActivity();
+    }
+
+    /**
+     * Called when waiting for Assistant's Broadcast Receiver to be setup
+     */
+    public void waitForAssistantToBeReady() throws Exception {
+        Log.i(TAG, "waiting for assistant to be ready before continuing");
+        if (!mAssistantReadyLatch.await(Utils.TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+            fail("Assistant was not ready before timeout of: " + Utils.TIMEOUT_MS + "msec");
+        }
+    }
+
+    /**
+     * Send broadcast to MainInteractionService to start a session
+     */
+    protected void startSession() {
+        mContext.sendBroadcast(new Intent(Utils.BROADCAST_INTENT_START_ASSIST));
+    }
+
+    /**
+     * Called after startTestActivity
+     */
+    protected boolean waitForBroadcast() throws Exception {
+        mTestActivity.start3pApp(mTestName);
+        mTestActivity.startTest(mTestName);
+        return waitForContext();
+    }
+
+    protected boolean waitForContext() throws Exception {
+        mLatch = new CountDownLatch(1);
+        if (mReceiver != null) {
+            mContext.unregisterReceiver(mReceiver);
+        }
+        mReceiver = new TestResultsReceiver();
+        mContext.registerReceiver(mReceiver,
+            new IntentFilter(Utils.BROADCAST_ASSIST_DATA_INTENT));
+
+        if (!mLatch.await(Utils.TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+            fail("Failed to receive broadcast in " + Utils.TIMEOUT_MS + "msec");
+        }
+        Log.i(TAG, "Received broadcast with all information.");
+        return true;
+    }
+
+    /**
+     * Checks that the nullness of values are what we expect.
+     *
+     * @param isBundleNull True if assistBundle should be null.
+     * @param isStructureNull True if assistStructure should be null.
+     * @param isContentNull True if assistContent should be null.
+     * @param isScreenshotNull True if screenshot should be null.
+     */
+    protected void verifyAssistDataNullness(boolean isBundleNull, boolean isStructureNull,
+            boolean isContentNull, boolean isScreenshotNull) {
+
+        if ((mAssistContent == null) != isContentNull) {
+            fail(String.format("Should %s have been null - AssistContent: %s",
+                    isContentNull? "":"not", mAssistContent));
+        }
+
+        if ((mAssistStructure == null) != isStructureNull) {
+            fail(String.format("Should %s have been null - AssistStructure: %s",
+                isStructureNull ? "" : "not", mAssistStructure));
+        }
+
+        if ((mAssistBundle == null) != isBundleNull) {
+            fail(String.format("Should %s have been null - AssistBundle: %s",
+                    isBundleNull? "":"not", mAssistBundle));
+        }
+
+        if ((mScreenshot == null) != isScreenshotNull) {
+            fail(String.format("Should %s have been null - Screenshot: %s",
+                    isScreenshotNull? "":"not", mScreenshot));
+        }
+    }
+
+    /**
+     * Verifies the view hierarchy of the backgroundApp matches the assist structure.
+     *
+     * @param backgroundApp ComponentName of app the assistant is invoked upon
+     * @param isSecureWindow Denotes whether the activity has FLAG_SECURE set
+     */
+    protected void verifyAssistStructure(ComponentName backgroundApp, boolean isSecureWindow) {
+        // Check component name matches
+        assertEquals(backgroundApp.flattenToString(),
+            mAssistStructure.getActivityComponent().flattenToString());
+
+        Log.i(TAG, "Traversing down structure for: " + backgroundApp.flattenToString());
+        mView = mTestActivity.findViewById(android.R.id.content).getRootView();
+        verifyHierarchy(mAssistStructure, isSecureWindow);
+    }
+
+    protected void logContextAndScreenshotSetting() {
+        Log.i(TAG, "Context is: " + Settings.Secure.getString(
+            mContext.getContentResolver(), "assist_structure_enabled"));
+        Log.i(TAG, "Screenshot is: " + Settings.Secure.getString(
+                mContext.getContentResolver(), "assist_screenshot_enabled"));
+    }
+
+    /**
+     * Recursively traverse and compare properties in the View hierarchy with the Assist Structure.
+     */
+    public void verifyHierarchy(AssistStructure structure, boolean isSecureWindow) {
+        Log.i(TAG, "verifyHierarchy");
+        Window mWindow = mTestActivity.getWindow();
+
+        int numWindows = structure.getWindowNodeCount();
+        // TODO: multiple windows?
+        assertEquals("Number of windows don't match", 1, numWindows);
+
+        for (int i = 0; i < numWindows; i++) {
+            AssistStructure.WindowNode windowNode = structure.getWindowNodeAt(i);
+            Log.i(TAG, "Title: " + windowNode.getTitle());
+            // verify top level window bounds are as big as the screen and pinned to 0,0
+            assertEquals("Window left position wrong: was " + windowNode.getLeft(),
+                    windowNode.getLeft(), 0);
+            assertEquals("Window top position wrong: was " + windowNode.getTop(),
+                    windowNode.getTop(), 0);
+
+            traverseViewAndStructure(
+                    mView,
+                    windowNode.getRootViewNode(),
+                    isSecureWindow);
+        }
+    }
+
+    private void traverseViewAndStructure(View parentView, ViewNode parentNode,
+            boolean isSecureWindow) {
+        ViewGroup parentGroup;
+
+        if (parentView == null && parentNode == null) {
+            Log.i(TAG, "Views are null, done traversing this branch.");
+            return;
+        } else if (parentNode == null || parentView == null) {
+            fail(String.format("Views don't match. View: %s, Node: %s", parentView, parentNode));
+        }
+
+        // Debugging
+        Log.i(TAG, "parentView is of type: " + parentView.getClass().getName());
+        if (parentView instanceof ViewGroup) {
+            for (int childInt = 0; childInt < ((ViewGroup) parentView).getChildCount();
+                    childInt++) {
+                Log.i(TAG,
+                        "viewchild" + childInt + " is of type: "
+                        + ((ViewGroup) parentView).getChildAt(childInt).getClass().getName());
+            }
+        }
+        if (parentView.getId() > 0) {
+            Log.i(TAG, "View ID: "
+                    + mTestActivity.getResources().getResourceEntryName(parentView.getId()));
+        }
+
+        Log.i(TAG, "parentNode is of type: " + parentNode.getClassName());
+        for (int nodeInt = 0; nodeInt < parentNode.getChildCount(); nodeInt++) {
+            Log.i(TAG,
+                    "nodechild" + nodeInt + " is of type: "
+                    + parentNode.getChildAt(nodeInt).getClassName());
+        }
+            Log.i(TAG, "Node ID: " + parentNode.getIdEntry());
+
+        int numViewChildren = 0;
+        int numNodeChildren = 0;
+        if (parentView instanceof ViewGroup) {
+            numViewChildren = ((ViewGroup) parentView).getChildCount();
+        }
+        numNodeChildren = parentNode.getChildCount();
+
+        if  (isSecureWindow) {
+            assertEquals("Secure window should only traverse root node.", 0, numNodeChildren);
+            isSecureWindow = false;
+            return;
+        } else {
+            assertEquals("Number of children did not match.", numViewChildren, numNodeChildren);
+        }
+
+        verifyViewProperties(parentView, parentNode);
+
+        if (parentView instanceof ViewGroup) {
+            parentGroup = (ViewGroup) parentView;
+
+            // TODO: set a max recursion level
+            for (int i = numNodeChildren - 1; i >= 0; i--) {
+                View childView = parentGroup.getChildAt(i);
+                ViewNode childNode = parentNode.getChildAt(i);
+
+                // if isSecureWindow, should not have reached this point.
+                assertFalse(isSecureWindow);
+                traverseViewAndStructure(childView, childNode, isSecureWindow);
+            }
+        }
+    }
+
+    /**
+     * Compare view properties of the view hierarchy with that reported in the assist structure.
+     */
+    private void verifyViewProperties(View parentView, ViewNode parentNode) {
+        assertEquals("Left positions do not match.", parentView.getLeft(), parentNode.getLeft());
+        assertEquals("Top positions do not match.", parentView.getTop(), parentNode.getTop());
+
+        int viewId = parentView.getId();
+
+        if (viewId > 0) {
+            if (parentNode.getIdEntry() != null) {
+                assertEquals("View IDs do not match.",
+                        mTestActivity.getResources().getResourceEntryName(viewId),
+                        parentNode.getIdEntry());
+            }
+        } else {
+            assertNull("View Node should not have an ID.", parentNode.getIdEntry());
+        }
+
+        assertEquals("Scroll X does not match.",
+                parentView.getScrollX(), parentNode.getScrollX());
+
+        assertEquals("Scroll Y does not match.",
+                parentView.getScrollY(), parentNode.getScrollY());
+
+        assertEquals("Heights do not match.", parentView.getHeight(),
+                parentNode.getHeight());
+
+        assertEquals("Widths do not match.", parentView.getWidth(), parentNode.getWidth());
+
+        // TODO: handle unicode/i18n
+        if (parentView instanceof TextView) {
+            assertEquals("Text in TextView does not match.",
+                    ((TextView) parentView).getText().toString(), parentNode.getText());
+        } else {
+            assertNull(parentNode.getText());
+        }
+    }
+
+    class TestResultsReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (intent.getAction().equalsIgnoreCase(Utils.BROADCAST_ASSIST_DATA_INTENT)) {
+                Log.i(TAG, "Received broadcast with assist data.");
+                Bundle assistData = intent.getExtras();
+                AssistTestBase.this.mAssistBundle = assistData.getBundle(Utils.ASSIST_BUNDLE_KEY);
+                AssistTestBase.this.mAssistStructure = assistData.getParcelable(
+                        Utils.ASSIST_STRUCTURE_KEY);
+                AssistTestBase.this.mAssistContent = assistData.getParcelable(
+                        Utils.ASSIST_CONTENT_KEY);
+
+                byte[] bitmapArray = assistData.getByteArray(Utils.ASSIST_SCREENSHOT_KEY);
+                if (bitmapArray != null) {
+                    AssistTestBase.this.mScreenshot = BitmapFactory.decodeByteArray(
+                            bitmapArray, 0, bitmapArray.length);
+                } else {
+                    AssistTestBase.this.mScreenshot = null;
+                }
+
+                if (mLatch != null) {
+                    mLatch.countDown();
+                }
+            }
+        }
+    }
+}
diff --git a/tests/tests/assist/src/android/assist/cts/DisableContextTest.java b/tests/tests/assist/src/android/assist/cts/DisableContextTest.java
new file mode 100644
index 0000000..dc28879
--- /dev/null
+++ b/tests/tests/assist/src/android/assist/cts/DisableContextTest.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2015 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.assist.cts;
+
+import android.assist.common.Utils;
+
+import android.app.Activity;
+import android.app.assist.AssistContent;
+import android.app.assist.AssistStructure;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.cts.util.SystemUtil;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.test.ActivityInstrumentationTestCase2;
+
+import java.lang.Override;
+import java.util.concurrent.CountDownLatch;
+
+/** Test we receive proper assist data when context is disabled or enabled */
+
+public class DisableContextTest extends AssistTestBase {
+    static final String TAG = "DisableContextTest";
+
+    private static final String TEST_CASE_TYPE = Utils.DISABLE_CONTEXT;
+
+    public DisableContextTest() {
+        super();
+    }
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        startTestActivity(TEST_CASE_TYPE);
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        SystemUtil.runShellCommand(getInstrumentation(),
+                "settings put secure assist_structure_enabled 1");
+        SystemUtil.runShellCommand(getInstrumentation(),
+            "settings put secure assist_screenshot_enabled 1");
+        logContextAndScreenshotSetting();
+        super.tearDown();
+    }
+
+    public void testContextAndScreenshotOff() throws Exception {
+        // Both settings off
+        SystemUtil.runShellCommand(getInstrumentation(),
+            "settings put secure assist_structure_enabled 0");
+        SystemUtil.runShellCommand(getInstrumentation(),
+            "settings put secure assist_screenshot_enabled 0");
+        waitForBroadcast();
+
+        logContextAndScreenshotSetting();
+
+        verifyAssistDataNullness(true, true, true, true);
+
+        // Screenshot off, context on
+        SystemUtil.runShellCommand(getInstrumentation(),
+            "settings put secure assist_structure_enabled 1");
+        SystemUtil.runShellCommand(getInstrumentation(),
+            "settings put secure assist_screenshot_enabled 0");
+        waitForBroadcast();
+
+        logContextAndScreenshotSetting();
+
+        verifyAssistDataNullness(false, false, false, true);
+
+        // Context off, screenshot on
+        SystemUtil.runShellCommand(getInstrumentation(),
+            "settings put secure assist_structure_enabled 0");
+        SystemUtil.runShellCommand(getInstrumentation(),
+            "settings put secure assist_screenshot_enabled 1");
+        waitForBroadcast();
+
+        logContextAndScreenshotSetting();
+
+        verifyAssistDataNullness(true, true, true, true);
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/assist/src/android/assist/cts/FlagSecureTest.java b/tests/tests/assist/src/android/assist/cts/FlagSecureTest.java
new file mode 100644
index 0000000..2e9932e
--- /dev/null
+++ b/tests/tests/assist/src/android/assist/cts/FlagSecureTest.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2015 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.assist.cts;
+
+import android.assist.common.Utils;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.util.Log;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Test we receive proper assist data (root assistStructure with no children) when the assistant is
+ * invoked on an app with FLAG_SECURE set.
+ */
+public class FlagSecureTest extends AssistTestBase {
+    static final String TAG = "FlagSecureTest";
+
+    private static final String TEST_CASE_TYPE = Utils.FLAG_SECURE;
+
+    private BroadcastReceiver mReceiver;
+    private CountDownLatch mHasResumedLatch = new CountDownLatch(1);
+
+    public FlagSecureTest() {
+        super();
+    }
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        setUpAndRegisterReceiver();
+        startTestActivity(TEST_CASE_TYPE);
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        super.tearDown();
+        if (mReceiver != null) {
+            mContext.unregisterReceiver(mReceiver);
+            mReceiver = null;
+        }
+    }
+
+    private void setUpAndRegisterReceiver() {
+        if (mReceiver != null) {
+            mContext.unregisterReceiver(mReceiver);
+        }
+        mReceiver = new FlagSecureTestBroadcastReceiver();
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(Utils.FLAG_SECURE_HASRESUMED);
+        filter.addAction(Utils.ASSIST_RECEIVER_REGISTERED);
+        mContext.registerReceiver(mReceiver, filter);
+    }
+
+    private void waitForOnResume() throws Exception {
+        Log.i(TAG, "waiting for onResume() before continuing");
+        if (!mHasResumedLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+            fail("Activity failed to resume in " + Utils.ACTIVITY_ONRESUME_TIMEOUT_MS + "msec");
+        }
+    }
+
+    public void testSecureActivity() throws Exception {
+        mTestActivity.startTest(TEST_CASE_TYPE);
+        waitForAssistantToBeReady();
+        mTestActivity.start3pApp(TEST_CASE_TYPE);
+        waitForOnResume();
+        startSession();
+        waitForContext();
+        verifyAssistDataNullness(false, false, false, false);
+        // verify that we have only the root window and not its children.
+        verifyAssistStructure(Utils.getTestAppComponent(TEST_CASE_TYPE), true);
+    }
+
+    private class FlagSecureTestBroadcastReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (action.equals(Utils.FLAG_SECURE_HASRESUMED)) {
+                mHasResumedLatch.countDown();
+            } else if (action.equals(Utils.ASSIST_RECEIVER_REGISTERED)) {
+                mAssistantReadyLatch.countDown();
+            }
+        }
+    }
+}
diff --git a/tests/tests/assist/src/android/assist/cts/LifecycleTest.java b/tests/tests/assist/src/android/assist/cts/LifecycleTest.java
new file mode 100644
index 0000000..7451017
--- /dev/null
+++ b/tests/tests/assist/src/android/assist/cts/LifecycleTest.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2015 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.assist.cts;
+
+import android.assist.cts.TestStartActivity;
+import android.assist.common.Utils;
+
+import android.app.Activity;
+import android.app.assist.AssistContent;
+import android.app.assist.AssistStructure;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.cts.util.SystemUtil;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
+
+import java.lang.Override;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/** Test we receive proper assist data when context is disabled or enabled */
+
+public class LifecycleTest extends AssistTestBase {
+    private static final String TAG = "LifecycleTest";
+    private static final String action_hasResumed = Utils.LIFECYCLE_HASRESUMED;
+    private static final String action_onPause = Utils.LIFECYCLE_ONPAUSE;
+    private static final String action_onStop = Utils.LIFECYCLE_ONSTOP;
+    private static final String action_onDestroy = Utils.LIFECYCLE_ONDESTROY;
+
+    private BroadcastReceiver mLifecycleTestBroadcastReceiver;
+    private CountDownLatch mHasResumedLatch = new CountDownLatch(1);
+    private CountDownLatch mActivityLifecycleLatch = new CountDownLatch(1);
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        setUpAndRegisterReceiver();
+        startTestActivity(Utils.LIFECYCLE);
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        super.tearDown();
+        if (mLifecycleTestBroadcastReceiver != null) {
+            mContext.unregisterReceiver(mLifecycleTestBroadcastReceiver);
+            mLifecycleTestBroadcastReceiver = null;
+        }
+    }
+
+    private void setUpAndRegisterReceiver() {
+        if (mLifecycleTestBroadcastReceiver != null) {
+            mContext.unregisterReceiver(mLifecycleTestBroadcastReceiver);
+        }
+        mLifecycleTestBroadcastReceiver = new LifecycleTestReceiver();
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(action_hasResumed);
+        filter.addAction(action_onPause);
+        filter.addAction(action_onStop);
+        filter.addAction(action_onDestroy);
+        filter.addAction(Utils.ASSIST_RECEIVER_REGISTERED);
+        mContext.registerReceiver(mLifecycleTestBroadcastReceiver, filter);
+
+    }
+
+    private void waitForOnResume() throws Exception {
+        Log.i(TAG, "waiting for onResume() before continuing");
+        if (!mHasResumedLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+            fail("Activity failed to resume in " + Utils.ACTIVITY_ONRESUME_TIMEOUT_MS + "msec");
+        }
+    }
+
+    private void waitAndSeeIfLifecycleMethodsAreTriggered() throws Exception {
+        if (mActivityLifecycleLatch.await(Utils.TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+            fail("One or more lifecycle methods were called after triggering assist");
+        }
+    }
+
+    public void testLayerDoesNotTriggerLifecycleMethods() throws Exception {
+        mTestActivity.startTest(Utils.LIFECYCLE);
+        waitForAssistantToBeReady();
+        mTestActivity.start3pApp(Utils.LIFECYCLE);
+        waitForOnResume();
+        startSession();
+        waitForContext();
+        waitAndSeeIfLifecycleMethodsAreTriggered();
+    }
+
+    private class LifecycleTestReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (action.equals(action_hasResumed)) {
+                mHasResumedLatch.countDown();
+            } else if (action.equals(action_onPause)) {
+                mActivityLifecycleLatch.countDown();
+            } else if (action.equals(action_onStop)) {
+                mActivityLifecycleLatch.countDown();
+            } else if (action.equals(action_onDestroy)) {
+                mActivityLifecycleLatch.countDown();
+            } else if (action.equals(Utils.ASSIST_RECEIVER_REGISTERED)) {
+                mAssistantReadyLatch.countDown();
+            }
+        }
+    }
+}
diff --git a/tests/tests/assist/src/android/assist/cts/TestStartActivity.java b/tests/tests/assist/src/android/assist/cts/TestStartActivity.java
new file mode 100644
index 0000000..16c924f
--- /dev/null
+++ b/tests/tests/assist/src/android/assist/cts/TestStartActivity.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2015 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.assist.cts;
+
+import android.assist.common.Utils;
+
+import android.app.Activity;
+import android.app.assist.AssistStructure;
+import android.app.assist.AssistStructure.ViewNode;
+import android.content.Intent;
+import android.content.ComponentName;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.widget.TextView;
+
+public class TestStartActivity extends Activity {
+    static final String TAG = "TestStartActivity";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Log.i(TAG, " in onCreate");
+        setContentView(R.layout.test_app);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        Log.i(TAG, " in onResume");
+    }
+
+    public void startTest(String testCaseName) {
+        Log.i(TAG, "Starting test activity for TestCaseType = " + testCaseName);
+        Intent intent = new Intent();
+        intent.putExtra(Utils.TESTCASE_TYPE, testCaseName);
+        intent.setAction("android.intent.action.START_TEST_" + testCaseName);
+        intent.setComponent(new ComponentName("android.assist.service",
+                "android.assist." + Utils.getTestActivity(testCaseName)));
+        startActivity(intent);
+    }
+
+    public void start3pApp(String testCaseName) {
+        Intent intent = new Intent();
+        intent.setAction("android.intent.action.TEST_APP_" + testCaseName);
+        intent.setComponent(Utils.getTestAppComponent(testCaseName));
+        startActivity(intent);
+    }
+
+    @Override protected void onPause() {
+        Log.i(TAG, " in onPause");
+        super.onPause();
+    }
+
+    @Override protected void onStart() {
+        super.onStart();
+        Log.i(TAG, " in onStart");
+    }
+
+    @Override protected void onRestart() {
+        super.onRestart();
+        Log.i(TAG, " in onRestart");
+    }
+
+    @Override protected void onStop() {
+        Log.i(TAG, " in onStop");
+        super.onStop();
+    }
+
+    @Override
+    protected void onDestroy() {
+        Log.i(TAG, " in onDestroy");
+        super.onDestroy();
+    }
+}
diff --git a/tests/tests/assist/testapp/Android.mk b/tests/tests/assist/testapp/Android.mk
new file mode 100644
index 0000000..68297ef
--- /dev/null
+++ b/tests/tests/assist/testapp/Android.mk
@@ -0,0 +1,32 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := CtsAssistCommon
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsAssistApp
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/tests/assist/testapp/AndroidManifest.xml b/tests/tests/assist/testapp/AndroidManifest.xml
new file mode 100644
index 0000000..f14cf22
--- /dev/null
+++ b/tests/tests/assist/testapp/AndroidManifest.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.assist.testapp">
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+
+        <activity android:name="TestApp"
+                android:label="Assist Structure Test App"
+                android:theme="@android:style/Theme.Material.Light">
+          <intent-filter>
+              <action android:name="android.intent.action.TEST_APP_ASSIST_STRUCTURE" />
+              <category android:name="android.intent.category.DEFAULT" />
+              <category android:name="android.intent.category.VOICE" />
+          </intent-filter>
+        </activity>
+        <activity android:name="DisableContextActivity"
+            android:label="Disable Context Test Activity"
+            android:theme="@android:style/Theme.Material.Light">
+            <intent-filter>
+                <action android:name="android.intent.action.TEST_APP_DISABLE_CONTEXT" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+        <activity android:name="SecureActivity"
+                  android:label="Secure Test Activity"
+                  android:theme="@android:style/Theme.Material.Light">
+            <intent-filter>
+                <action android:name="android.intent.action.TEST_APP_FLAG_SECURE" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.VOICE" />
+            </intent-filter>
+        </activity>
+        <activity android:name="LifecycleActivity"
+                  android:label="Life Cycle Check Activity"
+                  android:theme="@android:style/Theme.Material.Light">
+            <intent-filter>
+                <action android:name="android.intent.action.TEST_APP_LIFECYCLE" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/tests/tests/assist/testapp/res/layout/secure_app.xml b/tests/tests/assist/testapp/res/layout/secure_app.xml
new file mode 100644
index 0000000..3b72ad6
--- /dev/null
+++ b/tests/tests/assist/testapp/res/layout/secure_app.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/welcome" />
+</RelativeLayout>
\ No newline at end of file
diff --git a/tests/tests/assist/testapp/res/layout/test_app.xml b/tests/tests/assist/testapp/res/layout/test_app.xml
new file mode 100644
index 0000000..3fbfd6d
--- /dev/null
+++ b/tests/tests/assist/testapp/res/layout/test_app.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/welcome" />
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="350dp"
+        android:orientation="vertical"
+        android:layout_gravity="bottom">
+        <FrameLayout
+            android:id="@+id/card1"
+            android:layout_width="match_parent"
+            android:layout_height="150dp"
+            android:layout_marginStart="8dp"
+            android:layout_marginEnd="8dp"
+            android:layout_marginTop="16dp"
+            android:elevation="3dp">
+        </FrameLayout>
+        <View
+            android:id="@+id/card2"
+            android:layout_width="match_parent"
+            android:layout_height="200dp"
+            android:layout_marginStart="8dp"
+            android:layout_marginEnd="8dp"
+            android:layout_marginTop="16dp"
+            android:elevation="3dp"/>
+    </LinearLayout>
+</RelativeLayout>
\ No newline at end of file
diff --git a/tests/tests/assist/testapp/res/values/strings.xml b/tests/tests/assist/testapp/res/values/strings.xml
new file mode 100644
index 0000000..ae4f16e
--- /dev/null
+++ b/tests/tests/assist/testapp/res/values/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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>
+    <string name="welcome">Hello there!</string>
+</resources>
diff --git a/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/DisableContextActivity.java b/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/DisableContextActivity.java
new file mode 100644
index 0000000..ae570d8
--- /dev/null
+++ b/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/DisableContextActivity.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2015 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.assist.testapp;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+public class DisableContextActivity extends Activity {
+    static final String TAG = "TestApp";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Log.i(TAG, "TestApp created");
+        setContentView(R.layout.test_app);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/LifecycleActivity.java b/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/LifecycleActivity.java
new file mode 100644
index 0000000..4e1dc80
--- /dev/null
+++ b/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/LifecycleActivity.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2015 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.assist.testapp;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+public class LifecycleActivity extends Activity {
+    private static final String TAG = "LifecycleActivity";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Log.i(TAG, "LifecycleActivity created");
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        Log.i(TAG, "Activity has resumed");
+        sendBroadcast(new Intent("android.intent.action.lifecycle_hasResumed"));
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        Log.i(TAG, "activity was paused");
+        sendBroadcast(new Intent("android.intent.action.lifecycle_onpause"));
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        Log.i(TAG, "activity was stopped");
+        sendBroadcast(new Intent("android.intent.action.lifecycle_onstop"));
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        Log.i(TAG, "activity was destroyed");
+        sendBroadcast(new Intent("android.intent.action.lifecycle_ondestroy"));
+    }
+}
diff --git a/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/SecureActivity.java b/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/SecureActivity.java
new file mode 100644
index 0000000..708061e
--- /dev/null
+++ b/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/SecureActivity.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2015 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.assist.testapp;
+
+import android.assist.common.Utils;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+import android.view.View;
+import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
+import android.view.WindowManager;
+
+public class SecureActivity extends Activity {
+    static final String TAG = "SecureActivity";
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Log.i(TAG, "SecureActivity created");
+        setContentView(R.layout.secure_app);
+        getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
+            WindowManager.LayoutParams.FLAG_SECURE);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        Log.i(TAG, "Activity has resumed");
+        final View layout = findViewById(android.R.id.content);
+        ViewTreeObserver vto = layout.getViewTreeObserver();
+        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
+            @Override
+            public void onGlobalLayout() {
+                layout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+                sendBroadcast(new Intent(Utils.FLAG_SECURE_HASRESUMED));
+            }
+        });
+    }
+}
diff --git a/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/TestApp.java b/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/TestApp.java
new file mode 100644
index 0000000..ff56ea8
--- /dev/null
+++ b/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/TestApp.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2015 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.assist.testapp;
+
+import android.assist.common.Utils;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
+
+import java.lang.Override;
+
+public class TestApp extends Activity {
+    static final String TAG = "TestApp";
+
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Log.i(TAG, "TestApp created");
+        setContentView(R.layout.test_app);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        Log.i(TAG, "TestApp has resumed");
+        final View layout = findViewById(android.R.id.content);
+        ViewTreeObserver vto = layout.getViewTreeObserver();
+        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
+            @Override
+            public void onGlobalLayout() {
+                layout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+                sendBroadcast(new Intent(Utils.ASSIST_STRUCTURE_HASRESUMED));
+            }
+        });
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/bluetooth/AndroidManifest.xml b/tests/tests/bluetooth/AndroidManifest.xml
index c9ad122..12838f3 100644
--- a/tests/tests/bluetooth/AndroidManifest.xml
+++ b/tests/tests/bluetooth/AndroidManifest.xml
@@ -19,6 +19,7 @@
 
     <uses-permission android:name="android.permission.BLUETOOTH" />
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
 
     <application>
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/AdvertiseCallbackTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/AdvertiseCallbackTest.java
new file mode 100644
index 0000000..1c68022
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/AdvertiseCallbackTest.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2015 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.bluetooth.cts;
+
+import android.bluetooth.le.AdvertiseCallback;
+import android.bluetooth.le.AdvertiseSettings;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Test of {@link AdvertiseCallback}.
+ */
+public class AdvertiseCallbackTest extends AndroidTestCase {
+
+    private final static int ADVERTISE_TYPE_SUCCESS = 0;
+    private final static int ADVERTISE_TYPE_FAIL = 1;
+
+    private final MockAdvertiser mMockAdvertiser = new MockAdvertiser();
+    private final BleAdvertiseCallback mAdvertiseCallback = new BleAdvertiseCallback();
+
+    @SmallTest
+    public void testAdvertiseSuccess() {
+        mAdvertiseCallback.mAdvertiseType = ADVERTISE_TYPE_SUCCESS;
+        mMockAdvertiser.startAdvertise(mAdvertiseCallback);
+    }
+
+    @SmallTest
+    public void testAdvertiseFailure() {
+        mAdvertiseCallback.mAdvertiseType = ADVERTISE_TYPE_SUCCESS;
+        mMockAdvertiser.startAdvertise(mAdvertiseCallback);
+
+        // Second advertise with the same callback should fail.
+        mAdvertiseCallback.mAdvertiseType = ADVERTISE_TYPE_FAIL;
+        mMockAdvertiser.startAdvertise(mAdvertiseCallback);
+    }
+
+    // A mock advertiser which emulate BluetoothLeAdvertiser behavior.
+    private static class MockAdvertiser {
+        private Set<AdvertiseCallback> mCallbacks = new HashSet<>();
+
+        void startAdvertise(AdvertiseCallback callback) {
+            synchronized (mCallbacks) {
+                if (mCallbacks.contains(callback)) {
+                    callback.onStartFailure(AdvertiseCallback.ADVERTISE_FAILED_ALREADY_STARTED);
+                } else {
+                    callback.onStartSuccess(null);
+                    mCallbacks.add(callback);
+                }
+            }
+        }
+    }
+
+    private static class BleAdvertiseCallback extends AdvertiseCallback {
+        int mAdvertiseType = ADVERTISE_TYPE_SUCCESS;
+
+        @Override
+        public void onStartSuccess(AdvertiseSettings settings) {
+            if (mAdvertiseType == ADVERTISE_TYPE_FAIL) {
+                fail("advertise should fail");
+            }
+        }
+
+        @Override
+        public void onStartFailure(int error) {
+            if (mAdvertiseType == ADVERTISE_TYPE_SUCCESS) {
+                assertEquals(AdvertiseCallback.ADVERTISE_FAILED_ALREADY_STARTED, error);
+            }
+        }
+    }
+}
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/AdvertiseDataTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/AdvertiseDataTest.java
new file mode 100644
index 0000000..3f2bf52
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/AdvertiseDataTest.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2015 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.bluetooth.cts;
+
+import android.bluetooth.le.AdvertiseData;
+import android.os.Parcel;
+import android.os.ParcelUuid;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Unit test cases for {@link AdvertiseData}.
+ * <p>
+ * To run the test, use adb shell am instrument -e class 'android.bluetooth.le.AdvertiseDataTest' -w
+ * 'com.android.bluetooth.tests/android.bluetooth.BluetoothTestRunner'
+ */
+public class AdvertiseDataTest extends AndroidTestCase {
+
+    private AdvertiseData.Builder mAdvertiseDataBuilder;
+
+    @Override
+    protected void setUp() {
+        mAdvertiseDataBuilder = new AdvertiseData.Builder();
+    }
+
+    @SmallTest
+    public void testEmptyData() {
+        Parcel parcel = Parcel.obtain();
+        AdvertiseData data = mAdvertiseDataBuilder.build();
+        data.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        AdvertiseData dataFromParcel =
+                AdvertiseData.CREATOR.createFromParcel(parcel);
+        assertEquals(data, dataFromParcel);
+        assertFalse(dataFromParcel.getIncludeDeviceName());
+        assertFalse(dataFromParcel.getIncludeTxPowerLevel());
+        assertEquals(0, dataFromParcel.getManufacturerSpecificData().size());
+        assertTrue(dataFromParcel.getServiceData().isEmpty());
+        assertTrue(dataFromParcel.getServiceUuids().isEmpty());
+    }
+
+    @SmallTest
+    public void testEmptyServiceUuid() {
+        Parcel parcel = Parcel.obtain();
+        AdvertiseData data = mAdvertiseDataBuilder.setIncludeDeviceName(true).build();
+        data.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        AdvertiseData dataFromParcel =
+                AdvertiseData.CREATOR.createFromParcel(parcel);
+        assertEquals(data, dataFromParcel);
+        assertTrue(dataFromParcel.getIncludeDeviceName());
+        assertTrue(dataFromParcel.getServiceUuids().isEmpty());
+    }
+
+    @SmallTest
+    public void testEmptyManufacturerData() {
+        Parcel parcel = Parcel.obtain();
+        int manufacturerId = 50;
+        byte[] manufacturerData = new byte[0];
+        AdvertiseData data =
+                mAdvertiseDataBuilder.setIncludeDeviceName(true)
+                        .addManufacturerData(manufacturerId, manufacturerData).build();
+        data.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        AdvertiseData dataFromParcel =
+                AdvertiseData.CREATOR.createFromParcel(parcel);
+        assertEquals(data, dataFromParcel);
+        TestUtils.assertArrayEquals(new byte[0], dataFromParcel.getManufacturerSpecificData().get(manufacturerId));
+    }
+
+    @SmallTest
+    public void testEmptyServiceData() {
+        Parcel parcel = Parcel.obtain();
+        ParcelUuid uuid = ParcelUuid.fromString("0000110A-0000-1000-8000-00805F9B34FB");
+        byte[] serviceData = new byte[0];
+        AdvertiseData data =
+                mAdvertiseDataBuilder.setIncludeDeviceName(true)
+                        .addServiceData(uuid, serviceData).build();
+        data.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        AdvertiseData dataFromParcel =
+                AdvertiseData.CREATOR.createFromParcel(parcel);
+        assertEquals(data, dataFromParcel);
+        TestUtils.assertArrayEquals(new byte[0], dataFromParcel.getServiceData().get(uuid));
+    }
+
+    @SmallTest
+    public void testServiceUuid() {
+        Parcel parcel = Parcel.obtain();
+        ParcelUuid uuid = ParcelUuid.fromString("0000110A-0000-1000-8000-00805F9B34FB");
+        ParcelUuid uuid2 = ParcelUuid.fromString("0000110B-0000-1000-8000-00805F9B34FB");
+
+        AdvertiseData data =
+                mAdvertiseDataBuilder.setIncludeDeviceName(true)
+                        .addServiceUuid(uuid).addServiceUuid(uuid2).build();
+        data.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        AdvertiseData dataFromParcel =
+                AdvertiseData.CREATOR.createFromParcel(parcel);
+        assertEquals(data, dataFromParcel);
+        assertTrue(dataFromParcel.getServiceUuids().contains(uuid));
+        assertTrue(dataFromParcel.getServiceUuids().contains(uuid2));
+    }
+
+    @SmallTest
+    public void testManufacturerData() {
+        Parcel parcel = Parcel.obtain();
+        ParcelUuid uuid = ParcelUuid.fromString("0000110A-0000-1000-8000-00805F9B34FB");
+        ParcelUuid uuid2 = ParcelUuid.fromString("0000110B-0000-1000-8000-00805F9B34FB");
+
+        int manufacturerId = 50;
+        byte[] manufacturerData = new byte[] {
+                (byte) 0xF0, 0x00, 0x02, 0x15 };
+        AdvertiseData data =
+                mAdvertiseDataBuilder.setIncludeDeviceName(true)
+                        .addServiceUuid(uuid).addServiceUuid(uuid2)
+                        .addManufacturerData(manufacturerId, manufacturerData).build();
+
+        data.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        AdvertiseData dataFromParcel =
+                AdvertiseData.CREATOR.createFromParcel(parcel);
+        assertEquals(data, dataFromParcel);
+        TestUtils.assertArrayEquals(manufacturerData,
+                dataFromParcel.getManufacturerSpecificData().get(manufacturerId));
+    }
+
+    @SmallTest
+    public void testServiceData() {
+        Parcel parcel = Parcel.obtain();
+        ParcelUuid uuid = ParcelUuid.fromString("0000110A-0000-1000-8000-00805F9B34FB");
+        byte[] serviceData = new byte[] {
+                (byte) 0xF0, 0x00, 0x02, 0x15 };
+        AdvertiseData data =
+                mAdvertiseDataBuilder.setIncludeDeviceName(true)
+                        .addServiceData(uuid, serviceData).build();
+        data.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        AdvertiseData dataFromParcel =
+                AdvertiseData.CREATOR.createFromParcel(parcel);
+        assertEquals(data, dataFromParcel);
+        TestUtils.assertArrayEquals(serviceData, dataFromParcel.getServiceData().get(uuid));
+    }
+
+    @SmallTest
+    public void testIncludeTxPower() {
+        Parcel parcel = Parcel.obtain();
+        AdvertiseData data = mAdvertiseDataBuilder.setIncludeTxPowerLevel(true).build();
+        data.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        AdvertiseData dataFromParcel =
+                AdvertiseData.CREATOR.createFromParcel(parcel);
+        assertEquals(dataFromParcel.getIncludeTxPowerLevel(), true);
+    }
+
+    @SmallTest
+    public void testDescribeContents() {
+        AdvertiseData data = new AdvertiseData.Builder().build();
+        assertEquals(0, data.describeContents());
+    }
+}
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/AdvertiseSettingsTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/AdvertiseSettingsTest.java
new file mode 100644
index 0000000..19b7c29
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/AdvertiseSettingsTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2015 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.bluetooth.cts;
+
+import android.bluetooth.le.AdvertiseSettings;
+import android.os.Parcel;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Test for {@link AdvertiseSettings}.
+ */
+public class AdvertiseSettingsTest extends AndroidTestCase {
+
+    @SmallTest
+    public void testDefaultSettings() {
+        AdvertiseSettings settings = new AdvertiseSettings.Builder().build();
+        assertEquals(AdvertiseSettings.ADVERTISE_MODE_LOW_POWER, settings.getMode());
+        assertEquals(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM, settings.getTxPowerLevel());
+        assertEquals(0, settings.getTimeout());
+        assertTrue(settings.isConnectable());
+    }
+
+    @SmallTest
+    public void testDescribeContents() {
+        AdvertiseSettings settings = new AdvertiseSettings.Builder().build();
+        assertEquals(0, settings.describeContents());
+    }
+
+    @SmallTest
+    public void testReadWriteParcel() {
+        final int timeoutMillis = 60 * 1000;
+        Parcel parcel = Parcel.obtain();
+        AdvertiseSettings settings = new AdvertiseSettings.Builder()
+                .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
+                .setConnectable(false)
+                .setTimeout(timeoutMillis)
+                .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM)
+                .build();
+        settings.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        AdvertiseSettings settingsFromParcel = AdvertiseSettings.CREATOR.createFromParcel(parcel);
+        assertEquals(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY, settingsFromParcel.getMode());
+        assertEquals(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM,
+                settingsFromParcel.getTxPowerLevel());
+        assertEquals(timeoutMillis, settingsFromParcel.getTimeout());
+        assertFalse(settings.isConnectable());
+    }
+
+    @SmallTest
+    public void testIllegalTimeout() {
+        AdvertiseSettings.Builder builder = new AdvertiseSettings.Builder();
+        builder.setTimeout(0).build();
+        builder.setTimeout(180 * 1000).build();
+        // Maximum timeout is 3 minutes.
+        try {
+            builder.setTimeout(180 * 1000 + 1).build();
+            fail("should not allow setting timeout to more than 3 minutes");
+        } catch (IllegalArgumentException e) {
+            // nothing to do.
+        }
+        // Negative time out is not allowed.
+        try {
+            builder.setTimeout(-1).build();
+            fail("should not allow setting timeout to more than 3 minutes");
+        } catch (IllegalArgumentException e) {
+            // nothing to do.
+        }
+
+    }
+}
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/BluetoothLeScanTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/BluetoothLeScanTest.java
new file mode 100644
index 0000000..a79df42
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/BluetoothLeScanTest.java
@@ -0,0 +1,311 @@
+/*
+ * Copyright (C) 2015 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.bluetooth.cts;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothManager;
+import android.bluetooth.le.BluetoothLeScanner;
+import android.bluetooth.le.ScanCallback;
+import android.bluetooth.le.ScanFilter;
+import android.bluetooth.le.ScanRecord;
+import android.bluetooth.le.ScanResult;
+import android.bluetooth.le.ScanSettings;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.ParcelUuid;
+import android.os.SystemClock;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.util.Log;
+import android.util.SparseArray;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Test cases for Bluetooth LE scans.
+ * <p>
+ * To run the test, the device must be placed in an environment that has at least 3 beacons, all
+ * placed less than 5 meters away from the DUT.
+ * <p>
+ * Run 'run cts --class android.bluetooth.cts.BluetoothLeScanTest' in cts-tradefed to run the test
+ * cases.
+ */
+public class BluetoothLeScanTest extends AndroidTestCase {
+
+    private static final String TAG = "BluetoothLeScanTest";
+
+    private static final int SCAN_DURATION_MILLIS = 5000;
+    private static final int BATCH_SCAN_REPORT_DELAY_MILLIS = 20000;
+
+    private BluetoothAdapter mBluetoothAdapter;
+    private BluetoothLeScanner mScanner;
+
+    @Override
+    public void setUp() {
+        if (!isBleSupported())
+            return;
+        BluetoothManager manager = (BluetoothManager) mContext.getSystemService(
+                Context.BLUETOOTH_SERVICE);
+        mBluetoothAdapter = manager.getAdapter();
+        if (!mBluetoothAdapter.isEnabled()) {
+            // Note it's not reliable to listen for Adapter.ACTION_STATE_CHANGED broadcast and check
+            // bluetooth state.
+            mBluetoothAdapter.enable();
+            sleep(3000);
+        }
+        mScanner = mBluetoothAdapter.getBluetoothLeScanner();
+    }
+
+    /**
+     * Basic test case for BLE scans. Checks BLE scan timestamp is within correct range.
+     */
+    @MediumTest
+    public void testBasicBleScan() {
+        if (!isBleSupported())
+            return;
+        long scanStartMillis = SystemClock.elapsedRealtime();
+        Collection<ScanResult> scanResults = scan();
+        long scanEndMillis = SystemClock.elapsedRealtime();
+        assertTrue("Scan results shouldn't be empty", !scanResults.isEmpty());
+        verifyTimestamp(scanResults, scanStartMillis, scanEndMillis);
+    }
+
+    /**
+     * Test of scan filters. Ensures only beacons matching certain type of scan filters were
+     * reported.
+     */
+    @MediumTest
+    public void testScanFilter() {
+        if (!isBleSupported())
+            return;
+
+        List<ScanFilter> filters = new ArrayList<ScanFilter>();
+        ScanFilter filter = createScanFilter();
+        if (filter == null) {
+            Log.d(TAG, "no appropriate filter can be set");
+            return;
+        }
+        filters.add(filter);
+
+        BleScanCallback filterLeScanCallback = new BleScanCallback();
+        ScanSettings settings = new ScanSettings.Builder().setScanMode(
+                ScanSettings.SCAN_MODE_LOW_LATENCY).build();
+        mScanner.startScan(filters, settings, filterLeScanCallback);
+        sleep(SCAN_DURATION_MILLIS);
+        mScanner.stopScan(filterLeScanCallback);
+        sleep(1000);
+        Collection<ScanResult> scanResults = filterLeScanCallback.getScanResults();
+        for (ScanResult result : scanResults) {
+            assertTrue(filter.matches(result));
+        }
+    }
+
+    // Create a scan filter based on the nearby beacon with highest signal strength.
+    private ScanFilter createScanFilter() {
+        // Get a list of nearby beacons.
+        List<ScanResult> scanResults = new ArrayList<ScanResult>(scan());
+        assertTrue("Scan results shouldn't be empty", !scanResults.isEmpty());
+        // Find the beacon with strongest signal strength, which is the target device for filter
+        // scan.
+        Collections.sort(scanResults, new RssiComparator());
+        ScanResult result = scanResults.get(0);
+        ScanRecord record = result.getScanRecord();
+        if (record == null) {
+            return null;
+        }
+        Map<ParcelUuid, byte[]> serviceData = record.getServiceData();
+        if (serviceData != null && !serviceData.isEmpty()) {
+            ParcelUuid uuid = serviceData.keySet().iterator().next();
+            return new ScanFilter.Builder().setServiceData(uuid, new byte[] { 0 },
+                    new byte[] { 0 }).build();
+        }
+        SparseArray<byte[]> manufacturerSpecificData = record.getManufacturerSpecificData();
+        if (manufacturerSpecificData != null && manufacturerSpecificData.size() > 0) {
+            return new ScanFilter.Builder().setManufacturerData(manufacturerSpecificData.keyAt(0),
+                    new byte[] { 0 }, new byte[] { 0 }).build();
+        }
+        List<ParcelUuid> serviceUuids = record.getServiceUuids();
+        if (serviceUuids != null && !serviceUuids.isEmpty()) {
+            return new ScanFilter.Builder().setServiceUuid(serviceUuids.get(0)).build();
+        }
+        return null;
+    }
+
+    /**
+     * Test of opportunistic BLE scans.
+     */
+    @MediumTest
+    public void testOpportunisticScan() {
+        if (!isBleSupported())
+            return;
+        ScanSettings opportunisticScanSettings = new ScanSettings.Builder()
+                .setScanMode(ScanSettings.SCAN_MODE_OPPORTUNISTIC)
+                .build();
+        BleScanCallback emptyScanCallback = new BleScanCallback();
+
+        // No scans are really started with opportunistic scans only.
+        mScanner.startScan(Collections.<ScanFilter> emptyList(), opportunisticScanSettings,
+                emptyScanCallback);
+        sleep(SCAN_DURATION_MILLIS);
+        assertTrue(emptyScanCallback.getScanResults().isEmpty());
+
+        BleScanCallback regularScanCallback = new BleScanCallback();
+        ScanSettings regularScanSettings = new ScanSettings.Builder()
+                .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();
+        List<ScanFilter> filters = new ArrayList<>();
+        ScanFilter filter = createScanFilter();
+        if (filter != null) {
+            filters.add(filter);
+        } else {
+            Log.d(TAG, "no appropriate filter can be set");
+        }
+        mScanner.startScan(filters, regularScanSettings, regularScanCallback);
+        sleep(SCAN_DURATION_MILLIS);
+        // With normal BLE scan client, opportunistic scan client will get scan results.
+        assertTrue("opportunistic scan results shouldn't be empty",
+                !emptyScanCallback.getScanResults().isEmpty());
+
+        // No more scan results for opportunistic scan clients once the normal BLE scan clients
+        // stops.
+        mScanner.stopScan(regularScanCallback);
+        // In case we got scan results before scan was completely stopped.
+        sleep(1000);
+        emptyScanCallback.clear();
+        sleep(SCAN_DURATION_MILLIS);
+        assertTrue("opportunistic scan shouldn't have scan results",
+                emptyScanCallback.getScanResults().isEmpty());
+    }
+
+    /**
+     * Test case for BLE Batch scan.
+     */
+    @MediumTest
+    public void testBatchScan() {
+        if (!isBleSupported() || !isBleBatchScanSupported()) {
+            Log.d(TAG, "BLE or BLE batching not suppported");
+            return;
+        }
+        ScanSettings batchScanSettings = new ScanSettings.Builder()
+                .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
+                .setReportDelay(BATCH_SCAN_REPORT_DELAY_MILLIS).build();
+        BleScanCallback batchScanCallback = new BleScanCallback();
+        mScanner.startScan(Collections.<ScanFilter> emptyList(), batchScanSettings,
+                batchScanCallback);
+        sleep(SCAN_DURATION_MILLIS);
+        mScanner.flushPendingScanResults(batchScanCallback);
+        sleep(1000);
+        List<ScanResult> results = batchScanCallback.getBatchScanResults();
+        assertTrue(!results.isEmpty());
+        long scanEndMillis = SystemClock.elapsedRealtime();
+        mScanner.stopScan(batchScanCallback);
+        verifyTimestamp(results, 0, scanEndMillis);
+    }
+
+    // Verify timestamp of all scan results are within [scanStartMillis, scanEndMillis].
+    private void verifyTimestamp(Collection<ScanResult> results, long scanStartMillis,
+            long scanEndMillis) {
+        for (ScanResult result : results) {
+            long timestampMillis = TimeUnit.NANOSECONDS.toMillis(result.getTimestampNanos());
+            assertTrue("Invalid timestamp: " + timestampMillis + " should be >= " + scanStartMillis,
+                    timestampMillis >= scanStartMillis);
+            assertTrue("Invalid timestamp: " + timestampMillis + " should be <= " + scanEndMillis,
+                    timestampMillis <= scanEndMillis);
+        }
+    }
+
+    // Helper class for BLE scan callback.
+    private class BleScanCallback extends ScanCallback {
+        private Set<ScanResult> mResults = new HashSet<ScanResult>();
+        private List<ScanResult> mBatchScanResults = new ArrayList<ScanResult>();
+
+        @Override
+        public void onScanResult(int callbackType, ScanResult result) {
+            if (callbackType == ScanSettings.CALLBACK_TYPE_ALL_MATCHES) {
+                mResults.add(result);
+            }
+        }
+
+        @Override
+        public void onBatchScanResults(List<ScanResult> results) {
+            mBatchScanResults = results;
+        }
+
+        // Clear regular and batch scan results.
+        synchronized public void clear() {
+            mResults.clear();
+            mBatchScanResults.clear();
+        }
+
+        // Return regular BLE scan results accumulated so far.
+        synchronized Set<ScanResult> getScanResults() {
+            return Collections.unmodifiableSet(mResults);
+        }
+
+        // Return batch scan results.
+        synchronized List<ScanResult> getBatchScanResults() {
+            return Collections.unmodifiableList(mBatchScanResults);
+        }
+    }
+
+    private class RssiComparator implements Comparator<ScanResult> {
+
+        @Override
+        public int compare(ScanResult lhs, ScanResult rhs) {
+            return rhs.getRssi() - lhs.getRssi();
+        }
+
+    }
+
+    // Perform a BLE scan to get results of nearby BLE devices.
+    private Set<ScanResult> scan() {
+        BleScanCallback regularLeScanCallback = new BleScanCallback();
+        mScanner.startScan(regularLeScanCallback);
+        sleep(SCAN_DURATION_MILLIS);
+        mScanner.stopScan(regularLeScanCallback);
+        sleep(1000);
+        return regularLeScanCallback.getScanResults();
+    }
+
+    // Put the current thread to sleep.
+    private void sleep(int sleepMillis) {
+        try {
+            Thread.sleep(sleepMillis);
+        } catch (InterruptedException e) {
+            Log.e(TAG, "interrupted", e);
+        }
+    }
+
+    // Check if Bluetooth LE feature is supported on DUT.
+    private boolean isBleSupported() {
+        return getContext().getPackageManager()
+                .hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE);
+    }
+
+    // Returns whether offloaded scan batching is supported.
+    private boolean isBleBatchScanSupported() {
+        return mBluetoothAdapter.isOffloadedScanBatchingSupported();
+    }
+
+}
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/ScanCallbackTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanCallbackTest.java
new file mode 100644
index 0000000..f447f10
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanCallbackTest.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2015 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.bluetooth.cts;
+
+import android.bluetooth.le.ScanCallback;
+import android.bluetooth.le.ScanResult;
+import android.bluetooth.le.ScanSettings;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Test cases for {@link ScanCallback}.
+ */
+public class ScanCallbackTest extends AndroidTestCase {
+
+    // Scan types are used to determine which callback method is expected.
+    private final static int SCAN_TYPE_SUCCESS = 0;
+    private final static int SCAN_TYPE_FAIL = 1;
+    private final static int SCAN_TYPE_BATCH = 2;
+
+    private MockScanner mMockScanner = new MockScanner();
+    private BleScanCallback mMockScanCallback = new BleScanCallback();
+
+    @SmallTest
+    public void testScanSuccess() {
+        mMockScanCallback.mScanType = SCAN_TYPE_SUCCESS;
+        mMockScanner.startScan(new ScanSettings.Builder().build(), mMockScanCallback);
+    }
+
+    @SmallTest
+    public void testBatchScans() {
+        ScanSettings settings = new ScanSettings.Builder().setReportDelay(1000).build();
+        mMockScanCallback.mScanType = SCAN_TYPE_BATCH;
+        mMockScanner.startScan(settings, mMockScanCallback);
+    }
+
+    @SmallTest
+    public void testScanFail() {
+        ScanSettings settings = new ScanSettings.Builder().build();
+        // The first scan is success.
+        mMockScanCallback.mScanType = SCAN_TYPE_SUCCESS;
+        mMockScanner.startScan(settings, mMockScanCallback);
+        // A second scan with the same callback should fail.
+        mMockScanCallback.mScanType = SCAN_TYPE_FAIL;
+        mMockScanner.startScan(settings, mMockScanCallback);
+    }
+
+    // A mock scanner for mocking BLE scanner functionalities.
+    private static class MockScanner {
+        private Set<ScanCallback> mCallbacks = new HashSet<>();
+
+        void startScan(ScanSettings settings, ScanCallback callback) {
+            synchronized (mCallbacks) {
+                if (mCallbacks.contains(callback)) {
+                    callback.onScanFailed(ScanCallback.SCAN_FAILED_ALREADY_STARTED);
+                    return;
+                }
+                mCallbacks.add(callback);
+                if (settings.getReportDelayMillis() == 0) {
+                    callback.onScanResult(0, null);
+                } else {
+                    callback.onBatchScanResults(null);
+                }
+            }
+        }
+    }
+
+    private static class BleScanCallback extends ScanCallback {
+        int mScanType = SCAN_TYPE_SUCCESS;
+
+        @Override
+        public void onScanResult(int callbackType, ScanResult result) {
+            if (mScanType != SCAN_TYPE_SUCCESS) {
+                fail("scan should fail");
+            }
+        }
+
+        @Override
+        public void onBatchScanResults(List<ScanResult> results) {
+            if (mScanType != SCAN_TYPE_BATCH) {
+                fail("not a batch scan");
+            }
+        }
+
+        @Override
+        public void onScanFailed(int errorCode) {
+            if (mScanType != SCAN_TYPE_FAIL) {
+                fail("scan should not fail");
+            }
+        }
+
+    }
+}
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/ScanFilterTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanFilterTest.java
new file mode 100644
index 0000000..16e1413
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanFilterTest.java
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2015 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.bluetooth.cts;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.le.ScanFilter;
+import android.bluetooth.le.ScanResult;
+import android.os.Parcel;
+import android.os.ParcelUuid;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Unit test cases for Bluetooth LE scan filters.
+ * <p>
+ * To run this test, use adb shell am instrument -e class 'android.bluetooth.ScanFilterTest' -w
+ * 'com.android.bluetooth.tests/android.bluetooth.BluetoothTestRunner'
+ */
+public class ScanFilterTest extends AndroidTestCase {
+
+    private static final String LOCAL_NAME = "Ped";
+    private static final String DEVICE_MAC = "01:02:03:04:05:AB";
+    private static final String UUID1 = "0000110a-0000-1000-8000-00805f9b34fb";
+    private static final String UUID2 = "0000110b-0000-1000-8000-00805f9b34fb";
+    private static final String UUID3 = "0000110c-0000-1000-8000-00805f9b34fb";
+
+    private ScanResult mScanResult;
+    private ScanFilter.Builder mFilterBuilder;
+
+    @Override
+    protected void setUp() {
+        byte[] scanRecord = new byte[] {
+                0x02, 0x01, 0x1a, // advertising flags
+                0x05, 0x02, 0x0b, 0x11, 0x0a, 0x11, // 16 bit service uuids
+                0x04, 0x09, 0x50, 0x65, 0x64, // setName
+                0x02, 0x0A, (byte) 0xec, // tx power level
+                0x05, 0x16, 0x0b, 0x11, 0x50, 0x64, // service data
+                0x05, (byte) 0xff, (byte) 0xe0, 0x00, 0x02, 0x15, // manufacturer specific data
+                0x03, 0x50, 0x01, 0x02, // an unknown data type won't cause trouble
+        };
+
+        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+        BluetoothDevice device = adapter.getRemoteDevice(DEVICE_MAC);
+        mScanResult = new ScanResult(device, TestUtils.parseScanRecord(scanRecord),
+                -10, 1397545200000000L);
+        mFilterBuilder = new ScanFilter.Builder();
+    }
+
+    @SmallTest
+    public void testsetNameFilter() {
+        ScanFilter filter = mFilterBuilder.setDeviceName(LOCAL_NAME).build();
+        assertEquals(LOCAL_NAME, filter.getDeviceName());
+        assertTrue("setName filter fails", filter.matches(mScanResult));
+
+        filter = mFilterBuilder.setDeviceName("Pem").build();
+        assertFalse("setName filter fails", filter.matches(mScanResult));
+    }
+
+    @SmallTest
+    public void testDeviceAddressFilter() {
+        ScanFilter filter = mFilterBuilder.setDeviceAddress(DEVICE_MAC).build();
+        assertEquals(DEVICE_MAC, filter.getDeviceAddress());
+        assertTrue("device filter fails", filter.matches(mScanResult));
+
+        filter = mFilterBuilder.setDeviceAddress("11:22:33:44:55:66").build();
+        assertFalse("device filter fails", filter.matches(mScanResult));
+    }
+
+    @SmallTest
+    public void testsetServiceUuidFilter() {
+        ScanFilter filter = mFilterBuilder.setServiceUuid(
+                ParcelUuid.fromString(UUID1)).build();
+        assertEquals(UUID1, filter.getServiceUuid().toString());
+        assertTrue("uuid filter fails", filter.matches(mScanResult));
+
+        filter = mFilterBuilder.setServiceUuid(
+                ParcelUuid.fromString(UUID3)).build();
+        assertEquals(UUID3, filter.getServiceUuid().toString());
+        assertFalse("uuid filter fails", filter.matches(mScanResult));
+
+        ParcelUuid mask = ParcelUuid.fromString("FFFFFFF0-FFFF-FFFF-FFFF-FFFFFFFFFFFF");
+        filter = mFilterBuilder
+                .setServiceUuid(ParcelUuid.fromString(UUID3),
+                        mask)
+                .build();
+        assertEquals(mask.toString(), filter.getServiceUuidMask().toString());
+        assertTrue("uuid filter fails", filter.matches(mScanResult));
+    }
+
+    @SmallTest
+    public void testsetServiceDataFilter() {
+        byte[] setServiceData = new byte[] {
+                0x50, 0x64 };
+        ParcelUuid serviceDataUuid = ParcelUuid.fromString(UUID2);
+        ScanFilter filter = mFilterBuilder.setServiceData(serviceDataUuid, setServiceData).build();
+        assertEquals(serviceDataUuid, filter.getServiceDataUuid());
+        assertTrue("service data filter fails", filter.matches(mScanResult));
+
+        byte[] emptyData = new byte[0];
+        filter = mFilterBuilder.setServiceData(serviceDataUuid, emptyData).build();
+        assertTrue("service data filter fails", filter.matches(mScanResult));
+
+        byte[] prefixData = new byte[] {
+                0x50 };
+        filter = mFilterBuilder.setServiceData(serviceDataUuid, prefixData).build();
+        assertTrue("service data filter fails", filter.matches(mScanResult));
+
+        byte[] nonMatchData = new byte[] {
+                0x51, 0x64 };
+        byte[] mask = new byte[] {
+                (byte) 0x00, (byte) 0xFF };
+        filter = mFilterBuilder.setServiceData(serviceDataUuid, nonMatchData, mask).build();
+        assertEquals(nonMatchData, filter.getServiceData());
+        assertEquals(mask, filter.getServiceDataMask());
+        assertTrue("partial service data filter fails", filter.matches(mScanResult));
+
+        filter = mFilterBuilder.setServiceData(serviceDataUuid, nonMatchData).build();
+        assertFalse("service data filter fails", filter.matches(mScanResult));
+    }
+
+    @SmallTest
+    public void testManufacturerSpecificData() {
+        byte[] manufacturerData = new byte[] {
+                0x02, 0x15 };
+        int manufacturerId = 0xE0;
+        ScanFilter filter =
+                mFilterBuilder.setManufacturerData(manufacturerId, manufacturerData).build();
+        assertEquals(manufacturerId, filter.getManufacturerId());
+        assertEquals(manufacturerData, filter.getManufacturerData());
+        assertTrue("manufacturer data filter fails", filter.matches(mScanResult));
+
+        byte[] emptyData = new byte[0];
+        filter = mFilterBuilder.setManufacturerData(manufacturerId, emptyData).build();
+        assertTrue("manufacturer data filter fails", filter.matches(mScanResult));
+
+        byte[] prefixData = new byte[] {
+                0x02 };
+        filter = mFilterBuilder.setManufacturerData(manufacturerId, prefixData).build();
+        assertTrue("manufacturer data filter fails", filter.matches(mScanResult));
+
+        // Test data mask
+        byte[] nonMatchData = new byte[] {
+                0x02, 0x14 };
+        filter = mFilterBuilder.setManufacturerData(manufacturerId, nonMatchData).build();
+        assertFalse("manufacturer data filter fails", filter.matches(mScanResult));
+        byte[] mask = new byte[] {
+                (byte) 0xFF, (byte) 0x00
+        };
+        filter = mFilterBuilder.setManufacturerData(manufacturerId, nonMatchData, mask).build();
+        assertEquals(manufacturerId, filter.getManufacturerId());
+        assertEquals(nonMatchData, filter.getManufacturerData());
+        assertEquals(mask, filter.getManufacturerDataMask());
+        assertTrue("partial setManufacturerData filter fails", filter.matches(mScanResult));
+    }
+
+    @SmallTest
+    public void testReadWriteParcel() {
+        ScanFilter filter = mFilterBuilder.build();
+        testReadWriteParcelForFilter(filter);
+
+        filter = mFilterBuilder.setDeviceName(LOCAL_NAME).build();
+        testReadWriteParcelForFilter(filter);
+
+        filter = mFilterBuilder.setDeviceAddress("11:22:33:44:55:66").build();
+        testReadWriteParcelForFilter(filter);
+
+        filter = mFilterBuilder.setServiceUuid(
+                ParcelUuid.fromString(UUID3)).build();
+        testReadWriteParcelForFilter(filter);
+
+        filter = mFilterBuilder.setServiceUuid(
+                ParcelUuid.fromString(UUID3),
+                ParcelUuid.fromString("FFFFFFF0-FFFF-FFFF-FFFF-FFFFFFFFFFFF")).build();
+        testReadWriteParcelForFilter(filter);
+
+        byte[] serviceData = new byte[] {
+                0x50, 0x64 };
+
+        ParcelUuid serviceDataUuid = ParcelUuid.fromString(UUID2);
+        filter = mFilterBuilder.setServiceData(serviceDataUuid, serviceData).build();
+        testReadWriteParcelForFilter(filter);
+
+        filter = mFilterBuilder.setServiceData(serviceDataUuid, new byte[0]).build();
+        testReadWriteParcelForFilter(filter);
+
+        byte[] serviceDataMask = new byte[] {
+                (byte) 0xFF, (byte) 0xFF };
+        filter = mFilterBuilder.setServiceData(serviceDataUuid, serviceData, serviceDataMask)
+                .build();
+        testReadWriteParcelForFilter(filter);
+
+        byte[] manufacturerData = new byte[] {
+                0x02, 0x15 };
+        int manufacturerId = 0xE0;
+        filter = mFilterBuilder.setManufacturerData(manufacturerId, manufacturerData).build();
+        testReadWriteParcelForFilter(filter);
+
+        filter = mFilterBuilder.setServiceData(serviceDataUuid, new byte[0]).build();
+        testReadWriteParcelForFilter(filter);
+
+        byte[] manufacturerDataMask = new byte[] {
+                (byte) 0xFF, (byte) 0xFF
+        };
+        filter = mFilterBuilder.setManufacturerData(manufacturerId, manufacturerData,
+                manufacturerDataMask).build();
+        testReadWriteParcelForFilter(filter);
+    }
+
+    @SmallTest
+    public void testDescribeContents() {
+        final int expected = 0;
+        assertEquals(expected, new ScanFilter.Builder().build().describeContents());
+    }
+
+    private void testReadWriteParcelForFilter(ScanFilter filter) {
+        Parcel parcel = Parcel.obtain();
+        filter.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        ScanFilter filterFromParcel =
+                ScanFilter.CREATOR.createFromParcel(parcel);
+        assertEquals(filter, filterFromParcel);
+    }
+}
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/ScanRecordTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanRecordTest.java
new file mode 100644
index 0000000..30ad06f
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanRecordTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2015 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.bluetooth.cts;
+
+import android.bluetooth.le.ScanRecord;
+import android.os.ParcelUuid;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Unit test cases for {@link ScanRecord}.
+ * <p>
+ * To run this test, use adb shell am instrument -e class 'android.bluetooth.ScanRecordTest' -w
+ * 'com.android.bluetooth.tests/android.bluetooth.BluetoothTestRunner'
+ */
+public class ScanRecordTest extends AndroidTestCase {
+
+    @SmallTest
+    public void testParser() {
+        byte[] scanRecord = new byte[] {
+                0x02, 0x01, 0x1a, // advertising flags
+                0x05, 0x02, 0x0b, 0x11, 0x0a, 0x11, // 16 bit service uuids
+                0x04, 0x09, 0x50, 0x65, 0x64, // name
+                0x02, 0x0A, (byte) 0xec, // tx power level
+                0x05, 0x16, 0x0b, 0x11, 0x50, 0x64, // service data
+                0x05, (byte) 0xff, (byte) 0xe0, 0x00, 0x02, 0x15, // manufacturer specific data
+                0x03, 0x50, 0x01, 0x02, // an unknown data type won't cause trouble
+        };
+        ScanRecord data = TestUtils.parseScanRecord(scanRecord);
+        assertEquals(0x1a, data.getAdvertiseFlags());
+        ParcelUuid uuid1 = ParcelUuid.fromString("0000110A-0000-1000-8000-00805F9B34FB");
+        ParcelUuid uuid2 = ParcelUuid.fromString("0000110B-0000-1000-8000-00805F9B34FB");
+        assertTrue(data.getServiceUuids().contains(uuid1));
+        assertTrue(data.getServiceUuids().contains(uuid2));
+
+        assertEquals("Ped", data.getDeviceName());
+        assertEquals(-20, data.getTxPowerLevel());
+
+        assertTrue(data.getManufacturerSpecificData().get(0x00E0) != null);
+
+        final byte[] manufacturerData = new byte[] {
+                0x02, 0x15 };
+        TestUtils.assertArrayEquals(manufacturerData,
+                data.getManufacturerSpecificData().get(0x00E0));
+        TestUtils.assertArrayEquals(manufacturerData, data.getManufacturerSpecificData(0x00E0));
+
+        assertTrue(data.getServiceData().containsKey(uuid2));
+        final byte[] serviceData = new byte[] {
+                0x50, 0x64 };
+        TestUtils.assertArrayEquals(serviceData, data.getServiceData().get(uuid2));
+        TestUtils.assertArrayEquals(serviceData, data.getServiceData(uuid2));
+    }
+}
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/ScanResultTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanResultTest.java
new file mode 100644
index 0000000..91da8c3
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanResultTest.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2015 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.bluetooth.cts;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.le.ScanResult;
+import android.os.Parcel;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Unit test cases for Bluetooth LE scans.
+ * <p>
+ * To run this test, use adb shell am instrument -e class 'android.bluetooth.ScanResultTest' -w
+ * 'com.android.bluetooth.tests/android.bluetooth.BluetoothTestRunner'
+ */
+public class ScanResultTest extends AndroidTestCase {
+    private static final String DEVICE_ADDRESS = "01:02:03:04:05:06";
+    private static final byte[] SCAN_RECORD = new byte[] {
+            1, 2, 3 };
+    private static final int RSSI = -10;
+    private static final long TIMESTAMP_NANOS = 10000L;
+
+    /**
+     * Test read and write parcel of ScanResult
+     */
+    @SmallTest
+    public void testScanResultParceling() {
+        BluetoothDevice device =
+                BluetoothAdapter.getDefaultAdapter().getRemoteDevice(DEVICE_ADDRESS);
+        ScanResult result = new ScanResult(device, TestUtils.parseScanRecord(SCAN_RECORD), RSSI,
+                TIMESTAMP_NANOS);
+        Parcel parcel = Parcel.obtain();
+        result.writeToParcel(parcel, 0);
+        // Need to reset parcel data position to the beginning.
+        parcel.setDataPosition(0);
+        ScanResult resultFromParcel = ScanResult.CREATOR.createFromParcel(parcel);
+
+        assertEquals(RSSI, resultFromParcel.getRssi());
+        assertEquals(TIMESTAMP_NANOS, resultFromParcel.getTimestampNanos());
+        assertEquals(device, resultFromParcel.getDevice());
+        TestUtils.assertArrayEquals(SCAN_RECORD, resultFromParcel.getScanRecord().getBytes());
+    }
+
+    @SmallTest
+    public void testDescribeContents() {
+        BluetoothDevice device =
+                BluetoothAdapter.getDefaultAdapter().getRemoteDevice(DEVICE_ADDRESS);
+        ScanResult result = new ScanResult(device, TestUtils.parseScanRecord(SCAN_RECORD), RSSI,
+                TIMESTAMP_NANOS);
+        assertEquals(0, result.describeContents());
+    }
+}
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/ScanSettingsTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanSettingsTest.java
new file mode 100644
index 0000000..7033c3c
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/ScanSettingsTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2015 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.bluetooth.cts;
+
+import android.bluetooth.le.ScanSettings;
+import android.os.Parcel;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Test for Bluetooth LE {@link ScanSettings}.
+ */
+public class ScanSettingsTest extends AndroidTestCase {
+
+    @SmallTest
+    public void testDefaultSettings() {
+        ScanSettings settings = new ScanSettings.Builder().build();
+        assertEquals(ScanSettings.CALLBACK_TYPE_ALL_MATCHES, settings.getCallbackType());
+        assertEquals(ScanSettings.SCAN_MODE_LOW_POWER, settings.getScanMode());
+        assertEquals(0, settings.getScanResultType());
+        assertEquals(0, settings.getReportDelayMillis());
+    }
+
+    @SmallTest
+    public void testDescribeContents() {
+        ScanSettings settings = new ScanSettings.Builder().build();
+        assertEquals(0, settings.describeContents());
+    }
+
+    @SmallTest
+    public void testReadWriteParcel() {
+        final long reportDelayMillis = 60 * 1000;
+        Parcel parcel = Parcel.obtain();
+        ScanSettings settings = new ScanSettings.Builder()
+                .setReportDelay(reportDelayMillis)
+                .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
+                .setMatchMode(ScanSettings.MATCH_MODE_AGGRESSIVE)
+                .setNumOfMatches(ScanSettings.MATCH_NUM_MAX_ADVERTISEMENT)
+                .build();
+        settings.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        ScanSettings settingsFromParcel = ScanSettings.CREATOR.createFromParcel(parcel);
+        assertEquals(reportDelayMillis, settingsFromParcel.getReportDelayMillis());
+        assertEquals(ScanSettings.SCAN_MODE_LOW_LATENCY, settings.getScanMode());
+    }
+}
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/TestUtils.java b/tests/tests/bluetooth/src/android/bluetooth/cts/TestUtils.java
new file mode 100644
index 0000000..7c5db9e
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/TestUtils.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2015 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.bluetooth.cts;
+
+import android.bluetooth.le.ScanRecord;
+
+import junit.framework.Assert;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+
+/**
+ * Utility class for Bluetooth CTS test.
+ */
+class TestUtils {
+
+    /**
+     * Utility method to call hidden ScanRecord.parseFromBytes method.
+     */
+    static ScanRecord parseScanRecord(byte[] bytes) {
+        Class<?> scanRecordClass = ScanRecord.class;
+        try {
+            Method method = scanRecordClass.getDeclaredMethod("parseFromBytes", byte[].class);
+            return (ScanRecord)method.invoke(null, bytes);
+        } catch (NoSuchMethodException | IllegalAccessException | IllegalArgumentException
+                | InvocationTargetException e) {
+            return null;
+        }
+    }
+
+    // Assert two byte arrays are equal.
+    static void assertArrayEquals(byte[] expected, byte[] actual) {
+        if (!Arrays.equals(expected, actual)) {
+            Assert.fail("expected:<" + Arrays.toString(expected) +
+                    "> but was:<" + Arrays.toString(actual) + ">");
+        }
+    }
+}
diff --git a/tests/tests/calllog/Android.mk b/tests/tests/calllog/Android.mk
new file mode 100644
index 0000000..6a7e96a
--- /dev/null
+++ b/tests/tests/calllog/Android.mk
@@ -0,0 +1,35 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_PACKAGE_NAME := CtsCallLogTestCases
+
+# Don't include this package in any target.
+LOCAL_MODULE_TAGS := optional
+
+# When built, explicitly put it in the data partition.
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+
+LOCAL_JAVA_LIBRARIES := bouncycastle
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/calllog/AndroidManifest.xml b/tests/tests/calllog/AndroidManifest.xml
new file mode 100644
index 0000000..50fe115
--- /dev/null
+++ b/tests/tests/calllog/AndroidManifest.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.calllog">
+    <uses-sdk android:minSdkVersion="21" />
+
+    <uses-permission android:name="android.permission.READ_CALL_LOG" />
+    <uses-permission android:name="android.permission.WRITE_CALL_LOG" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.INTERNET" />
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="com.android.cts.calllog"
+                     android:label="CTS tests for android.calllog package">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+</manifest>
+
diff --git a/tests/tests/calllog/src/android/calllog/cts/CallLogBackupTest.java b/tests/tests/calllog/src/android/calllog/cts/CallLogBackupTest.java
new file mode 100644
index 0000000..5b0e0c7
--- /dev/null
+++ b/tests/tests/calllog/src/android/calllog/cts/CallLogBackupTest.java
@@ -0,0 +1,267 @@
+/*
+ * Copyright (C) 2015 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.calllog.cts;
+
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.provider.CallLog;
+import android.provider.CallLog.Calls;
+import android.test.InstrumentationTestCase;
+import android.util.Log;
+
+import com.android.org.bouncycastle.util.encoders.Base64;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Verifies the behavior of CallLogBackup.
+ *
+ * This tests three import things:
+ * 1. That call log gets backed up and restored using the standard BackupAgent implementation.
+ *     - To test we create call-log entries back them up, clear the call log, and restore them.
+ *     - We leverage the LocalTransport backup implementation to do this.
+ * 2. The call log backup is implemented by the expected package: {@link #CALLLOG_BACKUP_PACKAGE}.
+ *     - We always trigger the expected package for backup/restore within the tests.
+ * 3. The backup format for call log is as expected so that backup works across android devices
+ *    by different OEMs.
+ *     - We peek into the backup files saved by LocalTransport and verify their binary output is
+ *       as expected.
+ */
+public class CallLogBackupTest extends InstrumentationTestCase {
+    private static final String TAG = "CallLogBackupTest";
+
+    private static final String LOCAL_BACKUP_COMPONENT =
+            "android/com.android.internal.backup.LocalTransport";
+    private static final String CALLLOG_BACKUP_PACKAGE = "com.android.providers.calllogbackup";
+
+    private static final String TEST_NUMBER = "555-1234";
+    private static final int CALL_START_TIME = 0;
+    private static final int CALL_DURATION = 2000;
+    private static final int TIMEOUT_BACKUP = 4000;
+
+    private static final Pattern BMGR_ENABLED_PATTERN = Pattern.compile(
+            "^Backup Manager currently (enabled|disabled)$");
+
+    private static final String[] CALL_LOG_PROJECTION = new String[] {
+        CallLog.Calls._ID,
+        CallLog.Calls.DATE,
+        CallLog.Calls.DURATION,
+        CallLog.Calls.NUMBER,
+        CallLog.Calls.TYPE,
+        CallLog.Calls.COUNTRY_ISO,
+        CallLog.Calls.GEOCODED_LOCATION,
+        CallLog.Calls.NUMBER_PRESENTATION,
+        CallLog.Calls.PHONE_ACCOUNT_COMPONENT_NAME,
+        CallLog.Calls.PHONE_ACCOUNT_ID,
+        CallLog.Calls.DATA_USAGE,
+        CallLog.Calls.FEATURES
+    };
+
+    class Call {
+        int id;
+        long date;
+        long duration;
+        String number;
+        int type;
+        String phoneAccountComponent;
+        String phoneAccountId;
+        int presentation;
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    /**
+     * Test:
+     *   1) Clear the call log
+     *   2) Add a single call
+     *   3) Run backup
+     *   4) clear the call log
+     *   5) Run restore
+     *   6) Verify that we the call from step (2)
+     */
+    public void testSingleCallBackup() throws Exception {
+        // This CTS test depends on the local transport and so if it is not present,
+        // skip the test with success.
+        if (!hasBackupTransport(LOCAL_BACKUP_COMPONENT)) {
+            Log.i(TAG, "skipping calllog tests");
+            return;
+        }
+
+        // Turn on backup and set to the local backup agent.
+        boolean previouslyEnabled = enableBackup(true /* enable */);
+        String oldTransport = setBackupTransport(LOCAL_BACKUP_COMPONENT);
+
+        // Clear the call log
+        Log.i(TAG, "Clearing the call log");
+        clearCallLog();
+
+        // Add a single call and verify it exists
+        Log.i(TAG, "Adding a call");
+        addCall();
+        verifyCall();
+
+        // Run backup for the call log (saves the single call).
+        Log.i(TAG, "Running backup");
+        runBackupFor(CALLLOG_BACKUP_PACKAGE);
+        Thread.sleep(TIMEOUT_BACKUP); // time for backup
+
+        // Clear the call log and verify that it is empty
+        Log.i(TAG, "Clearing the call log");
+        clearCallLog();
+        assertEquals(0, getCalls().size());
+
+        // Restore from the previous backup and verify we have the new call again.
+        Log.i(TAG, "Restoring the single call");
+        runRestoreFor(CALLLOG_BACKUP_PACKAGE);
+        Thread.sleep(TIMEOUT_BACKUP); // time for restore
+
+        verifyCall();
+
+        // Reset backup manager to original state.
+        Log.i(TAG, "Reseting backup");
+        setBackupTransport(oldTransport);
+        enableBackup(previouslyEnabled);
+    }
+
+    private Call verifyCall() {
+        List<Call> calls = getCalls();
+        assertEquals(1, calls.size());
+
+        Call call = calls.get(0);
+        assertEquals(TEST_NUMBER, call.number);
+        assertEquals(CALL_START_TIME, call.date);
+        assertEquals(CALL_DURATION, call.duration);
+        assertEquals(Calls.OUTGOING_TYPE, call.type);
+        return call;
+    }
+
+    private boolean enableBackup(boolean enable) throws Exception {
+        // Check to see the previous state of the backup service
+        boolean previouslyEnabled = false;
+        String output = exec("bmgr enabled");
+        Matcher matcher = BMGR_ENABLED_PATTERN.matcher(output.trim());
+        if (matcher.find()) {
+            previouslyEnabled = "enabled".equals(matcher.group(1));
+        } else {
+            throw new RuntimeException("Backup output format changed.  No longer matches"
+                    + " expected regex: " + BMGR_ENABLED_PATTERN + "\nactual: '" + output + "'");
+        }
+
+        exec("bmgr enable " + enable);
+        return previouslyEnabled;
+    }
+
+    private void runBackupFor(String packageName) throws Exception {
+        exec("bmgr backup " + packageName);
+        exec("bmgr run");
+    }
+
+    private void runRestoreFor(String packageName) throws Exception {
+        exec("bmgr restore " + packageName);
+    }
+
+    private String setBackupTransport(String transport) throws Exception {
+        String output = exec("bmgr transport " + transport);
+        Pattern pattern = Pattern.compile("\\(formerly (.*)\\)$");
+        Matcher matcher = pattern.matcher(output);
+        if (matcher.find()) {
+            return matcher.group(1);
+        } else {
+            throw new Exception("non-parsable output setting bmgr transport: " + output);
+        }
+    }
+
+    /**
+     * Checks the list of supported transports and verifies that the specified transport
+     * is included.
+     */
+    private boolean hasBackupTransport(String transport) throws Exception {
+        String output = exec("bmgr list transports");
+        for (String t : output.split(" ")) {
+            if ("*".equals(t)) {
+                // skip the current selection marker.
+                continue;
+            } else if (Objects.equals(transport, t)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void clearCallLog() {
+        ContentResolver resolver = getContext().getContentResolver();
+        resolver.delete(Calls.CONTENT_URI, null, null);
+    }
+
+    private void addCall() {
+        ContentValues values = new ContentValues(6);
+        values.put(Calls.NUMBER, TEST_NUMBER);
+        values.put(Calls.NUMBER_PRESENTATION, Calls.PRESENTATION_ALLOWED);
+        values.put(Calls.TYPE, Integer.valueOf(Calls.OUTGOING_TYPE));
+        values.put(Calls.DATE, Long.valueOf(CALL_START_TIME));
+        values.put(Calls.DURATION, Long.valueOf(CALL_DURATION));
+        values.put(Calls.NEW, Integer.valueOf(1));
+
+        getContext().getContentResolver().insert(Calls.CONTENT_URI, values);
+    }
+
+    private List<Call> getCalls() {
+        List<Call> calls = new LinkedList<>();
+
+        ContentResolver resolver = getContext().getContentResolver();
+        Cursor cursor = resolver.query(Calls.CONTENT_URI, CALL_LOG_PROJECTION, null, null, null);
+        if (cursor != null) {
+            try {
+                while (cursor.moveToNext()) {
+                    Call call = new Call();
+                    call.id = cursor.getInt(cursor.getColumnIndex(Calls._ID));
+                    call.number = cursor.getString(cursor.getColumnIndex(Calls.NUMBER));
+                    call.date = cursor.getLong(cursor.getColumnIndex(Calls.DATE));
+                    call.duration = cursor.getLong(cursor.getColumnIndex(Calls.DURATION));
+                    call.type = cursor.getInt(cursor.getColumnIndex(Calls.TYPE));
+                    call.phoneAccountComponent = cursor.getString(
+                            cursor.getColumnIndex(Calls.PHONE_ACCOUNT_COMPONENT_NAME));
+                    call.phoneAccountId = cursor.getString(
+                            cursor.getColumnIndex(Calls.PHONE_ACCOUNT_ID));
+                    call.presentation = cursor.getInt(
+                            cursor.getColumnIndex(Calls.NUMBER_PRESENTATION));
+                    calls.add(call);
+                }
+            } finally {
+                cursor.close();
+            }
+        }
+        return calls;
+    }
+
+    private Context getContext() {
+        return getInstrumentation().getContext();
+    }
+
+    private String exec(String command) throws Exception {
+        return TestUtils.executeShellCommand(getInstrumentation(), command);
+    }
+}
diff --git a/tests/tests/calllog/src/android/calllog/cts/TestUtils.java b/tests/tests/calllog/src/android/calllog/cts/TestUtils.java
new file mode 100644
index 0000000..d2c57a5
--- /dev/null
+++ b/tests/tests/calllog/src/android/calllog/cts/TestUtils.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2015 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.calllog.cts;
+
+import android.app.Instrumentation;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Build;
+import android.os.ParcelFileDescriptor;
+import android.telecom.PhoneAccountHandle;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+
+public class TestUtils {
+    /**
+     * Executes the given shell command and returns the output in a string. Note that even
+     * if we don't care about the output, we have to read the stream completely to make the
+     * command execute.
+     */
+    public static String executeShellCommand(Instrumentation instrumentation,
+            String command) throws Exception {
+        BufferedReader br = null;
+        try (InputStream in = executeStreamedShellCommand(instrumentation, command)) {
+            br = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
+            String str = null;
+            StringBuilder out = new StringBuilder();
+            while ((str = br.readLine()) != null) {
+                out.append(str);
+            }
+            return out.toString();
+        } finally {
+            if (br != null) {
+                closeQuietly(br);
+            }
+        }
+    }
+
+    public static FileInputStream executeStreamedShellCommand(Instrumentation instrumentation,
+            String command) throws Exception {
+        final ParcelFileDescriptor pfd =
+                instrumentation.getUiAutomation().executeShellCommand(command);
+        return new FileInputStream(pfd.getFileDescriptor());
+    }
+
+    private static void closeQuietly(AutoCloseable closeable) {
+        if (closeable != null) {
+            try {
+                closeable.close();
+            } catch (RuntimeException rethrown) {
+                throw rethrown;
+            } catch (Exception ignored) {
+            }
+        }
+    }
+}
diff --git a/tests/tests/content/AndroidManifest.xml b/tests/tests/content/AndroidManifest.xml
index d54bc02..a20befb 100644
--- a/tests/tests/content/AndroidManifest.xml
+++ b/tests/tests/content/AndroidManifest.xml
@@ -39,7 +39,16 @@
                     android:label="Test Tree"/>
 
     <!-- Used for PackageManager test, don't delete this permission-group -->
-    <permission-group android:name="android.permission-group.COST_MONEY"/>
+    <permission-group android:name="android.permission-group.COST_MONEY"
+            android:label="@string/permlab_costMoney"
+            android:description="@string/permdesc_costMoney"/>
+
+    <permission android:name="com.android.cts.content.CALL_ABROAD_PERMISSION"
+                android:label="@string/permlab_callAbroad"
+                android:description="@string/permdesc_callAbroad"
+                android:protectionLevel="normal"
+                android:permissionGroup="android.permission-group.COST_MONEY" />
+
     <!-- Used for PackageManager test, don't delete! -->
     <uses-configuration/>
     <uses-feature android:name="android.hardware.camera" />
diff --git a/tests/tests/content/res/color/color2.xml b/tests/tests/content/res/color/color2.xml
new file mode 100644
index 0000000..154325f
--- /dev/null
+++ b/tests/tests/content/res/color/color2.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 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
+  -->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_focused="true" android:color="?attr/testcolor3"/>
+    <item android:color="?attr/testcolor4"/>
+</selector>
diff --git a/tests/tests/content/res/values-land/styles.xml b/tests/tests/content/res/values-land/styles.xml
new file mode 100644
index 0000000..7717f10
--- /dev/null
+++ b/tests/tests/content/res/values-land/styles.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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>
+    <style name="Theme_OrientationDependent">
+        <item name="themeDimension">111px</item>
+    </style>
+</resources>
diff --git a/tests/tests/content/res/values-ldltr/styles.xml b/tests/tests/content/res/values-ldltr/styles.xml
new file mode 100644
index 0000000..063fc4f
--- /dev/null
+++ b/tests/tests/content/res/values-ldltr/styles.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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>
+    <style name="Theme_LayoutDirectionDependent">
+        <item name="themeInteger">111</item>
+    </style>
+    <style name="Theme_LayoutIsRTL">
+        <item name="themeBoolean">false</item>
+    </style>
+</resources>
diff --git a/tests/tests/content/res/values-ldrtl/styles.xml b/tests/tests/content/res/values-ldrtl/styles.xml
new file mode 100644
index 0000000..c586192
--- /dev/null
+++ b/tests/tests/content/res/values-ldrtl/styles.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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>
+    <style name="Theme_LayoutIsRTL">
+        <item name="themeBoolean">true</item>
+    </style>
+</resources>
diff --git a/tests/tests/content/res/values-v23/strings.xml b/tests/tests/content/res/values-v23/strings.xml
new file mode 100644
index 0000000..4ed1aaa
--- /dev/null
+++ b/tests/tests/content/res/values-v23/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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">
+   <string name="version_cur">v23cur</string>
+</resources>
diff --git a/tests/tests/content/res/values/attrs.xml b/tests/tests/content/res/values/attrs.xml
index 4c3d9db..ac88ef6 100644
--- a/tests/tests/content/res/values/attrs.xml
+++ b/tests/tests/content/res/values/attrs.xml
@@ -125,6 +125,9 @@
         <attr name="textColorHint"/>
         <attr name="textColorLink"/>
     </declare-styleable>
+    <!-- colors referred by theme. -->
+    <attr name="testcolor3" format="color"/>
+    <attr name="testcolor4" format="color"/>
     <!-- Integer used to uniquely identify theme overrides. -->
     <attr name="themeType" format="integer"/>
     <!-- Theme reference used to override parent theme. -->
diff --git a/tests/tests/content/res/values/strings.xml b/tests/tests/content/res/values/strings.xml
index c167278..8ffb477 100644
--- a/tests/tests/content/res/values/strings.xml
+++ b/tests/tests/content/res/values/strings.xml
@@ -176,4 +176,10 @@
 text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
 I think so, so how about double this string, like copy and paste! </string>
     <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
+
+    <string name="permlab_costMoney">Cost money</string>
+    <string name="permdesc_costMoney">Do things that can cost you money.</string>
+    <string name="permlab_callAbroad">Call abroad</string>
+    <string name="permdesc_callAbroad">Make calls abroad</string>
+
 </resources>
diff --git a/tests/tests/content/res/values/styles.xml b/tests/tests/content/res/values/styles.xml
index 20c80f8..b27968d 100644
--- a/tests/tests/content/res/values/styles.xml
+++ b/tests/tests/content/res/values/styles.xml
@@ -136,6 +136,8 @@
         <item name="android:windowNoTitle">true</item>
         <item name="android:panelColorForeground">#ff000000</item>
         <item name="android:panelColorBackground">#ffffffff</item>
+        <item name="testcolor3">#ffff0000</item>
+        <item name="testcolor4">#ffffff00</item>
     </style>
 
     <style name="Theme_OverrideOuter">
@@ -169,4 +171,11 @@
         <item name="android:windowSwipeToDismiss">false</item>
     </style>
 
+    <style name="Theme_LayoutDirectionDependent">
+        <item name="themeInteger">999</item>
+    </style>
+
+    <style name="Theme_OrientationDependent">
+        <item name="themeDimension">999px</item>
+    </style>
 </resources>
diff --git a/tests/tests/content/src/android/content/cts/ContentProviderTest.java b/tests/tests/content/src/android/content/cts/ContentProviderTest.java
index 0b4d9aa..5fee379 100644
--- a/tests/tests/content/src/android/content/cts/ContentProviderTest.java
+++ b/tests/tests/content/src/android/content/cts/ContentProviderTest.java
@@ -71,7 +71,7 @@
 
         ProviderInfo info1 = new ProviderInfo();
         info1.readPermission = "android.permission.READ_SMS";
-        info1.writePermission = "android.permission.WRITE_SMS";
+        info1.writePermission = null; // Guarded by an app op not a permission.
         mockContentProvider.attachInfo(getContext(), info1);
         assertSame(getContext(), mockContentProvider.getContext());
         assertEquals(info1.readPermission, mockContentProvider.getReadPermission());
@@ -156,10 +156,6 @@
         mockContentProvider.setWritePermissionWrapper(expected);
         assertEquals(expected, mockContentProvider.getWritePermission());
 
-        expected = "android.permission.WRITE_SMS";
-        mockContentProvider.setWritePermissionWrapper(expected);
-        assertEquals(expected, mockContentProvider.getWritePermission());
-
         mockContentProvider.setWritePermissionWrapper(null);
         assertNull(mockContentProvider.getWritePermission());
     }
diff --git a/tests/tests/content/src/android/content/cts/ContentResolverTest.java b/tests/tests/content/src/android/content/cts/ContentResolverTest.java
index 4176da3..628f956 100644
--- a/tests/tests/content/src/android/content/cts/ContentResolverTest.java
+++ b/tests/tests/content/src/android/content/cts/ContentResolverTest.java
@@ -58,6 +58,11 @@
     private static final Uri SELF_URI = Uri.parse("content://" + AUTHORITY + "/self/");
     private static final Uri CRASH_URI = Uri.parse("content://" + AUTHORITY + "/crash/");
 
+    private static final Uri LEVEL1_URI = Uri.parse("content://" + AUTHORITY + "/level/");
+    private static final Uri LEVEL2_URI = Uri.parse("content://" + AUTHORITY + "/level/child");
+    private static final Uri LEVEL3_URI = Uri.parse("content://" + AUTHORITY
+            + "/level/child/grandchild/");
+
     private static final String REMOTE_AUTHORITY = "remotectstest";
     private static final Uri REMOTE_TABLE1_URI = Uri.parse("content://"
                 + REMOTE_AUTHORITY + "/testtable1/");
@@ -88,7 +93,7 @@
         mContext = getContext();
         mContentResolver = mContext.getContentResolver();
 
-        android.provider.Settings.System.putInt(mContentResolver, "__cts_crash_on_launch", 0);
+        MockContentProvider.setCrashOnLaunch(mContext, false);
 
         // add three rows to database when every test case start.
         ContentValues values = new ContentValues();
@@ -151,13 +156,12 @@
             fail("Content provider process is not gone!");
         }
         try {
-            android.provider.Settings.System.putInt(mContentResolver, "__cts_crash_on_launch", 1);
+            MockContentProvider.setCrashOnLaunch(mContext, true);
             String type1 = mContentResolver.getType(REMOTE_TABLE1_URI);
-            assertEquals(android.provider.Settings.System.getInt(mContentResolver,
-                "__cts_crash_on_launch", 0), 0);
+            assertFalse(MockContentProvider.getCrashOnLaunch(mContext));
             assertTrue(type1.startsWith(ContentResolver.CURSOR_DIR_BASE_TYPE, 0));
         } finally {
-            android.provider.Settings.System.putInt(mContentResolver, "__cts_crash_on_launch", 0);
+            MockContentProvider.setCrashOnLaunch(mContext, false);
         }
     }
 
@@ -352,12 +356,11 @@
 
     public void testCrashingQuery() {
         try {
-            android.provider.Settings.System.putInt(mContentResolver, "__cts_crash_on_launch", 1);
+            MockContentProvider.setCrashOnLaunch(mContext, true);
             mCursor = mContentResolver.query(REMOTE_CRASH_URI, null, null, null, null);
-            assertEquals(android.provider.Settings.System.getInt(mContentResolver,
-                "__cts_crash_on_launch", 0), 0);
+            assertFalse(MockContentProvider.getCrashOnLaunch(mContext));
         } finally {
-            android.provider.Settings.System.putInt(mContentResolver, "__cts_crash_on_launch", 0);
+            MockContentProvider.setCrashOnLaunch(mContext, false);
         }
 
         assertNotNull(mCursor);
@@ -570,16 +573,15 @@
     public void testCrashingOpenAssetFileDescriptor() throws IOException {
         AssetFileDescriptor afd = null;
         try {
-            android.provider.Settings.System.putInt(mContentResolver, "__cts_crash_on_launch", 1);
+            MockContentProvider.setCrashOnLaunch(mContext, true);
             afd = mContentResolver.openAssetFileDescriptor(REMOTE_CRASH_URI, "rw");
-            assertEquals(android.provider.Settings.System.getInt(mContentResolver,
-                    "__cts_crash_on_launch", 0), 0);
+            assertFalse(MockContentProvider.getCrashOnLaunch(mContext));
             assertNotNull(afd);
             String str = consumeAssetFileDescriptor(afd);
             afd = null;
             assertEquals(str, "This is the openAssetFile test data!");
         } finally {
-            android.provider.Settings.System.putInt(mContentResolver, "__cts_crash_on_launch", 0);
+            MockContentProvider.setCrashOnLaunch(mContext, false);
             if (afd != null) {
                 afd.close();
             }
@@ -602,17 +604,16 @@
     public void testCrashingOpenTypedAssetFileDescriptor() throws IOException {
         AssetFileDescriptor afd = null;
         try {
-            android.provider.Settings.System.putInt(mContentResolver, "__cts_crash_on_launch", 1);
+            MockContentProvider.setCrashOnLaunch(mContext, true);
             afd = mContentResolver.openTypedAssetFileDescriptor(
                     REMOTE_CRASH_URI, "text/plain", null);
-            assertEquals(android.provider.Settings.System.getInt(mContentResolver,
-                    "__cts_crash_on_launch", 0), 0);
+            assertFalse(MockContentProvider.getCrashOnLaunch(mContext));
             assertNotNull(afd);
             String str = consumeAssetFileDescriptor(afd);
             afd = null;
             assertEquals(str, "This is the openTypedAssetFile test data!");
         } finally {
-            android.provider.Settings.System.putInt(mContentResolver, "__cts_crash_on_launch", 0);
+            MockContentProvider.setCrashOnLaunch(mContext, false);
             if (afd != null) {
                 afd.close();
             }
@@ -957,6 +958,53 @@
         }
     }
 
+    public void testRegisterContentObserverDescendantBehavior() throws Exception {
+        final MockContentObserver mco1 = new MockContentObserver();
+        final MockContentObserver mco2 = new MockContentObserver();
+
+        // Register one content observer with notifyDescendants set to false, and
+        // another with true.
+        mContentResolver.registerContentObserver(LEVEL2_URI, false, mco1);
+        mContentResolver.registerContentObserver(LEVEL2_URI, true, mco2);
+
+        // Initially nothing has happened.
+        assertFalse(mco1.hadOnChanged());
+        assertFalse(mco2.hadOnChanged());
+
+        // Fire a change with the exact URI.
+        // Should signal both observers due to exact match, notifyDescendants doesn't matter.
+        mContentResolver.notifyChange(LEVEL2_URI, null);
+        Thread.sleep(200);
+        assertTrue(mco1.hadOnChanged());
+        assertTrue(mco2.hadOnChanged());
+        mco1.reset();
+        mco2.reset();
+
+        // Fire a change with a descendant URI.
+        // Should only signal observer with notifyDescendants set to true.
+        mContentResolver.notifyChange(LEVEL3_URI, null);
+        Thread.sleep(200);
+        assertFalse(mco1.hadOnChanged());
+        assertTrue(mco2.hadOnChanged());
+        mco2.reset();
+
+        // Fire a change with an ancestor URI.
+        // Should signal both observers due to ancestry, notifyDescendants doesn't matter.
+        mContentResolver.notifyChange(LEVEL1_URI, null);
+        Thread.sleep(200);
+        assertTrue(mco1.hadOnChanged());
+        assertTrue(mco2.hadOnChanged());
+        mco1.reset();
+        mco2.reset();
+
+        // Fire a change with an unrelated URI.
+        // Should signal neither observer.
+        mContentResolver.notifyChange(TABLE1_URI, null);
+        Thread.sleep(200);
+        assertFalse(mco1.hadOnChanged());
+        assertFalse(mco2.hadOnChanged());
+    }
+
     public void testNotifyChange1() {
         final MockContentObserver mco = new MockContentObserver();
 
diff --git a/tests/tests/content/src/android/content/cts/ContextTest.java b/tests/tests/content/src/android/content/cts/ContextTest.java
index 7c5dc50..d77c1b1 100644
--- a/tests/tests/content/src/android/content/cts/ContextTest.java
+++ b/tests/tests/content/src/android/content/cts/ContextTest.java
@@ -17,19 +17,20 @@
 package android.content.cts;
 
 import com.android.cts.content.R;
-import com.android.internal.util.XmlUtils;
-
 
 import org.xmlpull.v1.XmlPullParserException;
 
 import android.content.Context;
-import android.content.res.TypedArray;
-import android.content.res.XmlResourceParser;
+import android.content.cts.util.XmlUtils;
+import android.content.res.ColorStateList;
 import android.content.res.Resources.NotFoundException;
 import android.content.res.Resources.Theme;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
 import android.test.AndroidTestCase;
 import android.util.AttributeSet;
 import android.util.Xml;
+import android.view.WindowManager;
 
 import java.io.IOException;
 
@@ -155,6 +156,50 @@
         testTypedArray.recycle();
     }
 
+    public void testGetSystemService() {
+        // Test invalid service name
+        assertNull(mContext.getSystemService("invalid"));
+
+        // Test valid service name
+        assertNotNull(mContext.getSystemService(Context.WINDOW_SERVICE));
+    }
+
+    public void testGetSystemServiceByClass() {
+        // Test invalid service class
+        assertNull(mContext.getSystemService(Object.class));
+
+        // Test valid service name
+        assertNotNull(mContext.getSystemService(WindowManager.class));
+        assertEquals(mContext.getSystemService(Context.WINDOW_SERVICE),
+                mContext.getSystemService(WindowManager.class));
+    }
+
+    public void testGetColorStateList() {
+        try {
+            mContext.getColorStateList(0);
+            fail("Failed at testGetColorStateList");
+        } catch (NotFoundException e) {
+            //expected
+        }
+
+        final ColorStateList colorStateList = mContext.getColorStateList(R.color.color2);
+        final int[] focusedState = {android.R.attr.state_focused};
+        final int focusColor = colorStateList.getColorForState(focusedState, R.color.failColor);
+        assertEquals(0xffff0000, focusColor);
+    }
+
+    public void testGetColor() {
+        try {
+            mContext.getColor(0);
+            fail("Failed at testGetColor");
+        } catch (NotFoundException e) {
+            //expected
+        }
+
+        final int color = mContext.getColor(R.color.color2);
+        assertEquals(0xffffff00, color);
+    }
+
     private AttributeSet getAttributeSet(int resourceId) {
         final XmlResourceParser parser = getContext().getResources().getXml(
                 resourceId);
diff --git a/tests/tests/content/src/android/content/cts/ContextWrapperTest.java b/tests/tests/content/src/android/content/cts/ContextWrapperTest.java
index 62fc83a..672d3ed 100644
--- a/tests/tests/content/src/android/content/cts/ContextWrapperTest.java
+++ b/tests/tests/content/src/android/content/cts/ContextWrapperTest.java
@@ -18,7 +18,6 @@
 
 import com.android.cts.content.R;
 
-
 import android.content.ActivityNotFoundException;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
@@ -44,6 +43,7 @@
 import android.os.IBinder;
 import android.preference.PreferenceManager;
 import android.test.AndroidTestCase;
+import android.view.WindowManager;
 
 import java.io.File;
 import java.io.IOException;
@@ -718,6 +718,16 @@
         assertNotNull(mContextWrapper.getSystemService(Context.WINDOW_SERVICE));
     }
 
+    public void testGetSystemServiceByClass() {
+        // Test invalid service class
+        assertNull(mContextWrapper.getSystemService(Object.class));
+
+        // Test valid service name
+        assertNotNull(mContextWrapper.getSystemService(WindowManager.class));
+        assertEquals(mContextWrapper.getSystemService(Context.WINDOW_SERVICE),
+                mContextWrapper.getSystemService(WindowManager.class));
+    }
+
     public void testGetAssets() {
         assertSame(mContext.getAssets(), mContextWrapper.getAssets());
     }
diff --git a/tests/tests/content/src/android/content/cts/IntentTest.java b/tests/tests/content/src/android/content/cts/IntentTest.java
index 0f9a5cc..677b31f 100644
--- a/tests/tests/content/src/android/content/cts/IntentTest.java
+++ b/tests/tests/content/src/android/content/cts/IntentTest.java
@@ -16,9 +16,6 @@
 
 package android.content.cts;
 
-import com.android.internal.app.ResolverActivity;
-import com.android.internal.util.XmlUtils;
-
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -26,6 +23,7 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.cts.util.XmlUtils;
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
@@ -38,7 +36,6 @@
 import android.provider.Contacts.People;
 import android.test.AndroidTestCase;
 import android.util.AttributeSet;
-import android.util.Log;
 import android.util.Xml;
 
 import java.io.IOException;
diff --git a/tests/tests/content/src/android/content/cts/MockContentProvider.java b/tests/tests/content/src/android/content/cts/MockContentProvider.java
index de82c0d..bddc82d 100644
--- a/tests/tests/content/src/android/content/cts/MockContentProvider.java
+++ b/tests/tests/content/src/android/content/cts/MockContentProvider.java
@@ -16,6 +16,7 @@
 
 package android.content.cts;
 
+import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -28,6 +29,7 @@
 import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
+import android.content.SharedPreferences;
 import android.content.UriMatcher;
 import android.content.ContentProvider.PipeDataWriter;
 import android.content.res.AssetFileDescriptor;
@@ -122,15 +124,7 @@
     @Override
     public boolean onCreate() {
         mOpenHelper = new DatabaseHelper(getContext(), mDbName);
-        if (android.provider.Settings.System.getInt(getContext().getContentResolver(),
-                "__cts_crash_on_launch", 0) != 0) {
-            // The test case wants us to crash our process on first launch.
-            // Well, okay then!
-            Log.i("MockContentProvider", "TEST IS CRASHING SELF, CROSS FINGERS!");
-            android.provider.Settings.System.putInt(getContext().getContentResolver(),
-                    "__cts_crash_on_launch", 0);
-            android.os.Process.killProcess(android.os.Process.myPid());
-        }
+        crashOnLaunchIfNeeded();
         return true;
     }
 
@@ -277,15 +271,7 @@
             break;
 
         case CRASH_ID:
-            if (android.provider.Settings.System.getInt(getContext().getContentResolver(),
-                    "__cts_crash_on_launch", 0) != 0) {
-                // The test case wants us to crash while querying.
-                // Well, okay then!
-                Log.i("MockContentProvider", "TEST IS CRASHING SELF, CROSS FINGERS!");
-                android.provider.Settings.System.putInt(getContext().getContentResolver(),
-                        "__cts_crash_on_launch", 0);
-                android.os.Process.killProcess(android.os.Process.myPid());
-            }
+            crashOnLaunchIfNeeded();
             qb.setTables("TestTable1");
             qb.setProjectionMap(CTSDBTABLE1_LIST_PROJECTION_MAP);
             break;
@@ -351,15 +337,7 @@
     public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException {
         switch (URL_MATCHER.match(uri)) {
             case CRASH_ID:
-                if (android.provider.Settings.System.getInt(getContext().getContentResolver(),
-                        "__cts_crash_on_launch", 0) != 0) {
-                    // The test case wants us to crash while querying.
-                    // Well, okay then!
-                    Log.i("MockContentProvider", "TEST IS CRASHING SELF, CROSS FINGERS!");
-                    android.provider.Settings.System.putInt(getContext().getContentResolver(),
-                            "__cts_crash_on_launch", 0);
-                    android.os.Process.killProcess(android.os.Process.myPid());
-                }
+                crashOnLaunchIfNeeded();
                 return new AssetFileDescriptor(
                         openPipeHelper(uri, null, null,
                                 "This is the openAssetFile test data!", this), 0,
@@ -375,15 +353,7 @@
             throws FileNotFoundException {
         switch (URL_MATCHER.match(uri)) {
             case CRASH_ID:
-                if (android.provider.Settings.System.getInt(getContext().getContentResolver(),
-                        "__cts_crash_on_launch", 0) != 0) {
-                    // The test case wants us to crash while querying.
-                    // Well, okay then!
-                    Log.i("MockContentProvider", "TEST IS CRASHING SELF, CROSS FINGERS!");
-                    android.provider.Settings.System.putInt(getContext().getContentResolver(),
-                            "__cts_crash_on_launch", 0);
-                    android.os.Process.killProcess(android.os.Process.myPid());
-                }
+                crashOnLaunchIfNeeded();
                 return new AssetFileDescriptor(
                         openPipeHelper(uri, null, null,
                                 "This is the openTypedAssetFile test data!", this), 0,
@@ -414,4 +384,36 @@
             }
         }
     }
+
+    private void crashOnLaunchIfNeeded() {
+        if (getCrashOnLaunch(getContext())) {
+            // The test case wants us to crash our process on first launch.
+            // Well, okay then!
+            Log.i("MockContentProvider", "TEST IS CRASHING SELF, CROSS FINGERS!");
+            setCrashOnLaunch(getContext(), false);
+            android.os.Process.killProcess(android.os.Process.myPid());
+        }
+    }
+
+    public static boolean getCrashOnLaunch(Context context) {
+        File file = getCrashOnLaunchFile(context);
+        return file.exists();
+    }
+
+    public static void setCrashOnLaunch(Context context, boolean value) {
+        File file = getCrashOnLaunchFile(context);
+        if (value) {
+            try {
+                file.createNewFile();
+            } catch (IOException ex) {
+                throw new RuntimeException("Could not create crash on launch file.", ex);
+            }
+        } else {
+            file.delete();
+        }
+    }
+
+    private static File getCrashOnLaunchFile(Context context) {
+        return context.getFileStreamPath("MockContentProvider.crashonlaunch");
+    }
 }
diff --git a/tests/tests/content/src/android/content/cts/util/XmlUtils.java b/tests/tests/content/src/android/content/cts/util/XmlUtils.java
new file mode 100644
index 0000000..0354da8
--- /dev/null
+++ b/tests/tests/content/src/android/content/cts/util/XmlUtils.java
@@ -0,0 +1,1694 @@
+/*
+ * Copyright (C) 2006 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.content.cts.util;
+
+import com.android.internal.util.FastXmlSerializer;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
+
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.CompressFormat;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.util.ArrayMap;
+import android.util.Base64;
+import android.util.Xml;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.ProtocolException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/** {@hide} */
+public class XmlUtils {
+
+    public static void skipCurrentTag(XmlPullParser parser)
+            throws XmlPullParserException, IOException {
+        int outerDepth = parser.getDepth();
+        int type;
+        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
+               && (type != XmlPullParser.END_TAG
+                       || parser.getDepth() > outerDepth)) {
+        }
+    }
+
+    public static final int
+    convertValueToList(CharSequence value, String[] options, int defaultValue)
+    {
+        if (null != value) {
+            for (int i = 0; i < options.length; i++) {
+                if (value.equals(options[i]))
+                    return i;
+            }
+        }
+
+        return defaultValue;
+    }
+
+    public static final boolean
+    convertValueToBoolean(CharSequence value, boolean defaultValue)
+    {
+        boolean result = false;
+
+        if (null == value)
+            return defaultValue;
+
+        if (value.equals("1")
+        ||  value.equals("true")
+        ||  value.equals("TRUE"))
+            result = true;
+
+        return result;
+    }
+
+    public static final int
+    convertValueToInt(CharSequence charSeq, int defaultValue)
+    {
+        if (null == charSeq)
+            return defaultValue;
+
+        String nm = charSeq.toString();
+
+        // XXX This code is copied from Integer.decode() so we don't
+        // have to instantiate an Integer!
+
+        int value;
+        int sign = 1;
+        int index = 0;
+        int len = nm.length();
+        int base = 10;
+
+        if ('-' == nm.charAt(0)) {
+            sign = -1;
+            index++;
+        }
+
+        if ('0' == nm.charAt(index)) {
+            //  Quick check for a zero by itself
+            if (index == (len - 1))
+                return 0;
+
+            char    c = nm.charAt(index + 1);
+
+            if ('x' == c || 'X' == c) {
+                index += 2;
+                base = 16;
+            } else {
+                index++;
+                base = 8;
+            }
+        }
+        else if ('#' == nm.charAt(index))
+        {
+            index++;
+            base = 16;
+        }
+
+        return Integer.parseInt(nm.substring(index), base) * sign;
+    }
+
+    public static int convertValueToUnsignedInt(String value, int defaultValue) {
+        if (null == value) {
+            return defaultValue;
+        }
+
+        return parseUnsignedIntAttribute(value);
+    }
+
+    public static int parseUnsignedIntAttribute(CharSequence charSeq) {
+        String  value = charSeq.toString();
+
+        long    bits;
+        int     index = 0;
+        int     len = value.length();
+        int     base = 10;
+
+        if ('0' == value.charAt(index)) {
+            //  Quick check for zero by itself
+            if (index == (len - 1))
+                return 0;
+
+            char    c = value.charAt(index + 1);
+
+            if ('x' == c || 'X' == c) {     //  check for hex
+                index += 2;
+                base = 16;
+            } else {                        //  check for octal
+                index++;
+                base = 8;
+            }
+        } else if ('#' == value.charAt(index)) {
+            index++;
+            base = 16;
+        }
+
+        return (int) Long.parseLong(value.substring(index), base);
+    }
+
+    /**
+     * Flatten a Map into an output stream as XML.  The map can later be
+     * read back with readMapXml().
+     *
+     * @param val The map to be flattened.
+     * @param out Where to write the XML data.
+     *
+     * @see #writeMapXml(Map, String, XmlSerializer)
+     * @see #writeListXml
+     * @see #writeValueXml
+     * @see #readMapXml
+     */
+    public static final void writeMapXml(Map val, OutputStream out)
+            throws XmlPullParserException, IOException {
+        XmlSerializer serializer = new FastXmlSerializer();
+        serializer.setOutput(out, StandardCharsets.UTF_8.name());
+        serializer.startDocument(null, true);
+        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
+        writeMapXml(val, null, serializer);
+        serializer.endDocument();
+    }
+
+    /**
+     * Flatten a List into an output stream as XML.  The list can later be
+     * read back with readListXml().
+     *
+     * @param val The list to be flattened.
+     * @param out Where to write the XML data.
+     *
+     * @see #writeListXml(List, String, XmlSerializer)
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readListXml
+     */
+    public static final void writeListXml(List val, OutputStream out)
+    throws XmlPullParserException, IOException
+    {
+        XmlSerializer serializer = Xml.newSerializer();
+        serializer.setOutput(out, StandardCharsets.UTF_8.name());
+        serializer.startDocument(null, true);
+        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
+        writeListXml(val, null, serializer);
+        serializer.endDocument();
+    }
+
+    /**
+     * Flatten a Map into an XmlSerializer.  The map can later be read back
+     * with readThisMapXml().
+     *
+     * @param val The map to be flattened.
+     * @param name Name attribute to include with this list's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the map into.
+     *
+     * @see #writeMapXml(Map, OutputStream)
+     * @see #writeListXml
+     * @see #writeValueXml
+     * @see #readMapXml
+     */
+    public static final void writeMapXml(Map val, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+        writeMapXml(val, name, out, null);
+    }
+
+    /**
+     * Flatten a Map into an XmlSerializer.  The map can later be read back
+     * with readThisMapXml().
+     *
+     * @param val The map to be flattened.
+     * @param name Name attribute to include with this list's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the map into.
+     * @param callback Method to call when an Object type is not recognized.
+     *
+     * @see #writeMapXml(Map, OutputStream)
+     * @see #writeListXml
+     * @see #writeValueXml
+     * @see #readMapXml
+     *
+     * @hide
+     */
+    public static final void writeMapXml(Map val, String name, XmlSerializer out,
+            WriteMapCallback callback) throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "map");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        writeMapXml(val, out, callback);
+
+        out.endTag(null, "map");
+    }
+
+    /**
+     * Flatten a Map into an XmlSerializer.  The map can later be read back
+     * with readThisMapXml(). This method presumes that the start tag and
+     * name attribute have already been written and does not write an end tag.
+     *
+     * @param val The map to be flattened.
+     * @param out XmlSerializer to write the map into.
+     *
+     * @see #writeMapXml(Map, OutputStream)
+     * @see #writeListXml
+     * @see #writeValueXml
+     * @see #readMapXml
+     *
+     * @hide
+     */
+    public static final void writeMapXml(Map val, XmlSerializer out,
+            WriteMapCallback callback) throws XmlPullParserException, IOException {
+        if (val == null) {
+            return;
+        }
+
+        Set s = val.entrySet();
+        Iterator i = s.iterator();
+
+        while (i.hasNext()) {
+            Map.Entry e = (Map.Entry)i.next();
+            writeValueXml(e.getValue(), (String)e.getKey(), out, callback);
+        }
+    }
+
+    /**
+     * Flatten a List into an XmlSerializer.  The list can later be read back
+     * with readThisListXml().
+     *
+     * @param val The list to be flattened.
+     * @param name Name attribute to include with this list's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the list into.
+     *
+     * @see #writeListXml(List, OutputStream)
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readListXml
+     */
+    public static final void writeListXml(List val, String name, XmlSerializer out)
+    throws XmlPullParserException, IOException
+    {
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "list");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        int N = val.size();
+        int i=0;
+        while (i < N) {
+            writeValueXml(val.get(i), null, out);
+            i++;
+        }
+
+        out.endTag(null, "list");
+    }
+
+    public static final void writeSetXml(Set val, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "set");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        for (Object v : val) {
+            writeValueXml(v, null, out);
+        }
+
+        out.endTag(null, "set");
+    }
+
+    /**
+     * Flatten a byte[] into an XmlSerializer.  The list can later be read back
+     * with readThisByteArrayXml().
+     *
+     * @param val The byte array to be flattened.
+     * @param name Name attribute to include with this array's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the array into.
+     *
+     * @see #writeMapXml
+     * @see #writeValueXml
+     */
+    public static final void writeByteArrayXml(byte[] val, String name,
+            XmlSerializer out)
+            throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "byte-array");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        final int N = val.length;
+        out.attribute(null, "num", Integer.toString(N));
+
+        StringBuilder sb = new StringBuilder(val.length*2);
+        for (int i=0; i<N; i++) {
+            int b = val[i];
+            int h = b>>4;
+            sb.append(h >= 10 ? ('a'+h-10) : ('0'+h));
+            h = b&0xff;
+            sb.append(h >= 10 ? ('a'+h-10) : ('0'+h));
+        }
+
+        out.text(sb.toString());
+
+        out.endTag(null, "byte-array");
+    }
+
+    /**
+     * Flatten an int[] into an XmlSerializer.  The list can later be read back
+     * with readThisIntArrayXml().
+     *
+     * @param val The int array to be flattened.
+     * @param name Name attribute to include with this array's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the array into.
+     *
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readThisIntArrayXml
+     */
+    public static final void writeIntArrayXml(int[] val, String name,
+            XmlSerializer out)
+            throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "int-array");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        final int N = val.length;
+        out.attribute(null, "num", Integer.toString(N));
+
+        for (int i=0; i<N; i++) {
+            out.startTag(null, "item");
+            out.attribute(null, "value", Integer.toString(val[i]));
+            out.endTag(null, "item");
+        }
+
+        out.endTag(null, "int-array");
+    }
+
+    /**
+     * Flatten a long[] into an XmlSerializer.  The list can later be read back
+     * with readThisLongArrayXml().
+     *
+     * @param val The long array to be flattened.
+     * @param name Name attribute to include with this array's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the array into.
+     *
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readThisIntArrayXml
+     */
+    public static final void writeLongArrayXml(long[] val, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "long-array");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        final int N = val.length;
+        out.attribute(null, "num", Integer.toString(N));
+
+        for (int i=0; i<N; i++) {
+            out.startTag(null, "item");
+            out.attribute(null, "value", Long.toString(val[i]));
+            out.endTag(null, "item");
+        }
+
+        out.endTag(null, "long-array");
+    }
+
+    /**
+     * Flatten a double[] into an XmlSerializer.  The list can later be read back
+     * with readThisDoubleArrayXml().
+     *
+     * @param val The double array to be flattened.
+     * @param name Name attribute to include with this array's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the array into.
+     *
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readThisIntArrayXml
+     */
+    public static final void writeDoubleArrayXml(double[] val, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "double-array");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        final int N = val.length;
+        out.attribute(null, "num", Integer.toString(N));
+
+        for (int i=0; i<N; i++) {
+            out.startTag(null, "item");
+            out.attribute(null, "value", Double.toString(val[i]));
+            out.endTag(null, "item");
+        }
+
+        out.endTag(null, "double-array");
+    }
+
+    /**
+     * Flatten a String[] into an XmlSerializer.  The list can later be read back
+     * with readThisStringArrayXml().
+     *
+     * @param val The String array to be flattened.
+     * @param name Name attribute to include with this array's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the array into.
+     *
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readThisIntArrayXml
+     */
+    public static final void writeStringArrayXml(String[] val, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "string-array");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        final int N = val.length;
+        out.attribute(null, "num", Integer.toString(N));
+
+        for (int i=0; i<N; i++) {
+            out.startTag(null, "item");
+            out.attribute(null, "value", val[i]);
+            out.endTag(null, "item");
+        }
+
+        out.endTag(null, "string-array");
+    }
+
+    /**
+     * Flatten a boolean[] into an XmlSerializer.  The list can later be read back
+     * with readThisBooleanArrayXml().
+     *
+     * @param val The boolean array to be flattened.
+     * @param name Name attribute to include with this array's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the array into.
+     *
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readThisIntArrayXml
+     */
+    public static final void writeBooleanArrayXml(boolean[] val, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "boolean-array");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        final int N = val.length;
+        out.attribute(null, "num", Integer.toString(N));
+
+        for (int i=0; i<N; i++) {
+            out.startTag(null, "item");
+            out.attribute(null, "value", Boolean.toString(val[i]));
+            out.endTag(null, "item");
+        }
+
+        out.endTag(null, "boolean-array");
+    }
+
+    /**
+     * Flatten an object's value into an XmlSerializer.  The value can later
+     * be read back with readThisValueXml().
+     *
+     * Currently supported value types are: null, String, Integer, Long,
+     * Float, Double Boolean, Map, List.
+     *
+     * @param v The object to be flattened.
+     * @param name Name attribute to include with this value's tag, or null
+     *             for none.
+     * @param out XmlSerializer to write the object into.
+     *
+     * @see #writeMapXml
+     * @see #writeListXml
+     * @see #readValueXml
+     */
+    public static final void writeValueXml(Object v, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+        writeValueXml(v, name, out, null);
+    }
+
+    /**
+     * Flatten an object's value into an XmlSerializer.  The value can later
+     * be read back with readThisValueXml().
+     *
+     * Currently supported value types are: null, String, Integer, Long,
+     * Float, Double Boolean, Map, List.
+     *
+     * @param v The object to be flattened.
+     * @param name Name attribute to include with this value's tag, or null
+     *             for none.
+     * @param out XmlSerializer to write the object into.
+     * @param callback Handler for Object types not recognized.
+     *
+     * @see #writeMapXml
+     * @see #writeListXml
+     * @see #readValueXml
+     */
+    private static final void writeValueXml(Object v, String name, XmlSerializer out,
+            WriteMapCallback callback)  throws XmlPullParserException, IOException {
+        String typeStr;
+        if (v == null) {
+            out.startTag(null, "null");
+            if (name != null) {
+                out.attribute(null, "name", name);
+            }
+            out.endTag(null, "null");
+            return;
+        } else if (v instanceof String) {
+            out.startTag(null, "string");
+            if (name != null) {
+                out.attribute(null, "name", name);
+            }
+            out.text(v.toString());
+            out.endTag(null, "string");
+            return;
+        } else if (v instanceof Integer) {
+            typeStr = "int";
+        } else if (v instanceof Long) {
+            typeStr = "long";
+        } else if (v instanceof Float) {
+            typeStr = "float";
+        } else if (v instanceof Double) {
+            typeStr = "double";
+        } else if (v instanceof Boolean) {
+            typeStr = "boolean";
+        } else if (v instanceof byte[]) {
+            writeByteArrayXml((byte[])v, name, out);
+            return;
+        } else if (v instanceof int[]) {
+            writeIntArrayXml((int[])v, name, out);
+            return;
+        } else if (v instanceof long[]) {
+            writeLongArrayXml((long[])v, name, out);
+            return;
+        } else if (v instanceof double[]) {
+            writeDoubleArrayXml((double[])v, name, out);
+            return;
+        } else if (v instanceof String[]) {
+            writeStringArrayXml((String[])v, name, out);
+            return;
+        } else if (v instanceof boolean[]) {
+            writeBooleanArrayXml((boolean[])v, name, out);
+            return;
+        } else if (v instanceof Map) {
+            writeMapXml((Map)v, name, out);
+            return;
+        } else if (v instanceof List) {
+            writeListXml((List) v, name, out);
+            return;
+        } else if (v instanceof Set) {
+            writeSetXml((Set) v, name, out);
+            return;
+        } else if (v instanceof CharSequence) {
+            // XXX This is to allow us to at least write something if
+            // we encounter styled text...  but it means we will drop all
+            // of the styling information. :(
+            out.startTag(null, "string");
+            if (name != null) {
+                out.attribute(null, "name", name);
+            }
+            out.text(v.toString());
+            out.endTag(null, "string");
+            return;
+        } else if (callback != null) {
+            callback.writeUnknownObject(v, name, out);
+            return;
+        } else {
+            throw new RuntimeException("writeValueXml: unable to write value " + v);
+        }
+
+        out.startTag(null, typeStr);
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+        out.attribute(null, "value", v.toString());
+        out.endTag(null, typeStr);
+    }
+
+    /**
+     * Read a HashMap from an InputStream containing XML.  The stream can
+     * previously have been written by writeMapXml().
+     *
+     * @param in The InputStream from which to read.
+     *
+     * @return HashMap The resulting map.
+     *
+     * @see #readListXml
+     * @see #readValueXml
+     * @see #readThisMapXml
+     * #see #writeMapXml
+     */
+    @SuppressWarnings("unchecked")
+    public static final HashMap<String, ?> readMapXml(InputStream in)
+    throws XmlPullParserException, IOException
+    {
+        XmlPullParser   parser = Xml.newPullParser();
+        parser.setInput(in, StandardCharsets.UTF_8.name());
+        return (HashMap<String, ?>) readValueXml(parser, new String[1]);
+    }
+
+    /**
+     * Read an ArrayList from an InputStream containing XML.  The stream can
+     * previously have been written by writeListXml().
+     *
+     * @param in The InputStream from which to read.
+     *
+     * @return ArrayList The resulting list.
+     *
+     * @see #readMapXml
+     * @see #readValueXml
+     * @see #readThisListXml
+     * @see #writeListXml
+     */
+    public static final ArrayList readListXml(InputStream in)
+    throws XmlPullParserException, IOException
+    {
+        XmlPullParser   parser = Xml.newPullParser();
+        parser.setInput(in, StandardCharsets.UTF_8.name());
+        return (ArrayList)readValueXml(parser, new String[1]);
+    }
+
+
+    /**
+     * Read a HashSet from an InputStream containing XML. The stream can
+     * previously have been written by writeSetXml().
+     *
+     * @param in The InputStream from which to read.
+     *
+     * @return HashSet The resulting set.
+     *
+     * @throws XmlPullParserException
+     * @throws IOException
+     *
+     * @see #readValueXml
+     * @see #readThisSetXml
+     * @see #writeSetXml
+     */
+    public static final HashSet readSetXml(InputStream in)
+            throws XmlPullParserException, IOException {
+        XmlPullParser parser = Xml.newPullParser();
+        parser.setInput(in, null);
+        return (HashSet) readValueXml(parser, new String[1]);
+    }
+
+    /**
+     * Read a HashMap object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeMapXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the map.
+     *
+     * @param parser The XmlPullParser from which to read the map data.
+     * @param endTag Name of the tag that will end the map, usually "map".
+     * @param name An array of one string, used to return the name attribute
+     *             of the map's tag.
+     *
+     * @return HashMap The newly generated map.
+     *
+     * @see #readMapXml
+     */
+    public static final HashMap<String, ?> readThisMapXml(XmlPullParser parser, String endTag,
+            String[] name) throws XmlPullParserException, IOException {
+        return readThisMapXml(parser, endTag, name, null);
+    }
+
+    /**
+     * Read a HashMap object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeMapXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the map.
+     *
+     * @param parser The XmlPullParser from which to read the map data.
+     * @param endTag Name of the tag that will end the map, usually "map".
+     * @param name An array of one string, used to return the name attribute
+     *             of the map's tag.
+     *
+     * @return HashMap The newly generated map.
+     *
+     * @see #readMapXml
+     * @hide
+     */
+    public static final HashMap<String, ?> readThisMapXml(XmlPullParser parser, String endTag,
+            String[] name, ReadMapCallback callback)
+            throws XmlPullParserException, IOException
+    {
+        HashMap<String, Object> map = new HashMap<String, Object>();
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                Object val = readThisValueXml(parser, name, callback, false);
+                map.put(name[0], val);
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return map;
+                }
+                throw new XmlPullParserException(
+                    "Expected " + endTag + " end tag at: " + parser.getName());
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException(
+            "Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Like {@link #readThisMapXml}, but returns an ArrayMap instead of HashMap.
+     * @hide
+     */
+    public static final ArrayMap<String, ?> readThisArrayMapXml(XmlPullParser parser, String endTag,
+            String[] name, ReadMapCallback callback)
+            throws XmlPullParserException, IOException
+    {
+        ArrayMap<String, Object> map = new ArrayMap<>();
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                Object val = readThisValueXml(parser, name, callback, true);
+                map.put(name[0], val);
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return map;
+                }
+                throw new XmlPullParserException(
+                    "Expected " + endTag + " end tag at: " + parser.getName());
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException(
+            "Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read an ArrayList object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeListXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "list".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return HashMap The newly generated list.
+     *
+     * @see #readListXml
+     */
+    public static final ArrayList readThisListXml(XmlPullParser parser, String endTag,
+            String[] name) throws XmlPullParserException, IOException {
+        return readThisListXml(parser, endTag, name, null, false);
+    }
+
+    /**
+     * Read an ArrayList object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeListXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "list".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return HashMap The newly generated list.
+     *
+     * @see #readListXml
+     */
+    private static final ArrayList readThisListXml(XmlPullParser parser, String endTag,
+            String[] name, ReadMapCallback callback, boolean arrayMap)
+            throws XmlPullParserException, IOException {
+        ArrayList list = new ArrayList();
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                Object val = readThisValueXml(parser, name, callback, arrayMap);
+                list.add(val);
+                //System.out.println("Adding to list: " + val);
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return list;
+                }
+                throw new XmlPullParserException(
+                    "Expected " + endTag + " end tag at: " + parser.getName());
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException(
+            "Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read a HashSet object from an XmlPullParser. The XML data could previously
+     * have been generated by writeSetXml(). The XmlPullParser must be positioned
+     * <em>after</em> the tag that begins the set.
+     *
+     * @param parser The XmlPullParser from which to read the set data.
+     * @param endTag Name of the tag that will end the set, usually "set".
+     * @param name An array of one string, used to return the name attribute
+     *             of the set's tag.
+     *
+     * @return HashSet The newly generated set.
+     *
+     * @throws XmlPullParserException
+     * @throws IOException
+     *
+     * @see #readSetXml
+     */
+    public static final HashSet readThisSetXml(XmlPullParser parser, String endTag, String[] name)
+            throws XmlPullParserException, IOException {
+        return readThisSetXml(parser, endTag, name, null, false);
+    }
+
+    /**
+     * Read a HashSet object from an XmlPullParser. The XML data could previously
+     * have been generated by writeSetXml(). The XmlPullParser must be positioned
+     * <em>after</em> the tag that begins the set.
+     *
+     * @param parser The XmlPullParser from which to read the set data.
+     * @param endTag Name of the tag that will end the set, usually "set".
+     * @param name An array of one string, used to return the name attribute
+     *             of the set's tag.
+     *
+     * @return HashSet The newly generated set.
+     *
+     * @throws XmlPullParserException
+     * @throws IOException
+     *
+     * @see #readSetXml
+     * @hide
+     */
+    private static final HashSet readThisSetXml(XmlPullParser parser, String endTag, String[] name,
+            ReadMapCallback callback, boolean arrayMap)
+            throws XmlPullParserException, IOException {
+        HashSet set = new HashSet();
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                Object val = readThisValueXml(parser, name, callback, arrayMap);
+                set.add(val);
+                //System.out.println("Adding to set: " + val);
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return set;
+                }
+                throw new XmlPullParserException(
+                        "Expected " + endTag + " end tag at: " + parser.getName());
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException(
+                "Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read an int[] object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeIntArrayXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "list".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return Returns a newly generated int[].
+     *
+     * @see #readListXml
+     */
+    public static final int[] readThisIntArrayXml(XmlPullParser parser,
+            String endTag, String[] name)
+            throws XmlPullParserException, IOException {
+
+        int num;
+        try {
+            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
+        } catch (NullPointerException e) {
+            throw new XmlPullParserException(
+                    "Need num attribute in byte-array");
+        } catch (NumberFormatException e) {
+            throw new XmlPullParserException(
+                    "Not a number in num attribute in byte-array");
+        }
+        parser.next();
+
+        int[] array = new int[num];
+        int i = 0;
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                if (parser.getName().equals("item")) {
+                    try {
+                        array[i] = Integer.parseInt(
+                                parser.getAttributeValue(null, "value"));
+                    } catch (NullPointerException e) {
+                        throw new XmlPullParserException(
+                                "Need value attribute in item");
+                    } catch (NumberFormatException e) {
+                        throw new XmlPullParserException(
+                                "Not a number in value attribute in item");
+                    }
+                } else {
+                    throw new XmlPullParserException(
+                            "Expected item tag at: " + parser.getName());
+                }
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return array;
+                } else if (parser.getName().equals("item")) {
+                    i++;
+                } else {
+                    throw new XmlPullParserException(
+                        "Expected " + endTag + " end tag at: "
+                        + parser.getName());
+                }
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException(
+            "Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read a long[] object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeLongArrayXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "list".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return Returns a newly generated long[].
+     *
+     * @see #readListXml
+     */
+    public static final long[] readThisLongArrayXml(XmlPullParser parser,
+            String endTag, String[] name)
+            throws XmlPullParserException, IOException {
+
+        int num;
+        try {
+            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
+        } catch (NullPointerException e) {
+            throw new XmlPullParserException("Need num attribute in long-array");
+        } catch (NumberFormatException e) {
+            throw new XmlPullParserException("Not a number in num attribute in long-array");
+        }
+        parser.next();
+
+        long[] array = new long[num];
+        int i = 0;
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                if (parser.getName().equals("item")) {
+                    try {
+                        array[i] = Long.parseLong(parser.getAttributeValue(null, "value"));
+                    } catch (NullPointerException e) {
+                        throw new XmlPullParserException("Need value attribute in item");
+                    } catch (NumberFormatException e) {
+                        throw new XmlPullParserException("Not a number in value attribute in item");
+                    }
+                } else {
+                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
+                }
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return array;
+                } else if (parser.getName().equals("item")) {
+                    i++;
+                } else {
+                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
+                            parser.getName());
+                }
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read a double[] object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeDoubleArrayXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "double-array".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return Returns a newly generated double[].
+     *
+     * @see #readListXml
+     */
+    public static final double[] readThisDoubleArrayXml(XmlPullParser parser, String endTag,
+            String[] name) throws XmlPullParserException, IOException {
+
+        int num;
+        try {
+            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
+        } catch (NullPointerException e) {
+            throw new XmlPullParserException("Need num attribute in double-array");
+        } catch (NumberFormatException e) {
+            throw new XmlPullParserException("Not a number in num attribute in double-array");
+        }
+        parser.next();
+
+        double[] array = new double[num];
+        int i = 0;
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                if (parser.getName().equals("item")) {
+                    try {
+                        array[i] = Double.parseDouble(parser.getAttributeValue(null, "value"));
+                    } catch (NullPointerException e) {
+                        throw new XmlPullParserException("Need value attribute in item");
+                    } catch (NumberFormatException e) {
+                        throw new XmlPullParserException("Not a number in value attribute in item");
+                    }
+                } else {
+                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
+                }
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return array;
+                } else if (parser.getName().equals("item")) {
+                    i++;
+                } else {
+                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
+                            parser.getName());
+                }
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read a String[] object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeStringArrayXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "string-array".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return Returns a newly generated String[].
+     *
+     * @see #readListXml
+     */
+    public static final String[] readThisStringArrayXml(XmlPullParser parser, String endTag,
+            String[] name) throws XmlPullParserException, IOException {
+
+        int num;
+        try {
+            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
+        } catch (NullPointerException e) {
+            throw new XmlPullParserException("Need num attribute in string-array");
+        } catch (NumberFormatException e) {
+            throw new XmlPullParserException("Not a number in num attribute in string-array");
+        }
+        parser.next();
+
+        String[] array = new String[num];
+        int i = 0;
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                if (parser.getName().equals("item")) {
+                    try {
+                        array[i] = parser.getAttributeValue(null, "value");
+                    } catch (NullPointerException e) {
+                        throw new XmlPullParserException("Need value attribute in item");
+                    } catch (NumberFormatException e) {
+                        throw new XmlPullParserException("Not a number in value attribute in item");
+                    }
+                } else {
+                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
+                }
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return array;
+                } else if (parser.getName().equals("item")) {
+                    i++;
+                } else {
+                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
+                            parser.getName());
+                }
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read a boolean[] object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeBooleanArrayXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "string-array".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return Returns a newly generated boolean[].
+     *
+     * @see #readListXml
+     */
+    public static final boolean[] readThisBooleanArrayXml(XmlPullParser parser, String endTag,
+            String[] name) throws XmlPullParserException, IOException {
+
+        int num;
+        try {
+            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
+        } catch (NullPointerException e) {
+            throw new XmlPullParserException("Need num attribute in string-array");
+        } catch (NumberFormatException e) {
+            throw new XmlPullParserException("Not a number in num attribute in string-array");
+        }
+        parser.next();
+
+        boolean[] array = new boolean[num];
+        int i = 0;
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                if (parser.getName().equals("item")) {
+                    try {
+                        array[i] = Boolean.valueOf(parser.getAttributeValue(null, "value"));
+                    } catch (NullPointerException e) {
+                        throw new XmlPullParserException("Need value attribute in item");
+                    } catch (NumberFormatException e) {
+                        throw new XmlPullParserException("Not a number in value attribute in item");
+                    }
+                } else {
+                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
+                }
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return array;
+                } else if (parser.getName().equals("item")) {
+                    i++;
+                } else {
+                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
+                            parser.getName());
+                }
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read a flattened object from an XmlPullParser.  The XML data could
+     * previously have been written with writeMapXml(), writeListXml(), or
+     * writeValueXml().  The XmlPullParser must be positioned <em>at</em> the
+     * tag that defines the value.
+     *
+     * @param parser The XmlPullParser from which to read the object.
+     * @param name An array of one string, used to return the name attribute
+     *             of the value's tag.
+     *
+     * @return Object The newly generated value object.
+     *
+     * @see #readMapXml
+     * @see #readListXml
+     * @see #writeValueXml
+     */
+    public static final Object readValueXml(XmlPullParser parser, String[] name)
+    throws XmlPullParserException, IOException
+    {
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                return readThisValueXml(parser, name, null, false);
+            } else if (eventType == parser.END_TAG) {
+                throw new XmlPullParserException(
+                    "Unexpected end tag at: " + parser.getName());
+            } else if (eventType == parser.TEXT) {
+                throw new XmlPullParserException(
+                    "Unexpected text: " + parser.getText());
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException(
+            "Unexpected end of document");
+    }
+
+    private static final Object readThisValueXml(XmlPullParser parser, String[] name,
+            ReadMapCallback callback, boolean arrayMap)
+            throws XmlPullParserException, IOException {
+        final String valueName = parser.getAttributeValue(null, "name");
+        final String tagName = parser.getName();
+
+        //System.out.println("Reading this value tag: " + tagName + ", name=" + valueName);
+
+        Object res;
+
+        if (tagName.equals("null")) {
+            res = null;
+        } else if (tagName.equals("string")) {
+            String value = "";
+            int eventType;
+            while ((eventType = parser.next()) != parser.END_DOCUMENT) {
+                if (eventType == parser.END_TAG) {
+                    if (parser.getName().equals("string")) {
+                        name[0] = valueName;
+                        //System.out.println("Returning value for " + valueName + ": " + value);
+                        return value;
+                    }
+                    throw new XmlPullParserException(
+                        "Unexpected end tag in <string>: " + parser.getName());
+                } else if (eventType == parser.TEXT) {
+                    value += parser.getText();
+                } else if (eventType == parser.START_TAG) {
+                    throw new XmlPullParserException(
+                        "Unexpected start tag in <string>: " + parser.getName());
+                }
+            }
+            throw new XmlPullParserException(
+                "Unexpected end of document in <string>");
+        } else if ((res = readThisPrimitiveValueXml(parser, tagName)) != null) {
+            // all work already done by readThisPrimitiveValueXml
+        } else if (tagName.equals("int-array")) {
+            res = readThisIntArrayXml(parser, "int-array", name);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("long-array")) {
+            res = readThisLongArrayXml(parser, "long-array", name);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("double-array")) {
+            res = readThisDoubleArrayXml(parser, "double-array", name);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("string-array")) {
+            res = readThisStringArrayXml(parser, "string-array", name);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("boolean-array")) {
+            res = readThisBooleanArrayXml(parser, "boolean-array", name);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("map")) {
+            parser.next();
+            res = arrayMap
+                    ? readThisArrayMapXml(parser, "map", name, callback)
+                    : readThisMapXml(parser, "map", name, callback);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("list")) {
+            parser.next();
+            res = readThisListXml(parser, "list", name, callback, arrayMap);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("set")) {
+            parser.next();
+            res = readThisSetXml(parser, "set", name, callback, arrayMap);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (callback != null) {
+            res = callback.readThisUnknownObjectXml(parser, tagName);
+            name[0] = valueName;
+            return res;
+        } else {
+            throw new XmlPullParserException("Unknown tag: " + tagName);
+        }
+
+        // Skip through to end tag.
+        int eventType;
+        while ((eventType = parser.next()) != parser.END_DOCUMENT) {
+            if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(tagName)) {
+                    name[0] = valueName;
+                    //System.out.println("Returning value for " + valueName + ": " + res);
+                    return res;
+                }
+                throw new XmlPullParserException(
+                    "Unexpected end tag in <" + tagName + ">: " + parser.getName());
+            } else if (eventType == parser.TEXT) {
+                throw new XmlPullParserException(
+                "Unexpected text in <" + tagName + ">: " + parser.getName());
+            } else if (eventType == parser.START_TAG) {
+                throw new XmlPullParserException(
+                    "Unexpected start tag in <" + tagName + ">: " + parser.getName());
+            }
+        }
+        throw new XmlPullParserException(
+            "Unexpected end of document in <" + tagName + ">");
+    }
+
+    private static final Object readThisPrimitiveValueXml(XmlPullParser parser, String tagName)
+    throws XmlPullParserException, IOException
+    {
+        try {
+            if (tagName.equals("int")) {
+                return Integer.parseInt(parser.getAttributeValue(null, "value"));
+            } else if (tagName.equals("long")) {
+                return Long.valueOf(parser.getAttributeValue(null, "value"));
+            } else if (tagName.equals("float")) {
+                return new Float(parser.getAttributeValue(null, "value"));
+            } else if (tagName.equals("double")) {
+                return new Double(parser.getAttributeValue(null, "value"));
+            } else if (tagName.equals("boolean")) {
+                return Boolean.valueOf(parser.getAttributeValue(null, "value"));
+            } else {
+                return null;
+            }
+        } catch (NullPointerException e) {
+            throw new XmlPullParserException("Need value attribute in <" + tagName + ">");
+        } catch (NumberFormatException e) {
+            throw new XmlPullParserException(
+                    "Not a number in value attribute in <" + tagName + ">");
+        }
+    }
+
+    public static final void beginDocument(XmlPullParser parser, String firstElementName) throws XmlPullParserException, IOException
+    {
+        int type;
+        while ((type=parser.next()) != parser.START_TAG
+                   && type != parser.END_DOCUMENT) {
+            ;
+        }
+
+        if (type != parser.START_TAG) {
+            throw new XmlPullParserException("No start tag found");
+        }
+
+        if (!parser.getName().equals(firstElementName)) {
+            throw new XmlPullParserException("Unexpected start tag: found " + parser.getName() +
+                    ", expected " + firstElementName);
+        }
+    }
+
+    public static final void nextElement(XmlPullParser parser) throws XmlPullParserException, IOException
+    {
+        int type;
+        while ((type=parser.next()) != parser.START_TAG
+                   && type != parser.END_DOCUMENT) {
+            ;
+        }
+    }
+
+    public static boolean nextElementWithin(XmlPullParser parser, int outerDepth)
+            throws IOException, XmlPullParserException {
+        for (;;) {
+            int type = parser.next();
+            if (type == XmlPullParser.END_DOCUMENT
+                    || (type == XmlPullParser.END_TAG && parser.getDepth() == outerDepth)) {
+                return false;
+            }
+            if (type == XmlPullParser.START_TAG
+                    && parser.getDepth() == outerDepth + 1) {
+                return true;
+            }
+        }
+    }
+
+    public static int readIntAttribute(XmlPullParser in, String name, int defaultValue) {
+        final String value = in.getAttributeValue(null, name);
+        try {
+            return Integer.parseInt(value);
+        } catch (NumberFormatException e) {
+            return defaultValue;
+        }
+    }
+
+    public static int readIntAttribute(XmlPullParser in, String name) throws IOException {
+        final String value = in.getAttributeValue(null, name);
+        try {
+            return Integer.parseInt(value);
+        } catch (NumberFormatException e) {
+            throw new ProtocolException("problem parsing " + name + "=" + value + " as int");
+        }
+    }
+
+    public static void writeIntAttribute(XmlSerializer out, String name, int value)
+            throws IOException {
+        out.attribute(null, name, Integer.toString(value));
+    }
+
+    public static long readLongAttribute(XmlPullParser in, String name, long defaultValue) {
+        final String value = in.getAttributeValue(null, name);
+        try {
+            return Long.parseLong(value);
+        } catch (NumberFormatException e) {
+            return defaultValue;
+        }
+    }
+
+    public static long readLongAttribute(XmlPullParser in, String name) throws IOException {
+        final String value = in.getAttributeValue(null, name);
+        try {
+            return Long.parseLong(value);
+        } catch (NumberFormatException e) {
+            throw new ProtocolException("problem parsing " + name + "=" + value + " as long");
+        }
+    }
+
+    public static void writeLongAttribute(XmlSerializer out, String name, long value)
+            throws IOException {
+        out.attribute(null, name, Long.toString(value));
+    }
+
+    public static float readFloatAttribute(XmlPullParser in, String name) throws IOException {
+        final String value = in.getAttributeValue(null, name);
+        try {
+            return Float.parseFloat(value);
+        } catch (NumberFormatException e) {
+            throw new ProtocolException("problem parsing " + name + "=" + value + " as long");
+        }
+    }
+
+    public static void writeFloatAttribute(XmlSerializer out, String name, float value)
+            throws IOException {
+        out.attribute(null, name, Float.toString(value));
+    }
+
+    public static boolean readBooleanAttribute(XmlPullParser in, String name) {
+        final String value = in.getAttributeValue(null, name);
+        return Boolean.parseBoolean(value);
+    }
+
+    public static boolean readBooleanAttribute(XmlPullParser in, String name,
+            boolean defaultValue) {
+        final String value = in.getAttributeValue(null, name);
+        if (value == null) {
+            return defaultValue;
+        } else {
+            return Boolean.parseBoolean(value);
+        }
+    }
+
+    public static void writeBooleanAttribute(XmlSerializer out, String name, boolean value)
+            throws IOException {
+        out.attribute(null, name, Boolean.toString(value));
+    }
+
+    public static Uri readUriAttribute(XmlPullParser in, String name) {
+        final String value = in.getAttributeValue(null, name);
+        return (value != null) ? Uri.parse(value) : null;
+    }
+
+    public static void writeUriAttribute(XmlSerializer out, String name, Uri value)
+            throws IOException {
+        if (value != null) {
+            out.attribute(null, name, value.toString());
+        }
+    }
+
+    public static String readStringAttribute(XmlPullParser in, String name) {
+        return in.getAttributeValue(null, name);
+    }
+
+    public static void writeStringAttribute(XmlSerializer out, String name, String value)
+            throws IOException {
+        if (value != null) {
+            out.attribute(null, name, value);
+        }
+    }
+
+    public static byte[] readByteArrayAttribute(XmlPullParser in, String name) {
+        final String value = in.getAttributeValue(null, name);
+        if (value != null) {
+            return Base64.decode(value, Base64.DEFAULT);
+        } else {
+            return null;
+        }
+    }
+
+    public static void writeByteArrayAttribute(XmlSerializer out, String name, byte[] value)
+            throws IOException {
+        if (value != null) {
+            out.attribute(null, name, Base64.encodeToString(value, Base64.DEFAULT));
+        }
+    }
+
+    public static Bitmap readBitmapAttribute(XmlPullParser in, String name) {
+        final byte[] value = readByteArrayAttribute(in, name);
+        if (value != null) {
+            return BitmapFactory.decodeByteArray(value, 0, value.length);
+        } else {
+            return null;
+        }
+    }
+
+    @Deprecated
+    public static void writeBitmapAttribute(XmlSerializer out, String name, Bitmap value)
+            throws IOException {
+        if (value != null) {
+            final ByteArrayOutputStream os = new ByteArrayOutputStream();
+            value.compress(CompressFormat.PNG, 90, os);
+            writeByteArrayAttribute(out, name, os.toByteArray());
+        }
+    }
+
+    /** @hide */
+    public interface WriteMapCallback {
+        /**
+         * Called from writeMapXml when an Object type is not recognized. The implementer
+         * must write out the entire element including start and end tags.
+         *
+         * @param v The object to be written out
+         * @param name The mapping key for v. Must be written into the "name" attribute of the
+         *             start tag.
+         * @param out The XML output stream.
+         * @throws XmlPullParserException on unrecognized Object type.
+         * @throws IOException on XmlSerializer serialization errors.
+         * @hide
+         */
+         public void writeUnknownObject(Object v, String name, XmlSerializer out)
+                 throws XmlPullParserException, IOException;
+    }
+
+    /** @hide */
+    public interface ReadMapCallback {
+        /**
+         * Called from readThisMapXml when a START_TAG is not recognized. The input stream
+         * is positioned within the start tag so that attributes can be read using in.getAttribute.
+         *
+         * @param in the XML input stream
+         * @param tag the START_TAG that was not recognized.
+         * @return the Object parsed from the stream which will be put into the map.
+         * @throws XmlPullParserException if the START_TAG is not recognized.
+         * @throws IOException on XmlPullParser serialization errors.
+         * @hide
+         */
+        public Object readThisUnknownObjectXml(XmlPullParser in, String tag)
+                throws XmlPullParserException, IOException;
+    }
+}
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java b/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java
index aaab8c4..cb3de2a 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java
@@ -107,10 +107,10 @@
         checkActivityInfoName(RECEIVER_NAME, broadcastReceivers);
 
         // Test queryPermissionsByGroup, queryContentProviders
-        String testPermissionsGroup = "android.permission-group.NETWORK";
+        String testPermissionsGroup = "android.permission-group.COST_MONEY";
         List<PermissionInfo> permissions = mPackageManager.queryPermissionsByGroup(
                 testPermissionsGroup, PackageManager.GET_META_DATA);
-        checkPermissionInfoName(PERMISSION_NAME, permissions);
+        checkPermissionInfoName("com.android.cts.content.CALL_ABROAD_PERMISSION", permissions);
 
         ApplicationInfo appInfo = mPackageManager.getApplicationInfo(PACKAGE_NAME, 0);
         List<ProviderInfo> providers = mPackageManager.queryContentProviders(PACKAGE_NAME,
@@ -148,17 +148,12 @@
     }
 
     private void checkPermissionInfoName(String expectedName, List<PermissionInfo> permissions) {
-        boolean isContained = false;
-        Iterator<PermissionInfo> infoIterator = permissions.iterator();
-        String current;
-        while (infoIterator.hasNext()) {
-            current = infoIterator.next().name;
-            if (current.equals(expectedName)) {
-                isContained = true;
-                break;
-            }
+        List<String> names = new ArrayList<String>();
+        for (PermissionInfo permission : permissions) {
+            names.add(permission.name);
         }
-        assertTrue(isContained);
+        boolean isContained = names.contains(expectedName);
+        assertTrue("Permission " + expectedName + " not present in " + names, isContained);
     }
 
     private void checkProviderInfoName(String expectedName, List<ProviderInfo> providers) {
diff --git a/tests/tests/content/src/android/content/pm/cts/PermissionGroupInfoTest.java b/tests/tests/content/src/android/content/pm/cts/PermissionGroupInfoTest.java
index fc8d9b8..8b00624 100644
--- a/tests/tests/content/src/android/content/pm/cts/PermissionGroupInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PermissionGroupInfoTest.java
@@ -24,8 +24,9 @@
 import android.test.AndroidTestCase;
 
 public class PermissionGroupInfoTest extends AndroidTestCase {
-    private static final String PERMISSIONGROUP_NAME = "android.permission-group.COST_MONEY";
-    private static final String DEFAULT_DISCRIPTION = "Do things that can cost you money.";
+    private static final String GROUP = "android.permission-group.COST_MONEY";
+    private static final String GROUP_NAME = "Cost money";
+    private static final String GROUP_DESCRIPTION = "Do things that can cost you money.";
 
     public void testPermissionGroupInfo() throws NameNotFoundException {
         PackageManager pm = getContext().getPackageManager();
@@ -33,14 +34,15 @@
         // Test constructors
         new PermissionGroupInfo();
         PermissionGroupInfo permissionGroupInfo = pm
-                .getPermissionGroupInfo(PERMISSIONGROUP_NAME, 0);
+                .getPermissionGroupInfo(GROUP, 0);
         PermissionGroupInfo infoFromExisted = new PermissionGroupInfo(permissionGroupInfo);
         checkInfoSame(permissionGroupInfo, infoFromExisted);
 
         // Test toString, describeContents, loadDescription
         assertNotNull(permissionGroupInfo.toString());
         assertEquals(0, permissionGroupInfo.describeContents());
-        assertEquals(DEFAULT_DISCRIPTION, permissionGroupInfo.loadDescription(pm));
+        assertEquals(GROUP_NAME, permissionGroupInfo.loadLabel(pm));
+        assertEquals(GROUP_DESCRIPTION, permissionGroupInfo.loadDescription(pm));
 
         // Test writeToParcel
         permissionGroupInfo.writeToParcel(p, 0);
diff --git a/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java b/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
index 2870fee..e8d363b 100644
--- a/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
+++ b/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
@@ -15,14 +15,12 @@
  */
 package android.content.res.cts;
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
+import com.android.cts.content.R;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
+import android.content.cts.util.XmlUtils;
 import android.content.res.AssetFileDescriptor;
 import android.content.res.AssetManager;
 import android.content.res.Resources;
@@ -30,8 +28,10 @@
 import android.test.AndroidTestCase;
 import android.util.TypedValue;
 
-import com.android.cts.content.R;
-import com.android.internal.util.XmlUtils;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 
 
 public class AssetManagerTest extends AndroidTestCase{
diff --git a/tests/tests/content/src/android/content/res/cts/PrivateAttributeTest.java b/tests/tests/content/src/android/content/res/cts/PrivateAttributeTest.java
index 35466be..3024896 100644
--- a/tests/tests/content/src/android/content/res/cts/PrivateAttributeTest.java
+++ b/tests/tests/content/src/android/content/res/cts/PrivateAttributeTest.java
@@ -26,7 +26,7 @@
  */
 public class PrivateAttributeTest extends AndroidTestCase {
 
-    private static final int sLastPublicAttr = 0x010104d5;
+    private static final int sLastPublicAttr = 0x010104f1;
 
     public void testNoAttributesAfterLastPublicAttribute() throws Exception {
         final Resources res = getContext().getResources();
diff --git a/tests/tests/content/src/android/content/res/cts/ResourcesTest.java b/tests/tests/content/src/android/content/res/cts/ResourcesTest.java
index 88caa6f..4e2d60a 100644
--- a/tests/tests/content/src/android/content/res/cts/ResourcesTest.java
+++ b/tests/tests/content/src/android/content/res/cts/ResourcesTest.java
@@ -17,20 +17,19 @@
 package android.content.res.cts;
 
 import com.android.cts.content.R;
-import com.android.internal.util.XmlUtils;
-
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
 import android.content.Context;
+import android.content.cts.util.XmlUtils;
 import android.content.res.AssetManager;
 import android.content.res.ColorStateList;
 import android.content.res.Configuration;
 import android.content.res.Resources;
+import android.content.res.Resources.NotFoundException;
 import android.content.res.TypedArray;
 import android.content.res.XmlResourceParser;
-import android.content.res.Resources.NotFoundException;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.test.AndroidTestCase;
diff --git a/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java b/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java
index 349cb47..6d1c2e4 100644
--- a/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java
+++ b/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java
@@ -18,6 +18,8 @@
 
 import org.xmlpull.v1.XmlPullParser;
 
+import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.content.res.Resources.Theme;
@@ -25,9 +27,12 @@
 import android.util.AttributeSet;
 import android.util.TypedValue;
 import android.util.Xml;
+import android.view.View;
 
 import com.android.cts.content.R;
 
+import java.util.Locale;
+
 
 public class Resources_ThemeTest extends AndroidTestCase {
 
@@ -78,4 +83,51 @@
         assertFalse(mResTheme.resolveAttribute(R.raw.testmp3, value, false));
     }
 
+    public void testGetChangingConfigurations() {
+        Resources.Theme theme = getContext().getResources().newTheme();
+        assertEquals("Initial changing configuration mask is empty",
+                0, theme.getChangingConfigurations());
+
+        theme.applyStyle(R.style.Theme_OrientationDependent, true);
+        assertEquals("First call to Theme.applyStyle() sets changing configuration",
+                ActivityInfo.CONFIG_ORIENTATION, theme.getChangingConfigurations());
+
+        theme.applyStyle(R.style.Theme_LayoutDirectionDependent, true);
+        assertEquals("Multiple calls to Theme.applyStyle() update changing configuration",
+                ActivityInfo.CONFIG_ORIENTATION | ActivityInfo.CONFIG_LAYOUT_DIRECTION,
+                theme.getChangingConfigurations());
+
+        Resources.Theme other = getContext().getResources().newTheme();
+        other.setTo(theme);
+        assertEquals("Theme.setTheme() copies changing confguration",
+                ActivityInfo.CONFIG_ORIENTATION | ActivityInfo.CONFIG_LAYOUT_DIRECTION,
+                theme.getChangingConfigurations());
+    }
+
+    public void testRebase() {
+        Resources res = getContext().getResources();
+        Configuration config = res.getConfiguration();
+        config.setLocale(Locale.ENGLISH);
+        assertEquals("Theme will be created in LTR config",
+                View.LAYOUT_DIRECTION_LTR, config.getLayoutDirection());
+
+        Resources.Theme theme = res.newTheme();
+        theme.applyStyle(R.style.Theme_LayoutIsRTL, true);
+
+        TypedArray t = theme.obtainStyledAttributes(new int[] { R.attr.themeBoolean });
+        assertEquals("Theme was created in LTR config", false, t.getBoolean(0, true));
+        t.recycle();
+
+        config.setLocale(new Locale("iw"));
+        res.updateConfiguration(config, null);
+
+        assertEquals("Theme will be rebased in RTL config",
+                View.LAYOUT_DIRECTION_RTL, config.getLayoutDirection());
+
+        theme.rebase();
+
+        t = theme.obtainStyledAttributes(new int[] { R.attr.themeBoolean });
+        assertEquals("Theme was rebased in RTL config", true, t.getBoolean(0, false));
+        t.recycle();
+    }
 }
diff --git a/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java b/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java
index cc6c5ec..346bb9b 100644
--- a/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java
+++ b/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java
@@ -16,10 +16,11 @@
 
 package android.content.res.cts;
 
-import java.io.IOException;
+import com.android.cts.content.R;
 
 import org.xmlpull.v1.XmlPullParserException;
 
+import android.content.cts.util.XmlUtils;
 import android.content.res.TypedArray;
 import android.content.res.XmlResourceParser;
 import android.test.AndroidTestCase;
@@ -27,8 +28,7 @@
 import android.util.TypedValue;
 import android.view.ContextThemeWrapper;
 
-import com.android.cts.content.R;
-import com.android.internal.util.XmlUtils;
+import java.io.IOException;
 
 
 public class TypedArrayTest extends AndroidTestCase{
diff --git a/tests/tests/database/src/android/database/cts/AbstractCursorTest.java b/tests/tests/database/src/android/database/cts/AbstractCursorTest.java
index 078c2dd..14cd6d5 100644
--- a/tests/tests/database/src/android/database/cts/AbstractCursorTest.java
+++ b/tests/tests/database/src/android/database/cts/AbstractCursorTest.java
@@ -376,6 +376,12 @@
         }
     }
 
+    public void testSetExtras() {
+        Bundle b = new Bundle();
+        mTestAbstractCursor.setExtras(b);
+        assertSame(b, mTestAbstractCursor.getExtras());
+    }
+
     @SuppressWarnings("unchecked")
     private static ArrayList<ArrayList> createTestList(int rows, int cols) {
         ArrayList<ArrayList> list = new ArrayList<ArrayList>();
@@ -431,7 +437,6 @@
         public TestAbstractCursor(String[] columnNames, ArrayList<ArrayList> rows) {
             int colCount = columnNames.length;
             boolean foundID = false;
-            mRowIdColumnIndex = 0;
 
             // Add an _id column if not in columnNames
             for (int i = 0; i < colCount; ++i) {
diff --git a/tests/tests/database/src/android/database/cts/CursorWrapperTest.java b/tests/tests/database/src/android/database/cts/CursorWrapperTest.java
index 9d517dc..7c0ce56 100644
--- a/tests/tests/database/src/android/database/cts/CursorWrapperTest.java
+++ b/tests/tests/database/src/android/database/cts/CursorWrapperTest.java
@@ -402,7 +402,7 @@
         cursorWrapper.close();
     }
 
-    public void testContentObsererOperations() throws IllegalStateException {
+    public void testContentObserverOperations() throws IllegalStateException {
         CursorWrapper cursorWrapper = new CursorWrapper(getCursor());
         MockContentObserver observer = new MockContentObserver(null);
 
@@ -437,6 +437,18 @@
         cursorWrapper.close();
     }
 
+    public void testSetExtras() {
+        Cursor cursor = getCursor();
+        CursorWrapper cursorWrapper = new CursorWrapper(cursor);
+        try {
+            Bundle b = new Bundle();
+            cursorWrapper.setExtras(b);
+            assertSame(b, cursor.getExtras());
+        } finally {
+            cursorWrapper.close();
+        }
+    }
+
     private class MockContentObserver extends ContentObserver {
 
         public MockContentObserver(Handler handler) {
diff --git a/tests/tests/deqp/Android.mk b/tests/tests/deqp/Android.mk
index d8a4dda..ce8678b 100644
--- a/tests/tests/deqp/Android.mk
+++ b/tests/tests/deqp/Android.mk
@@ -21,6 +21,13 @@
 # All APIs share the same package
 LOCAL_PACKAGE_NAME := com.drawelements.deqp
 
+include $(LOCAL_PATH)/deqp_egl.mk
 include $(LOCAL_PATH)/deqp_gles2.mk
 include $(LOCAL_PATH)/deqp_gles3.mk
 include $(LOCAL_PATH)/deqp_gles31.mk
+
+# Make the deqp app and copy it to CTS out dir.
+cts_deqp_name := com.drawelements.deqp
+cts_deqp_apk := $(CTS_TESTCASES_OUT)/$(cts_deqp_name).apk
+$(cts_deqp_apk): $(call intermediates-dir-for,APPS,$(cts_deqp_name))/package.apk
+	$(call copy-file-to-target)
diff --git a/tests/tests/deqp/deqp_egl.mk b/tests/tests/deqp/deqp_egl.mk
new file mode 100644
index 0000000..6b4eed6
--- /dev/null
+++ b/tests/tests/deqp/deqp_egl.mk
@@ -0,0 +1,21 @@
+# Copyright (C) 2015 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.
+
+# Dummy target to make dEQP EGL test list generation consistent with other
+# tests.
+
+DEQP_API := egl
+DEQP_TEST_NAME := dEQP-EGL
+
+include $(BUILD_CTS_DEQP_PACKAGE)
diff --git a/tests/tests/display/Android.mk b/tests/tests/display/Android.mk
index a48a8e3..f17f580 100644
--- a/tests/tests/display/Android.mk
+++ b/tests/tests/display/Android.mk
@@ -29,7 +29,4 @@
 
 LOCAL_SDK_VERSION := current
 
-# This test runner sets up/cleans up the device before/after running the tests.
-LOCAL_CTS_TEST_RUNNER := com.android.cts.tradefed.testtype.DisplayTestRunner
-
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/display/AndroidManifest.xml b/tests/tests/display/AndroidManifest.xml
index 0b24754..bf84219 100644
--- a/tests/tests/display/AndroidManifest.xml
+++ b/tests/tests/display/AndroidManifest.xml
@@ -19,6 +19,8 @@
     package="com.android.cts.display">
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <!-- For special presentation windows when testing mode switches. -->
+    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
 
     <application>
         <uses-library android:name="android.test.runner" />
diff --git a/tests/tests/display/AndroidTest.xml b/tests/tests/display/AndroidTest.xml
new file mode 100644
index 0000000..dd42984
--- /dev/null
+++ b/tests/tests/display/AndroidTest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="Base config for CTS package preparer">
+    <include name="common-config" />
+    <!-- Use a non-standard pattern, must match values in tests/tests/display/.../DisplayTest.java -->
+    <option name="run-command:run-command" value="settings put global overlay_display_devices '181x161/214|181x161/214'" />
+    <option name="run-command:teardown-command" value="settings put global overlay_display_devices &quot;&quot;" />
+</configuration>
diff --git a/tests/tests/display/src/android/display/cts/DisplayTest.java b/tests/tests/display/src/android/display/cts/DisplayTest.java
index bea99ed..1f9f8d1 100644
--- a/tests/tests/display/src/android/display/cts/DisplayTest.java
+++ b/tests/tests/display/src/android/display/cts/DisplayTest.java
@@ -16,18 +16,34 @@
 
 package android.display.cts;
 
+import android.app.Presentation;
+import android.app.UiAutomation;
 import android.content.Context;
+import android.graphics.Color;
 import android.graphics.PixelFormat;
 import android.graphics.Point;
 import android.hardware.display.DisplayManager;
-import android.test.AndroidTestCase;
+import android.hardware.display.DisplayManager.DisplayListener;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.ParcelFileDescriptor;
+import android.test.InstrumentationTestCase;
 import android.util.DisplayMetrics;
 import android.view.Display;
+import android.view.View;
+import android.view.ViewGroup;
 import android.view.WindowManager;
 
-public class DisplayTest extends AndroidTestCase {
-    // This test is called from DisplayTestRunner which brings up an overlay display on the target
-    // device. The overlay display parameters must match the ones defined there which are
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.Scanner;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+public class DisplayTest extends InstrumentationTestCase {
+    // The CTS package brings up an overlay display on the target device (see AndroidTest.xml).
+    // The overlay display parameters must match the ones defined there which are
     // 181x161/214 (wxh/dpi).  It only matters that these values are different from any real
     // display.
 
@@ -43,14 +59,47 @@
 
     private DisplayManager mDisplayManager;
     private WindowManager mWindowManager;
+    private Context mContext;
+
+    // To test display mode switches.
+    private TestPresentation mPresentation;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+        mContext = getInstrumentation().getContext();
         mDisplayManager = (DisplayManager)mContext.getSystemService(Context.DISPLAY_SERVICE);
         mWindowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
     }
 
+    private void enableAppOps() {
+        StringBuilder cmd = new StringBuilder();
+        cmd.append("appops set ");
+        cmd.append(getInstrumentation().getContext().getPackageName());
+        cmd.append(" android:system_alert_window allow");
+        getInstrumentation().getUiAutomation().executeShellCommand(cmd.toString());
+
+        StringBuilder query = new StringBuilder();
+        query.append("appops get ");
+        query.append(getInstrumentation().getContext().getPackageName());
+        query.append(" android:system_alert_window");
+        String queryStr = query.toString();
+
+        String result = "No operations.";
+        while (result.contains("No operations")) {
+            ParcelFileDescriptor pfd = getInstrumentation().getUiAutomation().executeShellCommand(
+                    queryStr);
+            InputStream inputStream = new FileInputStream(pfd.getFileDescriptor());
+            result = convertStreamToString(inputStream);
+        }
+    }
+
+    private String convertStreamToString(InputStream is) {
+        try (java.util.Scanner s = new Scanner(is).useDelimiter("\\A")) {
+            return s.hasNext() ? s.next() : "";
+        }
+    }
+
     private boolean isSecondarySize(Display display) {
         final Point p = new Point();
         display.getSize(p);
@@ -177,4 +226,106 @@
 
         assertEquals(Display.FLAG_PRESENTATION, display.getFlags());
     }
+
+    /**
+     * Tests that the mode-related attributes and methods work as expected.
+     */
+    public void testMode() {
+        Display display = getSecondaryDisplay(mDisplayManager.getDisplays());
+        assertEquals(2, display.getSupportedModes().length);
+        Display.Mode mode = display.getMode();
+        assertEquals(display.getSupportedModes()[0], mode);
+        assertEquals(SECONDARY_DISPLAY_WIDTH, mode.getPhysicalWidth());
+        assertEquals(SECONDARY_DISPLAY_HEIGHT, mode.getPhysicalHeight());
+        assertEquals(display.getRefreshRate(), mode.getRefreshRate());
+    }
+
+    /**
+     * Tests that mode switch requests are correctly executed.
+     */
+    public void testModeSwitch() throws Exception {
+        enableAppOps();
+        final Display display = getSecondaryDisplay(mDisplayManager.getDisplays());
+        Display.Mode[] modes = display.getSupportedModes();
+        assertEquals(2, modes.length);
+        Display.Mode mode = display.getMode();
+        assertEquals(modes[0], mode);
+        final Display.Mode newMode = modes[1];
+
+        Handler handler = new Handler(Looper.getMainLooper());
+
+        // Register for display events.
+        final CountDownLatch changeSignal = new CountDownLatch(1);
+        mDisplayManager.registerDisplayListener(new DisplayListener() {
+            @Override
+            public void onDisplayAdded(int displayId) {}
+
+            @Override
+            public void onDisplayChanged(int displayId) {
+                if (displayId == display.getDisplayId()) {
+                    changeSignal.countDown();
+                }
+            }
+
+            @Override
+            public void onDisplayRemoved(int displayId) {}
+        }, handler);
+
+        // Show the presentation.
+        final CountDownLatch presentationSignal = new CountDownLatch(1);
+        handler.post(new Runnable() {
+            @Override
+            public void run() {
+                mPresentation = new TestPresentation(
+                        getInstrumentation().getContext(), display, newMode.getModeId());
+                mPresentation.show();
+                presentationSignal.countDown();
+            }
+        });
+        assertTrue(presentationSignal.await(5, TimeUnit.SECONDS));
+
+        // Wait until the display change is effective.
+        assertTrue(changeSignal.await(5, TimeUnit.SECONDS));
+
+        assertEquals(newMode, display.getMode());
+        handler.post(new Runnable() {
+            @Override
+            public void run() {
+                mPresentation.dismiss();
+            }
+        });
+    }
+
+    /**
+     * Used to force mode changes on a display.
+     * <p>
+     * Note that due to limitations of the Presentation class, the modes must have the same size
+     * otherwise the presentation will be automatically dismissed.
+     */
+    private static final class TestPresentation extends Presentation {
+
+        private final int mModeId;
+
+        public TestPresentation(Context context, Display display, int modeId) {
+            super(context, display);
+            mModeId = modeId;
+        }
+
+        @Override
+        protected void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+
+            View content = new View(getContext());
+            content.setLayoutParams(new ViewGroup.LayoutParams(
+                    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
+            content.setBackgroundColor(Color.RED);
+            setContentView(content);
+
+            WindowManager.LayoutParams params = getWindow().getAttributes();
+            params.preferredDisplayModeId = mModeId;
+            params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
+            params.setTitle("CtsTestPresentation");
+            getWindow().setAttributes(params);
+        }
+    }
 }
diff --git a/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java b/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
index 238abec..e722646 100644
--- a/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
+++ b/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
@@ -59,7 +59,9 @@
         allowedDensities.add(DisplayMetrics.DENSITY_HIGH);
         allowedDensities.add(DisplayMetrics.DENSITY_280);
         allowedDensities.add(DisplayMetrics.DENSITY_XHIGH);
+        allowedDensities.add(DisplayMetrics.DENSITY_360);
         allowedDensities.add(DisplayMetrics.DENSITY_400);
+        allowedDensities.add(DisplayMetrics.DENSITY_420);
         allowedDensities.add(DisplayMetrics.DENSITY_XXHIGH);
         allowedDensities.add(DisplayMetrics.DENSITY_560);
         allowedDensities.add(DisplayMetrics.DENSITY_XXXHIGH);
diff --git a/tests/tests/dreams/Android.mk b/tests/tests/dreams/Android.mk
index eca3d83..87bd357 100644
--- a/tests/tests/dreams/Android.mk
+++ b/tests/tests/dreams/Android.mk
@@ -26,6 +26,8 @@
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
 
+LOCAL_JAVA_LIBRARIES :=  android.test.runner
+
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 # Need access to ServiceManager - see b/13307221
diff --git a/tests/tests/dreams/src/android/service/dreams/cts/DreamServiceTest.java b/tests/tests/dreams/src/android/service/dreams/cts/DreamServiceTest.java
new file mode 100644
index 0000000..fcf6558
--- /dev/null
+++ b/tests/tests/dreams/src/android/service/dreams/cts/DreamServiceTest.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2015 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.service.dreams.cts;
+
+import android.service.dreams.DreamService;
+import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
+import android.view.ActionMode;
+
+public class DreamServiceTest extends InstrumentationTestCase {
+    @UiThreadTest
+    public void testOnWindowStartingActionMode() {
+        DreamService dreamService = new DreamService();
+
+        ActionMode actionMode = dreamService.onWindowStartingActionMode(null);
+
+        assertNull(actionMode);
+    }
+
+    @UiThreadTest
+    public void testOnWindowStartingActionModeTyped() {
+        DreamService dreamService = new DreamService();
+
+        ActionMode actionMode = dreamService.onWindowStartingActionMode(
+                null, ActionMode.TYPE_FLOATING);
+
+        assertNull(actionMode);
+    }
+}
diff --git a/tests/tests/graphics/AndroidManifest.xml b/tests/tests/graphics/AndroidManifest.xml
index 0006634..4249bb3 100644
--- a/tests/tests/graphics/AndroidManifest.xml
+++ b/tests/tests/graphics/AndroidManifest.xml
@@ -50,6 +50,7 @@
 
         <activity android:name="android.opengl.cts.OpenGlEsVersionCtsActivity"/>
 
+        <activity android:name="android.graphics.drawable.cts.DrawableStubActivity"/>
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/tests/tests/graphics/res/anim/animation_grouping_1_01.xml b/tests/tests/graphics/res/anim/animation_grouping_1_01.xml
index 8cc9f92..c1f2904 100644
--- a/tests/tests/graphics/res/anim/animation_grouping_1_01.xml
+++ b/tests/tests/graphics/res/anim/animation_grouping_1_01.xml
@@ -18,9 +18,9 @@
 <set xmlns:android="http://schemas.android.com/apk/res/android" >
 
     <objectAnimator
-        android:duration="3300"
+        android:duration="50"
         android:propertyName="rotation"
         android:valueFrom="0"
         android:valueTo="180"
-        android:repeatCount="-1" />
+        android:repeatCount="2" />
 </set>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_1_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_1_golden.png
index 91776a9..67f5746 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_1_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_1_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_2_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_2_golden.png
index 9af40a3..c60dfba 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_2_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_random_path_2_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png
index b3acfe7..e7cc4d1 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_1_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png
index bbc84b9..c7c049b 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_a_2_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_cq_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_cq_golden.png
index 8d73cfd..5880467 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_cq_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_cq_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_st_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_st_golden.png
index 6094a9a..93fb1d0 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_st_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_repeated_st_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_scale_1_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_scale_1_golden.png
new file mode 100644
index 0000000..899a235
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_scale_1_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_scale_2_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_scale_2_golden.png
new file mode 100644
index 0000000..ba6d8c7
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_scale_2_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_stroke_2_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_stroke_2_golden.png
index aee8ff5..4141d6f 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_stroke_2_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_stroke_2_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_1_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_1_golden.png
index baf418d..1703878 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_1_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_1_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_2_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_2_golden.png
index e0e14f3..5308c7b 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_2_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_2_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_3_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_3_golden.png
index b6798c2..e507b53 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_3_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_transformation_3_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/inset_mutate.xml b/tests/tests/graphics/res/drawable/inset_mutate.xml
new file mode 100644
index 0000000..ba613e9
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/inset_mutate.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<inset xmlns:android="http://schemas.android.com/apk/res/android"
+       android:drawable="@drawable/inset_mutate_testimage" />
diff --git a/tests/tests/graphics/res/drawable/inset_mutate_testimage.jpg b/tests/tests/graphics/res/drawable/inset_mutate_testimage.jpg
new file mode 100644
index 0000000..754df0c
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/inset_mutate_testimage.jpg
Binary files differ
diff --git a/tests/tests/graphics/res/drawable/rippledrawable_radius.xml b/tests/tests/graphics/res/drawable/rippledrawable_radius.xml
new file mode 100644
index 0000000..4701ef7
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/rippledrawable_radius.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 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
+  -->
+
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+        android:radius="10px"/>
diff --git a/tests/tests/graphics/res/drawable/vector_icon_clip_path_1.xml b/tests/tests/graphics/res/drawable/vector_icon_clip_path_1.xml
index c2ab429..53a9660 100644
--- a/tests/tests/graphics/res/drawable/vector_icon_clip_path_1.xml
+++ b/tests/tests/graphics/res/drawable/vector_icon_clip_path_1.xml
@@ -14,10 +14,10 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="64dp"
-        android:width="64dp"
-        android:viewportHeight="12.25"
-        android:viewportWidth="7.30625" >
+    android:height="64dp"
+    android:viewportHeight="12.25"
+    android:viewportWidth="7.30625"
+    android:width="64dp" >
 
     <group
         android:pivotX="3.65"
@@ -31,14 +31,18 @@
                 l 0, 12.25
                 l -7.3, 0
                 z" />
-    </group>
-    <group>
-        <path
-            android:name="one"
-            android:fillColor="#ff88ff"
-            android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875 -2.109375,0.421875 0.0-1.078125
+
+        <group
+            android:pivotX="3.65"
+            android:pivotY="6.125"
+            android:rotation="30" >
+            <path
+                android:name="one"
+                android:fillColor="#ff88ff"
+                android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875 -2.109375,0.421875 0.0-1.078125
                 l 2.09375-0.421875 1.1874998,0.0 0.0,7.75 1.9375,0.0 0.0,1.0
                 l -5.046875,0.0 0.0-1.0Z" />
+        </group>
     </group>
     <group
         android:pivotX="3.65"
@@ -52,12 +56,15 @@
                 l 0, 6.125
                 l -7.3, 0
                 z" />
-    </group>
-    <group>
-        <path
-            android:name="two"
-            android:fillColor="#ff88ff"
-            android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0 -5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
+
+        <group
+            android:pivotX="3.65"
+            android:pivotY="6.125"
+            android:rotation="30" >
+            <path
+                android:name="two"
+                android:fillColor="#ff88ff"
+                android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0 -5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
                         q 1.1718752-1.1875 1.4687502-1.53125 0.578125-0.625 0.796875-1.0625
                         q 0.234375-0.453125 0.234375-0.875 0.0-0.703125 -0.5-1.140625
                         q -0.484375-0.4375 -1.2656252-0.4375 -0.5625,0.0 -1.1875,0.1875
@@ -66,6 +73,7 @@
                         q 0.8125,0.671875 0.8125,1.8125 0.0,0.53125 -0.203125,1.015625
                         q -0.203125,0.484375 -0.734375,1.140625 -0.15625,0.171875 -0.9375,0.984375
                         q -0.78125024,0.8125 -2.2187502,2.265625Z" />
+        </group>
     </group>
 
 </vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_delete.xml b/tests/tests/graphics/res/drawable/vector_icon_delete.xml
index 8d9c21c..7b8f2aa 100644
--- a/tests/tests/graphics/res/drawable/vector_icon_delete.xml
+++ b/tests/tests/graphics/res/drawable/vector_icon_delete.xml
@@ -24,6 +24,6 @@
 
     <path
         android:fillColor="#FF000000"
-        android:pathData="M6.0,19.0c0.0,1.104 0.896,2.0 2.0,2.0l8.0,0.0c1.104,0.0 2.0-0.896 2.0-2.0l0.0-12.0L6.0,7.0L6.0,19.0zM18.0,4.0l-2.5,0.0l-1.0-1.0l-5.0,0.0l-1.0,1.0L6.0,4.0C5.4469986,4.0 5.0,4.4469986 5.0,5.0l0.0,1.0l14.0,0.0l0.0-1.0C19.0,4.4469986 18.552002,4.0 18.0,4.0z" />
+        android:pathData="M6.0,19.0c0.0,1.104 896e-3,2.0 2.0,2.0l8.0,0.0c1.104,0.0 2.0-896e-3 2.0-2.0l0.0-12.0L6.0,7.0L6.0,19.0zM18.0,4.0l-2.5,0.0l-1.0-1.0l-5.0,0.0l-1.0,1.0L6.0,4.0C5.4469986,4.0 5.0,4.4469986 5.0,5.0l0.0,1.0l14.0,0.0l0.0-1.0C19.0,4.4469986 18.552002,4.0 18.0,4.0z" />
 
 </vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_heart.xml b/tests/tests/graphics/res/drawable/vector_icon_heart.xml
index ff55fe5..ad991c9 100644
--- a/tests/tests/graphics/res/drawable/vector_icon_heart.xml
+++ b/tests/tests/graphics/res/drawable/vector_icon_heart.xml
@@ -24,6 +24,6 @@
 
     <path
         android:fillColor="#FF000000"
-        android:pathData="M16.0,5.0c-1.955,0.0 -3.83,1.268 -4.5,3.0c-0.67-1.732 -2.547-3.0 -4.5-3.0C4.4570007,5.0 2.5,6.931999 2.5,9.5c0.0,3.529 3.793,6.258 9.0,11.5c5.207-5.242 9.0-7.971 9.0-11.5C20.5,6.931999 18.543,5.0 16.0,5.0z" />
+        android:pathData="M16.0,5.0c-1.955.0 -3.83,1.268 -4.5,3.0c-0.67-1.732 -2.547-3.0 -4.5-3.0C4.4570007,5.0 2.5,6.931999 2.5,9.5c0.0,3.529 3.793,6.258 9.0,11.5c5.207-5.242 9.0-7.971 9.0-11.5C20.5,6.931999 18.543,5.0 16.0,5.0z" />
 
 </vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_scale_1.xml b/tests/tests/graphics/res/drawable/vector_icon_scale_1.xml
new file mode 100644
index 0000000..530c73b
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_scale_1.xml
@@ -0,0 +1,52 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="64dp"
+    android:viewportHeight="200"
+    android:viewportWidth="200"
+    android:width="64dp" >
+
+    <group>
+        <path
+            android:name="background1"
+            android:fillColor="#FF000000"
+            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="#FF000000"
+            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+    </group>
+    <group
+        android:scaleX="-1"
+        android:scaleY="-1" >
+        <group
+            android:scaleX="-1"
+            android:scaleY="-1" >
+            <group
+                android:pivotX="100"
+                android:pivotY="100"
+                android:rotation="45" >
+                <path
+                    android:name="twoLines"
+                    android:fillColor="#FFFF0000"
+                    android:pathData="M 100, 0 l 0, 100, -100, 0 z"
+                    android:strokeColor="#FF00FF00"
+                    android:strokeWidth="10" />
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/drawable/vector_icon_scale_2.xml b/tests/tests/graphics/res/drawable/vector_icon_scale_2.xml
new file mode 100644
index 0000000..200eb61
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/vector_icon_scale_2.xml
@@ -0,0 +1,48 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="64dp"
+    android:viewportHeight="200"
+    android:viewportWidth="200"
+    android:width="64dp" >
+
+    <group>
+        <path
+            android:name="background1"
+            android:fillColor="#FF000000"
+            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="#FF000000"
+            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+    </group>
+    <group
+        android:scaleX="2"
+        android:scaleY="0.5" >
+        <group
+            android:pivotX="100"
+            android:pivotY="100"
+            android:rotation="45" >
+            <path
+                android:name="twoLines"
+                android:fillColor="#FFFF0000"
+                android:pathData="M 100, 0 l 0, 100, -100, 0 z"
+                android:strokeColor="#FF00FF00"
+                android:strokeWidth="10" />
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/values/styles.xml b/tests/tests/graphics/res/values/styles.xml
index 20c80f8..31ed175 100644
--- a/tests/tests/graphics/res/values/styles.xml
+++ b/tests/tests/graphics/res/values/styles.xml
@@ -163,6 +163,7 @@
         <item name="themeNinePatch">@drawable/ninepatch_0</item>
         <item name="themeGravity">48</item>
         <item name="themeTileMode">2</item>
+        <item name="themeType">0</item>
     </style>
 
     <style name="Theme_NoSwipeDismiss">
diff --git a/tests/tests/graphics/src/android/graphics/cts/BitmapTest.java b/tests/tests/graphics/src/android/graphics/cts/BitmapTest.java
index f58b871..07e65d2 100644
--- a/tests/tests/graphics/src/android/graphics/cts/BitmapTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/BitmapTest.java
@@ -359,8 +359,10 @@
         mBitmap = BitmapFactory.decodeResource(mRes, R.drawable.start, mOptions);
         Bitmap ret = mBitmap.extractAlpha();
         assertNotNull(ret);
-        int color = ret.getPixel(10, 20);
-        assertEquals(0x00, Color.alpha(color));
+        int source = mBitmap.getPixel(10, 20);
+        int result = ret.getPixel(10, 20);
+        assertEquals(Color.alpha(source), Color.alpha(result));
+        assertEquals(0xFF, Color.alpha(result));
     }
 
     public void testExtractAlpha2(){
@@ -377,8 +379,10 @@
         mBitmap = BitmapFactory.decodeResource(mRes, R.drawable.start, mOptions);
         Bitmap ret = mBitmap.extractAlpha(new Paint(), new int[]{0, 1});
         assertNotNull(ret);
-        int color = ret.getPixel(10, 20);
-        assertEquals(0x00, Color.alpha(color));
+        int source = mBitmap.getPixel(10, 20);
+        int result = ret.getPixel(10, 20);
+        assertEquals(Color.alpha(source), Color.alpha(result));
+        assertEquals(0xFF, Color.alpha(result));
     }
 
     public void testGetAllocationByteCount() {
@@ -446,9 +450,22 @@
         }catch(IllegalArgumentException e){
         }
 
-        // normal case
+        // normal case 565
         mBitmap.setPixel(10, 16, 0xFF << 24);
         assertEquals(0xFF << 24, mBitmap.getPixel(10, 16));
+
+        // normal case A_8
+        mBitmap = Bitmap.createBitmap(10, 10, Config.ALPHA_8);
+        mBitmap.setPixel(5, 5, 0xFFFFFFFF);
+        assertEquals(0xFFFFFFFF, mBitmap.getPixel(5, 5));
+        mBitmap.setPixel(5, 5, 0xA8A8A8A8);
+        assertEquals(0xA8A8A8A8, mBitmap.getPixel(5, 5));
+        mBitmap.setPixel(5, 5, 0x00000000);
+        assertEquals(0x00000000, mBitmap.getPixel(5, 5));
+
+        // test reconstructing color channels
+        mBitmap.setPixel(5, 5, 0x1F000000);
+        assertEquals(0x1F1F1F1F, mBitmap.getPixel(5, 5));
     }
 
     public void testGetRowBytes(){
diff --git a/tests/tests/graphics/src/android/graphics/cts/CanvasTest.java b/tests/tests/graphics/src/android/graphics/cts/CanvasTest.java
index d5391a3..1dd6777 100644
--- a/tests/tests/graphics/src/android/graphics/cts/CanvasTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/CanvasTest.java
@@ -1681,6 +1681,115 @@
         mCanvas.drawText(t5, 0, 7, 10, 30, mPaint);
     }
 
+    public void testDrawTextRun() {
+        final String text = "android";
+        final Paint paint = new Paint();
+
+        mCanvas.drawTextRun(text, 0, 0, 0, 0, 0.0f, 0.0f, false, paint);
+        mCanvas.drawTextRun(text, 0, text.length(), 0, text.length(), 0.0f, 0.0f, false, paint);
+        mCanvas.drawTextRun(text, text.length(), text.length(), text.length(), text.length(),
+                0.0f, 0.0f, false, paint);
+
+        try {
+            mCanvas.drawTextRun((char[])null, 0, 0, 0, 0, 0.0f, 0.0f, false, paint);
+            fail("should throw out NullPointerException because text is null");
+        } catch (NullPointerException e) {
+        }
+
+        try {
+            mCanvas.drawTextRun((CharSequence)null, 0, 0, 0, 0, 0.0f, 0.0f, false, paint);
+            fail("should throw out NullPointerException because text is null");
+        } catch (NullPointerException e) {
+        }
+
+        try {
+            mCanvas.drawTextRun(text.toCharArray(), 0, 0, 0, 0, 0.0f, 0.0f, false, null);
+            fail("should throw out NullPointerException because paint is null");
+        } catch (NullPointerException e) {
+        }
+        try {
+            mCanvas.drawTextRun(text, 0, 0, 0, 0, 0.0f, 0.0f, false, null);
+            fail("should throw out NullPointerException because paint is null");
+        } catch (NullPointerException e) {
+        }
+
+        try {
+            mCanvas.drawTextRun(text.toCharArray(), -1, text.length(), 0, text.length(), 0.0f, 0.0f,
+                    false, paint);
+            fail("should throw out IndexOutOfBoundsException because index is less than 0");
+        } catch (IndexOutOfBoundsException e) {
+        }
+
+        try {
+            mCanvas.drawTextRun(text.toCharArray(), 0, -1, 0, text.length(), 0.0f, 0.0f, false,
+                    paint);
+            fail("should throw out IndexOutOfBoundsException because count is less than 0");
+        } catch (IndexOutOfBoundsException e) {
+        }
+
+        try {
+            mCanvas.drawTextRun(text.toCharArray(), 0, text.length(), 1, text.length(), 0.0f, 0.0f,
+                    false, paint);
+            fail("should throw out IndexOutOfBoundsException because contextIndex is bigger than "
+                    + "index");
+        } catch (IndexOutOfBoundsException e) {
+        }
+
+
+        try {
+            mCanvas.drawTextRun(text, 0, text.length(), 0, text.length() - 1, 0.0f, 0.0f, false,
+                    paint);
+            fail("should throw out IndexOutOfBoundsException because contexIndex + contextCount "
+                    + "is less than index + count");
+        } catch (IndexOutOfBoundsException e) {
+        }
+
+        try {
+            mCanvas.drawTextRun(text.toCharArray(), 0, text.length() + 1, 0, text.length() + 1,
+                    0.0f, 0.0f, false, paint);
+            fail("should throw out IndexOutOfBoundsException because index + count is bigger than "
+                    + "text length");
+        } catch (IndexOutOfBoundsException e) {
+        }
+
+        try {
+            mCanvas.drawTextRun(text, 0, text.length(), -1, text.length(), 0.0f, 0.0f, false,
+                    paint);
+            fail("should throw out IndexOutOfBoundsException because contextStart is less than 0");
+        } catch (IndexOutOfBoundsException e) {
+        }
+
+        try {
+            mCanvas.drawTextRun(text, 0, text.length(), 1, text.length(), 0.0f, 0.0f, false,
+                    paint);
+            fail("should throw out IndexOutOfBoundsException because start is less than "
+                    + "contextStart");
+        } catch (IndexOutOfBoundsException e) {
+        }
+
+        try {
+            mCanvas.drawTextRun(text, 1, 0, 0, text.length(), 0.0f, 0.0f, false,
+                    paint);
+            fail("should throw out IndexOutOfBoundsException because end is less than start");
+        } catch (IndexOutOfBoundsException e) {
+        }
+
+        try {
+            mCanvas.drawTextRun(text, 0, text.length(), 0, text.length() - 1, 0.0f, 0.0f, false,
+                    paint);
+            fail("should throw out IndexOutOfBoundsException because contextEnd is less than end");
+        } catch (IndexOutOfBoundsException e) {
+        }
+
+        try {
+            mCanvas.drawTextRun(text, 0, text.length(), 0, text.length() + 1, 0.0f, 0.0f, false,
+                    paint);
+            fail("should throw out IndexOutOfBoundsException because contextEnd is bigger than "
+                    + "text length");
+        } catch (IndexOutOfBoundsException e) {
+        }
+    }
+
     public void testDrawPosText1() {
         final char[] text = {
                 'a', 'n', 'd', 'r', 'o', 'i', 'd'
diff --git a/tests/tests/graphics/src/android/graphics/cts/ColorMatrixColorFilterTest.java b/tests/tests/graphics/src/android/graphics/cts/ColorMatrixColorFilterTest.java
index fdef54c..2657d15 100644
--- a/tests/tests/graphics/src/android/graphics/cts/ColorMatrixColorFilterTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/ColorMatrixColorFilterTest.java
@@ -70,7 +70,10 @@
         paint.setColor(Color.RED);
         bitmap.eraseColor(Color.TRANSPARENT);
         canvas.drawPoint(0, 0, paint);
-        assertColor(Color.argb(128, 255, 0, 64), bitmap.getPixel(0, 0));
+        // the bitmap stores the result in premul colors and we read out an
+        // unpremultiplied result, which causes us to need a bigger tolerance in
+        // this case (due to the fact that scaling by 1/255 is not exact).
+        assertColor(Color.argb(128, 255, 0, 64), bitmap.getPixel(0, 0), 2);
         paint.setColor(Color.CYAN);
         canvas.drawPoint(0, 0, paint);
         // blue gets clipped
@@ -89,9 +92,13 @@
     }
 
     private void assertColor(int expected, int actual) {
-        assertEquals(Color.red(expected), Color.red(actual), TOLERANCE);
-        assertEquals(Color.green(expected), Color.green(actual), TOLERANCE);
-        assertEquals(Color.blue(expected), Color.blue(actual), TOLERANCE);
-        assertEquals(Color.alpha(expected), Color.alpha(actual), TOLERANCE);
+        assertColor(expected, actual, TOLERANCE);
+    }
+    
+    private void assertColor(int expected, int actual, int tolerance) {
+        assertEquals(Color.red(expected), Color.red(actual), tolerance);
+        assertEquals(Color.green(expected), Color.green(actual), tolerance);
+        assertEquals(Color.blue(expected), Color.blue(actual), tolerance);
+        assertEquals(Color.alpha(expected), Color.alpha(actual), tolerance);
     }
 }
diff --git a/tests/tests/graphics/src/android/graphics/cts/CornerPathEffectTest.java b/tests/tests/graphics/src/android/graphics/cts/CornerPathEffectTest.java
index 125a6b0..553d05d 100644
--- a/tests/tests/graphics/src/android/graphics/cts/CornerPathEffectTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/CornerPathEffectTest.java
@@ -93,7 +93,6 @@
         // rounded corner must have less pixels than a sharp corner
         assertTrue(cornerPixels < 2 * RADIUS);
         // ... but not as few as a diagonal
-        // ToBeFixed: The following should be assertTrue (see bug 2037365)
-        assertFalse(cornerPixels > RADIUS);
+        assertTrue(cornerPixels > Math.sqrt(2 * Math.pow(RADIUS, 2)));
     }
 }
diff --git a/tests/tests/graphics/src/android/graphics/cts/PaintTest.java b/tests/tests/graphics/src/android/graphics/cts/PaintTest.java
index 1f709d3..80e0253 100644
--- a/tests/tests/graphics/src/android/graphics/cts/PaintTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PaintTest.java
@@ -19,6 +19,7 @@
 
 import android.graphics.ColorFilter;
 import android.graphics.MaskFilter;
+import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.Paint.Align;
 import android.graphics.Paint.Cap;
@@ -28,11 +29,14 @@
 import android.graphics.PathEffect;
 import android.graphics.Rasterizer;
 import android.graphics.Shader;
+import android.graphics.Bitmap;
+import android.graphics.BitmapShader;
 import android.graphics.Typeface;
 import android.graphics.Xfermode;
 import android.os.Build;
 import android.test.AndroidTestCase;
 import android.text.SpannedString;
+import android.util.Log;
 
 import java.util.Locale;
 
@@ -190,7 +194,7 @@
         assertEquals(m, p2.getMaskFilter());
         assertEquals(e, p2.getPathEffect());
         assertEquals(r, p2.getRasterizer());
-        assertNotSame(s, p2.getShader());
+        assertEquals(s, p2.getShader());
         assertEquals(t, p2.getTypeface());
         assertEquals(x, p2.getXfermode());
 
@@ -199,7 +203,7 @@
         assertEquals(m, p2.getMaskFilter());
         assertEquals(e, p2.getPathEffect());
         assertEquals(r, p2.getRasterizer());
-        assertNotSame(s, p2.getShader());
+        assertEquals(s, p2.getShader());
         assertEquals(t, p2.getTypeface());
         assertEquals(x, p2.getXfermode());
 
@@ -271,6 +275,35 @@
         assertNull(p.getShader());
     }
 
+    public void testShaderLocalMatrix() {
+        int width = 80;
+        int height = 120;
+        int[] color = new int[width * height];
+        Bitmap bitmap = Bitmap.createBitmap(color, width, height, Bitmap.Config.RGB_565);
+
+        Paint p = new Paint();
+        Matrix m = new Matrix();
+        Shader s = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
+
+        // set the shaders matrix to a non identity value and attach to paint
+        m.setScale(10, 0);
+        s.setLocalMatrix(m);
+        p.setShader(s);
+
+        Matrix m2 = new Matrix();
+        assertTrue(p.getShader().getLocalMatrix(m2));
+        assertEquals(m, m2);
+
+        // updated the matrix again and set it on the shader but NOT the paint
+        m.setScale(0, 10);
+        s.setLocalMatrix(m);
+
+        // assert that the matrix on the paint's shader also changed
+        Matrix m3 = new Matrix();
+        assertTrue(p.getShader().getLocalMatrix(m3));
+        assertEquals(m, m3);
+    }
+
     public void testSetAntiAlias() {
         Paint p = new Paint();
 
@@ -776,7 +809,6 @@
     }
 
     public void testReset() {
-
         Paint p  = new Paint();
         ColorFilter c = new ColorFilter();
         MaskFilter m  = new MaskFilter();
@@ -812,7 +844,6 @@
         assertEquals(null, p.getShader());
         assertEquals(null, p.getTypeface());
         assertEquals(null, p.getXfermode());
-
     }
 
     public void testSetLinearText() {
@@ -897,6 +928,20 @@
         assertMeasureText(text, textChars, textSpan, 4, 7, widths[4] + widths[5] + widths[6]);
     }
 
+    public void testMeasureTextContext() {
+       Paint p = new Paint();
+       // Arabic LAM, which is different width depending on context
+       String shortString = "\u0644";
+       String longString = "\u0644\u0644\u0644";
+       char[] longChars = longString.toCharArray();
+       SpannedString longSpanned = new SpannedString(longString);
+       float width = p.measureText(shortString);
+       // Verify that measurement of substring is consistent no matter what surrounds it.
+       assertMeasureText(longString, longChars, longSpanned, 0, 1, width);
+       assertMeasureText(longString, longChars, longSpanned, 1, 2, width);
+       assertMeasureText(longString, longChars, longSpanned, 2, 3, width);
+    }
+
     public void testMeasureTextWithLongText() {
         // This test is not compatible with 4.0.3
         if ("4.0.3".equals(Build.VERSION.RELEASE)) {
@@ -1001,4 +1046,376 @@
         }
     }
 
+    public void testHasGlyph() {
+        Paint p = new Paint();
+
+        // This method tests both the logic of hasGlyph and the sanity of fonts present
+        // on the device.
+        assertTrue(p.hasGlyph("A"));
+        assertFalse(p.hasGlyph("\uFFFE"));  // U+FFFE is guaranteed to be a noncharacter
+
+        // Roboto 2 (the default typeface) does have an "fi" glyph and is mandated by CDD
+        assertTrue(p.hasGlyph("fi"));
+        assertFalse(p.hasGlyph("ab"));  // but it does not contain an "ab" glyph
+        assertTrue(p.hasGlyph("\u02E5\u02E9"));  // IPA tone mark ligature
+
+        // variation selectors
+        assertFalse(p.hasGlyph("a\uFE0F"));
+        assertFalse(p.hasGlyph("a\uDB40\uDDEF"));  // UTF-16 encoding of U+E01EF
+        assertFalse(p.hasGlyph("\u2229\uFE0F"));  // base character is in mathematical symbol font
+        // Note: U+FE0F is variation selection, unofficially reserved for emoji
+
+        // regional indicator symbols
+        assertTrue(p.hasGlyph("\uD83C\uDDEF\uD83C\uDDF5"));   // "JP" U+1F1EF U+1F1F5
+        assertFalse(p.hasGlyph("\uD83C\uDDFF\uD83C\uDDFF"));  // "ZZ" U+1F1FF U+1F1FF
+
+        // Mongolian, which is an optional font, but if present, should support FVS
+        if (p.hasGlyph("\u182D")) {
+            assertTrue(p.hasGlyph("\u182D\u180B"));
+        }
+
+        // TODO: when we support variation selectors, add positive tests
+    }
+
+    public void testGetRunAdvance() {
+        Paint p = new Paint();
+        {
+            // LTR
+            String string = "abcdef";
+            {
+                final float width = p.getRunAdvance(string, 0, string.length(), 0,
+                        string.length(), false, 0);
+                assertEquals(0.0f, width);
+            }
+            {
+                final float widthToMid = p.getRunAdvance(string, 0, string.length(), 0,
+                        string.length(), false, string.length() / 2);
+                final float widthToTail = p.getRunAdvance(string, 0, string.length(), 0,
+                        string.length(), false, string.length());
+                assertTrue(widthToMid > 0.0f);
+                assertTrue(widthToTail > widthToMid);
+            }
+            {
+                final float widthFromHead = p.getRunAdvance(string, 0, string.length(), 0,
+                        string.length(), false, string.length());
+                final float widthFromSecond = p.getRunAdvance(string, 1, string.length(), 0,
+                        string.length(), false, string.length());
+                assertTrue(widthFromHead > widthFromSecond);
+            }
+        }
+        {
+            // RTL
+            String string = "\u0644\u063A\u0629 \u0639\u0631\u0628\u064A\u0629"; // Arabic
+            {
+                final float widthToMid = p.getRunAdvance(string, 0, string.length(), 0,
+                        string.length(), true, string.length() / 2);
+                final float widthToTail = p.getRunAdvance(string, 0, string.length(), 0,
+                        string.length(), true, string.length());
+                assertTrue(widthToMid > 0.0f);
+                assertTrue(widthToTail > widthToMid);
+            }
+            {
+                final float widthFromHead = p.getRunAdvance(string, 0, string.length(), 0,
+                        string.length(), true, string.length());
+                final float widthFromSecond = p.getRunAdvance(string, 1, string.length(), 0,
+                        string.length(), true, string.length());
+                assertTrue(widthFromHead > widthFromSecond);
+            }
+        }
+    }
+
+    public void testGetRunAdvance_invalidArguments() {
+        Paint p = new Paint();
+        try {
+            p.getRunAdvance((CharSequence)null, 0, 0, 0, 0, false, 0);
+            fail("Should throw an IllegalArgumentException.");
+        } catch (IllegalArgumentException e) {
+        } catch (Exception e) {
+            fail("Should throw an IllegalArgumentException.");
+        }
+
+        try {
+            p.getRunAdvance((char[])null, 0, 0, 0, 0, false, 0);
+            fail("Should throw an IllegalArgumentException.");
+        } catch (IllegalArgumentException e) {
+        } catch (Exception e) {
+            fail("Should throw an IllegalArgumentException.");
+        }
+
+        final String string = "abcde";
+
+        try {
+            // text length < context end
+            p.getRunAdvance(string, 0, string.length(), 0, string.length() + 1, false,
+                    string.length());
+            fail("Should throw an IndexOutOfBoundsException.");
+        } catch (IndexOutOfBoundsException e) {
+        } catch (Exception e) {
+            fail("Should throw an IndexOutOfBoundsException.");
+        }
+        try {
+            // context end < end
+            p.getRunAdvance(string, 0, string.length(), 0, string.length() - 1, false, 0);
+            fail("Should throw an IndexOutOfBoundsException.");
+        } catch (IndexOutOfBoundsException e) {
+        } catch (Exception e) {
+            fail("Should throw an IndexOutOfBoundsException.");
+        }
+        try {
+            // end < offset
+            p.getRunAdvance(string, 0, string.length() - 1, 0, string.length() - 1, false,
+                    string.length());
+            fail("Should throw an IndexOutOfBoundsException.");
+        } catch (IndexOutOfBoundsException e) {
+        } catch (Exception e) {
+            fail("Should throw an IndexOutOfBoundsException.");
+        }
+        try {
+            // offset < start
+            p.getRunAdvance(string, 1, string.length(), 1, string.length(), false, 0);
+            fail("Should throw an IndexOutOfBoundsException.");
+        } catch (IndexOutOfBoundsException e) {
+        } catch (Exception e) {
+            fail("Should throw an IndexOutOfBoundsException.");
+        }
+        try {
+            // start < context start
+            p.getRunAdvance(string, 0, string.length(), 1, string.length(), false, 1);
+            fail("Should throw an IndexOutOfBoundsException.");
+        } catch (IndexOutOfBoundsException e) {
+        } catch (Exception e) {
+            fail("Should throw an IndexOutOfBoundsException.");
+        }
+        try {
+            // context start < 0
+            p.getRunAdvance(string, 0, string.length(), -1, string.length(), false, 0);
+            fail("Should throw an IndexOutOfBoundsException.");
+        } catch (IndexOutOfBoundsException e) {
+        } catch (Exception e) {
+            fail("Should throw an IndexOutOfBoundsException.");
+        }
+    }
+
+    public void testGetRunAdvance_nonzeroIndex() {
+        Paint p = new Paint();
+        final String text = "Android powers hundreds of millions of mobile " +
+                "devices in more than 190 countries around the world. It's" +
+                "the largest installed base of any mobile platform and" +
+                "growing fast—every day another million users power up their" +
+                "Android devices for the first time and start looking for" +
+                "apps, games, and other digital content.";
+        // Test offset index does not affect width.
+        final float widthAndroidFirst = p.getRunAdvance(
+                text, 0, 7, 0, text.length(), false, 7);
+        final float widthAndroidSecond = p.getRunAdvance(
+                text, 215, 222, 0, text.length(), false, 222);
+        assertTrue(Math.abs(widthAndroidFirst - widthAndroidSecond) < 1);
+    }
+
+    public void testGetRunAdvance_glyphDependingContext() {
+        Paint p = new Paint();
+        // Test the context change the character shape.
+        // First character should be isolated form because the context ends at index 1.
+        final float isolatedFormWidth = p.getRunAdvance("\u0644\u0644", 0, 1, 0, 1, true, 1);
+        // First character should be initial form because the context ends at index 2.
+        final float initialFormWidth = p.getRunAdvance("\u0644\u0644", 0, 1, 0, 2, true, 1);
+        assertTrue(isolatedFormWidth > initialFormWidth);
+    }
+
+    public void testGetRunAdvance_arabic() {
+        Paint p = new Paint();
+        // Test total width is equals to sum of each character's width.
+        // "What is Unicode?" in Arabic.
+        final String text =
+                "\u0645\u0627\u0020\u0647\u064A\u0020\u0627\u0644\u0634" +
+                "\u0641\u0631\u0629\u0020\u0627\u0644\u0645\u0648\u062D" +
+                "\u062F\u0629\u0020\u064A\u0648\u0646\u064A\u0643\u0648" +
+                "\u062F\u061F";
+        final float totalWidth = p.getRunAdvance(
+                text, 0, text.length(), 0, text.length(), true, text.length());
+        float sumOfCharactersWidth = 0;
+        for (int i = 0; i < text.length(); i++) {
+            sumOfCharactersWidth += p.getRunAdvance(
+                    text, i, i + 1, 0, text.length(), true, i + 1);
+        }
+        assertTrue(Math.abs(totalWidth - sumOfCharactersWidth) < 1);
+    }
+
+    public void testGetOffsetForAdvance() {
+        Paint p = new Paint();
+        {
+            // LTR
+            String string = "abcdef";
+            {
+                for (int offset = 0; offset <= string.length(); ++offset) {
+                    final float widthToOffset = p.getRunAdvance(string, 0,
+                            string.length(), 0, string.length(), false, offset);
+                    final int restoredOffset = p.getOffsetForAdvance(string, 0,
+                            string.length(), 0, string.length(), false, widthToOffset);
+                    assertEquals(offset, restoredOffset);
+                }
+            }
+            {
+                final int offset = p.getOffsetForAdvance(string, 0, string.length(), 0,
+                        string.length(), false, -10.0f);
+                assertEquals(0, offset);
+            }
+            {
+                final float widthToEnd = p.getRunAdvance(string, 0, string.length(), 0,
+                        string.length(), true, string.length());
+                final int offset = p.getOffsetForAdvance(string, 0, string.length(), 0,
+                        string.length(), true, widthToEnd + 10.0f);
+                assertEquals(string.length(), offset);
+            }
+        }
+        {
+            // RTL
+            String string = "\u0639\u0631\u0628\u0649"; // Arabic
+            {
+                for (int offset = 0; offset <= string.length(); ++offset) {
+                    final float widthToOffset = p.getRunAdvance(string, 0,
+                            string.length(), 0, string.length(), true, offset);
+                    final int restoredOffset = p.getOffsetForAdvance(string, 0,
+                            string.length(), 0, string.length(), true, widthToOffset);
+                    assertEquals(offset, restoredOffset);
+                }
+            }
+            {
+                final int offset = p.getOffsetForAdvance(string, 0, string.length(), 0,
+                        string.length(), true, -10.0f);
+                assertEquals(0, offset);
+            }
+            {
+                final float widthToEnd = p.getRunAdvance(string, 0, string.length(), 0,
+                        string.length(), true, string.length());
+                final int offset = p.getOffsetForAdvance(string, 0, string.length(), 0,
+                        string.length(), true, widthToEnd + 10.0f);
+                assertEquals(string.length(), offset);
+            }
+        }
+    }
+
+    public void testGetOffsetForAdvance_invalidArguments() {
+        Paint p = new Paint();
+        try {
+            p.getOffsetForAdvance((CharSequence)null, 0, 0, 0, 0, false, 0.0f);
+            fail("Should throw an IllegalArgumentException.");
+        } catch (IllegalArgumentException e) {
+        } catch (Exception e) {
+            fail("Should throw an IllegalArgumentException.");
+        }
+        try {
+            p.getOffsetForAdvance((char[])null, 0, 0, 0, 0, false, 0.0f);
+            fail("Should throw an IllegalArgumentException.");
+        } catch (IllegalArgumentException e) {
+        } catch (Exception e) {
+            fail("Should throw an IllegalArgumentException.");
+        }
+
+        final String string = "abcde";
+
+        try {
+            // context start < 0
+            p.getOffsetForAdvance(string, -1, string.length(), 0, string.length(), false, 0.0f);
+            fail("Should throw an IndexOutOfBoundsException.");
+        } catch (IndexOutOfBoundsException e) {
+        } catch (Exception e) {
+            fail("Should throw an IndexOutOfBoundsException.");
+        }
+
+        try {
+            // start < context start
+            p.getOffsetForAdvance(string, 0, string.length(), 1, string.length(), false, 0.0f);
+            fail("Should throw an IndexOutOfBoundsException.");
+        } catch (IndexOutOfBoundsException e) {
+        } catch (Exception e) {
+            fail("Should throw an IndexOutOfBoundsException.");
+        }
+
+        try {
+            // end < start
+            p.getOffsetForAdvance(string, 1, 0, 0, 0, false, 0);
+            fail("Should throw an IndexOutOfBoundsException.");
+        } catch (IndexOutOfBoundsException e) {
+        } catch (Exception e) {
+            fail("Should throw an IndexOutOfBoundsException.");
+        }
+
+        try {
+            // context end < end
+            p.getOffsetForAdvance(string, 0, string.length(), 0, string.length() - 1, false, 0.0f);
+            fail("Should throw an IndexOutOfBoundsException.");
+        } catch (IndexOutOfBoundsException e) {
+        } catch (Exception e) {
+            fail("Should throw an IndexOutOfBoundsException.");
+        }
+
+        try {
+            // text length < context end
+            p.getOffsetForAdvance(string, 0, string.length(), 0, string.length() + 1, false, 0.0f);
+            fail("Should throw an IndexOutOfBoundsException.");
+        } catch (IndexOutOfBoundsException e) {
+        } catch (Exception e) {
+            fail("Should throw an IndexOutOfBoundsException.");
+        }
+    }
+
+    public void testGetOffsetForAdvance_grahpemeCluster() {
+        Paint p = new Paint();
+        {
+            String string = "\uD83C\uDF37"; // U+1F337: TULIP
+            {
+                final float widthToOffset = p.getRunAdvance(string, 0,
+                        string.length(), 0, string.length(), false, 1);
+                final int offset = p.getOffsetForAdvance(string, 0, string.length(), 0,
+                        string.length(), false, widthToOffset);
+                assertFalse(1 == offset);
+                assertTrue(0 == offset || string.length() == offset);
+            }
+        }
+        {
+            String string = "\uD83C\uDDFA\uD83C\uDDF8"; // US flag
+            {
+                final float widthToOffset = p.getRunAdvance(string, 0,
+                        string.length(), 0, string.length(), false, 2);
+                final int offset = p.getOffsetForAdvance(string, 0, string.length(), 0,
+                        string.length(), false, widthToOffset);
+                assertFalse(2 == offset);
+                assertTrue(0 == offset || string.length() == offset);
+            }
+            {
+                final float widthToOffset = p.getRunAdvance(string, 0, 2, 0, 2, false, 2);
+                final int offset = p.getOffsetForAdvance(string, 0, 2,
+                        0, 2, false, widthToOffset);
+                assertEquals(2, offset);
+            }
+        }
+        {
+            // HANGUL CHOSEONG KIYEOK, HANGUL JUNGSEONG A, HANDUL JONGSEONG KIYEOK
+            String string = "\u1100\u1161\u11A8";
+            {
+                for (int offset = 0; offset <= string.length(); ++offset) {
+                    final float widthToOffset = p.getRunAdvance(string, 0,
+                            string.length(), 0, string.length(), false, offset);
+                    final int offsetForAdvance = p.getOffsetForAdvance(string, 0, string.length(),
+                            0, string.length(), false, widthToOffset);
+                    assertTrue(0 == offsetForAdvance || string.length() == offsetForAdvance);
+                }
+                for (int offset = 0; offset <= string.length(); ++offset) {
+                    final float widthToOffset = p.getRunAdvance(string, 0, offset, 0, offset,
+                            false, offset);
+                    final int offsetForAdvance = p.getOffsetForAdvance(string, 0, string.length(),
+                            0, string.length(), false, widthToOffset);
+                    assertTrue(0 == offsetForAdvance || string.length() == offsetForAdvance);
+                }
+                for (int offset = 0; offset <= string.length(); ++offset) {
+                    final float widthToOffset = p.getRunAdvance(string, 0, offset, 0, offset,
+                            false, offset);
+                    final int offsetForAdvance = p.getOffsetForAdvance(string, 0, offset, 0,
+                            offset, false, widthToOffset);
+                    assertEquals(offset, offsetForAdvance);
+                }
+            }
+        }
+    }
 }
diff --git a/tests/tests/graphics/src/android/graphics/cts/VulkanReservedTest.java b/tests/tests/graphics/src/android/graphics/cts/VulkanReservedTest.java
new file mode 100644
index 0000000..bfd520e
--- /dev/null
+++ b/tests/tests/graphics/src/android/graphics/cts/VulkanReservedTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2015 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.graphics.cts;
+
+import android.cts.util.FileUtils;
+
+import junit.framework.TestCase;
+
+import java.io.File;
+
+public class VulkanReservedTest extends TestCase {
+
+    /**
+     * Assert that file with given path does not exist.
+     */
+    private static void assertNoFile(String filename) {
+        assertFalse(filename + " must not exist", new File(filename).exists());
+    }
+
+    /**
+     * Test that no vendor ships libvulkan.so before ratification and
+     * appropriate CTS coverage.
+     */
+    public void testNoVulkan() {
+        assertNoFile("/system/lib/libvulkan.so");
+        assertNoFile("/system/lib64/libvulkan.so");
+        assertNoFile("/vendor/lib/libvulkan.so");
+        assertNoFile("/vendor/lib64/libvulkan.so");
+    }
+}
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/AnimatedVectorDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/AnimatedVectorDrawableTest.java
index b4c64e2..769e110 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/AnimatedVectorDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/AnimatedVectorDrawableTest.java
@@ -19,9 +19,11 @@
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
+import android.graphics.drawable.Animatable2;
 import android.graphics.drawable.AnimatedVectorDrawable;
+import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Drawable.ConstantState;
-import android.test.AndroidTestCase;
+import android.test.ActivityInstrumentationTestCase2;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.Xml;
@@ -35,12 +37,13 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 
-public class AnimatedVectorDrawableTest extends AndroidTestCase {
+public class AnimatedVectorDrawableTest extends ActivityInstrumentationTestCase2<DrawableStubActivity> {
     private static final String LOGTAG = AnimatedVectorDrawableTest.class.getSimpleName();
 
     private static final int IMAGE_WIDTH = 64;
     private static final int IMAGE_HEIGHT = 64;
 
+    private DrawableStubActivity mActivity;
     private Resources mResources;
     private AnimatedVectorDrawable mAnimatedVectorDrawable;
     private Bitmap mBitmap;
@@ -48,6 +51,10 @@
     private static final boolean DBG_DUMP_PNG = false;
     private int mResId = R.drawable.animation_vector_drawable_grouping_1;
 
+    public AnimatedVectorDrawableTest() {
+        super(DrawableStubActivity.class);
+    }
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -56,7 +63,8 @@
         mCanvas = new Canvas(mBitmap);
         mAnimatedVectorDrawable = new AnimatedVectorDrawable();
 
-        mResources = mContext.getResources();
+        mActivity = getActivity();
+        mResources = mActivity.getResources();
     }
 
     // This is only for debugging or golden image (re)generation purpose.
@@ -156,11 +164,9 @@
     }
 
     public void testMutate() {
-        Resources resources = mContext.getResources();
-
-        AnimatedVectorDrawable d1 = (AnimatedVectorDrawable) resources.getDrawable(mResId);
-        AnimatedVectorDrawable d2 = (AnimatedVectorDrawable) resources.getDrawable(mResId);
-        AnimatedVectorDrawable d3 = (AnimatedVectorDrawable) resources.getDrawable(mResId);
+        AnimatedVectorDrawable d1 = (AnimatedVectorDrawable) mResources.getDrawable(mResId);
+        AnimatedVectorDrawable d2 = (AnimatedVectorDrawable) mResources.getDrawable(mResId);
+        AnimatedVectorDrawable d3 = (AnimatedVectorDrawable) mResources.getDrawable(mResId);
         int originalAlpha = d2.getAlpha();
         int newAlpha = (originalAlpha + 1) % 255;
 
@@ -183,4 +189,91 @@
         assertEquals(0x20, d2.getAlpha());
         assertEquals(originalAlpha, d3.getAlpha());
     }
+
+    public void testReset() {
+        final AnimatedVectorDrawable d1 = (AnimatedVectorDrawable) mResources.getDrawable(mResId);
+        // The AVD has a duration as 100ms.
+        mActivity.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                d1.reset();
+                assertFalse(d1.isRunning());
+            }
+        });
+
+    }
+
+    public void testAddCallback() throws InterruptedException {
+        MyCallback callback = new MyCallback();
+        final AnimatedVectorDrawable d1 = (AnimatedVectorDrawable) mResources.getDrawable(mResId);
+
+        d1.registerAnimationCallback(callback);
+        // The AVD has a duration as 100ms.
+        mActivity.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                d1.start();
+            }
+        });
+
+        Thread.sleep(200);
+
+        assertTrue(callback.mStart);
+        assertTrue(callback.mEnd);
+    }
+
+    public void testRemoveCallback() throws InterruptedException {
+        MyCallback callback = new MyCallback();
+        final AnimatedVectorDrawable d1 = (AnimatedVectorDrawable) mResources.getDrawable(mResId);
+
+        d1.registerAnimationCallback(callback);
+        assertTrue(d1.unregisterAnimationCallback(callback));
+        // The AVD has a duration as 100ms.
+        mActivity.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                d1.start();
+            }
+        });
+
+        Thread.sleep(200);
+
+        assertFalse(callback.mStart);
+        assertFalse(callback.mEnd);
+    }
+
+    public void testClearCallback() throws InterruptedException {
+        MyCallback callback = new MyCallback();
+        final AnimatedVectorDrawable d1 = (AnimatedVectorDrawable) mResources.getDrawable(mResId);
+
+        d1.registerAnimationCallback(callback);
+        d1.clearAnimationCallbacks();
+        // The AVD has a duration as 100ms.
+        mActivity.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                d1.start();
+            }
+        });
+
+        Thread.sleep(200);
+
+        assertFalse(callback.mStart);
+        assertFalse(callback.mEnd);
+    }
+
+    class MyCallback extends Animatable2.AnimationCallback {
+        boolean mStart = false;
+        boolean mEnd = false;
+
+        @Override
+        public void onAnimationStart(Drawable drawable) {
+            mStart = true;
+        }
+
+        @Override
+        public void onAnimationEnd(Drawable drawable) {
+            mEnd = true;
+        }
+    }
 }
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java
index c895d0d..88e7acb 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java
@@ -21,7 +21,6 @@
 import org.xmlpull.v1.XmlPullParserException;
 
 import android.content.Context;
-import android.content.res.ColorStateList;
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
 import android.graphics.Bitmap;
@@ -135,6 +134,22 @@
         assertTrue(bitmapDrawable.getPaint().isFilterBitmap());
     }
 
+    public void testIsFilterBitmap() {
+        InputStream source = mContext.getResources().openRawResource(R.raw.testimage);
+        BitmapDrawable bitmapDrawable = new BitmapDrawable(source);
+
+        assertTrue(bitmapDrawable.isFilterBitmap());
+
+        bitmapDrawable.setFilterBitmap(false);
+        assertFalse(bitmapDrawable.isFilterBitmap());
+        assertEquals(bitmapDrawable.isFilterBitmap(), bitmapDrawable.getPaint().isFilterBitmap());
+
+
+        bitmapDrawable.setFilterBitmap(true);
+        assertTrue(bitmapDrawable.isFilterBitmap());
+        assertEquals(bitmapDrawable.isFilterBitmap(), bitmapDrawable.getPaint().isFilterBitmap());
+    }
+
     public void testSetDither() {
         InputStream source = mContext.getResources().openRawResource(R.raw.testimage);
         BitmapDrawable bitmapDrawable = new BitmapDrawable(source);
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ClipDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ClipDrawableTest.java
index 7e3294d..e727350 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ClipDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ClipDrawableTest.java
@@ -22,6 +22,7 @@
 import org.xmlpull.v1.XmlPullParserException;
 
 import java.io.IOException;
+import java.util.Arrays;
 
 import android.graphics.Bitmap;
 import android.graphics.Bitmap.Config;
@@ -67,19 +68,21 @@
     }
 
     public void testGetChangingConfigurations() {
+        final int SUPER_CONFIG = 1;
+        final int CONTAINED_DRAWABLE_CONFIG = 2;
+
         MockDrawable mockDrawable = new MockDrawable();
         ClipDrawable clipDrawable = new ClipDrawable(mockDrawable,
                 Gravity.BOTTOM, ClipDrawable.HORIZONTAL);
+
         assertEquals(0, clipDrawable.getChangingConfigurations());
 
-        clipDrawable.setChangingConfigurations(1);
-        assertEquals(1, clipDrawable.getChangingConfigurations());
+        mockDrawable.setChangingConfigurations(CONTAINED_DRAWABLE_CONFIG);
+        assertEquals(CONTAINED_DRAWABLE_CONFIG, clipDrawable.getChangingConfigurations());
 
-        mockDrawable.setChangingConfigurations(2);
-        clipDrawable = new ClipDrawable(mockDrawable,
-                Gravity.BOTTOM, ClipDrawable.HORIZONTAL);
-        clipDrawable.setChangingConfigurations(1);
-        assertEquals(3, clipDrawable.getChangingConfigurations());
+        clipDrawable.setChangingConfigurations(SUPER_CONFIG);
+        assertEquals(SUPER_CONFIG | CONTAINED_DRAWABLE_CONFIG,
+                clipDrawable.getChangingConfigurations());
     }
 
     public void testGetConstantState() {
@@ -125,16 +128,28 @@
 
     @SuppressWarnings("deprecation")
     public void testGetOpacity() {
-        BitmapDrawable bmpDrawable =
-            new BitmapDrawable(Bitmap.createBitmap(100, 50, Config.RGB_565));
-        ClipDrawable clipDrawable = new ClipDrawable(bmpDrawable,
-                Gravity.BOTTOM, ClipDrawable.HORIZONTAL);
-        assertEquals(PixelFormat.OPAQUE, clipDrawable.getOpacity());
+        MockDrawable dr;
+        ClipDrawable clipDrawable;
 
-        bmpDrawable = new BitmapDrawable(Bitmap.createBitmap(100, 50, Config.RGB_565));
-        bmpDrawable.setGravity(Gravity.CENTER);
-        clipDrawable = new ClipDrawable(bmpDrawable, Gravity.BOTTOM, ClipDrawable.HORIZONTAL);
-        assertEquals(PixelFormat.TRANSLUCENT, clipDrawable.getOpacity());
+        dr = new MockDrawable();
+        dr.setOpacity(PixelFormat.OPAQUE);
+        clipDrawable = new ClipDrawable(dr, Gravity.BOTTOM, ClipDrawable.HORIZONTAL);
+        clipDrawable.setLevel(0);
+        assertEquals("Fully-clipped opaque drawable is transparent",
+                PixelFormat.TRANSPARENT, clipDrawable.getOpacity());
+        clipDrawable.setLevel(5000);
+        assertEquals("Partially-clipped opaque drawable is translucent",
+                PixelFormat.TRANSLUCENT, clipDrawable.getOpacity());
+        clipDrawable.setLevel(10000);
+        assertEquals("Unclipped opaque drawable is opaque",
+                PixelFormat.OPAQUE, clipDrawable.getOpacity());
+
+        dr = new MockDrawable();
+        dr.setOpacity(PixelFormat.TRANSLUCENT);
+        clipDrawable = new ClipDrawable(dr, Gravity.BOTTOM, ClipDrawable.HORIZONTAL);
+        clipDrawable.setLevel(10000);
+        assertEquals("Unclipped translucent drawable is translucent",
+                PixelFormat.TRANSLUCENT, clipDrawable.getOpacity());
     }
 
     public void testGetPadding() {
@@ -219,7 +234,7 @@
         MockCallback callback = new MockCallback();
         mockClipDrawable.setCallback(callback);
 
-        assertEquals(0, mockDrawable.getLevel());
+        assertEquals("Default level is 0", 0, mockDrawable.getLevel());
         mockClipDrawable.onLevelChange(1000);
         assertEquals(1000, mockDrawable.getLevel());
         assertSame(mockClipDrawable, callback.getInvalidateDrawable());
@@ -232,16 +247,24 @@
     }
 
     public void testOnStateChange() {
-        MockDrawable mockDrawable = new MockDrawable();
-        MockClipDrawable mockClipDrawable = new MockClipDrawable(mockDrawable,
+        Drawable d = mContext.getDrawable(R.drawable.pass);
+        MockClipDrawable clipDrawable = new MockClipDrawable(d,
                 Gravity.BOTTOM, ClipDrawable.HORIZONTAL);
-        assertEquals(StateSet.WILD_CARD, mockDrawable.getState());
+        assertEquals("initial child state is empty", d.getState(), StateSet.WILD_CARD);
 
-        int[] states = new int[] {1, 2, 3};
-        assertFalse(mockClipDrawable.onStateChange(states));
-        assertEquals(states, mockDrawable.getState());
+        int[] state = new int[] {1, 2, 3};
+        assertFalse("child did not change", clipDrawable.onStateChange(state));
+        assertEquals("child state did not change", d.getState(), StateSet.WILD_CARD);
 
-        mockClipDrawable.onStateChange(null);
+        d = mContext.getDrawable(R.drawable.statelistdrawable);
+        clipDrawable = new MockClipDrawable(d, Gravity.BOTTOM, ClipDrawable.HORIZONTAL);
+        assertEquals("initial child state is empty", d.getState(), StateSet.WILD_CARD);
+        clipDrawable.onStateChange(state);
+        assertTrue("child state changed", Arrays.equals(state, d.getState()));
+
+        // input null as param
+        clipDrawable.onStateChange(null);
+        // expected, no Exception thrown out, test success
     }
 
     public void testScheduleDrawable() {
@@ -335,6 +358,7 @@
     private class MockDrawable extends Drawable {
         private ColorFilter mColorFilter;
         private ConstantState mConstantState;
+        private int mOpacity;
         private boolean mCalledDraw = false;
         private int mAlpha;
 
@@ -363,7 +387,11 @@
         }
 
         public int getOpacity() {
-            return 0;
+            return mOpacity;
+        }
+
+        public void setOpacity(int opacity) {
+            mOpacity = opacity;
         }
 
         protected void onBoundsChange(Rect bounds) {
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableContainerTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableContainerTest.java
index 036c756..79d2a1d 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableContainerTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableContainerTest.java
@@ -20,7 +20,6 @@
 
 import java.util.Arrays;
 
-import android.content.res.ColorStateList;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.ColorFilter;
@@ -185,6 +184,44 @@
         assertTrue(dr.hasSetDitherCalled());
     }
 
+    public void testSetHotspotBounds() {
+        Rect bounds = new Rect(10, 15, 100, 150);
+        assertConstantStateNotSet();
+        assertNull(mDrawableContainer.getCurrent());
+
+        mDrawableContainer.setConstantState(mDrawableContainerState);
+
+        MockDrawable dr = new MockDrawable();
+        addAndSelectDrawable(dr);
+
+        dr.reset();
+        mDrawableContainer.setHotspotBounds(bounds.left, bounds.top, bounds.right, bounds.bottom);
+        Rect outRect = new Rect();
+        mDrawableContainer.getHotspotBounds(outRect);
+        assertEquals(bounds, outRect);
+
+        dr.reset();
+    }
+
+    public void testGetHotspotBounds() {
+        Rect bounds = new Rect(10, 15, 100, 150);
+        assertConstantStateNotSet();
+        assertNull(mDrawableContainer.getCurrent());
+
+        mDrawableContainer.setConstantState(mDrawableContainerState);
+
+        MockDrawable dr = new MockDrawable();
+        addAndSelectDrawable(dr);
+
+        dr.reset();
+        mDrawableContainer.setHotspotBounds(bounds.left, bounds.top, bounds.right, bounds.bottom);
+        Rect outRect = new Rect();
+        mDrawableContainer.getHotspotBounds(outRect);
+        assertEquals(bounds, outRect);
+
+        dr.reset();
+    }
+
     public void testSetColorFilter() {
         assertConstantStateNotSet();
         assertNull(mDrawableContainer.getCurrent());
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableStubActivity.java b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableStubActivity.java
new file mode 100644
index 0000000..a7b27b3
--- /dev/null
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableStubActivity.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2015 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.graphics.drawable.cts;
+
+import android.app.Activity;
+
+public class DrawableStubActivity extends Activity {
+}
+
+
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTest.java
index a48372e..a91353f 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTest.java
@@ -16,6 +16,7 @@
 
 package android.graphics.drawable.cts;
 
+import android.view.View;
 import com.android.cts.graphics.R;
 
 import org.xmlpull.v1.XmlPullParser;
@@ -545,6 +546,47 @@
         mockDrawable.setDither(false);
     }
 
+    public void testSetHotspotBounds() {
+        MockDrawable mockDrawable = new MockDrawable();
+
+        // setHotspotBounds is a non-operation function.
+        mockDrawable.setHotspotBounds(10, 15, 100, 150);
+    }
+
+    public void testGetHotspotBounds() {
+        MockDrawable mockDrawable = new MockDrawable();
+
+        // getHotspotBounds doesn't do anything interesting in the Drawable superclass
+        mockDrawable.getHotspotBounds(new Rect());
+    }
+
+    public void testSetLayoutDirection() {
+        MockDrawable mockDrawable = new MockDrawable();
+
+        mockDrawable.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
+        assertEquals(View.LAYOUT_DIRECTION_LTR, mockDrawable.getLayoutDirection());
+
+        mockDrawable.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
+        assertEquals(View.LAYOUT_DIRECTION_RTL, mockDrawable.getLayoutDirection());
+    }
+
+    public void testGetLayoutDirection() {
+        MockDrawable mockDrawable = new MockDrawable();
+
+        mockDrawable.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
+        assertEquals(View.LAYOUT_DIRECTION_LTR, mockDrawable.getLayoutDirection());
+
+        mockDrawable.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
+        assertEquals(View.LAYOUT_DIRECTION_RTL, mockDrawable.getLayoutDirection());
+    }
+
+    public void testOnLayoutDirectionChanged() {
+        MockDrawable mockDrawable = new MockDrawable();
+
+        // onLayoutDirectionChanged is a non-operation function.
+        mockDrawable.onLayoutDirectionChanged(View.LAYOUT_DIRECTION_LTR);
+    }
+
     public void testSetFilterBitmap() {
         MockDrawable mockDrawable = new MockDrawable();
 
@@ -552,6 +594,13 @@
         mockDrawable.setFilterBitmap(false);
     }
 
+    public void testIsFilterBitmap() {
+        MockDrawable mockDrawable = new MockDrawable();
+
+        // setFilterBitmap is a non-operation function.
+        mockDrawable.isFilterBitmap();
+    }
+
     public void testUnscheduleSelf() {
         MockDrawable mockDrawable = new MockDrawable();
         MockCallback mockCallback = new MockCallback();
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableWrapperTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableWrapperTest.java
new file mode 100644
index 0000000..40680c1
--- /dev/null
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableWrapperTest.java
@@ -0,0 +1,549 @@
+/*
+ * Copyright (C) 2015 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.graphics.drawable.cts;
+
+import android.graphics.drawable.DrawableWrapper;
+import com.android.cts.graphics.R;
+
+
+import java.util.Arrays;
+
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.Rect;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Drawable.ConstantState;
+import android.test.AndroidTestCase;
+import android.util.StateSet;
+
+public class DrawableWrapperTest extends AndroidTestCase {
+
+    static class MyWrapper extends DrawableWrapper {
+        public MyWrapper(Drawable dr) {
+            super(dr);
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testConstructor() {
+        Drawable d = new BitmapDrawable();
+        MyWrapper wrapper = new MyWrapper(d);
+        assertSame(d, wrapper.getDrawable());
+
+        new MyWrapper(null);
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testGetDrawable() {
+        Drawable d = new BitmapDrawable();
+        MyWrapper wrapper = new MyWrapper(d);
+        assertSame(d, wrapper.getDrawable());
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testSetDrawable() {
+        Drawable d = new BitmapDrawable();
+        MyWrapper wrapper = new MyWrapper(null);
+        assertSame(null, wrapper.getDrawable());
+
+        wrapper.setDrawable(d);
+        assertSame(d, wrapper.getDrawable());
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testInvalidateDrawable() {
+        MyWrapper wrapper = new MyWrapper(new BitmapDrawable());
+
+        MockCallback cb = new MockCallback();
+        wrapper.setCallback(cb);
+        wrapper.invalidateDrawable(null);
+        assertTrue(cb.hasCalledInvalidate());
+
+        cb.reset();
+        wrapper.invalidateDrawable(new BitmapDrawable());
+        assertTrue(cb.hasCalledInvalidate());
+
+        cb.reset();
+        wrapper.setCallback(null);
+        wrapper.invalidateDrawable(null);
+        assertFalse(cb.hasCalledInvalidate());
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testScheduleDrawable() {
+        MyWrapper wrapper = new MyWrapper(new BitmapDrawable());
+
+        MockCallback cb = new MockCallback();
+        wrapper.setCallback(cb);
+        wrapper.scheduleDrawable(null, null, 0);
+        assertTrue(cb.hasCalledSchedule());
+
+        cb.reset();
+        wrapper.scheduleDrawable(new BitmapDrawable(), new Runnable() {
+            public void run() {
+            }
+        }, 1000L);
+        assertTrue(cb.hasCalledSchedule());
+
+        cb.reset();
+        wrapper.setCallback(null);
+        wrapper.scheduleDrawable(null, null, 0);
+        assertFalse(cb.hasCalledSchedule());
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testUnscheduleDrawable() {
+        MyWrapper wrapper = new MyWrapper(new BitmapDrawable());
+
+        MockCallback cb = new MockCallback();
+        wrapper.setCallback(cb);
+        wrapper.unscheduleDrawable(null, null);
+        assertTrue(cb.hasCalledUnschedule());
+
+        cb.reset();
+        wrapper.unscheduleDrawable(new BitmapDrawable(), new Runnable() {
+            public void run() {
+            }
+        });
+        assertTrue(cb.hasCalledUnschedule());
+
+        cb.reset();
+        wrapper.setCallback(null);
+        wrapper.unscheduleDrawable(null, null);
+        assertFalse(cb.hasCalledUnschedule());
+    }
+
+    private static class MockCallback implements Drawable.Callback {
+        private boolean mCalledInvalidate;
+        private boolean mCalledSchedule;
+        private boolean mCalledUnschedule;
+
+        public void invalidateDrawable(Drawable who) {
+            mCalledInvalidate = true;
+        }
+
+        public void scheduleDrawable(Drawable who, Runnable what, long when) {
+            mCalledSchedule = true;
+        }
+
+        public void unscheduleDrawable(Drawable who, Runnable what) {
+            mCalledUnschedule = true;
+        }
+
+        public boolean hasCalledInvalidate() {
+            return mCalledInvalidate;
+        }
+
+        public boolean hasCalledSchedule() {
+            return mCalledSchedule;
+        }
+
+        public boolean hasCalledUnschedule() {
+            return mCalledUnschedule;
+        }
+
+        public int getResolvedLayoutDirection(Drawable who) {
+            return 0;
+        }
+
+        public void reset() {
+            mCalledInvalidate = false;
+            mCalledSchedule = false;
+            mCalledUnschedule = false;
+        }
+    }
+
+    public void testDraw() {
+        MockDrawable mockDrawable = new MockDrawable();
+        MyWrapper wrapper = new MyWrapper(mockDrawable);
+
+        wrapper.draw(new Canvas());
+        assertTrue(mockDrawable.hasCalledDraw());
+
+        mockDrawable.reset();
+        wrapper.draw(null);
+        assertTrue(mockDrawable.hasCalledDraw());
+    }
+
+    public void testGetChangingConfigurations() {
+        final int SUPER_CONFIG = 1;
+        final int CONTAINED_DRAWABLE_CONFIG = 2;
+
+        MockDrawable mockDrawable = new MockDrawable();
+        MyWrapper wrapper = new MyWrapper(mockDrawable);
+
+        assertEquals(0, wrapper.getChangingConfigurations());
+
+        mockDrawable.setChangingConfigurations(CONTAINED_DRAWABLE_CONFIG);
+        assertEquals(CONTAINED_DRAWABLE_CONFIG, wrapper.getChangingConfigurations());
+
+        wrapper.setChangingConfigurations(SUPER_CONFIG);
+        assertEquals(SUPER_CONFIG | CONTAINED_DRAWABLE_CONFIG,
+                wrapper.getChangingConfigurations());
+    }
+
+    public void testGetPadding() {
+        MockDrawable mockDrawable = new MockDrawable();
+        MyWrapper wrapper = new MyWrapper(mockDrawable);
+
+        // this method will call contained drawable's getPadding method.
+        wrapper.getPadding(new Rect());
+        assertTrue(mockDrawable.hasCalledGetPadding());
+
+        // input null as param
+        try {
+            wrapper.getPadding(null);
+            fail("Should throw NullPointerException");
+        } catch (NullPointerException e) {
+        }
+    }
+
+    public void testSetVisible() {
+        MockDrawable mockDrawable = new MockDrawable();
+        MyWrapper wrapper = new MyWrapper(mockDrawable);
+        assertTrue(wrapper.isVisible());
+
+        assertTrue(wrapper.setVisible(false, false));
+        assertFalse(wrapper.isVisible());
+        assertTrue(mockDrawable.hasCalledSetVisible());
+
+        mockDrawable.reset();
+        assertFalse(wrapper.setVisible(false, false));
+        assertFalse(wrapper.isVisible());
+        assertTrue(mockDrawable.hasCalledSetVisible());
+
+        mockDrawable.reset();
+        assertTrue(wrapper.setVisible(true, false));
+        assertTrue(wrapper.isVisible());
+        assertTrue(mockDrawable.hasCalledSetVisible());
+    }
+
+    public void testSetAlpha() {
+        MockDrawable mockDrawable = new MockDrawable();
+        MyWrapper wrapper = new MyWrapper(mockDrawable);
+
+        // this method will call contained drawable's setAlpha method.
+        wrapper.setAlpha(100);
+        assertTrue(mockDrawable.hasCalledSetAlpha());
+
+        mockDrawable.reset();
+        wrapper.setAlpha(Integer.MAX_VALUE);
+        assertTrue(mockDrawable.hasCalledSetAlpha());
+
+        mockDrawable.reset();
+        wrapper.setAlpha(-1);
+        assertTrue(mockDrawable.hasCalledSetAlpha());
+    }
+
+    public void testSetColorFilter() {
+        MockDrawable mockDrawable = new MockDrawable();
+        MyWrapper wrapper = new MyWrapper(mockDrawable);
+
+        // this method will call contained drawable's setColorFilter method.
+        wrapper.setColorFilter(new ColorFilter());
+        assertTrue(mockDrawable.hasCalledSetColorFilter());
+
+        mockDrawable.reset();
+        wrapper.setColorFilter(null);
+        assertTrue(mockDrawable.hasCalledSetColorFilter());
+    }
+
+    public void testGetOpacity() {
+        MockDrawable mockDrawable = new MockDrawable();
+        MyWrapper wrapper = new MyWrapper(mockDrawable);
+
+        // This method will call contained drawable's getOpacity method.
+        wrapper.setLevel(1);
+        wrapper.getOpacity();
+        assertTrue(mockDrawable.hasCalledGetOpacity());
+    }
+
+    public void testIsStateful() {
+        MockDrawable mockDrawable = new MockDrawable();
+        MyWrapper wrapper = new MyWrapper(mockDrawable);
+
+        // this method will call contained drawable's isStateful method.
+        wrapper.isStateful();
+        assertTrue(mockDrawable.hasCalledIsStateful());
+    }
+
+    public void testOnStateChange() {
+        Drawable d = new MockDrawable();
+        MockDrawableWrapper wrapper = new MockDrawableWrapper(d);
+        assertEquals("initial child state is empty", d.getState(), StateSet.WILD_CARD);
+
+        int[] state = new int[] {1, 2, 3};
+        assertFalse("child did not change", wrapper.onStateChange(state));
+        assertEquals("child state did not change", d.getState(), StateSet.WILD_CARD);
+
+        d = mContext.getDrawable(R.drawable.statelistdrawable);
+        wrapper = new MockDrawableWrapper(d);
+        assertEquals("initial child state is empty", d.getState(), StateSet.WILD_CARD);
+        wrapper.onStateChange(state);
+        assertTrue("child state changed", Arrays.equals(state, d.getState()));
+
+        // input null as param
+        wrapper.onStateChange(null);
+        // expected, no Exception thrown out, test success
+    }
+
+    public void testOnLevelChange() {
+        MockDrawable mockDrawable = new MockDrawable();
+        MockDrawableWrapper mockDrawableWrapper = new MockDrawableWrapper(mockDrawable);
+
+        assertEquals(0, mockDrawable.getLevel());
+        assertFalse(mockDrawableWrapper.onLevelChange(0));
+        assertFalse(mockDrawable.hasCalledOnLevelChange());
+
+        assertFalse(mockDrawableWrapper.onLevelChange(1000));
+        assertTrue(mockDrawable.hasCalledOnLevelChange());
+        assertEquals(1000, mockDrawable.getLevel());
+
+        mockDrawable.reset();
+        mockDrawableWrapper.reset();
+        assertFalse(mockDrawableWrapper.onLevelChange(Integer.MIN_VALUE));
+        assertTrue(mockDrawable.hasCalledOnLevelChange());
+    }
+
+    public void testOnBoundsChange() {
+        MockDrawable mockDrawable = new MockDrawable();
+        MockDrawableWrapper mockDrawableWrapper = new MockDrawableWrapper(mockDrawable);
+        Rect bounds = new Rect(2, 2, 26, 32);
+        mockDrawable.setBounds(bounds);
+        mockDrawableWrapper.onBoundsChange(bounds);
+
+        mockDrawableWrapper = new MockDrawableWrapper(mockDrawable);
+        mockDrawable.setBounds(bounds);
+        mockDrawableWrapper.onBoundsChange(bounds);
+        assertEquals(bounds.left, mockDrawable.getBounds().left);
+        assertEquals(bounds.top, mockDrawable.getBounds().top);
+        assertEquals(bounds.right, mockDrawable.getBounds().right);
+        assertEquals(bounds.bottom, mockDrawable.getBounds().bottom);
+
+        bounds = mockDrawable.getBounds();
+        assertEquals(2, bounds.left);
+        assertEquals(2, bounds.top);
+        assertEquals(26, bounds.right);
+        assertEquals(32, bounds.bottom);
+
+        // input null as param
+        try {
+            mockDrawableWrapper.onBoundsChange(null);
+            fail("There should be a NullPointerException thrown out.");
+        } catch (NullPointerException e) {
+            // expected, test success
+        }
+
+    }
+
+    public void testGetIntrinsicWidth() {
+        MockDrawable mockDrawable = new MockDrawable();
+        MyWrapper wrapper = new MyWrapper(mockDrawable);
+
+        // this method will call contained drawable's getIntrinsicWidth method.
+        wrapper.getIntrinsicWidth();
+        assertTrue(mockDrawable.hasCalledGetIntrinsicWidth());
+    }
+
+    public void testGetIntrinsicHeight() {
+        MockDrawable mockDrawable = new MockDrawable();
+        DrawableWrapper wrapper = new MyWrapper(mockDrawable);
+
+        // this method will call contained drawable's getIntrinsicHeight method.
+        wrapper.getIntrinsicHeight();
+        assertTrue(mockDrawable.hasCalledGetIntrinsicHeight());
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testGetConstantState() {
+        DrawableWrapper wrapper = new MyWrapper(new BitmapDrawable());
+        ConstantState constantState = wrapper.getConstantState();
+    }
+
+    private static class MockDrawable extends Drawable {
+        private boolean mCalledDraw = false;
+        private boolean mCalledGetPadding = false;
+        private boolean mCalledSetVisible = false;
+        private boolean mCalledSetAlpha = false;
+        private boolean mCalledGetOpacity = false;
+        private boolean mCalledSetColorFilter = false;
+        private boolean mCalledIsStateful = false;
+        private boolean mCalledGetIntrinsicWidth = false;
+        private boolean mCalledGetIntrinsicHeight = false;
+        private boolean mCalledSetState = false;
+        private boolean mCalledOnLevelChange = false;
+
+        @Override
+        public void draw(Canvas canvas) {
+            mCalledDraw = true;
+        }
+
+        @Override
+        public int getOpacity() {
+            mCalledGetOpacity = true;
+            return 0;
+        }
+
+        @Override
+        public void setAlpha(int alpha) {
+            mCalledSetAlpha = true;
+        }
+
+        @Override
+        public void setColorFilter(ColorFilter cf) {
+            mCalledSetColorFilter = true;
+        }
+
+        @Override
+        public boolean getPadding(Rect padding) {
+            mCalledGetPadding = true;
+            return super.getPadding(padding);
+        }
+
+        @Override
+        public boolean setVisible(boolean visible, boolean restart) {
+            mCalledSetVisible = true;
+            return super.setVisible(visible, restart);
+        }
+
+        @Override
+        public boolean isStateful() {
+            mCalledIsStateful = true;
+            return super.isStateful();
+        }
+
+        @Override
+        public int getIntrinsicWidth() {
+            mCalledGetIntrinsicWidth = true;
+            return super.getIntrinsicWidth();
+        }
+
+        @Override
+        public int getIntrinsicHeight() {
+            mCalledGetIntrinsicHeight = true;
+            return super.getIntrinsicHeight();
+
+        }
+
+        @Override
+        public boolean setState(final int[] stateSet) {
+            mCalledSetState = true;
+            return super.setState(stateSet);
+        }
+
+        @Override
+        protected boolean onLevelChange(int level) {
+            mCalledOnLevelChange = true;
+            return super.onLevelChange(level);
+        }
+
+        public boolean hasCalledDraw() {
+            return mCalledDraw;
+        }
+
+        public boolean hasCalledGetPadding() {
+            return mCalledGetPadding;
+        }
+
+        public boolean hasCalledSetVisible() {
+            return mCalledSetVisible;
+        }
+
+        public boolean hasCalledSetAlpha() {
+            return mCalledSetAlpha;
+        }
+
+        public boolean hasCalledGetOpacity() {
+            return mCalledGetOpacity;
+        }
+
+        public boolean hasCalledSetColorFilter() {
+            return mCalledSetColorFilter;
+        }
+
+        public boolean hasCalledIsStateful() {
+            return mCalledIsStateful;
+        }
+
+        public boolean hasCalledGetIntrinsicWidth() {
+            return mCalledGetIntrinsicWidth;
+        }
+
+        public boolean hasCalledGetIntrinsicHeight() {
+            return mCalledGetIntrinsicHeight;
+        }
+
+        public boolean hasCalledSetState() {
+            return mCalledSetState;
+        }
+
+        public boolean hasCalledOnLevelChange() {
+            return mCalledOnLevelChange;
+        }
+
+        public void reset() {
+            mCalledDraw = false;
+            mCalledGetPadding = false;
+            mCalledSetVisible = false;
+            mCalledSetAlpha = false;
+            mCalledGetOpacity = false;
+            mCalledSetColorFilter = false;
+            mCalledIsStateful = false;
+            mCalledGetIntrinsicWidth = false;
+            mCalledGetIntrinsicHeight = false;
+            mCalledSetState = false;
+            mCalledOnLevelChange = false;
+        }
+    }
+
+    private static class MockDrawableWrapper extends DrawableWrapper {
+        private boolean mCalledOnBoundsChange = false;
+
+        MockDrawableWrapper() {
+            super(null);
+        }
+
+        public MockDrawableWrapper(Drawable drawable) {
+            super(drawable);
+        }
+
+        @Override
+        protected boolean onStateChange(int[] state) {
+            return super.onStateChange(state);
+        }
+
+        @Override
+        protected boolean onLevelChange(int level) {
+            return super.onLevelChange(level);
+        }
+
+        @Override
+        protected void onBoundsChange(Rect bounds) {
+            mCalledOnBoundsChange = true;
+            super.onBoundsChange(bounds);
+        }
+
+        public boolean hasCalledOnBoundsChange() {
+            return mCalledOnBoundsChange;
+        }
+
+        public void reset() {
+            mCalledOnBoundsChange = false;
+        }
+    }
+}
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java
index e7a38c5..eeda22c 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java
@@ -22,10 +22,8 @@
 import org.xmlpull.v1.XmlPullParserException;
 
 import android.content.res.Resources;
-import android.content.res.Resources.Theme;
 import android.graphics.Canvas;
 import android.graphics.ColorFilter;
-import android.graphics.PixelFormat;
 import android.graphics.Rect;
 import android.graphics.drawable.GradientDrawable;
 import android.graphics.drawable.Drawable.ConstantState;
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/IconTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/IconTest.java
new file mode 100644
index 0000000..d89ce7c
--- /dev/null
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/IconTest.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2015 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.graphics.drawable.cts;
+
+import com.android.cts.graphics.R;
+
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.content.res.ColorStateList;
+import android.graphics.Bitmap;
+import android.graphics.cts.ImageViewCtsActivity;
+import android.graphics.drawable.Icon;
+import android.graphics.drawable.Drawable;
+import android.graphics.Color;
+import android.graphics.PorterDuff;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Parcel;
+import android.test.ActivityInstrumentationTestCase2;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class IconTest extends ActivityInstrumentationTestCase2<ImageViewCtsActivity> {
+    static final long TIMEOUT = 1000;
+
+    Activity mActivity;
+    Instrumentation mInstrumentation;
+    Icon mIcon;
+
+    MockOnDrawableLoadedListener mListener;
+    MockRunner mRunner;
+
+    public IconTest() {
+        super("com.android.cts.graphics", ImageViewCtsActivity.class);
+    }
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+        mInstrumentation = getInstrumentation();
+    }
+
+    public void testBitmapIcon() {
+        checkIconValidity(
+                Icon.createWithBitmap(Bitmap.createBitmap(16, 16, Bitmap.Config.ARGB_8888)));
+    }
+
+    public void testDataIcon() {
+        byte[] data = new byte[4];
+        data[0] = data[1] = data[2] = data[3] = (byte)255;
+        checkIconValidity(Icon.createWithData(data, 0, 4));
+    }
+
+    public void testFileIcon() throws IOException {
+        File file = new File(mActivity.getFilesDir(), "testimage.jpg");
+        try {
+            writeSampleImage(file);
+            assertTrue(file.exists());
+
+            checkIconValidity(Icon.createWithFilePath(file.getPath()));
+
+            checkIconValidity(Icon.createWithContentUri(Uri.fromFile(file)));
+
+            checkIconValidity(Icon.createWithContentUri(file.toURI().toString()));
+        } finally {
+            file.delete();
+        }
+    }
+
+    public void testResourceIcon() {
+        checkIconValidity(Icon.createWithResource(mActivity, R.drawable.bmp_test));
+
+        checkIconValidity(Icon.createWithResource(mActivity.getPackageName(), R.drawable.bmp_test));
+    }
+
+    public void testLoadDrawableAsync() {
+        mIcon = Icon.createWithBitmap(Bitmap.createBitmap(16, 16, Bitmap.Config.ARGB_8888));
+
+        mListener = new MockOnDrawableLoadedListener();
+        mInstrumentation.runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mIcon.loadDrawableAsync(mActivity, mListener, new Handler());
+            }
+        });
+        sleep(TIMEOUT);
+
+        assertEquals(1, mListener.getLoadedCount());
+    }
+
+    public void testLoadDrawableAsyncWithMessage() {
+        mIcon = Icon.createWithBitmap(Bitmap.createBitmap(16, 16, Bitmap.Config.ARGB_8888));
+
+        mRunner = new MockRunner();
+        mInstrumentation.runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mIcon.loadDrawableAsync(mActivity, Message.obtain(new Handler(), mRunner));
+            }
+        });
+        sleep(TIMEOUT);
+
+        assertEquals(1, mRunner.getRunCount());
+    }
+
+    class MockOnDrawableLoadedListener implements Icon.OnDrawableLoadedListener {
+        int mLoadedCount;
+
+        @Override
+        public void onDrawableLoaded(Drawable d) {
+            assertNotNull(d);
+            ++mLoadedCount;
+        }
+
+        int getLoadedCount() { return mLoadedCount; }
+    }
+
+    class MockRunner implements Runnable {
+        int mRun;
+
+        @Override
+        public void run() {
+            ++mRun;
+        }
+
+        int getRunCount() { return mRun; }
+    };
+
+    private void sleep(long time) {
+        try {
+            Thread.sleep(time);
+        } catch (InterruptedException e) {
+            fail(e.getMessage());
+        }
+    }
+
+    private void writeSampleImage(File imagefile) throws IOException {
+        InputStream source = null;
+        OutputStream target = null;
+
+        try {
+            source = mActivity.getResources().openRawResource(R.drawable.testimage);
+            target = new FileOutputStream(imagefile);
+
+            byte[] buffer = new byte[1024];
+            for (int len = source.read(buffer); len >= 0; len = source.read(buffer)) {
+                target.write(buffer, 0, len);
+            }
+        } finally {
+            if (target != null) {
+                target.close();
+            }
+
+            if (source != null) {
+                source.close();
+            }
+        }
+    }
+
+    // Check if the created icon is valid and doesn't cause crashes for the public methods.
+    private void checkIconValidity(Icon icon) {
+        assertNotNull(icon);
+
+        // tint properties.
+        icon.setTint(Color.BLUE);
+        icon.setTintList(ColorStateList.valueOf(Color.RED));
+        icon.setTintMode(PorterDuff.Mode.XOR);
+
+        // Parcelable methods.
+        icon.describeContents();
+        Parcel parcel = Parcel.obtain();
+        icon.writeToParcel(parcel, 0);
+
+        parcel.setDataPosition(0);
+        assertNotNull(Icon.CREATOR.createFromParcel(parcel));
+
+        // loading drawable synchronously.
+        assertNotNull(icon.loadDrawable(mActivity));
+    }
+}
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/InsetDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/InsetDrawableTest.java
index 1edd36e..9c5f063 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/InsetDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/InsetDrawableTest.java
@@ -18,7 +18,6 @@
 
 import com.android.cts.graphics.R;
 
-
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -32,13 +31,16 @@
 import android.graphics.drawable.Drawable.ConstantState;
 import android.test.AndroidTestCase;
 import android.util.AttributeSet;
+import android.util.StateSet;
 import android.util.Xml;
 
 import java.io.IOException;
+import java.util.Arrays;
 
 public class InsetDrawableTest extends AndroidTestCase {
+
     public void testConstructor() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         new InsetDrawable(d, 1);
         new InsetDrawable(d, 1, 1, 1, 1);
 
@@ -47,8 +49,7 @@
     }
 
     public void testInflate() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
-        InsetDrawable insetDrawable = new InsetDrawable(d, 0);
+        InsetDrawable insetDrawable = new InsetDrawable(null, 0);
 
         Resources r = mContext.getResources();
         XmlPullParser parser = r.getXml(R.layout.framelayout_layout);
@@ -77,14 +78,14 @@
     }
 
     public void testInvalidateDrawable() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         insetDrawable.invalidateDrawable(d);
     }
 
     public void testScheduleDrawable() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         Runnable runnable = new Runnable() {
@@ -99,7 +100,7 @@
     }
 
     public void testUnscheduleDrawable() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         Runnable runnable = new Runnable() {
@@ -114,7 +115,7 @@
     }
 
     public void testDraw() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         Canvas c = new Canvas();
@@ -130,7 +131,7 @@
     }
 
     public void testGetChangingConfigurations() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         insetDrawable.setChangingConfigurations(11);
@@ -141,7 +142,7 @@
     }
 
     public void testGetPadding() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 1, 2, 3, 4);
 
         Rect r = new Rect();
@@ -183,7 +184,7 @@
     }
 
     public void testSetVisible() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         assertFalse(insetDrawable.setVisible(true, true)); /* unchanged */
@@ -192,7 +193,7 @@
     }
 
     public void testSetAlpha() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         insetDrawable.setAlpha(1);
@@ -204,7 +205,7 @@
     }
 
     public void testSetColorFilter() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         ColorFilter cf = new ColorFilter();
@@ -216,7 +217,7 @@
     }
 
     public void testGetOpacity() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.testimage);
+        Drawable d = mContext.getDrawable(R.drawable.testimage);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
         insetDrawable.setAlpha(255);
         assertEquals(PixelFormat.OPAQUE, insetDrawable.getOpacity());
@@ -226,28 +227,25 @@
     }
 
     public void testIsStateful() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
         assertFalse(insetDrawable.isStateful());
     }
 
     public void testOnStateChange() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         MockInsetDrawable insetDrawable = new MockInsetDrawable(d, 10);
-
-        Rect bounds = d.getBounds();
-        assertEquals(0, bounds.left);
-        assertEquals(0, bounds.top);
-        assertEquals(0, bounds.right);
-        assertEquals(0, bounds.bottom);
+        assertEquals("initial child state is empty", d.getState(), StateSet.WILD_CARD);
 
         int[] state = new int[] {1, 2, 3};
-        assertFalse(insetDrawable.onStateChange(state));
+        assertFalse("child did not change", insetDrawable.onStateChange(state));
+        assertEquals("child state did not change", d.getState(), StateSet.WILD_CARD);
 
-        assertEquals(10, bounds.left);
-        assertEquals(10, bounds.top);
-        assertEquals(-10, bounds.right);
-        assertEquals(-10, bounds.bottom);
+        d = mContext.getDrawable(R.drawable.statelistdrawable);
+        insetDrawable = new MockInsetDrawable(d, 10);
+        assertEquals("initial child state is empty", d.getState(), StateSet.WILD_CARD);
+        insetDrawable.onStateChange(state);
+        assertTrue("child state changed", Arrays.equals(state, d.getState()));
 
         // input null as param
         insetDrawable.onStateChange(null);
@@ -255,7 +253,7 @@
     }
 
     public void testOnBoundsChange() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         MockInsetDrawable insetDrawable = new MockInsetDrawable(d, 5);
 
         Rect bounds = d.getBounds();
@@ -282,13 +280,13 @@
     }
 
     public void testGetIntrinsicWidth() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         int expected = d.getIntrinsicWidth(); /* 31 */
         assertEquals(expected, insetDrawable.getIntrinsicWidth());
 
-        d = mContext.getResources().getDrawable(R.drawable.scenery);
+        d = mContext.getDrawable(R.drawable.scenery);
         insetDrawable = new InsetDrawable(d, 0);
 
         expected = d.getIntrinsicWidth(); /* 170 */
@@ -296,13 +294,13 @@
     }
 
     public void testGetIntrinsicHeight() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         int expected = d.getIntrinsicHeight(); /* 31 */
         assertEquals(expected, insetDrawable.getIntrinsicHeight());
 
-        d = mContext.getResources().getDrawable(R.drawable.scenery);
+        d = mContext.getDrawable(R.drawable.scenery);
         insetDrawable = new InsetDrawable(d, 0);
 
         expected = d.getIntrinsicHeight(); /* 107 */
@@ -310,13 +308,31 @@
     }
 
     public void testGetConstantState() {
-        Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
+        Drawable d = mContext.getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
 
         ConstantState constantState = insetDrawable.getConstantState();
         assertNotNull(constantState);
     }
 
+    public void testMutate() {
+        // Obtain the first instance, then mutate and modify a property held by
+        // constant state. If mutate() works correctly, the property should not
+        // be modified on the second or third instances.
+        Resources res = mContext.getResources();
+        InsetDrawable first = (InsetDrawable) res.getDrawable(R.drawable.inset_mutate, null);
+        InsetDrawable pre = (InsetDrawable) res.getDrawable(R.drawable.inset_mutate, null);
+
+        first.mutate().setAlpha(128);
+
+        assertEquals("Modified first loaded instance", 128, first.getDrawable().getAlpha());
+        assertEquals("Did not modify pre-mutate() instance", 255, pre.getDrawable().getAlpha());
+
+        InsetDrawable post = (InsetDrawable) res.getDrawable(R.drawable.inset_mutate, null);
+
+        assertEquals("Did not modify post-mutate() instance", 255, post.getDrawable().getAlpha());
+    }
+
     private class MockInsetDrawable extends InsetDrawable {
         public MockInsetDrawable(Drawable drawable, int inset) {
             super(drawable, inset);
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
index 5aa3083..a2f9ddf 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
@@ -16,14 +16,13 @@
 
 package android.graphics.drawable.cts;
 
+import android.view.Gravity;
 import com.android.cts.graphics.R;
 
 import org.xmlpull.v1.XmlPullParserException;
 
 import java.io.IOException;
 
-import android.R.attr;
-import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
 import android.graphics.Canvas;
 import android.graphics.Color;
@@ -45,6 +44,7 @@
 import android.view.View;
 
 public class LayerDrawableTest extends AndroidTestCase {
+
     @SuppressWarnings("deprecation")
     public void testConstructor() {
         Drawable bitmapDrawable = new BitmapDrawable();
@@ -60,9 +60,9 @@
         assertEquals(0, layerDrawable.getNumberOfLayers());
 
         try {
-            new LayerDrawable((Drawable[]) null);
-            fail("Should throw NullPointerException");
-        } catch (NullPointerException e) {
+            new LayerDrawable(null);
+            fail("Should throw IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
         }
     }
 
@@ -77,7 +77,7 @@
 
         assertEquals(4, layerDrawable.getNumberOfLayers());
         assertEquals(ColorDrawable.class, layerDrawable.getDrawable(0).getClass());
-        assertEquals(0x88, (((ColorDrawable) layerDrawable.getDrawable(0)).getAlpha()));
+        assertEquals(0x88, layerDrawable.getDrawable(0).getAlpha());
         assertEquals(View.NO_ID, layerDrawable.getId(0));
         assertEquals(BitmapDrawable.class, layerDrawable.getDrawable(1).getClass());
         assertEquals(View.NO_ID, layerDrawable.getId(1));
@@ -236,6 +236,27 @@
     }
 
     @SuppressWarnings("deprecation")
+    public void testSetDrawableByLayerId() {
+        Drawable layer1A  = new ColorDrawable(Color.RED);
+        Drawable layer2A  = new ColorDrawable(Color.BLUE);
+        LayerDrawable layerDrawable = new LayerDrawable(new Drawable[] { layer1A, layer2A });
+        layerDrawable.setId(0, 10);
+        layerDrawable.setId(1, 20);
+
+        Drawable layer1B = new ColorDrawable(Color.GREEN);
+        layer1B.setLevel(10000);
+        Drawable layer2B = new ColorDrawable(Color.YELLOW);
+        layer2B.setLevel(5000);
+        layerDrawable.setDrawableByLayerId(10, layer1B);
+        layerDrawable.setDrawableByLayerId(20, layer2B);
+
+        assertEquals("Level is unchanged after setDrawableByLayerId()",
+                10000, layerDrawable.findDrawableByLayerId(10).getLevel());
+        assertEquals("Level is unchanged after setDrawableByLayerId()",
+                5000, layerDrawable.findDrawableByLayerId(20).getLevel());
+    }
+
+    @SuppressWarnings("deprecation")
     public void testSetLayerInset() {
         Drawable[] array = new Drawable[] { new BitmapDrawable(), new ColorDrawable(Color.BLUE) };
         LayerDrawable layerDrawable = new LayerDrawable(array);
@@ -481,6 +502,32 @@
         assertTrue(mockDrawable2.hasCalledSetDither());
     }
 
+    public void testSetHotspotBounds() {
+        Rect bounds = new Rect(10, 15, 100, 150);
+        MockDrawable mockDrawable1 = new MockDrawable();
+        MockDrawable mockDrawable2 = new MockDrawable();
+        Drawable[] array = new Drawable[] { mockDrawable1, mockDrawable2 };
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        layerDrawable.setHotspotBounds(bounds.left, bounds.top, bounds.right, bounds.bottom);
+        Rect outRect = new Rect();
+        layerDrawable.getHotspotBounds(outRect);
+        assertTrue(bounds.equals(outRect));
+    }
+
+    public void testGetHotspotBounds() {
+        Rect bounds = new Rect(10, 15, 100, 150);
+        MockDrawable mockDrawable1 = new MockDrawable();
+        MockDrawable mockDrawable2 = new MockDrawable();
+        Drawable[] array = new Drawable[] { mockDrawable1, mockDrawable2 };
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        layerDrawable.setHotspotBounds(bounds.left, bounds.top, bounds.right, bounds.bottom);
+        Rect outRect = new Rect();
+        layerDrawable.getHotspotBounds(outRect);
+        assertTrue(bounds.equals(outRect));
+    }
+
     public void testSetAlpha() {
         MockDrawable mockDrawable1 = new MockDrawable();
         MockDrawable mockDrawable2 = new MockDrawable();
@@ -556,70 +603,85 @@
         assertTrue(layerDrawable.isStateful());
     }
 
-    public void testOnStateChange() {
+    public void testSetState() {
         MockDrawable mockDrawable1 = new MockDrawable(true);
         MockDrawable mockDrawable2 = new MockDrawable(true);
         Drawable[] array = new Drawable[] { mockDrawable1, mockDrawable2 };
-        MockLayerDrawable layerDrawable = new MockLayerDrawable(array);
+        LayerDrawable layerDrawable = new LayerDrawable(array);
 
-        // this method will call each child's setState().
-        assertFalse(layerDrawable.onStateChange(StateSet.WILD_CARD));
-        assertTrue(mockDrawable1.hasCalledSetState());
-        assertTrue(mockDrawable2.hasCalledSetState());
-        assertTrue(layerDrawable.hasCalledOnBoundsChange());
+        // Call onStateChange() without actually changing the state.
+        assertFalse(layerDrawable.setState(StateSet.WILD_CARD));
+        assertFalse(mockDrawable1.hasCalledSetState());
+        assertFalse(mockDrawable2.hasCalledSetState());
+        assertFalse(mockDrawable1.hasCalledOnBoundsChange());
+        assertFalse(mockDrawable2.hasCalledOnBoundsChange());
 
+        // Call onStateChange() to change the state from WILD_CARD to null.
+        // This alters the padding of both layers, which forces a bounds change
+        // for the second layer due to the default "nest" padding mode.
         mockDrawable1.reset();
         mockDrawable2.reset();
-        layerDrawable.reset();
-        assertTrue(layerDrawable.onStateChange(null));
+        assertTrue(layerDrawable.setState(null));
         assertTrue(mockDrawable1.hasCalledSetState());
         assertTrue(mockDrawable2.hasCalledSetState());
-        assertTrue(layerDrawable.hasCalledOnBoundsChange());
+        assertFalse(mockDrawable1.hasCalledOnBoundsChange());
+        assertTrue(mockDrawable2.hasCalledOnBoundsChange());
 
+        // Call onStateChange() to change the state from null to valid state
+        // set. This alters the padding of both layers, which forces a bounds
+        // change for the second layer due to the default "nest" padding mode.
         mockDrawable1.reset();
         mockDrawable2.reset();
-        layerDrawable.reset();
-        assertTrue(layerDrawable.onStateChange(new int[] { attr.state_checked, attr.state_empty }));
+        assertTrue(layerDrawable.setState(new int[]{
+                android.R.attr.state_checked, android.R.attr.state_empty}));
         assertTrue(mockDrawable1.hasCalledSetState());
         assertTrue(mockDrawable2.hasCalledSetState());
-        assertTrue(layerDrawable.hasCalledOnBoundsChange());
+        assertFalse(mockDrawable1.hasCalledOnBoundsChange());
+        assertTrue(mockDrawable2.hasCalledOnBoundsChange());
     }
 
-    public void testOnLevelChange() {
+    public void testSetLevel() {
         MockDrawable mockDrawable1 = new MockDrawable();
         MockDrawable mockDrawable2 = new MockDrawable();
         Drawable[] array = new Drawable[] { mockDrawable1, mockDrawable2 };
-        MockLayerDrawable layerDrawable = new MockLayerDrawable(array);
+        LayerDrawable layerDrawable = new LayerDrawable(array);
 
-        // this method will call each child's setLevel(),
-        // but just when set a different level the child's onLevelChange will be called.
-        assertFalse(layerDrawable.onLevelChange(0));
+        // Call onLevelChange() without actually changing the level.
+        assertFalse(layerDrawable.setLevel(0));
         assertFalse(mockDrawable1.hasCalledOnLevelChange());
         assertFalse(mockDrawable2.hasCalledOnLevelChange());
-        assertFalse(layerDrawable.hasCalledOnBoundsChange());
+        assertFalse(mockDrawable1.hasCalledOnBoundsChange());
+        assertFalse(mockDrawable2.hasCalledOnBoundsChange());
 
+        // Call onLevelChange() to change the level from 0 to MAX_VALUE. This
+        // alters the padding of both layers, which forces a bounds change for
+        // the second layer due to the default "nest" padding mode.
         mockDrawable1.reset();
         mockDrawable2.reset();
-        layerDrawable.reset();
-        assertTrue(layerDrawable.onLevelChange(Integer.MAX_VALUE));
+        assertTrue(layerDrawable.setLevel(Integer.MAX_VALUE));
         assertTrue(mockDrawable1.hasCalledOnLevelChange());
         assertTrue(mockDrawable2.hasCalledOnLevelChange());
-        assertTrue(layerDrawable.hasCalledOnBoundsChange());
+        assertFalse(mockDrawable1.hasCalledOnBoundsChange());
+        assertTrue(mockDrawable2.hasCalledOnBoundsChange());
 
+        // Call onLevelChange() to change the level from MAX_VALUE to
+        // MIN_VALUE. This alters the padding of both layers, which forces a
+        // bounds change for the second layer due to the default "nest" padding
+        // mode.
         mockDrawable1.reset();
         mockDrawable2.reset();
-        layerDrawable.reset();
-        assertTrue(layerDrawable.onLevelChange(Integer.MIN_VALUE));
+        assertTrue(layerDrawable.setLevel(Integer.MIN_VALUE));
         assertTrue(mockDrawable1.hasCalledOnLevelChange());
         assertTrue(mockDrawable2.hasCalledOnLevelChange());
-        assertTrue(layerDrawable.hasCalledOnBoundsChange());
+        assertFalse(mockDrawable1.hasCalledOnBoundsChange());
+        assertTrue(mockDrawable2.hasCalledOnBoundsChange());
     }
 
-    public void testOnBoundsChange() {
+    public void testSetBounds() {
         MockDrawable mockDrawable1 = new MockDrawable();
         MockDrawable mockDrawable2 = new MockDrawable();
         Drawable[] array = new Drawable[] { mockDrawable1, mockDrawable2 };
-        MockLayerDrawable layerDrawable = new MockLayerDrawable(array);
+        LayerDrawable layerDrawable = new LayerDrawable(array);
 
         Rect inset1 = new Rect(1, 2, 3, 4);
         Rect inset2 = new Rect(2, 4, 6, 7);
@@ -642,7 +704,7 @@
         assertEquals(0, mockDrawable2.getBounds().bottom);
 
         Rect bounds = new Rect(10, 20, 30, 40);
-        layerDrawable.onBoundsChange(bounds);
+        layerDrawable.setBounds(bounds);
 
         // all children's bounds will be changed after call onBoundsChange
         assertEquals(bounds.left + inset1.left, mockDrawable1.getBounds().left);
@@ -661,7 +723,7 @@
         MockDrawable mockDrawable1 = new MockDrawable();
         MockDrawable mockDrawable2 = new MockDrawable();
         Drawable[] array = new Drawable[] { mockDrawable1, mockDrawable2 };
-        MockLayerDrawable layerDrawable = new MockLayerDrawable(array);
+        LayerDrawable layerDrawable = new LayerDrawable(array);
         assertEquals(mockDrawable1.getIntrinsicWidth(), layerDrawable.getIntrinsicWidth());
 
         Rect inset1 = new Rect(1, 2, 3, 4);
@@ -688,7 +750,7 @@
         MockDrawable mockDrawable1 = new MockDrawable();
         MockDrawable mockDrawable2 = new MockDrawable();
         Drawable[] array = new Drawable[] { mockDrawable1, mockDrawable2 };
-        MockLayerDrawable layerDrawable = new MockLayerDrawable(array);
+        LayerDrawable layerDrawable = new LayerDrawable(array);
         assertEquals(mockDrawable1.getIntrinsicHeight(), layerDrawable.getIntrinsicHeight());
 
         Rect inset1 = new Rect(1, 2, 3, 4);
@@ -725,6 +787,611 @@
         assertEquals(1, constantState.getChangingConfigurations());
     }
 
+    @SuppressWarnings("deprecation")
+    public void testAddLayer() {
+        Drawable[] array = new Drawable[] { new BitmapDrawable(), new ColorDrawable(Color.BLUE) };
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+        BitmapDrawable newDrawable = new BitmapDrawable();
+        int index = layerDrawable.addLayer(newDrawable);
+
+        final int numLayers = layerDrawable.getNumberOfLayers();
+        assertEquals(index, numLayers - 1);
+        assertEquals(newDrawable, layerDrawable.getDrawable(index));
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testGetDrawable() {
+        Drawable[] array = new Drawable[] { new BitmapDrawable(), new ColorDrawable(Color.BLUE) };
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        final int numLayers = layerDrawable.getNumberOfLayers();
+        assertEquals(array[0], layerDrawable.getDrawable(0));
+        assertEquals(array[1], layerDrawable.getDrawable(1));
+        try {
+            assertEquals(null, layerDrawable.getDrawable(2));
+            fail("Should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testFindIndexByLayerId() {
+        Drawable[] array = new Drawable[] { new BitmapDrawable(), new ColorDrawable(Color.BLUE) };
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        layerDrawable.setId(0, 10);
+        layerDrawable.setId(1, 20);
+
+        assertEquals(0, layerDrawable.findIndexByLayerId(10));
+        assertEquals(1, layerDrawable.findIndexByLayerId(20));
+        assertEquals(-1, layerDrawable.findIndexByLayerId(30));
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testSetDrawable() {
+        Drawable[] array = new Drawable[]{new BitmapDrawable(), new ColorDrawable(Color.BLUE)};
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+        BitmapDrawable newBitmapDrawable = new BitmapDrawable();
+        ColorDrawable newColorDrawable = new ColorDrawable(Color.GREEN);
+        layerDrawable.setDrawable(0, newColorDrawable);
+        layerDrawable.setDrawable(1, newBitmapDrawable);
+
+        final int numLayers = layerDrawable.getNumberOfLayers();
+        assertEquals(2, numLayers);
+        assertEquals(newColorDrawable, layerDrawable.getDrawable(0));
+        assertEquals(newBitmapDrawable, layerDrawable.getDrawable(1));
+        try {
+            assertEquals(null, layerDrawable.getDrawable(2));
+            fail("Should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testGetLeftPadding() {
+        Drawable[] array = new Drawable[]{new BitmapDrawable()};
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+        layerDrawable.setPadding(10, 11, 20, 21);
+
+        assertEquals(10, layerDrawable.getLeftPadding());
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testGetTopPadding() {
+        Drawable[] array = new Drawable[]{new BitmapDrawable()};
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+        layerDrawable.setPadding(10, 11, 20, 21);
+
+        assertEquals(11, layerDrawable.getTopPadding());
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testGetRightPadding() {
+        Drawable[] array = new Drawable[]{new BitmapDrawable()};
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+        layerDrawable.setPadding(10, 11, 20, 21);
+
+        assertEquals(20, layerDrawable.getRightPadding());
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testGetBottomPadding() {
+        Drawable[] array = new Drawable[]{new BitmapDrawable()};
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+        layerDrawable.setPadding(10, 11, 20, 21);
+
+        assertEquals(21, layerDrawable.getBottomPadding());
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testGetStartPadding() {
+        Drawable[] array = new Drawable[]{new BitmapDrawable()};
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+        layerDrawable.setPadding(10, 11, 20, 21);
+
+        assertEquals(-1, layerDrawable.getStartPadding());
+        layerDrawable.setPaddingRelative(10, 11, 20, 21);
+        assertEquals(10, layerDrawable.getStartPadding());
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testGetEndPadding() {
+        Drawable[] array = new Drawable[]{new BitmapDrawable()};
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+        layerDrawable.setPadding(10, 11, 20, 21);
+
+        assertEquals(-1, layerDrawable.getEndPadding());
+        layerDrawable.setPaddingRelative(10, 11, 20, 21);
+        assertEquals(20, layerDrawable.getEndPadding());
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testSetPadding() {
+        Drawable[] array = new Drawable[]{new BitmapDrawable()};
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+        layerDrawable.setPadding(10, 11, 20, 21);
+
+        assertEquals(10, layerDrawable.getLeftPadding());
+        assertEquals(11, layerDrawable.getTopPadding());
+        assertEquals(20, layerDrawable.getRightPadding());
+        assertEquals(21, layerDrawable.getBottomPadding());
+        assertEquals(-1, layerDrawable.getStartPadding());
+        assertEquals(-1, layerDrawable.getEndPadding());
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testSetPaddingRelative() {
+        Drawable[] array = new Drawable[]{new BitmapDrawable()};
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+        layerDrawable.setPaddingRelative(10, 11, 20, 21);
+
+        assertEquals(10, layerDrawable.getStartPadding());
+        assertEquals(11, layerDrawable.getTopPadding());
+        assertEquals(20, layerDrawable.getEndPadding());
+        assertEquals(21, layerDrawable.getBottomPadding());
+        assertEquals(-1, layerDrawable.getLeftPadding());
+        assertEquals(-1, layerDrawable.getRightPadding());
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testSetLayerGravity() {
+        Drawable[] array = new Drawable[]{new BitmapDrawable(), new ColorDrawable(Color.BLUE)};
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        layerDrawable.setLayerGravity(0, Gravity.CENTER);
+        layerDrawable.setLayerGravity(1, Gravity.NO_GRAVITY);
+
+        try {
+            layerDrawable.setLayerGravity(2, Gravity.TOP);
+            fail("Should throw ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException e) {
+        }
+        assertEquals(Gravity.CENTER, layerDrawable.getLayerGravity(0));
+        assertEquals(Gravity.NO_GRAVITY, layerDrawable.getLayerGravity(1));
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testGetLayerGravity() {
+        Drawable[] array = new Drawable[]{new BitmapDrawable(), new ColorDrawable(Color.BLUE)};
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        layerDrawable.setLayerGravity(0, Gravity.CENTER);
+        layerDrawable.setLayerGravity(1, Gravity.NO_GRAVITY);
+
+        assertEquals(Gravity.CENTER, layerDrawable.getLayerGravity(0));
+        assertEquals(Gravity.NO_GRAVITY, layerDrawable.getLayerGravity(1));
+        try {
+            layerDrawable.getLayerGravity(2);
+            fail("Should throw ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException e) {
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testSetLayerWidth() {
+        Drawable[] array = new Drawable[]{new BitmapDrawable(), new ColorDrawable(Color.BLUE)};
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        layerDrawable.setLayerWidth(0, 100);
+        layerDrawable.setLayerWidth(1, 200);
+
+        try {
+            layerDrawable.setLayerWidth(2, 300);
+            fail("Should throw ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException e) {
+        }
+        assertEquals(100, layerDrawable.getLayerWidth(0));
+        assertEquals(200, layerDrawable.getLayerWidth(1));
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testGetLayerWidth() {
+        Drawable[] array = new Drawable[]{new BitmapDrawable(), new ColorDrawable(Color.BLUE)};
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        layerDrawable.setLayerWidth(0, 100);
+        layerDrawable.setLayerWidth(1, 200);
+
+        assertEquals(100, layerDrawable.getLayerWidth(0));
+        assertEquals(200, layerDrawable.getLayerWidth(1));
+        try {
+            layerDrawable.getLayerWidth(2);
+            fail("Should throw ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException e) {
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testSetLayerHeight() {
+        Drawable[] array = new Drawable[]{new BitmapDrawable(), new ColorDrawable(Color.BLUE)};
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        layerDrawable.setLayerHeight(0, 100);
+        layerDrawable.setLayerHeight(1, 200);
+
+        try {
+            layerDrawable.setLayerHeight(2, 300);
+            fail("Should throw ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException e) {
+        }
+        assertEquals(100, layerDrawable.getLayerHeight(0));
+        assertEquals(200, layerDrawable.getLayerHeight(1));
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testGetLayerHeight() {
+        Drawable[] array = new Drawable[]{new BitmapDrawable(), new ColorDrawable(Color.BLUE)};
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        layerDrawable.setLayerHeight(0, 100);
+        layerDrawable.setLayerHeight(1, 200);
+
+        assertEquals(100, layerDrawable.getLayerHeight(0));
+        assertEquals(200, layerDrawable.getLayerHeight(1));
+        try {
+            layerDrawable.getLayerHeight(2);
+            fail("Should throw ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException e) {
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testSetLayerSize() {
+        Drawable[] array = new Drawable[]{new BitmapDrawable(), new ColorDrawable(Color.BLUE)};
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        layerDrawable.setLayerSize(0, 100, 200);
+        layerDrawable.setLayerSize(1, 300, 400);
+
+        try {
+            layerDrawable.setLayerSize(2, 500, 600);
+            fail("Should throw ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException e) {
+        }
+        assertEquals(100, layerDrawable.getLayerWidth(0));
+        assertEquals(200, layerDrawable.getLayerHeight(0));
+        assertEquals(300, layerDrawable.getLayerWidth(1));
+        assertEquals(400, layerDrawable.getLayerHeight(1));
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testSetLayerInsetRelative() {
+        Drawable[] array = new Drawable[] { new BitmapDrawable(), new ColorDrawable(Color.BLUE) };
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        // set inset for layer 0
+        int start = 10;
+        int top = 20;
+        int end = 30;
+        int bottom = 40;
+        layerDrawable.setLayerInsetRelative(0, start, top, end, bottom);
+        assertEquals(layerDrawable.getDrawable(0).getIntrinsicWidth() + start + end,
+                layerDrawable.getIntrinsicWidth());
+        assertEquals(layerDrawable.getDrawable(0).getIntrinsicHeight() + top + bottom,
+                layerDrawable.getIntrinsicHeight());
+        assertEquals(10, layerDrawable.getLayerInsetStart(0));
+        assertEquals(20, layerDrawable.getLayerInsetTop(0));
+        assertEquals(30, layerDrawable.getLayerInsetEnd(0));
+        assertEquals(40, layerDrawable.getLayerInsetBottom(0));
+        assertEquals(0, layerDrawable.getLayerInsetLeft(0));
+        assertEquals(0, layerDrawable.getLayerInsetRight(0));
+
+        // set bigger inset for layer 1
+        start += 10;
+        top += 10;
+        end += 10;
+        bottom += 10;
+        layerDrawable.setLayerInsetRelative(1, start, top, end, bottom);
+        assertEquals(layerDrawable.getDrawable(1).getIntrinsicWidth() + start + end,
+                layerDrawable.getIntrinsicWidth());
+        assertEquals(layerDrawable.getDrawable(1).getIntrinsicHeight() + top + bottom,
+                layerDrawable.getIntrinsicHeight());
+
+
+        try {
+            layerDrawable.setLayerInsetRelative(-1, start, top, end, bottom);
+            fail("Should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testSetLayerInsetLeft() {
+        Drawable[] array = new Drawable[] { new BitmapDrawable() };
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        // set inset for layer 0
+        int left = 10;
+        int top = 20;
+        int right = 30;
+        int bottom = 40;
+        layerDrawable.setLayerInset(0, left, top, right, bottom);
+        assertEquals(layerDrawable.getDrawable(0).getIntrinsicWidth() + left + right,
+                layerDrawable.getIntrinsicWidth());
+        left += 5;
+        layerDrawable.setLayerInsetLeft(0, left);
+        assertEquals(layerDrawable.getDrawable(0).getIntrinsicWidth() + left + right,
+                layerDrawable.getIntrinsicWidth());
+        assertEquals(left, layerDrawable.getLayerInsetLeft(0));
+
+        try {
+            layerDrawable.setLayerInsetLeft(1, left);
+            fail("Should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testGetLayerInsetLeft() {
+        Drawable[] array = new Drawable[] { new BitmapDrawable() };
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        // set inset for layer 0
+        int left = 10;
+        int top = 20;
+        int right = 30;
+        int bottom = 40;
+        layerDrawable.setLayerInset(0, left, top, right, bottom);
+        assertEquals(left, layerDrawable.getLayerInsetLeft(0));
+        left += 5;
+        layerDrawable.setLayerInsetLeft(0, left);
+        assertEquals(left, layerDrawable.getLayerInsetLeft(0));
+
+        try {
+            layerDrawable.getLayerInsetLeft(1);
+            fail("Should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testSetLayerInsetTop() {
+        Drawable[] array = new Drawable[] { new BitmapDrawable() };
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        // set inset for layer 0
+        int left = 10;
+        int top = 20;
+        int right = 30;
+        int bottom = 40;
+        layerDrawable.setLayerInset(0, left, top, right, bottom);
+        assertEquals(layerDrawable.getDrawable(0).getIntrinsicHeight() + top + bottom,
+                layerDrawable.getIntrinsicHeight());
+        top += 5;
+        layerDrawable.setLayerInsetTop(0, top);
+        assertEquals(layerDrawable.getDrawable(0).getIntrinsicHeight() + top + bottom,
+                layerDrawable.getIntrinsicHeight());
+        assertEquals(top, layerDrawable.getLayerInsetTop(0));
+
+        try {
+            layerDrawable.setLayerInsetTop(1, top);
+            fail("Should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testGetLayerInsetTop() {
+        Drawable[] array = new Drawable[] { new BitmapDrawable() };
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        // set inset for layer 0
+        int left = 10;
+        int top = 20;
+        int right = 30;
+        int bottom = 40;
+        layerDrawable.setLayerInset(0, left, top, right, bottom);
+        assertEquals(top, layerDrawable.getLayerInsetTop(0));
+        top += 5;
+        layerDrawable.setLayerInsetTop(0, top);
+        assertEquals(top, layerDrawable.getLayerInsetTop(0));
+
+        try {
+            layerDrawable.getLayerInsetTop(1);
+            fail("Should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testSetLayerInsetRight() {
+        Drawable[] array = new Drawable[] { new BitmapDrawable() };
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        // set inset for layer 0
+        int left = 10;
+        int top = 20;
+        int right = 30;
+        int bottom = 40;
+        layerDrawable.setLayerInset(0, left, top, right, bottom);
+        assertEquals(layerDrawable.getDrawable(0).getIntrinsicWidth() + left + right,
+                layerDrawable.getIntrinsicWidth());
+        right += 5;
+        layerDrawable.setLayerInsetRight(0, right);
+        assertEquals(layerDrawable.getDrawable(0).getIntrinsicWidth() + left + right,
+                layerDrawable.getIntrinsicWidth());
+        assertEquals(right, layerDrawable.getLayerInsetRight(0));
+
+        try {
+            layerDrawable.setLayerInsetRight(1, right);
+            fail("Should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testGetLayerInsetRight() {
+        Drawable[] array = new Drawable[] { new BitmapDrawable() };
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        // set inset for layer 0
+        int left = 10;
+        int top = 20;
+        int right = 30;
+        int bottom = 40;
+        layerDrawable.setLayerInset(0, left, top, right, bottom);
+        assertEquals(right, layerDrawable.getLayerInsetRight(0));
+        right += 5;
+        layerDrawable.setLayerInsetRight(0, right);
+        assertEquals(right, layerDrawable.getLayerInsetRight(0));
+
+        try {
+            layerDrawable.getLayerInsetRight(1);
+            fail("Should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testSetLayerInsetBottom() {
+        Drawable[] array = new Drawable[] { new BitmapDrawable() };
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        // set inset for layer 0
+        int left = 10;
+        int top = 20;
+        int right = 30;
+        int bottom = 40;
+        layerDrawable.setLayerInset(0, left, top, right, bottom);
+        assertEquals(layerDrawable.getDrawable(0).getIntrinsicHeight() + top + bottom,
+                layerDrawable.getIntrinsicHeight());
+        bottom += 5;
+        layerDrawable.setLayerInsetBottom(0, bottom);
+        assertEquals(layerDrawable.getDrawable(0).getIntrinsicHeight() + top + bottom,
+                layerDrawable.getIntrinsicHeight());
+        assertEquals(bottom, layerDrawable.getLayerInsetBottom(0));
+
+        try {
+            layerDrawable.setLayerInsetBottom(1, bottom);
+            fail("Should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testGetLayerInsetBottom() {
+        Drawable[] array = new Drawable[] { new BitmapDrawable() };
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        // set inset for layer 0
+        int left = 10;
+        int top = 20;
+        int right = 30;
+        int bottom = 40;
+        layerDrawable.setLayerInset(0, left, top, right, bottom);
+        assertEquals(bottom, layerDrawable.getLayerInsetBottom(0));
+        bottom += 5;
+        layerDrawable.setLayerInsetBottom(0, bottom);
+        assertEquals(bottom, layerDrawable.getLayerInsetBottom(0));
+
+        try {
+            layerDrawable.getLayerInsetBottom(1);
+            fail("Should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testSetLayerInsetStart() {
+        Drawable[] array = new Drawable[] { new BitmapDrawable() };
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        // set inset for layer 0
+        int start = 10;
+        int top = 20;
+        int end = 30;
+        int bottom = 40;
+        layerDrawable.setLayerInsetRelative(0, start, top, end, bottom);
+        assertEquals(layerDrawable.getDrawable(0).getIntrinsicWidth() + start + end,
+                layerDrawable.getIntrinsicWidth());
+        start += 5;
+        layerDrawable.setLayerInsetStart(0, start);
+        assertEquals(layerDrawable.getDrawable(0).getIntrinsicWidth() + start + end,
+                layerDrawable.getIntrinsicWidth());
+        assertEquals(start, layerDrawable.getLayerInsetStart(0));
+
+        try {
+            layerDrawable.setLayerInset(1, start, top, end, bottom);
+            fail("Should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testGetLayerInsetStart() {
+        Drawable[] array = new Drawable[] { new BitmapDrawable() };
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        // set inset for layer 0
+        int start = 10;
+        int top = 20;
+        int end = 30;
+        int bottom = 40;
+        layerDrawable.setLayerInsetRelative(0, start, top, end, bottom);
+        assertEquals(start, layerDrawable.getLayerInsetStart(0));
+        start += 5;
+        layerDrawable.setLayerInsetStart(0, start);
+        assertEquals(start, layerDrawable.getLayerInsetStart(0));
+
+        try {
+            layerDrawable.getLayerInsetStart(1);
+            fail("Should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testSetLayerInsetEnd() {
+        Drawable[] array = new Drawable[] { new BitmapDrawable() };
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        // set inset for layer 0
+        int start = 10;
+        int top = 20;
+        int end = 30;
+        int bottom = 40;
+        layerDrawable.setLayerInsetRelative(0, start, top, end, bottom);
+        assertEquals(end, layerDrawable.getLayerInsetEnd(0));
+        assertEquals(layerDrawable.getDrawable(0).getIntrinsicWidth() + start + end,
+                layerDrawable.getIntrinsicWidth());
+        end += 5;
+        layerDrawable.setLayerInsetEnd(0, end);
+        assertEquals(layerDrawable.getDrawable(0).getIntrinsicWidth() + start + end,
+                layerDrawable.getIntrinsicWidth());
+        assertEquals(end, layerDrawable.getLayerInsetEnd(0));
+
+        try {
+            layerDrawable.setLayerInsetEnd(1, end);
+            fail("Should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testGetLayerInsetEnd() {
+        Drawable[] array = new Drawable[] { new BitmapDrawable() };
+        LayerDrawable layerDrawable = new LayerDrawable(array);
+
+        // set inset for layer 0
+        int start = 10;
+        int top = 20;
+        int end = 30;
+        int bottom = 40;
+        layerDrawable.setLayerInsetRelative(0, start, top, end, bottom);
+        assertEquals(end, layerDrawable.getLayerInsetEnd(0));
+        end += 5;
+        layerDrawable.setLayerInsetEnd(0, end);
+        assertEquals(end, layerDrawable.getLayerInsetEnd(0));
+
+        try {
+            layerDrawable.getLayerInsetEnd(1);
+            fail("Should throw IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+        }
+    }
+
+
+
     private static class MockDrawable extends Drawable {
         private boolean mCalledSetDither = false;
         private boolean mCalledSetAlpha = false;
@@ -732,6 +1399,8 @@
 
         private boolean mCalledSetState = false;
         private boolean mCalledOnLevelChange = false;
+        private boolean mCalledOnBoundsChange = false;
+
 
         private boolean mCalledDraw = false;
 
@@ -739,6 +1408,8 @@
 
         private int mOpacity = PixelFormat.OPAQUE;
 
+        private boolean mDither = false;
+
         Rect mPadding = null;
 
         public MockDrawable() {
@@ -779,6 +1450,7 @@
 
         @Override
         public void setDither(boolean dither) {
+            mDither = dither;
             mCalledSetDither = true;
         }
 
@@ -801,13 +1473,15 @@
 
             mCalledSetState = false;
             mCalledOnLevelChange = false;
+            mCalledOnBoundsChange = false;
 
             mCalledDraw = false;
         }
 
         @Override
         protected boolean onStateChange(int[] state) {
-            return true;
+            increasePadding();
+            return mIsStateful;
         }
 
         private void increasePadding() {
@@ -829,6 +1503,16 @@
         }
 
         @Override
+        protected void onBoundsChange(Rect bounds) {
+            mCalledOnBoundsChange = true;
+            super.onBoundsChange(bounds);
+        }
+
+        public boolean hasCalledOnBoundsChange() {
+            return mCalledOnBoundsChange;
+        }
+
+        @Override
         public boolean isStateful() {
             return mIsStateful;
         }
@@ -839,7 +1523,6 @@
 
         @Override
         public boolean setState(final int[] stateSet) {
-            increasePadding();
             mCalledSetState = true;
             return super.setState(stateSet);
         }
@@ -870,44 +1553,10 @@
         }
     }
 
-    private static class MockLayerDrawable extends LayerDrawable {
-        private boolean mCalledOnBoundsChange = false;
-
-        public MockLayerDrawable(Drawable[] array) {
-            super(array);
-        }
-
-        // override protected methods
-        @Override
-        protected boolean onStateChange(int[] state) {
-            return super.onStateChange(state);
-        }
-
-        @Override
-        protected boolean onLevelChange(int level) {
-            return super.onLevelChange(level);
-        }
-
-        @Override
-        protected void onBoundsChange(Rect bounds) {
-            mCalledOnBoundsChange = true;
-            super.onBoundsChange(bounds);
-        }
-
-        public boolean hasCalledOnBoundsChange() {
-            return mCalledOnBoundsChange;
-        }
-
-        public void reset() {
-            mCalledOnBoundsChange = false;
-        }
-    }
-
     public void testMutate() {
-        Resources resources = mContext.getResources();
-        LayerDrawable d1 = (LayerDrawable) resources.getDrawable(R.drawable.layerdrawable);
-        LayerDrawable d2 = (LayerDrawable) resources.getDrawable(R.drawable.layerdrawable);
-        LayerDrawable d3 = (LayerDrawable) resources.getDrawable(R.drawable.layerdrawable);
+        LayerDrawable d1 = (LayerDrawable) mContext.getDrawable(R.drawable.layerdrawable);
+        LayerDrawable d2 = (LayerDrawable) mContext.getDrawable(R.drawable.layerdrawable);
+        LayerDrawable d3 = (LayerDrawable) mContext.getDrawable(R.drawable.layerdrawable);
 
         d1.setAlpha(100);
         assertEquals(100, ((BitmapDrawable) d1.getDrawable(0)).getPaint().getAlpha());
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java
index 39ed55c..720397c 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java
@@ -21,7 +21,6 @@
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
-import android.content.res.ColorStateList;
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
 import android.graphics.Bitmap;
@@ -37,9 +36,7 @@
 import android.graphics.Bitmap.Config;
 import android.graphics.PorterDuff.Mode;
 import android.graphics.drawable.NinePatchDrawable;
-import android.graphics.drawable.ShapeDrawable;
 import android.graphics.drawable.Drawable.ConstantState;
-import android.graphics.drawable.shapes.RectShape;
 import android.test.InstrumentationTestCase;
 import android.util.AttributeSet;
 import android.util.Xml;
@@ -200,6 +197,27 @@
         assertTrue(mNinePatchDrawable.getPaint().isDither());
     }
 
+    public void testSetFilterBitmap() {
+        mNinePatchDrawable.setFilterBitmap(false);
+        assertFalse(mNinePatchDrawable.getPaint().isFilterBitmap());
+
+        mNinePatchDrawable.setFilterBitmap(true);
+        assertTrue(mNinePatchDrawable.getPaint().isFilterBitmap());
+    }
+
+    public void testIsFilterBitmap() {
+        mNinePatchDrawable.setFilterBitmap(false);
+        assertFalse(mNinePatchDrawable.isFilterBitmap());
+        assertEquals(mNinePatchDrawable.isFilterBitmap(),
+                mNinePatchDrawable.getPaint().isFilterBitmap());
+
+
+        mNinePatchDrawable.setFilterBitmap(true);
+        assertTrue(mNinePatchDrawable.isFilterBitmap());
+        assertEquals(mNinePatchDrawable.isFilterBitmap(),
+                mNinePatchDrawable.getPaint().isFilterBitmap());
+    }
+
     public void testGetPaint() {
         Paint paint = mNinePatchDrawable.getPaint();
         assertNotNull(paint);
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/RippleDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/RippleDrawableTest.java
new file mode 100644
index 0000000..b04433c
--- /dev/null
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/RippleDrawableTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2015 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.graphics.drawable.cts;
+
+import com.android.cts.graphics.R;
+
+import android.content.res.ColorStateList;
+import android.graphics.drawable.RippleDrawable;
+import android.graphics.Color;
+import android.test.AndroidTestCase;
+
+public class RippleDrawableTest extends AndroidTestCase {
+    public void testConstructor() {
+        new RippleDrawable(ColorStateList.valueOf(Color.RED), null, null);
+    }
+
+    public void testAccessRadius() {
+        RippleDrawable drawable =
+            new RippleDrawable(ColorStateList.valueOf(Color.RED), null, null);
+        assertEquals(RippleDrawable.RADIUS_AUTO, drawable.getRadius());
+        drawable.setRadius(10);
+        assertEquals(10, drawable.getRadius());
+    }
+
+    public void testRadiusAttr() {
+        RippleDrawable drawable =
+                (RippleDrawable) getContext().getDrawable(R.drawable.rippledrawable_radius);
+        assertEquals(10, drawable.getRadius());
+    }
+}
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ScaleDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ScaleDrawableTest.java
index 6281582..b58e40f 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ScaleDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ScaleDrawableTest.java
@@ -21,6 +21,7 @@
 import org.xmlpull.v1.XmlPullParserException;
 
 import java.io.IOException;
+import java.util.Arrays;
 
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
@@ -28,6 +29,7 @@
 import android.graphics.ColorFilter;
 import android.graphics.Rect;
 import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.ClipDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Drawable.ConstantState;
 import android.graphics.drawable.ScaleDrawable;
@@ -259,7 +261,8 @@
         MockDrawable mockDrawable = new MockDrawable();
         ScaleDrawable scaleDrawable = new ScaleDrawable(mockDrawable, Gravity.CENTER, 100, 200);
 
-        // this method will call contained drawable's getOpacity method.
+        // This method will call contained drawable's getOpacity method.
+        scaleDrawable.setLevel(1);
         scaleDrawable.getOpacity();
         assertTrue(mockDrawable.hasCalledGetOpacity());
     }
@@ -274,19 +277,23 @@
     }
 
     public void testOnStateChange() {
-        MockDrawable mockDrawable = new MockDrawable();
-        MockScaleDrawable mockScaleDrawable = new MockScaleDrawable(
-                mockDrawable, Gravity.CENTER, 100, 200);
+        Drawable d = new MockDrawable();
+        MockScaleDrawable scaleDrawable = new MockScaleDrawable(d, Gravity.CENTER, 100, 200);
+        assertEquals("initial child state is empty", d.getState(), StateSet.WILD_CARD);
 
-        assertFalse(mockScaleDrawable.onStateChange(StateSet.WILD_CARD));
-        assertTrue(mockDrawable.hasCalledSetState());
-        assertTrue(mockScaleDrawable.hasCalledOnBoundsChange());
+        int[] state = new int[] {1, 2, 3};
+        assertFalse("child did not change", scaleDrawable.onStateChange(state));
+        assertEquals("child state did not change", d.getState(), StateSet.WILD_CARD);
 
-        mockDrawable.reset();
-        mockScaleDrawable.reset();
-        assertFalse(mockScaleDrawable.onStateChange(null));
-        assertTrue(mockDrawable.hasCalledSetState());
-        assertTrue(mockScaleDrawable.hasCalledOnBoundsChange());
+        d = mContext.getDrawable(R.drawable.statelistdrawable);
+        scaleDrawable = new MockScaleDrawable(d, Gravity.CENTER, 100, 200);
+        assertEquals("initial child state is empty", d.getState(), StateSet.WILD_CARD);
+        scaleDrawable.onStateChange(state);
+        assertTrue("child state changed", Arrays.equals(state, d.getState()));
+
+        // input null as param
+        scaleDrawable.onStateChange(null);
+        // expected, no Exception thrown out, test success
     }
 
     public void testOnLevelChange() {
@@ -412,35 +419,34 @@
         parser = res.getXml(R.xml.scaledrawable);
         attrs = DrawableTestUtils.getAttributeSet(parser, "scale_nodrawable");
         try {
-            scaleDrawable.inflate(res, parser, attrs);
-            fail("Should throw XmlPullParserException");
+            Drawable.createFromXmlInner(res, parser, attrs);
+            fail("Should throw XmlPullParserException if missing drawable");
         } catch (XmlPullParserException e) {
         }
 
         try {
-            scaleDrawable.inflate(null, parser, attrs);
+            Drawable.createFromXmlInner(null, parser, attrs);
             fail("Should throw NullPointerException if resource is null");
         } catch (NullPointerException e) {
         }
 
         try {
-            scaleDrawable.inflate(res, null, attrs);
+            Drawable.createFromXmlInner(res, null, attrs);
             fail("Should throw NullPointerException if parser is null");
         } catch (NullPointerException e) {
         }
 
         try {
-            scaleDrawable.inflate(res, parser, null);
+            Drawable.createFromXmlInner(res, parser, null);
             fail("Should throw NullPointerException if attribute set is null");
         } catch (NullPointerException e) {
         }
     }
 
     public void testMutate() {
-        Resources resources = mContext.getResources();
-        ScaleDrawable d1 = (ScaleDrawable) resources.getDrawable(R.drawable.scaledrawable);
-        ScaleDrawable d2 = (ScaleDrawable) resources.getDrawable(R.drawable.scaledrawable);
-        ScaleDrawable d3 = (ScaleDrawable) resources.getDrawable(R.drawable.scaledrawable);
+        ScaleDrawable d1 = (ScaleDrawable) mContext.getDrawable(R.drawable.scaledrawable);
+        ScaleDrawable d2 = (ScaleDrawable) mContext.getDrawable(R.drawable.scaledrawable);
+        ScaleDrawable d3 = (ScaleDrawable) mContext.getDrawable(R.drawable.scaledrawable);
 
         d1.setAlpha(100);
         assertEquals(100, ((BitmapDrawable) d1.getDrawable()).getPaint().getAlpha());
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawableTest.java
index b77139a..5b3234e 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawableTest.java
@@ -16,7 +16,6 @@
 
 package android.graphics.drawable.cts;
 
-import android.content.res.ColorStateList;
 import android.content.res.Resources;
 import android.graphics.Canvas;
 import android.graphics.Color;
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ThemedDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ThemedDrawableTest.java
index 8cee91e..d7becc6 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ThemedDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ThemedDrawableTest.java
@@ -17,7 +17,7 @@
 package android.graphics.drawable.cts;
 
 import android.annotation.TargetApi;
-import android.content.res.Resources;
+import android.content.res.Resources.Theme;
 import android.content.res.TypedArray;
 import android.graphics.Color;
 import android.graphics.Rect;
@@ -28,21 +28,30 @@
 import android.graphics.drawable.LayerDrawable;
 import android.graphics.drawable.NinePatchDrawable;
 import android.graphics.drawable.RippleDrawable;
+import android.os.Debug;
 import android.test.AndroidTestCase;
-import android.util.SparseIntArray;
-import android.view.ContextThemeWrapper;
 import android.view.Gravity;
 
 import com.android.cts.graphics.R;
 
-@TargetApi(19)
+@TargetApi(21)
 public class ThemedDrawableTest extends AndroidTestCase {
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
 
-        mContext.setTheme(R.style.Theme_ThemedDrawableTest);
+        // Workaround for ContextImpl.setTheme() being broken.
+        final Theme theme = mContext.getResources().newTheme();
+        theme.applyStyle(R.style.Theme_ThemedDrawableTest, true);
+        final Theme ctxTheme = mContext.getTheme();
+        ctxTheme.setTo(theme);
+    }
+
+    @Override
+    public void testAndroidTestCaseSetupProperly() {
+        final TypedArray t = mContext.obtainStyledAttributes(new int[]{R.attr.themeType});
+        assertTrue("Theme was applied correctly", t.getInt(0, -1) == 0);
     }
 
     public void testBitmapDrawable() {
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java
index 3578d3c..fdc7b7a 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java
@@ -21,6 +21,9 @@
 import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
 import android.graphics.Color;
+import android.graphics.ColorFilter;
+import android.graphics.PorterDuff.Mode;
+import android.graphics.PorterDuffColorFilter;
 import android.graphics.drawable.VectorDrawable;
 import android.graphics.drawable.Drawable.ConstantState;
 import android.test.AndroidTestCase;
@@ -63,6 +66,8 @@
             R.drawable.vector_icon_stroke_1,
             R.drawable.vector_icon_stroke_2,
             R.drawable.vector_icon_stroke_3,
+            R.drawable.vector_icon_scale_1,
+            R.drawable.vector_icon_scale_2,
     };
 
     private int[] mGoldenImages = new int[] {
@@ -89,6 +94,8 @@
             R.drawable.vector_icon_stroke_1_golden,
             R.drawable.vector_icon_stroke_2_golden,
             R.drawable.vector_icon_stroke_3_golden,
+            R.drawable.vector_icon_scale_1_golden,
+            R.drawable.vector_icon_scale_2_golden,
     };
 
     private static final int IMAGE_WIDTH = 64;
@@ -97,7 +104,8 @@
     // exactly with the golden image.
     // We can increase the threshold if the Skia is drawing with some variance
     // on different devices. So far, the tests show they are matching correctly.
-    private static final float PIXEL_ERROR_THRESHOLD = 0.00001f;
+    private static final float PIXEL_ERROR_THRESHOLD = 0.02f;
+    private static final float PIXEL_ERROR_COUNT_THRESHOLD = 0.005f;
 
     private static final boolean DBG_DUMP_PNG = false;
 
@@ -216,7 +224,7 @@
                 totalDiffPixelCount++;
             }
         }
-        if ((totalDiffPixelCount / totalPixelCount) >= PIXEL_ERROR_THRESHOLD) {
+        if ((totalDiffPixelCount / totalPixelCount) >= PIXEL_ERROR_COUNT_THRESHOLD) {
             fail((filename +": totalDiffPixelCount is " + totalDiffPixelCount));
         }
 
@@ -283,4 +291,12 @@
 
         d2.setAlpha(originalAlpha);
     }
+
+    public void testColorFilter() {
+        PorterDuffColorFilter filter = new PorterDuffColorFilter(Color.RED, Mode.SRC_IN);
+        VectorDrawable vectorDrawable = new VectorDrawable();
+        vectorDrawable.setColorFilter(filter);
+
+        assertEquals(filter, vectorDrawable.getColorFilter());
+    }
 }
diff --git a/tests/tests/graphics/src/android/opengl/cts/EglConfigGLSurfaceView.java b/tests/tests/graphics/src/android/opengl/cts/EglConfigGLSurfaceView.java
index 03e8d94..eb36166 100644
--- a/tests/tests/graphics/src/android/opengl/cts/EglConfigGLSurfaceView.java
+++ b/tests/tests/graphics/src/android/opengl/cts/EglConfigGLSurfaceView.java
@@ -101,7 +101,7 @@
             gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
             gl.glColor4f(1.0f, 0, 0, 0);
             gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mFloatBuffer);
-            gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 9);
+            gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
 
             if (++mNumFrames == 10) {
                 post(mCallback);
diff --git a/tests/tests/hardware/Android.mk b/tests/tests/hardware/Android.mk
index 153445d..9c26d8a 100644
--- a/tests/tests/hardware/Android.mk
+++ b/tests/tests/hardware/Android.mk
@@ -34,6 +34,7 @@
     src/android/hardware/cts/SensorIntegrationTests.java \
     src/android/hardware/cts/SensorBatchingTests.java \
     src/android/hardware/cts/SensorTest.java \
+    src/android/hardware/cts/SensorManagerStaticTest.java
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil
 
diff --git a/tests/tests/hardware/AndroidManifest.xml b/tests/tests/hardware/AndroidManifest.xml
index ab81162..031b19e 100644
--- a/tests/tests/hardware/AndroidManifest.xml
+++ b/tests/tests/hardware/AndroidManifest.xml
@@ -25,6 +25,8 @@
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.BODY_SENSORS" />
     <uses-permission android:name="android.permission.TRANSMIT_IR" />
+    <uses-permission android:name="android.permission.REORDER_TASKS" />
+    <uses-permission android:name="android.permission.USE_FINGERPRINT" />
 
     <application>
         <uses-library android:name="android.test.runner" />
@@ -50,6 +52,30 @@
         <activity android:name="android.hardware.cts.GLSurfaceViewCtsActivity"
             android:label="GLSurfaceViewCtsActivity"/>
 
+        <service android:name="android.hardware.multiprocess.ErrorLoggingService"
+            android:label="ErrorLoggingService"
+            android:process=":errorLoggingServiceProcess"
+            android:exported="false">
+        </service>
+
+        <activity android:name="android.hardware.multiprocess.camera.cts.Camera1Activity"
+            android:label="RemoteCamera1Activity"
+            android:screenOrientation="landscape"
+            android:configChanges="keyboardHidden|orientation|screenSize"
+            android:process=":camera1ActivityProcess">
+        </activity>
+
+        <activity android:name="android.hardware.multiprocess.camera.cts.Camera2Activity"
+            android:label="RemoteCamera2Activity"
+            android:screenOrientation="landscape"
+            android:configChanges="keyboardHidden|orientation|screenSize"
+            android:process=":camera2ActivityProcess">
+        </activity>
+
+        <activity android:name="android.hardware.cts.FingerprintTestActivity"
+            android:label="FingerprintTestActivity">
+        </activity>
+
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/tests/tests/hardware/AndroidTest.xml b/tests/tests/hardware/AndroidTest.xml
new file mode 100644
index 0000000..4ddf28c
--- /dev/null
+++ b/tests/tests/hardware/AndroidTest.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="Base config for Sensor CTS tests. Put SensorService in restricted mode">
+    <include name="common-config" />
+    <!-- Put SensorService in restricted mode so that only CTS tests will be able to get access to
+    sensors -->
+    <option name="run-command:run-command" value="dumpsys sensorservice restrict .cts." />
+    <option name="run-command:teardown-command" value="dumpsys sensorservice enable" />
+</configuration>
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java
index d4fb235..229185d 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java
@@ -728,7 +728,12 @@
                             mCameraIds[i]));
                     continue;
                 }
-
+                if (!staticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, String.format(
+                        "Skipping this test for camera %s, does not support regular outputs",
+                        mCameraIds[i]));
+                    continue;
+                }
                 // Open camera and execute test
                 Log.i(TAG, "Testing Camera " + mCameraIds[i]);
                 try {
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/BurstCaptureRawTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/BurstCaptureRawTest.java
new file mode 100644
index 0000000..75de9c0
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/BurstCaptureRawTest.java
@@ -0,0 +1,724 @@
+/*
+ * Copyright (C) 2014 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.hardware.camera2.cts;
+
+import static android.hardware.camera2.cts.CameraTestUtils.*;
+
+import android.graphics.ImageFormat;
+import android.graphics.Rect;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureRequest.Builder;
+import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleImageReaderListener;
+import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
+import android.hardware.camera2.params.StreamConfigurationMap;
+import android.media.Image;
+import android.util.Log;
+import android.util.Range;
+import android.util.Size;
+
+import java.util.ArrayList;
+
+/**
+ * Basic tests for burst capture in RAW formats.
+ */
+public class BurstCaptureRawTest extends Camera2SurfaceViewTestCase {
+    private static final String TAG = "BurstCaptureRawTest";
+    private static final int RAW_FORMATS[] = {
+            ImageFormat.RAW10, ImageFormat.RAW12, ImageFormat.RAW_SENSOR };
+    private static final int NONSTALL_RAW_FORMATS[] = {
+        ImageFormat.RAW10, ImageFormat.RAW12 };
+    private static final long EXPOSURE_MULTIPLIERS[] = {
+            1, 3, 5 };
+    private static final int SENSITIVITY_MLTIPLIERS[] = {
+            1, 3, 5 };
+    private static final int MAX_FRAMES_BURST =
+            EXPOSURE_MULTIPLIERS.length * SENSITIVITY_MLTIPLIERS.length;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    /**
+     * Verify raw sensor size information is correctly configured.
+     */
+    public void testRawSensorSize() throws Exception {
+        Log.i(TAG, "Begin testRawSensorSize");
+        for (String id : mCameraIds) {
+            try {
+                openDevice(id);
+
+                ArrayList<Integer> supportedRawList = new ArrayList<Integer>(RAW_FORMATS.length);
+                if (!checkCapability(supportedRawList, RAW_FORMATS)) {
+                    Log.i(TAG, "Capability is not supported on camera " + id
+                            + ". Skip the test.");
+                    continue;
+                }
+
+                Size[] rawSizes = mStaticInfo.getRawOutputSizesChecked();
+                assertTrue("No capture sizes available for RAW format!", rawSizes.length != 0);
+
+                // Check happens in getRawDimensChecked.
+                Size rawSize = mStaticInfo.getRawDimensChecked();
+            } finally {
+                closeDevice();
+            }
+        }
+        Log.i(TAG, "End testRawSensorSize");
+    }
+
+    /**
+     * Round [exposure, gain] down, rather than to the nearest, in RAW 10/16
+     * <p>
+     * Verify the value of metadata (exposure and sensitivity) is rounded down if the request cannot
+     * be honored.
+     * </p>
+     */
+    public void testMetadataRoundDown() throws Exception {
+        Log.i(TAG, "Begin testMetadataRoundDown");
+
+        performTestRoutine(new TestMetaDataRoundDownRoutine(), RAW_FORMATS);
+
+        Log.i(TAG, "End testMetadataRoundDown");
+    }
+
+    /**
+     * Manual and Auto setting test in RAW formats
+     * <p>
+     * Make sure switching between manual and auto setting would not make the capture results out of
+     * sync.
+     * </p>
+     */
+    public void testManualAutoSwitch() throws Exception {
+        Log.i(TAG, "Begin testManualAutoSwitch");
+
+        performTestRoutine(new TestManualAutoSwitch(), RAW_FORMATS);
+
+        Log.i(TAG, "End testManualAutoSwitch");
+    }
+
+    /**
+     * Per frame timestamp test in non-stalled RAW formats
+     */
+    public void testTimestamp() throws Exception {
+        Log.i(TAG, "Begin testTimestamp");
+
+        performTestRoutine(new TestTimestamp(), NONSTALL_RAW_FORMATS);
+
+        Log.i(TAG, "End testTimestamp");
+    }
+
+    /*
+     * Below are private infrastructure for all tests
+     */
+
+    /**
+     * A structure encapsulates all the parameters for setting up preview, and RAW capture.
+     */
+    class CaptureSetup
+    {
+        public CaptureSetup(Size previewCaptureSize, Size rawCaptureSize,
+                CaptureRequest.Builder previewRequestBuilder,
+                CaptureRequest.Builder rawRequestBuilder,
+                SimpleCaptureCallback previewCaptureCallback,
+                SimpleCaptureCallback rawCaptureCallback,
+                SimpleImageReaderListener rawReaderListener)
+        {
+            mPreviewCaptureSize = previewCaptureSize;
+            mRawCaptureSize = rawCaptureSize;
+            mPreviewRequestBuilder = previewRequestBuilder;
+            mRawRequestBuilder = rawRequestBuilder;
+            mPreviewCaptureCallback = previewCaptureCallback;
+            mRawCaptureCallback = rawCaptureCallback;
+            mRawReaderListener = rawReaderListener;
+        }
+
+        public Size getPreviewCaptureSize()
+        {
+            return mPreviewCaptureSize;
+        }
+
+        public Size getRawCaptureSize()
+        {
+            return mRawCaptureSize;
+        }
+
+        public CaptureRequest.Builder getPreviewRequestBuilder()
+        {
+            return mPreviewRequestBuilder;
+        }
+
+        public CaptureRequest.Builder getRawRequestBuilder() {
+            return mRawRequestBuilder;
+        }
+
+        public SimpleCaptureCallback getPreviewCaptureCallback() {
+            return mPreviewCaptureCallback;
+        }
+
+        public SimpleCaptureCallback getRawCaptureCallback() {
+            return mRawCaptureCallback;
+        }
+
+        public SimpleImageReaderListener getRawReaderListener() {
+            return mRawReaderListener;
+        }
+
+        private Size mPreviewCaptureSize;
+        private Size mRawCaptureSize;
+        private CaptureRequest.Builder mPreviewRequestBuilder;
+        private CaptureRequest.Builder mRawRequestBuilder;
+
+        /** all the non-testing requests are sent to here */
+        private SimpleCaptureCallback mPreviewCaptureCallback;
+        /** all the testing requests are sent to here */
+        private SimpleCaptureCallback mRawCaptureCallback;
+        /** all the testing framebuffers are sent to here */
+        private SimpleImageReaderListener mRawReaderListener;
+    }
+
+    /**
+     * Interface for the test routines that are being called by performTestRoutines(). Implement
+     * different test cases in execute().
+     */
+    interface TestRoutine {
+        public void execute(CaptureRequest.Builder rawBurstBuilder,
+                SimpleCaptureCallback rawCaptureCallback,
+                SimpleImageReaderListener rawReaderListener, int rawFormat) throws Exception;
+    }
+
+    /**
+     * Implementation of metadata round down test.
+     */
+    class TestMetaDataRoundDownRoutine implements TestRoutine
+    {
+        @Override
+        public void execute(CaptureRequest.Builder rawBurstBuilder,
+                SimpleCaptureCallback rawCaptureCallback,
+                SimpleImageReaderListener rawReaderListener, int rawFormat) throws Exception
+        {
+            // build burst capture
+            ArrayList<CaptureRequest> rawRequestList = createBurstRequest(rawBurstBuilder);
+
+            // submit captrue
+            Log.i(TAG, "Submitting Burst Request.");
+            mSession.captureBurst(rawRequestList, rawCaptureCallback, mHandler);
+
+            // verify metadata
+            for (int i = 0; i < MAX_FRAMES_BURST; i++) {
+                CaptureResult result = rawCaptureCallback.getCaptureResult(
+                        CAPTURE_IMAGE_TIMEOUT_MS);
+
+                long resultExposure = result.get(CaptureResult.SENSOR_EXPOSURE_TIME);
+                int resultSensitivity = result.get(CaptureResult.SENSOR_SENSITIVITY);
+                long desiredExposure = rawRequestList.get(i).get(
+                        CaptureRequest.SENSOR_EXPOSURE_TIME);
+                int desiredSensitivity = rawRequestList.get(i).get(
+                        CaptureRequest.SENSOR_SENSITIVITY);
+
+                Log.i(TAG, String.format(
+                        "Received capture result, exposure = %d, sensitivity = %d. "
+                                + "Requested exposure = %d, sensitivity = %d.",
+                        resultExposure,
+                        resultSensitivity, desiredExposure, desiredSensitivity));
+
+                mCollector.expectTrue(
+                        String.format("Exposure value is greater than requested: "
+                                + "requested = %d, result = %d.",
+                                desiredExposure, resultExposure),
+                                resultExposure <= desiredExposure);
+
+                mCollector.expectTrue(
+                        String.format("Sensitivity value is greater than requested: "
+                                + "requested = %d, result = %d.",
+                                desiredSensitivity, resultSensitivity),
+                                resultSensitivity <= desiredSensitivity);
+            }
+        }
+    }
+
+    /**
+     * Implementation of manual-auto switching test.
+     */
+    class TestManualAutoSwitch implements TestRoutine
+    {
+        @Override
+        public void execute(CaptureRequest.Builder rawBurstBuilder,
+                SimpleCaptureCallback rawCaptureCallback,
+                SimpleImageReaderListener rawReaderListener, int rawFormat) throws Exception
+        {
+            // create a capture request builder to preserve all the original values
+            CaptureRequest.Builder originBuilder = mCamera.createCaptureRequest(
+                    CameraDevice.TEMPLATE_STILL_CAPTURE);
+            copyBurstRequetBuilder(originBuilder, rawBurstBuilder);
+
+            // build burst capture
+            ArrayList<CaptureRequest> rawRequestList = createBurstRequest(rawBurstBuilder);
+
+            // submit captrue but ignore
+            mSession.captureBurst(rawRequestList, rawCaptureCallback, mHandler);
+
+            // drain the capture result
+            drainQueues(rawReaderListener, rawCaptureCallback);
+
+            // reset and build capture with 3A
+            copyBurstRequetBuilder(rawBurstBuilder, originBuilder);
+            rawRequestList = createBurstRequestWith3A(rawBurstBuilder);
+
+            // submit captrue but ignore
+            mSession.captureBurst(rawRequestList, rawCaptureCallback, mHandler);
+
+            // drain the capture result
+            drainQueues(rawReaderListener, rawCaptureCallback);
+
+            // reset and rebuild manual raw burst capture
+            copyBurstRequetBuilder(rawBurstBuilder, originBuilder);
+            rawRequestList = createBurstRequest(rawBurstBuilder);
+
+            // submit capture
+            Log.i(TAG, "Submitting Burst Request.");
+            mSession.captureBurst(rawRequestList, rawCaptureCallback, mHandler);
+
+            // verify metadata
+            for (int i = 0; i < MAX_FRAMES_BURST; i++) {
+                CaptureResult result = rawCaptureCallback.getCaptureResult(
+                        CAPTURE_IMAGE_TIMEOUT_MS);
+
+                long resultExposure = result.get(CaptureResult.SENSOR_EXPOSURE_TIME);
+                int resultSensitivity = result.get(CaptureResult.SENSOR_SENSITIVITY);
+                int resultEdgeMode = result.get(CaptureResult.EDGE_MODE);
+                int resultNoiseReductionMode = result.get(
+                        CaptureResult.NOISE_REDUCTION_MODE);
+                long desiredExposure = rawRequestList.get(i).get(
+                        CaptureRequest.SENSOR_EXPOSURE_TIME);
+                int desiredSensitivity = rawRequestList.get(i).get(
+                        CaptureRequest.SENSOR_SENSITIVITY);
+
+                Log.i(TAG, String.format(
+                        "Received capture result, exposure = %d, sensitivity = %d. "
+                                + "Requested exposure = %d, sensitivity = %d.",
+                        resultExposure,
+                        resultSensitivity, desiredExposure, desiredSensitivity));
+
+                mCollector.expectTrue(String.format("Edge mode is not turned off."),
+                        resultEdgeMode == CaptureRequest.EDGE_MODE_OFF);
+
+                mCollector.expectTrue(String.format("Noise reduction is not turned off."),
+                        resultNoiseReductionMode
+                        == CaptureRequest.NOISE_REDUCTION_MODE_OFF);
+
+                mCollector.expectTrue(
+                        String.format("Exposure value is greater than requested: "
+                                + "requested = %d, result = %d.",
+                                desiredExposure, resultExposure),
+                                resultExposure <= desiredExposure);
+
+                mCollector.expectTrue(
+                        String.format("Sensitivity value is greater than requested: "
+                                + "requested = %d, result = %d.",
+                                desiredSensitivity, resultSensitivity),
+                                resultSensitivity <= desiredSensitivity);
+            }
+
+        }
+    }
+
+    /**
+     * Implementation of timestamp test
+     */
+    class TestTimestamp implements TestRoutine
+    {
+        private final double THRESHOLD = 5000000.0; // 5ms
+        private final long EXPOSURE_MULTIPLIERS_PRIVATE[] = {
+                1, 1, 1 };
+        private final int SENSITIVITY_MLTIPLIERS_PRIVATE[] = {
+                1, 1, 1 };
+        private final int MAX_FRAMES_BURST_PRIVATE =
+                EXPOSURE_MULTIPLIERS_PRIVATE.length * SENSITIVITY_MLTIPLIERS_PRIVATE.length;
+
+        @Override
+        public void execute(Builder rawBurstBuilder, SimpleCaptureCallback rawCaptureCallback,
+                SimpleImageReaderListener rawReaderListener, int rawFormat) throws Exception {
+            // prepare some local variables
+            ArrayList<Long> sensorTime = new ArrayList<Long>(MAX_FRAMES_BURST_PRIVATE);
+
+            // build burst capture
+            ArrayList<CaptureRequest> rawRequestList = createBurstRequest(rawBurstBuilder,
+                    EXPOSURE_MULTIPLIERS_PRIVATE, SENSITIVITY_MLTIPLIERS_PRIVATE);
+
+            // submit capture while recording timestamp
+            Log.i(TAG, "Submitting Burst Request.");
+            mSession.captureBurst(rawRequestList, rawCaptureCallback, mHandler);
+
+            // receive frames while recording timestamp
+            for (int i = 0; i < MAX_FRAMES_BURST_PRIVATE; i++) {
+                CaptureResult result = rawCaptureCallback.getCaptureResult(
+                        CAPTURE_IMAGE_TIMEOUT_MS);
+                long resultExposure = result.get(CaptureResult.SENSOR_EXPOSURE_TIME);
+                int resultSensitivity = result.get(CaptureResult.SENSOR_SENSITIVITY);
+                long resultTimestamp = result.get(CaptureResult.SENSOR_TIMESTAMP);
+                Log.i(TAG, String.format(
+                        "Received capture result, exposure = %d, sensitivity = %d, timestamp = %d",
+                        resultExposure, resultSensitivity, resultTimestamp));
+
+                sensorTime.add(resultTimestamp);
+            }
+
+            // compare sensor time and compute the difference
+            ArrayList<Long> deltaList = new ArrayList<Long>();
+            for (int i = 1; i < MAX_FRAMES_BURST_PRIVATE; i++)
+            {
+                deltaList.add(sensorTime.get(i) - sensorTime.get(i - 1));
+            }
+
+            // compute the average and standard deviation of the differences
+            double average = 0.0;
+            for (int i = 0; i < deltaList.size(); i++)
+            {
+                average += deltaList.get(i);
+            }
+            average /= deltaList.size();
+
+            double stddev = 0.0;
+            for (int i = 0; i < deltaList.size(); i++)
+            {
+                double diff = deltaList.get(i) - average;
+                stddev += diff * diff;
+            }
+            stddev = Math.sqrt(stddev / deltaList.size());
+
+            Log.i(TAG, String.format("average = %.2f, stddev = %.2f", average, stddev));
+
+            StringBuilder sensorTimestampMessage = new StringBuilder();
+            for (int i = 0; i < sensorTime.size(); i++)
+            {
+                sensorTimestampMessage.append("frame [");
+                sensorTimestampMessage.append(i);
+                sensorTimestampMessage.append("] SENSOR_TIMESTAMP = ");
+                sensorTimestampMessage.append(sensorTime.get(i));
+                sensorTimestampMessage.append("\n");
+            }
+
+            mCollector.expectLessOrEqual(
+                    "The standard deviation of frame interval is larger then threshold: " +
+                    String.format("stddev = %.2f, threshold = %.2f.\n", stddev, THRESHOLD) +
+                    sensorTimestampMessage.toString(),
+                    THRESHOLD, stddev);
+        }
+    }
+
+    /**
+     * Check sensor capability prior to the test.
+     *
+     * @return true if the it is has the capability to execute the test.
+     */
+    private boolean checkCapability(ArrayList<Integer> supportedRawList, int[] testedFormats) {
+        // make sure the sensor has manual support
+        if (!mStaticInfo.isCapabilitySupported(
+                CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL)) {
+            Log.w(TAG, "Full hardware level is not supported");
+            return false;
+        }
+
+        // get the list of supported RAW format
+        StreamConfigurationMap config = mStaticInfo.getValueFromKeyNonNull(
+                CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+
+        // check for the RAW support
+        supportedRawList.clear();
+        for (int rawFormat : testedFormats) {
+            if (!config.isOutputSupportedFor(rawFormat)) {
+                continue;
+            }
+            supportedRawList.add(rawFormat);
+        }
+
+        if (supportedRawList.size() == 0)
+        {
+            Log.w(TAG, "RAW output is not supported!");
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Return the sensor format to human readable string.
+     *
+     * @param format Sensor image format.
+     * @return Human readable string.
+     */
+    private String imageFormatToString(int format) {
+        switch (format) {
+            case ImageFormat.RAW10:
+                return "RAW10";
+            case ImageFormat.RAW12:
+                return "RAW12";
+            case ImageFormat.RAW_SENSOR:
+                return "RAW_SENSOR";
+        }
+
+        return "Unknown";
+    }
+
+    /**
+     * Setting up various classes prior to the request, e.g.: capture size, builder, callback and
+     * listener
+     *
+     * @return initialized variables that can be directly fed into prepareCaptureAndStartPreview().
+     */
+    private CaptureSetup initCaptureSetupForPreviewAndRaw() throws Exception
+    {
+        // capture size
+        Size previewSize = mOrderedPreviewSizes.get(0);
+        Size rawSize = mStaticInfo.getRawDimensChecked();
+
+        // builder
+        CaptureRequest.Builder previewCaptureBuilder = mCamera.createCaptureRequest(
+                CameraDevice.TEMPLATE_PREVIEW);
+        CaptureRequest.Builder rawCaptureBuilder = mCamera.createCaptureRequest(
+                CameraDevice.TEMPLATE_STILL_CAPTURE);
+
+        // callback
+        SimpleCaptureCallback previewCaptureCallback = new SimpleCaptureCallback();
+        SimpleCaptureCallback rawCaptureCallback = new SimpleCaptureCallback();
+        SimpleImageReaderListener rawReaderListener = new SimpleImageReaderListener();
+
+        CaptureSetup setup = new CaptureSetup(previewSize, rawSize, previewCaptureBuilder,
+                rawCaptureBuilder, previewCaptureCallback, rawCaptureCallback, rawReaderListener);
+
+        return setup;
+    }
+
+    /**
+     * Construct an array of burst request with manual exposure and sensitivity.
+     * <p>
+     * For each capture request, 3A and post processing (noise reduction, sharpening, etc) will be
+     * turned off. Then exposure and sensitivity value will be configured, which are determined by
+     * EXPOSURE_MULIPLIERS and SENSITIVITY_MULTIPLIERS.
+     * </p>
+     *
+     * @param rawBurstBuilder The builder needs to have targets setup.
+     * @return An array list capture request for burst.
+     */
+    private ArrayList<CaptureRequest> createBurstRequest(CaptureRequest.Builder rawBurstBuilder)
+    {
+        return createBurstRequest(rawBurstBuilder, EXPOSURE_MULTIPLIERS, SENSITIVITY_MLTIPLIERS);
+    }
+
+    private ArrayList<CaptureRequest> createBurstRequest(CaptureRequest.Builder rawBurstBuilder,
+            long[] exposureMultipliers, int[] sensitivityMultipliers) {
+        // set manual mode
+        rawBurstBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
+        rawBurstBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_OFF);
+        rawBurstBuilder.set(CaptureRequest.NOISE_REDUCTION_MODE,
+                CaptureRequest.NOISE_REDUCTION_MODE_OFF);
+        rawBurstBuilder.set(CaptureRequest.EDGE_MODE, CaptureRequest.EDGE_MODE_OFF);
+        // exposure has higher priority over frame duration; therefore the frame readout time:
+        // exposure time + overhead
+        rawBurstBuilder.set(CaptureRequest.SENSOR_FRAME_DURATION, 0L);
+
+        // get the exposure and sensitivity range
+        Range<Long> exposureRangeNs = new Range<Long>(mStaticInfo.getExposureMinimumOrDefault(),
+                mStaticInfo.getExposureMaximumOrDefault());
+
+        Range<Integer> isoRange = new Range<Integer>(mStaticInfo.getSensitivityMinimumOrDefault(),
+                mStaticInfo.getSensitivityMaximumOrDefault());
+
+        Log.i(TAG, String.format("Exposure time - max: %d, min: %d.", exposureRangeNs.getUpper(),
+                exposureRangeNs.getLower()));
+        Log.i(TAG, String.format("Sensitivity - max: %d, min: %d.", isoRange.getUpper(),
+                isoRange.getLower()));
+
+        // building burst request
+        int maxFramesBurst = exposureMultipliers.length * sensitivityMultipliers.length;
+        Log.i(TAG, String.format("Setting up burst = %d frames.", maxFramesBurst));
+        ArrayList<CaptureRequest> rawRequestList = new ArrayList<CaptureRequest>(maxFramesBurst);
+
+        for (int i = 0; i < exposureMultipliers.length; i++) {
+            for (int j = 0; j < sensitivityMultipliers.length; j++) {
+                long desiredExposure = Math.min(
+                        exposureRangeNs.getLower() * exposureMultipliers[i],
+                        exposureRangeNs.getUpper());
+
+                int desiredSensitivity =
+                        Math.min(isoRange.getLower() * sensitivityMultipliers[j],
+                                isoRange.getUpper());
+
+                rawBurstBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, desiredExposure);
+                rawBurstBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, desiredSensitivity);
+
+                rawRequestList.add(rawBurstBuilder.build());
+            }
+        }
+        return rawRequestList;
+    }
+
+    /**
+     * Construct an array of burst request with 3A
+     * <p>
+     * For each capture request, 3A and post processing (noise reduction, sharpening, etc) will be
+     * turned on.
+     * </p>
+     *
+     * @param rawBurstBuilder The builder needs to have targets setup.
+     * @return An array list capture request for burst.
+     */
+    private ArrayList<CaptureRequest> createBurstRequestWith3A(
+            CaptureRequest.Builder rawBurstBuilder)
+    {
+        // set 3A mode to simulate regular still capture
+        rawBurstBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
+        rawBurstBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_AUTO);
+        rawBurstBuilder.set(CaptureRequest.NOISE_REDUCTION_MODE,
+                CaptureRequest.NOISE_REDUCTION_MODE_HIGH_QUALITY);
+        rawBurstBuilder.set(CaptureRequest.EDGE_MODE, CaptureRequest.EDGE_MODE_HIGH_QUALITY);
+
+        // building burst request
+        Log.i(TAG, String.format("Setting up burst = %d frames.", MAX_FRAMES_BURST));
+        ArrayList<CaptureRequest> rawRequestList = new ArrayList<CaptureRequest>(MAX_FRAMES_BURST);
+
+        for (int i = 0; i < MAX_FRAMES_BURST; i++) {
+            rawRequestList.add(rawBurstBuilder.build());
+        }
+
+        return rawRequestList;
+    }
+
+    /**
+     * An utility method to copy capture request builders. This is used for recovery purpose to
+     * reverse the changes we made to the builder.
+     *
+     * @param dst the builder to write into.
+     * @param src the builder that needs to be copied.
+     */
+    private void copyBurstRequetBuilder(CaptureRequest.Builder dst, CaptureRequest.Builder src)
+    {
+        dst.set(CaptureRequest.CONTROL_AE_MODE, src.get(CaptureRequest.CONTROL_AE_MODE));
+        dst.set(CaptureRequest.CONTROL_AWB_MODE, src.get(CaptureRequest.CONTROL_AWB_MODE));
+        dst.set(CaptureRequest.NOISE_REDUCTION_MODE, src.get(CaptureRequest.NOISE_REDUCTION_MODE));
+        dst.set(CaptureRequest.EDGE_MODE, src.get(CaptureRequest.EDGE_MODE));
+        dst.set(CaptureRequest.SENSOR_FRAME_DURATION,
+                src.get(CaptureRequest.SENSOR_FRAME_DURATION));
+        dst.set(CaptureRequest.SENSOR_EXPOSURE_TIME, src.get(CaptureRequest.SENSOR_EXPOSURE_TIME));
+        dst.set(CaptureRequest.SENSOR_SENSITIVITY, src.get(CaptureRequest.SENSOR_SENSITIVITY));
+    }
+
+    /**
+     * Draining the image reader and capture callback queue
+     *
+     * @param readerListener Image reader listener needs to be drained.
+     * @param captureCallback Capture callback needs to be drained.
+     * @throws Exception Exception from the queue.
+     */
+    private void drainQueues(SimpleImageReaderListener readerListener,
+            SimpleCaptureCallback captureCallback) throws Exception
+    {
+        for (int i = 0; i < MAX_FRAMES_BURST; i++) {
+            Image image = readerListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+            image.close();
+
+            CaptureResult result = captureCallback.getCaptureResult(
+                    CAPTURE_IMAGE_TIMEOUT_MS);
+            long timestamp = result.get(CaptureResult.SENSOR_TIMESTAMP);
+            Log.d(TAG, String.format("timestamp = %d", timestamp));
+        }
+    }
+
+    /**
+     * Stop preview and remove the target surfaces inside the CaptureRequest.Builder.
+     *
+     * @param previewBuilder Configured builder for preview.
+     * @param rawBurstBuilder Configured builder for RAW.
+     * @throws Exception Exceptions from stopPreview.
+     */
+    private void stopPreviewAndClearSurface(CaptureRequest.Builder previewBuilder,
+            CaptureRequest.Builder rawBurstBuilder) throws Exception
+    {
+        previewBuilder.removeTarget(mPreviewSurface);
+        rawBurstBuilder.removeTarget(mPreviewSurface);
+        rawBurstBuilder.removeTarget(mReaderSurface);
+
+        stopPreview();
+    }
+
+    private void performTestRoutine(TestRoutine routine, int[] testedFormats) throws Exception
+    {
+        final int PREPARE_TIMEOUT_MS = 10000;
+        for (String id : mCameraIds) {
+            try {
+                openDevice(id);
+
+                ArrayList<Integer> supportedRawList = new ArrayList<Integer>(RAW_FORMATS.length);
+                if (!checkCapability(supportedRawList, testedFormats)) {
+                    Log.i(TAG, "Capability is not supported on camera " + id
+                            + ". Skip the test.");
+                    continue;
+                }
+
+                // test each supported RAW format
+                for (int rawFormat : supportedRawList) {
+                    Log.i(TAG, "Testing format " + imageFormatToString(rawFormat) + ".");
+
+                    // prepare preview and still RAW capture
+                    CaptureSetup captureSetup = initCaptureSetupForPreviewAndRaw();
+
+                    Size previewCaptureSize = captureSetup.getPreviewCaptureSize();
+                    Size rawCaptureSize = captureSetup.getRawCaptureSize();
+
+                    CaptureRequest.Builder previewBuilder = captureSetup.getPreviewRequestBuilder();
+                    CaptureRequest.Builder rawBurstBuilder = captureSetup.getRawRequestBuilder();
+
+                    SimpleCaptureCallback previewCaptureCallback =
+                            captureSetup.getPreviewCaptureCallback();
+                    SimpleCaptureCallback rawCaptureCallback = captureSetup.getRawCaptureCallback();
+                    SimpleImageReaderListener rawReaderListener = captureSetup
+                            .getRawReaderListener();
+
+                    // start preview and prepare RAW capture
+                    prepareCaptureAndStartPreview(previewBuilder, rawBurstBuilder,
+                            previewCaptureSize, rawCaptureSize, rawFormat, previewCaptureCallback,
+                            MAX_FRAMES_BURST, rawReaderListener);
+
+                    // Prepare still surface to prevent large allocations slow down capture
+                    mSession.prepare(mReaderSurface);
+                    mSessionListener.waitForSurfacePrepared(
+                            mSession, mReaderSurface, PREPARE_TIMEOUT_MS);
+
+                    // execute test routine
+                    routine.execute(rawBurstBuilder, rawCaptureCallback, rawReaderListener,
+                            rawFormat);
+
+                    // clear out the surface and camera session
+                    stopPreviewAndClearSurface(previewBuilder, rawBurstBuilder);
+                    closeImageReader();
+                }
+            } finally {
+                closeDevice();
+            }
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/BurstCaptureTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/BurstCaptureTest.java
index 5d0841e..d8fae6d 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/BurstCaptureTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/BurstCaptureTest.java
@@ -25,12 +25,14 @@
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
 import android.hardware.camera2.params.StreamConfigurationMap;
+import android.media.Image;
 import android.util.Log;
 import android.util.Range;
 import android.util.Size;
 
 import java.util.List;
 import java.util.ArrayList;
+import java.util.Arrays;
 
 public class BurstCaptureTest extends Camera2SurfaceViewTestCase {
     private static final String TAG = "BurstCaptureTest";
@@ -48,8 +50,18 @@
                 Log.i(TAG, "Testing YUV Burst for camera " + id);
                 openDevice(id);
 
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                }
+                if (!mStaticInfo.isAeLockSupported() || !mStaticInfo.isAwbLockSupported()) {
+                    Log.i(TAG, "AE/AWB lock is not supported in camera " + id +
+                            ". Skip the test");
+                    continue;
+                }
+
                 if (mStaticInfo.isHardwareLevelLegacy()) {
-                    Log.i(TAG, "Skip burst test on legacy devices.");
+                    Log.i(TAG, "Legacy camera doesn't report min frame duration" +
+                            ". Skip the test");
                     continue;
                 }
 
@@ -72,7 +84,8 @@
         final Size previewSize = mOrderedPreviewSizes.get(0);
 
         // Get maximum YUV_420_888 size
-        final Size stillSize = getMaxPreviewSize(cameraId, mCameraManager);
+        final Size stillSize = getSortedSizesForFormat(
+                cameraId, mCameraManager, ImageFormat.YUV_420_888, /*bound*/null).get(0);
 
         // Find max pipeline depth and sync latency
         final int maxPipelineDepth = mStaticInfo.getCharacteristics().get(
@@ -87,24 +100,32 @@
                 config.getOutputMinFrameDuration(ImageFormat.YUV_420_888, stillSize);
 
         // Find suitable target FPS range - as high as possible
-        Range<Integer>[] fpsRanges = mStaticInfo.getAeAvailableTargetFpsRangesChecked();
-        int minBurstFps = (int) Math.floor(1e9 / minStillFrameDuration);
-        Range<Integer> targetRange = null;
-        for (Range<Integer> candidateRange : fpsRanges) {
-            if (candidateRange.getLower() >= minBurstFps) {
-                if (targetRange == null) {
-                    targetRange = candidateRange;
-                } else if (candidateRange.getLower() > targetRange.getLower()) {
-                    targetRange = candidateRange;
-                } else if (candidateRange.getUpper() > targetRange.getUpper()) {
-                    targetRange = candidateRange;
-                }
+        List<Range<Integer> > fpsRanges = Arrays.asList(
+                mStaticInfo.getAeAvailableTargetFpsRangesChecked());
+        Range<Integer> targetRange = mStaticInfo.getAeMaxTargetFpsRange();
+        // Add 0.05 here so Fps like 29.99 evaluated to 30
+        int minBurstFps = (int) Math.floor(1e9 / minStillFrameDuration + 0.05f);
+        boolean foundConstantMaxYUVRange = false;
+        boolean foundYUVStreamingRange = false;
+
+        for (Range<Integer> fpsRange : fpsRanges) {
+            if (fpsRange.getLower() == minBurstFps && fpsRange.getUpper() == minBurstFps) {
+                foundConstantMaxYUVRange = true;
+            }
+            if (fpsRange.getLower() <= 15 && fpsRange.getUpper() == minBurstFps) {
+                foundYUVStreamingRange = true;
             }
         }
+
+        assertTrue(String.format("Cam %s: Target FPS range of (%d, %d) must be supported",
+                cameraId, minBurstFps, minBurstFps), foundConstantMaxYUVRange);
+        assertTrue(String.format(
+                "Cam %s: Target FPS range of (x, %d) where x <= 15 must be supported",
+                cameraId, minBurstFps), foundYUVStreamingRange);
         assertTrue(String.format("Cam %s: No target FPS range found with minimum FPS above " +
                         " 1/minFrameDuration (%d fps, duration %d ns) for full-resolution YUV",
-                cameraId, minBurstFps, minStillFrameDuration),
-            targetRange != null);
+                        cameraId, minBurstFps, minStillFrameDuration),
+                targetRange.getLower() >= minBurstFps);
 
         Log.i(TAG, String.format("Selected frame rate range %d - %d for YUV burst",
                         targetRange.getLower(), targetRange.getUpper()));
@@ -206,7 +227,7 @@
         mSession.setRepeatingRequest(lockedRequest, resultListener, mHandler);
 
         // Wait for first result with locking
-
+        resultListener.drain();
         CaptureResult lockedResult =
                 resultListener.getCaptureResultForRequest(lockedRequest, maxPipelineDepth);
 
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
index 29c7362..44fda14 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
@@ -23,6 +23,7 @@
 import static android.hardware.camera2.CaptureRequest.*;
 
 import android.content.Context;
+import android.graphics.SurfaceTexture;
 import android.graphics.ImageFormat;
 import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCaptureSession;
@@ -33,8 +34,10 @@
 import android.hardware.camera2.CaptureRequest;
 import android.hardware.camera2.CaptureResult;
 import android.hardware.camera2.TotalCaptureResult;
+import android.hardware.camera2.cts.helpers.StaticMetadata;
 import android.hardware.camera2.cts.testcases.Camera2AndroidTestCase;
 import android.hardware.camera2.params.MeteringRectangle;
+import android.media.ImageReader;
 import android.os.Handler;
 import android.os.SystemClock;
 import android.util.Log;
@@ -49,9 +52,15 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
 import java.util.Set;
+import android.util.Size;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 
@@ -274,6 +283,11 @@
                             sTemplates[j] == CameraDevice.TEMPLATE_VIDEO_SNAPSHOT) {
                         continue;
                     }
+                    // Skip non-PREVIEW templates for non-color output
+                    if (!mStaticInfo.isColorOutputSupported() &&
+                            sTemplates[j] != CameraDevice.TEMPLATE_PREVIEW) {
+                        continue;
+                    }
                     CaptureRequest.Builder capReq = mCamera.createCaptureRequest(sTemplates[j]);
                     assertNotNull("Failed to create capture request", capReq);
                     if (mStaticInfo.areKeysAvailable(CaptureRequest.SENSOR_EXPOSURE_TIME)) {
@@ -380,11 +394,7 @@
                 closeSession();
             }
             finally {
-                try {
-
-                } finally {
-                    closeDevice(mCameraIds[i], mCameraMockListener);
-                }
+                closeDevice(mCameraIds[i], mCameraMockListener);
             }
         }
     }
@@ -401,9 +411,6 @@
      */
     public void testChainedOperation() throws Throwable {
 
-        // Set up single dummy target
-        createDefaultImageReader(DEFAULT_CAPTURE_SIZE, ImageFormat.YUV_420_888, MAX_NUM_IMAGES,
-                /*listener*/ null);
         final ArrayList<Surface> outputs = new ArrayList<>();
         outputs.add(mReaderSurface);
 
@@ -542,6 +549,12 @@
         for (int i = 0; i < mCameraIds.length; i++) {
             Throwable result;
 
+            if (!(new StaticMetadata(mCameraManager.getCameraCharacteristics(mCameraIds[i]))).
+                    isColorOutputSupported()) {
+                Log.i(TAG, "Camera " + mCameraIds[i] + " does not support color outputs, skipping");
+                continue;
+            }
+
             // Start chained cascade
             ChainedCameraListener cameraListener = new ChainedCameraListener();
             mCameraManager.openCamera(mCameraIds[i], cameraListener, mHandler);
@@ -581,6 +594,265 @@
         }
     }
 
+    /**
+     * Verify basic semantics and error conditions of the prepare call.
+     *
+     */
+    public void testPrepare() throws Exception {
+        for (int i = 0; i < mCameraIds.length; i++) {
+            try {
+                openDevice(mCameraIds[i], mCameraMockListener);
+                waitForDeviceState(STATE_OPENED, CAMERA_OPEN_TIMEOUT_MS);
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + mCameraIds[i] +
+                            " does not support color outputs, skipping");
+                    continue;
+                }
+
+                prepareTestByCamera();
+            }
+            finally {
+                closeDevice(mCameraIds[i], mCameraMockListener);
+            }
+        }
+    }
+
+    /**
+     * Verify creating sessions back to back.
+     */
+    public void testCreateSessions() throws Exception {
+        for (int i = 0; i < mCameraIds.length; i++) {
+            try {
+                openDevice(mCameraIds[i], mCameraMockListener);
+                waitForDeviceState(STATE_OPENED, CAMERA_OPEN_TIMEOUT_MS);
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + mCameraIds[i] +
+                            " does not support color outputs, skipping");
+                    continue;
+                }
+
+                testCreateSessionsByCamera(mCameraIds[i]);
+            }
+            finally {
+                closeDevice(mCameraIds[i], mCameraMockListener);
+            }
+        }
+    }
+
+    /**
+     * Verify creating sessions back to back and only the last one is valid for
+     * submitting requests.
+     */
+    private void testCreateSessionsByCamera(String cameraId) throws Exception {
+        final int NUM_SESSIONS = 3;
+        final int SESSION_TIMEOUT_MS = 1000;
+        final int CAPTURE_TIMEOUT_MS = 3000;
+
+        if (VERBOSE) {
+            Log.v(TAG, "Testing creating sessions for camera " + cameraId);
+        }
+
+        Size yuvSize = getSortedSizesForFormat(cameraId, mCameraManager, ImageFormat.YUV_420_888,
+                /*bound*/null).get(0);
+        Size jpegSize = getSortedSizesForFormat(cameraId, mCameraManager, ImageFormat.JPEG,
+                /*bound*/null).get(0);
+
+        // Create a list of image readers. JPEG for last one and YUV for the rest.
+        List<ImageReader> imageReaders = new ArrayList<>();
+        List<CameraCaptureSession> allSessions = new ArrayList<>();
+
+        try {
+            for (int i = 0; i < NUM_SESSIONS - 1; i++) {
+                imageReaders.add(ImageReader.newInstance(yuvSize.getWidth(), yuvSize.getHeight(),
+                        ImageFormat.YUV_420_888, /*maxImages*/1));
+            }
+            imageReaders.add(ImageReader.newInstance(jpegSize.getWidth(), jpegSize.getHeight(),
+                    ImageFormat.JPEG, /*maxImages*/1));
+
+            // Create multiple sessions back to back.
+            MultipleSessionCallback sessionListener =
+                    new MultipleSessionCallback(/*failOnConfigureFailed*/true);
+            for (int i = 0; i < NUM_SESSIONS; i++) {
+                List<Surface> outputs = new ArrayList<>();
+                outputs.add(imageReaders.get(i).getSurface());
+                mCamera.createCaptureSession(outputs, sessionListener, mHandler);
+            }
+
+            // Verify we get onConfigured() for all sessions.
+            allSessions = sessionListener.getAllSessions(NUM_SESSIONS,
+                    SESSION_TIMEOUT_MS * NUM_SESSIONS);
+            assertEquals(String.format("Got %d sessions but configured %d sessions",
+                    allSessions.size(), NUM_SESSIONS), allSessions.size(), NUM_SESSIONS);
+
+            // Verify all sessions except the last one are closed.
+            for (int i = 0; i < NUM_SESSIONS - 1; i++) {
+                sessionListener.waitForSessionClose(allSessions.get(i), SESSION_TIMEOUT_MS);
+            }
+
+            // Verify we can capture a frame with the last session.
+            CameraCaptureSession session = allSessions.get(allSessions.size() - 1);
+            SimpleCaptureCallback captureListener = new SimpleCaptureCallback();
+            ImageReader reader = imageReaders.get(imageReaders.size() - 1);
+            SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
+            reader.setOnImageAvailableListener(imageListener, mHandler);
+
+            CaptureRequest.Builder builder =
+                    mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
+            builder.addTarget(reader.getSurface());
+            CaptureRequest request = builder.build();
+
+            session.capture(request, captureListener, mHandler);
+            captureListener.getCaptureResultForRequest(request, CAPTURE_TIMEOUT_MS);
+            imageListener.getImage(CAPTURE_TIMEOUT_MS).close();
+        } finally {
+            for (ImageReader reader : imageReaders) {
+                reader.close();
+            }
+            for (CameraCaptureSession session : allSessions) {
+                session.close();
+            }
+        }
+    }
+
+    private void prepareTestByCamera() throws Exception {
+        final int PREPARE_TIMEOUT_MS = 10000;
+
+        mSessionMockListener = spy(new BlockingSessionCallback());
+
+        SurfaceTexture output1 = new SurfaceTexture(1);
+        Surface output1Surface = new Surface(output1);
+        SurfaceTexture output2 = new SurfaceTexture(2);
+        Surface output2Surface = new Surface(output2);
+
+        List<Surface> outputSurfaces = new ArrayList<>(
+            Arrays.asList(output1Surface, output2Surface));
+        mCamera.createCaptureSession(outputSurfaces, mSessionMockListener, mHandler);
+
+        mSession = mSessionMockListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
+
+        // Try basic prepare
+
+        mSession.prepare(output1Surface);
+
+        verify(mSessionMockListener, timeout(PREPARE_TIMEOUT_MS).times(1))
+                .onSurfacePrepared(eq(mSession), eq(output1Surface));
+
+        // Should not complain if preparing already prepared stream
+
+        mSession.prepare(output1Surface);
+
+        verify(mSessionMockListener, timeout(PREPARE_TIMEOUT_MS).times(2))
+                .onSurfacePrepared(eq(mSession), eq(output1Surface));
+
+        // Check surface not included in session
+
+        SurfaceTexture output3 = new SurfaceTexture(3);
+        Surface output3Surface = new Surface(output3);
+        try {
+            mSession.prepare(output3Surface);
+            // Legacy camera prepare always succeed
+            if (mStaticInfo.isHardwareLevelLimitedOrBetter()) {
+                fail("Preparing surface not part of session must throw IllegalArgumentException");
+            }
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        // Ensure second prepare also works
+
+        mSession.prepare(output2Surface);
+
+        verify(mSessionMockListener, timeout(PREPARE_TIMEOUT_MS).times(1))
+                .onSurfacePrepared(eq(mSession), eq(output2Surface));
+
+        // Use output1
+
+        CaptureRequest.Builder r = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
+        r.addTarget(output1Surface);
+
+        mSession.capture(r.build(), null, null);
+
+        try {
+            mSession.prepare(output1Surface);
+            // Legacy camera prepare always succeed
+            if (mStaticInfo.isHardwareLevelLimitedOrBetter()) {
+                fail("Preparing already-used surface must throw IllegalArgumentException");
+            }
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        // Create new session with outputs 1 and 3, ensure output1Surface still can't be prepared
+        // again
+
+        mSessionMockListener = spy(new BlockingSessionCallback());
+
+        outputSurfaces = new ArrayList<>(
+            Arrays.asList(output1Surface, output3Surface));
+        mCamera.createCaptureSession(outputSurfaces, mSessionMockListener, mHandler);
+
+        mSession = mSessionMockListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
+
+        try {
+            mSession.prepare(output1Surface);
+            // Legacy camera prepare always succeed
+            if (mStaticInfo.isHardwareLevelLimitedOrBetter()) {
+                fail("Preparing surface used in previous session must throw " +
+                        "IllegalArgumentException");
+            }
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        // Use output3, wait for result, then make sure prepare still doesn't work
+
+        r = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
+        r.addTarget(output3Surface);
+
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
+        mSession.capture(r.build(), resultListener, mHandler);
+
+        resultListener.getCaptureResult(CAPTURE_RESULT_TIMEOUT_MS);
+
+        try {
+            mSession.prepare(output3Surface);
+            // Legacy camera prepare always succeed
+            if (mStaticInfo.isHardwareLevelLimitedOrBetter()) {
+                fail("Preparing already-used surface must throw IllegalArgumentException");
+            }
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        // Create new session with outputs 1 and 2, ensure output2Surface can be prepared again
+
+        mSessionMockListener = spy(new BlockingSessionCallback());
+
+        outputSurfaces = new ArrayList<>(
+            Arrays.asList(output1Surface, output2Surface));
+        mCamera.createCaptureSession(outputSurfaces, mSessionMockListener, mHandler);
+
+        mSession = mSessionMockListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
+
+        mSession.prepare(output2Surface);
+
+        verify(mSessionMockListener, timeout(PREPARE_TIMEOUT_MS).times(1))
+                .onSurfacePrepared(eq(mSession), eq(output2Surface));
+
+        try {
+            mSession.prepare(output1Surface);
+            // Legacy camera prepare always succeed
+            if (mStaticInfo.isHardwareLevelLimitedOrBetter()) {
+                fail("Preparing surface used in previous session must throw " +
+                        "IllegalArgumentException");
+            }
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+    }
+
+
     private void invalidRequestCaptureTestByCamera() throws Exception {
         if (VERBOSE) Log.v(TAG, "invalidRequestCaptureTestByCamera");
 
@@ -729,6 +1001,11 @@
                                 sTemplates[j] == CameraDevice.TEMPLATE_VIDEO_SNAPSHOT) {
                             continue;
                         }
+                        // Skip non-PREVIEW templates for non-color output
+                        if (!mStaticInfo.isColorOutputSupported() &&
+                                sTemplates[j] != CameraDevice.TEMPLATE_PREVIEW) {
+                            continue;
+                        }
                         captureSingleShot(mCameraIds[i], sTemplates[j], repeating, abort);
                     }
                 }
@@ -736,13 +1013,16 @@
                     // Test: burst of one shot
                     captureBurstShot(mCameraIds[i], sTemplates, 1, repeating, abort);
 
+                    int template = mStaticInfo.isColorOutputSupported() ?
+                        CameraDevice.TEMPLATE_STILL_CAPTURE :
+                        CameraDevice.TEMPLATE_PREVIEW;
                     int[] templates = new int[] {
-                            CameraDevice.TEMPLATE_STILL_CAPTURE,
-                            CameraDevice.TEMPLATE_STILL_CAPTURE,
-                            CameraDevice.TEMPLATE_STILL_CAPTURE,
-                            CameraDevice.TEMPLATE_STILL_CAPTURE,
-                            CameraDevice.TEMPLATE_STILL_CAPTURE
-                            };
+                        template,
+                        template,
+                        template,
+                        template,
+                        template
+                    };
 
                     // Test: burst of 5 shots of the same template type
                     captureBurstShot(mCameraIds[i], templates, templates.length, repeating, abort);
@@ -822,6 +1102,11 @@
                     templates[i] == CameraDevice.TEMPLATE_VIDEO_SNAPSHOT) {
                 continue;
             }
+            // Skip non-PREVIEW templates for non-color outpu
+            if (!mStaticInfo.isColorOutputSupported() &&
+                    templates[i] != CameraDevice.TEMPLATE_PREVIEW) {
+                continue;
+            }
             CaptureRequest.Builder requestBuilder = mCamera.createCaptureRequest(templates[i]);
             assertNotNull("Failed to create capture request", requestBuilder);
             requestBuilder.addTarget(mReaderSurface);
@@ -882,13 +1167,18 @@
         mSessionMockListener = spy(new BlockingSessionCallback());
         mSessionWaiter = mSessionMockListener.getStateWaiter();
 
+        if (!mStaticInfo.isColorOutputSupported()) {
+            createDefaultImageReader(getMaxDepthSize(mCamera.getId(), mCameraManager),
+                    ImageFormat.DEPTH16, MAX_NUM_IMAGES, new ImageDropperListener());
+        }
+
         List<Surface> outputSurfaces = new ArrayList<>(Arrays.asList(mReaderSurface));
         mCamera.createCaptureSession(outputSurfaces, mSessionMockListener, mHandler);
 
         mSession = mSessionMockListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
         waitForSessionState(SESSION_CONFIGURED, SESSION_CONFIGURE_TIMEOUT_MS);
         waitForSessionState(SESSION_READY, SESSION_READY_TIMEOUT_MS);
-}
+    }
 
     private void waitForDeviceState(int state, long timeoutMs) {
         mCameraMockListener.waitForState(state, timeoutMs);
@@ -976,9 +1266,9 @@
 
     private void checkAfMode(CaptureRequest.Builder request, int template,
             CameraCharacteristics props) {
-        boolean hasFocuser = !props.getKeys().contains(CameraCharacteristics.
-                LENS_INFO_MINIMUM_FOCUS_DISTANCE) ||
-                props.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE) > 0f;
+        boolean hasFocuser = props.getKeys().contains(CameraCharacteristics.
+                LENS_INFO_MINIMUM_FOCUS_DISTANCE) &&
+                (props.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE) > 0f);
 
         if (!hasFocuser) {
             return;
@@ -1020,6 +1310,8 @@
             return;
         }
 
+        if (!mStaticInfo.isColorOutputSupported()) return;
+
         List<Integer> availableAntiBandingModes =
                 Arrays.asList(toObject(mStaticInfo.getAeAvailableAntiBandingModesChecked()));
 
@@ -1071,12 +1363,16 @@
         }
 
         // 3A settings--AE/AWB/AF.
-        int maxRegionsAe = props.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AE);
-        int maxRegionsAwb = props.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AWB);
-        int maxRegionsAf = props.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AF);
+        Integer maxRegionsAeVal = props.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AE);
+        int maxRegionsAe = maxRegionsAeVal != null ? maxRegionsAeVal : 0;
+        Integer maxRegionsAwbVal = props.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AWB);
+        int maxRegionsAwb = maxRegionsAwbVal != null ? maxRegionsAwbVal : 0;
+        Integer maxRegionsAfVal = props.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AF);
+        int maxRegionsAf = maxRegionsAfVal != null ? maxRegionsAfVal : 0;
+
+        checkFpsRange(request, template, props);
 
         checkAfMode(request, template, props);
-        checkFpsRange(request, template, props);
         checkAntiBandingMode(request, template);
 
         if (template == CameraDevice.TEMPLATE_MANUAL) {
@@ -1086,39 +1382,47 @@
             mCollector.expectKeyValueEquals(request, CONTROL_AWB_MODE,
                     CaptureRequest.CONTROL_AWB_MODE_OFF);
         } else {
-            mCollector.expectKeyValueEquals(request, CONTROL_AE_MODE,
-                    CaptureRequest.CONTROL_AE_MODE_ON);
-            mCollector.expectKeyValueEquals(request, CONTROL_AE_EXPOSURE_COMPENSATION, 0);
-            mCollector.expectKeyValueEquals(request, CONTROL_AE_LOCK, false);
-            mCollector.expectKeyValueEquals(request, CONTROL_AE_PRECAPTURE_TRIGGER,
-                    CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_IDLE);
+            if (mStaticInfo.isColorOutputSupported()) {
+                mCollector.expectKeyValueEquals(request, CONTROL_AE_MODE,
+                        CaptureRequest.CONTROL_AE_MODE_ON);
+                mCollector.expectKeyValueEquals(request, CONTROL_AE_EXPOSURE_COMPENSATION, 0);
+                mCollector.expectKeyValueEquals(request, CONTROL_AE_PRECAPTURE_TRIGGER,
+                        CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_IDLE);
+                // if AE lock is not supported, expect the control key to be non-exist or false
+                if (mStaticInfo.isAeLockSupported() || request.get(CONTROL_AE_LOCK) != null) {
+                    mCollector.expectKeyValueEquals(request, CONTROL_AE_LOCK, false);
+                }
 
-            mCollector.expectKeyValueEquals(request, CONTROL_AF_TRIGGER,
-                    CaptureRequest.CONTROL_AF_TRIGGER_IDLE);
+                mCollector.expectKeyValueEquals(request, CONTROL_AF_TRIGGER,
+                        CaptureRequest.CONTROL_AF_TRIGGER_IDLE);
 
-            mCollector.expectKeyValueEquals(request, CONTROL_AWB_MODE,
-                    CaptureRequest.CONTROL_AWB_MODE_AUTO);
-            mCollector.expectKeyValueEquals(request, CONTROL_AWB_LOCK, false);
+                mCollector.expectKeyValueEquals(request, CONTROL_AWB_MODE,
+                        CaptureRequest.CONTROL_AWB_MODE_AUTO);
+                // if AWB lock is not supported, expect the control key to be non-exist or false
+                if (mStaticInfo.isAwbLockSupported() || request.get(CONTROL_AWB_LOCK) != null) {
+                    mCollector.expectKeyValueEquals(request, CONTROL_AWB_LOCK, false);
+                }
 
-            // Check 3A regions.
-            if (VERBOSE) {
-                Log.v(TAG, String.format("maxRegions is: {AE: %s, AWB: %s, AF: %s}",
-                        maxRegionsAe, maxRegionsAwb, maxRegionsAf));
-            }
-            if (maxRegionsAe > 0) {
-                mCollector.expectKeyValueNotNull(request, CONTROL_AE_REGIONS);
-                MeteringRectangle[] aeRegions = request.get(CONTROL_AE_REGIONS);
-                checkMeteringRect(aeRegions);
-            }
-            if (maxRegionsAwb > 0) {
-                mCollector.expectKeyValueNotNull(request, CONTROL_AWB_REGIONS);
-                MeteringRectangle[] awbRegions = request.get(CONTROL_AWB_REGIONS);
-                checkMeteringRect(awbRegions);
-            }
-            if (maxRegionsAf > 0) {
-                mCollector.expectKeyValueNotNull(request, CONTROL_AF_REGIONS);
-                MeteringRectangle[] afRegions = request.get(CONTROL_AF_REGIONS);
-                checkMeteringRect(afRegions);
+                // Check 3A regions.
+                if (VERBOSE) {
+                    Log.v(TAG, String.format("maxRegions is: {AE: %s, AWB: %s, AF: %s}",
+                                    maxRegionsAe, maxRegionsAwb, maxRegionsAf));
+                }
+                if (maxRegionsAe > 0) {
+                    mCollector.expectKeyValueNotNull(request, CONTROL_AE_REGIONS);
+                    MeteringRectangle[] aeRegions = request.get(CONTROL_AE_REGIONS);
+                    checkMeteringRect(aeRegions);
+                }
+                if (maxRegionsAwb > 0) {
+                    mCollector.expectKeyValueNotNull(request, CONTROL_AWB_REGIONS);
+                    MeteringRectangle[] awbRegions = request.get(CONTROL_AWB_REGIONS);
+                    checkMeteringRect(awbRegions);
+                }
+                if (maxRegionsAf > 0) {
+                    mCollector.expectKeyValueNotNull(request, CONTROL_AF_REGIONS);
+                    MeteringRectangle[] afRegions = request.get(CONTROL_AF_REGIONS);
+                    checkMeteringRect(afRegions);
+                }
             }
         }
 
@@ -1187,10 +1491,12 @@
         }
 
         // ISP-processing settings.
-        mCollector.expectKeyValueEquals(
-                request, STATISTICS_FACE_DETECT_MODE,
-                CaptureRequest.STATISTICS_FACE_DETECT_MODE_OFF);
-        mCollector.expectKeyValueEquals(request, FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
+        if (mStaticInfo.isColorOutputSupported()) {
+            mCollector.expectKeyValueEquals(
+                    request, STATISTICS_FACE_DETECT_MODE,
+                    CaptureRequest.STATISTICS_FACE_DETECT_MODE_OFF);
+            mCollector.expectKeyValueEquals(request, FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
+        }
 
         List<Integer> availableCaps = mStaticInfo.getAvailableCapabilitiesChecked();
         if (mStaticInfo.areKeysAvailable(STATISTICS_LENS_SHADING_MAP_MODE)) {
@@ -1202,6 +1508,11 @@
             }
         }
 
+        // Edge enhancement and noise reduction modes
+        boolean supportReprocessing =
+                availableCaps.contains(REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING) ||
+                availableCaps.contains(REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING);
+
         if (template == CameraDevice.TEMPLATE_STILL_CAPTURE) {
             // Not enforce high quality here, as some devices may not effectively have high quality
             // mode.
@@ -1254,7 +1565,23 @@
                             request, NOISE_REDUCTION_MODE, CaptureRequest.NOISE_REDUCTION_MODE_OFF);
                 }
             }
+        } else if (template == CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG && supportReprocessing) {
+            mCollector.expectKeyValueEquals(request, EDGE_MODE,
+                    CaptureRequest.EDGE_MODE_ZERO_SHUTTER_LAG);
+            mCollector.expectKeyValueEquals(request, NOISE_REDUCTION_MODE,
+                    CaptureRequest.NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG);
+        } else {
+            if (mStaticInfo.areKeysAvailable(EDGE_MODE)) {
+                mCollector.expectKeyValueNotNull(request, EDGE_MODE);
+            }
 
+            if (mStaticInfo.areKeysAvailable(NOISE_REDUCTION_MODE)) {
+                mCollector.expectKeyValueNotNull(request, NOISE_REDUCTION_MODE);
+            }
+        }
+
+        // Tone map and lens shading modes.
+        if (template == CameraDevice.TEMPLATE_STILL_CAPTURE) {
             mCollector.expectEquals("Tonemap mode must be present in request if " +
                             "available tonemap modes are present in metadata, and vice-versa.",
                     mStaticInfo.areKeysAvailable(CameraCharacteristics.
@@ -1281,17 +1608,13 @@
                             STATISTICS_LENS_SHADING_MAP_MODE_ON);
             }
         } else {
-            if (mStaticInfo.areKeysAvailable(EDGE_MODE)) {
-                mCollector.expectKeyValueNotNull(request, EDGE_MODE);
-            }
-
-            if (mStaticInfo.areKeysAvailable(NOISE_REDUCTION_MODE)) {
-                mCollector.expectKeyValueNotNull(request, NOISE_REDUCTION_MODE);
-            }
-
             if (mStaticInfo.areKeysAvailable(TONEMAP_MODE)) {
                 mCollector.expectKeyValueNotEquals(request, TONEMAP_MODE,
                         CaptureRequest.TONEMAP_MODE_CONTRAST_CURVE);
+                mCollector.expectKeyValueNotEquals(request, TONEMAP_MODE,
+                        CaptureRequest.TONEMAP_MODE_GAMMA_VALUE);
+                mCollector.expectKeyValueNotEquals(request, TONEMAP_MODE,
+                        CaptureRequest.TONEMAP_MODE_PRESET_CURVE);
             }
             if (mStaticInfo.areKeysAvailable(STATISTICS_LENS_SHADING_MAP_MODE)) {
                 mCollector.expectKeyValueNotNull(request, STATISTICS_LENS_SHADING_MAP_MODE);
@@ -1325,9 +1648,17 @@
                         !mStaticInfo.isCapabilitySupported(CameraCharacteristics.
                                 REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
                     // OK
+                } else if (template == CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG &&
+                        !mStaticInfo.isCapabilitySupported(CameraCharacteristics.
+                                REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING)) {
+                    // OK.
                 } else if (sLegacySkipTemplates.contains(template) &&
                         mStaticInfo.isHardwareLevelLegacy()) {
                     // OK
+                } else if (template != CameraDevice.TEMPLATE_PREVIEW &&
+                        mStaticInfo.isDepthOutputSupported() &&
+                        !mStaticInfo.isColorOutputSupported()) {
+                    // OK, depth-only devices need only support PREVIEW template
                 } else {
                     throw e; // rethrow
                 }
@@ -1378,4 +1709,97 @@
         mSessionMockListener = null;
         mSessionWaiter = null;
     }
+
+    /**
+     * A camera capture session listener that keeps all the configured and closed sessions.
+     */
+    private class MultipleSessionCallback extends CameraCaptureSession.StateCallback {
+        public static final int SESSION_CONFIGURED = 0;
+        public static final int SESSION_CLOSED = 1;
+
+        final List<CameraCaptureSession> mSessions = new ArrayList<>();
+        final Map<CameraCaptureSession, Integer> mSessionStates = new HashMap<>();
+        CameraCaptureSession mCurrentConfiguredSession = null;
+
+        final ReentrantLock mLock = new ReentrantLock();
+        final Condition mNewStateCond = mLock.newCondition();
+
+        final boolean mFailOnConfigureFailed;
+
+        /**
+         * If failOnConfigureFailed is true, it calls fail() when onConfigureFailed() is invoked
+         * for any session.
+         */
+        public MultipleSessionCallback(boolean failOnConfigureFailed) {
+            mFailOnConfigureFailed = failOnConfigureFailed;
+        }
+
+        @Override
+        public void onClosed(CameraCaptureSession session) {
+            mLock.lock();
+            mSessionStates.put(session, SESSION_CLOSED);
+            mNewStateCond.signal();
+            mLock.unlock();
+        }
+
+        @Override
+        public void onConfigured(CameraCaptureSession session) {
+            mLock.lock();
+            mSessions.add(session);
+            mSessionStates.put(session, SESSION_CONFIGURED);
+            mNewStateCond.signal();
+            mLock.unlock();
+        }
+
+        @Override
+        public void onConfigureFailed(CameraCaptureSession session) {
+            if (mFailOnConfigureFailed) {
+                fail("Configuring a session failed");
+            }
+        }
+
+        /**
+         * Get a number of sessions that have been configured.
+         */
+        public List<CameraCaptureSession> getAllSessions(int numSessions, int timeoutMs)
+                throws Exception {
+            long remainingTime = timeoutMs;
+            mLock.lock();
+            try {
+                while (mSessions.size() < numSessions) {
+                    long startTime = SystemClock.elapsedRealtime();
+                    boolean ret = mNewStateCond.await(remainingTime, TimeUnit.MILLISECONDS);
+                    remainingTime -= (SystemClock.elapsedRealtime() - startTime);
+                    ret &= remainingTime > 0;
+
+                    assertTrue("Get " + numSessions + " sessions timed out after " + timeoutMs +
+                            "ms", ret);
+                }
+
+                return mSessions;
+            } finally {
+                mLock.unlock();
+            }
+        }
+
+        /**
+         * Wait until a previously-configured sessoin is closed or it times out.
+         */
+        public void waitForSessionClose(CameraCaptureSession session, int timeoutMs) throws Exception {
+            long remainingTime = timeoutMs;
+            mLock.lock();
+            try {
+                while (mSessionStates.get(session).equals(SESSION_CLOSED) == false) {
+                    long startTime = SystemClock.elapsedRealtime();
+                    boolean ret = mNewStateCond.await(remainingTime, TimeUnit.MILLISECONDS);
+                    remainingTime -= (SystemClock.elapsedRealtime() - startTime);
+                    ret &= remainingTime > 0;
+
+                    assertTrue("Wait for session close timed out after " + timeoutMs + "ms", ret);
+                }
+            } finally {
+                mLock.unlock();
+            }
+        }
+    }
 }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
index 27ff6d1..77a0c8e 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
@@ -422,38 +422,23 @@
                         new BlockingStateCallback(mockFailListener);
 
                 mCameraManager.openCamera(ids[i], successListener, mHandler);
-
-                try {
-                    mCameraManager.openCamera(ids[i], failListener,
-                            mHandler);
-                } catch (CameraAccessException e) {
-                    // Optional (but common). Camera might fail asynchronously only.
-                    // Don't assert here, otherwise, all subsequent tests will fail because the
-                    // opened camera is never closed.
-                    mCollector.expectEquals(
-                            "If second camera open fails immediately, must be due to"
-                            + "camera being busy for ID: " + ids[i],
-                            CameraAccessException.CAMERA_ERROR, e.getReason());
-                }
+                mCameraManager.openCamera(ids[i], failListener,
+                        mHandler);
 
                 successListener.waitForState(BlockingStateCallback.STATE_OPENED,
                         CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
-                // Have to get the successCamera here, otherwise, it won't be
-                // closed if STATE_ERROR timeout exception occurs.
                 ArgumentCaptor<CameraDevice> argument =
                         ArgumentCaptor.forClass(CameraDevice.class);
                 verify(mockSuccessListener, atLeastOnce()).onOpened(argument.capture());
+                verify(mockSuccessListener, atLeastOnce()).onDisconnected(argument.capture());
 
-                failListener.waitForState(BlockingStateCallback.STATE_ERROR,
+                failListener.waitForState(BlockingStateCallback.STATE_OPENED,
                         CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
+                verify(mockFailListener, atLeastOnce()).onOpened(argument.capture());
 
                 successCamera = verifyCameraStateOpened(
-                        ids[i], mockSuccessListener);
+                        ids[i], mockFailListener);
 
-                verify(mockFailListener)
-                        .onError(
-                                and(notNull(CameraDevice.class), not(eq(successCamera))),
-                                eq(StateCallback.ERROR_CAMERA_IN_USE));
                 verifyNoMoreInteractions(mockFailListener);
             } finally {
                 if (successCamera != null) {
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
index a17041d..c5eb27b 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
@@ -16,8 +16,6 @@
 
 package android.hardware.camera2.cts;
 
-import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
-
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.ImageFormat;
@@ -25,22 +23,33 @@
 import android.graphics.Rect;
 import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCaptureSession;
+import android.hardware.camera2.CameraConstrainedHighSpeedCaptureSession;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CameraManager;
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CaptureFailure;
 import android.hardware.camera2.CaptureRequest;
 import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.cts.helpers.CameraErrorCollector;
+import android.hardware.camera2.cts.helpers.StaticMetadata;
+import android.hardware.camera2.params.InputConfiguration;
 import android.hardware.camera2.TotalCaptureResult;
 import android.hardware.cts.helpers.CameraUtils;
-import android.util.Size;
 import android.hardware.camera2.params.MeteringRectangle;
 import android.hardware.camera2.params.StreamConfigurationMap;
+import android.location.Location;
+import android.location.LocationManager;
+import android.media.ExifInterface;
 import android.media.Image;
 import android.media.ImageReader;
+import android.media.ImageWriter;
 import android.media.Image.Plane;
+import android.os.Build;
+import android.os.Environment;
 import android.os.Handler;
 import android.util.Log;
+import android.util.Pair;
+import android.util.Size;
 import android.view.Display;
 import android.view.Surface;
 import android.view.WindowManager;
@@ -63,10 +72,15 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 
 /**
  * A package private utility class for wrapping up the camera2 cts test common utility functions
@@ -97,6 +111,56 @@
 
     public static final int MAX_READER_IMAGES = 5;
 
+    private static final int EXIF_DATETIME_LENGTH = 19;
+    private static final int EXIF_DATETIME_ERROR_MARGIN_SEC = 60;
+    private static final float EXIF_FOCAL_LENGTH_ERROR_MARGIN = 0.001f;
+    private static final float EXIF_EXPOSURE_TIME_ERROR_MARGIN_RATIO = 0.05f;
+    private static final float EXIF_EXPOSURE_TIME_MIN_ERROR_MARGIN_SEC = 0.002f;
+    private static final float EXIF_APERTURE_ERROR_MARGIN = 0.001f;
+
+    private static final Location sTestLocation0 = new Location(LocationManager.GPS_PROVIDER);
+    private static final Location sTestLocation1 = new Location(LocationManager.GPS_PROVIDER);
+    private static final Location sTestLocation2 = new Location(LocationManager.NETWORK_PROVIDER);
+
+    protected static final String DEBUG_FILE_NAME_BASE =
+            Environment.getExternalStorageDirectory().getPath();
+
+    static {
+        sTestLocation0.setTime(1199145600L);
+        sTestLocation0.setLatitude(37.736071);
+        sTestLocation0.setLongitude(-122.441983);
+        sTestLocation0.setAltitude(21.0);
+
+        sTestLocation1.setTime(1199145601L);
+        sTestLocation1.setLatitude(0.736071);
+        sTestLocation1.setLongitude(0.441983);
+        sTestLocation1.setAltitude(1.0);
+
+        sTestLocation2.setTime(1199145602L);
+        sTestLocation2.setLatitude(-89.736071);
+        sTestLocation2.setLongitude(-179.441983);
+        sTestLocation2.setAltitude(100000.0);
+    }
+
+    // Exif test data vectors.
+    public static final ExifTestData[] EXIF_TEST_DATA = {
+            new ExifTestData(
+                    /*gpsLocation*/ sTestLocation0,
+                    /* orientation */90,
+                    /* jpgQuality */(byte) 80,
+                    /* thumbQuality */(byte) 75),
+            new ExifTestData(
+                    /*gpsLocation*/ sTestLocation1,
+                    /* orientation */180,
+                    /* jpgQuality */(byte) 90,
+                    /* thumbQuality */(byte) 85),
+            new ExifTestData(
+                    /*gpsLocation*/ sTestLocation2,
+                    /* orientation */270,
+                    /* jpgQuality */(byte) 100,
+                    /* thumbQuality */(byte) 100)
+    };
+
     /**
      * Create an {@link android.media.ImageReader} object and get the surface.
      *
@@ -108,7 +172,8 @@
      */
     public static ImageReader makeImageReader(Size size, int format, int maxNumImages,
             ImageReader.OnImageAvailableListener listener, Handler handler) {
-        ImageReader reader =  ImageReader.newInstance(size.getWidth(), size.getHeight(), format,
+        ImageReader reader;
+        reader = ImageReader.newInstance(size.getWidth(), size.getHeight(), format,
                 maxNumImages);
         reader.setOnImageAvailableListener(listener, handler);
         if (VERBOSE) Log.v(TAG, "Created ImageReader size " + size);
@@ -116,6 +181,23 @@
     }
 
     /**
+     * Create an ImageWriter and hook up the ImageListener.
+     *
+     * @param inputSurface The input surface of the ImageWriter.
+     * @param maxImages The max number of Images that can be dequeued simultaneously.
+     * @param listener The listener used by this ImageWriter to notify callbacks
+     * @param handler The handler to post listener callbacks.
+     * @return ImageWriter object created.
+     */
+    public static ImageWriter makeImageWriter(
+            Surface inputSurface, int maxImages,
+            ImageWriter.OnImageReleasedListener listener, Handler handler) {
+        ImageWriter writer = ImageWriter.newInstance(inputSurface, maxImages);
+        writer.setOnImageReleasedListener(listener, handler);
+        return writer;
+    }
+
+    /**
      * Close pending images and clean up an {@link android.media.ImageReader} object.
      * @param reader an {@link android.media.ImageReader} to close.
      */
@@ -126,6 +208,16 @@
     }
 
     /**
+     * Close pending images and clean up an {@link android.media.ImageWriter} object.
+     * @param writer an {@link android.media.ImageWriter} to close.
+     */
+    public static void closeImageWriter(ImageWriter writer) {
+        if (writer != null) {
+            writer.close();
+        }
+    }
+
+    /**
      * Dummy listener that release the image immediately once it is available.
      *
      * <p>
@@ -176,11 +268,52 @@
             implements ImageReader.OnImageAvailableListener {
         private final LinkedBlockingQueue<Image> mQueue =
                 new LinkedBlockingQueue<Image>();
+        // Indicate whether this listener will drop images or not,
+        // when the queued images reaches the reader maxImages
+        private final boolean mAsyncMode;
+        // maxImages held by the queue in async mode.
+        private final int mMaxImages;
+
+        /**
+         * Create a synchronous SimpleImageReaderListener that queues the images
+         * automatically when they are available, no image will be dropped. If
+         * the caller doesn't call getImage(), the producer will eventually run
+         * into buffer starvation.
+         */
+        public SimpleImageReaderListener() {
+            mAsyncMode = false;
+            mMaxImages = 0;
+        }
+
+        /**
+         * Create a synchronous/asynchronous SimpleImageReaderListener that
+         * queues the images automatically when they are available. For
+         * asynchronous listener, image will be dropped if the queued images
+         * reach to maxImages queued. If the caller doesn't call getImage(), the
+         * producer will not be blocked. For synchronous listener, no image will
+         * be dropped. If the caller doesn't call getImage(), the producer will
+         * eventually run into buffer starvation.
+         *
+         * @param asyncMode If the listener is operating at asynchronous mode.
+         * @param maxImages The max number of images held by this listener.
+         */
+        /**
+         *
+         * @param asyncMode
+         */
+        public SimpleImageReaderListener(boolean asyncMode, int maxImages) {
+            mAsyncMode = asyncMode;
+            mMaxImages = maxImages;
+        }
 
         @Override
         public void onImageAvailable(ImageReader reader) {
             try {
                 mQueue.put(reader.acquireNextImage());
+                if (mAsyncMode && mQueue.size() >= mMaxImages) {
+                    Image img = mQueue.poll();
+                    img.close();
+                }
             } catch (InterruptedException e) {
                 throw new UnsupportedOperationException(
                         "Can't handle InterruptedException in onImageAvailable");
@@ -198,17 +331,69 @@
             assertNotNull("Wait for an image timed out in " + timeout + "ms", image);
             return image;
         }
+
+        /**
+         * Drain the pending images held by this listener currently.
+         *
+         */
+        public void drain() {
+            for (int i = 0; i < mQueue.size(); i++) {
+                Image image = mQueue.poll();
+                assertNotNull("Unable to get an image", image);
+                image.close();
+            }
+        }
+    }
+
+    public static class SimpleImageWriterListener implements ImageWriter.OnImageReleasedListener {
+        private final Semaphore mImageReleasedSema = new Semaphore(0);
+        private final ImageWriter mWriter;
+        @Override
+        public void onImageReleased(ImageWriter writer) {
+            if (writer != mWriter) {
+                return;
+            }
+
+            if (VERBOSE) {
+                Log.v(TAG, "Input image is released");
+            }
+            mImageReleasedSema.release();
+        }
+
+        public SimpleImageWriterListener(ImageWriter writer) {
+            if (writer == null) {
+                throw new IllegalArgumentException("writer cannot be null");
+            }
+            mWriter = writer;
+        }
+
+        public void waitForImageReleased(long timeoutMs) throws InterruptedException {
+            if (!mImageReleasedSema.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
+                fail("wait for image available timed out after " + timeoutMs + "ms");
+            }
+        }
     }
 
     public static class SimpleCaptureCallback extends CameraCaptureSession.CaptureCallback {
-        private final LinkedBlockingQueue<CaptureResult> mQueue =
-                new LinkedBlockingQueue<CaptureResult>();
+        private final LinkedBlockingQueue<TotalCaptureResult> mQueue =
+                new LinkedBlockingQueue<TotalCaptureResult>();
+        private final LinkedBlockingQueue<CaptureFailure> mFailureQueue =
+                new LinkedBlockingQueue<>();
+        // Pair<CaptureRequest, Long> is a pair of capture request and timestamp.
+        private final LinkedBlockingQueue<Pair<CaptureRequest, Long>> mCaptureStartQueue =
+                new LinkedBlockingQueue<>();
+
         private AtomicLong mNumFramesArrived = new AtomicLong(0);
 
         @Override
         public void onCaptureStarted(CameraCaptureSession session, CaptureRequest request,
-                long timestamp, long frameNumber)
-        {
+                long timestamp, long frameNumber) {
+            try {
+                mCaptureStartQueue.put(new Pair(request, timestamp));
+            } catch (InterruptedException e) {
+                throw new UnsupportedOperationException(
+                        "Can't handle InterruptedException in onCaptureStarted");
+            }
         }
 
         @Override
@@ -226,6 +411,12 @@
         @Override
         public void onCaptureFailed(CameraCaptureSession session, CaptureRequest request,
                 CaptureFailure failure) {
+            try {
+                mFailureQueue.put(failure);
+            } catch (InterruptedException e) {
+                throw new UnsupportedOperationException(
+                        "Can't handle InterruptedException in onCaptureFailed");
+            }
         }
 
         @Override
@@ -238,8 +429,33 @@
         }
 
         public CaptureResult getCaptureResult(long timeout) {
+            return getTotalCaptureResult(timeout);
+        }
+
+        public TotalCaptureResult getCaptureResult(long timeout, long timestamp) {
             try {
-                CaptureResult result = mQueue.poll(timeout, TimeUnit.MILLISECONDS);
+                long currentTs = -1L;
+                TotalCaptureResult result;
+                while (true) {
+                    result = mQueue.poll(timeout, TimeUnit.MILLISECONDS);
+                    if (result == null) {
+                        throw new RuntimeException(
+                                "Wait for a capture result timed out in " + timeout + "ms");
+                    }
+                    currentTs = result.get(CaptureResult.SENSOR_TIMESTAMP);
+                    if (currentTs == timestamp) {
+                        return result;
+                    }
+                }
+
+            } catch (InterruptedException e) {
+                throw new UnsupportedOperationException("Unhandled interrupted exception", e);
+            }
+        }
+
+        public TotalCaptureResult getTotalCaptureResult(long timeout) {
+            try {
+                TotalCaptureResult result = mQueue.poll(timeout, TimeUnit.MILLISECONDS);
                 assertNotNull("Wait for a capture result timed out in " + timeout + "ms", result);
                 return result;
             } catch (InterruptedException e) {
@@ -263,16 +479,82 @@
          */
         public CaptureResult getCaptureResultForRequest(CaptureRequest myRequest,
                 int numResultsWait) {
+            return getTotalCaptureResultForRequest(myRequest, numResultsWait);
+        }
+
+        /**
+         * Get the {@link #TotalCaptureResult total capture result} for a given
+         * {@link #CaptureRequest capture request}.
+         *
+         * @param myRequest The {@link #CaptureRequest capture request} whose
+         *            corresponding {@link #TotalCaptureResult capture result} was
+         *            being waited for
+         * @param numResultsWait Number of frames to wait for the capture result
+         *            before timeout.
+         * @throws TimeoutRuntimeException If more than numResultsWait results are
+         *            seen before the result matching myRequest arrives, or each
+         *            individual wait for result times out after
+         *            {@value #CAPTURE_RESULT_TIMEOUT_MS}ms.
+         */
+        public TotalCaptureResult getTotalCaptureResultForRequest(CaptureRequest myRequest,
+                int numResultsWait) {
+            ArrayList<CaptureRequest> captureRequests = new ArrayList<>(1);
+            captureRequests.add(myRequest);
+            return getTotalCaptureResultsForRequests(captureRequests, numResultsWait)[0];
+        }
+
+        /**
+         * Get an array of {@link #TotalCaptureResult total capture results} for a given list of
+         * {@link #CaptureRequest capture requests}. This can be used when the order of results
+         * may not the same as the order of requests.
+         *
+         * @param captureRequests The list of {@link #CaptureRequest capture requests} whose
+         *            corresponding {@link #TotalCaptureResult capture results} are
+         *            being waited for.
+         * @param numResultsWait Number of frames to wait for the capture results
+         *            before timeout.
+         * @throws TimeoutRuntimeException If more than numResultsWait results are
+         *            seen before all the results matching captureRequests arrives.
+         */
+        public TotalCaptureResult[] getTotalCaptureResultsForRequests(
+                List<CaptureRequest> captureRequests, int numResultsWait) {
             if (numResultsWait < 0) {
                 throw new IllegalArgumentException("numResultsWait must be no less than 0");
             }
+            if (captureRequests == null || captureRequests.size() == 0) {
+                throw new IllegalArgumentException("captureRequests must have at least 1 request.");
+            }
 
-            CaptureResult result;
+            // Create a request -> a list of result indices map that it will wait for.
+            HashMap<CaptureRequest, ArrayList<Integer>> remainingResultIndicesMap = new HashMap<>();
+            for (int i = 0; i < captureRequests.size(); i++) {
+                CaptureRequest request = captureRequests.get(i);
+                ArrayList<Integer> indices = remainingResultIndicesMap.get(request);
+                if (indices == null) {
+                    indices = new ArrayList<>();
+                    remainingResultIndicesMap.put(request, indices);
+                }
+                indices.add(i);
+            }
+
+            TotalCaptureResult[] results = new TotalCaptureResult[captureRequests.size()];
             int i = 0;
             do {
-                result = getCaptureResult(CAPTURE_RESULT_TIMEOUT_MS);
-                if (result.getRequest().equals(myRequest)) {
-                    return result;
+                TotalCaptureResult result = getTotalCaptureResult(CAPTURE_RESULT_TIMEOUT_MS);
+                CaptureRequest request = result.getRequest();
+                ArrayList<Integer> indices = remainingResultIndicesMap.get(request);
+                if (indices != null) {
+                    results[indices.get(0)] = result;
+                    indices.remove(0);
+
+                    // Remove the entry if all results for this request has been fulfilled.
+                    if (indices.isEmpty()) {
+                        remainingResultIndicesMap.remove(request);
+                    }
+                }
+
+                if (remainingResultIndicesMap.isEmpty()) {
+                    return results;
                 }
             } while (i++ < numResultsWait);
 
@@ -280,10 +562,77 @@
                     + "waiting for " + numResultsWait + " results");
         }
 
+        /**
+         * Get an array list of {@link #CaptureFailure capture failure} with maxNumFailures entries
+         * at most. If it times out before maxNumFailures failures are received, return the failures
+         * received so far.
+         *
+         * @param maxNumFailures The maximal number of failures to return. If it times out before
+         *                       the maximal number of failures are received, return the received
+         *                       failures so far.
+         * @throws UnsupportedOperationException If an error happens while waiting on the failure.
+         */
+        public ArrayList<CaptureFailure> getCaptureFailures(long maxNumFailures) {
+            ArrayList<CaptureFailure> failures = new ArrayList<>();
+            try {
+                for (int i = 0; i < maxNumFailures; i++) {
+                    CaptureFailure failure = mFailureQueue.poll(CAPTURE_RESULT_TIMEOUT_MS,
+                            TimeUnit.MILLISECONDS);
+                    if (failure == null) {
+                        // If waiting on a failure times out, return the failures so far.
+                        break;
+                    }
+                    failures.add(failure);
+                }
+            }  catch (InterruptedException e) {
+                throw new UnsupportedOperationException("Unhandled interrupted exception", e);
+            }
+
+            return failures;
+        }
+
+        /**
+         * Wait until the capture start of a request and expected timestamp arrives or it times
+         * out after a number of capture starts.
+         *
+         * @param request The request for the capture start to wait for.
+         * @param timestamp The timestamp for the capture start to wait for.
+         * @param numCaptureStartsWait The number of capture start events to wait for before timing
+         *                             out.
+         */
+        public void waitForCaptureStart(CaptureRequest request, Long timestamp,
+                int numCaptureStartsWait) throws Exception {
+            Pair<CaptureRequest, Long> expectedShutter = new Pair<>(request, timestamp);
+
+            int i = 0;
+            do {
+                Pair<CaptureRequest, Long> shutter = mCaptureStartQueue.poll(
+                        CAPTURE_RESULT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+
+                if (shutter == null) {
+                    throw new TimeoutRuntimeException("Unable to get any more capture start " +
+                            "event after waiting for " + CAPTURE_RESULT_TIMEOUT_MS + " ms.");
+                } else if (expectedShutter.equals(shutter)) {
+                    return;
+                }
+
+            } while (i++ < numCaptureStartsWait);
+
+            throw new TimeoutRuntimeException("Unable to get the expected capture start " +
+                    "event after waiting for " + numCaptureStartsWait + " capture starts");
+        }
+
         public boolean hasMoreResults()
         {
             return mQueue.isEmpty();
         }
+
+        public void drain() {
+            mQueue.clear();
+            mNumFramesArrived.getAndSet(0);
+            mFailureQueue.clear();
+            mCaptureStartQueue.clear();
+        }
     }
 
     /**
@@ -342,6 +691,36 @@
     }
 
     /**
+     * Configure a new camera session with output surfaces and type.
+     *
+     * @param camera The CameraDevice to be configured.
+     * @param outputSurfaces The surface list that used for camera output.
+     * @param listener The callback CameraDevice will notify when capture results are available.
+     */
+    public static CameraCaptureSession configureCameraSession(CameraDevice camera,
+            List<Surface> outputSurfaces, boolean isHighSpeed,
+            CameraCaptureSession.StateCallback listener, Handler handler)
+            throws CameraAccessException {
+        BlockingSessionCallback sessionListener = new BlockingSessionCallback(listener);
+        if (isHighSpeed) {
+            camera.createConstrainedHighSpeedCaptureSession(outputSurfaces,
+                    sessionListener, handler);
+        } else {
+            camera.createCaptureSession(outputSurfaces, sessionListener, handler);
+        }
+        CameraCaptureSession session =
+                sessionListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
+        assertFalse("Camera session should not be a reprocessable session",
+                session.isReprocessable());
+        String sessionType = isHighSpeed ? "High Speed" : "Normal";
+        assertTrue("Capture session type must be " + sessionType,
+                isHighSpeed ==
+                CameraConstrainedHighSpeedCaptureSession.class.isAssignableFrom(session.getClass()));
+
+        return session;
+    }
+
+    /**
      * Configure a new camera session with output surfaces.
      *
      * @param camera The CameraDevice to be configured.
@@ -352,10 +731,32 @@
             List<Surface> outputSurfaces,
             CameraCaptureSession.StateCallback listener, Handler handler)
             throws CameraAccessException {
-        BlockingSessionCallback sessionListener = new BlockingSessionCallback(listener);
-        camera.createCaptureSession(outputSurfaces, sessionListener, handler);
 
-        return sessionListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
+        return configureCameraSession(camera, outputSurfaces, /*isHighSpeed*/false,
+                listener, handler);
+    }
+
+    public static CameraCaptureSession configureReprocessableCameraSession(CameraDevice camera,
+            InputConfiguration inputConfiguration, List<Surface> outputSurfaces,
+            CameraCaptureSession.StateCallback listener, Handler handler)
+            throws CameraAccessException {
+        BlockingSessionCallback sessionListener = new BlockingSessionCallback(listener);
+        camera.createReprocessableCaptureSession(inputConfiguration, outputSurfaces,
+                sessionListener, handler);
+
+        Integer[] sessionStates = {BlockingSessionCallback.SESSION_READY,
+                                   BlockingSessionCallback.SESSION_CONFIGURE_FAILED};
+        int state = sessionListener.getStateWaiter().waitForAnyOfStates(
+                Arrays.asList(sessionStates), SESSION_CONFIGURE_TIMEOUT_MS);
+
+        assertTrue("Creating a reprocessable session failed.",
+                state == BlockingSessionCallback.SESSION_READY);
+
+        CameraCaptureSession session =
+                sessionListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
+        assertTrue("Camera session should be a reprocessable session", session.isReprocessable());
+
+        return session;
     }
 
     public static <T> void assertArrayNotEmpty(T arr, String message) {
@@ -377,6 +778,10 @@
      * Check if image size and format match given size and format.
      */
     public static void checkImage(Image image, int width, int height, int format) {
+        // Image reader will wrap YV12/NV21 image by YUV_420_888
+        if (format == ImageFormat.NV21 || format == ImageFormat.YV12) {
+            format = ImageFormat.YUV_420_888;
+        }
         assertNotNull("Input image is invalid", image);
         assertEquals("Format doesn't match", format, image.getFormat());
         assertEquals("Width doesn't match", width, image.getWidth());
@@ -412,9 +817,10 @@
 
         ByteBuffer buffer = null;
         // JPEG doesn't have pixelstride and rowstride, treat it as 1D buffer.
-        if (format == ImageFormat.JPEG) {
+        // Same goes for DEPTH_POINT_CLOUD
+        if (format == ImageFormat.JPEG || format == ImageFormat.DEPTH_POINT_CLOUD) {
             buffer = planes[0].getBuffer();
-            assertNotNull("Fail to get jpeg ByteBuffer", buffer);
+            assertNotNull("Fail to get jpeg or depth ByteBuffer", buffer);
             data = new byte[buffer.remaining()];
             buffer.get(data);
             buffer.rewind();
@@ -492,7 +898,9 @@
                 break;
             case ImageFormat.JPEG:
             case ImageFormat.RAW_SENSOR:
-                assertEquals("Jpeg Image should have one plane", 1, planes.length);
+            case ImageFormat.DEPTH16:
+            case ImageFormat.DEPTH_POINT_CLOUD:
+                assertEquals("JPEG/RAW/depth Images should have one plane", 1, planes.length);
                 break;
             default:
                 fail("Unsupported Image Format: " + format);
@@ -548,7 +956,46 @@
         StreamConfigurationMap configMap =
                 properties.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
         Size[] availableSizes = configMap.getOutputSizes(format);
-        assertArrayNotEmpty(availableSizes, "availableSizes should not be empty");
+        assertArrayNotEmpty(availableSizes, "availableSizes should not be empty for format: "
+                + format);
+        Size[] highResAvailableSizes = configMap.getHighResolutionOutputSizes(format);
+        if (highResAvailableSizes != null && highResAvailableSizes.length > 0) {
+            Size[] allSizes = new Size[availableSizes.length + highResAvailableSizes.length];
+            System.arraycopy(availableSizes, 0, allSizes, 0,
+                    availableSizes.length);
+            System.arraycopy(highResAvailableSizes, 0, allSizes, availableSizes.length,
+                    highResAvailableSizes.length);
+            availableSizes = allSizes;
+        }
+        if (VERBOSE) Log.v(TAG, "Supported sizes are: " + Arrays.deepToString(availableSizes));
+        return availableSizes;
+    }
+
+    /**
+     * Get the available output sizes for the given class.
+     *
+     */
+    public static Size[] getSupportedSizeForClass(Class klass, String cameraId,
+            CameraManager cameraManager) throws CameraAccessException {
+        CameraCharacteristics properties = cameraManager.getCameraCharacteristics(cameraId);
+        assertNotNull("Can't get camera characteristics!", properties);
+        if (VERBOSE) {
+            Log.v(TAG, "get camera characteristics for camera: " + cameraId);
+        }
+        StreamConfigurationMap configMap =
+                properties.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+        Size[] availableSizes = configMap.getOutputSizes(klass);
+        assertArrayNotEmpty(availableSizes, "availableSizes should not be empty for class: "
+                + klass);
+        Size[] highResAvailableSizes = configMap.getHighResolutionOutputSizes(ImageFormat.PRIVATE);
+        if (highResAvailableSizes != null && highResAvailableSizes.length > 0) {
+            Size[] allSizes = new Size[availableSizes.length + highResAvailableSizes.length];
+            System.arraycopy(availableSizes, 0, allSizes, 0,
+                    availableSizes.length);
+            System.arraycopy(highResAvailableSizes, 0, allSizes, availableSizes.length,
+                    highResAvailableSizes.length);
+            availableSizes = allSizes;
+        }
         if (VERBOSE) Log.v(TAG, "Supported sizes are: " + Arrays.deepToString(availableSizes));
         return availableSizes;
     }
@@ -572,10 +1019,9 @@
      */
     static public List<Size> getSupportedPreviewSizes(String cameraId,
             CameraManager cameraManager, Size bound) throws CameraAccessException {
-        CameraCharacteristics props = cameraManager.getCameraCharacteristics(cameraId);
-        StreamConfigurationMap config =
-                props.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
-        Size[] rawSizes = config.getOutputSizes(android.view.SurfaceHolder.class);
+
+        Size[] rawSizes = getSupportedSizeForClass(android.view.SurfaceHolder.class, cameraId,
+                cameraManager);
         assertArrayNotEmpty(rawSizes,
                 "Available sizes for SurfaceHolder class should not be empty");
         if (VERBOSE) {
@@ -661,10 +1107,9 @@
      */
     static public List<Size> getSupportedVideoSizes(String cameraId,
             CameraManager cameraManager, Size bound) throws CameraAccessException {
-        CameraCharacteristics props = cameraManager.getCameraCharacteristics(cameraId);
-        StreamConfigurationMap config =
-                props.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
-        Size[] rawSizes = config.getOutputSizes(android.media.MediaRecorder.class);
+
+        Size[] rawSizes = getSupportedSizeForClass(android.media.MediaRecorder.class,
+                cameraId, cameraManager);
         assertArrayNotEmpty(rawSizes,
                 "Available sizes for MediaRecorder class should not be empty");
         if (VERBOSE) {
@@ -722,6 +1167,16 @@
     }
 
     /**
+     * Get max depth size for a camera device.
+     */
+    static public Size getMaxDepthSize(String cameraId, CameraManager cameraManager)
+            throws CameraAccessException {
+        List<Size> sizes = getSortedSizesForFormat(cameraId, cameraManager, ImageFormat.DEPTH16,
+                /*bound*/ null);
+        return sizes.get(0);
+    }
+
+    /**
      * Get the largest size by area.
      *
      * @param sizes an array of sizes, must have at least 1 element
@@ -730,7 +1185,7 @@
      *
      * @throws IllegalArgumentException if sizes was null or had 0 elements
      */
-    public static Size getMaxSize(Size[] sizes) {
+    public static Size getMaxSize(Size... sizes) {
         if (sizes == null || sizes.length == 0) {
             throw new IllegalArgumentException("sizes was empty");
         }
@@ -825,10 +1280,6 @@
 
     /**
      * Validate image based on format and size.
-     * <p>
-     * Only RAW_SENSOR, YUV420_888 and JPEG formats are supported. Calling this
-     * method with other formats will cause a UnsupportedOperationException.
-     * </p>
      *
      * @param image The image to be validated.
      * @param width The image width.
@@ -836,8 +1287,7 @@
      * @param format The image format.
      * @param filePath The debug dump file path, null if don't want to dump to
      *            file.
-     * @throws UnsupportedOperationException if calling with format other than
-     *             RAW_SENSOR, YUV420_888 or JPEG.
+     * @throws UnsupportedOperationException if calling with an unknown format
      */
     public static void validateImage(Image image, int width, int height, int format,
             String filePath) {
@@ -864,6 +1314,12 @@
             case ImageFormat.RAW_SENSOR:
                 validateRaw16Data(data, width, height, format, image.getTimestamp(), filePath);
                 break;
+            case ImageFormat.DEPTH16:
+                validateDepth16Data(data, width, height, format, image.getTimestamp(), filePath);
+                break;
+            case ImageFormat.DEPTH_POINT_CLOUD:
+                validateDepthPointCloudData(data, width, height, format, image.getTimestamp(), filePath);
+                break;
             default:
                 throw new UnsupportedOperationException("Unsupported format for validation: "
                         + format);
@@ -947,7 +1403,7 @@
             long ts, String filePath) {
         if (VERBOSE) Log.v(TAG, "Validating raw data");
         int expectedSize = width * height * ImageFormat.getBitsPerPixel(format) / 8;
-        assertEquals("Yuv data doesn't match", expectedSize, rawData.length);
+        assertEquals("Raw data doesn't match", expectedSize, rawData.length);
 
         // TODO: Can add data validation for test pattern.
 
@@ -960,6 +1416,41 @@
         return;
     }
 
+    private static void validateDepth16Data(byte[] depthData, int width, int height, int format,
+            long ts, String filePath) {
+
+        if (VERBOSE) Log.v(TAG, "Validating depth16 data");
+        int expectedSize = width * height * ImageFormat.getBitsPerPixel(format) / 8;
+        assertEquals("Depth data doesn't match", expectedSize, depthData.length);
+
+
+        if (DEBUG && filePath != null) {
+            String fileName =
+                    filePath + "/" + width + "x" + height + "_" + ts / 1e6 + ".depth16";
+            dumpFile(fileName, depthData);
+        }
+
+        return;
+
+    }
+
+    private static void validateDepthPointCloudData(byte[] depthData, int width, int height, int format,
+            long ts, String filePath) {
+
+        if (VERBOSE) Log.v(TAG, "Validating depth point cloud data");
+
+        // Can't validate size since it is variable
+
+        if (DEBUG && filePath != null) {
+            String fileName =
+                    filePath + "/" + width + "x" + height + "_" + ts / 1e6 + ".depth_point_cloud";
+            dumpFile(fileName, depthData);
+        }
+
+        return;
+
+    }
+
     public static <T> T getValueNotNull(CaptureResult result, CaptureResult.Key<T> key) {
         if (result == null) {
             throw new IllegalArgumentException("Result must not be null");
@@ -970,6 +1461,17 @@
         return value;
     }
 
+    public static <T> T getValueNotNull(CameraCharacteristics characteristics,
+            CameraCharacteristics.Key<T> key) {
+        if (characteristics == null) {
+            throw new IllegalArgumentException("Camera characteristics must not be null");
+        }
+
+        T value = characteristics.get(key);
+        assertNotNull("Value of Key " + key.getName() + "shouldn't be null", value);
+        return value;
+    }
+
     /**
      * Get a crop region for a given zoom factor and center position.
      * <p>
@@ -1061,6 +1563,553 @@
         return resultRegions;
     }
 
+    /**
+     * Copy source image data to destination image.
+     *
+     * @param src The source image to be copied from.
+     * @param dst The destination image to be copied to.
+     * @throws IllegalArgumentException If the source and destination images have
+     *             different format, or one of the images is not copyable.
+     */
+    public static void imageCopy(Image src, Image dst) {
+        if (src == null || dst == null) {
+            throw new IllegalArgumentException("Images should be non-null");
+        }
+        if (src.getFormat() != dst.getFormat()) {
+            throw new IllegalArgumentException("Src and dst images should have the same format");
+        }
+        if (src.getFormat() == ImageFormat.PRIVATE ||
+                dst.getFormat() == ImageFormat.PRIVATE) {
+            throw new IllegalArgumentException("PRIVATE format images are not copyable");
+        }
+
+        // TODO: check the owner of the dst image, it must be from ImageWriter, other source may
+        // not be writable. Maybe we should add an isWritable() method in image class.
+
+        Plane[] srcPlanes = src.getPlanes();
+        Plane[] dstPlanes = dst.getPlanes();
+        ByteBuffer srcBuffer = null;
+        ByteBuffer dstBuffer = null;
+        for (int i = 0; i < srcPlanes.length; i++) {
+            srcBuffer = srcPlanes[i].getBuffer();
+            int srcPos = srcBuffer.position();
+            srcBuffer.rewind();
+            dstBuffer = dstPlanes[i].getBuffer();
+            dstBuffer.rewind();
+            dstBuffer.put(srcBuffer);
+            srcBuffer.position(srcPos);
+            dstBuffer.rewind();
+        }
+    }
+
+    /**
+     * <p>
+     * Checks whether the two images are strongly equal.
+     * </p>
+     * <p>
+     * Two images are strongly equal if and only if the data, formats, sizes,
+     * and timestamps are same. For {@link ImageFormat#PRIVATE PRIVATE} format
+     * images, the image data is not not accessible thus the data comparison is
+     * effectively skipped as the number of planes is zero.
+     * </p>
+     * <p>
+     * Note that this method compares the pixel data even outside of the crop
+     * region, which may not be necessary for general use case.
+     * </p>
+     *
+     * @param lhsImg First image to be compared with.
+     * @param rhsImg Second image to be compared with.
+     * @return true if the two images are equal, false otherwise.
+     * @throws IllegalArgumentException If either of image is null.
+     */
+    public static boolean isImageStronglyEqual(Image lhsImg, Image rhsImg) {
+        if (lhsImg == null || rhsImg == null) {
+            throw new IllegalArgumentException("Images should be non-null");
+        }
+
+        if (lhsImg.getFormat() != rhsImg.getFormat()) {
+            Log.i(TAG, "lhsImg format " + lhsImg.getFormat() + " is different with rhsImg format "
+                    + rhsImg.getFormat());
+            return false;
+        }
+
+        if (lhsImg.getWidth() != rhsImg.getWidth()) {
+            Log.i(TAG, "lhsImg width " + lhsImg.getWidth() + " is different with rhsImg width "
+                    + rhsImg.getWidth());
+            return false;
+        }
+
+        if (lhsImg.getHeight() != rhsImg.getHeight()) {
+            Log.i(TAG, "lhsImg height " + lhsImg.getHeight() + " is different with rhsImg height "
+                    + rhsImg.getHeight());
+            return false;
+        }
+
+        if (lhsImg.getTimestamp() != rhsImg.getTimestamp()) {
+            Log.i(TAG, "lhsImg timestamp " + lhsImg.getTimestamp()
+                    + " is different with rhsImg timestamp " + rhsImg.getTimestamp());
+            return false;
+        }
+
+        if (!lhsImg.getCropRect().equals(rhsImg.getCropRect())) {
+            Log.i(TAG, "lhsImg crop rect " + lhsImg.getCropRect()
+                    + " is different with rhsImg crop rect " + rhsImg.getCropRect());
+            return false;
+        }
+
+        // Compare data inside of the image.
+        Plane[] lhsPlanes = lhsImg.getPlanes();
+        Plane[] rhsPlanes = rhsImg.getPlanes();
+        ByteBuffer lhsBuffer = null;
+        ByteBuffer rhsBuffer = null;
+        for (int i = 0; i < lhsPlanes.length; i++) {
+            lhsBuffer = lhsPlanes[i].getBuffer();
+            rhsBuffer = rhsPlanes[i].getBuffer();
+            if (!lhsBuffer.equals(rhsBuffer)) {
+                Log.i(TAG, "byte buffers for plane " +  i + " don't matach.");
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * Set jpeg related keys in a capture request builder.
+     *
+     * @param builder The capture request builder to set the keys inl
+     * @param exifData The exif data to set.
+     * @param thumbnailSize The thumbnail size to set.
+     * @param collector The camera error collector to collect errors.
+     */
+    public static void setJpegKeys(CaptureRequest.Builder builder, ExifTestData exifData,
+            Size thumbnailSize, CameraErrorCollector collector) {
+        builder.set(CaptureRequest.JPEG_THUMBNAIL_SIZE, thumbnailSize);
+        builder.set(CaptureRequest.JPEG_GPS_LOCATION, exifData.gpsLocation);
+        builder.set(CaptureRequest.JPEG_ORIENTATION, exifData.jpegOrientation);
+        builder.set(CaptureRequest.JPEG_QUALITY, exifData.jpegQuality);
+        builder.set(CaptureRequest.JPEG_THUMBNAIL_QUALITY,
+                exifData.thumbnailQuality);
+
+        // Validate request set and get.
+        collector.expectEquals("JPEG thumbnail size request set and get should match",
+                thumbnailSize, builder.get(CaptureRequest.JPEG_THUMBNAIL_SIZE));
+        collector.expectTrue("GPS locations request set and get should match.",
+                areGpsFieldsEqual(exifData.gpsLocation,
+                builder.get(CaptureRequest.JPEG_GPS_LOCATION)));
+        collector.expectEquals("JPEG orientation request set and get should match",
+                exifData.jpegOrientation,
+                builder.get(CaptureRequest.JPEG_ORIENTATION));
+        collector.expectEquals("JPEG quality request set and get should match",
+                exifData.jpegQuality, builder.get(CaptureRequest.JPEG_QUALITY));
+        collector.expectEquals("JPEG thumbnail quality request set and get should match",
+                exifData.thumbnailQuality,
+                builder.get(CaptureRequest.JPEG_THUMBNAIL_QUALITY));
+    }
+
+    /**
+     * Simple validation of JPEG image size and format.
+     * <p>
+     * Only validate the image object sanity. It is fast, but doesn't actually
+     * check the buffer data. Assert is used here as it make no sense to
+     * continue the test if the jpeg image captured has some serious failures.
+     * </p>
+     *
+     * @param image The captured jpeg image
+     * @param expectedSize Expected capture jpeg size
+     */
+    public static void basicValidateJpegImage(Image image, Size expectedSize) {
+        Size imageSz = new Size(image.getWidth(), image.getHeight());
+        assertTrue(
+                String.format("Image size doesn't match (expected %s, actual %s) ",
+                        expectedSize.toString(), imageSz.toString()), expectedSize.equals(imageSz));
+        assertEquals("Image format should be JPEG", ImageFormat.JPEG, image.getFormat());
+        assertNotNull("Image plane shouldn't be null", image.getPlanes());
+        assertEquals("Image plane number should be 1", 1, image.getPlanes().length);
+
+        // Jpeg decoding validate was done in ImageReaderTest, no need to duplicate the test here.
+    }
+
+    /**
+     * Verify the JPEG EXIF and JPEG related keys in a capture result are expected.
+     * - Capture request get values are same as were set.
+     * - capture result's exif data is the same as was set by
+     *   the capture request.
+     * - new tags in the result set by the camera service are
+     *   present and semantically correct.
+     *
+     * @param image The output JPEG image to verify.
+     * @param captureResult The capture result to verify.
+     * @param expectedSize The expected JPEG size.
+     * @param expectedThumbnailSize The expected thumbnail size.
+     * @param expectedExifData The expected EXIF data
+     * @param staticInfo The static metadata for the camera device.
+     * @param jpegFilename The filename to dump the jpeg to.
+     * @param collector The camera error collector to collect errors.
+     */
+    public static void verifyJpegKeys(Image image, CaptureResult captureResult, Size expectedSize,
+            Size expectedThumbnailSize, ExifTestData expectedExifData, StaticMetadata staticInfo,
+            CameraErrorCollector collector) throws Exception {
+
+        basicValidateJpegImage(image, expectedSize);
+
+        byte[] jpegBuffer = getDataFromImage(image);
+        // Have to dump into a file to be able to use ExifInterface
+        String jpegFilename = DEBUG_FILE_NAME_BASE + "/verifyJpegKeys.jpeg";
+        dumpFile(jpegFilename, jpegBuffer);
+        ExifInterface exif = new ExifInterface(jpegFilename);
+
+        if (expectedThumbnailSize.equals(new Size(0,0))) {
+            collector.expectTrue("Jpeg shouldn't have thumbnail when thumbnail size is (0, 0)",
+                    !exif.hasThumbnail());
+        } else {
+            collector.expectTrue("Jpeg must have thumbnail for thumbnail size " +
+                    expectedThumbnailSize, exif.hasThumbnail());
+        }
+
+        // Validate capture result vs. request
+        Size resultThumbnailSize = captureResult.get(CaptureResult.JPEG_THUMBNAIL_SIZE);
+        int orientationTested = expectedExifData.jpegOrientation;
+        // Legacy shim always doesn't rotate thumbnail size
+        if ((orientationTested == 90 || orientationTested == 270) &&
+                staticInfo.isHardwareLevelLimitedOrBetter()) {
+            int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
+                    /*defaultValue*/-1);
+            if (exifOrientation == ExifInterface.ORIENTATION_UNDEFINED) {
+                // Device physically rotated image+thumbnail data
+                // Expect thumbnail size to be also rotated
+                resultThumbnailSize = new Size(resultThumbnailSize.getHeight(),
+                        resultThumbnailSize.getWidth());
+            }
+        }
+
+        collector.expectEquals("JPEG thumbnail size result and request should match",
+                expectedThumbnailSize, resultThumbnailSize);
+        if (collector.expectKeyValueNotNull(captureResult, CaptureResult.JPEG_GPS_LOCATION) !=
+                null) {
+            collector.expectTrue("GPS location result and request should match.",
+                    areGpsFieldsEqual(expectedExifData.gpsLocation,
+                    captureResult.get(CaptureResult.JPEG_GPS_LOCATION)));
+        }
+        collector.expectEquals("JPEG orientation result and request should match",
+                expectedExifData.jpegOrientation,
+                captureResult.get(CaptureResult.JPEG_ORIENTATION));
+        collector.expectEquals("JPEG quality result and request should match",
+                expectedExifData.jpegQuality, captureResult.get(CaptureResult.JPEG_QUALITY));
+        collector.expectEquals("JPEG thumbnail quality result and request should match",
+                expectedExifData.thumbnailQuality,
+                captureResult.get(CaptureResult.JPEG_THUMBNAIL_QUALITY));
+
+        // Validate other exif tags for all non-legacy devices
+        if (!staticInfo.isHardwareLevelLegacy()) {
+            verifyJpegExifExtraTags(exif, expectedSize, captureResult, staticInfo, collector);
+        }
+    }
+
+    /**
+     * Get the degree of an EXIF orientation.
+     */
+    private static int getExifOrientationInDegree(int exifOrientation,
+            CameraErrorCollector collector) {
+        switch (exifOrientation) {
+            case ExifInterface.ORIENTATION_NORMAL:
+                return 0;
+            case ExifInterface.ORIENTATION_ROTATE_90:
+                return 90;
+            case ExifInterface.ORIENTATION_ROTATE_180:
+                return 180;
+            case ExifInterface.ORIENTATION_ROTATE_270:
+                return 270;
+            default:
+                collector.addMessage("It is impossible to get non 0, 90, 180, 270 degress exif" +
+                        "info based on the request orientation range");
+                return 0;
+        }
+    }
+
+    /**
+     * Validate and return the focal length.
+     *
+     * @param result Capture result to get the focal length
+     * @return Focal length from capture result or -1 if focal length is not available.
+     */
+    private static float validateFocalLength(CaptureResult result, StaticMetadata staticInfo,
+            CameraErrorCollector collector) {
+        float[] focalLengths = staticInfo.getAvailableFocalLengthsChecked();
+        Float resultFocalLength = result.get(CaptureResult.LENS_FOCAL_LENGTH);
+        if (collector.expectTrue("Focal length is invalid",
+                resultFocalLength != null && resultFocalLength > 0)) {
+            List<Float> focalLengthList =
+                    Arrays.asList(CameraTestUtils.toObject(focalLengths));
+            collector.expectTrue("Focal length should be one of the available focal length",
+                    focalLengthList.contains(resultFocalLength));
+            return resultFocalLength;
+        }
+        return -1;
+    }
+
+    /**
+     * Validate and return the aperture.
+     *
+     * @param result Capture result to get the aperture
+     * @return Aperture from capture result or -1 if aperture is not available.
+     */
+    private static float validateAperture(CaptureResult result, StaticMetadata staticInfo,
+            CameraErrorCollector collector) {
+        float[] apertures = staticInfo.getAvailableAperturesChecked();
+        Float resultAperture = result.get(CaptureResult.LENS_APERTURE);
+        if (collector.expectTrue("Capture result aperture is invalid",
+                resultAperture != null && resultAperture > 0)) {
+            List<Float> apertureList =
+                    Arrays.asList(CameraTestUtils.toObject(apertures));
+            collector.expectTrue("Aperture should be one of the available apertures",
+                    apertureList.contains(resultAperture));
+            return resultAperture;
+        }
+        return -1;
+    }
+
+    /**
+     * Return the closest value in an array of floats.
+     */
+    private static float getClosestValueInArray(float[] values, float target) {
+        int minIdx = 0;
+        float minDistance = Math.abs(values[0] - target);
+        for(int i = 0; i < values.length; i++) {
+            float distance = Math.abs(values[i] - target);
+            if (minDistance > distance) {
+                minDistance = distance;
+                minIdx = i;
+            }
+        }
+
+        return values[minIdx];
+    }
+
+    /**
+     * Return if two Location's GPS field are the same.
+     */
+    private static boolean areGpsFieldsEqual(Location a, Location b) {
+        if (a == null || b == null) {
+            return false;
+        }
+
+        return a.getTime() == b.getTime() && a.getLatitude() == b.getLatitude() &&
+                a.getLongitude() == b.getLongitude() && a.getAltitude() == b.getAltitude() &&
+                a.getProvider() == b.getProvider();
+    }
+
+    /**
+     * Verify extra tags in JPEG EXIF
+     */
+    private static void verifyJpegExifExtraTags(ExifInterface exif, Size jpegSize,
+            CaptureResult result, StaticMetadata staticInfo, CameraErrorCollector collector)
+            throws ParseException {
+        /**
+         * TAG_IMAGE_WIDTH and TAG_IMAGE_LENGTH and TAG_ORIENTATION.
+         * Orientation and exif width/height need to be tested carefully, two cases:
+         *
+         * 1. Device rotate the image buffer physically, then exif width/height may not match
+         * the requested still capture size, we need swap them to check.
+         *
+         * 2. Device use the exif tag to record the image orientation, it doesn't rotate
+         * the jpeg image buffer itself. In this case, the exif width/height should always match
+         * the requested still capture size, and the exif orientation should always match the
+         * requested orientation.
+         *
+         */
+        int exifWidth = exif.getAttributeInt(ExifInterface.TAG_IMAGE_WIDTH, /*defaultValue*/0);
+        int exifHeight = exif.getAttributeInt(ExifInterface.TAG_IMAGE_LENGTH, /*defaultValue*/0);
+        Size exifSize = new Size(exifWidth, exifHeight);
+        // Orientation could be missing, which is ok, default to 0.
+        int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
+                /*defaultValue*/-1);
+        // Get requested orientation from result, because they should be same.
+        if (collector.expectKeyValueNotNull(result, CaptureResult.JPEG_ORIENTATION) != null) {
+            int requestedOrientation = result.get(CaptureResult.JPEG_ORIENTATION);
+            final int ORIENTATION_MIN = ExifInterface.ORIENTATION_UNDEFINED;
+            final int ORIENTATION_MAX = ExifInterface.ORIENTATION_ROTATE_270;
+            boolean orientationValid = collector.expectTrue(String.format(
+                    "Exif orientation must be in range of [%d, %d]",
+                    ORIENTATION_MIN, ORIENTATION_MAX),
+                    exifOrientation >= ORIENTATION_MIN && exifOrientation <= ORIENTATION_MAX);
+            if (orientationValid) {
+                /**
+                 * Device captured image doesn't respect the requested orientation,
+                 * which means it rotates the image buffer physically. Then we
+                 * should swap the exif width/height accordingly to compare.
+                 */
+                boolean deviceRotatedImage = exifOrientation == ExifInterface.ORIENTATION_UNDEFINED;
+
+                if (deviceRotatedImage) {
+                    // Case 1.
+                    boolean needSwap = (requestedOrientation % 180 == 90);
+                    if (needSwap) {
+                        exifSize = new Size(exifHeight, exifWidth);
+                    }
+                } else {
+                    // Case 2.
+                    collector.expectEquals("Exif orientaiton should match requested orientation",
+                            requestedOrientation, getExifOrientationInDegree(exifOrientation,
+                            collector));
+                }
+            }
+        }
+
+        /**
+         * Ideally, need check exifSize == jpegSize == actual buffer size. But
+         * jpegSize == jpeg decode bounds size(from jpeg jpeg frame
+         * header, not exif) was validated in ImageReaderTest, no need to
+         * validate again here.
+         */
+        collector.expectEquals("Exif size should match jpeg capture size", jpegSize, exifSize);
+
+        // TAG_DATETIME, it should be local time
+        long currentTimeInMs = System.currentTimeMillis();
+        long currentTimeInSecond = currentTimeInMs / 1000;
+        Date date = new Date(currentTimeInMs);
+        String localDatetime = new SimpleDateFormat("yyyy:MM:dd HH:").format(date);
+        String dateTime = exif.getAttribute(ExifInterface.TAG_DATETIME);
+        if (collector.expectTrue("Exif TAG_DATETIME shouldn't be null", dateTime != null)) {
+            collector.expectTrue("Exif TAG_DATETIME is wrong",
+                    dateTime.length() == EXIF_DATETIME_LENGTH);
+            long exifTimeInSecond =
+                    new SimpleDateFormat("yyyy:MM:dd HH:mm:ss").parse(dateTime).getTime() / 1000;
+            long delta = currentTimeInSecond - exifTimeInSecond;
+            collector.expectTrue("Capture time deviates too much from the current time",
+                    Math.abs(delta) < EXIF_DATETIME_ERROR_MARGIN_SEC);
+            // It should be local time.
+            collector.expectTrue("Exif date time should be local time",
+                    dateTime.startsWith(localDatetime));
+        }
+
+        // TAG_FOCAL_LENGTH.
+        float[] focalLengths = staticInfo.getAvailableFocalLengthsChecked();
+        float exifFocalLength = (float)exif.getAttributeDouble(ExifInterface.TAG_FOCAL_LENGTH, -1);
+        collector.expectEquals("Focal length should match",
+                getClosestValueInArray(focalLengths, exifFocalLength),
+                exifFocalLength, EXIF_FOCAL_LENGTH_ERROR_MARGIN);
+        // More checks for focal length.
+        collector.expectEquals("Exif focal length should match capture result",
+                validateFocalLength(result, staticInfo, collector), exifFocalLength);
+
+        // TAG_EXPOSURE_TIME
+        // ExifInterface API gives exposure time value in the form of float instead of rational
+        String exposureTime = exif.getAttribute(ExifInterface.TAG_EXPOSURE_TIME);
+        collector.expectNotNull("Exif TAG_EXPOSURE_TIME shouldn't be null", exposureTime);
+        if (staticInfo.areKeysAvailable(CaptureResult.SENSOR_EXPOSURE_TIME)) {
+            if (exposureTime != null) {
+                double exposureTimeValue = Double.parseDouble(exposureTime);
+                long expTimeResult = result.get(CaptureResult.SENSOR_EXPOSURE_TIME);
+                double expected = expTimeResult / 1e9;
+                double tolerance = expected * EXIF_EXPOSURE_TIME_ERROR_MARGIN_RATIO;
+                tolerance = Math.max(tolerance, EXIF_EXPOSURE_TIME_MIN_ERROR_MARGIN_SEC);
+                collector.expectEquals("Exif exposure time doesn't match", expected,
+                        exposureTimeValue, tolerance);
+            }
+        }
+
+        // TAG_APERTURE
+        // ExifInterface API gives aperture value in the form of float instead of rational
+        String exifAperture = exif.getAttribute(ExifInterface.TAG_APERTURE);
+        collector.expectNotNull("Exif TAG_APERTURE shouldn't be null", exifAperture);
+        if (staticInfo.areKeysAvailable(CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES)) {
+            float[] apertures = staticInfo.getAvailableAperturesChecked();
+            if (exifAperture != null) {
+                float apertureValue = Float.parseFloat(exifAperture);
+                collector.expectEquals("Aperture value should match",
+                        getClosestValueInArray(apertures, apertureValue),
+                        apertureValue, EXIF_APERTURE_ERROR_MARGIN);
+                // More checks for aperture.
+                collector.expectEquals("Exif aperture length should match capture result",
+                        validateAperture(result, staticInfo, collector), apertureValue);
+            }
+        }
+
+        /**
+         * TAG_FLASH. TODO: For full devices, can check a lot more info
+         * (http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html#Flash)
+         */
+        String flash = exif.getAttribute(ExifInterface.TAG_FLASH);
+        collector.expectNotNull("Exif TAG_FLASH shouldn't be null", flash);
+
+        /**
+         * TAG_WHITE_BALANCE. TODO: For full devices, with the DNG tags, we
+         * should be able to cross-check android.sensor.referenceIlluminant.
+         */
+        String whiteBalance = exif.getAttribute(ExifInterface.TAG_WHITE_BALANCE);
+        collector.expectNotNull("Exif TAG_WHITE_BALANCE shouldn't be null", whiteBalance);
+
+        // TAG_MAKE
+        String make = exif.getAttribute(ExifInterface.TAG_MAKE);
+        collector.expectEquals("Exif TAG_MAKE is incorrect", Build.MANUFACTURER, make);
+
+        // TAG_MODEL
+        String model = exif.getAttribute(ExifInterface.TAG_MODEL);
+        collector.expectEquals("Exif TAG_MODEL is incorrect", Build.MODEL, model);
+
+
+        // TAG_ISO
+        int iso = exif.getAttributeInt(ExifInterface.TAG_ISO, /*defaultValue*/-1);
+        if (staticInfo.areKeysAvailable(CaptureResult.SENSOR_SENSITIVITY)) {
+            int expectedIso = result.get(CaptureResult.SENSOR_SENSITIVITY);
+            collector.expectEquals("Exif TAG_ISO is incorrect", expectedIso, iso);
+        }
+
+        // TAG_DATETIME_DIGITIZED (a.k.a Create time for digital cameras).
+        String digitizedTime = exif.getAttribute(ExifInterface.TAG_DATETIME_DIGITIZED);
+        collector.expectNotNull("Exif TAG_DATETIME_DIGITIZED shouldn't be null", digitizedTime);
+        if (digitizedTime != null) {
+            String expectedDateTime = exif.getAttribute(ExifInterface.TAG_DATETIME);
+            collector.expectNotNull("Exif TAG_DATETIME shouldn't be null", expectedDateTime);
+            if (expectedDateTime != null) {
+                collector.expectEquals("dataTime should match digitizedTime",
+                        expectedDateTime, digitizedTime);
+            }
+        }
+
+        /**
+         * TAG_SUBSEC_TIME. Since the sub second tag strings are truncated to at
+         * most 9 digits in ExifInterface implementation, use getAttributeInt to
+         * sanitize it. When the default value -1 is returned, it means that
+         * this exif tag either doesn't exist or is a non-numerical invalid
+         * string. Same rule applies to the rest of sub second tags.
+         */
+        int subSecTime = exif.getAttributeInt(ExifInterface.TAG_SUBSEC_TIME, /*defaultValue*/-1);
+        collector.expectTrue("Exif TAG_SUBSEC_TIME value is null or invalid!", subSecTime > 0);
+
+        // TAG_SUBSEC_TIME_ORIG
+        int subSecTimeOrig = exif.getAttributeInt(ExifInterface.TAG_SUBSEC_TIME_ORIG,
+                /*defaultValue*/-1);
+        collector.expectTrue("Exif TAG_SUBSEC_TIME_ORIG value is null or invalid!",
+                subSecTimeOrig > 0);
+
+        // TAG_SUBSEC_TIME_DIG
+        int subSecTimeDig = exif.getAttributeInt(ExifInterface.TAG_SUBSEC_TIME_DIG,
+                /*defaultValue*/-1);
+        collector.expectTrue(
+                "Exif TAG_SUBSEC_TIME_DIG value is null or invalid!", subSecTimeDig > 0);
+    }
+
+
+    /**
+     * Immutable class wrapping the exif test data.
+     */
+    public static class ExifTestData {
+        public final Location gpsLocation;
+        public final int jpegOrientation;
+        public final byte jpegQuality;
+        public final byte thumbnailQuality;
+
+        public ExifTestData(Location location, int orientation,
+                byte jpgQuality, byte thumbQuality) {
+            gpsLocation = location;
+            jpegOrientation = orientation;
+            jpegQuality = jpgQuality;
+            thumbnailQuality = thumbQuality;
+        }
+    }
+
     public static Size getPreviewSizeBound(WindowManager windowManager, Size bound) {
         Display display = windowManager.getDefaultDisplay();
 
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
index 92eef80..0e7eb43 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
@@ -189,46 +189,62 @@
                 openDevice(mCameraIds[i]);
 
                 if (!mStaticInfo.isManualLensShadingMapSupported()) {
+                    Log.i(TAG, "Camera " + mCameraIds[i] +
+                            " doesn't support lens shading controls, skipping test");
+                    continue;
+                }
+
+                List<Integer> lensShadingMapModes = Arrays.asList(CameraTestUtils.toObject(
+                        mStaticInfo.getAvailableLensShadingMapModesChecked()));
+
+                if (!lensShadingMapModes.contains(STATISTICS_LENS_SHADING_MAP_MODE_ON)) {
                     continue;
                 }
 
                 SimpleCaptureCallback listener = new SimpleCaptureCallback();
                 CaptureRequest.Builder requestBuilder =
                         mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-
-                // Shading map mode OFF, lensShadingMapMode ON, camera device
-                // should output unity maps.
-                requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_OFF);
                 requestBuilder.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE,
                         STATISTICS_LENS_SHADING_MAP_MODE_ON);
 
                 Size previewSz =
                         getMaxPreviewSize(mCamera.getId(), mCameraManager,
                         getPreviewSizeBound(mWindowManager, PREVIEW_SIZE_BOUND));
+                List<Integer> lensShadingModes = Arrays.asList(CameraTestUtils.toObject(
+                        mStaticInfo.getAvailableLensShadingModesChecked()));
 
-                listener = new SimpleCaptureCallback();
-                startPreview(requestBuilder, previewSz, listener);
-                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
-                verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_OFF);
+                // Shading map mode OFF, lensShadingMapMode ON, camera device
+                // should output unity maps.
+                if (lensShadingModes.contains(SHADING_MODE_OFF)) {
+                    requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_OFF);
+                    listener = new SimpleCaptureCallback();
+                    startPreview(requestBuilder, previewSz, listener);
+                    waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
+                    verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_OFF);
+                }
 
                 // Shading map mode FAST, lensShadingMapMode ON, camera device
                 // should output valid maps.
-                requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_FAST);
+                if (lensShadingModes.contains(SHADING_MODE_FAST)) {
+                    requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_FAST);
 
-                listener = new SimpleCaptureCallback();
-                startPreview(requestBuilder, previewSz, listener);
-                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
-                // Allow at most one lock OFF state as the exposure is changed once.
-                verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_FAST);
+                    listener = new SimpleCaptureCallback();
+                    startPreview(requestBuilder, previewSz, listener);
+                    waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
+                    // Allow at most one lock OFF state as the exposure is changed once.
+                    verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_FAST);
+                }
 
                 // Shading map mode HIGH_QUALITY, lensShadingMapMode ON, camera device
                 // should output valid maps.
-                requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_HIGH_QUALITY);
+                if (lensShadingModes.contains(SHADING_MODE_HIGH_QUALITY)) {
+                    requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_HIGH_QUALITY);
 
-                listener = new SimpleCaptureCallback();
-                startPreview(requestBuilder, previewSz, listener);
-                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
-                verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_HIGH_QUALITY);
+                    listener = new SimpleCaptureCallback();
+                    startPreview(requestBuilder, previewSz, listener);
+                    waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
+                    verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_HIGH_QUALITY);
+                }
 
                 stopPreview();
             } finally {
@@ -252,7 +268,7 @@
                 // Without manual sensor control, exposure time cannot be verified
                 if (!mStaticInfo.isCapabilitySupported(
                         CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
-                    return;
+                    continue;
                 }
 
                 int[] modes = mStaticInfo.getAeAvailableAntiBandingModesChecked();
@@ -284,9 +300,9 @@
         for (int i = 0; i < mCameraIds.length; i++) {
             try {
                 openDevice(mCameraIds[i]);
-
-                if (mStaticInfo.isHardwareLevelLegacy()) {
-                    Log.i(TAG, "Skipping test on legacy devices");
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + mCameraIds[i] +
+                            " does not support color outputs, skipping");
                     continue;
                 }
 
@@ -316,6 +332,11 @@
         for (int i = 0; i < mCameraIds.length; i++) {
             try {
                 openDevice(mCameraIds[i]);
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + mCameraIds[i] +
+                            " does not support color outputs, skipping");
+                    continue;
+                }
 
                 SimpleCaptureCallback listener = new SimpleCaptureCallback();
                 CaptureRequest.Builder requestBuilder =
@@ -353,7 +374,11 @@
         for (int i = 0; i < mCameraIds.length; i++) {
             try {
                 openDevice(mCameraIds[i]);
-
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + mCameraIds[i] +
+                            " does not support color outputs, skipping");
+                    continue;
+                }
                 faceDetectionTestByCamera();
             } finally {
                 closeDevice();
@@ -387,7 +412,7 @@
         for (String id : mCameraIds) {
             try {
                 openDevice(id);
-                if (!mStaticInfo.isManualColorCorrectionSupported()) {
+                if (!mStaticInfo.isColorCorrectionSupported()) {
                     Log.i(TAG, "Camera " + id +
                             " doesn't support color correction controls, skipping test");
                     continue;
@@ -468,12 +493,10 @@
         for (String id : mCameraIds) {
             try {
                 openDevice(id);
-
-                if (mStaticInfo.isHardwareLevelLegacy()) {
-                    Log.i(TAG, "Skipping test on legacy devices");
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
                     continue;
                 }
-
                 awbModeAndLockTestByCamera();
             } finally {
                 closeDevice();
@@ -488,7 +511,10 @@
         for (String id : mCameraIds) {
             try {
                 openDevice(id);
-
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
                 afModeTestByCamera();
             } finally {
                 closeDevice();
@@ -511,7 +537,10 @@
                     Log.i(TAG, "Camera " + id + " doesn't support any stabilization modes");
                     continue;
                 }
-
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
                 stabilizationTestByCamera();
             } finally {
                 closeDevice();
@@ -527,7 +556,10 @@
         for (String id : mCameraIds) {
             try {
                 openDevice(id);
-
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
                 Size maxPreviewSize = mOrderedPreviewSizes.get(0);
                 digitalZoomTestByCamera(maxPreviewSize);
             } finally {
@@ -544,7 +576,10 @@
         for (String id : mCameraIds) {
             try {
                 openDevice(id);
-
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
                 digitalZoomPreviewCombinationTestByCamera();
             } finally {
                 closeDevice();
@@ -559,8 +594,9 @@
         for (String id : mCameraIds) {
             try {
                 openDevice(id);
-
-                sceneModeTestByCamera();
+                if (mStaticInfo.isSceneModeSupported()) {
+                    sceneModeTestByCamera();
+                }
             } finally {
                 closeDevice();
             }
@@ -574,7 +610,10 @@
         for (String id : mCameraIds) {
             try {
                 openDevice(id);
-
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
                 effectModeTestByCamera();
             } finally {
                 closeDevice();
@@ -759,35 +798,55 @@
         result = listener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
         validateColorCorrectionResult(result,
                 previewRequestBuilder.get(CaptureRequest.COLOR_CORRECTION_MODE));
-
+        int colorCorrectionMode = CaptureRequest.COLOR_CORRECTION_MODE_TRANSFORM_MATRIX;
         // TRANSFORM_MATRIX mode
         // Only test unit gain and identity transform
-        RggbChannelVector UNIT_GAIN = new RggbChannelVector(1.0f, 1.0f, 1.0f, 1.0f);
+        List<Integer> availableControlModes = Arrays.asList(
+                CameraTestUtils.toObject(mStaticInfo.getAvailableControlModesChecked()));
+        List<Integer> availableAwbModes = Arrays.asList(
+                CameraTestUtils.toObject(mStaticInfo.getAwbAvailableModesChecked()));
+        boolean isManualCCSupported =
+                availableControlModes.contains(CaptureRequest.CONTROL_MODE_OFF) ||
+                availableAwbModes.contains(CaptureRequest.CONTROL_AWB_MODE_OFF);
+        if (isManualCCSupported) {
+            if (!availableControlModes.contains(CaptureRequest.CONTROL_MODE_OFF)) {
+                // Only manual AWB mode is supported
+                manualRequestBuilder.set(CaptureRequest.CONTROL_MODE,
+                        CaptureRequest.CONTROL_MODE_AUTO);
+                manualRequestBuilder.set(CaptureRequest.CONTROL_AWB_MODE,
+                        CaptureRequest.CONTROL_AWB_MODE_OFF);
+            } else {
+                // All 3A manual controls are supported, it doesn't matter what we set for AWB mode.
+                manualRequestBuilder.set(CaptureRequest.CONTROL_MODE,
+                        CaptureRequest.CONTROL_MODE_OFF);
+            }
 
-        ColorSpaceTransform IDENTITY_TRANSFORM = new ColorSpaceTransform(
-            new Rational[] {
-                ONE_R, ZERO_R, ZERO_R,
-                ZERO_R, ONE_R, ZERO_R,
-                ZERO_R, ZERO_R, ONE_R
-            });
+            RggbChannelVector UNIT_GAIN = new RggbChannelVector(1.0f, 1.0f, 1.0f, 1.0f);
 
-        int colorCorrectionMode = CaptureRequest.COLOR_CORRECTION_MODE_TRANSFORM_MATRIX;
-        manualRequestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_OFF);
-        manualRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_MODE, colorCorrectionMode);
-        manualRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_GAINS, UNIT_GAIN);
-        manualRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_TRANSFORM, IDENTITY_TRANSFORM);
-        request = manualRequestBuilder.build();
-        mSession.capture(request, listener, mHandler);
-        result = listener.getCaptureResultForRequest(request, NUM_RESULTS_WAIT_TIMEOUT);
-        RggbChannelVector gains = result.get(CaptureResult.COLOR_CORRECTION_GAINS);
-        ColorSpaceTransform transform = result.get(CaptureResult.COLOR_CORRECTION_TRANSFORM);
-        validateColorCorrectionResult(result, colorCorrectionMode);
-        mCollector.expectEquals("control mode result/request mismatch",
-                CaptureResult.CONTROL_MODE_OFF, result.get(CaptureResult.CONTROL_MODE));
-        mCollector.expectEquals("Color correction gain result/request mismatch",
-                UNIT_GAIN, gains);
-        mCollector.expectEquals("Color correction gain result/request mismatch",
-                IDENTITY_TRANSFORM, transform);
+            ColorSpaceTransform IDENTITY_TRANSFORM = new ColorSpaceTransform(
+                new Rational[] {
+                    ONE_R, ZERO_R, ZERO_R,
+                    ZERO_R, ONE_R, ZERO_R,
+                    ZERO_R, ZERO_R, ONE_R
+                });
+
+            manualRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_MODE, colorCorrectionMode);
+            manualRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_GAINS, UNIT_GAIN);
+            manualRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_TRANSFORM, IDENTITY_TRANSFORM);
+            request = manualRequestBuilder.build();
+            mSession.capture(request, listener, mHandler);
+            result = listener.getCaptureResultForRequest(request, NUM_RESULTS_WAIT_TIMEOUT);
+            RggbChannelVector gains = result.get(CaptureResult.COLOR_CORRECTION_GAINS);
+            ColorSpaceTransform transform = result.get(CaptureResult.COLOR_CORRECTION_TRANSFORM);
+            validateColorCorrectionResult(result, colorCorrectionMode);
+            mCollector.expectEquals("control mode result/request mismatch",
+                    CaptureResult.CONTROL_MODE_OFF, result.get(CaptureResult.CONTROL_MODE));
+            mCollector.expectEquals("Color correction gain result/request mismatch",
+                    UNIT_GAIN, gains);
+            mCollector.expectEquals("Color correction gain result/request mismatch",
+                    IDENTITY_TRANSFORM, transform);
+
+        }
 
         // FAST mode
         colorCorrectionMode = CaptureRequest.COLOR_CORRECTION_MODE_FAST;
@@ -1059,7 +1118,9 @@
     private void aeAutoModeTestLock(int mode) throws Exception {
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-        requestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false);
+        if (mStaticInfo.isAeLockSupported()) {
+            requestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false);
+        }
         requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, mode);
         configurePreviewOutput(requestBuilder);
 
@@ -1090,9 +1151,12 @@
         SimpleCaptureCallback listener =  new SimpleCaptureCallback();
 
         CaptureResult[] resultsDuringLock = new CaptureResult[numCapturesDuringLock];
+        boolean canSetAeLock = mStaticInfo.isAeLockSupported();
 
         // Reset the AE lock to OFF, since we are reusing this builder many times
-        requestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false);
+        if (canSetAeLock) {
+            requestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false);
+        }
 
         // Just send several captures with auto AE, lock off.
         CaptureRequest request = requestBuilder.build();
@@ -1101,6 +1165,11 @@
         }
         waitForNumResults(listener, NUM_CAPTURES_BEFORE_LOCK);
 
+        if (!canSetAeLock) {
+            // Without AE lock, the remaining tests items won't work
+            return;
+        }
+
         // Then fire several capture to lock the AE.
         requestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true);
 
@@ -1125,7 +1194,7 @@
 
         // Can't read manual sensor/exposure settings without manual sensor
         if (mStaticInfo.isCapabilitySupported(
-                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
+                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS)) {
             int sensitivityLocked =
                     getValueNotNull(resultsDuringLock[0], CaptureResult.SENSOR_SENSITIVITY);
             long expTimeLocked =
@@ -1359,7 +1428,7 @@
                     }
                 }
             }
-            mCollector.expectValuesInRange("Face scores are invalid", faceIds,
+            mCollector.expectValuesInRange("Face scores are invalid", faceScores,
                     Face.SCORE_MIN, Face.SCORE_MAX);
             mCollector.expectValuesUnique("Face ids are invalid", faceIds);
         }
@@ -1373,73 +1442,70 @@
             return;
         }
 
-        SimpleCaptureCallback listener;
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-
-        Size maxPreviewSz = mOrderedPreviewSizes.get(0); // Max preview size.
-
         int[] toneMapModes = mStaticInfo.getAvailableToneMapModesChecked();
         for (int mode : toneMapModes) {
-            requestBuilder.set(CaptureRequest.TONEMAP_MODE, mode);
             if (VERBOSE) {
                 Log.v(TAG, "Testing tonemap mode " + mode);
             }
 
-            if (mode == CaptureRequest.TONEMAP_MODE_CONTRAST_CURVE) {
-                TonemapCurve tcLinear = new TonemapCurve(
-                        TONEMAP_CURVE_LINEAR, TONEMAP_CURVE_LINEAR, TONEMAP_CURVE_LINEAR);
-                requestBuilder.set(CaptureRequest.TONEMAP_CURVE, tcLinear);
-                // Create a new listener for each run to avoid the results from one run spill
-                // into another run.
-                listener = new SimpleCaptureCallback();
-                startPreview(requestBuilder, maxPreviewSz, listener);
-                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
-                verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
-                        TONEMAP_CURVE_LINEAR);
+            requestBuilder.set(CaptureRequest.TONEMAP_MODE, mode);
+            switch (mode) {
+                case CaptureRequest.TONEMAP_MODE_CONTRAST_CURVE:
+                    TonemapCurve toneCurve = new TonemapCurve(TONEMAP_CURVE_LINEAR,
+                            TONEMAP_CURVE_LINEAR, TONEMAP_CURVE_LINEAR);
+                    requestBuilder.set(CaptureRequest.TONEMAP_CURVE, toneCurve);
+                    testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
 
-                TonemapCurve tcSrgb = new TonemapCurve(
-                        TONEMAP_CURVE_SRGB, TONEMAP_CURVE_SRGB, TONEMAP_CURVE_SRGB);
-                requestBuilder.set(CaptureRequest.TONEMAP_CURVE, tcSrgb);
-                // Create a new listener for each run to avoid the results from one run spill
-                // into another run.
-                listener = new SimpleCaptureCallback();
-                startPreview(requestBuilder, maxPreviewSz, listener);
-                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
-                verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
-                        TONEMAP_CURVE_SRGB);
-            } else {
-                // Create a new listener for each run to avoid the results from one run spill
-                // into another run.
-                listener = new SimpleCaptureCallback();
-                startPreview(requestBuilder, maxPreviewSz, listener);
-                waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
-                verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
-                        /*inputToneCurve*/null);
+                    toneCurve = new TonemapCurve(TONEMAP_CURVE_SRGB,
+                            TONEMAP_CURVE_SRGB, TONEMAP_CURVE_SRGB);
+                    requestBuilder.set(CaptureRequest.TONEMAP_CURVE, toneCurve);
+                    testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+                    break;
+                case CaptureRequest.TONEMAP_MODE_GAMMA_VALUE:
+                    requestBuilder.set(CaptureRequest.TONEMAP_GAMMA, 1.0f);
+                    testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+                    requestBuilder.set(CaptureRequest.TONEMAP_GAMMA, 2.2f);
+                    testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+                    requestBuilder.set(CaptureRequest.TONEMAP_GAMMA, 5.0f);
+                    testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+                    break;
+                case CaptureRequest.TONEMAP_MODE_PRESET_CURVE:
+                    requestBuilder.set(CaptureRequest.TONEMAP_PRESET_CURVE,
+                            CaptureRequest.TONEMAP_PRESET_CURVE_REC709);
+                    testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+                    requestBuilder.set(CaptureRequest.TONEMAP_PRESET_CURVE,
+                            CaptureRequest.TONEMAP_PRESET_CURVE_SRGB);
+                    testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+                    break;
+                default:
+                    testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+                    break;
             }
         }
 
-        stopPreview();
+
     }
 
     /**
-     * Verify tonemap results.
-     * <p>
-     * Assumes R,G,B channels use the same tone curve
-     * </p>
+     * Test tonemap mode with speficied request settings
      *
-     * @param listener The capture listener used to get the capture results
      * @param numFramesVerified Number of results to be verified
-     * @param tonemapMode Tonemap mode to verify
-     * @param inputToneCurve Tonemap curve used by all 3 channels, ignored when
-     * map mode is not CONTRAST_CURVE.
+     * @param requestBuilder the request builder of settings to be tested
      */
-    private void verifyToneMapModeResults(SimpleCaptureCallback listener, int numFramesVerified,
-            int tonemapMode, float[] inputToneCurve) {
+    private void testToneMapMode (int numFramesVerified,
+            CaptureRequest.Builder requestBuilder)  throws Exception  {
         final int MIN_TONEMAP_CURVE_POINTS = 2;
         final Float ZERO = new Float(0);
         final Float ONE = new Float(1.0f);
 
+        SimpleCaptureCallback listener = new SimpleCaptureCallback();
+        int tonemapMode = requestBuilder.get(CaptureRequest.TONEMAP_MODE);
+        Size maxPreviewSz = mOrderedPreviewSizes.get(0); // Max preview size.
+        startPreview(requestBuilder, maxPreviewSz, listener);
+        waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
+
         int maxCurvePoints = mStaticInfo.getMaxTonemapCurvePointChecked();
         for (int i = 0; i < numFramesVerified; i++) {
             CaptureResult result = listener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
@@ -1461,6 +1527,14 @@
                  * between request and result, as they may have different array
                  * size.
                  */
+            } else if (tonemapMode == CaptureResult.TONEMAP_MODE_GAMMA_VALUE) {
+                mCollector.expectEquals("Capture result gamma value should match request",
+                        requestBuilder.get(CaptureRequest.TONEMAP_GAMMA),
+                        result.get(CaptureResult.TONEMAP_GAMMA));
+            } else if (tonemapMode == CaptureResult.TONEMAP_MODE_PRESET_CURVE) {
+                mCollector.expectEquals("Capture result preset curve should match request",
+                        requestBuilder.get(CaptureRequest.TONEMAP_PRESET_CURVE),
+                        result.get(CaptureResult.TONEMAP_PRESET_CURVE));
             }
 
             // Tonemap curve result availability and basic sanity check for all modes.
@@ -1477,6 +1551,7 @@
             mCollector.expectInRange("Tonemap curve blue length is out of range",
                     mapBlue.length, MIN_TONEMAP_CURVE_POINTS, maxCurvePoints * 2);
         }
+        stopPreview();
     }
 
     /**
@@ -1490,6 +1565,7 @@
     private void awbModeAndLockTestByCamera() throws Exception {
         int[] awbModes = mStaticInfo.getAwbAvailableModesChecked();
         Size maxPreviewSize = mOrderedPreviewSizes.get(0);
+        boolean canSetAwbLock = mStaticInfo.isAwbLockSupported();
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
         startPreview(requestBuilder, maxPreviewSize, /*listener*/null);
@@ -1505,7 +1581,7 @@
             verifyCaptureResultForKey(CaptureResult.CONTROL_AWB_MODE, mode, listener,
                     NUM_FRAMES_VERIFIED);
 
-            if (mode == CameraMetadata.CONTROL_AWB_MODE_AUTO) {
+            if (mode == CameraMetadata.CONTROL_AWB_MODE_AUTO && canSetAwbLock) {
                 // Verify color correction transform and gains stay unchanged after a lock.
                 requestBuilder.set(CaptureRequest.CONTROL_AWB_LOCK, true);
                 listener = new SimpleCaptureCallback();
@@ -1518,7 +1594,10 @@
                 }
 
             }
-            verifyAwbCaptureResultUnchanged(listener, NUM_FRAMES_VERIFIED);
+            // Don't verify auto mode result if AWB lock is not supported
+            if (mode != CameraMetadata.CONTROL_AWB_MODE_AUTO || canSetAwbLock) {
+                verifyAwbCaptureResultUnchanged(listener, NUM_FRAMES_VERIFIED);
+            }
         }
     }
 
@@ -1914,12 +1993,12 @@
     private long[] getExposureTimeTestValues() {
         long[] testValues = new long[DEFAULT_NUM_EXPOSURE_TIME_STEPS + 1];
         long maxExpTime = mStaticInfo.getExposureMaximumOrDefault(DEFAULT_EXP_TIME_NS);
-        long minxExpTime = mStaticInfo.getExposureMinimumOrDefault(DEFAULT_EXP_TIME_NS);
+        long minExpTime = mStaticInfo.getExposureMinimumOrDefault(DEFAULT_EXP_TIME_NS);
 
-        long range = maxExpTime - minxExpTime;
+        long range = maxExpTime - minExpTime;
         double stepSize = range / (double)DEFAULT_NUM_EXPOSURE_TIME_STEPS;
         for (int i = 0; i < testValues.length; i++) {
-            testValues[i] = minxExpTime + (long)(stepSize * i);
+            testValues[i] = maxExpTime - (long)(stepSize * i);
             testValues[i] = mStaticInfo.getExposureClampToRange(testValues[i]);
         }
 
@@ -1968,7 +2047,7 @@
         }
         int[] testValues = new int[numSteps + 1];
         for (int i = 0; i < testValues.length; i++) {
-            testValues[i] = minSensitivity + stepSize * i;
+            testValues[i] = maxSensitivity - stepSize * i;
             testValues[i] = mStaticInfo.getSensitivityClampToRange(testValues[i]);
         }
 
@@ -2026,12 +2105,6 @@
         validatePipelineDepth(result);
     }
 
-    private <T> T getValueNotNull(CaptureResult result, CaptureResult.Key<T> key) {
-        T value = result.get(key);
-        assertNotNull("Value of Key " + key.getName() + " shouldn't be null", value);
-        return value;
-    }
-
     /**
      * Basic verification for the control mode capture result.
      *
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
index 61bf36c..dc499ba 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
@@ -97,10 +97,16 @@
         for (String id : mCameraIds) {
             try {
                 openDevice(id);
-                // Create image reader and surface.
-                Size size = mOrderedPreviewSizes.get(0);
-                createDefaultImageReader(size, ImageFormat.YUV_420_888, MAX_NUM_IMAGES,
-                        new ImageDropperListener());
+                if (mStaticInfo.isColorOutputSupported()) {
+                    // Create image reader and surface.
+                    Size size = mOrderedPreviewSizes.get(0);
+                    createDefaultImageReader(size, ImageFormat.YUV_420_888, MAX_NUM_IMAGES,
+                            new ImageDropperListener());
+                } else {
+                    Size size = getMaxDepthSize(id, mCameraManager);
+                    createDefaultImageReader(size, ImageFormat.DEPTH16, MAX_NUM_IMAGES,
+                            new ImageDropperListener());
+                }
 
                 // Configure output streams.
                 List<Surface> outputSurfaces = new ArrayList<Surface>(1);
@@ -158,9 +164,15 @@
                 }
 
                 // Create image reader and surface.
-                Size size = mOrderedPreviewSizes.get(0);
-                createDefaultImageReader(size, ImageFormat.YUV_420_888, MAX_NUM_IMAGES,
-                        new ImageDropperListener());
+                if (mStaticInfo.isColorOutputSupported()) {
+                    Size size = mOrderedPreviewSizes.get(0);
+                    createDefaultImageReader(size, ImageFormat.YUV_420_888, MAX_NUM_IMAGES,
+                            new ImageDropperListener());
+                } else {
+                    Size size = getMaxDepthSize(id, mCameraManager);
+                    createDefaultImageReader(size, ImageFormat.DEPTH16, MAX_NUM_IMAGES,
+                            new ImageDropperListener());
+                }
 
                 // Configure output streams.
                 List<Surface> outputSurfaces = new ArrayList<Surface>(1);
@@ -263,6 +275,10 @@
             SimpleImageReaderListener prevListener = new SimpleImageReaderListener();
             try {
                 openDevice(id);
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
 
                 CaptureRequest.Builder previewBuilder =
                         mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
@@ -440,17 +456,21 @@
 
         // Keys only present when corresponding control is on are being
         // verified in its own functional test
-        // Only present when tone mapping mode is CONTRAST_CURVE
+        // Only present in certain tonemap mode. Test in CaptureRequestTest.
         waiverKeys.add(CaptureResult.TONEMAP_CURVE);
+        waiverKeys.add(CaptureResult.TONEMAP_GAMMA);
+        waiverKeys.add(CaptureResult.TONEMAP_PRESET_CURVE);
         // Only present when test pattern mode is SOLID_COLOR.
         // TODO: verify this key in test pattern test later
         waiverKeys.add(CaptureResult.SENSOR_TEST_PATTERN_DATA);
         // Only present when STATISTICS_LENS_SHADING_MAP_MODE is ON
         waiverKeys.add(CaptureResult.STATISTICS_LENS_SHADING_CORRECTION_MAP);
-        //  Only present when STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES is ON
+        // Only present when STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES is ON
         waiverKeys.add(CaptureResult.STATISTICS_HOT_PIXEL_MAP);
-        //  Only present when face detection is on
+        // Only present when face detection is on
         waiverKeys.add(CaptureResult.STATISTICS_FACES);
+        // Only present in reprocessing capture result.
+        waiverKeys.add(CaptureResult.REPROCESS_EFFECTIVE_EXPOSURE_FACTOR);
 
         //Keys not required if RAW is not supported
         if (!mStaticInfo.isCapabilitySupported(
@@ -460,6 +480,15 @@
             waiverKeys.add(CaptureResult.SENSOR_NOISE_PROFILE);
         }
 
+        //Keys for depth output capability
+        if (!mStaticInfo.isCapabilitySupported(
+                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT)) {
+            waiverKeys.add(CaptureResult.LENS_POSE_ROTATION);
+            waiverKeys.add(CaptureResult.LENS_POSE_TRANSLATION);
+            waiverKeys.add(CaptureResult.LENS_INTRINSIC_CALIBRATION);
+            waiverKeys.add(CaptureResult.LENS_RADIAL_DISTORTION);
+        }
+
         if (mStaticInfo.getAeMaxRegionsChecked() == 0) {
             waiverKeys.add(CaptureResult.CONTROL_AE_REGIONS);
         }
@@ -478,7 +507,7 @@
          * Hardware Level = LIMITED or LEGACY
          */
         // Key not present if certain control is not supported
-        if (!mStaticInfo.isManualColorCorrectionSupported()) {
+        if (!mStaticInfo.isColorCorrectionSupported()) {
             waiverKeys.add(CaptureResult.COLOR_CORRECTION_GAINS);
             waiverKeys.add(CaptureResult.COLOR_CORRECTION_MODE);
             waiverKeys.add(CaptureResult.COLOR_CORRECTION_TRANSFORM);
@@ -508,26 +537,32 @@
             waiverKeys.add(CaptureResult.SHADING_MODE);
         }
 
-        //Keys not required if manual sensor control is not supported
+        //Keys not required if neither MANUAL_SENSOR nor READ_SENSOR_SETTINGS is supported
+        if (!mStaticInfo.isCapabilitySupported(
+                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR) &&
+            !mStaticInfo.isCapabilitySupported(
+                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS)) {
+            waiverKeys.add(CaptureResult.SENSOR_EXPOSURE_TIME);
+            waiverKeys.add(CaptureResult.SENSOR_SENSITIVITY);
+            waiverKeys.add(CaptureResult.LENS_FOCUS_DISTANCE);
+            waiverKeys.add(CaptureResult.LENS_APERTURE);
+        }
+
         if (!mStaticInfo.isCapabilitySupported(
                 CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
-            waiverKeys.add(CaptureResult.SENSOR_EXPOSURE_TIME);
             waiverKeys.add(CaptureResult.SENSOR_FRAME_DURATION);
-            waiverKeys.add(CaptureResult.SENSOR_SENSITIVITY);
             waiverKeys.add(CaptureResult.BLACK_LEVEL_LOCK);
             waiverKeys.add(CaptureResult.LENS_FOCUS_RANGE);
-            waiverKeys.add(CaptureResult.LENS_FOCUS_DISTANCE);
             waiverKeys.add(CaptureResult.LENS_STATE);
-            waiverKeys.add(CaptureResult.LENS_APERTURE);
             waiverKeys.add(CaptureResult.LENS_FILTER_DENSITY);
         }
 
-        if (mStaticInfo.isHardwareLevelLimited()) {
+        if (mStaticInfo.isHardwareLevelLimited() && mStaticInfo.isColorOutputSupported()) {
             return waiverKeys;
         }
 
         /*
-         * Hardware Level = LEGACY
+         * Hardware Level = LEGACY or no regular output is supported
          */
         waiverKeys.add(CaptureResult.CONTROL_AE_PRECAPTURE_TRIGGER);
         waiverKeys.add(CaptureResult.CONTROL_AE_STATE);
@@ -541,6 +576,30 @@
         waiverKeys.add(CaptureResult.CONTROL_AE_TARGET_FPS_RANGE);
         waiverKeys.add(CaptureResult.CONTROL_AF_TRIGGER);
 
+        if (mStaticInfo.isHardwareLevelLegacy()) {
+            return waiverKeys;
+        }
+
+        /*
+         * Regular output not supported, only depth, waive color-output-related keys
+         */
+        waiverKeys.add(CaptureResult.CONTROL_SCENE_MODE);
+        waiverKeys.add(CaptureResult.CONTROL_EFFECT_MODE);
+        waiverKeys.add(CaptureResult.CONTROL_VIDEO_STABILIZATION_MODE);
+        waiverKeys.add(CaptureResult.SENSOR_TEST_PATTERN_MODE);
+        waiverKeys.add(CaptureResult.NOISE_REDUCTION_MODE);
+        waiverKeys.add(CaptureResult.COLOR_CORRECTION_ABERRATION_MODE);
+        waiverKeys.add(CaptureResult.CONTROL_AE_ANTIBANDING_MODE);
+        waiverKeys.add(CaptureResult.CONTROL_AE_EXPOSURE_COMPENSATION);
+        waiverKeys.add(CaptureResult.CONTROL_AE_LOCK);
+        waiverKeys.add(CaptureResult.CONTROL_AE_MODE);
+        waiverKeys.add(CaptureResult.CONTROL_AF_MODE);
+        waiverKeys.add(CaptureResult.CONTROL_AWB_MODE);
+        waiverKeys.add(CaptureResult.CONTROL_AWB_LOCK);
+        waiverKeys.add(CaptureResult.STATISTICS_FACE_DETECT_MODE);
+        waiverKeys.add(CaptureResult.FLASH_MODE);
+        waiverKeys.add(CaptureResult.SCALER_CROP_REGION);
+
         return waiverKeys;
     }
 
@@ -687,8 +746,12 @@
         resultKeys.add(CaptureResult.LENS_FOCAL_LENGTH);
         resultKeys.add(CaptureResult.LENS_FOCUS_DISTANCE);
         resultKeys.add(CaptureResult.LENS_OPTICAL_STABILIZATION_MODE);
+        resultKeys.add(CaptureResult.LENS_POSE_ROTATION);
+        resultKeys.add(CaptureResult.LENS_POSE_TRANSLATION);
         resultKeys.add(CaptureResult.LENS_FOCUS_RANGE);
         resultKeys.add(CaptureResult.LENS_STATE);
+        resultKeys.add(CaptureResult.LENS_INTRINSIC_CALIBRATION);
+        resultKeys.add(CaptureResult.LENS_RADIAL_DISTORTION);
         resultKeys.add(CaptureResult.NOISE_REDUCTION_MODE);
         resultKeys.add(CaptureResult.REQUEST_PIPELINE_DEPTH);
         resultKeys.add(CaptureResult.SCALER_CROP_REGION);
@@ -712,7 +775,10 @@
         resultKeys.add(CaptureResult.STATISTICS_LENS_SHADING_MAP_MODE);
         resultKeys.add(CaptureResult.TONEMAP_CURVE);
         resultKeys.add(CaptureResult.TONEMAP_MODE);
+        resultKeys.add(CaptureResult.TONEMAP_GAMMA);
+        resultKeys.add(CaptureResult.TONEMAP_PRESET_CURVE);
         resultKeys.add(CaptureResult.BLACK_LEVEL_LOCK);
+        resultKeys.add(CaptureResult.REPROCESS_EFFECTIVE_EXPOSURE_FACTOR);
 
         return resultKeys;
     }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java
index 67fad4e..0da0ce7 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
+import android.graphics.BitmapRegionDecoder;
 import android.graphics.ImageFormat;
 import android.graphics.Rect;
 import android.graphics.RectF;
@@ -46,6 +47,7 @@
 
 import java.io.ByteArrayOutputStream;
 import java.io.FileOutputStream;
+import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -113,19 +115,7 @@
                     continue;
                 }
 
-                Size[] targetCaptureSizes =
-                        mStaticInfo.getAvailableSizesForFormatChecked(ImageFormat.RAW_SENSOR,
-                                StaticMetadata.StreamDirection.Output);
-
-                assertTrue("No capture sizes available for RAW format!",
-                        targetCaptureSizes.length != 0);
-                Rect activeArray = mStaticInfo.getActiveArraySizeChecked();
-                Size activeArraySize = new Size(activeArray.width(), activeArray.height());
-                assertTrue("Missing ActiveArraySize", activeArray.width() > 0 &&
-                        activeArray.height() > 0);
-                // TODO: Allow PixelArraySize also.
-                assertArrayContains("Available sizes for RAW format must include ActiveArraySize",
-                        targetCaptureSizes, activeArraySize);
+                Size activeArraySize = mStaticInfo.getRawDimensChecked();
 
                 // Create capture image reader
                 CameraTestUtils.SimpleImageReaderListener captureListener
@@ -200,19 +190,7 @@
                     continue;
                 }
 
-                Size[] targetCaptureSizes =
-                        mStaticInfo.getAvailableSizesForFormatChecked(ImageFormat.RAW_SENSOR,
-                                StaticMetadata.StreamDirection.Output);
-
-                assertTrue("No capture sizes available for RAW format!",
-                        targetCaptureSizes.length != 0);
-                Rect activeArray = mStaticInfo.getActiveArraySizeChecked();
-                Size activeArraySize = new Size(activeArray.width(), activeArray.height());
-                assertTrue("Missing ActiveArraySize", activeArray.width() > 0 &&
-                        activeArray.height() > 0);
-                // TODO: Allow PixelArraySize also.
-                assertArrayContains("Available sizes for RAW format must include ActiveArraySize",
-                        targetCaptureSizes, activeArraySize);
+                Size activeArraySize = mStaticInfo.getRawDimensChecked();
 
                 Size[] targetPreviewSizes =
                         mStaticInfo.getAvailableSizesForFormatChecked(ImageFormat.YUV_420_888,
@@ -320,19 +298,7 @@
                     continue;
                 }
 
-                Size[] targetCaptureSizes =
-                        mStaticInfo.getAvailableSizesForFormatChecked(ImageFormat.RAW_SENSOR,
-                                StaticMetadata.StreamDirection.Output);
-
-                assertTrue("No capture sizes available for RAW format!",
-                        targetCaptureSizes.length != 0);
-                Rect activeArray = mStaticInfo.getActiveArraySizeChecked();
-                Size activeArraySize = new Size(activeArray.width(), activeArray.height());
-                assertTrue("Active array has invalid size!", activeArray.width() > 0 &&
-                        activeArray.height() > 0);
-                // TODO: Allow PixelArraySize also.
-                assertArrayContains("Available sizes for RAW format must include ActiveArraySize",
-                        targetCaptureSizes, activeArraySize);
+                Size activeArraySize = mStaticInfo.getRawDimensChecked();
 
                 // Get largest jpeg size
                 Size[] targetJpegSizes =
@@ -365,38 +331,35 @@
 
                 Bitmap rawBitmap = Bitmap.createBitmap(raw.getWidth(), raw.getHeight(),
                         Bitmap.Config.ARGB_8888);
+
+                Size rawBitmapSize = new Size(rawBitmap.getWidth(), rawBitmap.getHeight());
+                assertTrue("Raw bitmap size must be equal to either pre-correction active array" +
+                        " size or pixel array size.", rawBitmapSize.equals(activeArraySize));
+
                 byte[] rawPlane = new byte[raw.getPlanes()[0].getRowStride() * raw.getHeight()];
 
                 // Render RAW image to a bitmap
                 raw.getPlanes()[0].getBuffer().get(rawPlane);
                 raw.getPlanes()[0].getBuffer().rewind();
+
                 RawConverter.convertToSRGB(RenderScriptSingleton.getRS(), raw.getWidth(),
                         raw.getHeight(), raw.getPlanes()[0].getRowStride(), rawPlane,
                         characteristics, resultPair.second, /*offsetX*/0, /*offsetY*/0,
                         /*out*/rawBitmap);
 
-                // Decompress JPEG image to a bitmap
-                byte[] compressedJpegData = CameraTestUtils.getDataFromImage(jpeg);
-
-                BitmapFactory.Options opt = new BitmapFactory.Options();
-                opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
-                Bitmap fullSizeJpegBmap = BitmapFactory.decodeByteArray(compressedJpegData,
-                        /*offset*/0, compressedJpegData.length, /*inout*/opt);
-                Rect jpegDimens = new Rect(0, 0, fullSizeJpegBmap.getWidth(),
-                        fullSizeJpegBmap.getHeight());
+                rawPlane = null;
+                System.gc(); // Hint to VM
 
                 if (VERBOSE) {
                     // Generate DNG file
                     DngCreator dngCreator = new DngCreator(characteristics, resultPair.second);
-                    outputStream = new ByteArrayOutputStream();
-                    dngCreator.writeImage(outputStream, raw);
 
                     // Write DNG to file
                     String dngFilePath = DEBUG_FILE_NAME_BASE + "/camera_" + deviceId + "_" +
                             DEBUG_DNG_FILE;
                     // Write out captured DNG file for the first camera device if setprop is enabled
                     fileStream = new FileOutputStream(dngFilePath);
-                    fileStream.write(outputStream.toByteArray());
+                    dngCreator.writeImage(fileStream, raw);
                     fileStream.flush();
                     fileStream.close();
                     Log.v(TAG, "Test DNG file for camera " + deviceId + " saved to " + dngFilePath);
@@ -405,8 +368,10 @@
                     String jpegFilePath = DEBUG_FILE_NAME_BASE + "/camera_" + deviceId + "_jpeg.jpg";
                     // Write out captured DNG file for the first camera device if setprop is enabled
                     fileChannel = new FileOutputStream(jpegFilePath).getChannel();
-                    fileChannel.write(jpeg.getPlanes()[0].getBuffer());
+                    ByteBuffer jPlane = jpeg.getPlanes()[0].getBuffer();
+                    fileChannel.write(jPlane);
                     fileChannel.close();
+                    jPlane.rewind();
                     Log.v(TAG, "Test JPEG file for camera " + deviceId + " saved to " +
                             jpegFilePath);
 
@@ -421,11 +386,21 @@
                             rawFilePath);
                 }
 
-                Size rawBitmapSize = new Size(rawBitmap.getWidth(), rawBitmap.getHeight());
-                assertTrue("Raw bitmap size must be equal to active array size.",
-                        rawBitmapSize.equals(activeArraySize));
+                raw.close();
 
-                // Get square center patch from JPEG and RAW bitmaps
+                // Decompress JPEG image to a bitmap
+                byte[] compressedJpegData = CameraTestUtils.getDataFromImage(jpeg);
+
+                jpeg.close();
+
+                // Get JPEG dimensions without decoding
+                BitmapFactory.Options opt0 = new BitmapFactory.Options();
+                opt0.inJustDecodeBounds = true;
+                BitmapFactory.decodeByteArray(compressedJpegData, /*offset*/0,
+                        compressedJpegData.length, /*inout*/opt0);
+                Rect jpegDimens = new Rect(0, 0, opt0.outWidth, opt0.outHeight);
+
+                // Find square center patch from JPEG and RAW bitmaps
                 RectF jpegRect = new RectF(jpegDimens);
                 RectF rawRect = new RectF(0, 0, rawBitmap.getWidth(), rawBitmap.getHeight());
                 int sideDimen = Math.min(Math.min(Math.min(Math.min(DEFAULT_PATCH_DIMEN,
@@ -435,6 +410,7 @@
                 RectF jpegIntermediate = new RectF(0, 0, sideDimen, sideDimen);
                 jpegIntermediate.offset(jpegRect.centerX() - jpegIntermediate.centerX(),
                         jpegRect.centerY() - jpegIntermediate.centerY());
+
                 RectF rawIntermediate = new RectF(0, 0, sideDimen, sideDimen);
                 rawIntermediate.offset(rawRect.centerX() - rawIntermediate.centerX(),
                         rawRect.centerY() - rawIntermediate.centerY());
@@ -443,10 +419,18 @@
                 Rect rawFinal = new Rect();
                 rawIntermediate.roundOut(rawFinal);
 
-                Bitmap jpegPatch = Bitmap.createBitmap(fullSizeJpegBmap, jpegFinal.left,
-                        jpegFinal.top, jpegFinal.width(), jpegFinal.height());
+                // Get RAW center patch, and free up rest of RAW image
                 Bitmap rawPatch = Bitmap.createBitmap(rawBitmap, rawFinal.left, rawFinal.top,
                         rawFinal.width(), rawFinal.height());
+                rawBitmap.recycle();
+                rawBitmap = null;
+                System.gc(); // Hint to VM
+
+                BitmapFactory.Options opt = new BitmapFactory.Options();
+                opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
+                Bitmap jpegPatch = BitmapRegionDecoder.newInstance(compressedJpegData,
+                        /*offset*/0, compressedJpegData.length, /*isShareable*/true).
+                        decodeRegion(jpegFinal, opt);
 
                 // Compare center patch from JPEG and rendered RAW bitmap
                 double difference = BitmapUtils.calcDifferenceMetric(jpegPatch, rawPatch);
@@ -645,18 +629,4 @@
 
         return ret;
     }
-
-    private CaptureRequest.Builder prepareCaptureRequestForSurfaces(List<Surface> surfaces)
-            throws Exception {
-        createSession(surfaces);
-
-        CaptureRequest.Builder captureBuilder =
-                mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
-        assertNotNull("Fail to get captureRequest", captureBuilder);
-        for (Surface surface : surfaces) {
-            captureBuilder.addTarget(surface);
-        }
-
-        return captureBuilder;
-    }
 }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
index 8619f73..6d62067 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
@@ -23,10 +23,12 @@
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CameraCharacteristics.Key;
 import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.CaptureRequest;
 import android.hardware.camera2.cts.helpers.CameraErrorCollector;
 import android.hardware.camera2.params.BlackLevelPattern;
 import android.hardware.camera2.params.ColorSpaceTransform;
 import android.hardware.camera2.params.StreamConfigurationMap;
+import android.media.CamcorderProfile;
 import android.media.ImageReader;
 import android.test.AndroidTestCase;
 import android.util.Log;
@@ -62,7 +64,11 @@
     private String[] mIds;
     private CameraErrorCollector mCollector;
 
+    private static final Size FULLHD = new Size(1920, 1080);
+    private static final Size FULLHD_ALT = new Size(1920, 1088);
+    private static final Size HD = new Size(1280, 720);
     private static final Size VGA = new Size(640, 480);
+    private static final Size QVGA = new Size(320, 240);
 
     /*
      * HW Levels short hand
@@ -84,6 +90,14 @@
             CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING;
     private static final int RAW =
             CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW;
+    private static final int YUV_REPROCESS =
+            CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING;
+    private static final int OPAQUE_REPROCESS =
+            CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING;
+    private static final int CONSTRAINED_HIGH_SPEED =
+            CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO;
+    private static final int HIGH_SPEED_FPS_LOWER_MIN = 30;
+    private static final int HIGH_SPEED_FPS_UPPER_MIN = 120;
 
     @Override
     public void setContext(Context context) {
@@ -132,21 +146,119 @@
                     mIds[counter]), config);
             int[] outputFormats = config.getOutputFormats();
 
+            int[] actualCapabilities = c.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
+            assertNotNull("android.request.availableCapabilities must never be null",
+                    actualCapabilities);
+
             // Check required formats exist (JPEG, and YUV_420_888).
+            if (!arrayContains(actualCapabilities, BC)) {
+                Log.i(TAG, "Camera " + mIds[counter] +
+                    ": BACKWARD_COMPATIBLE capability not supported, skipping test");
+                continue;
+            }
+
             assertArrayContains(
                     String.format("No valid YUV_420_888 preview formats found for: ID %s",
                             mIds[counter]), outputFormats, ImageFormat.YUV_420_888);
             assertArrayContains(String.format("No JPEG image format for: ID %s",
                     mIds[counter]), outputFormats, ImageFormat.JPEG);
 
-            Size[] sizes = config.getOutputSizes(ImageFormat.YUV_420_888);
-            CameraTestUtils.assertArrayNotEmpty(sizes,
+            Size[] yuvSizes = config.getOutputSizes(ImageFormat.YUV_420_888);
+            Size[] jpegSizes = config.getOutputSizes(ImageFormat.JPEG);
+            Size[] privateSizes = config.getOutputSizes(ImageFormat.PRIVATE);
+
+            CameraTestUtils.assertArrayNotEmpty(yuvSizes,
                     String.format("No sizes for preview format %x for: ID %s",
                             ImageFormat.YUV_420_888, mIds[counter]));
 
-            assertArrayContains(String.format(
-                            "Required VGA size not found for format %x for: ID %s",
-                            ImageFormat.YUV_420_888, mIds[counter]), sizes, VGA);
+            Rect activeRect = CameraTestUtils.getValueNotNull(
+                    c, CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
+            Size activeArraySize = new Size(activeRect.width(), activeRect.height());
+            Integer hwLevel = c.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
+
+            if (activeArraySize.getWidth() >= FULLHD.getWidth() &&
+                    activeArraySize.getHeight() >= FULLHD.getHeight()) {
+                assertArrayContains(String.format(
+                        "Required FULLHD size not found for format %x for: ID %s",
+                        ImageFormat.JPEG, mIds[counter]), jpegSizes, FULLHD);
+            }
+
+            if (activeArraySize.getWidth() >= HD.getWidth() &&
+                    activeArraySize.getHeight() >= HD.getHeight()) {
+                assertArrayContains(String.format(
+                        "Required HD size not found for format %x for: ID %s",
+                        ImageFormat.JPEG, mIds[counter]), jpegSizes, HD);
+            }
+
+            if (activeArraySize.getWidth() >= VGA.getWidth() &&
+                    activeArraySize.getHeight() >= VGA.getHeight()) {
+                assertArrayContains(String.format(
+                        "Required VGA size not found for format %x for: ID %s",
+                        ImageFormat.JPEG, mIds[counter]), jpegSizes, VGA);
+            }
+
+            if (activeArraySize.getWidth() >= QVGA.getWidth() &&
+                    activeArraySize.getHeight() >= QVGA.getHeight()) {
+                assertArrayContains(String.format(
+                        "Required QVGA size not found for format %x for: ID %s",
+                        ImageFormat.JPEG, mIds[counter]), jpegSizes, QVGA);
+            }
+
+            ArrayList<Size> jpegSizesList = new ArrayList<>(Arrays.asList(jpegSizes));
+            ArrayList<Size> yuvSizesList = new ArrayList<>(Arrays.asList(yuvSizes));
+            ArrayList<Size> privateSizesList = new ArrayList<>(Arrays.asList(privateSizes));
+
+            CamcorderProfile maxVideoProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
+            Size maxVideoSize = new Size(
+                    maxVideoProfile.videoFrameWidth, maxVideoProfile.videoFrameHeight);
+
+            // Handle FullHD special case first
+            if (jpegSizesList.contains(FULLHD)) {
+                if (hwLevel == FULL || (hwLevel == LIMITED &&
+                        maxVideoSize.getWidth() >= FULLHD.getWidth() &&
+                        maxVideoSize.getHeight() >= FULLHD.getHeight())) {
+                    boolean yuvSupportFullHD = yuvSizesList.contains(FULLHD) ||
+                            yuvSizesList.contains(FULLHD_ALT);
+                    boolean privateSupportFullHD = privateSizesList.contains(FULLHD) ||
+                            privateSizesList.contains(FULLHD_ALT);
+                    assertTrue("Full device FullHD YUV size not found", yuvSupportFullHD);
+                    assertTrue("Full device FullHD PRIVATE size not found", privateSupportFullHD);
+                }
+                // remove all FullHD or FullHD_Alt sizes for the remaining of the test
+                jpegSizesList.remove(FULLHD);
+                jpegSizesList.remove(FULLHD_ALT);
+            }
+
+            // Check all sizes other than FullHD
+            if (hwLevel == LIMITED) {
+                // Remove all jpeg sizes larger than max video size
+                ArrayList<Size> toBeRemoved = new ArrayList<>();
+                for (Size size : jpegSizesList) {
+                    if (size.getWidth() >= maxVideoSize.getWidth() &&
+                            size.getHeight() >= maxVideoSize.getHeight()) {
+                        toBeRemoved.add(size);
+                    }
+                }
+                jpegSizesList.removeAll(toBeRemoved);
+            }
+
+            if (hwLevel == FULL || hwLevel == LIMITED) {
+                if (!yuvSizesList.containsAll(jpegSizesList)) {
+                    for (Size s : jpegSizesList) {
+                        if (!yuvSizesList.contains(s)) {
+                            fail("Size " + s + " not found in YUV format");
+                        }
+                    }
+                }
+            }
+
+            if (!privateSizesList.containsAll(yuvSizesList)) {
+                for (Size s : yuvSizesList) {
+                    if (!privateSizesList.contains(s)) {
+                        fail("Size " + s + " not found in PRIVATE format");
+                    }
+                }
+            }
 
             counter++;
         }
@@ -189,72 +301,76 @@
              * for a fact most keys are going to be illegal there so they should never be
              * available.
              *
-             * (TODO: Codegen this)
+             * For LIMITED-level keys, if the level is >= LIMITED, then the capabilities are used to
+             * do the actual checking.
              */
             {
                 //                                           (Key Name)                                     (HW Level)  (Capabilities <Var-Arg>)
-                expectKeyAvailable(c, CameraCharacteristics.COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES     , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_AVAILABLE_ANTIBANDING_MODES          , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES                      , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES          , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE                   , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP                    , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES                      , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS                       , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AVAILABLE_SCENE_MODES                   , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES     , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES                     , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.CONTROL_MAX_REGIONS_AE                          , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.CONTROL_MAX_REGIONS_AF                          , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.CONTROL_MAX_REGIONS_AWB                         , LEGACY   ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES     , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AVAILABLE_MODES                         , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_AVAILABLE_ANTIBANDING_MODES          , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES                      , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES          , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE                   , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP                    , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_LOCK_AVAILABLE                       , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES                      , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS                       , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AVAILABLE_SCENE_MODES                   , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES     , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES                     , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.CONTROL_AWB_LOCK_AVAILABLE                      , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.CONTROL_MAX_REGIONS_AE                          , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.CONTROL_MAX_REGIONS_AF                          , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.CONTROL_MAX_REGIONS_AWB                         , OPT      ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.EDGE_AVAILABLE_EDGE_MODES                       , FULL     ,   NONE                 );
-                expectKeyAvailable(c, CameraCharacteristics.FLASH_INFO_AVAILABLE                            , LEGACY   ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.FLASH_INFO_AVAILABLE                            , OPT      ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES             , OPT      ,   RAW                  );
-                expectKeyAvailable(c, CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL                   , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES                  , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.LENS_FACING                                     , LEGACY   ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL                   , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES                  , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.LENS_FACING                                     , OPT      ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES                   , FULL     ,   MANUAL_SENSOR        );
                 expectKeyAvailable(c, CameraCharacteristics.LENS_INFO_AVAILABLE_FILTER_DENSITIES            , FULL     ,   MANUAL_SENSOR        );
-                expectKeyAvailable(c, CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS               , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION       , LIMITED  ,   MANUAL_SENSOR        );
+                expectKeyAvailable(c, CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS               , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION       , LIMITED  ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.LENS_INFO_FOCUS_DISTANCE_CALIBRATION            , LIMITED  ,   MANUAL_SENSOR        );
-                expectKeyAvailable(c, CameraCharacteristics.LENS_INFO_HYPERFOCAL_DISTANCE                   , LIMITED  ,   MANUAL_SENSOR        );
-                expectKeyAvailable(c, CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE                , LIMITED  ,   NONE                 );
-                expectKeyAvailable(c, CameraCharacteristics.NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES                  , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_PROC                     , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_PROC_STALLING            , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_RAW                      , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.REQUEST_PARTIAL_RESULT_COUNT                    , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.REQUEST_PIPELINE_MAX_DEPTH                      , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM               , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP                 , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.SCALER_CROPPING_TYPE                            , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.SENSOR_AVAILABLE_TEST_PATTERN_MODES             , LEGACY   ,   NONE                 );
+                expectKeyAvailable(c, CameraCharacteristics.LENS_INFO_HYPERFOCAL_DISTANCE                   , LIMITED  ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE                , LIMITED  ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES                  , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.REQUEST_MAX_NUM_INPUT_STREAMS                   , OPT      ,   YUV_REPROCESS, OPAQUE_REPROCESS);
+                expectKeyAvailable(c, CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP                 , OPT      ,   CONSTRAINED_HIGH_SPEED);
+                expectKeyAvailable(c, CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_PROC                     , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_PROC_STALLING            , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_RAW                      , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.REQUEST_PARTIAL_RESULT_COUNT                    , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.REQUEST_PIPELINE_MAX_DEPTH                      , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM               , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP                 , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.SCALER_CROPPING_TYPE                            , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.SENSOR_AVAILABLE_TEST_PATTERN_MODES             , OPT      ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.SENSOR_BLACK_LEVEL_PATTERN                      , FULL     ,   MANUAL_SENSOR, RAW   );
                 expectKeyAvailable(c, CameraCharacteristics.SENSOR_CALIBRATION_TRANSFORM1                   , OPT      ,   RAW                  );
-                expectKeyAvailable(c, CameraCharacteristics.SENSOR_CALIBRATION_TRANSFORM2                   , OPT      ,   RAW                  );
                 expectKeyAvailable(c, CameraCharacteristics.SENSOR_COLOR_TRANSFORM1                         , OPT      ,   RAW                  );
-                expectKeyAvailable(c, CameraCharacteristics.SENSOR_COLOR_TRANSFORM2                         , OPT      ,   RAW                  );
                 expectKeyAvailable(c, CameraCharacteristics.SENSOR_FORWARD_MATRIX1                          , OPT      ,   RAW                  );
-                expectKeyAvailable(c, CameraCharacteristics.SENSOR_FORWARD_MATRIX2                          , OPT      ,   RAW                  );
-                expectKeyAvailable(c, CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE                   , LEGACY   ,   BC, RAW              );
+                expectKeyAvailable(c, CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE                   , OPT      ,   BC, RAW              );
                 expectKeyAvailable(c, CameraCharacteristics.SENSOR_INFO_COLOR_FILTER_ARRANGEMENT            , FULL     ,   RAW                  );
                 expectKeyAvailable(c, CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE                 , FULL     ,   MANUAL_SENSOR        );
                 expectKeyAvailable(c, CameraCharacteristics.SENSOR_INFO_MAX_FRAME_DURATION                  , FULL     ,   MANUAL_SENSOR        );
-                expectKeyAvailable(c, CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE                       , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.SENSOR_INFO_PIXEL_ARRAY_SIZE                    , LEGACY   ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE                       , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.SENSOR_INFO_PIXEL_ARRAY_SIZE                    , OPT      ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE                   , FULL     ,   MANUAL_SENSOR        );
                 expectKeyAvailable(c, CameraCharacteristics.SENSOR_INFO_WHITE_LEVEL                         , OPT      ,   RAW                  );
-                expectKeyAvailable(c, CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE                    , LEGACY   ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE                    , OPT      ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.SENSOR_MAX_ANALOG_SENSITIVITY                   , FULL     ,   MANUAL_SENSOR        );
-                expectKeyAvailable(c, CameraCharacteristics.SENSOR_ORIENTATION                              , LEGACY   ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.SENSOR_ORIENTATION                              , OPT      ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.SENSOR_REFERENCE_ILLUMINANT1                    , OPT      ,   RAW                  );
-                expectKeyAvailable(c, CameraCharacteristics.SENSOR_REFERENCE_ILLUMINANT2                    , OPT      ,   RAW                  );
-                expectKeyAvailable(c, CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES     , LEGACY   ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.SHADING_AVAILABLE_MODES                         , LIMITED  ,   MANUAL_POSTPROC, RAW );
+                expectKeyAvailable(c, CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES     , OPT      ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES   , OPT      ,   RAW                  );
-                expectKeyAvailable(c, CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT                  , LEGACY   ,   BC                   );
-                expectKeyAvailable(c, CameraCharacteristics.SYNC_MAX_LATENCY                                , LEGACY   ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES, LIMITED  ,   RAW                  );
+                expectKeyAvailable(c, CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT                  , OPT      ,   BC                   );
+                expectKeyAvailable(c, CameraCharacteristics.SYNC_MAX_LATENCY                                , OPT      ,   BC                   );
                 expectKeyAvailable(c, CameraCharacteristics.TONEMAP_AVAILABLE_TONE_MAP_MODES                , FULL     ,   MANUAL_POSTPROC      );
                 expectKeyAvailable(c, CameraCharacteristics.TONEMAP_MAX_CURVE_POINTS                        , FULL     ,   MANUAL_POSTPROC      );
 
@@ -263,6 +379,14 @@
                 // TODO: check that no other 'android' keys are listed in #getKeys if they aren't in the above list
             }
 
+            // Only check for these if the second reference illuminant is included
+            if (allKeys.contains(CameraCharacteristics.SENSOR_REFERENCE_ILLUMINANT2)) {
+                expectKeyAvailable(c, CameraCharacteristics.SENSOR_REFERENCE_ILLUMINANT2                    , OPT      ,   RAW                  );
+                expectKeyAvailable(c, CameraCharacteristics.SENSOR_COLOR_TRANSFORM2                         , OPT      ,   RAW                  );
+                expectKeyAvailable(c, CameraCharacteristics.SENSOR_CALIBRATION_TRANSFORM2                   , OPT      ,   RAW                  );
+                expectKeyAvailable(c, CameraCharacteristics.SENSOR_FORWARD_MATRIX2                          , OPT      ,   RAW                  );
+            }
+
             counter++;
         }
     }
@@ -329,6 +453,10 @@
             BlackLevelPattern blackLevel = mCollector.expectKeyValueNotNull(c,
                     CameraCharacteristics.SENSOR_BLACK_LEVEL_PATTERN);
             if (blackLevel != null) {
+                String blackLevelPatternString = blackLevel.toString();
+                if (VERBOSE) {
+                    Log.v(TAG, "Black level pattern: " + blackLevelPatternString);
+                }
                 int[] blackLevelPattern = new int[BlackLevelPattern.COUNT];
                 blackLevel.copyTo(blackLevelPattern, /*offset*/0);
                 Integer whitelevel = c.get(CameraCharacteristics.SENSOR_INFO_WHITE_LEVEL);
@@ -349,29 +477,46 @@
     /**
      * Test values for static metadata used by the BURST capability.
      */
-    public void testStaticBurstCharacteristics() {
+    public void testStaticBurstCharacteristics() throws Exception {
         int counter = 0;
         final float SIZE_ERROR_MARGIN = 0.03f;
         for (CameraCharacteristics c : mCharacteristics) {
-            int[] actualCapabilities = c.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
-            assertNotNull("android.request.availableCapabilities must never be null",
-                    actualCapabilities);
+            int[] actualCapabilities = CameraTestUtils.getValueNotNull(
+                    c, CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
 
             // Check if the burst capability is defined
             boolean haveBurstCapability = arrayContains(actualCapabilities,
                     CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE);
+            boolean haveBC = arrayContains(actualCapabilities,
+                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE);
+
+            if(haveBurstCapability && !haveBC) {
+                fail("Must have BACKWARD_COMPATIBLE capability if BURST_CAPTURE capability is defined");
+            }
+
+            if (!haveBC) continue;
 
             StreamConfigurationMap config =
                     c.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
             assertNotNull(String.format("No stream configuration map found for: ID %s",
                     mIds[counter]), config);
-            Rect activeRect = c.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
+            Rect activeRect = CameraTestUtils.getValueNotNull(
+                    c, CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
             Size sensorSize = new Size(activeRect.width(), activeRect.height());
 
             // Ensure that max YUV size matches max JPEG size
             Size maxYuvSize = CameraTestUtils.getMaxSize(
                     config.getOutputSizes(ImageFormat.YUV_420_888));
-            Size maxJpegSize = CameraTestUtils.getMaxSize(config.getOutputSizes(ImageFormat.JPEG));
+            Size maxFastYuvSize = maxYuvSize;
+
+            Size[] slowYuvSizes = config.getHighResolutionOutputSizes(ImageFormat.YUV_420_888);
+            if (haveBurstCapability && slowYuvSizes != null && slowYuvSizes.length > 0) {
+                Size maxSlowYuvSize = CameraTestUtils.getMaxSize(slowYuvSizes);
+                maxYuvSize = CameraTestUtils.getMaxSize(new Size[]{maxYuvSize, maxSlowYuvSize});
+            }
+
+            Size maxJpegSize = CameraTestUtils.getMaxSize(CameraTestUtils.getSupportedSizeForFormat(
+                    ImageFormat.JPEG, mIds[counter], mCameraManager));
 
             boolean haveMaxYuv = maxYuvSize != null ?
                 (maxJpegSize.getWidth() <= maxYuvSize.getWidth() &&
@@ -383,18 +528,35 @@
                      maxYuvSize.getHeight() <= sensorSize.getHeight() * (1.0 + SIZE_ERROR_MARGIN) &&
                      maxYuvSize.getHeight() >= sensorSize.getHeight() * (1.0 - SIZE_ERROR_MARGIN));
 
-            // Ensure that YUV output is fast enough - needs to be at least 20 fps
+            // No need to do null check since framework will generate the key if HAL don't supply
+            boolean haveAeLock = CameraTestUtils.getValueNotNull(
+                    c, CameraCharacteristics.CONTROL_AE_LOCK_AVAILABLE);
+            boolean haveAwbLock = CameraTestUtils.getValueNotNull(
+                    c, CameraCharacteristics.CONTROL_AWB_LOCK_AVAILABLE);
+
+            // Ensure that max YUV output is fast enough - needs to be at least 10 fps
 
             long maxYuvRate =
                 config.getOutputMinFrameDuration(ImageFormat.YUV_420_888, maxYuvSize);
-            final long MIN_DURATION_BOUND_NS = 50000000; // 50 ms, 20 fps
+            final long MIN_MAXSIZE_DURATION_BOUND_NS = 100000000; // 100 ms, 10 fps
+            boolean haveMaxYuvRate = maxYuvRate <= MIN_MAXSIZE_DURATION_BOUND_NS;
 
-            boolean haveMaxYuvRate = maxYuvRate <= MIN_DURATION_BOUND_NS;
+            // Ensure that some >=8MP YUV output is fast enough - needs to be at least 20 fps
+
+            long maxFastYuvRate =
+                    config.getOutputMinFrameDuration(ImageFormat.YUV_420_888, maxFastYuvSize);
+            final long MIN_8MP_DURATION_BOUND_NS = 200000000; // 50 ms, 20 fps
+            boolean haveFastYuvRate = maxFastYuvRate <= MIN_8MP_DURATION_BOUND_NS;
+
+            final int SIZE_8MP_BOUND = 8000000;
+            boolean havefast8MPYuv = (maxFastYuvSize.getWidth() * maxFastYuvSize.getHeight()) >
+                    SIZE_8MP_BOUND;
 
             // Ensure that there's an FPS range that's fast enough to capture at above
-            // minFrameDuration, for full-auto bursts
-            Range[] fpsRanges = c.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
-            float minYuvFps = 1.f / maxYuvRate;
+            // minFrameDuration, for full-auto bursts at the fast resolutions
+            Range[] fpsRanges = CameraTestUtils.getValueNotNull(
+                    c, CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
+            float minYuvFps = 1.f / maxFastYuvRate;
 
             boolean haveFastAeTargetFps = false;
             for (Range<Integer> r : fpsRanges) {
@@ -417,17 +579,26 @@
                 (maxSyncLatency <= MAX_LATENCY_BOUND) && (maxSyncLatency >= 0);
 
             if (haveBurstCapability) {
+                assertTrue("Must have slow YUV size array when BURST_CAPTURE capability is defined!",
+                        slowYuvSizes != null);
                 assertTrue(
                         String.format("BURST-capable camera device %s does not have maximum YUV " +
                                 "size that is at least max JPEG size",
                                 mIds[counter]),
                         haveMaxYuv);
                 assertTrue(
-                        String.format("BURST-capable camera device %s YUV frame rate is too slow" +
+                        String.format("BURST-capable camera device %s max-resolution " +
+                                "YUV frame rate is too slow" +
                                 "(%d ns min frame duration reported, less than %d ns expected)",
-                                mIds[counter], maxYuvRate, MIN_DURATION_BOUND_NS),
+                                mIds[counter], maxYuvRate, MIN_MAXSIZE_DURATION_BOUND_NS),
                         haveMaxYuvRate);
                 assertTrue(
+                        String.format("BURST-capable camera device %s >= 8MP YUV output " +
+                                "frame rate is too slow" +
+                                "(%d ns min frame duration reported, less than %d ns expected)",
+                                mIds[counter], maxYuvRate, MIN_8MP_DURATION_BOUND_NS),
+                        haveFastYuvRate);
+                assertTrue(
                         String.format("BURST-capable camera device %s does not list an AE target " +
                                 " FPS range with min FPS >= %f, for full-AUTO bursts",
                                 mIds[counter], minYuvFps),
@@ -438,14 +609,27 @@
                                 mIds[counter], maxSyncLatency, MAX_LATENCY_BOUND),
                         haveFastSyncLatency);
                 assertTrue(
-                        "Active array size and max YUV size should be similar",
+                        String.format("BURST-capable camera device %s max YUV size %s should be" +
+                                "close to active array size %s",
+                                mIds[counter], maxYuvSize.toString(), sensorSize.toString()),
                         maxYuvMatchSensor);
+                assertTrue(
+                        String.format("BURST-capable camera device %s does not support AE lock",
+                                mIds[counter]),
+                        haveAeLock);
+                assertTrue(
+                        String.format("BURST-capable camera device %s does not support AWB lock",
+                                mIds[counter]),
+                        haveAwbLock);
             } else {
+                assertTrue("Must have null slow YUV size array when no BURST_CAPTURE capability!",
+                        slowYuvSizes == null);
                 assertTrue(
                         String.format("Camera device %s has all the requirements for BURST" +
                                 " capability but does not report it!", mIds[counter]),
                         !(haveMaxYuv && haveMaxYuvRate && haveFastAeTargetFps &&
-                                haveFastSyncLatency && maxYuvMatchSensor));
+                                haveFastSyncLatency && maxYuvMatchSensor &&
+                                haveAeLock && haveAwbLock));
             }
 
             counter++;
@@ -453,9 +637,261 @@
     }
 
     /**
+     * Check reprocessing capabilities.
+     */
+    public void testReprocessingCharacteristics() {
+        int counter = 0;
+
+        for (CameraCharacteristics c : mCharacteristics) {
+            Log.i(TAG, "testReprocessingCharacteristics: Testing camera ID " + mIds[counter]);
+
+            int[] capabilities = c.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
+            assertNotNull("android.request.availableCapabilities must never be null",
+                    capabilities);
+            boolean supportYUV = arrayContains(capabilities,
+                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING);
+            boolean supportOpaque = arrayContains(capabilities,
+                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING);
+            StreamConfigurationMap configs =
+                    c.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+            Integer maxNumInputStreams =
+                    c.get(CameraCharacteristics.REQUEST_MAX_NUM_INPUT_STREAMS);
+            int[] availableEdgeModes = c.get(CameraCharacteristics.EDGE_AVAILABLE_EDGE_MODES);
+            int[] availableNoiseReductionModes = c.get(
+                    CameraCharacteristics.NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES);
+
+            int[] inputFormats = configs.getInputFormats();
+
+            boolean supportZslEdgeMode = false;
+            boolean supportZslNoiseReductionMode = false;
+
+            if (availableEdgeModes != null) {
+                supportZslEdgeMode = Arrays.asList(CameraTestUtils.toObject(availableEdgeModes)).
+                        contains(CaptureRequest.EDGE_MODE_ZERO_SHUTTER_LAG);
+            }
+
+            if (availableNoiseReductionModes != null) {
+                supportZslNoiseReductionMode = Arrays.asList(
+                        CameraTestUtils.toObject(availableNoiseReductionModes)).contains(
+                        CaptureRequest.NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG);
+            }
+
+            if (supportYUV || supportOpaque) {
+                mCollector.expectTrue("Support reprocessing but max number of input stream is " +
+                        maxNumInputStreams, maxNumInputStreams != null && maxNumInputStreams > 0);
+                mCollector.expectTrue("Support reprocessing but EDGE_MODE_ZERO_SHUTTER_LAG is " +
+                        "not supported", supportZslEdgeMode);
+                mCollector.expectTrue("Support reprocessing but " +
+                        "NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG is not supported",
+                        supportZslNoiseReductionMode);
+
+                // Verify mandatory input formats are supported
+                mCollector.expectTrue("YUV_420_888 input must be supported for YUV reprocessing",
+                        !supportYUV || arrayContains(inputFormats, ImageFormat.YUV_420_888));
+                mCollector.expectTrue("PRIVATE input must be supported for OPAQUE reprocessing",
+                        !supportOpaque || arrayContains(inputFormats, ImageFormat.PRIVATE));
+
+                // max capture stall must be reported if one of the reprocessing is supported.
+                final int MAX_ALLOWED_STALL_FRAMES = 4;
+                Integer maxCaptureStall = c.get(CameraCharacteristics.REPROCESS_MAX_CAPTURE_STALL);
+                mCollector.expectTrue("max capture stall must be non-null and no larger than "
+                        + MAX_ALLOWED_STALL_FRAMES,
+                        maxCaptureStall != null && maxCaptureStall <= MAX_ALLOWED_STALL_FRAMES);
+
+                for (int input : inputFormats) {
+                    // Verify mandatory output formats are supported
+                    int[] outputFormats = configs.getValidOutputFormatsForInput(input);
+                    mCollector.expectTrue("YUV_420_888 output must be supported for reprocessing",
+                            arrayContains(outputFormats, ImageFormat.YUV_420_888));
+                    mCollector.expectTrue("JPEG output must be supported for reprocessing",
+                            arrayContains(outputFormats, ImageFormat.JPEG));
+
+                    // Verify camera can output the reprocess input formats and sizes.
+                    Size[] inputSizes = configs.getInputSizes(input);
+                    Size[] outputSizes = configs.getOutputSizes(input);
+                    Size[] highResOutputSizes = configs.getHighResolutionOutputSizes(input);
+                    mCollector.expectTrue("no input size supported for format " + input,
+                            inputSizes.length > 0);
+                    mCollector.expectTrue("no output size supported for format " + input,
+                            outputSizes.length > 0);
+
+                    for (Size inputSize : inputSizes) {
+                        mCollector.expectTrue("Camera must be able to output the supported " +
+                                "reprocessing input size",
+                                arrayContains(outputSizes, inputSize) ||
+                                arrayContains(highResOutputSizes, inputSize));
+                    }
+                }
+            } else {
+                mCollector.expectTrue("Doesn't support reprocessing but report input format: " +
+                        Arrays.toString(inputFormats), inputFormats.length == 0);
+                mCollector.expectTrue("Doesn't support reprocessing but max number of input " +
+                        "stream is " + maxNumInputStreams,
+                        maxNumInputStreams == null || maxNumInputStreams == 0);
+                mCollector.expectTrue("Doesn't support reprocessing but " +
+                        "EDGE_MODE_ZERO_SHUTTER_LAG is supported", !supportZslEdgeMode);
+                mCollector.expectTrue("Doesn't support reprocessing but " +
+                        "NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG is supported",
+                        !supportZslNoiseReductionMode);
+            }
+        }
+    }
+
+    /**
+     * Check depth output capability
+     */
+    public void testDepthOutputCharacteristics() {
+        int counter = 0;
+
+        for (CameraCharacteristics c : mCharacteristics) {
+            Log.i(TAG, "testDepthOutputCharacteristics: Testing camera ID " + mIds[counter]);
+
+            int[] capabilities = c.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
+            assertNotNull("android.request.availableCapabilities must never be null",
+                    capabilities);
+            boolean supportDepth = arrayContains(capabilities,
+                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT);
+            StreamConfigurationMap configs =
+                    c.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+
+            int[] outputFormats = configs.getOutputFormats();
+            boolean hasDepth16 = arrayContains(outputFormats, ImageFormat.DEPTH16);
+
+            Boolean depthIsExclusive = c.get(CameraCharacteristics.DEPTH_DEPTH_IS_EXCLUSIVE);
+
+            float[] poseRotation = c.get(CameraCharacteristics.LENS_POSE_ROTATION);
+            float[] poseTranslation = c.get(CameraCharacteristics.LENS_POSE_TRANSLATION);
+            float[] cameraIntrinsics = c.get(CameraCharacteristics.LENS_INTRINSIC_CALIBRATION);
+            float[] radialDistortion = c.get(CameraCharacteristics.LENS_RADIAL_DISTORTION);
+
+            if (supportDepth) {
+                mCollector.expectTrue("Supports DEPTH_OUTPUT but does not support DEPTH16",
+                        hasDepth16);
+                if (hasDepth16) {
+                    Size[] depthSizes = configs.getOutputSizes(ImageFormat.DEPTH16);
+                    mCollector.expectTrue("Supports DEPTH_OUTPUT but no sizes for DEPTH16 supported!",
+                            depthSizes != null && depthSizes.length > 0);
+                    if (depthSizes != null) {
+                        for (Size depthSize : depthSizes) {
+                            mCollector.expectTrue("All depth16 sizes must be positive",
+                                    depthSize.getWidth() > 0 && depthSize.getHeight() > 0);
+                            long minFrameDuration = configs.getOutputMinFrameDuration(
+                                    ImageFormat.DEPTH16, depthSize);
+                            mCollector.expectTrue("Non-negative min frame duration for depth size "
+                                    + depthSize + " expected, got " + minFrameDuration,
+                                    minFrameDuration >= 0);
+                            long stallDuration = configs.getOutputStallDuration(
+                                    ImageFormat.DEPTH16, depthSize);
+                            mCollector.expectTrue("Non-negative stall duration for depth size "
+                                    + depthSize + " expected, got " + stallDuration,
+                                    stallDuration >= 0);
+                        }
+                    }
+                }
+                if (arrayContains(outputFormats, ImageFormat.DEPTH_POINT_CLOUD)) {
+                    Size[] depthCloudSizes = configs.getOutputSizes(ImageFormat.DEPTH_POINT_CLOUD);
+                    mCollector.expectTrue("Supports DEPTH_POINT_CLOUD " +
+                            "but no sizes for DEPTH_POINT_CLOUD supported!",
+                            depthCloudSizes != null && depthCloudSizes.length > 0);
+                    if (depthCloudSizes != null) {
+                        for (Size depthCloudSize : depthCloudSizes) {
+                            mCollector.expectTrue("All depth point cloud sizes must be nonzero",
+                                    depthCloudSize.getWidth() > 0);
+                            mCollector.expectTrue("All depth point cloud sizes must be N x 1",
+                                    depthCloudSize.getHeight() == 1);
+                            long minFrameDuration = configs.getOutputMinFrameDuration(
+                                    ImageFormat.DEPTH_POINT_CLOUD, depthCloudSize);
+                            mCollector.expectTrue("Non-negative min frame duration for depth size "
+                                    + depthCloudSize + " expected, got " + minFrameDuration,
+                                    minFrameDuration >= 0);
+                            long stallDuration = configs.getOutputStallDuration(
+                                    ImageFormat.DEPTH_POINT_CLOUD, depthCloudSize);
+                            mCollector.expectTrue("Non-negative stall duration for depth size "
+                                    + depthCloudSize + " expected, got " + stallDuration,
+                                    stallDuration >= 0);
+                        }
+                    }
+                }
+
+                mCollector.expectTrue("Supports DEPTH_OUTPUT but DEPTH_IS_EXCLUSIVE is not defined",
+                        depthIsExclusive != null);
+
+                mCollector.expectTrue(
+                        "Supports DEPTH_OUTPUT but LENS_POSE_ROTATION not right size",
+                        poseRotation != null && poseRotation.length == 4);
+                mCollector.expectTrue(
+                        "Supports DEPTH_OUTPUT but LENS_POSE_TRANSLATION not right size",
+                        poseTranslation != null && poseTranslation.length == 3);
+                mCollector.expectTrue(
+                        "Supports DEPTH_OUTPUT but LENS_INTRINSIC_CALIBRATION not right size",
+                        cameraIntrinsics != null && cameraIntrinsics.length == 5);
+                mCollector.expectTrue(
+                        "Supports DEPTH_OUTPUT but LENS_RADIAL_DISTORTION not right size",
+                        radialDistortion != null && radialDistortion.length == 6);
+
+                if (poseRotation != null && poseRotation.length == 4) {
+                    float normSq =
+                        poseRotation[0] * poseRotation[0] +
+                        poseRotation[1] * poseRotation[1] +
+                        poseRotation[2] * poseRotation[2] +
+                        poseRotation[3] * poseRotation[3];
+                    mCollector.expectTrue(
+                            "LENS_POSE_ROTATION quarternion must be unit-length",
+                            0.9999f < normSq && normSq < 1.0001f);
+
+                    // TODO: Cross-validate orientation/facing and poseRotation
+                    Integer orientation = c.get(CameraCharacteristics.SENSOR_ORIENTATION);
+                    Integer facing = c.get(CameraCharacteristics.LENS_FACING);
+                }
+
+                if (poseTranslation != null && poseTranslation.length == 3) {
+                    float normSq =
+                        poseTranslation[0] * poseTranslation[0] +
+                        poseTranslation[1] * poseTranslation[1] +
+                        poseTranslation[2] * poseTranslation[2];
+                    mCollector.expectTrue("Pose translation is larger than 1 m",
+                            normSq < 1.f);
+                }
+
+                Rect precorrectionArray =
+                    c.get(CameraCharacteristics.SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE);
+                mCollector.expectTrue("Supports DEPTH_OUTPUT but does not have " +
+                        "precorrection active array defined", precorrectionArray != null);
+
+                if (cameraIntrinsics != null && precorrectionArray != null) {
+                    float fx = cameraIntrinsics[0];
+                    float fy = cameraIntrinsics[1];
+                    float cx = cameraIntrinsics[2];
+                    float cy = cameraIntrinsics[3];
+                    float s = cameraIntrinsics[4];
+                    mCollector.expectTrue("Optical center expected to be within precorrection array",
+                            0 <= cx && cx < precorrectionArray.width() &&
+                            0 <= cy && cy < precorrectionArray.height());
+
+                    // TODO: Verify focal lengths and skew are reasonable
+                }
+
+                if (radialDistortion != null) {
+                    // TODO: Verify radial distortion
+                }
+
+            } else {
+                boolean hasFields =
+                    hasDepth16 && (poseTranslation != null) &&
+                    (poseRotation != null) && (cameraIntrinsics != null) &&
+                    (radialDistortion != null) && (depthIsExclusive != null);
+
+                mCollector.expectTrue(
+                        "All necessary depth fields defined, but DEPTH_OUTPUT capability is not listed",
+                        !hasFields);
+            }
+        }
+    }
+
+    /**
      * Cross-check StreamConfigurationMap output
      */
-    public void testStreamConfigurationMap() {
+    public void testStreamConfigurationMap() throws Exception {
         int counter = 0;
         for (CameraCharacteristics c : mCharacteristics) {
             Log.i(TAG, "testStreamConfigurationMap: Testing camera ID " + mIds[counter]);
@@ -464,31 +900,41 @@
             assertNotNull(String.format("No stream configuration map found for: ID %s",
                             mIds[counter]), config);
 
-            assertTrue("ImageReader must be supported",
+            int[] actualCapabilities = c.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
+            assertNotNull("android.request.availableCapabilities must never be null",
+                    actualCapabilities);
+
+            if (arrayContains(actualCapabilities, BC)) {
+                assertTrue("ImageReader must be supported",
                     config.isOutputSupportedFor(android.media.ImageReader.class));
-            assertTrue("MediaRecorder must be supported",
+                assertTrue("MediaRecorder must be supported",
                     config.isOutputSupportedFor(android.media.MediaRecorder.class));
-            assertTrue("MediaCodec must be supported",
+                assertTrue("MediaCodec must be supported",
                     config.isOutputSupportedFor(android.media.MediaCodec.class));
-            assertTrue("Allocation must be supported",
+                assertTrue("Allocation must be supported",
                     config.isOutputSupportedFor(android.renderscript.Allocation.class));
-            assertTrue("SurfaceHolder must be supported",
+                assertTrue("SurfaceHolder must be supported",
                     config.isOutputSupportedFor(android.view.SurfaceHolder.class));
-            assertTrue("SurfaceTexture must be supported",
+                assertTrue("SurfaceTexture must be supported",
                     config.isOutputSupportedFor(android.graphics.SurfaceTexture.class));
 
-            assertTrue("YUV_420_888 must be supported",
+                assertTrue("YUV_420_888 must be supported",
                     config.isOutputSupportedFor(ImageFormat.YUV_420_888));
-            assertTrue("JPEG must be supported",
+                assertTrue("JPEG must be supported",
                     config.isOutputSupportedFor(ImageFormat.JPEG));
+            } else {
+                assertTrue("YUV_420_88 may not be supported if BACKWARD_COMPATIBLE capability is not listed",
+                    !config.isOutputSupportedFor(ImageFormat.YUV_420_888));
+                assertTrue("JPEG may not be supported if BACKWARD_COMPATIBLE capability is not listed",
+                    !config.isOutputSupportedFor(ImageFormat.JPEG));
+            }
 
             // Legacy YUV formats should not be listed
             assertTrue("NV21 must not be supported",
                     !config.isOutputSupportedFor(ImageFormat.NV21));
 
-            int[] actualCapabilities = c.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
-            assertNotNull("android.request.availableCapabilities must never be null",
-                    actualCapabilities);
+            // Check RAW
+
             if (arrayContains(actualCapabilities,
                     CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW)) {
                 assertTrue("RAW_SENSOR must be supported if RAW capability is advertised",
@@ -501,10 +947,19 @@
             for (int format : supportedFormats) {
                 assertTrue("Format " + format + " fails cross check",
                         config.isOutputSupportedFor(format));
-                Size[] supportedSizes = config.getOutputSizes(format);
+                List<Size> supportedSizes = CameraTestUtils.getAscendingOrderSizes(
+                        Arrays.asList(config.getOutputSizes(format)), /*ascending*/true);
+                if (arrayContains(actualCapabilities,
+                        CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE)) {
+                    supportedSizes.addAll(
+                        Arrays.asList(config.getHighResolutionOutputSizes(format)));
+                    supportedSizes = CameraTestUtils.getAscendingOrderSizes(
+                        supportedSizes, /*ascending*/true);
+                }
                 assertTrue("Supported format " + format + " has no sizes listed",
-                        supportedSizes.length > 0);
-                for (Size size : supportedSizes) {
+                        supportedSizes.size() > 0);
+                for (int i = 0; i < supportedSizes.size(); i++) {
+                    Size size = supportedSizes.get(i);
                     if (VERBOSE) {
                         Log.v(TAG,
                                 String.format("Testing camera %s, format %d, size %s",
@@ -517,6 +972,28 @@
                             assertTrue("YUV_420_888 may not have a non-zero stall duration",
                                     stallDuration == 0);
                             break;
+                        case ImageFormat.JPEG:
+                        case ImageFormat.RAW_SENSOR:
+                            final float TOLERANCE_FACTOR = 2.0f;
+                            long prevDuration = 0;
+                            if (i > 0) {
+                                prevDuration = config.getOutputStallDuration(
+                                        format, supportedSizes.get(i - 1));
+                            }
+                            long nextDuration = Long.MAX_VALUE;
+                            if (i < (supportedSizes.size() - 1)) {
+                                nextDuration = config.getOutputStallDuration(
+                                        format, supportedSizes.get(i + 1));
+                            }
+                            long curStallDuration = config.getOutputStallDuration(format, size);
+                            // Stall duration should be in a reasonable range: larger size should
+                            // normally have larger stall duration.
+                            mCollector.expectInRange("Stall duration (format " + format +
+                                    " and size " + size + ") is not in the right range",
+                                    curStallDuration,
+                                    (long) (prevDuration / TOLERANCE_FACTOR),
+                                    (long) (nextDuration * TOLERANCE_FACTOR));
+                            break;
                         default:
                             assertTrue("Negative stall duration for format " + format,
                                     stallDuration >= 0);
@@ -534,29 +1011,30 @@
                                 minDuration >= 0);
                     }
 
-                    ImageReader testReader = ImageReader.newInstance(
-                        size.getWidth(),
-                        size.getHeight(),
-                        format,
-                        1);
-                    Surface testSurface = testReader.getSurface();
+                    // todo: test opaque image reader when it's supported.
+                    if (format != ImageFormat.PRIVATE) {
+                        ImageReader testReader = ImageReader.newInstance(
+                            size.getWidth(),
+                            size.getHeight(),
+                            format,
+                            1);
+                        Surface testSurface = testReader.getSurface();
 
-                    assertTrue(
-                        String.format("isOutputSupportedFor fails for config %s, format %d",
-                                size.toString(), format),
-                        config.isOutputSupportedFor(testSurface));
+                        assertTrue(
+                            String.format("isOutputSupportedFor fails for config %s, format %d",
+                                    size.toString(), format),
+                            config.isOutputSupportedFor(testSurface));
 
-                    testReader.close();
-
+                        testReader.close();
+                    }
                 } // sizes
 
                 // Try an invalid size in this format, should round
                 Size invalidSize = findInvalidSize(supportedSizes);
-                // WAR: the intended threshold is 1920, but to counter the bug
-                // in Lollipop framework, we need to set it to 1080 here.
-                // The threshold will be changed back to 1920 in next Android release.
-                int MAX_ROUNDING_WIDTH = 1080;
-                if (invalidSize.getWidth() <= MAX_ROUNDING_WIDTH) {
+                int MAX_ROUNDING_WIDTH = 1920;
+                // todo: test opaque image reader when it's supported.
+                if (format != ImageFormat.PRIVATE &&
+                        invalidSize.getWidth() <= MAX_ROUNDING_WIDTH) {
                     ImageReader testReader = ImageReader.newInstance(
                                                                      invalidSize.getWidth(),
                                                                      invalidSize.getHeight(),
@@ -574,56 +1052,146 @@
             } // formats
 
             // Cross-check opaque format and sizes
+            if (arrayContains(actualCapabilities, BC)) {
+                SurfaceTexture st = new SurfaceTexture(1);
+                Surface surf = new Surface(st);
 
-            SurfaceTexture st = new SurfaceTexture(1);
-            Surface surf = new Surface(st);
+                Size[] opaqueSizes = CameraTestUtils.getSupportedSizeForClass(SurfaceTexture.class,
+                        mIds[counter], mCameraManager);
+                assertTrue("Opaque format has no sizes listed",
+                        opaqueSizes.length > 0);
+                for (Size size : opaqueSizes) {
+                    long stallDuration = config.getOutputStallDuration(SurfaceTexture.class, size);
+                    assertTrue("Opaque output may not have a non-zero stall duration",
+                            stallDuration == 0);
 
-            Size[] opaqueSizes = config.getOutputSizes(SurfaceTexture.class);
-            assertTrue("Opaque format has no sizes listed",
-                    opaqueSizes.length > 0);
-            for (Size size : opaqueSizes) {
-                long stallDuration = config.getOutputStallDuration(SurfaceTexture.class, size);
-                assertTrue("Opaque output may not have a non-zero stall duration",
-                        stallDuration == 0);
+                    long minDuration = config.getOutputMinFrameDuration(SurfaceTexture.class, size);
+                    if (arrayContains(actualCapabilities,
+                                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
+                        assertTrue("MANUAL_SENSOR capability, need positive min frame duration for"
+                                + "opaque format",
+                                minDuration > 0);
+                    } else {
+                        assertTrue("Need non-negative min frame duration for opaque format ",
+                                minDuration >= 0);
+                    }
+                    st.setDefaultBufferSize(size.getWidth(), size.getHeight());
 
-                long minDuration = config.getOutputMinFrameDuration(SurfaceTexture.class, size);
-                if (arrayContains(actualCapabilities,
-                                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
-                    assertTrue("MANUAL_SENSOR capability, need positive min frame duration for"
-                            + "opaque format",
-                            minDuration > 0);
-                } else {
-                    assertTrue("Need non-negative min frame duration for opaque format ",
-                            minDuration >= 0);
-                }
-                st.setDefaultBufferSize(size.getWidth(), size.getHeight());
+                    assertTrue(
+                            String.format("isOutputSupportedFor fails for SurfaceTexture config %s",
+                                    size.toString()),
+                            config.isOutputSupportedFor(surf));
 
+                } // opaque sizes
+
+                // Try invalid opaque size, should get rounded
+                Size invalidSize = findInvalidSize(opaqueSizes);
+                st.setDefaultBufferSize(invalidSize.getWidth(), invalidSize.getHeight());
                 assertTrue(
-                    String.format("isOutputSupportedFor fails for SurfaceTexture config %s",
-                            size.toString()),
-                    config.isOutputSupportedFor(surf));
+                        String.format("isOutputSupportedFor fails for SurfaceTexture config %s",
+                                invalidSize.toString()),
+                        config.isOutputSupportedFor(surf));
 
-            } // opaque sizes
+                counter++;
+            }
 
-            // Try invalid opaque size, should get rounded
-            Size invalidSize = findInvalidSize(opaqueSizes);
-            st.setDefaultBufferSize(invalidSize.getWidth(), invalidSize.getHeight());
-            assertTrue(
-                String.format("isOutputSupportedFor fails for SurfaceTexture config %s",
-                        invalidSize.toString()),
-                config.isOutputSupportedFor(surf));
-
-            counter++;
         } // mCharacteristics
+    }
 
+    /**
+     * Test high speed capability and cross-check the high speed sizes and fps ranges from
+     * the StreamConfigurationMap.
+     */
+    public void testConstrainedHighSpeedCapability() throws Exception {
+        int counter = 0;
+        for (CameraCharacteristics c : mCharacteristics) {
+            int[] capabilities = CameraTestUtils.getValueNotNull(
+                    c, CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
+            boolean supportHighSpeed = arrayContains(capabilities, CONSTRAINED_HIGH_SPEED);
+            if (supportHighSpeed) {
+                StreamConfigurationMap config =
+                        CameraTestUtils.getValueNotNull(
+                                c, CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+                List<Size> highSpeedSizes = Arrays.asList(config.getHighSpeedVideoSizes());
+                assertTrue("High speed sizes shouldn't be empty", highSpeedSizes.size() > 0);
+                Size[] allSizes = CameraTestUtils.getSupportedSizeForFormat(ImageFormat.PRIVATE,
+                        mIds[counter], mCameraManager);
+                assertTrue("Normal size for PRIVATE format shouldn't be null or empty",
+                        allSizes != null && allSizes.length > 0);
+                for (Size size: highSpeedSizes) {
+                    // The sizes must be a subset of the normal sizes
+                    assertTrue("High speed size " + size +
+                            " must be part of normal sizes " + Arrays.toString(allSizes),
+                            Arrays.asList(allSizes).contains(size));
+
+                    // Sanitize the high speed FPS ranges for each size
+                    List<Range<Integer>> ranges =
+                            Arrays.asList(config.getHighSpeedVideoFpsRangesFor(size));
+                    for (Range<Integer> range : ranges) {
+                        assertTrue("The range " + range + " doesn't satisfy the"
+                                + " min/max boundary requirements.",
+                                range.getLower() >= HIGH_SPEED_FPS_LOWER_MIN &&
+                                range.getUpper() >= HIGH_SPEED_FPS_UPPER_MIN);
+                        assertTrue("The range " + range + " should be multiple of 30fps",
+                                range.getLower() % 30 == 0 && range.getUpper() % 30 == 0);
+                        // If the range is fixed high speed range, it should contain the
+                        // [30, fps_max] in the high speed range list; if it's variable FPS range,
+                        // the corresponding fixed FPS Range must be included in the range list.
+                        if (range.getLower() == range.getUpper()) {
+                            Range<Integer> variableRange = new Range<Integer>(30, range.getUpper());
+                            assertTrue("The variable FPS range " + variableRange +
+                                    " shoould be included in the high speed ranges for size " +
+                                    size, ranges.contains(variableRange));
+                        } else {
+                            Range<Integer> fixedRange =
+                                    new Range<Integer>(range.getUpper(), range.getUpper());
+                            assertTrue("The fixed FPS range " + fixedRange +
+                                    " shoould be included in the high speed ranges for size " +
+                                    size, ranges.contains(fixedRange));
+                        }
+                    }
+                }
+                // If the device advertise some high speed profiles, the sizes and FPS ranges
+                // should be advertise by the camera.
+                for (int quality = CamcorderProfile.QUALITY_HIGH_SPEED_480P;
+                        quality <= CamcorderProfile.QUALITY_HIGH_SPEED_2160P; quality++) {
+                    if (CamcorderProfile.hasProfile(quality)) {
+                        CamcorderProfile profile = CamcorderProfile.get(quality);
+                        Size camcorderProfileSize =
+                                new Size(profile.videoFrameWidth, profile.videoFrameHeight);
+                        assertTrue("CamcorderPrfile size " + camcorderProfileSize +
+                                " must be included in the high speed sizes " +
+                                Arrays.toString(highSpeedSizes.toArray()),
+                                highSpeedSizes.contains(camcorderProfileSize));
+                        Range<Integer> camcorderFpsRange =
+                                new Range<Integer>(profile.videoFrameRate, profile.videoFrameRate);
+                        List<Range<Integer>> allRanges =
+                                Arrays.asList(config.getHighSpeedVideoFpsRangesFor(
+                                        camcorderProfileSize));
+                        assertTrue("Camcorder fps range " + camcorderFpsRange +
+                                " should be included by high speed fps ranges " +
+                                Arrays.toString(allRanges.toArray()),
+                                allRanges.contains(camcorderFpsRange));
+                    }
+                }
+            }
+            counter++;
+        }
     }
 
     /**
      * Create an invalid size that's close to one of the good sizes in the list, but not one of them
      */
     private Size findInvalidSize(Size[] goodSizes) {
-        Size invalidSize = new Size(goodSizes[0].getWidth() + 1, goodSizes[0].getHeight());
-        while(arrayContains(goodSizes, invalidSize)) {
+        return findInvalidSize(Arrays.asList(goodSizes));
+    }
+
+    /**
+     * Create an invalid size that's close to one of the good sizes in the list, but not one of them
+     */
+    private Size findInvalidSize(List<Size> goodSizes) {
+        Size invalidSize = new Size(goodSizes.get(0).getWidth() + 1, goodSizes.get(0).getHeight());
+        while(goodSizes.contains(invalidSize)) {
             invalidSize = new Size(invalidSize.getWidth() + 1, invalidSize.getHeight());
         }
         return invalidSize;
@@ -649,7 +1217,8 @@
 
         T value = c.get(key);
 
-        if (compareHardwareLevel(actualHwLevel, hwLevel) >= 0) {
+        // For LIMITED-level targeted keys, rely on capability check, not level
+        if ((compareHardwareLevel(actualHwLevel, hwLevel) >= 0) && (hwLevel != LIMITED)) {
             mCollector.expectTrue(
                     String.format("Key (%s) must be in characteristics for this hardware level " +
                             "(required minimal HW level %s, actual HW level %s)",
@@ -663,18 +1232,21 @@
                             toStringHardwareLevel(actualHwLevel)),
                     allKeys.contains(key));
         } else if (arrayContainsAnyOf(actualCapabilities, capabilities)) {
-            mCollector.expectTrue(
+            if (!(hwLevel == LIMITED && compareHardwareLevel(actualHwLevel, hwLevel) < 0)) {
+                // Don't enforce LIMITED-starting keys on LEGACY level, even if cap is defined
+                mCollector.expectTrue(
                     String.format("Key (%s) must be in characteristics for these capabilities " +
                             "(required capabilities %s, actual capabilities %s)",
                             key.getName(), Arrays.toString(capabilities),
                             Arrays.toString(actualCapabilities)),
                     value != null);
-            mCollector.expectTrue(
+                mCollector.expectTrue(
                     String.format("Key (%s) must be in characteristics list of keys for " +
                             "these capabilities (required capabilities %s, actual capabilities %s)",
                             key.getName(), Arrays.toString(capabilities),
                             Arrays.toString(actualCapabilities)),
                     allKeys.contains(key));
+            }
         } else {
             if (actualHwLevel == LEGACY && hwLevel != OPT) {
                 if (value != null || allKeys.contains(key)) {
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/FlashlightTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/FlashlightTest.java
new file mode 100644
index 0000000..44b13c3
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/FlashlightTest.java
@@ -0,0 +1,386 @@
+/*
+ * Copyright 2015 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.hardware.camera2.cts;
+
+import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.cts.testcases.Camera2AndroidTestCase;
+import android.hardware.camera2.cts.helpers.StaticMetadata;
+import android.hardware.camera2.cts.helpers.StaticMetadata.CheckLevel;
+import android.util.Log;
+import android.os.SystemClock;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+import static org.mockito.Mockito.*;
+
+/**
+ * <p>Tests for flashlight API.</p>
+ */
+public class FlashlightTest extends Camera2AndroidTestCase {
+    private static final String TAG = "FlashlightTest";
+    private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
+    private static final int TORCH_DURATION_MS = 1000;
+    private static final int TORCH_TIMEOUT_MS = 3000;
+    private static final int NUM_REGISTERS = 10;
+
+    private ArrayList<String> mFlashCameraIdList;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        // initialize the list of cameras that have a flash unit so it won't interfere with
+        // flash tests.
+        mFlashCameraIdList = new ArrayList<String>();
+        for (String id : mCameraIds) {
+            StaticMetadata info =
+                    new StaticMetadata(mCameraManager.getCameraCharacteristics(id),
+                                       CheckLevel.ASSERT, /*collector*/ null);
+            if (info.hasFlash()) {
+                mFlashCameraIdList.add(id);
+            }
+        }
+    }
+
+    public void testSetTorchModeOnOff() throws Exception {
+        if (mFlashCameraIdList.size() == 0)
+            return;
+
+        // reset flash status for all devices with a flash unit
+        for (String id : mFlashCameraIdList) {
+            resetTorchModeStatus(id);
+        }
+
+        // turn on and off torch mode one by one
+        for (String id : mFlashCameraIdList) {
+            CameraManager.TorchCallback torchListener = mock(CameraManager.TorchCallback.class);
+            mCameraManager.registerTorchCallback(torchListener, mHandler); // should get OFF
+
+            mCameraManager.setTorchMode(id, true); // should get ON
+            SystemClock.sleep(TORCH_DURATION_MS);
+            mCameraManager.setTorchMode(id, false); // should get OFF
+
+            // verify corrected numbers of callbacks
+            verify(torchListener, timeout(TORCH_TIMEOUT_MS).
+                    times(2)).onTorchModeChanged(id, false);
+            verify(torchListener, timeout(TORCH_TIMEOUT_MS).
+                    times(mFlashCameraIdList.size() + 1)).
+                    onTorchModeChanged(anyString(), eq(false));
+            verify(torchListener, timeout(TORCH_TIMEOUT_MS).
+                    times(1)).onTorchModeChanged(id, true);
+            verify(torchListener, timeout(TORCH_TIMEOUT_MS).
+                    times(1)).onTorchModeChanged(anyString(), eq(true));
+            verify(torchListener, timeout(TORCH_TIMEOUT_MS).never()).
+                    onTorchModeUnavailable(anyString());
+
+            mCameraManager.unregisterTorchCallback(torchListener);
+        }
+
+        // turn on all torch modes at once
+        if (mFlashCameraIdList.size() >= 2) {
+            CameraManager.TorchCallback torchListener = mock(CameraManager.TorchCallback.class);
+            mCameraManager.registerTorchCallback(torchListener, mHandler); // should get OFF.
+
+            for (String id : mFlashCameraIdList) {
+                // should get ON for this ID.
+                // may get OFF for previously-on IDs.
+                mCameraManager.setTorchMode(id, true);
+            }
+
+            SystemClock.sleep(TORCH_DURATION_MS);
+
+            for (String id : mFlashCameraIdList) {
+                // should get OFF if not turned off previously.
+                mCameraManager.setTorchMode(id, false);
+            }
+
+            verify(torchListener, timeout(TORCH_TIMEOUT_MS).times(mFlashCameraIdList.size())).
+                    onTorchModeChanged(anyString(), eq(true));
+            // one more off for each id due to callback registeration.
+            verify(torchListener, timeout(TORCH_TIMEOUT_MS).
+                    times(mFlashCameraIdList.size() * 2)).
+                    onTorchModeChanged(anyString(), eq(false));
+
+            mCameraManager.unregisterTorchCallback(torchListener);
+        }
+    }
+
+    public void testTorchCallback() throws Exception {
+        if (mFlashCameraIdList.size() == 0)
+            return;
+
+        // reset torch mode status
+        for (String id : mFlashCameraIdList) {
+            resetTorchModeStatus(id);
+        }
+
+        CameraManager.TorchCallback torchListener = mock(CameraManager.TorchCallback.class);
+
+        for (int i = 0; i < NUM_REGISTERS; i++) {
+            // should get OFF for all cameras with a flash unit.
+            mCameraManager.registerTorchCallback(torchListener, mHandler);
+            mCameraManager.unregisterTorchCallback(torchListener);
+        }
+
+        verify(torchListener, timeout(TORCH_TIMEOUT_MS).
+                times(NUM_REGISTERS * mFlashCameraIdList.size())).
+                onTorchModeChanged(anyString(), eq(false));
+        verify(torchListener, timeout(TORCH_TIMEOUT_MS).never()).
+                onTorchModeChanged(anyString(), eq(true));
+        verify(torchListener, timeout(TORCH_TIMEOUT_MS).never()).
+                onTorchModeUnavailable(anyString());
+
+        // verify passing a null handler will raise IllegalArgumentException
+        try {
+            mCameraManager.registerTorchCallback(torchListener, null);
+            mCameraManager.unregisterTorchCallback(torchListener);
+            fail("should get IllegalArgumentException due to no handler");
+        } catch (IllegalArgumentException e) {
+            // expected exception
+        }
+    }
+
+    public void testCameraDeviceOpenAfterTorchOn() throws Exception {
+        if (mFlashCameraIdList.size() == 0)
+            return;
+
+        for (String id : mFlashCameraIdList) {
+            for (String idToOpen : mCameraIds) {
+                resetTorchModeStatus(id);
+
+                CameraManager.TorchCallback torchListener =
+                        mock(CameraManager.TorchCallback.class);
+
+                // this will trigger OFF for each id in mFlashCameraIdList
+                mCameraManager.registerTorchCallback(torchListener, mHandler);
+
+                // this will trigger ON for id
+                mCameraManager.setTorchMode(id, true);
+                SystemClock.sleep(TORCH_DURATION_MS);
+
+                // if id == idToOpen, this will trigger UNAVAILABLE and may trigger OFF.
+                // this may trigger UNAVAILABLE for any other id in mFlashCameraIdList
+                openDevice(idToOpen);
+
+                // if id == idToOpen, this will trigger OFF.
+                // this may trigger OFF for any other id in mFlashCameraIdList.
+                closeDevice(idToOpen);
+
+                // this may trigger OFF for id if not received previously.
+                mCameraManager.setTorchMode(id, false);
+
+                verify(torchListener, timeout(TORCH_TIMEOUT_MS).times(1)).
+                        onTorchModeChanged(id, true);
+                verify(torchListener, timeout(TORCH_TIMEOUT_MS).times(1)).
+                        onTorchModeChanged(anyString(), eq(true));
+
+                verify(torchListener, timeout(TORCH_TIMEOUT_MS).atLeast(2)).
+                        onTorchModeChanged(id, false);
+                verify(torchListener, atMost(3)).onTorchModeChanged(id, false);
+
+                verify(torchListener, timeout(TORCH_TIMEOUT_MS).
+                        atLeast(mFlashCameraIdList.size())).
+                        onTorchModeChanged(anyString(), eq(false));
+                verify(torchListener, atMost(mFlashCameraIdList.size() * 2 + 1)).
+                        onTorchModeChanged(anyString(), eq(false));
+
+                if (hasFlash(idToOpen)) {
+                    verify(torchListener, timeout(TORCH_TIMEOUT_MS).times(1)).
+                            onTorchModeUnavailable(idToOpen);
+                }
+                verify(torchListener, atMost(mFlashCameraIdList.size())).
+                            onTorchModeUnavailable(anyString());
+
+                mCameraManager.unregisterTorchCallback(torchListener);
+            }
+        }
+    }
+
+    public void testTorchModeExceptions() throws Exception {
+        // cameraIdsToTestTorch = all available camera ID + non-existing camera id +
+        //                        non-existing numeric camera id + null
+        String[] cameraIdsToTestTorch = new String[mCameraIds.length + 3];
+        System.arraycopy(mCameraIds, 0, cameraIdsToTestTorch, 0, mCameraIds.length);
+        cameraIdsToTestTorch[mCameraIds.length] = generateNonexistingCameraId();
+        cameraIdsToTestTorch[mCameraIds.length + 1] = generateNonexistingNumericCameraId();
+
+        for (String idToOpen : mCameraIds) {
+            openDevice(idToOpen);
+            try {
+                for (String id : cameraIdsToTestTorch) {
+                    try {
+                        mCameraManager.setTorchMode(id, true);
+                        SystemClock.sleep(TORCH_DURATION_MS);
+                        mCameraManager.setTorchMode(id, false);
+                        if (!hasFlash(id)) {
+                            fail("exception should be thrown when turning on torch mode of a " +
+                                    "camera without a flash");
+                        } else if (id.equals(idToOpen)) {
+                            fail("exception should be thrown when turning on torch mode of an " +
+                                    "opened camera");
+                        }
+                    } catch (CameraAccessException e) {
+                        if ((hasFlash(id) &&  id.equals(idToOpen) &&
+                                    e.getReason() == CameraAccessException.CAMERA_IN_USE) ||
+                            (hasFlash(id) && !id.equals(idToOpen) &&
+                                    e.getReason() == CameraAccessException.MAX_CAMERAS_IN_USE)) {
+                            continue;
+                        }
+                        fail("(" + id + ") not expecting: " + e.getMessage());
+                    } catch (IllegalArgumentException e) {
+                        if (hasFlash(id)) {
+                            fail("not expecting IllegalArgumentException");
+                        }
+                    }
+                }
+            } finally {
+                closeDevice(idToOpen);
+            }
+        }
+    }
+
+    private boolean hasFlash(String cameraId) {
+        return mFlashCameraIdList.contains(cameraId);
+    }
+
+    // make sure the torch status is off.
+    private void resetTorchModeStatus(String cameraId) throws Exception {
+        TorchCallbackListener torchListener = new TorchCallbackListener(cameraId);
+
+        mCameraManager.registerTorchCallback(torchListener, mHandler);
+        mCameraManager.setTorchMode(cameraId, true);
+        mCameraManager.setTorchMode(cameraId, false);
+
+        torchListener.waitOnStatusChange(TorchCallbackListener.STATUS_ON);
+        torchListener.waitOnStatusChange(TorchCallbackListener.STATUS_OFF);
+
+        mCameraManager.unregisterTorchCallback(torchListener);
+    }
+
+    private String generateNonexistingCameraId() {
+        String nonExisting = "none_existing_camera";
+        for (String id : mCameraIds) {
+            if (Arrays.asList(mCameraIds).contains(nonExisting)) {
+                nonExisting += id;
+            } else {
+                break;
+            }
+        }
+        return nonExisting;
+    }
+
+    // return a non-existing and non-negative numeric camera id.
+    private String generateNonexistingNumericCameraId() {
+        int[] numericCameraIds = new int[mCameraIds.length];
+        int size = 0;
+
+        for (String cameraId : mCameraIds) {
+            try {
+                int value = Integer.parseInt(cameraId);
+                if (value >= 0) {
+                    numericCameraIds[size++] = value;
+                }
+            } catch (Throwable e) {
+                // do nothing if camera id isn't an integer
+            }
+        }
+
+        if (size == 0) {
+            return "0";
+        }
+
+        Arrays.sort(numericCameraIds, 0, size);
+        if (numericCameraIds[0] != 0) {
+            return "0";
+        }
+
+        for (int i = 0; i < size - 1; i++) {
+            if (numericCameraIds[i] + 1 < numericCameraIds[i + 1]) {
+                return String.valueOf(numericCameraIds[i] + 1);
+            }
+        }
+
+        if (numericCameraIds[size - 1] != Integer.MAX_VALUE) {
+            return String.valueOf(numericCameraIds[size - 1] + 1);
+        }
+
+        fail("cannot find a non-existing and non-negative numeric camera id");
+        return null;
+    }
+
+    private final class TorchCallbackListener extends CameraManager.TorchCallback {
+        private static final String TAG = "TorchCallbackListener";
+        private static final int STATUS_WAIT_TIMEOUT_MS = 3000;
+        private static final int QUEUE_CAPACITY = 100;
+
+        private String mCameraId;
+        private ArrayBlockingQueue<Integer> mStatusQueue =
+                new ArrayBlockingQueue<Integer>(QUEUE_CAPACITY);
+
+        public static final int STATUS_UNAVAILABLE = 0;
+        public static final int STATUS_OFF = 1;
+        public static final int STATUS_ON = 2;
+
+        public TorchCallbackListener(String cameraId) {
+            // only care about events for this camera id.
+            mCameraId = cameraId;
+        }
+
+        public void waitOnStatusChange(int status) throws Exception {
+            while (true) {
+                Integer s = mStatusQueue.poll(STATUS_WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+                if (s == null) {
+                    fail("waiting for status " + status + " timed out");
+                } else if (s.intValue() == status) {
+                    return;
+                }
+            }
+        }
+
+        @Override
+        public void onTorchModeUnavailable(String cameraId) {
+            if (cameraId.equals(mCameraId)) {
+                Integer s = new Integer(STATUS_UNAVAILABLE);
+                try {
+                    mStatusQueue.put(s);
+                } catch (Throwable e) {
+                    fail(e.getMessage());
+                }
+            }
+        }
+
+        @Override
+        public void onTorchModeChanged(String cameraId, boolean enabled) {
+            if (cameraId.equals(mCameraId)) {
+                Integer s;
+                if (enabled) {
+                    s = new Integer(STATUS_ON);
+                } else {
+                    s = new Integer(STATUS_OFF);
+                }
+                try {
+                    mStatusQueue.put(s);
+                } catch (Throwable e) {
+                    fail(e.getMessage());
+                }
+            }
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
index a410775..7c80c7d 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
@@ -34,6 +34,7 @@
 import android.hardware.camera2.cts.testcases.Camera2AndroidTestCase;
 import android.hardware.camera2.params.StreamConfigurationMap;
 import android.media.Image;
+import android.media.Image.Plane;
 import android.media.ImageReader;
 import android.os.ConditionVariable;
 import android.util.Log;
@@ -65,8 +66,12 @@
     private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
-    // number of frame (for streaming requests) to be verified.
+    // Number of frame (for streaming requests) to be verified.
     private static final int NUM_FRAME_VERIFIED = 2;
+    // Number of frame (for streaming requests) to be verified with log processing time.
+    private static final int NUM_LONG_PROCESS_TIME_FRAME_VERIFIED = 10;
+    // The time to hold each image for to simulate long processing time.
+    private static final int LONG_PROCESS_TIME_MS = 300;
     // Max number of images can be accessed simultaneously from ImageReader.
     private static final int MAX_NUM_IMAGES = 5;
     // Max difference allowed between YUV and JPEG patches. This tolerance is intentionally very
@@ -103,6 +108,30 @@
         }
     }
 
+    public void testDepth16() throws Exception {
+        for (String id : mCameraIds) {
+            try {
+                Log.i(TAG, "Testing Camera " + id);
+                openDevice(id);
+                bufferFormatTestByCamera(ImageFormat.DEPTH16, /*repeating*/true);
+            } finally {
+                closeDevice(id);
+            }
+        }
+    }
+
+    public void testDepthPointCloud() throws Exception {
+        for (String id : mCameraIds) {
+            try {
+                Log.i(TAG, "Testing Camera " + id);
+                openDevice(id);
+                bufferFormatTestByCamera(ImageFormat.DEPTH_POINT_CLOUD, /*repeating*/true);
+            } finally {
+                closeDevice(id);
+            }
+        }
+    }
+
     public void testJpeg() throws Exception {
         for (String id : mCameraIds) {
             try {
@@ -153,9 +182,33 @@
         }
     }
 
+    public void testLongProcessingRepeatingRaw() throws Exception {
+        for (String id : mCameraIds) {
+            try {
+                Log.v(TAG, "Testing long processing on repeating raw for camera " + id);
+                openDevice(id);
+                bufferFormatLongProcessingTimeTestByCamera(ImageFormat.RAW_SENSOR);
+            } finally {
+                closeDevice(id);
+            }
+        }
+    }
+
+    public void testLongProcessingRepeatingFlexibleYuv() throws Exception {
+        for (String id : mCameraIds) {
+            try {
+                Log.v(TAG, "Testing long processing on repeating YUV for camera " + id);
+                openDevice(id);
+                bufferFormatLongProcessingTimeTestByCamera(ImageFormat.YUV_420_888);
+            } finally {
+                closeDevice(id);
+            }
+        }
+    }
+
     /**
-     * Test invalid access of image byte buffers: when an image is closed, further access
-     * of the image byte buffers will get an IllegalStateException. The basic assumption of
+     * Test invalid access of image after an image is closed, further access
+     * of the image will get an IllegalStateException. The basic assumption of
      * this test is that the ImageReader always gives direct byte buffer, which is always true
      * for camera case. For if the produced image byte buffer is not direct byte buffer, there
      * is no guarantee to get an ISE for this invalid access case.
@@ -166,16 +219,12 @@
             try {
                 Log.v(TAG, "Testing invalid image access for Camera " + id);
                 openDevice(id);
-                bufferAccessAfterRelease();
-                fail("ImageReader should throw IllegalStateException when accessing a byte buffer"
-                        + " after the image is closed");
-            } catch (IllegalStateException e) {
-                // Expected.
+                invalidAccessTestAfterClose();
             } finally {
                 closeDevice(id);
+                closeDefaultImageReader();
             }
         }
-
     }
 
     /**
@@ -188,7 +237,11 @@
             try {
                 Log.v(TAG, "YUV and JPEG testing for camera " + id);
                 openDevice(id);
-
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id +
+                            " does not support color outputs, skipping");
+                    continue;
+                }
                 bufferFormatWithYuvTestByCamera(ImageFormat.JPEG);
             } finally {
                 closeDevice(id);
@@ -205,7 +258,11 @@
             try {
                 Log.v(TAG, "YUV and RAW testing for camera " + id);
                 openDevice(id);
-
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id +
+                            " does not support color outputs, skipping");
+                    continue;
+                }
                 bufferFormatWithYuvTestByCamera(ImageFormat.RAW_SENSOR);
             } finally {
                 closeDevice(id);
@@ -223,6 +280,11 @@
                 Log.v(TAG, "Testing all YUV image resolutions for camera " + id);
                 openDevice(id);
 
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
+
                 // Skip warmup on FULL mode devices.
                 int warmupCaptureNumber = (mStaticInfo.isHardwareLevelLegacy()) ?
                         MAX_NUM_IMAGES - 1 : 0;
@@ -553,7 +615,8 @@
                 List<Surface> outputSurfaces = new ArrayList<Surface>();
                 outputSurfaces.add(yuvSurface);
                 outputSurfaces.add(captureSurface);
-                CaptureRequest.Builder request = prepareCaptureRequestForSurfaces(outputSurfaces);
+                CaptureRequest.Builder request = prepareCaptureRequestForSurfaces(outputSurfaces,
+                        CameraDevice.TEMPLATE_PREVIEW);
                 SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
 
                 for (int i = 0; i < NUM_SINGLE_CAPTURE_TESTED; i++) {
@@ -595,34 +658,29 @@
         }
     }
 
-    /**
-     * Test buffer access after release, YUV420_888 single capture is tested. This method
-     * should throw ISE.
-     */
-    private void bufferAccessAfterRelease() throws Exception {
-        final int FORMAT = ImageFormat.YUV_420_888;
+    private void invalidAccessTestAfterClose() throws Exception {
+        final int FORMAT = mStaticInfo.isColorOutputSupported() ?
+            ImageFormat.YUV_420_888 : ImageFormat.DEPTH16;
+
         Size[] availableSizes = mStaticInfo.getAvailableSizesForFormatChecked(FORMAT,
                 StaticMetadata.StreamDirection.Output);
+        Image img = null;
+        // Create ImageReader.
+        mListener = new SimpleImageListener();
+        createDefaultImageReader(availableSizes[0], FORMAT, MAX_NUM_IMAGES, mListener);
 
-        try {
-            // Create ImageReader.
-            mListener = new SimpleImageListener();
-            createDefaultImageReader(availableSizes[0], FORMAT, MAX_NUM_IMAGES, mListener);
+        // Start capture.
+        CaptureRequest request = prepareCaptureRequest();
+        SimpleCaptureCallback listener = new SimpleCaptureCallback();
+        startCapture(request, /* repeating */false, listener, mHandler);
 
-            // Start capture.
-            CaptureRequest request = prepareCaptureRequest();
-            SimpleCaptureCallback listener = new SimpleCaptureCallback();
-            startCapture(request, /* repeating */false, listener, mHandler);
+        mListener.waitForAnyImageAvailable(CAPTURE_WAIT_TIMEOUT_MS);
+        img = mReader.acquireNextImage();
+        Plane firstPlane = img.getPlanes()[0];
+        ByteBuffer buffer = firstPlane.getBuffer();
+        img.close();
 
-            mListener.waitForAnyImageAvailable(CAPTURE_WAIT_TIMEOUT_MS);
-            Image img = mReader.acquireNextImage();
-            ByteBuffer buffer = img.getPlanes()[0].getBuffer();
-            img.close();
-
-            byte data = buffer.get(); // An ISE should be thrown here.
-        } finally {
-            closeDefaultImageReader();
-        }
+        imageInvalidAccessTestAfterClose(img, firstPlane, buffer);
     }
 
     private void bufferFormatTestByCamera(int format, boolean repeating) throws Exception {
@@ -664,6 +722,94 @@
         }
     }
 
+    private void bufferFormatLongProcessingTimeTestByCamera(int format)
+            throws Exception {
+
+        final int TEST_SENSITIVITY_VALUE = mStaticInfo.getSensitivityClampToRange(204);
+        final long TEST_EXPOSURE_TIME_NS = mStaticInfo.getExposureClampToRange(28000000);
+        final long EXPOSURE_TIME_ERROR_MARGIN_NS = 100000;
+
+        Size[] availableSizes = mStaticInfo.getAvailableSizesForFormatChecked(format,
+                StaticMetadata.StreamDirection.Output);
+
+        // for each resolution, test imageReader:
+        for (Size sz : availableSizes) {
+            Log.v(TAG, "testing size " + sz.toString());
+            try {
+                if (VERBOSE) {
+                    Log.v(TAG, "Testing long processing time: size " + sz.toString() + " format " +
+                            format + " for camera " + mCamera.getId());
+                }
+
+                // Create ImageReader.
+                mListener  = new SimpleImageListener();
+                createDefaultImageReader(sz, format, MAX_NUM_IMAGES, mListener);
+
+                // Setting manual controls
+                List<Surface> outputSurfaces = new ArrayList<Surface>();
+                outputSurfaces.add(mReader.getSurface());
+                CaptureRequest.Builder requestBuilder = prepareCaptureRequestForSurfaces(
+                        outputSurfaces, CameraDevice.TEMPLATE_STILL_CAPTURE);
+
+                requestBuilder.set(
+                        CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_OFF);
+                requestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true);
+                requestBuilder.set(CaptureRequest.CONTROL_AWB_LOCK, true);
+                requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
+                        CaptureRequest.CONTROL_AE_MODE_OFF);
+                requestBuilder.set(CaptureRequest.CONTROL_AWB_MODE,
+                        CaptureRequest.CONTROL_AWB_MODE_OFF);
+                requestBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, TEST_SENSITIVITY_VALUE);
+                requestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, TEST_EXPOSURE_TIME_NS);
+
+                SimpleCaptureCallback listener = new SimpleCaptureCallback();
+                startCapture(requestBuilder.build(), /*repeating*/true, listener, mHandler);
+
+                for (int i = 0; i < NUM_LONG_PROCESS_TIME_FRAME_VERIFIED; i++) {
+                    mListener.waitForAnyImageAvailable(CAPTURE_WAIT_TIMEOUT_MS);
+
+                    // Verify image.
+                    Image img = mReader.acquireNextImage();
+                    assertNotNull("Unable to acquire next image", img);
+                    CameraTestUtils.validateImage(img, sz.getWidth(), sz.getHeight(), format,
+                            DEBUG_FILE_NAME_BASE);
+
+                    // Verify the exposure time and iso match the requested values.
+                    CaptureResult result = listener.getCaptureResult(CAPTURE_RESULT_TIMEOUT_MS);
+
+                    long exposureTimeDiff = TEST_EXPOSURE_TIME_NS -
+                            getValueNotNull(result, CaptureResult.SENSOR_EXPOSURE_TIME);
+                    int sensitivityDiff = TEST_SENSITIVITY_VALUE -
+                            getValueNotNull(result, CaptureResult.SENSOR_SENSITIVITY);
+
+                    mCollector.expectTrue(
+                            String.format("Long processing frame %d format %d size %s " +
+                                    "exposure time was %d expecting %d.", i, format, sz.toString(),
+                                    getValueNotNull(result, CaptureResult.SENSOR_EXPOSURE_TIME),
+                                    TEST_EXPOSURE_TIME_NS),
+                            exposureTimeDiff < EXPOSURE_TIME_ERROR_MARGIN_NS &&
+                            exposureTimeDiff > 0);
+
+                    mCollector.expectTrue(
+                            String.format("Long processing frame %d format %d size %s " +
+                                    "sensitivity was %d expecting %d.", i, format, sz.toString(),
+                                    getValueNotNull(result, CaptureResult.SENSOR_SENSITIVITY),
+                                    TEST_SENSITIVITY_VALUE),
+                            sensitivityDiff == 0);
+
+
+                    // Sleep to Simulate long porcessing before closing the image.
+                    Thread.sleep(LONG_PROCESS_TIME_MS);
+                    img.close();
+                }
+                // stop capture.
+                stopCapture(/*fast*/false);
+            } finally {
+                closeDefaultImageReader();
+            }
+        }
+    }
+
     /**
      * Validate capture results.
      *
@@ -678,7 +824,7 @@
 
             // TODO: Update this to use availableResultKeys once shim supports this.
             if (mStaticInfo.isCapabilitySupported(
-                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
+                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS)) {
                 Long exposureTime = getValueNotNull(result, CaptureResult.SENSOR_EXPOSURE_TIME);
                 Integer sensitivity = getValueNotNull(result, CaptureResult.SENSOR_SENSITIVITY);
                 mCollector.expectInRange(
@@ -729,28 +875,6 @@
         }
     }
 
-    private CaptureRequest prepareCaptureRequest() throws Exception {
-        List<Surface> outputSurfaces = new ArrayList<Surface>();
-        Surface surface = mReader.getSurface();
-        assertNotNull("Fail to get surface from ImageReader", surface);
-        outputSurfaces.add(surface);
-        return prepareCaptureRequestForSurfaces(outputSurfaces).build();
-    }
-
-    private CaptureRequest.Builder prepareCaptureRequestForSurfaces(List<Surface> surfaces)
-            throws Exception {
-        createSession(surfaces);
-
-        CaptureRequest.Builder captureBuilder =
-                mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-        assertNotNull("Fail to get captureRequest", captureBuilder);
-        for (Surface surface : surfaces) {
-            captureBuilder.addTarget(surface);
-        }
-
-        return captureBuilder;
-    }
-
     private void validateImage(Size sz, int format, int captureCount,  boolean repeating)
             throws Exception {
         // TODO: Add more format here, and wrap each one as a function.
@@ -784,7 +908,7 @@
             if (VERBOSE) Log.v(TAG, "Got the latest image");
             CameraTestUtils.validateImage(img, sz.getWidth(), sz.getHeight(), format,
                     DEBUG_FILE_NAME_BASE);
-            if (VERBOSE) Log.v(TAG, "finish vaildation of image " + numImageVerified);
+            if (VERBOSE) Log.v(TAG, "finish validation of image " + numImageVerified);
             img.close();
             numImageVerified++;
             reTryCount = 0;
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/ImageWriterTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageWriterTest.java
new file mode 100644
index 0000000..167e637
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageWriterTest.java
@@ -0,0 +1,366 @@
+/*
+ * Copyright 2015 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.hardware.camera2.cts;
+
+import static android.hardware.camera2.cts.CameraTestUtils.*;
+
+import android.graphics.ImageFormat;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
+import android.hardware.camera2.cts.testcases.Camera2AndroidTestCase;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
+import android.media.Image;
+import android.media.Image.Plane;
+import android.media.ImageReader;
+import android.media.ImageWriter;
+import android.util.Log;
+import android.util.Size;
+import android.view.Surface;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * <p>
+ * Basic test for ImageWriter APIs. ImageWriter takes the images produced by
+ * camera (via ImageReader), then the data is consumed by either camera input
+ * interface or ImageReader.
+ * </p>
+ */
+public class ImageWriterTest extends Camera2AndroidTestCase {
+    private static final String TAG = "ImageWriterTest";
+    private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+    // Max number of images can be accessed simultaneously from ImageReader.
+    private static final int MAX_NUM_IMAGES = 3;
+    private static final int CAMERA_PRIVATE_FORMAT = ImageFormat.PRIVATE;
+    private ImageReader mReaderForWriter;
+    private ImageWriter mWriter;
+
+    @Override
+    protected void tearDown() throws Exception {
+        try {
+            closeImageReader(mReaderForWriter);
+        } finally {
+            mReaderForWriter = null;
+            if (mWriter != null) {
+                mWriter.close();
+                mWriter = null;
+            }
+        }
+
+        super.tearDown();
+    }
+
+    /**
+     * `
+     * <p>
+     * Basic YUV420_888 format ImageWriter ImageReader test that checks the
+     * images produced by camera can be passed correctly by ImageWriter.
+     * </p>
+     * <p>
+     * {@link ImageReader} reads the images produced by {@link CameraDevice}.
+     * The images are then passed to ImageWriter, which produces new images that
+     * are consumed by the second image reader. The images from first
+     * ImageReader should be identical with the images from the second
+     * ImageReader. This validates the basic image input interface of the
+     * ImageWriter. Below is the data path tested:
+     * <li>Explicit data copy: Dequeue an image from ImageWriter, copy the image
+     * data from first ImageReader into this image, then queue this image back
+     * to ImageWriter. This validates the ImageWriter explicit buffer copy
+     * interface.</li>
+     * </p>
+     */
+    public void testYuvImageWriterReaderOperation() throws Exception {
+        for (String id : mCameraIds) {
+            try {
+                Log.i(TAG, "Testing Camera " + id);
+                openDevice(id);
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
+                readerWriterFormatTestByCamera(ImageFormat.YUV_420_888);
+            } finally {
+                closeDevice(id);
+            }
+        }
+    }
+
+    /**
+     * <p>
+     * Basic Opaque format ImageWriter ImageReader test that checks the images
+     * produced by camera can be passed correctly by ImageWriter.
+     * </p>
+     * <p>
+     * {@link ImageReader} reads the images produced by {@link CameraDevice}.
+     * The images are then passed to ImageWriter, which produces new images that
+     * are consumed by the second image reader. The images from first
+     * ImageReader should be identical with the images from the second
+     * ImageReader. This validates the basic image input interface of the
+     * ImageWriter. Because opaque image is inaccessible by client, this test
+     * only covers below path, and only the image info is validated.
+     * <li>Direct image input to ImageWriter. The image from first ImageReader
+     * is directly injected into ImageWriter without needing to dequeue an input
+     * image. ImageWriter will migrate this opaque image into the destination
+     * surface without any data copy.</li>
+     * </p>
+     */
+    public void testOpaqueImageWriterReaderOperation() throws Exception {
+        for (String id : mCameraIds) {
+            try {
+                Log.i(TAG, "Testing Camera " + id);
+                openDevice(id);
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
+                readerWriterFormatTestByCamera(CAMERA_PRIVATE_FORMAT);
+            } finally {
+                closeDevice(id);
+            }
+        }
+    }
+
+    public void testAbandonedSurfaceExceptions() throws Exception {
+        final int READER_WIDTH = 1920;
+        final int READER_HEIGHT = 1080;
+        final int READER_FORMAT = ImageFormat.YUV_420_888;
+
+        // Verify that if the image writer's input surface is abandoned, dequeueing an image
+        // throws IllegalStateException
+        ImageReader reader = ImageReader.newInstance(READER_WIDTH, READER_HEIGHT, READER_FORMAT,
+                MAX_NUM_IMAGES);
+        ImageWriter writer = ImageWriter.newInstance(reader.getSurface(), MAX_NUM_IMAGES);
+
+        // Close image reader to abandon the input surface.
+        reader.close();
+
+        Image image;
+        try {
+            image = writer.dequeueInputImage();
+            fail("Should get an IllegalStateException");
+        } catch (IllegalStateException e) {
+            // Expected
+        } finally {
+            writer.close();
+        }
+
+        // Verify that if the image writer's input surface is abandoned, queueing an image
+        // throws IllegalStateException
+        reader = ImageReader.newInstance(READER_WIDTH, READER_HEIGHT, READER_FORMAT,
+                MAX_NUM_IMAGES);
+        writer = ImageWriter.newInstance(reader.getSurface(), MAX_NUM_IMAGES);
+        image = writer.dequeueInputImage();
+
+        // Close image reader to abandon the input surface.
+        reader.close();
+
+        try {
+            writer.queueInputImage(image);
+            fail("Should get an IllegalStateException");
+        } catch (IllegalStateException e) {
+            // Expected
+        } finally {
+            writer.close();
+        }
+    }
+
+    private void readerWriterFormatTestByCamera(int format)  throws Exception {
+        List<Size> sizes = getSortedSizesForFormat(mCamera.getId(), mCameraManager, format, null);
+        Size maxSize = sizes.get(0);
+        if (VERBOSE) {
+            Log.v(TAG, "Testing size " + maxSize);
+        }
+
+        // Create ImageReader for camera output.
+        SimpleImageReaderListener listenerForCamera  = new SimpleImageReaderListener();
+        createDefaultImageReader(maxSize, format, MAX_NUM_IMAGES, listenerForCamera);
+        if (VERBOSE) {
+            Log.v(TAG, "Created camera output ImageReader");
+        }
+
+        // Create ImageReader for ImageWriter output
+        SimpleImageReaderListener listenerForWriter  = new SimpleImageReaderListener();
+        mReaderForWriter = createImageReader(maxSize, format, MAX_NUM_IMAGES, listenerForWriter);
+        if (VERBOSE) {
+            Log.v(TAG, "Created ImageWriter output ImageReader");
+        }
+
+        // Create ImageWriter
+        Surface surface = mReaderForWriter.getSurface();
+        assertNotNull("Surface from ImageReader shouldn't be null", surface);
+        mWriter = ImageWriter.newInstance(surface, MAX_NUM_IMAGES);
+        SimpleImageWriterListener writerImageListener = new SimpleImageWriterListener(mWriter);
+        mWriter.setOnImageReleasedListener(writerImageListener, mHandler);
+
+        // Start capture: capture 2 images.
+        List<Surface> outputSurfaces = new ArrayList<Surface>();
+        outputSurfaces.add(mReader.getSurface());
+        CaptureRequest.Builder requestBuilder = prepareCaptureRequestForSurfaces(outputSurfaces,
+                CameraDevice.TEMPLATE_PREVIEW);
+        SimpleCaptureCallback captureListener = new SimpleCaptureCallback();
+        // Capture 1st image.
+        startCapture(requestBuilder.build(), /*repeating*/false, captureListener, mHandler);
+        // Capture 2nd image.
+        startCapture(requestBuilder.build(), /*repeating*/false, captureListener, mHandler);
+        if (VERBOSE) {
+            Log.v(TAG, "Submitted 2 captures");
+        }
+
+        // Image from the first ImageReader.
+        Image cameraImage = null;
+        // ImageWriter input image.
+        Image inputImage = null;
+        // Image from the second ImageReader.
+        Image outputImage = null;
+        assertTrue("ImageWriter max images should be " + MAX_NUM_IMAGES,
+                mWriter.getMaxImages() == MAX_NUM_IMAGES);
+        if (format == CAMERA_PRIVATE_FORMAT) {
+            assertTrue("First ImageReader format should be PRIVATE",
+                    mReader.getImageFormat() == CAMERA_PRIVATE_FORMAT);
+            assertTrue("Second ImageReader should be PRIVATE",
+                    mReaderForWriter.getImageFormat() == CAMERA_PRIVATE_FORMAT);
+            assertTrue("Format of first ImageReader should be PRIVATE",
+                    mReader.getImageFormat() == CAMERA_PRIVATE_FORMAT);
+            assertTrue(" Format of second ImageReader should be PRIVATE",
+                    mReaderForWriter.getImageFormat() == CAMERA_PRIVATE_FORMAT);
+            assertTrue(" Format of ImageWriter should be PRIVATE",
+                    mWriter.getFormat() == CAMERA_PRIVATE_FORMAT);
+
+            // Validate 2 images
+            validateOpaqueImages(maxSize, listenerForCamera, listenerForWriter, captureListener,
+                    /*numImages*/2, writerImageListener);
+        } else {
+            // Test case 1: Explicit data copy, only applicable for explicit formats.
+
+            // Get 1st image from first ImageReader, and copy the data to ImageWrtier input image
+            cameraImage = listenerForCamera.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+            inputImage = mWriter.dequeueInputImage();
+            inputImage.setTimestamp(cameraImage.getTimestamp());
+            if (VERBOSE) {
+                Log.v(TAG, "Image is being copied");
+            }
+            imageCopy(cameraImage, inputImage);
+            if (VERBOSE) {
+                Log.v(TAG, "Image copy is done");
+            }
+            mCollector.expectTrue(
+                    "ImageWriter 1st input image should match camera 1st output image",
+                    isImageStronglyEqual(inputImage, cameraImage));
+
+            // Image should be closed after queueInputImage call
+            Plane closedPlane = inputImage.getPlanes()[0];
+            ByteBuffer closedBuffer = closedPlane.getBuffer();
+            mWriter.queueInputImage(inputImage);
+            imageInvalidAccessTestAfterClose(inputImage, closedPlane, closedBuffer);
+
+            outputImage = listenerForWriter.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+            mCollector.expectTrue("ImageWriter 1st output image should match 1st input image",
+                    isImageStronglyEqual(cameraImage, outputImage));
+            if (DEBUG) {
+                String img1FileName = DEBUG_FILE_NAME_BASE + "/" + maxSize + "_image1_copy.yuv";
+                String outputImg1FileName = DEBUG_FILE_NAME_BASE + "/" + maxSize
+                        + "_outputImage2_copy.yuv";
+                dumpFile(img1FileName, getDataFromImage(cameraImage));
+                dumpFile(outputImg1FileName, getDataFromImage(outputImage));
+            }
+            // No need to close inputImage, as it is sent to the surface after queueInputImage;
+            cameraImage.close();
+            outputImage.close();
+
+            // Make sure ImageWriter listener callback is fired.
+            writerImageListener.waitForImageReleased(CAPTURE_IMAGE_TIMEOUT_MS);
+
+            // Test case 2: Directly inject the image into ImageWriter: works for all formats.
+
+            // Get 2nd image and queue it directly to ImageWrier
+            cameraImage = listenerForCamera.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+            // make a copy of image1 data, as it will be closed after queueInputImage;
+            byte[] img1Data = getDataFromImage(cameraImage);
+            if (DEBUG) {
+                String img2FileName = DEBUG_FILE_NAME_BASE + "/" + maxSize + "_image2.yuv";
+                dumpFile(img2FileName, img1Data);
+            }
+
+            // Image should be closed after queueInputImage call
+            closedPlane = cameraImage.getPlanes()[0];
+            closedBuffer = closedPlane.getBuffer();
+            mWriter.queueInputImage(cameraImage);
+            imageInvalidAccessTestAfterClose(cameraImage, closedPlane, closedBuffer);
+
+            outputImage = listenerForWriter.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+            byte[] outputImageData = getDataFromImage(outputImage);
+
+            mCollector.expectTrue("ImageWriter 2nd output image should match camera "
+                    + "2nd output image", Arrays.equals(img1Data, outputImageData));
+
+            if (DEBUG) {
+                String outputImgFileName = DEBUG_FILE_NAME_BASE + "/" + maxSize +
+                        "_outputImage2.yuv";
+                dumpFile(outputImgFileName, outputImageData);
+            }
+            // No need to close inputImage, as it is sent to the surface after queueInputImage;
+            outputImage.close();
+
+            // Make sure ImageWriter listener callback is fired.
+            writerImageListener.waitForImageReleased(CAPTURE_IMAGE_TIMEOUT_MS);
+        }
+
+        stopCapture(/*fast*/false);
+        mReader.close();
+        mReader = null;
+        mReaderForWriter.close();
+        mReaderForWriter = null;
+        mWriter.close();
+        mWriter = null;
+    }
+
+    private void validateOpaqueImages(Size maxSize, SimpleImageReaderListener listenerForCamera,
+            SimpleImageReaderListener listenerForWriter, SimpleCaptureCallback captureListener,
+            int numImages, SimpleImageWriterListener writerListener) throws Exception {
+        Image cameraImage;
+        Image outputImage;
+        for (int i = 0; i < numImages; i++) {
+            cameraImage = listenerForCamera.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+            CaptureResult result = captureListener.getCaptureResult(CAPTURE_IMAGE_TIMEOUT_MS);
+            validateOpaqueImage(cameraImage, "Opaque image " + i + "from camera: ", maxSize,
+                    result);
+            mWriter.queueInputImage(cameraImage);
+            // Image should be closed after queueInputImage
+            imageInvalidAccessTestAfterClose(cameraImage,
+                    /*closedPlane*/null, /*closedBuffer*/null);
+            outputImage = listenerForWriter.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+            validateOpaqueImage(outputImage, "First Opaque image output by ImageWriter: ",
+                    maxSize, result);
+            outputImage.close();
+            writerListener.waitForImageReleased(CAPTURE_IMAGE_TIMEOUT_MS);
+        }
+    }
+
+    private void validateOpaqueImage(Image image, String msg, Size imageSize,
+            CaptureResult result) {
+        assertNotNull("Opaque image Capture result should not be null", result != null);
+        mCollector.expectImageProperties(msg + "Opaque ", image, CAMERA_PRIVATE_FORMAT,
+                imageSize, result.get(CaptureResult.SENSOR_TIMESTAMP));
+        mCollector.expectTrue(msg + "Opaque image number planes should be zero",
+                image.getPlanes().length == 0);
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java
index 0d0ecb4..dfba587f 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java
@@ -47,10 +47,29 @@
 
     public void testTextureViewPreview() throws Exception {
         for (String cameraId : mCameraIds) {
-            openCamera(cameraId);
-            List<TextureView> views = Arrays.asList(mTextureView[0]);
-            textureViewPreview(cameraId, views, /*ImageReader*/null);
-            closeCamera(cameraId);
+            Exception prior = null;
+
+            try {
+                openCamera(cameraId);
+                if (!getStaticInfo(cameraId).isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + cameraId + " does not support color outputs, skipping");
+                    continue;
+                }
+                List<TextureView> views = Arrays.asList(mTextureView[0]);
+                textureViewPreview(cameraId, views, /*ImageReader*/null);
+            } catch (Exception e) {
+                prior = e;
+            } finally {
+                try {
+                    closeCamera(cameraId);
+                } catch (Exception e) {
+                    if (prior != null) {
+                        Log.e(TAG, "Prior exception received: " + prior);
+                    }
+                    prior = e;
+                }
+                if (prior != null) throw prior; // Rethrow last exception.
+            }
         }
     }
 
@@ -63,6 +82,10 @@
 
             try {
                 openCamera(cameraId);
+                if (!getStaticInfo(cameraId).isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + cameraId + " does not support color outputs, skipping");
+                    continue;
+                }
                 Size previewSize = getOrderedPreviewSizes(cameraId).get(0);
                 yuvListener =
                         new ImageVerifierListener(previewSize, ImageFormat.YUV_420_888);
@@ -96,6 +119,10 @@
             Exception prior = null;
             try {
                 openCamera(cameraId);
+                if (!getStaticInfo(cameraId).isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + cameraId + " does not support color outputs, skipping");
+                    continue;
+                }
                 int maxNumStreamsProc =
                         getStaticInfo(cameraId).getMaxNumOutputStreamsProcessedChecked();
                 if (maxNumStreamsProc < 2) {
@@ -128,6 +155,10 @@
 
             try {
                 openCamera(cameraId);
+                if (!getStaticInfo(cameraId).isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + cameraId + " does not support color outputs, skipping");
+                    continue;
+                }
                 Size previewSize = getOrderedPreviewSizes(cameraId).get(0);
                 yuvListener =
                         new ImageVerifierListener(previewSize, ImageFormat.YUV_420_888);
@@ -165,6 +196,11 @@
         try {
             for (int i = 0; i < NUM_CAMERAS_TESTED; i++) {
                 openCamera(mCameraIds[i]);
+                if (!getStaticInfo(mCameraIds[i]).isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + mCameraIds[i] +
+                            " does not support color outputs, skipping");
+                    continue;
+                }
                 List<TextureView> views = Arrays.asList(mTextureView[i]);
 
                 startTextureViewPreview(mCameraIds[i], views, /*ImageReader*/null);
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
index e669007..4af88ca 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
@@ -19,16 +19,19 @@
 import static com.android.ex.camera2.blocking.BlockingSessionCallback.*;
 
 import android.graphics.ImageFormat;
+import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCaptureSession;
 import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CaptureRequest;
 import android.hardware.camera2.CaptureResult;
 import android.hardware.camera2.TotalCaptureResult;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
 import android.hardware.camera2.cts.CameraTestUtils.SimpleImageReaderListener;
 import android.hardware.camera2.cts.helpers.StaticMetadata;
 import android.hardware.camera2.cts.helpers.StaticMetadata.CheckLevel;
 import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
+import android.hardware.camera2.params.InputConfiguration;
 import android.util.Log;
 import android.util.Pair;
 import android.util.Size;
@@ -36,10 +39,10 @@
 import android.cts.util.DeviceReportLog;
 import android.media.Image;
 import android.media.ImageReader;
+import android.media.ImageWriter;
 import android.os.ConditionVariable;
 import android.os.SystemClock;
 
-import com.android.cts.util.ReportLog;
 import com.android.cts.util.ResultType;
 import com.android.cts.util.ResultUnit;
 import com.android.cts.util.Stat;
@@ -47,6 +50,7 @@
 import com.android.ex.camera2.exceptions.TimeoutRuntimeException;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
@@ -61,9 +65,28 @@
     private static final int NUM_TEST_LOOPS = 5;
     private static final int NUM_MAX_IMAGES = 4;
     private static final int NUM_RESULTS_WAIT = 30;
+    private static final int[] REPROCESS_FORMATS = {ImageFormat.YUV_420_888, ImageFormat.PRIVATE};
+    private final int MAX_REPROCESS_IMAGES = 10;
+    private final int MAX_JPEG_IMAGES = MAX_REPROCESS_IMAGES;
+    private final int MAX_INPUT_IMAGES = MAX_REPROCESS_IMAGES;
+    // ZSL queue depth should be bigger than the max simultaneous reprocessing capture request
+    // count to maintain reasonable number of candidate image for the worse-case.
+    // Here we want to make sure we at most dequeue half of the queue max images for the worst-case.
+    private final int MAX_ZSL_IMAGES = MAX_REPROCESS_IMAGES * 2;
+    private final double REPROCESS_STALL_MARGIN = 0.1;
 
     private DeviceReportLog mReportLog;
 
+    // Used for reading camera output buffers.
+    private ImageReader mCameraZslReader;
+    private SimpleImageReaderListener mCameraZslImageListener;
+    // Used for reprocessing (jpeg) output.
+    private ImageReader mJpegReader;
+    private SimpleImageReaderListener mJpegListener;
+    // Used for reprocessing input.
+    private ImageWriter mWriter;
+    private SimpleCaptureCallback mZslResultListener;
+
     @Override
     protected void setUp() throws Exception {
         mReportLog = new DeviceReportLog();
@@ -86,7 +109,9 @@
      * case, there is no way for client to know the exact preview frame
      * arrival time. To approximate this time, a companion YUV420_888 stream is
      * created. The first YUV420_888 Image coming out of the ImageReader is treated
-     * as the first preview arrival time.
+     * as the first preview arrival time.</p>
+     * <p>
+     * For depth-only devices, timing is done with the DEPTH16 format instead.
      * </p>
      */
     public void testCameraLaunch() throws Exception {
@@ -96,10 +121,20 @@
         double[] stopPreviewTimes = new double[NUM_TEST_LOOPS];
         double[] cameraCloseTimes = new double[NUM_TEST_LOOPS];
         double[] cameraLaunchTimes = new double[NUM_TEST_LOOPS];
+        double[] avgCameraLaunchTimes = new double[mCameraIds.length];
 
+        int counter = 0;
         for (String id : mCameraIds) {
             try {
-                initializeImageReader(id, ImageFormat.YUV_420_888);
+                mStaticInfo = new StaticMetadata(mCameraManager.getCameraCharacteristics(id));
+                if (mStaticInfo.isColorOutputSupported()) {
+                    initializeImageReader(id, ImageFormat.YUV_420_888);
+                } else {
+                    assertTrue("Depth output must be supported if regular output isn't!",
+                            mStaticInfo.isDepthOutputSupported());
+                    initializeImageReader(id, ImageFormat.DEPTH16);
+                }
+
                 SimpleImageListener imageListener = null;
                 long startTimeMs, openTimeMs, configureTimeMs, previewStartedTimeMs;
                 for (int i = 0; i < NUM_TEST_LOOPS; i++) {
@@ -121,8 +156,8 @@
                         configureStreamTimes[i] = configureTimeMs - openTimeMs;
 
                         // Blocking start preview (start preview to first image arrives)
-                        CameraTestUtils.SimpleCaptureCallback resultListener =
-                                new CameraTestUtils.SimpleCaptureCallback();
+                        SimpleCaptureCallback resultListener =
+                                new SimpleCaptureCallback();
                         blockingStartPreview(resultListener, imageListener);
                         previewStartedTimeMs = SystemClock.elapsedRealtime();
                         startPreviewTimes[i] = previewStartedTimeMs - configureTimeMs;
@@ -144,6 +179,7 @@
                     }
                 }
 
+                avgCameraLaunchTimes[counter] = Stat.getAverage(cameraLaunchTimes);
                 // Finish the data collection, report the KPIs.
                 mReportLog.printArray("Camera " + id
                         + ": Camera open time", cameraOpenTimes,
@@ -163,13 +199,15 @@
                 mReportLog.printArray("Camera " + id
                         + ": Camera launch time", cameraLaunchTimes,
                         ResultType.LOWER_BETTER, ResultUnit.MS);
-                mReportLog.printSummary("Camera launch average time for Camera " + id,
-                        Stat.getAverage(cameraLaunchTimes),
-                        ResultType.LOWER_BETTER, ResultUnit.MS);
             }
             finally {
                 closeImageReader();
             }
+            counter++;
+        }
+        if (mCameraIds.length != 0) {
+            mReportLog.printSummary("Camera launch average time for all cameras ",
+                    Stat.getAverage(avgCameraLaunchTimes), ResultType.LOWER_BETTER, ResultUnit.MS);
         }
     }
 
@@ -190,11 +228,19 @@
         double[] captureTimes = new double[NUM_TEST_LOOPS];
         double[] getPartialTimes = new double[NUM_TEST_LOOPS];
         double[] getResultTimes = new double[NUM_TEST_LOOPS];
+        double[] avgResultTimes = new double[mCameraIds.length];
 
+        int counter = 0;
         for (String id : mCameraIds) {
             try {
                 openDevice(id);
 
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
+
+
                 boolean partialsExpected = mStaticInfo.getPartialResultCount() > 1;
                 long startTimeMs;
                 boolean isPartialTimingValid = partialsExpected;
@@ -205,8 +251,8 @@
                             mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
                     CaptureRequest.Builder captureBuilder =
                             mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
-                    CameraTestUtils.SimpleCaptureCallback previewResultListener =
-                            new CameraTestUtils.SimpleCaptureCallback();
+                    SimpleCaptureCallback previewResultListener =
+                            new SimpleCaptureCallback();
                     SimpleTimingResultListener captureResultListener =
                             new SimpleTimingResultListener();
                     SimpleImageListener imageListener = new SimpleImageListener();
@@ -267,12 +313,353 @@
                 mReportLog.printArray("Camera " + id
                         + ": Camera capture result latency", getResultTimes,
                         ResultType.LOWER_BETTER, ResultUnit.MS);
+
+                avgResultTimes[counter] = Stat.getAverage(getResultTimes);
             }
             finally {
                 closeImageReader();
                 closeDevice();
             }
+            counter++;
         }
+
+        // Result will not be reported in CTS report if no summary is printed.
+        if (mCameraIds.length != 0) {
+            mReportLog.printSummary("Camera capture result average latency for all cameras ",
+                    Stat.getAverage(avgResultTimes), ResultType.LOWER_BETTER, ResultUnit.MS);
+        }
+    }
+
+    /**
+     * Test reprocessing shot-to-shot latency, i.e., from the time a reprocess
+     * request is issued to the time the reprocess image is returned.
+     *
+     */
+    public void testReprocessingLatency() throws Exception {
+        for (String id : mCameraIds) {
+            for (int format : REPROCESS_FORMATS) {
+                if (!isReprocessSupported(id, format)) {
+                    continue;
+                }
+
+                try {
+                    openDevice(id);
+
+                    reprocessingPerformanceTestByCamera(format, /*asyncMode*/false);
+                } finally {
+                    closeReaderWriters();
+                    closeDevice();
+                }
+            }
+        }
+    }
+
+    /**
+     * Test reprocessing throughput, i.e., how many frames can be reprocessed
+     * during a given amount of time.
+     *
+     */
+    public void testReprocessingThroughput() throws Exception {
+        for (String id : mCameraIds) {
+            for (int format : REPROCESS_FORMATS) {
+                if (!isReprocessSupported(id, format)) {
+                    continue;
+                }
+
+                try {
+                    openDevice(id);
+
+                    reprocessingPerformanceTestByCamera(format, /*asyncMode*/true);
+                } finally {
+                    closeReaderWriters();
+                    closeDevice();
+                }
+            }
+        }
+    }
+
+    /**
+     * Testing reprocessing caused preview stall (frame drops)
+     */
+    public void testReprocessingCaptureStall() throws Exception {
+        for (String id : mCameraIds) {
+            for (int format : REPROCESS_FORMATS) {
+                if (!isReprocessSupported(id, format)) {
+                    continue;
+                }
+
+                try {
+                    openDevice(id);
+
+                    reprocessingCaptureStallTestByCamera(format);
+                } finally {
+                    closeReaderWriters();
+                    closeDevice();
+                }
+            }
+        }
+    }
+
+    private void reprocessingCaptureStallTestByCamera(int reprocessInputFormat) throws Exception {
+        prepareReprocessCapture(reprocessInputFormat);
+
+        // Let it stream for a while before reprocessing
+        startZslStreaming();
+        waitForFrames(NUM_RESULTS_WAIT);
+
+        final int NUM_REPROCESS_TESTED = MAX_REPROCESS_IMAGES / 2;
+        // Prepare several reprocessing request
+        Image[] inputImages = new Image[NUM_REPROCESS_TESTED];
+        CaptureRequest.Builder[] reprocessReqs = new CaptureRequest.Builder[MAX_REPROCESS_IMAGES];
+        for (int i = 0; i < NUM_REPROCESS_TESTED; i++) {
+            inputImages[i] =
+                    mCameraZslImageListener.getImage(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
+            TotalCaptureResult zslResult =
+                    mZslResultListener.getCaptureResult(
+                            WAIT_FOR_RESULT_TIMEOUT_MS, inputImages[i].getTimestamp());
+            reprocessReqs[i] = mCamera.createReprocessCaptureRequest(zslResult);
+            reprocessReqs[i].addTarget(mJpegReader.getSurface());
+            mWriter.queueInputImage(inputImages[i]);
+        }
+
+        double[] maxCaptureGapsMs = new double[NUM_REPROCESS_TESTED];
+        double[] averageFrameDurationMs = new double[NUM_REPROCESS_TESTED];
+        Arrays.fill(averageFrameDurationMs, 0.0);
+        final int MAX_REPROCESS_RETURN_FRAME_COUNT = 20;
+        SimpleCaptureCallback reprocessResultListener = new SimpleCaptureCallback();
+        for (int i = 0; i < NUM_REPROCESS_TESTED; i++) {
+            mZslResultListener.drain();
+            CaptureRequest reprocessRequest = reprocessReqs[i].build();
+            mSession.capture(reprocessRequest, reprocessResultListener, mHandler);
+            // Wait for reprocess output jpeg and result come back.
+            reprocessResultListener.getCaptureResultForRequest(reprocessRequest,
+                    CameraTestUtils.CAPTURE_RESULT_TIMEOUT_MS);
+            mJpegListener.getImage(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
+            long numFramesMaybeStalled = mZslResultListener.getTotalNumFrames();
+            assertTrue("Reprocess capture result should be returned in "
+                    + MAX_REPROCESS_RETURN_FRAME_COUNT + " frames",
+                    numFramesMaybeStalled <= MAX_REPROCESS_RETURN_FRAME_COUNT);
+
+            // Need look longer time, as the stutter could happen after the reprocessing
+            // output frame is received.
+            long[] timestampGap = new long[MAX_REPROCESS_RETURN_FRAME_COUNT + 1];
+            Arrays.fill(timestampGap, 0);
+            CaptureResult[] results = new CaptureResult[timestampGap.length];
+            long[] frameDurationsNs = new long[timestampGap.length];
+            for (int j = 0; j < results.length; j++) {
+                results[j] = mZslResultListener.getCaptureResult(
+                        CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
+                if (j > 0) {
+                    timestampGap[j] = results[j].get(CaptureResult.SENSOR_TIMESTAMP) -
+                            results[j - 1].get(CaptureResult.SENSOR_TIMESTAMP);
+                    assertTrue("Time stamp should be monotonically increasing",
+                            timestampGap[j] > 0);
+                }
+                frameDurationsNs[j] = results[j].get(CaptureResult.SENSOR_FRAME_DURATION);
+            }
+
+            if (VERBOSE) {
+                Log.i(TAG, "timestampGap: " + Arrays.toString(timestampGap));
+                Log.i(TAG, "frameDurationsNs: " + Arrays.toString(frameDurationsNs));
+            }
+
+            // Get the number of candidate results, calculate the average frame duration
+            // and max timestamp gap.
+            Arrays.sort(timestampGap);
+            double maxTimestampGapMs = timestampGap[timestampGap.length - 1] / 1000000.0;
+            for (int m = 0; m < frameDurationsNs.length; m++) {
+                averageFrameDurationMs[i] += (frameDurationsNs[m] / 1000000.0);
+            }
+            averageFrameDurationMs[i] /= frameDurationsNs.length;
+
+            maxCaptureGapsMs[i] = maxTimestampGapMs;
+        }
+
+        String reprocessType = " YUV reprocessing ";
+        if (reprocessInputFormat == ImageFormat.PRIVATE) {
+            reprocessType = " opaque reprocessing ";
+        }
+
+        mReportLog.printArray("Camera " + mCamera.getId()
+                + ":" + reprocessType + " max capture timestamp gaps", maxCaptureGapsMs,
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        mReportLog.printArray("Camera " + mCamera.getId()
+                + ":" + reprocessType + "capture average frame duration", averageFrameDurationMs,
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        mReportLog.printSummary("Camera reprocessing average max capture timestamp gaps for Camera "
+                + mCamera.getId(), Stat.getAverage(maxCaptureGapsMs), ResultType.LOWER_BETTER,
+                ResultUnit.MS);
+
+        // The max timestamp gap should be less than (captureStall + 1) x average frame
+        // duration * (1 + error margin).
+        int maxCaptureStallFrames = mStaticInfo.getMaxCaptureStallOrDefault();
+        for (int i = 0; i < maxCaptureGapsMs.length; i++) {
+            double stallDurationBound = averageFrameDurationMs[i] *
+                    (maxCaptureStallFrames + 1) * (1 + REPROCESS_STALL_MARGIN);
+            assertTrue("max capture stall duration should be no larger than " + stallDurationBound,
+                    maxCaptureGapsMs[i] <= stallDurationBound);
+        }
+    }
+
+    private void reprocessingPerformanceTestByCamera(int reprocessInputFormat, boolean asyncMode)
+            throws Exception {
+        // Prepare the reprocessing capture
+        prepareReprocessCapture(reprocessInputFormat);
+
+        // Start ZSL streaming
+        startZslStreaming();
+        waitForFrames(NUM_RESULTS_WAIT);
+
+        CaptureRequest.Builder[] reprocessReqs = new CaptureRequest.Builder[MAX_REPROCESS_IMAGES];
+        Image[] inputImages = new Image[MAX_REPROCESS_IMAGES];
+        double[] getImageLatenciesMs = new double[MAX_REPROCESS_IMAGES];
+        long startTimeMs;
+        for (int i = 0; i < MAX_REPROCESS_IMAGES; i++) {
+            inputImages[i] =
+                    mCameraZslImageListener.getImage(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
+            TotalCaptureResult zslResult =
+                    mZslResultListener.getCaptureResult(
+                            WAIT_FOR_RESULT_TIMEOUT_MS, inputImages[i].getTimestamp());
+            reprocessReqs[i] = mCamera.createReprocessCaptureRequest(zslResult);
+            reprocessReqs[i].addTarget(mJpegReader.getSurface());
+        }
+
+        if (asyncMode) {
+            // async capture: issue all the reprocess requests as quick as possible, then
+            // check the throughput of the output jpegs.
+            for (int i = 0; i < MAX_REPROCESS_IMAGES; i++) {
+                // Could be slow for YUV reprocessing, do it in advance.
+                mWriter.queueInputImage(inputImages[i]);
+            }
+
+            // Submit the requests
+            for (int i = 0; i < MAX_REPROCESS_IMAGES; i++) {
+                mSession.capture(reprocessReqs[i].build(), null, null);
+            }
+
+            // Get images
+            startTimeMs = SystemClock.elapsedRealtime();
+            for (int i = 0; i < MAX_REPROCESS_IMAGES; i++) {
+                mJpegListener.getImage(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
+                getImageLatenciesMs[i] = SystemClock.elapsedRealtime() - startTimeMs;
+                startTimeMs = SystemClock.elapsedRealtime();
+            }
+        } else {
+            // sync capture: issue reprocess request one by one, only submit next one when
+            // the previous capture image is returned. This is to test the back to back capture
+            // performance.
+            for (int i = 0; i < MAX_REPROCESS_IMAGES; i++) {
+                startTimeMs = SystemClock.elapsedRealtime();
+                mWriter.queueInputImage(inputImages[i]);
+                mSession.capture(reprocessReqs[i].build(), null, null);
+                mJpegListener.getImage(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
+                getImageLatenciesMs[i] = SystemClock.elapsedRealtime() - startTimeMs;
+            }
+        }
+
+        String reprocessType = " YUV reprocessing ";
+        if (reprocessInputFormat == ImageFormat.PRIVATE) {
+            reprocessType = " opaque reprocessing ";
+        }
+
+        // Report the performance data
+        if (asyncMode) {
+            mReportLog.printArray("Camera " + mCamera.getId()
+                    + ":" + reprocessType + "capture latency", getImageLatenciesMs,
+                    ResultType.LOWER_BETTER, ResultUnit.MS);
+            mReportLog.printSummary("Camera reprocessing average latency for Camera " +
+                    mCamera.getId(), Stat.getAverage(getImageLatenciesMs), ResultType.LOWER_BETTER,
+                    ResultUnit.MS);
+        } else {
+            mReportLog.printArray("Camera " + mCamera.getId()
+                    + ":" + reprocessType + "shot to shot latency", getImageLatenciesMs,
+                    ResultType.LOWER_BETTER, ResultUnit.MS);
+            mReportLog.printSummary("Camera reprocessing shot to shot average latency for Camera " +
+                    mCamera.getId(), Stat.getAverage(getImageLatenciesMs), ResultType.LOWER_BETTER,
+                    ResultUnit.MS);
+        }
+    }
+
+    /**
+     * Start preview and ZSL streaming
+     */
+    private void startZslStreaming() throws Exception {
+        CaptureRequest.Builder zslBuilder =
+                mCamera.createCaptureRequest(CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG);
+        zslBuilder.addTarget(mPreviewSurface);
+        zslBuilder.addTarget(mCameraZslReader.getSurface());
+        mSession.setRepeatingRequest(zslBuilder.build(), mZslResultListener, mHandler);
+    }
+
+    /**
+     * Wait for a certain number of frames, the images and results will be drained from the
+     * listeners to make sure that next reprocessing can get matched results and images.
+     *
+     * @param numFrameWait The number of frames to wait before return, 0 means that
+     *      this call returns immediately after streaming on.
+     */
+    private void waitForFrames(int numFrameWait) {
+        if (numFrameWait < 0) {
+            throw new IllegalArgumentException("numFrameWait " + numFrameWait +
+                    " should be non-negative");
+        }
+
+        if (numFrameWait == 0) {
+            // Let is stream out for a while
+            waitForNumResults(mZslResultListener, numFrameWait);
+            // Drain the pending images, to ensure that all future images have an associated
+            // capture result available.
+            mCameraZslImageListener.drain();
+        }
+    }
+
+    private void closeReaderWriters() {
+        CameraTestUtils.closeImageReader(mCameraZslReader);
+        mCameraZslReader = null;
+        CameraTestUtils.closeImageReader(mJpegReader);
+        mJpegReader = null;
+        CameraTestUtils.closeImageWriter(mWriter);
+        mWriter = null;
+    }
+
+    private void prepareReprocessCapture(int inputFormat)
+                    throws CameraAccessException {
+        // 1. Find the right preview and capture sizes.
+        Size maxPreviewSize = mOrderedPreviewSizes.get(0);
+        Size[] supportedInputSizes =
+                mStaticInfo.getAvailableSizesForFormatChecked(inputFormat,
+                StaticMetadata.StreamDirection.Input);
+        Size maxInputSize = CameraTestUtils.getMaxSize(supportedInputSizes);
+        Size maxJpegSize = mOrderedStillSizes.get(0);
+        updatePreviewSurface(maxPreviewSize);
+        mZslResultListener = new SimpleCaptureCallback();
+
+        // 2. Create camera output ImageReaders.
+        // YUV/Opaque output, camera should support output with input size/format
+        mCameraZslImageListener = new SimpleImageReaderListener(
+                /*asyncMode*/true, MAX_ZSL_IMAGES / 2);
+        mCameraZslReader = CameraTestUtils.makeImageReader(
+                maxInputSize, inputFormat, MAX_ZSL_IMAGES, mCameraZslImageListener, mHandler);
+        // Jpeg reprocess output
+        mJpegListener = new SimpleImageReaderListener();
+        mJpegReader = CameraTestUtils.makeImageReader(
+                maxJpegSize, ImageFormat.JPEG, MAX_JPEG_IMAGES, mJpegListener, mHandler);
+
+        // create camera reprocess session
+        List<Surface> outSurfaces = new ArrayList<Surface>();
+        outSurfaces.add(mPreviewSurface);
+        outSurfaces.add(mCameraZslReader.getSurface());
+        outSurfaces.add(mJpegReader.getSurface());
+        InputConfiguration inputConfig = new InputConfiguration(maxInputSize.getWidth(),
+                maxInputSize.getHeight(), inputFormat);
+        mSessionListener = new BlockingSessionCallback();
+        mSession = CameraTestUtils.configureReprocessableCameraSession(
+                mCamera, inputConfig, outSurfaces, mSessionListener, mHandler);
+
+        // 3. Create ImageWriter for input
+        mWriter = CameraTestUtils.makeImageWriter(
+                mSession.getInputSurface(), MAX_INPUT_IMAGES, /*listener*/null, /*handler*/null);
+
     }
 
     private void blockingStopPreview() throws Exception {
@@ -289,25 +676,14 @@
 
         CaptureRequest.Builder previewBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-        previewBuilder.addTarget(mPreviewSurface);
+        if (mStaticInfo.isColorOutputSupported()) {
+            previewBuilder.addTarget(mPreviewSurface);
+        }
         previewBuilder.addTarget(mReaderSurface);
         mSession.setRepeatingRequest(previewBuilder.build(), listener, mHandler);
         imageListener.waitForImageAvailable(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
     }
 
-    private void blockingCaptureImage(CaptureCallback listener,
-            SimpleImageListener imageListener) throws Exception {
-        if (mReaderSurface == null) {
-            throw new IllegalStateException("reader surface must be initialized first");
-        }
-
-        CaptureRequest.Builder captureBuilder =
-                mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
-        captureBuilder.addTarget(mReaderSurface);
-        mSession.capture(captureBuilder.build(), listener, mHandler);
-        imageListener.waitForImageAvailable(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
-    }
-
     /**
      * Configure reader and preview outputs and wait until done.
      */
@@ -317,7 +693,9 @@
         }
         mSessionListener = new BlockingSessionCallback();
         List<Surface> outputSurfaces = new ArrayList<>();
-        outputSurfaces.add(mPreviewSurface);
+        if (mStaticInfo.isColorOutputSupported()) {
+            outputSurfaces.add(mPreviewSurface);
+        }
         outputSurfaces.add(mReaderSurface);
         mSession = CameraTestUtils.configureCameraSession(mCamera, outputSurfaces,
                 mSessionListener, mHandler);
@@ -329,8 +707,8 @@
      * @param format The format used to create ImageReader instance.
      */
     private void initializeImageReader(String cameraId, int format) throws Exception {
-        mOrderedPreviewSizes = CameraTestUtils.getSupportedPreviewSizes(
-                cameraId, mCameraManager,
+        mOrderedPreviewSizes = CameraTestUtils.getSortedSizesForFormat(
+                cameraId, mCameraManager, format,
                 CameraTestUtils.getPreviewSizeBound(mWindowManager,
                     CameraTestUtils.PREVIEW_SIZE_BOUND));
         Size maxPreviewSize = mOrderedPreviewSizes.get(0);
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
index 20a7834..9f85fd8 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
@@ -17,6 +17,7 @@
 import android.graphics.ImageFormat;
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CameraCaptureSession;
+import android.hardware.camera2.CameraConstrainedHighSpeedCaptureSession;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CaptureRequest;
 import android.hardware.camera2.CaptureResult;
@@ -24,6 +25,7 @@
 import android.util.Size;
 import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
 import android.media.CamcorderProfile;
+import android.media.MediaCodec;
 import android.media.MediaCodecInfo;
 import android.media.MediaCodecInfo.CodecCapabilities;
 import android.media.MediaCodecInfo.CodecProfileLevel;
@@ -46,7 +48,9 @@
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.HashMap;
 
 /**
  * CameraDevice video recording use case tests by using MediaRecorder and
@@ -58,7 +62,7 @@
     private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
     private static final boolean DEBUG_DUMP = Log.isLoggable(TAG, Log.DEBUG);
     private static final int RECORDING_DURATION_MS = 3000;
-    private static final int DURATION_MARGIN_MS = 600;
+    private static final float DURATION_MARGIN = 0.2f;
     private static final double FRAME_DURATION_ERROR_TOLERANCE_MS = 3.0;
     private static final int BIT_RATE_1080P = 16000000;
     private static final int BIT_RATE_MIN = 64000;
@@ -82,6 +86,7 @@
     private static final int MAX_NUM_FRAME_DROP_INTERVAL_ALLOWED = 4;
     private List<Size> mSupportedVideoSizes;
     private Surface mRecordingSurface;
+    private Surface mPersistentSurface;
     private MediaRecorder mMediaRecorder;
     private String mOutMediaFileName;
     private int mVideoFrameRate;
@@ -98,6 +103,28 @@
         super.tearDown();
     }
 
+    private void doBasicRecording() throws Exception {
+        for (int i = 0; i < mCameraIds.length; i++) {
+            try {
+                Log.i(TAG, "Testing basic recording for camera " + mCameraIds[i]);
+                // Re-use the MediaRecorder object for the same camera device.
+                mMediaRecorder = new MediaRecorder();
+                openDevice(mCameraIds[i]);
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + mCameraIds[i] +
+                            " does not support color outputs, skipping");
+                    continue;
+                }
+                initSupportedVideoSize(mCameraIds[i]);
+
+                basicRecordingTestByCamera(mCamcorderProfileList);
+            } finally {
+                closeDevice();
+                releaseRecorder();
+            }
+        }
+    }
+
     /**
      * <p>
      * Test basic camera recording.
@@ -111,20 +138,27 @@
      * </p>
      */
     public void testBasicRecording() throws Exception {
-        for (int i = 0; i < mCameraIds.length; i++) {
-            try {
-                Log.i(TAG, "Testing basic recording for camera " + mCameraIds[i]);
-                // Re-use the MediaRecorder object for the same camera device.
-                mMediaRecorder = new MediaRecorder();
-                openDevice(mCameraIds[i]);
+        doBasicRecording();
+    }
 
-                initSupportedVideoSize(mCameraIds[i]);
+    /**
+     * <p>
+     * Test basic camera recording from a persistent input surface.
+     * </p>
+     * <p>
+     * This test is similar to testBasicRecording except that MediaRecorder records
+     * from a persistent input surface that's used across multiple recording sessions.
+     * </p>
+     */
+    public void testRecordingFromPersistentSurface() throws Exception {
+        mPersistentSurface = MediaCodec.createPersistentInputSurface();
+        assertNotNull("Failed to create persistent input surface!", mPersistentSurface);
 
-                basicRecordingTestByCamera(mCamcorderProfileList);
-            } finally {
-                closeDevice();
-                releaseRecorder();
-            }
+        try {
+            doBasicRecording();
+        } finally {
+            mPersistentSurface.release();
+            mPersistentSurface = null;
         }
     }
 
@@ -145,7 +179,11 @@
                 // Re-use the MediaRecorder object for the same camera device.
                 mMediaRecorder = new MediaRecorder();
                 openDevice(mCameraIds[i]);
-
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + mCameraIds[i] +
+                            " does not support color outputs, skipping");
+                    continue;
+                }
                 initSupportedVideoSize(mCameraIds[i]);
 
                 recordingSizeTestByCamera();
@@ -222,6 +260,10 @@
         slowMotionRecording();
     }
 
+    public void testConstrainedHighSpeedRecording() throws Exception {
+        constrainedHighSpeedRecording();
+    }
+
     /**
      * <p>
      * Test recording framerate accuracy when switching from low FPS to high FPS.
@@ -238,7 +280,11 @@
                 // Re-use the MediaRecorder object for the same camera device.
                 mMediaRecorder = new MediaRecorder();
                 openDevice(mCameraIds[i]);
-
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + mCameraIds[i] +
+                            " does not support color outputs, skipping");
+                    continue;
+                }
                 initSupportedVideoSize(mCameraIds[i]);
 
                 int minFpsProfileId = -1, minFps = 1000;
@@ -290,7 +336,11 @@
                 // Re-use the MediaRecorder object for the same camera device.
                 mMediaRecorder = new MediaRecorder();
                 openDevice(id);
-
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id +
+                            " does not support color outputs, skipping");
+                    continue;
+                }
                 if (!mStaticInfo.isHighSpeedVideoSupported()) {
                     continue;
                 }
@@ -309,18 +359,10 @@
 
                     int captureRate = fpsRange.getLower();
                     int videoFramerate = captureRate / SLOWMO_SLOW_FACTOR;
-                    /**
-                     * Check if encoder support this. TODO: use HIGH_SPEED_720p
-                     * CamCorderProfile to get the performance guarantee. Also
-                     * add the test in StaticMetadataTest to check: 1. Camera
-                     * high speed recording metadata is correctly reported 2.
-                     * Encoder profile/level info is correctly reported. After
-                     * that, we only need check the CamcorderProfile before
-                     * skipping the test.
-                     */
-                    if (!isSupportedByAVCEncoder(size, captureRate)) {
-                        Log.i(TAG, "high speed recording " + size + "@" + captureRate + "fps"
-                                + " is not supported by AVC encoder");
+                    // Skip the test if the highest recording FPS supported by CamcorderProfile
+                    if (fpsRange.getUpper() > getFpsFromHighSpeedProfileForSize(size)) {
+                        Log.w(TAG, "high speed recording " + size + "@" + captureRate + "fps"
+                                + " is not supported by CamcorderProfile");
                         continue;
                     }
 
@@ -338,8 +380,7 @@
                     // Start recording
                     SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
                     startSlowMotionRecording(/*useMediaRecorder*/true, videoFramerate, captureRate,
-                            fpsRange, resultListener);
-                    long startTime = SystemClock.elapsedRealtime();
+                            fpsRange, resultListener, /*useHighSpeedSession*/false);
 
                     // Record certain duration.
                     SystemClock.sleep(RECORDING_DURATION_MS);
@@ -352,7 +393,6 @@
 
                     // Validation.
                     validateRecording(size, durationMs);
-
                 }
 
             } finally {
@@ -362,6 +402,93 @@
         }
     }
 
+    private void constrainedHighSpeedRecording() throws Exception {
+        for (String id : mCameraIds) {
+            try {
+                Log.i(TAG, "Testing constrained high speed recording for camera " + id);
+                // Re-use the MediaRecorder object for the same camera device.
+                mMediaRecorder = new MediaRecorder();
+                openDevice(id);
+
+                if (!mStaticInfo.isConstrainedHighSpeedVideoSupported()) {
+                    continue;
+                }
+
+                StreamConfigurationMap config =
+                        mStaticInfo.getValueFromKeyNonNull(
+                                CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+                Size[] highSpeedVideoSizes = config.getHighSpeedVideoSizes();
+                for (Size size : highSpeedVideoSizes) {
+                    List<Range<Integer>> fixedFpsRanges =
+                            getHighSpeedFixedFpsRangeForSize(config, size);
+                    mCollector.expectTrue("Unable to find the fixed frame rate fps range for " +
+                            "size " + size, fixedFpsRanges.size() > 0);
+                    // Test recording for each FPS range
+                    for (Range<Integer> fpsRange : fixedFpsRanges) {
+                        int captureRate = fpsRange.getLower();
+                        final int VIDEO_FRAME_RATE = 30;
+                        // Skip the test if the highest recording FPS supported by CamcorderProfile
+                        if (fpsRange.getUpper() > getFpsFromHighSpeedProfileForSize(size)) {
+                            Log.w(TAG, "high speed recording " + size + "@" + captureRate + "fps"
+                                    + " is not supported by CamcorderProfile");
+                            continue;
+                        }
+
+                        mOutMediaFileName = VIDEO_FILE_PATH + "/test_cslowMo_video_" + captureRate +
+                                "fps_" + id + "_" + size.toString() + ".mp4";
+
+                        prepareRecording(size, VIDEO_FRAME_RATE, captureRate);
+
+                        // prepare preview surface by using video size.
+                        updatePreviewSurfaceWithVideoSize(size);
+
+                        // Start recording
+                        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
+                        startSlowMotionRecording(/*useMediaRecorder*/true, VIDEO_FRAME_RATE,
+                                captureRate, fpsRange, resultListener,
+                                /*useHighSpeedSession*/true);
+
+                        // Record certain duration.
+                        SystemClock.sleep(RECORDING_DURATION_MS);
+
+                        // Stop recording and preview
+                        stopRecording(/*useMediaRecorder*/true);
+                        // Convert number of frames camera produced into the duration in unit of ms.
+                        int durationMs = (int) (resultListener.getTotalNumFrames() * 1000.0f /
+                                        VIDEO_FRAME_RATE);
+
+                        // Validation.
+                        validateRecording(size, durationMs);
+                    }
+                }
+
+            } finally {
+                closeDevice();
+                releaseRecorder();
+            }
+        }
+    }
+
+    /**
+     * Get high speed FPS from CamcorderProfiles for a given size.
+     *
+     * @param size The size used to search the CamcorderProfiles for the FPS.
+     * @return high speed video FPS, 0 if the given size is not supported by the CamcorderProfiles.
+     */
+    private int getFpsFromHighSpeedProfileForSize(Size size) {
+        for (int quality = CamcorderProfile.QUALITY_HIGH_SPEED_480P;
+                quality <= CamcorderProfile.QUALITY_HIGH_SPEED_2160P; quality++) {
+            if (CamcorderProfile.hasProfile(quality)) {
+                CamcorderProfile profile = CamcorderProfile.get(quality);
+                if (size.equals(new Size(profile.videoFrameWidth, profile.videoFrameHeight))){
+                    return profile.videoFrameRate;
+                }
+            }
+        }
+
+        return 0;
+    }
+
     private Range<Integer> getHighestHighSpeedFixedFpsRangeForSize(StreamConfigurationMap config,
             Size size) {
         Range<Integer>[] availableFpsRanges = config.getHighSpeedVideoFpsRangesFor(size);
@@ -380,9 +507,21 @@
         return maxRange;
     }
 
+    private List<Range<Integer>> getHighSpeedFixedFpsRangeForSize(StreamConfigurationMap config,
+            Size size) {
+        Range<Integer>[] availableFpsRanges = config.getHighSpeedVideoFpsRangesFor(size);
+        List<Range<Integer>> fixedRanges = new ArrayList<Range<Integer>>();
+        for (Range<Integer> range : availableFpsRanges) {
+            if (range.getLower().equals(range.getUpper())) {
+                fixedRanges.add(range);
+            }
+        }
+        return fixedRanges;
+    }
+
     private void startSlowMotionRecording(boolean useMediaRecorder, int videoFrameRate,
             int captureRate, Range<Integer> fpsRange,
-            CameraCaptureSession.CaptureCallback listener) throws Exception {
+            CameraCaptureSession.CaptureCallback listener, boolean useHighSpeedSession) throws Exception {
         List<Surface> outputSurfaces = new ArrayList<Surface>(2);
         assertTrue("Both preview and recording surfaces should be valid",
                 mPreviewSurface.isValid() && mRecordingSurface.isValid());
@@ -393,36 +532,50 @@
             outputSurfaces.add(mReaderSurface);
         }
         mSessionListener = new BlockingSessionCallback();
-        mSession = configureCameraSession(mCamera, outputSurfaces, mSessionListener, mHandler);
+        mSession = configureCameraSession(mCamera, outputSurfaces, useHighSpeedSession,
+                mSessionListener, mHandler);
 
-        CaptureRequest.Builder recordingRequestBuilder =
-                mCamera.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
-        recordingRequestBuilder.set(CaptureRequest.CONTROL_MODE,
-                CaptureRequest.CONTROL_MODE_USE_SCENE_MODE);
-        recordingRequestBuilder.set(CaptureRequest.CONTROL_SCENE_MODE,
-                CaptureRequest.CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO);
+        // Create slow motion request list
+        List<CaptureRequest> slowMoRequests = null;
+        if (useHighSpeedSession) {
+            CaptureRequest.Builder requestBuilder =
+                    mCamera.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
+            requestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fpsRange);
+            requestBuilder.addTarget(mPreviewSurface);
+            requestBuilder.addTarget(mRecordingSurface);
+            slowMoRequests = ((CameraConstrainedHighSpeedCaptureSession) mSession).
+                    createHighSpeedRequestList(requestBuilder.build());
+        } else {
+            CaptureRequest.Builder recordingRequestBuilder =
+                    mCamera.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
+            recordingRequestBuilder.set(CaptureRequest.CONTROL_MODE,
+                    CaptureRequest.CONTROL_MODE_USE_SCENE_MODE);
+            recordingRequestBuilder.set(CaptureRequest.CONTROL_SCENE_MODE,
+                    CaptureRequest.CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO);
 
-        CaptureRequest.Builder recordingOnlyBuilder =
-                mCamera.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
-        recordingOnlyBuilder.set(CaptureRequest.CONTROL_MODE,
-                CaptureRequest.CONTROL_MODE_USE_SCENE_MODE);
-        recordingOnlyBuilder.set(CaptureRequest.CONTROL_SCENE_MODE,
-                CaptureRequest.CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO);
-        int slowMotionFactor = captureRate / videoFrameRate;
+            CaptureRequest.Builder recordingOnlyBuilder =
+                    mCamera.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
+            recordingOnlyBuilder.set(CaptureRequest.CONTROL_MODE,
+                    CaptureRequest.CONTROL_MODE_USE_SCENE_MODE);
+            recordingOnlyBuilder.set(CaptureRequest.CONTROL_SCENE_MODE,
+                    CaptureRequest.CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO);
+            int slowMotionFactor = captureRate / videoFrameRate;
 
-        // Make sure camera output frame rate is set to correct value.
-        recordingRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fpsRange);
-        recordingRequestBuilder.addTarget(mRecordingSurface);
-        recordingRequestBuilder.addTarget(mPreviewSurface);
-        recordingOnlyBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fpsRange);
-        recordingOnlyBuilder.addTarget(mRecordingSurface);
+            // Make sure camera output frame rate is set to correct value.
+            recordingRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fpsRange);
+            recordingRequestBuilder.addTarget(mRecordingSurface);
+            recordingRequestBuilder.addTarget(mPreviewSurface);
+            recordingOnlyBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fpsRange);
+            recordingOnlyBuilder.addTarget(mRecordingSurface);
 
-        List<CaptureRequest> slowMoRequests = new ArrayList<CaptureRequest>();
-        slowMoRequests.add(recordingRequestBuilder.build());// Preview + recording.
+            slowMoRequests = new ArrayList<CaptureRequest>();
+            slowMoRequests.add(recordingRequestBuilder.build());// Preview + recording.
 
-        for (int i = 0; i < slowMotionFactor - 1; i++) {
-            slowMoRequests.add(recordingOnlyBuilder.build()); // Recording only.
+            for (int i = 0; i < slowMotionFactor - 1; i++) {
+                slowMoRequests.add(recordingOnlyBuilder.build()); // Recording only.
+            }
         }
+
         mSession.setRepeatingBurst(slowMoRequests, listener, mHandler);
 
         if (useMediaRecorder) {
@@ -439,8 +592,10 @@
      */
     private void basicRecordingTestByCamera(int[] camcorderProfileList) throws Exception {
         Size maxPreviewSize = mOrderedPreviewSizes.get(0);
+        List<Range<Integer> > fpsRanges = Arrays.asList(
+                mStaticInfo.getAeAvailableTargetFpsRangesChecked());
+        int cameraId = Integer.valueOf(mCamera.getId());
         for (int profileId : camcorderProfileList) {
-            int cameraId = Integer.valueOf(mCamera.getId());
             if (!CamcorderProfile.hasProfile(cameraId, profileId) ||
                     allowedUnsupported(cameraId, profileId)) {
                 continue;
@@ -448,6 +603,7 @@
 
             CamcorderProfile profile = CamcorderProfile.get(cameraId, profileId);
             Size videoSz = new Size(profile.videoFrameWidth, profile.videoFrameHeight);
+            Range<Integer> fpsRange = new Range(profile.videoFrameRate, profile.videoFrameRate);
             if (mStaticInfo.isHardwareLevelLegacy() &&
                     (videoSz.getWidth() > maxPreviewSize.getWidth() ||
                      videoSz.getHeight() > maxPreviewSize.getHeight())) {
@@ -457,6 +613,9 @@
             assertTrue("Video size " + videoSz.toString() + " for profile ID " + profileId +
                             " must be one of the camera device supported video size!",
                             mSupportedVideoSizes.contains(videoSz));
+            assertTrue("Frame rate range " + fpsRange + " (for profile ID " + profileId +
+                    ") must be one of the camera device available FPS range!",
+                    fpsRanges.contains(fpsRange));
 
             if (VERBOSE) {
                 Log.v(TAG, "Testing camera recording with video size " + videoSz.toString());
@@ -566,6 +725,12 @@
 
                     openDevice(id);
 
+                    if (!mStaticInfo.isColorOutputSupported()) {
+                        Log.i(TAG, "Camera " + id +
+                                " does not support color outputs, skipping");
+                        continue;
+                    }
+
                     initSupportedVideoSize(id);
 
                     videoSnapshotTestByCamera(burstTest);
@@ -645,28 +810,67 @@
             // For LEGACY, find closest supported smaller or equal JPEG size to the current video
             // size; if no size is smaller than the video, pick the smallest JPEG size.  The assert
             // for video size above guarantees that for LIMITED or FULL, we select videoSz here.
+            // Also check for minFrameDuration here to make sure jpeg stream won't slow down
+            // video capture
             Size videoSnapshotSz = mOrderedStillSizes.get(mOrderedStillSizes.size() - 1);
+            // Allow a bit tolerance so we don't fail for a few nano seconds of difference
+            final float FRAME_DURATION_TOLERANCE = 0.01f;
+            long videoFrameDuration = (long) (1e9 / profile.videoFrameRate *
+                    (1.0 + FRAME_DURATION_TOLERANCE));
+            HashMap<Size, Long> minFrameDurationMap = mStaticInfo.
+                    getAvailableMinFrameDurationsForFormatChecked(ImageFormat.JPEG);
             for (int i = mOrderedStillSizes.size() - 2; i >= 0; i--) {
                 Size candidateSize = mOrderedStillSizes.get(i);
-                if (candidateSize.getWidth() <= videoSz.getWidth() &&
-                        candidateSize.getHeight() <= videoSz.getHeight()) {
-                    videoSnapshotSz = candidateSize;
+                if (mStaticInfo.isHardwareLevelLegacy()) {
+                    // Legacy level doesn't report min frame duration
+                    if (candidateSize.getWidth() <= videoSz.getWidth() &&
+                            candidateSize.getHeight() <= videoSz.getHeight()) {
+                        videoSnapshotSz = candidateSize;
+                    }
+                } else {
+                    Long jpegFrameDuration = minFrameDurationMap.get(candidateSize);
+                    assertTrue("Cannot find minimum frame duration for jpeg size " + candidateSize,
+                            jpegFrameDuration != null);
+                    if (candidateSize.getWidth() <= videoSz.getWidth() &&
+                            candidateSize.getHeight() <= videoSz.getHeight() &&
+                            jpegFrameDuration <= videoFrameDuration) {
+                        videoSnapshotSz = candidateSize;
+                    }
                 }
             }
-            if (videoSnapshotSz.getWidth() * videoSnapshotSz.getHeight() > FRAME_SIZE_15M)
-                kFrameDrop_Tolerence = (int)(FRAMEDROP_TOLERANCE * FRAME_DROP_TOLERENCE_FACTOR);
 
             /**
              * Only test full res snapshot when below conditions are all true.
              * 1. Camera is a FULL device
              * 2. video size is up to max preview size, which will be bounded by 1080p.
+             * 3. Full resolution jpeg stream can keep up to video stream speed.
+             *    When full res jpeg stream cannot keep up to video stream speed, search
+             *    the largest jpeg size that can susptain video speed instead.
              */
             if (mStaticInfo.isHardwareLevelFull() &&
                     videoSz.getWidth() <= maxPreviewSize.getWidth() &&
                     videoSz.getHeight() <= maxPreviewSize.getHeight()) {
-                videoSnapshotSz = mOrderedStillSizes.get(0);
+                for (Size jpegSize : mOrderedStillSizes) {
+                    Long jpegFrameDuration = minFrameDurationMap.get(jpegSize);
+                    assertTrue("Cannot find minimum frame duration for jpeg size " + jpegSize,
+                            jpegFrameDuration != null);
+                    if (jpegFrameDuration <= videoFrameDuration) {
+                        videoSnapshotSz = jpegSize;
+                        break;
+                    }
+                    if (jpegSize.equals(videoSz)) {
+                        throw new AssertionFailedError(
+                                "Cannot find adequate video snapshot size for video size" +
+                                        videoSz);
+                    }
+                }
             }
 
+            Log.i(TAG, "Testing video snapshot size " + videoSnapshotSz +
+                    " for video size " + videoSz);
+            if (videoSnapshotSz.getWidth() * videoSnapshotSz.getHeight() > FRAME_SIZE_15M)
+                kFrameDrop_Tolerence = (int)(FRAMEDROP_TOLERANCE * FRAME_DROP_TOLERENCE_FACTOR);
+
             createImageReader(
                     videoSnapshotSz, ImageFormat.JPEG,
                     MAX_VIDEO_SNAPSHOT_IMAGES, /*listener*/null);
@@ -825,8 +1029,14 @@
         mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
         mMediaRecorder.setProfile(profile);
         mMediaRecorder.setOutputFile(mOutMediaFileName);
+        if (mPersistentSurface != null) {
+            mMediaRecorder.setInputSurface(mPersistentSurface);
+            mRecordingSurface = mPersistentSurface;
+        }
         mMediaRecorder.prepare();
-        mRecordingSurface = mMediaRecorder.getSurface();
+        if (mPersistentSurface == null) {
+            mRecordingSurface = mMediaRecorder.getSurface();
+        }
         assertNotNull("Recording surface must be non-null!", mRecordingSurface);
         mVideoFrameRate = profile.videoFrameRate;
         mVideoSize = new Size(profile.videoFrameWidth, profile.videoFrameHeight);
@@ -850,8 +1060,14 @@
         mMediaRecorder.setVideoSize(sz.getWidth(), sz.getHeight());
         mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
         mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
+        if (mPersistentSurface != null) {
+            mMediaRecorder.setInputSurface(mPersistentSurface);
+            mRecordingSurface = mPersistentSurface;
+        }
         mMediaRecorder.prepare();
-        mRecordingSurface = mMediaRecorder.getSurface();
+        if (mPersistentSurface == null) {
+            mRecordingSurface = mMediaRecorder.getSurface();
+        }
         assertNotNull("Recording surface must be non-null!", mRecordingSurface);
         mVideoFrameRate = videoFrameRate;
         mVideoSize = sz;
@@ -914,7 +1130,7 @@
         } else {
             // TODO: need implement MediaCodec path.
         }
-        if (mRecordingSurface != null) {
+        if (mPersistentSurface == null && mRecordingSurface != null) {
             mRecordingSurface.release();
             mRecordingSurface = null;
         }
@@ -928,7 +1144,7 @@
         }
     }
 
-    private void validateRecording(Size sz, int durationMs) throws Exception {
+    private void validateRecording(Size sz, int expectedDurationMs) throws Exception {
         File outFile = new File(mOutMediaFileName);
         assertTrue("No video is recorded", outFile.exists());
 
@@ -956,15 +1172,16 @@
             int duration = (int) (durationUs / 1000);
             if (VERBOSE) {
                 Log.v(TAG, String.format("Video duration: recorded %dms, expected %dms",
-                                         duration, durationMs));
+                                         duration, expectedDurationMs));
             }
 
             // TODO: Don't skip this for video snapshot
             if (!mStaticInfo.isHardwareLevelLegacy()) {
                 assertTrue(String.format(
                         "Camera %s: Video duration doesn't match: recorded %dms, expected %dms.",
-                        mCamera.getId(), duration, durationMs),
-                        Math.abs(duration - durationMs) < DURATION_MARGIN_MS);
+                        mCamera.getId(), duration, expectedDurationMs),
+                        Math.abs(duration - expectedDurationMs) <
+                        DURATION_MARGIN * expectedDurationMs);
             }
         } finally {
             extractor.release();
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/ReprocessCaptureTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/ReprocessCaptureTest.java
new file mode 100644
index 0000000..8a60dc2
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/ReprocessCaptureTest.java
@@ -0,0 +1,1388 @@
+/*
+ * Copyright 2015 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.hardware.camera2.cts;
+
+import static android.hardware.camera2.cts.CameraTestUtils.*;
+
+import android.graphics.ImageFormat;
+import android.media.Image;
+import android.media.ImageReader;
+import android.media.ImageWriter;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CaptureFailure;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.TotalCaptureResult;
+import android.hardware.camera2.cts.helpers.StaticMetadata;
+import android.hardware.camera2.cts.helpers.StaticMetadata.CheckLevel;
+import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
+import android.hardware.camera2.params.InputConfiguration;
+import android.util.Log;
+import android.util.Size;
+import android.view.Surface;
+import android.view.SurfaceHolder;
+
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
+
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>Tests for Reprocess API.</p>
+ */
+public class ReprocessCaptureTest extends Camera2SurfaceViewTestCase  {
+    private static final String TAG = "ReprocessCaptureTest";
+    private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+    private static final int CAPTURE_TIMEOUT_FRAMES = 100;
+    private static final int CAPTURE_TIMEOUT_MS = 3000;
+    private static final int WAIT_FOR_SURFACE_CHANGE_TIMEOUT_MS = 1000;
+    private static final int CAPTURE_TEMPLATE = CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG;
+    private static final int ZSL_TEMPLATE = CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG;
+    private static final int NUM_REPROCESS_TEST_LOOP = 3;
+    private static final int NUM_REPROCESS_CAPTURES = 3;
+    private static final int NUM_REPROCESS_BURST = 3;
+    private int mDumpFrameCount = 0;
+
+    // The image reader for the first regular capture
+    private ImageReader mFirstImageReader;
+    // The image reader for the reprocess capture
+    private ImageReader mSecondImageReader;
+    // A flag indicating whether the regular capture and the reprocess capture share the same image
+    // reader. If it's true, mFirstImageReader should be used for regular and reprocess outputs.
+    private boolean mShareOneImageReader;
+    private SimpleImageReaderListener mFirstImageReaderListener;
+    private SimpleImageReaderListener mSecondImageReaderListener;
+    private Surface mInputSurface;
+    private ImageWriter mImageWriter;
+    private SimpleImageWriterListener mImageWriterListener;
+
+    private enum CaptureTestCase {
+        SINGLE_SHOT,
+        BURST,
+        MIXED_BURST,
+        ABORT_CAPTURE,
+        TIMESTAMPS,
+        JPEG_EXIF,
+        REQUEST_KEYS,
+    }
+
+    /**
+     * Test YUV_420_888 -> YUV_420_888 with maximal supported sizes
+     */
+    public void testBasicYuvToYuvReprocessing() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id)) {
+                continue;
+            }
+
+            // YUV_420_888 -> YUV_420_888 must be supported.
+            testBasicReprocessing(id, ImageFormat.YUV_420_888, ImageFormat.YUV_420_888);
+        }
+    }
+
+    /**
+     * Test YUV_420_888 -> JPEG with maximal supported sizes
+     */
+    public void testBasicYuvToJpegReprocessing() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id)) {
+                continue;
+            }
+
+            // YUV_420_888 -> JPEG must be supported.
+            testBasicReprocessing(id, ImageFormat.YUV_420_888, ImageFormat.JPEG);
+        }
+    }
+
+    /**
+     * Test OPAQUE -> YUV_420_888 with maximal supported sizes
+     */
+    public void testBasicOpaqueToYuvReprocessing() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            // Opaque -> YUV_420_888 must be supported.
+            testBasicReprocessing(id, ImageFormat.PRIVATE, ImageFormat.YUV_420_888);
+        }
+    }
+
+    /**
+     * Test OPAQUE -> JPEG with maximal supported sizes
+     */
+    public void testBasicOpaqueToJpegReprocessing() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            // OPAQUE -> JPEG must be supported.
+            testBasicReprocessing(id, ImageFormat.PRIVATE, ImageFormat.JPEG);
+        }
+    }
+
+    /**
+     * Test all supported size and format combinations.
+     */
+    public void testReprocessingSizeFormat() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id) && !isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            try {
+                // open Camera device
+                openDevice(id);
+                // no preview
+                testReprocessingAllCombinations(id, /*previewSize*/null,
+                        CaptureTestCase.SINGLE_SHOT);
+            } finally {
+                closeDevice();
+            }
+        }
+    }
+
+    /**
+     * Test all supported size and format combinations with preview.
+     */
+    public void testReprocessingSizeFormatWithPreview() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id) && !isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            try {
+                // open Camera device
+                openDevice(id);
+                testReprocessingAllCombinations(id, mOrderedPreviewSizes.get(0),
+                        CaptureTestCase.SINGLE_SHOT);
+            } finally {
+                closeDevice();
+            }
+        }
+    }
+
+    /**
+     * Test recreating reprocessing sessions.
+     */
+    public void testRecreateReprocessingSessions() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id) && !isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            try {
+                openDevice(id);
+
+                // Test supported input/output formats with the largest sizes.
+                int[] inputFormats =
+                        mStaticInfo.getAvailableFormats(StaticMetadata.StreamDirection.Input);
+                for (int inputFormat : inputFormats) {
+                    int[] reprocessOutputFormats =
+                            mStaticInfo.getValidOutputFormatsForInput(inputFormat);
+                    for (int reprocessOutputFormat : reprocessOutputFormats) {
+                        Size maxInputSize =
+                                getMaxSize(inputFormat, StaticMetadata.StreamDirection.Input);
+                        Size maxReprocessOutputSize = getMaxSize(reprocessOutputFormat,
+                                StaticMetadata.StreamDirection.Output);
+
+                        for (int i = 0; i < NUM_REPROCESS_TEST_LOOP; i++) {
+                            testReprocess(id, maxInputSize, inputFormat, maxReprocessOutputSize,
+                                    reprocessOutputFormat,
+                                    /* previewSize */null, NUM_REPROCESS_CAPTURES);
+                        }
+                    }
+                }
+            } finally {
+                closeDevice();
+            }
+        }
+    }
+
+    /**
+     * Verify issuing cross session capture requests is invalid.
+     */
+    public void testCrossSessionCaptureException() throws Exception {
+        for (String id : mCameraIds) {
+            // Test one supported input format -> JPEG
+            int inputFormat;
+            int reprocessOutputFormat = ImageFormat.JPEG;
+
+            if (isOpaqueReprocessSupported(id)) {
+                inputFormat = ImageFormat.PRIVATE;
+            } else if (isYuvReprocessSupported(id)) {
+                inputFormat = ImageFormat.YUV_420_888;
+            } else {
+                continue;
+            }
+
+            openDevice(id);
+
+            // Test the largest sizes
+            Size inputSize =
+                    getMaxSize(inputFormat, StaticMetadata.StreamDirection.Input);
+            Size reprocessOutputSize =
+                    getMaxSize(reprocessOutputFormat, StaticMetadata.StreamDirection.Output);
+
+            try {
+                if (VERBOSE) {
+                    Log.v(TAG, "testCrossSessionCaptureException: cameraId: " + id +
+                            " inputSize: " + inputSize + " inputFormat: " + inputFormat +
+                            " reprocessOutputSize: " + reprocessOutputSize +
+                            " reprocessOutputFormat: " + reprocessOutputFormat);
+                }
+
+                setupImageReaders(inputSize, inputFormat, reprocessOutputSize,
+                        reprocessOutputFormat, /*maxImages*/1);
+                setupReprocessableSession(/*previewSurface*/null, /*numImageWriterImages*/1);
+
+                TotalCaptureResult result = submitCaptureRequest(mFirstImageReader.getSurface(),
+                        /*inputResult*/null);
+                Image image = mFirstImageReaderListener.getImage(CAPTURE_TIMEOUT_MS);
+
+                // queue the image to image writer
+                mImageWriter.queueInputImage(image);
+
+                // recreate the session
+                closeReprossibleSession();
+                setupReprocessableSession(/*previewSurface*/null, /*numImageWriterImages*/1);
+                try {
+                    TotalCaptureResult reprocessResult;
+                    // issue and wait on reprocess capture request
+                    reprocessResult = submitCaptureRequest(
+                            getReprocessOutputImageReader().getSurface(), result);
+                    fail("Camera " + id + ": should get IllegalArgumentException for cross " +
+                            "session reprocess captrue.");
+                } catch (IllegalArgumentException e) {
+                    // expected
+                    if (DEBUG) {
+                        Log.d(TAG, "Camera " + id + ": get IllegalArgumentException for cross " +
+                                "session reprocess capture as expected: " + e.getMessage());
+                    }
+                }
+            } finally {
+                closeReprossibleSession();
+                closeImageReaders();
+                closeDevice();
+            }
+        }
+    }
+
+    /**
+     * Test burst reprocessing captures with and without preview.
+     */
+    public void testBurstReprocessing() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id) && !isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            try {
+                // open Camera device
+                openDevice(id);
+                // no preview
+                testReprocessingAllCombinations(id, /*previewSize*/null, CaptureTestCase.BURST);
+                // with preview
+                testReprocessingAllCombinations(id, mOrderedPreviewSizes.get(0),
+                        CaptureTestCase.BURST);
+            } finally {
+                closeDevice();
+            }
+        }
+    }
+
+    /**
+     * Test burst captures mixed with regular and reprocess captures with and without preview.
+     */
+    public void testMixedBurstReprocessing() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id) && !isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            try {
+                // open Camera device
+                openDevice(id);
+                // no preview
+                testReprocessingAllCombinations(id, /*previewSize*/null,
+                        CaptureTestCase.MIXED_BURST);
+                // with preview
+                testReprocessingAllCombinations(id, mOrderedPreviewSizes.get(0),
+                        CaptureTestCase.MIXED_BURST);
+            } finally {
+                closeDevice();
+            }
+        }
+    }
+
+    /**
+     * Test aborting reprocess capture requests of the largest input and output sizes for each
+     * supported format.
+     */
+    public void testReprocessAbort() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id) && !isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            try {
+                // open Camera device
+                openDevice(id);
+
+                int[] supportedInputFormats =
+                    mStaticInfo.getAvailableFormats(StaticMetadata.StreamDirection.Input);
+                for (int inputFormat : supportedInputFormats) {
+                    int[] supportedReprocessOutputFormats =
+                            mStaticInfo.getValidOutputFormatsForInput(inputFormat);
+                    for (int reprocessOutputFormat : supportedReprocessOutputFormats) {
+                        testReprocessingMaxSizes(id, inputFormat, reprocessOutputFormat,
+                                /*previewSize*/null, CaptureTestCase.ABORT_CAPTURE);
+                    }
+                }
+            } finally {
+                closeDevice();
+            }
+        }
+    }
+
+    /**
+     * Test reprocess timestamps for the largest input and output sizes for each supported format.
+     */
+    public void testReprocessTimestamps() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id) && !isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            try {
+                // open Camera device
+                openDevice(id);
+
+                int[] supportedInputFormats =
+                    mStaticInfo.getAvailableFormats(StaticMetadata.StreamDirection.Input);
+                for (int inputFormat : supportedInputFormats) {
+                    int[] supportedReprocessOutputFormats =
+                            mStaticInfo.getValidOutputFormatsForInput(inputFormat);
+                    for (int reprocessOutputFormat : supportedReprocessOutputFormats) {
+                        testReprocessingMaxSizes(id, inputFormat, reprocessOutputFormat,
+                                /*previewSize*/null, CaptureTestCase.TIMESTAMPS);
+                    }
+                }
+            } finally {
+                closeDevice();
+            }
+        }
+    }
+
+    /**
+     * Test reprocess jpeg output's exif data for the largest input and output sizes for each
+     * supported format.
+     */
+    public void testReprocessJpegExif() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id) && !isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            try {
+                // open Camera device
+                openDevice(id);
+
+                int[] supportedInputFormats =
+                    mStaticInfo.getAvailableFormats(StaticMetadata.StreamDirection.Input);
+
+                for (int inputFormat : supportedInputFormats) {
+                    int[] supportedReprocessOutputFormats =
+                            mStaticInfo.getValidOutputFormatsForInput(inputFormat);
+
+                    for (int reprocessOutputFormat : supportedReprocessOutputFormats) {
+                        if (reprocessOutputFormat == ImageFormat.JPEG) {
+                            testReprocessingMaxSizes(id, inputFormat, ImageFormat.JPEG,
+                                    /*previewSize*/null, CaptureTestCase.JPEG_EXIF);
+                        }
+                    }
+                }
+            } finally {
+                closeDevice();
+            }
+        }
+    }
+
+    public void testReprocessRequestKeys() throws Exception {
+        for (String id : mCameraIds) {
+            if (!isYuvReprocessSupported(id) && !isOpaqueReprocessSupported(id)) {
+                continue;
+            }
+
+            try {
+                // open Camera device
+                openDevice(id);
+
+                int[] supportedInputFormats =
+                    mStaticInfo.getAvailableFormats(StaticMetadata.StreamDirection.Input);
+                for (int inputFormat : supportedInputFormats) {
+                    int[] supportedReprocessOutputFormats =
+                            mStaticInfo.getValidOutputFormatsForInput(inputFormat);
+                    for (int reprocessOutputFormat : supportedReprocessOutputFormats) {
+                        testReprocessingMaxSizes(id, inputFormat, reprocessOutputFormat,
+                                /*previewSize*/null, CaptureTestCase.REQUEST_KEYS);
+                    }
+                }
+            } finally {
+                closeDevice();
+            }
+        }
+    }
+
+    /**
+     * Test the input format and output format with the largest input and output sizes.
+     */
+    private void testBasicReprocessing(String cameraId, int inputFormat,
+            int reprocessOutputFormat) throws Exception {
+        try {
+            openDevice(cameraId);
+
+            testReprocessingMaxSizes(cameraId, inputFormat, reprocessOutputFormat,
+                    /* previewSize */null, CaptureTestCase.SINGLE_SHOT);
+        } finally {
+            closeDevice();
+        }
+    }
+
+    /**
+     * Test the input format and output format with the largest input and output sizes for a
+     * certain test case.
+     */
+    private void testReprocessingMaxSizes(String cameraId, int inputFormat,
+            int reprocessOutputFormat, Size previewSize, CaptureTestCase captureTestCase)
+            throws Exception {
+        Size maxInputSize = getMaxSize(inputFormat, StaticMetadata.StreamDirection.Input);
+        Size maxReprocessOutputSize =
+                getMaxSize(reprocessOutputFormat, StaticMetadata.StreamDirection.Output);
+
+        switch (captureTestCase) {
+            case SINGLE_SHOT:
+                testReprocess(cameraId, maxInputSize, inputFormat, maxReprocessOutputSize,
+                        reprocessOutputFormat, previewSize, NUM_REPROCESS_CAPTURES);
+                break;
+            case ABORT_CAPTURE:
+                testReprocessAbort(cameraId, maxInputSize, inputFormat, maxReprocessOutputSize,
+                        reprocessOutputFormat);
+                break;
+            case TIMESTAMPS:
+                testReprocessTimestamps(cameraId, maxInputSize, inputFormat, maxReprocessOutputSize,
+                        reprocessOutputFormat);
+                break;
+            case JPEG_EXIF:
+                testReprocessJpegExif(cameraId, maxInputSize, inputFormat, maxReprocessOutputSize);
+                break;
+            case REQUEST_KEYS:
+                testReprocessRequestKeys(cameraId, maxInputSize, inputFormat,
+                        maxReprocessOutputSize, reprocessOutputFormat);
+                break;
+            default:
+                throw new IllegalArgumentException("Invalid test case");
+        }
+    }
+
+    /**
+     * Test all input format, input size, output format, and output size combinations.
+     */
+    private void testReprocessingAllCombinations(String cameraId, Size previewSize,
+            CaptureTestCase captureTestCase) throws Exception {
+
+        int[] supportedInputFormats =
+                mStaticInfo.getAvailableFormats(StaticMetadata.StreamDirection.Input);
+        for (int inputFormat : supportedInputFormats) {
+            Size[] supportedInputSizes =
+                    mStaticInfo.getAvailableSizesForFormatChecked(inputFormat,
+                    StaticMetadata.StreamDirection.Input);
+
+            for (Size inputSize : supportedInputSizes) {
+                int[] supportedReprocessOutputFormats =
+                        mStaticInfo.getValidOutputFormatsForInput(inputFormat);
+
+                for (int reprocessOutputFormat : supportedReprocessOutputFormats) {
+                    Size[] supportedReprocessOutputSizes =
+                            mStaticInfo.getAvailableSizesForFormatChecked(reprocessOutputFormat,
+                            StaticMetadata.StreamDirection.Output);
+
+                    for (Size reprocessOutputSize : supportedReprocessOutputSizes) {
+                        switch (captureTestCase) {
+                            case SINGLE_SHOT:
+                                testReprocess(cameraId, inputSize, inputFormat,
+                                        reprocessOutputSize, reprocessOutputFormat, previewSize,
+                                        NUM_REPROCESS_CAPTURES);
+                                break;
+                            case BURST:
+                                testReprocessBurst(cameraId, inputSize, inputFormat,
+                                        reprocessOutputSize, reprocessOutputFormat, previewSize,
+                                        NUM_REPROCESS_BURST);
+                                break;
+                            case MIXED_BURST:
+                                testReprocessMixedBurst(cameraId, inputSize, inputFormat,
+                                        reprocessOutputSize, reprocessOutputFormat, previewSize,
+                                        NUM_REPROCESS_BURST);
+                                break;
+                            default:
+                                throw new IllegalArgumentException("Invalid test case");
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Test burst that is mixed with regular and reprocess capture requests.
+     */
+    private void testReprocessMixedBurst(String cameraId, Size inputSize, int inputFormat,
+            Size reprocessOutputSize, int reprocessOutputFormat, Size previewSize,
+            int numBurst) throws Exception {
+        if (VERBOSE) {
+            Log.v(TAG, "testReprocessMixedBurst: cameraId: " + cameraId + " inputSize: " +
+                    inputSize + " inputFormat: " + inputFormat + " reprocessOutputSize: " +
+                    reprocessOutputSize + " reprocessOutputFormat: " + reprocessOutputFormat +
+                    " previewSize: " + previewSize + " numBurst: " + numBurst);
+        }
+
+        boolean enablePreview = (previewSize != null);
+        ImageResultHolder[] imageResultHolders = new ImageResultHolder[0];
+
+        try {
+            // totalNumBurst = number of regular burst + number of reprocess burst.
+            int totalNumBurst = numBurst * 2;
+
+            if (enablePreview) {
+                updatePreviewSurface(previewSize);
+            } else {
+                mPreviewSurface = null;
+            }
+
+            setupImageReaders(inputSize, inputFormat, reprocessOutputSize, reprocessOutputFormat,
+                totalNumBurst);
+            setupReprocessableSession(mPreviewSurface, /*numImageWriterImages*/numBurst);
+
+            if (enablePreview) {
+                startPreview(mPreviewSurface);
+            }
+
+            // Prepare an array of booleans indicating each capture's type (regular or reprocess)
+            boolean[] isReprocessCaptures = new boolean[totalNumBurst];
+            for (int i = 0; i < totalNumBurst; i++) {
+                if ((i & 1) == 0) {
+                    isReprocessCaptures[i] = true;
+                } else {
+                    isReprocessCaptures[i] = false;
+                }
+            }
+
+            imageResultHolders = doMixedReprocessBurstCapture(isReprocessCaptures);
+            for (ImageResultHolder holder : imageResultHolders) {
+                Image reprocessedImage = holder.getImage();
+                TotalCaptureResult result = holder.getTotalCaptureResult();
+
+                mCollector.expectImageProperties("testReprocessMixedBurst", reprocessedImage,
+                            reprocessOutputFormat, reprocessOutputSize,
+                            result.get(CaptureResult.SENSOR_TIMESTAMP));
+
+                if (DEBUG) {
+                    Log.d(TAG, String.format("camera %s in %dx%d %d out %dx%d %d",
+                            cameraId, inputSize.getWidth(), inputSize.getHeight(), inputFormat,
+                            reprocessOutputSize.getWidth(), reprocessOutputSize.getHeight(),
+                            reprocessOutputFormat));
+                    dumpImage(reprocessedImage,
+                            "/testReprocessMixedBurst_camera" + cameraId + "_" + mDumpFrameCount);
+                    mDumpFrameCount++;
+                }
+            }
+        } finally {
+            for (ImageResultHolder holder : imageResultHolders) {
+                holder.getImage().close();
+            }
+            closeReprossibleSession();
+            closeImageReaders();
+        }
+    }
+
+    /**
+     * Test burst of reprocess capture requests.
+     */
+    private void testReprocessBurst(String cameraId, Size inputSize, int inputFormat,
+            Size reprocessOutputSize, int reprocessOutputFormat, Size previewSize,
+            int numBurst) throws Exception {
+        if (VERBOSE) {
+            Log.v(TAG, "testReprocessBurst: cameraId: " + cameraId + " inputSize: " +
+                    inputSize + " inputFormat: " + inputFormat + " reprocessOutputSize: " +
+                    reprocessOutputSize + " reprocessOutputFormat: " + reprocessOutputFormat +
+                    " previewSize: " + previewSize + " numBurst: " + numBurst);
+        }
+
+        boolean enablePreview = (previewSize != null);
+        ImageResultHolder[] imageResultHolders = new ImageResultHolder[0];
+
+        try {
+            if (enablePreview) {
+                updatePreviewSurface(previewSize);
+            } else {
+                mPreviewSurface = null;
+            }
+
+            setupImageReaders(inputSize, inputFormat, reprocessOutputSize, reprocessOutputFormat,
+                numBurst);
+            setupReprocessableSession(mPreviewSurface, numBurst);
+
+            if (enablePreview) {
+                startPreview(mPreviewSurface);
+            }
+
+            imageResultHolders = doReprocessBurstCapture(numBurst);
+            for (ImageResultHolder holder : imageResultHolders) {
+                Image reprocessedImage = holder.getImage();
+                TotalCaptureResult result = holder.getTotalCaptureResult();
+
+                mCollector.expectImageProperties("testReprocessBurst", reprocessedImage,
+                            reprocessOutputFormat, reprocessOutputSize,
+                            result.get(CaptureResult.SENSOR_TIMESTAMP));
+
+                if (DEBUG) {
+                    Log.d(TAG, String.format("camera %s in %dx%d %d out %dx%d %d",
+                            cameraId, inputSize.getWidth(), inputSize.getHeight(), inputFormat,
+                            reprocessOutputSize.getWidth(), reprocessOutputSize.getHeight(),
+                            reprocessOutputFormat));
+                    dumpImage(reprocessedImage,
+                            "/testReprocessBurst_camera" + cameraId + "_" + mDumpFrameCount);
+                    mDumpFrameCount++;
+                }
+            }
+        } finally {
+            for (ImageResultHolder holder : imageResultHolders) {
+                holder.getImage().close();
+            }
+            closeReprossibleSession();
+            closeImageReaders();
+        }
+    }
+
+    /**
+     * Test a sequences of reprocess capture requests.
+     */
+    private void testReprocess(String cameraId, Size inputSize, int inputFormat,
+            Size reprocessOutputSize, int reprocessOutputFormat, Size previewSize,
+            int numReprocessCaptures) throws Exception {
+        if (VERBOSE) {
+            Log.v(TAG, "testReprocess: cameraId: " + cameraId + " inputSize: " +
+                    inputSize + " inputFormat: " + inputFormat + " reprocessOutputSize: " +
+                    reprocessOutputSize + " reprocessOutputFormat: " + reprocessOutputFormat +
+                    " previewSize: " + previewSize);
+        }
+
+        boolean enablePreview = (previewSize != null);
+
+        try {
+            if (enablePreview) {
+                updatePreviewSurface(previewSize);
+            } else {
+                mPreviewSurface = null;
+            }
+
+            setupImageReaders(inputSize, inputFormat, reprocessOutputSize, reprocessOutputFormat,
+                    /*maxImages*/1);
+            setupReprocessableSession(mPreviewSurface, /*numImageWriterImages*/1);
+
+            if (enablePreview) {
+                startPreview(mPreviewSurface);
+            }
+
+            for (int i = 0; i < numReprocessCaptures; i++) {
+                ImageResultHolder imageResultHolder = null;
+
+                try {
+                    imageResultHolder = doReprocessCapture();
+                    Image reprocessedImage = imageResultHolder.getImage();
+                    TotalCaptureResult result = imageResultHolder.getTotalCaptureResult();
+
+                    mCollector.expectImageProperties("testReprocess", reprocessedImage,
+                            reprocessOutputFormat, reprocessOutputSize,
+                            result.get(CaptureResult.SENSOR_TIMESTAMP));
+
+                    if (DEBUG) {
+                        Log.d(TAG, String.format("camera %s in %dx%d %d out %dx%d %d",
+                                cameraId, inputSize.getWidth(), inputSize.getHeight(), inputFormat,
+                                reprocessOutputSize.getWidth(), reprocessOutputSize.getHeight(),
+                                reprocessOutputFormat));
+
+                        dumpImage(reprocessedImage,
+                                "/testReprocess_camera" + cameraId + "_" + mDumpFrameCount);
+                        mDumpFrameCount++;
+                    }
+                } finally {
+                    if (imageResultHolder != null) {
+                        imageResultHolder.getImage().close();
+                    }
+                }
+            }
+        } finally {
+            closeReprossibleSession();
+            closeImageReaders();
+        }
+    }
+
+    /**
+     * Test aborting a burst reprocess capture and multiple single reprocess captures.
+     */
+    private void testReprocessAbort(String cameraId, Size inputSize, int inputFormat,
+            Size reprocessOutputSize, int reprocessOutputFormat) throws Exception {
+        if (VERBOSE) {
+            Log.v(TAG, "testReprocessAbort: cameraId: " + cameraId + " inputSize: " +
+                    inputSize + " inputFormat: " + inputFormat + " reprocessOutputSize: " +
+                    reprocessOutputSize + " reprocessOutputFormat: " + reprocessOutputFormat);
+        }
+
+        try {
+            setupImageReaders(inputSize, inputFormat, reprocessOutputSize, reprocessOutputFormat,
+                    NUM_REPROCESS_CAPTURES);
+            setupReprocessableSession(/*previewSurface*/null, NUM_REPROCESS_CAPTURES);
+
+            // Test two cases: submitting reprocess requests one by one and in a burst.
+            boolean submitInBursts[] = {false, true};
+            for (boolean submitInBurst : submitInBursts) {
+                // Prepare reprocess capture requests.
+                ArrayList<CaptureRequest> reprocessRequests =
+                        new ArrayList<>(NUM_REPROCESS_CAPTURES);
+
+                for (int i = 0; i < NUM_REPROCESS_CAPTURES; i++) {
+                    TotalCaptureResult result = submitCaptureRequest(mFirstImageReader.getSurface(),
+                            /*inputResult*/null);
+
+                    mImageWriter.queueInputImage(
+                            mFirstImageReaderListener.getImage(CAPTURE_TIMEOUT_MS));
+                    CaptureRequest.Builder builder = mCamera.createReprocessCaptureRequest(result);
+                    builder.addTarget(getReprocessOutputImageReader().getSurface());
+                    reprocessRequests.add(builder.build());
+                }
+
+                SimpleCaptureCallback captureCallback = new SimpleCaptureCallback();
+
+                // Submit reprocess capture requests.
+                if (submitInBurst) {
+                    mSession.captureBurst(reprocessRequests, captureCallback, mHandler);
+                } else {
+                    for (CaptureRequest request : reprocessRequests) {
+                        mSession.capture(request, captureCallback, mHandler);
+                    }
+                }
+
+                // Abort after getting the first result
+                TotalCaptureResult reprocessResult =
+                        captureCallback.getTotalCaptureResultForRequest(reprocessRequests.get(0),
+                        CAPTURE_TIMEOUT_FRAMES);
+                mSession.abortCaptures();
+
+                // Wait until the session is ready again.
+                mSessionListener.getStateWaiter().waitForState(
+                        BlockingSessionCallback.SESSION_READY, SESSION_CLOSE_TIMEOUT_MS);
+
+                // Gather all failed requests.
+                ArrayList<CaptureFailure> failures =
+                        captureCallback.getCaptureFailures(NUM_REPROCESS_CAPTURES - 1);
+                ArrayList<CaptureRequest> failedRequests = new ArrayList<>();
+                for (CaptureFailure failure : failures) {
+                    failedRequests.add(failure.getRequest());
+                }
+
+                // For each request that didn't fail must have a valid result.
+                for (int i = 1; i < reprocessRequests.size(); i++) {
+                    CaptureRequest request = reprocessRequests.get(i);
+                    if (!failedRequests.contains(request)) {
+                        captureCallback.getTotalCaptureResultForRequest(request,
+                                CAPTURE_TIMEOUT_FRAMES);
+                    }
+                }
+
+                // Drain the image reader listeners.
+                mFirstImageReaderListener.drain();
+                if (!mShareOneImageReader) {
+                    mSecondImageReaderListener.drain();
+                }
+
+                // Make sure all input surfaces are released.
+                for (int i = 0; i < NUM_REPROCESS_CAPTURES; i++) {
+                    mImageWriterListener.waitForImageReleased(CAPTURE_TIMEOUT_MS);
+                }
+            }
+        } finally {
+            closeReprossibleSession();
+            closeImageReaders();
+        }
+    }
+
+    /**
+     * Test timestamps for reprocess requests. Reprocess request's shutter timestamp, result's
+     * sensor timestamp, and output image's timestamp should match the reprocess input's timestamp.
+     */
+    private void testReprocessTimestamps(String cameraId, Size inputSize, int inputFormat,
+            Size reprocessOutputSize, int reprocessOutputFormat) throws Exception {
+        if (VERBOSE) {
+            Log.v(TAG, "testReprocessTimestamps: cameraId: " + cameraId + " inputSize: " +
+                    inputSize + " inputFormat: " + inputFormat + " reprocessOutputSize: " +
+                    reprocessOutputSize + " reprocessOutputFormat: " + reprocessOutputFormat);
+        }
+
+        try {
+            setupImageReaders(inputSize, inputFormat, reprocessOutputSize, reprocessOutputFormat,
+                    NUM_REPROCESS_CAPTURES);
+            setupReprocessableSession(/*previewSurface*/null, NUM_REPROCESS_CAPTURES);
+
+            // Prepare reprocess capture requests.
+            ArrayList<CaptureRequest> reprocessRequests = new ArrayList<>(NUM_REPROCESS_CAPTURES);
+            ArrayList<Long> expectedTimestamps = new ArrayList<>(NUM_REPROCESS_CAPTURES);
+
+            for (int i = 0; i < NUM_REPROCESS_CAPTURES; i++) {
+                TotalCaptureResult result = submitCaptureRequest(mFirstImageReader.getSurface(),
+                        /*inputResult*/null);
+
+                mImageWriter.queueInputImage(
+                        mFirstImageReaderListener.getImage(CAPTURE_TIMEOUT_MS));
+                CaptureRequest.Builder builder = mCamera.createReprocessCaptureRequest(result);
+                builder.addTarget(getReprocessOutputImageReader().getSurface());
+                reprocessRequests.add(builder.build());
+                // Reprocess result's timestamp should match input image's timestamp.
+                expectedTimestamps.add(result.get(CaptureResult.SENSOR_TIMESTAMP));
+            }
+
+            // Submit reprocess requests.
+            SimpleCaptureCallback captureCallback = new SimpleCaptureCallback();
+            mSession.captureBurst(reprocessRequests, captureCallback, mHandler);
+
+            // Verify we get the expected timestamps.
+            for (int i = 0; i < reprocessRequests.size(); i++) {
+                captureCallback.waitForCaptureStart(reprocessRequests.get(i),
+                        expectedTimestamps.get(i), CAPTURE_TIMEOUT_FRAMES);
+            }
+
+            TotalCaptureResult[] reprocessResults =
+                    captureCallback.getTotalCaptureResultsForRequests(reprocessRequests,
+                    CAPTURE_TIMEOUT_FRAMES);
+
+            for (int i = 0; i < expectedTimestamps.size(); i++) {
+                // Verify the result timestamps match the input image's timestamps.
+                long expected = expectedTimestamps.get(i);
+                long timestamp = reprocessResults[i].get(CaptureResult.SENSOR_TIMESTAMP);
+                assertEquals("Reprocess result timestamp (" + timestamp + ") doesn't match input " +
+                        "image's timestamp (" + expected + ")", expected, timestamp);
+
+                // Verify the reprocess output image timestamps match the input image's timestamps.
+                Image image = getReprocessOutputImageReaderListener().getImage(CAPTURE_TIMEOUT_MS);
+                timestamp = image.getTimestamp();
+                image.close();
+
+                assertEquals("Reprocess output timestamp (" + timestamp + ") doesn't match input " +
+                        "image's timestamp (" + expected + ")", expected, timestamp);
+            }
+
+            // Make sure all input surfaces are released.
+            for (int i = 0; i < NUM_REPROCESS_CAPTURES; i++) {
+                mImageWriterListener.waitForImageReleased(CAPTURE_TIMEOUT_MS);
+            }
+        } finally {
+            closeReprossibleSession();
+            closeImageReaders();
+        }
+    }
+
+    /**
+     * Test JPEG tags for reprocess requests. Reprocess result's JPEG tags and JPEG image's tags
+     * match reprocess request's JPEG tags.
+     */
+    private void testReprocessJpegExif(String cameraId, Size inputSize, int inputFormat,
+            Size reprocessOutputSize) throws Exception {
+        if (VERBOSE) {
+            Log.v(TAG, "testReprocessJpegExif: cameraId: " + cameraId + " inputSize: " +
+                    inputSize + " inputFormat: " + inputFormat + " reprocessOutputSize: " +
+                    reprocessOutputSize);
+        }
+
+        Size[] thumbnailSizes = mStaticInfo.getAvailableThumbnailSizesChecked();
+        Size[] testThumbnailSizes = new Size[EXIF_TEST_DATA.length];
+        Arrays.fill(testThumbnailSizes, thumbnailSizes[thumbnailSizes.length - 1]);
+        // Make sure thumbnail size (0, 0) is covered.
+        testThumbnailSizes[0] = new Size(0, 0);
+
+        try {
+            setupImageReaders(inputSize, inputFormat, reprocessOutputSize, ImageFormat.JPEG,
+                    EXIF_TEST_DATA.length);
+            setupReprocessableSession(/*previewSurface*/null, EXIF_TEST_DATA.length);
+
+            // Prepare reprocess capture requests.
+            ArrayList<CaptureRequest> reprocessRequests = new ArrayList<>(EXIF_TEST_DATA.length);
+
+            for (int i = 0; i < EXIF_TEST_DATA.length; i++) {
+                TotalCaptureResult result = submitCaptureRequest(mFirstImageReader.getSurface(),
+                        /*inputResult*/null);
+                mImageWriter.queueInputImage(
+                        mFirstImageReaderListener.getImage(CAPTURE_TIMEOUT_MS));
+
+                CaptureRequest.Builder builder = mCamera.createReprocessCaptureRequest(result);
+                builder.addTarget(getReprocessOutputImageReader().getSurface());
+
+                // set jpeg keys
+                setJpegKeys(builder, EXIF_TEST_DATA[i], testThumbnailSizes[i], mCollector);
+                reprocessRequests.add(builder.build());
+            }
+
+            // Submit reprocess requests.
+            SimpleCaptureCallback captureCallback = new SimpleCaptureCallback();
+            mSession.captureBurst(reprocessRequests, captureCallback, mHandler);
+
+            TotalCaptureResult[] reprocessResults =
+                    captureCallback.getTotalCaptureResultsForRequests(reprocessRequests,
+                    CAPTURE_TIMEOUT_FRAMES);
+
+            for (int i = 0; i < EXIF_TEST_DATA.length; i++) {
+                // Verify output image's and result's JPEG EXIF data.
+                Image image = getReprocessOutputImageReaderListener().getImage(CAPTURE_TIMEOUT_MS);
+                verifyJpegKeys(image, reprocessResults[i], reprocessOutputSize,
+                        testThumbnailSizes[i], EXIF_TEST_DATA[i], mStaticInfo, mCollector);
+                image.close();
+
+            }
+        } finally {
+            closeReprossibleSession();
+            closeImageReaders();
+        }
+    }
+
+
+
+    /**
+     * Test the following keys in reprocess results match the keys in reprocess requests:
+     *   1. EDGE_MODE
+     *   2. NOISE_REDUCTION_MODE
+     *   3. REPROCESS_EFFECTIVE_EXPOSURE_FACTOR (only for YUV reprocess)
+     */
+    private void testReprocessRequestKeys(String cameraId, Size inputSize, int inputFormat,
+            Size reprocessOutputSize, int reprocessOutputFormat) throws Exception {
+        if (VERBOSE) {
+            Log.v(TAG, "testReprocessRequestKeys: cameraId: " + cameraId + " inputSize: " +
+                    inputSize + " inputFormat: " + inputFormat + " reprocessOutputSize: " +
+                    reprocessOutputSize + " reprocessOutputFormat: " + reprocessOutputFormat);
+        }
+
+        final Integer[] EDGE_MODES = {CaptureRequest.EDGE_MODE_FAST,
+                CaptureRequest.EDGE_MODE_HIGH_QUALITY, CaptureRequest.EDGE_MODE_OFF,
+                CaptureRequest.EDGE_MODE_ZERO_SHUTTER_LAG};
+        final Integer[] NR_MODES = {CaptureRequest.NOISE_REDUCTION_MODE_HIGH_QUALITY,
+                CaptureRequest.NOISE_REDUCTION_MODE_OFF,
+                CaptureRequest.NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG,
+                CaptureRequest.NOISE_REDUCTION_MODE_FAST};
+        final Float[] EFFECTIVE_EXP_FACTORS = {null, 1.0f, 2.5f, 4.0f};
+        int numFrames = EDGE_MODES.length;
+
+        try {
+            setupImageReaders(inputSize, inputFormat, reprocessOutputSize, reprocessOutputFormat,
+                    numFrames);
+            setupReprocessableSession(/*previewSurface*/null, numFrames);
+
+            // Prepare reprocess capture requests.
+            ArrayList<CaptureRequest> reprocessRequests = new ArrayList<>(numFrames);
+
+            for (int i = 0; i < numFrames; i++) {
+                TotalCaptureResult result = submitCaptureRequest(mFirstImageReader.getSurface(),
+                        /*inputResult*/null);
+                mImageWriter.queueInputImage(
+                        mFirstImageReaderListener.getImage(CAPTURE_TIMEOUT_MS));
+
+                CaptureRequest.Builder builder = mCamera.createReprocessCaptureRequest(result);
+                builder.addTarget(getReprocessOutputImageReader().getSurface());
+
+                // Set reprocess request keys
+                builder.set(CaptureRequest.EDGE_MODE, EDGE_MODES[i]);
+                builder.set(CaptureRequest.NOISE_REDUCTION_MODE, NR_MODES[i]);
+                if (inputFormat == ImageFormat.YUV_420_888) {
+                    builder.set(CaptureRequest.REPROCESS_EFFECTIVE_EXPOSURE_FACTOR,
+                            EFFECTIVE_EXP_FACTORS[i]);
+                }
+                reprocessRequests.add(builder.build());
+            }
+
+            // Submit reprocess requests.
+            SimpleCaptureCallback captureCallback = new SimpleCaptureCallback();
+            mSession.captureBurst(reprocessRequests, captureCallback, mHandler);
+
+            TotalCaptureResult[] reprocessResults =
+                    captureCallback.getTotalCaptureResultsForRequests(reprocessRequests,
+                    CAPTURE_TIMEOUT_FRAMES);
+
+            for (int i = 0; i < numFrames; i++) {
+                // Verify result's keys
+                Integer resultEdgeMode = reprocessResults[i].get(CaptureResult.EDGE_MODE);
+                Integer resultNoiseReductionMode =
+                        reprocessResults[i].get(CaptureResult.NOISE_REDUCTION_MODE);
+
+                assertEquals("Reprocess result edge mode (" + resultEdgeMode +
+                        ") doesn't match requested edge mode (" + EDGE_MODES[i] + ")",
+                        resultEdgeMode, EDGE_MODES[i]);
+                assertEquals("Reprocess result noise reduction mode (" + resultNoiseReductionMode +
+                        ") doesn't match requested noise reduction mode (" +
+                        NR_MODES[i] + ")", resultNoiseReductionMode,
+                        NR_MODES[i]);
+
+                if (inputFormat == ImageFormat.YUV_420_888) {
+                    Float resultEffectiveExposureFactor = reprocessResults[i].get(
+                            CaptureResult.REPROCESS_EFFECTIVE_EXPOSURE_FACTOR);
+                    assertEquals("Reprocess effective exposure factor (" +
+                            resultEffectiveExposureFactor + ") doesn't match requested " +
+                            "effective exposure factor (" + EFFECTIVE_EXP_FACTORS[i] + ")",
+                            resultEffectiveExposureFactor, EFFECTIVE_EXP_FACTORS[i]);
+                }
+            }
+        } finally {
+            closeReprossibleSession();
+            closeImageReaders();
+        }
+    }
+
+    /**
+     * Set up two image readers: one for regular capture (used for reprocess input) and one for
+     * reprocess capture.
+     */
+    private void setupImageReaders(Size inputSize, int inputFormat, Size reprocessOutputSize,
+            int reprocessOutputFormat, int maxImages) {
+
+        mShareOneImageReader = false;
+        // If the regular output and reprocess output have the same size and format,
+        // they can share one image reader.
+        if (inputFormat == reprocessOutputFormat &&
+                inputSize.equals(reprocessOutputSize)) {
+            maxImages *= 2;
+            mShareOneImageReader = true;
+        }
+        // create an ImageReader for the regular capture
+        mFirstImageReaderListener = new SimpleImageReaderListener();
+        mFirstImageReader = makeImageReader(inputSize, inputFormat, maxImages,
+                mFirstImageReaderListener, mHandler);
+
+        if (!mShareOneImageReader) {
+            // create an ImageReader for the reprocess capture
+            mSecondImageReaderListener = new SimpleImageReaderListener();
+            mSecondImageReader = makeImageReader(reprocessOutputSize, reprocessOutputFormat,
+                    maxImages, mSecondImageReaderListener, mHandler);
+        }
+    }
+
+    /**
+     * Close two image readers.
+     */
+    private void closeImageReaders() {
+        CameraTestUtils.closeImageReader(mFirstImageReader);
+        mFirstImageReader = null;
+        CameraTestUtils.closeImageReader(mSecondImageReader);
+        mSecondImageReader = null;
+    }
+
+    /**
+     * Get the ImageReader for reprocess output.
+     */
+    private ImageReader getReprocessOutputImageReader() {
+        if (mShareOneImageReader) {
+            return mFirstImageReader;
+        } else {
+            return mSecondImageReader;
+        }
+    }
+
+    private SimpleImageReaderListener getReprocessOutputImageReaderListener() {
+        if (mShareOneImageReader) {
+            return mFirstImageReaderListener;
+        } else {
+            return mSecondImageReaderListener;
+        }
+    }
+
+    /**
+     * Set up a reprocessable session and create an ImageWriter with the sessoin's input surface.
+     */
+    private void setupReprocessableSession(Surface previewSurface, int numImageWriterImages)
+            throws Exception {
+        // create a reprocessable capture session
+        List<Surface> outSurfaces = new ArrayList<Surface>();
+        outSurfaces.add(mFirstImageReader.getSurface());
+        if (!mShareOneImageReader) {
+            outSurfaces.add(mSecondImageReader.getSurface());
+        }
+        if (previewSurface != null) {
+            outSurfaces.add(previewSurface);
+        }
+
+        InputConfiguration inputConfig = new InputConfiguration(mFirstImageReader.getWidth(),
+                mFirstImageReader.getHeight(), mFirstImageReader.getImageFormat());
+        String inputConfigString = inputConfig.toString();
+        if (VERBOSE) {
+            Log.v(TAG, "InputConfiguration: " + inputConfigString);
+        }
+        assertTrue(String.format("inputConfig is wrong: %dx%d format %d. Expect %dx%d format %d",
+                inputConfig.getWidth(), inputConfig.getHeight(), inputConfig.getFormat(),
+                mFirstImageReader.getWidth(), mFirstImageReader.getHeight(),
+                mFirstImageReader.getImageFormat()),
+                inputConfig.getWidth() == mFirstImageReader.getWidth() &&
+                inputConfig.getHeight() == mFirstImageReader.getHeight() &&
+                inputConfig.getFormat() == mFirstImageReader.getImageFormat());
+
+        mSessionListener = new BlockingSessionCallback();
+        mSession = configureReprocessableCameraSession(mCamera, inputConfig, outSurfaces,
+                mSessionListener, mHandler);
+
+        // create an ImageWriter
+        mInputSurface = mSession.getInputSurface();
+        mImageWriter = ImageWriter.newInstance(mInputSurface,
+                numImageWriterImages);
+
+        mImageWriterListener = new SimpleImageWriterListener(mImageWriter);
+        mImageWriter.setOnImageReleasedListener(mImageWriterListener, mHandler);
+    }
+
+    /**
+     * Close the reprocessable session and ImageWriter.
+     */
+    private void closeReprossibleSession() {
+        mInputSurface = null;
+
+        if (mSession != null) {
+            mSession.close();
+            mSession = null;
+        }
+
+        if (mImageWriter != null) {
+            mImageWriter.close();
+            mImageWriter = null;
+        }
+    }
+
+    /**
+     * Do one reprocess capture.
+     */
+    private ImageResultHolder doReprocessCapture() throws Exception {
+        return doReprocessBurstCapture(/*numBurst*/1)[0];
+    }
+
+    /**
+     * Do a burst of reprocess captures.
+     */
+    private ImageResultHolder[] doReprocessBurstCapture(int numBurst) throws Exception {
+        boolean[] isReprocessCaptures = new boolean[numBurst];
+        for (int i = 0; i < numBurst; i++) {
+            isReprocessCaptures[i] = true;
+        }
+
+        return doMixedReprocessBurstCapture(isReprocessCaptures);
+    }
+
+    /**
+     * Do a burst of captures that are mixed with regular and reprocess captures.
+     *
+     * @param isReprocessCaptures An array whose elements indicate whether it's a reprocess capture
+     *                            request. If the element is true, it represents a reprocess capture
+     *                            request. If the element is false, it represents a regular capture
+     *                            request. The size of the array is the number of capture requests
+     *                            in the burst.
+     */
+    private ImageResultHolder[] doMixedReprocessBurstCapture(boolean[] isReprocessCaptures)
+            throws Exception {
+        if (isReprocessCaptures == null || isReprocessCaptures.length <= 0) {
+            throw new IllegalArgumentException("isReprocessCaptures must have at least 1 capture.");
+        }
+
+        TotalCaptureResult[] results = new TotalCaptureResult[isReprocessCaptures.length];
+        for (int i = 0; i < isReprocessCaptures.length; i++) {
+            // submit a capture and get the result if this entry is a reprocess capture.
+            if (isReprocessCaptures[i]) {
+                results[i] = submitCaptureRequest(mFirstImageReader.getSurface(),
+                        /*inputResult*/null);
+                mImageWriter.queueInputImage(
+                        mFirstImageReaderListener.getImage(CAPTURE_TIMEOUT_MS));
+            }
+        }
+
+        Surface[] outputSurfaces = new Surface[isReprocessCaptures.length];
+        for (int i = 0; i < isReprocessCaptures.length; i++) {
+            outputSurfaces[i] = getReprocessOutputImageReader().getSurface();
+        }
+
+        TotalCaptureResult[] finalResults = submitMixedCaptureBurstRequest(outputSurfaces, results);
+
+        ImageResultHolder[] holders = new ImageResultHolder[isReprocessCaptures.length];
+        for (int i = 0; i < isReprocessCaptures.length; i++) {
+            Image image = getReprocessOutputImageReaderListener().getImage(CAPTURE_TIMEOUT_MS);
+            holders[i] = new ImageResultHolder(image, finalResults[i]);
+        }
+
+        return holders;
+    }
+
+    /**
+     * Start preview without a listener.
+     */
+    private void startPreview(Surface previewSurface) throws Exception {
+        CaptureRequest.Builder builder = mCamera.createCaptureRequest(ZSL_TEMPLATE);
+        builder.addTarget(previewSurface);
+        mSession.setRepeatingRequest(builder.build(), null, mHandler);
+    }
+
+    /**
+     * Issue a capture request and return the result. If inputResult is null, it's a regular
+     * request. Otherwise, it's a reprocess request.
+     */
+    private TotalCaptureResult submitCaptureRequest(Surface output,
+            TotalCaptureResult inputResult) throws Exception {
+        Surface[] outputs = new Surface[1];
+        outputs[0] = output;
+        TotalCaptureResult[] inputResults = new TotalCaptureResult[1];
+        inputResults[0] = inputResult;
+
+        return submitMixedCaptureBurstRequest(outputs, inputResults)[0];
+    }
+
+    /**
+     * Submit a burst request mixed with regular and reprocess requests.
+     *
+     * @param outputs An array of output surfaces. One output surface will be used in one request
+     *                so the length of the array is the number of requests in a burst request.
+     * @param inputResults An array of input results. If it's null, all requests are regular
+     *                     requests. If an element is null, that element represents a regular
+     *                     request. If an element if not null, that element represents a reprocess
+     *                     request.
+     *
+     */
+    private TotalCaptureResult[] submitMixedCaptureBurstRequest(Surface[] outputs,
+            TotalCaptureResult[] inputResults) throws Exception {
+        if (outputs == null || outputs.length <= 0) {
+            throw new IllegalArgumentException("outputs must have at least 1 surface");
+        } else if (inputResults != null && inputResults.length != outputs.length) {
+            throw new IllegalArgumentException("The lengths of outputs and inputResults " +
+                    "don't match");
+        }
+
+        int numReprocessCaptures = 0;
+        SimpleCaptureCallback captureCallback = new SimpleCaptureCallback();
+        ArrayList<CaptureRequest> captureRequests = new ArrayList<>(outputs.length);
+
+        // Prepare a list of capture requests. Whether it's a regular or reprocess capture request
+        // is based on inputResults array.
+        for (int i = 0; i < outputs.length; i++) {
+            CaptureRequest.Builder builder;
+            boolean isReprocess = (inputResults != null && inputResults[i] != null);
+            if (isReprocess) {
+                builder = mCamera.createReprocessCaptureRequest(inputResults[i]);
+                numReprocessCaptures++;
+            } else {
+                builder = mCamera.createCaptureRequest(CAPTURE_TEMPLATE);
+            }
+            builder.addTarget(outputs[i]);
+            CaptureRequest request = builder.build();
+            assertTrue("Capture request reprocess type " + request.isReprocess() + " is wrong.",
+                request.isReprocess() == isReprocess);
+
+            captureRequests.add(request);
+        }
+
+        if (captureRequests.size() == 1) {
+            mSession.capture(captureRequests.get(0), captureCallback, mHandler);
+        } else {
+            mSession.captureBurst(captureRequests, captureCallback, mHandler);
+        }
+
+        TotalCaptureResult[] results;
+        if (numReprocessCaptures == 0 || numReprocessCaptures == outputs.length) {
+            results = new TotalCaptureResult[outputs.length];
+            // If the requests are not mixed, they should come in order.
+            for (int i = 0; i < results.length; i++){
+                results[i] = captureCallback.getTotalCaptureResultForRequest(
+                        captureRequests.get(i), CAPTURE_TIMEOUT_FRAMES);
+            }
+        } else {
+            // If the requests are mixed, they may not come in order.
+            results = captureCallback.getTotalCaptureResultsForRequests(
+                    captureRequests, CAPTURE_TIMEOUT_FRAMES * captureRequests.size());
+        }
+
+        // make sure all input surfaces are released.
+        for (int i = 0; i < numReprocessCaptures; i++) {
+            mImageWriterListener.waitForImageReleased(CAPTURE_TIMEOUT_MS);
+        }
+
+        return results;
+    }
+
+    private Size getMaxSize(int format, StaticMetadata.StreamDirection direction) {
+        Size[] sizes = mStaticInfo.getAvailableSizesForFormatChecked(format, direction);
+        return getAscendingOrderSizes(Arrays.asList(sizes), /*ascending*/false).get(0);
+    }
+
+    private boolean isYuvReprocessSupported(String cameraId) throws Exception {
+        return isReprocessSupported(cameraId, ImageFormat.YUV_420_888);
+    }
+
+    private boolean isOpaqueReprocessSupported(String cameraId) throws Exception {
+        return isReprocessSupported(cameraId, ImageFormat.PRIVATE);
+    }
+
+    private void dumpImage(Image image, String name) {
+        String filename = DEBUG_FILE_NAME_BASE + name;
+        switch(image.getFormat()) {
+            case ImageFormat.JPEG:
+                filename += ".jpg";
+                break;
+            case ImageFormat.NV16:
+            case ImageFormat.NV21:
+            case ImageFormat.YUV_420_888:
+                filename += ".yuv";
+                break;
+            default:
+                filename += "." + image.getFormat();
+                break;
+        }
+
+        Log.d(TAG, "dumping an image to " + filename);
+        dumpFile(filename , getDataFromImage(image));
+    }
+
+    /**
+     * A class that holds an Image and a TotalCaptureResult.
+     */
+    private static class ImageResultHolder {
+        private final Image mImage;
+        private final TotalCaptureResult mResult;
+
+        public ImageResultHolder(Image image, TotalCaptureResult result) {
+            mImage = image;
+            mResult = result;
+        }
+
+        public Image getImage() {
+            return mImage;
+        }
+
+        public TotalCaptureResult getTotalCaptureResult() {
+            return mResult;
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
index abc0fea..8ccc931 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
@@ -17,7 +17,7 @@
 package android.hardware.camera2.cts;
 
 import static android.hardware.camera2.cts.CameraTestUtils.*;
-import static android.hardware.camera2.cts.RobustnessTest.MaxOutputSizes.*;
+import static android.hardware.camera2.cts.RobustnessTest.MaxStreamSizes.*;
 
 import android.content.Context;
 import android.graphics.ImageFormat;
@@ -27,20 +27,25 @@
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CameraManager;
 import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
 import android.hardware.camera2.TotalCaptureResult;
 import android.hardware.camera2.CaptureFailure;
+import android.hardware.camera2.params.InputConfiguration;
 import android.hardware.camera2.params.StreamConfigurationMap;
 import android.hardware.camera2.cts.helpers.StaticMetadata;
 import android.hardware.camera2.cts.testcases.Camera2AndroidTestCase;
 import android.media.CamcorderProfile;
 import android.media.Image;
 import android.media.ImageReader;
+import android.media.ImageWriter;
 import android.util.Log;
 import android.util.Size;
 import android.view.Display;
 import android.view.Surface;
 import android.view.WindowManager;
 
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
+
 import java.util.Arrays;
 import java.util.ArrayList;
 import java.util.List;
@@ -53,10 +58,17 @@
  */
 public class RobustnessTest extends Camera2AndroidTestCase {
     private static final String TAG = "RobustnessTest";
+    private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
 
     private static final int CONFIGURE_TIMEOUT = 5000; //ms
     private static final int CAPTURE_TIMEOUT = 1000; //ms
 
+    // For testTriggerInteractions
+    private static final int PREVIEW_WARMUP_FRAMES = 60;
+    private static final int MAX_RESULT_STATE_CHANGE_WAIT_FRAMES = 100;
+    private static final int MAX_TRIGGER_SEQUENCE_FRAMES = 180; // 6 sec at 30 fps
+    private static final int MAX_RESULT_STATE_POSTCHANGE_WAIT_FRAMES = 10;
+
     /**
      * Test that a {@link CameraCaptureSession} can be configured with a {@link Surface} containing
      * a dimension other than one of the supported output dimensions.  The buffers produced into
@@ -69,10 +81,17 @@
                 Log.i(TAG, "Testing Camera " + id);
                 openDevice(id);
 
+                List<Size> testSizes = null;
+                int format = mStaticInfo.isColorOutputSupported() ?
+                    ImageFormat.YUV_420_888 : ImageFormat.DEPTH16;
+
+                testSizes = CameraTestUtils.getSortedSizesForFormat(id, mCameraManager,
+                        format, null);
+
                 // Find some size not supported by the camera
                 Size weirdSize = new Size(643, 577);
                 int count = 0;
-                while(mOrderedPreviewSizes.contains(weirdSize)) {
+                while(testSizes.contains(weirdSize)) {
                     // Really, they can't all be supported...
                     weirdSize = new Size(weirdSize.getWidth() + 1, weirdSize.getHeight() + 1);
                     count++;
@@ -81,7 +100,7 @@
 
                 // Setup imageReader with invalid dimension
                 ImageReader imageReader = ImageReader.newInstance(weirdSize.getWidth(),
-                        weirdSize.getHeight(), ImageFormat.YUV_420_888, 3);
+                        weirdSize.getHeight(), format, 3);
 
                 // Setup ImageReaderListener
                 SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
@@ -126,7 +145,7 @@
                 Size actualSize = new Size(imageWidth, imageHeight);
 
                 assertTrue("Camera does not contain outputted image resolution " + actualSize,
-                        mOrderedPreviewSizes.contains(actualSize));
+                        testSizes.contains(actualSize));
             } finally {
                 closeDevice(id);
             }
@@ -147,7 +166,7 @@
          * Each row of the table is a set of (format, max resolution) pairs, using the below consts
          */
 
-        // Enum values are defined in MaxOutputSizes
+        // Enum values are defined in MaxStreamSizes
         final int[][] LEGACY_COMBINATIONS = {
             {PRIV, MAXIMUM}, // Simple preview, GPU video processing, or no-preview video recording
             {JPEG, MAXIMUM}, // No-viewfinder still image capture
@@ -194,9 +213,813 @@
         final int[][][] TABLES =
             { LEGACY_COMBINATIONS, LIMITED_COMBINATIONS, BURST_COMBINATIONS, FULL_COMBINATIONS, RAW_COMBINATIONS };
 
-        // Sanity check the tables
+        sanityCheckConfigurationTables(TABLES);
+
+        for (String id : mCameraIds) {
+            openDevice(id);
+
+            // Find the concrete max sizes for each format/resolution combination
+            MaxStreamSizes maxSizes = new MaxStreamSizes(mStaticInfo, id, getContext());
+
+            String streamConfigurationMapString =
+                    mStaticInfo.getCharacteristics().get(
+                            CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).toString();
+            if (VERBOSE) {
+                Log.v(TAG, "StreamConfigurationMap: " + streamConfigurationMapString);
+            }
+
+            // Always run legacy-level tests for color-supporting devices
+
+            if (mStaticInfo.isColorOutputSupported()) {
+                for (int[] config : LEGACY_COMBINATIONS) {
+                    testOutputCombination(id, config, maxSizes);
+                }
+            }
+
+            // Then run higher-level tests if applicable
+
+            if (!mStaticInfo.isHardwareLevelLegacy()) {
+
+                // If not legacy, at least limited, so run limited-level tests
+
+                if (mStaticInfo.isColorOutputSupported()) {
+                    for (int[] config : LIMITED_COMBINATIONS) {
+                        testOutputCombination(id, config, maxSizes);
+                    }
+                }
+
+                // Check for BURST_CAPTURE, FULL and RAW and run those if appropriate
+
+                if (mStaticInfo.isCapabilitySupported(
+                        CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE)) {
+                    for (int[] config : BURST_COMBINATIONS) {
+                        testOutputCombination(id, config, maxSizes);
+                    }
+                }
+
+                if (mStaticInfo.isHardwareLevelFull()) {
+                    for (int[] config : FULL_COMBINATIONS) {
+                        testOutputCombination(id, config, maxSizes);
+                    }
+                }
+
+                if (mStaticInfo.isCapabilitySupported(
+                        CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW)) {
+                    for (int[] config : RAW_COMBINATIONS) {
+                        testOutputCombination(id, config, maxSizes);
+                    }
+                }
+            }
+
+            closeDevice(id);
+        }
+    }
+
+    /**
+     * Test for making sure the required reprocess input/output combinations for each hardware
+     * level and capability work as expected.
+     */
+    public void testMandatoryReprocessConfigurations() throws Exception {
+
+        /**
+         * For each stream combination, verify that
+         *    1. A reprocessable session can be created using the stream combination.
+         *    2. Reprocess capture requests targeting YUV and JPEG outputs are successful.
+         */
+        final int[][] LIMITED_COMBINATIONS = {
+            // Input        Outputs
+            {PRIV, MAXIMUM, JPEG, MAXIMUM},
+            {YUV , MAXIMUM, JPEG, MAXIMUM},
+            {PRIV, MAXIMUM, PRIV, PREVIEW, JPEG, MAXIMUM},
+            {YUV , MAXIMUM, PRIV, PREVIEW, JPEG, MAXIMUM},
+            {PRIV, MAXIMUM, YUV , PREVIEW, JPEG, MAXIMUM},
+            {YUV , MAXIMUM, YUV , PREVIEW, JPEG, MAXIMUM},
+            {PRIV, MAXIMUM, YUV , PREVIEW, YUV , PREVIEW, JPEG, MAXIMUM},
+            {YUV,  MAXIMUM, YUV , PREVIEW, YUV , PREVIEW, JPEG, MAXIMUM},
+        };
+
+        final int[][] FULL_COMBINATIONS = {
+            // Input        Outputs
+            {YUV , MAXIMUM, PRIV, PREVIEW},
+            {YUV , MAXIMUM, YUV , PREVIEW},
+            {PRIV, MAXIMUM, PRIV, PREVIEW, YUV , RECORD},
+            {YUV , MAXIMUM, PRIV, PREVIEW, YUV , RECORD},
+            {PRIV, MAXIMUM, PRIV, PREVIEW, YUV , MAXIMUM},
+            {PRIV, MAXIMUM, YUV , PREVIEW, YUV , MAXIMUM},
+            {PRIV, MAXIMUM, PRIV, PREVIEW, YUV , PREVIEW, JPEG, MAXIMUM},
+            {YUV , MAXIMUM, PRIV, PREVIEW, YUV , PREVIEW, JPEG, MAXIMUM},
+        };
+
+        final int[][] RAW_COMBINATIONS = {
+            // Input        Outputs
+            {PRIV, MAXIMUM, YUV , PREVIEW, RAW , MAXIMUM},
+            {YUV , MAXIMUM, YUV , PREVIEW, RAW , MAXIMUM},
+            {PRIV, MAXIMUM, PRIV, PREVIEW, YUV , PREVIEW, RAW , MAXIMUM},
+            {YUV , MAXIMUM, PRIV, PREVIEW, YUV , PREVIEW, RAW , MAXIMUM},
+            {PRIV, MAXIMUM, YUV , PREVIEW, YUV , PREVIEW, RAW , MAXIMUM},
+            {YUV , MAXIMUM, YUV , PREVIEW, YUV , PREVIEW, RAW , MAXIMUM},
+            {PRIV, MAXIMUM, PRIV, PREVIEW, JPEG, MAXIMUM, RAW , MAXIMUM},
+            {YUV , MAXIMUM, PRIV, PREVIEW, JPEG, MAXIMUM, RAW , MAXIMUM},
+            {PRIV, MAXIMUM, YUV , PREVIEW, JPEG, MAXIMUM, RAW , MAXIMUM},
+            {YUV , MAXIMUM, YUV , PREVIEW, JPEG, MAXIMUM, RAW , MAXIMUM},
+        };
+
+        final int[][][] TABLES =
+                { LIMITED_COMBINATIONS, FULL_COMBINATIONS, RAW_COMBINATIONS };
+
+        sanityCheckConfigurationTables(TABLES);
+
+        for (String id : mCameraIds) {
+            CameraCharacteristics cc = mCameraManager.getCameraCharacteristics(id);
+            StaticMetadata staticInfo = new StaticMetadata(cc);
+            MaxStreamSizes maxSizes = new MaxStreamSizes(staticInfo, id, getContext());
+
+            // Skip the test for legacy devices.
+            if (staticInfo.isHardwareLevelLegacy()) {
+                continue;
+            }
+
+            openDevice(id);
+
+            try {
+                for (int[] config : LIMITED_COMBINATIONS) {
+                    testReprocessStreamCombination(id, config, maxSizes, staticInfo);
+                }
+
+                // Check FULL devices
+                if (staticInfo.isHardwareLevelFull()) {
+                    for (int[] config : FULL_COMBINATIONS) {
+                        testReprocessStreamCombination(id, config, maxSizes, staticInfo);
+                    }
+                }
+
+                // Check devices with RAW capability.
+                if (staticInfo.isCapabilitySupported(
+                        CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW)) {
+                    for (int[] config : RAW_COMBINATIONS) {
+                        testReprocessStreamCombination(id, config, maxSizes, staticInfo);
+                    }
+                }
+            } finally {
+                closeDevice(id);
+            }
+        }
+    }
+
+    public void testBasicTriggerSequence() throws Exception {
+
+        for (String id : mCameraIds) {
+            Log.i(TAG, String.format("Testing Camera %s", id));
+
+            openDevice(id);
+            try {
+                // Legacy devices do not support precapture trigger; don't test devices that
+                // can't focus
+                if (mStaticInfo.isHardwareLevelLegacy() || !mStaticInfo.hasFocuser()) {
+                    continue;
+                }
+                // Depth-only devices won't support AE
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
+
+                int[] availableAfModes = mStaticInfo.getCharacteristics().get(
+                    CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES);
+                int[] availableAeModes = mStaticInfo.getCharacteristics().get(
+                    CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES);
+
+                for (int afMode : availableAfModes) {
+
+                    if (afMode == CameraCharacteristics.CONTROL_AF_MODE_OFF ||
+                            afMode == CameraCharacteristics.CONTROL_AF_MODE_EDOF) {
+                        // Only test AF modes that have meaningful trigger behavior
+                        continue;
+                    }
+
+                    for (int aeMode : availableAeModes) {
+                        if (aeMode ==  CameraCharacteristics.CONTROL_AE_MODE_OFF) {
+                            // Only test AE modes that have meaningful trigger behavior
+                            continue;
+                        }
+
+                        SurfaceTexture preview = new SurfaceTexture(/*random int*/ 1);
+
+                        CaptureRequest.Builder previewRequest =
+                                prepareTriggerTestSession(preview, aeMode, afMode);
+
+                        SimpleCaptureCallback captureListener =
+                                new CameraTestUtils.SimpleCaptureCallback();
+
+                        mCameraSession.setRepeatingRequest(previewRequest.build(), captureListener,
+                                mHandler);
+
+                        // Cancel triggers
+
+                        cancelTriggersAndWait(previewRequest, captureListener, afMode);
+
+                        //
+                        // Standard sequence - AF trigger then AE trigger
+
+                        if (VERBOSE) {
+                            Log.v(TAG, String.format("Triggering AF"));
+                        }
+
+                        previewRequest.set(CaptureRequest.CONTROL_AF_TRIGGER,
+                                CaptureRequest.CONTROL_AF_TRIGGER_START);
+                        previewRequest.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
+                                CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_IDLE);
+
+                        CaptureRequest triggerRequest = previewRequest.build();
+                        mCameraSession.capture(triggerRequest, captureListener, mHandler);
+
+                        CaptureResult triggerResult = captureListener.getCaptureResultForRequest(
+                                triggerRequest, MAX_RESULT_STATE_CHANGE_WAIT_FRAMES);
+                        int afState = triggerResult.get(CaptureResult.CONTROL_AF_STATE);
+                        boolean focusComplete = false;
+
+                        for (int i = 0;
+                             i < MAX_TRIGGER_SEQUENCE_FRAMES && !focusComplete;
+                             i++) {
+
+                            focusComplete = verifyAfSequence(afMode, afState, focusComplete);
+
+                            CaptureResult focusResult = captureListener.getCaptureResult(
+                                    CameraTestUtils.CAPTURE_RESULT_TIMEOUT_MS);
+                            afState = focusResult.get(CaptureResult.CONTROL_AF_STATE);
+                        }
+
+                        assertTrue("Focusing never completed!", focusComplete);
+
+                        // Standard sequence - Part 2 AE trigger
+
+                        if (VERBOSE) {
+                            Log.v(TAG, String.format("Triggering AE"));
+                        }
+
+                        previewRequest.set(CaptureRequest.CONTROL_AF_TRIGGER,
+                                CaptureRequest.CONTROL_AF_TRIGGER_IDLE);
+                        previewRequest.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
+                                CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
+
+                        triggerRequest = previewRequest.build();
+                        mCameraSession.capture(triggerRequest, captureListener, mHandler);
+
+                        triggerResult = captureListener.getCaptureResultForRequest(
+                                triggerRequest, MAX_RESULT_STATE_CHANGE_WAIT_FRAMES);
+
+                        int aeState = triggerResult.get(CaptureResult.CONTROL_AE_STATE);
+
+                        boolean precaptureComplete = false;
+
+                        for (int i = 0;
+                             i < MAX_TRIGGER_SEQUENCE_FRAMES && !precaptureComplete;
+                             i++) {
+
+                            precaptureComplete = verifyAeSequence(aeState, precaptureComplete);
+
+                            CaptureResult precaptureResult = captureListener.getCaptureResult(
+                                CameraTestUtils.CAPTURE_RESULT_TIMEOUT_MS);
+                            aeState = precaptureResult.get(CaptureResult.CONTROL_AE_STATE);
+                        }
+
+                        assertTrue("Precapture sequence never completed!", precaptureComplete);
+
+                        for (int i = 0; i < MAX_RESULT_STATE_POSTCHANGE_WAIT_FRAMES; i++) {
+                            CaptureResult postPrecaptureResult = captureListener.getCaptureResult(
+                                CameraTestUtils.CAPTURE_RESULT_TIMEOUT_MS);
+                            aeState = postPrecaptureResult.get(CaptureResult.CONTROL_AE_STATE);
+                            assertTrue("Late transition to PRECAPTURE state seen",
+                                    aeState != CaptureResult.CONTROL_AE_STATE_PRECAPTURE);
+                        }
+
+                        // Done
+
+                        stopCapture(/*fast*/ false);
+                        preview.release();
+                    }
+
+                }
+
+            } finally {
+                closeDevice(id);
+            }
+        }
+
+    }
+
+    public void testSimultaneousTriggers() throws Exception {
+        for (String id : mCameraIds) {
+            Log.i(TAG, String.format("Testing Camera %s", id));
+
+            openDevice(id);
+            try {
+                // Legacy devices do not support precapture trigger; don't test devices that
+                // can't focus
+                if (mStaticInfo.isHardwareLevelLegacy() || !mStaticInfo.hasFocuser()) {
+                    continue;
+                }
+                // Depth-only devices won't support AE
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
+
+                int[] availableAfModes = mStaticInfo.getCharacteristics().get(
+                    CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES);
+                int[] availableAeModes = mStaticInfo.getCharacteristics().get(
+                    CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES);
+
+                for (int afMode : availableAfModes) {
+
+                    if (afMode == CameraCharacteristics.CONTROL_AF_MODE_OFF ||
+                            afMode == CameraCharacteristics.CONTROL_AF_MODE_EDOF) {
+                        // Only test AF modes that have meaningful trigger behavior
+                        continue;
+                    }
+
+                    for (int aeMode : availableAeModes) {
+                        if (aeMode ==  CameraCharacteristics.CONTROL_AE_MODE_OFF) {
+                            // Only test AE modes that have meaningful trigger behavior
+                            continue;
+                        }
+
+                        SurfaceTexture preview = new SurfaceTexture(/*random int*/ 1);
+
+                        CaptureRequest.Builder previewRequest =
+                                prepareTriggerTestSession(preview, aeMode, afMode);
+
+                        SimpleCaptureCallback captureListener =
+                                new CameraTestUtils.SimpleCaptureCallback();
+
+                        mCameraSession.setRepeatingRequest(previewRequest.build(), captureListener,
+                                mHandler);
+
+                        // Cancel triggers
+
+                        cancelTriggersAndWait(previewRequest, captureListener, afMode);
+
+                        //
+                        // Trigger AF and AE together
+
+                        if (VERBOSE) {
+                            Log.v(TAG, String.format("Triggering AF and AE together"));
+                        }
+
+                        previewRequest.set(CaptureRequest.CONTROL_AF_TRIGGER,
+                                CaptureRequest.CONTROL_AF_TRIGGER_START);
+                        previewRequest.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
+                                CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
+
+                        CaptureRequest triggerRequest = previewRequest.build();
+                        mCameraSession.capture(triggerRequest, captureListener, mHandler);
+
+                        CaptureResult triggerResult = captureListener.getCaptureResultForRequest(
+                                triggerRequest, MAX_RESULT_STATE_CHANGE_WAIT_FRAMES);
+                        int aeState = triggerResult.get(CaptureResult.CONTROL_AE_STATE);
+                        int afState = triggerResult.get(CaptureResult.CONTROL_AF_STATE);
+
+                        boolean precaptureComplete = false;
+                        boolean focusComplete = false;
+
+                        for (int i = 0;
+                             i < MAX_TRIGGER_SEQUENCE_FRAMES &&
+                                     !(focusComplete && precaptureComplete);
+                             i++) {
+
+                            focusComplete = verifyAfSequence(afMode, afState, focusComplete);
+                            precaptureComplete = verifyAeSequence(aeState, precaptureComplete);
+
+                            CaptureResult sequenceResult = captureListener.getCaptureResult(
+                                    CameraTestUtils.CAPTURE_RESULT_TIMEOUT_MS);
+                            afState = sequenceResult.get(CaptureResult.CONTROL_AF_STATE);
+                            aeState = sequenceResult.get(CaptureResult.CONTROL_AE_STATE);
+                        }
+
+                        assertTrue("Precapture sequence never completed!", precaptureComplete);
+                        assertTrue("Focus sequence never completed!", focusComplete);
+
+                        // Done
+
+                        stopCapture(/*fast*/ false);
+                        preview.release();
+
+                    }
+                }
+            } finally {
+                closeDevice(id);
+            }
+        }
+    }
+
+    public void testAfThenAeTrigger() throws Exception {
+        for (String id : mCameraIds) {
+            Log.i(TAG, String.format("Testing Camera %s", id));
+
+            openDevice(id);
+            try {
+                // Legacy devices do not support precapture trigger; don't test devices that
+                // can't focus
+                if (mStaticInfo.isHardwareLevelLegacy() || !mStaticInfo.hasFocuser()) {
+                    continue;
+                }
+                // Depth-only devices won't support AE
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
+
+                int[] availableAfModes = mStaticInfo.getCharacteristics().get(
+                    CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES);
+                int[] availableAeModes = mStaticInfo.getCharacteristics().get(
+                    CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES);
+
+                for (int afMode : availableAfModes) {
+
+                    if (afMode == CameraCharacteristics.CONTROL_AF_MODE_OFF ||
+                            afMode == CameraCharacteristics.CONTROL_AF_MODE_EDOF) {
+                        // Only test AF modes that have meaningful trigger behavior
+                        continue;
+                    }
+
+                    for (int aeMode : availableAeModes) {
+                        if (aeMode ==  CameraCharacteristics.CONTROL_AE_MODE_OFF) {
+                            // Only test AE modes that have meaningful trigger behavior
+                            continue;
+                        }
+
+                        SurfaceTexture preview = new SurfaceTexture(/*random int*/ 1);
+
+                        CaptureRequest.Builder previewRequest =
+                                prepareTriggerTestSession(preview, aeMode, afMode);
+
+                        SimpleCaptureCallback captureListener =
+                                new CameraTestUtils.SimpleCaptureCallback();
+
+                        mCameraSession.setRepeatingRequest(previewRequest.build(), captureListener,
+                                mHandler);
+
+                        // Cancel triggers
+
+                        cancelTriggersAndWait(previewRequest, captureListener, afMode);
+
+                        //
+                        // AF with AE a request later
+
+                        if (VERBOSE) {
+                            Log.v(TAG, "Trigger AF, then AE trigger on next request");
+                        }
+
+                        previewRequest.set(CaptureRequest.CONTROL_AF_TRIGGER,
+                                CaptureRequest.CONTROL_AF_TRIGGER_START);
+                        previewRequest.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
+                                CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_IDLE);
+
+                        CaptureRequest triggerRequest = previewRequest.build();
+                        mCameraSession.capture(triggerRequest, captureListener, mHandler);
+
+                        previewRequest.set(CaptureRequest.CONTROL_AF_TRIGGER,
+                                CaptureRequest.CONTROL_AF_TRIGGER_IDLE);
+                        previewRequest.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
+                                CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
+
+                        CaptureRequest triggerRequest2 = previewRequest.build();
+                        mCameraSession.capture(triggerRequest2, captureListener, mHandler);
+
+                        CaptureResult triggerResult = captureListener.getCaptureResultForRequest(
+                                triggerRequest, MAX_RESULT_STATE_CHANGE_WAIT_FRAMES);
+                        int afState = triggerResult.get(CaptureResult.CONTROL_AF_STATE);
+
+                        boolean precaptureComplete = false;
+                        boolean focusComplete = false;
+
+                        focusComplete = verifyAfSequence(afMode, afState, focusComplete);
+
+                        triggerResult = captureListener.getCaptureResultForRequest(
+                                triggerRequest2, MAX_RESULT_STATE_CHANGE_WAIT_FRAMES);
+                        afState = triggerResult.get(CaptureResult.CONTROL_AF_STATE);
+                        int aeState = triggerResult.get(CaptureResult.CONTROL_AE_STATE);
+
+                        for (int i = 0;
+                             i < MAX_TRIGGER_SEQUENCE_FRAMES &&
+                                     !(focusComplete && precaptureComplete);
+                             i++) {
+
+                            focusComplete = verifyAfSequence(afMode, afState, focusComplete);
+                            precaptureComplete = verifyAeSequence(aeState, precaptureComplete);
+
+                            CaptureResult sequenceResult = captureListener.getCaptureResult(
+                                    CameraTestUtils.CAPTURE_RESULT_TIMEOUT_MS);
+                            afState = sequenceResult.get(CaptureResult.CONTROL_AF_STATE);
+                            aeState = sequenceResult.get(CaptureResult.CONTROL_AE_STATE);
+                        }
+
+                        assertTrue("Precapture sequence never completed!", precaptureComplete);
+                        assertTrue("Focus sequence never completed!", focusComplete);
+
+                        // Done
+
+                        stopCapture(/*fast*/ false);
+                        preview.release();
+
+                    }
+                }
+            } finally {
+                closeDevice(id);
+            }
+        }
+    }
+
+    public void testAeThenAfTrigger() throws Exception {
+        for (String id : mCameraIds) {
+            Log.i(TAG, String.format("Testing Camera %s", id));
+
+            openDevice(id);
+            try {
+                // Legacy devices do not support precapture trigger; don't test devices that
+                // can't focus
+                if (mStaticInfo.isHardwareLevelLegacy() || !mStaticInfo.hasFocuser()) {
+                    continue;
+                }
+                // Depth-only devices won't support AE
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
+
+                int[] availableAfModes = mStaticInfo.getCharacteristics().get(
+                    CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES);
+                int[] availableAeModes = mStaticInfo.getCharacteristics().get(
+                    CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES);
+
+                for (int afMode : availableAfModes) {
+
+                    if (afMode == CameraCharacteristics.CONTROL_AF_MODE_OFF ||
+                            afMode == CameraCharacteristics.CONTROL_AF_MODE_EDOF) {
+                        // Only test AF modes that have meaningful trigger behavior
+                        continue;
+                    }
+
+                    for (int aeMode : availableAeModes) {
+                        if (aeMode ==  CameraCharacteristics.CONTROL_AE_MODE_OFF) {
+                            // Only test AE modes that have meaningful trigger behavior
+                            continue;
+                        }
+
+                        SurfaceTexture preview = new SurfaceTexture(/*random int*/ 1);
+
+                        CaptureRequest.Builder previewRequest =
+                                prepareTriggerTestSession(preview, aeMode, afMode);
+
+                        SimpleCaptureCallback captureListener =
+                                new CameraTestUtils.SimpleCaptureCallback();
+
+                        mCameraSession.setRepeatingRequest(previewRequest.build(), captureListener,
+                                mHandler);
+
+                        // Cancel triggers
+
+                        cancelTriggersAndWait(previewRequest, captureListener, afMode);
+
+                        //
+                        // AE with AF a request later
+
+                        if (VERBOSE) {
+                            Log.v(TAG, "Trigger AE, then AF trigger on next request");
+                        }
+
+                        previewRequest.set(CaptureRequest.CONTROL_AF_TRIGGER,
+                                CaptureRequest.CONTROL_AF_TRIGGER_IDLE);
+                        previewRequest.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
+                                CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
+
+                        CaptureRequest triggerRequest = previewRequest.build();
+                        mCameraSession.capture(triggerRequest, captureListener, mHandler);
+
+                        previewRequest.set(CaptureRequest.CONTROL_AF_TRIGGER,
+                                CaptureRequest.CONTROL_AF_TRIGGER_START);
+                        previewRequest.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
+                                CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_IDLE);
+
+                        CaptureRequest triggerRequest2 = previewRequest.build();
+                        mCameraSession.capture(triggerRequest2, captureListener, mHandler);
+
+                        CaptureResult triggerResult = captureListener.getCaptureResultForRequest(
+                                triggerRequest, MAX_RESULT_STATE_CHANGE_WAIT_FRAMES);
+                        int aeState = triggerResult.get(CaptureResult.CONTROL_AE_STATE);
+
+                        boolean precaptureComplete = false;
+                        boolean focusComplete = false;
+
+                        precaptureComplete = verifyAeSequence(aeState, precaptureComplete);
+
+                        triggerResult = captureListener.getCaptureResultForRequest(
+                                triggerRequest2, MAX_RESULT_STATE_CHANGE_WAIT_FRAMES);
+                        int afState = triggerResult.get(CaptureResult.CONTROL_AF_STATE);
+                        aeState = triggerResult.get(CaptureResult.CONTROL_AE_STATE);
+
+                        for (int i = 0;
+                             i < MAX_TRIGGER_SEQUENCE_FRAMES &&
+                                     !(focusComplete && precaptureComplete);
+                             i++) {
+
+                            focusComplete = verifyAfSequence(afMode, afState, focusComplete);
+                            precaptureComplete = verifyAeSequence(aeState, precaptureComplete);
+
+                            CaptureResult sequenceResult = captureListener.getCaptureResult(
+                                    CameraTestUtils.CAPTURE_RESULT_TIMEOUT_MS);
+                            afState = sequenceResult.get(CaptureResult.CONTROL_AF_STATE);
+                            aeState = sequenceResult.get(CaptureResult.CONTROL_AE_STATE);
+                        }
+
+                        assertTrue("Precapture sequence never completed!", precaptureComplete);
+                        assertTrue("Focus sequence never completed!", focusComplete);
+
+                        // Done
+
+                        stopCapture(/*fast*/ false);
+                        preview.release();
+
+                    }
+                }
+            } finally {
+                closeDevice(id);
+            }
+        }
+    }
+
+    private CaptureRequest.Builder prepareTriggerTestSession(
+            SurfaceTexture preview, int aeMode, int afMode) throws Exception {
+        Log.i(TAG, String.format("Testing AE mode %s, AF mode %s",
+                        StaticMetadata.AE_MODE_NAMES[aeMode],
+                        StaticMetadata.AF_MODE_NAMES[afMode]));
+
+
+        Surface previewSurface = new Surface(preview);
+
+        preview.setDefaultBufferSize(640, 480);
+
+        ArrayList<Surface> sessionOutputs = new ArrayList<>();
+        sessionOutputs.add(previewSurface);
+
+        createSession(sessionOutputs);
+
+        CaptureRequest.Builder previewRequest =
+                mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
+
+        previewRequest.addTarget(previewSurface);
+
+        previewRequest.set(CaptureRequest.CONTROL_AE_MODE, aeMode);
+        previewRequest.set(CaptureRequest.CONTROL_AF_MODE, afMode);
+
+        return previewRequest;
+    }
+
+    private void cancelTriggersAndWait(CaptureRequest.Builder previewRequest,
+            SimpleCaptureCallback captureListener, int afMode) throws Exception {
+        previewRequest.set(CaptureRequest.CONTROL_AF_TRIGGER,
+                CaptureRequest.CONTROL_AF_TRIGGER_CANCEL);
+        previewRequest.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
+                CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL);
+
+        CaptureRequest triggerRequest = previewRequest.build();
+        mCameraSession.capture(triggerRequest, captureListener, mHandler);
+
+        // Wait for a few frames to initialize 3A
+
+        CaptureResult previewResult = null;
+        int afState;
+        int aeState;
+
+        for (int i = 0; i < PREVIEW_WARMUP_FRAMES; i++) {
+            previewResult = captureListener.getCaptureResult(
+                    CameraTestUtils.CAPTURE_RESULT_TIMEOUT_MS);
+            if (VERBOSE) {
+                afState = previewResult.get(CaptureResult.CONTROL_AF_STATE);
+                aeState = previewResult.get(CaptureResult.CONTROL_AE_STATE);
+                Log.v(TAG, String.format("AF state: %s, AE state: %s",
+                                StaticMetadata.AF_STATE_NAMES[afState],
+                                StaticMetadata.AE_STATE_NAMES[aeState]));
+            }
+        }
+
+        // Verify starting states
+
+        afState = previewResult.get(CaptureResult.CONTROL_AF_STATE);
+        aeState = previewResult.get(CaptureResult.CONTROL_AE_STATE);
+
+        switch (afMode) {
+            case CaptureResult.CONTROL_AF_MODE_AUTO:
+            case CaptureResult.CONTROL_AF_MODE_MACRO:
+                assertTrue(String.format("AF state not INACTIVE, is %s",
+                                StaticMetadata.AF_STATE_NAMES[afState]),
+                        afState == CaptureResult.CONTROL_AF_STATE_INACTIVE);
+                break;
+            case CaptureResult.CONTROL_AF_MODE_CONTINUOUS_PICTURE:
+            case CaptureResult.CONTROL_AF_MODE_CONTINUOUS_VIDEO:
+                // After several frames, AF must no longer be in INACTIVE state
+                assertTrue(String.format("In AF mode %s, AF state not PASSIVE_SCAN" +
+                                ", PASSIVE_FOCUSED, or PASSIVE_UNFOCUSED, is %s",
+                                StaticMetadata.AF_MODE_NAMES[afMode],
+                                StaticMetadata.AF_STATE_NAMES[afState]),
+                        afState == CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN ||
+                        afState == CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED ||
+                        afState == CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED);
+                break;
+            default:
+                fail("unexpected af mode");
+        }
+
+        // After several frames, AE must no longer be in INACTIVE state
+        assertTrue(String.format("AE state must be SEARCHING, CONVERGED, " +
+                        "or FLASH_REQUIRED, is %s", StaticMetadata.AE_STATE_NAMES[aeState]),
+                aeState == CaptureResult.CONTROL_AE_STATE_SEARCHING ||
+                aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED ||
+                aeState == CaptureResult.CONTROL_AE_STATE_FLASH_REQUIRED);
+    }
+
+    private boolean verifyAfSequence(int afMode, int afState, boolean focusComplete) {
+        if (focusComplete) {
+            assertTrue(String.format("AF Mode %s: Focus lock lost after convergence: AF state: %s",
+                            StaticMetadata.AF_MODE_NAMES[afMode],
+                            StaticMetadata.AF_STATE_NAMES[afState]),
+                    afState == CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED ||
+                    afState ==CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
+            return focusComplete;
+        }
+        if (VERBOSE) {
+            Log.v(TAG, String.format("AF mode: %s, AF state: %s",
+                            StaticMetadata.AF_MODE_NAMES[afMode],
+                            StaticMetadata.AF_STATE_NAMES[afState]));
+        }
+        switch (afMode) {
+            case CaptureResult.CONTROL_AF_MODE_AUTO:
+            case CaptureResult.CONTROL_AF_MODE_MACRO:
+                assertTrue(String.format("AF mode %s: Unexpected AF state %s",
+                                StaticMetadata.AF_MODE_NAMES[afMode],
+                                StaticMetadata.AF_STATE_NAMES[afState]),
+                        afState == CaptureResult.CONTROL_AF_STATE_ACTIVE_SCAN ||
+                        afState == CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED ||
+                        afState == CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
+                focusComplete =
+                        (afState != CaptureResult.CONTROL_AF_STATE_ACTIVE_SCAN);
+                break;
+            case CaptureResult.CONTROL_AF_MODE_CONTINUOUS_PICTURE:
+                assertTrue(String.format("AF mode %s: Unexpected AF state %s",
+                                StaticMetadata.AF_MODE_NAMES[afMode],
+                                StaticMetadata.AF_STATE_NAMES[afState]),
+                        afState == CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN ||
+                        afState == CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED ||
+                        afState == CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
+                focusComplete =
+                        (afState != CaptureResult.CONTROL_AF_STATE_PASSIVE_SCAN);
+                break;
+            case CaptureResult.CONTROL_AF_MODE_CONTINUOUS_VIDEO:
+                assertTrue(String.format("AF mode %s: Unexpected AF state %s",
+                                StaticMetadata.AF_MODE_NAMES[afMode],
+                                StaticMetadata.AF_STATE_NAMES[afState]),
+                        afState == CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED ||
+                        afState == CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
+                focusComplete = true;
+                break;
+            default:
+                fail("Unexpected AF mode: " + StaticMetadata.AF_MODE_NAMES[afMode]);
+        }
+        return focusComplete;
+    }
+
+    private boolean verifyAeSequence(int aeState, boolean precaptureComplete) {
+        if (precaptureComplete) {
+            assertTrue("Precapture state seen after convergence",
+                    aeState != CaptureResult.CONTROL_AE_STATE_PRECAPTURE);
+            return precaptureComplete;
+        }
+        if (VERBOSE) {
+            Log.v(TAG, String.format("AE state: %s", StaticMetadata.AE_STATE_NAMES[aeState]));
+        }
+        switch (aeState) {
+            case CaptureResult.CONTROL_AE_STATE_PRECAPTURE:
+                // scan still continuing
+                break;
+            case CaptureResult.CONTROL_AE_STATE_CONVERGED:
+            case CaptureResult.CONTROL_AE_STATE_FLASH_REQUIRED:
+                // completed
+                precaptureComplete = true;
+                break;
+            default:
+                fail(String.format("Precapture sequence transitioned to "
+                                + "state %s incorrectly!", StaticMetadata.AE_STATE_NAMES[aeState]));
+                break;
+        }
+        return precaptureComplete;
+    }
+
+    /**
+     * Sanity check the configuration tables.
+     */
+    private void sanityCheckConfigurationTables(final int[][][] tables) throws Exception {
         int tableIdx = 0;
-        for (int[][] table : TABLES) {
+        for (int[][] table : tables) {
             int rowIdx = 0;
             for (int[] row : table) {
                 assertTrue(String.format("Odd number of entries for table %d row %d: %s ",
@@ -217,68 +1040,14 @@
             }
             tableIdx++;
         }
-
-        for (String id : mCameraIds) {
-
-            // Find the concrete max sizes for each format/resolution combination
-
-            CameraCharacteristics cc = mCameraManager.getCameraCharacteristics(id);
-
-            MaxOutputSizes maxSizes = new MaxOutputSizes(cc, id, getContext());
-
-            final StaticMetadata staticInfo = new StaticMetadata(cc);
-
-            openDevice(id);
-
-            // Always run legacy-level tests
-
-            for (int[] config : LEGACY_COMBINATIONS) {
-                testOutputCombination(id, config, maxSizes);
-            }
-
-            // Then run higher-level tests if applicable
-
-            if (!staticInfo.isHardwareLevelLegacy()) {
-
-                // If not legacy, at least limited, so run limited-level tests
-
-                for (int[] config : LIMITED_COMBINATIONS) {
-                    testOutputCombination(id, config, maxSizes);
-                }
-
-                // Check for BURST_CAPTURE, FULL and RAW and run those if appropriate
-
-                if (staticInfo.isCapabilitySupported(
-                        CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE)) {
-                    for (int[] config : BURST_COMBINATIONS) {
-                        testOutputCombination(id, config, maxSizes);
-                    }
-                }
-
-                if (staticInfo.isHardwareLevelFull()) {
-                    for (int[] config : FULL_COMBINATIONS) {
-                        testOutputCombination(id, config, maxSizes);
-                    }
-                }
-
-                if (staticInfo.isCapabilitySupported(
-                        CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW)) {
-                    for (int[] config : RAW_COMBINATIONS) {
-                        testOutputCombination(id, config, maxSizes);
-                    }
-                }
-            }
-
-            closeDevice(id);
-        }
     }
 
     /**
      * Simple holder for resolutions to use for different camera outputs and size limits.
      */
-    static class MaxOutputSizes {
+    static class MaxStreamSizes {
         // Format shorthands
-        static final int PRIV = -1;
+        static final int PRIV = ImageFormat.PRIVATE;
         static final int JPEG = ImageFormat.JPEG;
         static final int YUV  = ImageFormat.YUV_420_888;
         static final int RAW  = ImageFormat.RAW_SENSOR;
@@ -290,153 +1059,311 @@
         static final int VGA = 3;
         static final int RESOLUTION_COUNT = 4;
 
-        public MaxOutputSizes(CameraCharacteristics cc, String cameraId, Context context) {
-            StreamConfigurationMap configs =
-                    cc.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
-            Size[] privSizes = configs.getOutputSizes(SurfaceTexture.class);
-            Size[] yuvSizes = configs.getOutputSizes(ImageFormat.YUV_420_888);
-            Size[] jpegSizes = configs.getOutputSizes(ImageFormat.JPEG);
-            Size[] rawSizes = configs.getOutputSizes(ImageFormat.RAW_SENSOR);
+        public MaxStreamSizes(StaticMetadata sm, String cameraId, Context context) {
+            Size[] privSizes = sm.getAvailableSizesForFormatChecked(ImageFormat.PRIVATE,
+                    StaticMetadata.StreamDirection.Output);
+            Size[] yuvSizes = sm.getAvailableSizesForFormatChecked(ImageFormat.YUV_420_888,
+                    StaticMetadata.StreamDirection.Output);
+            Size[] jpegSizes = sm.getJpegOutputSizesChecked();
+            Size[] rawSizes = sm.getRawOutputSizesChecked();
 
             Size maxPreviewSize = getMaxPreviewSize(context, cameraId);
 
-            maxRawSize = (rawSizes != null) ? CameraTestUtils.getMaxSize(rawSizes) : null;
+            maxRawSize = (rawSizes.length != 0) ? CameraTestUtils.getMaxSize(rawSizes) : null;
 
-            maxPrivSizes[PREVIEW] = getMaxSize(privSizes, maxPreviewSize);
-            maxYuvSizes[PREVIEW]  = getMaxSize(yuvSizes, maxPreviewSize);
-            maxJpegSizes[PREVIEW] = getMaxSize(jpegSizes, maxPreviewSize);
+            if (sm.isColorOutputSupported()) {
+                maxPrivSizes[PREVIEW] = getMaxSize(privSizes, maxPreviewSize);
+                maxYuvSizes[PREVIEW]  = getMaxSize(yuvSizes, maxPreviewSize);
+                maxJpegSizes[PREVIEW] = getMaxSize(jpegSizes, maxPreviewSize);
 
-            maxPrivSizes[RECORD] = getMaxRecordingSize(cameraId);
-            maxYuvSizes[RECORD]  = getMaxRecordingSize(cameraId);
-            maxJpegSizes[RECORD] = getMaxRecordingSize(cameraId);
+                maxPrivSizes[RECORD] = getMaxRecordingSize(cameraId);
+                maxYuvSizes[RECORD]  = getMaxRecordingSize(cameraId);
+                maxJpegSizes[RECORD] = getMaxRecordingSize(cameraId);
 
-            maxPrivSizes[MAXIMUM] = CameraTestUtils.getMaxSize(privSizes);
-            maxYuvSizes[MAXIMUM] = CameraTestUtils.getMaxSize(yuvSizes);
-            maxJpegSizes[MAXIMUM] = CameraTestUtils.getMaxSize(jpegSizes);
+                maxPrivSizes[MAXIMUM] = CameraTestUtils.getMaxSize(privSizes);
+                maxYuvSizes[MAXIMUM] = CameraTestUtils.getMaxSize(yuvSizes);
+                maxJpegSizes[MAXIMUM] = CameraTestUtils.getMaxSize(jpegSizes);
 
-            // Must always be supported, add unconditionally
-            final Size vgaSize = new Size(640, 480);
-            maxPrivSizes[VGA] = vgaSize;
-            maxJpegSizes[VGA] = vgaSize;
-            maxYuvSizes[VGA] = vgaSize;
+                // Must always be supported, add unconditionally
+                final Size vgaSize = new Size(640, 480);
+                maxPrivSizes[VGA] = vgaSize;
+                maxYuvSizes[VGA] = vgaSize;
+                maxJpegSizes[VGA] = vgaSize;
+            }
+
+            StreamConfigurationMap configs = sm.getCharacteristics().get(
+                    CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+            Size[] privInputSizes = configs.getInputSizes(ImageFormat.PRIVATE);
+            maxInputPrivSize = privInputSizes != null ?
+                    CameraTestUtils.getMaxSize(privInputSizes) : null;
+            Size[] yuvInputSizes = configs.getInputSizes(ImageFormat.YUV_420_888);
+            maxInputYuvSize = yuvInputSizes != null ?
+                    CameraTestUtils.getMaxSize(yuvInputSizes) : null;
+
         }
 
         public final Size[] maxPrivSizes = new Size[RESOLUTION_COUNT];
         public final Size[] maxJpegSizes = new Size[RESOLUTION_COUNT];
         public final Size[] maxYuvSizes = new Size[RESOLUTION_COUNT];
         public final Size maxRawSize;
+        // TODO: support non maximum reprocess input.
+        public final Size maxInputPrivSize;
+        public final Size maxInputYuvSize;
 
         static public String configToString(int[] config) {
             StringBuilder b = new StringBuilder("{ ");
             for (int i = 0; i < config.length; i += 2) {
                 int format = config[i];
                 int sizeLimit = config[i + 1];
-                switch (format) {
-                    case PRIV:
-                        b.append("[PRIV, ");
-                        break;
-                    case JPEG:
-                        b.append("[JPEG, ");
-                        break;
-                    case YUV:
-                        b.append("[YUV, ");
-                        break;
-                    case RAW:
-                        b.append("[RAW, ");
-                        break;
-                    default:
-                        b.append("[UNK, ");
-                        break;
-                }
-                switch (sizeLimit) {
-                    case PREVIEW:
-                        b.append("PREVIEW] ");
-                        break;
-                    case RECORD:
-                        b.append("RECORD] ");
-                        break;
-                    case MAXIMUM:
-                        b.append("MAXIMUM] ");
-                        break;
-                    case VGA:
-                        b.append("VGA] ");
-                        break;
-                    default:
-                        b.append("UNK] ");
-                        break;
-                }
+
+                appendFormatSize(b, format, sizeLimit);
+                b.append(" ");
             }
             b.append("}");
             return b.toString();
         }
+
+        static public String reprocessConfigToString(int[] reprocessConfig) {
+            // reprocessConfig[0..1] is the input configuration
+            StringBuilder b = new StringBuilder("Input: ");
+            appendFormatSize(b, reprocessConfig[0], reprocessConfig[1]);
+
+            // reprocessConfig[0..1] is also output configuration to be captured as reprocess input.
+            b.append(", Outputs: { ");
+            for (int i = 0; i < reprocessConfig.length; i += 2) {
+                int format = reprocessConfig[i];
+                int sizeLimit = reprocessConfig[i + 1];
+
+                appendFormatSize(b, format, sizeLimit);
+                b.append(" ");
+            }
+            b.append("}");
+            return b.toString();
+        }
+
+        static private void appendFormatSize(StringBuilder b, int format, int Size) {
+            switch (format) {
+                case PRIV:
+                    b.append("[PRIV, ");
+                    break;
+                case JPEG:
+                    b.append("[JPEG, ");
+                    break;
+                case YUV:
+                    b.append("[YUV, ");
+                    break;
+                case RAW:
+                    b.append("[RAW, ");
+                    break;
+                default:
+                    b.append("[UNK, ");
+                    break;
+            }
+
+            switch (Size) {
+                case PREVIEW:
+                    b.append("PREVIEW]");
+                    break;
+                case RECORD:
+                    b.append("RECORD]");
+                    break;
+                case MAXIMUM:
+                    b.append("MAXIMUM]");
+                    break;
+                case VGA:
+                    b.append("VGA]");
+                    break;
+                default:
+                    b.append("UNK]");
+                    break;
+            }
+        }
     }
 
-    private void testOutputCombination(String cameraId, int[] config, MaxOutputSizes maxSizes)
+    /**
+     * Return an InputConfiguration for a given reprocess configuration.
+     */
+    private InputConfiguration getInputConfig(int[] reprocessConfig, MaxStreamSizes maxSizes) {
+        int format;
+        Size size;
+
+        if (reprocessConfig[1] != MAXIMUM) {
+            throw new IllegalArgumentException("Test only supports MAXIMUM input");
+        }
+
+        switch (reprocessConfig[0]) {
+            case PRIV:
+                format = ImageFormat.PRIVATE;
+                size = maxSizes.maxInputPrivSize;
+                break;
+            case YUV:
+                format = ImageFormat.YUV_420_888;
+                size = maxSizes.maxInputYuvSize;
+                break;
+            default:
+                throw new IllegalArgumentException("Input format not supported: " +
+                        reprocessConfig[0]);
+        }
+
+        return new InputConfiguration(size.getWidth(), size.getHeight(), format);
+    }
+
+    private void testReprocessStreamCombination(String cameraId, int[] reprocessConfig,
+            MaxStreamSizes maxSizes, StaticMetadata staticInfo) throws Exception {
+
+        Log.i(TAG, String.format("Testing Camera %s, reprocess config: %s", cameraId,
+                MaxStreamSizes.reprocessConfigToString(reprocessConfig)));
+
+        final int TIMEOUT_FOR_RESULT_MS = 3000;
+        final int NUM_REPROCESS_CAPTURES_PER_CONFIG = 3;
+
+        List<SurfaceTexture> privTargets = new ArrayList<>();
+        List<ImageReader> jpegTargets = new ArrayList<>();
+        List<ImageReader> yuvTargets = new ArrayList<>();
+        List<ImageReader> rawTargets = new ArrayList<>();
+        List<Surface> outputSurfaces = new ArrayList<>();
+        ImageReader inputReader = null;
+        ImageWriter inputWriter = null;
+        SimpleImageReaderListener inputReaderListener = new SimpleImageReaderListener();
+        SimpleCaptureCallback inputCaptureListener = new SimpleCaptureCallback();
+        SimpleCaptureCallback reprocessOutputCaptureListener = new SimpleCaptureCallback();
+
+        boolean supportYuvReprocess = staticInfo.isCapabilitySupported(
+                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING);
+        boolean supportOpaqueReprocess = staticInfo.isCapabilitySupported(
+                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING);
+
+        // Skip the configuration if the format is not supported for reprocessing.
+        if ((reprocessConfig[0] == YUV && !supportYuvReprocess) ||
+                (reprocessConfig[0] == PRIV && !supportOpaqueReprocess)) {
+            return;
+        }
+
+        try {
+            // reprocessConfig[2..] are additional outputs
+            setupConfigurationTargets(
+                    Arrays.copyOfRange(reprocessConfig, 2, reprocessConfig.length),
+                    maxSizes, privTargets, jpegTargets, yuvTargets, rawTargets, outputSurfaces,
+                    NUM_REPROCESS_CAPTURES_PER_CONFIG);
+
+            // reprocessConfig[0:1] is input
+            InputConfiguration inputConfig = getInputConfig(
+                    Arrays.copyOfRange(reprocessConfig, 0, 2), maxSizes);
+
+            // For each config, YUV and JPEG outputs will be tested. (For YUV reprocessing,
+            // the YUV ImageReader for input is also used for output.)
+            final int totalNumReprocessCaptures =  NUM_REPROCESS_CAPTURES_PER_CONFIG * (
+                    (inputConfig.getFormat() == ImageFormat.YUV_420_888 ? 1 : 0) +
+                    jpegTargets.size() + yuvTargets.size());
+
+            // It needs 1 input buffer for each reprocess capture + the number of buffers
+            // that will be used as outputs.
+            inputReader = ImageReader.newInstance(inputConfig.getWidth(), inputConfig.getHeight(),
+                    inputConfig.getFormat(),
+                    totalNumReprocessCaptures + NUM_REPROCESS_CAPTURES_PER_CONFIG);
+            inputReader.setOnImageAvailableListener(inputReaderListener, mHandler);
+            outputSurfaces.add(inputReader.getSurface());
+
+            // Verify we can create a reprocessable session with the input and all outputs.
+            BlockingSessionCallback sessionListener = new BlockingSessionCallback();
+            CameraCaptureSession session = configureReprocessableCameraSession(mCamera,
+                    inputConfig, outputSurfaces, sessionListener, mHandler);
+            inputWriter = ImageWriter.newInstance(session.getInputSurface(),
+                    totalNumReprocessCaptures);
+
+            // Prepare a request for reprocess input
+            CaptureRequest.Builder builder = mCamera.createCaptureRequest(
+                    CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG);
+            builder.addTarget(inputReader.getSurface());
+
+            for (int i = 0; i < totalNumReprocessCaptures; i++) {
+                session.capture(builder.build(), inputCaptureListener, mHandler);
+            }
+
+            List<CaptureRequest> reprocessRequests = new ArrayList<>();
+            List<Surface> reprocessOutputs = new ArrayList<>();
+            if (inputConfig.getFormat() == ImageFormat.YUV_420_888) {
+                reprocessOutputs.add(inputReader.getSurface());
+            }
+
+            for (ImageReader reader : jpegTargets) {
+                reprocessOutputs.add(reader.getSurface());
+            }
+
+            for (ImageReader reader : yuvTargets) {
+                reprocessOutputs.add(reader.getSurface());
+            }
+
+            for (int i = 0; i < NUM_REPROCESS_CAPTURES_PER_CONFIG; i++) {
+                for (Surface output : reprocessOutputs) {
+                    TotalCaptureResult result = inputCaptureListener.getTotalCaptureResult(
+                            TIMEOUT_FOR_RESULT_MS);
+                    builder =  mCamera.createReprocessCaptureRequest(result);
+                    inputWriter.queueInputImage(
+                            inputReaderListener.getImage(TIMEOUT_FOR_RESULT_MS));
+                    builder.addTarget(output);
+                    reprocessRequests.add(builder.build());
+                }
+            }
+
+            session.captureBurst(reprocessRequests, reprocessOutputCaptureListener, mHandler);
+
+            for (int i = 0; i < reprocessOutputs.size() * NUM_REPROCESS_CAPTURES_PER_CONFIG; i++) {
+                TotalCaptureResult result = reprocessOutputCaptureListener.getTotalCaptureResult(
+                        TIMEOUT_FOR_RESULT_MS);
+            }
+        } catch (Throwable e) {
+            mCollector.addMessage(String.format("Reprocess stream combination %s failed due to: %s",
+                    MaxStreamSizes.reprocessConfigToString(reprocessConfig), e.getMessage()));
+        } finally {
+            inputReaderListener.drain();
+            reprocessOutputCaptureListener.drain();
+
+            for (SurfaceTexture target : privTargets) {
+                target.release();
+            }
+
+            for (ImageReader target : jpegTargets) {
+                target.close();
+            }
+
+            for (ImageReader target : yuvTargets) {
+                target.close();
+            }
+
+            for (ImageReader target : rawTargets) {
+                target.close();
+            }
+
+            if (inputReader != null) {
+                inputReader.close();
+            }
+
+            if (inputWriter != null) {
+                inputWriter.close();
+            }
+        }
+    }
+
+    private void testOutputCombination(String cameraId, int[] config, MaxStreamSizes maxSizes)
             throws Exception {
 
         Log.i(TAG, String.format("Testing Camera %s, config %s",
-                        cameraId, MaxOutputSizes.configToString(config)));
+                        cameraId, MaxStreamSizes.configToString(config)));
 
         // Timeout is relaxed by 500ms for LEGACY devices to reduce false positive rate in CTS
         final int TIMEOUT_FOR_RESULT_MS = (mStaticInfo.isHardwareLevelLegacy()) ? 1500 : 1000;
         final int MIN_RESULT_COUNT = 3;
 
-        ImageDropperListener imageDropperListener = new ImageDropperListener();
         // Set up outputs
-        List<Object> outputTargets = new ArrayList<>();
-        List<Surface> outputSurfaces = new ArrayList<>();
+        List<Surface> outputSurfaces = new ArrayList<Surface>();
         List<SurfaceTexture> privTargets = new ArrayList<SurfaceTexture>();
         List<ImageReader> jpegTargets = new ArrayList<ImageReader>();
         List<ImageReader> yuvTargets = new ArrayList<ImageReader>();
         List<ImageReader> rawTargets = new ArrayList<ImageReader>();
-        for (int i = 0; i < config.length; i += 2) {
-            int format = config[i];
-            int sizeLimit = config[i + 1];
 
-            switch (format) {
-                case PRIV: {
-                    Size targetSize = maxSizes.maxPrivSizes[sizeLimit];
-                    SurfaceTexture target = new SurfaceTexture(/*random int*/1);
-                    target.setDefaultBufferSize(targetSize.getWidth(), targetSize.getHeight());
-                    outputTargets.add(target);
-                    outputSurfaces.add(new Surface(target));
-                    privTargets.add(target);
-                    break;
-                }
-                case JPEG: {
-                    Size targetSize = maxSizes.maxJpegSizes[sizeLimit];
-                    ImageReader target = ImageReader.newInstance(
-                        targetSize.getWidth(), targetSize.getHeight(), JPEG, MIN_RESULT_COUNT);
-                    target.setOnImageAvailableListener(imageDropperListener, mHandler);
-                    outputTargets.add(target);
-                    outputSurfaces.add(target.getSurface());
-                    jpegTargets.add(target);
-                    break;
-                }
-                case YUV: {
-                    Size targetSize = maxSizes.maxYuvSizes[sizeLimit];
-                    ImageReader target = ImageReader.newInstance(
-                        targetSize.getWidth(), targetSize.getHeight(), YUV, MIN_RESULT_COUNT);
-                    target.setOnImageAvailableListener(imageDropperListener, mHandler);
-                    outputTargets.add(target);
-                    outputSurfaces.add(target.getSurface());
-                    yuvTargets.add(target);
-                    break;
-                }
-                case RAW: {
-                    Size targetSize = maxSizes.maxRawSize;
-                    ImageReader target = ImageReader.newInstance(
-                        targetSize.getWidth(), targetSize.getHeight(), RAW, MIN_RESULT_COUNT);
-                    target.setOnImageAvailableListener(imageDropperListener, mHandler);
-                    outputTargets.add(target);
-                    outputSurfaces.add(target.getSurface());
-                    rawTargets.add(target);
-                    break;
-                }
-                default:
-                    fail("Unknown output format " + format);
-            }
-        }
+        setupConfigurationTargets(config, maxSizes, privTargets, jpegTargets, yuvTargets,
+                rawTargets, outputSurfaces, MIN_RESULT_COUNT);
 
         boolean haveSession = false;
         try {
@@ -469,17 +1396,17 @@
 
         } catch (Throwable e) {
             mCollector.addMessage(String.format("Output combination %s failed due to: %s",
-                    MaxOutputSizes.configToString(config), e.getMessage()));
+                    MaxStreamSizes.configToString(config), e.getMessage()));
         }
         if (haveSession) {
             try {
                 Log.i(TAG, String.format("Done with camera %s, config %s, closing session",
-                                cameraId, MaxOutputSizes.configToString(config)));
+                                cameraId, MaxStreamSizes.configToString(config)));
                 stopCapture(/*fast*/false);
             } catch (Throwable e) {
                 mCollector.addMessage(
                     String.format("Closing down for output combination %s failed due to: %s",
-                            MaxOutputSizes.configToString(config), e.getMessage()));
+                            MaxStreamSizes.configToString(config), e.getMessage()));
             }
         }
 
@@ -497,6 +1424,59 @@
         }
     }
 
+    private void setupConfigurationTargets(int[] outputConfigs, MaxStreamSizes maxSizes,
+            List<SurfaceTexture> privTargets, List<ImageReader> jpegTargets,
+            List<ImageReader> yuvTargets, List<ImageReader> rawTargets,
+            List<Surface> outputSurfaces, int numBuffers) {
+
+        ImageDropperListener imageDropperListener = new ImageDropperListener();
+
+        for (int i = 0; i < outputConfigs.length; i += 2) {
+            int format = outputConfigs[i];
+            int sizeLimit = outputConfigs[i + 1];
+
+            switch (format) {
+                case PRIV: {
+                    Size targetSize = maxSizes.maxPrivSizes[sizeLimit];
+                    SurfaceTexture target = new SurfaceTexture(/*random int*/1);
+                    target.setDefaultBufferSize(targetSize.getWidth(), targetSize.getHeight());
+                    outputSurfaces.add(new Surface(target));
+                    privTargets.add(target);
+                    break;
+                }
+                case JPEG: {
+                    Size targetSize = maxSizes.maxJpegSizes[sizeLimit];
+                    ImageReader target = ImageReader.newInstance(
+                        targetSize.getWidth(), targetSize.getHeight(), JPEG, numBuffers);
+                    target.setOnImageAvailableListener(imageDropperListener, mHandler);
+                    outputSurfaces.add(target.getSurface());
+                    jpegTargets.add(target);
+                    break;
+                }
+                case YUV: {
+                    Size targetSize = maxSizes.maxYuvSizes[sizeLimit];
+                    ImageReader target = ImageReader.newInstance(
+                        targetSize.getWidth(), targetSize.getHeight(), YUV, numBuffers);
+                    target.setOnImageAvailableListener(imageDropperListener, mHandler);
+                    outputSurfaces.add(target.getSurface());
+                    yuvTargets.add(target);
+                    break;
+                }
+                case RAW: {
+                    Size targetSize = maxSizes.maxRawSize;
+                    ImageReader target = ImageReader.newInstance(
+                        targetSize.getWidth(), targetSize.getHeight(), RAW, numBuffers);
+                    target.setOnImageAvailableListener(imageDropperListener, mHandler);
+                    outputSurfaces.add(target.getSurface());
+                    rawTargets.add(target);
+                    break;
+                }
+                default:
+                    fail("Unknown output format " + format);
+            }
+        }
+    }
+
     private static Size getMaxRecordingSize(String cameraId) {
         int id = Integer.valueOf(cameraId);
 
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java
index b8c2f2e..3e3e81e 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java
@@ -73,8 +73,10 @@
             Size sensorSize = new Size(activeRect.width(), activeRect.height());
             List<Integer> availableCaps = mStaticInfo.getAvailableCapabilitiesChecked();
 
-            mCollector.expectTrue("All device must contains BACKWARD_COMPATIBLE capability",
-                    availableCaps.contains(REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE));
+            mCollector.expectTrue("All devices must contains BACKWARD_COMPATIBLE capability or " +
+                    "DEPTH_OUTPUT capabillity" ,
+                    availableCaps.contains(REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE) ||
+                    availableCaps.contains(REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT) );
 
             if (mStaticInfo.isHardwareLevelFull()) {
                 // Capability advertisement must be right.
@@ -86,27 +88,30 @@
                 mCollector.expectTrue("Full device must contain BURST_CAPTURE capability",
                         availableCaps.contains(REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE));
 
-                // Max resolution fps must be >= 20.
-                mCollector.expectTrue("Full device must support at least 20fps for max resolution",
-                        getFpsForMaxSize(id) >= MIN_FPS_FOR_FULL_DEVICE);
-
                 // Need support per frame control
                 mCollector.expectTrue("Full device must support per frame control",
                         mStaticInfo.isPerFrameControlSupported());
             }
 
+            if (mStaticInfo.isHardwareLevelLegacy()) {
+                mCollector.expectTrue("Legacy devices must contain BACKWARD_COMPATIBLE capability",
+                        availableCaps.contains(REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE));
+            }
+
             if (availableCaps.contains(REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
                 mCollector.expectTrue("MANUAL_SENSOR capability always requires " +
                         "READ_SENSOR_SETTINGS capability as well",
                         availableCaps.contains(REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS));
             }
 
-            // Max jpeg resolution must be very close to  sensor resolution
-            Size[] jpegSizes = configs.getOutputSizes(ImageFormat.JPEG);
-            Size maxJpegSize = CameraTestUtils.getMaxSize(jpegSizes);
-            mCollector.expectSizesAreSimilar(
+            if (mStaticInfo.isColorOutputSupported()) {
+                // Max jpeg resolution must be very close to  sensor resolution
+                Size[] jpegSizes = mStaticInfo.getJpegOutputSizesChecked();
+                Size maxJpegSize = CameraTestUtils.getMaxSize(jpegSizes);
+                mCollector.expectSizesAreSimilar(
                     "Active array size and max JPEG size should be similar",
                     sensorSize, maxJpegSize, SIZE_ERROR_MARGIN);
+            }
 
             // TODO: test all the keys mandatory for all capability devices.
         }
@@ -131,9 +136,9 @@
                 mCollector.expectTrue("max number of processed (non-stalling) output streams" +
                         "must be >= 3 for FULL device",
                         maxNumStreamsProc >= 3);
-            } else {
+            } else if (mStaticInfo.isColorOutputSupported()) {
                 mCollector.expectTrue("max number of processed (non-stalling) output streams" +
-                        "must be >= 2 for LIMITED device",
+                        "must be >= 2 for devices that support color output",
                         maxNumStreamsProc >= 2);
             }
         }
@@ -268,12 +273,10 @@
                 capabilityName = "REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE";
                 requestKeys.add(CaptureRequest.CONTROL_AE_ANTIBANDING_MODE);
                 requestKeys.add(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION);
-                requestKeys.add(CaptureRequest.CONTROL_AE_LOCK);
                 requestKeys.add(CaptureRequest.CONTROL_AE_MODE);
                 requestKeys.add(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE);
                 requestKeys.add(CaptureRequest.CONTROL_AF_MODE);
                 requestKeys.add(CaptureRequest.CONTROL_AF_TRIGGER);
-                requestKeys.add(CaptureRequest.CONTROL_AWB_LOCK);
                 requestKeys.add(CaptureRequest.CONTROL_AWB_MODE);
                 requestKeys.add(CaptureRequest.CONTROL_CAPTURE_INTENT);
                 requestKeys.add(CaptureRequest.CONTROL_EFFECT_MODE);
@@ -319,17 +322,23 @@
                 requestKeys.add(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE);
                 requestKeys.add(CaptureRequest.TONEMAP_CURVE);
                 requestKeys.add(CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE);
+                requestKeys.add(CaptureRequest.CONTROL_AWB_LOCK);
 
                 // Legacy mode always doesn't support these requirements
                 Boolean contrastCurveModeSupported = false;
+                Boolean gammaAndPresetModeSupported = false;
                 Boolean offColorAberrationModeSupported = false;
-                if (mStaticInfo.isHardwareLevelLimitedOrBetter()) {
+                if (mStaticInfo.isHardwareLevelLimitedOrBetter() && mStaticInfo.isColorOutputSupported()) {
                     int[] tonemapModes = mStaticInfo.getAvailableToneMapModesChecked();
                     List<Integer> modeList = (tonemapModes.length == 0) ?
                             new ArrayList<Integer>() :
                             Arrays.asList(CameraTestUtils.toObject(tonemapModes));
                     contrastCurveModeSupported =
                             modeList.contains(CameraMetadata.TONEMAP_MODE_CONTRAST_CURVE);
+                    gammaAndPresetModeSupported =
+                            modeList.contains(CameraMetadata.TONEMAP_MODE_GAMMA_VALUE) &&
+                            modeList.contains(CameraMetadata.TONEMAP_MODE_PRESET_CURVE);
+
                     int[] colorAberrationModes =
                             mStaticInfo.getAvailableColorAberrationModesChecked();
                     modeList = (colorAberrationModes.length == 0) ?
@@ -338,13 +347,20 @@
                     offColorAberrationModeSupported =
                             modeList.contains(CameraMetadata.COLOR_CORRECTION_ABERRATION_MODE_OFF);
                 }
+                Boolean tonemapModeQualified =
+                        contrastCurveModeSupported || gammaAndPresetModeSupported;
                 additionalRequirements.add(new Pair<String, Boolean>(
-                        "Tonemap mode must include CONTRAST_CURVE", contrastCurveModeSupported));
+                        "Tonemap mode must include {CONTRAST_CURVE} and/or " +
+                        "{GAMMA_VALUE, PRESET_CURVE}",
+                        tonemapModeQualified));
                 additionalRequirements.add(new Pair<String, Boolean>(
                         "Color aberration mode must include OFF", offColorAberrationModeSupported));
+                additionalRequirements.add(new Pair<String, Boolean>(
+                        "Must support AWB lock", mStaticInfo.isAwbLockSupported()));
                 break;
             case REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR:
                 capabilityName = "REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR";
+                requestKeys.add(CaptureRequest.CONTROL_AE_LOCK);
                 requestKeys.add(CaptureRequest.SENSOR_FRAME_DURATION);
                 requestKeys.add(CaptureRequest.SENSOR_EXPOSURE_TIME);
                 requestKeys.add(CaptureRequest.SENSOR_SENSITIVITY);
@@ -355,6 +371,8 @@
                     requestKeys.add(CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE);
                 }
                 requestKeys.add(CaptureRequest.BLACK_LEVEL_LOCK);
+                additionalRequirements.add(new Pair<String, Boolean>(
+                        "Must support AE lock", mStaticInfo.isAeLockSupported()));
                 break;
             case REQUEST_AVAILABLE_CAPABILITIES_RAW:
                 // RAW_CAPABILITY needs to check for not just capture request keys
@@ -374,6 +392,14 @@
                     resultKeys.add(CaptureResult.LENS_FILTER_DENSITY);
                 }
                 break;
+
+            case REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING:
+            case REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING:
+                // Tested in ExtendedCameraCharacteristicsTest
+                return;
+            case REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT:
+                // Tested in ExtendedCameracharacteristicsTest
+                return;
             default:
                 capabilityName = "Unknown";
                 assertTrue(String.format("Unknown capability set: %d", capability),
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
index b4113e5..5e931fe 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
@@ -18,7 +18,6 @@
 
 import static android.hardware.camera2.cts.CameraTestUtils.*;
 import static android.hardware.camera2.cts.helpers.AssertHelpers.assertArrayContains;
-import static junit.framework.Assert.assertNotNull;
 
 import android.graphics.ImageFormat;
 import android.graphics.Point;
@@ -27,8 +26,6 @@
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CaptureRequest;
 import android.hardware.camera2.CaptureResult;
-import android.location.Location;
-import android.location.LocationManager;
 import android.hardware.camera2.DngCreator;
 import android.media.ImageReader;
 import android.util.Pair;
@@ -38,9 +35,7 @@
 import android.hardware.camera2.cts.helpers.Camera2Focuser;
 import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
 import android.hardware.camera2.params.MeteringRectangle;
-import android.media.ExifInterface;
 import android.media.Image;
-import android.os.Build;
 import android.os.ConditionVariable;
 import android.util.Log;
 import android.util.Range;
@@ -51,11 +46,8 @@
 import com.android.ex.camera2.exceptions.TimeoutRuntimeException;
 
 import java.io.ByteArrayOutputStream;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Date;
 import java.util.List;
 
 public class StillCaptureTest extends Camera2SurfaceViewTestCase {
@@ -63,60 +55,11 @@
     private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
     // 60 second to accommodate the possible long exposure time.
-    private static final int EXIF_DATETIME_ERROR_MARGIN_SEC = 60;
-    private static final float EXIF_FOCAL_LENGTH_ERROR_MARGIN = 0.001f;
-    private static final float EXIF_EXPOSURE_TIME_ERROR_MARGIN_RATIO = 0.05f;
-    private static final float EXIF_EXPOSURE_TIME_MIN_ERROR_MARGIN_SEC = 0.002f;
-    private static final float EXIF_APERTURE_ERROR_MARGIN = 0.001f;
-    private static final Location sTestLocation0 = new Location(LocationManager.GPS_PROVIDER);
-    private static final Location sTestLocation1 = new Location(LocationManager.GPS_PROVIDER);
-    private static final Location sTestLocation2 = new Location(LocationManager.NETWORK_PROVIDER);
     private static final int RELAXED_CAPTURE_IMAGE_TIMEOUT_MS = CAPTURE_IMAGE_TIMEOUT_MS + 1000;
-    static {
-        sTestLocation0.setTime(1199145600L);
-        sTestLocation0.setLatitude(37.736071);
-        sTestLocation0.setLongitude(-122.441983);
-        sTestLocation0.setAltitude(21.0);
-
-        sTestLocation1.setTime(1199145601L);
-        sTestLocation1.setLatitude(0.736071);
-        sTestLocation1.setLongitude(0.441983);
-        sTestLocation1.setAltitude(1.0);
-
-        sTestLocation2.setTime(1199145602L);
-        sTestLocation2.setLatitude(-89.736071);
-        sTestLocation2.setLongitude(-179.441983);
-        sTestLocation2.setAltitude(100000.0);
-    }
-    // Exif test data vectors.
-    private static final ExifTestData[] EXIF_TEST_DATA = {
-            new ExifTestData(
-                    /*gpsLocation*/ sTestLocation0,
-                    /* orientation */90,
-                    /* jpgQuality */(byte) 80,
-                    /* thumbQuality */(byte) 75),
-            new ExifTestData(
-                    /*gpsLocation*/ sTestLocation1,
-                    /* orientation */180,
-                    /* jpgQuality */(byte) 90,
-                    /* thumbQuality */(byte) 85),
-            new ExifTestData(
-                    /*gpsLocation*/ sTestLocation2,
-                    /* orientation */270,
-                    /* jpgQuality */(byte) 100,
-                    /* thumbQuality */(byte) 100)
-    };
-
-    // Some exif tags that are not defined by ExifInterface but supported.
-    private static final String TAG_DATETIME_DIGITIZED = "DateTimeDigitized";
-    private static final String TAG_SUBSEC_TIME = "SubSecTime";
-    private static final String TAG_SUBSEC_TIME_ORIG = "SubSecTimeOriginal";
-    private static final String TAG_SUBSEC_TIME_DIG = "SubSecTimeDigitized";
-    private static final int EXIF_DATETIME_LENGTH = 19;
     private static final int MAX_REGIONS_AE_INDEX = 0;
     private static final int MAX_REGIONS_AWB_INDEX = 1;
     private static final int MAX_REGIONS_AF_INDEX = 2;
-    private static final int WAIT_FOR_FOCUS_DONE_TIMEOUT_MS = 3000;
+    private static final int WAIT_FOR_FOCUS_DONE_TIMEOUT_MS = 6000;
     private static final double AE_COMPENSATION_ERROR_TOLERANCE = 0.2;
     private static final int NUM_FRAMES_WAITED = 30;
     // 5 percent error margin for resulting metering regions
@@ -140,7 +83,11 @@
             try {
                 Log.i(TAG, "Testing JPEG exif for Camera " + mCameraIds[i]);
                 openDevice(mCameraIds[i]);
-
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + mCameraIds[i] +
+                            " does not support color outputs, skipping");
+                    continue;
+                }
                 jpegExifTestByCamera();
             } finally {
                 closeDevice();
@@ -162,9 +109,12 @@
     public void testTakePicture() throws Exception{
         for (String id : mCameraIds) {
             try {
-                Log.i(TAG, "Testing touch for focus for Camera " + id);
+                Log.i(TAG, "Testing basic take picture for Camera " + id);
                 openDevice(id);
-
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
                 takePictureTestByCamera(/*aeRegions*/null, /*awbRegions*/null, /*afRegions*/null);
             } finally {
                 closeDevice();
@@ -242,7 +192,11 @@
                 if (!(mStaticInfo.hasFocuser() && maxAfRegions > 0)) {
                     continue;
                 }
-
+                // TODO: Relax test to use non-SurfaceView output for depth cases
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
                 touchForFocusTestByCamera();
             } finally {
                 closeDevice();
@@ -263,7 +217,10 @@
             try {
                 Log.i(TAG, "Testing Still preview capture combination for Camera " + id);
                 openDevice(id);
-
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
                 previewStillCombinationTestByCamera();
             } finally {
                 closeDevice();
@@ -292,7 +249,10 @@
                     Log.i(TAG, "Skipping test on legacy devices");
                     continue;
                 }
-
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
                 aeCompensationTestByCamera();
             } finally {
                 closeDevice();
@@ -384,6 +344,10 @@
             try {
                 Log.i(TAG, "Testing preview persistence for Camera " + id);
                 openDevice(id);
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
                 previewPersistenceTestByCamera();
             } finally {
                 closeDevice();
@@ -392,6 +356,30 @@
         }
     }
 
+    public void testAePrecaptureTriggerCancelJpegCapture() throws Exception {
+        for (String id : mCameraIds) {
+            try {
+                Log.i(TAG, "Testing AE precapture cancel for jpeg capture for Camera " + id);
+                openDevice(id);
+
+                // Legacy device doesn't support AE precapture trigger
+                if (mStaticInfo.isHardwareLevelLegacy()) {
+                    Log.i(TAG, "Skipping AE precapture trigger cancel test on legacy devices");
+                    continue;
+                }
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
+                takePictureTestByCamera(/*aeRegions*/null, /*awbRegions*/null, /*afRegions*/null,
+                        /*addAeTriggerCancel*/true);
+            } finally {
+                closeDevice();
+                closeImageReader();
+            }
+        }
+    }
+
     /**
      * Start preview,take a picture and test preview is still running after snapshot
      */
@@ -449,6 +437,29 @@
     private void takePictureTestByCamera(
             MeteringRectangle[] aeRegions, MeteringRectangle[] awbRegions,
             MeteringRectangle[] afRegions) throws Exception {
+        takePictureTestByCamera(aeRegions, awbRegions, afRegions,
+                /*addAeTriggerCancel*/false);
+    }
+
+    /**
+     * Take a picture for a given set of 3A regions for a particular camera.
+     * <p>
+     * Before take a still capture, it triggers an auto focus and lock it first,
+     * then wait for AWB to converge and lock it, then trigger a precapture
+     * metering sequence and wait for AE converged. After capture is received, the
+     * capture result and image are validated. If {@code addAeTriggerCancel} is true,
+     * a precapture trigger cancel will be inserted between two adjacent triggers, which
+     * should effective cancel the first trigger.
+     * </p>
+     *
+     * @param aeRegions AE regions for this capture
+     * @param awbRegions AWB regions for this capture
+     * @param afRegions AF regions for this capture
+     * @param addAeTriggerCancel If a AE precapture trigger cancel is sent after the trigger.
+     */
+    private void takePictureTestByCamera(
+            MeteringRectangle[] aeRegions, MeteringRectangle[] awbRegions,
+            MeteringRectangle[] afRegions, boolean addAeTriggerCancel) throws Exception {
 
         boolean hasFocuser = mStaticInfo.hasFocuser();
 
@@ -523,7 +534,10 @@
             // LEGACY Devices don't have the AWB_STATE reported in results, so just wait
             waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
         }
-        previewRequest.set(CaptureRequest.CONTROL_AWB_LOCK, true);
+        boolean canSetAwbLock = mStaticInfo.isAwbLockSupported();
+        if (canSetAwbLock) {
+            previewRequest.set(CaptureRequest.CONTROL_AWB_LOCK, true);
+        }
         mSession.setRepeatingRequest(previewRequest.build(), resultListener, mHandler);
         // Validate the next result immediately for region and mode.
         result = resultListener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
@@ -551,6 +565,22 @@
         previewRequest.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
                 CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
         mSession.capture(previewRequest.build(), resultListener, mHandler);
+        if (addAeTriggerCancel) {
+            // Cancel the current precapture trigger, then send another trigger.
+            // The camera device should behave as if the first trigger is not sent.
+            // Wait one request to make the trigger start doing something before cancel.
+            waitForNumResults(resultListener, /*numResultsWait*/ 1);
+            previewRequest.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
+                    CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL);
+            mSession.capture(previewRequest.build(), resultListener, mHandler);
+            waitForResultValue(resultListener, CaptureResult.CONTROL_AE_PRECAPTURE_TRIGGER,
+                    CaptureResult.CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL,
+                    NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
+            // Issue another trigger
+            previewRequest.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
+                    CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
+            mSession.capture(previewRequest.build(), resultListener, mHandler);
+        }
         waitForAeStable(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
 
         // Validate the next result immediately for region and mode.
@@ -663,16 +693,7 @@
      */
     private void rawCaptureTestByCamera() throws Exception {
         Size maxPreviewSz = mOrderedPreviewSizes.get(0);
-        Size[] rawSizes = mStaticInfo.getRawOutputSizesChecked();
-
-        assertTrue("No capture sizes available for RAW format!",
-                rawSizes.length != 0);
-        Rect activeArray = mStaticInfo.getActiveArraySizeChecked();
-        Size size = new Size(activeArray.width(), activeArray.height());
-        assertTrue("Missing ActiveArraySize", activeArray.width() > 0 &&
-                activeArray.height() > 0);
-        assertArrayContains("Available sizes for RAW format must include ActiveArraySize",
-                rawSizes, size);
+        Size size = mStaticInfo.getRawDimensChecked();
 
         // Prepare raw capture and start preview.
         CaptureRequest.Builder previewBuilder =
@@ -711,20 +732,12 @@
     private void fullRawCaptureTestByCamera() throws Exception {
         Size maxPreviewSz = mOrderedPreviewSizes.get(0);
         Size maxStillSz = mOrderedStillSizes.get(0);
-        Size[] rawSizes = mStaticInfo.getRawOutputSizesChecked();
 
         SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
         SimpleImageReaderListener jpegListener = new SimpleImageReaderListener();
         SimpleImageReaderListener rawListener = new SimpleImageReaderListener();
 
-        assertTrue("No capture sizes available for RAW format!",
-                rawSizes.length != 0);
-        Rect activeArray = mStaticInfo.getActiveArraySizeChecked();
-        Size size = new Size(activeArray.width(), activeArray.height());
-        assertTrue("Missing ActiveArraySize", activeArray.width() > 0 &&
-                activeArray.height() > 0);
-        assertArrayContains("Available sizes for RAW format must include ActiveArraySize",
-                rawSizes, size);
+        Size size = mStaticInfo.getRawDimensChecked();
 
         if (VERBOSE) {
             Log.v(TAG, "Testing multi capture with size " + size.toString()
@@ -898,15 +911,6 @@
 
     }
 
-    private static boolean areGpsFieldsEqual(Location a, Location b) {
-        if (a == null || b == null) {
-            return false;
-        }
-
-        return a.getTime() == b.getTime() && a.getLatitude() == b.getLatitude() &&
-                a.getLongitude() == b.getLongitude() && a.getAltitude() == b.getAltitude() &&
-                a.getProvider() == b.getProvider();
-    }
     /**
      * Issue a Jpeg capture and validate the exif information.
      * <p>
@@ -941,38 +945,7 @@
         testThumbnailSizes[0] = new Size(0, 0);
 
         for (int i = 0; i < EXIF_TEST_DATA.length; i++) {
-            /**
-             * Capture multiple shots.
-             *
-             * Verify that:
-             * - Capture request get values are same as were set.
-             * - capture result's exif data is the same as was set by
-             *   the capture request.
-             * - new tags in the result set by the camera service are
-             *   present and semantically correct.
-             */
-            stillBuilder.set(CaptureRequest.JPEG_THUMBNAIL_SIZE, testThumbnailSizes[i]);
-            stillBuilder.set(CaptureRequest.JPEG_GPS_LOCATION, EXIF_TEST_DATA[i].gpsLocation);
-            stillBuilder.set(CaptureRequest.JPEG_ORIENTATION, EXIF_TEST_DATA[i].jpegOrientation);
-            stillBuilder.set(CaptureRequest.JPEG_QUALITY, EXIF_TEST_DATA[i].jpegQuality);
-            stillBuilder.set(CaptureRequest.JPEG_THUMBNAIL_QUALITY,
-                    EXIF_TEST_DATA[i].thumbnailQuality);
-
-            // Validate request set and get.
-            mCollector.expectEquals("JPEG thumbnail size request set and get should match",
-                    testThumbnailSizes[i],
-                    stillBuilder.get(CaptureRequest.JPEG_THUMBNAIL_SIZE));
-            mCollector.expectTrue("GPS locations request set and get should match.",
-                    areGpsFieldsEqual(EXIF_TEST_DATA[i].gpsLocation,
-                            stillBuilder.get(CaptureRequest.JPEG_GPS_LOCATION)));
-            mCollector.expectEquals("JPEG orientation request set and get should match",
-                    EXIF_TEST_DATA[i].jpegOrientation,
-                    stillBuilder.get(CaptureRequest.JPEG_ORIENTATION));
-            mCollector.expectEquals("JPEG quality request set and get should match",
-                    EXIF_TEST_DATA[i].jpegQuality, stillBuilder.get(CaptureRequest.JPEG_QUALITY));
-            mCollector.expectEquals("JPEG thumbnail quality request set and get should match",
-                    EXIF_TEST_DATA[i].thumbnailQuality,
-                    stillBuilder.get(CaptureRequest.JPEG_THUMBNAIL_QUALITY));
+            setJpegKeys(stillBuilder, EXIF_TEST_DATA[i], testThumbnailSizes[i], mCollector);
 
             // Capture a jpeg image.
             CaptureRequest request = stillBuilder.build();
@@ -980,273 +953,15 @@
             CaptureResult stillResult =
                     resultListener.getCaptureResultForRequest(request, NUM_RESULTS_WAIT_TIMEOUT);
             Image image = imageListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
-            basicValidateJpegImage(image, maxStillSz);
 
-            byte[] jpegBuffer = getDataFromImage(image);
-            // Have to dump into a file to be able to use ExifInterface
-            String jpegFileName =
-                    DEBUG_FILE_NAME_BASE + "/Camera_" + mCamera.getId() + "_test.jpeg";
-            dumpFile(jpegFileName, jpegBuffer);
-            ExifInterface exif = new ExifInterface(jpegFileName);
-
-            if (testThumbnailSizes[i].equals(new Size(0,0))) {
-                mCollector.expectTrue(
-                        "Jpeg shouldn't have thumbnail when thumbnail size is (0, 0)",
-                        !exif.hasThumbnail());
-            } else {
-                mCollector.expectTrue(
-                        "Jpeg must have thumbnail for thumbnail size " + testThumbnailSizes[i],
-                        exif.hasThumbnail());
-            }
-
-            // Validate capture result vs. request
-            mCollector.expectEquals("JPEG thumbnail size result and request should match",
-                    testThumbnailSizes[i],
-                    stillResult.get(CaptureResult.JPEG_THUMBNAIL_SIZE));
-            if (mCollector.expectKeyValueNotNull(stillResult, CaptureResult.JPEG_GPS_LOCATION) !=
-                    null) {
-                mCollector.expectTrue("GPS location result and request should match.",
-                        areGpsFieldsEqual(EXIF_TEST_DATA[i].gpsLocation,
-                                stillResult.get(CaptureResult.JPEG_GPS_LOCATION)));
-            }
-            mCollector.expectEquals("JPEG orientation result and request should match",
-                    EXIF_TEST_DATA[i].jpegOrientation,
-                    stillResult.get(CaptureResult.JPEG_ORIENTATION));
-            mCollector.expectEquals("JPEG quality result and request should match",
-                    EXIF_TEST_DATA[i].jpegQuality, stillResult.get(CaptureResult.JPEG_QUALITY));
-            mCollector.expectEquals("JPEG thumbnail quality result and request should match",
-                    EXIF_TEST_DATA[i].thumbnailQuality,
-                    stillResult.get(CaptureResult.JPEG_THUMBNAIL_QUALITY));
-
-            // Validate other exif tags for all non-legacy devices
-            if (!mStaticInfo.isHardwareLevelLegacy()) {
-                jpegTestExifExtraTags(exif, maxStillSz, stillResult);
-            }
+            verifyJpegKeys(image, stillResult, maxStillSz, testThumbnailSizes[i], EXIF_TEST_DATA[i],
+                    mStaticInfo, mCollector);
 
             // Free image resources
             image.close();
         }
     }
 
-    private void jpegTestExifExtraTags(ExifInterface exif, Size jpegSize, CaptureResult result)
-            throws ParseException {
-        /**
-         * TAG_IMAGE_WIDTH and TAG_IMAGE_LENGTH and TAG_ORIENTATION.
-         * Orientation and exif width/height need to be tested carefully, two cases:
-         *
-         * 1. Device rotate the image buffer physically, then exif width/height may not match
-         * the requested still capture size, we need swap them to check.
-         *
-         * 2. Device use the exif tag to record the image orientation, it doesn't rotate
-         * the jpeg image buffer itself. In this case, the exif width/height should always match
-         * the requested still capture size, and the exif orientation should always match the
-         * requested orientation.
-         *
-         */
-        int exifWidth = exif.getAttributeInt(ExifInterface.TAG_IMAGE_WIDTH, /*defaultValue*/0);
-        int exifHeight = exif.getAttributeInt(ExifInterface.TAG_IMAGE_LENGTH, /*defaultValue*/0);
-        Size exifSize = new Size(exifWidth, exifHeight);
-        // Orientation could be missing, which is ok, default to 0.
-        int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
-                /*defaultValue*/-1);
-        // Get requested orientation from result, because they should be same.
-        if (mCollector.expectKeyValueNotNull(result, CaptureResult.JPEG_ORIENTATION) != null) {
-            int requestedOrientation = result.get(CaptureResult.JPEG_ORIENTATION);
-            final int ORIENTATION_MIN = ExifInterface.ORIENTATION_UNDEFINED;
-            final int ORIENTATION_MAX = ExifInterface.ORIENTATION_ROTATE_270;
-            boolean orientationValid = mCollector.expectTrue(String.format(
-                    "Exif orientation must be in range of [%d, %d]",
-                    ORIENTATION_MIN, ORIENTATION_MAX),
-                    exifOrientation >= ORIENTATION_MIN && exifOrientation <= ORIENTATION_MAX);
-            if (orientationValid) {
-                /**
-                 * Device captured image doesn't respect the requested orientation,
-                 * which means it rotates the image buffer physically. Then we
-                 * should swap the exif width/height accordingly to compare.
-                 */
-                boolean deviceRotatedImage = exifOrientation == ExifInterface.ORIENTATION_UNDEFINED;
-
-                if (deviceRotatedImage) {
-                    // Case 1.
-                    boolean needSwap = (requestedOrientation % 180 == 90);
-                    if (needSwap) {
-                        exifSize = new Size(exifHeight, exifWidth);
-                    }
-                } else {
-                    // Case 2.
-                    mCollector.expectEquals("Exif orientaiton should match requested orientation",
-                            requestedOrientation, getExifOrientationInDegress(exifOrientation));
-                }
-            }
-        }
-
-        /**
-         * Ideally, need check exifSize == jpegSize == actual buffer size. But
-         * jpegSize == jpeg decode bounds size(from jpeg jpeg frame
-         * header, not exif) was validated in ImageReaderTest, no need to
-         * validate again here.
-         */
-        mCollector.expectEquals("Exif size should match jpeg capture size", jpegSize, exifSize);
-
-        // TAG_DATETIME, it should be local time
-        long currentTimeInMs = System.currentTimeMillis();
-        long currentTimeInSecond = currentTimeInMs / 1000;
-        Date date = new Date(currentTimeInMs);
-        String localDatetime = new SimpleDateFormat("yyyy:MM:dd HH:").format(date);
-        String dateTime = exif.getAttribute(ExifInterface.TAG_DATETIME);
-        if (mCollector.expectTrue("Exif TAG_DATETIME shouldn't be null", dateTime != null)) {
-            mCollector.expectTrue("Exif TAG_DATETIME is wrong",
-                    dateTime.length() == EXIF_DATETIME_LENGTH);
-            long exifTimeInSecond =
-                    new SimpleDateFormat("yyyy:MM:dd HH:mm:ss").parse(dateTime).getTime() / 1000;
-            long delta = currentTimeInSecond - exifTimeInSecond;
-            mCollector.expectTrue("Capture time deviates too much from the current time",
-                    Math.abs(delta) < EXIF_DATETIME_ERROR_MARGIN_SEC);
-            // It should be local time.
-            mCollector.expectTrue("Exif date time should be local time",
-                    dateTime.startsWith(localDatetime));
-        }
-
-        // TAG_FOCAL_LENGTH.
-        float[] focalLengths = mStaticInfo.getAvailableFocalLengthsChecked();
-        float exifFocalLength = (float)exif.getAttributeDouble(ExifInterface.TAG_FOCAL_LENGTH, -1);
-        mCollector.expectEquals("Focal length should match",
-                getClosestValueInArray(focalLengths, exifFocalLength),
-                exifFocalLength, EXIF_FOCAL_LENGTH_ERROR_MARGIN);
-        // More checks for focal length.
-        mCollector.expectEquals("Exif focal length should match capture result",
-                validateFocalLength(result), exifFocalLength);
-
-        // TAG_EXPOSURE_TIME
-        // ExifInterface API gives exposure time value in the form of float instead of rational
-        String exposureTime = exif.getAttribute(ExifInterface.TAG_EXPOSURE_TIME);
-        mCollector.expectNotNull("Exif TAG_EXPOSURE_TIME shouldn't be null", exposureTime);
-        if (mStaticInfo.areKeysAvailable(CaptureResult.SENSOR_EXPOSURE_TIME)) {
-            if (exposureTime != null) {
-                double exposureTimeValue = Double.parseDouble(exposureTime);
-                long expTimeResult = result.get(CaptureResult.SENSOR_EXPOSURE_TIME);
-                double expected = expTimeResult / 1e9;
-                double tolerance = expected * EXIF_EXPOSURE_TIME_ERROR_MARGIN_RATIO;
-                tolerance = Math.max(tolerance, EXIF_EXPOSURE_TIME_MIN_ERROR_MARGIN_SEC);
-                mCollector.expectEquals("Exif exposure time doesn't match", expected,
-                        exposureTimeValue, tolerance);
-            }
-        }
-
-        // TAG_APERTURE
-        // ExifInterface API gives aperture value in the form of float instead of rational
-        String exifAperture = exif.getAttribute(ExifInterface.TAG_APERTURE);
-        mCollector.expectNotNull("Exif TAG_APERTURE shouldn't be null", exifAperture);
-        if (mStaticInfo.areKeysAvailable(CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES)) {
-            float[] apertures = mStaticInfo.getAvailableAperturesChecked();
-            if (exifAperture != null) {
-                float apertureValue = Float.parseFloat(exifAperture);
-                mCollector.expectEquals("Aperture value should match",
-                        getClosestValueInArray(apertures, apertureValue),
-                        apertureValue, EXIF_APERTURE_ERROR_MARGIN);
-                // More checks for aperture.
-                mCollector.expectEquals("Exif aperture length should match capture result",
-                        validateAperture(result), apertureValue);
-            }
-        }
-
-        /**
-         * TAG_FLASH. TODO: For full devices, can check a lot more info
-         * (http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html#Flash)
-         */
-        String flash = exif.getAttribute(ExifInterface.TAG_FLASH);
-        mCollector.expectNotNull("Exif TAG_FLASH shouldn't be null", flash);
-
-        /**
-         * TAG_WHITE_BALANCE. TODO: For full devices, with the DNG tags, we
-         * should be able to cross-check android.sensor.referenceIlluminant.
-         */
-        String whiteBalance = exif.getAttribute(ExifInterface.TAG_WHITE_BALANCE);
-        mCollector.expectNotNull("Exif TAG_WHITE_BALANCE shouldn't be null", whiteBalance);
-
-        // TAG_MAKE
-        String make = exif.getAttribute(ExifInterface.TAG_MAKE);
-        mCollector.expectEquals("Exif TAG_MAKE is incorrect", Build.MANUFACTURER, make);
-
-        // TAG_MODEL
-        String model = exif.getAttribute(ExifInterface.TAG_MODEL);
-        mCollector.expectEquals("Exif TAG_MODEL is incorrect", Build.MODEL, model);
-
-
-        // TAG_ISO
-        int iso = exif.getAttributeInt(ExifInterface.TAG_ISO, /*defaultValue*/-1);
-        if (mStaticInfo.areKeysAvailable(CaptureResult.SENSOR_SENSITIVITY)) {
-            int expectedIso = result.get(CaptureResult.SENSOR_SENSITIVITY);
-            mCollector.expectEquals("Exif TAG_ISO is incorrect", expectedIso, iso);
-        }
-
-        // TAG_DATETIME_DIGITIZED (a.k.a Create time for digital cameras).
-        String digitizedTime = exif.getAttribute(TAG_DATETIME_DIGITIZED);
-        mCollector.expectNotNull("Exif TAG_DATETIME_DIGITIZED shouldn't be null", digitizedTime);
-        if (digitizedTime != null) {
-            String expectedDateTime = exif.getAttribute(ExifInterface.TAG_DATETIME);
-            mCollector.expectNotNull("Exif TAG_DATETIME shouldn't be null", expectedDateTime);
-            if (expectedDateTime != null) {
-                mCollector.expectEquals("dataTime should match digitizedTime",
-                        expectedDateTime, digitizedTime);
-            }
-        }
-
-        /**
-         * TAG_SUBSEC_TIME. Since the sub second tag strings are truncated to at
-         * most 9 digits in ExifInterface implementation, use getAttributeInt to
-         * sanitize it. When the default value -1 is returned, it means that
-         * this exif tag either doesn't exist or is a non-numerical invalid
-         * string. Same rule applies to the rest of sub second tags.
-         */
-        int subSecTime = exif.getAttributeInt(TAG_SUBSEC_TIME, /*defaultValue*/-1);
-        mCollector.expectTrue("Exif TAG_SUBSEC_TIME value is null or invalid!", subSecTime > 0);
-
-        // TAG_SUBSEC_TIME_ORIG
-        int subSecTimeOrig = exif.getAttributeInt(TAG_SUBSEC_TIME_ORIG, /*defaultValue*/-1);
-        mCollector.expectTrue("Exif TAG_SUBSEC_TIME_ORIG value is null or invalid!",
-                subSecTimeOrig > 0);
-
-        // TAG_SUBSEC_TIME_DIG
-        int subSecTimeDig = exif.getAttributeInt(TAG_SUBSEC_TIME_DIG, /*defaultValue*/-1);
-        mCollector.expectTrue(
-                "Exif TAG_SUBSEC_TIME_DIG value is null or invalid!", subSecTimeDig > 0);
-    }
-
-    private int getExifOrientationInDegress(int exifOrientation) {
-        switch (exifOrientation) {
-            case ExifInterface.ORIENTATION_NORMAL:
-                return 0;
-            case ExifInterface.ORIENTATION_ROTATE_90:
-                return 90;
-            case ExifInterface.ORIENTATION_ROTATE_180:
-                return 180;
-            case ExifInterface.ORIENTATION_ROTATE_270:
-                return 270;
-            default:
-                mCollector.addMessage("It is impossible to get non 0, 90, 180, 270 degress exif" +
-                        "info based on the request orientation range");
-                return 0;
-        }
-    }
-    /**
-     * Immutable class wrapping the exif test data.
-     */
-    private static class ExifTestData {
-        public final Location gpsLocation;
-        public final int jpegOrientation;
-        public final byte jpegQuality;
-        public final byte thumbnailQuality;
-
-        public ExifTestData(Location location, int orientation,
-                byte jpgQuality, byte thumbQuality) {
-            gpsLocation = location;
-            jpegOrientation = orientation;
-            jpegQuality = jpgQuality;
-            thumbnailQuality = thumbQuality;
-        }
-    }
-
     private void aeCompensationTestByCamera() throws Exception {
         Range<Integer> compensationRange = mStaticInfo.getAeCompensationRangeChecked();
         // Skip the test if exposure compensation is not supported.
@@ -1267,7 +982,12 @@
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
         CaptureRequest.Builder stillRequest =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
-        stillRequest.set(CaptureRequest.CONTROL_AE_LOCK, true);
+        boolean canSetAeLock = mStaticInfo.isAeLockSupported();
+
+        if (canSetAeLock) {
+            stillRequest.set(CaptureRequest.CONTROL_AE_LOCK, true);
+        }
+
         CaptureResult normalResult;
         CaptureResult compensatedResult;
 
@@ -1305,7 +1025,7 @@
 
             long normalExposureValue = -1;
             if (mStaticInfo.isCapabilitySupported(
-                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
+                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS)) {
                 // get and check if current exposure value is valid
                 normalExposureValue = getExposureValue(normalResult);
                 mCollector.expectInRange("Exposure setting out of bound", normalExposureValue,
@@ -1329,9 +1049,15 @@
             // frames to go back to locked state
             previewRequest.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION,
                     exposureCompensation);
-            previewRequest.set(CaptureRequest.CONTROL_AE_LOCK, true);
+            if (canSetAeLock) {
+                previewRequest.set(CaptureRequest.CONTROL_AE_LOCK, true);
+            }
             mSession.setRepeatingRequest(previewRequest.build(), resultListener, mHandler);
-            waitForAeLocked(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
+            if (canSetAeLock) {
+                waitForAeLocked(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
+            } else {
+                waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
+            }
 
             // Issue still capture
             if (VERBOSE) {
@@ -1347,7 +1073,7 @@
                     request, WAIT_FOR_RESULT_TIMEOUT_MS);
 
             if (mStaticInfo.isCapabilitySupported(
-                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
+                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS)) {
                 // Verify the exposure value compensates as requested
                 long compensatedExposureValue = getExposureValue(compensatedResult);
                 mCollector.expectInRange("Exposure setting out of bound", compensatedExposureValue,
@@ -1374,8 +1100,10 @@
             mCollector.expectEquals("Exposure compensation result should match requested value.",
                     exposureCompensation,
                     compensatedResult.get(CaptureResult.CONTROL_AE_EXPOSURE_COMPENSATION));
-            mCollector.expectTrue("Exposure lock should be set",
-                    compensatedResult.get(CaptureResult.CONTROL_AE_LOCK));
+            if (canSetAeLock) {
+                mCollector.expectTrue("Exposure lock should be set",
+                        compensatedResult.get(CaptureResult.CONTROL_AE_LOCK));
+            }
 
             Image image = imageListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
             validateJpegCapture(image, maxStillSz);
@@ -1383,7 +1111,9 @@
 
             // Recover AE compensation and lock
             previewRequest.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 0);
-            previewRequest.set(CaptureRequest.CONTROL_AE_LOCK, false);
+            if (canSetAeLock) {
+                previewRequest.set(CaptureRequest.CONTROL_AE_LOCK, false);
+            }
             mSession.setRepeatingRequest(previewRequest.build(), resultListener, mHandler);
         }
     }
@@ -1406,30 +1136,6 @@
     //----------------------------------------------------------------
     //---------Below are common functions for all tests.--------------
     //----------------------------------------------------------------
-
-    /**
-     * Simple validation of JPEG image size and format.
-     * <p>
-     * Only validate the image object sanity. It is fast, but doesn't actually
-     * check the buffer data. Assert is used here as it make no sense to
-     * continue the test if the jpeg image captured has some serious failures.
-     * </p>
-     *
-     * @param image The captured jpeg image
-     * @param expectedSize Expected capture jpeg size
-     */
-    private static void basicValidateJpegImage(Image image, Size expectedSize) {
-        Size imageSz = new Size(image.getWidth(), image.getHeight());
-        assertTrue(
-                String.format("Image size doesn't match (expected %s, actual %s) ",
-                        expectedSize.toString(), imageSz.toString()), expectedSize.equals(imageSz));
-        assertEquals("Image format should be JPEG", ImageFormat.JPEG, image.getFormat());
-        assertNotNull("Image plane shouldn't be null", image.getPlanes());
-        assertEquals("Image plane number should be 1", 1, image.getPlanes().length);
-
-        // Jpeg decoding validate was done in ImageReaderTest, no need to duplicate the test here.
-    }
-
     /**
      * Validate standard raw (RAW16) capture image.
      *
@@ -1456,60 +1162,6 @@
                 ImageFormat.JPEG, /*filePath*/null);
     }
 
-    private static float getClosestValueInArray(float[] values, float target) {
-        int minIdx = 0;
-        float minDistance = Math.abs(values[0] - target);
-        for(int i = 0; i < values.length; i++) {
-            float distance = Math.abs(values[i] - target);
-            if (minDistance > distance) {
-                minDistance = distance;
-                minIdx = i;
-            }
-        }
-
-        return values[minIdx];
-    }
-
-    /**
-     * Validate and return the focal length.
-     *
-     * @param result Capture result to get the focal length
-     * @return Focal length from capture result or -1 if focal length is not available.
-     */
-    private float validateFocalLength(CaptureResult result) {
-        float[] focalLengths = mStaticInfo.getAvailableFocalLengthsChecked();
-        Float resultFocalLength = result.get(CaptureResult.LENS_FOCAL_LENGTH);
-        if (mCollector.expectTrue("Focal length is invalid",
-                resultFocalLength != null && resultFocalLength > 0)) {
-            List<Float> focalLengthList =
-                    Arrays.asList(CameraTestUtils.toObject(focalLengths));
-            mCollector.expectTrue("Focal length should be one of the available focal length",
-                    focalLengthList.contains(resultFocalLength));
-            return resultFocalLength;
-        }
-        return -1;
-    }
-
-    /**
-     * Validate and return the aperture.
-     *
-     * @param result Capture result to get the aperture
-     * @return Aperture from capture result or -1 if aperture is not available.
-     */
-    private float validateAperture(CaptureResult result) {
-        float[] apertures = mStaticInfo.getAvailableAperturesChecked();
-        Float resultAperture = result.get(CaptureResult.LENS_APERTURE);
-        if (mCollector.expectTrue("Capture result aperture is invalid",
-                resultAperture != null && resultAperture > 0)) {
-            List<Float> apertureList =
-                    Arrays.asList(CameraTestUtils.toObject(apertures));
-            mCollector.expectTrue("Aperture should be one of the available apertures",
-                    apertureList.contains(resultAperture));
-            return resultAperture;
-        }
-        return -1;
-    }
-
     private static class SimpleAutoFocusListener implements Camera2Focuser.AutoFocusListener {
         final ConditionVariable focusDone = new ConditionVariable();
         @Override
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java
index 01da4c8..06daa51 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java
@@ -18,6 +18,8 @@
 
 import static android.hardware.camera2.cts.CameraTestUtils.*;
 
+import android.graphics.ImageFormat;
+import android.view.Surface;
 import android.hardware.camera2.CameraCaptureSession;
 import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
 import android.hardware.camera2.CameraDevice;
@@ -29,6 +31,7 @@
 import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
 import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
 import android.util.Log;
+import android.util.Pair;
 import android.util.Range;
 
 import org.mockito.ArgumentCaptor;
@@ -36,6 +39,7 @@
 
 import static org.mockito.Mockito.*;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -73,7 +77,11 @@
             try {
                 Log.i(TAG, "Testing preview for Camera " + mCameraIds[i]);
                 openDevice(mCameraIds[i]);
-
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + mCameraIds[i] +
+                            " does not support color outputs, skipping");
+                    continue;
+                }
                 previewTestByCamera();
             } finally {
                 closeDevice();
@@ -93,7 +101,11 @@
             try {
                 Log.i(TAG, "Testing preview for Camera " + mCameraIds[i]);
                 openDevice(mCameraIds[i]);
-
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + mCameraIds[i] +
+                            " does not support color outputs, skipping");
+                    continue;
+                }
                 previewTestPatternTestByCamera();
             } finally {
                 closeDevice();
@@ -109,7 +121,10 @@
         for (String id : mCameraIds) {
             try {
                 openDevice(id);
-
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + id + " does not support color outputs, skipping");
+                    continue;
+                }
                 previewFpsRangeTestByCamera();
             } finally {
                 closeDevice();
@@ -118,6 +133,199 @@
     }
 
     /**
+     * Test to verify the {@link CameraCaptureSession#prepare} method works correctly, and has the
+     * expected effects on performance.
+     *
+     * - Ensure that prepare() results in onSurfacePrepared() being invoked
+     * - Ensure that prepare() does not cause preview glitches while operating
+     * - Ensure that starting to use a newly-prepared output does not cause additional
+     *   preview glitches to occur
+     */
+    public void testPreparePerformance() throws Throwable {
+        for (int i = 0; i < mCameraIds.length; i++) {
+            try {
+                openDevice(mCameraIds[i]);
+                if (!mStaticInfo.isColorOutputSupported()) {
+                    Log.i(TAG, "Camera " + mCameraIds[i] +
+                            " does not support color outputs, skipping");
+                    continue;
+                }
+                preparePerformanceTestByCamera(mCameraIds[i]);
+            }
+            finally {
+                closeDevice();
+            }
+        }
+    }
+
+    private void preparePerformanceTestByCamera(String cameraId) throws Exception {
+        final int MAX_IMAGES_TO_PREPARE = 10;
+        final int UNKNOWN_LATENCY_RESULT_WAIT = 5;
+        final int MAX_RESULTS_TO_WAIT = 10;
+        final int FRAMES_FOR_AVERAGING = 100;
+        final int PREPARE_TIMEOUT_MS = 10000; // 10 s
+        final float PREPARE_FRAME_RATE_BOUNDS = 0.05f; // fraction allowed difference
+        final float PREPARE_PEAK_RATE_BOUNDS = 0.5f; // fraction allowed difference
+
+        Size maxYuvSize = getSupportedPreviewSizes(cameraId, mCameraManager, null).get(0);
+        Size maxPreviewSize = mOrderedPreviewSizes.get(0);
+
+        // Don't need image data, just drop it right away to minimize overhead
+        ImageDropperListener imageListener = new ImageDropperListener();
+
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
+
+        CaptureRequest.Builder previewRequest =
+                mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
+
+        // Configure outputs and session
+
+        updatePreviewSurface(maxPreviewSize);
+
+        createImageReader(maxYuvSize, ImageFormat.YUV_420_888, MAX_IMAGES_TO_PREPARE, imageListener);
+
+        List<Surface> outputSurfaces = new ArrayList<Surface>();
+        outputSurfaces.add(mPreviewSurface);
+        outputSurfaces.add(mReaderSurface);
+
+        CameraCaptureSession.StateCallback mockSessionListener =
+                mock(CameraCaptureSession.StateCallback.class);
+
+        mSession = configureCameraSession(mCamera, outputSurfaces, mockSessionListener, mHandler);
+
+        previewRequest.addTarget(mPreviewSurface);
+        Range<Integer> maxFpsTarget = mStaticInfo.getAeMaxTargetFpsRange();
+        previewRequest.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, maxFpsTarget);
+
+        mSession.setRepeatingRequest(previewRequest.build(), resultListener, mHandler);
+
+        // Converge AE
+        waitForAeStable(resultListener, UNKNOWN_LATENCY_RESULT_WAIT);
+
+        if (mStaticInfo.isAeLockSupported()) {
+            // Lock AE if possible to improve stability
+            previewRequest.set(CaptureRequest.CONTROL_AE_LOCK, true);
+            mSession.setRepeatingRequest(previewRequest.build(), resultListener, mHandler);
+            if (mStaticInfo.isHardwareLevelLimitedOrBetter()) {
+                // Legacy mode doesn't output AE state
+                waitForResultValue(resultListener, CaptureResult.CONTROL_AE_STATE,
+                        CaptureResult.CONTROL_AE_STATE_LOCKED, MAX_RESULTS_TO_WAIT);
+            }
+        }
+
+        // Measure frame rate for a bit
+        Pair<Long, Long> frameDurationStats =
+                measureMeanFrameInterval(resultListener, FRAMES_FOR_AVERAGING, /*prevTimestamp*/ 0);
+
+        Log.i(TAG, String.format("Frame interval avg during normal preview: %f ms, peak %f ms",
+                        frameDurationStats.first / 1e6, frameDurationStats.second / 1e6));
+
+        // Drain results, do prepare
+        resultListener.drain();
+
+        mSession.prepare(mReaderSurface);
+
+        verify(mockSessionListener,
+                timeout(PREPARE_TIMEOUT_MS).times(1)).
+                onSurfacePrepared(eq(mSession), eq(mReaderSurface));
+
+        // Calculate frame rate during prepare
+
+        int resultsReceived = (int) resultListener.getTotalNumFrames();
+        if (resultsReceived > 2) {
+            // Only verify frame rate if there are a couple of results
+            Pair<Long, Long> whilePreparingFrameDurationStats =
+                    measureMeanFrameInterval(resultListener, resultsReceived, /*prevTimestamp*/ 0);
+
+            Log.i(TAG, String.format("Frame interval during prepare avg: %f ms, peak %f ms",
+                            whilePreparingFrameDurationStats.first / 1e6,
+                            whilePreparingFrameDurationStats.second / 1e6));
+
+            if (mStaticInfo.isHardwareLevelLimitedOrBetter()) {
+                mCollector.expectTrue(
+                    String.format("Camera %s: Preview peak frame interval affected by prepare " +
+                            "call: preview avg frame duration: %f ms, peak during prepare: %f ms",
+                            cameraId,
+                            frameDurationStats.first / 1e6,
+                            whilePreparingFrameDurationStats.second / 1e6),
+                    (whilePreparingFrameDurationStats.second <=
+                            frameDurationStats.first * (1 + PREPARE_PEAK_RATE_BOUNDS)));
+                mCollector.expectTrue(
+                    String.format("Camera %s: Preview average frame interval affected by prepare " +
+                            "call: preview avg frame duration: %f ms, during prepare: %f ms",
+                            cameraId,
+                            frameDurationStats.first / 1e6,
+                            whilePreparingFrameDurationStats.first / 1e6),
+                    (whilePreparingFrameDurationStats.first <=
+                            frameDurationStats.first * (1 + PREPARE_FRAME_RATE_BOUNDS)));
+            }
+        }
+
+        resultListener.drain();
+
+        // Get at least one more preview result without prepared target
+        CaptureResult result = resultListener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
+        long prevTimestamp = result.get(CaptureResult.SENSOR_TIMESTAMP);
+
+        // Now use the prepared stream and ensure there are no hiccups from using it
+        previewRequest.addTarget(mReaderSurface);
+
+        mSession.setRepeatingRequest(previewRequest.build(), resultListener, mHandler);
+
+        Pair<Long, Long> preparedFrameDurationStats =
+                measureMeanFrameInterval(resultListener, MAX_IMAGES_TO_PREPARE*2, prevTimestamp);
+
+        Log.i(TAG, String.format("Frame interval with prepared stream added avg: %f ms, peak %f ms",
+                        preparedFrameDurationStats.first / 1e6,
+                        preparedFrameDurationStats.second / 1e6));
+
+        if (mStaticInfo.isHardwareLevelLimitedOrBetter()) {
+            mCollector.expectTrue(
+                String.format("Camera %s: Preview peak frame interval affected by use of new " +
+                        " stream: preview avg frame duration: %f ms, peak with new stream: %f ms",
+                        cameraId,
+                        frameDurationStats.first / 1e6, preparedFrameDurationStats.second / 1e6),
+                (preparedFrameDurationStats.second <=
+                        frameDurationStats.first * (1 + PREPARE_PEAK_RATE_BOUNDS)));
+            mCollector.expectTrue(
+                String.format("Camera %s: Preview average frame interval affected by use of new " +
+                        "stream: preview avg frame duration: %f ms, with new stream: %f ms",
+                        cameraId,
+                        frameDurationStats.first / 1e6, preparedFrameDurationStats.first / 1e6),
+                (preparedFrameDurationStats.first <=
+                        frameDurationStats.first * (1 + PREPARE_FRAME_RATE_BOUNDS)));
+        }
+    }
+
+    /**
+     * Measure the inter-frame interval based on SENSOR_TIMESTAMP for frameCount frames from the
+     * provided capture listener.  If prevTimestamp is positive, it is used for the first interval
+     * calculation; otherwise, the first result is used to establish the starting time.
+     *
+     * Returns the mean interval in the first pair entry, and the largest interval in the second
+     * pair entry
+     */
+    Pair<Long, Long> measureMeanFrameInterval(SimpleCaptureCallback resultListener, int frameCount,
+            long prevTimestamp) throws Exception {
+        long summedIntervals = 0;
+        long maxInterval = 0;
+        int measurementCount = frameCount - ((prevTimestamp > 0) ? 0 : 1);
+
+        for (int i = 0; i < frameCount; i++) {
+            CaptureResult result = resultListener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
+            long timestamp = result.get(CaptureResult.SENSOR_TIMESTAMP);
+            if (prevTimestamp > 0) {
+                long interval = timestamp - prevTimestamp;
+                if (interval > maxInterval) maxInterval = interval;
+                summedIntervals += interval;
+            }
+            prevTimestamp = timestamp;
+        }
+        return new Pair<Long, Long>(summedIntervals / measurementCount, maxInterval);
+    }
+
+
+    /**
      * Test preview fps range for all supported ranges. The exposure time are frame duration are
      * validated.
      */
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraErrorCollector.java b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraErrorCollector.java
index 0ee5ffc..9f0c012 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraErrorCollector.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraErrorCollector.java
@@ -22,6 +22,7 @@
 import android.hardware.camera2.CaptureRequest.Builder;
 import android.hardware.camera2.CaptureResult;
 import android.hardware.camera2.params.MeteringRectangle;
+import android.media.Image;
 import android.util.Log;
 import android.util.Size;
 
@@ -1049,4 +1050,13 @@
         Set<T> sizeSet = new HashSet<T>(list);
         expectTrue(msg + " each element must be distinct", sizeSet.size() == list.size());
     }
+
+    public void expectImageProperties(String msg, Image image, int format, Size size,
+            long timestampNs) {
+        expectEquals(msg + "Image format is wrong.", image.getFormat(), format);
+        expectEquals(msg + "Image width is wrong.", image.getWidth(), size.getWidth());
+        expectEquals(msg + "Image height is wrong.", image.getHeight(), size.getHeight());
+        expectEquals(msg + "Image timestamp is wrong.", image.getTimestamp(), timestampNs);
+    }
+
 }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java
index 2a654db3..4310b3a 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java
@@ -41,6 +41,8 @@
 import java.util.List;
 import java.util.Set;
 
+import static android.hardware.camera2.cts.helpers.AssertHelpers.*;
+
 /**
  * Helpers to get common static info out of the camera.
  *
@@ -64,12 +66,53 @@
     private static final int CONTROL_AE_COMPENSATION_RANGE_DEFAULT_MAX = 2;
     private static final Rational CONTROL_AE_COMPENSATION_STEP_DEFAULT = new Rational(1, 2);
     private static final byte REQUEST_PIPELINE_MAX_DEPTH_MAX = 8;
+    private static final int MAX_REPROCESS_MAX_CAPTURE_STALL = 4;
 
     // TODO: Consider making this work across any metadata object, not just camera characteristics
     private final CameraCharacteristics mCharacteristics;
     private final CheckLevel mLevel;
     private final CameraErrorCollector mCollector;
 
+    // Index with android.control.aeMode
+    public static final String[] AE_MODE_NAMES = new String[] {
+        "AE_MODE_OFF",
+        "AE_MODE_ON",
+        "AE_MODE_ON_AUTO_FLASH",
+        "AE_MODE_ON_ALWAYS_FLASH",
+        "AE_MODE_ON_AUTO_FLASH_REDEYE"
+    };
+
+    // Index with android.control.afMode
+    public static final String[] AF_MODE_NAMES = new String[] {
+        "AF_MODE_OFF",
+        "AF_MODE_AUTO",
+        "AF_MODE_MACRO",
+        "AF_MODE_CONTINUOUS_VIDEO",
+        "AF_MODE_CONTINUOUS_PICTURE",
+        "AF_MODE_EDOF"
+    };
+
+    // Index with android.control.aeState
+    public static final String[] AE_STATE_NAMES = new String[] {
+        "AE_STATE_INACTIVE",
+        "AE_STATE_SEARCHING",
+        "AE_STATE_CONVERGED",
+        "AE_STATE_LOCKED",
+        "AE_STATE_FLASH_REQUIRED",
+        "AE_STATE_PRECAPTURE"
+    };
+
+    // Index with android.control.afState
+    public static final String[] AF_STATE_NAMES = new String[] {
+        "AF_STATE_INACTIVE",
+        "AF_STATE_PASSIVE_SCAN",
+        "AF_STATE_PASSIVE_FOCUSED",
+        "AF_STATE_ACTIVE_SCAN",
+        "AF_STATE_FOCUSED_LOCKED",
+        "AF_STATE_NOT_FOCUSED_LOCKED",
+        "AF_STATE_PASSIVE_UNFOCUSED"
+    };
+
     public enum CheckLevel {
         /** Only log warnings for metadata check failures. Execution continues. */
         WARN,
@@ -394,7 +437,7 @@
      * @return AE max regions supported by the camera device
      */
     public int getAeMaxRegionsChecked() {
-        Integer regionCount = getValueFromKeyNonNull(CameraCharacteristics.CONTROL_MAX_REGIONS_AE);
+        Integer regionCount = mCharacteristics.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AE);
         if (regionCount == null) {
             return 0;
         }
@@ -407,7 +450,7 @@
      * @return AWB max regions supported by the camera device
      */
     public int getAwbMaxRegionsChecked() {
-        Integer regionCount = getValueFromKeyNonNull(CameraCharacteristics.CONTROL_MAX_REGIONS_AWB);
+        Integer regionCount = mCharacteristics.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AWB);
         if (regionCount == null) {
             return 0;
         }
@@ -420,7 +463,7 @@
      * @return AF max regions supported by the camera device
      */
     public int getAfMaxRegionsChecked() {
-        Integer regionCount = getValueFromKeyNonNull(CameraCharacteristics.CONTROL_MAX_REGIONS_AF);
+        Integer regionCount = mCharacteristics.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AF);
         if (regionCount == null) {
             return 0;
         }
@@ -586,6 +629,17 @@
             checkTrueForKey(key, "Full-capability camera devices must support FAST mode",
                     modeList.contains(CameraMetadata.HOT_PIXEL_MODE_FAST));
         }
+
+        if (isHardwareLevelLimitedOrBetter()) {
+            // FAST and HIGH_QUALITY mode must be both present or both not present
+            List<Integer> coupledModes = Arrays.asList(new Integer[] {
+                    CameraMetadata.HOT_PIXEL_MODE_FAST,
+                    CameraMetadata.HOT_PIXEL_MODE_HIGH_QUALITY
+            });
+            checkTrueForKey(
+                    key, " FAST and HIGH_QUALITY mode must both present or both not present",
+                    containsAllOrNone(modeList, coupledModes));
+        }
         checkElementDistinct(key, modeList);
         checkArrayValuesInRange(key, modes, CameraMetadata.HOT_PIXEL_MODE_OFF,
                 CameraMetadata.HOT_PIXEL_MODE_HIGH_QUALITY);
@@ -666,16 +720,22 @@
         List<Integer> modeList = Arrays.asList(CameraTestUtils.toObject(modes));
         checkTrueForKey(key, " Camera devices must always support FAST mode",
                 modeList.contains(CameraMetadata.TONEMAP_MODE_FAST));
-        if (isCapabilitySupported(
-                CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING)) {
-            checkTrueForKey(key, "MANUAL_POST_PROCESSING supported camera devices must support"
-                    + "CONTRAST_CURVE mode",
-                    modeList.contains(CameraMetadata.TONEMAP_MODE_CONTRAST_CURVE) &&
-                    modeList.contains(CameraMetadata.TONEMAP_MODE_FAST));
+        // Qualification check for MANUAL_POSTPROCESSING capability is in
+        // StaticMetadataTest#testCapabilities
+
+        if (isHardwareLevelLimitedOrBetter()) {
+            // FAST and HIGH_QUALITY mode must be both present or both not present
+            List<Integer> coupledModes = Arrays.asList(new Integer[] {
+                    CameraMetadata.TONEMAP_MODE_FAST,
+                    CameraMetadata.TONEMAP_MODE_HIGH_QUALITY
+            });
+            checkTrueForKey(
+                    key, " FAST and HIGH_QUALITY mode must both present or both not present",
+                    containsAllOrNone(modeList, coupledModes));
         }
         checkElementDistinct(key, modeList);
         checkArrayValuesInRange(key, modes, CameraMetadata.TONEMAP_MODE_CONTRAST_CURVE,
-                CameraMetadata.TONEMAP_MODE_HIGH_QUALITY);
+                CameraMetadata.TONEMAP_MODE_PRESET_CURVE);
 
         return modes;
     }
@@ -688,16 +748,23 @@
     public int getMaxTonemapCurvePointChecked() {
         Key<Integer> key = CameraCharacteristics.TONEMAP_MAX_CURVE_POINTS;
         Integer count = getValueFromKeyNonNull(key);
+        List<Integer> modeList =
+                Arrays.asList(CameraTestUtils.toObject(getAvailableToneMapModesChecked()));
+        boolean tonemapCurveOutputSupported =
+                modeList.contains(CameraMetadata.TONEMAP_MODE_CONTRAST_CURVE) ||
+                modeList.contains(CameraMetadata.TONEMAP_MODE_GAMMA_VALUE) ||
+                modeList.contains(CameraMetadata.TONEMAP_MODE_PRESET_CURVE);
 
         if (count == null) {
+            if (tonemapCurveOutputSupported) {
+                Assert.fail("Tonemap curve output is supported but MAX_CURVE_POINTS is null");
+            }
             return 0;
         }
 
-        List<Integer> modeList =
-                Arrays.asList(CameraTestUtils.toObject(getAvailableToneMapModesChecked()));
-        if (modeList.contains(CameraMetadata.TONEMAP_MODE_CONTRAST_CURVE)) {
-            checkTrueForKey(key, "Full-capability camera device must support maxCurvePoints "
-                    + ">= " + TONEMAP_MAX_CURVE_POINTS_AT_LEAST,
+        if (tonemapCurveOutputSupported) {
+            checkTrueForKey(key, "Tonemap curve output supported camera device must support "
+                    + "maxCurvePoints >= " + TONEMAP_MAX_CURVE_POINTS_AT_LEAST,
                     count >= TONEMAP_MAX_CURVE_POINTS_AT_LEAST);
         }
 
@@ -718,6 +785,26 @@
     }
 
     /**
+     * Get and check pre-correction active array size.
+     */
+    public Rect getPreCorrectedActiveArraySizeChecked() {
+        Key<Rect> key = CameraCharacteristics.SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE;
+        Rect activeArray = getValueFromKeyNonNull(key);
+
+        if (activeArray == null) {
+            return new Rect(0, 0, 0, 0);
+        }
+
+        Size pixelArraySize = getPixelArraySizeChecked();
+        checkTrueForKey(key, "values left/top are invalid", activeArray.left >= 0 && activeArray.top >= 0);
+        checkTrueForKey(key, "values width/height are invalid",
+                activeArray.width() <= pixelArraySize.getWidth() &&
+                activeArray.height() <= pixelArraySize.getHeight());
+
+        return activeArray;
+    }
+
+    /**
      * Get and check active array size.
      */
     public Rect getActiveArraySizeChecked() {
@@ -738,6 +825,29 @@
     }
 
     /**
+     * Get the dimensions to use for RAW16 buffers.
+     */
+    public Size getRawDimensChecked() throws Exception {
+        Size[] targetCaptureSizes = getAvailableSizesForFormatChecked(ImageFormat.RAW_SENSOR,
+                        StaticMetadata.StreamDirection.Output);
+        Assert.assertTrue("No capture sizes available for RAW format!",
+                targetCaptureSizes.length != 0);
+        Rect activeArray = getPreCorrectedActiveArraySizeChecked();
+        Size preCorrectionActiveArraySize =
+                new Size(activeArray.width(), activeArray.height());
+        Size pixelArraySize = getPixelArraySizeChecked();
+        Assert.assertTrue("Missing pre-correction active array size", activeArray.width() > 0 &&
+                activeArray.height() > 0);
+        Assert.assertTrue("Missing pixel array size", pixelArraySize.getWidth() > 0 &&
+                pixelArraySize.getHeight() > 0);
+        Size[] allowedArraySizes = new Size[] { preCorrectionActiveArraySize,
+                pixelArraySize };
+        return assertArrayContainsAnyOf("Available sizes for RAW format" +
+                " must include either the pre-corrected active array size, or the full " +
+                "pixel array size", targetCaptureSizes, allowedArraySizes);
+    }
+
+    /**
      * Get the sensitivity value and clamp to the range if needed.
      *
      * @param sensitivity Input sensitivity value to check.
@@ -955,6 +1065,62 @@
     }
 
     /**
+     * get android.control.availableModes and do the sanity check.
+     *
+     * @return available control modes.
+     */
+    public int[] getAvailableControlModesChecked() {
+        Key<int[]> modesKey = CameraCharacteristics.CONTROL_AVAILABLE_MODES;
+        int[] modes = getValueFromKeyNonNull(modesKey);
+        if (modes == null) {
+            modes = new int[0];
+        }
+
+        List<Integer> modeList = Arrays.asList(CameraTestUtils.toObject(modes));
+        checkTrueForKey(modesKey, "value is empty", !modeList.isEmpty());
+
+        // All camera device must support AUTO
+        checkTrueForKey(modesKey, "values " + modeList.toString() + " must contain AUTO mode",
+                modeList.contains(CameraMetadata.CONTROL_MODE_AUTO));
+
+        boolean isAeOffSupported =  Arrays.asList(
+                CameraTestUtils.toObject(getAeAvailableModesChecked())).contains(
+                        CameraMetadata.CONTROL_AE_MODE_OFF);
+        boolean isAfOffSupported =  Arrays.asList(
+                CameraTestUtils.toObject(getAfAvailableModesChecked())).contains(
+                        CameraMetadata.CONTROL_AF_MODE_OFF);
+        boolean isAwbOffSupported =  Arrays.asList(
+                CameraTestUtils.toObject(getAwbAvailableModesChecked())).contains(
+                        CameraMetadata.CONTROL_AWB_MODE_OFF);
+        if (isAeOffSupported && isAfOffSupported && isAwbOffSupported) {
+            // 3A OFF controls are supported, OFF mode must be supported here.
+            checkTrueForKey(modesKey, "values " + modeList.toString() + " must contain OFF mode",
+                    modeList.contains(CameraMetadata.CONTROL_MODE_OFF));
+        }
+
+        if (isSceneModeSupported()) {
+            checkTrueForKey(modesKey, "values " + modeList.toString() + " must contain"
+                    + " USE_SCENE_MODE",
+                    modeList.contains(CameraMetadata.CONTROL_MODE_USE_SCENE_MODE));
+        }
+
+        return modes;
+    }
+
+    public boolean isSceneModeSupported() {
+        List<Integer> availableSceneModes = Arrays.asList(
+                CameraTestUtils.toObject(getAvailableSceneModesChecked()));
+
+        if (availableSceneModes.isEmpty()) {
+            return false;
+        }
+
+        // If sceneMode is not supported, camera device will contain single entry: DISABLED.
+        return availableSceneModes.size() > 1 ||
+                !availableSceneModes.contains(CameraMetadata.CONTROL_SCENE_MODE_DISABLED);
+    }
+
+    /**
      * Get aeAvailableModes and do the sanity check.
      *
      * <p>Depending on the check level this class has, for WAR or COLLECT levels,
@@ -1087,7 +1253,7 @@
      *
      * @return Empty size array if jpeg output is not supported
      */
-    public Size[] getJpegOutputSizeChecked() {
+    public Size[] getJpegOutputSizesChecked() {
         return getAvailableSizesForFormatChecked(ImageFormat.JPEG,
                 StreamDirection.Output);
     }
@@ -1104,15 +1270,73 @@
     }
 
     /**
-     * Get available sizes for given user-defined format.
+     * Get available formats for a given direction.
      *
-     * <p><strong>Does not</strong> work with implementation-defined format.</p>
+     * @param direction The stream direction, input or output.
+     * @return The formats of the given direction, empty array if no available format is found.
+     */
+    public int[] getAvailableFormats(StreamDirection direction) {
+        Key<StreamConfigurationMap> key =
+                CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP;
+        StreamConfigurationMap config = getValueFromKeyNonNull(key);
+
+        if (config == null) {
+            return new int[0];
+        }
+
+        switch (direction) {
+            case Output:
+                return config.getOutputFormats();
+            case Input:
+                return config.getInputFormats();
+            default:
+                throw new IllegalArgumentException("direction must be output or input");
+        }
+    }
+
+    /**
+     * Get valid output formats for a given input format.
+     *
+     * @param inputFormat The input format used to produce the output images.
+     * @return The output formats for the given input format, empty array if
+     *         no available format is found.
+     */
+    public int[] getValidOutputFormatsForInput(int inputFormat) {
+        Key<StreamConfigurationMap> key =
+                CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP;
+        StreamConfigurationMap config = getValueFromKeyNonNull(key);
+
+        if (config == null) {
+            return new int[0];
+        }
+
+        return config.getValidOutputFormatsForInput(inputFormat);
+    }
+
+    /**
+     * Get available sizes for given format and direction.
      *
      * @param format The format for the requested size array.
      * @param direction The stream direction, input or output.
      * @return The sizes of the given format, empty array if no available size is found.
      */
     public Size[] getAvailableSizesForFormatChecked(int format, StreamDirection direction) {
+        return getAvailableSizesForFormatChecked(format, direction,
+                /*fastSizes*/true, /*slowSizes*/true);
+    }
+
+    /**
+     * Get available sizes for given format and direction, and whether to limit to slow or fast
+     * resolutions.
+     *
+     * @param format The format for the requested size array.
+     * @param direction The stream direction, input or output.
+     * @param fastSizes whether to include getOutputSizes() sizes (generally faster)
+     * @param slowSizes whether to include getHighResolutionOutputSizes() sizes (generally slower)
+     * @return The sizes of the given format, empty array if no available size is found.
+     */
+    public Size[] getAvailableSizesForFormatChecked(int format, StreamDirection direction,
+            boolean fastSizes, boolean slowSizes) {
         Key<StreamConfigurationMap> key =
                 CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP;
         StreamConfigurationMap config = getValueFromKeyNonNull(key);
@@ -1121,28 +1345,37 @@
             return new Size[0];
         }
 
-        android.util.Size[] utilSizes;
+        Size[] sizes = null;
 
         switch (direction) {
             case Output:
-                utilSizes = config.getOutputSizes(format);
+                Size[] fastSizeList = null;
+                Size[] slowSizeList = null;
+                if (fastSizes) {
+                    fastSizeList = config.getOutputSizes(format);
+                }
+                if (slowSizes) {
+                    slowSizeList = config.getHighResolutionOutputSizes(format);
+                }
+                if (fastSizeList != null && slowSizeList != null) {
+                    sizes = new Size[slowSizeList.length + fastSizeList.length];
+                    System.arraycopy(fastSizeList, 0, sizes, 0, fastSizeList.length);
+                    System.arraycopy(slowSizeList, 0, sizes, fastSizeList.length, slowSizeList.length);
+                } else if (fastSizeList != null) {
+                    sizes = fastSizeList;
+                } else if (slowSizeList != null) {
+                    sizes = slowSizeList;
+                }
                 break;
             case Input:
-                utilSizes = null;
+                sizes = config.getInputSizes(format);
                 break;
             default:
                 throw new IllegalArgumentException("direction must be output or input");
         }
 
-        // TODO: Get rid of android.util.Size
-        if (utilSizes == null) {
-            Log.i(TAG, "This camera doesn't support format " + format + " for " + direction);
-            return new Size[0];
-        }
-
-        Size[] sizes = new Size[utilSizes.length];
-        for (int i = 0; i < utilSizes.length; ++i) {
-            sizes[i] = new Size(utilSizes[i].getWidth(), utilSizes[i].getHeight());
+        if (sizes == null) {
+            sizes = new Size[0];
         }
 
         return sizes;
@@ -1168,9 +1401,17 @@
         int fpsRangeLength = fpsRanges.length;
         int minFps, maxFps;
         long maxFrameDuration = getMaxFrameDurationChecked();
+        boolean foundConstant30Range = false;
+        boolean foundPreviewStreamingRange = false;
         for (int i = 0; i < fpsRangeLength; i += 1) {
             minFps = fpsRanges[i].getLower();
             maxFps = fpsRanges[i].getUpper();
+            if (minFps == 30 && maxFps == 30) {
+                foundConstant30Range = true;
+            }
+            if (minFps <= 15 && maxFps >= 30) {
+                foundPreviewStreamingRange = true;
+            }
             checkTrueForKey(key, " min fps must be no larger than max fps!",
                     minFps > 0 && maxFps >= minFps);
             long maxDuration = (long) (1e9 / minFps);
@@ -1178,11 +1419,38 @@
                     " the frame duration %d for min fps %d must smaller than maxFrameDuration %d",
                     maxDuration, minFps, maxFrameDuration), maxDuration <= maxFrameDuration);
         }
-
+        checkTrueForKey(key, String.format(" (30, 30) must be included"), foundConstant30Range);
+        checkTrueForKey(key, String.format(
+                " (min, max) where min <= 15 and max >= 30 must be included"),
+                foundPreviewStreamingRange);
         return fpsRanges;
     }
 
     /**
+     * Get the highest supported target FPS range.
+     * Prioritizes maximizing the min FPS, then the max FPS without lowering min FPS.
+     */
+    public Range<Integer> getAeMaxTargetFpsRange() {
+        Range<Integer>[] fpsRanges = getAeAvailableTargetFpsRangesChecked();
+
+        Range<Integer> targetRange = fpsRanges[0];
+        // Assume unsorted list of target FPS ranges, so use two passes, first maximize min FPS
+        for (Range<Integer> candidateRange : fpsRanges) {
+            if (candidateRange.getLower() > targetRange.getLower()) {
+                targetRange = candidateRange;
+            }
+        }
+        // Then maximize max FPS while not lowering min FPS
+        for (Range<Integer> candidateRange : fpsRanges) {
+            if (candidateRange.getLower() >= targetRange.getLower() &&
+                    candidateRange.getUpper() > targetRange.getUpper()) {
+                targetRange = candidateRange;
+            }
+        }
+        return targetRange;
+    }
+
+    /**
      * Get max frame duration.
      *
      * @return 0 if maxFrameDuration is null
@@ -1200,9 +1468,7 @@
     }
 
     /**
-     * Get available minimal frame durations for a given user-defined format.
-     *
-     * <p><strong>Does not</strong> work with implementation-defined format.</p>
+     * Get available minimal frame durations for a given format.
      *
      * @param format One of the format from {@link ImageFormat}.
      * @return HashMap of minimal frame durations for different sizes, empty HashMap
@@ -1220,7 +1486,8 @@
             return minDurationMap;
         }
 
-        for (android.util.Size size : config.getOutputSizes(format)) {
+        for (android.util.Size size : getAvailableSizesForFormatChecked(format,
+                StreamDirection.Output)) {
             long minFrameDuration = config.getOutputMinFrameDuration(format, size);
 
             if (minFrameDuration != 0) {
@@ -1239,14 +1506,25 @@
             return new int[0];
         }
 
+        List<Integer> modeList = Arrays.asList(CameraTestUtils.toObject(edgeModes));
         // Full device should always include OFF and FAST
         if (isHardwareLevelFull()) {
-            List<Integer> modeList = Arrays.asList(CameraTestUtils.toObject(edgeModes));
             checkTrueForKey(key, "Full device must contain OFF and FAST edge modes",
                     modeList.contains(CameraMetadata.EDGE_MODE_OFF) &&
                     modeList.contains(CameraMetadata.EDGE_MODE_FAST));
         }
 
+        if (isHardwareLevelLimitedOrBetter()) {
+            // FAST and HIGH_QUALITY mode must be both present or both not present
+            List<Integer> coupledModes = Arrays.asList(new Integer[] {
+                    CameraMetadata.EDGE_MODE_FAST,
+                    CameraMetadata.EDGE_MODE_HIGH_QUALITY
+            });
+            checkTrueForKey(
+                    key, " FAST and HIGH_QUALITY mode must both present or both not present",
+                    containsAllOrNone(modeList, coupledModes));
+        }
+
         return edgeModes;
     }
 
@@ -1259,14 +1537,25 @@
             return new int[0];
         }
 
+        List<Integer> modeList = Arrays.asList(CameraTestUtils.toObject(noiseReductionModes));
         // Full device should always include OFF and FAST
         if (isHardwareLevelFull()) {
-            List<Integer> modeList = Arrays.asList(CameraTestUtils.toObject(noiseReductionModes));
+
             checkTrueForKey(key, "Full device must contain OFF and FAST noise reduction modes",
                     modeList.contains(CameraMetadata.NOISE_REDUCTION_MODE_OFF) &&
                     modeList.contains(CameraMetadata.NOISE_REDUCTION_MODE_FAST));
         }
 
+        if (isHardwareLevelLimitedOrBetter()) {
+            // FAST and HIGH_QUALITY mode must be both present or both not present
+            List<Integer> coupledModes = Arrays.asList(new Integer[] {
+                    CameraMetadata.NOISE_REDUCTION_MODE_FAST,
+                    CameraMetadata.NOISE_REDUCTION_MODE_HIGH_QUALITY
+            });
+            checkTrueForKey(
+                    key, " FAST and HIGH_QUALITY mode must both present or both not present",
+                    containsAllOrNone(modeList, coupledModes));
+        }
         return noiseReductionModes;
     }
 
@@ -1444,6 +1733,17 @@
         checkTrueForKey(key, " Camera devices must always support either OFF or FAST mode",
                 modeList.contains(CameraMetadata.COLOR_CORRECTION_ABERRATION_MODE_OFF) ||
                 modeList.contains(CameraMetadata.COLOR_CORRECTION_ABERRATION_MODE_FAST));
+
+        if (isHardwareLevelLimitedOrBetter()) {
+            // FAST and HIGH_QUALITY mode must be both present or both not present
+            List<Integer> coupledModes = Arrays.asList(new Integer[] {
+                    CameraMetadata.COLOR_CORRECTION_ABERRATION_MODE_FAST,
+                    CameraMetadata.COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY
+            });
+            checkTrueForKey(
+                    key, " FAST and HIGH_QUALITY mode must both present or both not present",
+                    containsAllOrNone(modeList, coupledModes));
+        }
         checkElementDistinct(key, modeList);
         checkArrayValuesInRange(key, modes,
                 CameraMetadata.COLOR_CORRECTION_ABERRATION_MODE_OFF,
@@ -1473,6 +1773,52 @@
     }
 
     /**
+     * Get available lens shading modes.
+     */
+     public int[] getAvailableLensShadingModesChecked() {
+         Key<int[]> key =
+                 CameraCharacteristics.SHADING_AVAILABLE_MODES;
+         int[] modes = getValueFromKeyNonNull(key);
+         if (modes == null) {
+             return new int[0];
+         }
+
+         List<Integer> modeList = Arrays.asList(CameraTestUtils.toObject(modes));
+         // FAST must be included.
+         checkTrueForKey(key, " FAST must be included",
+                 modeList.contains(CameraMetadata.SHADING_MODE_FAST));
+
+         if (isCapabilitySupported(
+                 CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING)) {
+             checkTrueForKey(key, " OFF must be included for MANUAL_POST_PROCESSING devices",
+                     modeList.contains(CameraMetadata.SHADING_MODE_OFF));
+         }
+         return modes;
+     }
+
+     /**
+      * Get available lens shading map modes.
+      */
+      public int[] getAvailableLensShadingMapModesChecked() {
+          Key<int[]> key =
+                  CameraCharacteristics.STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES;
+          int[] modes = getValueFromKeyNonNull(key);
+          if (modes == null) {
+              return new int[0];
+          }
+
+          List<Integer> modeList = Arrays.asList(CameraTestUtils.toObject(modes));
+
+          if (isCapabilitySupported(
+                  CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_RAW)) {
+              checkTrueForKey(key, " ON must be included for RAW capability devices",
+                      modeList.contains(CameraMetadata.STATISTICS_LENS_SHADING_MAP_MODE_ON));
+          }
+          return modes;
+      }
+
+
+    /**
      * Get available capabilities and do the sanity check.
      *
      * @return reported available capabilities list, empty list if the value is unavailable.
@@ -1489,7 +1835,7 @@
 
         checkArrayValuesInRange(key, availableCaps,
                 CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE,
-                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE);
+                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO);
         capList = Arrays.asList(CameraTestUtils.toObject(availableCaps));
         return capList;
     }
@@ -1618,6 +1964,25 @@
     }
 
     /*
+     * Determine if camera device support AE lock control
+     *
+     * @return {@code true} if AE lock control is supported
+     */
+    public boolean isAeLockSupported() {
+        return getValueFromKeyNonNull(CameraCharacteristics.CONTROL_AE_LOCK_AVAILABLE);
+    }
+
+    /*
+     * Determine if camera device support AWB lock control
+     *
+     * @return {@code true} if AWB lock control is supported
+     */
+    public boolean isAwbLockSupported() {
+        return getValueFromKeyNonNull(CameraCharacteristics.CONTROL_AWB_LOCK_AVAILABLE);
+    }
+
+
+    /*
      * Determine if camera device support manual lens shading map control
      *
      * @return {@code true} if manual lens shading map control is supported
@@ -1631,7 +1996,7 @@
      *
      * @return {@code true} if manual color correction control is supported
      */
-    public boolean isManualColorCorrectionSupported() {
+    public boolean isColorCorrectionSupported() {
         return areKeysAvailable(CaptureRequest.COLOR_CORRECTION_MODE);
     }
 
@@ -1739,6 +2104,26 @@
     }
 
     /**
+     * Get maxCaptureStall frames or default value (if value doesn't exist)
+     * @return maxCaptureStall frames or default value.
+     */
+    public int getMaxCaptureStallOrDefault() {
+        Key<Integer> key =
+                CameraCharacteristics.REPROCESS_MAX_CAPTURE_STALL;
+        Integer value = getValueFromKeyNonNull(key);
+
+        if (value == null) {
+            return MAX_REPROCESS_MAX_CAPTURE_STALL;
+        }
+
+        checkTrueForKey(key, " value is out of range ",
+                value >= 0 &&
+                value <= MAX_REPROCESS_MAX_CAPTURE_STALL);
+
+        return value;
+    }
+
+    /**
      * Get the scaler's cropping type (center only or freeform)
      * @return cropping type, return default value (CENTER_ONLY) if value is unavailable
      */
@@ -1759,6 +2144,19 @@
     }
 
     /**
+     * Check if the constrained high speed video is supported by the camera device.
+     * The high speed FPS ranges and sizes are sanitized in
+     * ExtendedCameraCharacteristicsTest#testConstrainedHighSpeedCapability.
+     *
+     * @return true if the constrained high speed video is supported, false otherwise.
+     */
+    public boolean isConstrainedHighSpeedVideoSupported() {
+        List<Integer> availableCapabilities = getAvailableCapabilitiesChecked();
+        return (availableCapabilities.contains(
+                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO));
+    }
+
+    /**
      * Check if high speed video is supported (HIGH_SPEED_VIDEO scene mode is
      * supported, supported high speed fps ranges and sizes are valid).
      *
@@ -1792,6 +2190,23 @@
     }
 
     /**
+     * Check if depth output is supported, based on the depth capability
+     */
+    public boolean isDepthOutputSupported() {
+        return isCapabilitySupported(
+                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT);
+    }
+
+    /**
+     * Check if standard outputs (PRIVATE, YUV, JPEG) outputs are supported, based on the
+     * backwards-compatible capability
+     */
+    public boolean isColorOutputSupported() {
+        return isCapabilitySupported(
+                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE);
+    }
+
+    /**
      * Get the value in index for a fixed-size array from a given key.
      *
      * <p>If the camera device is incorrectly reporting values, log a warning and return
@@ -1928,6 +2343,19 @@
         }
     }
 
+    /* Helper function to check if the coupled modes are either all present or all non-present */
+    private <T> boolean containsAllOrNone(Collection<T> observedModes, Collection<T> coupledModes) {
+        if (observedModes.containsAll(coupledModes)) {
+            return true;
+        }
+        for (T mode : coupledModes) {
+            if (observedModes.contains(mode)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     private <T> void failKeyCheck(Key<T> key, String message) {
         // TODO: Consider only warning once per key/message combination if it's too spammy.
         // TODO: Consider offering other options such as throwing an assertion exception
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/rs/RawConverter.java b/tests/tests/hardware/src/android/hardware/camera2/cts/rs/RawConverter.java
index 33c212a..818b6c0 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/rs/RawConverter.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/rs/RawConverter.java
@@ -77,7 +77,7 @@
      * polynomial approximates the default tonemapping curve used for ACR3.
      */
     private static final float[] DEFAULT_ACR3_TONEMAP_CURVE_COEFFS = new float[] {
-            -1.087f,  1.643f,  0.443f, 0f
+            -0.7836f, 0.8469f, 0.943f, 0.0209f
     };
 
     /**
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/rs/raw_converter.rs b/tests/tests/hardware/src/android/hardware/camera2/cts/rs/raw_converter.rs
index c8b353e..fb467bb 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/rs/raw_converter.rs
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/rs/raw_converter.rs
@@ -169,6 +169,9 @@
         case 4: // impossible
         case 5: // impossible
         default:
+            finalRGB.x = 0.f;
+            finalRGB.y = 0.f;
+            finalRGB.z = 0.f;
             LOGD("raw_converter.rs: Logic error in tonemap.", 0);
             break;
     }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java
index ff69581..0108ee6 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java
@@ -20,6 +20,8 @@
 import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
 
 import android.content.Context;
+import android.graphics.ImageFormat;
+import android.graphics.Rect;
 import android.hardware.camera2.CameraCaptureSession;
 import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
 import android.hardware.camera2.CameraDevice;
@@ -31,6 +33,7 @@
 import android.hardware.camera2.cts.helpers.StaticMetadata;
 import android.hardware.camera2.cts.helpers.StaticMetadata.CheckLevel;
 import android.media.Image;
+import android.media.Image.Plane;
 import android.media.ImageReader;
 import android.os.Environment;
 import android.os.Handler;
@@ -43,6 +46,8 @@
 import com.android.ex.camera2.blocking.BlockingSessionCallback;
 import com.android.ex.camera2.blocking.BlockingStateCallback;
 
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
 import java.util.List;
 
 public class Camera2AndroidTestCase extends AndroidTestCase {
@@ -187,11 +192,13 @@
         mCollector.setCameraId(cameraId);
         mStaticInfo = new StaticMetadata(mCameraManager.getCameraCharacteristics(cameraId),
                 CheckLevel.ASSERT, /*collector*/null);
-        mOrderedPreviewSizes = getSupportedPreviewSizes(
-                cameraId, mCameraManager,
-                getPreviewSizeBound(mWindowManager, PREVIEW_SIZE_BOUND));
-        mOrderedVideoSizes = getSupportedVideoSizes(cameraId, mCameraManager, PREVIEW_SIZE_BOUND);
-        mOrderedStillSizes = getSupportedStillSizes(cameraId, mCameraManager, null);
+        if (mStaticInfo.isColorOutputSupported()) {
+            mOrderedPreviewSizes = getSupportedPreviewSizes(
+                    cameraId, mCameraManager,
+                    getPreviewSizeBound(mWindowManager, PREVIEW_SIZE_BOUND));
+            mOrderedVideoSizes = getSupportedVideoSizes(cameraId, mCameraManager, PREVIEW_SIZE_BOUND);
+            mOrderedStillSizes = getSupportedStillSizes(cameraId, mCameraManager, null);
+        }
 
         if (VERBOSE) {
             Log.v(TAG, "Camera " + cameraId + " is opened");
@@ -293,8 +300,10 @@
     protected ImageReader createImageReader(Size size, int format, int maxNumImages,
             ImageReader.OnImageAvailableListener listener) throws Exception {
 
-        ImageReader reader = ImageReader.newInstance(size.getWidth(), size.getHeight(),
+        ImageReader reader = null;
+        reader = ImageReader.newInstance(size.getWidth(), size.getHeight(),
                 format, maxNumImages);
+
         reader.setOnImageAvailableListener(listener, mHandler);
         if (VERBOSE) Log.v(TAG, "Created ImageReader size " + size.toString());
         return reader;
@@ -328,4 +337,159 @@
             }
         }
     }
+
+    protected CaptureRequest prepareCaptureRequest() throws Exception {
+        List<Surface> outputSurfaces = new ArrayList<Surface>();
+        Surface surface = mReader.getSurface();
+        assertNotNull("Fail to get surface from ImageReader", surface);
+        outputSurfaces.add(surface);
+        return prepareCaptureRequestForSurfaces(outputSurfaces, CameraDevice.TEMPLATE_PREVIEW)
+                .build();
+    }
+
+    protected CaptureRequest.Builder prepareCaptureRequestForSurfaces(List<Surface> surfaces,
+            int template)
+            throws Exception {
+        createSession(surfaces);
+
+        CaptureRequest.Builder captureBuilder =
+                mCamera.createCaptureRequest(template);
+        assertNotNull("Fail to get captureRequest", captureBuilder);
+        for (Surface surface : surfaces) {
+            captureBuilder.addTarget(surface);
+        }
+
+        return captureBuilder;
+    }
+
+    /**
+     * Test the invalid Image access: accessing a closed image must result in
+     * {@link IllegalStateException}.
+     *
+     * @param closedImage The closed image.
+     * @param closedBuffer The ByteBuffer from a closed Image. buffer invalid
+     *            access will be skipped if it is null.
+     */
+    protected void imageInvalidAccessTestAfterClose(Image closedImage,
+            Plane closedPlane, ByteBuffer closedBuffer) {
+        if (closedImage == null) {
+            throw new IllegalArgumentException(" closedImage must be non-null");
+        }
+        if (closedBuffer != null && !closedBuffer.isDirect()) {
+            throw new IllegalArgumentException("The input ByteBuffer should be direct ByteBuffer");
+        }
+
+        if (closedPlane != null) {
+            // Plane#getBuffer test
+            try {
+                closedPlane.getBuffer(); // An ISE should be thrown here.
+                fail("Image should throw IllegalStateException when calling getBuffer"
+                        + " after the image is closed");
+            } catch (IllegalStateException e) {
+                // Expected.
+            }
+
+            // Plane#getPixelStride test
+            try {
+                closedPlane.getPixelStride(); // An ISE should be thrown here.
+                fail("Image should throw IllegalStateException when calling getPixelStride"
+                        + " after the image is closed");
+            } catch (IllegalStateException e) {
+                // Expected.
+            }
+
+            // Plane#getRowStride test
+            try {
+                closedPlane.getRowStride(); // An ISE should be thrown here.
+                fail("Image should throw IllegalStateException when calling getRowStride"
+                        + " after the image is closed");
+            } catch (IllegalStateException e) {
+                // Expected.
+            }
+        }
+
+        // ByteBuffer access test
+        if (closedBuffer != null) {
+            try {
+                closedBuffer.get(); // An ISE should be thrown here.
+                fail("Image should throw IllegalStateException when accessing a byte buffer"
+                        + " after the image is closed");
+            } catch (IllegalStateException e) {
+                // Expected.
+            }
+        }
+
+        // Image#getFormat test
+        try {
+            closedImage.getFormat();
+            fail("Image should throw IllegalStateException when calling getFormat"
+                    + " after the image is closed");
+        } catch (IllegalStateException e) {
+            // Expected.
+        }
+
+        // Image#getWidth test
+        try {
+            closedImage.getWidth();
+            fail("Image should throw IllegalStateException when calling getWidth"
+                    + " after the image is closed");
+        } catch (IllegalStateException e) {
+            // Expected.
+        }
+
+        // Image#getHeight test
+        try {
+            closedImage.getHeight();
+            fail("Image should throw IllegalStateException when calling getHeight"
+                    + " after the image is closed");
+        } catch (IllegalStateException e) {
+            // Expected.
+        }
+
+        // Image#getTimestamp test
+        try {
+            closedImage.getTimestamp();
+            fail("Image should throw IllegalStateException when calling getTimestamp"
+                    + " after the image is closed");
+        } catch (IllegalStateException e) {
+            // Expected.
+        }
+
+        // Image#getTimestamp test
+        try {
+            closedImage.getTimestamp();
+            fail("Image should throw IllegalStateException when calling getTimestamp"
+                    + " after the image is closed");
+        } catch (IllegalStateException e) {
+            // Expected.
+        }
+
+        // Image#getCropRect test
+        try {
+            closedImage.getCropRect();
+            fail("Image should throw IllegalStateException when calling getCropRect"
+                    + " after the image is closed");
+        } catch (IllegalStateException e) {
+            // Expected.
+        }
+
+        // Image#setCropRect test
+        try {
+            Rect rect = new Rect();
+            closedImage.setCropRect(rect);
+            fail("Image should throw IllegalStateException when calling setCropRect"
+                    + " after the image is closed");
+        } catch (IllegalStateException e) {
+            // Expected.
+        }
+
+        // Image#getPlanes test
+        try {
+            closedImage.getPlanes();
+            fail("Image should throw IllegalStateException when calling getPlanes"
+                    + " after the image is closed");
+        } catch (IllegalStateException e) {
+            // Expected.
+        }
+    }
 }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java
index 5d832d6..39bf0a5 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java
@@ -362,9 +362,11 @@
                     mCameraId, mCameraListener, mHandler);
             mStaticInfo = new StaticMetadata(mCameraManager.getCameraCharacteristics(mCameraId),
                     CheckLevel.ASSERT, /*collector*/null);
-            mOrderedPreviewSizes = getSupportedPreviewSizes(
-                    mCameraId, mCameraManager,
-                    getPreviewSizeBound(mWindowManager, PREVIEW_SIZE_BOUND));
+            if (mStaticInfo.isColorOutputSupported()) {
+                mOrderedPreviewSizes = getSupportedPreviewSizes(
+                        mCameraId, mCameraManager,
+                        getPreviewSizeBound(mWindowManager, PREVIEW_SIZE_BOUND));
+            }
             assertNotNull(String.format("Failed to open camera device ID: %s", mCameraId), mCamera);
         }
 
@@ -414,4 +416,3 @@
         }
     }
 }
-
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
index 00f7e1c..c136b67 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
@@ -563,14 +563,16 @@
         mCollector.setCameraId(cameraId);
         mStaticInfo = new StaticMetadata(mCameraManager.getCameraCharacteristics(cameraId),
                 CheckLevel.ASSERT, /*collector*/null);
-        mOrderedPreviewSizes = getSupportedPreviewSizes(cameraId, mCameraManager,
-                getPreviewSizeBound(mWindowManager, PREVIEW_SIZE_BOUND));
-        mOrderedVideoSizes = getSupportedVideoSizes(cameraId, mCameraManager, PREVIEW_SIZE_BOUND);
-        mOrderedStillSizes = getSupportedStillSizes(cameraId, mCameraManager, null);
-        // Use ImageFormat.YUV_420_888 for now. TODO: need figure out what's format for preview
-        // in public API side.
-        mMinPreviewFrameDurationMap =
+        if (mStaticInfo.isColorOutputSupported()) {
+            mOrderedPreviewSizes = getSupportedPreviewSizes(cameraId, mCameraManager,
+                    getPreviewSizeBound(mWindowManager, PREVIEW_SIZE_BOUND));
+            mOrderedVideoSizes = getSupportedVideoSizes(cameraId, mCameraManager, PREVIEW_SIZE_BOUND);
+            mOrderedStillSizes = getSupportedStillSizes(cameraId, mCameraManager, null);
+            // Use ImageFormat.YUV_420_888 for now. TODO: need figure out what's format for preview
+            // in public API side.
+            mMinPreviewFrameDurationMap =
                 mStaticInfo.getAvailableMinFrameDurationsForFormatChecked(ImageFormat.YUV_420_888);
+        }
     }
 
     /**
@@ -699,4 +701,21 @@
 
         return null;
     }
+
+    protected boolean isReprocessSupported(String cameraId, int format)
+            throws CameraAccessException {
+        if (format != ImageFormat.YUV_420_888 && format != ImageFormat.PRIVATE) {
+            throw new IllegalArgumentException(
+                    "format " + format + " is not supported for reprocessing");
+        }
+
+        StaticMetadata info =
+                new StaticMetadata(mCameraManager.getCameraCharacteristics(cameraId),
+                                   CheckLevel.ASSERT, /*collector*/ null);
+        int cap = CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING;
+        if (format == ImageFormat.PRIVATE) {
+            cap = CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING;
+        }
+        return info.isCapabilitySupported(cap);
+    }
 }
diff --git a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
index cf616b6..6869ed1 100644
--- a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
@@ -66,7 +66,7 @@
  */
 @LargeTest
 public class CameraTest extends ActivityInstrumentationTestCase2<CameraCtsActivity> {
-    private static String TAG = "CameraTest";
+    private static final String TAG = "CameraTest";
     private static final String PACKAGE = "com.android.cts.hardware";
     private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
     private final String JPEG_PATH = Environment.getExternalStorageDirectory().getPath() +
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorBatchingFifoTest.java b/tests/tests/hardware/src/android/hardware/cts/SensorBatchingFifoTest.java
new file mode 100644
index 0000000..4c6362a
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorBatchingFifoTest.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2015 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.hardware.cts;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.hardware.Sensor;
+import android.hardware.SensorManager;
+import android.hardware.cts.helpers.SensorCtsHelper;
+import android.hardware.cts.helpers.TestSensorEnvironment;
+import android.hardware.cts.helpers.sensoroperations.TestSensorOperation;
+import android.hardware.cts.helpers.sensorverification.FifoLengthVerification;
+
+/**
+ * Checks the minimum Hardware FIFO length for each of the Hardware sensor.
+ * Further verifies if the advertised FIFO (Sensor.getFifoMaxEventCount()) is actually allocated
+ * for the sensor.
+ *
+ */
+public class SensorBatchingFifoTest extends SensorTestCase {
+    private static final int ACCELEROMETER_MIN_FIFO_LENGTH = 3000;
+    private static final int UNCAL_MAGNETOMETER_MIN_FIFO_LENGTH = 600;
+    private static final int PRESSURE_MIN_FIFO_LENGTH = 300;
+    private static final int GAME_ROTATION_VECTOR_MIN_FIFO_LENGTH = 300;
+    private static final int PROXIMITY_SENSOR_MIN_FIFO_LENGTH = 300;
+    private static final int STEP_DETECTOR_MIN_FIFO_LENGTH = 100;
+
+    private static final int SAMPLING_INTERVAL = 1000; /* every 1ms */
+    private static final String TAG = "batching_fifo_test";
+
+    private SensorManager mSensorManager;
+    private boolean mHasHifiSensors;
+    @Override
+    protected void setUp() throws Exception {
+        mSensorManager = (SensorManager) getContext().getSystemService(Context.SENSOR_SERVICE);
+        mHasHifiSensors = getContext().getPackageManager().hasSystemFeature(
+                PackageManager.FEATURE_HIFI_SENSORS);
+    }
+
+    public void testAccelerometerFifoLength() throws Throwable {
+        if (!mHasHifiSensors) return;
+        runBatchingSensorFifoTest(
+                Sensor.TYPE_ACCELEROMETER,
+                checkMinFifoLength(Sensor.TYPE_ACCELEROMETER, ACCELEROMETER_MIN_FIFO_LENGTH));
+    }
+
+    public void testUncalMagnetometerFifoLength() throws Throwable {
+        if (!mHasHifiSensors) return;
+        runBatchingSensorFifoTest(
+                Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED,
+                checkMinFifoLength(
+                        Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED,
+                        UNCAL_MAGNETOMETER_MIN_FIFO_LENGTH));
+    }
+
+    public void testPressureFifoLength() throws Throwable {
+        if (!mHasHifiSensors) return;
+        runBatchingSensorFifoTest(
+                Sensor.TYPE_PRESSURE,
+                checkMinFifoLength(Sensor.TYPE_PRESSURE, PRESSURE_MIN_FIFO_LENGTH));
+    }
+
+    public void testGameRotationVectorFifoLength() throws Throwable {
+        if (!mHasHifiSensors) return;
+        runBatchingSensorFifoTest(
+                Sensor.TYPE_GAME_ROTATION_VECTOR,
+                checkMinFifoLength(
+                        Sensor.TYPE_GAME_ROTATION_VECTOR, GAME_ROTATION_VECTOR_MIN_FIFO_LENGTH));
+    }
+
+    public void testProximityFifoLength() throws Throwable {
+        if (!mHasHifiSensors) return;
+        Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
+        if (sensor != null) {
+            assertTrue(sensor.getFifoReservedEventCount() <= PROXIMITY_SENSOR_MIN_FIFO_LENGTH);
+        }
+    }
+
+    public void testStepDetectorFifoLength() throws Throwable {
+        if (!mHasHifiSensors) return;
+        checkMinFifoLength(Sensor.TYPE_STEP_DETECTOR, STEP_DETECTOR_MIN_FIFO_LENGTH);
+    }
+
+    private int checkMinFifoLength(int sensorType, int minRequiredLength) {
+        Sensor sensor = mSensorManager.getDefaultSensor(sensorType);
+        assertTrue(String.format("sensor of type=%d (null)", sensorType), sensor != null);
+        int maxFifoLength = sensor.getFifoReservedEventCount();
+        assertTrue(String.format("Sensor=%s, min required fifo length=%d actual=%d",
+                    sensor.getName(), minRequiredLength, maxFifoLength),
+                    maxFifoLength >= minRequiredLength);
+        return maxFifoLength;
+    }
+
+    private void runBatchingSensorFifoTest(int sensorType, int fifoLength) throws Throwable {
+        if (fifoLength == 0) {
+            return;
+        }
+        Sensor sensor = mSensorManager.getDefaultSensor(sensorType);
+        TestSensorEnvironment environment =  new TestSensorEnvironment(getContext(),
+                sensor,
+                false,
+                sensor.getMinDelay(),
+                Integer.MAX_VALUE);
+
+        TestSensorOperation op = TestSensorOperation.createOperation(environment,
+                sensor.getFifoReservedEventCount() * 2);
+        op.addVerification(FifoLengthVerification.getDefault(environment));
+        op.execute(getCurrentTestNode());
+        op.getStats().log(TAG);
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorBatchingTests.java b/tests/tests/hardware/src/android/hardware/cts/SensorBatchingTests.java
index 7640cd7..7f7d4eb 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SensorBatchingTests.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorBatchingTests.java
@@ -18,6 +18,7 @@
 
 import android.hardware.Sensor;
 import android.hardware.SensorManager;
+import android.hardware.cts.helpers.SensorCtsHelper;
 import android.hardware.cts.helpers.SensorStats;
 import android.hardware.cts.helpers.TestSensorEnvironment;
 import android.hardware.cts.helpers.sensoroperations.TestSensorOperation;
@@ -287,6 +288,7 @@
             TestSensorEnvironment environment,
             TestSensorOperation operation,
             boolean flushExpected) throws Throwable {
+        SensorCtsHelper.sleep(3, TimeUnit.SECONDS);
         operation.addDefaultVerifications();
 
         try {
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorIntegrationTests.java b/tests/tests/hardware/src/android/hardware/cts/SensorIntegrationTests.java
index 8c3fb7a..9bf1fd6 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SensorIntegrationTests.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorIntegrationTests.java
@@ -18,6 +18,7 @@
 import android.content.Context;
 import android.hardware.Sensor;
 import android.hardware.SensorManager;
+import android.hardware.cts.helpers.SensorCtsHelper;
 import android.hardware.cts.helpers.TestSensorEnvironment;
 import android.hardware.cts.helpers.sensoroperations.ParallelSensorOperation;
 import android.hardware.cts.helpers.sensoroperations.RepeatingSensorOperation;
@@ -62,6 +63,7 @@
      * of several clients can lead to the failing state.
      */
     public void testSensorsWithSeveralClients() throws Throwable {
+        SensorCtsHelper.sleep(3, TimeUnit.SECONDS);
         final int ITERATIONS = 50;
         final int MAX_REPORTING_LATENCY_US = (int) TimeUnit.SECONDS.toMicros(5);
         final Context context = getContext();
@@ -121,6 +123,7 @@
      * of several clients can lead to the failing state.
      */
     public void testSensorsMovingRates() throws Throwable {
+        SensorCtsHelper.sleep(3, TimeUnit.SECONDS);
         // use at least two instances to ensure more than one client of any given sensor is in play
         final int INSTANCES_TO_USE = 5;
         final int ITERATIONS_TO_EXECUTE = 100;
@@ -219,6 +222,7 @@
     public void verifySensorStoppingInteraction(
             int sensorTypeTestee,
             int sensorTypeTester) throws Throwable {
+        SensorCtsHelper.sleep(3, TimeUnit.SECONDS);
         Context context = getContext();
 
         TestSensorEnvironment testerEnvironment = new TestSensorEnvironment(
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorManagerStaticTest.java b/tests/tests/hardware/src/android/hardware/cts/SensorManagerStaticTest.java
new file mode 100644
index 0000000..11ac701
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorManagerStaticTest.java
@@ -0,0 +1,776 @@
+/*
+ * Copyright (C) 2008 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.hardware.cts;
+
+import junit.framework.Assert;
+
+import android.content.Context;
+import android.hardware.SensorManager;
+import android.os.PowerManager;
+
+import java.util.Random;
+
+public class SensorManagerStaticTest extends SensorTestCase {
+    private static final String TAG = "SensorManagerTest";
+
+    // local float version of PI
+    private static final float FLOAT_PI = (float) Math.PI;
+
+
+    private PowerManager.WakeLock mWakeLock;
+
+    @Override
+    protected void setUp() throws Exception {
+        Context context = getContext();
+        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
+
+        mWakeLock.acquire();
+    }
+
+    @Override
+    protected void tearDown(){
+        if (mWakeLock != null && mWakeLock.isHeld()) {
+            mWakeLock.release();
+        }
+    }
+
+    // SensorManager Tests
+    public void testGetAltitude() throws Exception {
+        float r, q;
+        float altitude;
+
+        // identity property
+        for (r = 0.5f; r < 1.3f; r += 0.1f) {
+
+            altitude = SensorManager.getAltitude(r * SensorManager.PRESSURE_STANDARD_ATMOSPHERE,
+                                                 r * SensorManager.PRESSURE_STANDARD_ATMOSPHERE);
+            assertRoughlyEqual("getAltitude identity property violated.", altitude, 0.0f, 0.1f);
+        }
+
+        // uniform increasing as pressure decreases property
+        float prevAltitude = 1e5f; // 100km ceiling
+        for (r = 0.5f; r < 1.3f; r += 0.01f) {
+            altitude = SensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE,
+                                                 r * SensorManager.PRESSURE_STANDARD_ATMOSPHERE);
+
+            assertTrue("getAltitude result has to decrease as p increase.", prevAltitude > altitude);
+            prevAltitude = altitude;
+        }
+
+        // compare to a reference algorithm
+        final float coef = 1.0f / 5.255f;
+        for (r = 0.8f; r < 1.3f; r += 0.1f) {
+            for (q = 1.1f * r; q > 0.5f * r; q -= 0.1f * r) {
+                float p0 = r * SensorManager.PRESSURE_STANDARD_ATMOSPHERE;
+                float p  = q * SensorManager.PRESSURE_STANDARD_ATMOSPHERE;
+
+                float t1 = SensorManager.getAltitude(p0, p);
+                float t2 = 44330.f*(1.0f- (float) Math.pow(p/p0, coef));
+
+                assertRoughlyEqual(
+                      String.format("getAltitude comparing to reference algorithm failed. " +
+                          "Detail: getAltitude(%f, %f) => %f, reference => %f",
+                          p0, p, t1, t2),
+                      t1, t2, 100.f);
+            }
+        }
+
+    }
+
+    public void testGetAngleChange() throws Exception {
+        TestDataGenerator data = new TestDataGenerator();
+
+        int i;
+        float [] rotv = new float[3];
+        float [] rotv2 = new float[3];
+
+        // test many instances
+        for (i=0; i<100; ++i) {
+            float [] R1, R12, R2;
+            // azimuth(yaw) pitch roll
+            data.nextRotationAngles(rotv);
+            R1 = mat9VRot(rotv); // random base
+
+            // azimuth(yaw) pitch roll
+            data.nextRotationAngles(rotv);
+            R12 = mat9VRot(rotv);
+            R2 = mat9Mul(R1, R12); // apply another random rotation
+
+            // test different variations of input matrix format
+            switch(i & 3) {
+                case 0:
+                    SensorManager.getAngleChange(rotv2, R2, R1);
+                    break;
+                case 1:
+                    SensorManager.getAngleChange(rotv2, mat9to16(R2), R1);
+                    break;
+                case 2:
+                    SensorManager.getAngleChange(rotv2, R2, mat9to16(R1));
+                    break;
+                case 3:
+                    SensorManager.getAngleChange(rotv2, mat9to16(R2), mat9to16(R1));
+                    break;
+            }
+
+            // check range
+            assertRotationAnglesValid("getAngleChange result out of range.", rotv2);
+
+            // avoid directly checking the rotation angles to avoid corner cases
+            float [] R12rt = mat9T(mat9VRot(rotv2));
+            float [] RI = mat9Mul(R12rt, R12);
+
+            assertRoughlyEqual(
+                String.format("getAngleChange result is incorrect. Details: case %d, " +
+                    "truth = [%f, %f, %f], result = [%f, %f, %f]", i, rotv[0], rotv[1], rotv[2],
+                    rotv2[0], rotv2[1], rotv2[2]),
+                RI[0] + RI[4] + RI[8], 3.f, 1e-4f);
+        }
+    }
+
+    public void testGetInclination() throws Exception {
+        TestDataGenerator data = new TestDataGenerator();
+
+        int i;
+        float [] rotv = new float[3];
+        float [] rotv2 = new float[3];
+        float [] rotv3;
+
+        // test many instances
+        for (i = 0; i < 100; ++i) {
+            float [] R;
+            float angle;
+            angle = (data.nextFloat()-0.5f) * FLOAT_PI;
+            R = mat9Rot(SensorManager.AXIS_X, -angle);
+
+            float angler = ((i&1) != 0) ?
+                    SensorManager.getInclination(mat9to16(R)) : SensorManager.getInclination(R);
+            assertRoughlyEqual(
+                String.format(
+                    "getInclination return incorrect result. Detail: case %d, truth %f, result %f.",
+                    i, angle, angler),
+                angle, angler, 1e-4f);
+        }
+    }
+
+    public void testGetOrientation() throws Exception {
+        TestDataGenerator data = new TestDataGenerator();
+
+        int i;
+        float [] rotv = new float[3];
+        float [] rotv2 = new float[3];
+        float [] rotv3;
+
+        // test many instances
+        for (i=0; i<100; ++i) {
+            float [] R;
+            // yaw pitch roll
+            data.nextRotationAngles(rotv);
+            R = mat9VRot(rotv);
+
+            rotv3 = SensorManager.getOrientation( ((i&1) != 0) ? R : mat9to16(R), rotv2);
+            assertTrue("getOrientaion has to return the array passed in argument", rotv3 == rotv2);
+
+            // check range
+            assertRotationAnglesValid("getOrientation result out of range.", rotv2);
+
+            // Avoid directly comparing rotation angles. Instead, compare the rotation matrix.
+            float [] Rr = mat9T(mat9VRot(rotv2));
+            float [] RI = mat9Mul(Rr, R);
+
+            assertRoughlyEqual(
+                String.format("getOrientation result is incorrect. Details: case %d, " +
+                    "truth = [%f, %f, %f], result = [%f, %f, %f]", i, rotv[0], rotv[1], rotv[2],
+                    rotv2[0], rotv2[1], rotv2[2]),
+                RI[0] + RI[4] + RI[8], 3.f, 1e-4f);
+        }
+    }
+
+    public void testGetQuaternionFromVector() throws Exception {
+        TestDataGenerator data = new TestDataGenerator();
+
+        int i;
+        float [] v;
+        float [] q = new float[4];
+        float [] q2 = new float[4];
+        float [] v3 = new float[3];
+        float [] v4 = new float[4];
+        float [] v5 = new float[5];
+        float [][] vs = new float[][] {v3, v4, v5};
+
+        float [] xyzth = new float[4];
+        for (i = 0; i < 100; ++i) {
+            float c, s;
+
+            data.nextRotationAxisAngle(xyzth);
+
+            c = (float) Math.cos(xyzth[3]);
+            s = (float) Math.sin(xyzth[3]);
+            if (c < 0.f) {
+                c = -c;
+                s = -s;
+            }
+
+            v = vs[i%3];
+            switch(i%3) {
+                case 2:
+                    v[4] = data.nextBoolean() ? data.nextFloat() : -1.f;
+                case 1:
+                    v[3] = c;
+                case 0:
+                    v[0] = s * xyzth[0];
+                    v[1] = s * xyzth[1];
+                    v[2] = s * xyzth[2];
+            }
+
+            q2[0] = c;
+            q2[1] = v[0];
+            q2[2] = v[1];
+            q2[3] = v[2];
+
+            SensorManager.getQuaternionFromVector(q, v);
+            assertVectorRoughlyEqual(
+                String.format("getQuaternionFromVector returns wrong results, Details: case %d, " +
+                    "truth = (%f, %f, %f, %f), result = (%f, %f, %f, %f).",
+                    i, q2[0], q2[1], q2[2], q2[3], q[0], q[1], q[2], q[3]),
+                q, q2, 1e-4f);
+        }
+    }
+
+    public void testGetRotationMatrix() throws Exception {
+        TestDataGenerator data = new TestDataGenerator();
+        final float gravity = 9.81f;
+        final float magStrength = 50.f;
+
+        int i;
+        float [] gm = new float[9];
+        float [] rotv = new float[3];
+        float [] gI = null;
+        float [] mI = null;
+        float [] Rr = new float[9];
+        float [] Ir = new float[9];
+
+        gm[6] = gravity; // m/s^2, first column gravity
+
+        // test many instances
+        for (i=0; i<100; ++i) {
+            float [] Rt;
+            float incline;
+            // yaw pitch roll
+            data.nextRotationAngles(rotv);
+            Rt = mat9T(mat9VRot(rotv)); // from world frame to phone frame
+            //Rt = mat9I();
+
+            incline = -0.9f * (data.nextFloat() - 0.5f) * FLOAT_PI; // ~ +-80 degrees
+            //incline = 0.f;
+            gm[4] = magStrength * (float) Math.cos(-incline); // positive means rotate downwards
+            gm[7] = magStrength * (float) Math.sin(-incline);
+
+            float [] gmb = mat9Mul(Rt, gm); // do not care about right most column
+            gI = mat9Axis(gmb, SensorManager.AXIS_X);
+            mI = mat9Axis(gmb, SensorManager.AXIS_Y);
+
+            assertTrue("getRotationMatrix returns false on valid inputs",
+                SensorManager.getRotationMatrix(Rr, Ir, gI, mI));
+
+            float [] n = mat9Mul(Rr, Rt);
+            assertRoughlyEqual(
+                String.format("getRotationMatrix returns incorrect R matrix. " +
+                    "Details: case %d, truth R = %s, result R = %s.",
+                    i, mat9ToStr(mat9T(Rt)), mat9ToStr(Rr)),
+                n[0] + n[4] + n[8], 3.f, 1e-4f);
+
+
+            // Magnetic incline is defined so that it means the magnetic field lines is formed
+            // by rotate local y axis around -x axis by incline angle. However, I matrix is
+            // defined as (according to document):
+            //     [0 m 0] = I * R * geomagnetic,
+            // which means,
+            //     I' * [0 m 0] = R * geomagnetic.
+            // Thus, I' = Rot(-x, incline) and I = Rot(-x, incline)' = Rot(x, incline)
+            float [] Ix = mat9Rot(SensorManager.AXIS_X, incline);
+            assertVectorRoughlyEqual(
+                String.format("getRotationMatrix returns incorrect I matrix. " +
+                    "Details: case %d, truth I = %s, result I = %s.",
+                    i, mat9ToStr(Ix), mat9ToStr(Ir)),
+                Ix, Ir, 1e-4f);
+        }
+
+        // test 16 element inputs
+        float [] Rr2 = new float[16];
+        float [] Ir2 = new float[16];
+
+        assertTrue("getRotationMatrix returns false on valid inputs",
+            SensorManager.getRotationMatrix(Rr2, Ir2, gI, mI));
+
+        assertVectorRoughlyEqual(
+            "getRotationMatrix acts inconsistent with 9- and 16- elements matrix buffer",
+            mat16to9(Rr2), Rr, 1e-4f);
+
+        assertVectorRoughlyEqual(
+            "getRotationMatrix acts inconsistent with 9- and 16- elements matrix buffer",
+            mat16to9(Ir2), Ir, 1e-4f);
+
+        // test null inputs
+        assertTrue("getRotationMatrix does not handle null inputs",
+            SensorManager.getRotationMatrix(Rr, null, gI, mI));
+
+        assertTrue("getRotationMatrix does not handle null inputs",
+            SensorManager.getRotationMatrix(null, Ir, gI, mI));
+
+        assertTrue("getRotationMatrix does not handle null inputs",
+            SensorManager.getRotationMatrix(null, null, gI, mI));
+
+        // test fail cases
+        // free fall, if the acc reading is less than 10% of gravity
+        gI[0] = gI[1] = gI[2] = data.nextFloat() * gravity * 0.05f; // sqrt(3) * 0.05 < 0.1
+         assertFalse("getRotationMatrix does not fail when it supposed to fail (gravity too small)",
+            SensorManager.getRotationMatrix(Rr, Ir, gI, mI));
+
+        // wrong input
+        assertFalse("getRotationMatrix does not fail when it supposed to fail (singular axis)",
+            SensorManager.getRotationMatrix(Rr, Ir, gI, gI));
+    }
+
+    public void testGetRotationMatrixFromVector() throws Exception {
+        TestDataGenerator data = new TestDataGenerator();
+
+        int i;
+        float [] v;
+        float [] q = new float[4];
+
+        float [] v3 = new float[3];
+        float [] v4 = new float[4];
+        float [] v5 = new float[5];
+        float [][] vs = new float[][]{v3, v4, v5};
+
+        float [] m9 = new float[9];
+        float [] m16 = new float[16];
+
+        // format: x y z theta/2
+        float [] xyzth = new float[4];
+        // test the orthogonal property of returned matrix
+        for (i=0; i<20; ++i) {
+            float c, s;
+            data.nextRotationAxisAngle(xyzth);
+
+            c = (float) Math.cos(xyzth[3]);
+            s = (float) Math.sin(xyzth[3]);
+            if (c < 0.f) {
+                c = -c;
+                s = -s;
+            }
+
+            v = vs[i%3];
+            switch(i%3) {
+                case 2:
+                    v[4] = data.nextBoolean() ? data.nextFloat() : -1.f;
+                case 1:
+                    v[3] = c;
+                case 0:
+                    v[0] = s * xyzth[0];
+                    v[1] = s * xyzth[1];
+                    v[2] = s * xyzth[2];
+            }
+
+            if ((i % 1) != 0) {
+                SensorManager.getRotationMatrixFromVector(m16, v);
+                m9 = mat16to9(m16);
+            }else {
+                SensorManager.getRotationMatrixFromVector(m9, v);
+            }
+
+            float [] n = mat9Mul(m9, mat9T(m9));
+            assertRoughlyEqual("getRotationMatrixFromVector do not return proper matrix",
+                    n[0]+ n[4] + n[8], 3.f, 1e-4f);
+        }
+
+        // test if multiple rotation (total 2pi) about an axis result in identity
+        v = v3;
+        float [] Rr = new float[9];
+
+        for (i=0; i<20; ++i) {
+            float j, halfTheta, residualHalfTheta = FLOAT_PI;
+            float [] R = mat9I();
+            float c, s;
+
+            data.nextRotationAxisAngle(xyzth);  // half theta is ignored
+
+            j = data.nextInt(5) + 2;  // 2 ~ 6 rotations
+
+            while(j-- > 0) {
+                if (j == 0) {
+                    halfTheta = residualHalfTheta;
+                } else {
+                    halfTheta = data.nextFloat() * FLOAT_PI;
+                }
+
+                c = (float) Math.cos(halfTheta);
+                s = (float) Math.sin(halfTheta);
+                if (c < 0.f) {
+                    c = -c;
+                    s = -s;
+                }
+
+                v[0] = s * xyzth[0];
+                v[1] = s * xyzth[1];
+                v[2] = s * xyzth[2];
+
+                SensorManager.getRotationMatrixFromVector(Rr, v);
+                R = mat9Mul(Rr, R);
+
+                residualHalfTheta -= halfTheta;
+            }
+
+            assertRoughlyEqual("getRotationMatrixFromVector returns incorrect matrix",
+                    R[0] + R[4] + R[8], 3.f, 1e-4f);
+        }
+
+        // test if rotation about trival axis works
+        v = v3;
+        for (i=0; i<20; ++i) {
+            int axis = (i % 3) + 1;
+            float theta = data.nextFloat() * 2.f * FLOAT_PI;
+            float [] R;
+
+            v[0] = v[1] = v[2] = 0.f;
+            v[axis - 1] = (float) Math.sin(theta / 2.f);
+            if ( (float) Math.cos(theta / 2.f) < 0.f) {
+                v[axis-1] = -v[axis-1];
+            }
+
+            SensorManager.getRotationMatrixFromVector(m9, v);
+            R = mat9Rot(axis, theta);
+
+            assertVectorRoughlyEqual(
+                String.format("getRotationMatrixFromVector returns incorrect matrix with "+
+                    "simple rotation. Details: case %d, truth R = %s, result R = %s.",
+                    i, mat9ToStr(R), mat9ToStr(m9)),
+                R, m9, 1e-4f);
+        }
+    }
+
+    public void testRemapCoordinateSystem() throws Exception {
+        TestDataGenerator data = new TestDataGenerator();
+
+        int i, j, k;
+        float [] rotv = new float[3];
+        float [] Rout = new float[9];
+        float [] Rout2 = new float[16];
+        int a1, a2; // AXIS_X/Y/Z
+        int b1, b2, b3; // AXIS_X/Y/Z w/ or w/o MINUS
+
+        // test a few instances
+        for (i=0; i<10; ++i) {
+            float [] R;
+            // yaw pitch roll
+            data.nextRotationAngles(rotv);
+            R = mat9VRot(rotv);
+
+            // total of 6*4 = 24 variations
+            // 6 = A(3,2)
+            for (j=0; j<9; ++j) {
+                // axis without minus
+                a1 = j/3 + 1;
+                a2 = j%3 + 1;
+
+                // skip cases when two axis are the same
+                if (a1 == a2) continue;
+
+                for (k=0; k<3; ++k) {
+                    // test all minus axis combination: ++, +-, -+, --
+                    b1 = a1 | (((k & 2) != 0) ? 0x80 : 0);
+                    b2 = a2 | (((k & 1) != 0) ? 0x80 : 0);
+                    // the third axis
+                    b3 = (6 - a1 -a2) |
+                         ( (((a2 + 3 - a1) % 3 == 2) ? 0x80 : 0) ^ (b1 & 0x80) ^ (b2 & 0x80));
+
+                    // test both input formats
+                    if ( (i & 1) != 0 ) {
+                      assertTrue(SensorManager.remapCoordinateSystem(R, b1, b2, Rout));
+                    } else {
+                      assertTrue(SensorManager.remapCoordinateSystem(mat9to16(R), b1, b2, Rout2));
+                      Rout = mat16to9(Rout2);
+                    }
+
+                    float [] v1, v2;
+
+                    String detail = String.format(
+                            "Details: case %d (%x %x %x), original R = %s, result R = %s.",
+                            i, b1, b2, b3, mat9ToStr(R), mat9ToStr(Rout));
+
+                    v1 = mat9Axis(R, SensorManager.AXIS_X);
+                    v2 = mat9Axis(Rout, b1);
+                    assertVectorRoughlyEqual(
+                        "remapCoordinateSystem gives incorrect result (x)." + detail,
+                        v1, v2, 1e-4f);
+
+                    v1 = mat9Axis(R, SensorManager.AXIS_Y);
+                    v2 = mat9Axis(Rout, b2);
+                    assertVectorRoughlyEqual(
+                        "remapCoordinateSystem gives incorrect result (y)." + detail,
+                        v1, v2, 1e-4f);
+
+                    v1 = mat9Axis(R, SensorManager.AXIS_Z);
+                    v2 = mat9Axis(Rout, b3);
+                    assertVectorRoughlyEqual(
+                        "remapCoordinateSystem gives incorrect result (z)." + detail,
+                        v1, v2, 1e-4f);
+                }
+            }
+
+        }
+
+        // test cases when false should be returned
+        assertTrue("remapCoordinateSystem should return false with mismatch size input and output",
+                   !SensorManager.remapCoordinateSystem(Rout,
+                     SensorManager.AXIS_Y, SensorManager.AXIS_Z, Rout2));
+        assertTrue("remapCoordinateSystem should return false with invalid axis setting",
+                   !SensorManager.remapCoordinateSystem(Rout,
+                     SensorManager.AXIS_X, SensorManager.AXIS_X, Rout));
+        assertTrue("remapCoordinateSystem should return false with invalid axis setting",
+                   !SensorManager.remapCoordinateSystem(Rout,
+                     SensorManager.AXIS_X, SensorManager.AXIS_MINUS_X, Rout));
+
+    }
+
+    // Utilities class & functions
+
+    private class TestDataGenerator {
+        // carry out test deterministically without manually picking numbers
+        private final long DEFAULT_SEED = 0xFEDCBA9876543210l;
+
+        private Random mRandom;
+
+        TestDataGenerator(long seed) {
+            mRandom = new Random(seed);
+        }
+
+        TestDataGenerator() {
+            mRandom = new Random(DEFAULT_SEED);
+        }
+
+        void nextRotationAngles(float [] rotv) {
+            assertTrue(rotv.length == 3);
+
+            rotv[0] = (mRandom.nextFloat()-0.5f) * 2.0f * FLOAT_PI; // azimuth(yaw) -pi ~ pi
+            rotv[1] = (mRandom.nextFloat()-0.5f) * FLOAT_PI; // pitch -pi/2 ~ +pi/2
+            rotv[2] = (mRandom.nextFloat()-0.5f) * 2.f * FLOAT_PI; // roll -pi ~ +pi
+        }
+
+        void nextRotationAxisAngle(float [] aa) {
+            assertTrue(aa.length == 4);
+
+            aa[0] = (mRandom.nextFloat() - 0.5f) * 2.f;
+            aa[1] = (mRandom.nextFloat() - 0.5f ) * 2.f * (float) Math.sqrt(1.f - aa[0] * aa[0]);
+            aa[2] = (mRandom.nextBoolean() ? 1.f : -1.f) *
+                        (float) Math.sqrt(1.f - aa[0] * aa[0] - aa[1] * aa[1]);
+            aa[3] = mRandom.nextFloat() * FLOAT_PI;
+        }
+
+        int nextInt(int i) {
+            return mRandom.nextInt(i);
+        }
+
+        float nextFloat() {
+            return mRandom.nextFloat();
+        }
+
+        boolean nextBoolean() {
+            return mRandom.nextBoolean();
+        }
+    }
+
+    private static void assertRotationAnglesValid(String message, float[] ra) {
+
+        assertTrue(message, ra.length == 3 &&
+            ra[0] >= -FLOAT_PI && ra[0] <= FLOAT_PI &&         // azimuth
+            ra[1] >= -FLOAT_PI / 2.f && ra[1] <= FLOAT_PI / 2.f && // pitch
+            ra[2] >= -FLOAT_PI && ra[2] <= FLOAT_PI);          // roll
+    }
+
+    private static void assertRoughlyEqual(String message, float a, float b, float bound) {
+        assertTrue(message, Math.abs(a-b) < bound);
+    }
+
+    private static void assertVectorRoughlyEqual(String message, float [] v1, float [] v2,
+                                                 float bound) {
+        assertTrue(message, v1.length == v2.length);
+        int i;
+        float sum = 0.f;
+        for (i=0; i<v1.length; ++i) {
+            sum += (v1[i] - v2[i]) * (v1[i] - v2[i]);
+        }
+        assertRoughlyEqual(message, (float)Math.sqrt(sum), 0.f, bound);
+    }
+
+    private static float [] mat9to16(float [] m) {
+        assertTrue(m.length == 9);
+
+        float [] n  = new float[16];
+        int i;
+        for (i=0; i<9; ++i) {
+            n[i+i/3] = m[i];
+        }
+        n[15] = 1.f;
+        return n;
+    }
+
+    private static float [] mat16to9(float [] m) {
+        assertTrue(m.length == 16);
+
+        float [] n = new float[9];
+        int i;
+        for (i=0; i<9; ++i) {
+            n[i] = m[i + i/3];
+        }
+        return n;
+    }
+
+    private static float [] mat9Mul(float [] m, float [] n) {
+        assertTrue(m.length == 9 && n.length == 9);
+
+        float [] r = new float[9];
+        int i, j, k;
+
+        for (i = 0; i < 3; ++i)
+            for (j = 0; j < 3; ++j)
+                for (k = 0; k < 3; ++k)
+                    r[i * 3 + j] += m[i * 3 + k] * n[k * 3 + j];
+
+        return r;
+    }
+
+    private static float [] mat9T(float [] m) {
+        assertTrue(m.length == 9);
+
+        int i, j;
+        float [] n = new float[9];
+
+        for (i = 0; i < 3; ++i)
+            for (j = 0; j < 3; ++j)
+                n[i * 3 + j] = m[j * 3 + i];
+
+        return n;
+    }
+
+    private static float [] mat9I() {
+        float [] m = new float[9];
+        m[0] = m[4] = m[8] = 1.f;
+        return m;
+    }
+
+    private static float [] mat9Rot(int axis, float angle) {
+        float [] m = new float[9];
+        switch (axis) {
+            case SensorManager.AXIS_X:
+                m[0] = 1.f;
+                m[4] = m[8] = (float) Math.cos(angle);
+                m[5] = - (m[7] = (float) Math.sin(angle));
+                break;
+            case SensorManager.AXIS_Y:
+                m[4] = 1.f;
+                m[0] = m[8] = (float) Math.cos(angle);
+                m[6] = - (m[2] = (float) Math.sin(angle));
+                break;
+            case SensorManager.AXIS_Z:
+                m[8] = 1.f;
+                m[0] = m[4] = (float) Math.cos(angle);
+                m[1] = - (m[3] = (float) Math.sin(angle));
+                break;
+            default:
+                // should never be here
+                assertTrue(false);
+        }
+        return m;
+    }
+
+    private static float [] mat9VRot(float [] angles) {
+        assertTrue(angles.length == 3);
+        // yaw, android yaw rotate to -z
+        float [] R = mat9Rot(SensorManager.AXIS_Z, -angles[0]);
+        // pitch, android pitch rotate to -x
+        R = mat9Mul(R, mat9Rot(SensorManager.AXIS_X, -angles[1]));
+        // roll
+        R = mat9Mul(R, mat9Rot(SensorManager.AXIS_Y, angles[2]));
+
+        return R;
+    }
+
+    private static float [] mat9Axis(float m[], int axis) {
+        assertTrue(m.length == 9);
+
+        boolean negative = (axis & 0x80) != 0;
+        float [] v = new float[3];
+        int offset;
+
+        offset = (axis & ~0x80) - 1;
+        v[0] = negative ? -m[offset]   : m[offset];
+        v[1] = negative ? -m[offset+3] : m[offset+3];
+        v[2] = negative ? -m[offset+6] : m[offset+6];
+        return v;
+    }
+
+    private static float vecInner(float u[], float v[]) {
+        assertTrue(u.length == v.length);
+
+        int i;
+        float sum = 0.f;
+
+        for (i=0; i < v.length; ++i) {
+            sum += u[i]*v[i];
+        }
+        return (float)Math.sqrt(sum);
+    }
+
+    private static String vecToStr(float u[]) {
+        int i;
+        String s;
+        switch (u.length) {
+            case 3:
+                return String.format("[%f, %f, %f]", u[0], u[1], u[2]);
+            case 4:
+                return String.format("(%f, %f, %f, %f)", u[0], u[1], u[2], u[3]);
+            default:
+                s = "[";
+                for (i = 0; i < u.length-1; ++i) {
+                    s += String.format("%f, ", u[i]);
+                }
+                s += String.format("%f]", u[i]);
+                return s;
+        }
+    }
+
+    private static String mat9ToStr(float m[]) {
+        assertTrue(m.length == 9);
+        return String.format("[%f, %f, %f; %f, %f, %f; %f, %f, %f]",
+            m[0], m[1], m[2],
+            m[3], m[4], m[5],
+            m[6], m[7], m[8]);
+    }
+
+    private static String mat16ToStr(float m[]) {
+        assertTrue(m.length == 16);
+        return String.format("[%f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f; %f, %f, %f, %f]",
+            m[0], m[1], m[2], m[3],
+            m[4], m[5], m[6], m[7],
+            m[8], m[9], m[10], m[11],
+            m[12], m[13], m[14], m[15]);
+    }
+
+}
+
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorParameterRangeTest.java b/tests/tests/hardware/src/android/hardware/cts/SensorParameterRangeTest.java
new file mode 100644
index 0000000..4750b09
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorParameterRangeTest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2015 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.hardware.cts;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.hardware.Sensor;
+import android.hardware.SensorManager;
+import android.hardware.cts.helpers.SensorCtsHelper;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Test min-max frequency, max range parameters for sensors.
+ *
+ * <p>To execute these test cases, the following command can be used:</p>
+ * <pre>
+ * adb shell am instrument -e class android.hardware.cts.SensorParameterRangeTest \
+ *     -w com.android.cts.hardware/android.test.AndroidJUnitRunner
+ * </pre>
+ */
+public class SensorParameterRangeTest extends SensorTestCase {
+
+    private static final double ACCELEROMETER_MAX_RANGE = 8 * 9.81; // 8G
+    private static final int ACCELEROMETER_MIN_FREQUENCY = 5;
+    private static final int ACCELEROMETER_MAX_FREQUENCY = 200;
+
+    private static final double GYRO_MAX_RANGE = 1000/57.295; // 1000 degrees per sec.
+    private static final int GYRO_MIN_FREQUENCY = 5;
+    private static final int GYRO_MAX_FREQUENCY = 200;
+
+    private static final int MAGNETOMETER_MAX_RANGE = 900;   // micro telsa
+    private static final int MAGNETOMETER_MIN_FREQUENCY = 5;
+    private static final int MAGNETOMETER_MAX_FREQUENCY = 50;
+
+    private static final int PRESSURE_MAX_RANGE = 1100;     // hecto-pascal
+    private static final int PRESSURE_MIN_FREQUENCY = 1;
+    private static final int PRESSURE_MAX_FREQUENCY = 10;
+
+    private boolean mHasHifiSensors;
+    private SensorManager mSensorManager;
+
+    @Override
+    public void setUp() {
+        mSensorManager = (SensorManager) getContext().getSystemService(Context.SENSOR_SERVICE);
+        mHasHifiSensors = getContext().getPackageManager().hasSystemFeature(
+                PackageManager.FEATURE_HIFI_SENSORS);
+    }
+
+    public void testAccelerometerRange() {
+        checkSensorRangeAndFrequency(
+                mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
+                ACCELEROMETER_MAX_RANGE,
+                ACCELEROMETER_MIN_FREQUENCY,
+                ACCELEROMETER_MAX_FREQUENCY);
+  }
+
+  public void testGyroscopeRange() {
+        checkSensorRangeAndFrequency(
+                mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
+                GYRO_MAX_RANGE,
+                GYRO_MIN_FREQUENCY,
+                GYRO_MAX_FREQUENCY);
+  }
+
+    public void testMagnetometerRange() {
+        checkSensorRangeAndFrequency(
+                mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
+                MAGNETOMETER_MAX_RANGE,
+                MAGNETOMETER_MIN_FREQUENCY,
+                MAGNETOMETER_MAX_FREQUENCY);
+    }
+
+    public void testPressureRange() {
+        checkSensorRangeAndFrequency(
+                mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE),
+                PRESSURE_MAX_RANGE,
+                PRESSURE_MIN_FREQUENCY,
+                PRESSURE_MAX_FREQUENCY);
+    }
+
+    private void checkSensorRangeAndFrequency(
+          Sensor sensor, double maxRange, int minFrequency, int maxFrequency) {
+        if (!mHasHifiSensors) return;
+        assertTrue(String.format("%s Range actual=%.2f expected=%.2f %s",
+                    sensor.getName(), sensor.getMaximumRange(), maxRange,
+                    SensorCtsHelper.getUnitsForSensor(sensor)),
+                sensor.getMaximumRange() >= maxRange);
+        double actualMinFrequency = SensorCtsHelper.getFrequency(sensor.getMaxDelay(),
+                TimeUnit.MICROSECONDS);
+        assertTrue(String.format("%s Min Frequency actual=%.2f expected=%dHz",
+                    sensor.getName(), actualMinFrequency, minFrequency), actualMinFrequency <=
+                minFrequency);
+
+        double actualMaxFrequency = SensorCtsHelper.getFrequency(sensor.getMinDelay(),
+                TimeUnit.MICROSECONDS);
+        assertTrue(String.format("%s Max Frequency actual=%.2f expected=%dHz",
+                    sensor.getName(), actualMaxFrequency, maxFrequency), actualMaxFrequency >=
+                maxFrequency);
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorSupportTest.java b/tests/tests/hardware/src/android/hardware/cts/SensorSupportTest.java
new file mode 100644
index 0000000..2f25c8d
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorSupportTest.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2015 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.hardware.cts;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.hardware.Sensor;
+import android.hardware.SensorManager;
+import android.test.AndroidTestCase;
+
+/**
+ * Checks if Hifi sensors are supported. When supported, checks individual support for
+ * Accelerometer, Gyroscope, Gyroscope_uncal, GeoMagneticField, MagneticField_uncal
+ * Pressure, RotationVector, SignificantMotion, StepDetector, StepCounter, TiltDetector.
+ *
+ * <p>To execute these test cases, the following command can be used:</p>
+ * <pre>
+ * adb shell am instrument -e class android.hardware.cts.SensorSupportTest \
+ *     -w com.android.cts.hardware/android.test.AndroidJUnitRunner
+ * </pre>
+ */
+public class SensorSupportTest extends AndroidTestCase {
+    private SensorManager mSensorManager;
+    private boolean mAreHifiSensorsSupported;
+
+    @Override
+    public void setUp() {
+        // Tests will only run if HIFI_SENSORS are supported.
+        mAreHifiSensorsSupported = getContext().getPackageManager().hasSystemFeature(
+                PackageManager.FEATURE_HIFI_SENSORS);
+        if (mAreHifiSensorsSupported) {
+            mSensorManager =
+                    (SensorManager) getContext().getSystemService(Context.SENSOR_SERVICE);
+        }
+    }
+
+    public void testSupportsAccelerometer() {
+        checkSupportsSensor(Sensor.TYPE_ACCELEROMETER);
+    }
+
+    public void testSupportsGyroscope() {
+        checkSupportsSensor(Sensor.TYPE_GYROSCOPE);
+    }
+
+    public void testSupportsGyroscopeUncalibrated() {
+        checkSupportsSensor(Sensor.TYPE_GYROSCOPE_UNCALIBRATED);
+    }
+
+    public void testSupportsGeoMagneticField() {
+        checkSupportsSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR);
+    }
+
+    public void testSupportsMagneticFieldUncalibrated() {
+        checkSupportsSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED);
+    }
+
+    public void testSupportsPressure() {
+        checkSupportsSensor(Sensor.TYPE_PRESSURE);
+    }
+
+    public void testSupportsRotationVector() {
+        checkSupportsSensor(Sensor.TYPE_ROTATION_VECTOR);
+    }
+
+    public void testSupportsSignificantMotion() {
+        checkSupportsSensor(Sensor.TYPE_SIGNIFICANT_MOTION);
+    }
+
+    public void testSupportsStepDetector() {
+        checkSupportsSensor(Sensor.TYPE_STEP_DETECTOR);
+    }
+
+    public void testSupportsStepCounter() {
+        checkSupportsSensor(Sensor.TYPE_STEP_COUNTER);
+    }
+
+    public void testSupportsTiltDetector() {
+        final int TYPE_TILT_DETECTOR = 22;
+        checkSupportsSensor(TYPE_TILT_DETECTOR);
+    }
+
+    private void checkSupportsSensor(int sensorType) {
+        if (mAreHifiSensorsSupported) {
+            assertTrue(mSensorManager.getDefaultSensor(sensorType) != null);
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorTest.java b/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
index ac7632d..2c3c6f4 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
@@ -29,6 +29,7 @@
 import android.hardware.SensorManager;
 import android.hardware.TriggerEvent;
 import android.hardware.TriggerEventListener;
+import android.hardware.cts.helpers.SensorCtsHelper;
 import android.hardware.cts.helpers.SensorNotSupportedException;
 import android.hardware.cts.helpers.SensorTestStateNotSupportedException;
 import android.hardware.cts.helpers.TestSensorEnvironment;
@@ -47,6 +48,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Random;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -310,6 +312,7 @@
     // TODO: remove when parameterized tests are supported (see SensorBatchingTests.java)
     @TimeoutReq(minutes=20)
     public void testBatchAndFlush() throws Exception {
+        SensorCtsHelper.sleep(3, TimeUnit.SECONDS);
         ArrayList<Throwable> errorsFound = new ArrayList<>();
         for (Sensor sensor : mSensorList) {
             verifyRegisterListenerCallFlush(sensor, null /* handler */, errorsFound);
@@ -322,6 +325,7 @@
      */
     @TimeoutReq(minutes=10)
     public void testBatchAndFlushWithHandler() throws Exception {
+        SensorCtsHelper.sleep(3, TimeUnit.SECONDS);
         Sensor sensor = null;
         for (Sensor s : mSensorList) {
             if (s.getReportingMode() == Sensor.REPORTING_MODE_CONTINUOUS) {
@@ -347,15 +351,51 @@
         TestSensorEventListener listener = new TestSensorEventListener(environment, handler);
 
         CountDownLatch eventLatch = mTestSensorManager.registerListener(listener, 1);
-        listener.waitForEvents(eventLatch, 1);
+        listener.waitForEvents(eventLatch, 1, true);
         CountDownLatch flushLatch = mTestSensorManager.requestFlush();
-        listener.waitForFlushComplete(flushLatch);
+        listener.waitForFlushComplete(flushLatch, true);
+        listener.assertEventsReceivedInHandler();
+    }
+
+    /**
+     *  Explicit testing the SensorManager.registerListener(SensorEventListener, Sensor, int, int).
+     */
+    @TimeoutReq(minutes=10)
+    public void testBatchAndFlushUseDefaultHandler() throws Exception {
+        SensorCtsHelper.sleep(3, TimeUnit.SECONDS);
+        Sensor sensor = null;
+        for (Sensor s : mSensorList) {
+            if (s.getReportingMode() == Sensor.REPORTING_MODE_CONTINUOUS) {
+                sensor = s;
+                break;
+            }
+        }
+        if (sensor == null) {
+            throw new SensorTestStateNotSupportedException(
+                    "There are no Continuous sensors in the device.");
+        }
+
+        TestSensorEnvironment environment = new TestSensorEnvironment(
+                getContext(),
+                sensor,
+                SensorManager.SENSOR_DELAY_FASTEST,
+                (int) TimeUnit.SECONDS.toMicros(5));
+        mTestSensorManager = new TestSensorManager(environment);
+
+        TestSensorEventListener listener = new TestSensorEventListener(environment, null);
+
+        // specifyHandler <= false, use the SensorManager API without Handler parameter
+        CountDownLatch eventLatch = mTestSensorManager.registerListener(listener, 1, false);
+        listener.waitForEvents(eventLatch, 1, true);
+        CountDownLatch flushLatch = mTestSensorManager.requestFlush();
+        listener.waitForFlushComplete(flushLatch, true);
         listener.assertEventsReceivedInHandler();
     }
 
     // TODO: after L release move to SensorBatchingTests and run in all sensors with default
     //       verifications enabled
     public void testBatchAndFlushWithMultipleSensors() throws Exception {
+        SensorCtsHelper.sleep(3, TimeUnit.SECONDS);
         final int maxSensors = 3;
         final int maxReportLatencyUs = (int) TimeUnit.SECONDS.toMicros(10);
         List<Sensor> sensorsToTest = new ArrayList<Sensor>();
@@ -546,10 +586,10 @@
             try {
                 CountDownLatch eventLatch = sensorManager.registerListener(listener, mEventCount);
                 if (sensorReportingMode == Sensor.REPORTING_MODE_CONTINUOUS) {
-                    listener.waitForEvents(eventLatch, mEventCount);
+                    listener.waitForEvents(eventLatch, mEventCount, true);
                 }
                 CountDownLatch flushLatch = sensorManager.requestFlush();
-                listener.waitForFlushComplete(flushLatch);
+                listener.waitForFlushComplete(flushLatch, true);
             } finally {
                 sensorManager.unregisterListener();
             }
@@ -568,4 +608,5 @@
         @Override
         public void onAccuracyChanged(Sensor sensor, int accuracy) {}
     }
+
 }
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorTestCase.java b/tests/tests/hardware/src/android/hardware/cts/SensorTestCase.java
index 42b8d33..10992c5 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SensorTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorTestCase.java
@@ -32,15 +32,12 @@
     protected static final String LOG_TAG = "TestRunner";
 
     /**
-     * By default tests need to run in a {@link TestSensorEnvironment} that assumes each sensor is
-     * running with a load of several listeners, requesting data at different rates.
-     *
-     * In a better world the component acting as builder of {@link SensorOperation} would compute
-     * this value based on the tests composed.
-     *
-     * Ideally, each {@link Sensor} object would expose this information to clients.
+     * Previously for L release, we had this flag to know if each sensor is running with multiple
+     * listeners each requesting different data rates. Now before running CTS tests all sensors
+     * are de-activated by putting SensorService in RESTRICTED mode. Only CTS tests can
+     * activate/deactivate sensors in this mode. So we can default this flag value to false.
      */
-    private volatile boolean mEmulateSensorUnderLoad = true;
+    private volatile boolean mEmulateSensorUnderLoad = false;
 
     /**
      * By default the test class is the root of the test hierarchy.
diff --git a/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java b/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java
index 0fbd8fa..73d61a5 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.hardware.Sensor;
 import android.hardware.SensorManager;
+import android.hardware.cts.helpers.SensorCtsHelper;
 import android.hardware.cts.helpers.SensorStats;
 import android.hardware.cts.helpers.TestSensorEnvironment;
 import android.hardware.cts.helpers.sensoroperations.TestSensorOperation;
@@ -542,6 +543,7 @@
     }
 
     private void runSensorTest(int sensorType, int rateUs) throws Throwable {
+        SensorCtsHelper.sleep(3, TimeUnit.SECONDS);
         TestSensorEnvironment environment = new TestSensorEnvironment(
                 getContext(),
                 sensorType,
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelper.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelper.java
index 490e965..55465ac 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelper.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelper.java
@@ -15,6 +15,7 @@
  */
 package android.hardware.cts.helpers;
 
+import android.hardware.Sensor;
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -259,4 +260,20 @@
             throw new IllegalStateException("Collection cannot be null or empty");
         }
     }
+
+    public static String getUnitsForSensor(Sensor sensor) {
+        switch(sensor.getType()) {
+            case Sensor.TYPE_ACCELEROMETER:
+                return "m/s^2";
+            case Sensor.TYPE_MAGNETIC_FIELD:
+            case Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED:
+                return "uT";
+            case Sensor.TYPE_GYROSCOPE:
+            case Sensor.TYPE_GYROSCOPE_UNCALIBRATED:
+                return "radians/sec";
+            case Sensor.TYPE_PRESSURE:
+                return "hPa";
+        };
+        return "";
+    }
 }
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorNotSupportedException.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorNotSupportedException.java
index e727092..0d90957 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorNotSupportedException.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorNotSupportedException.java
@@ -26,6 +26,11 @@
         super("Sensor '%s' of type %d is not supported.", getSensorName(sensorType), sensorType);
     }
 
+    public SensorNotSupportedException(int sensorType, boolean wakeup) {
+        super("Sensor '%s' of type %d and %s is not supported.", getSensorName(sensorType),
+               sensorType, wakeup ? "wake-up" : "non wake-up");
+    }
+
     private static String getSensorName(int sensorType) {
         return String.format("%s (%d)", getSimpleSensorName(sensorType), sensorType);
     }
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorStats.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorStats.java
index 8067aed..413639a 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorStats.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorStats.java
@@ -41,6 +41,7 @@
     public static final String DELIMITER = "__";
 
     public static final String ERROR = "error";
+    public static final String EVENT_FIFO_LENGTH = "event_fifo_length_observed";
     public static final String EVENT_GAP_COUNT_KEY = "event_gap_count";
     public static final String EVENT_GAP_POSITIONS_KEY = "event_gap_positions";
     public static final String EVENT_OUT_OF_ORDER_COUNT_KEY = "event_out_of_order_count";
@@ -54,6 +55,7 @@
     public static final String MEAN_KEY = "mean";
     public static final String STANDARD_DEVIATION_KEY = "standard_deviation";
     public static final String MAGNITUDE_KEY = "magnitude";
+    public static final String DELAYED_BATCH_DELIVERY = "delayed_batch_delivery";
 
     private final Map<String, Object> mValues = new HashMap<>();
     private final Map<String, SensorStats> mSensorStats = new HashMap<>();
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SuspendStateMonitor.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SuspendStateMonitor.java
new file mode 100644
index 0000000..627e876
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SuspendStateMonitor.java
@@ -0,0 +1,83 @@
+package android.hardware.cts.helpers;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import android.hardware.Sensor;
+import android.hardware.TriggerEvent;
+import android.hardware.TriggerEventListener;
+import android.os.Handler;
+import android.os.SystemClock;
+import android.util.Log;
+
+import junit.framework.Assert;
+
+public class SuspendStateMonitor extends TimerTask {
+    private final double firstRealTimeMillis;
+    private final double firstUpTimeMillis;
+    private double lastSleepTimeSeconds = 0;
+    private volatile long lastWakeUpTime = 0;
+    Timer sleepMonitoringTimer = new Timer();
+    private final List<CountDownLatch> mWaitForWakeUpLatch = new ArrayList<>();
+    private final String TAG = "SensorCTSDeviceSuspendMonitor";
+
+    /**
+     * Returns the time the device slept since the start of the application,
+     * in seconds.
+     */
+    public double getSleepTimeSeconds() {
+        double totalSinceStart = android.os.SystemClock.elapsedRealtime() - firstRealTimeMillis;
+        double upTimeSinceStart = android.os.SystemClock.uptimeMillis() - firstUpTimeMillis;
+        return (totalSinceStart - upTimeSinceStart) / 1000;
+    }
+
+    public long getLastWakeUpTime() {
+        return lastWakeUpTime;
+    }
+
+
+    public void waitForWakeUp(int numSeconds) throws InterruptedException {
+        CountDownLatch latch = new CountDownLatch(1);
+        synchronized(mWaitForWakeUpLatch) {
+            mWaitForWakeUpLatch.add(latch);
+        }
+        if (numSeconds == -1) {
+            // Wait indefinitely.
+            latch.await();
+        } else {
+            // Wait for the specified number of seconds.
+            boolean countZero = latch.await(numSeconds, TimeUnit.SECONDS);
+            if (!countZero) {
+               Log.e(TAG, "Device did not enter suspend state.");
+            }
+        }
+    }
+
+    /**
+     * Run every 100ms inside the TimerTask.
+     */
+    @Override
+    public void run() {
+        if (getSleepTimeSeconds() - lastSleepTimeSeconds > 0.1) {
+            lastSleepTimeSeconds = getSleepTimeSeconds();
+            lastWakeUpTime = SystemClock.elapsedRealtime();
+            // If any client is waiting for wake-up, call countDown to unblock it.
+            synchronized(mWaitForWakeUpLatch) {
+                for (CountDownLatch latch : mWaitForWakeUpLatch) {
+                    latch.countDown();
+                }
+            }
+        }
+    }
+
+    public SuspendStateMonitor() {
+        firstRealTimeMillis = android.os.SystemClock.elapsedRealtime();
+        firstUpTimeMillis = android.os.SystemClock.uptimeMillis();
+        // Every 100 miliseconds, check whether the device has slept.
+        sleepMonitoringTimer.schedule(this, 0, 100);
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEnvironment.java b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEnvironment.java
index 143f0a1..6156d3d 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEnvironment.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEnvironment.java
@@ -40,6 +40,7 @@
     private final boolean mSensorMightHaveMoreListeners;
     private final int mSamplingPeriodUs;
     private final int mMaxReportLatencyUs;
+    private final boolean mIsDeviceSuspendTest;
 
     /**
      * Constructs an environment for sensor testing.
@@ -163,11 +164,27 @@
             boolean sensorMightHaveMoreListeners,
             int samplingPeriodUs,
             int maxReportLatencyUs) {
+        this(context,
+                sensor,
+                sensorMightHaveMoreListeners,
+                samplingPeriodUs,
+                maxReportLatencyUs,
+                false /* isDeviceSuspendTest */);
+    }
+
+    public TestSensorEnvironment(
+            Context context,
+            Sensor sensor,
+            boolean sensorMightHaveMoreListeners,
+            int samplingPeriodUs,
+            int maxReportLatencyUs,
+            boolean isDeviceSuspendTest) {
         mContext = context;
         mSensor = sensor;
         mSensorMightHaveMoreListeners = sensorMightHaveMoreListeners;
         mSamplingPeriodUs = samplingPeriodUs;
         mMaxReportLatencyUs = maxReportLatencyUs;
+        mIsDeviceSuspendTest = isDeviceSuspendTest;
     }
 
     /**
@@ -357,4 +374,9 @@
                 && mSamplingPeriodUs != SensorManager.SENSOR_DELAY_UI
                 && mSamplingPeriodUs != SensorManager.SENSOR_DELAY_NORMAL);
     }
+
+    public boolean isDeviceSuspendTest() {
+        return mIsDeviceSuspendTest;
+    }
 }
+
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEventListener.java b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEventListener.java
index 662c3ce..3e70e75 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEventListener.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEventListener.java
@@ -18,12 +18,16 @@
 
 import junit.framework.Assert;
 
+import android.content.Context;
 import android.hardware.Sensor;
 import android.hardware.SensorEvent;
 import android.hardware.SensorEventListener2;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.SystemClock;
+import android.os.PowerManager;
+import android.os.PowerManager.WakeLock;
+import android.util.Log;
 
 import java.io.BufferedWriter;
 import java.io.File;
@@ -50,12 +54,14 @@
     private static final long FLUSH_TIMEOUT_US = TimeUnit.SECONDS.toMicros(10);
 
     private final ArrayList<TestSensorEvent> mCollectedEvents = new ArrayList<>();
+    private final ArrayList<Long> mTimeStampFlushCompleteEvents = new ArrayList<>();
     private final List<CountDownLatch> mEventLatches = new ArrayList<>();
     private final List<CountDownLatch> mFlushLatches = new ArrayList<>();
     private final AtomicInteger mEventsReceivedOutsideHandler = new AtomicInteger();
 
     private final Handler mHandler;
     private final TestSensorEnvironment mEnvironment;
+    private final PowerManager.WakeLock mTestSensorEventListenerWakeLock;
 
     /**
      * @deprecated Use {@link TestSensorEventListener(TestSensorEnvironment)}.
@@ -78,6 +84,10 @@
     public TestSensorEventListener(TestSensorEnvironment environment, Handler handler) {
         mEnvironment = environment;
         mHandler = handler;
+        PowerManager pm = (PowerManager) environment.getContext().getSystemService(
+                Context.POWER_SERVICE);
+        mTestSensorEventListenerWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
+                                                "TestSensorEventListenerWakeLock");
     }
 
     /**
@@ -93,6 +103,9 @@
         synchronized (mEventLatches) {
             for (CountDownLatch latch : mEventLatches) {
                 latch.countDown();
+                if (latch.getCount() == 0 && !mTestSensorEventListenerWakeLock.isHeld()) {
+                    mTestSensorEventListenerWakeLock.acquire();
+                }
             }
         }
     }
@@ -136,6 +149,10 @@
     @Override
     public void onFlushCompleted(Sensor sensor) {
         checkHandler();
+        long timestampNs = SystemClock.elapsedRealtimeNanos();
+        synchronized (mTimeStampFlushCompleteEvents) {
+           mTimeStampFlushCompleteEvents.add(timestampNs);
+        }
         synchronized (mFlushLatches) {
             for (CountDownLatch latch : mFlushLatches) {
                 latch.countDown();
@@ -175,7 +192,8 @@
      * It will overwrite the file if it already exists, the file is created in a relative directory
      * named 'events' under the sensor test directory (part of external storage).
      */
-    public void logCollectedEventsToFile(String fileName) throws IOException {
+    public void logCollectedEventsToFile(String fileName, long deviceWakeUpTimeMs)
+        throws IOException {
         StringBuilder builder = new StringBuilder();
         builder.append("Sensor='").append(mEnvironment.getSensor()).append("', ");
         builder.append("SamplingRateOverloaded=")
@@ -184,15 +202,54 @@
                 .append(mEnvironment.getRequestedSamplingPeriodUs()).append("us, ");
         builder.append("MaxReportLatency=")
                 .append(mEnvironment.getMaxReportLatencyUs()).append("us");
-
         synchronized (mCollectedEvents) {
-            for (TestSensorEvent event : mCollectedEvents) {
+            int i = 0, j = 0;
+            while (i < mCollectedEvents.size() && j < mTimeStampFlushCompleteEvents.size()) {
+                if (mCollectedEvents.get(i).receivedTimestamp <
+                        mTimeStampFlushCompleteEvents.get(j)) {
+                    TestSensorEvent event = mCollectedEvents.get(i);
+                    if (deviceWakeUpTimeMs != -1 && deviceWakeUpTimeMs <
+                            event.receivedTimestamp/1000000) {
+                        builder.append("\n");
+                        builder.append("AP wake-up time=").append(deviceWakeUpTimeMs).append("ms");
+                        deviceWakeUpTimeMs = -1;
+                    }
+                    builder.append("\n");
+                    builder.append("Timestamp=").append(event.timestamp/1000000).append("ms, ");
+                    builder.append("ReceivedTimestamp=").append(event.receivedTimestamp/1000000).
+                        append("ms, ");
+                    builder.append("Accuracy=").append(event.accuracy).append(", ");
+                    builder.append("Values=").append(Arrays.toString(event.values));
+                    ++i;
+                } else {
+                    builder.append("\n");
+                    builder.append("ReceivedTimestamp=")
+                    .append(mTimeStampFlushCompleteEvents.get(j)/1000000)
+                    .append("ms Flush complete Event");
+                    ++j;
+                }
+            }
+            for (;i < mCollectedEvents.size(); ++i) {
+                TestSensorEvent event = mCollectedEvents.get(i);
+                if (deviceWakeUpTimeMs != -1 && deviceWakeUpTimeMs <
+                        event.receivedTimestamp/1000000) {
+                    builder.append("\n");
+                    builder.append("AP wake-up time=").append(deviceWakeUpTimeMs).append("ms");
+                    deviceWakeUpTimeMs = -1;
+                }
                 builder.append("\n");
-                builder.append("Timestamp=").append(event.timestamp).append("ns, ");
-                builder.append("ReceivedTimestamp=").append(event.receivedTimestamp).append("ns, ");
+                builder.append("Timestamp=").append(event.timestamp/1000000).append("ms, ");
+                builder.append("ReceivedTimestamp=").append(event.receivedTimestamp/1000000).
+                    append("ms, ");
                 builder.append("Accuracy=").append(event.accuracy).append(", ");
                 builder.append("Values=").append(Arrays.toString(event.values));
             }
+            for (;j < mTimeStampFlushCompleteEvents.size(); ++j) {
+                builder.append("\n");
+                builder.append("ReceivedTimestamp=")
+                    .append(mTimeStampFlushCompleteEvents.get(j)/1000000)
+                    .append("ms Flush complete Event");
+            }
         }
 
         File eventsDirectory = SensorCtsHelper.getSensorTestDataDirectory("events/");
@@ -208,8 +265,11 @@
      *
      * @throws AssertionError if there was a timeout after {@link #FLUSH_TIMEOUT_US} &micro;s
      */
-    public void waitForFlushComplete(CountDownLatch latch) throws InterruptedException {
-        clearEvents();
+    public void waitForFlushComplete(CountDownLatch latch,
+                                      boolean clearCollectedEvents) throws InterruptedException {
+        if (clearCollectedEvents) {
+            clearEvents();
+        }
         try {
             String message = SensorCtsHelper.formatAssertionMessage(
                     "WaitForFlush",
@@ -229,8 +289,11 @@
      *
      * @throws AssertionError if there was a timeout after {@link #FLUSH_TIMEOUT_US} &micro;s
      */
-    public void waitForEvents(CountDownLatch latch, int eventCount) throws InterruptedException {
-        clearEvents();
+    public void waitForEvents(CountDownLatch latch, int eventCount,
+                               boolean clearCollectedEvents) throws InterruptedException {
+        if (clearCollectedEvents) {
+            clearEvents();
+        }
         try {
             long samplingPeriodUs = mEnvironment.getMaximumExpectedSamplingPeriodUs();
             // timeout is 2 * event count * expected period + batch timeout + default wait
@@ -279,6 +342,12 @@
         Assert.assertEquals(message, 0 /* expected */, eventsOutsideHandler);
     }
 
+    public void releaseWakeLock() {
+        if (mTestSensorEventListenerWakeLock.isHeld()) {
+            mTestSensorEventListenerWakeLock.release();
+        }
+    }
+
     /**
      * Keeps track of the number of events that arrived in a different {@link Looper} than the one
      * associated with the {@link TestSensorEventListener}.
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorManager.java b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorManager.java
index 2468bd1..23580de 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorManager.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorManager.java
@@ -77,6 +77,7 @@
 
         mTestSensorEventListener = listener;
         String message = SensorCtsHelper.formatAssertionMessage("registerListener", mEnvironment);
+
         boolean result = mSensorManager.registerListener(
                 mTestSensorEventListener,
                 mEnvironment.getSensor(),
@@ -94,7 +95,10 @@
      * @throws AssertionError if there was an error registering the listener with the
      * {@link SensorManager}
      */
-    public CountDownLatch registerListener(TestSensorEventListener listener, int eventCount) {
+    public CountDownLatch registerListener(
+            TestSensorEventListener listener,
+            int eventCount,
+            boolean specifyHandler) {
         if (mTestSensorEventListener != null) {
             Log.w(LOG_TAG, "Listener already registered, returning.");
             return null;
@@ -103,17 +107,41 @@
         CountDownLatch latch = listener.getLatchForSensorEvents(eventCount);
         mTestSensorEventListener = listener;
         String message = SensorCtsHelper.formatAssertionMessage("registerListener", mEnvironment);
-        boolean result = mSensorManager.registerListener(
-                mTestSensorEventListener,
-                mEnvironment.getSensor(),
-                mEnvironment.getRequestedSamplingPeriodUs(),
-                mEnvironment.getMaxReportLatencyUs(),
-                mTestSensorEventListener.getHandler());
+
+        boolean result;
+        if (specifyHandler) {
+            result = mSensorManager.registerListener(
+                    mTestSensorEventListener,
+                    mEnvironment.getSensor(),
+                    mEnvironment.getRequestedSamplingPeriodUs(),
+                    mEnvironment.getMaxReportLatencyUs(),
+                    mTestSensorEventListener.getHandler());
+        } else {
+            result = mSensorManager.registerListener(
+                    mTestSensorEventListener,
+                    mEnvironment.getSensor(),
+                    mEnvironment.getRequestedSamplingPeriodUs(),
+                    mEnvironment.getMaxReportLatencyUs());
+        }
         Assert.assertTrue(message, result);
         return latch;
     }
 
     /**
+     * Register the listener. This method will perform a no-op if the sensor is already registered.
+     *
+     * @return A CountDownLatch initialized with eventCount which is used to wait for sensor
+     * events.
+     * @throws AssertionError if there was an error registering the listener with the
+     * {@link SensorManager}
+     */
+    public CountDownLatch registerListener(
+            TestSensorEventListener listener,
+            int eventCount) {
+        return registerListener(listener, eventCount, true);
+    }
+
+    /**
      * Unregister the listener. This method will perform a no-op if the sensor is not registered.
      */
     public void unregisterListener() {
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/TestSensorOperation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/TestSensorOperation.java
index 3b90b15..11fdc93 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/TestSensorOperation.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensoroperations/TestSensorOperation.java
@@ -16,7 +16,11 @@
 
 package android.hardware.cts.helpers.sensoroperations;
 
-import junit.framework.Assert;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 import android.hardware.cts.helpers.SensorCtsHelper;
 import android.hardware.cts.helpers.SensorStats;
@@ -25,6 +29,7 @@
 import android.hardware.cts.helpers.TestSensorEvent;
 import android.hardware.cts.helpers.TestSensorEventListener;
 import android.hardware.cts.helpers.TestSensorManager;
+import android.hardware.cts.helpers.SuspendStateMonitor;
 import android.hardware.cts.helpers.reporting.ISensorTestNode;
 import android.hardware.cts.helpers.sensorverification.EventGapVerification;
 import android.hardware.cts.helpers.sensorverification.EventOrderingVerification;
@@ -36,13 +41,11 @@
 import android.hardware.cts.helpers.sensorverification.MeanVerification;
 import android.hardware.cts.helpers.sensorverification.StandardDeviationVerification;
 import android.os.Handler;
+import android.os.SystemClock;
+import android.os.PowerManager.WakeLock;
 import android.util.Log;
 
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
+import junit.framework.Assert;
 
 /**
  * A {@link SensorOperation} used to verify that sensor events and sensor values are correct.
@@ -61,6 +64,7 @@
     private final TestSensorEnvironment mEnvironment;
     private final Executor mExecutor;
     private final Handler mHandler;
+    private long mDeviceWakeUpTimeMs = -1;
 
     /**
      * An interface that defines an abstraction for operations to be performed by the
@@ -118,7 +122,22 @@
     public void execute(ISensorTestNode parent) throws InterruptedException {
         getStats().addValue("sensor_name", mEnvironment.getSensor().getName());
         TestSensorEventListener listener = new TestSensorEventListener(mEnvironment, mHandler);
-        mExecutor.execute(mSensorManager, listener);
+
+        if (mEnvironment.isDeviceSuspendTest()) {
+            SuspendStateMonitor suspendStateMonitor = new SuspendStateMonitor();
+            long startTimeMs = SystemClock.elapsedRealtime();
+            // Device should go into suspend here.
+            mExecutor.execute(mSensorManager, listener);
+            long endTimeMs = SystemClock.elapsedRealtime();
+            // Check if the device has gone into suspend during test execution.
+            mDeviceWakeUpTimeMs = suspendStateMonitor.getLastWakeUpTime();
+            suspendStateMonitor.cancel();
+            Assert.assertTrue("Device did not go into suspend during test execution",
+                                       startTimeMs < mDeviceWakeUpTimeMs &&
+                                       mDeviceWakeUpTimeMs < endTimeMs);
+        } else {
+            mExecutor.execute(mSensorManager, listener);
+        }
 
         boolean failed = false;
         StringBuilder sb = new StringBuilder();
@@ -126,7 +145,6 @@
         for (ISensorVerification verification : mVerifications) {
             failed |= evaluateResults(collectedEvents, verification, sb);
         }
-
         if (failed) {
             trySaveCollectedEvents(parent, listener);
 
@@ -193,7 +211,7 @@
         }
 
         try {
-            listener.logCollectedEventsToFile(sanitizedFileName);
+            listener.logCollectedEventsToFile(sanitizedFileName, mDeviceWakeUpTimeMs);
         } catch (IOException e) {
             Log.w(TAG, "Unable to save collected events to file: " + sanitizedFileName, e);
         }
@@ -214,7 +232,7 @@
                     throws InterruptedException {
                 try {
                     CountDownLatch latch = sensorManager.registerListener(listener, eventCount);
-                    listener.waitForEvents(latch, eventCount);
+                    listener.waitForEvents(latch, eventCount, true);
                 } finally {
                     sensorManager.unregisterListener();
                 }
@@ -224,6 +242,89 @@
     }
 
     /**
+     * Creates an operation that will wait for a given amount of events to arrive.
+     *
+     * @param environment The test environment.
+     * @param eventCount The number of events to wait for.
+     */
+    public static TestSensorOperation createOperation(
+            final TestSensorEnvironment environment,
+            final WakeLock wakeLock,
+            final boolean flushBeforeAfterSuspend) {
+        Executor executor = new Executor() {
+            @Override
+            public void execute(TestSensorManager sensorManager, TestSensorEventListener listener)
+                    throws InterruptedException {
+                try {
+                    sensorManager.registerListener(listener);
+                    if (flushBeforeAfterSuspend) {
+                        int initialNumEvents1 = listener.getCollectedEvents().size();
+                        SensorCtsHelper.sleep(2, TimeUnit.SECONDS);
+                        CountDownLatch flushLatch1 = sensorManager.requestFlush();
+                        listener.waitForFlushComplete(flushLatch1, false);
+                        Assert.assertTrue("1.No sensor events collected on calling flush " +
+                                environment.toString(),
+                                listener.getCollectedEvents().size() - initialNumEvents1 > 0);
+                    }
+
+                    Log.i(TAG, "Collected sensor events size1=" +
+                            listener.getCollectedEvents().size());
+                    int initialNumEvents2 = listener.getCollectedEvents().size();
+                    if (wakeLock.isHeld()) {
+                        wakeLock.release();
+                    }
+                    listener.releaseWakeLock();
+
+                    SuspendStateMonitor suspendMonitor = new SuspendStateMonitor();
+                    long approxStartTimeMs = SystemClock.elapsedRealtime();
+                    // Allow the device to go into suspend. Wait for wake-up.
+                    suspendMonitor.waitForWakeUp(15);
+                    suspendMonitor.cancel();
+
+                    if (!wakeLock.isHeld()) {
+                        wakeLock.acquire();
+                    }
+
+                    CountDownLatch flushLatch2 = sensorManager.requestFlush();
+                    listener.waitForFlushComplete(flushLatch2, false);
+
+                    Log.i(TAG, "Collected sensor events size2=" +
+                            listener.getCollectedEvents().size());
+
+                    if (listener.getCollectedEvents().size() - initialNumEvents2 <= 0 &&
+                            suspendMonitor.getLastWakeUpTime() > 0) {
+                        // Fail
+                        String str = String.format("No Sensor events collected by calling flush " +
+                                "after device wake up. Approx time after which device went into " +
+                                "suspend %dms ,approx AP wake-up time %dms %s",
+                                approxStartTimeMs, suspendMonitor.getLastWakeUpTime(),
+                                environment.toString());
+                        Assert.fail(str);
+                    }
+                    if (flushBeforeAfterSuspend) {
+                        int initialNumEvents3 = listener.getCollectedEvents().size();
+                        SensorCtsHelper.sleep(2, TimeUnit.SECONDS);
+                        CountDownLatch flushLatch3 = sensorManager.requestFlush();
+                        listener.waitForFlushComplete(flushLatch3, false);
+                        Assert.assertTrue("3.No sensor events collected on calling flush " +
+                                environment.toString(),
+                                listener.getCollectedEvents().size() - initialNumEvents3 > 0);
+                    }
+                    Log.i(TAG, "Collected sensor events size3=" +
+                            listener.getCollectedEvents().size());
+                } finally {
+                    if(!wakeLock.isHeld()) {
+                        wakeLock.acquire();
+                    }
+                    listener.releaseWakeLock();
+                    sensorManager.unregisterListener();
+                }
+            }
+        };
+        return new TestSensorOperation(environment, executor);
+    }
+
+    /**
      * Creates an operation that will wait for a given amount of time to collect events.
      *
      * @param environment The test environment.
@@ -269,7 +370,7 @@
                     sensorManager.registerListener(listener);
                     SensorCtsHelper.sleep(duration, timeUnit);
                     CountDownLatch latch = sensorManager.requestFlush();
-                    listener.waitForFlushComplete(latch);
+                    listener.waitForFlushComplete(latch, true);
                 } finally {
                     sensorManager.unregisterListener();
                 }
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/AbstractSensorVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/AbstractSensorVerification.java
index 1e775e3..4c449dd 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/AbstractSensorVerification.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/AbstractSensorVerification.java
@@ -82,4 +82,8 @@
             this.previousEvent = previousEvent;
         }
     }
+
+    protected double nanosToMillis(long nanos) {
+        return nanos/(1000.0 * 1000.0);
+    }
 }
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/BatchArrivalVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/BatchArrivalVerification.java
new file mode 100644
index 0000000..db6dc72
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/BatchArrivalVerification.java
@@ -0,0 +1,142 @@
+
+package android.hardware.cts.helpers.sensorverification;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import android.hardware.Sensor;
+import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.TestSensorEnvironment;
+import android.hardware.cts.helpers.TestSensorEvent;
+import android.hardware.cts.helpers.sensorverification.AbstractSensorVerification.IndexedEventPair;
+import android.os.SystemClock;
+import android.provider.Settings.System;
+
+import junit.framework.Assert;
+
+/**
+ * A {@link ISensorVerification} which verifies that there are no missing events. This is done by
+ * checking the last received sensor timestamp and checking that it is within 1.8 * the expected
+ * period.
+ */
+public class BatchArrivalVerification extends AbstractSensorVerification {
+    public static final String PASSED_KEY = "missing_event_passed";
+
+    // Batch arrival tolerance is 5 seconds.
+    private static final int BATCH_ARRIVAL_TOLERANCE_US = 5000000;
+
+    // Number of indices to print in assert message before truncating
+    private static final int TRUNCATE_MESSAGE_LENGTH = 3;
+
+    // Number of events to truncate (discard) from the initial events received
+    private static final int TRUNCATE_EVENTS_COUNT = 100;
+
+    private final long mExpectedBatchArrivalTimeUs;
+
+    private final List<IndexedEventPair> mFailures = new LinkedList<IndexedEventPair>();
+    private TestSensorEvent mFirstEvent = null;
+    private int mIndex = 0;
+    private final long mEstimatedTestStartTimeMs;
+
+    /**
+     * Construct a {@link EventGapVerification}
+     *
+     * @param expectedDelayUs the expected period in us.
+     */
+    public BatchArrivalVerification(long expectedBatchArrivalTimeUs) {
+         mExpectedBatchArrivalTimeUs = expectedBatchArrivalTimeUs;
+         mEstimatedTestStartTimeMs = SystemClock.elapsedRealtime();
+    }
+
+    /**
+     * Get the default {@link EventGapVerification}.
+     *
+     * @param environment the test environment
+     * @return the verification or null if the verification is not a continuous mode sensor.
+     */
+    public static BatchArrivalVerification getDefault(TestSensorEnvironment environment) {
+        if (environment.getSensor().getReportingMode() != Sensor.REPORTING_MODE_CONTINUOUS) {
+            return null;
+        }
+        long fifoMaxEventCount = environment.getSensor().getFifoMaxEventCount();
+        int maximumExpectedSamplingPeriodUs = environment.getMaximumExpectedSamplingPeriodUs();
+        long reportLatencyUs = environment.getMaxReportLatencyUs();
+        if (fifoMaxEventCount > 0 && maximumExpectedSamplingPeriodUs != Integer.MAX_VALUE) {
+            long fifoBasedReportLatencyUs =
+                    fifoMaxEventCount * maximumExpectedSamplingPeriodUs;
+            // If the device goes into suspend mode during the test and the sensor under test is
+            // a non wake-up sensor, the FIFO will keep overwriting itself and the reportLatency
+            // of each event will be equal to the time it takes to fill up the FIFO.
+            if (environment.isDeviceSuspendTest() && !environment.getSensor().isWakeUpSensor()) {
+                reportLatencyUs = fifoBasedReportLatencyUs;
+            } else {
+                // In this case the sensor under test is either a wake-up sensor OR it
+                // is a non wake-up sensor but the device does not go into suspend.
+                // So the expected delay of a sensor_event is the minimum of the
+                // fifoBasedReportLatencyUs and the requested latency by the application.
+                reportLatencyUs = Math.min(reportLatencyUs, fifoBasedReportLatencyUs);
+            }
+        }
+        long expectedBatchArrivalTimeUs = reportLatencyUs + SystemClock.elapsedRealtime() * 1000;
+        return new BatchArrivalVerification(expectedBatchArrivalTimeUs);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void verify(TestSensorEnvironment environment, SensorStats stats) {
+        final int count = mFailures.size();
+        stats.addValue(PASSED_KEY, count == 0);
+        stats.addValue(SensorStats.DELAYED_BATCH_DELIVERY, count);
+
+        if (count > 0) {
+            StringBuilder sb = new StringBuilder();
+            sb.append(count).append(" BatchArrivalDelayed: ");
+            for (int i = 0; i < Math.min(count, TRUNCATE_MESSAGE_LENGTH); i++) {
+                IndexedEventPair info = mFailures.get(i);
+                sb.append(String.format("expectedBatchArrival=%dms actualBatchArrivalTime=%dms "+
+                                        "estimedTestStartTime=%dms diff=%dms tolerance=%dms",
+                                         (mExpectedBatchArrivalTimeUs)/1000,
+                                         info.event.receivedTimestamp/(1000 * 1000),
+                                         mEstimatedTestStartTimeMs,
+                                         (mExpectedBatchArrivalTimeUs -
+                                          info.event.receivedTimestamp/1000)/1000,
+                                         BATCH_ARRIVAL_TOLERANCE_US/1000)
+
+                          );
+
+            }
+            if (count > TRUNCATE_MESSAGE_LENGTH) {
+                sb.append(count - TRUNCATE_MESSAGE_LENGTH).append(" more; ");
+            }
+            Assert.fail(sb.toString());
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public BatchArrivalVerification clone() {
+        return new BatchArrivalVerification(mExpectedBatchArrivalTimeUs);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void addSensorEventInternal(TestSensorEvent event) {
+        if (mFirstEvent == null) {
+            mFirstEvent = event;
+        }
+        if (mIndex == 1) {
+            if (Math.abs(mFirstEvent.receivedTimestamp/1000 - mExpectedBatchArrivalTimeUs) >
+                BATCH_ARRIVAL_TOLERANCE_US) {
+                mFailures.add(new IndexedEventPair(1, mFirstEvent, null));
+            }
+        }
+        ++mIndex;
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventGapVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventGapVerification.java
index b692f0f..76f1594 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventGapVerification.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventGapVerification.java
@@ -28,6 +28,10 @@
     // Number of events to truncate (discard) from the initial events received
     private static final int TRUNCATE_EVENTS_COUNT = 1;
 
+    // Number of event gaps to tolerate is the minimum of 1% of total events received or 10.
+    private static final int EVENT_GAP_TOLERANCE_COUNT = 10;
+    private static final double EVENT_GAP_TOLERANCE_PERCENT = 0.01;
+
     private final int mExpectedDelayUs;
 
     private final List<IndexedEventPair> mEventGaps = new LinkedList<IndexedEventPair>();
@@ -68,24 +72,26 @@
         }
 
         final int count = mEventGaps.size();
-        stats.addValue(PASSED_KEY, count == 0);
+        // Ensure that eventGapTolerance is at least 1.
+        int eventGapTolerance = (int)Math.max(1, Math.min(EVENT_GAP_TOLERANCE_COUNT,
+                    EVENT_GAP_TOLERANCE_PERCENT * mIndex));
+        stats.addValue(PASSED_KEY, count <= eventGapTolerance);
         stats.addValue(SensorStats.EVENT_GAP_COUNT_KEY, count);
         stats.addValue(SensorStats.EVENT_GAP_POSITIONS_KEY, getIndexArray(mEventGaps));
 
-        if (count > 0) {
+        if (count > eventGapTolerance) {
             StringBuilder sb = new StringBuilder();
             sb.append(count).append(" events gaps: ");
             for (int i = 0; i < Math.min(count, TRUNCATE_MESSAGE_LENGTH); i++) {
                 IndexedEventPair info = mEventGaps.get(i);
-                sb.append(String.format("position=%d, delta_time=%dns; ", info.index,
-                        info.event.timestamp - info.previousEvent.timestamp));
+                sb.append(String.format("position=%d, delta_time=%.2fms; ", info.index,
+                        nanosToMillis(info.event.timestamp - info.previousEvent.timestamp)));
             }
             if (count > TRUNCATE_MESSAGE_LENGTH) {
                 sb.append(count - TRUNCATE_MESSAGE_LENGTH).append(" more; ");
             }
-            sb.append(String.format("(expected <%dns)",
-                    TimeUnit.NANOSECONDS.convert((int) (THRESHOLD * mExpectedDelayUs),
-                            TimeUnit.MICROSECONDS)));
+            sb.append(String.format("(expected <%.2fms)",
+                    (double)(THRESHOLD * mExpectedDelayUs)/1000.0));
             Assert.fail(sb.toString());
         }
     }
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventGapVerificationTest.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventGapVerificationTest.java
index 6f17e7b..687e63b 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventGapVerificationTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventGapVerificationTest.java
@@ -62,7 +62,7 @@
     public void testVerify_missing_events() {
         // Timestamps in ns, expected in us
         long[] timestamps = {1000000, 2000000, 3000000, 5000000, 6000000};
-        runVerification(1000, timestamps, false, new int[]{3});
+        runVerification(1000, timestamps, true, new int[]{3});
     }
 
     private void runVerification(int expected, long[] timestamps, boolean pass,
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventOrderingVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventOrderingVerification.java
index d3b317b..5a176d5 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventOrderingVerification.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventOrderingVerification.java
@@ -82,8 +82,9 @@
             sb.append(count).append(" events out of order: ");
             for (int i = 0; i < Math.min(count, TRUNCATE_MESSAGE_LENGTH); i++) {
                 IndexedEventPair info = mOutOfOrderEvents.get(i);
-                sb.append(String.format("position=%d, previous=%d, timestamp=%d; ", info.index,
-                        info.previousEvent.timestamp, info.event.timestamp));
+                sb.append(String.format("position=%d, previous_ts=%.2fms, current_ts=%.2fms",
+                            info.index, nanosToMillis(info.previousEvent.timestamp),
+                            nanosToMillis(info.event.timestamp)));
             }
             if (count > TRUNCATE_MESSAGE_LENGTH) {
                 sb.append(count - TRUNCATE_MESSAGE_LENGTH).append(" more");
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventOrderingVerificationTest.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventOrderingVerificationTest.java
index b9848fa..f1dc229c8 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventOrderingVerificationTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventOrderingVerificationTest.java
@@ -41,16 +41,6 @@
     }
 
     /**
-     * Test that the verification passes when the timestamps are the same.
-     */
-    public void testSameTimestamp() {
-        SensorStats stats = new SensorStats();
-        EventOrderingVerification verification = getVerification(0, 0, 0, 0, 0);
-        verification.verify(stats);
-        verifyStats(stats, true, 0);
-    }
-
-    /**
      * Test that the verification passes when the timestamps are increasing.
      */
     public void testSequentialTimestamp() {
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventTimestampSynchronizationVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventTimestampSynchronizationVerification.java
index 7c4deb9..15ff5c03 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventTimestampSynchronizationVerification.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/EventTimestampSynchronizationVerification.java
@@ -43,7 +43,7 @@
     private final ArrayList<TestSensorEvent> mCollectedEvents = new ArrayList<TestSensorEvent>();
 
     private final long mMaximumSynchronizationErrorNs;
-    private final long mReportLatencyNs;
+    private final long mExpectedSyncLatencyNs;
 
     /**
      * Constructs an instance of {@link EventTimestampSynchronizationVerification}.
@@ -53,9 +53,9 @@
      */
     public EventTimestampSynchronizationVerification(
             long maximumSynchronizationErrorNs,
-            long reportLatencyNs) {
+            long expectedSyncLatencyNs) {
         mMaximumSynchronizationErrorNs = maximumSynchronizationErrorNs;
-        mReportLatencyNs = reportLatencyNs;
+        mExpectedSyncLatencyNs = expectedSyncLatencyNs;
     }
 
     /**
@@ -71,12 +71,25 @@
         long fifoMaxEventCount = environment.getSensor().getFifoMaxEventCount();
         int maximumExpectedSamplingPeriodUs = environment.getMaximumExpectedSamplingPeriodUs();
         if (fifoMaxEventCount > 0 && maximumExpectedSamplingPeriodUs != Integer.MAX_VALUE) {
-            long fifoBasedReportLatencyUs =
-                    fifoMaxEventCount * maximumExpectedSamplingPeriodUs;
-            reportLatencyUs = Math.min(reportLatencyUs, fifoBasedReportLatencyUs);
+            long fifoBasedReportLatencyUs = fifoMaxEventCount * maximumExpectedSamplingPeriodUs;
+            // If the device goes into suspend mode and the sensor is a non wake-up sensor, the
+            // FIFO will keep overwriting itself and the reportLatency will be equal to the time
+            // it takes to fill up the FIFO.
+            if (environment.isDeviceSuspendTest() && !environment.getSensor().isWakeUpSensor()) {
+                reportLatencyUs = fifoBasedReportLatencyUs;
+            } else {
+                // In this case the sensor under test is either a wake-up sensor OR it
+                // is a non wake-up sensor but the device does not go into suspend.
+                // So the expected delay of a sensor_event is the minimum of the
+                // fifoBasedReportLatencyUs and the requested latency by the application.
+                reportLatencyUs = Math.min(reportLatencyUs, fifoBasedReportLatencyUs);
+            }
         }
-        long reportLatencyNs = TimeUnit.MICROSECONDS.toNanos(reportLatencyUs);
-        return new EventTimestampSynchronizationVerification(DEFAULT_THRESHOLD_NS, reportLatencyNs);
+        // Add an additional filter delay which is a function of the samplingPeriod.
+        long filterDelayUs = (long)(2.5 * maximumExpectedSamplingPeriodUs);
+        long expectedSyncLatencyNs = TimeUnit.MICROSECONDS.toNanos(reportLatencyUs + filterDelayUs);
+        return new EventTimestampSynchronizationVerification(DEFAULT_THRESHOLD_NS,
+                                                              expectedSyncLatencyNs);
     }
 
     @Override
@@ -84,7 +97,6 @@
         StringBuilder errorMessageBuilder =
                 new StringBuilder(" event timestamp synchronization failures: ");
         List<IndexedEvent> failures = verifyTimestampSynchronization(errorMessageBuilder);
-
         int failuresCount = failures.size();
         stats.addValue(SensorStats.EVENT_TIME_SYNCHRONIZATION_COUNT_KEY, failuresCount);
         stats.addValue(
@@ -104,7 +116,7 @@
     public EventTimestampSynchronizationVerification clone() {
         return new EventTimestampSynchronizationVerification(
                 mMaximumSynchronizationErrorNs,
-                mReportLatencyNs);
+                mExpectedSyncLatencyNs);
     }
 
     /**
@@ -133,14 +145,17 @@
             long receivedTimestampNs = event.receivedTimestamp;
             long upperThresholdNs = receivedTimestampNs;
             long lowerThresholdNs = receivedTimestampNs - mMaximumSynchronizationErrorNs
-                    - mReportLatencyNs;
+                    - mExpectedSyncLatencyNs;
 
             if (eventTimestampNs < lowerThresholdNs || eventTimestampNs > upperThresholdNs) {
                 if (failures.size() < TRUNCATE_MESSAGE_LENGTH) {
                     builder.append("position=").append(i);
-                    builder.append(", timestamp=").append(eventTimestampNs).append("ns");
-                    builder.append(", expected=[").append(lowerThresholdNs);
-                    builder.append(", ").append(upperThresholdNs).append("]ns; ");
+                    builder.append(", timestamp=").append(String.format("%.2fms",
+                                nanosToMillis(eventTimestampNs)));
+                    builder.append(", expected=[").append(String.format("%.2fms",
+                                nanosToMillis(lowerThresholdNs)));
+                    builder.append(", ").append(String.format("%.2f]ms; ",
+                                nanosToMillis(upperThresholdNs)));
                 }
                 failures.add(new IndexedEvent(i, event));
             }
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/FifoLengthVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/FifoLengthVerification.java
new file mode 100644
index 0000000..09bbdc8
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/FifoLengthVerification.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2015 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.hardware.cts.helpers.sensorverification;
+
+import junit.framework.Assert;
+
+import android.hardware.Sensor;
+import android.hardware.cts.helpers.SensorCtsHelper;
+import android.hardware.cts.helpers.SensorStats;
+import android.hardware.cts.helpers.TestSensorEnvironment;
+import android.hardware.cts.helpers.TestSensorEvent;
+import android.util.Log;
+
+import java.util.LinkedList;
+
+/**
+ * A {@link ISensorVerification} which verifies that each batch of events has the FIFO
+ *  length within the 5% of the expected value.
+ */
+public class FifoLengthVerification extends AbstractSensorVerification {
+    public static final String PASSED_KEY = "fifo_length_passed";
+
+    private static double FIFO_LENGTH_TOLERANCE = 0.8;
+
+    private final int mExpectedFifoLength;
+
+    private int mIndex = 0;
+    private LinkedList<Long> mRecvdTimeStampDiffs = new LinkedList<>();
+    private long mPrevRecvdTimeStampMs = -1,  mExpectedReportLatencyUs;
+
+    /**
+     * Construct a {@link FifoLengthVerification}
+     *
+     * @param expectedLength the expected FIFO length for the batch.
+     */
+    public FifoLengthVerification(int expectedLength, long expectedReportLatencyUs) {
+        mExpectedFifoLength = expectedLength;
+        mExpectedReportLatencyUs = expectedReportLatencyUs;
+    }
+
+    /**
+     * Get the default {@link FifoLengthVerification}.
+     *
+     * @param environment the test environment
+     * @return the verification or null if the verification is not a continuous mode sensor.
+     */
+    public static FifoLengthVerification getDefault(
+            TestSensorEnvironment environment) {
+        if (environment.getSensor().getReportingMode() != Sensor.REPORTING_MODE_CONTINUOUS) {
+            return null;
+        }
+        long expectedReportLatencyUs = environment.getMaxReportLatencyUs();
+        long fifoMaxEventCount = environment.getSensor().getFifoMaxEventCount();
+        int maximumExpectedSamplingPeriodUs = environment.getMaximumExpectedSamplingPeriodUs();
+        if (fifoMaxEventCount > 0 && maximumExpectedSamplingPeriodUs != Integer.MAX_VALUE) {
+            long fifoBasedReportLatencyUs = fifoMaxEventCount * maximumExpectedSamplingPeriodUs;
+            // If the device goes into suspend mode and the sensor is a non wake-up sensor, the
+            // FIFO will keep overwriting itself and the reportLatency will be equal to the time
+            // it takes to fill up the FIFO.
+            if (environment.isDeviceSuspendTest() && !environment.getSensor().isWakeUpSensor()) {
+                expectedReportLatencyUs = fifoBasedReportLatencyUs;
+            } else {
+                // In this case the sensor under test is either a wake-up sensor OR it
+                // is a non wake-up sensor but the device does not go into suspend.
+                // So the expected delay of a sensor_event is the minimum of the
+                // fifoBasedReportLatencyUs and the requested latency by the application.
+                expectedReportLatencyUs = Math.min(expectedReportLatencyUs,
+                        fifoBasedReportLatencyUs);
+            }
+        }
+
+        return new FifoLengthVerification(environment.getSensor().getFifoMaxEventCount(),
+                expectedReportLatencyUs);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void verify(TestSensorEnvironment environment, SensorStats stats) {
+        if (mExpectedFifoLength <= 0) {
+            // the expected length isn't defined.
+            stats.addValue(PASSED_KEY, "skipped (no fifo length requirements)");
+            return;
+        }
+        int batchCount = 0;
+        boolean success, endofbatch = false;
+        long maxTsDiff = -1;
+        for (long timestampDiff : mRecvdTimeStampDiffs) {
+            if (maxTsDiff < timestampDiff) maxTsDiff = timestampDiff;
+            // Any event that arrives within before 0.5*expectedReportLatency is considered
+            // to be in the same batch of events, else it is considered as the beginning of a new
+            // batch.
+            if (timestampDiff < 0.5 * mExpectedReportLatencyUs/1000) {
+                batchCount++;
+            } else {
+                endofbatch = true;
+                break;
+            }
+        }
+        Log.v("SensorFifoLengthVerification", "batchCount =" +batchCount + " mExpected=" +
+                mExpectedFifoLength + " maxTsDiff=" + maxTsDiff + " expectedReportLatency=" +
+                mExpectedReportLatencyUs/1000 + " recvdEventCount=" + mRecvdTimeStampDiffs.size());
+        // Fifo length must be at least 80% of the advertized FIFO length.
+        success = endofbatch && (batchCount >= mExpectedFifoLength * FIFO_LENGTH_TOLERANCE);
+
+        stats.addValue(PASSED_KEY, success);
+        stats.addValue(SensorStats.EVENT_FIFO_LENGTH, batchCount);
+
+        if (!success) {
+            StringBuilder sb = new StringBuilder();
+            if (endofbatch) {
+                sb.append(String.format("Fifo length verification error: Fifo length found=%d," +
+                            "expected fifo length ~%d, maxReportLatencyObserved=%dms, " +
+                            "expectedMaxReportLantency=%dms",
+                            batchCount, mExpectedFifoLength, maxTsDiff,
+                            mExpectedReportLatencyUs/1000));
+            } else {
+               sb.append(String.format("End of batch NOT observed maxReportLatencyObserved=%dms,"
+                            + " expectedMaxReportLantency=%dms", maxTsDiff,
+                            mExpectedReportLatencyUs/1000));
+            }
+            Assert.fail(sb.toString());
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public FifoLengthVerification clone() {
+        return new FifoLengthVerification(mExpectedFifoLength, mExpectedReportLatencyUs);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void addSensorEventInternal(TestSensorEvent event) {
+        if (mPrevRecvdTimeStampMs == -1) {
+            mPrevRecvdTimeStampMs = (long)event.receivedTimestamp/(1000 * 1000);
+        } else {
+            long currRecvdTimeStampMs = (long) event.receivedTimestamp/(1000 * 1000);
+            mRecvdTimeStampDiffs.add(currRecvdTimeStampMs - mPrevRecvdTimeStampMs);
+            mPrevRecvdTimeStampMs = currRecvdTimeStampMs;
+        }
+        mIndex++;
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java
index 6633903..d246ec5 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java
@@ -18,6 +18,10 @@
 
 import junit.framework.Assert;
 
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+import android.util.Log;
 import android.hardware.Sensor;
 import android.hardware.cts.helpers.SensorCtsHelper;
 import android.hardware.cts.helpers.SensorStats;
@@ -39,6 +43,9 @@
 
     // sensorType: threshold (% of expected period)
     private static final SparseIntArray DEFAULTS = new SparseIntArray(12);
+    // Max allowed jitter (in percentage).
+    private static final int GRACE_FACTOR = 2;
+    private static final int THRESHOLD_PERCENT_FOR_HIFI_SENSORS = 1 * GRACE_FACTOR;
     static {
         // Use a method so that the @deprecation warning can be set for that method only
         setDefaults();
@@ -68,6 +75,11 @@
         if (threshold == -1) {
             return null;
         }
+        boolean hasHifiSensors = environment.getContext().getPackageManager().hasSystemFeature(
+                PackageManager.FEATURE_HIFI_SENSORS);
+        if (hasHifiSensors) {
+           threshold = THRESHOLD_PERCENT_FOR_HIFI_SENSORS;
+        }
         return new JitterVerification(threshold);
     }
 
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/StandardDeviationVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/StandardDeviationVerification.java
index f7c2c53..1e1c950 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/StandardDeviationVerification.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/StandardDeviationVerification.java
@@ -18,10 +18,13 @@
 
 import junit.framework.Assert;
 
+import android.content.Context;
+import android.content.pm.PackageManager;
 import android.hardware.Sensor;
 import android.hardware.cts.helpers.SensorStats;
 import android.hardware.cts.helpers.TestSensorEnvironment;
 import android.hardware.cts.helpers.TestSensorEvent;
+import android.util.Log;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -63,10 +66,32 @@
      */
     public static StandardDeviationVerification getDefault(TestSensorEnvironment environment) {
         int sensorType = environment.getSensor().getType();
+        float mGraceFactorAccelGyro = 2.0f;
+        float mGraceFactorMagPressure = 4.0f;
+        float mMaxBandWidth = (float) environment.getFrequencyHz();
+        float mAccelNoise = (float)(mGraceFactorAccelGyro * Math.sqrt(mMaxBandWidth) * (9.81 * 0.0004));
+        float mGyroNoise = (float)(mGraceFactorAccelGyro * Math.sqrt(mMaxBandWidth) * (Math.PI/180.0 * 0.014));
+        float mMagNoise = (float)((mGraceFactorMagPressure) * 0.5); // Allow extra grace for mag
+        float mPressureNoise = (float)(mGraceFactorMagPressure * 0.02 * (float)Math.sqrt(mMaxBandWidth)); // Allow extra grace for pressure
+
         if (!DEFAULTS.containsKey(sensorType)) {
             return null;
         }
 
+        boolean hasHifiSensors = environment.getContext().getPackageManager().hasSystemFeature(
+                PackageManager.FEATURE_HIFI_SENSORS);
+
+        if (hasHifiSensors) {
+
+            DEFAULTS.put(Sensor.TYPE_ACCELEROMETER, new float[]{mAccelNoise, mAccelNoise, mAccelNoise});
+            // Max gyro deviation: 0.014°/s/√Hz
+            DEFAULTS.put(Sensor.TYPE_GYROSCOPE,
+                    new float[]{mGyroNoise, mGyroNoise, mGyroNoise});
+            // Max magnetometer deviation: 0.1uT/√Hz
+            DEFAULTS.put(Sensor.TYPE_MAGNETIC_FIELD, new float[]{mMagNoise, mMagNoise, mMagNoise});
+            // Max pressure deviation: 2Pa/√Hz
+            DEFAULTS.put(Sensor.TYPE_PRESSURE, new float[]{mPressureNoise,mPressureNoise,mPressureNoise});
+        }
         return new StandardDeviationVerification(DEFAULTS.get(sensorType));
     }
 
@@ -107,9 +132,9 @@
             if (stdDevs[i] > mThreshold[i]) {
                 failed = true;
             }
-            stddevSb.append(String.format("%.2f", stdDevs[i]));
+            stddevSb.append(String.format("%.3f", stdDevs[i]));
             if (i != stdDevs.length - 1) stddevSb.append(", ");
-            expectedSb.append(String.format("<%.2f", mThreshold[i]));
+            expectedSb.append(String.format("<%.3f", mThreshold[i]));
             if (i != stdDevs.length - 1) expectedSb.append(", ");
         }
         if (stdDevs.length > 1) {
diff --git a/tests/tests/hardware/src/android/hardware/fingerprint/cts/FingerprintManagerTest.java b/tests/tests/hardware/src/android/hardware/fingerprint/cts/FingerprintManagerTest.java
new file mode 100644
index 0000000..95704b9
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/fingerprint/cts/FingerprintManagerTest.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2015 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.hardware.fingerprint.cts;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.hardware.fingerprint.FingerprintManager;
+import android.hardware.fingerprint.FingerprintManager.AuthenticationCallback;
+import android.os.CancellationSignal;
+import android.test.AndroidTestCase;
+
+/**
+ * Basic test cases for FingerprintManager
+ */
+public class FingerprintManagerTest extends AndroidTestCase {
+    private enum AuthState {
+        AUTH_UNKNOWN, AUTH_ERROR, AUTH_FAILED, AUTH_SUCCEEDED
+    }
+    private AuthState mAuthState = AuthState.AUTH_UNKNOWN;
+    private FingerprintManager mFingerprintManager;
+
+    boolean mHasFingerprintManager;
+    private AuthenticationCallback mAuthCallback = new AuthenticationCallback() {
+
+        @Override
+        public void onAuthenticationError(int errorCode, CharSequence errString) {
+        }
+
+        @Override
+        public void onAuthenticationFailed() {
+            mAuthState = AuthState.AUTH_SUCCEEDED;
+        }
+
+        @Override
+        public void onAuthenticationSucceeded(
+                android.hardware.fingerprint.FingerprintManager.AuthenticationResult result) {
+            mAuthState = AuthState.AUTH_SUCCEEDED;
+        }
+    };
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        mAuthState = AuthState.AUTH_UNKNOWN;
+
+        PackageManager pm = getContext().getPackageManager();
+        if (pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
+            mHasFingerprintManager = true;
+            mFingerprintManager = (FingerprintManager)
+                    getContext().getSystemService(Context.FINGERPRINT_SERVICE);
+        }
+    }
+
+    public void test_hasFingerprintHardware() {
+        if (!mHasFingerprintManager) {
+            return; // skip test if no fingerprint feature
+        }
+        assertTrue(mFingerprintManager.isHardwareDetected());
+    }
+
+    public void test_hasEnrolledFingerprints() {
+        if (!mHasFingerprintManager) {
+            return; // skip test if no fingerprint feature
+        }
+        boolean hasEnrolledFingerprints = mFingerprintManager.hasEnrolledFingerprints();
+        assertTrue(!hasEnrolledFingerprints);
+    }
+
+    public void test_authenticateNullCallback() {
+        if (!mHasFingerprintManager) {
+            return; // skip test if no fingerprint feature
+        }
+        boolean exceptionTaken = false;
+        CancellationSignal cancelAuth = new CancellationSignal();
+        try {
+            mFingerprintManager.authenticate(null, cancelAuth, 0, null, null);
+        } catch (IllegalArgumentException e) {
+            exceptionTaken = true;
+        } finally {
+            assertTrue(mAuthState == AuthState.AUTH_UNKNOWN);
+            assertTrue(exceptionTaken);
+            cancelAuth.cancel();
+        }
+    }
+
+    public void test_authenticate() {
+        if (!mHasFingerprintManager) {
+            return; // skip test if no fingerprint feature
+        }
+        boolean exceptionTaken = false;
+        CancellationSignal cancelAuth = new CancellationSignal();
+        try {
+            mFingerprintManager.authenticate(null, cancelAuth, 0, mAuthCallback, null);
+        } catch (IllegalArgumentException e) {
+            exceptionTaken = true;
+        } finally {
+            assertFalse(exceptionTaken);
+            // We should never get out of this state without user interaction
+            assertTrue(mAuthState == AuthState.AUTH_UNKNOWN);
+            cancelAuth.cancel();
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/multiprocess/ErrorLoggingService.java b/tests/tests/hardware/src/android/hardware/multiprocess/ErrorLoggingService.java
new file mode 100644
index 0000000..1b713ba
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/multiprocess/ErrorLoggingService.java
@@ -0,0 +1,611 @@
+/*
+ * Copyright (C) 2015 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.hardware.multiprocess;
+
+import android.app.Service;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.ConditionVariable;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.RemoteException;
+import android.util.Log;
+import android.util.Pair;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * Service for collecting error messages from other processes.
+ *
+ * <p />
+ * Used by CTS for multi-process error logging.
+ */
+public class ErrorLoggingService extends Service {
+    public static final String TAG = "ErrorLoggingService";
+
+    /**
+     * Receive all currently logged error strings in replyTo Messenger.
+     */
+    public static final int MSG_GET_LOG = 0;
+
+    /**
+     * Append a new error string to the log maintained in this service.
+     */
+    public static final int MSG_LOG_EVENT = 1;
+
+    /**
+     * Logged errors being reported in a replyTo Messenger by this service.
+     */
+    public static final int MSG_LOG_REPORT = 2;
+
+    /**
+     * A list of strings containing all error messages reported to this service.
+     */
+    private final ArrayList<LogEvent> mLog = new ArrayList<>();
+
+    /**
+     * A list of Messengers waiting for logs for any event.
+     */
+    private final ArrayList<Pair<Integer, Messenger>> mEventWaiters = new ArrayList<>();
+
+    private static final int DO_EVENT_FILTER = 1;
+    private static final String LOG_EVENT = "log_event";
+    private static final String LOG_EVENT_ARRAY = "log_event_array";
+
+
+    /**
+     * The messenger binder used by clients of this service to report/retrieve errors.
+     */
+    private final Messenger mMessenger = new Messenger(new MainHandler(mLog, mEventWaiters));
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        mLog.clear();
+    }
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        return mMessenger.getBinder();
+    }
+
+    /**
+     * Handler implementing the message interface for this service.
+     */
+    private static class MainHandler extends Handler {
+
+        ArrayList<LogEvent> mErrorLog;
+        ArrayList<Pair<Integer, Messenger>> mEventWaiters;
+
+        MainHandler(ArrayList<LogEvent> log, ArrayList<Pair<Integer, Messenger>> waiters) {
+            mErrorLog = log;
+            mEventWaiters = waiters;
+        }
+
+        private void sendMessages() {
+            if (mErrorLog.size() > 0) {
+                ListIterator<Pair<Integer, Messenger>> iter = mEventWaiters.listIterator();
+                boolean messagesHandled = false;
+                while (iter.hasNext()) {
+                    Pair<Integer, Messenger> elem = iter.next();
+                    for (LogEvent i : mErrorLog) {
+                        if (elem.first == null || elem.first == i.getEvent()) {
+                            Message m = Message.obtain(null, MSG_LOG_REPORT);
+                            Bundle b = m.getData();
+                            b.putParcelableArray(LOG_EVENT_ARRAY,
+                                    mErrorLog.toArray(new LogEvent[mErrorLog.size()]));
+                            m.setData(b);
+                            try {
+                                elem.second.send(m);
+                                messagesHandled = true;
+                            } catch (RemoteException e) {
+                                Log.e(TAG, "Could not report log message to remote, " +
+                                        "received exception from remote: " + e +
+                                        "\n  Original errors: " +
+                                        Arrays.toString(mErrorLog.toArray()));
+                            }
+                            iter.remove();
+                        }
+                    }
+                }
+                if (messagesHandled) {
+                    mErrorLog.clear();
+                }
+            }
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch(msg.what) {
+                case MSG_GET_LOG:
+                    if (msg.replyTo == null) {
+                        break;
+                    }
+
+                    if (msg.arg1 == DO_EVENT_FILTER) {
+                        mEventWaiters.add(new Pair<Integer, Messenger>(msg.arg2, msg.replyTo));
+                    } else {
+                        mEventWaiters.add(new Pair<Integer, Messenger>(null, msg.replyTo));
+                    }
+
+                    sendMessages();
+
+                    break;
+                case MSG_LOG_EVENT:
+                    Bundle b = msg.getData();
+                    b.setClassLoader(LogEvent.class.getClassLoader());
+                    LogEvent error = b.getParcelable(LOG_EVENT);
+                    mErrorLog.add(error);
+
+                    sendMessages();
+
+                    break;
+                default:
+                    Log.e(TAG, "Unknown message type: " + msg.what);
+                    super.handleMessage(msg);
+            }
+        }
+    }
+
+    /**
+     * Parcelable object to use with logged events.
+     */
+    public static class LogEvent implements Parcelable {
+
+        private final int mEvent;
+        private final String mLogText;
+
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        @Override
+        public void writeToParcel(Parcel out, int flags) {
+            out.writeInt(mEvent);
+            out.writeString(mLogText);
+        }
+
+        public int getEvent() {
+            return mEvent;
+        }
+
+        public String getLogText() {
+            return mLogText;
+        }
+
+        public static final Parcelable.Creator<LogEvent> CREATOR
+                = new Parcelable.Creator<LogEvent>() {
+
+            public LogEvent createFromParcel(Parcel in) {
+                return new LogEvent(in);
+            }
+
+            public LogEvent[] newArray(int size) {
+                return new LogEvent[size];
+            }
+        };
+
+        private LogEvent(Parcel in) {
+            mEvent = in.readInt();
+            mLogText = in.readString();
+        }
+
+        public LogEvent(int id, String msg) {
+            mEvent = id;
+            mLogText = msg;
+        }
+
+        @Override
+        public String toString() {
+            return "LogEvent{" +
+                    "Event=" + mEvent +
+                    ", LogText='" + mLogText + '\'' +
+                    '}';
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+
+            LogEvent logEvent = (LogEvent) o;
+
+            if (mEvent != logEvent.mEvent) return false;
+            if (mLogText != null ? !mLogText.equals(logEvent.mLogText) : logEvent.mLogText != null)
+                return false;
+
+            return true;
+        }
+
+        @Override
+        public int hashCode() {
+            int result = mEvent;
+            result = 31 * result + (mLogText != null ? mLogText.hashCode() : 0);
+            return result;
+        }
+    }
+
+    /**
+     * Implementation of Future to use when retrieving error messages from service.
+     *
+     * <p />
+     * To use this, either pass a {@link Runnable} or {@link Callable} in the constructor,
+     * or use the default constructor and set the result externally with {@link #setResult(Object)}.
+     */
+    private static class SettableFuture<T> extends FutureTask<T> {
+
+        public SettableFuture() {
+            super(new Callable<T>() {
+                @Override
+                public T call() throws Exception {
+                    throw new IllegalStateException(
+                            "Empty task, use #setResult instead of calling run.");
+                }
+            });
+        }
+
+        public SettableFuture(Callable<T> callable) {
+            super(callable);
+        }
+
+        public SettableFuture(Runnable runnable, T result) {
+            super(runnable, result);
+        }
+
+        public void setResult(T result) {
+            set(result);
+        }
+    }
+
+    /**
+     * Helper class for setting up and using a connection to {@link ErrorLoggingService}.
+     */
+    public static class ErrorServiceConnection implements AutoCloseable {
+
+        private Messenger mService = null;
+        private boolean mBind = false;
+        private final Object mLock = new Object();
+        private final Context mContext;
+        private final HandlerThread mReplyThread;
+        private ReplyHandler mReplyHandler;
+        private Messenger mReplyMessenger;
+
+        /**
+         * Construct a connection to the {@link ErrorLoggingService} in the given {@link Context}.
+         *
+         * @param context the {@link Context} to bind the service in.
+         */
+        public ErrorServiceConnection(final Context context) {
+            mContext = context;
+            mReplyThread = new HandlerThread("ErrorServiceConnection");
+            mReplyThread.start();
+            mReplyHandler = new ReplyHandler(mReplyThread.getLooper());
+            mReplyMessenger = new Messenger(mReplyHandler);
+        }
+
+        @Override
+        public void close() {
+            stop();
+            mReplyThread.quit();
+            synchronized (mLock) {
+                mService = null;
+                mBind = false;
+                mReplyHandler.cancelAll();
+            }
+        }
+
+        @Override
+        protected void finalize() throws Throwable {
+            close();
+            super.finalize();
+        }
+
+        private static final class ReplyHandler extends Handler {
+
+            private final LinkedBlockingQueue<SettableFuture<List<LogEvent>>> mFuturesQueue =
+                    new LinkedBlockingQueue<>();
+
+            private ReplyHandler(Looper looper) {
+                super(looper);
+            }
+
+            /**
+             * Cancel all pending futures for this handler.
+             */
+            public void cancelAll() {
+                List<SettableFuture<List<LogEvent>>> logFutures = new ArrayList<>();
+                mFuturesQueue.drainTo(logFutures);
+                for (SettableFuture<List<LogEvent>> i : logFutures) {
+                    i.cancel(true);
+                }
+            }
+
+            /**
+             * Cancel a given future, and remove from the pending futures for this handler.
+             *
+             * @param report future to remove.
+             */
+            public void cancel(SettableFuture<List<LogEvent>> report) {
+                mFuturesQueue.remove(report);
+                report.cancel(true);
+            }
+
+            /**
+             * Add future for the next received report from this service.
+             *
+             * @param report a future to get the next received event report from.
+             */
+            public void addFuture(SettableFuture<List<LogEvent>> report) {
+                if (!mFuturesQueue.offer(report)) {
+                    Log.e(TAG, "Could not request another error report, too many requests queued.");
+                }
+            }
+
+            @SuppressWarnings("unchecked")
+            @Override
+            public void handleMessage(Message msg) {
+                switch (msg.what) {
+                    case MSG_LOG_REPORT:
+                        SettableFuture<List<LogEvent>> task = mFuturesQueue.poll();
+                        if (task == null) break;
+                        Bundle b = msg.getData();
+                        b.setClassLoader(LogEvent.class.getClassLoader());
+                        Parcelable[] array = b.getParcelableArray(LOG_EVENT_ARRAY);
+                        LogEvent[] events = Arrays.copyOf(array, array.length, LogEvent[].class);
+                        List<LogEvent> res = Arrays.asList(events);
+                        task.setResult(res);
+                        break;
+                    default:
+                        Log.e(TAG, "Unknown message type: " + msg.what);
+                        super.handleMessage(msg);
+                }
+            }
+        }
+
+        private ServiceConnection mConnection = new ServiceConnection() {
+            @Override
+            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
+                Log.i(TAG, "Service connected.");
+                synchronized (mLock) {
+                    mService = new Messenger(iBinder);
+                    mBind = true;
+                    mLock.notifyAll();
+                }
+            }
+
+            @Override
+            public void onServiceDisconnected(ComponentName componentName) {
+                Log.i(TAG, "Service disconnected.");
+                synchronized (mLock) {
+                    mService = null;
+                    mBind = false;
+                    mReplyHandler.cancelAll();
+                }
+            }
+        };
+
+        private Messenger blockingGetBoundService() {
+            synchronized (mLock) {
+                if (!mBind) {
+                    mContext.bindService(new Intent(mContext, ErrorLoggingService.class), mConnection,
+                            Context.BIND_AUTO_CREATE);
+                    mBind = true;
+                }
+                try {
+                    while (mService == null && mBind) {
+                        mLock.wait();
+                    }
+                } catch (InterruptedException e) {
+                    Log.e(TAG, "Waiting for error service interrupted: " + e);
+                }
+                if (!mBind) {
+                    Log.w(TAG, "Could not get service, service disconnected.");
+                }
+                return mService;
+            }
+        }
+
+        private Messenger getBoundService() {
+            synchronized (mLock) {
+                if (!mBind) {
+                    mContext.bindService(new Intent(mContext, ErrorLoggingService.class), mConnection,
+                            Context.BIND_AUTO_CREATE);
+                    mBind = true;
+                }
+                return mService;
+            }
+        }
+
+        /**
+         * If the {@link ErrorLoggingService} is not yet bound, begin service connection attempt.
+         *
+         * <p />
+         * Note: This will not block.
+         */
+        public void start() {
+            synchronized (mLock) {
+                if (!mBind) {
+                    mContext.bindService(new Intent(mContext, ErrorLoggingService.class), mConnection,
+                            Context.BIND_AUTO_CREATE);
+                    mBind = true;
+                }
+            }
+        }
+
+        /**
+         * Unbind from the {@link ErrorLoggingService} if it has been bound.
+         *
+         * <p />
+         * Note: This will not block.
+         */
+        public void stop() {
+            synchronized (mLock) {
+                if (mBind) {
+                    mContext.unbindService(mConnection);
+                    mBind = false;
+                }
+            }
+        }
+
+        /**
+         * Send an logged event to the bound {@link ErrorLoggingService}.
+         *
+         * <p />
+         * If the service is not yet bound, this will bind the service and wait until it has been
+         * connected.
+         *
+         * <p />
+         * This is not safe to call from the UI thread, as this will deadlock with the looper used
+         * when connecting the service.
+         *
+         * @param id an int indicating the ID of this event.
+         * @param msg a {@link String} message to send.
+         */
+        public void log(final int id, final String msg) {
+            Messenger service = blockingGetBoundService();
+            Message m = Message.obtain(null, MSG_LOG_EVENT);
+            m.getData().putParcelable(LOG_EVENT, new LogEvent(id, msg));
+            try {
+                service.send(m);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Received exception while logging error: " + e);
+            }
+        }
+
+        /**
+         * Send an logged event to the bound {@link ErrorLoggingService} when it becomes available.
+         *
+         * <p />
+         * If the service is not yet bound, this will bind the service.
+         *
+         * @param id an int indicating the ID of this event.
+         * @param msg a {@link String} message to send.
+         */
+        public void logAsync(final int id, final String msg) {
+            AsyncTask.SERIAL_EXECUTOR.execute(new Runnable() {
+                @Override
+                public void run() {
+                    log(id, msg);
+                }
+            });
+        }
+
+        /**
+         * Retrieve all events logged in the {@link ErrorLoggingService}.
+         *
+         * <p />
+         * If the service is not yet bound, this will bind the service and wait until it has been
+         * connected.  Likewise, after the service has been bound, this method will block until
+         * the given timeout passes or an event is logged in the service.  Passing a negative
+         * timeout is equivalent to using an infinite timeout value.
+         *
+         * <p />
+         * This is not safe to call from the UI thread, as this will deadlock with the looper used
+         * when connecting the service.
+         *
+         * <p />
+         * Note: This method clears the events stored in the bound {@link ErrorLoggingService}.
+         *
+         * @param timeoutMs the number of milliseconds to wait for a logging event.
+         * @return a list of {@link String} error messages reported to the bound
+         *          {@link ErrorLoggingService} since the last call to getLog.
+         *
+         * @throws TimeoutException if the given timeout elapsed with no events logged.
+         */
+        public List<LogEvent> getLog(long timeoutMs) throws TimeoutException {
+            return retrieveLog(false, 0, timeoutMs);
+        }
+
+        /**
+         * Retrieve all events logged in the {@link ErrorLoggingService}.
+         *
+         * <p />
+         * If the service is not yet bound, this will bind the service and wait until it has been
+         * connected.  Likewise, after the service has been bound, this method will block until
+         * the given timeout passes or an event with the given event ID is logged in the service.
+         * Passing a negative timeout is equivalent to using an infinite timeout value.
+         *
+         * <p />
+         * This is not safe to call from the UI thread, as this will deadlock with the looper used
+         * when connecting the service.
+         *
+         * <p />
+         * Note: This method clears the events stored in the bound {@link ErrorLoggingService}.
+         *
+         * @param timeoutMs the number of milliseconds to wait for a logging event.
+         * @param event the ID of the event to wait for.
+         * @return a list of {@link String} error messages reported to the bound
+         *          {@link ErrorLoggingService} since the last call to getLog.
+         *
+         * @throws TimeoutException if the given timeout elapsed with no events of the given type
+         *          logged.
+         */
+        public List<LogEvent> getLog(long timeoutMs, int event) throws TimeoutException {
+            return retrieveLog(true, event, timeoutMs);
+        }
+
+        private List<LogEvent> retrieveLog(boolean hasEvent, int event, long timeout)
+                throws TimeoutException {
+            Messenger service = blockingGetBoundService();
+
+            SettableFuture<List<LogEvent>> task = new SettableFuture<>();
+
+            Message m = (hasEvent) ?
+                    Message.obtain(null, MSG_GET_LOG, DO_EVENT_FILTER, event, null) :
+                    Message.obtain(null, MSG_GET_LOG);
+            m.replyTo = mReplyMessenger;
+
+            synchronized(this) {
+                mReplyHandler.addFuture(task);
+                try {
+                    service.send(m);
+                } catch (RemoteException e) {
+                    Log.e(TAG, "Received exception while retrieving errors: " + e);
+                    return null;
+                }
+            }
+
+            List<LogEvent> res = null;
+            try {
+                res = (timeout < 0) ? task.get() : task.get(timeout, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException|ExecutionException e) {
+                Log.e(TAG, "Received exception while retrieving errors: " + e);
+            }
+            return res;
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/Camera1Activity.java b/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/Camera1Activity.java
new file mode 100644
index 0000000..5c27111
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/Camera1Activity.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2015 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.hardware.multiprocess.camera.cts;
+
+import android.app.Activity;
+import android.hardware.Camera;
+import android.hardware.multiprocess.ErrorLoggingService;
+import android.os.Bundle;
+import android.util.Log;
+
+/**
+ * Activity implementing basic access of the Camera1 API.
+ *
+ * <p />
+ * This will log all errors to {@link android.hardware.multiprocess.ErrorLoggingService}.
+ */
+public class Camera1Activity extends Activity {
+    private static final String TAG = "Camera1Activity";
+
+    Camera mCamera;
+    ErrorLoggingService.ErrorServiceConnection mErrorServiceConnection;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate called.");
+        super.onCreate(savedInstanceState);
+        mErrorServiceConnection = new ErrorLoggingService.ErrorServiceConnection(this);
+        mErrorServiceConnection.start();
+    }
+
+    @Override
+    protected void onResume() {
+        Log.i(TAG, "onResume called.");
+        super.onResume();
+        try {
+            mCamera = Camera.open();
+            if (mCamera == null) {
+                mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_ERROR, TAG +
+                        " no cameras available.");
+            }
+            mCamera.setErrorCallback(new Camera.ErrorCallback() {
+                @Override
+                public void onError(int i, Camera camera) {
+                    if (i == Camera.CAMERA_ERROR_EVICTED) {
+                        mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_EVICTED,
+                                TAG + " camera evicted");
+                        Log.e(TAG, "onError called with event " + i + ", camera evicted");
+                    } else {
+                        mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_ERROR,
+                                TAG + " camera experienced error: " + i);
+                        Log.e(TAG, "onError called with event " + i + ", camera error");
+                    }
+                }
+            });
+            mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_CONNECT,
+                    TAG + " camera connected");
+        } catch (RuntimeException e) {
+            mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_ERROR, TAG +
+                    " camera exception during connection: " + e);
+            Log.e(TAG, "Runtime error: " + e);
+        }
+    }
+
+    @Override
+    protected void onPause() {
+        Log.i(TAG, "onPause called.");
+        super.onPause();
+    }
+
+    @Override
+    protected void onDestroy() {
+        Log.i(TAG, "onDestroy called.");
+        super.onDestroy();
+        if (mErrorServiceConnection != null) {
+            mErrorServiceConnection.stop();
+            mErrorServiceConnection = null;
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/Camera2Activity.java b/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/Camera2Activity.java
new file mode 100644
index 0000000..2a78649
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/Camera2Activity.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2015 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.hardware.multiprocess.camera.cts;
+
+import android.app.Activity;
+import android.content.Context;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CameraManager;
+import android.hardware.multiprocess.ErrorLoggingService;
+import android.os.Bundle;
+import android.os.Handler;
+import android.util.Log;
+
+/**
+ * Activity implementing basic access of the Camera2 API.
+ *
+ * <p />
+ * This will log all errors to {@link android.hardware.multiprocess.ErrorLoggingService}.
+ */
+public class Camera2Activity extends Activity {
+    private static final String TAG = "Camera2Activity";
+
+    ErrorLoggingService.ErrorServiceConnection mErrorServiceConnection;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate called.");
+        super.onCreate(savedInstanceState);
+        mErrorServiceConnection = new ErrorLoggingService.ErrorServiceConnection(this);
+        mErrorServiceConnection.start();
+    }
+
+    @Override
+    protected void onPause() {
+        Log.i(TAG, "onPause called.");
+        super.onPause();
+    }
+
+    @Override
+    protected void onResume() {
+        Log.i(TAG, "onResume called.");
+        super.onResume();
+
+        try {
+            CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
+
+            if (manager == null) {
+                mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_ERROR, TAG +
+                        " could not connect camera service");
+                return;
+            }
+            String[] cameraIds = manager.getCameraIdList();
+
+            if (cameraIds == null || cameraIds.length == 0) {
+                mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_ERROR, TAG +
+                        " device reported having no cameras");
+                return;
+            }
+
+            manager.registerAvailabilityCallback(new CameraManager.AvailabilityCallback() {
+                @Override
+                public void onCameraAvailable(String cameraId) {
+                    super.onCameraAvailable(cameraId);
+                    mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_AVAILABLE,
+                            cameraId);
+                    Log.i(TAG, "Camera " + cameraId + " is available");
+                }
+
+                @Override
+                public void onCameraUnavailable(String cameraId) {
+                    super.onCameraUnavailable(cameraId);
+                    mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_UNAVAILABLE,
+                            cameraId);
+                    Log.i(TAG, "Camera " + cameraId + " is unavailable");
+                }
+            }, null);
+
+            final String chosen = cameraIds[0];
+
+            manager.openCamera(chosen, new CameraDevice.StateCallback() {
+                @Override
+                public void onOpened(CameraDevice cameraDevice) {
+                    mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_CONNECT,
+                            chosen);
+                    Log.i(TAG, "Camera " + chosen + " is opened");
+                }
+
+                @Override
+                public void onDisconnected(CameraDevice cameraDevice) {
+                    mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_EVICTED,
+                            chosen);
+                    Log.i(TAG, "Camera " + chosen + " is disconnected");
+                }
+
+                @Override
+                public void onError(CameraDevice cameraDevice, int i) {
+                    mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_ERROR, TAG +
+                            " Camera " + chosen + " experienced error " + i);
+                    Log.e(TAG, "Camera " + chosen + " onError called with error " + i);
+                }
+            }, null);
+        } catch (CameraAccessException e) {
+            mErrorServiceConnection.logAsync(TestConstants.EVENT_CAMERA_ERROR, TAG +
+                    " camera exception during connection: " + e);
+            Log.e(TAG, "Access exception: " + e);
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        Log.i(TAG, "onDestroy called.");
+        super.onDestroy();
+        if (mErrorServiceConnection != null) {
+            mErrorServiceConnection.stop();
+            mErrorServiceConnection = null;
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/CameraEvictionTest.java b/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/CameraEvictionTest.java
new file mode 100644
index 0000000..d1ca19a
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/CameraEvictionTest.java
@@ -0,0 +1,515 @@
+/*
+ * Copyright (C) 2015 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.hardware.multiprocess.camera.cts;
+
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.Intent;
+import android.hardware.Camera;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CameraManager;
+import android.hardware.cts.CameraCtsActivity;
+import android.hardware.multiprocess.ErrorLoggingService;
+import android.os.Handler;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.TimeoutException;
+
+import static org.mockito.Mockito.*;
+
+/**
+ * Tests for multi-process camera usage behavior.
+ */
+public class CameraEvictionTest extends ActivityInstrumentationTestCase2<CameraCtsActivity> {
+
+    public static final String TAG = "CameraEvictionTest";
+
+    private static final int OPEN_TIMEOUT = 2000; // Timeout for camera to open (ms).
+    private static final int SETUP_TIMEOUT = 5000; // Remote camera setup timeout (ms).
+    private static final int EVICTION_TIMEOUT = 1000; // Remote camera eviction timeout (ms).
+    private static final int WAIT_TIME = 2000; // Time to wait for process to launch (ms).
+    private static final int UI_TIMEOUT = 10000; // Time to wait for UI event before timeout (ms).
+    ErrorLoggingService.ErrorServiceConnection mErrorServiceConnection;
+
+    private ActivityManager mActivityManager;
+    private Context mContext;
+    private Camera mCamera;
+    private CameraDevice mCameraDevice;
+    private final Object mLock = new Object();
+    private boolean mCompleted = false;
+    private int mProcessPid = -1;
+
+    public CameraEvictionTest() {
+        super(CameraCtsActivity.class);
+    }
+
+    public static class StateCallbackImpl extends CameraDevice.StateCallback {
+        CameraDevice mCameraDevice;
+
+        public StateCallbackImpl() {
+            super();
+        }
+
+        @Override
+        public void onOpened(CameraDevice cameraDevice) {
+            synchronized(this) {
+                mCameraDevice = cameraDevice;
+            }
+            Log.i(TAG, "CameraDevice onOpened called for main CTS test process.");
+        }
+
+        @Override
+        public void onClosed(CameraDevice camera) {
+            super.onClosed(camera);
+            synchronized(this) {
+                mCameraDevice = null;
+            }
+            Log.i(TAG, "CameraDevice onClosed called for main CTS test process.");
+        }
+
+        @Override
+        public void onDisconnected(CameraDevice cameraDevice) {
+            synchronized(this) {
+                mCameraDevice = null;
+            }
+            Log.i(TAG, "CameraDevice onDisconnected called for main CTS test process.");
+
+        }
+
+        @Override
+        public void onError(CameraDevice cameraDevice, int i) {
+            Log.i(TAG, "CameraDevice onError called for main CTS test process with error " +
+                    "code: " + i);
+        }
+
+        public synchronized CameraDevice getCameraDevice() {
+            return mCameraDevice;
+        }
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        mCompleted = false;
+        getActivity();
+        mContext = getInstrumentation().getTargetContext();
+        System.setProperty("dexmaker.dexcache", mContext.getCacheDir().toString());
+        mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
+        mErrorServiceConnection = new ErrorLoggingService.ErrorServiceConnection(mContext);
+        mErrorServiceConnection.start();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mProcessPid != -1) {
+            android.os.Process.killProcess(mProcessPid);
+            mProcessPid = -1;
+        }
+        if (mErrorServiceConnection != null) {
+            mErrorServiceConnection.stop();
+            mErrorServiceConnection = null;
+        }
+        if (mCamera != null) {
+            mCamera.release();
+            mCamera = null;
+        }
+        if (mCameraDevice != null) {
+            mCameraDevice.close();
+            mCameraDevice = null;
+        }
+        mContext = null;
+        mActivityManager = null;
+        super.tearDown();
+    }
+
+    /**
+     * Test basic eviction scenarios for the Camera1 API.
+     */
+    public void testCamera1ActivityEviction() throws Throwable {
+
+        // Open a camera1 client in the main CTS process's activity
+        final Camera.ErrorCallback mockErrorCb1 = mock(Camera.ErrorCallback.class);
+        final boolean[] skip = {false};
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                // Open camera
+                mCamera = Camera.open();
+                if (mCamera == null) {
+                    skip[0] = true;
+                } else {
+                    mCamera.setErrorCallback(mockErrorCb1);
+                }
+                notifyFromUI();
+            }
+        });
+        waitForUI();
+
+        if (skip[0]) {
+            Log.i(TAG, "Skipping testCamera1ActivityEviction, device has no cameras.");
+            return;
+        }
+
+        verifyZeroInteractions(mockErrorCb1);
+
+        startRemoteProcess(Camera1Activity.class, "camera1ActivityProcess");
+
+        // Make sure camera was setup correctly in remote activity
+        List<ErrorLoggingService.LogEvent> events = null;
+        try {
+            events = mErrorServiceConnection.getLog(SETUP_TIMEOUT,
+                    TestConstants.EVENT_CAMERA_CONNECT);
+        } finally {
+            if (events != null) assertOnly(TestConstants.EVENT_CAMERA_CONNECT, events);
+        }
+
+        Thread.sleep(WAIT_TIME);
+
+        // Ensure UI thread has a chance to process callbacks.
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                Log.i("CTS", "Did something on UI thread.");
+                notifyFromUI();
+            }
+        });
+        waitForUI();
+
+        // Make sure we received correct callback in error listener, and nothing else
+        verify(mockErrorCb1, only()).onError(eq(Camera.CAMERA_ERROR_EVICTED), isA(Camera.class));
+        mCamera = null;
+
+        // Try to open the camera again (even though other TOP process holds the camera).
+        final boolean[] pass = {false};
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                // Open camera
+                try {
+                    mCamera = Camera.open();
+                } catch (RuntimeException e) {
+                    pass[0] = true;
+                }
+                notifyFromUI();
+            }
+        });
+        waitForUI();
+
+        assertTrue("Did not receive exception when opening camera while camera is held by a" +
+                " higher priority client process.", pass[0]);
+
+        // Verify that attempting to open the camera didn't cause anything weird to happen in the
+        // other process.
+        List<ErrorLoggingService.LogEvent> eventList2 = null;
+        boolean timeoutExceptionHit = false;
+        try {
+            eventList2 = mErrorServiceConnection.getLog(EVICTION_TIMEOUT);
+        } catch (TimeoutException e) {
+            timeoutExceptionHit = true;
+        }
+
+        assertNone("Remote camera service received invalid events: ", eventList2);
+        assertTrue("Remote camera service exited early", timeoutExceptionHit);
+        android.os.Process.killProcess(mProcessPid);
+        mProcessPid = -1;
+        forceCtsActivityToTop();
+    }
+
+    /**
+     * Test basic eviction scenarios for the Camera2 API.
+     */
+    public void testBasicCamera2ActivityEviction() throws Throwable {
+        CameraManager manager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
+        assertNotNull(manager);
+        String[] cameraIds = manager.getCameraIdList();
+
+        if (cameraIds.length == 0) {
+            Log.i(TAG, "Skipping testBasicCamera2ActivityEviction, device has no cameras.");
+            return;
+        }
+
+        assertTrue(mContext.getMainLooper() != null);
+
+        // Setup camera manager
+        String chosenCamera = cameraIds[0];
+        Handler cameraHandler = new Handler(mContext.getMainLooper());
+        final CameraManager.AvailabilityCallback mockAvailCb =
+                mock(CameraManager.AvailabilityCallback.class);
+
+        manager.registerAvailabilityCallback(mockAvailCb, cameraHandler);
+
+        Thread.sleep(WAIT_TIME);
+
+        verify(mockAvailCb, times(1)).onCameraAvailable(chosenCamera);
+        verify(mockAvailCb, never()).onCameraUnavailable(chosenCamera);
+
+        // Setup camera device
+        final CameraDevice.StateCallback spyStateCb = spy(new StateCallbackImpl());
+        manager.openCamera(chosenCamera, spyStateCb, cameraHandler);
+
+        verify(spyStateCb, timeout(OPEN_TIMEOUT).times(1)).onOpened(any(CameraDevice.class));
+        verify(spyStateCb, never()).onClosed(any(CameraDevice.class));
+        verify(spyStateCb, never()).onDisconnected(any(CameraDevice.class));
+        verify(spyStateCb, never()).onError(any(CameraDevice.class), anyInt());
+
+        // Open camera from remote process
+        startRemoteProcess(Camera2Activity.class, "camera2ActivityProcess");
+
+        // Verify that the remote camera was opened correctly
+        List<ErrorLoggingService.LogEvent> allEvents  = mErrorServiceConnection.getLog(SETUP_TIMEOUT,
+                TestConstants.EVENT_CAMERA_CONNECT);
+        assertNotNull("Camera device not setup in remote process!", allEvents);
+
+        // Filter out relevant events for other camera devices
+        ArrayList<ErrorLoggingService.LogEvent> events = new ArrayList<>();
+        for (ErrorLoggingService.LogEvent e : allEvents) {
+            int eventTag = e.getEvent();
+            if (eventTag == TestConstants.EVENT_CAMERA_UNAVAILABLE ||
+                    eventTag == TestConstants.EVENT_CAMERA_CONNECT ||
+                    eventTag == TestConstants.EVENT_CAMERA_AVAILABLE) {
+                if (!Objects.equals(e.getLogText(), chosenCamera)) {
+                    continue;
+                }
+            }
+            events.add(e);
+        }
+        int[] eventList = new int[events.size()];
+        int eventIdx = 0;
+        for (ErrorLoggingService.LogEvent e : events) {
+            eventList[eventIdx++] = e.getEvent();
+        }
+        String[] actualEvents = TestConstants.convertToStringArray(eventList);
+        String[] expectedEvents = new String[] {TestConstants.EVENT_CAMERA_UNAVAILABLE_STR,
+                TestConstants.EVENT_CAMERA_CONNECT_STR};
+        String[] ignoredEvents = new String[] { TestConstants.EVENT_CAMERA_AVAILABLE_STR,
+                TestConstants.EVENT_CAMERA_UNAVAILABLE_STR };
+        assertOrderedEvents(actualEvents, expectedEvents, ignoredEvents);
+
+        // Verify that the local camera was evicted properly
+        verify(spyStateCb, times(1)).onDisconnected(any(CameraDevice.class));
+        verify(spyStateCb, never()).onClosed(any(CameraDevice.class));
+        verify(spyStateCb, never()).onError(any(CameraDevice.class), anyInt());
+        verify(spyStateCb, times(1)).onOpened(any(CameraDevice.class));
+
+        // Verify that we can no longer open the camera, as it is held by a higher priority process
+        boolean openException = false;
+        try {
+            manager.openCamera(chosenCamera, spyStateCb, cameraHandler);
+        } catch(CameraAccessException e) {
+            assertTrue("Received incorrect camera exception when opening camera: " + e,
+                    e.getReason() == CameraAccessException.CAMERA_IN_USE);
+            openException = true;
+        }
+
+        assertTrue("Didn't receive exception when trying to open camera held by higher priority " +
+                "process.", openException);
+
+        // Verify that attempting to open the camera didn't cause anything weird to happen in the
+        // other process.
+        List<ErrorLoggingService.LogEvent> eventList2 = null;
+        boolean timeoutExceptionHit = false;
+        try {
+            eventList2 = mErrorServiceConnection.getLog(EVICTION_TIMEOUT);
+        } catch (TimeoutException e) {
+            timeoutExceptionHit = true;
+        }
+
+        assertNone("Remote camera service received invalid events: ", eventList2);
+        assertTrue("Remote camera service exited early", timeoutExceptionHit);
+        android.os.Process.killProcess(mProcessPid);
+        mProcessPid = -1;
+        forceCtsActivityToTop();
+    }
+
+    /**
+     * Ensure the CTS activity becomes foreground again instead of launcher.
+     */
+    private void forceCtsActivityToTop() throws InterruptedException {
+        Thread.sleep(WAIT_TIME);
+        Activity a = getActivity();
+        Intent activityIntent = new Intent(a, CameraCtsActivity.class);
+        activityIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+        a.startActivity(activityIntent);
+        Thread.sleep(WAIT_TIME);
+    }
+
+    /**
+     * Block until UI thread calls {@link #notifyFromUI()}.
+     * @throws InterruptedException
+     */
+    private void waitForUI() throws InterruptedException {
+        synchronized(mLock) {
+            if (mCompleted) return;
+            while (!mCompleted) {
+                mLock.wait();
+            }
+            mCompleted = false;
+        }
+    }
+
+    /**
+     * Wake up any threads waiting in calls to {@link #waitForUI()}.
+     */
+    private void notifyFromUI() {
+        synchronized (mLock) {
+            mCompleted = true;
+            mLock.notifyAll();
+        }
+    }
+
+    /**
+     * Return the PID for the process with the given name in the given list of process info.
+     *
+     * @param processName the name of the process who's PID to return.
+     * @param list a list of {@link ActivityManager.RunningAppProcessInfo} to check.
+     * @return the PID of the given process, or -1 if it was not included in the list.
+     */
+    private static int getPid(String processName,
+                              List<ActivityManager.RunningAppProcessInfo> list) {
+        for (ActivityManager.RunningAppProcessInfo rai : list) {
+            if (processName.equals(rai.processName))
+                return rai.pid;
+        }
+        return -1;
+    }
+
+    /**
+     * Start an activity of the given class running in a remote process with the given name.
+     *
+     * @param klass the class of the {@link android.app.Activity} to start.
+     * @param processName the remote activity name.
+     * @throws InterruptedException
+     */
+    public void startRemoteProcess(java.lang.Class<?> klass, String processName)
+            throws InterruptedException {
+        // Ensure no running activity process with same name
+        Activity a = getActivity();
+        String cameraActivityName = a.getPackageName() + ":" + processName;
+        List<ActivityManager.RunningAppProcessInfo> list =
+                mActivityManager.getRunningAppProcesses();
+        assertEquals(-1, getPid(cameraActivityName, list));
+
+        // Start activity in a new top foreground process
+        Intent activityIntent = new Intent(a, klass);
+        a.startActivity(activityIntent);
+        Thread.sleep(WAIT_TIME);
+
+        // Fail if activity isn't running
+        list = mActivityManager.getRunningAppProcesses();
+        mProcessPid = getPid(cameraActivityName, list);
+        assertTrue(-1 != mProcessPid);
+    }
+
+    /**
+     * Assert that there is only one event of the given type in the event list.
+     *
+     * @param event event type to check for.
+     * @param events {@link List} of events.
+     */
+    public static void assertOnly(int event, List<ErrorLoggingService.LogEvent> events) {
+        assertTrue("Remote camera activity never received event: " + event, events != null);
+        for (ErrorLoggingService.LogEvent e : events) {
+            assertFalse("Remote camera activity received invalid event (" + e +
+                    ") while waiting for event: " + event,
+                    e.getEvent() < 0 || e.getEvent() != event);
+        }
+        assertTrue("Remote camera activity never received event: " + event, events.size() >= 1);
+        assertTrue("Remote camera activity received too many " + event + " events, received: " +
+                events.size(), events.size() == 1);
+    }
+
+    /**
+     * Assert there were no logEvents in the given list.
+     *
+     * @param msg message to show on assertion failure.
+     * @param events {@link List} of events.
+     */
+    public static void assertNone(String msg, List<ErrorLoggingService.LogEvent> events) {
+        if (events == null) return;
+        StringBuilder builder = new StringBuilder(msg + "\n");
+        for (ErrorLoggingService.LogEvent e : events) {
+            builder.append(e).append("\n");
+        }
+        assertTrue(builder.toString(), events.isEmpty());
+    }
+
+    /**
+     * Assert array is null or empty.
+     *
+     * @param array array to check.
+     */
+    public static <T> void assertNotEmpty(T[] array) {
+        assertNotNull(array);
+        assertFalse("Array is empty: " + Arrays.toString(array), array.length == 0);
+    }
+
+    /**
+     * Given an 'actual' array of objects, check that the objects given in the 'expected'
+     * array are also present in the 'actual' array in the same order.  Objects in the 'actual'
+     * array that are not in the 'expected' array are skipped and ignored if they are given
+     * in the 'ignored' array, otherwise this assertion will fail.
+     *
+     * @param actual the ordered array of objects to check.
+     * @param expected the ordered array of expected objects.
+     * @param ignored the array of objects that will be ignored if present in actual,
+     *                but not in expected (or are out of order).
+     * @param <T>
+     */
+    public static <T> void assertOrderedEvents(T[] actual, T[] expected, T[] ignored) {
+        assertNotNull(actual);
+        assertNotNull(expected);
+        assertNotNull(ignored);
+
+        int expIndex = 0;
+        int index = 0;
+        for (T i : actual) {
+            // If explicitly expected, move to next
+            if (expIndex < expected.length && Objects.equals(i, expected[expIndex])) {
+                expIndex++;
+                continue;
+            }
+
+            // Fail if not ignored
+            boolean canIgnore = false;
+            for (T j : ignored) {
+                if (Objects.equals(i, j)) {
+                    canIgnore = true;
+                    break;
+                }
+
+            }
+
+            // Fail if not ignored.
+            assertTrue("Event at index " + index + " in actual array " +
+                    Arrays.toString(actual) + " was unexpected: expected array was " +
+                    Arrays.toString(expected) + ", ignored array was: " +
+                    Arrays.toString(ignored), canIgnore);
+            index++;
+        }
+        assertTrue("Only had " + expIndex + " of " + expected.length +
+                " expected objects in array " + Arrays.toString(actual) + ", expected was " +
+                Arrays.toString(expected), expIndex == expected.length);
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/TestConstants.java b/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/TestConstants.java
new file mode 100644
index 0000000..2805e02
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/multiprocess/camera/cts/TestConstants.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2015 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.hardware.multiprocess.camera.cts;
+
+/**
+ * Constants used throughout the multi-process unit tests.
+ */
+public class TestConstants {
+
+    public static final int EVENT_CAMERA_ERROR = -1;
+    public static final int EVENT_CAMERA_CONNECT = 1;
+    public static final int EVENT_CAMERA_EVICTED = 2;
+    public static final int EVENT_CAMERA_AVAILABLE = 3;
+    public static final int EVENT_CAMERA_UNAVAILABLE = 4;
+
+    public static final String EVENT_CAMERA_ERROR_STR = "error";
+    public static final String EVENT_CAMERA_CONNECT_STR = "connect";
+    public static final String EVENT_CAMERA_EVICTED_STR = "evicted";
+    public static final String EVENT_CAMERA_AVAILABLE_STR = "available";
+    public static final String EVENT_CAMERA_UNAVAILABLE_STR = "unavailable";
+
+    public static final String EVENT_CAMERA_UNKNOWN_STR = "unknown";
+
+    /**
+     * Convert the given error code to a string.
+     *
+     * @param err error code from {@link TestConstants}.
+     * @return string for this error code.
+     */
+    public static String errToStr(int err) {
+        switch(err) {
+            case EVENT_CAMERA_ERROR:
+                return EVENT_CAMERA_ERROR_STR;
+            case EVENT_CAMERA_CONNECT:
+                return EVENT_CAMERA_CONNECT_STR;
+            case EVENT_CAMERA_EVICTED:
+                return EVENT_CAMERA_EVICTED_STR;
+            case EVENT_CAMERA_AVAILABLE:
+                return EVENT_CAMERA_AVAILABLE_STR;
+            case EVENT_CAMERA_UNAVAILABLE:
+                return EVENT_CAMERA_UNAVAILABLE_STR;
+            default:
+                return EVENT_CAMERA_UNKNOWN_STR + " " + err;
+        }
+    }
+
+    /**
+     * Convert the given array of error codes to an array of strings.
+     *
+     * @param err array of error codes from {@link TestConstants}.
+     * @return string array for the given error codes.
+     */
+    public static String[] convertToStringArray(int[] err) {
+        if (err == null) return null;
+        String[] ret = new String[err.length];
+        for (int i = 0; i < err.length; i++) {
+            ret[i] = errToStr(err[i]);
+        }
+        return ret;
+    }
+
+}
diff --git a/tests/tests/keystore/Android.mk b/tests/tests/keystore/Android.mk
index 0f2cd03..eaf5389 100644
--- a/tests/tests/keystore/Android.mk
+++ b/tests/tests/keystore/Android.mk
@@ -16,7 +16,7 @@
 
 include $(CLEAR_VARS)
 
-LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_TAGS := tests
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner core-tests-support
 
diff --git a/tests/tests/keystore/assets/nist_cavp_aes_kat.zip b/tests/tests/keystore/assets/nist_cavp_aes_kat.zip
new file mode 100644
index 0000000..90083c8
--- /dev/null
+++ b/tests/tests/keystore/assets/nist_cavp_aes_kat.zip
Binary files differ
diff --git a/tests/tests/keystore/res/raw/ec_key1_cert.der b/tests/tests/keystore/res/raw/ec_key1_cert.der
new file mode 100644
index 0000000..77293bb
--- /dev/null
+++ b/tests/tests/keystore/res/raw/ec_key1_cert.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/ec_key1_pkcs8.der b/tests/tests/keystore/res/raw/ec_key1_pkcs8.der
new file mode 100644
index 0000000..0400ad6
--- /dev/null
+++ b/tests/tests/keystore/res/raw/ec_key1_pkcs8.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/ec_key2_cert.der b/tests/tests/keystore/res/raw/ec_key2_cert.der
new file mode 100644
index 0000000..576d8f9
--- /dev/null
+++ b/tests/tests/keystore/res/raw/ec_key2_cert.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/ec_key2_pkcs8.der b/tests/tests/keystore/res/raw/ec_key2_pkcs8.der
new file mode 100644
index 0000000..26f4f05
--- /dev/null
+++ b/tests/tests/keystore/res/raw/ec_key2_pkcs8.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/ec_key3_secp224r1_cert.der b/tests/tests/keystore/res/raw/ec_key3_secp224r1_cert.der
new file mode 100644
index 0000000..454edb3
--- /dev/null
+++ b/tests/tests/keystore/res/raw/ec_key3_secp224r1_cert.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/ec_key3_secp224r1_pkcs8.der b/tests/tests/keystore/res/raw/ec_key3_secp224r1_pkcs8.der
new file mode 100644
index 0000000..2b89ca3
--- /dev/null
+++ b/tests/tests/keystore/res/raw/ec_key3_secp224r1_pkcs8.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/ec_key4_secp256r1_cert.der b/tests/tests/keystore/res/raw/ec_key4_secp256r1_cert.der
new file mode 100644
index 0000000..1641a65
--- /dev/null
+++ b/tests/tests/keystore/res/raw/ec_key4_secp256r1_cert.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/ec_key4_secp256r1_pkcs8.der b/tests/tests/keystore/res/raw/ec_key4_secp256r1_pkcs8.der
new file mode 100644
index 0000000..2631a6e
--- /dev/null
+++ b/tests/tests/keystore/res/raw/ec_key4_secp256r1_pkcs8.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/ec_key5_secp384r1_cert.der b/tests/tests/keystore/res/raw/ec_key5_secp384r1_cert.der
new file mode 100644
index 0000000..cf19be8
--- /dev/null
+++ b/tests/tests/keystore/res/raw/ec_key5_secp384r1_cert.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/ec_key5_secp384r1_pkcs8.der b/tests/tests/keystore/res/raw/ec_key5_secp384r1_pkcs8.der
new file mode 100644
index 0000000..f864258
--- /dev/null
+++ b/tests/tests/keystore/res/raw/ec_key5_secp384r1_pkcs8.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/ec_key6_secp521r1_cert.der b/tests/tests/keystore/res/raw/ec_key6_secp521r1_cert.der
new file mode 100644
index 0000000..cc5d973
--- /dev/null
+++ b/tests/tests/keystore/res/raw/ec_key6_secp521r1_cert.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/ec_key6_secp521r1_pkcs8.der b/tests/tests/keystore/res/raw/ec_key6_secp521r1_pkcs8.der
new file mode 100644
index 0000000..d21815f
--- /dev/null
+++ b/tests/tests/keystore/res/raw/ec_key6_secp521r1_pkcs8.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/rsa_key1_cert.der b/tests/tests/keystore/res/raw/rsa_key1_cert.der
new file mode 100644
index 0000000..09e5a30
--- /dev/null
+++ b/tests/tests/keystore/res/raw/rsa_key1_cert.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/rsa_key1_pkcs8.der b/tests/tests/keystore/res/raw/rsa_key1_pkcs8.der
new file mode 100644
index 0000000..b398ab1
--- /dev/null
+++ b/tests/tests/keystore/res/raw/rsa_key1_pkcs8.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/rsa_key2_cert.der b/tests/tests/keystore/res/raw/rsa_key2_cert.der
new file mode 100644
index 0000000..b00495c
--- /dev/null
+++ b/tests/tests/keystore/res/raw/rsa_key2_cert.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/rsa_key2_pkcs8.der b/tests/tests/keystore/res/raw/rsa_key2_pkcs8.der
new file mode 100644
index 0000000..c687f7d
--- /dev/null
+++ b/tests/tests/keystore/res/raw/rsa_key2_pkcs8.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/rsa_key3_1024_cert.der b/tests/tests/keystore/res/raw/rsa_key3_1024_cert.der
new file mode 100644
index 0000000..36f6820
--- /dev/null
+++ b/tests/tests/keystore/res/raw/rsa_key3_1024_cert.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/rsa_key3_1024_pkcs8.der b/tests/tests/keystore/res/raw/rsa_key3_1024_pkcs8.der
new file mode 100644
index 0000000..3b70b0d
--- /dev/null
+++ b/tests/tests/keystore/res/raw/rsa_key3_1024_pkcs8.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/rsa_key4_4096_cert.der b/tests/tests/keystore/res/raw/rsa_key4_4096_cert.der
new file mode 100644
index 0000000..24d9a52
--- /dev/null
+++ b/tests/tests/keystore/res/raw/rsa_key4_4096_cert.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/rsa_key4_4096_pkcs8.der b/tests/tests/keystore/res/raw/rsa_key4_4096_pkcs8.der
new file mode 100644
index 0000000..d3d08ca
--- /dev/null
+++ b/tests/tests/keystore/res/raw/rsa_key4_4096_pkcs8.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/rsa_key5_512_cert.der b/tests/tests/keystore/res/raw/rsa_key5_512_cert.der
new file mode 100644
index 0000000..56079dc
--- /dev/null
+++ b/tests/tests/keystore/res/raw/rsa_key5_512_cert.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/rsa_key5_512_pkcs8.der b/tests/tests/keystore/res/raw/rsa_key5_512_pkcs8.der
new file mode 100644
index 0000000..8f723d3
--- /dev/null
+++ b/tests/tests/keystore/res/raw/rsa_key5_512_pkcs8.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/rsa_key6_768_cert.der b/tests/tests/keystore/res/raw/rsa_key6_768_cert.der
new file mode 100644
index 0000000..8afc59b
--- /dev/null
+++ b/tests/tests/keystore/res/raw/rsa_key6_768_cert.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/rsa_key6_768_pkcs8.der b/tests/tests/keystore/res/raw/rsa_key6_768_pkcs8.der
new file mode 100644
index 0000000..7d25fe7
--- /dev/null
+++ b/tests/tests/keystore/res/raw/rsa_key6_768_pkcs8.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/rsa_key7_3072_cert.der b/tests/tests/keystore/res/raw/rsa_key7_3072_cert.der
new file mode 100644
index 0000000..414c35d
--- /dev/null
+++ b/tests/tests/keystore/res/raw/rsa_key7_3072_cert.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/rsa_key7_3072_pksc8.der b/tests/tests/keystore/res/raw/rsa_key7_3072_pksc8.der
new file mode 100644
index 0000000..32788d2
--- /dev/null
+++ b/tests/tests/keystore/res/raw/rsa_key7_3072_pksc8.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/rsa_key8_2048_cert.der b/tests/tests/keystore/res/raw/rsa_key8_2048_cert.der
new file mode 100644
index 0000000..bbbd81b
--- /dev/null
+++ b/tests/tests/keystore/res/raw/rsa_key8_2048_cert.der
Binary files differ
diff --git a/tests/tests/keystore/res/raw/rsa_key8_2048_pkcs8.der b/tests/tests/keystore/res/raw/rsa_key8_2048_pkcs8.der
new file mode 100644
index 0000000..94211ad
--- /dev/null
+++ b/tests/tests/keystore/res/raw/rsa_key8_2048_pkcs8.der
Binary files differ
diff --git a/tests/tests/keystore/src/android/keystore/cts/AES128CBCNoPaddingCipherTest.java b/tests/tests/keystore/src/android/keystore/cts/AES128CBCNoPaddingCipherTest.java
new file mode 100644
index 0000000..e56049c
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AES128CBCNoPaddingCipherTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+public class AES128CBCNoPaddingCipherTest extends AESCBCNoPaddingCipherTestBase {
+
+    private static final byte[] KAT_KEY = HexEncoding.decode("7E3D723C09A9852B24F584F9D916F6A8");
+    private static final byte[] KAT_IV = HexEncoding.decode("944AE274D983892EADE422274858A96A");
+    private static final byte[] KAT_PLAINTEXT = HexEncoding.decode(
+            "044E15899A080AADEB6778F64323B64D2CBCBADB338DF93B9AC459D4F41029809FFF37081C22EF278F896A"
+            + "B213A2A631");
+    private static final byte[] KAT_CIPHERTEXT = HexEncoding.decode(
+            "B419293FCBD686F2913D1CF947E510D42FAFEDE5593C98AFD6AEE272596A56FE42C22F2A5E3B6A02BA9D8D"
+            + "0DE1E9A810");
+
+    @Override
+    protected byte[] getKatKey() {
+        return KAT_KEY.clone();
+    }
+
+    @Override
+    protected byte[] getKatIv() {
+        return KAT_IV.clone();
+    }
+
+    @Override
+    protected byte[] getKatPlaintext() {
+        return KAT_PLAINTEXT.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertext() {
+        return KAT_CIPHERTEXT.clone();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AES128CBCPKCS7PaddingCipherTest.java b/tests/tests/keystore/src/android/keystore/cts/AES128CBCPKCS7PaddingCipherTest.java
new file mode 100644
index 0000000..d8254c1
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AES128CBCPKCS7PaddingCipherTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+public class AES128CBCPKCS7PaddingCipherTest extends AESCBCPKCS7PaddingCipherTestBase {
+
+    private static final byte[] KAT_KEY = HexEncoding.decode("F16E698472578E919D92806262C5169F");
+    private static final byte[] KAT_IV = HexEncoding.decode("EF743540F8421ACA128A3247521F3E7D");
+    private static final byte[] KAT_PLAINTEXT = HexEncoding.decode(
+            "5BEBF33569D90BF5E853814E12E7C7AA5758013F755773E29F4A25EC26EEB765F7F2DC251F7DC62AEFCA1E"
+            + "8A5A11A1DCD44F0BD8FB593A5AE3");
+    private static final byte[] KAT_CIPHERTEXT = HexEncoding.decode(
+            "3197CF6DB9466188B5FED375329324EE7D6092A8C0E41DFAF49E3724271427896D56A6243C0D59D6639722"
+            + "AF93CD53449BDDABF9C5F153EBDBFED9ED98C8CC37");
+
+    @Override
+    protected byte[] getKatKey() {
+        return KAT_KEY.clone();
+    }
+
+    @Override
+    protected byte[] getKatIv() {
+        return KAT_IV.clone();
+    }
+
+    @Override
+    protected byte[] getKatPlaintext() {
+        return KAT_PLAINTEXT.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertext() {
+        return KAT_CIPHERTEXT.clone();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AES128CTRNoPaddingCipherTest.java b/tests/tests/keystore/src/android/keystore/cts/AES128CTRNoPaddingCipherTest.java
new file mode 100644
index 0000000..7ffca13
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AES128CTRNoPaddingCipherTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+public class AES128CTRNoPaddingCipherTest extends AESCTRNoPaddingCipherTestBase {
+
+    private static final byte[] KAT_KEY = HexEncoding.decode("4713a7b2f93efe809b42ecc45213ef9f");
+    private static final byte[] KAT_IV = HexEncoding.decode("ebfa19b0ebf3d57feabd4c4bd04bea01");
+    private static final byte[] KAT_PLAINTEXT = HexEncoding.decode(
+            "6d2c07e1fc86f99c6e2a8f6567828b4262a9c23d0f3ed8ab32482283c79796f0adba1bcd3736084996452a"
+            +"917fae98005aebe61f9e91c3");
+    private static final byte[] KAT_CIPHERTEXT = HexEncoding.decode(
+            "345deb1d67b95e600e05cad4c32ec381aadb3e2c1ec7e0fb956dc38e6860cf0553535566e1b12fa9f87d29"
+            + "266ca26df427233df035df28");
+
+    @Override
+    protected byte[] getKatKey() {
+        return KAT_KEY.clone();
+    }
+
+    @Override
+    protected byte[] getKatIv() {
+        return KAT_IV.clone();
+    }
+
+    @Override
+    protected byte[] getKatPlaintext() {
+        return KAT_PLAINTEXT.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertext() {
+        return KAT_CIPHERTEXT.clone();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AES128ECBNoPaddingCipherTest.java b/tests/tests/keystore/src/android/keystore/cts/AES128ECBNoPaddingCipherTest.java
new file mode 100644
index 0000000..100700c
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AES128ECBNoPaddingCipherTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+public class AES128ECBNoPaddingCipherTest extends AESECBNoPaddingCipherTestBase {
+
+    private static final byte[] KAT_KEY = HexEncoding.decode("7DA2467F068854B3CB36E5C333A16619");
+    private static final byte[] KAT_PLAINTEXT = HexEncoding.decode(
+            "9A07C9575AD9CE209DF9F3953965CEBE8208587C7AE575A1904BF25048946D7B6168A9A27BCE554BEA94EF"
+            + "26E6C742A0");
+    private static final byte[] KAT_CIPHERTEXT = HexEncoding.decode(
+            "8C47E49420FC92AC4CA2C601BC3F8AC31D01B260B7B849F2B8EEDFFFED8F36C31CBDA0D22F95C9C2A48C34"
+            + "7E8C77AC82");
+
+    @Override
+    protected byte[] getKatKey() {
+        return KAT_KEY.clone();
+    }
+
+    @Override
+    protected byte[] getKatIv() {
+        return null;
+    }
+
+    @Override
+    protected byte[] getKatPlaintext() {
+        return KAT_PLAINTEXT.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertext() {
+        return KAT_CIPHERTEXT.clone();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AES128ECBPKCS7PaddingCipherTest.java b/tests/tests/keystore/src/android/keystore/cts/AES128ECBPKCS7PaddingCipherTest.java
new file mode 100644
index 0000000..c834ddf
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AES128ECBPKCS7PaddingCipherTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+public class AES128ECBPKCS7PaddingCipherTest extends AESECBPKCS7PaddingCipherTestBase {
+
+    private static final byte[] KAT_KEY = HexEncoding.decode("C3BE04BCCB3D99B85290F113FE7AF194");
+    private static final byte[] KAT_PLAINTEXT = HexEncoding.decode(
+            "348C213FD8DF3F990C20C5ACBF07B34B6264AE245784A5A6176DBFB1C2E7DD27E52CC92B8EEE40614F05B5"
+            + "07B355F6354A2705BD86");
+    private static final byte[] KAT_CIPHERTEXT = HexEncoding.decode(
+            "07CD05C41FEDEDDC5DB4B3E35E676153184A119AA4DFDDC290616F1FA600931DE6BEA9BDB90D1D73389994"
+            + "6F8C8E5C0C4383F99F5D88E27F3EBC0C6E52759ED3");
+
+    @Override
+    protected byte[] getKatKey() {
+        return KAT_KEY.clone();
+    }
+
+    @Override
+    protected byte[] getKatIv() {
+        return null;
+    }
+
+    @Override
+    protected byte[] getKatPlaintext() {
+        return KAT_PLAINTEXT.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertext() {
+        return KAT_CIPHERTEXT.clone();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AES128GCMNoPaddingCipherTest.java b/tests/tests/keystore/src/android/keystore/cts/AES128GCMNoPaddingCipherTest.java
new file mode 100644
index 0000000..ed9c2b1
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AES128GCMNoPaddingCipherTest.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+public class AES128GCMNoPaddingCipherTest extends AESGCMNoPaddingCipherTestBase {
+
+    private static final byte[] KAT_KEY = HexEncoding.decode("ba76354f0aed6e8d91f45c4ff5a062db");
+    private static final byte[] KAT_IV = HexEncoding.decode("b79437ae08ff355d7d8a4d0f");
+    private static final byte[] KAT_PLAINTEXT = HexEncoding.decode(
+            "6d7596a8fd56ceaec61de7940984b7736fec44f572afc3c8952e4dc6541e2bc6a702c440a37610989543f6"
+            + "3fedb047ca2173bc18581944");
+    private static final byte[] KAT_CIPHERTEXT_WITHOUT_AAD = HexEncoding.decode(
+            "b3f6799e8f9326f2df1e80fcd2cb16d78c9dc7cc14bb677862dc6c639b3a6338d24b312d3989e5920b5dbf"
+            + "c976765efbfe57bb385940a7a43bdf05bddae3c9d6a2fbbdfcc0cba0");
+    private static final byte[] KAT_AAD = HexEncoding.decode(
+            "d3bc7458914f45d56d5fcfbb2eeff2dcc0e620c1229d90904e98930ea71aa43b6898f846f3244d");
+    private static final byte[] KAT_CIPHERTEXT_WITH_AAD = HexEncoding.decode(
+            "b3f6799e8f9326f2df1e80fcd2cb16d78c9dc7cc14bb677862dc6c639b3a6338d24b312d3989e5920b5dbf"
+            + "c976765efbfe57bb385940a70c106264d81506f8daf9cd6a1c70988c");
+
+    @Override
+    protected byte[] getKatKey() {
+        return KAT_KEY.clone();
+    }
+
+    @Override
+    protected byte[] getKatIv() {
+        return KAT_IV.clone();
+    }
+
+    @Override
+    protected byte[] getKatPlaintext() {
+        return KAT_PLAINTEXT.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertext() {
+        return KAT_CIPHERTEXT_WITHOUT_AAD.clone();
+    }
+
+    @Override
+    protected byte[] getKatAad() {
+        return KAT_AAD.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertextWhenKatAadPresent() {
+        return KAT_CIPHERTEXT_WITH_AAD.clone();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AES192CBCNoPaddingCipherTest.java b/tests/tests/keystore/src/android/keystore/cts/AES192CBCNoPaddingCipherTest.java
new file mode 100644
index 0000000..f49c7c3
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AES192CBCNoPaddingCipherTest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+public class AES192CBCNoPaddingCipherTest extends AESCBCNoPaddingCipherTestBase {
+
+    private static final byte[] KAT_KEY = HexEncoding.decode(
+            "be8cc4e25cce46e5d55725e2391f7d3cf59ed60062f5a43b");
+    private static final byte[] KAT_IV = HexEncoding.decode("80a199aab0eee77e7762ddf3b3a32f40");
+    private static final byte[] KAT_PLAINTEXT = HexEncoding.decode(
+            "064f9200e0df37d4711af4a69d11addf9e1c345d9d8195f9f1f715019ce96a167f2497c994bd496eb80bfb"
+            + "2ba2c9d5af");
+    private static final byte[] KAT_CIPHERTEXT = HexEncoding.decode(
+            "859b90becaa85e95a71e104efbd7a3b723bcbf4eb39865544a05d9e90b6fe572c134552f3a138e726fbe49"
+            + "3b3a839598");
+
+    @Override
+    protected byte[] getKatKey() {
+        return KAT_KEY.clone();
+    }
+
+    @Override
+    protected byte[] getKatIv() {
+        return KAT_IV.clone();
+    }
+
+    @Override
+    protected byte[] getKatPlaintext() {
+        return KAT_PLAINTEXT.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertext() {
+        return KAT_CIPHERTEXT.clone();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AES192CBCPKCS7PaddingCipherTest.java b/tests/tests/keystore/src/android/keystore/cts/AES192CBCPKCS7PaddingCipherTest.java
new file mode 100644
index 0000000..b17befc
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AES192CBCPKCS7PaddingCipherTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+public class AES192CBCPKCS7PaddingCipherTest extends AESCBCPKCS7PaddingCipherTestBase {
+
+    private static final byte[] KAT_KEY = HexEncoding.decode(
+            "68969215ec41e4df7d23de0e806f458f52aff492bd7c5263");
+    private static final byte[] KAT_IV = HexEncoding.decode("e61d13dfbf0533289f0e7950209da418");
+    private static final byte[] KAT_PLAINTEXT = HexEncoding.decode(
+            "8d4c1cac27511ee2d82409a7f378e7e402b0eb189c1eaa5c506eb72a9074b170");
+    private static final byte[] KAT_CIPHERTEXT = HexEncoding.decode(
+            "e70bcd62c595dc1b2b8c197bb91a7447e1be2cbcf3fdc69e7e991faf0f57cf4e3884138ff403a41fd99818"
+            + "708ada301c");
+
+    @Override
+    protected byte[] getKatKey() {
+        return KAT_KEY.clone();
+    }
+
+    @Override
+    protected byte[] getKatIv() {
+        return KAT_IV.clone();
+    }
+
+    @Override
+    protected byte[] getKatPlaintext() {
+        return KAT_PLAINTEXT.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertext() {
+        return KAT_CIPHERTEXT.clone();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AES192CTRNoPaddingCipherTest.java b/tests/tests/keystore/src/android/keystore/cts/AES192CTRNoPaddingCipherTest.java
new file mode 100644
index 0000000..d4a4143
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AES192CTRNoPaddingCipherTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+public class AES192CTRNoPaddingCipherTest extends AESCTRNoPaddingCipherTestBase {
+
+    private static final byte[] KAT_KEY = HexEncoding.decode(
+            "5e2036e790d38815c90beb67a1c9e5aa0e167ef082927317");
+    private static final byte[] KAT_IV = HexEncoding.decode("df0694959b89054156962d68a226965c");
+    private static final byte[] KAT_PLAINTEXT = HexEncoding.decode(
+            "6ed2781c99e03e45314d6019932220c2c98130c53f9f67ad10ac519adf50e928091e09cdbbd3b42b");
+    private static final byte[] KAT_CIPHERTEXT = HexEncoding.decode(
+            "e427b6666502e05b82d0b20ae50e862b1936d71266fc49178ac984e71571f22ae0f90f0c19f42b4a");
+
+    @Override
+    protected byte[] getKatKey() {
+        return KAT_KEY.clone();
+    }
+
+    @Override
+    protected byte[] getKatIv() {
+        return KAT_IV.clone();
+    }
+
+    @Override
+    protected byte[] getKatPlaintext() {
+        return KAT_PLAINTEXT.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertext() {
+        return KAT_CIPHERTEXT.clone();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AES192ECBNoPaddingCipherTest.java b/tests/tests/keystore/src/android/keystore/cts/AES192ECBNoPaddingCipherTest.java
new file mode 100644
index 0000000..0557d03
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AES192ECBNoPaddingCipherTest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+public class AES192ECBNoPaddingCipherTest extends AESECBNoPaddingCipherTestBase {
+
+    private static final byte[] KAT_KEY = HexEncoding.decode(
+            "3cab83fb338ba985fbfe74c5e9d2e900adb570b1d67faf92");
+    private static final byte[] KAT_PLAINTEXT = HexEncoding.decode(
+            "2cc64c335a13fb838f3c6aad0a6b47297ca90bb886ddb059200f0b41740c44ab");
+    private static final byte[] KAT_CIPHERTEXT = HexEncoding.decode(
+            "9c5c825328f5ee0aa24947e374d3f9165f484b39dd808c790d7a129648102453");
+
+    @Override
+    protected byte[] getKatKey() {
+        return KAT_KEY.clone();
+    }
+
+    @Override
+    protected byte[] getKatIv() {
+        return null;
+    }
+
+    @Override
+    protected byte[] getKatPlaintext() {
+        return KAT_PLAINTEXT.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertext() {
+        return KAT_CIPHERTEXT.clone();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AES192ECBPKCS7PaddingCipherTest.java b/tests/tests/keystore/src/android/keystore/cts/AES192ECBPKCS7PaddingCipherTest.java
new file mode 100644
index 0000000..1cf193c
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AES192ECBPKCS7PaddingCipherTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+public class AES192ECBPKCS7PaddingCipherTest extends AESECBPKCS7PaddingCipherTestBase {
+
+    private static final byte[] KAT_KEY = HexEncoding.decode(
+            "d57f4e5446f736c16476ec4db5decc7b1bf3936e4f7e4618");
+    private static final byte[] KAT_PLAINTEXT = HexEncoding.decode(
+            "b115777f1ee7a43a07daa6401e59c46b7a98213a8747eabfbe3ca4ec93524de2c7");
+    private static final byte[] KAT_CIPHERTEXT = HexEncoding.decode(
+            "1e92cd20da08bb5fa174a7a69879d4fc25a155e6af06d75b26c5b450d273c8bb7e3a889dd4a9589098b44a"
+            + "cf1056e7aa");
+
+    @Override
+    protected byte[] getKatKey() {
+        return KAT_KEY.clone();
+    }
+
+    @Override
+    protected byte[] getKatIv() {
+        return null;
+    }
+
+    @Override
+    protected byte[] getKatPlaintext() {
+        return KAT_PLAINTEXT.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertext() {
+        return KAT_CIPHERTEXT.clone();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AES192GCMNoPaddingCipherTest.java b/tests/tests/keystore/src/android/keystore/cts/AES192GCMNoPaddingCipherTest.java
new file mode 100644
index 0000000..66b37d3
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AES192GCMNoPaddingCipherTest.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+public class AES192GCMNoPaddingCipherTest extends AESGCMNoPaddingCipherTestBase {
+
+    private static final byte[] KAT_KEY = HexEncoding.decode(
+            "21339fc1d011abca65d50ce2365230603fd47d07e8830f6e");
+    private static final byte[] KAT_IV = HexEncoding.decode("d5fb1469a8d81dd75286a418");
+    private static final byte[] KAT_PLAINTEXT = HexEncoding.decode(
+            "cf776dedf53a828d51a0073db3ef0dd1ee19e2e9e243ce97e95841bb9ad4e3ff52");
+    private static final byte[] KAT_CIPHERTEXT_WITHOUT_AAD = HexEncoding.decode(
+            "3a0d48278111d3296bc663df8a5dbeb2474ea47fd85b608f8d9375d9dcf7de1413ad70fb0e1970669095ad"
+            + "77ebb5974ae8");
+    private static final byte[] KAT_AAD = HexEncoding.decode(
+            "04cdc1d840c17dcfccf78b3d792463740ce0bfdc167b98a632e144cafe9663");
+    private static final byte[] KAT_CIPHERTEXT_WITH_AAD = HexEncoding.decode(
+            "3a0d48278111d3296bc663df8a5dbeb2474ea47fd85b608f8d9375d9dcf7de141380718b9f6c023fb091c7"
+            + "6891a91683e2");
+
+    @Override
+    protected byte[] getKatKey() {
+        return KAT_KEY.clone();
+    }
+
+    @Override
+    protected byte[] getKatIv() {
+        return KAT_IV.clone();
+    }
+
+    @Override
+    protected byte[] getKatPlaintext() {
+        return KAT_PLAINTEXT.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertext() {
+        return KAT_CIPHERTEXT_WITHOUT_AAD.clone();
+    }
+
+    @Override
+    protected byte[] getKatAad() {
+        return KAT_AAD.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertextWhenKatAadPresent() {
+        return KAT_CIPHERTEXT_WITH_AAD.clone();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AES256CBCNoPaddingCipherTest.java b/tests/tests/keystore/src/android/keystore/cts/AES256CBCNoPaddingCipherTest.java
new file mode 100644
index 0000000..b6620ef
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AES256CBCNoPaddingCipherTest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+public class AES256CBCNoPaddingCipherTest extends AESCBCNoPaddingCipherTestBase {
+
+    private static final byte[] KAT_KEY = HexEncoding.decode(
+            "dd2f20dc6b98c100bac919120ff95eb5d96003f8229987b283a1e777b0cd5c30");
+    private static final byte[] KAT_IV = HexEncoding.decode("23b4d85239fb90db93b07a981e90a170");
+    private static final byte[] KAT_PLAINTEXT = HexEncoding.decode(
+            "2fbe5d46dca5cea433e550d8b291740ab9551c2a2d37680d7fb7b993225f58494cb53caca353e4b637ba05"
+            + "687be20f8d");
+    private static final byte[] KAT_CIPHERTEXT = HexEncoding.decode(
+            "5aba24fc316936c8369061ee8fe463e4faed04288e204456626b988c0e376b6047da1e4fd7c4e1cf265609"
+            + "7f75ae8685");
+
+    @Override
+    protected byte[] getKatKey() {
+        return KAT_KEY.clone();
+    }
+
+    @Override
+    protected byte[] getKatIv() {
+        return KAT_IV.clone();
+    }
+
+    @Override
+    protected byte[] getKatPlaintext() {
+        return KAT_PLAINTEXT.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertext() {
+        return KAT_CIPHERTEXT.clone();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AES256CBCPKCS7PaddingCipherTest.java b/tests/tests/keystore/src/android/keystore/cts/AES256CBCPKCS7PaddingCipherTest.java
new file mode 100644
index 0000000..6613463
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AES256CBCPKCS7PaddingCipherTest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+public class AES256CBCPKCS7PaddingCipherTest extends AESCBCPKCS7PaddingCipherTestBase {
+
+    private static final byte[] KAT_KEY = HexEncoding.decode(
+            "03ab2510520f5cfebfab0a17a7f8324c9634911f6fc59e586f85346bb38ac88a");
+    private static final byte[] KAT_IV = HexEncoding.decode("9af96967195bb0184f129beffa8241ae");
+    private static final byte[] KAT_PLAINTEXT = HexEncoding.decode(
+            "2d6944653ac14988a772a2730b7c5bfa99a21732ae26f40cdc5b3a2874c7942545a82b73c48078b9dae622"
+            + "61c65909");
+    private static final byte[] KAT_CIPHERTEXT = HexEncoding.decode(
+            "26b308f7e1668b55705a79c8b3ad10e244655f705f027f390a5c34e4536f519403a71987b95124073d69f2"
+            + "a3cb95b0ab");
+
+    @Override
+    protected byte[] getKatKey() {
+        return KAT_KEY.clone();
+    }
+
+    @Override
+    protected byte[] getKatIv() {
+        return KAT_IV.clone();
+    }
+
+    @Override
+    protected byte[] getKatPlaintext() {
+        return KAT_PLAINTEXT.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertext() {
+        return KAT_CIPHERTEXT.clone();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AES256CTRNoPaddingCipherTest.java b/tests/tests/keystore/src/android/keystore/cts/AES256CTRNoPaddingCipherTest.java
new file mode 100644
index 0000000..bdcff41
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AES256CTRNoPaddingCipherTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+public class AES256CTRNoPaddingCipherTest extends AESCTRNoPaddingCipherTestBase {
+
+    private static final byte[] KAT_KEY = HexEncoding.decode(
+            "928b380a8fed4b4b4cfeb56e0c66a4cb0f9ff58d61ac68bcfd0e3fbd910a684f");
+    private static final byte[] KAT_IV = HexEncoding.decode("0b678a5249e6eeda461dfb4776b6c58e");
+    private static final byte[] KAT_PLAINTEXT = HexEncoding.decode(
+            "f358de57543b297e997cba46fb9100553d6abd65377e55b9aac3006400ead11f6db3c884");
+    private static final byte[] KAT_CIPHERTEXT = HexEncoding.decode(
+            "a07a35fbd1776ad81462e1935f542337add60962bf289249476817b6ddd532a7be30d4c3");
+
+    @Override
+    protected byte[] getKatKey() {
+        return KAT_KEY.clone();
+    }
+
+    @Override
+    protected byte[] getKatIv() {
+        return KAT_IV.clone();
+    }
+
+    @Override
+    protected byte[] getKatPlaintext() {
+        return KAT_PLAINTEXT.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertext() {
+        return KAT_CIPHERTEXT.clone();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AES256ECBNoPaddingCipherTest.java b/tests/tests/keystore/src/android/keystore/cts/AES256ECBNoPaddingCipherTest.java
new file mode 100644
index 0000000..847a767
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AES256ECBNoPaddingCipherTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+public class AES256ECBNoPaddingCipherTest extends AESECBNoPaddingCipherTestBase {
+
+    private static final byte[] KAT_KEY = HexEncoding.decode(
+            "fa4622d9cf6485075daedd33d2c4fffdf859e2edb7f7df4f04603f7e647fae90");
+    private static final byte[] KAT_PLAINTEXT = HexEncoding.decode(
+            "96ccabbe0c68970d8cdee2b30ab43c2d61cc50ee68271e77571e72478d713a31a476d6806b8116089c6ec5"
+            + "0bb543200f");
+    private static final byte[] KAT_CIPHERTEXT = HexEncoding.decode(
+            "0e81839e9dfbfe3b503d619e676abe5ac80fac3f245d8f09b9134b1b32a67dc83e377faf246288931136be"
+            + "f2a07c0be4");
+
+    @Override
+    protected byte[] getKatKey() {
+        return KAT_KEY.clone();
+    }
+
+    @Override
+    protected byte[] getKatIv() {
+        return null;
+    }
+
+    @Override
+    protected byte[] getKatPlaintext() {
+        return KAT_PLAINTEXT.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertext() {
+        return KAT_CIPHERTEXT.clone();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AES256ECBPKCS7PaddingCipherTest.java b/tests/tests/keystore/src/android/keystore/cts/AES256ECBPKCS7PaddingCipherTest.java
new file mode 100644
index 0000000..0faffe9
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AES256ECBPKCS7PaddingCipherTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+public class AES256ECBPKCS7PaddingCipherTest extends AESECBPKCS7PaddingCipherTestBase {
+
+    private static final byte[] KAT_KEY = HexEncoding.decode(
+            "bf3f07c68467fead0ca8e2754500ab514258abf02eb7e615a493bcaaa45d5ee1");
+    private static final byte[] KAT_PLAINTEXT = HexEncoding.decode(
+            "af0757e49018dad628f16998628a407db5f28291bef3bc2e4d8a5a31fb238e6f");
+    private static final byte[] KAT_CIPHERTEXT = HexEncoding.decode(
+            "21ec3011074bf1ef140643d47130326c5e183f61237c69bc77551ca207d71fc2b90cfac6c8d2d125e5cd9f"
+            + "f353dee0df");
+
+    @Override
+    protected byte[] getKatKey() {
+        return KAT_KEY.clone();
+    }
+
+    @Override
+    protected byte[] getKatIv() {
+        return null;
+    }
+
+    @Override
+    protected byte[] getKatPlaintext() {
+        return KAT_PLAINTEXT.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertext() {
+        return KAT_CIPHERTEXT.clone();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AES256GCMNoPaddingCipherTest.java b/tests/tests/keystore/src/android/keystore/cts/AES256GCMNoPaddingCipherTest.java
new file mode 100644
index 0000000..971e610
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AES256GCMNoPaddingCipherTest.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+public class AES256GCMNoPaddingCipherTest extends AESGCMNoPaddingCipherTestBase {
+
+    private static final byte[] KAT_KEY = HexEncoding.decode(
+            "7972140d831eedac75d5ea515c9a4c3bb124499a90b5f317ac1a685e88fae395");
+    private static final byte[] KAT_IV = HexEncoding.decode("a66c5252808d823dd4151fed");
+    private static final byte[] KAT_PLAINTEXT = HexEncoding.decode(
+            "c2b9dabf3a55adaa94e8c0d1e77a84a3435aee23b2c3c4abb587b09a9c2afbf0");
+    private static final byte[] KAT_CIPHERTEXT_WITHOUT_AAD = HexEncoding.decode(
+            "a960619314657b2afb96b93bebb372bffd09e19d53e351f17d1ba2611f9dc33c9c92d563e8fd381254ac26"
+            + "2aa2a4ea0d");
+    private static final byte[] KAT_AAD = HexEncoding.decode(
+            "3727229db7a3ccda7283f628fb8a3cdf093ea1f4e8bd1bc40a830fc6df6fb0e249845dd7d449b2bc3b5ba4"
+            + "2258fb92c7");
+    private static final byte[] KAT_CIPHERTEXT_WITH_AAD = HexEncoding.decode(
+            "a960619314657b2afb96b93bebb372bffd09e19d53e351f17d1ba2611f9dc33c1501caa6cca0a281f42bc3"
+            + "10d1e4488f");
+
+    @Override
+    protected byte[] getKatKey() {
+        return KAT_KEY.clone();
+    }
+
+    @Override
+    protected byte[] getKatIv() {
+        return KAT_IV.clone();
+    }
+
+    @Override
+    protected byte[] getKatPlaintext() {
+        return KAT_PLAINTEXT.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertext() {
+        return KAT_CIPHERTEXT_WITHOUT_AAD.clone();
+    }
+
+    @Override
+    protected byte[] getKatAad() {
+        return KAT_AAD.clone();
+    }
+
+    @Override
+    protected byte[] getKatCiphertextWhenKatAadPresent() {
+        return KAT_CIPHERTEXT_WITH_AAD.clone();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AESCBCCipherTestBase.java b/tests/tests/keystore/src/android/keystore/cts/AESCBCCipherTestBase.java
new file mode 100644
index 0000000..8f1aed69
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AESCBCCipherTestBase.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+import java.security.AlgorithmParameters;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.InvalidParameterSpecException;
+
+import javax.crypto.spec.IvParameterSpec;
+
+abstract class AESCBCCipherTestBase extends BlockCipherTestBase {
+
+    @Override
+    protected boolean isStreamCipher() {
+        return false;
+    }
+
+    @Override
+    protected boolean isAuthenticatedCipher() {
+        return false;
+    }
+
+    @Override
+    protected int getKatAuthenticationTagLengthBytes() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected int getBlockSize() {
+        return 16;
+    }
+
+    @Override
+    protected AlgorithmParameterSpec getKatAlgorithmParameterSpec() {
+        return new IvParameterSpec(getKatIv());
+    }
+
+    @Override
+    protected byte[] getIv(AlgorithmParameters params) throws InvalidParameterSpecException {
+        IvParameterSpec spec = params.getParameterSpec(IvParameterSpec.class);
+        return spec.getIV();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AESCBCNoPaddingCipherTestBase.java b/tests/tests/keystore/src/android/keystore/cts/AESCBCNoPaddingCipherTestBase.java
new file mode 100644
index 0000000..8e51d04
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AESCBCNoPaddingCipherTestBase.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+abstract class AESCBCNoPaddingCipherTestBase extends AESCBCCipherTestBase {
+
+    @Override
+    protected String getTransformation() {
+        return "AES/CBC/NoPadding";
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AESCBCPKS7PaddingCipherTestBase.java b/tests/tests/keystore/src/android/keystore/cts/AESCBCPKS7PaddingCipherTestBase.java
new file mode 100644
index 0000000..bd2c5bd
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AESCBCPKS7PaddingCipherTestBase.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+abstract class AESCBCPKCS7PaddingCipherTestBase extends AESCBCCipherTestBase {
+
+    @Override
+    protected String getTransformation() {
+        return "AES/CBC/PKCS7Padding";
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AESCTRCipherTestBase.java b/tests/tests/keystore/src/android/keystore/cts/AESCTRCipherTestBase.java
new file mode 100644
index 0000000..8bf6ac1
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AESCTRCipherTestBase.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+import java.security.AlgorithmParameters;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.InvalidParameterSpecException;
+
+import javax.crypto.spec.IvParameterSpec;
+
+abstract class AESCTRCipherTestBase extends BlockCipherTestBase {
+
+    @Override
+    protected boolean isStreamCipher() {
+        return true;
+    }
+
+    @Override
+    protected boolean isAuthenticatedCipher() {
+        return false;
+    }
+
+    @Override
+    protected int getKatAuthenticationTagLengthBytes() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected int getBlockSize() {
+        return 16;
+    }
+
+    @Override
+    protected AlgorithmParameterSpec getKatAlgorithmParameterSpec() {
+        return new IvParameterSpec(getKatIv());
+    }
+
+    @Override
+    protected byte[] getIv(AlgorithmParameters params) throws InvalidParameterSpecException {
+        IvParameterSpec spec = params.getParameterSpec(IvParameterSpec.class);
+        return spec.getIV();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AESCTRNoPaddingCipherTestBase.java b/tests/tests/keystore/src/android/keystore/cts/AESCTRNoPaddingCipherTestBase.java
new file mode 100644
index 0000000..e504310
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AESCTRNoPaddingCipherTestBase.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+abstract class AESCTRNoPaddingCipherTestBase extends AESCTRCipherTestBase {
+    @Override
+    protected String getTransformation() {
+        return "AES/CTR/NoPadding";
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AESCipherNistCavpKatTest.java b/tests/tests/keystore/src/android/keystore/cts/AESCipherNistCavpKatTest.java
new file mode 100644
index 0000000..1f6ebd7
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AESCipherNistCavpKatTest.java
@@ -0,0 +1,324 @@
+/*
+ * Copyright 2015 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.keystore.cts;
+
+import android.security.keystore.KeyProperties;
+import android.security.keystore.KeyProtection;
+import android.test.AndroidTestCase;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.security.KeyStore;
+import java.util.Arrays;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import javax.crypto.Cipher;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+public class AESCipherNistCavpKatTest extends AndroidTestCase {
+
+    public void testECBVarKey128() throws Exception {
+        runTestsForKatFile("ECBVarKey128.rsp");
+    }
+
+    public void testECBVarKey192() throws Exception {
+        runTestsForKatFile("ECBVarKey192.rsp");
+    }
+    public void testECBVarKey256() throws Exception {
+        runTestsForKatFile("ECBVarKey256.rsp");
+    }
+
+    public void testECBVarTxt128() throws Exception {
+        runTestsForKatFile("ECBVarTxt128.rsp");
+    }
+
+    public void testECBVarTxt192() throws Exception {
+        runTestsForKatFile("ECBVarTxt192.rsp");
+    }
+
+    public void testECBVarTxt256() throws Exception {
+        runTestsForKatFile("ECBVarTxt256.rsp");
+    }
+
+    public void testECBGFSbox128() throws Exception {
+        runTestsForKatFile("ECBGFSbox128.rsp");
+    }
+
+    public void testECBGFSbox192() throws Exception {
+        runTestsForKatFile("ECBGFSbox192.rsp");
+    }
+
+    public void testECBGFSbox256() throws Exception {
+        runTestsForKatFile("ECBGFSbox256.rsp");
+    }
+
+    public void testECBKeySbox128() throws Exception {
+        runTestsForKatFile("ECBKeySbox128.rsp");
+    }
+
+    public void testECBKeySbox192() throws Exception {
+        runTestsForKatFile("ECBKeySbox192.rsp");
+    }
+
+    public void testECBKeySbox256() throws Exception {
+        runTestsForKatFile("ECBKeySbox256.rsp");
+    }
+
+    public void testCBCVarKey128() throws Exception {
+        runTestsForKatFile("CBCVarKey128.rsp");
+    }
+
+    public void testCBCVarKey192() throws Exception {
+        runTestsForKatFile("CBCVarKey192.rsp");
+    }
+    public void testCBCVarKey256() throws Exception {
+        runTestsForKatFile("CBCVarKey256.rsp");
+    }
+
+    public void testCBCVarTxt128() throws Exception {
+        runTestsForKatFile("CBCVarTxt128.rsp");
+    }
+
+    public void testCBCVarTxt192() throws Exception {
+        runTestsForKatFile("CBCVarTxt192.rsp");
+    }
+
+    public void testCBCVarTxt256() throws Exception {
+        runTestsForKatFile("CBCVarTxt256.rsp");
+    }
+
+    public void testCBCGFSbox128() throws Exception {
+        runTestsForKatFile("CBCGFSbox128.rsp");
+    }
+
+    public void testCBCGFSbox192() throws Exception {
+        runTestsForKatFile("CBCGFSbox192.rsp");
+    }
+
+    public void testCBCGFSbox256() throws Exception {
+        runTestsForKatFile("CBCGFSbox256.rsp");
+    }
+
+    public void testCBCKeySbox128() throws Exception {
+        runTestsForKatFile("CBCKeySbox128.rsp");
+    }
+
+    public void testCBCKeySbox192() throws Exception {
+        runTestsForKatFile("CBCKeySbox192.rsp");
+    }
+
+    public void testCBCKeySbox256() throws Exception {
+        runTestsForKatFile("CBCKeySbox256.rsp");
+    }
+
+    private void runTestsForKatFile(String fileName) throws Exception {
+        try (ZipInputStream zipIn = new ZipInputStream(
+                getContext().getResources().getAssets().open("nist_cavp_aes_kat.zip"))) {
+            ZipEntry zipEntry;
+            byte[] entryContents = null;
+            while ((zipEntry = zipIn.getNextEntry()) != null) {
+                String entryName = zipEntry.getName();
+
+                // We have to read the contents of all entries because there's no way to skip an
+                // entry without reading its contents.
+                entryContents = new byte[(int) zipEntry.getSize()];
+                readFully(zipIn, entryContents);
+
+                if (fileName.equals(entryName)) {
+                    break;
+                }
+            }
+
+            if (entryContents == null) {
+                fail(fileName + " not found");
+                return;
+            }
+
+            String blockMode = fileName.substring(0, 3);
+            if ("CFB".equals(blockMode)) {
+                blockMode = fileName.substring(0, 4);
+            }
+            runTestsForKatFile(blockMode, entryContents);
+        }
+    }
+
+    private void runTestsForKatFile(String blockMode, byte[] fileContents) throws Exception {
+        BufferedReader in = null;
+        int testNumber = 0;
+        try {
+            in = new BufferedReader(new InputStreamReader(
+                    new ByteArrayInputStream(fileContents), "ISO-8859-1"));
+            String line;
+            int lineNumber = 0;
+            String section = null; // ENCRYPT or DECRYPT
+
+            boolean insideTestDefinition = false;
+            TestVector testVector = null;
+
+            while ((line = in.readLine()) != null) {
+                lineNumber++;
+                line = line.trim();
+                if (line.startsWith("#")) {
+                    // Ignore comment lines
+                    continue;
+                }
+
+                if (!insideTestDefinition) {
+                    // Outside of a test definition
+                    if (line.length() == 0) {
+                        // Ignore empty lines
+                        continue;
+                    }
+                    if ((line.startsWith("[")) && (line.endsWith("]"))) {
+                        section = line.substring(1, line.length() - 1);
+                        if ((!"DECRYPT".equals(section)) && (!"ENCRYPT".equals(section))) {
+                            throw new IOException(lineNumber + ": Unexpected section: " + section);
+                        }
+                        continue;
+                    }
+
+                    // Check whether this is a NAME = VALUE line
+                    int delimiterIndex = line.indexOf('=');
+                    if (delimiterIndex == -1) {
+                        throw new IOException(lineNumber + ": Unexpected line outside of test"
+                                + " definition: " + line);
+                    }
+                    String name = line.substring(0, delimiterIndex).trim();
+                    String value = line.substring(delimiterIndex + 1).trim();
+
+                    if ("COUNT".equals(name)) {
+                        testNumber = Integer.parseInt(value);
+                        insideTestDefinition = true;
+                        testVector = new TestVector();
+                    } else {
+                        throw new IOException(lineNumber + ": Unexpected line outside of test"
+                                + " definition: " + line);
+                    }
+                } else {
+                    // Inside of a test definition
+                    if (line.length() == 0) {
+                        // End of test definition
+                        boolean encrypt;
+                        if ("ENCRYPT".equals(section)) {
+                            encrypt = true;
+                        } else if ("DECRYPT".equals(section)) {
+                            encrypt = false;
+                        } else {
+                            throw new IOException("Unexpected test operation: " + section);
+                        }
+                        runKatTest(blockMode, encrypt, testVector);
+                        insideTestDefinition = false;
+                        testVector = null;
+                    } else {
+                        // Check whether this is a NAME = VALUE line
+                        int delimiterIndex = line.indexOf('=');
+                        if (delimiterIndex == -1) {
+                            throw new IOException(lineNumber + ": Unexpected line inside test"
+                                    + " definition: " + line);
+                        }
+                        String name = line.substring(0, delimiterIndex).trim();
+                        String value = line.substring(delimiterIndex + 1).trim();
+
+                        if ("KEY".equals(name)) {
+                            testVector.key = HexEncoding.decode(value);
+                        } else if ("IV".equals(name)) {
+                            testVector.iv = HexEncoding.decode(value);
+                        } else if ("PLAINTEXT".equals(name)) {
+                            testVector.plaintext = HexEncoding.decode(value);
+                        } else if ("CIPHERTEXT".equals(name)) {
+                            testVector.ciphertext = HexEncoding.decode(value);
+                        } else {
+                            throw new IOException(lineNumber + ": Unexpected line inside test"
+                                    + " definition: " + line);
+                        }
+                    }
+                }
+            }
+        } catch (Throwable e) {
+            throw new RuntimeException("Test #" + testNumber + " failed", e);
+        } finally {
+            if (in != null) {
+                try {
+                    in.close();
+                } catch (Exception ignored) {}
+            }
+        }
+    }
+
+    private void runKatTest(String mode, boolean encrypt, TestVector testVector) throws Exception {
+        String keyAlias = AESCipherNistCavpKatTest.class.getName();
+        KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
+        keyStore.load(null);
+        keyStore.setEntry(keyAlias,
+                new KeyStore.SecretKeyEntry(new SecretKeySpec(testVector.key, "AES")),
+                new KeyProtection.Builder(
+                        KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
+                        .setBlockModes(mode)
+                        .setEncryptionPaddings("NoPadding")
+                        .setRandomizedEncryptionRequired(false)
+                        .build());
+        try {
+            SecretKey key = (SecretKey) keyStore.getKey(keyAlias, null);
+            assertNotNull(key);
+            Cipher cipher = Cipher.getInstance("AES/" + mode + "/NoPadding");
+
+            int opmode = (encrypt) ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE;
+            if (testVector.iv != null) {
+                cipher.init(opmode, key, new IvParameterSpec(testVector.iv));
+            } else {
+                cipher.init(opmode, key);
+            }
+
+            byte[] input = (encrypt) ? testVector.plaintext : testVector.ciphertext;
+            byte[] actualOutput = cipher.doFinal(input);
+            byte[] expectedOutput = (encrypt) ? testVector.ciphertext : testVector.plaintext;
+            if (!Arrays.equals(expectedOutput, actualOutput)) {
+                fail("Expected: " + HexEncoding.encode(expectedOutput)
+                        + ", actual: " + HexEncoding.encode(actualOutput));
+            }
+        } finally {
+            keyStore.deleteEntry(keyAlias);
+        }
+    }
+
+    private static void readFully(InputStream in, byte[] buf) throws IOException {
+        int offset = 0;
+        int remaining = buf.length;
+        while (remaining > 0) {
+            int chunkSize = in.read(buf, offset, remaining);
+            if (chunkSize == -1) {
+                throw new EOFException("Premature EOF. Remaining: " + remaining);
+            }
+            offset += chunkSize;
+            remaining -= chunkSize;
+        }
+    }
+
+    private static class TestVector {
+        public byte[] key;
+        public byte[] iv;
+        public byte[] plaintext;
+        public byte[] ciphertext;
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AESECBCipherTestBase.java b/tests/tests/keystore/src/android/keystore/cts/AESECBCipherTestBase.java
new file mode 100644
index 0000000..b2752dc
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AESECBCipherTestBase.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+import java.security.AlgorithmParameters;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.InvalidParameterSpecException;
+
+abstract class AESECBCipherTestBase extends BlockCipherTestBase {
+
+    @Override
+    protected boolean isStreamCipher() {
+        return false;
+    }
+
+    @Override
+    protected boolean isAuthenticatedCipher() {
+        return false;
+    }
+
+    @Override
+    protected int getKatAuthenticationTagLengthBytes() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected int getBlockSize() {
+        return 16;
+    }
+
+    @Override
+    protected AlgorithmParameterSpec getKatAlgorithmParameterSpec() {
+        return null;
+    }
+
+    @Override
+    protected byte[] getIv(AlgorithmParameters params) throws InvalidParameterSpecException {
+        if (params != null) {
+            fail("ECB does not use IV");
+        }
+        return null;
+    }
+
+    public void testInitRejectsIvParameterSpec() throws Exception {
+        assertInitRejectsIvParameterSpec(new byte[getBlockSize()]);
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AESECBNoPaddingCipherTestBase.java b/tests/tests/keystore/src/android/keystore/cts/AESECBNoPaddingCipherTestBase.java
new file mode 100644
index 0000000..8c38015
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AESECBNoPaddingCipherTestBase.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+abstract class AESECBNoPaddingCipherTestBase extends AESECBCipherTestBase {
+    @Override
+    protected String getTransformation() {
+        return "AES/ECB/NoPadding";
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AESECBPKCS7PaddingCipherTestBase.java b/tests/tests/keystore/src/android/keystore/cts/AESECBPKCS7PaddingCipherTestBase.java
new file mode 100644
index 0000000..67e659c
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AESECBPKCS7PaddingCipherTestBase.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+abstract class AESECBPKCS7PaddingCipherTestBase extends AESECBCipherTestBase {
+    @Override
+    protected String getTransformation() {
+        return "AES/ECB/PKCS7Padding";
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AESGCMCipherTestBase.java b/tests/tests/keystore/src/android/keystore/cts/AESGCMCipherTestBase.java
new file mode 100644
index 0000000..1c3404a
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AESGCMCipherTestBase.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+import java.nio.ByteBuffer;
+import java.security.AlgorithmParameters;
+import java.security.Key;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.InvalidParameterSpecException;
+
+import javax.crypto.AEADBadTagException;
+import javax.crypto.Cipher;
+import javax.crypto.spec.GCMParameterSpec;
+
+abstract class AESGCMCipherTestBase extends BlockCipherTestBase {
+
+    protected abstract byte[] getKatAad();
+    protected abstract byte[] getKatCiphertextWhenKatAadPresent();
+
+    @Override
+    protected boolean isStreamCipher() {
+        return true;
+    }
+
+    @Override
+    protected boolean isAuthenticatedCipher() {
+        return true;
+    }
+
+    @Override
+    protected int getKatAuthenticationTagLengthBytes() {
+        return getKatCiphertext().length - getKatPlaintext().length;
+    }
+
+    @Override
+    protected int getBlockSize() {
+        return 16;
+    }
+
+    @Override
+    protected AlgorithmParameterSpec getKatAlgorithmParameterSpec() {
+        return new GCMParameterSpec(getKatAuthenticationTagLengthBytes() * 8, getKatIv());
+    }
+
+    @Override
+    protected byte[] getIv(AlgorithmParameters params) throws InvalidParameterSpecException {
+        GCMParameterSpec spec = params.getParameterSpec(GCMParameterSpec.class);
+        return spec.getIV();
+    }
+
+    public void testKatEncryptWithAadProvidedInOneGo() throws Exception {
+        createCipher();
+        assertKatTransformWithAadProvidedInOneGo(
+                Cipher.ENCRYPT_MODE,
+                getKatAad(),
+                getKatPlaintext(),
+                getKatCiphertextWhenKatAadPresent());
+    }
+
+    public void testKatDecryptWithAadProvidedInOneGo() throws Exception {
+        createCipher();
+        assertKatTransformWithAadProvidedInOneGo(
+                Cipher.DECRYPT_MODE,
+                getKatAad(),
+                getKatCiphertextWhenKatAadPresent(),
+                getKatPlaintext());
+    }
+
+    public void testKatEncryptWithAadProvidedInChunks() throws Exception {
+        createCipher();
+        assertKatTransformWithAadProvidedInChunks(
+                Cipher.ENCRYPT_MODE,
+                getKatAad(),
+                getKatPlaintext(),
+                getKatCiphertextWhenKatAadPresent(),
+                1);
+        assertKatTransformWithAadProvidedInChunks(
+                Cipher.ENCRYPT_MODE,
+                getKatAad(),
+                getKatPlaintext(),
+                getKatCiphertextWhenKatAadPresent(),
+                8);
+        assertKatTransformWithAadProvidedInChunks(
+                Cipher.ENCRYPT_MODE,
+                getKatAad(),
+                getKatPlaintext(),
+                getKatCiphertextWhenKatAadPresent(),
+                3);
+        assertKatTransformWithAadProvidedInChunks(
+                Cipher.ENCRYPT_MODE,
+                getKatAad(),
+                getKatPlaintext(),
+                getKatCiphertextWhenKatAadPresent(),
+                7);
+        assertKatTransformWithAadProvidedInChunks(
+                Cipher.ENCRYPT_MODE,
+                getKatAad(),
+                getKatPlaintext(),
+                getKatCiphertextWhenKatAadPresent(),
+                23);
+    }
+
+    public void testKatDecryptWithAadProvidedInChunks() throws Exception {
+        createCipher();
+        assertKatTransformWithAadProvidedInChunks(
+                Cipher.DECRYPT_MODE,
+                getKatAad(),
+                getKatCiphertextWhenKatAadPresent(),
+                getKatPlaintext(),
+                1);
+        assertKatTransformWithAadProvidedInChunks(
+                Cipher.DECRYPT_MODE,
+                getKatAad(),
+                getKatCiphertextWhenKatAadPresent(),
+                getKatPlaintext(),
+                8);
+        assertKatTransformWithAadProvidedInChunks(
+                Cipher.DECRYPT_MODE,
+                getKatAad(),
+                getKatCiphertextWhenKatAadPresent(),
+                getKatPlaintext(),
+                3);
+        assertKatTransformWithAadProvidedInChunks(
+                Cipher.DECRYPT_MODE,
+                getKatAad(),
+                getKatCiphertextWhenKatAadPresent(),
+                getKatPlaintext(),
+                7);
+        assertKatTransformWithAadProvidedInChunks(
+                Cipher.DECRYPT_MODE,
+                getKatAad(),
+                getKatCiphertextWhenKatAadPresent(),
+                getKatPlaintext(),
+                23);
+    }
+
+    private void assertKatTransformWithAadProvidedInOneGo(int opmode,
+            byte[] aad, byte[] input, byte[] expectedOutput) throws Exception {
+        initKat(opmode);
+        updateAAD(aad);
+        assertEquals(expectedOutput, doFinal(input));
+
+        initKat(opmode);
+        updateAAD(aad, 0, aad.length);
+        assertEquals(expectedOutput, doFinal(input));
+
+        initKat(opmode);
+        updateAAD(ByteBuffer.wrap(aad));
+        assertEquals(expectedOutput, doFinal(input));
+    }
+
+    private void assertKatTransformWithAadProvidedInChunks(int opmode,
+            byte[] aad, byte[] input, byte[] expectedOutput, int maxChunkSize) throws Exception {
+        createCipher();
+        initKat(opmode);
+        int aadOffset = 0;
+        while (aadOffset < aad.length) {
+            int chunkSize = Math.min(aad.length - aadOffset, maxChunkSize);
+            updateAAD(aad, aadOffset, chunkSize);
+            aadOffset += chunkSize;
+        }
+        assertEquals(expectedOutput, doFinal(input));
+    }
+
+    public void testCiphertextBitflipDetectedWhenDecrypting() throws Exception {
+        createCipher();
+        Key key = importKey(getKatKey());
+        byte[] ciphertext = getKatCiphertext();
+        ciphertext[ciphertext.length / 2] ^= 0x40;
+        init(Cipher.DECRYPT_MODE, key, getKatAlgorithmParameterSpec());
+        try {
+            doFinal(ciphertext);
+            fail();
+        } catch (AEADBadTagException expected) {}
+    }
+
+    public void testAadBitflipDetectedWhenDecrypting() throws Exception {
+        createCipher();
+        Key key = importKey(getKatKey());
+        byte[] ciphertext = getKatCiphertextWhenKatAadPresent();
+        byte[] aad = getKatCiphertext();
+        aad[aad.length / 3] ^= 0x2;
+        init(Cipher.DECRYPT_MODE, key, getKatAlgorithmParameterSpec());
+        updateAAD(aad);
+        try {
+            doFinal(ciphertext);
+            fail();
+        } catch (AEADBadTagException expected) {}
+    }
+
+    public void testInitRejectsIvParameterSpec() throws Exception {
+        assertInitRejectsIvParameterSpec(getKatIv());
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AESGCMNoPaddingCipherTestBase.java b/tests/tests/keystore/src/android/keystore/cts/AESGCMNoPaddingCipherTestBase.java
new file mode 100644
index 0000000..c29e644
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/AESGCMNoPaddingCipherTestBase.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+abstract class AESGCMNoPaddingCipherTestBase extends AESGCMCipherTestBase {
+    @Override
+    protected String getTransformation() {
+        return "AES/GCM/NoPadding";
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AndroidKeyPairGeneratorTest.java b/tests/tests/keystore/src/android/keystore/cts/AndroidKeyPairGeneratorTest.java
deleted file mode 100644
index 08dae1e..0000000
--- a/tests/tests/keystore/src/android/keystore/cts/AndroidKeyPairGeneratorTest.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- * Copyright 2013 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.keystore.cts;
-
-import android.security.KeyPairGeneratorSpec;
-import android.test.AndroidTestCase;
-
-import java.math.BigInteger;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.security.KeyPair;
-import java.security.KeyPairGenerator;
-import java.security.KeyStore;
-import java.security.Principal;
-import java.security.PrivateKey;
-import java.security.PublicKey;
-import java.security.SecureRandom;
-import java.security.cert.Certificate;
-import java.security.cert.X509Certificate;
-import java.security.interfaces.ECPublicKey;
-import java.security.interfaces.RSAPublicKey;
-import java.security.spec.AlgorithmParameterSpec;
-import java.security.spec.RSAKeyGenParameterSpec;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-
-import javax.net.ssl.KeyManager;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLServerSocket;
-import javax.net.ssl.SSLSocket;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509ExtendedKeyManager;
-import javax.security.auth.x500.X500Principal;
-
-import libcore.java.security.TestKeyStore;
-import libcore.javax.net.ssl.TestKeyManager;
-import libcore.javax.net.ssl.TestSSLContext;
-
-public class AndroidKeyPairGeneratorTest extends AndroidTestCase {
-    private KeyPairGenerator mGenerator;
-
-    private KeyStore mKeyStore;
-
-    private static final String TEST_ALIAS_1 = "test1";
-
-    private static final String TEST_ALIAS_2 = "test2";
-
-    private static final X500Principal TEST_DN_1 = new X500Principal("CN=test1");
-
-    private static final X500Principal TEST_DN_2 = new X500Principal("CN=test2");
-
-    private static final BigInteger TEST_SERIAL_1 = BigInteger.ONE;
-
-    private static final BigInteger TEST_SERIAL_2 = BigInteger.valueOf(2L);
-
-    private static final long NOW_MILLIS = System.currentTimeMillis();
-
-    /* We have to round this off because X509v3 doesn't store milliseconds. */
-    private static final Date NOW = new Date(NOW_MILLIS - (NOW_MILLIS % 1000L));
-
-    @SuppressWarnings("deprecation")
-    private static final Date NOW_PLUS_10_YEARS = new Date(NOW.getYear() + 10, 0, 1);
-
-    @Override
-    protected void setUp() throws Exception {
-        mKeyStore = KeyStore.getInstance("AndroidKeyStore");
-        mKeyStore.load(null, null);
-
-        mGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
-    }
-
-    public void testKeyPairGenerator_Initialize_Params_Unencrypted_Success() throws Exception {
-        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
-                .setAlias(TEST_ALIAS_1)
-                .setSubject(TEST_DN_1)
-                .setSerialNumber(TEST_SERIAL_1)
-                .setStartDate(NOW)
-                .setEndDate(NOW_PLUS_10_YEARS)
-                .build());
-    }
-
-    public void testKeyPairGenerator_Initialize_KeySize_Unencrypted_Failure() throws Exception {
-        try {
-            mGenerator.initialize(1024);
-            fail("KeyPairGenerator should not support setting the key size");
-        } catch (IllegalArgumentException success) {
-        }
-    }
-
-    public void testKeyPairGenerator_Initialize_KeySizeAndSecureRandom_Unencrypted_Failure()
-            throws Exception {
-        try {
-            mGenerator.initialize(1024, new SecureRandom());
-            fail("KeyPairGenerator should not support setting the key size");
-        } catch (IllegalArgumentException success) {
-        }
-    }
-
-    public void testKeyPairGenerator_Initialize_ParamsAndSecureRandom_Unencrypted_Failure()
-            throws Exception {
-        mGenerator.initialize(
-                new KeyPairGeneratorSpec.Builder(getContext())
-                        .setAlias(TEST_ALIAS_1)
-                        .setSubject(TEST_DN_1)
-                        .setSerialNumber(TEST_SERIAL_1)
-                        .setStartDate(NOW)
-                        .setEndDate(NOW_PLUS_10_YEARS)
-                        .build(),
-                new SecureRandom());
-    }
-
-    public void testKeyPairGenerator_GenerateKeyPair_EC_Unencrypted_Success() throws Exception {
-        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
-                .setAlias(TEST_ALIAS_1)
-                .setKeyType("EC")
-                .setSubject(TEST_DN_1)
-                .setSerialNumber(TEST_SERIAL_1)
-                .setStartDate(NOW)
-                .setEndDate(NOW_PLUS_10_YEARS)
-                .build());
-
-        final KeyPair pair = mGenerator.generateKeyPair();
-        assertNotNull("The KeyPair returned should not be null", pair);
-
-        assertKeyPairCorrect(pair, TEST_ALIAS_1, "EC", 256, null, TEST_DN_1, TEST_SERIAL_1, NOW,
-                NOW_PLUS_10_YEARS);
-    }
-
-    public void testKeyPairGenerator_GenerateKeyPair_EC_P521_Unencrypted_Success() throws Exception {
-        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
-                .setAlias(TEST_ALIAS_1)
-                .setKeyType("EC")
-                .setKeySize(521)
-                .setSubject(TEST_DN_1)
-                .setSerialNumber(TEST_SERIAL_1)
-                .setStartDate(NOW)
-                .setEndDate(NOW_PLUS_10_YEARS)
-                .build());
-
-        final KeyPair pair = mGenerator.generateKeyPair();
-        assertNotNull("The KeyPair returned should not be null", pair);
-
-        assertKeyPairCorrect(pair, TEST_ALIAS_1, "EC", 521, null, TEST_DN_1, TEST_SERIAL_1, NOW,
-                NOW_PLUS_10_YEARS);
-    }
-
-    public void testKeyPairGenerator_GenerateKeyPair_RSA_Unencrypted_Success() throws Exception {
-        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
-                .setAlias(TEST_ALIAS_1)
-                .setSubject(TEST_DN_1)
-                .setSerialNumber(TEST_SERIAL_1)
-                .setStartDate(NOW)
-                .setEndDate(NOW_PLUS_10_YEARS)
-                .build());
-
-        final KeyPair pair = mGenerator.generateKeyPair();
-        assertNotNull("The KeyPair returned should not be null", pair);
-
-        assertKeyPairCorrect(pair, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1, NOW,
-                NOW_PLUS_10_YEARS);
-    }
-
-    public void testKeyPairGenerator_GenerateKeyPair_Replaced_Unencrypted_Success()
-            throws Exception {
-        // Generate the first key
-        {
-            mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
-                    .setAlias(TEST_ALIAS_1).setSubject(TEST_DN_1).setSerialNumber(TEST_SERIAL_1)
-                    .setStartDate(NOW).setEndDate(NOW_PLUS_10_YEARS).build());
-            final KeyPair pair1 = mGenerator.generateKeyPair();
-            assertNotNull("The KeyPair returned should not be null", pair1);
-            assertKeyPairCorrect(pair1, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1,
-                    NOW, NOW_PLUS_10_YEARS);
-        }
-
-        // Replace the original key
-        {
-            mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
-                    .setAlias(TEST_ALIAS_1).setSubject(TEST_DN_2).setSerialNumber(TEST_SERIAL_2)
-                    .setStartDate(NOW).setEndDate(NOW_PLUS_10_YEARS).build());
-            final KeyPair pair2 = mGenerator.generateKeyPair();
-            assertNotNull("The KeyPair returned should not be null", pair2);
-            assertKeyPairCorrect(pair2, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_2, TEST_SERIAL_2,
-                    NOW, NOW_PLUS_10_YEARS);
-        }
-    }
-
-    public void testKeyPairGenerator_GenerateKeyPair_No_Collision_Unencrypted_Success()
-            throws Exception {
-        // Generate the first key
-        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
-                .setAlias(TEST_ALIAS_1)
-                .setSubject(TEST_DN_1)
-                .setSerialNumber(TEST_SERIAL_1)
-                .setStartDate(NOW)
-                .setEndDate(NOW_PLUS_10_YEARS)
-                .build());
-        final KeyPair pair1 = mGenerator.generateKeyPair();
-        assertNotNull("The KeyPair returned should not be null", pair1);
-        assertKeyPairCorrect(pair1, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1, NOW,
-                NOW_PLUS_10_YEARS);
-
-        // Generate the second key
-        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
-                .setAlias(TEST_ALIAS_2)
-                .setSubject(TEST_DN_2)
-                .setSerialNumber(TEST_SERIAL_2)
-                .setStartDate(NOW)
-                .setEndDate(NOW_PLUS_10_YEARS)
-                .build());
-        final KeyPair pair2 = mGenerator.generateKeyPair();
-        assertNotNull("The KeyPair returned should not be null", pair2);
-        assertKeyPairCorrect(pair2, TEST_ALIAS_2, "RSA", 2048, null, TEST_DN_2, TEST_SERIAL_2, NOW,
-                NOW_PLUS_10_YEARS);
-
-        // Check the first key again
-        assertKeyPairCorrect(pair1, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1, NOW,
-                NOW_PLUS_10_YEARS);
-    }
-
-    private void assertKeyPairCorrect(KeyPair pair, String alias, String keyType, int keySize,
-            AlgorithmParameterSpec spec, X500Principal dn, BigInteger serial, Date start, Date end)
-            throws Exception {
-        final PublicKey pubKey = pair.getPublic();
-        assertNotNull("The PublicKey for the KeyPair should be not null", pubKey);
-        assertEquals(keyType, pubKey.getAlgorithm());
-        assertEquals("Public keys should be in X.509 format", "X.509", pubKey.getFormat());
-        assertNotNull("Public keys should be encodable", pubKey.getEncoded());
-
-        if ("EC".equalsIgnoreCase(keyType)) {
-            assertEquals("Curve should be what was specified during initialization", keySize,
-                    ((ECPublicKey) pubKey).getParams().getCurve().getField().getFieldSize());
-        } else if ("RSA".equalsIgnoreCase(keyType)) {
-            RSAPublicKey rsaPubKey = (RSAPublicKey) pubKey;
-            assertEquals("Modulus size should be what is specified during initialization",
-                    (keySize + 7) & ~7, (rsaPubKey.getModulus().bitLength() + 7) & ~7);
-            if (spec != null) {
-                RSAKeyGenParameterSpec params = (RSAKeyGenParameterSpec) spec;
-                assertEquals((keySize + 7) & ~7, (params.getKeysize() + 7) & ~7);
-                assertEquals(params.getPublicExponent(), rsaPubKey.getPublicExponent());
-            }
-        }
-
-        final PrivateKey privKey = pair.getPrivate();
-        assertNotNull("The PrivateKey for the KeyPair should be not null", privKey);
-        assertEquals(keyType, privKey.getAlgorithm());
-        assertNull("getFormat() should return null", privKey.getFormat());
-        assertNull("getEncoded() should return null", privKey.getEncoded());
-
-        KeyStore.Entry entry = mKeyStore.getEntry(alias, null);
-        assertNotNull("Entry should exist", entry);
-
-        assertTrue("Entry should be a PrivateKeyEntry", entry instanceof KeyStore.PrivateKeyEntry);
-        KeyStore.PrivateKeyEntry privEntry = (KeyStore.PrivateKeyEntry) entry;
-
-        Certificate userCert = privEntry.getCertificate();
-        assertTrue("Certificate should be in X.509 format", userCert instanceof X509Certificate);
-
-        final X509Certificate x509userCert = (X509Certificate) userCert;
-
-        assertEquals("PublicKey used to sign certificate should match one returned in KeyPair",
-                pubKey, x509userCert.getPublicKey());
-
-        assertEquals("The Subject DN should be the one passed into the params", dn,
-                x509userCert.getSubjectDN());
-
-        assertEquals("The Issuer DN should be the same as the Subject DN", dn,
-                x509userCert.getIssuerDN());
-
-        assertEquals("The Serial should be the one passed into the params", serial,
-                x509userCert.getSerialNumber());
-
-        assertDateEquals("The notBefore date should be the one passed into the params", start,
-                x509userCert.getNotBefore());
-
-        assertDateEquals("The notAfter date should be the one passed into the params", end,
-                x509userCert.getNotAfter());
-
-        x509userCert.verify(pubKey);
-
-        Certificate[] chain = privEntry.getCertificateChain();
-        assertEquals("A list of CA certificates should not exist for the generated entry", 1,
-                chain.length);
-
-        assertUsableInSSLConnection(privKey, x509userCert);
-
-        assertEquals("Retrieved key and generated key should be equal", privKey,
-                privEntry.getPrivateKey());
-    }
-
-    private static void assertUsableInSSLConnection(final PrivateKey privKey,
-            final X509Certificate x509userCert) throws Exception {
-        // TODO this should probably be in something like:
-        // TestKeyStore.createForClientSelfSigned(...)
-        TrustManager[] clientTrustManagers = TestKeyStore.createTrustManagers(
-                TestKeyStore.getIntermediateCa().keyStore);
-        SSLContext clientContext = TestSSLContext.createSSLContext("TLS",
-                new KeyManager[] {
-                    TestKeyManager.wrap(new MyKeyManager(privKey, x509userCert))
-                }, clientTrustManagers);
-        TestKeyStore serverKeyStore = TestKeyStore.getServer();
-        serverKeyStore.keyStore.setCertificateEntry("client-selfSigned", x509userCert);
-        SSLContext serverContext = TestSSLContext.createSSLContext("TLS",
-                serverKeyStore.keyManagers,
-                TestKeyStore.createTrustManagers(serverKeyStore.keyStore));
-        SSLServerSocket serverSocket = (SSLServerSocket) serverContext.getServerSocketFactory()
-                .createServerSocket(0);
-        InetAddress host = InetAddress.getLocalHost();
-        int port = serverSocket.getLocalPort();
-
-        SSLSocket client = (SSLSocket) clientContext.getSocketFactory().createSocket(host, port);
-        final SSLSocket server = (SSLSocket) serverSocket.accept();
-        ExecutorService executor = Executors.newSingleThreadExecutor();
-        Future<Void> future = executor.submit(new Callable<Void>() {
-            @Override
-            public Void call() throws Exception {
-                server.setNeedClientAuth(true);
-                server.setWantClientAuth(true);
-                server.startHandshake();
-                return null;
-            }
-        });
-        executor.shutdown();
-        client.startHandshake();
-        Certificate[] usedClientCerts = client.getSession().getLocalCertificates();
-        assertNotNull(usedClientCerts);
-        assertEquals(1, usedClientCerts.length);
-        assertEquals(x509userCert, usedClientCerts[0]);
-        future.get();
-        client.close();
-        server.close();
-    }
-
-    private static class MyKeyManager extends X509ExtendedKeyManager {
-        private final PrivateKey key;
-        private final X509Certificate[] chain;
-
-        public MyKeyManager(PrivateKey key, X509Certificate cert) {
-            this.key = key;
-            this.chain = new X509Certificate[] { cert };
-        }
-
-        @Override
-        public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) {
-            return "fake";
-        }
-
-        @Override
-        public String chooseServerAlias(String keyType, Principal[] issuers, Socket socket) {
-            throw new UnsupportedOperationException("Not implemented");
-        }
-
-        @Override
-        public X509Certificate[] getCertificateChain(String alias) {
-            return chain;
-        }
-
-        @Override
-        public String[] getClientAliases(String keyType, Principal[] issuers) {
-            return new String[] { "fake" };
-        }
-
-        @Override
-        public String[] getServerAliases(String keyType, Principal[] issuers) {
-            throw new UnsupportedOperationException("Not implemented");
-        }
-
-        @Override
-        public PrivateKey getPrivateKey(String alias) {
-            return key;
-        }
-    }
-
-    private static void assertDateEquals(String message, Date date1, Date date2) throws Exception {
-        SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss");
-
-        String result1 = formatter.format(date1);
-        String result2 = formatter.format(date2);
-
-        assertEquals(message, result1, result2);
-    }
-}
diff --git a/tests/tests/keystore/src/android/keystore/cts/AndroidKeyStoreTest.java b/tests/tests/keystore/src/android/keystore/cts/AndroidKeyStoreTest.java
index 577e830..5fe3505 100644
--- a/tests/tests/keystore/src/android/keystore/cts/AndroidKeyStoreTest.java
+++ b/tests/tests/keystore/src/android/keystore/cts/AndroidKeyStoreTest.java
@@ -18,12 +18,20 @@
 
 import android.security.KeyPairGeneratorSpec;
 import android.security.KeyStoreParameter;
+import android.security.keystore.KeyProperties;
+import android.security.keystore.KeyProtection;
 import android.test.AndroidTestCase;
+import android.test.MoreAsserts;
+import android.test.suitebuilder.annotation.LargeTest;
+import android.util.Log;
+
+import com.android.cts.keystore.R;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.OutputStream;
 import java.math.BigInteger;
+import java.security.AlgorithmParameters;
 import java.security.Key;
 import java.security.KeyFactory;
 import java.security.KeyPairGenerator;
@@ -34,11 +42,11 @@
 import java.security.KeyStoreException;
 import java.security.PrivateKey;
 import java.security.PublicKey;
+import java.security.Signature;
 import java.security.cert.Certificate;
 import java.security.cert.CertificateFactory;
-import java.security.interfaces.ECPrivateKey;
-import java.security.interfaces.ECPublicKey;
-import java.security.interfaces.RSAPrivateKey;
+import java.security.interfaces.ECKey;
+import java.security.interfaces.RSAKey;
 import java.security.spec.PKCS8EncodedKeySpec;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -52,11 +60,13 @@
 
 import javax.crypto.BadPaddingException;
 import javax.crypto.Cipher;
+import javax.crypto.Mac;
 import javax.crypto.SecretKey;
-import javax.crypto.spec.SecretKeySpec;
 import javax.security.auth.x500.X500Principal;
 
 public class AndroidKeyStoreTest extends AndroidTestCase {
+    private static final String TAG = AndroidKeyStoreTest.class.getSimpleName();
+
     private KeyStore mKeyStore;
 
     private static final String TEST_ALIAS_1 = "test1";
@@ -706,6 +716,8 @@
 
     @Override
     protected void setUp() throws Exception {
+        super.setUp();
+
         // Wipe any existing entries in the KeyStore
         KeyStore ksTemp = KeyStore.getInstance("AndroidKeyStore");
         ksTemp.load(null, null);
@@ -719,6 +731,21 @@
         mKeyStore = KeyStore.getInstance("AndroidKeyStore");
     }
 
+    @Override
+    protected void tearDown() throws Exception {
+        try {
+            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
+            keyStore.load(null, null);
+            Enumeration<String> aliases = keyStore.aliases();
+            while (aliases.hasMoreElements()) {
+                String alias = aliases.nextElement();
+                keyStore.deleteEntry(alias);
+            }
+        } finally {
+            super.tearDown();
+        }
+    }
+
     private PrivateKey generatePrivateKey(String keyType, byte[] fakeKey1) throws Exception {
         KeyFactory kf = KeyFactory.getInstance(keyType);
         return kf.generatePrivate(new PKCS8EncodedKeySpec(fakeKey1));
@@ -1090,14 +1117,18 @@
         final PrivateKey privKey = keyEntry.getPrivateKey();
         final PublicKey pubKey = keyEntry.getCertificate().getPublicKey();
 
-        if (expectedKey instanceof ECPrivateKey) {
+        if (expectedKey instanceof ECKey) {
+            assertTrue("Returned PrivateKey " + privKey.getClass() + " should be instanceof ECKey",
+                    privKey instanceof ECKey);
             assertEquals("Returned PrivateKey should be what we inserted",
-                    ((ECPrivateKey) expectedKey).getParams().getCurve(),
-                    ((ECPublicKey) pubKey).getParams().getCurve());
-        } else if (expectedKey instanceof RSAPrivateKey) {
+                    ((ECKey) expectedKey).getParams().getCurve(),
+                    ((ECKey) privKey).getParams().getCurve());
+        } else if (expectedKey instanceof RSAKey) {
+            assertTrue("Returned PrivateKey " + privKey.getClass() + " should be instanceof RSAKey",
+                    privKey instanceof RSAKey);
             assertEquals("Returned PrivateKey should be what we inserted",
-                    ((RSAPrivateKey) expectedKey).getModulus(),
-                    ((RSAPrivateKey) privKey).getModulus());
+                    ((RSAKey) expectedKey).getModulus(),
+                    ((RSAKey) privKey).getModulus());
         }
 
         assertNull("getFormat() should return null", privKey.getFormat());
@@ -1143,15 +1174,16 @@
         Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
         assertNotNull("Key should exist", key);
 
-        assertTrue("Should be a RSAPrivateKey", key instanceof RSAPrivateKey);
+        assertTrue("Should be a PrivateKey", key instanceof PrivateKey);
+        assertTrue("Should be a RSAKey", key instanceof RSAKey);
 
-        RSAPrivateKey actualKey = (RSAPrivateKey) key;
+        RSAKey actualKey = (RSAKey) key;
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
         PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
         assertEquals("Inserted key should be same as retrieved key",
-                ((RSAPrivateKey) expectedKey).getModulus(), actualKey.getModulus());
+                ((RSAKey) expectedKey).getModulus(), actualKey.getModulus());
     }
 
     public void testKeyStore_GetKey_Certificate_Unencrypted_Failure() throws Exception {
@@ -1855,7 +1887,7 @@
                 0x00, 0x05, (byte) 0xAA, (byte) 0x0A5, (byte) 0xFF, 0x55, 0x0A
         };
 
-        SecretKey expectedSecret = new SecretKeySpec(expectedKey, "AES");
+        SecretKey expectedSecret = new TransparentSecretKey(expectedKey, "AES");
 
         byte[] wrappedExpected = c.wrap(expectedSecret);
 
@@ -1893,14 +1925,17 @@
 
         kpg.generateKeyPair();
 
-        RSAPrivateKey key = (RSAPrivateKey) ks.getKey(alias, null);
-        assertNotNull(key);
-        String cipher = key.getAlgorithm() + "/NONE/NOPADDING";
+        PrivateKey privateKey = (PrivateKey) ks.getKey(alias, null);
+        assertNotNull(privateKey);
+        PublicKey publicKey = ks.getCertificate(alias).getPublicKey();
+        assertNotNull(publicKey);
+        String cipher = privateKey.getAlgorithm() + "/NONE/NOPADDING";
         Cipher encrypt = Cipher.getInstance(cipher);
         assertNotNull(encrypt);
-        encrypt.init(Cipher.ENCRYPT_MODE, key);
+        encrypt.init(Cipher.ENCRYPT_MODE, privateKey);
 
-        byte[] plainText = new byte[encrypt.getBlockSize()];
+        int modulusSizeBytes = (((RSAKey) publicKey).getModulus().bitLength() + 7) / 8;
+        byte[] plainText = new byte[modulusSizeBytes];
         Arrays.fill(plainText, (byte) 0xFF);
 
         // We expect a BadPaddingException here as the message size (plaintext)
@@ -1912,4 +1947,630 @@
             // pass on exception as it is expected
         }
     }
+
+    public void testKeyStore_PrivateKeyEntry_RSA_PublicKeyWorksWithCrypto()
+            throws Exception {
+        mKeyStore.load(null, null);
+        mKeyStore.setKeyEntry(TEST_ALIAS_2,
+                KeyFactory.getInstance("RSA").generatePrivate(
+                        new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1)),
+                null, // no password (it's not even supported)
+                new Certificate[] {generateCertificate(FAKE_RSA_USER_1)});
+        PublicKey publicKey = mKeyStore.getCertificate(TEST_ALIAS_2).getPublicKey();
+        assertNotNull(publicKey);
+
+        Signature.getInstance("SHA256withRSA").initVerify(publicKey);
+        Signature.getInstance("NONEwithRSA").initVerify(publicKey);
+        Signature.getInstance("SHA256withRSA/PSS").initVerify(publicKey);
+
+        Cipher.getInstance("RSA/ECB/PKCS1Padding").init(Cipher.ENCRYPT_MODE, publicKey);
+        Cipher.getInstance("RSA/ECB/NoPadding").init(Cipher.ENCRYPT_MODE, publicKey);
+        Cipher.getInstance("RSA/ECB/OAEPPadding").init(Cipher.ENCRYPT_MODE, publicKey);
+    }
+
+    public void testKeyStore_PrivateKeyEntry_EC_PublicKeyWorksWithCrypto()
+            throws Exception {
+        mKeyStore.load(null, null);
+        mKeyStore.setKeyEntry(TEST_ALIAS_1,
+                KeyFactory.getInstance("EC").generatePrivate(
+                        new PKCS8EncodedKeySpec(FAKE_EC_KEY_1)),
+                null, // no password (it's not even supported)
+                new Certificate[] {generateCertificate(FAKE_EC_USER_1)});
+        PublicKey publicKey = mKeyStore.getCertificate(TEST_ALIAS_1).getPublicKey();
+        assertNotNull(publicKey);
+
+        Signature.getInstance("SHA256withECDSA").initVerify(publicKey);
+        Signature.getInstance("NONEwithECDSA").initVerify(publicKey);
+    }
+
+    public void testKeyStore_TrustedCertificateEntry_RSA_PublicKeyWorksWithCrypto()
+            throws Exception {
+        mKeyStore.load(null, null);
+        mKeyStore.setCertificateEntry(TEST_ALIAS_2, generateCertificate(FAKE_RSA_USER_1));
+        PublicKey publicKey = mKeyStore.getCertificate(TEST_ALIAS_2).getPublicKey();
+        assertNotNull(publicKey);
+
+        Signature.getInstance("SHA256withRSA").initVerify(publicKey);
+        Signature.getInstance("NONEwithRSA").initVerify(publicKey);
+
+        Cipher.getInstance("RSA/ECB/PKCS1Padding").init(Cipher.ENCRYPT_MODE, publicKey);
+        Cipher.getInstance("RSA/ECB/NoPadding").init(Cipher.ENCRYPT_MODE, publicKey);
+    }
+
+    public void testKeyStore_TrustedCertificateEntry_EC_PublicKeyWorksWithCrypto()
+            throws Exception {
+        mKeyStore.load(null, null);
+        mKeyStore.setCertificateEntry(TEST_ALIAS_1, generateCertificate(FAKE_EC_USER_1));
+        PublicKey publicKey = mKeyStore.getCertificate(TEST_ALIAS_1).getPublicKey();
+        assertNotNull(publicKey);
+
+        Signature.getInstance("SHA256withECDSA").initVerify(publicKey);
+        Signature.getInstance("NONEwithECDSA").initVerify(publicKey);
+    }
+
+    private static final int MIN_SUPPORTED_KEY_COUNT = 1500;
+    private static final long MINUTE_IN_MILLIS = 1000 * 60;
+    private static final long LARGE_NUMBER_OF_KEYS_TEST_MAX_DURATION_MILLIS = 2 * MINUTE_IN_MILLIS;
+
+    private static boolean isDeadlineReached(long startTimeMillis, long durationMillis) {
+        long nowMillis = System.currentTimeMillis();
+        if (nowMillis < startTimeMillis) {
+            return true;
+        }
+        return nowMillis - startTimeMillis > durationMillis;
+    }
+
+    @LargeTest
+    public void testKeyStore_LargeNumberOfKeysSupported_RSA() throws Exception {
+        // This test imports key1, then lots of other keys, then key2, and then confirms that
+        // key1 and key2 backed by Android Keystore work fine. The assumption is that if the
+        // underlying implementation has a limit on the number of keys, it'll either delete the
+        // oldest key (key1), or will refuse to add keys (key2).
+        // The test imports as many keys as it can in a fixed amount of time instead of stopping
+        // at MIN_SUPPORTED_KEY_COUNT to balance the desire to support an unlimited number of keys
+        // with the constraints on how long the test can run and performance differences of hardware
+        // under test.
+
+        long testStartTimeMillis = System.currentTimeMillis();
+
+        Certificate cert1 = TestUtils.getRawResX509Certificate(getContext(), R.raw.rsa_key1_cert);
+        PrivateKey privateKey1 = TestUtils.getRawResPrivateKey(getContext(), R.raw.rsa_key1_pkcs8);
+        String entryName1 = "test0";
+
+        Certificate cert2 = TestUtils.getRawResX509Certificate(getContext(), R.raw.rsa_key2_cert);
+        PrivateKey privateKey2 = TestUtils.getRawResPrivateKey(getContext(), R.raw.rsa_key2_pkcs8);
+
+        Certificate cert3 = generateCertificate(FAKE_RSA_USER_1);
+        PrivateKey privateKey3 = generatePrivateKey("RSA", FAKE_RSA_KEY_1);
+
+        mKeyStore.load(null);
+        int latestImportedEntryNumber = 0;
+        try {
+            KeyProtection protectionParams = new KeyProtection.Builder(
+                    KeyProperties.PURPOSE_SIGN)
+                    .setDigests(KeyProperties.DIGEST_SHA256)
+                    .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
+                    .build();
+            mKeyStore.setEntry(entryName1,
+                    new KeyStore.PrivateKeyEntry(privateKey1, new Certificate[] {cert1}),
+                    protectionParams);
+
+            // Import key3 lots of times, under different aliases.
+            while (!isDeadlineReached(
+                    testStartTimeMillis, LARGE_NUMBER_OF_KEYS_TEST_MAX_DURATION_MILLIS)) {
+                latestImportedEntryNumber++;
+                if ((latestImportedEntryNumber % 1000) == 0) {
+                    Log.i(TAG, "Imported " + latestImportedEntryNumber + " keys");
+                }
+                String entryAlias = "test" + latestImportedEntryNumber;
+                try {
+                    mKeyStore.setEntry(entryAlias,
+                            new KeyStore.PrivateKeyEntry(privateKey3, new Certificate[] {cert3}),
+                            protectionParams);
+                } catch (Throwable e) {
+                    throw new RuntimeException("Entry " + entryAlias + " import failed", e);
+                }
+            }
+            Log.i(TAG, "Imported " + latestImportedEntryNumber + " keys");
+            if (latestImportedEntryNumber < MIN_SUPPORTED_KEY_COUNT) {
+                fail("Failed to import " + MIN_SUPPORTED_KEY_COUNT + " keys in "
+                        + (System.currentTimeMillis() - testStartTimeMillis)
+                        + " ms. Imported: " + latestImportedEntryNumber + " keys");
+            }
+
+            latestImportedEntryNumber++;
+            String entryName2 = "test" + latestImportedEntryNumber;
+            mKeyStore.setEntry(entryName2,
+                    new KeyStore.PrivateKeyEntry(privateKey2, new Certificate[] {cert2}),
+                    protectionParams);
+            PrivateKey keystorePrivateKey2 = (PrivateKey) mKeyStore.getKey(entryName2, null);
+            PrivateKey keystorePrivateKey1 = (PrivateKey) mKeyStore.getKey(entryName1, null);
+
+            byte[] message = "This is a test".getBytes("UTF-8");
+
+            Signature sig = Signature.getInstance("SHA256withRSA");
+            sig.initSign(keystorePrivateKey1);
+            sig.update(message);
+            byte[] signature = sig.sign();
+            sig = Signature.getInstance(sig.getAlgorithm());
+            sig.initVerify(cert1.getPublicKey());
+            sig.update(message);
+            assertTrue(sig.verify(signature));
+
+            sig = Signature.getInstance(sig.getAlgorithm());
+            sig.initSign(keystorePrivateKey2);
+            sig.update(message);
+            signature = sig.sign();
+            sig = Signature.getInstance(sig.getAlgorithm());
+            sig.initVerify(cert2.getPublicKey());
+            sig.update(message);
+            assertTrue(sig.verify(signature));
+        } finally {
+            // Clean up Keystore without using KeyStore.aliases() which can't handle this many
+            // entries.
+            Log.i(TAG, "Deleting imported keys");
+            for (int i = 0; i <= latestImportedEntryNumber; i++) {
+                if ((i > 0) && ((i % 1000) == 0)) {
+                    Log.i(TAG, "Deleted " + i + " keys");
+                }
+                mKeyStore.deleteEntry("test" + i);
+            }
+            Log.i(TAG, "Deleted " + (latestImportedEntryNumber + 1) + " keys");
+        }
+    }
+
+    @LargeTest
+    public void testKeyStore_LargeNumberOfKeysSupported_EC() throws Exception {
+        // This test imports key1, then lots of other keys, then key2, and then confirms that
+        // key1 and key2 backed by Android Keystore work fine. The assumption is that if the
+        // underlying implementation has a limit on the number of keys, it'll either delete the
+        // oldest key (key1), or will refuse to add keys (key2).
+        // The test imports as many keys as it can in a fixed amount of time instead of stopping
+        // at MIN_SUPPORTED_KEY_COUNT to balance the desire to support an unlimited number of keys
+        // with the constraints on how long the test can run and performance differences of hardware
+        // under test.
+
+        long testStartTimeMillis = System.currentTimeMillis();
+
+        Certificate cert1 = TestUtils.getRawResX509Certificate(getContext(), R.raw.ec_key1_cert);
+        PrivateKey privateKey1 = TestUtils.getRawResPrivateKey(getContext(), R.raw.ec_key1_pkcs8);
+        String entryName1 = "test0";
+
+        Certificate cert2 = TestUtils.getRawResX509Certificate(getContext(), R.raw.ec_key2_cert);
+        PrivateKey privateKey2 = TestUtils.getRawResPrivateKey(getContext(), R.raw.ec_key2_pkcs8);
+
+        Certificate cert3 = generateCertificate(FAKE_EC_USER_1);
+        PrivateKey privateKey3 = generatePrivateKey("EC", FAKE_EC_KEY_1);
+
+        mKeyStore.load(null);
+        int latestImportedEntryNumber = 0;
+        try {
+            KeyProtection protectionParams = new KeyProtection.Builder(
+                    KeyProperties.PURPOSE_SIGN)
+                    .setDigests(KeyProperties.DIGEST_SHA256)
+                    .build();
+            mKeyStore.setEntry(entryName1,
+                    new KeyStore.PrivateKeyEntry(privateKey1, new Certificate[] {cert1}),
+                    protectionParams);
+
+            // Import key3 lots of times, under different aliases.
+            while (!isDeadlineReached(
+                    testStartTimeMillis, LARGE_NUMBER_OF_KEYS_TEST_MAX_DURATION_MILLIS)) {
+                latestImportedEntryNumber++;
+                if ((latestImportedEntryNumber % 1000) == 0) {
+                    Log.i(TAG, "Imported " + latestImportedEntryNumber + " keys");
+                }
+                String entryAlias = "test" + latestImportedEntryNumber;
+                try {
+                    mKeyStore.setEntry(entryAlias,
+                            new KeyStore.PrivateKeyEntry(privateKey3, new Certificate[] {cert3}),
+                            protectionParams);
+                } catch (Throwable e) {
+                    throw new RuntimeException("Entry " + entryAlias + " import failed", e);
+                }
+            }
+            Log.i(TAG, "Imported " + latestImportedEntryNumber + " keys");
+            if (latestImportedEntryNumber < MIN_SUPPORTED_KEY_COUNT) {
+                fail("Failed to import " + MIN_SUPPORTED_KEY_COUNT + " keys in "
+                        + (System.currentTimeMillis() - testStartTimeMillis)
+                        + " ms. Imported: " + latestImportedEntryNumber + " keys");
+            }
+
+            latestImportedEntryNumber++;
+            String entryName2 = "test" + latestImportedEntryNumber;
+            mKeyStore.setEntry(entryName2,
+                    new KeyStore.PrivateKeyEntry(privateKey2, new Certificate[] {cert2}),
+                    protectionParams);
+            PrivateKey keystorePrivateKey2 = (PrivateKey) mKeyStore.getKey(entryName2, null);
+            PrivateKey keystorePrivateKey1 = (PrivateKey) mKeyStore.getKey(entryName1, null);
+
+            byte[] message = "This is a test".getBytes("UTF-8");
+
+            Signature sig = Signature.getInstance("SHA256withECDSA");
+            sig.initSign(keystorePrivateKey1);
+            sig.update(message);
+            byte[] signature = sig.sign();
+            sig = Signature.getInstance(sig.getAlgorithm());
+            sig.initVerify(cert1.getPublicKey());
+            sig.update(message);
+            assertTrue(sig.verify(signature));
+
+            sig = Signature.getInstance(sig.getAlgorithm());
+            sig.initSign(keystorePrivateKey2);
+            sig.update(message);
+            signature = sig.sign();
+            sig = Signature.getInstance(sig.getAlgorithm());
+            sig.initVerify(cert2.getPublicKey());
+            sig.update(message);
+            assertTrue(sig.verify(signature));
+        } finally {
+            // Clean up Keystore without using KeyStore.aliases() which can't handle this many
+            // entries.
+            Log.i(TAG, "Deleting imported keys");
+            for (int i = 0; i <= latestImportedEntryNumber; i++) {
+                if ((i > 0) && ((i % 1000) == 0)) {
+                    Log.i(TAG, "Deleted " + i + " keys");
+                }
+                mKeyStore.deleteEntry("test" + i);
+            }
+            Log.i(TAG, "Deleted " + (latestImportedEntryNumber + 1) + " keys");
+        }
+    }
+
+    @LargeTest
+    public void testKeyStore_LargeNumberOfKeysSupported_AES() throws Exception {
+        // This test imports key1, then lots of other keys, then key2, and then confirms that
+        // key1 and key2 backed by Android Keystore work fine. The assumption is that if the
+        // underlying implementation has a limit on the number of keys, it'll either delete the
+        // oldest key (key1), or will refuse to add keys (key2).
+        // The test imports as many keys as it can in a fixed amount of time instead of stopping
+        // at MIN_SUPPORTED_KEY_COUNT to balance the desire to support an unlimited number of keys
+        // with the constraints on how long the test can run and performance differences of hardware
+        // under test.
+
+        long testStartTimeMillis = System.currentTimeMillis();
+
+        SecretKey key1 = new TransparentSecretKey(
+                HexEncoding.decode("010203040506070809fafbfcfdfeffcc"), "AES");
+        String entryName1 = "test0";
+
+        SecretKey key2 = new TransparentSecretKey(
+                HexEncoding.decode("808182838485868788897a7b7c7d7e7f"), "AES");
+
+        SecretKey key3 = new TransparentSecretKey(
+                HexEncoding.decode("33333333333333333333777777777777"), "AES");
+
+        mKeyStore.load(null);
+        int latestImportedEntryNumber = 0;
+        try {
+            KeyProtection protectionParams = new KeyProtection.Builder(
+                    KeyProperties.PURPOSE_ENCRYPT)
+                    .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
+                    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
+                    .build();
+            mKeyStore.setEntry(entryName1, new KeyStore.SecretKeyEntry(key1), protectionParams);
+
+            // Import key3 lots of times, under different aliases.
+            while (!isDeadlineReached(
+                    testStartTimeMillis, LARGE_NUMBER_OF_KEYS_TEST_MAX_DURATION_MILLIS)) {
+                latestImportedEntryNumber++;
+                if ((latestImportedEntryNumber % 1000) == 0) {
+                    Log.i(TAG, "Imported " + latestImportedEntryNumber + " keys");
+                }
+                String entryAlias = "test" + latestImportedEntryNumber;
+                try {
+                    mKeyStore.setEntry(entryAlias,
+                            new KeyStore.SecretKeyEntry(key3), protectionParams);
+                } catch (Throwable e) {
+                    throw new RuntimeException("Entry " + entryAlias + " import failed", e);
+                }
+            }
+            Log.i(TAG, "Imported " + latestImportedEntryNumber + " keys");
+            if (latestImportedEntryNumber < MIN_SUPPORTED_KEY_COUNT) {
+                fail("Failed to import " + MIN_SUPPORTED_KEY_COUNT + " keys in "
+                        + (System.currentTimeMillis() - testStartTimeMillis)
+                        + " ms. Imported: " + latestImportedEntryNumber + " keys");
+            }
+
+            latestImportedEntryNumber++;
+            String entryName2 = "test" + latestImportedEntryNumber;
+            mKeyStore.setEntry(entryName2, new KeyStore.SecretKeyEntry(key2), protectionParams);
+            SecretKey keystoreKey2 = (SecretKey) mKeyStore.getKey(entryName2, null);
+            SecretKey keystoreKey1 = (SecretKey) mKeyStore.getKey(entryName1, null);
+
+            byte[] plaintext = "This is a test".getBytes("UTF-8");
+            Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
+            cipher.init(Cipher.ENCRYPT_MODE, keystoreKey1);
+            byte[] ciphertext = cipher.doFinal(plaintext);
+            AlgorithmParameters cipherParams = cipher.getParameters();
+            cipher = Cipher.getInstance(cipher.getAlgorithm());
+            cipher.init(Cipher.DECRYPT_MODE, key1, cipherParams);
+            MoreAsserts.assertEquals(plaintext, cipher.doFinal(ciphertext));
+
+            cipher = Cipher.getInstance(cipher.getAlgorithm());
+            cipher.init(Cipher.ENCRYPT_MODE, keystoreKey2);
+            ciphertext = cipher.doFinal(plaintext);
+            cipherParams = cipher.getParameters();
+            cipher = Cipher.getInstance(cipher.getAlgorithm());
+            cipher.init(Cipher.DECRYPT_MODE, key2, cipherParams);
+            MoreAsserts.assertEquals(plaintext, cipher.doFinal(ciphertext));
+        } finally {
+            // Clean up Keystore without using KeyStore.aliases() which can't handle this many
+            // entries.
+            Log.i(TAG, "Deleting imported keys");
+            for (int i = 0; i <= latestImportedEntryNumber; i++) {
+                if ((i > 0) && ((i % 1000) == 0)) {
+                    Log.i(TAG, "Deleted " + i + " keys");
+                }
+                mKeyStore.deleteEntry("test" + i);
+            }
+            Log.i(TAG, "Deleted " + (latestImportedEntryNumber + 1) + " keys");
+        }
+    }
+
+    @LargeTest
+    public void testKeyStore_LargeNumberOfKeysSupported_HMAC() throws Exception {
+        // This test imports key1, then lots of other keys, then key2, and then confirms that
+        // key1 and key2 backed by Android Keystore work fine. The assumption is that if the
+        // underlying implementation has a limit on the number of keys, it'll either delete the
+        // oldest key (key1), or will refuse to add keys (key2).
+        // The test imports as many keys as it can in a fixed amount of time instead of stopping
+        // at MIN_SUPPORTED_KEY_COUNT to balance the desire to support an unlimited number of keys
+        // with the constraints on how long the test can run and performance differences of hardware
+        // under test.
+
+        long testStartTimeMillis = System.currentTimeMillis();
+
+        SecretKey key1 = new TransparentSecretKey(
+                HexEncoding.decode("010203040506070809fafbfcfdfeffcc"), "HmacSHA256");
+        String entryName1 = "test0";
+
+        SecretKey key2 = new TransparentSecretKey(
+                HexEncoding.decode("808182838485868788897a7b7c7d7e7f"), "HmacSHA256");
+
+        SecretKey key3 = new TransparentSecretKey(
+                HexEncoding.decode("33333333333333333333777777777777"), "HmacSHA256");
+
+        mKeyStore.load(null);
+        int latestImportedEntryNumber = 0;
+        try {
+            KeyProtection protectionParams = new KeyProtection.Builder(
+                    KeyProperties.PURPOSE_SIGN)
+                    .build();
+            mKeyStore.setEntry(entryName1, new KeyStore.SecretKeyEntry(key1), protectionParams);
+
+            // Import key3 lots of times, under different aliases.
+            while (!isDeadlineReached(
+                    testStartTimeMillis, LARGE_NUMBER_OF_KEYS_TEST_MAX_DURATION_MILLIS)) {
+                latestImportedEntryNumber++;
+                if ((latestImportedEntryNumber % 1000) == 0) {
+                    Log.i(TAG, "Imported " + latestImportedEntryNumber + " keys");
+                }
+                String entryAlias = "test" + latestImportedEntryNumber;
+                try {
+                    mKeyStore.setEntry(entryAlias,
+                            new KeyStore.SecretKeyEntry(key3), protectionParams);
+                } catch (Throwable e) {
+                    throw new RuntimeException("Entry " + entryAlias + " import failed", e);
+                }
+            }
+            Log.i(TAG, "Imported " + latestImportedEntryNumber + " keys");
+            if (latestImportedEntryNumber < MIN_SUPPORTED_KEY_COUNT) {
+                fail("Failed to import " + MIN_SUPPORTED_KEY_COUNT + " keys in "
+                        + (System.currentTimeMillis() - testStartTimeMillis)
+                        + " ms. Imported: " + latestImportedEntryNumber + " keys");
+            }
+
+            latestImportedEntryNumber++;
+            String entryName2 = "test" + latestImportedEntryNumber;
+            mKeyStore.setEntry(entryName2, new KeyStore.SecretKeyEntry(key2), protectionParams);
+            SecretKey keystoreKey2 = (SecretKey) mKeyStore.getKey(entryName2, null);
+            SecretKey keystoreKey1 = (SecretKey) mKeyStore.getKey(entryName1, null);
+
+            byte[] message = "This is a test".getBytes("UTF-8");
+            Mac mac = Mac.getInstance(key1.getAlgorithm());
+            mac.init(keystoreKey1);
+            MoreAsserts.assertEquals(
+                    HexEncoding.decode(
+                            "905e36f5a175f4ca54ad56b860b46f6502f883a90628dca2d33a953fb7224eaf"),
+                    mac.doFinal(message));
+
+            mac = Mac.getInstance(key2.getAlgorithm());
+            mac.init(keystoreKey2);
+            MoreAsserts.assertEquals(
+                    HexEncoding.decode(
+                            "59b57e77e4e2cb36b5c7b84af198ac004327bc549de6931a1b5505372dd8c957"),
+                    mac.doFinal(message));
+        } finally {
+            // Clean up Keystore without using KeyStore.aliases() which can't handle this many
+            // entries.
+            Log.i(TAG, "Deleting imported keys");
+            for (int i = 0; i <= latestImportedEntryNumber; i++) {
+                if ((i > 0) && ((i % 1000) == 0)) {
+                    Log.i(TAG, "Deleted " + i + " keys");
+                }
+                mKeyStore.deleteEntry("test" + i);
+            }
+            Log.i(TAG, "Deleted " + (latestImportedEntryNumber + 1) + " keys");
+        }
+    }
+
+    public void testKeyStore_OnlyOneDigestCanBeAuthorized_HMAC() throws Exception {
+        mKeyStore.load(null);
+
+        for (String algorithm : KeyGeneratorTest.EXPECTED_ALGORITHMS) {
+            if (!TestUtils.isHmacAlgorithm(algorithm)) {
+                continue;
+            }
+            try {
+                String digest = TestUtils.getHmacAlgorithmDigest(algorithm);
+                assertNotNull(digest);
+                SecretKey keyBeingImported = new TransparentSecretKey(new byte[16], algorithm);
+
+                KeyProtection.Builder goodSpec =
+                        new KeyProtection.Builder(KeyProperties.PURPOSE_SIGN);
+
+                // Digests authorization not specified in import parameters
+                assertFalse(goodSpec.build().isDigestsSpecified());
+                mKeyStore.setEntry(TEST_ALIAS_1,
+                        new KeyStore.SecretKeyEntry(keyBeingImported),
+                        goodSpec.build());
+                SecretKey key = (SecretKey) mKeyStore.getKey(TEST_ALIAS_1, null);
+                TestUtils.assertContentsInAnyOrder(
+                        Arrays.asList(TestUtils.getKeyInfo(key).getDigests()), digest);
+
+                // The same digest is specified in import parameters
+                mKeyStore.setEntry(TEST_ALIAS_1,
+                        new KeyStore.SecretKeyEntry(keyBeingImported),
+                        TestUtils.buildUpon(goodSpec).setDigests(digest).build());
+                key = (SecretKey) mKeyStore.getKey(TEST_ALIAS_1, null);
+                TestUtils.assertContentsInAnyOrder(
+                        Arrays.asList(TestUtils.getKeyInfo(key).getDigests()), digest);
+
+                // Empty set of digests specified in import parameters
+                try {
+                    mKeyStore.setEntry(TEST_ALIAS_1,
+                            new KeyStore.SecretKeyEntry(keyBeingImported),
+                            TestUtils.buildUpon(goodSpec).setDigests().build());
+                    fail();
+                } catch (KeyStoreException expected) {}
+
+                // A different digest specified in import parameters
+                String anotherDigest = "SHA-256".equalsIgnoreCase(digest) ? "SHA-384" : "SHA-256";
+                try {
+                    mKeyStore.setEntry(TEST_ALIAS_1,
+                            new KeyStore.SecretKeyEntry(keyBeingImported),
+                            TestUtils.buildUpon(goodSpec).setDigests(anotherDigest).build());
+                    fail();
+                } catch (KeyStoreException expected) {}
+                try {
+                    mKeyStore.setEntry(TEST_ALIAS_1,
+                            new KeyStore.SecretKeyEntry(keyBeingImported),
+                            TestUtils.buildUpon(goodSpec)
+                                    .setDigests(digest, anotherDigest)
+                                    .build());
+                    fail();
+                } catch (KeyStoreException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testKeyStore_ImportSupportedSizes_AES() throws Exception {
+        mKeyStore.load(null);
+
+        KeyProtection params = new KeyProtection.Builder(
+                KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
+                .build();
+        String alias = "test1";
+        mKeyStore.deleteEntry(alias);
+        assertFalse(mKeyStore.containsAlias(alias));
+        for (int keySizeBytes = 0; keySizeBytes <= 512 / 8; keySizeBytes++) {
+            int keySizeBits = keySizeBytes * 8;
+            try {
+                KeyStore.SecretKeyEntry entry = new KeyStore.SecretKeyEntry(
+                        new TransparentSecretKey(new byte[keySizeBytes], "AES"));
+                if (TestUtils.contains(KeyGeneratorTest.AES_SUPPORTED_KEY_SIZES, keySizeBits)) {
+                    mKeyStore.setEntry(alias, entry, params);
+                    SecretKey key = (SecretKey) mKeyStore.getKey(alias, null);
+                    assertEquals("AES", key.getAlgorithm());
+                    assertEquals(keySizeBits, TestUtils.getKeyInfo(key).getKeySize());
+                } else {
+                    mKeyStore.deleteEntry(alias);
+                    assertFalse(mKeyStore.containsAlias(alias));
+                    try {
+                        mKeyStore.setEntry(alias, entry, params);
+                        fail();
+                    } catch (KeyStoreException expected) {}
+                    assertFalse(mKeyStore.containsAlias(alias));
+                }
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for key size " + keySizeBits, e);
+            }
+        }
+    }
+
+    public void testKeyStore_ImportSupportedSizes_HMAC() throws Exception {
+        mKeyStore.load(null);
+
+        KeyProtection params = new KeyProtection.Builder(KeyProperties.PURPOSE_SIGN).build();
+        String alias = "test1";
+        mKeyStore.deleteEntry(alias);
+        assertFalse(mKeyStore.containsAlias(alias));
+        for (String algorithm : KeyGeneratorTest.EXPECTED_ALGORITHMS) {
+            if (!TestUtils.isHmacAlgorithm(algorithm)) {
+                continue;
+            }
+            for (int keySizeBytes = 0; keySizeBytes <= 1024 / 8; keySizeBytes++) {
+                try {
+                    KeyStore.SecretKeyEntry entry = new KeyStore.SecretKeyEntry(
+                            new TransparentSecretKey(new byte[keySizeBytes], algorithm));
+                    if (keySizeBytes > 0) {
+                        mKeyStore.setEntry(alias, entry, params);
+                        SecretKey key = (SecretKey) mKeyStore.getKey(alias, null);
+                        assertEquals(algorithm, key.getAlgorithm());
+                        assertEquals(keySizeBytes * 8, TestUtils.getKeyInfo(key).getKeySize());
+                    } else {
+                        mKeyStore.deleteEntry(alias);
+                        assertFalse(mKeyStore.containsAlias(alias));
+                        try {
+                            mKeyStore.setEntry(alias, entry, params);
+                            fail();
+                        } catch (KeyStoreException expected) {}
+                    }
+                } catch (Throwable e) {
+                    throw new RuntimeException(
+                            "Failed for " + algorithm + " with key size " + (keySizeBytes * 8), e);
+                }
+            }
+        }
+    }
+
+    public void testKeyStore_ImportSupportedSizes_EC() throws Exception {
+        mKeyStore.load(null);
+        KeyProtection params =
+                TestUtils.getMinimalWorkingImportParametersForSigningingWith("SHA256withECDSA");
+        checkKeyPairImportSucceeds(
+                "secp224r1", R.raw.ec_key3_secp224r1_pkcs8, R.raw.ec_key3_secp224r1_cert, params);
+        checkKeyPairImportSucceeds(
+                "secp256r1", R.raw.ec_key4_secp256r1_pkcs8, R.raw.ec_key4_secp256r1_cert, params);
+        checkKeyPairImportSucceeds(
+                "secp384r1", R.raw.ec_key5_secp384r1_pkcs8, R.raw.ec_key5_secp384r1_cert, params);
+        checkKeyPairImportSucceeds(
+                "secp512r1", R.raw.ec_key6_secp521r1_pkcs8, R.raw.ec_key6_secp521r1_cert, params);
+    }
+
+    public void testKeyStore_ImportSupportedSizes_RSA() throws Exception {
+        mKeyStore.load(null);
+        KeyProtection params =
+                TestUtils.getMinimalWorkingImportParametersForSigningingWith("SHA256withRSA");
+        checkKeyPairImportSucceeds(
+                "512", R.raw.rsa_key5_512_pkcs8, R.raw.rsa_key5_512_cert, params);
+        checkKeyPairImportSucceeds(
+                "768", R.raw.rsa_key6_768_pkcs8, R.raw.rsa_key6_768_cert, params);
+        checkKeyPairImportSucceeds(
+                "1024", R.raw.rsa_key3_1024_pkcs8, R.raw.rsa_key3_1024_cert, params);
+        checkKeyPairImportSucceeds(
+                "2048", R.raw.rsa_key8_2048_pkcs8, R.raw.rsa_key8_2048_cert, params);
+        checkKeyPairImportSucceeds(
+                "3072", R.raw.rsa_key7_3072_pksc8, R.raw.rsa_key7_3072_cert, params);
+        checkKeyPairImportSucceeds(
+                "4096", R.raw.rsa_key4_4096_pkcs8, R.raw.rsa_key4_4096_cert, params);
+    }
+
+    private void checkKeyPairImportSucceeds(
+            String alias, int privateResId, int certResId, KeyProtection params) throws Exception {
+        try {
+            mKeyStore.deleteEntry(alias);
+            TestUtils.importIntoAndroidKeyStore(
+                    alias, getContext(), privateResId, certResId, params);
+        } catch (Throwable e) {
+            throw new RuntimeException("Failed for " + alias, e);
+        } finally {
+            try {
+                mKeyStore.deleteEntry(alias);
+            } catch (Exception ignored) {}
+        }
+    }
 }
diff --git a/tests/tests/keystore/src/android/keystore/cts/BlockCipherTestBase.java b/tests/tests/keystore/src/android/keystore/cts/BlockCipherTestBase.java
new file mode 100644
index 0000000..197adc2
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/BlockCipherTestBase.java
@@ -0,0 +1,1645 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+import android.security.keystore.KeyProperties;
+import android.security.keystore.KeyProtection;
+import android.test.AndroidTestCase;
+
+import junit.framework.AssertionFailedError;
+
+import java.nio.Buffer;
+import java.nio.ByteBuffer;
+import java.security.AlgorithmParameters;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.Key;
+import java.security.KeyStore;
+import java.security.NoSuchAlgorithmException;
+import java.security.Provider;
+import java.security.SecureRandom;
+import java.security.Security;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.InvalidParameterSpecException;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.Locale;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.SecretKey;
+import javax.crypto.ShortBufferException;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+abstract class BlockCipherTestBase extends AndroidTestCase {
+
+    private KeyStore mAndroidKeyStore;
+    private int mNextKeyId;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mAndroidKeyStore = KeyStore.getInstance("AndroidKeyStore");
+        mAndroidKeyStore.load(null);
+        for (Enumeration<String> e = mAndroidKeyStore.aliases(); e.hasMoreElements();) {
+            mAndroidKeyStore.deleteEntry(e.nextElement());
+        }
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        try {
+            for (Enumeration<String> e = mAndroidKeyStore.aliases(); e.hasMoreElements();) {
+                mAndroidKeyStore.deleteEntry(e.nextElement());
+            }
+        } finally {
+            super.tearDown();
+        }
+    }
+
+    protected abstract String getTransformation();
+    protected abstract int getBlockSize();
+
+    protected abstract byte[] getKatKey();
+    protected abstract byte[] getKatIv();
+    protected abstract AlgorithmParameterSpec getKatAlgorithmParameterSpec();
+    protected abstract byte[] getKatPlaintext();
+    protected abstract byte[] getKatCiphertext();
+    protected abstract int getKatAuthenticationTagLengthBytes();
+    protected abstract boolean isStreamCipher();
+    protected abstract boolean isAuthenticatedCipher();
+
+    protected abstract byte[] getIv(AlgorithmParameters params)
+            throws InvalidParameterSpecException;
+
+    private byte[] getKatInput(int opmode) {
+        switch (opmode) {
+            case Cipher.ENCRYPT_MODE:
+                return getKatPlaintext();
+            case Cipher.DECRYPT_MODE:
+                return getKatCiphertext();
+            default:
+                throw new IllegalArgumentException("Invalid opmode: " + opmode);
+        }
+    }
+
+    private byte[] getKatOutput(int opmode) {
+        switch (opmode) {
+            case Cipher.ENCRYPT_MODE:
+                return getKatCiphertext();
+            case Cipher.DECRYPT_MODE:
+                return getKatPlaintext();
+            default:
+                throw new IllegalArgumentException("Invalid opmode: " + opmode);
+        }
+    }
+
+    private Cipher mCipher;
+    private int mOpmode;
+
+    public void testGetAlgorithm() throws Exception {
+        createCipher();
+        assertEquals(getTransformation(), mCipher.getAlgorithm());
+    }
+
+    public void testGetProvider() throws Exception {
+        createCipher();
+        Provider expectedProvider = Security.getProvider("AndroidKeyStoreBCWorkaround");
+        assertSame(expectedProvider, mCipher.getProvider());
+    }
+
+    public void testGetBlockSize() throws Exception {
+        createCipher();
+        assertEquals(getBlockSize(), mCipher.getBlockSize());
+    }
+
+    public void testGetExemptionMechanism() throws Exception {
+        createCipher();
+        assertNull(mCipher.getExemptionMechanism());
+    }
+
+    public void testGetParameters() throws Exception {
+        createCipher();
+        assertAlgoritmParametersIv(null);
+
+        initKat(Cipher.ENCRYPT_MODE);
+        assertAlgoritmParametersIv(getKatIv());
+        doFinal(getKatPlaintext());
+        assertAlgoritmParametersIv(getKatIv());
+
+        initKat(Cipher.DECRYPT_MODE);
+        assertAlgoritmParametersIv(getKatIv());
+        doFinal(getKatCiphertext());
+        assertAlgoritmParametersIv(getKatIv());
+    }
+
+    private void assertAlgoritmParametersIv(byte[] expectedIv)
+            throws InvalidParameterSpecException {
+        AlgorithmParameters actualParameters = mCipher.getParameters();
+        if (expectedIv == null) {
+            assertNull(actualParameters);
+        } else {
+            byte[] actualIv = getIv(actualParameters);
+            assertEquals(expectedIv, actualIv);
+        }
+    }
+
+    public void testGetOutputSizeInEncryptionMode() throws Exception {
+        int blockSize = getBlockSize();
+        createCipher();
+        try {
+            mCipher.getOutputSize(blockSize);
+            fail();
+        } catch (IllegalStateException expected) {}
+
+        initKat(Cipher.ENCRYPT_MODE);
+        if (isAuthenticatedCipher()) {
+            // Authenticated ciphers do not return any output when decrypting until doFinal where
+            // ciphertext is authenticated.
+            for (int input = 0; input <= blockSize * 2; input++) {
+                int actualOutputSize = mCipher.getOutputSize(input);
+                int expectedOutputSize = input + getKatAuthenticationTagLengthBytes();
+                if (actualOutputSize < expectedOutputSize) {
+                    fail("getOutputSize(" + expectedOutputSize + ") underestimated output size"
+                            + ". min expected: <" + expectedOutputSize
+                            + ">, actual: <" + actualOutputSize + ">");
+                }
+            }
+            return;
+        } else if (isStreamCipher()) {
+            // Unauthenticated stream ciphers do not buffer input or output.
+            for (int input = 0; input <= blockSize * 2; input++) {
+                int actualOutputSize = mCipher.getOutputSize(input);
+                if (actualOutputSize < input) {
+                    fail("getOutputSize(" + input + ") underestimated output size. min expected: <"
+                            + input + ">, actual: <" + actualOutputSize + ">");
+                }
+            }
+            return;
+        }
+        // Not a stream cipher -- input may be buffered.
+
+        for (int buffered = 0; buffered < blockSize; buffered++) {
+            // Assert that the output of getOutputSize is not lower than the minimum expected.
+            for (int input = 0; input <= blockSize * 2; input++) {
+                int inputInclBuffered = buffered + input;
+                // doFinal dominates the output size.
+                // One full plaintext block results in one ciphertext block.
+                int minExpectedOutputSize = inputInclBuffered - (inputInclBuffered % blockSize);
+                if (isPaddingEnabled()) {
+                    // Regardless of whether there is a partial input block, an additional block of
+                    // ciphertext should be output.
+                    minExpectedOutputSize += blockSize;
+                } else {
+                    // When no padding is enabled, any remaining partial block of plaintext will
+                    // cause an error. Thus, there's no need to account for its ciphertext.
+                }
+                int actualOutputSize = mCipher.getOutputSize(input);
+                if (actualOutputSize < minExpectedOutputSize) {
+                    fail("getOutputSize(" + input + ") underestimated output size when buffered == "
+                            + buffered + ". min expected: <"
+                            + minExpectedOutputSize + ">, actual: <" + actualOutputSize + ">");
+                }
+            }
+
+            if (buffered == blockSize - 1) {
+                break;
+            }
+            // Buffer one more byte of input.
+            assertNull("buffered: " + buffered, update(new byte[1]));
+        }
+    }
+
+    public void testGetOutputSizeInDecryptionMode() throws Exception {
+        int blockSize = getBlockSize();
+        createCipher();
+        try {
+            mCipher.getOutputSize(blockSize);
+            fail();
+        } catch (IllegalStateException expected) {}
+
+        initKat(Cipher.DECRYPT_MODE);
+        if ((!isAuthenticatedCipher()) && (isStreamCipher())) {
+            // Unauthenticated stream ciphers do not buffer input or output.
+            for (int input = 0; input <= blockSize * 2; input++) {
+                int actualOutputSize = mCipher.getOutputSize(input);
+                int expectedOutputSize = input;
+                if (actualOutputSize < expectedOutputSize) {
+                    fail("getOutputSize(" + expectedOutputSize + ") underestimated output size"
+                            + ". min expected: <" + expectedOutputSize
+                            + ">, actual: <" + actualOutputSize + ">");
+                }
+            }
+            return;
+        }
+        // Input may be buffered.
+
+        for (int buffered = 0; buffered < blockSize; buffered++) {
+            // Assert that the output of getOutputSize is not lower than the minimum expected.
+            for (int input = 0; input <= blockSize * 2; input++) {
+                int inputInclBuffered = buffered + input;
+                // doFinal dominates the output size.
+                int minExpectedOutputSize;
+                if (isAuthenticatedCipher()) {
+                    // Non-stream authenticated ciphers not supported
+                    assertTrue(isStreamCipher());
+
+                    // Authenticated stream cipher
+                    minExpectedOutputSize =
+                            inputInclBuffered - getKatAuthenticationTagLengthBytes();
+                } else {
+                    // Unauthenticated block cipher.
+
+                    // One full ciphertext block results in one ciphertext block.
+                    minExpectedOutputSize = inputInclBuffered - (inputInclBuffered % blockSize);
+                    if (isPaddingEnabled()) {
+                        if ((inputInclBuffered % blockSize) == 0) {
+                            // No more ciphertext remaining. Thus, the last plaintext block is at
+                            // most blockSize - 1 bytes long.
+                            minExpectedOutputSize--;
+                        } else {
+                            // Partial ciphertext block cannot be decrypted. Thus, the last
+                            // plaintext block would not have been output.
+                            minExpectedOutputSize -= blockSize;
+                        }
+                    } else {
+                        // When no padding is enabled, any remaining ciphertext will cause a error
+                        // because only full blocks can be decrypted. Thus, there's no need to
+                        // account for its plaintext.
+                    }
+                }
+                if (minExpectedOutputSize < 0) {
+                    minExpectedOutputSize = 0;
+                }
+                int actualOutputSize = mCipher.getOutputSize(input);
+                if (actualOutputSize < minExpectedOutputSize) {
+                    fail("getOutputSize(" + input + ") underestimated output size when buffered == "
+                            + buffered + ". min expected: <"
+                            + minExpectedOutputSize + ">, actual: <" + actualOutputSize + ">");
+                }
+            }
+
+            if (buffered == blockSize - 1) {
+                break;
+            }
+            // Buffer one more byte of input.
+            assertNull("buffered: " + buffered, update(new byte[1]));
+        }
+    }
+
+    public void testInitRequiresIvInDecryptMode() throws Exception {
+        if (getKatIv() == null) {
+            // IV not used in this transformation.
+            return;
+        }
+
+        createCipher();
+        try {
+            init(Cipher.DECRYPT_MODE, getKey());
+            fail();
+        } catch (InvalidKeyException expected) {}
+
+        createCipher();
+        try {
+            init(Cipher.DECRYPT_MODE, getKey(), (SecureRandom) null);
+            fail();
+        } catch (InvalidKeyException expected) {}
+
+        createCipher();
+        try {
+            init(Cipher.DECRYPT_MODE, getKey(), (AlgorithmParameterSpec) null, null);
+            fail();
+        } catch (InvalidAlgorithmParameterException expected) {}
+
+        createCipher();
+        try {
+            init(Cipher.DECRYPT_MODE, getKey(), (AlgorithmParameterSpec) null, null);
+            fail();
+        } catch (InvalidAlgorithmParameterException expected) {}
+
+        createCipher();
+        try {
+            init(Cipher.DECRYPT_MODE, getKey(), (AlgorithmParameters) null, null);
+            fail();
+        } catch (InvalidAlgorithmParameterException expected) {}
+
+        createCipher();
+        try {
+            init(Cipher.DECRYPT_MODE, getKey(), (AlgorithmParameters) null, null);
+            fail();
+        } catch (InvalidAlgorithmParameterException expected) {}
+    }
+
+    public void testGetIV() throws Exception {
+        createCipher();
+        assertNull(mCipher.getIV());
+
+        initKat(Cipher.ENCRYPT_MODE);
+        assertEquals(getKatIv(), mCipher.getIV());
+
+        byte[] ciphertext = doFinal(new byte[getBlockSize()]);
+        assertEquals(getKatIv(), mCipher.getIV());
+
+        createCipher();
+        initKat(Cipher.DECRYPT_MODE);
+        assertEquals(getKatIv(), mCipher.getIV());
+
+        doFinal(ciphertext);
+        assertEquals(getKatIv(), mCipher.getIV());
+    }
+
+    public void testIvGeneratedAndUsedWhenEncryptingWithoutExplicitIv() throws Exception {
+        createCipher();
+        SecretKey key = getKey();
+        init(Cipher.ENCRYPT_MODE, key);
+        byte[] generatedIv = mCipher.getIV();
+        AlgorithmParameters generatedParams = mCipher.getParameters();
+        if (getKatIv() == null) {
+            // IV not needed by this transformation -- shouldn't have been generated by Cipher.init
+            assertNull(generatedIv);
+            assertNull(generatedParams);
+        } else {
+            // IV is needed by this transformation -- should've been generated by Cipher.init
+            assertNotNull(generatedIv);
+            assertEquals(getKatIv().length, generatedIv.length);
+            assertNotNull(generatedParams);
+            assertEquals(generatedIv, getIv(generatedParams));
+        }
+
+        // Assert that encrypting then decrypting using the above IV (or null) results in the
+        // original plaintext.
+        byte[] plaintext = new byte[getBlockSize()];
+        byte[] ciphertext = doFinal(plaintext);
+        createCipher();
+        init(Cipher.DECRYPT_MODE, key, generatedParams);
+        byte[] decryptedPlaintext = mCipher.doFinal(ciphertext);
+        assertEquals(plaintext, decryptedPlaintext);
+    }
+
+    public void testGeneratedIvSurvivesReset() throws Exception {
+        if (getKatIv() == null) {
+            // This transformation does not use an IV
+            return;
+        }
+
+        createCipher();
+        init(Cipher.ENCRYPT_MODE, getKey());
+        byte[] iv = mCipher.getIV();
+        AlgorithmParameters generatedParams = mCipher.getParameters();
+        byte[] ciphertext = mCipher.doFinal(getKatPlaintext());
+        // Assert that the IV is still there
+        assertEquals(iv, mCipher.getIV());
+        assertAlgoritmParametersIv(iv);
+
+        if (getKatIv() != null) {
+            // We try to prevent IV reuse by not letting the Cipher be reused.
+            return;
+        }
+
+        // Assert that encrypting the same input after the above reset produces the same ciphertext.
+        assertEquals(ciphertext, mCipher.doFinal(getKatPlaintext()));
+
+        assertEquals(iv, mCipher.getIV());
+        assertAlgoritmParametersIv(iv);
+
+        // Just in case, test with a new instance of Cipher with the same parameters
+        createCipher();
+        init(Cipher.ENCRYPT_MODE, getKey(), generatedParams);
+        assertEquals(ciphertext, mCipher.doFinal(getKatPlaintext()));
+    }
+
+    public void testGeneratedIvDoesNotSurviveReinitialization() throws Exception {
+        if (getKatIv() == null) {
+            // This transformation does not use an IV
+            return;
+        }
+
+        createCipher();
+        init(Cipher.ENCRYPT_MODE, getKey());
+        byte[] ivBeforeReinitialization = mCipher.getIV();
+
+        init(Cipher.ENCRYPT_MODE, getKey());
+        // A new IV should've been generated
+        if (Arrays.equals(ivBeforeReinitialization, mCipher.getIV())) {
+            fail("Same auto-generated IV after Cipher reinitialized."
+                    + " Broken implementation or you're very unlucky (p: 2^{-"
+                    + (ivBeforeReinitialization.length * 8) + "})");
+        }
+    }
+
+    public void testExplicitlySetIvDoesNotSurviveReinitialization() throws Exception {
+        if (getKatIv() == null) {
+            // This transformation does not use an IV
+            return;
+        }
+
+        createCipher();
+        initKat(Cipher.ENCRYPT_MODE);
+        init(Cipher.ENCRYPT_MODE, getKey());
+        // A new IV should've been generated
+        if (Arrays.equals(getKatIv(), mCipher.getIV())) {
+            fail("Auto-generated IV after Cipher reinitialized is the same as previous IV."
+                    + " Broken implementation or you're very unlucky (p: 2^{-"
+                    + (getKatIv().length * 8) + "})");
+        }
+    }
+
+    public void testReinitializingInDecryptModeDoesNotUsePreviouslyUsedIv() throws Exception {
+        if (getKatIv() == null) {
+            // This transformation does not use an IV
+            return;
+        }
+
+        createCipher();
+        // Initialize with explicitly provided IV
+        init(Cipher.ENCRYPT_MODE, getKey(), getKatAlgorithmParameterSpec());
+        // Make sure the IV has been used, just in case it's set/cached lazily.
+        mCipher.update(new byte[getBlockSize() * 2]);
+
+        // IV required but not provided
+        try {
+            init(Cipher.DECRYPT_MODE, getKey());
+            fail();
+        } catch (InvalidKeyException expected) {}
+
+        createCipher();
+        // Initialize with a generated IV
+        init(Cipher.ENCRYPT_MODE, getKey());
+        mCipher.doFinal(getKatPlaintext());
+
+        // IV required but not provided
+        try {
+            init(Cipher.DECRYPT_MODE, getKey());
+            fail();
+        } catch (InvalidKeyException expected) {}
+
+        // IV required but not provided
+        try {
+            init(Cipher.DECRYPT_MODE, getKey(), (SecureRandom) null);
+            fail();
+        } catch (InvalidKeyException expected) {}
+
+        // IV required but not provided
+        try {
+            init(Cipher.DECRYPT_MODE, getKey(), (AlgorithmParameterSpec) null);
+            fail();
+        } catch (InvalidAlgorithmParameterException expected) {}
+
+        // IV required but not provided
+        try {
+            init(Cipher.DECRYPT_MODE, getKey(), (AlgorithmParameterSpec) null, null);
+            fail();
+        } catch (InvalidAlgorithmParameterException expected) {}
+
+        // IV required but not provided
+        try {
+            init(Cipher.DECRYPT_MODE, getKey(), (AlgorithmParameters) null);
+            fail();
+        } catch (InvalidAlgorithmParameterException expected) {}
+
+        // IV required but not provided
+        try {
+            init(Cipher.DECRYPT_MODE, getKey(), (AlgorithmParameters) null, null);
+            fail();
+        } catch (InvalidAlgorithmParameterException expected) {}
+    }
+
+    public void testKeyDoesNotSurviveReinitialization() throws Exception {
+        assertKeyDoesNotSurviveReinitialization(Cipher.ENCRYPT_MODE);
+        assertKeyDoesNotSurviveReinitialization(Cipher.DECRYPT_MODE);
+    }
+
+    private void assertKeyDoesNotSurviveReinitialization(int opmode) throws Exception {
+        byte[] input = getKatInput(opmode);
+        createCipher();
+        byte[] katKeyBytes = getKatKey();
+        SecretKey key1 = importKey(katKeyBytes);
+        init(opmode, key1, getKatAlgorithmParameterSpec());
+        byte[] output1 = doFinal(input);
+
+        // Create a different key by flipping a bit in the KAT key.
+        katKeyBytes[0] ^= 1;
+        SecretKey key2 = importKey(katKeyBytes);
+
+        init(opmode, key2, getKatAlgorithmParameterSpec());
+        byte[] output2;
+        try {
+            output2 = doFinal(input);
+        } catch (BadPaddingException expected) {
+            // Padding doesn't decode probably because the new key is being used. This can only
+            // occur is padding is used.
+            return;
+        }
+
+        // Either padding wasn't used or the old key was used.
+        if (Arrays.equals(output1, output2)) {
+            fail("Same output when reinitialized with a different key. opmode: " + opmode);
+        }
+    }
+
+    public void testDoFinalResets() throws Exception {
+        assertDoFinalResetsCipher(Cipher.DECRYPT_MODE);
+        assertDoFinalResetsCipher(Cipher.ENCRYPT_MODE);
+    }
+
+    private void assertDoFinalResetsCipher(int opmode) throws Exception {
+        byte[] input = getKatInput(opmode);
+        byte[] expectedOutput = getKatOutput(opmode);
+
+        createCipher();
+        initKat(opmode);
+        assertEquals(expectedOutput, doFinal(input));
+
+        if ((opmode == Cipher.ENCRYPT_MODE) && (getKatIv() != null)) {
+            // Assert that this cipher cannot be reused (thus making IV reuse harder)
+            try {
+                doFinal(input);
+                fail();
+            } catch (IllegalStateException expected) {}
+            return;
+        }
+
+        // Assert that the same output is produced after the above reset
+        assertEquals(expectedOutput, doFinal(input));
+
+        // Assert that the same output is produced after the above reset. This time, make update()
+        // buffer half a block of input.
+        if (input.length < getBlockSize() * 2) {
+            fail("This test requires an input which is at least two blocks long");
+        }
+        assertEquals(expectedOutput, concat(
+                update(subarray(input, 0, getBlockSize() * 3 / 2)),
+                doFinal(subarray(input, getBlockSize() * 3 / 2, input.length))));
+
+        // Assert that the same output is produced after the above reset, despite half of the block
+        // having been buffered prior to the reset. This is in case the implementation does not
+        // empty that buffer when resetting.
+        assertEquals(expectedOutput, doFinal(input));
+
+        // Assert that the IV with which the cipher was initialized is still there after the resets.
+        assertEquals(getKatIv(), mCipher.getIV());
+        assertAlgoritmParametersIv(getKatIv());
+    }
+
+    public void testUpdateWithEmptyInputReturnsCorrectValue() throws Exception {
+        // Test encryption
+        createCipher();
+        initKat(Cipher.ENCRYPT_MODE);
+        assertUpdateWithEmptyInputReturnsNull();
+
+        // Test decryption
+        createCipher();
+        initKat(Cipher.DECRYPT_MODE);
+        assertUpdateWithEmptyInputReturnsNull();
+    }
+
+    private void assertUpdateWithEmptyInputReturnsNull() {
+        assertEquals(null, update(new byte[0]));
+        assertEquals(null, update(new byte[getBlockSize() * 2], getBlockSize(), 0));
+        assertEquals(null, update(new byte[getBlockSize()], 0, 0));
+
+        // Feed two blocks through the Cipher, so that it's in a state where a block of input
+        // produces a block of output.
+        // Two blocks are used instead of one because when decrypting with padding enabled, output
+        // lags behind input by a block because the Cipher doesn't know whether the most recent
+        // input block was supposed to contain padding.
+        update(new byte[getBlockSize() * 2]);
+
+        assertEquals(null, update(new byte[0]));
+        assertEquals(null, update(new byte[getBlockSize() * 2], getBlockSize(), 0));
+        assertEquals(null, update(new byte[getBlockSize()], 0, 0));
+    }
+
+    public void testUpdateDoesNotProduceOutputWhenInsufficientInput() throws Exception {
+        if (isStreamCipher()) {
+            // Stream ciphers always produce output for non-empty input.
+            return;
+        }
+
+        // Test encryption
+        createCipher();
+        initKat(Cipher.ENCRYPT_MODE);
+        assertUpdateDoesNotProduceOutputWhenInsufficientInput();
+
+        // Test decryption
+        createCipher();
+        initKat(Cipher.DECRYPT_MODE);
+        assertUpdateDoesNotProduceOutputWhenInsufficientInput();
+    }
+
+    private void assertUpdateDoesNotProduceOutputWhenInsufficientInput() throws Exception {
+        if (getBlockSize() < 8) {
+            fail("This test isn't designed for small block size: " + getBlockSize());
+        }
+
+        assertEquals(null, update(new byte[1]));
+        assertEquals(null, update(new byte[1], 0, 1));
+        assertEquals(0, update(new byte[1], 0, 1, new byte[getBlockSize()]));
+        assertEquals(0, update(new byte[1], 0, 1, new byte[getBlockSize()], 0));
+        assertEquals(0, update(ByteBuffer.allocate(1), ByteBuffer.allocate(getBlockSize())));
+
+        // Feed a block through the Cipher, so that it's potentially no longer in an initial state.
+        byte[] output = update(new byte[getBlockSize()]);
+        assertEquals(getBlockSize(), output.length);
+
+        assertEquals(null, update(new byte[1]));
+        assertEquals(null, update(new byte[1], 0, 1));
+        assertEquals(0, update(new byte[1], 0, 1, new byte[getBlockSize()]));
+        assertEquals(0, update(new byte[1], 0, 1, new byte[getBlockSize()], 0));
+        assertEquals(0, update(ByteBuffer.allocate(1), ByteBuffer.allocate(getBlockSize())));
+    }
+
+    public void testKatOneShotEncryptUsingDoFinal() throws Exception {
+        createCipher();
+        assertKatOneShotTransformUsingDoFinal(
+                Cipher.ENCRYPT_MODE, getKatPlaintext(), getKatCiphertext());
+    }
+
+    public void testKatOneShotDecryptUsingDoFinal() throws Exception {
+        createCipher();
+        assertKatOneShotTransformUsingDoFinal(
+                Cipher.DECRYPT_MODE, getKatCiphertext(), getKatPlaintext());
+    }
+
+    private void assertKatOneShotTransformUsingDoFinal(
+            int opmode, byte[] input, byte[] expectedOutput) throws Exception {
+        int bufferWithInputInTheMiddleCleartextOffset = 5;
+        byte[] bufferWithInputInTheMiddle = concat(
+                new byte[bufferWithInputInTheMiddleCleartextOffset],
+                input,
+                new byte[4]);
+
+        initKat(opmode);
+        assertEquals(expectedOutput, doFinal(input));
+        initKat(opmode);
+        assertEquals(expectedOutput, doFinal(input, 0, input.length));
+        initKat(opmode);
+        assertEquals(expectedOutput,
+                doFinal(bufferWithInputInTheMiddle,
+                        bufferWithInputInTheMiddleCleartextOffset,
+                        input.length));
+
+        ByteBuffer inputBuffer = ByteBuffer.wrap(
+                bufferWithInputInTheMiddle,
+                bufferWithInputInTheMiddleCleartextOffset,
+                input.length);
+        ByteBuffer actualOutputBuffer = ByteBuffer.allocate(expectedOutput.length);
+        initKat(opmode);
+        assertEquals(expectedOutput.length, doFinal(inputBuffer, actualOutputBuffer));
+        assertEquals(0, inputBuffer.remaining());
+        assertByteBufferEquals(
+                (ByteBuffer) ByteBuffer.wrap(expectedOutput).position(expectedOutput.length),
+                actualOutputBuffer);
+    }
+
+    public void testKatEncryptOneByteAtATime() throws Exception {
+        createCipher();
+        initKat(Cipher.ENCRYPT_MODE);
+        byte[] plaintext = getKatPlaintext();
+        byte[] expectedCiphertext = getKatCiphertext();
+        int blockSize = getBlockSize();
+        if (isStreamCipher()) {
+            // Stream cipher -- one byte in, one byte out
+            for (int plaintextIndex = 0; plaintextIndex < plaintext.length; plaintextIndex++) {
+                byte[] output = update(new byte[] {plaintext[plaintextIndex]});
+                assertEquals("plaintext index: " + plaintextIndex, 1, output.length);
+                assertEquals("plaintext index: " + plaintextIndex,
+                        expectedCiphertext[plaintextIndex], output[0]);
+            }
+            byte[] finalOutput = doFinal();
+            byte[] expectedFinalOutput;
+            if (isAuthenticatedCipher()) {
+                expectedFinalOutput =
+                        subarray(expectedCiphertext, plaintext.length, expectedCiphertext.length);
+            } else {
+                expectedFinalOutput = EmptyArray.BYTE;
+            }
+            assertEquals(expectedFinalOutput, finalOutput);
+        } else {
+            // Not a stream cipher -- operates on full blocks only.
+
+            // Assert that a block of output is produced once a full block of input is provided.
+            // Every input block produces an output block.
+            int ciphertextIndex = 0;
+            for (int plaintextIndex = 0; plaintextIndex < plaintext.length; plaintextIndex++) {
+                byte[] output = update(new byte[] {plaintext[plaintextIndex]});
+                if ((plaintextIndex % blockSize) == blockSize - 1) {
+                    // Cipher.update is expected to have output a new block
+                    assertEquals(
+                            "plaintext index: " + plaintextIndex,
+                            subarray(
+                                    expectedCiphertext,
+                                    ciphertextIndex,
+                                    ciphertextIndex + blockSize),
+                            output);
+                } else {
+                    // Cipher.update is expected to have produced no output
+                    assertEquals("plaintext index: " + plaintextIndex, null, output);
+                }
+                if (output != null) {
+                    ciphertextIndex += output.length;
+                }
+            }
+
+            byte[] actualFinalOutput = doFinal();
+            byte[] expectedFinalOutput =
+                    subarray(expectedCiphertext, ciphertextIndex, expectedCiphertext.length);
+            assertEquals(expectedFinalOutput, actualFinalOutput);
+        }
+    }
+
+    public void testKatDecryptOneByteAtATime() throws Exception {
+        createCipher();
+        initKat(Cipher.DECRYPT_MODE);
+        byte[] ciphertext = getKatCiphertext();
+        int plaintextIndex = 0;
+        int blockSize = getBlockSize();
+        byte[] expectedPlaintext = getKatPlaintext();
+        boolean paddingEnabled = isPaddingEnabled();
+        if (isAuthenticatedCipher()) {
+            // Authenticated cipher -- no output until doFinal where ciphertext is authenticated.
+            for (int ciphertextIndex = 0; ciphertextIndex < ciphertext.length; ciphertextIndex++) {
+                byte[] output = update(new byte[] {ciphertext[ciphertextIndex]});
+                assertEquals("ciphertext index: " + ciphertextIndex,
+                        0, (output != null) ? output.length : 0);
+            }
+            byte[] finalOutput = doFinal();
+            assertEquals(expectedPlaintext, finalOutput);
+        } else if (isStreamCipher()) {
+            // Unauthenticated stream cipher -- one byte in, one byte out
+            for (int ciphertextIndex = 0; ciphertextIndex < ciphertext.length; ciphertextIndex++) {
+                byte[] output = update(new byte[] {ciphertext[ciphertextIndex]});
+                assertEquals("ciphertext index: " + ciphertextIndex, 1, output.length);
+                assertEquals("ciphertext index: " + ciphertextIndex,
+                        expectedPlaintext[ciphertextIndex], output[0]);
+            }
+            byte[] finalOutput = doFinal();
+            assertEquals(0, finalOutput.length);
+        } else {
+            // Unauthenticated block cipher -- operates in full blocks only
+
+            // Assert that a block of output is produced once a full block of input is provided.
+            // When padding is used, output is produced one input byte later: once the first byte of the
+            // next input block is provided.
+            for (int ciphertextIndex = 0; ciphertextIndex < ciphertext.length; ciphertextIndex++) {
+                byte[] output = update(new byte[] {ciphertext[ciphertextIndex]});
+                boolean outputExpected =
+                        ((paddingEnabled)
+                                && (ciphertextIndex > 0) && ((ciphertextIndex % blockSize) == 0))
+                        || ((!paddingEnabled) && ((ciphertextIndex % blockSize) == blockSize - 1));
+
+                if (outputExpected) {
+                    assertEquals(
+                            "ciphertext index: " + ciphertextIndex,
+                            subarray(expectedPlaintext, plaintextIndex, plaintextIndex + blockSize),
+                            output);
+                } else {
+                    assertEquals("ciphertext index: " + ciphertextIndex, null, output);
+                }
+
+                if (output != null) {
+                    plaintextIndex += output.length;
+                }
+            }
+
+            byte[] actualFinalOutput = doFinal();
+            byte[] expectedFinalOutput =
+                    subarray(expectedPlaintext, plaintextIndex, expectedPlaintext.length);
+            assertEquals(expectedFinalOutput, actualFinalOutput);
+        }
+    }
+
+    public void testUpdateAADNotSupported() throws Exception {
+        if (isAuthenticatedCipher()) {
+            // Not applicable to authenticated ciphers where updateAAD is supported.
+            return;
+        }
+
+        createCipher();
+        initKat(Cipher.ENCRYPT_MODE);
+        assertUpdateAADNotSupported();
+
+        createCipher();
+        initKat(Cipher.DECRYPT_MODE);
+        assertUpdateAADNotSupported();
+    }
+
+    public void testUpdateAADSupported() throws Exception {
+        if (!isAuthenticatedCipher()) {
+            // Not applicable to unauthenticated ciphers where updateAAD is not supported.
+            return;
+        }
+
+        createCipher();
+        initKat(Cipher.ENCRYPT_MODE);
+        assertUpdateAADSupported();
+
+        createCipher();
+        initKat(Cipher.DECRYPT_MODE);
+        assertUpdateAADSupported();
+    }
+
+    private void assertUpdateAADNotSupported() throws Exception {
+        try {
+            mCipher.updateAAD(new byte[getBlockSize()]);
+            fail();
+        } catch (UnsupportedOperationException expected) {
+        } catch (IllegalStateException expected) {}
+
+        try {
+            mCipher.updateAAD(new byte[getBlockSize()], 0, getBlockSize());
+            fail();
+        } catch (UnsupportedOperationException expected) {
+        } catch (IllegalStateException expected) {}
+
+        try {
+            mCipher.updateAAD(ByteBuffer.allocate(getBlockSize()));
+            fail();
+        } catch (UnsupportedOperationException expected) {
+        } catch (IllegalStateException expected) {}
+    }
+
+    private void assertUpdateAADSupported() throws Exception {
+        mCipher.updateAAD(new byte[getBlockSize()]);
+        mCipher.updateAAD(new byte[getBlockSize()], 0, getBlockSize());
+        mCipher.updateAAD(ByteBuffer.allocate(getBlockSize()));
+    }
+
+    // TODO: Add tests for WRAP and UNWRAP
+
+    public void testUpdateAndDoFinalNotSupportedInWrapAndUnwrapModes() throws Exception {
+        createCipher();
+        assertUpdateAndDoFinalThrowIllegalStateExceprtion(
+                Cipher.WRAP_MODE, getKey(), getKatAlgorithmParameterSpec());
+
+        createCipher();
+        assertUpdateAndDoFinalThrowIllegalStateExceprtion(
+                Cipher.UNWRAP_MODE, getKey(), getKatAlgorithmParameterSpec());
+    }
+
+    private void assertUpdateAndDoFinalThrowIllegalStateExceprtion(
+            int opmode, SecretKey key, AlgorithmParameterSpec paramSpec)
+            throws Exception {
+        try {
+            init(opmode, key, paramSpec);
+        } catch (UnsupportedOperationException e) {
+            // Skip this test because wrap/unwrap is not supported by this Cipher
+            return;
+        }
+
+        try {
+            update(new byte[getBlockSize()]);
+            fail();
+        } catch (IllegalStateException expected) {}
+
+        init(opmode, key, paramSpec);
+        try {
+            update(new byte[getBlockSize()], 0, getBlockSize());
+            fail();
+        } catch (IllegalStateException expected) {}
+
+        init(opmode, key, paramSpec);
+        try {
+            update(new byte[getBlockSize()], 0, getBlockSize(), new byte[getBlockSize() * 2]);
+            fail();
+        } catch (IllegalStateException expected) {}
+
+        init(opmode, key, paramSpec);
+        try {
+            update(new byte[getBlockSize()], 0, getBlockSize(), new byte[getBlockSize() * 2], 0);
+            fail();
+        } catch (IllegalStateException expected) {}
+
+        init(opmode, key, paramSpec);
+        try {
+            update(ByteBuffer.allocate(getBlockSize()), ByteBuffer.allocate(getBlockSize() * 2));
+            fail();
+        } catch (IllegalStateException expected) {}
+
+        init(opmode, key, paramSpec);
+        try {
+            doFinal();
+            fail();
+        } catch (IllegalStateException expected) {}
+
+        init(opmode, key, paramSpec);
+        try {
+            doFinal(new byte[getBlockSize()]);
+            fail();
+        } catch (IllegalStateException expected) {}
+
+        init(opmode, key, paramSpec);
+        try {
+            doFinal(new byte[getBlockSize()], 0, getBlockSize());
+            fail();
+        } catch (IllegalStateException expected) {}
+
+        init(opmode, key, paramSpec);
+        try {
+            doFinal(new byte[getBlockSize() * 2], 0);
+            fail();
+        } catch (IllegalStateException expected) {}
+
+        init(opmode, key, paramSpec);
+        try {
+            doFinal(new byte[getBlockSize()], 0, getBlockSize(), new byte[getBlockSize() * 2]);
+            fail();
+        } catch (IllegalStateException expected) {}
+
+        init(opmode, key, paramSpec);
+        try {
+            doFinal(new byte[getBlockSize()], 0, getBlockSize(), new byte[getBlockSize() * 2], 0);
+            fail();
+        } catch (IllegalStateException expected) {}
+
+        init(opmode, key, paramSpec);
+        try {
+            doFinal(ByteBuffer.allocate(getBlockSize()), ByteBuffer.allocate(getBlockSize() * 2));
+            fail();
+        } catch (IllegalStateException expected) {}
+    }
+
+    public void testGeneratedPadding() throws Exception {
+        // Assert that the Cipher under test correctly handles plaintexts of various lengths.
+        if (isStreamCipher()) {
+            // Not applicable to stream ciphers
+            return;
+        }
+
+        // Encryption of basePlaintext and additional data should result in baseCiphertext and some
+        // data (some of which may be padding).
+        int blockSize = getBlockSize();
+        byte[] basePlaintext = subarray(getKatPlaintext(), 0, blockSize);
+        byte[] baseCiphertext = subarray(getKatCiphertext(), 0, blockSize);
+        boolean paddingEnabled = isPaddingEnabled();
+
+        for (int lastInputBlockUnusedByteCount = 0;
+                lastInputBlockUnusedByteCount < blockSize;
+                lastInputBlockUnusedByteCount++) {
+            byte[] plaintext = concat(basePlaintext, new byte[lastInputBlockUnusedByteCount]);
+            createCipher();
+            initKat(Cipher.ENCRYPT_MODE);
+
+            if ((!paddingEnabled) && ((lastInputBlockUnusedByteCount % blockSize) != 0)) {
+                // Without padding, plaintext which does not end with a full block should be
+                // rejected.
+                try {
+                    doFinal(plaintext);
+                    fail();
+                } catch (IllegalBlockSizeException expected) {}
+                continue;
+            }
+            byte[] ciphertext = doFinal(plaintext);
+
+            assertEquals(
+                    "lastInputBlockUnusedByteCount: " + lastInputBlockUnusedByteCount,
+                    baseCiphertext,
+                    subarray(ciphertext, 0, baseCiphertext.length));
+
+            int expectedCiphertextLength = getExpectedCiphertextLength(plaintext.length);
+            int expectedDecryptedPlaintextLength =
+                    (paddingEnabled) ? plaintext.length : expectedCiphertextLength;
+            assertEquals(
+                    "lastInputBlockUnusedByteCount: " + lastInputBlockUnusedByteCount,
+                    expectedCiphertextLength,
+                    ciphertext.length);
+            initKat(Cipher.DECRYPT_MODE);
+            byte[] decryptedPlaintext = doFinal(ciphertext);
+            assertEquals(
+                    "lastInputBlockUnusedByteCount: " + lastInputBlockUnusedByteCount,
+                    expectedDecryptedPlaintextLength,
+                    decryptedPlaintext.length);
+            assertEquals(
+                    "lastInputBlockUnusedByteCount: " + lastInputBlockUnusedByteCount,
+                    basePlaintext,
+                    subarray(decryptedPlaintext, 0, basePlaintext.length));
+        }
+    }
+
+    public void testDecryptWithMangledPadding() throws Exception {
+        if (!isPaddingEnabled()) {
+            // Test not applicable when padding not in use
+            return;
+        }
+
+        createCipher();
+        initKat(Cipher.DECRYPT_MODE);
+        byte[] ciphertext = getKatCiphertext();
+        // Flip a bit in the last byte of ciphertext -- this should result in the last plaintext
+        // block getting mangled. In turn, this should result in bad padding.
+        ciphertext[ciphertext.length - 1] ^= 1;
+        try {
+            doFinal(ciphertext);
+            fail();
+        } catch (BadPaddingException expected) {}
+    }
+
+    public void testDecryptWithMissingPadding() throws Exception {
+        if (!isPaddingEnabled()) {
+            // Test not applicable when padding not in use
+            return;
+        }
+
+        createCipher();
+        initKat(Cipher.DECRYPT_MODE);
+        byte[] ciphertext = subarray(getKatCiphertext(), 0, getBlockSize());
+        try {
+            doFinal(ciphertext);
+            fail();
+        } catch (BadPaddingException expected) {}
+    }
+
+    public void testUpdateCopySafe() throws Exception {
+        // Assert that when input and output buffers passed to Cipher.update reference the same
+        // byte array, then no input data is overwritten before it's consumed.
+        assertUpdateCopySafe(Cipher.ENCRYPT_MODE, 0, 0);
+        assertUpdateCopySafe(Cipher.ENCRYPT_MODE, 0, 1);
+        assertUpdateCopySafe(Cipher.ENCRYPT_MODE, 1, 0);
+        assertUpdateCopySafe(Cipher.ENCRYPT_MODE, 0, getBlockSize() - 1);
+        assertUpdateCopySafe(Cipher.ENCRYPT_MODE, 0, getBlockSize());
+        assertUpdateCopySafe(Cipher.ENCRYPT_MODE, 0, getBlockSize() + 1);
+        assertUpdateCopySafe(Cipher.ENCRYPT_MODE, getBlockSize() * 2 - 1, 0);
+        assertUpdateCopySafe(Cipher.ENCRYPT_MODE, getBlockSize() * 2, 0);
+        assertUpdateCopySafe(Cipher.ENCRYPT_MODE, getBlockSize() * 2 + 1, 0);
+
+        assertUpdateCopySafe(Cipher.DECRYPT_MODE, 0, 0);
+        assertUpdateCopySafe(Cipher.DECRYPT_MODE, 0, 1);
+        assertUpdateCopySafe(Cipher.DECRYPT_MODE, 1, 0);
+        assertUpdateCopySafe(Cipher.DECRYPT_MODE, 0, getBlockSize() - 1);
+        assertUpdateCopySafe(Cipher.DECRYPT_MODE, 0, getBlockSize());
+        assertUpdateCopySafe(Cipher.DECRYPT_MODE, 0, getBlockSize() + 1);
+        assertUpdateCopySafe(Cipher.DECRYPT_MODE, getBlockSize() * 2 - 1, 0);
+        assertUpdateCopySafe(Cipher.DECRYPT_MODE, getBlockSize() * 2, 0);
+        assertUpdateCopySafe(Cipher.DECRYPT_MODE, getBlockSize() * 2 + 1, 0);
+    }
+
+    private void assertUpdateCopySafe(
+            int opmode, int inputOffsetInBuffer, int outputOffsetInBuffer)
+            throws Exception {
+        int blockSize = getBlockSize();
+        byte[] input;
+        byte[] expectedOutput;
+        switch (opmode) {
+            case Cipher.ENCRYPT_MODE:
+                input = getKatPlaintext();
+                if (isStreamCipher()) {
+                    if (isAuthenticatedCipher()) {
+                        expectedOutput = subarray(getKatCiphertext(), 0, input.length);
+                    } else {
+                        expectedOutput = getKatCiphertext();
+                    }
+                } else {
+                    // Update outputs exactly one block of ciphertext for one block of plaintext,
+                    // excluding padding.
+                    expectedOutput = subarray(
+                            getKatCiphertext(), 0, (input.length / blockSize) * blockSize);
+                }
+                break;
+            case Cipher.DECRYPT_MODE:
+                input = getKatCiphertext();
+                if (isAuthenticatedCipher()) {
+                    expectedOutput = EmptyArray.BYTE;
+                } else if (isStreamCipher()) {
+                    expectedOutput = getKatPlaintext();
+                } else {
+                    expectedOutput = getKatPlaintext();
+                    if (isPaddingEnabled()) {
+                        // When padding is enabled, update will not output the last block of
+                        // plaintext because it doesn't know whether more ciphertext will be
+                        // provided.
+                        expectedOutput = subarray(
+                                expectedOutput, 0, ((input.length / blockSize) - 1) * blockSize);
+                    } else {
+                        // When no padding is used, one block of ciphertext results in one block of
+                        // plaintext.
+                        expectedOutput = subarray(
+                                expectedOutput, 0, (input.length - (input.length % blockSize)));
+                    }
+                }
+                break;
+            default:
+                throw new AssertionFailedError("Unsupported opmode: " + opmode);
+        }
+
+        int inputEndIndexInBuffer = inputOffsetInBuffer + input.length;
+        int outputEndIndexInBuffer = outputOffsetInBuffer + expectedOutput.length;
+
+        // Test the update(byte[], int, int, byte[], int) variant
+        byte[] buffer = new byte[Math.max(inputEndIndexInBuffer, outputEndIndexInBuffer)];
+        System.arraycopy(input, 0, buffer, inputOffsetInBuffer, input.length);
+        createCipher();
+        initKat(opmode);
+        assertEquals(expectedOutput.length,
+                update(buffer, inputOffsetInBuffer, input.length,
+                        buffer, outputOffsetInBuffer));
+        assertEquals(expectedOutput,
+                subarray(buffer, outputOffsetInBuffer, outputEndIndexInBuffer));
+
+        if (outputOffsetInBuffer == 0) {
+            // We can use the update variant which assumes that output offset is 0.
+            buffer = new byte[Math.max(inputEndIndexInBuffer, outputEndIndexInBuffer)];
+            System.arraycopy(input, 0, buffer, inputOffsetInBuffer, input.length);
+            createCipher();
+            initKat(opmode);
+            assertEquals(expectedOutput.length,
+                    update(buffer, inputOffsetInBuffer, input.length, buffer));
+            assertEquals(expectedOutput,
+                    subarray(buffer, outputOffsetInBuffer, outputEndIndexInBuffer));
+        }
+
+        // Test the update(ByteBuffer, ByteBuffer) variant
+        buffer = new byte[Math.max(inputEndIndexInBuffer, outputEndIndexInBuffer)];
+        System.arraycopy(input, 0, buffer, inputOffsetInBuffer, input.length);
+        ByteBuffer inputBuffer = ByteBuffer.wrap(buffer, inputOffsetInBuffer, input.length);
+        ByteBuffer outputBuffer =
+                ByteBuffer.wrap(buffer, outputOffsetInBuffer, expectedOutput.length);
+        createCipher();
+        initKat(opmode);
+        assertEquals(expectedOutput.length, update(inputBuffer, outputBuffer));
+        assertEquals(expectedOutput,
+                subarray(buffer, outputOffsetInBuffer, outputEndIndexInBuffer));
+    }
+
+    public void testDoFinalCopySafe() throws Exception {
+        // Assert that when input and output buffers passed to Cipher.doFinal reference the same
+        // byte array, then no input data is overwritten before it's consumed.
+        assertDoFinalCopySafe(Cipher.ENCRYPT_MODE, 0, 0);
+        assertDoFinalCopySafe(Cipher.ENCRYPT_MODE, 0, 1);
+        assertDoFinalCopySafe(Cipher.ENCRYPT_MODE, 1, 0);
+        assertDoFinalCopySafe(Cipher.ENCRYPT_MODE, 0, getBlockSize() - 1);
+        assertDoFinalCopySafe(Cipher.ENCRYPT_MODE, 0, getBlockSize());
+        assertDoFinalCopySafe(Cipher.ENCRYPT_MODE, 0, getBlockSize() + 1);
+        assertDoFinalCopySafe(Cipher.ENCRYPT_MODE, getBlockSize() * 2 - 1, 0);
+        assertDoFinalCopySafe(Cipher.ENCRYPT_MODE, getBlockSize() * 2, 0);
+        assertDoFinalCopySafe(Cipher.ENCRYPT_MODE, getBlockSize() * 2 + 1, 0);
+
+        assertDoFinalCopySafe(Cipher.DECRYPT_MODE, 0, 0);
+        assertDoFinalCopySafe(Cipher.DECRYPT_MODE, 0, 1);
+        assertDoFinalCopySafe(Cipher.DECRYPT_MODE, 1, 0);
+        assertDoFinalCopySafe(Cipher.DECRYPT_MODE, 0, getBlockSize() - 1);
+        assertDoFinalCopySafe(Cipher.DECRYPT_MODE, 0, getBlockSize());
+        assertDoFinalCopySafe(Cipher.DECRYPT_MODE, 0, getBlockSize() + 1);
+        assertDoFinalCopySafe(Cipher.DECRYPT_MODE, getBlockSize() * 2 - 1, 0);
+        assertDoFinalCopySafe(Cipher.DECRYPT_MODE, getBlockSize() * 2, 0);
+        assertDoFinalCopySafe(Cipher.DECRYPT_MODE, getBlockSize() * 2 + 1, 0);
+    }
+
+    private void assertDoFinalCopySafe(
+            int opmode, int inputOffsetInBuffer, int outputOffsetInBuffer)
+            throws Exception {
+        byte[] input = getKatInput(opmode);
+        byte[] expectedOutput = getKatOutput(opmode);
+
+        int inputEndIndexInBuffer = inputOffsetInBuffer + input.length;
+        int outputEndIndexInBuffer = outputOffsetInBuffer + expectedOutput.length;
+
+        // Test the doFinal(byte[], int, int, byte[], int) variant
+        byte[] buffer = new byte[Math.max(inputEndIndexInBuffer, outputEndIndexInBuffer)];
+        System.arraycopy(input, 0, buffer, inputOffsetInBuffer, input.length);
+        createCipher();
+        initKat(opmode);
+        assertEquals(expectedOutput.length,
+                doFinal(buffer, inputOffsetInBuffer, input.length,
+                        buffer, outputOffsetInBuffer));
+        assertEquals(expectedOutput,
+                subarray(buffer, outputOffsetInBuffer, outputEndIndexInBuffer));
+
+        if (outputOffsetInBuffer == 0) {
+            // We can use the doFinal variant which assumes that output offset is 0.
+            buffer = new byte[Math.max(inputEndIndexInBuffer, outputEndIndexInBuffer)];
+            System.arraycopy(input, 0, buffer, inputOffsetInBuffer, input.length);
+            createCipher();
+            initKat(opmode);
+            assertEquals(expectedOutput.length,
+                    doFinal(buffer, inputOffsetInBuffer, input.length, buffer));
+            assertEquals(expectedOutput,
+                    subarray(buffer, outputOffsetInBuffer, outputEndIndexInBuffer));
+        }
+
+        // Test the doFinal(ByteBuffer, ByteBuffer) variant
+        buffer = new byte[Math.max(inputEndIndexInBuffer, outputEndIndexInBuffer)];
+        System.arraycopy(input, 0, buffer, inputOffsetInBuffer, input.length);
+        ByteBuffer inputBuffer = ByteBuffer.wrap(buffer, inputOffsetInBuffer, input.length);
+        ByteBuffer outputBuffer =
+                ByteBuffer.wrap(buffer, outputOffsetInBuffer, expectedOutput.length);
+        createCipher();
+        initKat(opmode);
+        assertEquals(expectedOutput.length, doFinal(inputBuffer, outputBuffer));
+        assertEquals(expectedOutput,
+                subarray(buffer, outputOffsetInBuffer, outputEndIndexInBuffer));
+    }
+
+    protected void createCipher() throws NoSuchAlgorithmException,
+            NoSuchPaddingException  {
+        mCipher = Cipher.getInstance(getTransformation());
+    }
+
+    private String getKeyAlgorithm() {
+        String transformation = getTransformation();
+        int delimiterIndex = transformation.indexOf('/');
+        if (delimiterIndex == -1) {
+            fail("Unexpected transformation: " + transformation);
+        }
+        return transformation.substring(0, delimiterIndex);
+    }
+
+    private String getBlockMode() {
+        String transformation = getTransformation();
+        int delimiterIndex = transformation.indexOf('/');
+        if (delimiterIndex == -1) {
+            fail("Unexpected transformation: " + transformation);
+        }
+        int nextDelimiterIndex = transformation.indexOf('/', delimiterIndex + 1);
+        if (nextDelimiterIndex == -1) {
+            fail("Unexpected transformation: " + transformation);
+        }
+        return transformation.substring(delimiterIndex + 1, nextDelimiterIndex);
+    }
+
+    private String getPadding() {
+        String transformation = getTransformation();
+        int delimiterIndex = transformation.indexOf('/');
+        if (delimiterIndex == -1) {
+            fail("Unexpected transformation: " + transformation);
+        }
+        int nextDelimiterIndex = transformation.indexOf('/', delimiterIndex + 1);
+        if (nextDelimiterIndex == -1) {
+            fail("Unexpected transformation: " + transformation);
+        }
+        return transformation.substring(nextDelimiterIndex + 1);
+    }
+
+    private SecretKey getKey() {
+        return importKey(getKatKey());
+    }
+
+    protected SecretKey importKey(byte[] keyMaterial) {
+        try {
+            int keyId = mNextKeyId++;
+            String keyAlias = "key" + keyId;
+            mAndroidKeyStore.setEntry(
+                    keyAlias,
+                    new KeyStore.SecretKeyEntry(new SecretKeySpec(keyMaterial, getKeyAlgorithm())),
+                    new KeyProtection.Builder(
+                            KeyProperties.PURPOSE_ENCRYPT
+                                    | KeyProperties.PURPOSE_DECRYPT)
+                            .setBlockModes(getBlockMode())
+                            .setEncryptionPaddings(getPadding())
+                            .setRandomizedEncryptionRequired(false)
+                            .build());
+            return (SecretKey) mAndroidKeyStore.getKey(keyAlias, null);
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to import key into AndroidKeyStore", e);
+        }
+    }
+
+    private boolean isPaddingEnabled() {
+        return !getTransformation().toLowerCase(Locale.US).endsWith("/nopadding");
+    }
+
+    private int getExpectedCiphertextLength(int plaintextLength) {
+        int blockSize = getBlockSize();
+        if (isStreamCipher()) {
+            // Padding not supported for stream ciphers
+            assertFalse(isPaddingEnabled());
+            return plaintextLength;
+        } else {
+            if (isPaddingEnabled()) {
+                return ((plaintextLength / blockSize) + 1) * blockSize;
+            } else {
+                return ((plaintextLength + blockSize - 1) / blockSize) * blockSize;
+            }
+        }
+    }
+
+    protected void initKat(int opmode)
+            throws InvalidKeyException, InvalidAlgorithmParameterException {
+        init(opmode, getKey(), getKatAlgorithmParameterSpec());
+    }
+
+    protected void init(int opmode, Key key, AlgorithmParameters spec)
+            throws InvalidKeyException, InvalidAlgorithmParameterException {
+        mCipher.init(opmode, key, spec);
+        mOpmode = opmode;
+    }
+
+    protected void init(int opmode, Key key, AlgorithmParameters spec, SecureRandom random)
+            throws InvalidKeyException, InvalidAlgorithmParameterException {
+        mCipher.init(opmode, key, spec, random);
+        mOpmode = opmode;
+    }
+
+    protected void init(int opmode, Key key, AlgorithmParameterSpec spec)
+            throws InvalidKeyException, InvalidAlgorithmParameterException {
+        mCipher.init(opmode, key, spec);
+        mOpmode = opmode;
+    }
+
+    protected void init(int opmode, Key key, AlgorithmParameterSpec spec, SecureRandom random)
+            throws InvalidKeyException, InvalidAlgorithmParameterException {
+        mCipher.init(opmode, key, spec, random);
+        mOpmode = opmode;
+    }
+
+    protected void init(int opmode, Key key) throws InvalidKeyException {
+        mCipher.init(opmode, key);
+        mOpmode = opmode;
+    }
+
+    protected void init(int opmode, Key key, SecureRandom random) throws InvalidKeyException {
+        mCipher.init(opmode, key, random);
+        mOpmode = opmode;
+    }
+
+    protected byte[] doFinal() throws IllegalBlockSizeException, BadPaddingException {
+        return mCipher.doFinal();
+    }
+
+    protected byte[] doFinal(byte[] input) throws IllegalBlockSizeException, BadPaddingException {
+        return mCipher.doFinal(input);
+    }
+
+    protected byte[] doFinal(byte[] input, int inputOffset, int inputLen)
+            throws IllegalBlockSizeException, BadPaddingException {
+        return mCipher.doFinal(input, inputOffset, inputLen);
+    }
+
+    protected int doFinal(byte[] input, int inputOffset, int inputLen, byte[] output)
+            throws ShortBufferException, IllegalBlockSizeException, BadPaddingException {
+        return mCipher.doFinal(input, inputOffset, inputLen, output);
+    }
+
+    protected int doFinal(byte[] input, int inputOffset, int inputLen, byte[] output,
+            int outputOffset) throws ShortBufferException, IllegalBlockSizeException,
+            BadPaddingException {
+        return mCipher.doFinal(input, inputOffset, inputLen, output, outputOffset);
+    }
+
+    protected int doFinal(byte[] output, int outputOffset) throws IllegalBlockSizeException,
+            ShortBufferException, BadPaddingException {
+        return mCipher.doFinal(output, outputOffset);
+    }
+
+    protected int doFinal(ByteBuffer input, ByteBuffer output) throws ShortBufferException,
+            IllegalBlockSizeException, BadPaddingException {
+        return mCipher.doFinal(input, output);
+    }
+
+    private boolean isEncrypting() {
+        return (mOpmode == Cipher.ENCRYPT_MODE) || (mOpmode == Cipher.WRAP_MODE);
+    }
+
+    private void assertUpdateOutputSize(int inputLength, int outputLength) {
+        if ((isAuthenticatedCipher()) && (!isEncrypting())) {
+            assertEquals("Output of update must be empty for authenticated cipher when decrypting",
+                    0, outputLength);
+            return;
+        }
+
+        if (isStreamCipher()) {
+            if (outputLength != inputLength) {
+                fail("Output of update (" + outputLength + ") not same size as input ("
+                        + inputLength + ")");
+            }
+        } else {
+            if ((outputLength % getBlockSize()) != 0) {
+                fail("Output of update (" + outputLength + ") not a multiple of block size ("
+                        + getBlockSize() + ")");
+            }
+        }
+    }
+
+    protected byte[] update(byte[] input) {
+        byte[] output = mCipher.update(input);
+        assertUpdateOutputSize(
+                (input != null) ? input.length : 0, (output != null) ? output.length : 0);
+        return output;
+    }
+
+    protected byte[] update(byte[] input, int offset, int len) {
+        byte[] output = mCipher.update(input, offset, len);
+        assertUpdateOutputSize(len, (output != null) ? output.length : 0);
+
+        return output;
+    }
+
+    protected int update(byte[] input, int offset, int len, byte[] output)
+            throws ShortBufferException {
+        int outputLen = mCipher.update(input, offset, len, output);
+        assertUpdateOutputSize(len, outputLen);
+
+        return outputLen;
+    }
+
+    protected int update(byte[] input, int offset, int len, byte[] output, int outputOffset)
+            throws ShortBufferException {
+        int outputLen = mCipher.update(input, offset, len, output, outputOffset);
+        assertUpdateOutputSize(len, outputLen);
+
+        return outputLen;
+    }
+
+    protected int update(ByteBuffer input, ByteBuffer output) throws ShortBufferException {
+        int inputLimitBefore = input.limit();
+        int outputLimitBefore = output.limit();
+        int inputLen = input.remaining();
+        int outputPosBefore = output.position();
+
+        int outputLen = mCipher.update(input, output);
+
+        assertUpdateOutputSize(inputLen, outputLen);
+        assertEquals(inputLimitBefore, input.limit());
+        assertEquals(input.limit(), input.position());
+
+        assertEquals(outputLimitBefore, output.limit());
+        assertEquals(outputPosBefore + outputLen, output.position());
+
+        return outputLen;
+    }
+
+    protected void updateAAD(byte[] input) {
+        mCipher.updateAAD(input);
+    }
+
+    protected void updateAAD(byte[] input, int offset, int len) {
+        mCipher.updateAAD(input, offset, len);
+    }
+
+    protected void updateAAD(ByteBuffer input) {
+        mCipher.updateAAD(input);
+    }
+
+    @SuppressWarnings("unused")
+    protected static void assertEquals(Buffer expected, Buffer actual) {
+        throw new RuntimeException(
+                "Comparing ByteBuffers using their .equals is probably not what you want"
+                + " -- use assertByteBufferEquals instead.");
+    }
+
+    /**
+     * Asserts that the position, limit, and capacity of the provided buffers are the same, and that
+     * their contents (from position {@code 0} to capacity) are the same.
+     */
+    protected static void assertByteBufferEquals(ByteBuffer expected, ByteBuffer actual) {
+        if (expected == null) {
+            if (actual == null) {
+                return;
+            } else {
+                fail("Expected: null, actual: " + bufferToString(actual));
+            }
+        } else {
+            if (actual == null) {
+                fail("Expected: " + bufferToString(expected) + ", actual: null");
+            } else {
+                if ((expected.capacity() != actual.capacity())
+                        || (expected.position() != actual.position())
+                        || (expected.limit() != actual.limit())
+                        || (!equals(expected.array(), expected.arrayOffset(), expected.capacity(),
+                                    actual.array(), actual.arrayOffset(), actual.capacity()))) {
+                    fail("Expected: " + bufferToString(expected)
+                            + ", actual: " + bufferToString(actual));
+                }
+            }
+        }
+    }
+
+    private static String bufferToString(ByteBuffer buffer) {
+        return "ByteBuffer[pos: " + buffer.position() + ", limit: " + buffer.limit()
+                + ", capacity: " + buffer.capacity()
+                + ", backing array: " + HexEncoding.encode(
+                        buffer.array(), buffer.arrayOffset(), buffer.capacity()) + "]";
+    }
+
+    protected static boolean equals(byte[] arr1, int offset1, int len1, byte[] arr2, int offset2,
+            int len2) {
+        if (arr1 == null) {
+            return (arr2 == null);
+        } else if (arr2 == null) {
+            return (arr1 == null);
+        } else {
+            if (len1 != len2) {
+                return false;
+            }
+            for (int i = 0; i < len1; i++) {
+                if (arr1[i + offset1] != arr2[i + offset2]) {
+                    return false;
+                }
+            }
+            return true;
+        }
+    }
+
+    protected static byte[] subarray(byte[] array, int beginIndex, int endIndex) {
+        byte[] result = new byte[endIndex - beginIndex];
+        System.arraycopy(array, beginIndex, result, 0, result.length);
+        return result;
+    }
+
+    protected static byte[] concat(byte[]... arrays) {
+        int resultLength = 0;
+        for (byte[] array : arrays) {
+            resultLength += (array != null) ? array.length : 0;
+        }
+
+        byte[] result = new byte[resultLength];
+        int resultOffset = 0;
+        for (byte[] array : arrays) {
+            if (array != null) {
+                System.arraycopy(array, 0, result, resultOffset, array.length);
+                resultOffset += array.length;
+            }
+        }
+        return result;
+    }
+
+    protected static void assertEquals(byte[] expected, byte[] actual) {
+        assertEquals(null, expected, actual);
+    }
+
+    protected static void assertEquals(String message, byte[] expected, byte[] actual) {
+        if (!Arrays.equals(expected, actual)) {
+            StringBuilder detail = new StringBuilder();
+            if (expected != null) {
+                detail.append("Expected (" + expected.length + " bytes): <"
+                        + HexEncoding.encode(expected) + ">");
+            } else {
+                detail.append("Expected: null");
+            }
+            if (actual != null) {
+                detail.append(", actual (" + actual.length + " bytes): <"
+                        + HexEncoding.encode(actual) + ">");
+            } else {
+                detail.append(", actual: null");
+            }
+            if (message != null) {
+                fail(message + ": " + detail);
+            } else {
+                fail(detail.toString());
+            }
+        }
+    }
+
+    protected final void assertInitRejectsIvParameterSpec(byte[] iv) throws Exception {
+        Key key = importKey(getKatKey());
+        createCipher();
+        IvParameterSpec spec = new IvParameterSpec(iv);
+        try {
+            init(Cipher.ENCRYPT_MODE, key, spec);
+            fail();
+        } catch (InvalidAlgorithmParameterException expected) {}
+
+        try {
+            init(Cipher.WRAP_MODE, key, spec);
+            fail();
+        } catch (InvalidAlgorithmParameterException expected) {}
+
+        try {
+            init(Cipher.DECRYPT_MODE, key, spec);
+            fail();
+        } catch (InvalidAlgorithmParameterException expected) {}
+
+        try {
+            init(Cipher.UNWRAP_MODE, key, spec);
+            fail();
+        } catch (InvalidAlgorithmParameterException expected) {}
+
+        AlgorithmParameters param = AlgorithmParameters.getInstance("AES");
+        param.init(new IvParameterSpec(iv));
+        try {
+            init(Cipher.ENCRYPT_MODE, key, param);
+            fail();
+        } catch (InvalidAlgorithmParameterException expected) {}
+
+        try {
+            init(Cipher.WRAP_MODE, key, param);
+            fail();
+        } catch (InvalidAlgorithmParameterException expected) {}
+
+        try {
+            init(Cipher.DECRYPT_MODE, key, param);
+            fail();
+        } catch (InvalidAlgorithmParameterException expected) {}
+
+        try {
+            init(Cipher.UNWRAP_MODE, key, param);
+            fail();
+        } catch (InvalidAlgorithmParameterException expected) {}
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/CipherTest.java b/tests/tests/keystore/src/android/keystore/cts/CipherTest.java
new file mode 100644
index 0000000..e2c1d69
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/CipherTest.java
@@ -0,0 +1,1550 @@
+/*
+ * Copyright 2015 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.keystore.cts;
+
+import android.security.keystore.KeyProperties;
+import android.security.keystore.KeyProtection;
+import android.test.AndroidTestCase;
+import android.test.MoreAsserts;
+
+import com.android.cts.keystore.R;
+
+import java.security.AlgorithmParameters;
+import java.security.InvalidKeyException;
+import java.security.Key;
+import java.security.Provider;
+import java.security.Security;
+import java.security.Signature;
+import java.security.SignatureException;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.MGF1ParameterSpec;
+import java.security.Provider.Service;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.spec.GCMParameterSpec;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.OAEPParameterSpec;
+import javax.crypto.spec.PSource;
+import javax.crypto.spec.SecretKeySpec;
+
+/**
+ * Tests for algorithm-agnostic functionality of {@code Cipher} implementations backed by Android
+ * Keystore.
+ */
+public class CipherTest extends AndroidTestCase {
+
+    private static final String EXPECTED_PROVIDER_NAME = TestUtils.EXPECTED_CRYPTO_OP_PROVIDER_NAME;
+
+    private static final String[] EXPECTED_ALGORITHMS = {
+        "AES/ECB/NoPadding",
+        "AES/ECB/PKCS7Padding",
+        "AES/CBC/NoPadding",
+        "AES/CBC/PKCS7Padding",
+        "AES/CTR/NoPadding",
+        "AES/GCM/NoPadding",
+        "RSA/ECB/NoPadding",
+        "RSA/ECB/PKCS1Padding",
+        "RSA/ECB/OAEPPadding",
+        "RSA/ECB/OAEPWithSHA-1AndMGF1Padding",
+        "RSA/ECB/OAEPWithSHA-224AndMGF1Padding",
+        "RSA/ECB/OAEPWithSHA-256AndMGF1Padding",
+        "RSA/ECB/OAEPWithSHA-384AndMGF1Padding",
+        "RSA/ECB/OAEPWithSHA-512AndMGF1Padding",
+    };
+
+    private static class KatVector {
+        private final byte[] plaintext;
+        private final byte[] ciphertext;
+        private final AlgorithmParameterSpec params;
+
+        private KatVector(String plaintextHex, String ciphertextHex) {
+            this(plaintextHex, null, ciphertextHex);
+        }
+
+        private KatVector(String plaintextHex, AlgorithmParameterSpec params,
+                String ciphertextHex) {
+            this(HexEncoding.decode(plaintextHex), params, HexEncoding.decode(ciphertextHex));
+        }
+
+        private KatVector(byte[] plaintext, byte[] ciphertext) {
+            this(plaintext, null, ciphertext);
+        }
+
+        private KatVector(byte[] plaintext, AlgorithmParameterSpec params, byte[] ciphertext) {
+            this.plaintext = plaintext;
+            this.ciphertext = ciphertext;
+            this.params = params;
+        }
+    }
+    private static final Map<String, KatVector> KAT_VECTORS =
+            new TreeMap<String, KatVector>(String.CASE_INSENSITIVE_ORDER);
+    static {
+        // From RI
+        KAT_VECTORS.put("AES/ECB/NoPadding", new KatVector(
+                "0383911bb1519d58e6656f3fd35639c502dbeb2196cea937fca272666cb4a80b",
+                "6574c5065283b89e0c930019e4655d8516b98170db6516cd83e589bd9c5e5adc"));
+        KAT_VECTORS.put("AES/ECB/PKCS7Padding", new KatVector(
+                "1ad3d73a3cfa66dac78a51a95c2cb2125ea701e6e9ecbca2415b436f0258e2ba7439b67545",
+                "920f873f2f9e91bac4c9c948d66496a21b8b2606850490dac7abecae83317488ee550b9973ac5cd142"
+                + "f387d7d2a12752"));
+        KAT_VECTORS.put("AES/CBC/NoPadding", new KatVector(
+                "1dffe21c8f18276c3a39ed0c53ab257b84efcedab60095c4cadd131143058cf7",
+                new IvParameterSpec(HexEncoding.decode("10b3eea6cc8a7d6f48337e9b6987d28c")),
+                "47ab115bfadca91eaebec73ab942a06f3121fdd5aa55d223bd2cbcc3855e1ef8"));
+        KAT_VECTORS.put("AES/CBC/PKCS7Padding", new KatVector(
+                "9d49fb970b23bfe742ae7c45a773ada9faad84708c8858a06e4a192e0a90e2f6083548e0bf3f67",
+                new IvParameterSpec(HexEncoding.decode("ecd87bf9c49f37dcd2294e309192289a")),
+                "aeb64f48ec18a086eda7ee080948651a50b6f582ab54aac5454c9ab0a4de5b4a4abac526a4307011d1"
+                + "2881f1849c32ae"));
+        KAT_VECTORS.put("AES/CTR/NoPadding", new KatVector(
+                "b4e786cab9df48d2fce0c7872651314db1318d1f31a1b10a2c334d2555b4117668",
+                new IvParameterSpec(HexEncoding.decode("94d9f7a6d16f58018819b668020b68cc")),
+                "022e74572a70be57a0b65b2fb5bc9b803ce48973b6163f528bbe1fd001e29d330a"));
+        KAT_VECTORS.put("AES/GCM/NoPadding", new KatVector(
+                "03889a6ca811e3fd7e78467e3dae587d2110e80e98edbc9dfe17afba238c4c493186",
+                new GCMParameterSpec(128, HexEncoding.decode("f67aaf97cdec65b12188315e")),
+                "159eb1ffc86589b38f18097c32db646c7de3525b603876c3ae671bc2ca52a5395a374b377a915c9ed1"
+                + "a349abf9fc54c9ca81"));
+        KAT_VECTORS.put("RSA/ECB/NoPadding", new KatVector(
+                "50c499d558c38fd48ea76832887db2abc76e4e153a98fd4323ccb8006d34f11724a5692fb101b0eb96"
+                + "060eb9d15222",
+                "349b1d5061e98d0ab3f2327680bbc0cbb1b8ef8ee26148d7c67cf535223e3f78d822d369592ede29b1"
+                + "654aab25e6ae5e098318e55c13dc405f5ba27e5cc69ced32778592a51e6293a03f95e14ed17099fb"
+                + "0ac585e41297b87c3432953df0d98be7e505dc7de7bfe9d9ec750f475afeba4cc2dd78838c0d4399"
+                + "d8de02b07f00b292dc3d32d2a2f98ea5a5dac1a0fec4d01e5c3aea8c56eeff264896fb6cf2144401"
+                + "278c6663417bc00aafbb9eb97c056573cdec88d6ac6fd6c333d131337b16031da229029e3b6fe6f8"
+                + "ee427f2e90041e9636d67cddac75845914ce4be56092eed7188fe7e2bb33769efdeed86a7acbe15d"
+                + "debf92d9fbaaddede206acfa650697"));
+        KAT_VECTORS.put("RSA/ECB/PKCS1Padding", new KatVector(
+                "aed8cd94f35b2a54cdd3ed771482bd87e256b995408558fb82e5d475d1ee54711472f899ad6cbb6847"
+                + "99e52ff1d57cbc39f4",
+                "64148dee294dd3ea31d2b595ea661318cf90c89f71393cf6559087d6e8993e73eb1e6b5f4d3cfde3cb"
+                + "267938c5eca522b95a2df02df9c703dbe3103c157af0d2ed5b70da51cb4caa49061319420d0ea433"
+                + "f24b727530c162226bc806b7f39079cd494a5c8a242737413d27063f9fb74aadd20f521211316719"
+                + "c628fd4351d0608928949b6f59f351d9ccec4c596514335010834fcabd53a2cbb2642e0f83c4f89c"
+                + "199ee2c68ace9182cf484d99e86b0b2213c1cc113d24891958e5a0774b7486abae1475e46a939a94"
+                + "5d6491b98ad7979fd6e752b47e43e960557a0c0589d7d0444b011d75c9f5b143da6e1dcf7b678a2e"
+                + "f82fbe37a74df3e20fb1a9dbfd5978"));
+        KAT_VECTORS.put("RSA/ECB/OAEPPadding", new KatVector(
+                "c219f4e3e37eae2315f0fa4ebc4b46ef0c6befbb43a51ceda07435fc88a9",
+                "7a9bcfd0d02b6434025bbf5ba09c2dad118a4a3bca7cced8b404bc0fc2f17ddee13de82c8324294bf2"
+                + "60ad6e5171c2c3728a0c0fab20dd60e4e56cfef3e66239439ed2eddcc83ac8eeaedfd970e9966de3"
+                + "94ad1df0df503a0a640a49e10885b3a4115c3e94e893fff87bf9a5808350f957d6bc556ca6b08f81"
+                + "bf697704a3eb3db774797f883af0dcdc9bd9196d7595bab5e87d3187eb45b5771abe4e4dc70c25fa"
+                + "b9e3cddb6ae453a1d8e517d000779472e1376e5848b1654a51a9e90be4a4a6d0f6b8723c6e93c471"
+                + "313ea94f24504ca377b502057331355965a7e0b9c3b1d1fbd24ab5a4167f721d1ddac4d3c094d5c9"
+                + "0d2e277e9b5617cbf2770186323e89"));
+        KAT_VECTORS.put("RSA/ECB/OAEPWithSHA-1AndMGF1Padding", new KatVector(
+                "bb2854620bb0e361d1384703dda12acee1fefc22024bcfc40a86390d5342c693aab8c7ed6517d8da86"
+                + "04492c9d",
+                "77033c578f24ef0ed93bfe6dc6f7c3f9f0505e7562f67ce987a269cabaa8a3ae7dd5e567a8b37db42d"
+                + "a79aa86ea2e189af5b9560b39407ff86f2785cdaf660fc7c93649bc24a818de564cb0d03e7681fa8"
+                + "f3cd42b3bfc58c49d3f049e0c98b07aff95876f05ddc45ebaa7127a198f27ae0cfd161c5598ac795"
+                + "8ed386d98b13d45730e6dc16313fe012af27d7be0e45215040bbfb07f2d35e34291fe4335a68175a"
+                + "46be99a15c1ccf673659157e1f52105de5a0a6f8c9d946740216eefe2a01a37b0ab144a44ff0d800"
+                + "be713b5b44acf4fcb1a60d5db977af4d77fa77bdb8594032b2f5bbdd49346b08e0e98ab1051b462e"
+                + "160c1bff62b927cd26c936948b723a"));
+        KAT_VECTORS.put("RSA/ECB/OAEPWithSHA-224AndMGF1Padding", new KatVector(
+                "1bae19434be6599d1987b1ed866dd6b684dcd908bd98d797250be545eafea46d05ebdf9018",
+                "0f18b4a1153c6f8821e18a4275e4b570d540c8ad86bfc99146e5475238a43ecbe63bc81368cd64b9a2"
+                + "ab3ccd586e6afaad054c9d7bdc986adf022ec86335d110c53ebd5f2f2bd49d48d6da9541312c9b1b"
+                + "cc299ca4f59475869e4ec2253c91b137eae274a245fc9ee6262f74754bbda55d8bd25bfa4c1698f3"
+                + "a22d2d8d7fc6e9fbb56d828e61912b3085d82cceaeb1d2da425871575e7ba31a3d47b1b7d7df0bda"
+                + "81d62c75a9887bbc528fc6bb51db09884bb513b4cc94ca4a5fe0b370ca548dcdf60eebbf61e7efe7"
+                + "630fc47256d6d617fc1c2c774405f385650898abea03502cfbdcb53579fd18d896490e67aecdb7c7"
+                + "b7b950dc7ddba5c64188494c1a177b"));
+        KAT_VECTORS.put("RSA/ECB/OAEPWithSHA-256AndMGF1Padding", new KatVector(
+                "332c2f2fc066fb29ec0928a52b5111ce6965546ce73927340c42d33b56b6ba547b77ac361ac0d13316"
+                + "345ca953840023d892fa4ff1aa32cc66d5aa88b79867",
+                "942c0ba1c67a34a7e116d9281b1df5084c66bc1458faf1b26d4f0f63a57307a9addcd3e5d2f3320071"
+                + "5a3d95ae84fb40a8dfe4cb0a28873fd5883ff8ee6efbfe38c460c755577b34fcf05bb2077afec7b2"
+                + "203799022be6a0903915e01e94abc51efe9c5548eb86bbbb4fd7f3bfc7b86f388128b6df1e6ce651"
+                + "230c6bc18bbf55b029f1e31da880c27d947ff97519df66a57ead6db791c4978f1d62edec0d89bb16"
+                + "83d237213f3f24271ddb8c4b50a82527954f0e49ae44d3acd8ddd3a57cfbfa456dd40675d5d75542"
+                + "31c6b79c7fb3500b1631be1d100e67d85ce423845fdc7c7f45e346a8ba573f5d11de9009069468dd"
+                + "8d517ad4adb1509dd5173ee1862d74"));
+        KAT_VECTORS.put("RSA/ECB/OAEPWithSHA-384AndMGF1Padding", new KatVector(
+                "f51f158cbad4dbab38403b839c724f09a480c49be29c0e72615539dbe57ec86143f31f19392f419b5b"
+                + "e4ba9e3c6f1e870d307a7cf1a9e2",
+                "944243f35f534e7a273e94986b6835a4f5cdc5bc4efb9970d4760986599a02f652a848fcae333ff25a"
+                + "64108c9b900aaf002688398ad9fc17c73be52726306af9c13540df9d1765336b6f09ba4cb8a54d72"
+                + "5a4e45854bfa3802cfb110a6d7f7054e6072440ec00da62828cb75fe2566ec5be79eb8a3d1fbe2c2"
+                + "4439c107e5018e445e201ad80725755543c00dec50bb464c6ca897600eb3cda51fcef8161ac13d75"
+                + "a3eb30d385a1e718a61ae1b5d47aadb966fc007becc84db397d0b3cd983121872f9975995153e869"
+                + "9e24554a3c5e885f0ed8cd03e916da5ed541f1598da9bd6209447301d00f086153da353deff9d045"
+                + "8976ff7570410f0bdcfb3f56b782f5"));
+        KAT_VECTORS.put("RSA/ECB/OAEPWithSHA-512AndMGF1Padding", new KatVector(
+                "d45f6ccc7e663957f234c237c1f09bf7791f6f5c1b9ef4fefb16e55ded0d96112e590f1bb08a60f85c"
+                + "2d0d2533f1d69792dfd8d647d880b18f87cfe32488c73613a3d535da7d776d90d9a4ba6a0311f456"
+                + "8511da49107c",
+                "5a037df3e5d6f3f703541e2db2aef7c69985e513bdff67c8ade6a09f50e27267bfb444f6c69b40a77a"
+                + "9136a27b29876af9d2bf4e7099863445d35b188d31f376b89fbd196059667ca657e10b9454c2b25f"
+                + "046fc9f7b42506e382e6b6fd99409cf97e865e65f8dce5d14a06b8aa8833c4bc72c8764467758f2d"
+                + "7960243161dce4ca8231e91bfcd3c933a80bc703ceab976224c876b1f550f91a6c2a0332d4377bd8"
+                + "dfe4b1283ab114e517b7b9e4a6e0bf166d5b506e7a3b7328078e12cb23b1d938760767dc9b3c3eb0"
+                + "848ddda101792aca9273ad414314c13fc511ffa0358a8f4c5f38edded3a2dc111fa62c80e6032c32"
+                + "ae04aeac7729f16a6310f1f6785c27"));
+    }
+
+    private static final long DAY_IN_MILLIS = TestUtils.DAY_IN_MILLIS;
+
+    private static final byte[] AES128_KAT_KEY_BYTES =
+            HexEncoding.decode("7d9f11a0da111e9d8bdd14f04648ed91");
+
+    private static final byte[] AES192_KAT_KEY_BYTES =
+            HexEncoding.decode("69ef2c44a48d3dc4d5744a281f7ebb5ca976c2202f91e10c");
+
+    private static final byte[] AES256_KAT_KEY_BYTES =
+            HexEncoding.decode("cf601cc10aaf434d1f01747136aff222af7fb426d101901712214c3fea18125f");
+
+    public void testAlgorithmList() {
+        // Assert that Android Keystore Provider exposes exactly the expected Cipher
+        // transformations. We don't care whether the transformations are exposed via aliases, as
+        // long as canonical names of transformation are accepted.
+        // If the Provider exposes extraneous algorithms, it'll be caught because it'll have to
+        // expose at least one Service for such an algorithm, and this Service's algorithm will
+        // not be in the expected set.
+
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        Set<Service> services = provider.getServices();
+        Set<String> actualAlgsLowerCase = new HashSet<String>();
+        Set<String> expectedAlgsLowerCase = new HashSet<String>(
+                Arrays.asList(TestUtils.toLowerCase(EXPECTED_ALGORITHMS)));
+        for (Service service : services) {
+            if ("Cipher".equalsIgnoreCase(service.getType())) {
+                String algLowerCase = service.getAlgorithm().toLowerCase(Locale.US);
+                actualAlgsLowerCase.add(algLowerCase);
+            }
+        }
+
+        TestUtils.assertContentsInAnyOrder(actualAlgsLowerCase,
+                expectedAlgsLowerCase.toArray(new String[0]));
+    }
+
+    public void testAndroidKeyStoreKeysHandledByAndroidKeyStoreProviderWhenDecrypting()
+            throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                ImportedKey key = importDefaultKatKey(
+                        algorithm,
+                        KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT,
+                        false);
+
+                // Decryption may need additional parameters. Initializing a Cipher for encryption
+                // forces it to generate any such parameters.
+                Cipher cipher = Cipher.getInstance(algorithm, provider);
+                cipher.init(Cipher.ENCRYPT_MODE, key.getKeystoreBackedEncryptionKey());
+                AlgorithmParameters params = cipher.getParameters();
+
+                // Test DECRYPT_MODE
+                cipher = Cipher.getInstance(algorithm);
+                Key decryptionKey = key.getKeystoreBackedDecryptionKey();
+                cipher.init(Cipher.DECRYPT_MODE, decryptionKey, params);
+                assertSame(provider, cipher.getProvider());
+
+                // Test UNWRAP_MODE
+                cipher = Cipher.getInstance(algorithm);
+                if (params != null) {
+                    cipher.init(Cipher.UNWRAP_MODE, decryptionKey, params);
+                } else {
+                    cipher.init(Cipher.UNWRAP_MODE, decryptionKey);
+                }
+                assertSame(provider, cipher.getProvider());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testAndroidKeyStorePublicKeysAcceptedByHighestPriorityProviderWhenEncrypting()
+            throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            if (isSymmetric(algorithm)) {
+                continue;
+            }
+            try {
+                Key key = importDefaultKatKey(
+                        algorithm,
+                        KeyProperties.PURPOSE_ENCRYPT,
+                        false).getKeystoreBackedEncryptionKey();
+
+                Cipher cipher = Cipher.getInstance(algorithm);
+                cipher.init(Cipher.ENCRYPT_MODE, key);
+
+                cipher = Cipher.getInstance(algorithm);
+                cipher.init(Cipher.WRAP_MODE, key);
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for" + algorithm, e);
+            }
+        }
+    }
+
+    public void testEmptyPlaintextEncryptsAndDecrypts()
+            throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+        final byte[] originalPlaintext = EmptyArray.BYTE;
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            for (ImportedKey key : importKatKeys(
+                    algorithm,
+                    KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT,
+                    false)) {
+                try {
+                    Key encryptionKey = key.getKeystoreBackedEncryptionKey();
+                    byte[] plaintext = truncatePlaintextIfNecessary(
+                            algorithm, encryptionKey, originalPlaintext);
+                    if (plaintext == null) {
+                        // Key is too short to encrypt anything using this transformation
+                        continue;
+                    }
+                    Cipher cipher = Cipher.getInstance(algorithm, provider);
+                    cipher.init(Cipher.ENCRYPT_MODE, encryptionKey);
+                    AlgorithmParameters params = cipher.getParameters();
+                    byte[] ciphertext = cipher.doFinal(plaintext);
+                    byte[] expectedPlaintext = plaintext;
+                    if ("RSA/ECB/NoPadding".equalsIgnoreCase(algorithm)) {
+                        // RSA decryption without padding left-pads resulting plaintext with NUL
+                        // bytes to the length of RSA modulus.
+                        int modulusLengthBytes = (TestUtils.getKeySizeBits(encryptionKey) + 7) / 8;
+                        expectedPlaintext = TestUtils.leftPadWithZeroBytes(
+                                expectedPlaintext, modulusLengthBytes);
+                    }
+
+                    cipher = Cipher.getInstance(algorithm, provider);
+                    Key decryptionKey = key.getKeystoreBackedDecryptionKey();
+                    cipher.init(Cipher.DECRYPT_MODE, decryptionKey, params);
+                    byte[] actualPlaintext = cipher.doFinal(ciphertext);
+                    MoreAsserts.assertEquals(expectedPlaintext, actualPlaintext);
+                } catch (Throwable e) {
+                    throw new RuntimeException(
+                            "Failed for " + algorithm + " with key " + key.getAlias(),
+                            e);
+                }
+            }
+        }
+    }
+
+    public void testCiphertextGeneratedByAndroidKeyStoreDecryptsByAndroidKeyStore()
+            throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+        final byte[] originalPlaintext = "Very secret message goes here...".getBytes("US-ASCII");
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            for (ImportedKey key : importKatKeys(
+                    algorithm,
+                    KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT,
+                    false)) {
+                try {
+                    Key encryptionKey = key.getKeystoreBackedEncryptionKey();
+                    byte[] plaintext = truncatePlaintextIfNecessary(
+                            algorithm, encryptionKey, originalPlaintext);
+                    if (plaintext == null) {
+                        // Key is too short to encrypt anything using this transformation
+                        continue;
+                    }
+                    Cipher cipher = Cipher.getInstance(algorithm, provider);
+                    cipher.init(Cipher.ENCRYPT_MODE, encryptionKey);
+                    AlgorithmParameters params = cipher.getParameters();
+                    byte[] ciphertext = cipher.doFinal(plaintext);
+                    byte[] expectedPlaintext = plaintext;
+                    if ("RSA/ECB/NoPadding".equalsIgnoreCase(algorithm)) {
+                        // RSA decryption without padding left-pads resulting plaintext with NUL
+                        // bytes to the length of RSA modulus.
+                        int modulusLengthBytes = (TestUtils.getKeySizeBits(encryptionKey) + 7) / 8;
+                        expectedPlaintext = TestUtils.leftPadWithZeroBytes(
+                                expectedPlaintext, modulusLengthBytes);
+                    }
+
+                    cipher = Cipher.getInstance(algorithm, provider);
+                    Key decryptionKey = key.getKeystoreBackedDecryptionKey();
+                    cipher.init(Cipher.DECRYPT_MODE, decryptionKey, params);
+                    byte[] actualPlaintext = cipher.doFinal(ciphertext);
+                    MoreAsserts.assertEquals(expectedPlaintext, actualPlaintext);
+                } catch (Throwable e) {
+                    throw new RuntimeException(
+                            "Failed for " + algorithm + " with key " + key.getAlias(),
+                            e);
+                }
+            }
+        }
+    }
+
+    public void testCiphertextGeneratedByHighestPriorityProviderDecryptsByAndroidKeyStore()
+            throws Exception {
+        Provider keystoreProvider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(keystoreProvider);
+        byte[] originalPlaintext = "Very secret message goes here...".getBytes("UTF-8");
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            for (ImportedKey key : importKatKeys(
+                    algorithm,
+                    KeyProperties.PURPOSE_DECRYPT,
+                    false)) {
+                Provider encryptionProvider = null;
+                try {
+                    Key encryptionKey = key.getOriginalEncryptionKey();
+                    byte[] plaintext = truncatePlaintextIfNecessary(
+                            algorithm, encryptionKey, originalPlaintext);
+                    if (plaintext == null) {
+                        // Key is too short to encrypt anything using this transformation
+                        continue;
+                    }
+
+                    Cipher cipher;
+                    try {
+                        cipher = Cipher.getInstance(algorithm);
+                        cipher.init(Cipher.ENCRYPT_MODE, encryptionKey);
+                    } catch (InvalidKeyException e) {
+                        // No providers support encrypting using this algorithm and key.
+                        continue;
+                    }
+                    encryptionProvider = cipher.getProvider();
+                    if (keystoreProvider == encryptionProvider) {
+                        // This is covered by another test.
+                        continue;
+                    }
+                    AlgorithmParameters params = cipher.getParameters();
+
+                    // TODO: Remove this workaround for Bug 22405492 once the issue is fixed. The
+                    // issue is that Bouncy Castle incorrectly defaults the MGF1 digest to the
+                    // digest specified in the transformation. RI and Android Keystore keep the MGF1
+                    // digest defaulted at SHA-1.
+                    if ((params != null) && ("OAEP".equalsIgnoreCase(params.getAlgorithm()))) {
+                        OAEPParameterSpec spec = params.getParameterSpec(OAEPParameterSpec.class);
+                        if (!"SHA-1".equalsIgnoreCase(
+                                ((MGF1ParameterSpec) spec.getMGFParameters())
+                                        .getDigestAlgorithm())) {
+                            cipher.init(Cipher.ENCRYPT_MODE, encryptionKey, new OAEPParameterSpec(
+                                    spec.getDigestAlgorithm(),
+                                    "MGF1",
+                                    MGF1ParameterSpec.SHA1,
+                                    PSource.PSpecified.DEFAULT));
+                            params = cipher.getParameters();
+                        }
+                    }
+
+                    byte[] ciphertext = cipher.doFinal(plaintext);
+                    byte[] expectedPlaintext = plaintext;
+                    if ("RSA/ECB/NoPadding".equalsIgnoreCase(algorithm)) {
+                        // RSA decryption without padding left-pads resulting plaintext with NUL
+                        // bytes to the length of RSA modulus.
+                        int modulusLengthBytes = (TestUtils.getKeySizeBits(encryptionKey) + 7) / 8;
+                        expectedPlaintext = TestUtils.leftPadWithZeroBytes(
+                                expectedPlaintext, modulusLengthBytes);
+                    }
+
+                    // TODO: Remove this workaround once Android Keystore AES-GCM supports IVs of
+                    // sizes other than 12 bytes. For example, Bouncy Castle auto-generates 16-byte
+                    // long IVs.
+                    if ("AES/GCM/NoPadding".equalsIgnoreCase(algorithm)) {
+                        byte[] iv = cipher.getIV();
+                        if ((iv != null) && (iv.length != 12)) {
+                            // Android Keystore AES-GCM only supports 12-byte long IVs.
+                            continue;
+                        }
+                    }
+
+                    // TODO: Remove this workaround for Bug 22319986 once the issue is fixed. The issue
+                    // is that Conscrypt and Bouncy Castle's AES/GCM/NoPadding implementations return
+                    // AlgorithmParameters of algorithm "AES" from which it's impossible to obtain a
+                    // GCMParameterSpec. They should be returning AlgorithmParameters of algorithm
+                    // "GCM".
+                    if (("AES/GCM/NoPadding".equalsIgnoreCase(algorithm))
+                            && (!"GCM".equalsIgnoreCase(params.getAlgorithm()))) {
+                        params = AlgorithmParameters.getInstance("GCM");
+                        params.init(new GCMParameterSpec(128, cipher.getIV()));
+                    }
+
+                    cipher = Cipher.getInstance(algorithm, keystoreProvider);
+                    Key decryptionKey = key.getKeystoreBackedDecryptionKey();
+                    cipher.init(Cipher.DECRYPT_MODE, decryptionKey, params);
+                    byte[] actualPlaintext = cipher.doFinal(ciphertext);
+                    MoreAsserts.assertEquals(expectedPlaintext, actualPlaintext);
+                } catch (Throwable e) {
+                    throw new RuntimeException(
+                            "Failed for " + algorithm + " with key " + key.getAlias()
+                                    + ", encryption provider: " + encryptionProvider,
+                            e);
+                }
+            }
+        }
+    }
+
+    public void testCiphertextGeneratedByAndroidKeyStoreDecryptsByHighestPriorityProvider()
+            throws Exception {
+        Provider keystoreProvider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(keystoreProvider);
+        byte[] originalPlaintext = "Very secret message goes here...".getBytes("UTF-8");
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            for (ImportedKey key : importKatKeys(
+                    algorithm,
+                    KeyProperties.PURPOSE_ENCRYPT,
+                    false)) {
+                Provider decryptionProvider = null;
+                try {
+                    Key encryptionKey = key.getKeystoreBackedEncryptionKey();
+                    byte[] plaintext = truncatePlaintextIfNecessary(
+                            algorithm, encryptionKey, originalPlaintext);
+                    if (plaintext == null) {
+                        // Key is too short to encrypt anything using this transformation
+                        continue;
+                    }
+                    Cipher cipher = Cipher.getInstance(algorithm, keystoreProvider);
+                    cipher.init(Cipher.ENCRYPT_MODE, encryptionKey);
+                    AlgorithmParameters params = cipher.getParameters();
+
+                    byte[] ciphertext = cipher.doFinal(plaintext);
+                    byte[] expectedPlaintext = plaintext;
+                    if ("RSA/ECB/NoPadding".equalsIgnoreCase(algorithm)) {
+                        // RSA decryption without padding left-pads resulting plaintext with NUL
+                        // bytes to the length of RSA modulus.
+                        int modulusLengthBytes = (TestUtils.getKeySizeBits(encryptionKey) + 7) / 8;
+                        expectedPlaintext = TestUtils.leftPadWithZeroBytes(
+                                expectedPlaintext, modulusLengthBytes);
+                    }
+
+                    Key decryptionKey = key.getOriginalDecryptionKey();
+                    try {
+                        cipher = Cipher.getInstance(algorithm);
+                        if (params != null) {
+                            cipher.init(Cipher.DECRYPT_MODE, decryptionKey, params);
+                        } else {
+                            cipher.init(Cipher.DECRYPT_MODE, decryptionKey);
+                        }
+                    } catch (InvalidKeyException e) {
+                        // No providers support decrypting using this algorithm and key.
+                        continue;
+                    }
+                    decryptionProvider = cipher.getProvider();
+                    if (keystoreProvider == decryptionProvider) {
+                        // This is covered by another test.
+                        continue;
+                    }
+                    byte[] actualPlaintext = cipher.doFinal(ciphertext);
+                    MoreAsserts.assertEquals(expectedPlaintext, actualPlaintext);
+                } catch (Throwable e) {
+                    throw new RuntimeException(
+                            "Failed for " + algorithm + " with key " + key.getAlias()
+                                    + ", decryption provider: " + decryptionProvider,
+                            e);
+                }
+            }
+        }
+    }
+
+    public void testMaxSizedPlaintextSupported() throws Exception {
+        Provider keystoreProvider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(keystoreProvider);
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            if (isSymmetric(algorithm)) {
+                // No input length restrictions (except multiple of block size for some
+                // transformations).
+                continue;
+            }
+            for (ImportedKey key : importKatKeys(
+                    algorithm,
+                    KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT,
+                    false)) {
+                int plaintextSizeBytes = -1;
+                Provider otherProvider = null;
+                try {
+                    Key encryptionKey = key.getKeystoreBackedEncryptionKey();
+                    int maxSupportedPlaintextSizeBytes =
+                            TestUtils.getMaxSupportedPlaintextInputSizeBytes(
+                                    algorithm, encryptionKey);
+                    if (maxSupportedPlaintextSizeBytes < 0) {
+                        // Key too short to encrypt anything using this transformation.
+                        continue;
+                    } else if (maxSupportedPlaintextSizeBytes == Integer.MAX_VALUE) {
+                        // No input length restrictions.
+                        continue;
+                    }
+                    byte[] plaintext = new byte[maxSupportedPlaintextSizeBytes];
+                    Arrays.fill(plaintext, (byte) 0xff);
+                    plaintextSizeBytes = plaintext.length;
+
+                    // Encrypt plaintext using Android Keystore Cipher
+                    Cipher cipher = Cipher.getInstance(algorithm, keystoreProvider);
+                    cipher.init(Cipher.ENCRYPT_MODE, encryptionKey);
+                    AlgorithmParameters params = cipher.getParameters();
+                    byte[] ciphertext = cipher.doFinal(plaintext);
+                    byte[] expectedPlaintext = plaintext;
+                    if ("RSA/ECB/NoPadding".equalsIgnoreCase(algorithm)) {
+                        // RSA decryption without padding left-pads resulting plaintext with NUL
+                        // bytes to the length of RSA modulus.
+                        int modulusLengthBytes = (TestUtils.getKeySizeBits(encryptionKey) + 7) / 8;
+                        expectedPlaintext = TestUtils.leftPadWithZeroBytes(
+                                expectedPlaintext, modulusLengthBytes);
+                    }
+
+                    // Check that ciphertext decrypts using Android Keystore Cipher
+                    cipher = Cipher.getInstance(algorithm, keystoreProvider);
+                    Key decryptionKey = key.getKeystoreBackedDecryptionKey();
+                    cipher.init(Cipher.DECRYPT_MODE, decryptionKey, params);
+                    byte[] actualPlaintext = cipher.doFinal(ciphertext);
+                    MoreAsserts.assertEquals(expectedPlaintext, actualPlaintext);
+
+                    // Check that ciphertext decrypts using the highest-priority provider.
+                    cipher = Cipher.getInstance(algorithm);
+                    decryptionKey = key.getOriginalDecryptionKey();
+                    try {
+                        cipher.init(Cipher.DECRYPT_MODE, decryptionKey, params);
+                    } catch (InvalidKeyException e) {
+                        // No other providers offer decryption using this transformation and key.
+                        continue;
+                    }
+                    otherProvider = cipher.getProvider();
+                    if (otherProvider == keystoreProvider) {
+                        // This has already been tested above.
+                        continue;
+                    }
+                    actualPlaintext = cipher.doFinal(ciphertext);
+                    MoreAsserts.assertEquals(expectedPlaintext, actualPlaintext);
+                } catch (Throwable e) {
+                    throw new RuntimeException(
+                            "Failed for " + algorithm + " with key " + key.getAlias()
+                                    + " and " + plaintextSizeBytes + " long plaintext"
+                                    + ", other provider: " + otherProvider,
+                            e);
+                }
+            }
+        }
+    }
+
+    public void testLargerThanMaxSizedPlaintextRejected() throws Exception {
+        Provider keystoreProvider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(keystoreProvider);
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            if (isSymmetric(algorithm)) {
+                // No input length restrictions (except multiple of block size for some
+                // transformations).
+                continue;
+            }
+            for (ImportedKey key : importKatKeys(
+                    algorithm,
+                    KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT,
+                    false)) {
+                int plaintextSizeBytes = -1;
+                Provider otherProvider = null;
+                try {
+                    Key encryptionKey = key.getKeystoreBackedEncryptionKey();
+                    int maxSupportedPlaintextSizeBytes =
+                            TestUtils.getMaxSupportedPlaintextInputSizeBytes(
+                                    algorithm, encryptionKey);
+                    if (maxSupportedPlaintextSizeBytes < 0) {
+                        // Key too short to encrypt anything using this transformation.
+                        continue;
+                    } else if (maxSupportedPlaintextSizeBytes == Integer.MAX_VALUE) {
+                        // No input length restrictions.
+                        continue;
+                    }
+                    // Create plaintext which is one byte longer than maximum supported one.
+                    byte[] plaintext = new byte[maxSupportedPlaintextSizeBytes + 1];
+                    Arrays.fill(plaintext, (byte) 0xff);
+                    plaintextSizeBytes = plaintext.length;
+
+                    // Encrypting this plaintext using Android Keystore Cipher should fail.
+                    Cipher cipher = Cipher.getInstance(algorithm, keystoreProvider);
+                    cipher.init(Cipher.ENCRYPT_MODE, encryptionKey);
+                    if ("RSA/ECB/NoPadding".equalsIgnoreCase(algorithm)) {
+                        // This transformation is special: it's supposed to throw a
+                        // BadPaddingException instead of an IllegalBlockSizeException.
+                        try {
+                            byte[] ciphertext = cipher.doFinal(plaintext);
+                            fail("Unexpectedly produced ciphertext (" + ciphertext.length
+                                    + " bytes): " + HexEncoding.encode(ciphertext) + " for "
+                                    + plaintext.length + " byte long plaintext");
+                        } catch (BadPaddingException expected) {}
+                    } else {
+                        try {
+                            byte[] ciphertext = cipher.doFinal(plaintext);
+                            fail("Unexpectedly produced ciphertext (" + ciphertext.length
+                                    + " bytes): " + HexEncoding.encode(ciphertext) + " for "
+                                    + plaintext.length + " byte long plaintext");
+                        } catch (IllegalBlockSizeException expected) {}
+                    }
+
+                    // Encrypting this plaintext using the highest-priority implementation should
+                    // fail.
+                    cipher = Cipher.getInstance(algorithm);
+                    encryptionKey = key.getOriginalEncryptionKey();
+                    try {
+                        cipher.init(Cipher.ENCRYPT_MODE, encryptionKey);
+                    } catch (InvalidKeyException e) {
+                        // No other providers support this transformation with this key.
+                        continue;
+                    }
+                    otherProvider = cipher.getProvider();
+                    if (otherProvider == keystoreProvider) {
+                        // This has already been tested above.
+                        continue;
+                    }
+                    if ("RSA/ECB/NoPadding".equalsIgnoreCase(algorithm)) {
+                        // This transformation is special: it's supposed to throw a
+                        // BadPaddingException instead of an IllegalBlockSizeException.
+                        try {
+                            byte[] ciphertext = cipher.doFinal(plaintext);
+                            fail(otherProvider.getName() + " unexpectedly produced ciphertext ("
+                                    + ciphertext.length + " bytes): "
+                                    + HexEncoding.encode(ciphertext) + " for "
+                                    + plaintext.length + " byte long plaintext");
+                            // TODO: Remove this workaround once Conscrypt's RSA Cipher Bug 22567458
+                            // is fixed. Conscrypt's Cipher.doFinal throws a SignatureException.
+                            // This code is unreachable because of the fail() above. It's here only
+                            // so that the compiler does not complain about us catching
+                            // SignatureException.
+                            Signature sig = Signature.getInstance("SHA256withRSA");
+                            sig.sign();
+                        } catch (BadPaddingException | SignatureException expected) {}
+                    } else {
+                        try {
+                            byte[] ciphertext = cipher.doFinal(plaintext);
+                            fail(otherProvider.getName() + " unexpectedly produced ciphertext ("
+                                    + ciphertext.length + " bytes): "
+                                    + HexEncoding.encode(ciphertext) + " for "
+                                    + plaintext.length + " byte long plaintext");
+                            // TODO: Remove the catching of RuntimeException workaround once the
+                            // corresponding Bug 22567463 in Conscrypt is fixed.
+                        } catch (IllegalBlockSizeException | RuntimeException expected) {}
+                    }
+                } catch (Throwable e) {
+                    throw new RuntimeException(
+                            "Failed for " + algorithm + " with key " + key.getAlias()
+                            + " and " + plaintextSizeBytes + " byte long plaintext"
+                            + ", other provider: " + otherProvider,
+                            e);
+                }
+            }
+        }
+    }
+
+    public void testKat() throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                ImportedKey key = importDefaultKatKey(algorithm,
+                        KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT,
+                        true);
+                KatVector testVector = KAT_VECTORS.get(algorithm);
+                assertNotNull(testVector);
+                Cipher cipher = Cipher.getInstance(algorithm, provider);
+                Key decryptionKey = key.getKeystoreBackedDecryptionKey();
+                cipher.init(Cipher.DECRYPT_MODE, decryptionKey, testVector.params);
+                byte[] actualPlaintext = cipher.doFinal(testVector.ciphertext);
+                byte[] expectedPlaintext = testVector.plaintext;
+                if ("RSA/ECB/NoPadding".equalsIgnoreCase(algorithm)) {
+                    // RSA decryption without padding left-pads resulting plaintext with NUL bytes
+                    // to the length of RSA modulus.
+                    int modulusLengthBytes = (TestUtils.getKeySizeBits(decryptionKey) + 7) / 8;
+                    expectedPlaintext = TestUtils.leftPadWithZeroBytes(
+                            expectedPlaintext, modulusLengthBytes);
+                }
+                MoreAsserts.assertEquals(expectedPlaintext, actualPlaintext);
+                if (!isRandomizedEncryption(algorithm)) {
+                    // Deterministic encryption: ciphertext depends only on plaintext and input
+                    // parameters. Assert that encrypting the plaintext results in the same
+                    // ciphertext as in the test vector.
+                    Key encryptionKey = key.getKeystoreBackedEncryptionKey();
+                    cipher = Cipher.getInstance(algorithm, provider);
+                    cipher.init(Cipher.ENCRYPT_MODE, encryptionKey, testVector.params);
+                    byte[] actualCiphertext = cipher.doFinal(testVector.plaintext);
+                    MoreAsserts.assertEquals(testVector.ciphertext, actualCiphertext);
+                }
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    private static boolean isRandomizedEncryption(String transformation) {
+        String transformationUpperCase = transformation.toUpperCase(Locale.US);
+        return (transformationUpperCase.endsWith("/PKCS1PADDING"))
+                || (transformationUpperCase.contains("OAEP"));
+    }
+
+    public void testInitDecryptFailsWhenNotAuthorizedToDecrypt() throws Exception {
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_DECRYPT);
+                assertInitDecryptSucceeds(transformation, good);
+                assertInitDecryptThrowsInvalidKeyException(transformation,
+                        TestUtils.buildUpon(good, KeyProperties.PURPOSE_ENCRYPT).build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + transformation, e);
+            }
+        }
+    }
+
+    public void testInitEncryptSymmetricFailsWhenNotAuthorizedToEncrypt() throws Exception {
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            if (!isSymmetric(transformation)) {
+                continue;
+            }
+
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_ENCRYPT);
+                assertInitEncryptSucceeds(transformation, good);
+                assertInitEncryptThrowsInvalidKeyException(transformation,
+                        TestUtils.buildUpon(good, KeyProperties.PURPOSE_DECRYPT).build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + transformation, e);
+            }
+        }
+    }
+
+    public void testInitEncryptAsymmetricIgnoresAuthorizedPurposes() throws Exception {
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            if (isSymmetric(transformation)) {
+                continue;
+            }
+
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_ENCRYPT);
+                assertInitEncryptSucceeds(transformation, good);
+                assertInitEncryptSucceeds(transformation,
+                        TestUtils.buildUpon(good, 0).build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + transformation, e);
+            }
+        }
+    }
+
+    public void testInitDecryptFailsWhenBlockModeNotAuthorized() throws Exception {
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(
+                    TestUtils.getCipherKeyAlgorithm(transformation))) {
+                // Block modes do not apply
+                continue;
+            }
+
+            String goodBlockMode = TestUtils.getCipherBlockMode(transformation);
+            String badBlockMode = KeyProperties.BLOCK_MODE_CBC.equalsIgnoreCase(goodBlockMode)
+                    ? KeyProperties.BLOCK_MODE_CTR : KeyProperties.BLOCK_MODE_CBC;
+
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_DECRYPT);
+                assertInitDecryptSucceeds(transformation, good);
+                assertInitDecryptThrowsInvalidKeyException(transformation,
+                        TestUtils.buildUpon(good).setBlockModes(badBlockMode).build());
+            } catch (Throwable e) {
+                throw new RuntimeException(
+                        "Failed for " + transformation + " when authorized only for "
+                                + badBlockMode,
+                        e);
+            }
+        }
+    }
+
+    public void testInitEncryptSymmetricFailsWhenBlockModeNotAuthorized() throws Exception {
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            if (!isSymmetric(transformation)) {
+                continue;
+            }
+
+            if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(
+                    TestUtils.getCipherKeyAlgorithm(transformation))) {
+                // Block modes do not apply
+                continue;
+            }
+
+            String goodBlockMode = TestUtils.getCipherBlockMode(transformation);
+            String badBlockMode = KeyProperties.BLOCK_MODE_CBC.equalsIgnoreCase(goodBlockMode)
+                    ? KeyProperties.BLOCK_MODE_CTR : KeyProperties.BLOCK_MODE_CBC;
+
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_ENCRYPT);
+
+                assertInitEncryptSucceeds(transformation, good);
+                assertInitEncryptThrowsInvalidKeyException(transformation,
+                        TestUtils.buildUpon(good).setBlockModes(badBlockMode).build());
+            } catch (Throwable e) {
+                throw new RuntimeException(
+                        "Failed for " + transformation + " when authorized only for "
+                                + badBlockMode,
+                        e);
+            }
+        }
+    }
+
+    public void testInitEncryptAsymmetricIgnoresAuthorizedBlockModes() throws Exception {
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            if (isSymmetric(transformation)) {
+                continue;
+            }
+
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_ENCRYPT);
+
+                assertInitEncryptSucceeds(transformation, good);
+                assertInitEncryptSucceeds(transformation,
+                        TestUtils.buildUpon(good).setBlockModes().build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + transformation, e);
+            }
+        }
+    }
+
+    public void testInitDecryptFailsWhenDigestNotAuthorized() throws Exception {
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            String impliedDigest = TestUtils.getCipherDigest(transformation);
+            if (impliedDigest == null) {
+                // No digest used by this transformation
+                continue;
+            }
+
+            String badDigest = KeyProperties.DIGEST_SHA256.equalsIgnoreCase(impliedDigest)
+                    ? KeyProperties.DIGEST_SHA512 : KeyProperties.DIGEST_SHA256;
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_DECRYPT);
+
+                assertInitDecryptSucceeds(transformation, good);
+                assertInitDecryptThrowsInvalidKeyException(transformation,
+                        TestUtils.buildUpon(good).setDigests(badDigest).build());
+
+                if (!KeyProperties.DIGEST_NONE.equalsIgnoreCase(impliedDigest)) {
+                    // Check that authorized digest NONE does not mean ANY digest is authorized.
+                    badDigest = KeyProperties.DIGEST_NONE;
+                    assertInitDecryptThrowsInvalidKeyException(transformation,
+                            TestUtils.buildUpon(good).setDigests(badDigest).build());
+                }
+            } catch (Throwable e) {
+                throw new RuntimeException(
+                        "Failed for " + transformation + " when authorized only for " + badDigest,
+                        e);
+            }
+        }
+    }
+
+    public void testInitEncryptSymmetricFailsWhenDigestNotAuthorized() throws Exception {
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            if (!isSymmetric(transformation)) {
+                continue;
+            }
+
+            String impliedDigest = TestUtils.getCipherDigest(transformation);
+            if (impliedDigest == null) {
+                // No digest used by this transformation
+                continue;
+            }
+
+            String badDigest = KeyProperties.DIGEST_SHA256.equalsIgnoreCase(impliedDigest)
+                    ? KeyProperties.DIGEST_SHA512 : KeyProperties.DIGEST_SHA256;
+
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_ENCRYPT);
+                assertInitEncryptSucceeds(transformation, good);
+                assertInitEncryptThrowsInvalidKeyException(transformation,
+                        TestUtils.buildUpon(good).setDigests(badDigest).build());
+
+                if (!KeyProperties.DIGEST_NONE.equalsIgnoreCase(impliedDigest)) {
+                    // Check that authorized digest NONE does not mean ANY digest is authorized.
+                    badDigest = KeyProperties.DIGEST_NONE;
+                    assertInitEncryptThrowsInvalidKeyException(transformation,
+                            TestUtils.buildUpon(good).setDigests(badDigest).build());
+                }
+            } catch (Throwable e) {
+                throw new RuntimeException(
+                        "Failed for " + transformation + " when authorized only for " + badDigest,
+                        e);
+            }
+        }
+    }
+
+    public void testInitEncryptAsymmetricIgnoresAuthorizedDigests() throws Exception {
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            if (isSymmetric(transformation)) {
+                continue;
+            }
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_ENCRYPT);
+                assertInitEncryptSucceeds(transformation, good);
+                assertInitEncryptSucceeds(transformation,
+                        TestUtils.buildUpon(good).setDigests().build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + transformation, e);
+            }
+        }
+    }
+
+    public void testInitDecryptFailsWhenPaddingSchemeNotAuthorized() throws Exception {
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            String impliedEncryptionPadding = TestUtils.getCipherEncryptionPadding(transformation);
+            String badEncryptionPadding;
+            if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(
+                    TestUtils.getCipherKeyAlgorithm(transformation))) {
+                badEncryptionPadding =
+                        KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1.equalsIgnoreCase(
+                                impliedEncryptionPadding)
+                        ? KeyProperties.ENCRYPTION_PADDING_RSA_OAEP
+                        : KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1;
+            } else {
+                badEncryptionPadding = KeyProperties.ENCRYPTION_PADDING_PKCS7.equalsIgnoreCase(
+                        impliedEncryptionPadding)
+                        ? KeyProperties.ENCRYPTION_PADDING_NONE
+                        : KeyProperties.ENCRYPTION_PADDING_PKCS7;
+            }
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_DECRYPT);
+
+                assertInitDecryptSucceeds(transformation, good);
+                assertInitDecryptThrowsInvalidKeyException(transformation,
+                        TestUtils.buildUpon(good)
+                                .setEncryptionPaddings(badEncryptionPadding)
+                                .build());
+
+                if (!KeyProperties.ENCRYPTION_PADDING_NONE.equalsIgnoreCase(
+                        impliedEncryptionPadding)) {
+                    // Check that authorized padding NONE does not mean ANY padding is authorized.
+                    badEncryptionPadding = KeyProperties.ENCRYPTION_PADDING_NONE;
+                    assertInitDecryptThrowsInvalidKeyException(transformation,
+                            TestUtils.buildUpon(good)
+                                    .setEncryptionPaddings(badEncryptionPadding)
+                                    .build());
+                }
+            } catch (Throwable e) {
+                throw new RuntimeException(
+                        "Failed for " + transformation + " when authorized only for "
+                                + badEncryptionPadding,
+                        e);
+            }
+        }
+    }
+
+    public void testInitEncryptSymmetricFailsWhenPaddingSchemeNotAuthorized() throws Exception {
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            if (!isSymmetric(transformation)) {
+                continue;
+            }
+            String impliedEncryptionPadding = TestUtils.getCipherEncryptionPadding(transformation);
+            String badEncryptionPadding = KeyProperties.ENCRYPTION_PADDING_PKCS7.equalsIgnoreCase(
+                    impliedEncryptionPadding)
+                    ? KeyProperties.ENCRYPTION_PADDING_NONE
+                    : KeyProperties.ENCRYPTION_PADDING_PKCS7;
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_ENCRYPT);
+
+                assertInitEncryptSucceeds(transformation, good);
+                assertInitEncryptThrowsInvalidKeyException(transformation,
+                        TestUtils.buildUpon(good)
+                                .setEncryptionPaddings(badEncryptionPadding)
+                                .build());
+
+                if (!KeyProperties.ENCRYPTION_PADDING_NONE.equalsIgnoreCase(
+                        impliedEncryptionPadding)) {
+                    // Check that authorized padding NONE does not mean ANY padding is authorized.
+                    badEncryptionPadding = KeyProperties.ENCRYPTION_PADDING_NONE;
+                    assertInitEncryptThrowsInvalidKeyException(transformation,
+                            TestUtils.buildUpon(good)
+                                    .setEncryptionPaddings(badEncryptionPadding)
+                                    .build());
+                }
+            } catch (Throwable e) {
+                throw new RuntimeException(
+                        "Failed for " + transformation + " when authorized only for "
+                                + badEncryptionPadding,
+                        e);
+            }
+        }
+    }
+
+    public void testInitEncryptAsymmetricIgnoresAuthorizedPaddingSchemes() throws Exception {
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            if (isSymmetric(transformation)) {
+                continue;
+            }
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_ENCRYPT);
+
+                assertInitEncryptSucceeds(transformation, good);
+                assertInitEncryptSucceeds(transformation,
+                        TestUtils.buildUpon(good)
+                                .setEncryptionPaddings()
+                                .setSignaturePaddings()
+                                .build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + transformation, e);
+            }
+        }
+    }
+
+    public void testInitDecryptFailsWhenKeyNotYetValid() throws Exception {
+        Date badStartDate = new Date(System.currentTimeMillis() + DAY_IN_MILLIS);
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_DECRYPT);
+
+                assertInitDecryptSucceeds(transformation, good);
+                assertInitDecryptThrowsInvalidKeyException(transformation,
+                        TestUtils.buildUpon(good).setKeyValidityStart(badStartDate).build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + transformation, e);
+            }
+        }
+    }
+
+    public void testInitEncryptSymmetricFailsWhenKeyNotYetValid() throws Exception {
+        Date badStartDate = new Date(System.currentTimeMillis() + DAY_IN_MILLIS);
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            if (!isSymmetric(transformation)) {
+                continue;
+            }
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_ENCRYPT);
+
+                assertInitEncryptSucceeds(transformation, good);
+                assertInitEncryptThrowsInvalidKeyException(transformation,
+                        TestUtils.buildUpon(good).setKeyValidityStart(badStartDate).build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + transformation, e);
+            }
+        }
+    }
+
+    public void testInitEncryptAsymmetricIgnoresThatKeyNotYetValid() throws Exception {
+        Date badStartDate = new Date(System.currentTimeMillis() + DAY_IN_MILLIS);
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            if (isSymmetric(transformation)) {
+                continue;
+            }
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_ENCRYPT);
+
+                assertInitEncryptSucceeds(transformation, good);
+                assertInitEncryptSucceeds(transformation,
+                        TestUtils.buildUpon(good).setKeyValidityStart(badStartDate).build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + transformation, e);
+            }
+        }
+    }
+
+    public void testInitDecryptFailsWhenKeyNoLongerValidForConsumption() throws Exception {
+        Date badEndDate = new Date(System.currentTimeMillis() - DAY_IN_MILLIS);
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_DECRYPT);
+
+                assertInitDecryptSucceeds(transformation, good);
+                assertInitDecryptThrowsInvalidKeyException(transformation,
+                        TestUtils.buildUpon(good)
+                                .setKeyValidityForConsumptionEnd(badEndDate)
+                                .build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + transformation, e);
+            }
+        }
+    }
+
+    public void testInitDecryptIgnoresThatKeyNoLongerValidForOrigination() throws Exception {
+        Date badEndDate = new Date(System.currentTimeMillis() - DAY_IN_MILLIS);
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_DECRYPT);
+
+                assertInitDecryptSucceeds(transformation, good);
+                assertInitDecryptSucceeds(transformation,
+                        TestUtils.buildUpon(good)
+                                .setKeyValidityForOriginationEnd(badEndDate)
+                                .build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + transformation, e);
+            }
+        }
+    }
+
+    public void testInitEncryptSymmetricFailsWhenKeyNoLongerValidForOrigination() throws Exception {
+        Date badEndDate = new Date(System.currentTimeMillis() - DAY_IN_MILLIS);
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            if (!isSymmetric(transformation)) {
+                continue;
+            }
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_ENCRYPT);
+
+                assertInitEncryptSucceeds(transformation, good);
+                assertInitEncryptThrowsInvalidKeyException(transformation,
+                        TestUtils.buildUpon(good)
+                                .setKeyValidityForOriginationEnd(badEndDate)
+                                .build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + transformation, e);
+            }
+        }
+    }
+
+    public void testInitEncryptSymmetricIgnoresThatKeyNoLongerValidForConsumption()
+            throws Exception {
+        Date badEndDate = new Date(System.currentTimeMillis() - DAY_IN_MILLIS);
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            if (!isSymmetric(transformation)) {
+                continue;
+            }
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_ENCRYPT);
+
+                assertInitEncryptSucceeds(transformation, good);
+                assertInitEncryptSucceeds(transformation,
+                        TestUtils.buildUpon(good)
+                                .setKeyValidityForConsumptionEnd(badEndDate)
+                                .build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + transformation, e);
+            }
+        }
+    }
+
+    public void testInitEncryptAsymmetricIgnoresThatKeyNoLongerValid() throws Exception {
+        Date badEndDate = new Date(System.currentTimeMillis() - DAY_IN_MILLIS);
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            if (isSymmetric(transformation)) {
+                continue;
+            }
+            try {
+                KeyProtection good = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        transformation,
+                        KeyProperties.PURPOSE_ENCRYPT);
+
+                assertInitEncryptSucceeds(transformation, good);
+                assertInitEncryptSucceeds(transformation,
+                        TestUtils.buildUpon(good)
+                                .setKeyValidityForOriginationEnd(badEndDate)
+                                .build());
+                assertInitEncryptSucceeds(transformation,
+                        TestUtils.buildUpon(good)
+                                .setKeyValidityForConsumptionEnd(badEndDate)
+                                .build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + transformation, e);
+            }
+        }
+    }
+
+    public void testEntropyConsumption() throws Exception {
+        // Assert that encryption consumes the correct amount of entropy from the provided
+        // SecureRandom and that decryption consumes no entropy.
+
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+
+        CountingSecureRandom rng = new CountingSecureRandom();
+        for (String transformation : EXPECTED_ALGORITHMS) {
+            for (ImportedKey key : importKatKeys(
+                    transformation,
+                    KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT,
+                    true)) {
+                try {
+                    Cipher cipher = Cipher.getInstance(transformation, provider);
+                    Key encryptionKey = key.getKeystoreBackedEncryptionKey();
+                    byte[] plaintext = truncatePlaintextIfNecessary(
+                            transformation, encryptionKey, new byte[32]);
+                    if (plaintext == null) {
+                        // Key too short to encrypt anything using this transformation.
+                        continue;
+                    }
+                    Arrays.fill(plaintext, (byte) 0x1);
+
+                    // Cipher.init may only consume entropy for generating the IV.
+                    rng.resetCounters();
+                    cipher.init(Cipher.ENCRYPT_MODE, encryptionKey, rng);
+                    int expectedEntropyBytesConsumedDuringInit;
+                    String keyAlgorithm = TestUtils.getCipherKeyAlgorithm(transformation);
+                    if (KeyProperties.KEY_ALGORITHM_AES.equalsIgnoreCase(keyAlgorithm)) {
+                        String blockMode =
+                                TestUtils.getCipherBlockMode(transformation).toUpperCase(Locale.US);
+                        // Entropy should consumed for IV generation only.
+                        switch (blockMode) {
+                            case "ECB":
+                                expectedEntropyBytesConsumedDuringInit = 0;
+                                break;
+                            case "CBC":
+                            case "CTR":
+                                expectedEntropyBytesConsumedDuringInit = 16;
+                                break;
+                            case "GCM":
+                                expectedEntropyBytesConsumedDuringInit = 12;
+                                break;
+                            default:
+                                throw new RuntimeException("Unsupported block mode " + blockMode);
+                        }
+                    } else if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(keyAlgorithm)) {
+                        expectedEntropyBytesConsumedDuringInit = 0;
+                    } else {
+                        throw new RuntimeException("Unsupported key algorithm: " + transformation);
+                    }
+                    assertEquals(expectedEntropyBytesConsumedDuringInit, rng.getOutputSizeBytes());
+                    AlgorithmParameters params = cipher.getParameters();
+
+                    // Cipher.update should not consume entropy.
+                    rng.resetCounters();
+                    byte[] ciphertext = cipher.update(plaintext);
+                    assertEquals(0, rng.getOutputSizeBytes());
+
+                    // Cipher.doFinal may consume entropy to pad the message (RSA only).
+                    rng.resetCounters();
+                    ciphertext = TestUtils.concat(ciphertext, cipher.doFinal());
+                    int expectedEntropyBytesConsumedDuringDoFinal;
+                    if (KeyProperties.KEY_ALGORITHM_AES.equalsIgnoreCase(keyAlgorithm)) {
+                        expectedEntropyBytesConsumedDuringDoFinal = 0;
+                    } else if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(keyAlgorithm)) {
+                        // Entropy should not be consumed during Cipher.init.
+                        String encryptionPadding =
+                                TestUtils.getCipherEncryptionPadding(transformation);
+                        if (KeyProperties.ENCRYPTION_PADDING_RSA_OAEP.equalsIgnoreCase(
+                                encryptionPadding)) {
+                            int digestOutputSizeBits =
+                                    TestUtils.getDigestOutputSizeBits(TestUtils.getCipherDigest(
+                                            transformation));
+                            expectedEntropyBytesConsumedDuringDoFinal =
+                                    (digestOutputSizeBits + 7) / 8;
+                        } else if (encryptionPadding.equalsIgnoreCase(
+                                KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)) {
+                            expectedEntropyBytesConsumedDuringDoFinal =
+                                    (TestUtils.getKeySizeBits(encryptionKey) + 7) / 8;
+                        } else if (encryptionPadding.equalsIgnoreCase(
+                                KeyProperties.ENCRYPTION_PADDING_NONE)) {
+                            expectedEntropyBytesConsumedDuringDoFinal = 0;
+                        } else {
+                            throw new RuntimeException(
+                                    "Unexpected encryption padding: " + encryptionPadding);
+                        }
+                    } else {
+                        throw new RuntimeException("Unsupported key algorithm: " + keyAlgorithm);
+                    }
+                    assertEquals(
+                            expectedEntropyBytesConsumedDuringDoFinal, rng.getOutputSizeBytes());
+
+                    // Assert that when initialization parameters are provided when encrypting, no
+                    // entropy is consumed by Cipher.init. This is because Cipher.init should only
+                    // use entropy for generating an IV which in this case no longer needs to be
+                    // generated because it's specified in the parameters.
+                    cipher = Cipher.getInstance(transformation, provider);
+                    rng.resetCounters();
+                    cipher.init(Cipher.ENCRYPT_MODE, encryptionKey, params, rng);
+                    assertEquals(0, rng.getOutputSizeBytes());
+                    Key decryptionKey = key.getKeystoreBackedDecryptionKey();
+                    rng.resetCounters();
+                    cipher = Cipher.getInstance(transformation, provider);
+                    cipher.init(Cipher.DECRYPT_MODE, decryptionKey, params, rng);
+                    assertEquals(0, rng.getOutputSizeBytes());
+                    rng.resetCounters();
+                    cipher.update(ciphertext);
+                    assertEquals(0, rng.getOutputSizeBytes());
+                    rng.resetCounters();
+                    cipher.doFinal();
+                    assertEquals(0, rng.getOutputSizeBytes());
+                } catch (Throwable e) {
+                    throw new RuntimeException(
+                            "Failed for " + transformation + " with key " + key.getAlias(), e);
+                }
+            }
+        }
+    }
+
+    private AlgorithmParameterSpec getWorkingDecryptionParameterSpec(String transformation) {
+        String keyAlgorithm = TestUtils.getCipherKeyAlgorithm(transformation);
+        if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(keyAlgorithm)) {
+            return null;
+        } else if (KeyProperties.KEY_ALGORITHM_AES.equalsIgnoreCase(keyAlgorithm)) {
+            String blockMode = TestUtils.getCipherBlockMode(transformation);
+            if (KeyProperties.BLOCK_MODE_ECB.equalsIgnoreCase(blockMode)) {
+                return null;
+            } else if ((KeyProperties.BLOCK_MODE_CBC.equalsIgnoreCase(blockMode))
+                    || (KeyProperties.BLOCK_MODE_CTR.equalsIgnoreCase(blockMode))) {
+                return new IvParameterSpec(
+                        new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16});
+            } else if (KeyProperties.BLOCK_MODE_GCM.equalsIgnoreCase(blockMode)) {
+                return new GCMParameterSpec(
+                        128,
+                        new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12});
+            } else {
+                throw new IllegalArgumentException("Unsupported block mode: " + blockMode);
+            }
+        } else {
+            throw new IllegalArgumentException("Unsupported key algorithm: " + keyAlgorithm);
+        }
+    }
+
+    private void assertInitDecryptSucceeds(String transformation, KeyProtection importParams)
+            throws Exception {
+        Cipher cipher = Cipher.getInstance(transformation, EXPECTED_PROVIDER_NAME);
+        Key key =
+                importDefaultKatKey(transformation, importParams).getKeystoreBackedDecryptionKey();
+        AlgorithmParameterSpec params = getWorkingDecryptionParameterSpec(transformation);
+        cipher.init(Cipher.DECRYPT_MODE, key, params);
+    }
+
+    private void assertInitDecryptThrowsInvalidKeyException(
+            String transformation, KeyProtection importParams) throws Exception {
+        Cipher cipher = Cipher.getInstance(transformation, EXPECTED_PROVIDER_NAME);
+        Key key =
+                importDefaultKatKey(transformation, importParams).getKeystoreBackedDecryptionKey();
+        AlgorithmParameterSpec params = getWorkingDecryptionParameterSpec(transformation);
+        try {
+            cipher.init(Cipher.DECRYPT_MODE, key, params);
+            fail("InvalidKeyException should have been thrown");
+        } catch (InvalidKeyException expected) {}
+    }
+
+    private void assertInitEncryptSucceeds(String transformation, KeyProtection importParams)
+            throws Exception {
+        Cipher cipher = Cipher.getInstance(transformation, EXPECTED_PROVIDER_NAME);
+        Key key =
+                importDefaultKatKey(transformation, importParams).getKeystoreBackedEncryptionKey();
+        cipher.init(Cipher.ENCRYPT_MODE, key);
+    }
+
+    private void assertInitEncryptThrowsInvalidKeyException(
+            String transformation, KeyProtection importParams) throws Exception {
+        Cipher cipher = Cipher.getInstance(transformation, EXPECTED_PROVIDER_NAME);
+        Key key =
+                importDefaultKatKey(transformation, importParams).getKeystoreBackedEncryptionKey();
+        try {
+            cipher.init(Cipher.ENCRYPT_MODE, key);
+            fail("InvalidKeyException should have been thrown");
+        } catch (InvalidKeyException expected) {}
+    }
+
+    private ImportedKey importDefaultKatKey(
+            String transformation, KeyProtection importParams)
+            throws Exception {
+        String keyAlgorithm = TestUtils.getCipherKeyAlgorithm(transformation);
+        if (KeyProperties.KEY_ALGORITHM_AES.equalsIgnoreCase(keyAlgorithm)) {
+            return TestUtils.importIntoAndroidKeyStore(
+                    "testAES",
+                    new SecretKeySpec(AES128_KAT_KEY_BYTES, "AES"),
+                    importParams);
+        } else if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(keyAlgorithm)) {
+            return TestUtils.importIntoAndroidKeyStore(
+                    "testRSA",
+                    getContext(),
+                    R.raw.rsa_key2_pkcs8,
+                    R.raw.rsa_key2_cert,
+                    importParams);
+        } else {
+            throw new IllegalArgumentException("Unsupported key algorithm: " + keyAlgorithm);
+        }
+    }
+
+    private ImportedKey importDefaultKatKey(
+            String transformation, int purposes, boolean ivProvidedWhenEncrypting)
+            throws Exception {
+        KeyProtection importParams = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                transformation, purposes, ivProvidedWhenEncrypting);
+        return importDefaultKatKey(transformation, importParams);
+    }
+
+    private Collection<ImportedKey> importKatKeys(
+            String transformation, int purposes, boolean ivProvidedWhenEncrypting)
+            throws Exception {
+        KeyProtection importParams = TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                transformation, purposes, ivProvidedWhenEncrypting);
+        String keyAlgorithm = TestUtils.getCipherKeyAlgorithm(transformation);
+        if (KeyProperties.KEY_ALGORITHM_AES.equalsIgnoreCase(keyAlgorithm)) {
+            return Arrays.asList(
+                    TestUtils.importIntoAndroidKeyStore(
+                            "testAES128",
+                            new SecretKeySpec(AES128_KAT_KEY_BYTES, "AES"),
+                            importParams),
+                    TestUtils.importIntoAndroidKeyStore(
+                            "testAES192",
+                            new SecretKeySpec(AES192_KAT_KEY_BYTES, "AES"),
+                            importParams),
+                    TestUtils.importIntoAndroidKeyStore(
+                            "testAES256",
+                            new SecretKeySpec(AES256_KAT_KEY_BYTES, "AES"),
+                            importParams)
+                    );
+        } else if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(keyAlgorithm)) {
+            return RSASignatureTest.importKatKeyPairs(getContext(), importParams);
+        } else {
+            throw new IllegalArgumentException("Unsupported key algorithm: " + keyAlgorithm);
+        }
+    }
+
+    private static boolean isSymmetric(String transformation) {
+        return TestUtils.isCipherSymmetric(transformation);
+    }
+
+    private static byte[] truncatePlaintextIfNecessary(
+            String transformation, Key encryptionKey, byte[] plaintext) {
+        int maxSupportedPlaintextSizeBytes =
+                TestUtils.getMaxSupportedPlaintextInputSizeBytes(
+                        transformation, encryptionKey);
+        if (plaintext.length <= maxSupportedPlaintextSizeBytes) {
+            // No need to truncate
+            return plaintext;
+        } else if (maxSupportedPlaintextSizeBytes < 0) {
+            // Key too short to encrypt anything at all using this transformation
+            return null;
+        } else {
+            // Truncate plaintext to exercise this transformation with this key
+            return Arrays.copyOf(plaintext, maxSupportedPlaintextSizeBytes);
+        }
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/CountingSecureRandom.java b/tests/tests/keystore/src/android/keystore/cts/CountingSecureRandom.java
new file mode 100644
index 0000000..ea4d0d1
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/CountingSecureRandom.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+import java.security.SecureRandom;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * {@link SecureRandom} which counts how many bytes it has output.
+ */
+public class CountingSecureRandom extends SecureRandom {
+
+    private final SecureRandom mDelegate = new SecureRandom();
+    private final AtomicLong mOutputSizeBytes = new AtomicLong();
+
+    public long getOutputSizeBytes() {
+        return mOutputSizeBytes.get();
+    }
+
+    public void resetCounters() {
+        mOutputSizeBytes.set(0);
+    }
+
+    @Override
+    public byte[] generateSeed(int numBytes) {
+        if (numBytes > 0) {
+            mOutputSizeBytes.addAndGet(numBytes);
+        }
+        return mDelegate.generateSeed(numBytes);
+    }
+
+    @Override
+    public String getAlgorithm() {
+        return mDelegate.getAlgorithm();
+    }
+
+    @Override
+    public synchronized void nextBytes(byte[] bytes) {
+        if ((bytes != null) && (bytes.length > 0)) {
+            mOutputSizeBytes.addAndGet(bytes.length);
+        }
+        mDelegate.nextBytes(bytes);
+    }
+
+    @Override
+    public synchronized void setSeed(byte[] seed) {
+        // Ignore seeding -- not needed in tests and may impact the quality of the output of the
+        // delegate SecureRandom by preventing it from self-seeding
+    }
+
+    @Override
+    public void setSeed(long seed) {
+        // Ignore seeding -- not needed in tests and may impact the quality of the output of the
+        // delegate SecureRandom by preventing it from self-seeding
+    }
+
+    @Override
+    public boolean nextBoolean() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public double nextDouble() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public float nextFloat() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public synchronized double nextGaussian() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public int nextInt() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public int nextInt(int n) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public long nextLong() {
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/ECCurves.java b/tests/tests/keystore/src/android/keystore/cts/ECCurves.java
new file mode 100644
index 0000000..24184e6
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/ECCurves.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+import java.math.BigInteger;
+import java.security.spec.ECField;
+import java.security.spec.ECFieldFp;
+import java.security.spec.ECParameterSpec;
+import java.security.spec.ECPoint;
+import java.security.spec.EllipticCurve;
+
+abstract class ECCurves {
+    private ECCurves() {}
+
+    // NIST EC curve parameters copied from "Standards for Efficient Cryptography 2 (SEC 2)".
+
+    static ECParameterSpec NIST_P_192_SPEC = createNistPCurveSpec(
+            new BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", 16),
+            new BigInteger("FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831", 16),
+            new BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", 16),
+            new BigInteger("64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1", 16),
+            new BigInteger("188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012", 16),
+            new BigInteger("07192B95FFC8DA78631011ED6B24CDD573F977A11E794811", 16),
+            1,
+            HexEncoding.decode("3045AE6FC8422F64ED579528D38120EAE12196D5"));
+
+    static ECParameterSpec NIST_P_224_SPEC = createNistPCurveSpec(
+            new BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001", 16),
+            new BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", 16),
+            new BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE", 16),
+            new BigInteger("B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4", 16),
+            new BigInteger("B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21", 16),
+            new BigInteger("BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34", 16),
+            1,
+            HexEncoding.decode("BD71344799D5C7FCDC45B59FA3B9AB8F6A948BC5"));
+
+    static ECParameterSpec NIST_P_256_SPEC = createNistPCurveSpec(
+            new BigInteger("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFF"
+                    + "FFFFFFFF", 16),
+            new BigInteger("FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2"
+                    + "FC632551", 16),
+            new BigInteger("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFF"
+                    + "FFFFFFFC", 16),
+            new BigInteger("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E"
+                    + "27D2604B", 16),
+            new BigInteger("6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945"
+                    + "D898C296", 16),
+            new BigInteger("4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB64068"
+                    + "37BF51F5", 16),
+            1,
+            HexEncoding.decode("C49D360886E704936A6678E1139D26B7819F7E90"));
+
+    static ECParameterSpec NIST_P_384_SPEC = createNistPCurveSpec(
+            new BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+                    + "FFFFFFFEFFFFFFFF0000000000000000FFFFFFFF", 16),
+            new BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81"
+                    + "F4372DDF581A0DB248B0A77AECEC196ACCC52973", 16),
+            new BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+                    + "FFFFFFFEFFFFFFFF0000000000000000FFFFFFFC", 16),
+            new BigInteger("B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F"
+                    + "5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF", 16),
+            new BigInteger("AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E0"
+                    + "82542A385502F25DBF55296C3A545E3872760AB7", 16),
+            new BigInteger("3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113"
+                    + "B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F", 16),
+            1,
+            HexEncoding.decode("A335926AA319A27A1D00896A6773A4827ACDAC73"));
+
+    static ECParameterSpec NIST_P_521_SPEC = createNistPCurveSpec(
+            new BigInteger("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+                    + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+                    + "FFFFFFFFFFFFFFFFFFFFFFFF", 16),
+            new BigInteger("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+                    + "FFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8"
+                    + "899C47AEBB6FB71E91386409", 16),
+            new BigInteger("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+                    + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+                    + "FFFFFFFFFFFFFFFFFFFFFFFC", 16),
+            new BigInteger("0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3"
+                    + "B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF88"
+                    + "3D2C34F1EF451FD46B503F00", 16),
+            new BigInteger("00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521"
+                    + "F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1"
+                    + "856A429BF97E7E31C2E5BD66", 16),
+            new BigInteger("011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B4468"
+                    + "17AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086"
+                    + "A272C24088BE94769FD16650", 16),
+            1,
+            HexEncoding.decode("D09E8800291CB85396CC6717393284AAA0DA64BA"));
+
+    private static ECParameterSpec createNistPCurveSpec(
+            BigInteger p,
+            BigInteger order,
+            BigInteger a,
+            BigInteger b,
+            BigInteger gx,
+            BigInteger gy,
+            int cofactor,
+            byte[] seed) {
+        ECField field = new ECFieldFp(p);
+        EllipticCurve curve = new EllipticCurve(field, a, b, seed);
+        ECPoint generator = new ECPoint(gx, gy);
+        return new ECParameterSpec(
+                curve,
+                generator,
+                order,
+                cofactor);
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/ECDSASignatureTest.java b/tests/tests/keystore/src/android/keystore/cts/ECDSASignatureTest.java
new file mode 100644
index 0000000..ea3940d
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/ECDSASignatureTest.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+import android.content.Context;
+import android.security.keystore.KeyProtection;
+import android.test.AndroidTestCase;
+
+import com.android.cts.keystore.R;
+
+import java.security.KeyPair;
+import java.security.Security;
+import java.security.Signature;
+import java.util.Arrays;
+import java.util.Collection;
+
+public class ECDSASignatureTest extends AndroidTestCase {
+
+    public void testNONEwithECDSATruncatesInputToFieldSize() throws Exception {
+        for (ImportedKey key : importKatKeyPairs("NONEwithECDSA")) {
+            try {
+                assertNONEwithECDSATruncatesInputToFieldSize(key.getKeystoreBackedKeyPair());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + key.getAlias(), e);
+            }
+        }
+    }
+
+    private void assertNONEwithECDSATruncatesInputToFieldSize(KeyPair keyPair)
+            throws Exception {
+        int keySizeBits = TestUtils.getKeySizeBits(keyPair.getPublic());
+        byte[] message = new byte[(keySizeBits * 3) / 8];
+        for (int i = 0; i < message.length; i++) {
+            message[i] = (byte) (i + 1);
+        }
+
+        Signature signature = Signature.getInstance("NONEwithECDSA");
+        signature.initSign(keyPair.getPrivate());
+        assertSame(Security.getProvider(SignatureTest.EXPECTED_PROVIDER_NAME),
+                signature.getProvider());
+        signature.update(message);
+        byte[] sigBytes = signature.sign();
+
+        signature = Signature.getInstance(signature.getAlgorithm(), signature.getProvider());
+        signature.initVerify(keyPair.getPublic());
+
+        // Verify the full-length message
+        signature.update(message);
+        assertTrue(signature.verify(sigBytes));
+
+        // Verify the message truncated to field size
+        signature.update(message, 0, (keySizeBits + 7) / 8);
+        assertTrue(signature.verify(sigBytes));
+
+        // Verify message truncated to one byte shorter than field size -- this should fail
+        signature.update(message, 0, (keySizeBits / 8) - 1);
+        assertFalse(signature.verify(sigBytes));
+    }
+
+    public void testNONEwithECDSASupportsMessagesShorterThanFieldSize() throws Exception {
+        for (ImportedKey key : importKatKeyPairs("NONEwithECDSA")) {
+            try {
+                assertNONEwithECDSASupportsMessagesShorterThanFieldSize(
+                        key.getKeystoreBackedKeyPair());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + key.getAlias(), e);
+            }
+        }
+    }
+
+    private void assertNONEwithECDSASupportsMessagesShorterThanFieldSize(KeyPair keyPair)
+            throws Exception {
+        int keySizeBits = TestUtils.getKeySizeBits(keyPair.getPublic());
+        byte[] message = new byte[(keySizeBits * 3 / 4) / 8];
+        for (int i = 0; i < message.length; i++) {
+            message[i] = (byte) (i + 1);
+        }
+
+        Signature signature = Signature.getInstance("NONEwithECDSA");
+        signature.initSign(keyPair.getPrivate());
+        assertSame(Security.getProvider(SignatureTest.EXPECTED_PROVIDER_NAME),
+                signature.getProvider());
+        signature.update(message);
+        byte[] sigBytes = signature.sign();
+
+        signature = Signature.getInstance(signature.getAlgorithm(), signature.getProvider());
+        signature.initVerify(keyPair.getPublic());
+
+        // Verify the message
+        signature.update(message);
+        assertTrue(signature.verify(sigBytes));
+
+        // Assert that the message is left-padded with zero bits
+        byte[] fullLengthMessage = TestUtils.leftPadWithZeroBytes(message, keySizeBits / 8);
+        signature.update(fullLengthMessage);
+        assertTrue(signature.verify(sigBytes));
+    }
+
+    private Collection<ImportedKey> importKatKeyPairs(String signatureAlgorithm)
+            throws Exception {
+        KeyProtection params =
+                TestUtils.getMinimalWorkingImportParametersForSigningingWith(signatureAlgorithm);
+        return importKatKeyPairs(getContext(), params);
+    }
+
+    static Collection<ImportedKey> importKatKeyPairs(
+            Context context, KeyProtection importParams) throws Exception {
+        return Arrays.asList(new ImportedKey[] {
+                TestUtils.importIntoAndroidKeyStore("testECsecp224r1", context,
+                        R.raw.ec_key3_secp224r1_pkcs8, R.raw.ec_key3_secp224r1_cert, importParams),
+                TestUtils.importIntoAndroidKeyStore("testECsecp256r1", context,
+                        R.raw.ec_key4_secp256r1_pkcs8, R.raw.ec_key4_secp256r1_cert, importParams),
+                TestUtils.importIntoAndroidKeyStore("testECsecp384r1", context,
+                        R.raw.ec_key5_secp384r1_pkcs8, R.raw.ec_key5_secp384r1_cert, importParams),
+                TestUtils.importIntoAndroidKeyStore("testECsecp521r1", context,
+                        R.raw.ec_key6_secp521r1_pkcs8, R.raw.ec_key6_secp521r1_cert, importParams),
+                });
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/EmptyArray.java b/tests/tests/keystore/src/android/keystore/cts/EmptyArray.java
new file mode 100644
index 0000000..bf08b73
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/EmptyArray.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+abstract class EmptyArray {
+    private EmptyArray() {}
+
+    public static final byte[] BYTE = new byte[0];
+    public static final String[] STRING = new String[0];
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/HexEncoding.java b/tests/tests/keystore/src/android/keystore/cts/HexEncoding.java
new file mode 100644
index 0000000..9346f2d
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/HexEncoding.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2012 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.keystore.cts;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Hexadecimal encoding where each byte is represented by two hexadecimal digits.
+ *
+ * @hide
+ */
+public class HexEncoding {
+
+  /** Hidden constructor to prevent instantiation. */
+  private HexEncoding() {}
+
+  private static final char[] HEX_DIGITS = "0123456789abcdef".toCharArray();
+
+  /**
+   * Encodes the provided data as a hexadecimal string.
+   */
+  public static String encode(byte[] data) {
+    return encode(data, 0, data.length);
+  }
+
+  /**
+   * Encodes the provided data as a hexadecimal string.
+   */
+  public static String encode(byte[] data, int offset, int len) {
+    StringBuilder result = new StringBuilder(len * 2);
+    for (int i = 0; i < len; i++) {
+      byte b = data[offset + i];
+      result.append(HEX_DIGITS[(b >>> 4) & 0x0f]);
+      result.append(HEX_DIGITS[b & 0x0f]);
+    }
+    return result.toString();
+  }
+
+  /**
+   * Encodes the provided data as a hexadecimal string.
+   */
+  public static String encode(ByteBuffer buf) {
+    return encode(buf.array(), buf.arrayOffset() + buf.position(), buf.remaining());
+  }
+
+  /**
+   * Decodes the provided hexadecimal string into an array of bytes.
+   */
+  public static byte[] decode(String encoded) {
+    // IMPLEMENTATION NOTE: Special care is taken to permit odd number of hexadecimal digits.
+    int resultLengthBytes = (encoded.length() + 1) / 2;
+    byte[] result = new byte[resultLengthBytes];
+    int resultOffset = 0;
+    int encodedCharOffset = 0;
+    if ((encoded.length() % 2) != 0) {
+      // Odd number of digits -- the first digit is the lower 4 bits of the first result byte.
+      result[resultOffset++] = (byte) getHexadecimalDigitValue(encoded.charAt(encodedCharOffset));
+      encodedCharOffset++;
+    }
+    for (int len = encoded.length(); encodedCharOffset < len; encodedCharOffset += 2) {
+      result[resultOffset++] = (byte)
+          ((getHexadecimalDigitValue(encoded.charAt(encodedCharOffset)) << 4)
+          | getHexadecimalDigitValue(encoded.charAt(encodedCharOffset + 1)));
+    }
+    return result;
+  }
+
+  private static int getHexadecimalDigitValue(char c) {
+    if ((c >= 'a') && (c <= 'f')) {
+      return (c - 'a') + 0x0a;
+    } else if ((c >= 'A') && (c <= 'F')) {
+      return (c - 'A') + 0x0a;
+    } else if ((c >= '0') && (c <= '9')) {
+      return c - '0';
+    } else {
+      throw new IllegalArgumentException(
+          "Invalid hexadecimal digit at position : '" + c + "' (0x" + Integer.toHexString(c) + ")");
+    }
+  }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/ImportedKey.java b/tests/tests/keystore/src/android/keystore/cts/ImportedKey.java
new file mode 100644
index 0000000..b6c868f
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/ImportedKey.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+import java.security.Key;
+import java.security.KeyPair;
+
+import javax.crypto.SecretKey;
+
+public class ImportedKey {
+    private final boolean mSymmetric;
+    private final String mAlias;
+    private final KeyPair mOriginalKeyPair;
+    private final KeyPair mKeystoreBackedKeyPair;
+    private final SecretKey mOriginalSecretKey;
+    private final SecretKey mKeystoreBackedSecretKey;
+
+    public ImportedKey(String alias, KeyPair original, KeyPair keystoreBacked) {
+        mAlias = alias;
+        mSymmetric = false;
+        mOriginalKeyPair = original;
+        mKeystoreBackedKeyPair = keystoreBacked;
+        mOriginalSecretKey = null;
+        mKeystoreBackedSecretKey = null;
+    }
+
+    public ImportedKey(String alias, SecretKey original, SecretKey keystoreBacked) {
+        mAlias = alias;
+        mSymmetric = true;
+        mOriginalKeyPair = null;
+        mKeystoreBackedKeyPair = null;
+        mOriginalSecretKey = original;
+        mKeystoreBackedSecretKey = keystoreBacked;
+    }
+
+    public String getAlias() {
+        return mAlias;
+    }
+
+    public Key getOriginalEncryptionKey() {
+        if (mSymmetric) {
+            return mOriginalSecretKey;
+        } else {
+            return mOriginalKeyPair.getPublic();
+        }
+    }
+
+    public Key getOriginalDecryptionKey() {
+        if (mSymmetric) {
+            return mOriginalSecretKey;
+        } else {
+            return mOriginalKeyPair.getPrivate();
+        }
+    }
+
+    public Key getOriginalSigningKey() {
+        if (mSymmetric) {
+            return mOriginalSecretKey;
+        } else {
+            return mOriginalKeyPair.getPrivate();
+        }
+    }
+
+    public Key getOriginalVerificationKey() {
+        if (mSymmetric) {
+            return mOriginalSecretKey;
+        } else {
+            return mOriginalKeyPair.getPublic();
+        }
+    }
+
+    public Key getKeystoreBackedEncryptionKey() {
+        if (mSymmetric) {
+            return mKeystoreBackedSecretKey;
+        } else {
+            return mKeystoreBackedKeyPair.getPublic();
+        }
+    }
+
+    public Key getKeystoreBackedDecryptionKey() {
+        if (mSymmetric) {
+            return mKeystoreBackedSecretKey;
+        } else {
+            return mKeystoreBackedKeyPair.getPrivate();
+        }
+    }
+
+    public Key getKeystoreBackedSigningKey() {
+        if (mSymmetric) {
+            return mKeystoreBackedSecretKey;
+        } else {
+            return mKeystoreBackedKeyPair.getPrivate();
+        }
+    }
+
+    public Key getKeystoreBackedVerificationKey() {
+        if (mSymmetric) {
+            return mKeystoreBackedSecretKey;
+        } else {
+            return mKeystoreBackedKeyPair.getPublic();
+        }
+    }
+
+
+    public KeyPair getOriginalKeyPair() {
+        checkIsKeyPair();
+        return mOriginalKeyPair;
+    }
+
+    public KeyPair getKeystoreBackedKeyPair() {
+        checkIsKeyPair();
+        return mKeystoreBackedKeyPair;
+    }
+
+    public SecretKey getOriginalSecretKey() {
+        checkIsSecretKey();
+        return mOriginalSecretKey;
+    }
+
+    public SecretKey getKeystoreBackedSecretKey() {
+        checkIsSecretKey();
+        return mKeystoreBackedSecretKey;
+    }
+
+    private void checkIsKeyPair() {
+        if (mSymmetric) {
+            throw new IllegalStateException("Not a KeyPair");
+        }
+    }
+
+    private void checkIsSecretKey() {
+        if (!mSymmetric) {
+            throw new IllegalStateException("Not a SecretKey");
+        }
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/KeyChainTest.java b/tests/tests/keystore/src/android/keystore/cts/KeyChainTest.java
index d8080a0..caa6336 100644
--- a/tests/tests/keystore/src/android/keystore/cts/KeyChainTest.java
+++ b/tests/tests/keystore/src/android/keystore/cts/KeyChainTest.java
@@ -17,9 +17,13 @@
 package android.keystore.cts;
 
 import android.content.pm.PackageManager;
+import android.os.Handler;
 import android.security.KeyChain;
+import android.security.KeyChainException;
 import android.test.AndroidTestCase;
 
+import java.util.concurrent.CountDownLatch;
+
 public class KeyChainTest extends AndroidTestCase {
     public void testIsKeyAlgorithmSupported_RequiredAlgorithmsSupported() throws Exception {
         assertFalse("DSA must not be supported", KeyChain.isKeyAlgorithmSupported("DSA"));
@@ -27,6 +31,56 @@
         assertTrue("RSA must be supported", KeyChain.isKeyAlgorithmSupported("RSA"));
     }
 
+    public void testNullPrivateKeyArgumentsFail()
+            throws KeyChainException, InterruptedException {
+        try {
+            KeyChain.getPrivateKey(null, null);
+            fail("NullPointerException was expected for null arguments to "
+                    + "KeyChain.getPrivateKey(Context, String)");
+        } catch (NullPointerException expected) {
+        }
+    }
+
+    public void testNullPrivateKeyAliasArgumentFails()
+            throws KeyChainException, InterruptedException {
+        try {
+            KeyChain.getPrivateKey(getContext(), null);
+            fail("NullPointerException was expected with null String argument to "
+                        + "KeyChain.getPrivateKey(Context, String).");
+        } catch (NullPointerException expected) {
+        }
+    }
+
+    public void testNullPrivateKeyContextArgumentFails()
+            throws KeyChainException, InterruptedException {
+        try {
+            KeyChain.getPrivateKey(null, "");
+            fail("NullPointerException was expected with null Context argument to "
+                    + "KeyChain.getPrivateKey(Context, String).");
+        } catch (NullPointerException expected) {
+        }
+    }
+
+    public void testGetPrivateKeyOnMainThreadFails() throws InterruptedException {
+        final CountDownLatch waiter = new CountDownLatch(1);
+        new Handler(getContext().getMainLooper()).post(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    KeyChain.getPrivateKey(getContext(), "");
+                    fail("IllegalStateException was expected for calling "
+                            + "KeyChain.getPrivateKey(Context, String) on main thread");
+                } catch (IllegalStateException expected) {
+                } catch (Exception invalid) {
+                    fail("Expected IllegalStateException, received " + invalid);
+                } finally {
+                    waiter.countDown();
+                }
+            }
+        });
+        waiter.await();
+    }
+
     /**
      * Tests whether the required algorithms are backed by a Keymaster HAL that
      * binds the key material to the specific device it was created or imported
diff --git a/tests/tests/keystore/src/android/keystore/cts/KeyFactoryTest.java b/tests/tests/keystore/src/android/keystore/cts/KeyFactoryTest.java
new file mode 100644
index 0000000..d552631
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/KeyFactoryTest.java
@@ -0,0 +1,477 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+import android.security.keystore.KeyGenParameterSpec;
+import android.security.keystore.KeyInfo;
+import android.security.keystore.KeyProperties;
+import android.test.AndroidTestCase;
+import android.test.MoreAsserts;
+
+import com.android.cts.keystore.R;
+
+import java.io.InputStream;
+import java.security.InvalidKeyException;
+import java.security.KeyFactory;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.PrivateKey;
+import java.security.Provider;
+import java.security.Security;
+import java.security.interfaces.ECPublicKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.ECPrivateKeySpec;
+import java.security.spec.ECPublicKeySpec;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.KeySpec;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.RSAPrivateKeySpec;
+import java.security.spec.RSAPublicKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.security.Provider.Service;
+import java.security.PublicKey;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+
+public class KeyFactoryTest extends AndroidTestCase {
+    private static final String EXPECTED_PROVIDER_NAME = TestUtils.EXPECTED_PROVIDER_NAME;
+
+    private static final String[] EXPECTED_ALGORITHMS = {
+        "EC",
+        "RSA",
+    };
+
+    public void testAlgorithmList() {
+        // Assert that Android Keystore Provider exposes exactly the expected KeyFactory algorithms.
+        // We don't care whether the algorithms are exposed via aliases, as long as canonical names
+        // of algorithms are accepted. If the Provider exposes extraneous algorithms, it'll be
+        // caught because it'll have to expose at least one Service for such an algorithm, and this
+        // Service's algorithm will not be in the expected set.
+
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        Set<Service> services = provider.getServices();
+        Set<String> actualAlgsLowerCase = new HashSet<String>();
+        Set<String> expectedAlgsLowerCase = new HashSet<String>(
+                Arrays.asList(TestUtils.toLowerCase(EXPECTED_ALGORITHMS)));
+        for (Service service : services) {
+            if ("KeyFactory".equalsIgnoreCase(service.getType())) {
+                String algLowerCase = service.getAlgorithm().toLowerCase(Locale.US);
+                actualAlgsLowerCase.add(algLowerCase);
+            }
+        }
+
+        TestUtils.assertContentsInAnyOrder(actualAlgsLowerCase,
+                expectedAlgsLowerCase.toArray(new String[0]));
+    }
+
+    public void testGetKeySpecWithKeystorePrivateKeyAndKeyInfoReflectsAllAuthorizations()
+            throws Exception {
+        Date keyValidityStart = new Date(System.currentTimeMillis() - TestUtils.DAY_IN_MILLIS);
+        Date keyValidityForOriginationEnd =
+                new Date(System.currentTimeMillis() + TestUtils.DAY_IN_MILLIS);
+        Date keyValidityForConsumptionEnd =
+                new Date(System.currentTimeMillis() + 3 * TestUtils.DAY_IN_MILLIS);
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                String[] blockModes = new String[] {KeyProperties.BLOCK_MODE_ECB};
+                String[] encryptionPaddings =
+                        new String[] {KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1,
+                                KeyProperties.ENCRYPTION_PADDING_RSA_OAEP};
+                String[] digests = new String[] {KeyProperties.DIGEST_SHA1,
+                        KeyProperties.DIGEST_SHA224,
+                        KeyProperties.DIGEST_SHA384,
+                        KeyProperties.DIGEST_SHA512};
+                int purposes = KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_SIGN;
+                KeyPairGenerator keyGenerator =
+                        KeyPairGenerator.getInstance(algorithm, EXPECTED_PROVIDER_NAME);
+                keyGenerator.initialize(new KeyGenParameterSpec.Builder("test1", purposes)
+                        .setBlockModes(blockModes)
+                        .setEncryptionPaddings(encryptionPaddings)
+                        .setDigests(digests)
+                        .setKeyValidityStart(keyValidityStart)
+                        .setKeyValidityForOriginationEnd(keyValidityForOriginationEnd)
+                        .setKeyValidityForConsumptionEnd(keyValidityForConsumptionEnd)
+                        .build());
+                KeyPair keyPair = keyGenerator.generateKeyPair();
+                KeyFactory keyFactory = getKeyFactory(algorithm);
+                KeyInfo keyInfo = keyFactory.getKeySpec(keyPair.getPrivate(), KeyInfo.class);
+                assertEquals("test1", keyInfo.getKeystoreAlias());
+                assertEquals(purposes, keyInfo.getPurposes());
+                TestUtils.assertContentsInAnyOrder(
+                        Arrays.asList(keyInfo.getBlockModes()), blockModes);
+
+                List<String> actualEncryptionPaddings =
+                        new ArrayList<String>(Arrays.asList(keyInfo.getEncryptionPaddings()));
+                // Keystore may have added ENCRYPTION_PADDING_NONE to allow software padding.
+                actualEncryptionPaddings.remove(KeyProperties.ENCRYPTION_PADDING_NONE);
+                TestUtils.assertContentsInAnyOrder(
+                        actualEncryptionPaddings, encryptionPaddings);
+
+                List<String> actualDigests =
+                        new ArrayList<String>(Arrays.asList(keyInfo.getDigests()));
+                // Keystore may have added DIGEST_NONE to allow software digesting.
+                actualDigests.remove(KeyProperties.DIGEST_NONE);
+                TestUtils.assertContentsInAnyOrder(actualDigests, digests);
+
+                MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getSignaturePaddings()));
+                assertEquals(keyValidityStart, keyInfo.getKeyValidityStart());
+                assertEquals(keyValidityForOriginationEnd,
+                        keyInfo.getKeyValidityForOriginationEnd());
+                assertEquals(keyValidityForConsumptionEnd,
+                        keyInfo.getKeyValidityForConsumptionEnd());
+                assertFalse(keyInfo.isUserAuthenticationRequired());
+                assertFalse(keyInfo.isUserAuthenticationRequirementEnforcedBySecureHardware());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testGetKeySpecWithKeystorePublicKeyRejectsKeyInfo()
+            throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyPairGenerator keyGenerator =
+                        KeyPairGenerator.getInstance(algorithm, EXPECTED_PROVIDER_NAME);
+                keyGenerator.initialize(new KeyGenParameterSpec.Builder("test1", 0).build());
+                KeyPair keyPair = keyGenerator.generateKeyPair();
+                KeyFactory keyFactory = getKeyFactory(algorithm);
+                try {
+                    keyFactory.getKeySpec(keyPair.getPublic(), KeyInfo.class);
+                    fail();
+                } catch (InvalidKeySpecException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testGetKeySpecWithKeystorePrivateKeyRejectsTransparentKeySpecAndEncodedKeySpec()
+            throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                Class<? extends KeySpec> transparentKeySpecClass;
+                if ("EC".equalsIgnoreCase(algorithm)) {
+                    transparentKeySpecClass = ECPrivateKeySpec.class;
+                } else if ("RSA".equalsIgnoreCase(algorithm)) {
+                    transparentKeySpecClass = RSAPrivateKeySpec.class;
+                } else {
+                    throw new RuntimeException("Unsupported key algorithm: " + algorithm);
+                }
+
+                KeyPairGenerator keyGenerator =
+                        KeyPairGenerator.getInstance(algorithm, EXPECTED_PROVIDER_NAME);
+                keyGenerator.initialize(new KeyGenParameterSpec.Builder("test1", 0).build());
+                KeyPair keyPair = keyGenerator.generateKeyPair();
+
+                KeyFactory keyFactory = getKeyFactory(algorithm);
+                try {
+                    keyFactory.getKeySpec(keyPair.getPrivate(), transparentKeySpecClass);
+                    fail();
+                } catch (InvalidKeySpecException expected) {}
+
+                try {
+                    keyFactory.getKeySpec(keyPair.getPrivate(), PKCS8EncodedKeySpec.class);
+                    fail();
+                } catch (InvalidKeySpecException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testGetKeySpecWithKeystorePublicKeyAcceptsX509EncodedKeySpec()
+            throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyPairGenerator keyGenerator =
+                        KeyPairGenerator.getInstance(algorithm, EXPECTED_PROVIDER_NAME);
+                keyGenerator.initialize(new KeyGenParameterSpec.Builder("test1", 0).build());
+                KeyPair keyPair = keyGenerator.generateKeyPair();
+                PublicKey publicKey = keyPair.getPublic();
+
+                KeyFactory keyFactory = getKeyFactory(algorithm);
+                X509EncodedKeySpec x509EncodedSpec =
+                        keyFactory.getKeySpec(publicKey, X509EncodedKeySpec.class);
+                MoreAsserts.assertEquals(publicKey.getEncoded(), x509EncodedSpec.getEncoded());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testGetKeySpecWithKeystorePublicKeyAcceptsTransparentKeySpec()
+            throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyPairGenerator keyGenerator =
+                        KeyPairGenerator.getInstance(algorithm, EXPECTED_PROVIDER_NAME);
+                keyGenerator.initialize(new KeyGenParameterSpec.Builder("test1", 0).build());
+                KeyPair keyPair = keyGenerator.generateKeyPair();
+                PublicKey publicKey = keyPair.getPublic();
+
+                KeyFactory keyFactory = getKeyFactory(algorithm);
+                if ("EC".equalsIgnoreCase(algorithm)) {
+                    ECPublicKey ecPublicKey = (ECPublicKey) publicKey;
+                    ECPublicKeySpec spec =
+                            keyFactory.getKeySpec(publicKey, ECPublicKeySpec.class);
+                    assertEquals(ecPublicKey.getW(), spec.getW());
+                    TestUtils.assertECParameterSpecEqualsIgnoreSeedIfNotPresent(
+                            ecPublicKey.getParams(), spec.getParams());
+                } else if ("RSA".equalsIgnoreCase(algorithm)) {
+                    RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey;
+                    RSAPublicKeySpec spec =
+                            keyFactory.getKeySpec(publicKey, RSAPublicKeySpec.class);
+                    assertEquals(rsaPublicKey.getModulus(), spec.getModulus());
+                    assertEquals(rsaPublicKey.getPublicExponent(), spec.getPublicExponent());
+                } else {
+                    throw new RuntimeException("Unsupported key algorithm: " + algorithm);
+                }
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testTranslateKeyWithNullKeyThrowsInvalidKeyException() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyFactory keyFactory = getKeyFactory(algorithm);
+                try {
+                    keyFactory.translateKey(null);
+                    fail();
+                } catch (InvalidKeyException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testTranslateKeyRejectsNonAndroidKeystoreKeys() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                SecretKey key = new SecretKeySpec(new byte[16], algorithm);
+                KeyFactory keyFactory = getKeyFactory(algorithm);
+                try {
+                    keyFactory.translateKey(key);
+                    fail();
+                } catch (InvalidKeyException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testTranslateKeyAcceptsAndroidKeystoreKeys() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyPairGenerator keyGenerator =
+                        KeyPairGenerator.getInstance(algorithm, EXPECTED_PROVIDER_NAME);
+                keyGenerator.initialize(new KeyGenParameterSpec.Builder("test1", 0).build());
+                KeyPair keyPair = keyGenerator.generateKeyPair();
+
+                KeyFactory keyFactory = getKeyFactory(algorithm);
+                assertSame(keyPair.getPrivate(), keyFactory.translateKey(keyPair.getPrivate()));
+                assertSame(keyPair.getPublic(), keyFactory.translateKey(keyPair.getPublic()));
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testGeneratePrivateWithNullSpecThrowsInvalidKeySpecException() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyFactory keyFactory = getKeyFactory(algorithm);
+                try {
+                    keyFactory.generatePrivate(null);
+                    fail();
+                } catch (InvalidKeySpecException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testGeneratePublicWithNullSpecThrowsInvalidKeySpecException() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyFactory keyFactory = getKeyFactory(algorithm);
+                try {
+                    keyFactory.generatePublic(null);
+                    fail();
+                } catch (InvalidKeySpecException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testGeneratePrivateRejectsPKCS8EncodedKeySpec() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            int resId;
+            if ("EC".equalsIgnoreCase(algorithm)) {
+                resId = R.raw.ec_key1_pkcs8;
+            } else if ("RSA".equalsIgnoreCase(algorithm)) {
+                resId = R.raw.rsa_key2_pkcs8;
+            } else {
+                throw new RuntimeException("Unsupported key algorithm: " + algorithm);
+            }
+
+            byte[] pkcs8EncodedForm;
+            try (InputStream in = getContext().getResources().openRawResource(resId)) {
+                pkcs8EncodedForm = TestUtils.drain(in);
+            }
+            PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(pkcs8EncodedForm);
+            try {
+                KeyFactory keyFactory = getKeyFactory(algorithm);
+                try {
+                    keyFactory.generatePrivate(spec);
+                    fail();
+                } catch (InvalidKeySpecException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testGeneratePublicRejectsX509EncodedKeySpec() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            int resId;
+            if ("EC".equalsIgnoreCase(algorithm)) {
+                resId = R.raw.ec_key2_cert;
+            } else if ("RSA".equalsIgnoreCase(algorithm)) {
+                resId = R.raw.rsa_key1_cert;
+            } else {
+                throw new RuntimeException("Unsupported key algorithm: " + algorithm);
+            }
+
+            byte[] x509EncodedForm;
+            try (InputStream in = getContext().getResources().openRawResource(resId)) {
+                x509EncodedForm = TestUtils.drain(in);
+            }
+            X509EncodedKeySpec spec = new X509EncodedKeySpec(x509EncodedForm);
+            try {
+                KeyFactory keyFactory = getKeyFactory(algorithm);
+                try {
+                    keyFactory.generatePublic(spec);
+                    fail();
+                } catch (InvalidKeySpecException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testGeneratePrivateRejectsTransparentKeySpec() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            int resId;
+            Class<? extends KeySpec> keySpecClass;
+            if ("EC".equalsIgnoreCase(algorithm)) {
+                resId = R.raw.ec_key2_pkcs8;
+                keySpecClass = ECPrivateKeySpec.class;
+            } else if ("RSA".equalsIgnoreCase(algorithm)) {
+                resId = R.raw.rsa_key2_pkcs8;
+                keySpecClass = RSAPrivateKeySpec.class;
+            } else {
+                throw new RuntimeException("Unsupported key algorithm: " + algorithm);
+            }
+            PrivateKey key = TestUtils.getRawResPrivateKey(getContext(), resId);
+            KeyFactory anotherKeyFactory = KeyFactory.getInstance(algorithm);
+            KeySpec spec = anotherKeyFactory.getKeySpec(key, keySpecClass);
+
+            try {
+                KeyFactory keyFactory = getKeyFactory(algorithm);
+                try {
+                    keyFactory.generatePrivate(spec);
+                    fail();
+                } catch (InvalidKeySpecException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testGeneratePublicRejectsTransparentKeySpec() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            int resId;
+            Class<? extends KeySpec> keySpecClass;
+            if ("EC".equalsIgnoreCase(algorithm)) {
+                resId = R.raw.ec_key2_cert;
+                keySpecClass = ECPublicKeySpec.class;
+            } else if ("RSA".equalsIgnoreCase(algorithm)) {
+                resId = R.raw.rsa_key2_cert;
+                keySpecClass = RSAPublicKeySpec.class;
+            } else {
+                throw new RuntimeException("Unsupported key algorithm: " + algorithm);
+            }
+            PublicKey key = TestUtils.getRawResX509Certificate(getContext(), resId).getPublicKey();
+            KeyFactory anotherKeyFactory = KeyFactory.getInstance(algorithm);
+            KeySpec spec = anotherKeyFactory.getKeySpec(key, keySpecClass);
+
+            try {
+                KeyFactory keyFactory = getKeyFactory(algorithm);
+                try {
+                    keyFactory.generatePublic(spec);
+                    fail();
+                } catch (InvalidKeySpecException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testGeneratePrivateAndPublicRejectKeyInfo() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyPairGenerator keyGenerator =
+                        KeyPairGenerator.getInstance(algorithm, EXPECTED_PROVIDER_NAME);
+                keyGenerator.initialize(new KeyGenParameterSpec.Builder("test1", 0).build());
+                KeyPair keyPair = keyGenerator.generateKeyPair();
+                KeyInfo keyInfo = TestUtils.getKeyInfo(keyPair.getPrivate());
+
+                KeyFactory keyFactory = getKeyFactory(algorithm);
+                try {
+                    keyFactory.generatePrivate(keyInfo);
+                    fail();
+                } catch (InvalidKeySpecException expected) {}
+
+                try {
+                    keyFactory.generatePublic(keyInfo);
+                    fail();
+                } catch (InvalidKeySpecException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    private KeyFactory getKeyFactory(String algorithm) throws NoSuchAlgorithmException,
+            NoSuchProviderException {
+        return KeyFactory.getInstance(algorithm, EXPECTED_PROVIDER_NAME);
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/KeyGenParameterSpecTest.java b/tests/tests/keystore/src/android/keystore/cts/KeyGenParameterSpecTest.java
new file mode 100644
index 0000000..a3e5d96
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/KeyGenParameterSpecTest.java
@@ -0,0 +1,328 @@
+/*
+ * Copyright 2015 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.keystore.cts;
+
+import android.security.keystore.KeyGenParameterSpec;
+import android.security.keystore.KeyProperties;
+import android.test.MoreAsserts;
+
+import junit.framework.TestCase;
+
+import java.math.BigInteger;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.ECGenParameterSpec;
+import java.util.Arrays;
+import java.util.Date;
+
+import javax.security.auth.x500.X500Principal;
+
+public class KeyGenParameterSpecTest extends TestCase {
+
+    private static final X500Principal DEFAULT_CERT_SUBJECT = new X500Principal("CN=fake");
+    private static final BigInteger DEFAULT_CERT_SERIAL_NUMBER = new BigInteger("1");
+    private static final Date DEFAULT_CERT_NOT_BEFORE = new Date(0L); // Jan 1 1970
+    private static final Date DEFAULT_CERT_NOT_AFTER = new Date(2461449600000L); // Jan 1 2048
+
+    public void testDefaults() {
+        // Set only the mandatory parameters and assert values returned by getters.
+
+        KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
+                "arbitrary", KeyProperties.PURPOSE_ENCRYPT)
+                .build();
+
+        assertEquals("arbitrary", spec.getKeystoreAlias());
+        assertEquals(KeyProperties.PURPOSE_ENCRYPT, spec.getPurposes());
+        assertNull(null, spec.getAlgorithmParameterSpec());
+        MoreAsserts.assertEmpty(Arrays.asList(spec.getBlockModes()));
+        assertEquals(DEFAULT_CERT_NOT_BEFORE, spec.getCertificateNotBefore());
+        assertEquals(DEFAULT_CERT_NOT_AFTER, spec.getCertificateNotAfter());
+        assertEquals(DEFAULT_CERT_SERIAL_NUMBER, spec.getCertificateSerialNumber());
+        assertEquals(DEFAULT_CERT_SUBJECT, spec.getCertificateSubject());
+        assertFalse(spec.isDigestsSpecified());
+        try {
+            spec.getDigests();
+            fail();
+        } catch (IllegalStateException expected) {}
+        MoreAsserts.assertEmpty(Arrays.asList(spec.getEncryptionPaddings()));
+        assertEquals(-1, spec.getKeySize());
+        assertNull(spec.getKeyValidityStart());
+        assertNull(spec.getKeyValidityForOriginationEnd());
+        assertNull(spec.getKeyValidityForConsumptionEnd());
+        assertTrue(spec.isRandomizedEncryptionRequired());
+        MoreAsserts.assertEmpty(Arrays.asList(spec.getSignaturePaddings()));
+        assertFalse(spec.isUserAuthenticationRequired());
+        assertEquals(-1, spec.getUserAuthenticationValidityDurationSeconds());
+    }
+
+    public void testSettersReflectedInGetters() {
+        // Set all parameters to non-default values and then assert that getters reflect that.
+
+        Date certNotBeforeDate = new Date(System.currentTimeMillis());
+        Date certNotAfterDate = new Date(System.currentTimeMillis() + 12345678);
+        Date keyValidityStartDate = new Date(System.currentTimeMillis() - 2222222);
+        Date keyValidityEndDateForOrigination = new Date(System.currentTimeMillis() + 11111111);
+        Date keyValidityEndDateForConsumption = new Date(System.currentTimeMillis() + 33333333);
+        AlgorithmParameterSpec algSpecificParams = new ECGenParameterSpec("secp256r1");
+
+        KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
+                "arbitrary", KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_ENCRYPT)
+                .setAlgorithmParameterSpec(algSpecificParams)
+                .setBlockModes(KeyProperties.BLOCK_MODE_GCM, KeyProperties.BLOCK_MODE_CBC)
+                .setCertificateNotBefore(certNotBeforeDate)
+                .setCertificateNotAfter(certNotAfterDate)
+                .setCertificateSerialNumber(new BigInteger("13946146"))
+                .setCertificateSubject(new X500Principal("CN=test"))
+                .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA384)
+                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP,
+                        KeyProperties.ENCRYPTION_PADDING_PKCS7)
+                .setKeySize(1234)
+                .setKeyValidityStart(keyValidityStartDate)
+                .setKeyValidityForOriginationEnd(keyValidityEndDateForOrigination)
+                .setKeyValidityForConsumptionEnd(keyValidityEndDateForConsumption)
+                .setRandomizedEncryptionRequired(false)
+                .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PSS,
+                        KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
+                .setUserAuthenticationRequired(true)
+                .setUserAuthenticationValidityDurationSeconds(12345)
+                .build();
+
+        assertEquals("arbitrary", spec.getKeystoreAlias());
+        assertEquals(
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_ENCRYPT, spec.getPurposes());
+        assertSame(algSpecificParams, spec.getAlgorithmParameterSpec());
+        MoreAsserts.assertContentsInOrder(Arrays.asList(spec.getBlockModes()),
+                KeyProperties.BLOCK_MODE_GCM, KeyProperties.BLOCK_MODE_CBC);
+        assertEquals(certNotBeforeDate, spec.getCertificateNotBefore());
+        assertEquals(certNotAfterDate, spec.getCertificateNotAfter());
+        assertEquals(new BigInteger("13946146"), spec.getCertificateSerialNumber());
+        assertEquals(new X500Principal("CN=test"), spec.getCertificateSubject());
+        assertTrue(spec.isDigestsSpecified());
+        MoreAsserts.assertContentsInOrder(Arrays.asList(spec.getDigests()),
+                KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA384);
+        MoreAsserts.assertContentsInOrder(Arrays.asList(spec.getEncryptionPaddings()),
+                KeyProperties.ENCRYPTION_PADDING_RSA_OAEP, KeyProperties.ENCRYPTION_PADDING_PKCS7);
+        assertEquals(1234, spec.getKeySize());
+        assertEquals(keyValidityStartDate, spec.getKeyValidityStart());
+        assertEquals(keyValidityEndDateForOrigination, spec.getKeyValidityForOriginationEnd());
+        assertEquals(keyValidityEndDateForConsumption, spec.getKeyValidityForConsumptionEnd());
+        assertFalse(spec.isRandomizedEncryptionRequired());
+        MoreAsserts.assertContentsInOrder(Arrays.asList(spec.getSignaturePaddings()),
+                KeyProperties.SIGNATURE_PADDING_RSA_PSS, KeyProperties.SIGNATURE_PADDING_RSA_PKCS1);
+        assertTrue(spec.isUserAuthenticationRequired());
+        assertEquals(12345, spec.getUserAuthenticationValidityDurationSeconds());
+    }
+
+    public void testNullAliasNotPermitted() {
+        try {
+            new KeyGenParameterSpec.Builder(null, KeyProperties.PURPOSE_ENCRYPT);
+            fail();
+        } catch (NullPointerException expected) {}
+    }
+
+    public void testEmptyAliasNotPermitted() {
+        try {
+            new KeyGenParameterSpec.Builder("", KeyProperties.PURPOSE_ENCRYPT);
+            fail();
+        } catch (IllegalArgumentException expected) {}
+    }
+
+    public void testSetKeyValidityEndDateAppliesToBothEndDates() {
+        Date date = new Date(System.currentTimeMillis() + 555555);
+        KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
+                "ignore", KeyProperties.PURPOSE_VERIFY)
+                .setKeyValidityEnd(date)
+                .build();
+        assertEquals(date, spec.getKeyValidityForOriginationEnd());
+        assertEquals(date, spec.getKeyValidityForConsumptionEnd());
+    }
+
+    public void testSetUserAuthenticationValidityDurationSecondsValidityCheck() {
+        KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder("alias", 0);
+        try {
+            builder.setUserAuthenticationValidityDurationSeconds(-2);
+            fail();
+        } catch (IllegalArgumentException expected) {}
+
+        try {
+            builder.setUserAuthenticationValidityDurationSeconds(-100);
+            fail();
+        } catch (IllegalArgumentException expected) {}
+
+        try {
+            builder.setUserAuthenticationValidityDurationSeconds(Integer.MIN_VALUE);
+            fail();
+        } catch (IllegalArgumentException expected) {}
+
+        builder.setUserAuthenticationValidityDurationSeconds(-1);
+        builder.setUserAuthenticationValidityDurationSeconds(0);
+        builder.setUserAuthenticationValidityDurationSeconds(1);
+        builder.setUserAuthenticationValidityDurationSeconds(Integer.MAX_VALUE);
+
+        try {
+            builder.setUserAuthenticationValidityDurationSeconds(-2);
+            fail();
+        } catch (IllegalArgumentException expected) {}
+    }
+
+    public void testImmutabilityViaSetterParams() {
+        // Assert that all mutable parameters provided to setters are copied to ensure that values
+        // returned by getters never change.
+        String[] blockModes =
+                new String[] {KeyProperties.BLOCK_MODE_GCM, KeyProperties.BLOCK_MODE_CBC};
+        String[] originalBlockModes = blockModes.clone();
+        Date certNotBeforeDate = new Date(System.currentTimeMillis());
+        Date originalCertNotBeforeDate = new Date(certNotBeforeDate.getTime());
+        Date certNotAfterDate = new Date(System.currentTimeMillis() + 12345678);
+        Date originalCertNotAfterDate = new Date(certNotAfterDate.getTime());
+        Date keyValidityStartDate = new Date(System.currentTimeMillis() - 2222222);
+        Date originalKeyValidityStartDate = new Date(keyValidityStartDate.getTime());
+        Date keyValidityEndDateForOrigination = new Date(System.currentTimeMillis() + 11111111);
+        Date originalKeyValidityEndDateForOrigination =
+                new Date(keyValidityEndDateForOrigination.getTime());
+        Date keyValidityEndDateForConsumption = new Date(System.currentTimeMillis() + 33333333);
+        Date originalKeyValidityEndDateForConsumption =
+                new Date(keyValidityEndDateForConsumption.getTime());
+        String[] digests = new String[] {KeyProperties.DIGEST_MD5, KeyProperties.DIGEST_SHA512};
+        String[] originalDigests = digests.clone();
+        String[] encryptionPaddings = new String[] {
+                KeyProperties.ENCRYPTION_PADDING_RSA_OAEP, KeyProperties.ENCRYPTION_PADDING_PKCS7};
+        String[] originalEncryptionPaddings = encryptionPaddings.clone();
+        String[] signaturePaddings = new String[] {
+                KeyProperties.SIGNATURE_PADDING_RSA_PSS, KeyProperties.SIGNATURE_PADDING_RSA_PKCS1};
+        String[] originalSignaturePaddings = signaturePaddings.clone();
+
+        KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
+                "arbitrary", KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_ENCRYPT)
+                .setBlockModes(blockModes)
+                .setCertificateNotBefore(certNotBeforeDate)
+                .setCertificateNotAfter(certNotAfterDate)
+                .setDigests(digests)
+                .setEncryptionPaddings(encryptionPaddings)
+                .setKeyValidityStart(keyValidityStartDate)
+                .setKeyValidityForOriginationEnd(keyValidityEndDateForOrigination)
+                .setKeyValidityForConsumptionEnd(keyValidityEndDateForConsumption)
+                .setSignaturePaddings(signaturePaddings)
+                .build();
+
+        assertEquals(Arrays.asList(originalBlockModes), Arrays.asList(spec.getBlockModes()));
+        blockModes[0] = null;
+        assertEquals(Arrays.asList(originalBlockModes), Arrays.asList(spec.getBlockModes()));
+
+        assertEquals(originalCertNotBeforeDate, spec.getCertificateNotBefore());
+        certNotBeforeDate.setTime(1234567890L);
+        assertEquals(originalCertNotBeforeDate, spec.getCertificateNotBefore());
+
+        assertEquals(originalCertNotAfterDate, spec.getCertificateNotAfter());
+        certNotAfterDate.setTime(1234567890L);
+        assertEquals(originalCertNotAfterDate, spec.getCertificateNotAfter());
+
+        assertEquals(Arrays.asList(originalDigests), Arrays.asList(spec.getDigests()));
+        digests[1] = null;
+        assertEquals(Arrays.asList(originalDigests), Arrays.asList(spec.getDigests()));
+
+        assertEquals(Arrays.asList(originalEncryptionPaddings),
+                Arrays.asList(spec.getEncryptionPaddings()));
+        encryptionPaddings[0] = null;
+        assertEquals(Arrays.asList(originalEncryptionPaddings),
+                Arrays.asList(spec.getEncryptionPaddings()));
+
+        assertEquals(originalKeyValidityStartDate, spec.getKeyValidityStart());
+        keyValidityStartDate.setTime(1234567890L);
+        assertEquals(originalKeyValidityStartDate, spec.getKeyValidityStart());
+
+        assertEquals(originalKeyValidityEndDateForOrigination,
+                spec.getKeyValidityForOriginationEnd());
+        keyValidityEndDateForOrigination.setTime(1234567890L);
+        assertEquals(originalKeyValidityEndDateForOrigination,
+                spec.getKeyValidityForOriginationEnd());
+
+        assertEquals(originalKeyValidityEndDateForConsumption,
+                spec.getKeyValidityForConsumptionEnd());
+        keyValidityEndDateForConsumption.setTime(1234567890L);
+        assertEquals(originalKeyValidityEndDateForConsumption,
+                spec.getKeyValidityForConsumptionEnd());
+
+        assertEquals(Arrays.asList(originalSignaturePaddings),
+                Arrays.asList(spec.getSignaturePaddings()));
+        signaturePaddings[1] = null;
+        assertEquals(Arrays.asList(originalSignaturePaddings),
+                Arrays.asList(spec.getSignaturePaddings()));
+    }
+
+    public void testImmutabilityViaGetterReturnValues() {
+        // Assert that none of the mutable return values from getters modify the state of the spec.
+
+        KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
+                "arbitrary", KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_ENCRYPT)
+                .setBlockModes(KeyProperties.BLOCK_MODE_GCM, KeyProperties.BLOCK_MODE_CBC)
+                .setCertificateNotBefore(new Date(System.currentTimeMillis()))
+                .setCertificateNotAfter(new Date(System.currentTimeMillis() + 12345678))
+                .setDigests(KeyProperties.DIGEST_MD5, KeyProperties.DIGEST_SHA512)
+                .setEncryptionPaddings(
+                        KeyProperties.ENCRYPTION_PADDING_RSA_OAEP,
+                        KeyProperties.ENCRYPTION_PADDING_PKCS7)
+                .setKeyValidityStart(new Date(System.currentTimeMillis() - 2222222))
+                .setKeyValidityForOriginationEnd(new Date(System.currentTimeMillis() + 11111111))
+                .setKeyValidityForConsumptionEnd(new Date(System.currentTimeMillis() + 33333333))
+                .setSignaturePaddings(
+                        KeyProperties.SIGNATURE_PADDING_RSA_PSS,
+                        KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
+                .build();
+
+        String[] originalBlockModes = spec.getBlockModes().clone();
+        spec.getBlockModes()[0] = null;
+        assertEquals(Arrays.asList(originalBlockModes), Arrays.asList(spec.getBlockModes()));
+
+        Date originalCertNotBeforeDate = (Date) spec.getCertificateNotBefore().clone();
+        spec.getCertificateNotBefore().setTime(1234567890L);
+        assertEquals(originalCertNotBeforeDate, spec.getCertificateNotBefore());
+
+        Date originalCertNotAfterDate = (Date) spec.getCertificateNotAfter().clone();
+        spec.getCertificateNotAfter().setTime(1234567890L);
+        assertEquals(originalCertNotAfterDate, spec.getCertificateNotAfter());
+
+        String[] originalDigests = spec.getDigests().clone();
+        spec.getDigests()[0] = null;
+        assertEquals(Arrays.asList(originalDigests), Arrays.asList(spec.getDigests()));
+
+        String[] originalEncryptionPaddings = spec.getEncryptionPaddings().clone();
+        spec.getEncryptionPaddings()[0] = null;
+        assertEquals(Arrays.asList(originalEncryptionPaddings),
+                Arrays.asList(spec.getEncryptionPaddings()));
+
+        Date originalKeyValidityStartDate = (Date) spec.getKeyValidityStart().clone();
+        spec.getKeyValidityStart().setTime(1234567890L);
+        assertEquals(originalKeyValidityStartDate, spec.getKeyValidityStart());
+
+        Date originalKeyValidityEndDateForOrigination =
+                (Date) spec.getKeyValidityForOriginationEnd().clone();
+        spec.getKeyValidityForOriginationEnd().setTime(1234567890L);
+        assertEquals(originalKeyValidityEndDateForOrigination,
+                spec.getKeyValidityForOriginationEnd());
+
+        Date originalKeyValidityEndDateForConsumption =
+                (Date) spec.getKeyValidityForConsumptionEnd().clone();
+        spec.getKeyValidityForConsumptionEnd().setTime(1234567890L);
+        assertEquals(originalKeyValidityEndDateForConsumption,
+                spec.getKeyValidityForConsumptionEnd());
+
+        String[] originalSignaturePaddings = spec.getSignaturePaddings().clone();
+        spec.getSignaturePaddings()[0] = null;
+        assertEquals(Arrays.asList(originalSignaturePaddings),
+                Arrays.asList(spec.getSignaturePaddings()));
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/KeyGeneratorTest.java b/tests/tests/keystore/src/android/keystore/cts/KeyGeneratorTest.java
new file mode 100644
index 0000000..6deaed4
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/KeyGeneratorTest.java
@@ -0,0 +1,528 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+import android.security.keystore.KeyGenParameterSpec;
+import android.security.keystore.KeyInfo;
+import android.security.keystore.KeyProperties;
+import android.test.MoreAsserts;
+
+import junit.framework.TestCase;
+
+import java.security.InvalidAlgorithmParameterException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.Provider;
+import java.security.Security;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.ECGenParameterSpec;
+import java.security.Provider.Service;
+import java.security.SecureRandom;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import javax.crypto.KeyGenerator;
+import javax.crypto.SecretKey;
+
+public class KeyGeneratorTest extends TestCase {
+    private static final String EXPECTED_PROVIDER_NAME = TestUtils.EXPECTED_PROVIDER_NAME;
+
+    static final String[] EXPECTED_ALGORITHMS = {
+        "AES",
+        "HmacSHA1",
+        "HmacSHA224",
+        "HmacSHA256",
+        "HmacSHA384",
+        "HmacSHA512",
+    };
+
+    private static final Map<String, Integer> DEFAULT_KEY_SIZES =
+            new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
+    static {
+        DEFAULT_KEY_SIZES.put("AES", 128);
+        DEFAULT_KEY_SIZES.put("HmacSHA1", 160);
+        DEFAULT_KEY_SIZES.put("HmacSHA224", 224);
+        DEFAULT_KEY_SIZES.put("HmacSHA256", 256);
+        DEFAULT_KEY_SIZES.put("HmacSHA384", 384);
+        DEFAULT_KEY_SIZES.put("HmacSHA512", 512);
+    }
+
+    static final int[] AES_SUPPORTED_KEY_SIZES = new int[] {128, 192, 256};
+
+    public void testAlgorithmList() {
+        // Assert that Android Keystore Provider exposes exactly the expected KeyGenerator
+        // algorithms. We don't care whether the algorithms are exposed via aliases, as long as
+        // canonical names of algorithms are accepted. If the Provider exposes extraneous
+        // algorithms, it'll be caught because it'll have to expose at least one Service for such an
+        // algorithm, and this Service's algorithm will not be in the expected set.
+
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        Set<Service> services = provider.getServices();
+        Set<String> actualAlgsLowerCase = new HashSet<String>();
+        Set<String> expectedAlgsLowerCase = new HashSet<String>(
+                Arrays.asList(TestUtils.toLowerCase(EXPECTED_ALGORITHMS)));
+        for (Service service : services) {
+            if ("KeyGenerator".equalsIgnoreCase(service.getType())) {
+                String algLowerCase = service.getAlgorithm().toLowerCase(Locale.US);
+                actualAlgsLowerCase.add(algLowerCase);
+            }
+        }
+
+        TestUtils.assertContentsInAnyOrder(actualAlgsLowerCase,
+                expectedAlgsLowerCase.toArray(new String[0]));
+    }
+
+    public void testGenerateWithoutInitThrowsIllegalStateException() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyGenerator keyGenerator = getKeyGenerator(algorithm);
+                try {
+                    keyGenerator.generateKey();
+                    fail();
+                } catch (IllegalStateException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitWithKeySizeThrowsUnsupportedOperationException() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyGenerator keyGenerator = getKeyGenerator(algorithm);
+                int keySizeBits = DEFAULT_KEY_SIZES.get(algorithm);
+                try {
+                    keyGenerator.init(keySizeBits);
+                    fail();
+                } catch (UnsupportedOperationException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitWithKeySizeAndSecureRandomThrowsUnsupportedOperationException()
+            throws Exception {
+        SecureRandom rng = new SecureRandom();
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyGenerator keyGenerator = getKeyGenerator(algorithm);
+                int keySizeBits = DEFAULT_KEY_SIZES.get(algorithm);
+                try {
+                    keyGenerator.init(keySizeBits, rng);
+                    fail();
+                } catch (UnsupportedOperationException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitWithNullAlgParamsThrowsInvalidAlgorithmParameterException()
+            throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyGenerator keyGenerator = getKeyGenerator(algorithm);
+                try {
+                    keyGenerator.init((AlgorithmParameterSpec) null);
+                    fail();
+                } catch (InvalidAlgorithmParameterException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitWithNullAlgParamsAndSecureRandomThrowsInvalidAlgorithmParameterException()
+            throws Exception {
+        SecureRandom rng = new SecureRandom();
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyGenerator keyGenerator = getKeyGenerator(algorithm);
+                try {
+                    keyGenerator.init((AlgorithmParameterSpec) null, rng);
+                    fail();
+                } catch (InvalidAlgorithmParameterException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitWithAlgParamsAndNullSecureRandom()
+            throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyGenerator keyGenerator = getKeyGenerator(algorithm);
+                keyGenerator.init(getWorkingSpec().build(), (SecureRandom) null);
+                // Check that generateKey doesn't fail either, just in case null SecureRandom
+                // causes trouble there.
+                keyGenerator.generateKey();
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitWithUnsupportedAlgParamsTypeThrowsInvalidAlgorithmParameterException()
+            throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyGenerator keyGenerator = getKeyGenerator(algorithm);
+                try {
+                    keyGenerator.init(new ECGenParameterSpec("secp256r1"));
+                    fail();
+                } catch (InvalidAlgorithmParameterException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testDefaultKeySize() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                int expectedSizeBits = DEFAULT_KEY_SIZES.get(algorithm);
+                KeyGenerator keyGenerator = getKeyGenerator(algorithm);
+                keyGenerator.init(getWorkingSpec().build());
+                SecretKey key = keyGenerator.generateKey();
+                assertEquals(expectedSizeBits, TestUtils.getKeyInfo(key).getKeySize());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testAesKeySupportedSizes() throws Exception {
+        KeyGenerator keyGenerator = getKeyGenerator("AES");
+        KeyGenParameterSpec.Builder goodSpec = getWorkingSpec();
+        CountingSecureRandom rng = new CountingSecureRandom();
+        for (int i = -16; i <= 512; i++) {
+            try {
+                rng.resetCounters();
+                KeyGenParameterSpec spec;
+                if (i >= 0) {
+                    spec = TestUtils.buildUpon(goodSpec.setKeySize(i)).build();
+                } else {
+                    try {
+                        spec = TestUtils.buildUpon(goodSpec.setKeySize(i)).build();
+                        fail();
+                    } catch (IllegalArgumentException expected) {
+                        continue;
+                    }
+                }
+                rng.resetCounters();
+                if (TestUtils.contains(AES_SUPPORTED_KEY_SIZES, i)) {
+                    keyGenerator.init(spec, rng);
+                    SecretKey key = keyGenerator.generateKey();
+                    assertEquals(i, TestUtils.getKeyInfo(key).getKeySize());
+                    assertEquals((i + 7) / 8, rng.getOutputSizeBytes());
+                } else {
+                    try {
+                        keyGenerator.init(spec, rng);
+                        fail();
+                    } catch (InvalidAlgorithmParameterException expected) {}
+                    assertEquals(0, rng.getOutputSizeBytes());
+                }
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for key size " + i, e);
+            }
+        }
+    }
+
+    public void testHmacKeySupportedSizes() throws Exception {
+        CountingSecureRandom rng = new CountingSecureRandom();
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            if (!TestUtils.isHmacAlgorithm(algorithm)) {
+                continue;
+            }
+
+            for (int i = -16; i <= 1024; i++) {
+                try {
+                    rng.resetCounters();
+                    KeyGenerator keyGenerator = getKeyGenerator(algorithm);
+                    KeyGenParameterSpec spec;
+                    if (i >= 0) {
+                        spec = getWorkingSpec().setKeySize(i).build();
+                    } else {
+                        try {
+                            spec = getWorkingSpec().setKeySize(i).build();
+                            fail();
+                        } catch (IllegalArgumentException expected) {
+                            continue;
+                        }
+                    }
+                    if ((i > 0) && ((i % 8 ) == 0)) {
+                        keyGenerator.init(spec, rng);
+                        SecretKey key = keyGenerator.generateKey();
+                        assertEquals(i, TestUtils.getKeyInfo(key).getKeySize());
+                        assertEquals((i + 7) / 8, rng.getOutputSizeBytes());
+                    } else {
+                        try {
+                            keyGenerator.init(spec, rng);
+                            fail();
+                        } catch (InvalidAlgorithmParameterException expected) {}
+                        assertEquals(0, rng.getOutputSizeBytes());
+                    }
+                } catch (Throwable e) {
+                    throw new RuntimeException(
+                            "Failed for " + algorithm + " with key size " + i, e);
+                }
+            }
+        }
+    }
+
+    public void testHmacKeyOnlyOneDigestCanBeAuthorized() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            if (!TestUtils.isHmacAlgorithm(algorithm)) {
+                continue;
+            }
+
+            try {
+                String digest = TestUtils.getHmacAlgorithmDigest(algorithm);
+                assertNotNull(digest);
+
+                KeyGenParameterSpec.Builder goodSpec = new KeyGenParameterSpec.Builder(
+                        "test1", KeyProperties.PURPOSE_SIGN);
+
+                KeyGenerator keyGenerator = getKeyGenerator(algorithm);
+
+                // Digests authorization not specified in algorithm parameters
+                assertFalse(goodSpec.build().isDigestsSpecified());
+                keyGenerator.init(goodSpec.build());
+                SecretKey key = keyGenerator.generateKey();
+                TestUtils.assertContentsInAnyOrder(
+                        Arrays.asList(TestUtils.getKeyInfo(key).getDigests()), digest);
+
+                // The same digest is specified in algorithm parameters
+                keyGenerator.init(TestUtils.buildUpon(goodSpec).setDigests(digest).build());
+                key = keyGenerator.generateKey();
+                TestUtils.assertContentsInAnyOrder(
+                        Arrays.asList(TestUtils.getKeyInfo(key).getDigests()), digest);
+
+                // No digests specified in algorithm parameters
+                try {
+                    keyGenerator.init(TestUtils.buildUpon(goodSpec).setDigests().build());
+                    fail();
+                } catch (InvalidAlgorithmParameterException expected) {}
+
+                // A different digest specified in algorithm parameters
+                String anotherDigest = "SHA-256".equalsIgnoreCase(digest) ? "SHA-384" : "SHA-256";
+                try {
+                    keyGenerator.init(TestUtils.buildUpon(goodSpec)
+                            .setDigests(anotherDigest)
+                            .build());
+                    fail();
+                } catch (InvalidAlgorithmParameterException expected) {}
+                try {
+                    keyGenerator.init(TestUtils.buildUpon(goodSpec)
+                            .setDigests(digest, anotherDigest)
+                            .build());
+                    fail();
+                } catch (InvalidAlgorithmParameterException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitWithUnknownBlockModeFails() {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyGenerator keyGenerator = getKeyGenerator(algorithm);
+                try {
+                    keyGenerator.init(getWorkingSpec().setBlockModes("weird").build());
+                    fail();
+                } catch (InvalidAlgorithmParameterException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitWithUnknownEncryptionPaddingFails() {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyGenerator keyGenerator = getKeyGenerator(algorithm);
+                try {
+                    keyGenerator.init(getWorkingSpec().setEncryptionPaddings("weird").build());
+                    fail();
+                } catch (InvalidAlgorithmParameterException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitWithSignaturePaddingFails() {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyGenerator keyGenerator = getKeyGenerator(algorithm);
+                try {
+                    keyGenerator.init(getWorkingSpec()
+                            .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
+                            .build());
+                    fail();
+                } catch (InvalidAlgorithmParameterException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitWithUnknownDigestFails() {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyGenerator keyGenerator = getKeyGenerator(algorithm);
+                try {
+                    String[] digests;
+                    if (TestUtils.isHmacAlgorithm(algorithm)) {
+                        // The digest from HMAC key algorithm must be specified in the list of
+                        // authorized digests (if the list if provided).
+                        digests = new String[] {algorithm, "weird"};
+                    } else {
+                        digests = new String[] {"weird"};
+                    }
+                    keyGenerator.init(getWorkingSpec().setDigests(digests).build());
+                    fail();
+                } catch (InvalidAlgorithmParameterException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitWithKeyAlgorithmDigestMissingFromAuthorizedDigestFails() {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            if (!TestUtils.isHmacAlgorithm(algorithm)) {
+                continue;
+            }
+            try {
+                KeyGenerator keyGenerator = getKeyGenerator(algorithm);
+
+                // Authorized for digest(s) none of which is the one implied by key algorithm.
+                try {
+                    String digest = TestUtils.getHmacAlgorithmDigest(algorithm);
+                    String anotherDigest = KeyProperties.DIGEST_SHA256.equalsIgnoreCase(digest)
+                            ? KeyProperties.DIGEST_SHA512 : KeyProperties.DIGEST_SHA256;
+                    keyGenerator.init(getWorkingSpec().setDigests(anotherDigest).build());
+                    fail();
+                } catch (InvalidAlgorithmParameterException expected) {}
+
+                // Authorized for empty set of digests
+                try {
+                    keyGenerator.init(getWorkingSpec().setDigests().build());
+                    fail();
+                } catch (InvalidAlgorithmParameterException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitRandomizedEncryptionRequiredButViolatedFails() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyGenerator keyGenerator = getKeyGenerator(algorithm);
+                try {
+                    keyGenerator.init(getWorkingSpec(
+                            KeyProperties.PURPOSE_ENCRYPT)
+                            .setBlockModes(KeyProperties.BLOCK_MODE_ECB)
+                            .build());
+                    fail();
+                } catch (InvalidAlgorithmParameterException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testGenerateHonorsRequestedAuthorizations() throws Exception {
+        Date keyValidityStart = new Date(System.currentTimeMillis() - TestUtils.DAY_IN_MILLIS);
+        Date keyValidityForOriginationEnd =
+                new Date(System.currentTimeMillis() + TestUtils.DAY_IN_MILLIS);
+        Date keyValidityForConsumptionEnd =
+                new Date(System.currentTimeMillis() + 3 * TestUtils.DAY_IN_MILLIS);
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                String[] blockModes =
+                        new String[] {KeyProperties.BLOCK_MODE_GCM, KeyProperties.BLOCK_MODE_CBC};
+                String[] encryptionPaddings =
+                        new String[] {KeyProperties.ENCRYPTION_PADDING_PKCS7,
+                                KeyProperties.ENCRYPTION_PADDING_NONE};
+                String[] digests;
+                int purposes;
+                if (TestUtils.isHmacAlgorithm(algorithm)) {
+                    // HMAC key can only be authorized for one digest, the one implied by the key's
+                    // JCA algorithm name.
+                    digests = new String[] {TestUtils.getHmacAlgorithmDigest(algorithm)};
+                    purposes = KeyProperties.PURPOSE_SIGN;
+                } else {
+                    digests = new String[] {KeyProperties.DIGEST_SHA384, KeyProperties.DIGEST_SHA1};
+                    purposes = KeyProperties.PURPOSE_DECRYPT;
+                }
+                KeyGenerator keyGenerator = getKeyGenerator(algorithm);
+                keyGenerator.init(getWorkingSpec(purposes)
+                        .setBlockModes(blockModes)
+                        .setEncryptionPaddings(encryptionPaddings)
+                        .setDigests(digests)
+                        .setKeyValidityStart(keyValidityStart)
+                        .setKeyValidityForOriginationEnd(keyValidityForOriginationEnd)
+                        .setKeyValidityForConsumptionEnd(keyValidityForConsumptionEnd)
+                        .build());
+                SecretKey key = keyGenerator.generateKey();
+                assertEquals(algorithm, key.getAlgorithm());
+
+                KeyInfo keyInfo = TestUtils.getKeyInfo(key);
+                assertEquals(purposes, keyInfo.getPurposes());
+                TestUtils.assertContentsInAnyOrder(
+                        Arrays.asList(blockModes), keyInfo.getBlockModes());
+                TestUtils.assertContentsInAnyOrder(
+                        Arrays.asList(encryptionPaddings), keyInfo.getEncryptionPaddings());
+                TestUtils.assertContentsInAnyOrder(Arrays.asList(digests), keyInfo.getDigests());
+                MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getSignaturePaddings()));
+                assertEquals(keyValidityStart, keyInfo.getKeyValidityStart());
+                assertEquals(keyValidityForOriginationEnd,
+                        keyInfo.getKeyValidityForOriginationEnd());
+                assertEquals(keyValidityForConsumptionEnd,
+                        keyInfo.getKeyValidityForConsumptionEnd());
+                assertFalse(keyInfo.isUserAuthenticationRequired());
+                assertFalse(keyInfo.isUserAuthenticationRequirementEnforcedBySecureHardware());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    private static KeyGenParameterSpec.Builder getWorkingSpec() {
+        return getWorkingSpec(0);
+    }
+
+    private static KeyGenParameterSpec.Builder getWorkingSpec(int purposes) {
+        return new KeyGenParameterSpec.Builder("test1", purposes);
+    }
+
+    private static KeyGenerator getKeyGenerator(String algorithm) throws NoSuchAlgorithmException,
+            NoSuchProviderException {
+        return KeyGenerator.getInstance(algorithm, EXPECTED_PROVIDER_NAME);
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/KeyInfoTest.java b/tests/tests/keystore/src/android/keystore/cts/KeyInfoTest.java
new file mode 100644
index 0000000..2b1d6fc
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/KeyInfoTest.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2015 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.keystore.cts;
+
+import android.security.keystore.KeyGenParameterSpec;
+import android.security.keystore.KeyInfo;
+import android.security.keystore.KeyProperties;
+
+import junit.framework.TestCase;
+
+import java.security.KeyFactory;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.PrivateKey;
+import java.util.Arrays;
+import java.util.Date;
+
+public class KeyInfoTest extends TestCase {
+
+    public void testImmutabilityViaGetterReturnValues() throws Exception {
+        // Assert that none of the mutable return values from getters modify the state of the
+        // instance.
+
+        Date keyValidityStartDate = new Date(System.currentTimeMillis() - 2222222);
+        Date keyValidityEndDateForOrigination = new Date(System.currentTimeMillis() + 11111111);
+        Date keyValidityEndDateForConsumption = new Date(System.currentTimeMillis() + 33333333);
+
+        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
+        keyPairGenerator.initialize(new KeyGenParameterSpec.Builder(
+                KeyInfoTest.class.getSimpleName(),
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_ENCRYPT)
+                .setKeySize(1024) // use smaller key size to speed the test up
+                .setKeyValidityStart(keyValidityStartDate)
+                .setKeyValidityForOriginationEnd(keyValidityEndDateForOrigination)
+                .setKeyValidityForConsumptionEnd(keyValidityEndDateForConsumption)
+                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1,
+                        KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
+                .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1,
+                        KeyProperties.SIGNATURE_PADDING_RSA_PSS)
+                .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
+                .setBlockModes(KeyProperties.BLOCK_MODE_ECB)
+                .build());
+        KeyPair keyPair = keyPairGenerator.generateKeyPair();
+
+        PrivateKey key = keyPair.getPrivate();
+        KeyFactory keyFactory = KeyFactory.getInstance(key.getAlgorithm(), "AndroidKeyStore");
+        KeyInfo info = keyFactory.getKeySpec(key, KeyInfo.class);
+
+        Date originalKeyValidityStartDate = (Date) info.getKeyValidityStart().clone();
+        info.getKeyValidityStart().setTime(1234567890L);
+        assertEquals(originalKeyValidityStartDate, info.getKeyValidityStart());
+
+        Date originalKeyValidityEndDateForOrigination =
+                (Date) info.getKeyValidityForOriginationEnd().clone();
+        info.getKeyValidityForOriginationEnd().setTime(1234567890L);
+        assertEquals(originalKeyValidityEndDateForOrigination,
+                info.getKeyValidityForOriginationEnd());
+
+        Date originalKeyValidityEndDateForConsumption =
+                (Date) info.getKeyValidityForConsumptionEnd().clone();
+        info.getKeyValidityForConsumptionEnd().setTime(1234567890L);
+        assertEquals(originalKeyValidityEndDateForConsumption,
+                info.getKeyValidityForConsumptionEnd());
+
+        String[] originalEncryptionPaddings = info.getEncryptionPaddings().clone();
+        info.getEncryptionPaddings()[0] = null;
+        assertEquals(Arrays.asList(originalEncryptionPaddings),
+                Arrays.asList(info.getEncryptionPaddings()));
+
+        String[] originalSignaturePaddings = info.getSignaturePaddings().clone();
+        info.getSignaturePaddings()[0] = null;
+        assertEquals(Arrays.asList(originalSignaturePaddings),
+                Arrays.asList(info.getSignaturePaddings()));
+
+        String[] originalDigests = info.getDigests().clone();
+        info.getDigests()[0] = null;
+        assertEquals(Arrays.asList(originalDigests), Arrays.asList(info.getDigests()));
+
+        String[] originalBlockModes = info.getBlockModes().clone();
+        info.getBlockModes()[0] = null;
+        assertEquals(Arrays.asList(originalBlockModes), Arrays.asList(info.getBlockModes()));
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/KeyPairGeneratorTest.java b/tests/tests/keystore/src/android/keystore/cts/KeyPairGeneratorTest.java
new file mode 100644
index 0000000..4c59652
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/KeyPairGeneratorTest.java
@@ -0,0 +1,1513 @@
+/*
+ * Copyright 2013 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.keystore.cts;
+
+import android.security.KeyPairGeneratorSpec;
+import android.security.keystore.KeyGenParameterSpec;
+import android.security.keystore.KeyInfo;
+import android.security.keystore.KeyProperties;
+import android.test.AndroidTestCase;
+import android.test.MoreAsserts;
+
+import java.math.BigInteger;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.KeyStore;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.Principal;
+import java.security.PrivateKey;
+import java.security.Provider;
+import java.security.SecureRandom;
+import java.security.Security;
+import java.security.Provider.Service;
+import java.security.cert.Certificate;
+import java.security.cert.X509Certificate;
+import java.security.interfaces.ECKey;
+import java.security.interfaces.ECPublicKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.ECGenParameterSpec;
+import java.security.spec.ECParameterSpec;
+import java.security.spec.RSAKeyGenParameterSpec;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLServerSocket;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.X509ExtendedKeyManager;
+import javax.security.auth.x500.X500Principal;
+
+import libcore.java.security.TestKeyStore;
+import libcore.javax.net.ssl.TestKeyManager;
+import libcore.javax.net.ssl.TestSSLContext;
+
+public class KeyPairGeneratorTest extends AndroidTestCase {
+    private KeyStore mKeyStore;
+
+    private CountingSecureRandom mRng;
+
+    private static final String TEST_ALIAS_1 = "test1";
+
+    private static final String TEST_ALIAS_2 = "test2";
+
+    private static final String TEST_ALIAS_3 = "test3";
+
+    private static final X500Principal TEST_DN_1 = new X500Principal("CN=test1");
+
+    private static final X500Principal TEST_DN_2 = new X500Principal("CN=test2");
+
+    private static final BigInteger TEST_SERIAL_1 = BigInteger.ONE;
+
+    private static final BigInteger TEST_SERIAL_2 = BigInteger.valueOf(2L);
+
+    private static final long NOW_MILLIS = System.currentTimeMillis();
+
+    /* We have to round this off because X509v3 doesn't store milliseconds. */
+    private static final Date NOW = new Date(NOW_MILLIS - (NOW_MILLIS % 1000L));
+
+    @SuppressWarnings("deprecation")
+    private static final Date NOW_PLUS_10_YEARS = new Date(NOW.getYear() + 10, 0, 1);
+
+    private static final long DAY_IN_MILLIS = 1000 * 60 * 60 * 24;
+
+    private static final X500Principal DEFAULT_CERT_SUBJECT = new X500Principal("CN=fake");
+    private static final BigInteger DEFAULT_CERT_SERIAL_NUMBER = new BigInteger("1");
+    private static final Date DEFAULT_CERT_NOT_BEFORE = new Date(0L); // Jan 1 1970
+    private static final Date DEFAULT_CERT_NOT_AFTER = new Date(2461449600000L); // Jan 1 2048
+
+    private static final String EXPECTED_PROVIDER_NAME = TestUtils.EXPECTED_PROVIDER_NAME;
+
+    private static final String[] EXPECTED_ALGORITHMS = {
+        "EC",
+        "RSA",
+    };
+
+    private static final Map<String, Integer> DEFAULT_KEY_SIZES =
+            new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
+    static {
+        DEFAULT_KEY_SIZES.put("EC", 256);
+        DEFAULT_KEY_SIZES.put("RSA", 2048);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mRng = new CountingSecureRandom();
+        mKeyStore = KeyStore.getInstance("AndroidKeyStore");
+        mKeyStore.load(null, null);
+    }
+
+    public void testAlgorithmList() {
+        // Assert that Android Keystore Provider exposes exactly the expected KeyPairGenerator
+        // algorithms. We don't care whether the algorithms are exposed via aliases, as long as
+        // canonical names of algorithms are accepted. If the Provider exposes extraneous
+        // algorithms, it'll be caught because it'll have to expose at least one Service for such an
+        // algorithm, and this Service's algorithm will not be in the expected set.
+
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        Set<Service> services = provider.getServices();
+        Set<String> actualAlgsLowerCase = new HashSet<String>();
+        Set<String> expectedAlgsLowerCase = new HashSet<String>(
+                Arrays.asList(TestUtils.toLowerCase(EXPECTED_ALGORITHMS)));
+        for (Service service : services) {
+            if ("KeyPairGenerator".equalsIgnoreCase(service.getType())) {
+                String algLowerCase = service.getAlgorithm().toLowerCase(Locale.US);
+                actualAlgsLowerCase.add(algLowerCase);
+            }
+        }
+
+        TestUtils.assertContentsInAnyOrder(actualAlgsLowerCase,
+                expectedAlgsLowerCase.toArray(new String[0]));
+    }
+
+    public void testInitialize_LegacySpec() throws Exception {
+        @SuppressWarnings("deprecation")
+        KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build();
+        getRsaGenerator().initialize(spec);
+        getRsaGenerator().initialize(spec, new SecureRandom());
+
+        getEcGenerator().initialize(spec);
+        getEcGenerator().initialize(spec, new SecureRandom());
+    }
+
+    public void testInitialize_ModernSpec() throws Exception {
+        KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
+                TEST_ALIAS_1,
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
+                .build();
+        getRsaGenerator().initialize(spec);
+        getRsaGenerator().initialize(spec, new SecureRandom());
+
+        getEcGenerator().initialize(spec);
+        getEcGenerator().initialize(spec, new SecureRandom());
+    }
+
+    public void testInitialize_KeySizeOnly() throws Exception {
+        try {
+            getRsaGenerator().initialize(1024);
+            fail("KeyPairGenerator should not support setting the key size");
+        } catch (IllegalArgumentException success) {
+        }
+
+        try {
+            getEcGenerator().initialize(256);
+            fail("KeyPairGenerator should not support setting the key size");
+        } catch (IllegalArgumentException success) {
+        }
+    }
+
+    public void testInitialize_KeySizeAndSecureRandomOnly()
+            throws Exception {
+        try {
+            getRsaGenerator().initialize(1024, new SecureRandom());
+            fail("KeyPairGenerator should not support setting the key size");
+        } catch (IllegalArgumentException success) {
+        }
+
+        try {
+            getEcGenerator().initialize(1024, new SecureRandom());
+            fail("KeyPairGenerator should not support setting the key size");
+        } catch (IllegalArgumentException success) {
+        }
+    }
+
+    public void testDefaultKeySize() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                int expectedSizeBits = DEFAULT_KEY_SIZES.get(algorithm);
+                KeyPairGenerator generator = getGenerator(algorithm);
+                generator.initialize(getWorkingSpec().build());
+                KeyPair keyPair = generator.generateKeyPair();
+                assertEquals(expectedSizeBits,
+                        TestUtils.getKeyInfo(keyPair.getPrivate()).getKeySize());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitWithUnknownBlockModeFails() {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyPairGenerator generator = getGenerator(algorithm);
+                try {
+                    generator.initialize(getWorkingSpec().setBlockModes("weird").build());
+                    fail();
+                } catch (InvalidAlgorithmParameterException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitWithUnknownEncryptionPaddingFails() {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyPairGenerator generator = getGenerator(algorithm);
+                try {
+                    generator.initialize(getWorkingSpec().setEncryptionPaddings("weird").build());
+                    fail();
+                } catch (InvalidAlgorithmParameterException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitWithUnknownSignaturePaddingFails() {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyPairGenerator generator = getGenerator(algorithm);
+                try {
+                    generator.initialize(getWorkingSpec().setSignaturePaddings("weird").build());
+                    fail();
+                } catch (InvalidAlgorithmParameterException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitWithUnknownDigestFails() {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyPairGenerator generator = getGenerator(algorithm);
+                try {
+                    generator.initialize(getWorkingSpec().setDigests("weird").build());
+                    fail();
+                } catch (InvalidAlgorithmParameterException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitRandomizedEncryptionRequiredButViolatedFails() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyPairGenerator generator = getGenerator(algorithm);
+                try {
+                    generator.initialize(getWorkingSpec(
+                            KeyProperties.PURPOSE_ENCRYPT)
+                            .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
+                            .build());
+                    fail();
+                } catch (InvalidAlgorithmParameterException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testGenerateHonorsRequestedAuthorizations() throws Exception {
+        Date keyValidityStart = new Date(System.currentTimeMillis() - TestUtils.DAY_IN_MILLIS);
+        Date keyValidityForOriginationEnd =
+                new Date(System.currentTimeMillis() + TestUtils.DAY_IN_MILLIS);
+        Date keyValidityForConsumptionEnd =
+                new Date(System.currentTimeMillis() + 3 * TestUtils.DAY_IN_MILLIS);
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                String[] blockModes =
+                        new String[] {KeyProperties.BLOCK_MODE_GCM, KeyProperties.BLOCK_MODE_CBC};
+                String[] encryptionPaddings =
+                        new String[] {KeyProperties.ENCRYPTION_PADDING_RSA_OAEP,
+                                KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1};
+                String[] digests =
+                        new String[] {KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA1};
+                int purposes = KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_ENCRYPT;
+                KeyPairGenerator generator = getGenerator(algorithm);
+                generator.initialize(getWorkingSpec(purposes)
+                        .setBlockModes(blockModes)
+                        .setEncryptionPaddings(encryptionPaddings)
+                        .setDigests(digests)
+                        .setKeyValidityStart(keyValidityStart)
+                        .setKeyValidityForOriginationEnd(keyValidityForOriginationEnd)
+                        .setKeyValidityForConsumptionEnd(keyValidityForConsumptionEnd)
+                        .build());
+                KeyPair keyPair = generator.generateKeyPair();
+                assertEquals(algorithm, keyPair.getPrivate().getAlgorithm());
+
+                KeyInfo keyInfo = TestUtils.getKeyInfo(keyPair.getPrivate());
+                assertEquals(purposes, keyInfo.getPurposes());
+                TestUtils.assertContentsInAnyOrder(
+                        Arrays.asList(keyInfo.getBlockModes()), blockModes);
+
+                List<String> actualEncryptionPaddings =
+                        new ArrayList<String>(Arrays.asList(keyInfo.getEncryptionPaddings()));
+                // Keystore may have added ENCRYPTION_PADDING_NONE to allow software OAEP
+                actualEncryptionPaddings.remove(KeyProperties.ENCRYPTION_PADDING_NONE);
+                TestUtils.assertContentsInAnyOrder(
+                        actualEncryptionPaddings, encryptionPaddings);
+
+                List<String> actualDigests =
+                        new ArrayList<String>(Arrays.asList(keyInfo.getDigests()));
+                // Keystore may have added DIGEST_NONE, to allow software digesting.
+                actualDigests.remove(KeyProperties.DIGEST_NONE);
+                TestUtils.assertContentsInAnyOrder(actualDigests, digests);
+
+                MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getSignaturePaddings()));
+                assertEquals(keyValidityStart, keyInfo.getKeyValidityStart());
+                assertEquals(keyValidityForOriginationEnd,
+                        keyInfo.getKeyValidityForOriginationEnd());
+                assertEquals(keyValidityForConsumptionEnd,
+                        keyInfo.getKeyValidityForConsumptionEnd());
+                assertFalse(keyInfo.isUserAuthenticationRequired());
+                assertFalse(keyInfo.isUserAuthenticationRequirementEnforcedBySecureHardware());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    public void testGenerate_EC_LegacySpec() throws Exception {
+        // There are three legacy ways to generate an EC key pair using Android Keystore
+        // KeyPairGenerator:
+        // 1. Use an RSA KeyPairGenerator and specify EC as key type,
+        // 2. Use an EC KeyPairGenerator and specify EC as key type,
+        // 3. Use an EC KeyPairGenerator and leave the key type unspecified.
+        //
+        // We test all three.
+
+        // 1. Use an RSA KeyPairGenerator and specify EC as key type.
+        KeyPairGenerator generator = getRsaGenerator();
+        generator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setKeyType("EC")
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+        KeyPair keyPair = generator.generateKeyPair();
+        assertGeneratedKeyPairAndSelfSignedCertificate(
+                keyPair,
+                TEST_ALIAS_1,
+                "EC",
+                256,
+                TEST_DN_1,
+                TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
+        assertSelfSignedCertificateSignatureVerifies(TEST_ALIAS_1);
+        assertKeyPairAndCertificateUsableForTLSPeerAuthentication(TEST_ALIAS_1);
+        TestUtils.assertECParameterSpecEqualsIgnoreSeedIfNotPresent(
+                ECCurves.NIST_P_256_SPEC, ((ECPublicKey) keyPair.getPublic()).getParams());
+        KeyInfo keyInfo = TestUtils.getKeyInfo(keyPair.getPrivate());
+        assertEquals(256, keyInfo.getKeySize());
+        assertEquals(TEST_ALIAS_1, keyInfo.getKeystoreAlias());
+        assertOneOf(keyInfo.getOrigin(),
+                KeyProperties.ORIGIN_GENERATED, KeyProperties.ORIGIN_UNKNOWN);
+        assertEquals(
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY,
+                keyInfo.getPurposes());
+        assertFalse(keyInfo.isUserAuthenticationRequired());
+        assertEquals(null, keyInfo.getKeyValidityStart());
+        assertEquals(null, keyInfo.getKeyValidityForOriginationEnd());
+        assertEquals(null, keyInfo.getKeyValidityForConsumptionEnd());
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getBlockModes()));
+        MoreAsserts.assertContentsInAnyOrder(Arrays.asList(keyInfo.getDigests()),
+                KeyProperties.DIGEST_NONE,
+                KeyProperties.DIGEST_SHA1,
+                KeyProperties.DIGEST_SHA224,
+                KeyProperties.DIGEST_SHA256,
+                KeyProperties.DIGEST_SHA384,
+                KeyProperties.DIGEST_SHA512);
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getSignaturePaddings()));
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getEncryptionPaddings()));
+
+        // 2. Use an EC KeyPairGenerator and specify EC as key type.
+        generator = getEcGenerator();
+        generator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_2)
+                .setKeyType("EC")
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+        keyPair = generator.generateKeyPair();
+        assertGeneratedKeyPairAndSelfSignedCertificate(
+                keyPair,
+                TEST_ALIAS_2,
+                "EC",
+                256,
+                TEST_DN_1,
+                TEST_SERIAL_1,
+                NOW,
+                NOW_PLUS_10_YEARS);
+        assertSelfSignedCertificateSignatureVerifies(TEST_ALIAS_2);
+        assertKeyPairAndCertificateUsableForTLSPeerAuthentication(TEST_ALIAS_2);
+        TestUtils.assertECParameterSpecEqualsIgnoreSeedIfNotPresent(
+                ECCurves.NIST_P_256_SPEC, ((ECPublicKey) keyPair.getPublic()).getParams());
+        keyInfo = TestUtils.getKeyInfo(keyPair.getPrivate());
+        assertEquals(256, keyInfo.getKeySize());
+        assertEquals(TEST_ALIAS_2, keyInfo.getKeystoreAlias());
+        assertOneOf(keyInfo.getOrigin(),
+                KeyProperties.ORIGIN_GENERATED, KeyProperties.ORIGIN_UNKNOWN);
+        assertEquals(
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY,
+                keyInfo.getPurposes());
+        assertFalse(keyInfo.isUserAuthenticationRequired());
+        assertEquals(null, keyInfo.getKeyValidityStart());
+        assertEquals(null, keyInfo.getKeyValidityForOriginationEnd());
+        assertEquals(null, keyInfo.getKeyValidityForConsumptionEnd());
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getBlockModes()));
+        MoreAsserts.assertContentsInAnyOrder(Arrays.asList(keyInfo.getDigests()),
+                KeyProperties.DIGEST_NONE,
+                KeyProperties.DIGEST_SHA1,
+                KeyProperties.DIGEST_SHA224,
+                KeyProperties.DIGEST_SHA256,
+                KeyProperties.DIGEST_SHA384,
+                KeyProperties.DIGEST_SHA512);
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getSignaturePaddings()));
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getEncryptionPaddings()));
+
+        // 3. Use an EC KeyPairGenerator and leave the key type unspecified.
+        generator = getEcGenerator();
+        generator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_3)
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+        keyPair = generator.generateKeyPair();
+        assertGeneratedKeyPairAndSelfSignedCertificate(
+                keyPair,
+                TEST_ALIAS_3,
+                "EC",
+                256,
+                TEST_DN_1,
+                TEST_SERIAL_1,
+                NOW,
+                NOW_PLUS_10_YEARS);
+        assertSelfSignedCertificateSignatureVerifies(TEST_ALIAS_3);
+        assertKeyPairAndCertificateUsableForTLSPeerAuthentication(TEST_ALIAS_3);
+        TestUtils.assertECParameterSpecEqualsIgnoreSeedIfNotPresent(
+                ECCurves.NIST_P_256_SPEC, ((ECPublicKey) keyPair.getPublic()).getParams());
+        keyInfo = TestUtils.getKeyInfo(keyPair.getPrivate());
+        assertEquals(256, keyInfo.getKeySize());
+        assertEquals(TEST_ALIAS_3, keyInfo.getKeystoreAlias());
+        assertOneOf(keyInfo.getOrigin(),
+                KeyProperties.ORIGIN_GENERATED, KeyProperties.ORIGIN_UNKNOWN);
+        assertEquals(
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY,
+                keyInfo.getPurposes());
+        assertFalse(keyInfo.isUserAuthenticationRequired());
+        assertEquals(null, keyInfo.getKeyValidityStart());
+        assertEquals(null, keyInfo.getKeyValidityForOriginationEnd());
+        assertEquals(null, keyInfo.getKeyValidityForConsumptionEnd());
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getBlockModes()));
+        MoreAsserts.assertContentsInAnyOrder(Arrays.asList(keyInfo.getDigests()),
+                KeyProperties.DIGEST_NONE,
+                KeyProperties.DIGEST_SHA1,
+                KeyProperties.DIGEST_SHA224,
+                KeyProperties.DIGEST_SHA256,
+                KeyProperties.DIGEST_SHA384,
+                KeyProperties.DIGEST_SHA512);
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getSignaturePaddings()));
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getEncryptionPaddings()));
+    }
+
+    public void testGenerate_RSA_LegacySpec() throws Exception {
+        KeyPairGenerator generator = getRsaGenerator();
+        generator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+        KeyPair keyPair = generator.generateKeyPair();
+        assertGeneratedKeyPairAndSelfSignedCertificate(
+                keyPair,
+                TEST_ALIAS_1,
+                "RSA",
+                2048,
+                TEST_DN_1,
+                TEST_SERIAL_1,
+                NOW,
+                NOW_PLUS_10_YEARS);
+        assertSelfSignedCertificateSignatureVerifies(TEST_ALIAS_1);
+        assertKeyPairAndCertificateUsableForTLSPeerAuthentication(TEST_ALIAS_1);
+        assertEquals(RSAKeyGenParameterSpec.F4,
+                ((RSAPublicKey) keyPair.getPublic()).getPublicExponent());
+        KeyInfo keyInfo = TestUtils.getKeyInfo(keyPair.getPrivate());
+        assertEquals(2048, keyInfo.getKeySize());
+        assertEquals(TEST_ALIAS_1, keyInfo.getKeystoreAlias());
+        assertOneOf(keyInfo.getOrigin(),
+                KeyProperties.ORIGIN_GENERATED, KeyProperties.ORIGIN_UNKNOWN);
+        assertEquals(
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY
+                        | KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT,
+                keyInfo.getPurposes());
+        assertFalse(keyInfo.isUserAuthenticationRequired());
+        assertEquals(null, keyInfo.getKeyValidityStart());
+        assertEquals(null, keyInfo.getKeyValidityForOriginationEnd());
+        assertEquals(null, keyInfo.getKeyValidityForConsumptionEnd());
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getBlockModes()));
+        MoreAsserts.assertContentsInAnyOrder(Arrays.asList(keyInfo.getDigests()),
+                KeyProperties.DIGEST_NONE,
+                KeyProperties.DIGEST_MD5,
+                KeyProperties.DIGEST_SHA1,
+                KeyProperties.DIGEST_SHA224,
+                KeyProperties.DIGEST_SHA256,
+                KeyProperties.DIGEST_SHA384,
+                KeyProperties.DIGEST_SHA512);
+        MoreAsserts.assertContentsInAnyOrder(Arrays.asList(keyInfo.getEncryptionPaddings()),
+                KeyProperties.ENCRYPTION_PADDING_NONE,
+                KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1,
+                KeyProperties.ENCRYPTION_PADDING_RSA_OAEP);
+        MoreAsserts.assertContentsInAnyOrder(Arrays.asList(keyInfo.getSignaturePaddings()),
+                KeyProperties.SIGNATURE_PADDING_RSA_PSS,
+                KeyProperties.SIGNATURE_PADDING_RSA_PKCS1);
+    }
+
+    public void testGenerate_ReplacesOldEntryWithSameAlias()
+            throws Exception {
+        // Generate the first key
+        {
+            KeyPairGenerator generator = getRsaGenerator();
+            generator.initialize(new KeyGenParameterSpec.Builder(
+                    TEST_ALIAS_1,
+                    KeyProperties.PURPOSE_SIGN
+                            | KeyProperties.PURPOSE_VERIFY
+                            | KeyProperties.PURPOSE_ENCRYPT
+                            | KeyProperties.PURPOSE_DECRYPT)
+                    .setDigests(KeyProperties.DIGEST_NONE)
+                    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
+                    .setCertificateSubject(TEST_DN_1)
+                    .setCertificateSerialNumber(TEST_SERIAL_1)
+                    .setCertificateNotBefore(NOW)
+                    .setCertificateNotAfter(NOW_PLUS_10_YEARS)
+                    .build());
+            assertGeneratedKeyPairAndSelfSignedCertificate(
+                    generator.generateKeyPair(),
+                    TEST_ALIAS_1,
+                    "RSA",
+                    2048,
+                    TEST_DN_1,
+                    TEST_SERIAL_1,
+                    NOW,
+                    NOW_PLUS_10_YEARS);
+        }
+
+        // Replace the original key
+        {
+            KeyPairGenerator generator = getRsaGenerator();
+            generator.initialize(new KeyGenParameterSpec.Builder(
+                    TEST_ALIAS_1,
+                    KeyProperties.PURPOSE_SIGN
+                            | KeyProperties.PURPOSE_VERIFY
+                            | KeyProperties.PURPOSE_ENCRYPT
+                            | KeyProperties.PURPOSE_DECRYPT)
+                    .setDigests(KeyProperties.DIGEST_NONE)
+                    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
+                    .setCertificateSubject(TEST_DN_2)
+                    .setCertificateSerialNumber(TEST_SERIAL_2)
+                    .setCertificateNotBefore(NOW)
+                    .setCertificateNotAfter(NOW_PLUS_10_YEARS)
+                    .build());
+            assertGeneratedKeyPairAndSelfSignedCertificate(
+                    generator.generateKeyPair(),
+                    TEST_ALIAS_1,
+                    "RSA",
+                    2048,
+                    TEST_DN_2,
+                    TEST_SERIAL_2,
+                    NOW,
+                    NOW_PLUS_10_YEARS);
+        }
+    }
+
+    public void testGenerate_DoesNotReplaceOtherEntries()
+            throws Exception {
+        // Generate the first key
+        KeyPairGenerator generator = getRsaGenerator();
+        generator.initialize(new KeyGenParameterSpec.Builder(
+                TEST_ALIAS_1,
+                KeyProperties.PURPOSE_SIGN
+                        | KeyProperties.PURPOSE_VERIFY
+                        | KeyProperties.PURPOSE_ENCRYPT
+                        | KeyProperties.PURPOSE_DECRYPT)
+                .setDigests(KeyProperties.DIGEST_NONE)
+                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
+                .setCertificateSubject(TEST_DN_1)
+                .setCertificateSerialNumber(TEST_SERIAL_1)
+                .setCertificateNotBefore(NOW)
+                .setCertificateNotAfter(NOW_PLUS_10_YEARS)
+                .build());
+        KeyPair keyPair1 = generator.generateKeyPair();
+        assertGeneratedKeyPairAndSelfSignedCertificate(
+                keyPair1,
+                TEST_ALIAS_1,
+                "RSA",
+                2048,
+                TEST_DN_1,
+                TEST_SERIAL_1,
+                NOW,
+                NOW_PLUS_10_YEARS);
+
+        // Generate the second key
+        generator.initialize(new KeyGenParameterSpec.Builder(
+                TEST_ALIAS_2,
+                KeyProperties.PURPOSE_SIGN
+                        | KeyProperties.PURPOSE_VERIFY
+                        | KeyProperties.PURPOSE_ENCRYPT
+                        | KeyProperties.PURPOSE_DECRYPT)
+                .setDigests(KeyProperties.DIGEST_NONE)
+                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
+                .setCertificateSubject(TEST_DN_2)
+                .setCertificateSerialNumber(TEST_SERIAL_2)
+                .setCertificateNotBefore(NOW)
+                .setCertificateNotAfter(NOW_PLUS_10_YEARS)
+                .build());
+        KeyPair keyPair2 = generator.generateKeyPair();
+        assertGeneratedKeyPairAndSelfSignedCertificate(
+                keyPair2,
+                TEST_ALIAS_2,
+                "RSA",
+                2048,
+                TEST_DN_2,
+                TEST_SERIAL_2,
+                NOW,
+                NOW_PLUS_10_YEARS);
+
+        // Check the first key pair again
+        assertGeneratedKeyPairAndSelfSignedCertificate(
+                keyPair1,
+                TEST_ALIAS_1,
+                "RSA",
+                2048,
+                TEST_DN_1,
+                TEST_SERIAL_1,
+                NOW,
+                NOW_PLUS_10_YEARS);
+    }
+
+    public void testGenerate_EC_ModernSpec_Defaults() throws Exception {
+        KeyPairGenerator generator = getEcGenerator();
+        generator.initialize(new KeyGenParameterSpec.Builder(
+                TEST_ALIAS_1,
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
+                .build());
+        KeyPair keyPair = generator.generateKeyPair();
+        assertGeneratedKeyPairAndSelfSignedCertificate(
+                keyPair,
+                TEST_ALIAS_1,
+                "EC",
+                256,
+                DEFAULT_CERT_SUBJECT,
+                DEFAULT_CERT_SERIAL_NUMBER,
+                DEFAULT_CERT_NOT_BEFORE,
+                DEFAULT_CERT_NOT_AFTER);
+        TestUtils.assertECParameterSpecEqualsIgnoreSeedIfNotPresent(
+                ECCurves.NIST_P_256_SPEC, ((ECKey) keyPair.getPrivate()).getParams());
+        KeyInfo keyInfo = TestUtils.getKeyInfo(keyPair.getPrivate());
+        assertEquals(256, keyInfo.getKeySize());
+        assertEquals(TEST_ALIAS_1, keyInfo.getKeystoreAlias());
+        assertOneOf(keyInfo.getOrigin(),
+                KeyProperties.ORIGIN_GENERATED, KeyProperties.ORIGIN_UNKNOWN);
+        assertEquals(
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY, keyInfo.getPurposes());
+        assertFalse(keyInfo.isUserAuthenticationRequired());
+        assertEquals(null, keyInfo.getKeyValidityStart());
+        assertEquals(null, keyInfo.getKeyValidityForOriginationEnd());
+        assertEquals(null, keyInfo.getKeyValidityForConsumptionEnd());
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getBlockModes()));
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getDigests()));
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getSignaturePaddings()));
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getEncryptionPaddings()));
+    }
+
+    public void testGenerate_RSA_ModernSpec_Defaults() throws Exception {
+        KeyPairGenerator generator = getRsaGenerator();
+        generator.initialize(new KeyGenParameterSpec.Builder(
+                TEST_ALIAS_1,
+                KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
+                .build());
+        KeyPair keyPair = generator.generateKeyPair();
+        assertGeneratedKeyPairAndSelfSignedCertificate(
+                keyPair,
+                TEST_ALIAS_1,
+                "RSA",
+                2048,
+                DEFAULT_CERT_SUBJECT,
+                DEFAULT_CERT_SERIAL_NUMBER,
+                DEFAULT_CERT_NOT_BEFORE,
+                DEFAULT_CERT_NOT_AFTER);
+        assertEquals(RSAKeyGenParameterSpec.F4,
+                ((RSAPublicKey) keyPair.getPublic()).getPublicExponent());
+        KeyInfo keyInfo = TestUtils.getKeyInfo(keyPair.getPrivate());
+        assertEquals(2048, keyInfo.getKeySize());
+        assertEquals(TEST_ALIAS_1, keyInfo.getKeystoreAlias());
+        assertOneOf(keyInfo.getOrigin(),
+                KeyProperties.ORIGIN_GENERATED, KeyProperties.ORIGIN_UNKNOWN);
+        assertEquals(
+                KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT,
+                keyInfo.getPurposes());
+        assertFalse(keyInfo.isUserAuthenticationRequired());
+        assertEquals(null, keyInfo.getKeyValidityStart());
+        assertEquals(null, keyInfo.getKeyValidityForOriginationEnd());
+        assertEquals(null, keyInfo.getKeyValidityForConsumptionEnd());
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getBlockModes()));
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getDigests()));
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getSignaturePaddings()));
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getEncryptionPaddings()));
+    }
+
+    public void testGenerate_EC_ModernSpec_AsCustomAsPossible() throws Exception {
+        KeyPairGenerator generator = getEcGenerator();
+        Date keyValidityStart = new Date(System.currentTimeMillis());
+        Date keyValidityEndDateForOrigination = new Date(System.currentTimeMillis() + 1000000);
+        Date keyValidityEndDateForConsumption = new Date(System.currentTimeMillis() + 10000000);
+
+        Date certNotBefore = new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24 * 7);
+        Date certNotAfter = new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 7);
+        BigInteger certSerialNumber = new BigInteger("12345678");
+        X500Principal certSubject = new X500Principal("cn=hello");
+        generator.initialize(new KeyGenParameterSpec.Builder(
+                TEST_ALIAS_1,
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY
+                        | KeyProperties.PURPOSE_ENCRYPT)
+                .setKeySize(224)
+                .setDigests(KeyProperties.DIGEST_SHA384, KeyProperties.DIGEST_SHA512)
+                .setKeyValidityStart(keyValidityStart)
+                .setKeyValidityForOriginationEnd(keyValidityEndDateForOrigination)
+                .setKeyValidityForConsumptionEnd(keyValidityEndDateForConsumption)
+                .setCertificateSerialNumber(certSerialNumber)
+                .setCertificateSubject(certSubject)
+                .setCertificateNotBefore(certNotBefore)
+                .setCertificateNotAfter(certNotAfter)
+                .build());
+        KeyPair keyPair = generator.generateKeyPair();
+        assertGeneratedKeyPairAndSelfSignedCertificate(
+                keyPair,
+                TEST_ALIAS_1,
+                "EC",
+                224,
+                certSubject,
+                certSerialNumber,
+                certNotBefore,
+                certNotAfter);
+        TestUtils.assertECParameterSpecEqualsIgnoreSeedIfNotPresent(
+                ECCurves.NIST_P_224_SPEC, ((ECKey) keyPair.getPrivate()).getParams());
+        KeyInfo keyInfo = TestUtils.getKeyInfo(keyPair.getPrivate());
+        assertEquals(224, keyInfo.getKeySize());
+        assertEquals(TEST_ALIAS_1, keyInfo.getKeystoreAlias());
+        assertOneOf(keyInfo.getOrigin(),
+                KeyProperties.ORIGIN_GENERATED, KeyProperties.ORIGIN_UNKNOWN);
+        assertEquals(
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY
+                        | KeyProperties.PURPOSE_ENCRYPT,
+                keyInfo.getPurposes());
+        assertEquals(keyValidityStart, keyInfo.getKeyValidityStart());
+        assertEquals(keyValidityEndDateForOrigination, keyInfo.getKeyValidityForOriginationEnd());
+        assertEquals(keyValidityEndDateForConsumption, keyInfo.getKeyValidityForConsumptionEnd());
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getBlockModes()));
+
+        List<String> actualDigests = new ArrayList<String>(Arrays.asList(keyInfo.getDigests()));
+        // Keystore may have added DIGEST_NONE, to allow software digesting.
+        actualDigests.remove(KeyProperties.DIGEST_NONE);
+        TestUtils.assertContentsInAnyOrder(
+                actualDigests, KeyProperties.DIGEST_SHA384, KeyProperties.DIGEST_SHA512);
+
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getSignaturePaddings()));
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getEncryptionPaddings()));
+        assertFalse(keyInfo.isUserAuthenticationRequired());
+        assertEquals(-1, keyInfo.getUserAuthenticationValidityDurationSeconds());
+    }
+
+    public void testGenerate_RSA_ModernSpec_AsCustomAsPossible() throws Exception {
+        KeyPairGenerator generator = getRsaGenerator();
+        Date keyValidityStart = new Date(System.currentTimeMillis());
+        Date keyValidityEndDateForOrigination = new Date(System.currentTimeMillis() + 1000000);
+        Date keyValidityEndDateForConsumption = new Date(System.currentTimeMillis() + 10000000);
+
+        Date certNotBefore = new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24 * 210);
+        Date certNotAfter = new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 210);
+        BigInteger certSerialNumber = new BigInteger("1234567890");
+        X500Principal certSubject = new X500Principal("cn=hello2");
+        generator.initialize(new KeyGenParameterSpec.Builder(
+                TEST_ALIAS_1,
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY
+                        | KeyProperties.PURPOSE_ENCRYPT)
+                .setAlgorithmParameterSpec(
+                        new RSAKeyGenParameterSpec(3072, RSAKeyGenParameterSpec.F0))
+                .setKeySize(3072)
+                .setDigests(KeyProperties.DIGEST_SHA384, KeyProperties.DIGEST_SHA512)
+                .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PSS,
+                        KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
+                .setBlockModes(KeyProperties.BLOCK_MODE_ECB)
+                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP,
+                        KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
+                .setKeyValidityStart(keyValidityStart)
+                .setKeyValidityForOriginationEnd(keyValidityEndDateForOrigination)
+                .setKeyValidityForConsumptionEnd(keyValidityEndDateForConsumption)
+                .setCertificateSerialNumber(certSerialNumber)
+                .setCertificateSubject(certSubject)
+                .setCertificateNotBefore(certNotBefore)
+                .setCertificateNotAfter(certNotAfter)
+                .build());
+        KeyPair keyPair = generator.generateKeyPair();
+        assertGeneratedKeyPairAndSelfSignedCertificate(
+                keyPair,
+                TEST_ALIAS_1,
+                "RSA",
+                3072,
+                certSubject,
+                certSerialNumber,
+                certNotBefore,
+                certNotAfter);
+        assertEquals(RSAKeyGenParameterSpec.F0,
+                ((RSAPublicKey) keyPair.getPublic()).getPublicExponent());
+        KeyInfo keyInfo = TestUtils.getKeyInfo(keyPair.getPrivate());
+        assertEquals(3072, keyInfo.getKeySize());
+        assertEquals(TEST_ALIAS_1, keyInfo.getKeystoreAlias());
+        assertOneOf(keyInfo.getOrigin(),
+                KeyProperties.ORIGIN_GENERATED, KeyProperties.ORIGIN_UNKNOWN);
+        assertEquals(
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY
+                        | KeyProperties.PURPOSE_ENCRYPT,
+                keyInfo.getPurposes());
+        assertEquals(keyValidityStart, keyInfo.getKeyValidityStart());
+        assertEquals(keyValidityEndDateForOrigination, keyInfo.getKeyValidityForOriginationEnd());
+        assertEquals(keyValidityEndDateForConsumption, keyInfo.getKeyValidityForConsumptionEnd());
+
+        List<String> actualDigests =
+	    new ArrayList<String>(Arrays.asList(keyInfo.getDigests()));
+        // Keystore may have added DIGEST_NONE, to allow software digesting.
+        actualDigests.remove(KeyProperties.DIGEST_NONE);
+        TestUtils.assertContentsInAnyOrder(
+                actualDigests, KeyProperties.DIGEST_SHA384, KeyProperties.DIGEST_SHA512);
+
+        TestUtils.assertContentsInAnyOrder(Arrays.asList(keyInfo.getSignaturePaddings()),
+                KeyProperties.SIGNATURE_PADDING_RSA_PKCS1,
+                KeyProperties.SIGNATURE_PADDING_RSA_PSS);
+        MoreAsserts.assertContentsInAnyOrder(Arrays.asList(keyInfo.getBlockModes()),
+                KeyProperties.BLOCK_MODE_ECB);
+
+        List<String> actualEncryptionPaddings =
+                new ArrayList<String>(Arrays.asList(keyInfo.getEncryptionPaddings()));
+        // Keystore may have added ENCRYPTION_PADDING_NONE, to allow software padding.
+        actualEncryptionPaddings.remove(KeyProperties.ENCRYPTION_PADDING_NONE);
+        TestUtils.assertContentsInAnyOrder(actualEncryptionPaddings,
+                KeyProperties.ENCRYPTION_PADDING_RSA_OAEP,
+                KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1);
+
+        assertFalse(keyInfo.isUserAuthenticationRequired());
+        assertEquals(-1, keyInfo.getUserAuthenticationValidityDurationSeconds());
+    }
+
+    public void testGenerate_EC_ModernSpec_UsableForTLSPeerAuth() throws Exception {
+        KeyPairGenerator generator = getEcGenerator();
+        generator.initialize(new KeyGenParameterSpec.Builder(
+                TEST_ALIAS_1,
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
+                .setDigests(KeyProperties.DIGEST_NONE, KeyProperties.DIGEST_SHA384)
+                .build());
+        KeyPair keyPair = generator.generateKeyPair();
+        assertGeneratedKeyPairAndSelfSignedCertificate(
+                keyPair,
+                TEST_ALIAS_1,
+                "EC",
+                256,
+                DEFAULT_CERT_SUBJECT,
+                DEFAULT_CERT_SERIAL_NUMBER,
+                DEFAULT_CERT_NOT_BEFORE,
+                DEFAULT_CERT_NOT_AFTER);
+        KeyInfo keyInfo = TestUtils.getKeyInfo(keyPair.getPrivate());
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getBlockModes()));
+        MoreAsserts.assertContentsInAnyOrder(Arrays.asList(keyInfo.getDigests()),
+                KeyProperties.DIGEST_NONE, KeyProperties.DIGEST_SHA384);
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getSignaturePaddings()));
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getEncryptionPaddings()));
+        assertSelfSignedCertificateSignatureVerifies(TEST_ALIAS_1);
+        assertKeyPairAndCertificateUsableForTLSPeerAuthentication(TEST_ALIAS_1);
+    }
+
+    public void testGenerate_RSA_ModernSpec_UsableForTLSPeerAuth() throws Exception {
+        KeyPairGenerator generator = getRsaGenerator();
+        generator.initialize(new KeyGenParameterSpec.Builder(
+                TEST_ALIAS_1,
+                KeyProperties.PURPOSE_SIGN
+                        | KeyProperties.PURPOSE_VERIFY
+                        | KeyProperties.PURPOSE_DECRYPT)
+                .setDigests(KeyProperties.DIGEST_NONE,
+                        KeyProperties.DIGEST_SHA256,
+                        KeyProperties.DIGEST_SHA512)
+                .setEncryptionPaddings(
+                        KeyProperties.ENCRYPTION_PADDING_NONE,
+                        KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
+                .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
+                .build());
+        KeyPair keyPair = generator.generateKeyPair();
+        assertGeneratedKeyPairAndSelfSignedCertificate(
+                keyPair,
+                TEST_ALIAS_1,
+                "RSA",
+                2048,
+                DEFAULT_CERT_SUBJECT,
+                DEFAULT_CERT_SERIAL_NUMBER,
+                DEFAULT_CERT_NOT_BEFORE,
+                DEFAULT_CERT_NOT_AFTER);
+        KeyInfo keyInfo = TestUtils.getKeyInfo(keyPair.getPrivate());
+        MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getBlockModes()));
+        MoreAsserts.assertContentsInAnyOrder(Arrays.asList(keyInfo.getDigests()),
+                KeyProperties.DIGEST_NONE,
+                KeyProperties.DIGEST_SHA256,
+                KeyProperties.DIGEST_SHA512);
+        MoreAsserts.assertContentsInAnyOrder(Arrays.asList(keyInfo.getSignaturePaddings()),
+                KeyProperties.SIGNATURE_PADDING_RSA_PKCS1);
+        MoreAsserts.assertContentsInAnyOrder(Arrays.asList(keyInfo.getEncryptionPaddings()),
+                KeyProperties.ENCRYPTION_PADDING_NONE,
+                KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1);
+        assertSelfSignedCertificateSignatureVerifies(TEST_ALIAS_1);
+        assertKeyPairAndCertificateUsableForTLSPeerAuthentication(TEST_ALIAS_1);
+    }
+
+    // TODO: Test fingerprint-authorized and secure lock screen-authorized keys. These can't
+    // currently be tested here because CTS does not require that secure lock screen is set up and
+    // that at least one fingerprint is enrolled.
+
+    public void testGenerate_EC_ModernSpec_KeyNotYetValid() throws Exception {
+        KeyPairGenerator generator = getEcGenerator();
+        Date validityStart = new Date(System.currentTimeMillis() + DAY_IN_MILLIS);
+        generator.initialize(new KeyGenParameterSpec.Builder(
+                TEST_ALIAS_1,
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
+                .setKeySize(256)
+                .setDigests(KeyProperties.DIGEST_SHA256)
+                .setKeyValidityStart(validityStart)
+                .build());
+        KeyPair keyPair = generator.generateKeyPair();
+        assertGeneratedKeyPairAndSelfSignedCertificate(
+                keyPair,
+                TEST_ALIAS_1,
+                "EC",
+                256,
+                DEFAULT_CERT_SUBJECT,
+                DEFAULT_CERT_SERIAL_NUMBER,
+                DEFAULT_CERT_NOT_BEFORE,
+                DEFAULT_CERT_NOT_AFTER);
+        KeyInfo keyInfo = TestUtils.getKeyInfo(keyPair.getPrivate());
+        assertEquals(validityStart, keyInfo.getKeyValidityStart());
+    }
+
+    public void testGenerate_RSA_ModernSpec_KeyExpiredForOrigination() throws Exception {
+        KeyPairGenerator generator = getRsaGenerator();
+        Date originationEnd = new Date(System.currentTimeMillis() - DAY_IN_MILLIS);
+        generator.initialize(new KeyGenParameterSpec.Builder(
+                TEST_ALIAS_1,
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
+                .setKeySize(1024)
+                .setDigests(KeyProperties.DIGEST_SHA256)
+                .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
+                .setKeyValidityForOriginationEnd(originationEnd)
+                .build());
+        KeyPair keyPair = generator.generateKeyPair();
+        assertGeneratedKeyPairAndSelfSignedCertificate(
+                keyPair,
+                TEST_ALIAS_1,
+                "RSA",
+                1024,
+                DEFAULT_CERT_SUBJECT,
+                DEFAULT_CERT_SERIAL_NUMBER,
+                DEFAULT_CERT_NOT_BEFORE,
+                DEFAULT_CERT_NOT_AFTER);
+        KeyInfo keyInfo = TestUtils.getKeyInfo(keyPair.getPrivate());
+        assertEquals(originationEnd, keyInfo.getKeyValidityForOriginationEnd());
+    }
+
+    public void testGenerate_EC_ModernSpec_SupportedSizes() throws Exception {
+        assertKeyGenUsingECSizeOnlyUsesCorrectCurve(224, ECCurves.NIST_P_224_SPEC);
+        assertKeyGenUsingECSizeOnlyUsesCorrectCurve(256, ECCurves.NIST_P_256_SPEC);
+        assertKeyGenUsingECSizeOnlyUsesCorrectCurve(384, ECCurves.NIST_P_384_SPEC);
+        assertKeyGenUsingECSizeOnlyUsesCorrectCurve(521, ECCurves.NIST_P_521_SPEC);
+    }
+
+    public void testGenerate_EC_ModernSpec_UnsupportedSizesRejected() throws Exception {
+        for (int keySizeBits = 0; keySizeBits <= 1024; keySizeBits++) {
+            if ((keySizeBits == 224) || (keySizeBits == 256) || (keySizeBits == 384)
+                    || (keySizeBits == 521)) {
+                // Skip supported sizes
+                continue;
+            }
+            KeyPairGenerator generator = getEcGenerator();
+
+            try {
+                generator.initialize(new KeyGenParameterSpec.Builder(
+                        TEST_ALIAS_1,
+                        KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
+                        .setKeySize(keySizeBits)
+                        .build());
+                fail("EC KeyPairGenerator initialized with unsupported key size: "
+                        + keySizeBits + " bits");
+            } catch (InvalidAlgorithmParameterException expected) {
+            }
+        }
+    }
+
+    public void testGenerate_EC_ModernSpec_SupportedNamedCurves() throws Exception {
+        assertKeyGenUsingECNamedCurveSupported("P-224", ECCurves.NIST_P_224_SPEC);
+        assertKeyGenUsingECNamedCurveSupported("p-224", ECCurves.NIST_P_224_SPEC);
+        assertKeyGenUsingECNamedCurveSupported("secp224r1", ECCurves.NIST_P_224_SPEC);
+        assertKeyGenUsingECNamedCurveSupported("SECP224R1", ECCurves.NIST_P_224_SPEC);
+
+        assertKeyGenUsingECNamedCurveSupported("P-256", ECCurves.NIST_P_256_SPEC);
+        assertKeyGenUsingECNamedCurveSupported("p-256", ECCurves.NIST_P_256_SPEC);
+        assertKeyGenUsingECNamedCurveSupported("secp256r1", ECCurves.NIST_P_256_SPEC);
+        assertKeyGenUsingECNamedCurveSupported("SECP256R1", ECCurves.NIST_P_256_SPEC);
+        assertKeyGenUsingECNamedCurveSupported("prime256v1", ECCurves.NIST_P_256_SPEC);
+        assertKeyGenUsingECNamedCurveSupported("PRIME256V1", ECCurves.NIST_P_256_SPEC);
+
+        assertKeyGenUsingECNamedCurveSupported("P-384", ECCurves.NIST_P_384_SPEC);
+        assertKeyGenUsingECNamedCurveSupported("p-384", ECCurves.NIST_P_384_SPEC);
+        assertKeyGenUsingECNamedCurveSupported("secp384r1", ECCurves.NIST_P_384_SPEC);
+        assertKeyGenUsingECNamedCurveSupported("SECP384R1", ECCurves.NIST_P_384_SPEC);
+
+        assertKeyGenUsingECNamedCurveSupported("P-521", ECCurves.NIST_P_521_SPEC);
+        assertKeyGenUsingECNamedCurveSupported("p-521", ECCurves.NIST_P_521_SPEC);
+        assertKeyGenUsingECNamedCurveSupported("secp521r1", ECCurves.NIST_P_521_SPEC);
+        assertKeyGenUsingECNamedCurveSupported("SECP521R1", ECCurves.NIST_P_521_SPEC);
+    }
+
+    public void testGenerate_RSA_ModernSpec_SupportedSizes() throws Exception {
+        assertKeyGenUsingRSASizeOnlySupported(512);
+        assertKeyGenUsingRSASizeOnlySupported(768);
+        assertKeyGenUsingRSASizeOnlySupported(1024);
+        assertKeyGenUsingRSASizeOnlySupported(2048);
+        assertKeyGenUsingRSASizeOnlySupported(3072);
+        assertKeyGenUsingRSASizeOnlySupported(4096);
+
+        // The above use F4. Check that F0 is supported as well, just in case somebody is crazy
+        // enough.
+        assertKeyGenUsingRSAKeyGenParameterSpecSupported(new RSAKeyGenParameterSpec(
+                2048, RSAKeyGenParameterSpec.F0));
+    }
+
+    public void testGenerate_RSA_IndCpaEnforced() throws Exception {
+        KeyGenParameterSpec.Builder goodBuilder = new KeyGenParameterSpec.Builder(
+                TEST_ALIAS_1, KeyProperties.PURPOSE_ENCRYPT)
+                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP,
+                        KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1);
+        assertKeyGenInitSucceeds("RSA", goodBuilder.build());
+
+        // Should be fine because IND-CPA restriction applies only to encryption keys
+        assertKeyGenInitSucceeds("RSA",
+                TestUtils.buildUpon(goodBuilder, KeyProperties.PURPOSE_DECRYPT)
+                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
+                        .build());
+
+        assertKeyGenInitThrowsInvalidAlgorithmParameterException("RSA",
+                TestUtils.buildUpon(goodBuilder)
+                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
+                        .build());
+
+        assertKeyGenInitSucceeds("RSA",
+                TestUtils.buildUpon(goodBuilder)
+                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
+                        .setRandomizedEncryptionRequired(false)
+                        .build());
+
+        // Should fail because PKCS#7 padding doesn't work with RSA
+        assertKeyGenInitThrowsInvalidAlgorithmParameterException("RSA",
+                TestUtils.buildUpon(goodBuilder)
+                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
+                        .build());
+    }
+
+    public void testGenerate_EC_IndCpaEnforced() throws Exception {
+        KeyGenParameterSpec.Builder goodBuilder = new KeyGenParameterSpec.Builder(
+                TEST_ALIAS_2, KeyProperties.PURPOSE_ENCRYPT);
+        assertKeyGenInitSucceeds("EC", goodBuilder.build());
+
+        // Should be fine because IND-CPA restriction applies only to encryption keys
+        assertKeyGenInitSucceeds("EC",
+                TestUtils.buildUpon(goodBuilder, KeyProperties.PURPOSE_DECRYPT)
+                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
+                        .build());
+
+        assertKeyGenInitThrowsInvalidAlgorithmParameterException("EC",
+                TestUtils.buildUpon(goodBuilder)
+                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
+                        .build());
+
+        assertKeyGenInitSucceeds("EC",
+                TestUtils.buildUpon(goodBuilder)
+                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
+                        .setRandomizedEncryptionRequired(false)
+                        .build());
+    }
+
+    private void assertKeyGenInitSucceeds(String algorithm, AlgorithmParameterSpec params)
+            throws Exception {
+        KeyPairGenerator generator = getGenerator(algorithm);
+        generator.initialize(params);
+    }
+
+    private void assertKeyGenInitThrowsInvalidAlgorithmParameterException(
+            String algorithm, AlgorithmParameterSpec params) throws Exception {
+        KeyPairGenerator generator = getGenerator(algorithm);
+        try {
+            generator.initialize(params);
+            fail();
+        } catch (InvalidAlgorithmParameterException expected) {}
+    }
+
+    private void assertKeyGenUsingECSizeOnlyUsesCorrectCurve(
+            int keySizeBits, ECParameterSpec expectedParams) throws Exception {
+        KeyPairGenerator generator = getEcGenerator();
+        generator.initialize(new KeyGenParameterSpec.Builder(
+                TEST_ALIAS_1,
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
+                .setKeySize(keySizeBits)
+                .build(),
+                mRng);
+        mRng.resetCounters();
+        KeyPair keyPair = generator.generateKeyPair();
+        long consumedEntropyAmountBytes = mRng.getOutputSizeBytes();
+        int expectedKeySize = expectedParams.getCurve().getField().getFieldSize();
+        assertGeneratedKeyPairAndSelfSignedCertificate(
+                keyPair,
+                TEST_ALIAS_1,
+                "EC",
+                expectedKeySize,
+                DEFAULT_CERT_SUBJECT,
+                DEFAULT_CERT_SERIAL_NUMBER,
+                DEFAULT_CERT_NOT_BEFORE,
+                DEFAULT_CERT_NOT_AFTER);
+        KeyInfo keyInfo = TestUtils.getKeyInfo(keyPair.getPrivate());
+        assertEquals(expectedKeySize, keyInfo.getKeySize());
+        TestUtils.assertECParameterSpecEqualsIgnoreSeedIfNotPresent(
+                expectedParams,
+                ((ECKey) keyPair.getPublic()).getParams());
+        assertEquals(((keySizeBits + 7) / 8) * 8, consumedEntropyAmountBytes * 8);
+    }
+
+    private void assertKeyGenUsingECNamedCurveSupported(
+            String curveName, ECParameterSpec expectedParams) throws Exception {
+        KeyPairGenerator generator = getEcGenerator();
+        generator.initialize(new KeyGenParameterSpec.Builder(
+                TEST_ALIAS_1,
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
+                .setAlgorithmParameterSpec(new ECGenParameterSpec(curveName))
+                .build(),
+                mRng);
+        mRng.resetCounters();
+        KeyPair keyPair = generator.generateKeyPair();
+        long consumedEntropyAmountBytes = mRng.getOutputSizeBytes();
+        int expectedKeySize = expectedParams.getCurve().getField().getFieldSize();
+        assertGeneratedKeyPairAndSelfSignedCertificate(
+                keyPair,
+                TEST_ALIAS_1,
+                "EC",
+                expectedKeySize,
+                DEFAULT_CERT_SUBJECT,
+                DEFAULT_CERT_SERIAL_NUMBER,
+                DEFAULT_CERT_NOT_BEFORE,
+                DEFAULT_CERT_NOT_AFTER);
+        KeyInfo keyInfo = TestUtils.getKeyInfo(keyPair.getPrivate());
+        assertEquals(expectedKeySize, keyInfo.getKeySize());
+        TestUtils.assertECParameterSpecEqualsIgnoreSeedIfNotPresent(
+                expectedParams,
+                ((ECKey) keyPair.getPublic()).getParams());
+        assertEquals(((expectedKeySize + 7) / 8) * 8, consumedEntropyAmountBytes * 8);
+    }
+
+    private void assertKeyGenUsingRSASizeOnlySupported(int keySizeBits) throws Exception {
+        KeyPairGenerator generator = getRsaGenerator();
+        generator.initialize(new KeyGenParameterSpec.Builder(
+                TEST_ALIAS_1,
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
+                .setKeySize(keySizeBits)
+                .build(),
+                mRng);
+        mRng.resetCounters();
+        KeyPair keyPair = generator.generateKeyPair();
+        long consumedEntropyAmountBytes = mRng.getOutputSizeBytes();
+        assertGeneratedKeyPairAndSelfSignedCertificate(
+                keyPair,
+                TEST_ALIAS_1,
+                "RSA",
+                keySizeBits,
+                DEFAULT_CERT_SUBJECT,
+                DEFAULT_CERT_SERIAL_NUMBER,
+                DEFAULT_CERT_NOT_BEFORE,
+                DEFAULT_CERT_NOT_AFTER);
+        KeyInfo keyInfo = TestUtils.getKeyInfo(keyPair.getPrivate());
+        assertEquals(keySizeBits, keyInfo.getKeySize());
+        assertEquals(((keySizeBits + 7) / 8) * 8, consumedEntropyAmountBytes * 8);
+    }
+
+    private void assertKeyGenUsingRSAKeyGenParameterSpecSupported(
+            RSAKeyGenParameterSpec spec) throws Exception {
+        KeyPairGenerator generator = getRsaGenerator();
+        generator.initialize(new KeyGenParameterSpec.Builder(
+                TEST_ALIAS_1,
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
+                .setAlgorithmParameterSpec(spec)
+                .build(),
+                mRng);
+        mRng.resetCounters();
+        KeyPair keyPair = generator.generateKeyPair();
+        long consumedEntropyAmountBytes = mRng.getOutputSizeBytes();
+        assertGeneratedKeyPairAndSelfSignedCertificate(
+                keyPair,
+                TEST_ALIAS_1,
+                "RSA",
+                spec.getKeysize(),
+                DEFAULT_CERT_SUBJECT,
+                DEFAULT_CERT_SERIAL_NUMBER,
+                DEFAULT_CERT_NOT_BEFORE,
+                DEFAULT_CERT_NOT_AFTER);
+        assertEquals(spec.getPublicExponent(),
+                ((RSAPublicKey) keyPair.getPublic()).getPublicExponent());
+        KeyInfo keyInfo = TestUtils.getKeyInfo(keyPair.getPrivate());
+        assertEquals(spec.getKeysize(), keyInfo.getKeySize());
+        assertEquals(((spec.getKeysize() + 7) / 8) * 8, consumedEntropyAmountBytes * 8);
+    }
+
+    private static void assertSelfSignedCertificateSignatureVerifies(Certificate certificate) {
+        try {
+            certificate.verify(certificate.getPublicKey());
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to verify self-signed certificate signature", e);
+        }
+    }
+
+    private void assertGeneratedKeyPairAndSelfSignedCertificate(
+            KeyPair keyPair, String alias,
+            String expectedKeyAlgorithm,
+            int expectedKeySize,
+            X500Principal expectedCertSubject,
+            BigInteger expectedCertSerialNumber,
+            Date expectedCertNotBefore,
+            Date expectedCertNotAfter)
+            throws Exception {
+        assertNotNull(keyPair);
+        TestUtils.assertKeyPairSelfConsistent(keyPair);
+        TestUtils.assertKeySize(expectedKeySize, keyPair);
+        assertEquals(expectedKeyAlgorithm, keyPair.getPublic().getAlgorithm());
+        TestUtils.assertKeyStoreKeyPair(mKeyStore, alias, keyPair);
+
+        X509Certificate cert = (X509Certificate) mKeyStore.getCertificate(alias);
+        assertEquals(keyPair.getPublic(), cert.getPublicKey());
+        assertX509CertificateParameters(cert,
+                expectedCertSubject,
+                expectedCertSerialNumber,
+                expectedCertNotBefore,
+                expectedCertNotAfter);
+        // Assert that the certificate chain consists only of the above certificate
+        MoreAsserts.assertContentsInOrder(
+                Arrays.asList(mKeyStore.getCertificateChain(alias)), cert);
+    }
+
+    private void assertSelfSignedCertificateSignatureVerifies(String alias) throws Exception {
+        assertSelfSignedCertificateSignatureVerifies(mKeyStore.getCertificate(alias));
+    }
+
+    private void assertKeyPairAndCertificateUsableForTLSPeerAuthentication(String alias)
+            throws Exception {
+        assertUsableForTLSPeerAuthentication(
+                (PrivateKey) mKeyStore.getKey(alias, null),
+                mKeyStore.getCertificateChain(alias));
+    }
+
+    private static void assertX509CertificateParameters(
+            X509Certificate actualCert,
+            X500Principal expectedSubject, BigInteger expectedSerialNumber,
+            Date expectedNotBefore, Date expectedNotAfter) {
+        assertEquals(expectedSubject, actualCert.getSubjectDN());
+        assertEquals(expectedSubject, actualCert.getIssuerDN());
+        assertEquals(expectedSerialNumber, actualCert.getSerialNumber());
+        assertDateEquals(expectedNotBefore, actualCert.getNotBefore());
+        assertDateEquals(expectedNotAfter, actualCert.getNotAfter());
+    }
+
+    private static void assertUsableForTLSPeerAuthentication(
+            PrivateKey privateKey,
+            Certificate[] certificateChain) throws Exception {
+        // Set up both client and server to use the same private key + cert, and to trust that cert
+        // when it's presented by peer. This exercises the use of the private key both in client
+        // and server scenarios.
+        X509Certificate[] x509CertificateChain = new X509Certificate[certificateChain.length];
+        for (int i = 0; i < certificateChain.length; i++) {
+            x509CertificateChain[i] = (X509Certificate) certificateChain[i];
+        }
+        TestKeyStore serverKeyStore = TestKeyStore.getServer();
+        // Make the peer trust the root certificate in the chain. As opposed to making the peer
+        // trust the leaf certificate, this will ensure that the whole chain verifies.
+        serverKeyStore.keyStore.setCertificateEntry(
+                "trusted", certificateChain[certificateChain.length - 1]);
+        SSLContext serverContext = TestSSLContext.createSSLContext("TLS",
+                new KeyManager[] {
+                    TestKeyManager.wrap(new MyKeyManager(privateKey, x509CertificateChain))
+                },
+                TestKeyStore.createTrustManagers(serverKeyStore.keyStore));
+        SSLContext clientContext = serverContext;
+
+        if ("EC".equalsIgnoreCase(privateKey.getAlgorithm())) {
+            // As opposed to RSA (see below) EC keys are used in the same way in all cipher suites.
+            // Assert that the key works with the default list of cipher suites.
+            assertSSLConnectionWithClientAuth(
+                    clientContext, serverContext, null, x509CertificateChain, x509CertificateChain);
+        } else if ("RSA".equalsIgnoreCase(privateKey.getAlgorithm())) {
+            // RSA keys are used differently between Forward Secure and non-Forward Secure cipher
+            // suites. For example, RSA key exchange requires the server to decrypt using its RSA
+            // private key, whereas ECDHE_RSA key exchange requires the server to sign usnig its
+            // RSA private key. We thus assert that the key works with Forward Secure cipher suites
+            // and that it works with non-Forward Secure cipher suites.
+            List<String> fsCipherSuites = new ArrayList<String>();
+            List<String> nonFsCipherSuites = new ArrayList<String>();
+            for (String cipherSuite : clientContext.getDefaultSSLParameters().getCipherSuites()) {
+                if (cipherSuite.contains("_ECDHE_RSA_") || cipherSuite.contains("_DHE_RSA_")) {
+                    fsCipherSuites.add(cipherSuite);
+                } else if (cipherSuite.contains("_RSA_WITH_")) {
+                    nonFsCipherSuites.add(cipherSuite);
+                }
+            }
+            assertFalse("No FS RSA cipher suites enabled by default", fsCipherSuites.isEmpty());
+            assertFalse("No non-FS RSA cipher suites enabled", nonFsCipherSuites.isEmpty());
+
+            // Assert that the key works with RSA Forward Secure cipher suites.
+            assertSSLConnectionWithClientAuth(
+                    clientContext, serverContext, fsCipherSuites.toArray(new String[0]),
+                    x509CertificateChain, x509CertificateChain);
+            // Assert that the key works with RSA non-Forward Secure cipher suites.
+            assertSSLConnectionWithClientAuth(
+                    clientContext, serverContext, nonFsCipherSuites.toArray(new String[0]),
+                    x509CertificateChain, x509CertificateChain);
+        } else {
+            fail("Unsupported key algorithm: " + privateKey.getAlgorithm());
+        }
+    }
+
+    private static void assertSSLConnectionWithClientAuth(
+            SSLContext clientContext, SSLContext serverContext, String[] enabledCipherSuites,
+            X509Certificate[] expectedClientCertChain, X509Certificate[] expectedServerCertChain)
+            throws Exception {
+        SSLServerSocket serverSocket = (SSLServerSocket) serverContext.getServerSocketFactory()
+                .createServerSocket(0);
+        InetAddress host = InetAddress.getLocalHost();
+        int port = serverSocket.getLocalPort();
+        SSLSocket client = (SSLSocket) clientContext.getSocketFactory().createSocket(host, port);
+
+        final SSLSocket server = (SSLSocket) serverSocket.accept();
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        Future<Certificate[]> future = executor.submit(new Callable<Certificate[]>() {
+            @Override
+            public Certificate[] call() throws Exception {
+                server.setNeedClientAuth(true);
+                server.setWantClientAuth(true);
+                server.startHandshake();
+                return server.getSession().getPeerCertificates();
+            }
+        });
+        executor.shutdown();
+        if (enabledCipherSuites != null) {
+            client.setEnabledCipherSuites(enabledCipherSuites);
+        }
+        client.startHandshake();
+        Certificate[] usedServerCerts = client.getSession().getPeerCertificates();
+        Certificate[] usedClientCerts = future.get();
+        client.close();
+        server.close();
+
+        assertNotNull(usedServerCerts);
+        assertEquals(Arrays.asList(expectedServerCertChain), Arrays.asList(usedServerCerts));
+
+        assertNotNull(usedClientCerts);
+        assertEquals(Arrays.asList(expectedClientCertChain), Arrays.asList(usedClientCerts));
+    }
+
+    private static class MyKeyManager extends X509ExtendedKeyManager {
+        private final PrivateKey key;
+        private final X509Certificate[] chain;
+
+        public MyKeyManager(PrivateKey key, X509Certificate[] certChain) {
+            this.key = key;
+            this.chain = certChain;
+        }
+
+        @Override
+        public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) {
+            return "fake";
+        }
+
+        @Override
+        public String chooseServerAlias(String keyType, Principal[] issuers, Socket socket) {
+            return "fake";
+        }
+
+        @Override
+        public X509Certificate[] getCertificateChain(String alias) {
+            return chain;
+        }
+
+        @Override
+        public String[] getClientAliases(String keyType, Principal[] issuers) {
+            return new String[] { "fake" };
+        }
+
+        @Override
+        public String[] getServerAliases(String keyType, Principal[] issuers) {
+            return new String[] { "fake" };
+        }
+
+        @Override
+        public PrivateKey getPrivateKey(String alias) {
+            return key;
+        }
+    }
+
+
+    private static void assertDateEquals(Date date1, Date date2) {
+        assertDateEquals(null, date1, date2);
+    }
+
+    private static void assertDateEquals(String message, Date date1, Date date2) {
+        SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss");
+
+        String result1 = formatter.format(date1);
+        String result2 = formatter.format(date2);
+
+        assertEquals(message, result1, result2);
+    }
+
+    private KeyPairGenerator getRsaGenerator()
+            throws NoSuchAlgorithmException, NoSuchProviderException {
+        return getGenerator("RSA");
+    }
+
+    private KeyPairGenerator getEcGenerator()
+            throws NoSuchAlgorithmException, NoSuchProviderException {
+        return getGenerator("EC");
+    }
+
+    private KeyPairGenerator getGenerator(String algorithm)
+            throws NoSuchAlgorithmException, NoSuchProviderException {
+        return KeyPairGenerator.getInstance(algorithm, "AndroidKeyStore");
+    }
+
+    private static void assertOneOf(int actual, int... expected) {
+        assertOneOf(null, actual, expected);
+    }
+
+    private static void assertOneOf(String message, int actual, int... expected) {
+        for (int expectedValue : expected) {
+            if (actual == expectedValue) {
+                return;
+            }
+        }
+        fail(((message != null) ? message + ". " : "")
+                + "Expected one of " + Arrays.asList(expected)
+                + ", actual: <" + actual + ">");
+    }
+
+    private KeyGenParameterSpec.Builder getWorkingSpec() {
+        return getWorkingSpec(0);
+    }
+
+    private KeyGenParameterSpec.Builder getWorkingSpec(int purposes) {
+        return new KeyGenParameterSpec.Builder(TEST_ALIAS_1, purposes);
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/KeyProtectionTest.java b/tests/tests/keystore/src/android/keystore/cts/KeyProtectionTest.java
new file mode 100644
index 0000000..ee24eed
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/KeyProtectionTest.java
@@ -0,0 +1,255 @@
+/*
+ * Copyright 2015 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.keystore.cts;
+
+import android.security.keystore.KeyProperties;
+import android.security.keystore.KeyProtection;
+import android.test.MoreAsserts;
+
+import junit.framework.TestCase;
+
+import java.util.Arrays;
+import java.util.Date;
+
+public class KeyProtectionTest extends TestCase {
+    public void testDefaults() {
+        // Set only the mandatory parameters and assert values returned by getters.
+
+        KeyProtection spec = new KeyProtection.Builder(KeyProperties.PURPOSE_ENCRYPT)
+                .build();
+
+        assertEquals(KeyProperties.PURPOSE_ENCRYPT, spec.getPurposes());
+        MoreAsserts.assertEmpty(Arrays.asList(spec.getBlockModes()));
+        assertFalse(spec.isDigestsSpecified());
+        try {
+            spec.getDigests();
+            fail();
+        } catch (IllegalStateException expected) {}
+        MoreAsserts.assertEmpty(Arrays.asList(spec.getEncryptionPaddings()));
+        assertNull(spec.getKeyValidityStart());
+        assertNull(spec.getKeyValidityForOriginationEnd());
+        assertNull(spec.getKeyValidityForConsumptionEnd());
+        assertTrue(spec.isRandomizedEncryptionRequired());
+        MoreAsserts.assertEmpty(Arrays.asList(spec.getSignaturePaddings()));
+        assertFalse(spec.isUserAuthenticationRequired());
+        assertEquals(-1, spec.getUserAuthenticationValidityDurationSeconds());
+    }
+
+    public void testSettersReflectedInGetters() {
+        // Set all parameters to non-default values and then assert that getters reflect that.
+
+        Date keyValidityStartDate = new Date(System.currentTimeMillis() - 2222222);
+        Date keyValidityEndDateForOrigination = new Date(System.currentTimeMillis() + 11111111);
+        Date keyValidityEndDateForConsumption = new Date(System.currentTimeMillis() + 33333333);
+
+        KeyProtection spec = new KeyProtection.Builder(
+                KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_VERIFY)
+                .setBlockModes(KeyProperties.BLOCK_MODE_GCM, KeyProperties.BLOCK_MODE_CTR)
+                .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
+                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1,
+                        KeyProperties.ENCRYPTION_PADDING_PKCS7)
+                .setKeyValidityStart(keyValidityStartDate)
+                .setKeyValidityForOriginationEnd(keyValidityEndDateForOrigination)
+                .setKeyValidityForConsumptionEnd(keyValidityEndDateForConsumption)
+                .setRandomizedEncryptionRequired(false)
+                .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1,
+                        KeyProperties.SIGNATURE_PADDING_RSA_PSS)
+                .setUserAuthenticationRequired(true)
+                .setUserAuthenticationValidityDurationSeconds(123456)
+                .build();
+
+        assertEquals(
+                KeyProperties.PURPOSE_DECRYPT| KeyProperties.PURPOSE_VERIFY, spec.getPurposes());
+        MoreAsserts.assertContentsInOrder(Arrays.asList(spec.getBlockModes()),
+                KeyProperties.BLOCK_MODE_GCM, KeyProperties.BLOCK_MODE_CTR);
+        assertTrue(spec.isDigestsSpecified());
+        MoreAsserts.assertContentsInOrder(Arrays.asList(spec.getDigests()),
+                KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512);
+        MoreAsserts.assertContentsInOrder(Arrays.asList(spec.getEncryptionPaddings()),
+                KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1, KeyProperties.ENCRYPTION_PADDING_PKCS7);
+        assertEquals(keyValidityStartDate, spec.getKeyValidityStart());
+        assertEquals(keyValidityEndDateForOrigination, spec.getKeyValidityForOriginationEnd());
+        assertEquals(keyValidityEndDateForConsumption, spec.getKeyValidityForConsumptionEnd());
+        assertFalse(spec.isRandomizedEncryptionRequired());
+        MoreAsserts.assertContentsInOrder(Arrays.asList(spec.getSignaturePaddings()),
+                KeyProperties.SIGNATURE_PADDING_RSA_PKCS1, KeyProperties.SIGNATURE_PADDING_RSA_PSS);
+        assertTrue(spec.isUserAuthenticationRequired());
+        assertEquals(123456, spec.getUserAuthenticationValidityDurationSeconds());
+    }
+
+    public void testSetKeyValidityEndDateAppliesToBothEndDates() {
+        Date date = new Date(System.currentTimeMillis() + 555555);
+        KeyProtection spec = new KeyProtection.Builder(
+                KeyProperties.PURPOSE_SIGN)
+                .setKeyValidityEnd(date)
+                .build();
+        assertEquals(date, spec.getKeyValidityForOriginationEnd());
+        assertEquals(date, spec.getKeyValidityForConsumptionEnd());
+    }
+
+    public void testSetUserAuthenticationValidityDurationSecondsValidityCheck() {
+        KeyProtection.Builder builder = new KeyProtection.Builder(0);
+        try {
+            builder.setUserAuthenticationValidityDurationSeconds(-2);
+            fail();
+        } catch (IllegalArgumentException expected) {}
+
+        try {
+            builder.setUserAuthenticationValidityDurationSeconds(-100);
+            fail();
+        } catch (IllegalArgumentException expected) {}
+
+        try {
+            builder.setUserAuthenticationValidityDurationSeconds(Integer.MIN_VALUE);
+            fail();
+        } catch (IllegalArgumentException expected) {}
+
+        builder.setUserAuthenticationValidityDurationSeconds(-1);
+        builder.setUserAuthenticationValidityDurationSeconds(0);
+        builder.setUserAuthenticationValidityDurationSeconds(1);
+        builder.setUserAuthenticationValidityDurationSeconds(Integer.MAX_VALUE);
+
+        try {
+            builder.setUserAuthenticationValidityDurationSeconds(-2);
+            fail();
+        } catch (IllegalArgumentException expected) {}
+    }
+
+    public void testImmutabilityViaSetterParams() {
+        // Assert that all mutable parameters provided to setters are copied to ensure that values
+        // returned by getters never change.
+        String[] blockModes =
+                new String[] {KeyProperties.BLOCK_MODE_GCM, KeyProperties.BLOCK_MODE_CBC};
+        String[] originalBlockModes = blockModes.clone();
+        Date keyValidityStartDate = new Date(System.currentTimeMillis() - 2222222);
+        Date originalKeyValidityStartDate = new Date(keyValidityStartDate.getTime());
+        Date keyValidityEndDateForOrigination = new Date(System.currentTimeMillis() + 11111111);
+        Date originalKeyValidityEndDateForOrigination =
+                new Date(keyValidityEndDateForOrigination.getTime());
+        Date keyValidityEndDateForConsumption = new Date(System.currentTimeMillis() + 33333333);
+        Date originalKeyValidityEndDateForConsumption =
+                new Date(keyValidityEndDateForConsumption.getTime());
+        String[] digests = new String[] {KeyProperties.DIGEST_MD5, KeyProperties.DIGEST_SHA512};
+        String[] originalDigests = digests.clone();
+        String[] encryptionPaddings = new String[] {
+                KeyProperties.ENCRYPTION_PADDING_RSA_OAEP, KeyProperties.ENCRYPTION_PADDING_PKCS7};
+        String[] originalEncryptionPaddings = encryptionPaddings.clone();
+        String[] signaturePaddings = new String[] {
+                KeyProperties.SIGNATURE_PADDING_RSA_PSS, KeyProperties.SIGNATURE_PADDING_RSA_PKCS1};
+        String[] originalSignaturePaddings = signaturePaddings.clone();
+
+        KeyProtection spec = new KeyProtection.Builder(
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_ENCRYPT)
+                .setBlockModes(blockModes)
+                .setDigests(digests)
+                .setEncryptionPaddings(encryptionPaddings)
+                .setKeyValidityStart(keyValidityStartDate)
+                .setKeyValidityForOriginationEnd(keyValidityEndDateForOrigination)
+                .setKeyValidityForConsumptionEnd(keyValidityEndDateForConsumption)
+                .setSignaturePaddings(signaturePaddings)
+                .build();
+
+        assertEquals(Arrays.asList(originalBlockModes), Arrays.asList(spec.getBlockModes()));
+        blockModes[0] = null;
+        assertEquals(Arrays.asList(originalBlockModes), Arrays.asList(spec.getBlockModes()));
+
+        assertEquals(Arrays.asList(originalDigests), Arrays.asList(spec.getDigests()));
+        digests[1] = null;
+        assertEquals(Arrays.asList(originalDigests), Arrays.asList(spec.getDigests()));
+
+        assertEquals(Arrays.asList(originalEncryptionPaddings),
+                Arrays.asList(spec.getEncryptionPaddings()));
+        encryptionPaddings[0] = null;
+        assertEquals(Arrays.asList(originalEncryptionPaddings),
+                Arrays.asList(spec.getEncryptionPaddings()));
+
+        assertEquals(originalKeyValidityStartDate, spec.getKeyValidityStart());
+        keyValidityStartDate.setTime(1234567890L);
+        assertEquals(originalKeyValidityStartDate, spec.getKeyValidityStart());
+
+        assertEquals(originalKeyValidityEndDateForOrigination,
+                spec.getKeyValidityForOriginationEnd());
+        keyValidityEndDateForOrigination.setTime(1234567890L);
+        assertEquals(originalKeyValidityEndDateForOrigination,
+                spec.getKeyValidityForOriginationEnd());
+
+        assertEquals(originalKeyValidityEndDateForConsumption,
+                spec.getKeyValidityForConsumptionEnd());
+        keyValidityEndDateForConsumption.setTime(1234567890L);
+        assertEquals(originalKeyValidityEndDateForConsumption,
+                spec.getKeyValidityForConsumptionEnd());
+
+        assertEquals(Arrays.asList(originalSignaturePaddings),
+                Arrays.asList(spec.getSignaturePaddings()));
+        signaturePaddings[1] = null;
+        assertEquals(Arrays.asList(originalSignaturePaddings),
+                Arrays.asList(spec.getSignaturePaddings()));
+    }
+
+    public void testImmutabilityViaGetterReturnValues() {
+        // Assert that none of the mutable return values from getters modify the state of the spec.
+
+        KeyProtection spec = new KeyProtection.Builder(
+                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_ENCRYPT)
+                .setBlockModes(KeyProperties.BLOCK_MODE_GCM, KeyProperties.BLOCK_MODE_CBC)
+                .setDigests(KeyProperties.DIGEST_MD5, KeyProperties.DIGEST_SHA512)
+                .setEncryptionPaddings(
+                        KeyProperties.ENCRYPTION_PADDING_RSA_OAEP,
+                        KeyProperties.ENCRYPTION_PADDING_PKCS7)
+                .setKeyValidityStart(new Date(System.currentTimeMillis() - 2222222))
+                .setKeyValidityForOriginationEnd(new Date(System.currentTimeMillis() + 11111111))
+                .setKeyValidityForConsumptionEnd(new Date(System.currentTimeMillis() + 33333333))
+                .setSignaturePaddings(
+                        KeyProperties.SIGNATURE_PADDING_RSA_PSS,
+                        KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
+                .build();
+
+        String[] originalBlockModes = spec.getBlockModes().clone();
+        spec.getBlockModes()[0] = null;
+        assertEquals(Arrays.asList(originalBlockModes), Arrays.asList(spec.getBlockModes()));
+
+        String[] originalDigests = spec.getDigests().clone();
+        spec.getDigests()[0] = null;
+        assertEquals(Arrays.asList(originalDigests), Arrays.asList(spec.getDigests()));
+
+        String[] originalEncryptionPaddings = spec.getEncryptionPaddings().clone();
+        spec.getEncryptionPaddings()[0] = null;
+        assertEquals(Arrays.asList(originalEncryptionPaddings),
+                Arrays.asList(spec.getEncryptionPaddings()));
+
+        Date originalKeyValidityStartDate = (Date) spec.getKeyValidityStart().clone();
+        spec.getKeyValidityStart().setTime(1234567890L);
+        assertEquals(originalKeyValidityStartDate, spec.getKeyValidityStart());
+
+        Date originalKeyValidityEndDateForOrigination =
+                (Date) spec.getKeyValidityForOriginationEnd().clone();
+        spec.getKeyValidityForOriginationEnd().setTime(1234567890L);
+        assertEquals(originalKeyValidityEndDateForOrigination,
+                spec.getKeyValidityForOriginationEnd());
+
+        Date originalKeyValidityEndDateForConsumption =
+                (Date) spec.getKeyValidityForConsumptionEnd().clone();
+        spec.getKeyValidityForConsumptionEnd().setTime(1234567890L);
+        assertEquals(originalKeyValidityEndDateForConsumption,
+                spec.getKeyValidityForConsumptionEnd());
+
+        String[] originalSignaturePaddings = spec.getSignaturePaddings().clone();
+        spec.getSignaturePaddings()[0] = null;
+        assertEquals(Arrays.asList(originalSignaturePaddings),
+                Arrays.asList(spec.getSignaturePaddings()));
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/MacTest.java b/tests/tests/keystore/src/android/keystore/cts/MacTest.java
new file mode 100644
index 0000000..c41dcda
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/MacTest.java
@@ -0,0 +1,605 @@
+/*
+ * Copyright 2015 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.keystore.cts;
+
+import android.security.keystore.KeyProperties;
+import android.security.keystore.KeyProtection;
+
+import junit.framework.TestCase;
+
+import java.security.InvalidKeyException;
+import java.security.Provider;
+import java.security.Provider.Service;
+import java.security.Security;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import javax.crypto.Mac;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+
+/**
+ * Tests for algorithm-agnostic functionality of MAC implementations backed by Android Keystore.
+ */
+public class MacTest extends TestCase {
+
+    private static final String EXPECTED_PROVIDER_NAME = TestUtils.EXPECTED_CRYPTO_OP_PROVIDER_NAME;
+
+    private static final String[] EXPECTED_ALGORITHMS = {
+        "HmacSHA1",
+        "HmacSHA224",
+        "HmacSHA256",
+        "HmacSHA384",
+        "HmacSHA512",
+    };
+
+    private static final byte[] KAT_KEY = HexEncoding.decode(
+            "227b212bebd775493929ef626729a587d3f81b8e18a3ed482d403910e184479b448cfa79b62bd90595efdd"
+            + "15f87bd7b2d2dac480c61e969ba90a7b8ceadd3284");
+
+    private static final byte[] SHORT_MSG_KAT_MESSAGE = HexEncoding.decode("a16037e3c901c9a1ab");
+
+    private static final Map<String, Collection<KatVector>> SHORT_MSG_KAT_MACS =
+            new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
+    static {
+        // From RI
+        SHORT_MSG_KAT_MACS.put("HmacSHA1", Arrays.asList(
+                new KatVector(HexEncoding.decode("4818c5466a1d05bc8f6ad4"),
+                        HexEncoding.decode("aa178e4d174dc90d1ac3d22386c32d1af82396e7")),
+                new KatVector(HexEncoding.decode("8d07f59f63fc493711a2217d8603cbc4d9874c58"),
+                        HexEncoding.decode("002215de36f8836e966ff459af80c4b31fe0ca27")),
+                new KatVector(HexEncoding.decode("f85f1c94023968729e3b4a7f495bf31c283b710662"),
+                        HexEncoding.decode("f518db3015203606ea15145ad16b3d981db32a77"))));
+        SHORT_MSG_KAT_MACS.put("HmacSHA224", Arrays.asList(
+                new KatVector(
+                        HexEncoding.decode(
+                                "ed959815cc03f01e19ce93c1a3318ae87a905b7c27351d571ee858"),
+                        HexEncoding.decode(
+                                "abece4641458461f8b6a46f7daa61fc6119344c5c4bb5e7967da0e3e")),
+                new KatVector(
+                        HexEncoding.decode(
+                                "9150e1ad6a9d12370a2423a5d95e9bc2dd73b4ee9bc96b03c9cc2fba"),
+                        HexEncoding.decode(
+                                "523aa06730d1abe7da2ba94a966cd20db56c771f1899e2850c31158c")),
+                new KatVector(
+                        HexEncoding.decode(
+                                "424d5e7375c2040543f76b97451b1c074ee93b81ad24cef23800ebfe529a74ee2b"
+                                ),
+                        HexEncoding.decode(
+                                "7627a86d829f45e3295a25813219ed5291f80029b972192d32a845c3"))));
+        SHORT_MSG_KAT_MACS.put("HmacSHA256", Arrays.asList(
+                new KatVector(
+                        HexEncoding.decode(
+                                "74a7ec4c79419d76fa5d3bdbedc17e5bebf0ee011c609b9f4c9126091613"),
+                        HexEncoding.decode(
+                                "c17b62519155b0d7f005f465becf9a1610635ae46a2c4d2b255851f201689ba5"
+                                )),
+                new KatVector(
+                        HexEncoding.decode(
+                                "42b44e6a1600bed10ca6c6dc24df2871790f948e73f9457fa4889c340cf69496"),
+                        HexEncoding.decode(
+                                "e9082a5db98c8086ad306ac23a1da9478eb5733757af6b1148d25fa1459290de")
+                                ),
+                new KatVector(
+                        HexEncoding.decode(
+                                "20bfc407c62022fea95f046f8ade6ee4b232665a9e97f75d3e35f1a9447991651a"
+                                        ),
+                        HexEncoding.decode(
+                                "dbf10ca8c362aa665562065e76e42beb19444f61ab0828438714c82779b71a0d"
+                                ))));
+        SHORT_MSG_KAT_MACS.put("HmacSHA384", Arrays.asList(
+                new KatVector(
+                        HexEncoding.decode(
+                                "7d277b2ec95fca68fe6ce0b665b28b48e128762714c66ca2c3405b432f6ab835e3"
+                                ),
+                        HexEncoding.decode(
+                                "bf8555816d8fa058e1d0ed4be23abda522adfae629b6a8819dcc2416d00507782a"
+                                        + "c714fdbfc7a340da4e6cf646a619f1")),
+                new KatVector(
+                        HexEncoding.decode(
+                                "7b30abe948ceab9d94965f274fd2a21c966aa9bdf06476f94a0bcc6c20fd5d2bdc"
+                                        + "e21af7c6fdf6017bce342a701f55c3"),
+                        HexEncoding.decode(
+                                "0fe51798528407119a5884f65ad76409983e978e25ab8f82aa412c08e76c8065d2"
+                                        + "6dfdb1935de49036fb24262a532a29")),
+                new KatVector(
+                        HexEncoding.decode(
+                                "26f232a40ada35850a14edf8f23c9ca97898ac0fa18640e5a7835230fa68f630b1"
+                                        + "c4579bc059c318bb2c5da609db13f1567fa175a6439e1d729713d1fa"
+                                        + "1039a3db"),
+                        HexEncoding.decode(
+                                "a086c610a382c24bb05e8bdd12cffc01055ec98a8f071239360cf8135205ffee33"
+                                        + "2da2134bed2ec3efde8bf145d1d257"))));
+        SHORT_MSG_KAT_MACS.put("HmacSHA512", Arrays.asList(
+                new KatVector(
+                        HexEncoding.decode(
+                                "46fb12ef48d4e8162f0828a66c9f7124de"),
+                        HexEncoding.decode(
+                                "036320b51376f5840b03fdababac53c189d4d6b35f26f562a909f8ecac4a02c244"
+                                        + "bfddc8f4eb89e0d0909fd2d8a46b796175e619cff215a675ce309540"
+                                        + "42b1c9")),
+                new KatVector(
+                        HexEncoding.decode(
+                                "45b3f16b1a247dd76f72ab2d5019f87b94efeb9a2fc01da3ca347050302dbda9c1"
+                                        + "19cf991aaa30b747c808ec6bc19be7b5ae5e66176e38f222347a1659"
+                                        + "15d007"),
+                        HexEncoding.decode(
+                                "92817ce36858ccad20a903e15952565d241ebaa87e07655754470090f1c6b9252a"
+                                        + "cff9b873f36840fa8fdaaf91c6f9de3b82f46de0b1fdfa584eaf27de"
+                                        + "f52c65")),
+                new KatVector(
+                        HexEncoding.decode(
+                                "e91630c69c8c294755e27e5ccf01fe09e06de6c4e423c1c4ef0ac9b67f9af3cc6b"
+                                        + "bc6292d18cf6e76738888a948b49f9509b44eb3af6974ca7e61f5208"
+                                        + "b9f7dca3"),
+                        HexEncoding.decode(
+                                "6ff5616e9c38cef3d20076841c65b8747193eb8033ea61e8693715109e0e448966"
+                                        + "3d8abcb2b7cf0911e461202112819fb8650ba02bdce08aa0d24b3873"
+                                        + "30f18f"))));
+    }
+
+    private static final byte[] LONG_MSG_KAT_SEED = SHORT_MSG_KAT_MESSAGE;
+    private static final int LONG_MSG_KAT_SIZE_BYTES = 3 * 1024 * 1024 + 149;
+
+    private static final Map<String, byte[]> LONG_MSG_KAT_MACS =
+            new TreeMap<String, byte[]>(String.CASE_INSENSITIVE_ORDER);
+    static {
+        // From RI
+        LONG_MSG_KAT_MACS.put("HmacSHA1", HexEncoding.decode(
+                "2a89d12da79f541512db9c35c0a1e76750e01d48"));
+        LONG_MSG_KAT_MACS.put("HmacSHA224", HexEncoding.decode(
+                "5fef55c822f9b931c1b4ad7142e0a74ceaddf03f0a6533155cc06871"));
+        LONG_MSG_KAT_MACS.put("HmacSHA256", HexEncoding.decode(
+                "0bc25f22b8993d003a95a88c6cfa1c5a7b067a8aae1064ef897712418569bfe9"));
+        LONG_MSG_KAT_MACS.put("HmacSHA384", HexEncoding.decode(
+                "595a616295123966126102c06d69f8bb06c11090490186243420c2c4692877d75752b220c1b0447320"
+                + "959e28345523fc"));
+        LONG_MSG_KAT_MACS.put("HmacSHA512", HexEncoding.decode(
+                "aa97d594d799164d56e6652578f7884d1198bb2663641ad7903e3c0bda4c136e9f94ca0d16c3504302"
+                + "2944224e538e88a5410adb38eaa5169b3125738990e6d0"));
+    }
+
+
+    private static final long DAY_IN_MILLIS = TestUtils.DAY_IN_MILLIS;
+
+    public void testAlgorithmList() {
+        // Assert that Android Keystore Provider exposes exactly the expected MAC algorithms. We
+        // don't care whether the algorithms are exposed via aliases, as long as the canonical names
+        // of algorithms are accepted.
+        // If the Provider exposes extraneous algorithms, it'll be caught because it'll have to
+        // expose at least one Service for such an algorithm, and this Service's algorithm will
+        // not be in the expected set.
+
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        Set<Service> services = provider.getServices();
+        Set<String> actualAlgsLowerCase = new HashSet<String>();
+        Set<String> expectedAlgsLowerCase = new HashSet<String>(
+                Arrays.asList(TestUtils.toLowerCase(EXPECTED_ALGORITHMS)));
+        for (Service service : services) {
+            if ("Mac".equalsIgnoreCase(service.getType())) {
+                String algLowerCase = service.getAlgorithm().toLowerCase(Locale.US);
+                actualAlgsLowerCase.add(algLowerCase);
+            }
+        }
+
+        TestUtils.assertContentsInAnyOrder(actualAlgsLowerCase,
+                expectedAlgsLowerCase.toArray(new String[0]));
+    }
+
+    public void testAndroidKeyStoreKeysHandledByAndroidKeyStoreProvider() throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                SecretKey key = importDefaultKatKey(algorithm);
+
+                // Generate a MAC
+                Mac mac = Mac.getInstance(algorithm);
+                mac.init(key);
+                assertSame(provider, mac.getProvider());
+            } catch (Throwable e) {
+                throw new RuntimeException(algorithm + " failed", e);
+            }
+        }
+    }
+
+    public void testMacGeneratedForEmptyMessage() throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                SecretKey key = importDefaultKatKey(algorithm);
+
+                // Generate a MAC
+                Mac mac = Mac.getInstance(algorithm, provider);
+                mac.init(key);
+                byte[] macBytes = mac.doFinal();
+                assertNotNull(macBytes);
+                if (macBytes.length == 0) {
+                    fail("Empty MAC");
+                }
+            } catch (Throwable e) {
+                throw new RuntimeException(algorithm + " failed", e);
+            }
+        }
+    }
+
+    public void testMacGeneratedByAndroidKeyStoreVerifiesByAndroidKeyStore() throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                SecretKey key = importDefaultKatKey(algorithm);
+
+                // Generate a MAC
+                Mac mac = Mac.getInstance(algorithm, provider);
+                mac.init(key);
+                byte[] message = "This is a test".getBytes("UTF-8");
+                byte[] macBytes = mac.doFinal(message);
+
+                assertMacVerifiesOneShot(algorithm, provider, key, message, macBytes);
+            } catch (Throwable e) {
+                throw new RuntimeException(algorithm + " failed", e);
+            }
+        }
+    }
+
+    public void testMacGeneratedByAndroidKeyStoreVerifiesByHighestPriorityProvider()
+            throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                SecretKey key = getDefaultKatKey(algorithm);
+                SecretKey keystoreKey = importDefaultKatKey(algorithm);
+
+                // Generate a MAC
+                Mac mac = Mac.getInstance(algorithm, provider);
+                mac.init(keystoreKey);
+                byte[] message = "This is a test".getBytes("UTF-8");
+                byte[] macBytes = mac.doFinal(message);
+
+                assertMacVerifiesOneShot(algorithm, key, message, macBytes);
+            } catch (Throwable e) {
+                throw new RuntimeException(algorithm + " failed", e);
+            }
+        }
+    }
+
+    public void testMacGeneratedByHighestPriorityProviderVerifiesByAndroidKeyStore()
+            throws Exception {
+        Provider keystoreProvider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(keystoreProvider);
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            Provider signingProvider = null;
+            try {
+                SecretKey key = getDefaultKatKey(algorithm);
+                SecretKey keystoreKey = importDefaultKatKey(algorithm);
+
+                // Generate a MAC
+                Mac mac = Mac.getInstance(algorithm);
+                mac.init(key);
+                signingProvider = mac.getProvider();
+                byte[] message = "This is a test".getBytes("UTF-8");
+                byte[] macBytes = mac.doFinal(message);
+
+                assertMacVerifiesOneShot(
+                        algorithm, keystoreProvider, keystoreKey, message, macBytes);
+            } catch (Throwable e) {
+                throw new RuntimeException(
+                        algorithm + " failed, signing provider: " + signingProvider, e);
+            }
+        }
+    }
+
+    public void testSmallMsgKat() throws Exception {
+        byte[] message = SHORT_MSG_KAT_MESSAGE;
+
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            for (KatVector testVector : SHORT_MSG_KAT_MACS.get(algorithm)) {
+                byte[] keyBytes = testVector.key;
+                try {
+                    SecretKey key = TestUtils.importIntoAndroidKeyStore(
+                            "test",
+                            new SecretKeySpec(keyBytes, algorithm),
+                            getWorkingImportParams(algorithm)).getKeystoreBackedSecretKey();
+
+                    byte[] goodMacBytes = testVector.mac.clone();
+                    assertNotNull(goodMacBytes);
+                    assertMacVerifiesOneShot(algorithm, key, message, goodMacBytes);
+                    assertMacVerifiesFedOneByteAtATime(algorithm, key, message, goodMacBytes);
+                    assertMacVerifiesFedUsingFixedSizeChunks(
+                            algorithm, key, message, goodMacBytes, 3);
+
+                    byte[] messageWithBitFlip = message.clone();
+                    messageWithBitFlip[messageWithBitFlip.length / 2] ^= 1;
+                    assertMacDoesNotVerifyOneShot(algorithm, key, messageWithBitFlip, goodMacBytes);
+
+                    byte[] goodMacWithBitFlip = goodMacBytes.clone();
+                    goodMacWithBitFlip[goodMacWithBitFlip.length / 2] ^= 1;
+                    assertMacDoesNotVerifyOneShot(algorithm, key, message, goodMacWithBitFlip);
+                } catch (Throwable e) {
+                    throw new RuntimeException(
+                            "Failed for " + algorithm + " with key " + HexEncoding.encode(keyBytes),
+                            e);
+                }
+            }
+        }
+    }
+
+    public void testLargeMsgKat() throws Exception {
+        byte[] message = TestUtils.generateLargeKatMsg(LONG_MSG_KAT_SEED, LONG_MSG_KAT_SIZE_BYTES);
+
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                SecretKey key = importDefaultKatKey(algorithm);
+
+                byte[] goodMacBytes = LONG_MSG_KAT_MACS.get(algorithm);
+                assertNotNull(goodMacBytes);
+                assertMacVerifiesOneShot(algorithm,  key, message, goodMacBytes);
+                assertMacVerifiesFedUsingFixedSizeChunks(
+                        algorithm, key, message, goodMacBytes, 20389);
+                assertMacVerifiesFedUsingFixedSizeChunks(
+                        algorithm, key, message, goodMacBytes, 393571);
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitFailsWhenNotAuthorizedToSign() throws Exception {
+        int badPurposes = KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT
+                | KeyProperties.PURPOSE_VERIFY;
+
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyProtection good = getWorkingImportParams(algorithm);
+                assertInitSucceeds(algorithm, good);
+                assertInitThrowsInvalidKeyException(algorithm,
+                        TestUtils.buildUpon(good, badPurposes).build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitFailsWhenDigestNotAuthorized() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyProtection good = getWorkingImportParams(algorithm);
+                assertInitSucceeds(algorithm, good);
+
+                String badKeyAlgorithm = ("HmacSHA256".equalsIgnoreCase(algorithm))
+                        ? "HmacSHA384" : "HmacSHA256";
+                assertInitThrowsInvalidKeyException(algorithm, badKeyAlgorithm, good);
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitFailsWhenKeyNotYetValid() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyProtection good = TestUtils.buildUpon(getWorkingImportParams(algorithm))
+                        .setKeyValidityStart(new Date(System.currentTimeMillis() - DAY_IN_MILLIS))
+                        .build();
+                assertInitSucceeds(algorithm, good);
+
+                Date badStartDate = new Date(System.currentTimeMillis() + DAY_IN_MILLIS);
+                assertInitThrowsInvalidKeyException(algorithm,
+                        TestUtils.buildUpon(good).setKeyValidityStart(badStartDate).build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitFailsWhenKeyNoLongerValidForOrigination() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyProtection good = TestUtils.buildUpon(getWorkingImportParams(algorithm))
+                        .setKeyValidityForOriginationEnd(
+                                new Date(System.currentTimeMillis() + DAY_IN_MILLIS))
+                        .build();
+                assertInitSucceeds(algorithm, good);
+
+                Date badEndDate = new Date(System.currentTimeMillis() - DAY_IN_MILLIS);
+                assertInitThrowsInvalidKeyException(algorithm,
+                        TestUtils.buildUpon(good)
+                                .setKeyValidityForOriginationEnd(badEndDate)
+                                .build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitIgnoresThatKeyNoLongerValidForConsumption() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyProtection good = TestUtils.buildUpon(getWorkingImportParams(algorithm))
+                        .setKeyValidityForConsumptionEnd(
+                                new Date(System.currentTimeMillis() + DAY_IN_MILLIS))
+                        .build();
+                assertInitSucceeds(algorithm, good);
+
+                Date badEndDate = new Date(System.currentTimeMillis() - DAY_IN_MILLIS);
+                assertInitSucceeds(algorithm,
+                        TestUtils.buildUpon(good)
+                                .setKeyValidityForConsumptionEnd(badEndDate)
+                                .build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    private void assertMacVerifiesOneShot(
+            String algorithm,
+            SecretKey key,
+            byte[] message,
+            byte[] mac) throws Exception {
+        assertMacVerifiesOneShot(algorithm, null, key, message, mac);
+    }
+
+    private void assertMacVerifiesOneShot(
+            String algorithm,
+            Provider provider,
+            SecretKey key,
+            byte[] message,
+            byte[] mac) throws Exception {
+        Mac m = (provider != null)
+                ? Mac.getInstance(algorithm, provider) : Mac.getInstance(algorithm);
+        m.init(key);
+        byte[] mac2 = m.doFinal(message);
+        if (!Arrays.equals(mac, mac2)) {
+            fail("MAC did not verify. algorithm: " + algorithm
+                    + ", provider: " + m.getProvider().getName()
+                    + ", MAC (" + mac.length + " bytes): " + HexEncoding.encode(mac)
+                    + ", actual MAC (" + mac2.length + " bytes): " + HexEncoding.encode(mac2));
+        }
+    }
+
+    private void assertMacDoesNotVerifyOneShot(
+            String algorithm,
+            SecretKey key,
+            byte[] message,
+            byte[] mac) throws Exception {
+        Mac m = Mac.getInstance(algorithm);
+        m.init(key);
+        byte[] mac2 = m.doFinal(message);
+        if (Arrays.equals(mac, mac2)) {
+            fail("MAC verifies unexpectedly. algorithm: " + algorithm
+                    + ", provider: " + m.getProvider().getName()
+                    + ", MAC (" + mac.length + " bytes): " + HexEncoding.encode(mac));
+        }
+    }
+
+    private void assertMacVerifiesFedOneByteAtATime(
+            String algorithm,
+            SecretKey key,
+            byte[] message,
+            byte[] mac) throws Exception {
+        Mac m = Mac.getInstance(algorithm);
+        m.init(key);
+        for (int i = 0; i < message.length; i++) {
+            m.update(message[i]);
+        }
+        byte[] mac2 = m.doFinal();
+        if (!Arrays.equals(mac, mac2)) {
+            fail("MAC did not verify. algorithm: " + algorithm
+                    + ", provider: " + m.getProvider().getName()
+                    + ", MAC (" + mac.length + " bytes): " + HexEncoding.encode(mac)
+                    + ", actual MAC (" + mac2.length + " bytes): " + HexEncoding.encode(mac2));
+        }
+    }
+
+    private void assertMacVerifiesFedUsingFixedSizeChunks(
+            String algorithm,
+            SecretKey key,
+            byte[] message,
+            byte[] mac,
+            int chunkSizeBytes) throws Exception {
+        Mac m = Mac.getInstance(algorithm);
+        m.init(key);
+        int messageRemaining = message.length;
+        int messageOffset = 0;
+        while (messageRemaining > 0) {
+            int actualChunkSizeBytes =  Math.min(chunkSizeBytes, messageRemaining);
+            m.update(message, messageOffset, actualChunkSizeBytes);
+            messageOffset += actualChunkSizeBytes;
+            messageRemaining -= actualChunkSizeBytes;
+        }
+        byte[] mac2 = m.doFinal();
+        if (!Arrays.equals(mac, mac2)) {
+            fail("MAC did not verify. algorithm: " + algorithm
+                    + ", provider: " + m.getProvider().getName()
+                    + ", MAC (" + mac.length + " bytes): " + HexEncoding.encode(mac)
+                    + ", actual MAC (" + mac2.length + " bytes): " + HexEncoding.encode(mac2));
+        }
+    }
+
+    private void assertInitSucceeds(String algorithm, KeyProtection keyProtection)
+            throws Exception {
+        assertInitSucceeds(algorithm, algorithm, keyProtection);
+    }
+
+    private void assertInitSucceeds(
+            String macAlgorithm, String keyAlgorithm, KeyProtection keyProtection)
+                    throws Exception {
+        SecretKey key = importDefaultKatKey(keyAlgorithm, keyProtection);
+        Mac mac = Mac.getInstance(macAlgorithm);
+        mac.init(key);
+    }
+
+    private void assertInitThrowsInvalidKeyException(String algorithm, KeyProtection keyProtection)
+                    throws Exception {
+        assertInitThrowsInvalidKeyException(algorithm, algorithm, keyProtection);
+    }
+
+    private void assertInitThrowsInvalidKeyException(
+            String macAlgorithm, String keyAlgorithm, KeyProtection keyProtection)
+                    throws Exception {
+        SecretKey key = importDefaultKatKey(keyAlgorithm, keyProtection);
+        Mac mac = Mac.getInstance(macAlgorithm);
+        try {
+            mac.init(key);
+            fail("InvalidKeyException should have been thrown. MAC algorithm: " + macAlgorithm
+                    + ", key algorithm: " + keyAlgorithm);
+        } catch (InvalidKeyException expected) {}
+    }
+
+    private SecretKey getDefaultKatKey(String keyAlgorithm) {
+        return new SecretKeySpec(KAT_KEY, keyAlgorithm);
+    }
+
+    private SecretKey importDefaultKatKey(String keyAlgorithm) throws Exception {
+        return importDefaultKatKey(
+                keyAlgorithm,
+                new KeyProtection.Builder(KeyProperties.PURPOSE_SIGN).build());
+    }
+
+    private SecretKey importDefaultKatKey(
+            String keyAlgorithm, KeyProtection keyProtection) throws Exception {
+        return TestUtils.importIntoAndroidKeyStore(
+                "test1",
+                getDefaultKatKey(keyAlgorithm),
+                keyProtection).getKeystoreBackedSecretKey();
+    }
+
+    private static KeyProtection getWorkingImportParams(
+            @SuppressWarnings("unused") String algorithm) {
+        return new KeyProtection.Builder(KeyProperties.PURPOSE_SIGN).build();
+    }
+
+    private static class KatVector {
+        public byte[] key;
+        public byte[] mac;
+
+        public KatVector(byte[] key, byte[] mac) {
+            this.key = key;
+            this.mac = mac;
+        }
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/PutOverflowTest.java b/tests/tests/keystore/src/android/keystore/cts/PutOverflowTest.java
new file mode 100644
index 0000000..088af35
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/PutOverflowTest.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+import android.test.AndroidTestCase;
+import java.lang.reflect.Method;
+
+public class PutOverflowTest extends AndroidTestCase {
+    public void testCrash() throws Exception {
+        try {
+            Class<?> keystoreClass = Class.forName("android.security.KeyStore");
+            Method getInstance = keystoreClass.getMethod("getInstance");
+            Method put = keystoreClass.getMethod("put",
+                    String.class, byte[].class, int.class, int.class);
+            Object keystore = getInstance.invoke(null);
+            byte[] buffer = new byte[65536];
+            Boolean result = (Boolean)put.invoke(keystore, "crashFile", buffer, -1, 0);
+            assertTrue("Fix for ANDROID-22802399 not present", result);
+        } catch (ReflectiveOperationException ignored) {
+            // Since this test requires reflection avoid causing undue failures if classes or
+            // methods were changed.
+        }
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/RSACipherTest.java b/tests/tests/keystore/src/android/keystore/cts/RSACipherTest.java
new file mode 100644
index 0000000..3403df3
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/RSACipherTest.java
@@ -0,0 +1,251 @@
+/*
+ * Copyright 2015 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.keystore.cts;
+
+import java.math.BigInteger;
+import java.security.PrivateKey;
+import java.security.Provider;
+import java.security.PublicKey;
+import java.security.Security;
+import java.security.interfaces.RSAKey;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+
+import android.security.keystore.KeyProperties;
+import android.test.AndroidTestCase;
+import android.test.MoreAsserts;
+
+public class RSACipherTest extends AndroidTestCase {
+
+    private static final String EXPECTED_PROVIDER_NAME = TestUtils.EXPECTED_CRYPTO_OP_PROVIDER_NAME;
+
+    public void testNoPaddingEncryptionAndDecryptionSucceedsWithInputShorterThanModulus()
+            throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+
+        for (ImportedKey key : RSASignatureTest.importKatKeyPairs(getContext(),
+                TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        "RSA/ECB/NoPadding",
+                        KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT,
+                        false))) {
+            try {
+                PublicKey publicKey = key.getKeystoreBackedKeyPair().getPublic();
+                PrivateKey privateKey = key.getKeystoreBackedKeyPair().getPrivate();
+                BigInteger modulus = ((RSAKey) publicKey).getModulus();
+                int modulusSizeBytes = (modulus.bitLength() + 7) / 8;
+
+                // 1-byte long input for which we know the output
+                byte[] input = new byte[] {1};
+                // Because of how RSA works, the output is 1 (left-padded with zero bytes).
+                byte[] expectedOutput = TestUtils.leftPadWithZeroBytes(input, modulusSizeBytes);
+
+                Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding", provider);
+                cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+                MoreAsserts.assertEquals(expectedOutput, cipher.doFinal(input));
+
+                cipher.init(Cipher.DECRYPT_MODE, privateKey);
+                MoreAsserts.assertEquals(expectedOutput, cipher.doFinal(input));
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for key " + key.getAlias(), e);
+            }
+        }
+    }
+
+    public void testNoPaddingEncryptionSucceedsWithPlaintextOneSmallerThanModulus()
+            throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+
+        for (ImportedKey key : RSASignatureTest.importKatKeyPairs(getContext(),
+                TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        "RSA/ECB/NoPadding",
+                        KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT,
+                        false))) {
+            try {
+                PublicKey publicKey = key.getKeystoreBackedKeyPair().getPublic();
+                PrivateKey privateKey = key.getKeystoreBackedKeyPair().getPrivate();
+                BigInteger modulus = ((RSAKey) publicKey).getModulus();
+
+                // Plaintext is one smaller than the modulus
+                byte[] plaintext =
+                        TestUtils.getBigIntegerMagnitudeBytes(modulus.subtract(BigInteger.ONE));
+                Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding", provider);
+                cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+                byte[] ciphertext = cipher.doFinal(plaintext);
+                cipher.init(Cipher.DECRYPT_MODE, privateKey);
+                MoreAsserts.assertEquals(plaintext, cipher.doFinal(ciphertext));
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for key " + key.getAlias(), e);
+            }
+        }
+    }
+
+    public void testNoPaddingEncryptionFailsWithPlaintextEqualToModulus() throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+
+        for (ImportedKey key : RSASignatureTest.importKatKeyPairs(getContext(),
+                TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        "RSA/ECB/NoPadding",
+                        KeyProperties.PURPOSE_ENCRYPT ,
+                        false))) {
+            try {
+                PublicKey publicKey = key.getKeystoreBackedKeyPair().getPublic();
+                BigInteger modulus = ((RSAKey) publicKey).getModulus();
+
+                // Plaintext is exactly the modulus
+                byte[] plaintext = TestUtils.getBigIntegerMagnitudeBytes(modulus);
+                Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding", provider);
+                cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+                try {
+                    byte[] ciphertext = cipher.doFinal(plaintext);
+                    fail("Unexpectedly produced ciphertext (" + ciphertext.length + " bytes): "
+                            + HexEncoding.encode(ciphertext));
+                } catch (BadPaddingException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for key " + key.getAlias(), e);
+            }
+        }
+    }
+
+    public void testNoPaddingEncryptionFailsWithPlaintextOneLargerThanModulus() throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+
+        for (ImportedKey key : RSASignatureTest.importKatKeyPairs(getContext(),
+                TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        "RSA/ECB/NoPadding",
+                        KeyProperties.PURPOSE_ENCRYPT,
+                        false))) {
+            try {
+                PublicKey publicKey = key.getKeystoreBackedKeyPair().getPublic();
+                BigInteger modulus = ((RSAKey) publicKey).getModulus();
+
+                // Plaintext is one larger than the modulus
+                byte[] plaintext =
+                        TestUtils.getBigIntegerMagnitudeBytes(modulus.add(BigInteger.ONE));
+                Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding", provider);
+                cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+                try {
+                    byte[] ciphertext = cipher.doFinal(plaintext);
+                    fail("Unexpectedly produced ciphertext (" + ciphertext.length + " bytes): "
+                            + HexEncoding.encode(ciphertext));
+                } catch (BadPaddingException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for key " + key.getAlias(), e);
+            }
+        }
+    }
+
+    public void testNoPaddingEncryptionFailsWithPlaintextOneByteLongerThanModulus()
+            throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+
+        for (ImportedKey key : RSASignatureTest.importKatKeyPairs(getContext(),
+                TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        "RSA/ECB/NoPadding",
+                        KeyProperties.PURPOSE_ENCRYPT,
+                        false))) {
+            try {
+                PublicKey publicKey = key.getKeystoreBackedKeyPair().getPublic();
+                BigInteger modulus = ((RSAKey) publicKey).getModulus();
+
+                // Plaintext is one byte longer than the modulus. The message is filled with zeros
+                // (thus being 0 if treated as a BigInteger). This is on purpose, to check that the
+                // Cipher implementation rejects such long message without comparing it to the value
+                // of the modulus.
+                byte[] plaintext = new byte[((modulus.bitLength() + 7) / 8) + 1];
+                Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding", provider);
+                cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+                try {
+                    byte[] ciphertext = cipher.doFinal(plaintext);
+                    fail("Unexpectedly produced ciphertext (" + ciphertext.length + " bytes): "
+                            + HexEncoding.encode(ciphertext));
+                } catch (IllegalBlockSizeException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for key " + key.getAlias(), e);
+            }
+        }
+    }
+
+    public void testNoPaddingDecryptionFailsWithCiphertextOneByteLongerThanModulus()
+            throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+
+        for (ImportedKey key : RSASignatureTest.importKatKeyPairs(getContext(),
+                TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        "RSA/ECB/NoPadding",
+                        KeyProperties.PURPOSE_DECRYPT,
+                        false))) {
+            try {
+                PrivateKey privateKey = key.getKeystoreBackedKeyPair().getPrivate();
+                BigInteger modulus = ((RSAKey) privateKey).getModulus();
+
+                // Ciphertext is one byte longer than the modulus. The message is filled with zeros
+                // (thus being 0 if treated as a BigInteger). This is on purpose, to check that the
+                // Cipher implementation rejects such long message without comparing it to the value
+                // of the modulus.
+                byte[] ciphertext = new byte[((modulus.bitLength() + 7) / 8) + 1];
+                Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding", EXPECTED_PROVIDER_NAME);
+                cipher.init(Cipher.DECRYPT_MODE, privateKey);
+                try {
+                    byte[] plaintext = cipher.doFinal(ciphertext);
+                    fail("Unexpectedly produced plaintext (" + ciphertext.length + " bytes): "
+                            + HexEncoding.encode(plaintext));
+                } catch (IllegalBlockSizeException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for key " + key.getAlias(), e);
+            }
+        }
+    }
+
+    public void testNoPaddingWithZeroMessage() throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+
+        for (ImportedKey key : RSASignatureTest.importKatKeyPairs(getContext(),
+                TestUtils.getMinimalWorkingImportParametersForCipheringWith(
+                        "RSA/ECB/NoPadding",
+                        KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT,
+                        false))) {
+            try {
+                PublicKey publicKey = key.getKeystoreBackedKeyPair().getPublic();
+                PrivateKey privateKey = key.getKeystoreBackedKeyPair().getPrivate();
+
+                byte[] plaintext = EmptyArray.BYTE;
+                Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding", EXPECTED_PROVIDER_NAME);
+                cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+                byte[] ciphertext = cipher.doFinal(plaintext);
+                // Ciphertext should be all zero bytes
+                byte[] expectedCiphertext = new byte[(TestUtils.getKeySizeBits(publicKey) + 7) / 8];
+                MoreAsserts.assertEquals(expectedCiphertext, ciphertext);
+
+                cipher.init(Cipher.DECRYPT_MODE, privateKey);
+                // Decrypted plaintext should also be all zero bytes
+                byte[] expectedPlaintext = new byte[expectedCiphertext.length];
+                MoreAsserts.assertEquals(expectedPlaintext, cipher.doFinal(ciphertext));
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for key " + key.getAlias(), e);
+            }
+        }
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/RSASignatureTest.java b/tests/tests/keystore/src/android/keystore/cts/RSASignatureTest.java
new file mode 100644
index 0000000..9ae3043
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/RSASignatureTest.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+import java.security.InvalidKeyException;
+import java.security.KeyPair;
+import java.security.PrivateKey;
+import java.security.Provider;
+import java.security.PublicKey;
+import java.security.Security;
+import java.security.Signature;
+import java.security.SignatureException;
+import java.security.interfaces.RSAKey;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import com.android.cts.keystore.R;
+
+import android.content.Context;
+import android.security.keystore.KeyProperties;
+import android.security.keystore.KeyProtection;
+import android.test.AndroidTestCase;
+
+public class RSASignatureTest extends AndroidTestCase {
+
+    private static final String EXPECTED_PROVIDER_NAME = SignatureTest.EXPECTED_PROVIDER_NAME;
+
+    private static final String[] SIGNATURE_ALGORITHMS;
+
+    static {
+        List<String> sigAlgs = new ArrayList<>();
+        for (String algorithm : SignatureTest.EXPECTED_SIGNATURE_ALGORITHMS) {
+            String keyAlgorithm = TestUtils.getSignatureAlgorithmKeyAlgorithm(algorithm);
+            if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(keyAlgorithm)) {
+                sigAlgs.add(algorithm);
+            }
+        }
+        SIGNATURE_ALGORITHMS = sigAlgs.toArray(new String[sigAlgs.size()]);
+    }
+
+    public void testMaxMessageSizeWhenNoDigestUsed() throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+
+        for (ImportedKey keyPair : importKatKeyPairs("NONEwithRSA")) {
+            PublicKey publicKey = keyPair.getKeystoreBackedKeyPair().getPublic();
+            PrivateKey privateKey = keyPair.getKeystoreBackedKeyPair().getPrivate();
+            int modulusSizeBits = ((RSAKey) publicKey).getModulus().bitLength();
+            try {
+                int modulusSizeBytes = (modulusSizeBits + 7) / 8;
+                // PKCS#1 signature padding must be at least 11 bytes long (00 || 01 || PS || 00)
+                // where PS must be at least 8 bytes long).
+                int expectedMaxMessageSizeBytes = modulusSizeBytes - 11;
+                byte[] msg = new byte[expectedMaxMessageSizeBytes + 1];
+                Arrays.fill(msg, (byte) 0xf0);
+
+                // Assert that a message of expected maximum length is accepted
+                Signature signature = Signature.getInstance("NONEwithRSA", provider);
+                signature.initSign(privateKey);
+                signature.update(msg, 0, expectedMaxMessageSizeBytes);
+                byte[] sigBytes = signature.sign();
+
+                signature.initVerify(publicKey);
+                signature.update(msg, 0, expectedMaxMessageSizeBytes);
+                assertTrue(signature.verify(sigBytes));
+
+                // Assert that a message longer than expected maximum length is rejected
+                signature = Signature.getInstance(signature.getAlgorithm(), provider);
+                signature.initSign(privateKey);
+                try {
+                    signature.update(msg, 0, expectedMaxMessageSizeBytes + 1);
+                    signature.sign();
+                    fail();
+                } catch (SignatureException expected) {
+                }
+
+                signature.initVerify(publicKey);
+                try {
+                    signature.update(msg, 0, expectedMaxMessageSizeBytes + 1);
+                    signature.verify(sigBytes);
+                    fail();
+                } catch (SignatureException expected) {
+                }
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + modulusSizeBits + " bit key", e);
+            }
+        }
+    }
+
+    public void testSmallKeyRejected() throws Exception {
+        // Use a 512 bit key which should prevent the use of any digests larger than SHA-256
+        // because the padded form of the digested message will be larger than modulus size.
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+
+        for (String algorithm : SIGNATURE_ALGORITHMS) {
+            try {
+                String digest = TestUtils.getSignatureAlgorithmDigest(algorithm);
+                if (KeyProperties.DIGEST_NONE.equalsIgnoreCase(digest)) {
+                    // Ignore signature algorithms without digest -- this is tested in a separate
+                    // test above.
+                    continue;
+                }
+                int digestOutputSizeBits = TestUtils.getDigestOutputSizeBits(digest);
+                if (digestOutputSizeBits <= 256) {
+                    // 256-bit and shorter digests are short enough to work with a 512 bit key.
+                    continue;
+                }
+
+                KeyPair keyPair = TestUtils.importIntoAndroidKeyStore("test1",
+                        getContext(),
+                        R.raw.rsa_key5_512_pkcs8,
+                        R.raw.rsa_key5_512_cert,
+                        TestUtils.getMinimalWorkingImportParametersForSigningingWith(algorithm))
+                        .getKeystoreBackedKeyPair();
+                assertEquals(512, ((RSAKey) keyPair.getPrivate()).getModulus().bitLength());
+                assertEquals(512, ((RSAKey) keyPair.getPublic()).getModulus().bitLength());
+
+                Signature signature = Signature.getInstance(algorithm, provider);
+                // Assert that either initSign or sign fails. We don't expect all keymaster
+                // implementations to fail early, during initSign.
+                try {
+                    signature.initSign(keyPair.getPrivate());
+                    signature.update("A message".getBytes("UTF-8"));
+                    byte[] sigBytes = signature.sign();
+                    fail("Unexpectedly generated a signature (" + sigBytes.length + " bytes): "
+                            + HexEncoding.encode(sigBytes));
+                } catch (InvalidKeyException | SignatureException expected) {
+                }
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    private Collection<ImportedKey> importKatKeyPairs(String signatureAlgorithm)
+            throws Exception {
+        KeyProtection params =
+                TestUtils.getMinimalWorkingImportParametersForSigningingWith(signatureAlgorithm);
+        return importKatKeyPairs(getContext(), params);
+    }
+
+    static Collection<ImportedKey> importKatKeyPairs(
+            Context context, KeyProtection importParams) throws Exception {
+        return Arrays.asList(new ImportedKey[] {
+                TestUtils.importIntoAndroidKeyStore("testRSA512", context,
+                        R.raw.rsa_key5_512_pkcs8, R.raw.rsa_key5_512_cert, importParams),
+                TestUtils.importIntoAndroidKeyStore("testRSA768", context,
+                        R.raw.rsa_key6_768_pkcs8, R.raw.rsa_key6_768_cert, importParams),
+                TestUtils.importIntoAndroidKeyStore("testRSA1024", context,
+                        R.raw.rsa_key3_1024_pkcs8, R.raw.rsa_key3_1024_cert, importParams),
+                TestUtils.importIntoAndroidKeyStore("testRSA2024", context,
+                        R.raw.rsa_key8_2048_pkcs8, R.raw.rsa_key8_2048_cert, importParams),
+                TestUtils.importIntoAndroidKeyStore("testRSA3072", context,
+                        R.raw.rsa_key7_3072_pksc8, R.raw.rsa_key7_3072_cert, importParams),
+                TestUtils.importIntoAndroidKeyStore("testRSA4096", context,
+                        R.raw.rsa_key4_4096_pkcs8, R.raw.rsa_key4_4096_cert, importParams),
+                });
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/SecretKeyFactoryTest.java b/tests/tests/keystore/src/android/keystore/cts/SecretKeyFactoryTest.java
new file mode 100644
index 0000000..17307f7
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/SecretKeyFactoryTest.java
@@ -0,0 +1,234 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+import android.security.keystore.KeyGenParameterSpec;
+import android.security.keystore.KeyInfo;
+import android.security.keystore.KeyProperties;
+import android.test.MoreAsserts;
+
+import junit.framework.TestCase;
+
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.Provider;
+import java.security.Security;
+import java.security.spec.InvalidKeySpecException;
+import java.security.Provider.Service;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Set;
+
+import javax.crypto.KeyGenerator;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.SecretKeySpec;
+
+public class SecretKeyFactoryTest extends TestCase {
+    private static final String EXPECTED_PROVIDER_NAME = TestUtils.EXPECTED_PROVIDER_NAME;
+
+    private static final String[] EXPECTED_ALGORITHMS = {
+        "AES",
+        "HmacSHA1",
+        "HmacSHA224",
+        "HmacSHA256",
+        "HmacSHA384",
+        "HmacSHA512",
+    };
+
+    public void testAlgorithmList() {
+        // Assert that Android Keystore Provider exposes exactly the expected SecretKeyFactory
+        // algorithms. We don't care whether the algorithms are exposed via aliases, as long as
+        // canonical names of algorithms are accepted. If the Provider exposes extraneous
+        // algorithms, it'll be caught because it'll have to expose at least one Service for such an
+        // algorithm, and this Service's algorithm will not be in the expected set.
+
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        Set<Service> services = provider.getServices();
+        Set<String> actualAlgsLowerCase = new HashSet<String>();
+        Set<String> expectedAlgsLowerCase = new HashSet<String>(
+                Arrays.asList(TestUtils.toLowerCase(EXPECTED_ALGORITHMS)));
+        for (Service service : services) {
+            if ("SecretKeyFactory".equalsIgnoreCase(service.getType())) {
+                String algLowerCase = service.getAlgorithm().toLowerCase(Locale.US);
+                actualAlgsLowerCase.add(algLowerCase);
+            }
+        }
+
+        TestUtils.assertContentsInAnyOrder(actualAlgsLowerCase,
+                expectedAlgsLowerCase.toArray(new String[0]));
+    }
+
+    public void testGetKeySpecWithKeystoreKeyAndKeyInfoReflectsAllAuthorizations()
+            throws Exception {
+        Date keyValidityStart = new Date(System.currentTimeMillis() - TestUtils.DAY_IN_MILLIS);
+        Date keyValidityForOriginationEnd =
+                new Date(System.currentTimeMillis() + TestUtils.DAY_IN_MILLIS);
+        Date keyValidityForConsumptionEnd =
+                new Date(System.currentTimeMillis() + 3 * TestUtils.DAY_IN_MILLIS);
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                String[] blockModes =
+                        new String[] {KeyProperties.BLOCK_MODE_CTR, KeyProperties.BLOCK_MODE_ECB};
+                String[] encryptionPaddings =
+                        new String[] {KeyProperties.ENCRYPTION_PADDING_PKCS7,
+                                KeyProperties.ENCRYPTION_PADDING_NONE};
+                String[] digests;
+                int purposes;
+                if (TestUtils.isHmacAlgorithm(algorithm)) {
+                    String digest = TestUtils.getHmacAlgorithmDigest(algorithm);
+                    digests = new String[] {digest};
+                    purposes = KeyProperties.PURPOSE_SIGN;
+                } else {
+                    digests = new String[] {KeyProperties.DIGEST_SHA384};
+                    purposes = KeyProperties.PURPOSE_DECRYPT;
+                }
+                KeyGenerator keyGenerator =
+                        KeyGenerator.getInstance(algorithm, EXPECTED_PROVIDER_NAME);
+                keyGenerator.init(new KeyGenParameterSpec.Builder("test1", purposes)
+                        .setBlockModes(blockModes)
+                        .setEncryptionPaddings(encryptionPaddings)
+                        .setDigests(digests)
+                        .setKeyValidityStart(keyValidityStart)
+                        .setKeyValidityForOriginationEnd(keyValidityForOriginationEnd)
+                        .setKeyValidityForConsumptionEnd(keyValidityForConsumptionEnd)
+                        .build());
+                SecretKey key = keyGenerator.generateKey();
+                SecretKeyFactory keyFactory = getKeyFactory(algorithm);
+                KeyInfo keyInfo = (KeyInfo) keyFactory.getKeySpec(key, KeyInfo.class);
+                assertEquals("test1", keyInfo.getKeystoreAlias());
+                assertEquals(purposes, keyInfo.getPurposes());
+                TestUtils.assertContentsInAnyOrder(
+                        Arrays.asList(blockModes), keyInfo.getBlockModes());
+                TestUtils.assertContentsInAnyOrder(
+                        Arrays.asList(encryptionPaddings), keyInfo.getEncryptionPaddings());
+                TestUtils.assertContentsInAnyOrder(Arrays.asList(digests), keyInfo.getDigests());
+                MoreAsserts.assertEmpty(Arrays.asList(keyInfo.getSignaturePaddings()));
+                assertEquals(keyValidityStart, keyInfo.getKeyValidityStart());
+                assertEquals(keyValidityForOriginationEnd,
+                        keyInfo.getKeyValidityForOriginationEnd());
+                assertEquals(keyValidityForConsumptionEnd,
+                        keyInfo.getKeyValidityForConsumptionEnd());
+                assertFalse(keyInfo.isUserAuthenticationRequired());
+                assertFalse(keyInfo.isUserAuthenticationRequirementEnforcedBySecureHardware());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testTranslateKeyWithNullKeyThrowsInvalidKeyException() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                SecretKeyFactory keyFactory = getKeyFactory(algorithm);
+                try {
+                    keyFactory.translateKey(null);
+                    fail();
+                } catch (InvalidKeyException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testTranslateKeyRejectsNonAndroidKeystoreKeys() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                SecretKey key = new SecretKeySpec(new byte[16], algorithm);
+                SecretKeyFactory keyFactory = getKeyFactory(algorithm);
+                try {
+                    keyFactory.translateKey(key);
+                    fail();
+                } catch (InvalidKeyException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testTranslateKeyAcceptsAndroidKeystoreKeys() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyGenerator keyGenerator =
+                        KeyGenerator.getInstance(algorithm, EXPECTED_PROVIDER_NAME);
+                keyGenerator.init(new KeyGenParameterSpec.Builder("test1", 0).build());
+                SecretKey key = keyGenerator.generateKey();
+
+                SecretKeyFactory keyFactory = getKeyFactory(algorithm);
+                assertSame(key, keyFactory.translateKey(key));
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testGenerateSecretWithNullSpecThrowsInvalidKeySpecException() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                SecretKeyFactory keyFactory = getKeyFactory(algorithm);
+                try {
+                    keyFactory.generateSecret(null);
+                    fail();
+                } catch (InvalidKeySpecException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testGenerateSecretRejectsSecretKeySpec() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                SecretKeyFactory keyFactory = getKeyFactory(algorithm);
+                try {
+                    keyFactory.generateSecret(new SecretKeySpec(new byte[16], algorithm));
+                    fail();
+                } catch (InvalidKeySpecException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testGenerateSecretRejectsKeyInfo() throws Exception {
+        for (String algorithm : EXPECTED_ALGORITHMS) {
+            try {
+                KeyGenerator keyGenerator =
+                        KeyGenerator.getInstance(algorithm, EXPECTED_PROVIDER_NAME);
+                keyGenerator.init(new KeyGenParameterSpec.Builder("test1", 0).build());
+                SecretKey keystoreKey = keyGenerator.generateKey();
+                KeyInfo keyInfo = TestUtils.getKeyInfo(keystoreKey);
+
+                SecretKeyFactory keyFactory = getKeyFactory(algorithm);
+                try {
+                    keyFactory.generateSecret(keyInfo);
+                    fail();
+                } catch (InvalidKeySpecException expected) {}
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    private SecretKeyFactory getKeyFactory(String algorithm) throws NoSuchAlgorithmException,
+            NoSuchProviderException {
+        return SecretKeyFactory.getInstance(algorithm, EXPECTED_PROVIDER_NAME);
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/SignatureTest.java b/tests/tests/keystore/src/android/keystore/cts/SignatureTest.java
new file mode 100644
index 0000000..8451eb8
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/SignatureTest.java
@@ -0,0 +1,1317 @@
+/*
+ * Copyright 2015 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.keystore.cts;
+
+import com.android.cts.keystore.R;
+
+import java.security.InvalidKeyException;
+import java.security.KeyPair;
+import java.security.PrivateKey;
+import java.security.Provider;
+import java.security.Provider.Service;
+import java.security.PublicKey;
+import java.security.Security;
+import java.security.Signature;
+import java.security.SignatureException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import android.content.Context;
+import android.security.keystore.KeyProperties;
+import android.security.keystore.KeyProtection;
+import android.test.AndroidTestCase;
+import android.test.MoreAsserts;
+
+/**
+ * Tests for algorithm-agnostic functionality of {@code Signature} implementations backed by Android
+ * Keystore.
+ */
+public class SignatureTest extends AndroidTestCase {
+
+    static final String EXPECTED_PROVIDER_NAME = TestUtils.EXPECTED_CRYPTO_OP_PROVIDER_NAME;
+
+    static final String[] EXPECTED_SIGNATURE_ALGORITHMS = {
+        "NONEwithRSA",
+        "MD5withRSA",
+        "SHA1withRSA",
+        "SHA224withRSA",
+        "SHA256withRSA",
+        "SHA384withRSA",
+        "SHA512withRSA",
+        "SHA1withRSA/PSS",
+        "SHA224withRSA/PSS",
+        "SHA256withRSA/PSS",
+        "SHA384withRSA/PSS",
+        "SHA512withRSA/PSS",
+        "NONEwithECDSA",
+        "SHA1withECDSA",
+        "SHA224withECDSA",
+        "SHA256withECDSA",
+        "SHA384withECDSA",
+        "SHA512withECDSA"
+    };
+
+    private static final Map<String, String> SIG_ALG_TO_CANONICAL_NAME_CASE_INSENSITIVE =
+            new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
+    static {
+        // For an unknown legacy reason, libcore's ProviderTest#test_Provider_getServices insists
+        // that a Service with algorithm "ECDSA" be exposed, despite the RI not exposing any such
+        // services. Thus, our provider has to expose the "ECDSA" service whose actual proper
+        // name is SHA1withECDSA.
+        SIG_ALG_TO_CANONICAL_NAME_CASE_INSENSITIVE.put("ECDSA", "SHA1withECDSA");
+    }
+
+    private static final byte[] SHORT_MSG_KAT_MESSAGE =
+            HexEncoding.decode("ec174729c4f5c570ba0de4c424cdcbf0362a7718039464");
+    private static final byte[] LONG_MSG_KAT_SEED = SHORT_MSG_KAT_MESSAGE;
+    private static final int LONG_MSG_KAT_SIZE_BYTES = 3 * 1024 * 1024 + 123;
+
+    private static final Map<String, byte[]> SHORT_MSG_KAT_SIGNATURES =
+            new TreeMap<String, byte[]>(String.CASE_INSENSITIVE_ORDER);
+    static {
+        // From RI
+        SHORT_MSG_KAT_SIGNATURES.put("NONEwithECDSA", HexEncoding.decode(
+                "304402201ea57c2fb571991639d103bfec658ee7f359b60664e400a5834cfc20d28b588902202433f5"
+                + "eb07d2b03bf8d238ea256ea399d0913a6cfcae2c3b00e2efd50aebc967"));
+        SHORT_MSG_KAT_SIGNATURES.put("SHA1withECDSA", HexEncoding.decode(
+                "30440220742d71a013564ab196789322b9231ac5ff26460c2d6b1ab8ccb45eec254cc8ba0220780a86"
+                + "5ddc2334fae23d563e3142b04660c2ab1b875c4ff8c557a1d1accc43e1"));
+        SHORT_MSG_KAT_SIGNATURES.put("SHA224withECDSA", HexEncoding.decode(
+                "304502200f74966078b34317daa69e487c3163dbb4e0391cd74191cc3e95b33fc60966e3022100ebdc"
+                + "be19c516d550609f73fb37557a406e397bc1725a1baba50cdfc3537bd377"));
+        SHORT_MSG_KAT_SIGNATURES.put("SHA256withECDSA", HexEncoding.decode(
+                "304402204443b560d888beeae729155b0d9410fef2ec78607d9166af6144346fba8ce45d02205b0727"
+                + "bfa630050f1395c8bcf46c614c14eb15f2a6abbd3bc7c0e83b41819281"));
+        SHORT_MSG_KAT_SIGNATURES.put("SHA384withECDSA", HexEncoding.decode(
+                "3045022025ade03446ce95aa525a51aedd16baf12a2b8b9c1f4c87224c38e48c84cbbbf8022100ad21"
+                + "8424c3671bc1513e1da7e7186dbc6bf67bec434c95863a48e79f53684971"));
+        SHORT_MSG_KAT_SIGNATURES.put("SHA512withECDSA", HexEncoding.decode(
+                "3045022100969e8fed2dc4ddcdf341368e057efe4e3a00eda66bbb127dec31bb0144c5334602201087"
+                + "2b7f9ab9c06a07053e0641e6adc18a87a1d7807550a19e872e78e5c7f0dd"));
+
+        // From RI
+        SHORT_MSG_KAT_SIGNATURES.put("NONEwithRSA", HexEncoding.decode(
+                "257d0704e514ead29a5c45576adb2d5a7d7738e6a83b5d6463a5306788015d14580fee340e78e00d39"
+                + "f56ae616083ac929e5daf9eeab40b908eb05d0cd1036d9e92799587df0d4c5304c9b27f913e1c891"
+                + "919eff0df3b5d9c0d8cc4cd843795840799cc0353192c3868b3f8cad96d04bb566ca53e1146aa2a3"
+                + "4b890ce917680bbdea1dee417a89630224d2ee79d66d38c7c77e50b45e1dd1b8b63eb98ecd60426b"
+                + "c9fb30917e78ae4dd7cbfa9475f9be53bf45e7032add52681553679252f4f74de77831c95ea69f30"
+                + "2f0fd28867de058728455e3537680c86a001236e70c7680c78b4dc98942d233b968635a0debccb41"
+                + "fbc17ece7172631f5ab6d578d70eb0"));
+        SHORT_MSG_KAT_SIGNATURES.put("MD5withRSA", HexEncoding.decode(
+                "1e1edefc9a6a4e61fcef0d4b202cc2b53ab9043b1a0b21117d122d4c5399182998ec66608e1ab13513"
+                + "08fbb23f92d5d970f7fb1a0691f8d1e682ff4f5e394ef2dfcbdc2de5c2c33372aec9a0c7fba982c5"
+                + "c0f1a5f65677d9294d54a2e613cc0e5feb919135e883827da0e1c222bf31336afa63a837c57c0b70"
+                + "70ceb8a24492a42afa6750cc9fe3a9586aa15507a65410db973a4b26734624d323dc700928717789"
+                + "fb1f970d57326eef49e012fcebcfbbfd18fb4d6feff03587d0f2b0a556fe467437a44a2283ea5027"
+                + "6efda4fd427365687960e0c289c5853a7b300ff081511a2f52899e6f6a569b30e07adfd52e9d9d7e"
+                + "ab33999da0da1dd16d4e88bd980fcd"));
+        SHORT_MSG_KAT_SIGNATURES.put("SHA1withRSA", HexEncoding.decode(
+                "280977b4ee18cbe27d3e452c9b90174f5d81dd518018ce52ff1cd1e8d4d0626afca85be14a43fa3b76"
+                + "a80e818b4bc10abc62180fa15619d78be98ccd8fa642ea05355aa84f2924e041c2b594b1cf31d42b"
+                + "f11c78dd3cbb6cc2cbfe151792985e6e5cf73c2e600a38f31e26e84c3e4a434f67a625fefe712d17"
+                + "b34125ea91d333cfe1c4ac914b6c411b08e64700885325e07510c4f49ef3648252736f17d3ae7705"
+                + "0054ceb07ab04b5ecaa5fc4556328bad4f97eba37f9bf079506e0eb136c9eadf9e466ccb18d65b4d"
+                + "ef2ba3ca5c2f33354a2040dfb646423f96ba43d1d8f3dcf91c0c2c14e7958159d2ac3ebc0b6b87e6"
+                + "6efbdda046ce8a766fecc3f905d6ff"));
+        SHORT_MSG_KAT_SIGNATURES.put("SHA224withRSA", HexEncoding.decode(
+                "490af9e685ef44da9528d9271d00e09a3e688012bf3f63fd924a06cb4db747a28cdf924c2d51620165"
+                + "33985abf4b91d64c17ff7e2b4f0de5a28375dddf556cd9e5dcebd112f766f07cb867e8d5710ce79a"
+                + "1c3d5244cbd16618b0fedc2b9015d51a98d453747fb320b97995ea9579adbc8bf6042b2f4252cef1"
+                + "787207fefaf4b9c7212fe0ff8b22ae12ffc888f0a1e6923455577e82b58608dabc2acba05be693ff"
+                + "ae7da263d6c83cb13d59a083f177578d11030f8974bdb301f6135ecd5ec18dd68dc453c5963e94b6"
+                + "2d89bcda0ff63ac7394030f79b59139e1d51573f0d4a1e85d22502c9b0d29412f7eb277fb42fa4db"
+                + "18875baffa7719b700e4830edbcd6f"));
+        SHORT_MSG_KAT_SIGNATURES.put("SHA256withRSA", HexEncoding.decode(
+                "1f1adcd6edbf4c50777c932db6e99a577853fbc9c71c692e921291c5aa73eb0155e30c8d4f3aff828f"
+                + "2040c84e10b1ba729ccc23899650451022fcd3574df5454b01112adec5f01565b578bbc7c32810c9"
+                + "407106054ad8f4f640b589ddef264d028ad906536d61c8053ef0dba8e10ca2e30a9dd6ccc9a9ec3e"
+                + "76c10d36029820865b2d01095987af4a29369ffc6f70fa7e1de2b8e28f41894df4225cf966454096"
+                + "7fb7ecff443948c8a0ee6a1be51e0f8e8887ff512dbdc4fc81636e69ae698000ce3899c2ec999b68"
+                + "691adfb53092380264b27d91bd64561fee9d2e622919cf6b472fd764dc2065ae6a67df2c7b5ec855"
+                + "099bdb6bb104ee41fa129c9da99745"));
+        SHORT_MSG_KAT_SIGNATURES.put("SHA384withRSA", HexEncoding.decode(
+                "3b5e8baa62803569642fa8c3255249709c9f1d69bd31f7b531d5071c07cd9bac29273097666d96b2e3"
+                + "2db13529b6414be5aee0c8a90c3f3b2a5c815f37fac16a3527fa45903f847416ed218eee2fef5b87"
+                + "5f0c97576f58b3467e83497c1cdeea44d0ea151e9c4d27b85eef75d612b1fc16731859738e95bdf1"
+                + "2f2098ebd501d8493c66585e8545fb13d736f7dbbb530fb06f6f157cd10c332ca498b379336efdaf"
+                + "a8f940552da2dbb047c33e87f699068eaadd6d47c92a299f35483ba3ae09f7e52a205f202c1af997"
+                + "c9bdc40f423b3767292c7fcea3eaf338a76f9db07a53d7f8d084bf1ceac38ec0509e442b1283cd8f"
+                + "013c4c7a9189fe4ef9ab00c80cb470"));
+        SHORT_MSG_KAT_SIGNATURES.put("SHA512withRSA", HexEncoding.decode(
+                "23eb7577d2ffefed10780c2a26f79f64abe08203e900db2333413f30bbc81f800857857c8b0e02c3e8"
+                + "8fe3cf5514130d6216ef7c4a86b1012594c7cb07a293159b92bf40291224386a84e607e0a8389c8a"
+                + "a0c45cc553037517c52f61fe0ea51dba184e890db7d9517760724c038018330c0a9450c280430e6f"
+                + "9e4cdd4545c3f6684485cd6e27203735ff4be76420071920b18c54d98c0e3eb7ae7d1f01f5171ace"
+                + "87885c6185f66d947d51a441a756bc953458f7d3a1714226899562478ebf91ab18d8e7556a966661"
+                + "31de37bc2e399b366877f53c1d88f93c989aeb64a43f0f6cbc2a29587230f7e3e90ea18868d79584"
+                + "3e62b49f5df78e355b437ec2f882f9"));
+
+        // From Bouncy Castle
+        SHORT_MSG_KAT_SIGNATURES.put("SHA1withRSA/PSS", HexEncoding.decode(
+                "17e483781695067a25bc7cb204429a8754af36032038460e1938c28cd058025b14d2cffe5d3da39e76"
+                + "6542014e5419f1d4c4d7d8e3ebcd2221dde04d24bbbad657f6782b7a0fada3c3ea595bc21054b0ab"
+                + "d1eb1ada86276ed31dbcce58be7407cbbb924d595fbf44f2bb6e3eab92296076e291439107e67912"
+                + "b4fac3a27ff84af7cd2db1385a8340b2e49c7c2ec96a6b657a1641da80799cb88734cca35a2b3a2c"
+                + "4af832a34ac8d3134ccc8b61150dc1b64391888a3a84bdb5184b48e8509e8ba726ba8847e4ca0640"
+                + "ce615e3adf5248ce08adb6484f6f29caf6c65308ec6351d97369ae005a7c762f76f0ddc0becc3e45"
+                + "529aa9c8391473e392c9a60c2d0834"));
+        SHORT_MSG_KAT_SIGNATURES.put("SHA224withRSA/PSS", HexEncoding.decode(
+                "3b7641a49e7766ed879f2b0e33ceb3d935678a7deffbd855a97abf00a65c981814ac54a71150b2ffea"
+                + "d5db83aa96d0939267b3c5e2fcf958e9c6fdf7d90908e6139f7f330a16dc625d8268ffd324659f6c"
+                + "e36798ef3b71a92f1d2237e3ce1e281aacc1d5370ae63c9b75e7134ad15cca1410746bf259ac4519"
+                + "c407877503900ec8f3b71edce727e9d0275c9cd48385f89ce76ed17a2bf246578f183bb6577d6942"
+                + "2056c7d9145528fc8ca036926a9fafe819f37c1a4a0a69b17f3d4b0a116106f94a5d2a5f8ce6981c"
+                + "d6e5c2f858dcb0823e725fffe6be14ca882c81fa993bebda549fcf983eb7f8a87eccd545951dcdc9"
+                + "d8055ae4f4067de997cfd89952c905"));
+        SHORT_MSG_KAT_SIGNATURES.put("SHA256withRSA/PSS", HexEncoding.decode(
+                "6f0f744fa8e813b4c7caa0c395c1aa8aee0d61e621b4daae305c759b5b5972311ad691f8867821efba"
+                + "d57995cc8ff38f33393293e94e1c484e94de4816b0fd986f5710a02d80e62461cc6f87f1f3742268"
+                + "c28a54870f290d136aa629cbe00a1bf243fab1674c04cd5910a786b2ac5e71d9c6f4c41daa4c584d"
+                + "46ba7ee768d2d2559be587a7b2009f3b7497d556a0da8a8ae80ce91152c81ffba62720d36b699d1f"
+                + "157137ff7ee7239fc4baf611d01582346e201900f7a4f2617cdf574653e124fb895c6cb76d4ed5a8"
+                + "aca97d1e408e8011eba649d5617bae8b27c1b946dcff7b29151d8632ad128f22907e8b83b9149e16"
+                + "fbb9e9b87600a2f90c1fd6dc164c52"));
+        SHORT_MSG_KAT_SIGNATURES.put("SHA384withRSA/PSS", HexEncoding.decode(
+                "8e57992362ad4b0487a707b2f8811d953f5aaf800978859981e7dcddad6f9f411fb162859115577c53"
+                + "7a3524e26bf069508185848d6e29e7da1f9660a49771533e43853e02232314afd2928a1ff1824345"
+                + "a5a90309a59d213ff6a4d04520f95a976342e6ac529ec6a6821157f4fee3bdae30d836d3ab44386d"
+                + "3914e6aacd6a6a63e1d63b4d9bfb93b343b6c1f28d60042ffbe1e46fb692a381456e84b3328dbcae"
+                + "ed6fc577cb1c5f86a38c5c34d439eeee7e798edc9f2bcd4fc217b1630e45b8df67def2c2cdb9fea0"
+                + "5d67aa6cce6e9a72e9a114e2e620a54c05755e32685ffc7e50487c3cd00888c09492fad8c461c338"
+                + "e7d099b275deaf184b7d6689385f7c"));
+        SHORT_MSG_KAT_SIGNATURES.put("SHA512withRSA/PSS", HexEncoding.decode(
+                "7a40f9f2797beda0702df0520c7138269295a0f0328aab4eba123ebf178ea4abc745ed42d3b175dc70"
+                + "c8dcc98f46f2234b392dbb3e939f30888715c4fbb47fbb5bb7c0557c140c579f48226710e5b3da0d"
+                + "9511337cde5626df586b4004100dd45490e5f8ae23307b5d1054c97e9ef58f9c385ca55b6db4f58d"
+                + "2e19bc8ca9d8c2b4922fb3325b6fb61fc40a359e9196aa9388845b136d2790d71410e20371dcf0a7"
+                + "0425ee1854c5c3d7de976b28de0ee9b1048ed99b2a957edc97466cc4c87e36224fd323605228f61a"
+                + "1aad30253b0698f9a358491138027d325d46bdfdf72171c57a2dab0a9cddaad8e170b8275c172e42"
+                + "33b29ed81c0f4de9fe9f0670106aad"));
+    }
+
+    private static final Map<String, byte[]> LONG_MSG_KAT_SIGNATURES =
+            new TreeMap<String, byte[]>(String.CASE_INSENSITIVE_ORDER);
+    static {
+        // From RI
+        LONG_MSG_KAT_SIGNATURES.put("NONEwithECDSA", HexEncoding.decode(
+                "304502206e4039608a66ce118821eeca3e2af7f530f51d1ce8089685a13f49010e3cd58b02210083a5"
+                + "fe62a171f1b1d775fad712128a223d6b63336e0248783652474221cb3193"));
+        LONG_MSG_KAT_SIGNATURES.put("SHA1withECDSA", HexEncoding.decode(
+                "3044022075f09bb5c87d883c088ca2ad263bbe1754ab614f727465bc43695d3521eaccf80220460e4e"
+                + "32421e6f4398cd9b7fbb31a1d1f2961f26b9783620f6413f0e6f7efb84"));
+        LONG_MSG_KAT_SIGNATURES.put("SHA224withECDSA", HexEncoding.decode(
+                "3045022100d6b24250b7d3cbd329913705f4990cfd1000f338f7332a44f07d7731bd8e1ff602200565"
+                + "0951e14d0d21c4344a449843ef65ac3a3f831dc7f304c0fa068c996f7d34"));
+        LONG_MSG_KAT_SIGNATURES.put("SHA256withECDSA", HexEncoding.decode(
+                "30440220501946a2c373e8da19b36e3c7718e3f2f2f16395d5026ac4fbbc7b2d53f9f21a0220347d7a"
+                + "46685282f308bacd5fb25ae92b351228ea39082784789696580f27eed1"));
+        LONG_MSG_KAT_SIGNATURES.put("SHA384withECDSA", HexEncoding.decode(
+                "30450220576836de4ab94a869e867b2360a71dc5a0b3351ea1c896b163206db7c3507dc2022100c1a6"
+                + "719052a175e023bca7f3b9bb7a379fc6b51864cb28a195076d2f3c79ed2e"));
+        LONG_MSG_KAT_SIGNATURES.put("SHA512withECDSA", HexEncoding.decode(
+                "304402204ca46bac4e43e8694d1af38854c96024a4e9bcc55c6904c1f8fea0d1927f69f7022054662e"
+                + "84b4d16b9f7e8164f4896212dec3c7c1e7fd108f69b0dff5bc15399eeb"));
+
+        // From RI
+        LONG_MSG_KAT_SIGNATURES.put("MD5withRSA", HexEncoding.decode(
+                "7040f3e0d95f4d22719d26e5e684dbcd5ed52ab4a7c5aa51b938b2c060c79eb600f9c9771c2fcda7e3"
+                + "55e7c7b5e2ba9fe9a2a3621881c0fe51702781ffcde6ce7013218c04bb05988346c2bed99afb97a8"
+                + "113fb50697adf93791c9129e938040f91178e35d6f323cfa515ea6d2112e8cce1302201b51333794"
+                + "4a5c425cecc8181842ace89163d84784599ea688060ad0d61ac92b673feabe01ae5e6b85d8b5e8f0"
+                + "519aea3c29781e82df9153404d027d75df8370658898ed348acf4e13fd8f79c8a545881fbbf585e1"
+                + "c666be3805e808819e2cc730379f35a207f9e0e646c7ab6d598c75b1901f0c5ca7099e34f7f01579"
+                + "3b57dfb5c2a32e8423bfed6215f9d0"));
+        LONG_MSG_KAT_SIGNATURES.put("SHA1withRSA", HexEncoding.decode(
+                "187d7689206c9dd03861009c6cb62c7752fd2bbc354f0bea4e76059fe582744c80027175112a3df4b6"
+                + "3b4a5626ed3051192e3c9b6d906497472f6df81171064b59114ff5d7c60f66943549634461cfadd8"
+                + "a033cba2b8781fb7936ea1ca0043da119856a21e533afa999f095cf87604bb33a14e8f82fab01998"
+                + "9ef3133e8069708670645ddd5cdc86bbe19fbf672b409fb6d7cae2f913814cd3dc8d5ae8e4037ccf"
+                + "4a3ef97db8c8a08516716258c4b767607c51dfb289d90af014d3cfc64dbadb2135ed59728b78fda0"
+                + "823fe7e68e84280c283d21ab660364a9bf035afa9a7262bade87057a63aa1d7e2c09bb9dd037bcbd"
+                + "7b98356793bc32be81623833c6ab62"));
+        LONG_MSG_KAT_SIGNATURES.put("SHA224withRSA", HexEncoding.decode(
+                "31ff68ddfafcf3ff6e651c93649bf9cc06f4138493317606d8676a8676f9d9f3a1d5e418358f79d143"
+                + "a922a3cfc5e1ad6765dc829b556c9019a6d9389144cc6a7571011c024c0514891970508dac5f0d26"
+                + "f26b536cf3e4511b5e72cd9f60590b387d8a351a9f28839a1c5be5272cb75a9062aa313f3d095074"
+                + "6d0a21d4f8c9a94d3bb4715c3ef0207cf1335653161a8f78972329f3ec2fa5cfe05318221cb1f535"
+                + "8151dde5410f6c36f32287a2d5e76bf36134d7103fc6810a1bb8627de37d6b9efde347242d08b0b6"
+                + "2b1d73bacd243ccc8546536080b42a82b7162afeb4151315746a14b64e45226c9f5b35cf1577fc6b"
+                + "f5c882b71deb7f0e375db5c0196446"));
+        LONG_MSG_KAT_SIGNATURES.put("SHA256withRSA", HexEncoding.decode(
+                "529c70877dedf3eb1abda98a2f2b0fc899e1edece70da79f8f8bbceb98de5c85263bef2ef8a7322624"
+                + "5ed2767045ea6965f35cb53e6ac1d6c62e8007a79962507d3e01c77d4e96674344438519adae67d9"
+                + "6357da5c4527969c939fd86f3b8685338c2be4bf6f1f85527b11fcaa4708f925e8bb9b877bda179b"
+                + "d1b45153ef22834cf593ecc5b6eca3deddbe5d05894e4e5707d71bc35ea879ccb6e8ffc32e0cdc5e"
+                + "88a30eef7a608d9ea80b5cefec2aa493a3b1354ad20e88ab1f8bfda3bd9961e10f0736d1bc090d57"
+                + "b93fbce3e6e2fc99e67c7b466188d1615b4150c206472e48a9253b7549cebf6c7cbb558b54e10b73"
+                + "c8b1747c18d1890a24d0a835ee710a"));
+        LONG_MSG_KAT_SIGNATURES.put("SHA384withRSA", HexEncoding.decode(
+                "5dd3553bc594c541937dac9a8ac119407712da7564816bcdc0ca4e14bc6059b9f9bd72e99be8a3df3e"
+                + "0a3c4e8ed643db9ed528b43a396dba470ad3307815bd7c75fa5b08775a378cc4203341379087dcb3"
+                + "62a5e9f5c979744e4498a6aafd1b1a8069caf4ef437f2743754861fcc96d67a0f1dd3397bb65ede3"
+                + "18d2b3628eb2c3ec5db8a3e21fbbe2629f1030641e420963abc4da99e24dd497337c8149a52d97da"
+                + "7176c0767d72e18f8c9a49e6808509837f719fd16ba27b19a2b32bd19b9b14818e0b9be81062be77"
+                + "4fb1b3105a1528170822391915a5cd12b8e79aaab7943c34094da4c4f8d56f52177db953d3bf7846"
+                + "f0e5f22f2311054a1daba4fec6b589"));
+        LONG_MSG_KAT_SIGNATURES.put("SHA512withRSA", HexEncoding.decode(
+                "971d6350337866fbcb48c49446c50cac1995b822cfec8f2a3e2c8206158a2ddfc8fc7b38f5174b3288"
+                + "91489e7b379829bac5e48cd41e9713ea7e2dc9c61cf90d255387d31818d2f161ec5c3a977b4ce121"
+                + "62fb11ede30d1e63c0fbba8a4094e6ad39e64176a033e7130bbed71a67ff1713b45f0bedeb1ee532"
+                + "15690f169452c061cd7d15e71cc754a2f233f5647af8373d2b583e98e4242c0a0581e0ce2b22e15a"
+                + "443b0ff23d516ed39664f8b8ab5ca98a44af500407941fae97f37cb1becbcbff453608cb94a176d9"
+                + "e702947fff80bc8d1e9bcdef2b7bbe681e15327cee50a72649aed0d730df7b3c9c31b165416d9c9f"
+                + "1fcb04edbf96514f5758b9e90ebc0e"));
+
+        // From Bouncy Castle
+        LONG_MSG_KAT_SIGNATURES.put("SHA1withRSA/PSS", HexEncoding.decode(
+                "54a2050b22f6182b65d790da80ea16bfbc34b0c7e564d1a3ce4450e9b7785d9eaa14814dee8699977a"
+                + "e8da5cfb3c55c9a623ca55abcc0ef4b3b515ce31d49a78db442f9db270d35a179baf71057fe8d6d2"
+                + "d3f7e4fd5f5c80e11dc059c72a1a0373f527d88089c230525f895ee19e45f5547572083418c9e542"
+                + "5ff44e407500d1c49159484f38e4b00523c2fa45b7b9b38a2c1ad676b36f02a06db6fca52bd79ba1"
+                + "94d5062f5035a12a1f026ac216789844a5da0caa4d481386a12ca635c06b877515ce3782d9189d87"
+                + "d1ff5ec6ec7c39437071c8db7d1c2702205da4cfb01805ca7fec5595dba2234602ca5347d30538cb"
+                + "4b5286c151609afcca890a6276d5e8"));
+        LONG_MSG_KAT_SIGNATURES.put("SHA224withRSA/PSS", HexEncoding.decode(
+                "7e95c1e4f700ceaf9ce72fd3f9f245ba80f2e1341341c49521779c8a79004f9c534297441330b9df36"
+                + "bb23467eb560e5e5538612cecc27953336a0d4d8044d5a80f6bcef5299830215258c574d271ea6cd"
+                + "7117c2723189385435b0f06951ff3d6a700b23bc7ed3298cfb6aa65e8f540717d57f8b55290a4862"
+                + "034d9f73e8d9cb6ae7fa55a8b4c127535b5690122d6405cb0c9a313808327cfd4fb763eae875acd1"
+                + "b60e1920ecf1116102cc5f7d776ed88e666962f759258d6f5454c29cb99b8f9ccad07d209671b607"
+                + "014d19009e392bfb08247acf7f354458dc51196d84b492798dd829b7300c7591d42c58f21bd2c3d1"
+                + "e5ce0a0d3e0aa8aa4b090b6a619fc6"));
+        LONG_MSG_KAT_SIGNATURES.put("SHA256withRSA/PSS", HexEncoding.decode(
+                "5a8c0ae593a6714207b3ad83398b38b93da18cfda73139ea9f02c88a989368ae6901357194a873dd2e"
+                + "8cd1bb86d1f81fbc8bf725538dc2ad60759f8caab6a98a6baa6014874a92d4b92ed72e73f2721ba2"
+                + "86e545924860d27210b53f9308c4fec622fdfca7dd6d51a5b092184114e9dcf57636cdabaca17b49"
+                + "70cd5e93ce12c30af6d09d6964c5ad173095ea000529620d94a25b4cc977deefd25cc810a7b11cd5"
+                + "e5b71c9276b0bd33c53db01304b359a4a88f3fe8bc3335669f7609b0f6da17e49ad87f38468fa2c6"
+                + "8134ba6df407207559355b6e486a745009931796ab0567c9bd61788073aa00113b324fa25bd32b4d"
+                + "3521e98e0b4905c6dce30d70387a2e"));
+        LONG_MSG_KAT_SIGNATURES.put("SHA384withRSA/PSS", HexEncoding.decode(
+                "7913f13dc399adb07cd96c1bb484f999d047efcd96501c92477d2234a1da94db9c6fd65a8031bd3040"
+                + "82d90ef4a4f388e670795d144ef72a160583d4a2c805415542fa16ffd8760d2f28bdc82f63db0900"
+                + "a3554bc9175dafa1899249abd49591216ba2965a4862d0f59d8b8c8d1042ed7ac43a3a15650d578a"
+                + "2ea53696e462f757b326b7f0f7610fb9934aee7d954a45ca03ef66464a5611433e1224d05f783cd1"
+                + "935eff90015140cb35e15f2bbf491a0d6342ccef57e453f3462412c5ff4dfdc44527ea76c6b05b1d"
+                + "1330869aec1b2f41e7d975eba6b056e7c2f75dd73b1eff6d853b9507f410279b02f9244b656a1aca"
+                + "befcc5e1167df3a49c4a7d8479c30f"));
+        LONG_MSG_KAT_SIGNATURES.put("SHA512withRSA/PSS", HexEncoding.decode(
+                "43ffefe9c96014312679a2e3803eb7c58a2a4ab8bb659c12fec7fb574c82aed673e21ed86ac309cf6c"
+                + "e567e47b7c6c83dcd72e3ee946067c2004689420528174d028e3d32b2b306bcbcb6a9c8e8b83918f"
+                + "7415d792f9d6417769def3316ed61898443d3ffa4dc160e5b5ecf4a11a9dfed6b4a7aa65f0f2c653"
+                + "4f7e514aed73be441609ffca29207b4ced249058543fd6e13a02ef42babe2cdf4aaba66b42e9d47f"
+                + "c79b4ed54fbc28d9d732f2e468d43f0ca1de6fd5312fad2c4e3eaf3e9586bca6a8bab24b4dfab8b3"
+                + "9a4057c8ed27024b61b425036bea5e23689cd9db2450be47ec2c30bb6707740c70a53b3e7a1c7ecf"
+                + "f04e3de1460e60e9be7a42b1ddff0c"));
+    }
+
+    private static final long DAY_IN_MILLIS = TestUtils.DAY_IN_MILLIS;
+
+    public void testAlgorithmList() {
+        // Assert that Android Keystore Provider exposes exactly the expected signature algorithms.
+        // We don't care whether the algorithms are exposed via aliases, as long as the canonical
+        // names of algorithms are accepted.
+        // If the Provider exposes extraneous algorithms, it'll be caught because it'll have to
+        // expose at least one Service for such an algorithm, and this Service's algorithm will
+        // not be in the expected set.
+
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        Set<Service> services = provider.getServices();
+        Set<String> actualSigAlgsLowerCase = new HashSet<String>();
+        Set<String> expectedSigAlgsLowerCase = new HashSet<String>(
+                Arrays.asList(TestUtils.toLowerCase(EXPECTED_SIGNATURE_ALGORITHMS)));
+        for (Service service : services) {
+            if ("Signature".equalsIgnoreCase(service.getType())) {
+                String algLowerCase = service.getAlgorithm().toLowerCase(Locale.US);
+                if (!expectedSigAlgsLowerCase.contains(algLowerCase)) {
+                    // Unexpected algorithm -- check whether it's an alias for an expected one
+                    String canonicalAlgorithm =
+                            SIG_ALG_TO_CANONICAL_NAME_CASE_INSENSITIVE.get(algLowerCase);
+                    if (canonicalAlgorithm != null) {
+                        // Use the canonical name instead
+                        algLowerCase = canonicalAlgorithm.toLowerCase();
+                    }
+                }
+                actualSigAlgsLowerCase.add(algLowerCase);
+            }
+        }
+
+        TestUtils.assertContentsInAnyOrder(actualSigAlgsLowerCase,
+                expectedSigAlgsLowerCase.toArray(new String[0]));
+    }
+
+    public void testAndroidKeyStoreKeysHandledByAndroidKeyStoreProviderWhenSigning()
+            throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+        for (String sigAlgorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            try {
+                KeyPair keyPair = importDefaultKatKeyPair(sigAlgorithm).getKeystoreBackedKeyPair();
+                Signature signature = Signature.getInstance(sigAlgorithm);
+                signature.initSign(keyPair.getPrivate());
+                assertSame(provider, signature.getProvider());
+            } catch (Throwable e) {
+                throw new RuntimeException(sigAlgorithm + " failed", e);
+            }
+        }
+    }
+
+    public void testAndroidKeyStorePublicKeysAcceptedByHighestPriorityProviderWhenVerifying()
+            throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+        for (String sigAlgorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            try {
+                KeyPair keyPair = importDefaultKatKeyPair(sigAlgorithm).getKeystoreBackedKeyPair();
+                Signature signature = Signature.getInstance(sigAlgorithm);
+                signature.initVerify(keyPair.getPublic());
+            } catch (Throwable e) {
+                throw new RuntimeException(sigAlgorithm + " failed", e);
+            }
+        }
+    }
+
+    public void testValidSignatureGeneratedForEmptyMessage()
+            throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+        for (String sigAlgorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            for (ImportedKey key : importKatKeyPairsForSigning(getContext(), sigAlgorithm)) {
+                if (!TestUtils.isKeyLongEnoughForSignatureAlgorithm(
+                        sigAlgorithm, key.getOriginalSigningKey())) {
+                    continue;
+                }
+                try {
+                    KeyPair keyPair = key.getKeystoreBackedKeyPair();
+
+                    // Generate a signature
+                    Signature signature = Signature.getInstance(sigAlgorithm, provider);
+                    signature.initSign(keyPair.getPrivate());
+                    byte[] sigBytes = signature.sign();
+
+                    // Assert that it verifies using our own Provider
+                    signature.initVerify(keyPair.getPublic());
+                    assertTrue(signature.verify(sigBytes));
+                } catch (Throwable e) {
+                    throw new RuntimeException(
+                            "Failed for " + sigAlgorithm + " with key " + key.getAlias(), e);
+                }
+            }
+        }
+    }
+
+    public void testEmptySignatureDoesNotVerify()
+            throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+        for (String sigAlgorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            for (ImportedKey key : importKatKeyPairsForSigning(getContext(), sigAlgorithm)) {
+                if (!TestUtils.isKeyLongEnoughForSignatureAlgorithm(
+                        sigAlgorithm, key.getOriginalSigningKey())) {
+                    continue;
+                }
+                try {
+                    KeyPair keyPair = key.getKeystoreBackedKeyPair();
+                    Signature signature = Signature.getInstance(sigAlgorithm, provider);
+                    signature.initVerify(keyPair.getPublic());
+                    assertFalse(signature.verify(EmptyArray.BYTE));
+                } catch (Throwable e) {
+                    throw new RuntimeException(
+                            "Failed for " + sigAlgorithm + " with key " + key.getAlias(), e);
+                }
+            }
+        }
+    }
+
+    public void testSignatureGeneratedByAndroidKeyStoreVerifiesByAndroidKeyStore()
+            throws Exception {
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+        for (String sigAlgorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            for (ImportedKey key : importKatKeyPairsForSigning(getContext(), sigAlgorithm)) {
+                if (!TestUtils.isKeyLongEnoughForSignatureAlgorithm(
+                        sigAlgorithm, key.getOriginalSigningKey())) {
+                    continue;
+                }
+                try {
+                    KeyPair keyPair = key.getKeystoreBackedKeyPair();
+
+                    // Generate a signature
+                    Signature signature = Signature.getInstance(sigAlgorithm, provider);
+                    signature.initSign(keyPair.getPrivate());
+                    byte[] message = "This is a test".getBytes("UTF-8");
+                    signature.update(message);
+                    byte[] sigBytes = signature.sign();
+
+                    // Assert that it verifies using our own Provider
+                    assertSignatureVerifiesOneShot(
+                            sigAlgorithm, provider, keyPair.getPublic(), message, sigBytes);
+                } catch (Throwable e) {
+                    throw new RuntimeException(
+                            "Failed for " + sigAlgorithm + " with key " + key.getAlias(), e);
+                }
+            }
+        }
+    }
+
+    public void testSignatureGeneratedByAndroidKeyStoreVerifiesByHighestPriorityProvider()
+            throws Exception {
+        Provider keystoreProvider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(keystoreProvider);
+        for (String sigAlgorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            for (ImportedKey key : importKatKeyPairsForSigning(getContext(), sigAlgorithm)) {
+                if (!TestUtils.isKeyLongEnoughForSignatureAlgorithm(
+                        sigAlgorithm, key.getOriginalSigningKey())) {
+                    continue;
+                }
+                Provider verificationProvider = null;
+                try {
+                    PrivateKey keystorePrivateKey = key.getKeystoreBackedKeyPair().getPrivate();
+
+                    // Generate a signature
+                    Signature signature = Signature.getInstance(sigAlgorithm, keystoreProvider);
+                    signature.initSign(keystorePrivateKey);
+                    byte[] message = "This is a test".getBytes("UTF-8");
+                    signature.update(message);
+                    byte[] sigBytes = signature.sign();
+
+                    // Assert that it verifies using whatever Provider is chosen by JCA by default
+                    // for this signature algorithm and public key.
+                    PublicKey publicKey = key.getOriginalKeyPair().getPublic();
+                    try {
+                        signature = Signature.getInstance(sigAlgorithm);
+                        signature.initVerify(publicKey);
+                        verificationProvider = signature.getProvider();
+                    } catch (InvalidKeyException e) {
+                        // No providers support verifying signatures using this algorithm and key.
+                        continue;
+                    }
+                    assertSignatureVerifiesOneShot(
+                            sigAlgorithm, verificationProvider, publicKey, message, sigBytes);
+                } catch (Throwable e) {
+                    throw new RuntimeException(
+                            "Failed for " + sigAlgorithm + " with key " + key.getAlias()
+                                    + ", verification provider: " + verificationProvider,
+                            e);
+                }
+            }
+        }
+    }
+
+    public void testSignatureGeneratedByHighestPriorityProviderVerifiesByAndroidKeyStore()
+            throws Exception {
+
+        Provider keystoreProvider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(keystoreProvider);
+        for (String sigAlgorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            for (ImportedKey key : importKatKeyPairsForSigning(getContext(), sigAlgorithm)) {
+                if (!TestUtils.isKeyLongEnoughForSignatureAlgorithm(
+                        sigAlgorithm, key.getOriginalSigningKey())) {
+                    continue;
+                }
+                Provider signingProvider = null;
+                try {
+                    PrivateKey privateKey = key.getOriginalKeyPair().getPrivate();
+
+                    // Generate a signature
+                    Signature signature;
+                    try {
+                        signature = Signature.getInstance(sigAlgorithm);
+                        signature.initSign(privateKey);
+                        signingProvider = signature.getProvider();
+                    } catch (InvalidKeyException e) {
+                        // No providers support signing using this algorithm and key.
+                        continue;
+                    }
+                    byte[] message = "This is a test".getBytes("UTF-8");
+                    signature.update(message);
+                    byte[] sigBytes = signature.sign();
+
+                    // Assert that the signature verifies using the Android Keystore provider.
+                    PublicKey keystorePublicKey = key.getKeystoreBackedKeyPair().getPublic();
+                    assertSignatureVerifiesOneShot(
+                            sigAlgorithm, keystoreProvider, keystorePublicKey, message, sigBytes);
+                } catch (Throwable e) {
+                    throw new RuntimeException(
+                            "Failed for " + sigAlgorithm + " with key " + key.getAlias()
+                                    + ", signing provider: " + signingProvider,
+                            e);
+                }
+            }
+        }
+    }
+
+    // TODO: Re-enable this test once Signature.initSign passes SecureRandom to SPI (Bug 22485587).
+    public void DISABLED_testEntropyConsumption() throws Exception {
+        // Assert that signature generation consumes the correct amount of entropy from the provided
+        // SecureRandom. There is no need to check that Signature.verify does not consume entropy
+        // because Signature.initVerify does not take a SecureRandom.
+
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+
+        CountingSecureRandom rng = new CountingSecureRandom();
+        for (String sigAlgorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            for (ImportedKey key : importKatKeyPairsForSigning(getContext(), sigAlgorithm)) {
+                if (!TestUtils.isKeyLongEnoughForSignatureAlgorithm(
+                        sigAlgorithm, key.getOriginalSigningKey())) {
+                    continue;
+                }
+                try {
+                    KeyPair keyPair = key.getKeystoreBackedKeyPair();
+                    PrivateKey privateKey = keyPair.getPrivate();
+                    Signature signature = Signature.getInstance(sigAlgorithm, provider);
+
+                    // Signature.initSign should not consume entropy.
+                    rng.resetCounters();
+                    signature.initSign(privateKey, rng);
+                    assertEquals(0, rng.getOutputSizeBytes());
+
+                    // Signature.update should not consume entropy.
+                    byte[] message = "This is a test message".getBytes("UTF-8");
+                    rng.resetCounters();
+                    signature.update(message);
+                    assertEquals(0, rng.getOutputSizeBytes());
+
+                    // Signature.sign may consume entropy.
+                    rng.resetCounters();
+                    signature.sign();
+                    int expectedEntropyBytesConsumed;
+                    String algorithmUpperCase = sigAlgorithm.toUpperCase(Locale.US);
+                    if (algorithmUpperCase.endsWith("WITHECDSA")) {
+                        expectedEntropyBytesConsumed =
+                                (TestUtils.getKeySizeBits(privateKey) + 7) / 8;
+                    } else if (algorithmUpperCase.endsWith("WITHRSA")) {
+                        expectedEntropyBytesConsumed = 0;
+                    } else if (algorithmUpperCase.endsWith("WITHRSA/PSS")) {
+                        expectedEntropyBytesConsumed = 20; // salt length
+                    } else {
+                        throw new RuntimeException("Unsupported algorithm: " + sigAlgorithm);
+                    }
+                    assertEquals(expectedEntropyBytesConsumed, rng.getOutputSizeBytes());
+                } catch (Throwable e) {
+                    throw new RuntimeException(
+                            "Failed for " + sigAlgorithm + " with key " + key.getAlias(), e);
+                }
+            }
+        }
+    }
+
+    public void testSmallMsgKat() throws Exception {
+        byte[] message = SHORT_MSG_KAT_MESSAGE;
+
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+        for (String algorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            try {
+                byte[] goodSigBytes = SHORT_MSG_KAT_SIGNATURES.get(algorithm);
+                assertNotNull(goodSigBytes);
+                KeyPair keyPair = importDefaultKatKeyPair(algorithm).getKeystoreBackedKeyPair();
+                // Assert that AndroidKeyStore provider can verify the known good signature.
+                assertSignatureVerifiesOneShot(
+                        algorithm, provider, keyPair.getPublic(), message, goodSigBytes);
+                assertSignatureVerifiesFedOneByteAtATime(
+                        algorithm, provider, keyPair.getPublic(), message, goodSigBytes);
+                assertSignatureVerifiesFedUsingFixedSizeChunks(
+                        algorithm, provider, keyPair.getPublic(), message, goodSigBytes, 3);
+
+                byte[] messageWithBitFlip = message.clone();
+                messageWithBitFlip[messageWithBitFlip.length / 2] ^= 1;
+                assertSignatureDoesNotVerifyOneShot(
+                        algorithm, provider, keyPair.getPublic(), messageWithBitFlip, goodSigBytes);
+
+                byte[] goodSigWithBitFlip = goodSigBytes.clone();
+                goodSigWithBitFlip[goodSigWithBitFlip.length / 2] ^= 1;
+                assertSignatureDoesNotVerifyOneShot(
+                        algorithm, provider, keyPair.getPublic(), message, goodSigWithBitFlip);
+
+                // Sign the message in one go
+                Signature signature = Signature.getInstance(algorithm, provider);
+                signature.initSign(keyPair.getPrivate());
+                signature.update(message);
+                byte[] generatedSigBytes = signature.sign();
+                boolean deterministicSignatureScheme =
+                        algorithm.toLowerCase().endsWith("withrsa");
+                if (deterministicSignatureScheme) {
+                    MoreAsserts.assertEquals(goodSigBytes, generatedSigBytes);
+                } else {
+                    if (Math.abs(goodSigBytes.length - generatedSigBytes.length) > 2) {
+                        fail("Generated signature expected to be between "
+                                + (goodSigBytes.length - 2) + " and "
+                                + (goodSigBytes.length + 2) + " bytes long, but was: "
+                                + generatedSigBytes.length + " bytes: "
+                                + HexEncoding.encode(generatedSigBytes));
+                    }
+
+                    // Assert that the signature verifies using our own Provider
+                    assertSignatureVerifiesOneShot(
+                            algorithm, provider, keyPair.getPublic(), message, generatedSigBytes);
+                    assertSignatureVerifiesFedOneByteAtATime(
+                            algorithm, provider, keyPair.getPublic(), message, generatedSigBytes);
+                    assertSignatureVerifiesFedUsingFixedSizeChunks(
+                            algorithm, provider, keyPair.getPublic(), message, generatedSigBytes,
+                            3);
+
+                    // Assert that the signature verifies using whatever Provider is chosen by JCA
+                    // by default for this signature algorithm and public key.
+                    assertSignatureVerifiesOneShot(
+                            algorithm, keyPair.getPublic(), message, generatedSigBytes);
+                }
+
+                // Sign the message by feeding it into the Signature one byte at a time
+                signature = Signature.getInstance(signature.getAlgorithm(), provider);
+                signature.initSign(keyPair.getPrivate());
+                for (int i = 0; i < message.length; i++) {
+                    signature.update(message[i]);
+                }
+                generatedSigBytes = signature.sign();
+                if (deterministicSignatureScheme) {
+                    MoreAsserts.assertEquals(goodSigBytes, generatedSigBytes);
+                } else {
+                    if (Math.abs(goodSigBytes.length - generatedSigBytes.length) > 2) {
+                        fail("Generated signature expected to be between "
+                                + (goodSigBytes.length - 2) + " and "
+                                + (goodSigBytes.length + 2) + " bytes long, but was: "
+                                + generatedSigBytes.length + " bytes: "
+                                + HexEncoding.encode(generatedSigBytes));
+                    }
+                    // Assert that the signature verifies using our own Provider
+                    assertSignatureVerifiesOneShot(
+                            algorithm, provider, keyPair.getPublic(), message, generatedSigBytes);
+                    assertSignatureVerifiesFedOneByteAtATime(
+                            algorithm, provider, keyPair.getPublic(), message, generatedSigBytes);
+                    assertSignatureVerifiesFedUsingFixedSizeChunks(
+                            algorithm, provider, keyPair.getPublic(), message, generatedSigBytes,
+                            3);
+
+                    // Assert that the signature verifies using whatever Provider is chosen by JCA
+                    // by default for this signature algorithm and public key.
+                    assertSignatureVerifiesOneShot(
+                            algorithm, keyPair.getPublic(), message, generatedSigBytes);
+                }
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testLongMsgKat() throws Exception {
+        byte[] message = TestUtils.generateLargeKatMsg(LONG_MSG_KAT_SEED, LONG_MSG_KAT_SIZE_BYTES);
+
+        Provider provider = Security.getProvider(EXPECTED_PROVIDER_NAME);
+        assertNotNull(provider);
+        for (String algorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            try {
+                KeyPair keyPair = importDefaultKatKeyPair(algorithm).getKeystoreBackedKeyPair();
+                String digest = TestUtils.getSignatureAlgorithmDigest(algorithm);
+                String keyAlgorithm = TestUtils.getSignatureAlgorithmKeyAlgorithm(algorithm);
+                if ((KeyProperties.DIGEST_NONE.equalsIgnoreCase(digest))
+                        && (!KeyProperties.KEY_ALGORITHM_EC.equalsIgnoreCase(keyAlgorithm))) {
+                    // This algorithm does not accept large messages
+                    Signature signature = Signature.getInstance(algorithm, provider);
+                    signature.initSign(keyPair.getPrivate());
+                    try {
+                        signature.update(message);
+                        byte[] sigBytes = signature.sign();
+                        fail("Unexpectedly generated signature (" + sigBytes.length + "): "
+                                + HexEncoding.encode(sigBytes));
+                    } catch (SignatureException expected) {}
+
+                    // Bogus signature generated using SHA-256 digest -- shouldn't because the
+                    // message is too long (and should not be digested/hashed) and because the
+                    // signature uses the wrong digest/hash.
+                    byte[] sigBytes = SHORT_MSG_KAT_SIGNATURES.get(
+                            "SHA256" + algorithm.substring("NONE".length()));
+                    assertNotNull(sigBytes);
+                    signature = Signature.getInstance(algorithm, provider);
+                    signature.initVerify(keyPair.getPublic());
+                    try {
+                        signature.update(message);
+                        signature.verify(sigBytes);
+                        fail();
+                    } catch (SignatureException expected) {}
+                    continue;
+                }
+
+                byte[] goodSigBytes = LONG_MSG_KAT_SIGNATURES.get(algorithm);
+                assertNotNull(goodSigBytes);
+
+                // Assert that AndroidKeyStore provider can verify the known good signature.
+                assertSignatureVerifiesOneShot(
+                        algorithm, provider, keyPair.getPublic(), message, goodSigBytes);
+                assertSignatureVerifiesFedUsingFixedSizeChunks(
+                        algorithm, provider, keyPair.getPublic(), message, goodSigBytes, 718871);
+
+                // Sign the message in one go
+                Signature signature = Signature.getInstance(algorithm, provider);
+                signature.initSign(keyPair.getPrivate());
+                signature.update(message);
+                byte[] generatedSigBytes = signature.sign();
+                String paddingScheme = TestUtils.getSignatureAlgorithmPadding(algorithm);
+                boolean deterministicSignatureScheme =
+                        KeyProperties.SIGNATURE_PADDING_RSA_PKCS1.equalsIgnoreCase(paddingScheme);
+                if (deterministicSignatureScheme) {
+                    MoreAsserts.assertEquals(goodSigBytes, generatedSigBytes);
+                } else {
+                    if (Math.abs(goodSigBytes.length - generatedSigBytes.length) > 2) {
+                        fail("Generated signature expected to be between "
+                                + (goodSigBytes.length - 2) + " and "
+                                + (goodSigBytes.length + 2) + " bytes long, but was: "
+                                + generatedSigBytes.length + " bytes: "
+                                + HexEncoding.encode(generatedSigBytes));
+                    }
+
+                    // Assert that the signature verifies using our own Provider
+                    assertSignatureVerifiesOneShot(
+                            algorithm, provider, keyPair.getPublic(), message, generatedSigBytes);
+                    assertSignatureVerifiesFedUsingFixedSizeChunks(
+                            algorithm, provider, keyPair.getPublic(), message, generatedSigBytes,
+                            718871);
+
+                    // Assert that the signature verifies using whatever Provider is chosen by JCA
+                    // by default for this signature algorithm and public key.
+                    assertSignatureVerifiesOneShot(
+                            algorithm, keyPair.getPublic(), message, generatedSigBytes);
+                }
+
+                // Sign the message by feeding it into the Signature one byte at a time
+                generatedSigBytes = generateSignatureFedUsingFixedSizeChunks(
+                        algorithm, provider, keyPair.getPrivate(), message, 444307);
+                if (deterministicSignatureScheme) {
+                    MoreAsserts.assertEquals(goodSigBytes, generatedSigBytes);
+                } else {
+                    if (Math.abs(goodSigBytes.length - generatedSigBytes.length) > 2) {
+                        fail("Generated signature expected to be between "
+                                + (goodSigBytes.length - 2) + " and "
+                                + (goodSigBytes.length + 2) + " bytes long, but was: "
+                                + generatedSigBytes.length + " bytes: "
+                                + HexEncoding.encode(generatedSigBytes));
+                    }
+                    // Assert that the signature verifies using our own Provider
+                    assertSignatureVerifiesOneShot(
+                            algorithm, provider, keyPair.getPublic(), message, generatedSigBytes);
+                    assertSignatureVerifiesFedUsingFixedSizeChunks(
+                            algorithm, provider, keyPair.getPublic(), message, generatedSigBytes,
+                            718871);
+
+                    // Assert that the signature verifies using whatever Provider is chosen by JCA
+                    // by default for this signature algorithm and public key.
+                    assertSignatureVerifiesOneShot(
+                            algorithm, keyPair.getPublic(), message, generatedSigBytes);
+                }
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitVerifySucceedsDespiteMissingAuthorizations() throws Exception {
+        KeyProtection spec = new KeyProtection.Builder(0).build();
+
+        for (String algorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            try {
+                assertInitVerifySucceeds(algorithm, spec);
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitSignFailsWhenNotAuthorizedToSign() throws Exception {
+        int badPurposes = KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT
+                | KeyProperties.PURPOSE_VERIFY;
+
+        for (String algorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            try {
+                KeyProtection good = getMinimalWorkingImportParamsForSigning(algorithm);
+                assertInitSignSucceeds(algorithm, good);
+                assertInitSignThrowsInvalidKeyException(algorithm,
+                        TestUtils.buildUpon(good, badPurposes).build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitVerifyIgnoresThatNotAuthorizedToVerify() throws Exception {
+        int badPurposes = KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT
+                | KeyProperties.PURPOSE_SIGN;
+
+        for (String algorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            try {
+                KeyProtection good = getMinimalWorkingImportParamsForVerifying(algorithm);
+                assertInitVerifySucceeds(algorithm, good);
+                assertInitVerifySucceeds(algorithm,
+                        TestUtils.buildUpon(good, badPurposes).build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitSignFailsWhenDigestNotAuthorized() throws Exception {
+        for (String algorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            try {
+                KeyProtection good = getMinimalWorkingImportParamsForSigning(algorithm);
+                assertInitSignSucceeds(algorithm, good);
+
+                String digest = TestUtils.getSignatureAlgorithmDigest(algorithm);
+                String badDigest =
+                        (KeyProperties.DIGEST_SHA256.equalsIgnoreCase(digest))
+                        ? KeyProperties.DIGEST_SHA384 : KeyProperties.DIGEST_SHA256;
+                assertInitSignThrowsInvalidKeyException(algorithm,
+                        TestUtils.buildUpon(good).setDigests(badDigest).build());
+
+                // Check that digest NONE is not treated as ANY.
+                if (!KeyProperties.DIGEST_NONE.equalsIgnoreCase(digest)) {
+                    assertInitSignThrowsInvalidKeyException(algorithm,
+                            TestUtils.buildUpon(good)
+                                    .setDigests(KeyProperties.DIGEST_NONE)
+                                    .build());
+                }
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitVerifyIgnoresThatDigestNotAuthorized() throws Exception {
+        for (String algorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            try {
+                KeyProtection good = getMinimalWorkingImportParamsForVerifying(algorithm);
+                assertInitVerifySucceeds(algorithm, good);
+
+                String digest = TestUtils.getSignatureAlgorithmDigest(algorithm);
+                String badDigest =
+                        (KeyProperties.DIGEST_SHA256.equalsIgnoreCase(digest))
+                        ? KeyProperties.DIGEST_SHA384 : KeyProperties.DIGEST_SHA256;
+                assertInitVerifySucceeds(algorithm,
+                        TestUtils.buildUpon(good).setDigests(badDigest).build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitSignFailsWhenPaddingNotAuthorized() throws Exception {
+        for (String algorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            try {
+                String paddingScheme = TestUtils.getSignatureAlgorithmPadding(algorithm);
+                String badPaddingScheme;
+                if (paddingScheme == null) {
+                    // No padding scheme used by this algorithm -- ignore.
+                    continue;
+                } else if (KeyProperties.SIGNATURE_PADDING_RSA_PKCS1.equalsIgnoreCase(
+                        paddingScheme)) {
+                    badPaddingScheme = KeyProperties.SIGNATURE_PADDING_RSA_PSS;
+                } else if (KeyProperties.SIGNATURE_PADDING_RSA_PSS.equalsIgnoreCase(
+                        paddingScheme)) {
+                    badPaddingScheme = KeyProperties.SIGNATURE_PADDING_RSA_PKCS1;
+                } else {
+                    throw new IllegalArgumentException("Unsupported algorithm: " + algorithm);
+                }
+
+                KeyProtection good = getMinimalWorkingImportParamsForSigning(algorithm);
+                assertInitSignSucceeds(algorithm, good);
+                assertInitSignThrowsInvalidKeyException(algorithm,
+                        TestUtils.buildUpon(good).setSignaturePaddings(badPaddingScheme).build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitVerifyIgnoresThatPaddingNotAuthorized() throws Exception {
+        for (String algorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            try {
+                String paddingScheme = TestUtils.getSignatureAlgorithmPadding(algorithm);
+                String badPaddingScheme;
+                if (paddingScheme == null) {
+                    // No padding scheme used by this algorithm -- ignore.
+                    continue;
+                } else if (KeyProperties.SIGNATURE_PADDING_RSA_PKCS1.equalsIgnoreCase(
+                        paddingScheme)) {
+                    badPaddingScheme = KeyProperties.SIGNATURE_PADDING_RSA_PSS;
+                } else if (KeyProperties.SIGNATURE_PADDING_RSA_PSS.equalsIgnoreCase(
+                        paddingScheme)) {
+                    badPaddingScheme = KeyProperties.SIGNATURE_PADDING_RSA_PKCS1;
+                } else {
+                    throw new IllegalArgumentException("Unsupported algorithm: " + algorithm);
+                }
+
+                KeyProtection good = getMinimalWorkingImportParamsForVerifying(algorithm);
+                assertInitVerifySucceeds(algorithm, good);
+                assertInitVerifySucceeds(algorithm,
+                        TestUtils.buildUpon(good).setSignaturePaddings(badPaddingScheme).build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitSignFailsWhenKeyNotYetValid() throws Exception {
+        Date badStartDate = new Date(System.currentTimeMillis() + DAY_IN_MILLIS);
+        for (String algorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            try {
+                KeyProtection good = getMinimalWorkingImportParamsForSigning(algorithm);
+                assertInitSignSucceeds(algorithm, good);
+                assertInitSignThrowsInvalidKeyException(algorithm,
+                        TestUtils.buildUpon(good).setKeyValidityStart(badStartDate).build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitVerifyIgnoresThatKeyNotYetValid() throws Exception {
+        Date badStartDate = new Date(System.currentTimeMillis() + DAY_IN_MILLIS);
+        for (String algorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            try {
+                KeyProtection good = getMinimalWorkingImportParamsForVerifying(algorithm);
+                assertInitVerifySucceeds(algorithm, good);
+                assertInitVerifySucceeds(algorithm,
+                        TestUtils.buildUpon(good).setKeyValidityStart(badStartDate).build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitSignFailsWhenKeyNoLongerValidForOrigination() throws Exception {
+        Date badEndDate = new Date(System.currentTimeMillis() - DAY_IN_MILLIS);
+        for (String algorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            try {
+                KeyProtection good = getMinimalWorkingImportParamsForSigning(algorithm);
+                assertInitSignSucceeds(algorithm, good);
+                assertInitSignThrowsInvalidKeyException(algorithm,
+                        TestUtils.buildUpon(good)
+                                .setKeyValidityForOriginationEnd(badEndDate)
+                                .build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitVerifyIgnoresThatKeyNoLongerValidForOrigination() throws Exception {
+        Date badEndDate = new Date(System.currentTimeMillis() - DAY_IN_MILLIS);
+        for (String algorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            try {
+                KeyProtection good = getMinimalWorkingImportParamsForVerifying(algorithm);
+                assertInitVerifySucceeds(algorithm, good);
+                assertInitVerifySucceeds(algorithm,
+                        TestUtils.buildUpon(good)
+                                .setKeyValidityForOriginationEnd(badEndDate)
+                                .build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitSignIgnoresThatKeyNoLongerValidForConsumption() throws Exception {
+        Date badEndDate = new Date(System.currentTimeMillis() - DAY_IN_MILLIS);
+        for (String algorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            try {
+                KeyProtection good = getMinimalWorkingImportParamsForSigning(algorithm);
+                assertInitSignSucceeds(algorithm, good);
+                assertInitSignSucceeds(algorithm,
+                        TestUtils.buildUpon(good)
+                                .setKeyValidityForConsumptionEnd(badEndDate)
+                                .build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    public void testInitVerifyIgnoresThatKeyNoLongerValidForConsumption() throws Exception {
+        Date badEndDate = new Date(System.currentTimeMillis() - DAY_IN_MILLIS);
+        for (String algorithm : EXPECTED_SIGNATURE_ALGORITHMS) {
+            try {
+                KeyProtection good = getMinimalWorkingImportParamsForVerifying(algorithm);
+                assertInitVerifySucceeds(algorithm, good);
+                assertInitVerifySucceeds(algorithm,
+                        TestUtils.buildUpon(good)
+                                .setKeyValidityForConsumptionEnd(badEndDate)
+                                .build());
+            } catch (Throwable e) {
+                throw new RuntimeException("Failed for " + algorithm, e);
+            }
+        }
+    }
+
+    private void assertInitVerifySucceeds(
+            String signatureAlgorithm,
+            KeyProtection keyProtection) throws Exception {
+        int[] resIds = getDefaultKeyAndCertResIds(signatureAlgorithm);
+        assertInitVerifySucceeds(
+                signatureAlgorithm,
+                resIds[0],
+                resIds[1],
+                keyProtection);
+    }
+
+    private void assertInitVerifySucceeds(
+            String signatureAlgorithm,
+            int privateKeyResId,
+            int certResId,
+            KeyProtection keyProtection) throws Exception {
+        PublicKey publicKey = TestUtils.importIntoAndroidKeyStore(
+                "test1", getContext(), privateKeyResId, certResId, keyProtection)
+                .getKeystoreBackedKeyPair()
+                .getPublic();
+        Signature signature = Signature.getInstance(signatureAlgorithm, EXPECTED_PROVIDER_NAME);
+        signature.initVerify(publicKey);
+    }
+
+    private void assertInitSignSucceeds(
+            String signatureAlgorithm,
+            KeyProtection keyProtection) throws Exception {
+        int[] resIds = getDefaultKeyAndCertResIds(signatureAlgorithm);
+        assertInitSignSucceeds(
+                signatureAlgorithm,
+                resIds[0],
+                resIds[1],
+                keyProtection);
+    }
+
+    private void assertInitSignSucceeds(
+            String signatureAlgorithm,
+            int privateKeyResId,
+            int certResId,
+            KeyProtection keyProtection) throws Exception {
+        PrivateKey privateKey = TestUtils.importIntoAndroidKeyStore(
+                "test1", getContext(), privateKeyResId, certResId, keyProtection)
+                .getKeystoreBackedKeyPair()
+                .getPrivate();
+        Signature signature = Signature.getInstance(signatureAlgorithm, EXPECTED_PROVIDER_NAME);
+        signature.initSign(privateKey);
+    }
+
+    private void assertInitSignThrowsInvalidKeyException(
+            String signatureAlgorithm,
+            KeyProtection keyProtection) throws Exception {
+        assertInitSignThrowsInvalidKeyException(null, signatureAlgorithm, keyProtection);
+    }
+
+    private void assertInitSignThrowsInvalidKeyException(
+            String message,
+            String signatureAlgorithm,
+            KeyProtection keyProtection) throws Exception {
+        int[] resIds = getDefaultKeyAndCertResIds(signatureAlgorithm);
+        assertInitSignThrowsInvalidKeyException(
+                message,
+                signatureAlgorithm,
+                resIds[0],
+                resIds[1],
+                keyProtection);
+    }
+
+    private void assertInitSignThrowsInvalidKeyException(
+            String message,
+            String signatureAlgorithm,
+            int privateKeyResId,
+            int certResId,
+            KeyProtection keyProtection) throws Exception {
+        PrivateKey privateKey = TestUtils.importIntoAndroidKeyStore(
+                "test1", getContext(), privateKeyResId, certResId, keyProtection)
+                .getKeystoreBackedKeyPair()
+                .getPrivate();
+        Signature signature = Signature.getInstance(signatureAlgorithm, EXPECTED_PROVIDER_NAME);
+        try {
+            signature.initSign(privateKey);
+            fail(message);
+        } catch (InvalidKeyException expected) {}
+    }
+
+    static int[] getDefaultKeyAndCertResIds(String signatureAlgorithm) {
+        String keyAlgorithm = TestUtils.getSignatureAlgorithmKeyAlgorithm(signatureAlgorithm);
+        if (KeyProperties.KEY_ALGORITHM_EC.equalsIgnoreCase(keyAlgorithm)) {
+            return new int[] {R.raw.ec_key1_pkcs8, R.raw.ec_key1_cert};
+        } else if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(keyAlgorithm)) {
+            return new int[] {R.raw.rsa_key1_pkcs8, R.raw.rsa_key1_cert};
+        } else {
+            throw new IllegalArgumentException("Unknown key algorithm: " + keyAlgorithm);
+        }
+    }
+
+    private ImportedKey importDefaultKatKeyPair(String signatureAlgorithm) throws Exception {
+        String keyAlgorithm = TestUtils.getSignatureAlgorithmKeyAlgorithm(signatureAlgorithm);
+        KeyProtection importParams =
+                TestUtils.getMinimalWorkingImportParametersForSigningingWith(signatureAlgorithm);
+        if (KeyProperties.KEY_ALGORITHM_EC.equalsIgnoreCase(keyAlgorithm)) {
+            return TestUtils.importIntoAndroidKeyStore(
+                    "testEc",
+                    getContext(),
+                    R.raw.ec_key1_pkcs8,
+                    R.raw.ec_key1_cert,
+                    importParams);
+        } else if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(keyAlgorithm)) {
+            return TestUtils.importIntoAndroidKeyStore(
+                    "testRsa",
+                    getContext(),
+                    R.raw.rsa_key1_pkcs8,
+                    R.raw.rsa_key1_cert,
+                    importParams);
+        } else {
+            throw new IllegalArgumentException("Unsupported key algorithm: " + keyAlgorithm);
+        }
+    }
+
+    private void assertSignatureVerifiesOneShot(
+            String algorithm,
+            PublicKey publicKey,
+            byte[] message,
+            byte[] signature) throws Exception {
+        assertSignatureVerifiesOneShot(algorithm, null, publicKey, message, signature);
+    }
+
+    private void assertSignatureVerifiesOneShot(
+            String algorithm,
+            Provider provider,
+            PublicKey publicKey,
+            byte[] message,
+            byte[] signature) throws Exception {
+        Signature sig = (provider != null)
+                ? Signature.getInstance(algorithm, provider) : Signature.getInstance(algorithm);
+        sig.initVerify(publicKey);
+        sig.update(message);
+        if (!sig.verify(signature)) {
+            fail("Signature did not verify. algorithm: " + algorithm
+                    + ", provider: " + sig.getProvider().getName()
+                    + ", signature (" + signature.length + " bytes): "
+                    + HexEncoding.encode(signature));
+        }
+    }
+
+    private void assertSignatureDoesNotVerifyOneShot(
+            String algorithm,
+            Provider provider,
+            PublicKey publicKey,
+            byte[] message,
+            byte[] signature) throws Exception {
+        Signature sig = (provider != null)
+                ? Signature.getInstance(algorithm, provider) : Signature.getInstance(algorithm);
+        sig.initVerify(publicKey);
+        sig.update(message);
+        if (sig.verify(signature)) {
+            fail("Signature verified unexpectedly. algorithm: " + algorithm
+                    + ", provider: " + sig.getProvider().getName()
+                    + ", signature (" + signature.length + " bytes): "
+                    + HexEncoding.encode(signature));
+        }
+    }
+
+    private void assertSignatureVerifiesFedOneByteAtATime(
+            String algorithm,
+            Provider provider,
+            PublicKey publicKey,
+            byte[] message,
+            byte[] signature) throws Exception {
+        Signature sig = (provider != null)
+                ? Signature.getInstance(algorithm, provider) : Signature.getInstance(algorithm);
+        sig.initVerify(publicKey);
+        for (int i = 0; i < message.length; i++) {
+            sig.update(message[i]);
+        }
+        if (!sig.verify(signature)) {
+            fail("Signature did not verify. algorithm: " + algorithm
+                    + ", provider: " + sig.getProvider().getName()
+                    + ", signature (" + signature.length + " bytes): "
+                    + HexEncoding.encode(signature));
+        }
+    }
+
+    private byte[] generateSignatureFedUsingFixedSizeChunks(
+            String algorithm,
+            Provider expectedProvider,
+            PrivateKey privateKey,
+            byte[] message,
+            int chunkSizeBytes) throws Exception {
+        Signature signature = Signature.getInstance(algorithm);
+        signature.initSign(privateKey);
+        assertSame(expectedProvider, signature.getProvider());
+        int messageRemaining = message.length;
+        int messageOffset = 0;
+        while (messageRemaining > 0) {
+            int actualChunkSizeBytes =  Math.min(chunkSizeBytes, messageRemaining);
+            signature.update(message, messageOffset, actualChunkSizeBytes);
+            messageOffset += actualChunkSizeBytes;
+            messageRemaining -= actualChunkSizeBytes;
+        }
+        return signature.sign();
+    }
+
+    private void assertSignatureVerifiesFedUsingFixedSizeChunks(
+            String algorithm,
+            Provider provider,
+            PublicKey publicKey,
+            byte[] message,
+            byte[] signature,
+            int chunkSizeBytes) throws Exception {
+        Signature sig = (provider != null)
+                ? Signature.getInstance(algorithm, provider) : Signature.getInstance(algorithm);
+        sig.initVerify(publicKey);
+        int messageRemaining = message.length;
+        int messageOffset = 0;
+        while (messageRemaining > 0) {
+            int actualChunkSizeBytes =  Math.min(chunkSizeBytes, messageRemaining);
+            sig.update(message, messageOffset, actualChunkSizeBytes);
+            messageOffset += actualChunkSizeBytes;
+            messageRemaining -= actualChunkSizeBytes;
+        }
+        if (!sig.verify(signature)) {
+            fail("Signature did not verify. algorithm: " + algorithm
+                    + ", provider: " + sig.getProvider().getName()
+                    + ", signature (" + signature.length + " bytes): "
+                    + HexEncoding.encode(signature));
+        }
+    }
+
+    private static KeyProtection getMinimalWorkingImportParamsForSigning(String algorithm) {
+        return TestUtils.getMinimalWorkingImportParametersForSigningingWith(algorithm);
+    }
+
+    private static KeyProtection getMinimalWorkingImportParamsForVerifying(
+            @SuppressWarnings("unused") String algorithm) {
+        // No need to authorize anything because verification does not use the private key.
+        // Operations using public keys do not need authorization.
+        return new KeyProtection.Builder(0).build();
+    }
+
+    static Collection<ImportedKey> importKatKeyPairsForSigning(
+            Context context, String signatureAlgorithm) throws Exception {
+        String keyAlgorithm = TestUtils.getSignatureAlgorithmKeyAlgorithm(signatureAlgorithm);
+        KeyProtection importParams =
+                TestUtils.getMinimalWorkingImportParametersForSigningingWith(signatureAlgorithm);
+        if (KeyProperties.KEY_ALGORITHM_EC.equalsIgnoreCase(keyAlgorithm)) {
+            return ECDSASignatureTest.importKatKeyPairs(context, importParams);
+        } else if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(keyAlgorithm)) {
+            return RSASignatureTest.importKatKeyPairs(context, importParams);
+        } else {
+            throw new IllegalArgumentException("Unsupported key algorithm: " + keyAlgorithm);
+        }
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/TestUtils.java b/tests/tests/keystore/src/android/keystore/cts/TestUtils.java
new file mode 100644
index 0000000..85b8869
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/TestUtils.java
@@ -0,0 +1,910 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+import android.content.Context;
+import android.security.keystore.KeyGenParameterSpec;
+import android.security.keystore.KeyInfo;
+import android.security.keystore.KeyProperties;
+import android.security.keystore.KeyProtection;
+import android.test.MoreAsserts;
+import junit.framework.Assert;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigInteger;
+import java.security.Key;
+import java.security.KeyFactory;
+import java.security.KeyPair;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.UnrecoverableEntryException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.security.interfaces.ECKey;
+import java.security.interfaces.ECPrivateKey;
+import java.security.interfaces.ECPublicKey;
+import java.security.interfaces.RSAKey;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.ECParameterSpec;
+import java.security.spec.EllipticCurve;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.SecretKeySpec;
+
+abstract class TestUtils extends Assert {
+
+    static final String EXPECTED_CRYPTO_OP_PROVIDER_NAME = "AndroidKeyStoreBCWorkaround";
+    static final String EXPECTED_PROVIDER_NAME = "AndroidKeyStore";
+
+    static final long DAY_IN_MILLIS = 1000 * 60 * 60 * 24;
+
+
+    private TestUtils() {}
+
+    /**
+     * Asserts the the key algorithm and algorithm-specific parameters of the two keys in the
+     * provided pair match.
+     */
+    static void assertKeyPairSelfConsistent(KeyPair keyPair) {
+        assertKeyPairSelfConsistent(keyPair.getPublic(), keyPair.getPrivate());
+    }
+
+    /**
+     * Asserts the the key algorithm and public algorithm-specific parameters of the two provided
+     * keys match.
+     */
+    static void assertKeyPairSelfConsistent(PublicKey publicKey, PrivateKey privateKey) {
+        assertNotNull(publicKey);
+        assertNotNull(privateKey);
+        assertEquals(publicKey.getAlgorithm(), privateKey.getAlgorithm());
+        String keyAlgorithm = publicKey.getAlgorithm();
+        if ("EC".equalsIgnoreCase(keyAlgorithm)) {
+            assertTrue("EC public key must be instanceof ECKey: "
+                    + publicKey.getClass().getName(),
+                    publicKey instanceof ECKey);
+            assertTrue("EC private key must be instanceof ECKey: "
+                    + privateKey.getClass().getName(),
+                    privateKey instanceof ECKey);
+            assertECParameterSpecEqualsIgnoreSeedIfNotPresent(
+                    "Private key must have the same EC parameters as public key",
+                    ((ECKey) publicKey).getParams(), ((ECKey) privateKey).getParams());
+        } else if ("RSA".equalsIgnoreCase(keyAlgorithm)) {
+            assertTrue("RSA public key must be instance of RSAKey: "
+                    + publicKey.getClass().getName(),
+                    publicKey instanceof RSAKey);
+            assertTrue("RSA private key must be instance of RSAKey: "
+                    + privateKey.getClass().getName(),
+                    privateKey instanceof RSAKey);
+            assertEquals("Private and public key must have the same RSA modulus",
+                    ((RSAKey) publicKey).getModulus(), ((RSAKey) privateKey).getModulus());
+        } else {
+            fail("Unsuported key algorithm: " + keyAlgorithm);
+        }
+    }
+
+    static int getKeySizeBits(Key key) {
+        if (key instanceof ECKey) {
+            return ((ECKey) key).getParams().getCurve().getField().getFieldSize();
+        } else if (key instanceof RSAKey) {
+            return ((RSAKey) key).getModulus().bitLength();
+        } else {
+            throw new IllegalArgumentException("Unsupported key type: " + key.getClass());
+        }
+    }
+
+    static void assertKeySize(int expectedSizeBits, KeyPair keyPair) {
+        assertEquals(expectedSizeBits, getKeySizeBits(keyPair.getPrivate()));
+        assertEquals(expectedSizeBits, getKeySizeBits(keyPair.getPublic()));
+    }
+
+    /**
+     * Asserts that the provided key pair is an Android Keystore key pair stored under the provided
+     * alias.
+     */
+    static void assertKeyStoreKeyPair(KeyStore keyStore, String alias, KeyPair keyPair) {
+        assertKeyMaterialExportable(keyPair.getPublic());
+        assertKeyMaterialNotExportable(keyPair.getPrivate());
+        assertTransparentKey(keyPair.getPublic());
+        assertOpaqueKey(keyPair.getPrivate());
+
+        KeyStore.Entry entry;
+        Certificate cert;
+        try {
+            entry = keyStore.getEntry(alias, null);
+            cert = keyStore.getCertificate(alias);
+        } catch (KeyStoreException | UnrecoverableEntryException | NoSuchAlgorithmException e) {
+            throw new RuntimeException("Failed to load entry: " + alias, e);
+        }
+        assertNotNull(entry);
+
+        assertTrue(entry instanceof KeyStore.PrivateKeyEntry);
+        KeyStore.PrivateKeyEntry privEntry = (KeyStore.PrivateKeyEntry) entry;
+        assertEquals(cert, privEntry.getCertificate());
+        assertTrue("Certificate must be an X.509 certificate: " + cert.getClass(),
+                cert instanceof X509Certificate);
+        final X509Certificate x509Cert = (X509Certificate) cert;
+
+        PrivateKey keystorePrivateKey = privEntry.getPrivateKey();
+        PublicKey keystorePublicKey = cert.getPublicKey();
+        assertEquals(keyPair.getPrivate(), keystorePrivateKey);
+        assertEquals(keyPair.getPublic(), keystorePublicKey);
+
+        assertEquals(
+                "Public key used to sign certificate should have the same algorithm as in KeyPair",
+                keystorePublicKey.getAlgorithm(), x509Cert.getPublicKey().getAlgorithm());
+
+        Certificate[] chain = privEntry.getCertificateChain();
+        if (chain.length == 0) {
+            fail("Empty certificate chain");
+            return;
+        }
+        assertEquals(cert, chain[0]);
+    }
+
+
+    private static void assertKeyMaterialExportable(Key key) {
+        if (key instanceof PublicKey) {
+            assertEquals("X.509", key.getFormat());
+        } else if (key instanceof PrivateKey) {
+            assertEquals("PKCS#8", key.getFormat());
+        } else if (key instanceof SecretKey) {
+            assertEquals("RAW", key.getFormat());
+        } else {
+            fail("Unsupported key type: " + key.getClass().getName());
+        }
+        byte[] encodedForm = key.getEncoded();
+        assertNotNull(encodedForm);
+        if (encodedForm.length == 0) {
+            fail("Empty encoded form");
+        }
+    }
+
+    private static void assertKeyMaterialNotExportable(Key key) {
+        assertEquals(null, key.getFormat());
+        assertEquals(null, key.getEncoded());
+    }
+
+    private static void assertOpaqueKey(Key key) {
+        assertFalse(key.getClass().getName() + " is a transparent key", isTransparentKey(key));
+    }
+
+    private static void assertTransparentKey(Key key) {
+        assertTrue(key.getClass().getName() + " is not a transparent key", isTransparentKey(key));
+    }
+
+    private static boolean isTransparentKey(Key key) {
+        if (key instanceof PrivateKey) {
+            return (key instanceof ECPrivateKey) || (key instanceof RSAPrivateKey);
+        } else if (key instanceof PublicKey) {
+            return (key instanceof ECPublicKey) || (key instanceof RSAPublicKey);
+        } else if (key instanceof SecretKey) {
+            return (key instanceof SecretKeySpec);
+        } else {
+            throw new IllegalArgumentException("Unsupported key type: " + key.getClass().getName());
+        }
+    }
+
+    static void assertECParameterSpecEqualsIgnoreSeedIfNotPresent(
+            ECParameterSpec expected, ECParameterSpec actual) {
+        assertECParameterSpecEqualsIgnoreSeedIfNotPresent(null, expected, actual);
+    }
+
+    static void assertECParameterSpecEqualsIgnoreSeedIfNotPresent(String message,
+            ECParameterSpec expected, ECParameterSpec actual) {
+        EllipticCurve expectedCurve = expected.getCurve();
+        EllipticCurve actualCurve = actual.getCurve();
+        String msgPrefix = (message != null) ? message + ": " : "";
+        assertEquals(msgPrefix + "curve field", expectedCurve.getField(), actualCurve.getField());
+        assertEquals(msgPrefix + "curve A", expectedCurve.getA(), actualCurve.getA());
+        assertEquals(msgPrefix + "curve B", expectedCurve.getB(), actualCurve.getB());
+        assertEquals(msgPrefix + "order", expected.getOrder(), actual.getOrder());
+        assertEquals(msgPrefix + "generator",
+                expected.getGenerator(), actual.getGenerator());
+        assertEquals(msgPrefix + "cofactor", expected.getCofactor(), actual.getCofactor());
+
+        // If present, the seed must be the same
+        byte[] expectedSeed = expectedCurve.getSeed();
+        byte[] actualSeed = expectedCurve.getSeed();
+        if ((expectedSeed != null) && (actualSeed != null)) {
+            MoreAsserts.assertEquals(expectedSeed, actualSeed);
+        }
+    }
+
+    static KeyInfo getKeyInfo(Key key) throws InvalidKeySpecException, NoSuchAlgorithmException,
+            NoSuchProviderException {
+        if ((key instanceof PrivateKey) || (key instanceof PublicKey)) {
+            return KeyFactory.getInstance(key.getAlgorithm(), "AndroidKeyStore")
+                    .getKeySpec(key, KeyInfo.class);
+        } else if (key instanceof SecretKey) {
+            return (KeyInfo) SecretKeyFactory.getInstance(key.getAlgorithm(), "AndroidKeyStore")
+                    .getKeySpec((SecretKey) key, KeyInfo.class);
+        } else {
+            throw new IllegalArgumentException("Unexpected key type: " + key.getClass());
+        }
+    }
+
+    static <T> void assertContentsInAnyOrder(Iterable<T> actual, T... expected) {
+        assertContentsInAnyOrder(null, actual, expected);
+    }
+
+    static <T> void assertContentsInAnyOrder(String message, Iterable<T> actual, T... expected) {
+        Map<T, Integer> actualFreq = getFrequencyTable(actual);
+        Map<T, Integer> expectedFreq = getFrequencyTable(expected);
+        if (actualFreq.equals(expectedFreq)) {
+            return;
+        }
+
+        Map<T, Integer> extraneousFreq = new HashMap<T, Integer>();
+        for (Map.Entry<T, Integer> actualEntry : actualFreq.entrySet()) {
+            int actualCount = actualEntry.getValue();
+            Integer expectedCount = expectedFreq.get(actualEntry.getKey());
+            int diff = actualCount - ((expectedCount != null) ? expectedCount : 0);
+            if (diff > 0) {
+                extraneousFreq.put(actualEntry.getKey(), diff);
+            }
+        }
+
+        Map<T, Integer> missingFreq = new HashMap<T, Integer>();
+        for (Map.Entry<T, Integer> expectedEntry : expectedFreq.entrySet()) {
+            int expectedCount = expectedEntry.getValue();
+            Integer actualCount = actualFreq.get(expectedEntry.getKey());
+            int diff = expectedCount - ((actualCount != null) ? actualCount : 0);
+            if (diff > 0) {
+                missingFreq.put(expectedEntry.getKey(), diff);
+            }
+        }
+
+        List<T> extraneous = frequencyTableToValues(extraneousFreq);
+        List<T> missing = frequencyTableToValues(missingFreq);
+        StringBuilder result = new StringBuilder();
+        String delimiter = "";
+        if (message != null) {
+            result.append(message).append(".");
+            delimiter = " ";
+        }
+        if (!missing.isEmpty()) {
+            result.append(delimiter).append("missing: " + missing);
+            delimiter = ", ";
+        }
+        if (!extraneous.isEmpty()) {
+            result.append(delimiter).append("extraneous: " + extraneous);
+        }
+        fail(result.toString());
+    }
+
+    private static <T> Map<T, Integer> getFrequencyTable(Iterable<T> values) {
+        Map<T, Integer> result = new HashMap<T, Integer>();
+        for (T value : values) {
+            Integer count = result.get(value);
+            if (count == null) {
+                count = 1;
+            } else {
+                count++;
+            }
+            result.put(value, count);
+        }
+        return result;
+    }
+
+    private static <T> Map<T, Integer> getFrequencyTable(T... values) {
+        Map<T, Integer> result = new HashMap<T, Integer>();
+        for (T value : values) {
+            Integer count = result.get(value);
+            if (count == null) {
+                count = 1;
+            } else {
+                count++;
+            }
+            result.put(value, count);
+        }
+        return result;
+    }
+
+    @SuppressWarnings("rawtypes")
+    private static <T> List<T> frequencyTableToValues(Map<T, Integer> table) {
+        if (table.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        List<T> result = new ArrayList<T>();
+        boolean comparableValues = true;
+        for (Map.Entry<T, Integer> entry : table.entrySet()) {
+            T value = entry.getKey();
+            if (!(value instanceof Comparable)) {
+                comparableValues = false;
+            }
+            int frequency = entry.getValue();
+            for (int i = 0; i < frequency; i++) {
+                result.add(value);
+            }
+        }
+
+        if (comparableValues) {
+            sortAssumingComparable(result);
+        }
+        return result;
+    }
+
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    private static void sortAssumingComparable(List<?> values) {
+        Collections.sort((List<Comparable>)values);
+    }
+
+    static String[] toLowerCase(String... values) {
+        if (values == null) {
+            return null;
+        }
+        String[] result = new String[values.length];
+        for (int i = 0; i < values.length; i++) {
+            String value = values[i];
+            result[i] = (value != null) ? value.toLowerCase() : null;
+        }
+        return result;
+    }
+
+    static PrivateKey getRawResPrivateKey(Context context, int resId) throws Exception {
+        byte[] pkcs8EncodedForm;
+        try (InputStream in = context.getResources().openRawResource(resId)) {
+            pkcs8EncodedForm = drain(in);
+        }
+        PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(pkcs8EncodedForm);
+
+        try {
+            return KeyFactory.getInstance("EC").generatePrivate(privateKeySpec);
+        } catch (InvalidKeySpecException e) {
+            try {
+                return KeyFactory.getInstance("RSA").generatePrivate(privateKeySpec);
+            } catch (InvalidKeySpecException e2) {
+                throw new InvalidKeySpecException("The key is neither EC nor RSA", e);
+            }
+        }
+    }
+
+    static X509Certificate getRawResX509Certificate(Context context, int resId) throws Exception {
+        try (InputStream in = context.getResources().openRawResource(resId)) {
+            return (X509Certificate) CertificateFactory.getInstance("X.509")
+                    .generateCertificate(in);
+        }
+    }
+
+    static KeyPair importIntoAndroidKeyStore(
+            String alias,
+            PrivateKey privateKey,
+            Certificate certificate,
+            KeyProtection keyProtection) throws Exception {
+        KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
+        keyStore.load(null);
+        keyStore.setEntry(alias,
+                new KeyStore.PrivateKeyEntry(privateKey, new Certificate[] {certificate}),
+                keyProtection);
+        return new KeyPair(
+                keyStore.getCertificate(alias).getPublicKey(),
+                (PrivateKey) keyStore.getKey(alias, null));
+    }
+
+    static ImportedKey importIntoAndroidKeyStore(
+            String alias,
+            SecretKey key,
+            KeyProtection keyProtection) throws Exception {
+        KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
+        keyStore.load(null);
+        keyStore.setEntry(alias,
+                new KeyStore.SecretKeyEntry(key),
+                keyProtection);
+        return new ImportedKey(alias, key, (SecretKey) keyStore.getKey(alias, null));
+    }
+
+    static ImportedKey importIntoAndroidKeyStore(
+            String alias, Context context, int privateResId, int certResId, KeyProtection params)
+                    throws Exception {
+        Certificate originalCert = TestUtils.getRawResX509Certificate(context, certResId);
+        PublicKey originalPublicKey = originalCert.getPublicKey();
+        PrivateKey originalPrivateKey = TestUtils.getRawResPrivateKey(context, privateResId);
+
+        // Check that the domain parameters match between the private key and the public key. This
+        // is to catch accidental errors where a test provides the wrong resource ID as one of the
+        // parameters.
+        if (!originalPublicKey.getAlgorithm().equalsIgnoreCase(originalPrivateKey.getAlgorithm())) {
+            throw new IllegalArgumentException("Key algorithm mismatch."
+                    + " Public: " + originalPublicKey.getAlgorithm()
+                    + ", private: " + originalPrivateKey.getAlgorithm());
+        }
+        assertKeyPairSelfConsistent(originalPublicKey, originalPrivateKey);
+
+        KeyPair keystoreBacked = TestUtils.importIntoAndroidKeyStore(
+                alias, originalPrivateKey, originalCert,
+                params);
+        assertKeyPairSelfConsistent(keystoreBacked);
+        assertKeyPairSelfConsistent(keystoreBacked.getPublic(), originalPrivateKey);
+        return new ImportedKey(
+                alias,
+                new KeyPair(originalCert.getPublicKey(), originalPrivateKey),
+                keystoreBacked);
+    }
+
+    static byte[] drain(InputStream in) throws IOException {
+        ByteArrayOutputStream result = new ByteArrayOutputStream();
+        byte[] buffer = new byte[16 * 1024];
+        int chunkSize;
+        while ((chunkSize = in.read(buffer)) != -1) {
+            result.write(buffer, 0, chunkSize);
+        }
+        return result.toByteArray();
+    }
+
+    static KeyProtection.Builder buildUpon(KeyProtection params) {
+        return buildUponInternal(params, null);
+    }
+
+    static KeyProtection.Builder buildUpon(KeyProtection params, int newPurposes) {
+        return buildUponInternal(params, newPurposes);
+    }
+
+    static KeyProtection.Builder buildUpon(
+            KeyProtection.Builder builder) {
+        return buildUponInternal(builder.build(), null);
+    }
+
+    static KeyProtection.Builder buildUpon(
+            KeyProtection.Builder builder, int newPurposes) {
+        return buildUponInternal(builder.build(), newPurposes);
+    }
+
+    private static KeyProtection.Builder buildUponInternal(
+            KeyProtection spec, Integer newPurposes) {
+        int purposes = (newPurposes == null) ? spec.getPurposes() : newPurposes;
+        KeyProtection.Builder result = new KeyProtection.Builder(purposes);
+        result.setBlockModes(spec.getBlockModes());
+        if (spec.isDigestsSpecified()) {
+            result.setDigests(spec.getDigests());
+        }
+        result.setEncryptionPaddings(spec.getEncryptionPaddings());
+        result.setSignaturePaddings(spec.getSignaturePaddings());
+        result.setKeyValidityStart(spec.getKeyValidityStart());
+        result.setKeyValidityForOriginationEnd(spec.getKeyValidityForOriginationEnd());
+        result.setKeyValidityForConsumptionEnd(spec.getKeyValidityForConsumptionEnd());
+        result.setRandomizedEncryptionRequired(spec.isRandomizedEncryptionRequired());
+        result.setUserAuthenticationRequired(spec.isUserAuthenticationRequired());
+        result.setUserAuthenticationValidityDurationSeconds(
+                spec.getUserAuthenticationValidityDurationSeconds());
+        return result;
+    }
+
+    static KeyGenParameterSpec.Builder buildUpon(KeyGenParameterSpec spec) {
+        return buildUponInternal(spec, null);
+    }
+
+    static KeyGenParameterSpec.Builder buildUpon(KeyGenParameterSpec spec, int newPurposes) {
+        return buildUponInternal(spec, newPurposes);
+    }
+
+    static KeyGenParameterSpec.Builder buildUpon(
+            KeyGenParameterSpec.Builder builder) {
+        return buildUponInternal(builder.build(), null);
+    }
+
+    static KeyGenParameterSpec.Builder buildUpon(
+            KeyGenParameterSpec.Builder builder, int newPurposes) {
+        return buildUponInternal(builder.build(), newPurposes);
+    }
+
+    private static KeyGenParameterSpec.Builder buildUponInternal(
+            KeyGenParameterSpec spec, Integer newPurposes) {
+        int purposes = (newPurposes == null) ? spec.getPurposes() : newPurposes;
+        KeyGenParameterSpec.Builder result =
+                new KeyGenParameterSpec.Builder(spec.getKeystoreAlias(), purposes);
+        if (spec.getKeySize() >= 0) {
+            result.setKeySize(spec.getKeySize());
+        }
+        if (spec.getAlgorithmParameterSpec() != null) {
+            result.setAlgorithmParameterSpec(spec.getAlgorithmParameterSpec());
+        }
+        result.setCertificateNotBefore(spec.getCertificateNotBefore());
+        result.setCertificateNotAfter(spec.getCertificateNotAfter());
+        result.setCertificateSerialNumber(spec.getCertificateSerialNumber());
+        result.setCertificateSubject(spec.getCertificateSubject());
+        result.setBlockModes(spec.getBlockModes());
+        if (spec.isDigestsSpecified()) {
+            result.setDigests(spec.getDigests());
+        }
+        result.setEncryptionPaddings(spec.getEncryptionPaddings());
+        result.setSignaturePaddings(spec.getSignaturePaddings());
+        result.setKeyValidityStart(spec.getKeyValidityStart());
+        result.setKeyValidityForOriginationEnd(spec.getKeyValidityForOriginationEnd());
+        result.setKeyValidityForConsumptionEnd(spec.getKeyValidityForConsumptionEnd());
+        result.setRandomizedEncryptionRequired(spec.isRandomizedEncryptionRequired());
+        result.setUserAuthenticationRequired(spec.isUserAuthenticationRequired());
+        result.setUserAuthenticationValidityDurationSeconds(
+                spec.getUserAuthenticationValidityDurationSeconds());
+        return result;
+    }
+
+    static KeyPair getKeyPairForKeyAlgorithm(String keyAlgorithm, Iterable<KeyPair> keyPairs) {
+        for (KeyPair keyPair : keyPairs) {
+            if (keyAlgorithm.equalsIgnoreCase(keyPair.getPublic().getAlgorithm())) {
+                return keyPair;
+            }
+        }
+        throw new IllegalArgumentException("No KeyPair for key algorithm " + keyAlgorithm);
+    }
+
+    static Key getKeyForKeyAlgorithm(String keyAlgorithm, Iterable<? extends Key> keys) {
+        for (Key key : keys) {
+            if (keyAlgorithm.equalsIgnoreCase(key.getAlgorithm())) {
+                return key;
+            }
+        }
+        throw new IllegalArgumentException("No Key for key algorithm " + keyAlgorithm);
+    }
+
+    static byte[] generateLargeKatMsg(byte[] seed, int msgSizeBytes) throws Exception {
+        byte[] result = new byte[msgSizeBytes];
+        MessageDigest digest = MessageDigest.getInstance("SHA-512");
+        int resultOffset = 0;
+        int resultRemaining = msgSizeBytes;
+        while (resultRemaining > 0) {
+            seed = digest.digest(seed);
+            int chunkSize = Math.min(seed.length, resultRemaining);
+            System.arraycopy(seed, 0, result, resultOffset, chunkSize);
+            resultOffset += chunkSize;
+            resultRemaining -= chunkSize;
+        }
+        return result;
+    }
+
+    static byte[] leftPadWithZeroBytes(byte[] array, int length) {
+        if (array.length >= length) {
+            return array;
+        }
+        byte[] result = new byte[length];
+        System.arraycopy(array, 0, result, result.length - array.length, array.length);
+        return result;
+    }
+
+    static boolean contains(int[] array, int value) {
+        for (int element : array) {
+            if (element == value) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    static boolean isHmacAlgorithm(String algorithm) {
+        return algorithm.toUpperCase(Locale.US).startsWith("HMAC");
+    }
+
+    static String getHmacAlgorithmDigest(String algorithm) {
+        String algorithmUpperCase = algorithm.toUpperCase(Locale.US);
+        if (!algorithmUpperCase.startsWith("HMAC")) {
+            return null;
+        }
+        String result = algorithmUpperCase.substring("HMAC".length());
+        if (result.startsWith("SHA")) {
+            result = "SHA-" + result.substring("SHA".length());
+        }
+        return result;
+    }
+
+    static String getCipherKeyAlgorithm(String transformation) {
+        String transformationUpperCase = transformation.toUpperCase(Locale.US);
+        if (transformationUpperCase.startsWith("AES/")) {
+            return KeyProperties.KEY_ALGORITHM_AES;
+        } else if (transformationUpperCase.startsWith("RSA/")) {
+            return KeyProperties.KEY_ALGORITHM_RSA;
+        } else {
+            throw new IllegalArgumentException("Unsupported transformation: " + transformation);
+        }
+    }
+
+    static boolean isCipherSymmetric(String transformation) {
+        String transformationUpperCase = transformation.toUpperCase(Locale.US);
+        if (transformationUpperCase.startsWith("AES/")) {
+            return true;
+        } else if (transformationUpperCase.startsWith("RSA/")) {
+            return false;
+        } else {
+            throw new IllegalArgumentException("Unsupported transformation: " + transformation);
+        }
+    }
+
+    static String getCipherDigest(String transformation) {
+        String transformationUpperCase = transformation.toUpperCase(Locale.US);
+        if (transformationUpperCase.contains("/OAEP")) {
+            if (transformationUpperCase.endsWith("/OAEPPADDING")) {
+                return KeyProperties.DIGEST_SHA1;
+            } else if (transformationUpperCase.endsWith(
+                    "/OAEPWITHSHA-1ANDMGF1PADDING")) {
+                return KeyProperties.DIGEST_SHA1;
+            } else if (transformationUpperCase.endsWith(
+                    "/OAEPWITHSHA-224ANDMGF1PADDING")) {
+                return KeyProperties.DIGEST_SHA224;
+            } else if (transformationUpperCase.endsWith(
+                    "/OAEPWITHSHA-256ANDMGF1PADDING")) {
+                return KeyProperties.DIGEST_SHA256;
+            } else if (transformationUpperCase.endsWith(
+                    "/OAEPWITHSHA-384ANDMGF1PADDING")) {
+                return KeyProperties.DIGEST_SHA384;
+            } else if (transformationUpperCase.endsWith(
+                    "/OAEPWITHSHA-512ANDMGF1PADDING")) {
+                return KeyProperties.DIGEST_SHA512;
+            } else {
+                throw new RuntimeException("Unsupported OAEP padding scheme: "
+                        + transformation);
+            }
+        } else {
+            return null;
+        }
+    }
+
+    static String getCipherEncryptionPadding(String transformation) {
+        String transformationUpperCase = transformation.toUpperCase(Locale.US);
+        if (transformationUpperCase.endsWith("/NOPADDING")) {
+            return KeyProperties.ENCRYPTION_PADDING_NONE;
+        } else if (transformationUpperCase.endsWith("/PKCS7PADDING")) {
+            return KeyProperties.ENCRYPTION_PADDING_PKCS7;
+        } else if (transformationUpperCase.endsWith("/PKCS1PADDING")) {
+            return KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1;
+        } else if (transformationUpperCase.split("/")[2].startsWith("OAEP")) {
+            return KeyProperties.ENCRYPTION_PADDING_RSA_OAEP;
+        } else {
+            throw new IllegalArgumentException("Unsupported transformation: " + transformation);
+        }
+    }
+
+    static String getCipherBlockMode(String transformation) {
+        return transformation.split("/")[1].toUpperCase(Locale.US);
+    }
+
+    static String getSignatureAlgorithmDigest(String algorithm) {
+        String algorithmUpperCase = algorithm.toUpperCase(Locale.US);
+        int withIndex = algorithmUpperCase.indexOf("WITH");
+        if (withIndex == -1) {
+            throw new IllegalArgumentException("Unsupported algorithm: " + algorithm);
+        }
+        String digest = algorithmUpperCase.substring(0, withIndex);
+        if (digest.startsWith("SHA")) {
+            digest = "SHA-" + digest.substring("SHA".length());
+        }
+        return digest;
+    }
+
+    static String getSignatureAlgorithmPadding(String algorithm) {
+        String algorithmUpperCase = algorithm.toUpperCase(Locale.US);
+        if (algorithmUpperCase.endsWith("WITHECDSA")) {
+            return null;
+        } else if (algorithmUpperCase.endsWith("WITHRSA")) {
+            return KeyProperties.SIGNATURE_PADDING_RSA_PKCS1;
+        } else if (algorithmUpperCase.endsWith("WITHRSA/PSS")) {
+            return KeyProperties.SIGNATURE_PADDING_RSA_PSS;
+        } else {
+            throw new IllegalArgumentException("Unsupported algorithm: " + algorithm);
+        }
+    }
+
+    static String getSignatureAlgorithmKeyAlgorithm(String algorithm) {
+        String algorithmUpperCase = algorithm.toUpperCase(Locale.US);
+        if (algorithmUpperCase.endsWith("WITHECDSA")) {
+            return KeyProperties.KEY_ALGORITHM_EC;
+        } else if ((algorithmUpperCase.endsWith("WITHRSA"))
+                || (algorithmUpperCase.endsWith("WITHRSA/PSS"))) {
+            return KeyProperties.KEY_ALGORITHM_RSA;
+        } else {
+            throw new IllegalArgumentException("Unsupported algorithm: " + algorithm);
+        }
+    }
+
+    static boolean isKeyLongEnoughForSignatureAlgorithm(String algorithm, Key key) {
+        String keyAlgorithm = key.getAlgorithm();
+        if (KeyProperties.KEY_ALGORITHM_EC.equalsIgnoreCase(keyAlgorithm)) {
+            // No length restrictions for ECDSA
+            return true;
+        } else if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(keyAlgorithm)) {
+            // No length restrictions for RSA
+            String digest = getSignatureAlgorithmDigest(algorithm);
+            int digestOutputSizeBits = getDigestOutputSizeBits(digest);
+            if (digestOutputSizeBits == -1) {
+                // No digesting -- assume the key is long enough for the message
+                return true;
+            }
+            String paddingScheme = getSignatureAlgorithmPadding(algorithm);
+            int paddingOverheadBytes;
+            if (KeyProperties.SIGNATURE_PADDING_RSA_PKCS1.equalsIgnoreCase(paddingScheme)) {
+                paddingOverheadBytes = 30;
+            } else if (KeyProperties.SIGNATURE_PADDING_RSA_PSS.equalsIgnoreCase(paddingScheme)) {
+                paddingOverheadBytes = 22;
+            } else {
+                throw new IllegalArgumentException(
+                        "Unsupported signature padding scheme: " + paddingScheme);
+            }
+            int minKeySizeBytes = paddingOverheadBytes + (digestOutputSizeBits + 7) / 8 + 1;
+            int keySizeBytes = ((RSAKey) key).getModulus().bitLength() / 8;
+            return keySizeBytes >= minKeySizeBytes;
+        } else {
+            throw new IllegalArgumentException("Unsupported key algorithm: " + keyAlgorithm);
+        }
+    }
+
+    static int getMaxSupportedPlaintextInputSizeBytes(String transformation, Key key) {
+        String keyAlgorithm = getCipherKeyAlgorithm(transformation);
+        if (KeyProperties.KEY_ALGORITHM_AES.equalsIgnoreCase(keyAlgorithm)) {
+            return Integer.MAX_VALUE;
+        } else if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(keyAlgorithm)) {
+            String encryptionPadding = getCipherEncryptionPadding(transformation);
+            int modulusSizeBytes = (getKeySizeBits(key) + 7) / 8;
+            if (KeyProperties.ENCRYPTION_PADDING_NONE.equalsIgnoreCase(encryptionPadding)) {
+                return modulusSizeBytes - 1;
+            } else if (KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1.equalsIgnoreCase(
+                    encryptionPadding)) {
+                return modulusSizeBytes - 11;
+            } else if (KeyProperties.ENCRYPTION_PADDING_RSA_OAEP.equalsIgnoreCase(
+                    encryptionPadding)) {
+                String digest = getCipherDigest(transformation);
+                int digestOutputSizeBytes = (getDigestOutputSizeBits(digest) + 7) / 8;
+                return modulusSizeBytes - 2 * digestOutputSizeBytes - 2;
+            } else {
+                throw new IllegalArgumentException(
+                        "Unsupported encryption padding scheme: " + encryptionPadding);
+            }
+        } else {
+            throw new IllegalArgumentException("Unsupported key algorithm: " + keyAlgorithm);
+        }
+    }
+
+    static int getDigestOutputSizeBits(String digest) {
+        if (KeyProperties.DIGEST_NONE.equals(digest)) {
+            return -1;
+        } else if (KeyProperties.DIGEST_MD5.equals(digest)) {
+            return 128;
+        } else if (KeyProperties.DIGEST_SHA1.equals(digest)) {
+            return 160;
+        } else if (KeyProperties.DIGEST_SHA224.equals(digest)) {
+            return 224;
+        } else if (KeyProperties.DIGEST_SHA256.equals(digest)) {
+            return 256;
+        } else if (KeyProperties.DIGEST_SHA384.equals(digest)) {
+            return 384;
+        } else if (KeyProperties.DIGEST_SHA512.equals(digest)) {
+            return 512;
+        } else {
+            throw new IllegalArgumentException("Unsupported digest: " + digest);
+        }
+    }
+
+    static byte[] concat(byte[] arr1, byte[] arr2) {
+        return concat(arr1, 0, (arr1 != null) ? arr1.length : 0,
+                arr2, 0, (arr2 != null) ? arr2.length : 0);
+    }
+
+    static byte[] concat(byte[] arr1, int offset1, int len1,
+            byte[] arr2, int offset2, int len2) {
+        if (len1 == 0) {
+            return subarray(arr2, offset2, len2);
+        } else if (len2 == 0) {
+            return subarray(arr1, offset1, len1);
+        }
+        byte[] result = new byte[len1 + len2];
+        if (len1 > 0) {
+            System.arraycopy(arr1, offset1, result, 0, len1);
+        }
+        if (len2 > 0) {
+            System.arraycopy(arr2, offset2, result, len1, len2);
+        }
+        return result;
+    }
+
+    static byte[] subarray(byte[] arr, int offset, int len) {
+        if (len == 0) {
+            return EmptyArray.BYTE;
+        }
+        if ((offset == 0) && (arr.length == len)) {
+            return arr;
+        }
+        byte[] result = new byte[len];
+        System.arraycopy(arr, offset, result, 0, len);
+        return result;
+    }
+
+    static KeyProtection getMinimalWorkingImportParametersForSigningingWith(
+            String signatureAlgorithm) {
+        String keyAlgorithm = getSignatureAlgorithmKeyAlgorithm(signatureAlgorithm);
+        String digest = getSignatureAlgorithmDigest(signatureAlgorithm);
+        if (KeyProperties.KEY_ALGORITHM_EC.equalsIgnoreCase(keyAlgorithm)) {
+            return new KeyProtection.Builder(KeyProperties.PURPOSE_SIGN)
+                    .setDigests(digest)
+                    .build();
+        } else if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(keyAlgorithm)) {
+            String padding = getSignatureAlgorithmPadding(signatureAlgorithm);
+            return new KeyProtection.Builder(KeyProperties.PURPOSE_SIGN)
+                    .setDigests(digest)
+                    .setSignaturePaddings(padding)
+                    .build();
+        } else {
+            throw new IllegalArgumentException(
+                    "Unsupported signature algorithm: " + signatureAlgorithm);
+        }
+    }
+
+    static KeyProtection getMinimalWorkingImportParametersForCipheringWith(
+            String transformation, int purposes) {
+        return getMinimalWorkingImportParametersForCipheringWith(transformation, purposes, false);
+    }
+
+    static KeyProtection getMinimalWorkingImportParametersForCipheringWith(
+            String transformation, int purposes, boolean ivProvidedWhenEncrypting) {
+        String keyAlgorithm = TestUtils.getCipherKeyAlgorithm(transformation);
+        if (KeyProperties.KEY_ALGORITHM_AES.equalsIgnoreCase(keyAlgorithm)) {
+            String encryptionPadding = TestUtils.getCipherEncryptionPadding(transformation);
+            String blockMode = TestUtils.getCipherBlockMode(transformation);
+            boolean randomizedEncryptionRequired = true;
+            if (KeyProperties.BLOCK_MODE_ECB.equalsIgnoreCase(blockMode)) {
+                randomizedEncryptionRequired = false;
+            } else if ((ivProvidedWhenEncrypting)
+                    && ((purposes & KeyProperties.PURPOSE_ENCRYPT) != 0)) {
+                randomizedEncryptionRequired = false;
+            }
+            return new KeyProtection.Builder(
+                    purposes)
+                    .setBlockModes(blockMode)
+                    .setEncryptionPaddings(encryptionPadding)
+                    .setRandomizedEncryptionRequired(randomizedEncryptionRequired)
+                    .build();
+        } else if (KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(keyAlgorithm)) {
+            String digest = TestUtils.getCipherDigest(transformation);
+            String encryptionPadding = TestUtils.getCipherEncryptionPadding(transformation);
+            boolean randomizedEncryptionRequired =
+                    !KeyProperties.ENCRYPTION_PADDING_NONE.equalsIgnoreCase(encryptionPadding);
+            return new KeyProtection.Builder(
+                    purposes)
+                    .setDigests((digest != null) ? new String[] {digest} : EmptyArray.STRING)
+                    .setEncryptionPaddings(encryptionPadding)
+                    .setRandomizedEncryptionRequired(randomizedEncryptionRequired)
+                    .build();
+        } else {
+            throw new IllegalArgumentException("Unsupported key algorithm: " + keyAlgorithm);
+        }
+    }
+
+    static byte[] getBigIntegerMagnitudeBytes(BigInteger value) {
+        return removeLeadingZeroByteIfPresent(value.toByteArray());
+    }
+
+    private static byte[] removeLeadingZeroByteIfPresent(byte[] value) {
+        if ((value.length < 1) || (value[0] != 0)) {
+            return value;
+        }
+        return TestUtils.subarray(value, 1, value.length - 1);
+    }
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/TransparentSecretKey.java b/tests/tests/keystore/src/android/keystore/cts/TransparentSecretKey.java
new file mode 100644
index 0000000..6e74dc0
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/TransparentSecretKey.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2015 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.keystore.cts;
+
+import javax.crypto.SecretKey;
+
+/**
+ * {@link SecretKey} which exposes its key material. The two reasons for the existence of this class
+ * are: (1) to help test that classes under test don't assume that all transparent secret keys are
+ * instances of {@link SecretKeySpec}, and (2) because {@code SecretKeySpec} rejects zero-length
+ * key material which is needed in some tests.
+ */
+public class TransparentSecretKey implements SecretKey {
+    private final String mAlgorithm;
+    private final byte[] mKeyMaterial;
+
+    public TransparentSecretKey(byte[] keyMaterial, String algorithm) {
+        mAlgorithm = algorithm;
+        mKeyMaterial = keyMaterial.clone();
+    }
+
+    @Override
+    public String getAlgorithm() {
+        return mAlgorithm;
+    }
+
+    @Override
+    public byte[] getEncoded() {
+        return mKeyMaterial;
+    }
+
+    @Override
+    public String getFormat() {
+        return "RAW";
+    }
+}
diff --git a/tests/tests/libcorelegacy22/Android.mk b/tests/tests/libcorelegacy22/Android.mk
new file mode 100644
index 0000000..fb3c503
--- /dev/null
+++ b/tests/tests/libcorelegacy22/Android.mk
@@ -0,0 +1,32 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsLibcoreLegacy22TestCases
+
+LOCAL_SDK_VERSION := 22
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/libcorelegacy22/AndroidManifest.xml b/tests/tests/libcorelegacy22/AndroidManifest.xml
new file mode 100644
index 0000000..4ff9ec2
--- /dev/null
+++ b/tests/tests/libcorelegacy22/AndroidManifest.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.libcorelegacy22">
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.READ_LOGS" />
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="com.android.cts.libcorelegacy22"
+                     android:label="CTS tests of android APIs last available in API 22">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+
+</manifest>
+
diff --git a/tests/tests/libcorelegacy22/src/android/util/cts/FloatMathTest.java b/tests/tests/libcorelegacy22/src/android/util/cts/FloatMathTest.java
new file mode 100644
index 0000000..6b775fc
--- /dev/null
+++ b/tests/tests/libcorelegacy22/src/android/util/cts/FloatMathTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2008 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.util.cts;
+
+import junit.framework.TestCase;
+import android.util.FloatMath;
+
+public class FloatMathTest extends TestCase {
+
+    public void testSqrt() {
+        assertEquals(5.0f, FloatMath.sqrt(25));
+        assertEquals(7, FloatMath.sqrt(49), 0);
+        assertEquals(10, FloatMath.sqrt(100), 0);
+        assertEquals(0, FloatMath.sqrt(0), 0);
+        assertEquals(1, FloatMath.sqrt(1), 0);
+    }
+
+    public void testFloor() {
+        assertEquals(78, FloatMath.floor(78.89f), 0);
+        assertEquals(-79, FloatMath.floor(-78.89f), 0);
+        assertEquals(7.0f, FloatMath.floor(7.2f));
+        assertEquals(-7.0f, FloatMath.floor(-6.3f));
+    }
+
+    public void testCeil() {
+        assertEquals(79, FloatMath.ceil(78.89f), 0);
+        assertEquals(-78, FloatMath.ceil(-78.89f), 0);
+        assertEquals(8.0f, FloatMath.ceil(7.2f));
+        assertEquals(-6.0f, FloatMath.ceil(-6.3f));
+    }
+
+    public void testCos() {
+        assertEquals(1.0f, FloatMath.cos(0), 0);
+        assertEquals(0.5403023058681398f, FloatMath.cos(1), 0);
+        assertEquals(0.964966f, FloatMath.cos(50));
+        assertEquals(0.69925081f, FloatMath.cos(150));
+        assertEquals(0.964966f, FloatMath.cos(-50));
+    }
+
+    public void testSin() {
+        assertEquals(0.0, FloatMath.sin(0), 0);
+        assertEquals(0.8414709848078965f, FloatMath.sin(1), 0);
+        assertEquals(-0.26237485f, FloatMath.sin(50));
+        assertEquals(-0.71487643f, FloatMath.sin(150));
+        assertEquals(0.26237485f, FloatMath.sin(-50));
+
+    }
+}
+
diff --git a/tests/tests/location/Android.mk b/tests/tests/location/Android.mk
index 02de2f2..62d0d5d 100644
--- a/tests/tests/location/Android.mk
+++ b/tests/tests/location/Android.mk
@@ -21,7 +21,7 @@
 # and when built explicitly put it in the data partition
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
diff --git a/tests/tests/location/src/android/location/cts/BaseMockLocationTest.java b/tests/tests/location/src/android/location/cts/BaseMockLocationTest.java
new file mode 100644
index 0000000..14019be
--- /dev/null
+++ b/tests/tests/location/src/android/location/cts/BaseMockLocationTest.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2015 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
+ *
+ */
+
+package android.location.cts;
+
+import android.cts.util.LocationUtils;
+import android.test.InstrumentationTestCase;
+
+/**
+ * Base class for instrumentations tests that use mock location.
+ */
+public abstract class BaseMockLocationTest extends InstrumentationTestCase {
+    private static final String LOG_TAG = "BaseMockLocationTest";
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        LocationUtils.registerMockLocationProvider(getInstrumentation(), true);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        LocationUtils.registerMockLocationProvider(getInstrumentation(), false);
+        super.tearDown();
+    }
+}
diff --git a/tests/tests/location/src/android/location/cts/CriteriaTest.java b/tests/tests/location/src/android/location/cts/CriteriaTest.java
index d812965f..422f561 100644
--- a/tests/tests/location/src/android/location/cts/CriteriaTest.java
+++ b/tests/tests/location/src/android/location/cts/CriteriaTest.java
@@ -113,6 +113,19 @@
         assertTrue(criteria.isAltitudeRequired());
     }
 
+    public void testAccessBearingAccuracy() {
+        Criteria criteria = new Criteria();
+
+        criteria.setBearingAccuracy(Criteria.ACCURACY_LOW);
+        assertEquals(Criteria.ACCURACY_LOW, criteria.getBearingAccuracy());
+
+        criteria.setBearingAccuracy(Criteria.ACCURACY_HIGH);
+        assertEquals(Criteria.ACCURACY_HIGH, criteria.getBearingAccuracy());
+
+        criteria.setBearingAccuracy(Criteria.NO_REQUIREMENT);
+        assertEquals(Criteria.NO_REQUIREMENT, criteria.getBearingAccuracy());
+      }
+
     public void testAccessBearingRequired() {
         Criteria criteria = new Criteria();
 
@@ -133,6 +146,35 @@
         assertTrue(criteria.isCostAllowed());
     }
 
+    public void testAccessHorizontalAccuracy() {
+        Criteria criteria = new Criteria();
+
+        criteria.setHorizontalAccuracy(Criteria.ACCURACY_LOW);
+        assertEquals(Criteria.ACCURACY_LOW, criteria.getHorizontalAccuracy());
+
+        criteria.setHorizontalAccuracy(Criteria.ACCURACY_MEDIUM);
+        assertEquals(Criteria.ACCURACY_MEDIUM, criteria.getHorizontalAccuracy());
+
+        criteria.setHorizontalAccuracy(Criteria.ACCURACY_HIGH);
+        assertEquals(Criteria.ACCURACY_HIGH, criteria.getHorizontalAccuracy());
+
+        criteria.setHorizontalAccuracy(Criteria.NO_REQUIREMENT);
+        assertEquals(Criteria.NO_REQUIREMENT, criteria.getHorizontalAccuracy());
+    }
+
+    public void testAccessSpeedAccuracy() {
+        Criteria criteria = new Criteria();
+
+        criteria.setSpeedAccuracy(Criteria.ACCURACY_LOW);
+        assertEquals(Criteria.ACCURACY_LOW, criteria.getSpeedAccuracy());
+
+        criteria.setSpeedAccuracy(Criteria.ACCURACY_HIGH);
+        assertEquals(Criteria.ACCURACY_HIGH, criteria.getSpeedAccuracy());
+
+        criteria.setSpeedAccuracy(Criteria.NO_REQUIREMENT);
+        assertEquals(Criteria.NO_REQUIREMENT, criteria.getSpeedAccuracy());
+    }
+
     public void testAccessSpeedRequired() {
         Criteria criteria = new Criteria();
 
@@ -143,6 +185,19 @@
         assertTrue(criteria.isSpeedRequired());
     }
 
+    public void testAccessVerticalAccuracy() {
+        Criteria criteria = new Criteria();
+
+        criteria.setVerticalAccuracy(Criteria.ACCURACY_LOW);
+        assertEquals(Criteria.ACCURACY_LOW, criteria.getVerticalAccuracy());
+
+       criteria.setVerticalAccuracy(Criteria.ACCURACY_HIGH);
+        assertEquals(Criteria.ACCURACY_HIGH, criteria.getVerticalAccuracy());
+
+        criteria.setVerticalAccuracy(Criteria.NO_REQUIREMENT);
+        assertEquals(Criteria.NO_REQUIREMENT, criteria.getVerticalAccuracy());
+    }
+
     public void testWriteToParcel() {
         Criteria criteria = new Criteria();
         criteria.setAltitudeRequired(true);
diff --git a/tests/tests/location/src/android/location/cts/LocationManagerTest.java b/tests/tests/location/src/android/location/cts/LocationManagerTest.java
index 118b8f9..8ac56ae 100644
--- a/tests/tests/location/src/android/location/cts/LocationManagerTest.java
+++ b/tests/tests/location/src/android/location/cts/LocationManagerTest.java
@@ -16,7 +16,6 @@
 
 package android.location.cts;
 
-
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
@@ -27,6 +26,7 @@
 import android.location.Criteria;
 import android.location.GpsStatus;
 import android.location.GpsStatus.Listener;
+import android.location.GpsStatus.NmeaListener;
 import android.location.Location;
 import android.location.LocationListener;
 import android.location.LocationManager;
@@ -36,7 +36,6 @@
 import android.os.Looper;
 import android.os.SystemClock;
 import android.provider.Settings;
-import android.test.InstrumentationTestCase;
 import android.test.UiThreadTest;
 
 import java.util.List;
@@ -48,8 +47,8 @@
  * android.permission.ACCESS_FINE_LOCATION to access GPS provider
  * android.permission.ACCESS_LOCATION_EXTRA_COMMANDS to send extra commands to GPS provider
  */
-public class LocationManagerTest extends InstrumentationTestCase {
-    private static final long TEST_TIME_OUT = 10000;
+public class LocationManagerTest extends BaseMockLocationTest {
+    private static final long TEST_TIME_OUT = 5000;
 
     private static final String TEST_MOCK_PROVIDER_NAME = "test_provider";
 
@@ -72,13 +71,6 @@
 
         mManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
 
-        // test that mock locations are allowed so a more descriptive error message can be logged
-        if (Settings.Secure.getInt(mContext.getContentResolver(),
-                Settings.Secure.ALLOW_MOCK_LOCATION, 0) == 0) {
-            fail("Mock locations are currently disabled in Settings - this test requires "
-                    + "mock locations");
-        }
-
         // remove test provider if left over from an aborted run
         LocationProvider lp = mManager.getProvider(TEST_MOCK_PROVIDER_NAME);
         if (lp != null) {
@@ -537,6 +529,358 @@
         }
     }
 
+    public void testSingleUpdateWithLocationListenerAndLooper() throws InterruptedException {
+        double latitude1 = 60;
+        double longitude1 = 20;
+        double latitude2 = 40;
+        double longitude2 = 30;
+        double latitude3 = 10;
+        double longitude3 = 50;
+        final MockLocationListener listener = new MockLocationListener();
+
+        // update location and notify listener
+        HandlerThread handlerThread = new HandlerThread("testLocationUpdates4");
+        handlerThread.start();
+        mManager.requestSingleUpdate(TEST_MOCK_PROVIDER_NAME, listener, handlerThread.getLooper());
+
+        updateLocation(latitude1, longitude1);
+        assertTrue(listener.hasCalledOnLocationChanged(TEST_TIME_OUT));
+        Location location = listener.getLocation();
+        assertEquals(TEST_MOCK_PROVIDER_NAME, location.getProvider());
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+        assertEquals(true, location.isFromMockProvider());
+
+        // Any further location change doesn't trigger an update.
+        updateLocation(latitude2, longitude2);
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+
+        // update location without notifying listener
+        mManager.removeUpdates(listener);
+        listener.reset();
+        updateLocation(latitude3, longitude3);
+        assertFalse(listener.hasCalledOnLocationChanged(TEST_TIME_OUT));
+
+        try {
+            mManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, (LocationListener) null,
+                    Looper.myLooper());
+            fail("Should throw IllegalArgumentException if param listener is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.requestSingleUpdate((String) null, listener, Looper.myLooper());
+            fail("Should throw IllegalArgumentException if param provider is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.removeUpdates( (LocationListener) null );
+            fail("Should throw IllegalArgumentException if listener is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+    }
+
+    public void testLocationUpdatesWithCriteriaAndPendingIntent() throws InterruptedException {
+        double latitude1 = 10;
+        double longitude1 = 20;
+        double latitude2 = 30;
+        double longitude2 = 40;
+
+        registerIntentReceiver();
+        mockFusedLocation();
+
+        // Update location and receive broadcast.
+        Criteria criteria = createLocationCriteria();
+        mManager.requestLocationUpdates(0, 0 , criteria, mPendingIntent);
+        updateFusedLocation(latitude1, longitude1);
+        waitForReceiveBroadcast();
+
+        assertNotNull(mIntentReceiver.getLastReceivedIntent());
+        Location location = (Location) mIntentReceiver.getLastReceivedIntent().getExtras()
+                .get(LocationManager.KEY_LOCATION_CHANGED);
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+        assertTrue(location.hasAccuracy());
+        assertEquals(1.0f, location.getAccuracy());
+        assertEquals(true, location.isFromMockProvider());
+
+        // Update location without receiving broadcast.
+        mManager.removeUpdates(mPendingIntent);
+        mIntentReceiver.clearReceivedIntents();
+        updateFusedLocation(latitude2, longitude2);
+        waitForReceiveBroadcast();
+        assertNull(mIntentReceiver.getLastReceivedIntent());
+
+        // Missing arguments throw exceptions.
+        try {
+            mManager.requestLocationUpdates(0, 0, criteria, (PendingIntent) null);
+            fail("Should throw IllegalArgumentException if param intent is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.requestLocationUpdates(0, 0, null, mPendingIntent);
+            fail("Should throw IllegalArgumentException if param criteria is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.removeUpdates( (PendingIntent) null );
+            fail("Should throw IllegalArgumentException if param PendingIntent is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        unmockFusedLocation();
+    }
+
+    public void testSingleUpdateWithCriteriaAndPendingIntent() throws InterruptedException {
+        double latitude1 = 10;
+        double longitude1 = 20;
+        double latitude2 = 30;
+        double longitude2 = 40;
+        double latitude3 = 50;
+        double longitude3 = 60;
+
+        registerIntentReceiver();
+        mockFusedLocation();
+
+        // Update location and receive broadcast.
+        Criteria criteria = createLocationCriteria();
+        mManager.requestSingleUpdate(criteria, mPendingIntent);
+        updateFusedLocation(latitude1, longitude1);
+        waitForReceiveBroadcast();
+
+        assertNotNull(mIntentReceiver.getLastReceivedIntent());
+        Location location = (Location) mIntentReceiver.getLastReceivedIntent().getExtras()
+                .get(LocationManager.KEY_LOCATION_CHANGED);
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+        assertTrue(location.hasAccuracy());
+        assertEquals(1.0f, location.getAccuracy());
+        assertEquals(true, location.isFromMockProvider());
+
+        // Any further location change doesn't trigger an update.
+        updateFusedLocation(latitude2, longitude2);
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+
+        // Update location without receiving broadcast.
+        mManager.removeUpdates(mPendingIntent);
+        mIntentReceiver.clearReceivedIntents();
+        updateFusedLocation(latitude3, longitude3);
+        waitForReceiveBroadcast();
+        assertNull(mIntentReceiver.getLastReceivedIntent());
+
+        // Missing arguments throw exceptions.
+        try {
+            mManager.requestSingleUpdate(criteria, (PendingIntent) null);
+            fail("Should throw IllegalArgumentException if param intent is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.requestSingleUpdate((Criteria) null, mPendingIntent);
+            fail("Should throw IllegalArgumentException if param criteria is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.removeUpdates( (PendingIntent) null );
+            fail("Should throw IllegalArgumentException if param PendingIntent is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        unmockFusedLocation();
+    }
+
+    public void testLocationUpdatesWithCriteriaAndLocationListenerAndLooper()
+            throws InterruptedException {
+        double latitude1 = 40;
+        double longitude1 = 10;
+        double latitude2 = 20;
+        double longitude2 = 30;
+       final MockLocationListener listener = new MockLocationListener();
+        mockFusedLocation();
+
+        // update location and notify listener
+        HandlerThread handlerThread = new HandlerThread("testLocationUpdates1");
+        handlerThread.start();
+        Criteria criteria = createLocationCriteria();
+        mManager.requestLocationUpdates(0, 0, criteria, listener, handlerThread.getLooper());
+
+        updateFusedLocation(latitude1, longitude1);
+        assertTrue(listener.hasCalledOnLocationChanged(TEST_TIME_OUT));
+        Location location = listener.getLocation();
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+        assertTrue(location.hasAccuracy());
+        assertEquals(1.0f, location.getAccuracy());
+        assertEquals(true, location.isFromMockProvider());
+
+        // update location without notifying listener
+        mManager.removeUpdates(listener);
+        listener.reset();
+        updateFusedLocation(latitude2, longitude2);
+        assertFalse(listener.hasCalledOnLocationChanged(TEST_TIME_OUT));
+
+        // Missing arguments throw exceptions.
+        try {
+            mManager.requestLocationUpdates(0, 0, criteria, (LocationListener) null,
+                    Looper.myLooper());
+            fail("Should throw IllegalArgumentException if param listener is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.requestLocationUpdates(0, 0, null, listener, Looper.myLooper());
+            fail("Should throw IllegalArgumentException if param criteria is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.removeUpdates( (LocationListener) null );
+            fail("Should throw IllegalArgumentException if listener is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        unmockFusedLocation();
+    }
+
+    public void testSingleUpdateWithCriteriaAndLocationListenerAndLooper()
+            throws InterruptedException {
+        double latitude1 = 40;
+        double longitude1 = 10;
+        double latitude2 = 20;
+        double longitude2 = 30;
+        double latitude3 = 60;
+        double longitude3 = 50;
+        final MockLocationListener listener = new MockLocationListener();
+        mockFusedLocation();
+
+        // update location and notify listener
+        HandlerThread handlerThread = new HandlerThread("testLocationUpdates2");
+        handlerThread.start();
+        Criteria criteria = createLocationCriteria();
+        mManager.requestSingleUpdate(criteria, listener, handlerThread.getLooper());
+
+        updateFusedLocation(latitude1, longitude1);
+        assertTrue(listener.hasCalledOnLocationChanged(TEST_TIME_OUT));
+        Location location = listener.getLocation();
+        assertEquals(FUSED_PROVIDER_NAME, location.getProvider());
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+        assertTrue(location.hasAccuracy());
+        assertEquals(1.0f, location.getAccuracy());
+        assertEquals(true, location.isFromMockProvider());
+
+        // Any further location change doesn't trigger an update.
+        updateFusedLocation(latitude2, longitude2);
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+
+        // update location without notifying listener
+        mManager.removeUpdates(listener);
+        listener.reset();
+        updateFusedLocation(latitude3, longitude3);
+        assertFalse(listener.hasCalledOnLocationChanged(TEST_TIME_OUT));
+
+        // Missing arguments throw exceptions.
+        try {
+            mManager.requestLocationUpdates(0, 0, criteria, (LocationListener) null,
+                    Looper.myLooper());
+            fail("Should throw IllegalArgumentException if param listener is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.requestLocationUpdates(0, 0, null, listener, Looper.myLooper());
+            fail("Should throw IllegalArgumentException if param criteria is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.removeUpdates( (LocationListener) null );
+            fail("Should throw IllegalArgumentException if listener is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        unmockFusedLocation();
+    }
+
+    public void testSingleUpdateWithPendingIntent() throws InterruptedException {
+        double latitude1 = 20;
+        double longitude1 = 40;
+        double latitude2 = 30;
+        double longitude2 = 50;
+        double latitude3 = 10;
+        double longitude3 = 60;
+
+        // update location and receive broadcast.
+        registerIntentReceiver();
+        mManager.requestLocationUpdates(TEST_MOCK_PROVIDER_NAME, 0, 0, mPendingIntent);
+        updateLocation(latitude1, longitude1);
+        waitForReceiveBroadcast();
+
+        assertNotNull(mIntentReceiver.getLastReceivedIntent());
+        Location location = mManager.getLastKnownLocation(TEST_MOCK_PROVIDER_NAME);
+        assertEquals(TEST_MOCK_PROVIDER_NAME, location.getProvider());
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+        assertEquals(true, location.isFromMockProvider());
+
+        // Any further location change doesn't trigger an update.
+        updateLocation(latitude2, longitude2);
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+
+        // update location without receiving broadcast.
+        mManager.removeUpdates(mPendingIntent);
+        mIntentReceiver.clearReceivedIntents();
+        updateLocation(latitude3, longitude3);
+        waitForReceiveBroadcast();
+        assertEquals(latitude1, location.getLatitude());
+        assertEquals(longitude1, location.getLongitude());
+
+        try {
+            mManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
+                    (PendingIntent) null);
+            fail("Should throw IllegalArgumentException if param intent is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.requestLocationUpdates(null, 0, 0, mPendingIntent);
+            fail("Should throw IllegalArgumentException if param provider is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            mManager.removeUpdates( (PendingIntent) null );
+            fail("Should throw IllegalArgumentException if intent is null!");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+    }
+
     public void testAddProximityAlert() {
         Intent i = new Intent();
         i.setAction("android.location.cts.TEST_GET_GPS_STATUS_ACTION");
@@ -546,6 +890,17 @@
         mManager.removeProximityAlert(pi);
     }
 
+
+    @UiThreadTest
+    public void testNmeaListener() {
+        MockNmeaListener listener = new MockNmeaListener();
+        mManager.addNmeaListener(listener);
+        mManager.removeNmeaListener(listener);
+
+        mManager.addNmeaListener(null);
+        mManager.removeNmeaListener(null);
+    }
+
     public void testIsProviderEnabled() {
         // this test assumes enabled TEST_MOCK_PROVIDER_NAME was created in setUp.
         assertNotNull(mManager.getProvider(TEST_MOCK_PROVIDER_NAME));
@@ -840,6 +1195,21 @@
         updateLocation(TEST_MOCK_PROVIDER_NAME, latitude, longitude);
     }
 
+    private void updateFusedLocation(final double latitude, final double longitude) {
+      updateLocation(FUSED_PROVIDER_NAME, latitude, longitude);
+ }
+
+    private Criteria createLocationCriteria() {
+        Criteria criteria = new Criteria();
+        criteria.setAccuracy(Criteria.ACCURACY_FINE);
+        criteria.setPowerRequirement(Criteria.POWER_MEDIUM);
+        criteria.setAltitudeRequired(false);
+        criteria.setBearingRequired(false);
+        criteria.setCostAllowed(false);
+        criteria.setSpeedRequired(false);
+        return criteria;
+     }
+
     private void mockFusedLocation() {
         addTestProvider(FUSED_PROVIDER_NAME);
     }
@@ -1003,6 +1373,23 @@
         }
     }
 
+    private static class MockNmeaListener implements NmeaListener {
+        private boolean mIsNmeaReceived;
+
+        @Override
+        public void onNmeaReceived(long timestamp, String nmea) {
+            mIsNmeaReceived = true;
+        }
+
+        public boolean isNmeaRecevied() {
+            return mIsNmeaReceived;
+        }
+
+        public void reset() {
+            mIsNmeaReceived = false;
+        }
+    }
+
     private static class MockGpsStatusListener implements Listener {
         private boolean mHasCallOnGpsStatusChanged;
 
diff --git a/tests/tests/location/src/android/location/cts/LocationProviderTest.java b/tests/tests/location/src/android/location/cts/LocationProviderTest.java
index 716801d..1e6feda 100644
--- a/tests/tests/location/src/android/location/cts/LocationProviderTest.java
+++ b/tests/tests/location/src/android/location/cts/LocationProviderTest.java
@@ -16,14 +16,11 @@
 
 package android.location.cts;
 
-
-import android.content.Context;
 import android.location.Criteria;
 import android.location.LocationManager;
 import android.location.LocationProvider;
-import android.test.AndroidTestCase;
 
-public class LocationProviderTest extends AndroidTestCase {
+public class LocationProviderTest extends BaseMockLocationTest {
     private static final String PROVIDER_NAME = "location_provider_test";
 
     private LocationManager mLocationManager;
@@ -31,8 +28,8 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mLocationManager =
-            (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);
+        mLocationManager = getInstrumentation().getContext().getSystemService(
+                LocationManager.class);
         addTestProvider(PROVIDER_NAME);
     }
 
diff --git a/tests/tests/location/src/android/location/cts/LocationTest.java b/tests/tests/location/src/android/location/cts/LocationTest.java
index f037109..db2820c 100644
--- a/tests/tests/location/src/android/location/cts/LocationTest.java
+++ b/tests/tests/location/src/android/location/cts/LocationTest.java
@@ -16,8 +16,15 @@
 
 package android.location.cts;
 
-
+import android.content.Context;
+import android.content.Intent;
 import android.location.Location;
+import android.location.SettingInjectorService;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Messenger;
 import android.os.Bundle;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
@@ -41,6 +48,9 @@
     private final boolean TEST_KEY1VALUE = false;
     private final byte TEST_KEY2VALUE = 10;
 
+    private static final String ENABLED_KEY = "enabled";
+    private static final String MESSENGER_KEY = "messenger";
+
     public void testConstructor() {
         new Location("LocationProvider");
 
@@ -407,6 +417,56 @@
         assertTestLocation(newLocation);
     }
 
+    public void testSettingInjectorService() {
+        Context c = getContext();
+        SettingInjectorServiceDerived service = new SettingInjectorServiceDerived();
+
+        assertNotNull(c);
+
+        Intent intent =
+            new Intent(c, android.location.SettingInjectorService.class);
+
+        assertNotNull(c.getMainLooper());
+        SettingInjectorResultHandler resultHandler =
+            new SettingInjectorResultHandler(c.getMainLooper());
+
+        Messenger m = new Messenger(resultHandler);
+        intent.putExtra(MESSENGER_KEY, m);
+
+        int ret;
+        final long timeout = 500;
+
+        // should refuse binding
+        IBinder binder = service.callOnBind(intent);
+        assertNull("onBind should always fail.", binder);
+
+        // test if result consistent with the truth
+        // enabled == false case
+        service.setEnabled(false);
+        resultHandler.expectEnabled(false);
+        resultHandler.expectMessage(true);
+        ret = service.callOnStartCommand(intent, SettingInjectorService.START_NOT_STICKY, 0);
+        assertEquals("onStartCommand return value invalid in (enabled == false) case.",
+            ret, SettingInjectorService.START_NOT_STICKY);
+        assertTrue("Message time out in (enabled == false case).",
+            resultHandler.waitForMessage(timeout));
+
+        // enabled == true case
+        service.setEnabled(true);
+        resultHandler.expectEnabled(true);
+        resultHandler.expectMessage(true);
+        ret = service.callOnStartCommand(intent, SettingInjectorService.START_NOT_STICKY, 0);
+        assertEquals("onStartCommand return value invalid in (enabled == true) case.",
+            ret, SettingInjectorService.START_NOT_STICKY);
+        assertTrue("Message time out in (enabled == true) case.",
+            resultHandler.waitForMessage(timeout));
+
+        // should not respond to the deprecated method
+        resultHandler.expectMessage(false);
+        service.callOnStart(intent, 0);
+        resultHandler.waitForMessage(timeout);
+    }
+
     private void assertTestLocation(Location l) {
         assertNotNull(l);
         assertEquals(TEST_PROVIDER, l.getProvider());
@@ -441,4 +501,93 @@
         assertFalse(bundle.getBoolean(TEST_KEY1NAME));
         assertEquals(TEST_KEY2VALUE, bundle.getByte(TEST_KEY2NAME));
     }
+
+    private class SettingInjectorResultHandler extends Handler {
+        private boolean mEnabledShouldBe;
+        private boolean mExpectingMessage;
+        private boolean mMessageArrived;
+
+        SettingInjectorResultHandler(Looper l) {
+            super(l);
+        }
+
+        @Override
+        public void handleMessage(Message m) {
+
+            assertTrue("Unexpected message.", mExpectingMessage);
+
+            boolean enabled = m.getData().getBoolean(ENABLED_KEY);
+
+            assertEquals(String.format(
+                    "Message value (%s) inconsistent with service state (%s).",
+                    String.valueOf(enabled), String.valueOf(mEnabledShouldBe) ),
+                    mEnabledShouldBe, enabled);
+
+            synchronized (this) {
+                mMessageArrived = true;
+                notify();
+            }
+        }
+
+        public void expectEnabled(boolean enabled) {
+            mEnabledShouldBe = enabled;
+        }
+
+        public void expectMessage(boolean expecting) {
+            mMessageArrived = false;
+            mExpectingMessage = expecting;
+        }
+
+        public synchronized boolean waitForMessage(long millis) {
+            synchronized (this) {
+                try {
+                    wait(millis);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+                return mMessageArrived;
+            }
+        }
+    }
+
+
+    private class SettingInjectorServiceDerived extends SettingInjectorService {
+
+        private boolean mEnabled;
+
+        SettingInjectorServiceDerived() {
+            super("SettingInjectorServiceDerived");
+            setEnabled(false);
+        }
+
+        @Override
+        // Deprecated API
+        protected String onGetSummary() {
+            return "";
+        }
+
+        @Override
+        protected boolean onGetEnabled() {
+            return mEnabled;
+        }
+
+        public void setEnabled(boolean enabled) {
+            mEnabled = enabled;
+        }
+
+        // API coverage dashboard will not cound method call from derived class.
+        // Thus, it is necessary to make explicit call to SettingInjectorService public methods.
+        public IBinder callOnBind(Intent intent) {
+            return super.onBind(intent);
+        }
+
+        public void callOnStart(Intent intent, int startId) {
+            super.onStart(intent, startId);
+        }
+
+        public int callOnStartCommand(Intent intent, int flags, int startId) {
+            return super.onStartCommand(intent, flags, startId);
+        }
+    }
+
 }
diff --git a/tests/tests/location2/AndroidManifest.xml b/tests/tests/location2/AndroidManifest.xml
index ad77b7e..b2e0802 100644
--- a/tests/tests/location2/AndroidManifest.xml
+++ b/tests/tests/location2/AndroidManifest.xml
@@ -23,7 +23,6 @@
         <uses-library android:name="android.test.runner" />
     </application>
 
-    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
     <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
 
diff --git a/tests/tests/location2/src/android/location2/cts/LocationManagerTest.java b/tests/tests/location2/src/android/location2/cts/LocationManagerTest.java
index b298b97..6764223 100644
--- a/tests/tests/location2/src/android/location2/cts/LocationManagerTest.java
+++ b/tests/tests/location2/src/android/location2/cts/LocationManagerTest.java
@@ -16,31 +16,29 @@
 
 package android.location2.cts;
 
-
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.content.pm.PackageManager;
 import android.location.Criteria;
-import android.location.GpsStatus;
 import android.location.GpsStatus.Listener;
 import android.location.GpsStatus.NmeaListener;
 import android.location.Location;
 import android.location.LocationListener;
 import android.location.LocationManager;
-import android.location.LocationProvider;
 import android.os.Bundle;
 import android.os.HandlerThread;
-import android.os.Looper;
+import android.os.ParcelFileDescriptor;
 import android.os.SystemClock;
-import android.provider.Settings;
 import android.test.InstrumentationTestCase;
 import android.test.UiThreadTest;
+import android.util.Log;
 
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.List;
-import java.lang.Thread;
 
 /**
  * Requires the permissions
@@ -50,6 +48,8 @@
  */
 public class LocationManagerTest extends InstrumentationTestCase {
 
+    public static final String LOG_TAG = "LocationManagerTest";
+
     private static final long TEST_TIME_OUT_MS = 10 * 1000;
 
     private static final double LAT = 10.0;
@@ -71,12 +71,13 @@
 
         mManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
 
-        // test that mock locations are allowed so a more descriptive error message can be logged
-        if (Settings.Secure.getInt(mContext.getContentResolver(),
-                Settings.Secure.ALLOW_MOCK_LOCATION, 0) == 0) {
-            fail("Mock locations are currently disabled in Settings - this test requires "
-                    + "mock locations");
-        }
+        setAsMoskLocationProvider(true);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        setAsMoskLocationProvider(false);
+        super.tearDown();
     }
 
     public void testGetGpsProvider_notAllowed() {
@@ -319,6 +320,25 @@
         mManager.setTestProviderLocation(providerName, location);
     }
 
+    private void setAsMoskLocationProvider(boolean enable) {
+        StringBuilder command = new StringBuilder();
+        command.append("appops set ");
+        command.append(getInstrumentation().getContext().getPackageName());
+        command.append(" android:mock_location ");
+        command.append(enable ? "allow" : "deny");
+
+        ParcelFileDescriptor pfd = getInstrumentation().getUiAutomation()
+                .executeShellCommand(command.toString());
+
+        InputStream is = new FileInputStream(pfd.getFileDescriptor());
+        try {
+            final byte[] buffer = new byte[8192];
+            while ((is.read(buffer)) != -1);
+        } catch (IOException e) {
+            Log.e(LOG_TAG, "Error managing mock locaiton app", e);
+        }
+    }
+
     /**
      * Helper class that receives a proximity intent and notifies the main class
      * when received
diff --git a/tests/tests/media/Android.mk b/tests/tests/media/Android.mk
index 77d4bb7f..13daca6 100644
--- a/tests/tests/media/Android.mk
+++ b/tests/tests/media/Android.mk
@@ -41,7 +41,7 @@
 LOCAL_STATIC_JAVA_LIBRARIES := \
     ctsmediautil ctsdeviceutil ctstestserver ctstestrunner
 
-LOCAL_JNI_SHARED_LIBRARIES := libctsmediacodec_jni
+LOCAL_JNI_SHARED_LIBRARIES := libctsmediacodec_jni libaudio_jni
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
@@ -49,7 +49,7 @@
 
 # uncomment when b/13249737 is fixed
 #LOCAL_SDK_VERSION := current
-LOCAL_JAVA_LIBRARIES += android.test.runner
+LOCAL_JAVA_LIBRARIES += android.test.runner org.apache.http.legacy
 
 include $(BUILD_CTS_PACKAGE)
 
diff --git a/tests/tests/media/AndroidManifest.xml b/tests/tests/media/AndroidManifest.xml
index 32df531..cdc0e60 100644
--- a/tests/tests/media/AndroidManifest.xml
+++ b/tests/tests/media/AndroidManifest.xml
@@ -28,6 +28,7 @@
 
     <application>
         <uses-library android:name="android.test.runner" />
+        <uses-library android:name="org.apache.http.legacy" android:required="false" />
 
         <activity android:name="android.media.cts.AudioManagerStub"
             android:label="AudioManagerStub"/>
@@ -51,6 +52,21 @@
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
             </intent-filter>
         </activity>
+        <activity android:name="android.media.cts.ResourceManagerStubActivity"
+            android:label="ResourceManagerStubActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+        <activity android:name="android.media.cts.ResourceManagerTestActivity1"
+            android:label="ResourceManagerTestActivity1"
+            android:process=":mediaCodecTestProcess1">
+        </activity>
+        <activity android:name="android.media.cts.ResourceManagerTestActivity2"
+            android:label="ResourceManagerTestActivity2"
+            android:process=":mediaCodecTestProcess2">
+        </activity>
         <activity android:name="android.media.cts.RingtonePickerActivity"
             android:label="RingtonePickerActivity">
             <intent-filter>
diff --git a/tests/tests/media/assets/fileSequence0.ts b/tests/tests/media/assets/fileSequence0.ts
new file mode 100644
index 0000000..48f2bcd
--- /dev/null
+++ b/tests/tests/media/assets/fileSequence0.ts
Binary files differ
diff --git a/tests/tests/media/assets/fileSequence1.ts b/tests/tests/media/assets/fileSequence1.ts
new file mode 100644
index 0000000..737fbd0
--- /dev/null
+++ b/tests/tests/media/assets/fileSequence1.ts
Binary files differ
diff --git a/tests/tests/media/assets/prog_index.m3u8 b/tests/tests/media/assets/prog_index.m3u8
new file mode 100644
index 0000000..88f99d3
--- /dev/null
+++ b/tests/tests/media/assets/prog_index.m3u8
@@ -0,0 +1,10 @@
+#EXTM3U
+#EXT-X-TARGETDURATION:10
+#EXT-X-VERSION:3
+#EXT-X-MEDIA-SEQUENCE:0
+#EXT-X-PLAYLIST-TYPE:VOD
+#EXTINF:9.90000,
+fileSequence0.ts
+#EXTINF:10.00000,
+fileSequence1.ts
+#EXT-X-ENDLIST
diff --git a/tests/tests/media/libaudiojni/Android.mk b/tests/tests/media/libaudiojni/Android.mk
new file mode 100644
index 0000000..a6c1bfc
--- /dev/null
+++ b/tests/tests/media/libaudiojni/Android.mk
@@ -0,0 +1,39 @@
+# Copyright (C) 2015 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.
+#
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE    := libaudio_jni
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := \
+	appendix-b-1-1-buffer-queue.cpp \
+	appendix-b-1-2-recording.cpp \
+	audio-record-native.cpp \
+	audio-track-native.cpp \
+	sl-utils.cpp
+
+LOCAL_C_INCLUDES := \
+	$(JNI_H_INCLUDE) \
+	system/core/include
+
+LOCAL_C_INCLUDES += $(call include-path-for, libaudiojni) \
+	$(call include-path-for, wilhelm)
+
+LOCAL_SHARED_LIBRARIES := libandroid liblog libnativehelper libOpenSLES libutils
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/tests/tests/media/libaudiojni/Blob.h b/tests/tests/media/libaudiojni/Blob.h
new file mode 100644
index 0000000..134232c
--- /dev/null
+++ b/tests/tests/media/libaudiojni/Blob.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#ifndef ANDROID_BLOB_H
+#define ANDROID_BLOB_H
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+namespace android {
+
+// read only byte buffer like object
+
+class BlobReadOnly {
+public:
+    BlobReadOnly(const void *data, size_t size, bool byReference) :
+        mMem(byReference ? NULL : malloc(size)),
+        mData(byReference ? data : mMem),
+        mSize(size) {
+        if (!byReference) {
+            memcpy(mMem, data, size);
+        }
+    }
+    ~BlobReadOnly() {
+        free(mMem);
+    }
+
+private:
+          void * const mMem;
+
+public:
+    const void * const mData;
+          const size_t mSize;
+};
+
+// read/write byte buffer like object
+
+class Blob {
+public:
+    Blob(size_t size) :
+        mData(malloc(size)),
+        mOffset(0),
+        mSize(size),
+        mMem(mData) { }
+
+    // by reference
+    Blob(void *data, size_t size) :
+        mData(data),
+        mOffset(0),
+        mSize(size),
+        mMem(NULL) { }
+
+    ~Blob() {
+        free(mMem);
+    }
+
+    void * const mData;
+          size_t mOffset;
+    const size_t mSize;
+
+private:
+    void * const mMem;
+};
+
+} // namespace android
+
+#endif // ANDROID_BLOB_H
diff --git a/tests/tests/media/libaudiojni/Gate.h b/tests/tests/media/libaudiojni/Gate.h
new file mode 100644
index 0000000..dfc15b7
--- /dev/null
+++ b/tests/tests/media/libaudiojni/Gate.h
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#ifndef ANDROID_GATE_H
+#define ANDROID_GATE_H
+
+#include <stdint.h>
+#include <mutex>
+
+namespace android {
+
+// Gate is a synchronization object.
+//
+// Threads will pass if it is open.
+// Threads will block (wait) if it is closed.
+//
+// When a gate is opened, all waiting threads will pass through.
+//
+// Since gate holds no external locks, consistency with external
+// state needs to be handled elsewhere.
+//
+// We use mWaitCount to indicate the number of threads that have
+// arrived at the gate via wait().  Each thread entering
+// wait obtains a unique waitId (which is the current mWaitCount).
+// This can be viewed as a sequence number.
+//
+// We use mPassCount to indicate the number of threads that have
+// passed the gate.  If the waitId is less than or equal to the mPassCount
+// then that thread has passed the gate.  An open gate sets mPassedCount
+// to the current mWaitCount, allowing all prior threads to pass.
+//
+// See sync_timeline, sync_pt, etc. for graphics.
+
+class Gate {
+public:
+    Gate(bool open = false) :
+        mOpen(open),
+        mExit(false),
+        mWaitCount(0),
+        mPassCount(0)
+    { }
+
+    // waits for the gate to open, returns immediately if gate is already open.
+    //
+    // Do not hold a monitor lock while calling this.
+    //
+    // returns true if we passed the gate normally
+    //         false if gate is terminated and we didn't pass the gate.
+    bool wait() {
+        std::unique_lock<std::mutex> l(mLock);
+        size_t waitId = ++mWaitCount;
+        if (mOpen) {
+            mPassCount = waitId; // let me through
+        }
+        while (!passedGate_l(waitId) && !mExit) {
+            mCondition.wait(l);
+        }
+        return passedGate_l(waitId);
+    }
+
+    // close the gate.
+    void closeGate() {
+        std::lock_guard<std::mutex> l(mLock);
+        mOpen = false;
+        mExit = false;
+    }
+
+    // open the gate.
+    // signal to all waiters it is okay to go.
+    void openGate() {
+        std::lock_guard<std::mutex> l(mLock);
+        mOpen = true;
+        mExit = false;
+        if (waiters_l() > 0) {
+            mPassCount = mWaitCount;  // allow waiting threads to go through
+            // unoptimized pthreads will wake thread to find we still hold lock.
+            mCondition.notify_all();
+        }
+    }
+
+    // terminate (term has expired).
+    // all threads allowed to pass regardless of whether the gate is open or closed.
+    void terminate() {
+        std::lock_guard<std::mutex> l(mLock);
+        mExit = true;
+        if (waiters_l() > 0) {
+            // unoptimized pthreads will wake thread to find we still hold lock.
+            mCondition.notify_all();
+        }
+    }
+
+    bool isOpen() {
+        std::lock_guard<std::mutex> l(mLock);
+        return mOpen;
+    }
+
+    // return how many waiters are at the gate.
+    size_t waiters() {
+        std::lock_guard<std::mutex> l(mLock);
+        return waiters_l();
+    }
+
+private:
+    bool                    mOpen;
+    bool                    mExit;
+    size_t                  mWaitCount;  // total number of threads that have called wait()
+    size_t                  mPassCount;  // total number of threads passed the gate.
+    std::condition_variable mCondition;
+    std::mutex              mLock;
+
+    // return how many waiters are at the gate.
+    inline size_t waiters_l() {
+        return mWaitCount - mPassCount;
+    }
+
+    // return whether the waitId (from mWaitCount) has passed through the gate
+    inline bool passedGate_l(size_t waitId) {
+        return (ssize_t)(waitId - mPassCount) <= 0;
+    }
+};
+
+} // namespace android
+
+#endif // ANDROID_GATE_H
diff --git a/tests/tests/media/libaudiojni/appendix-b-1-1-buffer-queue.cpp b/tests/tests/media/libaudiojni/appendix-b-1-1-buffer-queue.cpp
new file mode 100644
index 0000000..5bb88a7
--- /dev/null
+++ b/tests/tests/media/libaudiojni/appendix-b-1-1-buffer-queue.cpp
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "OpenSL-ES-Test-B-1-1-Buffer-Queue"
+
+#include "sl-utils.h"
+
+/*
+ * See https://www.khronos.org/registry/sles/specs/OpenSL_ES_Specification_1.0.1.pdf
+ * Appendix B.1.1 sample code.
+ *
+ * Minor edits made to conform to Android coding style.
+ *
+ * Correction to code: SL_IID_VOLUME is now made optional for the mixer.
+ * It isn't supported on the standard Android mixer, but it is supported on the player.
+ */
+
+#define MAX_NUMBER_INTERFACES 3
+
+/* Local storage for Audio data in 16 bit words */
+#define AUDIO_DATA_STORAGE_SIZE 4096
+
+#define AUDIO_DATA_SEGMENTS 8
+
+/* Audio data buffer size in 16 bit words. 8 data segments are used in
+   this simple example */
+#define AUDIO_DATA_BUFFER_SIZE (AUDIO_DATA_STORAGE_SIZE / AUDIO_DATA_SEGMENTS)
+
+/* Structure for passing information to callback function */
+typedef struct  {
+    SLPlayItf playItf;
+    SLint16  *pDataBase; // Base address of local audio data storage
+    SLint16  *pData;     // Current address of local audio data storage
+    SLuint32  size;
+} CallbackCntxt;
+
+/* Local storage for Audio data */
+static SLint16 pcmData[AUDIO_DATA_STORAGE_SIZE];
+
+/* Callback for Buffer Queue events */
+static void BufferQueueCallback(
+        SLBufferQueueItf queueItf,
+        void *pContext)
+{
+    SLresult res;
+    CallbackCntxt *pCntxt = (CallbackCntxt*)pContext;
+    if (pCntxt->pData < (pCntxt->pDataBase + pCntxt->size)) {
+        res = (*queueItf)->Enqueue(queueItf, (void *)pCntxt->pData,
+                sizeof(SLint16) * AUDIO_DATA_BUFFER_SIZE); /* Size given in bytes. */
+        ALOGE_IF(res != SL_RESULT_SUCCESS, "error: %s", android::getSLErrStr(res));
+        /* Increase data pointer by buffer size */
+        pCntxt->pData += AUDIO_DATA_BUFFER_SIZE;
+    }
+}
+
+/* Play some music from a buffer queue */
+static void TestPlayMusicBufferQueue(SLObjectItf sl)
+{
+    SLEngineItf EngineItf;
+
+    SLresult res;
+
+    SLDataSource audioSource;
+    SLDataLocator_BufferQueue bufferQueue;
+    SLDataFormat_PCM pcm;
+
+    SLDataSink audioSink;
+    SLDataLocator_OutputMix locator_outputmix;
+
+    SLObjectItf player;
+    SLPlayItf playItf;
+    SLBufferQueueItf bufferQueueItf;
+    SLBufferQueueState state;
+
+    SLObjectItf OutputMix;
+    SLVolumeItf volumeItf;
+
+    int i;
+
+    SLboolean required[MAX_NUMBER_INTERFACES];
+    SLInterfaceID iidArray[MAX_NUMBER_INTERFACES];
+
+    /* Callback context for the buffer queue callback function */
+    CallbackCntxt cntxt;
+
+    /* Get the SL Engine Interface which is implicit */
+    res = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void *)&EngineItf);
+    CheckErr(res);
+
+    /* Initialize arrays required[] and iidArray[] */
+    for (i = 0; i < MAX_NUMBER_INTERFACES; i++) {
+        required[i] = SL_BOOLEAN_FALSE;
+        iidArray[i] = SL_IID_NULL;
+    }
+
+    // Set arrays required[] and iidArray[] for VOLUME interface
+    required[0] = SL_BOOLEAN_FALSE; // ANDROID: we don't require this interface
+    iidArray[0] = SL_IID_VOLUME;
+
+#if 0
+    const unsigned interfaces = 1;
+#else
+
+    /* FIXME: Android doesn't properly support optional interfaces (required == false).
+    [3.1.6] When an application requests explicit interfaces during object creation,
+    it can flag any interface as required. If an implementation is unable to satisfy
+    the request for an interface that is not flagged as required (i.e. it is not required),
+    this will not cause the object to fail creation. On the other hand, if the interface
+    is flagged as required and the implementation is unable to satisfy the request
+    for the interface, the object will not be created.
+    */
+    const unsigned interfaces = 0;
+#endif
+    // Create Output Mix object to be used by player
+    res = (*EngineItf)->CreateOutputMix(EngineItf, &OutputMix, interfaces,
+            iidArray, required);
+    CheckErr(res);
+
+    // Realizing the Output Mix object in synchronous mode.
+    res = (*OutputMix)->Realize(OutputMix, SL_BOOLEAN_FALSE);
+    CheckErr(res);
+
+    volumeItf = NULL; // ANDROID: Volume interface on mix object may not be supported
+    res = (*OutputMix)->GetInterface(OutputMix, SL_IID_VOLUME,
+            (void *)&volumeItf);
+
+    /* Setup the data source structure for the buffer queue */
+    bufferQueue.locatorType = SL_DATALOCATOR_BUFFERQUEUE;
+    bufferQueue.numBuffers = 4; /* Four buffers in our buffer queue */
+
+    /* Setup the format of the content in the buffer queue */
+    pcm.formatType = SL_DATAFORMAT_PCM;
+    pcm.numChannels = 2;
+    pcm.samplesPerSec = SL_SAMPLINGRATE_44_1;
+    pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
+    pcm.containerSize = 16;
+    pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
+    pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;
+    audioSource.pFormat = (void *)&pcm;
+    audioSource.pLocator = (void *)&bufferQueue;
+
+    /* Setup the data sink structure */
+    locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX;
+    locator_outputmix.outputMix = OutputMix;
+    audioSink.pLocator = (void *)&locator_outputmix;
+    audioSink.pFormat = NULL;
+
+    /* Initialize the context for Buffer queue callbacks */
+    cntxt.pDataBase = pcmData;
+    cntxt.pData = cntxt.pDataBase;
+    cntxt.size = sizeof(pcmData) / sizeof(pcmData[0]); // ANDROID: Bug
+
+    /* Set arrays required[] and iidArray[] for SEEK interface
+       (PlayItf is implicit) */
+    required[0] = SL_BOOLEAN_TRUE;
+    iidArray[0] = SL_IID_BUFFERQUEUE;
+
+    /* Create the music player */
+
+    res = (*EngineItf)->CreateAudioPlayer(EngineItf, &player,
+            &audioSource, &audioSink, 1, iidArray, required);
+    CheckErr(res);
+
+    /* Realizing the player in synchronous mode. */
+    res = (*player)->Realize(player, SL_BOOLEAN_FALSE);
+    CheckErr(res);
+
+    /* Get seek and play interfaces */
+    res = (*player)->GetInterface(player, SL_IID_PLAY, (void *)&playItf);
+    CheckErr(res);
+    res = (*player)->GetInterface(player, SL_IID_BUFFERQUEUE,
+            (void *)&bufferQueueItf);
+    CheckErr(res);
+
+    /* Setup to receive buffer queue event callbacks */
+    res = (*bufferQueueItf)->RegisterCallback(bufferQueueItf,
+            BufferQueueCallback, &cntxt /* BUG, was NULL */);
+    CheckErr(res);
+
+    /* Before we start set volume to -3dB (-300mB) */
+    if (volumeItf != NULL) { // ANDROID: Volume interface may not be supported.
+        res = (*volumeItf)->SetVolumeLevel(volumeItf, -300);
+        CheckErr(res);
+    }
+
+    /* Enqueue a few buffers to get the ball rolling */
+    res = (*bufferQueueItf)->Enqueue(bufferQueueItf, cntxt.pData,
+            sizeof(SLint16) * AUDIO_DATA_BUFFER_SIZE); /* Size given in bytes. */
+    CheckErr(res);
+    cntxt.pData += AUDIO_DATA_BUFFER_SIZE;
+    res = (*bufferQueueItf)->Enqueue(bufferQueueItf, cntxt.pData,
+            sizeof(SLint16) * AUDIO_DATA_BUFFER_SIZE); /* Size given in bytes. */
+    CheckErr(res);
+    cntxt.pData += AUDIO_DATA_BUFFER_SIZE;
+    res = (*bufferQueueItf)->Enqueue(bufferQueueItf, cntxt.pData,
+            sizeof(SLint16) * AUDIO_DATA_BUFFER_SIZE); /* Size given in bytes. */
+    CheckErr(res);
+    cntxt.pData += AUDIO_DATA_BUFFER_SIZE;
+
+    /* Play the PCM samples using a buffer queue */
+    res = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_PLAYING);
+    CheckErr(res);
+
+    /* Wait until the PCM data is done playing, the buffer queue callback
+       will continue to queue buffers until the entire PCM data has been
+       played. This is indicated by waiting for the count member of the
+       SLBufferQueueState to go to zero.
+     */
+    res = (*bufferQueueItf)->GetState(bufferQueueItf, &state);
+    CheckErr(res);
+
+    while (state.count) {
+        usleep(5 * 1000 /* usec */); // ANDROID: avoid busy waiting
+        (*bufferQueueItf)->GetState(bufferQueueItf, &state);
+    }
+
+    /* Make sure player is stopped */
+    res = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED);
+    CheckErr(res);
+
+    /* Destroy the player */
+    (*player)->Destroy(player);
+
+    /* Destroy Output Mix object */
+    (*OutputMix)->Destroy(OutputMix);
+}
+
+extern "C" void Java_android_media_cts_AudioNativeTest_nativeAppendixBBufferQueue(
+        JNIEnv * /* env */, jclass /* clazz */)
+{
+    SLObjectItf engineObject = android::OpenSLEngine();
+    LOG_ALWAYS_FATAL_IF(engineObject == NULL, "cannot open OpenSL ES engine");
+
+    TestPlayMusicBufferQueue(engineObject);
+    android::CloseSLEngine(engineObject);
+}
diff --git a/tests/tests/media/libaudiojni/appendix-b-1-2-recording.cpp b/tests/tests/media/libaudiojni/appendix-b-1-2-recording.cpp
new file mode 100644
index 0000000..5f6f3aa
--- /dev/null
+++ b/tests/tests/media/libaudiojni/appendix-b-1-2-recording.cpp
@@ -0,0 +1,221 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "OpenSL-ES-Test-B-1-2-Recording"
+
+#include "sl-utils.h"
+
+/*
+ * See https://www.khronos.org/registry/sles/specs/OpenSL_ES_Specification_1.0.1.pdf
+ * Appendix B.1.2 sample code.
+ *
+ * Minor edits made to conform to Android coding style.
+ *
+ * Correction to code: SL_IID_AUDIOIODEVICECAPABILITIES is not supported.
+ * Detection of microphone should be made in Java layer.
+ */
+
+#define MAX_NUMBER_INTERFACES 5
+#define MAX_NUMBER_INPUT_DEVICES 3
+#define POSITION_UPDATE_PERIOD 1000 /* 1 sec */
+
+static void RecordEventCallback(SLRecordItf caller __unused,
+        void *pContext __unused,
+        SLuint32 recordevent __unused)
+{
+    /* Callback code goes here */
+}
+
+/*
+ * Test recording of audio from a microphone into a specified file
+ */
+static void TestAudioRecording(SLObjectItf sl)
+{
+    SLObjectItf recorder;
+    SLRecordItf recordItf;
+    SLEngineItf EngineItf;
+    SLAudioIODeviceCapabilitiesItf AudioIODeviceCapabilitiesItf;
+    SLAudioInputDescriptor AudioInputDescriptor;
+    SLresult res;
+
+    SLDataSource audioSource;
+    SLDataLocator_IODevice locator_mic;
+    SLDeviceVolumeItf devicevolumeItf;
+    SLDataSink audioSink;
+    SLDataLocator_URI uri;
+    SLDataFormat_MIME mime;
+
+    int i;
+    SLboolean required[MAX_NUMBER_INTERFACES];
+    SLInterfaceID iidArray[MAX_NUMBER_INTERFACES];
+
+    SLuint32 InputDeviceIDs[MAX_NUMBER_INPUT_DEVICES];
+    SLint32 numInputs = 0;
+    SLboolean mic_available = SL_BOOLEAN_FALSE;
+    SLuint32 mic_deviceID = 0;
+
+    /* Get the SL Engine Interface which is implicit */
+    res = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void *)&EngineItf);
+    CheckErr(res);
+
+    AudioIODeviceCapabilitiesItf = NULL;
+    /* Get the Audio IO DEVICE CAPABILITIES interface, which is also
+       implicit */
+    res = (*sl)->GetInterface(sl, SL_IID_AUDIOIODEVICECAPABILITIES,
+            (void *)&AudioIODeviceCapabilitiesItf);
+    // ANDROID: obtaining SL_IID_AUDIOIODEVICECAPABILITIES may fail
+    if (AudioIODeviceCapabilitiesItf != NULL ) {
+        numInputs = MAX_NUMBER_INPUT_DEVICES;
+        res = (*AudioIODeviceCapabilitiesItf)->GetAvailableAudioInputs(
+                AudioIODeviceCapabilitiesItf, &numInputs, InputDeviceIDs);
+        CheckErr(res);
+        /* Search for either earpiece microphone or headset microphone input
+           device - with a preference for the latter */
+        for (i = 0; i < numInputs; i++) {
+            res = (*AudioIODeviceCapabilitiesItf)->QueryAudioInputCapabilities(
+                    AudioIODeviceCapabilitiesItf, InputDeviceIDs[i], &AudioInputDescriptor);
+            CheckErr(res);
+            if ((AudioInputDescriptor.deviceConnection == SL_DEVCONNECTION_ATTACHED_WIRED)
+                    && (AudioInputDescriptor.deviceScope == SL_DEVSCOPE_USER)
+                    && (AudioInputDescriptor.deviceLocation == SL_DEVLOCATION_HEADSET)) {
+                mic_deviceID = InputDeviceIDs[i];
+                mic_available = SL_BOOLEAN_TRUE;
+                break;
+            }
+            else if ((AudioInputDescriptor.deviceConnection == SL_DEVCONNECTION_INTEGRATED)
+                    && (AudioInputDescriptor.deviceScope == SL_DEVSCOPE_USER)
+                    && (AudioInputDescriptor.deviceLocation == SL_DEVLOCATION_HANDSET)) {
+                mic_deviceID = InputDeviceIDs[i];
+                mic_available = SL_BOOLEAN_TRUE;
+                break;
+            }
+        }
+    } else {
+        mic_deviceID = SL_DEFAULTDEVICEID_AUDIOINPUT;
+        mic_available = true;
+    }
+
+    /* If neither of the preferred input audio devices is available, no
+       point in continuing */
+    if (!mic_available) {
+        /* Appropriate error message here */
+        ALOGW("No microphone available");
+        return;
+    }
+
+    /* Initialize arrays required[] and iidArray[] */
+    for (i = 0; i < MAX_NUMBER_INTERFACES; i++) {
+        required[i] = SL_BOOLEAN_FALSE;
+        iidArray[i] = SL_IID_NULL;
+    }
+
+    // ANDROID: the following may fail for volume
+    devicevolumeItf = NULL;
+    /* Get the optional DEVICE VOLUME interface from the engine */
+    res = (*sl)->GetInterface(sl, SL_IID_DEVICEVOLUME,
+            (void *)&devicevolumeItf);
+
+    /* Set recording volume of the microphone to -3 dB */
+    if (devicevolumeItf != NULL) { // ANDROID: Volume may not be supported
+        res = (*devicevolumeItf)->SetVolume(devicevolumeItf, mic_deviceID, -300);
+        CheckErr(res);
+    }
+
+    /* Setup the data source structure */
+    locator_mic.locatorType = SL_DATALOCATOR_IODEVICE;
+    locator_mic.deviceType = SL_IODEVICE_AUDIOINPUT;
+    locator_mic.deviceID = mic_deviceID;
+    locator_mic.device= NULL;
+
+    audioSource.pLocator = (void *)&locator_mic;
+    audioSource.pFormat = NULL;
+
+#if 0
+    /* Setup the data sink structure */
+    uri.locatorType = SL_DATALOCATOR_URI;
+    uri.URI = (SLchar *) "file:///recordsample.wav";
+    mime.formatType = SL_DATAFORMAT_MIME;
+    mime.mimeType = (SLchar *) "audio/x-wav";
+    mime.containerType = SL_CONTAINERTYPE_WAV;
+    audioSink.pLocator = (void *)&uri;
+    audioSink.pFormat = (void *)&mime;
+#else
+    // FIXME: Android requires SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE
+    // because the recorder makes the distinction from SL_DATALOCATOR_BUFFERQUEUE
+    // which the player does not.
+    SLDataLocator_AndroidSimpleBufferQueue loc_bq = {
+            SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2
+    };
+    SLDataFormat_PCM format_pcm = {
+            SL_DATAFORMAT_PCM, 1, SL_SAMPLINGRATE_16,
+            SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16,
+            SL_SPEAKER_FRONT_LEFT, SL_BYTEORDER_LITTLEENDIAN
+    };
+    audioSink = { &loc_bq, &format_pcm };
+#endif
+
+    /* Create audio recorder */
+    res = (*EngineItf)->CreateAudioRecorder(EngineItf, &recorder,
+            &audioSource, &audioSink, 0, iidArray, required);
+    CheckErr(res);
+
+    /* Realizing the recorder in synchronous mode. */
+    res = (*recorder)->Realize(recorder, SL_BOOLEAN_FALSE);
+    CheckErr(res);
+
+    /* Get the RECORD interface - it is an implicit interface */
+    res = (*recorder)->GetInterface(recorder, SL_IID_RECORD, (void *)&recordItf);
+    CheckErr(res);
+
+    // ANDROID: Should register SL_IID_ANDROIDSIMPLEBUFFERQUEUE interface for callback.
+    // but does original SL_DATALOCATOR_BUFFERQUEUE variant work just as well ?
+
+    /* Setup to receive position event callbacks */
+    res = (*recordItf)->RegisterCallback(recordItf, RecordEventCallback, NULL);
+    CheckErr(res);
+
+    /* Set notifications to occur after every second - may be useful in
+       updating a recording progress bar */
+    res = (*recordItf)->SetPositionUpdatePeriod(recordItf, POSITION_UPDATE_PERIOD);
+    CheckErr(res);
+    res = (*recordItf)->SetCallbackEventsMask(recordItf, SL_RECORDEVENT_HEADATNEWPOS);
+    CheckErr(res);
+
+    /* Set the duration of the recording - 30 seconds (30,000
+       milliseconds) */
+    res = (*recordItf)->SetDurationLimit(recordItf, 30000);
+    CheckErr(res);
+
+    /* Record the audio */
+    res = (*recordItf)->SetRecordState(recordItf, SL_RECORDSTATE_RECORDING);
+    CheckErr(res);
+
+    // ANDROID: BUG - we don't wait for anything to record!
+
+    /* Destroy the recorder object */
+    (*recorder)->Destroy(recorder);
+}
+
+extern "C" void Java_android_media_cts_AudioNativeTest_nativeAppendixBRecording(
+        JNIEnv * /* env */, jclass /* clazz */)
+{
+    SLObjectItf engineObject = android::OpenSLEngine();
+    LOG_ALWAYS_FATAL_IF(engineObject == NULL, "cannot open OpenSL ES engine");
+
+    TestAudioRecording(engineObject);
+    android::CloseSLEngine(engineObject);
+}
diff --git a/tests/tests/media/libaudiojni/audio-record-native.cpp b/tests/tests/media/libaudiojni/audio-record-native.cpp
new file mode 100644
index 0000000..9103cdc
--- /dev/null
+++ b/tests/tests/media/libaudiojni/audio-record-native.cpp
@@ -0,0 +1,631 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "audio-record-native"
+
+#include "Blob.h"
+#include "Gate.h"
+#include "sl-utils.h"
+
+#include <deque>
+#include <utils/Errors.h>
+
+// Select whether to use STL shared pointer or to use Android strong pointer.
+// We really don't promote any sharing of this object for its lifetime, but nevertheless could
+// change the shared pointer value on the fly if desired.
+#define USE_SHARED_POINTER
+
+#ifdef USE_SHARED_POINTER
+#include <memory>
+template <typename T> using shared_pointer = std::shared_ptr<T>;
+#else
+#include <utils/RefBase.h>
+template <typename T> using shared_pointer = android::sp<T>;
+#endif
+
+using namespace android;
+
+// Must be kept in sync with Java android.media.cts.AudioRecordNative.ReadFlags
+enum {
+    READ_FLAG_BLOCKING = (1 << 0),
+};
+
+// buffer queue buffers on the OpenSL ES side.
+// The choice can be >= 1.  There is also internal buffering by AudioRecord.
+
+static const size_t BUFFER_SIZE_MSEC = 20;
+
+// TODO: Add a single buffer blocking read mode which does not require additional memory.
+// TODO: Add internal buffer memory (e.g. use circular buffer, right now mallocs on heap).
+
+class AudioRecordNative
+#ifndef USE_SHARED_POINTER
+        : public RefBase // android strong pointers require RefBase
+#endif
+{
+public:
+    AudioRecordNative() :
+        mEngineObj(NULL),
+        mEngine(NULL),
+        mRecordObj(NULL),
+        mRecord(NULL),
+        mBufferQueue(NULL),
+        mRecordState(SL_RECORDSTATE_STOPPED),
+        mBufferSize(0),
+        mNumBuffers(0)
+    { }
+
+    ~AudioRecordNative() {
+        close();
+    }
+
+    typedef std::lock_guard<std::recursive_mutex> auto_lock;
+
+    status_t open(uint32_t numChannels, uint32_t sampleRate, bool useFloat, uint32_t numBuffers) {
+        close();
+        auto_lock l(mLock);
+        mEngineObj = OpenSLEngine();
+        if (mEngineObj == NULL) {
+            ALOGW("cannot create OpenSL ES engine");
+            return INVALID_OPERATION;
+        }
+
+        SLresult res;
+        for (;;) {
+            /* Get the SL Engine Interface which is implicit */
+            res = (*mEngineObj)->GetInterface(mEngineObj, SL_IID_ENGINE, (void *)&mEngine);
+            if (res != SL_RESULT_SUCCESS) break;
+
+            SLDataLocator_IODevice locator_mic;
+            /* Setup the data source structure */
+            locator_mic.locatorType = SL_DATALOCATOR_IODEVICE;
+            locator_mic.deviceType = SL_IODEVICE_AUDIOINPUT;
+            locator_mic.deviceID = SL_DEFAULTDEVICEID_AUDIOINPUT;
+            locator_mic.device= NULL;
+            SLDataSource audioSource;
+            audioSource.pLocator = (void *)&locator_mic;
+            audioSource.pFormat = NULL;
+
+            // FIXME: Android requires SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE
+            // because the recorder makes the distinction from SL_DATALOCATOR_BUFFERQUEUE
+            // which the player does not.
+            SLDataLocator_AndroidSimpleBufferQueue loc_bq = {
+                    SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, numBuffers
+            };
+#if 0
+            SLDataFormat_PCM pcm = {
+                    SL_DATAFORMAT_PCM, 1, SL_SAMPLINGRATE_16,
+                    SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16,
+                    SL_SPEAKER_FRONT_LEFT, SL_BYTEORDER_LITTLEENDIAN
+            };
+#else
+            SLAndroidDataFormat_PCM_EX pcm;
+            pcm.formatType = useFloat ? SL_ANDROID_DATAFORMAT_PCM_EX : SL_DATAFORMAT_PCM;
+            pcm.numChannels = numChannels;
+            pcm.sampleRate = sampleRate * 1000;
+            pcm.bitsPerSample = useFloat ?
+                    SL_PCMSAMPLEFORMAT_FIXED_32 : SL_PCMSAMPLEFORMAT_FIXED_16;
+            pcm.containerSize = pcm.bitsPerSample;
+            pcm.channelMask = channelCountToMask(numChannels);
+            pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;
+            // additional
+            pcm.representation = useFloat ? SL_ANDROID_PCM_REPRESENTATION_FLOAT
+                                    : SL_ANDROID_PCM_REPRESENTATION_SIGNED_INT;
+#endif
+            SLDataSink audioSink;
+            audioSink = { &loc_bq, &pcm };
+
+            SLboolean required[2];
+            SLInterfaceID iidArray[2];
+            /* Request the AndroidSimpleBufferQueue and AndroidConfiguration interfaces */
+            required[0] = SL_BOOLEAN_TRUE;
+            iidArray[0] = SL_IID_ANDROIDSIMPLEBUFFERQUEUE;
+            required[1] = SL_BOOLEAN_TRUE;
+            iidArray[1] = SL_IID_ANDROIDCONFIGURATION;
+
+            ALOGV("creating recorder");
+            /* Create audio recorder */
+            res = (*mEngine)->CreateAudioRecorder(mEngine, &mRecordObj,
+                    &audioSource, &audioSink, 2, iidArray, required);
+            if (res != SL_RESULT_SUCCESS) break;
+
+            ALOGV("realizing recorder");
+            /* Realizing the recorder in synchronous mode. */
+            res = (*mRecordObj)->Realize(mRecordObj, SL_BOOLEAN_FALSE /* async */);
+            if (res != SL_RESULT_SUCCESS) break;
+
+            ALOGV("geting record interface");
+            /* Get the RECORD interface - it is an implicit interface */
+            res = (*mRecordObj)->GetInterface(mRecordObj, SL_IID_RECORD, (void *)&mRecord);
+            if (res != SL_RESULT_SUCCESS) break;
+
+            ALOGV("geting buffer queue interface");
+            /* Get the buffer queue interface which was explicitly requested */
+            res = (*mRecordObj)->GetInterface(mRecordObj, SL_IID_ANDROIDSIMPLEBUFFERQUEUE,
+                    (void *)&mBufferQueue);
+            if (res != SL_RESULT_SUCCESS) break;
+
+            ALOGV("registering buffer queue interface");
+            /* Setup to receive buffer queue event callbacks */
+            res = (*mBufferQueue)->RegisterCallback(mBufferQueue, BufferQueueCallback, this);
+            if (res != SL_RESULT_SUCCESS) break;
+
+            mBufferSize = (BUFFER_SIZE_MSEC * sampleRate / 1000)
+                    * numChannels * (useFloat ? sizeof(float) : sizeof(int16_t));
+            mNumBuffers = numBuffers;
+            // success
+            break;
+        }
+        if (res != SL_RESULT_SUCCESS) {
+            close(); // should be safe to close even with lock held
+            ALOGW("open error %s", android::getSLErrStr(res));
+            return INVALID_OPERATION;
+        }
+        return OK;
+    }
+
+    void close() {
+        SLObjectItf engineObj;
+        SLObjectItf recordObj;
+        {
+            auto_lock l(mLock);
+            (void)stop();
+            // once stopped, we can unregister the callback
+            if (mBufferQueue != NULL) {
+                (void)(*mBufferQueue)->RegisterCallback(
+                        mBufferQueue, NULL /* callback */, NULL /* *pContext */);
+            }
+            (void)flush();
+            engineObj = mEngineObj;
+            recordObj = mRecordObj;
+            // clear out interfaces and objects
+            mRecord = NULL;
+            mBufferQueue = NULL;
+            mEngine = NULL;
+            mRecordObj = NULL;
+            mEngineObj = NULL;
+            mRecordState = SL_RECORDSTATE_STOPPED;
+            mBufferSize = 0;
+            mNumBuffers = 0;
+        }
+        // destroy without lock
+        if (recordObj != NULL) {
+            (*recordObj)->Destroy(recordObj);
+        }
+        if (engineObj) {
+            CloseSLEngine(engineObj);
+        }
+    }
+
+    status_t setRecordState(SLuint32 recordState) {
+        auto_lock l(mLock);
+        if (mRecord == NULL) {
+            return INVALID_OPERATION;
+        }
+        if (recordState == SL_RECORDSTATE_RECORDING) {
+            queueBuffers();
+        }
+        SLresult res = (*mRecord)->SetRecordState(mRecord, recordState);
+        if (res != SL_RESULT_SUCCESS) {
+            ALOGW("setRecordState %d error %s", recordState, android::getSLErrStr(res));
+            return INVALID_OPERATION;
+        }
+        mRecordState = recordState;
+        return OK;
+    }
+
+    SLuint32 getRecordState() {
+        auto_lock l(mLock);
+        if (mRecord == NULL) {
+            return SL_RECORDSTATE_STOPPED;
+        }
+        SLuint32 recordState;
+        SLresult res = (*mRecord)->GetRecordState(mRecord, &recordState);
+        if (res != SL_RESULT_SUCCESS) {
+            ALOGW("getRecordState error %s", android::getSLErrStr(res));
+            return SL_RECORDSTATE_STOPPED;
+        }
+        return recordState;
+    }
+
+    status_t getPositionInMsec(int64_t *position) {
+        auto_lock l(mLock);
+        if (mRecord == NULL) {
+            return INVALID_OPERATION;
+        }
+        if (position == NULL) {
+            return BAD_VALUE;
+        }
+        SLuint32 pos;
+        SLresult res = (*mRecord)->GetPosition(mRecord, &pos);
+        if (res != SL_RESULT_SUCCESS) {
+            ALOGW("getPosition error %s", android::getSLErrStr(res));
+            return INVALID_OPERATION;
+        }
+        // only lower 32 bits valid
+        *position = pos;
+        return OK;
+    }
+
+    status_t start() {
+        return setRecordState(SL_RECORDSTATE_RECORDING);
+    }
+
+    status_t pause() {
+        return setRecordState(SL_RECORDSTATE_PAUSED);
+    }
+
+    status_t stop() {
+        return setRecordState(SL_RECORDSTATE_STOPPED);
+    }
+
+    status_t flush() {
+        auto_lock l(mLock);
+        status_t result = OK;
+        if (mBufferQueue != NULL) {
+            SLresult res = (*mBufferQueue)->Clear(mBufferQueue);
+            if (res != SL_RESULT_SUCCESS) {
+                return INVALID_OPERATION;
+            }
+        }
+        mReadyQueue.clear();
+        // possible race if the engine is in the callback
+        // safety is only achieved if the recorder is paused or stopped.
+        mDeliveredQueue.clear();
+        mReadBlob = NULL;
+        mReadReady.terminate();
+        return result;
+    }
+
+    ssize_t read(void *buffer, size_t size, bool blocking = false) {
+        std::lock_guard<std::mutex> rl(mReadLock);
+        // not needed if we assume that a single thread is doing the reading
+        // or we always operate in non-blocking mode.
+
+        ALOGV("reading:%p  %zu", buffer, size);
+        size_t copied;
+        std::shared_ptr<Blob> blob;
+        {
+            auto_lock l(mLock);
+            if (mEngine == NULL) {
+                return INVALID_OPERATION;
+            }
+            size_t osize = size;
+            while (!mReadyQueue.empty() && size > 0) {
+                auto b = mReadyQueue.front();
+                size_t tocopy = min(size, b->mSize - b->mOffset);
+                // ALOGD("buffer:%p  size:%zu  b->mSize:%zu  b->mOffset:%zu tocopy:%zu ",
+                //        buffer, size, b->mSize, b->mOffset, tocopy);
+                memcpy(buffer, (char *)b->mData + b->mOffset, tocopy);
+                buffer = (char *)buffer + tocopy;
+                size -= tocopy;
+                b->mOffset += tocopy;
+                if (b->mOffset == b->mSize) {
+                    mReadyQueue.pop_front();
+                }
+            }
+            copied = osize - size;
+            if (!blocking || size == 0 || mReadBlob.get() != NULL) {
+                return copied;
+            }
+            blob = std::make_shared<Blob>(buffer, size);
+            mReadBlob = blob;
+            mReadReady.closeGate(); // the callback will open gate when read is completed.
+        }
+        if (mReadReady.wait()) {
+            // success then the blob is ours with valid data otherwise a flush has occurred
+            // and we return a short count.
+            copied += blob->mOffset;
+        }
+        return copied;
+    }
+
+    void logBufferState() {
+        auto_lock l(mLock);
+        SLBufferQueueState state;
+        SLresult res = (*mBufferQueue)->GetState(mBufferQueue, &state);
+        CheckErr(res);
+        ALOGD("logBufferState state.count:%d  state.playIndex:%d", state.count, state.playIndex);
+    }
+
+    size_t getBuffersPending() {
+        auto_lock l(mLock);
+        return mReadyQueue.size();
+    }
+
+private:
+    status_t queueBuffers() {
+        if (mBufferQueue == NULL) {
+            return INVALID_OPERATION;
+        }
+        if (mReadyQueue.size() + mDeliveredQueue.size() < mNumBuffers) {
+            // add new empty buffer
+            auto b = std::make_shared<Blob>(mBufferSize);
+            mDeliveredQueue.emplace_back(b);
+            (*mBufferQueue)->Enqueue(mBufferQueue, b->mData, b->mSize);
+        }
+        return OK;
+    }
+
+    void bufferQueueCallback(SLBufferQueueItf queueItf) {
+        auto_lock l(mLock);
+        if (queueItf != mBufferQueue) {
+            ALOGW("invalid buffer queue interface, ignoring");
+            return;
+        }
+        // logBufferState();
+
+        // remove from delivered queue
+        if (mDeliveredQueue.size()) {
+            auto b = mDeliveredQueue.front();
+            mDeliveredQueue.pop_front();
+            if (mReadBlob.get() != NULL) {
+                size_t tocopy = min(mReadBlob->mSize - mReadBlob->mOffset, b->mSize - b->mOffset);
+                memcpy((char *)mReadBlob->mData + mReadBlob->mOffset,
+                        (char *)b->mData + b->mOffset, tocopy);
+                b->mOffset += tocopy;
+                mReadBlob->mOffset += tocopy;
+                if (mReadBlob->mOffset == mReadBlob->mSize) {
+                    mReadBlob = NULL;      // we're done, clear our reference.
+                    mReadReady.openGate(); // allow read to continue.
+                }
+                if (b->mOffset == b->mSize) {
+                    b = NULL;
+                }
+            }
+            if (b.get() != NULL) {
+                if (mReadyQueue.size() + mDeliveredQueue.size() < mNumBuffers) {
+                    mReadyQueue.emplace_back(b); // save onto ready queue for future reads
+                } else {
+                    ALOGW("dropping data");
+                }
+            }
+        } else {
+            ALOGW("no delivered data!");
+        }
+        queueBuffers();
+    }
+
+    static void BufferQueueCallback(SLBufferQueueItf queueItf, void *pContext) {
+        SLresult res;
+        // naked native record
+        AudioRecordNative *record = (AudioRecordNative *)pContext;
+        record->bufferQueueCallback(queueItf);
+    }
+
+    SLObjectItf           mEngineObj;
+    SLEngineItf           mEngine;
+    SLObjectItf           mRecordObj;
+    SLRecordItf           mRecord;
+    SLBufferQueueItf      mBufferQueue;
+    SLuint32              mRecordState;
+    size_t                mBufferSize;
+    size_t                mNumBuffers;
+    std::recursive_mutex  mLock;          // monitor lock - locks public API methods and callback.
+                                          // recursive since it may call itself through API.
+    std::mutex            mReadLock;      // read lock - for blocking mode, prevents multiple
+                                          // reader threads from overlapping reads.  this is
+                                          // generally unnecessary as reads occur from
+                                          // one thread only.  acquire this before mLock.
+    std::shared_ptr<Blob> mReadBlob;
+    Gate                  mReadReady;
+    std::deque<std::shared_ptr<Blob>> mReadyQueue;     // ready for read.
+    std::deque<std::shared_ptr<Blob>> mDeliveredQueue; // delivered to BufferQueue
+};
+
+/* Java static methods.
+ *
+ * These are not directly exposed to the user, so we can assume a valid "jrecord" handle
+ * to be passed in.
+ */
+
+extern "C" jint Java_android_media_cts_AudioRecordNative_nativeTest(
+    JNIEnv * /* env */, jclass /* clazz */,
+    jint numChannels, jint sampleRate, jboolean useFloat,
+    jint msecPerBuffer, jint numBuffers)
+{
+    AudioRecordNative record;
+    const size_t frameSize = numChannels * (useFloat ? sizeof(float) : sizeof(int16_t));
+    const size_t framesPerBuffer = msecPerBuffer * sampleRate / 1000;
+
+    status_t res;
+    void *buffer = calloc(framesPerBuffer * numBuffers, frameSize);
+    for (;;) {
+        res = record.open(numChannels, sampleRate, useFloat, numBuffers);
+        if (res != OK) break;
+
+        record.logBufferState();
+        res = record.start();
+        if (res != OK) break;
+
+        size_t size = framesPerBuffer * numBuffers * frameSize;
+        for (size_t offset = 0; size - offset > 0; ) {
+            ssize_t amount = record.read((char *)buffer + offset, size -offset);
+            // ALOGD("read amount: %zd", amount);
+            if (amount < 0) break;
+            offset += amount;
+            usleep(5 * 1000 /* usec */);
+        }
+
+        res = record.stop();
+        break;
+    }
+    record.close();
+    free(buffer);
+    return res;
+}
+
+extern "C" jlong Java_android_media_cts_AudioRecordNative_nativeCreateRecord(
+    JNIEnv * /* env */, jclass /* clazz */)
+{
+    return (jlong)(new shared_pointer<AudioRecordNative>(new AudioRecordNative()));
+}
+
+extern "C" void Java_android_media_cts_AudioRecordNative_nativeDestroyRecord(
+    JNIEnv * /* env */, jclass /* clazz */, jlong jrecord)
+{
+    delete (shared_pointer<AudioRecordNative> *)jrecord;
+}
+
+extern "C" jint Java_android_media_cts_AudioRecordNative_nativeOpen(
+    JNIEnv * /* env */, jclass /* clazz */, jlong jrecord,
+    jint numChannels, jint sampleRate, jboolean useFloat, jint numBuffers)
+{
+    auto record = *(shared_pointer<AudioRecordNative> *)jrecord;
+    if (record.get() == NULL) {
+        return (jint)INVALID_OPERATION;
+    }
+    return (jint)record->open(numChannels, sampleRate, useFloat == JNI_TRUE,
+            numBuffers);
+}
+
+extern "C" void Java_android_media_cts_AudioRecordNative_nativeClose(
+    JNIEnv * /* env */, jclass /* clazz */, jlong jrecord)
+{
+    auto record = *(shared_pointer<AudioRecordNative> *)jrecord;
+    if (record.get() != NULL) {
+        record->close();
+    }
+}
+
+extern "C" jint Java_android_media_cts_AudioRecordNative_nativeStart(
+    JNIEnv * /* env */, jclass /* clazz */, jlong jrecord)
+{
+    auto record = *(shared_pointer<AudioRecordNative> *)jrecord;
+    if (record.get() == NULL) {
+        return (jint)INVALID_OPERATION;
+    }
+    return (jint)record->start();
+}
+
+extern "C" jint Java_android_media_cts_AudioRecordNative_nativeStop(
+    JNIEnv * /* env */, jclass /* clazz */, jlong jrecord)
+{
+    auto record = *(shared_pointer<AudioRecordNative> *)jrecord;
+    if (record.get() == NULL) {
+        return (jint)INVALID_OPERATION;
+    }
+    return (jint)record->stop();
+}
+
+extern "C" jint Java_android_media_cts_AudioRecordNative_nativePause(
+    JNIEnv * /* env */, jclass /* clazz */, jlong jrecord)
+{
+    auto record = *(shared_pointer<AudioRecordNative> *)jrecord;
+    if (record.get() == NULL) {
+        return (jint)INVALID_OPERATION;
+    }
+    return (jint)record->pause();
+}
+
+extern "C" jint Java_android_media_cts_AudioRecordNative_nativeFlush(
+    JNIEnv * /* env */, jclass /* clazz */, jlong jrecord)
+{
+    auto record = *(shared_pointer<AudioRecordNative> *)jrecord;
+    if (record.get() == NULL) {
+        return (jint)INVALID_OPERATION;
+    }
+    return (jint)record->flush();
+}
+
+extern "C" jint Java_android_media_cts_AudioRecordNative_nativeGetPositionInMsec(
+    JNIEnv *env, jclass /* clazz */, jlong jrecord, jlongArray jPosition)
+{
+    auto record = *(shared_pointer<AudioRecordNative> *)jrecord;
+    if (record.get() == NULL) {
+        return (jint)INVALID_OPERATION;
+    }
+    int64_t pos;
+    status_t res = record->getPositionInMsec(&pos);
+    if (res != OK) {
+        return res;
+    }
+    jlong *nPostition = (jlong *) env->GetPrimitiveArrayCritical(jPosition, NULL /* isCopy */);
+    if (nPostition == NULL) {
+        ALOGE("Unable to get array for nativeGetPositionInMsec()");
+        return BAD_VALUE;
+    }
+    nPostition[0] = (jlong)pos;
+    env->ReleasePrimitiveArrayCritical(jPosition, nPostition, 0 /* mode */);
+    return OK;
+}
+
+
+extern "C" jint Java_android_media_cts_AudioRecordNative_nativeGetBuffersPending(
+    JNIEnv * /* env */, jclass /* clazz */, jlong jrecord)
+{
+    auto record = *(shared_pointer<AudioRecordNative> *)jrecord;
+    if (record.get() == NULL) {
+        return (jint)0;
+    }
+    return (jint)record->getBuffersPending();
+}
+
+template <typename T>
+static inline jint readFromRecord(jlong jrecord, T *data,
+    jint offsetInSamples, jint sizeInSamples, jint readFlags)
+{
+    auto record = *(shared_pointer<AudioRecordNative> *)jrecord;
+    if (record.get() == NULL) {
+        return (jint)INVALID_OPERATION;
+    }
+
+    const bool isBlocking = readFlags & READ_FLAG_BLOCKING;
+    const size_t sizeInBytes = sizeInSamples * sizeof(T);
+    ssize_t ret = record->read(data + offsetInSamples, sizeInBytes, isBlocking == JNI_TRUE);
+    return (jint)(ret > 0 ? ret / sizeof(T) : ret);
+}
+
+template <typename T>
+static inline jint readArray(JNIEnv *env, jclass /* clazz */, jlong jrecord,
+        T javaAudioData, jint offsetInSamples, jint sizeInSamples, jint readFlags)
+{
+    if (javaAudioData == NULL) {
+        return (jint)BAD_VALUE;
+    }
+
+    auto cAudioData = envGetArrayElements(env, javaAudioData, NULL /* isCopy */);
+    if (cAudioData == NULL) {
+        ALOGE("Error retrieving destination of audio data to record");
+        return (jint)BAD_VALUE;
+    }
+
+    jint ret = readFromRecord(jrecord, cAudioData, offsetInSamples, sizeInSamples, readFlags);
+    envReleaseArrayElements(env, javaAudioData, cAudioData, 0 /* mode */);
+    return ret;
+}
+
+extern "C" jint Java_android_media_cts_AudioRecordNative_nativeReadByteArray(
+    JNIEnv *env, jclass clazz, jlong jrecord,
+    jbyteArray byteArray, jint offsetInSamples, jint sizeInSamples, jint readFlags)
+{
+    return readArray(env, clazz, jrecord, byteArray, offsetInSamples, sizeInSamples, readFlags);
+}
+
+extern "C" jint Java_android_media_cts_AudioRecordNative_nativeReadShortArray(
+    JNIEnv *env, jclass clazz, jlong jrecord,
+    jshortArray shortArray, jint offsetInSamples, jint sizeInSamples, jint readFlags)
+{
+    return readArray(env, clazz, jrecord, shortArray, offsetInSamples, sizeInSamples, readFlags);
+}
+
+extern "C" jint Java_android_media_cts_AudioRecordNative_nativeReadFloatArray(
+    JNIEnv *env, jclass clazz, jlong jrecord,
+    jfloatArray floatArray, jint offsetInSamples, jint sizeInSamples, jint readFlags)
+{
+    return readArray(env, clazz, jrecord, floatArray, offsetInSamples, sizeInSamples, readFlags);
+}
diff --git a/tests/tests/media/libaudiojni/audio-track-native.cpp b/tests/tests/media/libaudiojni/audio-track-native.cpp
new file mode 100644
index 0000000..d51a751
--- /dev/null
+++ b/tests/tests/media/libaudiojni/audio-track-native.cpp
@@ -0,0 +1,579 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "audio-track-native"
+
+#include "Blob.h"
+#include "Gate.h"
+#include "sl-utils.h"
+
+#include <deque>
+#include <utils/Errors.h>
+
+// Select whether to use STL shared pointer or to use Android strong pointer.
+// We really don't promote any sharing of this object for its lifetime, but nevertheless could
+// change the shared pointer value on the fly if desired.
+#define USE_SHARED_POINTER
+
+#ifdef USE_SHARED_POINTER
+#include <memory>
+template <typename T> using shared_pointer = std::shared_ptr<T>;
+#else
+#include <utils/RefBase.h>
+template <typename T> using shared_pointer = android::sp<T>;
+#endif
+
+using namespace android;
+
+// Must be kept in sync with Java android.media.cts.AudioTrackNative.WriteFlags
+enum {
+    WRITE_FLAG_BLOCKING = (1 << 0),
+};
+
+// TODO: Add a single buffer blocking write mode which does not require additional memory.
+// TODO: Add internal buffer memory (e.g. use circular buffer, right now mallocs on heap).
+
+class AudioTrackNative
+#ifndef USE_SHARED_POINTER
+        : public RefBase // android strong pointers require RefBase
+#endif
+{
+public:
+    AudioTrackNative() :
+        mEngineObj(NULL),
+        mEngine(NULL),
+        mOutputMixObj(NULL),
+        mPlayerObj(NULL),
+        mPlay(NULL),
+        mBufferQueue(NULL),
+        mPlayState(SL_PLAYSTATE_STOPPED),
+        mNumBuffers(0)
+    { }
+
+    ~AudioTrackNative() {
+        close();
+    }
+
+    typedef std::lock_guard<std::recursive_mutex> auto_lock;
+
+    status_t open(uint32_t numChannels, uint32_t sampleRate, bool useFloat,
+            uint32_t numBuffers) {
+        close();
+        auto_lock l(mLock);
+        mEngineObj = OpenSLEngine();
+        if (mEngineObj == NULL) {
+            ALOGW("cannot create OpenSL ES engine");
+            return INVALID_OPERATION;
+        }
+
+        SLresult res;
+        for (;;) {
+            /* Get the SL Engine Interface which is implicit */
+            res = (*mEngineObj)->GetInterface(mEngineObj, SL_IID_ENGINE, (void *)&mEngine);
+            if (res != SL_RESULT_SUCCESS) break;
+
+            // Create Output Mix object to be used by player
+            res = (*mEngine)->CreateOutputMix(
+                    mEngine, &mOutputMixObj, 0 /* numInterfaces */,
+                    NULL /* pInterfaceIds */, NULL /* pInterfaceRequired */);
+            if (res != SL_RESULT_SUCCESS) break;
+
+            // Realizing the Output Mix object in synchronous mode.
+            res = (*mOutputMixObj)->Realize(mOutputMixObj, SL_BOOLEAN_FALSE /* async */);
+            if (res != SL_RESULT_SUCCESS) break;
+
+            /* Setup the data source structure for the buffer queue */
+            SLDataLocator_BufferQueue bufferQueue;
+            bufferQueue.locatorType = SL_DATALOCATOR_BUFFERQUEUE;
+            bufferQueue.numBuffers = numBuffers;
+            mNumBuffers = numBuffers;
+
+            /* Setup the format of the content in the buffer queue */
+
+            SLAndroidDataFormat_PCM_EX pcm;
+            pcm.formatType = useFloat ? SL_ANDROID_DATAFORMAT_PCM_EX : SL_DATAFORMAT_PCM;
+            pcm.numChannels = numChannels;
+            pcm.sampleRate = sampleRate * 1000;
+            pcm.bitsPerSample = useFloat ?
+                    SL_PCMSAMPLEFORMAT_FIXED_32 : SL_PCMSAMPLEFORMAT_FIXED_16;
+            pcm.containerSize = pcm.bitsPerSample;
+            pcm.channelMask = channelCountToMask(numChannels);
+            pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;
+            // additional
+            pcm.representation = useFloat ? SL_ANDROID_PCM_REPRESENTATION_FLOAT
+                                    : SL_ANDROID_PCM_REPRESENTATION_SIGNED_INT;
+            SLDataSource audioSource;
+            audioSource.pFormat = (void *)&pcm;
+            audioSource.pLocator = (void *)&bufferQueue;
+
+            /* Setup the data sink structure */
+            SLDataLocator_OutputMix locator_outputmix;
+            locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX;
+            locator_outputmix.outputMix = mOutputMixObj;
+
+            SLDataSink audioSink;
+            audioSink.pLocator = (void *)&locator_outputmix;
+            audioSink.pFormat = NULL;
+
+            SLboolean required[1];
+            SLInterfaceID iidArray[1];
+            required[0] = SL_BOOLEAN_TRUE;
+            iidArray[0] = SL_IID_BUFFERQUEUE;
+
+            res = (*mEngine)->CreateAudioPlayer(mEngine, &mPlayerObj,
+                    &audioSource, &audioSink, 1 /* numInterfaces */, iidArray, required);
+            if (res != SL_RESULT_SUCCESS) break;
+
+            res = (*mPlayerObj)->Realize(mPlayerObj, SL_BOOLEAN_FALSE /* async */);
+            if (res != SL_RESULT_SUCCESS) break;
+
+            res = (*mPlayerObj)->GetInterface(mPlayerObj, SL_IID_PLAY, (void*)&mPlay);
+            if (res != SL_RESULT_SUCCESS) break;
+
+            res = (*mPlayerObj)->GetInterface(
+                    mPlayerObj, SL_IID_BUFFERQUEUE, (void*)&mBufferQueue);
+            if (res != SL_RESULT_SUCCESS) break;
+
+            /* Setup to receive buffer queue event callbacks */
+            res = (*mBufferQueue)->RegisterCallback(mBufferQueue, BufferQueueCallback, this);
+            if (res != SL_RESULT_SUCCESS) break;
+
+            // success
+            break;
+        }
+        if (res != SL_RESULT_SUCCESS) {
+            close(); // should be safe to close even with lock held
+            ALOGW("open error %s", android::getSLErrStr(res));
+            return INVALID_OPERATION;
+        }
+        return OK;
+    }
+
+    void close() {
+        SLObjectItf engineObj;
+        SLObjectItf outputMixObj;
+        SLObjectItf playerObj;
+        {
+            auto_lock l(mLock);
+            if (mPlay != NULL && mPlayState != SL_PLAYSTATE_STOPPED) {
+                (void)stop();
+            }
+            // once stopped, we can unregister the callback
+            if (mBufferQueue != NULL) {
+                (void)(*mBufferQueue)->RegisterCallback(
+                        mBufferQueue, NULL /* callback */, NULL /* *pContext */);
+            }
+            (void)flush();
+            engineObj = mEngineObj;
+            outputMixObj = mOutputMixObj;
+            playerObj = mPlayerObj;
+            // clear out interfaces and objects
+            mPlay = NULL;
+            mBufferQueue = NULL;
+            mEngine = NULL;
+            mPlayerObj = NULL;
+            mOutputMixObj = NULL;
+            mEngineObj = NULL;
+            mPlayState = SL_PLAYSTATE_STOPPED;
+        }
+        // destroy without lock
+        if (playerObj != NULL) {
+            (*playerObj)->Destroy(playerObj);
+        }
+        if (outputMixObj != NULL) {
+            (*outputMixObj)->Destroy(outputMixObj);
+        }
+        if (engineObj != NULL) {
+            CloseSLEngine(engineObj);
+        }
+    }
+
+    status_t setPlayState(SLuint32 playState) {
+        auto_lock l(mLock);
+        if (mPlay == NULL) {
+            return INVALID_OPERATION;
+        }
+        SLresult res = (*mPlay)->SetPlayState(mPlay, playState);
+        if (res != SL_RESULT_SUCCESS) {
+            ALOGW("setPlayState %d error %s", playState, android::getSLErrStr(res));
+            return INVALID_OPERATION;
+        }
+        mPlayState = playState;
+        return OK;
+    }
+
+    SLuint32 getPlayState() {
+        auto_lock l(mLock);
+        if (mPlay == NULL) {
+            return SL_PLAYSTATE_STOPPED;
+        }
+        SLuint32 playState;
+        SLresult res = (*mPlay)->GetPlayState(mPlay, &playState);
+        if (res != SL_RESULT_SUCCESS) {
+            ALOGW("getPlayState error %s", android::getSLErrStr(res));
+            return SL_PLAYSTATE_STOPPED;
+        }
+        return playState;
+    }
+
+    status_t getPositionInMsec(int64_t *position) {
+        auto_lock l(mLock);
+        if (mPlay == NULL) {
+            return INVALID_OPERATION;
+        }
+        if (position == NULL) {
+            return BAD_VALUE;
+        }
+        SLuint32 pos;
+        SLresult res = (*mPlay)->GetPosition(mPlay, &pos);
+        if (res != SL_RESULT_SUCCESS) {
+            ALOGW("getPosition error %s", android::getSLErrStr(res));
+            return INVALID_OPERATION;
+        }
+        // only lower 32 bits valid
+        *position = pos;
+        return OK;
+    }
+
+    status_t start() {
+        return setPlayState(SL_PLAYSTATE_PLAYING);
+    }
+
+    status_t pause() {
+        return setPlayState(SL_PLAYSTATE_PAUSED);
+    }
+
+    status_t stop() {
+        return setPlayState(SL_PLAYSTATE_STOPPED);
+    }
+
+    status_t flush() {
+        auto_lock l(mLock);
+        status_t result = OK;
+        if (mBufferQueue != NULL) {
+            SLresult res = (*mBufferQueue)->Clear(mBufferQueue);
+            if (res != SL_RESULT_SUCCESS) {
+                return INVALID_OPERATION;
+            }
+        }
+
+        // possible race if the engine is in the callback
+        // safety is only achieved if the player is paused or stopped.
+        mDeliveredQueue.clear();
+        return result;
+    }
+
+    status_t write(const void *buffer, size_t size, bool isBlocking = false) {
+        std::lock_guard<std::mutex> rl(mWriteLock);
+        // not needed if we assume that a single thread is doing the reading
+        // or we always operate in non-blocking mode.
+
+        {
+            auto_lock l(mLock);
+            if (mBufferQueue == NULL) {
+                return INVALID_OPERATION;
+            }
+            if (mDeliveredQueue.size() < mNumBuffers) {
+                auto b = std::make_shared<BlobReadOnly>(buffer, size, false /* byReference */);
+                mDeliveredQueue.emplace_back(b);
+                (*mBufferQueue)->Enqueue(mBufferQueue, b->mData, b->mSize);
+                return size;
+            }
+            if (!isBlocking) {
+                return 0;
+            }
+            mWriteReady.closeGate(); // we're full.
+        }
+        if (mWriteReady.wait()) {
+            auto_lock l(mLock);
+            if (mDeliveredQueue.size() < mNumBuffers) {
+                auto b = std::make_shared<BlobReadOnly>(buffer, size, false /* byReference */);
+                mDeliveredQueue.emplace_back(b);
+                (*mBufferQueue)->Enqueue(mBufferQueue, b->mData, b->mSize);
+                return size;
+            }
+        }
+        ALOGW("unable to deliver write");
+        return 0;
+    }
+
+    void logBufferState() {
+        auto_lock l(mLock);
+        SLBufferQueueState state;
+        SLresult res = (*mBufferQueue)->GetState(mBufferQueue, &state);
+        CheckErr(res);
+        ALOGD("logBufferState state.count:%d  state.playIndex:%d", state.count, state.playIndex);
+    }
+
+    size_t getBuffersPending() {
+        auto_lock l(mLock);
+        return mDeliveredQueue.size();
+    }
+
+private:
+    void bufferQueueCallback(SLBufferQueueItf queueItf) {
+        auto_lock l(mLock);
+        if (queueItf != mBufferQueue) {
+            ALOGW("invalid buffer queue interface, ignoring");
+            return;
+        }
+        // logBufferState();
+
+        // remove from delivered queue
+        if (mDeliveredQueue.size()) {
+            mDeliveredQueue.pop_front();
+        } else {
+            ALOGW("no delivered data!");
+        }
+        if (!mWriteReady.isOpen()) {
+            mWriteReady.openGate();
+        }
+    }
+
+    static void BufferQueueCallback(SLBufferQueueItf queueItf, void *pContext) {
+        SLresult res;
+        // naked native track
+        AudioTrackNative *track = (AudioTrackNative *)pContext;
+        track->bufferQueueCallback(queueItf);
+    }
+
+    SLObjectItf          mEngineObj;
+    SLEngineItf          mEngine;
+    SLObjectItf          mOutputMixObj;
+    SLObjectItf          mPlayerObj;
+    SLPlayItf            mPlay;
+    SLBufferQueueItf     mBufferQueue;
+    SLuint32             mPlayState;
+    SLuint32             mNumBuffers;
+    std::recursive_mutex mLock;           // monitor lock - locks public API methods and callback.
+                                          // recursive since it may call itself through API.
+    std::mutex           mWriteLock;      // write lock - for blocking mode, prevents multiple
+                                          // writer threads from overlapping writes.  this is
+                                          // generally unnecessary as writes occur from
+                                          // one thread only.  acquire this before mLock.
+    Gate                 mWriteReady;
+    std::deque<std::shared_ptr<BlobReadOnly>> mDeliveredQueue; // delivered to mBufferQueue
+};
+
+/* Java static methods.
+ *
+ * These are not directly exposed to the user, so we can assume a valid "jtrack" handle
+ * to be passed in.
+ */
+
+extern "C" jint Java_android_media_cts_AudioTrackNative_nativeTest(
+    JNIEnv * /* env */, jclass /* clazz */,
+    jint numChannels, jint sampleRate, jboolean useFloat,
+    jint msecPerBuffer, jint numBuffers)
+{
+    AudioTrackNative track;
+    const size_t frameSize = numChannels * (useFloat ? sizeof(float) : sizeof(int16_t));
+    const size_t framesPerBuffer = msecPerBuffer * sampleRate / 1000;
+
+    status_t res;
+    void *buffer = calloc(framesPerBuffer * numBuffers, frameSize);
+    for (;;) {
+        res = track.open(numChannels, sampleRate, useFloat, numBuffers);
+        if (res != OK) break;
+
+        for (int i = 0; i < numBuffers; ++i) {
+            track.write((char *)buffer + i * (framesPerBuffer * frameSize),
+                    framesPerBuffer * frameSize);
+        }
+
+        track.logBufferState();
+        res = track.start();
+        if (res != OK) break;
+
+        size_t buffers;
+        while ((buffers = track.getBuffersPending()) > 0) {
+            // ALOGD("outstanding buffers: %zu", buffers);
+            usleep(5 * 1000 /* usec */);
+        }
+        res = track.stop();
+        break;
+    }
+    track.close();
+    free(buffer);
+    return res;
+}
+
+extern "C" jlong Java_android_media_cts_AudioTrackNative_nativeCreateTrack(
+    JNIEnv * /* env */, jclass /* clazz */)
+{
+    return (jlong)(new shared_pointer<AudioTrackNative>(new AudioTrackNative()));
+}
+
+extern "C" void Java_android_media_cts_AudioTrackNative_nativeDestroyTrack(
+    JNIEnv * /* env */, jclass /* clazz */, jlong jtrack)
+{
+    delete (shared_pointer<AudioTrackNative> *)jtrack;
+}
+
+extern "C" jint Java_android_media_cts_AudioTrackNative_nativeOpen(
+    JNIEnv * /* env */, jclass /* clazz */, jlong jtrack,
+    jint numChannels, jint sampleRate, jboolean useFloat, jint numBuffers)
+{
+    auto track = *(shared_pointer<AudioTrackNative> *)jtrack;
+    if (track.get() == NULL) {
+        return (jint)INVALID_OPERATION;
+    }
+    return (jint)track->open(numChannels, sampleRate, useFloat == JNI_TRUE,
+            numBuffers);
+}
+
+extern "C" void Java_android_media_cts_AudioTrackNative_nativeClose(
+    JNIEnv * /* env */, jclass /* clazz */, jlong jtrack)
+{
+    auto track = *(shared_pointer<AudioTrackNative> *)jtrack;
+    if (track.get() != NULL) {
+        track->close();
+    }
+}
+
+extern "C" jint Java_android_media_cts_AudioTrackNative_nativeStart(
+    JNIEnv * /* env */, jclass /* clazz */, jlong jtrack)
+{
+    auto track = *(shared_pointer<AudioTrackNative> *)jtrack;
+    if (track.get() == NULL) {
+        return (jint)INVALID_OPERATION;
+    }
+    return (jint)track->start();
+}
+
+extern "C" jint Java_android_media_cts_AudioTrackNative_nativeStop(
+    JNIEnv * /* env */, jclass /* clazz */, jlong jtrack)
+{
+    auto track = *(shared_pointer<AudioTrackNative> *)jtrack;
+    if (track.get() == NULL) {
+        return (jint)INVALID_OPERATION;
+    }
+    return (jint)track->stop();
+}
+
+extern "C" jint Java_android_media_cts_AudioTrackNative_nativePause(
+    JNIEnv * /* env */, jclass /* clazz */, jlong jtrack)
+{
+    auto track = *(shared_pointer<AudioTrackNative> *)jtrack;
+    if (track.get() == NULL) {
+        return (jint)INVALID_OPERATION;
+    }
+    return (jint)track->pause();
+}
+
+extern "C" jint Java_android_media_cts_AudioTrackNative_nativeFlush(
+    JNIEnv * /* env */, jclass /* clazz */, jlong jtrack)
+{
+    auto track = *(shared_pointer<AudioTrackNative> *)jtrack;
+    if (track.get() == NULL) {
+        return (jint)INVALID_OPERATION;
+    }
+    return (jint)track->flush();
+}
+
+extern "C" jint Java_android_media_cts_AudioTrackNative_nativeGetPositionInMsec(
+    JNIEnv *env, jclass /* clazz */, jlong jtrack, jlongArray jPosition)
+{
+    auto track = *(shared_pointer<AudioTrackNative> *)jtrack;
+    if (track.get() == NULL) {
+        return (jint)INVALID_OPERATION;
+    }
+    int64_t pos;
+    status_t res = track->getPositionInMsec(&pos);
+    if (res != OK) {
+        return res;
+    }
+    jlong *nPostition = (jlong *) env->GetPrimitiveArrayCritical(jPosition, NULL /* isCopy */);
+    if (nPostition == NULL) {
+        ALOGE("Unable to get array for nativeGetPositionInMsec()");
+        return BAD_VALUE;
+    }
+    nPostition[0] = (jlong)pos;
+    env->ReleasePrimitiveArrayCritical(jPosition, nPostition, 0 /* mode */);
+    return OK;
+}
+
+extern "C" jint Java_android_media_cts_AudioTrackNative_nativeGetBuffersPending(
+    JNIEnv * /* env */, jclass /* clazz */, jlong jtrack)
+{
+    auto track = *(shared_pointer<AudioTrackNative> *)jtrack;
+    if (track.get() == NULL) {
+        return (jint)0;
+    }
+    return (jint)track->getBuffersPending();
+}
+
+template <typename T>
+static inline jint writeToTrack(jlong jtrack, const T *data,
+    jint offsetInSamples, jint sizeInSamples, jint writeFlags)
+{
+    auto track = *(shared_pointer<AudioTrackNative> *)jtrack;
+    if (track.get() == NULL) {
+        return (jint)INVALID_OPERATION;
+    }
+
+    const bool isBlocking = writeFlags & WRITE_FLAG_BLOCKING;
+    const size_t sizeInBytes = sizeInSamples * sizeof(T);
+    ssize_t ret = track->write(data + offsetInSamples, sizeInBytes, isBlocking);
+    return (jint)(ret > 0 ? ret / sizeof(T) : ret);
+}
+
+template <typename T>
+static inline jint writeArray(JNIEnv *env, jclass /* clazz */, jlong jtrack,
+        T javaAudioData, jint offsetInSamples, jint sizeInSamples, jint writeFlags)
+{
+    if (javaAudioData == NULL) {
+        return (jint)INVALID_OPERATION;
+    }
+
+    auto cAudioData = envGetArrayElements(env, javaAudioData, NULL /* isCopy */);
+    if (cAudioData == NULL) {
+        ALOGE("Error retrieving source of audio data to play");
+        return (jint)BAD_VALUE;
+    }
+
+    jint ret = writeToTrack(jtrack, cAudioData, offsetInSamples, sizeInSamples, writeFlags);
+    envReleaseArrayElements(env, javaAudioData, cAudioData, 0 /* mode */);
+    return ret;
+}
+
+extern "C" jint Java_android_media_cts_AudioTrackNative_nativeWriteByteArray(
+    JNIEnv *env, jclass clazz, jlong jtrack,
+    jbyteArray byteArray, jint offsetInSamples, jint sizeInSamples, jint writeFlags)
+{
+    ALOGV("nativeWriteByteArray(%p, %d, %d, %d)",
+            byteArray, offsetInSamples, sizeInSamples, writeFlags);
+    return writeArray(env, clazz, jtrack, byteArray, offsetInSamples, sizeInSamples, writeFlags);
+}
+
+extern "C" jint Java_android_media_cts_AudioTrackNative_nativeWriteShortArray(
+    JNIEnv *env, jclass clazz, jlong jtrack,
+    jshortArray shortArray, jint offsetInSamples, jint sizeInSamples, jint writeFlags)
+{
+    ALOGV("nativeWriteShortArray(%p, %d, %d, %d)",
+            shortArray, offsetInSamples, sizeInSamples, writeFlags);
+    return writeArray(env, clazz, jtrack, shortArray, offsetInSamples, sizeInSamples, writeFlags);
+}
+
+extern "C" jint Java_android_media_cts_AudioTrackNative_nativeWriteFloatArray(
+    JNIEnv *env, jclass clazz, jlong jtrack,
+    jfloatArray floatArray, jint offsetInSamples, jint sizeInSamples, jint writeFlags)
+{
+    ALOGV("nativeWriteFloatArray(%p, %d, %d, %d)",
+            floatArray, offsetInSamples, sizeInSamples, writeFlags);
+    return writeArray(env, clazz, jtrack, floatArray, offsetInSamples, sizeInSamples, writeFlags);
+}
diff --git a/tests/tests/media/libaudiojni/sl-utils.cpp b/tests/tests/media/libaudiojni/sl-utils.cpp
new file mode 100644
index 0000000..1aa89ba
--- /dev/null
+++ b/tests/tests/media/libaudiojni/sl-utils.cpp
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "SL-Utils"
+
+#include "sl-utils.h"
+#include <utils/Mutex.h>
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+
+// These will wind up in <SLES/OpenSLES_Android.h>
+#define SL_ANDROID_SPEAKER_QUAD (SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT \
+ | SL_SPEAKER_BACK_LEFT | SL_SPEAKER_BACK_RIGHT)
+
+#define SL_ANDROID_SPEAKER_5DOT1 (SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT \
+ | SL_SPEAKER_FRONT_CENTER  | SL_SPEAKER_LOW_FREQUENCY| SL_SPEAKER_BACK_LEFT \
+ | SL_SPEAKER_BACK_RIGHT)
+
+#define SL_ANDROID_SPEAKER_7DOT1 (SL_ANDROID_SPEAKER_5DOT1 | SL_SPEAKER_SIDE_LEFT \
+ |SL_SPEAKER_SIDE_RIGHT)
+
+namespace android {
+
+static Mutex gLock;
+static SLObjectItf gEngineObject;
+static unsigned gRefCount;
+
+static const char *gErrorStrings[] = {
+    "SL_RESULT_SUCCESS",                // 0
+    "SL_RESULT_PRECONDITIONS_VIOLATE",  // 1
+    "SL_RESULT_PARAMETER_INVALID",      // 2
+    "SL_RESULT_MEMORY_FAILURE",         // 3
+    "SL_RESULT_RESOURCE_ERROR",         // 4
+    "SL_RESULT_RESOURCE_LOST",          // 5
+    "SL_RESULT_IO_ERROR",               // 6
+    "SL_RESULT_BUFFER_INSUFFICIENT",    // 7
+    "SL_RESULT_CONTENT_CORRUPTED",      // 8
+    "SL_RESULT_CONTENT_UNSUPPORTED",    // 9
+    "SL_RESULT_CONTENT_NOT_FOUND",      // 10
+    "SL_RESULT_PERMISSION_DENIED",      // 11
+    "SL_RESULT_FEATURE_UNSUPPORTED",    // 12
+    "SL_RESULT_INTERNAL_ERROR",         // 13
+    "SL_RESULT_UNKNOWN_ERROR",          // 14
+    "SL_RESULT_OPERATION_ABORTED",      // 15
+    "SL_RESULT_CONTROL_LOST",           // 16
+};
+
+const char *getSLErrStr(int code) {
+    if ((size_t)code >= ARRAY_SIZE(gErrorStrings)) {
+        return "SL_RESULT_UNKNOWN";
+    }
+    return gErrorStrings[code];
+}
+
+SLuint32 channelCountToMask(unsigned channelCount) {
+    switch (channelCount) {
+    case 1:
+        return SL_SPEAKER_FRONT_LEFT; // we prefer left over center
+    case 2:
+        return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
+    case 3:
+        return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT | SL_SPEAKER_FRONT_CENTER;
+    case 4:
+        return SL_ANDROID_SPEAKER_QUAD;
+    case 5:
+        return SL_ANDROID_SPEAKER_QUAD | SL_SPEAKER_FRONT_CENTER;
+    case 6:
+        return SL_ANDROID_SPEAKER_5DOT1;
+    case 7:
+        return SL_ANDROID_SPEAKER_5DOT1 | SL_SPEAKER_BACK_CENTER;
+    case 8:
+        return SL_ANDROID_SPEAKER_7DOT1;
+    default:
+        return 0;
+    }
+}
+
+static SLObjectItf createEngine() {
+    static SLEngineOption EngineOption[] = {
+            (SLuint32) SL_ENGINEOPTION_THREADSAFE,
+            (SLuint32) SL_BOOLEAN_TRUE
+    };
+    // create engine in thread-safe mode
+    SLObjectItf engine;
+    SLresult result = slCreateEngine(&engine,
+            1 /* numOptions */, EngineOption /* pEngineOptions */,
+            0 /* numInterfaces */, NULL /* pInterfaceIds */, NULL /* pInterfaceRequired */);
+    if (result != SL_RESULT_SUCCESS) {
+        ALOGE("slCreateEngine() failed: %s", getSLErrStr(result));
+        return NULL;
+    }
+    // realize the engine
+    result = (*engine)->Realize(engine, SL_BOOLEAN_FALSE /* async */);
+    if (result != SL_RESULT_SUCCESS) {
+        ALOGE("Realize() failed: %s", getSLErrStr(result));
+        (*engine)->Destroy(engine);
+        return NULL;
+    }
+    return engine;
+}
+
+SLObjectItf OpenSLEngine(bool global) {
+
+    if (!global) {
+        return createEngine();
+    }
+    Mutex::Autolock l(gLock);
+    if (gRefCount == 0) {
+        gEngineObject = createEngine();
+    }
+    gRefCount++;
+    return gEngineObject;
+}
+
+void CloseSLEngine(SLObjectItf engine) {
+    Mutex::Autolock l(gLock);
+    if (engine == gEngineObject) {
+        if (gRefCount == 0) {
+            ALOGE("CloseSLEngine(%p): refcount already 0", engine);
+            return;
+        }
+        if (--gRefCount != 0) {
+            return;
+        }
+        gEngineObject = NULL;
+    }
+    (*engine)->Destroy(engine);
+}
+
+} // namespace android
+
diff --git a/tests/tests/media/libaudiojni/sl-utils.h b/tests/tests/media/libaudiojni/sl-utils.h
new file mode 100644
index 0000000..8582648
--- /dev/null
+++ b/tests/tests/media/libaudiojni/sl-utils.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#ifndef ANDROID_SL_UTILS_H
+#define ANDROID_SL_UTILS_H
+
+#include <SLES/OpenSLES.h>
+#include <SLES/OpenSLES_Android.h>
+
+#include <jni.h>
+#include <mutex>
+#include <utils/Log.h>
+
+#define CheckErr(res) LOG_ALWAYS_FATAL_IF( \
+        (res) != SL_RESULT_SUCCESS, "result error %s", android::getSLErrStr(res));
+
+namespace android {
+
+// FIXME: Move to common file.
+template <typename T>
+static inline
+const T &min(const T &a, const T &b) {
+    return a < b ? a : b;
+}
+
+/* Returns the error string for the OpenSL ES error code
+ */
+const char *getSLErrStr(int code);
+
+/* Returns the OpenSL ES equivalent standard channel mask
+ * for a given channel count, 0 if no such mask is available.
+ */
+SLuint32 channelCountToMask(unsigned channelCount);
+
+/* Returns an OpenSL ES Engine object interface.
+ * The engine created will be thread safe [3.2]
+ * The underlying implementation may not support more than one engine. [4.1.1]
+ *
+ * @param global if true, return and open the global engine instance or make
+ *   a local engine instance if false.
+ * @return NULL if unsuccessful or the Engine SLObjectItf.
+ */
+SLObjectItf OpenSLEngine(bool global = true);
+
+/* Closes an OpenSL ES Engine object returned by OpenSLEngine().
+ */
+void CloseSLEngine(SLObjectItf engine);
+
+// overloaded JNI array helper functions (same as in android_media_AudioRecord)
+inline
+jbyte *envGetArrayElements(JNIEnv *env, jbyteArray array, jboolean *isCopy) {
+    return env->GetByteArrayElements(array, isCopy);
+}
+
+inline
+void envReleaseArrayElements(JNIEnv *env, jbyteArray array, jbyte *elems, jint mode) {
+    env->ReleaseByteArrayElements(array, elems, mode);
+}
+
+inline
+jshort *envGetArrayElements(JNIEnv *env, jshortArray array, jboolean *isCopy) {
+    return env->GetShortArrayElements(array, isCopy);
+}
+
+inline
+void envReleaseArrayElements(JNIEnv *env, jshortArray array, jshort *elems, jint mode) {
+    env->ReleaseShortArrayElements(array, elems, mode);
+}
+
+inline
+jfloat *envGetArrayElements(JNIEnv *env, jfloatArray array, jboolean *isCopy) {
+    return env->GetFloatArrayElements(array, isCopy);
+}
+
+inline
+void envReleaseArrayElements(JNIEnv *env, jfloatArray array, jfloat *elems, jint mode) {
+    env->ReleaseFloatArrayElements(array, elems, mode);
+}
+
+} // namespace android
+
+#endif // ANDROID_SL_UTILS_H
diff --git a/tests/tests/media/res/raw/gb18030_5.mp3 b/tests/tests/media/res/raw/gb18030_5.mp3
deleted file mode 100644
index 70f76ce..0000000
--- a/tests/tests/media/res/raw/gb18030_5.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java b/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java
index 969963d..34469b79 100644
--- a/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java
+++ b/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java
@@ -35,11 +35,13 @@
 import javax.microedition.khronos.opengles.GL10;
 
 import java.io.IOException;
+import java.lang.System;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Locale;
+import java.util.Vector;
 import java.util.zip.CRC32;
 
 public class AdaptivePlaybackTest extends MediaPlayerTestBase {
@@ -325,20 +327,42 @@
      * Queue some frames with an EOS on the last one.  Test that we have decoded as many
      * frames as we queued.  This tests the EOS handling of the codec to see if all queued
      * (and out-of-order) frames are actually decoded and returned.
+     *
+     * Also test flushing prior to sending CSD, and immediately after sending CSD.
      */
     class EarlyEosTest extends ActivityTest {
+        // using bitfields to create a directed state graph that terminates at FLUSH_NEVER
+        static final int FLUSH_BEFORE_CSD = (1 << 1);
+        static final int FLUSH_AFTER_CSD = (1 << 0);
+        static final int FLUSH_NEVER = 0;
+
         public boolean isValid(Codec c) {
             return getFormat(c) != null;
         }
         public void addTests(TestList tests, final Codec c) {
-            for (int i = NUM_FRAMES / 2; i > 0; i--) {
+            int state = FLUSH_BEFORE_CSD;
+            for (int i = NUM_FRAMES / 2; i > 0; --i, state >>= 1) {
                 final int queuedFrames = i;
+                final int earlyFlushMode = state;
                 tests.add(
                     new Step("testing early EOS at " + queuedFrames, this, c) {
                         public void run() {
                             Decoder decoder = new Decoder(c.name);
                             try {
-                                decoder.configureAndStart(stepFormat(), stepSurface());
+                                MediaFormat fmt = stepFormat();
+                                MediaFormat configFmt = fmt;
+                                if (earlyFlushMode == FLUSH_BEFORE_CSD) {
+                                    // flush before CSD requires not submitting CSD with configure
+                                    configFmt = Media.removeCSD(fmt);
+                                }
+                                decoder.configureAndStart(configFmt, stepSurface());
+                                if (earlyFlushMode != FLUSH_NEVER) {
+                                    decoder.flush();
+                                    // We must always queue CSD after a flush that is potentially
+                                    // before we receive output format has changed.  This should
+                                    // work even after we receive the format change.
+                                    decoder.queueCSD(fmt);
+                                }
                                 int decodedFrames = -decoder.queueInputBufferRange(
                                         stepMedia(),
                                         0 /* startFrame */,
@@ -447,8 +471,7 @@
                             this, c, mediaIx) {
                         public void run() {
                             try {
-                                //mDecoder.configureAndStart(stepFormat(), stepSurface());
-                                if(mDecoder.configureAndStart(stepFormat(), stepSurface())){
+                                mDecoder.configureAndStart(stepFormat(), stepSurface());
                                 int decodedFrames = -mDecoder.queueInputBufferRange(
                                         stepMedia(),
                                         0 /* startFrame */,
@@ -462,7 +485,6 @@
                                 warn(mDecoder.getWarnings());
                                 mDecoder.clearWarnings();
                                 mDecoder.flush();
-	                            }
                             } finally {
                                 mDecoder.stop();
                             }
@@ -814,9 +836,10 @@
         return items;
     }
 
-    class Decoder {
+    class Decoder implements MediaCodec.OnFrameRenderedListener {
         private final static String TAG = "AdaptiveDecoder";
         final long kTimeOutUs = 5000;
+        final long kCSDTimeOutUs = 1000000;
         MediaCodec mCodec;
         ByteBuffer[] mInputBuffers;
         ByteBuffer[] mOutputBuffers;
@@ -825,6 +848,9 @@
         boolean mQueuedEos;
         ArrayList<Long> mTimeStamps;
         ArrayList<String> mWarnings;
+        Vector<Long> mRenderedTimeStamps; // using Vector as it is implicitly synchronized
+        long mLastRenderNanoTime;
+        int mFramesNotifiedRendered;
 
         public Decoder(String codecName) {
             MediaCodec codec = null;
@@ -839,6 +865,23 @@
             mQueuedEos = false;
             mTimeStamps = new ArrayList<Long>();
             mWarnings = new ArrayList<String>();
+            mRenderedTimeStamps = new Vector<Long>();
+            mLastRenderNanoTime = System.nanoTime();
+            mFramesNotifiedRendered = 0;
+
+            codec.setOnFrameRenderedListener(this, null);
+        }
+
+        public void onFrameRendered(MediaCodec codec, long presentationTimeUs, long nanoTime) {
+            final long NSECS_IN_1SEC = 1000000000;
+            if (!mRenderedTimeStamps.remove(presentationTimeUs)) {
+                warn("invalid timestamp " + presentationTimeUs + ", queued " +
+                        collectionString(mRenderedTimeStamps));
+            }
+            assert nanoTime > mLastRenderNanoTime;
+            mLastRenderNanoTime = nanoTime;
+            ++mFramesNotifiedRendered;
+            assert nanoTime > System.nanoTime() - NSECS_IN_1SEC;
         }
 
         public String getName() {
@@ -858,18 +901,21 @@
             mWarnings.clear();
         }
 
-        public boolean configureAndStart(MediaFormat format, TestSurface surface) {
+        public void configureAndStart(MediaFormat format, TestSurface surface) {
             mSurface = surface;
             Log.i(TAG, "configure(" + format + ", " + mSurface.getSurface() + ")");
-            try{
-			mCodec.configure(format, mSurface.getSurface(), null /* crypto */, 0 /* flags */);
-			}
-			catch (Exception e){
-				Log.i(TAG, "Unsupported Codec");
-				return false;
-			}
+            mCodec.configure(format, mSurface.getSurface(), null /* crypto */, 0 /* flags */);
             Log.i(TAG, "start");
             mCodec.start();
+
+            // inject some minimal setOutputSurface test
+            // TODO: change this test to also change the surface midstream
+            try {
+                mCodec.setOutputSurface(null);
+                fail("should not be able to set surface to NULL");
+            } catch (IllegalArgumentException e) {}
+            mCodec.setOutputSurface(mSurface.getSurface());
+
             mInputBuffers = mCodec.getInputBuffers();
             mOutputBuffers = mCodec.getOutputBuffers();
             Log.i(TAG, "configured " + mInputBuffers.length + " input[" +
@@ -877,12 +923,20 @@
                   mOutputBuffers.length + "output[" +
                   (mOutputBuffers[0] == null ? null : mOutputBuffers[0].capacity()) + "]");
             mQueuedEos = false;
-            return true;
+            mRenderedTimeStamps.clear();
+            mLastRenderNanoTime = System.nanoTime();
+            mFramesNotifiedRendered = 0;
         }
 
         public void stop() {
             Log.i(TAG, "stop");
             mCodec.stop();
+            // if we have queued 32 frames or more, at least one should have been notified
+            // to have rendered.
+            if (mRenderedTimeStamps.size() > 32 && mFramesNotifiedRendered == 0) {
+                fail("rendered " + mRenderedTimeStamps.size() +
+                        " frames, but none have been notified.");
+            }
         }
 
         public void flush() {
@@ -939,6 +993,7 @@
             }
 
             if (doRender) {
+                mRenderedTimeStamps.add(info.presentationTimeUs);
                 if (!mTimeStamps.remove(info.presentationTimeUs)) {
                     warn("invalid timestamp " + info.presentationTimeUs + ", queued " +
                             collectionString(mTimeStamps));
@@ -997,6 +1052,31 @@
             return queueInputBufferRange(media,frameStartIx,frameEndIx,sendEosAtEnd,waitForEos,0);
         }
 
+        public void queueCSD(MediaFormat format) {
+            MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
+            for (int csdIx = 0; ; ++csdIx) {
+                ByteBuffer csdBuf = format.getByteBuffer("csd-" + csdIx);
+                if (csdBuf == null) {
+                    break;
+                }
+
+                int ix = mCodec.dequeueInputBuffer(kCSDTimeOutUs);
+                if (ix < 0) {
+                    fail("Could not dequeue input buffer for CSD #" + csdIx);
+                    return;
+                }
+
+                ByteBuffer buf = mInputBuffers[ix];
+                buf.clear();
+                buf.put((ByteBuffer)csdBuf.clear());
+                Log.v(TAG, "queue-CSD { [" + buf.position() + "]=" +
+                        byteBufferToString(buf, 0, 16) + "} => #" + ix);
+                mCodec.queueInputBuffer(
+                        ix, 0 /* offset */, buf.position(), 0 /* timeUs */,
+                        MediaCodec.BUFFER_FLAG_CODEC_CONFIG);
+            }
+        }
+
         public int queueInputBufferRange(
                 Media media, int frameStartIx, int frameEndIx, boolean sendEosAtEnd,
                 boolean waitForEos, long adjustTimeUs) {
@@ -1142,6 +1222,31 @@
         return mFormat;
     }
 
+    public static MediaFormat removeCSD(MediaFormat orig) {
+        MediaFormat copy = MediaFormat.createVideoFormat(
+                orig.getString(orig.KEY_MIME),
+                orig.getInteger(orig.KEY_WIDTH), orig.getInteger(orig.KEY_HEIGHT));
+        for (String k : new String[] {
+                orig.KEY_FRAME_RATE, orig.KEY_MAX_WIDTH, orig.KEY_MAX_HEIGHT,
+                orig.KEY_MAX_INPUT_SIZE
+        }) {
+            if (orig.containsKey(k)) {
+                try {
+                    copy.setInteger(k, orig.getInteger(k));
+                } catch (ClassCastException e) {
+                    try {
+                        copy.setFloat(k, orig.getFloat(k));
+                    } catch (ClassCastException e2) {
+                        // Could not copy value. Don't fail here, as having non-standard
+                        // value types for defined keys is permissible by the media API
+                        // for optional keys.
+                    }
+                }
+            }
+        }
+        return copy;
+    }
+
     public MediaFormat getAdaptiveFormat(int width, int height) {
         mAdaptiveFormat.setInteger(MediaFormat.KEY_MAX_WIDTH, width);
         mAdaptiveFormat.setInteger(MediaFormat.KEY_MAX_HEIGHT, height);
@@ -1319,13 +1424,11 @@
 
             /* test if the explicitly named codec is present on the system */
             if (explicitCodecName != null) {
-                try {
-                    MediaCodec codec = MediaCodec.createByCodecName(explicitCodecName);
-                    if (codec != null) {
-                        codec.release();
-                        add(new Codec(explicitCodecName, null, mediaList));
-                    }
-                } catch (Exception e) {}
+                MediaCodec codec = MediaCodec.createByCodecName(explicitCodecName);
+                if (codec != null) {
+                    codec.release();
+                    add(new Codec(explicitCodecName, null, mediaList));
+                }
             }
         } catch (Throwable t) {
             Log.wtf("Constructor failed", t);
diff --git a/tests/tests/media/src/android/media/cts/AsyncPlayerTest.java b/tests/tests/media/src/android/media/cts/AsyncPlayerTest.java
index 08e1d67..9272d58 100644
--- a/tests/tests/media/src/android/media/cts/AsyncPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/AsyncPlayerTest.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.media.AsyncPlayer;
+import android.media.AudioAttributes;
 import android.media.AudioManager;
 import android.net.Uri;
 import android.provider.Settings;
@@ -34,4 +35,13 @@
         asyncPlayer.stop();
     }
 
+    public void testAsyncPlayerAudioAttributes() throws Exception {
+        final Uri PLAY_URI = Settings.System.DEFAULT_NOTIFICATION_URI;
+        AsyncPlayer asyncPlayer = new AsyncPlayer(null);
+        asyncPlayer.play(getContext(), PLAY_URI, true,
+                new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_NOTIFICATION).build());
+        final int PLAY_TIME = 3000;
+        Thread.sleep(PLAY_TIME);
+        asyncPlayer.stop();
+    }
 }
diff --git a/tests/tests/media/src/android/media/cts/AudioAttributesTest.java b/tests/tests/media/src/android/media/cts/AudioAttributesTest.java
new file mode 100644
index 0000000..3e42b7e
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/AudioAttributesTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2015 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.media.cts;
+
+import android.cts.util.CtsAndroidTestCase;
+import android.media.AudioAttributes;
+import android.os.Parcel;
+
+public class AudioAttributesTest extends CtsAndroidTestCase {
+
+    // -----------------------------------------------------------------
+    // AUDIOATTRIBUTES TESTS:
+    // ----------------------------------
+
+    // -----------------------------------------------------------------
+    // Parcelable tests
+    // ----------------------------------
+
+    // Test case 1: call describeContents(), not used yet, but needs to be exercised
+    public void testParcelableDescribeContents() throws Exception {
+        final AudioAttributes aa = new AudioAttributes.Builder()
+                .setUsage(AudioAttributes.USAGE_MEDIA).build();
+        final int c = aa.describeContents();
+        assertNotNull("Failure to create the AudioAttributes", aa);
+    }
+
+    // Test case 2: create an instance, marshall it and create a new instance,
+    //      check for equality, both by comparing fields, and with the equals(Object) method
+    public void testParcelableWriteToParcelCreate() throws Exception {
+        final AudioAttributes srcAttr = new AudioAttributes.Builder()
+            .setUsage(AudioAttributes.USAGE_MEDIA)
+            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
+            .setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED).build();
+        final Parcel srcParcel = Parcel.obtain();
+        final Parcel dstParcel = Parcel.obtain();
+        final byte[] mbytes;
+
+        srcAttr.writeToParcel(srcParcel, 0 /*no public flags for marshalling*/);
+        mbytes = srcParcel.marshall();
+        dstParcel.unmarshall(mbytes, 0, mbytes.length);
+        dstParcel.setDataPosition(0);
+        final AudioAttributes targetAttr = AudioAttributes.CREATOR.createFromParcel(dstParcel);
+
+        assertEquals("Marshalled/restored usage doesn't match",
+                srcAttr.getUsage(), targetAttr.getUsage());
+        assertEquals("Marshalled/restored content type doesn't match",
+                srcAttr.getContentType(), targetAttr.getContentType());
+        assertEquals("Marshalled/restored flags don't match",
+                srcAttr.getFlags(), targetAttr.getFlags());
+        assertTrue("Source and target attributes are not considered equal",
+                srcAttr.equals(targetAttr));
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/AudioEffectTest.java b/tests/tests/media/src/android/media/cts/AudioEffectTest.java
index 1c96abd..dce7680 100644
--- a/tests/tests/media/src/android/media/cts/AudioEffectTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioEffectTest.java
@@ -65,9 +65,6 @@
 
     //Test case 0.0: test queryEffects() and platfrom at least provides an Equalizer
     public void test0_0QueryEffects() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
 
         AudioEffect.Descriptor[] desc = AudioEffect.queryEffects();
 
@@ -125,9 +122,6 @@
 
     //Test case 1.3: test getEnabled() failure when called on released effect
     public void test1_3GetEnabledAfterRelease() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         try {
             AudioEffect effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER,
                     AudioEffect.EFFECT_TYPE_NULL,
@@ -150,9 +144,6 @@
 
     //Test case 1.4: test contructor on mediaPlayer audio session
     public void test1_4InsertOnMediaPlayer() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         MediaPlayer mp = new MediaPlayer();
         assertNotNull("could not create mediaplayer", mp);
         AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(R.raw.testmp3);
@@ -285,9 +276,6 @@
 
     //Test case 2.0: test setEnabled() and getEnabled() in valid state
     public void test2_0SetEnabledGetEnabled() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         try {
             AudioEffect effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER,
                     AudioEffect.EFFECT_TYPE_NULL,
@@ -315,9 +303,6 @@
 
     //Test case 2.1: test setEnabled() throws exception after release
     public void test2_1SetEnabledAfterRelease() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         try {
             AudioEffect effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER,
                     AudioEffect.EFFECT_TYPE_NULL,
@@ -649,9 +634,6 @@
 
     //Test case 4.0: test control passed to higher priority client
     public void test4_0setEnabledLowerPriority() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         AudioEffect effect1 = null;
         AudioEffect effect2 = null;
         try {
diff --git a/tests/tests/media/src/android/media/cts/AudioFormatTest.java b/tests/tests/media/src/android/media/cts/AudioFormatTest.java
new file mode 100644
index 0000000..3c6a312
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/AudioFormatTest.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2015 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.media.cts;
+
+import android.cts.util.CtsAndroidTestCase;
+import android.media.AudioFormat;
+
+public class AudioFormatTest extends CtsAndroidTestCase {
+
+    // -----------------------------------------------------------------
+    // AUDIOFORMAT TESTS:
+    // ----------------------------------
+
+    // -----------------------------------------------------------------
+    // Builder tests
+    // ----------------------------------
+
+    // Test case 1: Use Builder to duplicate an AudioFormat with all fields supplied
+    public void testBuilderForCopy() throws Exception {
+        final int TEST_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
+        final int TEST_SR = 48000;
+        final int TEST_CONF_POS = AudioFormat.CHANNEL_OUT_5POINT1;
+        // 6ch, like in 5.1 above offset by a randomly chosen number
+        final int TEST_CONF_IDX = 0x3F << 3;
+
+        final AudioFormat formatToCopy = new AudioFormat.Builder()
+                .setEncoding(TEST_ENCODING).setSampleRate(TEST_SR)
+                .setChannelMask(TEST_CONF_POS).setChannelIndexMask(TEST_CONF_IDX).build();
+        assertNotNull("Failure to create the AudioFormat to copy", formatToCopy);
+
+        final AudioFormat copiedFormat = new AudioFormat.Builder(formatToCopy).build();
+        assertNotNull("Failure to create AudioFormat copy with Builder", copiedFormat);
+        assertEquals("New AudioFormat has wrong sample rate",
+                TEST_SR, copiedFormat.getSampleRate());
+        assertEquals("New AudioFormat has wrong encoding",
+                TEST_ENCODING, copiedFormat.getEncoding());
+        assertEquals("New AudioFormat has wrong channel mask",
+                TEST_CONF_POS, copiedFormat.getChannelMask());
+        assertEquals("New AudioFormat has wrong channel index mask",
+                TEST_CONF_IDX, copiedFormat.getChannelIndexMask());
+    }
+
+    // Test case 2: Use Builder to duplicate an AudioFormat with only encoding supplied
+    public void testPartialFormatBuilderForCopyEncoding() throws Exception {
+        final int TEST_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
+
+        final AudioFormat formatToCopy = new AudioFormat.Builder()
+                .setEncoding(TEST_ENCODING).build();
+        assertNotNull("Failure to create the AudioFormat to copy", formatToCopy);
+
+        final AudioFormat copiedFormat = new AudioFormat.Builder(formatToCopy).build();
+        assertNotNull("Failure to create AudioFormat copy with Builder", copiedFormat);
+        assertEquals("New AudioFormat has wrong encoding",
+                TEST_ENCODING, copiedFormat.getEncoding());
+        // test expected values when none has been set
+        assertEquals("New AudioFormat doesn't report expected sample rate",
+                0, copiedFormat.getSampleRate());
+        assertEquals("New AudioFormat doesn't report expected channel mask",
+                AudioFormat.CHANNEL_INVALID, copiedFormat.getChannelMask());
+        assertEquals("New AudioFormat doesn't report expected channel index mask",
+                AudioFormat.CHANNEL_INVALID, copiedFormat.getChannelIndexMask());
+    }
+
+    // Test case 3: Use Builder to duplicate an AudioFormat with only sample rate supplied
+    public void testPartialFormatBuilderForCopyRate() throws Exception {
+        final int TEST_SR = 48000;
+
+        final AudioFormat formatToCopy = new AudioFormat.Builder()
+                .setSampleRate(TEST_SR).build();
+        assertNotNull("Failure to create the AudioFormat to copy", formatToCopy);
+
+        final AudioFormat copiedFormat = new AudioFormat.Builder(formatToCopy).build();
+        assertNotNull("Failure to create AudioFormat copy with Builder", copiedFormat);
+        assertEquals("New AudioFormat has wrong sample rate",
+                TEST_SR, copiedFormat.getSampleRate());
+        // test expected values when none has been set
+        assertEquals("New AudioFormat doesn't report expected encoding",
+                AudioFormat.ENCODING_INVALID, copiedFormat.getEncoding());
+        assertEquals("New AudioFormat doesn't report expected channel mask",
+                AudioFormat.CHANNEL_INVALID, copiedFormat.getChannelMask());
+        assertEquals("New AudioFormat doesn't report expected channel index mask",
+                AudioFormat.CHANNEL_INVALID, copiedFormat.getChannelIndexMask());
+    }
+
+    // Test case 4: Use Builder to duplicate an AudioFormat with only channel mask supplied
+    public void testPartialFormatBuilderForCopyChanMask() throws Exception {
+        final int TEST_CONF_POS = AudioFormat.CHANNEL_OUT_5POINT1;
+
+        final AudioFormat formatToCopy = new AudioFormat.Builder()
+                .setChannelMask(TEST_CONF_POS).build();
+        assertNotNull("Failure to create the AudioFormat to copy", formatToCopy);
+
+        final AudioFormat copiedFormat = new AudioFormat.Builder(formatToCopy).build();
+        assertNotNull("Failure to create AudioFormat copy with Builder", copiedFormat);
+        assertEquals("New AudioFormat has wrong channel mask",
+                TEST_CONF_POS, copiedFormat.getChannelMask());
+        // test expected values when none has been set
+        assertEquals("New AudioFormat doesn't report expected encoding",
+                AudioFormat.ENCODING_INVALID, copiedFormat.getEncoding());
+        assertEquals("New AudioFormat doesn't report expected sample rate",
+                0, copiedFormat.getSampleRate());
+        assertEquals("New AudioFormat doesn't report expected channel index mask",
+                AudioFormat.CHANNEL_INVALID, copiedFormat.getChannelIndexMask());
+    }
+
+
+    // Test case 5: Use Builder to duplicate an AudioFormat with only channel index mask supplied
+    public void testPartialFormatBuilderForCopyChanIdxMask() throws Exception {
+        final int TEST_CONF_IDX = 0x30;
+
+        final AudioFormat formatToCopy = new AudioFormat.Builder()
+                .setChannelIndexMask(TEST_CONF_IDX).build();
+        assertNotNull("Failure to create the AudioFormat to copy", formatToCopy);
+
+        final AudioFormat copiedFormat = new AudioFormat.Builder(formatToCopy).build();
+        assertNotNull("Failure to create AudioFormat copy with Builder", copiedFormat);
+        assertEquals("New AudioFormat has wrong channel mask",
+                TEST_CONF_IDX, copiedFormat.getChannelIndexMask());
+        // test expected values when none has been set
+        assertEquals("New AudioFormat doesn't report expected encoding",
+                AudioFormat.ENCODING_INVALID, copiedFormat.getEncoding());
+        assertEquals("New AudioFormat doesn't report expected sample rate",
+                0, copiedFormat.getSampleRate());
+        assertEquals("New AudioFormat doesn't report expected channel mask",
+                AudioFormat.CHANNEL_INVALID, copiedFormat.getChannelMask());
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/AudioHelper.java b/tests/tests/media/src/android/media/cts/AudioHelper.java
new file mode 100644
index 0000000..6707ea6
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/AudioHelper.java
@@ -0,0 +1,491 @@
+/*
+ * Copyright (C) 2015 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.media.cts;
+
+import java.nio.ByteBuffer;
+
+import org.junit.Assert;
+
+import android.media.AudioAttributes;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioRecord;
+import android.media.AudioTrack;
+import android.os.Looper;
+
+// Used for statistics and loopers in listener tests.
+// See AudioRecordTest.java and AudioTrack_ListenerTest.java.
+public class AudioHelper {
+
+    // create sine waves or chirps for data arrays
+    public static byte[] createSoundDataInByteArray(int bufferSamples, final int sampleRate,
+            final double frequency, double sweep) {
+        final double rad = 2 * Math.PI * frequency / sampleRate;
+        byte[] vai = new byte[bufferSamples];
+        sweep = Math.PI * sweep / ((double)sampleRate * vai.length);
+        for (int j = 0; j < vai.length; j++) {
+            int unsigned =  (int)(Math.sin(j * (rad + j * sweep)) * Byte.MAX_VALUE)
+                    + Byte.MAX_VALUE & 0xFF;
+            vai[j] = (byte) unsigned;
+        }
+        return vai;
+    }
+
+    public static short[] createSoundDataInShortArray(int bufferSamples, final int sampleRate,
+            final double frequency, double sweep) {
+        final double rad = 2 * Math.PI * frequency / sampleRate;
+        short[] vai = new short[bufferSamples];
+        sweep = Math.PI * sweep / ((double)sampleRate * vai.length);
+        for (int j = 0; j < vai.length; j++) {
+            vai[j] = (short)(Math.sin(j * (rad + j * sweep)) * Short.MAX_VALUE);
+        }
+        return vai;
+    }
+
+    public static float[] createSoundDataInFloatArray(int bufferSamples, final int sampleRate,
+            final double frequency, double sweep) {
+        final double rad = 2 * Math.PI * frequency / sampleRate;
+        float[] vaf = new float[bufferSamples];
+        sweep = Math.PI * sweep / ((double)sampleRate * vaf.length);
+        for (int j = 0; j < vaf.length; j++) {
+            vaf[j] = (float)(Math.sin(j * (rad + j * sweep)));
+        }
+        return vaf;
+    }
+
+    public static int frameSizeFromFormat(AudioFormat format) {
+        return format.getChannelCount()
+                * format.getBytesPerSample(format.getEncoding());
+    }
+
+    public static int frameCountFromMsec(int ms, AudioFormat format) {
+        return ms * format.getSampleRate() / 1000;
+    }
+
+    public static class Statistics {
+        public void add(double value) {
+            final double absValue = Math.abs(value);
+            mSum += value;
+            mSumAbs += absValue;
+            mMaxAbs = Math.max(mMaxAbs, absValue);
+            ++mCount;
+        }
+
+        public double getAvg() {
+            if (mCount == 0) {
+                return 0;
+            }
+            return mSum / mCount;
+        }
+
+        public double getAvgAbs() {
+            if (mCount == 0) {
+                return 0;
+            }
+            return mSumAbs / mCount;
+        }
+
+        public double getMaxAbs() {
+            return mMaxAbs;
+        }
+
+        private int mCount = 0;
+        private double mSum = 0;
+        private double mSumAbs = 0;
+        private double mMaxAbs = 0;
+    }
+
+    // for listener tests
+    // lightweight java.util.concurrent.Future*
+    public static class FutureLatch<T>
+    {
+        private T mValue;
+        private boolean mSet;
+        public void set(T value)
+        {
+            synchronized (this) {
+                assert !mSet;
+                mValue = value;
+                mSet = true;
+                notify();
+            }
+        }
+        public T get()
+        {
+            T value;
+            synchronized (this) {
+                while (!mSet) {
+                    try {
+                        wait();
+                    } catch (InterruptedException e) {
+                        ;
+                    }
+                }
+                value = mValue;
+            }
+            return value;
+        }
+    }
+
+    // for listener tests
+    // represents a factory for T
+    public interface MakesSomething<T>
+    {
+        T makeSomething();
+    }
+
+    // for listener tests
+    // used to construct an object in the context of an asynchronous thread with looper
+    public static class MakeSomethingAsynchronouslyAndLoop<T>
+    {
+        private Thread mThread;
+        volatile private Looper mLooper;
+        private final MakesSomething<T> mWhatToMake;
+
+        public MakeSomethingAsynchronouslyAndLoop(MakesSomething<T> whatToMake)
+        {
+            assert whatToMake != null;
+            mWhatToMake = whatToMake;
+        }
+
+        public T make()
+        {
+            final FutureLatch<T> futureLatch = new FutureLatch<T>();
+            mThread = new Thread()
+            {
+                @Override
+                public void run()
+                {
+                    Looper.prepare();
+                    mLooper = Looper.myLooper();
+                    T something = mWhatToMake.makeSomething();
+                    futureLatch.set(something);
+                    Looper.loop();
+                }
+            };
+            mThread.start();
+            return futureLatch.get();
+        }
+        public void join()
+        {
+            mLooper.quit();
+            try {
+                mThread.join();
+            } catch (InterruptedException e) {
+                ;
+            }
+            // avoid dangling references
+            mLooper = null;
+            mThread = null;
+        }
+    }
+
+    public static int outChannelMaskFromInChannelMask(int channelMask) {
+        switch (channelMask) {
+            case AudioFormat.CHANNEL_IN_MONO:
+                return AudioFormat.CHANNEL_OUT_MONO;
+            case AudioFormat.CHANNEL_IN_STEREO:
+                return AudioFormat.CHANNEL_OUT_STEREO;
+            default:
+                return AudioFormat.CHANNEL_INVALID;
+        }
+    }
+
+    /* AudioRecordAudit extends AudioRecord to allow concurrent playback
+     * of read content to an AudioTrack.  This is for testing only.
+     * For general applications, it is NOT recommended to extend AudioRecord.
+     * This affects AudioRecord timing.
+     */
+    public static class AudioRecordAudit extends AudioRecord {
+        public AudioRecordAudit(int audioSource, int sampleRate, int channelMask,
+                int format, int bufferSize, boolean isChannelIndex) {
+            this(audioSource, sampleRate, channelMask, format, bufferSize, isChannelIndex,
+                    AudioManager.STREAM_MUSIC, 500 /*delayMs*/);
+        }
+
+        public AudioRecordAudit(int audioSource, int sampleRate, int channelMask,
+                int format, int bufferSize,
+                boolean isChannelIndex, int auditStreamType, int delayMs) {
+            // without channel index masks, one could call:
+            // super(audioSource, sampleRate, channelMask, format, bufferSize);
+            super(new AudioAttributes.Builder()
+                            .setInternalCapturePreset(audioSource)
+                            .build(),
+                    (isChannelIndex
+                            ? new AudioFormat.Builder().setChannelIndexMask(channelMask)
+                                    : new AudioFormat.Builder().setChannelMask(channelMask))
+                            .setEncoding(format)
+                            .setSampleRate(sampleRate)
+                            .build(),
+                    bufferSize,
+                    AudioManager.AUDIO_SESSION_ID_GENERATE);
+
+            if (delayMs >= 0) { // create an AudioTrack
+                final int channelOutMask = isChannelIndex ? channelMask :
+                    outChannelMaskFromInChannelMask(channelMask);
+                final int bufferOutFrames = sampleRate * delayMs / 1000;
+                final int bufferOutSamples = bufferOutFrames
+                        * AudioFormat.channelCountFromOutChannelMask(channelOutMask);
+                final int bufferOutSize = bufferOutSamples
+                        * AudioFormat.getBytesPerSample(format);
+
+                // Caution: delayMs too large results in buffer sizes that cannot be created.
+                mTrack = new AudioTrack.Builder()
+                                .setAudioAttributes(new AudioAttributes.Builder()
+                                        .setLegacyStreamType(auditStreamType)
+                                        .build())
+                                .setAudioFormat((isChannelIndex ?
+                                  new AudioFormat.Builder().setChannelIndexMask(channelOutMask) :
+                                  new AudioFormat.Builder().setChannelMask(channelOutMask))
+                                        .setEncoding(format)
+                                        .setSampleRate(sampleRate)
+                                        .build())
+                                .setBufferSizeInBytes(bufferOutSize)
+                                .build();
+                Assert.assertEquals(AudioTrack.STATE_INITIALIZED, mTrack.getState());
+                mPosition = 0;
+                mFinishAtMs = 0;
+            }
+        }
+
+        @Override
+        public int read(byte[] audioData, int offsetInBytes, int sizeInBytes) {
+            // for byte array access we verify format is 8 bit PCM (typical use)
+            Assert.assertEquals(TAG + ": format mismatch",
+                    AudioFormat.ENCODING_PCM_8BIT, getAudioFormat());
+            int samples = super.read(audioData, offsetInBytes, sizeInBytes);
+            if (mTrack != null) {
+                Assert.assertEquals(samples, mTrack.write(audioData, offsetInBytes, samples));
+                mPosition += samples / mTrack.getChannelCount();
+            }
+            return samples;
+        }
+
+        @Override
+        public int read(byte[] audioData, int offsetInBytes, int sizeInBytes, int readMode) {
+            // for byte array access we verify format is 8 bit PCM (typical use)
+            Assert.assertEquals(TAG + ": format mismatch",
+                    AudioFormat.ENCODING_PCM_8BIT, getAudioFormat());
+            int samples = super.read(audioData, offsetInBytes, sizeInBytes, readMode);
+            if (mTrack != null) {
+                Assert.assertEquals(samples, mTrack.write(audioData, offsetInBytes, samples,
+                        AudioTrack.WRITE_BLOCKING));
+                mPosition += samples / mTrack.getChannelCount();
+            }
+            return samples;
+        }
+
+        @Override
+        public int read(short[] audioData, int offsetInShorts, int sizeInShorts) {
+            // for short array access we verify format is 16 bit PCM (typical use)
+            Assert.assertEquals(TAG + ": format mismatch",
+                    AudioFormat.ENCODING_PCM_16BIT, getAudioFormat());
+            int samples = super.read(audioData, offsetInShorts, sizeInShorts);
+            if (mTrack != null) {
+                Assert.assertEquals(samples, mTrack.write(audioData, offsetInShorts, samples));
+                mPosition += samples / mTrack.getChannelCount();
+            }
+            return samples;
+        }
+
+        @Override
+        public int read(short[] audioData, int offsetInShorts, int sizeInShorts, int readMode) {
+            // for short array access we verify format is 16 bit PCM (typical use)
+            Assert.assertEquals(TAG + ": format mismatch",
+                    AudioFormat.ENCODING_PCM_16BIT, getAudioFormat());
+            int samples = super.read(audioData, offsetInShorts, sizeInShorts, readMode);
+            if (mTrack != null) {
+                Assert.assertEquals(samples, mTrack.write(audioData, offsetInShorts, samples,
+                        AudioTrack.WRITE_BLOCKING));
+                mPosition += samples / mTrack.getChannelCount();
+            }
+            return samples;
+        }
+
+        @Override
+        public int read(float[] audioData, int offsetInFloats, int sizeInFloats, int readMode) {
+            // for float array access we verify format is float PCM (typical use)
+            Assert.assertEquals(TAG + ": format mismatch",
+                    AudioFormat.ENCODING_PCM_FLOAT, getAudioFormat());
+            int samples = super.read(audioData, offsetInFloats, sizeInFloats, readMode);
+            if (mTrack != null) {
+                Assert.assertEquals(samples, mTrack.write(audioData, offsetInFloats, samples,
+                        AudioTrack.WRITE_BLOCKING));
+                mPosition += samples / mTrack.getChannelCount();
+            }
+            return samples;
+        }
+
+        @Override
+        public int read(ByteBuffer audioBuffer, int sizeInBytes) {
+            int bytes = super.read(audioBuffer, sizeInBytes);
+            if (mTrack != null) {
+                // read does not affect position and limit of the audioBuffer.
+                // we make a duplicate to change that for writing to the output AudioTrack
+                // which does check position and limit.
+                ByteBuffer copy = audioBuffer.duplicate();
+                copy.position(0).limit(bytes);  // read places data at the start of the buffer.
+                Assert.assertEquals(bytes, mTrack.write(copy, bytes, AudioTrack.WRITE_BLOCKING));
+                mPosition += bytes /
+                        (mTrack.getChannelCount()
+                                * AudioFormat.getBytesPerSample(mTrack.getAudioFormat()));
+            }
+            return bytes;
+        }
+
+        @Override
+        public int read(ByteBuffer audioBuffer, int sizeInBytes, int readMode) {
+            int bytes = super.read(audioBuffer, sizeInBytes, readMode);
+            if (mTrack != null) {
+                // read does not affect position and limit of the audioBuffer.
+                // we make a duplicate to change that for writing to the output AudioTrack
+                // which does check position and limit.
+                ByteBuffer copy = audioBuffer.duplicate();
+                copy.position(0).limit(bytes);  // read places data at the start of the buffer.
+                Assert.assertEquals(bytes, mTrack.write(copy, bytes, AudioTrack.WRITE_BLOCKING));
+                mPosition += bytes /
+                        (mTrack.getChannelCount()
+                                * AudioFormat.getBytesPerSample(mTrack.getAudioFormat()));
+            }
+            return bytes;
+        }
+
+        @Override
+        public void startRecording() {
+            super.startRecording();
+            if (mTrack != null) {
+                mTrack.play();
+            }
+        }
+
+        @Override
+        public void stop() {
+            super.stop();
+            if (mTrack != null) {
+                if (mPosition > 0) { // stop may be called multiple times.
+                    final int remainingFrames = mPosition - mTrack.getPlaybackHeadPosition();
+                    mFinishAtMs = System.currentTimeMillis()
+                            + remainingFrames * 1000 / mTrack.getSampleRate();
+                    mPosition = 0;
+                }
+                mTrack.stop(); // allows remaining data to play out
+            }
+        }
+
+        @Override
+        public void release() {
+            super.release();
+            if (mTrack != null) {
+                final long remainingMs = mFinishAtMs - System.currentTimeMillis();
+                if (remainingMs > 0) {
+                    try {
+                        Thread.sleep(remainingMs);
+                    } catch (InterruptedException e) {
+                        ;
+                    }
+                }
+                mTrack.release();
+                mTrack = null;
+            }
+        }
+
+        public AudioTrack mTrack;
+        private final static String TAG = "AudioRecordAudit";
+        private int mPosition;
+        private long mFinishAtMs;
+    }
+
+    /* AudioRecordAudit extends AudioRecord to allow concurrent playback
+     * of read content to an AudioTrack.  This is for testing only.
+     * For general applications, it is NOT recommended to extend AudioRecord.
+     * This affects AudioRecord timing.
+     */
+    public static class AudioRecordAuditNative extends AudioRecordNative {
+        public AudioRecordAuditNative() {
+            super();
+            // Caution: delayMs too large results in buffer sizes that cannot be created.
+            mTrack = new AudioTrackNative();
+        }
+
+        @Override
+        public boolean open(int numChannels, int sampleRate, boolean useFloat, int numBuffers) {
+            if (super.open(numChannels, sampleRate, useFloat, numBuffers)) {
+                if (!mTrack.open(numChannels, sampleRate, useFloat, 2 /* numBuffers */)) {
+                    mTrack = null; // remove track
+                }
+                return true;
+            }
+            return false;
+        }
+
+        @Override
+        public void close() {
+            super.close();
+            if (mTrack != null) {
+                mTrack.close();
+            }
+        }
+
+        @Override
+        public boolean start() {
+            if (super.start()) {
+                if (mTrack != null) {
+                    mTrack.start();
+                }
+                return true;
+            }
+            return false;
+        }
+
+        @Override
+        public boolean stop() {
+            if (super.stop()) {
+                if (mTrack != null) {
+                    mTrack.stop(); // doesn't allow remaining data to play out
+                }
+                return true;
+            }
+            return false;
+        }
+
+        @Override
+        public int read(short[] audioData, int offsetInShorts, int sizeInShorts, int readFlags) {
+            int samples = super.read(audioData, offsetInShorts, sizeInShorts, readFlags);
+            if (mTrack != null) {
+                Assert.assertEquals(samples, mTrack.write(audioData, offsetInShorts, samples,
+                        AudioTrackNative.WRITE_FLAG_BLOCKING));
+                mPosition += samples / mTrack.getChannelCount();
+            }
+            return samples;
+        }
+
+        @Override
+        public int read(float[] audioData, int offsetInFloats, int sizeInFloats, int readFlags) {
+            int samples = super.read(audioData, offsetInFloats, sizeInFloats, readFlags);
+            if (mTrack != null) {
+                Assert.assertEquals(samples, mTrack.write(audioData, offsetInFloats, samples,
+                        AudioTrackNative.WRITE_FLAG_BLOCKING));
+                mPosition += samples / mTrack.getChannelCount();
+            }
+            return samples;
+        }
+
+        public AudioTrackNative mTrack;
+        private final static String TAG = "AudioRecordAuditNative";
+        private int mPosition;
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/AudioManagerTest.java b/tests/tests/media/src/android/media/cts/AudioManagerTest.java
index f58e6ab..a0163e5 100644
--- a/tests/tests/media/src/android/media/cts/AudioManagerTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioManagerTest.java
@@ -19,7 +19,6 @@
 import static android.media.AudioManager.ADJUST_LOWER;
 import static android.media.AudioManager.ADJUST_RAISE;
 import static android.media.AudioManager.ADJUST_SAME;
-import static android.media.AudioManager.FLAG_ALLOW_RINGER_MODES;
 import static android.media.AudioManager.MODE_IN_CALL;
 import static android.media.AudioManager.MODE_IN_COMMUNICATION;
 import static android.media.AudioManager.MODE_NORMAL;
@@ -45,40 +44,33 @@
 import android.media.MediaPlayer;
 import android.os.Vibrator;
 import android.provider.Settings;
-import android.telephony.TelephonyManager;
-import android.test.AndroidTestCase;
+import android.provider.Settings.System;
+import android.test.InstrumentationTestCase;
 import android.view.SoundEffectConstants;
 
 import java.util.TreeMap;
 
-public class AudioManagerTest extends AndroidTestCase {
+public class AudioManagerTest extends InstrumentationTestCase {
 
     private final static int MP3_TO_PLAY = R.raw.testmp3;
     private final static long TIME_TO_PLAY = 2000;
+    private final static String APPOPS_OP_STR = "android:write_settings";
     private AudioManager mAudioManager;
     private boolean mHasVibrator;
-    private boolean mUseMasterVolume;
     private boolean mUseFixedVolume;
-    private int[] mMasterVolumeRamp;
-    private TreeMap<Integer, Integer> mMasterVolumeMap = new TreeMap<Integer, Integer>();
     private boolean mIsTelevision;
+    private Context mContext;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+        mContext = getInstrumentation().getContext();
+        Utils.enableAppOps(mContext.getPackageName(), APPOPS_OP_STR, getInstrumentation());
         mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
         Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
         mHasVibrator = (vibrator != null) && vibrator.hasVibrator();
-        mUseMasterVolume = mContext.getResources().getBoolean(
-                Resources.getSystem().getIdentifier("config_useMasterVolume", "bool", "android"));
         mUseFixedVolume = mContext.getResources().getBoolean(
                 Resources.getSystem().getIdentifier("config_useFixedVolume", "bool", "android"));
-        mMasterVolumeRamp = mContext.getResources().getIntArray(
-                Resources.getSystem().getIdentifier("config_masterVolumeRamp", "array", "android"));
-        assertTrue((mMasterVolumeRamp.length > 0) && (mMasterVolumeRamp.length % 2 == 0));
-        for (int i = 0; i < mMasterVolumeRamp.length; i+=2) {
-            mMasterVolumeMap.put(mMasterVolumeRamp[i], mMasterVolumeRamp[i+1]);
-        }
         PackageManager packageManager = mContext.getPackageManager();
         mIsTelevision = packageManager != null
                 && (packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)
@@ -350,6 +342,12 @@
             mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
 
             int maxVolume = mAudioManager.getStreamMaxVolume(streams[i]);
+            int minVolume = mAudioManager.getStreamMinVolume(streams[i]);
+
+            // validate min
+            assertTrue(String.format("minVolume(%d) must be >= 0", minVolume), minVolume >= 0);
+            assertTrue(String.format("minVolume(%d) must be < maxVolume(%d)", minVolume, maxVolume),
+                    minVolume < maxVolume);
 
             mAudioManager.setStreamVolume(streams[i], 1, 0);
             if (mUseFixedVolume) {
@@ -384,7 +382,7 @@
             // volume lower
             mAudioManager.setStreamVolume(streams[i], maxVolume, 0);
             volume = mAudioManager.getStreamVolume(streams[i]);
-            while (volume > 0) {
+            while (volume > minVolume) {
                 volumeDelta = getVolumeDelta(mAudioManager.getStreamVolume(streams[i]));
                 mAudioManager.adjustStreamVolume(streams[i], ADJUST_LOWER, 0);
                 assertEquals(Math.max(0, volume - volumeDelta),
@@ -457,6 +455,88 @@
         assertFalse(mAudioManager.isMusicActive());
     }
 
+    public void testMute() {
+        int[] streams = {
+                AudioManager.STREAM_VOICE_CALL,
+                AudioManager.STREAM_MUSIC,
+                AudioManager.STREAM_RING,
+                AudioManager.STREAM_ALARM,
+                AudioManager.STREAM_NOTIFICATION,
+                AudioManager.STREAM_SYSTEM };
+
+        int muteAffectedStreams = System.getInt(mContext.getContentResolver(),
+                System.MUTE_STREAMS_AFFECTED,
+                        // Same defaults as in AudioService. Should be kept in
+                        // sync.
+                        ((1 << AudioManager.STREAM_MUSIC) |
+                                (1 << AudioManager.STREAM_RING) |
+                                (1 << AudioManager.STREAM_NOTIFICATION) |
+                                (1 << AudioManager.STREAM_SYSTEM)));
+        if (mUseFixedVolume) {
+            for (int i = 0; i < streams.length; i++) {
+                mAudioManager.adjustStreamVolume(streams[i], AudioManager.ADJUST_MUTE, 0);
+                assertFalse("Muting should not affect a fixed volume device.",
+                        mAudioManager.isStreamMute(streams[i]));
+
+                mAudioManager.adjustStreamVolume(streams[i], AudioManager.ADJUST_TOGGLE_MUTE, 0);
+                assertFalse("Toggling mute should not affect a fixed volume device.",
+                        mAudioManager.isStreamMute(streams[i]));
+
+                mAudioManager.setStreamMute(streams[i], true);
+                assertFalse("Muting should not affect a fixed volume device.",
+                        mAudioManager.isStreamMute(streams[i]));
+            }
+            return;
+        }
+        // This ensures we're out of vibrate or silent modes.
+        mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
+        for (int i = 0; i < streams.length; i++) {
+            // ensure each stream is on and turned up.
+            mAudioManager.setStreamVolume(streams[i], mAudioManager.getStreamMaxVolume(streams[i]),
+                    0);
+            if (((1 << streams[i]) & muteAffectedStreams) == 0) {
+                mAudioManager.adjustStreamVolume(streams[i], AudioManager.ADJUST_MUTE, 0);
+                assertFalse("Stream " + streams[i] + " should not be affected by mute.",
+                        mAudioManager.isStreamMute(streams[i]));
+                mAudioManager.setStreamMute(streams[i], true);
+                assertFalse("Stream " + streams[i] + " should not be affected by mute.",
+                        mAudioManager.isStreamMute(streams[i]));
+                mAudioManager.adjustStreamVolume(streams[i], AudioManager.ADJUST_TOGGLE_MUTE, 0);
+                assertFalse("Stream " + streams[i] + " should not be affected by mute.",
+                        mAudioManager.isStreamMute(streams[i]));
+                continue;
+            }
+            mAudioManager.adjustStreamVolume(streams[i], AudioManager.ADJUST_MUTE, 0);
+            assertTrue("Muting stream " + streams[i] + " failed.",
+                    mAudioManager.isStreamMute(streams[i]));
+
+            mAudioManager.adjustStreamVolume(streams[i], AudioManager.ADJUST_UNMUTE, 0);
+            assertFalse("Unmuting stream " + streams[i] + " failed.",
+                    mAudioManager.isStreamMute(streams[i]));
+
+            mAudioManager.adjustStreamVolume(streams[i], AudioManager.ADJUST_TOGGLE_MUTE, 0);
+            assertTrue("Toggling mute on stream " + streams[i] + " failed.",
+                    mAudioManager.isStreamMute(streams[i]));
+
+            mAudioManager.adjustStreamVolume(streams[i], AudioManager.ADJUST_TOGGLE_MUTE, 0);
+            assertFalse("Toggling mute on stream " + streams[i] + " failed.",
+                    mAudioManager.isStreamMute(streams[i]));
+
+            mAudioManager.setStreamMute(streams[i], true);
+            assertTrue("Muting stream " + streams[i] + " using setStreamMute failed",
+                    mAudioManager.isStreamMute(streams[i]));
+
+            // mute it three more times to verify the ref counting is gone.
+            mAudioManager.setStreamMute(streams[i], true);
+            mAudioManager.setStreamMute(streams[i], true);
+            mAudioManager.setStreamMute(streams[i], true);
+
+            mAudioManager.setStreamMute(streams[i], false);
+            assertFalse("Unmuting stream " + streams[i] + " using setStreamMute failed.",
+                    mAudioManager.isStreamMute(streams[i]));
+        }
+    }
+
     public void testSetInvalidRingerMode() {
         int ringerMode = mAudioManager.getRingerMode();
         mAudioManager.setRingerMode(-1337);
@@ -467,11 +547,6 @@
     }
 
     private int getVolumeDelta(int volume) {
-        if (!mUseMasterVolume) {
-            return 1;
-        }
-        int volumeDelta = mMasterVolumeMap.floorEntry(volume).getValue();
-        assertTrue(volumeDelta > 0);
-        return volumeDelta;
+        return 1;
     }
 }
diff --git a/tests/tests/media/src/android/media/cts/AudioNativeTest.java b/tests/tests/media/src/android/media/cts/AudioNativeTest.java
new file mode 100644
index 0000000..f52232f
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/AudioNativeTest.java
@@ -0,0 +1,239 @@
+/*
+ * Copyright (C) 2015 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.media.cts;
+
+import android.content.pm.PackageManager;
+import android.cts.util.CtsAndroidTestCase;
+import android.util.Log;
+
+public class AudioNativeTest extends CtsAndroidTestCase {
+    public void testAppendixBBufferQueue() {
+        nativeAppendixBBufferQueue();
+    }
+
+    public void testAppendixBRecording() {
+        // better to detect presence of microphone here.
+        if (!hasMicrophone()) {
+            return;
+        }
+        nativeAppendixBRecording();
+    }
+
+    public void testStereo16Playback() {
+        assertTrue(AudioTrackNative.test(
+                2 /* numChannels */, 48000 /* sampleRate */, false /* useFloat */,
+                20 /* msecPerBuffer */, 8 /* numBuffers */));
+    }
+
+    public void testStereo16Record() {
+        if (!hasMicrophone()) {
+            return;
+        }
+        assertTrue(AudioRecordNative.test(
+                2 /* numChannels */, 48000 /* sampleRate */, false /* useFloat */,
+                20 /* msecPerBuffer */, 8 /* numBuffers */));
+    }
+
+    public void testPlayStreamData() throws Exception {
+        final String TEST_NAME = "testPlayStreamData";
+        final boolean TEST_FLOAT_ARRAY[] = {
+                false,
+                true,
+        };
+        // due to downmixer algorithmic latency, source channels greater than 2 may
+        // sound shorter in duration at 4kHz sampling rate.
+        final int TEST_SR_ARRAY[] = {
+                /* 4000, */ // below limit of OpenSL ES
+                12345, // irregular sampling rate
+                44100,
+                48000,
+                96000,
+                192000,
+        };
+        final int TEST_CHANNELS_ARRAY[] = {
+                1,
+                2,
+                3,
+                4,
+                5,
+                6,
+                7,
+                // 8  // can fail due to memory issues
+        };
+        final float TEST_SWEEP = 0; // sine wave only
+        final int TEST_TIME_IN_MSEC = 300;
+        final int TOLERANCE_MSEC = 20;
+
+        for (boolean TEST_FLOAT : TEST_FLOAT_ARRAY) {
+            double frequency = 400; // frequency changes for each test
+            for (int TEST_SR : TEST_SR_ARRAY) {
+                for (int TEST_CHANNELS : TEST_CHANNELS_ARRAY) {
+                    // OpenSL ES BUG: we run out of AudioTrack memory for this config on MNC
+                    // Log.d(TEST_NAME, "open channels:" + TEST_CHANNELS + " sr:" + TEST_SR);
+                    if (TEST_FLOAT == true && TEST_CHANNELS >= 6 && TEST_SR >= 192000) {
+                        continue;
+                    }
+                    AudioTrackNative track = new AudioTrackNative();
+                    assertTrue(TEST_NAME,
+                            track.open(TEST_CHANNELS, TEST_SR, TEST_FLOAT, 1 /* numBuffers */));
+                    assertTrue(TEST_NAME, track.start());
+
+                    final int sourceSamples =
+                            (int)((long)TEST_SR * TEST_TIME_IN_MSEC * TEST_CHANNELS / 1000);
+                    final double testFrequency = frequency / TEST_CHANNELS;
+                    if (TEST_FLOAT) {
+                        float data[] = AudioHelper.createSoundDataInFloatArray(
+                                sourceSamples, TEST_SR,
+                                testFrequency, TEST_SWEEP);
+                        assertEquals(sourceSamples,
+                                track.write(data, 0 /* offset */, sourceSamples,
+                                        AudioTrackNative.WRITE_FLAG_BLOCKING));
+                    } else {
+                        short data[] = AudioHelper.createSoundDataInShortArray(
+                                sourceSamples, TEST_SR,
+                                testFrequency, TEST_SWEEP);
+                        assertEquals(sourceSamples,
+                                track.write(data, 0 /* offset */, sourceSamples,
+                                        AudioTrackNative.WRITE_FLAG_BLOCKING));
+                    }
+
+                    while (true) {
+                        // OpenSL ES BUG: getPositionInMsec returns 0 after a data underrun.
+
+                        long position = track.getPositionInMsec();
+                        //Log.d(TEST_NAME, "position: " + position[0]);
+                        if (position >= (long)(TEST_TIME_IN_MSEC - TOLERANCE_MSEC)) {
+                            break;
+                        }
+
+                        // It is safer to use a buffer count of 0 to determine termination
+                        if (track.getBuffersPending() == 0) {
+                            break;
+                        }
+                        Thread.sleep(5 /* millis */);
+                    }
+                    track.stop();
+                    track.close();
+                    Thread.sleep(40 /* millis */);  // put a gap in the tone sequence
+                    frequency += 50; // increment test tone frequency
+                }
+            }
+        }
+    }
+
+    public void testRecordStreamData() throws Exception {
+        if (!hasMicrophone()) {
+            return;
+        }
+        final String TEST_NAME = "testRecordStreamData";
+        final boolean TEST_FLOAT_ARRAY[] = {
+                false,
+                true,
+        };
+        final int TEST_SR_ARRAY[] = {
+                //4000, // below limit of OpenSL ES
+                12345, // irregular sampling rate
+                44100,
+                48000,
+                96000,
+                192000,
+        };
+        final int TEST_CHANNELS_ARRAY[] = {
+                1,
+                2,
+                3,
+                4,
+                5,
+                6,
+                7,
+                8,
+        };
+        final int SEGMENT_DURATION_IN_MSEC = 20;
+        final int NUMBER_SEGMENTS = 10;
+
+        for (boolean TEST_FLOAT : TEST_FLOAT_ARRAY) {
+            for (int TEST_SR : TEST_SR_ARRAY) {
+                for (int TEST_CHANNELS : TEST_CHANNELS_ARRAY) {
+                    // OpenSL ES BUG: we run out of AudioTrack memory for this config on MNC
+                    if (TEST_FLOAT == true && TEST_CHANNELS >= 8 && TEST_SR >= 192000) {
+                        continue;
+                    }
+                    AudioRecordNative record = new AudioRecordNative();
+                    doRecordTest(record, TEST_CHANNELS, TEST_SR, TEST_FLOAT,
+                            SEGMENT_DURATION_IN_MSEC, NUMBER_SEGMENTS);
+                }
+            }
+        }
+    }
+
+    public void testRecordAudit() throws Exception {
+        if (!hasMicrophone()) {
+            return;
+        }
+        AudioRecordNative record = new AudioHelper.AudioRecordAuditNative();
+        doRecordTest(record, 4 /* numChannels */, 44100 /* sampleRate */, false /* useFloat */,
+                1000 /* segmentDurationMs */, 10 /* numSegments */);
+    }
+
+    static {
+        System.loadLibrary("audio_jni");
+    }
+
+    private static final String TAG = "AudioNativeTest";
+
+    private void doRecordTest(AudioRecordNative record,
+            int numChannels, int sampleRate, boolean useFloat,
+            int segmentDurationMs, int numSegments) {
+        final String TEST_NAME = "doRecordTest";
+        try {
+            // Log.d(TEST_NAME, "open numChannels:" + numChannels + " sampleRate:" + sampleRate);
+            assertTrue(TEST_NAME, record.open(numChannels, sampleRate, useFloat,
+                    numSegments /* numBuffers */));
+            assertTrue(TEST_NAME, record.start());
+
+            final int sourceSamples =
+                    (int)((long)sampleRate * segmentDurationMs * numChannels / 1000);
+
+            if (useFloat) {
+                float data[] = new float[sourceSamples];
+                for (int i = 0; i < numSegments; ++i) {
+                    assertEquals(sourceSamples,
+                            record.read(data, 0 /* offset */, sourceSamples,
+                                    AudioRecordNative.READ_FLAG_BLOCKING));
+                }
+            } else {
+                short data[] = new short[sourceSamples];
+                for (int i = 0; i < numSegments; ++i) {
+                    assertEquals(sourceSamples,
+                            record.read(data, 0 /* offset */, sourceSamples,
+                                    AudioRecordNative.READ_FLAG_BLOCKING));
+                }
+            }
+            assertTrue(TEST_NAME, record.stop());
+        } finally {
+            record.close();
+        }
+    }
+
+    private boolean hasMicrophone() {
+        return getContext().getPackageManager().hasSystemFeature(
+                PackageManager.FEATURE_MICROPHONE);
+    }
+
+    private static native void nativeAppendixBBufferQueue();
+    private static native void nativeAppendixBRecording();
+}
diff --git a/tests/tests/media/src/android/media/cts/AudioRecordNative.java b/tests/tests/media/src/android/media/cts/AudioRecordNative.java
new file mode 100644
index 0000000..18df8ee
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/AudioRecordNative.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2015 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.media.cts;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.cts.util.CtsAndroidTestCase;
+import android.util.Log;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+public class AudioRecordNative {
+    // Must be kept in sync with C++ JNI audio-record-native (AudioRecordNative) READ_FLAG_*
+    public static final int READ_FLAG_BLOCKING = 1 << 0;
+    /** @hide */
+    @IntDef(flag = true,
+            value = {
+                    READ_FLAG_BLOCKING,
+            })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface ReadFlags { }
+
+    public AudioRecordNative() {
+        mNativeRecordInJavaObj = nativeCreateRecord();
+    }
+
+    public boolean open(int numChannels, int sampleRate, boolean useFloat, int numBuffers) {
+        if (nativeOpen(mNativeRecordInJavaObj, numChannels, sampleRate, useFloat, numBuffers)
+                == STATUS_OK) {
+            mChannelCount = numChannels;
+            return true;
+        }
+        return false;
+    }
+
+    public void close() {
+        nativeClose(mNativeRecordInJavaObj);
+    }
+
+    public boolean start() {
+        return nativeStart(mNativeRecordInJavaObj) == STATUS_OK;
+    }
+
+    public boolean stop() {
+        return nativeStop(mNativeRecordInJavaObj) == STATUS_OK;
+    }
+
+    public boolean pause() {
+        return nativePause(mNativeRecordInJavaObj) == STATUS_OK;
+    }
+
+    public boolean flush() {
+        return nativeFlush(mNativeRecordInJavaObj) == STATUS_OK;
+    }
+
+    public long getPositionInMsec() {
+        long[] position = new long[1];
+        if (nativeGetPositionInMsec(mNativeRecordInJavaObj, position) != STATUS_OK) {
+            throw new IllegalStateException();
+        }
+        return position[0];
+    }
+
+    public int getBuffersPending() {
+        return nativeGetBuffersPending(mNativeRecordInJavaObj);
+    }
+
+    public int read(@NonNull byte[] byteArray,
+            int offsetInSamples, int sizeInSamples, @ReadFlags int readFlags) {
+        return nativeReadByteArray(
+                mNativeRecordInJavaObj, byteArray, offsetInSamples, sizeInSamples, readFlags);
+    }
+
+    public int read(@NonNull short[] shortArray,
+            int offsetInSamples, int sizeInSamples, @ReadFlags int readFlags) {
+        return nativeReadShortArray(
+                mNativeRecordInJavaObj, shortArray, offsetInSamples, sizeInSamples, readFlags);
+    }
+
+    public int read(@NonNull float[] floatArray,
+            int offsetInSamples, int sizeInSamples, @ReadFlags int readFlags) {
+        return nativeReadFloatArray(
+                mNativeRecordInJavaObj, floatArray, offsetInSamples, sizeInSamples, readFlags);
+    }
+
+    public int getChannelCount() {
+        return mChannelCount;
+    }
+
+    public static boolean test(int numChannels, int sampleRate, boolean useFloat,
+            int msecPerBuffer, int numBuffers) {
+        return nativeTest(numChannels, sampleRate, useFloat, msecPerBuffer, numBuffers)
+                == STATUS_OK;
+    }
+
+    @Override
+    protected void finalize() {
+        nativeClose(mNativeRecordInJavaObj);
+        nativeDestroyRecord(mNativeRecordInJavaObj);
+    }
+
+    static {
+        System.loadLibrary("audio_jni");
+    }
+
+    private static final String TAG = "AudioRecordNative";
+    private int mChannelCount;
+    private final long mNativeRecordInJavaObj;
+    private static final int STATUS_OK = 0;
+
+    // static native API.
+    // The native API uses a long "record handle" created by nativeCreateRecord.
+    // The handle must be destroyed after use by nativeDestroyRecord.
+    //
+    // Return codes from the native layer are status_t.
+    // Converted to Java booleans or exceptions at the public API layer.
+    private static native long nativeCreateRecord();
+    private static native void nativeDestroyRecord(long record);
+    private static native int nativeOpen(
+            long record, int numChannels, int sampleRate, boolean useFloat, int numBuffers);
+    private static native void nativeClose(long record);
+    private static native int nativeStart(long record);
+    private static native int nativeStop(long record);
+    private static native int nativePause(long record);
+    private static native int nativeFlush(long record);
+    private static native int nativeGetPositionInMsec(long record, @NonNull long[] position);
+    private static native int nativeGetBuffersPending(long record);
+    private static native int nativeReadByteArray(long record, @NonNull byte[] byteArray,
+            int offsetInSamples, int sizeInSamples, @ReadFlags int readFlags);
+    private static native int nativeReadShortArray(long record, @NonNull short[] shortArray,
+            int offsetInSamples, int sizeInSamples, @ReadFlags int readFlags);
+    private static native int nativeReadFloatArray(long record, @NonNull float[] floatArray,
+            int offsetInSamples, int sizeInSamples, @ReadFlags int readFlags);
+
+    // native interface for all-in-one testing, no record handle required.
+    private static native int nativeTest(
+            int numChannels, int sampleRate, boolean useFloat, int msecPerBuffer, int numBuffers);
+}
diff --git a/tests/tests/media/src/android/media/cts/AudioRecordTest.java b/tests/tests/media/src/android/media/cts/AudioRecordTest.java
index 7ff631f..b1ee3f5 100644
--- a/tests/tests/media/src/android/media/cts/AudioRecordTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioRecordTest.java
@@ -17,26 +17,44 @@
 package android.media.cts;
 
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
 
 import android.content.pm.PackageManager;
+import android.cts.util.CtsAndroidTestCase;
 import android.media.AudioFormat;
+import android.media.AudioManager;
 import android.media.AudioRecord;
-import android.media.MediaRecorder;
 import android.media.AudioRecord.OnRecordPositionUpdateListener;
+import android.media.AudioTrack;
+import android.media.MediaRecorder;
+import android.media.MediaSyncEvent;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
-import android.test.AndroidTestCase;
+import android.util.Log;
 
-public class AudioRecordTest extends AndroidTestCase {
+import com.android.cts.util.ReportLog;
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
 
+public class AudioRecordTest extends CtsAndroidTestCase {
+    private final static String TAG = "AudioRecordTest";
     private AudioRecord mAudioRecord;
     private int mHz = 44100;
     private boolean mIsOnMarkerReachedCalled;
     private boolean mIsOnPeriodicNotificationCalled;
     private boolean mIsHandleMessageCalled;
     private Looper mLooper;
-    private int MAX_RECORD_START_TIME_MS = 100;
+    // For doTest
+    private int mMarkerPeriodInFrames;
+    private int mMarkerPosition;
+    private Handler mHandler = new Handler(Looper.getMainLooper()) {
+        @Override
+        public void handleMessage(Message msg) {
+            mIsHandleMessageCalled = true;
+            super.handleMessage(msg);
+        }
+    };
 
     @Override
     protected void setUp() throws Exception {
@@ -212,7 +230,832 @@
         assertEquals(AudioRecord.STATE_UNINITIALIZED, mAudioRecord.getState());
     }
 
+    public void testAudioRecordResamplerMono8Bit() throws Exception {
+        doTest("ResamplerResamplerMono8Bit", true /*localRecord*/, false /*customHandler*/,
+                1 /*periodsPerSecond*/, 1 /*markerPeriodsPerSecond*/,
+                false /*useByteBuffer*/,  false /*blocking*/,
+                false /*auditRecording*/, false /*isChannelIndex*/, 88200 /*TEST_SR*/,
+                AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_8BIT);
+    }
+
+    public void testAudioRecordResamplerStereo8Bit() throws Exception {
+        doTest("ResamplerStereo8Bit", true /*localRecord*/, false /*customHandler*/,
+                0 /*periodsPerSecond*/, 3 /*markerPeriodsPerSecond*/,
+                true /*useByteBuffer*/,  true /*blocking*/,
+                false /*auditRecording*/, false /*isChannelIndex*/, 45000 /*TEST_SR*/,
+                AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_8BIT);
+    }
+
+    public void testAudioRecordLocalMono16Bit() throws Exception {
+        doTest("LocalMono16Bit", true /*localRecord*/, false /*customHandler*/,
+                30 /*periodsPerSecond*/, 2 /*markerPeriodsPerSecond*/,
+                false /*useByteBuffer*/, true /*blocking*/,
+                false /*auditRecording*/, false /*isChannelIndex*/, 8000 /*TEST_SR*/,
+                AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
+    }
+
+    public void testAudioRecordStereo16Bit() throws Exception {
+        doTest("Stereo16Bit", false /*localRecord*/, false /*customHandler*/,
+                2 /*periodsPerSecond*/, 2 /*markerPeriodsPerSecond*/,
+                false /*useByteBuffer*/, false /*blocking*/,
+                false /*auditRecording*/, false /*isChannelIndex*/, 17000 /*TEST_SR*/,
+                AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT);
+    }
+
+    public void testAudioRecordMonoFloat() throws Exception {
+        doTest("MonoFloat", false /*localRecord*/, true /*customHandler*/,
+                30 /*periodsPerSecond*/, 2 /*markerPeriodsPerSecond*/,
+                false /*useByteBuffer*/, true /*blocking*/,
+                false /*auditRecording*/, false /*isChannelIndex*/, 32000 /*TEST_SR*/,
+                AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_FLOAT);
+    }
+
+    public void testAudioRecordLocalNonblockingStereoFloat() throws Exception {
+        doTest("LocalNonblockingStereoFloat", true /*localRecord*/, true /*customHandler*/,
+                2 /*periodsPerSecond*/, 0 /*markerPeriodsPerSecond*/,
+                false /*useByteBuffer*/, false /*blocking*/,
+                false /*auditRecording*/, false /*isChannelIndex*/, 48000 /*TEST_SR*/,
+                AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_FLOAT);
+    }
+
+    // Audit modes work best with non-blocking mode
+    public void testAudioRecordAuditByteBufferResamplerStereoFloat() throws Exception {
+        doTest("AuditByteBufferResamplerStereoFloat",
+                false /*localRecord*/, true /*customHandler*/,
+                2 /*periodsPerSecond*/, 0 /*markerPeriodsPerSecond*/,
+                true /*useByteBuffer*/, false /*blocking*/,
+                true /*auditRecording*/, false /*isChannelIndex*/, 96000 /*TEST_SR*/,
+                AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_FLOAT);
+    }
+
+    public void testAudioRecordAuditChannelIndexMonoFloat() throws Exception {
+        doTest("AuditChannelIndexMonoFloat", true /*localRecord*/, true /*customHandler*/,
+                2 /*periodsPerSecond*/, 0 /*markerPeriodsPerSecond*/,
+                false /*useByteBuffer*/, false /*blocking*/,
+                true /*auditRecording*/, true /*isChannelIndex*/, 47000 /*TEST_SR*/,
+                (1 << 0) /* 1 channel */, AudioFormat.ENCODING_PCM_FLOAT);
+    }
+
+    // Audit buffers can run out of space with high sample rate,
+    // so keep the channels and pcm encoding low
+    public void testAudioRecordAuditChannelIndex2() throws Exception {
+        doTest("AuditChannelIndex2", true /*localRecord*/, true /*customHandler*/,
+                2 /*periodsPerSecond*/, 0 /*markerPeriodsPerSecond*/,
+                false /*useByteBuffer*/, false /*blocking*/,
+                true /*auditRecording*/, true /*isChannelIndex*/, 192000 /*TEST_SR*/,
+                (1 << 0) | (1 << 2) /* 2 channels, gap in middle */,
+                AudioFormat.ENCODING_PCM_8BIT);
+    }
+
+    // Audit buffers can run out of space with high numbers of channels,
+    // so keep the sample rate low.
+    public void testAudioRecordAuditChannelIndex5() throws Exception {
+        doTest("AuditChannelIndex5", true /*localRecord*/, true /*customHandler*/,
+                2 /*periodsPerSecond*/, 0 /*markerPeriodsPerSecond*/,
+                false /*useByteBuffer*/, false /*blocking*/,
+                true /*auditRecording*/, true /*isChannelIndex*/, 16000 /*TEST_SR*/,
+                (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4)  /* 5 channels */,
+                AudioFormat.ENCODING_PCM_16BIT);
+    }
+
+    // Test AudioRecord.Builder to verify the observed configuration of an AudioRecord built with
+    // an empty Builder matches the documentation / expected values
+    public void testAudioRecordBuilderDefault() throws Exception {
+        if (!hasMicrophone()) {
+            return;
+        }
+        // constants for test
+        final String TEST_NAME = "testAudioRecordBuilderDefault";
+        // expected values below match the AudioRecord.Builder documentation
+        final int expectedCapturePreset = MediaRecorder.AudioSource.DEFAULT;
+        final String rateStr = new AudioManager(getContext())
+                .getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
+        final int expectedRate = Integer.valueOf(rateStr).intValue();
+        final int expectedChannel = AudioFormat.CHANNEL_IN_MONO;
+        final int expectedEncoding = AudioFormat.ENCODING_PCM_16BIT;
+        final int expectedState = AudioRecord.STATE_INITIALIZED;
+        // use builder with default values
+        final AudioRecord rec = new AudioRecord.Builder().build();
+        // save results
+        final int observedRate = rec.getSampleRate();
+        final int observedSource = rec.getAudioSource();
+        final int observedChannel = rec.getChannelConfiguration();
+        final int observedEncoding = rec.getAudioFormat();
+        final int observedState = rec.getState();
+        // release recorder before the test exits (either successfully or with an exception)
+        rec.release();
+        // compare results
+        assertEquals(TEST_NAME + ": default capture preset", expectedCapturePreset, observedSource);
+        assertEquals(TEST_NAME + ": default rate", expectedRate, observedRate);
+        assertEquals(TEST_NAME + ": default channel config", expectedChannel, observedChannel);
+        assertEquals(TEST_NAME + ": default encoding", expectedEncoding, observedEncoding);
+        assertEquals(TEST_NAME + ": state", expectedState, observedState);
+    }
+
+    // Test AudioRecord.Builder to verify the observed configuration of an AudioRecord built with
+    // an incomplete AudioFormat matches the documentation / expected values
+    public void testAudioRecordBuilderPartialFormat() throws Exception {
+        if (!hasMicrophone()) {
+            return;
+        }
+        // constants for test
+        final String TEST_NAME = "testAudioRecordBuilderPartialFormat";
+        final int expectedRate = 16000;
+        final int expectedState = AudioRecord.STATE_INITIALIZED;
+        // expected values below match the AudioRecord.Builder documentation
+        final int expectedChannel = AudioFormat.CHANNEL_IN_MONO;
+        final int expectedEncoding = AudioFormat.ENCODING_PCM_16BIT;
+        // use builder with a partial audio format
+        final AudioRecord rec = new AudioRecord.Builder()
+                .setAudioFormat(new AudioFormat.Builder().setSampleRate(expectedRate).build())
+                .build();
+        // save results
+        final int observedRate = rec.getSampleRate();
+        final int observedChannel = rec.getChannelConfiguration();
+        final int observedEncoding = rec.getAudioFormat();
+        final int observedState = rec.getState();
+        // release recorder before the test exits (either successfully or with an exception)
+        rec.release();
+        // compare results
+        assertEquals(TEST_NAME + ": configured rate", expectedRate, observedRate);
+        assertEquals(TEST_NAME + ": default channel config", expectedChannel, observedChannel);
+        assertEquals(TEST_NAME + ": default encoding", expectedEncoding, observedEncoding);
+        assertEquals(TEST_NAME + ": state", expectedState, observedState);
+    }
+
+    // Test AudioRecord.Builder to verify the observed configuration of an AudioRecord matches
+    // the parameters used in the builder
+    public void testAudioRecordBuilderParams() throws Exception {
+        if (!hasMicrophone()) {
+            return;
+        }
+        // constants for test
+        final String TEST_NAME = "testAudioRecordBuilderParams";
+        final int expectedRate = 8000;
+        final int expectedChannel = AudioFormat.CHANNEL_IN_MONO;
+        final int expectedChannelCount = 1;
+        final int expectedEncoding = AudioFormat.ENCODING_PCM_16BIT;
+        final int expectedSource = MediaRecorder.AudioSource.VOICE_COMMUNICATION;
+        final int expectedState = AudioRecord.STATE_INITIALIZED;
+        // use builder with expected parameters
+        final AudioRecord rec = new AudioRecord.Builder()
+                .setAudioFormat(new AudioFormat.Builder()
+                        .setSampleRate(expectedRate)
+                        .setChannelMask(expectedChannel)
+                        .setEncoding(expectedEncoding)
+                        .build())
+                .setAudioSource(expectedSource)
+                .build();
+        // save results
+        final int observedRate = rec.getSampleRate();
+        final int observedChannel = rec.getChannelConfiguration();
+        final int observedChannelCount = rec.getChannelCount();
+        final int observedEncoding = rec.getAudioFormat();
+        final int observedSource = rec.getAudioSource();
+        final int observedState = rec.getState();
+        // release recorder before the test exits (either successfully or with an exception)
+        rec.release();
+        // compare results
+        assertEquals(TEST_NAME + ": configured rate", expectedRate, observedRate);
+        assertEquals(TEST_NAME + ": configured channel config", expectedChannel, observedChannel);
+        assertEquals(TEST_NAME + ": configured encoding", expectedEncoding, observedEncoding);
+        assertEquals(TEST_NAME + ": implicit channel count", expectedChannelCount,
+                observedChannelCount);
+        assertEquals(TEST_NAME + ": configured source", expectedSource, observedSource);
+        assertEquals(TEST_NAME + ": state", expectedState, observedState);
+    }
+
+    // Test AudioRecord to ensure we can build after a failure.
+    public void testAudioRecordBufferSize() throws Exception {
+        if (!hasMicrophone()) {
+            return;
+        }
+        // constants for test
+        final String TEST_NAME = "testAudioRecordBufferSize";
+
+        // use builder with parameters that should fail
+        final int superBigBufferSize = 1 << 28;
+        try {
+            final AudioRecord record = new AudioRecord.Builder()
+                .setBufferSizeInBytes(superBigBufferSize)
+                .build();
+            record.release();
+            fail(TEST_NAME + ": should throw exception on failure");
+        } catch (UnsupportedOperationException e) {
+            ;
+        }
+
+        // we should be able to create again with minimum buffer size
+        final int verySmallBufferSize = 2 * 3 * 4; // frame size multiples
+        final AudioRecord record2 = new AudioRecord.Builder()
+                .setBufferSizeInBytes(verySmallBufferSize)
+                .build();
+
+        final int observedState2 = record2.getState();
+        final int observedBufferSize2 = record2.getBufferSizeInFrames();
+        record2.release();
+
+        // succeeds for minimum buffer size
+        assertEquals(TEST_NAME + ": state", AudioRecord.STATE_INITIALIZED, observedState2);
+        // should force the minimum size buffer which is > 0
+        assertTrue(TEST_NAME + ": buffer frame count", observedBufferSize2 > 0);
+    }
+
+    public void testSynchronizedRecord() throws Exception {
+        if (!hasMicrophone()) {
+            return;
+        }
+        final String TEST_NAME = "testSynchronizedRecord";
+        AudioTrack track = null;
+        AudioRecord record = null;
+
+        try {
+            // 1. create a static AudioTrack.
+            final int PLAYBACK_TIME_IN_MS = 2000; /* ms duration. */
+            final int PLAYBACK_SAMPLE_RATE = 8000; /* in hz */
+            AudioFormat format = new AudioFormat.Builder()
+                    .setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
+                    .setEncoding(AudioFormat.ENCODING_PCM_8BIT)
+                    .setSampleRate(PLAYBACK_SAMPLE_RATE)
+                    .build();
+            final int frameCount = AudioHelper.frameCountFromMsec(PLAYBACK_TIME_IN_MS, format);
+            final int frameSize = AudioHelper.frameSizeFromFormat(format);
+            track = new AudioTrack.Builder()
+                    .setAudioFormat(format)
+                    .setBufferSizeInBytes(frameCount * frameSize)
+                    .setTransferMode(AudioTrack.MODE_STATIC)
+                    .build();
+            // create float array and write it
+            final int sampleCount = frameCount * format.getChannelCount();
+            byte[] vab = AudioHelper.createSoundDataInByteArray(
+                    sampleCount, PLAYBACK_SAMPLE_RATE, 600 /* frequency */, 0 /* sweep */);
+            assertEquals(TEST_NAME, vab.length,
+                    track.write(vab, 0 /* offsetInBytes */, vab.length,
+                            AudioTrack.WRITE_NON_BLOCKING));
+            final int trackSessionId = track.getAudioSessionId();
+
+            // 2. create an AudioRecord to sync off of AudioTrack completion.
+            final int RECORD_TIME_IN_MS = 2000;
+            final int RECORD_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
+            final int RECORD_CHANNEL_MASK = AudioFormat.CHANNEL_IN_STEREO;
+            final int RECORD_SAMPLE_RATE = 44100;
+            record = new AudioRecord.Builder()
+                    .setAudioFormat(new AudioFormat.Builder()
+                            .setSampleRate(RECORD_SAMPLE_RATE)
+                            .setChannelMask(RECORD_CHANNEL_MASK)
+                            .setEncoding(RECORD_ENCODING)
+                            .build())
+                    .build();
+            // AudioRecord creation may have silently failed, check state now
+            assertEquals(TEST_NAME, AudioRecord.STATE_INITIALIZED, record.getState());
+
+            // 3. create a MediaSyncEvent
+            // This MediaSyncEvent checks playback completion of an AudioTrack
+            // (or MediaPlayer, or ToneGenerator) based on its audio session id.
+            //
+            // Note: when synchronizing record from a MediaSyncEvent
+            // (1) You need to be "close" to the end of the associated AudioTrack.
+            // If the track does not complete in 30 seconds, recording begins regardless.
+            // (actual delay limit may vary).
+            //
+            // (2) Track completion may be triggered by pause() as well as stop()
+            // or when a static AudioTrack completes playback.
+            //
+            final int eventType = MediaSyncEvent.SYNC_EVENT_PRESENTATION_COMPLETE;
+            MediaSyncEvent event = MediaSyncEvent.createEvent(eventType)
+                    .setAudioSessionId(trackSessionId);
+            assertEquals(TEST_NAME, trackSessionId, event.getAudioSessionId());
+            assertEquals(TEST_NAME, eventType, event.getType());
+
+            // 4. now set the AudioTrack playing and start the recording synchronized
+            track.play();
+            // start recording.  Recording state turns to RECORDSTATE_RECORDING immediately
+            // but the data read() only occurs after the AudioTrack completes.
+            record.startRecording(event);
+            assertEquals(TEST_NAME,
+                    AudioRecord.RECORDSTATE_RECORDING, record.getRecordingState());
+            long startTime = System.currentTimeMillis();
+
+            // 5. get record data.
+            // For our tests, we could set test duration by timed sleep or by # frames received.
+            // Since we don't know *exactly* when AudioRecord actually begins recording,
+            // we end the test by # frames read.
+            final int numChannels =
+                    AudioFormat.channelCountFromInChannelMask(RECORD_CHANNEL_MASK);
+            final int bytesPerSample = AudioFormat.getBytesPerSample(RECORD_ENCODING);
+            final int bytesPerFrame = numChannels * bytesPerSample;
+            // careful about integer overflow in the formula below:
+            final int targetSamples =
+                    (int)((long)RECORD_TIME_IN_MS * RECORD_SAMPLE_RATE * numChannels / 1000);
+            final int BUFFER_FRAMES = 512;
+            final int BUFFER_SAMPLES = BUFFER_FRAMES * numChannels;
+
+            // After starting, there is no guarantee when the first frame of data is read.
+            long firstSampleTime = 0;
+            int samplesRead = 0;
+
+            // For 16 bit data, use shorts
+            short[] shortData = new short[BUFFER_SAMPLES];
+            while (samplesRead < targetSamples) {
+                // the first time through, we read a single frame.
+                // this sets the recording anchor position.
+                int amount = samplesRead == 0 ? numChannels :
+                    Math.min(BUFFER_SAMPLES, targetSamples - samplesRead);
+                int ret = record.read(shortData, 0, amount);
+                assertEquals(TEST_NAME, amount, ret);
+                if (samplesRead == 0 && ret > 0) {
+                    firstSampleTime = System.currentTimeMillis();
+                }
+                samplesRead += ret;
+                // sanity check: elapsed time cannot be more than a second
+                // than what we expect.
+                assertTrue(System.currentTimeMillis() - startTime <=
+                        PLAYBACK_TIME_IN_MS + RECORD_TIME_IN_MS + 1000);
+            }
+
+            // 6. We've read all the frames, now check the timing.
+            final long endTime = System.currentTimeMillis();
+            //Log.d(TEST_NAME, "first sample time " + (firstSampleTime - startTime)
+            //        + " test time " + (endTime - firstSampleTime));
+            //
+            // Verify recording starts within 400 ms of AudioTrack completion (typical 180ms)
+            // Verify recording completes within 50 ms of expected test time (typical 20ms)
+            assertEquals(TEST_NAME, PLAYBACK_TIME_IN_MS, firstSampleTime - startTime, 400);
+            assertEquals(TEST_NAME, RECORD_TIME_IN_MS, endTime - firstSampleTime, 50);
+
+            record.stop();
+            assertEquals(TEST_NAME, AudioRecord.RECORDSTATE_STOPPED, record.getRecordingState());
+        } finally {
+            if (record != null) {
+                record.release();
+                record = null;
+            }
+            if (track != null) {
+                track.release();
+                track = null;
+            }
+        }
+    }
+
+    private AudioRecord createAudioRecord(
+            int audioSource, int sampleRateInHz,
+            int channelConfig, int audioFormat, int bufferSizeInBytes,
+            boolean auditRecording, boolean isChannelIndex) {
+        final AudioRecord record;
+        if (auditRecording) {
+            record = new AudioHelper.AudioRecordAudit(
+                    audioSource, sampleRateInHz, channelConfig,
+                    audioFormat, bufferSizeInBytes, isChannelIndex);
+        } else if (isChannelIndex) {
+            record = new AudioRecord.Builder()
+                    .setAudioFormat(new AudioFormat.Builder()
+                            .setChannelIndexMask(channelConfig)
+                            .setEncoding(audioFormat)
+                            .setSampleRate(sampleRateInHz)
+                            .build())
+                    .setBufferSizeInBytes(bufferSizeInBytes)
+                    .build();
+        } else {
+            record = new AudioRecord(audioSource, sampleRateInHz, channelConfig,
+                    audioFormat, bufferSizeInBytes);
+        }
+
+        // did we get the AudioRecord we expected?
+        final AudioFormat format = record.getFormat();
+        assertEquals(isChannelIndex ? channelConfig : AudioFormat.CHANNEL_INVALID,
+                format.getChannelIndexMask());
+        assertEquals(isChannelIndex ? AudioFormat.CHANNEL_INVALID : channelConfig,
+                format.getChannelMask());
+        assertEquals(audioFormat, format.getEncoding());
+        assertEquals(sampleRateInHz, format.getSampleRate());
+        final int frameSize =
+                format.getChannelCount() * AudioFormat.getBytesPerSample(audioFormat);
+        // our native frame count cannot be smaller than our minimum buffer size request.
+        assertTrue(record.getBufferSizeInFrames() * frameSize >= bufferSizeInBytes);
+        return record;
+    }
+
+    private void doTest(String reportName, boolean localRecord, boolean customHandler,
+            int periodsPerSecond, int markerPeriodsPerSecond,
+            boolean useByteBuffer, boolean blocking,
+            final boolean auditRecording, final boolean isChannelIndex,
+            final int TEST_SR, final int TEST_CONF, final int TEST_FORMAT) throws Exception {
+        if (!hasMicrophone()) {
+            return;
+        }
+        // audit recording plays back recorded audio, so use longer test timing
+        final int TEST_TIME_MS = auditRecording ? 10000 : 2000;
+        final int TEST_SOURCE = MediaRecorder.AudioSource.DEFAULT;
+        mIsHandleMessageCalled = false;
+
+        // For channelIndex use one frame in bytes for buffer size.
+        // This is adjusted to the minimum buffer size by native code.
+        final int bufferSizeInBytes = isChannelIndex ?
+                (AudioFormat.getBytesPerSample(TEST_FORMAT)
+                        * AudioFormat.channelCountFromInChannelMask(TEST_CONF)) :
+                AudioRecord.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
+        assertTrue(bufferSizeInBytes > 0);
+
+        final AudioRecord record;
+        final AudioHelper
+                .MakeSomethingAsynchronouslyAndLoop<AudioRecord> makeSomething;
+
+        if (localRecord) {
+            makeSomething = null;
+            record = createAudioRecord(TEST_SOURCE, TEST_SR, TEST_CONF,
+                    TEST_FORMAT, bufferSizeInBytes, auditRecording, isChannelIndex);
+        } else {
+            makeSomething =
+                    new AudioHelper.MakeSomethingAsynchronouslyAndLoop<AudioRecord>(
+                            new AudioHelper.MakesSomething<AudioRecord>() {
+                                @Override
+                                public AudioRecord makeSomething() {
+                                    return createAudioRecord(TEST_SOURCE, TEST_SR, TEST_CONF,
+                                            TEST_FORMAT, bufferSizeInBytes, auditRecording,
+                                            isChannelIndex);
+                                }
+                            }
+                            );
+           // create AudioRecord on different thread's looper.
+           record = makeSomething.make();
+        }
+
+        // AudioRecord creation may have silently failed, check state now
+        assertEquals(AudioRecord.STATE_INITIALIZED, record.getState());
+
+        final MockOnRecordPositionUpdateListener listener;
+        if (customHandler) {
+            listener = new MockOnRecordPositionUpdateListener(record, mHandler);
+        } else {
+            listener = new MockOnRecordPositionUpdateListener(record);
+        }
+
+        final int updatePeriodInFrames = (periodsPerSecond == 0)
+                ? 0 : TEST_SR / periodsPerSecond;
+        // After starting, there is no guarantee when the first frame of data is read.
+        long firstSampleTime = 0;
+
+        // blank final variables: all successful paths will initialize the times.
+        final long endTime;
+        final long startTime;
+        final long stopRequestTime;
+        final long stopTime;
+
+        try {
+            if (markerPeriodsPerSecond != 0) {
+                mMarkerPeriodInFrames = TEST_SR / markerPeriodsPerSecond;
+                mMarkerPosition = mMarkerPeriodInFrames;
+                assertEquals(AudioRecord.SUCCESS,
+                        record.setNotificationMarkerPosition(mMarkerPosition));
+            } else {
+                mMarkerPeriodInFrames = 0;
+            }
+
+            assertEquals(AudioRecord.SUCCESS,
+                    record.setPositionNotificationPeriod(updatePeriodInFrames));
+
+            listener.start(TEST_SR);
+            record.startRecording();
+            assertEquals(AudioRecord.RECORDSTATE_RECORDING, record.getRecordingState());
+            startTime = System.currentTimeMillis();
+
+            // For our tests, we could set test duration by timed sleep or by # frames received.
+            // Since we don't know *exactly* when AudioRecord actually begins recording,
+            // we end the test by # frames read.
+            final int numChannels =  AudioFormat.channelCountFromInChannelMask(TEST_CONF);
+            final int bytesPerSample = AudioFormat.getBytesPerSample(TEST_FORMAT);
+            final int bytesPerFrame = numChannels * bytesPerSample;
+            // careful about integer overflow in the formula below:
+            final int targetSamples = (int)((long)TEST_TIME_MS * TEST_SR * numChannels / 1000);
+            final int BUFFER_FRAMES = 512;
+            final int BUFFER_SAMPLES = BUFFER_FRAMES * numChannels;
+            // TODO: verify behavior when buffer size is not a multiple of frame size.
+
+            int samplesRead = 0;
+            if (useByteBuffer) {
+                ByteBuffer byteBuffer =
+                        ByteBuffer.allocateDirect(BUFFER_SAMPLES * bytesPerSample);
+                while (samplesRead < targetSamples) {
+                    // the first time through, we read a single frame.
+                    // this sets the recording anchor position.
+                    int amount = samplesRead == 0 ? numChannels :
+                        Math.min(BUFFER_SAMPLES, targetSamples - samplesRead);
+                    amount *= bytesPerSample;    // in bytes
+                    // read always places data at the start of the byte buffer with
+                    // position and limit are ignored.  test this by setting
+                    // position and limit to arbitrary values here.
+                    final int lastPosition = 7;
+                    final int lastLimit = 13;
+                    byteBuffer.position(lastPosition);
+                    byteBuffer.limit(lastLimit);
+                    int ret = blocking ? record.read(byteBuffer, amount) :
+                        record.read(byteBuffer, amount, AudioRecord.READ_NON_BLOCKING);
+                    // so long as amount requested in bytes is a multiple of the frame size
+                    // we expect the byte buffer request to be filled.  Caution: the
+                    // byte buffer data will be in native endian order, not Java order.
+                    if (blocking) {
+                        assertEquals(amount, ret);
+                    } else {
+                        assertTrue("0 <= " + ret + " <= " + amount,
+                                0 <= ret && ret <= amount);
+                    }
+                    // position, limit are not changed by read().
+                    assertEquals(lastPosition, byteBuffer.position());
+                    assertEquals(lastLimit, byteBuffer.limit());
+                    if (samplesRead == 0 && ret > 0) {
+                        firstSampleTime = System.currentTimeMillis();
+                    }
+                    samplesRead += ret / bytesPerSample;
+                }
+            } else {
+                switch (TEST_FORMAT) {
+                case AudioFormat.ENCODING_PCM_8BIT: {
+                    // For 8 bit data, use bytes
+                    byte[] byteData = new byte[BUFFER_SAMPLES];
+                    while (samplesRead < targetSamples) {
+                        // the first time through, we read a single frame.
+                        // this sets the recording anchor position.
+                        int amount = samplesRead == 0 ? numChannels :
+                            Math.min(BUFFER_SAMPLES, targetSamples - samplesRead);
+                        int ret = blocking ? record.read(byteData, 0, amount) :
+                            record.read(byteData, 0, amount, AudioRecord.READ_NON_BLOCKING);
+                        if (blocking) {
+                            assertEquals(amount, ret);
+                        } else {
+                            assertTrue("0 <= " + ret + " <= " + amount,
+                                    0 <= ret && ret <= amount);
+                        }
+                        if (samplesRead == 0 && ret > 0) {
+                            firstSampleTime = System.currentTimeMillis();
+                        }
+                        samplesRead += ret;
+                    }
+                } break;
+                case AudioFormat.ENCODING_PCM_16BIT: {
+                    // For 16 bit data, use shorts
+                    short[] shortData = new short[BUFFER_SAMPLES];
+                    while (samplesRead < targetSamples) {
+                        // the first time through, we read a single frame.
+                        // this sets the recording anchor position.
+                        int amount = samplesRead == 0 ? numChannels :
+                            Math.min(BUFFER_SAMPLES, targetSamples - samplesRead);
+                        int ret = blocking ? record.read(shortData, 0, amount) :
+                            record.read(shortData, 0, amount, AudioRecord.READ_NON_BLOCKING);
+                        if (blocking) {
+                            assertEquals(amount, ret);
+                        } else {
+                            assertTrue("0 <= " + ret + " <= " + amount,
+                                    0 <= ret && ret <= amount);
+                        }
+                        if (samplesRead == 0 && ret > 0) {
+                            firstSampleTime = System.currentTimeMillis();
+                        }
+                        samplesRead += ret;
+                    }
+                } break;
+                case AudioFormat.ENCODING_PCM_FLOAT: {
+                    float[] floatData = new float[BUFFER_SAMPLES];
+                    while (samplesRead < targetSamples) {
+                        // the first time through, we read a single frame.
+                        // this sets the recording anchor position.
+                        int amount = samplesRead == 0 ? numChannels :
+                            Math.min(BUFFER_SAMPLES, targetSamples - samplesRead);
+                        int ret = record.read(floatData, 0, amount, blocking ?
+                                AudioRecord.READ_BLOCKING : AudioRecord.READ_NON_BLOCKING);
+                        if (blocking) {
+                            assertEquals(amount, ret);
+                        } else {
+                            assertTrue("0 <= " + ret + " <= " + amount,
+                                    0 <= ret && ret <= amount);
+                        }
+                        if (samplesRead == 0 && ret > 0) {
+                            firstSampleTime = System.currentTimeMillis();
+                        }
+                        samplesRead += ret;
+                    }
+                } break;
+                }
+            }
+
+            // We've read all the frames, now check the record timing.
+            endTime = System.currentTimeMillis();
+            //Log.d(TAG, "first sample time " + (firstSampleTime - startTime)
+            //        + " test time " + (endTime - firstSampleTime));
+            // Verify recording starts within 200 ms of record.startRecording() (typical 100ms)
+            // Verify recording completes within 50 ms of expected test time (typical 20ms)
+            assertEquals(0, firstSampleTime - startTime, 200);
+            assertEquals(TEST_TIME_MS, endTime - firstSampleTime, auditRecording ? 1000 : 50);
+
+            // Even though we've read all the frames we want, the events may not be sent to
+            // the listeners (events are handled through a separate internal callback thread).
+            // One must sleep to make sure the last event(s) come in.
+            Thread.sleep(30);
+
+            stopRequestTime = System.currentTimeMillis();
+            record.stop();
+            assertEquals(AudioRecord.RECORDSTATE_STOPPED, record.getRecordingState());
+
+            stopTime = System.currentTimeMillis();
+
+            // stop listening - we should be done.
+            // Caution M behavior and likely much earlier:
+            // we assume no events can happen after stop(), but this may not
+            // always be true as stop can take 100ms to complete (as it may disable
+            // input recording on the hal); thus the event handler may be block with
+            // valid events, issuing right after stop completes. Except for those events,
+            // no other events should show up after stop.
+            // This behavior may change in the future but we account for it here in testing.
+            listener.stop();
+
+            // clean up
+            if (makeSomething != null) {
+                makeSomething.join();
+            }
+
+        } finally {
+            listener.release();
+            // we must release the record immediately as it is a system-wide
+            // resource needed for other tests.
+            record.release();
+        }
+        if (auditRecording) { // don't check timing if auditing (messes up timing)
+            return;
+        }
+        final int markerPeriods = markerPeriodsPerSecond * TEST_TIME_MS / 1000;
+        final int updatePeriods = periodsPerSecond * TEST_TIME_MS / 1000;
+        final int markerPeriodsMax =
+                markerPeriodsPerSecond * (int)(stopTime - firstSampleTime) / 1000 + 1;
+        final int updatePeriodsMax =
+                periodsPerSecond * (int)(stopTime - firstSampleTime) / 1000 + 1;
+
+        // collect statistics
+        final ArrayList<Integer> markerList = listener.getMarkerList();
+        final ArrayList<Integer> periodicList = listener.getPeriodicList();
+        // verify count of markers and periodic notifications.
+        // there could be an extra notification since we don't stop() immediately
+        // rather wait for potential events to come in.
+        //Log.d(TAG, "markerPeriods " + markerPeriods +
+        //        " markerPeriodsReceived " + markerList.size());
+        //Log.d(TAG, "updatePeriods " + updatePeriods +
+        //        " updatePeriodsReceived " + periodicList.size());
+        assertTrue(TAG + ": markerPeriods " + markerPeriods +
+                " <= markerPeriodsReceived " + markerList.size() +
+                " <= markerPeriodsMax " + markerPeriodsMax,
+                markerPeriods <= markerList.size()
+                && markerList.size() <= markerPeriodsMax);
+        assertTrue(TAG + ": updatePeriods " + updatePeriods +
+               " <= updatePeriodsReceived " + periodicList.size() +
+               " <= updatePeriodsMax " + updatePeriodsMax,
+                updatePeriods <= periodicList.size()
+                && periodicList.size() <= updatePeriodsMax);
+
+        // Since we don't have accurate positioning of the start time of the recorder,
+        // and there is no record.getPosition(), we consider only differential timing
+        // from the first marker or periodic event.
+        final int toleranceInFrames = TEST_SR * 80 / 1000; // 80 ms
+        final int testTimeInFrames = (int)((long)TEST_TIME_MS * TEST_SR / 1000);
+
+        AudioHelper.Statistics markerStat = new AudioHelper.Statistics();
+        for (int i = 1; i < markerList.size(); ++i) {
+            final int expected = mMarkerPeriodInFrames * i;
+            if (markerList.get(i) > testTimeInFrames) {
+                break; // don't consider any notifications when we might be stopping.
+            }
+            final int actual = markerList.get(i) - markerList.get(0);
+            //Log.d(TAG, "Marker: " + i + " expected(" + expected + ")  actual(" + actual
+            //        + ")  diff(" + (actual - expected) + ")"
+            //        + " tolerance " + toleranceInFrames);
+            assertEquals(expected, actual, toleranceInFrames);
+            markerStat.add((double)(actual - expected) * 1000 / TEST_SR);
+        }
+
+        AudioHelper.Statistics periodicStat = new AudioHelper.Statistics();
+        for (int i = 1; i < periodicList.size(); ++i) {
+            final int expected = updatePeriodInFrames * i;
+            if (periodicList.get(i) > testTimeInFrames) {
+                break; // don't consider any notifications when we might be stopping.
+            }
+            final int actual = periodicList.get(i) - periodicList.get(0);
+            //Log.d(TAG, "Update: " + i + " expected(" + expected + ")  actual(" + actual
+            //        + ")  diff(" + (actual - expected) + ")"
+            //        + " tolerance " + toleranceInFrames);
+            assertEquals(expected, actual, toleranceInFrames);
+            periodicStat.add((double)(actual - expected) * 1000 / TEST_SR);
+        }
+
+        // report this
+        ReportLog log = getReportLog();
+        log.printValue(reportName + ": startRecording lag", firstSampleTime - startTime,
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": stop execution time", stopTime - stopRequestTime,
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Total record time expected", TEST_TIME_MS,
+                ResultType.NEUTRAL, ResultUnit.MS);
+        log.printValue(reportName + ": Total record time actual", endTime - firstSampleTime,
+                ResultType.NEUTRAL, ResultUnit.MS);
+        log.printValue(reportName + ": Total markers expected", markerPeriods,
+                ResultType.NEUTRAL, ResultUnit.COUNT);
+        log.printValue(reportName + ": Total markers actual", markerList.size(),
+                ResultType.NEUTRAL, ResultUnit.COUNT);
+        log.printValue(reportName + ": Total periods expected", updatePeriods,
+                ResultType.NEUTRAL, ResultUnit.COUNT);
+        log.printValue(reportName + ": Total periods actual", periodicList.size(),
+                ResultType.NEUTRAL, ResultUnit.COUNT);
+        log.printValue(reportName + ": Average Marker diff", markerStat.getAvg(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Maximum Marker abs diff", markerStat.getMaxAbs(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Average Marker abs diff", markerStat.getAvgAbs(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Average Periodic diff", periodicStat.getAvg(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Maximum Periodic abs diff", periodicStat.getMaxAbs(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Average Periodic abs diff", periodicStat.getAvgAbs(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printSummary(reportName + ": Unified abs diff",
+                (periodicStat.getAvgAbs() + markerStat.getAvgAbs()) / 2,
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+    }
+
+    private class MockOnRecordPositionUpdateListener
+                                        implements OnRecordPositionUpdateListener {
+        public MockOnRecordPositionUpdateListener(AudioRecord record) {
+            mAudioRecord = record;
+            record.setRecordPositionUpdateListener(this);
+        }
+
+        public MockOnRecordPositionUpdateListener(AudioRecord record, Handler handler) {
+            mAudioRecord = record;
+            record.setRecordPositionUpdateListener(this, handler);
+        }
+
+        public synchronized void onMarkerReached(AudioRecord record) {
+            if (mIsTestActive) {
+                int position = getPosition();
+                mOnMarkerReachedCalled.add(position);
+                mMarkerPosition += mMarkerPeriodInFrames;
+                assertEquals(AudioRecord.SUCCESS,
+                        mAudioRecord.setNotificationMarkerPosition(mMarkerPosition));
+            } else {
+                // stop() is not sufficient to end all notifications
+                // as is not synchronous with the event handling thread
+                // so we comment out the line below.
+                // fail("onMarkerReached called when not active");
+            }
+        }
+
+        public synchronized void onPeriodicNotification(AudioRecord record) {
+            if (mIsTestActive) {
+                int position = getPosition();
+                mOnPeriodicNotificationCalled.add(position);
+            } else {
+                // see above comments about stop
+                // fail("onPeriodicNotification called when not active");
+            }
+        }
+
+        public synchronized void start(int sampleRate) {
+            mIsTestActive = true;
+            mSampleRate = sampleRate;
+            mStartTime = System.currentTimeMillis();
+        }
+
+        public synchronized void stop() {
+            mIsTestActive = false;
+        }
+
+        public ArrayList<Integer> getMarkerList() {
+            return mOnMarkerReachedCalled;
+        }
+
+        public ArrayList<Integer> getPeriodicList() {
+            return mOnPeriodicNotificationCalled;
+        }
+
+        public synchronized void release() {
+            stop();
+            mAudioRecord.setRecordPositionUpdateListener(null);
+            mAudioRecord = null;
+        }
+
+        private int getPosition() {
+            // we don't have mAudioRecord.getRecordPosition();
+            // so we fake this by timing.
+            long delta = System.currentTimeMillis() - mStartTime;
+            return (int)(delta * mSampleRate / 1000);
+        }
+
+        private long mStartTime;
+        private int mSampleRate;
+        private boolean mIsTestActive = true;
+        private AudioRecord mAudioRecord;
+        private ArrayList<Integer> mOnMarkerReachedCalled = new ArrayList<Integer>();
+        private ArrayList<Integer> mOnPeriodicNotificationCalled = new ArrayList<Integer>();
+    }
+
     private boolean hasMicrophone() {
-        return getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_MICROPHONE);
+        return getContext().getPackageManager().hasSystemFeature(
+                PackageManager.FEATURE_MICROPHONE);
     }
 }
diff --git a/tests/tests/media/src/android/media/cts/AudioRecord_BufferSizeTest.java b/tests/tests/media/src/android/media/cts/AudioRecord_BufferSizeTest.java
index e597827..1de6302 100644
--- a/tests/tests/media/src/android/media/cts/AudioRecord_BufferSizeTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioRecord_BufferSizeTest.java
@@ -53,6 +53,11 @@
             } catch (Throwable e) {
                 Log.e(TAG, "Sample rate: " + SAMPLE_RATES_IN_HZ[i], e);
                 failedSampleRates.add(SAMPLE_RATES_IN_HZ[i]);
+                if (mAudioRecord != null) {
+                    // clean up.  AudioRecords are in scarce supply.
+                    mAudioRecord.release();
+                    mAudioRecord = null;
+                }
             }
         }
         assertTrue("Failed sample rates: " + failedSampleRates + " See log for more details.",
@@ -61,21 +66,26 @@
 
     private void record(int sampleRateInHz) {
         int bufferSize = AudioRecord.getMinBufferSize(sampleRateInHz, CHANNEL_CONFIG, AUDIO_FORMAT);
-        byte[] buffer = new byte[bufferSize];
         assertTrue(bufferSize > 0);
 
         createAudioRecord(sampleRateInHz, bufferSize);
-        checkRecordingState(AudioRecord.STATE_INITIALIZED);
+        // RecordingState changes are reflected synchronously (no need to poll)
+        assertEquals(AudioRecord.RECORDSTATE_STOPPED, mAudioRecord.getRecordingState());
 
         mAudioRecord.startRecording();
-        checkRecordingState(AudioRecord.RECORDSTATE_RECORDING);
+        assertEquals(AudioRecord.RECORDSTATE_RECORDING, mAudioRecord.getRecordingState());
 
+        // it is preferred to use a short array to read AudioFormat.ENCODING_PCM_16BIT data
+        // but it's ok to read using using a byte array.  16 bit PCM data will be
+        // stored as two bytes, native endian.
+        byte[] buffer = new byte[bufferSize];
         assertTrue(mAudioRecord.read(buffer, 0, bufferSize) > 0);
 
         mAudioRecord.stop();
-        checkRecordingState(AudioRecord.RECORDSTATE_STOPPED);
+        assertEquals(AudioRecord.RECORDSTATE_STOPPED, mAudioRecord.getRecordingState());
 
         mAudioRecord.release();
+        mAudioRecord = null;
     }
 
     private void createAudioRecord(final int sampleRateInHz, final int bufferSize) {
@@ -84,15 +94,6 @@
         assertNotNull(mAudioRecord);
     }
 
-    private void checkRecordingState(final int state) {
-        new PollingCheck() {
-            @Override
-            protected boolean check() {
-                return mAudioRecord.getRecordingState() == state;
-            }
-        }.run();
-    }
-
     private boolean hasMicrophone() {
         return getContext().getPackageManager().hasSystemFeature(
                 PackageManager.FEATURE_MICROPHONE);
diff --git a/tests/tests/media/src/android/media/cts/AudioTrackNative.java b/tests/tests/media/src/android/media/cts/AudioTrackNative.java
new file mode 100644
index 0000000..1ce44ef
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/AudioTrackNative.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2015 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.media.cts;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.cts.util.CtsAndroidTestCase;
+import android.util.Log;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+public class AudioTrackNative {
+    // Must be kept in sync with C++ JNI audio-track-native (AudioTrackNative) WRITE_FLAG_*
+    public static final int WRITE_FLAG_BLOCKING = 1 << 0;
+    /** @hide */
+    @IntDef(flag = true,
+            value = {
+                    WRITE_FLAG_BLOCKING,
+            })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface WriteFlags { }
+
+    public AudioTrackNative() {
+        mNativeTrackInJavaObj = nativeCreateTrack();
+    }
+
+    // TODO: eventually accept AudioFormat
+    // numBuffers is the number of internal buffers before hitting the OpenSL ES.
+    // A value of 0 means that all writes are blocking.
+    public boolean open(int numChannels, int sampleRate, boolean useFloat, int numBuffers) {
+        if (nativeOpen(mNativeTrackInJavaObj, numChannels, sampleRate, useFloat, numBuffers)
+                == STATUS_OK) {
+            mChannelCount = numChannels;
+            return true;
+        }
+        return false;
+    }
+
+    public void close() {
+        nativeClose(mNativeTrackInJavaObj);
+    }
+
+    public boolean start() {
+        return nativeStart(mNativeTrackInJavaObj) == STATUS_OK;
+    }
+
+    public boolean stop() {
+        return nativeStop(mNativeTrackInJavaObj) == STATUS_OK;
+    }
+
+    public boolean pause() {
+        return nativePause(mNativeTrackInJavaObj) == STATUS_OK;
+    }
+
+    public boolean flush() {
+        return nativeFlush(mNativeTrackInJavaObj) == STATUS_OK;
+    }
+
+    public long getPositionInMsec() {
+        long[] position = new long[1];
+        if (nativeGetPositionInMsec(mNativeTrackInJavaObj, position) != STATUS_OK) {
+            throw new IllegalStateException();
+        }
+        return position[0];
+    }
+
+    public int getBuffersPending() {
+        return nativeGetBuffersPending(mNativeTrackInJavaObj);
+    }
+
+    /* returns number of samples written.
+     * 0 may be returned if !isBlocking.
+     * negative value indicates error.
+     */
+    public int write(@NonNull byte[] byteArray,
+            int offsetInSamples, int sizeInSamples, @WriteFlags int writeFlags) {
+        return nativeWriteByteArray(
+                mNativeTrackInJavaObj, byteArray, offsetInSamples, sizeInSamples, writeFlags);
+    }
+
+    public int write(@NonNull short[] shortArray,
+            int offsetInSamples, int sizeInSamples, @WriteFlags int writeFlags) {
+        return nativeWriteShortArray(
+                mNativeTrackInJavaObj, shortArray, offsetInSamples, sizeInSamples, writeFlags);
+    }
+
+    public int write(@NonNull float[] floatArray,
+            int offsetInSamples, int sizeInSamples, @WriteFlags int writeFlags) {
+        return nativeWriteFloatArray(
+                mNativeTrackInJavaObj, floatArray, offsetInSamples, sizeInSamples, writeFlags);
+    }
+
+    public int getChannelCount() {
+        return mChannelCount;
+    }
+
+    public static boolean test(int numChannels, int sampleRate, boolean useFloat,
+            int msecPerBuffer, int numBuffers) {
+        return nativeTest(numChannels, sampleRate, useFloat, msecPerBuffer, numBuffers)
+                == STATUS_OK;
+    }
+
+    @Override
+    protected void finalize() {
+        nativeClose(mNativeTrackInJavaObj);
+        nativeDestroyTrack(mNativeTrackInJavaObj);
+    }
+
+    static {
+        System.loadLibrary("audio_jni");
+    }
+
+    private static final String TAG = "AudioTrackNative";
+    private int mChannelCount;
+    private final long mNativeTrackInJavaObj;
+    private static final int STATUS_OK = 0;
+
+    // static native API.
+    // The native API uses a long "track handle" created by nativeCreateTrack.
+    // The handle must be destroyed after use by nativeDestroyTrack.
+    //
+    // Return codes from the native layer are status_t.
+    // Converted to Java booleans or exceptions at the public API layer.
+    private static native long nativeCreateTrack();
+    private static native void nativeDestroyTrack(long track);
+    private static native int nativeOpen(
+            long track, int numChannels, int sampleRate, boolean useFloat, int numBuffers);
+    private static native void nativeClose(long track);
+    private static native int nativeStart(long track);
+    private static native int nativeStop(long track);
+    private static native int nativePause(long track);
+    private static native int nativeFlush(long track);
+    private static native int nativeGetPositionInMsec(long track, @NonNull long[] position);
+    private static native int nativeGetBuffersPending(long track);
+    private static native int nativeWriteByteArray(long track, @NonNull byte[] byteArray,
+            int offsetInSamples, int sizeInSamples, @WriteFlags int writeFlags);
+    private static native int nativeWriteShortArray(long track, @NonNull short[] shortArray,
+            int offsetInSamples, int sizeInSamples, @WriteFlags int writeFlags);
+    private static native int nativeWriteFloatArray(long track, @NonNull float[] floatArray,
+            int offsetInSamples, int sizeInSamples, @WriteFlags int writeFlags);
+
+    // native interface for all-in-one testing, no track handle required.
+    private static native int nativeTest(
+            int numChannels, int sampleRate, boolean useFloat, int msecPerBuffer, int numBuffers);
+}
diff --git a/tests/tests/media/src/android/media/cts/AudioTrackTest.java b/tests/tests/media/src/android/media/cts/AudioTrackTest.java
index be68756..4c03183 100644
--- a/tests/tests/media/src/android/media/cts/AudioTrackTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioTrackTest.java
@@ -18,11 +18,14 @@
 
 import android.content.pm.PackageManager;
 import android.cts.util.CtsAndroidTestCase;
+import android.media.AudioAttributes;
 import android.media.AudioFormat;
 import android.media.AudioManager;
 import android.media.AudioTimestamp;
 import android.media.AudioTrack;
+import android.media.PlaybackParams;
 import android.util.Log;
+
 import com.android.cts.util.ReportLog;
 import com.android.cts.util.ResultType;
 import com.android.cts.util.ResultUnit;
@@ -261,6 +264,116 @@
     }
 
     // -----------------------------------------------------------------
+    // AudioTrack construction with Builder
+    // ----------------------------------
+
+    // Test case 1: build AudioTrack with default parameters, test documented default params
+    public void testBuilderDefault() throws Exception {
+        // constants for test
+        final String TEST_NAME = "testBuilderDefault";
+        final int expectedDefaultEncoding = AudioFormat.ENCODING_PCM_16BIT;
+        final int expectedDefaultRate =
+                AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_MUSIC);
+        final int expectedDefaultChannels = AudioFormat.CHANNEL_OUT_STEREO;
+        // use Builder
+        final int buffSizeInBytes = AudioTrack.getMinBufferSize(
+                expectedDefaultRate, expectedDefaultChannels, expectedDefaultEncoding);
+        final AudioTrack track = new AudioTrack.Builder()
+                .setBufferSizeInBytes(buffSizeInBytes)
+                .build();
+        // save results
+        final int observedState = track.getState();
+        final int observedFormat = track.getAudioFormat();
+        final int observedChannelConf = track.getChannelConfiguration();
+        final int observedRate = track.getSampleRate();
+        // release track before the test exits (either successfully or with an exception)
+        track.release();
+        // compare results
+        assertEquals(TEST_NAME + ": Track initialized", AudioTrack.STATE_INITIALIZED,
+                observedState);
+        assertEquals(TEST_NAME + ": Default track encoding", expectedDefaultEncoding,
+                observedFormat);
+        assertEquals(TEST_NAME + ": Default track channels", expectedDefaultChannels,
+                observedChannelConf);
+        assertEquals(TEST_NAME + ": Default track sample rate", expectedDefaultRate,
+                observedRate);
+    }
+
+    // Test case 2: build AudioTrack with AudioFormat, test it's used
+    public void testBuilderFormat() throws Exception {
+        // constants for test
+        final String TEST_NAME = "testBuilderFormat";
+        final int TEST_RATE = 32000;
+        final int TEST_CHANNELS = AudioFormat.CHANNEL_OUT_STEREO;
+        // use Builder
+        final int buffSizeInBytes = AudioTrack.getMinBufferSize(
+                TEST_RATE, TEST_CHANNELS, AudioFormat.ENCODING_PCM_16BIT);
+        final AudioTrack track = new AudioTrack.Builder()
+                .setAudioAttributes(new AudioAttributes.Builder().build())
+                .setBufferSizeInBytes(buffSizeInBytes)
+                .setAudioFormat(new AudioFormat.Builder()
+                        .setChannelMask(TEST_CHANNELS).setSampleRate(TEST_RATE).build())
+                .build();
+        // save results
+        final int observedState = track.getState();
+        final int observedChannelConf = track.getChannelConfiguration();
+        final int observedRate = track.getSampleRate();
+        // release track before the test exits (either successfully or with an exception)
+        track.release();
+        // compare results
+        assertEquals(TEST_NAME + ": Track initialized", AudioTrack.STATE_INITIALIZED,
+                observedState);
+        assertEquals(TEST_NAME + ": Track channels", TEST_CHANNELS, observedChannelConf);
+        assertEquals(TEST_NAME + ": Track sample rate", TEST_RATE, observedRate);
+    }
+
+    // Test case 3: build AudioTrack with session ID, test it's used
+    public void testBuilderSession() throws Exception {
+        // constants for test
+        final String TEST_NAME = "testBuilderSession";
+        // generate a session ID
+        final int expectedSessionId = new AudioManager(getContext()).generateAudioSessionId();
+        // use builder
+        final AudioTrack track = new AudioTrack.Builder()
+                .setSessionId(expectedSessionId)
+                .build();
+        // save results
+        final int observedSessionId = track.getAudioSessionId();
+        // release track before the test exits (either successfully or with an exception)
+        track.release();
+        // compare results
+        assertEquals(TEST_NAME + ": Assigned track session ID", expectedSessionId,
+                observedSessionId);
+    }
+
+    // Test case 4: build AudioTrack with AudioAttributes built from stream type, test it's used
+    public void testBuilderAttributesStream() throws Exception {
+        // constants for test
+        final String TEST_NAME = "testBuilderAttributesStream";
+        //     use a stream type documented in AudioAttributes.Builder.setLegacyStreamType(int)
+        final int expectedStreamType = AudioManager.STREAM_ALARM;
+        final int expectedContentType = AudioAttributes.CONTENT_TYPE_SPEECH;
+        final AudioAttributes aa = new AudioAttributes.Builder()
+                .setLegacyStreamType(expectedStreamType)
+                .setContentType(expectedContentType)
+                .build();
+        // use builder
+        final AudioTrack track = new AudioTrack.Builder()
+                .setAudioAttributes(aa)
+                .build();
+        // save results
+        final int observedStreamType = track.getStreamType();
+        // release track before the test exits (either successfully or with an exception)
+        track.release();
+        // compare results
+        assertEquals(TEST_NAME + ": track stream type", expectedStreamType, observedStreamType);
+        //    also test content type was preserved in the attributes even though they
+        //     were first configured with a legacy stream type
+        assertEquals(TEST_NAME + ": attributes content type", expectedContentType,
+                aa.getContentType());
+    }
+
+    // -----------------------------------------------------------------
     // Playback head position
     // ----------------------------------
 
@@ -1225,7 +1338,7 @@
         // constant for test
         final String TEST_NAME = "testGetMinBufferSizeTooHighSR";
         // FIXME need an API to retrieve AudioTrack.SAMPLE_RATE_HZ_MAX
-        final int TEST_SR = 96001;
+        final int TEST_SR = 192001;
         final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_MONO;
         final int TEST_FORMAT = AudioFormat.ENCODING_PCM_8BIT;
 
@@ -1278,6 +1391,7 @@
             frameCount /= 2;
         }
         assertTrue(TEST_NAME, track.getNativeFrameCount() >= frameCount);
+        assertEquals(TEST_NAME, track.getNativeFrameCount(), track.getBufferSizeInFrames());
     }
 
     public void testReloadStaticData() throws Exception {
@@ -1291,7 +1405,8 @@
 
         // -------- initialization --------------
         int bufferSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
-        byte data[] = createSoundDataInByteArray(bufferSize, TEST_SR, 1024);
+        byte data[] = AudioHelper.createSoundDataInByteArray(
+                bufferSize, TEST_SR, 1024 /* frequency */, 0 /* sweep */);
         AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT,
                 bufferSize, TEST_MODE);
         // -------- test --------------
@@ -1309,58 +1424,10 @@
         track.release();
     }
 
-    public static byte[] createSoundDataInByteArray(int bufferSamples, final int sampleRate,
-            final double frequency, double sweep) {
-        final double rad = 2 * Math.PI * frequency / sampleRate;
-        byte[] vai = new byte[bufferSamples];
-        sweep = Math.PI * sweep / ((double)sampleRate * vai.length);
-        for (int j = 0; j < vai.length; j++) {
-            int unsigned =  (int)(Math.sin(j * (rad + j * sweep)) * Byte.MAX_VALUE)
-                    + Byte.MAX_VALUE & 0xFF;
-            vai[j] = (byte) unsigned;
-        }
-        return vai;
-    }
-
-    public static short[] createSoundDataInShortArray(int bufferSamples, final int sampleRate,
-            final double frequency, double sweep) {
-        final double rad = 2 * Math.PI * frequency / sampleRate;
-        short[] vai = new short[bufferSamples];
-        sweep = Math.PI * sweep / ((double)sampleRate * vai.length);
-        for (int j = 0; j < vai.length; j++) {
-            vai[j] = (short)(Math.sin(j * (rad + j * sweep)) * Short.MAX_VALUE);
-        }
-        return vai;
-    }
-
-    public static float[] createSoundDataInFloatArray(int bufferSamples, final int sampleRate,
-            final double frequency, double sweep) {
-        final double rad = 2 * Math.PI * frequency / sampleRate;
-        float[] vaf = new float[bufferSamples];
-        sweep = Math.PI * sweep / ((double)sampleRate * vaf.length);
-        for (int j = 0; j < vaf.length; j++) {
-            vaf[j] = (float)(Math.sin(j * (rad + j * sweep)));
-        }
-        return vaf;
-    }
-
-    public static byte[] createSoundDataInByteArray(int bufferSamples, final int sampleRate,
-            final double frequency) {
-        return createSoundDataInByteArray(bufferSamples, sampleRate, frequency, 0 /*sweep*/);
-    }
-
-    public static short[] createSoundDataInShortArray(int bufferSamples, final int sampleRate,
-            final double frequency) {
-        return createSoundDataInShortArray(bufferSamples, sampleRate, frequency, 0 /*sweep*/);
-    }
-
-    public static float[] createSoundDataInFloatArray(int bufferSamples, final int sampleRate,
-            final double frequency) {
-        return createSoundDataInFloatArray(bufferSamples, sampleRate, frequency, 0 /*sweep*/);
-    }
-
     public void testPlayStaticData() throws Exception {
         if (!hasAudioOutput()) {
+            Log.w(TAG,"AUDIO_OUTPUT feature not found. This system might not have a valid "
+                    + "audio output HAL");
             return;
         }
         // constants for test
@@ -1399,54 +1466,54 @@
                     final long MILLISECONDS_PER_SECOND = 1000;
                     AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR,
                             TEST_CONF, TEST_FORMAT, bufferSize, TEST_MODE);
-                    assertEquals(TEST_NAME, track.getState(), AudioTrack.STATE_NO_STATIC_DATA);
+                    assertEquals(TEST_NAME, AudioTrack.STATE_NO_STATIC_DATA, track.getState());
 
                     // -------- test --------------
 
                     // test setLoopPoints and setPosition can be called here.
                     assertEquals(TEST_NAME,
-                            track.setPlaybackHeadPosition(bufferFrames/2),
-                            android.media.AudioTrack.SUCCESS);
+                            android.media.AudioTrack.SUCCESS,
+                            track.setPlaybackHeadPosition(bufferFrames/2));
                     assertEquals(TEST_NAME,
+                            android.media.AudioTrack.SUCCESS,
                             track.setLoopPoints(
-                                    0 /*startInFrames*/, bufferFrames, 10 /*loopCount*/),
-                            android.media.AudioTrack.SUCCESS);
+                                    0 /*startInFrames*/, bufferFrames, 10 /*loopCount*/));
                     // only need to write once to the static track
                     switch (TEST_FORMAT) {
                     case AudioFormat.ENCODING_PCM_8BIT: {
-                        byte data[] = createSoundDataInByteArray(
+                        byte data[] = AudioHelper.createSoundDataInByteArray(
                                 bufferSamples, TEST_SR,
                                 testFrequency, TEST_SWEEP);
                         assertEquals(TEST_NAME,
-                                track.write(data, 0 /*offsetInBytes*/, data.length),
-                                bufferSamples);
+                                bufferSamples,
+                                track.write(data, 0 /*offsetInBytes*/, data.length));
                         } break;
                     case AudioFormat.ENCODING_PCM_16BIT: {
-                        short data[] = createSoundDataInShortArray(
+                        short data[] = AudioHelper.createSoundDataInShortArray(
                                 bufferSamples, TEST_SR,
                                 testFrequency, TEST_SWEEP);
                         assertEquals(TEST_NAME,
-                                track.write(data, 0 /*offsetInBytes*/, data.length),
-                                bufferSamples);
+                                bufferSamples,
+                                track.write(data, 0 /*offsetInBytes*/, data.length));
                         } break;
                     case AudioFormat.ENCODING_PCM_FLOAT: {
-                        float data[] = createSoundDataInFloatArray(
+                        float data[] = AudioHelper.createSoundDataInFloatArray(
                                 bufferSamples, TEST_SR,
                                 testFrequency, TEST_SWEEP);
                         assertEquals(TEST_NAME,
+                                bufferSamples,
                                 track.write(data, 0 /*offsetInBytes*/, data.length,
-                                        AudioTrack.WRITE_BLOCKING),
-                                bufferSamples);
+                                        AudioTrack.WRITE_BLOCKING));
                         } break;
                     }
-                    assertEquals(TEST_NAME, track.getState(), AudioTrack.STATE_INITIALIZED);
+                    assertEquals(TEST_NAME, AudioTrack.STATE_INITIALIZED, track.getState());
                     // test setLoopPoints and setPosition can be called here.
                     assertEquals(TEST_NAME,
-                            track.setPlaybackHeadPosition(0 /*positionInFrames*/),
-                            android.media.AudioTrack.SUCCESS);
+                            android.media.AudioTrack.SUCCESS,
+                            track.setPlaybackHeadPosition(0 /*positionInFrames*/));
                     assertEquals(TEST_NAME,
-                            track.setLoopPoints(0 /*startInFrames*/, bufferFrames, TEST_LOOPS),
-                            android.media.AudioTrack.SUCCESS);
+                            android.media.AudioTrack.SUCCESS,
+                            track.setLoopPoints(0 /*startInFrames*/, bufferFrames, TEST_LOOPS));
 
                     track.play();
                     Thread.sleep(seconds * MILLISECONDS_PER_SECOND * (TEST_LOOPS + 1));
@@ -1455,7 +1522,7 @@
                     // Check position after looping. AudioTrack.getPlaybackHeadPosition() returns
                     // the running count of frames played, not the actual static buffer position.
                     int position = track.getPlaybackHeadPosition();
-                    assertEquals(TEST_NAME, position, bufferFrames * (TEST_LOOPS + 1));
+                    assertEquals(TEST_NAME, bufferFrames * (TEST_LOOPS + 1), position);
 
                     track.stop();
                     Thread.sleep(WAIT_MSEC);
@@ -1475,12 +1542,14 @@
                 AudioFormat.ENCODING_PCM_16BIT,
                 AudioFormat.ENCODING_PCM_FLOAT,
         };
+        // due to downmixer algorithmic latency, source channels greater than 2 may
+        // sound shorter in duration at 4kHz sampling rate.
         final int TEST_SR_ARRAY[] = {
                 4000,
-                22050,
                 44100,
                 48000,
                 96000,
+                192000,
         };
         final int TEST_CONF_ARRAY[] = {
                 AudioFormat.CHANNEL_OUT_MONO,    // 1.0
@@ -1494,6 +1563,7 @@
         };
         final int TEST_MODE = AudioTrack.MODE_STREAM;
         final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC;
+        final float TEST_SWEEP = 0; // sine wave only
 
         for (int TEST_FORMAT : TEST_FORMAT_ARRAY) {
             double frequency = 400; // frequency changes for each test
@@ -1502,72 +1572,81 @@
                     // -------- initialization --------------
                     final int minBufferSize = AudioTrack.getMinBufferSize(TEST_SR,
                             TEST_CONF, TEST_FORMAT); // in bytes
-                    final int bufferSamples = 12 * minBufferSize
-                            / AudioFormat.getBytesPerSample(TEST_FORMAT);
-                    final int channelCount = Integer.bitCount(TEST_CONF);
-                    final double testFrequency = frequency / channelCount;
                     AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR,
                             TEST_CONF, TEST_FORMAT, minBufferSize, TEST_MODE);
                     assertTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED);
-                    boolean hasPlayed = false;
-                    int written = 0;
 
+                    // compute parameters for the source signal data.
+                    final int channelCount = Integer.bitCount(TEST_CONF);
+                    AudioFormat format = track.getFormat();
+                    assertEquals(TEST_NAME, TEST_SR, format.getSampleRate());
+                    assertEquals(TEST_NAME, TEST_CONF, format.getChannelMask());
+                    assertEquals(TEST_NAME, channelCount, format.getChannelCount());
+                    assertEquals(TEST_NAME, TEST_FORMAT, format.getEncoding());
+                    final int sourceSamples = channelCount
+                            * AudioHelper.frameCountFromMsec(500,
+                                    format); // duration of test tones
+                    final double testFrequency = frequency / channelCount;
+
+                    int written = 0;
+                    // For streaming tracks, it's ok to issue the play() command
+                    // before any audio is written.
+                    track.play();
                     // -------- test --------------
+
+                    // samplesPerWrite can be any positive value.
+                    // We prefer this to be a multiple of channelCount so write()
+                    // does not return a short count.
+                    // If samplesPerWrite is very large, it is limited to the data length
+                    // and we simply write (blocking) the entire source data and not even loop.
+                    // We choose a value here which simulates double buffer writes.
+                    final int buffers = 2; // double buffering mode
+                    final int samplesPerWrite =
+                            (track.getBufferSizeInFrames() / buffers) * channelCount;
                     switch (TEST_FORMAT) {
                     case AudioFormat.ENCODING_PCM_8BIT: {
-                        byte data[] = createSoundDataInByteArray(
-                                bufferSamples, TEST_SR,
-                                testFrequency);
+                        byte data[] = AudioHelper.createSoundDataInByteArray(
+                                sourceSamples, TEST_SR,
+                                testFrequency, TEST_SWEEP);
                         while (written < data.length) {
-                            int ret = track.write(data, written,
-                                    Math.min(data.length - written, minBufferSize));
-                            assertTrue(TEST_NAME, ret >= 0);
+                            int samples = Math.min(data.length - written, samplesPerWrite);
+                            int ret = track.write(data, written, samples);
+                            assertEquals(TEST_NAME, samples, ret);
                             written += ret;
-                            if (!hasPlayed) {
-                                track.play();
-                                hasPlayed = true;
-                            }
                         }
                         } break;
                     case AudioFormat.ENCODING_PCM_16BIT: {
-                        short data[] = createSoundDataInShortArray(
-                                bufferSamples, TEST_SR,
-                                testFrequency);
+                        short data[] = AudioHelper.createSoundDataInShortArray(
+                                sourceSamples, TEST_SR,
+                                testFrequency, TEST_SWEEP);
                         while (written < data.length) {
-                            int ret = track.write(data, written,
-                                    Math.min(data.length - written, minBufferSize));
-                            assertTrue(TEST_NAME, ret >= 0);
+                            int samples = Math.min(data.length - written, samplesPerWrite);
+                            int ret = track.write(data, written, samples);
+                            assertEquals(TEST_NAME, samples, ret);
                             written += ret;
-                            if (!hasPlayed) {
-                                track.play();
-                                hasPlayed = true;
-                            }
                         }
                         } break;
                     case AudioFormat.ENCODING_PCM_FLOAT: {
-                        float data[] = createSoundDataInFloatArray(
-                                bufferSamples, TEST_SR,
-                                testFrequency);
+                        float data[] = AudioHelper.createSoundDataInFloatArray(
+                                sourceSamples, TEST_SR,
+                                testFrequency, TEST_SWEEP);
                         while (written < data.length) {
-                            int ret = track.write(data, written,
-                                    Math.min(data.length - written, minBufferSize),
+                            int samples = Math.min(data.length - written, samplesPerWrite);
+                            int ret = track.write(data, written, samples,
                                     AudioTrack.WRITE_BLOCKING);
-                            assertTrue(TEST_NAME, ret >= 0);
+                            assertEquals(TEST_NAME, samples, ret);
                             written += ret;
-                            if (!hasPlayed) {
-                                track.play();
-                                hasPlayed = true;
-                            }
                         }
                         } break;
                     }
 
-                    Thread.sleep(WAIT_MSEC);
+                    // For streaming tracks, AudioTrack.stop() doesn't immediately stop playback.
+                    // Rather, it allows the remaining data in the internal buffer to drain.
                     track.stop();
-                    Thread.sleep(WAIT_MSEC);
+                    Thread.sleep(WAIT_MSEC); // wait for the data to drain.
                     // -------- tear down --------------
                     track.release();
-                    frequency += 70; // increment test tone frequency
+                    frequency += 50; // increment test tone frequency
                 }
             }
         }
@@ -1593,6 +1672,7 @@
         };
         final int TEST_MODE = AudioTrack.MODE_STREAM;
         final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC;
+        final float TEST_SWEEP = 0; // sine wave only
 
         for (int TEST_FORMAT : TEST_FORMAT_ARRAY) {
             double frequency = 800; // frequency changes for each test
@@ -1606,12 +1686,19 @@
                             int bufferSize = 12 * minBufferSize;
                             int bufferSamples = bufferSize
                                     / AudioFormat.getBytesPerSample(TEST_FORMAT);
+
+                            // create audio track and confirm settings
                             AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR,
                                     TEST_CONF, TEST_FORMAT, minBufferSize, TEST_MODE);
-                            assertTrue(TEST_NAME,
-                                    track.getState() == AudioTrack.STATE_INITIALIZED);
-                            boolean hasPlayed = false;
-                            int written = 0;
+                            assertEquals(TEST_NAME + ": state",
+                                    AudioTrack.STATE_INITIALIZED, track.getState());
+                            assertEquals(TEST_NAME + ": sample rate",
+                                    TEST_SR, track.getSampleRate());
+                            assertEquals(TEST_NAME + ": channel mask",
+                                    TEST_CONF, track.getChannelConfiguration());
+                            assertEquals(TEST_NAME + ": encoding",
+                                    TEST_FORMAT, track.getAudioFormat());
+
                             ByteBuffer bb = (useDirect == 1)
                                     ? ByteBuffer.allocateDirect(bufferSize)
                                             : ByteBuffer.allocate(bufferSize);
@@ -1620,30 +1707,32 @@
                             // -------- test --------------
                             switch (TEST_FORMAT) {
                                 case AudioFormat.ENCODING_PCM_8BIT: {
-                                    byte data[] = createSoundDataInByteArray(
+                                    byte data[] = AudioHelper.createSoundDataInByteArray(
                                             bufferSamples, TEST_SR,
-                                            frequency);
+                                            frequency, TEST_SWEEP);
                                     bb.put(data);
                                     bb.flip();
                                 } break;
                                 case AudioFormat.ENCODING_PCM_16BIT: {
-                                    short data[] = createSoundDataInShortArray(
+                                    short data[] = AudioHelper.createSoundDataInShortArray(
                                             bufferSamples, TEST_SR,
-                                            frequency);
+                                            frequency, TEST_SWEEP);
                                     ShortBuffer sb = bb.asShortBuffer();
                                     sb.put(data);
                                     bb.limit(sb.limit() * 2);
                                 } break;
                                 case AudioFormat.ENCODING_PCM_FLOAT: {
-                                    float data[] = createSoundDataInFloatArray(
+                                    float data[] = AudioHelper.createSoundDataInFloatArray(
                                             bufferSamples, TEST_SR,
-                                            frequency);
+                                            frequency, TEST_SWEEP);
                                     FloatBuffer fb = bb.asFloatBuffer();
                                     fb.put(data);
                                     bb.limit(fb.limit() * 4);
                                 } break;
                             }
 
+                            boolean hasPlayed = false;
+                            int written = 0;
                             while (written < bufferSize) {
                                 int ret = track.write(bb,
                                         Math.min(bufferSize - written, minBufferSize),
@@ -1656,7 +1745,6 @@
                                 }
                             }
 
-                            Thread.sleep(WAIT_MSEC);
                             track.stop();
                             Thread.sleep(WAIT_MSEC);
                             // -------- tear down --------------
@@ -1669,6 +1757,137 @@
         }
     }
 
+    public void testPlayChannelIndexStreamBuffer() throws Exception {
+        // should hear 4 tones played 3 or 4 times depending
+        // on the device output capabilities (e.g. stereo or 5.1 or otherwise)
+        final String TEST_NAME = "testPlayChannelIndexStreamBuffer";
+        final int TEST_FORMAT_ARRAY[] = {
+                AudioFormat.ENCODING_PCM_8BIT,
+                //AudioFormat.ENCODING_PCM_16BIT,
+                //AudioFormat.ENCODING_PCM_FLOAT,
+        };
+        final int TEST_SR_ARRAY[] = {
+                48000,
+        };
+        // The following channel index masks are iterated over and route
+        // the AudioTrack channels to the output sink channels based on
+        // the set bits in counting order (lsb to msb).
+        //
+        // For a stereo output sink, the sound may come from L and R, L only, none, or R only.
+        // For a 5.1 output sink, the sound may come from a variety of outputs
+        // as commented below.
+        final int TEST_CONF_ARRAY[] = { // matches output sink channels:
+                (1 << 0) | (1 << 1), // Stereo(L, R) 5.1(FL, FR)
+                (1 << 0) | (1 << 2), // Stereo(L)    5.1(FL, FC)
+                (1 << 4) | (1 << 5), // Stereo(None) 5.1(BL, BR)
+                (1 << 1) | (1 << 2), // Stereo(R)    5.1(FR, FC)
+        };
+        final int TEST_WRITE_MODE_ARRAY[] = {
+                AudioTrack.WRITE_BLOCKING,
+                AudioTrack.WRITE_NON_BLOCKING,
+        };
+        final float TEST_SWEEP = 0;
+
+        for (int TEST_FORMAT : TEST_FORMAT_ARRAY) {
+            for (int TEST_CONF : TEST_CONF_ARRAY) {
+                double frequency = 800; // frequency changes for each test
+                for (int TEST_SR : TEST_SR_ARRAY) {
+                    for (int TEST_WRITE_MODE : TEST_WRITE_MODE_ARRAY) {
+                        for (int useDirect = 0; useDirect < 2; ++useDirect) {
+                            AudioFormat format = new AudioFormat.Builder()
+                                    .setEncoding(TEST_FORMAT)
+                                    .setSampleRate(TEST_SR)
+                                    .setChannelIndexMask(TEST_CONF)
+                                    .build();
+                            AudioTrack track = new AudioTrack.Builder()
+                                    .setAudioFormat(format)
+                                    .build();
+                            assertEquals(TEST_NAME,
+                                    AudioTrack.STATE_INITIALIZED, track.getState());
+
+                            // create the byte buffer and fill with test data
+                            final int frameSize = AudioHelper.frameSizeFromFormat(format);
+                            final int frameCount =
+                                    AudioHelper.frameCountFromMsec(300 /* ms */, format);
+                            final int bufferSize = frameCount * frameSize;
+                            final int bufferSamples = frameCount * format.getChannelCount();
+                            ByteBuffer bb = (useDirect == 1)
+                                    ? ByteBuffer.allocateDirect(bufferSize)
+                                            : ByteBuffer.allocate(bufferSize);
+                            bb.order(java.nio.ByteOrder.nativeOrder());
+
+                            switch (TEST_FORMAT) {
+                            case AudioFormat.ENCODING_PCM_8BIT: {
+                                byte data[] = AudioHelper.createSoundDataInByteArray(
+                                        bufferSamples, TEST_SR,
+                                        frequency, TEST_SWEEP);
+                                bb.put(data);
+                                bb.flip();
+                            } break;
+                            case AudioFormat.ENCODING_PCM_16BIT: {
+                                short data[] = AudioHelper.createSoundDataInShortArray(
+                                        bufferSamples, TEST_SR,
+                                        frequency, TEST_SWEEP);
+                                ShortBuffer sb = bb.asShortBuffer();
+                                sb.put(data);
+                                bb.limit(sb.limit() * 2);
+                            } break;
+                            case AudioFormat.ENCODING_PCM_FLOAT: {
+                                float data[] = AudioHelper.createSoundDataInFloatArray(
+                                        bufferSamples, TEST_SR,
+                                        frequency, TEST_SWEEP);
+                                FloatBuffer fb = bb.asFloatBuffer();
+                                fb.put(data);
+                                bb.limit(fb.limit() * 4);
+                            } break;
+                            }
+
+                            // start the AudioTrack
+                            // This can be done before or after the first write.
+                            // Current behavior for streaming tracks is that
+                            // actual playback does not begin before the internal
+                            // data buffer is completely full.
+                            track.play();
+
+                            // write data
+                            final long startTime = System.currentTimeMillis();
+                            final long maxDuration = frameCount * 1000 / TEST_SR + 1000;
+                            for (int written = 0; written < bufferSize; ) {
+                                // ret may return a short count if write
+                                // is non blocking or even if write is blocking
+                                // when a stop/pause/flush is issued from another thread.
+                                final int kBatchFrames = 1000;
+                                int ret = track.write(bb,
+                                        Math.min(bufferSize - written, frameSize * kBatchFrames),
+                                        TEST_WRITE_MODE);
+                                // for non-blocking mode, this loop may spin quickly
+                                assertTrue(TEST_NAME + ": write error " + ret, ret >= 0);
+                                assertTrue(TEST_NAME + ": write timeout",
+                                        (System.currentTimeMillis() - startTime) <= maxDuration);
+                                written += ret;
+                            }
+
+                            // for streaming tracks, stop will allow the rest of the data to
+                            // drain out, but we don't know how long to wait unless
+                            // we check the position before stop. if we check position
+                            // after we stop, we read 0.
+                            final int position = track.getPlaybackHeadPosition();
+                            final int remainingTimeMs = (int)((double)(frameCount - position)
+                                    * 1000 / TEST_SR);
+                            track.stop();
+                            Thread.sleep(remainingTimeMs);
+                            // tear down
+                            track.release();
+                            // add a gap to make tones distinct
+                            Thread.sleep(100 /* millis */);
+                            frequency += 200; // increment test tone frequency
+                        }
+                    }
+                }
+            }
+        }
+    }
+
     private boolean hasAudioOutput() {
         return getContext().getPackageManager()
             .hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT);
@@ -1676,9 +1895,10 @@
 
     public void testGetTimestamp() throws Exception {
         if (!hasAudioOutput()) {
+            Log.w(TAG,"AUDIO_OUTPUT feature not found. This system might not have a valid "
+                    + "audio output HAL");
             return;
         }
-        
         // constants for test
         final String TEST_NAME = "testGetTimestamp";
         final int TEST_SR = 22050;
@@ -1805,6 +2025,228 @@
         }
     }
 
+    public void testVariableRatePlayback() throws Exception {
+        final String TEST_NAME = "testVariableRatePlayback";
+        final int TEST_SR = 24000;
+        final int TEST_FINAL_SR = 96000;
+        final int TEST_CONF = AudioFormat.CHANNEL_OUT_MONO;
+        final int TEST_FORMAT = AudioFormat.ENCODING_PCM_8BIT; // required for test
+        final int TEST_MODE = AudioTrack.MODE_STATIC; // required for test
+        final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC;
+
+        final int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
+        final int bufferSizeInBytes = minBuffSize * 100;
+        final int numChannels =  AudioFormat.channelCountFromOutChannelMask(TEST_CONF);
+        final int bytesPerSample = AudioFormat.getBytesPerSample(TEST_FORMAT);
+        final int bytesPerFrame = numChannels * bytesPerSample;
+        final int frameCount = bufferSizeInBytes / bytesPerFrame;
+
+        AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF,
+                TEST_FORMAT, bufferSizeInBytes, TEST_MODE);
+
+        // create byte array and write it
+        byte[] vai = AudioHelper.createSoundDataInByteArray(bufferSizeInBytes, TEST_SR,
+                600 /* frequency */, 0 /* sweep */);
+        assertEquals(vai.length, track.write(vai, 0 /* offsetInBytes */, vai.length));
+
+        // sweep up test and sweep down test
+        int[] sampleRates = {TEST_SR, TEST_FINAL_SR};
+        int[] deltaMss = {10, 10};
+        int[] deltaFreqs = {200, -200};
+
+        for (int i = 0; i < 2; ++i) {
+            int remainingTime;
+            int sampleRate = sampleRates[i];
+            final int deltaMs = deltaMss[i];
+            final int deltaFreq = deltaFreqs[i];
+            final int lastCheckMs = 500; // check the last 500 ms
+
+            assertEquals(TEST_NAME, AudioTrack.SUCCESS, track.setPlaybackRate(sampleRate));
+            track.play();
+            do {
+                Thread.sleep(deltaMs);
+                final int position = track.getPlaybackHeadPosition();
+                sampleRate += deltaFreq;
+                sampleRate = Math.min(TEST_FINAL_SR, Math.max(TEST_SR, sampleRate));
+                assertEquals(TEST_NAME, AudioTrack.SUCCESS, track.setPlaybackRate(sampleRate));
+                remainingTime = (int)((double)(frameCount - position) * 1000
+                        / sampleRate / bytesPerFrame);
+            } while (remainingTime >= lastCheckMs + deltaMs);
+
+            // ensure the final frequency set is constant and plays frames as expected
+            final int position1 = track.getPlaybackHeadPosition();
+            Thread.sleep(lastCheckMs);
+            final int position2 = track.getPlaybackHeadPosition();
+
+            final int tolerance60MsInFrames = sampleRate * 60 / 1000;
+            final int expected = lastCheckMs * sampleRate / 1000;
+            final int actual = position2 - position1;
+
+            // Log.d(TAG, "Variable Playback: expected(" + expected + ")  actual(" + actual
+            //        + ")  diff(" + (expected - actual) + ")");
+            assertEquals(expected, actual, tolerance60MsInFrames);
+            track.stop();
+        }
+        track.release();
+    }
+
+    public void testVariableSpeedPlayback() throws Exception {
+        final String TEST_NAME = "testVariableSpeedPlayback";
+        final int TEST_FORMAT = AudioFormat.ENCODING_PCM_FLOAT; // required for test
+        final int TEST_MODE = AudioTrack.MODE_STATIC;           // required for test
+        final int TEST_SR = 48000;
+
+        AudioFormat format = new AudioFormat.Builder()
+                //.setChannelIndexMask((1 << 0))  // output to first channel, FL
+                .setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
+                .setEncoding(TEST_FORMAT)
+                .setSampleRate(TEST_SR)
+                .build();
+
+        // create track
+        final int frameCount = AudioHelper.frameCountFromMsec(100 /*ms*/, format);
+        final int frameSize = AudioHelper.frameSizeFromFormat(format);
+        AudioTrack track = new AudioTrack.Builder()
+                .setAudioFormat(format)
+                .setBufferSizeInBytes(frameCount * frameSize)
+                .setTransferMode(TEST_MODE)
+                .build();
+
+        // create float array and write it
+        final int sampleCount = frameCount * format.getChannelCount();
+        float[] vaf = AudioHelper.createSoundDataInFloatArray(
+                sampleCount, TEST_SR, 600 /* frequency */, 0 /* sweep */);
+        assertEquals(vaf.length, track.write(vaf, 0 /* offsetInFloats */, vaf.length,
+                AudioTrack.WRITE_NON_BLOCKING));
+
+        // sweep speed and pitch
+        final float[][][] speedAndPitch = {
+             // { {speedStart, pitchStart} {speedEnd, pitchEnd} }
+                { {0.5f, 0.5f}, {2.0f, 2.0f} },  // speed by SR conversion (chirp)
+                { {0.5f, 1.0f}, {2.0f, 1.0f} },  // speed by time stretch (constant pitch)
+                { {1.0f, 0.5f}, {1.0f, 2.0f} },  // pitch by SR conversion (chirp)
+        };
+
+        // sanity test that playback params works as expected
+        PlaybackParams params = new PlaybackParams().allowDefaults();
+        assertEquals(TEST_NAME, 1.0f, params.getSpeed());
+        assertEquals(TEST_NAME, 1.0f, params.getPitch());
+        assertEquals(TEST_NAME,
+                params.AUDIO_FALLBACK_MODE_DEFAULT,
+                params.getAudioFallbackMode());
+        track.setPlaybackParams(params); // OK
+        params.setAudioFallbackMode(params.AUDIO_FALLBACK_MODE_FAIL);
+        assertEquals(TEST_NAME,
+                params.AUDIO_FALLBACK_MODE_FAIL, params.getAudioFallbackMode());
+        params.setPitch(0.0f);
+        try {
+            track.setPlaybackParams(params);
+            fail("IllegalArgumentException should be thrown on out of range data");
+        } catch (IllegalArgumentException e) {
+            ; // expect this is invalid
+        }
+        // on failure, the AudioTrack params should not change.
+        PlaybackParams paramCheck = track.getPlaybackParams();
+        assertEquals(TEST_NAME,
+                paramCheck.AUDIO_FALLBACK_MODE_DEFAULT, paramCheck.getAudioFallbackMode());
+        assertEquals(TEST_NAME,
+                1.0f, paramCheck.getPitch());
+
+        // now try to see if we can do extreme pitch correction that should probably be muted.
+        params.setAudioFallbackMode(params.AUDIO_FALLBACK_MODE_MUTE);
+        assertEquals(TEST_NAME,
+                params.AUDIO_FALLBACK_MODE_MUTE, params.getAudioFallbackMode());
+        params.setPitch(0.1f);
+        track.setPlaybackParams(params); // OK
+
+        // now do our actual playback
+        final int TEST_TIME_MS = 2000;
+        final int TEST_DELTA_MS = 100;
+        final int testSteps = TEST_TIME_MS / TEST_DELTA_MS;
+
+        for (int i = 0; i < speedAndPitch.length; ++i) {
+            final float speedStart = speedAndPitch[i][0][0];
+            final float pitchStart = speedAndPitch[i][0][1];
+            final float speedEnd = speedAndPitch[i][1][0];
+            final float pitchEnd = speedAndPitch[i][1][1];
+            final float speedInc = (speedEnd - speedStart) / testSteps;
+            final float pitchInc = (pitchEnd - pitchStart) / testSteps;
+
+            PlaybackParams playbackParams = new PlaybackParams()
+                    .setPitch(pitchStart)
+                    .setSpeed(speedStart)
+                    .allowDefaults();
+
+            // set track in infinite loop to be a sine generator
+            track.setLoopPoints(0, frameCount, -1 /* loopCount */); // cleared by stop()
+            track.play();
+
+            Thread.sleep(300 /* millis */); // warm up track
+
+            int anticipatedPosition = track.getPlaybackHeadPosition();
+            for (int j = 0; j < testSteps; ++j) {
+                // set playback settings
+                final float pitch = playbackParams.getPitch();
+                final float speed = playbackParams.getSpeed();
+
+                track.setPlaybackParams(playbackParams);
+
+                // verify that settings have changed
+                PlaybackParams checkParams = track.getPlaybackParams();
+                assertEquals(TAG, pitch, checkParams.getPitch());
+                assertEquals(TAG, speed, checkParams.getSpeed());
+
+                // sleep for playback
+                Thread.sleep(TEST_DELTA_MS);
+                // Log.d(TAG, "position[" + j + "] " + track.getPlaybackHeadPosition());
+                anticipatedPosition +=
+                        playbackParams.getSpeed() * TEST_DELTA_MS * TEST_SR / 1000;
+                playbackParams.setPitch(playbackParams.getPitch() + pitchInc);
+                playbackParams.setSpeed(playbackParams.getSpeed() + speedInc);
+            }
+            final int endPosition = track.getPlaybackHeadPosition();
+            final int tolerance100MsInFrames = 100 * TEST_SR / 1000;
+            assertEquals(TAG, anticipatedPosition, endPosition, tolerance100MsInFrames);
+            track.stop();
+
+            Thread.sleep(100 /* millis */); // distinct pause between each test
+        }
+        track.release();
+    }
+
+    // Test AudioTrack to ensure we can build after a failure.
+    public void testAudioTrackBufferSize() throws Exception {
+        // constants for test
+        final String TEST_NAME = "testAudioTrackBufferSize";
+
+        // use builder with parameters that should fail
+        final int superBigBufferSize = 1 << 28;
+        try {
+            final AudioTrack track = new AudioTrack.Builder()
+                .setBufferSizeInBytes(superBigBufferSize)
+                .build();
+            track.release();
+            fail(TEST_NAME + ": should throw exception on failure");
+        } catch (UnsupportedOperationException e) {
+            ;
+        }
+
+        // we should be able to create again with minimum buffer size
+        final int verySmallBufferSize = 2 * 3 * 4; // frame size multiples
+        final AudioTrack track2 = new AudioTrack.Builder()
+                .setBufferSizeInBytes(verySmallBufferSize)
+                .build();
+
+        final int observedState2 = track2.getState();
+        final int observedBufferSize2 = track2.getBufferSizeInFrames();
+        track2.release();
+
+        // succeeds for minimum buffer size
+        assertEquals(TEST_NAME + ": state", AudioTrack.STATE_INITIALIZED, observedState2);
+        // should force the minimum size buffer which is > 0
+        assertTrue(TEST_NAME + ": buffer frame count", observedBufferSize2 > 0);
+    }
+
 /* Do not run in JB-MR1. will be re-opened in the next platform release.
     public void testResourceLeakage() throws Exception {
         final int BUFFER_SIZE = 600 * 1024;
@@ -1828,6 +2270,7 @@
     }
 */
 
+    /* MockAudioTrack allows testing of protected getNativeFrameCount() and setState(). */
     private class MockAudioTrack extends AudioTrack {
 
         public MockAudioTrack(int streamType, int sampleRateInHz, int channelConfig,
diff --git a/tests/tests/media/src/android/media/cts/AudioTrack_ListenerTest.java b/tests/tests/media/src/android/media/cts/AudioTrack_ListenerTest.java
index eb675fc..e059e36 100644
--- a/tests/tests/media/src/android/media/cts/AudioTrack_ListenerTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioTrack_ListenerTest.java
@@ -16,25 +16,35 @@
 
 package android.media.cts;
 
+import java.util.ArrayList;
 
+import android.cts.util.CtsAndroidTestCase;
 import android.media.AudioFormat;
 import android.media.AudioManager;
 import android.media.AudioTrack;
 import android.media.AudioTrack.OnPlaybackPositionUpdateListener;
+import android.media.cts.AudioHelper;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
-import android.test.AndroidTestCase;
+import android.util.Log;
+import com.android.cts.util.ReportLog;
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
 
-public class AudioTrack_ListenerTest extends AndroidTestCase {
-    private boolean mOnMarkerReachedCalled;
-    private boolean mOnPeriodicNotificationCalled;
+public class AudioTrack_ListenerTest extends CtsAndroidTestCase {
+    private final static String TAG = "AudioTrack_ListenerTest";
+    private final static int TEST_SR = 11025;
+    private final static int TEST_CONF = AudioFormat.CHANNEL_OUT_MONO;
+    private final static int TEST_FORMAT = AudioFormat.ENCODING_PCM_8BIT;
+    private final static int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC;
+    private final static int TEST_LOOP_FACTOR = 2; // # loops (>= 1) for static tracks
+                                                   // simulated for streaming.
+    private final static int TEST_BUFFER_FACTOR = 25;
     private boolean mIsHandleMessageCalled;
-    private final int TEST_SR = 11025;
-    private final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_MONO;
-    private final int TEST_FORMAT = AudioFormat.ENCODING_PCM_8BIT;
-    private final int TEST_MODE = AudioTrack.MODE_STREAM;
-    private final int TEST_STREAM_TYPE1 = AudioManager.STREAM_MUSIC;
+    private int mMarkerPeriodInFrames;
+    private int mMarkerPosition;
+    private int mFrameCount;
     private Handler mHandler = new Handler(Looper.getMainLooper()) {
         @Override
         public void handleMessage(Message msg) {
@@ -42,180 +52,232 @@
             super.handleMessage(msg);
         }
     };
-    private final int mMinBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
-    private AudioTrack mAudioTrack;
-    private OnPlaybackPositionUpdateListener mListener =
-                                new MockOnPlaybackPositionUpdateListener();
-    private MakeSomethingAsynchronouslyAndLoop<AudioTrack> mMakeSomething;
-
-    @Override
-    protected void setUp() throws Exception
-    {
-        super.setUp();
-        if (mAudioTrack == null) {
-            mMakeSomething = new MakeSomethingAsynchronouslyAndLoop<AudioTrack>(
-                new MakesSomething<AudioTrack>() {
-                    @Override
-                    public AudioTrack makeSomething()
-                    {
-                        return new AudioTrack(TEST_STREAM_TYPE1, TEST_SR, TEST_CONF,
-                            TEST_FORMAT, 2 * mMinBuffSize, TEST_MODE);
-                    }
-                }
-            );
-            mAudioTrack = mMakeSomething.make();
-        }
-    }
 
     public void testAudioTrackCallback() throws Exception {
-        mAudioTrack.setPlaybackPositionUpdateListener(mListener);
-        doTest(false /*customHandler*/);
+        doTest("Streaming Local Looper", true /*localTrack*/, false /*customHandler*/,
+                30 /*periodsPerSecond*/, 2 /*markerPeriodsPerSecond*/, AudioTrack.MODE_STREAM);
     }
 
     public void testAudioTrackCallbackWithHandler() throws Exception {
-        mAudioTrack.setPlaybackPositionUpdateListener(mListener, mHandler);
-        doTest(true /*customHandler*/);
-        // ToBeFixed: Handler#handleMessage() is never called
-        // FIXME possibly because the new Handler() is missing the Looper parameter
+        // with 100 periods per second, trigger back-to-back notifications.
+        doTest("Streaming Private Handler", false /*localTrack*/, true /*customHandler*/,
+                100 /*periodsPerSecond*/, 10 /*markerPeriodsPerSecond*/, AudioTrack.MODE_STREAM);
+        // verify mHandler is used only for accessing its associated Looper
         assertFalse(mIsHandleMessageCalled);
     }
 
-    private void doTest(boolean customHandler) throws Exception {
-        mOnMarkerReachedCalled = false;
-        mOnPeriodicNotificationCalled = false;
-        byte[] vai = AudioTrackTest.createSoundDataInByteArray(2 * mMinBuffSize, TEST_SR, 1024);
-        int markerInFrames = vai.length / 4;
-        assertEquals(AudioTrack.SUCCESS, mAudioTrack.setNotificationMarkerPosition(markerInFrames));
-        int periodInFrames = vai.length / 2;
-        assertEquals(AudioTrack.SUCCESS, mAudioTrack.setPositionNotificationPeriod(periodInFrames));
-
-        boolean hasPlayed = false;
-        int written = 0;
-        while (written < vai.length) {
-            written += mAudioTrack.write(vai, written, vai.length - written);
-            if (!hasPlayed) {
-                mAudioTrack.play();
-                hasPlayed = true;
-            }
-        }
-
-        final int numChannels = (TEST_CONF == AudioFormat.CHANNEL_CONFIGURATION_STEREO) ? 2 : 1;
-        final int bytesPerSample = (TEST_FORMAT == AudioFormat.ENCODING_PCM_16BIT) ? 2 : 1;
-        final int bytesPerFrame = numChannels * bytesPerSample;
-        final int sampleLengthMs = (int)(1000 * ((float)vai.length / TEST_SR / bytesPerFrame));
-        Thread.sleep(sampleLengthMs + 1000);
-        if (!customHandler) {
-            assertTrue(mOnMarkerReachedCalled);
-            assertTrue(mOnPeriodicNotificationCalled);
-        }
-        mAudioTrack.stop();
+    public void testStaticAudioTrackCallback() throws Exception {
+        doTest("Static", false /*localTrack*/, false /*customHandler*/,
+                100 /*periodsPerSecond*/, 10 /*markerPeriodsPerSecond*/, AudioTrack.MODE_STATIC);
     }
 
-    // lightweight java.util.concurrent.Future*
-    private static class FutureLatch<T>
-    {
-        private T mValue;
-        private boolean mSet;
-        public void set(T value)
-        {
-            synchronized (this) {
-                assert !mSet;
-                mValue = value;
-                mSet = true;
-                notify();
-            }
+    public void testStaticAudioTrackCallbackWithHandler() throws Exception {
+        doTest("Static Private Handler", false /*localTrack*/, true /*customHandler*/,
+                30 /*periodsPerSecond*/, 2 /*markerPeriodsPerSecond*/, AudioTrack.MODE_STATIC);
+        // verify mHandler is used only for accessing its associated Looper
+        assertFalse(mIsHandleMessageCalled);
+    }
+
+    private void doTest(String reportName, boolean localTrack, boolean customHandler,
+            int periodsPerSecond, int markerPeriodsPerSecond, final int mode) throws Exception {
+        mIsHandleMessageCalled = false;
+        final int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
+        final int bufferSizeInBytes;
+        if (mode == AudioTrack.MODE_STATIC && TEST_LOOP_FACTOR > 1) {
+            // use setLoopPoints for static mode
+            bufferSizeInBytes = minBuffSize * TEST_BUFFER_FACTOR;
+            mFrameCount = bufferSizeInBytes * TEST_LOOP_FACTOR;
+        } else {
+            bufferSizeInBytes = minBuffSize * TEST_BUFFER_FACTOR * TEST_LOOP_FACTOR;
+            mFrameCount = bufferSizeInBytes;
         }
-        public T get()
-        {
-            T value;
-            synchronized (this) {
-                while (!mSet) {
-                    try {
-                        wait();
-                    } catch (InterruptedException e) {
-                        ;
+
+        final AudioTrack track;
+        final AudioHelper.MakeSomethingAsynchronouslyAndLoop<AudioTrack> makeSomething;
+        if (localTrack) {
+            makeSomething = null;
+            track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF,
+                    TEST_FORMAT, bufferSizeInBytes, mode);
+        } else {
+            makeSomething =
+                    new AudioHelper.MakeSomethingAsynchronouslyAndLoop<AudioTrack>(
+                    new AudioHelper.MakesSomething<AudioTrack>() {
+                        @Override
+                        public AudioTrack makeSomething() {
+                            return new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF,
+                                TEST_FORMAT, bufferSizeInBytes, mode);
+                        }
                     }
-                }
-                value = mValue;
-            }
-            return value;
+                );
+           // create audiotrack on different thread's looper.
+           track = makeSomething.make();
         }
-    }
-
-    // represents a factory for T
-    private interface MakesSomething<T>
-    {
-        T makeSomething();
-    }
-
-    // used to construct an object in the context of an asynchronous thread with looper
-    private static class MakeSomethingAsynchronouslyAndLoop<T>
-    {
-        private Thread mThread;
-        volatile private Looper mLooper;
-        private final MakesSomething<T> mWhatToMake;
-
-        public MakeSomethingAsynchronouslyAndLoop(MakesSomething<T> whatToMake)
-        {
-            assert whatToMake != null;
-            mWhatToMake = whatToMake;
+        final MockOnPlaybackPositionUpdateListener listener;
+        if (customHandler) {
+            listener = new MockOnPlaybackPositionUpdateListener(track, mHandler);
+        } else {
+            listener = new MockOnPlaybackPositionUpdateListener(track);
         }
 
-        public T make()
-        {
-            final FutureLatch<T> futureLatch = new FutureLatch<T>();
-            mThread = new Thread()
-            {
-                @Override
-                public void run()
-                {
-                    Looper.prepare();
-                    mLooper = Looper.myLooper();
-                    T something = mWhatToMake.makeSomething();
-                    futureLatch.set(something);
-                    Looper.loop();
-                }
-            };
-            mThread.start();
-            return futureLatch.get();
+        byte[] vai = AudioHelper.createSoundDataInByteArray(
+                bufferSizeInBytes, TEST_SR, 1024 /* frequency */, 0 /* sweep */);
+        int markerPeriods = Math.max(3, mFrameCount * markerPeriodsPerSecond / TEST_SR);
+        mMarkerPeriodInFrames = mFrameCount / markerPeriods;
+        markerPeriods = mFrameCount / mMarkerPeriodInFrames; // recalculate due to round-down
+        mMarkerPosition = mMarkerPeriodInFrames;
+
+        // check that we can get and set notification marker position
+        assertEquals(0, track.getNotificationMarkerPosition());
+        assertEquals(AudioTrack.SUCCESS,
+                track.setNotificationMarkerPosition(mMarkerPosition));
+        assertEquals(mMarkerPosition, track.getNotificationMarkerPosition());
+
+        int updatePeriods = Math.max(3, mFrameCount * periodsPerSecond / TEST_SR);
+        final int updatePeriodInFrames = mFrameCount / updatePeriods;
+        updatePeriods = mFrameCount / updatePeriodInFrames; // recalculate due to round-down
+
+        // we set the notification period before running for better period positional accuracy.
+        // check that we can get and set notification periods
+        assertEquals(0, track.getPositionNotificationPeriod());
+        assertEquals(AudioTrack.SUCCESS,
+                track.setPositionNotificationPeriod(updatePeriodInFrames));
+        assertEquals(updatePeriodInFrames, track.getPositionNotificationPeriod());
+
+        if (mode == AudioTrack.MODE_STATIC && TEST_LOOP_FACTOR > 1) {
+            track.setLoopPoints(0, vai.length, TEST_LOOP_FACTOR - 1);
         }
-        public void join()
-        {
-            mLooper.quit();
-            try {
-                mThread.join();
-            } catch (InterruptedException e) {
-                ;
-            }
-            // avoid dangling references
-            mLooper = null;
-            mThread = null;
+        // write data with single blocking write, then play.
+        assertEquals(vai.length, track.write(vai, 0 /* offsetInBytes */, vai.length));
+        track.play();
+
+        // sleep until track completes playback - it must complete within 1 second
+        // of the expected length otherwise the periodic test should fail.
+        final int numChannels =  AudioFormat.channelCountFromOutChannelMask(TEST_CONF);
+        final int bytesPerSample = AudioFormat.getBytesPerSample(TEST_FORMAT);
+        final int bytesPerFrame = numChannels * bytesPerSample;
+        final int trackLengthMs = (int)((double)mFrameCount * 1000 / TEST_SR / bytesPerFrame);
+        Thread.sleep(trackLengthMs + 1000);
+
+        // stop listening - we should be done.
+        listener.stop();
+
+        // Beware: stop() resets the playback head position for both static and streaming
+        // audio tracks, so stop() cannot be called while we're still logging playback
+        // head positions. We could recycle the track after stop(), which isn't done here.
+        track.stop();
+
+        // clean up
+        if (makeSomething != null) {
+            makeSomething.join();
         }
+        listener.release();
+        track.release();
+
+        // collect statistics
+        final ArrayList<Integer> markerList = listener.getMarkerList();
+        final ArrayList<Integer> periodicList = listener.getPeriodicList();
+        // verify count of markers and periodic notifications.
+        assertEquals(markerPeriods, markerList.size());
+        assertEquals(updatePeriods, periodicList.size());
+        // verify actual playback head positions returned.
+        // the max diff should really be around 24 ms,
+        // but system load and stability will affect this test;
+        // we use 80ms limit here for failure.
+        final int tolerance80MsInFrames = TEST_SR * 80 / 1000;
+
+        AudioHelper.Statistics markerStat = new AudioHelper.Statistics();
+        for (int i = 0; i < markerPeriods; ++i) {
+            final int expected = mMarkerPeriodInFrames * (i + 1);
+            final int actual = markerList.get(i);
+            // Log.d(TAG, "Marker: expected(" + expected + ")  actual(" + actual
+            //        + ")  diff(" + (actual - expected) + ")");
+            assertEquals(expected, actual, tolerance80MsInFrames);
+            markerStat.add((double)(actual - expected) * 1000 / TEST_SR);
+        }
+
+        AudioHelper.Statistics periodicStat = new AudioHelper.Statistics();
+        for (int i = 0; i < updatePeriods; ++i) {
+            final int expected = updatePeriodInFrames * (i + 1);
+            final int actual = periodicList.get(i);
+            // Log.d(TAG, "Update: expected(" + expected + ")  actual(" + actual
+            //        + ")  diff(" + (actual - expected) + ")");
+            assertEquals(expected, actual, tolerance80MsInFrames);
+            periodicStat.add((double)(actual - expected) * 1000 / TEST_SR);
+        }
+
+        // report this
+        ReportLog log = getReportLog();
+        log.printValue(reportName + ": Average Marker diff", markerStat.getAvg(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Maximum Marker abs diff", markerStat.getMaxAbs(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Average Marker abs diff", markerStat.getAvgAbs(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Average Periodic diff", periodicStat.getAvg(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Maximum Periodic abs diff", periodicStat.getMaxAbs(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue(reportName + ": Average Periodic abs diff", periodicStat.getAvgAbs(),
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printSummary(reportName + ": Unified abs diff",
+                (periodicStat.getAvgAbs() + markerStat.getAvgAbs()) / 2,
+                ResultType.LOWER_BETTER, ResultUnit.MS);
     }
 
     private class MockOnPlaybackPositionUpdateListener
                                         implements OnPlaybackPositionUpdateListener {
-
-        public void onMarkerReached(AudioTrack track) {
-            mOnMarkerReachedCalled = true;
+        public MockOnPlaybackPositionUpdateListener(AudioTrack track) {
+            mAudioTrack = track;
+            track.setPlaybackPositionUpdateListener(this);
         }
 
-        public void onPeriodicNotification(AudioTrack track) {
-            mOnPeriodicNotificationCalled = true;
+        public MockOnPlaybackPositionUpdateListener(AudioTrack track, Handler handler) {
+            mAudioTrack = track;
+            track.setPlaybackPositionUpdateListener(this, handler);
         }
 
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        if (mMakeSomething != null) {
-            mMakeSomething.join();
+        public synchronized void onMarkerReached(AudioTrack track) {
+            if (mIsTestActive) {
+                int position = mAudioTrack.getPlaybackHeadPosition();
+                mOnMarkerReachedCalled.add(position);
+                mMarkerPosition += mMarkerPeriodInFrames;
+                if (mMarkerPosition <= mFrameCount) {
+                    assertEquals(AudioTrack.SUCCESS,
+                            mAudioTrack.setNotificationMarkerPosition(mMarkerPosition));
+                }
+            } else {
+                fail("onMarkerReached called when not active");
+            }
         }
-        if (mAudioTrack != null) {
-            mAudioTrack.release();
+
+        public synchronized void onPeriodicNotification(AudioTrack track) {
+            if (mIsTestActive) {
+                mOnPeriodicNotificationCalled.add(mAudioTrack.getPlaybackHeadPosition());
+            } else {
+                fail("onPeriodicNotification called when not active");
+            }
+        }
+
+        public synchronized void stop() {
+            mIsTestActive = false;
+        }
+
+        public ArrayList<Integer> getMarkerList() {
+            return mOnMarkerReachedCalled;
+        }
+
+        public ArrayList<Integer> getPeriodicList() {
+            return mOnPeriodicNotificationCalled;
+        }
+
+        public synchronized void release() {
+            mAudioTrack.setPlaybackPositionUpdateListener(null);
             mAudioTrack = null;
         }
-        super.tearDown();
-    }
 
+        private boolean mIsTestActive = true;
+        private AudioTrack mAudioTrack;
+        private ArrayList<Integer> mOnMarkerReachedCalled = new ArrayList<Integer>();
+        private ArrayList<Integer> mOnPeriodicNotificationCalled = new ArrayList<Integer>();
+    }
 }
diff --git a/tests/tests/media/src/android/media/cts/ClearKeySystemTest.java b/tests/tests/media/src/android/media/cts/ClearKeySystemTest.java
index c837d0a..02276bc 100644
--- a/tests/tests/media/src/android/media/cts/ClearKeySystemTest.java
+++ b/tests/tests/media/src/android/media/cts/ClearKeySystemTest.java
@@ -320,9 +320,6 @@
      * Tests clear key system playback.
      */
     public void testClearKeyPlayback() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
 
         MediaDrm drm = startDrm();
         if (null == drm) {
diff --git a/tests/tests/media/src/android/media/cts/CodecState.java b/tests/tests/media/src/android/media/cts/CodecState.java
index db10cd1..6fdbd86 100644
--- a/tests/tests/media/src/android/media/cts/CodecState.java
+++ b/tests/tests/media/src/android/media/cts/CodecState.java
@@ -255,9 +255,6 @@
             Log.d(TAG, "saw input EOS on track " + mTrackIndex);
 
             mSawInputEOS = true;
-            if (mTunneled && !mIsAudio) {
-                mSawOutputEOS = true;
-            }
 
             mCodec.queueInputBuffer(
                     index, 0 /* offset */, 0 /* sampleSize */,
@@ -333,6 +330,7 @@
             buffer.clear();
             ByteBuffer audioBuffer = ByteBuffer.allocate(buffer.remaining());
             audioBuffer.put(buffer);
+            audioBuffer.clear();
 
             mAudioTrack.write(audioBuffer, info.size, info.presentationTimeUs*1000);
 
diff --git a/tests/tests/media/src/android/media/cts/DecoderTest.java b/tests/tests/media/src/android/media/cts/DecoderTest.java
index ec66784..6765051 100755
--- a/tests/tests/media/src/android/media/cts/DecoderTest.java
+++ b/tests/tests/media/src/android/media/cts/DecoderTest.java
@@ -164,8 +164,12 @@
     }
 
     public void testDecodeMonoGsm() throws Exception {
-        monoTest(R.raw.monotestgsm, 8000);
-        testTimeStampOrdering(R.raw.monotestgsm);
+        if (MediaUtils.hasCodecsForResource(mContext, R.raw.monotestgsm)) {
+            monoTest(R.raw.monotestgsm, 8000);
+            testTimeStampOrdering(R.raw.monotestgsm);
+        } else {
+            MediaUtils.skipTest("not mandatory");
+        }
     }
 
     public void testDecodeAacTs() throws Exception {
diff --git a/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java b/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java
index b6c94c14..40934f5 100644
--- a/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java
+++ b/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java
@@ -209,15 +209,32 @@
      */
     public void testEncodeDecodeVideoFromSurfaceToSurfaceQCIF() throws Throwable {
         setParameters(176, 144, 1000000, MIME_TYPE_AVC, true, false);
-        SurfaceToSurfaceWrapper.runTest(this);
+        SurfaceToSurfaceWrapper.runTest(this, false);
     }
     public void testEncodeDecodeVideoFromSurfaceToSurfaceQVGA() throws Throwable {
         setParameters(320, 240, 2000000, MIME_TYPE_AVC, true, false);
-        SurfaceToSurfaceWrapper.runTest(this);
+        SurfaceToSurfaceWrapper.runTest(this, false);
     }
     public void testEncodeDecodeVideoFromSurfaceToSurface720p() throws Throwable {
         setParameters(1280, 720, 6000000, MIME_TYPE_AVC, true, false);
-        SurfaceToSurfaceWrapper.runTest(this);
+        SurfaceToSurfaceWrapper.runTest(this, false);
+    }
+
+    /**
+     * Tests streaming of AVC video through the encoder and decoder.  Data is provided through
+     * a PersistentSurface and decoded onto a Surface.  The output is checked for validity.
+     */
+    public void testEncodeDecodeVideoFromPersistentSurfaceToSurfaceQCIF() throws Throwable {
+        setParameters(176, 144, 1000000, MIME_TYPE_AVC, true, false);
+        SurfaceToSurfaceWrapper.runTest(this, true);
+    }
+    public void testEncodeDecodeVideoFromPersistentSurfaceToSurfaceQVGA() throws Throwable {
+        setParameters(320, 240, 2000000, MIME_TYPE_AVC, true, false);
+        SurfaceToSurfaceWrapper.runTest(this, true);
+    }
+    public void testEncodeDecodeVideoFromPersistentSurfaceToSurface720p() throws Throwable {
+        setParameters(1280, 720, 6000000, MIME_TYPE_AVC, true, false);
+        SurfaceToSurfaceWrapper.runTest(this, true);
     }
 
     /**
@@ -226,40 +243,77 @@
      */
     public void testVP8EncodeDecodeVideoFromSurfaceToSurfaceQCIF() throws Throwable {
         setParameters(176, 144, 1000000, MIME_TYPE_VP8, true, false);
-        SurfaceToSurfaceWrapper.runTest(this);
+        SurfaceToSurfaceWrapper.runTest(this, false);
     }
     public void testVP8EncodeDecodeVideoFromSurfaceToSurfaceQVGA() throws Throwable {
         setParameters(320, 240, 2000000, MIME_TYPE_VP8, true, false);
-        SurfaceToSurfaceWrapper.runTest(this);
+        SurfaceToSurfaceWrapper.runTest(this, false);
     }
     public void testVP8EncodeDecodeVideoFromSurfaceToSurface720p() throws Throwable {
         setParameters(1280, 720, 6000000, MIME_TYPE_VP8, true, false);
-        SurfaceToSurfaceWrapper.runTest(this);
+        SurfaceToSurfaceWrapper.runTest(this, false);
+    }
+
+    /**
+     * Tests streaming of VP8 video through the encoder and decoder.  Data is provided through
+     * a PersistentSurface and decoded onto a Surface.  The output is checked for validity.
+     */
+    public void testVP8EncodeDecodeVideoFromPersistentSurfaceToSurfaceQCIF() throws Throwable {
+        setParameters(176, 144, 1000000, MIME_TYPE_VP8, true, false);
+        SurfaceToSurfaceWrapper.runTest(this, true);
+    }
+    public void testVP8EncodeDecodeVideoFromPersistentSurfaceToSurfaceQVGA() throws Throwable {
+        setParameters(320, 240, 2000000, MIME_TYPE_VP8, true, false);
+        SurfaceToSurfaceWrapper.runTest(this, true);
+    }
+    public void testVP8EncodeDecodeVideoFromPersistentSurfaceToSurface720p() throws Throwable {
+        setParameters(1280, 720, 6000000, MIME_TYPE_VP8, true, false);
+        SurfaceToSurfaceWrapper.runTest(this, true);
     }
 
     /** Wraps testEncodeDecodeVideoFromSurfaceToSurface() */
     private static class SurfaceToSurfaceWrapper implements Runnable {
         private Throwable mThrowable;
         private EncodeDecodeTest mTest;
+        private boolean mUsePersistentInput;
 
-        private SurfaceToSurfaceWrapper(EncodeDecodeTest test) {
+        private SurfaceToSurfaceWrapper(EncodeDecodeTest test, boolean persistent) {
             mTest = test;
+            mUsePersistentInput = persistent;
         }
 
         @Override
         public void run() {
+            InputSurface inputSurface = null;
             try {
-                mTest.encodeDecodeVideoFromSurfaceToSurface();
+                if (!mUsePersistentInput) {
+                    mTest.encodeDecodeVideoFromSurfaceToSurface(null);
+                } else {
+                    Log.d(TAG, "creating persistent surface");
+                    inputSurface = new InputSurface(
+                            MediaCodec.createPersistentInputSurface());
+
+                    for (int i = 0; i < 3; i++) {
+                        Log.d(TAG, "test persistent surface - round " + i);
+                        mTest.encodeDecodeVideoFromSurfaceToSurface(inputSurface);
+                    }
+                }
             } catch (Throwable th) {
                 mThrowable = th;
+            } finally {
+                if (inputSurface != null) {
+                    inputSurface.release();
+                }
             }
         }
 
         /**
          * Entry point.
          */
-        public static void runTest(EncodeDecodeTest obj) throws Throwable {
-            SurfaceToSurfaceWrapper wrapper = new SurfaceToSurfaceWrapper(obj);
+        public static void runTest(EncodeDecodeTest obj, boolean persisent)
+                throws Throwable {
+            SurfaceToSurfaceWrapper wrapper =
+                    new SurfaceToSurfaceWrapper(obj, persisent);
             Thread th = new Thread(wrapper, "codec test");
             th.start();
             th.join();
@@ -357,10 +411,10 @@
      * We encode several frames of a video test pattern using MediaCodec, then decode the
      * output with MediaCodec and do some simple checks.
      */
-    private void encodeDecodeVideoFromSurfaceToSurface() throws Exception {
+    private void encodeDecodeVideoFromSurfaceToSurface(InputSurface inSurf) throws Exception {
         MediaCodec encoder = null;
         MediaCodec decoder = null;
-        InputSurface inputSurface = null;
+        InputSurface inputSurface = inSurf;
         OutputSurface outputSurface = null;
 
         mLargestColorDelta = -1;
@@ -402,13 +456,19 @@
             // our desired properties.  Request a Surface to use for input.
             encoder = MediaCodec.createByCodecName(codec);
             encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
-            inputSurface = new InputSurface(encoder.createInputSurface());
+            if (inSurf != null) {
+                Log.d(TAG, "using persistent surface");
+                encoder.setInputSurface(inputSurface.getSurface());
+                inputSurface.updateSize(mWidth, mHeight);
+            } else {
+                inputSurface = new InputSurface(encoder.createInputSurface());
+            }
             encoder.start();
 
             doEncodeDecodeVideoFromSurfaceToSurface(encoder, inputSurface, decoder, outputSurface);
         } finally {
             if (VERBOSE) Log.d(TAG, "releasing codecs");
-            if (inputSurface != null) {
+            if (inSurf == null && inputSurface != null) {
                 inputSurface.release();
             }
             if (outputSurface != null) {
diff --git a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
index 89d6efa..a999135 100644
--- a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
+++ b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
@@ -801,12 +801,15 @@
             if (mTopPresentation != null) {
                 mTopPresentation.dismissPresentation();
                 mTopPresentation.destroyVirtualDisplay();
+                mTopPresentation = null;
             }
             if (mTopWindow != null) {
                 mTopWindow.cleanup();
+                mTopWindow = null;
             }
             if (mEglHelper != null) {
                 mEglHelper.release();
+                mEglHelper = null;
             }
         }
 
diff --git a/tests/tests/media/src/android/media/cts/EnumDevicesTest.java b/tests/tests/media/src/android/media/cts/EnumDevicesTest.java
new file mode 100644
index 0000000..94af087
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/EnumDevicesTest.java
@@ -0,0 +1,209 @@
+/*
+ * Copyright (C) 2015 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.media.cts;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+import android.media.AudioDeviceCallback;
+import android.media.AudioDeviceInfo;
+import android.media.AudioManager;
+
+import android.os.Handler;
+import android.os.Looper;
+
+import android.test.AndroidTestCase;
+
+/**
+ * TODO: Insert description here. (generated by pmclean)
+ */
+public class EnumDevicesTest extends AndroidTestCase {
+    private AudioManager mAudioManager;
+
+    boolean mAddCallbackCalled = false;
+    boolean mRemoveCallbackCalled = false;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        // get the AudioManager
+        mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+        assertNotNull(mAudioManager);
+    }
+
+    public void test_getDevices() {
+        AudioDeviceInfo[] deviceList;
+
+        // test an empty flags set
+        deviceList = mAudioManager.getDevices(0);
+        assertTrue(deviceList != null);
+        assertTrue(deviceList.length == 0);
+
+        int numOutputDevices = 0;
+        if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT)) {
+            // test OUTPUTS
+            deviceList = mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
+            assertTrue(deviceList != null);
+            numOutputDevices = deviceList.length;
+            assertTrue(numOutputDevices != 0);
+
+            // all should be "sinks"
+            for(int index = 0; index < numOutputDevices; index++) {
+                assertTrue(deviceList[index].isSink());
+            }
+        }
+
+        int numInputDevices = 0;
+        if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MICROPHONE)) {
+            // test INPUTS
+            deviceList = mAudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS);
+            assertTrue(deviceList != null);
+            numInputDevices = deviceList.length;
+            assertTrue(numInputDevices != 0);
+
+            // all should be "sources"
+            for(int index = 0; index < numInputDevices; index++) {
+                assertTrue(deviceList[index].isSource());
+            }
+        }
+
+        // INPUTS & OUTPUTS
+        if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT) &&
+                mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MICROPHONE)) {
+            deviceList = mAudioManager.getDevices(AudioManager.GET_DEVICES_ALL);
+            assertTrue(deviceList.length == (numOutputDevices + numInputDevices));
+        }
+    }
+
+    public void test_devicesInfoFields() {
+        AudioDeviceInfo[] deviceList;
+        deviceList = mAudioManager.getDevices(AudioManager.GET_DEVICES_ALL);
+        for (int index = 0; index < deviceList.length; index++) {
+            AudioDeviceInfo deviceInfo = deviceList[index];
+
+            // we don't say anything about the returned value.
+            int id = deviceInfo.getId();
+
+            // Product Name
+            CharSequence productName = deviceInfo.getProductName();
+            assertNotNull(productName);
+            assertTrue(productName.length() != 0);
+
+            // Address
+            String address = deviceInfo.getAddress();
+            assertNotNull(address);
+            // address may be empty
+
+            // isSource() XOR isSink()
+            assertTrue(deviceInfo.isSource() != deviceInfo.isSink());
+
+            // Sample Rates
+            int[] sampleRates = deviceInfo.getSampleRates();
+            assertNotNull(sampleRates);
+            // Note: an empty array indicates that the device supports arbitrary sample rates.
+
+            // Channel Masks
+            int[] channelMasks = deviceInfo.getChannelMasks();
+            assertNotNull(channelMasks);
+            // Note: an empty array indicates that the device supports arbitrary channel masks.
+
+            // Channel Index Masks
+            int[] indexMasks = deviceInfo.getChannelIndexMasks();
+            assertNotNull(indexMasks);
+            // Note: an empty array indicates that the device supports arbitrary channel index
+            // masks.
+
+            // Channel Counts
+            int[] channelCounts = deviceInfo.getChannelCounts();
+            assertNotNull(channelCounts);
+            // Note: an empty array indicates that the device supports arbitrary channel counts.
+
+            // Encodings
+            int[] encodings = deviceInfo.getEncodings();
+            assertNotNull(encodings);
+            // Note: an empty array indicates that the device supports arbitrary encodings.
+
+            int type = deviceInfo.getType();
+            assertTrue(type != AudioDeviceInfo.TYPE_UNKNOWN);
+        }
+    }
+
+    private class EmptyDeviceCallback extends AudioDeviceCallback {
+        public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
+            mAddCallbackCalled = true;
+        }
+
+        public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
+            mRemoveCallbackCalled = true;
+        }
+    }
+
+    /*
+     * tests if the Looper for the current thread has been prepared,
+     * If not, it makes one, prepares it and returns it.
+     * If this returns non-null, the caller is reponsible for calling quit()
+     * on the returned Looper.
+     */
+    private Looper prepareIfNeededLooper() {
+        // non-null Handler
+        Looper myLooper = null;
+        if (Looper.myLooper() == null) {
+            Looper.prepare();
+            myLooper = Looper.myLooper();
+            assertNotNull(myLooper);
+        }
+        return myLooper;
+    }
+
+    public void test_deviceCallback() {
+        // null callback?
+        mAudioManager.registerAudioDeviceCallback(null,null);
+
+        AudioDeviceCallback callback =  new EmptyDeviceCallback();
+        AudioDeviceCallback someOtherCallback =  new EmptyDeviceCallback();
+        // null Handler
+        mAudioManager.registerAudioDeviceCallback(callback, null);
+
+        // unregister null callback
+        mAudioManager.unregisterAudioDeviceCallback(null);
+        // unregister callback not registered
+        mAudioManager.unregisterAudioDeviceCallback(someOtherCallback);
+        // nominal case
+        mAudioManager.unregisterAudioDeviceCallback(callback);
+        // remove twice
+        mAudioManager.unregisterAudioDeviceCallback(callback);
+
+        Looper myLooper = prepareIfNeededLooper();
+
+        mAudioManager.registerAudioDeviceCallback(callback, new Handler());
+        // unregister null callback
+        mAudioManager.unregisterAudioDeviceCallback(null);
+        // unregister callback not registered
+        mAudioManager.unregisterAudioDeviceCallback(someOtherCallback);
+        // nominal case
+        mAudioManager.unregisterAudioDeviceCallback(callback);
+        // remove twice
+        mAudioManager.unregisterAudioDeviceCallback(callback);
+
+        if (myLooper != null) {
+            myLooper.quit();
+        }
+    }
+
+    //TODO - Need tests for device connect/disconnect callbacks
+}
diff --git a/tests/tests/media/src/android/media/cts/EqualizerTest.java b/tests/tests/media/src/android/media/cts/EqualizerTest.java
index 15f0c73..f07c99e 100644
--- a/tests/tests/media/src/android/media/cts/EqualizerTest.java
+++ b/tests/tests/media/src/android/media/cts/EqualizerTest.java
@@ -49,9 +49,6 @@
 
     //Test case 0.0: test constructor and release
     public void test0_0ConstructorAndRelease() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         Equalizer eq = null;
         try {
             eq = new Equalizer(0, 0);
@@ -78,9 +75,6 @@
 
     //Test case 1.0: test setBandLevel() and getBandLevel()
     public void test1_0BandLevel() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getEqualizer(0);
         try {
             short numBands = mEqualizer.getNumberOfBands();
@@ -110,9 +104,6 @@
 
     //Test case 1.1: test band frequency
     public void test1_1BandFrequency() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getEqualizer(0);
         try {
             short band = mEqualizer.getBand(TEST_FREQUENCY_MILLIHERTZ);
@@ -138,9 +129,6 @@
 
     //Test case 1.2: test presets
     public void test1_2Presets() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getEqualizer(0);
         try {
             short numPresets = mEqualizer.getNumberOfPresets();
@@ -166,9 +154,6 @@
 
     //Test case 1.3: test properties
     public void test1_3Properties() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getEqualizer(0);
         try {
             Equalizer.Settings settings = mEqualizer.getProperties();
@@ -200,9 +185,6 @@
 
     //Test case 1.4: test setBandLevel() throws exception after release
     public void test1_4SetBandLevelAfterRelease() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getEqualizer(0);
         mEqualizer.release();
         try {
@@ -220,9 +202,6 @@
 
     //Test case 2.0: test setEnabled() and getEnabled() in valid state
     public void test2_0SetEnabledGetEnabled() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getEqualizer(0);
         try {
             mEqualizer.setEnabled(true);
@@ -239,9 +218,6 @@
 
     //Test case 2.1: test setEnabled() throws exception after release
     public void test2_1SetEnabledAfterRelease() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getEqualizer(0);
         mEqualizer.release();
         try {
@@ -259,9 +235,6 @@
 
     //Test case 3.0: test control status listener
     public void test3_0ControlStatusListener() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         synchronized(mLock) {
             mHasControl = true;
             mInitialized = false;
@@ -284,9 +257,6 @@
 
     //Test case 3.1: test enable status listener
     public void test3_1EnableStatusListener() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         synchronized(mLock) {
             mInitialized = false;
             createListenerLooper(false, true, false);
@@ -311,9 +281,6 @@
 
     //Test case 3.2: test parameter changed listener
     public void test3_2ParameterChangedListener() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         synchronized(mLock) {
             mInitialized = false;
             createListenerLooper(false, false, true);
diff --git a/tests/tests/media/src/android/media/cts/InputSurface.java b/tests/tests/media/src/android/media/cts/InputSurface.java
index 157ed88..37ca423 100644
--- a/tests/tests/media/src/android/media/cts/InputSurface.java
+++ b/tests/tests/media/src/android/media/cts/InputSurface.java
@@ -41,8 +41,11 @@
     private EGLDisplay mEGLDisplay = EGL14.EGL_NO_DISPLAY;
     private EGLContext mEGLContext = EGL14.EGL_NO_CONTEXT;
     private EGLSurface mEGLSurface = EGL14.EGL_NO_SURFACE;
+    private EGLConfig[] mConfigs = new EGLConfig[1];
 
     private Surface mSurface;
+    private int mWidth;
+    private int mHeight;
 
     /**
      * Creates an InputSurface from a Surface.
@@ -80,9 +83,8 @@
                 EGL_RECORDABLE_ANDROID, 1,
                 EGL14.EGL_NONE
         };
-        EGLConfig[] configs = new EGLConfig[1];
         int[] numConfigs = new int[1];
-        if (!EGL14.eglChooseConfig(mEGLDisplay, attribList, 0, configs, 0, configs.length,
+        if (!EGL14.eglChooseConfig(mEGLDisplay, attribList, 0, mConfigs, 0, mConfigs.length,
                 numConfigs, 0)) {
             throw new RuntimeException("unable to find RGB888+recordable ES2 EGL config");
         }
@@ -92,7 +94,7 @@
                 EGL14.EGL_CONTEXT_CLIENT_VERSION, 2,
                 EGL14.EGL_NONE
         };
-        mEGLContext = EGL14.eglCreateContext(mEGLDisplay, configs[0], EGL14.EGL_NO_CONTEXT,
+        mEGLContext = EGL14.eglCreateContext(mEGLDisplay, mConfigs[0], EGL14.EGL_NO_CONTEXT,
                 attrib_list, 0);
         checkEglError("eglCreateContext");
         if (mEGLContext == null) {
@@ -100,17 +102,40 @@
         }
 
         // Create a window surface, and attach it to the Surface we received.
+        createEGLSurface();
+
+        mWidth = getWidth();
+        mHeight = getHeight();
+    }
+
+    public void updateSize(int width, int height) {
+        if (width != mWidth || height != mHeight) {
+            Log.d(TAG, "re-create EGLSurface");
+            releaseEGLSurface();
+            createEGLSurface();
+            mWidth = getWidth();
+            mHeight = getHeight();
+        }
+    }
+
+    private void createEGLSurface() {
+        //EGLConfig[] configs = new EGLConfig[1];
         int[] surfaceAttribs = {
                 EGL14.EGL_NONE
         };
-        mEGLSurface = EGL14.eglCreateWindowSurface(mEGLDisplay, configs[0], mSurface,
+        mEGLSurface = EGL14.eglCreateWindowSurface(mEGLDisplay, mConfigs[0], mSurface,
                 surfaceAttribs, 0);
         checkEglError("eglCreateWindowSurface");
         if (mEGLSurface == null) {
             throw new RuntimeException("surface was null");
         }
     }
-
+    private void releaseEGLSurface() {
+        if (mEGLDisplay != EGL14.EGL_NO_DISPLAY) {
+            EGL14.eglDestroySurface(mEGLDisplay, mEGLSurface);
+            mEGLSurface = EGL14.EGL_NO_SURFACE;
+        }
+    }
     /**
      * Discard all resources held by this class, notably the EGL context.  Also releases the
      * Surface that was passed to our constructor.
diff --git a/tests/tests/media/src/android/media/cts/LoudnessEnhancerTest.java b/tests/tests/media/src/android/media/cts/LoudnessEnhancerTest.java
index be5099e..5b4d1aa 100644
--- a/tests/tests/media/src/android/media/cts/LoudnessEnhancerTest.java
+++ b/tests/tests/media/src/android/media/cts/LoudnessEnhancerTest.java
@@ -24,6 +24,9 @@
 import android.media.AudioManager;
 import android.media.MediaPlayer;
 import android.media.audiofx.LoudnessEnhancer;
+import java.util.UUID;
+import android.media.audiofx.Visualizer;
+import android.media.audiofx.Visualizer.MeasurementPeakRms;
 import android.os.Looper;
 import android.test.AndroidTestCase;
 import android.util.Log;
@@ -43,9 +46,6 @@
 
     //Test case 0.0: test constructor and release
     public void test0_0ConstructorAndRelease() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         AudioManager am = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
         assertNotNull("null AudioManager", am);
         getLoudnessEnhancer(0);
@@ -63,9 +63,6 @@
 
     //Test case 1.0: test set/get target gain
     public void test1_0TargetGain() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getLoudnessEnhancer(0);
         try {
             mLE.setTargetGain(0);
@@ -83,6 +80,113 @@
         }
     }
 
+  //Test case 2.0: test loudness gain change in audio
+    public void test2_0MeasureGainChange() throws Exception {
+        if (!hasAudioOutput()) {
+            return;
+        }
+        AudioEffect vc = null;
+        Visualizer visualizer = null;
+        MediaPlayer mp = null;
+        try {
+            // this test will play a 1kHz sine wave with peaks at -40dB, and apply 6 db gain
+            // using loudness enhancement
+            mp = MediaPlayer.create(getContext(), R.raw.sine1khzm40db);
+            final int LOUDNESS_GAIN = 600;
+            final int MAX_MEASUREMENT_ERROR_MB = 200;
+            assertNotNull("null MediaPlayer", mp);
+
+            // creating a volume controller on output mix ensures that ro.audio.silent mutes
+            // audio after the effects and not before
+            vc = new AudioEffect(
+                    AudioEffect.EFFECT_TYPE_NULL,
+                    UUID.fromString(BUNDLE_VOLUME_EFFECT_UUID),
+                    0,
+                    mp.getAudioSessionId());
+            vc.setEnabled(true);
+
+            AudioManager am = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
+            assertNotNull("null AudioManager", am);
+            int originalVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);
+            am.setStreamVolume(AudioManager.STREAM_MUSIC,
+                    am.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);
+            int sessionId = mp.getAudioSessionId();
+
+            getLoudnessEnhancer(sessionId);
+            visualizer = new Visualizer(sessionId);
+
+            mp.setLooping(true);
+            mp.start();
+
+            visualizer.setEnabled(true);
+            assertTrue("visualizer not enabled", visualizer.getEnabled());
+            Thread.sleep(100);
+            int status = visualizer.setMeasurementMode(Visualizer.MEASUREMENT_MODE_PEAK_RMS);
+            assertEquals("setMeasurementMode() for PEAK_RMS doesn't report success",
+                    Visualizer.SUCCESS, status);
+            // make sure we're playing long enough so the measurement is valid
+            int currentPosition = mp.getCurrentPosition();
+            int maxTry = 100;
+            int tryCount = 0;
+            while (currentPosition < 200 && tryCount < maxTry) {
+                Thread.sleep(50);
+                currentPosition = mp.getCurrentPosition();
+                tryCount++;
+            }
+            assertTrue("MediaPlayer not ready", tryCount < maxTry);
+
+            MeasurementPeakRms measurement = new MeasurementPeakRms();
+            status = visualizer.getMeasurementPeakRms(measurement);
+
+            //run for a new set of 3 seconds, get new measurement
+            mLE.setTargetGain(LOUDNESS_GAIN);
+            assertEquals("target gain differs from value set", (float)LOUDNESS_GAIN,
+                    mLE.getTargetGain());
+
+            mLE.setEnabled(true);
+
+            visualizer.setMeasurementMode(Visualizer.MEASUREMENT_MODE_PEAK_RMS);
+            currentPosition = mp.getCurrentPosition();
+            maxTry = 5;
+            tryCount = 0;
+            while (tryCount < maxTry) {
+                Thread.sleep(50);
+                tryCount++;
+            }
+
+            MeasurementPeakRms measurement2 = new MeasurementPeakRms();
+            status = visualizer.getMeasurementPeakRms(measurement2);
+
+            //compare both measurements
+            am.setStreamVolume(AudioManager.STREAM_MUSIC, originalVolume, 0);
+            assertEquals("getMeasurementPeakRms() reports failure",
+                    Visualizer.SUCCESS, status);
+            Log.i("VisTest", "peak="+measurement.mPeak+"  rms="+measurement.mRms);
+            Log.i("VisTest", "peak2="+measurement2.mPeak+"  rms2="+measurement2.mRms);
+
+            int deltaPeak = Math.abs(measurement2.mPeak - (measurement.mPeak + LOUDNESS_GAIN) );
+            assertTrue("peak deviation in mB = "+deltaPeak, deltaPeak < MAX_MEASUREMENT_ERROR_MB);
+
+        } catch (IllegalStateException e) {
+            fail("method called in wrong state");
+        } catch (InterruptedException e) {
+            fail("sleep() interrupted");
+        } finally {
+            if (mp != null) {
+                mp.stop();
+                mp.release();
+            }
+
+            if (vc != null)
+                vc.release();
+
+            if (visualizer != null)
+                visualizer.release();
+
+            releaseLoudnessEnhancer();
+        }
+    }
+
     //-----------------------------------------------------------------
     // private methods
     //----------------------------------
diff --git a/tests/tests/media/src/android/media/cts/MediaBrowserServiceTest.java b/tests/tests/media/src/android/media/cts/MediaBrowserServiceTest.java
index 996ddf7..02bdd7f 100644
--- a/tests/tests/media/src/android/media/cts/MediaBrowserServiceTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaBrowserServiceTest.java
@@ -35,31 +35,44 @@
     private static final ComponentName TEST_BROWSER_SERVICE = new ComponentName(
             "com.android.cts.media", "android.media.cts.StubMediaBrowserService");
     private final Object mWaitLock = new Object();
+
     private final MediaBrowser.ConnectionCallback mConnectionCallback =
             new MediaBrowser.ConnectionCallback() {
-                @Override
-                public void onConnected() {
-                    synchronized (mWaitLock) {
-                        mMediaBrowserService = StubMediaBrowserService.sInstance;
-                        mWaitLock.notify();
-                    }
-                }
-            };
+        @Override
+        public void onConnected() {
+            synchronized (mWaitLock) {
+                mMediaBrowserService = StubMediaBrowserService.sInstance;
+                mWaitLock.notify();
+            }
+        }
+    };
 
     private final MediaBrowser.SubscriptionCallback mSubscriptionCallback  =
             new MediaBrowser.SubscriptionCallback() {
-                @Override
-                public void onChildrenLoaded(String parentId, List<MediaItem> children) {
-                    synchronized (mWaitLock) {
-                        mOnChildrenLoaded = true;
-                        mWaitLock.notify();
-                    }
+            @Override
+            public void onChildrenLoaded(String parentId, List<MediaItem> children) {
+                synchronized (mWaitLock) {
+                    mOnChildrenLoaded = true;
+                    mWaitLock.notify();
                 }
-            };
+            }
+        };
+
+    private final MediaBrowser.ItemCallback mItemCallback  =
+            new MediaBrowser.ItemCallback() {
+        @Override
+        public void onItemLoaded(MediaItem item) {
+            synchronized (mWaitLock) {
+                mOnItemLoaded = true;
+                mWaitLock.notify();
+            }
+        }
+    };
 
     private MediaBrowser mMediaBrowser;
     private StubMediaBrowserService mMediaBrowserService;
     private boolean mOnChildrenLoaded;
+    private boolean mOnItemLoaded;
 
     @Override
     protected void setUp() throws Exception {
@@ -119,6 +132,20 @@
         }
     }
 
+    public void testDelayedItem() throws Exception {
+        synchronized (mWaitLock) {
+            mOnItemLoaded = false;
+            mMediaBrowser.getItem(StubMediaBrowserService.MEDIA_ID_CHILDREN_DELAYED,
+                    mItemCallback);
+            mWaitLock.wait(WAIT_TIME_FOR_NO_RESPONSE_MS);
+            assertFalse(mOnItemLoaded);
+
+            mMediaBrowserService.sendDelayedItemLoaded();
+            mWaitLock.wait(TIME_OUT_MS);
+            assertTrue(mOnItemLoaded);
+        }
+    }
+
     public void testBrowserRoot() {
         final String id = "test-id";
         final String key = "test-key";
diff --git a/tests/tests/media/src/android/media/cts/MediaBrowserTest.java b/tests/tests/media/src/android/media/cts/MediaBrowserTest.java
index 51d43d9..7dd978f 100644
--- a/tests/tests/media/src/android/media/cts/MediaBrowserTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaBrowserTest.java
@@ -18,6 +18,7 @@
 import android.content.ComponentName;
 import android.cts.util.PollingCheck;
 import android.media.browse.MediaBrowser;
+import android.media.browse.MediaBrowser.MediaItem;
 import android.test.InstrumentationTestCase;
 
 import java.util.List;
@@ -34,6 +35,7 @@
             "invalid.package", "invalid.ServiceClassName");
     private final StubConnectionCallback mConnectionCallback = new StubConnectionCallback();
     private final StubSubscriptionCallback mSubscriptionCallback = new StubSubscriptionCallback();
+    private final StubItemCallback mItemCallback = new StubItemCallback();
 
     private MediaBrowser mMediaBrowser;
 
@@ -115,6 +117,37 @@
         }
     }
 
+    public void testGetItem() {
+        resetCallbacks();
+        createMediaBrowser(TEST_BROWSER_SERVICE);
+        connectMediaBrowserService();
+        mMediaBrowser.getItem(StubMediaBrowserService.MEDIA_ID_CHILDREN[0], mItemCallback);
+        new PollingCheck(TIME_OUT_MS) {
+            @Override
+            protected boolean check() {
+                return mItemCallback.mLastMediaItem != null;
+            }
+        }.run();
+
+        assertEquals(StubMediaBrowserService.MEDIA_ID_CHILDREN[0],
+                mItemCallback.mLastMediaItem.getMediaId());
+    }
+
+    public void testGetItemFailure() {
+        resetCallbacks();
+        createMediaBrowser(TEST_BROWSER_SERVICE);
+        connectMediaBrowserService();
+        mMediaBrowser.getItem("does-not-exist", mItemCallback);
+        new PollingCheck(TIME_OUT_MS) {
+            @Override
+            protected boolean check() {
+                return mItemCallback.mLastErrorId != null;
+            }
+        }.run();
+
+        assertEquals("does-not-exist", mItemCallback.mLastErrorId);
+    }
+
     private void createMediaBrowser(final ComponentName component) {
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
@@ -138,6 +171,7 @@
     private void resetCallbacks() {
         mConnectionCallback.reset();
         mSubscriptionCallback.reset();
+        mItemCallback.reset();
     }
 
     private static class StubConnectionCallback extends MediaBrowser.ConnectionCallback {
@@ -169,14 +203,12 @@
 
     private static class StubSubscriptionCallback extends MediaBrowser.SubscriptionCallback {
         private volatile int mChildrenLoadedCount;
-        private volatile int mErrorCount;
         private volatile String mLastErrorId;
         private volatile String mLastParentId;
         private volatile List<MediaBrowser.MediaItem> mLastChildMediaItems;
 
         public void reset() {
             mChildrenLoadedCount = 0;
-            mErrorCount = 0;
             mLastErrorId = null;
             mLastParentId = null;
             mLastChildMediaItems = null;
@@ -194,4 +226,24 @@
             mLastErrorId = id;
         }
     }
+
+    private static class StubItemCallback extends MediaBrowser.ItemCallback {
+        private volatile MediaBrowser.MediaItem mLastMediaItem;
+        private volatile String mLastErrorId;
+
+        public void reset() {
+            mLastMediaItem = null;
+            mLastErrorId = null;
+        }
+
+        @Override
+        public void onItemLoaded(MediaItem item) {
+            mLastMediaItem = item;
+        }
+
+        @Override
+        public void onError(String id) {
+            mLastErrorId = id;
+        }
+    }
 }
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java b/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
index 159d13f..813af0f2 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
@@ -19,6 +19,7 @@
 import android.cts.util.MediaUtils;
 import android.media.MediaCodec;
 import android.media.MediaCodecInfo;
+import android.media.MediaCodecInfo.AudioCapabilities;
 import android.media.MediaCodecInfo.CodecCapabilities;
 import android.media.MediaCodecInfo.CodecProfileLevel;
 import android.media.MediaCodecInfo.VideoCapabilities;
@@ -39,6 +40,7 @@
 import java.util.HashSet;
 import java.util.Set;
 import java.util.Arrays;
+import java.util.Vector;
 
 /**
  * Basic sanity test of data returned by MediaCodeCapabilities.
@@ -528,4 +530,113 @@
             MediaUtils.skipTest("no non-tunneled/non-secure video decoders found");
         }
     }
+
+    private static MediaFormat createMinFormat(String mime, CodecCapabilities caps) {
+        MediaFormat format;
+        if (caps.getVideoCapabilities() != null) {
+            VideoCapabilities vcaps = caps.getVideoCapabilities();
+            int minWidth = vcaps.getSupportedWidths().getLower();
+            int minHeight = vcaps.getSupportedHeightsFor(minWidth).getLower();
+            int minBitrate = vcaps.getBitrateRange().getLower();
+            format = MediaFormat.createVideoFormat(mime, minWidth, minHeight);
+            format.setInteger(MediaFormat.KEY_COLOR_FORMAT, caps.colorFormats[0]);
+            format.setInteger(MediaFormat.KEY_BIT_RATE, minBitrate);
+            format.setInteger(MediaFormat.KEY_FRAME_RATE, 10);
+            format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 10);
+        } else {
+            AudioCapabilities acaps = caps.getAudioCapabilities();
+            int minSampleRate = acaps.getSupportedSampleRateRanges()[0].getLower();
+            int minChannelCount = 1;
+            int minBitrate = acaps.getBitrateRange().getLower();
+            format = MediaFormat.createAudioFormat(mime, minSampleRate, minChannelCount);
+            format.setInteger(MediaFormat.KEY_BIT_RATE, minBitrate);
+        }
+
+        return format;
+    }
+
+    private static int getActualMax(
+            boolean isEncoder, String name, String mime, CodecCapabilities caps, int max) {
+        int flag = isEncoder ? MediaCodec.CONFIGURE_FLAG_ENCODE : 0;
+        MediaFormat format = createMinFormat(mime, caps);
+        Log.d(TAG, "Test format " + format);
+        Vector<MediaCodec> codecs = new Vector<MediaCodec>();
+        MediaCodec codec = null;
+        for (int i = 0; i < max; ++i) {
+            try {
+                Log.d(TAG, "Create codec " + name + " #" + i);
+                codec = MediaCodec.createByCodecName(name);
+                codec.configure(format, null, null, flag);
+                codec.start();
+                codecs.add(codec);
+                codec = null;
+            } catch (IllegalArgumentException e) {
+                fail("Got unexpected IllegalArgumentException " + e.getMessage());
+            } catch (IOException e) {
+                fail("Got unexpected IOException " + e.getMessage());
+            } catch (MediaCodec.CodecException e) {
+                // ERROR_INSUFFICIENT_RESOURCE is expected as the test keep creating codecs.
+                // But other exception should be treated as failure.
+                if (e.getErrorCode() == MediaCodec.CodecException.ERROR_INSUFFICIENT_RESOURCE) {
+                    Log.d(TAG, "Got CodecException with ERROR_INSUFFICIENT_RESOURCE.");
+                    break;
+                } else {
+                    fail("Unexpected CodecException " + e.getDiagnosticInfo());
+                }
+            } finally {
+                if (codec != null) {
+                    Log.d(TAG, "release codec");
+                    codec.release();
+                    codec = null;
+                }
+            }
+        }
+        int actualMax = codecs.size();
+        for (int i = 0; i < codecs.size(); ++i) {
+            Log.d(TAG, "release codec #" + i);
+            codecs.get(i).release();
+        }
+        codecs.clear();
+        return actualMax;
+    }
+
+    public void testGetMaxSupportedInstances() {
+        final int MAX_INSTANCES = 32;
+        StringBuilder xmlOverrides = new StringBuilder();
+        MediaCodecList allCodecs = new MediaCodecList(MediaCodecList.ALL_CODECS);
+        for (MediaCodecInfo info : allCodecs.getCodecInfos()) {
+            Log.d(TAG, "codec: " + info.getName());
+            Log.d(TAG, "  isEncoder = " + info.isEncoder());
+
+            String[] types = info.getSupportedTypes();
+            for (int j = 0; j < types.length; ++j) {
+                Log.d(TAG, "calling getCapabilitiesForType " + types[j]);
+                CodecCapabilities caps = info.getCapabilitiesForType(types[j]);
+                int max = caps.getMaxSupportedInstances();
+                Log.d(TAG, "getMaxSupportedInstances returns " + max);
+                assertTrue(max > 0);
+
+                int actualMax = getActualMax(
+                        info.isEncoder(), info.getName(), types[j], caps, MAX_INSTANCES);
+                Log.d(TAG, "actualMax " + actualMax + " vs reported max " + max);
+                if (actualMax < (int)(max * 0.9) || actualMax > (int) Math.ceil(max * 1.1)) {
+                    String codec = "<MediaCodec name=\"" + info.getName() +
+                            "\" type=\"" + types[j] + "\" >";
+                    String limit = "    <Limit name=\"concurrent-instances\" max=\"" +
+                            actualMax + "\" />";
+                    xmlOverrides.append(codec);
+                    xmlOverrides.append("\n");
+                    xmlOverrides.append(limit);
+                    xmlOverrides.append("\n");
+                    xmlOverrides.append("</MediaCodec>\n");
+                }
+            }
+        }
+
+        if (xmlOverrides.length() > 0) {
+            String failMessage = "In order to pass the test, please publish following " +
+                    "codecs' concurrent instances limit in /etc/media_codecs.xml: \n";
+           fail(failMessage + xmlOverrides.toString());
+        }
+    }
 }
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecCencPlayer.java b/tests/tests/media/src/android/media/cts/MediaCodecCencPlayer.java
index b96d38c..2473078 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecCencPlayer.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecCencPlayer.java
@@ -248,12 +248,14 @@
 
         if (null == mCrypto && (mEncryptedVideo || mEncryptedAudio)) {
             try {
-                mCrypto = new MediaCrypto(CLEARKEY_SCHEME_UUID, mSessionId);
+                byte[] initData = new byte[0];
+                mCrypto = new MediaCrypto(CLEARKEY_SCHEME_UUID, initData);
             } catch (MediaCryptoException e) {
                 reset();
                 Log.e(TAG, "Failed to create MediaCrypto instance.");
                 throw e;
             }
+            mCrypto.setMediaDrmSession(mSessionId);
         } else {
             reset();
             mCrypto.release();
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecTest.java b/tests/tests/media/src/android/media/cts/MediaCodecTest.java
index 494e823..bb05ea0 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecTest.java
@@ -21,6 +21,8 @@
 import android.content.res.AssetFileDescriptor;
 import android.cts.util.MediaUtils;
 import android.media.MediaCodec;
+import android.media.MediaCodec.BufferInfo;
+import android.media.MediaCodec.CodecException;
 import android.media.MediaCodecInfo;
 import android.media.MediaCodecList;
 import android.media.MediaExtractor;
@@ -28,13 +30,20 @@
 import android.media.MediaCodecInfo.CodecCapabilities;
 import android.media.MediaCodecInfo.CodecProfileLevel;
 import android.opengl.GLES20;
+import android.os.Handler;
+import android.os.HandlerThread;
 import android.test.AndroidTestCase;
 import android.util.Log;
 import android.view.Surface;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * General MediaCodec tests.
@@ -457,6 +466,241 @@
         }
     }
 
+    public void testReleaseAfterFlush() throws IOException, InterruptedException {
+        CountDownLatch buffersExhausted = null;
+        CountDownLatch codecFlushed = null;
+        AtomicInteger numBuffers = null;
+
+        // sync flush from same thread
+        MediaCodec encoder = MediaCodec.createEncoderByType(MIME_TYPE);
+        runReleaseAfterFlush(encoder, buffersExhausted, codecFlushed, numBuffers);
+
+        // sync flush from different thread
+        encoder = MediaCodec.createEncoderByType(MIME_TYPE);
+        buffersExhausted = new CountDownLatch(1);
+        codecFlushed = new CountDownLatch(1);
+        numBuffers = new AtomicInteger();
+        Thread flushThread = new FlushThread(encoder, buffersExhausted, codecFlushed);
+        flushThread.start();
+        runReleaseAfterFlush(encoder, buffersExhausted, codecFlushed, numBuffers);
+        flushThread.join();
+
+        // async
+        // This value is calculated in getOutputBufferIndices by calling dequeueOutputBuffer
+        // with a fixed timeout until buffers are exhausted; it is possible that random timing
+        // in dequeueOutputBuffer can result in a smaller `nBuffs` than the max possible value.
+        int nBuffs = numBuffers.get();
+        HandlerThread callbackThread = new HandlerThread("ReleaseAfterFlushCallbackThread");
+        callbackThread.start();
+        Handler handler = new Handler(callbackThread.getLooper());
+
+        // async flush from same thread
+        encoder = MediaCodec.createEncoderByType(MIME_TYPE);
+        buffersExhausted = null;
+        codecFlushed = null;
+        ReleaseAfterFlushCallback callback =
+                new ReleaseAfterFlushCallback(encoder, buffersExhausted, codecFlushed, nBuffs);
+        encoder.setCallback(callback, handler); // setCallback before configure, which is called in run
+        callback.run(); // drive input on main thread
+
+        // async flush from different thread
+        encoder = MediaCodec.createEncoderByType(MIME_TYPE);
+        buffersExhausted = new CountDownLatch(1);
+        codecFlushed = new CountDownLatch(1);
+        callback = new ReleaseAfterFlushCallback(encoder, buffersExhausted, codecFlushed, nBuffs);
+        encoder.setCallback(callback, handler);
+        flushThread = new FlushThread(encoder, buffersExhausted, codecFlushed);
+        flushThread.start();
+        callback.run();
+        flushThread.join();
+
+        callbackThread.quitSafely();
+        callbackThread.join();
+    }
+
+    private static class FlushThread extends Thread {
+        final MediaCodec mEncoder;
+        final CountDownLatch mBuffersExhausted;
+        final CountDownLatch mCodecFlushed;
+
+        FlushThread(MediaCodec encoder, CountDownLatch buffersExhausted,
+                CountDownLatch codecFlushed) {
+            mEncoder = encoder;
+            mBuffersExhausted = buffersExhausted;
+            mCodecFlushed = codecFlushed;
+        }
+
+        @Override
+        public void run() {
+            try {
+                mBuffersExhausted.await();
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                Log.w(TAG, "buffersExhausted wait interrupted; flushing immediately.", e);
+            }
+            mEncoder.flush();
+            mCodecFlushed.countDown();
+        }
+    }
+
+    private static class ReleaseAfterFlushCallback extends MediaCodec.Callback implements Runnable {
+        final MediaCodec mEncoder;
+        final CountDownLatch mBuffersExhausted, mCodecFlushed;
+        final int mNumBuffersBeforeFlush;
+
+        CountDownLatch mStopInput = new CountDownLatch(1);
+        List<Integer> mOutputBufferIndices = new ArrayList<>();
+
+        ReleaseAfterFlushCallback(MediaCodec encoder,
+                CountDownLatch buffersExhausted,
+                CountDownLatch codecFlushed,
+                int numBuffersBeforeFlush) {
+            mEncoder = encoder;
+            mBuffersExhausted = buffersExhausted;
+            mCodecFlushed = codecFlushed;
+            mNumBuffersBeforeFlush = numBuffersBeforeFlush;
+        }
+
+        @Override
+        public void onInputBufferAvailable(MediaCodec codec, int index) {
+            fail(codec + " onInputBufferAvailable " + index);
+        }
+
+        @Override
+        public void onOutputBufferAvailable(MediaCodec codec, int index, BufferInfo info) {
+            mOutputBufferIndices.add(index);
+            if (mOutputBufferIndices.size() == mNumBuffersBeforeFlush) {
+                releaseAfterFlush(codec, mOutputBufferIndices, mBuffersExhausted, mCodecFlushed);
+                mStopInput.countDown();
+            }
+        }
+
+        @Override
+        public void onError(MediaCodec codec, CodecException e) {
+            Log.e(TAG, codec + " onError", e);
+            fail(codec + " onError " + e.getMessage());
+        }
+
+        @Override
+        public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {
+            Log.v(TAG, codec + " onOutputFormatChanged " + format);
+        }
+
+        @Override
+        public void run() {
+            InputSurface inputSurface = null;
+            try {
+                inputSurface = initCodecAndSurface(mEncoder);
+                do {
+                    GLES20.glClearColor(0.0f, 0.5f, 0.0f, 1.0f);
+                    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
+                    inputSurface.swapBuffers();
+                } while (!mStopInput.await(TIMEOUT_USEC, TimeUnit.MICROSECONDS));
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                Log.w(TAG, "mEncoder input frames interrupted/stopped", e);
+            } finally {
+                cleanupCodecAndSurface(mEncoder, inputSurface);
+            }
+        }
+    }
+
+    private static void runReleaseAfterFlush(
+            MediaCodec encoder,
+            CountDownLatch buffersExhausted,
+            CountDownLatch codecFlushed,
+            AtomicInteger numBuffers) {
+        InputSurface inputSurface = null;
+        try {
+            inputSurface = initCodecAndSurface(encoder);
+            List<Integer> outputBufferIndices = getOutputBufferIndices(encoder, inputSurface);
+            if (numBuffers != null) {
+                numBuffers.set(outputBufferIndices.size());
+            }
+            releaseAfterFlush(encoder, outputBufferIndices, buffersExhausted, codecFlushed);
+        } finally {
+            cleanupCodecAndSurface(encoder, inputSurface);
+        }
+    }
+
+    private static InputSurface initCodecAndSurface(MediaCodec encoder) {
+        InputSurface inputSurface;
+        CodecInfo info = getAvcSupportedFormatInfo();
+        MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, info.mMaxW, info.mMaxH);
+        format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
+                MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
+        format.setInteger(MediaFormat.KEY_BIT_RATE, info.mBitRate);
+        format.setInteger(MediaFormat.KEY_FRAME_RATE, info.mFps);
+        format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, IFRAME_INTERVAL);
+        OutputSurface outputSurface = new OutputSurface(1, 1);
+        encoder.configure(format, outputSurface.getSurface(), null, MediaCodec.CONFIGURE_FLAG_ENCODE);
+        inputSurface = new InputSurface(encoder.createInputSurface());
+        inputSurface.makeCurrent();
+        encoder.start();
+        return inputSurface;
+    }
+
+    private static void cleanupCodecAndSurface(MediaCodec encoder, InputSurface inputSurface) {
+        if (encoder != null) {
+            encoder.stop();
+            encoder.release();
+        }
+
+        if (inputSurface != null) {
+            inputSurface.release();
+        }
+    }
+
+    private static List<Integer> getOutputBufferIndices(MediaCodec encoder, InputSurface inputSurface) {
+        boolean feedMoreFrames;
+        MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
+        List<Integer> indices = new ArrayList<>();
+        do {
+            feedMoreFrames = indices.isEmpty();
+            GLES20.glClearColor(0.0f, 0.5f, 0.0f, 1.0f);
+            GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
+            inputSurface.swapBuffers();
+            // dequeue buffers until not available
+            int index = encoder.dequeueOutputBuffer(bufferInfo, TIMEOUT_USEC);
+            while (index >= 0) {
+                feedMoreFrames = true;
+                indices.add(index);
+                index = encoder.dequeueOutputBuffer(bufferInfo, TIMEOUT_USEC_SHORT);
+            }
+        } while (feedMoreFrames);
+        assertFalse(indices.isEmpty());
+        return indices;
+    }
+
+    private static void releaseAfterFlush(
+            MediaCodec encoder,
+            List<Integer> outputBufferIndices,
+            CountDownLatch buffersExhausted,
+            CountDownLatch codecFlushed) {
+        if (buffersExhausted == null) {
+            // flush from same thread
+            encoder.flush();
+        } else {
+            assertNotNull(codecFlushed);
+            buffersExhausted.countDown();
+            try {
+                codecFlushed.await();
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                Log.w(TAG, "codecFlushed wait interrupted; releasing buffers immediately.", e);
+            }
+        }
+
+        for (int index : outputBufferIndices) {
+            try {
+                encoder.releaseOutputBuffer(index, true);
+                fail("MediaCodec releaseOutputBuffer after flush() does not throw exception");
+            } catch (MediaCodec.CodecException e) {
+                // Expected
+            }
+        }
+    }
+
     /**
      * Tests:
      * <br> dequeueInputBuffer() fails when encoder configured with an input Surface
@@ -553,6 +797,121 @@
         }
     }
 
+    public void testDecodeAfterFlush() throws InterruptedException {
+        final int INPUT_RESOURCE_ID =
+                R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz;
+
+        // The test should fail if the decoder never produces output frames for the input.
+        // Time out decoding, as we have no way to query whether the decoder will produce output.
+        final int DECODING_TIMEOUT_MS = 10000;
+
+        final AtomicBoolean completed = new AtomicBoolean(false);
+        Thread videoDecodingThread = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                OutputSurface outputSurface = null;
+                MediaExtractor mediaExtractor = null;
+                MediaCodec mediaCodec = null;
+                try {
+                    outputSurface = new OutputSurface(1, 1);
+                    mediaExtractor = getMediaExtractorForMimeType(INPUT_RESOURCE_ID, "video/");
+                    MediaFormat mediaFormat =
+                            mediaExtractor.getTrackFormat(mediaExtractor.getSampleTrackIndex());
+                    if (!MediaUtils.checkDecoderForFormat(mediaFormat)) {
+                        return; // skip
+                    }
+                    String mimeType = mediaFormat.getString(MediaFormat.KEY_MIME);
+                    mediaCodec = MediaCodec.createDecoderByType(mimeType);
+                    mediaCodec.configure(mediaFormat, outputSurface.getSurface(),
+                            null /* crypto */, 0 /* flags */);
+                    mediaCodec.start();
+
+                    if (!runDecodeTillFirstOutput(mediaCodec, mediaExtractor)) {
+                        throw new RuntimeException("decoder does not generate non-empty output.");
+                    }
+
+                    // simulate application flush.
+                    mediaExtractor.seekTo(0, MediaExtractor.SEEK_TO_CLOSEST_SYNC);
+                    mediaCodec.flush();
+
+                    completed.set(runDecodeTillFirstOutput(mediaCodec, mediaExtractor));
+                } catch (IOException e) {
+                    throw new RuntimeException("error setting up decoding", e);
+                } finally {
+                    if (mediaCodec != null) {
+                        mediaCodec.stop();
+                        mediaCodec.release();
+                    }
+                    if (mediaExtractor != null) {
+                        mediaExtractor.release();
+                    }
+                    if (outputSurface != null) {
+                        outputSurface.release();
+                    }
+                }
+            }
+        });
+        videoDecodingThread.start();
+        videoDecodingThread.join(DECODING_TIMEOUT_MS);
+        // In case it's timed out, need to stop the thread and have all resources released.
+        videoDecodingThread.interrupt();
+        if (!completed.get()) {
+            throw new RuntimeException("timed out decoding to end-of-stream");
+        }
+    }
+
+    // Run the decoder till it generates an output buffer.
+    // Return true when that output buffer is not empty, false otherwise.
+    private static boolean runDecodeTillFirstOutput(
+            MediaCodec mediaCodec, MediaExtractor mediaExtractor) {
+        final int TIME_OUT_US = 10000;
+
+        assertTrue("Wrong test stream which has no data.",
+                mediaExtractor.getSampleTrackIndex() != -1);
+        boolean signaledEos = false;
+        MediaCodec.BufferInfo outputBufferInfo = new MediaCodec.BufferInfo();
+        while (!Thread.interrupted()) {
+            // Try to feed more data into the codec.
+            if (!signaledEos) {
+                int bufferIndex = mediaCodec.dequeueInputBuffer(TIME_OUT_US /* timeoutUs */);
+                if (bufferIndex != -1) {
+                    ByteBuffer buffer = mediaCodec.getInputBuffer(bufferIndex);
+                    int size = mediaExtractor.readSampleData(buffer, 0 /* offset */);
+                    long timestampUs = mediaExtractor.getSampleTime();
+                    mediaExtractor.advance();
+                    signaledEos = mediaExtractor.getSampleTrackIndex() == -1;
+                    mediaCodec.queueInputBuffer(bufferIndex,
+                            0 /* offset */,
+                            size,
+                            timestampUs,
+                            signaledEos ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
+                    Log.i("DEBUG", "queue with " + signaledEos);
+                }
+            }
+
+            int outputBufferIndex = mediaCodec.dequeueOutputBuffer(
+                    outputBufferInfo, TIME_OUT_US /* timeoutUs */);
+
+            if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED
+                    || outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED
+                    || outputBufferIndex == MediaCodec.INFO_TRY_AGAIN_LATER) {
+                continue;
+            }
+            assertTrue("Wrong output buffer index", outputBufferIndex >= 0);
+
+            mediaCodec.releaseOutputBuffer(outputBufferIndex, false /* render */);
+            boolean eos = (outputBufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0;
+            Log.i("DEBUG", "Got a frame with eos=" + eos);
+            if (eos && outputBufferInfo.size == 0) {
+                return false;
+            } else {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
     /**
      * Tests whether decoding a short group-of-pictures succeeds. The test queues a few video frames
      * then signals end-of-stream. The test fails if the decoder doesn't output the queued frames.
diff --git a/tests/tests/media/src/android/media/cts/MediaControllerTest.java b/tests/tests/media/src/android/media/cts/MediaControllerTest.java
index a153c4da..caf2a94 100644
--- a/tests/tests/media/src/android/media/cts/MediaControllerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaControllerTest.java
@@ -21,6 +21,7 @@
 import android.media.session.MediaController;
 import android.media.session.MediaSession;
 import android.media.session.PlaybackState.CustomAction;
+import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
@@ -182,6 +183,14 @@
             assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
 
             mCallback.reset();
+            final Uri uri = Uri.parse("content://test/popcorn.mod");
+            controls.playFromUri(uri, extras);
+            mWaitLock.wait(TIME_OUT_MS);
+            assertTrue(mCallback.mOnPlayFromUriCalled);
+            assertEquals(uri, mCallback.mUri);
+            assertEquals(EXTRAS_VALUE, mCallback.mExtras.getString(EXTRAS_KEY));
+
+            mCallback.reset();
             final String action = "test-action";
             controls.sendCustomAction(action, extras);
             mWaitLock.wait(TIME_OUT_MS);
@@ -209,30 +218,32 @@
     }
 
     private class MediaSessionCallback extends MediaSession.Callback {
-        private volatile long mSeekPosition;
-        private volatile long mQueueItemId;
-        private volatile Rating mRating;
-        private volatile String mMediaId;
-        private volatile String mQuery;
-        private volatile String mAction;
-        private volatile String mCommand;
-        private volatile Bundle mExtras;
-        private volatile ResultReceiver mCommandCallback;
+        private long mSeekPosition;
+        private long mQueueItemId;
+        private Rating mRating;
+        private String mMediaId;
+        private String mQuery;
+        private Uri mUri;
+        private String mAction;
+        private String mCommand;
+        private Bundle mExtras;
+        private ResultReceiver mCommandCallback;
 
-        private volatile boolean mOnPlayCalled;
-        private volatile boolean mOnPauseCalled;
-        private volatile boolean mOnStopCalled;
-        private volatile boolean mOnFastForwardCalled;
-        private volatile boolean mOnRewindCalled;
-        private volatile boolean mOnSkipToPreviousCalled;
-        private volatile boolean mOnSkipToNextCalled;
-        private volatile boolean mOnSeekToCalled;
-        private volatile boolean mOnSkipToQueueItemCalled;
-        private volatile boolean mOnSetRatingCalled;
-        private volatile boolean mOnPlayFromMediaIdCalled;
-        private volatile boolean mOnPlayFromSearchCalled;
-        private volatile boolean mOnCustomActionCalled;
-        private volatile boolean mOnCommandCalled;
+        private boolean mOnPlayCalled;
+        private boolean mOnPauseCalled;
+        private boolean mOnStopCalled;
+        private boolean mOnFastForwardCalled;
+        private boolean mOnRewindCalled;
+        private boolean mOnSkipToPreviousCalled;
+        private boolean mOnSkipToNextCalled;
+        private boolean mOnSeekToCalled;
+        private boolean mOnSkipToQueueItemCalled;
+        private boolean mOnSetRatingCalled;
+        private boolean mOnPlayFromMediaIdCalled;
+        private boolean mOnPlayFromSearchCalled;
+        private boolean mOnPlayFromUriCalled;
+        private boolean mOnCustomActionCalled;
+        private boolean mOnCommandCalled;
 
         public void reset() {
             mSeekPosition = -1;
@@ -240,6 +251,7 @@
             mRating = null;
             mMediaId = null;
             mQuery = null;
+            mUri = null;
             mAction = null;
             mExtras = null;
             mCommand = null;
@@ -257,6 +269,7 @@
             mOnSetRatingCalled = false;
             mOnPlayFromMediaIdCalled = false;
             mOnPlayFromSearchCalled = false;
+            mOnPlayFromUriCalled = false;
             mOnCustomActionCalled = false;
             mOnCommandCalled = false;
         }
@@ -356,6 +369,16 @@
         }
 
         @Override
+        public void onPlayFromUri(Uri uri, Bundle extras) {
+            synchronized (mWaitLock) {
+                mOnPlayFromUriCalled = true;
+                mUri = uri;
+                mExtras = extras;
+                mWaitLock.notify();
+            }
+        }
+
+        @Override
         public void onCustomAction(String action, Bundle extras) {
             synchronized (mWaitLock) {
                 mOnCustomActionCalled= true;
diff --git a/tests/tests/media/src/android/media/cts/MediaDrmMockTest.java b/tests/tests/media/src/android/media/cts/MediaDrmMockTest.java
index 1a3184d..a197cca 100644
--- a/tests/tests/media/src/android/media/cts/MediaDrmMockTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaDrmMockTest.java
@@ -17,9 +17,10 @@
 package android.media.cts;
 
 import android.media.MediaDrm;
-import android.media.MediaDrm.ProvisionRequest;
-import android.media.MediaDrm.KeyRequest;
 import android.media.MediaDrm.CryptoSession;
+import android.media.MediaDrm.KeyRequest;
+import android.media.MediaDrm.KeyStatus;
+import android.media.MediaDrm.ProvisionRequest;
 import android.media.MediaDrmException;
 import android.media.NotProvisionedException;
 import android.media.ResourceBusyException;
@@ -231,6 +232,7 @@
         md.setPropertyByteArray("mock-request", testRequest);
         String testDefaultUrl = "http://1.2.3.4:8080/blah";
         md.setPropertyString("mock-defaultUrl", testDefaultUrl);
+        md.setPropertyString("mock-keyRequestType", "1" /*kKeyRequestType_Initial*/);
 
         byte[] initData = {0x0a, 0x0b, 0x0c, 0x0d};
         HashMap<String, String> optionalParameters = new HashMap<String, String>();
@@ -243,6 +245,7 @@
                                                       optionalParameters);
         assertTrue(Arrays.equals(request.getData(), testRequest));
         assertTrue(request.getDefaultUrl().equals(testDefaultUrl));
+        assertEquals(request.getRequestType(), MediaDrm.KeyRequest.REQUEST_TYPE_INITIAL);
 
         assertTrue(Arrays.equals(initData, md.getPropertyByteArray("mock-initdata")));
         assertTrue(mimeType.equals(md.getPropertyString("mock-mimetype")));
@@ -265,6 +268,7 @@
         md.setPropertyByteArray("mock-request", testRequest);
         String testDefaultUrl = "http://1.2.3.4:8080/blah";
         md.setPropertyString("mock-defaultUrl", testDefaultUrl);
+        md.setPropertyString("mock-keyRequestType", "1" /*kKeyRequestType_Initial*/);
 
         byte[] initData = {0x0a, 0x0b, 0x0c, 0x0d};
 
@@ -274,6 +278,7 @@
                                                       null);
         assertTrue(Arrays.equals(request.getData(), testRequest));
         assertTrue(request.getDefaultUrl().equals(testDefaultUrl));
+        assertEquals(request.getRequestType(), MediaDrm.KeyRequest.REQUEST_TYPE_INITIAL);
 
         assertTrue(Arrays.equals(initData, md.getPropertyByteArray("mock-initdata")));
         assertTrue(mimeType.equals(md.getPropertyString("mock-mimetype")));
@@ -295,6 +300,7 @@
         md.setPropertyByteArray("mock-request", testRequest);
         String testDefaultUrl = "http://1.2.3.4:8080/blah";
         md.setPropertyString("mock-defaultUrl", testDefaultUrl);
+        md.setPropertyString("mock-keyRequestType", "2" /*kKeyRequestType_Renewal*/);
 
         byte[] initData = {0x0a, 0x0b, 0x0c, 0x0d};
 
@@ -304,6 +310,7 @@
                                               null);
         assertTrue(Arrays.equals(request.getData(), testRequest));
         assertTrue(request.getDefaultUrl().equals(testDefaultUrl));
+        assertEquals(request.getRequestType(), MediaDrm.KeyRequest.REQUEST_TYPE_RENEWAL);
 
         assertTrue(Arrays.equals(initData, md.getPropertyByteArray("mock-initdata")));
         assertTrue(mimeType.equals(md.getPropertyString("mock-mimetype")));
@@ -325,6 +332,7 @@
         md.setPropertyByteArray("mock-request", testRequest);
         String testDefaultUrl = "http://1.2.3.4:8080/blah";
         md.setPropertyString("mock-defaultUrl", testDefaultUrl);
+        md.setPropertyString("mock-keyRequestType", "3" /*kKeyRequestType_Release*/);
 
         String mimeType = "video/iso.segment";
         KeyRequest request = md.getKeyRequest(sessionId, null, mimeType,
@@ -332,6 +340,7 @@
                                               null);
         assertTrue(Arrays.equals(request.getData(), testRequest));
         assertTrue(request.getDefaultUrl().equals(testDefaultUrl));
+        assertEquals(request.getRequestType(), MediaDrm.KeyRequest.REQUEST_TYPE_RELEASE);
 
         assertTrue(mimeType.equals(md.getPropertyString("mock-mimetype")));
         assertTrue(md.getPropertyString("mock-keytype").equals("2"));
@@ -780,6 +789,170 @@
         assertTrue(mGotEvent);
     }
 
+    public void testExpirationUpdate() throws Exception {
+        if (!isMockPluginInstalled()) {
+            return;
+        }
+
+
+        new Thread() {
+            @Override
+            public void run() {
+                // Set up a looper to be used by mMediaPlayer.
+                Looper.prepare();
+
+                // Save the looper so that we can terminate this thread
+                // after we are done with it.
+                mLooper = Looper.myLooper();
+
+                try {
+                    mMediaDrm = new MediaDrm(mockScheme);
+                } catch (MediaDrmException e) {
+                    e.printStackTrace();
+                    fail();
+                }
+
+
+                final byte[] expected_sessionId = openSession(mMediaDrm);
+
+                mMediaDrm.setPropertyByteArray("mock-event-session-id", expected_sessionId);
+
+                synchronized(mLock) {
+                    mLock.notify();
+
+                    mMediaDrm.setOnExpirationUpdateListener(new MediaDrm.OnExpirationUpdateListener() {
+                            @Override
+                            public void onExpirationUpdate(MediaDrm md, byte[] sessionId,
+                                    long expiryTimeMS) {
+                                synchronized(mLock) {
+                                    Log.d(TAG,"testExpirationUpdate.onExpirationUpdate");
+                                    assertTrue(md == mMediaDrm);
+                                    assertTrue(Arrays.equals(sessionId, expected_sessionId));
+                                    assertTrue(expiryTimeMS == 123456789012345L);
+                                    mGotEvent = true;
+                                    mLock.notify();
+                                }
+                            }
+                        }, null);
+                }
+                Looper.loop();  // Blocks forever until Looper.quit() is called.
+            }
+        }.start();
+
+        // wait for mMediaDrm to be created
+        synchronized(mLock) {
+            try {
+                mLock.wait(1000);
+            } catch (Exception e) {
+            }
+        }
+        assertTrue(mMediaDrm != null);
+
+        mGotEvent = false;
+        mMediaDrm.setPropertyString("mock-send-expiration-update", "123456789012345");
+
+        synchronized(mLock) {
+            try {
+                mLock.wait(1000);
+            } catch (Exception e) {
+            }
+        }
+
+        mLooper.quit();
+        assertTrue(mGotEvent);
+    }
+
+    public void testKeyStatusChange() throws Exception {
+        if (!isMockPluginInstalled()) {
+            return;
+        }
+
+
+        new Thread() {
+            @Override
+            public void run() {
+                // Set up a looper to be used by mMediaPlayer.
+                Looper.prepare();
+
+                // Save the looper so that we can terminate this thread
+                // after we are done with it.
+                mLooper = Looper.myLooper();
+
+                try {
+                    mMediaDrm = new MediaDrm(mockScheme);
+                } catch (MediaDrmException e) {
+                    e.printStackTrace();
+                    fail();
+                }
+
+
+                final byte[] expected_sessionId = openSession(mMediaDrm);
+
+                mMediaDrm.setPropertyByteArray("mock-event-session-id", expected_sessionId);
+
+                synchronized(mLock) {
+                    mLock.notify();
+
+                    mMediaDrm.setOnKeyStatusChangeListener(new MediaDrm.OnKeyStatusChangeListener() {
+                            @Override
+                            public void onKeyStatusChange(MediaDrm md, byte[] sessionId,
+                                    List<KeyStatus> keyInformation, boolean hasNewUsableKey) {
+                                synchronized(mLock) {
+                                    Log.d(TAG,"testKeyStatusChange.onKeyStatusChange");
+                                    assertTrue(md == mMediaDrm);
+                                    assertTrue(Arrays.equals(sessionId, expected_sessionId));
+                                    try {
+                                        KeyStatus keyStatus = keyInformation.get(0);
+                                        assertTrue(Arrays.equals(keyStatus.getKeyId(), "key1".getBytes()));
+                                        assertTrue(keyStatus.getStatusCode() == MediaDrm.KeyStatus.STATUS_USABLE);
+                                        keyStatus = keyInformation.get(1);
+                                        assertTrue(Arrays.equals(keyStatus.getKeyId(), "key2".getBytes()));
+                                        assertTrue(keyStatus.getStatusCode() == MediaDrm.KeyStatus.STATUS_EXPIRED);
+                                        keyStatus = keyInformation.get(2);
+                                        assertTrue(Arrays.equals(keyStatus.getKeyId(), "key3".getBytes()));
+                                        assertTrue(keyStatus.getStatusCode() == MediaDrm.KeyStatus.STATUS_OUTPUT_NOT_ALLOWED);
+                                        keyStatus = keyInformation.get(3);
+                                        assertTrue(Arrays.equals(keyStatus.getKeyId(), "key4".getBytes()));
+                                        assertTrue(keyStatus.getStatusCode() == MediaDrm.KeyStatus.STATUS_PENDING);
+                                        keyStatus = keyInformation.get(4);
+                                        assertTrue(Arrays.equals(keyStatus.getKeyId(), "key5".getBytes()));
+                                        assertTrue(keyStatus.getStatusCode() == MediaDrm.KeyStatus.STATUS_INTERNAL_ERROR);
+                                        assertTrue(hasNewUsableKey);
+                                        mGotEvent = true;
+                                    } catch (IndexOutOfBoundsException e) {
+                                    }
+                                    mLock.notify();
+                                }
+                            }
+                        }, null);
+                }
+                Looper.loop();  // Blocks forever until Looper.quit() is called.
+            }
+        }.start();
+
+        // wait for mMediaDrm to be created
+        synchronized(mLock) {
+            try {
+                mLock.wait(1000);
+            } catch (Exception e) {
+            }
+        }
+        assertTrue(mMediaDrm != null);
+
+        mGotEvent = false;
+        mMediaDrm.setPropertyString("mock-send-keys-change", "123456789012345");
+
+        synchronized(mLock) {
+            try {
+                mLock.wait(1000);
+            } catch (Exception e) {
+            }
+        }
+
+        mLooper.quit();
+        assertTrue(mGotEvent);
+    }
+
     private byte[] openSession(MediaDrm md) {
         byte[] sessionId = null;
         try {
diff --git a/tests/tests/media/src/android/media/cts/MediaExtractorTest.java b/tests/tests/media/src/android/media/cts/MediaExtractorTest.java
new file mode 100644
index 0000000..9db54ff
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/MediaExtractorTest.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2015 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.media.cts;
+
+import com.android.cts.media.R;
+
+import android.content.res.AssetFileDescriptor;
+import android.content.res.Resources;
+import android.media.MediaDataSource;
+import android.media.MediaExtractor;
+import android.test.AndroidTestCase;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public class MediaExtractorTest extends AndroidTestCase {
+    protected Resources mResources;
+    protected MediaExtractor mExtractor;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mResources = getContext().getResources();
+        mExtractor = new MediaExtractor();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        mExtractor.release();
+    }
+
+    protected TestMediaDataSource getDataSourceFor(int resid) throws Exception {
+        AssetFileDescriptor afd = mResources.openRawResourceFd(resid);
+        return TestMediaDataSource.fromAssetFd(afd);
+    }
+
+    protected TestMediaDataSource setDataSource(int resid) throws Exception {
+        TestMediaDataSource ds = getDataSourceFor(resid);
+        mExtractor.setDataSource(ds);
+        return ds;
+    }
+
+    public void testNullMediaDataSourceIsRejected() throws Exception {
+        try {
+            mExtractor.setDataSource((MediaDataSource)null);
+            fail("Expected IllegalArgumentException.");
+        } catch (IllegalArgumentException ex) {
+            // Expected, test passed.
+        }
+    }
+
+    public void testMediaDataSourceIsClosedOnRelease() throws Exception {
+        TestMediaDataSource dataSource = setDataSource(R.raw.testvideo);
+        mExtractor.release();
+        assertTrue(dataSource.isClosed());
+    }
+
+    public void testExtractorFailsIfMediaDataSourceThrows() throws Exception {
+        TestMediaDataSource dataSource = getDataSourceFor(R.raw.testvideo);
+        dataSource.throwFromReadAt();
+        try {
+            mExtractor.setDataSource(dataSource);
+            fail("Expected IOException.");
+        } catch (IOException e) {
+            // Expected.
+        }
+    }
+
+    public void testExtractorFailsIfMediaDataSourceReturnsAnError() throws Exception {
+        TestMediaDataSource dataSource = getDataSourceFor(R.raw.testvideo);
+        dataSource.returnFromReadAt(-2);
+        try {
+            mExtractor.setDataSource(dataSource);
+            fail("Expected IOException.");
+        } catch (IOException e) {
+            // Expected.
+        }
+    }
+
+    // Smoke test MediaExtractor reading from a DataSource.
+    public void testExtractFromAMediaDataSource() throws Exception {
+        TestMediaDataSource dataSource = setDataSource(R.raw.testvideo);
+        // 1MB is enough for any sample.
+        final ByteBuffer buf = ByteBuffer.allocate(1024*1024);
+        final int trackCount = mExtractor.getTrackCount();
+
+        for (int i = 0; i < trackCount; i++) {
+            mExtractor.selectTrack(i);
+        }
+
+        for (int i = 0; i < trackCount; i++) {
+            assertTrue(mExtractor.readSampleData(buf, 0) > 0);
+            assertTrue(mExtractor.advance());
+        }
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/MediaMetadataRetrieverTest.java b/tests/tests/media/src/android/media/cts/MediaMetadataRetrieverTest.java
index 30c8370..54e6ef1 100644
--- a/tests/tests/media/src/android/media/cts/MediaMetadataRetrieverTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaMetadataRetrieverTest.java
@@ -20,102 +20,181 @@
 
 import android.content.res.AssetFileDescriptor;
 import android.content.res.Resources;
+import android.cts.util.MediaUtils;
+import android.media.MediaDataSource;
 import android.media.MediaMetadataRetriever;
 import android.test.AndroidTestCase;
 
+import java.io.IOException;
+
 public class MediaMetadataRetrieverTest extends AndroidTestCase {
+    protected Resources mResources;
+    protected MediaMetadataRetriever mRetriever;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+        mResources = getContext().getResources();
+        mRetriever = new MediaMetadataRetriever();
     }
 
     @Override
     protected void tearDown() throws Exception {
         super.tearDown();
+        mRetriever.release();
     }
 
-    public void test3gppMetadata() {
-        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
-
+    protected void setDataSourceFd(int resid) {
         try {
-            Resources resources = getContext().getResources();
-            AssetFileDescriptor afd = resources.openRawResourceFd(R.raw.testvideo);
-
-            retriever.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
-
+            AssetFileDescriptor afd = mResources.openRawResourceFd(resid);
+            mRetriever.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
             afd.close();
         } catch (Exception e) {
             fail("Unable to open file");
         }
+    }
+
+    protected TestMediaDataSource setDataSourceCallback(int resid) {
+        TestMediaDataSource ds = null;
+        try {
+            AssetFileDescriptor afd = mResources.openRawResourceFd(resid);
+            ds = TestMediaDataSource.fromAssetFd(afd);
+            mRetriever.setDataSource(ds);
+        } catch (Exception e) {
+            fail("Unable to open file");
+        }
+        return ds;
+    }
+
+    public void test3gppMetadata() {
+        setDataSourceCallback(R.raw.testvideo);
 
         assertEquals("Title was other than expected",
-                "Title", retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
+                "Title", mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
 
         assertEquals("Artist was other than expected",
                 "UTF16LE エンディアン ",
-                retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST));
+                mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST));
 
         assertEquals("Album was other than expected",
                 "Test album",
-                retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM));
+                mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM));
 
         assertEquals("Track number was other than expected",
                 "10",
-                retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER));
+                mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER));
 
         assertEquals("Year was other than expected",
-                "2013", retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR));
+                "2013", mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR));
 
         assertNull("Writer was unexpected present",
-                retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_WRITER));
+                mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_WRITER));
     }
 
-    public void testSetDataSourceNull() {
-        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
+    public void testID3v2Metadata() {
+        setDataSourceFd(R.raw.video_480x360_mp4_h264_500kbps_25fps_aac_stereo_128kbps_44100hz_id3v2);
 
+        assertEquals("Title was other than expected",
+                "Title", mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
+
+        assertEquals("Artist was other than expected",
+                "UTF16LE エンディアン ",
+                mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST));
+
+        assertEquals("Album was other than expected",
+                "Test album",
+                mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM));
+
+        assertEquals("Track number was other than expected",
+                "10",
+                mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER));
+
+        assertEquals("Year was other than expected",
+                "2013", mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR));
+
+        assertNull("Writer was unexpectedly present",
+                mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_WRITER));
+    }
+
+    public void testSetDataSourceNullPath() {
         try {
-            retriever.setDataSource((String)null);
+            mRetriever.setDataSource((String)null);
             fail("Expected IllegalArgumentException.");
         } catch (IllegalArgumentException ex) {
             // Expected, test passed.
         }
     }
 
-    public void testID3v2Metadata() {
+    public void testNullMediaDataSourceIsRejected() {
+        try {
+            mRetriever.setDataSource((MediaDataSource)null);
+            fail("Expected IllegalArgumentException.");
+        } catch (IllegalArgumentException ex) {
+            // Expected, test passed.
+        }
+    }
+
+    public void testMediaDataSourceIsClosedOnRelease() throws Exception {
+        TestMediaDataSource dataSource = setDataSourceCallback(R.raw.testvideo);
+        mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
+        mRetriever.release();
+        assertTrue(dataSource.isClosed());
+    }
+
+    public void testRetrieveFailsIfMediaDataSourceThrows() throws Exception {
+        TestMediaDataSource dataSource = setDataSourceCallback(R.raw.testvideo);
+        dataSource.throwFromReadAt();
+        assertTrue(mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) == null);
+    }
+
+    public void testRetrieveFailsIfMediaDataSourceReturnsAnError() throws Exception {
+        TestMediaDataSource dataSource = setDataSourceCallback(R.raw.testvideo);
+        dataSource.returnFromReadAt(-2);
+        assertTrue(mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) == null);
+    }
+
+    private void testThumbnail(int resId) {
+        if (!MediaUtils.hasCodecForResourceAndDomain(getContext(), resId, "video/")) {
+            MediaUtils.skipTest("no video codecs for resource");
+            return;
+        }
+
         MediaMetadataRetriever retriever = new MediaMetadataRetriever();
+        Resources resources = getContext().getResources();
+        AssetFileDescriptor afd = resources.openRawResourceFd(resId);
+
+        retriever.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
 
         try {
-            Resources resources = getContext().getResources();
-            AssetFileDescriptor afd = resources.openRawResourceFd(
-                    R.raw.video_480x360_mp4_h264_500kbps_25fps_aac_stereo_128kbps_44100hz_id3v2);
-
-            retriever.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
-
             afd.close();
-        } catch (Exception e) {
+        } catch (IOException e) {
             fail("Unable to open file");
         }
 
-        assertEquals("Title was other than expected",
-                "Title", retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
+        assertNotNull(retriever.getFrameAtTime(-1 /* timeUs (any) */));
+    }
 
-        assertEquals("Artist was other than expected",
-                "UTF16LE エンディアン ",
-                retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST));
+    public void testThumbnailH264() {
+        testThumbnail(R.raw.video_1280x720_mp4_h264_8192kbps_30fps_aac_stereo_128kbps_44100hz);
+    }
 
-        assertEquals("Album was other than expected",
-                "Test album",
-                retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM));
+    public void testThumbnailH263() {
+        testThumbnail(R.raw.video_176x144_3gp_h263_56kbps_12fps_aac_mono_24kbps_11025hz);
+    }
 
-        assertEquals("Track number was other than expected",
-                "10",
-                retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER));
+    public void testThumbnailMPEG4() {
+        testThumbnail(R.raw.video_1280x720_mp4_mpeg4_1000kbps_25fps_aac_stereo_128kbps_44100hz);
+    }
 
-        assertEquals("Year was other than expected",
-                "2013", retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR));
+    public void testThumbnailVP8() {
+        testThumbnail(R.raw.video_640x360_webm_vp8_2048kbps_30fps_vorbis_stereo_128kbps_48000hz);
+    }
 
-        assertNull("Writer was unexpectedly present",
-                retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_WRITER));
+    public void testThumbnailVP9() {
+        testThumbnail(R.raw.video_1280x720_webm_vp9_4096kbps_30fps_vorbis_stereo_128kbps_44100hz);
+    }
+
+    public void testThumbnailHEVC() {
+        testThumbnail(R.raw.video_1280x720_mp4_hevc_1150kbps_30fps_aac_stereo_128kbps_48000hz);
     }
 }
diff --git a/tests/tests/media/src/android/media/cts/MediaMuxerTest.java b/tests/tests/media/src/android/media/cts/MediaMuxerTest.java
index 67eeca0..0f664a5 100644
--- a/tests/tests/media/src/android/media/cts/MediaMuxerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaMuxerTest.java
@@ -104,6 +104,8 @@
             fail("should throw IllegalStateException.");
         } catch (IllegalStateException e) {
             // expected
+        } finally {
+            muxer.release();
         }
 
         // Throws exception b/c 2 video tracks were added.
@@ -115,6 +117,8 @@
             fail("should throw IllegalStateException.");
         } catch (IllegalStateException e) {
             // expected
+        } finally {
+            muxer.release();
         }
 
         // Throws exception b/c 2 audio tracks were added.
@@ -125,6 +129,8 @@
             fail("should throw IllegalStateException.");
         } catch (IllegalStateException e) {
             // expected
+        } finally {
+            muxer.release();
         }
 
         // Throws exception b/c 3 tracks were added.
@@ -137,6 +143,8 @@
             fail("should throw IllegalStateException.");
         } catch (IllegalStateException e) {
             // expected
+        } finally {
+            muxer.release();
         }
 
         // Throws exception b/c no tracks was added.
@@ -146,6 +154,8 @@
             fail("should throw IllegalStateException.");
         } catch (IllegalStateException e) {
             // expected
+        } finally {
+            muxer.release();
         }
 
         // Throws exception b/c a wrong format.
@@ -155,6 +165,8 @@
             fail("should throw IllegalStateException.");
         } catch (IllegalStateException e) {
             // expected
+        } finally {
+            muxer.release();
         }
         new File(outputFile).delete();
     }
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerFlakyNetworkTest.java b/tests/tests/media/src/android/media/cts/MediaPlayerFlakyNetworkTest.java
index 32fbfb5..640083f 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerFlakyNetworkTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerFlakyNetworkTest.java
@@ -23,6 +23,8 @@
 import android.os.SystemClock;
 import android.webkit.cts.CtsTestServer;
 
+import com.android.cts.util.TimeoutReq;
+
 import org.apache.http.HttpServerConnection;
 
 import org.apache.http.impl.DefaultHttpServerConnection;
@@ -67,30 +69,37 @@
         super.tearDown();
     }
 
+    @TimeoutReq(minutes = 5)
     public void test_S0P0() throws Throwable {
         doPlayStreams(0, 0);
     }
 
+    @TimeoutReq(minutes = 10)
     public void test_S1P000005() throws Throwable {
         doPlayStreams(1, 0.000005f);
     }
 
+    @TimeoutReq(minutes = 10)
     public void test_S2P00001() throws Throwable {
         doPlayStreams(2, 0.00001f);
     }
 
+    @TimeoutReq(minutes = 10)
     public void test_S3P00001() throws Throwable {
         doPlayStreams(3, 0.00001f);
     }
 
+    @TimeoutReq(minutes = 10)
     public void test_S4P00001() throws Throwable {
         doPlayStreams(4, 0.00001f);
     }
 
+    @TimeoutReq(minutes = 10)
     public void test_S5P00001() throws Throwable {
         doPlayStreams(5, 0.00001f);
     }
 
+    @TimeoutReq(minutes = 10)
     public void test_S6P00002() throws Throwable {
         doPlayStreams(6, 0.00002f);
     }
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
index 7cdc483..d5b2907 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
@@ -23,12 +23,16 @@
 import android.cts.util.MediaUtils;
 import android.media.AudioManager;
 import android.media.MediaCodec;
+import android.media.MediaDataSource;
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
+import android.media.MediaMetadataRetriever;
 import android.media.MediaPlayer;
 import android.media.MediaPlayer.OnErrorListener;
 import android.media.MediaRecorder;
-import android.media.MediaMetadataRetriever;
+import android.media.MediaTimestamp;
+import android.media.PlaybackParams;
+import android.media.SyncParams;
 import android.media.TimedText;
 import android.media.audiofx.AudioEffect;
 import android.media.audiofx.Visualizer;
@@ -67,6 +71,8 @@
     private static final int  RECORDED_VIDEO_WIDTH  = 176;
     private static final int  RECORDED_VIDEO_HEIGHT = 144;
     private static final long RECORDED_DURATION_MS  = 3000;
+    private static final float FLOAT_TOLERANCE = .0001f;
+
     private Vector<Integer> mTimedTextTrackIndex = new Vector<Integer>();
     private int mSelectedTimedTextIndex;
     private Monitor mOnTimedTextCalled = new Monitor();
@@ -148,10 +154,10 @@
         }
     }
 
-    public void testPlayNullSource() throws Exception {
+    public void testPlayNullSourcePath() throws Exception {
         try {
             mMediaPlayer.setDataSource((String) null);
-            fail("Null URI was accepted");
+            fail("Null path was accepted");
         } catch (RuntimeException e) {
             // expected
         }
@@ -379,10 +385,6 @@
     }
 
     public void testPlayAudioTwice() throws Exception {
-        if (!hasAudioOutput()) {
-            Log.i(LOG_TAG, "SKIPPING testPlayAudioTwice(). No audio output.");
-            return;
-        }
 
         final int resid = R.raw.camera_click;
 
@@ -630,10 +632,6 @@
     }
 
     private void testGapless(int resid1, int resid2) throws Exception {
-        if (!hasAudioOutput()) {
-            Log.i(LOG_TAG, "SKIPPING testPlayAudioTwice(). No audio output.");
-            return;
-        }
 
         MediaPlayer mp1 = new MediaPlayer();
         mp1.setAudioStreamType(AudioManager.STREAM_MUSIC);
@@ -869,6 +867,92 @@
         assertEquals(Integer.parseInt(rotation), angle);
     }
 
+    public void testPlaybackRate() throws Exception {
+        final int toleranceMs = 1000;
+        if (!checkLoadResource(
+                R.raw.video_480x360_mp4_h264_1000kbps_30fps_aac_stereo_128kbps_44100hz)) {
+            return; // skip
+        }
+
+        mMediaPlayer.setDisplay(mActivity.getSurfaceHolder());
+        mMediaPlayer.prepare();
+        SyncParams sync = new SyncParams().allowDefaults();
+        mMediaPlayer.setSyncParams(sync);
+        sync = mMediaPlayer.getSyncParams();
+
+        float[] rates = { 0.25f, 0.5f, 1.0f, 2.0f };
+        for (float playbackRate : rates) {
+            mMediaPlayer.seekTo(0);
+            Thread.sleep(1000);
+            int playTime = 4000;  // The testing clip is about 10 second long.
+            mMediaPlayer.setPlaybackParams(new PlaybackParams().setSpeed(playbackRate));
+            mMediaPlayer.start();
+            Thread.sleep(playTime);
+            PlaybackParams pbp = mMediaPlayer.getPlaybackParams();
+            assertEquals(
+                    playbackRate, pbp.getSpeed(),
+                    FLOAT_TOLERANCE + playbackRate * sync.getTolerance());
+            assertTrue("MediaPlayer should still be playing", mMediaPlayer.isPlaying());
+
+            int playedMediaDurationMs = mMediaPlayer.getCurrentPosition();
+            int diff = Math.abs((int)(playedMediaDurationMs / playbackRate) - playTime);
+            if (diff > toleranceMs) {
+                fail("Media player had error in playback rate " + playbackRate
+                     + ", play time is " + playTime + " vs expected " + playedMediaDurationMs);
+            }
+            mMediaPlayer.pause();
+            pbp = mMediaPlayer.getPlaybackParams();
+            assertEquals(0.f, pbp.getSpeed(), FLOAT_TOLERANCE);
+        }
+        mMediaPlayer.stop();
+    }
+
+    public void testGetTimestamp() throws Exception {
+        final int toleranceUs = 100000;
+        final float playbackRate = 1.0f;
+        if (!checkLoadResource(
+                R.raw.video_480x360_mp4_h264_1000kbps_30fps_aac_stereo_128kbps_44100hz)) {
+            return; // skip
+        }
+
+        mMediaPlayer.setDisplay(mActivity.getSurfaceHolder());
+        mMediaPlayer.prepare();
+        mMediaPlayer.start();
+        mMediaPlayer.setPlaybackParams(new PlaybackParams().setSpeed(playbackRate));
+        Thread.sleep(SLEEP_TIME);  // let player get into stable state.
+        long nt1 = System.nanoTime();
+        MediaTimestamp ts1 = mMediaPlayer.getTimestamp();
+        long nt2 = System.nanoTime();
+        assertTrue("Media player should return a valid time stamp", ts1 != null);
+        assertEquals("MediaPlayer had error in clockRate " + ts1.getMediaClockRate(),
+                playbackRate, ts1.getMediaClockRate(), 0.001f);
+        assertTrue("The nanoTime of Media timestamp should be taken when getTimestamp is called.",
+                nt1 <= ts1.getAnchorSytemNanoTime() && ts1.getAnchorSytemNanoTime() <= nt2);
+
+        mMediaPlayer.pause();
+        ts1 = mMediaPlayer.getTimestamp();
+        assertTrue("Media player should return a valid time stamp", ts1 != null);
+        assertTrue("Media player should have play rate of 0.0f when paused",
+                ts1.getMediaClockRate() == 0.0f);
+
+        mMediaPlayer.seekTo(0);
+        mMediaPlayer.start();
+        Thread.sleep(SLEEP_TIME);  // let player get into stable state.
+        int playTime = 4000;  // The testing clip is about 10 second long.
+        ts1 = mMediaPlayer.getTimestamp();
+        assertTrue("Media player should return a valid time stamp", ts1 != null);
+        Thread.sleep(playTime);
+        MediaTimestamp ts2 = mMediaPlayer.getTimestamp();
+        assertTrue("Media player should return a valid time stamp", ts2 != null);
+        assertTrue("The clockRate should not be changed.",
+                ts1.getMediaClockRate() == ts2.getMediaClockRate());
+        assertEquals("MediaPlayer had error in timestamp.",
+                ts1.getAnchorMediaTimeUs() + (long)(playTime * ts1.getMediaClockRate() * 1000),
+                ts2.getAnchorMediaTimeUs(), toleranceUs);
+
+        mMediaPlayer.stop();
+    }
+
     public void testLocalVideo_MP4_H264_480x360_500kbps_25fps_AAC_Stereo_128kbps_44110Hz()
             throws Exception {
         playVideoTest(
@@ -1069,13 +1153,22 @@
         if (trackInfos == null || trackInfos.length == 0) {
             return;
         }
+
+        Vector<Integer> externalTrackIndex = new Vector<>();
         for (int i = 0; i < trackInfos.length; ++i) {
             assertTrue(trackInfos[i] != null);
-            if (trackInfos[i].getTrackType() ==
-                 MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT) {
-                mTimedTextTrackIndex.add(i);
+            if (trackInfos[i].getTrackType() == MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT) {
+                MediaFormat format = trackInfos[i].getFormat();
+                String mime = format.getString(MediaFormat.KEY_MIME);
+                if (MediaPlayer.MEDIA_MIMETYPE_TEXT_SUBRIP.equals(mime)) {
+                    externalTrackIndex.add(i);
+                } else {
+                    mTimedTextTrackIndex.add(i);
+                }
             }
         }
+
+        mTimedTextTrackIndex.addAll(externalTrackIndex);
     }
 
     private int getTimedTextTrackCount() {
@@ -1501,4 +1594,94 @@
         return getActivity().getPackageManager().hasSystemFeature(
                 PackageManager.FEATURE_MICROPHONE);
     }
+
+    // Smoke test playback from a MediaDataSource.
+    public void testPlaybackFromAMediaDataSource() throws Exception {
+        final int resid = R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz;
+        final int duration = 10000;
+
+        if (!MediaUtils.hasCodecsForResource(mContext, resid)) {
+            return;
+        }
+
+        TestMediaDataSource dataSource =
+                TestMediaDataSource.fromAssetFd(mResources.openRawResourceFd(resid));
+        // Test returning -1 from getSize() to indicate unknown size.
+        dataSource.returnFromGetSize(-1);
+        mMediaPlayer.setDataSource(dataSource);
+        playLoadedVideo(null, null, -1);
+        assertTrue(mMediaPlayer.isPlaying());
+
+        // Test pause and restart.
+        mMediaPlayer.pause();
+        Thread.sleep(SLEEP_TIME);
+        assertFalse(mMediaPlayer.isPlaying());
+        mMediaPlayer.start();
+        assertTrue(mMediaPlayer.isPlaying());
+
+        // Test reset.
+        mMediaPlayer.stop();
+        mMediaPlayer.reset();
+        mMediaPlayer.setDataSource(dataSource);
+        mMediaPlayer.prepare();
+        mMediaPlayer.start();
+        assertTrue(mMediaPlayer.isPlaying());
+
+        // Test seek. Note: the seek position is cached and returned as the
+        // current position so there's no point in comparing them.
+        mMediaPlayer.seekTo(duration - SLEEP_TIME);
+        while (mMediaPlayer.isPlaying()) {
+            Thread.sleep(SLEEP_TIME);
+        }
+    }
+
+    public void testNullMediaDataSourceIsRejected() throws Exception {
+        try {
+            mMediaPlayer.setDataSource((MediaDataSource) null);
+            fail("Null MediaDataSource was accepted");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+    }
+
+    public void testMediaDataSourceIsClosedOnReset() throws Exception {
+        TestMediaDataSource dataSource = new TestMediaDataSource(new byte[0]);
+        mMediaPlayer.setDataSource(dataSource);
+        mMediaPlayer.reset();
+        assertTrue(dataSource.isClosed());
+    }
+
+    public void testPlaybackFailsIfMediaDataSourceThrows() throws Exception {
+        final int resid = R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz;
+        if (!MediaUtils.hasCodecsForResource(mContext, resid)) {
+            return;
+        }
+
+        setOnErrorListener();
+        TestMediaDataSource dataSource =
+                TestMediaDataSource.fromAssetFd(mResources.openRawResourceFd(resid));
+        mMediaPlayer.setDataSource(dataSource);
+        mMediaPlayer.prepare();
+
+        dataSource.throwFromReadAt();
+        mMediaPlayer.start();
+        assertTrue(mOnErrorCalled.waitForSignal());
+    }
+
+    public void testPlaybackFailsIfMediaDataSourceReturnsAnError() throws Exception {
+        final int resid = R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz;
+        if (!MediaUtils.hasCodecsForResource(mContext, resid)) {
+            return;
+        }
+
+        setOnErrorListener();
+        TestMediaDataSource dataSource =
+                TestMediaDataSource.fromAssetFd(mResources.openRawResourceFd(resid));
+        mMediaPlayer.setDataSource(dataSource);
+        mMediaPlayer.prepare();
+
+        dataSource.returnFromReadAt(-2);
+        mMediaPlayer.start();
+        assertTrue(mOnErrorCalled.waitForSignal());
+    }
 }
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java b/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
index d089658e..95cb43c 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
@@ -294,11 +294,6 @@
 
     private static class PrepareFailedException extends Exception {}
 
-    public boolean hasAudioOutput() {
-        return getInstrumentation().getTargetContext().getPackageManager()
-            .hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT);
-    }
-
     public boolean isTv() {
         PackageManager pm = getInstrumentation().getTargetContext().getPackageManager();
         return pm.hasSystemFeature(pm.FEATURE_TELEVISION)
@@ -308,4 +303,14 @@
     public boolean checkTv() {
         return MediaUtils.check(isTv(), "not a TV");
     }
+
+    protected void setOnErrorListener() {
+        mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
+            @Override
+            public boolean onError(MediaPlayer mp, int what, int extra) {
+                mOnErrorCalled.signal();
+                return false;
+            }
+        });
+    }
 }
diff --git a/tests/tests/media/src/android/media/cts/MediaRandomTest.java b/tests/tests/media/src/android/media/cts/MediaRandomTest.java
index 7b49a37..e928a8f 100644
--- a/tests/tests/media/src/android/media/cts/MediaRandomTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaRandomTest.java
@@ -282,6 +282,11 @@
 
             final int[] width  = {176, 352, 320, 640, 1280, 1920};
             final int[] height = {144, 288, 240, 480,  720, 1080};
+            final int[] audioSource = {
+                    MediaRecorder.AudioSource.DEFAULT,
+                    MediaRecorder.AudioSource.MIC,
+                    MediaRecorder.AudioSource.CAMCORDER,
+            };
 
             watchdog.start();
             for (int i = 0; i < NUMBER_OF_RECORDER_RANDOM_ACTIONS; i++) {
@@ -292,9 +297,14 @@
                 mParam = (int)(r.nextInt(1000000));
                 try {
                     switch (mAction) {
-                    case 0:
-                        mRecorder.setAudioSource(mParam % 3);
+                    case 0: {
+                        // We restrict the audio sources because setting some sources
+                        // may cause 2+ second delays because the input device may
+                        // retry - loop (e.g. VOICE_UPLINK for voice call to be initiated).
+                        final int index = mParam % audioSource.length;
+                        mRecorder.setAudioSource(audioSource[index]);
                         break;
+                    }
                     case 1:
                         // XXX:
                         // Fix gralloc source and change
diff --git a/tests/tests/media/src/android/media/cts/MediaRecorderTest.java b/tests/tests/media/src/android/media/cts/MediaRecorderTest.java
index 216e21b..f7b6c91 100644
--- a/tests/tests/media/src/android/media/cts/MediaRecorderTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaRecorderTest.java
@@ -18,10 +18,17 @@
 
 import android.content.pm.PackageManager;
 import android.cts.util.MediaUtils;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
 import android.hardware.Camera;
+import android.media.CamcorderProfile;
+import android.media.EncoderCapabilities;
+import android.media.MediaCodec;
 import android.media.MediaFormat;
 import android.media.MediaMetadataRetriever;
 import android.media.MediaRecorder;
+import android.media.EncoderCapabilities.VideoEncoderCap;
 import android.media.MediaRecorder.OnErrorListener;
 import android.media.MediaRecorder.OnInfoListener;
 import android.media.MediaMetadataRetriever;
@@ -38,6 +45,7 @@
 import java.io.FileOutputStream;
 import java.lang.InterruptedException;
 import java.lang.Runnable;
+import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -62,6 +70,12 @@
     private static final int MAX_DURATION_MSEC = 2000;
     private static final float LATITUDE = 0.0000f;
     private static final float LONGITUDE  = -180.0f;
+    private static final int NORMAL_FPS = 30;
+    private static final int TIME_LAPSE_FPS = 5;
+    private static final int SLOW_MOTION_FPS = 120;
+    private static final List<VideoEncoderCap> mVideoEncoders =
+            EncoderCapabilities.getVideoEncoders();
+
     private boolean mOnInfoCalled;
     private boolean mOnErrorCalled;
     private File mOutFile;
@@ -138,8 +152,10 @@
 
     @Override
     protected void tearDown() throws Exception {
-        mMediaRecorder.release();
-        mMediaRecorder = null;
+        if (mMediaRecorder != null) {
+            mMediaRecorder.release();
+            mMediaRecorder = null;
+        }
         if (mOutFile != null && mOutFile.exists()) {
             mOutFile.delete();
         }
@@ -165,19 +181,17 @@
         if (!hasCamera()) {
             return;
         }
-        // Try to get camera first supported resolution.
-        // If we fail for any reason, set the video size to default value.
-        try {
-            camera = Camera.open();
-            width = camera.getParameters().getSupportedPreviewSizes().get(0).width;
-            height = camera.getParameters().getSupportedPreviewSizes().get(0).height;
-        } catch (Exception e) {
+        // Try to get camera profile for QUALITY_LOW; if unavailable,
+        // set the video size to default value.
+        CamcorderProfile profile = CamcorderProfile.get(
+                0 /* cameraId */, CamcorderProfile.QUALITY_LOW);
+        if (profile != null) {
+            width = profile.videoFrameWidth;
+            height = profile.videoFrameHeight;
+        } else {
             width = VIDEO_WIDTH;
             height = VIDEO_HEIGHT;
         }
-        if (camera != null) {
-            camera.release();
-        }
         mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
         mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
         mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
@@ -493,6 +507,441 @@
         assertFalse(mOnErrorCalled);
     }
 
+    private void setupRecorder(String filename, boolean useSurface, boolean hasAudio)
+            throws Exception {
+        int codec = MediaRecorder.VideoEncoder.H264;
+        int frameRate = getMaxFrameRateForCodec(codec);
+        if (mMediaRecorder == null) {
+            mMediaRecorder = new MediaRecorder();
+        }
+
+        if (!useSurface) {
+            mCamera = Camera.open(0);
+            Camera.Parameters params = mCamera.getParameters();
+            frameRate = params.getPreviewFrameRate();
+            mCamera.unlock();
+            mMediaRecorder.setCamera(mCamera);
+            mMediaRecorder.setPreviewDisplay(mActivity.getSurfaceHolder().getSurface());
+        }
+
+        mMediaRecorder.setVideoSource(useSurface ?
+                MediaRecorder.VideoSource.SURFACE : MediaRecorder.VideoSource.CAMERA);
+
+        if (hasAudio) {
+            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
+        }
+
+        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
+        mMediaRecorder.setOutputFile(filename);
+
+        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
+        mMediaRecorder.setVideoFrameRate(frameRate);
+        mMediaRecorder.setVideoSize(VIDEO_WIDTH, VIDEO_HEIGHT);
+
+        if (hasAudio) {
+            mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
+        }
+    }
+
+    private Surface tryGetSurface(boolean shouldThrow) throws Exception {
+        Surface surface = null;
+        try {
+            surface = mMediaRecorder.getSurface();
+            assertFalse("failed to throw IllegalStateException", shouldThrow);
+        } catch (IllegalStateException e) {
+            assertTrue("threw unexpected exception: " + e, shouldThrow);
+        }
+        return surface;
+    }
+
+    private boolean validateGetSurface(boolean useSurface) {
+        Log.v(TAG,"validateGetSurface, useSurface=" + useSurface);
+        if (!useSurface && !hasCamera()) {
+            // pass if testing camera source but no hardware
+            return true;
+        }
+        Surface surface = null;
+        boolean success = true;
+        try {
+            setupRecorder(OUTPUT_PATH, useSurface, false /* hasAudio */);
+
+            /* Test: getSurface() before prepare()
+             * should throw IllegalStateException
+             */
+            surface = tryGetSurface(true /* shouldThow */);
+
+            mMediaRecorder.prepare();
+
+            /* Test: getSurface() after prepare()
+             * should succeed for surface source
+             * should fail for camera source
+             */
+            surface = tryGetSurface(!useSurface);
+
+            mMediaRecorder.start();
+
+            /* Test: getSurface() after start()
+             * should succeed for surface source
+             * should fail for camera source
+             */
+            surface = tryGetSurface(!useSurface);
+
+            try {
+                mMediaRecorder.stop();
+            } catch (Exception e) {
+                // stop() could fail if the recording is empty, as we didn't render anything.
+                // ignore any failure in stop, we just want it stopped.
+            }
+
+            /* Test: getSurface() after stop()
+             * should throw IllegalStateException
+             */
+            surface = tryGetSurface(true /* shouldThow */);
+        } catch (Exception e) {
+            Log.d(TAG, e.toString());
+            success = false;
+        } finally {
+            // reset to clear states, as stop() might have failed
+            mMediaRecorder.reset();
+
+            if (mCamera != null) {
+                mCamera.release();
+                mCamera = null;
+            }
+            if (surface != null) {
+                surface.release();
+                surface = null;
+            }
+        }
+
+        return success;
+    }
+
+    private void trySetInputSurface(Surface surface) throws Exception {
+        boolean testBadArgument = (surface == null);
+        try {
+            mMediaRecorder.setInputSurface(testBadArgument ? new Surface() : surface);
+            fail("failed to throw exception");
+        } catch (IllegalArgumentException e) {
+            // OK only if testing bad arg
+            assertTrue("threw unexpected exception: " + e, testBadArgument);
+        } catch (IllegalStateException e) {
+            // OK only if testing error case other than bad arg
+            assertFalse("threw unexpected exception: " + e, testBadArgument);
+        }
+    }
+
+    private boolean validatePersistentSurface(boolean errorCase) {
+        Log.v(TAG, "validatePersistentSurface, errorCase=" + errorCase);
+
+        Surface surface = MediaCodec.createPersistentInputSurface();
+        if (surface == null) {
+            return false;
+        }
+        Surface dummy = null;
+
+        boolean success = true;
+        try {
+            setupRecorder(OUTPUT_PATH, true /* useSurface */, false /* hasAudio */);
+
+            if (errorCase) {
+                /*
+                 * Test: should throw if called with non-persistent surface
+                 */
+                trySetInputSurface(null);
+            } else {
+                /*
+                 * Test: should succeed if called with a persistent surface before prepare()
+                 */
+                mMediaRecorder.setInputSurface(surface);
+            }
+
+            /*
+             * Test: getSurface() should fail before prepare
+             */
+            dummy = tryGetSurface(true /* shouldThow */);
+
+            mMediaRecorder.prepare();
+
+            /*
+             * Test: setInputSurface() should fail after prepare
+             */
+            trySetInputSurface(surface);
+
+            /*
+             * Test: getSurface() should fail if setInputSurface() succeeded
+             */
+            dummy = tryGetSurface(!errorCase /* shouldThow */);
+
+            mMediaRecorder.start();
+
+            /*
+             * Test: setInputSurface() should fail after start
+             */
+            trySetInputSurface(surface);
+
+            /*
+             * Test: getSurface() should fail if setInputSurface() succeeded
+             */
+            dummy = tryGetSurface(!errorCase /* shouldThow */);
+
+            try {
+                mMediaRecorder.stop();
+            } catch (Exception e) {
+                // stop() could fail if the recording is empty, as we didn't render anything.
+                // ignore any failure in stop, we just want it stopped.
+            }
+
+            /*
+             * Test: getSurface() should fail after stop
+             */
+            dummy = tryGetSurface(true /* shouldThow */);
+        } catch (Exception e) {
+            Log.d(TAG, e.toString());
+            success = false;
+        } finally {
+            // reset to clear states, as stop() might have failed
+            mMediaRecorder.reset();
+
+            if (mCamera != null) {
+                mCamera.release();
+                mCamera = null;
+            }
+            if (surface != null) {
+                surface.release();
+                surface = null;
+            }
+            if (dummy != null) {
+                dummy.release();
+                dummy = null;
+            }
+        }
+
+        return success;
+    }
+
+    public void testGetSurfaceApi() {
+        if (!hasH264()) {
+            MediaUtils.skipTest("no codecs");
+            return;
+        }
+
+        if (hasCamera()) {
+            // validate getSurface() with CAMERA source
+            assertTrue(validateGetSurface(false /* useSurface */));
+        }
+
+        // validate getSurface() with SURFACE source
+        assertTrue(validateGetSurface(true /* useSurface */));
+    }
+
+    public void testPersistentSurfaceApi() {
+        if (!hasH264()) {
+            MediaUtils.skipTest("no codecs");
+            return;
+        }
+
+        // test valid use case
+        assertTrue(validatePersistentSurface(false /* errorCase */));
+
+        // test invalid use case
+        assertTrue(validatePersistentSurface(true /* errorCase */));
+    }
+
+    private static int getMaxFrameRateForCodec(int codec) {
+        for (VideoEncoderCap cap : mVideoEncoders) {
+            if (cap.mCodec == codec) {
+                return cap.mMaxFrameRate < NORMAL_FPS ? cap.mMaxFrameRate : NORMAL_FPS;
+            }
+        }
+        fail("didn't find max FPS for codec");
+        return -1;
+    }
+
+    private boolean recordFromSurface(
+            String filename,
+            int captureRate,
+            boolean hasAudio,
+            Surface persistentSurface) {
+        Log.v(TAG, "recordFromSurface");
+        Surface surface = null;
+        try {
+            setupRecorder(filename, true /* useSurface */, hasAudio);
+
+            int sleepTimeMs;
+            if (captureRate > 0) {
+                mMediaRecorder.setCaptureRate(captureRate);
+                sleepTimeMs = 1000 / captureRate;
+            } else {
+                sleepTimeMs = 1000 / getMaxFrameRateForCodec(MediaRecorder.VideoEncoder.H264);
+            }
+
+            if (persistentSurface != null) {
+                Log.v(TAG, "using persistent surface");
+                surface = persistentSurface;
+                mMediaRecorder.setInputSurface(surface);
+            }
+
+            mMediaRecorder.prepare();
+
+            if (persistentSurface == null) {
+                surface = mMediaRecorder.getSurface();
+            }
+
+            Paint paint = new Paint();
+            paint.setTextSize(16);
+            paint.setColor(Color.RED);
+            int i;
+
+            /* Test: draw 10 frames at 30fps before start
+             * these should be dropped and not causing malformed stream.
+             */
+            for(i = 0; i < 10; i++) {
+                Canvas canvas = surface.lockCanvas(null);
+                int background = (i * 255 / 99);
+                canvas.drawARGB(255, background, background, background);
+                String text = "Frame #" + i;
+                canvas.drawText(text, 50, 50, paint);
+                surface.unlockCanvasAndPost(canvas);
+                Thread.sleep(sleepTimeMs);
+            }
+
+            Log.v(TAG, "start");
+            mMediaRecorder.start();
+
+            /* Test: draw another 90 frames at 30fps after start */
+            for(i = 10; i < 100; i++) {
+                Canvas canvas = surface.lockCanvas(null);
+                int background = (i * 255 / 99);
+                canvas.drawARGB(255, background, background, background);
+                String text = "Frame #" + i;
+                canvas.drawText(text, 50, 50, paint);
+                surface.unlockCanvasAndPost(canvas);
+                Thread.sleep(sleepTimeMs);
+            }
+
+            Log.v(TAG, "stop");
+            mMediaRecorder.stop();
+        } catch (Exception e) {
+            Log.v(TAG, "record video failed: " + e.toString());
+            return false;
+        } finally {
+            // We need to test persistent surface across multiple MediaRecorder
+            // instances, so must destroy mMediaRecorder here.
+            if (mMediaRecorder != null) {
+                mMediaRecorder.release();
+                mMediaRecorder = null;
+            }
+
+            // release surface if not using persistent surface
+            if (persistentSurface == null && surface != null) {
+                surface.release();
+                surface = null;
+            }
+        }
+        return true;
+    }
+
+    private boolean checkCaptureFps(String filename, int captureRate) {
+        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
+
+        retriever.setDataSource(filename);
+
+        // verify capture rate meta key is present and correct
+        String captureFps = retriever.extractMetadata(
+                MediaMetadataRetriever.METADATA_KEY_CAPTURE_FRAMERATE);
+
+        if (captureFps == null) {
+            Log.d(TAG, "METADATA_KEY_CAPTURE_FRAMERATE is missing");
+            return false;
+        }
+
+        if (Math.abs(Float.parseFloat(captureFps) - captureRate) > 0.001) {
+            Log.d(TAG, "METADATA_KEY_CAPTURE_FRAMERATE is incorrect: "
+                    + captureFps + "vs. " + captureRate);
+            return false;
+        }
+
+        // verify other meta keys here if necessary
+        return true;
+    }
+
+    private boolean testRecordFromSurface(boolean persistent, boolean timelapse) {
+        Log.v(TAG, "testRecordFromSurface: " +
+                   "persistent=" + persistent + ", timelapse=" + timelapse);
+        boolean success = false;
+        Surface surface = null;
+        int noOfFailure = 0;
+        try {
+            if (persistent) {
+                surface = MediaCodec.createPersistentInputSurface();
+            }
+
+            for (int k = 0; k < 2; k++) {
+                String filename = (k == 0) ? OUTPUT_PATH : OUTPUT_PATH2;
+                boolean hasAudio = false;
+                int captureRate = 0;
+
+                if (timelapse) {
+                    // if timelapse/slow-mo, k chooses between low/high capture fps
+                    captureRate = (k == 0) ? TIME_LAPSE_FPS : SLOW_MOTION_FPS;
+                } else {
+                    // otherwise k chooses between no-audio and audio
+                    hasAudio = (k == 0) ? false : true;
+                }
+
+                if (hasAudio && (!hasMicrophone() || !hasAmrNb())) {
+                    // audio test waived if no audio support
+                    continue;
+                }
+
+                Log.v(TAG, "testRecordFromSurface - round " + k);
+                success = recordFromSurface(filename, captureRate, hasAudio, surface);
+                if (success) {
+                    checkTracksAndDuration(0, true /* hasVideo */, hasAudio, filename);
+
+                    // verify capture fps meta key
+                    if (timelapse && !checkCaptureFps(filename, captureRate)) {
+                        noOfFailure++;
+                    }
+                }
+                if (!success) {
+                    noOfFailure++;
+                }
+            }
+        } catch (Exception e) {
+            Log.v(TAG, e.toString());
+            noOfFailure++;
+        } finally {
+            if (surface != null) {
+                Log.v(TAG, "releasing persistent surface");
+                surface.release();
+                surface = null;
+            }
+        }
+        return (noOfFailure == 0);
+    }
+
+    // Test recording from surface source with/without audio)
+    public void testSurfaceRecording() {
+        assertTrue(testRecordFromSurface(false /* persistent */, false /* timelapse */));
+    }
+
+    // Test recording from persistent surface source with/without audio
+    public void testPersistentSurfaceRecording() {
+        assertTrue(testRecordFromSurface(true /* persistent */, false /* timelapse */));
+    }
+
+    // Test timelapse recording from surface without audio
+    public void testSurfaceRecordingTimeLapse() {
+        assertTrue(testRecordFromSurface(false /* persistent */, true /* timelapse */));
+    }
+
+    // Test timelapse recording from persisent surface without audio
+    public void testPersistentSurfaceRecordingTimeLapse() {
+        assertTrue(testRecordFromSurface(true /* persistent */, true /* timelapse */));
+    }
+
     private void recordMedia(long maxFileSize, File outFile) throws Exception {
         mMediaRecorder.setMaxFileSize(maxFileSize);
         mMediaRecorder.prepare();
diff --git a/tests/tests/media/src/android/media/cts/MediaScannerTest.java b/tests/tests/media/src/android/media/cts/MediaScannerTest.java
index 4b42690..af7cfaa 100644
--- a/tests/tests/media/src/android/media/cts/MediaScannerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaScannerTest.java
@@ -390,8 +390,6 @@
                     new String[] {"电视原声带", "格斗天王(限量精装版)(预购版)", null, "11.Open Arms.( cn808.net )", null} ),
             new MediaScanEntry(R.raw.gb18030_4,
                     new String[] {"莫扎特", "黄金古典", "柏林爱乐乐团", "第25号交响曲", "莫扎特"} ),
-            new MediaScanEntry(R.raw.gb18030_5,
-                    new String[] {"光良", "童话", "光良", "02.童话", "鍏夎壇"} ),
             new MediaScanEntry(R.raw.gb18030_6,
                     new String[] {"张韶涵", "潘朵拉", "張韶涵", "隐形的翅膀", "王雅君"} ),
             new MediaScanEntry(R.raw.gb18030_7, // this is actually utf-8
diff --git a/tests/tests/media/src/android/media/cts/MediaSessionTest.java b/tests/tests/media/src/android/media/cts/MediaSessionTest.java
index f4a30e8..3ebe6e4 100644
--- a/tests/tests/media/src/android/media/cts/MediaSessionTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaSessionTest.java
@@ -26,10 +26,12 @@
 import android.media.VolumeProvider;
 import android.media.session.MediaController;
 import android.media.session.MediaSession;
+import android.media.session.MediaSession.QueueItem;
 import android.media.session.PlaybackState;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
+import android.os.Message;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 
@@ -44,6 +46,7 @@
     private static final String TEST_SESSION_TAG = "test-session-tag";
     private static final String TEST_KEY = "test-key";
     private static final String TEST_VALUE = "test-val";
+    private static final String TEST_SESSION_EVENT = "test-session-event";
     private static final int TEST_CURRENT_VOLUME = 10;
     private static final int TEST_MAX_VOLUME = 11;
     private static final long TEST_QUEUE_ID = 12L;
@@ -58,7 +61,7 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+        mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
         mSession = new MediaSession(getContext(), TEST_SESSION_TAG);
     }
 
@@ -163,8 +166,8 @@
 
             // test setQueue and setQueueTitle
             mCallback.resetLocked();
-            List<MediaSession.QueueItem> queue = new ArrayList<MediaSession.QueueItem>();
-            MediaSession.QueueItem item = new MediaSession.QueueItem(new MediaDescription.Builder()
+            List<QueueItem> queue = new ArrayList<>();
+            QueueItem item = new QueueItem(new MediaDescription.Builder()
                     .setMediaId(TEST_VALUE).setTitle("title").build(), TEST_QUEUE_ID);
             queue.add(item);
             mSession.setQueue(queue);
@@ -209,6 +212,15 @@
             mSession.setActive(true);
             assertTrue(mSession.isActive());
 
+            // test sendSessionEvent
+            mCallback.resetLocked();
+            mSession.sendSessionEvent(TEST_SESSION_EVENT, extras);
+            mWaitLock.wait(TIME_OUT_MS);
+
+            assertTrue(mCallback.mOnSessionEventCalled);
+            assertEquals(TEST_SESSION_EVENT, mCallback.mEvent);
+            assertEquals(TEST_VALUE, mCallback.mExtras.getString(TEST_KEY));
+
             // test release
             mCallback.resetLocked();
             mSession.release();
@@ -246,8 +258,9 @@
                 info = mCallback.mPlaybackInfo;
                 if (info != null && info.getCurrentVolume() == TEST_CURRENT_VOLUME
                         && info.getMaxVolume() == TEST_MAX_VOLUME
-                        && info.getPlaybackType() == MediaController.PlaybackInfo.PLAYBACK_TYPE_REMOTE
-                        && info.getVolumeControl() == VolumeProvider.VOLUME_CONTROL_FIXED) {
+                        && info.getVolumeControl() == VolumeProvider.VOLUME_CONTROL_FIXED
+                        && info.getPlaybackType()
+                                == MediaController.PlaybackInfo.PLAYBACK_TYPE_REMOTE) {
                     break;
                 }
             }
@@ -277,6 +290,23 @@
         }
     }
 
+    /**
+     * Tests MediaSession.QueueItem.
+     */
+    public void testQueueItem() {
+        QueueItem item = new QueueItem(new MediaDescription.Builder()
+                .setMediaId("media-id").setTitle("title").build(), TEST_QUEUE_ID);
+        assertEquals(TEST_QUEUE_ID, item.getQueueId());
+        assertEquals("media-id", item.getDescription().getMediaId());
+        assertEquals("title", item.getDescription().getTitle());
+
+        Parcel p = Parcel.obtain();
+        item.writeToParcel(p, 0);
+        p.setDataPosition(0);
+        QueueItem other = QueueItem.CREATOR.createFromParcel(p);
+        assertEquals(item.toString(), other.toString());
+        p.recycle();
+    }
 
     /**
      * Verifies that a new session hasn't had any configuration bits set yet.
@@ -318,11 +348,13 @@
         private volatile boolean mOnExtraChangedCalled;
         private volatile boolean mOnAudioInfoChangedCalled;
         private volatile boolean mOnSessionDestroyedCalled;
+        private volatile boolean mOnSessionEventCalled;
 
         private volatile PlaybackState mPlaybackState;
         private volatile MediaMetadata mMediaMetadata;
-        private volatile List<MediaSession.QueueItem> mQueue;
+        private volatile List<QueueItem> mQueue;
         private volatile CharSequence mTitle;
+        private volatile String mEvent;
         private volatile Bundle mExtras;
         private volatile MediaController.PlaybackInfo mPlaybackInfo;
 
@@ -334,6 +366,7 @@
             mOnExtraChangedCalled = false;
             mOnAudioInfoChangedCalled = false;
             mOnSessionDestroyedCalled = false;
+            mOnSessionEventCalled = false;
 
             mPlaybackState = null;
             mMediaMetadata = null;
@@ -362,7 +395,7 @@
         }
 
         @Override
-        public void onQueueChanged(List<MediaSession.QueueItem> queue) {
+        public void onQueueChanged(List<QueueItem> queue) {
             synchronized (mWaitLock) {
                 mOnQueueChangedCalled = true;
                 mQueue = queue;
@@ -404,5 +437,15 @@
                 mWaitLock.notify();
             }
         }
+
+        @Override
+        public void onSessionEvent(String event, Bundle extras) {
+            synchronized (mWaitLock) {
+                mOnSessionEventCalled = true;
+                mEvent = event;
+                mExtras = (Bundle) extras.clone();
+                mWaitLock.notify();
+            }
+        }
     }
 }
diff --git a/tests/tests/media/src/android/media/cts/MediaSyncTest.java b/tests/tests/media/src/android/media/cts/MediaSyncTest.java
new file mode 100644
index 0000000..c4fe4c1
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/MediaSyncTest.java
@@ -0,0 +1,754 @@
+/*
+ * Copyright 2015 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.media.cts;
+
+import com.android.cts.media.R;
+
+import android.content.Context;
+import android.content.res.AssetFileDescriptor;
+import android.content.res.Resources;
+import android.cts.util.MediaUtils;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+import android.media.MediaCodec;
+import android.media.MediaCodecInfo;
+import android.media.MediaCodecList;
+import android.media.MediaExtractor;
+import android.media.MediaFormat;
+import android.media.MediaSync;
+import android.media.MediaTimestamp;
+import android.media.PlaybackParams;
+import android.media.SyncParams;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
+import android.view.Surface;
+import android.view.SurfaceHolder;
+
+import java.io.IOException;
+import java.lang.Long;
+import java.nio.ByteBuffer;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.List;
+import java.util.LinkedList;
+
+/**
+ * Tests for the MediaSync API and local video/audio playback.
+ *
+ * <p>The file in res/raw used by all tests are (c) copyright 2008,
+ * Blender Foundation / www.bigbuckbunny.org, and are licensed under the Creative Commons
+ * Attribution 3.0 License at http://creativecommons.org/licenses/by/3.0/us/.
+ */
+public class MediaSyncTest extends ActivityInstrumentationTestCase2<MediaStubActivity> {
+    private static final String LOG_TAG = "MediaSyncTest";
+
+    private final long NO_TIMESTAMP = -1;
+    private final float FLOAT_PLAYBACK_RATE_TOLERANCE = .02f;
+    private final long TIME_MEASUREMENT_TOLERANCE_US = 20000;
+    final int INPUT_RESOURCE_ID =
+            R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz;
+    private final int APPLICATION_AUDIO_PERIOD_MS = 200;
+    private final int TEST_MAX_SPEED = 2;
+    private static final float FLOAT_TOLERANCE = .00001f;
+
+    private Context mContext;
+    private Resources mResources;
+
+    private MediaStubActivity mActivity;
+
+    private MediaSync mMediaSync = null;
+    private Surface mSurface = null;
+    private AudioTrack mAudioTrack = null;
+
+    private Decoder mDecoderVideo = null;
+    private Decoder mDecoderAudio = null;
+    private boolean mHasAudio = false;
+    private boolean mHasVideo = false;
+    private boolean mEosAudio = false;
+    private boolean mEosVideo = false;
+    private final Object mConditionEos = new Object();
+    private final Object mConditionEosAudio = new Object();
+
+    private int mNumBuffersReturned = 0;
+
+    public MediaSyncTest() {
+        super(MediaStubActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+        getInstrumentation().waitForIdleSync();
+        try {
+            runTestOnUiThread(new Runnable() {
+                public void run() {
+                    mMediaSync = new MediaSync();
+                }
+            });
+        } catch (Throwable e) {
+            e.printStackTrace();
+            fail();
+        }
+        mContext = getInstrumentation().getTargetContext();
+        mResources = mContext.getResources();
+        mDecoderVideo = new Decoder(this, mMediaSync, false);
+        mDecoderAudio = new Decoder(this, mMediaSync, true);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mMediaSync != null) {
+            mMediaSync.release();
+            mMediaSync = null;
+        }
+        if (mDecoderAudio != null) {
+            mDecoderAudio.release();
+            mDecoderAudio = null;
+        }
+        if (mDecoderVideo != null) {
+            mDecoderVideo.release();
+            mDecoderVideo = null;
+        }
+        if (mSurface != null) {
+            mSurface.release();
+            mSurface = null;
+        }
+        mActivity = null;
+        super.tearDown();
+    }
+
+    private boolean reachedEos_l() {
+        return ((!mHasVideo || mEosVideo) && (!mHasAudio || mEosAudio));
+    }
+
+    public void onEos(Decoder decoder) {
+        synchronized(mConditionEosAudio) {
+            if (decoder == mDecoderAudio) {
+                mEosAudio = true;
+                mConditionEosAudio.notify();
+            }
+        }
+
+        synchronized(mConditionEos) {
+            if (decoder == mDecoderVideo) {
+                mEosVideo = true;
+            }
+            if (reachedEos_l()) {
+                mConditionEos.notify();
+            }
+        }
+    }
+
+    /**
+     * Tests setPlaybackParams is handled correctly for wrong rate.
+     */
+    public void testSetPlaybackParamsFail() throws InterruptedException {
+        final float rate = -1.0f;
+        try {
+            mMediaSync.setPlaybackParams(new PlaybackParams().setSpeed(rate));
+            fail("playback rate " + rate + " is not handled correctly");
+        } catch (IllegalArgumentException e) {
+        }
+
+        assertTrue("The stream in test file can not be decoded",
+                mDecoderAudio.setup(INPUT_RESOURCE_ID, null, Long.MAX_VALUE));
+
+        // get audio track.
+        mAudioTrack = mDecoderAudio.getAudioTrack();
+
+        mMediaSync.setAudioTrack(mAudioTrack);
+
+        try {
+            mMediaSync.setPlaybackParams(new PlaybackParams().setSpeed(rate));
+            fail("With audio track set, playback rate " + rate
+                    + " is not handled correctly");
+        } catch (IllegalArgumentException e) {
+        }
+    }
+
+    /**
+     * Tests setPlaybackParams is handled correctly for good rate without audio track set.
+     * The case for good rate with audio track set is tested in testPlaybackRate*.
+     */
+    public void testSetPlaybackParamsSucceed() throws InterruptedException {
+        final float rate = (float)TEST_MAX_SPEED;
+        try {
+            mMediaSync.setPlaybackParams(new PlaybackParams().setSpeed(rate));
+            PlaybackParams pbp = mMediaSync.getPlaybackParams();
+            assertEquals(rate, pbp.getSpeed(), FLOAT_TOLERANCE);
+        } catch (IllegalArgumentException e) {
+            fail("playback rate " + rate + " is not handled correctly");
+        }
+    }
+
+    /**
+     * Tests returning audio buffers correctly.
+     */
+    public void testAudioBufferReturn() throws InterruptedException {
+        final int timeOutMs = 10000;
+        boolean completed = runCheckAudioBuffer(INPUT_RESOURCE_ID, timeOutMs);
+        if (!completed) {
+            throw new RuntimeException("timed out waiting for audio buffer return");
+        }
+    }
+
+    private PlaybackParams PAUSED_RATE = new PlaybackParams().setSpeed(0.f);
+    private PlaybackParams NORMAL_RATE = new PlaybackParams().setSpeed(1.f);
+
+    private boolean runCheckAudioBuffer(int inputResourceId, int timeOutMs) {
+        final int NUM_LOOPS = 10;
+        final Object condition = new Object();
+
+        mHasAudio = true;
+        if (mDecoderAudio.setup(inputResourceId, null, Long.MAX_VALUE) == false) {
+            return true;
+        }
+
+        // get audio track.
+        mAudioTrack = mDecoderAudio.getAudioTrack();
+
+        mMediaSync.setAudioTrack(mAudioTrack);
+
+        mMediaSync.setCallback(new MediaSync.Callback() {
+            @Override
+            public void onAudioBufferConsumed(
+                    MediaSync sync, ByteBuffer byteBuffer, int bufferIndex) {
+                Decoder decoderAudio = mDecoderAudio;
+                if (decoderAudio != null) {
+                    decoderAudio.checkReturnedAudioBuffer(byteBuffer, bufferIndex);
+                    decoderAudio.releaseOutputBuffer(bufferIndex, NO_TIMESTAMP);
+                    synchronized (condition) {
+                        ++mNumBuffersReturned;
+                        if (mNumBuffersReturned >= NUM_LOOPS) {
+                            condition.notify();
+                        }
+                    }
+                }
+            }
+        }, null);
+
+        mMediaSync.setPlaybackParams(NORMAL_RATE);
+
+        synchronized (condition) {
+            mDecoderAudio.start();
+
+            try {
+                condition.wait(timeOutMs);
+            } catch (InterruptedException e) {
+            }
+            return (mNumBuffersReturned >= NUM_LOOPS);
+        }
+    }
+
+    /**
+     * Tests flush.
+     */
+    public void testFlush() throws InterruptedException {
+        final int timeOutMs = 5000;
+        boolean completed = runFlush(INPUT_RESOURCE_ID, timeOutMs);
+        if (!completed) {
+            throw new RuntimeException("timed out waiting for flush");
+        }
+    }
+
+    private boolean runFlush(int inputResourceId, int timeOutMs) {
+        final int INDEX_BEFORE_FLUSH = 1;
+        final int INDEX_AFTER_FLUSH = 2;
+        final int BUFFER_SIZE = 1024;
+        final int[] returnedIndex = new int[1];
+        final Object condition = new Object();
+
+        returnedIndex[0] = -1;
+
+        mHasAudio = true;
+        if (mDecoderAudio.setup(inputResourceId, null, Long.MAX_VALUE) == false) {
+            return true;
+        }
+
+        // get audio track.
+        mAudioTrack = mDecoderAudio.getAudioTrack();
+
+        mMediaSync.setAudioTrack(mAudioTrack);
+
+        mMediaSync.setCallback(new MediaSync.Callback() {
+            @Override
+            public void onAudioBufferConsumed(
+                    MediaSync sync, ByteBuffer byteBuffer, int bufferIndex) {
+                synchronized (condition) {
+                    if (returnedIndex[0] == -1) {
+                        returnedIndex[0] = bufferIndex;
+                        condition.notify();
+                    }
+                }
+            }
+        }, null);
+
+        mMediaSync.setOnErrorListener(new MediaSync.OnErrorListener() {
+            @Override
+            public void onError(MediaSync sync, int what, int extra) {
+                fail("got error from media sync (" + what + ", " + extra + ")");
+            }
+        }, null);
+
+        mMediaSync.setPlaybackParams(PAUSED_RATE);
+
+        ByteBuffer buffer1 = ByteBuffer.allocate(BUFFER_SIZE);
+        ByteBuffer buffer2 = ByteBuffer.allocate(BUFFER_SIZE);
+        mMediaSync.queueAudio(buffer1, INDEX_BEFORE_FLUSH, 0 /* presentationTimeUs */);
+        mMediaSync.flush();
+        mMediaSync.queueAudio(buffer2, INDEX_AFTER_FLUSH, 0 /* presentationTimeUs */);
+
+        synchronized (condition) {
+            mMediaSync.setPlaybackParams(NORMAL_RATE);
+
+            try {
+                condition.wait(timeOutMs);
+            } catch (InterruptedException e) {
+            }
+            return (returnedIndex[0] == INDEX_AFTER_FLUSH);
+        }
+    }
+
+    /**
+     * Tests playing back audio successfully.
+     */
+    public void testPlayVideo() throws InterruptedException {
+        playAV(INPUT_RESOURCE_ID, 5000 /* lastBufferTimestampMs */,
+               false /* audio */, true /* video */, 10000 /* timeOutMs */);
+    }
+
+    /**
+     * Tests playing back video successfully.
+     */
+    public void testPlayAudio() throws InterruptedException {
+        playAV(INPUT_RESOURCE_ID, 5000 /* lastBufferTimestampMs */,
+               true /* audio */, false /* video */, 10000 /* timeOutMs */);
+    }
+
+    /**
+     * Tests playing back audio and video successfully.
+     */
+    public void testPlayAudioAndVideo() throws InterruptedException {
+        playAV(INPUT_RESOURCE_ID, 5000 /* lastBufferTimestampMs */,
+               true /* audio */, true /* video */, 10000 /* timeOutMs */);
+    }
+
+    /**
+     * Tests playing at specified playback rate successfully.
+     */
+    public void testPlaybackRateQuarter() throws InterruptedException {
+        playAV(INPUT_RESOURCE_ID, 2000 /* lastBufferTimestampMs */,
+               true /* audio */, true /* video */, 10000 /* timeOutMs */,
+               0.25f /* playbackRate */);
+    }
+    public void testPlaybackRateHalf() throws InterruptedException {
+        playAV(INPUT_RESOURCE_ID, 4000 /* lastBufferTimestampMs */,
+               true /* audio */, true /* video */, 10000 /* timeOutMs */,
+               0.5f /* playbackRate */);
+    }
+    public void testPlaybackRateDouble() throws InterruptedException {
+        playAV(INPUT_RESOURCE_ID, 8000 /* lastBufferTimestampMs */,
+               true /* audio */, true /* video */, 10000 /* timeOutMs */,
+               (float)TEST_MAX_SPEED /* playbackRate */);
+    }
+
+    private void playAV(
+            final int inputResourceId,
+            final long lastBufferTimestampMs,
+            final boolean audio,
+            final boolean video,
+            int timeOutMs) throws InterruptedException {
+        playAV(inputResourceId, lastBufferTimestampMs, audio, video, timeOutMs, 1.0f);
+    }
+
+    private void playAV(
+            final int inputResourceId,
+            final long lastBufferTimestampMs,
+            final boolean audio,
+            final boolean video,
+            int timeOutMs,
+            final float playbackRate) throws InterruptedException {
+        final AtomicBoolean completed = new AtomicBoolean();
+        Thread decodingThread = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                completed.set(runPlayAV(inputResourceId, lastBufferTimestampMs * 1000,
+                        audio, video, playbackRate));
+            }
+        });
+        decodingThread.start();
+        decodingThread.join(timeOutMs);
+        if (!completed.get()) {
+            throw new RuntimeException("timed out decoding to end-of-stream");
+        }
+    }
+
+    private boolean runPlayAV(
+            int inputResourceId,
+            long lastBufferTimestampUs,
+            boolean audio,
+            boolean video,
+            float playbackRate) {
+        // allow 250ms for playback to get to stable state.
+        final int PLAYBACK_RAMP_UP_TIME_MS = 250;
+
+        final Object conditionFirstAudioBuffer = new Object();
+
+        if (video) {
+            mMediaSync.setSurface(mActivity.getSurfaceHolder().getSurface());
+            mSurface = mMediaSync.createInputSurface();
+
+            if (mDecoderVideo.setup(
+                    inputResourceId, mSurface, lastBufferTimestampUs) == false) {
+                return true;
+            }
+            mHasVideo = true;
+        }
+
+        if (audio) {
+            if (mDecoderAudio.setup(inputResourceId, null, lastBufferTimestampUs) == false) {
+                return true;
+            }
+
+            // get audio track.
+            mAudioTrack = mDecoderAudio.getAudioTrack();
+
+            mMediaSync.setAudioTrack(mAudioTrack);
+
+            mMediaSync.setCallback(new MediaSync.Callback() {
+                @Override
+                public void onAudioBufferConsumed(
+                        MediaSync sync, ByteBuffer byteBuffer, int bufferIndex) {
+                    Decoder decoderAudio = mDecoderAudio;
+                    if (decoderAudio != null) {
+                        decoderAudio.releaseOutputBuffer(bufferIndex, NO_TIMESTAMP);
+                    }
+                    synchronized (conditionFirstAudioBuffer) {
+                        conditionFirstAudioBuffer.notify();
+                    }
+                }
+            }, null);
+
+            mHasAudio = true;
+        }
+
+        SyncParams sync = new SyncParams().allowDefaults();
+        mMediaSync.setSyncParams(sync);
+        sync = mMediaSync.getSyncParams();
+
+        mMediaSync.setPlaybackParams(new PlaybackParams().setSpeed(playbackRate));
+
+        synchronized (conditionFirstAudioBuffer) {
+            if (video) {
+                mDecoderVideo.start();
+            }
+            if (audio) {
+                mDecoderAudio.start();
+
+                // wait for the first audio output buffer returned by media sync.
+                try {
+                    conditionFirstAudioBuffer.wait();
+                } catch (InterruptedException e) {
+                    Log.i(LOG_TAG, "worker thread is interrupted.");
+                    return true;
+                }
+            }
+        }
+
+        if (audio) {
+            try {
+                Thread.sleep(PLAYBACK_RAMP_UP_TIME_MS);
+            } catch (InterruptedException e) {
+                Log.i(LOG_TAG, "worker thread is interrupted during sleeping.");
+                return true;
+            }
+
+            MediaTimestamp mediaTimestamp = mMediaSync.getTimestamp();
+            assertTrue("No timestamp available for starting", mediaTimestamp != null);
+            long checkStartTimeRealUs = System.nanoTime() / 1000;
+            long checkStartTimeMediaUs = mediaTimestamp.mediaTimeUs;
+
+            synchronized (mConditionEosAudio) {
+                if (!mEosAudio) {
+                    try {
+                        mConditionEosAudio.wait();
+                    } catch (InterruptedException e) {
+                        Log.i(LOG_TAG, "worker thread is interrupted when waiting for audio EOS.");
+                        return true;
+                    }
+                }
+            }
+            mediaTimestamp = mMediaSync.getTimestamp();
+            assertTrue("No timestamp available for ending", mediaTimestamp != null);
+            long playTimeUs = System.nanoTime() / 1000 - checkStartTimeRealUs;
+            long mediaDurationUs = mediaTimestamp.mediaTimeUs - checkStartTimeMediaUs;
+            assertEquals("Mediasync had error in playback rate " + playbackRate
+                    + ", play time is " + playTimeUs + " vs expected " + mediaDurationUs,
+                    mediaDurationUs,
+                    playTimeUs * playbackRate,
+                    // sync.getTolerance() is MediaSync's tolerance of the playback rate, whereas
+                    // FLOAT_PLAYBACK_RATE_TOLERANCE is our test's tolerance.
+                    // We need to add both to get an upperbound for allowable error.
+                    mediaDurationUs * (sync.getTolerance() + FLOAT_PLAYBACK_RATE_TOLERANCE)
+                            + TIME_MEASUREMENT_TOLERANCE_US);
+        }
+
+        boolean completed = false;
+        synchronized (mConditionEos) {
+            if (!reachedEos_l()) {
+                try {
+                    mConditionEos.wait();
+                } catch (InterruptedException e) {
+                }
+            }
+            completed = reachedEos_l();
+        }
+        return completed;
+    }
+
+    private class Decoder extends MediaCodec.Callback {
+        private final int NO_SAMPLE_RATE = -1;
+        private final int NO_BUFFER_INDEX = -1;
+
+        private MediaSyncTest mMediaSyncTest = null;
+        private MediaSync mMediaSync = null;
+        private boolean mIsAudio = false;
+        private long mLastBufferTimestampUs = 0;
+
+        private Surface mSurface = null;
+
+        private AudioTrack mAudioTrack = null;
+
+        private final Object mConditionCallback = new Object();
+        private MediaExtractor mExtractor = null;
+        private MediaCodec mDecoder = null;
+
+        private final Object mAudioBufferLock = new Object();
+        private List<AudioBuffer> mAudioBuffers = new LinkedList<AudioBuffer>();
+
+        // accessed only on callback thread.
+        private boolean mEos = false;
+        private boolean mSignaledEos = false;
+
+        private class AudioBuffer {
+            public ByteBuffer mByteBuffer;
+            public int mBufferIndex;
+
+            public AudioBuffer(ByteBuffer byteBuffer, int bufferIndex) {
+                mByteBuffer = byteBuffer;
+                mBufferIndex = bufferIndex;
+            }
+        }
+
+        private HandlerThread mHandlerThread;
+        private Handler mHandler;
+
+        Decoder(MediaSyncTest test, MediaSync sync, boolean isAudio) {
+            mMediaSyncTest = test;
+            mMediaSync = sync;
+            mIsAudio = isAudio;
+        }
+
+        public boolean setup(int inputResourceId, Surface surface, long lastBufferTimestampUs) {
+            if (!mIsAudio) {
+                mSurface = surface;
+                // handle video callback in a separate thread as releaseOutputBuffer is blocking
+                mHandlerThread = new HandlerThread("SyncViewVidDec");
+                mHandlerThread.start();
+                mHandler = new Handler(mHandlerThread.getLooper());
+            }
+            mLastBufferTimestampUs = lastBufferTimestampUs;
+            try {
+                // get extrator.
+                String type = mIsAudio ? "audio/" : "video/";
+                mExtractor = MediaUtils.createMediaExtractorForMimeType(
+                        mContext, inputResourceId, type);
+
+                // get decoder.
+                MediaFormat mediaFormat =
+                    mExtractor.getTrackFormat(mExtractor.getSampleTrackIndex());
+                String mimeType = mediaFormat.getString(MediaFormat.KEY_MIME);
+                if (!MediaUtils.hasDecoder(mimeType)) {
+                    Log.i(LOG_TAG, "No decoder found for mimeType= " + mimeType);
+                    return false;
+                }
+                mDecoder = MediaCodec.createDecoderByType(mimeType);
+                mDecoder.configure(mediaFormat, mSurface, null, 0);
+                mDecoder.setCallback(this, mHandler);
+
+                return true;
+            } catch (IOException e) {
+                throw new RuntimeException("error reading input resource", e);
+            }
+        }
+
+        public void start() {
+            if (mDecoder != null) {
+                mDecoder.start();
+            }
+        }
+
+        public void release() {
+            synchronized (mConditionCallback) {
+                if (mDecoder != null) {
+                    try {
+                        mDecoder.stop();
+                    } catch (IllegalStateException e) {
+                    }
+                    mDecoder.release();
+                    mDecoder = null;
+                }
+                if (mExtractor != null) {
+                    mExtractor.release();
+                    mExtractor = null;
+                }
+            }
+
+            if (mAudioTrack != null) {
+                mAudioTrack.release();
+                mAudioTrack = null;
+            }
+        }
+
+        public AudioTrack getAudioTrack() {
+            if (!mIsAudio) {
+                throw new RuntimeException("can not create audio track for video");
+            }
+
+            if (mExtractor == null) {
+                throw new RuntimeException("extrator is null");
+            }
+
+            if (mAudioTrack == null) {
+                MediaFormat mediaFormat =
+                    mExtractor.getTrackFormat(mExtractor.getSampleTrackIndex());
+                int sampleRateInHz = mediaFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE);
+                int channelConfig = (mediaFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT) == 1 ?
+                        AudioFormat.CHANNEL_OUT_MONO : AudioFormat.CHANNEL_OUT_STEREO);
+                int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
+                int minBufferSizeInBytes = AudioTrack.getMinBufferSize(
+                        sampleRateInHz,
+                        channelConfig,
+                        audioFormat);
+                final int frameCount = APPLICATION_AUDIO_PERIOD_MS * sampleRateInHz / 1000;
+                final int frameSizeInBytes = Integer.bitCount(channelConfig)
+                        * AudioFormat.getBytesPerSample(audioFormat);
+                // ensure we consider application requirements for writing audio data
+                minBufferSizeInBytes = TEST_MAX_SPEED /* speed influences buffer size */
+                        * Math.max(minBufferSizeInBytes, frameCount * frameSizeInBytes);
+                mAudioTrack = new AudioTrack(
+                        AudioManager.STREAM_MUSIC,
+                        sampleRateInHz,
+                        channelConfig,
+                        audioFormat,
+                        minBufferSizeInBytes,
+                        AudioTrack.MODE_STREAM);
+            }
+
+            return mAudioTrack;
+        }
+
+        public void releaseOutputBuffer(int bufferIndex, long renderTimestampNs) {
+            synchronized (mConditionCallback) {
+                if (mDecoder != null) {
+                    if (renderTimestampNs == NO_TIMESTAMP) {
+                        mDecoder.releaseOutputBuffer(bufferIndex, false /* render */);
+                    } else {
+                        mDecoder.releaseOutputBuffer(bufferIndex, renderTimestampNs);
+                    }
+                }
+            }
+        }
+
+        @Override
+        public void onError(MediaCodec codec, MediaCodec.CodecException e) {
+        }
+
+        @Override
+        public void onInputBufferAvailable(MediaCodec codec, int index) {
+            synchronized (mConditionCallback) {
+                if (mExtractor == null || mExtractor.getSampleTrackIndex() == -1
+                        || mSignaledEos || mDecoder != codec) {
+                    return;
+                }
+
+                ByteBuffer buffer = codec.getInputBuffer(index);
+                int size = mExtractor.readSampleData(buffer, 0);
+                long timestampUs = mExtractor.getSampleTime();
+                mExtractor.advance();
+                mSignaledEos = mExtractor.getSampleTrackIndex() == -1
+                        || timestampUs >= mLastBufferTimestampUs;
+                codec.queueInputBuffer(
+                        index,
+                        0,
+                        size,
+                        timestampUs,
+                        mSignaledEos ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
+            }
+        }
+
+        @Override
+        public void onOutputBufferAvailable(
+                MediaCodec codec, int index, MediaCodec.BufferInfo info) {
+            synchronized (mConditionCallback) {
+                if (mEos || mDecoder != codec) {
+                    return;
+                }
+
+                mEos = (info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0;
+
+                if (info.size > 0) {
+                    if (mIsAudio) {
+                        ByteBuffer outputByteBuffer = codec.getOutputBuffer(index);
+                        synchronized(mAudioBufferLock) {
+                            mAudioBuffers.add(new AudioBuffer(outputByteBuffer, index));
+                        }
+                        mMediaSync.queueAudio(
+                                outputByteBuffer,
+                                index,
+                                info.presentationTimeUs);
+                    } else {
+                        codec.releaseOutputBuffer(index, info.presentationTimeUs * 1000);
+                    }
+                } else {
+                    codec.releaseOutputBuffer(index, false);
+                }
+            }
+
+            if (mEos) {
+                mMediaSyncTest.onEos(this);
+            }
+        }
+
+        @Override
+        public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {
+        }
+
+        public void checkReturnedAudioBuffer(ByteBuffer byteBuffer, int bufferIndex) {
+            synchronized(mAudioBufferLock) {
+                AudioBuffer audioBuffer = mAudioBuffers.get(0);
+                if (audioBuffer.mByteBuffer != byteBuffer
+                        || audioBuffer.mBufferIndex != bufferIndex) {
+                    fail("returned buffer doesn't match what's sent");
+                }
+                mAudioBuffers.remove(0);
+            }
+        }
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/MidiSoloTest.java b/tests/tests/media/src/android/media/cts/MidiSoloTest.java
new file mode 100644
index 0000000..d198ee8
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/MidiSoloTest.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright (C) 2015 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.media.cts;
+
+import java.io.IOException;
+
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.cts.util.CtsAndroidTestCase;
+import android.media.midi.MidiDevice;
+import android.media.midi.MidiDevice.MidiConnection;
+import android.media.midi.MidiDeviceInfo;
+import android.media.midi.MidiDeviceStatus;
+import android.media.midi.MidiInputPort;
+import android.media.midi.MidiManager;
+import android.media.midi.MidiReceiver;
+import android.media.midi.MidiSender;
+import android.os.Handler;
+import android.os.Looper;
+
+/**
+ * Test MIDI when there may be no MIDI devices available. There is not much we
+ * can test without a device.
+ */
+public class MidiSoloTest extends CtsAndroidTestCase {
+    private static final String TAG = "MidiSoloTest";
+    private final static int LOCAL_STORAGE_SIZE = 256;
+
+    // Store received data so we can check it later.
+    class MyMidiReceiver extends MidiReceiver {
+        public int byteCount;
+        public byte[] data = new byte[LOCAL_STORAGE_SIZE];
+
+        public MyMidiReceiver(int maxMessageSize) {
+            super(maxMessageSize);
+        }
+
+        @Override
+        // Abstract method declared in MidiReceiver
+        public void onSend(byte[] msg, int offset, int count, long timestamp)
+                throws IOException {
+            assertTrue("Message too large.", (count <= getMaxMessageSize()));
+            try {
+                System.arraycopy(msg, offset, data, byteCount, count);
+            } catch (ArrayIndexOutOfBoundsException e) {
+                throw new IOException("Exceeded local storage.", e);
+            }
+            byteCount += count;
+        }
+
+        @Override
+        public void onFlush() {
+            byteCount = 0;
+        }
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        // setup for each test case.
+        super.setUp();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        // Test case clean up.
+        super.tearDown();
+    }
+
+    public void testMidiManager() throws Exception {
+        PackageManager pm = getContext().getPackageManager();
+        if (!pm.hasSystemFeature(PackageManager.FEATURE_MIDI)) {
+            return; // Not supported so don't test it.
+        }
+
+        MidiManager midiManager = (MidiManager) getContext().getSystemService(
+                Context.MIDI_SERVICE);
+        assertTrue("MidiManager not supported.", midiManager != null);
+
+        MidiDeviceInfo[] infos = midiManager.getDevices();
+        assertTrue("Device list was null.", infos != null);
+
+        MidiManager.DeviceCallback callback = new MidiManager.DeviceCallback();
+
+        // These should not crash.
+        midiManager.unregisterDeviceCallback(callback);
+        midiManager.registerDeviceCallback(callback, null);
+        midiManager.unregisterDeviceCallback(callback);
+        midiManager.registerDeviceCallback(callback, new Handler(Looper.getMainLooper()));
+        midiManager.registerDeviceCallback(callback, new Handler(Looper.getMainLooper()));
+        midiManager.unregisterDeviceCallback(callback);
+        midiManager.unregisterDeviceCallback(callback);
+        midiManager.unregisterDeviceCallback(callback);
+    }
+
+    public void testMidiReceiver() throws Exception {
+        PackageManager pm = getContext().getPackageManager();
+        if (!pm.hasSystemFeature(PackageManager.FEATURE_MIDI)) {
+            return; // Not supported so don't test it.
+        }
+
+        MidiReceiver receiver = new MidiReceiver() {
+                @Override
+            public void onSend(byte[] msg, int offset, int count,
+                    long timestamp) throws IOException {
+            }
+        };
+        assertEquals("MidiReceiver default size wrong.", Integer.MAX_VALUE,
+                receiver.getMaxMessageSize());
+
+        int maxSize = 11;
+        MyMidiReceiver myReceiver = new MyMidiReceiver(maxSize);
+        assertEquals("MidiReceiver set size wrong.", maxSize,
+                myReceiver.getMaxMessageSize());
+
+        // Fill array with predictable data.
+        byte[] bar = new byte[200];
+        for (int i = 0; i < bar.length; i++) {
+            bar[i] = (byte) (i ^ 15);
+        }
+        // Small message with no offset.
+        int offset = 0;
+        int count = 3;
+        checkReceivedData(myReceiver, bar, offset, count);
+
+        // Small with an offset.
+        offset = 50;
+        count = 3;
+        checkReceivedData(myReceiver, bar, offset, count);
+
+        // Entire array.
+        offset = 0;
+        count = bar.length;
+        checkReceivedData(myReceiver, bar, offset, count);
+
+        offset = 20;
+        count = 100;
+        checkReceivedData(myReceiver, bar, offset, count);
+    }
+
+    public void testMidiReceiverException() throws Exception {
+        PackageManager pm = getContext().getPackageManager();
+        if (!pm.hasSystemFeature(PackageManager.FEATURE_MIDI)) {
+            return; // Not supported so don't test it.
+        }
+
+        int maxSize = 11;
+        MyMidiReceiver myReceiver = new MyMidiReceiver(maxSize);
+        assertEquals("MidiReceiver set size wrong.", maxSize,
+                myReceiver.getMaxMessageSize());
+
+        // Fill array with predictable data.
+        byte[] bar = new byte[200];
+        int offset = 0;
+        int count = bar.length;
+        myReceiver.flush(); // reset byte counter
+        IOException exception = null;
+        // Send too much data and intentionally cause an IOException.
+        try {
+            int sent = 0;
+            while (sent < LOCAL_STORAGE_SIZE) {
+                myReceiver.send(bar, offset, count);
+                sent += count;
+            }
+        } catch (IOException e) {
+            exception = e;
+        }
+        assertTrue("We should have caught an IOException", exception != null);
+    }
+
+    // Does the data we sent match the data received by the MidiReceiver?
+    private void checkReceivedData(MyMidiReceiver myReceiver, byte[] bar,
+            int offset, int count) throws IOException {
+        myReceiver.flush(); // reset byte counter
+        assertEquals("MidiReceiver flush ", 0, myReceiver.byteCount);
+        myReceiver.send(bar, offset, count);
+        // Did we get all the data
+        assertEquals("MidiReceiver count ", count, myReceiver.byteCount);
+        for (int i = 0; i < count; i++) {
+            assertEquals("MidiReceiver byte " + i + " + " + offset,
+                    bar[i + offset], myReceiver.data[i]);
+        }
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/NonBlockingAudioTrack.java b/tests/tests/media/src/android/media/cts/NonBlockingAudioTrack.java
index 86bab41..3847252 100644
--- a/tests/tests/media/src/android/media/cts/NonBlockingAudioTrack.java
+++ b/tests/tests/media/src/android/media/cts/NonBlockingAudioTrack.java
@@ -22,7 +22,6 @@
 import android.util.Log;
 
 import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
 import java.util.LinkedList;
 
 /**
@@ -37,6 +36,7 @@
     class QueueElement {
         ByteBuffer data;
         int size;
+        long pts;
     }
 
     private AudioTrack mAudioTrack;
@@ -141,7 +141,7 @@
         while (!mQueue.isEmpty()) {
             QueueElement element = mQueue.peekFirst();
             int written = mAudioTrack.write(element.data, element.size,
-                                            AudioTrack.WRITE_NON_BLOCKING);
+                                            AudioTrack.WRITE_NON_BLOCKING, element.pts);
             if (written < 0) {
                 throw new RuntimeException("Audiotrack.write() failed.");
             }
@@ -160,29 +160,10 @@
     }
 
     public void write(ByteBuffer data, int size, long pts) {
-        // create timestamp header
-        final int headerSize = 16;
-        ByteBuffer avSyncHeader;
-        avSyncHeader = ByteBuffer.allocate(headerSize);
-        avSyncHeader.order(ByteOrder.BIG_ENDIAN);
-        avSyncHeader.putInt(0x55550001);
-        avSyncHeader.putInt(size);
-        avSyncHeader.putLong(pts);
-        avSyncHeader.position(0);
-
-        QueueElement headerElement = new QueueElement();
-        headerElement.data = avSyncHeader;
-        headerElement.size = headerSize;
-
-        // accumulate size written to queue
-        mNumBytesQueued += headerSize;
-        mQueue.add(headerElement);
-
-        // create payload element
         QueueElement element = new QueueElement();
         element.data = data;
         element.size = size;
-        data.position(0);
+        element.pts  = pts;
 
         // accumulate size written to queue
         mNumBytesQueued += size;
diff --git a/tests/tests/media/src/android/media/cts/ParamsTest.java b/tests/tests/media/src/android/media/cts/ParamsTest.java
new file mode 100644
index 0000000..5e32828
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/ParamsTest.java
@@ -0,0 +1,374 @@
+/*
+ * Copyright 2015 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.media.cts;
+
+import com.android.cts.media.R;
+
+import android.media.PlaybackParams;
+import android.media.SyncParams;
+import android.os.Parcel;
+import android.test.AndroidTestCase;
+
+/**
+ * General Params tests.
+ *
+ * In particular, check Params objects' behavior.
+ */
+public class ParamsTest extends AndroidTestCase {
+    private static final String TAG = "ParamsTest";
+    private static final float FLOAT_TOLERANCE = .00001f;
+    private static final float MAX_DEFAULT_TOLERANCE = 1/24.f;
+
+    public void testSyncParamsConstants() {
+        assertEquals(0, SyncParams.SYNC_SOURCE_DEFAULT);
+        assertEquals(1, SyncParams.SYNC_SOURCE_SYSTEM_CLOCK);
+        assertEquals(2, SyncParams.SYNC_SOURCE_AUDIO);
+        assertEquals(3, SyncParams.SYNC_SOURCE_VSYNC);
+
+        assertEquals(0, SyncParams.AUDIO_ADJUST_MODE_DEFAULT);
+        assertEquals(1, SyncParams.AUDIO_ADJUST_MODE_STRETCH);
+        assertEquals(2, SyncParams.AUDIO_ADJUST_MODE_RESAMPLE);
+    }
+
+    public void testSyncParamsDefaults() {
+        SyncParams p = new SyncParams();
+        try { fail("got " + p.getAudioAdjustMode()); } catch (IllegalStateException e) {}
+        try { fail("got " + p.getSyncSource());      } catch (IllegalStateException e) {}
+        try { fail("got " + p.getTolerance());       } catch (IllegalStateException e) {}
+        try { fail("got " + p.getFrameRate());       } catch (IllegalStateException e) {}
+
+        SyncParams q = p.allowDefaults();
+        assertSame(p, q);
+        assertEquals(p.AUDIO_ADJUST_MODE_DEFAULT, p.getAudioAdjustMode());
+        assertEquals(p.SYNC_SOURCE_DEFAULT,       p.getSyncSource());
+        assertTrue(p.getTolerance() >= 0.f
+                && p.getTolerance() < MAX_DEFAULT_TOLERANCE + FLOAT_TOLERANCE);
+        try { fail("got " + p.getFrameRate());       } catch (IllegalStateException e) {}
+    }
+
+    public void testSyncParamsAudioAdjustMode() {
+        // setting this cannot fail
+        SyncParams p = new SyncParams();
+        for (int i : new int[] {
+                SyncParams.AUDIO_ADJUST_MODE_STRETCH,
+                SyncParams.AUDIO_ADJUST_MODE_RESAMPLE,
+                -1 /* invalid */}) {
+            SyncParams q = p.setAudioAdjustMode(i); // verify both initial set and update
+            assertSame(p, q);
+            assertEquals(i, p.getAudioAdjustMode());
+            try { fail("got " + p.getSyncSource());      } catch (IllegalStateException e) {}
+            try { fail("got " + p.getTolerance());       } catch (IllegalStateException e) {}
+            try { fail("got " + p.getFrameRate());       } catch (IllegalStateException e) {}
+        }
+    }
+
+    public void testSyncParamsSyncSource() {
+        // setting this cannot fail
+        SyncParams p = new SyncParams();
+        for (int i : new int[] {
+                SyncParams.SYNC_SOURCE_SYSTEM_CLOCK,
+                SyncParams.SYNC_SOURCE_AUDIO,
+                -1 /* invalid */}) {
+            SyncParams q = p.setSyncSource(i); // verify both initial set and update
+            assertSame(p, q);
+            try { fail("got " + p.getAudioAdjustMode()); } catch (IllegalStateException e) {}
+            assertEquals(i, p.getSyncSource());
+            try { fail("got " + p.getTolerance());       } catch (IllegalStateException e) {}
+            try { fail("got " + p.getFrameRate());       } catch (IllegalStateException e) {}
+        }
+    }
+
+    public void testSyncParamsTolerance() {
+        // this can fail on values not in [0, 1)
+
+        // test good values
+        SyncParams p = new SyncParams();
+        float lastValue = 2.f; /* some initial value to avoid compile error */
+        for (float f : new float[] { 0.f, .1f, .9999f }) {
+            SyncParams q = p.setTolerance(f); // verify both initial set and update
+            assertSame(p, q);
+            try { fail("got " + p.getAudioAdjustMode()); } catch (IllegalStateException e) {}
+            try { fail("got " + p.getSyncSource());      } catch (IllegalStateException e) {}
+            assertEquals(f, p.getTolerance(), FLOAT_TOLERANCE);
+            try { fail("got " + p.getFrameRate());       } catch (IllegalStateException e) {}
+            lastValue = f;
+        }
+
+        // test bad values - these should have no effect
+        boolean update = true;
+        for (float f : new float[] { -.0001f, 1.f }) {
+            try {
+                p.setTolerance(f);
+                fail("set tolerance to " + f);
+            } catch (IllegalArgumentException e) {}
+            try { fail("got " + p.getAudioAdjustMode()); } catch (IllegalStateException e) {}
+            try { fail("got " + p.getSyncSource());      } catch (IllegalStateException e) {}
+            if (update) {
+                // if updating, last value should remain
+                assertEquals(lastValue, p.getTolerance(), FLOAT_TOLERANCE);
+            } else {
+                // otherwise, it should remain undefined
+                try { fail("got " + p.getTolerance());       } catch (IllegalStateException e) {}
+            }
+            try { fail("got " + p.getFrameRate());       } catch (IllegalStateException e) {}
+
+            // no longer updating in subsequent iterations
+            p = new SyncParams();
+            update = false;
+        }
+    }
+
+    public void testSyncParamsFrameRate() {
+        // setting this cannot fail, but negative values may be normalized to some negative value
+        SyncParams p = new SyncParams();
+        for (float f : new float[] { 0.f, .0001f, 30.f, 300.f, -.0001f, -1.f }) {
+            SyncParams q = p.setFrameRate(f);
+            assertSame(p, q);
+            try { fail("got " + p.getAudioAdjustMode()); } catch (IllegalStateException e) {}
+            try { fail("got " + p.getSyncSource());      } catch (IllegalStateException e) {}
+            try { fail("got " + p.getTolerance());       } catch (IllegalStateException e) {}
+            if (f >= 0) {
+                assertEquals(f, p.getFrameRate(), FLOAT_TOLERANCE);
+            } else {
+                assertTrue(p.getFrameRate() < 0.f);
+            }
+        }
+    }
+
+    public void testSyncParamsMultipleSettings() {
+        {
+            SyncParams p = new SyncParams();
+            p.setAudioAdjustMode(p.AUDIO_ADJUST_MODE_STRETCH);
+            SyncParams q = p.setTolerance(.5f);
+            assertSame(p, q);
+
+            assertEquals(p.AUDIO_ADJUST_MODE_STRETCH, p.getAudioAdjustMode());
+            try { fail("got " + p.getSyncSource());      } catch (IllegalStateException e) {}
+            assertEquals(.5f, p.getTolerance(), FLOAT_TOLERANCE);
+            try { fail("got " + p.getFrameRate());       } catch (IllegalStateException e) {}
+
+            // allowDefaults should not change set values
+            q = p.allowDefaults();
+            assertSame(p, q);
+
+            assertEquals(p.AUDIO_ADJUST_MODE_STRETCH, p.getAudioAdjustMode());
+            assertEquals(p.SYNC_SOURCE_DEFAULT, p.getSyncSource());
+            assertEquals(.5f, p.getTolerance(), FLOAT_TOLERANCE);
+            try { fail("got " + p.getFrameRate());       } catch (IllegalStateException e) {}
+        }
+
+        {
+            SyncParams p = new SyncParams();
+            p.setSyncSource(p.SYNC_SOURCE_VSYNC);
+            SyncParams q = p.setFrameRate(25.f);
+            assertSame(p, q);
+
+            try { fail("got " + p.getAudioAdjustMode()); } catch (IllegalStateException e) {}
+            assertEquals(p.SYNC_SOURCE_VSYNC, p.getSyncSource());
+            try { fail("got " + p.getTolerance());       } catch (IllegalStateException e) {}
+            assertEquals(25.f, p.getFrameRate(), FLOAT_TOLERANCE);
+
+            // allowDefaults should not change set values
+            q = p.allowDefaults();
+            assertSame(p, q);
+
+            assertEquals(p.AUDIO_ADJUST_MODE_DEFAULT, p.getAudioAdjustMode());
+            assertEquals(p.SYNC_SOURCE_VSYNC, p.getSyncSource());
+            assertTrue(p.getTolerance() >= 0.f
+                    && p.getTolerance() < MAX_DEFAULT_TOLERANCE + FLOAT_TOLERANCE);
+            assertEquals(25.f, p.getFrameRate(), FLOAT_TOLERANCE);
+        }
+    }
+
+    public void testPlaybackParamsConstants() {
+        assertEquals(0, PlaybackParams.AUDIO_STRETCH_MODE_DEFAULT);
+        assertEquals(1, PlaybackParams.AUDIO_STRETCH_MODE_VOICE);
+
+        assertEquals(0, PlaybackParams.AUDIO_FALLBACK_MODE_DEFAULT);
+        assertEquals(1, PlaybackParams.AUDIO_FALLBACK_MODE_MUTE);
+        assertEquals(2, PlaybackParams.AUDIO_FALLBACK_MODE_FAIL);
+    }
+
+    public void testPlaybackParamsDefaults() {
+        PlaybackParams p = new PlaybackParams();
+        try { fail("got " + p.getAudioFallbackMode()); } catch (IllegalStateException e) {}
+        try { fail("got " + p.getAudioStretchMode());  } catch (IllegalStateException e) {}
+        try { fail("got " + p.getPitch());             } catch (IllegalStateException e) {}
+        try { fail("got " + p.getSpeed());             } catch (IllegalStateException e) {}
+
+        PlaybackParams q = p.allowDefaults();
+        assertSame(p, q);
+        assertEquals(p.AUDIO_FALLBACK_MODE_DEFAULT, p.getAudioFallbackMode());
+        assertEquals(p.AUDIO_STRETCH_MODE_DEFAULT,  p.getAudioStretchMode());
+        assertEquals(1.f, p.getPitch(), FLOAT_TOLERANCE);
+        assertEquals(1.f, p.getSpeed(), FLOAT_TOLERANCE);
+    }
+
+    public void testPlaybackParamsAudioFallbackMode() {
+        // setting this cannot fail
+        PlaybackParams p = new PlaybackParams();
+        for (int i : new int[] {
+                PlaybackParams.AUDIO_FALLBACK_MODE_MUTE,
+                PlaybackParams.AUDIO_FALLBACK_MODE_FAIL,
+                -1 /* invalid */}) {
+            PlaybackParams q = p.setAudioFallbackMode(i); // verify both initial set and update
+            assertSame(p, q);
+            assertEquals(i, p.getAudioFallbackMode());
+            try { fail("got " + p.getAudioStretchMode());  } catch (IllegalStateException e) {}
+            try { fail("got " + p.getPitch());             } catch (IllegalStateException e) {}
+            try { fail("got " + p.getSpeed());             } catch (IllegalStateException e) {}
+        }
+    }
+
+    public void testPlaybackParamsAudioStretchMode() {
+        // setting this cannot fail
+        PlaybackParams p = new PlaybackParams();
+        for (int i : new int[] {
+                PlaybackParams.AUDIO_STRETCH_MODE_DEFAULT,
+                PlaybackParams.AUDIO_STRETCH_MODE_VOICE,
+                -1 /* invalid */}) {
+            PlaybackParams q = p.setAudioStretchMode(i); // verify both initial set and update
+            assertSame(p, q);
+            try { fail("got " + p.getAudioFallbackMode()); } catch (IllegalStateException e) {}
+            assertEquals(i, p.getAudioStretchMode());
+            try { fail("got " + p.getPitch());             } catch (IllegalStateException e) {}
+            try { fail("got " + p.getSpeed());             } catch (IllegalStateException e) {}
+        }
+    }
+
+    public void testPlaybackParamsPitch() {
+        // this can fail on values not in [0, Inf)
+
+        // test good values
+        PlaybackParams p = new PlaybackParams();
+        float lastValue = 2.f; /* some initial value to avoid compile error */
+        for (float f : new float[] { 0.f, .1f, 9999.f }) {
+            PlaybackParams q = p.setPitch(f); // verify both initial set and update
+            assertSame(p, q);
+            try { fail("got " + p.getAudioFallbackMode()); } catch (IllegalStateException e) {}
+            try { fail("got " + p.getAudioStretchMode());  } catch (IllegalStateException e) {}
+            assertEquals(f, p.getPitch(), FLOAT_TOLERANCE);
+            try { fail("got " + p.getSpeed());             } catch (IllegalStateException e) {}
+            lastValue = f;
+        }
+
+        // test bad values - these should have no effect
+        boolean update = true;
+        for (float f : new float[] { -.0001f, -1.f }) {
+            try {
+                p.setPitch(f);
+                fail("set tolerance to " + f);
+            } catch (IllegalArgumentException e) {}
+            try { fail("got " + p.getAudioFallbackMode()); } catch (IllegalStateException e) {}
+            try { fail("got " + p.getAudioStretchMode());  } catch (IllegalStateException e) {}
+            if (update) {
+                // if updating, last value should remain
+                assertEquals(lastValue, p.getPitch(), FLOAT_TOLERANCE);
+            } else {
+                // otherwise, it should remain undefined
+                try { fail("got " + p.getPitch());             } catch (IllegalStateException e) {}
+            }
+            try { fail("got " + p.getSpeed());             } catch (IllegalStateException e) {}
+
+            // no longer updating in subsequent iterations
+            p = new PlaybackParams();
+            update = false;
+        }
+    }
+
+    public void testPlaybackParamsSpeed() {
+        // setting this cannot fail
+        PlaybackParams p = new PlaybackParams();
+        for (float f : new float[] { 0.f, .0001f, 30.f, 300.f, -.0001f, -1.f, -300.f }) {
+            PlaybackParams q = p.setSpeed(f);
+            assertSame(p, q);
+            try { fail("got " + p.getAudioFallbackMode()); } catch (IllegalStateException e) {}
+            try { fail("got " + p.getAudioStretchMode());  } catch (IllegalStateException e) {}
+            try { fail("got " + p.getPitch());             } catch (IllegalStateException e) {}
+            assertEquals(f, p.getSpeed(), FLOAT_TOLERANCE);
+        }
+    }
+
+    public void testPlaybackParamsMultipleSettings() {
+        {
+            PlaybackParams p = new PlaybackParams();
+            p.setAudioFallbackMode(p.AUDIO_FALLBACK_MODE_MUTE);
+            PlaybackParams q = p.setPitch(.5f);
+            assertSame(p, q);
+
+            assertEquals(p.AUDIO_FALLBACK_MODE_MUTE, p.getAudioFallbackMode());
+            try { fail("got " + p.getAudioStretchMode());  } catch (IllegalStateException e) {}
+            assertEquals(.5f, p.getPitch(), FLOAT_TOLERANCE);
+            try { fail("got " + p.getSpeed());             } catch (IllegalStateException e) {}
+
+            // allowDefaults should not change set values
+            q = p.allowDefaults();
+            assertSame(p, q);
+
+            assertEquals(p.AUDIO_FALLBACK_MODE_MUTE, p.getAudioFallbackMode());
+            assertEquals(p.AUDIO_STRETCH_MODE_DEFAULT, p.getAudioStretchMode());
+            assertEquals(.5f, p.getPitch(), FLOAT_TOLERANCE);
+            assertEquals(1.f, p.getSpeed(), FLOAT_TOLERANCE);
+        }
+
+        {
+            PlaybackParams p = new PlaybackParams();
+            p.setAudioStretchMode(p.AUDIO_STRETCH_MODE_VOICE);
+            PlaybackParams q = p.setSpeed(25.f);
+            assertSame(p, q);
+
+            try { fail("got " + p.getAudioFallbackMode()); } catch (IllegalStateException e) {}
+            assertEquals(p.AUDIO_STRETCH_MODE_VOICE, p.getAudioStretchMode());
+            try { fail("got " + p.getPitch());             } catch (IllegalStateException e) {}
+            assertEquals(25.f, p.getSpeed(), FLOAT_TOLERANCE);
+
+            // allowDefaults should not change set values
+            q = p.allowDefaults();
+            assertSame(p, q);
+
+            assertEquals(p.AUDIO_FALLBACK_MODE_DEFAULT, p.getAudioFallbackMode());
+            assertEquals(p.AUDIO_STRETCH_MODE_VOICE, p.getAudioStretchMode());
+            assertEquals(1.f, p.getPitch(), FLOAT_TOLERANCE);
+            assertEquals(25.f, p.getSpeed(), FLOAT_TOLERANCE);
+        }
+    }
+
+    public void testPlaybackParamsDescribeContents() {
+        PlaybackParams p = new PlaybackParams();
+        assertEquals(0, p.describeContents());
+    }
+
+    public void testPlaybackParamsWriteToParcel() {
+        PlaybackParams p = new PlaybackParams();
+        p.setAudioFallbackMode(PlaybackParams.AUDIO_FALLBACK_MODE_FAIL);
+        p.setAudioStretchMode(PlaybackParams.AUDIO_STRETCH_MODE_VOICE);
+        p.setPitch(.5f);
+        p.setSpeed(.0001f);
+
+        Parcel parcel = Parcel.obtain();
+        p.writeToParcel(parcel, 0 /* flags */);
+        parcel.setDataPosition(0);
+        PlaybackParams q = PlaybackParams.CREATOR.createFromParcel(parcel);
+
+        assertEquals(p.getAudioFallbackMode(), q.getAudioFallbackMode());
+        assertEquals(p.getAudioStretchMode(), q.getAudioStretchMode());
+        assertEquals(p.getPitch(), q.getPitch());
+        assertEquals(p.getSpeed(), q.getSpeed());
+        parcel.recycle();
+    }
+
+}
diff --git a/tests/tests/media/src/android/media/cts/PostProcTestBase.java b/tests/tests/media/src/android/media/cts/PostProcTestBase.java
index ef87662..cefbbf4 100644
--- a/tests/tests/media/src/android/media/cts/PostProcTestBase.java
+++ b/tests/tests/media/src/android/media/cts/PostProcTestBase.java
@@ -40,30 +40,18 @@
     }
 
     protected boolean isBassBoostAvailable() {
-        if (!hasAudioOutput()) {
-            return false;
-        }
         return AudioEffect.isEffectTypeAvailable(AudioEffect.EFFECT_TYPE_BASS_BOOST);
     }
 
     protected boolean isVirtualizerAvailable() {
-        if (!hasAudioOutput()) {
-            return false;
-        }
         return AudioEffect.isEffectTypeAvailable(AudioEffect.EFFECT_TYPE_VIRTUALIZER);
     }
 
     protected boolean isPresetReverbAvailable() {
-        if (!hasAudioOutput()) {
-            return false;
-        }
         return AudioEffect.isEffectTypeAvailable(AudioEffect.EFFECT_TYPE_PRESET_REVERB);
     }
 
     protected boolean isEnvReverbAvailable() {
-        if (!hasAudioOutput()) {
-            return false;
-        }
         return AudioEffect.isEffectTypeAvailable(AudioEffect.EFFECT_TYPE_ENV_REVERB);
     }
 
diff --git a/tests/tests/media/src/android/media/cts/ResourceManagerStubActivity.java b/tests/tests/media/src/android/media/cts/ResourceManagerStubActivity.java
new file mode 100644
index 0000000..5595800
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/ResourceManagerStubActivity.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2015 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.media.cts;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import junit.framework.Assert;
+
+public class ResourceManagerStubActivity extends Activity {
+    private static final String TAG = "ResourceManagerStubActivity";
+    private final Object mFinishEvent = new Object();
+    private int[] mRequestCodes = {0, 1};
+    private boolean[] mResults = {false, false};
+    private int mNumResults = 0;
+    private int mType1 = ResourceManagerTestActivityBase.TYPE_NONSECURE;
+    private int mType2 = ResourceManagerTestActivityBase.TYPE_NONSECURE;
+    private boolean mWaitForReclaim = true;
+
+    private static final String ERROR_INSUFFICIENT_RESOURCES =
+            "* Please check if the omx component is returning OMX_ErrorInsufficientResources " +
+            "properly when the codec failure is due to insufficient resource.\n";
+    private static final String ERROR_SUPPORTS_MULTIPLE_SECURE_CODECS =
+            "* Please check if this platform supports multiple concurrent secure codec " +
+            "instances. If not, please add below setting in /etc/media_codecs.xml in order " +
+            "to pass the test:\n" +
+            "    <Settings>\n" +
+            "       <Setting name=\"supports-multiple-secure-codecs\" value=\"false\" />\n" +
+            "    </Settings>\n";
+    private static final String ERROR_SUPPORTS_SECURE_WITH_NON_SECURE_CODEC =
+            "* Please check if this platform supports co-exist of secure and non-secure codec. " +
+            "If not, please add below setting in /etc/media_codecs.xml in order to pass the " +
+            "test:\n" +
+            "    <Settings>\n" +
+            "       <Setting name=\"supports-secure-with-non-secure-codec\" value=\"false\" />\n" +
+            "    </Settings>\n";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        Log.d(TAG, "Activity " + requestCode + " finished with resultCode " + resultCode);
+        mResults[requestCode] = (resultCode == RESULT_OK);
+        if (++mNumResults == mResults.length) {
+            synchronized (mFinishEvent) {
+                mFinishEvent.notify();
+            }
+        }
+    }
+
+    public void testReclaimResource(int type1, int type2) throws InterruptedException {
+        mType1 = type1;
+        mType2 = type2;
+        if (type1 != ResourceManagerTestActivityBase.TYPE_MIX && type1 != type2) {
+            // in this case, activity2 may not need to reclaim codec from activity1.
+            mWaitForReclaim = false;
+        } else {
+            mWaitForReclaim = true;
+        }
+        Thread thread = new Thread() {
+            @Override
+            public void run() {
+                try {
+                    Context context = getApplicationContext();
+                    Intent intent1 = new Intent(context, ResourceManagerTestActivity1.class);
+                    intent1.putExtra("test-type", mType1);
+                    intent1.putExtra("wait-for-reclaim", mWaitForReclaim);
+                    startActivityForResult(intent1, mRequestCodes[0]);
+                    Thread.sleep(5000);  // wait for process to launch and allocate all codecs.
+
+                    Intent intent2 = new Intent(context, ResourceManagerTestActivity2.class);
+                    intent2.putExtra("test-type", mType2);
+                    startActivityForResult(intent2, mRequestCodes[1]);
+
+                    synchronized (mFinishEvent) {
+                        mFinishEvent.wait();
+                    }
+                } catch(Exception e) {
+                    Log.d(TAG, "testReclaimResource got exception " + e.toString());
+                }
+            }
+        };
+        thread.start();
+        thread.join(20000 /* millis */);
+        System.gc();
+        Thread.sleep(5000);  // give the gc a chance to release test activities.
+
+        boolean result = true;
+        for (int i = 0; i < mResults.length; ++i) {
+            if (!mResults[i]) {
+                Log.e(TAG, "Result from activity " + i + " is a fail.");
+                result = false;
+                break;
+            }
+        }
+        if (!result) {
+            String failMessage = "The potential reasons for the failure:\n";
+            StringBuilder reasons = new StringBuilder();
+            reasons.append(ERROR_INSUFFICIENT_RESOURCES);
+            if (mType1 != mType2) {
+                reasons.append(ERROR_SUPPORTS_SECURE_WITH_NON_SECURE_CODEC);
+            }
+            if (mType1 == ResourceManagerTestActivityBase.TYPE_MIX &&
+                    mType2 == ResourceManagerTestActivityBase.TYPE_SECURE) {
+                reasons.append(ERROR_SUPPORTS_MULTIPLE_SECURE_CODECS);
+            }
+            Assert.assertTrue(failMessage + reasons.toString(), result);
+        }
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/ResourceManagerTest.java b/tests/tests/media/src/android/media/cts/ResourceManagerTest.java
new file mode 100644
index 0000000..7305651
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/ResourceManagerTest.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2015 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.media.cts;
+
+import android.os.Bundle;
+import android.test.ActivityInstrumentationTestCase2;
+
+public class ResourceManagerTest
+        extends ActivityInstrumentationTestCase2<ResourceManagerStubActivity> {
+
+    public ResourceManagerTest() {
+        super("com.android.cts.media", ResourceManagerStubActivity.class);
+    }
+
+    private void doTestReclaimResource(int type1, int type2) throws Exception {
+        Bundle extras = new Bundle();
+        ResourceManagerStubActivity activity = launchActivity(
+                "com.android.cts.media", ResourceManagerStubActivity.class, extras);
+        activity.testReclaimResource(type1, type2);
+        activity.finish();
+    }
+
+    public void testReclaimResourceNonsecureVsNonsecure() throws Exception {
+        doTestReclaimResource(ResourceManagerTestActivityBase.TYPE_NONSECURE,
+                ResourceManagerTestActivityBase.TYPE_NONSECURE);
+    }
+
+    public void testReclaimResourceNonsecureVsSecure() throws Exception {
+        doTestReclaimResource(ResourceManagerTestActivityBase.TYPE_NONSECURE,
+                ResourceManagerTestActivityBase.TYPE_SECURE);
+    }
+
+    public void testReclaimResourceSecureVsNonsecure() throws Exception {
+        doTestReclaimResource(ResourceManagerTestActivityBase.TYPE_SECURE,
+                ResourceManagerTestActivityBase.TYPE_NONSECURE);
+    }
+
+    public void testReclaimResourceSecureVsSecure() throws Exception {
+        doTestReclaimResource(ResourceManagerTestActivityBase.TYPE_SECURE,
+                ResourceManagerTestActivityBase.TYPE_SECURE);
+    }
+
+    public void testReclaimResourceMixVsNonsecure() throws Exception {
+        doTestReclaimResource(ResourceManagerTestActivityBase.TYPE_MIX,
+                ResourceManagerTestActivityBase.TYPE_NONSECURE);
+    }
+
+    public void testReclaimResourceMixVsSecure() throws Exception {
+        doTestReclaimResource(ResourceManagerTestActivityBase.TYPE_MIX,
+                ResourceManagerTestActivityBase.TYPE_SECURE);
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/ResourceManagerTestActivity1.java b/tests/tests/media/src/android/media/cts/ResourceManagerTestActivity1.java
new file mode 100644
index 0000000..a11d773
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/ResourceManagerTestActivity1.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2015 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.media.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+
+public class ResourceManagerTestActivity1 extends ResourceManagerTestActivityBase {
+    private static final int MAX_INSTANCES = 32;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        TAG = "ResourceManagerTestActivity1";
+
+        Log.d(TAG, "onCreate called.");
+        super.onCreate(savedInstanceState);
+        moveTaskToBack(true);
+
+        Bundle extras = getIntent().getExtras();
+        if (extras != null) {
+            mWaitForReclaim = extras.getBoolean("wait-for-reclaim", mWaitForReclaim);
+        }
+
+        if (allocateCodecs(MAX_INSTANCES) == MAX_INSTANCES) {
+            // haven't reached the limit with MAX_INSTANCES, no need to wait for reclaim exception.
+            mWaitForReclaim = false;
+        }
+
+        useCodecs();
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/ResourceManagerTestActivity2.java b/tests/tests/media/src/android/media/cts/ResourceManagerTestActivity2.java
new file mode 100644
index 0000000..79d0d2d
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/ResourceManagerTestActivity2.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2015 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.media.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+
+public class ResourceManagerTestActivity2 extends ResourceManagerTestActivityBase {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        TAG = "ResourceManagerTestActivity2";
+
+        Log.d(TAG, "onCreate called.");
+        super.onCreate(savedInstanceState);
+
+        int result = (allocateCodecs(1 /* max */) == 1) ? RESULT_OK : RESULT_CANCELED;
+        finishWithResult(result);
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/ResourceManagerTestActivityBase.java b/tests/tests/media/src/android/media/cts/ResourceManagerTestActivityBase.java
new file mode 100644
index 0000000..689babb
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/ResourceManagerTestActivityBase.java
@@ -0,0 +1,257 @@
+/*
+ * Copyright 2015 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.media.cts;
+
+import android.app.Activity;
+import android.media.MediaCodec;
+import android.media.MediaCodecInfo;
+import android.media.MediaCodecInfo.CodecCapabilities;
+import android.media.MediaCodecInfo.VideoCapabilities;
+import android.media.MediaCodecList;
+import android.media.MediaFormat;
+import android.os.Bundle;
+import android.util.Log;
+import java.io.IOException;
+import java.util.Vector;
+
+public class ResourceManagerTestActivityBase extends Activity {
+    public static final int TYPE_NONSECURE = 0;
+    public static final int TYPE_SECURE = 1;
+    public static final int TYPE_MIX = 2;
+
+    protected String TAG;
+    private static final int FRAME_RATE = 10;
+    private static final int IFRAME_INTERVAL = 10;  // 10 seconds between I-frames
+    private static final String MIME = MediaFormat.MIMETYPE_VIDEO_AVC;
+
+    private Vector<MediaCodec> mCodecs = new Vector<MediaCodec>();
+
+    private class TestCodecCallback extends MediaCodec.Callback {
+        @Override
+        public void onInputBufferAvailable(MediaCodec codec, int index) {
+            Log.d(TAG, "onInputBufferAvailable " + codec.toString());
+        }
+
+        @Override
+        public void onOutputBufferAvailable(
+                MediaCodec codec, int index, MediaCodec.BufferInfo info) {
+            Log.d(TAG, "onOutputBufferAvailable " + codec.toString());
+        }
+
+        @Override
+        public void onError(MediaCodec codec, MediaCodec.CodecException e) {
+            Log.d(TAG, "onError " + codec.toString() + " errorCode " + e.getErrorCode());
+        }
+
+        @Override
+        public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {
+            Log.d(TAG, "onOutputFormatChanged " + codec.toString());
+        }
+    }
+
+    private MediaCodec.Callback mCallback = new TestCodecCallback();
+
+    private MediaFormat getTestFormat(CodecCapabilities caps, boolean securePlayback) {
+        VideoCapabilities vcaps = caps.getVideoCapabilities();
+        int width = vcaps.getSupportedWidths().getLower();
+        int height = vcaps.getSupportedHeightsFor(width).getLower();
+        int bitrate = vcaps.getBitrateRange().getLower();
+
+        MediaFormat format = MediaFormat.createVideoFormat(MIME, width, height);
+        format.setInteger(MediaFormat.KEY_COLOR_FORMAT, caps.colorFormats[0]);
+        format.setInteger(MediaFormat.KEY_BIT_RATE, bitrate);
+        format.setInteger(MediaFormat.KEY_FRAME_RATE, FRAME_RATE);
+        format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, IFRAME_INTERVAL);
+        format.setFeatureEnabled(CodecCapabilities.FEATURE_SecurePlayback, securePlayback);
+        return format;
+    }
+
+    private MediaCodecInfo getTestCodecInfo(boolean securePlayback) {
+        // Use avc decoder for testing.
+        boolean isEncoder = false;
+
+        MediaCodecList mcl = new MediaCodecList(MediaCodecList.ALL_CODECS);
+        for (MediaCodecInfo info : mcl.getCodecInfos()) {
+            if (info.isEncoder() != isEncoder) {
+                continue;
+            }
+            CodecCapabilities caps;
+            try {
+                caps = info.getCapabilitiesForType(MIME);
+                boolean securePlaybackSupported =
+                        caps.isFeatureSupported(CodecCapabilities.FEATURE_SecurePlayback);
+                boolean securePlaybackRequired =
+                        caps.isFeatureRequired(CodecCapabilities.FEATURE_SecurePlayback);
+                if ((securePlayback && securePlaybackSupported) ||
+                        (!securePlayback && !securePlaybackRequired) ) {
+                    Log.d(TAG, "securePlayback " + securePlayback + " will use " + info.getName());
+                } else {
+                    Log.d(TAG, "securePlayback " + securePlayback + " skip " + info.getName());
+                    continue;
+                }
+            } catch (IllegalArgumentException e) {
+                // mime is not supported
+                continue;
+            }
+            return info;
+        }
+
+        return null;
+    }
+
+    protected int allocateCodecs(int max) {
+        Bundle extras = getIntent().getExtras();
+        int type = TYPE_NONSECURE;
+        if (extras != null) {
+            type = extras.getInt("test-type", type);
+            Log.d(TAG, "type is: " + type);
+        }
+
+        boolean shouldSkip = false;
+        boolean securePlayback;
+        if (type == TYPE_NONSECURE || type == TYPE_MIX) {
+            securePlayback = false;
+            MediaCodecInfo info = getTestCodecInfo(securePlayback);
+            if (info != null) {
+                allocateCodecs(max, info, securePlayback);
+            } else {
+                shouldSkip = true;
+            }
+        }
+
+        if (!shouldSkip) {
+            if (type == TYPE_SECURE || type == TYPE_MIX) {
+                securePlayback = true;
+                MediaCodecInfo info = getTestCodecInfo(securePlayback);
+                if (info != null) {
+                    allocateCodecs(max, info, securePlayback);
+                } else {
+                    shouldSkip = true;
+                }
+            }
+        }
+
+        if (shouldSkip) {
+            Log.d(TAG, "test skipped as there's no supported codec.");
+            finishWithResult(RESULT_OK);
+        }
+
+        Log.d(TAG, "allocateCodecs returned " + mCodecs.size());
+        return mCodecs.size();
+    }
+
+    protected void allocateCodecs(int max, MediaCodecInfo info, boolean securePlayback) {
+        String name = info.getName();
+        CodecCapabilities caps = info.getCapabilitiesForType(MIME);
+        MediaFormat format = getTestFormat(caps, securePlayback);
+        MediaCodec codec = null;
+        for (int i = mCodecs.size(); i < max; ++i) {
+            try {
+                Log.d(TAG, "Create codec " + name + " #" + i);
+                codec = MediaCodec.createByCodecName(name);
+                codec.setCallback(mCallback);
+                Log.d(TAG, "Configure codec " + format);
+                codec.configure(format, null, null, 0);
+                Log.d(TAG, "Start codec " + format);
+                codec.start();
+                mCodecs.add(codec);
+                codec = null;
+            } catch (IllegalArgumentException e) {
+                Log.d(TAG, "IllegalArgumentException " + e.getMessage());
+                break;
+            } catch (IOException e) {
+                Log.d(TAG, "IOException " + e.getMessage());
+                break;
+            } catch (MediaCodec.CodecException e) {
+                Log.d(TAG, "CodecException 0x" + Integer.toHexString(e.getErrorCode()));
+                break;
+            } finally {
+                if (codec != null) {
+                    Log.d(TAG, "release codec");
+                    codec.release();
+                    codec = null;
+                }
+            }
+        }
+    }
+
+    protected void finishWithResult(int result) {
+        for (int i = 0; i < mCodecs.size(); ++i) {
+            Log.d(TAG, "release codec #" + i);
+            mCodecs.get(i).release();
+        }
+        mCodecs.clear();
+        setResult(result);
+        finish();
+        Log.d(TAG, "activity finished");
+    }
+
+    private void doUseCodecs() {
+        int current = 0;
+        try {
+            for (current = 0; current < mCodecs.size(); ++current) {
+                mCodecs.get(current).getName();
+            }
+        } catch (MediaCodec.CodecException e) {
+            Log.d(TAG, "useCodecs got CodecException 0x" + Integer.toHexString(e.getErrorCode()));
+            if (e.getErrorCode() == MediaCodec.CodecException.ERROR_RECLAIMED) {
+                Log.d(TAG, "Remove codec " + current + " from the list");
+                mCodecs.remove(current);
+                mGotReclaimedException = true;
+                mUseCodecs = false;
+            }
+            return;
+        }
+    }
+
+    protected boolean mWaitForReclaim = true;
+    private Thread mWorkerThread;
+    private volatile boolean mUseCodecs = true;
+    private volatile boolean mGotReclaimedException = false;
+    protected void useCodecs() {
+        mWorkerThread = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                long start = System.currentTimeMillis();
+                long timeSinceStartedMs = 0;
+                while (mUseCodecs && (timeSinceStartedMs < 15000)) {  // timeout in 15s
+                    doUseCodecs();
+                    try {
+                        Thread.sleep(50 /* millis */);
+                    } catch (InterruptedException e) {}
+                    timeSinceStartedMs = System.currentTimeMillis() - start;
+                }
+                if (mGotReclaimedException) {
+                    Log.d(TAG, "Got expected reclaim exception.");
+                    finishWithResult(RESULT_OK);
+                } else {
+                    Log.d(TAG, "Stopped without getting reclaim exception.");
+                    // if the test is supposed to wait for reclaim event then this is a failure,
+                    // otherwise this is a pass.
+                    finishWithResult(mWaitForReclaim ? RESULT_CANCELED : RESULT_OK);
+                }
+            }
+        });
+        mWorkerThread.start();
+    }
+
+    @Override
+    protected void onDestroy() {
+        Log.d(TAG, "onDestroy called.");
+        super.onDestroy();
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/RingtoneManagerTest.java b/tests/tests/media/src/android/media/cts/RingtoneManagerTest.java
index bf47a27..4693036 100644
--- a/tests/tests/media/src/android/media/cts/RingtoneManagerTest.java
+++ b/tests/tests/media/src/android/media/cts/RingtoneManagerTest.java
@@ -55,6 +55,7 @@
         mActivity = getActivity();
         mInstrumentation = getInstrumentation();
         mContext = mInstrumentation.getContext();
+        Utils.enableAppOps(mContext.getPackageName(), "android:write_settings", mInstrumentation);
         mRingtoneManager = new RingtoneManager(mActivity);
         mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
         // backup ringer settings
@@ -74,6 +75,7 @@
         }
         RingtoneManager.setActualDefaultRingtoneUri(mContext, RingtoneManager.TYPE_RINGTONE,
                 mDefaultUri);
+        Utils.disableAppOps(mContext.getPackageName(), "android:write_settings", mInstrumentation);
         super.tearDown();
     }
 
diff --git a/tests/tests/media/src/android/media/cts/RingtoneTest.java b/tests/tests/media/src/android/media/cts/RingtoneTest.java
index f5218e3..3527b1a 100644
--- a/tests/tests/media/src/android/media/cts/RingtoneTest.java
+++ b/tests/tests/media/src/android/media/cts/RingtoneTest.java
@@ -16,6 +16,7 @@
 
 package android.media.cts;
 
+import android.app.UiAutomation;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.media.AudioManager;
@@ -23,10 +24,10 @@
 import android.media.RingtoneManager;
 import android.net.Uri;
 import android.provider.Settings;
-import android.test.AndroidTestCase;
+import android.test.InstrumentationTestCase;
 import android.util.Log;
 
-public class RingtoneTest extends AndroidTestCase {
+public class RingtoneTest extends InstrumentationTestCase {
     private static final String TAG = "RingtoneTest";
 
     private Context mContext;
@@ -40,7 +41,8 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mContext = getContext();
+        enableAppOps();
+        mContext = getInstrumentation().getContext();
         mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
         mRingtone = RingtoneManager.getRingtone(mContext, Settings.System.DEFAULT_RINGTONE_URI);
         // backup ringer settings
@@ -58,6 +60,18 @@
                 RingtoneManager.TYPE_RINGTONE);
     }
 
+    private void enableAppOps() {
+        StringBuilder cmd = new StringBuilder();
+        cmd.append("appops set ");
+        cmd.append(getInstrumentation().getContext().getPackageName());
+        cmd.append(" android:write_settings allow");
+        getInstrumentation().getUiAutomation().executeShellCommand(cmd.toString());
+        try {
+            Thread.sleep(2200);
+        } catch (InterruptedException e) {
+        }
+    }
+
     @Override
     protected void tearDown() throws Exception {
         // restore original settings
@@ -76,7 +90,7 @@
     }
 
     private boolean hasAudioOutput() {
-        return getContext().getPackageManager()
+        return getInstrumentation().getContext().getPackageManager()
             .hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT);
     }
 
diff --git a/tests/tests/media/src/android/media/cts/RoutingTest.java b/tests/tests/media/src/android/media/cts/RoutingTest.java
new file mode 100644
index 0000000..c0e9a3e
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/RoutingTest.java
@@ -0,0 +1,351 @@
+/*
+ * Copyright (C) 2015 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.media.cts;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+import android.media.AudioDeviceInfo;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioRecord;
+import android.media.AudioTrack;
+import android.media.MediaRecorder;
+
+import android.os.Handler;
+import android.os.Looper;
+
+import android.test.AndroidTestCase;
+
+import android.util.Log;
+
+import java.lang.Runnable;
+
+/**
+ * TODO: Insert description here. (generated by pmclean)
+ */
+public class RoutingTest extends AndroidTestCase {
+    private static final String TAG = "RoutingTest";
+
+    private AudioManager mAudioManager;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        // get the AudioManager
+        mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+        assertNotNull(mAudioManager);
+    }
+
+    private AudioTrack allocAudioTrack() {
+        int bufferSize =
+                AudioTrack.getMinBufferSize(
+                    41000,
+                    AudioFormat.CHANNEL_OUT_STEREO,
+                    AudioFormat.ENCODING_PCM_16BIT);
+        AudioTrack audioTrack =
+            new AudioTrack(
+                AudioManager.STREAM_MUSIC,
+                41000,
+                AudioFormat.CHANNEL_OUT_STEREO,
+                AudioFormat.ENCODING_PCM_16BIT,
+                bufferSize,
+                AudioTrack.MODE_STREAM);
+        return audioTrack;
+    }
+
+    public void test_audioTrack_preferredDevice() {
+        if (!mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT)) {
+            // Can't do it so skip this test
+            return;
+        }
+
+        AudioTrack audioTrack = allocAudioTrack();
+        assertNotNull(audioTrack);
+
+        // None selected (new AudioTrack), so check for default
+        assertNull(audioTrack.getPreferredDevice());
+
+        // resets to default
+        assertTrue(audioTrack.setPreferredDevice(null));
+
+        // test each device
+        AudioDeviceInfo[] deviceList = mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
+        for (int index = 0; index < deviceList.length; index++) {
+            assertTrue(audioTrack.setPreferredDevice(deviceList[index]));
+            assertTrue(audioTrack.getPreferredDevice() == deviceList[index]);
+        }
+
+        // Check defaults again
+        assertTrue(audioTrack.setPreferredDevice(null));
+        assertNull(audioTrack.getPreferredDevice());
+
+        audioTrack.release();
+    }
+
+    /*
+     * tests if the Looper for the current thread has been prepared,
+     * If not, it makes one, prepares it and returns it.
+     * If this returns non-null, the caller is reponsible for calling quit()
+     * on the returned Looper.
+     */
+    private Looper prepareIfNeededLooper() {
+        // non-null Handler
+        Looper myLooper = null;
+        if (Looper.myLooper() == null) {
+            Looper.prepare();
+            myLooper = Looper.myLooper();
+            assertNotNull(myLooper);
+        }
+        return myLooper;
+    }
+
+    private class AudioTrackRoutingListener implements AudioTrack.OnRoutingChangedListener {
+        public void onRoutingChanged(AudioTrack audioTrack) {}
+    }
+
+    public void test_audioTrack_RoutingListener() {
+        AudioTrack audioTrack = allocAudioTrack();
+
+        audioTrack.addOnRoutingChangedListener(null, null);
+
+        AudioTrackRoutingListener listener = new AudioTrackRoutingListener();
+        AudioTrackRoutingListener someOtherListener = new AudioTrackRoutingListener();
+
+        audioTrack.addOnRoutingChangedListener(listener, null);
+
+        // remove a listener we didn't add
+        audioTrack.removeOnRoutingChangedListener(someOtherListener);
+
+        audioTrack.removeOnRoutingChangedListener(listener);
+
+        Looper myLooper = prepareIfNeededLooper();
+        audioTrack.addOnRoutingChangedListener(listener, new Handler());
+
+        audioTrack.removeOnRoutingChangedListener(listener);
+
+        audioTrack.release();
+        if (myLooper != null) {
+            myLooper.quit();
+        }
+   }
+
+    private AudioRecord allocAudioRecord() {
+        int bufferSize =
+                AudioRecord.getMinBufferSize(
+                    41000,
+                    AudioFormat.CHANNEL_OUT_DEFAULT,
+                    AudioFormat.ENCODING_PCM_16BIT);
+        AudioRecord audioRecord =
+            new AudioRecord(
+                MediaRecorder.AudioSource.DEFAULT,
+                41000, AudioFormat.CHANNEL_OUT_DEFAULT,
+                AudioFormat.ENCODING_PCM_16BIT,
+                bufferSize);
+        return audioRecord;
+    }
+
+    private class AudioRecordRoutingListener implements AudioRecord.OnRoutingChangedListener {
+        public void onRoutingChanged(AudioRecord audioRecord) {}
+    }
+
+    public void test_audioRecord_RoutingListener() {
+        if (!mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MICROPHONE)) {
+            // Can't do it so skip this test
+            return;
+        }
+        AudioRecord audioRecord = allocAudioRecord();
+
+        audioRecord.addOnRoutingChangedListener(null, null);
+
+        AudioRecordRoutingListener listener = new AudioRecordRoutingListener();
+        AudioRecordRoutingListener someOtherListener = new AudioRecordRoutingListener();
+
+        audioRecord.addOnRoutingChangedListener(listener, null);
+
+        // remove a listener we didn't add
+        audioRecord.removeOnRoutingChangedListener(someOtherListener);
+
+        audioRecord.removeOnRoutingChangedListener(listener);
+
+        Looper myLooper = prepareIfNeededLooper();
+        audioRecord.addOnRoutingChangedListener(listener, new Handler());
+
+        audioRecord.removeOnRoutingChangedListener(listener);
+
+        audioRecord.release();
+        if (myLooper != null) {
+            myLooper.quit();
+        }
+    }
+
+    public void test_audioRecord_preferredDevice() {
+        if (!mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MICROPHONE)) {
+            // Can't do it so skip this test
+            return;
+        }
+
+        AudioRecord audioRecord = allocAudioRecord();
+        assertNotNull(audioRecord);
+
+        // None selected (new AudioRecord), so check for default
+        assertNull(audioRecord.getPreferredDevice());
+
+        // resets to default
+        assertTrue(audioRecord.setPreferredDevice(null));
+
+        // test each device
+        AudioDeviceInfo[] deviceList = mAudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS);
+        for (int index = 0; index < deviceList.length; index++) {
+            assertTrue(audioRecord.setPreferredDevice(deviceList[index]));
+            assertTrue(audioRecord.getPreferredDevice() == deviceList[index]);
+        }
+
+        // Check defaults again
+        assertTrue(audioRecord.setPreferredDevice(null));
+        assertNull(audioRecord.getPreferredDevice());
+
+        audioRecord.release();
+    }
+
+    private class AudioTrackFiller implements Runnable {
+        AudioTrack mAudioTrack;
+        int mBufferSize;
+
+        boolean mPlaying;
+
+        short[] mAudioData;
+
+        public AudioTrackFiller(AudioTrack audioTrack, int bufferSize) {
+            mAudioTrack = audioTrack;
+            mBufferSize = bufferSize;
+            mPlaying = false;
+
+            // setup audio data (silence will suffice)
+            mAudioData = new short[mBufferSize];
+            for (int index = 0; index < mBufferSize; index++) {
+                mAudioData[index] = 0;
+            }
+        }
+
+        public void start() { mPlaying = true; }
+        public void stop() { mPlaying = false; }
+
+        @Override
+        public void run() {
+            while (mAudioTrack != null && mPlaying) {
+                mAudioTrack.write(mAudioData, 0, mBufferSize);
+            }
+        }
+    }
+
+    public void test_audioTrack_getRoutedDevice() {
+        int bufferSize =
+                AudioTrack.getMinBufferSize(
+                    41000,
+                    AudioFormat.CHANNEL_OUT_STEREO,
+                    AudioFormat.ENCODING_PCM_16BIT);
+        AudioTrack audioTrack =
+            new AudioTrack(
+                AudioManager.STREAM_MUSIC,
+                41000,
+                AudioFormat.CHANNEL_OUT_STEREO,
+                AudioFormat.ENCODING_PCM_16BIT,
+                bufferSize,
+                AudioTrack.MODE_STREAM);
+
+        AudioTrackFiller filler = new AudioTrackFiller(audioTrack, bufferSize);
+        filler.start();
+
+        audioTrack.play();
+
+        Thread fillerThread = new Thread(filler);
+        fillerThread.start();
+
+        try { Thread.sleep(1000); } catch (InterruptedException ex) {}
+
+        // No explicit route
+        AudioDeviceInfo routedDevice = audioTrack.getRoutedDevice();
+        assertNotNull(routedDevice); // we probably can't say anything more than this
+
+        filler.stop();
+        audioTrack.stop();
+        audioTrack.release();
+    }
+
+    private class AudioRecordPuller implements Runnable {
+        AudioRecord mAudioRecord;
+        int mBufferSize;
+
+        boolean mRecording;
+
+        short[] mAudioData;
+
+        public AudioRecordPuller(AudioRecord audioRecord, int bufferSize) {
+            mAudioRecord = audioRecord;
+            mBufferSize = bufferSize;
+            mRecording = false;
+        }
+
+        public void start() { mRecording = true; }
+        public void stop() { mRecording = false; }
+
+        @Override
+        public void run() {
+            while (mAudioRecord != null && mRecording) {
+                mAudioRecord.read(mAudioData, 0, mBufferSize);
+           }
+        }
+    }
+
+    public void test_audioRecord_getRoutedDevice() {
+        if (!mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MICROPHONE)) {
+            return;
+        }
+
+        int bufferSize =
+                AudioRecord.getMinBufferSize(
+                    41000,
+                    AudioFormat.CHANNEL_OUT_DEFAULT,
+                    AudioFormat.ENCODING_PCM_16BIT);
+        AudioRecord audioRecord =
+            new AudioRecord(
+                MediaRecorder.AudioSource.DEFAULT,
+                41000, AudioFormat.CHANNEL_OUT_DEFAULT,
+                AudioFormat.ENCODING_PCM_16BIT,
+                bufferSize);
+
+        AudioRecordPuller puller = new AudioRecordPuller(audioRecord, bufferSize);
+        puller.start();
+
+        audioRecord.startRecording();
+
+        Thread pullerThread = new Thread(puller);
+        pullerThread.start();
+
+        try { Thread.sleep(1000); } catch (InterruptedException ex) {}
+
+        // No explicit route
+        AudioDeviceInfo routedDevice = audioRecord.getRoutedDevice();
+        assertNotNull(routedDevice); // we probably can't say anything more than this
+
+        puller.stop();
+        audioRecord.stop();
+        audioRecord.release();
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/SoundPoolTest.java b/tests/tests/media/src/android/media/cts/SoundPoolTest.java
index 15d18a0..23c4a7c 100644
--- a/tests/tests/media/src/android/media/cts/SoundPoolTest.java
+++ b/tests/tests/media/src/android/media/cts/SoundPoolTest.java
@@ -21,6 +21,7 @@
 
 import android.content.Context;
 import android.content.res.AssetFileDescriptor;
+import android.media.AudioAttributes;
 import android.media.AudioManager;
 import android.media.SoundPool;
 import android.test.AndroidTestCase;
@@ -29,6 +30,8 @@
 import java.io.FileDescriptor;
 import java.io.FileOutputStream;
 import java.io.InputStream;
+import java.util.Arrays;
+import java.util.concurrent.atomic.AtomicInteger;
 
 abstract class SoundPoolTest extends AndroidTestCase {
 
@@ -230,6 +233,104 @@
         mSoundPool.release();
     }
 
+    public void testAutoPauseResume() throws Exception {
+        // The number of possible SoundPool streams simultaneously active is limited by
+        // track resources. Generally this is no greater than 32, but the actual
+        // amount may be less depending on concurrently running applications.
+        // Here we attempt to create more streams than what is normally possible;
+        // SoundPool should gracefully degrade to play those streams it can.
+        //
+        // Try to keep the maxStreams less than the number required to be active
+        // and certainly less than 20 to be cooperative to other applications.
+        final int TEST_STREAMS = 40;
+        SoundPool soundPool = null;
+        try {
+            soundPool = new SoundPool.Builder()
+                    .setAudioAttributes(new AudioAttributes.Builder().build())
+                    .setMaxStreams(TEST_STREAMS)
+                    .build();
+
+            // get our sounds
+            final int[] sounds = getSounds();
+
+            // set our completion listener
+            final int[] loadIds = new int[TEST_STREAMS];
+            final Object done = new Object();
+            final int[] loaded = new int[1]; // used as a "pointer" to an integer
+            final SoundPool fpool = soundPool; // final reference in scope of try block
+            soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
+                    @Override
+                    public void onLoadComplete(SoundPool pool, int sampleId, int status) {
+                        assertEquals(fpool, pool);
+                        assertEquals(0 /* success */, status);
+                        synchronized(done) {
+                            loadIds[loaded[0]++] = sampleId;
+                            if (loaded[0] == loadIds.length) {
+                                done.notify();
+                            }
+                        }
+                    }
+                });
+
+            // initiate loading
+            final int[] soundIds = new int[TEST_STREAMS];
+            for (int i = 0; i < soundIds.length; i++) {
+                soundIds[i] = soundPool.load(mContext, sounds[i % sounds.length], PRIORITY);
+            }
+
+            // wait for all sounds to load
+            final long LOAD_TIMEOUT_IN_MS = 10000;
+            final long startTime = System.currentTimeMillis();
+            synchronized(done) {
+                while (loaded[0] != soundIds.length) {
+                    final long waitTime =
+                            LOAD_TIMEOUT_IN_MS - (System.currentTimeMillis() - startTime);
+                    assertTrue(waitTime > 0);
+                    done.wait(waitTime);
+                }
+            }
+
+            // verify the Ids match (actually does sorting too)
+            Arrays.sort(loadIds);
+            Arrays.sort(soundIds);
+            assertTrue(Arrays.equals(loadIds, soundIds));
+
+            // play - should hear the following:
+            // 1 second of sound
+            // 1 second of silence
+            // 1 second of sound.
+            int[] streamIds = new int[soundIds.length];
+            for (int i = 0; i < soundIds.length; i++) {
+                streamIds[i] = soundPool.play(soundIds[i],
+                        0.5f /* leftVolume */, 0.5f /* rightVolume */, PRIORITY,
+                        -1 /* loop (infinite) */, 1.0f /* rate */);
+            }
+            Thread.sleep(1000 /* millis */);
+            soundPool.autoPause();
+            Thread.sleep(1000 /* millis */);
+            soundPool.autoResume();
+            Thread.sleep(1000 /* millis */);
+
+            // clean up
+            for (int stream : streamIds) {
+                assertTrue(stream != 0);
+                soundPool.stop(stream);
+            }
+            for (int sound : soundIds) {
+                assertEquals(true, soundPool.unload(sound));
+            }
+            // check to see we're really unloaded
+            for (int sound : soundIds) {
+                assertEquals(false, soundPool.unload(sound));
+            }
+        } finally {
+            if (soundPool != null) {
+                soundPool.release();
+                soundPool = null;
+            }
+        }
+    }
+
     /**
      * Load a sample and wait until it is ready to be played.
      * @return The sample ID.
diff --git a/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java b/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
index dd7c1f6..7497da2 100644
--- a/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
@@ -18,12 +18,16 @@
 import android.cts.util.MediaUtils;
 import android.media.MediaFormat;
 import android.media.MediaPlayer;
+import android.media.MediaPlayer.TrackInfo;
+import android.media.TimedMetaData;
 import android.os.Looper;
+import android.os.PowerManager;
 import android.os.SystemClock;
 import android.util.Log;
 import android.webkit.cts.CtsTestServer;
 
 import java.io.IOException;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * Tests of MediaPlayer streaming capabilities.
@@ -307,6 +311,94 @@
         localHlsTest("hls.m3u8", false, true);
     }
 
+    public void testPlayHlsStreamWithTimedId3() throws Throwable {
+        mServer = new CtsTestServer(mContext);
+        try {
+            // counter must be final if we want to access it inside onTimedMetaData;
+            // use AtomicInteger so we can have a final counter object with mutable integer value.
+            final AtomicInteger counter = new AtomicInteger();
+            String stream_url = mServer.getAssetUrl("prog_index.m3u8");
+            mMediaPlayer.setDataSource(stream_url);
+            mMediaPlayer.setDisplay(getActivity().getSurfaceHolder());
+            mMediaPlayer.setScreenOnWhilePlaying(true);
+            mMediaPlayer.setWakeMode(mContext, PowerManager.PARTIAL_WAKE_LOCK);
+            mMediaPlayer.setOnTimedMetaDataAvailableListener(new MediaPlayer.OnTimedMetaDataAvailableListener() {
+                @Override
+                public void onTimedMetaDataAvailable(MediaPlayer mp, TimedMetaData md) {
+                    counter.incrementAndGet();
+                    int pos = mp.getCurrentPosition();
+                    long timeUs = md.getTimestamp();
+                    byte[] rawData = md.getMetaData();
+                    // Raw data contains an id3 tag holding the decimal string representation of
+                    // the associated time stamp rounded to the closest half second.
+
+                    int offset = 0;
+                    offset += 3; // "ID3"
+                    offset += 2; // version
+                    offset += 1; // flags
+                    offset += 4; // size
+                    offset += 4; // "TXXX"
+                    offset += 4; // frame size
+                    offset += 2; // frame flags
+                    offset += 1; // "\x03" : UTF-8 encoded Unicode
+                    offset += 1; // "\x00" : null-terminated empty description
+
+                    int length = rawData.length;
+                    length -= offset;
+                    length -= 1; // "\x00" : terminating null
+
+                    String data = new String(rawData, offset, length);
+                    int dataTimeUs = Integer.parseInt(data);
+                    assertTrue("Timed ID3 timestamp does not match content",
+                            Math.abs(dataTimeUs - timeUs) < 500000);
+                    assertTrue("Timed ID3 arrives after timestamp", pos * 1000 < timeUs);
+                }
+            });
+
+            final Object completion = new Object();
+            mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
+                int run;
+                @Override
+                public void onCompletion(MediaPlayer mp) {
+                    if (run++ == 0) {
+                        mMediaPlayer.seekTo(0);
+                        mMediaPlayer.start();
+                    } else {
+                        mMediaPlayer.stop();
+                        synchronized (completion) {
+                            completion.notify();
+                        }
+                    }
+                }
+            });
+
+            mMediaPlayer.prepare();
+            mMediaPlayer.start();
+            assertTrue("MediaPlayer not playing", mMediaPlayer.isPlaying());
+
+            int i = -1;
+            TrackInfo[] trackInfos = mMediaPlayer.getTrackInfo();
+            for (i = 0; i < trackInfos.length; i++) {
+                TrackInfo trackInfo = trackInfos[i];
+                if (trackInfo.getTrackType() == TrackInfo.MEDIA_TRACK_TYPE_METADATA) {
+                    break;
+                }
+            }
+            assertTrue("Stream has no timed ID3 track", i >= 0);
+            mMediaPlayer.selectTrack(i);
+
+            synchronized (completion) {
+                completion.wait();
+            }
+
+            // There are a total of 19 metadata access units in the test stream; every one of them
+            // should be received twice: once before the seek and once after.
+            assertTrue("Incorrect number of timed ID3s recieved", counter.get() == 38);
+        } finally {
+            mServer.shutdown();
+        }
+    }
+
     private static class WorkerWithPlayer implements Runnable {
         private final Object mLock = new Object();
         private Looper mLooper;
diff --git a/tests/tests/media/src/android/media/cts/StubMediaBrowserService.java b/tests/tests/media/src/android/media/cts/StubMediaBrowserService.java
index 35e88f0..b5ba715 100644
--- a/tests/tests/media/src/android/media/cts/StubMediaBrowserService.java
+++ b/tests/tests/media/src/android/media/cts/StubMediaBrowserService.java
@@ -46,7 +46,8 @@
 
     /* package private */ static MediaSession sSession;
     private Bundle mExtras;
-    private Result<List<MediaItem>> mPendingResult;
+    private Result<List<MediaItem>> mPendingLoadChildrenResult;
+    private Result<MediaItem> mPendingLoadItemResult;
 
     @Override
     public void onCreate() {
@@ -73,16 +74,43 @@
             }
             result.sendResult(mediaItems);
         } else if (MEDIA_ID_CHILDREN_DELAYED.equals(parentMediaId)) {
-            Assert.assertNull(mPendingResult);
-            mPendingResult = result;
+            Assert.assertNull(mPendingLoadChildrenResult);
+            mPendingLoadChildrenResult = result;
             result.detach();
         }
     }
 
+    @Override
+    public void onLoadItem(String itemId, Result<MediaItem> result) {
+        if (MEDIA_ID_CHILDREN_DELAYED.equals(itemId)) {
+            mPendingLoadItemResult = result;
+            result.detach();
+            return;
+        }
+
+        for (String id : MEDIA_ID_CHILDREN) {
+            if (id.equals(itemId)) {
+                result.sendResult(new MediaItem(new MediaDescription.Builder()
+                        .setMediaId(id).build(), MediaItem.FLAG_BROWSABLE));
+                return;
+            }
+        }
+
+        super.onLoadItem(itemId, result);
+    }
+
     public void sendDelayedNotifyChildrenChanged() {
-        if (mPendingResult != null) {
-            mPendingResult.sendResult(Collections.<MediaItem>emptyList());
-            mPendingResult = null;
+        if (mPendingLoadChildrenResult != null) {
+            mPendingLoadChildrenResult.sendResult(Collections.<MediaItem>emptyList());
+            mPendingLoadChildrenResult = null;
+        }
+    }
+
+    public void sendDelayedItemLoaded() {
+        if (mPendingLoadItemResult != null) {
+            mPendingLoadItemResult.sendResult(new MediaItem(new MediaDescription.Builder()
+                    .setMediaId(MEDIA_ID_CHILDREN_DELAYED).build(), MediaItem.FLAG_BROWSABLE));
+            mPendingLoadItemResult = null;
         }
     }
 }
diff --git a/tests/tests/media/src/android/media/cts/TestMediaDataSource.java b/tests/tests/media/src/android/media/cts/TestMediaDataSource.java
new file mode 100644
index 0000000..a10840b
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/TestMediaDataSource.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2015 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.media.cts;
+
+import android.content.res.AssetFileDescriptor;
+import android.media.cts.MediaPlayerTestBase.Monitor;
+import android.media.MediaDataSource;
+import android.util.Log;
+
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+
+/**
+ * A MediaDataSource that reads from a byte array for use in tests.
+ */
+public class TestMediaDataSource extends MediaDataSource {
+    private static final String TAG = "TestMediaDataSource";
+
+    private byte[] mData;
+
+    private boolean mThrowFromReadAt;
+    private boolean mThrowFromGetSize;
+    private Integer mReturnFromReadAt;
+    private Long mReturnFromGetSize;
+    private boolean mIsClosed;
+
+    // Read an asset fd into a new byte array data source. Closes afd.
+    public static TestMediaDataSource fromAssetFd(AssetFileDescriptor afd) throws IOException {
+        try {
+            InputStream in = afd.createInputStream();
+            final int size = (int) afd.getDeclaredLength();
+            byte[] data = new byte[(int) size];
+            int writeIndex = 0;
+            int numRead = 0;
+            do {
+                numRead = in.read(data, writeIndex, size - writeIndex);
+                writeIndex += numRead;
+            } while (numRead >= 0);
+            return new TestMediaDataSource(data);
+        } finally {
+            afd.close();
+        }
+    }
+
+    public TestMediaDataSource(byte[] data) {
+        mData = data;
+    }
+
+    @Override
+    public synchronized int readAt(long position, byte[] buffer, int offset, int size)
+            throws IOException {
+        if (mThrowFromReadAt) {
+            throw new IOException("Test exception from readAt()");
+        }
+        if (mReturnFromReadAt != null) {
+            return mReturnFromReadAt;
+        }
+
+        // Clamp reads past the end of the source.
+        if (position >= mData.length) {
+            return -1; // -1 indicates EOF
+        }
+        if (position + size > mData.length) {
+            size -= (position + size) - mData.length;
+        }
+        System.arraycopy(mData, (int)position, buffer, offset, size);
+        return size;
+    }
+
+    @Override
+    public synchronized long getSize() throws IOException {
+        if (mThrowFromGetSize) {
+            throw new IOException("Test exception from getSize()");
+        }
+        if (mReturnFromGetSize != null) {
+            return mReturnFromGetSize;
+        }
+
+        Log.v(TAG, "getSize: " + mData.length);
+        return mData.length;
+    }
+
+    // Note: it's fine to keep using this data source after closing it.
+    @Override
+    public synchronized void close() {
+        Log.v(TAG, "close()");
+        mIsClosed = true;
+    }
+
+    // Whether close() has been called.
+    public synchronized boolean isClosed() {
+        return mIsClosed;
+    }
+
+    public void throwFromReadAt() {
+        mThrowFromReadAt = true;
+    }
+
+    public void throwFromGetSize() {
+        mThrowFromGetSize = true;
+    }
+
+    public void returnFromReadAt(int numRead) {
+        mReturnFromReadAt = numRead;
+    }
+
+    public void returnFromGetSize(long size) {
+        mReturnFromGetSize = size;
+    }
+}
+
diff --git a/tests/tests/media/src/android/media/cts/Utils.java b/tests/tests/media/src/android/media/cts/Utils.java
new file mode 100644
index 0000000..bb9cf78
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/Utils.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2015 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.media.cts;
+
+import android.app.Instrumentation;
+import android.app.UiAutomation;
+import android.os.ParcelFileDescriptor;
+
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.Scanner;
+
+public class Utils {
+    public static void enableAppOps(String packageName, String operation,
+            Instrumentation instrumentation) {
+        setAppOps(packageName, operation, instrumentation, true);
+    }
+
+    public static void disableAppOps(String packageName, String operation,
+            Instrumentation instrumentation) {
+        setAppOps(packageName, operation, instrumentation, false);
+    }
+
+    public static String convertStreamToString(InputStream is) {
+        try (Scanner scanner = new Scanner(is).useDelimiter("\\A")) {
+            return scanner.hasNext() ? scanner.next() : "";
+        }
+    }
+
+    private static void setAppOps(String packageName, String operation,
+            Instrumentation instrumentation, boolean enable) {
+        StringBuilder cmd = new StringBuilder();
+        cmd.append("appops set ");
+        cmd.append(packageName);
+        cmd.append(" ");
+        cmd.append(operation);
+        cmd.append(enable ? " allow" : " deny");
+        instrumentation.getUiAutomation().executeShellCommand(cmd.toString());
+
+        StringBuilder query = new StringBuilder();
+        query.append("appops get ");
+        query.append(packageName);
+        query.append(" ");
+        query.append(operation);
+        String queryStr = query.toString();
+
+        String expectedResult = enable ? "allow" : "deny";
+        String result = "";
+        while(!result.contains(expectedResult)) {
+            ParcelFileDescriptor pfd = instrumentation.getUiAutomation().executeShellCommand(
+                                                            queryStr);
+            InputStream inputStream = new FileInputStream(pfd.getFileDescriptor());
+            result = convertStreamToString(inputStream);
+        }
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/VideoDecoderPerfTest.java b/tests/tests/media/src/android/media/cts/VideoDecoderPerfTest.java
new file mode 100644
index 0000000..f5680f6
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/VideoDecoderPerfTest.java
@@ -0,0 +1,568 @@
+/*
+ * Copyright (C) 2015 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.media.cts;
+
+import com.android.cts.media.R;
+
+import android.content.Context;
+import android.content.res.AssetFileDescriptor;
+import android.content.res.Resources;
+import android.cts.util.DeviceReportLog;
+import android.cts.util.MediaUtils;
+import android.media.MediaCodec;
+import android.media.MediaCodecList;
+import android.media.MediaCodecInfo;
+import android.media.MediaCodecInfo.CodecCapabilities;
+import android.media.MediaCodecInfo.VideoCapabilities;
+import android.media.MediaExtractor;
+import android.media.MediaFormat;
+import android.util.Log;
+import android.util.Range;
+import android.view.Surface;
+
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+import com.android.cts.util.Stat;
+
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.LinkedList;
+
+public class VideoDecoderPerfTest extends MediaPlayerTestBase {
+    private static final String TAG = "VideoDecoderPerfTest";
+    private static final int TOTAL_FRAMES = 3000;
+    private static final int MAX_TIME_MS = 120000;  // 2 minutes
+    private static final int NUMBER_OF_REPEAT = 2;
+    private static final String VIDEO_AVC = MediaFormat.MIMETYPE_VIDEO_AVC;
+    private static final String VIDEO_VP8 = MediaFormat.MIMETYPE_VIDEO_VP8;
+    private static final String VIDEO_VP9 = MediaFormat.MIMETYPE_VIDEO_VP9;
+    private static final String VIDEO_HEVC = MediaFormat.MIMETYPE_VIDEO_HEVC;
+    private static final String VIDEO_H263 = MediaFormat.MIMETYPE_VIDEO_H263;
+    private static final String VIDEO_MPEG4 = MediaFormat.MIMETYPE_VIDEO_MPEG4;
+
+    private static final int MAX_SIZE_SAMPLES_IN_MEMORY_BYTES = 5 * 1024 * 1024;  // 5MB
+    LinkedList<ByteBuffer> mSamplesInMemory = new LinkedList<ByteBuffer>();
+    private static final int MOVING_AVERAGE_NUM = 10;
+    private MediaFormat mDecOutputFormat;
+    private double[] mMeasuredFps;
+    private String[] mResultRawData;
+
+    private Resources mResources;
+    private DeviceReportLog mReportLog;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mResources = mContext.getResources();
+        mReportLog = new DeviceReportLog();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mReportLog.deliverReportToHost(getInstrumentation());
+        super.tearDown();
+    }
+
+    private static String[] getDecoderName(String mime, boolean isGoog) {
+        MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
+        ArrayList<String> result = new ArrayList<String>();
+        for (MediaCodecInfo info : mcl.getCodecInfos()) {
+            if (info.isEncoder() ||
+                    info.getName().toLowerCase().startsWith("omx.google.") != isGoog) {
+                continue;
+            }
+            CodecCapabilities caps = null;
+            try {
+                caps = info.getCapabilitiesForType(mime);
+            } catch (IllegalArgumentException e) {  // mime is not supported
+                continue;
+            }
+            result.add(info.getName());
+        }
+        return result.toArray(new String[result.size()]);
+    }
+
+    private void decode(String mime, int video, int width, int height,
+            boolean isGoog) throws Exception {
+        String[] names = getDecoderName(mime, isGoog);
+        for (String name: names) {
+            if (!MediaUtils.supports(name, mime, width, height)) {
+                Log.i(TAG, "Codec " + name + " with " + width + "," + height + " not supported");
+                continue;
+            }
+
+            boolean pass = false;
+            mMeasuredFps = new double[NUMBER_OF_REPEAT];
+            mResultRawData = new String[NUMBER_OF_REPEAT];
+            Log.d(TAG, "testing " + name);
+            for (int i = 0; i < NUMBER_OF_REPEAT; ++i) {
+                // Decode to Surface.
+                Log.d(TAG, "round #" + i + " decode to surface");
+                Surface s = getActivity().getSurfaceHolder().getSurface();
+                // only verify the result for decode to surface case.
+                if (doDecode(name, video, width, height, s, i)) {
+                    pass = true;
+                }
+
+                // Decode to buffer.
+                Log.d(TAG, "round #" + i + " decode to buffer");
+                doDecode(name, video, width, height, null, i);
+            }
+
+            if (!pass) {
+                Range<Double> reportedRange =
+                    MediaUtils.getAchievableFrameRatesFor(name, mime, width, height);
+                String failMessage =
+                    MediaUtils.getErrorMessage(reportedRange, mMeasuredFps, mResultRawData);
+                fail(failMessage);
+            }
+            mMeasuredFps = null;
+            mResultRawData = null;
+        }
+        // use 0 for summary line, detail for each test config is in the report.
+        mReportLog.printSummary("average fps", 0, ResultType.HIGHER_BETTER, ResultUnit.FPS);
+        mSamplesInMemory.clear();
+    }
+
+    private boolean doDecode(String name, int video, int w, int h, Surface surface, int round)
+            throws Exception {
+        AssetFileDescriptor testFd = mResources.openRawResourceFd(video);
+        MediaExtractor extractor = new MediaExtractor();
+        extractor.setDataSource(testFd.getFileDescriptor(), testFd.getStartOffset(),
+                testFd.getLength());
+        extractor.selectTrack(0);
+        int trackIndex = extractor.getSampleTrackIndex();
+        MediaFormat format = extractor.getTrackFormat(trackIndex);
+        String mime = format.getString(MediaFormat.KEY_MIME);
+        ByteBuffer[] codecInputBuffers;
+        ByteBuffer[] codecOutputBuffers;
+
+        if (mSamplesInMemory.size() == 0) {
+            int totalMemory = 0;
+            ByteBuffer tmpBuf = ByteBuffer.allocate(w * h * 3 / 2);
+            int sampleSize = 0;
+            int index = 0;
+            while ((sampleSize = extractor.readSampleData(tmpBuf, 0 /* offset */)) > 0) {
+                if (totalMemory + sampleSize > MAX_SIZE_SAMPLES_IN_MEMORY_BYTES) {
+                    break;
+                }
+                ByteBuffer copied = ByteBuffer.allocate(sampleSize);
+                copied.put(tmpBuf);
+                mSamplesInMemory.addLast(copied);
+                totalMemory += sampleSize;
+                extractor.advance();
+            }
+            Log.d(TAG, mSamplesInMemory.size() + " samples in memory for " +
+                    (totalMemory / 1024) + " KB.");
+        }
+        int sampleIndex = 0;
+
+        extractor.release();
+        testFd.close();
+
+        MediaCodec codec = MediaCodec.createByCodecName(name);
+        VideoCapabilities cap = codec.getCodecInfo().getCapabilitiesForType(mime).getVideoCapabilities();
+        int frameRate = 120;
+        try {
+            frameRate = cap.getSupportedFrameRatesFor(w, h).getUpper().intValue();
+        } catch (IllegalArgumentException e) {
+            Log.w(TAG, "unsupported size");
+            codec.release();
+            return false;
+        }
+        codec.configure(format, surface, null /* crypto */, 0 /* flags */);
+        codec.start();
+        codecInputBuffers = codec.getInputBuffers();
+        codecOutputBuffers = codec.getOutputBuffers();
+
+        // start decode loop
+        MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
+
+        final long kTimeOutUs = 5000; // 5ms timeout
+        double[] frameTimeDiff = new double[TOTAL_FRAMES - 1];
+        long lastOutputTimeNs = 0;
+        boolean sawInputEOS = false;
+        boolean sawOutputEOS = false;
+        int inputNum = 0;
+        int outputNum = 0;
+        long start = System.currentTimeMillis();
+        while (!sawOutputEOS) {
+            // handle input
+            if (!sawInputEOS) {
+                int inputBufIndex = codec.dequeueInputBuffer(kTimeOutUs);
+
+                if (inputBufIndex >= 0) {
+                    ByteBuffer dstBuf = codecInputBuffers[inputBufIndex];
+                    ByteBuffer sample =
+                            mSamplesInMemory.get(sampleIndex++ % mSamplesInMemory.size());
+                    sample.rewind();
+                    int sampleSize = sample.remaining();
+                    dstBuf.put(sample);
+                    // use 120fps to compute pts
+                    long presentationTimeUs = inputNum * 1000000L / frameRate;
+
+                    sawInputEOS = (++inputNum == TOTAL_FRAMES);
+                    if (!sawInputEOS &&
+                            ((System.currentTimeMillis() - start) > MAX_TIME_MS)) {
+                        sawInputEOS = true;
+                    }
+                    if (sawInputEOS) {
+                        Log.d(TAG, "saw input EOS (stop at sample).");
+                    }
+                    codec.queueInputBuffer(
+                            inputBufIndex,
+                            0 /* offset */,
+                            sampleSize,
+                            presentationTimeUs,
+                            sawInputEOS ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
+                } else {
+                    assertEquals(
+                            "codec.dequeueInputBuffer() unrecognized return value: " + inputBufIndex,
+                            MediaCodec.INFO_TRY_AGAIN_LATER, inputBufIndex);
+                }
+            }
+
+            // handle output
+            int outputBufIndex = codec.dequeueOutputBuffer(info, kTimeOutUs);
+
+            if (outputBufIndex >= 0) {
+                if (info.size > 0) { // Disregard 0-sized buffers at the end.
+                    if (lastOutputTimeNs > 0) {
+                        frameTimeDiff[outputNum - 1] = System.nanoTime() - lastOutputTimeNs;
+                    }
+                    lastOutputTimeNs = System.nanoTime();
+                    outputNum++;
+                }
+                codec.releaseOutputBuffer(outputBufIndex, false /* render */);
+                if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
+                    Log.d(TAG, "saw output EOS.");
+                    sawOutputEOS = true;
+                }
+            } else if (outputBufIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
+                codecOutputBuffers = codec.getOutputBuffers();
+                Log.d(TAG, "output buffers have changed.");
+            } else if (outputBufIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
+                mDecOutputFormat = codec.getOutputFormat();
+                int width = mDecOutputFormat.getInteger(MediaFormat.KEY_WIDTH);
+                int height = mDecOutputFormat.getInteger(MediaFormat.KEY_HEIGHT);
+                Log.d(TAG, "output resolution " + width + "x" + height);
+            } else {
+                assertEquals(
+                        "codec.dequeueOutputBuffer() unrecognized return index: "
+                                + outputBufIndex,
+                        MediaCodec.INFO_TRY_AGAIN_LATER, outputBufIndex);
+            }
+        }
+        long finish = System.currentTimeMillis();
+        int validDataNum = outputNum - 1;
+        frameTimeDiff = Arrays.copyOf(frameTimeDiff, validDataNum);
+        codec.stop();
+        codec.release();
+
+        Log.d(TAG, "input num " + inputNum + " vs output num " + outputNum);
+
+        String testConfig = "codec=" + name +
+                " decodeto=" + ((surface == null) ? "buffer" : "surface") +
+                " mime=" + mime + " round=" + round +
+                " DecOutputFormat=" + mDecOutputFormat;
+
+        String message = "average fps for " + testConfig;
+        double fps = (double)outputNum / ((finish - start) / 1000.0);
+        mReportLog.printValue(message, fps, ResultType.HIGHER_BETTER, ResultUnit.FPS);
+
+        double[] avgs = MediaUtils.calculateMovingAverage(frameTimeDiff, MOVING_AVERAGE_NUM);
+        double decMin = Stat.getMin(avgs);
+        double decMax = Stat.getMax(avgs);
+        double decAvg = Stat.getAverage(avgs);
+        double decStdev = MediaUtils.getStdev(avgs);
+        String result =
+                MediaUtils.logResults(mReportLog, testConfig, decMin, decMax, decAvg, decStdev);
+        fps = 1000000000 / decMin;
+        if (surface != null) {
+            mMeasuredFps[round] = fps;
+            mResultRawData[round] = result;
+        }
+
+        return MediaUtils.verifyResults(name, mime, w, h, fps);
+    }
+
+    public void testH2640320x0240Other() throws Exception {
+        decode(VIDEO_AVC,
+               R.raw.video_320x240_mp4_h264_800kbps_30fps_aac_stereo_128kbps_44100hz,
+               320, 240, false /* isGoog */);
+    }
+
+    public void testH2640320x0240Goog() throws Exception {
+        decode(VIDEO_AVC,
+               R.raw.video_320x240_mp4_h264_800kbps_30fps_aac_stereo_128kbps_44100hz,
+               320, 240, true /* isGoog */);
+    }
+
+    public void testH2640720x0480Other() throws Exception {
+        decode(VIDEO_AVC,
+               R.raw.video_720x480_mp4_h264_2048kbps_30fps_aac_stereo_128kbps_44100hz,
+               720, 480, false /* isGoog */);
+    }
+
+    public void testH2640720x0480Goog() throws Exception {
+        decode(VIDEO_AVC,
+               R.raw.video_720x480_mp4_h264_2048kbps_30fps_aac_stereo_128kbps_44100hz,
+               720, 480, true /* isGoog */);
+    }
+
+    public void testH2641280x0720Other() throws Exception {
+        decode(VIDEO_AVC,
+               R.raw.video_1280x720_mp4_h264_8192kbps_30fps_aac_stereo_128kbps_44100hz,
+               1280, 720, false /* isGoog */);
+    }
+
+    public void testH2641280x0720Goog() throws Exception {
+        decode(VIDEO_AVC,
+               R.raw.video_1280x720_mp4_h264_8192kbps_30fps_aac_stereo_128kbps_44100hz,
+               1280, 720, true /* isGoog */);
+    }
+
+    public void testH2641920x1080Other() throws Exception {
+        decode(VIDEO_AVC,
+               R.raw.video_1920x1080_mp4_h264_20480kbps_30fps_aac_stereo_128kbps_44100hz,
+               1920, 1080, false /* isGoog */);
+    }
+
+    public void testH2641920x1080Goog() throws Exception {
+        decode(VIDEO_AVC,
+               R.raw.video_1920x1080_mp4_h264_20480kbps_30fps_aac_stereo_128kbps_44100hz,
+               1920, 1080, true /* isGoog */);
+    }
+
+    public void testVP80320x0240Other() throws Exception {
+        decode(VIDEO_VP8,
+               R.raw.video_320x240_webm_vp8_800kbps_30fps_vorbis_stereo_128kbps_44100hz,
+               320, 240, false /* isGoog */);
+    }
+
+    public void testVP80320x0240Goog() throws Exception {
+        decode(VIDEO_VP8,
+               R.raw.video_320x240_webm_vp8_800kbps_30fps_vorbis_stereo_128kbps_44100hz,
+               320, 240, true /* isGoog */);
+    }
+
+    public void testVP80640x0360Other() throws Exception {
+        decode(VIDEO_VP8,
+               R.raw.video_640x360_webm_vp8_2048kbps_30fps_vorbis_stereo_128kbps_48000hz,
+               640, 360, false /* isGoog */);
+    }
+
+    public void testVP80640x0360Goog() throws Exception {
+        decode(VIDEO_VP8,
+               R.raw.video_640x360_webm_vp8_2048kbps_30fps_vorbis_stereo_128kbps_48000hz,
+               640, 360, true /* isGoog */);
+    }
+
+    public void testVP81280x0720Other() throws Exception {
+        decode(VIDEO_VP8,
+               R.raw.video_1280x720_webm_vp8_8192kbps_30fps_vorbis_stereo_128kbps_48000hz,
+               1280, 720, false /* isGoog */);
+    }
+
+    public void testVP81280x0720Goog() throws Exception {
+        decode(VIDEO_VP8,
+               R.raw.video_1280x720_webm_vp8_8192kbps_30fps_vorbis_stereo_128kbps_48000hz,
+               1280, 720, true /* isGoog */);
+    }
+
+    public void testVP81920x1080Other() throws Exception {
+        decode(VIDEO_VP8,
+               R.raw.video_1920x1080_webm_vp8_20480kbps_30fps_vorbis_stereo_128kbps_48000hz,
+               1920, 1080, false /* isGoog */);
+    }
+
+    public void testVP81920x1080Goog() throws Exception {
+        decode(VIDEO_VP8,
+               R.raw.video_1920x1080_webm_vp8_20480kbps_30fps_vorbis_stereo_128kbps_48000hz,
+               1920, 1080, true /* isGoog */);
+    }
+
+    public void testVP90320x0240Other() throws Exception {
+        decode(VIDEO_VP9,
+               R.raw.video_320x240_webm_vp9_600kbps_30fps_vorbis_stereo_128kbps_48000hz,
+               320, 240, false /* isGoog */);
+    }
+
+    public void testVP90320x0240Goog() throws Exception {
+        decode(VIDEO_VP9,
+               R.raw.video_320x240_webm_vp9_600kbps_30fps_vorbis_stereo_128kbps_48000hz,
+               320, 240, true /* isGoog */);
+    }
+
+    public void testVP90640x0360Other() throws Exception {
+        decode(VIDEO_VP9,
+               R.raw.video_640x360_webm_vp9_1600kbps_30fps_vorbis_stereo_128kbps_48000hz,
+               640, 360, false /* isGoog */);
+    }
+
+    public void testVP90640x0360Goog() throws Exception {
+        decode(VIDEO_VP9,
+               R.raw.video_640x360_webm_vp9_1600kbps_30fps_vorbis_stereo_128kbps_48000hz,
+               640, 360, true /* isGoog */);
+    }
+
+    public void testVP91280x0720Other() throws Exception {
+        decode(VIDEO_VP9,
+               R.raw.video_1280x720_webm_vp9_4096kbps_30fps_vorbis_stereo_128kbps_44100hz,
+               1280, 720, false /* isGoog */);
+    }
+
+    public void testVP91280x0720Goog() throws Exception {
+        decode(VIDEO_VP9,
+               R.raw.video_1280x720_webm_vp9_4096kbps_30fps_vorbis_stereo_128kbps_44100hz,
+               1280, 720, true /* isGoog */);
+    }
+
+    public void testVP91920x1080Other() throws Exception {
+        decode(VIDEO_VP9,
+               R.raw.video_1920x1080_webm_vp9_10240kbps_30fps_vorbis_stereo_128kbps_48000hz,
+               1920, 1080, false /* isGoog */);
+    }
+
+    public void testVP91920x1080Goog() throws Exception {
+        decode(VIDEO_VP9,
+               R.raw.video_1920x1080_webm_vp9_10240kbps_30fps_vorbis_stereo_128kbps_48000hz,
+               1920, 1080, true /* isGoog */);
+    }
+
+    public void testVP93840x2160Other() throws Exception {
+        decode(VIDEO_VP9,
+               R.raw.video_3840x2160_webm_vp9_20480kbps_30fps_vorbis_stereo_128kbps_48000hz,
+               3840, 2160, false /* isGoog */);
+    }
+
+    public void testVP93840x2160Goog() throws Exception {
+        decode(VIDEO_VP9,
+               R.raw.video_3840x2160_webm_vp9_20480kbps_30fps_vorbis_stereo_128kbps_48000hz,
+               3840, 2160, true /* isGoog */);
+    }
+
+    public void testHEVC0352x0288Other() throws Exception {
+        decode(VIDEO_HEVC,
+               R.raw.video_352x288_mp4_hevc_600kbps_30fps_aac_stereo_128kbps_44100hz,
+               352, 288, false /* isGoog */);
+    }
+
+    public void testHEVC0352x0288Goog() throws Exception {
+        decode(VIDEO_HEVC,
+               R.raw.video_352x288_mp4_hevc_600kbps_30fps_aac_stereo_128kbps_44100hz,
+               352, 288, true /* isGoog */);
+    }
+
+    public void testHEVC0720x0480Other() throws Exception {
+        decode(VIDEO_HEVC,
+               R.raw.video_720x480_mp4_hevc_1638kbps_30fps_aac_stereo_128kbps_44100hz,
+               720, 480, false /* isGoog */);
+    }
+
+    public void testHEVC0720x0480Goog() throws Exception {
+        decode(VIDEO_HEVC,
+               R.raw.video_720x480_mp4_hevc_1638kbps_30fps_aac_stereo_128kbps_44100hz,
+               720, 480, true /* isGoog */);
+    }
+
+    public void testHEVC1280x0720Other() throws Exception {
+        decode(VIDEO_HEVC,
+               R.raw.video_1280x720_mp4_hevc_4096kbps_30fps_aac_stereo_128kbps_44100hz,
+               1280, 720, false /* isGoog */);
+    }
+
+    public void testHEVC1280x0720Goog() throws Exception {
+        decode(VIDEO_HEVC,
+               R.raw.video_1280x720_mp4_hevc_4096kbps_30fps_aac_stereo_128kbps_44100hz,
+               1280, 720, true /* isGoog */);
+    }
+
+    public void testHEVC1920x1080Other() throws Exception {
+        decode(VIDEO_HEVC,
+               R.raw.video_1920x1080_mp4_hevc_10240kbps_30fps_aac_stereo_128kbps_44100hz,
+               1920, 1080, false /* isGoog */);
+    }
+
+    public void testHEVC1920x1080Goog() throws Exception {
+        decode(VIDEO_HEVC,
+               R.raw.video_1920x1080_mp4_hevc_10240kbps_30fps_aac_stereo_128kbps_44100hz,
+               1920, 1080, true /* isGoog */);
+    }
+
+    public void testHEVC3840x2160Other() throws Exception {
+        decode(VIDEO_HEVC,
+               R.raw.video_3840x2160_mp4_hevc_20480kbps_30fps_aac_stereo_128kbps_44100hz,
+               3840, 2160, false /* isGoog */);
+    }
+
+    public void testHEVC3840x2160Goog() throws Exception {
+        decode(VIDEO_HEVC,
+               R.raw.video_3840x2160_mp4_hevc_20480kbps_30fps_aac_stereo_128kbps_44100hz,
+               3840, 2160, true /* isGoog */);
+    }
+
+    public void testH2630176x0144Other() throws Exception {
+        decode(VIDEO_H263,
+               R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz,
+               176, 144, false /* isGoog */);
+    }
+
+    public void testH2630176x0144Goog() throws Exception {
+        decode(VIDEO_H263,
+               R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz,
+               176, 144, true /* isGoog */);
+    }
+
+    public void testH2630352x0288Other() throws Exception {
+        decode(VIDEO_H263,
+               R.raw.video_352x288_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz,
+               352, 288, false /* isGoog */);
+    }
+
+    public void testH2630352x0288Goog() throws Exception {
+        decode(VIDEO_H263,
+               R.raw.video_352x288_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz,
+               352, 288, true /* isGoog */);
+    }
+
+    public void testMPEG40480x0360Other() throws Exception {
+        decode(VIDEO_MPEG4,
+               R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz,
+               480, 360, false /* isGoog */);
+    }
+
+    public void testMPEG40480x0360Goog() throws Exception {
+        decode(VIDEO_MPEG4,
+               R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz,
+               480, 360, true /* isGoog */);
+    }
+
+    public void testMPEG41280x0720Other() throws Exception {
+        decode(VIDEO_MPEG4,
+               R.raw.video_1280x720_mp4_mpeg4_1000kbps_25fps_aac_stereo_128kbps_44100hz,
+               1280, 720, false /* isGoog */);
+    }
+
+    public void testMPEG41280x0720Goog() throws Exception {
+        decode(VIDEO_MPEG4,
+               R.raw.video_1280x720_mp4_mpeg4_1000kbps_25fps_aac_stereo_128kbps_44100hz,
+               1280, 720, true /* isGoog */);
+    }
+}
+
diff --git a/tests/tests/media/src/android/media/cts/VideoEncoderTest.java b/tests/tests/media/src/android/media/cts/VideoEncoderTest.java
index 858e47c..e3d2f09 100644
--- a/tests/tests/media/src/android/media/cts/VideoEncoderTest.java
+++ b/tests/tests/media/src/android/media/cts/VideoEncoderTest.java
@@ -53,6 +53,8 @@
     private static final int MAX_SAMPLE_SIZE = 256 * 1024;
     private static final String TAG = "VideoEncoderTest";
     private static final long FRAME_TIMEOUT_MS = 1000;
+    // use larger delay before we get first frame, some encoders may need more time
+    private static final long INIT_TIMEOUT_MS = 2000;
 
     private static final String SOURCE_URL =
         "android.resource://com.android.cts.media/raw/video_480x360_mp4_h264_871kbps_30fps";
@@ -172,6 +174,7 @@
         private boolean mSignaledDecoderEOS;
 
         protected boolean mCompleted;
+        protected boolean mEncodeOutputFormatUpdated;
         protected final Object mCondition = new Object();
 
         protected MediaFormat mDecFormat;
@@ -382,7 +385,8 @@
                             // wait for an encoder input buffer and a decoder output buffer
                             // Use a timeout to avoid stalling the test if it doesn't arrive.
                             if (!haveBuffers() && !mCompleted) {
-                                mCondition.wait(FRAME_TIMEOUT_MS);
+                                mCondition.wait(mEncodeOutputFormatUpdated ?
+                                        FRAME_TIMEOUT_MS : INIT_TIMEOUT_MS);
                             }
                         } catch (InterruptedException ie) {
                             fail("wait interrupted");  // shouldn't happen
@@ -494,7 +498,7 @@
             if (mEncInputBufferSize < 0) {
                 mEncInputBufferSize = mEncoder.getInputBuffer(encBuffer).capacity();
             }
-            Log.d(TAG, "queuing output #" + encBuffer + " for encoder (sz="
+            Log.d(TAG, "queuing input #" + encBuffer + " for encoder (sz="
                     + mEncInputBufferSize + ", f=" + decBuffer.second.flags
                     + ", ts=" + decBuffer.second.presentationTimeUs + ")");
             mEncoder.queueInputBuffer(
@@ -515,6 +519,7 @@
         public void onOutputFormatChanged(MediaCodec mediaCodec, MediaFormat mediaFormat) {
             Log.i(TAG, mediaCodec.getName() + " got new output format " + mediaFormat);
             if (mediaCodec == mEncoder) {
+                mEncodeOutputFormatUpdated = true;
                 saveEncoderFormat(mediaFormat);
             }
         }
@@ -596,7 +601,8 @@
                             // wait for mFrameAvailable, which is set by onFrameAvailable().
                             // Use a timeout to avoid stalling the test if it doesn't arrive.
                             if (!mFrameAvailable && !mCompleted && !mEncoderIsActive) {
-                                mCondition.wait(FRAME_TIMEOUT_MS);
+                                mCondition.wait(mEncodeOutputFormatUpdated ?
+                                        FRAME_TIMEOUT_MS : INIT_TIMEOUT_MS);
                             }
                         } catch (InterruptedException ie) {
                             fail("wait interrupted");  // shouldn't happen
@@ -746,6 +752,7 @@
         public void onOutputFormatChanged(MediaCodec mediaCodec, MediaFormat mediaFormat) {
             Log.i(TAG, mediaCodec.getName() + " got new output format " + mediaFormat);
             if (mediaCodec == mEncoder) {
+                mEncodeOutputFormatUpdated = true;
                 saveEncoderFormat(mediaFormat);
             }
         }
diff --git a/tests/tests/media/src/android/media/cts/VisualizerTest.java b/tests/tests/media/src/android/media/cts/VisualizerTest.java
index 3c639a0..0d46ca7 100644
--- a/tests/tests/media/src/android/media/cts/VisualizerTest.java
+++ b/tests/tests/media/src/android/media/cts/VisualizerTest.java
@@ -55,9 +55,6 @@
 
     //Test case 0.0: test constructor and release
     public void test0_0ConstructorAndRelease() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         Visualizer visualizer = null;
         try {
             visualizer = new Visualizer(0);
@@ -79,9 +76,6 @@
 
     //Test case 1.0: capture rates
     public void test1_0CaptureRates() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getVisualizer(0);
         try {
             int captureRate = mVisualizer.getMaxCaptureRate();
@@ -101,9 +95,6 @@
 
     //Test case 1.1: test capture size
     public void test1_1CaptureSize() throws Exception {
-        if (!hasAudioOutput()) {
-            return;
-        }
         getVisualizer(0);
         try {
             int[] range = mVisualizer.getCaptureSizeRange();
@@ -135,6 +126,8 @@
     //Test case 2.0: test capture in polling mode
     public void test2_0PollingCapture() throws Exception {
         if (!hasAudioOutput()) {
+            Log.w(TAG,"AUDIO_OUTPUT feature not found. This system might not have a valid "
+                    + "audio output HAL");
             return;
         }
         try {
@@ -165,6 +158,8 @@
     //Test case 2.1: test capture with listener
     public void test2_1ListenerCapture() throws Exception {
         if (!hasAudioOutput()) {
+            Log.w(TAG,"AUDIO_OUTPUT feature not found. This system might not have a valid "
+                    + "audio output HAL");
             return;
         }
         try {
diff --git a/tests/tests/mediastress/src/android/mediastress/cts/MediaRecorderStressTest.java b/tests/tests/mediastress/src/android/mediastress/cts/MediaRecorderStressTest.java
index a6a06ea..17b79d0 100644
--- a/tests/tests/mediastress/src/android/mediastress/cts/MediaRecorderStressTest.java
+++ b/tests/tests/mediastress/src/android/mediastress/cts/MediaRecorderStressTest.java
@@ -38,7 +38,7 @@
 
 public class MediaRecorderStressTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
 
-    private static String TAG = "MediaRecorderStressTest";
+    private static final String TAG = "MediaRecorderStressTest";
     private static final int NUMBER_OF_CAMERA_STRESS_LOOPS = 50;
     private static final int NUMBER_OF_RECORDER_STRESS_LOOPS = 50;
     private static final int NUMBER_OF_RECORDERANDPLAY_STRESS_LOOPS = 25;
diff --git a/tests/tests/midi/Android.mk b/tests/tests/midi/Android.mk
new file mode 100755
index 0000000..f202933
--- /dev/null
+++ b/tests/tests/midi/Android.mk
@@ -0,0 +1,34 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# Don't include this package in any target.
+LOCAL_MODULE_TAGS := optional
+
+# When built, explicitly put it in the data partition.
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+# Must match the package name in CtsTestCaseList.mk
+LOCAL_PACKAGE_NAME := CtsMidiTestCases
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/midi/AndroidManifest.xml b/tests/tests/midi/AndroidManifest.xml
new file mode 100755
index 0000000..971f4fb
--- /dev/null
+++ b/tests/tests/midi/AndroidManifest.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.midi.cts">
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+
+    <uses-feature android:name="android.software.midi" android:required="true"/>
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+
+        <service android:name="MidiEchoTestService"
+                android:permission="android.permission.BIND_MIDI_DEVICE_SERVICE">
+            <intent-filter>
+                <action android:name="android.media.midi.MidiDeviceService" />
+            </intent-filter>
+            <meta-data android:name="android.media.midi.MidiDeviceService"
+                android:resource="@xml/echo_device_info" />
+        </service>
+    </application>
+
+    <!--  self-instrumenting test package. -->
+    <instrumentation
+        android:name="android.support.test.runner.AndroidJUnitRunner"
+        android:label="CTS MIDI tests"
+        android:targetPackage="android.midi.cts" >
+        <meta-data
+            android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+</manifest>
+
diff --git a/tests/tests/midi/res/xml/echo_device_info.xml b/tests/tests/midi/res/xml/echo_device_info.xml
new file mode 100644
index 0000000..936216a
--- /dev/null
+++ b/tests/tests/midi/res/xml/echo_device_info.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<devices>
+    <device manufacturer="AndroidCTS" product="MidiEcho" tags="echo,test">
+        <input-port name="input" />
+        <output-port name="output" />
+    </device>
+</devices>
diff --git a/tests/tests/midi/src/android/midi/cts/MidiEchoTest.java b/tests/tests/midi/src/android/midi/cts/MidiEchoTest.java
new file mode 100644
index 0000000..f9ef68f
--- /dev/null
+++ b/tests/tests/midi/src/android/midi/cts/MidiEchoTest.java
@@ -0,0 +1,485 @@
+/*
+ * Copyright (C) 2015 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.midi.cts;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.media.midi.MidiManager;
+import android.media.midi.MidiOutputPort;
+import android.media.midi.MidiDevice;
+import android.media.midi.MidiDevice.MidiConnection;
+import android.media.midi.MidiDeviceInfo;
+import android.media.midi.MidiDeviceInfo.PortInfo;
+import android.media.midi.MidiDeviceStatus;
+import android.media.midi.MidiInputPort;
+import android.media.midi.MidiReceiver;
+import android.media.midi.MidiSender;
+import android.os.Bundle;
+import android.test.AndroidTestCase;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Random;
+
+/**
+ * Test MIDI using a virtual MIDI device that echos input to output.
+ */
+public class MidiEchoTest extends AndroidTestCase {
+    public static final String TEST_MANUFACTURER = "AndroidCTS";
+    public static final String ECHO_PRODUCT = "MidiEcho";
+    // I am overloading the timestamp for some tests. It is passed
+    // directly through the Echo server unchanged.
+    // The high 32-bits has a recognizable value.
+    // The low 32-bits can contain data used to identify messages.
+    private static final long TIMESTAMP_MARKER = 0x1234567800000000L;
+    private static final long TIMESTAMP_MARKER_MASK = 0xFFFFFFFF00000000L;
+    private static final long TIMESTAMP_DATA_MASK = 0x00000000FFFFFFFFL;
+    private static final long NANOS_PER_MSEC = 1000L * 1000L;
+
+    // Store device and ports related to the Echo service.
+    static class MidiTestContext {
+        MidiDeviceInfo echoInfo;
+        MidiDevice     echoDevice;
+        MidiInputPort  echoInputPort;
+        MidiOutputPort echoOutputPort;
+    }
+
+    // Store complete MIDI message so it can be put in an array.
+    static class MidiMessage {
+        public final byte[] data;
+        public final long   timestamp;
+        public final long   timeReceived;
+
+        MidiMessage(byte[] buffer, int offset, int length, long timestamp) {
+            timeReceived = System.nanoTime();
+            data = new byte[length];
+            System.arraycopy(buffer, offset, data, 0, length);
+            this.timestamp = timestamp;
+        }
+    }
+
+    // Listens for an asynchronous device open and notifies waiting foreground
+    // test.
+    class MyTestOpenCallback implements MidiManager.OnDeviceOpenedListener {
+        MidiDevice mDevice;
+
+        @Override
+        public synchronized void onDeviceOpened(MidiDevice device) {
+            mDevice = device;
+            notifyAll();
+        }
+
+        public synchronized MidiDevice waitForOpen(int msec)
+                throws InterruptedException {
+            wait(msec);
+            return mDevice;
+        }
+    }
+
+    // Store received messages in an array.
+    class MyLoggingReceiver extends MidiReceiver {
+        ArrayList<MidiMessage> messages = new ArrayList<MidiMessage>();
+
+        @Override
+        public synchronized void onSend(byte[] data, int offset, int count,
+                long timestamp) {
+            messages.add(new MidiMessage(data, offset, count, timestamp));
+            notifyAll();
+        }
+
+        public synchronized int getMessageCount() {
+            return messages.size();
+        }
+
+        public synchronized MidiMessage getMessage(int index) {
+            return messages.get(index);
+        }
+
+        /**
+         * Wait until count messages have arrived.
+         * This is a cumulative total.
+         * @param count
+         * @param timeoutMs
+         * @throws InterruptedException
+         */
+        public synchronized void waitForMessages(int count, int timeoutMs)
+                throws InterruptedException {
+            long endTimeMs = System.currentTimeMillis() + timeoutMs + 1;
+            long timeToWait = timeoutMs + 1;
+            while ((getMessageCount() < count)
+                    && (timeToWait > 0)) {
+                wait(timeToWait);
+                timeToWait = endTimeMs - System.currentTimeMillis();
+            }
+        }
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    // Search through the available devices for the ECHO loop-back device.
+    protected MidiDeviceInfo findEchoDevice() {
+        MidiManager midiManager = (MidiManager) mContext.getSystemService(
+                Context.MIDI_SERVICE);
+        MidiDeviceInfo[] infos = midiManager.getDevices();
+        MidiDeviceInfo echoInfo = null;
+        for (MidiDeviceInfo info : infos) {
+            Bundle properties = info.getProperties();
+            String manufacturer = (String) properties.get(
+                    MidiDeviceInfo.PROPERTY_MANUFACTURER);
+
+            if (TEST_MANUFACTURER.equals(manufacturer)) {
+                String product = (String) properties.get(
+                        MidiDeviceInfo.PROPERTY_PRODUCT);
+                if (ECHO_PRODUCT.equals(product)) {
+                    echoInfo = info;
+                    break;
+                }
+            }
+        }
+        assertTrue("could not find " + ECHO_PRODUCT, echoInfo != null);
+        return echoInfo;
+    }
+
+    protected MidiTestContext setUpEchoServer() throws Exception {
+        MidiManager midiManager = (MidiManager) mContext.getSystemService(
+                Context.MIDI_SERVICE);
+
+        MidiDeviceInfo echoInfo = findEchoDevice();
+
+        // Open device.
+        MyTestOpenCallback callback = new MyTestOpenCallback();
+        midiManager.openDevice(echoInfo, callback, null);
+        int timeoutMs = 1000;
+        MidiDevice echoDevice = callback.waitForOpen(timeoutMs);
+        assertTrue("could not open " + ECHO_PRODUCT, echoDevice != null);
+
+        // Query echo service directly to see if it is getting status updates.
+        MidiEchoTestService echoService = MidiEchoTestService.getInstance();
+        assertEquals("virtual device status, input port before open", false,
+                echoService.inputOpened);
+        assertEquals("virtual device status, output port before open", 0,
+                echoService.outputOpenCount);
+
+        // Open input port.
+        MidiInputPort echoInputPort = echoDevice.openInputPort(0);
+        assertTrue("could not open input port", echoInputPort != null);
+        assertEquals("input port number", 0, echoInputPort.getPortNumber());
+        assertEquals("virtual device status, input port after open", true,
+                echoService.inputOpened);
+        assertEquals("virtual device status, output port before open", 0,
+                echoService.outputOpenCount);
+
+        // Open output port.
+        MidiOutputPort echoOutputPort = echoDevice.openOutputPort(0);
+        assertTrue("could not open output port", echoOutputPort != null);
+        assertEquals("output port number", 0, echoOutputPort.getPortNumber());
+        assertEquals("virtual device status, input port after open", true,
+                echoService.inputOpened);
+        assertEquals("virtual device status, output port after open", 1,
+                echoService.outputOpenCount);
+
+        MidiTestContext mc = new MidiTestContext();
+        mc.echoInfo = echoInfo;
+        mc.echoDevice = echoDevice;
+        mc.echoInputPort = echoInputPort;
+        mc.echoOutputPort = echoOutputPort;
+        return mc;
+    }
+
+    /**
+     * Close ports and check device status.
+     *
+     * @param mc
+     */
+    protected void tearDownEchoServer(MidiTestContext mc) throws IOException {
+        // Query echo service directly to see if it is getting status updates.
+        MidiEchoTestService echoService = MidiEchoTestService.getInstance();
+        assertEquals("virtual device status, input port before close", true,
+                echoService.inputOpened);
+        assertEquals("virtual device status, output port before close", 1,
+                echoService.outputOpenCount);
+
+        // Close output port.
+        mc.echoOutputPort.close();
+        assertEquals("virtual device status, input port before close", true,
+                echoService.inputOpened);
+        assertEquals("virtual device status, output port after close", 0,
+                echoService.outputOpenCount);
+        mc.echoOutputPort.close();
+        mc.echoOutputPort.close(); // should be safe to close twice
+
+        // Close input port.
+        mc.echoInputPort.close();
+        assertEquals("virtual device status, input port after close", false,
+                echoService.inputOpened);
+        assertEquals("virtual device status, output port after close", 0,
+                echoService.outputOpenCount);
+        mc.echoInputPort.close();
+        mc.echoInputPort.close(); // should be safe to close twice
+
+        mc.echoDevice.close();
+        mc.echoDevice.close(); // should be safe to close twice
+    }
+
+    /**
+     * @param mc
+     * @param echoInfo
+     */
+    protected void checkEchoDeviceInfo(MidiTestContext mc,
+            MidiDeviceInfo echoInfo) {
+        assertEquals("echo input port count wrong", 1,
+                echoInfo.getInputPortCount());
+        assertEquals("echo output port count wrong", 1,
+                echoInfo.getOutputPortCount());
+
+        Bundle properties = echoInfo.getProperties();
+        String tags = (String) properties.get("tags");
+        assertEquals("attributes from device XML", "echo,test", tags);
+
+        PortInfo[] ports = echoInfo.getPorts();
+        assertEquals("port info array size", 2, ports.length);
+
+        boolean foundInput = false;
+        boolean foundOutput = false;
+        for (PortInfo portInfo : ports) {
+            if (portInfo.getType() == PortInfo.TYPE_INPUT) {
+                foundInput = true;
+                assertEquals("input port name", "input", portInfo.getName());
+
+                assertEquals("info port number", portInfo.getPortNumber(),
+                        mc.echoInputPort.getPortNumber());
+            } else if (portInfo.getType() == PortInfo.TYPE_OUTPUT) {
+                foundOutput = true;
+                assertEquals("output port name", "output", portInfo.getName());
+                assertEquals("info port number", portInfo.getPortNumber(),
+                        mc.echoOutputPort.getPortNumber());
+            }
+        }
+        assertTrue("found input port info", foundInput);
+        assertTrue("found output port info", foundOutput);
+
+        assertEquals("MIDI device type", MidiDeviceInfo.TYPE_VIRTUAL,
+                echoInfo.getType());
+    }
+
+    // Is the MidiManager supported?
+    public void testMidiManager() throws Exception {
+        PackageManager pm = mContext.getPackageManager();
+        if (!pm.hasSystemFeature(PackageManager.FEATURE_MIDI)) {
+            return; // Not supported so don't test it.
+        }
+
+        MidiManager midiManager = (MidiManager) mContext.getSystemService(
+                Context.MIDI_SERVICE);
+        assertTrue("MidiManager not supported.", midiManager != null);
+
+        // There should be at least one device for the Echo server.
+        MidiDeviceInfo[] infos = midiManager.getDevices();
+        assertTrue("device list was null", infos != null);
+        assertTrue("device list was empty", infos.length >= 1);
+    }
+
+    public void testDeviceInfo() throws Exception {
+        PackageManager pm = mContext.getPackageManager();
+        if (!pm.hasSystemFeature(PackageManager.FEATURE_MIDI)) {
+            return; // Not supported so don't test it.
+        }
+
+        MidiTestContext mc = setUpEchoServer();
+        checkEchoDeviceInfo(mc, mc.echoInfo);
+        checkEchoDeviceInfo(mc, mc.echoDevice.getInfo());
+        assertTrue("device info equal",
+                mc.echoInfo.equals(mc.echoDevice.getInfo()));
+        tearDownEchoServer(mc);
+    }
+
+    public void testEchoSmallMessage() throws Exception {
+        PackageManager pm = mContext.getPackageManager();
+        if (!pm.hasSystemFeature(PackageManager.FEATURE_MIDI)) {
+            return; // Not supported so don't test it.
+        }
+
+        MidiTestContext mc = setUpEchoServer();
+
+        MyLoggingReceiver receiver = new MyLoggingReceiver();
+        mc.echoOutputPort.connect(receiver);
+
+        final byte[] buffer = { (byte) 0x93, 0x47, 0x52 };
+        long timestamp = 0x0123765489ABFEDCL;
+
+        mc.echoInputPort.send(buffer, 0, 0, timestamp); // should be a NOOP
+        mc.echoInputPort.send(buffer, 0, buffer.length, timestamp);
+        mc.echoInputPort.send(buffer, 0, 0, timestamp); // should be a NOOP
+
+        // Wait for message to pass quickly through echo service.
+        final int numMessages = 1;
+        final int timeoutMs = 20;
+        synchronized (receiver) {
+            receiver.waitForMessages(numMessages, timeoutMs);
+        }
+        assertEquals("number of messages.", numMessages, receiver.getMessageCount());
+        MidiMessage message = receiver.getMessage(0);
+
+        assertEquals("byte count of message", buffer.length,
+                message.data.length);
+        assertEquals("timestamp in message", timestamp, message.timestamp);
+        for (int i = 0; i < buffer.length; i++) {
+            assertEquals("message byte[" + i + "]", buffer[i] & 0x0FF,
+                    message.data[i] & 0x0FF);
+        }
+
+        mc.echoOutputPort.disconnect(receiver);
+        tearDownEchoServer(mc);
+    }
+
+    public void testEchoLatency() throws Exception {
+        PackageManager pm = mContext.getPackageManager();
+        if (!pm.hasSystemFeature(PackageManager.FEATURE_MIDI)) {
+            return; // Not supported so don't test it.
+        }
+
+        MidiTestContext mc = setUpEchoServer();
+        MyLoggingReceiver receiver = new MyLoggingReceiver();
+        mc.echoOutputPort.connect(receiver);
+
+        final int numMessages = 10;
+        final long maxLatencyNanos = 15 * NANOS_PER_MSEC; // generally < 3 msec on N6
+        byte[] buffer = { (byte) 0x93, 0, 64 };
+
+        // Send multiple messages in a burst.
+        for (int index = 0; index < numMessages; index++) {
+            buffer[1] = (byte) (60 + index);
+            mc.echoInputPort.send(buffer, 0, buffer.length, System.nanoTime());
+        }
+
+        // Wait for messages to pass quickly through echo service.
+        final int timeoutMs = 100;
+        synchronized (receiver) {
+            receiver.waitForMessages(numMessages, timeoutMs);
+        }
+        assertEquals("number of messages.", numMessages, receiver.getMessageCount());
+
+        for (int index = 0; index < numMessages; index++) {
+            MidiMessage message = receiver.getMessage(index);
+            assertEquals("message index", (byte) (60 + index), message.data[1]);
+            long elapsedNanos = message.timeReceived - message.timestamp;
+            // If this test fails then there may be a problem with the thread scheduler
+            // or there may be kernel activity that is blocking execution at the user level.
+            assertTrue("MIDI round trip latency[" + index + "] too large, " + elapsedNanos + " nanoseconds",
+                    (elapsedNanos < maxLatencyNanos));
+        }
+
+        mc.echoOutputPort.disconnect(receiver);
+        tearDownEchoServer(mc);
+    }
+
+    public void testEchoMultipleMessages() throws Exception {
+        PackageManager pm = mContext.getPackageManager();
+        if (!pm.hasSystemFeature(PackageManager.FEATURE_MIDI)) {
+            return; // Not supported so don't test it.
+        }
+
+        MidiTestContext mc = setUpEchoServer();
+
+        MyLoggingReceiver receiver = new MyLoggingReceiver();
+        mc.echoOutputPort.connect(receiver);
+
+        final byte[] buffer = new byte[2048];
+
+        final int numMessages = 100;
+        Random random = new Random(1972941337);
+        int bytesSent = 0;
+        byte value = 0;
+
+        // Send various length messages with sequential bytes.
+        long timestamp = TIMESTAMP_MARKER;
+        for (int messageIndex = 0; messageIndex < numMessages;
+                messageIndex++) {
+            // Sweep numData across critical region of
+            // MidiPortImpl.MAX_PACKET_DATA_SIZE
+            int numData = 1000 + messageIndex;
+            for (int dataIndex = 0; dataIndex < numData; dataIndex++) {
+                buffer[dataIndex] = value;
+                value++;
+            }
+            // This may get split into multiple sends internally.
+            mc.echoInputPort.send(buffer, 0, numData, timestamp);
+            bytesSent += numData;
+            timestamp++;
+        }
+
+        // Check messages. Data must be sequential bytes.
+        value = 0;
+        int bytesReceived = 0;
+        int messageReceivedIndex = 0;
+        int messageSentIndex = 0;
+        int expectedMessageSentIndex = 0;
+        while (bytesReceived < bytesSent) {
+            final int timeoutMs = 500;
+            // Wait for next message.
+            synchronized (receiver) {
+                receiver.waitForMessages(messageReceivedIndex + 1, timeoutMs);
+            }
+            MidiMessage message = receiver.getMessage(messageReceivedIndex++);
+            // parse timestamp marker and data
+            long timestampMarker = message.timestamp & TIMESTAMP_MARKER_MASK;
+            assertEquals("timestamp marker corrupted", TIMESTAMP_MARKER, timestampMarker);
+            messageSentIndex = (int) (message.timestamp & TIMESTAMP_DATA_MASK);
+
+            int numData = message.data.length;
+            for (int dataIndex = 0; dataIndex < numData; dataIndex++) {
+                String msg = String.format("message[%d/%d].data[%d/%d]",
+                        messageReceivedIndex, messageSentIndex, dataIndex,
+                        numData);
+                assertEquals(msg, value, message.data[dataIndex]);
+                value++;
+            }
+            bytesReceived += numData;
+            // May not advance if message got split
+            if (messageSentIndex > expectedMessageSentIndex) {
+                expectedMessageSentIndex++; // only advance by one each message
+            }
+            assertEquals("timestamp in message", expectedMessageSentIndex,
+                    messageSentIndex);
+        }
+
+        mc.echoOutputPort.disconnect(receiver);
+        tearDownEchoServer(mc);
+    }
+
+    // What happens if the app does bad things.
+    public void testEchoBadBehavior() throws Exception {
+        PackageManager pm = mContext.getPackageManager();
+        if (!pm.hasSystemFeature(PackageManager.FEATURE_MIDI)) {
+            return; // Not supported so don't test it.
+        }
+        MidiTestContext mc = setUpEchoServer();
+
+        // This should fail because it is already open.
+        MidiInputPort echoInputPort2 = mc.echoDevice.openInputPort(0);
+        assertTrue("input port opened twice", echoInputPort2 == null);
+
+        tearDownEchoServer(mc);
+    }
+}
diff --git a/tests/tests/midi/src/android/midi/cts/MidiEchoTestService.java b/tests/tests/midi/src/android/midi/cts/MidiEchoTestService.java
new file mode 100644
index 0000000..ae5373e
--- /dev/null
+++ b/tests/tests/midi/src/android/midi/cts/MidiEchoTestService.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2015 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.midi.cts;
+
+import android.media.midi.MidiDeviceService;
+import android.media.midi.MidiDeviceStatus;
+import android.media.midi.MidiReceiver;
+
+import java.io.IOException;
+
+/**
+ * Virtual MIDI Device that copies its input to its output.
+ * This is used for loop-back testing of MIDI I/O.
+ */
+
+public class MidiEchoTestService extends MidiDeviceService {
+
+    // Other apps will write to this port.
+    private MidiReceiver mInputReceiver = new MyReceiver();
+    // This app will copy the data to this port.
+    private MidiReceiver mOutputReceiver;
+    private static MidiEchoTestService mInstance;
+
+    // These are public so we can easily read them from CTS test.
+    public int statusChangeCount;
+    public boolean inputOpened;
+    public int outputOpenCount;
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        mInstance = this;
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+    }
+
+    // For CTS testing, so I can read test fields.
+    public static MidiEchoTestService getInstance() {
+        return mInstance;
+    }
+
+    @Override
+    public MidiReceiver[] onGetInputPortReceivers() {
+        return new MidiReceiver[] { mInputReceiver };
+    }
+
+    class MyReceiver extends MidiReceiver {
+        @Override
+        public void onSend(byte[] data, int offset, int count, long timestamp)
+                throws IOException {
+            if (mOutputReceiver == null) {
+                mOutputReceiver = getOutputPortReceivers()[0];
+            }
+            // Copy input to output.
+            mOutputReceiver.send(data, offset, count, timestamp);
+        }
+    }
+
+    @Override
+    public void onDeviceStatusChanged(MidiDeviceStatus status) {
+        statusChangeCount++;
+        inputOpened = status.isInputPortOpen(0);
+        outputOpenCount = status.getOutputPortOpenCount(0);
+    }
+}
diff --git a/tests/tests/net/Android.mk b/tests/tests/net/Android.mk
index f6e5c90..6524871 100644
--- a/tests/tests/net/Android.mk
+++ b/tests/tests/net/Android.mk
@@ -24,9 +24,10 @@
 # Include both the 32 and 64 bit versions
 LOCAL_MULTILIB := both
 
-LOCAL_JAVA_LIBRARIES := voip-common conscrypt
+LOCAL_JAVA_LIBRARIES := voip-common conscrypt org.apache.http.legacy
 
-LOCAL_JNI_SHARED_LIBRARIES := libcts_jni libnativedns_jni
+LOCAL_JNI_SHARED_LIBRARIES := libcts_jni libnativedns_jni \
+                              libnativemultinetwork_jni
 
 # include CtsTestServer as a temporary hack to free net.cts from cts.stub.
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
diff --git a/tests/tests/net/AndroidManifest.xml b/tests/tests/net/AndroidManifest.xml
index 652262d..001e294 100644
--- a/tests/tests/net/AndroidManifest.xml
+++ b/tests/tests/net/AndroidManifest.xml
@@ -20,6 +20,7 @@
 
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
@@ -30,6 +31,7 @@
 
     <application>
         <uses-library android:name="android.test.runner" />
+        <uses-library android:name="org.apache.http.legacy" android:required="false" />
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/tests/tests/net/jni/Android.mk b/tests/tests/net/jni/Android.mk
index 75982de..ca82b30 100644
--- a/tests/tests/net/jni/Android.mk
+++ b/tests/tests/net/jni/Android.mk
@@ -28,3 +28,12 @@
 LOCAL_SHARED_LIBRARIES := libnativehelper liblog
 
 include $(BUILD_SHARED_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libnativemultinetwork_jni
+# Don't include this package in any configuration by default.
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := NativeMultinetworkJni.c
+LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
+LOCAL_SHARED_LIBRARIES := libandroid libnativehelper liblog
+include $(BUILD_SHARED_LIBRARY)
diff --git a/tests/tests/net/jni/NativeMultinetworkJni.c b/tests/tests/net/jni/NativeMultinetworkJni.c
new file mode 100644
index 0000000..ad56b51
--- /dev/null
+++ b/tests/tests/net/jni/NativeMultinetworkJni.c
@@ -0,0 +1,235 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+
+#define LOG_TAG "MultinetworkApiTest"
+#include <utils/Log.h>
+
+#include <arpa/inet.h>
+#include <errno.h>
+#include <inttypes.h>
+#include <jni.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <android/multinetwork.h>
+
+#define UNUSED(X) ((void) X)
+
+static const char kHostname[] = "connectivitycheck.android.com";
+
+
+JNIEXPORT jint Java_android_net_cts_MultinetworkApiTest_runGetaddrinfoCheck(
+        JNIEnv* env, jclass class, jlong nethandle) {
+    UNUSED(env);
+    UNUSED(class);
+    net_handle_t handle = (net_handle_t) nethandle;
+    struct addrinfo *res = NULL;
+
+    errno = 0;
+    int rval = android_getaddrinfofornetwork(handle, kHostname, NULL, NULL, &res);
+    const int saved_errno = errno;
+    freeaddrinfo(res);
+
+    ALOGD("android_getaddrinfofornetwork(%llu, %s) returned rval=%d errno=%d",
+          handle, kHostname, rval, saved_errno);
+    return rval == 0 ? 0 : -saved_errno;
+}
+
+JNIEXPORT jint Java_android_net_cts_MultinetworkApiTest_runSetprocnetwork(
+        JNIEnv* env, jclass class, jlong nethandle) {
+    UNUSED(env);
+    UNUSED(class);
+    net_handle_t handle = (net_handle_t) nethandle;
+
+    errno = 0;
+    int rval = android_setprocnetwork(handle);
+    const int saved_errno = errno;
+    ALOGD("android_setprocnetwork(%llu) returned rval=%d errno=%d",
+          handle, rval, saved_errno);
+    return rval == 0 ? 0 : -saved_errno;
+}
+
+JNIEXPORT jint Java_android_net_cts_MultinetworkApiTest_runSetsocknetwork(
+        JNIEnv* env, jclass class, jlong nethandle) {
+    UNUSED(env);
+    UNUSED(class);
+    net_handle_t handle = (net_handle_t) nethandle;
+
+    errno = 0;
+    int fd = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
+    if (fd < 0) {
+        ALOGD("socket() failed, errno=%d", errno);
+        return -errno;
+    }
+
+    errno = 0;
+    int rval = android_setsocknetwork(handle, fd);
+    const int saved_errno = errno;
+    ALOGD("android_setprocnetwork(%llu, %d) returned rval=%d errno=%d",
+          handle, fd, rval, saved_errno);
+    close(fd);
+    return rval == 0 ? 0 : -saved_errno;
+}
+
+static const int kSockaddrStrLen = INET6_ADDRSTRLEN + strlen("[]:65535");
+
+void sockaddr_ntop(const struct sockaddr *sa, socklen_t salen, char *dst, const size_t size) {
+    char addrstr[INET6_ADDRSTRLEN];
+    char portstr[sizeof("65535")];
+    char buf[kSockaddrStrLen+1];
+
+    int ret = getnameinfo(sa, salen,
+                          addrstr, sizeof(addrstr),
+                          portstr, sizeof(portstr),
+                          NI_NUMERICHOST | NI_NUMERICSERV);
+    if (ret == 0) {
+        snprintf(buf, sizeof(buf),
+                 (sa->sa_family == AF_INET6) ? "[%s]:%s" : "%s:%s",
+                 addrstr, portstr);
+    } else {
+        sprintf(buf, "???");
+    }
+
+    strlcpy(dst, buf, size);
+}
+
+JNIEXPORT jint Java_android_net_cts_MultinetworkApiTest_runDatagramCheck(
+        JNIEnv* env, jclass class, jlong nethandle) {
+    UNUSED(env);
+    UNUSED(class);
+    const struct addrinfo kHints = {
+        .ai_flags = AI_ADDRCONFIG,
+        .ai_family = AF_UNSPEC,
+        .ai_socktype = SOCK_DGRAM,
+        .ai_protocol = IPPROTO_UDP,
+    };
+    struct addrinfo *res = NULL;
+    net_handle_t handle = (net_handle_t) nethandle;
+
+    static const char kPort[] = "443";
+    int rval = android_getaddrinfofornetwork(handle, kHostname, kPort, &kHints, &res);
+    if (rval != 0) {
+        ALOGD("android_getaddrinfofornetwork(%llu, %s) returned rval=%d errno=%d",
+              handle, kHostname, rval, errno);
+        freeaddrinfo(res);
+        return -errno;
+    }
+
+    // Rely upon getaddrinfo sorting the best destination to the front.
+    int fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
+    if (fd < 0) {
+        ALOGD("socket(%d, %d, %d) failed, errno=%d",
+              res->ai_family, res->ai_socktype, res->ai_protocol, errno);
+        freeaddrinfo(res);
+        return -errno;
+    }
+
+    rval = android_setsocknetwork(handle, fd);
+    ALOGD("android_setprocnetwork(%llu, %d) returned rval=%d errno=%d",
+          handle, fd, rval, errno);
+    if (rval != 0) {
+        close(fd);
+        freeaddrinfo(res);
+        return -errno;
+    }
+
+    char addrstr[kSockaddrStrLen+1];
+    sockaddr_ntop(res->ai_addr, res->ai_addrlen, addrstr, sizeof(addrstr));
+    ALOGD("Attempting connect() to %s ...", addrstr);
+
+    rval = connect(fd, res->ai_addr, res->ai_addrlen);
+    if (rval != 0) {
+        close(fd);
+        freeaddrinfo(res);
+        return -errno;
+    }
+    freeaddrinfo(res);
+
+    struct sockaddr_storage src_addr;
+    socklen_t src_addrlen = sizeof(src_addr);
+    if (getsockname(fd, (struct sockaddr *)&src_addr, &src_addrlen) != 0) {
+        close(fd);
+        return -errno;
+    }
+    sockaddr_ntop((const struct sockaddr *)&src_addr, sizeof(src_addr), addrstr, sizeof(addrstr));
+    ALOGD("... from %s", addrstr);
+
+    // Don't let reads or writes block indefinitely.
+    const struct timeval timeo = { 2, 0 };  // 2 seconds
+    setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeo, sizeof(timeo));
+    setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &timeo, sizeof(timeo));
+
+    // For reference see:
+    //     https://tools.ietf.org/html/draft-tsvwg-quic-protocol-01#section-6.1
+    uint8_t quic_packet[] = {
+        0x0c,                    // public flags: 64bit conn ID, 8bit sequence number
+        0, 0, 0, 0, 0, 0, 0, 0,  // 64bit connection ID
+        0x01,                    // sequence number
+        0x00,                    // private flags
+        0x07,                    // type: regular frame type "PING"
+    };
+
+    arc4random_buf(quic_packet + 1, 8);  // random connection ID
+
+    uint8_t response[1500];
+    ssize_t sent, rcvd;
+    static const int MAX_RETRIES = 5;
+    int i, errnum = 0;
+
+    for (i = 0; i < MAX_RETRIES; i++) {
+        sent = send(fd, quic_packet, sizeof(quic_packet), 0);
+        if (sent < (ssize_t)sizeof(quic_packet)) {
+            errnum = errno;
+            ALOGD("send(QUIC packet) returned sent=%zd, errno=%d", sent, errnum);
+            close(fd);
+            return -errnum;
+        }
+
+        rcvd = recv(fd, response, sizeof(response), 0);
+        if (rcvd > 0) {
+            break;
+        } else {
+            errnum = errno;
+            ALOGD("[%d/%d] recv(QUIC response) returned rcvd=%zd, errno=%d",
+                  i + 1, MAX_RETRIES, rcvd, errnum);
+        }
+    }
+    if (rcvd < sent) {
+        ALOGD("QUIC UDP %s: sent=%zd but rcvd=%zd, errno=%d", kPort, sent, rcvd, errnum);
+        if (rcvd <= 0) {
+            ALOGD("Does this network block UDP port %s?", kPort);
+        }
+        close(fd);
+        return -EPROTO;
+    }
+
+    int conn_id_cmp = memcmp(quic_packet + 1, response + 1, 8);
+    if (conn_id_cmp != 0) {
+        ALOGD("sent and received connection IDs do not match");
+        close(fd);
+        return -EPROTO;
+    }
+
+    // TODO: log, and compare to the IP address encoded in the
+    // response, since this should be a public reset packet.
+
+    close(fd);
+    return 0;
+}
diff --git a/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java b/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
index 9daf3c4..88dbd7c 100644
--- a/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
+++ b/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
@@ -16,16 +16,20 @@
 
 package android.net.cts;
 
+import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
 import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
 import android.net.NetworkConfig;
 import android.net.NetworkInfo;
 import android.net.NetworkInfo.DetailedState;
 import android.net.NetworkInfo.State;
+import android.net.NetworkRequest;
 import android.net.wifi.WifiManager;
 import android.test.AndroidTestCase;
 import android.util.Log;
@@ -51,6 +55,10 @@
     public static final int TYPE_WIFI = ConnectivityManager.TYPE_WIFI;
     private static final int HOST_ADDRESS = 0x7f000001;// represent ip 127.0.0.1
 
+    // Action sent to ConnectivityActionReceiver when a network callback is sent via PendingIntent.
+    private static final String NETWORK_CALLBACK_ACTION =
+            "ConnectivityManagerTest.NetworkCallbackAction";
+
     // device could have only one interface: data, wifi.
     private static final int MIN_NUM_NETWORK_TYPES = 1;
 
@@ -59,7 +67,6 @@
     private PackageManager mPackageManager;
     private final HashMap<Integer, NetworkConfig> mNetworks =
             new HashMap<Integer, NetworkConfig>();
-    private final List<Integer>mProtectedNetworks = new ArrayList<Integer>();
 
     @Override
     protected void setUp() throws Exception {
@@ -82,13 +89,6 @@
                 mNetworks.put(n.type, n);
             } catch (Exception e) {}
         }
-
-        // Get com.android.internal.R.array.config_protectedNetworks
-        resId = getContext().getResources().getIdentifier("config_protectedNetworks", "array", "android");
-        int[] protectedNetworks = getContext().getResources().getIntArray(resId);
-        for (int p : protectedNetworks) {
-            mProtectedNetworks.add(p);
-        }
     }
 
     public void testIsNetworkTypeValid() {
@@ -129,7 +129,19 @@
     public void testGetActiveNetworkInfo() {
         NetworkInfo ni = mCm.getActiveNetworkInfo();
 
-        assertTrue("You must have an active network connection to complete CTS", ni != null);
+        assertNotNull("You must have an active network connection to complete CTS", ni);
+        assertTrue(ConnectivityManager.isNetworkTypeValid(ni.getType()));
+        assertTrue(ni.getState() == State.CONNECTED);
+    }
+
+    public void testGetActiveNetwork() {
+        Network network = mCm.getActiveNetwork();
+        assertNotNull("You must have an active network connection to complete CTS", network);
+
+        NetworkInfo ni = mCm.getNetworkInfo(network);
+        assertNotNull("Network returned from getActiveNetwork was invalid", ni);
+
+        // Similar to testGetActiveNetworkInfo above.
         assertTrue(ConnectivityManager.isNetworkTypeValid(ni.getType()));
         assertTrue(ni.getState() == State.CONNECTED);
     }
@@ -170,6 +182,27 @@
         }
     }
 
+    private void assertStartUsingNetworkFeatureUnsupported(int networkType, String feature) {
+        try {
+            mCm.startUsingNetworkFeature(networkType, feature);
+            fail("startUsingNetworkFeature is no longer supported in the current API version");
+        } catch (UnsupportedOperationException expected) {}
+    }
+
+    private void assertStopUsingNetworkFeatureUnsupported(int networkType, String feature) {
+        try {
+            mCm.startUsingNetworkFeature(networkType, feature);
+            fail("stopUsingNetworkFeature is no longer supported in the current API version");
+        } catch (UnsupportedOperationException expected) {}
+    }
+
+    private void assertRequestRouteToHostUnsupported(int networkType, int hostAddress) {
+        try {
+            mCm.requestRouteToHost(networkType, hostAddress);
+            fail("requestRouteToHost is no longer supported in the current API version");
+        } catch (UnsupportedOperationException expected) {}
+    }
+
     public void testStartUsingNetworkFeature() {
 
         final String invalidateFeature = "invalidateFeature";
@@ -178,27 +211,9 @@
         final int wifiOnlyStartFailureCode = PhoneConstants.APN_REQUEST_FAILED;
         final int wifiOnlyStopFailureCode = -1;
 
-        NetworkInfo ni = mCm.getNetworkInfo(TYPE_MOBILE);
-        if (ni != null) {
-            assertEquals(PhoneConstants.APN_REQUEST_FAILED,
-                    mCm.startUsingNetworkFeature(TYPE_MOBILE, invalidateFeature));
-            assertEquals(failureCode, mCm.stopUsingNetworkFeature(TYPE_MOBILE,
-                    invalidateFeature));
-        } else {
-            assertEquals(wifiOnlyStartFailureCode, mCm.startUsingNetworkFeature(TYPE_MOBILE,
-                    invalidateFeature));
-            assertEquals(wifiOnlyStopFailureCode, mCm.stopUsingNetworkFeature(TYPE_MOBILE,
-                    invalidateFeature));
-        }
-
-        ni = mCm.getNetworkInfo(TYPE_WIFI);
-        if (ni != null) {
-            // Should return failure because MMS is not supported on WIFI.
-            assertEquals(PhoneConstants.APN_REQUEST_FAILED, mCm.startUsingNetworkFeature(TYPE_WIFI,
-                    mmsFeature));
-            assertEquals(failureCode, mCm.stopUsingNetworkFeature(TYPE_WIFI,
-                    mmsFeature));
-        }
+        assertStartUsingNetworkFeatureUnsupported(TYPE_MOBILE, invalidateFeature);
+        assertStopUsingNetworkFeatureUnsupported(TYPE_MOBILE, invalidateFeature);
+        assertStartUsingNetworkFeatureUnsupported(TYPE_WIFI, mmsFeature);
     }
 
     private boolean isSupported(int networkType) {
@@ -209,11 +224,6 @@
                (networkType == ConnectivityManager.TYPE_VPN);
     }
 
-    // true if only the system can turn it on
-    private boolean isNetworkProtected(int networkType) {
-        return mProtectedNetworks.contains(networkType);
-    }
-
     public void testIsNetworkSupported() {
         for (int type = -1; type <= ConnectivityManager.MAX_NETWORK_TYPE; type++) {
             boolean supported = mCm.isNetworkSupported(type);
@@ -227,120 +237,234 @@
 
     public void testRequestRouteToHost() {
         for (int type = -1 ; type <= ConnectivityManager.MAX_NETWORK_TYPE; type++) {
-            NetworkInfo ni = mCm.getNetworkInfo(type);
-            boolean expectToWork = isSupported(type) && !isNetworkProtected(type) &&
-                    ni != null && ni.isConnected();
-
-            try {
-                assertTrue("Network type " + type,
-                        mCm.requestRouteToHost(type, HOST_ADDRESS) == expectToWork);
-            } catch (Exception e) {
-                Log.d(TAG, "got exception in requestRouteToHost for type " + type);
-                assertFalse("Exception received for type " + type, expectToWork);
-            }
-
-            //TODO verify route table
+            assertRequestRouteToHostUnsupported(type, HOST_ADDRESS);
         }
-
-        assertFalse(mCm.requestRouteToHost(-1, HOST_ADDRESS));
     }
 
     public void testTest() {
         mCm.getBackgroundDataSetting();
     }
 
-    /** Test that hipri can be brought up when Wifi is enabled. */
-    public void testStartUsingNetworkFeature_enableHipri() throws Exception {
-        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
-                || !mPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)) {
-            // This test requires a mobile data connection and WiFi.
+    /**
+     * Exercises both registerNetworkCallback and unregisterNetworkCallback. This checks to
+     * see if we get a callback for the TRANSPORT_WIFI transport type being available.
+     *
+     * <p>In order to test that a NetworkCallback occurs, we need some change in the network
+     * state (either a transport or capability is now available). The most straightforward is
+     * WiFi. We could add a version that uses the telephony data connection but it's not clear
+     * that it would increase test coverage by much (how many devices have 3G radio but not Wifi?).
+     */
+    public void testRegisterNetworkCallback() {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)) {
+            Log.i(TAG, "testRegisterNetworkCallback cannot execute unless device supports WiFi");
             return;
         }
 
-        boolean isWifiEnabled = mWifiManager.isWifiEnabled();
-        boolean isWifiConnected = false;
+        // We will register for a WIFI network being available or lost.
+        NetworkRequest request = new NetworkRequest.Builder()
+                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+                .build();
+        TestNetworkCallback callback = new TestNetworkCallback();
+        mCm.registerNetworkCallback(request, callback);
 
-        NetworkInfo nwInfo = mCm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
-        if (nwInfo != null) {
-            isWifiConnected = nwInfo.isConnected();
-        }
+        boolean previousWifiEnabledState = mWifiManager.isWifiEnabled();
+
         try {
-            // Make sure WiFi is connected to an access point.
-            if (!isWifiConnected) {
+            // Make sure WiFi is connected to an access point to start with.
+            if (!previousWifiEnabledState) {
                 connectToWifi();
             }
 
-            // Register a receiver that will capture the connectivity change for hipri.
-            ConnectivityActionReceiver receiver =
-                    new ConnectivityActionReceiver(ConnectivityManager.TYPE_MOBILE_HIPRI);
-            IntentFilter filter = new IntentFilter();
-            filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
-            mContext.registerReceiver(receiver, filter);
-
-            // Try to start using the hipri feature...
-            int result = mCm.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE,
-                    FEATURE_ENABLE_HIPRI);
-            assertTrue("Couldn't start using the HIPRI feature.", result != -1);
-
-            // Check that the ConnectivityManager reported that it connected using hipri...
-            assertTrue("Couldn't connect using hipri...", receiver.waitForConnection());
-
-            assertTrue("Couldn't requestRouteToHost using HIPRI.",
-                    mCm.requestRouteToHost(ConnectivityManager.TYPE_MOBILE_HIPRI, HOST_ADDRESS));
-            // TODO check dns selection
-            // TODO check routes
+            // Now we should expect to get a network callback about availability of the wifi
+            // network even if it was already connected as a state-based action when the callback
+            // is registered.
+            assertTrue("Did not receive NetworkCallback.onAvailable for TRANSPORT_WIFI",
+                    callback.waitForAvailable());
         } catch (InterruptedException e) {
-            fail("Broadcast receiver waiting for ConnectivityManager interrupted.");
+            fail("Broadcast receiver or NetworkCallback wait was interrupted.");
         } finally {
-            mCm.stopUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE,
-                    FEATURE_ENABLE_HIPRI);
-            // TODO wait for HIPRI to go
-            // TODO check dns selection
-            // TODO check routes
-            if (!isWifiEnabled) {
-                mWifiManager.setWifiEnabled(false);
+            mCm.unregisterNetworkCallback(callback);
+
+            // Return WiFI to its original enabled/disabled state.
+            if (!previousWifiEnabledState) {
+                disconnectFromWifi();
             }
         }
     }
 
-    private void connectToWifi() throws InterruptedException {
-        ConnectivityActionReceiver receiver =
-                new ConnectivityActionReceiver(ConnectivityManager.TYPE_WIFI);
+    /**
+     * Tests both registerNetworkCallback and unregisterNetworkCallback similarly to
+     * {@link #testRegisterNetworkCallback} except that a {@code PendingIntent} is used instead
+     * of a {@code NetworkCallback}.
+     */
+    public void testRegisterNetworkCallback_withPendingIntent() {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)) {
+            Log.i(TAG, "testRegisterNetworkCallback cannot execute unless device supports WiFi");
+            return;
+        }
+
+        // Create a ConnectivityActionReceiver that has an IntentFilter for our locally defined
+        // action, NETWORK_CALLBACK_ACTION.
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(NETWORK_CALLBACK_ACTION);
+
+        ConnectivityActionReceiver receiver = new ConnectivityActionReceiver(
+                ConnectivityManager.TYPE_WIFI, NetworkInfo.State.CONNECTED);
+        mContext.registerReceiver(receiver, filter);
+
+        // Create a broadcast PendingIntent for NETWORK_CALLBACK_ACTION.
+        Intent intent = new Intent(NETWORK_CALLBACK_ACTION);
+        PendingIntent pendingIntent = PendingIntent.getBroadcast(
+                mContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
+
+        // We will register for a WIFI network being available or lost.
+        NetworkRequest request = new NetworkRequest.Builder()
+                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+                .build();
+        mCm.registerNetworkCallback(request, pendingIntent);
+
+        boolean previousWifiEnabledState = mWifiManager.isWifiEnabled();
+
+        try {
+            // Make sure WiFi is connected to an access point to start with.
+            if (!previousWifiEnabledState) {
+                connectToWifi();
+            }
+
+            // Now we expect to get the Intent delivered notifying of the availability of the wifi
+            // network even if it was already connected as a state-based action when the callback
+            // is registered.
+            assertTrue("Did not receive expected Intent " + intent + " for TRANSPORT_WIFI",
+                    receiver.waitForState());
+        } catch (InterruptedException e) {
+            fail("Broadcast receiver or NetworkCallback wait was interrupted.");
+        } finally {
+            mCm.unregisterNetworkCallback(pendingIntent);
+            pendingIntent.cancel();
+            mContext.unregisterReceiver(receiver);
+
+            // Return WiFI to its original enabled/disabled state.
+            if (!previousWifiEnabledState) {
+                disconnectFromWifi();
+            }
+        }
+    }
+
+    /** Enable WiFi and wait for it to become connected to a network. */
+    private void connectToWifi() {
+        ConnectivityActionReceiver receiver = new ConnectivityActionReceiver(
+                ConnectivityManager.TYPE_WIFI, NetworkInfo.State.CONNECTED);
         IntentFilter filter = new IntentFilter();
         filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
         mContext.registerReceiver(receiver, filter);
 
-        assertTrue(mWifiManager.setWifiEnabled(true));
-        assertTrue("Wifi must be configured to connect to an access point for this test.",
-                receiver.waitForConnection());
+        boolean connected = false;
+        try {
+            assertTrue(mWifiManager.setWifiEnabled(true));
+            connected = receiver.waitForState();
+        } catch (InterruptedException ex) {
+            fail("connectToWifi was interrupted");
+        } finally {
+            mContext.unregisterReceiver(receiver);
+        }
 
-        mContext.unregisterReceiver(receiver);
+        assertTrue("Wifi must be configured to connect to an access point for this test.",
+                connected);
     }
 
-    /** Receiver that captures the last connectivity change's network type and state. */
+    /** Disable WiFi and wait for it to become disconnected from the network. */
+    private void disconnectFromWifi() {
+        ConnectivityActionReceiver receiver = new ConnectivityActionReceiver(
+                ConnectivityManager.TYPE_WIFI, NetworkInfo.State.DISCONNECTED);
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
+        mContext.registerReceiver(receiver, filter);
+
+        boolean disconnected = false;
+        try {
+            assertTrue(mWifiManager.setWifiEnabled(false));
+            disconnected = receiver.waitForState();
+        } catch (InterruptedException ex) {
+            fail("disconnectFromWifi was interrupted");
+        } finally {
+            mContext.unregisterReceiver(receiver);
+        }
+
+        assertTrue("Wifi failed to reach DISCONNECTED state.", disconnected);
+    }
+
+    /**
+     * Receiver that captures the last connectivity change's network type and state. Recognizes
+     * both {@code CONNECTIVITY_ACTION} and {@code NETWORK_CALLBACK_ACTION} intents.
+     */
     private class ConnectivityActionReceiver extends BroadcastReceiver {
 
         private final CountDownLatch mReceiveLatch = new CountDownLatch(1);
 
         private final int mNetworkType;
+        private final NetworkInfo.State mNetState;
 
-        ConnectivityActionReceiver(int networkType) {
+        ConnectivityActionReceiver(int networkType, NetworkInfo.State netState) {
             mNetworkType = networkType;
+            mNetState = netState;
         }
 
         public void onReceive(Context context, Intent intent) {
-            NetworkInfo networkInfo = intent.getExtras()
-                    .getParcelable(ConnectivityManager.EXTRA_NETWORK_INFO);
+            String action = intent.getAction();
+            NetworkInfo networkInfo = null;
+
+            // When receiving ConnectivityManager.CONNECTIVITY_ACTION, the NetworkInfo parcelable
+            // is stored in EXTRA_NETWORK_INFO. With a NETWORK_CALLBACK_ACTION, the Network is
+            // sent in EXTRA_NETWORK and we need to ask the ConnectivityManager for the NetworkInfo.
+            if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) {
+                networkInfo = intent.getExtras()
+                        .getParcelable(ConnectivityManager.EXTRA_NETWORK_INFO);
+                assertNotNull("ConnectivityActionReceiver expected EXTRA_NETWORK_INFO", networkInfo);
+            } else if (NETWORK_CALLBACK_ACTION.equals(action)) {
+                Network network = intent.getExtras()
+                        .getParcelable(ConnectivityManager.EXTRA_NETWORK);
+                assertNotNull("ConnectivityActionReceiver expected EXTRA_NETWORK", network);
+                networkInfo = mCm.getNetworkInfo(network);
+                if (networkInfo == null) {
+                    // When disconnecting, it seems like we get an intent sent with an invalid
+                    // Network; that is, by the time we call ConnectivityManager.getNetworkInfo(),
+                    // it is invalid. Ignore these.
+                    Log.i(TAG, "ConnectivityActionReceiver NETWORK_CALLBACK_ACTION ignoring "
+                            + "invalid network");
+                    return;
+                }
+            } else {
+                fail("ConnectivityActionReceiver received unxpected intent action: " + action);
+            }
+
+            assertNotNull("ConnectivityActionReceiver didn't find NetworkInfo", networkInfo);
             int networkType = networkInfo.getType();
             State networkState = networkInfo.getState();
             Log.i(TAG, "Network type: " + networkType + " state: " + networkState);
-            if (networkType == mNetworkType && networkInfo.getState() == State.CONNECTED) {
+            if (networkType == mNetworkType && networkInfo.getState() == mNetState) {
                 mReceiveLatch.countDown();
             }
         }
 
-        public boolean waitForConnection() throws InterruptedException {
+        public boolean waitForState() throws InterruptedException {
             return mReceiveLatch.await(30, TimeUnit.SECONDS);
         }
     }
+
+    /**
+     * Callback used in testRegisterNetworkCallback that allows caller to block on
+     * {@code onAvailable}.
+     */
+    private static class TestNetworkCallback extends ConnectivityManager.NetworkCallback {
+        private final CountDownLatch mAvailableLatch = new CountDownLatch(1);
+
+        public boolean waitForAvailable() throws InterruptedException {
+            return mAvailableLatch.await(30, TimeUnit.SECONDS);
+        }
+
+        @Override
+        public void onAvailable(Network network) {
+            mAvailableLatch.countDown();
+        }
+    }
 }
diff --git a/tests/tests/net/src/android/net/cts/LocalSocketTest.java b/tests/tests/net/src/android/net/cts/LocalSocketTest.java
index 70d69c8..865ec21 100644
--- a/tests/tests/net/src/android/net/cts/LocalSocketTest.java
+++ b/tests/tests/net/src/android/net/cts/LocalSocketTest.java
@@ -112,7 +112,6 @@
     }
 
     public void testAccessors() throws IOException{
-        final int INITIAL_SEND_BUFFER_SIZE = 1998;
         LocalSocket socket = new LocalSocket();
         LocalSocketAddress addr = new LocalSocketAddress("secondary");
 
@@ -127,14 +126,8 @@
         socket.setReceiveBufferSize(1999);
         assertEquals(1999 << 1, socket.getReceiveBufferSize());
 
-        socket.setSendBufferSize(INITIAL_SEND_BUFFER_SIZE);
-        int sendBufferSize = socket.getSendBufferSize();
-        if ((INITIAL_SEND_BUFFER_SIZE << 1) < sendBufferSize) {
-            socket.setSendBufferSize(sendBufferSize / 2);
-            assertEquals(sendBufferSize, socket.getSendBufferSize());
-        } else {
-            assertEquals(INITIAL_SEND_BUFFER_SIZE << 1, sendBufferSize);
-        }
+        socket.setSendBufferSize(3998);
+        assertEquals(3998 << 1, socket.getSendBufferSize());
 
         // Timeout is not support at present, so set is ignored
         socket.setSoTimeout(1996);
diff --git a/tests/tests/net/src/android/net/cts/MultinetworkApiTest.java b/tests/tests/net/src/android/net/cts/MultinetworkApiTest.java
new file mode 100644
index 0000000..51ee50e
--- /dev/null
+++ b/tests/tests/net/src/android/net/cts/MultinetworkApiTest.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2015 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.net.cts;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkUtils;
+import android.system.ErrnoException;
+import android.system.OsConstants;
+import android.test.AndroidTestCase;
+
+import java.util.ArrayList;
+
+
+public class MultinetworkApiTest extends AndroidTestCase {
+
+    static {
+        System.loadLibrary("nativemultinetwork_jni");
+    }
+
+    private static final String TAG = "MultinetworkNativeApiTest";
+
+    /**
+     * @return 0 on success
+     */
+    private static native int runGetaddrinfoCheck(long networkHandle);
+    private static native int runSetprocnetwork(long networkHandle);
+    private static native int runSetsocknetwork(long networkHandle);
+    private static native int runDatagramCheck(long networkHandle);
+
+    private ConnectivityManager mCM;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        mCM = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
+    }
+
+    private Network[] getTestableNetworks() {
+        final ArrayList<Network> testableNetworks = new ArrayList<Network>();
+        for (Network network : mCM.getAllNetworks()) {
+            final NetworkCapabilities nc = mCM.getNetworkCapabilities(network);
+            if (nc != null
+                    && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
+                    && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) {
+                testableNetworks.add(network);
+            }
+        }
+
+        assertTrue(
+                "This test requires that at least one network be connected. " +
+                "Please ensure that the device is connected to a network.",
+                testableNetworks.size() >= 1);
+        return testableNetworks.toArray(new Network[0]);
+    }
+
+    public void testGetaddrinfo() throws ErrnoException {
+        for (Network network : getTestableNetworks()) {
+            int errno = runGetaddrinfoCheck(network.getNetworkHandle());
+            if (errno != 0) {
+                throw new ErrnoException(
+                        "getaddrinfo on " + mCM.getNetworkInfo(network), -errno);
+            }
+        }
+    }
+
+    public void testSetprocnetwork() throws ErrnoException {
+        // Hopefully no prior test in this process space has set a default network.
+        assertNull(mCM.getProcessDefaultNetwork());
+        assertEquals(0, NetworkUtils.getBoundNetworkForProcess());
+
+        for (Network network : getTestableNetworks()) {
+            mCM.setProcessDefaultNetwork(null);
+            assertNull(mCM.getProcessDefaultNetwork());
+
+            int errno = runSetprocnetwork(network.getNetworkHandle());
+            if (errno != 0) {
+                throw new ErrnoException(
+                        "setprocnetwork on " + mCM.getNetworkInfo(network), -errno);
+            }
+            Network processDefault = mCM.getProcessDefaultNetwork();
+            assertNotNull(processDefault);
+            assertEquals(network, processDefault);
+            // TODO: open DatagramSockets, connect them to 192.0.2.1 and 2001:db8::,
+            // and ensure that the source address is in fact on this network as
+            // determined by mCM.getLinkProperties(network).
+
+            mCM.setProcessDefaultNetwork(null);
+        }
+
+        for (Network network : getTestableNetworks()) {
+            NetworkUtils.bindProcessToNetwork(0);
+            assertNull(mCM.getBoundNetworkForProcess());
+
+            int errno = runSetprocnetwork(network.getNetworkHandle());
+            if (errno != 0) {
+                throw new ErrnoException(
+                        "setprocnetwork on " + mCM.getNetworkInfo(network), -errno);
+            }
+            assertEquals(network, new Network(mCM.getBoundNetworkForProcess()));
+            // TODO: open DatagramSockets, connect them to 192.0.2.1 and 2001:db8::,
+            // and ensure that the source address is in fact on this network as
+            // determined by mCM.getLinkProperties(network).
+
+            NetworkUtils.bindProcessToNetwork(0);
+        }
+    }
+
+    public void testSetsocknetwork() throws ErrnoException {
+        for (Network network : getTestableNetworks()) {
+            int errno = runSetsocknetwork(network.getNetworkHandle());
+            if (errno != 0) {
+                throw new ErrnoException(
+                        "setsocknetwork on " + mCM.getNetworkInfo(network), -errno);
+            }
+        }
+    }
+
+    public void testNativeDatagramTransmission() throws ErrnoException {
+        for (Network network : getTestableNetworks()) {
+            int errno = runDatagramCheck(network.getNetworkHandle());
+            if (errno != 0) {
+                throw new ErrnoException(
+                        "DatagramCheck on " + mCM.getNetworkInfo(network), -errno);
+            }
+        }
+    }
+
+    public void testNoSuchNetwork() {
+        final Network eNoNet = new Network(54321);
+        assertNull(mCM.getNetworkInfo(eNoNet));
+
+        final long eNoNetHandle = eNoNet.getNetworkHandle();
+        assertEquals(-OsConstants.ENONET, runSetsocknetwork(eNoNetHandle));
+        assertEquals(-OsConstants.ENONET, runSetprocnetwork(eNoNetHandle));
+        // TODO: correct test permissions so this call is not silently re-mapped
+        // to query on the default network.
+        // assertEquals(-OsConstants.ENONET, runGetaddrinfoCheck(eNoNetHandle));
+    }
+}
diff --git a/tests/tests/net/src/android/net/cts/MultinetworkSysctlTest.java b/tests/tests/net/src/android/net/cts/MultinetworkSysctlTest.java
new file mode 100644
index 0000000..c091a13
--- /dev/null
+++ b/tests/tests/net/src/android/net/cts/MultinetworkSysctlTest.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2014 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.net.cts;
+
+import android.system.ErrnoException;
+import android.system.Os;
+import android.system.OsConstants;
+import android.system.StructStat;
+import android.test.AndroidTestCase;
+
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.IOException;
+
+/**
+ * Tests for multinetwork sysctl functionality.
+ */
+public class MultinetworkSysctlTest extends AndroidTestCase {
+
+    // Global sysctls. Must be present and set to 1.
+    private static final String[] GLOBAL_SYSCTLS = {
+        "/proc/sys/net/ipv4/fwmark_reflect",
+        "/proc/sys/net/ipv6/fwmark_reflect",
+        "/proc/sys/net/ipv4/tcp_fwmark_accept",
+    };
+
+    // Per-interface IPv6 autoconf sysctls.
+    private static final String IPV6_SYSCTL_DIR = "/proc/sys/net/ipv6/conf";
+    private static final String AUTOCONF_SYSCTL = "accept_ra_rt_table";
+
+    // Expected mode, UID, and GID of sysctl files.
+    private static final int SYSCTL_MODE = 0100644;
+    private static final int SYSCTL_UID = 0;
+    private static final int SYSCTL_GID = 0;
+
+    private void checkSysctlPermissions(String fileName) throws ErrnoException {
+        StructStat stat = Os.stat(fileName);
+        assertEquals("mode of " + fileName + ":", SYSCTL_MODE, stat.st_mode);
+        assertEquals("UID of " + fileName + ":", SYSCTL_UID, stat.st_uid);
+        assertEquals("GID of " + fileName + ":", SYSCTL_GID, stat.st_gid);
+    }
+
+    private void assertLess(String what, int a, int b) {
+        assertTrue(what + " expected < " + b + " but was: " + a, a < b);
+    }
+
+    private String readFile(String fileName) throws ErrnoException, IOException {
+        byte[] buf = new byte[1024];
+        FileDescriptor fd = Os.open(fileName, 0, OsConstants.O_RDONLY);
+        int bytesRead = Os.read(fd, buf, 0, buf.length);
+        assertLess("length of " + fileName + ":", bytesRead, buf.length);
+        return new String(buf);
+    }
+
+    /**
+     * Checks that the sysctls for multinetwork kernel features are present and
+     * enabled. The necessary kernel commits are:
+     *
+     * Mainline Linux:
+     *   e110861 net: add a sysctl to reflect the fwmark on replies
+     *   1b3c61d net: Use fwmark reflection in PMTU discovery.
+     *   84f39b0 net: support marking accepting TCP sockets
+     *
+     * Common Android tree (e.g., 3.10):
+     *   a03f539 net: ipv6: autoconf routes into per-device tables
+     */
+     public void testProcFiles() throws ErrnoException, IOException, NumberFormatException {
+         for (String sysctl : GLOBAL_SYSCTLS) {
+             checkSysctlPermissions(sysctl);
+             int value = Integer.parseInt(readFile(sysctl).trim());
+             assertEquals("value of " + sysctl + ":", 1, value);
+         }
+
+         File[] interfaceDirs = new File(IPV6_SYSCTL_DIR).listFiles();
+         for (File interfaceDir : interfaceDirs) {
+             if (interfaceDir.getName().equals("all") || interfaceDir.getName().equals("lo")) {
+                 continue;
+             }
+             String sysctl = new File(interfaceDir, AUTOCONF_SYSCTL).getAbsolutePath();
+             checkSysctlPermissions(sysctl);
+             int value = Integer.parseInt(readFile(sysctl).trim());
+             assertLess("value of " + sysctl + ":", value, 0);
+         }
+     }
+}
diff --git a/tests/tests/net/src/android/net/cts/MultinetworkTest.java b/tests/tests/net/src/android/net/cts/MultinetworkTest.java
deleted file mode 100644
index 256c030..0000000
--- a/tests/tests/net/src/android/net/cts/MultinetworkTest.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2014 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.net.cts;
-
-import android.system.ErrnoException;
-import android.system.Os;
-import android.system.OsConstants;
-import android.system.StructStat;
-import android.test.AndroidTestCase;
-
-import java.io.File;
-import java.io.FileDescriptor;
-import java.io.IOException;
-
-/**
- * Tests for multinetwork functionality.
- */
-public class MultinetworkTest extends AndroidTestCase {
-
-    // Global sysctls. Must be present and set to 1.
-    private static final String[] GLOBAL_SYSCTLS = {
-        "/proc/sys/net/ipv4/fwmark_reflect",
-        "/proc/sys/net/ipv6/fwmark_reflect",
-        "/proc/sys/net/ipv4/tcp_fwmark_accept",
-    };
-
-    // Per-interface IPv6 autoconf sysctls.
-    private static final String IPV6_SYSCTL_DIR = "/proc/sys/net/ipv6/conf";
-    private static final String AUTOCONF_SYSCTL = "accept_ra_rt_table";
-
-    // Expected mode, UID, and GID of sysctl files.
-    private static final int SYSCTL_MODE = 0100644;
-    private static final int SYSCTL_UID = 0;
-    private static final int SYSCTL_GID = 0;
-
-    private void checkSysctlPermissions(String fileName) throws ErrnoException {
-        StructStat stat = Os.stat(fileName);
-        assertEquals("mode of " + fileName + ":", SYSCTL_MODE, stat.st_mode);
-        assertEquals("UID of " + fileName + ":", SYSCTL_UID, stat.st_uid);
-        assertEquals("GID of " + fileName + ":", SYSCTL_GID, stat.st_gid);
-    }
-
-    private void assertLess(String what, int a, int b) {
-        assertTrue(what + " expected < " + b + " but was: " + a, a < b);
-    }
-
-    private String readFile(String fileName) throws ErrnoException, IOException {
-        byte[] buf = new byte[1024];
-        FileDescriptor fd = Os.open(fileName, 0, OsConstants.O_RDONLY);
-        int bytesRead = Os.read(fd, buf, 0, buf.length);
-        assertLess("length of " + fileName + ":", bytesRead, buf.length);
-        return new String(buf);
-    }
-
-    /**
-     * Checks that the sysctls for multinetwork kernel features are present and
-     * enabled. The necessary kernel commits are:
-     *
-     * Mainline Linux:
-     *   e110861 net: add a sysctl to reflect the fwmark on replies
-     *   1b3c61d net: Use fwmark reflection in PMTU discovery.
-     *   84f39b0 net: support marking accepting TCP sockets
-     *
-     * Common Android tree (e.g., 3.10):
-     *   a03f539 net: ipv6: autoconf routes into per-device tables
-     */
-     public void testProcFiles() throws ErrnoException, IOException, NumberFormatException {
-         for (String sysctl : GLOBAL_SYSCTLS) {
-             checkSysctlPermissions(sysctl);
-             int value = Integer.parseInt(readFile(sysctl).trim());
-             assertEquals("value of " + sysctl + ":", 1, value);
-         }
-
-         File[] interfaceDirs = new File(IPV6_SYSCTL_DIR).listFiles();
-         for (File interfaceDir : interfaceDirs) {
-             if (interfaceDir.getName().equals("all") || interfaceDir.getName().equals("lo")) {
-                 continue;
-             }
-             String sysctl = new File(interfaceDir, AUTOCONF_SYSCTL).getAbsolutePath();
-             checkSysctlPermissions(sysctl);
-             int value = Integer.parseInt(readFile(sysctl).trim());
-             assertLess("value of " + sysctl + ":", value, 0);
-         }
-     }
-}
diff --git a/tests/tests/net/src/android/net/http/cts/ApacheHttpClientTest.java b/tests/tests/net/src/android/net/http/cts/ApacheHttpClientTest.java
index 7d9189f..2e5306d 100644
--- a/tests/tests/net/src/android/net/http/cts/ApacheHttpClientTest.java
+++ b/tests/tests/net/src/android/net/http/cts/ApacheHttpClientTest.java
@@ -21,56 +21,27 @@
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.impl.client.DefaultHttpClient;
 
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageManager;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-import android.net.NetworkInfo.State;
 import android.net.Uri;
-import android.net.wifi.WifiManager;
 import android.test.AndroidTestCase;
-import android.util.Log;
 import android.webkit.cts.CtsTestServer;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
 
 public class ApacheHttpClientTest extends AndroidTestCase {
 
-    private static final String TAG = ApacheHttpClientTest.class.getSimpleName();
-
     private static final int NUM_DOWNLOADS = 20;
 
     private static final int SMALL_DOWNLOAD_SIZE = 100 * 1024;
 
     private CtsTestServer mWebServer;
 
-    private WifiManager mWifiManager;
-
-    private ConnectivityManager mConnectivityManager;
-
-    private boolean mHasTelephony;
-
-    private boolean mHasWifi;
-
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         mWebServer = new CtsTestServer(mContext);
-        mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
-        mConnectivityManager = (ConnectivityManager)
-                mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
-
-        PackageManager packageManager = mContext.getPackageManager();
-        mHasTelephony = packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
-        mHasWifi = packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI);
     }
 
     @Override
@@ -79,25 +50,8 @@
         mWebServer.shutdown();
     }
 
-    public void testExecute_withMobile() throws Exception {
-        if (mHasTelephony) {
-            disconnectWifiToConnectToMobile();
-        }
-
+    public void testExecute() throws Exception {
         downloadMultipleFiles();
-
-        if (mHasWifi) {
-            connectToWifi();
-        }
-    }
-
-    public void testExecute_withWifi() throws Exception {
-        if (mHasWifi) {
-            if (!mWifiManager.isWifiEnabled()) {
-                connectToWifi();
-            }
-            downloadMultipleFiles();
-        }
     }
 
     private void downloadMultipleFiles() throws ClientProtocolException, IOException {
@@ -134,77 +88,6 @@
                 numBytes += bytesRead;
             }
         }
-        assertEquals(message, SMALL_DOWNLOAD_SIZE, numBytes);
-    }
-
-    private void connectToWifi() throws InterruptedException {
-        if (!mWifiManager.isWifiEnabled()) {
-            ConnectivityActionReceiver receiver =
-                    new ConnectivityActionReceiver(ConnectivityManager.TYPE_WIFI, State.CONNECTED);
-            IntentFilter filter = new IntentFilter();
-            filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
-            mContext.registerReceiver(receiver, filter);
-
-            assertTrue(mWifiManager.setWifiEnabled(true));
-            assertTrue("Wifi must be configured to connect to an access point for this test.",
-                    receiver.waitForStateChange());
-
-            mContext.unregisterReceiver(receiver);
-        }
-    }
-
-    private void disconnectWifiToConnectToMobile() throws InterruptedException {
-        if (mHasWifi && mWifiManager.isWifiEnabled()) {
-            ConnectivityActionReceiver connectMobileReceiver =
-                    new ConnectivityActionReceiver(ConnectivityManager.TYPE_MOBILE,
-                            State.CONNECTED);
-            ConnectivityActionReceiver disconnectWifiReceiver =
-                    new ConnectivityActionReceiver(ConnectivityManager.TYPE_WIFI,
-                            State.DISCONNECTED);
-            IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
-            mContext.registerReceiver(connectMobileReceiver, filter);
-            mContext.registerReceiver(disconnectWifiReceiver, filter);
-
-            assertTrue(mWifiManager.setWifiEnabled(false));
-            assertTrue(disconnectWifiReceiver.waitForStateChange());
-            assertTrue(connectMobileReceiver.waitForStateChange());
-
-            mContext.unregisterReceiver(connectMobileReceiver);
-            mContext.unregisterReceiver(disconnectWifiReceiver);
-        }
-    }
-
-    /** Receiver that captures the last connectivity change's network type and state. */
-    private class ConnectivityActionReceiver extends BroadcastReceiver {
-
-        private final CountDownLatch mReceiveLatch = new CountDownLatch(1);
-
-        private final int mNetworkType;
-
-        private final State mExpectedState;
-
-        ConnectivityActionReceiver(int networkType, State expectedState) {
-            mNetworkType = networkType;
-            mExpectedState = expectedState;
-        }
-
-        public void onReceive(Context context, Intent intent) {
-            NetworkInfo networkInfo = intent.getExtras()
-                    .getParcelable(ConnectivityManager.EXTRA_NETWORK_INFO);
-            int networkType = networkInfo.getType();
-            State networkState = networkInfo.getState();
-            Log.i(TAG, "Network type: " + networkType + " State: " + networkInfo.getState());
-            if (networkType == mNetworkType && networkInfo.getState() == mExpectedState) {
-                mReceiveLatch.countDown();
-            }
-        }
-
-        public boolean waitForStateChange() throws InterruptedException {
-            return mReceiveLatch.await(30, TimeUnit.SECONDS) || hasExpectedState();
-        }
-
-        private boolean hasExpectedState() {
-            return mExpectedState == mConnectivityManager.getNetworkInfo(mNetworkType).getState();
-        }
+        assertEquals(message, expectedNumBytes, numBytes);
     }
 }
diff --git a/tests/tests/net/src/android/net/ipv6/cts/PingTest.java b/tests/tests/net/src/android/net/ipv6/cts/PingTest.java
index eddb416..c23ad30 100644
--- a/tests/tests/net/src/android/net/ipv6/cts/PingTest.java
+++ b/tests/tests/net/src/android/net/ipv6/cts/PingTest.java
@@ -155,7 +155,7 @@
     public void testLoopbackPing() throws ErrnoException, IOException {
         // Generate a random ping packet and send it to localhost.
         InetAddress ipv6Loopback = InetAddress.getByName(null);
-        assertEquals("localhost/::1", ipv6Loopback.toString());
+        assertEquals("::1", ipv6Loopback.getHostAddress());
 
         for (int i = 0; i < NUM_PACKETS; i++) {
             byte[] packet = pingPacket((int) (Math.random() * (MAX_SIZE - ICMP_HEADER_SIZE)));
diff --git a/tests/tests/net/src/android/net/wifi/cts/WifiEnterpriseConfigTest.java b/tests/tests/net/src/android/net/wifi/cts/WifiEnterpriseConfigTest.java
index 6e395aa..2cc5951 100644
--- a/tests/tests/net/src/android/net/wifi/cts/WifiEnterpriseConfigTest.java
+++ b/tests/tests/net/src/android/net/wifi/cts/WifiEnterpriseConfigTest.java
@@ -32,6 +32,10 @@
     private static final String IDENTITY = "identity";
     private static final String PASSWORD = "password";
     private static final String SUBJECT_MATCH = "subjectmatch";
+    private static final String ALT_SUBJECT_MATCH = "altsubjectmatch";
+    private static final String DOM_SUBJECT_MATCH = "domsubjectmatch";
+    private static final String PLMN = "plmn";
+    private static final String REALM = "realm";
     private static final String ANON_IDENTITY = "anonidentity";
     private static final int ENABLE_DELAY = 10000;
 
@@ -87,6 +91,15 @@
         config.setClientKeyEntry(null, null);
         config.setSubjectMatch(SUBJECT_MATCH);
         assertTrue(config.getSubjectMatch().equals(SUBJECT_MATCH));
+        // Hotspot 2.0 related attributes
+        config.setPlmn(PLMN);
+        assertTrue(config.getPlmn().equals(PLMN));
+        config.setRealm(REALM);
+        assertTrue(config.getRealm().equals(REALM));
+        config.setAltSubjectMatch(ALT_SUBJECT_MATCH);
+        assertTrue(config.getAltSubjectMatch().equals(ALT_SUBJECT_MATCH));
+        config.setDomainSuffixMatch(DOM_SUBJECT_MATCH);
+        assertTrue(config.getDomainSuffixMatch().equals(DOM_SUBJECT_MATCH));
     }
 
     public void testAddEapNetwork() {
diff --git a/tests/tests/netlegacy22/Android.mk b/tests/tests/netlegacy22/Android.mk
new file mode 100644
index 0000000..68fd6f8
--- /dev/null
+++ b/tests/tests/netlegacy22/Android.mk
@@ -0,0 +1,32 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := tests
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsNetTestCasesLegacyApi22
+
+LOCAL_SDK_VERSION := 22
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/netlegacy22/AndroidManifest.xml b/tests/tests/netlegacy22/AndroidManifest.xml
new file mode 100644
index 0000000..d243e45
--- /dev/null
+++ b/tests/tests/netlegacy22/AndroidManifest.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2007 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.net.legacy22">
+
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.INTERNET" />
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="com.android.cts.net.legacy22"
+                     android:label="CTS tests of legacy android.net APIs as of API 22">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+
+</manifest>
+
diff --git a/tests/tests/netlegacy22/src/android/net/cts/legacy/api22/ConnectivityManagerLegacyTest.java b/tests/tests/netlegacy22/src/android/net/cts/legacy/api22/ConnectivityManagerLegacyTest.java
new file mode 100644
index 0000000..8a9002b
--- /dev/null
+++ b/tests/tests/netlegacy22/src/android/net/cts/legacy/api22/ConnectivityManagerLegacyTest.java
@@ -0,0 +1,259 @@
+/*
+ * Copyright (C) 2015 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.net.cts.legacy.api22;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.net.ConnectivityManager;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.net.Network;
+import android.net.NetworkInfo;
+import android.net.wifi.WifiManager;
+import android.os.ConditionVariable;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+import java.net.DatagramSocket;
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.List;
+
+import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
+import static android.net.ConnectivityManager.TYPE_MOBILE;
+import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI;
+import static android.net.ConnectivityManager.TYPE_VPN;
+import static android.net.ConnectivityManager.TYPE_WIFI;
+
+public class ConnectivityManagerLegacyTest extends AndroidTestCase {
+    private static final String TAG = ConnectivityManagerLegacyTest.class.getSimpleName();
+    private static final String FEATURE_ENABLE_HIPRI = "enableHIPRI";
+    private static final String HOST_ADDRESS1 = "192.0.2.1";
+    private static final String HOST_ADDRESS2 = "192.0.2.2";
+    private static final String HOST_ADDRESS3 = "192.0.2.3";
+
+    // These are correct as of API level 22, which is what we target here.
+    private static final int APN_REQUEST_FAILED = 3;
+    private static final int MAX_NETWORK_TYPE = TYPE_VPN;
+
+    private ConnectivityManager mCm;
+    private WifiManager mWifiManager;
+    private PackageManager mPackageManager;
+
+    private final List<Integer>mProtectedNetworks = new ArrayList<Integer>();
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        mCm = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
+        mWifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
+        mPackageManager = getContext().getPackageManager();
+
+        // Get com.android.internal.R.array.config_protectedNetworks
+        int resId = getContext().getResources().getIdentifier("config_protectedNetworks", "array", "android");
+        int[] protectedNetworks = getContext().getResources().getIntArray(resId);
+        for (int p : protectedNetworks) {
+            mProtectedNetworks.add(p);
+        }
+    }
+
+    // true if only the system can turn it on
+    private boolean isNetworkProtected(int networkType) {
+        return mProtectedNetworks.contains(networkType);
+    }
+
+    private int ipv4AddrToInt(String addrString) throws Exception {
+        byte[] addr = ((Inet4Address) InetAddress.getByName(addrString)).getAddress();
+        return ((addr[3] & 0xff) << 24) | ((addr[2] & 0xff) << 16) |
+                ((addr[1] & 0xff) << 8) | (addr[0] & 0xff);
+    }
+
+    private void checkSourceAddress(String addrString, int type) throws Exception {
+        DatagramSocket d = new DatagramSocket();
+        d.connect(InetAddress.getByName(addrString), 7);
+        InetAddress localAddress = d.getLocalAddress();
+
+        Network[] networks = mCm.getAllNetworks();
+        for (int i = 0; i < networks.length; i++) {
+            NetworkInfo ni = mCm.getNetworkInfo(networks[i]);
+            if (ni != null && ni.getType() == type) {
+                LinkProperties lp = mCm.getLinkProperties(networks[i]);
+                for (LinkAddress address : lp.getLinkAddresses()) {
+                    if (address.getAddress().equals(localAddress)) {
+                        return;
+                    }
+                }
+            }
+        }
+        fail("Local address " + localAddress + " not assigned to any network of type " + type);
+    }
+
+    /** Test that hipri can be brought up when Wifi is enabled. */
+    public void testStartUsingNetworkFeature_enableHipri() throws Exception {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
+                || !mPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)) {
+            // This test requires a mobile data connection and WiFi.
+            return;
+        }
+
+        // Make sure WiFi is connected to an access point.
+        connectToWifi();
+
+        expectNetworkBroadcast(TYPE_MOBILE_HIPRI, NetworkInfo.State.CONNECTED,
+                new Runnable() {
+                    public void run() {
+                        int ret = mCm.startUsingNetworkFeature(TYPE_MOBILE, FEATURE_ENABLE_HIPRI);
+                        assertTrue("Couldn't start using the HIPRI feature.", ret != -1);
+                    }
+                });
+
+        assertTrue("Couldn't requestRouteToHost using HIPRI.",
+                mCm.requestRouteToHost(TYPE_MOBILE_HIPRI, ipv4AddrToInt(HOST_ADDRESS1)));
+
+        try { Thread.sleep(1000); } catch(Exception e) {}
+        checkSourceAddress(HOST_ADDRESS1, TYPE_MOBILE);
+        checkSourceAddress(HOST_ADDRESS2, TYPE_WIFI);
+
+        // TODO check dns selection
+
+        expectNetworkBroadcast(TYPE_MOBILE_HIPRI, NetworkInfo.State.DISCONNECTED,
+                new Runnable() {
+                    public void run() {
+                        int ret = mCm.stopUsingNetworkFeature(TYPE_MOBILE, FEATURE_ENABLE_HIPRI);
+                        assertTrue("Couldn't stop using the HIPRI feature.", ret != -1);
+                    }
+                });
+
+
+        // TODO check dns selection
+        disconnectFromWifi();
+    }
+
+    public void testStartUsingNetworkFeature() {
+
+        final String invalidFeature = "invalidFeature";
+        final String mmsFeature = "enableMMS";
+        final int failureCode = -1;
+        final int wifiOnlyStartFailureCode = APN_REQUEST_FAILED;
+        final int wifiOnlyStopFailureCode = -1;
+
+        NetworkInfo ni = mCm.getNetworkInfo(TYPE_MOBILE);
+        if (ni != null) {
+            assertEquals(APN_REQUEST_FAILED,
+                    mCm.startUsingNetworkFeature(TYPE_MOBILE, invalidFeature));
+            assertEquals(failureCode, mCm.stopUsingNetworkFeature(TYPE_MOBILE, invalidFeature));
+        } else {
+            assertEquals(wifiOnlyStartFailureCode, mCm.startUsingNetworkFeature(TYPE_MOBILE,
+                    invalidFeature));
+            assertEquals(wifiOnlyStopFailureCode, mCm.stopUsingNetworkFeature(TYPE_MOBILE,
+                    invalidFeature));
+        }
+
+        ni = mCm.getNetworkInfo(TYPE_WIFI);
+        if (ni != null) {
+            // Should return failure because MMS is not supported on WIFI.
+            assertEquals(APN_REQUEST_FAILED, mCm.startUsingNetworkFeature(TYPE_WIFI,
+                    mmsFeature));
+            assertEquals(failureCode, mCm.stopUsingNetworkFeature(TYPE_WIFI,
+                    mmsFeature));
+        }
+    }
+
+    private void expectNetworkBroadcast(final int type, final NetworkInfo.State state,
+            Runnable afterWhat) {
+        final int TIMEOUT_MS = 30 * 1000;
+        final ConditionVariable var = new ConditionVariable();
+
+        Log.d(TAG, "Waiting for " + state + " broadcast for type " + type);
+        BroadcastReceiver receiver = new BroadcastReceiver() {
+            public void onReceive(Context context, Intent intent) {
+                NetworkInfo ni = intent.getExtras()
+                        .getParcelable(ConnectivityManager.EXTRA_NETWORK_INFO);
+                assertNotNull("CONNECTIVITY_ACTION with null EXTRA_NETWORK_INFO", ni);
+                if (ni.getType() == type && ni.getState().equals(state)) {
+                    Log.d(TAG, "Received expected " + state + " broadcast for type " + type);
+                    var.open();
+                }
+            }
+        };
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(CONNECTIVITY_ACTION);
+        mContext.registerReceiver(receiver, filter);
+
+        try {
+            afterWhat.run();
+            final String msg = "Did not receive expected " + state + " broadcast for type " + type +
+                    " after " + TIMEOUT_MS + " ms";
+            assertTrue(msg, var.block(TIMEOUT_MS));
+        } finally {
+            mContext.unregisterReceiver(receiver);
+        }
+    }
+
+    private boolean isWifiConnected() {
+        NetworkInfo ni = mCm.getNetworkInfo(TYPE_WIFI);
+        return ni != null && ni.isConnected();
+    }
+
+    private void setWifiState(final boolean enabled) {
+        if (enabled != isWifiConnected()) {
+            final NetworkInfo.State desiredState = enabled ?
+                    NetworkInfo.State.CONNECTED :
+                    NetworkInfo.State.DISCONNECTED;
+            expectNetworkBroadcast(TYPE_WIFI, desiredState, new Runnable() {
+                public void run() {
+                    mWifiManager.setWifiEnabled(enabled);
+                }
+            });
+        }
+    }
+
+    private void connectToWifi() {
+        setWifiState(true);
+    }
+
+    private void disconnectFromWifi() {
+        setWifiState(false);
+    }
+
+    private boolean isNetworkSupported(int networkType) {
+        return mCm.getNetworkInfo(networkType) != null;
+    }
+
+    public void testRequestRouteToHost() throws Exception {
+        for (int type = -1 ; type <= MAX_NETWORK_TYPE; type++) {
+            NetworkInfo ni = mCm.getNetworkInfo(type);
+            boolean expectToWork = isNetworkSupported(type) && !isNetworkProtected(type) &&
+                    ni != null && ni.isConnected();
+
+            try {
+                assertTrue("Network type " + type,
+                        mCm.requestRouteToHost(type, ipv4AddrToInt(HOST_ADDRESS3)) == expectToWork);
+            } catch (Exception e) {
+                Log.d(TAG, "got exception in requestRouteToHost for type " + type);
+                assertFalse("Exception received for type " + type, expectToWork);
+            }
+
+            //TODO verify route table
+        }
+
+        assertFalse(mCm.requestRouteToHost(-1, ipv4AddrToInt(HOST_ADDRESS1)));
+    }
+}
diff --git a/tests/tests/netsecpolicy/Android.mk b/tests/tests/netsecpolicy/Android.mk
new file mode 100644
index 0000000..137672e
--- /dev/null
+++ b/tests/tests/netsecpolicy/Android.mk
@@ -0,0 +1,17 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/tests/netsecpolicy/src/android/security/NetworkSecurityPolicyTestBase.java b/tests/tests/netsecpolicy/src/android/security/NetworkSecurityPolicyTestBase.java
new file mode 100644
index 0000000..0ab07ae
--- /dev/null
+++ b/tests/tests/netsecpolicy/src/android/security/NetworkSecurityPolicyTestBase.java
@@ -0,0 +1,380 @@
+package android.security;
+
+import android.app.DownloadManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ApplicationInfo;
+import android.database.Cursor;
+import android.media.MediaPlayer;
+import android.net.Uri;
+import android.net.http.AndroidHttpClient;
+import android.test.AndroidTestCase;
+import android.webkit.cts.CtsTestServer;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpGet;
+
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.UnknownServiceException;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+abstract class NetworkSecurityPolicyTestBase extends AndroidTestCase {
+    private CtsTestServer mHttpOnlyWebServer;
+
+    private final boolean mCleartextTrafficExpectedToBePermitted;
+
+    NetworkSecurityPolicyTestBase(boolean cleartextTrafficExpectedToBePermitted) {
+        mCleartextTrafficExpectedToBePermitted = cleartextTrafficExpectedToBePermitted;
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mHttpOnlyWebServer = new CtsTestServer(mContext, false);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        try {
+            mHttpOnlyWebServer.shutdown();
+        } finally {
+            super.tearDown();
+        }
+    }
+
+    public void testNetworkSecurityPolicy() {
+        assertEquals(mCleartextTrafficExpectedToBePermitted,
+                NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted());
+    }
+
+    public void testApplicationInfoFlag() {
+        ApplicationInfo appInfo = getContext().getApplicationInfo();
+        int expectedValue = (mCleartextTrafficExpectedToBePermitted)
+                ? ApplicationInfo.FLAG_USES_CLEARTEXT_TRAFFIC : 0;
+        assertEquals(expectedValue, appInfo.flags & ApplicationInfo.FLAG_USES_CLEARTEXT_TRAFFIC);
+    }
+
+    public void testDefaultHttpURLConnection() throws Exception {
+        if (mCleartextTrafficExpectedToBePermitted) {
+            assertCleartextHttpURLConnectionSucceeds();
+        } else {
+            assertCleartextHttpURLConnectionBlocked();
+        }
+    }
+
+    private void assertCleartextHttpURLConnectionSucceeds() throws Exception {
+        URL url = new URL(mHttpOnlyWebServer.getUserAgentUrl());
+        HttpURLConnection conn = null;
+        try {
+            mHttpOnlyWebServer.resetRequestState();
+            conn = (HttpURLConnection) url.openConnection();
+            conn.setConnectTimeout(5000);
+            conn.setReadTimeout(5000);
+            assertEquals(200, conn.getResponseCode());
+        } finally {
+            if (conn != null) {
+                conn.disconnect();
+            }
+        }
+        Uri uri = Uri.parse(url.toString()).buildUpon().scheme(null).authority(null).build();
+        assertTrue(mHttpOnlyWebServer.wasResourceRequested(uri.toString()));
+    }
+
+    private void assertCleartextHttpURLConnectionBlocked() throws Exception {
+        URL url = new URL(mHttpOnlyWebServer.getUserAgentUrl());
+        HttpURLConnection conn = null;
+        try {
+            mHttpOnlyWebServer.resetRequestState();
+            conn = (HttpURLConnection) url.openConnection();
+            conn.setConnectTimeout(5000);
+            conn.setReadTimeout(5000);
+            conn.getResponseCode();
+            fail();
+        } catch (UnknownServiceException e) {
+            if ((e.getMessage() == null) || (!e.getMessage().toLowerCase().contains("cleartext"))) {
+                fail("Exception with which request failed does not mention cleartext: " + e);
+            }
+        } finally {
+            if (conn != null) {
+                conn.disconnect();
+            }
+        }
+        Uri uri = Uri.parse(url.toString()).buildUpon().scheme(null).authority(null).build();
+        assertFalse(mHttpOnlyWebServer.wasResourceRequested(uri.toString()));
+    }
+
+    public void testAndroidHttpClient() throws Exception {
+        if (mCleartextTrafficExpectedToBePermitted) {
+            assertAndroidHttpClientCleartextRequestSucceeds();
+        } else {
+            assertAndroidHttpClientCleartextRequestBlocked();
+        }
+    }
+
+    private void assertAndroidHttpClientCleartextRequestSucceeds() throws Exception {
+        URL url = new URL(mHttpOnlyWebServer.getUserAgentUrl());
+        AndroidHttpClient httpClient = AndroidHttpClient.newInstance(null);
+        try {
+            HttpResponse response = httpClient.execute(new HttpGet(url.toString()));
+            assertEquals(200, response.getStatusLine().getStatusCode());
+        } finally {
+            httpClient.close();
+        }
+        Uri uri = Uri.parse(url.toString()).buildUpon().scheme(null).authority(null).build();
+        assertTrue(mHttpOnlyWebServer.wasResourceRequested(uri.toString()));
+    }
+
+    private void assertAndroidHttpClientCleartextRequestBlocked() throws Exception {
+        URL url = new URL(mHttpOnlyWebServer.getUserAgentUrl());
+        AndroidHttpClient httpClient = AndroidHttpClient.newInstance(null);
+        try {
+            HttpResponse response = httpClient.execute(new HttpGet(url.toString()));
+            fail();
+        } catch (IOException e) {
+            if ((e.getMessage() == null) || (!e.getMessage().toLowerCase().contains("cleartext"))) {
+                fail("Exception with which request failed does not mention cleartext: " + e);
+            }
+        } finally {
+            httpClient.close();
+        }
+        Uri uri = Uri.parse(url.toString()).buildUpon().scheme(null).authority(null).build();
+        assertFalse(mHttpOnlyWebServer.wasResourceRequested(uri.toString()));
+    }
+
+    public void testMediaPlayer() throws Exception {
+        if (mCleartextTrafficExpectedToBePermitted) {
+            assertMediaPlayerCleartextRequestSucceeds();
+        } else {
+            assertMediaPlayerCleartextRequestBlocked();
+        }
+    }
+
+    private void assertMediaPlayerCleartextRequestSucceeds() throws Exception {
+        MediaPlayer mediaPlayer = new MediaPlayer();
+        Uri uri = Uri.parse(mHttpOnlyWebServer.getUserAgentUrl());
+        mediaPlayer.setDataSource(getContext(), uri);
+
+        try {
+            mediaPlayer.prepare();
+        } catch (IOException expected) {
+        } finally {
+            try {
+                mediaPlayer.stop();
+            } catch (IllegalStateException ignored) {
+            }
+        }
+        uri = uri.buildUpon().scheme(null).authority(null).build();
+        assertTrue(mHttpOnlyWebServer.wasResourceRequested(uri.toString()));
+    }
+
+    private void assertMediaPlayerCleartextRequestBlocked() throws Exception {
+        MediaPlayer mediaPlayer = new MediaPlayer();
+        Uri uri = Uri.parse(mHttpOnlyWebServer.getUserAgentUrl());
+        mediaPlayer.setDataSource(getContext(), uri);
+
+        try {
+            mediaPlayer.prepare();
+        } catch (IOException expected) {
+        } finally {
+            try {
+                mediaPlayer.stop();
+            } catch (IllegalStateException ignored) {
+            }
+        }
+        uri = uri.buildUpon().scheme(null).authority(null).build();
+        assertFalse(mHttpOnlyWebServer.wasResourceRequested(uri.toString()));
+    }
+
+    public void testDownloadManager() throws Exception {
+        Uri uri = Uri.parse(mHttpOnlyWebServer.getTestDownloadUrl("netsecpolicy", 0));
+        int[] result = downloadUsingDownloadManager(uri);
+        int status = result[0];
+        int reason = result[1];
+        uri = uri.buildUpon().scheme(null).authority(null).build();
+        if (mCleartextTrafficExpectedToBePermitted) {
+            assertEquals(DownloadManager.STATUS_SUCCESSFUL, status);
+            assertTrue(mHttpOnlyWebServer.wasResourceRequested(uri.toString()));
+        } else {
+            assertEquals(DownloadManager.STATUS_FAILED, status);
+            assertEquals(400, reason);
+            assertFalse(mHttpOnlyWebServer.wasResourceRequested(uri.toString()));
+        }
+    }
+
+
+    private int[] downloadUsingDownloadManager(Uri uri) throws Exception {
+        DownloadManager downloadManager =
+                (DownloadManager) getContext().getSystemService(Context.DOWNLOAD_SERVICE);
+        removeAllDownloads(downloadManager);
+        BroadcastReceiver downloadCompleteReceiver = null;
+        try {
+            final SettableFuture<Intent> downloadCompleteIntentFuture = new SettableFuture<Intent>();
+            downloadCompleteReceiver = new BroadcastReceiver() {
+                @Override
+                public void onReceive(Context context, Intent intent) {
+                    downloadCompleteIntentFuture.set(intent);
+                }
+            };
+            getContext().registerReceiver(
+                    downloadCompleteReceiver,
+                    new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
+
+            Intent downloadCompleteIntent;
+
+            long downloadId = downloadManager.enqueue(new DownloadManager.Request(uri));
+            downloadCompleteIntent = downloadCompleteIntentFuture.get(5, TimeUnit.SECONDS);
+
+            assertEquals(downloadId,
+                    downloadCompleteIntent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1));
+            Cursor c = downloadManager.query(
+                    new DownloadManager.Query().setFilterById(downloadId));
+            try {
+                if (!c.moveToNext()) {
+                    fail("Download not found");
+                    return null;
+                }
+                int status = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS));
+                int reason = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_REASON));
+                return new int[] {status, reason};
+            } finally {
+                c.close();
+            }
+        } finally {
+            if (downloadCompleteReceiver != null) {
+                getContext().unregisterReceiver(downloadCompleteReceiver);
+            }
+            removeAllDownloads(downloadManager);
+        }
+    }
+
+    private static void removeAllDownloads(DownloadManager downloadManager) {
+        Cursor cursor = null;
+        try {
+            DownloadManager.Query query = new DownloadManager.Query();
+            cursor = downloadManager.query(query);
+            if (cursor.getCount() == 0) {
+                return;
+            }
+            long[] removeIds = new long[cursor.getCount()];
+            int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_ID);
+            for (int i = 0; cursor.moveToNext(); i++) {
+                removeIds[i] = cursor.getLong(columnIndex);
+            }
+            assertEquals(removeIds.length, downloadManager.remove(removeIds));
+        } finally {
+            if (cursor != null) {
+                cursor.close();
+            }
+        }
+    }
+
+    private static class SettableFuture<T> implements Future<T> {
+
+        private final Object mLock = new Object();
+        private boolean mDone;
+        private boolean mCancelled;
+        private T mValue;
+        private Throwable mException;
+
+        public void set(T value) {
+            synchronized (mLock) {
+                if (!mDone) {
+                    mValue = value;
+                    mDone = true;
+                    mLock.notifyAll();
+                }
+            }
+        }
+
+        public void setException(Throwable exception) {
+            synchronized (mLock) {
+                if (!mDone) {
+                    mException = exception;
+                    mDone = true;
+                    mLock.notifyAll();
+                }
+            }
+        }
+
+        @Override
+        public boolean cancel(boolean mayInterruptIfRunning) {
+            synchronized (mLock) {
+                if (mDone) {
+                    return false;
+                }
+                mCancelled = true;
+                mDone = true;
+                mLock.notifyAll();
+                return true;
+            }
+        }
+
+        @Override
+        public T get() throws InterruptedException, ExecutionException {
+            synchronized (mLock) {
+                while (!mDone) {
+                    mLock.wait();
+                }
+                return getValue();
+            }
+        }
+
+        @Override
+        public T get(long timeout, TimeUnit timeUnit)
+                throws InterruptedException, ExecutionException, TimeoutException {
+            synchronized (mLock) {
+                if (mDone) {
+                    return getValue();
+                }
+                long timeoutMillis = timeUnit.toMillis(timeout);
+                long deadlineTimeMillis = System.currentTimeMillis() + timeoutMillis;
+
+                while (!mDone) {
+                    long millisTillDeadline = deadlineTimeMillis - System.currentTimeMillis();
+                    if ((millisTillDeadline <= 0) || (millisTillDeadline > timeoutMillis)) {
+                        throw new TimeoutException();
+                    }
+                    mLock.wait(millisTillDeadline);
+                }
+                return getValue();
+            }
+        }
+
+        private T getValue() throws ExecutionException {
+            synchronized (mLock) {
+                if (!mDone) {
+                    throw new IllegalStateException("Not yet done");
+                }
+                if (mCancelled) {
+                    throw new CancellationException();
+                }
+                if (mException != null) {
+                    throw new ExecutionException(mException);
+                }
+                return mValue;
+            }
+        }
+
+        @Override
+        public boolean isCancelled() {
+            synchronized (mLock) {
+                return mCancelled;
+            }
+        }
+
+        @Override
+        public boolean isDone() {
+            synchronized (mLock) {
+                return mDone;
+            }
+        }
+    }
+}
diff --git a/tests/tests/netsecpolicy/usescleartexttraffic-false/Android.mk b/tests/tests/netsecpolicy/usescleartexttraffic-false/Android.mk
new file mode 100644
index 0000000..0441f2b
--- /dev/null
+++ b/tests/tests/netsecpolicy/usescleartexttraffic-false/Android.mk
@@ -0,0 +1,35 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner \
+    ctstestserver \
+    org.apache.http.legacy
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src ../src)
+
+LOCAL_PACKAGE_NAME := CtsNetSecPolicyUsesCleartextTrafficFalseTestCases
+
+LOCAL_INSTRUMENTATION_FOR := CtsNetSecPolicyUsesCleartextTrafficFalse
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/netsecpolicy/usescleartexttraffic-false/AndroidManifest.xml b/tests/tests/netsecpolicy/usescleartexttraffic-false/AndroidManifest.xml
new file mode 100644
index 0000000..49385f8
--- /dev/null
+++ b/tests/tests/netsecpolicy/usescleartexttraffic-false/AndroidManifest.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.netsecpolicy.usescleartext.false">
+
+  <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+  <application>
+      <uses-library android:name="android.test.runner"/>
+  </application>
+
+  <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                   android:targetPackage="android.netsecpolicy.usescleartext.false.cts"
+                   android:label="Tests for NetworkSecurityPolicy cleartext traffic policy when it is set to denied.">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+
+</manifest>
diff --git a/tests/tests/netsecpolicy/usescleartexttraffic-false/src/android/security/NetworkSecurityPolicyCleartextDeniedTest.java b/tests/tests/netsecpolicy/usescleartexttraffic-false/src/android/security/NetworkSecurityPolicyCleartextDeniedTest.java
new file mode 100644
index 0000000..f5d9770
--- /dev/null
+++ b/tests/tests/netsecpolicy/usescleartexttraffic-false/src/android/security/NetworkSecurityPolicyCleartextDeniedTest.java
@@ -0,0 +1,9 @@
+package android.security;
+
+public class NetworkSecurityPolicyCleartextDeniedTest extends NetworkSecurityPolicyTestBase {
+
+    public NetworkSecurityPolicyCleartextDeniedTest() {
+        super(false // expect cleartext traffic to be blocked
+                );
+    }
+}
diff --git a/tests/tests/netsecpolicy/usescleartexttraffic-true/Android.mk b/tests/tests/netsecpolicy/usescleartexttraffic-true/Android.mk
new file mode 100644
index 0000000..5a4a41d
--- /dev/null
+++ b/tests/tests/netsecpolicy/usescleartexttraffic-true/Android.mk
@@ -0,0 +1,35 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner \
+    ctstestserver \
+    org.apache.http.legacy
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src ../src)
+
+LOCAL_PACKAGE_NAME := CtsNetSecPolicyUsesCleartextTrafficTrueTestCases
+
+LOCAL_INSTRUMENTATION_FOR := CtsNetSecPolicyUsesCleartextTrafficTrue
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/netsecpolicy/usescleartexttraffic-true/AndroidManifest.xml b/tests/tests/netsecpolicy/usescleartexttraffic-true/AndroidManifest.xml
new file mode 100644
index 0000000..be698f2
--- /dev/null
+++ b/tests/tests/netsecpolicy/usescleartexttraffic-true/AndroidManifest.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.netsecpolicy.usescleartext.true">
+
+  <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+  <application>
+      <uses-library android:name="android.test.runner"/>
+  </application>
+
+  <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                   android:targetPackage="android.netsecpolicy.usescleartext.true.cts"
+                   android:label="Tests for NetworkSecurityPolicy cleartext traffic policy when it is set to permitted.">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+
+</manifest>
diff --git a/tests/tests/netsecpolicy/usescleartexttraffic-true/src/android/security/NetworkSecurityPolicyCleartextPermittedTest.java b/tests/tests/netsecpolicy/usescleartexttraffic-true/src/android/security/NetworkSecurityPolicyCleartextPermittedTest.java
new file mode 100644
index 0000000..83c1049
--- /dev/null
+++ b/tests/tests/netsecpolicy/usescleartexttraffic-true/src/android/security/NetworkSecurityPolicyCleartextPermittedTest.java
@@ -0,0 +1,9 @@
+package android.security;
+
+public class NetworkSecurityPolicyCleartextPermittedTest extends NetworkSecurityPolicyTestBase {
+
+    public NetworkSecurityPolicyCleartextPermittedTest() {
+        super(true // expect cleartext traffic to be permitted
+                );
+    }
+}
diff --git a/tests/tests/netsecpolicy/usescleartexttraffic-unspecified/Android.mk b/tests/tests/netsecpolicy/usescleartexttraffic-unspecified/Android.mk
new file mode 100644
index 0000000..faa3c23
--- /dev/null
+++ b/tests/tests/netsecpolicy/usescleartexttraffic-unspecified/Android.mk
@@ -0,0 +1,35 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner \
+    ctstestserver \
+    org.apache.http.legacy
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src ../src)
+
+LOCAL_PACKAGE_NAME := CtsNetSecPolicyUsesCleartextTrafficUnspecifiedTestCases
+
+LOCAL_INSTRUMENTATION_FOR := CtsNetSecPolicyUsesCleartextTrafficUnspecified
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/netsecpolicy/usescleartexttraffic-unspecified/AndroidManifest.xml b/tests/tests/netsecpolicy/usescleartexttraffic-unspecified/AndroidManifest.xml
new file mode 100644
index 0000000..7bd8742
--- /dev/null
+++ b/tests/tests/netsecpolicy/usescleartexttraffic-unspecified/AndroidManifest.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.netsecpolicy.usescleartext.unspecified">
+
+  <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+  <application>
+      <uses-library android:name="android.test.runner"/>
+  </application>
+
+  <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                   android:targetPackage="android.netsecpolicy.usescleartext.unspecified.cts"
+                   android:label="Tests for NetworkSecurityPolicy cleartext traffic policy when it is not specified.">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+
+</manifest>
diff --git a/tests/tests/netsecpolicy/usescleartexttraffic-unspecified/src/android/security/NetworkSecurityPolicyCleartextUnspecifiedTest.java b/tests/tests/netsecpolicy/usescleartexttraffic-unspecified/src/android/security/NetworkSecurityPolicyCleartextUnspecifiedTest.java
new file mode 100644
index 0000000..5690f31
--- /dev/null
+++ b/tests/tests/netsecpolicy/usescleartexttraffic-unspecified/src/android/security/NetworkSecurityPolicyCleartextUnspecifiedTest.java
@@ -0,0 +1,9 @@
+package android.security;
+
+public class NetworkSecurityPolicyCleartextUnspecifiedTest extends NetworkSecurityPolicyTestBase {
+
+    public NetworkSecurityPolicyCleartextUnspecifiedTest() {
+        super(true // expect cleartext traffic to be permitted
+                );
+    }
+}
diff --git a/tests/tests/openglperf/Android.mk b/tests/tests/openglperf/Android.mk
index 7be16e8..6b42ed0 100644
--- a/tests/tests/openglperf/Android.mk
+++ b/tests/tests/openglperf/Android.mk
@@ -38,4 +38,10 @@
 
 include $(BUILD_CTS_PACKAGE)
 
+# Make the replica island app and copy it to CTS out dir.
+cts_replica_name := com.replica.replicaisland
+cts_replica_apk := $(CTS_TESTCASES_OUT)/$(cts_replica_name).apk
+$(cts_replica_apk): $(call intermediates-dir-for,APPS,$(cts_replica_name))/package.apk
+	$(call copy-file-to-target)
+
 include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/tests/os/Android.mk b/tests/tests/os/Android.mk
index 9dfb86e..f4b140e 100644
--- a/tests/tests/os/Android.mk
+++ b/tests/tests/os/Android.mk
@@ -31,6 +31,7 @@
 LOCAL_SRC_FILES := $(call all-java-files-under, src) \
         src/android/os/cts/IParcelFileDescriptorPeer.aidl \
         src/android/os/cts/IEmptyService.aidl \
+        src/android/os/cts/ISeccompIsolatedService.aidl \
         src/android/os/cts/ISecondary.aidl
 
 LOCAL_PACKAGE_NAME := CtsOsTestCases
diff --git a/tests/tests/os/AndroidManifest.xml b/tests/tests/os/AndroidManifest.xml
index f225903..deb7045 100644
--- a/tests/tests/os/AndroidManifest.xml
+++ b/tests/tests/os/AndroidManifest.xml
@@ -120,6 +120,10 @@
             </intent-filter>
         </service>
 
+        <service android:name="android.os.cts.SeccompTest$IsolatedService"
+                android:isolatedProcess="true">
+        </service>
+
         <service android:name="android.os.cts.MessengerService"
                 android:process=":messengerService">
         </service>
diff --git a/tests/tests/os/jni/Android.mk b/tests/tests/os/jni/Android.mk
index dd3bb51..c125f5c 100644
--- a/tests/tests/os/jni/Android.mk
+++ b/tests/tests/os/jni/Android.mk
@@ -27,7 +27,38 @@
 		android_os_cts_TaggedPointer.cpp \
 		android_os_cts_HardwareName.cpp \
 		android_os_cts_OSFeatures.cpp \
-		android_os_cts_NoExecutePermissionTest.cpp
+		android_os_cts_NoExecutePermissionTest.cpp \
+		android_os_cts_SeccompTest.cpp
+
+# Select the architectures on which seccomp-bpf are supported. This is used to
+# include extra test files that will not compile on architectures where it is
+# not supported.
+ARCH_SUPPORTS_SECCOMP := 0
+ifeq ($(strip $(TARGET_ARCH)),arm)
+	ARCH_SUPPORTS_SECCOMP = 1
+endif
+
+ifeq ($(strip $(TARGET_ARCH)),arm64)
+	ARCH_SUPPORTS_SECCOMP = 1
+	# Required for __NR_poll definition.
+	LOCAL_CFLAGS += -D__ARCH_WANT_SYSCALL_DEPRECATED
+endif
+
+ifeq ($(strip $(TARGET_ARCH)),x86)
+	ARCH_SUPPORTS_SECCOMP = 1
+endif
+
+ifeq ($(strip $(TARGET_ARCH)),x86_64)
+	ARCH_SUPPORTS_SECCOMP = 1
+endif
+
+ifeq ($(ARCH_SUPPORTS_SECCOMP),1)
+	LOCAL_SRC_FILES += seccomp-tests/tests/seccomp_bpf_tests.c \
+			seccomp_sample_program.cpp
+
+	# This define controls the behavior of OSFeatures.needsSeccompSupport().
+	LOCAL_CFLAGS += -DARCH_SUPPORTS_SECCOMP
+endif
 
 LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
 
diff --git a/tests/tests/os/jni/CtsOsJniOnLoad.cpp b/tests/tests/os/jni/CtsOsJniOnLoad.cpp
index e4a0dc0..cac750f 100644
--- a/tests/tests/os/jni/CtsOsJniOnLoad.cpp
+++ b/tests/tests/os/jni/CtsOsJniOnLoad.cpp
@@ -29,6 +29,8 @@
 
 extern int register_android_os_cts_NoExecutePermissionTest(JNIEnv*);
 
+extern int register_android_os_cts_SeccompTest(JNIEnv*);
+
 jint JNI_OnLoad(JavaVM *vm, void *reserved) {
     JNIEnv *env = NULL;
 
@@ -60,5 +62,9 @@
         return JNI_ERR;
     }
 
+    if (register_android_os_cts_SeccompTest(env)) {
+        return JNI_ERR;
+    }
+
     return JNI_VERSION_1_4;
 }
diff --git a/tests/tests/os/jni/android_os_cts_OSFeatures.cpp b/tests/tests/os/jni/android_os_cts_OSFeatures.cpp
index 2ee31b1..153fb27 100644
--- a/tests/tests/os/jni/android_os_cts_OSFeatures.cpp
+++ b/tests/tests/os/jni/android_os_cts_OSFeatures.cpp
@@ -84,8 +84,9 @@
 
 jboolean android_os_cts_OSFeatures_needsSeccompSupport(JNIEnv*, jobject)
 {
-#if !defined(__arm__) && !defined(__i386__) && !defined(__x86_64__)
+#if !defined(ARCH_SUPPORTS_SECCOMP)
     // Seccomp support is only available for ARM, x86, x86_64.
+    // This define is controlled by the Android.mk.
     return false;
 #endif
 
diff --git a/tests/tests/os/jni/android_os_cts_SeccompTest.cpp b/tests/tests/os/jni/android_os_cts_SeccompTest.cpp
new file mode 100644
index 0000000..1ba8550
--- /dev/null
+++ b/tests/tests/os/jni/android_os_cts_SeccompTest.cpp
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#include <android/log.h>
+#include <jni.h>
+#include <string.h>
+#include <time.h>
+
+#if defined(ARCH_SUPPORTS_SECCOMP)
+#include <linux/filter.h>
+#include <linux/seccomp.h>
+#include <sys/syscall.h>
+#endif
+
+#include "seccomp_sample_program.h"
+#include "seccomp-tests/tests/test_harness.h"
+
+// Forward declare from seccomp_bpf_tests.c.
+extern "C" {
+struct __test_metadata* get_seccomp_test_list();
+}
+
+static const char TAG[] = "SeccompBpfTest-Native";
+
+jboolean android_security_cts_SeccompBpfTest_runKernelUnitTest(
+      JNIEnv* env, jobject thiz __unused, jstring name) {
+#if defined(ARCH_SUPPORTS_SECCOMP)
+    const char* nameStr = env->GetStringUTFChars(name, nullptr);
+
+    for (struct __test_metadata* t = get_seccomp_test_list(); t; t = t->next) {
+        if (strcmp(t->name, nameStr) == 0) {
+            __android_log_print(ANDROID_LOG_INFO, TAG, "Start: %s", t->name);
+            __run_test(t);
+            __android_log_print(ANDROID_LOG_INFO, TAG, "%s: %s",
+                t->passed ? "PASS" : "FAIL", t->name);
+            return t->passed;
+        }
+    }
+#endif  // ARCH_SUPPORTS_SECCOMP
+
+    return false;
+}
+
+jboolean android_security_cts_SeccompBpfTest_installTestFilter(JNIEnv*, jclass) {
+#if !defined(ARCH_SUPPORTS_SECCOMP)
+  return false;
+#else
+  struct sock_fprog prog = GetTestSeccompFilterProgram();
+
+  if (prog.len == 0)
+    return false;
+
+  int rv = syscall(__NR_seccomp, SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC, &prog);
+  return rv == 0;
+#endif
+}
+
+jint android_security_cts_SeccompBpfTest_getClockBootTime(JNIEnv*, jclass) {
+  struct timespec ts;
+  int rv = clock_gettime(CLOCK_BOOTTIME, &ts);
+  return rv;
+}
+
+static JNINativeMethod methods[] = {
+    { "runKernelUnitTest", "(Ljava/lang/String;)Z",
+        (void*)android_security_cts_SeccompBpfTest_runKernelUnitTest },
+    { "installTestFilter", "()Z",
+        (void*)android_security_cts_SeccompBpfTest_installTestFilter },
+    { "getClockBootTime", "()I",
+        (void*)android_security_cts_SeccompBpfTest_getClockBootTime },
+};
+
+int register_android_os_cts_SeccompTest(JNIEnv* env) {
+    jclass clazz = env->FindClass("android/os/cts/SeccompTest");
+    return env->RegisterNatives(clazz, methods, sizeof(methods) / sizeof(JNINativeMethod));
+}
diff --git a/tests/tests/os/jni/seccomp-tests/LICENSE b/tests/tests/os/jni/seccomp-tests/LICENSE
new file mode 100644
index 0000000..b9e779f
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/LICENSE
@@ -0,0 +1,27 @@
+// Copyright 2014 The Chromium OS Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//    * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//    * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//    * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/tests/tests/os/jni/seccomp-tests/README b/tests/tests/os/jni/seccomp-tests/README
new file mode 100644
index 0000000..c8cd2ad
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/README
@@ -0,0 +1,4 @@
+seccomp
+-------
+
+Landing place for code relating to seccomp_filter work for the Linux kernel.
diff --git a/tests/tests/os/jni/seccomp-tests/README.android b/tests/tests/os/jni/seccomp-tests/README.android
new file mode 100644
index 0000000..4c5bb83
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/README.android
@@ -0,0 +1,13 @@
+This is the kernel unittest for seccomp-bpf sandboxing.
+
+URL: https://github.com/redpig/seccomp
+Revision: e65c79a14dc2bbb6d8dbf12ebf71905e2253a4b2
+License: BSD
+
+Local modifications:
+- Remove usage of pthread_cancel()
+- Use __android_log_print() instead of fprintf()
+- Rename main() to seccomp_test_main()
+- Add get_seccomp_test_list()
+
+The diff of modifications can be found in local-modifications-android.diff.
diff --git a/tests/tests/os/jni/seccomp-tests/local-modifications-android.diff b/tests/tests/os/jni/seccomp-tests/local-modifications-android.diff
new file mode 100644
index 0000000..288261a
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/local-modifications-android.diff
@@ -0,0 +1,59 @@
+diff --git a/tests/seccomp_bpf_tests.c b/tests/seccomp_bpf_tests.c
+index deb78d1..98b0231 100644
+--- a/tests/seccomp_bpf_tests.c
++++ b/tests/seccomp_bpf_tests.c
+@@ -1457,7 +1457,7 @@ FIXTURE_TEARDOWN(TSYNC) {
+ 		if (!s->tid)
+ 			continue;
+ 		if (pthread_kill(s->tid, 0)) {
+-			pthread_cancel(s->tid);
++			//pthread_cancel(s->tid);  // ANDROID
+ 			pthread_join(s->tid, &status);
+ 		}
+ 	}
+@@ -1940,4 +1940,10 @@ TEST(syscall_restart) {
+  * - ...
+  */
+ 
++// ANDROID:begin
++struct __test_metadata* get_seccomp_test_list() {
++  return __test_list;
++}
++// ANDROID:end
++
+ TEST_HARNESS_MAIN
+diff --git a/tests/test_harness.h b/tests/test_harness.h
+index 47ee027..597e40c 100644
+--- a/tests/test_harness.h
++++ b/tests/test_harness.h
+@@ -49,6 +49,8 @@
+ #include <sys/wait.h>
+ #include <unistd.h>
+ 
++#include <android/log.h>  // ANDROID
++
+ /* All exported functionality should be declared through this macro. */
+ #define TEST_API(x) _##x
+ 
+@@ -206,9 +208,11 @@
+ } while (0)
+ 
+ /* Unconditional logger for internal use. */
++// ANDROID:begin
+ #define __TH_LOG(fmt, ...) \
+-    fprintf(TH_LOG_STREAM, "%s:%d:%s:" fmt "\n", \
++    __android_log_print(ANDROID_LOG_ERROR, "SeccompBpfTest-KernelUnit", "%s:%d:%s:" fmt "\n", \
+             __FILE__, __LINE__, _metadata->name, ##__VA_ARGS__)
++// ANDROID:end
+ 
+ /* Defines the test function and creates the registration stub. */
+ #define _TEST(test_name) __TEST_IMPL(test_name, -1)
+@@ -292,7 +296,7 @@
+     if (!__constructor_order) \
+       __constructor_order = _CONSTRUCTOR_ORDER_BACKWARD; \
+   } \
+-  int main(int argc, char **argv) { return test_harness_run(argc, argv); }
++  int seccomp_test_main(int argc, char **argv) { return test_harness_run(argc, argv); }  // ANDROID
+ 
+ #define _ASSERT_EQ(_expected, _seen) \
+   __EXPECT(_expected, _seen, ==, 1)
diff --git a/tests/tests/os/jni/seccomp-tests/tests/.gitignore b/tests/tests/os/jni/seccomp-tests/tests/.gitignore
new file mode 100644
index 0000000..cdfc7c6
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/tests/.gitignore
@@ -0,0 +1,3 @@
+sigsegv
+resumption
+seccomp_bpf_tests
diff --git a/tests/tests/os/jni/seccomp-tests/tests/Makefile b/tests/tests/os/jni/seccomp-tests/tests/Makefile
new file mode 100644
index 0000000..88994b3
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/tests/Makefile
@@ -0,0 +1,23 @@
+CFLAGS += -Wall
+EXEC=resumption seccomp_bpf_tests sigsegv
+
+all: $(EXEC)
+
+clean:
+	rm -f $(EXEC)
+
+seccomp_bpf_tests: seccomp_bpf_tests.c test_harness.h
+	$(CC) seccomp_bpf_tests.c -o seccomp_bpf_tests $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -pthread
+
+resumption: resumption.c test_harness.h
+	$(CC) $^ -o $@ $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -ggdb3
+
+sigsegv: sigsegv.c test_harness.h
+	$(CC) $^ -o $@ $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -ggdb3
+
+run_tests: $(EXEC)
+	./seccomp_bpf_tests
+	./resumption
+	./sigsegv
+
+.PHONY: clean run_tests
diff --git a/tests/tests/os/jni/seccomp-tests/tests/resumption.c b/tests/tests/os/jni/seccomp-tests/tests/resumption.c
new file mode 100644
index 0000000..41795c0
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/tests/resumption.c
@@ -0,0 +1,217 @@
+/* seccomp_bpf_tests.c
+ * Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * Test code for seccomp bpf.
+ */
+
+#include <asm/siginfo.h>
+#define __have_siginfo_t 1
+#define __have_sigval_t 1
+#define __have_sigevent_t 1
+
+#include <linux/filter.h>
+#include <sys/prctl.h>
+#include <linux/prctl.h>
+#include <linux/seccomp.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <string.h>
+#include <syscall.h>
+#define __USE_GNU 1
+#include <sys/ucontext.h>
+#include <sys/mman.h>
+
+#include "test_harness.h"
+
+#ifndef PR_SET_NO_NEW_PRIVS
+#define PR_SET_NO_NEW_PRIVS 38
+#define PR_GET_NO_NEW_PRIVS 39
+#endif
+
+#if defined(__i386__)
+#define REG_IP	REG_EIP
+#define REG_SP	REG_ESP
+#define REG_RESULT	REG_EAX
+#define REG_SYSCALL	REG_EAX
+#define REG_ARG0	REG_EBX
+#define REG_ARG1	REG_ECX
+#define REG_ARG2	REG_EDX
+#define REG_ARG3	REG_ESI
+#define REG_ARG4	REG_EDI
+#define REG_ARG5	REG_EBP
+#elif defined(__x86_64__)
+#define REG_IP	REG_RIP
+#define REG_SP	REG_RSP
+#define REG_RESULT	REG_RAX
+#define REG_SYSCALL	REG_RAX
+#define REG_ARG0	REG_RDI
+#define REG_ARG1	REG_RSI
+#define REG_ARG2	REG_RDX
+#define REG_ARG3	REG_R10
+#define REG_ARG4	REG_R8
+#define REG_ARG5	REG_R9
+#endif
+
+FIXTURE_DATA(TRAP) {
+	struct sock_fprog prog;
+};
+
+/* XXX: will need one per arch, etc.
+ *      thankfully _arch can tell us the calling convention!
+ */
+extern void *thunk_ip;	/* label for the instruction _after_ syscall */
+static void syscall_thunk(void)
+{
+	asm("syscall; thunk_ip:");
+}
+
+static time_t vsyscall_time(time_t *p)
+{
+	register time_t t asm ("rax");
+	__attribute__((unused)) register time_t *p1 asm ("rdi") = p;
+	__asm__("call 0xffffffffff600400 \n");
+	return t;
+}
+
+
+#if 0
+/* For instance, we could jump here instead. */
+static void compat_thunk(void)
+{
+	asm("int 0x80");
+}
+#endif
+
+FIXTURE_SETUP(TRAP) {
+	/* instruction after the syscall. Will be arch specific, of course. */
+	unsigned long thunk_addr = (unsigned long)&thunk_ip;
+	TH_LOG("Thunk: 0x%lX\n", thunk_addr);
+	{
+		struct sock_filter filter[] = {
+			BPF_STMT(BPF_LD+BPF_W+BPF_ABS,
+				offsetof(struct seccomp_data, nr)),
+			/* Whitelist anything you might need in the sigaction */
+#ifdef __NR_sigreturn
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_sigreturn, 3, 0),
+#endif
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_exit, 2, 0),
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_rt_sigreturn, 1, 0),
+			/* Allow __NR_write so easy logging. */
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_write, 0, 1),
+			BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW),
+			/* Check if we're within the thunk. */
+			BPF_STMT(BPF_LD+BPF_W+BPF_ABS,
+				offsetof(struct seccomp_data, instruction_pointer)),
+			/* XXX: make this 32-bit friendly. */
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ((__u32*)&thunk_addr)[0], 0, 3),
+			BPF_STMT(BPF_LD+BPF_W+BPF_ABS,
+				offsetof(struct seccomp_data, instruction_pointer)+sizeof(int)),
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ((__u32*)&thunk_addr)[1], 0, 1),
+			BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW),
+			BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_TRAP),
+		};
+		memset(&self->prog, 0, sizeof(self->prog));
+		self->prog.filter = malloc(sizeof(filter));
+		ASSERT_NE(NULL, self->prog.filter);
+		memcpy(self->prog.filter, filter, sizeof(filter));
+		self->prog.len = (unsigned short)(sizeof(filter)/sizeof(filter[0]));
+	}
+}
+
+FIXTURE_TEARDOWN(TRAP) {
+	if (self->prog.filter)
+		free(self->prog.filter);
+};
+
+struct arch_sigsys {
+		void *_call_addr; /* calling user insn */
+		int _syscall;	/* triggering system call number */
+		unsigned int _arch;	/* AUDIT_ARCH_* of syscall */
+};
+
+static void TRAP_action(int nr, siginfo_t *info, void *void_context)
+{
+	ucontext_t *ctx = (ucontext_t *)void_context;
+	char buf[256];
+	int len;
+	int do_ret = 1;
+	struct arch_sigsys *sys = (struct arch_sigsys *)
+#ifdef si_syscall
+		&(info->si_call_addr);
+#else
+		&(info->si_pid);
+#endif
+
+	if (info->si_code != SYS_SECCOMP)
+		return;
+	if (!ctx)
+		return;
+	len = snprintf(buf, sizeof(buf),
+			"@0x%lX:%X:%d:0x%lX:0x%lX:0x%lX:0x%lX:0x%lX:0x%lX\n",
+			(unsigned long)sys->_call_addr,
+			sys->_arch,
+			sys->_syscall,
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG0],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG1],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG2],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG3],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG4],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG5]);
+	/* Send the soft-fail to our "listener" */
+	syscall(__NR_write, STDOUT_FILENO, buf, len);
+	if (ctx->uc_mcontext.gregs[REG_IP] >= 0xffffffffff600000ULL &&
+	    ctx->uc_mcontext.gregs[REG_IP] < 0xffffffffff601000ULL)
+		do_ret = 0;
+	if (do_ret) {
+		/* push [REG_IP] */
+		ctx->uc_mcontext.gregs[REG_SP] -= sizeof(unsigned long);
+		*((unsigned long *)ctx->uc_mcontext.gregs[REG_SP]) =
+		    ctx->uc_mcontext.gregs[REG_IP];
+	}
+	/* jmp syscall_thunk */
+	ctx->uc_mcontext.gregs[REG_IP] = (unsigned long)syscall_thunk;
+	return;
+}
+
+TEST_F(TRAP, handler) {
+	int ret;
+	struct sigaction act;
+	pid_t pid;
+	sigset_t mask;
+	memset(&act, 0, sizeof(act));
+	sigemptyset(&mask);
+	sigaddset(&mask, SIGSYS);
+
+	act.sa_sigaction = &TRAP_action;
+	act.sa_flags = SA_SIGINFO;
+	ret = sigaction(SIGSYS, &act, NULL);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("sigaction failed");
+	}
+	ret = sigprocmask(SIG_UNBLOCK, &mask, NULL);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("sigprocmask failed");
+	}
+
+	/* Get the pid to compare against. */
+	pid = getpid();
+
+	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog);
+	ASSERT_EQ(0, ret);
+
+	/* Call anything! */
+	ret = syscall(__NR_getpid);
+	ASSERT_EQ(pid, ret);
+	ret = syscall(__NR_close, 0);
+	ASSERT_EQ(0, ret);
+	ret = syscall(__NR_close, 0);
+	ASSERT_EQ(-1, ret);
+	printf("The time is %ld\n", vsyscall_time(NULL));
+	ASSERT_LT(0, vsyscall_time(NULL));
+}
+
+TEST_HARNESS_MAIN
diff --git a/tests/tests/os/jni/seccomp-tests/tests/seccomp_bpf_tests.c b/tests/tests/os/jni/seccomp-tests/tests/seccomp_bpf_tests.c
new file mode 100644
index 0000000..98b0231
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/tests/seccomp_bpf_tests.c
@@ -0,0 +1,1949 @@
+/* seccomp_bpf_tests.c
+ * Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * Test code for seccomp bpf.
+ */
+
+#include <asm/siginfo.h>
+#define __have_siginfo_t 1
+#define __have_sigval_t 1
+#define __have_sigevent_t 1
+
+#include <errno.h>
+#include <linux/filter.h>
+#include <sys/prctl.h>
+#include <sys/ptrace.h>
+#include <sys/user.h>
+#include <linux/prctl.h>
+#include <linux/ptrace.h>
+#include <linux/seccomp.h>
+#include <poll.h>
+#include <pthread.h>
+#include <semaphore.h>
+#include <signal.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <string.h>
+#include <linux/elf.h>
+#include <sys/uio.h>
+
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <sys/syscall.h>
+
+#include "test_harness.h"
+
+#ifndef PR_SET_PTRACER
+# define PR_SET_PTRACER 0x59616d61
+#endif
+
+#ifndef PR_SET_NO_NEW_PRIVS
+#define PR_SET_NO_NEW_PRIVS 38
+#define PR_GET_NO_NEW_PRIVS 39
+#endif
+
+#ifndef PR_SECCOMP_EXT
+#define PR_SECCOMP_EXT 43
+#endif
+
+#ifndef SECCOMP_EXT_ACT
+#define SECCOMP_EXT_ACT 1
+#endif
+
+#ifndef SECCOMP_EXT_ACT_TSYNC
+#define SECCOMP_EXT_ACT_TSYNC 1
+#endif
+
+#ifndef SECCOMP_MODE_STRICT
+#define SECCOMP_MODE_STRICT 1
+#endif
+
+#ifndef SECCOMP_MODE_FILTER
+#define SECCOMP_MODE_FILTER 2
+#endif
+
+#ifndef SECCOMP_RET_KILL
+#define SECCOMP_RET_KILL        0x00000000U // kill the task immediately
+#define SECCOMP_RET_TRAP        0x00030000U // disallow and force a SIGSYS
+#define SECCOMP_RET_ERRNO       0x00050000U // returns an errno
+#define SECCOMP_RET_TRACE       0x7ff00000U // pass to a tracer or disallow
+#define SECCOMP_RET_ALLOW       0x7fff0000U // allow
+
+/* Masks for the return value sections. */
+#define SECCOMP_RET_ACTION      0x7fff0000U
+#define SECCOMP_RET_DATA        0x0000ffffU
+
+struct seccomp_data {
+	int nr;
+	__u32 arch;
+	__u64 instruction_pointer;
+	__u64 args[6];
+};
+#endif
+
+#define syscall_arg(_n) (offsetof(struct seccomp_data, args[_n]))
+
+#define SIBLING_EXIT_UNKILLED	0xbadbeef
+#define SIBLING_EXIT_FAILURE	0xbadface
+#define SIBLING_EXIT_NEWPRIVS	0xbadfeed
+
+TEST(mode_strict_support) {
+	long ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, NULL, NULL, NULL);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Kernel does not support CONFIG_SECCOMP");
+	}
+	syscall(__NR_exit, 1);
+}
+
+TEST_SIGNAL(mode_strict_cannot_call_prctl, SIGKILL) {
+	long ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, NULL, NULL, NULL);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Kernel does not support CONFIG_SECCOMP");
+	}
+	syscall(__NR_prctl, PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL, NULL, NULL);
+	EXPECT_FALSE(true) {
+		TH_LOG("Unreachable!");
+	}
+}
+
+/* Note! This doesn't test no new privs behavior */
+TEST(no_new_privs_support) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	EXPECT_EQ(0, ret) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+}
+
+/* Tests kernel support by checking for a copy_from_user() fault on * NULL. */
+TEST(mode_filter_support) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, NULL, 0, 0);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL, NULL, NULL);
+	EXPECT_EQ(-1, ret);
+	EXPECT_EQ(EFAULT, errno) {
+		TH_LOG("Kernel does not support CONFIG_SECCOMP_FILTER!");
+	}
+}
+
+TEST(mode_filter_without_nnp) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_GET_NO_NEW_PRIVS, 0, NULL, 0, 0);
+	ASSERT_LE(0, ret) {
+		TH_LOG("Expected 0 or unsupported for NO_NEW_PRIVS");
+	}
+	errno = 0;
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
+	/* Succeeds with CAP_SYS_ADMIN, fails without */
+	/* TODO(wad) check caps not euid */
+	if (geteuid()) {
+		EXPECT_EQ(-1, ret);
+		EXPECT_EQ(EACCES, errno);
+	} else {
+		EXPECT_EQ(0, ret);
+	}
+}
+
+#define MAX_INSNS_PER_PATH 32768
+
+TEST(filter_size_limits) {
+	int i;
+	int count = BPF_MAXINSNS + 1;
+	struct sock_filter allow[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_filter *filter;
+	struct sock_fprog prog = { };
+
+	filter = calloc(count, sizeof(*filter));
+	ASSERT_NE(NULL, filter);
+
+	for (i = 0; i < count; i++) {
+		filter[i] = allow[0];
+	}
+
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	prog.filter = filter;
+	prog.len = count;
+
+	/* Too many filter instructions in a single filter. */
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
+	ASSERT_NE(0, ret) {
+		TH_LOG("Installing %d insn filter was allowed", prog.len);
+	}
+
+	/* One less is okay, though. */
+	prog.len -= 1;
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Installing %d insn filter wasn't allowed", prog.len);
+	}
+}
+
+TEST(filter_chain_limits) {
+	int i;
+	int count = BPF_MAXINSNS;
+	struct sock_filter allow[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_filter *filter;
+	struct sock_fprog prog = { };
+
+	filter = calloc(count, sizeof(*filter));
+	ASSERT_NE(NULL, filter);
+
+	for (i = 0; i < count; i++) {
+		filter[i] = allow[0];
+	}
+
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	prog.filter = filter;
+	prog.len = 1;
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	prog.len = count;
+
+	/* Too many total filter instructions. */
+	for (i = 0; i < MAX_INSNS_PER_PATH; i++) {
+		ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
+		if (ret != 0)
+			break;
+	}
+	ASSERT_NE(0, ret) {
+		TH_LOG("Allowed %d %d-insn filters (total with penalties:%d)",
+		       i, count, i * (count + 4));
+	}
+}
+
+TEST(mode_filter_cannot_move_to_strict) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, NULL, 0, 0);
+	EXPECT_EQ(-1, ret);
+	EXPECT_EQ(EINVAL, errno);
+}
+
+
+TEST(mode_filter_get_seccomp) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_GET_SECCOMP, 0, 0, 0, 0);
+	EXPECT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_GET_SECCOMP, 0, 0, 0, 0);
+	EXPECT_EQ(2, ret);
+}
+
+
+TEST(ALLOW_all) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	ASSERT_EQ(0, ret);
+}
+
+TEST(empty_prog) {
+	struct sock_filter filter[] = {
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	EXPECT_EQ(-1, ret);
+	EXPECT_EQ(EINVAL, errno);
+}
+
+TEST_SIGNAL(unknown_ret_is_kill_inside, SIGSYS) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, 0x10000000U),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	ASSERT_EQ(0, ret);
+	EXPECT_EQ(0, syscall(__NR_getpid)) {
+		TH_LOG("getpid() shouldn't ever return");
+	}
+}
+
+/* return code >= 0x80000000 is unused. */
+TEST_SIGNAL(unknown_ret_is_kill_above_allow, SIGSYS) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, 0x90000000U),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	ASSERT_EQ(0, ret);
+	EXPECT_EQ(0, syscall(__NR_getpid)) {
+		TH_LOG("getpid() shouldn't ever return");
+	}
+}
+
+TEST_SIGNAL(KILL_all, SIGSYS) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	ASSERT_EQ(0, ret);
+}
+
+TEST_SIGNAL(KILL_one, SIGSYS) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	ASSERT_EQ(0, ret);
+
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	/* getpid() should never return. */
+	EXPECT_EQ(0, syscall(__NR_getpid));
+}
+
+TEST_SIGNAL(KILL_one_arg_one, SIGSYS) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+		/* Only both with lower 32-bit for now. */
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_arg(0)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 0x0C0FFEE, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	pid_t pid = getpid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	ASSERT_EQ(0, ret);
+
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	EXPECT_EQ(pid, syscall(__NR_getpid));
+	/* getpid() should never return. */
+	EXPECT_EQ(0, syscall(__NR_getpid, 0x0C0FFEE));
+}
+
+TEST_SIGNAL(KILL_one_arg_six, SIGSYS) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+		/* Only both with lower 32-bit for now. */
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_arg(5)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 0x0C0FFEE, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	pid_t pid = getpid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	ASSERT_EQ(0, ret);
+
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	EXPECT_EQ(pid, syscall(__NR_getpid));
+	/* getpid() should never return. */
+	EXPECT_EQ(0, syscall(__NR_getpid, 1, 2, 3, 4, 5, 0x0C0FFEE));
+}
+
+/* TODO(wad) add 64-bit versus 32-bit arg tests. */
+
+TEST(arg_out_of_range) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_arg(6)),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	EXPECT_EQ(-1, ret);
+	EXPECT_EQ(EINVAL, errno);
+}
+
+TEST(ERRNO_one) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | E2BIG),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	ASSERT_EQ(0, ret);
+
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	EXPECT_EQ(-1, read(0, NULL, 0));
+	EXPECT_EQ(E2BIG, errno);
+}
+
+TEST(ERRNO_one_ok) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | 0),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
+	ASSERT_EQ(0, ret);
+
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	/* "errno" of 0 is ok. */
+	EXPECT_EQ(0, read(0, NULL, 0));
+}
+
+FIXTURE_DATA(TRAP) {
+	struct sock_fprog prog;
+};
+
+FIXTURE_SETUP(TRAP) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRAP),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	memset(&self->prog, 0, sizeof(self->prog));
+	self->prog.filter = malloc(sizeof(filter));
+	ASSERT_NE(NULL, self->prog.filter);
+	memcpy(self->prog.filter, filter, sizeof(filter));
+	self->prog.len = (unsigned short)(sizeof(filter)/sizeof(filter[0]));
+}
+
+FIXTURE_TEARDOWN(TRAP) {
+	if (self->prog.filter)
+		free(self->prog.filter);
+};
+
+TEST_F_SIGNAL(TRAP, dfl, SIGSYS) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog);
+	ASSERT_EQ(0, ret);
+	syscall(__NR_getpid);
+}
+
+/* Ensure that SIGSYS overrides SIG_IGN */
+TEST_F_SIGNAL(TRAP, ign, SIGSYS) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	signal(SIGSYS, SIG_IGN);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog);
+	ASSERT_EQ(0, ret);
+	syscall(__NR_getpid);
+}
+
+static struct siginfo TRAP_info;
+static volatile int TRAP_nr;
+static void TRAP_action(int nr, siginfo_t *info, void *void_context)
+{
+	memcpy(&TRAP_info, info, sizeof(TRAP_info));
+	TRAP_nr = nr;
+	return;
+}
+
+TEST_F(TRAP, handler) {
+	int ret, test;
+	struct sigaction act;
+	sigset_t mask;
+	memset(&act, 0, sizeof(act));
+	sigemptyset(&mask);
+	sigaddset(&mask, SIGSYS);
+
+	act.sa_sigaction = &TRAP_action;
+	act.sa_flags = SA_SIGINFO;
+	ret = sigaction(SIGSYS, &act, NULL);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("sigaction failed");
+	}
+	ret = sigprocmask(SIG_UNBLOCK, &mask, NULL);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("sigprocmask failed");
+	}
+
+	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog);
+	ASSERT_EQ(0, ret);
+	TRAP_nr = 0;
+	memset(&TRAP_info, 0, sizeof(TRAP_info));
+	/* Expect the registers to be rolled back. (nr = error) may vary
+	 * based on arch. */
+	ret = syscall(__NR_getpid);
+	/* Silence gcc warning about volatile. */
+	test = TRAP_nr;
+	EXPECT_EQ(SIGSYS, test);
+	struct local_sigsys {
+			void *_call_addr; /* calling user insn */
+			int _syscall;	/* triggering system call number */
+			unsigned int _arch;	/* AUDIT_ARCH_* of syscall */
+	} *sigsys = (struct local_sigsys *)
+#ifdef si_syscall
+		&(TRAP_info.si_call_addr);
+#else
+		&TRAP_info.si_pid;
+#endif
+	EXPECT_EQ(__NR_getpid, sigsys->_syscall);
+	/* Make sure arch is non-zero. */
+	EXPECT_NE(0, sigsys->_arch);
+	EXPECT_NE(0, (unsigned long)sigsys->_call_addr);
+}
+
+FIXTURE_DATA(precedence) {
+	struct sock_fprog allow;
+	struct sock_fprog trace;
+	struct sock_fprog error;
+	struct sock_fprog trap;
+	struct sock_fprog kill;
+};
+
+FIXTURE_SETUP(precedence) {
+	struct sock_filter allow_insns[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_filter trace_insns[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE),
+	};
+	struct sock_filter error_insns[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO),
+	};
+	struct sock_filter trap_insns[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRAP),
+	};
+	struct sock_filter kill_insns[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
+	};
+	memset(self, 0, sizeof(*self));
+#define FILTER_ALLOC(_x) \
+	self->_x.filter = malloc(sizeof(_x##_insns)); \
+	ASSERT_NE(NULL, self->_x.filter); \
+	memcpy(self->_x.filter, &_x##_insns, sizeof(_x##_insns)); \
+	self->_x.len = (unsigned short)(sizeof(_x##_insns)/sizeof(_x##_insns[0]))
+	FILTER_ALLOC(allow);
+	FILTER_ALLOC(trace);
+	FILTER_ALLOC(error);
+	FILTER_ALLOC(trap);
+	FILTER_ALLOC(kill);
+}
+
+FIXTURE_TEARDOWN(precedence) {
+#define FILTER_FREE(_x) if (self->_x.filter) free(self->_x.filter)
+	FILTER_FREE(allow);
+	FILTER_FREE(trace);
+	FILTER_FREE(error);
+	FILTER_FREE(trap);
+	FILTER_FREE(kill);
+}
+
+TEST_F(precedence, allow_ok) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	pid_t res = 0;
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->kill);
+	ASSERT_EQ(0, ret);
+	/* Should work just fine. */
+	res = syscall(__NR_getppid);
+	EXPECT_EQ(parent, res);
+}
+
+TEST_F_SIGNAL(precedence, kill_is_highest, SIGSYS) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	pid_t res = 0;
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->kill);
+	ASSERT_EQ(0, ret);
+	/* Should work just fine. */
+	res = syscall(__NR_getppid);
+	EXPECT_EQ(parent, res);
+	/* getpid() should never return. */
+	res = syscall(__NR_getpid);
+	EXPECT_EQ(0, res);
+}
+
+TEST_F_SIGNAL(precedence, kill_is_highest_in_any_order, SIGSYS) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->kill);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
+	ASSERT_EQ(0, ret);
+	/* Should work just fine. */
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	/* getpid() should never return. */
+	EXPECT_EQ(0, syscall(__NR_getpid));
+}
+
+TEST_F_SIGNAL(precedence, trap_is_second, SIGSYS) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
+	ASSERT_EQ(0, ret);
+	/* Should work just fine. */
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	/* getpid() should never return. */
+	EXPECT_EQ(0, syscall(__NR_getpid));
+}
+
+TEST_F_SIGNAL(precedence, trap_is_second_in_any_order, SIGSYS) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
+	ASSERT_EQ(0, ret);
+	/* Should work just fine. */
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	/* getpid() should never return. */
+	EXPECT_EQ(0, syscall(__NR_getpid));
+}
+
+TEST_F(precedence, errno_is_third) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
+	ASSERT_EQ(0, ret);
+	/* Should work just fine. */
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	EXPECT_EQ(0, syscall(__NR_getpid));
+}
+
+TEST_F(precedence, errno_is_third_in_any_order) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+	ASSERT_EQ(0, ret);
+	/* Should work just fine. */
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	EXPECT_EQ(0, syscall(__NR_getpid));
+}
+
+TEST_F(precedence, trace_is_fourth) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
+	ASSERT_EQ(0, ret);
+	/* Should work just fine. */
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	/* No ptracer */
+	EXPECT_EQ(-1, syscall(__NR_getpid));
+}
+
+TEST_F(precedence, trace_is_fourth_in_any_order) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	pid_t parent = getppid();
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
+	ASSERT_EQ(0, ret);
+	/* Should work just fine. */
+	EXPECT_EQ(parent, syscall(__NR_getppid));
+	/* No ptracer */
+	EXPECT_EQ(-1, syscall(__NR_getpid));
+}
+
+#ifndef PTRACE_O_TRACESECCOMP
+#define PTRACE_O_TRACESECCOMP	0x00000080
+#endif
+
+/* Catch the Ubuntu 12.04 value error. */
+#if PTRACE_EVENT_SECCOMP != 7
+#undef PTRACE_EVENT_SECCOMP
+#endif
+
+#ifndef PTRACE_EVENT_SECCOMP
+#define PTRACE_EVENT_SECCOMP 7
+#endif
+
+#define IS_SECCOMP_EVENT(status) ((status >> 16) == PTRACE_EVENT_SECCOMP)
+bool tracer_running;
+void tracer_stop(int sig)
+{
+	tracer_running = false;
+}
+
+typedef void tracer_func_t(struct __test_metadata *_metadata,
+			   pid_t tracee, int status, void *args);
+
+void tracer(struct __test_metadata *_metadata, int fd, pid_t tracee,
+	    tracer_func_t tracer_func, void *args) {
+	int ret = -1;
+	struct sigaction action = {
+		.sa_handler = tracer_stop,
+	};
+
+	/* Allow external shutdown. */
+	tracer_running = true;
+	ASSERT_EQ(0, sigaction(SIGUSR1, &action, NULL));
+
+	errno = 0;
+	while (ret == -1 && errno != EINVAL) {
+		ret = ptrace(PTRACE_ATTACH, tracee, NULL, 0);
+	}
+	ASSERT_EQ(0, ret) {
+		kill(tracee, SIGKILL);
+	}
+	/* Wait for attach stop */
+	wait(NULL);
+
+	ret = ptrace(PTRACE_SETOPTIONS, tracee, NULL, PTRACE_O_TRACESECCOMP);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Failed to set PTRACE_O_TRACESECCOMP");
+		kill(tracee, SIGKILL);
+	}
+	ptrace(PTRACE_CONT, tracee, NULL, 0);
+
+	/* Unblock the tracee */
+	ASSERT_EQ(1, write(fd, "A", 1));
+	ASSERT_EQ(0, close(fd));
+
+	/* Run until we're shut down. Must assert to stop execution. */
+	while (tracer_running) {
+		int status;
+		if (wait(&status) != tracee)
+			continue;
+		if (WIFSIGNALED(status) || WIFEXITED(status))
+			/* Child is dead. Time to go. */
+			return;
+
+		/* Make sure this is a seccomp event. */
+		ASSERT_EQ(true, IS_SECCOMP_EVENT(status));
+
+		tracer_func(_metadata, tracee, status, args);
+
+		ret = ptrace(PTRACE_CONT, tracee, NULL, NULL);
+		ASSERT_EQ(0, ret);
+	}
+	/* Directly report the status of our test harness results. */
+	syscall(__NR_exit, _metadata->passed ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+
+/* Common tracer setup/teardown functions. */
+void cont_handler(int num) {
+}
+pid_t setup_trace_fixture(struct __test_metadata *_metadata,
+			  tracer_func_t func, void *args) {
+	char sync;
+	int pipefd[2];
+	pid_t tracer_pid;
+	pid_t tracee = getpid();
+
+	/* Setup a pipe for clean synchronization. */
+	ASSERT_EQ(0, pipe(pipefd));
+
+	/* Fork a child which we'll promote to tracer */
+	tracer_pid = fork();
+	ASSERT_LE(0, tracer_pid);
+	signal(SIGALRM, cont_handler);
+	if (tracer_pid == 0) {
+		close(pipefd[0]);
+		tracer(_metadata, pipefd[1], tracee, func, args);
+		syscall(__NR_exit, 0);
+	}
+	close(pipefd[1]);
+	prctl(PR_SET_PTRACER, tracer_pid, 0, 0, 0);
+	read(pipefd[0], &sync, 1);
+	close(pipefd[0]);
+
+	return tracer_pid;
+}
+void teardown_trace_fixture(struct __test_metadata *_metadata,
+			    pid_t tracer) {
+	if (tracer) {
+		int status;
+		/*
+		 * Extract the exit code from the other process and
+		 * adopt it for ourselves in case its asserts failed.
+		 */
+		ASSERT_EQ(0, kill(tracer, SIGUSR1));
+		ASSERT_EQ(tracer, waitpid(tracer, &status, 0));
+		if (WEXITSTATUS(status))
+			_metadata->passed = 0;
+	}
+}
+
+/* "poke" tracer arguments and function. */
+struct tracer_args_poke_t {
+	unsigned long poke_addr;
+};
+
+void tracer_poke(struct __test_metadata *_metadata, pid_t tracee, int status,
+		 void *args) {
+	int ret;
+	unsigned long msg;
+	struct tracer_args_poke_t *info = (struct tracer_args_poke_t *)args;
+
+	ret = ptrace(PTRACE_GETEVENTMSG, tracee, NULL, &msg);
+	EXPECT_EQ(0, ret);
+	/* If this fails, don't try to recover. */
+	ASSERT_EQ(0x1001, msg) {
+		kill(tracee, SIGKILL);
+	}
+	/*
+	 * Poke in the message.
+	 * Registers are not touched to try to keep this relatively arch
+	 * agnostic.
+	 */
+	ret = ptrace(PTRACE_POKEDATA, tracee, info->poke_addr, 0x1001);
+	EXPECT_EQ(0, ret);
+}
+
+FIXTURE_DATA(TRACE_poke) {
+	struct sock_fprog prog;
+	pid_t tracer;
+	long poked;
+	struct tracer_args_poke_t tracer_args;
+};
+
+FIXTURE_SETUP(TRACE_poke) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1001),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+
+	self->poked = 0;
+	memset(&self->prog, 0, sizeof(self->prog));
+	self->prog.filter = malloc(sizeof(filter));
+	ASSERT_NE(NULL, self->prog.filter);
+	memcpy(self->prog.filter, filter, sizeof(filter));
+	self->prog.len = (unsigned short)(sizeof(filter)/sizeof(filter[0]));
+
+	/* Set up tracer args. */
+	self->tracer_args.poke_addr = (unsigned long)&self->poked;
+
+	/* Launch tracer. */
+	self->tracer = setup_trace_fixture(_metadata, tracer_poke,
+					   &self->tracer_args);
+}
+
+FIXTURE_TEARDOWN(TRACE_poke) {
+	teardown_trace_fixture(_metadata, self->tracer);
+	if (self->prog.filter)
+		free(self->prog.filter);
+};
+
+TEST_F(TRACE_poke, read_has_side_effects) {
+	ssize_t ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	EXPECT_EQ(0, self->poked);
+	ret = read(-1, NULL, 0);
+	EXPECT_EQ(-1, ret);
+	EXPECT_EQ(0x1001, self->poked);
+}
+
+TEST_F(TRACE_poke, getpid_runs_normally) {
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	EXPECT_EQ(0, self->poked);
+	EXPECT_NE(0, syscall(__NR_getpid));
+	EXPECT_EQ(0, self->poked);
+}
+
+#if defined(__x86_64__)
+# define ARCH_REGS	struct user_regs_struct
+# define SYSCALL_NUM	orig_rax
+# define SYSCALL_RET	rax
+#elif defined(__i386__)
+# define ARCH_REGS	struct user_regs_struct
+# define SYSCALL_NUM	orig_eax
+# define SYSCALL_RET	eax
+#elif defined(__arm__)
+# define ARCH_REGS	struct pt_regs
+# define SYSCALL_NUM	ARM_r7
+# define SYSCALL_RET	ARM_r0
+#elif defined(__aarch64__)
+# define ARCH_REGS	struct user_pt_regs
+# define SYSCALL_NUM	regs[8]
+# define SYSCALL_RET	regs[0]
+#else
+# error "Do not know how to find your architecture's registers and syscalls"
+#endif
+
+/* Architecture-specific syscall fetching routine. */
+int get_syscall(struct __test_metadata *_metadata, pid_t tracee) {
+	struct iovec iov;
+	ARCH_REGS regs;
+
+	iov.iov_base = &regs;
+	iov.iov_len = sizeof(regs);
+	EXPECT_EQ(0, ptrace(PTRACE_GETREGSET, tracee, NT_PRSTATUS, &iov)) {
+		TH_LOG("PTRACE_GETREGSET failed");
+		return -1;
+	}
+
+	return regs.SYSCALL_NUM;
+}
+
+/* Architecture-specific syscall changing routine. */
+void change_syscall(struct __test_metadata *_metadata,
+		    pid_t tracee, int syscall) {
+	struct iovec iov;
+	int ret;
+	ARCH_REGS regs;
+
+	iov.iov_base = &regs;
+	iov.iov_len = sizeof(regs);
+	ret = ptrace(PTRACE_GETREGSET, tracee, NT_PRSTATUS, &iov);
+	EXPECT_EQ(0, ret);
+
+#if defined(__x86_64__) || defined(__i386__) || defined(__aarch64__)
+	{
+		regs.SYSCALL_NUM = syscall;
+	}
+
+#elif defined(__arm__)
+# ifndef PTRACE_SET_SYSCALL
+#  define PTRACE_SET_SYSCALL   23
+# endif
+	{
+		ret = ptrace(PTRACE_SET_SYSCALL, tracee, NULL, syscall);
+		EXPECT_EQ(0, ret);
+	}
+
+#else
+	ASSERT_EQ(1, 0) {
+		TH_LOG("How is the syscall changed on this architecture?");
+	}
+#endif
+
+	/* If syscall is skipped, change return value. */
+	if (syscall == -1)
+		regs.SYSCALL_RET = 1;
+
+	ret = ptrace(PTRACE_SETREGSET, tracee, NT_PRSTATUS, &iov);
+	EXPECT_EQ(0, ret);
+}
+
+void tracer_syscall(struct __test_metadata *_metadata, pid_t tracee,
+		    int status, void *args) {
+	int ret;
+	unsigned long msg;
+
+	/* Make sure we got the right message. */
+	ret = ptrace(PTRACE_GETEVENTMSG, tracee, NULL, &msg);
+	EXPECT_EQ(0, ret);
+
+	switch (msg) {
+	case 0x1002:
+		/* change getpid to getppid. */
+		change_syscall(_metadata, tracee, __NR_getppid);
+		break;
+	case 0x1003:
+		/* skip gettid. */
+		change_syscall(_metadata, tracee, -1);
+		break;
+	case 0x1004:
+		/* do nothing (allow getppid) */
+		break;
+	default:
+		EXPECT_EQ(0, msg) {
+			TH_LOG("Unknown PTRACE_GETEVENTMSG: 0x%lx", msg);
+			kill(tracee, SIGKILL);
+		}
+	}
+
+}
+
+FIXTURE_DATA(TRACE_syscall) {
+	struct sock_fprog prog;
+	pid_t tracer, mytid, mypid, parent;
+};
+
+FIXTURE_SETUP(TRACE_syscall) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1002),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_gettid, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1003),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getppid, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1004),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+
+	memset(&self->prog, 0, sizeof(self->prog));
+	self->prog.filter = malloc(sizeof(filter));
+	ASSERT_NE(NULL, self->prog.filter);
+	memcpy(self->prog.filter, filter, sizeof(filter));
+	self->prog.len = (unsigned short)(sizeof(filter)/sizeof(filter[0]));
+
+	/* Prepare some testable syscall results. */
+	self->mytid = syscall(__NR_gettid);
+	ASSERT_GT(self->mytid, 0);
+	ASSERT_NE(self->mytid, 1) {
+		TH_LOG("Running this test as init is not supported. :)");
+	}
+
+	self->mypid = getpid();
+	ASSERT_GT(self->mypid, 0);
+	ASSERT_EQ(self->mytid, self->mypid);
+
+	self->parent = getppid();
+	ASSERT_GT(self->parent, 0);
+	ASSERT_NE(self->parent, self->mypid);
+
+	/* Launch tracer. */
+	self->tracer = setup_trace_fixture(_metadata, tracer_syscall, NULL);
+}
+
+FIXTURE_TEARDOWN(TRACE_syscall) {
+	teardown_trace_fixture(_metadata, self->tracer);
+	if (self->prog.filter)
+		free(self->prog.filter);
+};
+
+TEST_F(TRACE_syscall, syscall_allowed) {
+	long ret;
+
+	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	/* getppid works as expected (no changes). */
+	EXPECT_EQ(self->parent, syscall(__NR_getppid));
+	EXPECT_NE(self->mypid, syscall(__NR_getppid));
+}
+
+TEST_F(TRACE_syscall, syscall_redirected) {
+	long ret;
+
+	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	/* getpid has been redirected to getppid as expected. */
+	EXPECT_EQ(self->parent, syscall(__NR_getpid));
+	EXPECT_NE(self->mypid, syscall(__NR_getpid));
+}
+
+TEST_F(TRACE_syscall, syscall_dropped) {
+	long ret;
+
+	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
+	ASSERT_EQ(0, ret);
+
+	/* gettid has been skipped and an altered return value stored. */
+	EXPECT_EQ(1, syscall(__NR_gettid));
+	EXPECT_NE(self->mytid, syscall(__NR_gettid));
+}
+
+#ifndef __NR_seccomp
+# if defined(__i386__)
+#  define __NR_seccomp 354
+# elif defined(__x86_64__)
+#  define __NR_seccomp 317
+# elif defined(__arm__)
+#  define __NR_seccomp 383
+# elif defined(__aarch64__)
+#  define __NR_seccomp 277
+# else
+#  warning "seccomp syscall number unknown for this architecture"
+#  define __NR_seccomp 0xffff
+# endif
+#endif
+
+#ifndef SECCOMP_SET_MODE_STRICT
+#define SECCOMP_SET_MODE_STRICT 0
+#endif
+
+#ifndef SECCOMP_SET_MODE_FILTER
+#define SECCOMP_SET_MODE_FILTER 1
+#endif
+
+#ifndef SECCOMP_FLAG_FILTER_TSYNC
+#define SECCOMP_FLAG_FILTER_TSYNC 1
+#endif
+
+#ifndef seccomp
+int seccomp(unsigned int op, unsigned int flags, struct sock_fprog *filter)
+{
+	errno = 0;
+	return syscall(__NR_seccomp, op, flags, filter);
+}
+#endif
+
+TEST(seccomp_syscall) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+
+	/* Reject insane operation. */
+	ret = seccomp(-1, 0, &prog);
+	EXPECT_EQ(EINVAL, errno) {
+		TH_LOG("Did not reject crazy op value!");
+	}
+
+	/* Reject strict with flags or pointer. */
+	ret = seccomp(SECCOMP_SET_MODE_STRICT, -1, NULL);
+	EXPECT_EQ(EINVAL, errno) {
+		TH_LOG("Did not reject mode strict with flags!");
+	}
+	ret = seccomp(SECCOMP_SET_MODE_STRICT, 0, &prog);
+	EXPECT_EQ(EINVAL, errno) {
+		TH_LOG("Did not reject mode strict with uargs!");
+	}
+
+	/* Reject insane args for filter. */
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, -1, &prog);
+	EXPECT_EQ(EINVAL, errno) {
+		TH_LOG("Did not reject crazy filter flags!");
+	}
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, NULL);
+	EXPECT_EQ(EFAULT, errno) {
+		TH_LOG("Did not reject NULL filter!");
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog);
+	EXPECT_EQ(0, errno) {
+		TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER: %s",
+			strerror(errno));
+	}
+}
+
+TEST(seccomp_syscall_mode_lock) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, NULL, 0, 0);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog);
+	EXPECT_EQ(0, ret) {
+		TH_LOG("Could not install filter!");
+	}
+
+	/* Make sure neither entry point will switch to strict. */
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, 0, 0, 0);
+	EXPECT_EQ(EINVAL, errno) {
+		TH_LOG("Switched to mode strict!");
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_STRICT, 0, NULL);
+	EXPECT_EQ(EINVAL, errno) {
+		TH_LOG("Switched to mode strict!");
+	}
+}
+
+TEST(TSYNC_first) {
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+	long ret = prctl(PR_SET_NO_NEW_PRIVS, 1, NULL, 0, 0);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC,
+		      &prog);
+	EXPECT_EQ(0, ret) {
+		TH_LOG("Could not install initial filter with TSYNC!");
+	}
+}
+
+#define TSYNC_SIBLINGS 2
+struct tsync_sibling {
+	pthread_t tid;
+	pid_t system_tid;
+	sem_t *started;
+	pthread_cond_t *cond;
+	pthread_mutex_t *mutex;
+	int diverge;
+	int num_waits;
+	struct sock_fprog *prog;
+	struct __test_metadata *metadata;
+};
+
+FIXTURE_DATA(TSYNC) {
+	struct sock_fprog root_prog, apply_prog;
+	struct tsync_sibling sibling[TSYNC_SIBLINGS];
+	sem_t started;
+	pthread_cond_t cond;
+	pthread_mutex_t mutex;
+	int sibling_count;
+};
+
+FIXTURE_SETUP(TSYNC) {
+	struct sock_filter root_filter[] = {
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_filter apply_filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	memset(&self->root_prog, 0, sizeof(self->root_prog));
+	memset(&self->apply_prog, 0, sizeof(self->apply_prog));
+	memset(&self->sibling, 0, sizeof(self->sibling));
+	self->root_prog.filter = malloc(sizeof(root_filter));
+	ASSERT_NE(NULL, self->root_prog.filter);
+	memcpy(self->root_prog.filter, &root_filter, sizeof(root_filter));
+	self->root_prog.len = (unsigned short)(sizeof(root_filter)/sizeof(root_filter[0]));
+
+	self->apply_prog.filter = malloc(sizeof(apply_filter));
+	ASSERT_NE(NULL, self->apply_prog.filter);
+	memcpy(self->apply_prog.filter, &apply_filter, sizeof(apply_filter));
+	self->apply_prog.len = (unsigned short)(sizeof(apply_filter)/sizeof(apply_filter[0]));
+
+	self->sibling_count = 0;
+	pthread_mutex_init(&self->mutex, NULL);
+	pthread_cond_init(&self->cond, NULL);
+	sem_init(&self->started, 0, 0);
+	self->sibling[0].tid = 0;
+	self->sibling[0].cond = &self->cond;
+	self->sibling[0].started = &self->started;
+	self->sibling[0].mutex = &self->mutex;
+	self->sibling[0].diverge = 0;
+	self->sibling[0].num_waits = 1;
+	self->sibling[0].prog = &self->root_prog;
+	self->sibling[0].metadata = _metadata;
+	self->sibling[1].tid = 0;
+	self->sibling[1].cond = &self->cond;
+	self->sibling[1].started = &self->started;
+	self->sibling[1].mutex = &self->mutex;
+	self->sibling[1].diverge = 0;
+	self->sibling[1].prog = &self->root_prog;
+	self->sibling[1].num_waits = 1;
+	self->sibling[1].metadata = _metadata;
+}
+
+FIXTURE_TEARDOWN(TSYNC) {
+	int sib = 0;
+	if (self->root_prog.filter)
+		free(self->root_prog.filter);
+	if (self->apply_prog.filter)
+		free(self->apply_prog.filter);
+
+	for ( ; sib < self->sibling_count; ++sib) {
+		struct tsync_sibling *s = &self->sibling[sib];
+		void *status;
+		if (!s->tid)
+			continue;
+		if (pthread_kill(s->tid, 0)) {
+			//pthread_cancel(s->tid);  // ANDROID
+			pthread_join(s->tid, &status);
+		}
+	}
+	pthread_mutex_destroy(&self->mutex);
+	pthread_cond_destroy(&self->cond);
+	sem_destroy(&self->started);
+};
+
+void *tsync_sibling(void *data)
+{
+	long ret = 0;
+	struct tsync_sibling *me = data;
+	me->system_tid = syscall(__NR_gettid);
+
+	pthread_mutex_lock(me->mutex);
+	if (me->diverge) {
+		/* Just re-apply the root prog to fork the tree */
+		ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER,
+				me->prog, 0, 0);
+	}
+	sem_post(me->started);
+	/* Return outside of started so parent notices failures. */
+	if (ret) {
+		pthread_mutex_unlock(me->mutex);
+		return (void *)SIBLING_EXIT_FAILURE;
+	}
+	do {
+		pthread_cond_wait(me->cond, me->mutex);
+		me->num_waits = me->num_waits - 1;
+	}
+	while (me->num_waits);
+	pthread_mutex_unlock(me->mutex);
+	long nnp = prctl(PR_GET_NO_NEW_PRIVS, 0, 0, 0, 0);
+	if (!nnp)
+		return (void*)SIBLING_EXIT_NEWPRIVS;
+	read(0, NULL, 0);
+	return (void *)SIBLING_EXIT_UNKILLED;
+}
+
+void tsync_start_sibling(struct tsync_sibling *sibling)
+{
+	pthread_create(&sibling->tid, NULL, tsync_sibling, (void *)sibling);
+}
+
+TEST_F(TSYNC, siblings_fail_prctl) {
+	long ret;
+	void *status;
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			offsetof(struct seccomp_data, nr)),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_prctl, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | EINVAL),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+
+	ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+
+	/* Check prctl failure detection by requesting sib 0 diverge. */
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("setting filter failed");
+	}
+
+	self->sibling[0].diverge = 1;
+	tsync_start_sibling(&self->sibling[0]);
+	tsync_start_sibling(&self->sibling[1]);
+
+	while (self->sibling_count < TSYNC_SIBLINGS) {
+		sem_wait(&self->started);
+		self->sibling_count++;
+	}
+
+	/* Signal the threads to clean up*/
+	pthread_mutex_lock(&self->mutex);
+	ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
+		TH_LOG("cond broadcast non-zero");
+	}
+	pthread_mutex_unlock(&self->mutex);
+
+	/* Ensure diverging sibling failed to call prctl. */
+	pthread_join(self->sibling[0].tid, &status);
+	EXPECT_EQ(SIBLING_EXIT_FAILURE, (long)status);
+	pthread_join(self->sibling[1].tid, &status);
+	EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status);
+}
+
+TEST_F(TSYNC, two_siblings_with_ancestor) {
+	long ret;
+	void *status;
+
+	ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &self->root_prog);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER!");
+	}
+	tsync_start_sibling(&self->sibling[0]);
+	tsync_start_sibling(&self->sibling[1]);
+
+	while (self->sibling_count < TSYNC_SIBLINGS) {
+		sem_wait(&self->started);
+		self->sibling_count++;
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC,
+		      &self->apply_prog);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Could install filter on all threads!");
+	}
+	/* Tell the siblings to test the policy */
+	pthread_mutex_lock(&self->mutex);
+	ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
+		TH_LOG("cond broadcast non-zero");
+	}
+	pthread_mutex_unlock(&self->mutex);
+	/* Ensure they are both killed and don't exit cleanly. */
+	pthread_join(self->sibling[0].tid, &status);
+	EXPECT_EQ(0x0, (long)status);
+	pthread_join(self->sibling[1].tid, &status);
+	EXPECT_EQ(0x0, (long)status);
+}
+
+TEST_F(TSYNC, two_sibling_want_nnp) {
+	void *status;
+
+	/* start siblings before any prctl() operations */
+	tsync_start_sibling(&self->sibling[0]);
+	tsync_start_sibling(&self->sibling[1]);
+	while (self->sibling_count < TSYNC_SIBLINGS) {
+		sem_wait(&self->started);
+		self->sibling_count++;
+	}
+
+	/* Tell the siblings to test no policy */
+	pthread_mutex_lock(&self->mutex);
+	ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
+		TH_LOG("cond broadcast non-zero");
+	}
+	pthread_mutex_unlock(&self->mutex);
+
+	/* Ensure they are both upset about lacking nnp. */
+	pthread_join(self->sibling[0].tid, &status);
+	EXPECT_EQ(SIBLING_EXIT_NEWPRIVS, (long)status);
+	pthread_join(self->sibling[1].tid, &status);
+	EXPECT_EQ(SIBLING_EXIT_NEWPRIVS, (long)status);
+}
+
+TEST_F(TSYNC, two_siblings_with_no_filter) {
+	long ret;
+	void *status;
+
+	/* start siblings before any prctl() operations */
+	tsync_start_sibling(&self->sibling[0]);
+	tsync_start_sibling(&self->sibling[1]);
+	while (self->sibling_count < TSYNC_SIBLINGS) {
+		sem_wait(&self->started);
+		self->sibling_count++;
+	}
+
+	ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC,
+		      &self->apply_prog);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Could install filter on all threads!");
+	}
+
+	/* Tell the siblings to test the policy */
+	pthread_mutex_lock(&self->mutex);
+	ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
+		TH_LOG("cond broadcast non-zero");
+	}
+	pthread_mutex_unlock(&self->mutex);
+
+	/* Ensure they are both killed and don't exit cleanly. */
+	pthread_join(self->sibling[0].tid, &status);
+	EXPECT_EQ(0x0, (long)status);
+	pthread_join(self->sibling[1].tid, &status);
+	EXPECT_EQ(0x0, (long)status);
+}
+
+TEST_F(TSYNC, two_siblings_with_one_divergence) {
+	long ret;
+	void *status;
+
+	ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &self->root_prog);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER!");
+	}
+	self->sibling[0].diverge = 1;
+	tsync_start_sibling(&self->sibling[0]);
+	tsync_start_sibling(&self->sibling[1]);
+
+	while (self->sibling_count < TSYNC_SIBLINGS) {
+		sem_wait(&self->started);
+		self->sibling_count++;
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC,
+		      &self->apply_prog);
+	ASSERT_EQ(self->sibling[0].system_tid, ret) {
+		TH_LOG("Did not fail on diverged sibling.");
+	}
+
+	/* Wake the threads */
+	pthread_mutex_lock(&self->mutex);
+	ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
+		TH_LOG("cond broadcast non-zero");
+	}
+	pthread_mutex_unlock(&self->mutex);
+
+	/* Ensure they are both unkilled. */
+	pthread_join(self->sibling[0].tid, &status);
+	EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status);
+	pthread_join(self->sibling[1].tid, &status);
+	EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status);
+}
+
+TEST_F(TSYNC, two_siblings_not_under_filter) {
+	long ret, sib;
+	void *status;
+
+	ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
+		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+	}
+
+	/*
+	 * Sibling 0 will have its own seccomp policy
+	 * and Sibling 1 will not be under seccomp at
+	 * all. Sibling 1 will enter seccomp and 0
+	 * will cause failure.
+	 */
+	self->sibling[0].diverge = 1;
+	tsync_start_sibling(&self->sibling[0]);
+	tsync_start_sibling(&self->sibling[1]);
+
+	while (self->sibling_count < TSYNC_SIBLINGS) {
+		sem_wait(&self->started);
+		self->sibling_count++;
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &self->root_prog);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER!");
+	}
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC,
+		      &self->apply_prog);
+	ASSERT_EQ(ret, self->sibling[0].system_tid) {
+		TH_LOG("Did not fail on diverged sibling.");
+	}
+	sib = 1;
+	if (ret == self->sibling[0].system_tid)
+		sib = 0;
+
+	pthread_mutex_lock(&self->mutex);
+
+	/* Increment the other siblings num_waits so we can clean up
+	 * the one we just saw.
+	 */
+	self->sibling[!sib].num_waits += 1;
+
+	/* Signal the thread to clean up*/
+	ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
+		TH_LOG("cond broadcast non-zero");
+	}
+	pthread_mutex_unlock(&self->mutex);
+	pthread_join(self->sibling[sib].tid, &status);
+	EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status);
+	/* Poll for actual task death. pthread_join doesn't guarantee it. */
+	while (!kill(self->sibling[sib].system_tid, 0)) sleep(0.1);
+	/* Switch to the remaining sibling */
+	sib = !sib;
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC,
+		      &self->apply_prog);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("Expected the remaining sibling to sync");
+	};
+
+	pthread_mutex_lock(&self->mutex);
+
+	/* If remaining sibling didn't have a chance to wake up during
+	 * the first broadcast, manually reduce the num_waits now.
+	 */
+	if (self->sibling[sib].num_waits > 1)
+		self->sibling[sib].num_waits = 1;
+	ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
+		TH_LOG("cond broadcast non-zero");
+	}
+	pthread_mutex_unlock(&self->mutex);
+	pthread_join(self->sibling[sib].tid, &status);
+	EXPECT_EQ(0, (long)status);
+	/* Poll for actual task death. pthread_join doesn't guarantee it. */
+	while (!kill(self->sibling[sib].system_tid, 0)) sleep(0.1);
+
+	ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC,
+		      &self->apply_prog);
+	ASSERT_EQ(0, ret);  /* just us chickens */
+}
+
+/* Make sure restarted syscalls are seen directly as "restart_syscall". */
+TEST(syscall_restart) {
+	long ret;
+	unsigned long msg;
+	pid_t child_pid;
+	int pipefd[2];
+	int status;
+	siginfo_t info = { };
+	struct sock_filter filter[] = {
+		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
+			 offsetof(struct seccomp_data, nr)),
+
+#ifdef __NR_sigreturn
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_sigreturn, 6, 0),
+#endif
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 5, 0),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_exit, 4, 0),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_rt_sigreturn, 3, 0),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_poll, 4, 0),
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_restart_syscall, 4, 0),
+
+		/* Allow __NR_write for easy logging. */
+		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_write, 0, 1),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE|0x100), /* poll */
+		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE|0x200), /* restart */
+	};
+	struct sock_fprog prog = {
+		.len = (unsigned short)(sizeof(filter)/sizeof(filter[0])),
+		.filter = filter,
+	};
+
+	ASSERT_EQ(0, pipe(pipefd));
+
+	child_pid = fork();
+	ASSERT_LE(0, child_pid);
+	if (child_pid == 0) {
+		/* Child uses EXPECT not ASSERT to deliver status correctly. */
+		char buf = ' ';
+		struct pollfd fds = {
+			.fd = pipefd[0],
+			.events = POLLIN,
+		};
+
+		/* Attach parent as tracer and stop. */
+		EXPECT_EQ(0, ptrace(PTRACE_TRACEME));
+		EXPECT_EQ(0, raise(SIGSTOP));
+
+		EXPECT_EQ(0, close(pipefd[1]));
+
+		EXPECT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
+			TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
+		}
+
+		ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
+		EXPECT_EQ(0, ret) {
+			TH_LOG("Failed to install filter!");
+		}
+
+		EXPECT_EQ(1, read(pipefd[0], &buf, 1)) {
+			TH_LOG("Failed to read() sync from parent");
+		}
+		EXPECT_EQ('.', buf) {
+			TH_LOG("Failed to get sync data from read()");
+		}
+
+		/* Start poll to be interrupted. */
+		errno = 0;
+		EXPECT_EQ(1, poll(&fds, 1, -1)) {
+			TH_LOG("Call to poll() failed (errno %d)", errno);
+		}
+
+		/* Read final sync from parent. */
+		EXPECT_EQ(1, read(pipefd[0], &buf, 1)) {
+			TH_LOG("Failed final read() from parent");
+		}
+		EXPECT_EQ('!', buf) {
+			TH_LOG("Failed to get final data from read()");
+		}
+
+		/* Directly report the status of our test harness results. */
+		syscall(__NR_exit, _metadata->passed ? EXIT_SUCCESS
+						     : EXIT_FAILURE);
+	}
+	EXPECT_EQ(0, close(pipefd[0]));
+
+	/* Attach to child, setup options, and release. */
+	ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
+	ASSERT_EQ(true, WIFSTOPPED(status));
+	ASSERT_EQ(0, ptrace(PTRACE_SETOPTIONS, child_pid, NULL,
+			    PTRACE_O_TRACESECCOMP));
+	ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
+	ASSERT_EQ(1, write(pipefd[1], ".", 1));
+
+	/* Wait for poll() to start. */
+	ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
+	ASSERT_EQ(true, WIFSTOPPED(status));
+	ASSERT_EQ(SIGTRAP, WSTOPSIG(status));
+	ASSERT_EQ(PTRACE_EVENT_SECCOMP, (status >> 16));
+	ASSERT_EQ(0, ptrace(PTRACE_GETEVENTMSG, child_pid, NULL, &msg));
+	ASSERT_EQ(0x100, msg);
+	EXPECT_EQ(__NR_poll, get_syscall(_metadata, child_pid));
+
+	/* Might as well check siginfo for sanity while we're here. */
+	ASSERT_EQ(0, ptrace(PTRACE_GETSIGINFO, child_pid, NULL, &info));
+	ASSERT_EQ(SIGTRAP, info.si_signo);
+	ASSERT_EQ(SIGTRAP | (PTRACE_EVENT_SECCOMP << 8), info.si_code);
+	EXPECT_EQ(0, info.si_errno);
+	EXPECT_EQ(getuid(), info.si_uid);
+	/* Verify signal delivery came from child (seccomp-triggered). */
+	EXPECT_EQ(child_pid, info.si_pid);
+
+	/* Interrupt poll with SIGSTOP (which we'll need to handle). */
+	ASSERT_EQ(0, kill(child_pid, SIGSTOP));
+	ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
+	ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
+	ASSERT_EQ(true, WIFSTOPPED(status));
+	ASSERT_EQ(SIGSTOP, WSTOPSIG(status));
+	/* Verify signal delivery came from parent now. */
+	ASSERT_EQ(0, ptrace(PTRACE_GETSIGINFO, child_pid, NULL, &info));
+	EXPECT_EQ(getpid(), info.si_pid);
+
+	/* Restart poll with SIGCONT, which triggers restart_syscall. */
+	ASSERT_EQ(0, kill(child_pid, SIGCONT));
+	ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
+	ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
+	ASSERT_EQ(true, WIFSTOPPED(status));
+	ASSERT_EQ(SIGCONT, WSTOPSIG(status));
+	ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
+
+	/* Wait for restart_syscall() to start. */
+	ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
+	ASSERT_EQ(true, WIFSTOPPED(status));
+	ASSERT_EQ(SIGTRAP, WSTOPSIG(status));
+	ASSERT_EQ(PTRACE_EVENT_SECCOMP, (status >> 16));
+	ASSERT_EQ(0, ptrace(PTRACE_GETEVENTMSG, child_pid, NULL, &msg));
+	ASSERT_EQ(0x200, msg);
+	ret = get_syscall(_metadata, child_pid);
+#if defined(__arm__)
+	/* FIXME: ARM does not expose true syscall in registers. */
+	EXPECT_EQ(__NR_poll, ret);
+#else
+	EXPECT_EQ(__NR_restart_syscall, ret);
+#endif
+
+	/* Write again to end poll. */
+	ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
+	ASSERT_EQ(1, write(pipefd[1], "!", 1));
+	EXPECT_EQ(0, close(pipefd[1]));
+
+	ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
+	if (WIFSIGNALED(status) || WEXITSTATUS(status))
+		_metadata->passed = 0;
+}
+
+/*
+ * TODO:
+ * - add microbenchmarks
+ * - expand NNP testing
+ * - better arch-specific TRACE and TRAP handlers.
+ * - endianness checking when appropriate
+ * - 64-bit arg prodding
+ * - arch value testing (x86 modes especially)
+ * - ...
+ */
+
+// ANDROID:begin
+struct __test_metadata* get_seccomp_test_list() {
+  return __test_list;
+}
+// ANDROID:end
+
+TEST_HARNESS_MAIN
diff --git a/tests/tests/os/jni/seccomp-tests/tests/sigsegv.c b/tests/tests/os/jni/seccomp-tests/tests/sigsegv.c
new file mode 100644
index 0000000..a0d06e7
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/tests/sigsegv.c
@@ -0,0 +1,179 @@
+/* sigsegv.c
+ * Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * Forces a denied system call to trigger a SIGSEGV at the instruction after
+ * the call using a SIGSYS handler.. This can be useful when debugging
+ * frameworks have trouble tracing through the SIGSYS handler.
+ * Proof of concept using amd64 registers and 'syscall'.
+ */
+
+#include <asm/siginfo.h>
+#define __have_siginfo_t 1
+#define __have_sigval_t 1
+#define __have_sigevent_t 1
+
+#include <linux/filter.h>
+#include <sys/prctl.h>
+#include <linux/prctl.h>
+#include <linux/seccomp.h>
+#include <limits.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <string.h>
+#include <syscall.h>
+#define __USE_GNU 1
+#include <sys/ucontext.h>
+#include <sys/mman.h>
+
+#include "test_harness.h"
+
+#ifndef PR_SET_NO_NEW_PRIVS
+#define PR_SET_NO_NEW_PRIVS 38
+#define PR_GET_NO_NEW_PRIVS 39
+#endif
+
+#if defined(__i386__)
+#define REG_IP	REG_EIP
+#define REG_SP	REG_ESP
+#define REG_RESULT	REG_EAX
+#define REG_SYSCALL	REG_EAX
+#define REG_ARG0	REG_EBX
+#define REG_ARG1	REG_ECX
+#define REG_ARG2	REG_EDX
+#define REG_ARG3	REG_ESI
+#define REG_ARG4	REG_EDI
+#define REG_ARG5	REG_EBP
+#elif defined(__x86_64__)
+#define REG_IP	REG_RIP
+#define REG_SP	REG_RSP
+#define REG_RESULT	REG_RAX
+#define REG_SYSCALL	REG_RAX
+#define REG_ARG0	REG_RDI
+#define REG_ARG1	REG_RSI
+#define REG_ARG2	REG_RDX
+#define REG_ARG3	REG_R10
+#define REG_ARG4	REG_R8
+#define REG_ARG5	REG_R9
+#endif
+
+FIXTURE_DATA(TRAP) {
+	struct sock_fprog prog;
+};
+
+FIXTURE_SETUP(TRAP) {
+	/* instruction after the syscall. Will be arch specific, of course. */
+	{
+		struct sock_filter filter[] = {
+			BPF_STMT(BPF_LD+BPF_W+BPF_ABS,
+				offsetof(struct seccomp_data, nr)),
+			/* Whitelist anything you might need in the sigaction */
+#ifdef __NR_sigreturn
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_sigreturn, 4, 0),
+#endif
+			/* TODO: only allow PROT_NONE */
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_mprotect, 3, 0),
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_exit, 2, 0),
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_rt_sigreturn, 1, 0),
+			/* Allow __NR_write so easy logging. */
+			BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_write, 0, 1),
+			BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW),
+			BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_TRAP),
+		};
+		memset(&self->prog, 0, sizeof(self->prog));
+		self->prog.filter = malloc(sizeof(filter));
+		ASSERT_NE(NULL, self->prog.filter);
+		memcpy(self->prog.filter, filter, sizeof(filter));
+		self->prog.len = (unsigned short)(sizeof(filter)/sizeof(filter[0]));
+	}
+}
+
+FIXTURE_TEARDOWN(TRAP) {
+	if (self->prog.filter)
+		free(self->prog.filter);
+};
+
+struct arch_sigsys {
+		void *_call_addr; /* calling user insn */
+		int _syscall;	/* triggering system call number */
+		unsigned int _arch;	/* AUDIT_ARCH_* of syscall */
+};
+
+#define _ALIGN(x,sz) (((x + ((sz)-1)) & ~((sz)-1)) - (sz))
+#define ALIGN(x,sz) ((typeof(x))_ALIGN((unsigned long)(x),(unsigned long)(sz)))
+static long local_mprotect(void *target, unsigned long sz)
+{
+	register unsigned long res asm ("rax") = __NR_mprotect;
+	__attribute__((unused)) register void *addr asm ("rdi") = ALIGN(target, sz);
+	__attribute__((unused)) register long len asm ("rsi") = sz;
+	__attribute__((unused)) register long num asm ("rdx") = PROT_NONE;
+	__asm__("syscall\n");
+	return res;
+}
+
+static void TRAP_action(int nr, siginfo_t *info, void *void_context)
+{
+	ucontext_t *ctx = (ucontext_t *)void_context;
+	char buf[256];
+	int len;
+	struct arch_sigsys *sys = (struct arch_sigsys *)
+#ifdef si_syscall
+		&(info->si_call_addr);
+#else
+		&(info->si_pid);
+#endif
+
+	if (info->si_code != SYS_SECCOMP)
+		return;
+	if (!ctx)
+		return;
+	len = snprintf(buf, sizeof(buf),
+			"@0x%lX:%X:%d:0x%lX:0x%lX:0x%lX:0x%lX:0x%lX:0x%lX [0x%lX]\n",
+			(unsigned long)sys->_call_addr,
+			sys->_arch,
+			sys->_syscall,
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG0],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG1],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG2],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG3],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG4],
+			(unsigned long)ctx->uc_mcontext.gregs[REG_ARG5],
+			(unsigned long)ALIGN(ctx->uc_mcontext.gregs[REG_IP],
+			4096));
+	/* Emit some useful logs or whatever. */
+	syscall(__NR_write, STDOUT_FILENO, buf, len);
+	/* Make the calling page non-exec */
+	/* Careful on how it is called since it may make the syscall() instructions non-exec. */
+	local_mprotect((void *)ctx->uc_mcontext.gregs[REG_IP], sysconf(_SC_PAGE_SIZE));
+}
+
+TEST_F_SIGNAL(TRAP, sigsegv, SIGSEGV) {
+	int ret;
+	struct sigaction act;
+	sigset_t mask;
+	memset(&act, 0, sizeof(act));
+	sigemptyset(&mask);
+	sigaddset(&mask, SIGSYS);
+
+	act.sa_sigaction = &TRAP_action;
+	act.sa_flags = SA_SIGINFO;
+	ret = sigaction(SIGSYS, &act, NULL);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("sigaction failed");
+	}
+	ret = sigprocmask(SIG_UNBLOCK, &mask, NULL);
+	ASSERT_EQ(0, ret) {
+		TH_LOG("sigprocmask failed");
+	}
+
+	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+	ASSERT_EQ(0, ret);
+	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog);
+	ASSERT_EQ(0, ret);
+
+	/* Call anything! */
+	ret = syscall(__NR_getpid);
+}
+
+TEST_HARNESS_MAIN
diff --git a/tests/tests/os/jni/seccomp-tests/tests/test_harness.h b/tests/tests/os/jni/seccomp-tests/tests/test_harness.h
new file mode 100644
index 0000000..597e40c
--- /dev/null
+++ b/tests/tests/os/jni/seccomp-tests/tests/test_harness.h
@@ -0,0 +1,521 @@
+/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * test_harness.h: simple C unit test helper.
+ *
+ * Usage:
+ *   #include "test_harness.h"
+ *   TEST(standalone_test) {
+ *     do_some_stuff;
+ *     EXPECT_GT(10, stuff) {
+ *        stuff_state_t state;
+ *        enumerate_stuff_state(&state);
+ *        TH_LOG("expectation failed with state: %s", state.msg);
+ *     }
+ *     more_stuff;
+ *     ASSERT_NE(some_stuff, NULL) TH_LOG("how did it happen?!");
+ *     last_stuff;
+ *     EXPECT_EQ(0, last_stuff);
+ *   }
+ *
+ *   FIXTURE(my_fixture) {
+ *     mytype_t *data;
+ *     int awesomeness_level;
+ *   };
+ *   FIXTURE_SETUP(my_fixture) {
+ *     self->data = mytype_new();
+ *     ASSERT_NE(NULL, self->data);
+ *   }
+ *   FIXTURE_TEARDOWN(my_fixture) {
+ *     mytype_free(self->data);
+ *   }
+ *   TEST_F(my_fixture, data_is_good) {
+ *     EXPECT_EQ(1, is_my_data_good(self->data));
+ *   }
+ *
+ *   TEST_HARNESS_MAIN
+ *
+ * API inspired by code.google.com/p/googletest
+ */
+#ifndef TEST_HARNESS_H_
+#define TEST_HARNESS_H_
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include <android/log.h>  // ANDROID
+
+/* All exported functionality should be declared through this macro. */
+#define TEST_API(x) _##x
+
+/*
+ * Exported APIs
+ */
+
+/* TEST(name) { implementation }
+ * Defines a test by name.
+ * Names must be unique and tests must not be run in parallel.  The
+ * implementation containing block is a function and scoping should be treated
+ * as such.  Returning early may be performed with a bare "return;" statement.
+ *
+ * EXPECT_* and ASSERT_* are valid in a TEST() { } context.
+ */
+#define TEST TEST_API(TEST)
+
+/* TEST_SIGNAL(name, signal) { implementation }
+ * Defines a test by name and the expected term signal.
+ * Names must be unique and tests must not be run in parallel.  The
+ * implementation containing block is a function and scoping should be treated
+ * as such.  Returning early may be performed with a bare "return;" statement.
+ *
+ * EXPECT_* and ASSERT_* are valid in a TEST() { } context.
+ */
+#define TEST_SIGNAL TEST_API(TEST_SIGNAL)
+
+/* FIXTURE(datatype name) {
+ *   type property1;
+ *   ...
+ * };
+ * Defines the data provided to TEST_F()-defined tests as |self|.  It should be
+ * populated and cleaned up using FIXTURE_SETUP and FIXTURE_TEARDOWN.
+ */
+#define FIXTURE TEST_API(FIXTURE)
+
+/* FIXTURE_DATA(datatype name)
+ * This call may be used when the type of the fixture data
+ * is needed.  In general, this should not be needed unless
+ * the |self| is being passed to a helper directly.
+ */
+#define FIXTURE_DATA TEST_API(FIXTURE_DATA)
+
+/* FIXTURE_SETUP(fixture name) { implementation }
+ * Populates the required "setup" function for a fixture.  An instance of the
+ * datatype defined with _FIXTURE_DATA will be exposed as |self| for the
+ * implementation.
+ *
+ * ASSERT_* are valid for use in this context and will prempt the execution
+ * of any dependent fixture tests.
+ *
+ * A bare "return;" statement may be used to return early.
+ */
+#define FIXTURE_SETUP TEST_API(FIXTURE_SETUP)
+
+/* FIXTURE_TEARDOWN(fixture name) { implementation }
+ * Populates the required "teardown" function for a fixture.  An instance of the
+ * datatype defined with _FIXTURE_DATA will be exposed as |self| for the
+ * implementation to clean up.
+ *
+ * A bare "return;" statement may be used to return early.
+ */
+#define FIXTURE_TEARDOWN TEST_API(FIXTURE_TEARDOWN)
+
+/* TEST_F(fixture, name) { implementation }
+ * Defines a test that depends on a fixture (e.g., is part of a test case).
+ * Very similar to TEST() except that |self| is the setup instance of fixture's
+ * datatype exposed for use by the implementation.
+ */
+#define TEST_F TEST_API(TEST_F)
+
+#define TEST_F_SIGNAL TEST_API(TEST_F_SIGNAL)
+
+/* Use once to append a main() to the test file. E.g.,
+ *   TEST_HARNESS_MAIN
+ */
+#define TEST_HARNESS_MAIN TEST_API(TEST_HARNESS_MAIN)
+
+/*
+ * Operators for use in TEST and TEST_F.
+ * ASSERT_* calls will stop test execution immediately.
+ * EXPECT_* calls will emit a failure warning, note it, and continue.
+ */
+
+/* ASSERT_EQ(expected, measured): expected == measured */
+#define ASSERT_EQ TEST_API(ASSERT_EQ)
+/* ASSERT_NE(expected, measured): expected != measured */
+#define ASSERT_NE TEST_API(ASSERT_NE)
+/* ASSERT_LT(expected, measured): expected < measured */
+#define ASSERT_LT TEST_API(ASSERT_LT)
+/* ASSERT_LE(expected, measured): expected <= measured */
+#define ASSERT_LE TEST_API(ASSERT_LE)
+/* ASSERT_GT(expected, measured): expected > measured */
+#define ASSERT_GT TEST_API(ASSERT_GT)
+/* ASSERT_GE(expected, measured): expected >= measured */
+#define ASSERT_GE TEST_API(ASSERT_GE)
+/* ASSERT_NULL(measured): NULL == measured */
+#define ASSERT_NULL TEST_API(ASSERT_NULL)
+/* ASSERT_TRUE(measured): measured != 0 */
+#define ASSERT_TRUE TEST_API(ASSERT_TRUE)
+/* ASSERT_FALSE(measured): measured == 0 */
+#define ASSERT_FALSE TEST_API(ASSERT_FALSE)
+/* ASSERT_STREQ(expected, measured): !strcmp(expected, measured) */
+#define ASSERT_STREQ TEST_API(ASSERT_STREQ)
+/* ASSERT_STRNE(expected, measured): strcmp(expected, measured) */
+#define ASSERT_STRNE TEST_API(ASSERT_STRNE)
+/* EXPECT_EQ(expected, measured): expected == measured */
+#define EXPECT_EQ TEST_API(EXPECT_EQ)
+/* EXPECT_NE(expected, measured): expected != measured */
+#define EXPECT_NE TEST_API(EXPECT_NE)
+/* EXPECT_LT(expected, measured): expected < measured */
+#define EXPECT_LT TEST_API(EXPECT_LT)
+/* EXPECT_LE(expected, measured): expected <= measured */
+#define EXPECT_LE TEST_API(EXPECT_LE)
+/* EXPECT_GT(expected, measured): expected > measured */
+#define EXPECT_GT TEST_API(EXPECT_GT)
+/* EXPECT_GE(expected, measured): expected >= measured */
+#define EXPECT_GE TEST_API(EXPECT_GE)
+/* EXPECT_NULL(measured): NULL == measured */
+#define EXPECT_NULL TEST_API(EXPECT_NULL)
+/* EXPECT_TRUE(measured): 0 != measured */
+#define EXPECT_TRUE TEST_API(EXPECT_TRUE)
+/* EXPECT_FALSE(measured): 0 == measured */
+#define EXPECT_FALSE TEST_API(EXPECT_FALSE)
+/* EXPECT_STREQ(expected, measured): !strcmp(expected, measured) */
+#define EXPECT_STREQ TEST_API(EXPECT_STREQ)
+/* EXPECT_STRNE(expected, measured): strcmp(expected, measured) */
+#define EXPECT_STRNE TEST_API(EXPECT_STRNE)
+
+/* TH_LOG(format, ...)
+ * Optional debug logging function available for use in tests.
+ * Logging may be enabled or disabled by defining TH_LOG_ENABLED.
+ * E.g., #define TH_LOG_ENABLED 1
+ * If no definition is provided, logging is enabled by default.
+ */
+#define TH_LOG  TEST_API(TH_LOG)
+
+/*
+ * Internal implementation.
+ *
+ */
+
+/* Utilities exposed to the test definitions */
+#ifndef TH_LOG_STREAM
+#  define TH_LOG_STREAM stderr
+#endif
+
+#ifndef TH_LOG_ENABLED
+#  define TH_LOG_ENABLED 1
+#endif
+
+#define _TH_LOG(fmt, ...) do { \
+  if (TH_LOG_ENABLED) \
+    __TH_LOG(fmt, ##__VA_ARGS__); \
+} while (0)
+
+/* Unconditional logger for internal use. */
+// ANDROID:begin
+#define __TH_LOG(fmt, ...) \
+    __android_log_print(ANDROID_LOG_ERROR, "SeccompBpfTest-KernelUnit", "%s:%d:%s:" fmt "\n", \
+            __FILE__, __LINE__, _metadata->name, ##__VA_ARGS__)
+// ANDROID:end
+
+/* Defines the test function and creates the registration stub. */
+#define _TEST(test_name) __TEST_IMPL(test_name, -1)
+
+#define _TEST_SIGNAL(test_name, signal) __TEST_IMPL(test_name, signal)
+
+#define __TEST_IMPL(test_name, _signal) \
+  static void test_name(struct __test_metadata *_metadata); \
+  static struct __test_metadata _##test_name##_object = \
+    { name: "global." #test_name, fn: &test_name, termsig: _signal }; \
+  static void __attribute__((constructor)) _register_##test_name(void) { \
+    __register_test(&_##test_name##_object); \
+  } \
+  static void test_name( \
+    struct __test_metadata __attribute__((unused)) *_metadata)
+
+/* Wraps the struct name so we have one less argument to pass around. */
+#define _FIXTURE_DATA(fixture_name) struct _test_data_##fixture_name
+
+/* Called once per fixture to setup the data and register. */
+#define _FIXTURE(fixture_name) \
+  static void __attribute__((constructor)) \
+      _register_##fixture_name##_data(void) { \
+    __fixture_count++; \
+  } \
+  _FIXTURE_DATA(fixture_name)
+
+/* Prepares the setup function for the fixture.  |_metadata| is included
+ * so that ASSERT_* work as a convenience.
+ */
+#define _FIXTURE_SETUP(fixture_name) \
+  void fixture_name##_setup( \
+    struct __test_metadata __attribute__((unused)) *_metadata, \
+    _FIXTURE_DATA(fixture_name) __attribute__((unused)) *self)
+#define _FIXTURE_TEARDOWN(fixture_name) \
+  void fixture_name##_teardown( \
+    struct __test_metadata __attribute__((unused)) *_metadata, \
+    _FIXTURE_DATA(fixture_name) __attribute__((unused)) *self)
+
+/* Emits test registration and helpers for fixture-based test
+ * cases.
+ * TODO(wad) register fixtures on dedicated test lists.
+ */
+#define _TEST_F(fixture_name, test_name) \
+  __TEST_F_IMPL(fixture_name, test_name, -1)
+
+#define _TEST_F_SIGNAL(fixture_name, test_name, signal) \
+  __TEST_F_IMPL(fixture_name, test_name, signal)
+
+#define __TEST_F_IMPL(fixture_name, test_name, signal) \
+  static void fixture_name##_##test_name( \
+    struct __test_metadata *_metadata, \
+    _FIXTURE_DATA(fixture_name) *self); \
+  static inline void wrapper_##fixture_name##_##test_name( \
+    struct __test_metadata *_metadata) { \
+    /* fixture data is allocated, setup, and torn down per call. */ \
+    _FIXTURE_DATA(fixture_name) self; \
+    memset(&self, 0, sizeof(_FIXTURE_DATA(fixture_name))); \
+    fixture_name##_setup(_metadata, &self); \
+    /* Let setup failure terminate early. */ \
+    if (!_metadata->passed) return; \
+    fixture_name##_##test_name(_metadata, &self); \
+    fixture_name##_teardown(_metadata, &self); \
+  } \
+  static struct __test_metadata _##fixture_name##_##test_name##_object = { \
+    name: #fixture_name "." #test_name, \
+    fn: &wrapper_##fixture_name##_##test_name, \
+    termsig: signal, \
+   }; \
+  static void __attribute__((constructor)) \
+      _register_##fixture_name##_##test_name(void) { \
+    __register_test(&_##fixture_name##_##test_name##_object); \
+  } \
+  static void fixture_name##_##test_name( \
+    struct __test_metadata __attribute__((unused)) *_metadata, \
+    _FIXTURE_DATA(fixture_name) __attribute__((unused)) *self)
+
+/* Exports a simple wrapper to run the test harness. */
+#define _TEST_HARNESS_MAIN \
+  static void __attribute__((constructor)) __constructor_order_last(void) { \
+    if (!__constructor_order) \
+      __constructor_order = _CONSTRUCTOR_ORDER_BACKWARD; \
+  } \
+  int seccomp_test_main(int argc, char **argv) { return test_harness_run(argc, argv); }  // ANDROID
+
+#define _ASSERT_EQ(_expected, _seen) \
+  __EXPECT(_expected, _seen, ==, 1)
+#define _ASSERT_NE(_expected, _seen) \
+  __EXPECT(_expected, _seen, !=, 1)
+#define _ASSERT_LT(_expected, _seen) \
+  __EXPECT(_expected, _seen, <, 1)
+#define _ASSERT_LE(_expected, _seen) \
+  __EXPECT(_expected, _seen, <=, 1)
+#define _ASSERT_GT(_expected, _seen) \
+  __EXPECT(_expected, _seen, >, 1)
+#define _ASSERT_GE(_expected, _seen) \
+  __EXPECT(_expected, _seen, >=, 1)
+#define _ASSERT_NULL(_seen) \
+  __EXPECT(NULL, _seen, ==, 1)
+
+#define _ASSERT_TRUE(_seen) \
+  _ASSERT_NE(0, _seen)
+#define _ASSERT_FALSE(_seen) \
+  _ASSERT_EQ(0, _seen)
+#define _ASSERT_STREQ(_expected, _seen) \
+  __EXPECT_STR(_expected, _seen, ==, 1)
+#define _ASSERT_STRNE(_expected, _seen) \
+  __EXPECT_STR(_expected, _seen, !=, 1)
+
+#define _EXPECT_EQ(_expected, _seen) \
+  __EXPECT(_expected, _seen, ==, 0)
+#define _EXPECT_NE(_expected, _seen) \
+  __EXPECT(_expected, _seen, !=, 0)
+#define _EXPECT_LT(_expected, _seen) \
+  __EXPECT(_expected, _seen, <, 0)
+#define _EXPECT_LE(_expected, _seen) \
+  __EXPECT(_expected, _seen, <=, 0)
+#define _EXPECT_GT(_expected, _seen) \
+  __EXPECT(_expected, _seen, >, 0)
+#define _EXPECT_GE(_expected, _seen) \
+  __EXPECT(_expected, _seen, >=, 0)
+
+#define _EXPECT_NULL(_seen) \
+  __EXPECT(NULL, _seen, ==, 0)
+#define _EXPECT_TRUE(_seen) \
+  _EXPECT_NE(0, _seen)
+#define _EXPECT_FALSE(_seen) \
+  _EXPECT_EQ(0, _seen)
+
+#define _EXPECT_STREQ(_expected, _seen) \
+  __EXPECT_STR(_expected, _seen, ==, 0)
+#define _EXPECT_STRNE(_expected, _seen) \
+  __EXPECT_STR(_expected, _seen, !=, 0)
+
+/* Support an optional handler after and ASSERT_* or EXPECT_*.  The approach is
+ * not thread-safe, but it should be fine in most sane test scenarios.
+ *
+ * Using __bail(), which optionally abort()s, is the easiest way to early
+ * return while still providing an optional block to the API consumer.
+ */
+#define OPTIONAL_HANDLER(_assert) \
+  for (; _metadata->trigger;  _metadata->trigger = __bail(_assert))
+
+#define __EXPECT(_expected, _seen, _t, _assert) do { \
+  /* Avoid multiple evaluation of the cases */ \
+  __typeof__(_expected) __exp = (_expected); \
+  __typeof__(_seen) __seen = (_seen); \
+  if (!(__exp _t __seen)) { \
+    unsigned long long __exp_print = 0; \
+    unsigned long long __seen_print = 0; \
+    /* Avoid casting complaints the scariest way we can. */ \
+    memcpy(&__exp_print, &__exp, sizeof(__exp)); \
+    memcpy(&__seen_print, &__seen, sizeof(__seen)); \
+    __TH_LOG("Expected %s (%llu) %s %s (%llu)", \
+            #_expected, __exp_print, #_t, \
+            #_seen, __seen_print); \
+    _metadata->passed = 0; \
+    /* Ensure the optional handler is triggered */ \
+    _metadata->trigger = 1; \
+  } \
+} while (0); OPTIONAL_HANDLER(_assert)
+
+#define __EXPECT_STR(_expected, _seen, _t, _assert) do { \
+  const char *__exp = (_expected); \
+  const char *__seen = (_seen); \
+  if (!(strcmp(__exp, __seen) _t 0))  { \
+    __TH_LOG("Expected '%s' %s '%s'.", __exp, #_t, __seen); \
+    _metadata->passed = 0; \
+    _metadata->trigger = 1; \
+  } \
+} while (0); OPTIONAL_HANDLER(_assert)
+
+/* Contains all the information for test execution and status checking. */
+struct __test_metadata {
+  const char *name;
+  void (*fn)(struct __test_metadata *);
+  int termsig;
+  int passed;
+  int trigger; /* extra handler after the evaluation */
+  struct __test_metadata *prev, *next;
+};
+
+/* Storage for the (global) tests to be run. */
+static struct __test_metadata *__test_list = NULL;
+static unsigned int __test_count = 0;
+static unsigned int __fixture_count = 0;
+static int __constructor_order = 0;
+
+#define _CONSTRUCTOR_ORDER_FORWARD   1
+#define _CONSTRUCTOR_ORDER_BACKWARD -1
+
+/*
+ * Since constructors are called in reverse order, reverse the test
+ * list so tests are run in source declaration order.
+ * https://gcc.gnu.org/onlinedocs/gccint/Initialization.html
+ * However, it seems not all toolchains do this correctly, so use
+ * __constructor_order to detect which direction is called first
+ * and adjust list building logic to get things running in the right
+ * direction.
+ */
+static inline void __register_test(struct __test_metadata *t) {
+  __test_count++;
+  /* Circular linked list where only prev is circular. */
+  if (__test_list == NULL) {
+    __test_list = t;
+    t->next = NULL;
+    t->prev = t;
+    return;
+  }
+  if (__constructor_order == _CONSTRUCTOR_ORDER_FORWARD) {
+    t->next = NULL;
+    t->prev = __test_list->prev;
+    t->prev->next = t;
+    __test_list->prev = t;
+  } else {
+    t->next = __test_list;
+    t->next->prev = t;
+    t->prev = t;
+    __test_list = t;
+  }
+}
+
+static inline int __bail(int for_realz) {
+  if (for_realz)
+    abort();
+  return 0;
+}
+
+void __run_test(struct __test_metadata *t) {
+  pid_t child_pid;
+  int status;
+  t->passed = 1;
+  t->trigger = 0;
+  printf("[ RUN      ] %s\n", t->name);
+  child_pid = fork();
+  if (child_pid < 0) {
+    printf("ERROR SPAWNING TEST CHILD\n");
+    t->passed = 0;
+  } else if (child_pid == 0) {
+    t->fn(t);
+    _exit(t->passed);
+  } else {
+    /* TODO(wad) add timeout support. */
+    waitpid(child_pid, &status, 0);
+    if (WIFEXITED(status)) {
+      t->passed = t->termsig == -1 ? WEXITSTATUS(status) : 0;
+      if (t->termsig != -1) {
+       fprintf(TH_LOG_STREAM,
+                "%s: Test exited normally instead of by signal (code: %d)\n",
+               t->name,
+               WEXITSTATUS(status));
+      }
+    } else if (WIFSIGNALED(status)) {
+      t->passed = 0;
+      if (WTERMSIG(status) == SIGABRT) {
+        fprintf(TH_LOG_STREAM,
+                "%s: Test terminated by assertion\n",
+               t->name);
+      } else if (WTERMSIG(status) == t->termsig) {
+        t->passed = 1;
+      } else {
+        fprintf(TH_LOG_STREAM,
+                "%s: Test terminated unexpectedly by signal %d\n",
+               t->name,
+               WTERMSIG(status));
+      }
+    } else {
+        fprintf(TH_LOG_STREAM,
+                "%s: Test ended in some other way [%u]\n",
+               t->name,
+               status);
+    }
+  }
+  printf("[     %4s ] %s\n", (t->passed ? "OK" : "FAIL"), t->name);
+}
+
+static int test_harness_run(int __attribute__((unused)) argc,
+                            char __attribute__((unused)) **argv) {
+  struct __test_metadata *t;
+  int ret = 0;
+  unsigned int count = 0;
+  unsigned int pass_count = 0;
+
+  /* TODO(wad) add optional arguments similar to gtest. */
+  printf("[==========] Running %u tests from %u test cases.\n",
+          __test_count, __fixture_count + 1);
+  for (t = __test_list; t; t = t->next) {
+    count++;
+    __run_test(t);
+    if (t->passed)
+      pass_count++;
+    else
+      ret = 1;
+  }
+  /* TODO(wad) organize by fixtures since ordering is not guaranteed now. */
+  printf("[==========] %u / %u tests passed.\n", pass_count, count);
+  printf("[  %s  ]\n", (ret ? "FAILED" : "PASSED"));
+  return ret;
+}
+
+static void __attribute__((constructor)) __constructor_order_first(void) {
+  if (!__constructor_order)
+    __constructor_order = _CONSTRUCTOR_ORDER_FORWARD;
+}
+
+#endif  /* TEST_HARNESS_H_ */
diff --git a/tests/tests/os/jni/seccomp_sample_program.cpp b/tests/tests/os/jni/seccomp_sample_program.cpp
new file mode 100644
index 0000000..3c90196
--- /dev/null
+++ b/tests/tests/os/jni/seccomp_sample_program.cpp
@@ -0,0 +1,1456 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#include <linux/filter.h>
+
+// This file defines a sample seccomp-bpf policy. It is taken from the
+// Chromium renderer process policy applied to isolatedProcess services.
+//
+// In the future, this policy should be further restricted to just the set
+// of system calls that an isolatedProcess should be allowed to make.
+
+#if defined(__arm__)
+struct sock_filter kTestSeccompFilter[] = {
+  {0x20, 0, 0, 0x4},
+  {0x15, 1, 0, 0x40000028},
+  {0x6, 0, 0, 0x30006},
+  {0x20, 0, 0, 0x0},
+  {0x35, 0, 90, 0xab},
+  {0x35, 0, 43, 0x108},
+  {0x35, 0, 21, 0x14f},
+  {0x35, 0, 10, 0x168},
+  {0x35, 0, 5, 0x181},
+  {0x35, 0, 2, 0xf0006},
+  {0x35, 0, 58, 0xffff0},
+  {0x35, 57, 55, 0xffff1},
+  {0x35, 0, 43, 0x182},
+  {0x35, 53, 55, 0xf0001},
+  {0x35, 0, 2, 0x16f},
+  {0x35, 0, 53, 0x17e},
+  {0x35, 52, 39, 0x180},
+  {0x35, 38, 51, 0x16e},
+  {0x35, 0, 5, 0x15b},
+  {0x35, 0, 2, 0x160},
+  {0x35, 0, 35, 0x161},
+  {0x35, 45, 47, 0x165},
+  {0x35, 0, 46, 0x15c},
+  {0x35, 45, 32, 0x15d},
+  {0x35, 0, 2, 0x152},
+  {0x35, 0, 30, 0x153},
+  {0x35, 40, 42, 0x15a},
+  {0x35, 41, 39, 0x151},
+  {0x35, 0, 10, 0x121},
+  {0x35, 0, 5, 0x138},
+  {0x35, 0, 2, 0x143},
+  {0x35, 0, 24, 0x147},
+  {0x35, 23, 34, 0x148},
+  {0x35, 0, 22, 0x139},
+  {0x35, 32, 34, 0x142},
+  {0x35, 0, 2, 0x127},
+  {0x35, 0, 30, 0x12a},
+  {0x35, 31, 18, 0x135},
+  {0x35, 30, 28, 0x126},
+  {0x35, 0, 4, 0x10e},
+  {0x35, 0, 2, 0x119},
+  {0x35, 0, 14, 0x11e},
+  {0x35, 137, 26, 0x120},
+  {0x35, 23, 25, 0x118},
+  {0x35, 0, 3, 0x10b},
+  {0x35, 0, 23, 0x10c},
+  {0x35, 9, 0, 0x10d},
+  {0x5, 0, 0, 0x110},
+  {0x35, 7, 20, 0x10a},
+  {0x35, 0, 25, 0xce},
+  {0x35, 0, 12, 0xee},
+  {0x35, 0, 6, 0xf9},
+  {0x35, 0, 2, 0x100},
+  {0x35, 0, 13, 0x101},
+  {0x35, 129, 14, 0x107},
+  {0x35, 1, 0, 0xfa},
+  {0x5, 0, 0, 0x10d},
+  {0x35, 11, 9, 0xfd},
+  {0x35, 0, 2, 0xf0},
+  {0x35, 0, 148, 0xf1},
+  {0x35, 6, 8, 0xf8},
+  {0x35, 7, 0, 0xef},
+  {0x5, 0, 0, 0x106},
+  {0x35, 0, 7, 0xda},
+  {0x35, 0, 3, 0xde},
+  {0x35, 0, 3, 0xe0},
+  {0x35, 2, 0, 0xe1},
+  {0x5, 0, 0, 0x103},
+  {0x35, 1, 0, 0xdc},
+  {0x5, 0, 0, 0x102},
+  {0x35, 209, 172, 0xdd},
+  {0x35, 0, 2, 0xd2},
+  {0x35, 0, 253, 0xd3},
+  {0x35, 252, 253, 0xd4},
+  {0x35, 252, 251, 0xd1},
+  {0x35, 0, 10, 0xb9},
+  {0x35, 0, 5, 0xc1},
+  {0x35, 0, 2, 0xc7},
+  {0x35, 0, 248, 0xcb},
+  {0x35, 247, 246, 0xcd},
+  {0x35, 0, 245, 0xc5},
+  {0x35, 244, 245, 0xc6},
+  {0x35, 0, 2, 0xbb},
+  {0x35, 0, 244, 0xbf},
+  {0x35, 162, 242, 0xc0},
+  {0x35, 241, 240, 0xba},
+  {0x35, 0, 4, 0xb2},
+  {0x35, 0, 2, 0xb5},
+  {0x35, 0, 239, 0xb6},
+  {0x35, 237, 236, 0xb8},
+  {0x35, 236, 237, 0xb4},
+  {0x35, 0, 2, 0xad},
+  {0x35, 0, 234, 0xb0},
+  {0x35, 233, 234, 0xb1},
+  {0x35, 156, 232, 0xac},
+  {0x35, 0, 42, 0x52},
+  {0x35, 0, 21, 0x7e},
+  {0x35, 0, 10, 0x96},
+  {0x35, 0, 5, 0xa4},
+  {0x35, 0, 2, 0xa8},
+  {0x35, 0, 226, 0xa9},
+  {0x35, 224, 226, 0xaa},
+  {0x35, 0, 223, 0xa5},
+  {0x35, 224, 223, 0xa6},
+  {0x35, 0, 2, 0x9e},
+  {0x35, 0, 221, 0x9f},
+  {0x35, 220, 221, 0xa2},
+  {0x35, 220, 219, 0x98},
+  {0x35, 0, 5, 0x8c},
+  {0x35, 0, 2, 0x90},
+  {0x35, 0, 217, 0x91},
+  {0x35, 216, 215, 0x94},
+  {0x35, 0, 214, 0x8d},
+  {0x35, 213, 212, 0x8e},
+  {0x35, 0, 2, 0x85},
+  {0x35, 0, 210, 0x86},
+  {0x35, 209, 211, 0x8a},
+  {0x35, 210, 209, 0x7f},
+  {0x35, 0, 10, 0x64},
+  {0x35, 0, 5, 0x73},
+  {0x35, 0, 2, 0x7a},
+  {0x35, 0, 205, 0x7b},
+  {0x35, 153, 205, 0x7d},
+  {0x35, 0, 204, 0x77},
+  {0x35, 203, 202, 0x79},
+  {0x35, 0, 2, 0x6c},
+  {0x35, 0, 200, 0x6d},
+  {0x35, 199, 200, 0x72},
+  {0x35, 197, 199, 0x6a},
+  {0x35, 0, 4, 0x5b},
+  {0x35, 0, 2, 0x60},
+  {0x35, 0, 195, 0x62},
+  {0x35, 193, 195, 0x63},
+  {0x35, 192, 193, 0x5c},
+  {0x35, 0, 2, 0x54},
+  {0x35, 0, 192, 0x55},
+  {0x35, 191, 189, 0x57},
+  {0x35, 188, 190, 0x53},
+  {0x35, 0, 21, 0x2d},
+  {0x35, 0, 10, 0x3e},
+  {0x35, 0, 5, 0x46},
+  {0x35, 0, 2, 0x4f},
+  {0x35, 0, 185, 0x50},
+  {0x35, 182, 183, 0x51},
+  {0x35, 0, 181, 0x48},
+  {0x35, 181, 182, 0x4e},
+  {0x35, 0, 2, 0x41},
+  {0x35, 0, 180, 0x43},
+  {0x35, 179, 178, 0x44},
+  {0x35, 177, 176, 0x3f},
+  {0x35, 0, 5, 0x33},
+  {0x35, 0, 2, 0x38},
+  {0x35, 0, 175, 0x3c},
+  {0x35, 174, 172, 0x3d},
+  {0x35, 0, 173, 0x36},
+  {0x35, 124, 171, 0x37},
+  {0x35, 0, 2, 0x2f},
+  {0x35, 0, 169, 0x30},
+  {0x35, 168, 169, 0x31},
+  {0x35, 166, 167, 0x2e},
+  {0x35, 0, 10, 0x17},
+  {0x35, 0, 5, 0x21},
+  {0x35, 0, 2, 0x26},
+  {0x35, 0, 162, 0x29},
+  {0x35, 163, 162, 0x2b},
+  {0x35, 0, 160, 0x22},
+  {0x35, 153, 161, 0x25},
+  {0x35, 0, 2, 0x19},
+  {0x35, 0, 159, 0x1d},
+  {0x35, 158, 157, 0x1e},
+  {0x35, 156, 155, 0x18},
+  {0x35, 0, 4, 0xd},
+  {0x35, 0, 2, 0x11},
+  {0x35, 0, 154, 0x13},
+  {0x35, 153, 152, 0x15},
+  {0x35, 150, 152, 0xe},
+  {0x35, 0, 2, 0x3},
+  {0x35, 0, 149, 0x7},
+  {0x35, 147, 149, 0x8},
+  {0x35, 146, 147, 0x2},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 140, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 143, 144, 0x1},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 136, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 139, 0, 0x1},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 132, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 135, 0, 0x6},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 128, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 131, 0, 0x2},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 124, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 127, 0, 0x0},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 120, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 123, 0, 0x5},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 116, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 119, 120, 0x3},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 112, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 115, 0xfffffe7f},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 108, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 110, 0, 0x1},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 103, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 105, 0, 0x3},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 98, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 100, 0, 0x4},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 93, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 95, 0, 0x5},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 88, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 90, 0, 0x9},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 83, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 85, 0, 0xa},
+  {0x6, 0, 0, 0x30005},
+  {0x20, 0, 0, 0x24},
+  {0x15, 0, 77, 0x0},
+  {0x20, 0, 0, 0x20},
+  {0x15, 80, 79, 0x4},
+  {0x20, 0, 0, 0x2c},
+  {0x15, 0, 73, 0x0},
+  {0x20, 0, 0, 0x28},
+  {0x45, 77, 76, 0xfffdb7cc},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 69, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 72, 0, 0x10},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 65, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 68, 0, 0xf},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 61, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 64, 0, 0x3},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 57, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 60, 0, 0x4},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 53, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 56, 0, 0x53564d41},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 49, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 52, 0, 0x29},
+  {0x6, 0, 0, 0x30004},
+  {0x20, 0, 0, 0x24},
+  {0x15, 0, 44, 0x0},
+  {0x20, 0, 0, 0x20},
+  {0x45, 48, 47, 0xfffffff8},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 40, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x15, 43, 0, 0x3},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 36, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x15, 39, 0, 0x1},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 32, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x15, 35, 0, 0x2},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 28, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x15, 31, 0, 0x6},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 24, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x15, 27, 0, 0x7},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 20, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x15, 23, 0, 0x5},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 16, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x15, 19, 0, 0x0},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 12, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x15, 15, 0, 0x406},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 8, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x15, 0, 12, 0x4},
+  {0x20, 0, 0, 0x24},
+  {0x15, 0, 4, 0x0},
+  {0x20, 0, 0, 0x20},
+  {0x45, 8, 7, 0xfff1e3fc},
+  {0x20, 0, 0, 0x14},
+  {0x15, 1, 0, 0x0},
+  {0x6, 0, 0, 0x30003},
+  {0x20, 0, 0, 0x10},
+  {0x15, 2, 0, 0x2da4},
+  {0x6, 0, 0, 0x30002},
+  {0x6, 0, 0, 0x50001},
+  {0x6, 0, 0, 0x7fff0000},
+  {0x6, 0, 0, 0x30001},
+};
+#elif defined(__aarch64__)
+struct sock_filter kTestSeccompFilter[] = {
+  {0x20, 0, 0, 0x4},
+  {0x15, 1, 0, 0xc00000b7},
+  {0x6, 0, 0, 0x30006},
+  {0x20, 0, 0, 0x0},
+  {0x35, 0, 51, 0x88},
+  {0x35, 0, 25, 0xba},
+  {0x35, 0, 12, 0xdf},
+  {0x35, 0, 6, 0xea},
+  {0x35, 0, 3, 0x104},
+  {0x35, 0, 1, 0x114},
+  {0x35, 86, 85, 0x116},
+  {0x35, 85, 81, 0x105},
+  {0x35, 0, 84, 0xf2},
+  {0x35, 83, 82, 0xf3},
+  {0x35, 0, 2, 0xe4},
+  {0x35, 0, 77, 0xe6},
+  {0x35, 92, 80, 0xe9},
+  {0x35, 0, 79, 0xe2},
+  {0x35, 78, 97, 0xe3},
+  {0x35, 0, 6, 0xd1},
+  {0x35, 0, 3, 0xd9},
+  {0x35, 0, 1, 0xdd},
+  {0x35, 100, 73, 0xde},
+  {0x35, 69, 73, 0xdc},
+  {0x35, 0, 68, 0xd5},
+  {0x35, 67, 71, 0xd6},
+  {0x35, 0, 2, 0xcc},
+  {0x35, 0, 69, 0xce},
+  {0x35, 68, 64, 0xd0},
+  {0x35, 0, 66, 0xc7},
+  {0x35, 65, 99, 0xc8},
+  {0x35, 0, 12, 0x9e},
+  {0x35, 0, 6, 0xa6},
+  {0x35, 0, 3, 0xa9},
+  {0x35, 0, 1, 0xac},
+  {0x35, 61, 57, 0xb3},
+  {0x35, 60, 56, 0xaa},
+  {0x35, 0, 58, 0xa7},
+  {0x35, 58, 98, 0xa8},
+  {0x35, 0, 2, 0xa1},
+  {0x35, 0, 56, 0xa3},
+  {0x35, 55, 51, 0xa4},
+  {0x35, 0, 50, 0x9f},
+  {0x35, 49, 52, 0xa0},
+  {0x35, 0, 6, 0x94},
+  {0x35, 0, 3, 0x97},
+  {0x35, 0, 1, 0x9c},
+  {0x35, 49, 45, 0x9d},
+  {0x35, 48, 47, 0x99},
+  {0x35, 0, 43, 0x95},
+  {0x35, 42, 45, 0x96},
+  {0x35, 0, 2, 0x8b},
+  {0x35, 0, 40, 0x8e},
+  {0x35, 42, 43, 0x8f},
+  {0x35, 0, 42, 0x89},
+  {0x35, 41, 37, 0x8a},
+  {0x35, 0, 25, 0x4e},
+  {0x35, 0, 12, 0x65},
+  {0x35, 0, 6, 0x80},
+  {0x35, 0, 3, 0x83},
+  {0x35, 0, 1, 0x85},
+  {0x35, 31, 35, 0x86},
+  {0x35, 30, 117, 0x84},
+  {0x35, 0, 29, 0x81},
+  {0x35, 122, 115, 0x82},
+  {0x35, 0, 2, 0x72},
+  {0x35, 0, 30, 0x7c},
+  {0x35, 29, 25, 0x7d},
+  {0x35, 0, 24, 0x66},
+  {0x35, 118, 27, 0x71},
+  {0x35, 0, 6, 0x5b},
+  {0x35, 0, 3, 0x61},
+  {0x35, 0, 1, 0x63},
+  {0x35, 23, 22, 0x64},
+  {0x35, 155, 22, 0x62},
+  {0x35, 0, 20, 0x5c},
+  {0x35, 16, 20, 0x5d},
+  {0x35, 0, 2, 0x58},
+  {0x35, 0, 17, 0x59},
+  {0x35, 13, 17, 0x5a},
+  {0x35, 0, 15, 0x4f},
+  {0x35, 15, 11, 0x51},
+  {0x35, 0, 15, 0x2c},
+  {0x35, 0, 6, 0x3b},
+  {0x35, 0, 3, 0x3e},
+  {0x35, 0, 1, 0x48},
+  {0x35, 10, 6, 0x4a},
+  {0x35, 9, 5, 0x44},
+  {0x35, 0, 4, 0x3c},
+  {0x35, 6, 7, 0x3d},
+  {0x35, 0, 3, 0x34},
+  {0x35, 0, 4, 0x38},
+  {0x35, 4, 0, 0x3a},
+  {0x5, 0, 0, 0x104},
+  {0x35, 0, 2, 0x2d},
+  {0x35, 1, 0, 0x33},
+  {0x5, 0, 0, 0x102},
+  {0x5, 0, 0, 0x102},
+  {0x35, 0, 5, 0x1d},
+  {0x35, 0, 2, 0x21},
+  {0x35, 0, 254, 0x27},
+  {0x35, 253, 254, 0x2b},
+  {0x35, 0, 251, 0x1e},
+  {0x35, 250, 252, 0x20},
+  {0x35, 0, 2, 0x14},
+  {0x35, 0, 248, 0x19},
+  {0x35, 249, 179, 0x1a},
+  {0x35, 0, 248, 0x11},
+  {0x35, 247, 246, 0x13},
+  {0x20, 0, 0, 0x24},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 235, 0xffffffff},
+  {0x20, 0, 0, 0x20},
+  {0x45, 0, 233, 0x80000000},
+  {0x20, 0, 0, 0x20},
+  {0x15, 238, 239, 0x4},
+  {0x20, 0, 0, 0x24},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 228, 0xffffffff},
+  {0x20, 0, 0, 0x20},
+  {0x45, 0, 226, 0x80000000},
+  {0x20, 0, 0, 0x20},
+  {0x45, 233, 231, 0xfffffff8},
+  {0x20, 0, 0, 0x2c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 221, 0xffffffff},
+  {0x20, 0, 0, 0x28},
+  {0x45, 0, 219, 0x80000000},
+  {0x20, 0, 0, 0x28},
+  {0x45, 226, 224, 0xfffdb7cc},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 214, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 212, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 217, 219, 0x1},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 207, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 205, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 210, 0, 0x10},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 200, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 198, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 203, 0, 0xf},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 193, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 191, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 196, 0, 0x3},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 186, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 184, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 189, 0, 0x4},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 179, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 177, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 182, 0, 0x53564d41},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 172, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 170, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 175, 0, 0x29},
+  {0x6, 0, 0, 0x30005},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 164, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 162, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 167, 0, 0x1393},
+  {0x6, 0, 0, 0x30004},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 156, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 154, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 159, 0, 0x1},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 149, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 147, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 152, 0, 0x6},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 142, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 140, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 145, 0, 0x2},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 135, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 133, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 138, 0, 0x0},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 128, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 126, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 131, 0, 0x5},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 121, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 119, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 124, 126, 0x3},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 114, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 112, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 117, 0xfffffe7f},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 107, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 105, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 109, 0, 0x1},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 99, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 97, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 101, 0, 0x3},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 91, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 89, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 93, 0, 0x4},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 83, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 81, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 85, 0, 0x5},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 75, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 73, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 77, 0, 0x9},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 67, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 65, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 69, 0, 0xa},
+  {0x6, 0, 0, 0x30003},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 58, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 56, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x15, 61, 0, 0x3},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 51, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 49, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x15, 54, 0, 0x1},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 44, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 42, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x15, 47, 0, 0x2},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 37, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 35, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x15, 40, 0, 0x6},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 30, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 28, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x15, 33, 0, 0x7},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 23, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 21, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x15, 26, 0, 0x5},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 16, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 14, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x15, 19, 0, 0x0},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 9, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 7, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x15, 12, 0, 0x406},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 4, 0, 0x0},
+  {0x15, 0, 2, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 1, 0, 0x80000000},
+  {0x6, 0, 0, 0x30002},
+  {0x20, 0, 0, 0x18},
+  {0x15, 0, 6, 0x4},
+  {0x20, 0, 0, 0x24},
+  {0x15, 0, 4, 0x0},
+  {0x20, 0, 0, 0x20},
+  {0x45, 2, 0, 0xffe1e3fc},
+  {0x6, 0, 0, 0x7fff0000},
+  {0x6, 0, 0, 0x50001},
+  {0x6, 0, 0, 0x30001},
+};
+#elif defined(__i386__)
+struct sock_filter kTestSeccompFilter[] = {
+  {0x20, 0, 0, 0x4},
+  {0x15, 1, 0, 0x40000003},
+  {0x6, 0, 0, 0x30007},
+  {0x20, 0, 0, 0x0},
+  {0x45, 0, 1, 0x40000000},
+  {0x6, 0, 0, 0x30006},
+  {0x35, 0, 87, 0x94},
+  {0x35, 0, 43, 0xdd},
+  {0x35, 0, 20, 0x11c},
+  {0x35, 0, 10, 0x13f},
+  {0x35, 0, 5, 0x149},
+  {0x35, 0, 2, 0x163},
+  {0x35, 0, 79, 0x164},
+  {0x35, 78, 73, 0x165},
+  {0x35, 0, 78, 0x14c},
+  {0x35, 71, 76, 0x161},
+  {0x35, 0, 2, 0x141},
+  {0x35, 0, 74, 0x144},
+  {0x35, 73, 68, 0x145},
+  {0x35, 67, 73, 0x140},
+  {0x35, 0, 4, 0x12d},
+  {0x35, 0, 2, 0x136},
+  {0x35, 0, 69, 0x137},
+  {0x35, 68, 63, 0x138},
+  {0x35, 68, 62, 0x134},
+  {0x35, 0, 2, 0x127},
+  {0x35, 0, 66, 0x128},
+  {0x35, 65, 59, 0x12c},
+  {0x35, 63, 64, 0x11d},
+  {0x35, 0, 11, 0xfe},
+  {0x35, 0, 6, 0x10a},
+  {0x35, 0, 3, 0x10e},
+  {0x35, 1, 0, 0x10f},
+  {0x5, 0, 0, 0x135},
+  {0x35, 57, 52, 0x110},
+  {0x35, 0, 56, 0x10c},
+  {0x35, 55, 50, 0x10d},
+  {0x35, 0, 2, 0x102},
+  {0x35, 0, 54, 0x103},
+  {0x35, 135, 52, 0x109},
+  {0x35, 51, 52, 0x101},
+  {0x35, 0, 4, 0xef},
+  {0x35, 0, 2, 0xf1},
+  {0x35, 0, 48, 0xfc},
+  {0x35, 42, 48, 0xfd},
+  {0x35, 153, 46, 0xf0},
+  {0x35, 0, 3, 0xe0},
+  {0x35, 0, 45, 0xe1},
+  {0x35, 0, 43, 0xee},
+  {0x5, 0, 0, 0x12a},
+  {0x35, 41, 252, 0xde},
+  {0x35, 0, 20, 0xb6},
+  {0x35, 0, 10, 0xc7},
+  {0x35, 0, 5, 0xd2},
+  {0x35, 0, 2, 0xd9},
+  {0x35, 0, 36, 0xdb},
+  {0x35, 30, 177, 0xdc},
+  {0x35, 0, 29, 0xd3},
+  {0x35, 28, 34, 0xd4},
+  {0x35, 0, 2, 0xcd},
+  {0x35, 0, 32, 0xce},
+  {0x35, 31, 25, 0xd1},
+  {0x35, 24, 30, 0xcb},
+  {0x35, 0, 4, 0xbf},
+  {0x35, 0, 2, 0xc1},
+  {0x35, 0, 21, 0xc5},
+  {0x35, 20, 26, 0xc6},
+  {0x35, 231, 25, 0xc0},
+  {0x35, 0, 2, 0xb9},
+  {0x35, 0, 17, 0xba},
+  {0x35, 21, 22, 0xbb},
+  {0x35, 21, 15, 0xb8},
+  {0x35, 0, 9, 0xa9},
+  {0x35, 0, 4, 0xb0},
+  {0x35, 0, 2, 0xb2},
+  {0x35, 0, 16, 0xb4},
+  {0x35, 15, 16, 0xb5},
+  {0x35, 15, 14, 0xb1},
+  {0x35, 0, 2, 0xab},
+  {0x35, 0, 13, 0xac},
+  {0x35, 12, 157, 0xad},
+  {0x35, 5, 10, 0xaa},
+  {0x35, 0, 5, 0xa2},
+  {0x35, 0, 2, 0xa5},
+  {0x35, 0, 8, 0xa6},
+  {0x35, 7, 6, 0xa8},
+  {0x35, 0, 6, 0xa4},
+  {0x5, 0, 0, 0x105},
+  {0x35, 0, 2, 0x98},
+  {0x35, 0, 2, 0x9e},
+  {0x35, 1, 2, 0x9f},
+  {0x35, 1, 0, 0x96},
+  {0x5, 0, 0, 0x102},
+  {0x5, 0, 0, 0x100},
+  {0x35, 0, 40, 0x4f},
+  {0x35, 0, 20, 0x6e},
+  {0x35, 0, 10, 0x7d},
+  {0x35, 0, 5, 0x8a},
+  {0x35, 0, 2, 0x8e},
+  {0x35, 0, 250, 0x90},
+  {0x35, 249, 250, 0x91},
+  {0x35, 0, 247, 0x8c},
+  {0x35, 246, 247, 0x8d},
+  {0x35, 0, 2, 0x7f},
+  {0x35, 0, 246, 0x85},
+  {0x35, 245, 243, 0x86},
+  {0x35, 243, 156, 0x7e},
+  {0x35, 0, 4, 0x76},
+  {0x35, 0, 2, 0x79},
+  {0x35, 0, 241, 0x7a},
+  {0x35, 240, 239, 0x7b},
+  {0x35, 238, 239, 0x77},
+  {0x35, 0, 2, 0x72},
+  {0x35, 0, 236, 0x73},
+  {0x35, 234, 236, 0x75},
+  {0x35, 235, 233, 0x6f},
+  {0x35, 0, 9, 0x60},
+  {0x35, 0, 4, 0x66},
+  {0x35, 0, 2, 0x6a},
+  {0x35, 0, 229, 0x6c},
+  {0x35, 230, 229, 0x6d},
+  {0x35, 229, 145, 0x67},
+  {0x35, 0, 2, 0x63},
+  {0x35, 0, 225, 0x64},
+  {0x35, 224, 226, 0x65},
+  {0x35, 225, 224, 0x62},
+  {0x35, 0, 4, 0x57},
+  {0x35, 0, 2, 0x5a},
+  {0x35, 0, 170, 0x5b},
+  {0x35, 219, 220, 0x5c},
+  {0x35, 218, 220, 0x59},
+  {0x35, 0, 2, 0x51},
+  {0x35, 0, 216, 0x52},
+  {0x35, 215, 216, 0x53},
+  {0x35, 215, 216, 0x50},
+  {0x35, 0, 20, 0x29},
+  {0x35, 0, 10, 0x38},
+  {0x35, 0, 5, 0x41},
+  {0x35, 0, 2, 0x46},
+  {0x35, 0, 209, 0x48},
+  {0x35, 209, 210, 0x4e},
+  {0x35, 0, 209, 0x43},
+  {0x35, 208, 207, 0x44},
+  {0x35, 0, 2, 0x3d},
+  {0x35, 0, 206, 0x3e},
+  {0x35, 204, 203, 0x3f},
+  {0x35, 202, 204, 0x3c},
+  {0x35, 0, 4, 0x30},
+  {0x35, 0, 2, 0x33},
+  {0x35, 0, 201, 0x36},
+  {0x35, 152, 199, 0x37},
+  {0x35, 198, 199, 0x31},
+  {0x35, 0, 2, 0x2d},
+  {0x35, 0, 196, 0x2e},
+  {0x35, 195, 194, 0x2f},
+  {0x35, 195, 194, 0x2b},
+  {0x35, 0, 9, 0x17},
+  {0x35, 0, 4, 0x1f},
+  {0x35, 0, 2, 0x22},
+  {0x35, 0, 191, 0x25},
+  {0x35, 188, 182, 0x26},
+  {0x35, 187, 189, 0x21},
+  {0x35, 0, 2, 0x19},
+  {0x35, 0, 187, 0x1d},
+  {0x35, 184, 185, 0x1e},
+  {0x35, 184, 183, 0x18},
+  {0x35, 0, 4, 0xe},
+  {0x35, 0, 2, 0x12},
+  {0x35, 0, 180, 0x13},
+  {0x35, 181, 180, 0x15},
+  {0x35, 180, 178, 0x11},
+  {0x35, 0, 2, 0x3},
+  {0x35, 0, 177, 0x8},
+  {0x35, 176, 175, 0xd},
+  {0x35, 174, 175, 0x2},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 168, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 171, 0, 0x1},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 164, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 167, 0, 0x6},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 160, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 163, 0, 0x2},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 156, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 159, 0, 0x0},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 152, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 155, 0, 0x5},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 148, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 151, 152, 0x3},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 144, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 147, 0xfffffe7f},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 140, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 142, 0, 0x1},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 135, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 137, 0, 0x3},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 130, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 132, 0, 0x4},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 125, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 127, 0, 0x5},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 120, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 122, 0, 0x9},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 115, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 117, 0, 0xa},
+  {0x6, 0, 0, 0x30005},
+  {0x20, 0, 0, 0x24},
+  {0x15, 0, 109, 0x0},
+  {0x20, 0, 0, 0x20},
+  {0x15, 112, 111, 0x4},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 105, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 108, 0, 0x10},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 101, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 104, 0, 0xf},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 97, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 100, 0, 0x3},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 93, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 96, 0, 0x4},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 89, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 92, 0, 0x53564d41},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 85, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 88, 0, 0x29},
+  {0x6, 0, 0, 0x30004},
+  {0x20, 0, 0, 0x24},
+  {0x15, 0, 80, 0x0},
+  {0x20, 0, 0, 0x20},
+  {0x45, 84, 83, 0xfffffff8},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 76, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 79, 0, 0x8},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 72, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 75, 0, 0xd},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 68, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 71, 0, 0xa},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 64, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 67, 0, 0x9},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 60, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 63, 0, 0xc},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 56, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 59, 0, 0xb},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 52, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 55, 0, 0x11},
+  {0x20, 0, 0, 0x14},
+  {0x15, 0, 48, 0x0},
+  {0x20, 0, 0, 0x10},
+  {0x15, 51, 50, 0x10},
+  {0x20, 0, 0, 0x2c},
+  {0x15, 0, 44, 0x0},
+  {0x20, 0, 0, 0x28},
+  {0x45, 48, 47, 0xfffdb7cc},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 40, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x15, 43, 0, 0x3},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 36, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x15, 39, 0, 0x1},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 32, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x15, 35, 0, 0x2},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 28, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x15, 31, 0, 0x6},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 24, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x15, 27, 0, 0x7},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 20, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x15, 23, 0, 0x5},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 16, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x15, 19, 0, 0x0},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 12, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x15, 15, 0, 0x406},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 0, 8, 0x0},
+  {0x20, 0, 0, 0x18},
+  {0x15, 0, 12, 0x4},
+  {0x20, 0, 0, 0x24},
+  {0x15, 0, 4, 0x0},
+  {0x20, 0, 0, 0x20},
+  {0x45, 8, 7, 0xfff363fc},
+  {0x20, 0, 0, 0x14},
+  {0x15, 1, 0, 0x0},
+  {0x6, 0, 0, 0x30003},
+  {0x20, 0, 0, 0x10},
+  {0x15, 2, 0, 0x9d0},
+  {0x6, 0, 0, 0x30002},
+  {0x6, 0, 0, 0x50001},
+  {0x6, 0, 0, 0x7fff0000},
+  {0x6, 0, 0, 0x30001},
+};
+#elif defined(__x86_64__)
+struct sock_filter kTestSeccompFilter[] = {
+  {0x20, 0, 0, 0x4},
+  {0x15, 1, 0, 0xc000003e},
+  {0x6, 0, 0, 0x30007},
+  {0x20, 0, 0, 0x0},
+  {0x45, 0, 1, 0x40000000},
+  {0x6, 0, 0, 0x30006},
+  {0x35, 0, 59, 0x7f},
+  {0x35, 0, 29, 0xe4},
+  {0x35, 0, 14, 0x111},
+  {0x35, 0, 7, 0x120},
+  {0x35, 0, 3, 0x13c},
+  {0x35, 0, 1, 0x13f},
+  {0x35, 102, 95, 0x140},
+  {0x35, 101, 94, 0x13e},
+  {0x35, 0, 1, 0x123},
+  {0x35, 99, 94, 0x126},
+  {0x35, 98, 91, 0x121},
+  {0x35, 0, 3, 0x119},
+  {0x35, 0, 1, 0x11d},
+  {0x35, 95, 88, 0x11e},
+  {0x35, 94, 89, 0x11a},
+  {0x35, 0, 86, 0x112},
+  {0x35, 85, 92, 0x118},
+  {0x35, 0, 6, 0xf8},
+  {0x35, 0, 3, 0x106},
+  {0x35, 0, 1, 0x10e},
+  {0x35, 88, 83, 0x110},
+  {0x35, 80, 82, 0x107},
+  {0x35, 0, 86, 0x101},
+  {0x35, 78, 80, 0x102},
+  {0x35, 0, 4, 0xea},
+  {0x35, 0, 1, 0xec},
+  {0x35, 77, 82, 0xf7},
+  {0x35, 74, 0, 0xeb},
+  {0x5, 0, 0, 0x12a},
+  {0x35, 0, 89, 0xe5},
+  {0x35, 73, 78, 0xe7},
+  {0x35, 0, 15, 0xac},
+  {0x35, 0, 7, 0xcb},
+  {0x35, 0, 3, 0xd9},
+  {0x35, 0, 1, 0xdc},
+  {0x35, 73, 66, 0xdd},
+  {0x35, 67, 65, 0xda},
+  {0x35, 0, 1, 0xd5},
+  {0x35, 70, 65, 0xd6},
+  {0x35, 62, 69, 0xd4},
+  {0x35, 0, 4, 0xbb},
+  {0x35, 0, 1, 0xc9},
+  {0x35, 118, 61, 0xca},
+  {0x35, 0, 65, 0xc8},
+  {0x5, 0, 0, 0x121},
+  {0x35, 0, 56, 0xae},
+  {0x35, 57, 62, 0xba},
+  {0x35, 0, 6, 0x8a},
+  {0x35, 0, 3, 0x95},
+  {0x35, 0, 1, 0x9d},
+  {0x35, 58, 166, 0x9e},
+  {0x35, 57, 52, 0x97},
+  {0x35, 0, 56, 0x8c},
+  {0x35, 55, 50, 0x8e},
+  {0x35, 0, 3, 0x83},
+  {0x35, 0, 1, 0x87},
+  {0x35, 45, 52, 0x88},
+  {0x35, 44, 46, 0x84},
+  {0x35, 0, 50, 0x80},
+  {0x35, 49, 44, 0x81},
+  {0x35, 0, 28, 0x3b},
+  {0x35, 0, 14, 0x69},
+  {0x35, 0, 7, 0x74},
+  {0x35, 0, 3, 0x79},
+  {0x35, 0, 1, 0x7c},
+  {0x35, 36, 38, 0x7e},
+  {0x35, 35, 42, 0x7a},
+  {0x35, 0, 1, 0x77},
+  {0x35, 35, 33, 0x78},
+  {0x35, 34, 32, 0x76},
+  {0x35, 0, 3, 0x6e},
+  {0x35, 0, 1, 0x71},
+  {0x35, 31, 29, 0x73},
+  {0x35, 35, 30, 0x6f},
+  {0x35, 0, 27, 0x6b},
+  {0x35, 33, 28, 0x6d},
+  {0x35, 0, 6, 0x4a},
+  {0x35, 0, 3, 0x62},
+  {0x35, 0, 1, 0x67},
+  {0x35, 24, 29, 0x68},
+  {0x35, 23, 28, 0x66},
+  {0x35, 0, 27, 0x4c},
+  {0x35, 21, 19, 0x60},
+  {0x35, 0, 3, 0x3f},
+  {0x35, 0, 1, 0x48},
+  {0x35, 18, 174, 0x49},
+  {0x35, 15, 17, 0x40},
+  {0x35, 0, 14, 0x3c},
+  {0x35, 238, 15, 0x3e},
+  {0x35, 0, 15, 0x1d},
+  {0x35, 0, 6, 0x31},
+  {0x35, 0, 3, 0x36},
+  {0x35, 0, 1, 0x39},
+  {0x35, 15, 8, 0x3a},
+  {0x35, 9, 14, 0x37},
+  {0x35, 0, 6, 0x33},
+  {0x35, 238, 12, 0x35},
+  {0x35, 0, 3, 0x27},
+  {0x35, 0, 1, 0x29},
+  {0x35, 4, 2, 0x2c},
+  {0x35, 8, 3, 0x28},
+  {0x35, 1, 0, 0x20},
+  {0x5, 0, 0, 0x105},
+  {0x35, 5, 0, 0x24},
+  {0x5, 0, 0, 0x104},
+  {0x35, 0, 7, 0xb},
+  {0x35, 0, 4, 0x15},
+  {0x35, 0, 2, 0x1a},
+  {0x35, 233, 0, 0x1c},
+  {0x5, 0, 0, 0x100},
+  {0x35, 254, 253, 0x16},
+  {0x35, 0, 253, 0x12},
+  {0x35, 252, 253, 0x13},
+  {0x35, 0, 3, 0x6},
+  {0x35, 0, 1, 0x9},
+  {0x35, 233, 240, 0xa},
+  {0x35, 248, 247, 0x7},
+  {0x35, 0, 247, 0x4},
+  {0x35, 246, 245, 0x5},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 239, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 237, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 239, 0, 0x1},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 232, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 230, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 232, 0, 0x6},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 225, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 223, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 225, 0, 0x2},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 218, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 216, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 218, 0, 0x0},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 211, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 209, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 211, 0, 0x5},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 204, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 202, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 204, 205, 0x3},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 197, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 195, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 197, 0xfffffe7f},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 190, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 188, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 189, 0, 0x1},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 182, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 180, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 181, 0, 0x3},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 174, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 172, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 173, 0, 0x4},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 166, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 164, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 165, 0, 0x5},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 158, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 156, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 157, 0, 0x9},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 150, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 148, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x54, 0, 0, 0xfffffe7f},
+  {0x15, 149, 0, 0xa},
+  {0x6, 0, 0, 0x30005},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 141, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 139, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 141, 0, 0x10},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 134, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 132, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 134, 0, 0xf},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 127, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 125, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 127, 0, 0x3},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 120, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 118, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 120, 0, 0x4},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 113, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 111, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 113, 0, 0x53564d41},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 106, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 104, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 106, 0, 0x29},
+  {0x6, 0, 0, 0x30004},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 98, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 96, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x15, 98, 0, 0x3},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 91, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 89, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x15, 91, 0, 0x1},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 84, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 82, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x15, 84, 0, 0x2},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 77, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 75, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x15, 77, 0, 0x6},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 70, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 68, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x15, 70, 0, 0x7},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 63, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 61, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x15, 63, 0, 0x5},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 56, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 54, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x15, 56, 0, 0x0},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 49, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 47, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x15, 49, 0, 0x406},
+  {0x20, 0, 0, 0x1c},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 42, 0xffffffff},
+  {0x20, 0, 0, 0x18},
+  {0x45, 0, 40, 0x80000000},
+  {0x20, 0, 0, 0x18},
+  {0x15, 0, 43, 0x4},
+  {0x20, 0, 0, 0x24},
+  {0x15, 0, 41, 0x0},
+  {0x20, 0, 0, 0x20},
+  {0x45, 39, 38, 0xffe363fc},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 31, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 29, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 31, 0, 0xa57},
+  {0x6, 0, 0, 0x30003},
+  {0x20, 0, 0, 0x14},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 23, 0xffffffff},
+  {0x20, 0, 0, 0x10},
+  {0x45, 0, 21, 0x80000000},
+  {0x20, 0, 0, 0x10},
+  {0x15, 23, 24, 0x1},
+  {0x20, 0, 0, 0x24},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 16, 0xffffffff},
+  {0x20, 0, 0, 0x20},
+  {0x45, 0, 14, 0x80000000},
+  {0x20, 0, 0, 0x20},
+  {0x15, 16, 15, 0x4},
+  {0x20, 0, 0, 0x24},
+  {0x15, 3, 0, 0x0},
+  {0x15, 0, 9, 0xffffffff},
+  {0x20, 0, 0, 0x20},
+  {0x45, 0, 7, 0x80000000},
+  {0x20, 0, 0, 0x20},
+  {0x45, 10, 9, 0xfffffff8},
+  {0x20, 0, 0, 0x2c},
+  {0x15, 4, 0, 0x0},
+  {0x15, 0, 2, 0xffffffff},
+  {0x20, 0, 0, 0x28},
+  {0x45, 1, 0, 0x80000000},
+  {0x6, 0, 0, 0x30002},
+  {0x20, 0, 0, 0x28},
+  {0x45, 2, 1, 0xfffdb7cc},
+  {0x6, 0, 0, 0x50001},
+  {0x6, 0, 0, 0x7fff0000},
+  {0x6, 0, 0, 0x30001},
+};
+#endif
+
+struct sock_fprog GetTestSeccompFilterProgram() {
+  struct sock_fprog prog = {
+    .len = sizeof(kTestSeccompFilter) / sizeof(struct sock_filter),
+    .filter = kTestSeccompFilter
+  };
+  return prog;
+}
diff --git a/tests/tests/os/jni/seccomp_sample_program.h b/tests/tests/os/jni/seccomp_sample_program.h
new file mode 100644
index 0000000..1293572
--- /dev/null
+++ b/tests/tests/os/jni/seccomp_sample_program.h
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#include <linux/filter.h>
+
+struct sock_fprog GetTestSeccompFilterProgram();
diff --git a/tests/tests/os/src/android/os/cts/DebugTest.java b/tests/tests/os/src/android/os/cts/DebugTest.java
index d8f5e87..8301cfc 100644
--- a/tests/tests/os/src/android/os/cts/DebugTest.java
+++ b/tests/tests/os/src/android/os/cts/DebugTest.java
@@ -300,4 +300,53 @@
         checkHistogram(gc_count_rate_histogram);
         checkHistogram(blocking_gc_count_rate_histogram);
     }
+
+    public void testGetMemoryStat() throws Exception {
+        Debug.MemoryInfo memoryInfo = new Debug.MemoryInfo();
+        Debug.getMemoryInfo(memoryInfo);
+
+        String summary_java_heap = memoryInfo.getMemoryStat("summary.java-heap");
+        String summary_native_heap = memoryInfo.getMemoryStat("summary.native-heap");
+        String summary_code = memoryInfo.getMemoryStat("summary.code");
+        String summary_stack = memoryInfo.getMemoryStat("summary.stack");
+        String summary_graphics = memoryInfo.getMemoryStat("summary.graphics");
+        String summary_private_other = memoryInfo.getMemoryStat("summary.private-other");
+        String summary_system = memoryInfo.getMemoryStat("summary.system");
+        String summary_total_pss = memoryInfo.getMemoryStat("summary.total-pss");
+        String summary_total_swap = memoryInfo.getMemoryStat("summary.total-swap");
+        checkNumber(summary_java_heap);
+        checkNumber(summary_native_heap);
+        checkNumber(summary_code);
+        checkNumber(summary_stack);
+        checkNumber(summary_graphics);
+        checkNumber(summary_private_other);
+        checkNumber(summary_system);
+        checkNumber(summary_total_pss);
+        checkNumber(summary_total_swap);
+    }
+
+    public void testGetMemoryStats() throws Exception {
+        Debug.MemoryInfo memoryInfo = new Debug.MemoryInfo();
+        Debug.getMemoryInfo(memoryInfo);
+
+        Map<String, String> map = memoryInfo.getMemoryStats();
+        String summary_java_heap = map.get("summary.java-heap");
+        String summary_native_heap = map.get("summary.native-heap");
+        String summary_code = map.get("summary.code");
+        String summary_stack = map.get("summary.stack");
+        String summary_graphics = map.get("summary.graphics");
+        String summary_private_other = map.get("summary.private-other");
+        String summary_system = map.get("summary.system");
+        String summary_total_pss = map.get("summary.total-pss");
+        String summary_total_swap = map.get("summary.total-swap");
+        checkNumber(summary_java_heap);
+        checkNumber(summary_native_heap);
+        checkNumber(summary_code);
+        checkNumber(summary_stack);
+        checkNumber(summary_graphics);
+        checkNumber(summary_private_other);
+        checkNumber(summary_system);
+        checkNumber(summary_total_pss);
+        checkNumber(summary_total_swap);
+    }
 }
diff --git a/tests/tests/os/src/android/os/cts/ISeccompIsolatedService.aidl b/tests/tests/os/src/android/os/cts/ISeccompIsolatedService.aidl
new file mode 100644
index 0000000..5234eff
--- /dev/null
+++ b/tests/tests/os/src/android/os/cts/ISeccompIsolatedService.aidl
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2015 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.os.cts;
+
+import android.os.IBinder;
+import android.os.ParcelFileDescriptor;
+
+interface ISeccompIsolatedService {
+    boolean installFilter();
+
+    boolean createThread();
+
+    boolean getSystemInfo();
+
+    boolean writeToFile(in ParcelFileDescriptor fd);
+
+    boolean openAshmem();
+
+    boolean openDevFile();
+
+    void violatePolicy();
+}
diff --git a/tests/tests/os/src/android/os/cts/LooperTest.java b/tests/tests/os/src/android/os/cts/LooperTest.java
index 79a55c6..6f7cb6d 100644
--- a/tests/tests/os/src/android/os/cts/LooperTest.java
+++ b/tests/tests/os/src/android/os/cts/LooperTest.java
@@ -78,6 +78,21 @@
         t.runTest(WAIT_TIME);
     }
 
+    public void testIsCurrentThread() throws Throwable {
+        final Looper[] looper = new Looper[1];
+        TestThread t = new TestThread(new Runnable() {
+            @Override
+            public void run() {
+                Looper.prepare();
+                assertTrue(Looper.myLooper().isCurrentThread());
+                looper[0] = Looper.myLooper();
+            }
+        });
+
+        t.runTest(WAIT_TIME);
+        assertFalse(looper[0].isCurrentThread());
+    }
+
     public void testMyQueue() throws Throwable {
         TestThread t = new TestThread(new Runnable() {
             public void run() {
@@ -96,6 +111,18 @@
         t.runTest(WAIT_TIME);
     }
 
+    public void testGetQueue() throws Throwable {
+        TestThread t = new TestThread(new Runnable() {
+            public void run() {
+                Looper.prepare();
+                assertNotNull(Looper.myLooper().getQueue());
+                assertEquals(Looper.myLooper().getQueue(), Looper.myQueue());
+            }
+        });
+
+        t.runTest(WAIT_TIME);
+    }
+
     public void testPrepare() throws Throwable {
         TestThread t = new TestThread(new Runnable() {
             public void run() {
diff --git a/tests/tests/os/src/android/os/cts/MessageQueueTest.java b/tests/tests/os/src/android/os/cts/MessageQueueTest.java
index 5b5bf5c..0c051bf 100644
--- a/tests/tests/os/src/android/os/cts/MessageQueueTest.java
+++ b/tests/tests/os/src/android/os/cts/MessageQueueTest.java
@@ -16,16 +16,25 @@
 
 package android.os.cts;
 
-
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Looper;
 import android.os.Message;
 import android.os.MessageQueue;
+import android.os.MessageQueue.OnFileDescriptorEventListener;
+import android.os.ParcelFileDescriptor;
+import android.os.ParcelFileDescriptor.AutoCloseInputStream;
+import android.os.ParcelFileDescriptor.AutoCloseOutputStream;
+import android.system.ErrnoException;
+import android.system.Os;
 import android.os.SystemClock;
 import android.os.MessageQueue.IdleHandler;
 import android.test.AndroidTestCase;
 
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -59,7 +68,7 @@
         }
     }
 
-    private enum Test {ADD_IDLE_HANDLER, REMOVE_IDLE_HANDLER};
+    private enum Test {ADD_IDLE_HANDLER, REMOVE_IDLE_HANDLER}
 
     /**
      * {@link HandlerThread} that adds or removes an idle handler depending on the {@link Test}
@@ -84,6 +93,7 @@
             super.onLooperPrepared();
 
             IdleHandler idleHandler = new IdleHandler() {
+                @Override
                 public boolean queueIdle() {
                     mIdleLatch.countDown();
                     return false;
@@ -113,12 +123,55 @@
         }
     }
 
+    public void testIsIdle() throws Exception {
+        HandlerThread thread = new HandlerThread("testIsIdle");
+        thread.start();
+        try {
+            // Queue should initially be idle.
+            assertTrue(thread.getLooper().getQueue().isIdle());
+
+            // Post two messages.  Block in the first one leaving the second one pending.
+            final CountDownLatch latch1 = new CountDownLatch(1);
+            final CountDownLatch latch2 = new CountDownLatch(1);
+            Handler handler = new Handler(thread.getLooper());
+            handler.post(new Runnable() {
+                @Override
+                public void run() {
+                    // Wait for latch1 released before returning.
+                    try {
+                        latch1.await(TIMEOUT, TimeUnit.MILLISECONDS);
+                    } catch (InterruptedException ex) { }
+                }
+            });
+            handler.post(new Runnable() {
+                @Override
+                public void run() {
+                    // Release latch2 when finished.
+                    latch2.countDown();
+                }
+            });
+
+            // The first message is blocked so the second should still be in the queue.
+            // At this point the queue will not be idle because there is a pending message.
+            assertFalse(thread.getLooper().getQueue().isIdle());
+
+            // Let the first message complete and wait for the second to leave the queue.
+            // At this point the queue will be idle because it is empty.
+            latch1.countDown();
+            latch2.await(TIMEOUT, TimeUnit.MILLISECONDS);
+            assertTrue(thread.getLooper().getQueue().isIdle());
+        } finally {
+            thread.quitSafely();
+        }
+    }
+
     /**
      * Use MessageQueue, send message by order
      */
     public void testMessageOrder() throws Exception {
 
         OrderTestHelper tester = new OrderTestHelper() {
+            @Override
             public void init() {
                 super.init();
                 long now = SystemClock.uptimeMillis() + 200;
@@ -142,6 +195,7 @@
 
         OrderTestHelper tester = new OrderTestHelper() {
 
+            @Override
             public void init() {
                 super.init();
                 long now = SystemClock.uptimeMillis() + 200;
@@ -151,6 +205,7 @@
                 mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(0));
             }
 
+            @Override
             public void handleMessage(Message msg) {
                 super.handleMessage(msg);
                 if (msg.what == 0) {
@@ -162,16 +217,515 @@
         tester.doTest(1000, 50);
     }
 
+    public void testRegisterFileDescriptorCallbackThrowsWhenFdIsNull() {
+        MessageQueue queue = Looper.getMainLooper().getQueue();
+        try {
+            queue.addOnFileDescriptorEventListener(null, 0,
+                    new OnFileDescriptorEventListener() {
+                @Override
+                public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                    return 0;
+                }
+            });
+            fail("Expected IllegalArgumentException");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+    }
+
+    public void testRegisterFileDescriptorCallbackThrowsWhenCallbackIsNull() throws Exception {
+        MessageQueue queue = Looper.getMainLooper().getQueue();
+        ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
+        try (ParcelFileDescriptor reader = pipe[0];
+                ParcelFileDescriptor writer = pipe[1]) {
+            try {
+                queue.addOnFileDescriptorEventListener(reader.getFileDescriptor(), 0, null);
+                fail("Expected IllegalArgumentException");
+            } catch (IllegalArgumentException ex) {
+                // expected
+            }
+        }
+    }
+
+    public void testUnregisterFileDescriptorCallbackThrowsWhenFdIsNull() throws Exception {
+        MessageQueue queue = Looper.getMainLooper().getQueue();
+        try {
+            queue.removeOnFileDescriptorEventListener(null);
+            fail("Expected IllegalArgumentException");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+    }
+
+    public void testUnregisterFileDescriptorCallbackDoesNothingWhenFdNotRegistered()
+            throws Exception {
+        MessageQueue queue = Looper.getMainLooper().getQueue();
+        ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
+        try (ParcelFileDescriptor reader = pipe[0];
+                ParcelFileDescriptor writer = pipe[1]) {
+            queue.removeOnFileDescriptorEventListener(reader.getFileDescriptor());
+        }
+    }
+
+    public void testFileDescriptorCallbacks() throws Throwable {
+        // Prepare a special looper that we can catch exceptions from.
+        AssertableHandlerThread thread = new AssertableHandlerThread();
+        thread.start();
+        try {
+            final CountDownLatch writerSawError = new CountDownLatch(1);
+            final CountDownLatch readerDone = new CountDownLatch(1);
+            final MessageQueue queue = thread.getLooper().getQueue();
+            final ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
+            try (final FileInputStream reader = new AutoCloseInputStream(pipe[0]);
+                    final FileOutputStream writer = new AutoCloseOutputStream(pipe[1])) {
+                final int size = 256 * 1024;
+
+                // Prepare to write a lot of data to the pipe asynchronously.
+                // We don't actually care about the content (assume pipes work correctly)
+                // so we just write lots of zeros.
+                OnFileDescriptorEventListener writerCallback = new OnFileDescriptorEventListener() {
+                    private byte[] mBuffer = new byte[4096];
+                    private int mRemaining = size;
+                    private boolean mDone;
+
+                    @Override
+                    public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                        assertEquals(pipe[1].getFileDescriptor(), fd);
+                        if (!mDone) {
+                            // When an error happens because the reader closed its end,
+                            // signal the test, and remove the callback.
+                            if ((events & OnFileDescriptorEventListener.EVENT_ERROR) != 0) {
+                                writerSawError.countDown();
+                                mDone = true;
+                                return 0;
+                            }
+
+                            // Write all output until an error is observed.
+                            if ((events & OnFileDescriptorEventListener.EVENT_OUTPUT) != 0) {
+                                int count = Math.min(mBuffer.length, mRemaining);
+                                try {
+                                    writer.write(mBuffer, 0, count);
+                                } catch (IOException ex) {
+                                    throw new RuntimeException(ex);
+                                }
+                                mRemaining -= count;
+                                return mRemaining != 0 ? EVENT_OUTPUT : EVENT_ERROR;
+                            }
+                        }
+
+                        // Should never see anything else.
+                        fail("Saw unexpected events: " + events + ", mDone=" + mDone);
+                        return 0;
+                    }
+                };
+
+                // Prepare to read all of that data.
+                OnFileDescriptorEventListener readerCallback = new OnFileDescriptorEventListener() {
+                    private byte[] mBuffer = new byte[4096];
+                    private int mRemaining = size;
+                    private boolean mDone;
+
+                    @Override
+                    public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                        assertEquals(pipe[0].getFileDescriptor(), fd);
+                        if (!mDone) {
+                            // Errors should not happen.
+                            if ((events & OnFileDescriptorEventListener.EVENT_ERROR) != 0) {
+                                fail("Saw unexpected error.");
+                                return 0;
+                            }
+
+                            // Read until everything is read, signal the test,
+                            // and remove the callback.
+                            if ((events & OnFileDescriptorEventListener.EVENT_INPUT) != 0) {
+                                try {
+                                    int count = reader.read(mBuffer, 0, mBuffer.length);
+                                    mRemaining -= count;
+                                } catch (IOException ex) {
+                                    throw new RuntimeException(ex);
+                                }
+                                if (mRemaining != 0) {
+                                    return EVENT_INPUT;
+                                }
+                                readerDone.countDown();
+                                mDone = true;
+                                return 0;
+                            }
+                        }
+
+                        // Should never see anything else.
+                        fail("Saw unexpected events: " + events + ", mDone=" + mDone);
+                        return 0;
+                    }
+                };
+
+                // Register the callbacks.
+                queue.addOnFileDescriptorEventListener(reader.getFD(),
+                        OnFileDescriptorEventListener.EVENT_INPUT, readerCallback);
+                queue.addOnFileDescriptorEventListener(writer.getFD(),
+                        OnFileDescriptorEventListener.EVENT_OUTPUT, writerCallback);
+
+                // Wait for the reader to see all of the data that the writer
+                // is prepared to send.
+                readerDone.await(TIMEOUT, TimeUnit.MILLISECONDS);
+
+                // At this point the reader's callback should be unregistered.
+                // Close the reader's file descriptor (pretend it crashed or something).
+                reader.close();
+
+                // Because the reader is gone, the writer should observe an error (EPIPE).
+                // Wait for this to happen.
+                writerSawError.await(TIMEOUT, TimeUnit.MILLISECONDS);
+
+                // The reader and writer should already be unregistered.
+                // Try to unregistered them again to ensure nothing bad happens.
+                queue.removeOnFileDescriptorEventListener(reader.getFD());
+                queue.removeOnFileDescriptorEventListener(writer.getFD());
+            }
+        } finally {
+            thread.quitAndRethrow();
+        }
+    }
+
+    /**
+     * Since file descriptor numbers may be reused, there are some interesting
+     * edge cases around closing file descriptors within the callback and adding
+     * new ones with the same number.
+     *
+     * Register a file descriptor, close it from within the callback, then return.
+     * Later, create a new file descriptor register it.  Ensure that we start getting
+     * events for the new file descriptor.
+     *
+     * This test exercises special logic in Looper.cpp for EPOLL_CTL_DEL handling EBADF.
+     */
+    public void testPathologicalFileDescriptorReuseCallbacks1() throws Throwable {
+        // Prepare a special looper that we can catch exceptions from.
+        AssertableHandlerThread thread = new AssertableHandlerThread();
+        thread.start();
+        try {
+            final MessageQueue queue = thread.getLooper().getQueue();
+            final Handler handler = new Handler(thread.getLooper());
+
+            final ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
+            try (final FileInputStream reader = new AutoCloseInputStream(pipe[0]);
+                    final FileOutputStream writer = new AutoCloseOutputStream(pipe[1])) {
+                // Register the callback.
+                final CountDownLatch awoke = new CountDownLatch(1);
+                queue.addOnFileDescriptorEventListener(reader.getFD(),
+                        OnFileDescriptorEventListener.EVENT_ERROR,
+                        new OnFileDescriptorEventListener() {
+                    @Override
+                    public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                        awoke.countDown();
+
+                        // Close the reader before we return.
+                        closeQuietly(reader);
+
+                        // Return 0 to unregister the callback.
+                        return 0;
+                    }
+                });
+
+                // Close the writer to wake up the callback (due to hangup).
+                writer.close();
+
+                // Wait for the looper to catch up and run the callback.
+                assertTrue("awoke", awoke.await(TIMEOUT, TimeUnit.MILLISECONDS));
+                syncWait(handler);
+            }
+
+            // At this point, the reader and writer are both closed.
+            // Make a new pipe and ensure that things still work as expected.
+            final ParcelFileDescriptor[] pipe2 = ParcelFileDescriptor.createPipe();
+            try (final FileInputStream reader2 = new AutoCloseInputStream(pipe2[0]);
+                    final FileOutputStream writer2 = new AutoCloseOutputStream(pipe2[1])) {
+                // Register the callback.
+                final CountDownLatch awoke = new CountDownLatch(1);
+                queue.addOnFileDescriptorEventListener(reader2.getFD(),
+                        OnFileDescriptorEventListener.EVENT_INPUT,
+                        new OnFileDescriptorEventListener() {
+                    @Override
+                    public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                        awoke.countDown();
+
+                        // Return 0 to unregister the callback.
+                        return 0;
+                    }
+                });
+
+                // Close the writer to wake up the callback (due to hangup).
+                writer2.close();
+
+                // Wait for the looper to catch up and run the callback.
+                assertTrue("awoke", awoke.await(TIMEOUT, TimeUnit.MILLISECONDS));
+                syncWait(handler);
+            }
+        } finally {
+            thread.quitAndRethrow();
+        }
+    }
+
+    /**
+     * Since file descriptor numbers may be reused, there are some interesting
+     * edge cases around closing file descriptors within the callback and adding
+     * new ones with the same number.
+     *
+     * Register a file descriptor, close it from within the callback, reassign its
+     * number to a different pipe, then return.  Later, register the same file descriptor
+     * again (now referring to a new pipe).  Ensure that we start getting
+     * events for the new file descriptor.
+     *
+     * This test exercises special logic in Looper.cpp for EPOLL_CTL_DEL handling ENOENT.
+     */
+    public void testPathologicalFileDescriptorReuseCallbacks2() throws Throwable {
+        // Prepare a special looper that we can catch exceptions from.
+        AssertableHandlerThread thread = new AssertableHandlerThread();
+        thread.start();
+        try {
+            final MessageQueue queue = thread.getLooper().getQueue();
+            final Handler handler = new Handler(thread.getLooper());
+
+            final ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
+            final ParcelFileDescriptor[] pipe2 = ParcelFileDescriptor.createPipe();
+            try {
+                final int oldReaderFd = pipe[0].getFd();
+                try (final FileInputStream reader = new AutoCloseInputStream(pipe[0]);
+                        final FileOutputStream writer = new AutoCloseOutputStream(pipe[1])) {
+                    // Register the callback.
+                    final CountDownLatch awoke = new CountDownLatch(1);
+                    queue.addOnFileDescriptorEventListener(reader.getFD(),
+                            OnFileDescriptorEventListener.EVENT_ERROR,
+                            new OnFileDescriptorEventListener() {
+                        @Override
+                        public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                            awoke.countDown();
+
+                            // Close the reader before we return and hijack its fd.
+                            hijackFd(pipe2, pipe);
+
+                            // Return 0 to unregister the callback.
+                            return 0;
+                        }
+                    });
+
+                    // Close the writer to wake up the callback (due to hangup).
+                    writer.close();
+
+                    // Wait for the looper to catch up and run the callback.
+                    assertTrue("awoke", awoke.await(TIMEOUT, TimeUnit.MILLISECONDS));
+                    syncWait(handler);
+                }
+
+                // Now we have a new pipe with the same file descriptor, make sure we can
+                // register it successfully.
+                assertEquals(oldReaderFd, pipe2[0].getFd());
+                try (final FileInputStream reader2 = new AutoCloseInputStream(pipe2[0]);
+                        final FileOutputStream writer2 = new AutoCloseOutputStream(pipe2[1])) {
+                    // Register the callback.
+                    final CountDownLatch awoke = new CountDownLatch(1);
+                    queue.addOnFileDescriptorEventListener(reader2.getFD(),
+                            OnFileDescriptorEventListener.EVENT_INPUT,
+                            new OnFileDescriptorEventListener() {
+                        @Override
+                        public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                            awoke.countDown();
+
+                            // Return 0 to unregister the callback.
+                            return 0;
+                        }
+                    });
+
+                    // Close the writer to wake up the callback (due to hangup).
+                    writer2.close();
+
+                    // Wait for the looper to catch up and run the callback.
+                    assertTrue("awoke", awoke.await(TIMEOUT, TimeUnit.MILLISECONDS));
+                    syncWait(handler);
+                }
+            } finally {
+                closeQuietly(pipe[0]);
+                closeQuietly(pipe[1]);
+                closeQuietly(pipe2[0]);
+                closeQuietly(pipe2[1]);
+            }
+        } finally {
+            thread.quitAndRethrow();
+        }
+    }
+
+    /**
+     * Since file descriptor numbers may be reused, there are some interesting
+     * edge cases around closing file descriptors within the callback and adding
+     * new ones with the same number.
+     *
+     * Register a file descriptor, close it from within the callback, reassign its
+     * number to a different pipe, register it, then return.
+     * Ensure that we start getting events for the new file descriptor.
+     *
+     * This test exercises special logic in Looper.cpp for EPOLL_CTL_MOD handling
+     * ENOENT and fallback to EPOLL_CTL_ADD as well as sequence number checks when removing
+     * the fd after the callback returns.
+     */
+    public void testPathologicalFileDescriptorReuseCallbacks3() throws Throwable {
+        // Prepare a special looper that we can catch exceptions from.
+        AssertableHandlerThread thread = new AssertableHandlerThread();
+        thread.start();
+        try {
+            final MessageQueue queue = thread.getLooper().getQueue();
+            final Handler handler = new Handler(thread.getLooper());
+
+            final ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
+            final ParcelFileDescriptor[] pipe2 = ParcelFileDescriptor.createPipe();
+            try {
+                final CountDownLatch awoke2 = new CountDownLatch(1);
+                final int oldReaderFd = pipe[0].getFd();
+                try (final FileInputStream reader = new AutoCloseInputStream(pipe[0]);
+                        final FileOutputStream writer = new AutoCloseOutputStream(pipe[1])) {
+                    // Register the callback.
+                    final CountDownLatch awoke = new CountDownLatch(1);
+                    queue.addOnFileDescriptorEventListener(reader.getFD(),
+                            OnFileDescriptorEventListener.EVENT_ERROR,
+                            new OnFileDescriptorEventListener() {
+                        @Override
+                        public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                            awoke.countDown();
+
+                            // Close the reader before we return and hijack its fd.
+                            hijackFd(pipe2, pipe);
+
+                            // Now we have a new pipe, make sure we can register it successfully.
+                            queue.addOnFileDescriptorEventListener(pipe2[0].getFileDescriptor(),
+                                    OnFileDescriptorEventListener.EVENT_INPUT,
+                                    new OnFileDescriptorEventListener() {
+                                @Override
+                                public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                                    awoke2.countDown();
+
+                                    // Return 0 to unregister the callback.
+                                    return 0;
+                                }
+                            });
+
+                            // Return 0 to unregister the callback.
+                            return 0;
+                        }
+                    });
+
+                    // Close the writer to wake up the callback (due to hangup).
+                    writer.close();
+
+                    // Wait for the looper to catch up and run the callback.
+                    assertTrue("awoke", awoke.await(TIMEOUT, TimeUnit.MILLISECONDS));
+                    syncWait(handler);
+                }
+
+                // Close the second writer to wake up the second callback (due to hangup).
+                pipe2[1].close();
+
+                // Wait for the looper to catch up and run the callback.
+                assertTrue("awoke2", awoke2.await(TIMEOUT, TimeUnit.MILLISECONDS));
+                syncWait(handler);
+
+                // Close the second reader now that we're done with the test.
+                assertEquals(oldReaderFd, pipe2[0].getFd());
+                pipe2[0].close();
+            } finally {
+                closeQuietly(pipe[0]);
+                closeQuietly(pipe[1]);
+                closeQuietly(pipe2[0]);
+                closeQuietly(pipe2[1]);
+            }
+        } finally {
+            thread.quitAndRethrow();
+        }
+    }
+
+    /**
+     * Since file descriptor numbers may be reused, there are some interesting
+     * edge cases around closing file descriptors within the callback and adding
+     * new ones with the same number.
+     *
+     * Register a file descriptor, make a duplicate of it, close it from within the
+     * callback, then return.  Look for signs that the Looper is spinning
+     * and never getting a chance to block.
+     *
+     * This test exercises special logic in Looper.cpp for rebuilding the epoll set
+     * in case it contains a file descriptor which has been closed and cannot be removed.
+     */
+    public void testPathologicalFileDescriptorReuseCallbacks4() throws Throwable {
+        // Prepare a special looper that we can catch exceptions from.
+        ParcelFileDescriptor dup = null;
+        AssertableHandlerThread thread = new AssertableHandlerThread();
+        thread.start();
+        try {
+            try {
+                final MessageQueue queue = thread.getLooper().getQueue();
+                final Handler handler = new Handler(thread.getLooper());
+
+                final ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
+                dup = pipe[0].dup();
+                try (final FileInputStream reader = new AutoCloseInputStream(pipe[0]);
+                        final FileOutputStream writer = new AutoCloseOutputStream(pipe[1])) {
+                    // Register the callback.
+                    final CountDownLatch awoke = new CountDownLatch(1);
+                    queue.addOnFileDescriptorEventListener(reader.getFD(),
+                            OnFileDescriptorEventListener.EVENT_ERROR, new OnFileDescriptorEventListener() {
+                        @Override
+                        public int onFileDescriptorEvents(FileDescriptor fd, int events) {
+                            awoke.countDown();
+
+                            // Close the file descriptor before we return.
+                            try {
+                                reader.close();
+                            } catch (IOException ex) {
+                                throw new RuntimeException(ex);
+                            }
+
+                            // Return 0 to unregister the callback.
+                            return 0;
+                        }
+                    });
+
+                    // Close the writer to wake up the callback (due to hangup).
+                    writer.close();
+
+                    // Wait for the looper to catch up and run the callback.
+                    assertTrue("awoke", awoke.await(TIMEOUT, TimeUnit.MILLISECONDS));
+                    syncWait(handler);
+                }
+
+                // Wait a little bit before we stop the thread.
+                Thread.sleep(2000);
+            } finally {
+                // Check for how long the thread was running.
+                // If the Looper behaved correctly, then it should have blocked for most of
+                // the duration of the test (including that sleep above) since not much else
+                // was happening.  If we failed to actually rebuild the epoll set then the
+                // Looper may have been spinning continuously due to an FD that was never
+                // properly removed from the epoll set so the thread runtime will be very high.
+                long runtime = thread.quitAndRethrow();
+                assertFalse("Looper thread spent most of its time spinning instead of blocked.",
+                        runtime > 1000);
+            }
+        } finally {
+            // Close the duplicate now that we are done with it.
+            if (dup != null) {
+                dup.close();
+            }
+        }
+    }
+
     public void testSyncBarriers() throws Exception {
         OrderTestHelper tester = new OrderTestHelper() {
             private int mBarrierToken1;
             private int mBarrierToken2;
 
+            @Override
             public void init() {
                 super.init();
                 mLastMessage = 10;
                 mHandler.sendEmptyMessage(0);
-                mBarrierToken1 = Looper.myLooper().postSyncBarrier();
+                mBarrierToken1 = Looper.myQueue().postSyncBarrier();
                 mHandler.sendEmptyMessage(5);
                 sendAsyncMessage(1);
                 sendAsyncMessage(2);
@@ -179,19 +733,20 @@
                 mHandler.sendEmptyMessage(6);
             }
 
+            @Override
             public void handleMessage(Message msg) {
                 super.handleMessage(msg);
                 if (msg.what == 3) {
                     mHandler.sendEmptyMessage(7);
-                    mBarrierToken2 = Looper.myLooper().postSyncBarrier();
+                    mBarrierToken2 = Looper.myQueue().postSyncBarrier();
                     sendAsyncMessage(4);
                     sendAsyncMessage(8);
                 } else if (msg.what == 4) {
-                    Looper.myLooper().removeSyncBarrier(mBarrierToken1);
+                    Looper.myQueue().removeSyncBarrier(mBarrierToken1);
                     sendAsyncMessage(9);
                     mHandler.sendEmptyMessage(10);
                 } else if (msg.what == 8) {
-                    Looper.myLooper().removeSyncBarrier(mBarrierToken2);
+                    Looper.myQueue().removeSyncBarrier(mBarrierToken2);
                 }
             }
 
@@ -206,25 +761,66 @@
     }
 
     public void testReleaseSyncBarrierThrowsIfTokenNotValid() throws Exception {
+        MessageQueue queue = Looper.getMainLooper().getQueue();
+
         // Invalid token
         try {
-            Looper.getMainLooper().removeSyncBarrier(-1);
+            queue.removeSyncBarrier(-1);
             fail("Should have thrown IllegalStateException");
         } catch (IllegalStateException ex) {
             // expected
         }
 
         // Token already removed.
-        int barrierToken = Looper.getMainLooper().postSyncBarrier();
-        Looper.getMainLooper().removeSyncBarrier(barrierToken);
+        int barrierToken = queue.postSyncBarrier();
+        queue.removeSyncBarrier(barrierToken);
         try {
-            Looper.getMainLooper().removeSyncBarrier(barrierToken);
+            queue.removeSyncBarrier(barrierToken);
             fail("Should have thrown IllegalStateException");
         } catch (IllegalStateException ex) {
             // expected
         }
     }
 
+    private void syncWait(Handler handler) throws InterruptedException {
+        final CountDownLatch latch = new CountDownLatch(1);
+        handler.post(new Runnable() {
+            @Override
+            public void run() {
+                latch.countDown();
+            }
+        });
+        assertTrue("Handler got stuck.", latch.await(TIMEOUT, TimeUnit.MILLISECONDS));
+    }
+
+    private static void closeQuietly(AutoCloseable c) {
+        if (c != null) {
+            try {
+                c.close();
+            } catch (RuntimeException rethrown) {
+                throw rethrown;
+            } catch (Exception ex) {
+            }
+        }
+    }
+
+    private static void hijackFd(ParcelFileDescriptor[] newPipe, ParcelFileDescriptor[] oldPipe) {
+        // Detach the old pipe's first fd and get its number.
+        int fd = oldPipe[0].detachFd();
+
+        // Assign the new pipe's first fd to the same number as the old pipe's first fd.
+        // This causes the old pipe's first fd to be closed and reassigned.
+        try {
+            Os.dup2(newPipe[0].getFileDescriptor(), fd);
+        } catch (ErrnoException ex) {
+            throw new RuntimeException(ex);
+        }
+
+        // Fix up the new pipe's first fd object.
+        closeQuietly(newPipe[0]);
+        newPipe[0] = ParcelFileDescriptor.adoptFd(fd);
+    }
+
     /**
      * Helper class used to test sending message to message queue.
      */
@@ -239,6 +835,7 @@
 
         public void init() {
             mHandler = new Handler() {
+                @Override
                 public void handleMessage(Message msg) {
                     OrderTestHelper.this.handleMessage(msg);
                 }
@@ -288,6 +885,7 @@
                 super("MessengerLooperThread");
             }
 
+            @Override
             public void onLooperPrepared() {
                 init();
                 mLooper = getLooper();
@@ -328,4 +926,38 @@
             }
         }
     }
+
+    /**
+     * A HandlerThread that propagates exceptions out of the event loop
+     * instead of crashing the process.
+     */
+    private static class AssertableHandlerThread extends HandlerThread {
+        private Throwable mThrowable;
+        private long mRuntime;
+
+        public AssertableHandlerThread() {
+            super("AssertableHandlerThread");
+        }
+
+        @Override
+        public void run() {
+            final long startTime = SystemClock.currentThreadTimeMillis();
+            try {
+                super.run();
+            } catch (Throwable t) {
+                mThrowable = t;
+            } finally {
+                mRuntime = SystemClock.currentThreadTimeMillis() - startTime;
+            }
+        }
+
+        public long quitAndRethrow() throws Throwable {
+            quitSafely();
+            join(TIMEOUT);
+            if (mThrowable != null) {
+                throw mThrowable;
+            }
+            return mRuntime;
+        }
+    }
 }
diff --git a/tests/tests/os/src/android/os/cts/ParcelFileDescriptorTest.java b/tests/tests/os/src/android/os/cts/ParcelFileDescriptorTest.java
index 2287660..3bcc4b9 100644
--- a/tests/tests/os/src/android/os/cts/ParcelFileDescriptorTest.java
+++ b/tests/tests/os/src/android/os/cts/ParcelFileDescriptorTest.java
@@ -358,6 +358,15 @@
         }
     }
 
+    // http://b/21578056
+    public void testFileNamesWithNonBmpChars() throws Exception {
+        final File file = File.createTempFile("treble_clef_\ud834\udd1e", ".tmp");
+        final ParcelFileDescriptor pfd = ParcelFileDescriptor.open(file,
+                ParcelFileDescriptor.MODE_READ_ONLY);
+        assertNotNull(pfd);
+        pfd.close();
+    }
+
     static ParcelFileDescriptor makeParcelFileDescriptor(Context con) throws Exception {
         final String fileName = "testParcelFileDescriptor";
 
diff --git a/tests/tests/os/src/android/os/cts/ParcelTest.java b/tests/tests/os/src/android/os/cts/ParcelTest.java
index 35e02ae..5b7b187 100644
--- a/tests/tests/os/src/android/os/cts/ParcelTest.java
+++ b/tests/tests/os/src/android/os/cts/ParcelTest.java
@@ -20,8 +20,6 @@
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 
 import android.content.pm.Signature;
 import android.os.BadParcelableException;
@@ -2970,4 +2968,121 @@
             return binder;
         }
     }
+
+    private static boolean parcelableWithBadCreatorInitializerHasRun;
+    private static boolean invalidCreatorIntializerHasRun;
+
+    /**
+     * A class that would be Parcelable except that it doesn't have a CREATOR field declared to be
+     * of the correct type.
+     */
+    @SuppressWarnings("unused") // Referenced via reflection only
+    private static class ParcelableWithBadCreator implements Parcelable {
+
+        static {
+            ParcelTest.parcelableWithBadCreatorInitializerHasRun = true;
+        }
+
+        private static class InvalidCreator
+                implements Parcelable.Creator<ParcelableWithBadCreator> {
+
+            static {
+                invalidCreatorIntializerHasRun = true;
+            }
+
+            @Override
+            public ParcelableWithBadCreator createFromParcel(Parcel source) {
+                return null;
+            }
+
+            @Override
+            public ParcelableWithBadCreator[] newArray(int size) {
+                return new ParcelableWithBadCreator[0];
+            }
+
+        }
+
+        // Invalid declaration: Must be declared as Parcelable.Creator or a subclass.
+        public static Object CREATOR = new InvalidCreator();
+
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+
+        }
+    }
+
+    // http://b/1171613
+    public void testBadStream_invalidCreator() {
+        Parcel parcel = Parcel.obtain();
+        // Create an invalid stream by manipulating the Parcel.
+        parcel.writeString(getClass().getName() + "$ParcelableWithBadCreator");
+        byte[] badData = parcel.marshall();
+        parcel.recycle();
+
+        // Now try to read the bad data.
+        parcel = Parcel.obtain();
+        parcel.unmarshall(badData, 0, badData.length);
+        parcel.setDataPosition(0);
+        try {
+            parcel.readParcelable(getClass().getClassLoader());
+            fail();
+        } catch (BadParcelableException expected) {
+        } finally {
+            parcel.recycle();
+        }
+
+        assertFalse(invalidCreatorIntializerHasRun);
+        assertFalse(parcelableWithBadCreatorInitializerHasRun);
+    }
+
+    private static boolean doesNotImplementParcelableInitializerHasRun;
+
+    /** A class that would be Parcelable except that it does not implement Parcelable. */
+    @SuppressWarnings("unused") // Referenced via reflection only
+    private static class DoesNotImplementParcelable {
+
+        static {
+            doesNotImplementParcelableInitializerHasRun = true;
+        }
+
+        public static Parcelable.Creator<Object> CREATOR = new Parcelable.Creator<Object>() {
+            @Override
+            public Object createFromParcel(Parcel source) {
+                return new DoesNotImplementParcelable();
+            }
+
+            @Override
+            public Object[] newArray(int size) {
+                return new Object[size];
+            }
+        };
+    }
+
+    // http://b/1171613
+    public void testBadStream_objectDoesNotImplementParcelable() {
+        Parcel parcel = Parcel.obtain();
+        // Create an invalid stream by manipulating the Parcel.
+        parcel.writeString(getClass().getName() + "$DoesNotImplementParcelable");
+        byte[] badData = parcel.marshall();
+        parcel.recycle();
+
+        // Now try to read the bad data.
+        parcel = Parcel.obtain();
+        parcel.unmarshall(badData, 0, badData.length);
+        parcel.setDataPosition(0);
+        try {
+            parcel.readParcelable(getClass().getClassLoader());
+            fail();
+        } catch (BadParcelableException expected) {
+        } finally {
+            parcel.recycle();
+        }
+
+        assertFalse(doesNotImplementParcelableInitializerHasRun);
+    }
 }
diff --git a/tests/tests/os/src/android/os/cts/SeccompTest.java b/tests/tests/os/src/android/os/cts/SeccompTest.java
index 6c49337..7376079 100644
--- a/tests/tests/os/src/android/os/cts/SeccompTest.java
+++ b/tests/tests/os/src/android/os/cts/SeccompTest.java
@@ -16,18 +16,397 @@
 
 package android.os.cts;
 
-import junit.framework.TestCase;
+import android.app.Service;
+import android.content.Context;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.Environment;
+import android.os.IBinder;
+import android.os.ParcelFileDescriptor;
+import android.os.RemoteException;
+import android.os.MemoryFile;
+import android.os.SystemClock;
+import android.os.Build;
+import android.util.Log;
+import android.test.AndroidTestCase;
 
-public class SeccompTest extends TestCase {
+import com.google.common.util.concurrent.AbstractFuture;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.Date;
+
+public class SeccompTest extends AndroidTestCase {
+    final static String TAG = "SeccompTest";
+
+    static {
+        System.loadLibrary("ctsos_jni");
+    }
+
+    // As this test validates a kernel system call interface, if the CTS tests
+    // were built for ARM but are running on an x86 CPU, the system call numbers
+    // will not be correct, so skip those tests.
+    private boolean isRunningUnderEmulatedAbi() {
+        final String primaryAbi = Build.SUPPORTED_ABIS[0];
+        return (CpuFeatures.isArmCpu() || CpuFeatures.isArm64Cpu()) &&
+               !(primaryAbi.equals("armeabi-v7a") || primaryAbi.equals("arm64-v8a"));
+    }
 
     public void testSeccomp() {
-        if (CpuFeatures.isArm64Cpu() || CpuFeatures.isArm64CpuIn32BitMode()) {
-            return; // seccomp not yet supported on arm64
-        }
         if (OSFeatures.needsSeccompSupport()) {
             assertTrue("Please enable seccomp support "
                        + "in your kernel (CONFIG_SECCOMP_FILTER=y)",
                        OSFeatures.hasSeccompSupport());
         }
     }
+
+    public void testKernelBasicTests() {
+        if (!OSFeatures.needsSeccompSupport())
+            return;
+
+        if (isRunningUnderEmulatedAbi()) {
+            Log.d(TAG, "Skipping test running under an emulated ABI");
+            return;
+        }
+
+        final String[] tests = {
+            "global.mode_strict_support",
+            "global.mode_strict_cannot_call_prctl",
+            "global.no_new_privs_support",
+            "global.mode_filter_support",
+            /* "global.mode_filter_without_nnp", // all Android processes already have nnp */
+            "global.filter_size_limits",
+            "global.filter_chain_limits",
+            "global.mode_filter_cannot_move_to_strict",
+            "global.mode_filter_get_seccomp",
+            "global.ALLOW_all",
+            "global.empty_prog",
+            "global.unknown_ret_is_kill_inside",
+            "global.unknown_ret_is_kill_above_allow",
+            "global.KILL_all",
+            "global.KILL_one",
+            "global.KILL_one_arg_one",
+            "global.KILL_one_arg_six",
+            "global.arg_out_of_range",
+            "global.ERRNO_one",
+            "global.ERRNO_one_ok",
+        };
+        runKernelUnitTestSuite(tests);
+    }
+
+    public void testKernelTrapTests() {
+        if (!OSFeatures.needsSeccompSupport())
+            return;
+
+        final String[] tests = {
+            "TRAP.dfl",
+            "TRAP.ign",
+            "TRAP.handler",
+        };
+        runKernelUnitTestSuite(tests);
+    }
+
+    public void testKernelPrecedenceTests() {
+        if (!OSFeatures.needsSeccompSupport())
+            return;
+
+        final String[] tests = {
+            "precedence.allow_ok",
+            "precedence.kill_is_highest",
+            "precedence.kill_is_highest_in_any_order",
+            "precedence.trap_is_second",
+            "precedence.trap_is_second_in_any_order",
+            "precedence.errno_is_third",
+            "precedence.errno_is_third_in_any_order",
+            "precedence.trace_is_fourth",
+            "precedence.trace_is_fourth_in_any_order",
+        };
+        runKernelUnitTestSuite(tests);
+    }
+
+    /* // The SECCOMP_RET_TRACE does not work under Android Arm32.
+    public void testKernelTraceTests() {
+        if (!OSFeatures.needsSeccompSupport())
+            return;
+
+        final String[] tests = {
+            "TRACE_poke.read_has_side_effects",
+            "TRACE_poke.getpid_runs_normally",
+            "TRACE_syscall.syscall_allowed",
+            "TRACE_syscall.syscall_redirected",
+            "TRACE_syscall.syscall_dropped",
+        };
+        runKernelUnitTestSuite(tests);
+    }
+    */
+
+    public void testKernelTSYNCTests() {
+        if (!OSFeatures.needsSeccompSupport())
+            return;
+
+        if (isRunningUnderEmulatedAbi()) {
+            Log.d(TAG, "Skipping test running under an emulated ABI");
+            return;
+        }
+
+        final String[] tests = {
+            "global.seccomp_syscall",
+            "global.seccomp_syscall_mode_lock",
+            "global.TSYNC_first",
+            "TSYNC.siblings_fail_prctl",
+            "TSYNC.two_siblings_with_ancestor",
+            /* "TSYNC.two_sibling_want_nnp", // all Android processes already have nnp */
+            "TSYNC.two_siblings_with_no_filter",
+            "TSYNC.two_siblings_with_one_divergence",
+            "TSYNC.two_siblings_not_under_filter",
+            /* "global.syscall_restart", // ptrace attach fails */
+        };
+        runKernelUnitTestSuite(tests);
+    }
+
+    /**
+     * Runs a kernel unit test suite (an array of kernel test names).
+     */
+    private void runKernelUnitTestSuite(final String[] tests) {
+        for (final String test : tests) {
+            // TODO: Replace the URL with the documentation when it's finished.
+            assertTrue(test + " failed. This test requires kernel functionality to pass. "
+                       + "Please go to http://XXXXX for instructions on how to enable or "
+                       + "backport the required functionality.",
+                       runKernelUnitTest(test));
+        }
+    }
+
+    /**
+     * Integration test for seccomp-bpf policy applied to an isolatedProcess=true
+     * service. This will perform various operations in an isolated process under a
+     * fairly restrictive seccomp policy.
+     */
+    public void testIsolatedServicePolicy() throws InterruptedException, ExecutionException,
+           RemoteException {
+        if (!OSFeatures.needsSeccompSupport())
+            return;
+
+        if (isRunningUnderEmulatedAbi()) {
+            Log.d(TAG, "Skipping test running under an emulated ABI");
+            return;
+        }
+
+        final IsolatedServiceConnection peer = new IsolatedServiceConnection();
+        final Intent intent = new Intent(getContext(), IsolatedService.class);
+        assertTrue(getContext().bindService(intent, peer, Context.BIND_AUTO_CREATE));
+
+        final ISeccompIsolatedService service = peer.get();
+
+        // installFilter() must be called first, to set the seccomp policy.
+        assertTrue(service.installFilter());
+        assertTrue(service.createThread());
+        assertTrue(service.getSystemInfo());
+        doFileWriteTest(service);
+        assertTrue(service.openAshmem());
+        assertTrue(service.openDevFile());
+
+        getContext().unbindService(peer);
+    }
+
+    /**
+     * Integration test for seccomp-bpf policy with isolatedProcess, where the
+     * process then violates the policy and gets killed by the kernel.
+     */
+    public void testViolateIsolatedServicePolicy() throws InterruptedException,
+           ExecutionException, RemoteException {
+        if (!OSFeatures.needsSeccompSupport())
+            return;
+
+        if (isRunningUnderEmulatedAbi()) {
+            Log.d(TAG, "Skipping test running under an emulated ABI");
+            return;
+        }
+
+        final IsolatedServiceConnection peer = new IsolatedServiceConnection();
+        final Intent intent = new Intent(getContext(), IsolatedService.class);
+        assertTrue(getContext().bindService(intent, peer, Context.BIND_AUTO_CREATE));
+
+        final ISeccompIsolatedService service = peer.get();
+
+        assertTrue(service.installFilter());
+        boolean gotRemoteException = false;
+        try {
+            service.violatePolicy();
+        } catch (RemoteException e) {
+            gotRemoteException = true;
+        }
+        assertTrue(gotRemoteException);
+
+        getContext().unbindService(peer);
+    }
+
+    private void doFileWriteTest(ISeccompIsolatedService service) throws RemoteException {
+        final String fileName = "seccomp_test";
+        ParcelFileDescriptor fd = null;
+        try {
+            FileOutputStream fOut = getContext().openFileOutput(fileName, 0);
+            fd = ParcelFileDescriptor.dup(fOut.getFD());
+            fOut.close();
+        } catch (FileNotFoundException e) {
+            fail(e.getMessage());
+            return;
+        } catch (IOException e) {
+            fail(e.getMessage());
+            return;
+        }
+
+        assertTrue(service.writeToFile(fd));
+
+        try {
+            FileInputStream fIn = getContext().openFileInput(fileName);
+            assertEquals('!', fIn.read());
+            fIn.close();
+        } catch (FileNotFoundException e) {
+            fail(e.getMessage());
+        } catch (IOException e) {
+            fail(e.getMessage());
+        }
+    }
+
+    class IsolatedServiceConnection extends AbstractFuture<ISeccompIsolatedService>
+            implements ServiceConnection {
+        @Override
+        public void onServiceConnected(ComponentName name, IBinder service) {
+            set(ISeccompIsolatedService.Stub.asInterface(service));
+        }
+
+        @Override
+        public void onServiceDisconnected(ComponentName name) {
+        }
+
+        @Override
+        public ISeccompIsolatedService get() throws InterruptedException, ExecutionException {
+            try {
+                return get(10, TimeUnit.SECONDS);
+            } catch (TimeoutException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    public static class IsolatedService extends Service {
+        private final ISeccompIsolatedService.Stub mService = new ISeccompIsolatedService.Stub() {
+            public boolean installFilter() {
+                return installTestFilter();
+            }
+
+            public boolean createThread() {
+                Thread thread = new Thread(new Runnable() {
+                    @Override
+                    public void run() {
+                        try {
+                            Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
+                            Thread.sleep(100);
+                        } catch (InterruptedException e) {
+                        }
+                    }
+                });
+                thread.run();
+                try {
+                    thread.join();
+                } catch (InterruptedException e) {
+                    return false;
+                }
+                return true;
+            }
+
+            public boolean getSystemInfo() {
+                long uptimeMillis = SystemClock.uptimeMillis();
+                if (uptimeMillis < 1) {
+                    Log.d(TAG, "SystemClock failed");
+                    return false;
+                }
+
+                String version = Build.VERSION.CODENAME;
+                if (version.length() == 0) {
+                    Log.d(TAG, "Build.VERSION failed");
+                    return false;
+                }
+
+                long time = (new Date()).getTime();
+                if (time < 100) {
+                    Log.d(TAG, "getTime failed");
+                    return false;
+                }
+
+                return true;
+            }
+
+            public boolean writeToFile(ParcelFileDescriptor fd) {
+                FileOutputStream fOut = new FileOutputStream(fd.getFileDescriptor());
+                try {
+                    fOut.write('!');
+                    fOut.close();
+                } catch (IOException e) {
+                    return false;
+                }
+                return true;
+            }
+
+            public boolean openAshmem() {
+                byte[] buffer = {'h', 'e', 'l', 'l', 'o'};
+                try {
+                    MemoryFile file = new MemoryFile("seccomp_isolated_test", 32);
+                    file.writeBytes(buffer, 0, 0, buffer.length);
+                    file.close();
+                    return true;
+                } catch (IOException e) {
+                    return false;
+                }
+            }
+
+            public boolean openDevFile() {
+                try {
+                    FileInputStream fIn = new FileInputStream("/dev/zero");
+                    boolean succeed = fIn.read() == 0;
+                    succeed &= fIn.read() == 0;
+                    succeed &= fIn.read() == 0;
+                    fIn.close();
+                    return succeed;
+                } catch (FileNotFoundException e) {
+                    return false;
+                } catch (IOException e) {
+                    return false;
+                }
+            }
+
+            public void violatePolicy() {
+                getClockBootTime();
+            }
+        };
+
+        @Override
+        public IBinder onBind(Intent intent) {
+            return mService;
+        }
+    }
+
+    /**
+     * Runs the seccomp_bpf_unittest of the given name.
+     */
+    private native boolean runKernelUnitTest(final String name);
+
+    /**
+     * Installs a test seccomp-bpf filter program that.
+     */
+    private native static boolean installTestFilter();
+
+    /**
+     * Attempts to get the CLOCK_BOOTTIME, which is a violation of the
+     * policy specified by installTestFilter().
+     */
+    private native static int getClockBootTime();
 }
diff --git a/tests/tests/os/src/android/os/cts/StrictModeTest.java b/tests/tests/os/src/android/os/cts/StrictModeTest.java
new file mode 100644
index 0000000..d63f8bc
--- /dev/null
+++ b/tests/tests/os/src/android/os/cts/StrictModeTest.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2015 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.os.cts;
+
+import android.os.StrictMode;
+import android.os.SystemClock;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+import libcore.io.Streams;
+
+import java.io.ByteArrayOutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Tests for {@link StrictMode}
+ */
+public class StrictModeTest extends AndroidTestCase {
+    private static final String TAG = "StrictModeTest";
+
+    private StrictMode.VmPolicy mPolicy;
+
+    @Override
+    protected void setUp() {
+        mPolicy = StrictMode.getVmPolicy();
+    }
+
+    @Override
+    protected void tearDown() {
+        StrictMode.setVmPolicy(mPolicy);
+    }
+
+    public void testCleartextNetwork() throws Exception {
+        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
+                .detectCleartextNetwork()
+                .penaltyLog()
+                .build());
+
+        final long millis = System.currentTimeMillis();
+        final String msg = "Detected cleartext network traffic from UID "
+                + android.os.Process.myUid();
+
+        // Insecure connection should be detected
+        ((HttpURLConnection) new URL("http://example.com/").openConnection()).getResponseCode();
+
+        // Give system enough time to finish logging
+        SystemClock.sleep(5000);
+        assertTrue("Expected cleartext to be caught", readLogSince(millis).contains(msg));
+    }
+
+    public void testEncryptedNetwork() throws Exception {
+        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
+                .detectCleartextNetwork()
+                .penaltyLog()
+                .build());
+
+        final long millis = System.currentTimeMillis();
+        final String msg = "Detected cleartext network traffic from UID "
+                + android.os.Process.myUid();
+
+        // Secure connection should be ignored
+        ((HttpURLConnection) new URL("https://example.com/").openConnection()).getResponseCode();
+
+        // Give system enough time to finish logging
+        SystemClock.sleep(5000);
+        assertFalse("Expected encrypted to be ignored", readLogSince(millis).contains(msg));
+    }
+
+    private String readLogSince(long millis) throws Exception {
+        final SimpleDateFormat format = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
+        final Process proc = new ProcessBuilder("logcat", "-t", format.format(new Date(millis)))
+                .redirectErrorStream(true).start();
+
+        final ByteArrayOutputStream buf = new ByteArrayOutputStream();
+        Streams.copy(proc.getInputStream(), buf);
+        final int res = proc.waitFor();
+
+        Log.d(TAG, "Log output was " + buf.size() + " bytes, exit code " + res);
+        return new String(buf.toByteArray());
+    }
+}
diff --git a/tests/tests/permission/src/android/permission/cts/AccountManagerTest.java b/tests/tests/permission/src/android/permission/cts/AccountManagerTest.java
deleted file mode 100644
index 5d4378f..0000000
--- a/tests/tests/permission/src/android/permission/cts/AccountManagerTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2013 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.permission.cts;
-
-import android.content.Context;
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.accounts.AccountManagerFuture;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-
-/**
- * Verify GET_ACCOUNTS permissions are enforced.
- */
-public class AccountManagerTest extends AndroidTestCase {
-
-    private AccountManager mAccountManager;
-
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        mAccountManager = AccountManager.get(getContext());
-        assertNotNull(mAccountManager);
-    }
-
-    /**
-     * Verifies that AccountManager.getAccounts() requires Permission.
-     * <p>
-     * Requires Permission: {@link android.Manifest.permission#GET_ACCOUNTS}.
-     */
-    @SmallTest
-    public void testGetAccounts() {
-        try {
-            mAccountManager.getAccounts();
-            fail("AccountManager.getAccounts() did not throw SecurityException as expected");
-        } catch (SecurityException se) {
-            // Expected Exception
-        }
-    }
-
-    /**
-     * Verifies that AccountManager.getAccountsByType() requires Permission.
-     * <p>
-     * Requires Permission: {@link android.Manifest.permission#GET_ACCOUNTS}.
-     */
-    @SmallTest
-    public void testGetAccountsByType() {
-        try {
-            mAccountManager.getAccountsByType(null);
-            fail("AccountManager.getAccountsByType() did not throw SecurityException as expected");
-        } catch (SecurityException se) {
-            // Expected Exception
-        }
-    }
-
-    /**
-     * Verifies that AccountManager.getAccountsByTypeAndFeatures() requires
-     * Permission.
-     * <p>
-     * Requires Permission: {@link android.Manifest.permission#GET_ACCOUNTS}.
-     */
-    @SmallTest
-    public void testGetAccountsByTypeAndFeatures() {
-        try {
-            mAccountManager.getAccountsByTypeAndFeatures("", null, null, null);
-            fail("AccountManager.getAccountsByTypeAndFeatures() did not throw SecurityException as expected");
-        } catch (SecurityException se) {
-            // Expected Exception
-        }
-    }
-}
diff --git a/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java b/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java
index 51e54df..984fd6c 100644
--- a/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java
+++ b/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java
@@ -16,12 +16,7 @@
 
 package android.permission.cts;
 
-import android.os.RemoteException;
-import android.content.ContentProviderClient;
-import android.content.ContentResolver;
 import android.content.ContentValues;
-import android.database.Cursor;
-import android.provider.Contacts;
 import android.provider.ContactsContract;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
@@ -71,7 +66,7 @@
      * Verifies that query(ContactsContract.Profile.CONTENT_URI) requires
      * Permission.
      * <p>
-     * Requires Permission: {@link android.Manifest.permission#READ_PROFILE}.
+     * Requires Permission: {@link android.Manifest.permission#READ_CONTACTS}.
      */
     @SmallTest
     public void testQueryProfile() {
@@ -91,7 +86,7 @@
      * permission, but trying to do it without the permission should throw a
      * SecurityException anyway.
      * <p>
-     * Requires Permission: {@link android.Manifest.permission#WRITE_PROFILE}.
+     * Requires Permission: {@link android.Manifest.permission#WRITE_CONTACTS}.
      */
     @SmallTest
     public void testInsertProfile() {
@@ -109,7 +104,7 @@
      * Verifies that update(ContactsContract.Profile.CONTENT_URI) requires
      * Permission.
      * <p>
-     * Requires Permission: {@link android.Manifest.permission#WRITE_PROFILE}.
+     * Requires Permission: {@link android.Manifest.permission#WRITE_CONTACTS}.
      */
     @SmallTest
     public void testUpdateProfile() {
@@ -122,4 +117,41 @@
             // Expected Exception
         }
     }
+
+    /**
+    * Verifies that query(ContactsContract.CommonDataKinds.Phone.ENTERPRISE_CONTENT_URI) requires
+    * Permission.
+    * <p>
+    * Requires Permission: {@link android.Manifest.permission#INTERACT_ACROSS_USERS}.
+    */
+    @SmallTest
+    public void testQueryPhoneEnterprise() {
+        try {
+            getContext().getContentResolver().query(
+                    ContactsContract.CommonDataKinds.Phone.ENTERPRISE_CONTENT_URI,
+                    null, null, null, null);
+            fail("query(ContactsContract.CommonDataKinds.Phone.ENTERPRISE_CONTENT_URI) did not"
+                    + " throw SecurityException as expected");
+        } catch (SecurityException se) {
+            // Expected Exception
+        }
+    }
+
+    /**
+    * Verifies that query(ContactsContract.RawContactsEntity.CORP_CONTENT_URI) requires
+    * Permission.
+    * <p>
+    * Requires Permission: {@link android.Manifest.permission#INTERACT_ACROSS_USERS}.
+    */
+    @SmallTest
+    public void testRawContactsEntityCorp() {
+        try {
+            getContext().getContentResolver().query(
+                    ContactsContract.RawContactsEntity.CORP_CONTENT_URI, null, null, null, null);
+            fail("query(ContactsContract.RawContactsEntity.CORP_CONTENT_URI) did not throw"
+                    + " SecurityException as expected");
+        } catch (SecurityException se) {
+            // Expected Exception
+        }
+    }
 }
diff --git a/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java b/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java
index b605e4d..cf6a09d 100644
--- a/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java
@@ -19,7 +19,10 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.os.Environment;
+import android.os.SystemProperties;
+import android.system.Os;
 import android.system.OsConstants;
+import android.system.StructStatVfs;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.MediumTest;
 import android.test.suitebuilder.annotation.LargeTest;
@@ -27,6 +30,7 @@
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileFilter;
+import java.io.FilenameFilter;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
@@ -156,7 +160,6 @@
         assertFalse(f.canRead());
         assertFalse(f.canWrite());
         assertFalse(f.canExecute());
-        assertFalse(f.exists());
     }
 
     @MediumTest
@@ -177,7 +180,6 @@
         assertFalse(f.canRead());
         assertFalse(f.canWrite());
         assertFalse(f.canExecute());
-        assertFalse(f.exists());
     }
 
     @MediumTest
@@ -247,6 +249,22 @@
     }
 
     @MediumTest
+    public void testProcSelfOomAdjSane() {
+        File f = new File("/proc/self/oom_adj");
+        assertTrue(f.canRead());
+        assertFalse(f.canWrite());
+        assertFalse(f.canExecute());
+    }
+
+    @MediumTest
+    public void testProcSelfOomScoreAdjSane() {
+        File f = new File("/proc/self/oom_score_adj");
+        assertTrue(f.canRead());
+        assertFalse(f.canWrite());
+        assertFalse(f.canExecute());
+    }
+
+    @MediumTest
     public void testTcpDefaultRwndSane() throws Exception {
         File f = new File("/proc/sys/net/ipv4/tcp_default_init_rwnd");
         assertTrue(f.canRead());
@@ -341,6 +359,36 @@
         assertFalse(f.canExecute());
     }
 
+    @MediumTest
+    public void testDeviceTreeCpuCurrent() throws Exception {
+        String arch = System.getProperty("os.arch");
+        String flavor = SystemProperties.get("ro.build.flavor");
+        String[] osVersion = System.getProperty("os.version").split("\\.");
+        /*
+         * Perform the test for only arm-based architecture and
+         * kernel version 3.10 and above.
+         */
+        if (!arch.contains("arm") ||
+            Integer.parseInt(osVersion[0]) < 2 ||
+            (Integer.parseInt(osVersion[0]) == 3 &&
+             Integer.parseInt(osVersion[1]) < 10))
+            return;
+        final File f = new File("/proc/device-tree/cpus");
+        if (!f.exists())
+            return;
+        String[] dir = f.list(new FilenameFilter() {
+            @Override
+            public boolean accept(File pathname, String name) {
+                return (pathname.isDirectory() && name.matches("cpu@[0-9]+"));
+            }
+        });
+
+        for(String cpuDir : dir) {
+            File fCpu = new File(cpuDir + "/current");
+            assertTrue(f.canRead());
+        }
+    }
+
     private static boolean isDirectoryWritable(File directory) {
         File toCreate = new File(directory, "hello");
         try {
@@ -709,17 +757,20 @@
         return retval;
     }
 
-    public void testSystemMountedRO() throws IOException {
-        ParsedMounts pm = new ParsedMounts("/proc/self/mounts");
-        String mountPoint = pm.findMountPointContaining(new File("/system"));
-        assertTrue(mountPoint + " is not mounted read-only", pm.isMountReadOnly(mountPoint));
+    public void testSystemMountedRO() throws Exception {
+        StructStatVfs vfs = Os.statvfs("/system");
+        assertTrue("/system is not mounted read-only", (vfs.f_flag & OsConstants.ST_RDONLY) != 0);
     }
 
-    public void testRootMountedRO() throws IOException {
-        ParsedMounts pm = new ParsedMounts("/proc/self/mounts");
-        String mountPoint = pm.findMountPointContaining(new File("/"));
-        assertTrue("The root directory \"" + mountPoint + "\" is not mounted read-only",
-                   pm.isMountReadOnly(mountPoint));
+    public void testRootMountedRO() throws Exception {
+        StructStatVfs vfs = Os.statvfs("/");
+        assertTrue("rootfs is not mounted read-only", (vfs.f_flag & OsConstants.ST_RDONLY) != 0);
+    }
+
+    public void testDataMountedNoSuidNoDev() throws Exception {
+        StructStatVfs vfs = Os.statvfs(getContext().getFilesDir().getAbsolutePath());
+        assertTrue("/data is not mounted NOSUID", (vfs.f_flag & OsConstants.ST_NOSUID) != 0);
+        assertTrue("/data is not mounted NODEV", (vfs.f_flag & OsConstants.ST_NODEV) != 0);
     }
 
     public void testAllBlockDevicesAreSecure() throws Exception {
@@ -1016,48 +1067,4 @@
         return !f.getAbsolutePath().equals(f.getCanonicalPath());
     }
 
-    private static class ParsedMounts {
-        private HashMap<String, Boolean> mFileReadOnlyMap = new HashMap<String, Boolean>();
-
-        private ParsedMounts(String filename) throws IOException {
-            BufferedReader br = new BufferedReader(new FileReader(filename));
-            try {
-                String line;
-                while ((line = br.readLine()) != null) {
-                    String[] fields = line.split(" ");
-                    String mountPoint = fields[1];
-                    String all_options = fields[3];
-                    String[] options = all_options.split(",");
-                    boolean foundRo = false;
-                    for (String option : options) {
-                        if ("ro".equals(option)) {
-                            foundRo = true;
-                            break;
-                        }
-                    }
-                    mFileReadOnlyMap.put(mountPoint, foundRo);
-                }
-           } finally {
-               br.close();
-           }
-        }
-
-        private boolean isMountReadOnly(String s) {
-            return mFileReadOnlyMap.get(s).booleanValue();
-        }
-
-        private String findMountPointContaining(File f) throws IOException {
-            while (f != null) {
-                f = f.getCanonicalFile();
-                String path = f.getPath();
-                if (mFileReadOnlyMap.containsKey(path)) {
-                    return path;
-                }
-                f = f.getParentFile();
-            }
-            // This should NEVER be reached, as we'll eventually hit the
-            // root directory.
-            throw new AssertionError("Unable to find mount point");
-        }
-    }
 }
diff --git a/tests/tests/permission/src/android/permission/cts/ProviderPermissionTest.java b/tests/tests/permission/src/android/permission/cts/ProviderPermissionTest.java
index 105fb81..6d55a69 100644
--- a/tests/tests/permission/src/android/permission/cts/ProviderPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/ProviderPermissionTest.java
@@ -16,9 +16,10 @@
 
 package android.permission.cts;
 
-import android.provider.Browser;
+import android.content.ContentValues;
 import android.provider.CallLog;
 import android.provider.Contacts;
+import android.provider.Settings;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.MediumTest;
 
@@ -74,48 +75,19 @@
      *   {@link android.Manifest.permission#WRITE_SETTINGS}
      */
     public void testWriteSettings() {
-        assertWritingContentUriRequiresPermission(android.provider.Settings.System.CONTENT_URI,
-                android.Manifest.permission.WRITE_SETTINGS);
-    }
+        final String permission = android.Manifest.permission.WRITE_SETTINGS;
+        ContentValues value = new ContentValues();
+        value.put(Settings.System.NAME, "name");
+        value.put(Settings.System.VALUE, "value_insert");
 
-    /**
-     * Verify that read and write to browser bookmarks requires permissions.
-     * <p>Tests Permission:
-     *   {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS}
-     */
-    public void testReadBookmarks() {
-        assertReadingContentUriRequiresPermission(Browser.BOOKMARKS_URI,
-                android.Manifest.permission.READ_HISTORY_BOOKMARKS);
-    }
-
-    /**
-     * Verify that read and write to browser bookmarks requires permissions.
-     * <p>Tests Permission:
-         {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS}
-     */
-    public void testWriteBookmarks() {
-        assertWritingContentUriRequiresPermission(Browser.BOOKMARKS_URI,
-                android.Manifest.permission.WRITE_HISTORY_BOOKMARKS);
-    }
-
-    /**
-     * Verify that read and write to browser history requires permissions.
-     * <p>Tests Permission:
-     *   {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS}
-     */
-    public void testReadBrowserHistory() {
-        assertReadingContentUriRequiresPermission(Browser.SEARCHES_URI,
-                android.Manifest.permission.READ_HISTORY_BOOKMARKS);
-    }
-
-    /**
-     * Verify that read and write to browser history requires permissions.
-     * <p>Tests Permission:
-         {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS}
-     */
-    public void testWriteBrowserHistory() {
-        assertWritingContentUriRequiresPermission(Browser.SEARCHES_URI,
-                android.Manifest.permission.WRITE_HISTORY_BOOKMARKS);
+        try {
+            getContext().getContentResolver().insert(Settings.System.CONTENT_URI, value);
+            fail("expected SecurityException requiring " + permission);
+        } catch (SecurityException expected) {
+            assertNotNull("security exception's error message.", expected.getMessage());
+            assertTrue("error message should contain \"" + permission + "\". Got: \""
+                    + expected.getMessage() + "\".",
+                    expected.getMessage().contains(permission));
+        }
     }
 }
-
diff --git a/tests/tests/permission/src/android/permission/cts/TvPermissionTest.java b/tests/tests/permission/src/android/permission/cts/TvPermissionTest.java
index 0c648c5..4139059 100644
--- a/tests/tests/permission/src/android/permission/cts/TvPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/TvPermissionTest.java
@@ -42,16 +42,6 @@
         super.tearDown();
     }
 
-    private void verifyQuery(Uri uri, final String[] projection,
-            String tableName) throws Exception {
-        try {
-            getContext().getContentResolver().query(uri, projection, null, null, null);
-            fail("Accessing " + tableName + " table should require READ_EPG_DATA permission.");
-        } catch (SecurityException e) {
-            // Expected exception
-        }
-    }
-
     public void verifyInsert(Uri uri, String tableName) throws Exception {
         try {
             ContentValues values = new ContentValues();
@@ -81,12 +71,6 @@
         }
     }
 
-    public void testQueryChannels() throws Exception {
-        if (!mHasTvInputFramework) return;
-        final String[] projection = { TvContract.Channels._ID };
-        verifyQuery(TvContract.Channels.CONTENT_URI, projection, "channels");
-    }
-
     public void testInsertChannels() throws Exception {
         if (!mHasTvInputFramework) return;
         verifyInsert(TvContract.Channels.CONTENT_URI, "channels");
@@ -102,12 +86,6 @@
         verifyDelete(TvContract.Channels.CONTENT_URI, "channels");
     }
 
-    public void testQueryPrograms() throws Exception {
-        if (!mHasTvInputFramework) return;
-        final String[] projection = { TvContract.Programs._ID };
-        verifyQuery(TvContract.Programs.CONTENT_URI, projection, "programs");
-    }
-
     public void testInsertPrograms() throws Exception {
         if (!mHasTvInputFramework) return;
         verifyInsert(TvContract.Programs.CONTENT_URI, "programs");
diff --git a/tests/tests/permission2/AndroidManifest.xml b/tests/tests/permission2/AndroidManifest.xml
index c0b78c4..984d124 100755
--- a/tests/tests/permission2/AndroidManifest.xml
+++ b/tests/tests/permission2/AndroidManifest.xml
@@ -45,6 +45,12 @@
     <!-- need app that has RECORD_AUDIO but not CAPTURE_AUDIO_OUTPUT -->
     <uses-permission android:name="android.permission.RECORD_AUDIO"/>
 
+    <!-- need app that has READ_CONTACTS but not READ_PROFILE -->
+    <uses-permission android:name="android.permission.READ_CONTACTS"/>
+
+    <!-- need app that has WRITE_CONTACTS but not WRITE_PROFILE -->
+    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
+
     <!-- need a permission that would ordinarily be granted, but has a maxSdkVersion that
          causes it to be withheld under the current API level -->
     <uses-permission
diff --git a/tests/tests/permission2/src/android/permission2/cts/ContactsProviderTest.java b/tests/tests/permission2/src/android/permission2/cts/ContactsProviderTest.java
new file mode 100644
index 0000000..5a04079
--- /dev/null
+++ b/tests/tests/permission2/src/android/permission2/cts/ContactsProviderTest.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2015 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.permission2.cts;
+
+import android.content.ContentValues;
+import android.provider.ContactsContract;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Verify that deprecated contacts permissions are not enforced.
+ */
+public class ContactsProviderTest extends AndroidTestCase {
+
+    /**
+     * Verifies that query(ContactsContract.Contacts.CONTENT_URI) only requires
+     * permission {@link android.Manifest.permission#READ_CONTACTS}.
+     */
+    @SmallTest
+    public void testQueryContacts() {
+        getContext().getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,
+                null, null, null, null);
+    }
+
+    /**
+     * Verifies that insert(ContactsContract.Contacts.CONTENT_URI) only requires
+     * permission {@link android.Manifest.permission#WRITE_CONTACTS}.
+     */
+    @SmallTest
+    public void testInsertContacts() {
+        try {
+            getContext().getContentResolver().insert(ContactsContract.Contacts.CONTENT_URI,
+                    new ContentValues());
+        } catch (SecurityException e) {
+            fail("insert(ContactsContract.Contacts.CONTENT_URI) threw SecurityException");
+        } catch (UnsupportedOperationException e) {
+            // It is okay for this fail in this manner.
+        }
+    }
+
+    /**
+     * Verifies that query(ContactsContract.Profile.CONTENT_URI) only requires
+     * permission {@link android.Manifest.permission#READ_CONTACTS}.
+     */
+    @SmallTest
+    public void testQueryProfile() {
+        getContext().getContentResolver().query(ContactsContract.Profile.CONTENT_URI,
+                null, null, null, null);
+    }
+
+    /**
+     * Verifies that insert(ContactsContract.Profile.CONTENT_URI) only requires
+     * permission {@link android.Manifest.permission#WRITE_CONTACTS}. The provider won't
+     * actually let us execute this. But at least it shouldn't throw a security exception.
+     */
+    @SmallTest
+    public void testInsertProfile() {
+     try {
+         getContext().getContentResolver().insert(ContactsContract.Profile.CONTENT_URI,
+                new ContentValues(0));
+        } catch (SecurityException e) {
+            fail("insert(ContactsContract.Profile.CONTENT_URI) threw SecurityException");
+        } catch (UnsupportedOperationException e) {
+            // It is okay for this fail in this manner.
+        }
+    }
+
+    /**
+     * Verifies that update(ContactsContract.Profile.CONTENT_URI) only requires
+     * permission {@link android.Manifest.permission#WRITE_CONTACTS}.
+     */
+    @SmallTest
+    public void testUpdateProfile() {
+        getContext().getContentResolver().update(ContactsContract.Profile.CONTENT_URI,
+                new ContentValues(0), null, null);
+    }
+}
diff --git a/tests/tests/permission2/src/android/permission2/cts/NoWriteSecureSettingsPermissionTest.java b/tests/tests/permission2/src/android/permission2/cts/NoWriteSecureSettingsPermissionTest.java
index eb476c7..b46c45d 100644
--- a/tests/tests/permission2/src/android/permission2/cts/NoWriteSecureSettingsPermissionTest.java
+++ b/tests/tests/permission2/src/android/permission2/cts/NoWriteSecureSettingsPermissionTest.java
@@ -16,6 +16,9 @@
 
 package android.permission2.cts;
 
+import android.Manifest;
+import android.content.ContentValues;
+import android.provider.Settings;
 import android.test.AndroidTestCase;
 
 /**
@@ -30,7 +33,15 @@
      *   {@link android.Manifest.permission#WRITE_SECURE_SETTINGS}
      */
     public void testWriteSecureSettings() {
-        assertWritingContentUriRequiresPermission(android.provider.Settings.Secure.CONTENT_URI,
-                android.Manifest.permission.WRITE_SECURE_SETTINGS);
+        try {
+            ContentValues values = new ContentValues();
+            values.put(Settings.Secure.NAME, Settings.Secure.ACCESSIBILITY_ENABLED);
+            values.put(Settings.Secure.VALUE, Boolean.TRUE);
+            getContext().getContentResolver().insert(Settings.Secure.CONTENT_URI, values);
+            fail("expected SecurityException requiring "
+                    + Manifest.permission.WRITE_SECURE_SETTINGS);
+        } catch (SecurityException expected) {
+           /* do nothing */
+        }
     }
 }
diff --git a/tests/tests/permission2/src/android/permission2/cts/PermissionPolicyTest.java b/tests/tests/permission2/src/android/permission2/cts/PermissionPolicyTest.java
new file mode 100644
index 0000000..a4d68cb
--- /dev/null
+++ b/tests/tests/permission2/src/android/permission2/cts/PermissionPolicyTest.java
@@ -0,0 +1,64 @@
+/*
+* Copyright (C) 2015 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.permission2.cts;
+
+import android.Manifest;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PermissionInfo;
+import android.test.AndroidTestCase;
+import android.text.TextUtils;
+import android.util.ArraySet;
+
+import java.util.Set;
+
+/**
+ * Tests for permission policy on the platform.
+ */
+public class PermissionPolicyTest extends AndroidTestCase {
+    private static final String PLATFORM_PACKAGE_NAME = "android";
+
+    private static final Set<String> PERMISSION_GROUPS = new ArraySet<>();
+    static {
+        PERMISSION_GROUPS.add(Manifest.permission_group.CALENDAR);
+        PERMISSION_GROUPS.add(Manifest.permission_group.CAMERA);
+        PERMISSION_GROUPS.add(Manifest.permission_group.CONTACTS);
+        PERMISSION_GROUPS.add(Manifest.permission_group.LOCATION);
+        PERMISSION_GROUPS.add(Manifest.permission_group.MICROPHONE);
+        PERMISSION_GROUPS.add(Manifest.permission_group.PHONE);
+        PERMISSION_GROUPS.add(Manifest.permission_group.SENSORS);
+        PERMISSION_GROUPS.add(Manifest.permission_group.SMS);
+        PERMISSION_GROUPS.add(Manifest.permission_group.STORAGE);
+    }
+
+    public void testPlatformDefinedRuntimePermissionValid() throws Exception {
+        PackageManager packageManager = getContext().getPackageManager();
+        PackageInfo packageInfo = packageManager.getPackageInfo(PLATFORM_PACKAGE_NAME,
+                PackageManager.GET_PERMISSIONS);
+        for (PermissionInfo permission : packageInfo.permissions) {
+            if ((permission.protectionLevel & PermissionInfo.PROTECTION_DANGEROUS) == 0) {
+                continue;
+            }
+            assertTrue(permission.name + " must be in one of these groups: " + PERMISSION_GROUPS,
+                    PERMISSION_GROUPS.contains(permission.group));
+            assertFalse(permission.name + " must have non-empty label",
+                    TextUtils.isEmpty(permission.loadLabel(packageManager)));
+            assertFalse(permission.name + " must have non-empty description",
+                    TextUtils.isEmpty(permission.loadDescription(packageManager)));
+        }
+    }
+}
diff --git a/tests/tests/permission2/src/android/permission2/cts/ReadSocialStreamPermissionTest.java b/tests/tests/permission2/src/android/permission2/cts/ReadSocialStreamPermissionTest.java
deleted file mode 100644
index eaf6fdf..0000000
--- a/tests/tests/permission2/src/android/permission2/cts/ReadSocialStreamPermissionTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2012 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.permission2.cts;
-
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.net.Uri;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.RawContacts;
-import android.provider.ContactsContract.StreamItems;
-import android.test.AndroidTestCase;
-
-public class ReadSocialStreamPermissionTest extends AndroidTestCase {
-
-    private ContentResolver mResolver;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mResolver = mContext.getContentResolver();
-    }
-
-    public void testReadSocialStreamPermission_byRawContactId() throws Exception {
-        try {
-            mResolver.query(Uri.withAppendedPath(
-                    ContentUris.withAppendedId(RawContacts.CONTENT_URI, 1337),
-                    Contacts.StreamItems.CONTENT_DIRECTORY), null, null, null, null);
-            fail("Expected a READ_SOCIAL_STREAM exception");
-        } catch (SecurityException e) {
-            // Expect a READ_SOCIAL_STREAM exception.
-        }
-    }
-
-    public void testReadSocialStreamPermission_byContactId() throws Exception {
-        try {
-            mResolver.query(Uri.withAppendedPath(
-                    ContentUris.withAppendedId(Contacts.CONTENT_URI, 1337),
-                    Contacts.StreamItems.CONTENT_DIRECTORY), null, null, null, null);
-            fail("Expected a READ_SOCIAL_STREAM exception");
-        } catch (SecurityException e) {
-            // Expect a READ_SOCIAL_STREAM exception.
-        }
-    }
-
-    public void testReadSocialStreamPermission_byLookUpKey() throws Exception {
-        try {
-            mResolver.query(Contacts.CONTENT_LOOKUP_URI.buildUpon()
-                    .appendPath("lookDownKey")
-                    .appendPath(Contacts.StreamItems.CONTENT_DIRECTORY)
-                    .build(), null, null, null, null);
-            fail("Expected a READ_SOCIAL_STREAM exception");
-        } catch (SecurityException e) {
-            // Expect a READ_SOCIAL_STREAM exception.
-        }
-    }
-
-    public void testReadSocialStreamPermission_byStreamItemId() throws Exception {
-        try {
-            mResolver.query(ContentUris.withAppendedId(StreamItems.CONTENT_URI, 1337),
-                    null, null, null, null);
-            fail("Expected a READ_SOCIAL_STREAM exception");
-        } catch (SecurityException e) {
-            // Expect a READ_SOCIAL_STREAM exception.
-        }
-    }
-}
diff --git a/tests/tests/permission2/src/android/permission2/cts/WriteSocialStreamPermissionTest.java b/tests/tests/permission2/src/android/permission2/cts/WriteSocialStreamPermissionTest.java
deleted file mode 100644
index 262fcfa..0000000
--- a/tests/tests/permission2/src/android/permission2/cts/WriteSocialStreamPermissionTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2012 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.permission2.cts;
-
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.net.Uri;
-import android.provider.ContactsContract.RawContacts;
-import android.provider.ContactsContract.StreamItems;
-import android.test.AndroidTestCase;
-
-public class WriteSocialStreamPermissionTest extends AndroidTestCase {
-
-    private ContentResolver mResolver;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mResolver = mContext.getContentResolver();
-    }
-
-    public void testWriteSocialStreamPermission_byContentDirectory() throws Exception {
-        try {
-            ContentValues values = new ContentValues();
-            mResolver.insert(Uri.withAppendedPath(
-                    ContentUris.withAppendedId(RawContacts.CONTENT_URI, 1337),
-                    RawContacts.StreamItems.CONTENT_DIRECTORY), values);
-            fail("Expected a WRITE_SOCIAL_STREAM exception");
-        } catch (SecurityException e) {
-            // Expect a WRITE_SOCIAL_STREAM exception.
-        }
-    }
-
-    public void testWriteSocialStreamPermission_byContentUri() throws Exception {
-        try {
-            ContentValues values = new ContentValues();
-            mResolver.insert(StreamItems.CONTENT_URI, values);
-            fail("Expected a WRITE_SOCIAL_STREAM exception");
-        } catch (SecurityException e) {
-            // Expect a WRITE_SOCIAL_STREAM exception.
-        }
-    }
-}
diff --git a/tests/tests/print/Android.mk b/tests/tests/print/Android.mk
index 516f6a0..2ece2cf 100644
--- a/tests/tests/print/Android.mk
+++ b/tests/tests/print/Android.mk
@@ -18,15 +18,11 @@
 
 LOCAL_MODULE_TAGS := optional
 
-LOCAL_SRC_FILES := $(call all-java-files-under, src) \
-    src/android/print/cts/IPrivilegedOperations.aidl
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 LOCAL_PACKAGE_NAME := CtsPrintTestCases
 
-LOCAL_STATIC_JAVA_LIBRARIES := mockito-target ctstestrunner ub-uiautomator
-
-# This test runner sets up/cleans up the device before/after running the tests.
-LOCAL_CTS_TEST_RUNNER := com.android.cts.tradefed.testtype.PrintTestRunner
+LOCAL_STATIC_JAVA_LIBRARIES := mockito-target ctstestrunner ub-uiautomator ctsdeviceutil
 
 LOCAL_SDK_VERSION := current
 
diff --git a/tests/tests/print/src/android/print/cts/BasePrintTest.java b/tests/tests/print/src/android/print/cts/BasePrintTest.java
index c73bb64..e75ec94 100644
--- a/tests/tests/print/src/android/print/cts/BasePrintTest.java
+++ b/tests/tests/print/src/android/print/cts/BasePrintTest.java
@@ -28,6 +28,7 @@
 import android.content.pm.PackageManager;
 import android.content.res.Configuration;
 import android.content.res.Resources;
+import android.cts.util.SystemUtil;
 import android.graphics.pdf.PdfDocument;
 import android.os.Bundle;
 import android.os.CancellationSignal;
@@ -59,9 +60,13 @@
 import org.mockito.InOrder;
 import org.mockito.stubbing.Answer;
 
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 import java.util.concurrent.TimeoutException;
@@ -73,12 +78,18 @@
 
     private static final long OPERATION_TIMEOUT = 100000000;
 
-    private static final String ARG_PRIVILEGED_OPS = "ARG_PRIVILEGED_OPS";
-
     private static final String PRINT_SPOOLER_PACKAGE_NAME = "com.android.printspooler";
 
     protected static final String PRINT_JOB_NAME = "Test";
 
+    private static final String PM_CLEAR_SUCCESS_OUTPUT = "Success";
+
+    private static final String COMMAND_LIST_ENABLED_IME_COMPONENTS = "ime list -s";
+
+    private static final String COMMAND_PREFIX_ENABLE_IME = "ime enable ";
+
+    private static final String COMMAND_PREFIX_DISABLE_IME = "ime disable ";
+
     private PrintDocumentActivity mActivity;
 
     private Locale mOldLocale;
@@ -90,10 +101,49 @@
     private CallCounter mPrintJobQueuedCallCounter;
     private CallCounter mDestroySessionCallCounter;
 
+    private String[] mEnabledImes;
+
+    private String[] getEnabledImes() throws IOException {
+        List<String> imeList = new ArrayList<>();
+
+        ParcelFileDescriptor pfd = getInstrumentation().getUiAutomation()
+                .executeShellCommand(COMMAND_LIST_ENABLED_IME_COMPONENTS);
+        BufferedReader reader = new BufferedReader(
+                new InputStreamReader(new FileInputStream(pfd.getFileDescriptor())));
+
+        String line;
+        while ((line = reader.readLine()) != null) {
+            imeList.add(line);
+        }
+
+        String[] imeArray = new String[imeList.size()];
+        imeList.toArray(imeArray);
+
+        return imeArray;
+    }
+
+    private void disableImes() throws Exception {
+        mEnabledImes = getEnabledImes();
+        for (String ime : mEnabledImes) {
+            String disableImeCommand = COMMAND_PREFIX_DISABLE_IME + ime;
+            SystemUtil.runShellCommand(getInstrumentation(), disableImeCommand);
+        }
+    }
+
+    private void enableImes() throws Exception {
+        for (String ime : mEnabledImes) {
+            String enableImeCommand = COMMAND_PREFIX_ENABLE_IME + ime;
+            SystemUtil.runShellCommand(getInstrumentation(), enableImeCommand);
+        }
+        mEnabledImes = null;
+    }
+
     @Override
     public void setUp() throws Exception {
         // Make sure we start with a clean slate.
         clearPrintSpoolerData();
+        enablePrintServices();
+        disableImes();
 
         // Workaround for dexmaker bug: https://code.google.com/p/dexmaker/issues/detail?id=2
         // Dexmaker is used by mockito.
@@ -128,6 +178,7 @@
     public void tearDown() throws Exception {
         // Done with the activity.
         getActivity().finish();
+        enableImes();
 
         // Restore the locale if needed.
         if (mOldLocale != null) {
@@ -139,6 +190,7 @@
             resources.updateConfiguration(newConfiguration, displayMetrics);
         }
 
+        disablePrintServices();
         // Make sure the spooler is cleaned.
         clearPrintSpoolerData();
     }
@@ -272,6 +324,19 @@
         }
     }
 
+    protected void changeDuplex(String duplex) throws UiObjectNotFoundException {
+        try {
+            UiObject duplexSpinner = new UiObject(new UiSelector().resourceId(
+                    "com.android.printspooler:id/duplex_spinner"));
+            duplexSpinner.click();
+            UiObject duplexOption = new UiObject(new UiSelector().text(duplex));
+            duplexOption.click();
+        } catch (UiObjectNotFoundException e) {
+            dumpWindowHierarchy();
+            throw new UiObjectNotFoundException(e);
+        }
+    }
+
     protected void clickPrintButton() throws UiObjectNotFoundException {
         try {
             UiObject printButton = new UiObject(new UiSelector().resourceId(
@@ -306,9 +371,24 @@
     }
 
     protected void clearPrintSpoolerData() throws Exception {
-        IPrivilegedOperations privilegedOps = IPrivilegedOperations.Stub.asInterface(
-                getParams().getBinder(ARG_PRIVILEGED_OPS));
-        privilegedOps.clearApplicationUserData(PRINT_SPOOLER_PACKAGE_NAME);
+        assertTrue("failed to clear print spooler data",
+                SystemUtil.runShellCommand(getInstrumentation(),
+                        String.format("pm clear %s", PRINT_SPOOLER_PACKAGE_NAME))
+                            .contains(PM_CLEAR_SUCCESS_OUTPUT));
+    }
+
+    private void enablePrintServices() throws Exception {
+        String pkgName = getInstrumentation().getContext().getPackageName();
+        String enabledServicesValue = String.format("%s/%s:%s/%s",
+                pkgName, FirstPrintService.class.getCanonicalName(),
+                pkgName, SecondPrintService.class.getCanonicalName());
+        SystemUtil.runShellCommand(getInstrumentation(),
+                "settings put secure enabled_print_services " + enabledServicesValue);
+    }
+
+    private void disablePrintServices() throws Exception {
+        SystemUtil.runShellCommand(getInstrumentation(),
+                "settings put secure enabled_print_services \"\"");
     }
 
     protected void verifyLayoutCall(InOrder inOrder, PrintDocumentAdapter mock,
diff --git a/tests/tests/print/src/android/print/cts/IPrivilegedOperations.aidl b/tests/tests/print/src/android/print/cts/IPrivilegedOperations.aidl
deleted file mode 100644
index 93c8c3e..0000000
--- a/tests/tests/print/src/android/print/cts/IPrivilegedOperations.aidl
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2014 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.print.cts;
-
-interface IPrivilegedOperations {
-    boolean clearApplicationUserData(String packageName);
-}
diff --git a/tests/tests/print/src/android/print/cts/PrintDocumentAdapterContractTest.java b/tests/tests/print/src/android/print/cts/PrintDocumentAdapterContractTest.java
index 538472e..9f1e3a5 100644
--- a/tests/tests/print/src/android/print/cts/PrintDocumentAdapterContractTest.java
+++ b/tests/tests/print/src/android/print/cts/PrintDocumentAdapterContractTest.java
@@ -160,6 +160,7 @@
                 .setResolution(new Resolution("300x300", "300x300", 300, 300))
                 .setMinMargins(Margins.NO_MARGINS)
                 .setColorMode(PrintAttributes.COLOR_MODE_COLOR)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_LONG_EDGE)
                 .build();
         verifyLayoutCall(inOrder, adapter, secondOldAttributes, secondNewAttributes, true);
 
@@ -353,6 +354,12 @@
         // Wait for layout.
         waitForLayoutAdapterCallbackCount(5);
 
+        // Change the duplex.
+        changeDuplex("Short edge");
+
+        // Wait for layout.
+        waitForLayoutAdapterCallbackCount(6);
+
         // Click the print button.
         clickPrintButton();
 
@@ -394,6 +401,7 @@
                 .setResolution(new Resolution("300x300", "300x300", 300, 300))
                 .setMinMargins(Margins.NO_MARGINS)
                 .setColorMode(PrintAttributes.COLOR_MODE_COLOR)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_LONG_EDGE)
                 .build();
         verifyLayoutCall(inOrder, adapter, secondOldAttributes, secondNewAttributes, true);
 
@@ -406,6 +414,7 @@
                 .setResolution(new Resolution("300x300", "300x300", 300, 300))
                 .setMinMargins(Margins.NO_MARGINS)
                 .setColorMode(PrintAttributes.COLOR_MODE_COLOR)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_LONG_EDGE)
                 .build();
         verifyLayoutCall(inOrder, adapter, thirdOldAttributes, thirdNewAttributes, true);
 
@@ -418,6 +427,7 @@
                 .setResolution(new Resolution("300x300", "300x300", 300, 300))
                 .setMinMargins(Margins.NO_MARGINS)
                 .setColorMode(PrintAttributes.COLOR_MODE_COLOR)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_LONG_EDGE)
                 .build();
         verifyLayoutCall(inOrder, adapter, fourthOldAttributes, fourthNewAttributes, true);
 
@@ -430,11 +440,25 @@
                 .setResolution(new Resolution("300x300", "300x300", 300, 300))
                 .setMinMargins(Margins.NO_MARGINS)
                 .setColorMode(PrintAttributes.COLOR_MODE_MONOCHROME)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_LONG_EDGE)
                 .build();
         verifyLayoutCall(inOrder, adapter, fifthOldAttributes, fifthNewAttributes, true);
 
+        // We changed the duplex which triggers a layout. Since we passed
+        // false to the layout callback meaning that the content didn't change,
+        // there shouldn't be a next call to write.
+        PrintAttributes sixthOldAttributes = fifthNewAttributes;
+        PrintAttributes sixthNewAttributes = new PrintAttributes.Builder()
+                .setMediaSize(MediaSize.ISO_A4.asLandscape())
+                .setResolution(new Resolution("300x300", "300x300", 300, 300))
+                .setMinMargins(Margins.NO_MARGINS)
+                .setColorMode(PrintAttributes.COLOR_MODE_MONOCHROME)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_SHORT_EDGE)
+                .build();
+        verifyLayoutCall(inOrder, adapter, sixthOldAttributes, sixthNewAttributes, true);
+
         // When print is pressed we ask for a layout which is *not* for preview.
-        verifyLayoutCall(inOrder, adapter, fifthNewAttributes, fifthNewAttributes, false);
+        verifyLayoutCall(inOrder, adapter, sixthNewAttributes, sixthNewAttributes, false);
 
         // When print is pressed we ask for all selected pages but we got
         // them when asking for the ones for a preview, and the adapter does
@@ -565,6 +589,7 @@
                 .setResolution(new Resolution("PDF resolution", "PDF resolution", 300, 300))
                 .setMinMargins(new Margins(0, 0, 0, 0))
                 .setColorMode(PrintAttributes.COLOR_MODE_COLOR)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_LONG_EDGE)
                 .build();
         verifyLayoutCall(inOrder, adapter, secondOldAttributes, secondNewAttributes, true);
 
@@ -575,6 +600,7 @@
                 .setResolution(new Resolution("PDF resolution", "PDF resolution", 300, 300))
                 .setMinMargins(new Margins(0, 0, 0, 0))
                 .setColorMode(PrintAttributes.COLOR_MODE_MONOCHROME)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_LONG_EDGE)
                 .build();
         verifyLayoutCall(inOrder, adapter, thirdOldAttributes, thirdNewAttributes, true);
 
@@ -706,7 +732,9 @@
         PrintAttributes secondNewAttributes = new PrintAttributes.Builder()
                 .setMediaSize(MediaSize.ISO_A3)
                 .setResolution(new Resolution("300x300", "300x300", 300, 300))
-                .setMinMargins(Margins.NO_MARGINS).setColorMode(PrintAttributes.COLOR_MODE_COLOR)
+                .setMinMargins(Margins.NO_MARGINS)
+                .setColorMode(PrintAttributes.COLOR_MODE_COLOR)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_LONG_EDGE)
                 .build();
         verifyLayoutCall(inOrder, adapter, secondOldAttributes, secondNewAttributes, true);
 
@@ -937,7 +965,9 @@
         PrintAttributes secondNewAttributes = new PrintAttributes.Builder()
                 .setMediaSize(MediaSize.ISO_A3)
                 .setResolution(new Resolution("300x300", "300x300", 300, 300))
-                .setMinMargins(Margins.NO_MARGINS).setColorMode(PrintAttributes.COLOR_MODE_COLOR)
+                .setMinMargins(Margins.NO_MARGINS)
+                .setColorMode(PrintAttributes.COLOR_MODE_COLOR)
+                .setDuplexMode(PrintAttributes.DUPLEX_MODE_LONG_EDGE)
                 .build();
         verifyLayoutCall(inOrder, adapter, secondOldAttributes, secondNewAttributes, true);
 
@@ -1573,8 +1603,13 @@
                         .addResolution(new Resolution("200x200", "200x200", 200, 200), true)
                         .addResolution(new Resolution("300x300", "300x300", 300, 300), false)
                         .setColorModes(PrintAttributes.COLOR_MODE_COLOR
-                                | PrintAttributes.COLOR_MODE_MONOCHROME,
-                                PrintAttributes.COLOR_MODE_MONOCHROME)
+                                        | PrintAttributes.COLOR_MODE_MONOCHROME,
+                                PrintAttributes.COLOR_MODE_MONOCHROME
+                        )
+                        .setDuplexModes(PrintAttributes.DUPLEX_MODE_LONG_EDGE
+                                        | PrintAttributes.DUPLEX_MODE_SHORT_EDGE,
+                                PrintAttributes.DUPLEX_MODE_LONG_EDGE
+                        )
                         .build();
                     PrinterInfo secondPrinter = new PrinterInfo.Builder(secondPrinterId,
                             "Second printer", PrinterInfo.STATUS_IDLE)
diff --git a/tests/tests/provider/AndroidManifest.xml b/tests/tests/provider/AndroidManifest.xml
index abda46c..ed180f6 100644
--- a/tests/tests/provider/AndroidManifest.xml
+++ b/tests/tests/provider/AndroidManifest.xml
@@ -18,6 +18,8 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="com.android.cts.provider">
 
+    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="21" />
+
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
     <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
     <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
@@ -25,22 +27,16 @@
     <uses-permission android:name="android.permission.USE_CREDENTIALS" />
     <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
     <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
-    <uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS" />
-    <uses-permission android:name="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS" />
     <uses-permission android:name="android.permission.WRITE_CALENDAR" />
     <uses-permission android:name="android.permission.READ_CALENDAR" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
-    <uses-permission android:name="android.permission.WRITE_USER_DICTIONARY" />
-    <uses-permission android:name="android.permission.READ_USER_DICTIONARY" />
     <uses-permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL" />
     <uses-permission android:name="android.permission.WRITE_CALL_LOG" />
     <uses-permission android:name="android.permission.WRITE_CONTACTS" />
-    <uses-permission android:name="android.permission.WRITE_SOCIAL_STREAM" />
     <uses-permission android:name="android.permission.READ_CALL_LOG" />
     <uses-permission android:name="android.permission.READ_CONTACTS" />
-    <uses-permission android:name="android.permission.READ_SOCIAL_STREAM" />
 
     <application>
         <uses-library android:name="android.test.runner"/>
@@ -64,6 +60,15 @@
                        android:resource="@xml/contactprovider_authenticator"/>
         </service>
 
+        <service android:name=".MockInputMethodService"
+                 android:label="UserDictionaryInputMethodTestService"
+                 android:permission="android.permission.BIND_INPUT_METHOD">
+            <intent-filter>
+                <action android:name="android.view.InputMethod" />
+            </intent-filter>
+            <meta-data android:name="android.view.im"
+                       android:resource="@xml/method" />
+        </service>
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/tests/tests/provider/AndroidTest.xml b/tests/tests/provider/AndroidTest.xml
new file mode 100644
index 0000000..ae603a3
--- /dev/null
+++ b/tests/tests/provider/AndroidTest.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 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
+  -->
+<configuration description="Test module config for provider">
+    <include name="common-config" />
+    <option name="cts-apk-installer:test-file-name" value="CtsProviderTestCases.apk" />
+    <option name="run-command:run-command"
+            value="ime enable com.android.cts.provider/.MockInputMethodService" />
+</configuration>
\ No newline at end of file
diff --git a/tests/tests/provider/res/xml/method.xml b/tests/tests/provider/res/xml/method.xml
new file mode 100644
index 0000000..5ac1b80
--- /dev/null
+++ b/tests/tests/provider/res/xml/method.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 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
+  -->
+
+<input-method xmlns:android="http://schemas.android.com/apk/res/android"
+              android:settingsActivity="android.provider.cts.NoSuchActivity"
+/>
diff --git a/tests/tests/provider/src/android/provider/cts/BrowserTest.java b/tests/tests/provider/src/android/provider/cts/BrowserTest.java
deleted file mode 100644
index 9f96412..0000000
--- a/tests/tests/provider/src/android/provider/cts/BrowserTest.java
+++ /dev/null
@@ -1,697 +0,0 @@
-/*
- * Copyright (C) 2008 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.provider.cts;
-
-import android.app.ActivityManager;
-import android.app.ActivityManager.RunningTaskInfo;
-import android.content.ContentProviderClient;
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.RemoteException;
-import android.provider.Browser;
-import android.provider.Browser.BookmarkColumns;
-import android.provider.Browser.SearchColumns;
-import android.test.ActivityInstrumentationTestCase2;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-public class BrowserTest extends ActivityInstrumentationTestCase2<BrowserStubActivity> {
-    public BrowserTest() {
-        super("com.android.cts.provider", BrowserStubActivity.class);
-    }
-
-    private Context mContext;
-    private ContentResolver mContentResolver;
-    private ContentProviderClient mProvider;
-    private BrowserStubActivity mActivity;
-    private boolean mMasterSyncEnabled;
-
-    // the backup for the 2 tables which we will modify in test cases
-    private ArrayList<ContentValues> mBookmarksBackup;
-    private ArrayList<ContentValues> mSearchesBackup;
-
-    private static final String ADD_BOOKMARK_CLASS_NAME =
-            "com.android.browser.AddBookmarkPage";
-    private static final String COMPOSE_MESSAGE_CLASS_NAME =
-            "com.android.mms.ui.ComposeMessageActivity";
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        mContext = getInstrumentation().getTargetContext();
-        mContentResolver = mContext.getContentResolver();
-        mProvider = mContentResolver.acquireContentProviderClient(
-                Browser.BOOKMARKS_URI.getAuthority());
-        mBookmarksBackup = new ArrayList<ContentValues>();
-        mSearchesBackup = new ArrayList<ContentValues>();
-
-        // Disable sync
-        mMasterSyncEnabled = ContentResolver.getMasterSyncAutomatically();
-        ContentResolver.setMasterSyncAutomatically(false);
-
-        // backup the current contents in database
-        Cursor cursor = mProvider.query(Browser.BOOKMARKS_URI, null, null, null, null, null);
-        while (cursor.moveToNext()) {
-            String[] colNames = cursor.getColumnNames();
-            ContentValues value = new ContentValues();
-
-            for (int i = 0; i < colNames.length; i++) {
-                switch (cursor.getType(i)) {
-                case Cursor.FIELD_TYPE_BLOB:
-                    value.put(colNames[i], cursor.getBlob(i));
-                    break;
-                case Cursor.FIELD_TYPE_FLOAT:
-                    value.put(colNames[i], cursor.getFloat(i));
-                    break;
-                case Cursor.FIELD_TYPE_INTEGER:
-                    if (!"_ID".equalsIgnoreCase(colNames[i])) {
-                        value.put(colNames[i], cursor.getLong(i));
-                    }
-                    break;
-                case Cursor.FIELD_TYPE_STRING:
-                    value.put(colNames[i], cursor.getString(i));
-                    break;
-                }
-            }
-            mBookmarksBackup.add(value);
-        }
-
-        cursor.close();
-
-        cursor = mProvider.query(Browser.SEARCHES_URI, null, null, null, null, null);
-        if (cursor.moveToFirst()) {
-            while (!cursor.isAfterLast()) {
-                ContentValues value = new ContentValues();
-
-                value.put(SearchColumns._ID, cursor.getInt(0));
-                value.put(SearchColumns.SEARCH, cursor.getString(1));
-                value.put(SearchColumns.DATE, cursor.getLong(2));
-                mSearchesBackup.add(value);
-
-                cursor.moveToNext();
-            };
-        }
-        cursor.close();
-
-        mProvider.delete(Browser.BOOKMARKS_URI, null, null);
-        mProvider.delete(Browser.SEARCHES_URI, null, null);
-
-        mActivity = getActivity();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        try {
-            // clear all new contents added in test cases.
-            mProvider.delete(Browser.BOOKMARKS_URI, null, null);
-            mProvider.delete(Browser.SEARCHES_URI, null, null);
-
-            // recover the old backup contents
-            for (ContentValues value : mBookmarksBackup) {
-                mProvider.insert(Browser.BOOKMARKS_URI, value);
-            }
-
-            for (ContentValues value : mSearchesBackup) {
-                mProvider.insert(Browser.SEARCHES_URI, value);
-            }
-
-            // Re-enable sync
-            ContentResolver.setMasterSyncAutomatically(mMasterSyncEnabled);
-        } finally {
-            super.tearDown();
-        }
-    }
-
-    public void testAccessSearches() {
-        final String searchString = "search string";
-        final String searchStringAnother = "another search string";
-        Cursor cursor;
-
-        try {
-            Browser.addSearchUrl(mContentResolver, searchString);
-            cursor = mProvider.query(
-                    Browser.SEARCHES_URI,
-                    Browser.SEARCHES_PROJECTION,
-                    null, null, null, null);
-            assertEquals(1, cursor.getCount());
-            cursor.moveToFirst();
-            assertEquals(searchString,
-                    cursor.getString(Browser.SEARCHES_PROJECTION_SEARCH_INDEX));
-            long oldDate = cursor.getLong(Browser.SEARCHES_PROJECTION_DATE_INDEX);
-            cursor.close();
-
-            Browser.addSearchUrl(mContentResolver, searchString);
-            cursor = mProvider.query(Browser.SEARCHES_URI,
-                    Browser.SEARCHES_PROJECTION,
-                    null, null, null, null);
-            assertEquals(1, cursor.getCount());
-            cursor.moveToFirst();
-            long date = cursor.getLong(Browser.SEARCHES_PROJECTION_DATE_INDEX);
-            assertTrue(date > oldDate);
-            assertEquals(searchString,
-                    cursor.getString(Browser.SEARCHES_PROJECTION_SEARCH_INDEX));
-            cursor.close();
-
-            Browser.addSearchUrl(mContentResolver, searchStringAnother);
-            cursor = mProvider.query(Browser.SEARCHES_URI,
-                    Browser.SEARCHES_PROJECTION,
-                    null, null, null, null);
-            assertEquals(2, cursor.getCount());
-            cursor.moveToFirst();
-            assertEquals(searchString,
-                    cursor.getString(Browser.SEARCHES_PROJECTION_SEARCH_INDEX));
-            cursor.moveToNext();
-            assertEquals(searchStringAnother,
-                    cursor.getString(Browser.SEARCHES_PROJECTION_SEARCH_INDEX));
-            cursor.close();
-
-            Browser.clearSearches(mContentResolver);
-            cursor = mProvider.query(
-                    Browser.SEARCHES_URI,
-                    Browser.SEARCHES_PROJECTION,
-                    null, null, null, null);
-            assertEquals(0, cursor.getCount());
-        } catch (RemoteException e) {
-            fail("Unexpected RemoteException");
-        }
-    }
-
-    public void testGetAllBookmarks() {
-        Cursor cursor;
-        final String bookmarkUrl1 = "www.bookmark1.com";
-        final String bookmarkUrl2 = "www.bookmark2.com";
-        final String historyUrl = "www.history.com";
-
-        try {
-            cursor = Browser.getAllBookmarks(mContentResolver);
-            assertEquals(0, cursor.getCount());
-            cursor.close();
-
-            ContentValues value = new ContentValues();
-            value.put(BookmarkColumns.URL, bookmarkUrl1);
-            value.put(BookmarkColumns.BOOKMARK, 1);
-            mProvider.insert(Browser.BOOKMARKS_URI, value);
-            value.put(BookmarkColumns.URL, bookmarkUrl2);
-            value.put(BookmarkColumns.BOOKMARK, 1);
-            mProvider.insert(Browser.BOOKMARKS_URI, value);
-            value.put(BookmarkColumns.URL, historyUrl);
-            value.put(BookmarkColumns.BOOKMARK, 0);
-            mProvider.insert(Browser.BOOKMARKS_URI, value);
-            cursor = Browser.getAllBookmarks(mContentResolver);
-            assertEquals(2, cursor.getCount());
-            cursor.moveToFirst();
-            assertEquals(bookmarkUrl1, cursor.getString(0));
-            cursor.moveToNext();
-            assertEquals(bookmarkUrl2, cursor.getString(0));
-        } catch (RemoteException e) {
-            fail("unexpected RemoteException");
-        }
-    }
-
-    public void testGetAllVisitedUrls() {
-        Cursor cursor;
-        final String visitedUrl1 = "www.visited1.com";
-        final String visitedUrl2 = "www.visited2.com";
-        final String visitedUrl3 = "www.visited3.com";
-
-        try {
-            cursor = Browser.getAllVisitedUrls(mContentResolver);
-            assertEquals(0, cursor.getCount());
-            cursor.close();
-
-            ContentValues value = new ContentValues();
-            value.put(BookmarkColumns.URL, visitedUrl1);
-            value.put(BookmarkColumns.BOOKMARK, 1);
-            value.put(BookmarkColumns.VISITS, 1);
-            mProvider.insert(Browser.BOOKMARKS_URI, value);
-            value.put(BookmarkColumns.URL, visitedUrl2);
-            value.put(BookmarkColumns.BOOKMARK, 0);
-            value.put(BookmarkColumns.VISITS, 5);
-            mProvider.insert(Browser.BOOKMARKS_URI, value);
-            value.put(BookmarkColumns.URL, visitedUrl3);
-            value.put(BookmarkColumns.BOOKMARK, 1);
-            value.put(BookmarkColumns.VISITS, 0);
-            mProvider.insert(Browser.BOOKMARKS_URI, value);
-            cursor = Browser.getAllVisitedUrls(mContentResolver);
-            assertEquals(3, cursor.getCount());
-            cursor.moveToFirst();
-            assertEquals(visitedUrl1, cursor.getString(0));
-            cursor.moveToNext();
-            assertEquals(visitedUrl2, cursor.getString(0));
-            cursor.moveToNext();
-            assertEquals(visitedUrl3, cursor.getString(0));
-        } catch (RemoteException e) {
-            fail("unexpected RemoteException");
-        }
-    }
-
-    public void testUpdateVisitedHistory() {
-        Cursor cursor;
-        final String visitedHistoryUrl = "www.visited-history.com";
-        long oldTime = 0;
-
-        try {
-            cursor = mProvider.query(
-                    Browser.BOOKMARKS_URI,
-                    Browser.HISTORY_PROJECTION,
-                    null, null, null, null);
-            assertEquals(0, cursor.getCount());
-            cursor.close();
-            Browser.updateVisitedHistory(mContentResolver, visitedHistoryUrl, true);
-            cursor = mProvider.query(
-                    Browser.BOOKMARKS_URI,
-                    Browser.HISTORY_PROJECTION,
-                    null, null, null, null);
-            assertEquals(1, cursor.getCount());
-            cursor.moveToFirst();
-            assertEquals(visitedHistoryUrl, cursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX));
-            assertEquals(visitedHistoryUrl,
-                    cursor.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX));
-            assertEquals(0, cursor.getInt(Browser.HISTORY_PROJECTION_BOOKMARK_INDEX));
-            assertEquals(1, cursor.getInt(Browser.HISTORY_PROJECTION_VISITS_INDEX));
-            oldTime = cursor.getLong(Browser.HISTORY_PROJECTION_DATE_INDEX);
-            cursor.close();
-
-            Browser.updateVisitedHistory(mContentResolver, visitedHistoryUrl, true);
-            cursor = mProvider.query(
-                    Browser.BOOKMARKS_URI,
-                    Browser.HISTORY_PROJECTION,
-                    null, null, null, null);
-            assertEquals(1, cursor.getCount());
-            cursor.moveToFirst();
-            assertEquals(visitedHistoryUrl, cursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX));
-            assertEquals(visitedHistoryUrl,
-                    cursor.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX));
-            assertEquals(0, cursor.getInt(Browser.HISTORY_PROJECTION_BOOKMARK_INDEX));
-            assertEquals(2, cursor.getInt(Browser.HISTORY_PROJECTION_VISITS_INDEX));
-            assertTrue(oldTime < cursor.getLong(Browser.HISTORY_PROJECTION_DATE_INDEX));
-            cursor.close();
-        } catch (RemoteException e1) {
-            fail("unexpected RemoteException");
-        }
-    }
-
-    public void testAccessHistory() {
-        Cursor cursor;
-        // NOTE: this value must keep same with the Browser.MAX_HISTORY_COUNT.
-        final int MAX_HISTORY_COUNT = 250;
-        final String bookmarkUrl = "www.visited-bookmark.com";
-        final String historyUrlPrefix = "www.visited-history";
-        final String historyUrlPostfix = ".com";
-        final long TIME_BASE = new Date().getTime() - 1000;
-            try {
-            assertFalse(Browser.canClearHistory(mContentResolver));
-            Browser.clearHistory(mContentResolver);
-            assertFalse(Browser.canClearHistory(mContentResolver));
-
-            // The total number of the history table's rows: MAX_HISTORY_COUNT,
-            // but there is 1 row is a bookmark.
-            // The date of the history is from 1 ~ (MAX_HISTORY_COUNT - 1).
-            ContentValues value = new ContentValues();
-            for (int i = 1; i <= MAX_HISTORY_COUNT - 1; i++) {
-                value.put(BookmarkColumns.URL, historyUrlPrefix + i + historyUrlPostfix);
-                value.put(BookmarkColumns.BOOKMARK, 0);
-                value.put(BookmarkColumns.DATE, i + TIME_BASE);
-                mProvider.insert(Browser.BOOKMARKS_URI, value);
-            }
-            value.put(BookmarkColumns.URL, bookmarkUrl);
-            value.put(BookmarkColumns.BOOKMARK, 1);
-            value.put(BookmarkColumns.VISITS, 5);
-            value.put(BookmarkColumns.DATE, new Date().getTime());
-            mProvider.insert(Browser.BOOKMARKS_URI, value);
-            value.clear();
-            cursor = mProvider.query(
-                    Browser.BOOKMARKS_URI,
-                    Browser.HISTORY_PROJECTION,
-                    null, null, null, null);
-            assertEquals(MAX_HISTORY_COUNT, cursor.getCount());
-            cursor.close();
-            Browser.truncateHistory(mContentResolver);
-            cursor = mProvider.query(
-                    Browser.BOOKMARKS_URI,
-                    Browser.HISTORY_PROJECTION,
-                    null, null, null, null);
-            assertEquals(MAX_HISTORY_COUNT, cursor.getCount());
-            cursor.close();
-
-            // Add more one history which is not a bookmark,
-            // then the history rows except bookmark is MAX_HISTORY_COUNT.
-            value.put(BookmarkColumns.URL, historyUrlPrefix
-                    + MAX_HISTORY_COUNT + historyUrlPostfix);
-            value.put(BookmarkColumns.BOOKMARK, 0);
-            value.put(BookmarkColumns.DATE, MAX_HISTORY_COUNT + TIME_BASE);
-            mProvider.insert(Browser.BOOKMARKS_URI, value);
-            cursor = mProvider.query(
-                    Browser.BOOKMARKS_URI,
-                    Browser.HISTORY_PROJECTION,
-                    null, null, null, null);
-            assertEquals(MAX_HISTORY_COUNT + 1, cursor.getCount());
-            cursor.close();
-            Browser.truncateHistory(mContentResolver);
-            cursor = mProvider.query(
-                    Browser.BOOKMARKS_URI,
-                    Browser.HISTORY_PROJECTION,
-                    null, null, null, null);
-            assertEquals(MAX_HISTORY_COUNT + 1 - Browser.TRUNCATE_N_OLDEST, cursor.getCount());
-            cursor.moveToFirst();
-            assertEquals(Browser.TRUNCATE_N_OLDEST + 1 + TIME_BASE,
-                    cursor.getLong(Browser.HISTORY_PROJECTION_DATE_INDEX));
-            cursor.close();
-
-            // Delete specified history
-            cursor = mProvider.query(
-                    Browser.BOOKMARKS_URI,
-                    Browser.HISTORY_PROJECTION,
-                    BookmarkColumns.BOOKMARK + " = 0",
-                    null, BookmarkColumns.DATE, null);
-            int historyCountBeforeDelete = cursor.getCount();
-            cursor.moveToLast();
-            assertEquals(MAX_HISTORY_COUNT + TIME_BASE,
-                    cursor.getLong(Browser.HISTORY_PROJECTION_DATE_INDEX));
-            cursor.close();
-            Browser.deleteFromHistory(mContentResolver,
-                    historyUrlPrefix + MAX_HISTORY_COUNT + historyUrlPostfix);
-            cursor = mProvider.query(
-                    Browser.BOOKMARKS_URI,
-                    Browser.HISTORY_PROJECTION,
-                    BookmarkColumns.BOOKMARK + " = 0",
-                    null, BookmarkColumns.DATE, null);
-            int historyCountAfterDelete = cursor.getCount();
-            assertEquals(historyCountBeforeDelete - 1, historyCountAfterDelete);
-            cursor.moveToLast();
-            assertEquals(MAX_HISTORY_COUNT - 1 + TIME_BASE,
-                    cursor.getLong(Browser.HISTORY_PROJECTION_DATE_INDEX));
-            cursor.close();
-
-            // Specify a url which is not existed in current table.
-            historyCountBeforeDelete = historyCountAfterDelete;
-            Browser.deleteFromHistory(mContentResolver, "delete a not-existed url");
-            cursor = mProvider.query(
-                    Browser.BOOKMARKS_URI,
-                    Browser.HISTORY_PROJECTION,
-                    BookmarkColumns.BOOKMARK + " = 0",
-                    null, BookmarkColumns.DATE, null);
-            historyCountAfterDelete = cursor.getCount();
-            assertEquals(historyCountBeforeDelete, historyCountAfterDelete);
-            cursor.close();
-
-            // Specify the history in a time frame to be deleted
-            historyCountBeforeDelete = historyCountAfterDelete;
-            long begin = 6 + TIME_BASE;
-            long end = 20 + TIME_BASE;
-            Browser.deleteHistoryTimeFrame(mContentResolver, begin, end);
-            cursor = mProvider.query(
-                    Browser.BOOKMARKS_URI,
-                    Browser.HISTORY_PROJECTION,
-                    BookmarkColumns.BOOKMARK + " = 0",
-                    null, BookmarkColumns.DATE, null);
-            historyCountAfterDelete = cursor.getCount();
-            assertEquals(historyCountBeforeDelete - (end - begin), historyCountAfterDelete);
-            cursor.moveToFirst();
-            assertEquals(end, cursor.getLong(Browser.HISTORY_PROJECTION_DATE_INDEX));
-            cursor.close();
-
-            // Specify the history in a time frame (not specify begin) to be deleted.
-            historyCountBeforeDelete = historyCountAfterDelete;
-            long firstDate = end;
-            begin = -1;
-            end = 34 + TIME_BASE;
-            Browser.deleteHistoryTimeFrame(mContentResolver, begin, end);
-            cursor = mProvider.query(
-                    Browser.BOOKMARKS_URI,
-                    Browser.HISTORY_PROJECTION,
-                    BookmarkColumns.BOOKMARK + " = 0",
-                    null, BookmarkColumns.DATE, null);
-            historyCountAfterDelete = cursor.getCount();
-            assertEquals(historyCountBeforeDelete - (end - firstDate), historyCountAfterDelete);
-            cursor.moveToFirst();
-            assertEquals(end, cursor.getLong(Browser.HISTORY_PROJECTION_DATE_INDEX));
-            cursor.moveToLast();
-            long lastDate = cursor.getLong(Browser.HISTORY_PROJECTION_DATE_INDEX);
-            cursor.close();
-
-            // Specify the history in a time frame (not specify end) to be deleted.
-            historyCountBeforeDelete = historyCountAfterDelete;
-            begin = MAX_HISTORY_COUNT - 10 + TIME_BASE;
-            end = -1;
-            Browser.deleteHistoryTimeFrame(mContentResolver, begin, end);
-            cursor = mProvider.query(
-                    Browser.BOOKMARKS_URI,
-                    Browser.HISTORY_PROJECTION,
-                    BookmarkColumns.BOOKMARK + " = 0",
-                    null, BookmarkColumns.DATE, null);
-            historyCountAfterDelete = cursor.getCount();
-            assertEquals(historyCountBeforeDelete - (lastDate - begin + 1),
-                    historyCountAfterDelete);
-            cursor.moveToLast();
-            assertEquals(begin - 1, cursor.getLong(Browser.HISTORY_PROJECTION_DATE_INDEX));
-            cursor.close();
-
-            // Clear all history.
-            assertTrue(Browser.canClearHistory(mContentResolver));
-            Browser.clearHistory(mContentResolver);
-            cursor = mProvider.query(
-                    Browser.BOOKMARKS_URI,
-                    Browser.HISTORY_PROJECTION,
-                    null, null, BookmarkColumns.DATE, null);
-            assertEquals(1, cursor.getCount());
-            cursor.moveToFirst();
-            assertEquals(bookmarkUrl, cursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX));
-            assertEquals(0, cursor.getInt(Browser.HISTORY_PROJECTION_VISITS_INDEX));
-            assertEquals(0, cursor.getLong(Browser.HISTORY_PROJECTION_DATE_INDEX));
-            cursor.close();
-            assertFalse(Browser.canClearHistory(mContentResolver));
-        } catch (RemoteException e) {
-            fail("unexpected RemoteException");
-        }
-    }
-
-    public void testRequestAllIcons() {
-        Browser.requestAllIcons(mContentResolver, null, null);
-    }
-
-    public void testSaveBookmark() {
-        // TODO: send KEYCODE_DPAD_CENTER to skip the resolve page, but no effect.
-//        assertFalse(isRunning(ADD_BOOKMARK_CLASS_NAME));
-//        Browser.saveBookmark(mActivity, "bookmark title", "www.bookmark.com");
-//        try {
-//            Thread.sleep(2000);
-//        } catch (InterruptedException e) {
-//            e.printStackTrace();
-//        }
-//        getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER);
-//        assertStarted(ADD_BOOKMARK_CLASS_NAME, 6000);
-
-        // TODO: how to finish the activity.
-    }
-
-    public void testSendString() {
-        // assertFalse(isRunning(COMPOSE_MESSAGE_CLASS_NAME));
-        // Browser.sendString(mActivity, "string to be sent");
-        // assertStarted(COMPOSE_MESSAGE_CLASS_NAME, 5000);
-
-        // TODO: how to finish the activity.
-    }
-
-    private boolean isRunning(String className) {
-        ActivityManager activityManager = (ActivityManager) mActivity
-                .getSystemService(Context.ACTIVITY_SERVICE);
-        List<RunningTaskInfo> list = activityManager.getRunningTasks(1);
-        RunningTaskInfo info = list.get(0);
-        if (null == info || null == info.topActivity) {
-            return false;
-        }
-
-        if (className.equals(info.topActivity.getClassName())) {
-            return true;
-        }
-
-        return false;
-    }
-
-    private void assertStarted(String className, long timeout) {
-        final long timeSlice = 200;
-        while (timeout > 0) {
-            try {
-                Thread.sleep(timeSlice);
-            } catch (InterruptedException e) {
-                fail("unexpected InterruptedException");
-            }
-            if (isRunning(className)) {
-                return;
-            }
-            timeout -= timeSlice;
-        }
-        fail("has not started BrowserActivity yet");
-    }
-
-    /**
-     * Test case just for the actual content provider behavior on Bookmarks table.
-     * It does not test any APIs in android.provider.Browser.java, so we cannot add
-     * annotation for it.
-     */
-    public void testBookmarksTable() {
-        final String[] BOOKMARKS_PROJECTION = new String[] {
-                BookmarkColumns._ID, BookmarkColumns.URL, BookmarkColumns.VISITS,
-                BookmarkColumns.DATE, BookmarkColumns.CREATED, BookmarkColumns.BOOKMARK,
-                BookmarkColumns.TITLE, BookmarkColumns.FAVICON };
-        final int ID_INDEX = 0;
-        final int URL_INDEX = 1;
-        final int VISITS_INDEX = 2;
-        final int DATE_INDEX = 3;
-        final int CREATED_INDEX = 4;
-        final int BOOKMARK_INDEX = 5;
-        final int TITLE_INDEX = 6;
-        final int FAVICON_INDEX = 7;
-
-        String insertBookmarkTitle = "bookmark_insert";
-        String insertBookmarkUrl = "www.bookmark_insert.com";
-
-        String updateBookmarkTitle = "bookmark_update";
-        String updateBookmarkUrl = "www.bookmark_update.com";
-        try {
-            // Test: insert
-            ContentValues value = new ContentValues();
-            long createDate = new Date().getTime();
-            value.put(BookmarkColumns.TITLE, insertBookmarkTitle);
-            value.put(BookmarkColumns.URL, insertBookmarkUrl);
-            value.put(BookmarkColumns.VISITS, 0);
-            value.put(BookmarkColumns.DATE, createDate);
-            value.put(BookmarkColumns.CREATED, createDate);
-            value.put(BookmarkColumns.BOOKMARK, 0);
-
-            Uri insertUri = mProvider.insert(Browser.BOOKMARKS_URI, value);
-            Cursor cursor = mProvider.query(
-                    Browser.BOOKMARKS_URI,
-                    BOOKMARKS_PROJECTION,
-                    BookmarkColumns.TITLE + " = ?",
-                    new String[] {insertBookmarkTitle},
-                    BookmarkColumns.DATE, null);
-            assertTrue(cursor.moveToNext());
-            assertEquals(insertBookmarkTitle, cursor.getString(TITLE_INDEX));
-            assertEquals(insertBookmarkUrl,cursor.getString(URL_INDEX));
-            assertEquals(0,cursor.getInt(VISITS_INDEX));
-            assertEquals(createDate, cursor.getLong(DATE_INDEX));
-            assertEquals(createDate, cursor.getLong(CREATED_INDEX));
-            assertEquals(0, cursor.getInt(BOOKMARK_INDEX));
-            assertNull(cursor.getBlob(FAVICON_INDEX));
-            int Id = cursor.getInt(ID_INDEX);
-            cursor.close();
-
-            // Test: update
-            value.clear();
-            long updateDate = new Date().getTime();
-            value.put(BookmarkColumns.TITLE, updateBookmarkTitle);
-            value.put(BookmarkColumns.URL, updateBookmarkUrl);
-            value.put(BookmarkColumns.VISITS, 1);
-            value.put(BookmarkColumns.DATE, updateDate);
-
-            mProvider.update(Browser.BOOKMARKS_URI, value,
-                    BookmarkColumns.TITLE + " = ?",
-                    new String[] {insertBookmarkTitle});
-            cursor = mProvider.query(
-                    Browser.BOOKMARKS_URI,
-                    BOOKMARKS_PROJECTION,
-                    BookmarkColumns._ID + " = " + Id,
-                    null, null, null);
-            assertTrue(cursor.moveToNext());
-            assertEquals(updateBookmarkTitle, cursor.getString(TITLE_INDEX));
-            assertEquals(updateBookmarkUrl,cursor.getString(URL_INDEX));
-            assertEquals(1,cursor.getInt(VISITS_INDEX));
-            assertEquals(updateDate, cursor.getLong(DATE_INDEX));
-            assertEquals(createDate, cursor.getLong(CREATED_INDEX));
-            assertEquals(0, cursor.getInt(BOOKMARK_INDEX));
-            assertNull(cursor.getBlob(FAVICON_INDEX));
-            assertEquals(Id, cursor.getInt(ID_INDEX));
-
-            // Test: delete
-            mProvider.delete(insertUri, null, null);
-            cursor = mProvider.query(
-                    Browser.BOOKMARKS_URI,
-                    BOOKMARKS_PROJECTION,
-                    BookmarkColumns._ID + " = " + Id,
-                    null, null, null);
-            assertEquals(0, cursor.getCount());
-        } catch (RemoteException e) {
-            fail("Unexpected RemoteException");
-        }
-    }
-
-    /**
-     * Test case just for the actual content provider behavior on Searches table.
-     * It does not test any APIs in android.provider.Browser.java, so we cannot add
-     * annotation for it.
-     */
-    public void testSearchesTable() {
-        final int ID_INDEX = 0;
-        String insertSearch = "search_insert";
-        String updateSearch = "search_update";
-
-        try {
-            // Test: insert
-            ContentValues value = new ContentValues();
-            long createDate = new Date().getTime();
-            value.put(SearchColumns.SEARCH, insertSearch);
-            value.put(SearchColumns.DATE, createDate);
-
-            Uri insertUri = mProvider.insert(Browser.SEARCHES_URI, value);
-            Cursor cursor = mProvider.query(Browser.SEARCHES_URI,
-                    Browser.SEARCHES_PROJECTION, SearchColumns.SEARCH + " = ?",
-                    new String[] {insertSearch}, null, null);
-            assertTrue(cursor.moveToNext());
-            assertEquals(insertSearch,
-                    cursor.getString(Browser.SEARCHES_PROJECTION_SEARCH_INDEX));
-            assertEquals(createDate,
-                    cursor.getLong(Browser.SEARCHES_PROJECTION_DATE_INDEX));
-            int Id = cursor.getInt(ID_INDEX);
-            cursor.close();
-
-            // Test: update
-            value.clear();
-            long updateDate = new Date().getTime();
-            value.put(SearchColumns.SEARCH, updateSearch);
-            value.put(SearchColumns.DATE, updateDate);
-
-            mProvider.update(Browser.SEARCHES_URI, value,
-                    SearchColumns._ID + " = " + Id, null);
-            cursor = mProvider.query(Browser.SEARCHES_URI,
-                    Browser.SEARCHES_PROJECTION,
-                    SearchColumns._ID + " = " + Id, null, null, null);
-            assertTrue(cursor.moveToNext());
-            assertEquals(updateSearch,
-                    cursor.getString(Browser.SEARCHES_PROJECTION_SEARCH_INDEX));
-            assertEquals(updateDate,
-                    cursor.getLong(Browser.SEARCHES_PROJECTION_DATE_INDEX));
-            assertEquals(Id, cursor.getInt(ID_INDEX));
-
-            // Test: delete
-            mProvider.delete(insertUri, null, null);
-            cursor = mProvider.query(Browser.SEARCHES_URI,
-                    Browser.SEARCHES_PROJECTION,
-                    SearchColumns._ID + " = " + Id, null, null, null);
-            assertEquals(0, cursor.getCount());
-        } catch (RemoteException e) {
-            fail("Unexpected RemoteException");
-        }
-    }
-}
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_AggregationSuggestionsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_AggregationSuggestionsTest.java
new file mode 100644
index 0000000..64c1a66
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_AggregationSuggestionsTest.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2015 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.provider.cts;
+
+import android.content.ContentProviderClient;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Contacts.AggregationSuggestions;
+import android.provider.ContactsContract.RawContacts;
+import android.provider.cts.ContactsContract_TestDataBuilder.TestRawContact;
+import android.provider.cts.contacts.DatabaseAsserts;
+import android.test.AndroidTestCase;
+
+/**
+ * CTS tests for {@link android.provider.ContactsContract.Contacts.AggregationSuggestions} APIs.
+ */
+public class ContactsContract_AggregationSuggestionsTest extends AndroidTestCase {
+    private static final String[] TEST_PROJECTION
+            = new String[] {Contacts.DISPLAY_NAME, Contacts._ID};
+
+    private ContentResolver mResolver;
+    private ContactsContract_TestDataBuilder mBuilder;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mResolver = getContext().getContentResolver();
+        ContentProviderClient provider =
+                mResolver.acquireContentProviderClient(ContactsContract.AUTHORITY);
+        mBuilder = new ContactsContract_TestDataBuilder(provider);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        mBuilder.cleanup();
+    }
+
+    // Copy of CP2's ContactAggregatorTest#testAggregationSuggestionsByName unit test.
+    public void testAggregationSuggestionsByNameReversed() throws Exception {
+        long [] contactIds = setupThreeContacts();
+
+        // Setup: create query with first and last name reversed.
+        Uri uri = AggregationSuggestions.builder()
+                .addNameParameter("last1 first1")
+                .build();
+
+        // Execute
+        Cursor cursor = mResolver.query(uri, TEST_PROJECTION, null, null, null);
+
+        // Verify: correct contact is returned.
+        assertEquals(1, cursor.getCount());
+        cursor.moveToFirst();
+        ContentValues values = new ContentValues();
+        values.put(Contacts._ID, contactIds[0]);
+        values.put(Contacts.DISPLAY_NAME, "first1 last1");
+        DatabaseAsserts.assertCursorValuesMatchExactly(cursor, values);
+        cursor.close();
+    }
+
+
+    public void testAggregationSuggestionsByName() throws Exception {
+        long [] contactIds = setupThreeContacts();
+
+        // Setup: create query with first and last name in same order as display name.
+        Uri uri = AggregationSuggestions.builder()
+                .addNameParameter("first1 last1")
+                .build();
+
+        // Execute
+        Cursor cursor = mResolver.query(uri, TEST_PROJECTION, null, null, null);
+
+        // Verify: correct contact is returned.
+        assertEquals(1, cursor.getCount());
+        cursor.moveToFirst();
+        ContentValues values = new ContentValues();
+        values.put(Contacts._ID, contactIds[0]);
+        values.put(Contacts.DISPLAY_NAME, "first1 last1");
+        DatabaseAsserts.assertCursorValuesMatchExactly(cursor, values);
+        cursor.close();
+    }
+
+    public void testAggregationSuggestionsByName_noMatch() throws Exception {
+        setupThreeContacts();
+
+        // Setup: query with name that is completely different than all the contacts.
+        Uri uri = AggregationSuggestions.builder()
+                .addNameParameter("unmatched name")
+                .build();
+
+        // Execute
+        Cursor cursor = mResolver.query(
+                uri, new String[] { Contacts._ID, Contacts.DISPLAY_NAME }, null, null, null);
+
+        // Verify: no matches.
+        assertEquals(0, cursor.getCount());
+    }
+
+    public void testAggregationSuggestionsByName_matchSecondNameParameter() throws Exception {
+        long [] contactIds = setupThreeContacts();
+
+        // Setup: query with two names. The first name is completely unlike all the contacts.
+        Uri uri = AggregationSuggestions.builder()
+                .addNameParameter("unmatched name")
+                .addNameParameter("first2 last2")
+                .build();
+
+        // Execute
+        Cursor cursor = mResolver.query(uri, TEST_PROJECTION, null, null, null);
+
+        // Verify: the second name parameter matches a contact.
+        assertEquals(1, cursor.getCount());
+        ContentValues values = new ContentValues();
+        values.put(Contacts._ID, contactIds[1]);
+        values.put(Contacts.DISPLAY_NAME, "first2 last2");
+        DatabaseAsserts.assertCursorValuesMatchExactly(cursor, values);
+        cursor.close();
+    }
+
+    public void testAggregationSuggestionsByName_matchFirstNameParameter() throws Exception {
+        long [] contactIds = setupThreeContacts();
+
+        // Setup: query with two names. The second name is completely unlike all the contacts.
+        Uri uri = AggregationSuggestions.builder()
+                .addNameParameter("first2 last2")
+                .addNameParameter("unmatched name")
+                .build();
+
+        // Execute
+        Cursor cursor = mResolver.query(uri, TEST_PROJECTION, null, null, null);
+
+        // Verify: the first name parameter matches a contact.
+        assertEquals(1, cursor.getCount());
+        ContentValues values = new ContentValues();
+        values.put(Contacts._ID, contactIds[1]);
+        values.put(Contacts.DISPLAY_NAME, "first2 last2");
+        DatabaseAsserts.assertCursorValuesMatchExactly(cursor, values);
+        cursor.close();
+    }
+
+    private long[] setupThreeContacts() throws Exception {
+        TestRawContact rawContact1 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        rawContact1.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "first1")
+                .with(StructuredName.FAMILY_NAME, "last1")
+                .insert();
+        rawContact1.load();
+
+        TestRawContact rawContact2 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        rawContact2.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "first2")
+                .with(StructuredName.FAMILY_NAME, "last2")
+                .insert();
+        rawContact2.load();
+
+        TestRawContact rawContact3 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        rawContact3.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "completely")
+                .with(StructuredName.FAMILY_NAME, "different")
+                .insert();
+        rawContact3.load();
+
+        return new long[] {rawContact1.getContactId(),
+                rawContact2.getContactId(), rawContact3.getContactId()};
+    }
+
+    public void testAggregationSuggestionsQueryBuilderWithContactId() throws Exception {
+        Uri uri = new AggregationSuggestions.Builder().setContactId(12).setLimit(7).build();
+        assertEquals("content://com.android.contacts/contacts/12/suggestions?limit=7",
+                uri.toString());
+    }
+
+    public void testAggregationSuggestionsQueryBuilderWithValues() throws Exception {
+        Uri uri = new AggregationSuggestions.Builder()
+                .addNameParameter("name1")
+                .addNameParameter("name2")
+                .setLimit(7)
+                .build();
+        assertEquals("content://com.android.contacts/contacts/0/suggestions?"
+                + "limit=7"
+                + "&query=name%3Aname1"
+                + "&query=name%3Aname2", uri.toString());
+    }
+}
+
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_ContactsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_ContactsTest.java
index 006f4df..f8f610a 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_ContactsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_ContactsTest.java
@@ -27,6 +27,7 @@
 import android.net.Uri;
 import android.os.SystemClock;
 import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 import android.provider.ContactsContract.Contacts;
 import android.provider.cts.ContactsContract_TestDataBuilder.TestContact;
 import android.provider.cts.ContactsContract_TestDataBuilder.TestRawContact;
@@ -101,6 +102,12 @@
         assertEquals(ContentUris.withAppendedId(Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI,
                 lookupKey), contactId), lookupUri);
 
+        Uri nullLookupUri = Contacts.getLookupUri(contactId, null);
+        assertNull(nullLookupUri);
+
+        Uri emptyLookupUri = Contacts.getLookupUri(contactId, "");
+        assertNull(emptyLookupUri);
+
         Uri lookupUri2 = Contacts.getLookupUri(mResolver, contactUri);
         assertEquals(lookupUri, lookupUri2);
 
@@ -161,6 +168,74 @@
         RawContactUtil.delete(mResolver, ids.mRawContactId, true);
     }
 
+    public void testProjection() throws Exception {
+        final TestRawContact rawContact = mBuilder.newRawContact().insert().load();
+        rawContact.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "xxx")
+                .insert();
+
+        final TestContact contact = rawContact.getContact().load();
+        final long contactId = contact.getId();
+        final String lookupKey = contact.getString(Contacts.LOOKUP_KEY);
+
+        final String[] PROJECTION = new String[]{
+                Contacts._ID,
+                Contacts.DISPLAY_NAME,
+                Contacts.DISPLAY_NAME_PRIMARY,
+                Contacts.DISPLAY_NAME_ALTERNATIVE,
+                Contacts.DISPLAY_NAME_SOURCE,
+                Contacts.PHONETIC_NAME,
+                Contacts.PHONETIC_NAME_STYLE,
+                Contacts.SORT_KEY_PRIMARY,
+                Contacts.SORT_KEY_ALTERNATIVE,
+                Contacts.LAST_TIME_CONTACTED,
+                Contacts.TIMES_CONTACTED,
+                Contacts.STARRED,
+                Contacts.PINNED,
+                Contacts.IN_DEFAULT_DIRECTORY,
+                Contacts.IN_VISIBLE_GROUP,
+                Contacts.PHOTO_ID,
+                Contacts.PHOTO_FILE_ID,
+                Contacts.PHOTO_URI,
+                Contacts.PHOTO_THUMBNAIL_URI,
+                Contacts.CUSTOM_RINGTONE,
+                Contacts.HAS_PHONE_NUMBER,
+                Contacts.SEND_TO_VOICEMAIL,
+                Contacts.IS_USER_PROFILE,
+                Contacts.LOOKUP_KEY,
+                Contacts.NAME_RAW_CONTACT_ID,
+                Contacts.CONTACT_PRESENCE,
+                Contacts.CONTACT_CHAT_CAPABILITY,
+                Contacts.CONTACT_STATUS,
+                Contacts.CONTACT_STATUS_TIMESTAMP,
+                Contacts.CONTACT_STATUS_RES_PACKAGE,
+                Contacts.CONTACT_STATUS_LABEL,
+                Contacts.CONTACT_STATUS_ICON,
+                Contacts.CONTACT_LAST_UPDATED_TIMESTAMP
+        };
+
+        // Contacts.CONTENT_URI
+        DatabaseAsserts.checkProjection(mResolver,
+                Contacts.CONTENT_URI,
+                PROJECTION,
+                new long[]{contact.getId()}
+        );
+
+        // Contacts.CONTENT_FILTER_URI
+        DatabaseAsserts.checkProjection(mResolver,
+                Contacts.CONTENT_FILTER_URI.buildUpon().appendEncodedPath("xxx").build(),
+                PROJECTION,
+                new long[]{contact.getId()}
+        );
+
+        // Contacts.CONTENT_LOOKUP_URI
+        DatabaseAsserts.checkProjection(mResolver,
+                Contacts.getLookupUri(contactId, lookupKey),
+                PROJECTION,
+                new long[]{contact.getId()}
+        );
+    }
+
     /**
      * Create a contact.  Delete it.  And assert that the contact record is no longer present.
      *
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_DataTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_DataTest.java
index 91436a3..33d3a28 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_DataTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_DataTest.java
@@ -22,20 +22,22 @@
 import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.ContentValues;
-import android.database.Cursor;
 import android.net.Uri;
 import android.os.SystemClock;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.CommonDataKinds.Callable;
 import android.provider.ContactsContract.CommonDataKinds.Contactables;
 import android.provider.ContactsContract.CommonDataKinds.Email;
+import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
 import android.provider.ContactsContract.CommonDataKinds.Organization;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.ContactsContract.CommonDataKinds.SipAddress;
 import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Contacts.Entity;
 import android.provider.ContactsContract.Data;
 import android.provider.ContactsContract.RawContacts;
+import android.provider.ContactsContract.RawContactsEntity;
 import android.provider.cts.ContactsContract_TestDataBuilder.TestContact;
 import android.provider.cts.ContactsContract_TestDataBuilder.TestData;
 import android.provider.cts.ContactsContract_TestDataBuilder.TestRawContact;
@@ -51,6 +53,90 @@
     private ContentResolver mResolver;
     private ContactsContract_TestDataBuilder mBuilder;
 
+    static final String[] DATA_PROJECTION = new String[]{
+            Data._ID,
+            Data.RAW_CONTACT_ID,
+            Data.CONTACT_ID,
+            Data.NAME_RAW_CONTACT_ID,
+            RawContacts.RAW_CONTACT_IS_USER_PROFILE,
+            Data.DATA1,
+            Data.DATA2,
+            Data.DATA3,
+            Data.DATA4,
+            Data.DATA5,
+            Data.DATA6,
+            Data.DATA7,
+            Data.DATA8,
+            Data.DATA9,
+            Data.DATA10,
+            Data.DATA11,
+            Data.DATA12,
+            Data.DATA13,
+            Data.DATA14,
+            Data.DATA15,
+            Data.CARRIER_PRESENCE,
+            Data.DATA_VERSION,
+            Data.IS_PRIMARY,
+            Data.IS_SUPER_PRIMARY,
+            Data.MIMETYPE,
+            Data.RES_PACKAGE,
+            Data.SYNC1,
+            Data.SYNC2,
+            Data.SYNC3,
+            Data.SYNC4,
+            GroupMembership.GROUP_SOURCE_ID,
+            Data.PRESENCE,
+            Data.CHAT_CAPABILITY,
+            Data.STATUS,
+            Data.STATUS_TIMESTAMP,
+            Data.STATUS_RES_PACKAGE,
+            Data.STATUS_LABEL,
+            Data.STATUS_ICON,
+            RawContacts.ACCOUNT_NAME,
+            RawContacts.ACCOUNT_TYPE,
+            RawContacts.DATA_SET,
+            RawContacts.ACCOUNT_TYPE_AND_DATA_SET,
+            RawContacts.DIRTY,
+            RawContacts.SOURCE_ID,
+            RawContacts.VERSION,
+            Contacts.CUSTOM_RINGTONE,
+            Contacts.DISPLAY_NAME,
+            Contacts.DISPLAY_NAME_ALTERNATIVE,
+            Contacts.DISPLAY_NAME_SOURCE,
+            Contacts.IN_DEFAULT_DIRECTORY,
+            Contacts.IN_VISIBLE_GROUP,
+            Contacts.LAST_TIME_CONTACTED,
+            Contacts.LOOKUP_KEY,
+            Contacts.PHONETIC_NAME,
+            Contacts.PHONETIC_NAME_STYLE,
+            Contacts.PHOTO_ID,
+            Contacts.PHOTO_FILE_ID,
+            Contacts.PHOTO_URI,
+            Contacts.PHOTO_THUMBNAIL_URI,
+            Contacts.SEND_TO_VOICEMAIL,
+            Contacts.SORT_KEY_ALTERNATIVE,
+            Contacts.SORT_KEY_PRIMARY,
+            Contacts.STARRED,
+            Contacts.PINNED,
+            Contacts.TIMES_CONTACTED,
+            Contacts.HAS_PHONE_NUMBER,
+            Contacts.CONTACT_LAST_UPDATED_TIMESTAMP,
+            Contacts.CONTACT_PRESENCE,
+            Contacts.CONTACT_CHAT_CAPABILITY,
+            Contacts.CONTACT_STATUS,
+            Contacts.CONTACT_STATUS_TIMESTAMP,
+            Contacts.CONTACT_STATUS_RES_PACKAGE,
+            Contacts.CONTACT_STATUS_LABEL,
+            Contacts.CONTACT_STATUS_ICON,
+            Data.TIMES_USED,
+            Data.LAST_TIME_USED};
+
+    static final String[] RAW_CONTACTS_ENTITY_PROJECTION = new String[]{
+    };
+
+    static final String[] NTITY_PROJECTION = new String[]{
+    };
+
     private static ContentValues[] sContentValues = new ContentValues[7];
     static {
         ContentValues cv1 = new ContentValues();
@@ -141,6 +227,184 @@
                 lookupContact.getId(), data.load().getRawContact().load().getContactId());
     }
 
+    public void testDataProjection() throws Exception {
+        TestRawContact rawContact = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_type")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .with(RawContacts.SOURCE_ID, "source_id")
+                .insert();
+        TestData data = rawContact.newDataRow(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
+                .with(CommonDataKinds.StructuredName.DISPLAY_NAME, "test name")
+                .insert();
+
+        DatabaseAsserts.checkProjection(mResolver, Data.CONTENT_URI,
+                DATA_PROJECTION,
+                new long[]{data.load().getId()}
+        );
+    }
+
+    public void testRawContactsEntityProjection() throws Exception {
+        TestRawContact rawContact = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_type")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .with(RawContacts.SOURCE_ID, "source_id")
+                .insert();
+        TestData data = rawContact.newDataRow(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
+                .with(CommonDataKinds.StructuredName.DISPLAY_NAME, "test name")
+                .insert();
+
+        DatabaseAsserts.checkProjection(mResolver, RawContactsEntity.CONTENT_URI,
+                new String[]{
+                        RawContacts._ID,
+                        RawContacts.CONTACT_ID,
+                        RawContacts.Entity.DATA_ID,
+                        RawContacts.DELETED,
+                        RawContacts.STARRED,
+                        RawContacts.RAW_CONTACT_IS_USER_PROFILE,
+                        RawContacts.ACCOUNT_NAME,
+                        RawContacts.ACCOUNT_TYPE,
+                        RawContacts.DATA_SET,
+                        RawContacts.ACCOUNT_TYPE_AND_DATA_SET,
+                        RawContacts.DIRTY,
+                        RawContacts.SOURCE_ID,
+                        RawContacts.BACKUP_ID,
+                        RawContacts.VERSION,
+                        RawContacts.SYNC1,
+                        RawContacts.SYNC2,
+                        RawContacts.SYNC3,
+                        RawContacts.SYNC4,
+                        Data.DATA1,
+                        Data.DATA2,
+                        Data.DATA3,
+                        Data.DATA4,
+                        Data.DATA5,
+                        Data.DATA6,
+                        Data.DATA7,
+                        Data.DATA8,
+                        Data.DATA9,
+                        Data.DATA10,
+                        Data.DATA11,
+                        Data.DATA12,
+                        Data.DATA13,
+                        Data.DATA14,
+                        Data.DATA15,
+                        Data.CARRIER_PRESENCE,
+                        Data.DATA_VERSION,
+                        Data.IS_PRIMARY,
+                        Data.IS_SUPER_PRIMARY,
+                        Data.MIMETYPE,
+                        Data.RES_PACKAGE,
+                        Data.SYNC1,
+                        Data.SYNC2,
+                        Data.SYNC3,
+                        Data.SYNC4,
+                        GroupMembership.GROUP_SOURCE_ID},
+                new long[]{rawContact.getId()}
+        );
+    }
+
+    public void testEntityProjection() throws Exception {
+        TestRawContact rawContact = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_type")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .with(RawContacts.SOURCE_ID, "source_id")
+                .insert();
+        TestData data = rawContact.newDataRow(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
+                .with(CommonDataKinds.StructuredName.DISPLAY_NAME, "test name")
+                .insert();
+        long contactId = rawContact.load().getContactId();
+
+        DatabaseAsserts.checkProjection(mResolver, Contacts.CONTENT_URI.buildUpon().appendPath(
+                        String.valueOf(contactId)).appendPath(
+                        Entity.CONTENT_DIRECTORY).build(),
+                new String[]{
+                        Contacts.Entity._ID,
+                        Contacts.Entity.CONTACT_ID,
+                        Contacts.Entity.RAW_CONTACT_ID,
+                        Contacts.Entity.DATA_ID,
+                        Contacts.Entity.NAME_RAW_CONTACT_ID,
+                        Contacts.Entity.DELETED,
+                        Contacts.IS_USER_PROFILE,
+                        Contacts.CUSTOM_RINGTONE,
+                        Contacts.DISPLAY_NAME,
+                        Contacts.DISPLAY_NAME_ALTERNATIVE,
+                        Contacts.DISPLAY_NAME_SOURCE,
+                        Contacts.IN_DEFAULT_DIRECTORY,
+                        Contacts.IN_VISIBLE_GROUP,
+                        Contacts.LAST_TIME_CONTACTED,
+                        Contacts.LOOKUP_KEY,
+                        Contacts.PHONETIC_NAME,
+                        Contacts.PHONETIC_NAME_STYLE,
+                        Contacts.PHOTO_ID,
+                        Contacts.PHOTO_FILE_ID,
+                        Contacts.PHOTO_URI,
+                        Contacts.PHOTO_THUMBNAIL_URI,
+                        Contacts.SEND_TO_VOICEMAIL,
+                        Contacts.SORT_KEY_ALTERNATIVE,
+                        Contacts.SORT_KEY_PRIMARY,
+                        Contacts.STARRED,
+                        Contacts.PINNED,
+                        Contacts.TIMES_CONTACTED,
+                        Contacts.HAS_PHONE_NUMBER,
+                        Contacts.CONTACT_LAST_UPDATED_TIMESTAMP,
+                        Contacts.CONTACT_PRESENCE,
+                        Contacts.CONTACT_CHAT_CAPABILITY,
+                        Contacts.CONTACT_STATUS,
+                        Contacts.CONTACT_STATUS_TIMESTAMP,
+                        Contacts.CONTACT_STATUS_RES_PACKAGE,
+                        Contacts.CONTACT_STATUS_LABEL,
+                        Contacts.CONTACT_STATUS_ICON,
+                        RawContacts.ACCOUNT_NAME,
+                        RawContacts.ACCOUNT_TYPE,
+                        RawContacts.DATA_SET,
+                        RawContacts.ACCOUNT_TYPE_AND_DATA_SET,
+                        RawContacts.DIRTY,
+                        RawContacts.SOURCE_ID,
+                        RawContacts.BACKUP_ID,
+                        RawContacts.VERSION,
+                        RawContacts.SYNC1,
+                        RawContacts.SYNC2,
+                        RawContacts.SYNC3,
+                        RawContacts.SYNC4,
+                        Data.DATA1,
+                        Data.DATA2,
+                        Data.DATA3,
+                        Data.DATA4,
+                        Data.DATA5,
+                        Data.DATA6,
+                        Data.DATA7,
+                        Data.DATA8,
+                        Data.DATA9,
+                        Data.DATA10,
+                        Data.DATA11,
+                        Data.DATA12,
+                        Data.DATA13,
+                        Data.DATA14,
+                        Data.DATA15,
+                        Data.CARRIER_PRESENCE,
+                        Data.DATA_VERSION,
+                        Data.IS_PRIMARY,
+                        Data.IS_SUPER_PRIMARY,
+                        Data.MIMETYPE,
+                        Data.RES_PACKAGE,
+                        Data.SYNC1,
+                        Data.SYNC2,
+                        Data.SYNC3,
+                        Data.SYNC4,
+                        GroupMembership.GROUP_SOURCE_ID,
+                        Data.PRESENCE,
+                        Data.CHAT_CAPABILITY,
+                        Data.STATUS,
+                        Data.STATUS_TIMESTAMP,
+                        Data.STATUS_RES_PACKAGE,
+                        Data.STATUS_LABEL,
+                        Data.STATUS_ICON,
+                        Data.TIMES_USED,
+                        Data.LAST_TIME_USED},
+                new long[]{contactId}
+        );
+    }
+
     public void testGetLookupUriByDisplayName() throws Exception {
         TestRawContact rawContact = mBuilder.newRawContact()
                 .with(RawContacts.ACCOUNT_TYPE, "test_type")
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_FrequentsStrequentsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_FrequentsStrequentsTest.java
index b515550..b52915c 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_FrequentsStrequentsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_FrequentsStrequentsTest.java
@@ -48,6 +48,85 @@
     private ContentResolver mResolver;
     private ContactsContract_TestDataBuilder mBuilder;
 
+    private static final String[] STREQUENT_PROJECTION = new String[]{
+            Contacts._ID,
+            Contacts.HAS_PHONE_NUMBER,
+            Contacts.NAME_RAW_CONTACT_ID,
+            Contacts.IS_USER_PROFILE,
+            Contacts.CUSTOM_RINGTONE,
+            Contacts.DISPLAY_NAME,
+            Contacts.DISPLAY_NAME_ALTERNATIVE,
+            Contacts.DISPLAY_NAME_SOURCE,
+            Contacts.IN_DEFAULT_DIRECTORY,
+            Contacts.IN_VISIBLE_GROUP,
+            Contacts.LAST_TIME_CONTACTED,
+            Contacts.LOOKUP_KEY,
+            Contacts.PHONETIC_NAME,
+            Contacts.PHONETIC_NAME_STYLE,
+            Contacts.PHOTO_ID,
+            Contacts.PHOTO_FILE_ID,
+            Contacts.PHOTO_URI,
+            Contacts.PHOTO_THUMBNAIL_URI,
+            Contacts.SEND_TO_VOICEMAIL,
+            Contacts.SORT_KEY_ALTERNATIVE,
+            Contacts.SORT_KEY_PRIMARY,
+            Contacts.STARRED,
+            Contacts.PINNED,
+            Contacts.TIMES_CONTACTED,
+            Contacts.CONTACT_LAST_UPDATED_TIMESTAMP,
+            Contacts.CONTACT_PRESENCE,
+            Contacts.CONTACT_CHAT_CAPABILITY,
+            Contacts.CONTACT_STATUS,
+            Contacts.CONTACT_STATUS_TIMESTAMP,
+            Contacts.CONTACT_STATUS_RES_PACKAGE,
+            Contacts.CONTACT_STATUS_LABEL,
+            Contacts.CONTACT_STATUS_ICON,
+            Data.TIMES_USED,
+            Data.LAST_TIME_USED,
+    };
+
+    private static final String[] STREQUENT_PHONE_ONLY_PROJECTION = new String[]{
+            Data._ID,
+            Contacts.HAS_PHONE_NUMBER,
+            Contacts.NAME_RAW_CONTACT_ID,
+            Contacts.IS_USER_PROFILE,
+            Contacts.CUSTOM_RINGTONE,
+            Contacts.DISPLAY_NAME,
+            Contacts.DISPLAY_NAME_ALTERNATIVE,
+            Contacts.DISPLAY_NAME_SOURCE,
+            Contacts.IN_DEFAULT_DIRECTORY,
+            Contacts.IN_VISIBLE_GROUP,
+            Contacts.LAST_TIME_CONTACTED,
+            Contacts.LOOKUP_KEY,
+            Contacts.PHONETIC_NAME,
+            Contacts.PHONETIC_NAME_STYLE,
+            Contacts.PHOTO_ID,
+            Contacts.PHOTO_FILE_ID,
+            Contacts.PHOTO_URI,
+            Contacts.PHOTO_THUMBNAIL_URI,
+            Contacts.SEND_TO_VOICEMAIL,
+            Contacts.SORT_KEY_ALTERNATIVE,
+            Contacts.SORT_KEY_PRIMARY,
+            Contacts.STARRED,
+            Contacts.PINNED,
+            Contacts.TIMES_CONTACTED,
+            Contacts.CONTACT_LAST_UPDATED_TIMESTAMP,
+            Contacts.CONTACT_PRESENCE,
+            Contacts.CONTACT_CHAT_CAPABILITY,
+            Contacts.CONTACT_STATUS,
+            Contacts.CONTACT_STATUS_TIMESTAMP,
+            Contacts.CONTACT_STATUS_RES_PACKAGE,
+            Contacts.CONTACT_STATUS_LABEL,
+            Contacts.CONTACT_STATUS_ICON,
+            Data.TIMES_USED,
+            Data.LAST_TIME_USED,
+            Phone.NUMBER,
+            Phone.TYPE,
+            Phone.LABEL,
+            Phone.IS_SUPER_PRIMARY,
+            Phone.CONTACT_ID,
+    };
+
     public static ContentValues[] sContentValues = new ContentValues[3];
     static {
         ContentValues cv1 = new ContentValues();
@@ -182,48 +261,18 @@
         starContact(ids[0]);
         markDataAsUsed(mDataIds[2], 1);
 
-        // Construct a uri for phone only favorites.
-        Uri uri = Contacts.CONTENT_STREQUENT_URI;
-
-        DatabaseAsserts.checkProjection(mResolver, uri,
-                new String[]{
-                        Contacts._ID,
-                        Contacts.HAS_PHONE_NUMBER,
-                        Contacts.NAME_RAW_CONTACT_ID,
-                        Contacts.IS_USER_PROFILE,
-                        Contacts.CUSTOM_RINGTONE,
-                        Contacts.DISPLAY_NAME,
-                        Contacts.DISPLAY_NAME_ALTERNATIVE,
-                        Contacts.DISPLAY_NAME_SOURCE,
-                        Contacts.IN_DEFAULT_DIRECTORY,
-                        Contacts.IN_VISIBLE_GROUP,
-                        Contacts.LAST_TIME_CONTACTED,
-                        Contacts.LOOKUP_KEY,
-                        Contacts.PHONETIC_NAME,
-                        Contacts.PHONETIC_NAME_STYLE,
-                        Contacts.PHOTO_ID,
-                        Contacts.PHOTO_FILE_ID,
-                        Contacts.PHOTO_URI,
-                        Contacts.PHOTO_THUMBNAIL_URI,
-                        Contacts.SEND_TO_VOICEMAIL,
-                        Contacts.SORT_KEY_ALTERNATIVE,
-                        Contacts.SORT_KEY_PRIMARY,
-                        Contacts.STARRED,
-                        Contacts.PINNED,
-                        Contacts.TIMES_CONTACTED,
-                        Contacts.CONTACT_LAST_UPDATED_TIMESTAMP,
-                        Contacts.CONTACT_PRESENCE,
-                        Contacts.CONTACT_CHAT_CAPABILITY,
-                        Contacts.CONTACT_STATUS,
-                        Contacts.CONTACT_STATUS_TIMESTAMP,
-                        Contacts.CONTACT_STATUS_RES_PACKAGE,
-                        Contacts.CONTACT_STATUS_LABEL,
-                        Contacts.CONTACT_STATUS_ICON,
-                        Data.TIMES_USED,
-                        Data.LAST_TIME_USED,
-                },
+        DatabaseAsserts.checkProjection(mResolver, Contacts.CONTENT_STREQUENT_URI,
+                STREQUENT_PROJECTION,
                 new long[]{ids[0], ids[2]}
         );
+
+        // Strequent filter.
+        DatabaseAsserts.checkProjection(mResolver,
+                Contacts.CONTENT_STREQUENT_FILTER_URI.buildUpon()
+                        .appendEncodedPath("Hot Tamale").build(),
+                STREQUENT_PROJECTION,
+                new long[]{ids[0]}
+        );
     }
 
     public void testStrequents_phoneOnly() throws Exception {
@@ -277,48 +326,8 @@
                 appendQueryParameter(ContactsContract.STREQUENT_PHONE_ONLY, "true").build();
 
         DatabaseAsserts.checkProjection(mResolver, uri,
-                new String[] {
-                        Data._ID,
-                        Contacts.HAS_PHONE_NUMBER,
-                        Contacts.NAME_RAW_CONTACT_ID,
-                        Contacts.IS_USER_PROFILE,
-                        Contacts.CUSTOM_RINGTONE,
-                        Contacts.DISPLAY_NAME,
-                        Contacts.DISPLAY_NAME_ALTERNATIVE,
-                        Contacts.DISPLAY_NAME_SOURCE,
-                        Contacts.IN_DEFAULT_DIRECTORY,
-                        Contacts.IN_VISIBLE_GROUP,
-                        Contacts.LAST_TIME_CONTACTED,
-                        Contacts.LOOKUP_KEY,
-                        Contacts.PHONETIC_NAME,
-                        Contacts.PHONETIC_NAME_STYLE,
-                        Contacts.PHOTO_ID,
-                        Contacts.PHOTO_FILE_ID,
-                        Contacts.PHOTO_URI,
-                        Contacts.PHOTO_THUMBNAIL_URI,
-                        Contacts.SEND_TO_VOICEMAIL,
-                        Contacts.SORT_KEY_ALTERNATIVE,
-                        Contacts.SORT_KEY_PRIMARY,
-                        Contacts.STARRED,
-                        Contacts.PINNED,
-                        Contacts.TIMES_CONTACTED,
-                        Contacts.CONTACT_LAST_UPDATED_TIMESTAMP,
-                        Contacts.CONTACT_PRESENCE,
-                        Contacts.CONTACT_CHAT_CAPABILITY,
-                        Contacts.CONTACT_STATUS,
-                        Contacts.CONTACT_STATUS_TIMESTAMP,
-                        Contacts.CONTACT_STATUS_RES_PACKAGE,
-                        Contacts.CONTACT_STATUS_LABEL,
-                        Contacts.CONTACT_STATUS_ICON,
-                        Data.TIMES_USED,
-                        Data.LAST_TIME_USED,
-                        Phone.NUMBER,
-                        Phone.TYPE,
-                        Phone.LABEL,
-                        Phone.IS_SUPER_PRIMARY,
-                        Phone.CONTACT_ID,
-                },
-                new long[] {mDataIds[0], mDataIds[2]} // Note _id from phone_only is data._id
+                STREQUENT_PHONE_ONLY_PROJECTION,
+                new long[]{mDataIds[0], mDataIds[2]} // Note _id from phone_only is data._id
         );
     }
 
@@ -345,6 +354,17 @@
                 true /* inOrder */, sContentValues[1], sContentValues[2], sContentValues[0]);
     }
 
+    public void testFrequent_projection() throws Exception {
+        long[] ids = setupTestData();
+
+        markDataAsUsed(mDataIds[0], 10);
+
+        DatabaseAsserts.checkProjection(mResolver, Contacts.CONTENT_FREQUENT_URI,
+                STREQUENT_PROJECTION,
+                new long[]{ids[0]}
+        );
+    }
+
     /**
      * Given a uri, performs a query on the contacts provider for that uri and asserts that the
      * cursor returned from the query matches the expected results.
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_IsSuperPrimaryName.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_IsSuperPrimaryName.java
new file mode 100644
index 0000000..603cb619
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_IsSuperPrimaryName.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2015 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.provider.cts;
+
+import junit.framework.Assert;
+
+import android.content.ContentProviderClient;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.AggregationExceptions;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.RawContacts;
+import android.provider.cts.ContactsContract_TestDataBuilder.TestContact;
+import android.provider.cts.ContactsContract_TestDataBuilder.TestData;
+import android.provider.cts.ContactsContract_TestDataBuilder.TestRawContact;
+import android.test.AndroidTestCase;
+
+/**
+ * CTS tests for the affect that {@link ContactsContract.Data#IS_SUPER_PRIMARY} has on names inside
+ * aggregated contacts. Additionally, this needs to test the affect that aggregating contacts
+ * together has on IS_SUPER_PRIMARY values in order to enforce the desired IS_SUPER_PRIMARY
+ * behavior.
+ */
+public class ContactsContract_IsSuperPrimaryName extends AndroidTestCase {
+
+    private ContentResolver mResolver;
+    private ContactsContract_TestDataBuilder mBuilder;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mResolver = getContext().getContentResolver();
+        ContentProviderClient provider =
+                mResolver.acquireContentProviderClient(ContactsContract.AUTHORITY);
+        mBuilder = new ContactsContract_TestDataBuilder(provider);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mBuilder.cleanup();
+        super.tearDown();
+    }
+
+    public void testIsSuperPrimary_name1SuperPrimary() throws Exception {
+        testInner_displayNameFromIsSuperPrimary(/* isFirstNamePrimary = */ true, "name1", "name2");
+    }
+
+    public void testIsSuperPrimary_name2SuperPrimary() throws Exception {
+        testInner_displayNameFromIsSuperPrimary(/* isFirstNamePrimary = */ false, "name2", "name1");
+    }
+
+    private void testInner_displayNameFromIsSuperPrimary(boolean isFirstNamePrimary,
+            String expectedDisplayName, String otherDisplayName) throws Exception {
+
+        // Setup: two raw contacts. One with a super primary name. One without.
+        TestRawContact rawContact1 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        TestData name1 = rawContact1.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "name1")
+                .with(StructuredName.IS_SUPER_PRIMARY, isFirstNamePrimary ? 1 : 0)
+                .insert();
+        rawContact1.load();
+        name1.load();
+
+        TestRawContact rawContact2 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        TestData name2 = rawContact2.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "name2")
+                .with(StructuredName.IS_SUPER_PRIMARY, !isFirstNamePrimary ? 1 : 0)
+                .insert();
+        rawContact2.load();
+        name2.load();
+
+        // Execute: aggregate the two raw contacts together
+        setAggregationException(rawContact1.getId(), rawContact2.getId());
+
+        // Sanity check: two contacts are aggregated
+        rawContact1.load();
+        rawContact2.load();
+        Assert.assertEquals(rawContact1.getContactId(), rawContact2.getContactId());
+
+        // Verify: the IS_SUPER_PRIMARY values are maintained after the merge
+        name1.assertColumn(StructuredName.IS_SUPER_PRIMARY, isFirstNamePrimary ? 1 : 0);
+        name2.assertColumn(StructuredName.IS_SUPER_PRIMARY, !isFirstNamePrimary ? 1 : 0);
+
+        // Verify: the display name is taken from the name with is_super_primary
+        TestContact contact = rawContact2.getContact().load();
+        contact.assertColumn(Contacts.DISPLAY_NAME, expectedDisplayName);
+
+        //
+        // Now test what happens when you change IS_SUPER_PRIMARY on an existing contact
+        //
+
+        // Execute: make the non primary name IS_SUPER_PRIMARY
+        TestData nonPrimaryName = !isFirstNamePrimary ? name1 : name2;
+        ContentValues values = new ContentValues();
+        values.put(StructuredName.IS_SUPER_PRIMARY, 1);
+        mResolver.update(nonPrimaryName.getUri(), values, null, null);
+
+        // Verify: the IS_SUPER_PRIMARY values swap
+        name1.load();
+        name2.load();
+        name1.assertColumn(StructuredName.IS_SUPER_PRIMARY, isFirstNamePrimary ? 0 : 1);
+        name2.assertColumn(StructuredName.IS_SUPER_PRIMARY, !isFirstNamePrimary ? 0 : 1);
+
+        // Verify: the display name is taken from the name with is_super_primary
+        contact.load();
+        contact.assertColumn(Contacts.DISPLAY_NAME, otherDisplayName);
+    }
+
+    public void testIsSuperPrimaryName_mergeBothSuperPrimary() throws Exception {
+        // Setup: two raw contacts. Both names are super primary.
+        TestRawContact rawContact1 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        TestData name1 = rawContact1.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "name1")
+                .with(StructuredName.IS_SUPER_PRIMARY, 1)
+                .insert();
+        rawContact1.load();
+        name1.load();
+
+        TestRawContact rawContact2 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        TestData name2 = rawContact2.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "name2")
+                .with(StructuredName.IS_SUPER_PRIMARY, 1)
+                .insert();
+        rawContact2.load();
+        name2.load();
+
+        // Execute: aggregate the two contacts together
+        setAggregationException(rawContact1.getId(), rawContact2.getId());
+
+        // Sanity check: two contacts are aggregated
+        rawContact1.load();
+        rawContact2.load();
+        Assert.assertEquals(rawContact1.getContactId(), rawContact2.getContactId());
+
+        // Verify: both names are no longer super primary.
+        name1.load();
+        name2.load();
+        name1.assertColumn(StructuredName.IS_SUPER_PRIMARY, 0);
+        name2.assertColumn(StructuredName.IS_SUPER_PRIMARY, 0);
+    }
+
+    private void setAggregationException(long rawContactId1, long rawContactId2) {
+        ContentValues values = new ContentValues();
+        values.put(AggregationExceptions.RAW_CONTACT_ID1, rawContactId1);
+        values.put(AggregationExceptions.RAW_CONTACT_ID2, rawContactId2);
+        values.put(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER);
+        mResolver.update(AggregationExceptions.CONTENT_URI, values, null, null);
+    }
+}
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_PinnedPositionsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_PinnedPositionsTest.java
index 2558c36..e56127b 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_PinnedPositionsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_PinnedPositionsTest.java
@@ -203,9 +203,9 @@
         ContactUtil.setAggregationException(mResolver, AggregationExceptions.TYPE_KEEP_SEPARATE,
             i1.mRawContactId, i4.mRawContactId);
 
-        // Raw contacts should be unpinned after being split, but still starred.
+        // Raw contacts should keep the pinned position after re-grouping, and still starred.
         assertValuesForRawContact(i1.mRawContactId,
-                newContentValues(RawContacts.PINNED, PinnedPositions.UNPINNED, RawContacts.STARRED,
+                newContentValues(RawContacts.PINNED, 1, RawContacts.STARRED,
                         1));
         assertValuesForRawContact(i2.mRawContactId,
                 newContentValues(RawContacts.PINNED, 2, RawContacts.STARRED, 1));
@@ -229,7 +229,7 @@
         final long cId1 = RawContactUtil.queryContactIdByRawContactId(mResolver, i1.mRawContactId);
         final long cId4 = RawContactUtil.queryContactIdByRawContactId(mResolver, i4.mRawContactId);
 
-        assertValuesForContact(cId1, newContentValues(Contacts.PINNED, PinnedPositions.UNPINNED));
+        assertValuesForContact(cId1, newContentValues(Contacts.PINNED, 1));
         assertValuesForContact(i2.mContactId, newContentValues(Contacts.PINNED, 2));
         assertValuesForContact(cId4, newContentValues(Contacts.PINNED, PinnedPositions.UNPINNED));
         assertValuesForContact(i5.mContactId,
@@ -241,7 +241,7 @@
                 i5.mRawContactId, i6.mRawContactId);
 
         // The resulting contact should have a pinned value of 6.
-        assertValuesForContact(cId1, newContentValues(Contacts.PINNED, PinnedPositions.UNPINNED));
+        assertValuesForContact(cId1, newContentValues(Contacts.PINNED, 1));
         assertValuesForContact(i2.mContactId, newContentValues(Contacts.PINNED, 2));
         assertValuesForContact(cId4, newContentValues(Contacts.PINNED, PinnedPositions.UNPINNED));
         assertValuesForContact(i5.mContactId, newContentValues(Contacts.PINNED, 6));
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_ProviderStatus.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_ProviderStatus.java
new file mode 100644
index 0000000..9c38ec0
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_ProviderStatus.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2015 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.provider.cts;
+
+import android.content.ContentProviderClient;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import android.provider.ContactsContract.ProviderStatus;
+import android.provider.ContactsContract.RawContacts;
+import android.provider.cts.ContactsContract_TestDataBuilder.TestRawContact;
+import android.provider.cts.contacts.DatabaseAsserts;
+import android.test.AndroidTestCase;
+
+/**
+ * CTS tests for {@link android.provider.ContactsContract.ProviderStatus}.
+ *
+ * Unfortunately, we can't check that the value of ProviderStatus equals
+ * {@link ProviderStatus#STATUS_EMPTY} initially. Some carriers pre-install
+ * accounts. As a result, the value STATUS_EMPTY will never be achieved.
+ */
+public class ContactsContract_ProviderStatus extends AndroidTestCase {
+    private ContentResolver mResolver;
+    private ContactsContract_TestDataBuilder mBuilder;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mResolver = getContext().getContentResolver();
+        ContentProviderClient provider =
+                mResolver.acquireContentProviderClient(ContactsContract.AUTHORITY);
+        mBuilder = new ContactsContract_TestDataBuilder(provider);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        mBuilder.cleanup();
+    }
+
+    public void testProviderStatus_addedContacts() throws Exception {
+        // Setup: add a contact to CP2.
+        TestRawContact rawContact1 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        rawContact1.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "first1")
+                .with(StructuredName.FAMILY_NAME, "last1")
+                .insert();
+
+        // Execute: fetch CP2 status
+        Cursor cursor = mResolver.query(ProviderStatus.CONTENT_URI, null, null, null, null);
+
+        // Verify: CP2 status is normal instead of STATUS_EMPTY.
+        try {
+            assertEquals(1, cursor.getCount());
+            cursor.moveToFirst();
+            ContentValues values = new ContentValues();
+            values.put(ProviderStatus.STATUS, ProviderStatus.STATUS_NORMAL);
+            DatabaseAsserts.assertCursorValuesMatchExactly(cursor, values);
+        } finally {
+            if (cursor != null) {
+                cursor.close();
+            }
+        }
+    }
+}
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_QuickContactsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_QuickContactsTest.java
new file mode 100644
index 0000000..79633e7
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_QuickContactsTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2015 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.provider.cts;
+
+import android.content.ContentUris;
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.content.Intent;
+import android.graphics.Rect;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.provider.Contacts;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.QuickContact;
+import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
+import android.view.View;
+
+import java.util.Arrays;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+public class ContactsContract_QuickContactsTest extends InstrumentationTestCase {
+
+    final String EXCLUDED_MIME_TYPES[] = {"exclude1", "exclude2"};
+    final String PLAIN_MIME_TYPE = "text/plain";
+    final Uri FAKE_CONTACT_URI = ContentUris.withAppendedId(Contacts.CONTENT_URI, 0);
+
+    @UiThreadTest
+    public void testPrioritizedMimeTypeAndExcludedMimeTypes() throws InterruptedException {
+        final CountDownLatch latch = new CountDownLatch(2);
+        Context context = new ContextWrapper(getInstrumentation().getContext()) {
+            @Override
+            public void startActivity(Intent intent) {
+                testCallback(intent);
+            }
+
+            @Override
+            public void startActivityAsUser(Intent intent, UserHandle user) {
+                testCallback(intent);
+            }
+
+            @Override
+            public void startActivityAsUser(Intent intent, Bundle options, UserHandle user) {
+                testCallback(intent);
+            }
+
+            private void testCallback(Intent intent) {
+                assertEquals(PLAIN_MIME_TYPE, intent.getStringExtra(
+                        QuickContact.EXTRA_PRIORITIZED_MIMETYPE));
+                String excludedMimeTypes[]
+                        = intent.getStringArrayExtra(QuickContact.EXTRA_EXCLUDE_MIMES);
+                assertTrue(Arrays.equals(excludedMimeTypes, EXCLUDED_MIME_TYPES));
+                latch.countDown();
+            }
+        };
+
+        // Execute
+        ContactsContract.QuickContact.showQuickContact(context, new View(context),
+                FAKE_CONTACT_URI, EXCLUDED_MIME_TYPES, PLAIN_MIME_TYPE);
+        ContactsContract.QuickContact.showQuickContact(context, (Rect) null,
+                FAKE_CONTACT_URI, EXCLUDED_MIME_TYPES, PLAIN_MIME_TYPE);
+
+        // Verify: the start activity call sets the prioritized mimetype and excludes mimetypes.
+        // We don't know which method will be used to start the activity, so we check all options.
+        assertTrue(latch.await(1, TimeUnit.SECONDS));
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_RawContactsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_RawContactsTest.java
index e1cea4a..49b3ff5 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_RawContactsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_RawContactsTest.java
@@ -23,6 +23,7 @@
 import android.net.Uri;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.RawContacts;
 import android.provider.cts.ContactsContract_TestDataBuilder.TestContact;
 import android.provider.cts.ContactsContract_TestDataBuilder.TestRawContact;
@@ -38,6 +39,39 @@
     private ContentResolver mResolver;
     private ContactsContract_TestDataBuilder mBuilder;
 
+    private static final String[] RAW_CONTACTS_PROJECTION = new String[]{
+            RawContacts._ID,
+            RawContacts.CONTACT_ID,
+            RawContacts.DELETED,
+            RawContacts.DISPLAY_NAME_PRIMARY,
+            RawContacts.DISPLAY_NAME_ALTERNATIVE,
+            RawContacts.DISPLAY_NAME_SOURCE,
+            RawContacts.PHONETIC_NAME,
+            RawContacts.PHONETIC_NAME_STYLE,
+            RawContacts.SORT_KEY_PRIMARY,
+            RawContacts.SORT_KEY_ALTERNATIVE,
+            RawContacts.TIMES_CONTACTED,
+            RawContacts.LAST_TIME_CONTACTED,
+            RawContacts.CUSTOM_RINGTONE,
+            RawContacts.SEND_TO_VOICEMAIL,
+            RawContacts.STARRED,
+            RawContacts.PINNED,
+            RawContacts.AGGREGATION_MODE,
+            RawContacts.RAW_CONTACT_IS_USER_PROFILE,
+            RawContacts.ACCOUNT_NAME,
+            RawContacts.ACCOUNT_TYPE,
+            RawContacts.DATA_SET,
+            RawContacts.ACCOUNT_TYPE_AND_DATA_SET,
+            RawContacts.DIRTY,
+            RawContacts.SOURCE_ID,
+            RawContacts.BACKUP_ID,
+            RawContacts.VERSION,
+            RawContacts.SYNC1,
+            RawContacts.SYNC2,
+            RawContacts.SYNC3,
+            RawContacts.SYNC4
+    };
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -187,4 +221,19 @@
 
         return ContactUtil.queryContactLastUpdatedTimestamp(mResolver, contactId);
     }
+
+    public void testProjection() throws Exception {
+        TestRawContact rawContact = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_type")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        rawContact.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.DISPLAY_NAME, "test name")
+                .insert();
+
+        DatabaseAsserts.checkProjection(mResolver, RawContacts.CONTENT_URI,
+                RAW_CONTACTS_PROJECTION,
+                new long[]{rawContact.getId()}
+        );
+    }
 }
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_StructuredPhoneticName.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_StructuredPhoneticName.java
new file mode 100644
index 0000000..4efd9a7
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_StructuredPhoneticName.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2015 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.provider.cts;
+
+import junit.framework.Assert;
+
+import android.content.ContentProviderClient;
+import android.content.ContentResolver;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.AggregationExceptions;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.DisplayNameSources;
+import android.provider.ContactsContract.RawContacts;
+import android.provider.cts.ContactsContract_TestDataBuilder.TestContact;
+import android.provider.cts.ContactsContract_TestDataBuilder.TestData;
+import android.provider.cts.ContactsContract_TestDataBuilder.TestRawContact;
+import android.provider.cts.contacts.ContactUtil;
+import android.test.AndroidTestCase;
+
+/**
+ * CTS tests for {@link DisplayNameSources#STRUCTURED_PHONETIC_NAME}.
+ */
+public class ContactsContract_StructuredPhoneticName extends AndroidTestCase {
+    private ContentResolver mResolver;
+    private ContactsContract_TestDataBuilder mBuilder;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mResolver = getContext().getContentResolver();
+        ContentProviderClient provider =
+                mResolver.acquireContentProviderClient(ContactsContract.AUTHORITY);
+        mBuilder = new ContactsContract_TestDataBuilder(provider);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mBuilder.cleanup();
+        super.tearDown();
+    }
+
+    public void testPhoneticStructuredName() throws Exception {
+        // Setup: contact with only phonetic name
+        TestRawContact rawContact1 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        TestData name1 = rawContact1.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.PHONETIC_FAMILY_NAME, "phonetic name")
+                .insert();
+        rawContact1.load();
+        name1.load();
+
+        // Verify: DISPLAY_NAME_SOURCE notices that the StructuredName only has phonetic components
+        TestContact contact = rawContact1.getContact().load();
+        contact.assertColumn(Contacts.DISPLAY_NAME_SOURCE,
+                DisplayNameSources.STRUCTURED_PHONETIC_NAME);
+    }
+
+    public void testPhoneticStructuredName_phoneticPriority1() throws Exception {
+        // Setup: one raw contact has a complex phonetic name and the other a simple given name
+        TestRawContact rawContact1 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        TestData name1 = rawContact1.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "name")
+                .insert();
+        rawContact1.load();
+        name1.load();
+
+        TestRawContact rawContact2 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        TestData name2 = rawContact2.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.PHONETIC_FAMILY_NAME, "name phonetic")
+                .insert();
+        rawContact2.load();
+        name2.load();
+
+        // Execute: aggregate the two raw contacts together
+        ContactUtil.setAggregationException(mResolver, AggregationExceptions.TYPE_KEEP_TOGETHER,
+                rawContact1.getId(), rawContact2.getId());
+
+        // Sanity check: two contacts are aggregated
+        rawContact1.load();
+        rawContact2.load();
+        Assert.assertEquals(rawContact1.getContactId(), rawContact2.getContactId());
+
+        // Verify: the display name is taken from the name with more than phonetic components
+        TestContact contact = rawContact2.getContact().load();
+        contact.assertColumn(Contacts.DISPLAY_NAME, "name");
+    }
+
+    // Same as testPhoneticStructuredName_phoneticPriority1, but with setup order reversed
+    public void testPhoneticStructuredName_phoneticPriority2() throws Exception {
+        // Setup: one raw contact has a complex phonetic name and the other a simple given name
+        TestRawContact rawContact2 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        TestData name2 = rawContact2.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.PHONETIC_FAMILY_NAME, "name phonetic")
+                .insert();
+        rawContact2.load();
+        name2.load();
+
+        TestRawContact rawContact1 = mBuilder.newRawContact()
+                .with(RawContacts.ACCOUNT_TYPE, "test_account")
+                .with(RawContacts.ACCOUNT_NAME, "test_name")
+                .insert();
+        TestData name1 = rawContact1.newDataRow(StructuredName.CONTENT_ITEM_TYPE)
+                .with(StructuredName.GIVEN_NAME, "name")
+                .insert();
+        rawContact1.load();
+        name1.load();
+
+        // Execute: aggregate the two raw contacts together
+        ContactUtil.setAggregationException(mResolver, AggregationExceptions.TYPE_KEEP_TOGETHER,
+                rawContact1.getId(), rawContact2.getId());
+
+        // Sanity check: two contacts are aggregated
+        rawContact1.load();
+        rawContact2.load();
+        Assert.assertEquals(rawContact1.getContactId(), rawContact2.getContactId());
+
+        // Verify: the display name is taken from the name with more than phonetic components
+        TestContact contact = rawContact2.getContact().load();
+        contact.assertColumn(Contacts.DISPLAY_NAME, "name");
+    }
+}
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsTest.java
index 9a3fc19..4d1cb86 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsTest.java
@@ -40,6 +40,7 @@
 import android.provider.Contacts.Phones;
 import android.provider.Contacts.Photos;
 import android.provider.Contacts.Settings;
+import android.provider.ContactsContract;
 import android.telephony.PhoneNumberUtils;
 import android.test.InstrumentationTestCase;
 
@@ -56,7 +57,7 @@
     protected void setUp() throws Exception {
         super.setUp();
         mContentResolver = getInstrumentation().getTargetContext().getContentResolver();
-        mProvider = mContentResolver.acquireContentProviderClient(Contacts.AUTHORITY);
+        mProvider = mContentResolver.acquireContentProviderClient(ContactsContract.AUTHORITY);
         mCallLogProvider = mContentResolver.acquireContentProviderClient(CallLog.AUTHORITY);
     }
 
@@ -416,7 +417,7 @@
                 Calls.CACHED_NUMBER_LABEL, Calls.CACHED_FORMATTED_NUMBER,
                 Calls.CACHED_MATCHED_NUMBER, Calls.CACHED_NORMALIZED_NUMBER,
                 Calls.CACHED_LOOKUP_URI, Calls.CACHED_PHOTO_ID, Calls.COUNTRY_ISO,
-                Calls.GEOCODED_LOCATION};
+                Calls.GEOCODED_LOCATION, Calls.CACHED_PHOTO_URI};
         final int ID_INDEX = 0;
         final int NUMBER_INDEX = 1;
         final int DATE_INDEX = 2;
@@ -433,6 +434,7 @@
         final int CACHED_PHOTO_ID_INDEX = 13;
         final int COUNTRY_ISO_INDEX = 14;
         final int GEOCODED_LOCATION_INDEX = 15;
+        final int CACHED_PHOTO_URI_INDEX = 16;
 
         String insertCallsNumber = "0123456789";
         int insertCallsDuration = 120;
@@ -448,6 +450,7 @@
         String updateCachedNormalizedNumber = "+1987654321";
         String updateCachedLookupUri = "cached_lookup_uri_update";
         long updateCachedPhotoId = 100;
+        String updateCachedPhotoUri = "content://com.android.contacts/display_photo/1";
         String updateCountryIso = "hk";
         String updateGeocodedLocation = "Hong Kong";
 
@@ -497,6 +500,7 @@
             value.put(Calls.CACHED_MATCHED_NUMBER, updateCachedMatchedNumber);
             value.put(Calls.CACHED_NORMALIZED_NUMBER, updateCachedNormalizedNumber);
             value.put(Calls.CACHED_PHOTO_ID, updateCachedPhotoId);
+            value.put(Calls.CACHED_PHOTO_URI, updateCachedPhotoUri);
             value.put(Calls.COUNTRY_ISO, updateCountryIso);
             value.put(Calls.GEOCODED_LOCATION, updateGeocodedLocation);
             value.put(Calls.CACHED_LOOKUP_URI, updateCachedLookupUri);
@@ -519,6 +523,7 @@
             assertEquals(updateCachedNormalizedNumber,
                     cursor.getString(CACHED_NORMALIZED_NUMBER_INDEX));
             assertEquals(updateCachedPhotoId, cursor.getLong(CACHED_PHOTO_ID_INDEX));
+            assertEquals(updateCachedPhotoUri, cursor.getString(CACHED_PHOTO_URI_INDEX));
             assertEquals(updateCountryIso, cursor.getString(COUNTRY_ISO_INDEX));
             assertEquals(updateGeocodedLocation, cursor.getString(GEOCODED_LOCATION_INDEX));
             assertEquals(updateCachedLookupUri, cursor.getString(CACHED_LOOKUP_URI_INDEX));
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java
index c1b2229..8fc5df1 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java
@@ -306,19 +306,25 @@
 
                 // get the real path from the file descriptor (this relies on the media provider
                 // having opened the path via the real path instead of the emulated path).
-                values = new ContentValues();
-                values.put("_data", realPathFor(pfd));
-                mResolver.update(uri, values, null, null);
+                String realPath = realPathFor(pfd);
                 pfd.close();
+                if (realPath.equals(sdfile.getCanonicalPath())) {
+                    // provider did not use real/translated path
+                    sdfile = null;
+                } else {
+                    values = new ContentValues();
+                    values.put("_data", realPath);
+                    mResolver.update(uri, values, null, null);
 
-                // we shouldn't be able to access this
-                try {
-                    pfd = mResolver.openFileDescriptor(uri, "r");
-                    fail("shouldn't have fd for " + realPathFor(pfd));
-                } catch (FileNotFoundException e) {
-                    // expected
-                } finally {
-                    pfd.close();
+                    // we shouldn't be able to access this
+                    try {
+                        pfd = mResolver.openFileDescriptor(uri, "r");
+                        fail("shouldn't have fd for " + realPath);
+                    } catch (FileNotFoundException e) {
+                        // expected
+                    } finally {
+                        pfd.close();
+                    }
                 }
             } catch (FileNotFoundException e) {
                 fail("couldn't open file");
@@ -328,7 +334,7 @@
         // clean up
         assertEquals(1, mResolver.delete(uri, null, null));
         if (sdfile != null) {
-            assertEquals(true, sdfile.delete());
+            assertEquals("couldn't delete " + sdfile.getCanonicalPath(), true, sdfile.delete());
         }
 
         // test secondary storage if present
diff --git a/tests/tests/provider/src/android/provider/cts/SettingsTest.java b/tests/tests/provider/src/android/provider/cts/SettingsTest.java
index c732305..5cf5106 100644
--- a/tests/tests/provider/src/android/provider/cts/SettingsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/SettingsTest.java
@@ -16,7 +16,6 @@
 
 package android.provider.cts;
 
-
 import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.ContentValues;
@@ -35,14 +34,11 @@
         final String[] SYSTEM_PROJECTION = new String[] {
                 Settings.System._ID, Settings.System.NAME, Settings.System.VALUE
         };
-        final int ID_INDEX = 0;
         final int NAME_INDEX = 1;
         final int VALUE_INDEX = 2;
 
-        String insertName = "name_insert";
+        String name = "name";
         String insertValue = "value_insert";
-
-        String updateName = "name_update";
         String updateValue = "value_update";
 
         // get provider
@@ -54,119 +50,50 @@
         try {
             // Test: insert
             ContentValues value = new ContentValues();
-            value.put(Settings.System.NAME, insertName);
+            value.put(Settings.System.NAME, name);
             value.put(Settings.System.VALUE, insertValue);
 
             provider.insert(Settings.System.CONTENT_URI, value);
             cursor = provider.query(Settings.System.CONTENT_URI, SYSTEM_PROJECTION,
-                    Settings.System.NAME + "=\"" + insertName + "\"", null, null, null);
+                    Settings.System.NAME + "=\"" + name + "\"", null, null, null);
             assertNotNull(cursor);
             assertEquals(1, cursor.getCount());
             assertTrue(cursor.moveToFirst());
-            assertEquals(insertName, cursor.getString(NAME_INDEX));
+            assertEquals(name, cursor.getString(NAME_INDEX));
             assertEquals(insertValue, cursor.getString(VALUE_INDEX));
-            int Id = cursor.getInt(ID_INDEX);
             cursor.close();
+            cursor = null;
 
             // Test: update
             value.clear();
-            value.put(Settings.System.NAME, updateName);
+            value.put(Settings.System.NAME, name);
             value.put(Settings.System.VALUE, updateValue);
 
             provider.update(Settings.System.CONTENT_URI, value,
-                    Settings.System.NAME + "=\"" + insertName + "\"", null);
+                    Settings.System.NAME + "=\"" + name + "\"", null);
             cursor = provider.query(Settings.System.CONTENT_URI, SYSTEM_PROJECTION,
-                    Settings.System._ID + " = " + Id, null, null, null);
+                    Settings.System.NAME + "=\"" + name + "\"", null, null, null);
             assertNotNull(cursor);
             assertEquals(1, cursor.getCount());
             assertTrue(cursor.moveToFirst());
-            assertEquals(updateName, cursor.getString(NAME_INDEX));
+            assertEquals(name, cursor.getString(NAME_INDEX));
             assertEquals(updateValue, cursor.getString(VALUE_INDEX));
             cursor.close();
+            cursor = null;
 
             // Test: delete
             provider.delete(Settings.System.CONTENT_URI,
-                    Settings.System.NAME + "=\"" + updateName + "\"", null);
+                    Settings.System.NAME + "=\"" + name + "\"", null);
             cursor = provider.query(Settings.System.CONTENT_URI, SYSTEM_PROJECTION,
-                    Settings.System._ID + " = " + Id, null, null, null);
+                    Settings.System.NAME + "=\"" + name + "\"", null, null, null);
             assertNotNull(cursor);
             assertEquals(0, cursor.getCount());
-        } finally {
-            // TODO should clean up more better
-            if (cursor != null)
-                cursor.close();
-        }
-    }
-
-    public void testBluetoothDevicesTable() throws RemoteException {
-        final String[] BLUETOOTH_DEVICES_PROJECTION = new String[] {
-                "name", "addr", "channel", "type"
-        };
-        final int ID_INDEX = 0;
-        final int ADDR_INDEX = 1;
-        final int CHANNEL_INDEX = 2;
-        final int TYPE_INDEX = 3;
-
-        String insertName = "name_insert";
-        String insertAddr = "addr_insert";
-
-        String updateName = "name_update";
-        String updateAddr = "addr_update";
-
-        // get provider
-        Uri uri = Uri.parse("content://settings/bluetooth_devices");
-        ContentResolver cr = mContext.getContentResolver();
-        ContentProviderClient provider = cr.acquireContentProviderClient(uri);
-        Cursor cursor = null;
-
-        try {
-            // Test: insert
-            ContentValues value = new ContentValues();
-            value.put("name", insertName);
-            value.put("addr", insertAddr);
-            value.put("channel", 1);
-            value.put("type", 2);
-
-            provider.insert(uri, value);
-            cursor = provider.query(uri, BLUETOOTH_DEVICES_PROJECTION,
-                    "name=\"" + insertName + "\"", null, null, null);
-            assertNotNull(cursor);
-            assertEquals(1, cursor.getCount());
-            assertTrue(cursor.moveToFirst());
-            assertEquals(insertAddr, cursor.getString(ADDR_INDEX));
-            assertEquals(1, cursor.getInt(CHANNEL_INDEX));
-            assertEquals(2, cursor.getInt(TYPE_INDEX));
-            int Id = cursor.getInt(ID_INDEX);
             cursor.close();
-
-            // Test: update
-            value.clear();
-            value.put("name", updateName);
-            value.put("addr", updateAddr);
-            value.put("channel", 3);
-            value.put("type", 4);
-
-            provider.update(uri, value, "name=\"" + insertName + "\"", null);
-            cursor = provider.query(uri, BLUETOOTH_DEVICES_PROJECTION,
-                    "name=\"" + updateName + "\"", null, null, null);
-            assertNotNull(cursor);
-            assertEquals(1, cursor.getCount());
-            assertTrue(cursor.moveToFirst());
-            assertEquals(updateAddr, cursor.getString(ADDR_INDEX));
-            assertEquals(3, cursor.getInt(CHANNEL_INDEX));
-            assertEquals(4, cursor.getInt(TYPE_INDEX));
-            cursor.close();
-
-            // Test: delete
-            provider.delete(uri, "name=\"" + updateName + "\"", null);
-            cursor = provider.query(uri, BLUETOOTH_DEVICES_PROJECTION, "_id = " + Id,
-                    null, null, null);
-            assertNotNull(cursor);
-            assertEquals(0, cursor.getCount());
+            cursor = null;
         } finally {
-            // TODO should clean up more better
-            if (cursor != null)
+            if (cursor != null) {
                 cursor.close();
+            }
         }
     }
 
@@ -211,22 +138,24 @@
             fail("SettingsProvider didn't throw IllegalArgumentException for insert name "
                     + name + " at URI " + uri);
         } catch (IllegalArgumentException e) {
+            /* ignore */
         }
 
-
         try {
             cr.update(uri, cv, NAME_EQ_PLACEHOLDER, new String[]{name});
-            fail("SettingsProvider didn't throw IllegalArgumentException for update name "
+            fail("SettingsProvider didn't throw SecurityException for update name "
                     + name + " at URI " + uri);
         } catch (IllegalArgumentException e) {
+            /* ignore */
         }
 
         try {
-            Cursor c = cr.query(uri, SELECT_VALUE, NAME_EQ_PLACEHOLDER,
+            cr.query(uri, SELECT_VALUE, NAME_EQ_PLACEHOLDER,
                     new String[]{name}, null);
             fail("SettingsProvider didn't throw IllegalArgumentException for query name "
                     + name + " at URI " + uri);
         } catch (IllegalArgumentException e) {
+            /* ignore */
         }
 
 
@@ -235,6 +164,7 @@
             fail("SettingsProvider didn't throw IllegalArgumentException for delete name "
                     + name + " at URI " + uri);
         } catch (IllegalArgumentException e) {
+            /* ignore */
         }
 
 
@@ -259,9 +189,7 @@
 
     public void testAccessNonTable() {
         tryBadTableAccess("SYSTEM", "system", "install_non_market_apps");
-        tryBadTableAccess("BOOKMARKS", "bookmarks", "install_non_market_apps");
         tryBadTableAccess("SECURE", "secure", "install_non_market_apps");
-        tryBadTableAccess("BLUETOOTH_DEVICES", "bluetooth_devices", "install_non_market_apps");
         tryBadTableAccess(" secure", "secure", "install_non_market_apps");
         tryBadTableAccess("secure ", "secure", "install_non_market_apps");
         tryBadTableAccess(" secure ", "secure", "install_non_market_apps");
diff --git a/tests/tests/provider/src/android/provider/cts/Settings_SystemTest.java b/tests/tests/provider/src/android/provider/cts/Settings_SystemTest.java
index 2052e2e..b3c545e 100644
--- a/tests/tests/provider/src/android/provider/cts/Settings_SystemTest.java
+++ b/tests/tests/provider/src/android/provider/cts/Settings_SystemTest.java
@@ -21,11 +21,16 @@
 import android.content.res.Configuration;
 import android.database.Cursor;
 import android.net.Uri;
+import android.os.ParcelFileDescriptor;
 import android.provider.Settings.SettingNotFoundException;
 import android.provider.Settings.System;
-import android.test.AndroidTestCase;
+import android.test.InstrumentationTestCase;
 
-public class Settings_SystemTest extends AndroidTestCase {
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.Scanner;
+
+public class Settings_SystemTest extends InstrumentationTestCase {
     private ContentResolver cr;
 
     private static final String INT_FIELD = "IntField";
@@ -37,7 +42,7 @@
     protected void setUp() throws Exception {
         super.setUp();
 
-        cr = mContext.getContentResolver();
+        cr = getInstrumentation().getContext().getContentResolver();
         assertNotNull(cr);
     }
 
@@ -53,9 +58,34 @@
 
         selection = System.NAME + "=\"" + STRING_FIELD + "\"";
         cr.delete(System.CONTENT_URI, selection, null);
+    }
 
-        selection = System.NAME + "=\"" + System.SHOW_GTALK_SERVICE_STATUS + "\"";
-        cr.delete(System.CONTENT_URI, selection, null);
+    private void enableAppOps() {
+        StringBuilder cmd = new StringBuilder();
+        cmd.append("appops set ");
+        cmd.append(getInstrumentation().getContext().getPackageName());
+        cmd.append(" android:write_settings allow");
+        getInstrumentation().getUiAutomation().executeShellCommand(cmd.toString());
+
+        StringBuilder query = new StringBuilder();
+        query.append("appops get ");
+        query.append(getInstrumentation().getContext().getPackageName());
+        query.append(" android:write_settings");
+        String queryStr = query.toString();
+
+        String result = "No operations.";
+        while (result.contains("No operations")) {
+            ParcelFileDescriptor pfd = getInstrumentation().getUiAutomation().executeShellCommand(
+                    queryStr);
+            InputStream inputStream = new FileInputStream(pfd.getFileDescriptor());
+            result = convertStreamToString(inputStream);
+        }
+    }
+
+    private String convertStreamToString(InputStream is) {
+        try (Scanner scanner = new Scanner(is).useDelimiter("\\A")) {
+            return scanner.hasNext() ? scanner.next() : "";
+        }
     }
 
     public void testSystemSettings() throws SettingNotFoundException {
@@ -76,16 +106,15 @@
 
             String stringValue = "cts";
 
-            // insert 5 rows, and update 1 rows
+            // insert 4 rows, and update 1 rows
             assertTrue(System.putInt(cr, INT_FIELD, 10));
             assertTrue(System.putLong(cr, LONG_FIELD, 20l));
             assertTrue(System.putFloat(cr, FLOAT_FIELD, 30.0f));
             assertTrue(System.putString(cr, STRING_FIELD, stringValue));
-            System.setShowGTalkServiceStatus(cr, true);
 
             c = cr.query(System.CONTENT_URI, null, null, null, null);
             assertNotNull(c);
-            assertEquals(origCount + 5, c.getCount());
+            assertEquals(origCount + 4, c.getCount());
             c.close();
 
             // get these rows to assert
@@ -94,7 +123,6 @@
             assertEquals(30.0f, System.getFloat(cr, FLOAT_FIELD), 0.001);
 
             assertEquals(stringValue, System.getString(cr, STRING_FIELD));
-            assertTrue(System.getShowGTalkServiceStatus(cr));
 
             // delete the tested rows again
             deleteTestedRows();
diff --git a/tests/tests/provider/src/android/provider/cts/TelephonyProviderTest.java b/tests/tests/provider/src/android/provider/cts/TelephonyProviderTest.java
index 0eba9f2..b06ddfa 100644
--- a/tests/tests/provider/src/android/provider/cts/TelephonyProviderTest.java
+++ b/tests/tests/provider/src/android/provider/cts/TelephonyProviderTest.java
@@ -52,32 +52,35 @@
 
     // Test that the TelephonyProvider doesn't allow clients to update _data column data and
     // if they can, that they can't abuse the provider to open an arbitrary file.
-    public void testOpeningAnyFile() {
-        Uri uri = Uri.parse("content://mms/100/part");
-        try {
-            ContentValues values2 = new ContentValues();
-            values2.put("_data", "/dev/urandom");
-            Uri uri2 = mContentResolver.insert(uri, values2);
-            assertEquals("The code was able to insert the _data column", null, uri2);
-            if (uri2 == null) {
-                return;
-            }
-            ContentValues values = new ContentValues();
-            values.put("_data", "/dev/urandom");
-            int rowCnt = mContentResolver.update(uri2, values, null, null);
-            assertEquals("Was able to update the _data column", 0, rowCnt);
-
-            ParcelFileDescriptor pfd = mContentResolver.openFileDescriptor(uri2, "rw");
-            pfd.getFileDescriptor();
-            FileDescriptor fd = pfd.getFileDescriptor();
-            Field fld = fd.getClass().getDeclaredField("descriptor");
-            fld.setAccessible(true);
-            int fint  = fld.getInt(fd);
-            fail("The code was able to abuse the MmsProvider to open any file");
-        } catch(Exception e){
-            e.printStackTrace();
-        }
-    }
+    // --- This test is commented out for now because the test needs to run as if it were
+    // the default SMS app. Until we have a way to do that in the test framework, the test will
+    // fail (i.e. the insert will appear to have succeeded when it really hasn't).
+//    public void testOpeningAnyFile() {
+//        Uri uri = Uri.parse("content://mms/100/part");
+//        try {
+//            ContentValues values2 = new ContentValues();
+//            values2.put("_data", "/dev/urandom");
+//            Uri uri2 = mContentResolver.insert(uri, values2);
+//            assertNull("The code was able to insert the _data column", uri2);
+//            if (uri2 == null) {
+//                return;
+//            }
+//            ContentValues values = new ContentValues();
+//            values.put("_data", "/dev/urandom");
+//            int rowCnt = mContentResolver.update(uri2, values, null, null);
+//            assertEquals("Was able to update the _data column", 0, rowCnt);
+//
+//            ParcelFileDescriptor pfd = mContentResolver.openFileDescriptor(uri2, "rw");
+//            pfd.getFileDescriptor();
+//            FileDescriptor fd = pfd.getFileDescriptor();
+//            Field fld = fd.getClass().getDeclaredField("descriptor");
+//            fld.setAccessible(true);
+//            int fint  = fld.getInt(fd);
+//            fail("The code was able to abuse the MmsProvider to open any file");
+//        } catch(Exception e){
+//            e.printStackTrace();
+//        }
+//    }
 
     // In JB MR1 access to the TelephonyProvider's Carriers table was clamped down and would
     // throw a SecurityException when queried. That was fixed in JB MR2. Verify that 3rd parties
diff --git a/tests/tests/renderscript/Android.mk b/tests/tests/renderscript/Android.mk
index 245c5b9..7b30859 100644
--- a/tests/tests/renderscript/Android.mk
+++ b/tests/tests/renderscript/Android.mk
@@ -29,11 +29,13 @@
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
-LOCAL_JNI_SHARED_LIBRARIES := libcoremathtestcpp_jni
+LOCAL_JNI_SHARED_LIBRARIES := libcoremathtestcpp_jni libbnnmdata_jni
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
 
+LOCAL_RENDERSCRIPT_FLAGS := -Wno-error=deprecated-declarations
+
 LOCAL_SDK_VERSION := current
 
 include $(BUILD_CTS_PACKAGE)
-include $(LOCAL_PATH)/libcoremathtestcpp/Android.mk
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/tests/renderscript/assets/BLASData.txt b/tests/tests/renderscript/assets/BLASData.txt
new file mode 100644
index 0000000..31c671f
--- /dev/null
+++ b/tests/tests/renderscript/assets/BLASData.txt
@@ -0,0 +1,1577 @@
+/* Don't edit this file!  It is auto-generated by blas_gen.py. */
+
+M, N, K, KL, KU;
+10 17 16 2 1
+
+L2_sGEMV_A_mn
+0.4, 0.8, 0.6, 0.5, 0.9, 0.4, 0.2, 0.9, 0.9, 0.4, 0.5, 0.8, 0.5, 0.4, 0.9, 0.1, 0.6, 0.1, 0.6, 0.2, 0.6, 0.1, 0.3, 0.3, 0.9, 0.8, 0.4, 0.8, 0.1, 0.2, 0.1, 0.3, 0.1, 0.2, 0.2, 0.9, 0.4, 0.1, 0.9, 0.7, 0.2, 0.9, 0.2, 0.1, 0.6, 0.8, 0.3, 0.4, 0.7, 0.7, 0.4, 0.4, 0.3, 0.8, 0.1, 0.6, 0.4, 0.9, 0.8, 0.4, 0.9, 0.8, 0.2, 0.4, 0.5, 0.7, 0.3, 0.7, 0.3, 0.1, 0.7, 0.7, 0.4, 0.3, 0.6, 0.1, 0.6, 0.4, 0.8, 0.7, 0.9, 0.8, 0.1, 0.7, 0.6, 0.6, 0.6, 0.3, 0.1, 0.5, 0.9, 0.2, 0.2, 0.2, 0.3, 0.8, 0.2, 0.9, 0.8, 0.3, 0.1, 0.1, 0.1, 0.8, 0.1, 0.3, 0.8, 0.2, 0.5, 0.9, 0.7, 0.2, 0.3, 0.7, 0.1, 0.2, 0.8, 0.8, 0.4, 0.2, 0.2, 0.4, 0.2, 0.3, 0.1, 0.8, 0.2, 0.3, 0.9, 0.5, 0.3, 0.5, 0.4, 0.5, 0.6, 0.6, 0.4, 0.2, 0.2, 0.7, 0.9, 0.1, 0.8, 0.7, 0.5, 0.6, 0.8, 0.7, 0.8, 0.2, 0.4, 0.1, 0.2, 0.7, 0.7, 0.3, 0.3, 0.4, 0.8, 0.9, 0.5, 0.4, 0.5, 0.7, 0.6, 0.4, 0.1, 0.9, 0.2, 0.2, 
+
+L2_sGEMV_x_n1
+0.6, 0.8, 0.7, 0.9, 0.8, 0.4, 0.6, 0.6, 0.3, 0.2, 0.1, 0.2, 0.7, 0.8, 0.5, 0.4, 0.6, 
+
+L2_sGEMV_x_n2
+0.6, 0.0, 0.8, 0.0, 0.7, 0.0, 0.9, 0.0, 0.8, 0.0, 0.4, 0.0, 0.6, 0.0, 0.6, 0.0, 0.3, 0.0, 0.2, 0.0, 0.1, 0.0, 0.2, 0.0, 0.7, 0.0, 0.8, 0.0, 0.5, 0.0, 0.4, 0.0, 0.6, 0.0, 
+
+L2_sGEMV_y_m1
+0.4, 0.5, 0.7, 0.2, 0.2, 0.4, 0.1, 0.8, 0.5, 0.4, 
+
+L2_sGEMV_y_m2
+0.4, 0.0, 0.0, 0.5, 0.0, 0.0, 0.7, 0.0, 0.0, 0.2, 0.0, 0.0, 0.2, 0.0, 0.0, 0.4, 0.0, 0.0, 0.1, 0.0, 0.0, 0.8, 0.0, 0.0, 0.5, 0.0, 0.0, 0.4, 0.0, 0.0, 
+
+L2_sGEMV_o_N
+5.77000007883, 3.59000010103, 5.2700000222, 4.98000011489, 4.88000006273, 4.30000009164, 4.31000010833, 4.32000012204, 4.90000004768, 4.76000007406, 
+
+L2_sGEMV_o_N2
+5.77000007883, 0.0, 0.0, 3.59000010103, 0.0, 0.0, 5.2700000222, 0.0, 0.0, 4.98000011489, 0.0, 0.0, 4.88000006273, 0.0, 0.0, 4.30000009164, 0.0, 0.0, 4.31000010833, 0.0, 0.0, 4.32000012204, 0.0, 0.0, 4.90000004768, 0.0, 0.0, 4.76000007406, 0.0, 0.0, 
+
+L2_sGEMV_o_T
+1.98000005528, 2.99000003099, 2.29000003099, 2.3299999994, 3.17000000134, 2.17000001475, 2.80000006035, 3.09999998882, 2.20000004247, 2.25000002459, 2.87000005201, 2.29000003546, 2.80000001043, 2.35000004545, 2.81999999911, 1.91000002712, 2.22000007659, 
+
+L2_sGEMV_o_H
+1.98000005528, 2.99000003099, 2.29000003099, 2.3299999994, 3.17000000134, 2.17000001475, 2.80000006035, 3.09999998882, 2.20000004247, 2.25000002459, 2.87000005201, 2.29000003546, 2.80000001043, 2.35000004545, 2.81999999911, 1.91000002712, 2.22000007659, 
+
+L2_dGEMV_A_mn
+0.8, 0.7, 0.9, 0.2, 0.6, 0.9, 0.4, 0.1, 0.9, 0.9, 0.6, 0.2, 0.9, 0.9, 0.1, 0.5, 0.7, 0.6, 0.5, 0.6, 0.9, 0.3, 0.6, 0.1, 0.7, 0.7, 0.6, 0.2, 0.5, 0.9, 0.6, 0.4, 0.6, 0.9, 0.4, 0.2, 0.2, 0.9, 0.3, 0.8, 0.7, 0.1, 0.1, 0.9, 0.5, 0.1, 0.6, 0.5, 0.7, 0.8, 0.4, 0.3, 0.3, 0.9, 0.4, 0.9, 0.6, 0.2, 0.7, 0.2, 0.9, 0.3, 0.7, 0.4, 0.2, 0.3, 0.8, 0.1, 0.5, 0.1, 0.7, 0.8, 0.8, 0.8, 0.1, 0.4, 0.2, 0.5, 0.3, 0.6, 0.9, 0.6, 0.2, 0.4, 0.6, 0.7, 0.7, 0.2, 0.5, 0.8, 0.2, 0.4, 0.6, 0.9, 0.1, 0.6, 0.3, 0.8, 0.2, 0.3, 0.5, 0.6, 0.8, 0.1, 0.4, 0.2, 0.4, 0.6, 0.3, 0.5, 0.7, 0.6, 0.7, 0.2, 0.7, 0.2, 0.9, 0.2, 0.7, 0.7, 0.2, 0.3, 0.1, 0.3, 0.2, 0.7, 0.5, 0.2, 0.5, 0.7, 0.4, 0.6, 0.6, 0.5, 0.1, 0.9, 0.6, 0.8, 0.2, 0.8, 0.2, 0.8, 0.3, 0.6, 0.2, 0.9, 0.7, 0.1, 0.8, 0.9, 0.6, 0.1, 0.6, 0.1, 0.2, 0.3, 0.3, 0.5, 0.1, 0.1, 0.5, 0.2, 0.3, 0.3, 0.4, 0.6, 0.4, 0.2, 0.1, 0.4, 
+
+L2_dGEMV_x_n1
+0.7, 0.8, 0.7, 0.8, 0.9, 0.4, 0.2, 0.5, 0.4, 0.5, 0.2, 0.8, 0.9, 0.7, 0.4, 0.2, 0.4, 
+
+L2_dGEMV_x_n2
+0.7, 0.0, 0.8, 0.0, 0.7, 0.0, 0.8, 0.0, 0.9, 0.0, 0.4, 0.0, 0.2, 0.0, 0.5, 0.0, 0.4, 0.0, 0.5, 0.0, 0.2, 0.0, 0.8, 0.0, 0.9, 0.0, 0.7, 0.0, 0.4, 0.0, 0.2, 0.0, 0.4, 0.0, 
+
+L2_dGEMV_y_m1
+0.9, 0.7, 0.4, 0.1, 0.5, 0.6, 0.8, 0.9, 0.3, 0.4, 
+
+L2_dGEMV_y_m2
+0.9, 0.0, 0.0, 0.7, 0.0, 0.0, 0.4, 0.0, 0.0, 0.1, 0.0, 0.0, 0.5, 0.0, 0.0, 0.6, 0.0, 0.0, 0.8, 0.0, 0.0, 0.9, 0.0, 0.0, 0.3, 0.0, 0.0, 0.4, 0.0, 0.0, 
+
+L2_dGEMV_o_N
+6.79, 6.43, 4.64, 4.91, 5.82, 5.46, 5.12, 4.91, 5.6, 3.53, 
+
+L2_dGEMV_o_N2
+6.79, 0.0, 0.0, 6.43, 0.0, 0.0, 4.64, 0.0, 0.0, 4.91, 0.0, 0.0, 5.82, 0.0, 0.0, 5.46, 0.0, 0.0, 5.12, 0.0, 0.0, 4.91, 0.0, 0.0, 5.6, 0.0, 0.0, 3.53, 0.0, 0.0, 
+
+L2_dGEMV_o_T
+4.19, 2.94, 3.34, 3.32, 3.59, 3.47, 2.22, 2.98, 3.28, 3.81, 3.14, 2.63, 5.13, 3.7, 2.79, 2.29, 4.2, 
+
+L2_dGEMV_o_H
+4.19, 2.94, 3.34, 3.32, 3.59, 3.47, 2.22, 2.98, 3.28, 3.81, 3.14, 2.63, 5.13, 3.7, 2.79, 2.29, 4.2, 
+
+L2_cGEMV_A_mn
+0.600000023842, 0.899999976158, 0.899999976158, 0.899999976158, 0.40000000596, 0.20000000298, 0.300000011921, 0.699999988079, 0.5, 0.800000011921, 0.5, 0.10000000149, 0.10000000149, 0.899999976158, 0.20000000298, 0.600000023842, 0.5, 0.800000011921, 0.5, 0.5, 0.40000000596, 0.40000000596, 0.800000011921, 0.5, 0.699999988079, 0.800000011921, 0.10000000149, 0.5, 0.40000000596, 0.5, 0.40000000596, 0.10000000149, 0.600000023842, 0.5, 0.5, 0.5, 0.300000011921, 0.300000011921, 0.899999976158, 0.10000000149, 0.899999976158, 0.800000011921, 0.5, 0.899999976158, 0.699999988079, 0.5, 0.10000000149, 0.40000000596, 0.899999976158, 0.600000023842, 0.899999976158, 0.40000000596, 0.40000000596, 0.5, 0.600000023842, 0.10000000149, 0.40000000596, 0.600000023842, 0.10000000149, 0.5, 0.800000011921, 0.5, 0.10000000149, 0.40000000596, 0.20000000298, 0.800000011921, 0.899999976158, 0.10000000149, 0.20000000298, 0.899999976158, 0.20000000298, 0.800000011921, 0.699999988079, 0.600000023842, 0.800000011921, 0.800000011921, 0.300000011921, 0.600000023842, 0.300000011921, 0.899999976158, 0.600000023842, 0.300000011921, 0.5, 0.20000000298, 0.20000000298, 0.5, 0.699999988079, 0.300000011921, 0.899999976158, 0.800000011921, 0.20000000298, 0.40000000596, 0.10000000149, 0.20000000298, 0.40000000596, 0.600000023842, 0.10000000149, 0.300000011921, 0.20000000298, 0.20000000298, 0.300000011921, 0.800000011921, 0.800000011921, 0.899999976158, 0.5, 0.699999988079, 0.699999988079, 0.5, 0.40000000596, 0.20000000298, 0.40000000596, 0.699999988079, 0.899999976158, 0.899999976158, 0.300000011921, 0.800000011921, 0.20000000298, 0.800000011921, 0.600000023842, 0.899999976158, 0.300000011921, 0.800000011921, 0.300000011921, 0.800000011921, 0.5, 0.10000000149, 0.800000011921, 0.899999976158, 0.20000000298, 0.899999976158, 0.699999988079, 0.40000000596, 0.699999988079, 0.10000000149, 0.5, 0.300000011921, 0.800000011921, 0.20000000298, 0.40000000596, 0.800000011921, 0.300000011921, 0.5, 0.699999988079, 0.899999976158, 0.300000011921, 0.20000000298, 0.5, 0.10000000149, 0.40000000596, 0.10000000149, 0.40000000596, 0.300000011921, 0.699999988079, 0.600000023842, 0.20000000298, 0.899999976158, 0.600000023842, 0.20000000298, 0.5, 0.40000000596, 0.40000000596, 0.800000011921, 0.699999988079, 0.40000000596, 0.40000000596, 0.899999976158, 0.10000000149, 0.20000000298, 0.600000023842, 0.40000000596, 0.600000023842, 0.600000023842, 0.800000011921, 0.899999976158, 0.600000023842, 0.800000011921, 0.5, 0.699999988079, 0.300000011921, 0.5, 0.899999976158, 0.899999976158, 0.40000000596, 0.600000023842, 0.40000000596, 0.899999976158, 0.800000011921, 0.10000000149, 0.10000000149, 0.10000000149, 0.10000000149, 0.5, 0.699999988079, 0.699999988079, 0.20000000298, 0.600000023842, 0.20000000298, 0.300000011921, 0.800000011921, 0.5, 0.40000000596, 0.20000000298, 0.40000000596, 0.300000011921, 0.10000000149, 0.600000023842, 0.899999976158, 0.40000000596, 0.899999976158, 0.40000000596, 0.10000000149, 0.800000011921, 0.300000011921, 0.40000000596, 0.10000000149, 0.600000023842, 0.40000000596, 0.300000011921, 0.699999988079, 0.600000023842, 0.800000011921, 0.300000011921, 0.5, 0.20000000298, 0.300000011921, 0.699999988079, 0.800000011921, 0.600000023842, 0.899999976158, 0.10000000149, 0.10000000149, 0.800000011921, 0.300000011921, 0.10000000149, 0.40000000596, 0.899999976158, 0.300000011921, 0.899999976158, 0.20000000298, 0.40000000596, 0.600000023842, 0.899999976158, 0.20000000298, 0.40000000596, 0.600000023842, 0.20000000298, 0.40000000596, 0.10000000149, 0.600000023842, 0.300000011921, 0.300000011921, 0.600000023842, 0.899999976158, 0.40000000596, 0.699999988079, 0.899999976158, 0.300000011921, 0.699999988079, 0.699999988079, 0.800000011921, 0.20000000298, 0.40000000596, 0.699999988079, 0.5, 0.20000000298, 0.899999976158, 0.600000023842, 0.20000000298, 0.699999988079, 0.5, 0.20000000298, 0.20000000298, 0.800000011921, 0.800000011921, 0.300000011921, 0.10000000149, 0.800000011921, 0.699999988079, 0.300000011921, 0.5, 0.899999976158, 0.899999976158, 0.699999988079, 0.40000000596, 0.800000011921, 0.20000000298, 0.800000011921, 0.40000000596, 0.5, 0.10000000149, 0.40000000596, 0.600000023842, 0.20000000298, 0.600000023842, 0.40000000596, 0.20000000298, 0.600000023842, 0.300000011921, 0.5, 0.699999988079, 0.600000023842, 0.10000000149, 0.600000023842, 0.600000023842, 0.20000000298, 0.600000023842, 0.699999988079, 0.5, 0.10000000149, 0.40000000596, 0.600000023842, 0.40000000596, 0.699999988079, 0.5, 0.899999976158, 0.600000023842, 0.600000023842, 0.699999988079, 0.600000023842, 0.800000011921, 0.5, 0.10000000149, 0.800000011921, 0.10000000149, 0.699999988079, 0.20000000298, 0.800000011921, 0.10000000149, 0.800000011921, 0.5, 0.600000023842, 0.20000000298, 0.899999976158, 0.20000000298, 0.899999976158, 0.5, 0.800000011921, 0.300000011921, 0.40000000596, 0.10000000149, 
+
+L2_cGEMV_x_n1
+0.5, 0.40000000596, 0.300000011921, 0.300000011921, 0.40000000596, 0.5, 0.20000000298, 0.699999988079, 0.5, 0.10000000149, 0.699999988079, 0.899999976158, 0.699999988079, 0.899999976158, 0.600000023842, 0.600000023842, 0.699999988079, 0.800000011921, 0.20000000298, 0.5, 0.5, 0.800000011921, 0.899999976158, 0.300000011921, 0.899999976158, 0.5, 0.899999976158, 0.699999988079, 0.699999988079, 0.20000000298, 0.899999976158, 0.600000023842, 0.899999976158, 0.699999988079, 
+
+L2_cGEMV_x_n2
+0.5, 0.40000000596, 0.0, 0.0, 0.300000011921, 0.300000011921, 0.0, 0.0, 0.40000000596, 0.5, 0.0, 0.0, 0.20000000298, 0.699999988079, 0.0, 0.0, 0.5, 0.10000000149, 0.0, 0.0, 0.699999988079, 0.899999976158, 0.0, 0.0, 0.699999988079, 0.899999976158, 0.0, 0.0, 0.600000023842, 0.600000023842, 0.0, 0.0, 0.699999988079, 0.800000011921, 0.0, 0.0, 0.20000000298, 0.5, 0.0, 0.0, 0.5, 0.800000011921, 0.0, 0.0, 0.899999976158, 0.300000011921, 0.0, 0.0, 0.899999976158, 0.5, 0.0, 0.0, 0.899999976158, 0.699999988079, 0.0, 0.0, 0.699999988079, 0.20000000298, 0.0, 0.0, 0.899999976158, 0.600000023842, 0.0, 0.0, 0.899999976158, 0.699999988079, 0.0, 0.0, 
+
+L2_cGEMV_y_m1
+0.699999988079, 0.300000011921, 0.20000000298, 0.40000000596, 0.699999988079, 0.699999988079, 0.20000000298, 0.600000023842, 0.40000000596, 0.40000000596, 0.800000011921, 0.800000011921, 0.300000011921, 0.5, 0.5, 0.5, 0.600000023842, 0.10000000149, 0.40000000596, 0.300000011921, 
+
+L2_cGEMV_y_m2
+0.699999988079, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.40000000596, 0.0, 0.0, 0.0, 0.0, 0.699999988079, 0.699999988079, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 0.40000000596, 0.40000000596, 0.0, 0.0, 0.0, 0.0, 0.800000011921, 0.800000011921, 0.0, 0.0, 0.0, 0.0, 0.300000011921, 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.10000000149, 0.0, 0.0, 0.0, 0.0, 0.40000000596, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 
+
+L2_cGEMV_o_N
+0.369999971539, 10.0700000311, 1.44999985248, 10.9199999611, -1.03000003666, 10.2100000301, -0.440000020564, 11.8699999484, 1.32999995992, 9.55000003353, 0.859999980181, 10.7200000505, -0.0200000840426, 10.2000000387, 0.449999946356, 10.3200000088, 2.18999997288, 9.83000009477, 4.28999994755, 10.3300000791, 
+
+L2_cGEMV_o_N2
+0.369999971539, 10.0700000311, 0.0, 0.0, 0.0, 0.0, 1.44999985248, 10.9199999611, 0.0, 0.0, 0.0, 0.0, -1.03000003666, 10.2100000301, 0.0, 0.0, 0.0, 0.0, -0.440000020564, 11.8699999484, 0.0, 0.0, 0.0, 0.0, 1.32999995992, 9.55000003353, 0.0, 0.0, 0.0, 0.0, 0.859999980181, 10.7200000505, 0.0, 0.0, 0.0, 0.0, -0.0200000840426, 10.2000000387, 0.0, 0.0, 0.0, 0.0, 0.449999946356, 10.3200000088, 0.0, 0.0, 0.0, 0.0, 2.18999997288, 9.83000009477, 0.0, 0.0, 0.0, 0.0, 4.28999994755, 10.3300000791, 0.0, 0.0, 0.0, 0.0, 
+
+L2_cGEMV_o_T
+0.0800000418723, 5.80000011399, -0.369999973774, 5.96000003904, 0.930000003129, 5.72000009149, -0.129999988973, 6.23000003964, 0.349999982119, 4.70000010133, 0.630000014305, 6.19000001237, 0.389999969155, 5.09000008985, 0.679999983758, 5.34000007868, 1.37000000283, 5.9000000827, 0.109999974966, 4.40000005662, 0.269999968559, 5.56000010014, 1.31999997079, 4.87000009596, 0.869999949187, 4.98000009328, -0.0100000442564, 5.00000004992, 1.29000001609, 4.30000008345, 1.37000000581, 4.20000011697, 0.869999999851, 4.86000010163, 
+
+L2_cGEMV_o_H
+5.94000011817, -0.519999925345, 6.01000006139, -0.479999917448, 5.43000012383, 0.879999977052, 5.53000006795, 0.210000015199, 5.23000008881, -0.759999982417, 6.35000001639, 1.01000001743, 5.09000016585, 0.229999995679, 5.58000012234, 0.659999977946, 5.87000006393, 1.64000006601, 4.21000005543, 0.179999993443, 5.31000006065, 0.539999995232, 5.56000006437, 0.490000033975, 5.49000007793, 0.339999989271, 5.3700000371, -0.28000001803, 4.95000009388, 0.560000053942, 4.65000004545, 0.940000015348, 4.81000006512, 0.540000002682, 
+
+L2_zGEMV_A_mn
+0.3, 0.7, 0.7, 0.2, 0.6, 0.4, 0.3, 0.7, 0.3, 0.7, 0.4, 0.1, 0.6, 0.7, 0.6, 0.6, 0.1, 0.5, 0.4, 0.9, 0.4, 0.5, 0.1, 0.1, 0.6, 0.9, 0.3, 0.8, 0.5, 0.3, 0.5, 0.3, 0.5, 0.4, 0.7, 0.7, 0.7, 0.6, 0.3, 0.3, 0.4, 0.5, 0.8, 0.9, 0.5, 0.4, 0.7, 0.2, 0.5, 0.8, 0.4, 0.5, 0.1, 0.2, 0.4, 0.5, 0.5, 0.1, 0.6, 0.4, 0.8, 0.4, 0.4, 0.5, 0.1, 0.6, 0.2, 0.2, 0.8, 0.8, 0.4, 0.9, 0.6, 0.9, 0.9, 0.8, 0.5, 0.1, 0.2, 0.8, 0.2, 0.5, 0.4, 0.5, 0.4, 0.6, 0.6, 0.8, 0.7, 0.6, 0.6, 0.8, 0.2, 0.8, 0.9, 0.2, 0.7, 0.3, 0.3, 0.4, 0.5, 0.6, 0.1, 0.7, 0.7, 0.6, 0.9, 0.4, 0.9, 0.2, 0.5, 0.8, 0.4, 0.6, 0.8, 0.5, 0.3, 0.3, 0.3, 0.2, 0.2, 0.8, 0.2, 0.9, 0.2, 0.5, 0.5, 0.3, 0.4, 0.5, 0.4, 0.7, 0.4, 0.6, 0.9, 0.2, 0.1, 0.9, 0.2, 0.5, 0.6, 0.8, 0.6, 0.5, 0.1, 0.6, 0.7, 0.5, 0.3, 0.1, 0.5, 0.1, 0.6, 0.4, 0.8, 0.6, 0.5, 0.4, 0.7, 0.2, 0.4, 0.6, 0.9, 0.7, 0.6, 0.3, 0.7, 0.6, 0.9, 0.2, 0.1, 0.3, 0.6, 0.5, 0.7, 0.3, 0.8, 0.4, 0.9, 0.4, 0.6, 0.2, 0.8, 0.5, 0.1, 0.8, 0.2, 0.1, 0.9, 0.8, 0.5, 0.3, 0.1, 0.8, 0.9, 0.9, 0.1, 0.8, 0.4, 0.7, 0.5, 0.9, 0.8, 0.6, 0.1, 0.8, 0.9, 0.1, 0.5, 0.4, 0.5, 0.7, 0.7, 0.7, 0.4, 0.7, 0.3, 0.6, 0.4, 0.8, 0.6, 0.7, 0.8, 0.3, 0.5, 0.6, 0.7, 0.3, 0.5, 0.3, 0.3, 0.8, 0.6, 0.8, 0.5, 0.3, 0.1, 0.6, 0.2, 0.5, 0.6, 0.9, 0.3, 0.8, 0.5, 0.7, 0.8, 0.9, 0.5, 0.5, 0.7, 0.1, 0.3, 0.4, 0.7, 0.5, 0.3, 0.1, 0.1, 0.4, 0.6, 0.6, 0.3, 0.3, 0.3, 0.7, 0.6, 0.1, 0.4, 0.8, 0.1, 0.8, 0.1, 0.8, 0.2, 0.5, 0.5, 0.8, 0.6, 0.1, 0.5, 0.7, 0.5, 0.8, 0.2, 0.5, 0.3, 0.5, 0.4, 0.3, 0.2, 0.1, 0.1, 0.6, 0.3, 0.9, 0.2, 0.1, 0.2, 0.8, 0.2, 0.2, 0.9, 0.3, 0.4, 0.9, 0.5, 0.9, 0.1, 0.5, 0.9, 0.4, 0.4, 0.1, 0.5, 0.2, 0.5, 0.8, 0.4, 0.8, 0.2, 0.9, 0.5, 0.5, 0.5, 0.7, 0.2, 0.7, 0.6, 0.6, 0.6, 0.1, 0.1, 0.2, 0.4, 0.7, 0.8, 0.3, 0.8, 0.2, 
+
+L2_zGEMV_x_n1
+0.4, 0.2, 0.6, 0.2, 0.1, 0.7, 0.2, 0.8, 0.4, 0.2, 0.9, 0.6, 0.5, 0.1, 0.6, 0.8, 0.2, 0.3, 0.1, 0.2, 0.9, 0.4, 0.1, 0.7, 0.9, 0.4, 0.9, 0.8, 0.1, 0.6, 0.1, 0.9, 0.8, 0.8, 
+
+L2_zGEMV_x_n2
+0.4, 0.2, 0.0, 0.0, 0.6, 0.2, 0.0, 0.0, 0.1, 0.7, 0.0, 0.0, 0.2, 0.8, 0.0, 0.0, 0.4, 0.2, 0.0, 0.0, 0.9, 0.6, 0.0, 0.0, 0.5, 0.1, 0.0, 0.0, 0.6, 0.8, 0.0, 0.0, 0.2, 0.3, 0.0, 0.0, 0.1, 0.2, 0.0, 0.0, 0.9, 0.4, 0.0, 0.0, 0.1, 0.7, 0.0, 0.0, 0.9, 0.4, 0.0, 0.0, 0.9, 0.8, 0.0, 0.0, 0.1, 0.6, 0.0, 0.0, 0.1, 0.9, 0.0, 0.0, 0.8, 0.8, 0.0, 0.0, 
+
+L2_zGEMV_y_m1
+0.7, 0.5, 0.2, 0.6, 0.8, 0.1, 0.5, 0.1, 0.1, 0.4, 0.9, 0.3, 0.4, 0.5, 0.5, 0.2, 0.6, 0.4, 0.5, 0.3, 
+
+L2_zGEMV_y_m2
+0.7, 0.5, 0.0, 0.0, 0.0, 0.0, 0.2, 0.6, 0.0, 0.0, 0.0, 0.0, 0.8, 0.1, 0.0, 0.0, 0.0, 0.0, 0.5, 0.1, 0.0, 0.0, 0.0, 0.0, 0.1, 0.4, 0.0, 0.0, 0.0, 0.0, 0.9, 0.3, 0.0, 0.0, 0.0, 0.0, 0.4, 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.2, 0.0, 0.0, 0.0, 0.0, 0.6, 0.4, 0.0, 0.0, 0.0, 0.0, 0.5, 0.3, 0.0, 0.0, 0.0, 0.0, 
+
+L2_zGEMV_o_N
+0.1, 8.39, 0.51, 8.0, -0.56, 9.56, 0.18, 8.46, 0.33, 9.43, -0.05, 8.77, -1.2, 9.11, -1.65, 7.85, -1.87, 8.4, -0.32, 8.49, 
+
+L2_zGEMV_o_N2
+0.1, 8.39, 0.0, 0.0, 0.0, 0.0, 0.51, 8.0, 0.0, 0.0, 0.0, 0.0, -0.56, 9.56, 0.0, 0.0, 0.0, 0.0, 0.18, 8.46, 0.0, 0.0, 0.0, 0.0, 0.33, 9.43, 0.0, 0.0, 0.0, 0.0, -0.05, 8.77, 0.0, 0.0, 0.0, 0.0, -1.2, 9.11, 0.0, 0.0, 0.0, 0.0, -1.65, 7.85, 0.0, 0.0, 0.0, 0.0, -1.87, 8.4, 0.0, 0.0, 0.0, 0.0, -0.32, 8.49, 0.0, 0.0, 0.0, 0.0, 
+
+L2_zGEMV_o_T
+-0.47, 4.69, 1.75, 4.84, 1.58, 5.41, 1.82, 5.04, 1.26, 4.92, 1.51, 5.0, 1.64, 4.4, 0.23, 5.27, 0.6, 3.83, 1.08, 4.89, 1.05, 4.49, 0.7, 5.19, 1.88, 4.88, 0.66, 5.36, 0.98, 4.58, 1.13, 5.31, 2.04, 5.12, 
+
+L2_zGEMV_o_H
+4.45, -2.27, 4.83, -0.8, 5.02, -0.29, 5.08, 0.08, 5.68, -0.72, 4.91, -0.46, 4.68, -0.86, 4.41, -0.99, 3.68, -0.41, 4.34, -1.25, 4.61, -1.19, 3.44, -0.77, 5.06, -0.62, 4.96, -0.82, 4.16, -0.22, 4.41, -0.03, 5.12, -0.36, 
+
+L2_sGBMV_A_mn
+0.0, 0.0, 0.3, 0.1, 0.0, 0.2, 0.1, 0.2, 0.9, 0.1, 0.3, 0.1, 0.9, 0.1, 0.3, 0.5, 0.6, 0.8, 0.3, 0.7, 0.6, 0.8, 0.9, 0.7, 0.6, 0.6, 0.3, 0.3, 0.6, 0.2, 0.8, 0.7, 0.2, 0.1, 0.8, 0.3, 0.5, 0.7, 0.4, 0.3, 
+
+L2_sGBMV_x_n1
+0.2, 0.8, 0.6, 0.9, 0.1, 0.2, 0.7, 0.5, 0.1, 0.2, 0.3, 0.8, 0.1, 0.5, 0.7, 0.2, 0.9, 
+
+L2_sGBMV_x_n2
+0.2, 0.0, 0.8, 0.0, 0.6, 0.0, 0.9, 0.0, 0.1, 0.0, 0.2, 0.0, 0.7, 0.0, 0.5, 0.0, 0.1, 0.0, 0.2, 0.0, 0.3, 0.0, 0.8, 0.0, 0.1, 0.0, 0.5, 0.0, 0.7, 0.0, 0.2, 0.0, 0.9, 0.0, 
+
+L2_sGBMV_y_m1
+0.9, 0.8, 0.3, 0.4, 0.7, 0.7, 0.2, 0.3, 0.9, 0.8, 
+
+L2_sGBMV_y_m2
+0.9, 0.0, 0.0, 0.8, 0.0, 0.0, 0.3, 0.0, 0.0, 0.4, 0.0, 0.0, 0.7, 0.0, 0.0, 0.7, 0.0, 0.0, 0.2, 0.0, 0.0, 0.3, 0.0, 0.0, 0.9, 0.0, 0.0, 0.8, 0.0, 0.0, 
+
+L2_sGBMV_o_N
+1.03999998182, 1.04000002205, 0.830000025481, 1.50000000522, 1.95000000969, 1.98999997884, 0.740000023544, 1.03000002399, 1.22999998227, 1.29000002131, 
+
+L2_sGBMV_o_N2
+1.03999998182, 0.0, 0.0, 1.04000002205, 0.0, 0.0, 0.830000025481, 0.0, 0.0, 1.50000000522, 0.0, 0.0, 1.95000000969, 0.0, 0.0, 1.98999997884, 0.0, 0.0, 0.740000023544, 0.0, 0.0, 1.03000002399, 0.0, 0.0, 1.22999998227, 0.0, 0.0, 1.29000002131, 0.0, 0.0, 
+
+L2_sGBMV_o_T
+0.900000014901, 1.36000001073, 1.31000004649, 2.0299999927, 1.1900000146, 1.61999997973, 1.48999997586, 1.29000002131, 1.58999999672, 0.790000016093, 0.540000025034, 0.800000011921, 0.10000000149, 0.5, 0.699999988079, 0.20000000298, 0.899999976158, 
+
+L2_sGBMV_o_H
+0.900000014901, 1.36000001073, 1.31000004649, 2.0299999927, 1.1900000146, 1.61999997973, 1.48999997586, 1.29000002131, 1.58999999672, 0.790000016093, 0.540000025034, 0.800000011921, 0.10000000149, 0.5, 0.699999988079, 0.20000000298, 0.899999976158, 
+
+L2_dGBMV_A_mn
+0.0, 0.0, 0.5, 0.8, 0.0, 0.9, 0.1, 0.5, 0.4, 0.1, 0.4, 0.1, 0.5, 0.9, 0.9, 0.4, 0.8, 0.7, 0.7, 0.9, 0.7, 0.3, 0.5, 0.9, 0.3, 0.4, 0.3, 0.2, 0.4, 0.8, 0.3, 0.4, 0.6, 0.8, 0.4, 0.7, 0.7, 0.5, 0.3, 0.9, 
+
+L2_dGBMV_x_n1
+0.9, 0.3, 0.1, 0.5, 0.5, 0.9, 0.5, 0.1, 0.7, 0.4, 0.4, 0.6, 0.8, 0.2, 0.1, 0.9, 0.9, 
+
+L2_dGBMV_x_n2
+0.9, 0.0, 0.3, 0.0, 0.1, 0.0, 0.5, 0.0, 0.5, 0.0, 0.9, 0.0, 0.5, 0.0, 0.1, 0.0, 0.7, 0.0, 0.4, 0.0, 0.4, 0.0, 0.6, 0.0, 0.8, 0.0, 0.2, 0.0, 0.1, 0.0, 0.9, 0.0, 0.9, 0.0, 
+
+L2_dGBMV_y_m1
+0.5, 0.1, 0.4, 0.4, 0.2, 0.5, 0.1, 0.3, 0.8, 0.7, 
+
+L2_dGBMV_y_m2
+0.5, 0.0, 0.0, 0.1, 0.0, 0.0, 0.4, 0.0, 0.0, 0.4, 0.0, 0.0, 0.2, 0.0, 0.0, 0.5, 0.0, 0.0, 0.1, 0.0, 0.0, 0.3, 0.0, 0.0, 0.8, 0.0, 0.0, 0.7, 0.0, 0.0, 
+
+L2_dGBMV_o_N
+1.19, 0.99, 0.88, 1.29, 1.79, 1.9, 0.78, 1.37, 1.74, 1.6, 
+
+L2_dGBMV_o_N2
+1.19, 0.0, 0.0, 0.99, 0.0, 0.0, 0.88, 0.0, 0.0, 1.29, 0.0, 0.0, 1.79, 0.0, 0.0, 1.9, 0.0, 0.0, 0.78, 0.0, 0.0, 1.37, 0.0, 0.0, 1.74, 0.0, 0.0, 1.6, 0.0, 0.0, 
+
+L2_dGBMV_o_T
+1.4, 0.95, 0.83, 1.39, 0.98, 1.49, 1.7, 1.34, 1.49, 1.17, 1.03, 0.6, 0.8, 0.2, 0.1, 0.9, 0.9, 
+
+L2_dGBMV_o_H
+1.4, 0.95, 0.83, 1.39, 0.98, 1.49, 1.7, 1.34, 1.49, 1.17, 1.03, 0.6, 0.8, 0.2, 0.1, 0.9, 0.9, 
+
+L2_cGBMV_A_mn
+0.0, 0.0, 0.0, 0.0, 0.699999988079, 0.5, 0.40000000596, 0.10000000149, 0.0, 0.0, 0.600000023842, 0.800000011921, 0.10000000149, 0.899999976158, 0.600000023842, 0.899999976158, 0.800000011921, 0.20000000298, 0.300000011921, 0.600000023842, 0.300000011921, 0.600000023842, 0.20000000298, 0.20000000298, 0.5, 0.300000011921, 0.5, 0.899999976158, 0.300000011921, 0.10000000149, 0.20000000298, 0.899999976158, 0.899999976158, 0.800000011921, 0.699999988079, 0.600000023842, 0.40000000596, 0.10000000149, 0.20000000298, 0.699999988079, 0.899999976158, 0.800000011921, 0.5, 0.899999976158, 0.10000000149, 0.699999988079, 0.899999976158, 0.40000000596, 0.10000000149, 0.20000000298, 0.5, 0.20000000298, 0.899999976158, 0.699999988079, 0.600000023842, 0.5, 0.600000023842, 0.800000011921, 0.10000000149, 0.5, 0.699999988079, 0.699999988079, 0.20000000298, 0.600000023842, 0.10000000149, 0.800000011921, 0.20000000298, 0.40000000596, 0.800000011921, 0.300000011921, 0.5, 0.20000000298, 0.5, 0.20000000298, 0.300000011921, 0.899999976158, 0.20000000298, 0.300000011921, 0.600000023842, 0.699999988079, 
+
+L2_cGBMV_x_n1
+0.5, 0.600000023842, 0.5, 0.20000000298, 0.300000011921, 0.40000000596, 0.5, 0.40000000596, 0.899999976158, 0.800000011921, 0.800000011921, 0.10000000149, 0.699999988079, 0.40000000596, 0.899999976158, 0.699999988079, 0.300000011921, 0.600000023842, 0.600000023842, 0.5, 0.600000023842, 0.5, 0.699999988079, 0.699999988079, 0.699999988079, 0.600000023842, 0.5, 0.40000000596, 0.600000023842, 0.5, 0.5, 0.699999988079, 0.20000000298, 0.40000000596, 
+
+L2_cGBMV_x_n2
+0.5, 0.600000023842, 0.0, 0.0, 0.5, 0.20000000298, 0.0, 0.0, 0.300000011921, 0.40000000596, 0.0, 0.0, 0.5, 0.40000000596, 0.0, 0.0, 0.899999976158, 0.800000011921, 0.0, 0.0, 0.800000011921, 0.10000000149, 0.0, 0.0, 0.699999988079, 0.40000000596, 0.0, 0.0, 0.899999976158, 0.699999988079, 0.0, 0.0, 0.300000011921, 0.600000023842, 0.0, 0.0, 0.600000023842, 0.5, 0.0, 0.0, 0.600000023842, 0.5, 0.0, 0.0, 0.699999988079, 0.699999988079, 0.0, 0.0, 0.699999988079, 0.600000023842, 0.0, 0.0, 0.5, 0.40000000596, 0.0, 0.0, 0.600000023842, 0.5, 0.0, 0.0, 0.5, 0.699999988079, 0.0, 0.0, 0.20000000298, 0.40000000596, 0.0, 0.0, 
+
+L2_cGBMV_y_m1
+0.5, 0.5, 0.10000000149, 0.40000000596, 0.20000000298, 0.5, 0.300000011921, 0.20000000298, 0.800000011921, 0.300000011921, 0.10000000149, 0.600000023842, 0.5, 0.20000000298, 0.10000000149, 0.600000023842, 0.600000023842, 0.20000000298, 0.40000000596, 0.699999988079, 
+
+L2_cGBMV_y_m2
+0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.10000000149, 0.40000000596, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.5, 0.0, 0.0, 0.0, 0.0, 0.300000011921, 0.20000000298, 0.0, 0.0, 0.0, 0.0, 0.800000011921, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 0.10000000149, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 0.5, 0.20000000298, 0.0, 0.0, 0.0, 0.0, 0.10000000149, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.20000000298, 0.0, 0.0, 0.0, 0.0, 0.40000000596, 0.699999988079, 0.0, 0.0, 0.0, 0.0, 
+
+L2_cGBMV_o_N
+0.729999984503, 1.30000001267, -0.389999991506, 2.1400000459, 0.379999994934, 1.92000006765, -0.149999970198, 2.05999998614, 1.22999998525, 2.47000004008, 0.439999946803, 3.77999998301, 1.34999998584, 2.38999998555, 0.209999986142, 3.11000001818, 0.510000021905, 2.24000003844, 0.240000029504, 2.68000003517, 
+
+L2_cGBMV_o_N2
+0.729999984503, 1.30000001267, 0.0, 0.0, 0.0, 0.0, -0.389999991506, 2.1400000459, 0.0, 0.0, 0.0, 0.0, 0.379999994934, 1.92000006765, 0.0, 0.0, 0.0, 0.0, -0.149999970198, 2.05999998614, 0.0, 0.0, 0.0, 0.0, 1.22999998525, 2.47000004008, 0.0, 0.0, 0.0, 0.0, 0.439999946803, 3.77999998301, 0.0, 0.0, 0.0, 0.0, 1.34999998584, 2.38999998555, 0.0, 0.0, 0.0, 0.0, 0.209999986142, 3.11000001818, 0.0, 0.0, 0.0, 0.0, 0.510000021905, 2.24000003844, 0.0, 0.0, 0.0, 0.0, 0.240000029504, 2.68000003517, 0.0, 0.0, 0.0, 0.0, 
+
+L2_cGBMV_o_T
+0.399999991059, 1.96000004053, 0.150000000745, 1.04000002801, 0.209999997318, 2.28000005826, 0.499999963492, 1.94000005409, 0.589999982566, 1.82000003859, 0.129999978542, 1.49000004068, 0.469999949187, 2.1200000371, 0.849999984354, 2.27000001475, -0.129999959171, 1.69000005335, 0.730000032187, 0.980000014305, 0.350000053644, 1.20000000894, 0.699999988079, 0.699999988079, 0.699999988079, 0.600000023842, 0.5, 0.40000000596, 0.600000023842, 0.5, 0.5, 0.699999988079, 0.20000000298, 0.40000000596, 
+
+L2_cGBMV_o_H
+1.74000001311, 1.22000003338, 1.69000002429, 0.340000001192, 2.37000003487, 0.0400000019372, 2.06000004873, 0.679999991208, 2.16999999836, 0.740000025779, 2.43000006199, -0.129999964386, 2.1500000082, 0.279999992698, 2.33000001058, 0.989999984056, 1.97000004977, 0.490000026524, 1.23000004411, 0.499999988079, 1.33000002027, 0.640000010133, 0.699999988079, 0.699999988079, 0.699999988079, 0.600000023842, 0.5, 0.40000000596, 0.600000023842, 0.5, 0.5, 0.699999988079, 0.20000000298, 0.40000000596, 
+
+L2_zGBMV_A_mn
+0.0, 0.0, 0.0, 0.0, 0.3, 0.6, 0.4, 0.4, 0.0, 0.0, 0.1, 0.3, 0.5, 0.1, 0.1, 0.8, 0.7, 0.7, 0.1, 0.2, 0.4, 0.6, 0.1, 0.1, 0.9, 0.3, 0.7, 0.6, 0.8, 0.1, 0.2, 0.7, 0.7, 0.2, 0.2, 0.1, 0.6, 0.4, 0.6, 0.6, 0.5, 0.5, 0.4, 0.6, 0.3, 0.2, 0.5, 0.8, 0.5, 0.5, 0.5, 0.4, 0.9, 0.1, 0.2, 0.1, 0.7, 0.8, 0.1, 0.4, 0.7, 0.8, 0.5, 0.6, 0.3, 0.9, 0.2, 0.8, 0.9, 0.1, 0.6, 0.3, 0.4, 0.8, 0.5, 0.5, 0.1, 0.5, 0.5, 0.3, 
+
+L2_zGBMV_x_n1
+0.1, 0.4, 0.6, 0.8, 0.7, 0.7, 0.6, 0.2, 0.2, 0.4, 0.1, 0.8, 0.7, 0.8, 0.7, 0.4, 0.5, 0.9, 0.1, 0.1, 0.5, 0.3, 0.9, 0.6, 0.4, 0.6, 0.7, 0.5, 0.3, 0.5, 0.9, 0.4, 0.9, 0.6, 
+
+L2_zGBMV_x_n2
+0.1, 0.4, 0.0, 0.0, 0.6, 0.8, 0.0, 0.0, 0.7, 0.7, 0.0, 0.0, 0.6, 0.2, 0.0, 0.0, 0.2, 0.4, 0.0, 0.0, 0.1, 0.8, 0.0, 0.0, 0.7, 0.8, 0.0, 0.0, 0.7, 0.4, 0.0, 0.0, 0.5, 0.9, 0.0, 0.0, 0.1, 0.1, 0.0, 0.0, 0.5, 0.3, 0.0, 0.0, 0.9, 0.6, 0.0, 0.0, 0.4, 0.6, 0.0, 0.0, 0.7, 0.5, 0.0, 0.0, 0.3, 0.5, 0.0, 0.0, 0.9, 0.4, 0.0, 0.0, 0.9, 0.6, 0.0, 0.0, 
+
+L2_zGBMV_y_m1
+0.5, 0.7, 0.7, 0.2, 0.5, 0.6, 0.8, 0.9, 0.3, 0.8, 0.1, 0.7, 0.8, 0.6, 0.7, 0.6, 0.7, 0.1, 0.1, 0.3, 
+
+L2_zGBMV_y_m2
+0.5, 0.7, 0.0, 0.0, 0.0, 0.0, 0.7, 0.2, 0.0, 0.0, 0.0, 0.0, 0.5, 0.6, 0.0, 0.0, 0.0, 0.0, 0.8, 0.9, 0.0, 0.0, 0.0, 0.0, 0.3, 0.8, 0.0, 0.0, 0.0, 0.0, 0.1, 0.7, 0.0, 0.0, 0.0, 0.0, 0.8, 0.6, 0.0, 0.0, 0.0, 0.0, 0.7, 0.6, 0.0, 0.0, 0.0, 0.0, 0.7, 0.1, 0.0, 0.0, 0.0, 0.0, 0.1, 0.3, 0.0, 0.0, 0.0, 0.0, 
+
+L2_zGBMV_o_N
+0.21, 1.44, 0.32, 1.36, 0.09, 1.93, 1.39, 3.15, 0.29, 2.39, -0.28, 2.6, 1.08, 2.28, -0.24, 3.19, 0.4, 2.56, -0.02, 2.08, 
+
+L2_zGBMV_o_N2
+0.21, 1.44, 0.0, 0.0, 0.0, 0.0, 0.32, 1.36, 0.0, 0.0, 0.0, 0.0, 0.09, 1.93, 0.0, 0.0, 0.0, 0.0, 1.39, 3.15, 0.0, 0.0, 0.0, 0.0, 0.29, 2.39, 0.0, 0.0, 0.0, 0.0, -0.28, 2.6, 0.0, 0.0, 0.0, 0.0, 1.08, 2.28, 0.0, 0.0, 0.0, 0.0, -0.24, 3.19, 0.0, 0.0, 0.0, 0.0, 0.4, 2.56, 0.0, 0.0, 0.0, 0.0, -0.02, 2.08, 0.0, 0.0, 0.0, 0.0, 
+
+L2_zGBMV_o_T
+-0.23, 1.91, 1.23, 2.66, 0.52, 3.55, 0.82, 1.7, -0.69, 2.78, -0.14, 3.29, 0.8, 2.85, 0.67, 2.36, 1.01, 1.98, 0.35, 0.45, 0.46, 0.48, 0.9, 0.6, 0.4, 0.6, 0.7, 0.5, 0.3, 0.5, 0.9, 0.4, 0.9, 0.6, 
+
+L2_zGBMV_o_H
+1.57, 0.19, 2.61, 1.44, 2.96, 0.75, 1.98, 1.28, 2.65, 0.5, 2.54, 1.13, 2.7, 0.71, 2.39, -0.2, 2.05, 0.9, 0.71, -0.07, 0.64, 0.42, 0.9, 0.6, 0.4, 0.6, 0.7, 0.5, 0.3, 0.5, 0.9, 0.4, 0.9, 0.6, 
+
+L2_cHEMV_A_nn
+0.800000011921, 0.0, 0.5, 0.800000011921, 0.699999988079, 0.800000011921, 0.300000011921, 0.20000000298, 0.10000000149, 0.800000011921, 0.600000023842, 0.5, 0.40000000596, 0.300000011921, 0.899999976158, 0.20000000298, 0.5, 0.5, 0.699999988079, 0.10000000149, 0.300000011921, 0.600000023842, 0.899999976158, 0.300000011921, 0.10000000149, 0.800000011921, 0.10000000149, 0.20000000298, 0.699999988079, 0.40000000596, 0.10000000149, 0.10000000149, 0.10000000149, 0.40000000596, 0.5, -0.800000011921, 0.899999976158, 0.0, 0.20000000298, 0.600000023842, 0.699999988079, 0.40000000596, 0.600000023842, 0.10000000149, 0.20000000298, 0.40000000596, 0.699999988079, 0.10000000149, 0.20000000298, 0.300000011921, 0.5, 0.300000011921, 0.40000000596, 0.40000000596, 0.800000011921, 0.800000011921, 0.10000000149, 0.899999976158, 0.40000000596, 0.5, 0.40000000596, 0.800000011921, 0.899999976158, 0.300000011921, 0.699999988079, 0.699999988079, 0.10000000149, 0.40000000596, 0.699999988079, -0.800000011921, 0.20000000298, -0.600000023842, 0.5, 0.0, 0.10000000149, 0.300000011921, 0.800000011921, 0.899999976158, 0.699999988079, 0.699999988079, 0.5, 0.5, 0.40000000596, 0.20000000298, 0.800000011921, 0.699999988079, 0.300000011921, 0.699999988079, 0.5, 0.5, 0.20000000298, 0.800000011921, 0.899999976158, 0.899999976158, 0.10000000149, 0.40000000596, 0.20000000298, 0.300000011921, 0.40000000596, 0.5, 0.300000011921, 0.300000011921, 0.300000011921, -0.20000000298, 0.699999988079, -0.40000000596, 0.10000000149, -0.300000011921, 0.899999976158, 0.0, 0.899999976158, 0.699999988079, 0.600000023842, 0.10000000149, 0.600000023842, 0.800000011921, 0.10000000149, 0.800000011921, 0.10000000149, 0.300000011921, 0.600000023842, 0.40000000596, 0.10000000149, 0.10000000149, 0.20000000298, 0.699999988079, 0.5, 0.5, 0.20000000298, 0.699999988079, 0.899999976158, 0.800000011921, 0.20000000298, 0.10000000149, 0.699999988079, 0.899999976158, 0.10000000149, -0.800000011921, 0.600000023842, -0.10000000149, 0.800000011921, -0.899999976158, 0.899999976158, -0.699999988079, 0.40000000596, 0.0, 0.5, 0.300000011921, 0.20000000298, 0.600000023842, 0.5, 0.899999976158, 0.10000000149, 0.800000011921, 0.800000011921, 0.600000023842, 0.800000011921, 0.800000011921, 0.899999976158, 0.20000000298, 0.800000011921, 0.40000000596, 0.40000000596, 0.899999976158, 0.600000023842, 0.699999988079, 0.5, 0.300000011921, 0.40000000596, 0.600000023842, 0.600000023842, -0.5, 0.20000000298, -0.40000000596, 0.699999988079, -0.699999988079, 0.600000023842, -0.10000000149, 0.5, -0.300000011921, 0.300000011921, 0.0, 0.800000011921, 0.899999976158, 0.600000023842, 0.5, 0.300000011921, 0.600000023842, 0.5, 0.800000011921, 0.800000011921, 0.10000000149, 0.40000000596, 0.699999988079, 0.40000000596, 0.600000023842, 0.300000011921, 0.800000011921, 0.20000000298, 0.600000023842, 0.300000011921, 0.600000023842, 0.699999988079, 0.20000000298, 0.40000000596, -0.300000011921, 0.699999988079, -0.10000000149, 0.5, -0.5, 0.600000023842, -0.800000011921, 0.20000000298, -0.600000023842, 0.800000011921, -0.899999976158, 0.699999988079, 0.0, 0.300000011921, 0.20000000298, 0.5, 0.40000000596, 0.699999988079, 0.600000023842, 0.5, 0.20000000298, 0.20000000298, 0.300000011921, 0.800000011921, 0.899999976158, 0.300000011921, 0.699999988079, 0.300000011921, 0.899999976158, 0.20000000298, 0.40000000596, 0.800000011921, 0.600000023842, 0.899999976158, -0.20000000298, 0.20000000298, -0.300000011921, 0.40000000596, -0.20000000298, 0.10000000149, -0.800000011921, 0.5, -0.899999976158, 0.600000023842, -0.5, 0.300000011921, -0.20000000298, 0.899999976158, 0.0, 0.600000023842, 0.699999988079, 0.40000000596, 0.10000000149, 0.300000011921, 0.699999988079, 0.600000023842, 0.20000000298, 0.5, 0.600000023842, 0.5, 0.40000000596, 0.10000000149, 0.10000000149, 0.5, 0.5, 0.600000023842, 0.300000011921, 0.5, -0.5, 0.5, -0.300000011921, 0.800000011921, -0.699999988079, 0.10000000149, -0.300000011921, 0.10000000149, -0.800000011921, 0.300000011921, -0.600000023842, 0.5, -0.40000000596, 0.600000023842, -0.699999988079, 0.600000023842, 0.0, 0.800000011921, 0.20000000298, 0.300000011921, 0.5, 0.10000000149, 0.10000000149, 0.40000000596, 0.800000011921, 0.899999976158, 0.10000000149, 0.800000011921, 0.800000011921, 0.600000023842, 0.699999988079, 0.699999988079, 0.699999988079, 0.699999988079, -0.10000000149, 0.40000000596, -0.40000000596, 0.300000011921, -0.699999988079, 0.600000023842, -0.40000000596, 0.800000011921, -0.600000023842, 0.5, -0.800000011921, 0.699999988079, -0.600000023842, 0.40000000596, -0.10000000149, 0.800000011921, -0.20000000298, 0.300000011921, 0.0, 0.600000023842, 0.300000011921, 0.699999988079, 0.699999988079, 0.800000011921, 0.899999976158, 0.899999976158, 0.10000000149, 0.300000011921, 0.40000000596, 0.10000000149, 0.699999988079, 0.40000000596, 0.5, 0.300000011921, -0.600000023842, 0.800000011921, -0.800000011921, 0.5, -0.5, 0.10000000149, -0.10000000149, 0.800000011921, -0.800000011921, 0.800000011921, -0.10000000149, 0.5, -0.20000000298, 0.300000011921, -0.699999988079, 0.300000011921, -0.5, 0.600000023842, -0.300000011921, 0.20000000298, 0.0, 0.20000000298, 0.300000011921, 0.300000011921, 0.5, 0.699999988079, 0.699999988079, 0.699999988079, 0.40000000596, 0.40000000596, 0.600000023842, 0.10000000149, 0.300000011921, 0.899999976158, -0.300000011921, 0.10000000149, -0.899999976158, 0.20000000298, -0.800000011921, 0.20000000298, -0.699999988079, 0.899999976158, -0.20000000298, 0.40000000596, -0.699999988079, 0.20000000298, -0.300000011921, 0.600000023842, -0.20000000298, 0.10000000149, -0.10000000149, 0.699999988079, -0.699999988079, 0.20000000298, -0.300000011921, 0.800000011921, 0.0, 0.600000023842, 0.20000000298, 0.800000011921, 0.20000000298, 0.300000011921, 0.300000011921, 0.899999976158, 0.20000000298, 0.699999988079, 0.10000000149, 0.10000000149, -0.800000011921, 0.40000000596, -0.5, 0.899999976158, -0.899999976158, 0.5, -0.5, 0.800000011921, -0.40000000596, 0.40000000596, -0.600000023842, 0.800000011921, -0.899999976158, 0.5, -0.600000023842, 0.40000000596, -0.800000011921, 0.800000011921, -0.899999976158, 0.300000011921, -0.5, 0.600000023842, -0.20000000298, 0.300000011921, 0.0, 0.899999976158, 0.10000000149, 0.5, 0.20000000298, 0.800000011921, 0.300000011921, 0.699999988079, 0.5, 0.10000000149, -0.20000000298, 0.40000000596, -0.800000011921, 0.10000000149, -0.40000000596, 0.20000000298, -0.699999988079, 0.40000000596, -0.899999976158, 0.300000011921, -0.800000011921, 0.300000011921, -0.699999988079, 0.5, -0.40000000596, 0.899999976158, -0.10000000149, 0.899999976158, -0.10000000149, 0.699999988079, -0.699999988079, 0.800000011921, -0.20000000298, 0.899999976158, -0.10000000149, 0.800000011921, 0.0, 0.40000000596, 0.10000000149, 0.20000000298, 0.300000011921, 0.20000000298, 0.300000011921, 0.699999988079, -0.40000000596, 0.899999976158, -0.300000011921, 0.20000000298, -0.300000011921, 0.899999976158, -0.800000011921, 0.600000023842, -0.699999988079, 0.20000000298, -0.600000023842, 0.300000011921, -0.899999976158, 0.10000000149, -0.10000000149, 0.800000011921, -0.800000011921, 0.300000011921, -0.40000000596, 0.699999988079, -0.40000000596, 0.300000011921, -0.300000011921, 0.5, -0.20000000298, 0.40000000596, -0.10000000149, 0.600000023842, 0.0, 0.699999988079, 0.899999976158, 0.899999976158, 0.300000011921, 0.10000000149, -0.10000000149, 0.699999988079, -0.699999988079, 0.40000000596, -0.5, 0.20000000298, -0.10000000149, 0.5, -0.300000011921, 0.300000011921, -0.600000023842, 0.20000000298, -0.40000000596, 0.5, -0.5, 0.600000023842, -0.699999988079, 0.10000000149, -0.699999988079, 0.40000000596, -0.600000023842, 0.899999976158, -0.20000000298, 0.800000011921, -0.300000011921, 0.20000000298, -0.300000011921, 0.699999988079, -0.899999976158, 0.899999976158, 0.0, 0.300000011921, 0.40000000596, 0.10000000149, -0.40000000596, 0.10000000149, -0.40000000596, 0.300000011921, -0.300000011921, 0.699999988079, -0.899999976158, 0.40000000596, -0.600000023842, 0.699999988079, -0.20000000298, 0.800000011921, -0.600000023842, 0.600000023842, -0.300000011921, 0.699999988079, -0.699999988079, 0.40000000596, -0.5, 0.10000000149, -0.300000011921, 0.699999988079, -0.10000000149, 0.699999988079, -0.5, 0.20000000298, -0.300000011921, 0.899999976158, -0.300000011921, 0.300000011921, -0.40000000596, 0.5, 0.0, 
+
+L2_cHEMV_A_nn_pu
+0.800000011921, 0.0, 0.5, 0.800000011921, 0.699999988079, 0.800000011921, 0.300000011921, 0.20000000298, 0.10000000149, 0.800000011921, 0.600000023842, 0.5, 0.40000000596, 0.300000011921, 0.899999976158, 0.20000000298, 0.5, 0.5, 0.699999988079, 0.10000000149, 0.300000011921, 0.600000023842, 0.899999976158, 0.300000011921, 0.10000000149, 0.800000011921, 0.10000000149, 0.20000000298, 0.699999988079, 0.40000000596, 0.10000000149, 0.10000000149, 0.10000000149, 0.40000000596, 0.899999976158, 0.0, 0.20000000298, 0.600000023842, 0.699999988079, 0.40000000596, 0.600000023842, 0.10000000149, 0.20000000298, 0.40000000596, 0.699999988079, 0.10000000149, 0.20000000298, 0.300000011921, 0.5, 0.300000011921, 0.40000000596, 0.40000000596, 0.800000011921, 0.800000011921, 0.10000000149, 0.899999976158, 0.40000000596, 0.5, 0.40000000596, 0.800000011921, 0.899999976158, 0.300000011921, 0.699999988079, 0.699999988079, 0.10000000149, 0.40000000596, 0.5, 0.0, 0.10000000149, 0.300000011921, 0.800000011921, 0.899999976158, 0.699999988079, 0.699999988079, 0.5, 0.5, 0.40000000596, 0.20000000298, 0.800000011921, 0.699999988079, 0.300000011921, 0.699999988079, 0.5, 0.5, 0.20000000298, 0.800000011921, 0.899999976158, 0.899999976158, 0.10000000149, 0.40000000596, 0.20000000298, 0.300000011921, 0.40000000596, 0.5, 0.300000011921, 0.300000011921, 0.899999976158, 0.0, 0.899999976158, 0.699999988079, 0.600000023842, 0.10000000149, 0.600000023842, 0.800000011921, 0.10000000149, 0.800000011921, 0.10000000149, 0.300000011921, 0.600000023842, 0.40000000596, 0.10000000149, 0.10000000149, 0.20000000298, 0.699999988079, 0.5, 0.5, 0.20000000298, 0.699999988079, 0.899999976158, 0.800000011921, 0.20000000298, 0.10000000149, 0.699999988079, 0.899999976158, 0.40000000596, 0.0, 0.5, 0.300000011921, 0.20000000298, 0.600000023842, 0.5, 0.899999976158, 0.10000000149, 0.800000011921, 0.800000011921, 0.600000023842, 0.800000011921, 0.800000011921, 0.899999976158, 0.20000000298, 0.800000011921, 0.40000000596, 0.40000000596, 0.899999976158, 0.600000023842, 0.699999988079, 0.5, 0.300000011921, 0.40000000596, 0.600000023842, 0.300000011921, 0.0, 0.800000011921, 0.899999976158, 0.600000023842, 0.5, 0.300000011921, 0.600000023842, 0.5, 0.800000011921, 0.800000011921, 0.10000000149, 0.40000000596, 0.699999988079, 0.40000000596, 0.600000023842, 0.300000011921, 0.800000011921, 0.20000000298, 0.600000023842, 0.300000011921, 0.600000023842, 0.699999988079, 0.20000000298, 0.699999988079, 0.0, 0.300000011921, 0.20000000298, 0.5, 0.40000000596, 0.699999988079, 0.600000023842, 0.5, 0.20000000298, 0.20000000298, 0.300000011921, 0.800000011921, 0.899999976158, 0.300000011921, 0.699999988079, 0.300000011921, 0.899999976158, 0.20000000298, 0.40000000596, 0.800000011921, 0.600000023842, 0.899999976158, 0.0, 0.600000023842, 0.699999988079, 0.40000000596, 0.10000000149, 0.300000011921, 0.699999988079, 0.600000023842, 0.20000000298, 0.5, 0.600000023842, 0.5, 0.40000000596, 0.10000000149, 0.10000000149, 0.5, 0.5, 0.600000023842, 0.300000011921, 0.600000023842, 0.0, 0.800000011921, 0.20000000298, 0.300000011921, 0.5, 0.10000000149, 0.10000000149, 0.40000000596, 0.800000011921, 0.899999976158, 0.10000000149, 0.800000011921, 0.800000011921, 0.600000023842, 0.699999988079, 0.699999988079, 0.699999988079, 0.300000011921, 0.0, 0.600000023842, 0.300000011921, 0.699999988079, 0.699999988079, 0.800000011921, 0.899999976158, 0.899999976158, 0.10000000149, 0.300000011921, 0.40000000596, 0.10000000149, 0.699999988079, 0.40000000596, 0.5, 0.20000000298, 0.0, 0.20000000298, 0.300000011921, 0.300000011921, 0.5, 0.699999988079, 0.699999988079, 0.699999988079, 0.40000000596, 0.40000000596, 0.600000023842, 0.10000000149, 0.300000011921, 0.800000011921, 0.0, 0.600000023842, 0.20000000298, 0.800000011921, 0.20000000298, 0.300000011921, 0.300000011921, 0.899999976158, 0.20000000298, 0.699999988079, 0.10000000149, 0.300000011921, 0.0, 0.899999976158, 0.10000000149, 0.5, 0.20000000298, 0.800000011921, 0.300000011921, 0.699999988079, 0.5, 0.800000011921, 0.0, 0.40000000596, 0.10000000149, 0.20000000298, 0.300000011921, 0.20000000298, 0.300000011921, 0.600000023842, 0.0, 0.699999988079, 0.899999976158, 0.899999976158, 0.300000011921, 0.899999976158, 0.0, 0.300000011921, 0.40000000596, 0.5, 0.0, 
+
+L2_cHEMV_x_n1
+0.10000000149, 0.40000000596, 0.300000011921, 0.300000011921, 0.300000011921, 0.899999976158, 0.600000023842, 0.800000011921, 0.300000011921, 0.10000000149, 0.300000011921, 0.10000000149, 0.899999976158, 0.5, 0.300000011921, 0.5, 0.899999976158, 0.40000000596, 0.40000000596, 0.40000000596, 0.899999976158, 0.899999976158, 0.800000011921, 0.5, 0.20000000298, 0.300000011921, 0.5, 0.10000000149, 0.10000000149, 0.20000000298, 0.300000011921, 0.5, 0.5, 0.600000023842, 
+
+L2_cHEMV_x_n2
+0.10000000149, 0.40000000596, 0.0, 0.0, 0.300000011921, 0.300000011921, 0.0, 0.0, 0.300000011921, 0.899999976158, 0.0, 0.0, 0.600000023842, 0.800000011921, 0.0, 0.0, 0.300000011921, 0.10000000149, 0.0, 0.0, 0.300000011921, 0.10000000149, 0.0, 0.0, 0.899999976158, 0.5, 0.0, 0.0, 0.300000011921, 0.5, 0.0, 0.0, 0.899999976158, 0.40000000596, 0.0, 0.0, 0.40000000596, 0.40000000596, 0.0, 0.0, 0.899999976158, 0.899999976158, 0.0, 0.0, 0.800000011921, 0.5, 0.0, 0.0, 0.20000000298, 0.300000011921, 0.0, 0.0, 0.5, 0.10000000149, 0.0, 0.0, 0.10000000149, 0.20000000298, 0.0, 0.0, 0.300000011921, 0.5, 0.0, 0.0, 0.5, 0.600000023842, 0.0, 0.0, 
+
+L2_cHEMV_y_n1
+0.40000000596, 0.40000000596, 0.800000011921, 0.20000000298, 0.800000011921, 0.899999976158, 0.800000011921, 0.5, 0.899999976158, 0.5, 0.40000000596, 0.20000000298, 0.20000000298, 0.699999988079, 0.600000023842, 0.800000011921, 0.20000000298, 0.300000011921, 0.899999976158, 0.40000000596, 0.300000011921, 0.699999988079, 0.800000011921, 0.600000023842, 0.300000011921, 0.300000011921, 0.40000000596, 0.600000023842, 0.800000011921, 0.40000000596, 0.5, 0.20000000298, 0.40000000596, 0.40000000596, 
+
+L2_cHEMV_y_n2
+0.40000000596, 0.40000000596, 0.0, 0.0, 0.0, 0.0, 0.800000011921, 0.20000000298, 0.0, 0.0, 0.0, 0.0, 0.800000011921, 0.899999976158, 0.0, 0.0, 0.0, 0.0, 0.800000011921, 0.5, 0.0, 0.0, 0.0, 0.0, 0.899999976158, 0.5, 0.0, 0.0, 0.0, 0.0, 0.40000000596, 0.20000000298, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.699999988079, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.800000011921, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 0.899999976158, 0.40000000596, 0.0, 0.0, 0.0, 0.0, 0.300000011921, 0.699999988079, 0.0, 0.0, 0.0, 0.0, 0.800000011921, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 0.300000011921, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 0.40000000596, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 0.800000011921, 0.40000000596, 0.0, 0.0, 0.0, 0.0, 0.5, 0.20000000298, 0.0, 0.0, 0.0, 0.0, 0.40000000596, 0.40000000596, 0.0, 0.0, 0.0, 0.0, 
+
+L2_cHEMV_o_N
+0.739999967664, 7.07000008181, 1.44999999404, 7.30000005662, 1.67000003487, 7.67999999344, 1.81000004649, 6.5400000377, 3.78999994904, 7.950000038, 2.99000002354, 7.19000005409, 3.60000000298, 5.52000003189, 3.57000014737, 5.01000000477, 3.89000004664, 3.95000003204, 5.54000002056, 4.05000003651, 4.24000006527, 2.67000003338, 6.51000007257, 2.03000002325, 8.07000004455, 1.22000005722, 6.97999996439, 1.13000004038, 7.23000007689, 1.47000000134, 6.52000005201, 0.600000000745, 7.33000007316, 0.609999997318, 
+
+L2_cHEMV_o_N2
+0.739999967664, 7.07000008181, 0.0, 0.0, 0.0, 0.0, 1.44999999404, 7.30000005662, 0.0, 0.0, 0.0, 0.0, 1.67000003487, 7.67999999344, 0.0, 0.0, 0.0, 0.0, 1.81000004649, 6.5400000377, 0.0, 0.0, 0.0, 0.0, 3.78999994904, 7.950000038, 0.0, 0.0, 0.0, 0.0, 2.99000002354, 7.19000005409, 0.0, 0.0, 0.0, 0.0, 3.60000000298, 5.52000003189, 0.0, 0.0, 0.0, 0.0, 3.57000014737, 5.01000000477, 0.0, 0.0, 0.0, 0.0, 3.89000004664, 3.95000003204, 0.0, 0.0, 0.0, 0.0, 5.54000002056, 4.05000003651, 0.0, 0.0, 0.0, 0.0, 4.24000006527, 2.67000003338, 0.0, 0.0, 0.0, 0.0, 6.51000007257, 2.03000002325, 0.0, 0.0, 0.0, 0.0, 8.07000004455, 1.22000005722, 0.0, 0.0, 0.0, 0.0, 6.97999996439, 1.13000004038, 0.0, 0.0, 0.0, 0.0, 7.23000007689, 1.47000000134, 0.0, 0.0, 0.0, 0.0, 6.52000005201, 0.600000000745, 0.0, 0.0, 0.0, 0.0, 7.33000007316, 0.609999997318, 0.0, 0.0, 0.0, 0.0, 
+
+L2_zHEMV_A_nn
+0.3, 0.0, 0.6, 0.2, 0.8, 0.4, 0.7, 0.7, 0.1, 0.3, 0.9, 0.5, 0.5, 0.3, 0.3, 0.9, 0.1, 0.7, 0.9, 0.8, 0.4, 0.8, 0.6, 0.1, 0.3, 0.8, 0.7, 0.9, 0.8, 0.6, 0.1, 0.1, 0.8, 0.1, 0.6, -0.2, 0.7, 0.0, 0.9, 0.1, 0.3, 0.7, 0.6, 0.2, 0.5, 0.3, 0.8, 0.8, 0.1, 0.2, 0.8, 0.2, 0.4, 0.9, 0.9, 0.5, 0.1, 0.4, 0.5, 0.3, 0.1, 0.3, 0.8, 0.3, 0.2, 0.1, 0.1, 0.2, 0.8, -0.4, 0.9, -0.1, 0.9, 0.0, 0.8, 0.6, 0.3, 0.2, 0.9, 0.8, 0.5, 0.4, 0.6, 0.7, 0.5, 0.6, 0.2, 0.8, 0.9, 0.8, 0.5, 0.9, 0.1, 0.5, 0.6, 0.2, 0.9, 0.6, 0.3, 0.6, 0.9, 0.8, 0.7, -0.7, 0.3, -0.7, 0.8, -0.6, 0.3, 0.0, 0.4, 0.2, 0.2, 0.5, 0.4, 0.1, 0.5, 0.5, 0.9, 0.6, 0.6, 0.8, 0.7, 0.4, 0.8, 0.1, 0.7, 0.8, 0.7, 0.3, 0.4, 0.7, 0.6, 0.1, 0.7, 0.5, 0.1, -0.3, 0.6, -0.2, 0.3, -0.2, 0.4, -0.2, 0.4, 0.0, 0.2, 0.9, 0.6, 0.2, 0.8, 0.1, 0.2, 0.8, 0.4, 0.2, 0.6, 0.8, 0.1, 0.6, 0.3, 0.6, 0.9, 0.3, 0.6, 0.2, 0.9, 0.9, 0.6, 0.3, 0.9, -0.5, 0.5, -0.3, 0.9, -0.8, 0.2, -0.5, 0.2, -0.9, 0.5, 0.0, 0.4, 0.1, 0.6, 0.8, 0.1, 0.2, 0.4, 0.6, 0.2, 0.7, 0.7, 0.7, 0.9, 0.9, 0.6, 0.7, 0.2, 0.5, 0.4, 0.5, 0.4, 0.1, 0.5, -0.3, 0.8, -0.8, 0.5, -0.4, 0.4, -0.1, 0.6, -0.2, 0.4, -0.1, 0.9, 0.0, 0.8, 0.1, 0.8, 0.1, 0.5, 0.2, 0.6, 0.9, 0.9, 0.4, 0.9, 0.4, 0.9, 0.4, 0.4, 0.9, 0.1, 0.1, 0.1, 0.2, 0.3, -0.9, 0.1, -0.2, 0.6, -0.7, 0.5, -0.5, 0.8, -0.1, 0.6, -0.8, 0.8, -0.1, 0.5, 0.0, 0.4, 0.9, 0.9, 0.4, 0.7, 0.1, 0.5, 0.3, 0.9, 0.9, 0.7, 0.5, 0.6, 0.1, 0.5, 0.1, 0.5, 0.3, 0.1, -0.7, 0.8, -0.2, 0.5, -0.6, 0.9, -0.6, 0.2, -0.8, 0.1, -0.2, 0.8, -0.1, 0.4, -0.9, 0.9, 0.0, 0.4, 0.5, 0.3, 0.8, 0.1, 0.9, 0.5, 0.8, 0.1, 0.7, 0.6, 0.3, 0.2, 0.8, 0.8, 0.1, 0.9, -0.8, 0.4, -0.9, 0.2, -0.8, 0.6, -0.8, 0.4, -0.2, 0.4, -0.6, 0.5, -0.2, 0.9, -0.4, 0.4, -0.5, 0.9, 0.0, 0.3, 0.9, 0.7, 0.2, 0.2, 0.2, 0.1, 0.9, 0.3, 0.9, 0.7, 0.5, 0.8, 0.8, 0.4, -0.8, 0.9, -0.5, 0.9, -0.8, 0.7, -0.4, 0.6, -0.8, 0.2, -0.7, 0.6, -0.9, 0.7, -0.1, 0.3, -0.8, 0.3, -0.9, 0.3, 0.0, 0.7, 0.2, 0.5, 0.2, 0.8, 0.9, 0.2, 0.6, 0.8, 0.6, 0.8, 0.8, 0.6, -0.1, 0.1, -0.4, 0.5, -0.9, 0.8, -0.1, 0.1, -0.6, 0.7, -0.7, 0.9, -0.4, 0.5, -0.3, 0.1, -0.9, 0.7, -0.2, 0.7, -0.2, 0.8, 0.0, 0.9, 0.4, 0.2, 0.9, 0.7, 0.8, 0.4, 0.9, 0.9, 0.1, 0.3, -0.8, 0.5, -0.3, 0.1, -0.5, 0.7, -0.8, 0.3, -0.6, 0.9, -0.9, 0.9, -0.4, 0.9, -0.9, 0.5, -0.8, 0.2, -0.2, 0.5, -0.2, 0.9, -0.4, 0.8, 0.0, 0.8, 0.3, 0.6, 0.8, 0.4, 0.5, 0.6, 0.1, 0.7, -0.9, 0.1, -0.3, 0.6, -0.2, 0.7, -0.3, 0.9, -0.3, 0.6, -0.7, 0.9, -0.4, 0.7, -0.5, 0.1, -0.7, 0.1, -0.9, 0.8, -0.9, 0.2, -0.9, 0.8, -0.3, 0.1, 0.0, 0.1, 0.7, 0.1, 0.1, 0.8, 0.2, 0.8, -0.6, 0.8, -0.3, 0.9, -0.6, 0.4, -0.7, 0.6, -0.2, 0.2, -0.5, 0.4, -0.9, 0.6, -0.1, 0.6, -0.3, 0.3, -0.9, 0.2, -0.6, 0.7, -0.8, 0.6, -0.8, 0.1, -0.7, 0.8, 0.0, 0.9, 0.6, 0.1, 0.4, 0.1, -0.1, 0.2, -0.1, 0.3, -0.6, 0.6, -0.1, 0.9, -0.9, 0.4, -0.5, 0.1, -0.1, 0.5, -0.1, 0.2, -0.8, 0.7, -0.5, 0.8, -0.6, 0.4, -0.9, 0.4, -0.5, 0.1, -0.1, 0.9, -0.6, 0.5, 0.0, 0.4, 0.7, 0.8, -0.1, 0.1, -0.2, 0.9, -0.8, 0.7, -0.5, 0.6, -0.3, 0.4, -0.1, 0.1, -0.2, 0.5, -0.3, 0.8, -0.1, 0.8, -0.8, 0.8, -0.8, 0.9, -0.1, 0.6, -0.1, 0.8, -0.2, 0.1, -0.4, 0.4, -0.7, 0.1, 0.0, 
+
+L2_zHEMV_A_nn_pu
+0.3, 0.0, 0.6, 0.2, 0.8, 0.4, 0.7, 0.7, 0.1, 0.3, 0.9, 0.5, 0.5, 0.3, 0.3, 0.9, 0.1, 0.7, 0.9, 0.8, 0.4, 0.8, 0.6, 0.1, 0.3, 0.8, 0.7, 0.9, 0.8, 0.6, 0.1, 0.1, 0.8, 0.1, 0.7, 0.0, 0.9, 0.1, 0.3, 0.7, 0.6, 0.2, 0.5, 0.3, 0.8, 0.8, 0.1, 0.2, 0.8, 0.2, 0.4, 0.9, 0.9, 0.5, 0.1, 0.4, 0.5, 0.3, 0.1, 0.3, 0.8, 0.3, 0.2, 0.1, 0.1, 0.2, 0.9, 0.0, 0.8, 0.6, 0.3, 0.2, 0.9, 0.8, 0.5, 0.4, 0.6, 0.7, 0.5, 0.6, 0.2, 0.8, 0.9, 0.8, 0.5, 0.9, 0.1, 0.5, 0.6, 0.2, 0.9, 0.6, 0.3, 0.6, 0.9, 0.8, 0.3, 0.0, 0.4, 0.2, 0.2, 0.5, 0.4, 0.1, 0.5, 0.5, 0.9, 0.6, 0.6, 0.8, 0.7, 0.4, 0.8, 0.1, 0.7, 0.8, 0.7, 0.3, 0.4, 0.7, 0.6, 0.1, 0.7, 0.5, 0.4, 0.0, 0.2, 0.9, 0.6, 0.2, 0.8, 0.1, 0.2, 0.8, 0.4, 0.2, 0.6, 0.8, 0.1, 0.6, 0.3, 0.6, 0.9, 0.3, 0.6, 0.2, 0.9, 0.9, 0.6, 0.3, 0.5, 0.0, 0.4, 0.1, 0.6, 0.8, 0.1, 0.2, 0.4, 0.6, 0.2, 0.7, 0.7, 0.7, 0.9, 0.9, 0.6, 0.7, 0.2, 0.5, 0.4, 0.5, 0.4, 0.1, 0.9, 0.0, 0.8, 0.1, 0.8, 0.1, 0.5, 0.2, 0.6, 0.9, 0.9, 0.4, 0.9, 0.4, 0.9, 0.4, 0.4, 0.9, 0.1, 0.1, 0.1, 0.2, 0.5, 0.0, 0.4, 0.9, 0.9, 0.4, 0.7, 0.1, 0.5, 0.3, 0.9, 0.9, 0.7, 0.5, 0.6, 0.1, 0.5, 0.1, 0.5, 0.3, 0.9, 0.0, 0.4, 0.5, 0.3, 0.8, 0.1, 0.9, 0.5, 0.8, 0.1, 0.7, 0.6, 0.3, 0.2, 0.8, 0.8, 0.1, 0.9, 0.0, 0.3, 0.9, 0.7, 0.2, 0.2, 0.2, 0.1, 0.9, 0.3, 0.9, 0.7, 0.5, 0.8, 0.8, 0.3, 0.0, 0.7, 0.2, 0.5, 0.2, 0.8, 0.9, 0.2, 0.6, 0.8, 0.6, 0.8, 0.8, 0.8, 0.0, 0.9, 0.4, 0.2, 0.9, 0.7, 0.8, 0.4, 0.9, 0.9, 0.1, 0.8, 0.0, 0.8, 0.3, 0.6, 0.8, 0.4, 0.5, 0.6, 0.1, 0.1, 0.0, 0.1, 0.7, 0.1, 0.1, 0.8, 0.2, 0.8, 0.0, 0.9, 0.6, 0.1, 0.4, 0.5, 0.0, 0.4, 0.7, 0.1, 0.0, 
+
+L2_zHEMV_x_n1
+0.3, 0.3, 0.8, 0.2, 0.2, 0.6, 0.6, 0.1, 0.4, 0.2, 0.1, 0.1, 0.7, 0.2, 0.5, 0.5, 0.2, 0.8, 0.3, 0.9, 0.2, 0.8, 0.8, 0.5, 0.2, 0.4, 0.6, 0.9, 0.1, 0.2, 0.2, 0.9, 0.5, 0.8, 
+
+L2_zHEMV_x_n2
+0.3, 0.3, 0.0, 0.0, 0.8, 0.2, 0.0, 0.0, 0.2, 0.6, 0.0, 0.0, 0.6, 0.1, 0.0, 0.0, 0.4, 0.2, 0.0, 0.0, 0.1, 0.1, 0.0, 0.0, 0.7, 0.2, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.2, 0.8, 0.0, 0.0, 0.3, 0.9, 0.0, 0.0, 0.2, 0.8, 0.0, 0.0, 0.8, 0.5, 0.0, 0.0, 0.2, 0.4, 0.0, 0.0, 0.6, 0.9, 0.0, 0.0, 0.1, 0.2, 0.0, 0.0, 0.2, 0.9, 0.0, 0.0, 0.5, 0.8, 0.0, 0.0, 
+
+L2_zHEMV_y_n1
+0.5, 0.1, 0.5, 0.4, 0.7, 0.7, 0.6, 0.1, 0.7, 0.4, 0.2, 0.2, 0.1, 0.4, 0.6, 0.5, 0.2, 0.7, 0.9, 0.4, 0.8, 0.6, 0.4, 0.5, 0.5, 0.4, 0.6, 0.9, 0.6, 0.9, 0.9, 0.2, 0.6, 0.1, 
+
+L2_zHEMV_y_n2
+0.5, 0.1, 0.0, 0.0, 0.0, 0.0, 0.5, 0.4, 0.0, 0.0, 0.0, 0.0, 0.7, 0.7, 0.0, 0.0, 0.0, 0.0, 0.6, 0.1, 0.0, 0.0, 0.0, 0.0, 0.7, 0.4, 0.0, 0.0, 0.0, 0.0, 0.2, 0.2, 0.0, 0.0, 0.0, 0.0, 0.1, 0.4, 0.0, 0.0, 0.0, 0.0, 0.6, 0.5, 0.0, 0.0, 0.0, 0.0, 0.2, 0.7, 0.0, 0.0, 0.0, 0.0, 0.9, 0.4, 0.0, 0.0, 0.0, 0.0, 0.8, 0.6, 0.0, 0.0, 0.0, 0.0, 0.4, 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.4, 0.0, 0.0, 0.0, 0.0, 0.6, 0.9, 0.0, 0.0, 0.0, 0.0, 0.6, 0.9, 0.0, 0.0, 0.0, 0.0, 0.9, 0.2, 0.0, 0.0, 0.0, 0.0, 0.6, 0.1, 0.0, 0.0, 0.0, 0.0, 
+
+L2_zHEMV_o_N
+-0.25, 7.31, 0.7, 6.42, 0.46, 8.58, 1.87, 6.38, 0.74, 6.16, 0.73, 5.15, 2.89, 5.43, 2.71, 5.71, 1.43, 4.43, 3.27, 4.15, 5.68, 4.32, 4.26, 4.35, 6.42, 2.64, 7.06, 1.77, 7.05, 1.92, 6.08, 1.99, 7.42, 3.38, 
+
+L2_zHEMV_o_N2
+-0.25, 7.31, 0.0, 0.0, 0.0, 0.0, 0.7, 6.42, 0.0, 0.0, 0.0, 0.0, 0.46, 8.58, 0.0, 0.0, 0.0, 0.0, 1.87, 6.38, 0.0, 0.0, 0.0, 0.0, 0.74, 6.16, 0.0, 0.0, 0.0, 0.0, 0.73, 5.15, 0.0, 0.0, 0.0, 0.0, 2.89, 5.43, 0.0, 0.0, 0.0, 0.0, 2.71, 5.71, 0.0, 0.0, 0.0, 0.0, 1.43, 4.43, 0.0, 0.0, 0.0, 0.0, 3.27, 4.15, 0.0, 0.0, 0.0, 0.0, 5.68, 4.32, 0.0, 0.0, 0.0, 0.0, 4.26, 4.35, 0.0, 0.0, 0.0, 0.0, 6.42, 2.64, 0.0, 0.0, 0.0, 0.0, 7.06, 1.77, 0.0, 0.0, 0.0, 0.0, 7.05, 1.92, 0.0, 0.0, 0.0, 0.0, 6.08, 1.99, 0.0, 0.0, 0.0, 0.0, 7.42, 3.38, 0.0, 0.0, 0.0, 0.0, 
+
+L2_cHBMV_A_nn
+0.5, 0.0, 0.800000011921, 0.300000011921, 0.40000000596, 0.5, 0.699999988079, 0.0, 0.699999988079, 0.699999988079, 0.699999988079, 0.899999976158, 0.5, 0.0, 0.699999988079, 0.5, 0.800000011921, 0.40000000596, 0.800000011921, 0.0, 0.899999976158, 0.20000000298, 0.699999988079, 0.600000023842, 0.5, 0.0, 0.800000011921, 0.899999976158, 0.300000011921, 0.10000000149, 0.10000000149, 0.0, 0.300000011921, 0.899999976158, 0.899999976158, 0.300000011921, 0.10000000149, 0.0, 0.300000011921, 0.10000000149, 0.10000000149, 0.20000000298, 0.5, 0.0, 0.10000000149, 0.899999976158, 0.40000000596, 0.899999976158, 0.300000011921, 0.0, 0.40000000596, 0.699999988079, 0.300000011921, 0.5, 0.800000011921, 0.0, 0.800000011921, 0.800000011921, 0.899999976158, 0.40000000596, 0.800000011921, 0.0, 0.40000000596, 0.40000000596, 0.40000000596, 0.699999988079, 0.800000011921, 0.0, 0.699999988079, 0.600000023842, 0.10000000149, 0.600000023842, 0.300000011921, 0.0, 0.5, 0.699999988079, 0.40000000596, 0.300000011921, 0.40000000596, 0.0, 0.5, 0.699999988079, 0.300000011921, 0.10000000149, 0.20000000298, 0.0, 0.10000000149, 0.899999976158, 0.899999976158, 0.20000000298, 0.600000023842, 0.0, 0.10000000149, 0.899999976158, 0.0, 0.0, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 0.0, 
+
+L2_cHBMV_x_n1
+0.5, 0.300000011921, 0.800000011921, 0.300000011921, 0.20000000298, 0.600000023842, 0.899999976158, 0.699999988079, 0.300000011921, 0.699999988079, 0.699999988079, 0.5, 0.600000023842, 0.699999988079, 0.600000023842, 0.699999988079, 0.40000000596, 0.800000011921, 0.5, 0.300000011921, 0.40000000596, 0.600000023842, 0.899999976158, 0.10000000149, 0.5, 0.699999988079, 0.40000000596, 0.5, 0.10000000149, 0.600000023842, 0.800000011921, 0.40000000596, 0.699999988079, 0.20000000298, 
+
+L2_cHBMV_x_n2
+0.5, 0.300000011921, 0.0, 0.0, 0.800000011921, 0.300000011921, 0.0, 0.0, 0.20000000298, 0.600000023842, 0.0, 0.0, 0.899999976158, 0.699999988079, 0.0, 0.0, 0.300000011921, 0.699999988079, 0.0, 0.0, 0.699999988079, 0.5, 0.0, 0.0, 0.600000023842, 0.699999988079, 0.0, 0.0, 0.600000023842, 0.699999988079, 0.0, 0.0, 0.40000000596, 0.800000011921, 0.0, 0.0, 0.5, 0.300000011921, 0.0, 0.0, 0.40000000596, 0.600000023842, 0.0, 0.0, 0.899999976158, 0.10000000149, 0.0, 0.0, 0.5, 0.699999988079, 0.0, 0.0, 0.40000000596, 0.5, 0.0, 0.0, 0.10000000149, 0.600000023842, 0.0, 0.0, 0.800000011921, 0.40000000596, 0.0, 0.0, 0.699999988079, 0.20000000298, 0.0, 0.0, 
+
+L2_cHBMV_y_n1
+0.10000000149, 0.899999976158, 0.40000000596, 0.20000000298, 0.699999988079, 0.899999976158, 0.10000000149, 0.800000011921, 0.600000023842, 0.10000000149, 0.20000000298, 0.800000011921, 0.699999988079, 0.800000011921, 0.40000000596, 0.10000000149, 0.699999988079, 0.699999988079, 0.300000011921, 0.300000011921, 0.800000011921, 0.699999988079, 0.600000023842, 0.300000011921, 0.800000011921, 0.699999988079, 0.600000023842, 0.600000023842, 0.600000023842, 0.300000011921, 0.699999988079, 0.40000000596, 0.40000000596, 0.40000000596, 
+
+L2_cHBMV_y_n2
+0.10000000149, 0.899999976158, 0.0, 0.0, 0.0, 0.0, 0.40000000596, 0.20000000298, 0.0, 0.0, 0.0, 0.0, 0.699999988079, 0.899999976158, 0.0, 0.0, 0.0, 0.0, 0.10000000149, 0.800000011921, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.10000000149, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.800000011921, 0.0, 0.0, 0.0, 0.0, 0.699999988079, 0.800000011921, 0.0, 0.0, 0.0, 0.0, 0.40000000596, 0.10000000149, 0.0, 0.0, 0.0, 0.0, 0.699999988079, 0.699999988079, 0.0, 0.0, 0.0, 0.0, 0.300000011921, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 0.800000011921, 0.699999988079, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 0.800000011921, 0.699999988079, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 0.699999988079, 0.40000000596, 0.0, 0.0, 0.0, 0.0, 0.40000000596, 0.40000000596, 0.0, 0.0, 0.0, 0.0, 
+
+L2_cHBMV_o_N
+0.680000003874, 1.87000002295, 1.17000000805, 2.35999996454, 2.15999999434, 2.33999997735, 2.40999998242, 2.63000001132, 2.32000002965, 2.59999998063, 2.07000001475, 2.64999998286, 1.57000000209, 1.00000006109, 0.980000019521, 1.84999997318, 1.51999996632, 1.27000000507, 2.89999994636, 1.57000005797, 2.31000006735, 2.09000002205, 1.96000000179, 1.61000003234, 1.93000000387, 1.20000001341, 1.48000001729, 0.84000004068, 1.89000000715, 1.60000000298, 1.79000003099, 1.37000000134, 1.47000001922, 0.36000002861, 
+
+L2_cHBMV_o_N2
+0.680000003874, 1.87000002295, 0.0, 0.0, 0.0, 0.0, 1.17000000805, 2.35999996454, 0.0, 0.0, 0.0, 0.0, 2.15999999434, 2.33999997735, 0.0, 0.0, 0.0, 0.0, 2.40999998242, 2.63000001132, 0.0, 0.0, 0.0, 0.0, 2.32000002965, 2.59999998063, 0.0, 0.0, 0.0, 0.0, 2.07000001475, 2.64999998286, 0.0, 0.0, 0.0, 0.0, 1.57000000209, 1.00000006109, 0.0, 0.0, 0.0, 0.0, 0.980000019521, 1.84999997318, 0.0, 0.0, 0.0, 0.0, 1.51999996632, 1.27000000507, 0.0, 0.0, 0.0, 0.0, 2.89999994636, 1.57000005797, 0.0, 0.0, 0.0, 0.0, 2.31000006735, 2.09000002205, 0.0, 0.0, 0.0, 0.0, 1.96000000179, 1.61000003234, 0.0, 0.0, 0.0, 0.0, 1.93000000387, 1.20000001341, 0.0, 0.0, 0.0, 0.0, 1.48000001729, 0.84000004068, 0.0, 0.0, 0.0, 0.0, 1.89000000715, 1.60000000298, 0.0, 0.0, 0.0, 0.0, 1.79000003099, 1.37000000134, 0.0, 0.0, 0.0, 0.0, 1.47000001922, 0.36000002861, 0.0, 0.0, 0.0, 0.0, 
+
+L2_zHBMV_A_nn
+0.3, 0.0, 0.6, 0.6, 0.5, 0.6, 0.4, 0.0, 0.3, 0.2, 0.7, 0.7, 0.1, 0.0, 0.9, 0.8, 0.8, 0.2, 0.7, 0.0, 0.8, 0.4, 0.3, 0.5, 0.6, 0.0, 0.8, 0.6, 0.3, 0.1, 0.4, 0.0, 0.3, 0.6, 0.3, 0.8, 0.2, 0.0, 0.4, 0.4, 0.8, 0.1, 0.5, 0.0, 0.3, 0.4, 0.8, 0.6, 0.8, 0.0, 0.8, 0.3, 0.2, 0.6, 0.7, 0.0, 0.5, 0.1, 0.9, 0.5, 0.5, 0.0, 0.5, 0.7, 0.5, 0.9, 0.2, 0.0, 0.9, 0.2, 0.8, 0.6, 0.4, 0.0, 0.2, 0.2, 0.1, 0.4, 0.4, 0.0, 0.9, 0.8, 0.7, 0.1, 0.7, 0.0, 0.4, 0.3, 0.7, 0.2, 0.9, 0.0, 0.1, 0.8, 0.0, 0.0, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 
+
+L2_zHBMV_x_n1
+0.4, 0.2, 0.2, 0.8, 0.6, 0.4, 0.7, 0.8, 0.5, 0.8, 0.4, 0.3, 0.8, 0.2, 0.5, 0.3, 0.2, 0.6, 0.6, 0.5, 0.3, 0.6, 0.8, 0.1, 0.6, 0.8, 0.2, 0.9, 0.2, 0.5, 0.3, 0.3, 0.2, 0.7, 
+
+L2_zHBMV_x_n2
+0.4, 0.2, 0.0, 0.0, 0.2, 0.8, 0.0, 0.0, 0.6, 0.4, 0.0, 0.0, 0.7, 0.8, 0.0, 0.0, 0.5, 0.8, 0.0, 0.0, 0.4, 0.3, 0.0, 0.0, 0.8, 0.2, 0.0, 0.0, 0.5, 0.3, 0.0, 0.0, 0.2, 0.6, 0.0, 0.0, 0.6, 0.5, 0.0, 0.0, 0.3, 0.6, 0.0, 0.0, 0.8, 0.1, 0.0, 0.0, 0.6, 0.8, 0.0, 0.0, 0.2, 0.9, 0.0, 0.0, 0.2, 0.5, 0.0, 0.0, 0.3, 0.3, 0.0, 0.0, 0.2, 0.7, 0.0, 0.0, 
+
+L2_zHBMV_y_n1
+0.2, 0.5, 0.2, 0.4, 0.2, 0.6, 0.7, 0.4, 0.5, 0.9, 0.4, 0.3, 0.6, 0.2, 0.5, 0.3, 0.6, 0.9, 0.9, 0.1, 0.3, 0.3, 0.9, 0.4, 0.5, 0.1, 0.9, 0.5, 0.6, 0.3, 0.5, 0.8, 0.5, 0.2, 
+
+L2_zHBMV_y_n2
+0.2, 0.5, 0.0, 0.0, 0.0, 0.0, 0.2, 0.4, 0.0, 0.0, 0.0, 0.0, 0.2, 0.6, 0.0, 0.0, 0.0, 0.0, 0.7, 0.4, 0.0, 0.0, 0.0, 0.0, 0.5, 0.9, 0.0, 0.0, 0.0, 0.0, 0.4, 0.3, 0.0, 0.0, 0.0, 0.0, 0.6, 0.2, 0.0, 0.0, 0.0, 0.0, 0.5, 0.3, 0.0, 0.0, 0.0, 0.0, 0.6, 0.9, 0.0, 0.0, 0.0, 0.0, 0.9, 0.1, 0.0, 0.0, 0.0, 0.0, 0.3, 0.3, 0.0, 0.0, 0.0, 0.0, 0.9, 0.4, 0.0, 0.0, 0.0, 0.0, 0.5, 0.1, 0.0, 0.0, 0.0, 0.0, 0.9, 0.5, 0.0, 0.0, 0.0, 0.0, 0.6, 0.3, 0.0, 0.0, 0.0, 0.0, 0.5, 0.8, 0.0, 0.0, 0.0, 0.0, 0.5, 0.2, 0.0, 0.0, 0.0, 0.0, 
+
+L2_zHBMV_o_N
+0.02, 1.72, 0.67, 1.89, 1.03, 2.72, 2.8, 2.39, 2.6, 2.56, 2.08, 1.68, 1.47, 1.1, 1.51, 1.0, 1.72, 2.23, 3.0, 1.63, 1.11, 2.34, 2.42, 2.34, 1.85, 0.73, 1.92, 1.35, 2.05, 1.88, 0.69, 2.05, 1.07, 0.51, 
+
+L2_zHBMV_o_N2
+0.02, 1.72, 0.0, 0.0, 0.0, 0.0, 0.67, 1.89, 0.0, 0.0, 0.0, 0.0, 1.03, 2.72, 0.0, 0.0, 0.0, 0.0, 2.8, 2.39, 0.0, 0.0, 0.0, 0.0, 2.6, 2.56, 0.0, 0.0, 0.0, 0.0, 2.08, 1.68, 0.0, 0.0, 0.0, 0.0, 1.47, 1.1, 0.0, 0.0, 0.0, 0.0, 1.51, 1.0, 0.0, 0.0, 0.0, 0.0, 1.72, 2.23, 0.0, 0.0, 0.0, 0.0, 3.0, 1.63, 0.0, 0.0, 0.0, 0.0, 1.11, 2.34, 0.0, 0.0, 0.0, 0.0, 2.42, 2.34, 0.0, 0.0, 0.0, 0.0, 1.85, 0.73, 0.0, 0.0, 0.0, 0.0, 1.92, 1.35, 0.0, 0.0, 0.0, 0.0, 2.05, 1.88, 0.0, 0.0, 0.0, 0.0, 0.69, 2.05, 0.0, 0.0, 0.0, 0.0, 1.07, 0.51, 0.0, 0.0, 0.0, 0.0, 
+
+L2_sSYMV_A_nn
+0.3, 0.7, 0.4, 0.5, 0.5, 0.5, 0.9, 0.7, 0.6, 0.5, 0.6, 0.4, 0.3, 0.2, 0.2, 0.3, 0.3, 0.7, 0.9, 0.5, 0.4, 0.6, 0.1, 0.8, 0.6, 0.1, 0.7, 0.5, 0.6, 0.3, 0.9, 0.9, 0.2, 0.5, 0.4, 0.5, 0.4, 0.3, 0.2, 0.3, 0.9, 0.9, 0.4, 0.4, 0.2, 0.4, 0.5, 0.1, 0.2, 0.2, 0.4, 0.5, 0.4, 0.3, 0.7, 0.5, 0.4, 0.2, 0.6, 0.7, 0.6, 0.8, 0.2, 0.3, 0.5, 0.8, 0.3, 0.1, 0.5, 0.6, 0.2, 0.5, 0.4, 0.9, 0.2, 0.8, 0.2, 0.2, 0.2, 0.7, 0.8, 0.5, 0.6, 0.5, 0.4, 0.5, 0.1, 0.3, 0.4, 0.9, 0.7, 0.9, 0.3, 0.2, 0.1, 0.4, 0.9, 0.3, 0.3, 0.4, 0.9, 0.9, 0.9, 0.8, 0.9, 0.2, 0.2, 0.9, 0.8, 0.1, 0.9, 0.8, 0.5, 0.1, 0.4, 0.4, 0.5, 0.3, 0.3, 0.7, 0.6, 0.9, 0.6, 0.8, 0.3, 0.1, 0.3, 0.7, 0.4, 0.2, 0.7, 0.4, 0.4, 0.9, 0.4, 0.5, 0.6, 0.1, 0.4, 0.7, 0.2, 0.2, 0.9, 0.7, 0.8, 0.4, 0.7, 0.2, 0.4, 0.5, 0.4, 0.9, 0.6, 0.5, 0.7, 0.4, 0.6, 0.2, 0.1, 0.8, 0.4, 0.4, 0.2, 0.4, 0.1, 0.6, 0.4, 0.2, 0.4, 0.2, 0.6, 0.5, 0.2, 0.8, 0.2, 0.4, 0.5, 0.2, 0.7, 0.4, 0.7, 0.7, 0.1, 0.8, 0.6, 0.8, 0.9, 0.4, 0.6, 0.4, 0.2, 0.7, 0.9, 0.1, 0.7, 0.2, 0.1, 0.7, 0.1, 0.8, 0.3, 0.6, 0.4, 0.5, 0.3, 0.3, 0.5, 0.3, 0.8, 0.3, 0.4, 0.4, 0.4, 0.6, 0.1, 0.8, 0.8, 0.8, 0.2, 0.8, 0.5, 0.2, 0.9, 0.1, 0.5, 0.5, 0.3, 0.4, 0.4, 0.5, 0.4, 0.8, 0.3, 0.8, 0.5, 0.3, 0.2, 0.1, 0.2, 0.9, 0.2, 0.8, 0.6, 0.4, 0.5, 0.9, 0.4, 0.2, 0.6, 0.6, 0.2, 0.3, 0.8, 0.1, 0.1, 0.3, 0.2, 0.2, 0.3, 0.5, 0.9, 0.3, 0.4, 0.9, 0.4, 0.8, 0.4, 0.8, 0.2, 0.1, 0.4, 0.5, 0.3, 0.5, 0.4, 0.1, 0.4, 0.9, 0.3, 0.5, 0.6, 0.2, 0.9, 0.5, 0.5, 0.1, 0.1, 0.5, 0.9, 
+
+L2_sSYMV_A_nn_pu
+0.3, 0.7, 0.4, 0.5, 0.5, 0.5, 0.9, 0.7, 0.6, 0.5, 0.6, 0.4, 0.3, 0.2, 0.2, 0.3, 0.3, 0.9, 0.5, 0.4, 0.6, 0.1, 0.8, 0.6, 0.1, 0.7, 0.5, 0.6, 0.3, 0.9, 0.9, 0.2, 0.5, 0.4, 0.3, 0.2, 0.3, 0.9, 0.9, 0.4, 0.4, 0.2, 0.4, 0.5, 0.1, 0.2, 0.2, 0.4, 0.7, 0.5, 0.4, 0.2, 0.6, 0.7, 0.6, 0.8, 0.2, 0.3, 0.5, 0.8, 0.3, 0.1, 0.4, 0.9, 0.2, 0.8, 0.2, 0.2, 0.2, 0.7, 0.8, 0.5, 0.6, 0.5, 0.4, 0.7, 0.9, 0.3, 0.2, 0.1, 0.4, 0.9, 0.3, 0.3, 0.4, 0.9, 0.9, 0.8, 0.1, 0.9, 0.8, 0.5, 0.1, 0.4, 0.4, 0.5, 0.3, 0.3, 0.3, 0.7, 0.4, 0.2, 0.7, 0.4, 0.4, 0.9, 0.4, 0.5, 0.8, 0.4, 0.7, 0.2, 0.4, 0.5, 0.4, 0.9, 0.6, 0.2, 0.4, 0.1, 0.6, 0.4, 0.2, 0.4, 0.2, 0.7, 0.7, 0.1, 0.8, 0.6, 0.8, 0.9, 0.1, 0.8, 0.3, 0.6, 0.4, 0.5, 0.8, 0.8, 0.2, 0.8, 0.5, 0.5, 0.3, 0.2, 0.1, 0.8, 0.1, 0.1, 0.4, 0.5, 0.9, 
+
+L2_sSYMV_x_n1
+0.7, 0.3, 0.5, 0.3, 0.6, 0.4, 0.6, 0.2, 0.5, 0.9, 0.5, 0.4, 0.9, 0.6, 0.1, 0.4, 0.1, 
+
+L2_sSYMV_x_n2
+0.7, 0.0, 0.3, 0.0, 0.5, 0.0, 0.3, 0.0, 0.6, 0.0, 0.4, 0.0, 0.6, 0.0, 0.2, 0.0, 0.5, 0.0, 0.9, 0.0, 0.5, 0.0, 0.4, 0.0, 0.9, 0.0, 0.6, 0.0, 0.1, 0.0, 0.4, 0.0, 0.1, 0.0, 
+
+L2_sSYMV_y_n1
+0.6, 0.1, 0.2, 0.7, 0.9, 0.8, 0.6, 0.9, 0.2, 0.6, 0.3, 0.7, 0.5, 0.8, 0.9, 0.3, 0.2, 
+
+L2_sSYMV_y_n2
+0.6, 0.0, 0.0, 0.1, 0.0, 0.0, 0.2, 0.0, 0.0, 0.7, 0.0, 0.0, 0.9, 0.0, 0.0, 0.8, 0.0, 0.0, 0.6, 0.0, 0.0, 0.9, 0.0, 0.0, 0.2, 0.0, 0.0, 0.6, 0.0, 0.0, 0.3, 0.0, 0.0, 0.7, 0.0, 0.0, 0.5, 0.0, 0.0, 0.8, 0.0, 0.0, 0.9, 0.0, 0.0, 0.3, 0.0, 0.0, 0.2, 0.0, 0.0, 
+
+L2_sSYMV_o_N
+4.32000009969, 4.43000005677, 3.35000003725, 4.38000006348, 4.54000002354, 4.56000005022, 5.22000002891, 4.91000001967, 4.25000004396, 3.86000010759, 4.21000008672, 4.15000002682, 4.76000011653, 4.42000007212, 4.06000007927, 4.11000005171, 3.61000003755, 
+
+L2_sSYMV_o_N2
+4.32000009969, 0.0, 0.0, 4.43000005677, 0.0, 0.0, 3.35000003725, 0.0, 0.0, 4.38000006348, 0.0, 0.0, 4.54000002354, 0.0, 0.0, 4.56000005022, 0.0, 0.0, 5.22000002891, 0.0, 0.0, 4.91000001967, 0.0, 0.0, 4.25000004396, 0.0, 0.0, 3.86000010759, 0.0, 0.0, 4.21000008672, 0.0, 0.0, 4.15000002682, 0.0, 0.0, 4.76000011653, 0.0, 0.0, 4.42000007212, 0.0, 0.0, 4.06000007927, 0.0, 0.0, 4.11000005171, 0.0, 0.0, 3.61000003755, 0.0, 0.0, 
+
+L2_dSYMV_A_nn
+0.9, 0.4, 0.9, 0.1, 0.5, 0.2, 0.9, 0.3, 0.5, 0.8, 0.7, 0.7, 0.2, 0.5, 0.4, 0.3, 0.1, 0.4, 0.7, 0.8, 0.8, 0.7, 0.4, 0.2, 0.9, 0.1, 0.3, 0.5, 0.6, 0.8, 0.3, 0.5, 0.5, 0.2, 0.9, 0.8, 0.6, 0.6, 0.8, 0.2, 0.3, 0.6, 0.3, 0.1, 0.8, 0.4, 0.5, 0.5, 0.2, 0.3, 0.8, 0.1, 0.8, 0.6, 0.1, 0.3, 0.7, 0.7, 0.6, 0.5, 0.9, 0.8, 0.8, 0.2, 0.8, 0.6, 0.4, 0.9, 0.5, 0.7, 0.8, 0.3, 0.4, 0.3, 0.7, 0.7, 0.8, 0.6, 0.4, 0.4, 0.8, 0.3, 0.2, 0.3, 0.9, 0.2, 0.4, 0.2, 0.7, 0.3, 0.7, 0.3, 0.7, 0.4, 0.5, 0.1, 0.5, 0.9, 0.9, 0.9, 0.9, 0.3, 0.9, 0.2, 0.3, 0.7, 0.7, 0.3, 0.6, 0.3, 0.9, 0.4, 0.1, 0.4, 0.5, 0.8, 0.4, 0.9, 0.3, 0.3, 0.9, 0.6, 0.6, 0.7, 0.7, 0.3, 0.5, 0.5, 0.3, 0.4, 0.7, 0.2, 0.3, 0.2, 0.6, 0.7, 0.5, 0.1, 0.3, 0.5, 0.8, 0.4, 0.9, 0.5, 0.5, 0.8, 0.3, 0.4, 0.3, 0.6, 0.3, 0.7, 0.4, 0.8, 0.3, 0.1, 0.9, 0.6, 0.5, 0.4, 0.3, 0.8, 0.8, 0.3, 0.6, 0.4, 0.1, 0.4, 0.7, 0.1, 0.7, 0.5, 0.8, 0.8, 0.4, 0.1, 0.1, 0.4, 0.3, 0.3, 0.3, 0.7, 0.5, 0.4, 0.8, 0.7, 0.1, 0.7, 0.6, 0.4, 0.8, 0.4, 0.5, 0.4, 0.7, 0.4, 0.6, 0.7, 0.4, 0.2, 0.2, 0.2, 0.6, 0.2, 0.2, 0.8, 0.5, 0.2, 0.8, 0.9, 0.5, 0.2, 0.3, 0.4, 0.5, 0.2, 0.4, 0.2, 0.5, 0.4, 0.7, 0.5, 0.3, 0.5, 0.8, 0.3, 0.9, 0.8, 0.3, 0.6, 0.1, 0.4, 0.2, 0.2, 0.8, 0.7, 0.8, 0.9, 0.4, 0.5, 0.2, 0.6, 0.2, 0.9, 0.4, 0.2, 0.3, 0.4, 0.8, 0.2, 0.5, 0.7, 0.5, 0.7, 0.5, 0.3, 0.5, 0.3, 0.4, 0.3, 0.9, 0.9, 0.6, 0.7, 0.7, 0.7, 0.6, 0.4, 0.8, 0.7, 0.7, 0.3, 0.1, 0.2, 0.8, 0.9, 0.9, 0.3, 0.3, 0.7, 0.4, 0.1, 0.1, 0.2, 0.7, 0.9, 0.5, 0.3, 0.8, 
+
+L2_dSYMV_A_nn_pu
+0.9, 0.4, 0.9, 0.1, 0.5, 0.2, 0.9, 0.3, 0.5, 0.8, 0.7, 0.7, 0.2, 0.5, 0.4, 0.3, 0.1, 0.7, 0.8, 0.8, 0.7, 0.4, 0.2, 0.9, 0.1, 0.3, 0.5, 0.6, 0.8, 0.3, 0.5, 0.5, 0.2, 0.6, 0.6, 0.8, 0.2, 0.3, 0.6, 0.3, 0.1, 0.8, 0.4, 0.5, 0.5, 0.2, 0.3, 0.8, 0.1, 0.3, 0.7, 0.7, 0.6, 0.5, 0.9, 0.8, 0.8, 0.2, 0.8, 0.6, 0.4, 0.9, 0.4, 0.3, 0.7, 0.7, 0.8, 0.6, 0.4, 0.4, 0.8, 0.3, 0.2, 0.3, 0.9, 0.7, 0.3, 0.7, 0.4, 0.5, 0.1, 0.5, 0.9, 0.9, 0.9, 0.9, 0.3, 0.6, 0.3, 0.9, 0.4, 0.1, 0.4, 0.5, 0.8, 0.4, 0.9, 0.3, 0.5, 0.5, 0.3, 0.4, 0.7, 0.2, 0.3, 0.2, 0.6, 0.7, 0.5, 0.8, 0.3, 0.4, 0.3, 0.6, 0.3, 0.7, 0.4, 0.8, 0.3, 0.6, 0.4, 0.1, 0.4, 0.7, 0.1, 0.3, 0.7, 0.5, 0.4, 0.8, 0.7, 0.1, 0.4, 0.2, 0.2, 0.2, 0.6, 0.2, 0.4, 0.2, 0.5, 0.4, 0.7, 0.8, 0.7, 0.8, 0.9, 0.5, 0.7, 0.5, 0.7, 0.3, 0.8, 
+
+L2_dSYMV_x_n1
+0.1, 0.4, 0.9, 0.2, 0.8, 0.7, 0.7, 0.8, 0.2, 0.4, 0.1, 0.6, 0.6, 0.6, 0.7, 0.2, 0.3, 
+
+L2_dSYMV_x_n2
+0.1, 0.0, 0.4, 0.0, 0.9, 0.0, 0.2, 0.0, 0.8, 0.0, 0.7, 0.0, 0.7, 0.0, 0.8, 0.0, 0.2, 0.0, 0.4, 0.0, 0.1, 0.0, 0.6, 0.0, 0.6, 0.0, 0.6, 0.0, 0.7, 0.0, 0.2, 0.0, 0.3, 0.0, 
+
+L2_dSYMV_y_n1
+0.7, 0.2, 0.2, 0.7, 0.9, 0.5, 0.5, 0.7, 0.3, 0.9, 0.2, 0.7, 0.3, 0.4, 0.5, 0.9, 0.8, 
+
+L2_dSYMV_y_n2
+0.7, 0.0, 0.0, 0.2, 0.0, 0.0, 0.2, 0.0, 0.0, 0.7, 0.0, 0.0, 0.9, 0.0, 0.0, 0.5, 0.0, 0.0, 0.5, 0.0, 0.0, 0.7, 0.0, 0.0, 0.3, 0.0, 0.0, 0.9, 0.0, 0.0, 0.2, 0.0, 0.0, 0.7, 0.0, 0.0, 0.3, 0.0, 0.0, 0.4, 0.0, 0.0, 0.5, 0.0, 0.0, 0.9, 0.0, 0.0, 0.8, 0.0, 0.0, 
+
+L2_dSYMV_o_N
+4.89, 4.82, 4.2, 5.68, 5.4, 5.07, 4.43, 4.86, 4.41, 4.34, 4.03, 4.23, 4.3, 4.69, 4.05, 5.75, 5.35, 
+
+L2_dSYMV_o_N2
+4.89, 0.0, 0.0, 4.82, 0.0, 0.0, 4.2, 0.0, 0.0, 5.68, 0.0, 0.0, 5.4, 0.0, 0.0, 5.07, 0.0, 0.0, 4.43, 0.0, 0.0, 4.86, 0.0, 0.0, 4.41, 0.0, 0.0, 4.34, 0.0, 0.0, 4.03, 0.0, 0.0, 4.23, 0.0, 0.0, 4.3, 0.0, 0.0, 4.69, 0.0, 0.0, 4.05, 0.0, 0.0, 5.75, 0.0, 0.0, 5.35, 0.0, 0.0, 
+
+L2_sSBMV_A_nn
+0.1, 0.4, 0.4, 0.4, 0.9, 0.4, 0.7, 0.1, 0.3, 0.6, 0.3, 0.1, 0.9, 0.2, 0.1, 0.2, 0.9, 0.3, 0.7, 0.6, 0.2, 0.7, 0.1, 0.2, 0.3, 0.8, 0.5, 0.1, 0.5, 0.9, 0.7, 0.8, 0.7, 0.3, 0.5, 0.2, 0.2, 0.8, 0.8, 0.7, 0.4, 0.2, 0.1, 0.4, 0.2, 0.9, 0.2, 0.0, 0.9, 0.0, 0.0, 
+
+L2_sSBMV_x_n1
+0.2, 0.1, 0.5, 0.4, 0.3, 0.8, 0.5, 0.5, 0.1, 0.3, 0.4, 0.8, 0.3, 0.6, 0.6, 0.1, 0.7, 
+
+L2_sSBMV_x_n2
+0.2, 0.0, 0.1, 0.0, 0.5, 0.0, 0.4, 0.0, 0.3, 0.0, 0.8, 0.0, 0.5, 0.0, 0.5, 0.0, 0.1, 0.0, 0.3, 0.0, 0.4, 0.0, 0.8, 0.0, 0.3, 0.0, 0.6, 0.0, 0.6, 0.0, 0.1, 0.0, 0.7, 0.0, 
+
+L2_sSBMV_y_n1
+0.3, 0.6, 0.6, 0.8, 0.3, 0.7, 0.6, 0.4, 0.7, 0.4, 0.2, 0.6, 0.5, 0.3, 0.2, 0.3, 0.9, 
+
+L2_sSBMV_y_n2
+0.3, 0.0, 0.0, 0.6, 0.0, 0.0, 0.6, 0.0, 0.0, 0.8, 0.0, 0.0, 0.3, 0.0, 0.0, 0.7, 0.0, 0.0, 0.6, 0.0, 0.0, 0.4, 0.0, 0.0, 0.7, 0.0, 0.0, 0.4, 0.0, 0.0, 0.2, 0.0, 0.0, 0.6, 0.0, 0.0, 0.5, 0.0, 0.0, 0.3, 0.0, 0.0, 0.2, 0.0, 0.0, 0.3, 0.0, 0.0, 0.9, 0.0, 0.0, 
+
+L2_sSBMV_o_N
+0.560000016689, 1.33000002027, 1.25000002757, 1.30000003651, 1.05000003353, 1.55999999136, 2.02000002369, 1.36000002861, 1.32000000805, 1.53000000611, 1.53000003293, 1.70000006258, 2.20000006109, 1.38000005305, 0.920000033379, 0.890000030249, 1.66999995589, 
+
+L2_sSBMV_o_N2
+0.560000016689, 0.0, 0.0, 1.33000002027, 0.0, 0.0, 1.25000002757, 0.0, 0.0, 1.30000003651, 0.0, 0.0, 1.05000003353, 0.0, 0.0, 1.55999999136, 0.0, 0.0, 2.02000002369, 0.0, 0.0, 1.36000002861, 0.0, 0.0, 1.32000000805, 0.0, 0.0, 1.53000000611, 0.0, 0.0, 1.53000003293, 0.0, 0.0, 1.70000006258, 0.0, 0.0, 2.20000006109, 0.0, 0.0, 1.38000005305, 0.0, 0.0, 0.920000033379, 0.0, 0.0, 0.890000030249, 0.0, 0.0, 1.66999995589, 0.0, 0.0, 
+
+L2_dSBMV_A_nn
+0.6, 0.9, 0.1, 0.3, 0.4, 0.6, 0.6, 0.4, 0.4, 0.1, 0.1, 0.1, 0.3, 0.7, 0.2, 0.2, 0.4, 0.3, 0.7, 0.6, 0.5, 0.1, 0.8, 0.2, 0.6, 0.1, 0.6, 0.4, 0.8, 0.7, 0.2, 0.1, 0.2, 0.7, 0.4, 0.1, 0.3, 0.3, 0.9, 0.1, 0.7, 0.5, 0.8, 0.4, 0.5, 0.3, 0.8, 0.0, 0.4, 0.0, 0.0, 
+
+L2_dSBMV_x_n1
+0.8, 0.5, 0.3, 0.8, 0.2, 0.5, 0.4, 0.5, 0.3, 0.5, 0.8, 0.9, 0.1, 0.4, 0.2, 0.2, 0.6, 
+
+L2_dSBMV_x_n2
+0.8, 0.0, 0.5, 0.0, 0.3, 0.0, 0.8, 0.0, 0.2, 0.0, 0.5, 0.0, 0.4, 0.0, 0.5, 0.0, 0.3, 0.0, 0.5, 0.0, 0.8, 0.0, 0.9, 0.0, 0.1, 0.0, 0.4, 0.0, 0.2, 0.0, 0.2, 0.0, 0.6, 0.0, 
+
+L2_dSBMV_y_n1
+0.9, 0.8, 0.6, 0.8, 0.4, 0.3, 0.3, 0.1, 0.5, 0.4, 0.2, 0.1, 0.1, 0.4, 0.9, 0.6, 0.4, 
+
+L2_dSBMV_y_n2
+0.9, 0.0, 0.0, 0.8, 0.0, 0.0, 0.6, 0.0, 0.0, 0.8, 0.0, 0.0, 0.4, 0.0, 0.0, 0.3, 0.0, 0.0, 0.3, 0.0, 0.0, 0.1, 0.0, 0.0, 0.5, 0.0, 0.0, 0.4, 0.0, 0.0, 0.2, 0.0, 0.0, 0.1, 0.0, 0.0, 0.1, 0.0, 0.0, 0.4, 0.0, 0.0, 0.9, 0.0, 0.0, 0.6, 0.0, 0.0, 0.4, 0.0, 0.0, 
+
+L2_dSBMV_o_N
+1.86, 2.27, 1.46, 1.37, 1.09, 0.93, 1.27, 0.88, 1.81, 2.0, 1.05, 1.24, 0.95, 0.8, 1.81, 1.42, 0.9, 
+
+L2_dSBMV_o_N2
+1.86, 0.0, 0.0, 2.27, 0.0, 0.0, 1.46, 0.0, 0.0, 1.37, 0.0, 0.0, 1.09, 0.0, 0.0, 0.93, 0.0, 0.0, 1.27, 0.0, 0.0, 0.88, 0.0, 0.0, 1.81, 0.0, 0.0, 2.0, 0.0, 0.0, 1.05, 0.0, 0.0, 1.24, 0.0, 0.0, 0.95, 0.0, 0.0, 0.8, 0.0, 0.0, 1.81, 0.0, 0.0, 1.42, 0.0, 0.0, 0.9, 0.0, 0.0, 
+
+L2_sTRMV_A_nn
+0.7, 0.8, 0.7, 0.1, 0.3, 0.3, 0.5, 0.4, 0.6, 0.3, 0.8, 0.4, 0.7, 0.6, 0.7, 0.9, 0.2, 0.0, 0.1, 0.3, 0.7, 0.1, 0.7, 0.4, 0.2, 0.6, 0.4, 0.8, 0.4, 0.1, 0.8, 0.9, 0.1, 0.8, 0.0, 0.0, 0.4, 0.8, 0.7, 0.2, 0.8, 0.9, 0.8, 0.9, 0.7, 0.4, 0.8, 0.4, 0.5, 0.2, 0.6, 0.0, 0.0, 0.0, 0.7, 0.5, 0.2, 0.1, 0.9, 0.9, 0.6, 0.2, 0.7, 0.2, 0.2, 0.8, 0.8, 0.6, 0.0, 0.0, 0.0, 0.0, 0.3, 0.3, 0.6, 0.2, 0.4, 0.5, 0.2, 0.9, 0.4, 0.5, 0.1, 0.1, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6, 0.5, 0.2, 0.5, 0.3, 0.8, 0.5, 0.5, 0.8, 0.6, 0.8, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.6, 0.9, 0.3, 0.1, 0.6, 0.9, 0.8, 0.2, 0.1, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.3, 0.5, 0.1, 0.4, 0.8, 0.6, 0.4, 0.3, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6, 0.2, 0.7, 0.5, 0.6, 0.5, 0.1, 0.3, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.8, 0.5, 0.5, 0.6, 0.1, 0.2, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.1, 0.7, 0.2, 0.8, 0.7, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.8, 0.6, 0.9, 0.5, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.9, 0.1, 0.2, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.6, 0.4, 0.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.9, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7, 
+
+L2_sTRMV_A_nn_pu
+0.7, 0.8, 0.7, 0.1, 0.3, 0.3, 0.5, 0.4, 0.6, 0.3, 0.8, 0.4, 0.7, 0.6, 0.7, 0.9, 0.2, 0.1, 0.3, 0.7, 0.1, 0.7, 0.4, 0.2, 0.6, 0.4, 0.8, 0.4, 0.1, 0.8, 0.9, 0.1, 0.8, 0.4, 0.8, 0.7, 0.2, 0.8, 0.9, 0.8, 0.9, 0.7, 0.4, 0.8, 0.4, 0.5, 0.2, 0.6, 0.7, 0.5, 0.2, 0.1, 0.9, 0.9, 0.6, 0.2, 0.7, 0.2, 0.2, 0.8, 0.8, 0.6, 0.3, 0.3, 0.6, 0.2, 0.4, 0.5, 0.2, 0.9, 0.4, 0.5, 0.1, 0.1, 0.5, 0.6, 0.5, 0.2, 0.5, 0.3, 0.8, 0.5, 0.5, 0.8, 0.6, 0.8, 0.6, 0.5, 0.6, 0.9, 0.3, 0.1, 0.6, 0.9, 0.8, 0.2, 0.1, 0.2, 0.1, 0.3, 0.5, 0.1, 0.4, 0.8, 0.6, 0.4, 0.3, 0.9, 0.6, 0.2, 0.7, 0.5, 0.6, 0.5, 0.1, 0.3, 0.9, 0.3, 0.8, 0.5, 0.5, 0.6, 0.1, 0.2, 0.3, 0.2, 0.1, 0.7, 0.2, 0.8, 0.7, 0.2, 0.2, 0.8, 0.6, 0.9, 0.5, 0.8, 0.1, 0.9, 0.1, 0.2, 0.3, 0.3, 0.6, 0.4, 0.4, 0.5, 0.9, 0.6, 0.5, 0.4, 0.7, 
+
+L2_sTRMV_x_n1
+0.2, 0.7, 0.3, 0.3, 0.6, 0.1, 0.1, 0.6, 0.5, 0.5, 0.2, 0.4, 0.3, 0.1, 0.7, 0.7, 0.3, 
+
+L2_sTRMV_x_n2
+0.2, 0.0, 0.7, 0.0, 0.3, 0.0, 0.3, 0.0, 0.6, 0.0, 0.1, 0.0, 0.1, 0.0, 0.6, 0.0, 0.5, 0.0, 0.5, 0.0, 0.2, 0.0, 0.4, 0.0, 0.3, 0.0, 0.1, 0.0, 0.7, 0.0, 0.7, 0.0, 0.3, 0.0, 
+
+L2_sTRMV_o_UN
+3.66, 2.53, 3.52, 3.53, 1.7, 2.38, 1.89, 1.7, 1.52, 1.02, 1.42, 1.6, 0.42, 0.85, 1.16, 0.47, 0.21, 
+
+L2_sTRMV_o_UN2
+3.66, 0.0, 2.53, 0.0, 3.52, 0.0, 3.53, 0.0, 1.7, 0.0, 2.38, 0.0, 1.89, 0.0, 1.7, 0.0, 1.52, 0.0, 1.02, 0.0, 1.42, 0.0, 1.6, 0.0, 0.42, 0.0, 0.85, 0.0, 1.16, 0.0, 0.47, 0.0, 0.21, 0.0, 
+
+L2_sTRMV_o_UT
+0.14, 0.23, 0.47, 0.96, 0.67, 0.91, 1.11, 1.02, 1.91, 1.7, 2.05, 2.18, 2.41, 2.81, 2.6, 2.55, 3.88, 
+
+L2_sTRMV_o_UH
+0.14, 0.23, 0.47, 0.96, 0.67, 0.91, 1.11, 1.02, 1.91, 1.7, 2.05, 2.18, 2.41, 2.81, 2.6, 2.55, 3.88, 
+
+L2_dTRMV_A_nn
+0.2, 0.8, 0.5, 0.5, 0.5, 0.6, 0.2, 0.9, 0.8, 0.8, 0.7, 0.5, 0.7, 0.2, 0.4, 0.4, 0.7, 0.0, 0.9, 0.1, 0.3, 0.6, 0.1, 0.1, 0.2, 0.1, 0.5, 0.4, 0.9, 0.6, 0.2, 0.1, 0.4, 0.2, 0.0, 0.0, 0.1, 0.1, 0.6, 0.7, 0.3, 0.4, 0.4, 0.7, 0.5, 0.3, 0.9, 0.9, 0.9, 0.5, 0.1, 0.0, 0.0, 0.0, 0.6, 0.3, 0.4, 0.8, 0.2, 0.6, 0.8, 0.3, 0.9, 0.8, 0.2, 0.2, 0.3, 0.2, 0.0, 0.0, 0.0, 0.0, 0.3, 0.8, 0.1, 0.4, 0.4, 0.2, 0.3, 0.7, 0.7, 0.9, 0.3, 0.2, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.9, 0.9, 0.7, 0.6, 0.6, 0.5, 0.5, 0.9, 0.1, 0.1, 0.2, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.9, 0.3, 0.6, 0.3, 0.3, 0.6, 0.2, 0.9, 0.9, 0.7, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.8, 0.5, 0.1, 0.9, 0.9, 0.4, 0.8, 0.8, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.5, 0.7, 0.4, 0.5, 0.5, 0.8, 0.4, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6, 0.5, 0.9, 0.3, 0.8, 0.3, 0.1, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.4, 0.4, 0.8, 0.9, 0.7, 0.7, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.7, 0.8, 0.9, 0.2, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.9, 0.7, 0.6, 0.7, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.6, 0.5, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6, 0.3, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 
+
+L2_dTRMV_A_nn_pu
+0.2, 0.8, 0.5, 0.5, 0.5, 0.6, 0.2, 0.9, 0.8, 0.8, 0.7, 0.5, 0.7, 0.2, 0.4, 0.4, 0.7, 0.9, 0.1, 0.3, 0.6, 0.1, 0.1, 0.2, 0.1, 0.5, 0.4, 0.9, 0.6, 0.2, 0.1, 0.4, 0.2, 0.1, 0.1, 0.6, 0.7, 0.3, 0.4, 0.4, 0.7, 0.5, 0.3, 0.9, 0.9, 0.9, 0.5, 0.1, 0.6, 0.3, 0.4, 0.8, 0.2, 0.6, 0.8, 0.3, 0.9, 0.8, 0.2, 0.2, 0.3, 0.2, 0.3, 0.8, 0.1, 0.4, 0.4, 0.2, 0.3, 0.7, 0.7, 0.9, 0.3, 0.2, 0.6, 0.9, 0.9, 0.7, 0.6, 0.6, 0.5, 0.5, 0.9, 0.1, 0.1, 0.2, 0.6, 0.9, 0.3, 0.6, 0.3, 0.3, 0.6, 0.2, 0.9, 0.9, 0.7, 0.3, 0.3, 0.8, 0.5, 0.1, 0.9, 0.9, 0.4, 0.8, 0.8, 0.2, 0.3, 0.5, 0.7, 0.4, 0.5, 0.5, 0.8, 0.4, 0.8, 0.6, 0.5, 0.9, 0.3, 0.8, 0.3, 0.1, 0.1, 0.4, 0.4, 0.8, 0.9, 0.7, 0.7, 0.3, 0.5, 0.7, 0.8, 0.9, 0.2, 0.8, 0.9, 0.7, 0.6, 0.7, 0.1, 0.1, 0.6, 0.5, 0.9, 0.6, 0.3, 0.8, 0.6, 0.2, 0.5, 
+
+L2_dTRMV_x_n1
+0.3, 0.8, 0.3, 0.3, 0.4, 0.5, 0.3, 0.4, 0.5, 0.1, 0.1, 0.5, 0.6, 0.4, 0.8, 0.8, 0.3, 
+
+L2_dTRMV_x_n2
+0.3, 0.0, 0.8, 0.0, 0.3, 0.0, 0.3, 0.0, 0.4, 0.0, 0.5, 0.0, 0.3, 0.0, 0.4, 0.0, 0.5, 0.0, 0.1, 0.0, 0.1, 0.0, 0.5, 0.0, 0.6, 0.0, 0.4, 0.0, 0.8, 0.0, 0.8, 0.0, 0.3, 0.0, 
+
+L2_dTRMV_o_UN
+4.07, 2.73, 3.42, 2.7, 2.67, 2.66, 2.9, 3.07, 2.17, 1.41, 2.29, 2.11, 1.89, 1.19, 0.96, 0.54, 0.15, 
+
+L2_dTRMV_o_UN2
+4.07, 0.0, 2.73, 0.0, 3.42, 0.0, 2.7, 0.0, 2.67, 0.0, 2.66, 0.0, 2.9, 0.0, 3.07, 0.0, 2.17, 0.0, 1.41, 0.0, 2.29, 0.0, 2.11, 0.0, 1.89, 0.0, 1.19, 0.0, 0.96, 0.0, 0.54, 0.0, 0.15, 0.0, 
+
+L2_dTRMV_o_UT
+0.06, 0.96, 0.26, 0.6, 1.02, 1.36, 1.23, 1.33, 1.73, 2.07, 1.71, 2.88, 3.6, 2.67, 3.32, 3.11, 3.38, 
+
+L2_dTRMV_o_UH
+0.06, 0.96, 0.26, 0.6, 1.02, 1.36, 1.23, 1.33, 1.73, 2.07, 1.71, 2.88, 3.6, 2.67, 3.32, 3.11, 3.38, 
+
+L2_cTRMV_A_nn
+0.10000000149, 0.5, 0.899999976158, 0.5, 0.699999988079, 0.40000000596, 0.300000011921, 0.600000023842, 0.300000011921, 0.20000000298, 0.10000000149, 0.699999988079, 0.5, 0.899999976158, 0.20000000298, 0.5, 0.10000000149, 0.699999988079, 0.300000011921, 0.600000023842, 0.600000023842, 0.800000011921, 0.899999976158, 0.600000023842, 0.5, 0.300000011921, 0.699999988079, 0.40000000596, 0.800000011921, 0.699999988079, 0.300000011921, 0.899999976158, 0.699999988079, 0.10000000149, 0.0, 0.0, 0.20000000298, 0.40000000596, 0.899999976158, 0.899999976158, 0.699999988079, 0.300000011921, 0.5, 0.20000000298, 0.20000000298, 0.20000000298, 0.5, 0.40000000596, 0.300000011921, 0.20000000298, 0.699999988079, 0.20000000298, 0.600000023842, 0.699999988079, 0.300000011921, 0.600000023842, 0.20000000298, 0.20000000298, 0.40000000596, 0.300000011921, 0.5, 0.600000023842, 0.5, 0.300000011921, 0.40000000596, 0.699999988079, 0.20000000298, 0.899999976158, 0.0, 0.0, 0.0, 0.0, 0.5, 0.300000011921, 0.10000000149, 0.10000000149, 0.300000011921, 0.600000023842, 0.600000023842, 0.5, 0.20000000298, 0.10000000149, 0.600000023842, 0.300000011921, 0.5, 0.699999988079, 0.5, 0.20000000298, 0.40000000596, 0.699999988079, 0.800000011921, 0.20000000298, 0.899999976158, 0.20000000298, 0.40000000596, 0.600000023842, 0.40000000596, 0.899999976158, 0.899999976158, 0.300000011921, 0.899999976158, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.800000011921, 0.699999988079, 0.20000000298, 0.800000011921, 0.300000011921, 0.5, 0.300000011921, 0.300000011921, 0.300000011921, 0.300000011921, 0.800000011921, 0.600000023842, 0.899999976158, 0.20000000298, 0.300000011921, 0.5, 0.600000023842, 0.5, 0.10000000149, 0.899999976158, 0.300000011921, 0.20000000298, 0.20000000298, 0.20000000298, 0.10000000149, 0.40000000596, 0.5, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.800000011921, 0.5, 0.5, 0.899999976158, 0.5, 0.800000011921, 0.5, 0.899999976158, 0.800000011921, 0.600000023842, 0.10000000149, 0.10000000149, 0.899999976158, 0.899999976158, 0.40000000596, 0.699999988079, 0.899999976158, 0.10000000149, 0.40000000596, 0.40000000596, 0.10000000149, 0.300000011921, 0.699999988079, 0.300000011921, 0.20000000298, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.699999988079, 0.5, 0.300000011921, 0.10000000149, 0.10000000149, 0.40000000596, 0.699999988079, 0.10000000149, 0.899999976158, 0.600000023842, 0.20000000298, 0.800000011921, 0.699999988079, 0.5, 0.899999976158, 0.40000000596, 0.10000000149, 0.600000023842, 0.300000011921, 0.300000011921, 0.600000023842, 0.5, 0.600000023842, 0.10000000149, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.300000011921, 0.40000000596, 0.300000011921, 0.699999988079, 0.899999976158, 0.5, 0.20000000298, 0.600000023842, 0.899999976158, 0.600000023842, 0.10000000149, 0.10000000149, 0.40000000596, 0.699999988079, 0.10000000149, 0.40000000596, 0.10000000149, 0.10000000149, 0.10000000149, 0.5, 0.300000011921, 0.899999976158, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.800000011921, 0.300000011921, 0.40000000596, 0.899999976158, 0.800000011921, 0.300000011921, 0.600000023842, 0.10000000149, 0.5, 0.699999988079, 0.5, 0.10000000149, 0.899999976158, 0.300000011921, 0.600000023842, 0.300000011921, 0.600000023842, 0.699999988079, 0.600000023842, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.10000000149, 0.800000011921, 0.800000011921, 0.600000023842, 0.899999976158, 0.20000000298, 0.40000000596, 0.300000011921, 0.20000000298, 0.20000000298, 0.40000000596, 0.20000000298, 0.699999988079, 0.5, 0.300000011921, 0.300000011921, 0.10000000149, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.800000011921, 0.20000000298, 0.800000011921, 0.800000011921, 0.10000000149, 0.699999988079, 0.600000023842, 0.40000000596, 0.20000000298, 0.40000000596, 0.300000011921, 0.300000011921, 0.600000023842, 0.300000011921, 0.10000000149, 0.10000000149, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.10000000149, 0.10000000149, 0.300000011921, 0.5, 0.899999976158, 0.899999976158, 0.20000000298, 0.20000000298, 0.600000023842, 0.10000000149, 0.20000000298, 0.800000011921, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.300000011921, 0.10000000149, 0.20000000298, 0.5, 0.5, 0.10000000149, 0.300000011921, 0.40000000596, 0.699999988079, 0.899999976158, 0.40000000596, 0.699999988079, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.40000000596, 0.40000000596, 0.40000000596, 0.600000023842, 0.20000000298, 0.5, 0.300000011921, 0.899999976158, 0.40000000596, 0.800000011921, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.300000011921, 0.899999976158, 0.800000011921, 0.600000023842, 0.40000000596, 0.300000011921, 0.300000011921, 0.40000000596, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.300000011921, 0.20000000298, 0.899999976158, 0.5, 0.699999988079, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.10000000149, 0.699999988079, 0.40000000596, 0.800000011921, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.10000000149, 
+
+L2_cTRMV_A_nn_pu
+0.10000000149, 0.5, 0.899999976158, 0.5, 0.699999988079, 0.40000000596, 0.300000011921, 0.600000023842, 0.300000011921, 0.20000000298, 0.10000000149, 0.699999988079, 0.5, 0.899999976158, 0.20000000298, 0.5, 0.10000000149, 0.699999988079, 0.300000011921, 0.600000023842, 0.600000023842, 0.800000011921, 0.899999976158, 0.600000023842, 0.5, 0.300000011921, 0.699999988079, 0.40000000596, 0.800000011921, 0.699999988079, 0.300000011921, 0.899999976158, 0.699999988079, 0.10000000149, 0.20000000298, 0.40000000596, 0.899999976158, 0.899999976158, 0.699999988079, 0.300000011921, 0.5, 0.20000000298, 0.20000000298, 0.20000000298, 0.5, 0.40000000596, 0.300000011921, 0.20000000298, 0.699999988079, 0.20000000298, 0.600000023842, 0.699999988079, 0.300000011921, 0.600000023842, 0.20000000298, 0.20000000298, 0.40000000596, 0.300000011921, 0.5, 0.600000023842, 0.5, 0.300000011921, 0.40000000596, 0.699999988079, 0.20000000298, 0.899999976158, 0.5, 0.300000011921, 0.10000000149, 0.10000000149, 0.300000011921, 0.600000023842, 0.600000023842, 0.5, 0.20000000298, 0.10000000149, 0.600000023842, 0.300000011921, 0.5, 0.699999988079, 0.5, 0.20000000298, 0.40000000596, 0.699999988079, 0.800000011921, 0.20000000298, 0.899999976158, 0.20000000298, 0.40000000596, 0.600000023842, 0.40000000596, 0.899999976158, 0.899999976158, 0.300000011921, 0.899999976158, 0.5, 0.800000011921, 0.699999988079, 0.20000000298, 0.800000011921, 0.300000011921, 0.5, 0.300000011921, 0.300000011921, 0.300000011921, 0.300000011921, 0.800000011921, 0.600000023842, 0.899999976158, 0.20000000298, 0.300000011921, 0.5, 0.600000023842, 0.5, 0.10000000149, 0.899999976158, 0.300000011921, 0.20000000298, 0.20000000298, 0.20000000298, 0.10000000149, 0.40000000596, 0.5, 0.600000023842, 0.800000011921, 0.5, 0.5, 0.899999976158, 0.5, 0.800000011921, 0.5, 0.899999976158, 0.800000011921, 0.600000023842, 0.10000000149, 0.10000000149, 0.899999976158, 0.899999976158, 0.40000000596, 0.699999988079, 0.899999976158, 0.10000000149, 0.40000000596, 0.40000000596, 0.10000000149, 0.300000011921, 0.699999988079, 0.300000011921, 0.20000000298, 0.600000023842, 0.699999988079, 0.5, 0.300000011921, 0.10000000149, 0.10000000149, 0.40000000596, 0.699999988079, 0.10000000149, 0.899999976158, 0.600000023842, 0.20000000298, 0.800000011921, 0.699999988079, 0.5, 0.899999976158, 0.40000000596, 0.10000000149, 0.600000023842, 0.300000011921, 0.300000011921, 0.600000023842, 0.5, 0.600000023842, 0.10000000149, 0.300000011921, 0.40000000596, 0.300000011921, 0.699999988079, 0.899999976158, 0.5, 0.20000000298, 0.600000023842, 0.899999976158, 0.600000023842, 0.10000000149, 0.10000000149, 0.40000000596, 0.699999988079, 0.10000000149, 0.40000000596, 0.10000000149, 0.10000000149, 0.10000000149, 0.5, 0.300000011921, 0.899999976158, 0.800000011921, 0.300000011921, 0.40000000596, 0.899999976158, 0.800000011921, 0.300000011921, 0.600000023842, 0.10000000149, 0.5, 0.699999988079, 0.5, 0.10000000149, 0.899999976158, 0.300000011921, 0.600000023842, 0.300000011921, 0.600000023842, 0.699999988079, 0.600000023842, 0.600000023842, 0.10000000149, 0.800000011921, 0.800000011921, 0.600000023842, 0.899999976158, 0.20000000298, 0.40000000596, 0.300000011921, 0.20000000298, 0.20000000298, 0.40000000596, 0.20000000298, 0.699999988079, 0.5, 0.300000011921, 0.300000011921, 0.10000000149, 0.5, 0.800000011921, 0.20000000298, 0.800000011921, 0.800000011921, 0.10000000149, 0.699999988079, 0.600000023842, 0.40000000596, 0.20000000298, 0.40000000596, 0.300000011921, 0.300000011921, 0.600000023842, 0.300000011921, 0.10000000149, 0.10000000149, 0.5, 0.10000000149, 0.10000000149, 0.300000011921, 0.5, 0.899999976158, 0.899999976158, 0.20000000298, 0.20000000298, 0.600000023842, 0.10000000149, 0.20000000298, 0.800000011921, 0.600000023842, 0.300000011921, 0.10000000149, 0.20000000298, 0.5, 0.5, 0.10000000149, 0.300000011921, 0.40000000596, 0.699999988079, 0.899999976158, 0.40000000596, 0.699999988079, 0.40000000596, 0.40000000596, 0.40000000596, 0.600000023842, 0.20000000298, 0.5, 0.300000011921, 0.899999976158, 0.40000000596, 0.800000011921, 0.300000011921, 0.899999976158, 0.800000011921, 0.600000023842, 0.40000000596, 0.300000011921, 0.300000011921, 0.40000000596, 0.20000000298, 0.300000011921, 0.20000000298, 0.899999976158, 0.5, 0.699999988079, 0.10000000149, 0.699999988079, 0.40000000596, 0.800000011921, 0.20000000298, 0.10000000149, 
+
+L2_cTRMV_x_n1
+0.300000011921, 0.600000023842, 0.699999988079, 0.40000000596, 0.10000000149, 0.699999988079, 0.899999976158, 0.699999988079, 0.300000011921, 0.600000023842, 0.10000000149, 0.20000000298, 0.699999988079, 0.800000011921, 0.600000023842, 0.699999988079, 0.10000000149, 0.20000000298, 0.600000023842, 0.5, 0.899999976158, 0.40000000596, 0.10000000149, 0.800000011921, 0.300000011921, 0.899999976158, 0.800000011921, 0.800000011921, 0.899999976158, 0.899999976158, 0.10000000149, 0.5, 0.20000000298, 0.600000023842, 
+
+L2_cTRMV_x_n2
+0.300000011921, 0.600000023842, 0.0, 0.0, 0.699999988079, 0.40000000596, 0.0, 0.0, 0.10000000149, 0.699999988079, 0.0, 0.0, 0.899999976158, 0.699999988079, 0.0, 0.0, 0.300000011921, 0.600000023842, 0.0, 0.0, 0.10000000149, 0.20000000298, 0.0, 0.0, 0.699999988079, 0.800000011921, 0.0, 0.0, 0.600000023842, 0.699999988079, 0.0, 0.0, 0.10000000149, 0.20000000298, 0.0, 0.0, 0.600000023842, 0.5, 0.0, 0.0, 0.899999976158, 0.40000000596, 0.0, 0.0, 0.10000000149, 0.800000011921, 0.0, 0.0, 0.300000011921, 0.899999976158, 0.0, 0.0, 0.800000011921, 0.800000011921, 0.0, 0.0, 0.899999976158, 0.899999976158, 0.0, 0.0, 0.10000000149, 0.5, 0.0, 0.0, 0.20000000298, 0.600000023842, 0.0, 0.0, 
+
+L2_cTRMV_o_UN
+-1.51000003606, 9.79000002131, -0.990000025034, 7.61000006884, -0.829999991208, 7.85000001118, -1.33999999076, 6.02000009298, -1.3100000532, 7.02000000209, -0.920000028163, 5.94000007793, -1.58000001654, 4.44000008538, 0.730000029206, 5.39000010476, 0.379999931604, 3.89000003099, -0.239999983311, 3.80000006855, -0.570000024438, 3.39000003323, -0.929999969602, 2.51000003085, -1.49000000641, 2.55000004694, -0.590000008643, 2.71000002488, -0.840000001192, 1.08000001356, -0.740000017583, 0.520000018477, -0.0200000020862, 0.140000007153, 
+
+L2_cTRMV_o_UN2
+-1.51000003606, 9.79000002131, 0.0, 0.0, -0.990000025034, 7.61000006884, 0.0, 0.0, -0.829999991208, 7.85000001118, 0.0, 0.0, -1.33999999076, 6.02000009298, 0.0, 0.0, -1.3100000532, 7.02000000209, 0.0, 0.0, -0.920000028163, 5.94000007793, 0.0, 0.0, -1.58000001654, 4.44000008538, 0.0, 0.0, 0.730000029206, 5.39000010476, 0.0, 0.0, 0.379999931604, 3.89000003099, 0.0, 0.0, -0.239999983311, 3.80000006855, 0.0, 0.0, -0.570000024438, 3.39000003323, 0.0, 0.0, -0.929999969602, 2.51000003085, 0.0, 0.0, -1.49000000641, 2.55000004694, 0.0, 0.0, -0.590000008643, 2.71000002488, 0.0, 0.0, -0.840000001192, 1.08000001356, 0.0, 0.0, -0.740000017583, 0.520000018477, 0.0, 0.0, -0.0200000020862, 0.140000007153, 0.0, 0.0, 
+
+L2_cTRMV_o_UT
+-0.270000010282, 0.210000009239, -0.050000013411, 1.0500000149, 0.0799999643862, 1.90999998018, 0.269999964088, 2.12000000432, -0.590000015348, 2.34000005186, -1.11999999464, 2.38000002921, -0.620000036359, 2.81000006735, -0.739999984801, 3.56000006512, -0.500000040978, 5.01000004277, 0.659999953359, 4.66000004426, -0.290000020564, 6.07000011086, -0.819999991655, 5.09000007719, -0.679999957681, 6.59999995157, -0.600000074506, 6.39000007868, -1.20999998912, 6.10000017136, -3.29999985546, 7.79000002876, -2.48999999225, 8.90000004843, 
+
+L2_cTRMV_o_UH
+0.33000001356, -0.0900000026822, 0.870000019968, 0.190000004172, 1.6999999918, 0.350000018626, 2.35000000075, 0.0600000204146, 2.37000004306, 0.0800000441074, 2.56000002265, 0.0400000339746, 2.98000006944, 0.0900000280142, 3.64000008911, 0.420000038594, 5.45999999359, 0.76999998346, 4.68000010595, 1.17999997482, 6.2900001055, 0.870000000596, 4.44000006378, 0.550000011921, 5.72000004083, 0.620000077337, 6.58000007987, 0.849999961257, 6.49000013307, 0.559999994338, 8.10000002533, -0.069999935776, 9.09000006825, 0.0200000341237, 
+
+L2_zTRMV_A_nn
+0.3, 0.3, 0.6, 0.9, 0.8, 0.8, 0.8, 0.4, 0.6, 0.5, 0.3, 0.1, 0.6, 0.7, 0.1, 0.1, 0.8, 0.6, 0.1, 0.6, 0.5, 0.9, 0.5, 0.1, 0.5, 0.4, 0.8, 0.2, 0.4, 0.9, 0.7, 0.1, 0.2, 0.3, 0.0, 0.0, 0.6, 0.9, 0.8, 0.3, 0.2, 0.6, 0.1, 0.7, 0.7, 0.1, 0.7, 0.5, 0.5, 0.4, 0.8, 0.2, 0.2, 0.6, 0.2, 0.4, 0.7, 0.7, 0.1, 0.1, 0.6, 0.2, 0.6, 0.2, 0.5, 0.1, 0.8, 0.9, 0.0, 0.0, 0.0, 0.0, 0.7, 0.9, 0.7, 0.6, 0.3, 0.8, 0.9, 0.4, 0.9, 0.2, 0.1, 0.6, 0.6, 0.8, 0.6, 0.4, 0.1, 0.7, 0.1, 0.4, 0.4, 0.2, 0.3, 0.6, 0.7, 0.4, 0.5, 0.2, 0.5, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.6, 0.5, 0.3, 0.6, 0.5, 0.2, 0.8, 0.5, 0.6, 0.7, 0.9, 0.9, 0.9, 0.7, 0.2, 0.1, 0.8, 0.1, 0.6, 0.1, 0.3, 0.3, 0.9, 0.3, 0.8, 0.7, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.6, 0.9, 0.1, 0.5, 0.9, 0.4, 0.5, 0.8, 0.7, 0.8, 0.1, 0.9, 0.1, 0.2, 0.8, 0.3, 0.3, 0.1, 0.6, 0.9, 0.7, 0.1, 0.3, 0.2, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.5, 0.2, 0.5, 0.8, 0.3, 0.4, 0.6, 0.4, 0.5, 0.1, 0.5, 0.3, 0.4, 0.4, 0.3, 0.4, 0.3, 0.8, 0.1, 0.9, 0.6, 0.2, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.9, 0.7, 0.9, 0.1, 0.1, 0.8, 0.9, 0.1, 0.2, 0.7, 0.8, 0.4, 0.7, 0.3, 0.7, 0.9, 0.2, 0.6, 0.5, 0.6, 0.3, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.4, 0.3, 0.3, 0.8, 0.5, 0.6, 0.5, 0.4, 0.8, 0.1, 0.7, 0.6, 0.5, 0.2, 0.3, 0.4, 0.4, 0.7, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7, 0.3, 0.2, 0.8, 0.4, 0.3, 0.5, 0.8, 0.7, 0.5, 0.7, 0.1, 0.7, 0.2, 0.5, 0.8, 0.1, 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.1, 0.6, 0.3, 0.2, 0.9, 0.4, 0.9, 0.6, 0.9, 0.5, 0.4, 0.7, 0.3, 0.6, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.4, 0.1, 0.6, 0.1, 0.3, 0.2, 0.5, 0.3, 0.3, 0.4, 0.8, 0.8, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.3, 0.1, 0.8, 0.6, 0.5, 0.7, 0.7, 0.2, 0.2, 0.5, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.4, 0.8, 0.2, 0.2, 0.7, 0.1, 0.8, 0.6, 0.4, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.9, 0.1, 0.3, 0.2, 0.5, 0.3, 0.9, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.9, 0.7, 0.2, 0.3, 0.6, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, 0.3, 0.8, 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.3, 
+
+L2_zTRMV_A_nn_pu
+0.3, 0.3, 0.6, 0.9, 0.8, 0.8, 0.8, 0.4, 0.6, 0.5, 0.3, 0.1, 0.6, 0.7, 0.1, 0.1, 0.8, 0.6, 0.1, 0.6, 0.5, 0.9, 0.5, 0.1, 0.5, 0.4, 0.8, 0.2, 0.4, 0.9, 0.7, 0.1, 0.2, 0.3, 0.6, 0.9, 0.8, 0.3, 0.2, 0.6, 0.1, 0.7, 0.7, 0.1, 0.7, 0.5, 0.5, 0.4, 0.8, 0.2, 0.2, 0.6, 0.2, 0.4, 0.7, 0.7, 0.1, 0.1, 0.6, 0.2, 0.6, 0.2, 0.5, 0.1, 0.8, 0.9, 0.7, 0.9, 0.7, 0.6, 0.3, 0.8, 0.9, 0.4, 0.9, 0.2, 0.1, 0.6, 0.6, 0.8, 0.6, 0.4, 0.1, 0.7, 0.1, 0.4, 0.4, 0.2, 0.3, 0.6, 0.7, 0.4, 0.5, 0.2, 0.5, 0.8, 0.5, 0.6, 0.5, 0.3, 0.6, 0.5, 0.2, 0.8, 0.5, 0.6, 0.7, 0.9, 0.9, 0.9, 0.7, 0.2, 0.1, 0.8, 0.1, 0.6, 0.1, 0.3, 0.3, 0.9, 0.3, 0.8, 0.7, 0.5, 0.2, 0.6, 0.9, 0.1, 0.5, 0.9, 0.4, 0.5, 0.8, 0.7, 0.8, 0.1, 0.9, 0.1, 0.2, 0.8, 0.3, 0.3, 0.1, 0.6, 0.9, 0.7, 0.1, 0.3, 0.2, 0.6, 0.1, 0.5, 0.2, 0.5, 0.8, 0.3, 0.4, 0.6, 0.4, 0.5, 0.1, 0.5, 0.3, 0.4, 0.4, 0.3, 0.4, 0.3, 0.8, 0.1, 0.9, 0.6, 0.2, 0.8, 0.9, 0.7, 0.9, 0.1, 0.1, 0.8, 0.9, 0.1, 0.2, 0.7, 0.8, 0.4, 0.7, 0.3, 0.7, 0.9, 0.2, 0.6, 0.5, 0.6, 0.3, 0.3, 0.3, 0.4, 0.3, 0.3, 0.8, 0.5, 0.6, 0.5, 0.4, 0.8, 0.1, 0.7, 0.6, 0.5, 0.2, 0.3, 0.4, 0.4, 0.7, 0.6, 0.7, 0.3, 0.2, 0.8, 0.4, 0.3, 0.5, 0.8, 0.7, 0.5, 0.7, 0.1, 0.7, 0.2, 0.5, 0.8, 0.1, 0.7, 0.3, 0.1, 0.6, 0.3, 0.2, 0.9, 0.4, 0.9, 0.6, 0.9, 0.5, 0.4, 0.7, 0.3, 0.6, 0.5, 0.1, 0.4, 0.1, 0.6, 0.1, 0.3, 0.2, 0.5, 0.3, 0.3, 0.4, 0.8, 0.8, 0.8, 0.5, 0.3, 0.1, 0.8, 0.6, 0.5, 0.7, 0.7, 0.2, 0.2, 0.5, 0.8, 0.4, 0.8, 0.2, 0.2, 0.7, 0.1, 0.8, 0.6, 0.4, 0.8, 0.9, 0.1, 0.3, 0.2, 0.5, 0.3, 0.9, 0.5, 0.9, 0.7, 0.2, 0.3, 0.6, 0.5, 0.8, 0.3, 0.8, 0.7, 0.1, 0.3, 
+
+L2_zTRMV_x_n1
+0.6, 0.2, 0.6, 0.1, 0.2, 0.6, 0.9, 0.9, 0.5, 0.8, 0.2, 0.4, 0.2, 0.3, 0.5, 0.2, 0.2, 0.8, 0.6, 0.3, 0.8, 0.5, 0.3, 0.2, 0.5, 0.8, 0.7, 0.1, 0.7, 0.4, 0.3, 0.2, 0.5, 0.4, 
+
+L2_zTRMV_x_n2
+0.6, 0.2, 0.0, 0.0, 0.6, 0.1, 0.0, 0.0, 0.2, 0.6, 0.0, 0.0, 0.9, 0.9, 0.0, 0.0, 0.5, 0.8, 0.0, 0.0, 0.2, 0.4, 0.0, 0.0, 0.2, 0.3, 0.0, 0.0, 0.5, 0.2, 0.0, 0.0, 0.2, 0.8, 0.0, 0.0, 0.6, 0.3, 0.0, 0.0, 0.8, 0.5, 0.0, 0.0, 0.3, 0.2, 0.0, 0.0, 0.5, 0.8, 0.0, 0.0, 0.7, 0.1, 0.0, 0.0, 0.7, 0.4, 0.0, 0.0, 0.3, 0.2, 0.0, 0.0, 0.5, 0.4, 0.0, 0.0, 
+
+L2_zTRMV_o_UN
+0.49, 8.08, 0.49, 6.68, -0.77, 7.48, -0.67, 7.0, 0.41, 5.55, 0.24, 4.05, 0.73, 4.61, 0.44, 4.03, 0.54, 4.04, 0.61, 3.66, -0.18, 2.54, 0.03, 2.55, 0.13, 2.13, 1.09, 1.22, 0.45, 1.47, 0.3, 0.92, -0.07, 0.19, 
+
+L2_zTRMV_o_UN2
+0.49, 8.08, 0.0, 0.0, 0.49, 6.68, 0.0, 0.0, -0.77, 7.48, 0.0, 0.0, -0.67, 7.0, 0.0, 0.0, 0.41, 5.55, 0.0, 0.0, 0.24, 4.05, 0.0, 0.0, 0.73, 4.61, 0.0, 0.0, 0.44, 4.03, 0.0, 0.0, 0.54, 4.04, 0.0, 0.0, 0.61, 3.66, 0.0, 0.0, -0.18, 2.54, 0.0, 0.0, 0.03, 2.55, 0.0, 0.0, 0.13, 2.13, 0.0, 0.0, 1.09, 1.22, 0.0, 0.0, 0.45, 1.47, 0.0, 0.0, 0.3, 0.92, 0.0, 0.0, -0.07, 0.19, 0.0, 0.0, 
+
+L2_zTRMV_o_UT
+0.12, 0.24, 0.45, 1.26, 0.37, 1.5, 0.15, 2.31, -0.37, 2.37, 0.79, 2.77, -0.55, 3.83, -0.07, 3.04, -0.27, 4.97, 0.08, 4.94, 0.46, 4.5, -1.6, 5.04, -1.32, 5.16, 0.6, 4.97, 0.8, 7.52, 0.18, 6.53, 0.08, 8.06, 
+
+L2_zTRMV_o_UH
+0.24, -0.12, 0.99, -0.9, 1.83, -0.18, 2.23, -0.21, 2.43, -0.53, 2.79, 1.17, 3.77, -0.51, 3.11, 0.06, 5.27, 0.39, 4.7, 0.44, 4.34, 0.1, 5.2, -1.98, 4.6, -0.88, 5.66, -0.43, 6.88, 0.32, 7.12, -0.11, 9.1, -1.8, 
+
+L2_sTBMV_A_nn
+0.7, 0.3, 0.8, 0.3, 0.3, 0.9, 0.4, 0.1, 0.4, 0.7, 0.7, 0.2, 0.7, 0.1, 0.8, 0.6, 0.5, 0.6, 0.1, 0.2, 0.4, 0.2, 0.8, 0.7, 0.8, 0.1, 0.5, 0.1, 0.2, 0.4, 0.2, 0.2, 0.7, 0.7, 0.6, 0.7, 0.4, 0.1, 0.5, 0.4, 0.1, 0.8, 0.4, 0.4, 0.9, 0.5, 0.9, 0.0, 0.9, 0.0, 0.0, 
+
+L2_sTBMV_x_n1
+0.8, 0.7, 0.1, 0.9, 0.1, 0.9, 0.3, 0.1, 0.1, 0.2, 0.3, 0.3, 0.5, 0.5, 0.7, 0.8, 0.4, 
+
+L2_sTBMV_x_n2
+0.8, 0.0, 0.7, 0.0, 0.1, 0.0, 0.9, 0.0, 0.1, 0.0, 0.9, 0.0, 0.3, 0.0, 0.1, 0.0, 0.1, 0.0, 0.2, 0.0, 0.3, 0.0, 0.3, 0.0, 0.5, 0.0, 0.5, 0.0, 0.7, 0.0, 0.8, 0.0, 0.4, 0.0, 
+
+L2_sTBMV_o_UN
+0.85, 1.05, 0.17, 0.88, 0.4, 0.75, 0.09, 0.24, 0.25, 0.2, 0.47, 0.86, 0.6, 0.91, 0.96, 0.76, 0.36, 
+
+L2_sTBMV_o_UN2
+0.85, 0.0, 1.05, 0.0, 0.17, 0.0, 0.88, 0.0, 0.4, 0.0, 0.75, 0.0, 0.09, 0.0, 0.24, 0.0, 0.25, 0.0, 0.2, 0.0, 0.47, 0.0, 0.86, 0.0, 0.6, 0.0, 0.91, 0.0, 0.96, 0.0, 0.76, 0.0, 0.36, 0.0, 
+
+L2_sTBMV_o_UT
+0.56, 0.45, 0.89, 1.27, 0.74, 0.73, 0.56, 0.62, 0.28, 0.1, 0.15, 0.35, 0.59, 0.46, 0.58, 1.08, 1.71, 
+
+L2_sTBMV_o_UH
+0.56, 0.45, 0.89, 1.27, 0.74, 0.73, 0.56, 0.62, 0.28, 0.1, 0.15, 0.35, 0.59, 0.46, 0.58, 1.08, 1.71, 
+
+L2_dTBMV_A_nn
+0.1, 0.4, 0.8, 0.2, 0.1, 0.1, 0.5, 0.2, 0.3, 0.8, 0.8, 0.4, 0.8, 0.6, 0.9, 0.8, 0.6, 0.4, 0.8, 0.1, 0.8, 0.3, 0.3, 0.6, 0.6, 0.3, 0.8, 0.4, 0.9, 0.3, 0.3, 0.2, 0.7, 0.3, 0.3, 0.8, 0.4, 0.5, 0.5, 0.5, 0.4, 0.4, 0.8, 0.9, 0.4, 0.2, 0.5, 0.0, 0.5, 0.0, 0.0, 
+
+L2_dTBMV_x_n1
+0.1, 0.5, 0.6, 0.9, 0.3, 0.9, 0.7, 0.3, 0.1, 0.1, 0.8, 0.3, 0.7, 0.7, 0.7, 0.2, 0.1, 
+
+L2_dTBMV_x_n2
+0.1, 0.0, 0.5, 0.0, 0.6, 0.0, 0.9, 0.0, 0.3, 0.0, 0.9, 0.0, 0.7, 0.0, 0.3, 0.0, 0.1, 0.0, 0.1, 0.0, 0.8, 0.0, 0.3, 0.0, 0.7, 0.0, 0.7, 0.0, 0.7, 0.0, 0.2, 0.0, 0.1, 0.0, 
+
+L2_dTBMV_o_UN
+0.69, 0.25, 0.57, 1.32, 1.41, 1.26, 0.67, 0.18, 0.73, 0.85, 0.79, 0.86, 0.98, 0.71, 0.78, 0.09, 0.05, 
+
+L2_dTBMV_o_UN2
+0.69, 0.0, 0.25, 0.0, 0.57, 0.0, 1.32, 0.0, 1.41, 0.0, 1.26, 0.0, 0.67, 0.0, 0.18, 0.0, 0.73, 0.0, 0.85, 0.0, 0.79, 0.0, 0.86, 0.0, 0.98, 0.0, 0.71, 0.0, 0.78, 0.0, 0.09, 0.0, 0.05, 0.0, 
+
+L2_dTBMV_o_UT
+0.01, 0.14, 0.43, 0.89, 1.14, 1.26, 1.37, 0.52, 0.71, 0.25, 0.41, 0.28, 0.93, 0.94, 1.19, 0.95, 0.43, 
+
+L2_dTBMV_o_UH
+0.01, 0.14, 0.43, 0.89, 1.14, 1.26, 1.37, 0.52, 0.71, 0.25, 0.41, 0.28, 0.93, 0.94, 1.19, 0.95, 0.43, 
+
+L2_cTBMV_A_nn
+0.40000000596, 0.20000000298, 0.600000023842, 0.10000000149, 0.800000011921, 0.40000000596, 0.10000000149, 0.20000000298, 0.300000011921, 0.899999976158, 0.600000023842, 0.40000000596, 0.899999976158, 0.800000011921, 0.300000011921, 0.699999988079, 0.5, 0.20000000298, 0.40000000596, 0.899999976158, 0.20000000298, 0.5, 0.600000023842, 0.20000000298, 0.40000000596, 0.10000000149, 0.10000000149, 0.699999988079, 0.600000023842, 0.5, 0.800000011921, 0.300000011921, 0.40000000596, 0.20000000298, 0.40000000596, 0.600000023842, 0.600000023842, 0.800000011921, 0.20000000298, 0.800000011921, 0.699999988079, 0.800000011921, 0.600000023842, 0.5, 0.899999976158, 0.300000011921, 0.899999976158, 0.10000000149, 0.5, 0.20000000298, 0.300000011921, 0.5, 0.10000000149, 0.800000011921, 0.5, 0.20000000298, 0.699999988079, 0.40000000596, 0.300000011921, 0.899999976158, 0.10000000149, 0.5, 0.20000000298, 0.800000011921, 0.699999988079, 0.20000000298, 0.699999988079, 0.600000023842, 0.600000023842, 0.40000000596, 0.899999976158, 0.10000000149, 0.300000011921, 0.699999988079, 0.899999976158, 0.40000000596, 0.40000000596, 0.40000000596, 0.40000000596, 0.899999976158, 0.20000000298, 0.800000011921, 0.699999988079, 0.600000023842, 0.899999976158, 0.600000023842, 0.800000011921, 0.699999988079, 0.899999976158, 0.5, 0.5, 0.800000011921, 0.10000000149, 0.10000000149, 0.0, 0.0, 0.600000023842, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 
+
+L2_cTBMV_x_n1
+0.10000000149, 0.40000000596, 0.699999988079, 0.300000011921, 0.600000023842, 0.10000000149, 0.600000023842, 0.20000000298, 0.899999976158, 0.699999988079, 0.899999976158, 0.5, 0.600000023842, 0.10000000149, 0.20000000298, 0.300000011921, 0.20000000298, 0.5, 0.5, 0.20000000298, 0.899999976158, 0.40000000596, 0.20000000298, 0.5, 0.10000000149, 0.10000000149, 0.40000000596, 0.800000011921, 0.5, 0.20000000298, 0.40000000596, 0.800000011921, 0.899999976158, 0.899999976158, 
+
+L2_cTBMV_x_n2
+0.10000000149, 0.40000000596, 0.0, 0.0, 0.699999988079, 0.300000011921, 0.0, 0.0, 0.600000023842, 0.10000000149, 0.0, 0.0, 0.600000023842, 0.20000000298, 0.0, 0.0, 0.899999976158, 0.699999988079, 0.0, 0.0, 0.899999976158, 0.5, 0.0, 0.0, 0.600000023842, 0.10000000149, 0.0, 0.0, 0.20000000298, 0.300000011921, 0.0, 0.0, 0.20000000298, 0.5, 0.0, 0.0, 0.5, 0.20000000298, 0.0, 0.0, 0.899999976158, 0.40000000596, 0.0, 0.0, 0.20000000298, 0.5, 0.0, 0.0, 0.10000000149, 0.10000000149, 0.0, 0.0, 0.40000000596, 0.800000011921, 0.0, 0.0, 0.5, 0.20000000298, 0.0, 0.0, 0.40000000596, 0.800000011921, 0.0, 0.0, 0.899999976158, 0.899999976158, 0.0, 0.0, 
+
+L2_cTBMV_o_UN
+0.790000031739, 0.750000035018, 0.380000038147, 1.1000000298, 0.810000007749, 1.58000002995, 0.330000024736, 1.69000000715, 0.340000028759, 1.40999998689, 0.689999986291, 1.0700000304, -0.179999991953, 1.27000003636, 0.429999980032, 1.02000000581, -0.180000006109, 1.35999999732, 0.289999981821, 1.17000000209, -0.420000009537, 0.839999995977, 0.139999983311, 1.32999999791, 0.119999988675, 1.26000000328, -0.820000016987, 1.92000002444, 0.449999961257, 2.65999997348, -0.440000016093, 0.900000013411, 0.270000003576, 0.810000010729, 
+
+L2_cTBMV_o_UN2
+0.790000031739, 0.750000035018, 0.0, 0.0, 0.380000038147, 1.1000000298, 0.0, 0.0, 0.810000007749, 1.58000002995, 0.0, 0.0, 0.330000024736, 1.69000000715, 0.0, 0.0, 0.340000028759, 1.40999998689, 0.0, 0.0, 0.689999986291, 1.0700000304, 0.0, 0.0, -0.179999991953, 1.27000003636, 0.0, 0.0, 0.429999980032, 1.02000000581, 0.0, 0.0, -0.180000006109, 1.35999999732, 0.0, 0.0, 0.289999981821, 1.17000000209, 0.0, 0.0, -0.420000009537, 0.839999995977, 0.0, 0.0, 0.139999983311, 1.32999999791, 0.0, 0.0, 0.119999988675, 1.26000000328, 0.0, 0.0, -0.820000016987, 1.92000002444, 0.0, 0.0, 0.449999961257, 2.65999997348, 0.0, 0.0, -0.440000016093, 0.900000013411, 0.0, 0.0, 0.270000003576, 0.810000010729, 0.0, 0.0, 
+
+L2_cTBMV_o_UT
+-0.0400000011921, 0.180000005364, 0.0299999986589, 0.420000014752, 0.320000003576, 1.65000001565, 0.470000032634, 1.53000003442, 0.590000012368, 0.880000018775, 0.490000028759, 1.60999999508, 0.730000033677, 1.79000002801, 0.0699999886751, 1.52000005275, 0.429999997914, 1.17000003412, 0.169999998361, 0.740000014603, -0.220000017732, 1.03999999747, -0.330000015795, 1.77999998599, 0.429999975562, 0.940000013113, -0.379999991953, 1.27999999419, -0.230000035167, 1.04000002652, -0.380000036657, 2.03000002623, 0.579999988973, 1.36000001222, 
+
+L2_cTBMV_o_UH
+0.120000003576, 0.140000004172, 0.2300000076, 0.120000014752, 1.34000002503, -0.649999984354, 1.21000004128, -0.949999997765, 0.970000016242, -0.140000016093, 1.85000000969, -0.429999970347, 1.7900000295, -0.429999996424, 1.13000002921, -0.720000016987, 0.970000019968, 0.00999997273087, 0.810000004023, 0.300000007451, 1.14000000492, -0.579999994189, 1.27000002295, -0.799999986589, 1.12999998599, 0.280000012815, 1.23999999523, 0.439999998957, 1.37000001848, -0.280000018775, 2.14000005335, 0.209999992847, 1.48000000387, 0.240000002682, 
+
+L2_zTBMV_A_nn
+0.6, 0.8, 0.6, 0.1, 0.1, 0.3, 0.3, 0.3, 0.1, 0.5, 0.9, 0.9, 0.7, 0.3, 0.6, 0.3, 0.1, 0.1, 0.3, 0.5, 0.1, 0.8, 0.4, 0.2, 0.3, 0.8, 0.9, 0.5, 0.8, 0.8, 0.7, 0.8, 0.6, 0.8, 0.8, 0.8, 0.5, 0.6, 0.6, 0.8, 0.3, 0.2, 0.1, 0.6, 0.8, 0.3, 0.7, 0.7, 0.8, 0.2, 0.3, 0.5, 0.5, 0.2, 0.5, 0.6, 0.5, 0.3, 0.9, 0.6, 0.5, 0.2, 0.3, 0.9, 0.1, 0.8, 0.6, 0.4, 0.8, 0.5, 0.1, 0.4, 0.5, 0.8, 0.8, 0.9, 0.3, 0.7, 0.4, 0.6, 0.6, 0.4, 0.8, 0.2, 0.7, 0.1, 0.2, 0.3, 0.2, 0.8, 0.9, 0.6, 0.9, 0.2, 0.0, 0.0, 0.9, 0.9, 0.0, 0.0, 0.0, 0.0, 
+
+L2_zTBMV_x_n1
+0.1, 0.1, 0.4, 0.6, 0.8, 0.8, 0.2, 0.7, 0.6, 0.1, 0.2, 0.7, 0.3, 0.7, 0.6, 0.5, 0.7, 0.4, 0.2, 0.6, 0.3, 0.3, 0.8, 0.9, 0.2, 0.7, 0.8, 0.4, 0.3, 0.8, 0.8, 0.1, 0.7, 0.7, 
+
+L2_zTBMV_x_n2
+0.1, 0.1, 0.0, 0.0, 0.4, 0.6, 0.0, 0.0, 0.8, 0.8, 0.0, 0.0, 0.2, 0.7, 0.0, 0.0, 0.6, 0.1, 0.0, 0.0, 0.2, 0.7, 0.0, 0.0, 0.3, 0.7, 0.0, 0.0, 0.6, 0.5, 0.0, 0.0, 0.7, 0.4, 0.0, 0.0, 0.2, 0.6, 0.0, 0.0, 0.3, 0.3, 0.0, 0.0, 0.8, 0.9, 0.0, 0.0, 0.2, 0.7, 0.0, 0.0, 0.8, 0.4, 0.0, 0.0, 0.3, 0.8, 0.0, 0.0, 0.8, 0.1, 0.0, 0.0, 0.7, 0.7, 0.0, 0.0, 
+
+L2_zTBMV_o_UN
+0.0, 0.86, -0.83, 1.59, 0.28, 1.35, -0.37, 1.12, -0.39, 2.04, -0.72, 2.19, -0.18, 1.57, -0.08, 1.5, 0.33, 0.95, -0.02, 1.95, -1.02, 1.43, -0.15, 1.88, -0.65, 2.0, 0.56, 1.48, -0.16, 1.55, 1.15, 1.34, 0.0, 1.26, 
+
+L2_zTBMV_o_UN2
+0.0, 0.86, 0.0, 0.0, -0.83, 1.59, 0.0, 0.0, 0.28, 1.35, 0.0, 0.0, -0.37, 1.12, 0.0, 0.0, -0.39, 2.04, 0.0, 0.0, -0.72, 2.19, 0.0, 0.0, -0.18, 1.57, 0.0, 0.0, -0.08, 1.5, 0.0, 0.0, 0.33, 0.95, 0.0, 0.0, -0.02, 1.95, 0.0, 0.0, -1.02, 1.43, 0.0, 0.0, -0.15, 1.88, 0.0, 0.0, -0.65, 2.0, 0.0, 0.0, 0.56, 1.48, 0.0, 0.0, -0.16, 1.55, 0.0, 0.0, 1.15, 1.34, 0.0, 0.0, 0.0, 1.26, 0.0, 0.0, 
+
+L2_zTBMV_o_UT
+-0.02, 0.14, -0.01, 0.37, 0.04, 1.1, -0.23, 1.93, -0.44, 0.9, 0.01, 1.36, -0.31, 1.67, -1.02, 1.79, 0.76, 1.31, -0.18, 1.66, 0.28, 0.91, -0.24, 1.88, -0.48, 1.9, -0.67, 1.79, 0.02, 1.5, 1.04, 1.3, 0.12, 1.91, 
+
+L2_zTBMV_o_UH
+0.14, -0.02, 0.37, 0.11, 1.18, 0.16, 2.03, 0.53, 1.0, -0.54, 1.51, 0.36, 1.81, 0.03, 1.82, 0.27, 1.5, 0.55, 1.64, -0.12, 0.92, 0.39, 1.74, 0.46, 2.02, 0.3, 1.79, -0.17, 1.48, 0.52, 1.8, -0.16, 2.7, -0.15, 
+
+L2_sTRSV_A_nn
+24.0, 28.0, 28.0, 24.0, 8.0, 12.0, 20.0, 32.0, 28.0, 4.0, 24.0, 28.0, 20.0, 36.0, 12.0, 4.0, 24.0, 0.0, 4.0, 28.0, 24.0, 12.0, 4.0, 32.0, 36.0, 8.0, 36.0, 16.0, 20.0, 12.0, 8.0, 36.0, 28.0, 16.0, 0.0, 0.0, 12.0, 16.0, 12.0, 32.0, 20.0, 4.0, 32.0, 24.0, 16.0, 16.0, 28.0, 8.0, 20.0, 8.0, 20.0, 0.0, 0.0, 0.0, 36.0, 4.0, 16.0, 24.0, 12.0, 16.0, 24.0, 20.0, 12.0, 24.0, 20.0, 20.0, 36.0, 4.0, 0.0, 0.0, 0.0, 0.0, 28.0, 20.0, 20.0, 32.0, 20.0, 32.0, 8.0, 24.0, 4.0, 4.0, 24.0, 32.0, 12.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.0, 28.0, 24.0, 36.0, 8.0, 12.0, 4.0, 24.0, 12.0, 36.0, 24.0, 28.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.0, 20.0, 32.0, 20.0, 16.0, 4.0, 16.0, 16.0, 28.0, 36.0, 12.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 28.0, 8.0, 32.0, 20.0, 20.0, 20.0, 32.0, 28.0, 12.0, 32.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 28.0, 24.0, 28.0, 8.0, 36.0, 20.0, 36.0, 4.0, 32.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 24.0, 16.0, 20.0, 4.0, 28.0, 28.0, 28.0, 28.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 20.0, 32.0, 24.0, 16.0, 16.0, 8.0, 36.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 28.0, 28.0, 24.0, 20.0, 12.0, 12.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 24.0, 32.0, 4.0, 20.0, 24.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 24.0, 8.0, 28.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 16.0, 28.0, 32.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 12.0, 
+
+L2_sTRSV_A_nn_pu
+24.0, 28.0, 28.0, 24.0, 8.0, 12.0, 20.0, 32.0, 28.0, 4.0, 24.0, 28.0, 20.0, 36.0, 12.0, 4.0, 24.0, 4.0, 28.0, 24.0, 12.0, 4.0, 32.0, 36.0, 8.0, 36.0, 16.0, 20.0, 12.0, 8.0, 36.0, 28.0, 16.0, 12.0, 16.0, 12.0, 32.0, 20.0, 4.0, 32.0, 24.0, 16.0, 16.0, 28.0, 8.0, 20.0, 8.0, 20.0, 36.0, 4.0, 16.0, 24.0, 12.0, 16.0, 24.0, 20.0, 12.0, 24.0, 20.0, 20.0, 36.0, 4.0, 28.0, 20.0, 20.0, 32.0, 20.0, 32.0, 8.0, 24.0, 4.0, 4.0, 24.0, 32.0, 12.0, 32.0, 28.0, 24.0, 36.0, 8.0, 12.0, 4.0, 24.0, 12.0, 36.0, 24.0, 28.0, 32.0, 20.0, 32.0, 20.0, 16.0, 4.0, 16.0, 16.0, 28.0, 36.0, 12.0, 28.0, 8.0, 32.0, 20.0, 20.0, 20.0, 32.0, 28.0, 12.0, 32.0, 28.0, 24.0, 28.0, 8.0, 36.0, 20.0, 36.0, 4.0, 32.0, 24.0, 16.0, 20.0, 4.0, 28.0, 28.0, 28.0, 28.0, 20.0, 32.0, 24.0, 16.0, 16.0, 8.0, 36.0, 28.0, 28.0, 24.0, 20.0, 12.0, 12.0, 24.0, 32.0, 4.0, 20.0, 24.0, 24.0, 8.0, 28.0, 8.0, 16.0, 28.0, 32.0, 32.0, 4.0, 12.0, 
+
+L2_sTRSV_x_n1
+0.2, 0.8, 0.1, 0.6, 0.5, 0.2, 0.5, 0.1, 0.6, 0.1, 0.8, 0.1, 0.9, 0.9, 0.9, 0.2, 0.9, 
+
+L2_sTRSV_x_n2
+0.2, 0.0, 0.8, 0.0, 0.1, 0.0, 0.6, 0.0, 0.5, 0.0, 0.2, 0.0, 0.5, 0.0, 0.1, 0.0, 0.6, 0.0, 0.1, 0.0, 0.8, 0.0, 0.1, 0.0, 0.9, 0.0, 0.9, 0.0, 0.9, 0.0, 0.2, 0.0, 0.9, 0.0, 
+
+L2_sTRSV_o_UN
+-2.40269, 2.01972, -0.194703, 0.104684, 0.0046076, -0.05174, -0.0637408, -0.0124843, 0.205715, -0.0232726, -0.0867832, 0.0777096, -0.0809462, 0.0455729, -0.0882813, -0.003125, 0.075, 
+
+L2_sTRSV_o_UN2
+-2.40269, 0.0, 2.01972, 0.0, -0.194703, 0.0, 0.104684, 0.0, 0.0046076, 0.0, -0.05174, 0.0, -0.0637408, 0.0, -0.0124843, 0.0, 0.205715, 0.0, -0.0232726, 0.0, -0.0867832, 0.0, 0.0777096, 0.0, -0.0809462, 0.0, 0.0455729, 0.0, -0.0882813, 0.0, -0.003125, 0.0, 0.075, 0.0, 
+
+L2_sTRSV_o_UT
+0.00833333, 0.141667, -0.341667, 0.0685185, 0.0914021, 0.235698, -0.232459, -0.309095, 0.309595, 0.159238, -0.122259, 0.139423, -0.079898, 0.0734248, -0.691031, 0.389425, 1.6854, 
+
+L2_sTRSV_o_UH
+0.00833333, 0.141667, -0.341667, 0.0685185, 0.0914021, 0.235698, -0.232459, -0.309095, 0.309595, 0.159238, -0.122259, 0.139423, -0.079898, 0.0734248, -0.691031, 0.389425, 1.6854, 
+
+L2_dTRSV_A_nn
+24.0, 36.0, 20.0, 28.0, 32.0, 20.0, 32.0, 16.0, 8.0, 16.0, 24.0, 20.0, 36.0, 24.0, 32.0, 12.0, 12.0, 0.0, 32.0, 36.0, 36.0, 8.0, 32.0, 28.0, 20.0, 36.0, 32.0, 24.0, 12.0, 4.0, 4.0, 32.0, 36.0, 28.0, 0.0, 0.0, 4.0, 4.0, 16.0, 16.0, 16.0, 8.0, 12.0, 24.0, 12.0, 20.0, 36.0, 20.0, 20.0, 32.0, 28.0, 0.0, 0.0, 0.0, 20.0, 36.0, 16.0, 12.0, 8.0, 4.0, 8.0, 24.0, 4.0, 24.0, 16.0, 28.0, 24.0, 16.0, 0.0, 0.0, 0.0, 0.0, 16.0, 32.0, 8.0, 20.0, 24.0, 12.0, 20.0, 24.0, 4.0, 36.0, 28.0, 12.0, 12.0, 0.0, 0.0, 0.0, 0.0, 0.0, 12.0, 16.0, 24.0, 16.0, 32.0, 24.0, 4.0, 36.0, 28.0, 8.0, 12.0, 36.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 16.0, 4.0, 20.0, 36.0, 28.0, 24.0, 24.0, 32.0, 28.0, 12.0, 36.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.0, 12.0, 20.0, 24.0, 32.0, 32.0, 12.0, 24.0, 4.0, 32.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.0, 24.0, 8.0, 8.0, 16.0, 24.0, 4.0, 8.0, 36.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.0, 32.0, 36.0, 32.0, 20.0, 12.0, 20.0, 16.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.0, 16.0, 24.0, 36.0, 12.0, 20.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 36.0, 20.0, 20.0, 4.0, 36.0, 16.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.0, 4.0, 24.0, 24.0, 16.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 36.0, 8.0, 20.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 12.0, 8.0, 20.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.0, 
+
+L2_dTRSV_A_nn_pu
+24.0, 36.0, 20.0, 28.0, 32.0, 20.0, 32.0, 16.0, 8.0, 16.0, 24.0, 20.0, 36.0, 24.0, 32.0, 12.0, 12.0, 32.0, 36.0, 36.0, 8.0, 32.0, 28.0, 20.0, 36.0, 32.0, 24.0, 12.0, 4.0, 4.0, 32.0, 36.0, 28.0, 4.0, 4.0, 16.0, 16.0, 16.0, 8.0, 12.0, 24.0, 12.0, 20.0, 36.0, 20.0, 20.0, 32.0, 28.0, 20.0, 36.0, 16.0, 12.0, 8.0, 4.0, 8.0, 24.0, 4.0, 24.0, 16.0, 28.0, 24.0, 16.0, 16.0, 32.0, 8.0, 20.0, 24.0, 12.0, 20.0, 24.0, 4.0, 36.0, 28.0, 12.0, 12.0, 12.0, 16.0, 24.0, 16.0, 32.0, 24.0, 4.0, 36.0, 28.0, 8.0, 12.0, 36.0, 16.0, 4.0, 20.0, 36.0, 28.0, 24.0, 24.0, 32.0, 28.0, 12.0, 36.0, 32.0, 12.0, 20.0, 24.0, 32.0, 32.0, 12.0, 24.0, 4.0, 32.0, 32.0, 24.0, 8.0, 8.0, 16.0, 24.0, 4.0, 8.0, 36.0, 32.0, 32.0, 36.0, 32.0, 20.0, 12.0, 20.0, 16.0, 4.0, 16.0, 24.0, 36.0, 12.0, 20.0, 8.0, 36.0, 20.0, 20.0, 4.0, 36.0, 16.0, 4.0, 4.0, 24.0, 24.0, 16.0, 36.0, 8.0, 20.0, 4.0, 12.0, 8.0, 20.0, 4.0, 4.0, 32.0, 
+
+L2_dTRSV_x_n1
+0.7, 0.3, 0.2, 0.1, 0.9, 0.9, 0.7, 0.4, 0.8, 0.9, 0.6, 0.6, 0.7, 0.3, 0.7, 0.2, 0.2, 
+
+L2_dTRSV_x_n2
+0.7, 0.0, 0.3, 0.0, 0.2, 0.0, 0.1, 0.0, 0.9, 0.0, 0.9, 0.0, 0.7, 0.0, 0.4, 0.0, 0.8, 0.0, 0.9, 0.0, 0.6, 0.0, 0.6, 0.0, 0.7, 0.0, 0.3, 0.0, 0.7, 0.0, 0.2, 0.0, 0.2, 0.0, 
+
+L2_dTRSV_o_UN
+11.4385137035, -12.228712972, 6.48869547526, 3.95473442925, -2.9291273329, 1.00749782986, -0.137443033854, -0.249099392361, 0.473177083333, -0.799652777778, 0.902777777778, 0.0930555555556, -0.204166666667, -0.0208333333333, 0.01875, 0.04375, 0.00625, 
+
+L2_dTRSV_o_UN2
+11.4385137035, 0.0, -12.228712972, 0.0, 6.48869547526, 0.0, 3.95473442925, 0.0, -2.9291273329, 0.0, 1.00749782986, 0.0, -0.137443033854, 0.0, -0.249099392361, 0.0, 0.473177083333, 0.0, -0.799652777778, 0.0, 0.902777777778, 0.0, 0.0930555555556, 0.0, -0.204166666667, 0.0, -0.0208333333333, 0.0, 0.01875, 0.0, 0.04375, 0.0, 0.00625, 0.0, 
+
+L2_dTRSV_o_UT
+0.0291666666667, -0.0234375, 0.115104166667, -0.0166666666667, -0.06796875, 0.138888888889, -0.181076388889, -0.0510959201389, 0.11686062283, -0.0105824788411, 0.801871744792, -0.229576845522, -4.73293445728, -0.147588847596, 9.29135302634, 8.1630378001, -4.60693336769, 
+
+L2_dTRSV_o_UH
+0.0291666666667, -0.0234375, 0.115104166667, -0.0166666666667, -0.06796875, 0.138888888889, -0.181076388889, -0.0510959201389, 0.11686062283, -0.0105824788411, 0.801871744792, -0.229576845522, -4.73293445728, -0.147588847596, 9.29135302634, 8.1630378001, -4.60693336769, 
+
+L2_cTRSV_A_nn
+36.0, 36.0, 16.0, 8.0, 28.0, 16.0, 36.0, 16.0, 32.0, 8.0, 20.0, 36.0, 20.0, 24.0, 36.0, 16.0, 32.0, 8.0, 32.0, 16.0, 28.0, 20.0, 28.0, 24.0, 24.0, 16.0, 20.0, 16.0, 20.0, 20.0, 28.0, 4.0, 8.0, 4.0, 0.0, 0.0, 12.0, 32.0, 36.0, 8.0, 12.0, 24.0, 36.0, 36.0, 32.0, 12.0, 16.0, 20.0, 36.0, 20.0, 8.0, 4.0, 8.0, 16.0, 28.0, 24.0, 8.0, 20.0, 20.0, 4.0, 36.0, 36.0, 20.0, 32.0, 36.0, 32.0, 36.0, 20.0, 0.0, 0.0, 0.0, 0.0, 20.0, 8.0, 36.0, 28.0, 28.0, 24.0, 8.0, 8.0, 12.0, 8.0, 16.0, 8.0, 16.0, 4.0, 36.0, 32.0, 24.0, 4.0, 16.0, 4.0, 12.0, 24.0, 28.0, 24.0, 16.0, 8.0, 32.0, 20.0, 28.0, 36.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.0, 16.0, 16.0, 36.0, 8.0, 20.0, 8.0, 20.0, 28.0, 20.0, 4.0, 12.0, 32.0, 32.0, 28.0, 16.0, 28.0, 24.0, 20.0, 16.0, 4.0, 20.0, 28.0, 12.0, 36.0, 4.0, 12.0, 16.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 36.0, 36.0, 32.0, 8.0, 20.0, 12.0, 24.0, 8.0, 16.0, 32.0, 20.0, 32.0, 36.0, 20.0, 20.0, 24.0, 16.0, 8.0, 16.0, 28.0, 12.0, 32.0, 32.0, 36.0, 8.0, 24.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 36.0, 28.0, 8.0, 8.0, 32.0, 20.0, 32.0, 8.0, 28.0, 16.0, 16.0, 36.0, 8.0, 20.0, 24.0, 8.0, 20.0, 12.0, 8.0, 16.0, 36.0, 12.0, 28.0, 16.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 20.0, 28.0, 24.0, 4.0, 32.0, 28.0, 28.0, 12.0, 20.0, 36.0, 4.0, 28.0, 24.0, 24.0, 4.0, 4.0, 36.0, 20.0, 20.0, 24.0, 24.0, 36.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 20.0, 12.0, 8.0, 16.0, 24.0, 20.0, 8.0, 24.0, 28.0, 16.0, 4.0, 8.0, 24.0, 8.0, 36.0, 36.0, 36.0, 24.0, 4.0, 24.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 12.0, 32.0, 16.0, 36.0, 28.0, 12.0, 32.0, 32.0, 20.0, 16.0, 16.0, 8.0, 24.0, 28.0, 24.0, 24.0, 24.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 20.0, 8.0, 4.0, 32.0, 28.0, 12.0, 8.0, 28.0, 8.0, 20.0, 16.0, 8.0, 16.0, 20.0, 4.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 24.0, 4.0, 12.0, 28.0, 4.0, 12.0, 28.0, 24.0, 28.0, 12.0, 28.0, 8.0, 20.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 12.0, 32.0, 16.0, 16.0, 4.0, 8.0, 32.0, 36.0, 12.0, 20.0, 4.0, 16.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 24.0, 8.0, 20.0, 8.0, 16.0, 16.0, 8.0, 24.0, 36.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 24.0, 16.0, 36.0, 28.0, 8.0, 28.0, 28.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.0, 20.0, 32.0, 32.0, 8.0, 12.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 8.0, 8.0, 12.0, 12.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 20.0, 4.0, 
+
+L2_cTRSV_A_nn_pu
+36.0, 36.0, 16.0, 8.0, 28.0, 16.0, 36.0, 16.0, 32.0, 8.0, 20.0, 36.0, 20.0, 24.0, 36.0, 16.0, 32.0, 8.0, 32.0, 16.0, 28.0, 20.0, 28.0, 24.0, 24.0, 16.0, 20.0, 16.0, 20.0, 20.0, 28.0, 4.0, 8.0, 4.0, 12.0, 32.0, 36.0, 8.0, 12.0, 24.0, 36.0, 36.0, 32.0, 12.0, 16.0, 20.0, 36.0, 20.0, 8.0, 4.0, 8.0, 16.0, 28.0, 24.0, 8.0, 20.0, 20.0, 4.0, 36.0, 36.0, 20.0, 32.0, 36.0, 32.0, 36.0, 20.0, 20.0, 8.0, 36.0, 28.0, 28.0, 24.0, 8.0, 8.0, 12.0, 8.0, 16.0, 8.0, 16.0, 4.0, 36.0, 32.0, 24.0, 4.0, 16.0, 4.0, 12.0, 24.0, 28.0, 24.0, 16.0, 8.0, 32.0, 20.0, 28.0, 36.0, 4.0, 16.0, 16.0, 36.0, 8.0, 20.0, 8.0, 20.0, 28.0, 20.0, 4.0, 12.0, 32.0, 32.0, 28.0, 16.0, 28.0, 24.0, 20.0, 16.0, 4.0, 20.0, 28.0, 12.0, 36.0, 4.0, 12.0, 16.0, 36.0, 36.0, 32.0, 8.0, 20.0, 12.0, 24.0, 8.0, 16.0, 32.0, 20.0, 32.0, 36.0, 20.0, 20.0, 24.0, 16.0, 8.0, 16.0, 28.0, 12.0, 32.0, 32.0, 36.0, 8.0, 24.0, 36.0, 28.0, 8.0, 8.0, 32.0, 20.0, 32.0, 8.0, 28.0, 16.0, 16.0, 36.0, 8.0, 20.0, 24.0, 8.0, 20.0, 12.0, 8.0, 16.0, 36.0, 12.0, 28.0, 16.0, 20.0, 28.0, 24.0, 4.0, 32.0, 28.0, 28.0, 12.0, 20.0, 36.0, 4.0, 28.0, 24.0, 24.0, 4.0, 4.0, 36.0, 20.0, 20.0, 24.0, 24.0, 36.0, 20.0, 12.0, 8.0, 16.0, 24.0, 20.0, 8.0, 24.0, 28.0, 16.0, 4.0, 8.0, 24.0, 8.0, 36.0, 36.0, 36.0, 24.0, 4.0, 24.0, 12.0, 32.0, 16.0, 36.0, 28.0, 12.0, 32.0, 32.0, 20.0, 16.0, 16.0, 8.0, 24.0, 28.0, 24.0, 24.0, 24.0, 4.0, 20.0, 8.0, 4.0, 32.0, 28.0, 12.0, 8.0, 28.0, 8.0, 20.0, 16.0, 8.0, 16.0, 20.0, 4.0, 8.0, 24.0, 4.0, 12.0, 28.0, 4.0, 12.0, 28.0, 24.0, 28.0, 12.0, 28.0, 8.0, 20.0, 8.0, 12.0, 32.0, 16.0, 16.0, 4.0, 8.0, 32.0, 36.0, 12.0, 20.0, 4.0, 16.0, 24.0, 8.0, 20.0, 8.0, 16.0, 16.0, 8.0, 24.0, 36.0, 8.0, 24.0, 16.0, 36.0, 28.0, 8.0, 28.0, 28.0, 8.0, 32.0, 20.0, 32.0, 32.0, 8.0, 12.0, 8.0, 8.0, 12.0, 12.0, 20.0, 4.0, 
+
+L2_cTRSV_x_n1
+0.800000011921, 0.800000011921, 0.10000000149, 0.300000011921, 0.600000023842, 0.699999988079, 0.300000011921, 0.10000000149, 0.10000000149, 0.20000000298, 0.20000000298, 0.300000011921, 0.10000000149, 0.10000000149, 0.300000011921, 0.300000011921, 0.20000000298, 0.300000011921, 0.600000023842, 0.5, 0.899999976158, 0.800000011921, 0.699999988079, 0.600000023842, 0.10000000149, 0.10000000149, 0.10000000149, 0.300000011921, 0.40000000596, 0.300000011921, 0.699999988079, 0.899999976158, 0.10000000149, 0.20000000298, 
+
+L2_cTRSV_x_n2
+0.800000011921, 0.800000011921, 0.0, 0.0, 0.10000000149, 0.300000011921, 0.0, 0.0, 0.600000023842, 0.699999988079, 0.0, 0.0, 0.300000011921, 0.10000000149, 0.0, 0.0, 0.10000000149, 0.20000000298, 0.0, 0.0, 0.20000000298, 0.300000011921, 0.0, 0.0, 0.10000000149, 0.10000000149, 0.0, 0.0, 0.300000011921, 0.300000011921, 0.0, 0.0, 0.20000000298, 0.300000011921, 0.0, 0.0, 0.600000023842, 0.5, 0.0, 0.0, 0.899999976158, 0.800000011921, 0.0, 0.0, 0.699999988079, 0.600000023842, 0.0, 0.0, 0.10000000149, 0.10000000149, 0.0, 0.0, 0.10000000149, 0.300000011921, 0.0, 0.0, 0.40000000596, 0.300000011921, 0.0, 0.0, 0.699999988079, 0.899999976158, 0.0, 0.0, 0.10000000149, 0.20000000298, 0.0, 0.0, 
+
+L2_cTRSV_o_UN
+0.594933566964, -0.315019222695, -1.01289503455, -0.527617393149, -0.28430160669, 1.43833818036, 0.173852765488, -0.810668303673, -0.0911287027816, -0.107413567973, 0.0938391484999, 0.0905342581104, -0.0131405830986, 0.0756930302523, -0.0906741384626, 0.0651067764121, 0.206488087396, -0.27259336822, -0.151479130295, 0.291555146095, -0.158686981083, -0.0655027960141, 0.119051667585, -0.0182250461356, -0.0594643999837, -0.0214315033817, 0.0735765960864, -0.00521013472739, -0.0929667214656, -0.0266313723803, 0.0899038437682, -0.000480770169256, 0.00673076933107, 0.0086538462828, 
+
+L2_cTRSV_o_UN2
+0.594933566964, -0.315019222695, 0.0, 0.0, -1.01289503455, -0.527617393149, 0.0, 0.0, -0.28430160669, 1.43833818036, 0.0, 0.0, 0.173852765488, -0.810668303673, 0.0, 0.0, -0.0911287027816, -0.107413567973, 0.0, 0.0, 0.0938391484999, 0.0905342581104, 0.0, 0.0, -0.0131405830986, 0.0756930302523, 0.0, 0.0, -0.0906741384626, 0.0651067764121, 0.0, 0.0, 0.206488087396, -0.27259336822, 0.0, 0.0, -0.151479130295, 0.291555146095, 0.0, 0.0, -0.158686981083, -0.0655027960141, 0.0, 0.0, 0.119051667585, -0.0182250461356, 0.0, 0.0, -0.0594643999837, -0.0214315033817, 0.0, 0.0, 0.0735765960864, -0.00521013472739, 0.0, 0.0, -0.0929667214656, -0.0266313723803, 0.0, 0.0, 0.0899038437682, -0.000480770169256, 0.0, 0.0, 0.00673076933107, 0.0086538462828, 0.0, 0.0, 
+
+L2_cTRSV_o_UT
+0.0222222225534, 0.0, 0.000722983472129, 0.00825723003216, 0.00148139391917, 0.00147745634686, -0.0321927824925, 0.0121057846439, 0.0165590884117, -0.000246312854666, -0.00851089877641, -0.00377372562026, -0.00362477871118, -0.00282459746629, 0.026956984416, -0.00873253174881, -0.00990029188872, 0.0143110987186, 0.0553322087818, -0.00981568541087, 0.00107993786542, -0.0883967226031, -0.0165171394379, 0.0960778411503, -0.0103183345591, -0.110338024807, -0.0232084033053, 0.148210184476, 0.0698025092923, -0.17763135155, -0.0632964177877, 0.588402352205, 0.319569918938, -0.323324580596, 
+
+L2_cTRSV_o_UH
+0.0, 0.0222222225534, 0.000722983063878, -0.00270167424073, 0.00722852194437, 0.0119325034659, 0.0428804602116, -0.0478281182381, -0.0169457796429, 0.0319569268372, 0.00276812767431, 0.00201685861762, -0.00146435426717, -0.00046826879169, -0.0325393550607, 0.0189311969316, 0.0389615566629, -0.0325025624574, -0.0369859311847, 0.0925037321174, -0.157063281758, -0.0484729195251, 0.153439961314, 0.039218306506, -0.193450545686, -0.0687363086255, 0.264967311446, 0.0513555138895, -0.300406005324, 0.00917295898706, 0.905211268549, 0.167336111703, -0.630807531883, 0.314511320045, 
+
+L2_zTRSV_A_nn
+24.0, 16.0, 16.0, 20.0, 36.0, 36.0, 36.0, 4.0, 32.0, 36.0, 24.0, 24.0, 32.0, 4.0, 12.0, 36.0, 28.0, 4.0, 36.0, 32.0, 28.0, 16.0, 24.0, 36.0, 20.0, 12.0, 24.0, 12.0, 20.0, 16.0, 8.0, 8.0, 24.0, 36.0, 0.0, 0.0, 24.0, 4.0, 12.0, 16.0, 32.0, 8.0, 32.0, 4.0, 4.0, 4.0, 28.0, 36.0, 8.0, 16.0, 20.0, 36.0, 16.0, 32.0, 16.0, 4.0, 24.0, 12.0, 12.0, 36.0, 8.0, 20.0, 4.0, 36.0, 28.0, 20.0, 24.0, 24.0, 0.0, 0.0, 0.0, 0.0, 36.0, 8.0, 16.0, 4.0, 20.0, 28.0, 20.0, 24.0, 36.0, 20.0, 12.0, 4.0, 24.0, 16.0, 4.0, 24.0, 16.0, 24.0, 8.0, 32.0, 32.0, 24.0, 32.0, 32.0, 8.0, 12.0, 4.0, 12.0, 32.0, 20.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 8.0, 28.0, 32.0, 4.0, 12.0, 12.0, 32.0, 12.0, 4.0, 36.0, 16.0, 24.0, 24.0, 36.0, 24.0, 20.0, 4.0, 16.0, 12.0, 4.0, 8.0, 20.0, 36.0, 4.0, 8.0, 32.0, 24.0, 12.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 20.0, 36.0, 16.0, 4.0, 20.0, 36.0, 24.0, 20.0, 32.0, 16.0, 12.0, 8.0, 8.0, 8.0, 12.0, 24.0, 28.0, 28.0, 12.0, 12.0, 8.0, 8.0, 8.0, 32.0, 16.0, 20.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 16.0, 32.0, 32.0, 16.0, 36.0, 32.0, 8.0, 12.0, 28.0, 4.0, 12.0, 8.0, 8.0, 12.0, 8.0, 36.0, 12.0, 32.0, 28.0, 4.0, 16.0, 12.0, 20.0, 12.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 36.0, 36.0, 12.0, 32.0, 20.0, 4.0, 20.0, 36.0, 12.0, 12.0, 16.0, 4.0, 16.0, 8.0, 12.0, 12.0, 16.0, 8.0, 4.0, 12.0, 16.0, 24.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 12.0, 36.0, 16.0, 16.0, 32.0, 12.0, 12.0, 36.0, 24.0, 8.0, 12.0, 8.0, 36.0, 4.0, 12.0, 28.0, 24.0, 8.0, 12.0, 28.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 36.0, 4.0, 12.0, 12.0, 32.0, 32.0, 4.0, 8.0, 32.0, 8.0, 20.0, 8.0, 16.0, 4.0, 24.0, 20.0, 28.0, 20.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 28.0, 28.0, 28.0, 16.0, 20.0, 20.0, 4.0, 32.0, 20.0, 28.0, 36.0, 24.0, 8.0, 20.0, 16.0, 28.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.0, 28.0, 28.0, 28.0, 32.0, 24.0, 24.0, 12.0, 12.0, 4.0, 4.0, 4.0, 36.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.0, 24.0, 36.0, 12.0, 32.0, 36.0, 28.0, 28.0, 4.0, 16.0, 36.0, 32.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.0, 24.0, 36.0, 32.0, 28.0, 12.0, 20.0, 28.0, 36.0, 12.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 28.0, 28.0, 12.0, 8.0, 8.0, 12.0, 36.0, 32.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 24.0, 4.0, 4.0, 16.0, 32.0, 32.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 24.0, 32.0, 20.0, 28.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 24.0, 4.0, 
+
+L2_zTRSV_A_nn_pu
+24.0, 16.0, 16.0, 20.0, 36.0, 36.0, 36.0, 4.0, 32.0, 36.0, 24.0, 24.0, 32.0, 4.0, 12.0, 36.0, 28.0, 4.0, 36.0, 32.0, 28.0, 16.0, 24.0, 36.0, 20.0, 12.0, 24.0, 12.0, 20.0, 16.0, 8.0, 8.0, 24.0, 36.0, 24.0, 4.0, 12.0, 16.0, 32.0, 8.0, 32.0, 4.0, 4.0, 4.0, 28.0, 36.0, 8.0, 16.0, 20.0, 36.0, 16.0, 32.0, 16.0, 4.0, 24.0, 12.0, 12.0, 36.0, 8.0, 20.0, 4.0, 36.0, 28.0, 20.0, 24.0, 24.0, 36.0, 8.0, 16.0, 4.0, 20.0, 28.0, 20.0, 24.0, 36.0, 20.0, 12.0, 4.0, 24.0, 16.0, 4.0, 24.0, 16.0, 24.0, 8.0, 32.0, 32.0, 24.0, 32.0, 32.0, 8.0, 12.0, 4.0, 12.0, 32.0, 20.0, 8.0, 28.0, 32.0, 4.0, 12.0, 12.0, 32.0, 12.0, 4.0, 36.0, 16.0, 24.0, 24.0, 36.0, 24.0, 20.0, 4.0, 16.0, 12.0, 4.0, 8.0, 20.0, 36.0, 4.0, 8.0, 32.0, 24.0, 12.0, 20.0, 36.0, 16.0, 4.0, 20.0, 36.0, 24.0, 20.0, 32.0, 16.0, 12.0, 8.0, 8.0, 8.0, 12.0, 24.0, 28.0, 28.0, 12.0, 12.0, 8.0, 8.0, 8.0, 32.0, 16.0, 20.0, 16.0, 32.0, 32.0, 16.0, 36.0, 32.0, 8.0, 12.0, 28.0, 4.0, 12.0, 8.0, 8.0, 12.0, 8.0, 36.0, 12.0, 32.0, 28.0, 4.0, 16.0, 12.0, 20.0, 12.0, 36.0, 36.0, 12.0, 32.0, 20.0, 4.0, 20.0, 36.0, 12.0, 12.0, 16.0, 4.0, 16.0, 8.0, 12.0, 12.0, 16.0, 8.0, 4.0, 12.0, 16.0, 24.0, 12.0, 36.0, 16.0, 16.0, 32.0, 12.0, 12.0, 36.0, 24.0, 8.0, 12.0, 8.0, 36.0, 4.0, 12.0, 28.0, 24.0, 8.0, 12.0, 28.0, 36.0, 4.0, 12.0, 12.0, 32.0, 32.0, 4.0, 8.0, 32.0, 8.0, 20.0, 8.0, 16.0, 4.0, 24.0, 20.0, 28.0, 20.0, 28.0, 28.0, 28.0, 16.0, 20.0, 20.0, 4.0, 32.0, 20.0, 28.0, 36.0, 24.0, 8.0, 20.0, 16.0, 28.0, 4.0, 28.0, 28.0, 28.0, 32.0, 24.0, 24.0, 12.0, 12.0, 4.0, 4.0, 4.0, 36.0, 8.0, 4.0, 24.0, 36.0, 12.0, 32.0, 36.0, 28.0, 28.0, 4.0, 16.0, 36.0, 32.0, 32.0, 24.0, 36.0, 32.0, 28.0, 12.0, 20.0, 28.0, 36.0, 12.0, 28.0, 28.0, 12.0, 8.0, 8.0, 12.0, 36.0, 32.0, 24.0, 4.0, 4.0, 16.0, 32.0, 32.0, 24.0, 32.0, 20.0, 28.0, 24.0, 4.0, 
+
+L2_zTRSV_x_n1
+0.5, 0.2, 0.5, 0.5, 0.8, 0.6, 0.5, 0.4, 0.7, 0.8, 0.8, 0.6, 0.6, 0.9, 0.6, 0.7, 0.3, 0.8, 0.5, 0.7, 0.6, 0.9, 0.9, 0.3, 0.3, 0.1, 0.6, 0.3, 0.7, 0.8, 0.9, 0.2, 0.5, 0.2, 
+
+L2_zTRSV_x_n2
+0.5, 0.2, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.8, 0.6, 0.0, 0.0, 0.5, 0.4, 0.0, 0.0, 0.7, 0.8, 0.0, 0.0, 0.8, 0.6, 0.0, 0.0, 0.6, 0.9, 0.0, 0.0, 0.6, 0.7, 0.0, 0.0, 0.3, 0.8, 0.0, 0.0, 0.5, 0.7, 0.0, 0.0, 0.6, 0.9, 0.0, 0.0, 0.9, 0.3, 0.0, 0.0, 0.3, 0.1, 0.0, 0.0, 0.6, 0.3, 0.0, 0.0, 0.7, 0.8, 0.0, 0.0, 0.9, 0.2, 0.0, 0.0, 0.5, 0.2, 0.0, 0.0, 
+
+L2_zTRSV_o_UN
+-0.117782452318, -0.112026835825, 0.00381797959204, 0.00792418146995, 0.0447425590052, -0.0727856782286, -0.0733041598802, 0.0803069249097, 0.0157904572008, 0.0210530076009, 0.0108108011673, 0.062824650788, 0.0250326465768, 0.00144442830828, 0.0106845239065, -0.0334233841644, -0.0506804969493, -0.0410505909674, -0.00931030768772, 0.0289467583966, 0.060236627361, 0.00219814254409, -0.0175502974016, -0.0318983095064, -0.00268201502661, 0.0184899561724, -0.00974741730147, -0.00401925284358, -0.00567896274653, 0.00306135865595, -0.001, -0.0195, 0.0216216216216, 0.00472972972973, 
+
+L2_zTRSV_o_UN2
+-0.117782452318, -0.112026835825, 0.0, 0.0, 0.00381797959204, 0.00792418146995, 0.0, 0.0, 0.0447425590052, -0.0727856782286, 0.0, 0.0, -0.0733041598802, 0.0803069249097, 0.0, 0.0, 0.0157904572008, 0.0210530076009, 0.0, 0.0, 0.0108108011673, 0.062824650788, 0.0, 0.0, 0.0250326465768, 0.00144442830828, 0.0, 0.0, 0.0106845239065, -0.0334233841644, 0.0, 0.0, -0.0506804969493, -0.0410505909674, 0.0, 0.0, -0.00931030768772, 0.0289467583966, 0.0, 0.0, 0.060236627361, 0.00219814254409, 0.0, 0.0, -0.0175502974016, -0.0318983095064, 0.0, 0.0, -0.00268201502661, 0.0184899561724, 0.0, 0.0, -0.00974741730147, -0.00401925284358, 0.0, 0.0, -0.00567896274653, 0.00306135865595, 0.0, 0.0, -0.001, -0.0195, 0.0, 0.0, 0.0216216216216, 0.00472972972973, 0.0, 0.0, 
+
+L2_zTRSV_o_UT
+0.0182692307692, -0.00384615384615, 0.00662681912682, 0.00706860706861, 0.000343035343035, -0.0031340956341, 0.00448780057271, 0.013661201114, -0.0128687777037, 0.00369625975758, 0.00719757629545, -0.012641374593, 0.0108229274267, 0.0115987885563, -0.00265416786525, -0.020885148029, -0.00172173509619, 0.0113541605254, 0.00109700943918, -0.00858587046508, 0.0101682777897, 0.0186443889184, -0.0281381989712, -0.016837557351, 0.0012046368883, -0.0197832517297, 0.0268252893523, 0.0439875141638, -0.0140740190926, 0.0515215838321, 0.0289779557733, -0.027294391418, 0.00333242458548, -0.14092609678, 
+
+L2_zTRSV_o_UH
+0.0105769230769, 0.0153846153846, -0.00220893970894, 0.0190228690229, -0.0118790509967, 0.00189647792589, 0.0284337742079, -0.00245699511515, -0.00849250140177, -0.0206510062739, -0.0159887222502, 0.0145098488685, 0.0130575854605, -0.00530441170702, -0.0320986394862, 0.0241269063715, -0.0106011857456, -0.00358290866981, 0.000217611862516, -0.00178943302941, 0.0323917365637, -0.0140144534922, -0.00553998052406, 0.0178351801378, -0.000818170373114, -0.0236781122664, 0.0264375795928, 0.00865952061921, -0.0685576112938, -0.0252999785684, 0.0647926233732, 0.0362570666294, -0.0759178018159, -0.0275969662468, 
+
+L2_sTBSV_A_nn
+16.0, 20.0, 16.0, 20.0, 24.0, 36.0, 28.0, 8.0, 12.0, 28.0, 32.0, 24.0, 28.0, 4.0, 4.0, 4.0, 20.0, 28.0, 12.0, 4.0, 20.0, 24.0, 8.0, 32.0, 20.0, 12.0, 36.0, 24.0, 32.0, 32.0, 20.0, 8.0, 12.0, 12.0, 12.0, 8.0, 12.0, 28.0, 36.0, 4.0, 20.0, 8.0, 8.0, 24.0, 20.0, 36.0, 8.0, 0.0, 20.0, 0.0, 0.0, 
+
+L2_sTBSV_x_n1
+0.2, 0.6, 0.1, 0.6, 0.2, 0.9, 0.5, 0.2, 0.2, 0.6, 0.3, 0.3, 0.1, 0.3, 0.2, 0.7, 0.7, 
+
+L2_sTBSV_x_n2
+0.2, 0.0, 0.6, 0.0, 0.1, 0.0, 0.6, 0.0, 0.2, 0.0, 0.9, 0.0, 0.5, 0.0, 0.2, 0.0, 0.2, 0.0, 0.6, 0.0, 0.3, 0.0, 0.3, 0.0, 0.1, 0.0, 0.3, 0.0, 0.2, 0.0, 0.7, 0.0, 0.7, 0.0, 
+
+L2_sTBSV_o_UN
+10.3602, -6.72359, -1.94319, 5.04746, 1.17748, -7.43367, -0.758667, 1.636, 0.153, -1.259, 0.340222, 0.622778, -0.957222, 0.539167, -0.0975, 0.0116667, 0.035, 
+
+L2_sTBSV_o_UN2
+10.3602, 0.0, -6.72359, 0.0, -1.94319, 0.0, 5.04746, 0.0, 1.17748, 0.0, -7.43367, 0.0, -0.758667, 0.0, 1.636, 0.0, 0.153, 0.0, -1.259, 0.0, 0.340222, 0.0, 0.622778, 0.0, -0.957222, 0.0, 0.539167, 0.0, -0.0975, 0.0, 0.0116667, 0.0, 0.035, 0.0, 
+
+L2_sTBSV_o_UT
+0.0125, 0.0175, -0.0185714, 0.0042347, 0.0102624, 0.189329, -0.277303, -0.166334, 0.353837, 0.0698601, -0.733682, 0.327828, 0.414188, -3.47997, 6.86108, -3.78128, -5.31357, 
+
+L2_sTBSV_o_UH
+0.0125, 0.0175, -0.0185714, 0.0042347, 0.0102624, 0.189329, -0.277303, -0.166334, 0.353837, 0.0698601, -0.733682, 0.327828, 0.414188, -3.47997, 6.86108, -3.78128, -5.31357, 
+
+L2_dTBSV_A_nn
+8.0, 12.0, 12.0, 36.0, 36.0, 36.0, 8.0, 28.0, 16.0, 28.0, 12.0, 12.0, 36.0, 36.0, 8.0, 32.0, 12.0, 12.0, 24.0, 32.0, 28.0, 16.0, 8.0, 8.0, 16.0, 12.0, 16.0, 16.0, 12.0, 4.0, 8.0, 20.0, 20.0, 12.0, 36.0, 32.0, 8.0, 32.0, 20.0, 36.0, 12.0, 12.0, 36.0, 8.0, 12.0, 32.0, 24.0, 0.0, 12.0, 0.0, 0.0, 
+
+L2_dTBSV_x_n1
+0.6, 0.8, 0.6, 0.1, 0.8, 0.8, 0.5, 0.7, 0.3, 0.8, 0.5, 0.2, 0.3, 0.2, 0.7, 0.6, 0.3, 
+
+L2_dTBSV_x_n2
+0.6, 0.0, 0.8, 0.0, 0.6, 0.0, 0.1, 0.0, 0.8, 0.0, 0.8, 0.0, 0.5, 0.0, 0.7, 0.0, 0.3, 0.0, 0.8, 0.0, 0.5, 0.0, 0.2, 0.0, 0.3, 0.0, 0.2, 0.0, 0.7, 0.0, 0.6, 0.0, 0.3, 0.0, 
+
+L2_dTBSV_o_UN
+0.0315060534245, -0.036767906644, 0.0657638710277, -0.00677374216147, 0.0164721132687, 0.00766661844136, -0.00862429269547, 0.0548466435185, -0.0374324845679, 0.0152391975309, 0.0447530864198, 0.00478395061728, 0.00231481481481, 0.00185185185185, 0.0111111111111, 0.0, 0.025, 
+
+L2_dTBSV_o_UN2
+0.0315060534245, 0.0, -0.036767906644, 0.0, 0.0657638710277, 0.0, -0.00677374216147, 0.0, 0.0164721132687, 0.0, 0.00766661844136, 0.0, -0.00862429269547, 0.0, 0.0548466435185, 0.0, -0.0374324845679, 0.0, 0.0152391975309, 0.0, 0.0447530864198, 0.0, 0.00478395061728, 0.0, 0.00231481481481, 0.0, 0.00185185185185, 0.0, 0.0111111111111, 0.0, 0.0, 0.0, 0.025, 0.0, 
+
+L2_dTBSV_o_UT
+0.075, -0.00277777777778, -0.025, 0.0321428571429, 0.022619047619, -0.0125, 0.0195436507937, 0.0140376984127, -0.0224702380952, 0.0598338293651, 0.0176897321429, -0.0327608300265, 0.140699404762, -0.0903898442093, -0.0285919434646, 0.0597941774446, -0.0659964114247, 
+
+L2_dTBSV_o_UH
+0.075, -0.00277777777778, -0.025, 0.0321428571429, 0.022619047619, -0.0125, 0.0195436507937, 0.0140376984127, -0.0224702380952, 0.0598338293651, 0.0176897321429, -0.0327608300265, 0.140699404762, -0.0903898442093, -0.0285919434646, 0.0597941774446, -0.0659964114247, 
+
+L2_cTBSV_A_nn
+12.0, 28.0, 28.0, 32.0, 16.0, 20.0, 20.0, 32.0, 4.0, 16.0, 28.0, 28.0, 8.0, 28.0, 20.0, 16.0, 32.0, 28.0, 4.0, 8.0, 32.0, 4.0, 16.0, 24.0, 28.0, 8.0, 32.0, 8.0, 8.0, 20.0, 20.0, 4.0, 16.0, 12.0, 32.0, 16.0, 8.0, 16.0, 8.0, 20.0, 24.0, 28.0, 4.0, 32.0, 16.0, 32.0, 8.0, 24.0, 28.0, 28.0, 32.0, 32.0, 20.0, 24.0, 28.0, 24.0, 32.0, 24.0, 36.0, 36.0, 32.0, 32.0, 20.0, 20.0, 12.0, 8.0, 32.0, 36.0, 16.0, 16.0, 24.0, 4.0, 16.0, 8.0, 36.0, 8.0, 32.0, 32.0, 28.0, 28.0, 28.0, 20.0, 36.0, 32.0, 28.0, 8.0, 24.0, 20.0, 12.0, 20.0, 32.0, 12.0, 16.0, 16.0, 0.0, 0.0, 8.0, 36.0, 0.0, 0.0, 0.0, 0.0, 
+
+L2_cTBSV_x_n1
+0.600000023842, 0.10000000149, 0.699999988079, 0.10000000149, 0.800000011921, 0.899999976158, 0.800000011921, 0.600000023842, 0.800000011921, 0.899999976158, 0.40000000596, 0.800000011921, 0.899999976158, 0.600000023842, 0.800000011921, 0.300000011921, 0.800000011921, 0.699999988079, 0.40000000596, 0.40000000596, 0.600000023842, 0.5, 0.899999976158, 0.699999988079, 0.40000000596, 0.800000011921, 0.600000023842, 0.899999976158, 0.300000011921, 0.600000023842, 0.800000011921, 0.300000011921, 0.699999988079, 0.300000011921, 
+
+L2_cTBSV_x_n2
+0.600000023842, 0.10000000149, 0.0, 0.0, 0.699999988079, 0.10000000149, 0.0, 0.0, 0.800000011921, 0.899999976158, 0.0, 0.0, 0.800000011921, 0.600000023842, 0.0, 0.0, 0.800000011921, 0.899999976158, 0.0, 0.0, 0.40000000596, 0.800000011921, 0.0, 0.0, 0.899999976158, 0.600000023842, 0.0, 0.0, 0.800000011921, 0.300000011921, 0.0, 0.0, 0.800000011921, 0.699999988079, 0.0, 0.0, 0.40000000596, 0.40000000596, 0.0, 0.0, 0.600000023842, 0.5, 0.0, 0.0, 0.899999976158, 0.699999988079, 0.0, 0.0, 0.40000000596, 0.800000011921, 0.0, 0.0, 0.600000023842, 0.899999976158, 0.0, 0.0, 0.300000011921, 0.600000023842, 0.0, 0.0, 0.800000011921, 0.300000011921, 0.0, 0.0, 0.699999988079, 0.300000011921, 0.0, 0.0, 
+
+L2_cTBSV_o_UN
+0.198946958765, 0.117478549396, -0.0353376512917, -0.104767313443, -0.106854235755, -0.0424301939902, 0.0537191514755, 0.132192979229, 0.03795553912, -0.0104612804481, 0.00236279684018, -0.014518338199, 0.0482618685686, 0.0462148240025, -0.0010443325467, -0.00690483429921, 0.0102385856959, -0.0313526474763, 0.0127657172257, 0.0285835493187, 0.00211550689121, -0.00413774884384, -0.00088219272563, -0.0164811625734, 0.0401482120582, 0.0492327626666, 0.0183150482147, -0.0101749858294, -0.010599713923, 0.00781437695206, 0.0131385983117, 0.00680096686655, 0.0120588237748, -0.0167647054967, 
+
+L2_cTBSV_o_UN2
+0.198946958765, 0.117478549396, 0.0, 0.0, -0.0353376512917, -0.104767313443, 0.0, 0.0, -0.106854235755, -0.0424301939902, 0.0, 0.0, 0.0537191514755, 0.132192979229, 0.0, 0.0, 0.03795553912, -0.0104612804481, 0.0, 0.0, 0.00236279684018, -0.014518338199, 0.0, 0.0, 0.0482618685686, 0.0462148240025, 0.0, 0.0, -0.0010443325467, -0.00690483429921, 0.0, 0.0, 0.0102385856959, -0.0313526474763, 0.0, 0.0, 0.0127657172257, 0.0285835493187, 0.0, 0.0, 0.00211550689121, -0.00413774884384, 0.0, 0.0, -0.00088219272563, -0.0164811625734, 0.0, 0.0, 0.0401482120582, 0.0492327626666, 0.0, 0.0, 0.0183150482147, -0.0101749858294, 0.0, 0.0, -0.010599713923, 0.00781437695206, 0.0, 0.0, 0.0131385983117, 0.00680096686655, 0.0, 0.0, 0.0120588237748, -0.0167647054967, 0.0, 0.0, 
+
+L2_cTBSV_o_UT
+0.0107758624222, -0.0168103455277, 0.00311410265979, 0.00631053968203, 0.032587010556, -0.00425698008703, -0.00153183508691, -0.0219719620473, -0.00537692413934, 0.0312868772269, 0.0175754337602, 0.00799245167891, 0.0405093376863, -0.066211293269, -0.0208558827875, 0.0374816149145, 0.0130260264227, 0.0306344015019, 0.0277366008263, -0.0522187085669, -0.00759542985136, 0.0257206670428, 0.00081570054013, 0.0371714344833, 0.0625381443266, -0.0347489917981, -0.0186602658002, 0.0456345978187, -0.056762713099, -0.0264183776856, 0.113694688836, -0.0106486857358, -0.00394579174857, 0.0306984074336, 
+
+L2_cTBSV_o_UH
+0.00474137957368, 0.0193965524628, 0.00579717127785, -0.00529349201093, -0.0226106221883, 0.0206642519306, 0.0318257100359, 0.0975223206475, 0.0166534523774, -0.116233475302, -0.135770263175, 0.16565388492, 0.202736408524, 0.103376761671, 0.116803981872, -0.0519517548223, -0.279127916407, 0.0231768208681, 0.290144026964, 0.0324505237072, -0.0578053165319, -0.0808542703641, -0.271488281928, 0.0207614697672, 0.371811030669, -0.0246061911088, -0.166638524348, -0.0532069993725, -0.275700502482, 0.329884735584, 0.403460613734, -0.36583428527, -0.101786598743, -0.0660282544249, 
+
+L2_zTBSV_A_nn
+16.0, 36.0, 20.0, 28.0, 24.0, 28.0, 32.0, 36.0, 8.0, 36.0, 4.0, 32.0, 12.0, 24.0, 28.0, 4.0, 28.0, 4.0, 12.0, 4.0, 4.0, 28.0, 8.0, 24.0, 24.0, 24.0, 20.0, 4.0, 4.0, 36.0, 16.0, 32.0, 36.0, 24.0, 12.0, 12.0, 12.0, 32.0, 12.0, 16.0, 24.0, 4.0, 4.0, 20.0, 36.0, 20.0, 28.0, 12.0, 8.0, 24.0, 4.0, 36.0, 16.0, 24.0, 8.0, 20.0, 12.0, 4.0, 16.0, 16.0, 16.0, 4.0, 4.0, 36.0, 32.0, 8.0, 32.0, 24.0, 28.0, 20.0, 8.0, 28.0, 32.0, 36.0, 36.0, 12.0, 4.0, 20.0, 20.0, 4.0, 24.0, 16.0, 8.0, 12.0, 24.0, 24.0, 8.0, 36.0, 28.0, 24.0, 8.0, 12.0, 32.0, 36.0, 0.0, 0.0, 20.0, 20.0, 0.0, 0.0, 0.0, 0.0, 
+
+L2_zTBSV_x_n1
+0.4, 0.9, 0.5, 0.3, 0.8, 0.4, 0.5, 0.7, 0.4, 0.7, 0.5, 0.9, 0.2, 0.3, 0.3, 0.3, 0.4, 0.5, 0.3, 0.4, 0.9, 0.1, 0.9, 0.4, 0.9, 0.1, 0.8, 0.3, 0.3, 0.1, 0.1, 0.1, 0.6, 0.6, 
+
+L2_zTBSV_x_n2
+0.4, 0.9, 0.0, 0.0, 0.5, 0.3, 0.0, 0.0, 0.8, 0.4, 0.0, 0.0, 0.5, 0.7, 0.0, 0.0, 0.4, 0.7, 0.0, 0.0, 0.5, 0.9, 0.0, 0.0, 0.2, 0.3, 0.0, 0.0, 0.3, 0.3, 0.0, 0.0, 0.4, 0.5, 0.0, 0.0, 0.3, 0.4, 0.0, 0.0, 0.9, 0.1, 0.0, 0.0, 0.9, 0.4, 0.0, 0.0, 0.9, 0.1, 0.0, 0.0, 0.8, 0.3, 0.0, 0.0, 0.3, 0.1, 0.0, 0.0, 0.1, 0.1, 0.0, 0.0, 0.6, 0.6, 0.0, 0.0, 
+
+L2_zTBSV_o_UN
+-0.0303491976507, 0.0174194805318, 0.00198090085122, -0.0263601890476, 0.0579679317513, 0.0234373289583, -0.0374976911197, -0.000551110000482, 0.0544761245615, -0.047320034403, -0.0254179925622, 0.0163230694833, 0.00384671971049, 0.0412456268004, 0.0898117521034, -0.100224851071, -0.0526903223032, -0.0142321284972, -0.00753561498054, 0.0200448147837, 0.0833845913799, 0.00426859064377, -0.00677397469904, 0.00712349520506, -0.00456335441747, -0.00156124600422, 0.0285650887574, -0.0412771203156, 0.0649358974359, 0.0396794871795, -0.0896153846154, 0.0119230769231, 0.03, 0.0, 
+
+L2_zTBSV_o_UN2
+-0.0303491976507, 0.0174194805318, 0.0, 0.0, 0.00198090085122, -0.0263601890476, 0.0, 0.0, 0.0579679317513, 0.0234373289583, 0.0, 0.0, -0.0374976911197, -0.000551110000482, 0.0, 0.0, 0.0544761245615, -0.047320034403, 0.0, 0.0, -0.0254179925622, 0.0163230694833, 0.0, 0.0, 0.00384671971049, 0.0412456268004, 0.0, 0.0, 0.0898117521034, -0.100224851071, 0.0, 0.0, -0.0526903223032, -0.0142321284972, 0.0, 0.0, -0.00753561498054, 0.0200448147837, 0.0, 0.0, 0.0833845913799, 0.00426859064377, 0.0, 0.0, -0.00677397469904, 0.00712349520506, 0.0, 0.0, -0.00456335441747, -0.00156124600422, 0.0, 0.0, 0.0285650887574, -0.0412771203156, 0.0, 0.0, 0.0649358974359, 0.0396794871795, 0.0, 0.0, -0.0896153846154, 0.0119230769231, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 
+
+L2_zTBSV_o_UT
+0.025, -1.73472347598e-18, -0.00620689655172, -0.00551724137931, -0.000229885057471, -0.00224137931034, 0.0505402298851, 0.065183908046, 0.0230890804598, -0.061096743295, 0.0193025862069, -0.0201588122605, -0.034269003569, 0.0893536136042, 0.00575986645551, -0.0822154806532, 0.0467456690144, 0.0269066507293, 0.0351707871565, 0.0173785787823, -0.000300785763599, -0.112526588686, -0.0683864158642, 0.0519193364986, 0.0969933562886, 0.00392134978096, -0.0262017626546, 0.0299591567626, -0.0220146187989, -0.0677913847312, 0.0257368831154, 0.150095331872, 0.0366549748027, -0.171808414224, 
+
+L2_zTBSV_o_UH
+-0.0167525773196, 0.0185567010309, 0.0127337362247, -0.00255599004621, 0.0123960184856, 0.0218278232018, -0.00666844412845, 0.0441195639294, -0.0212142532686, -0.0305804893945, -0.0223302770865, 0.0124490460955, 0.0557413364971, 0.0381866081917, -0.0234870964854, -0.0383679305599, -0.0203951922942, 0.028563213097, -0.00669972139988, 0.0262478368596, 0.0478399123453, -0.0623068314466, 0.0251137801358, 0.0764698112914, -0.0456189069472, -0.0251444330777, 0.0121206191156, 0.0398841268684, 0.0319044363813, -0.0295576280198, -0.062839541545, 0.069665081223, 0.0554291824065, -0.059480119446, 
+
+L2_sGER_A_mn
+0.7, 0.6, 0.2, 0.9, 0.8, 0.5, 0.6, 0.3, 0.2, 0.7, 0.2, 0.8, 0.9, 0.3, 0.1, 0.8, 0.4, 0.7, 0.5, 0.6, 0.3, 0.7, 0.2, 0.5, 0.1, 0.1, 0.5, 0.9, 0.8, 0.6, 0.4, 0.4, 0.8, 0.8, 0.1, 0.5, 0.4, 0.6, 0.1, 0.5, 0.3, 0.7, 0.2, 0.4, 0.2, 0.2, 0.5, 0.6, 0.2, 0.4, 0.9, 0.7, 0.2, 0.4, 0.9, 0.2, 0.4, 0.9, 0.5, 0.6, 0.9, 0.4, 0.5, 0.8, 0.6, 0.8, 0.6, 0.9, 0.6, 0.9, 0.8, 0.7, 0.6, 0.9, 0.9, 0.8, 0.5, 0.4, 0.5, 0.9, 0.7, 0.3, 0.7, 0.6, 0.8, 0.2, 0.3, 0.7, 0.3, 0.9, 0.3, 0.2, 0.6, 0.9, 0.3, 0.8, 0.8, 0.8, 0.4, 0.6, 0.7, 0.2, 0.2, 0.3, 0.1, 0.5, 0.8, 0.9, 0.4, 0.2, 0.8, 0.8, 0.2, 0.3, 0.8, 0.8, 0.8, 0.5, 0.3, 0.2, 0.8, 0.4, 0.8, 0.8, 0.7, 0.6, 0.2, 0.4, 0.9, 0.8, 0.7, 0.7, 0.6, 0.1, 0.4, 0.8, 0.3, 0.9, 0.8, 0.4, 0.5, 0.8, 0.7, 0.1, 0.4, 0.4, 0.9, 0.4, 0.7, 0.1, 0.5, 0.2, 0.3, 0.6, 0.2, 0.4, 0.4, 0.7, 0.9, 0.3, 0.6, 0.2, 0.5, 0.1, 0.8, 0.1, 0.1, 0.7, 0.2, 0.8, 
+
+L2_sGER_x_m1
+0.5, 0.3, 0.3, 0.4, 0.9, 0.7, 0.4, 0.1, 0.9, 0.7, 
+
+L2_sGER_x_m2
+0.5, 0.0, 0.3, 0.0, 0.3, 0.0, 0.4, 0.0, 0.9, 0.0, 0.7, 0.0, 0.4, 0.0, 0.1, 0.0, 0.9, 0.0, 0.7, 0.0, 
+
+L2_sGER_y_n1
+0.6, 0.2, 0.5, 0.4, 0.3, 0.3, 0.1, 0.4, 0.7, 0.2, 0.2, 0.7, 0.1, 0.2, 0.4, 0.9, 0.2, 
+
+L2_sGER_y_n2
+0.6, 0.0, 0.0, 0.2, 0.0, 0.0, 0.5, 0.0, 0.0, 0.4, 0.0, 0.0, 0.3, 0.0, 0.0, 0.3, 0.0, 0.0, 0.1, 0.0, 0.0, 0.4, 0.0, 0.0, 0.7, 0.0, 0.0, 0.2, 0.0, 0.0, 0.2, 0.0, 0.0, 0.7, 0.0, 0.0, 0.1, 0.0, 0.0, 0.2, 0.0, 0.0, 0.4, 0.0, 0.0, 0.9, 0.0, 0.0, 0.2, 0.0, 0.0, 
+
+L2_sGER_o_N
+1.0, 0.700000025332, 0.45000000298, 1.09999997914, 0.950000017881, 0.65000000596, 0.650000024587, 0.500000014901, 0.54999999702, 0.799999989569, 0.30000000447, 1.15000000596, 0.949999976903, 0.400000013411, 0.30000000447, 1.25, 0.500000007451, 0.880000002384, 0.560000003278, 0.750000029802, 0.420000018477, 0.789999995232, 0.290000010133, 0.530000001639, 0.220000008047, 0.310000006258, 0.560000003278, 0.959999979436, 1.01000001669, 0.630000025481, 0.460000009239, 0.520000012517, 1.0700000155, 0.860000015199, 0.280000015795, 0.560000003278, 0.550000011921, 0.720000030398, 0.190000008643, 0.590000007153, 0.33000001356, 0.819999994636, 0.410000007749, 0.460000009239, 0.260000006258, 0.410000007749, 0.530000001639, 0.66000002712, 0.320000009537, 0.670000009537, 0.959999979436, 0.940000001192, 0.280000005364, 0.600000008941, 1.05999998093, 0.320000009537, 0.520000012517, 0.93999997735, 0.660000004768, 0.880000023246, 0.979999978542, 0.480000008345, 0.779999999404, 0.840000013113, 0.680000026226, 0.960000016689, 0.96000001967, 0.979999978542, 1.14000003099, 1.07999997407, 1.25, 1.05999998391, 0.870000027418, 1.16999997973, 0.989999975115, 1.16000000775, 1.12999997258, 0.580000003874, 0.679999997914, 1.52999994874, 0.789999987036, 0.480000009835, 1.05999998391, 1.40999998093, 0.980000009835, 0.620000012517, 0.440000011623, 1.04999998212, 0.580000011325, 1.10999998093, 0.510000016689, 0.270000002831, 0.880000023246, 1.38999995947, 0.440000011623, 0.940000011623, 1.28999999523, 0.870000011772, 0.540000005662, 0.880000023246, 1.32999996066, 0.340000002682, 0.440000016093, 0.380000014305, 0.30000000447, 0.660000004768, 0.920000018477, 1.01999998271, 0.440000007153, 0.360000007749, 1.08000001132, 0.880000014305, 0.280000005364, 0.580000011325, 0.840000013113, 0.880000014305, 0.960000016689, 0.859999995828, 0.380000014305, 0.260000006258, 0.820000012517, 0.450000006706, 0.840000013113, 0.83000001356, 0.729999989718, 0.61000002414, 0.240000004172, 0.470000005811, 0.919999976754, 0.820000012517, 0.76999998793, 0.709999988377, 0.620000024438, 0.140000002682, 0.490000004917, 0.820000012517, 0.840000019073, 1.07999997407, 1.25, 0.760000001788, 0.770000003576, 1.0700000155, 0.789999987036, 0.459999997318, 1.02999997854, 0.580000003874, 1.07999997407, 1.02999997854, 0.789999987036, 0.279999999404, 0.859999995828, 1.00999996006, 0.480000009835, 1.02000003338, 0.340000002682, 0.75, 0.680000005364, 0.909999992847, 1.10999998093, 0.370000011772, 0.880000023246, 0.689999986291, 0.639999999702, 0.240000001192, 1.28999999523, 0.170000001341, 0.240000001192, 0.979999987483, 0.829999975562, 0.940000011623, 
+
+L2_dGER_A_mn
+0.9, 0.4, 0.9, 0.9, 0.2, 0.3, 0.7, 0.5, 0.6, 0.1, 0.5, 0.1, 0.9, 0.5, 0.2, 0.5, 0.4, 0.1, 0.3, 0.3, 0.9, 0.6, 0.4, 0.3, 0.8, 0.4, 0.4, 0.1, 0.6, 0.2, 0.3, 0.9, 0.5, 0.2, 0.1, 0.7, 0.8, 0.8, 0.6, 0.1, 0.9, 0.4, 0.8, 0.9, 0.3, 0.9, 0.6, 0.4, 0.3, 0.6, 0.1, 0.6, 0.4, 0.2, 0.8, 0.2, 0.3, 0.8, 0.5, 0.2, 0.7, 0.5, 0.1, 0.2, 0.4, 0.7, 0.2, 0.7, 0.8, 0.2, 0.7, 0.4, 0.8, 0.5, 0.1, 0.2, 0.3, 0.6, 0.2, 0.8, 0.9, 0.6, 0.8, 0.5, 0.1, 0.7, 0.1, 0.2, 0.9, 0.6, 0.2, 0.6, 0.5, 0.5, 0.9, 0.5, 0.3, 0.5, 0.8, 0.8, 0.7, 0.1, 0.5, 0.8, 0.7, 0.8, 0.1, 0.8, 0.5, 0.6, 0.5, 0.7, 0.1, 0.6, 0.3, 0.1, 0.5, 0.7, 0.4, 0.6, 0.9, 0.6, 0.1, 0.1, 0.6, 0.9, 0.4, 0.4, 0.6, 0.3, 0.5, 0.4, 0.4, 0.2, 0.6, 0.6, 0.3, 0.7, 0.9, 0.2, 0.9, 0.6, 0.9, 0.7, 0.7, 0.8, 0.6, 0.9, 0.7, 0.2, 0.3, 0.5, 0.5, 0.5, 0.6, 0.8, 0.9, 0.6, 0.9, 0.1, 0.8, 0.2, 0.1, 0.5, 0.9, 0.1, 0.4, 0.7, 0.5, 0.7, 
+
+L2_dGER_x_m1
+0.5, 0.2, 0.1, 0.3, 0.6, 0.6, 0.1, 0.1, 0.4, 0.6, 
+
+L2_dGER_x_m2
+0.5, 0.0, 0.2, 0.0, 0.1, 0.0, 0.3, 0.0, 0.6, 0.0, 0.6, 0.0, 0.1, 0.0, 0.1, 0.0, 0.4, 0.0, 0.6, 0.0, 
+
+L2_dGER_y_n1
+0.1, 0.3, 0.7, 0.8, 0.1, 0.2, 0.4, 0.9, 0.4, 0.7, 0.7, 0.6, 0.6, 0.6, 0.8, 0.4, 0.2, 
+
+L2_dGER_y_n2
+0.1, 0.0, 0.0, 0.3, 0.0, 0.0, 0.7, 0.0, 0.0, 0.8, 0.0, 0.0, 0.1, 0.0, 0.0, 0.2, 0.0, 0.0, 0.4, 0.0, 0.0, 0.9, 0.0, 0.0, 0.4, 0.0, 0.0, 0.7, 0.0, 0.0, 0.7, 0.0, 0.0, 0.6, 0.0, 0.0, 0.6, 0.0, 0.0, 0.6, 0.0, 0.0, 0.8, 0.0, 0.0, 0.4, 0.0, 0.0, 0.2, 0.0, 0.0, 
+
+L2_dGER_o_N
+0.95, 0.55, 1.25, 1.3, 0.25, 0.4, 0.9, 0.95, 0.8, 0.45, 0.85, 0.4, 1.2, 0.8, 0.6, 0.7, 0.5, 0.12, 0.36, 0.44, 1.06, 0.62, 0.44, 0.38, 0.98, 0.48, 0.54, 0.24, 0.72, 0.32, 0.42, 1.06, 0.58, 0.24, 0.11, 0.73, 0.87, 0.88, 0.61, 0.12, 0.94, 0.49, 0.84, 0.97, 0.37, 0.96, 0.66, 0.46, 0.38, 0.64, 0.12, 0.63, 0.49, 0.41, 1.04, 0.23, 0.36, 0.92, 0.77, 0.32, 0.91, 0.71, 0.28, 0.38, 0.58, 0.94, 0.32, 0.76, 0.86, 0.38, 1.12, 0.88, 0.86, 0.62, 0.34, 0.74, 0.54, 1.02, 0.62, 1.16, 1.26, 0.96, 1.28, 0.74, 0.22, 0.76, 0.28, 0.62, 1.38, 0.66, 0.32, 0.84, 1.04, 0.74, 1.32, 0.92, 0.66, 0.86, 1.16, 1.28, 0.94, 0.22, 0.51, 0.83, 0.77, 0.88, 0.11, 0.82, 0.54, 0.69, 0.54, 0.77, 0.17, 0.66, 0.36, 0.16, 0.58, 0.74, 0.42, 0.61, 0.93, 0.67, 0.18, 0.11, 0.62, 0.94, 0.49, 0.44, 0.67, 0.37, 0.56, 0.46, 0.46, 0.28, 0.64, 0.62, 0.34, 0.82, 1.18, 0.52, 0.94, 0.68, 1.06, 1.06, 0.86, 1.08, 0.88, 1.14, 0.94, 0.44, 0.62, 0.66, 0.58, 0.56, 0.78, 1.22, 1.38, 0.66, 1.02, 0.34, 1.34, 0.44, 0.52, 0.92, 1.26, 0.46, 0.76, 1.18, 0.74, 0.82, 
+
+L2_cGERU_A_mn
+0.5, 0.699999988079, 0.20000000298, 0.699999988079, 0.300000011921, 0.600000023842, 0.20000000298, 0.300000011921, 0.40000000596, 0.899999976158, 0.20000000298, 0.10000000149, 0.800000011921, 0.5, 0.40000000596, 0.899999976158, 0.899999976158, 0.699999988079, 0.20000000298, 0.699999988079, 0.899999976158, 0.600000023842, 0.5, 0.20000000298, 0.800000011921, 0.10000000149, 0.899999976158, 0.600000023842, 0.5, 0.5, 0.5, 0.300000011921, 0.899999976158, 0.800000011921, 0.899999976158, 0.600000023842, 0.40000000596, 0.40000000596, 0.5, 0.800000011921, 0.800000011921, 0.699999988079, 0.20000000298, 0.699999988079, 0.5, 0.899999976158, 0.699999988079, 0.300000011921, 0.10000000149, 0.699999988079, 0.10000000149, 0.40000000596, 0.10000000149, 0.10000000149, 0.40000000596, 0.40000000596, 0.600000023842, 0.300000011921, 0.600000023842, 0.699999988079, 0.899999976158, 0.300000011921, 0.5, 0.40000000596, 0.600000023842, 0.600000023842, 0.10000000149, 0.300000011921, 0.20000000298, 0.699999988079, 0.40000000596, 0.600000023842, 0.600000023842, 0.300000011921, 0.899999976158, 0.899999976158, 0.10000000149, 0.699999988079, 0.699999988079, 0.699999988079, 0.5, 0.40000000596, 0.600000023842, 0.699999988079, 0.899999976158, 0.40000000596, 0.600000023842, 0.10000000149, 0.20000000298, 0.800000011921, 0.40000000596, 0.20000000298, 0.5, 0.699999988079, 0.300000011921, 0.20000000298, 0.20000000298, 0.5, 0.40000000596, 0.800000011921, 0.600000023842, 0.600000023842, 0.899999976158, 0.699999988079, 0.20000000298, 0.40000000596, 0.800000011921, 0.600000023842, 0.10000000149, 0.699999988079, 0.800000011921, 0.899999976158, 0.40000000596, 0.699999988079, 0.300000011921, 0.300000011921, 0.800000011921, 0.5, 0.800000011921, 0.40000000596, 0.5, 0.600000023842, 0.800000011921, 0.600000023842, 0.5, 0.20000000298, 0.20000000298, 0.5, 0.600000023842, 0.800000011921, 0.5, 0.40000000596, 0.10000000149, 0.10000000149, 0.699999988079, 0.800000011921, 0.5, 0.899999976158, 0.699999988079, 0.5, 0.800000011921, 0.40000000596, 0.40000000596, 0.300000011921, 0.899999976158, 0.10000000149, 0.300000011921, 0.300000011921, 0.40000000596, 0.899999976158, 0.40000000596, 0.600000023842, 0.5, 0.800000011921, 0.300000011921, 0.899999976158, 0.20000000298, 0.10000000149, 0.10000000149, 0.5, 0.20000000298, 0.20000000298, 0.699999988079, 0.899999976158, 0.5, 0.300000011921, 0.899999976158, 0.40000000596, 0.600000023842, 0.40000000596, 0.10000000149, 0.40000000596, 0.800000011921, 0.899999976158, 0.10000000149, 0.699999988079, 0.600000023842, 0.40000000596, 0.699999988079, 0.899999976158, 0.5, 0.899999976158, 0.600000023842, 0.40000000596, 0.10000000149, 0.300000011921, 0.600000023842, 0.699999988079, 0.40000000596, 0.20000000298, 0.899999976158, 0.600000023842, 0.300000011921, 0.10000000149, 0.5, 0.800000011921, 0.699999988079, 0.300000011921, 0.899999976158, 0.699999988079, 0.5, 0.10000000149, 0.800000011921, 0.300000011921, 0.600000023842, 0.899999976158, 0.40000000596, 0.20000000298, 0.800000011921, 0.10000000149, 0.40000000596, 0.5, 0.300000011921, 0.600000023842, 0.800000011921, 0.699999988079, 0.300000011921, 0.300000011921, 0.300000011921, 0.10000000149, 0.20000000298, 0.20000000298, 0.699999988079, 0.20000000298, 0.10000000149, 0.600000023842, 0.5, 0.20000000298, 0.5, 0.600000023842, 0.899999976158, 0.40000000596, 0.899999976158, 0.699999988079, 0.300000011921, 0.300000011921, 0.300000011921, 0.20000000298, 0.5, 0.20000000298, 0.40000000596, 0.5, 0.10000000149, 0.899999976158, 0.699999988079, 0.10000000149, 0.600000023842, 0.40000000596, 0.600000023842, 0.40000000596, 0.20000000298, 0.300000011921, 0.10000000149, 0.800000011921, 0.699999988079, 0.699999988079, 0.5, 0.40000000596, 0.699999988079, 0.10000000149, 0.10000000149, 0.600000023842, 0.600000023842, 0.5, 0.40000000596, 0.699999988079, 0.300000011921, 0.5, 0.5, 0.800000011921, 0.699999988079, 0.5, 0.600000023842, 0.10000000149, 0.600000023842, 0.10000000149, 0.5, 0.800000011921, 0.600000023842, 0.300000011921, 0.300000011921, 0.20000000298, 0.600000023842, 0.899999976158, 0.600000023842, 0.800000011921, 0.899999976158, 0.5, 0.699999988079, 0.300000011921, 0.699999988079, 0.699999988079, 0.300000011921, 0.300000011921, 0.300000011921, 0.300000011921, 0.40000000596, 0.600000023842, 0.800000011921, 0.699999988079, 0.699999988079, 0.20000000298, 0.10000000149, 0.10000000149, 0.20000000298, 0.10000000149, 0.40000000596, 0.5, 0.699999988079, 0.699999988079, 0.5, 0.600000023842, 0.600000023842, 0.40000000596, 0.600000023842, 0.699999988079, 0.600000023842, 0.800000011921, 0.899999976158, 0.899999976158, 0.300000011921, 0.5, 0.899999976158, 0.899999976158, 0.20000000298, 0.40000000596, 0.600000023842, 0.600000023842, 0.600000023842, 0.600000023842, 0.10000000149, 0.40000000596, 0.40000000596, 0.699999988079, 0.300000011921, 0.300000011921, 0.899999976158, 0.20000000298, 0.40000000596, 0.899999976158, 
+
+L2_cGERU_x_m1
+0.5, 0.800000011921, 0.699999988079, 0.5, 0.10000000149, 0.40000000596, 0.20000000298, 0.10000000149, 0.800000011921, 0.899999976158, 0.800000011921, 0.40000000596, 0.5, 0.5, 0.800000011921, 0.300000011921, 0.20000000298, 0.5, 0.5, 0.20000000298, 
+
+L2_cGERU_x_m2
+0.5, 0.800000011921, 0.0, 0.0, 0.699999988079, 0.5, 0.0, 0.0, 0.10000000149, 0.40000000596, 0.0, 0.0, 0.20000000298, 0.10000000149, 0.0, 0.0, 0.800000011921, 0.899999976158, 0.0, 0.0, 0.800000011921, 0.40000000596, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.800000011921, 0.300000011921, 0.0, 0.0, 0.20000000298, 0.5, 0.0, 0.0, 0.5, 0.20000000298, 0.0, 0.0, 
+
+L2_cGERU_y_n1
+0.10000000149, 0.300000011921, 0.10000000149, 0.5, 0.20000000298, 0.699999988079, 0.10000000149, 0.5, 0.600000023842, 0.5, 0.10000000149, 0.5, 0.40000000596, 0.5, 0.5, 0.699999988079, 0.10000000149, 0.5, 0.699999988079, 0.800000011921, 0.600000023842, 0.600000023842, 0.899999976158, 0.40000000596, 0.300000011921, 0.600000023842, 0.899999976158, 0.300000011921, 0.600000023842, 0.5, 0.20000000298, 0.300000011921, 0.20000000298, 0.300000011921, 
+
+L2_cGERU_y_n2
+0.10000000149, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 0.10000000149, 0.5, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.699999988079, 0.0, 0.0, 0.0, 0.0, 0.10000000149, 0.5, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.5, 0.0, 0.0, 0.0, 0.0, 0.10000000149, 0.5, 0.0, 0.0, 0.0, 0.0, 0.40000000596, 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.699999988079, 0.0, 0.0, 0.0, 0.0, 0.10000000149, 0.5, 0.0, 0.0, 0.0, 0.0, 0.699999988079, 0.800000011921, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 0.899999976158, 0.40000000596, 0.0, 0.0, 0.0, 0.0, 0.300000011921, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 0.899999976158, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.5, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 
+
+L2_cGERU_o_N
+0.309999987632, 0.929999996424, -0.150000002235, 1.02999999046, -0.159999985397, 1.11000002265, -0.150000002235, 0.630000014305, 0.300000011921, 1.63000000238, -0.150000002235, 0.430000003874, 0.600000008941, 1.07000000954, 0.0900000071526, 1.64999997616, 0.549999970943, 1.02999999046, -0.0900000220537, 1.65999999285, 0.719999961853, 1.38000006199, 0.629999978542, 1.11999999762, 0.469999991655, 0.640000026524, 1.10999995112, 1.47000002146, 0.40000000596, 1.23000002623, 0.359999988377, 0.61000002265, 0.759999964535, 1.11000002265, 0.819999970049, 0.860000029355, 0.220000005811, 0.800000000745, 0.290000005662, 1.38999999672, 0.620000011772, 1.09999998286, 0.370000012517, 1.34999999404, 0.319999999851, 1.29999997094, 0.729999987483, 0.850000008941, 0.10000000149, 1.43999997139, -0.0799999986589, 0.800000000745, 0.18999997884, 1.00999999434, 0.520000003576, 1.12000002742, 1.02999999344, 1.0299999994, 0.510000016689, 1.27000000358, 1.37999994278, 0.960000004768, 0.670000009537, 1.05000001192, 0.590000017583, 0.9100000301, 0.0899999952316, 0.610000018179, 0.0899999967217, 0.76999999091, 0.210000003278, 0.690000025779, 0.340000025034, 0.450000014156, 0.709999973476, 0.989999978095, -0.0399999982119, 0.990000001937, 0.509999985397, 0.789999990016, 0.339999998212, 0.610000011474, 0.370000025183, 0.96999999091, 0.709999973476, 0.490000007898, 0.350000014156, 0.460000003278, 0.0199999931455, 1.10000002831, 0.330000000149, 0.6, 0.289999988526, 0.879999997914, 0.270000004321, 0.590000000447, 0.0600000032783, 0.790000013858, 0.3, 0.910000015944, 0.500000017881, 0.710000027865, 0.889999975115, 0.769999991655, 0.170000002831, 0.510000007749, 0.770000013262, 0.76000002414, 0.0700000013411, 0.809999989867, 0.870000017732, 1.05999998093, 0.370000005811, 0.809999989867, 0.33000001356, 0.440000014603, 0.83000001356, 0.690000000447, 0.770000011772, 0.510000007749, 0.559999997318, 0.830000028461, 0.860000015199, 0.780000033677, 0.639999996722, 0.370000004321, 0.20000000298, 0.650000008196, 0.750000020117, 0.950000014156, 0.570000005811, 0.560000010729, 0.110000001043, 0.180000005364, 0.709999987632, 0.880000015795, 0.309999998808, 1.22999998823, 0.330000002384, 0.990000004917, 0.330000044107, 1.14000000268, 0.0300000202656, 0.790000016838, 0.930000014305, 1.0400000146, -0.069999973774, 0.790000016838, 0.270000027418, 1.65999997795, 0.170000039339, 1.61000001073, 0.130000014305, 1.29000001684, 0.140000019073, 2.16999996781, 0.140000022054, 1.12000003487, 0.459999997318, 1.62999996662, -0.0999999910593, 0.950000032783, 1.14999997616, 1.94999994636, 0.530000038147, 1.24000002503, 0.78999997735, 0.820000016987, 0.490000025034, 0.820000016987, 0.0599999973178, 0.680000020266, 0.680000011325, 1.33999998331, -0.0199999931455, 1.33999998927, 0.480000023246, 0.840000013113, 0.980000011325, 1.53999999523, 0.379999999404, 1.33999998331, 0.720000030398, 0.960000016689, 0.220000008047, 1.06000001371, 0.480000023246, 1.13999999523, 0.639999995232, 1.12000002146, 1.13999998927, 1.32000006318, 0.859999998808, 0.780000006855, 0.5, 1.4000000447, 1.29999997318, 0.900000020862, 1.1799999994, 1.34000000715, 0.539999998212, 0.420000016987, 0.840000010133, 0.620000027418, 0.500000018626, 1.09999998286, 0.200000006706, 0.500000003725, 0.550000019372, 0.54999999702, 0.200000006706, 0.800000000745, 0.350000023842, 1.15000003576, 0.600000012666, 0.999999988824, 0.250000014901, 0.750000014901, 0.200000017881, 0.69999999553, 3.72529029846e-09, 0.500000003725, 0.649999976158, 0.95000000298, 0.10000000149, 1.20000004768, 0.749999985099, 0.84999999404, 0.34999999404, 1.05000004172, 1.19999995828, 1.0, 0.949999988079, 1.25, 0.250000007451, 0.550000019372, 0.250000007451, 0.450000010431, 0.489999995232, 0.470000017732, 0.330000002384, 0.9300000076, 0.0500000014901, 1.51999997824, 0.629999984503, 0.53000000909, 0.930000044107, 0.980000026226, 0.530000020266, 0.83000001356, 0.370000006557, 0.820000024438, 0.290000002682, 1.51000001669, 0.629999984503, 1.12999999568, 0.819999985695, 1.2500000298, 1.0, 0.760000042021, 0.699999986589, 1.19000003695, 0.66000002265, 1.07000003338, 1.02999999046, 1.21000000477, 0.630000032187, 1.08000002027, 0.569999997616, 1.10000002831, 0.769999985695, 0.800000016391, 0.470000018477, 0.210000005513, 0.370000024438, 0.250000003725, 0.190000007153, 1.04000001311, 0.370000024438, 0.450000014156, 0.170000018477, 0.600000016391, 0.370000024438, 1.04999997839, 0.430000026226, 1.10000001639, 0.649999983609, 0.889999999702, 0.469999988675, 0.450000014156, 0.439999981821, 1.20999998689, 0.120000006557, 0.720000030398, 0.280000006855, 0.830000002384, 0.159999997318, 0.870000036359, 0.830000003874, 1.20999997944, 0.569999994636, 0.600000016391, -0.0100000032783, 0.260000006258, 0.0899999982119, 0.260000006258, 0.390000003427, 0.670000006557, 0.649999987334, 0.969999988675, 0.460000001788, 0.990000019073, 0.550000023097, 0.670000006557, 0.800000034273, 1.06999999464, 0.550000023097, 1.07000001252, 0.999999977648, 1.22999997854, 0.410000012219, 0.94999999553, 0.849999975413, 1.16999997675, 0.389999992251, 0.940000011623, 0.780000029206, 1.02000004232, 0.970000009537, 0.980000024736, 0.130000000894, 0.76000002116, 0.789999990761, 1.02999999195, 0.500000022352, 0.670000018477, 0.93999997437, 0.390000010133, 0.440000004172, 1.08999998331, 
+
+L2_zGERU_A_mn
+0.1, 0.1, 0.6, 0.4, 0.9, 0.9, 0.1, 0.5, 0.4, 0.4, 0.5, 0.5, 0.5, 0.4, 0.6, 0.4, 0.3, 0.9, 0.2, 0.8, 0.3, 0.9, 0.1, 0.6, 0.7, 0.8, 0.3, 0.6, 0.7, 0.1, 0.7, 0.1, 0.7, 0.4, 0.5, 0.8, 0.7, 0.7, 0.7, 0.2, 0.1, 0.7, 0.2, 0.7, 0.7, 0.6, 0.8, 0.7, 0.2, 0.2, 0.8, 0.8, 0.6, 0.3, 0.3, 0.9, 0.8, 0.8, 0.1, 0.4, 0.8, 0.6, 0.7, 0.2, 0.2, 0.1, 0.1, 0.6, 0.7, 0.6, 0.3, 0.8, 0.5, 0.9, 0.1, 0.2, 0.6, 0.1, 0.1, 0.3, 0.7, 0.6, 0.1, 0.6, 0.8, 0.6, 0.5, 0.5, 0.6, 0.1, 0.2, 0.9, 0.5, 0.1, 0.8, 0.7, 0.6, 0.6, 0.9, 0.2, 0.7, 0.6, 0.4, 0.4, 0.3, 0.6, 0.4, 0.8, 0.6, 0.5, 0.2, 0.3, 0.1, 0.6, 0.2, 0.5, 0.6, 0.8, 0.9, 0.1, 0.1, 0.2, 0.1, 0.9, 0.9, 0.4, 0.9, 0.2, 0.4, 0.5, 0.3, 0.7, 0.6, 0.4, 0.3, 0.4, 0.1, 0.4, 0.6, 0.5, 0.9, 0.3, 0.2, 0.9, 0.6, 0.4, 0.7, 0.1, 0.2, 0.2, 0.7, 0.2, 0.9, 0.6, 0.9, 0.1, 0.9, 0.6, 0.5, 0.9, 0.1, 0.5, 0.3, 0.5, 0.4, 0.4, 0.2, 0.5, 0.4, 0.3, 0.2, 0.7, 0.1, 0.8, 0.1, 0.8, 0.9, 0.9, 0.4, 0.5, 0.1, 0.3, 0.1, 0.4, 0.2, 0.9, 0.9, 0.7, 0.2, 0.5, 0.6, 0.7, 0.8, 0.1, 0.9, 0.3, 0.8, 0.2, 0.4, 0.6, 0.3, 0.9, 0.2, 0.8, 0.4, 0.5, 0.3, 0.1, 0.5, 0.3, 0.8, 0.8, 0.2, 0.4, 0.7, 0.1, 0.2, 0.4, 0.6, 0.8, 0.8, 0.7, 0.2, 0.8, 0.6, 0.4, 0.5, 0.4, 0.4, 0.6, 0.4, 0.6, 0.3, 0.5, 0.2, 0.3, 0.2, 0.1, 0.2, 0.5, 0.5, 0.5, 0.1, 0.9, 0.1, 0.7, 0.8, 0.7, 0.9, 0.4, 0.4, 0.4, 0.1, 0.4, 0.4, 0.4, 0.7, 0.4, 0.7, 0.6, 0.9, 0.9, 0.2, 0.4, 0.4, 0.4, 0.4, 0.6, 0.8, 0.1, 0.1, 0.9, 0.6, 0.4, 0.6, 0.4, 0.8, 0.1, 0.4, 0.6, 0.1, 0.8, 0.2, 0.7, 0.4, 0.3, 0.9, 0.9, 0.1, 0.4, 0.7, 0.9, 0.7, 0.6, 0.6, 0.5, 0.8, 0.4, 0.1, 0.1, 0.7, 0.4, 0.6, 0.8, 0.7, 0.7, 0.8, 0.1, 0.7, 0.8, 0.8, 0.9, 0.8, 0.8, 0.6, 0.9, 0.1, 0.9, 0.6, 0.9, 0.2, 0.1, 0.8, 0.4, 0.5, 0.8, 0.3, 0.3, 0.7, 0.5, 0.4, 0.8, 0.4, 0.5, 0.9, 0.8, 0.4, 0.7, 0.9, 0.7, 
+
+L2_zGERU_x_m1
+0.4, 0.6, 0.8, 0.7, 0.4, 0.6, 0.5, 0.8, 0.4, 0.1, 0.1, 0.2, 0.4, 0.4, 0.1, 0.4, 0.9, 0.1, 0.7, 0.7, 
+
+L2_zGERU_x_m2
+0.4, 0.6, 0.0, 0.0, 0.8, 0.7, 0.0, 0.0, 0.4, 0.6, 0.0, 0.0, 0.5, 0.8, 0.0, 0.0, 0.4, 0.1, 0.0, 0.0, 0.1, 0.2, 0.0, 0.0, 0.4, 0.4, 0.0, 0.0, 0.1, 0.4, 0.0, 0.0, 0.9, 0.1, 0.0, 0.0, 0.7, 0.7, 0.0, 0.0, 
+
+L2_zGERU_y_n1
+0.4, 0.2, 0.8, 0.2, 0.9, 0.9, 0.7, 0.2, 0.6, 0.6, 0.3, 0.9, 0.8, 0.5, 0.1, 0.4, 0.8, 0.1, 0.6, 0.1, 0.6, 0.9, 0.1, 0.2, 0.6, 0.3, 0.6, 0.2, 0.3, 0.2, 0.5, 0.5, 0.6, 0.8, 
+
+L2_zGERU_y_n2
+0.4, 0.2, 0.0, 0.0, 0.0, 0.0, 0.8, 0.2, 0.0, 0.0, 0.0, 0.0, 0.9, 0.9, 0.0, 0.0, 0.0, 0.0, 0.7, 0.2, 0.0, 0.0, 0.0, 0.0, 0.6, 0.6, 0.0, 0.0, 0.0, 0.0, 0.3, 0.9, 0.0, 0.0, 0.0, 0.0, 0.8, 0.5, 0.0, 0.0, 0.0, 0.0, 0.1, 0.4, 0.0, 0.0, 0.0, 0.0, 0.8, 0.1, 0.0, 0.0, 0.0, 0.0, 0.6, 0.1, 0.0, 0.0, 0.0, 0.0, 0.6, 0.9, 0.0, 0.0, 0.0, 0.0, 0.1, 0.2, 0.0, 0.0, 0.0, 0.0, 0.6, 0.3, 0.0, 0.0, 0.0, 0.0, 0.6, 0.2, 0.0, 0.0, 0.0, 0.0, 0.3, 0.2, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.6, 0.8, 0.0, 0.0, 0.0, 0.0, 
+
+L2_zGERU_o_N
+0.14, 0.42, 0.8, 0.96, 0.72, 1.8, 0.26, 1.0, 0.28, 1.0, 0.08, 1.04, 0.52, 1.08, 0.4, 0.62, 0.56, 1.42, 0.38, 1.2, -5.55111512313e-17, 1.62, 0.02, 0.74, 0.76, 1.28, 0.42, 1.04, 0.7, 0.36, 0.6, 0.6, 0.46, 1.08, 0.68, 1.24, 1.2, 1.42, 0.79, 1.55, 0.52, 1.35, 0.26, 1.6, 0.31, 1.53, 1.09, 1.66, 5.55111512313e-17, 0.59, 1.37, 1.44, 1.01, 0.8, 0.15, 2.04, 0.74, 1.03, 0.37, 1.06, 1.14, 1.18, 0.8, 0.57, 0.25, 0.85, 0.02, 1.66, 0.74, 0.92, 0.5, 1.36, 0.32, 1.8, 0.26, 0.7, 0.48, 0.7, -0.32, 0.84, 0.72, 1.28, -0.1, 0.82, 1.06, 1.12, 0.68, 0.9, 0.3, 0.82, 0.12, 1.04, 0.56, 0.58, 0.92, 1.14, 0.6, 0.86, 0.8, 0.7, 0.46, 1.28, 0.44, 0.82, 0.54, 1.34, 0.13, 1.97, 0.79, 1.16, 0.02, 1.08, -0.47, 1.29, 0.2, 1.39, 0.33, 1.08, 1.22, 0.79, 0.32, 0.73, -0.32, 1.83, 0.79, 0.58, 0.96, 0.83, 0.54, 1.08, 0.29, 1.04, 0.45, 1.05, -0.04, 1.28, 0.24, 0.52, 0.9, 0.66, 1.17, 0.75, 0.46, 1.05, 0.78, 0.7, 0.73, 0.49, 0.47, 0.48, 0.7, 0.37, 1.21, 0.72, 1.13, 0.2, 1.05, 1.02, 0.52, 0.99, 0.31, 0.68, 0.52, 0.64, 0.5, 0.51, 0.35, 0.75, 0.56, 0.68, 0.2, 0.8, 0.14, 0.98, 0.01, 1.07, 0.93, 1.06, 0.34, 0.68, -0.05, 0.45, 0.08, 0.61, 0.13, 0.96, 0.96, 0.87, 0.24, 0.63, 0.48, 0.91, 0.77, 0.14, 0.9, 0.45, 0.82, 0.34, 0.39, 0.68, 0.25, 1.05, 0.1, 1.0, 0.48, 0.74, 0.54, 0.5, 0.5, 1.02, 1.0, 1.16, 0.2, 0.88, 0.46, 0.58, 0.32, 0.92, 0.48, 1.0, 1.08, 1.06, 0.4, 1.08, 0.48, 1.0, 0.46, 0.52, 0.52, 0.96, 0.56, 0.92, 0.34, 0.7, 0.2, 0.7, 0.12, 0.66, 0.16, 0.68, 0.5, 0.84, -0.17, 1.35, 0.09, 1.0, 0.62, 1.0, 0.57, 0.61, 0.28, 0.77, -0.05, 0.48, 0.44, 0.73, 0.72, 0.65, 0.4, 0.93, 0.83, 0.96, 0.14, 0.67, 0.38, 0.66, 0.35, 0.74, 0.65, 0.35, -0.16, 1.22, 0.94, 0.62, 1.3, 0.66, 1.52, 1.0, 1.01, 0.85, 0.58, 1.4, 0.38, 1.54, 1.07, 0.83, 0.95, 1.27, 0.81, 0.57, 1.23, 1.05, 1.15, 1.47, 0.67, 0.69, 1.31, 0.73, 0.62, 0.34, 0.95, 0.61, 1.0, 1.3, 1.16, 1.48, 0.94, 0.52, 1.12, 1.5, 0.8, 2.16, 1.15, 1.43, 0.6, 1.74, -0.32, 1.74, 0.81, 1.81, -0.01, 0.45, 1.29, 1.03, 0.85, 1.29, 0.09, 1.35, 0.63, 0.71, 0.61, 1.43, 0.68, 1.06, 0.97, 1.15, 0.4, 1.4, 0.76, 1.68, 
+
+L2_cGERC_A_mn
+0.5, 0.40000000596, 0.10000000149, 0.10000000149, 0.10000000149, 0.20000000298, 0.5, 0.40000000596, 0.800000011921, 0.800000011921, 0.10000000149, 0.699999988079, 0.899999976158, 0.40000000596, 0.300000011921, 0.40000000596, 0.699999988079, 0.699999988079, 0.899999976158, 0.699999988079, 0.800000011921, 0.600000023842, 0.300000011921, 0.5, 0.300000011921, 0.5, 0.300000011921, 0.300000011921, 0.800000011921, 0.699999988079, 0.800000011921, 0.600000023842, 0.600000023842, 0.699999988079, 0.899999976158, 0.600000023842, 0.699999988079, 0.5, 0.10000000149, 0.600000023842, 0.300000011921, 0.20000000298, 0.800000011921, 0.40000000596, 0.899999976158, 0.40000000596, 0.300000011921, 0.40000000596, 0.300000011921, 0.300000011921, 0.800000011921, 0.5, 0.20000000298, 0.300000011921, 0.300000011921, 0.10000000149, 0.40000000596, 0.40000000596, 0.300000011921, 0.899999976158, 0.800000011921, 0.40000000596, 0.20000000298, 0.300000011921, 0.40000000596, 0.10000000149, 0.300000011921, 0.600000023842, 0.600000023842, 0.40000000596, 0.800000011921, 0.600000023842, 0.600000023842, 0.300000011921, 0.899999976158, 0.10000000149, 0.300000011921, 0.10000000149, 0.800000011921, 0.5, 0.600000023842, 0.600000023842, 0.40000000596, 0.699999988079, 0.5, 0.5, 0.600000023842, 0.600000023842, 0.699999988079, 0.5, 0.40000000596, 0.10000000149, 0.10000000149, 0.899999976158, 0.5, 0.40000000596, 0.10000000149, 0.10000000149, 0.40000000596, 0.699999988079, 0.40000000596, 0.899999976158, 0.10000000149, 0.699999988079, 0.5, 0.20000000298, 0.899999976158, 0.5, 0.40000000596, 0.20000000298, 0.10000000149, 0.20000000298, 0.899999976158, 0.10000000149, 0.40000000596, 0.699999988079, 0.40000000596, 0.600000023842, 0.20000000298, 0.5, 0.699999988079, 0.20000000298, 0.10000000149, 0.40000000596, 0.40000000596, 0.800000011921, 0.20000000298, 0.10000000149, 0.40000000596, 0.20000000298, 0.600000023842, 0.800000011921, 0.300000011921, 0.600000023842, 0.899999976158, 0.10000000149, 0.5, 0.5, 0.40000000596, 0.10000000149, 0.10000000149, 0.699999988079, 0.10000000149, 0.40000000596, 0.300000011921, 0.5, 0.800000011921, 0.40000000596, 0.40000000596, 0.10000000149, 0.699999988079, 0.10000000149, 0.5, 0.300000011921, 0.5, 0.600000023842, 0.40000000596, 0.699999988079, 0.800000011921, 0.699999988079, 0.600000023842, 0.20000000298, 0.40000000596, 0.20000000298, 0.10000000149, 0.20000000298, 0.5, 0.40000000596, 0.800000011921, 0.800000011921, 0.5, 0.5, 0.800000011921, 0.20000000298, 0.40000000596, 0.10000000149, 0.10000000149, 0.600000023842, 0.899999976158, 0.10000000149, 0.800000011921, 0.899999976158, 0.5, 0.20000000298, 0.5, 0.300000011921, 0.5, 0.10000000149, 0.10000000149, 0.600000023842, 0.40000000596, 0.899999976158, 0.899999976158, 0.699999988079, 0.300000011921, 0.600000023842, 0.300000011921, 0.20000000298, 0.10000000149, 0.300000011921, 0.5, 0.5, 0.899999976158, 0.600000023842, 0.300000011921, 0.800000011921, 0.10000000149, 0.699999988079, 0.20000000298, 0.899999976158, 0.699999988079, 0.899999976158, 0.5, 0.800000011921, 0.40000000596, 0.899999976158, 0.300000011921, 0.300000011921, 0.5, 0.300000011921, 0.600000023842, 0.10000000149, 0.40000000596, 0.5, 0.800000011921, 0.899999976158, 0.600000023842, 0.300000011921, 0.899999976158, 0.300000011921, 0.600000023842, 0.800000011921, 0.20000000298, 0.800000011921, 0.600000023842, 0.40000000596, 0.40000000596, 0.300000011921, 0.5, 0.20000000298, 0.899999976158, 0.600000023842, 0.800000011921, 0.10000000149, 0.10000000149, 0.20000000298, 0.300000011921, 0.5, 0.5, 0.600000023842, 0.40000000596, 0.20000000298, 0.699999988079, 0.600000023842, 0.899999976158, 0.10000000149, 0.5, 0.899999976158, 0.600000023842, 0.899999976158, 0.5, 0.699999988079, 0.10000000149, 0.899999976158, 0.20000000298, 0.10000000149, 0.699999988079, 0.899999976158, 0.899999976158, 0.40000000596, 0.5, 0.20000000298, 0.800000011921, 0.300000011921, 0.20000000298, 0.899999976158, 0.40000000596, 0.5, 0.899999976158, 0.699999988079, 0.10000000149, 0.5, 0.800000011921, 0.699999988079, 0.600000023842, 0.600000023842, 0.699999988079, 0.20000000298, 0.699999988079, 0.800000011921, 0.699999988079, 0.10000000149, 0.5, 0.800000011921, 0.40000000596, 0.899999976158, 0.899999976158, 0.699999988079, 0.600000023842, 0.600000023842, 0.20000000298, 0.300000011921, 0.40000000596, 0.600000023842, 0.699999988079, 0.20000000298, 0.699999988079, 0.5, 0.699999988079, 0.20000000298, 0.699999988079, 0.5, 0.300000011921, 0.5, 0.699999988079, 0.5, 0.10000000149, 0.20000000298, 0.5, 0.899999976158, 0.600000023842, 0.600000023842, 0.5, 0.699999988079, 0.40000000596, 0.800000011921, 0.300000011921, 0.600000023842, 0.899999976158, 0.10000000149, 0.899999976158, 0.899999976158, 0.20000000298, 0.600000023842, 0.40000000596, 0.10000000149, 0.300000011921, 0.699999988079, 0.699999988079, 0.899999976158, 
+
+L2_cGERC_x_m1
+0.40000000596, 0.800000011921, 0.600000023842, 0.300000011921, 0.800000011921, 0.800000011921, 0.5, 0.699999988079, 0.600000023842, 0.10000000149, 0.300000011921, 0.20000000298, 0.20000000298, 0.300000011921, 0.800000011921, 0.20000000298, 0.600000023842, 0.600000023842, 0.40000000596, 0.800000011921, 
+
+L2_cGERC_x_m2
+0.40000000596, 0.800000011921, 0.0, 0.0, 0.600000023842, 0.300000011921, 0.0, 0.0, 0.800000011921, 0.800000011921, 0.0, 0.0, 0.5, 0.699999988079, 0.0, 0.0, 0.600000023842, 0.10000000149, 0.0, 0.0, 0.300000011921, 0.20000000298, 0.0, 0.0, 0.20000000298, 0.300000011921, 0.0, 0.0, 0.800000011921, 0.20000000298, 0.0, 0.0, 0.600000023842, 0.600000023842, 0.0, 0.0, 0.40000000596, 0.800000011921, 0.0, 0.0, 
+
+L2_cGERC_y_n1
+0.20000000298, 0.300000011921, 0.699999988079, 0.699999988079, 0.899999976158, 0.300000011921, 0.600000023842, 0.5, 0.20000000298, 0.10000000149, 0.20000000298, 0.800000011921, 0.5, 0.300000011921, 0.20000000298, 0.5, 0.20000000298, 0.20000000298, 0.300000011921, 0.699999988079, 0.5, 0.899999976158, 0.40000000596, 0.699999988079, 0.40000000596, 0.899999976158, 0.300000011921, 0.800000011921, 0.40000000596, 0.300000011921, 0.800000011921, 0.600000023842, 0.10000000149, 0.20000000298, 
+
+L2_cGERC_y_n2
+0.20000000298, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 0.699999988079, 0.699999988079, 0.0, 0.0, 0.0, 0.0, 0.899999976158, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.5, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.10000000149, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.800000011921, 0.0, 0.0, 0.0, 0.0, 0.5, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.5, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.20000000298, 0.0, 0.0, 0.0, 0.0, 0.300000011921, 0.699999988079, 0.0, 0.0, 0.0, 0.0, 0.5, 0.899999976158, 0.0, 0.0, 0.0, 0.0, 0.40000000596, 0.699999988079, 0.0, 0.0, 0.0, 0.0, 0.40000000596, 0.899999976158, 0.0, 0.0, 0.0, 0.0, 0.300000011921, 0.800000011921, 0.0, 0.0, 0.0, 0.0, 0.40000000596, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 0.800000011921, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 0.10000000149, 0.20000000298, 0.0, 0.0, 0.0, 0.0, 
+
+L2_cGERC_o_N
+0.820000015497, 0.440000004172, 0.939999999702, 0.380000000894, 0.700000010431, 0.799999988079, 1.14000001907, 0.680000029206, 0.960000016689, 0.920000015497, 0.820000022948, 0.539999983311, 1.33999999225, 0.680000005364, 0.780000020266, 0.360000007749, 0.939999995232, 0.779999990463, 1.57999998152, 0.660000001788, 1.72000000656, 0.640000033975, 1.0200000155, 0.540000010133, 1.18000000834, 0.460000013709, 1.06000003755, 0.220000015497, 1.2000000298, 0.899999991059, 1.60000004768, 1.0000000298, 0.800000029802, 0.699999988079, 1.10999998987, 0.480000012815, 1.33000000238, 0.289999995232, 0.730000015795, 0.690000013113, 0.810000046492, 0.0800000053644, 0.950000020117, 0.40000000596, 1.25999999583, -0.0200000169873, 0.690000030994, 0.369999997616, 0.570000024438, 0.0600000032783, 0.980000021756, 0.439999996722, 0.590000022054, -0.0299999904633, 0.870000027418, -0.289999999702, 0.850000023842, 0.10000000298, 0.81000002861, 0.479999975562, 1.22000003934, 0.00999998688698, 0.530000023246, 0.240000004172, 1.06000004649, -0.0200000140071, 0.420000018477, 0.510000018924, 1.00000004172, 0.319999997616, 1.92000000954, 0.600000023842, 1.56000002861, 0.779999990463, 1.78000000834, 0.180000021756, 0.540000019073, 0.180000003874, 1.60000003576, 0.0199999856949, 1.24000004292, 0.760000016689, 0.960000016689, 0.459999986887, 0.820000009537, 0.5, 1.40000003576, 0.280000038147, 1.81999998569, 0.180000014305, 1.28000001431, -0.139999987781, 1.14000000268, 0.49999999404, 1.38000003219, 0.0, 0.66000002414, 0.179999997914, 1.52000005126, 0.859999980927, 0.640000013113, 0.819999973774, 0.410000007749, 0.689999981821, 1.33999997735, 0.339999992251, 1.55999996901, 0.979999966621, 1.05000001192, 0.370000012517, 0.270000002831, 0.290000001937, 1.55999997646, -0.160000004768, 0.860000010729, 0.899999976158, 0.85000000149, 0.490000023544, 0.440000004172, 0.539999998212, 1.33999997735, 0.0600000137091, 0.979999974072, 0.300000011921, 1.08999999225, 0.730000017285, 1.02999997854, -0.069999987185, 1.11000001073, 0.0100000017881, 1.01000003159, 0.930000005364, 1.12000002742, 0.860000010729, 1.08999997661, 0.069999999851, 0.650000008196, 0.339999986291, 0.890000015348, -0.250000008196, 0.670000010282, 0.609999972731, 0.510000030845, 0.159999997318, 0.430000018775, 0.459999997318, 1.00000002086, -0.0600000196695, 0.730000019521, -0.0300000120699, 0.869999995381, -0.180000009835, 0.640000007153, 0.20000000596, 0.750000014156, 0.210000015944, 0.790000016838, 0.209999981672, 1.11000002488, 0.319999979734, 0.930000035912, -0.30000000298, 0.66000002265, -0.250000021607, 0.370000016242, 0.0599999898672, 1.0400000295, 0.119999979734, 0.880000015795, 0.690000005662, 0.620000006557, 0.44999999404, 1.15000001639, 0.129999997914, 0.730000012815, 0.189999992251, 0.380000017285, 0.570000024438, 0.979999980032, 0.110000001043, 1.02000001997, 0.699999964237, 0.710000009239, 0.209999997318, 0.660000004768, 0.190000007153, 0.60000000447, 0.079999999404, 0.330000008345, 0.450000022352, 0.730000009835, 0.729999974072, 1.15999998242, 0.569999985695, 0.600000016391, 0.41000002265, 0.550000023842, 0.0199999931455, 0.280000011325, 0.290000007153, 0.86000001967, 0.479999990463, 0.969999978989, 0.56000002116, 0.430000020266, 0.800000011921, 0.45000000596, 0.769999993145, 0.470000008047, 1.10999997646, 0.970000000596, 0.979999988973, 0.570000002831, 0.840000014603, 0.680000020266, 0.799999974668, 0.490000020564, 0.390000014603, 0.690000007153, 0.260000013709, 0.700000028312, 0.120000003576, 0.670000014007, 0.450000007451, 1.17000001699, 0.869999984205, 0.890000030994, 0.280000018775, 1.24999998212, 0.240000020564, 0.900000040233, 0.730000014305, 0.370000012517, 0.860000015199, 0.940000042915, 0.520000012517, 0.480000009835, 0.290000012368, 0.720000008047, -8.94069684954e-09, 1.59999997467, 0.180000024736, 1.58000000685, 0.0399999862909, 0.680000029206, -0.0799999964237, 0.480000017285, 0.459999998808, 0.820000009537, 5.96046434431e-09, 0.860000015199, 0.0599999913573, 0.959999994338, 0.240000019073, 1.09999998212, -0.0200000020862, 0.880000012815, 0.399999980628, 1.18000002772, 0.279999985993, 0.960000009239, 0.219999991655, 0.600000008941, 0.259999986887, 0.600000020862, -0.480000014305, 1.08000000089, 0.739999965429, 1.66000000179, 0.0799999845028, 0.620000003576, 0.0599999988079, 1.10000003278, 0.240000004172, 1.04000002205, 0.899999976158, 1.12000002742, 0.859999992847, 1.56000001669, 0.760000004768, 0.280000011325, 0.560000003278, 1.4000000447, 0.33999996841, 1.08000005007, 0.720000021458, 1.12000000656, 0.0199999976158, 0.940000001192, 0.800000011921, 1.30000001192, -0.139999993742, 1.34000001907, 0.560000016689, 1.06000002861, 0.719999979734, 1.67999999642, 0.39999999404, 1.26000006437, 0.300000011921, 0.620000030398, 0.360000010729, 1.2400000608, 0.720000021458, 0.879999997914, 0.139999999702, 1.02000000358, 0.539999998212, 1.53999998629, 0.480000002384, 1.29999999702, 1.0999999851, 0.940000030994, 0.780000023246, 0.859999992847, 0.620000003576, 0.820000022948, 0.0399999982119, 0.940000016093, 1.17999997556, 1.08000003219, 0.56000002563, 0.740000007153, 0.779999990463, 1.08000001132, 0.76000002563, 1.22000000656, 0.640000033975, 1.61999997973, 0.140000011623, 1.77999997258, 0.859999989867, 0.96000002861, 0.520000027418, 0.800000023842, 0.30000000447, 1.10000004768, 1.09999999404, 0.89999999404, 0.899999976158, 
+
+L2_zGERC_A_mn
+0.8, 0.6, 0.6, 0.3, 0.8, 0.6, 0.7, 0.5, 0.7, 0.2, 0.4, 0.2, 0.1, 0.2, 0.5, 0.2, 0.7, 0.1, 0.1, 0.4, 0.8, 0.3, 0.1, 0.4, 0.8, 0.2, 0.3, 0.6, 0.9, 0.9, 0.6, 0.7, 0.2, 0.5, 0.9, 0.3, 0.6, 0.9, 0.2, 0.8, 0.1, 0.7, 0.5, 0.9, 0.3, 0.5, 0.1, 0.7, 0.5, 0.1, 0.2, 0.2, 0.4, 0.8, 0.2, 0.7, 0.3, 0.1, 0.2, 0.8, 0.7, 0.4, 0.3, 0.2, 0.7, 0.8, 0.3, 0.9, 0.5, 0.2, 0.8, 0.2, 0.9, 0.8, 0.2, 0.4, 0.4, 0.9, 0.1, 0.1, 0.3, 0.5, 0.6, 0.9, 0.1, 0.3, 0.7, 0.1, 0.1, 0.6, 0.5, 0.9, 0.1, 0.3, 0.6, 0.6, 0.4, 0.9, 0.5, 0.7, 0.1, 0.1, 0.7, 0.8, 0.3, 0.7, 0.2, 0.3, 0.7, 0.5, 0.1, 0.4, 0.9, 0.6, 0.7, 0.4, 0.6, 0.1, 0.3, 0.7, 0.8, 0.8, 0.4, 0.9, 0.9, 0.3, 0.1, 0.4, 0.6, 0.1, 0.1, 0.9, 0.2, 0.4, 0.9, 0.3, 0.7, 0.9, 0.9, 0.4, 0.7, 0.8, 0.4, 0.7, 0.4, 0.2, 0.3, 0.6, 0.5, 0.9, 0.4, 0.7, 0.3, 0.5, 0.2, 0.2, 0.4, 0.8, 0.8, 0.2, 0.8, 0.9, 0.7, 0.4, 0.8, 0.2, 0.1, 0.2, 0.8, 0.2, 0.7, 0.4, 0.1, 0.2, 0.2, 0.6, 0.1, 0.2, 0.3, 0.7, 0.4, 0.7, 0.2, 0.4, 0.1, 0.2, 0.2, 0.4, 0.5, 0.5, 0.2, 0.3, 0.5, 0.3, 0.7, 0.6, 0.2, 0.3, 0.1, 0.2, 0.3, 0.9, 0.1, 0.5, 0.7, 0.1, 0.4, 0.4, 0.2, 0.1, 0.2, 0.1, 0.2, 0.2, 0.8, 0.7, 0.2, 0.8, 0.7, 0.5, 0.7, 0.6, 0.7, 0.2, 0.4, 0.5, 0.1, 0.1, 0.9, 0.3, 0.6, 0.9, 0.3, 0.2, 0.3, 0.2, 0.4, 0.5, 0.2, 0.9, 0.5, 0.3, 0.2, 0.7, 0.8, 0.2, 0.1, 0.7, 0.2, 0.4, 0.7, 0.8, 0.6, 0.1, 0.4, 0.7, 0.7, 0.1, 0.4, 0.9, 0.9, 0.1, 0.8, 0.4, 0.6, 0.6, 0.4, 0.8, 0.5, 0.3, 0.6, 0.8, 0.2, 0.1, 0.7, 0.1, 0.4, 0.7, 0.4, 0.3, 0.7, 0.8, 0.2, 0.3, 0.9, 0.5, 0.5, 0.5, 0.9, 0.2, 0.9, 0.5, 0.7, 0.3, 0.7, 0.5, 0.7, 0.2, 0.6, 0.9, 0.5, 0.9, 0.8, 0.8, 0.8, 0.6, 0.4, 0.8, 0.5, 0.7, 0.3, 0.5, 0.5, 0.8, 0.8, 0.6, 0.7, 0.3, 0.6, 0.5, 0.5, 0.7, 0.5, 0.6, 0.7, 0.6, 0.1, 0.2, 0.1, 0.5, 0.6, 0.9, 0.5, 0.2, 0.1, 0.3, 0.2, 0.4, 0.9, 0.1, 
+
+L2_zGERC_x_m1
+0.9, 0.5, 0.8, 0.3, 0.5, 0.4, 0.8, 0.6, 0.9, 0.8, 0.1, 0.2, 0.9, 0.4, 0.2, 0.3, 0.6, 0.2, 0.2, 0.6, 
+
+L2_zGERC_x_m2
+0.9, 0.5, 0.0, 0.0, 0.8, 0.3, 0.0, 0.0, 0.5, 0.4, 0.0, 0.0, 0.8, 0.6, 0.0, 0.0, 0.9, 0.8, 0.0, 0.0, 0.1, 0.2, 0.0, 0.0, 0.9, 0.4, 0.0, 0.0, 0.2, 0.3, 0.0, 0.0, 0.6, 0.2, 0.0, 0.0, 0.2, 0.6, 0.0, 0.0, 
+
+L2_zGERC_y_n1
+0.9, 0.7, 0.3, 0.8, 0.3, 0.2, 0.3, 0.6, 0.1, 0.4, 0.1, 0.5, 0.6, 0.6, 0.4, 0.7, 0.2, 0.4, 0.6, 0.5, 0.9, 0.1, 0.4, 0.6, 0.4, 0.8, 0.3, 0.5, 0.9, 0.5, 0.6, 0.7, 0.5, 0.7, 
+
+L2_zGERC_y_n2
+0.9, 0.7, 0.0, 0.0, 0.0, 0.0, 0.3, 0.8, 0.0, 0.0, 0.0, 0.0, 0.3, 0.2, 0.0, 0.0, 0.0, 0.0, 0.3, 0.6, 0.0, 0.0, 0.0, 0.0, 0.1, 0.4, 0.0, 0.0, 0.0, 0.0, 0.1, 0.5, 0.0, 0.0, 0.0, 0.0, 0.6, 0.6, 0.0, 0.0, 0.0, 0.0, 0.4, 0.7, 0.0, 0.0, 0.0, 0.0, 0.2, 0.4, 0.0, 0.0, 0.0, 0.0, 0.6, 0.5, 0.0, 0.0, 0.0, 0.0, 0.9, 0.1, 0.0, 0.0, 0.0, 0.0, 0.4, 0.6, 0.0, 0.0, 0.0, 0.0, 0.4, 0.8, 0.0, 0.0, 0.0, 0.0, 0.3, 0.5, 0.0, 0.0, 0.0, 0.0, 0.9, 0.5, 0.0, 0.0, 0.0, 0.0, 0.6, 0.7, 0.0, 0.0, 0.0, 0.0, 0.5, 0.7, 0.0, 0.0, 0.0, 0.0, 
+
+L2_zGERC_o_N
+1.96, 0.42, 1.27, -0.27, 1.17, 0.57, 1.27, 0.11, 0.99, -0.11, 0.74, -0.2, 0.94, -0.04, 1.21, -0.23, 1.08, -0.16, 0.89, 0.25, 1.66, 0.66, 0.76, 0.06, 1.56, -0.32, 0.82, 0.3, 1.96, 0.9, 1.49, 0.37, 1.0, 0.12, 1.83, 0.01, 1.08, 0.35, 0.5, 0.73, 0.52, 0.31, 0.7, 0.61, 0.53, 0.13, 0.76, 0.4, 1.03, -0.34, 0.48, -0.06, 1.03, 0.58, 0.95, 0.89, 0.8, -0.26, 0.76, 0.28, 1.09, 0.09, 1.17, 0.07, 1.39, 0.42, 0.91, 0.49, 1.23, 0.21, 1.27, -0.08, 1.13, 0.82, 0.59, 0.22, 0.61, 0.74, 0.35, -0.11, 0.84, 0.44, 1.08, 0.71, 0.36, 0.18, 1.2, 0.09, 0.59, 0.91, 0.94, 0.76, 0.62, 0.06, 0.95, 0.47, 1.05, 1.01, 1.08, 0.59, 0.63, -0.05, 1.84, 0.78, 1.02, 0.24, 0.56, 0.32, 1.3, 0.2, 0.42, 0.14, 1.28, 0.26, 1.54, 0.28, 1.34, -0.22, 0.7, 0.5, 1.58, 0.76, 1.18, 1.36, 1.58, 0.06, 0.9, -1.11022302463e-16, 1.14, -0.12, 1.12, 1.04, 1.1, 0.2, 1.72, 0.04, 2.07, 0.99, 1.81, -0.08, 1.13, 0.86, 1.15, 0.4, 0.81, -0.08, 0.79, 0.23, 1.52, 0.84, 1.32, 0.39, 0.8, 0.3, 1.14, 0.23, 1.29, 1.43, 1.64, -0.02, 1.8, 0.5, 1.37, 0.19, 2.01, 0.47, 1.2, 0.05, 1.81, -0.03, 0.93, 0.51, 0.29, 0.18, 0.27, 0.64, 0.25, 0.2, 0.39, 0.68, 0.51, 0.67, 0.38, 0.46, 0.28, 0.21, 0.3, 0.4, 0.66, 0.57, 0.31, 0.47, 0.66, 0.32, 0.9, 0.6, 0.33, 0.31, 0.29, 0.33, 0.5, 0.95, 0.29, 0.53, 1.79, -0.17, 0.99, -0.2, 0.55, 0.04, 0.71, -0.32, 0.45, -0.12, 1.09, 0.29, 0.98, 0.5, 1.34, 0.03, 1.04, 0.32, 1.44, -0.01, 1.25, 0.77, 0.7, -0.28, 1.58, -0.26, 1.07, 0.57, 1.31, 0.11, 1.12, -0.19, 1.13, 0.07, 0.59, 1.03, 0.8, 0.23, 0.32, 0.75, 1.04, 0.17, 0.24, 0.65, 0.37, 0.33, 1.0, 0.86, 0.89, 0.08, 0.56, 0.68, 0.97, 0.18, 0.61, 1.15, 1.16, 0.1, 1.12, 0.36, 0.81, 0.59, 0.73, 0.97, 0.83, 0.34, 0.91, 0.81, 0.88, -0.14, 1.04, -0.32, 0.62, 0.64, 0.7, 0.0, 0.84, 0.58, 0.36, 0.02, 1.38, 0.26, 0.88, 0.16, 1.1, 2.77555756156e-17, 1.36, 0.32, 1.26, 0.42, 1.06, 0.22, 1.1, -0.2, 0.88, 0.66, 1.14, 0.78, 1.3, 0.5, 1.24, 0.28, 1.0, 1.2, 1.04, 0.72, 0.48, 0.64, 0.92, 0.86, 1.06, 0.58, 1.02, 0.26, 1.08, 0.74, 1.0, 0.8, 0.78, 0.64, 1.12, 0.86, 0.34, 0.72, 0.54, 0.62, 1.16, 0.98, 0.86, 0.28, 0.58, 0.74, 0.74, 0.62, 1.42, 0.26, 
+
+L2_cHER_A_nn
+0.899999976158, 0.0, 0.10000000149, 0.600000023842, 0.40000000596, 0.20000000298, 0.40000000596, 0.800000011921, 0.5, 0.5, 0.40000000596, 0.10000000149, 0.10000000149, 0.40000000596, 0.20000000298, 0.699999988079, 0.899999976158, 0.300000011921, 0.699999988079, 0.800000011921, 0.300000011921, 0.10000000149, 0.600000023842, 0.40000000596, 0.5, 0.699999988079, 0.40000000596, 0.800000011921, 0.5, 0.20000000298, 0.20000000298, 0.800000011921, 0.600000023842, 0.899999976158, 0.10000000149, -0.600000023842, 0.300000011921, 0.0, 0.5, 0.40000000596, 0.10000000149, 0.600000023842, 0.600000023842, 0.300000011921, 0.5, 0.5, 0.699999988079, 0.699999988079, 0.40000000596, 0.600000023842, 0.300000011921, 0.40000000596, 0.899999976158, 0.699999988079, 0.800000011921, 0.699999988079, 0.600000023842, 0.300000011921, 0.899999976158, 0.300000011921, 0.10000000149, 0.699999988079, 0.899999976158, 0.600000023842, 0.899999976158, 0.300000011921, 0.40000000596, 0.20000000298, 0.40000000596, -0.20000000298, 0.5, -0.40000000596, 0.10000000149, 0.0, 0.20000000298, 0.300000011921, 0.600000023842, 0.5, 0.600000023842, 0.5, 0.20000000298, 0.20000000298, 0.5, 0.300000011921, 0.699999988079, 0.800000011921, 0.800000011921, 0.5, 0.10000000149, 0.899999976158, 0.699999988079, 0.300000011921, 0.600000023842, 0.899999976158, 0.40000000596, 0.40000000596, 0.10000000149, 0.600000023842, 0.899999976158, 0.40000000596, 0.20000000298, 0.5, 0.40000000596, -0.800000011921, 0.10000000149, -0.600000023842, 0.20000000298, -0.300000011921, 0.300000011921, 0.0, 0.899999976158, 0.10000000149, 0.20000000298, 0.899999976158, 0.300000011921, 0.10000000149, 0.300000011921, 0.10000000149, 0.699999988079, 0.300000011921, 0.10000000149, 0.899999976158, 0.20000000298, 0.20000000298, 0.10000000149, 0.10000000149, 0.10000000149, 0.20000000298, 0.5, 0.40000000596, 0.600000023842, 0.800000011921, 0.600000023842, 0.699999988079, 0.10000000149, 0.800000011921, 0.5, -0.5, 0.600000023842, -0.300000011921, 0.600000023842, -0.5, 0.899999976158, -0.10000000149, 0.600000023842, 0.0, 0.800000011921, 0.10000000149, 0.800000011921, 0.899999976158, 0.300000011921, 0.699999988079, 0.10000000149, 0.40000000596, 0.800000011921, 0.600000023842, 0.10000000149, 0.300000011921, 0.20000000298, 0.40000000596, 0.899999976158, 0.600000023842, 0.899999976158, 0.800000011921, 0.10000000149, 0.5, 0.10000000149, 0.10000000149, 0.10000000149, 0.899999976158, 0.40000000596, -0.10000000149, 0.5, -0.5, 0.600000023842, -0.5, 0.20000000298, -0.899999976158, 0.800000011921, -0.10000000149, 0.899999976158, 0.0, 0.5, 0.699999988079, 0.800000011921, 0.20000000298, 0.800000011921, 0.5, 0.20000000298, 0.800000011921, 0.800000011921, 0.5, 0.40000000596, 0.699999988079, 0.20000000298, 0.40000000596, 0.10000000149, 0.899999976158, 0.699999988079, 0.800000011921, 0.800000011921, 0.10000000149, 0.300000011921, 0.300000011921, 0.10000000149, -0.40000000596, 0.699999988079, -0.699999988079, 0.20000000298, -0.20000000298, 0.300000011921, -0.10000000149, 0.800000011921, -0.899999976158, 0.5, -0.699999988079, 0.899999976158, 0.0, 0.20000000298, 0.800000011921, 0.899999976158, 0.699999988079, 0.600000023842, 0.800000011921, 0.20000000298, 0.600000023842, 0.600000023842, 0.899999976158, 0.699999988079, 0.20000000298, 0.699999988079, 0.600000023842, 0.600000023842, 0.10000000149, 0.10000000149, 0.10000000149, 0.40000000596, 0.5, 0.20000000298, -0.699999988079, 0.40000000596, -0.600000023842, 0.5, -0.300000011921, 0.300000011921, -0.10000000149, 0.300000011921, -0.699999988079, 0.800000011921, -0.20000000298, 0.20000000298, -0.800000011921, 0.5, 0.0, 0.10000000149, 0.10000000149, 0.800000011921, 0.899999976158, 0.800000011921, 0.10000000149, 0.300000011921, 0.699999988079, 0.800000011921, 0.300000011921, 0.10000000149, 0.600000023842, 0.899999976158, 0.600000023842, 0.10000000149, 0.40000000596, 0.800000011921, 0.600000023842, 0.899999976158, -0.300000011921, 0.300000011921, -0.40000000596, 0.699999988079, -0.800000011921, 0.699999988079, -0.300000011921, 0.10000000149, -0.40000000596, 0.800000011921, -0.5, 0.899999976158, -0.699999988079, 0.10000000149, -0.10000000149, 0.20000000298, 0.0, 0.899999976158, 0.800000011921, 0.10000000149, 0.10000000149, 0.699999988079, 0.699999988079, 0.5, 0.10000000149, 0.10000000149, 0.600000023842, 0.600000023842, 0.899999976158, 0.10000000149, 0.10000000149, 0.800000011921, 0.10000000149, 0.699999988079, -0.800000011921, 0.899999976158, -0.699999988079, 0.800000011921, -0.5, 0.10000000149, -0.899999976158, 0.800000011921, -0.600000023842, 0.20000000298, -0.800000011921, 0.600000023842, -0.800000011921, 0.800000011921, -0.899999976158, 0.899999976158, -0.800000011921, 0.20000000298, 0.0, 0.600000023842, 0.5, 0.5, 0.20000000298, 0.20000000298, 0.699999988079, 0.5, 0.699999988079, 0.300000011921, 0.899999976158, 0.40000000596, 0.800000011921, 0.10000000149, 0.800000011921, 0.300000011921, -0.10000000149, 0.800000011921, -0.699999988079, 0.10000000149, -0.899999976158, 0.20000000298, -0.20000000298, 0.10000000149, -0.300000011921, 0.800000011921, -0.5, 0.20000000298, -0.600000023842, 0.800000011921, -0.10000000149, 0.10000000149, -0.10000000149, 0.600000023842, -0.5, 0.10000000149, 0.0, 0.40000000596, 0.600000023842, 0.699999988079, 0.800000011921, 0.600000023842, 0.40000000596, 0.600000023842, 0.699999988079, 0.300000011921, 0.899999976158, 0.899999976158, 0.5, 0.600000023842, -0.40000000596, 0.600000023842, -0.300000011921, 0.699999988079, -0.300000011921, 0.10000000149, -0.10000000149, 0.20000000298, -0.40000000596, 0.40000000596, -0.699999988079, 0.600000023842, -0.899999976158, 0.300000011921, -0.699999988079, 0.699999988079, -0.699999988079, 0.5, -0.20000000298, 0.40000000596, -0.600000023842, 0.40000000596, 0.0, 0.800000011921, 0.899999976158, 0.40000000596, 0.800000011921, 0.600000023842, 0.800000011921, 0.20000000298, 0.40000000596, 0.899999976158, 0.600000023842, 0.5, -0.699999988079, 0.899999976158, -0.300000011921, 0.600000023842, -0.899999976158, 0.10000000149, -0.20000000298, 0.899999976158, -0.600000023842, 0.20000000298, -0.40000000596, 0.699999988079, -0.20000000298, 0.800000011921, -0.300000011921, 0.5, -0.10000000149, 0.20000000298, -0.699999988079, 0.699999988079, -0.800000011921, 0.800000011921, -0.899999976158, 0.699999988079, 0.0, 0.899999976158, 0.899999976158, 0.899999976158, 0.699999988079, 0.699999988079, 0.600000023842, 0.40000000596, 0.20000000298, 0.40000000596, -0.800000011921, 0.10000000149, -0.699999988079, 0.40000000596, -0.40000000596, 0.5, -0.40000000596, 0.899999976158, -0.800000011921, 0.10000000149, -0.899999976158, 0.699999988079, -0.600000023842, 0.10000000149, -0.600000023842, 0.10000000149, -0.600000023842, 0.5, -0.699999988079, 0.600000023842, -0.40000000596, 0.40000000596, -0.800000011921, 0.899999976158, -0.899999976158, 0.40000000596, 0.0, 0.300000011921, 0.10000000149, 0.800000011921, 0.40000000596, 0.5, 0.10000000149, 0.5, -0.20000000298, 0.899999976158, -0.600000023842, 0.10000000149, -0.600000023842, 0.600000023842, -0.800000011921, 0.10000000149, -0.5, 0.699999988079, -0.800000011921, 0.600000023842, -0.10000000149, 0.899999976158, -0.600000023842, 0.600000023842, -0.899999976158, 0.300000011921, -0.899999976158, 0.600000023842, -0.699999988079, 0.600000023842, -0.800000011921, 0.899999976158, -0.699999988079, 0.300000011921, -0.10000000149, 0.600000023842, 0.0, 0.899999976158, 0.699999988079, 0.5, 0.300000011921, 0.20000000298, -0.800000011921, 0.899999976158, -0.300000011921, 0.899999976158, -0.40000000596, 0.600000023842, -0.699999988079, 0.10000000149, -0.10000000149, 0.800000011921, -0.10000000149, 0.10000000149, -0.10000000149, 0.10000000149, -0.40000000596, 0.10000000149, -0.10000000149, 0.40000000596, -0.800000011921, 0.300000011921, -0.899999976158, 0.20000000298, -0.40000000596, 0.699999988079, -0.600000023842, 0.800000011921, -0.40000000596, 0.899999976158, -0.699999988079, 0.5, 0.0, 0.699999988079, 0.300000011921, 0.600000023842, -0.899999976158, 0.40000000596, -0.20000000298, 0.20000000298, -0.5, 0.10000000149, -0.800000011921, 0.10000000149, -0.899999976158, 0.300000011921, -0.300000011921, 0.40000000596, -0.5, 0.800000011921, -0.600000023842, 0.800000011921, -0.10000000149, 0.10000000149, -0.800000011921, 0.899999976158, -0.5, 0.899999976158, -0.600000023842, 0.40000000596, -0.20000000298, 0.5, -0.10000000149, 0.5, -0.300000011921, 0.699999988079, -0.300000011921, 0.600000023842, 0.0, 
+
+L2_cHER_A_nn_pu
+0.899999976158, 0.0, 0.10000000149, 0.600000023842, 0.40000000596, 0.20000000298, 0.40000000596, 0.800000011921, 0.5, 0.5, 0.40000000596, 0.10000000149, 0.10000000149, 0.40000000596, 0.20000000298, 0.699999988079, 0.899999976158, 0.300000011921, 0.699999988079, 0.800000011921, 0.300000011921, 0.10000000149, 0.600000023842, 0.40000000596, 0.5, 0.699999988079, 0.40000000596, 0.800000011921, 0.5, 0.20000000298, 0.20000000298, 0.800000011921, 0.600000023842, 0.899999976158, 0.300000011921, 0.0, 0.5, 0.40000000596, 0.10000000149, 0.600000023842, 0.600000023842, 0.300000011921, 0.5, 0.5, 0.699999988079, 0.699999988079, 0.40000000596, 0.600000023842, 0.300000011921, 0.40000000596, 0.899999976158, 0.699999988079, 0.800000011921, 0.699999988079, 0.600000023842, 0.300000011921, 0.899999976158, 0.300000011921, 0.10000000149, 0.699999988079, 0.899999976158, 0.600000023842, 0.899999976158, 0.300000011921, 0.40000000596, 0.20000000298, 0.10000000149, 0.0, 0.20000000298, 0.300000011921, 0.600000023842, 0.5, 0.600000023842, 0.5, 0.20000000298, 0.20000000298, 0.5, 0.300000011921, 0.699999988079, 0.800000011921, 0.800000011921, 0.5, 0.10000000149, 0.899999976158, 0.699999988079, 0.300000011921, 0.600000023842, 0.899999976158, 0.40000000596, 0.40000000596, 0.10000000149, 0.600000023842, 0.899999976158, 0.40000000596, 0.20000000298, 0.5, 0.300000011921, 0.0, 0.899999976158, 0.10000000149, 0.20000000298, 0.899999976158, 0.300000011921, 0.10000000149, 0.300000011921, 0.10000000149, 0.699999988079, 0.300000011921, 0.10000000149, 0.899999976158, 0.20000000298, 0.20000000298, 0.10000000149, 0.10000000149, 0.10000000149, 0.20000000298, 0.5, 0.40000000596, 0.600000023842, 0.800000011921, 0.600000023842, 0.699999988079, 0.10000000149, 0.800000011921, 0.600000023842, 0.0, 0.800000011921, 0.10000000149, 0.800000011921, 0.899999976158, 0.300000011921, 0.699999988079, 0.10000000149, 0.40000000596, 0.800000011921, 0.600000023842, 0.10000000149, 0.300000011921, 0.20000000298, 0.40000000596, 0.899999976158, 0.600000023842, 0.899999976158, 0.800000011921, 0.10000000149, 0.5, 0.10000000149, 0.10000000149, 0.10000000149, 0.899999976158, 0.899999976158, 0.0, 0.5, 0.699999988079, 0.800000011921, 0.20000000298, 0.800000011921, 0.5, 0.20000000298, 0.800000011921, 0.800000011921, 0.5, 0.40000000596, 0.699999988079, 0.20000000298, 0.40000000596, 0.10000000149, 0.899999976158, 0.699999988079, 0.800000011921, 0.800000011921, 0.10000000149, 0.300000011921, 0.300000011921, 0.899999976158, 0.0, 0.20000000298, 0.800000011921, 0.899999976158, 0.699999988079, 0.600000023842, 0.800000011921, 0.20000000298, 0.600000023842, 0.600000023842, 0.899999976158, 0.699999988079, 0.20000000298, 0.699999988079, 0.600000023842, 0.600000023842, 0.10000000149, 0.10000000149, 0.10000000149, 0.40000000596, 0.5, 0.5, 0.0, 0.10000000149, 0.10000000149, 0.800000011921, 0.899999976158, 0.800000011921, 0.10000000149, 0.300000011921, 0.699999988079, 0.800000011921, 0.300000011921, 0.10000000149, 0.600000023842, 0.899999976158, 0.600000023842, 0.10000000149, 0.40000000596, 0.800000011921, 0.600000023842, 0.20000000298, 0.0, 0.899999976158, 0.800000011921, 0.10000000149, 0.10000000149, 0.699999988079, 0.699999988079, 0.5, 0.10000000149, 0.10000000149, 0.600000023842, 0.600000023842, 0.899999976158, 0.10000000149, 0.10000000149, 0.800000011921, 0.10000000149, 0.20000000298, 0.0, 0.600000023842, 0.5, 0.5, 0.20000000298, 0.20000000298, 0.699999988079, 0.5, 0.699999988079, 0.300000011921, 0.899999976158, 0.40000000596, 0.800000011921, 0.10000000149, 0.800000011921, 0.10000000149, 0.0, 0.40000000596, 0.600000023842, 0.699999988079, 0.800000011921, 0.600000023842, 0.40000000596, 0.600000023842, 0.699999988079, 0.300000011921, 0.899999976158, 0.899999976158, 0.5, 0.40000000596, 0.0, 0.800000011921, 0.899999976158, 0.40000000596, 0.800000011921, 0.600000023842, 0.800000011921, 0.20000000298, 0.40000000596, 0.899999976158, 0.600000023842, 0.699999988079, 0.0, 0.899999976158, 0.899999976158, 0.899999976158, 0.699999988079, 0.699999988079, 0.600000023842, 0.40000000596, 0.20000000298, 0.40000000596, 0.0, 0.300000011921, 0.10000000149, 0.800000011921, 0.40000000596, 0.5, 0.10000000149, 0.600000023842, 0.0, 0.899999976158, 0.699999988079, 0.5, 0.300000011921, 0.5, 0.0, 0.699999988079, 0.300000011921, 0.600000023842, 0.0, 
+
+L2_cHER_x_n1
+0.300000011921, 0.300000011921, 0.800000011921, 0.600000023842, 0.800000011921, 0.800000011921, 0.600000023842, 0.10000000149, 0.5, 0.10000000149, 0.800000011921, 0.300000011921, 0.20000000298, 0.20000000298, 0.40000000596, 0.10000000149, 0.800000011921, 0.800000011921, 0.40000000596, 0.5, 0.300000011921, 0.800000011921, 0.600000023842, 0.40000000596, 0.699999988079, 0.699999988079, 0.300000011921, 0.5, 0.20000000298, 0.899999976158, 0.20000000298, 0.5, 0.899999976158, 0.699999988079, 
+
+L2_cHER_x_n2
+0.300000011921, 0.300000011921, 0.0, 0.0, 0.800000011921, 0.600000023842, 0.0, 0.0, 0.800000011921, 0.800000011921, 0.0, 0.0, 0.600000023842, 0.10000000149, 0.0, 0.0, 0.5, 0.10000000149, 0.0, 0.0, 0.800000011921, 0.300000011921, 0.0, 0.0, 0.20000000298, 0.20000000298, 0.0, 0.0, 0.40000000596, 0.10000000149, 0.0, 0.0, 0.800000011921, 0.800000011921, 0.0, 0.0, 0.40000000596, 0.5, 0.0, 0.0, 0.300000011921, 0.800000011921, 0.0, 0.0, 0.600000023842, 0.40000000596, 0.0, 0.0, 0.699999988079, 0.699999988079, 0.0, 0.0, 0.300000011921, 0.5, 0.0, 0.0, 0.20000000298, 0.899999976158, 0.0, 0.0, 0.20000000298, 0.5, 0.0, 0.0, 0.899999976158, 0.699999988079, 0.0, 0.0, 
+
+L2_cHER_o_N
+1.07999999046, 0.0, 0.520000028908, 0.66000002265, 0.880000032187, 0.20000000298, 0.610000021905, 0.950000024587, 0.6800000076, 0.620000004321, 0.730000026226, 0.250000007451, 0.220000008047, 0.40000000596, 0.350000011176, 0.789999992996, 1.38000000238, 0.300000011921, 0.970000000596, 0.770000012517, 0.630000032187, -0.0500000044703, 0.900000044703, 0.460000013709, 0.920000009537, 0.699999988079, 0.640000019073, 0.740000013113, 0.830000006855, -0.00999999731779, 0.410000012219, 0.710000009239, 1.08000003219, 0.959999974966, 0.520000028908, -0.66000002265, 1.3000000596, 0.0, 1.6200000453, 0.240000013113, 0.640000030994, 0.880000050068, 1.06000003308, 0.520000021458, 1.32000003338, 0.740000013113, 0.979999999404, 0.659999989867, 0.780000018775, 0.760000034571, 1.42000005722, 0.240000013113, 1.51999999762, 0.539999995232, 1.52000005126, 0.239999983311, 1.32000006318, 0.340000030994, 1.8799999845, 0.16000002265, 0.640000026524, 0.479999996424, 1.59999998808, 3.87430194593e-08, 1.35999999285, 0.020000012517, 1.54000000715, 0.180000011325, 0.880000032187, -0.20000000298, 1.6200000453, -0.240000013113, 1.38000003964, 0.0, 0.76000003159, 0.700000035763, 1.08000003219, 0.820000003576, 1.48000005603, 0.90000000596, 0.520000012517, 0.20000000298, 0.900000011921, 0.540000019073, 1.98000002623, 0.800000011921, 1.52000002742, 0.420000003576, 0.980000033677, 0.499999970198, 1.50000002384, 0.46000002861, 1.72000002146, 0.899999976158, 1.04000002503, 0.240000013113, 0.979999997914, 0.0400000369549, 1.45999998689, 0.160000004768, 1.47999999344, 0.659999992847, 0.610000021905, -0.950000024587, 0.640000030994, -0.880000050068, 0.76000003159, -0.700000035763, 0.670000040829, 0.0, 1.20999998838, 0.0899999989569, 0.710000030845, 0.799999964237, 0.440000019073, -4.47034842477e-09, 0.550000025332, 0.079999999404, 1.26000001669, -0.100000011921, 0.390000015348, 0.639999965429, 0.46000001967, -0.250000021607, 0.500000031292, -0.0800000083447, 0.590000010878, -0.150000006706, 0.73000001505, 0.129999995679, 0.810000029355, 0.280000005364, 0.770000031143, 0.419999976754, 0.710000008494, 0.470000001341, 0.6800000076, -0.620000004321, 1.06000003308, -0.520000021458, 1.08000003219, -0.820000003576, 1.20999998838, -0.0899999989569, 0.86000002414, 0.0, 1.23000001952, 0.0299999979138, 0.920000014007, 0.819999975264, 0.510000015199, 0.689999988526, 0.580000009835, 0.0800000023842, 1.05000001565, 0.390000025034, 0.330000009835, -0.0699999924004, 0.540000016093, 0.260000006258, 1.31999997005, 0.320000029653, 1.09999998286, 0.58000001356, 0.290000001937, 0.070000012517, 0.250000003725, -0.129999997914, 0.61999998942, 0.639999981076, 0.730000026226, -0.250000007451, 1.32000003338, -0.740000013113, 1.48000005603, -0.90000000596, 0.710000030845, -0.799999964237, 1.23000001952, -0.0299999979138, 1.63000000238, 0.0, 0.720000008047, 0.599999986589, 1.1500000231, 0.240000007153, 1.68000004411, 0.0999999940395, 0.670000018477, 0.520000012517, 1.28000003815, -0.0500000119209, 1.00000003874, 0.559999992847, 0.970000006557, 0.0500000119209, 0.490000020564, 0.58999997735, 1.12999999642, 0.140000023544, 1.11000002265, -0.240000001192, 1.23000000834, 0.0100000166893, 0.220000008047, -0.40000000596, 0.979999999404, -0.659999989867, 0.520000012517, -0.20000000298, 0.440000019073, 4.47034842477e-09, 0.920000014007, -0.819999975264, 0.720000008047, -0.599999986589, 0.979999978542, 0.0, 0.30000000596, 0.860000013709, 1.21999998569, 0.699999988079, 0.780000027716, 0.780000012815, 0.420000011027, 0.500000022352, 0.800000032783, 0.93999998033, 0.979999987483, 0.20000000298, 0.859999992847, 0.56000002563, 0.820000022948, -0.0399999952316, 0.240000004172, 0.0400000011921, 0.720000003576, 0.539999998212, 0.350000011176, -0.789999992996, 0.780000018775, -0.760000034571, 0.900000011921, -0.540000019073, 0.550000025332, -0.079999999404, 0.510000015199, -0.689999988526, 1.1500000231, -0.240000007153, 0.30000000596, -0.860000013709, 0.670000005066, 0.0, 0.500000013411, -0.140000005662, 1.01000001743, 0.73999997437, 1.00000002086, -0.190000006407, 0.580000026226, 0.599999986589, 1.15000001118, 0.090000012368, 0.270000008792, 0.430000022501, 1.0699999775, 0.26000002861, 0.230000004619, 0.220000003576, 1.2300000076, 0.410000023395, 1.38000000238, -0.300000011921, 1.42000005722, -0.240000013113, 1.98000002623, -0.800000011921, 1.26000001669, 0.100000011921, 0.580000009835, -0.0800000023842, 1.68000004411, -0.0999999940395, 1.21999998569, -0.699999988079, 0.500000013411, 0.140000005662, 1.48000004113, 0.0, 1.61999999166, 0.720000015497, 0.980000033677, -0.30000000447, 1.50000002384, 0.860000004768, 1.61999999762, 0.10000000149, 0.740000020564, 0.440000030994, 1.48000002027, 0.339999989271, 0.660000012219, -0.139999999702, 2.08000000238, 0.259999994338, 0.970000000596, -0.770000012517, 1.51999999762, -0.539999995232, 1.52000002742, -0.420000003576, 0.390000015348, -0.639999965429, 1.05000001565, -0.390000025034, 0.670000018477, -0.520000012517, 0.780000027716, -0.780000012815, 1.01000001743, -0.73999997437, 1.61999999166, -0.720000015497, 0.610000007749, 0.0, 1.12000003636, 0.329999996424, 0.940000016093, 0.340000010133, 0.829999996424, 0.769999982715, 0.870000006557, 0.649999991059, 0.830000002384, 0.639999981821, 0.730000008345, 0.700000010431, 0.809999991357, 0.970000000596, 0.630000032187, 0.0500000044703, 1.52000005126, -0.239999983311, 0.980000033677, -0.499999970198, 0.46000001967, 0.250000021607, 0.330000009835, 0.0699999924004, 1.28000003815, 0.0500000119209, 0.420000011027, -0.500000022352, 1.00000002086, 0.190000006407, 0.980000033677, 0.30000000447, 1.12000003636, -0.329999996424, 0.830000027716, 0.0, 0.900000029802, 0.960000043511, 1.46999999166, 1.15000000596, 1.09000003695, 0.490000013113, 1.38000001878, 0.589999989271, 0.76000002116, 0.909999974966, 1.72999997854, 1.00999998689, 0.900000044703, -0.460000013709, 1.32000006318, -0.340000030994, 1.50000002384, -0.46000002861, 0.500000031292, 0.0800000083447, 0.540000016093, -0.260000006258, 1.00000003874, -0.559999992847, 0.800000032783, -0.93999998033, 0.580000026226, -0.599999986589, 1.50000002384, -0.860000004768, 0.940000016093, -0.340000010133, 0.900000029802, -0.960000043511, 0.920000039339, 0.0, 1.50000002086, 0.759999966025, 0.780000023246, 0.620000006557, 1.08000002623, 0.340000007153, 0.520000012517, 0.179999996424, 1.71999998271, 0.540000010133, 0.920000009537, -0.699999988079, 1.8799999845, -0.16000002265, 1.72000002146, -0.899999976158, 0.590000010878, 0.150000006706, 1.31999997005, -0.320000029653, 0.970000006557, -0.0500000119209, 0.979999987483, -0.20000000298, 1.15000001118, -0.090000012368, 1.61999999762, -0.10000000149, 0.829999996424, -0.769999982715, 1.46999999166, -1.15000000596, 1.50000002086, -0.759999966025, 1.6799999547, 0.0, 1.45999997497, 0.759999986887, 1.66999994844, 0.210000015199, 1.18999998182, 0.390000029504, 1.51999996185, 0.339999992251, 0.640000019073, -0.740000013113, 0.640000026524, -0.479999996424, 1.04000002503, -0.240000013113, 0.73000001505, -0.129999995679, 1.09999998286, -0.58000001356, 0.490000020564, -0.58999997735, 0.859999992847, -0.56000002563, 0.270000008792, -0.430000022501, 0.740000020564, -0.440000030994, 0.870000006557, -0.649999991059, 1.09000003695, -0.490000013113, 0.780000023246, -0.620000006557, 1.45999997497, -0.759999986887, 0.740000013113, 0.0, 0.810000003278, -0.070000000596, 1.1100000152, 0.35000000149, 1.11999999762, 0.339999984801, 0.830000006855, 0.00999999731779, 1.59999998808, -3.87430194593e-08, 0.979999997914, -0.0400000369549, 0.810000029355, -0.280000005364, 0.290000001937, -0.070000012517, 1.12999999642, -0.140000023544, 0.820000022948, 0.0399999952316, 1.0699999775, -0.26000002861, 1.48000002027, -0.339999989271, 0.830000002384, -0.639999981821, 1.38000001878, -0.589999989271, 1.08000002623, -0.340000007153, 1.66999994844, -0.210000015199, 0.810000003278, 0.070000000596, 1.44999998212, 0.0, 1.38999996543, 0.779999984503, 1.3099999705, 0.969999969304, 0.410000012219, -0.710000009239, 1.35999999285, -0.020000012517, 1.45999998689, -0.160000004768, 0.770000031143, -0.419999976754, 0.250000003725, 0.129999997914, 1.11000002265, 0.240000001192, 0.240000004172, -0.0400000011921, 0.230000004619, -0.220000003576, 0.660000012219, 0.139999999702, 0.730000008345, -0.700000010431, 0.76000002116, -0.909999974966, 0.520000012517, -0.179999996424, 1.18999998182, -0.390000029504, 1.1100000152, -0.35000000149, 1.38999996543, -0.779999984503, 0.790000001192, 0.0, 1.22999998003, 0.610000000298, 1.08000003219, -0.959999974966, 1.54000000715, -0.180000011325, 1.47999999344, -0.659999992847, 0.710000008494, -0.470000001341, 0.61999998942, -0.639999981076, 1.23000000834, -0.0100000166893, 0.720000003576, -0.539999998212, 1.2300000076, -0.410000023395, 2.08000000238, -0.259999994338, 0.809999991357, -0.970000000596, 1.72999997854, -1.00999998689, 1.71999998271, -0.540000010133, 1.51999996185, -0.339999992251, 1.11999999762, -0.339999984801, 1.3099999705, -0.969999969304, 1.22999998003, -0.610000000298, 1.89999996424, 0.0, 
+
+L2_cHER_o_N_pu
+1.07999999046, 0.0, 0.520000028908, 0.66000002265, 0.880000032187, 0.20000000298, 0.610000021905, 0.950000024587, 0.6800000076, 0.620000004321, 0.730000026226, 0.250000007451, 0.220000008047, 0.40000000596, 0.350000011176, 0.789999992996, 1.38000000238, 0.300000011921, 0.970000000596, 0.770000012517, 0.630000032187, -0.0500000044703, 0.900000044703, 0.460000013709, 0.920000009537, 0.699999988079, 0.640000019073, 0.740000013113, 0.830000006855, -0.00999999731779, 0.410000012219, 0.710000009239, 1.08000003219, 0.959999974966, 1.3000000596, 0.0, 1.6200000453, 0.240000013113, 0.640000030994, 0.880000050068, 1.06000003308, 0.520000021458, 1.32000003338, 0.740000013113, 0.979999999404, 0.659999989867, 0.780000018775, 0.760000034571, 1.42000005722, 0.240000013113, 1.51999999762, 0.539999995232, 1.52000005126, 0.239999983311, 1.32000006318, 0.340000030994, 1.8799999845, 0.16000002265, 0.640000026524, 0.479999996424, 1.59999998808, 3.87430194593e-08, 1.35999999285, 0.020000012517, 1.54000000715, 0.180000011325, 1.38000003964, 0.0, 0.76000003159, 0.700000035763, 1.08000003219, 0.820000003576, 1.48000005603, 0.90000000596, 0.520000012517, 0.20000000298, 0.900000011921, 0.540000019073, 1.98000002623, 0.800000011921, 1.52000002742, 0.420000003576, 0.980000033677, 0.499999970198, 1.50000002384, 0.46000002861, 1.72000002146, 0.899999976158, 1.04000002503, 0.240000013113, 0.979999997914, 0.0400000369549, 1.45999998689, 0.160000004768, 1.47999999344, 0.659999992847, 0.670000040829, 0.0, 1.20999998838, 0.0899999989569, 0.710000030845, 0.799999964237, 0.440000019073, -4.47034842477e-09, 0.550000025332, 0.079999999404, 1.26000001669, -0.100000011921, 0.390000015348, 0.639999965429, 0.46000001967, -0.250000021607, 0.500000031292, -0.0800000083447, 0.590000010878, -0.150000006706, 0.73000001505, 0.129999995679, 0.810000029355, 0.280000005364, 0.770000031143, 0.419999976754, 0.710000008494, 0.470000001341, 0.86000002414, 0.0, 1.23000001952, 0.0299999979138, 0.920000014007, 0.819999975264, 0.510000015199, 0.689999988526, 0.580000009835, 0.0800000023842, 1.05000001565, 0.390000025034, 0.330000009835, -0.0699999924004, 0.540000016093, 0.260000006258, 1.31999997005, 0.320000029653, 1.09999998286, 0.58000001356, 0.290000001937, 0.070000012517, 0.250000003725, -0.129999997914, 0.61999998942, 0.639999981076, 1.63000000238, 0.0, 0.720000008047, 0.599999986589, 1.1500000231, 0.240000007153, 1.68000004411, 0.0999999940395, 0.670000018477, 0.520000012517, 1.28000003815, -0.0500000119209, 1.00000003874, 0.559999992847, 0.970000006557, 0.0500000119209, 0.490000020564, 0.58999997735, 1.12999999642, 0.140000023544, 1.11000002265, -0.240000001192, 1.23000000834, 0.0100000166893, 0.979999978542, 0.0, 0.30000000596, 0.860000013709, 1.21999998569, 0.699999988079, 0.780000027716, 0.780000012815, 0.420000011027, 0.500000022352, 0.800000032783, 0.93999998033, 0.979999987483, 0.20000000298, 0.859999992847, 0.56000002563, 0.820000022948, -0.0399999952316, 0.240000004172, 0.0400000011921, 0.720000003576, 0.539999998212, 0.670000005066, 0.0, 0.500000013411, -0.140000005662, 1.01000001743, 0.73999997437, 1.00000002086, -0.190000006407, 0.580000026226, 0.599999986589, 1.15000001118, 0.090000012368, 0.270000008792, 0.430000022501, 1.0699999775, 0.26000002861, 0.230000004619, 0.220000003576, 1.2300000076, 0.410000023395, 1.48000004113, 0.0, 1.61999999166, 0.720000015497, 0.980000033677, -0.30000000447, 1.50000002384, 0.860000004768, 1.61999999762, 0.10000000149, 0.740000020564, 0.440000030994, 1.48000002027, 0.339999989271, 0.660000012219, -0.139999999702, 2.08000000238, 0.259999994338, 0.610000007749, 0.0, 1.12000003636, 0.329999996424, 0.940000016093, 0.340000010133, 0.829999996424, 0.769999982715, 0.870000006557, 0.649999991059, 0.830000002384, 0.639999981821, 0.730000008345, 0.700000010431, 0.809999991357, 0.970000000596, 0.830000027716, 0.0, 0.900000029802, 0.960000043511, 1.46999999166, 1.15000000596, 1.09000003695, 0.490000013113, 1.38000001878, 0.589999989271, 0.76000002116, 0.909999974966, 1.72999997854, 1.00999998689, 0.920000039339, 0.0, 1.50000002086, 0.759999966025, 0.780000023246, 0.620000006557, 1.08000002623, 0.340000007153, 0.520000012517, 0.179999996424, 1.71999998271, 0.540000010133, 1.6799999547, 0.0, 1.45999997497, 0.759999986887, 1.66999994844, 0.210000015199, 1.18999998182, 0.390000029504, 1.51999996185, 0.339999992251, 0.740000013113, 0.0, 0.810000003278, -0.070000000596, 1.1100000152, 0.35000000149, 1.11999999762, 0.339999984801, 1.44999998212, 0.0, 1.38999996543, 0.779999984503, 1.3099999705, 0.969999969304, 0.790000001192, 0.0, 1.22999998003, 0.610000000298, 1.89999996424, 0.0, 
+
+L2_zHER_A_nn
+0.9, 0.0, 0.8, 0.4, 0.6, 0.1, 0.9, 0.1, 0.8, 0.9, 0.4, 0.6, 0.2, 0.8, 0.6, 0.7, 0.5, 0.2, 0.8, 0.8, 0.4, 0.1, 0.1, 0.5, 0.7, 0.5, 0.2, 0.4, 0.3, 0.9, 0.7, 0.3, 0.3, 0.2, 0.8, -0.4, 0.4, 0.0, 0.5, 0.6, 0.8, 0.2, 0.7, 0.7, 0.6, 0.8, 0.7, 0.6, 0.1, 0.7, 0.6, 0.6, 0.8, 0.2, 0.3, 0.8, 0.3, 0.5, 0.4, 0.9, 0.3, 0.3, 0.1, 0.9, 0.3, 0.5, 0.6, 0.2, 0.6, -0.1, 0.5, -0.6, 0.2, 0.0, 0.2, 0.9, 0.4, 0.1, 0.5, 0.5, 0.4, 0.7, 0.1, 0.9, 0.5, 0.2, 0.2, 0.7, 0.5, 0.2, 0.7, 0.7, 0.8, 0.5, 0.8, 0.4, 0.1, 0.6, 0.7, 0.1, 0.8, 0.8, 0.9, -0.1, 0.8, -0.2, 0.2, -0.9, 0.5, 0.0, 0.8, 0.3, 0.3, 0.4, 0.1, 0.3, 0.6, 0.7, 0.4, 0.9, 0.4, 0.5, 0.4, 0.2, 0.7, 0.8, 0.5, 0.1, 0.4, 0.9, 0.7, 0.1, 0.2, 0.3, 0.8, 0.4, 0.8, -0.9, 0.7, -0.7, 0.4, -0.1, 0.8, -0.3, 0.6, 0.0, 0.6, 0.5, 0.8, 0.2, 0.6, 0.4, 0.3, 0.5, 0.2, 0.2, 0.5, 0.9, 0.1, 0.5, 0.2, 0.2, 0.9, 0.9, 0.5, 0.7, 0.6, 0.3, 0.3, 0.8, 0.4, -0.6, 0.6, -0.8, 0.5, -0.5, 0.3, -0.4, 0.6, -0.5, 0.7, 0.0, 0.3, 0.4, 0.4, 0.7, 0.9, 0.2, 0.3, 0.6, 0.2, 0.6, 0.9, 0.3, 0.1, 0.3, 0.7, 0.9, 0.7, 0.8, 0.9, 0.7, 0.3, 0.3, 0.2, -0.8, 0.7, -0.6, 0.4, -0.7, 0.1, -0.3, 0.8, -0.2, 0.3, -0.4, 0.3, 0.0, 0.5, 0.9, 0.2, 0.9, 0.4, 0.6, 0.2, 0.3, 0.7, 0.8, 0.5, 0.3, 0.3, 0.1, 0.5, 0.6, 0.4, 0.7, 0.8, 0.3, 0.6, -0.7, 0.1, -0.7, 0.1, -0.9, 0.6, -0.7, 0.6, -0.4, 0.4, -0.7, 0.5, -0.9, 0.8, 0.0, 0.2, 0.3, 0.5, 0.5, 0.6, 0.8, 0.2, 0.2, 0.3, 0.6, 0.8, 0.4, 0.2, 0.7, 0.5, 0.3, 0.5, 0.9, 0.5, -0.2, 0.6, -0.6, 0.5, -0.2, 0.4, -0.9, 0.3, -0.5, 0.9, -0.2, 0.2, -0.9, 0.2, -0.3, 0.5, 0.0, 0.4, 0.9, 0.8, 0.2, 0.1, 0.1, 0.6, 0.1, 0.8, 0.3, 0.9, 0.4, 0.1, 0.4, 0.8, 0.7, 0.8, -0.8, 0.8, -0.2, 0.2, -0.7, 0.4, -0.5, 0.2, -0.2, 0.3, -0.6, 0.4, -0.6, 0.5, -0.5, 0.4, -0.9, 0.3, 0.0, 0.1, 0.2, 0.8, 0.2, 0.9, 0.2, 0.8, 0.5, 0.4, 0.8, 0.4, 0.1, 0.6, 0.4, 0.4, -0.1, 0.3, -0.8, 0.5, -0.2, 0.4, -0.2, 0.5, -0.9, 0.2, -0.6, 0.2, -0.3, 0.6, -0.8, 0.8, -0.2, 0.1, -0.2, 0.1, 0.0, 0.7, 0.3, 0.8, 0.3, 0.1, 0.6, 0.8, 0.8, 0.3, 0.1, 0.1, 0.5, 0.1, -0.5, 0.3, -0.5, 0.7, -0.7, 0.7, -0.8, 0.1, -0.5, 0.9, -0.3, 0.7, -0.8, 0.2, -0.2, 0.1, -0.1, 0.8, -0.2, 0.7, -0.3, 0.1, 0.0, 0.5, 0.2, 0.6, 0.9, 0.1, 0.5, 0.9, 0.3, 0.2, 0.7, 0.7, -0.5, 0.4, -0.9, 0.8, -0.5, 0.5, -0.1, 0.2, -0.2, 0.1, -0.3, 0.5, -0.3, 0.3, -0.6, 0.6, -0.1, 0.9, -0.2, 0.8, -0.3, 0.5, -0.2, 0.4, 0.0, 0.5, 0.8, 0.7, 0.3, 0.7, 0.8, 0.4, 0.5, 0.2, -0.4, 0.3, -0.3, 0.8, -0.4, 0.4, -0.9, 0.9, -0.9, 0.7, -0.9, 0.3, -0.1, 0.8, -0.4, 0.8, -0.3, 0.8, -0.5, 0.1, -0.6, 0.6, -0.9, 0.5, -0.8, 0.8, 0.0, 0.3, 0.1, 0.4, 0.6, 0.1, 0.9, 0.3, -0.9, 0.1, -0.9, 0.1, -0.6, 0.7, -0.1, 0.5, -0.7, 0.7, -0.8, 0.5, -0.6, 0.2, -0.7, 0.9, -0.4, 0.4, -0.8, 0.8, -0.8, 0.1, -0.5, 0.7, -0.3, 0.3, -0.1, 0.4, 0.0, 0.7, 0.1, 0.2, 0.4, 0.7, -0.3, 0.3, -0.5, 0.7, -0.1, 0.2, -0.3, 0.6, -0.3, 0.9, -0.7, 0.4, -0.7, 0.5, -0.3, 0.1, -0.4, 0.4, -0.1, 0.3, -0.1, 0.9, -0.3, 0.7, -0.8, 0.4, -0.6, 0.7, -0.1, 0.3, 0.0, 0.3, 0.9, 0.3, -0.2, 0.6, -0.2, 0.8, -0.8, 0.8, -0.4, 0.3, -0.8, 0.3, -0.3, 0.8, -0.3, 0.5, -0.9, 0.8, -0.7, 0.6, -0.4, 0.1, -0.5, 0.2, -0.7, 0.4, -0.5, 0.1, -0.9, 0.2, -0.4, 0.3, -0.9, 0.1, 0.0, 
+
+L2_zHER_A_nn_pu
+0.9, 0.0, 0.8, 0.4, 0.6, 0.1, 0.9, 0.1, 0.8, 0.9, 0.4, 0.6, 0.2, 0.8, 0.6, 0.7, 0.5, 0.2, 0.8, 0.8, 0.4, 0.1, 0.1, 0.5, 0.7, 0.5, 0.2, 0.4, 0.3, 0.9, 0.7, 0.3, 0.3, 0.2, 0.4, 0.0, 0.5, 0.6, 0.8, 0.2, 0.7, 0.7, 0.6, 0.8, 0.7, 0.6, 0.1, 0.7, 0.6, 0.6, 0.8, 0.2, 0.3, 0.8, 0.3, 0.5, 0.4, 0.9, 0.3, 0.3, 0.1, 0.9, 0.3, 0.5, 0.6, 0.2, 0.2, 0.0, 0.2, 0.9, 0.4, 0.1, 0.5, 0.5, 0.4, 0.7, 0.1, 0.9, 0.5, 0.2, 0.2, 0.7, 0.5, 0.2, 0.7, 0.7, 0.8, 0.5, 0.8, 0.4, 0.1, 0.6, 0.7, 0.1, 0.8, 0.8, 0.5, 0.0, 0.8, 0.3, 0.3, 0.4, 0.1, 0.3, 0.6, 0.7, 0.4, 0.9, 0.4, 0.5, 0.4, 0.2, 0.7, 0.8, 0.5, 0.1, 0.4, 0.9, 0.7, 0.1, 0.2, 0.3, 0.8, 0.4, 0.6, 0.0, 0.6, 0.5, 0.8, 0.2, 0.6, 0.4, 0.3, 0.5, 0.2, 0.2, 0.5, 0.9, 0.1, 0.5, 0.2, 0.2, 0.9, 0.9, 0.5, 0.7, 0.6, 0.3, 0.3, 0.8, 0.7, 0.0, 0.3, 0.4, 0.4, 0.7, 0.9, 0.2, 0.3, 0.6, 0.2, 0.6, 0.9, 0.3, 0.1, 0.3, 0.7, 0.9, 0.7, 0.8, 0.9, 0.7, 0.3, 0.3, 0.3, 0.0, 0.5, 0.9, 0.2, 0.9, 0.4, 0.6, 0.2, 0.3, 0.7, 0.8, 0.5, 0.3, 0.3, 0.1, 0.5, 0.6, 0.4, 0.7, 0.8, 0.3, 0.8, 0.0, 0.2, 0.3, 0.5, 0.5, 0.6, 0.8, 0.2, 0.2, 0.3, 0.6, 0.8, 0.4, 0.2, 0.7, 0.5, 0.3, 0.5, 0.9, 0.5, 0.0, 0.4, 0.9, 0.8, 0.2, 0.1, 0.1, 0.6, 0.1, 0.8, 0.3, 0.9, 0.4, 0.1, 0.4, 0.8, 0.7, 0.3, 0.0, 0.1, 0.2, 0.8, 0.2, 0.9, 0.2, 0.8, 0.5, 0.4, 0.8, 0.4, 0.1, 0.6, 0.4, 0.1, 0.0, 0.7, 0.3, 0.8, 0.3, 0.1, 0.6, 0.8, 0.8, 0.3, 0.1, 0.1, 0.5, 0.1, 0.0, 0.5, 0.2, 0.6, 0.9, 0.1, 0.5, 0.9, 0.3, 0.2, 0.7, 0.4, 0.0, 0.5, 0.8, 0.7, 0.3, 0.7, 0.8, 0.4, 0.5, 0.8, 0.0, 0.3, 0.1, 0.4, 0.6, 0.1, 0.9, 0.4, 0.0, 0.7, 0.1, 0.2, 0.4, 0.3, 0.0, 0.3, 0.9, 0.1, 0.0, 
+
+L2_zHER_x_n1
+0.4, 0.2, 0.7, 0.9, 0.7, 0.3, 0.5, 0.8, 0.9, 0.6, 0.3, 0.7, 0.6, 0.1, 0.9, 0.2, 0.3, 0.7, 0.9, 0.9, 0.2, 0.3, 0.2, 0.7, 0.8, 0.8, 0.2, 0.5, 0.5, 0.5, 0.8, 0.3, 0.9, 0.1, 
+
+L2_zHER_x_n2
+0.4, 0.2, 0.0, 0.0, 0.7, 0.9, 0.0, 0.0, 0.7, 0.3, 0.0, 0.0, 0.5, 0.8, 0.0, 0.0, 0.9, 0.6, 0.0, 0.0, 0.3, 0.7, 0.0, 0.0, 0.6, 0.1, 0.0, 0.0, 0.9, 0.2, 0.0, 0.0, 0.3, 0.7, 0.0, 0.0, 0.9, 0.9, 0.0, 0.0, 0.2, 0.3, 0.0, 0.0, 0.2, 0.7, 0.0, 0.0, 0.8, 0.8, 0.0, 0.0, 0.2, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.8, 0.3, 0.0, 0.0, 0.9, 0.1, 0.0, 0.0, 
+
+L2_zHER_o_N
+1.1, 0.0, 1.26, 0.18, 0.94, 0.12, 1.26, -0.12, 1.28, 0.84, 0.66, 0.38, 0.46, 0.88, 1.0, 0.8, 0.76, -0.02, 1.34, 0.62, 0.54, 0.02, 0.32, 0.26, 1.18, 0.34, 0.38, 0.24, 0.6, 0.8, 1.08, 0.34, 0.68, 0.34, 1.26, -0.18, 1.7, 0.0, 1.26, 1.02, 1.87, 0.09, 1.87, 1.09, 1.44, 0.58, 1.21, 1.07, 0.91, 1.37, 1.44, 0.38, 2.24, 0.38, 0.71, 0.77, 1.07, 0.19, 1.68, 1.06, 0.89, 0.13, 0.9, 1.0, 1.13, 1.01, 1.32, 0.94, 0.94, -0.12, 1.26, -1.02, 0.78, 0.0, 0.79, 0.49, 1.21, -0.05, 0.92, 0.1, 0.85, 0.81, 0.79, 1.03, 0.92, -0.2, 1.1, 0.34, 0.73, 0.05, 1.05, 0.27, 1.6, 0.18, 1.09, 0.11, 0.6, 0.4, 1.35, 0.13, 1.46, 1.0, 1.26, 0.12, 1.87, -0.09, 0.79, -0.49, 1.39, 0.0, 1.73, 0.72, 1.01, 0.29, 0.48, 0.73, 1.21, 1.32, 1.11, 0.79, 1.57, 0.77, 0.74, 0.21, 1.36, 0.61, 1.54, 0.34, 0.9, 0.81, 1.35, 0.25, 0.84, 0.79, 1.33, 1.07, 1.28, -0.84, 1.87, -1.09, 1.21, 0.05, 1.73, -0.72, 1.77, 0.0, 1.29, 0.05, 1.4, 0.47, 1.53, 0.76, 0.99, 0.05, 1.55, -0.07, 0.86, 0.75, 0.7, -0.01, 1.4, -0.04, 1.38, 0.57, 1.25, 0.55, 1.5, 0.51, 1.17, 1.25, 0.66, -0.38, 1.44, -0.58, 0.92, -0.1, 1.01, -0.29, 1.29, -0.05, 1.28, 0.0, 0.55, 0.79, 0.81, 1.27, 1.48, 0.2, 1.2, 0.96, 0.47, 0.65, 1.45, 0.23, 0.9, 0.62, 1.11, 0.89, 1.2, 1.0, 1.35, 1.17, 0.64, 0.9, 0.46, -0.88, 1.21, -1.07, 0.85, -0.81, 0.48, -0.73, 1.4, -0.47, 0.55, -0.79, 0.67, 0.0, 1.06, 0.87, 0.45, 0.51, 1.03, 0.15, 0.35, 0.14, 0.89, 0.4, 1.06, -0.1, 0.47, -0.18, 0.85, 0.35, 0.91, 0.6, 1.35, 0.33, 1.0, -0.8, 0.91, -1.37, 0.79, -1.03, 1.21, -1.32, 1.53, -0.76, 0.81, -1.27, 1.06, -0.87, 1.65, 0.0, 0.61, -0.27, 1.49, -0.13, 0.84, 0.57, 0.52, -0.39, 1.18, 0.04, 1.08, -0.01, 0.75, 0.35, 1.28, 0.19, 1.33, 0.99, 0.76, 0.02, 1.44, -0.38, 0.92, 0.2, 1.11, -0.79, 0.99, -0.05, 1.48, -0.2, 0.45, -0.51, 0.61, 0.27, 1.08, 0.0, 1.3, 1.26, 1.07, 0.25, 0.65, 0.03, 1.4, 0.42, 1.21, 0.29, 1.4, 0.6, 0.55, 0.87, 1.14, 1.3, 1.34, -0.62, 2.24, -0.38, 1.1, -0.34, 1.57, -0.77, 1.55, 0.07, 1.2, -0.96, 1.03, -0.15, 1.49, 0.13, 1.3, -1.26, 1.92, 0.0, 0.55, 0.11, 1.61, -0.25, 2.34, 0.2, 1.43, 0.23, 1.3, 0.8, 1.39, 0.55, 1.5, 1.12, 0.54, -0.02, 0.71, -0.77, 0.73, -0.05, 0.74, -0.21, 0.86, -0.75, 0.47, -0.65, 0.35, -0.14, 0.84, -0.57, 1.07, -0.25, 0.55, -0.11, 0.23, 0.0, 0.95, 0.22, 1.2, 0.38, 0.29, 0.56, 1.05, 0.85, 0.55, 0.28, 0.31, 0.75, 0.32, -0.26, 1.07, -0.19, 1.05, -0.27, 1.36, -0.61, 0.7, 0.01, 1.45, -0.23, 0.89, -0.4, 0.52, 0.39, 0.65, -0.03, 1.61, 0.25, 0.95, -0.22, 0.63, 0.0, 1.22, 0.6, 0.99, 0.94, 0.55, 0.75, 1.27, 0.8, 0.45, 1.31, 1.18, -0.34, 1.68, -1.06, 1.6, -0.18, 1.54, -0.34, 1.4, 0.04, 0.9, -0.62, 1.06, 0.1, 1.18, -0.04, 1.4, -0.42, 2.34, -0.2, 1.2, -0.38, 1.22, -0.6, 1.68, 0.0, 1.06, 0.56, 1.5, 0.3, 1.58, 1.2, 1.2, 1.14, 0.38, -0.24, 0.89, -0.13, 1.09, -0.11, 0.9, -0.81, 1.38, -0.57, 1.11, -0.89, 0.47, 0.18, 1.08, 0.01, 1.21, -0.29, 1.43, -0.23, 0.29, -0.56, 0.99, -0.94, 1.06, -0.56, 1.09, 0.0, 0.65, 0.25, 0.71, 0.94, 0.33, 1.33, 0.6, -0.8, 0.9, -1.0, 0.6, -0.4, 1.35, -0.25, 1.25, -0.55, 1.2, -1.0, 0.85, -0.35, 0.75, -0.35, 1.4, -0.6, 1.3, -0.8, 1.05, -0.85, 0.55, -0.75, 1.5, -0.3, 0.65, -0.25, 0.9, 0.0, 1.25, 0.35, 0.7, 0.8, 1.08, -0.34, 1.13, -1.01, 1.35, -0.13, 0.84, -0.79, 1.5, -0.51, 1.35, -1.17, 0.91, -0.6, 1.28, -0.19, 0.55, -0.87, 1.39, -0.55, 0.55, -0.28, 1.27, -0.8, 1.58, -1.2, 0.71, -0.94, 1.25, -0.35, 1.03, 0.0, 1.05, 1.09, 0.68, -0.34, 1.32, -0.94, 1.46, -1.0, 1.33, -1.07, 1.17, -1.25, 0.64, -0.9, 1.35, -0.33, 1.33, -0.99, 1.14, -1.3, 1.5, -1.12, 0.31, -0.75, 0.45, -1.31, 1.2, -1.14, 0.33, -1.33, 0.7, -0.8, 1.05, -1.09, 0.92, 0.0, 
+
+L2_zHER_o_N_pu
+1.1, 0.0, 1.26, 0.18, 0.94, 0.12, 1.26, -0.12, 1.28, 0.84, 0.66, 0.38, 0.46, 0.88, 1.0, 0.8, 0.76, -0.02, 1.34, 0.62, 0.54, 0.02, 0.32, 0.26, 1.18, 0.34, 0.38, 0.24, 0.6, 0.8, 1.08, 0.34, 0.68, 0.34, 1.7, 0.0, 1.26, 1.02, 1.87, 0.09, 1.87, 1.09, 1.44, 0.58, 1.21, 1.07, 0.91, 1.37, 1.44, 0.38, 2.24, 0.38, 0.71, 0.77, 1.07, 0.19, 1.68, 1.06, 0.89, 0.13, 0.9, 1.0, 1.13, 1.01, 1.32, 0.94, 0.78, 0.0, 0.79, 0.49, 1.21, -0.05, 0.92, 0.1, 0.85, 0.81, 0.79, 1.03, 0.92, -0.2, 1.1, 0.34, 0.73, 0.05, 1.05, 0.27, 1.6, 0.18, 1.09, 0.11, 0.6, 0.4, 1.35, 0.13, 1.46, 1.0, 1.39, 0.0, 1.73, 0.72, 1.01, 0.29, 0.48, 0.73, 1.21, 1.32, 1.11, 0.79, 1.57, 0.77, 0.74, 0.21, 1.36, 0.61, 1.54, 0.34, 0.9, 0.81, 1.35, 0.25, 0.84, 0.79, 1.33, 1.07, 1.77, 0.0, 1.29, 0.05, 1.4, 0.47, 1.53, 0.76, 0.99, 0.05, 1.55, -0.07, 0.86, 0.75, 0.7, -0.01, 1.4, -0.04, 1.38, 0.57, 1.25, 0.55, 1.5, 0.51, 1.17, 1.25, 1.28, 0.0, 0.55, 0.79, 0.81, 1.27, 1.48, 0.2, 1.2, 0.96, 0.47, 0.65, 1.45, 0.23, 0.9, 0.62, 1.11, 0.89, 1.2, 1.0, 1.35, 1.17, 0.64, 0.9, 0.67, 0.0, 1.06, 0.87, 0.45, 0.51, 1.03, 0.15, 0.35, 0.14, 0.89, 0.4, 1.06, -0.1, 0.47, -0.18, 0.85, 0.35, 0.91, 0.6, 1.35, 0.33, 1.65, 0.0, 0.61, -0.27, 1.49, -0.13, 0.84, 0.57, 0.52, -0.39, 1.18, 0.04, 1.08, -0.01, 0.75, 0.35, 1.28, 0.19, 1.33, 0.99, 1.08, 0.0, 1.3, 1.26, 1.07, 0.25, 0.65, 0.03, 1.4, 0.42, 1.21, 0.29, 1.4, 0.6, 0.55, 0.87, 1.14, 1.3, 1.92, 0.0, 0.55, 0.11, 1.61, -0.25, 2.34, 0.2, 1.43, 0.23, 1.3, 0.8, 1.39, 0.55, 1.5, 1.12, 0.23, 0.0, 0.95, 0.22, 1.2, 0.38, 0.29, 0.56, 1.05, 0.85, 0.55, 0.28, 0.31, 0.75, 0.63, 0.0, 1.22, 0.6, 0.99, 0.94, 0.55, 0.75, 1.27, 0.8, 0.45, 1.31, 1.68, 0.0, 1.06, 0.56, 1.5, 0.3, 1.58, 1.2, 1.2, 1.14, 1.09, 0.0, 0.65, 0.25, 0.71, 0.94, 0.33, 1.33, 0.9, 0.0, 1.25, 0.35, 0.7, 0.8, 1.03, 0.0, 1.05, 1.09, 0.92, 0.0, 
+
+L2_cHER2_A_nn
+0.699999988079, 0.0, 0.300000011921, 0.40000000596, 0.40000000596, 0.40000000596, 0.40000000596, 0.20000000298, 0.600000023842, 0.899999976158, 0.300000011921, 0.10000000149, 0.899999976158, 0.699999988079, 0.600000023842, 0.5, 0.800000011921, 0.40000000596, 0.699999988079, 0.899999976158, 0.800000011921, 0.600000023842, 0.699999988079, 0.600000023842, 0.600000023842, 0.40000000596, 0.699999988079, 0.300000011921, 0.899999976158, 0.10000000149, 0.40000000596, 0.10000000149, 0.40000000596, 0.300000011921, 0.300000011921, -0.40000000596, 0.5, 0.0, 0.20000000298, 0.600000023842, 0.600000023842, 0.800000011921, 0.300000011921, 0.899999976158, 0.699999988079, 0.699999988079, 0.20000000298, 0.10000000149, 0.5, 0.800000011921, 0.800000011921, 0.800000011921, 0.20000000298, 0.20000000298, 0.10000000149, 0.899999976158, 0.600000023842, 0.300000011921, 0.600000023842, 0.800000011921, 0.10000000149, 0.20000000298, 0.800000011921, 0.10000000149, 0.10000000149, 0.899999976158, 0.40000000596, 0.40000000596, 0.40000000596, -0.40000000596, 0.20000000298, -0.600000023842, 0.5, 0.0, 0.10000000149, 0.899999976158, 0.40000000596, 0.10000000149, 0.600000023842, 0.20000000298, 0.40000000596, 0.40000000596, 0.899999976158, 0.699999988079, 0.800000011921, 0.300000011921, 0.300000011921, 0.5, 0.600000023842, 0.10000000149, 0.600000023842, 0.800000011921, 0.40000000596, 0.20000000298, 0.600000023842, 0.300000011921, 0.5, 0.20000000298, 0.10000000149, 0.800000011921, 0.699999988079, 0.300000011921, 0.40000000596, -0.20000000298, 0.600000023842, -0.800000011921, 0.10000000149, -0.899999976158, 0.800000011921, 0.0, 0.300000011921, 0.20000000298, 0.800000011921, 0.899999976158, 0.5, 0.10000000149, 0.800000011921, 0.699999988079, 0.699999988079, 0.899999976158, 0.10000000149, 0.899999976158, 0.40000000596, 0.800000011921, 0.40000000596, 0.20000000298, 0.40000000596, 0.10000000149, 0.699999988079, 0.800000011921, 0.40000000596, 0.10000000149, 0.20000000298, 0.699999988079, 0.10000000149, 0.300000011921, 0.600000023842, -0.899999976158, 0.300000011921, -0.899999976158, 0.40000000596, -0.10000000149, 0.300000011921, -0.20000000298, 0.10000000149, 0.0, 0.899999976158, 0.20000000298, 0.10000000149, 0.600000023842, 0.5, 0.20000000298, 0.600000023842, 0.800000011921, 0.600000023842, 0.20000000298, 0.5, 0.5, 0.20000000298, 0.800000011921, 0.10000000149, 0.5, 0.20000000298, 0.800000011921, 0.10000000149, 0.20000000298, 0.800000011921, 0.20000000298, 0.800000011921, 0.40000000596, 0.300000011921, -0.10000000149, 0.699999988079, -0.699999988079, 0.600000023842, -0.20000000298, 0.800000011921, -0.899999976158, 0.899999976158, -0.20000000298, 0.800000011921, 0.0, 0.600000023842, 0.600000023842, 0.899999976158, 0.20000000298, 0.800000011921, 0.5, 0.899999976158, 0.699999988079, 0.40000000596, 0.899999976158, 0.300000011921, 0.699999988079, 0.10000000149, 0.40000000596, 0.10000000149, 0.40000000596, 0.5, 0.699999988079, 0.5, 0.600000023842, 0.40000000596, 0.10000000149, 0.899999976158, -0.699999988079, 0.20000000298, -0.10000000149, 0.40000000596, -0.40000000596, 0.5, -0.10000000149, 0.10000000149, -0.600000023842, 0.600000023842, -0.600000023842, 0.899999976158, 0.0, 0.899999976158, 0.20000000298, 0.800000011921, 0.699999988079, 0.300000011921, 0.10000000149, 0.5, 0.699999988079, 0.5, 0.40000000596, 0.5, 0.20000000298, 0.40000000596, 0.10000000149, 0.800000011921, 0.699999988079, 0.5, 0.699999988079, 0.10000000149, 0.800000011921, 0.600000023842, -0.5, 0.5, -0.800000011921, 0.899999976158, -0.699999988079, 0.800000011921, -0.699999988079, 0.5, -0.20000000298, 0.899999976158, -0.20000000298, 0.899999976158, -0.20000000298, 0.10000000149, 0.0, 0.40000000596, 0.699999988079, 0.699999988079, 0.5, 0.300000011921, 0.899999976158, 0.40000000596, 0.800000011921, 0.899999976158, 0.899999976158, 0.800000011921, 0.800000011921, 0.10000000149, 0.800000011921, 0.5, 0.600000023842, 0.699999988079, 0.40000000596, 0.800000011921, -0.40000000596, 0.800000011921, -0.800000011921, 0.800000011921, -0.300000011921, 0.699999988079, -0.899999976158, 0.600000023842, -0.800000011921, 0.800000011921, -0.5, 0.800000011921, -0.699999988079, 0.40000000596, -0.699999988079, 0.5, 0.0, 0.10000000149, 0.300000011921, 0.5, 0.699999988079, 0.20000000298, 0.10000000149, 0.10000000149, 0.300000011921, 0.10000000149, 0.40000000596, 0.899999976158, 0.600000023842, 0.20000000298, 0.899999976158, 0.40000000596, 0.300000011921, 0.699999988079, -0.899999976158, 0.20000000298, -0.20000000298, 0.300000011921, -0.5, 0.10000000149, -0.899999976158, 0.600000023842, -0.20000000298, 0.899999976158, -0.699999988079, 0.300000011921, -0.10000000149, 0.699999988079, -0.5, 0.10000000149, -0.300000011921, 0.899999976158, 0.0, 0.899999976158, 0.899999976158, 0.800000011921, 0.899999976158, 0.699999988079, 0.800000011921, 0.300000011921, 0.40000000596, 0.600000023842, 0.5, 0.899999976158, 0.300000011921, 0.699999988079, 0.5, 0.800000011921, -0.600000023842, 0.10000000149, -0.899999976158, 0.600000023842, -0.10000000149, 0.40000000596, -0.800000011921, 0.5, -0.5, 0.40000000596, -0.899999976158, 0.5, -0.699999988079, 0.300000011921, -0.899999976158, 0.5, -0.699999988079, 0.899999976158, -0.899999976158, 0.300000011921, 0.0, 0.5, 0.20000000298, 0.20000000298, 0.899999976158, 0.300000011921, 0.10000000149, 0.10000000149, 0.20000000298, 0.5, 0.10000000149, 0.899999976158, 0.300000011921, 0.699999988079, -0.600000023842, 0.600000023842, -0.300000011921, 0.600000023842, -0.800000011921, 0.40000000596, -0.20000000298, 0.20000000298, -0.800000011921, 0.300000011921, -0.699999988079, 0.5, -0.40000000596, 0.40000000596, -0.800000011921, 0.20000000298, -0.10000000149, 0.800000011921, -0.899999976158, 0.5, -0.20000000298, 0.699999988079, 0.0, 0.40000000596, 0.899999976158, 0.699999988079, 0.300000011921, 0.800000011921, 0.699999988079, 0.800000011921, 0.10000000149, 0.600000023842, 0.5, 0.600000023842, -0.40000000596, 0.600000023842, -0.800000011921, 0.40000000596, -0.20000000298, 0.40000000596, -0.10000000149, 0.10000000149, -0.5, 0.10000000149, -0.40000000596, 0.5, -0.20000000298, 0.899999976158, -0.899999976158, 0.10000000149, -0.300000011921, 0.699999988079, -0.800000011921, 0.20000000298, -0.899999976158, 0.40000000596, -0.899999976158, 0.10000000149, 0.0, 0.300000011921, 0.800000011921, 0.600000023842, 0.20000000298, 0.800000011921, 0.800000011921, 0.20000000298, 0.300000011921, 0.699999988079, -0.300000011921, 0.10000000149, -0.20000000298, 0.600000023842, -0.300000011921, 0.699999988079, -0.800000011921, 0.20000000298, -0.800000011921, 0.10000000149, -0.40000000596, 0.40000000596, -0.10000000149, 0.800000011921, -0.800000011921, 0.10000000149, -0.40000000596, 0.300000011921, -0.40000000596, 0.300000011921, -0.10000000149, 0.699999988079, -0.300000011921, 0.300000011921, -0.800000011921, 0.5, 0.0, 0.20000000298, 0.300000011921, 0.20000000298, 0.899999976158, 0.40000000596, 0.10000000149, 0.899999976158, -0.10000000149, 0.800000011921, -0.10000000149, 0.5, -0.20000000298, 0.40000000596, -0.10000000149, 0.10000000149, -0.20000000298, 0.5, -0.699999988079, 0.800000011921, -0.699999988079, 0.10000000149, -0.800000011921, 0.899999976158, -0.600000023842, 0.600000023842, -0.5, 0.10000000149, -0.20000000298, 0.800000011921, -0.699999988079, 0.600000023842, -0.20000000298, 0.20000000298, -0.300000011921, 0.5, 0.0, 0.5, 0.300000011921, 0.40000000596, 0.899999976158, 0.40000000596, -0.10000000149, 0.10000000149, -0.899999976158, 0.10000000149, -0.800000011921, 0.20000000298, -0.699999988079, 0.800000011921, -0.20000000298, 0.5, -0.600000023842, 0.5, -0.699999988079, 0.5, -0.600000023842, 0.20000000298, -0.899999976158, 0.899999976158, -0.300000011921, 0.5, -0.10000000149, 0.800000011921, -0.10000000149, 0.800000011921, -0.800000011921, 0.20000000298, -0.899999976158, 0.5, -0.300000011921, 0.300000011921, 0.0, 0.5, 0.5, 0.40000000596, -0.300000011921, 0.40000000596, -0.40000000596, 0.699999988079, -0.300000011921, 0.10000000149, -0.300000011921, 0.800000011921, -0.40000000596, 0.40000000596, -0.10000000149, 0.10000000149, -0.800000011921, 0.699999988079, -0.40000000596, 0.40000000596, -0.300000011921, 0.699999988079, -0.5, 0.899999976158, -0.300000011921, 0.600000023842, -0.5, 0.20000000298, -0.300000011921, 0.40000000596, -0.10000000149, 0.40000000596, -0.899999976158, 0.5, -0.5, 0.10000000149, 0.0, 
+
+L2_cHER2_A_nn_pu
+0.699999988079, 0.0, 0.300000011921, 0.40000000596, 0.40000000596, 0.40000000596, 0.40000000596, 0.20000000298, 0.600000023842, 0.899999976158, 0.300000011921, 0.10000000149, 0.899999976158, 0.699999988079, 0.600000023842, 0.5, 0.800000011921, 0.40000000596, 0.699999988079, 0.899999976158, 0.800000011921, 0.600000023842, 0.699999988079, 0.600000023842, 0.600000023842, 0.40000000596, 0.699999988079, 0.300000011921, 0.899999976158, 0.10000000149, 0.40000000596, 0.10000000149, 0.40000000596, 0.300000011921, 0.5, 0.0, 0.20000000298, 0.600000023842, 0.600000023842, 0.800000011921, 0.300000011921, 0.899999976158, 0.699999988079, 0.699999988079, 0.20000000298, 0.10000000149, 0.5, 0.800000011921, 0.800000011921, 0.800000011921, 0.20000000298, 0.20000000298, 0.10000000149, 0.899999976158, 0.600000023842, 0.300000011921, 0.600000023842, 0.800000011921, 0.10000000149, 0.20000000298, 0.800000011921, 0.10000000149, 0.10000000149, 0.899999976158, 0.40000000596, 0.40000000596, 0.5, 0.0, 0.10000000149, 0.899999976158, 0.40000000596, 0.10000000149, 0.600000023842, 0.20000000298, 0.40000000596, 0.40000000596, 0.899999976158, 0.699999988079, 0.800000011921, 0.300000011921, 0.300000011921, 0.5, 0.600000023842, 0.10000000149, 0.600000023842, 0.800000011921, 0.40000000596, 0.20000000298, 0.600000023842, 0.300000011921, 0.5, 0.20000000298, 0.10000000149, 0.800000011921, 0.699999988079, 0.300000011921, 0.800000011921, 0.0, 0.300000011921, 0.20000000298, 0.800000011921, 0.899999976158, 0.5, 0.10000000149, 0.800000011921, 0.699999988079, 0.699999988079, 0.899999976158, 0.10000000149, 0.899999976158, 0.40000000596, 0.800000011921, 0.40000000596, 0.20000000298, 0.40000000596, 0.10000000149, 0.699999988079, 0.800000011921, 0.40000000596, 0.10000000149, 0.20000000298, 0.699999988079, 0.10000000149, 0.300000011921, 0.10000000149, 0.0, 0.899999976158, 0.20000000298, 0.10000000149, 0.600000023842, 0.5, 0.20000000298, 0.600000023842, 0.800000011921, 0.600000023842, 0.20000000298, 0.5, 0.5, 0.20000000298, 0.800000011921, 0.10000000149, 0.5, 0.20000000298, 0.800000011921, 0.10000000149, 0.20000000298, 0.800000011921, 0.20000000298, 0.800000011921, 0.40000000596, 0.800000011921, 0.0, 0.600000023842, 0.600000023842, 0.899999976158, 0.20000000298, 0.800000011921, 0.5, 0.899999976158, 0.699999988079, 0.40000000596, 0.899999976158, 0.300000011921, 0.699999988079, 0.10000000149, 0.40000000596, 0.10000000149, 0.40000000596, 0.5, 0.699999988079, 0.5, 0.600000023842, 0.40000000596, 0.10000000149, 0.899999976158, 0.0, 0.899999976158, 0.20000000298, 0.800000011921, 0.699999988079, 0.300000011921, 0.10000000149, 0.5, 0.699999988079, 0.5, 0.40000000596, 0.5, 0.20000000298, 0.40000000596, 0.10000000149, 0.800000011921, 0.699999988079, 0.5, 0.699999988079, 0.10000000149, 0.800000011921, 0.10000000149, 0.0, 0.40000000596, 0.699999988079, 0.699999988079, 0.5, 0.300000011921, 0.899999976158, 0.40000000596, 0.800000011921, 0.899999976158, 0.899999976158, 0.800000011921, 0.800000011921, 0.10000000149, 0.800000011921, 0.5, 0.600000023842, 0.699999988079, 0.40000000596, 0.5, 0.0, 0.10000000149, 0.300000011921, 0.5, 0.699999988079, 0.20000000298, 0.10000000149, 0.10000000149, 0.300000011921, 0.10000000149, 0.40000000596, 0.899999976158, 0.600000023842, 0.20000000298, 0.899999976158, 0.40000000596, 0.300000011921, 0.899999976158, 0.0, 0.899999976158, 0.899999976158, 0.800000011921, 0.899999976158, 0.699999988079, 0.800000011921, 0.300000011921, 0.40000000596, 0.600000023842, 0.5, 0.899999976158, 0.300000011921, 0.699999988079, 0.5, 0.300000011921, 0.0, 0.5, 0.20000000298, 0.20000000298, 0.899999976158, 0.300000011921, 0.10000000149, 0.10000000149, 0.20000000298, 0.5, 0.10000000149, 0.899999976158, 0.300000011921, 0.699999988079, 0.0, 0.40000000596, 0.899999976158, 0.699999988079, 0.300000011921, 0.800000011921, 0.699999988079, 0.800000011921, 0.10000000149, 0.600000023842, 0.5, 0.10000000149, 0.0, 0.300000011921, 0.800000011921, 0.600000023842, 0.20000000298, 0.800000011921, 0.800000011921, 0.20000000298, 0.300000011921, 0.5, 0.0, 0.20000000298, 0.300000011921, 0.20000000298, 0.899999976158, 0.40000000596, 0.10000000149, 0.5, 0.0, 0.5, 0.300000011921, 0.40000000596, 0.899999976158, 0.300000011921, 0.0, 0.5, 0.5, 0.10000000149, 0.0, 
+
+L2_cHER2_x_n1
+0.899999976158, 0.300000011921, 0.5, 0.5, 0.300000011921, 0.899999976158, 0.899999976158, 0.10000000149, 0.300000011921, 0.5, 0.40000000596, 0.699999988079, 0.300000011921, 0.40000000596, 0.300000011921, 0.5, 0.600000023842, 0.20000000298, 0.600000023842, 0.20000000298, 0.600000023842, 0.699999988079, 0.20000000298, 0.699999988079, 0.40000000596, 0.300000011921, 0.20000000298, 0.699999988079, 0.800000011921, 0.20000000298, 0.699999988079, 0.600000023842, 0.800000011921, 0.5, 
+
+L2_cHER2_x_n2
+0.899999976158, 0.300000011921, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.300000011921, 0.899999976158, 0.0, 0.0, 0.899999976158, 0.10000000149, 0.0, 0.0, 0.300000011921, 0.5, 0.0, 0.0, 0.40000000596, 0.699999988079, 0.0, 0.0, 0.300000011921, 0.40000000596, 0.0, 0.0, 0.300000011921, 0.5, 0.0, 0.0, 0.600000023842, 0.20000000298, 0.0, 0.0, 0.600000023842, 0.20000000298, 0.0, 0.0, 0.600000023842, 0.699999988079, 0.0, 0.0, 0.20000000298, 0.699999988079, 0.0, 0.0, 0.40000000596, 0.300000011921, 0.0, 0.0, 0.20000000298, 0.699999988079, 0.0, 0.0, 0.800000011921, 0.20000000298, 0.0, 0.0, 0.699999988079, 0.600000023842, 0.0, 0.0, 0.800000011921, 0.5, 0.0, 0.0, 
+
+L2_cHER2_y_n1
+0.899999976158, 0.300000011921, 0.699999988079, 0.600000023842, 0.40000000596, 0.20000000298, 0.600000023842, 0.40000000596, 0.600000023842, 0.600000023842, 0.300000011921, 0.5, 0.899999976158, 0.10000000149, 0.5, 0.899999976158, 0.20000000298, 0.899999976158, 0.899999976158, 0.899999976158, 0.5, 0.899999976158, 0.20000000298, 0.5, 0.600000023842, 0.40000000596, 0.600000023842, 0.899999976158, 0.300000011921, 0.300000011921, 0.20000000298, 0.800000011921, 0.40000000596, 0.600000023842, 
+
+L2_cHER2_y_n2
+0.899999976158, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 0.699999988079, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 0.40000000596, 0.20000000298, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.40000000596, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 0.300000011921, 0.5, 0.0, 0.0, 0.0, 0.0, 0.899999976158, 0.10000000149, 0.0, 0.0, 0.0, 0.0, 0.5, 0.899999976158, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.899999976158, 0.0, 0.0, 0.0, 0.0, 0.899999976158, 0.899999976158, 0.0, 0.0, 0.0, 0.0, 0.5, 0.899999976158, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.5, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.40000000596, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.899999976158, 0.0, 0.0, 0.0, 0.0, 0.300000011921, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.800000011921, 0.0, 0.0, 0.0, 0.0, 0.40000000596, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 
+
+L2_cHER2_o_N
+2.49999991655, 0.0, 1.70999999285, -0.229999978542, 1.36000001222, -0.379999935329, 1.89999997839, 0.200000026077, 1.74000005484, 0.180000002384, 1.29000002205, -0.769999945462, 2.12999994501, 0.610000004023, 1.74000002503, -0.519999932051, 1.85000002384, -0.349999931455, 2.37999995917, 0.360000039041, 2.2700000155, -0.509999885559, 1.41999999464, -0.359999930263, 1.71000004053, 0.0700000274181, 1.90000000149, -0.899999900162, 2.03999998182, -0.0199999797344, 1.63000000387, -0.889999989271, 1.81000001371, -0.329999963641, 1.70999999285, 0.229999978542, 1.80000001192, 0.0, 1.25000001937, 0.250000067055, 1.7900000146, 1.37000002816, 1.41000005245, 0.729999996424, 1.80000000298, 0.350000023842, 1.15000000969, 0.400000003725, 1.71000000477, 0.430000044107, 1.89000001758, 0.67000005424, 1.63999999523, 0.420000031888, 1.64000000864, 0.570000033379, 1.51000003457, -0.219999963343, 1.56000005245, 0.930000029206, 1.41000001073, -0.319999949932, 1.78000002921, 0.440000028014, 1.45000002086, 0.599999971688, 1.76000003159, 0.430000029206, 1.36000001222, 0.379999935329, 1.25000001937, -0.250000067055, 1.10000000894, 0.0, 1.02000000805, 1.45999997348, 1.34000003546, 0.319999994636, 1.44000002354, 0.120000003576, 0.960000017434, 1.07999995992, 2.07999994725, 0.73999997288, 1.94999998659, 0.250000010431, 1.65999998689, 1.07999995768, 1.9399999997, 0.119999993145, 1.33000001729, 0.590000005662, 1.16000002414, 0.579999999404, 1.80999999732, 0.330000017285, 1.22000002146, 0.460000001788, 1.28000000238, 0.639999983311, 1.78000001281, 0.439999995232, 1.89999997839, -0.200000026077, 1.7900000146, -1.37000002816, 1.02000000805, -1.45999997348, 1.96000002861, 0.0, 1.28000003964, -0.460000006258, 1.64000002876, 0.21999998495, 1.65999997646, -0.0200000050664, 1.72000001624, -0.239999973625, 1.41000001594, 0.230000026226, 1.43999998853, 0.300000024587, 1.58000002101, -0.139999940842, 1.03000001058, -0.569999991655, 1.34000003397, -0.220000000596, 1.73000000015, -0.289999949038, 1.26000003979, 0.0600000025332, 1.12000002593, -0.0800000321865, 1.2000000298, -0.179999996424, 1.74000005484, -0.180000002384, 1.41000005245, -0.729999996424, 1.34000003546, -0.319999994636, 1.28000003964, 0.460000006258, 1.06000005394, 0.0, 1.90000000596, 0.0200000065565, 0.84000003323, 0.960000011474, 1.58000002027, 0.0600000017881, 1.59000005037, 0.870000031888, 1.80000005066, 0.620000009537, 1.88000003219, 0.420000015497, 1.05000002235, 0.45000000447, 0.900000046194, 0.740000004172, 1.37000002146, 0.530000017285, 0.940000047386, 0.620000021458, 2.04000005931, 0.119999972284, 2.00000006855, 0.600000008941, 1.29000002205, 0.769999945462, 1.80000000298, -0.350000023842, 1.44000002354, -0.120000003576, 1.64000002876, -0.21999998495, 1.90000000596, -0.0200000065565, 1.74000001311, 0.0, 1.32000002965, 1.21999999464, 2.06999995887, 0.190000001192, 1.79000000268, 0.520000012517, 2.16999996036, 1.20999997348, 1.75999998987, 0.979999981523, 1.14000000566, 0.529999981523, 0.890000026524, 0.770000006557, 1.3799999845, 0.350000016391, 1.17000002593, 1.12999998897, 1.65000001788, 0.589999993742, 1.47000003338, 0.389999987781, 2.12999994501, -0.610000004023, 1.15000000969, -0.400000003725, 0.960000017434, -1.07999995992, 1.65999997646, 0.0200000050664, 0.84000003323, -0.960000011474, 1.32000002965, -1.21999999464, 1.51999998569, 0.0, 1.72999998227, -0.289999984056, 1.78000001878, 0.389999992251, 1.49000001907, 0.0699999991059, 1.62000000879, 0.0600000181794, 1.01000000402, -0.279999969602, 1.23000001654, 0.0900000071526, 1.19000001386, -0.539999960959, 1.75000001788, 0.629999991953, 1.56999998868, 0.0699999700487, 1.23000001356, 0.410000016689, 1.74000002503, 0.519999932051, 1.71000000477, -0.430000044107, 2.07999994725, -0.73999997288, 1.72000001624, 0.239999973625, 1.58000002027, -0.0600000017881, 2.06999995887, -0.190000001192, 1.72999998227, 0.289999984056, 1.29999998957, 0.0, 1.39000000715, 0.969999991655, 1.89999998957, 1.11999999017, 1.82999999046, 1.06999998569, 1.43999998331, 0.580000011325, 1.75, 1.28999997139, 2.15999998838, 0.66000002414, 0.920000018477, 1.48000000089, 1.85000001043, 0.78999997288, 1.9700000006, 0.889999986291, 1.85000002384, 0.349999931455, 1.89000001758, -0.67000005424, 1.94999998659, -0.250000010431, 1.41000001594, -0.230000026226, 1.59000005037, -0.870000031888, 1.79000000268, -0.520000012517, 1.78000001878, -0.389999992251, 1.39000000715, -0.969999991655, 1.10000000894, 0.0, 1.12000001103, 0.440000008643, 1.72999998897, 0.659999989867, 1.0899999848, -0.120000011027, 0.890000038445, 0.479999997914, 1.31000000179, 0.0200000035763, 1.47999999642, 1.16000000328, 1.16000002116, 0.96999991715, 1.37000001848, 0.63999997586, 2.37999995917, -0.360000039041, 1.63999999523, -0.420000031888, 1.65999998689, -1.07999995768, 1.43999998853, -0.300000024587, 1.80000005066, -0.620000009537, 2.16999996036, -1.20999997348, 1.49000001907, -0.0699999991059, 1.89999998957, -1.11999999017, 1.12000001103, -0.440000008643, 2.33999998629, 0.0, 2.54999996573, 0.370000005066, 1.82999999046, 0.189999990761, 1.77000001848, 0.769999997616, 1.65000000894, -0.469999969304, 1.74000003099, 0.919999982715, 2.34999996722, -0.0500000476837, 2.22999998748, 0.48999997735, 2.2700000155, 0.509999885559, 1.64000000864, -0.570000033379, 1.9399999997, -0.119999993145, 1.58000002101, 0.139999940842, 1.88000003219, -0.420000015497, 1.75999998987, -0.979999981523, 1.62000000879, -0.0600000181794, 1.82999999046, -1.06999998569, 1.72999998897, -0.659999989867, 2.54999996573, -0.370000005066, 2.15999998093, 0.0, 1.69999997467, -0.130000005364, 1.31000003755, 1.28999996245, 2.01999998719, -0.189999992251, 1.07000002444, 0.849999983609, 2.07000000656, 0.089999935627, 2.40999999285, 0.68999997437, 1.41999999464, 0.359999930263, 1.51000003457, 0.219999963343, 1.33000001729, -0.590000005662, 1.03000001058, 0.569999991655, 1.05000002235, -0.45000000447, 1.14000000566, -0.529999981523, 1.01000000402, 0.279999969602, 1.43999998331, -0.580000011325, 1.0899999848, 0.120000011027, 1.82999999046, -0.189999990761, 1.69999997467, 0.130000005364, 1.47999997854, 0.0, 1.03000002027, 1.37999998301, 1.83999996245, 0.500000025332, 1.33000002623, 1.20999999434, 1.84000002354, 0.309999983907, 1.51000004053, 0.959999997318, 1.71000004053, -0.0700000274181, 1.56000005245, -0.930000029206, 1.16000002414, -0.579999999404, 1.34000003397, 0.220000000596, 0.900000046194, -0.740000004172, 0.890000026524, -0.770000006557, 1.23000001654, -0.0900000071526, 1.75, -1.28999997139, 0.890000038445, -0.479999997914, 1.77000001848, -0.769999997616, 1.31000003755, -1.28999996245, 1.03000002027, -1.37999998301, 0.820000040829, 0.0, 1.21000003457, 0.280000023246, 1.37000006616, 0.370000006557, 1.78000005007, 0.459999976456, 1.22000005126, 0.20000000298, 1.90000000149, 0.899999900162, 1.41000001073, 0.319999949932, 1.80999999732, -0.330000017285, 1.73000000015, 0.289999949038, 1.37000002146, -0.530000017285, 1.3799999845, -0.350000016391, 1.19000001386, 0.539999960959, 2.15999998838, -0.66000002414, 1.31000000179, -0.0200000035763, 1.65000000894, 0.469999969304, 2.01999998719, 0.189999992251, 1.83999996245, -0.500000025332, 1.21000003457, -0.280000023246, 1.99999995828, 0.0, 1.13000003517, 1.04999999851, 1.76000001967, 1.14999991506, 1.83000003219, 0.679999974072, 2.03999998182, 0.0199999797344, 1.78000002921, -0.440000028014, 1.22000002146, -0.460000001788, 1.26000003979, -0.0600000025332, 0.940000047386, -0.620000021458, 1.17000002593, -1.12999998897, 1.75000001788, -0.629999991953, 0.920000018477, -1.48000000089, 1.47999999642, -1.16000000328, 1.74000003099, -0.919999982715, 1.07000002444, -0.849999983609, 1.33000002623, -1.20999999434, 1.37000006616, -0.370000006557, 1.13000003517, -1.04999999851, 1.10000003278, 0.0, 1.21000002861, -0.270000015497, 1.23000004113, 0.589999959469, 1.63000000387, 0.889999989271, 1.45000002086, -0.599999971688, 1.28000000238, -0.639999983311, 1.12000002593, 0.0800000321865, 2.04000005931, -0.119999972284, 1.65000001788, -0.589999993742, 1.56999998868, -0.0699999700487, 1.85000001043, -0.78999997288, 1.16000002116, -0.96999991715, 2.34999996722, 0.0500000476837, 2.07000000656, -0.089999935627, 1.84000002354, -0.309999983907, 1.78000005007, -0.459999976456, 1.76000001967, -1.14999991506, 1.21000002861, 0.270000015497, 1.54000006378, 0.0, 1.70000003874, 0.86000002116, 1.81000001371, 0.329999963641, 1.76000003159, -0.430000029206, 1.78000001281, -0.439999995232, 1.2000000298, 0.179999996424, 2.00000006855, -0.600000008941, 1.47000003338, -0.389999987781, 1.23000001356, -0.410000016689, 1.9700000006, -0.889999986291, 1.37000001848, -0.63999997586, 2.22999998748, -0.48999997735, 2.40999999285, -0.68999997437, 1.51000004053, -0.959999997318, 1.22000005126, -0.20000000298, 1.83000003219, -0.679999974072, 1.23000004113, -0.589999959469, 1.70000003874, -0.86000002116, 1.34000004441, 0.0, 
+
+L2_cHER2_o_N_pu
+2.49999991655, 0.0, 1.70999999285, -0.229999978542, 1.36000001222, -0.379999935329, 1.89999997839, 0.200000026077, 1.74000005484, 0.180000002384, 1.29000002205, -0.769999945462, 2.12999994501, 0.610000004023, 1.74000002503, -0.519999932051, 1.85000002384, -0.349999931455, 2.37999995917, 0.360000039041, 2.2700000155, -0.509999885559, 1.41999999464, -0.359999930263, 1.71000004053, 0.0700000274181, 1.90000000149, -0.899999900162, 2.03999998182, -0.0199999797344, 1.63000000387, -0.889999989271, 1.81000001371, -0.329999963641, 1.80000001192, 0.0, 1.25000001937, 0.250000067055, 1.7900000146, 1.37000002816, 1.41000005245, 0.729999996424, 1.80000000298, 0.350000023842, 1.15000000969, 0.400000003725, 1.71000000477, 0.430000044107, 1.89000001758, 0.67000005424, 1.63999999523, 0.420000031888, 1.64000000864, 0.570000033379, 1.51000003457, -0.219999963343, 1.56000005245, 0.930000029206, 1.41000001073, -0.319999949932, 1.78000002921, 0.440000028014, 1.45000002086, 0.599999971688, 1.76000003159, 0.430000029206, 1.10000000894, 0.0, 1.02000000805, 1.45999997348, 1.34000003546, 0.319999994636, 1.44000002354, 0.120000003576, 0.960000017434, 1.07999995992, 2.07999994725, 0.73999997288, 1.94999998659, 0.250000010431, 1.65999998689, 1.07999995768, 1.9399999997, 0.119999993145, 1.33000001729, 0.590000005662, 1.16000002414, 0.579999999404, 1.80999999732, 0.330000017285, 1.22000002146, 0.460000001788, 1.28000000238, 0.639999983311, 1.78000001281, 0.439999995232, 1.96000002861, 0.0, 1.28000003964, -0.460000006258, 1.64000002876, 0.21999998495, 1.65999997646, -0.0200000050664, 1.72000001624, -0.239999973625, 1.41000001594, 0.230000026226, 1.43999998853, 0.300000024587, 1.58000002101, -0.139999940842, 1.03000001058, -0.569999991655, 1.34000003397, -0.220000000596, 1.73000000015, -0.289999949038, 1.26000003979, 0.0600000025332, 1.12000002593, -0.0800000321865, 1.2000000298, -0.179999996424, 1.06000005394, 0.0, 1.90000000596, 0.0200000065565, 0.84000003323, 0.960000011474, 1.58000002027, 0.0600000017881, 1.59000005037, 0.870000031888, 1.80000005066, 0.620000009537, 1.88000003219, 0.420000015497, 1.05000002235, 0.45000000447, 0.900000046194, 0.740000004172, 1.37000002146, 0.530000017285, 0.940000047386, 0.620000021458, 2.04000005931, 0.119999972284, 2.00000006855, 0.600000008941, 1.74000001311, 0.0, 1.32000002965, 1.21999999464, 2.06999995887, 0.190000001192, 1.79000000268, 0.520000012517, 2.16999996036, 1.20999997348, 1.75999998987, 0.979999981523, 1.14000000566, 0.529999981523, 0.890000026524, 0.770000006557, 1.3799999845, 0.350000016391, 1.17000002593, 1.12999998897, 1.65000001788, 0.589999993742, 1.47000003338, 0.389999987781, 1.51999998569, 0.0, 1.72999998227, -0.289999984056, 1.78000001878, 0.389999992251, 1.49000001907, 0.0699999991059, 1.62000000879, 0.0600000181794, 1.01000000402, -0.279999969602, 1.23000001654, 0.0900000071526, 1.19000001386, -0.539999960959, 1.75000001788, 0.629999991953, 1.56999998868, 0.0699999700487, 1.23000001356, 0.410000016689, 1.29999998957, 0.0, 1.39000000715, 0.969999991655, 1.89999998957, 1.11999999017, 1.82999999046, 1.06999998569, 1.43999998331, 0.580000011325, 1.75, 1.28999997139, 2.15999998838, 0.66000002414, 0.920000018477, 1.48000000089, 1.85000001043, 0.78999997288, 1.9700000006, 0.889999986291, 1.10000000894, 0.0, 1.12000001103, 0.440000008643, 1.72999998897, 0.659999989867, 1.0899999848, -0.120000011027, 0.890000038445, 0.479999997914, 1.31000000179, 0.0200000035763, 1.47999999642, 1.16000000328, 1.16000002116, 0.96999991715, 1.37000001848, 0.63999997586, 2.33999998629, 0.0, 2.54999996573, 0.370000005066, 1.82999999046, 0.189999990761, 1.77000001848, 0.769999997616, 1.65000000894, -0.469999969304, 1.74000003099, 0.919999982715, 2.34999996722, -0.0500000476837, 2.22999998748, 0.48999997735, 2.15999998093, 0.0, 1.69999997467, -0.130000005364, 1.31000003755, 1.28999996245, 2.01999998719, -0.189999992251, 1.07000002444, 0.849999983609, 2.07000000656, 0.089999935627, 2.40999999285, 0.68999997437, 1.47999997854, 0.0, 1.03000002027, 1.37999998301, 1.83999996245, 0.500000025332, 1.33000002623, 1.20999999434, 1.84000002354, 0.309999983907, 1.51000004053, 0.959999997318, 0.820000040829, 0.0, 1.21000003457, 0.280000023246, 1.37000006616, 0.370000006557, 1.78000005007, 0.459999976456, 1.22000005126, 0.20000000298, 1.99999995828, 0.0, 1.13000003517, 1.04999999851, 1.76000001967, 1.14999991506, 1.83000003219, 0.679999974072, 1.10000003278, 0.0, 1.21000002861, -0.270000015497, 1.23000004113, 0.589999959469, 1.54000006378, 0.0, 1.70000003874, 0.86000002116, 1.34000004441, 0.0, 
+
+L2_zHER2_A_nn
+0.4, 0.0, 0.3, 0.1, 0.4, 0.7, 0.1, 0.2, 0.4, 0.6, 0.2, 0.7, 0.1, 0.1, 0.1, 0.3, 0.8, 0.1, 0.9, 0.5, 0.2, 0.5, 0.9, 0.8, 0.8, 0.4, 0.6, 0.3, 0.1, 0.3, 0.8, 0.7, 0.6, 0.4, 0.3, -0.1, 0.4, 0.0, 0.9, 0.1, 0.4, 0.5, 0.9, 0.3, 0.8, 0.6, 0.2, 0.1, 0.2, 0.7, 0.9, 0.6, 0.8, 0.5, 0.2, 0.2, 0.3, 0.4, 0.8, 0.9, 0.1, 0.5, 0.1, 0.8, 0.7, 0.2, 0.1, 0.1, 0.4, -0.7, 0.9, -0.1, 0.8, 0.0, 0.1, 0.6, 0.2, 0.8, 0.1, 0.5, 0.8, 0.4, 0.1, 0.3, 0.9, 0.3, 0.7, 0.4, 0.4, 0.6, 0.4, 0.5, 0.8, 0.4, 0.4, 0.4, 0.5, 0.4, 0.8, 0.5, 0.1, 0.4, 0.1, -0.2, 0.4, -0.5, 0.1, -0.6, 0.1, 0.0, 0.1, 0.8, 0.7, 0.4, 0.3, 0.8, 0.7, 0.2, 0.9, 0.1, 0.2, 0.3, 0.8, 0.1, 0.4, 0.7, 0.4, 0.8, 0.5, 0.9, 0.6, 0.4, 0.3, 0.2, 0.5, 0.6, 0.4, -0.6, 0.9, -0.3, 0.2, -0.8, 0.1, -0.8, 0.1, 0.0, 0.4, 0.3, 0.1, 0.1, 0.6, 0.9, 0.4, 0.9, 0.5, 0.1, 0.1, 0.1, 0.4, 0.4, 0.9, 0.6, 0.5, 0.4, 0.5, 0.3, 0.6, 0.8, 0.2, 0.6, 0.2, -0.7, 0.8, -0.6, 0.1, -0.5, 0.7, -0.4, 0.4, -0.3, 0.7, 0.0, 0.4, 0.6, 0.5, 0.7, 0.3, 0.9, 0.2, 0.9, 0.2, 0.5, 0.5, 0.7, 0.9, 0.1, 0.1, 0.3, 0.5, 0.2, 0.9, 0.8, 0.8, 0.5, 0.1, -0.1, 0.2, -0.1, 0.8, -0.4, 0.3, -0.8, 0.1, -0.1, 0.4, -0.6, 0.8, 0.0, 0.9, 0.7, 0.2, 0.7, 0.8, 0.2, 0.4, 0.9, 0.3, 0.9, 0.5, 0.7, 0.3, 0.7, 0.5, 0.2, 0.7, 0.6, 0.8, 0.5, 0.1, -0.3, 0.2, -0.7, 0.1, -0.3, 0.7, -0.2, 0.6, -0.9, 0.5, -0.7, 0.9, -0.7, 0.5, 0.0, 0.6, 0.2, 0.7, 0.8, 0.3, 0.7, 0.1, 0.3, 0.1, 0.6, 0.5, 0.3, 0.2, 0.5, 0.3, 0.7, 0.8, 0.8, 0.8, -0.1, 0.9, -0.6, 0.9, -0.3, 0.9, -0.1, 0.4, -0.9, 0.3, -0.9, 0.2, -0.7, 0.6, -0.2, 0.1, 0.0, 0.5, 0.3, 0.2, 0.6, 0.9, 0.9, 0.2, 0.7, 0.6, 0.2, 0.6, 0.8, 0.1, 0.9, 0.1, 0.6, 0.9, -0.5, 0.8, -0.5, 0.7, -0.4, 0.2, -0.3, 0.5, -0.1, 0.2, -0.9, 0.8, -0.2, 0.7, -0.8, 0.5, -0.3, 0.7, 0.0, 0.2, 0.2, 0.7, 0.1, 0.8, 0.9, 0.7, 0.6, 0.8, 0.1, 0.2, 0.2, 0.2, 0.1, 0.2, -0.5, 0.2, -0.2, 0.4, -0.6, 0.8, -0.1, 0.1, -0.1, 0.2, -0.5, 0.4, -0.9, 0.3, -0.7, 0.2, -0.6, 0.2, -0.2, 0.3, 0.0, 0.6, 0.8, 0.4, 0.5, 0.8, 0.4, 0.4, 0.3, 0.3, 0.9, 0.7, 0.8, 0.9, -0.8, 0.3, -0.4, 0.4, -0.5, 0.4, -0.7, 0.4, -0.4, 0.5, -0.7, 0.3, -0.9, 0.1, -0.3, 0.9, -0.9, 0.7, -0.1, 0.6, -0.8, 0.3, 0.0, 0.6, 0.4, 0.5, 0.6, 0.2, 0.6, 0.6, 0.6, 0.2, 0.1, 0.8, -0.4, 0.8, -0.9, 0.8, -0.4, 0.4, -0.8, 0.9, -0.6, 0.9, -0.1, 0.5, -0.7, 0.1, -0.6, 0.2, -0.7, 0.8, -0.9, 0.4, -0.5, 0.6, -0.4, 0.2, 0.0, 0.4, 0.4, 0.6, 0.6, 0.6, 0.1, 0.4, 0.8, 0.6, -0.3, 0.1, -0.5, 0.4, -0.4, 0.5, -0.9, 0.5, -0.4, 0.1, -0.3, 0.3, -0.7, 0.5, -0.3, 0.6, -0.2, 0.7, -0.6, 0.8, -0.4, 0.5, -0.6, 0.4, -0.4, 0.6, 0.0, 0.4, 0.7, 0.1, 0.3, 0.7, 0.8, 0.1, -0.3, 0.1, -0.8, 0.5, -0.4, 0.6, -0.4, 0.5, -0.3, 0.5, -0.2, 0.5, -0.2, 0.2, -0.5, 0.6, -0.8, 0.8, -0.1, 0.4, -0.3, 0.2, -0.6, 0.6, -0.6, 0.4, -0.7, 0.6, 0.0, 0.1, 0.6, 0.4, 0.7, 0.8, -0.7, 0.7, -0.2, 0.8, -0.5, 0.3, -0.2, 0.6, -0.8, 0.9, -0.8, 0.7, -0.6, 0.3, -0.7, 0.1, -0.9, 0.2, -0.2, 0.3, -0.9, 0.6, -0.6, 0.6, -0.1, 0.1, -0.3, 0.1, -0.6, 0.8, 0.0, 0.5, 0.6, 0.6, -0.4, 0.1, -0.1, 0.1, -0.4, 0.5, -0.6, 0.2, -0.6, 0.8, -0.5, 0.8, -0.5, 0.8, -0.8, 0.1, -0.6, 0.2, -0.1, 0.7, -0.8, 0.2, -0.1, 0.4, -0.8, 0.7, -0.8, 0.4, -0.7, 0.5, -0.6, 0.8, 0.0, 
+
+L2_zHER2_A_nn_pu
+0.4, 0.0, 0.3, 0.1, 0.4, 0.7, 0.1, 0.2, 0.4, 0.6, 0.2, 0.7, 0.1, 0.1, 0.1, 0.3, 0.8, 0.1, 0.9, 0.5, 0.2, 0.5, 0.9, 0.8, 0.8, 0.4, 0.6, 0.3, 0.1, 0.3, 0.8, 0.7, 0.6, 0.4, 0.4, 0.0, 0.9, 0.1, 0.4, 0.5, 0.9, 0.3, 0.8, 0.6, 0.2, 0.1, 0.2, 0.7, 0.9, 0.6, 0.8, 0.5, 0.2, 0.2, 0.3, 0.4, 0.8, 0.9, 0.1, 0.5, 0.1, 0.8, 0.7, 0.2, 0.1, 0.1, 0.8, 0.0, 0.1, 0.6, 0.2, 0.8, 0.1, 0.5, 0.8, 0.4, 0.1, 0.3, 0.9, 0.3, 0.7, 0.4, 0.4, 0.6, 0.4, 0.5, 0.8, 0.4, 0.4, 0.4, 0.5, 0.4, 0.8, 0.5, 0.1, 0.4, 0.1, 0.0, 0.1, 0.8, 0.7, 0.4, 0.3, 0.8, 0.7, 0.2, 0.9, 0.1, 0.2, 0.3, 0.8, 0.1, 0.4, 0.7, 0.4, 0.8, 0.5, 0.9, 0.6, 0.4, 0.3, 0.2, 0.5, 0.6, 0.1, 0.0, 0.4, 0.3, 0.1, 0.1, 0.6, 0.9, 0.4, 0.9, 0.5, 0.1, 0.1, 0.1, 0.4, 0.4, 0.9, 0.6, 0.5, 0.4, 0.5, 0.3, 0.6, 0.8, 0.2, 0.6, 0.7, 0.0, 0.4, 0.6, 0.5, 0.7, 0.3, 0.9, 0.2, 0.9, 0.2, 0.5, 0.5, 0.7, 0.9, 0.1, 0.1, 0.3, 0.5, 0.2, 0.9, 0.8, 0.8, 0.5, 0.8, 0.0, 0.9, 0.7, 0.2, 0.7, 0.8, 0.2, 0.4, 0.9, 0.3, 0.9, 0.5, 0.7, 0.3, 0.7, 0.5, 0.2, 0.7, 0.6, 0.8, 0.5, 0.5, 0.0, 0.6, 0.2, 0.7, 0.8, 0.3, 0.7, 0.1, 0.3, 0.1, 0.6, 0.5, 0.3, 0.2, 0.5, 0.3, 0.7, 0.8, 0.8, 0.1, 0.0, 0.5, 0.3, 0.2, 0.6, 0.9, 0.9, 0.2, 0.7, 0.6, 0.2, 0.6, 0.8, 0.1, 0.9, 0.1, 0.6, 0.7, 0.0, 0.2, 0.2, 0.7, 0.1, 0.8, 0.9, 0.7, 0.6, 0.8, 0.1, 0.2, 0.2, 0.2, 0.1, 0.3, 0.0, 0.6, 0.8, 0.4, 0.5, 0.8, 0.4, 0.4, 0.3, 0.3, 0.9, 0.7, 0.8, 0.3, 0.0, 0.6, 0.4, 0.5, 0.6, 0.2, 0.6, 0.6, 0.6, 0.2, 0.1, 0.2, 0.0, 0.4, 0.4, 0.6, 0.6, 0.6, 0.1, 0.4, 0.8, 0.6, 0.0, 0.4, 0.7, 0.1, 0.3, 0.7, 0.8, 0.6, 0.0, 0.1, 0.6, 0.4, 0.7, 0.8, 0.0, 0.5, 0.6, 0.8, 0.0, 
+
+L2_zHER2_x_n1
+0.5, 0.6, 0.6, 0.8, 0.6, 0.3, 0.1, 0.6, 0.7, 0.4, 0.5, 0.4, 0.3, 0.7, 0.3, 0.9, 0.3, 0.8, 0.1, 0.8, 0.7, 0.2, 0.1, 0.8, 0.9, 0.8, 0.4, 0.7, 0.4, 0.8, 0.9, 0.9, 0.4, 0.1, 
+
+L2_zHER2_x_n2
+0.5, 0.6, 0.0, 0.0, 0.6, 0.8, 0.0, 0.0, 0.6, 0.3, 0.0, 0.0, 0.1, 0.6, 0.0, 0.0, 0.7, 0.4, 0.0, 0.0, 0.5, 0.4, 0.0, 0.0, 0.3, 0.7, 0.0, 0.0, 0.3, 0.9, 0.0, 0.0, 0.3, 0.8, 0.0, 0.0, 0.1, 0.8, 0.0, 0.0, 0.7, 0.2, 0.0, 0.0, 0.1, 0.8, 0.0, 0.0, 0.9, 0.8, 0.0, 0.0, 0.4, 0.7, 0.0, 0.0, 0.4, 0.8, 0.0, 0.0, 0.9, 0.9, 0.0, 0.0, 0.4, 0.1, 0.0, 0.0, 
+
+L2_zHER2_y_n1
+0.9, 0.8, 0.9, 0.8, 0.9, 0.8, 0.9, 0.7, 0.8, 0.4, 0.7, 0.1, 0.8, 0.6, 0.4, 0.2, 0.4, 0.1, 0.9, 0.7, 0.6, 0.7, 0.7, 0.1, 0.8, 0.7, 0.8, 0.3, 0.6, 0.6, 0.8, 0.3, 0.7, 0.7, 
+
+L2_zHER2_y_n2
+0.9, 0.8, 0.0, 0.0, 0.0, 0.0, 0.9, 0.8, 0.0, 0.0, 0.0, 0.0, 0.9, 0.8, 0.0, 0.0, 0.0, 0.0, 0.9, 0.7, 0.0, 0.0, 0.0, 0.0, 0.8, 0.4, 0.0, 0.0, 0.0, 0.0, 0.7, 0.1, 0.0, 0.0, 0.0, 0.0, 0.8, 0.6, 0.0, 0.0, 0.0, 0.0, 0.4, 0.2, 0.0, 0.0, 0.0, 0.0, 0.4, 0.1, 0.0, 0.0, 0.0, 0.0, 0.9, 0.7, 0.0, 0.0, 0.0, 0.0, 0.6, 0.7, 0.0, 0.0, 0.0, 0.0, 0.7, 0.1, 0.0, 0.0, 0.0, 0.0, 0.8, 0.7, 0.0, 0.0, 0.0, 0.0, 0.8, 0.3, 0.0, 0.0, 0.0, 0.0, 0.6, 0.6, 0.0, 0.0, 0.0, 0.0, 0.8, 0.3, 0.0, 0.0, 0.0, 0.0, 0.7, 0.7, 0.0, 0.0, 0.0, 0.0, 
+
+L2_zHER2_o_N
+2.26, 0.0, 2.41, -8.32667268469e-17, 2.11, 1.05, 1.54, -0.07, 1.99, 1.08, 1.38, 1.11, 1.69, -0.11, 1.41, -0.13, 1.97, -0.19, 2.5, 0.05, 1.71, 0.89, 2.04, 0.53, 3.07, 0.53, 2.1, 0.32, 1.76, -0.04, 2.91, 0.94, 1.81, 0.7, 2.41, 8.32667268469e-17, 2.76, 0.0, 2.86, 0.55, 2.07, 0.34, 2.65, 0.9, 2.07, 1.14, 1.99, -0.01, 1.59, 0.33, 2.13, 0.38, 2.63, 0.16, 1.91, 0.64, 1.53, 0.26, 3.29, 1.12, 1.74, 0.65, 1.94, 0.52, 2.95, 0.57, 1.52, 0.47, 2.11, -1.05, 2.86, -0.55, 2.36, 0.0, 1.42, -0.01, 1.75, 1.0, 1.32, 0.69, 2.29, -0.11, 1.39, -0.27, 2.08, -0.12, 2.18, -0.39, 1.76, 0.74, 1.58, 0.01, 2.94, 0.22, 1.89, 0.15, 2.04, -0.18, 2.9, 0.47, 1.17, 0.42, 1.54, 0.07, 2.07, -0.34, 1.42, 0.01, 1.12, 0.0, 1.33, 1.37, 1.56, 0.8, 1.5, 0.8, 1.76, -0.18, 1.83, -0.18, 1.36, 0.12, 2.05, 0.7, 1.18, 0.46, 2.27, 1.12, 1.61, 1.0, 1.94, 0.26, 2.0, 0.47, 1.42, 1.14, 1.99, -1.08, 2.65, -0.9, 1.75, -1.0, 1.33, -1.37, 1.54, 0.0, 1.49, 0.39, 1.42, -0.44, 1.56, 0.32, 1.28, 0.47, 1.81, -0.63, 1.44, -0.03, 1.33, 0.01, 2.78, 0.15, 1.78, 0.11, 1.8, -0.36, 2.36, 0.55, 1.33, 0.47, 1.38, -1.11, 2.07, -1.14, 1.32, -0.69, 1.56, -0.8, 1.49, -0.39, 1.48, 0.0, 1.32, 0.16, 1.08, 0.16, 0.83, 0.48, 1.08, 0.36, 1.29, 0.32, 1.04, 0.38, 2.29, -0.4, 0.97, 0.02, 1.4, -0.38, 2.14, 0.43, 1.72, 0.4, 1.69, 0.11, 1.99, 0.01, 2.29, 0.11, 1.5, -0.8, 1.42, 0.44, 1.32, -0.16, 2.12, 0.0, 1.94, 0.38, 1.11, 0.49, 2.12, 0.04, 1.75, 1.37, 1.14, 0.78, 2.43, 0.95, 1.49, 0.85, 1.9, 0.04, 2.41, 0.89, 1.88, 0.94, 1.41, 0.13, 1.59, -0.33, 1.39, 0.27, 1.76, 0.18, 1.56, -0.32, 1.08, -0.16, 1.94, -0.38, 1.1, 0.0, 1.09, 0.27, 1.8, 1.1, 1.43, 1.09, 0.6, 0.6, 1.49, 0.97, 1.31, 0.73, 1.24, 0.62, 1.35, 1.15, 1.82, 1.26, 1.97, 0.19, 2.13, -0.38, 2.08, 0.12, 1.83, 0.18, 1.28, -0.47, 0.83, -0.48, 1.11, -0.49, 1.09, -0.27, 0.5, 0.0, 1.45, 0.5, 1.24, 0.86, 1.31, 1.12, 1.44, 0.9, 1.31, 0.51, 1.5, 0.82, 1.03, 1.18, 1.04, 0.95, 2.5, -0.05, 2.63, -0.16, 2.18, 0.39, 1.36, -0.12, 1.81, 0.63, 1.08, -0.36, 2.12, -0.04, 1.8, -1.1, 1.45, -0.5, 2.0, 0.0, 1.59, 0.92, 1.5, -1.94289029309e-16, 2.81, 1.38, 1.87, 0.86, 2.26, 0.08, 1.96, 0.63, 1.26, 0.78, 1.71, -0.89, 1.91, -0.64, 1.76, -0.74, 2.05, -0.7, 1.44, 0.03, 1.29, -0.32, 1.75, -1.37, 1.43, -1.09, 1.24, -0.86, 1.59, -0.92, 1.42, 0.0, 1.73, 0.46, 2.2, 0.32, 2.15, 0.21, 1.74, -0.2, 2.09, 0.94, 1.64, 0.67, 2.04, -0.53, 1.53, -0.26, 1.58, -0.01, 1.18, -0.46, 1.33, -0.01, 1.04, -0.38, 1.14, -0.78, 0.6, -0.6, 1.31, -1.12, 1.5, 1.94289029309e-16, 1.73, -0.46, 0.6, 0.0, 1.95, 0.5, 1.17, 0.76, 1.1, 0.5, 1.64, 0.67, 1.12, 0.56, 3.07, -0.53, 3.29, -1.12, 2.94, -0.22, 2.27, -1.12, 2.78, -0.15, 2.29, 0.4, 2.43, -0.95, 1.49, -0.97, 1.44, -0.9, 2.81, -1.38, 2.2, -0.32, 1.95, -0.5, 2.76, 0.0, 2.17, 0.49, 2.5, 0.18, 2.91, 0.38, 1.98, 0.93, 2.1, -0.32, 1.74, -0.65, 1.89, -0.15, 1.61, -1.0, 1.78, -0.11, 0.97, -0.02, 1.49, -0.85, 1.31, -0.73, 1.31, -0.51, 1.87, -0.86, 2.15, -0.21, 1.17, -0.76, 2.17, -0.49, 1.66, 0.0, 1.62, 0.36, 1.62, 0.29, 1.82, 1.05, 1.76, 0.04, 1.94, -0.52, 2.04, 0.18, 1.94, -0.26, 1.8, 0.36, 1.4, 0.38, 1.9, -0.04, 1.24, -0.62, 1.5, -0.82, 2.26, -0.08, 1.74, 0.2, 1.1, -0.5, 2.5, -0.18, 1.62, -0.36, 2.04, 0.0, 1.74, 1.12, 1.54, 1.16, 2.91, -0.94, 2.95, -0.57, 2.9, -0.47, 2.0, -0.47, 2.36, -0.55, 2.14, -0.43, 2.41, -0.89, 1.35, -1.15, 1.03, -1.18, 1.96, -0.63, 2.09, -0.94, 1.64, -0.67, 2.91, -0.38, 1.62, -0.29, 1.74, -1.12, 2.78, 0.0, 2.11, 0.64, 1.81, -0.7, 1.52, -0.47, 1.17, -0.42, 1.42, -1.14, 1.33, -0.47, 1.72, -0.4, 1.88, -0.94, 1.82, -1.26, 1.04, -0.95, 1.26, -0.78, 1.64, -0.67, 1.12, -0.56, 1.98, -0.93, 1.82, -1.05, 1.54, -1.16, 2.11, -0.64, 1.5, 0.0, 
+
+L2_zHER2_o_N_pu
+2.26, 0.0, 2.41, -8.32667268469e-17, 2.11, 1.05, 1.54, -0.07, 1.99, 1.08, 1.38, 1.11, 1.69, -0.11, 1.41, -0.13, 1.97, -0.19, 2.5, 0.05, 1.71, 0.89, 2.04, 0.53, 3.07, 0.53, 2.1, 0.32, 1.76, -0.04, 2.91, 0.94, 1.81, 0.7, 2.76, 0.0, 2.86, 0.55, 2.07, 0.34, 2.65, 0.9, 2.07, 1.14, 1.99, -0.01, 1.59, 0.33, 2.13, 0.38, 2.63, 0.16, 1.91, 0.64, 1.53, 0.26, 3.29, 1.12, 1.74, 0.65, 1.94, 0.52, 2.95, 0.57, 1.52, 0.47, 2.36, 0.0, 1.42, -0.01, 1.75, 1.0, 1.32, 0.69, 2.29, -0.11, 1.39, -0.27, 2.08, -0.12, 2.18, -0.39, 1.76, 0.74, 1.58, 0.01, 2.94, 0.22, 1.89, 0.15, 2.04, -0.18, 2.9, 0.47, 1.17, 0.42, 1.12, 0.0, 1.33, 1.37, 1.56, 0.8, 1.5, 0.8, 1.76, -0.18, 1.83, -0.18, 1.36, 0.12, 2.05, 0.7, 1.18, 0.46, 2.27, 1.12, 1.61, 1.0, 1.94, 0.26, 2.0, 0.47, 1.42, 1.14, 1.54, 0.0, 1.49, 0.39, 1.42, -0.44, 1.56, 0.32, 1.28, 0.47, 1.81, -0.63, 1.44, -0.03, 1.33, 0.01, 2.78, 0.15, 1.78, 0.11, 1.8, -0.36, 2.36, 0.55, 1.33, 0.47, 1.48, 0.0, 1.32, 0.16, 1.08, 0.16, 0.83, 0.48, 1.08, 0.36, 1.29, 0.32, 1.04, 0.38, 2.29, -0.4, 0.97, 0.02, 1.4, -0.38, 2.14, 0.43, 1.72, 0.4, 2.12, 0.0, 1.94, 0.38, 1.11, 0.49, 2.12, 0.04, 1.75, 1.37, 1.14, 0.78, 2.43, 0.95, 1.49, 0.85, 1.9, 0.04, 2.41, 0.89, 1.88, 0.94, 1.1, 0.0, 1.09, 0.27, 1.8, 1.1, 1.43, 1.09, 0.6, 0.6, 1.49, 0.97, 1.31, 0.73, 1.24, 0.62, 1.35, 1.15, 1.82, 1.26, 0.5, 0.0, 1.45, 0.5, 1.24, 0.86, 1.31, 1.12, 1.44, 0.9, 1.31, 0.51, 1.5, 0.82, 1.03, 1.18, 1.04, 0.95, 2.0, 0.0, 1.59, 0.92, 1.5, -1.94289029309e-16, 2.81, 1.38, 1.87, 0.86, 2.26, 0.08, 1.96, 0.63, 1.26, 0.78, 1.42, 0.0, 1.73, 0.46, 2.2, 0.32, 2.15, 0.21, 1.74, -0.2, 2.09, 0.94, 1.64, 0.67, 0.6, 0.0, 1.95, 0.5, 1.17, 0.76, 1.1, 0.5, 1.64, 0.67, 1.12, 0.56, 2.76, 0.0, 2.17, 0.49, 2.5, 0.18, 2.91, 0.38, 1.98, 0.93, 1.66, 0.0, 1.62, 0.36, 1.62, 0.29, 1.82, 1.05, 2.04, 0.0, 1.74, 1.12, 1.54, 1.16, 2.78, 0.0, 2.11, 0.64, 1.5, 0.0, 
+
+L2_sSYR_A_nn
+0.6, 0.2, 0.3, 0.3, 0.2, 0.7, 0.8, 0.8, 0.9, 0.1, 0.7, 0.2, 0.7, 0.4, 0.4, 0.9, 0.5, 0.9, 0.1, 0.5, 0.8, 0.2, 0.8, 0.4, 0.1, 0.4, 0.3, 0.7, 0.9, 0.8, 0.9, 0.3, 0.3, 0.3, 0.4, 0.4, 0.3, 0.8, 0.4, 0.8, 0.1, 0.7, 0.7, 0.6, 0.2, 0.4, 0.3, 0.6, 0.5, 0.4, 0.6, 0.6, 0.8, 0.3, 0.4, 0.2, 0.8, 0.4, 0.7, 0.1, 0.1, 0.1, 0.3, 0.8, 0.4, 0.3, 0.8, 0.1, 0.3, 0.8, 0.8, 0.1, 0.3, 0.7, 0.4, 0.2, 0.8, 0.6, 0.1, 0.1, 0.2, 0.4, 0.7, 0.8, 0.8, 0.8, 0.4, 0.7, 0.9, 0.1, 0.3, 0.8, 0.5, 0.9, 0.6, 0.7, 0.9, 0.7, 0.4, 0.5, 0.9, 0.2, 0.2, 0.1, 0.6, 0.4, 0.4, 0.5, 0.7, 0.8, 0.4, 0.1, 0.3, 0.7, 0.8, 0.3, 0.8, 0.3, 0.7, 0.8, 0.5, 0.9, 0.3, 0.2, 0.6, 0.2, 0.6, 0.6, 0.8, 0.6, 0.3, 0.2, 0.6, 0.4, 0.1, 0.9, 0.5, 0.6, 0.5, 0.2, 0.5, 0.2, 0.5, 0.8, 0.1, 0.1, 0.6, 0.1, 0.8, 0.1, 0.4, 0.6, 0.4, 0.7, 0.6, 0.5, 0.6, 0.8, 0.7, 0.9, 0.5, 0.3, 0.2, 0.2, 0.2, 0.2, 0.9, 0.6, 0.6, 0.7, 0.9, 0.7, 0.9, 0.7, 0.9, 0.3, 0.2, 0.4, 0.5, 0.4, 0.9, 0.4, 0.2, 0.9, 0.6, 0.2, 0.2, 0.2, 0.1, 0.4, 0.1, 0.7, 0.8, 0.7, 0.3, 0.1, 0.7, 0.5, 0.7, 0.3, 0.5, 0.7, 0.4, 0.3, 0.6, 0.8, 0.6, 0.3, 0.1, 0.7, 0.5, 0.1, 0.3, 0.8, 0.5, 0.4, 0.9, 0.3, 0.6, 0.5, 0.6, 0.4, 0.1, 0.1, 0.9, 0.8, 0.8, 0.7, 0.8, 0.9, 0.7, 0.4, 0.7, 0.1, 0.8, 0.7, 0.4, 0.3, 0.1, 0.7, 0.2, 0.6, 0.8, 0.3, 0.3, 0.8, 0.4, 0.6, 0.6, 0.3, 0.9, 0.4, 0.1, 0.3, 0.5, 0.5, 0.1, 0.9, 0.1, 0.2, 0.4, 0.6, 0.6, 0.7, 0.2, 0.8, 0.7, 0.7, 0.8, 0.8, 0.3, 0.9, 0.5, 0.7, 0.5, 0.4, 0.2, 0.6, 0.2, 0.2, 0.2, 0.8, 0.7, 0.7, 0.8, 0.1, 0.1, 0.1, 0.9, 
+
+L2_sSYR_A_nn_pu
+0.6, 0.2, 0.3, 0.3, 0.2, 0.7, 0.8, 0.8, 0.9, 0.1, 0.7, 0.2, 0.7, 0.4, 0.4, 0.9, 0.5, 0.1, 0.5, 0.8, 0.2, 0.8, 0.4, 0.1, 0.4, 0.3, 0.7, 0.9, 0.8, 0.9, 0.3, 0.3, 0.3, 0.3, 0.8, 0.4, 0.8, 0.1, 0.7, 0.7, 0.6, 0.2, 0.4, 0.3, 0.6, 0.5, 0.4, 0.6, 0.4, 0.2, 0.8, 0.4, 0.7, 0.1, 0.1, 0.1, 0.3, 0.8, 0.4, 0.3, 0.8, 0.1, 0.3, 0.7, 0.4, 0.2, 0.8, 0.6, 0.1, 0.1, 0.2, 0.4, 0.7, 0.8, 0.8, 0.3, 0.8, 0.5, 0.9, 0.6, 0.7, 0.9, 0.7, 0.4, 0.5, 0.9, 0.2, 0.7, 0.8, 0.4, 0.1, 0.3, 0.7, 0.8, 0.3, 0.8, 0.3, 0.7, 0.6, 0.6, 0.8, 0.6, 0.3, 0.2, 0.6, 0.4, 0.1, 0.9, 0.1, 0.1, 0.6, 0.1, 0.8, 0.1, 0.4, 0.6, 0.4, 0.2, 0.2, 0.2, 0.2, 0.9, 0.6, 0.6, 0.7, 0.9, 0.4, 0.2, 0.9, 0.6, 0.2, 0.2, 0.7, 0.3, 0.5, 0.7, 0.4, 0.3, 0.9, 0.3, 0.6, 0.5, 0.6, 0.8, 0.7, 0.4, 0.3, 0.1, 0.3, 0.5, 0.3, 0.9, 0.9, 
+
+L2_sSYR_x_n1
+0.8, 0.3, 0.5, 0.6, 0.5, 0.9, 0.2, 0.2, 0.5, 0.8, 0.4, 0.5, 0.5, 0.4, 0.2, 0.3, 0.3, 
+
+L2_sSYR_x_n2
+0.8, 0.0, 0.3, 0.0, 0.5, 0.0, 0.6, 0.0, 0.5, 0.0, 0.9, 0.0, 0.2, 0.0, 0.2, 0.0, 0.5, 0.0, 0.8, 0.0, 0.4, 0.0, 0.5, 0.0, 0.5, 0.0, 0.4, 0.0, 0.2, 0.0, 0.3, 0.0, 0.3, 0.0, 
+
+L2_sSYR_o_N
+1.24000004292, 0.440000016093, 0.700000017881, 0.780000038147, 0.600000008941, 1.41999997973, 0.960000016689, 0.960000016689, 1.29999998212, 0.740000020564, 1.01999999762, 0.600000008941, 1.09999999404, 0.720000015497, 0.560000010729, 1.13999998927, 0.740000013113, 1.13999998927, 0.190000008643, 0.65000000596, 0.980000026226, 0.350000008941, 1.0700000155, 0.460000009239, 0.160000004768, 0.550000011921, 0.540000025034, 0.819999994636, 1.04999998212, 0.950000017881, 1.01999998271, 0.360000015199, 0.390000019073, 0.390000019073, 0.800000011921, 0.550000011921, 0.550000011921, 1.10000002384, 0.65000000596, 1.25, 0.20000000298, 0.799999989569, 0.949999988079, 1.0000000298, 0.40000000596, 0.65000000596, 0.550000011921, 0.800000026822, 0.60000000149, 0.550000011921, 0.750000029802, 1.08000005007, 0.980000026226, 0.600000023842, 0.760000034571, 0.500000014901, 1.34000001907, 0.520000012517, 0.819999994636, 0.400000013411, 0.580000027716, 0.340000014603, 0.600000023842, 1.10000002384, 0.640000019073, 0.420000018477, 0.980000026226, 0.280000015795, 0.700000017881, 0.950000017881, 1.05000001192, 0.400000013411, 0.550000011921, 1.14999997616, 0.500000007451, 0.30000000447, 1.05000001192, 1.0000000298, 0.30000000447, 0.35000000149, 0.45000000298, 0.600000008941, 0.799999989569, 0.950000017881, 0.950000017881, 1.52000000358, 0.670000009537, 1.14999997616, 1.43999998331, 0.549999989569, 1.10999996901, 0.980000009835, 0.679999997914, 1.34999996424, 1.3200000155, 1.05999998391, 1.34999996424, 1.14999997616, 0.760000001788, 0.679999997914, 1.16999997973, 0.470000006557, 0.360000007749, 0.160000004768, 0.700000025332, 0.520000012517, 0.500000007451, 0.679999997914, 0.739999989271, 0.840000013113, 0.500000007451, 0.260000006258, 0.380000014305, 0.799999989569, 0.900000013411, 0.380000014305, 0.840000013113, 0.360000015199, 0.759999991357, 0.960000016689, 0.560000003278, 0.999999977648, 0.420000018477, 0.30000000447, 0.780000021756, 0.240000004172, 0.640000025034, 0.700000025332, 0.960000016689, 0.680000026226, 0.400000013411, 0.30000000447, 0.680000026226, 0.440000007153, 0.160000004768, 0.959999979436, 0.90000000596, 0.750000029802, 0.75, 0.500000014901, 0.75, 0.649999991059, 0.60000000149, 0.900000013411, 0.35000000149, 0.500000007451, 0.800000026822, 0.35000000149, 1.05000001192, 0.30000000447, 0.500000007451, 0.750000029802, 0.550000011921, 1.34000000715, 0.840000036955, 0.90000000596, 1.08000005007, 1.20000001788, 1.41999997973, 1.05999998093, 0.660000004768, 0.700000017881, 0.840000022054, 0.520000012517, 0.600000008941, 0.600000008941, 1.21999998569, 0.76000002861, 0.840000036955, 0.940000001192, 1.21999998569, 0.819999994636, 1.09999997914, 0.940000001192, 1.09999997914, 0.660000007749, 0.280000005364, 0.480000008345, 0.70000000298, 0.720000015497, 1.05999998093, 0.600000008941, 0.40000000596, 1.05999998093, 0.680000026226, 0.320000009537, 0.320000009537, 0.600000008941, 0.250000007451, 0.65000000596, 0.400000013411, 0.949999988079, 1.25, 0.799999989569, 0.400000013411, 0.35000000149, 1.09999999404, 0.70000000298, 0.949999988079, 0.550000011921, 0.70000000298, 0.799999989569, 0.550000011921, 0.450000017881, 1.0000000298, 0.950000017881, 0.850000023842, 0.600000023842, 0.35000000149, 1.14999997616, 0.60000000149, 0.20000000298, 0.550000011921, 1.20000001788, 0.70000000298, 0.65000000596, 1.14999997616, 0.500000014901, 0.700000025332, 0.65000000596, 0.750000029802, 0.720000015497, 0.220000008047, 0.30000000447, 1.13999998927, 1.0000000149, 1.16000000775, 0.779999990463, 0.880000014305, 1.09999997914, 1.01999999762, 0.560000010729, 0.899999991059, 0.30000000447, 0.960000016689, 0.779999990463, 0.520000012517, 0.420000018477, 0.260000006258, 0.759999991357, 0.30000000447, 0.720000030398, 0.900000013411, 0.480000009835, 0.340000013113, 0.840000013113, 0.500000007451, 0.76000002861, 0.680000026226, 0.400000013411, 0.999999977648, 0.480000008345, 0.140000002682, 0.360000015199, 0.560000003278, 0.740000013113, 0.190000008643, 1.04999998212, 0.280000015795, 0.350000008941, 0.670000009537, 0.66000002712, 0.66000002712, 0.84999999404, 0.440000016093, 0.920000018477, 0.84999999404, 0.84999999404, 0.920000018477, 0.860000015199, 0.390000019073, 0.989999983311, 0.740000013113, 0.789999995232, 0.65000000596, 0.580000020266, 0.350000008941, 0.870000027418, 0.260000006258, 0.260000006258, 0.350000008941, 1.04000002503, 0.819999994636, 0.84999999404, 0.950000017881, 0.220000008047, 0.160000004768, 0.190000008643, 0.989999983311, 
+
+L2_sSYR_o_N_pu
+1.24000004292, 0.440000016093, 0.700000017881, 0.780000038147, 0.600000008941, 1.41999997973, 0.960000016689, 0.960000016689, 1.29999998212, 0.740000020564, 1.01999999762, 0.600000008941, 1.09999999404, 0.720000015497, 0.560000010729, 1.13999998927, 0.740000013113, 0.190000008643, 0.65000000596, 0.980000026226, 0.350000008941, 1.0700000155, 0.460000009239, 0.160000004768, 0.550000011921, 0.540000025034, 0.819999994636, 1.04999998212, 0.950000017881, 1.01999998271, 0.360000015199, 0.390000019073, 0.390000019073, 0.550000011921, 1.10000002384, 0.65000000596, 1.25, 0.20000000298, 0.799999989569, 0.949999988079, 1.0000000298, 0.40000000596, 0.65000000596, 0.550000011921, 0.800000026822, 0.60000000149, 0.550000011921, 0.750000029802, 0.760000034571, 0.500000014901, 1.34000001907, 0.520000012517, 0.819999994636, 0.400000013411, 0.580000027716, 0.340000014603, 0.600000023842, 1.10000002384, 0.640000019073, 0.420000018477, 0.980000026226, 0.280000015795, 0.550000011921, 1.14999997616, 0.500000007451, 0.30000000447, 1.05000001192, 1.0000000298, 0.30000000447, 0.35000000149, 0.45000000298, 0.600000008941, 0.799999989569, 0.950000017881, 0.950000017881, 1.10999996901, 0.980000009835, 0.679999997914, 1.34999996424, 1.3200000155, 1.05999998391, 1.34999996424, 1.14999997616, 0.760000001788, 0.679999997914, 1.16999997973, 0.470000006557, 0.739999989271, 0.840000013113, 0.500000007451, 0.260000006258, 0.380000014305, 0.799999989569, 0.900000013411, 0.380000014305, 0.840000013113, 0.360000015199, 0.759999991357, 0.640000025034, 0.700000025332, 0.960000016689, 0.680000026226, 0.400000013411, 0.30000000447, 0.680000026226, 0.440000007153, 0.160000004768, 0.959999979436, 0.35000000149, 0.500000007451, 0.800000026822, 0.35000000149, 1.05000001192, 0.30000000447, 0.500000007451, 0.750000029802, 0.550000011921, 0.840000022054, 0.520000012517, 0.600000008941, 0.600000008941, 1.21999998569, 0.76000002861, 0.840000036955, 0.940000001192, 1.05999998093, 0.600000008941, 0.40000000596, 1.05999998093, 0.680000026226, 0.320000009537, 0.320000009537, 0.949999988079, 0.550000011921, 0.70000000298, 0.799999989569, 0.550000011921, 0.450000017881, 1.14999997616, 0.500000014901, 0.700000025332, 0.65000000596, 0.750000029802, 0.960000016689, 0.779999990463, 0.520000012517, 0.420000018477, 0.140000002682, 0.360000015199, 0.560000003278, 0.390000019073, 0.989999983311, 0.989999983311, 
+
+L2_dSYR_A_nn
+0.9, 0.8, 0.3, 0.5, 0.4, 0.8, 0.1, 0.4, 0.7, 0.4, 0.4, 0.7, 0.6, 0.5, 0.2, 0.8, 0.6, 0.5, 0.7, 0.3, 0.1, 0.9, 0.5, 0.7, 0.6, 0.2, 0.1, 0.7, 0.4, 0.9, 0.8, 0.5, 0.3, 0.5, 0.3, 0.2, 0.3, 0.8, 0.3, 0.1, 0.7, 0.2, 0.4, 0.6, 0.6, 0.7, 0.4, 0.6, 0.9, 0.6, 0.1, 0.9, 0.7, 0.9, 0.9, 0.4, 0.8, 0.8, 0.6, 0.9, 0.9, 0.9, 0.3, 0.8, 0.8, 0.7, 0.2, 0.8, 0.9, 0.4, 0.3, 0.4, 0.1, 0.9, 0.6, 0.9, 0.8, 0.9, 0.8, 0.3, 0.4, 0.1, 0.2, 0.4, 0.8, 0.4, 0.9, 0.5, 0.1, 0.1, 0.5, 0.8, 0.3, 0.7, 0.6, 0.8, 0.2, 0.5, 0.7, 0.1, 0.5, 0.7, 0.7, 0.4, 0.6, 0.5, 0.6, 0.4, 0.2, 0.6, 0.3, 0.5, 0.5, 0.2, 0.9, 0.8, 0.8, 0.1, 0.9, 0.4, 0.5, 0.2, 0.5, 0.3, 0.9, 0.6, 0.9, 0.5, 0.6, 0.6, 0.5, 0.5, 0.5, 0.5, 0.5, 0.1, 0.8, 0.7, 0.5, 0.5, 0.3, 0.2, 0.4, 0.1, 0.3, 0.4, 0.3, 0.2, 0.9, 0.9, 0.1, 0.5, 0.3, 0.5, 0.9, 0.7, 0.8, 0.8, 0.7, 0.2, 0.2, 0.6, 0.5, 0.2, 0.5, 0.6, 0.7, 0.5, 0.8, 0.7, 0.3, 0.5, 0.9, 0.9, 0.6, 0.9, 0.4, 0.4, 0.8, 0.6, 0.4, 0.1, 0.8, 0.3, 0.5, 0.6, 0.4, 0.4, 0.1, 0.2, 0.5, 0.1, 0.7, 0.6, 0.7, 0.8, 0.8, 0.1, 0.9, 0.2, 0.5, 0.8, 0.5, 0.1, 0.5, 0.2, 0.4, 0.8, 0.3, 0.2, 0.5, 0.4, 0.7, 0.5, 0.7, 0.1, 0.3, 0.2, 0.6, 0.4, 0.4, 0.9, 0.8, 0.4, 0.1, 0.4, 0.5, 0.9, 0.2, 0.9, 0.8, 0.1, 0.2, 0.8, 0.4, 0.7, 0.4, 0.9, 0.9, 0.7, 0.1, 0.3, 0.9, 0.1, 0.5, 0.1, 0.4, 0.8, 0.7, 0.9, 0.9, 0.4, 0.6, 0.1, 0.8, 0.3, 0.4, 0.2, 0.4, 0.5, 0.5, 0.8, 0.3, 0.6, 0.1, 0.8, 0.8, 0.2, 0.1, 0.6, 0.8, 0.3, 0.6, 0.5, 0.8, 0.6, 0.2, 0.4, 0.5, 0.3, 0.1, 0.2, 0.2, 0.2, 0.4, 0.3, 0.6, 0.5, 0.2, 
+
+L2_dSYR_A_nn_pu
+0.9, 0.8, 0.3, 0.5, 0.4, 0.8, 0.1, 0.4, 0.7, 0.4, 0.4, 0.7, 0.6, 0.5, 0.2, 0.8, 0.6, 0.7, 0.3, 0.1, 0.9, 0.5, 0.7, 0.6, 0.2, 0.1, 0.7, 0.4, 0.9, 0.8, 0.5, 0.3, 0.5, 0.3, 0.8, 0.3, 0.1, 0.7, 0.2, 0.4, 0.6, 0.6, 0.7, 0.4, 0.6, 0.9, 0.6, 0.1, 0.9, 0.4, 0.8, 0.8, 0.6, 0.9, 0.9, 0.9, 0.3, 0.8, 0.8, 0.7, 0.2, 0.8, 0.1, 0.9, 0.6, 0.9, 0.8, 0.9, 0.8, 0.3, 0.4, 0.1, 0.2, 0.4, 0.8, 0.5, 0.8, 0.3, 0.7, 0.6, 0.8, 0.2, 0.5, 0.7, 0.1, 0.5, 0.7, 0.2, 0.6, 0.3, 0.5, 0.5, 0.2, 0.9, 0.8, 0.8, 0.1, 0.9, 0.9, 0.5, 0.6, 0.6, 0.5, 0.5, 0.5, 0.5, 0.5, 0.1, 0.3, 0.4, 0.3, 0.2, 0.9, 0.9, 0.1, 0.5, 0.3, 0.5, 0.2, 0.5, 0.6, 0.7, 0.5, 0.8, 0.7, 0.4, 0.1, 0.8, 0.3, 0.5, 0.6, 0.4, 0.9, 0.2, 0.5, 0.8, 0.5, 0.1, 0.3, 0.2, 0.6, 0.4, 0.4, 0.4, 0.7, 0.4, 0.9, 0.6, 0.1, 0.8, 0.8, 0.3, 0.2, 
+
+L2_dSYR_x_n1
+0.9, 0.7, 0.1, 0.8, 0.2, 0.9, 0.7, 0.8, 0.8, 0.4, 0.1, 0.9, 0.4, 0.3, 0.2, 0.1, 0.8, 
+
+L2_dSYR_x_n2
+0.9, 0.0, 0.7, 0.0, 0.1, 0.0, 0.8, 0.0, 0.2, 0.0, 0.9, 0.0, 0.7, 0.0, 0.8, 0.0, 0.8, 0.0, 0.4, 0.0, 0.1, 0.0, 0.9, 0.0, 0.4, 0.0, 0.3, 0.0, 0.2, 0.0, 0.1, 0.0, 0.8, 0.0, 
+
+L2_dSYR_o_N
+1.71, 1.43, 0.39, 1.22, 0.58, 1.61, 0.73, 1.12, 1.42, 0.76, 0.49, 1.51, 0.96, 0.77, 0.38, 0.89, 1.32, 1.13, 1.19, 0.37, 0.66, 1.04, 1.13, 1.19, 1.16, 0.76, 0.38, 0.77, 1.03, 1.18, 1.01, 0.64, 0.37, 1.06, 0.39, 0.27, 0.31, 0.88, 0.32, 0.19, 0.77, 0.28, 0.48, 0.64, 0.61, 0.79, 0.44, 0.63, 0.92, 0.61, 0.18, 1.62, 1.26, 0.98, 1.54, 0.56, 1.52, 1.36, 1.24, 1.54, 1.22, 0.98, 1.02, 1.12, 1.04, 0.86, 0.28, 1.44, 1.08, 0.54, 0.32, 0.56, 0.14, 1.08, 0.74, 1.06, 0.96, 0.98, 0.82, 0.48, 0.48, 0.16, 0.24, 0.42, 0.96, 1.21, 1.53, 0.59, 0.82, 0.28, 1.31, 1.43, 1.02, 1.42, 0.96, 0.89, 1.01, 0.86, 0.97, 0.28, 0.59, 1.42, 1.33, 0.89, 0.67, 1.06, 0.74, 1.03, 0.69, 1.16, 0.86, 0.78, 0.57, 0.83, 1.18, 1.01, 0.94, 0.17, 1.46, 1.12, 1.06, 0.28, 1.14, 0.46, 1.62, 1.16, 1.54, 1.14, 0.92, 0.68, 1.22, 0.82, 0.74, 0.66, 0.58, 0.74, 1.52, 1.26, 0.58, 1.14, 0.46, 0.92, 0.96, 0.74, 0.94, 0.72, 0.38, 0.92, 1.22, 1.14, 0.26, 0.58, 0.94, 0.86, 1.18, 0.74, 1.12, 0.88, 1.06, 0.48, 0.52, 0.92, 0.66, 0.24, 0.86, 0.76, 0.82, 0.58, 0.84, 1.02, 0.39, 0.57, 0.91, 0.98, 0.62, 0.99, 0.47, 0.48, 0.88, 0.64, 0.41, 0.19, 0.84, 0.33, 0.52, 0.61, 0.48, 1.21, 0.73, 0.29, 1.22, 0.28, 1.51, 1.23, 1.42, 1.52, 1.16, 0.19, 1.71, 0.56, 0.77, 0.98, 0.59, 0.82, 0.86, 0.48, 0.44, 1.12, 0.38, 0.56, 0.78, 0.72, 1.02, 0.66, 0.74, 0.46, 0.46, 0.32, 0.68, 0.44, 0.72, 1.17, 1.01, 0.43, 0.34, 0.46, 0.77, 1.11, 0.44, 1.14, 0.92, 0.13, 0.47, 0.92, 0.49, 0.76, 0.43, 1.14, 1.08, 0.84, 0.12, 0.46, 0.94, 0.28, 0.64, 0.26, 0.56, 0.88, 0.72, 1.08, 0.98, 0.46, 0.64, 0.12, 0.96, 0.39, 0.47, 0.21, 0.48, 0.52, 0.59, 0.87, 0.38, 0.68, 0.14, 0.81, 0.89, 0.24, 0.13, 0.62, 0.81, 0.38, 1.32, 1.06, 0.88, 1.24, 0.36, 1.12, 1.06, 0.94, 0.74, 0.52, 0.28, 0.92, 0.72, 0.54, 0.76, 0.58, 0.84, 
+
+L2_dSYR_o_N_pu
+1.71, 1.43, 0.39, 1.22, 0.58, 1.61, 0.73, 1.12, 1.42, 0.76, 0.49, 1.51, 0.96, 0.77, 0.38, 0.89, 1.32, 1.19, 0.37, 0.66, 1.04, 1.13, 1.19, 1.16, 0.76, 0.38, 0.77, 1.03, 1.18, 1.01, 0.64, 0.37, 1.06, 0.31, 0.88, 0.32, 0.19, 0.77, 0.28, 0.48, 0.64, 0.61, 0.79, 0.44, 0.63, 0.92, 0.61, 0.18, 1.54, 0.56, 1.52, 1.36, 1.24, 1.54, 1.22, 0.98, 1.02, 1.12, 1.04, 0.86, 0.28, 1.44, 0.14, 1.08, 0.74, 1.06, 0.96, 0.98, 0.82, 0.48, 0.48, 0.16, 0.24, 0.42, 0.96, 1.31, 1.43, 1.02, 1.42, 0.96, 0.89, 1.01, 0.86, 0.97, 0.28, 0.59, 1.42, 0.69, 1.16, 0.86, 0.78, 0.57, 0.83, 1.18, 1.01, 0.94, 0.17, 1.46, 1.54, 1.14, 0.92, 0.68, 1.22, 0.82, 0.74, 0.66, 0.58, 0.74, 0.94, 0.72, 0.38, 0.92, 1.22, 1.14, 0.26, 0.58, 0.94, 0.66, 0.24, 0.86, 0.76, 0.82, 0.58, 0.84, 1.02, 0.41, 0.19, 0.84, 0.33, 0.52, 0.61, 0.48, 1.71, 0.56, 0.77, 0.98, 0.59, 0.82, 0.46, 0.32, 0.68, 0.44, 0.72, 0.49, 0.76, 0.43, 1.14, 0.64, 0.12, 0.96, 0.81, 0.38, 0.84, 
+
+L2_sSYR2_A_nn
+0.7, 0.1, 0.5, 0.2, 0.2, 0.3, 0.3, 0.5, 0.8, 0.5, 0.6, 0.1, 0.4, 0.8, 0.9, 0.5, 0.1, 0.4, 0.8, 0.5, 0.2, 0.2, 0.4, 0.4, 0.3, 0.3, 0.4, 0.1, 0.2, 0.4, 0.4, 0.3, 0.4, 0.5, 0.8, 0.5, 0.2, 0.5, 0.9, 0.7, 0.5, 0.5, 0.8, 0.3, 0.5, 0.7, 0.8, 0.9, 0.4, 0.9, 0.6, 0.5, 0.8, 0.3, 0.3, 0.4, 0.4, 0.4, 0.1, 0.2, 0.5, 0.8, 0.1, 0.5, 0.2, 0.1, 0.9, 0.2, 0.6, 0.8, 0.3, 0.3, 0.8, 0.4, 0.5, 0.4, 0.4, 0.8, 0.1, 0.6, 0.8, 0.8, 0.1, 0.8, 0.8, 0.1, 0.2, 0.9, 0.3, 0.4, 0.2, 0.8, 0.9, 0.4, 0.6, 0.5, 0.7, 0.2, 0.5, 0.7, 0.4, 0.2, 0.6, 0.9, 0.9, 0.5, 0.8, 0.4, 0.7, 0.4, 0.7, 0.6, 0.3, 0.7, 0.7, 0.9, 0.1, 0.8, 0.5, 0.7, 0.5, 0.6, 0.3, 0.8, 0.7, 0.9, 0.9, 0.9, 0.8, 0.6, 0.9, 0.2, 0.9, 0.2, 0.4, 0.2, 0.7, 0.5, 0.9, 0.4, 0.1, 0.8, 0.7, 0.2, 0.9, 0.6, 0.9, 0.2, 0.3, 0.6, 0.8, 0.8, 0.9, 0.2, 0.7, 0.6, 0.1, 0.4, 0.9, 0.7, 0.5, 0.1, 0.1, 0.5, 0.6, 0.5, 0.4, 0.4, 0.3, 0.4, 0.9, 0.8, 0.2, 0.6, 0.8, 0.5, 0.1, 0.8, 0.7, 0.1, 0.2, 0.7, 0.9, 0.1, 0.8, 0.2, 0.9, 0.5, 0.3, 0.6, 0.2, 0.2, 0.4, 0.7, 0.5, 0.6, 0.7, 0.1, 0.7, 0.9, 0.4, 0.5, 0.4, 0.2, 0.7, 0.5, 0.7, 0.5, 0.6, 0.5, 0.1, 0.3, 0.9, 0.3, 0.4, 0.9, 0.5, 0.1, 0.8, 0.5, 0.2, 0.8, 0.6, 0.8, 0.1, 0.7, 0.6, 0.9, 0.2, 0.7, 0.7, 0.7, 0.7, 0.2, 0.8, 0.2, 0.4, 0.5, 0.1, 0.5, 0.5, 0.6, 0.2, 0.6, 0.2, 0.6, 0.6, 0.2, 0.7, 0.4, 0.3, 0.1, 0.1, 0.5, 0.4, 0.9, 0.1, 0.2, 0.7, 0.4, 0.8, 0.5, 0.7, 0.5, 0.9, 0.4, 0.8, 0.6, 0.3, 0.1, 0.6, 0.2, 0.7, 0.1, 0.8, 0.3, 0.8, 0.6, 0.1, 0.4, 0.8, 0.3, 0.2, 0.5, 0.2, 0.9, 0.9, 0.1, 0.8, 
+
+L2_sSYR2_A_nn_pu
+0.7, 0.1, 0.5, 0.2, 0.2, 0.3, 0.3, 0.5, 0.8, 0.5, 0.6, 0.1, 0.4, 0.8, 0.9, 0.5, 0.1, 0.8, 0.5, 0.2, 0.2, 0.4, 0.4, 0.3, 0.3, 0.4, 0.1, 0.2, 0.4, 0.4, 0.3, 0.4, 0.5, 0.2, 0.5, 0.9, 0.7, 0.5, 0.5, 0.8, 0.3, 0.5, 0.7, 0.8, 0.9, 0.4, 0.9, 0.6, 0.3, 0.4, 0.4, 0.4, 0.1, 0.2, 0.5, 0.8, 0.1, 0.5, 0.2, 0.1, 0.9, 0.2, 0.8, 0.4, 0.5, 0.4, 0.4, 0.8, 0.1, 0.6, 0.8, 0.8, 0.1, 0.8, 0.8, 0.2, 0.8, 0.9, 0.4, 0.6, 0.5, 0.7, 0.2, 0.5, 0.7, 0.4, 0.2, 0.7, 0.4, 0.7, 0.6, 0.3, 0.7, 0.7, 0.9, 0.1, 0.8, 0.5, 0.9, 0.9, 0.8, 0.6, 0.9, 0.2, 0.9, 0.2, 0.4, 0.2, 0.9, 0.6, 0.9, 0.2, 0.3, 0.6, 0.8, 0.8, 0.9, 0.1, 0.5, 0.6, 0.5, 0.4, 0.4, 0.3, 0.4, 0.2, 0.7, 0.9, 0.1, 0.8, 0.2, 0.9, 0.7, 0.9, 0.4, 0.5, 0.4, 0.2, 0.5, 0.1, 0.8, 0.5, 0.2, 0.8, 0.2, 0.4, 0.5, 0.1, 0.5, 0.4, 0.6, 0.2, 0.8, 
+
+L2_sSYR2_x_n1
+0.4, 0.4, 0.1, 0.2, 0.2, 0.9, 0.1, 0.7, 0.7, 0.6, 0.1, 0.4, 0.3, 0.6, 0.6, 0.4, 0.6, 
+
+L2_sSYR2_x_n2
+0.4, 0.0, 0.4, 0.0, 0.1, 0.0, 0.2, 0.0, 0.2, 0.0, 0.9, 0.0, 0.1, 0.0, 0.7, 0.0, 0.7, 0.0, 0.6, 0.0, 0.1, 0.0, 0.4, 0.0, 0.3, 0.0, 0.6, 0.0, 0.6, 0.0, 0.4, 0.0, 0.6, 0.0, 
+
+L2_sSYR2_y_n1
+0.4, 0.5, 0.8, 0.4, 0.9, 0.5, 0.5, 0.2, 0.7, 0.2, 0.8, 0.5, 0.5, 0.6, 0.1, 0.5, 0.2, 
+
+L2_sSYR2_y_n2
+0.4, 0.0, 0.0, 0.5, 0.0, 0.0, 0.8, 0.0, 0.0, 0.4, 0.0, 0.0, 0.9, 0.0, 0.0, 0.5, 0.0, 0.0, 0.5, 0.0, 0.0, 0.2, 0.0, 0.0, 0.7, 0.0, 0.0, 0.2, 0.0, 0.0, 0.8, 0.0, 0.0, 0.5, 0.0, 0.0, 0.5, 0.0, 0.0, 0.6, 0.0, 0.0, 0.1, 0.0, 0.0, 0.5, 0.0, 0.0, 0.2, 0.0, 0.0, 
+
+L2_sSYR2_o_N
+1.01999999762, 0.460000009239, 0.860000010729, 0.440000010133, 0.640000001192, 0.860000010729, 0.540000016093, 0.860000001788, 1.36000001073, 0.820000015497, 0.960000034571, 0.460000009239, 0.720000015497, 1.28000003815, 1.17999999046, 0.860000007749, 0.420000016987, 0.760000013709, 1.20000001788, 0.870000010282, 0.460000009239, 0.660000000298, 1.04999999702, 0.650000009686, 0.730000008345, 0.930000005364, 0.780000020266, 0.470000011772, 0.600000008941, 0.750000014901, 0.940000030994, 0.640000025034, 0.800000011921, 0.880000014305, 1.16000002265, 0.870000010282, 0.360000007749, 0.70000000596, 1.14999997988, 1.46999998048, 0.630000003129, 1.0799999994, 1.43000001058, 0.800000038743, 0.660000004768, 1.06999999836, 1.09000002578, 1.44000000566, 0.890000032485, 1.26999998644, 1.10000005066, 0.740000007153, 1.06000001818, 0.500000017881, 0.460000016689, 0.660000006258, 0.860000003278, 0.540000008643, 0.420000002086, 0.620000002086, 0.780000014305, 1.00000001788, 0.360000007749, 0.720000008047, 0.56000002265, 0.360000015199, 1.15999998242, 0.480000017285, 1.04000002205, 1.26000000924, 0.550000015646, 0.560000012219, 1.16000000775, 1.30999996454, 0.690000000447, 1.06999997973, 1.16999997824, 1.38000002027, 0.350000005215, 1.06000002116, 1.17000001699, 1.46000002563, 0.660000009239, 1.26000000924, 1.38000002027, 0.660000000298, 0.84999999404, 1.66999996856, 0.760000009239, 1.30999996454, 1.09999997914, 1.30000000075, 1.42999996811, 1.37999997258, 1.08000003368, 1.2699999924, 1.34999997914, 0.79999999702, 1.34000001907, 1.08999999896, 1.04999999702, 0.680000012815, 0.840000028014, 1.14999997988, 1.02999997929, 0.640000002682, 0.990000012368, 0.899999994785, 0.799999989569, 0.770000000596, 1.11999998197, 0.920000036359, 0.43000001505, 0.949999991804, 0.899999994785, 1.25999999136, 0.410000013709, 1.05000001565, 0.820000012517, 1.05999998987, 0.929999996424, 1.18000002325, 0.620000012517, 1.46999998569, 1.22999998003, 1.26999997079, 1.17999997556, 1.52999995917, 1.06000001818, 1.18000002325, 1.32999997258, 0.610000000298, 1.43999999225, 0.390000009388, 0.830000002384, 0.460000009239, 1.25999998689, 1.12999999344, 1.52999997482, 0.820000005066, 0.869999973774, 1.77999997854, 1.11999998197, 0.829999985993, 1.87999994278, 1.16000003308, 1.52999997482, 0.829999996424, 0.860000010729, 1.44000004292, 1.29000002131, 1.43000000536, 1.4599999854, 0.520000018477, 1.08000000238, 1.10000005066, 0.380000015795, 0.980000014305, 1.37999998599, 1.0200000006, 0.760000006258, 0.660000010729, 0.340000014603, 1.00000002682, 0.980000038147, 0.860000015199, 0.880000041127, 0.580000015795, 0.680000026226, 0.640000019073, 1.25999998689, 1.1700000222, 0.360000007749, 0.800000029802, 1.05000001565, 1.2699999924, 0.230000004619, 1.38000001132, 1.32999998674, 0.600000028312, 0.360000007749, 1.06999999836, 1.18999999002, 0.640000030994, 1.29000003844, 0.570000013262, 1.40000000298, 0.860000007749, 0.700000017881, 0.970000034124, 0.460000009239, 0.660000000298, 1.04999999702, 0.949999991804, 0.929999996424, 1.23000001729, 1.08000000238, 0.470000011772, 1.09999999404, 1.2499999851, 0.940000030994, 0.840000013113, 0.800000011921, 0.580000017285, 1.01999999762, 0.850000008941, 0.990000001937, 0.720000008047, 0.970000028908, 1.09999999404, 0.300000008196, 0.710000009239, 1.45999997497, 0.66000002712, 0.690000019819, 1.2499999851, 0.800000011921, 0.580000027716, 1.13000002548, 0.850000008941, 0.560000018179, 1.28000003815, 1.14000004888, 1.34000004143, 0.46000002116, 1.36000000179, 1.44000004292, 1.25999999136, 0.740000019073, 1.54000000715, 1.18000002325, 1.24000001758, 1.24000001311, 0.680000029206, 1.52000006914, 0.620000034869, 0.940000030994, 0.980000035167, 0.380000015795, 0.840000013113, 0.990000026524, 0.860000037551, 0.760000010729, 0.99000003472, 0.510000015199, 0.790000030249, 1.09000003323, 0.380000012815, 1.1900000146, 0.740000019073, 0.630000025481, 0.520000033379, 0.220000008047, 0.840000013113, 0.580000015795, 1.25999998391, 0.500000007451, 0.570000013262, 0.959999994338, 0.860000003278, 1.45000000298, 0.750000003725, 1.1299999845, 1.12999999344, 1.27999999046, 0.770000016242, 1.20000001788, 0.950000032783, 0.840000036955, 0.440000014603, 1.0000000298, 0.580000017285, 1.02000000358, 0.480000015795, 1.30000003874, 0.580000026226, 1.38000002027, 1.08000003368, 0.420000014007, 0.660000012219, 1.36000002116, 0.540000025034, 0.700000029802, 0.880000014305, 0.560000018179, 1.38000001132, 1.07999998599, 0.480000015795, 1.04000002503, 
+
+L2_sSYR2_o_N_pu
+1.01999999762, 0.460000009239, 0.860000010729, 0.440000010133, 0.640000001192, 0.860000010729, 0.540000016093, 0.860000001788, 1.36000001073, 0.820000015497, 0.960000034571, 0.460000009239, 0.720000015497, 1.28000003815, 1.17999999046, 0.860000007749, 0.420000016987, 1.20000001788, 0.870000010282, 0.460000009239, 0.660000000298, 1.04999999702, 0.650000009686, 0.730000008345, 0.930000005364, 0.780000020266, 0.470000011772, 0.600000008941, 0.750000014901, 0.940000030994, 0.640000025034, 0.800000011921, 0.880000014305, 0.360000007749, 0.70000000596, 1.14999997988, 1.46999998048, 0.630000003129, 1.0799999994, 1.43000001058, 0.800000038743, 0.660000004768, 1.06999999836, 1.09000002578, 1.44000000566, 0.890000032485, 1.26999998644, 1.10000005066, 0.460000016689, 0.660000006258, 0.860000003278, 0.540000008643, 0.420000002086, 0.620000002086, 0.780000014305, 1.00000001788, 0.360000007749, 0.720000008047, 0.56000002265, 0.360000015199, 1.15999998242, 0.480000017285, 1.16000000775, 1.30999996454, 0.690000000447, 1.06999997973, 1.16999997824, 1.38000002027, 0.350000005215, 1.06000002116, 1.17000001699, 1.46000002563, 0.660000009239, 1.26000000924, 1.38000002027, 1.09999997914, 1.30000000075, 1.42999996811, 1.37999997258, 1.08000003368, 1.2699999924, 1.34999997914, 0.79999999702, 1.34000001907, 1.08999999896, 1.04999999702, 0.680000012815, 0.799999989569, 0.770000000596, 1.11999998197, 0.920000036359, 0.43000001505, 0.949999991804, 0.899999994785, 1.25999999136, 0.410000013709, 1.05000001565, 0.820000012517, 1.17999997556, 1.52999995917, 1.06000001818, 1.18000002325, 1.32999997258, 0.610000000298, 1.43999999225, 0.390000009388, 0.830000002384, 0.460000009239, 1.87999994278, 1.16000003308, 1.52999997482, 0.829999996424, 0.860000010729, 1.44000004292, 1.29000002131, 1.43000000536, 1.4599999854, 0.340000014603, 1.00000002682, 0.980000038147, 0.860000015199, 0.880000041127, 0.580000015795, 0.680000026226, 0.640000019073, 0.360000007749, 1.06999999836, 1.18999999002, 0.640000030994, 1.29000003844, 0.570000013262, 1.40000000298, 1.09999999404, 1.2499999851, 0.940000030994, 0.840000013113, 0.800000011921, 0.580000017285, 0.800000011921, 0.580000027716, 1.13000002548, 0.850000008941, 0.560000018179, 1.52000006914, 0.620000034869, 0.940000030994, 0.980000035167, 0.220000008047, 0.840000013113, 0.580000015795, 1.0000000298, 0.580000017285, 1.04000002503, 
+
+L2_dSYR2_A_nn
+0.6, 0.4, 0.2, 0.3, 0.2, 0.3, 0.9, 0.5, 0.2, 0.7, 0.4, 0.6, 0.3, 0.7, 0.5, 0.4, 0.4, 0.2, 0.3, 0.3, 0.4, 0.7, 0.9, 0.8, 0.1, 0.3, 0.6, 0.3, 0.4, 0.1, 0.8, 0.3, 0.9, 0.7, 0.1, 0.2, 0.6, 0.7, 0.7, 0.6, 0.1, 0.4, 0.9, 0.8, 0.4, 0.4, 0.8, 0.3, 0.1, 0.9, 0.3, 0.6, 0.3, 0.4, 0.6, 0.9, 0.6, 0.9, 0.8, 0.3, 0.2, 0.9, 0.6, 0.3, 0.4, 0.9, 0.2, 0.1, 0.5, 0.6, 0.1, 0.4, 0.3, 0.5, 0.2, 0.2, 0.2, 0.4, 0.5, 0.5, 0.5, 0.8, 0.1, 0.5, 0.6, 0.1, 0.1, 0.1, 0.5, 0.8, 0.8, 0.7, 0.2, 0.3, 0.9, 0.7, 0.1, 0.7, 0.8, 0.6, 0.6, 0.2, 0.8, 0.3, 0.1, 0.1, 0.4, 0.8, 0.9, 0.9, 0.4, 0.9, 0.8, 0.2, 0.6, 0.5, 0.3, 0.4, 0.6, 0.1, 0.9, 0.1, 0.3, 0.5, 0.3, 0.3, 0.5, 0.7, 0.4, 0.4, 0.1, 0.6, 0.2, 0.8, 0.8, 0.1, 0.2, 0.4, 0.8, 0.6, 0.4, 0.4, 0.2, 0.5, 0.9, 0.8, 0.4, 0.9, 0.4, 0.2, 0.9, 0.9, 0.7, 0.8, 0.8, 0.6, 0.4, 0.2, 0.1, 0.3, 0.8, 0.9, 0.1, 0.9, 0.9, 0.1, 0.5, 0.2, 0.1, 0.3, 0.8, 0.3, 0.8, 0.2, 0.7, 0.9, 0.3, 0.6, 0.3, 0.8, 0.8, 0.4, 0.5, 0.8, 0.9, 0.1, 0.6, 0.1, 0.2, 0.7, 0.2, 0.1, 0.3, 0.2, 0.3, 0.3, 0.9, 0.8, 0.6, 0.1, 0.4, 0.9, 0.3, 0.2, 0.6, 0.5, 0.2, 0.9, 0.1, 0.5, 0.1, 0.7, 0.8, 0.4, 0.1, 0.6, 0.9, 0.1, 0.2, 0.9, 0.8, 0.7, 0.9, 0.6, 0.5, 0.2, 0.7, 0.4, 0.6, 0.2, 0.9, 0.1, 0.3, 0.2, 0.7, 0.2, 0.8, 0.6, 0.5, 0.6, 0.7, 0.6, 0.4, 0.8, 0.3, 0.3, 0.5, 0.9, 0.5, 0.5, 0.7, 0.9, 0.1, 0.9, 0.7, 0.4, 0.4, 0.6, 0.9, 0.2, 0.7, 0.9, 0.8, 0.5, 0.6, 0.8, 0.9, 0.1, 0.5, 0.1, 0.1, 0.8, 0.7, 0.2, 0.6, 0.4, 0.9, 0.3, 0.4, 0.6, 0.2, 0.8, 0.3, 0.1, 0.2, 0.9, 0.1, 0.1, 0.5, 
+
+L2_dSYR2_A_nn_pu
+0.6, 0.4, 0.2, 0.3, 0.2, 0.3, 0.9, 0.5, 0.2, 0.7, 0.4, 0.6, 0.3, 0.7, 0.5, 0.4, 0.4, 0.3, 0.3, 0.4, 0.7, 0.9, 0.8, 0.1, 0.3, 0.6, 0.3, 0.4, 0.1, 0.8, 0.3, 0.9, 0.7, 0.6, 0.7, 0.7, 0.6, 0.1, 0.4, 0.9, 0.8, 0.4, 0.4, 0.8, 0.3, 0.1, 0.9, 0.3, 0.6, 0.9, 0.6, 0.9, 0.8, 0.3, 0.2, 0.9, 0.6, 0.3, 0.4, 0.9, 0.2, 0.1, 0.3, 0.5, 0.2, 0.2, 0.2, 0.4, 0.5, 0.5, 0.5, 0.8, 0.1, 0.5, 0.6, 0.8, 0.7, 0.2, 0.3, 0.9, 0.7, 0.1, 0.7, 0.8, 0.6, 0.6, 0.2, 0.9, 0.9, 0.4, 0.9, 0.8, 0.2, 0.6, 0.5, 0.3, 0.4, 0.6, 0.5, 0.7, 0.4, 0.4, 0.1, 0.6, 0.2, 0.8, 0.8, 0.1, 0.9, 0.8, 0.4, 0.9, 0.4, 0.2, 0.9, 0.9, 0.7, 0.1, 0.9, 0.9, 0.1, 0.5, 0.2, 0.1, 0.3, 0.8, 0.4, 0.5, 0.8, 0.9, 0.1, 0.6, 0.6, 0.1, 0.4, 0.9, 0.3, 0.2, 0.9, 0.1, 0.2, 0.9, 0.8, 0.7, 0.2, 0.8, 0.6, 0.1, 0.9, 0.7, 0.1, 0.8, 0.5, 
+
+L2_dSYR2_x_n1
+0.6, 0.7, 0.1, 0.8, 0.8, 0.7, 0.3, 0.4, 0.4, 0.7, 0.1, 0.7, 0.1, 0.3, 0.4, 0.9, 0.3, 
+
+L2_dSYR2_x_n2
+0.6, 0.0, 0.7, 0.0, 0.1, 0.0, 0.8, 0.0, 0.8, 0.0, 0.7, 0.0, 0.3, 0.0, 0.4, 0.0, 0.4, 0.0, 0.7, 0.0, 0.1, 0.0, 0.7, 0.0, 0.1, 0.0, 0.3, 0.0, 0.4, 0.0, 0.9, 0.0, 0.3, 0.0, 
+
+L2_dSYR2_y_n1
+0.9, 0.4, 0.8, 0.5, 0.6, 0.7, 0.6, 0.2, 0.9, 0.4, 0.3, 0.1, 0.5, 0.1, 0.7, 0.7, 0.9, 
+
+L2_dSYR2_y_n2
+0.9, 0.0, 0.0, 0.4, 0.0, 0.0, 0.8, 0.0, 0.0, 0.5, 0.0, 0.0, 0.6, 0.0, 0.0, 0.7, 0.0, 0.0, 0.6, 0.0, 0.0, 0.2, 0.0, 0.0, 0.9, 0.0, 0.0, 0.4, 0.0, 0.0, 0.3, 0.0, 0.0, 0.1, 0.0, 0.0, 0.5, 0.0, 0.0, 0.1, 0.0, 0.0, 0.7, 0.0, 0.0, 0.7, 0.0, 0.0, 0.9, 0.0, 0.0, 
+
+L2_dSYR2_o_N
+1.68, 1.27, 0.77, 1.32, 1.28, 1.35, 1.53, 0.98, 1.1, 1.57, 0.67, 1.29, 0.69, 1.03, 1.28, 1.63, 1.21, 1.07, 0.86, 0.9, 1.07, 1.44, 1.67, 1.34, 0.4, 1.09, 1.16, 0.55, 0.75, 0.49, 0.99, 0.95, 1.75, 1.45, 0.67, 0.8, 0.76, 1.39, 1.4, 1.23, 0.4, 0.74, 1.31, 1.4, 0.51, 0.97, 0.93, 0.55, 0.49, 1.69, 0.63, 1.62, 0.97, 1.09, 1.4, 1.78, 1.51, 1.53, 1.16, 1.22, 0.87, 1.19, 1.03, 0.75, 0.63, 1.66, 1.21, 0.97, 1.58, 1.34, 0.8, 1.28, 1.26, 1.48, 0.86, 0.6, 1.16, 1.14, 0.8, 1.0, 0.96, 1.06, 0.9, 1.6, 1.5, 1.15, 0.87, 0.73, 1.41, 1.78, 1.78, 1.33, 0.62, 1.21, 1.67, 0.98, 0.66, 1.12, 1.08, 1.37, 1.72, 1.04, 1.43, 0.84, 0.4, 0.73, 1.06, 1.43, 1.26, 1.2, 0.91, 1.44, 0.95, 0.65, 0.81, 0.71, 0.75, 1.15, 1.05, 0.58, 1.2, 0.44, 0.66, 0.9, 0.72, 0.6, 0.66, 1.14, 0.7, 0.54, 0.28, 0.82, 0.3, 1.16, 1.26, 0.52, 1.1, 1.19, 1.21, 1.52, 1.36, 1.31, 0.71, 0.94, 1.62, 1.59, 0.61, 1.57, 0.69, 0.51, 1.54, 1.99, 1.33, 1.67, 1.36, 1.2, 1.07, 0.94, 0.87, 0.84, 1.1, 1.69, 0.66, 1.15, 1.25, 0.49, 0.69, 0.85, 0.95, 1.05, 1.07, 0.55, 0.91, 0.49, 1.0, 1.18, 0.45, 0.74, 0.51, 1.05, 0.86, 0.62, 0.58, 0.9, 1.09, 0.44, 0.78, 0.79, 0.55, 1.27, 0.63, 0.6, 0.86, 0.65, 0.48, 0.97, 1.25, 1.02, 0.74, 0.46, 0.5, 1.43, 0.88, 0.86, 0.99, 0.89, 0.33, 1.35, 0.56, 0.92, 0.31, 0.92, 1.09, 0.79, 0.18, 0.96, 1.0, 0.26, 0.47, 1.42, 1.04, 1.03, 1.09, 0.85, 0.73, 0.46, 0.98, 0.61, 0.7, 0.51, 1.09, 0.2, 0.4, 0.36, 0.76, 0.45, 1.1, 0.9, 1.28, 1.25, 1.09, 1.36, 1.2, 1.57, 0.75, 0.66, 1.14, 1.55, 0.69, 1.03, 0.97, 1.15, 0.66, 1.81, 1.27, 1.63, 1.25, 1.39, 1.91, 1.3, 1.82, 1.65, 1.26, 1.59, 1.45, 1.14, 1.48, 0.62, 0.8, 1.01, 1.36, 1.82, 1.51, 0.95, 0.93, 1.27, 1.8, 1.14, 0.85, 1.02, 0.83, 1.55, 0.48, 0.76, 0.44, 1.2, 0.67, 1.12, 1.04, 
+
+L2_dSYR2_o_N_pu
+1.68, 1.27, 0.77, 1.32, 1.28, 1.35, 1.53, 0.98, 1.1, 1.57, 0.67, 1.29, 0.69, 1.03, 1.28, 1.63, 1.21, 0.86, 0.9, 1.07, 1.44, 1.67, 1.34, 0.4, 1.09, 1.16, 0.55, 0.75, 0.49, 0.99, 0.95, 1.75, 1.45, 0.76, 1.39, 1.4, 1.23, 0.4, 0.74, 1.31, 1.4, 0.51, 0.97, 0.93, 0.55, 0.49, 1.69, 0.63, 1.4, 1.78, 1.51, 1.53, 1.16, 1.22, 0.87, 1.19, 1.03, 0.75, 0.63, 1.66, 1.21, 0.97, 1.26, 1.48, 0.86, 0.6, 1.16, 1.14, 0.8, 1.0, 0.96, 1.06, 0.9, 1.6, 1.5, 1.78, 1.33, 0.62, 1.21, 1.67, 0.98, 0.66, 1.12, 1.08, 1.37, 1.72, 1.04, 1.26, 1.2, 0.91, 1.44, 0.95, 0.65, 0.81, 0.71, 0.75, 1.15, 1.05, 0.66, 1.14, 0.7, 0.54, 0.28, 0.82, 0.3, 1.16, 1.26, 0.52, 1.62, 1.59, 0.61, 1.57, 0.69, 0.51, 1.54, 1.99, 1.33, 0.66, 1.15, 1.25, 0.49, 0.69, 0.85, 0.95, 1.05, 0.86, 0.62, 0.58, 0.9, 1.09, 0.44, 0.78, 0.74, 0.46, 0.5, 1.43, 0.88, 0.86, 1.0, 0.26, 0.47, 1.42, 1.04, 0.76, 0.45, 1.1, 0.9, 0.66, 1.81, 1.27, 1.36, 1.82, 1.04, 
+
+L3_sGEMM_A_mk
+0.4, 0.5, 0.6, 0.8, 0.9, 0.8, 0.2, 0.9, 0.6, 0.1, 0.1, 0.4, 0.5, 0.6, 0.1, 0.9, 0.9, 0.4, 0.7, 0.6, 0.5, 0.1, 0.8, 0.2, 0.9, 0.9, 0.5, 0.1, 0.4, 0.8, 0.6, 0.6, 0.5, 0.1, 0.1, 0.5, 0.7, 0.2, 0.6, 0.3, 0.2, 0.2, 0.1, 0.2, 0.3, 0.1, 0.4, 0.8, 0.2, 0.4, 0.3, 0.8, 0.3, 0.6, 0.8, 0.5, 0.6, 0.2, 0.5, 0.1, 0.5, 0.5, 0.2, 0.7, 0.8, 0.5, 0.4, 0.8, 0.6, 0.5, 0.7, 0.7, 0.5, 0.2, 0.6, 0.5, 0.6, 0.7, 0.7, 0.8, 0.9, 0.9, 0.4, 0.7, 0.3, 0.4, 0.2, 0.3, 0.4, 0.1, 0.4, 0.6, 0.7, 0.4, 0.9, 0.8, 0.3, 0.1, 0.5, 0.6, 0.4, 0.2, 0.3, 0.6, 0.8, 0.8, 0.5, 0.9, 0.2, 0.7, 0.2, 0.9, 0.9, 0.1, 0.9, 0.5, 0.1, 0.9, 0.6, 0.6, 0.7, 0.6, 0.7, 0.9, 0.9, 0.7, 0.9, 0.7, 0.2, 0.4, 0.4, 0.9, 0.3, 0.3, 0.8, 0.9, 0.9, 0.4, 0.6, 0.9, 0.6, 0.2, 0.3, 0.9, 0.6, 0.6, 0.3, 0.4, 0.1, 0.7, 0.5, 0.5, 0.4, 0.3, 0.6, 0.7, 0.3, 0.3, 0.3, 0.6, 
+
+L3_sGEMM_B_kn
+0.2, 0.4, 0.6, 0.5, 0.1, 0.9, 0.1, 0.6, 0.9, 0.1, 0.2, 0.3, 0.6, 0.9, 0.1, 0.1, 0.8, 0.9, 0.4, 0.1, 0.2, 0.8, 0.6, 0.3, 0.3, 0.8, 0.5, 0.1, 0.4, 0.6, 0.9, 0.6, 0.8, 0.2, 0.2, 0.2, 0.8, 0.5, 0.2, 0.3, 0.7, 0.5, 0.2, 0.8, 0.4, 0.4, 0.1, 0.4, 0.4, 0.6, 0.6, 0.1, 0.2, 0.8, 0.5, 0.3, 0.2, 0.8, 0.2, 0.3, 0.1, 0.4, 0.2, 0.7, 0.1, 0.1, 0.5, 0.4, 0.4, 0.8, 0.9, 0.3, 0.3, 0.4, 0.4, 0.5, 0.8, 0.4, 0.1, 0.4, 0.3, 0.8, 0.2, 0.7, 0.4, 0.8, 0.4, 0.5, 0.9, 0.9, 0.4, 0.5, 0.8, 0.5, 0.4, 0.1, 0.2, 0.1, 0.5, 0.5, 0.6, 0.7, 0.1, 0.3, 0.9, 0.8, 0.7, 0.4, 0.1, 0.2, 0.3, 0.6, 0.5, 0.1, 0.2, 0.4, 0.2, 0.9, 0.1, 0.7, 0.8, 0.7, 0.6, 0.4, 0.5, 0.8, 0.1, 0.4, 0.4, 0.9, 0.4, 0.5, 0.9, 0.4, 0.6, 0.1, 0.5, 0.9, 0.1, 0.7, 0.3, 0.8, 0.4, 0.5, 0.3, 0.6, 0.3, 0.3, 0.8, 0.1, 0.6, 0.7, 0.4, 0.4, 0.2, 0.2, 0.4, 0.3, 0.1, 0.6, 0.1, 0.2, 0.4, 0.2, 0.1, 0.1, 0.7, 0.4, 0.8, 0.8, 0.3, 0.2, 0.3, 0.2, 0.3, 0.8, 0.9, 0.2, 0.2, 0.2, 0.7, 0.8, 0.3, 0.2, 0.7, 0.2, 0.8, 0.9, 0.8, 0.4, 0.2, 0.7, 0.4, 0.6, 0.7, 0.5, 0.9, 0.9, 0.9, 0.8, 0.4, 0.6, 0.4, 0.3, 0.9, 0.8, 0.8, 0.1, 0.5, 0.4, 0.3, 0.1, 0.4, 0.2, 0.3, 0.7, 0.1, 0.8, 0.2, 0.5, 0.8, 0.7, 0.9, 0.2, 0.9, 0.6, 0.5, 0.1, 0.9, 0.3, 0.4, 0.5, 0.9, 0.5, 0.4, 0.3, 0.6, 0.8, 0.4, 0.4, 0.2, 0.1, 0.4, 0.3, 0.5, 0.3, 0.1, 0.7, 0.5, 0.5, 0.8, 0.7, 0.5, 0.7, 0.8, 0.1, 0.9, 0.9, 0.8, 0.4, 0.5, 0.1, 0.1, 0.9, 0.9, 0.2, 0.5, 0.7, 0.1, 0.6, 0.8, 0.7, 
+
+L3_sGEMM_C_mn
+0.6, 0.6, 0.7, 0.2, 0.5, 0.3, 0.4, 0.8, 0.7, 0.4, 0.1, 0.8, 0.9, 0.1, 0.1, 0.6, 0.7, 0.4, 0.5, 0.6, 0.3, 0.7, 0.6, 0.5, 0.7, 0.3, 0.7, 0.9, 0.9, 0.2, 0.3, 0.6, 0.9, 0.8, 0.5, 0.1, 0.5, 0.1, 0.9, 0.1, 0.1, 0.5, 0.6, 0.2, 0.6, 0.7, 0.4, 0.1, 0.5, 0.1, 0.3, 0.1, 0.6, 0.7, 0.2, 0.9, 0.8, 0.4, 0.8, 0.7, 0.7, 0.2, 0.3, 0.1, 0.6, 0.3, 0.6, 0.3, 0.3, 0.4, 0.9, 0.4, 0.2, 0.4, 0.8, 0.9, 0.9, 0.1, 0.9, 0.5, 0.6, 0.7, 0.5, 0.2, 0.2, 0.6, 0.9, 0.9, 0.1, 0.7, 0.8, 0.2, 0.3, 0.9, 0.5, 0.5, 0.6, 0.4, 0.9, 0.5, 0.9, 0.1, 0.1, 0.6, 0.1, 0.4, 0.8, 0.1, 0.9, 0.4, 0.9, 0.8, 0.3, 0.5, 0.3, 0.5, 0.7, 0.7, 0.5, 0.9, 0.5, 0.1, 0.1, 0.7, 0.4, 0.8, 0.6, 0.1, 0.9, 0.9, 0.1, 0.1, 0.2, 0.3, 0.8, 0.3, 0.4, 0.5, 0.3, 0.3, 0.2, 0.7, 0.3, 0.6, 0.5, 0.9, 0.9, 0.8, 0.3, 0.3, 0.9, 0.4, 0.1, 0.8, 0.6, 0.4, 0.8, 0.6, 0.2, 0.9, 0.5, 0.5, 0.7, 0.6, 0.7, 0.2, 0.6, 0.9, 0.2, 0.5, 
+
+L3_sGEMM_o_NN
+4.71000001967, 5.75000002831, 5.74999996126, 4.77000004604, 4.3200000602, 4.22000007287, 4.13000007316, 4.1900000757, 4.9799999994, 4.41000004128, 3.18000001431, 4.44000003919, 4.80000002384, 4.34999998435, 3.32000009745, 5.71000010684, 4.94000006303, 3.91000000998, 5.11000001222, 5.18000006944, 4.89000003174, 4.23000008509, 4.93000005528, 4.14000004441, 4.05000000894, 4.12000004679, 4.86000005692, 4.11000001818, 4.56000002116, 4.27000008702, 4.73999998778, 3.95000010431, 6.35000003353, 6.00000009388, 2.44000002801, 3.13000004932, 4.00000002012, 2.80000007078, 3.11000003606, 2.52000004679, 2.12000005424, 2.24000003472, 3.39000004962, 2.77000004753, 2.46000006363, 2.77000002518, 2.95000005588, 2.80000002682, 2.34000006974, 3.40000005439, 3.07000006542, 3.24000003695, 4.50000006557, 4.84000002205, 4.20000006631, 4.30000005588, 4.20000009835, 3.53000008285, 3.31000007927, 3.8500000529, 3.98000006422, 2.96000003606, 3.26000004724, 3.2900000608, 3.80000006333, 3.10000010431, 5.08000011861, 3.99000008762, 4.62000000879, 5.73000005007, 6.25000003129, 5.16000003234, 4.4600000599, 5.07000008404, 4.9100000897, 4.52000001773, 5.36000004277, 4.5300000307, 4.77999997854, 4.85000004247, 5.23000009254, 5.58999999449, 4.17000009447, 5.77000006616, 5.38000011563, 4.65999999061, 5.48000001132, 5.23000001207, 3.7500000298, 4.47000003189, 4.96000004649, 3.70000005588, 3.4800000605, 5.06999997601, 4.50000001341, 3.63000002325, 4.56000004053, 4.81000005618, 5.39999991208, 3.89000008762, 5.65000002012, 4.87000004157, 3.69999999031, 5.33000001132, 4.2200000304, 4.57000004381, 4.1600000681, 3.78000005752, 4.6700000684, 3.4700000006, 4.35000000149, 4.98000000983, 3.81000001222, 4.26999997899, 4.2600000532, 3.97000003487, 4.11000007108, 5.48000007167, 4.8300000672, 5.97999988243, 6.22999993831, 5.69999997914, 5.36999995515, 5.43999996394, 5.44999997765, 5.65000000894, 4.90999996901, 4.47999995396, 6.13999992892, 5.42999992862, 5.0899999103, 4.87999999046, 5.50999993473, 4.64000003248, 6.80000003725, 6.64999998808, 4.52999997556, 5.63999997735, 5.36999999389, 4.75000002012, 4.27000004232, 4.91000003904, 4.63000005975, 3.52000003636, 4.40000001714, 5.45999996975, 4.95999993771, 4.78000002027, 4.74999999627, 4.32000002816, 4.67000005499, 5.86000003457, 4.38000008211, 4.35000003949, 4.40000010431, 4.08000008062, 4.40000007674, 4.10000008568, 3.81000012025, 4.14000006378, 3.32000006318, 3.91000008151, 4.20000005364, 3.58000005081, 3.94000006229, 3.61000011876, 4.20000007302, 4.01000009865, 4.3000001289, 4.3000001356, 
+
+L3_sGEMM_A_km
+0.3, 0.6, 0.6, 0.1, 0.7, 0.5, 0.6, 0.8, 0.3, 0.3, 0.5, 0.3, 0.5, 0.6, 0.1, 0.7, 0.6, 0.6, 0.8, 0.2, 0.6, 0.3, 0.3, 0.3, 0.7, 0.4, 0.6, 0.4, 0.2, 0.9, 0.3, 0.2, 0.5, 0.3, 0.8, 0.4, 0.8, 0.7, 0.2, 0.1, 0.6, 0.2, 0.5, 0.5, 0.3, 0.2, 0.9, 0.5, 0.9, 0.4, 0.5, 0.7, 0.7, 0.4, 0.3, 0.4, 0.1, 0.9, 0.1, 0.9, 0.5, 0.4, 0.8, 0.1, 0.9, 0.9, 0.9, 0.6, 0.7, 0.8, 0.3, 0.6, 0.5, 0.4, 0.3, 0.8, 0.2, 0.1, 0.7, 0.6, 0.8, 0.2, 0.9, 0.2, 0.3, 0.5, 0.1, 0.9, 0.2, 0.7, 0.3, 0.7, 0.9, 0.1, 0.8, 0.7, 0.8, 0.8, 0.5, 0.2, 0.8, 0.5, 0.9, 0.8, 0.6, 0.2, 0.7, 0.7, 0.4, 0.9, 0.5, 0.9, 0.5, 0.2, 0.4, 0.7, 0.8, 0.7, 0.9, 0.8, 0.4, 0.2, 0.6, 0.6, 0.5, 0.7, 0.4, 0.2, 0.1, 0.5, 0.5, 0.3, 0.1, 0.1, 0.9, 0.3, 0.4, 0.3, 0.2, 0.4, 0.6, 0.4, 0.5, 0.7, 0.1, 0.1, 0.2, 0.5, 0.8, 0.5, 0.5, 0.9, 0.8, 0.1, 0.6, 0.7, 0.3, 0.7, 0.9, 0.6, 
+
+L3_sGEMM_B_nk
+0.8, 0.8, 0.1, 0.1, 0.7, 0.3, 0.4, 0.8, 0.7, 0.1, 0.2, 0.6, 0.5, 0.7, 0.5, 0.6, 0.2, 0.4, 0.6, 0.3, 0.5, 0.2, 0.6, 0.1, 0.8, 0.8, 0.2, 0.5, 0.7, 0.9, 0.6, 0.5, 0.1, 0.9, 0.9, 0.3, 0.9, 0.2, 0.3, 0.2, 0.2, 0.2, 0.4, 0.9, 0.6, 0.9, 0.8, 0.7, 0.1, 0.5, 0.4, 0.6, 0.7, 0.7, 0.9, 0.9, 0.7, 0.4, 0.5, 0.2, 0.3, 0.6, 0.5, 0.6, 0.2, 0.5, 0.3, 0.5, 0.7, 0.4, 0.9, 0.6, 0.8, 0.1, 0.3, 0.4, 0.3, 0.3, 0.5, 0.4, 0.3, 0.6, 0.9, 0.7, 0.9, 0.9, 0.5, 0.3, 0.1, 0.6, 0.7, 0.8, 0.6, 0.6, 0.5, 0.8, 0.6, 0.6, 0.7, 0.6, 0.3, 0.6, 0.3, 0.1, 0.1, 0.1, 0.5, 0.8, 0.1, 0.1, 0.7, 0.3, 0.7, 0.6, 0.3, 0.9, 0.2, 0.9, 0.4, 0.5, 0.2, 0.8, 0.3, 0.5, 0.9, 0.6, 0.2, 0.8, 0.9, 0.8, 0.9, 0.2, 0.8, 0.6, 0.6, 0.1, 0.6, 0.4, 0.5, 0.5, 0.7, 0.4, 0.1, 0.7, 0.5, 0.5, 0.9, 0.2, 0.3, 0.3, 0.1, 0.5, 0.2, 0.7, 0.1, 0.4, 0.9, 0.4, 0.4, 0.8, 0.2, 0.9, 0.5, 0.8, 0.6, 0.3, 0.7, 0.1, 0.9, 0.2, 0.9, 0.1, 0.8, 0.6, 0.1, 0.2, 0.4, 0.3, 0.7, 0.1, 0.7, 0.3, 0.2, 0.4, 0.6, 0.3, 0.1, 0.3, 0.8, 0.3, 0.7, 0.5, 0.8, 0.7, 0.3, 0.9, 0.6, 0.4, 0.3, 0.3, 0.6, 0.4, 0.5, 0.2, 0.7, 0.2, 0.1, 0.2, 0.8, 0.9, 0.3, 0.3, 0.1, 0.4, 0.3, 0.9, 0.8, 0.3, 0.6, 0.6, 0.4, 0.3, 0.7, 0.7, 0.7, 0.6, 0.7, 0.7, 0.4, 0.3, 0.9, 0.8, 0.3, 0.8, 0.7, 0.5, 0.3, 0.1, 0.7, 0.8, 0.3, 0.4, 0.7, 0.7, 0.2, 0.8, 0.6, 0.4, 0.8, 0.2, 0.6, 0.3, 0.9, 0.7, 0.2, 0.3, 0.5, 0.4, 0.6, 0.7, 0.1, 0.9, 0.4, 0.8, 0.8, 0.9, 0.9, 0.5, 0.7, 0.1, 0.4, 0.2, 
+
+L3_sGEMM_o_TT
+4.54000011742, 4.67000014588, 5.1700000371, 4.5900000824, 4.27000010267, 5.23000010967, 3.71000012323, 4.75000010133, 5.2200000982, 3.78000008211, 4.37000006169, 4.25000012591, 4.38000009179, 4.33000011861, 4.60000010058, 4.7700001362, 5.12000006691, 4.06000010759, 3.8900000459, 4.35000000149, 4.110000045, 3.75000004843, 5.29000005484, 3.69000007421, 5.06000000775, 4.30000004172, 4.19000001386, 3.69000001386, 3.76000003681, 3.11000007182, 4.450000076, 5.19000006154, 4.24000005633, 5.03000000611, 5.04000006825, 4.75000006557, 4.94000001535, 5.34999998212, 5.32000000954, 5.80000003353, 3.82000009075, 5.82000002444, 5.93000008583, 4.33000003591, 5.43999999449, 4.58000006273, 4.84000006005, 5.30000005215, 6.36000002116, 4.92000007138, 6.1099999474, 2.76000006512, 3.04000009805, 3.89000003621, 3.16000004724, 3.39000004441, 4.30000007749, 2.85000007898, 3.5700000833, 3.60000006929, 3.07000003934, 3.25000007004, 2.75000006557, 2.70000007451, 3.62000008777, 3.44000007421, 3.43000011042, 3.55000005886, 3.93000006497, 4.74000005558, 5.01999997228, 4.79000007346, 3.69000005484, 5.56000008076, 3.94000010028, 5.7900000295, 5.53000000313, 3.88000001431, 5.13000002027, 3.62000006169, 4.36000008747, 4.53000010297, 5.50000002235, 4.62000004977, 4.77000003636, 4.81000006586, 4.95999999434, 4.95999993548, 4.57999998599, 4.50000000149, 5.62000004977, 3.25000006631, 5.1700000006, 5.50999996901, 4.44999997094, 4.42999997333, 3.9000000678, 4.08000002474, 5.41999998495, 5.54999999106, 5.05000000745, 4.78999998108, 3.91000008076, 4.76000011653, 4.77000000954, 4.71000003159, 4.55000002831, 5.5900000675, 4.5300001052, 4.9600000979, 5.76000004649, 4.40000007823, 4.72000004381, 3.68000006497, 4.34000008613, 4.37000012949, 5.92000002444, 4.65000006706, 4.9500000298, 5.32000003561, 5.06000007629, 4.64999998659, 5.02000000581, 4.91000001371, 6.17000001252, 4.91000009865, 5.87000003114, 5.47000005201, 4.78000000536, 5.55999996901, 3.74000005484, 4.52000004679, 5.20000006109, 5.83000003591, 5.48000006348, 5.7799999547, 4.76000003532, 4.29000003397, 5.08999992594, 4.69999997094, 4.07999998748, 5.66999998495, 3.68000006944, 4.53000005007, 4.73000000387, 4.38999998108, 4.25999997273, 4.13000001505, 3.41000005469, 4.7300000076, 5.96999996483, 3.48000006124, 3.86000000402, 4.96000010386, 4.84000008985, 5.08999998927, 5.70000001118, 4.73000008658, 5.76999999613, 4.65000002086, 4.9400000377, 5.49000002727, 4.5300000076, 4.86999999389, 4.45000003502, 3.67000006318, 5.23000010595, 5.98000000164, 4.98000004187, 5.64999997392, 
+
+L3_sGEMM_o_HH
+4.54000011742, 4.67000014588, 5.1700000371, 4.5900000824, 4.27000010267, 5.23000010967, 3.71000012323, 4.75000010133, 5.2200000982, 3.78000008211, 4.37000006169, 4.25000012591, 4.38000009179, 4.33000011861, 4.60000010058, 4.7700001362, 5.12000006691, 4.06000010759, 3.8900000459, 4.35000000149, 4.110000045, 3.75000004843, 5.29000005484, 3.69000007421, 5.06000000775, 4.30000004172, 4.19000001386, 3.69000001386, 3.76000003681, 3.11000007182, 4.450000076, 5.19000006154, 4.24000005633, 5.03000000611, 5.04000006825, 4.75000006557, 4.94000001535, 5.34999998212, 5.32000000954, 5.80000003353, 3.82000009075, 5.82000002444, 5.93000008583, 4.33000003591, 5.43999999449, 4.58000006273, 4.84000006005, 5.30000005215, 6.36000002116, 4.92000007138, 6.1099999474, 2.76000006512, 3.04000009805, 3.89000003621, 3.16000004724, 3.39000004441, 4.30000007749, 2.85000007898, 3.5700000833, 3.60000006929, 3.07000003934, 3.25000007004, 2.75000006557, 2.70000007451, 3.62000008777, 3.44000007421, 3.43000011042, 3.55000005886, 3.93000006497, 4.74000005558, 5.01999997228, 4.79000007346, 3.69000005484, 5.56000008076, 3.94000010028, 5.7900000295, 5.53000000313, 3.88000001431, 5.13000002027, 3.62000006169, 4.36000008747, 4.53000010297, 5.50000002235, 4.62000004977, 4.77000003636, 4.81000006586, 4.95999999434, 4.95999993548, 4.57999998599, 4.50000000149, 5.62000004977, 3.25000006631, 5.1700000006, 5.50999996901, 4.44999997094, 4.42999997333, 3.9000000678, 4.08000002474, 5.41999998495, 5.54999999106, 5.05000000745, 4.78999998108, 3.91000008076, 4.76000011653, 4.77000000954, 4.71000003159, 4.55000002831, 5.5900000675, 4.5300001052, 4.9600000979, 5.76000004649, 4.40000007823, 4.72000004381, 3.68000006497, 4.34000008613, 4.37000012949, 5.92000002444, 4.65000006706, 4.9500000298, 5.32000003561, 5.06000007629, 4.64999998659, 5.02000000581, 4.91000001371, 6.17000001252, 4.91000009865, 5.87000003114, 5.47000005201, 4.78000000536, 5.55999996901, 3.74000005484, 4.52000004679, 5.20000006109, 5.83000003591, 5.48000006348, 5.7799999547, 4.76000003532, 4.29000003397, 5.08999992594, 4.69999997094, 4.07999998748, 5.66999998495, 3.68000006944, 4.53000005007, 4.73000000387, 4.38999998108, 4.25999997273, 4.13000001505, 3.41000005469, 4.7300000076, 5.96999996483, 3.48000006124, 3.86000000402, 4.96000010386, 4.84000008985, 5.08999998927, 5.70000001118, 4.73000008658, 5.76999999613, 4.65000002086, 4.9400000377, 5.49000002727, 4.5300000076, 4.86999999389, 4.45000003502, 3.67000006318, 5.23000010595, 5.98000000164, 4.98000004187, 5.64999997392, 
+
+L3_dGEMM_A_mk
+0.1, 0.2, 0.2, 0.9, 0.5, 0.1, 0.4, 0.1, 0.3, 0.2, 0.6, 0.5, 0.6, 0.4, 0.7, 0.9, 0.4, 0.9, 0.6, 0.8, 0.9, 0.7, 0.9, 0.5, 0.3, 0.1, 0.5, 0.6, 0.1, 0.8, 0.8, 0.3, 0.3, 0.2, 0.6, 0.6, 0.8, 0.6, 0.3, 0.2, 0.1, 0.1, 0.8, 0.7, 0.6, 0.3, 0.2, 0.2, 0.3, 0.6, 0.5, 0.8, 0.5, 0.5, 0.8, 0.7, 0.6, 0.3, 0.5, 0.2, 0.6, 0.8, 0.4, 0.1, 0.9, 0.4, 0.2, 0.2, 0.7, 0.2, 0.1, 0.1, 0.5, 0.6, 0.1, 0.6, 0.1, 0.5, 0.5, 0.6, 0.2, 0.8, 0.3, 0.1, 0.8, 0.3, 0.7, 0.4, 0.3, 0.4, 0.9, 0.2, 0.7, 0.8, 0.5, 0.8, 0.1, 0.7, 0.9, 0.5, 0.3, 0.3, 0.7, 0.8, 0.1, 0.7, 0.2, 0.5, 0.3, 0.6, 0.2, 0.7, 0.5, 0.4, 0.9, 0.1, 0.6, 0.5, 0.9, 0.7, 0.2, 0.7, 0.4, 0.1, 0.7, 0.9, 0.5, 0.6, 0.3, 0.4, 0.4, 0.8, 0.1, 0.5, 0.1, 0.8, 0.6, 0.2, 0.7, 0.7, 0.6, 0.2, 0.2, 0.2, 0.6, 0.3, 0.8, 0.9, 0.6, 0.8, 0.7, 0.9, 0.6, 0.5, 0.8, 0.6, 0.7, 0.8, 0.9, 0.6, 
+
+L3_dGEMM_B_kn
+0.7, 0.1, 0.3, 0.8, 0.9, 0.7, 0.3, 0.6, 0.8, 0.9, 0.5, 0.6, 0.6, 0.4, 0.2, 0.1, 0.4, 0.6, 0.7, 0.8, 0.8, 0.1, 0.9, 0.8, 0.7, 0.4, 0.8, 0.9, 0.8, 0.9, 0.5, 0.5, 0.4, 0.1, 0.7, 0.4, 0.5, 0.2, 0.5, 0.9, 0.8, 0.5, 0.5, 0.7, 0.5, 0.1, 0.5, 0.9, 0.4, 0.7, 0.8, 0.8, 0.1, 0.7, 0.6, 0.9, 0.5, 0.4, 0.2, 0.3, 0.4, 0.2, 0.7, 0.2, 0.9, 0.3, 0.6, 0.3, 0.9, 0.9, 0.8, 0.3, 0.1, 0.5, 0.2, 0.7, 0.6, 0.8, 0.2, 0.6, 0.4, 0.3, 0.1, 0.4, 0.1, 0.7, 0.8, 0.4, 0.2, 0.4, 0.6, 0.8, 0.3, 0.7, 0.4, 0.3, 0.1, 0.6, 0.5, 0.6, 0.3, 0.3, 0.6, 0.4, 0.8, 0.5, 0.1, 0.6, 0.4, 0.1, 0.7, 0.5, 0.2, 0.1, 0.7, 0.5, 0.9, 0.7, 0.9, 0.7, 0.2, 0.1, 0.3, 0.5, 0.6, 0.4, 0.4, 0.6, 0.7, 0.8, 0.3, 0.3, 0.1, 0.4, 0.1, 0.7, 0.2, 0.8, 0.6, 0.9, 0.4, 0.6, 0.7, 0.6, 0.8, 0.2, 0.2, 0.9, 0.5, 0.3, 0.6, 0.6, 0.1, 0.5, 0.2, 0.2, 0.8, 0.9, 0.3, 0.6, 0.8, 0.2, 0.1, 0.7, 0.4, 0.1, 0.5, 0.7, 0.4, 0.7, 0.8, 0.3, 0.4, 0.9, 0.9, 0.5, 0.6, 0.9, 0.6, 0.6, 0.4, 0.7, 0.4, 0.9, 0.3, 0.5, 0.2, 0.4, 0.3, 0.1, 0.7, 0.6, 0.8, 0.6, 0.5, 0.5, 0.7, 0.3, 0.1, 0.1, 0.9, 0.9, 0.8, 0.8, 0.3, 0.1, 0.8, 0.8, 0.7, 0.3, 0.3, 0.8, 0.3, 0.5, 0.3, 0.1, 0.7, 0.7, 0.9, 0.2, 0.9, 0.1, 0.2, 0.2, 0.2, 0.7, 0.9, 0.6, 0.4, 0.4, 0.2, 0.6, 0.4, 0.2, 0.6, 0.3, 0.7, 0.4, 0.8, 0.4, 0.7, 0.1, 0.6, 0.6, 0.2, 0.2, 0.4, 0.4, 0.3, 0.9, 0.7, 0.2, 0.3, 0.8, 0.6, 0.6, 0.7, 0.6, 0.1, 0.9, 0.4, 0.8, 0.3, 0.7, 0.2, 0.3, 0.1, 0.7, 0.5, 0.6, 0.2, 0.4, 
+
+L3_dGEMM_C_mn
+0.4, 0.4, 0.4, 0.3, 0.8, 0.4, 0.2, 0.3, 0.8, 0.7, 0.6, 0.7, 0.6, 0.9, 0.4, 0.3, 0.8, 0.4, 0.5, 0.9, 0.5, 0.1, 0.2, 0.5, 0.3, 0.9, 0.6, 0.7, 0.6, 0.5, 0.3, 0.1, 0.6, 0.7, 0.4, 0.5, 0.9, 0.4, 0.6, 0.9, 0.8, 0.2, 0.3, 0.1, 0.5, 0.3, 0.2, 0.6, 0.1, 0.9, 0.3, 0.6, 0.4, 0.1, 0.6, 0.6, 0.8, 0.9, 0.2, 0.3, 0.7, 0.9, 0.7, 0.7, 0.2, 0.2, 0.8, 0.8, 0.5, 0.3, 0.6, 0.3, 0.7, 0.5, 0.1, 0.2, 0.1, 0.1, 0.1, 0.4, 0.7, 0.4, 0.4, 0.3, 0.4, 0.4, 0.4, 0.3, 0.8, 0.1, 0.4, 0.4, 0.3, 0.3, 0.8, 0.4, 0.1, 0.5, 0.5, 0.7, 0.7, 0.3, 0.3, 0.6, 0.3, 0.5, 0.2, 0.9, 0.4, 0.4, 0.9, 0.4, 0.6, 0.9, 0.9, 0.2, 0.9, 0.7, 0.5, 0.3, 0.6, 0.3, 0.2, 0.6, 0.1, 0.2, 0.5, 0.2, 0.1, 0.6, 0.1, 0.7, 0.8, 0.8, 0.3, 0.5, 0.7, 0.6, 0.4, 0.9, 0.1, 0.6, 0.2, 0.1, 0.2, 0.2, 0.2, 0.7, 0.5, 0.6, 0.7, 0.6, 0.3, 0.5, 0.9, 0.1, 0.7, 0.9, 0.3, 0.4, 0.2, 0.8, 0.9, 0.1, 0.3, 0.5, 0.5, 0.2, 0.6, 0.5, 
+
+L3_dGEMM_o_NN
+4.44, 3.09, 4.19, 3.56, 5.07, 4.15, 3.56, 3.42, 4.18, 3.79, 2.89, 3.71, 3.77, 4.87, 3.74, 3.69, 3.97, 6.15, 4.61, 5.81, 4.72, 4.68, 6.23, 5.28, 4.42, 5.82, 5.6, 4.49, 4.83, 4.99, 5.28, 4.32, 5.38, 4.82, 4.57, 3.22, 4.28, 3.81, 4.38, 4.89, 4.2, 3.7, 3.78, 3.84, 2.91, 2.89, 3.14, 4.78, 3.28, 4.11, 3.43, 5.32, 3.64, 4.41, 4.82, 4.97, 5.89, 5.13, 4.13, 4.57, 4.84, 4.37, 4.39, 4.58, 4.65, 4.21, 4.79, 4.7, 4.13, 3.08, 3.57, 3.56, 4.49, 4.39, 3.35, 3.49, 3.56, 3.32, 2.75, 3.44, 3.59, 3.54, 3.28, 3.19, 3.11, 5.17, 4.07, 4.77, 4.88, 4.55, 5.28, 4.76, 4.66, 4.63, 4.91, 3.94, 3.66, 4.75, 4.87, 4.75, 4.46, 4.03, 4.74, 3.61, 3.94, 3.99, 4.41, 5.69, 4.77, 3.97, 4.71, 4.2, 4.22, 3.56, 4.38, 4.49, 4.93, 4.32, 4.64, 5.33, 4.06, 4.64, 4.12, 5.42, 5.4, 4.78, 4.78, 4.78, 4.43, 4.49, 3.28, 4.99, 5.34, 5.17, 4.26, 5.2, 4.67, 3.1, 3.54, 4.82, 4.28, 4.71, 3.91, 3.63, 3.77, 3.79, 3.07, 3.68, 3.46, 4.63, 4.2, 3.7, 3.55, 7.15, 5.23, 5.55, 6.03, 7.48, 7.0, 6.13, 5.46, 6.69, 6.44, 4.58, 5.01, 5.62, 6.58, 5.58, 5.92, 6.02, 
+
+L3_dGEMM_A_km
+0.4, 0.7, 0.4, 0.5, 0.8, 0.3, 0.9, 0.6, 0.5, 0.5, 0.7, 0.4, 0.6, 0.9, 0.2, 0.4, 0.1, 0.8, 0.9, 0.8, 0.8, 0.6, 0.6, 0.1, 0.5, 0.3, 0.1, 0.6, 0.5, 0.6, 0.6, 0.9, 0.2, 0.5, 0.2, 0.7, 0.2, 0.7, 0.9, 0.7, 0.3, 0.7, 0.8, 0.7, 0.4, 0.8, 0.5, 0.4, 0.5, 0.2, 0.3, 0.1, 0.7, 0.9, 0.7, 0.4, 0.5, 0.2, 0.9, 0.3, 0.1, 0.9, 0.1, 0.7, 0.3, 0.5, 0.5, 0.9, 0.9, 0.8, 0.1, 0.2, 0.4, 0.1, 0.9, 0.9, 0.1, 0.8, 0.5, 0.9, 0.6, 0.1, 0.3, 0.5, 0.3, 0.3, 0.6, 0.9, 0.8, 0.7, 0.2, 0.6, 0.1, 0.8, 0.7, 0.1, 0.5, 0.9, 0.3, 0.7, 0.9, 0.9, 0.5, 0.1, 0.4, 0.3, 0.6, 0.4, 0.4, 0.1, 0.8, 0.4, 0.1, 0.9, 0.5, 0.7, 0.5, 0.9, 0.4, 0.1, 0.5, 0.2, 0.7, 0.7, 0.4, 0.1, 0.5, 0.7, 0.9, 0.2, 0.9, 0.1, 0.4, 0.3, 0.2, 0.7, 0.9, 0.2, 0.8, 0.6, 0.5, 0.1, 0.5, 0.2, 0.8, 0.1, 0.6, 0.2, 0.7, 0.1, 0.1, 0.6, 0.7, 0.2, 0.8, 0.3, 0.3, 0.4, 0.8, 0.4, 
+
+L3_dGEMM_B_nk
+0.7, 0.9, 0.2, 0.6, 0.3, 0.5, 0.1, 0.1, 0.1, 0.7, 0.3, 0.1, 0.7, 0.8, 0.8, 0.1, 0.6, 0.2, 0.2, 0.9, 0.8, 0.4, 0.2, 0.7, 0.9, 0.4, 0.2, 0.3, 0.4, 0.2, 0.1, 0.2, 0.9, 0.7, 0.5, 0.1, 0.8, 0.3, 0.2, 0.8, 0.8, 0.7, 0.9, 0.7, 0.9, 0.4, 0.9, 0.6, 0.8, 0.1, 0.4, 0.6, 0.7, 0.1, 0.8, 0.1, 0.1, 0.3, 0.3, 0.8, 0.6, 0.1, 0.9, 0.2, 0.6, 0.9, 0.7, 0.6, 0.8, 0.1, 0.7, 0.9, 0.7, 0.9, 0.7, 0.5, 0.8, 0.1, 0.9, 0.2, 0.3, 0.6, 0.6, 0.3, 0.3, 0.3, 0.2, 0.9, 0.4, 0.3, 0.3, 0.5, 0.9, 0.1, 0.3, 0.2, 0.4, 0.1, 0.6, 0.2, 0.6, 0.7, 0.1, 0.9, 0.9, 0.2, 0.8, 0.9, 0.5, 0.7, 0.8, 0.9, 0.8, 0.5, 0.9, 0.1, 0.6, 0.1, 0.1, 0.9, 0.1, 0.9, 0.2, 0.6, 0.3, 0.9, 0.8, 0.9, 0.9, 0.6, 0.5, 0.4, 0.8, 0.8, 0.7, 0.1, 0.1, 0.5, 0.4, 0.4, 0.2, 0.7, 0.7, 0.5, 0.4, 0.5, 0.6, 0.5, 0.4, 0.2, 0.5, 0.8, 0.2, 0.6, 0.4, 0.5, 0.1, 0.7, 0.3, 0.8, 0.3, 0.8, 0.4, 0.2, 0.7, 0.7, 0.2, 0.1, 0.3, 0.5, 0.1, 0.4, 0.5, 0.9, 0.2, 0.8, 0.8, 0.1, 0.8, 0.7, 0.4, 0.6, 0.7, 0.5, 0.9, 0.3, 0.7, 0.9, 0.5, 0.9, 0.2, 0.6, 0.5, 0.9, 0.8, 0.3, 0.8, 0.2, 0.8, 0.5, 0.6, 0.7, 0.1, 0.4, 0.1, 0.5, 0.1, 0.9, 0.6, 0.1, 0.1, 0.4, 0.8, 0.8, 0.9, 0.7, 0.1, 0.2, 0.7, 0.8, 0.1, 0.9, 0.6, 0.2, 0.2, 0.9, 0.6, 0.6, 0.3, 0.5, 0.3, 0.3, 0.4, 0.2, 0.1, 0.8, 0.1, 0.1, 0.2, 0.7, 0.2, 0.5, 0.2, 0.5, 0.4, 0.5, 0.4, 0.1, 0.8, 0.9, 0.9, 0.8, 0.6, 0.3, 0.1, 0.6, 0.5, 0.7, 0.7, 0.2, 0.8, 0.5, 0.2, 0.7, 0.2, 0.2, 0.8, 0.9, 0.8, 0.6, 0.1, 0.2, 
+
+L3_dGEMM_o_TT
+4.12, 3.42, 5.45, 3.59, 5.61, 3.57, 4.91, 4.41, 4.75, 4.21, 4.1, 5.74, 4.23, 4.72, 3.57, 4.3, 5.26, 3.38, 3.71, 5.39, 4.24, 5.04, 2.91, 4.2, 4.13, 5.03, 4.34, 3.68, 5.21, 4.71, 4.14, 3.13, 4.49, 4.43, 3.64, 3.37, 5.68, 3.23, 4.95, 3.94, 5.2, 4.18, 4.15, 3.28, 4.09, 4.28, 3.83, 3.96, 2.91, 4.12, 4.23, 4.46, 3.94, 5.06, 4.29, 5.71, 4.09, 4.96, 4.01, 4.76, 4.12, 4.92, 5.33, 4.99, 4.28, 3.74, 5.22, 5.02, 3.9, 3.61, 6.12, 3.86, 5.83, 3.9, 5.23, 5.26, 4.37, 4.04, 3.52, 5.07, 4.74, 4.52, 3.47, 3.97, 4.34, 3.03, 3.71, 4.36, 3.7, 4.27, 3.23, 4.55, 4.07, 3.85, 4.38, 3.49, 4.49, 4.23, 4.65, 3.62, 3.8, 4.17, 3.84, 3.64, 5.23, 3.98, 4.54, 3.44, 4.86, 4.41, 5.11, 3.61, 3.95, 5.67, 4.33, 4.42, 3.2, 4.39, 4.16, 4.15, 4.95, 6.44, 4.42, 7.22, 4.4, 5.34, 5.49, 4.67, 4.66, 4.49, 5.92, 6.01, 5.15, 4.86, 5.34, 5.35, 5.6, 5.07, 6.8, 5.36, 6.57, 4.9, 6.19, 5.36, 5.78, 5.03, 5.2, 7.08, 5.95, 5.81, 5.08, 5.68, 5.42, 3.83, 4.43, 4.57, 3.48, 5.95, 3.54, 4.3, 4.47, 4.59, 4.91, 3.46, 4.92, 5.12, 4.03, 3.41, 4.12, 4.03, 
+
+L3_dGEMM_o_HH
+4.12, 3.42, 5.45, 3.59, 5.61, 3.57, 4.91, 4.41, 4.75, 4.21, 4.1, 5.74, 4.23, 4.72, 3.57, 4.3, 5.26, 3.38, 3.71, 5.39, 4.24, 5.04, 2.91, 4.2, 4.13, 5.03, 4.34, 3.68, 5.21, 4.71, 4.14, 3.13, 4.49, 4.43, 3.64, 3.37, 5.68, 3.23, 4.95, 3.94, 5.2, 4.18, 4.15, 3.28, 4.09, 4.28, 3.83, 3.96, 2.91, 4.12, 4.23, 4.46, 3.94, 5.06, 4.29, 5.71, 4.09, 4.96, 4.01, 4.76, 4.12, 4.92, 5.33, 4.99, 4.28, 3.74, 5.22, 5.02, 3.9, 3.61, 6.12, 3.86, 5.83, 3.9, 5.23, 5.26, 4.37, 4.04, 3.52, 5.07, 4.74, 4.52, 3.47, 3.97, 4.34, 3.03, 3.71, 4.36, 3.7, 4.27, 3.23, 4.55, 4.07, 3.85, 4.38, 3.49, 4.49, 4.23, 4.65, 3.62, 3.8, 4.17, 3.84, 3.64, 5.23, 3.98, 4.54, 3.44, 4.86, 4.41, 5.11, 3.61, 3.95, 5.67, 4.33, 4.42, 3.2, 4.39, 4.16, 4.15, 4.95, 6.44, 4.42, 7.22, 4.4, 5.34, 5.49, 4.67, 4.66, 4.49, 5.92, 6.01, 5.15, 4.86, 5.34, 5.35, 5.6, 5.07, 6.8, 5.36, 6.57, 4.9, 6.19, 5.36, 5.78, 5.03, 5.2, 7.08, 5.95, 5.81, 5.08, 5.68, 5.42, 3.83, 4.43, 4.57, 3.48, 5.95, 3.54, 4.3, 4.47, 4.59, 4.91, 3.46, 4.92, 5.12, 4.03, 3.41, 4.12, 4.03, 
+
+L3_cGEMM_A_mk
+0.5, 0.5, 0.40000000596, 0.300000011921, 0.40000000596, 0.20000000298, 0.800000011921, 0.800000011921, 0.600000023842, 0.10000000149, 0.10000000149, 0.600000023842, 0.10000000149, 0.5, 0.600000023842, 0.10000000149, 0.5, 0.899999976158, 0.899999976158, 0.899999976158, 0.5, 0.10000000149, 0.10000000149, 0.800000011921, 0.10000000149, 0.300000011921, 0.5, 0.899999976158, 0.300000011921, 0.20000000298, 0.699999988079, 0.10000000149, 0.10000000149, 0.40000000596, 0.300000011921, 0.899999976158, 0.300000011921, 0.300000011921, 0.899999976158, 0.699999988079, 0.899999976158, 0.600000023842, 0.699999988079, 0.899999976158, 0.40000000596, 0.5, 0.20000000298, 0.5, 0.40000000596, 0.600000023842, 0.699999988079, 0.20000000298, 0.10000000149, 0.20000000298, 0.699999988079, 0.800000011921, 0.800000011921, 0.699999988079, 0.800000011921, 0.899999976158, 0.40000000596, 0.20000000298, 0.10000000149, 0.40000000596, 0.300000011921, 0.10000000149, 0.699999988079, 0.5, 0.899999976158, 0.699999988079, 0.600000023842, 0.10000000149, 0.300000011921, 0.899999976158, 0.10000000149, 0.40000000596, 0.800000011921, 0.800000011921, 0.5, 0.5, 0.800000011921, 0.20000000298, 0.899999976158, 0.40000000596, 0.800000011921, 0.40000000596, 0.40000000596, 0.20000000298, 0.899999976158, 0.300000011921, 0.20000000298, 0.800000011921, 0.699999988079, 0.899999976158, 0.40000000596, 0.699999988079, 0.899999976158, 0.600000023842, 0.300000011921, 0.20000000298, 0.899999976158, 0.20000000298, 0.600000023842, 0.10000000149, 0.699999988079, 0.800000011921, 0.5, 0.899999976158, 0.10000000149, 0.5, 0.899999976158, 0.40000000596, 0.5, 0.10000000149, 0.600000023842, 0.5, 0.899999976158, 0.800000011921, 0.20000000298, 0.20000000298, 0.10000000149, 0.10000000149, 0.300000011921, 0.800000011921, 0.300000011921, 0.40000000596, 0.20000000298, 0.800000011921, 0.20000000298, 0.600000023842, 0.699999988079, 0.600000023842, 0.10000000149, 0.300000011921, 0.10000000149, 0.800000011921, 0.300000011921, 0.899999976158, 0.300000011921, 0.800000011921, 0.600000023842, 0.20000000298, 0.899999976158, 0.5, 0.10000000149, 0.10000000149, 0.5, 0.40000000596, 0.699999988079, 0.40000000596, 0.300000011921, 0.800000011921, 0.699999988079, 0.899999976158, 0.10000000149, 0.699999988079, 0.899999976158, 0.800000011921, 0.600000023842, 0.40000000596, 0.600000023842, 0.20000000298, 0.40000000596, 0.600000023842, 0.40000000596, 0.20000000298, 0.699999988079, 0.300000011921, 0.600000023842, 0.5, 0.10000000149, 0.40000000596, 0.699999988079, 0.899999976158, 0.699999988079, 0.300000011921, 0.300000011921, 0.800000011921, 0.699999988079, 0.600000023842, 0.40000000596, 0.800000011921, 0.699999988079, 0.600000023842, 0.699999988079, 0.5, 0.600000023842, 0.20000000298, 0.699999988079, 0.10000000149, 0.20000000298, 0.10000000149, 0.40000000596, 0.899999976158, 0.600000023842, 0.800000011921, 0.5, 0.600000023842, 0.5, 0.300000011921, 0.600000023842, 0.40000000596, 0.10000000149, 0.899999976158, 0.899999976158, 0.10000000149, 0.300000011921, 0.800000011921, 0.899999976158, 0.699999988079, 0.20000000298, 0.300000011921, 0.300000011921, 0.5, 0.20000000298, 0.300000011921, 0.5, 0.10000000149, 0.300000011921, 0.699999988079, 0.800000011921, 0.800000011921, 0.5, 0.40000000596, 0.800000011921, 0.20000000298, 0.899999976158, 0.20000000298, 0.699999988079, 0.600000023842, 0.300000011921, 0.10000000149, 0.600000023842, 0.899999976158, 0.40000000596, 0.20000000298, 0.600000023842, 0.300000011921, 0.10000000149, 0.800000011921, 0.5, 0.5, 0.899999976158, 0.300000011921, 0.20000000298, 0.20000000298, 0.20000000298, 0.5, 0.800000011921, 0.300000011921, 0.20000000298, 0.699999988079, 0.600000023842, 0.20000000298, 0.699999988079, 0.699999988079, 0.699999988079, 0.5, 0.20000000298, 0.699999988079, 0.10000000149, 0.5, 0.10000000149, 0.5, 0.699999988079, 0.20000000298, 0.10000000149, 0.800000011921, 0.10000000149, 0.300000011921, 0.40000000596, 0.300000011921, 0.699999988079, 0.5, 0.20000000298, 0.5, 0.800000011921, 0.10000000149, 0.899999976158, 0.300000011921, 0.600000023842, 0.899999976158, 0.300000011921, 0.899999976158, 0.899999976158, 0.699999988079, 0.20000000298, 0.699999988079, 0.10000000149, 0.5, 0.899999976158, 0.699999988079, 0.5, 0.300000011921, 0.699999988079, 0.899999976158, 0.899999976158, 0.5, 0.800000011921, 0.300000011921, 0.300000011921, 0.10000000149, 0.699999988079, 0.5, 0.5, 0.40000000596, 0.5, 0.800000011921, 0.5, 0.40000000596, 0.40000000596, 0.800000011921, 0.40000000596, 0.600000023842, 0.800000011921, 0.300000011921, 0.5, 0.699999988079, 0.899999976158, 0.5, 
+
+L3_cGEMM_B_kn
+0.699999988079, 0.800000011921, 0.5, 0.5, 0.10000000149, 0.300000011921, 0.300000011921, 0.300000011921, 0.20000000298, 0.10000000149, 0.699999988079, 0.10000000149, 0.20000000298, 0.300000011921, 0.699999988079, 0.40000000596, 0.40000000596, 0.699999988079, 0.10000000149, 0.10000000149, 0.699999988079, 0.10000000149, 0.10000000149, 0.5, 0.699999988079, 0.300000011921, 0.600000023842, 0.40000000596, 0.300000011921, 0.800000011921, 0.20000000298, 0.300000011921, 0.10000000149, 0.20000000298, 0.5, 0.20000000298, 0.300000011921, 0.300000011921, 0.899999976158, 0.800000011921, 0.699999988079, 0.300000011921, 0.800000011921, 0.899999976158, 0.10000000149, 0.10000000149, 0.899999976158, 0.5, 0.20000000298, 0.40000000596, 0.20000000298, 0.899999976158, 0.699999988079, 0.899999976158, 0.800000011921, 0.699999988079, 0.20000000298, 0.20000000298, 0.300000011921, 0.699999988079, 0.699999988079, 0.899999976158, 0.10000000149, 0.300000011921, 0.699999988079, 0.20000000298, 0.899999976158, 0.5, 0.800000011921, 0.899999976158, 0.5, 0.5, 0.20000000298, 0.699999988079, 0.40000000596, 0.800000011921, 0.800000011921, 0.300000011921, 0.5, 0.899999976158, 0.899999976158, 0.800000011921, 0.899999976158, 0.10000000149, 0.300000011921, 0.20000000298, 0.40000000596, 0.10000000149, 0.5, 0.699999988079, 0.5, 0.5, 0.40000000596, 0.20000000298, 0.899999976158, 0.20000000298, 0.300000011921, 0.10000000149, 0.300000011921, 0.5, 0.800000011921, 0.899999976158, 0.5, 0.20000000298, 0.20000000298, 0.40000000596, 0.20000000298, 0.40000000596, 0.600000023842, 0.300000011921, 0.899999976158, 0.300000011921, 0.300000011921, 0.699999988079, 0.300000011921, 0.40000000596, 0.600000023842, 0.20000000298, 0.10000000149, 0.600000023842, 0.10000000149, 0.10000000149, 0.899999976158, 0.10000000149, 0.699999988079, 0.800000011921, 0.20000000298, 0.10000000149, 0.40000000596, 0.899999976158, 0.10000000149, 0.5, 0.899999976158, 0.40000000596, 0.40000000596, 0.899999976158, 0.899999976158, 0.20000000298, 0.10000000149, 0.899999976158, 0.20000000298, 0.300000011921, 0.699999988079, 0.800000011921, 0.40000000596, 0.40000000596, 0.899999976158, 0.800000011921, 0.699999988079, 0.600000023842, 0.40000000596, 0.300000011921, 0.600000023842, 0.20000000298, 0.10000000149, 0.800000011921, 0.300000011921, 0.600000023842, 0.40000000596, 0.5, 0.600000023842, 0.699999988079, 0.40000000596, 0.899999976158, 0.10000000149, 0.5, 0.5, 0.10000000149, 0.300000011921, 0.5, 0.40000000596, 0.300000011921, 0.699999988079, 0.699999988079, 0.20000000298, 0.20000000298, 0.600000023842, 0.300000011921, 0.5, 0.5, 0.40000000596, 0.20000000298, 0.600000023842, 0.20000000298, 0.10000000149, 0.300000011921, 0.5, 0.5, 0.699999988079, 0.10000000149, 0.40000000596, 0.800000011921, 0.899999976158, 0.800000011921, 0.20000000298, 0.5, 0.5, 0.5, 0.800000011921, 0.600000023842, 0.5, 0.800000011921, 0.5, 0.20000000298, 0.10000000149, 0.300000011921, 0.10000000149, 0.40000000596, 0.600000023842, 0.40000000596, 0.20000000298, 0.300000011921, 0.300000011921, 0.600000023842, 0.10000000149, 0.800000011921, 0.800000011921, 0.699999988079, 0.699999988079, 0.800000011921, 0.899999976158, 0.20000000298, 0.699999988079, 0.40000000596, 0.899999976158, 0.600000023842, 0.20000000298, 0.40000000596, 0.899999976158, 0.10000000149, 0.800000011921, 0.800000011921, 0.699999988079, 0.600000023842, 0.20000000298, 0.699999988079, 0.10000000149, 0.899999976158, 0.5, 0.300000011921, 0.300000011921, 0.10000000149, 0.800000011921, 0.5, 0.40000000596, 0.20000000298, 0.5, 0.699999988079, 0.800000011921, 0.699999988079, 0.800000011921, 0.5, 0.899999976158, 0.300000011921, 0.5, 0.20000000298, 0.300000011921, 0.10000000149, 0.800000011921, 0.10000000149, 0.300000011921, 0.899999976158, 0.20000000298, 0.699999988079, 0.40000000596, 0.20000000298, 0.699999988079, 0.699999988079, 0.20000000298, 0.5, 0.300000011921, 0.10000000149, 0.40000000596, 0.800000011921, 0.699999988079, 0.20000000298, 0.10000000149, 0.10000000149, 0.20000000298, 0.899999976158, 0.600000023842, 0.699999988079, 0.20000000298, 0.899999976158, 0.600000023842, 0.5, 0.300000011921, 0.300000011921, 0.20000000298, 0.300000011921, 0.600000023842, 0.5, 0.300000011921, 0.20000000298, 0.800000011921, 0.10000000149, 0.300000011921, 0.899999976158, 0.300000011921, 0.300000011921, 0.899999976158, 0.10000000149, 0.10000000149, 0.899999976158, 0.20000000298, 0.600000023842, 0.300000011921, 0.5, 0.899999976158, 0.40000000596, 0.20000000298, 0.5, 0.600000023842, 0.699999988079, 0.800000011921, 0.40000000596, 0.800000011921, 0.20000000298, 0.5, 0.20000000298, 0.10000000149, 0.5, 0.600000023842, 0.600000023842, 0.20000000298, 0.5, 0.40000000596, 0.5, 0.800000011921, 0.600000023842, 0.899999976158, 0.300000011921, 0.40000000596, 0.5, 0.899999976158, 0.10000000149, 0.5, 0.800000011921, 0.5, 0.20000000298, 0.10000000149, 0.40000000596, 0.699999988079, 0.600000023842, 0.300000011921, 0.5, 0.40000000596, 0.300000011921, 0.600000023842, 0.300000011921, 0.40000000596, 0.600000023842, 0.300000011921, 0.699999988079, 0.40000000596, 0.5, 0.10000000149, 0.10000000149, 0.699999988079, 0.899999976158, 0.20000000298, 0.10000000149, 0.699999988079, 0.800000011921, 0.20000000298, 0.699999988079, 0.40000000596, 0.20000000298, 0.699999988079, 0.800000011921, 0.899999976158, 0.40000000596, 0.899999976158, 0.40000000596, 0.10000000149, 0.600000023842, 0.600000023842, 0.40000000596, 0.10000000149, 0.699999988079, 0.600000023842, 0.800000011921, 0.300000011921, 0.600000023842, 0.20000000298, 0.10000000149, 0.699999988079, 0.699999988079, 0.20000000298, 0.20000000298, 0.20000000298, 0.10000000149, 0.5, 0.20000000298, 0.899999976158, 0.40000000596, 0.20000000298, 0.5, 0.899999976158, 0.10000000149, 0.300000011921, 0.40000000596, 0.40000000596, 0.800000011921, 0.40000000596, 0.20000000298, 0.800000011921, 0.800000011921, 0.40000000596, 0.300000011921, 0.5, 0.20000000298, 0.10000000149, 0.699999988079, 0.600000023842, 0.800000011921, 0.40000000596, 0.899999976158, 0.5, 0.699999988079, 0.5, 0.800000011921, 0.800000011921, 0.300000011921, 0.10000000149, 0.699999988079, 0.800000011921, 0.10000000149, 0.20000000298, 0.600000023842, 0.300000011921, 0.800000011921, 0.899999976158, 0.40000000596, 0.20000000298, 0.300000011921, 0.20000000298, 0.800000011921, 0.10000000149, 0.40000000596, 0.5, 0.600000023842, 0.300000011921, 0.899999976158, 0.20000000298, 0.5, 0.899999976158, 0.300000011921, 0.20000000298, 0.699999988079, 0.5, 0.300000011921, 0.5, 0.10000000149, 0.5, 0.40000000596, 0.300000011921, 0.800000011921, 0.300000011921, 0.600000023842, 0.40000000596, 0.699999988079, 0.10000000149, 0.300000011921, 0.300000011921, 0.600000023842, 0.699999988079, 0.899999976158, 0.899999976158, 0.699999988079, 0.800000011921, 0.20000000298, 0.600000023842, 0.20000000298, 0.300000011921, 0.699999988079, 0.899999976158, 0.10000000149, 0.40000000596, 0.10000000149, 0.20000000298, 0.800000011921, 0.40000000596, 0.5, 0.800000011921, 0.300000011921, 0.10000000149, 0.5, 0.300000011921, 0.300000011921, 0.20000000298, 0.300000011921, 0.699999988079, 0.20000000298, 0.600000023842, 0.600000023842, 0.20000000298, 0.20000000298, 0.10000000149, 0.300000011921, 0.10000000149, 0.20000000298, 0.40000000596, 0.40000000596, 0.699999988079, 0.800000011921, 0.40000000596, 0.800000011921, 0.800000011921, 0.5, 0.899999976158, 0.40000000596, 0.10000000149, 0.10000000149, 0.40000000596, 0.5, 0.20000000298, 0.800000011921, 0.899999976158, 0.5, 0.300000011921, 0.5, 0.600000023842, 0.600000023842, 0.800000011921, 0.40000000596, 0.40000000596, 0.10000000149, 0.10000000149, 0.899999976158, 0.800000011921, 0.5, 0.300000011921, 0.10000000149, 0.5, 0.40000000596, 0.20000000298, 0.899999976158, 0.800000011921, 0.600000023842, 0.10000000149, 0.300000011921, 0.800000011921, 0.899999976158, 
+
+L3_cGEMM_C_mn
+0.699999988079, 0.800000011921, 0.600000023842, 0.800000011921, 0.20000000298, 0.300000011921, 0.40000000596, 0.699999988079, 0.5, 0.899999976158, 0.40000000596, 0.5, 0.600000023842, 0.600000023842, 0.800000011921, 0.20000000298, 0.699999988079, 0.20000000298, 0.699999988079, 0.40000000596, 0.300000011921, 0.5, 0.10000000149, 0.5, 0.40000000596, 0.600000023842, 0.800000011921, 0.40000000596, 0.20000000298, 0.899999976158, 0.40000000596, 0.10000000149, 0.300000011921, 0.40000000596, 0.899999976158, 0.800000011921, 0.600000023842, 0.10000000149, 0.800000011921, 0.699999988079, 0.899999976158, 0.699999988079, 0.5, 0.5, 0.300000011921, 0.600000023842, 0.20000000298, 0.899999976158, 0.300000011921, 0.10000000149, 0.10000000149, 0.40000000596, 0.40000000596, 0.20000000298, 0.300000011921, 0.800000011921, 0.600000023842, 0.20000000298, 0.899999976158, 0.899999976158, 0.40000000596, 0.20000000298, 0.40000000596, 0.600000023842, 0.300000011921, 0.40000000596, 0.5, 0.20000000298, 0.5, 0.899999976158, 0.10000000149, 0.5, 0.899999976158, 0.10000000149, 0.600000023842, 0.20000000298, 0.800000011921, 0.800000011921, 0.600000023842, 0.10000000149, 0.5, 0.800000011921, 0.800000011921, 0.5, 0.10000000149, 0.699999988079, 0.40000000596, 0.10000000149, 0.5, 0.5, 0.40000000596, 0.10000000149, 0.800000011921, 0.5, 0.10000000149, 0.699999988079, 0.899999976158, 0.300000011921, 0.899999976158, 0.10000000149, 0.20000000298, 0.10000000149, 0.10000000149, 0.40000000596, 0.699999988079, 0.800000011921, 0.600000023842, 0.800000011921, 0.800000011921, 0.800000011921, 0.5, 0.800000011921, 0.899999976158, 0.300000011921, 0.800000011921, 0.800000011921, 0.10000000149, 0.10000000149, 0.600000023842, 0.300000011921, 0.40000000596, 0.800000011921, 0.600000023842, 0.40000000596, 0.20000000298, 0.5, 0.899999976158, 0.5, 0.300000011921, 0.699999988079, 0.899999976158, 0.699999988079, 0.300000011921, 0.800000011921, 0.10000000149, 0.40000000596, 0.800000011921, 0.899999976158, 0.5, 0.699999988079, 0.699999988079, 0.699999988079, 0.5, 0.40000000596, 0.600000023842, 0.899999976158, 0.600000023842, 0.5, 0.40000000596, 0.800000011921, 0.20000000298, 0.10000000149, 0.10000000149, 0.600000023842, 0.600000023842, 0.699999988079, 0.300000011921, 0.899999976158, 0.600000023842, 0.699999988079, 0.20000000298, 0.10000000149, 0.300000011921, 0.600000023842, 0.40000000596, 0.699999988079, 0.699999988079, 0.800000011921, 0.5, 0.600000023842, 0.600000023842, 0.20000000298, 0.699999988079, 0.699999988079, 0.20000000298, 0.800000011921, 0.40000000596, 0.10000000149, 0.800000011921, 0.800000011921, 0.699999988079, 0.10000000149, 0.300000011921, 0.800000011921, 0.699999988079, 0.10000000149, 0.300000011921, 0.300000011921, 0.10000000149, 0.300000011921, 0.600000023842, 0.899999976158, 0.40000000596, 0.800000011921, 0.300000011921, 0.40000000596, 0.300000011921, 0.899999976158, 0.800000011921, 0.300000011921, 0.40000000596, 0.10000000149, 0.800000011921, 0.20000000298, 0.40000000596, 0.699999988079, 0.20000000298, 0.699999988079, 0.40000000596, 0.300000011921, 0.300000011921, 0.699999988079, 0.10000000149, 0.800000011921, 0.699999988079, 0.10000000149, 0.600000023842, 0.20000000298, 0.20000000298, 0.699999988079, 0.899999976158, 0.300000011921, 0.800000011921, 0.5, 0.40000000596, 0.600000023842, 0.899999976158, 0.300000011921, 0.20000000298, 0.600000023842, 0.5, 0.800000011921, 0.40000000596, 0.699999988079, 0.699999988079, 0.800000011921, 0.300000011921, 0.899999976158, 0.800000011921, 0.20000000298, 0.800000011921, 0.20000000298, 0.899999976158, 0.600000023842, 0.600000023842, 0.5, 0.300000011921, 0.20000000298, 0.300000011921, 0.40000000596, 0.300000011921, 0.20000000298, 0.899999976158, 0.600000023842, 0.5, 0.899999976158, 0.699999988079, 0.699999988079, 0.699999988079, 0.5, 0.800000011921, 0.699999988079, 0.5, 0.699999988079, 0.600000023842, 0.10000000149, 0.600000023842, 0.10000000149, 0.20000000298, 0.10000000149, 0.699999988079, 0.800000011921, 0.600000023842, 0.800000011921, 0.5, 0.300000011921, 0.800000011921, 0.899999976158, 0.20000000298, 0.5, 0.600000023842, 0.300000011921, 0.20000000298, 0.600000023842, 0.899999976158, 0.699999988079, 0.600000023842, 0.899999976158, 0.40000000596, 0.40000000596, 0.300000011921, 0.699999988079, 0.10000000149, 0.10000000149, 0.699999988079, 0.20000000298, 0.800000011921, 0.20000000298, 0.699999988079, 0.20000000298, 0.600000023842, 0.20000000298, 0.10000000149, 0.5, 0.5, 0.300000011921, 0.800000011921, 0.600000023842, 0.20000000298, 0.600000023842, 0.600000023842, 0.699999988079, 0.600000023842, 0.20000000298, 0.5, 0.10000000149, 0.20000000298, 0.600000023842, 0.10000000149, 0.20000000298, 0.10000000149, 0.5, 0.40000000596, 0.40000000596, 0.300000011921, 0.899999976158, 0.699999988079, 0.800000011921, 0.300000011921, 0.699999988079, 0.10000000149, 0.899999976158, 0.5, 0.20000000298, 0.600000023842, 0.600000023842, 0.899999976158, 0.699999988079, 0.899999976158, 0.699999988079, 
+
+L3_cGEMM_o_NN
+0.65000000447, 6.93000006944, 0.619999984205, 7.09000004292, -0.370000001341, 5.88000005975, -0.699999899417, 7.83000014767, 1.60999999061, 8.18000006869, 0.810000075549, 7.00000005141, 1.14000006378, 7.98000015587, 1.26000003085, 5.7000001058, 0.0599999965727, 5.66000009716, 0.270000060946, 7.01000003755, 1.23999999151, 6.86000004053, -0.400000051409, 7.77000009969, 0.540000047386, 8.1199999693, 0.150000059605, 8.09000000864, 0.82999988541, 8.40000001267, -0.139999985546, 6.51000006661, -0.329999949485, 7.43000005901, 0.559999913126, 8.1400000675, 0.270000009537, 7.05999999732, -0.839999984801, 7.67999997109, -0.0400000347197, 9.4500000909, 0.250000024587, 9.26000006735, -0.160000012964, 7.92000003263, 0.159999974221, 10.0900000519, 0.160000004768, 6.94000011072, -0.829999945015, 6.81000010014, 0.0700000706315, 7.39000000715, 0.219999935776, 9.03000007167, -0.480000014305, 8.39000007048, 0.949999986589, 8.81999993652, -0.949999913573, 9.11999993876, -0.270000070632, 8.78000008285, 0.0499999679625, 7.73000001281, -0.819999955893, 9.07000001103, 1.4999999769, 9.30999993622, 1.14999997616, 6.62000007361, -0.0300000105798, 8.17000000581, 0.23000007093, 8.80000006407, 2.7600000301, 10.320000046, 0.160000064373, 8.65999998242, 1.77999996588, 10.7400000601, 2.13999994457, 7.7800000672, 0.889999983311, 7.89000001907, 0.700000053644, 7.6700000304, 1.72999997333, 8.11000003308, 0.61999998495, 7.86000010014, 1.81999999464, 8.34999999031, 0.0600000673532, 9.49000000492, 1.85999986917, 9.28000010297, 1.00999995261, 8.04000003099, 0.600000044703, 9.68000001952, 0.959999904931, 8.00000002459, 0.989999938607, 7.33000001356, -0.0100000233948, 7.18000007838, 0.49999999404, 8.00000013486, 2.02000000358, 8.31000010833, 1.7499998942, 8.03000001505, 1.70999993324, 8.84000010774, 0.949999852479, 6.18000011787, 0.910000015199, 6.50000012666, -0.399999999255, 7.04000001758, 1.59999996424, 6.77000008628, -0.0100000695884, 8.39000002876, 0.679999970347, 8.00999997944, 0.140000016838, 8.16000004947, 0.999999836832, 9.1900000377, 0.549999958277, 7.77000008032, 0.330000004619, 7.95000005364, 0.549999903142, 8.02000004753, -0.41000002414, 6.76000010014, -1.08000006273, 7.64000001684, -1.30000002757, 8.45000019744, 0.38000001654, 9.96000006437, -0.639999954253, 8.13000002548, -0.0400000220537, 9.58000011042, 0.369999916404, 7.03000012606, -0.760000035316, 6.56000008374, 0.260000012964, 8.14000003397, 0.249999967217, 8.4100001061, -2.02000002593, 8.16000005022, -0.469999979734, 7.90999995857, -1.63999994457, 8.51000011504, -0.870000130981, 9.27000010043, -0.370000122041, 8.36000008225, -0.420000030398, 9.01000014335, 1.49999993294, 6.58000013426, 1.21999993429, 7.26000010535, -0.130000039637, 7.50000008494, 0.389999991506, 7.95000019595, 1.69999997839, 8.76000019252, 0.74999999404, 7.12000005946, 1.19999998733, 9.47000014886, 1.92999992192, 6.48000012532, 0.999999966472, 6.35000010505, 0.369999996126, 7.37000009969, 2.14999990389, 7.84000009656, -0.0500000603497, 8.83000014096, 1.57999994501, 7.75000004694, 0.730000021756, 8.79000005707, 1.46999988064, 8.79000008687, 0.389999973625, 7.0100000681, 0.96999998793, 8.44000007123, 0.289999996722, 8.53000004485, -0.329999988228, 7.24000005037, -0.970000022948, 7.19000010103, -0.939999963194, 8.71000013962, 0.610000056177, 9.72000015408, -0.339999978095, 8.22000001401, 1.1000000082, 9.16000014856, 0.829999964386, 7.4800000985, 0.499999985844, 6.39000011593, 0.520000058711, 7.87000008926, 1.11999997824, 7.98000015512, -0.550000038743, 7.34000011593, -0.47999994725, 7.54000005409, -0.0399999400973, 9.50000006631, -0.0300000940263, 9.30000009537, -0.620000004321, 8.19000004515, -0.189999943823, 9.99000004068, 2.10999997869, 7.5600000301, 1.79000000492, 5.94000009656, 0.509999940693, 7.4900000824, 0.320000071377, 8.23000012606, 2.08000001878, 8.25000007898, 0.320000028908, 7.82000005573, 1.58999996543, 8.77000014067, 2.43999995351, 7.3200001429, 1.79000002652, 7.33000004858, 1.22000006616, 7.14000004441, 2.34999995232, 7.8800000985, 0.839999997467, 7.36000014782, 1.67000003487, 7.78000000983, 1.18000010446, 8.12000003785, 1.5799999696, 7.91000016943, 0.579999968857, 6.58000009403, 1.28000000238, 8.78000010148, 0.179999962896, 8.28000002176, 0.709999991357, 6.56000001818, -1.45999995336, 7.40999995634, -1.46999994919, 8.31000009045, 1.02072952757e-07, 8.71000004053, -0.55999995932, 7.40000003874, 0.439999958724, 9.16000004947, 0.390000004172, 7.26000004947, -0.909999980181, 5.82000006318, -0.0699998888373, 7.82000000134, -0.390000049621, 6.51000007108, -0.970000041574, 7.27000007883, 0.460000037551, 7.73999992594, -0.979999914467, 7.53999998331, 0.0699999216199, 9.00000004098, -1.15000003278, 6.93000001356, -0.529999943525, 8.30000004023, 2.23999984547, 8.6600000383, 0.769999961108, 8.05000007153, -4.24683084255e-08, 7.79000000343, 0.339999965429, 9.47000013545, 2.2699999328, 9.95000003353, 0.439999995977, 8.73000003889, 1.67999992266, 9.49000009283, 1.48999992147, 7.73000012234, 0.459999995083, 6.9800000836, 0.680000036657, 8.94999996126, 2.40999990046, 9.44000003919, 0.0899999326468, 9.07000008628, 0.909999981672, 9.72999992117, 0.530000026226, 9.37999994278, 1.15999993399, 9.23000010595, 1.35999988109, 8.55000000969, 1.43999995127, 10.5499999762, 
+
+L3_cGEMM_A_km
+0.800000011921, 0.20000000298, 0.300000011921, 0.600000023842, 0.600000023842, 0.5, 0.300000011921, 0.300000011921, 0.10000000149, 0.300000011921, 0.300000011921, 0.600000023842, 0.300000011921, 0.800000011921, 0.600000023842, 0.300000011921, 0.10000000149, 0.40000000596, 0.40000000596, 0.300000011921, 0.800000011921, 0.600000023842, 0.300000011921, 0.699999988079, 0.300000011921, 0.600000023842, 0.899999976158, 0.300000011921, 0.40000000596, 0.40000000596, 0.699999988079, 0.699999988079, 0.600000023842, 0.600000023842, 0.40000000596, 0.5, 0.600000023842, 0.20000000298, 0.300000011921, 0.600000023842, 0.5, 0.600000023842, 0.40000000596, 0.600000023842, 0.5, 0.800000011921, 0.600000023842, 0.600000023842, 0.20000000298, 0.10000000149, 0.600000023842, 0.899999976158, 0.699999988079, 0.699999988079, 0.600000023842, 0.300000011921, 0.600000023842, 0.20000000298, 0.40000000596, 0.40000000596, 0.300000011921, 0.10000000149, 0.800000011921, 0.20000000298, 0.699999988079, 0.5, 0.5, 0.800000011921, 0.20000000298, 0.5, 0.300000011921, 0.40000000596, 0.40000000596, 0.899999976158, 0.5, 0.699999988079, 0.40000000596, 0.20000000298, 0.20000000298, 0.899999976158, 0.10000000149, 0.20000000298, 0.10000000149, 0.40000000596, 0.800000011921, 0.5, 0.800000011921, 0.699999988079, 0.10000000149, 0.600000023842, 0.10000000149, 0.699999988079, 0.800000011921, 0.600000023842, 0.600000023842, 0.40000000596, 0.800000011921, 0.800000011921, 0.600000023842, 0.10000000149, 0.20000000298, 0.800000011921, 0.600000023842, 0.10000000149, 0.40000000596, 0.20000000298, 0.899999976158, 0.40000000596, 0.20000000298, 0.600000023842, 0.5, 0.300000011921, 0.600000023842, 0.300000011921, 0.40000000596, 0.5, 0.20000000298, 0.800000011921, 0.10000000149, 0.10000000149, 0.699999988079, 0.600000023842, 0.899999976158, 0.600000023842, 0.40000000596, 0.10000000149, 0.5, 0.800000011921, 0.899999976158, 0.20000000298, 0.40000000596, 0.5, 0.5, 0.10000000149, 0.800000011921, 0.5, 0.300000011921, 0.10000000149, 0.40000000596, 0.5, 0.10000000149, 0.10000000149, 0.40000000596, 0.5, 0.600000023842, 0.5, 0.800000011921, 0.40000000596, 0.600000023842, 0.5, 0.20000000298, 0.699999988079, 0.10000000149, 0.899999976158, 0.20000000298, 0.5, 0.600000023842, 0.699999988079, 0.899999976158, 0.20000000298, 0.10000000149, 0.10000000149, 0.10000000149, 0.300000011921, 0.5, 0.40000000596, 0.699999988079, 0.5, 0.600000023842, 0.899999976158, 0.10000000149, 0.5, 0.300000011921, 0.800000011921, 0.699999988079, 0.5, 0.10000000149, 0.5, 0.10000000149, 0.600000023842, 0.800000011921, 0.699999988079, 0.5, 0.300000011921, 0.40000000596, 0.5, 0.5, 0.40000000596, 0.40000000596, 0.699999988079, 0.40000000596, 0.20000000298, 0.10000000149, 0.899999976158, 0.5, 0.20000000298, 0.20000000298, 0.40000000596, 0.40000000596, 0.300000011921, 0.40000000596, 0.899999976158, 0.20000000298, 0.600000023842, 0.5, 0.10000000149, 0.899999976158, 0.10000000149, 0.10000000149, 0.40000000596, 0.600000023842, 0.40000000596, 0.10000000149, 0.10000000149, 0.300000011921, 0.699999988079, 0.20000000298, 0.300000011921, 0.40000000596, 0.5, 0.699999988079, 0.800000011921, 0.899999976158, 0.20000000298, 0.800000011921, 0.20000000298, 0.300000011921, 0.5, 0.5, 0.699999988079, 0.5, 0.20000000298, 0.20000000298, 0.300000011921, 0.20000000298, 0.10000000149, 0.10000000149, 0.10000000149, 0.699999988079, 0.10000000149, 0.800000011921, 0.20000000298, 0.40000000596, 0.800000011921, 0.800000011921, 0.5, 0.300000011921, 0.10000000149, 0.20000000298, 0.20000000298, 0.40000000596, 0.699999988079, 0.800000011921, 0.20000000298, 0.800000011921, 0.5, 0.300000011921, 0.899999976158, 0.5, 0.699999988079, 0.10000000149, 0.20000000298, 0.600000023842, 0.600000023842, 0.20000000298, 0.10000000149, 0.800000011921, 0.300000011921, 0.600000023842, 0.899999976158, 0.5, 0.800000011921, 0.800000011921, 0.20000000298, 0.800000011921, 0.20000000298, 0.5, 0.5, 0.10000000149, 0.699999988079, 0.699999988079, 0.300000011921, 0.899999976158, 0.5, 0.699999988079, 0.20000000298, 0.20000000298, 0.899999976158, 0.300000011921, 0.699999988079, 0.20000000298, 0.40000000596, 0.20000000298, 0.10000000149, 0.600000023842, 0.699999988079, 0.40000000596, 0.800000011921, 0.40000000596, 0.699999988079, 0.300000011921, 0.10000000149, 0.800000011921, 0.40000000596, 0.899999976158, 0.5, 0.800000011921, 0.5, 0.40000000596, 0.300000011921, 0.40000000596, 0.300000011921, 0.699999988079, 0.20000000298, 0.600000023842, 0.300000011921, 0.10000000149, 0.899999976158, 0.10000000149, 0.5, 
+
+L3_cGEMM_B_nk
+0.899999976158, 0.300000011921, 0.800000011921, 0.5, 0.699999988079, 0.20000000298, 0.699999988079, 0.600000023842, 0.5, 0.40000000596, 0.40000000596, 0.10000000149, 0.40000000596, 0.20000000298, 0.600000023842, 0.600000023842, 0.899999976158, 0.800000011921, 0.300000011921, 0.899999976158, 0.10000000149, 0.800000011921, 0.300000011921, 0.600000023842, 0.20000000298, 0.800000011921, 0.600000023842, 0.20000000298, 0.40000000596, 0.20000000298, 0.10000000149, 0.40000000596, 0.800000011921, 0.40000000596, 0.20000000298, 0.899999976158, 0.800000011921, 0.699999988079, 0.300000011921, 0.300000011921, 0.600000023842, 0.10000000149, 0.899999976158, 0.10000000149, 0.300000011921, 0.5, 0.899999976158, 0.40000000596, 0.600000023842, 0.40000000596, 0.5, 0.699999988079, 0.10000000149, 0.800000011921, 0.10000000149, 0.5, 0.899999976158, 0.800000011921, 0.40000000596, 0.699999988079, 0.800000011921, 0.600000023842, 0.40000000596, 0.699999988079, 0.699999988079, 0.300000011921, 0.300000011921, 0.10000000149, 0.899999976158, 0.300000011921, 0.899999976158, 0.20000000298, 0.699999988079, 0.699999988079, 0.699999988079, 0.10000000149, 0.40000000596, 0.899999976158, 0.800000011921, 0.5, 0.899999976158, 0.20000000298, 0.300000011921, 0.899999976158, 0.600000023842, 0.20000000298, 0.10000000149, 0.600000023842, 0.899999976158, 0.40000000596, 0.300000011921, 0.10000000149, 0.600000023842, 0.600000023842, 0.699999988079, 0.699999988079, 0.600000023842, 0.699999988079, 0.300000011921, 0.300000011921, 0.40000000596, 0.699999988079, 0.40000000596, 0.800000011921, 0.5, 0.699999988079, 0.20000000298, 0.5, 0.300000011921, 0.10000000149, 0.5, 0.20000000298, 0.20000000298, 0.600000023842, 0.699999988079, 0.899999976158, 0.300000011921, 0.800000011921, 0.300000011921, 0.699999988079, 0.800000011921, 0.899999976158, 0.5, 0.20000000298, 0.600000023842, 0.20000000298, 0.40000000596, 0.600000023842, 0.600000023842, 0.5, 0.300000011921, 0.600000023842, 0.300000011921, 0.600000023842, 0.20000000298, 0.800000011921, 0.40000000596, 0.699999988079, 0.899999976158, 0.20000000298, 0.699999988079, 0.40000000596, 0.10000000149, 0.899999976158, 0.20000000298, 0.300000011921, 0.10000000149, 0.300000011921, 0.20000000298, 0.20000000298, 0.20000000298, 0.600000023842, 0.699999988079, 0.5, 0.899999976158, 0.20000000298, 0.10000000149, 0.899999976158, 0.300000011921, 0.300000011921, 0.899999976158, 0.40000000596, 0.5, 0.699999988079, 0.5, 0.20000000298, 0.800000011921, 0.300000011921, 0.600000023842, 0.699999988079, 0.600000023842, 0.10000000149, 0.699999988079, 0.10000000149, 0.800000011921, 0.699999988079, 0.600000023842, 0.5, 0.20000000298, 0.899999976158, 0.800000011921, 0.699999988079, 0.10000000149, 0.600000023842, 0.10000000149, 0.10000000149, 0.40000000596, 0.300000011921, 0.600000023842, 0.699999988079, 0.899999976158, 0.600000023842, 0.699999988079, 0.300000011921, 0.10000000149, 0.600000023842, 0.800000011921, 0.40000000596, 0.5, 0.600000023842, 0.300000011921, 0.20000000298, 0.40000000596, 0.800000011921, 0.899999976158, 0.600000023842, 0.20000000298, 0.5, 0.800000011921, 0.899999976158, 0.20000000298, 0.10000000149, 0.899999976158, 0.800000011921, 0.5, 0.20000000298, 0.20000000298, 0.600000023842, 0.10000000149, 0.800000011921, 0.800000011921, 0.40000000596, 0.20000000298, 0.699999988079, 0.699999988079, 0.800000011921, 0.800000011921, 0.10000000149, 0.10000000149, 0.899999976158, 0.600000023842, 0.40000000596, 0.10000000149, 0.899999976158, 0.10000000149, 0.10000000149, 0.40000000596, 0.300000011921, 0.40000000596, 0.899999976158, 0.699999988079, 0.300000011921, 0.10000000149, 0.699999988079, 0.300000011921, 0.699999988079, 0.800000011921, 0.5, 0.600000023842, 0.10000000149, 0.10000000149, 0.10000000149, 0.5, 0.699999988079, 0.10000000149, 0.10000000149, 0.5, 0.699999988079, 0.699999988079, 0.899999976158, 0.5, 0.5, 0.300000011921, 0.5, 0.800000011921, 0.40000000596, 0.699999988079, 0.10000000149, 0.5, 0.10000000149, 0.899999976158, 0.300000011921, 0.699999988079, 0.5, 0.10000000149, 0.300000011921, 0.5, 0.699999988079, 0.5, 0.10000000149, 0.10000000149, 0.899999976158, 0.300000011921, 0.20000000298, 0.300000011921, 0.10000000149, 0.40000000596, 0.20000000298, 0.10000000149, 0.300000011921, 0.300000011921, 0.20000000298, 0.600000023842, 0.10000000149, 0.899999976158, 0.600000023842, 0.699999988079, 0.699999988079, 0.600000023842, 0.10000000149, 0.20000000298, 0.800000011921, 0.40000000596, 0.600000023842, 0.5, 0.800000011921, 0.600000023842, 0.600000023842, 0.899999976158, 0.800000011921, 0.600000023842, 0.899999976158, 0.699999988079, 0.5, 0.20000000298, 0.20000000298, 0.40000000596, 0.300000011921, 0.10000000149, 0.899999976158, 0.899999976158, 0.899999976158, 0.10000000149, 0.10000000149, 0.20000000298, 0.20000000298, 0.899999976158, 0.699999988079, 0.5, 0.600000023842, 0.300000011921, 0.600000023842, 0.5, 0.5, 0.40000000596, 0.20000000298, 0.899999976158, 0.600000023842, 0.699999988079, 0.800000011921, 0.899999976158, 0.699999988079, 0.800000011921, 0.300000011921, 0.899999976158, 0.699999988079, 0.20000000298, 0.5, 0.600000023842, 0.899999976158, 0.699999988079, 0.800000011921, 0.300000011921, 0.800000011921, 0.699999988079, 0.20000000298, 0.20000000298, 0.40000000596, 0.699999988079, 0.699999988079, 0.40000000596, 0.5, 0.40000000596, 0.5, 0.40000000596, 0.20000000298, 0.800000011921, 0.20000000298, 0.20000000298, 0.10000000149, 0.300000011921, 0.600000023842, 0.20000000298, 0.600000023842, 0.10000000149, 0.899999976158, 0.20000000298, 0.20000000298, 0.5, 0.20000000298, 0.899999976158, 0.20000000298, 0.20000000298, 0.899999976158, 0.20000000298, 0.20000000298, 0.300000011921, 0.800000011921, 0.699999988079, 0.5, 0.600000023842, 0.300000011921, 0.40000000596, 0.899999976158, 0.20000000298, 0.20000000298, 0.10000000149, 0.5, 0.600000023842, 0.600000023842, 0.40000000596, 0.899999976158, 0.800000011921, 0.5, 0.899999976158, 0.699999988079, 0.5, 0.899999976158, 0.20000000298, 0.40000000596, 0.699999988079, 0.699999988079, 0.899999976158, 0.899999976158, 0.300000011921, 0.800000011921, 0.10000000149, 0.10000000149, 0.800000011921, 0.5, 0.5, 0.600000023842, 0.40000000596, 0.40000000596, 0.300000011921, 0.300000011921, 0.300000011921, 0.10000000149, 0.40000000596, 0.300000011921, 0.300000011921, 0.40000000596, 0.800000011921, 0.699999988079, 0.600000023842, 0.300000011921, 0.40000000596, 0.899999976158, 0.899999976158, 0.899999976158, 0.10000000149, 0.5, 0.5, 0.5, 0.800000011921, 0.5, 0.600000023842, 0.699999988079, 0.600000023842, 0.10000000149, 0.20000000298, 0.600000023842, 0.10000000149, 0.10000000149, 0.699999988079, 0.40000000596, 0.800000011921, 0.10000000149, 0.800000011921, 0.800000011921, 0.800000011921, 0.40000000596, 0.600000023842, 0.300000011921, 0.40000000596, 0.40000000596, 0.20000000298, 0.40000000596, 0.300000011921, 0.600000023842, 0.5, 0.800000011921, 0.899999976158, 0.20000000298, 0.10000000149, 0.10000000149, 0.10000000149, 0.5, 0.5, 0.699999988079, 0.300000011921, 0.800000011921, 0.20000000298, 0.300000011921, 0.600000023842, 0.800000011921, 0.699999988079, 0.10000000149, 0.600000023842, 0.5, 0.699999988079, 0.899999976158, 0.699999988079, 0.300000011921, 0.5, 0.20000000298, 0.899999976158, 0.40000000596, 0.10000000149, 0.899999976158, 0.899999976158, 0.10000000149, 0.10000000149, 0.5, 0.40000000596, 0.5, 0.40000000596, 0.20000000298, 0.5, 0.800000011921, 0.40000000596, 0.899999976158, 0.20000000298, 0.300000011921, 0.899999976158, 0.5, 0.300000011921, 0.600000023842, 0.10000000149, 0.20000000298, 0.20000000298, 0.20000000298, 0.20000000298, 0.600000023842, 0.5, 0.600000023842, 0.40000000596, 0.800000011921, 0.5, 0.800000011921, 0.800000011921, 0.20000000298, 0.300000011921, 0.699999988079, 0.800000011921, 0.899999976158, 0.899999976158, 0.10000000149, 0.699999988079, 0.10000000149, 0.5, 0.300000011921, 0.899999976158, 0.20000000298, 
+
+L3_cGEMM_o_TT
+1.10999998763, 7.23000018194, 0.730000036657, 8.33000011116, 1.51999999464, 7.18000010148, 0.180000101477, 7.57000008181, 0.409999925047, 7.25000008941, 1.04000003695, 7.38000010222, 0.969999907464, 7.45000017062, 1.14000007644, 6.20000008941, 1.27999999866, 6.71000005618, 0.840000007153, 7.65000014454, 1.47999996141, 8.46000002265, -0.150000029802, 6.28000011414, -0.0299999919534, 8.29000003546, 1.20000004247, 7.32000011683, 0.389999950528, 6.84000012562, -1.11758715615e-08, 7.43000006646, 1.16999994919, 6.94000011593, 1.05999992579, 7.97000019431, 0.299999991804, 8.5800001432, 2.35999997199, 9.17000007734, 0.519999975264, 8.35000016689, -5.66244138245e-08, 7.780000135, 1.46000002638, 8.45000017956, 0.159999826699, 8.68000019684, 0.0700000058115, 6.67000007808, 0.210000008494, 6.45000011176, 0.479999945015, 8.00000011995, 1.05999991834, 9.83000010148, 1.18999993786, 7.22000006393, 0.369999932796, 9.42000004679, 1.0799999696, 7.58000012457, 1.67999995992, 7.74000018001, 0.549999929965, 8.420000128, 1.8599998863, 7.77000010043, 1.62999999195, 8.75000013486, 1.70000005513, 8.8800000985, 4.13999994978, 8.46000003308, 0.950000119209, 8.46000009343, 0.660000001043, 7.79000013232, 2.81000007108, 8.07000009894, 1.78999995947, 8.10000014007, 1.3500001207, 7.52000007361, 1.53000004187, 7.46000004202, 1.93000000462, 8.3700001049, 3.04999994934, 9.50000000969, 1.12000001848, 7.09000005335, 1.47000001624, 9.1500000596, 1.59000002801, 8.18000008807, 3.35999999583, 6.98000010967, 1.96999997824, 7.88000007316, 2.26999994174, 7.21000011206, 1.73999996319, 8.9200001362, 2.0599999921, 10.1100000964, 2.99000000939, 9.31000005841, 0.820000053495, 9.30000014156, 0.169999957383, 8.05000014454, 3.20000002906, 9.61000010163, 1.30999992356, 10.4500001132, -0.299999946356, 7.51000005469, 3.32999996364, 8.10000004172, 1.09999997467, 9.57000013247, 1.51999995291, 10.0600000808, 0.810000000298, 8.21000005692, 0.840000036955, 10.4200000431, 1.54000005558, 9.44000008091, 2.38999999598, 8.47000010863, 1.49999996051, 9.49000006527, 1.66999990299, 8.50000009611, -0.219999939501, 7.70000009611, -0.689999907315, 8.09000008538, 0.610000035316, 8.0700000155, -1.41999994174, 6.4400001137, -0.999999996275, 6.69000006527, -0.349999892712, 7.52000016823, -1.18000001281, 7.65000012964, -1.07999991819, 5.72000005648, 0.170000026673, 6.46000008747, -1.2799999398, 8.00000010431, -1.12999999717, 8.66000001967, -0.409999948889, 6.34000002205, -2.4099998416, 8.14000004813, -0.479999860823, 7.81000010908, -0.289999999702, 6.6500001356, -0.429999991953, 7.45000005737, 0.270000008047, 7.64000008613, -0.209999975711, 7.59000010848, -0.869999946207, 9.20000005588, 0.490000054091, 8.54000002652, -1.39999990314, 7.31000013366, -0.959999977946, 7.12000013396, 0.360000068843, 7.67000010937, -1.33000001654, 8.03000014842, -0.959999895245, 6.03000009254, -0.559999919087, 7.21000002265, -0.779999961406, 7.21000009939, -0.369999981225, 8.6200000304, -0.470000012517, 7.20000009313, -1.70999990642, 8.07000005946, -0.479999937564, 7.8200000833, 0.730000006109, 6.88000014022, -0.649999976158, 7.4900000757, 0.659999969751, 7.18000005677, -0.0799999703467, 8.29000009581, 0.440000084639, 9.03000005677, 1.84000001088, 8.24999998584, -1.16999989554, 8.11000007331, -0.619999993891, 6.67000016972, 0.690000073463, 7.48000011861, -0.129999993443, 7.69000016734, -1.59999985322, 6.78000004932, 0.880000026971, 7.40000005513, 0.220000002086, 7.83000007391, 0.0099999846518, 9.1800000523, 0.130000003129, 6.66000006065, -1.20999998316, 8.7800001052, 0.410000055432, 7.76000015005, 1.36000000775, 6.95000013337, 0.380000042617, 8.32000007659, 0.659999947399, 7.09000010476, 1.81000003755, 7.50000013486, 1.96000012919, 8.67000014141, 3.60000002384, 8.90000010282, 0.790000147223, 8.16000015751, 0.410000068098, 6.8600001508, 1.91000016794, 8.35000015274, 0.500000041723, 8.50000015125, 0.940000083148, 7.2800001432, 1.40000010878, 7.88000003219, 1.0400000228, 8.73000009924, 1.76000002712, 9.89000007793, 1.3700000602, 7.41000008002, 0.300000105053, 9.35000006557, 1.34000016287, 7.33000015512, 1.85000008345, 6.61000013813, 1.40000005662, 8.52000009298, 2.1099999921, 7.36000014111, -0.059999923557, 6.69000015616, -0.369999908209, 8.19000008762, 0.840000086874, 8.43000000313, -1.63999990582, 6.99000010923, -1.21999992982, 6.71000010237, -0.429999883175, 7.80000013784, -1.06999999091, 6.670000166, -0.959999873638, 6.54000003844, 0.300000096858, 6.56000007927, -0.929999926388, 6.94000011593, -2.13999998257, 7.48000003293, 0.0200000415742, 5.57000008553, -1.20999989673, 7.3900001137, -0.249999904633, 6.17000018314, 0.0100000748038, 6.06000011355, -1.60999989226, 6.99000010476, 0.149999987334, 6.6800000672, 0.11999998793, 7.330000135, -0.720000002831, 7.44000010848, 1.44000002876, 8.26000000924, -0.489999943823, 6.78000007167, -1.16000000104, 6.37000002667, 0.230000029206, 7.91000008374, -1.34000005186, 6.38000008956, -0.239999960959, 7.2000000447, 0.280000018775, 5.9200000751, -0.310000005513, 7.80000001788, 0.0100000099838, 8.37000000358, -0.0599999727309, 6.60000000596, -1.27999997109, 8.3700000006, -0.359999961555, 6.75000010431, 0.850000023097, 6.06000008672, 0.38999997735, 7.41000002265, 1.16999992162, 7.53000000536, 
+
+L3_cGEMM_o_HH
+1.10999998763, -5.6300001581, 0.730000036657, -6.73000008732, 1.51999999464, -6.58000007764, 0.180000101477, -6.17000010565, 0.409999925047, -5.45000013709, 1.04000003695, -6.38000010222, 0.969999907464, -6.25000012293, 1.14000007644, -5.80000008345, 1.27999999866, -6.31000005022, 0.840000007153, -6.85000013262, 1.47999996141, -7.46000002265, -0.150000029802, -5.28000011414, -0.0299999919534, -7.08999998778, 1.20000004247, -6.5200001049, 0.389999950528, -5.0400001733, -1.11758715615e-08, -7.23000006348, 1.16999994919, -6.14000010401, 1.05999992579, -6.37000017047, 0.299999991804, -8.38000014022, 2.35999997199, -7.77000010118, 0.519999975264, -6.95000019073, -5.66244138245e-08, -6.780000135, 1.46000002638, -7.25000013188, 0.159999826699, -6.88000024453, 0.0700000058115, -6.4700000751, 0.210000008494, -5.65000009984, 0.479999945015, -7.60000011399, 1.05999991834, -8.23000007764, 1.18999993786, -6.82000005797, 0.369999932796, -7.62000009447, 1.0799999696, -7.18000011861, 1.67999995992, -6.54000013232, 0.549999929965, -7.62000011608, 1.8599998863, -7.37000009447, 1.62999999195, -6.95000018254, 1.70000005513, -7.8800000985, 4.13999994978, -8.2600000301, 0.950000119209, -8.06000008747, 0.660000001043, -6.19000010848, 2.81000007108, -7.87000009596, 1.78999995947, -6.50000011623, 1.3500001207, -6.52000007361, 1.53000004187, -6.06000006586, 1.93000000462, -8.17000010192, 3.04999994934, -8.50000000969, 1.12000001848, -6.89000005037, 1.47000001624, -8.1500000596, 1.59000002801, -6.78000011191, 3.35999999583, -6.38000008583, 1.96999997824, -7.68000007018, 2.26999994174, -7.01000010908, 1.73999996319, -8.12000012428, 2.0599999921, -8.51000007257, 2.99000000939, -7.71000003457, 0.820000053495, -7.70000011772, 0.169999957383, -6.4500001207, 3.20000002906, -9.01000007778, 1.30999992356, -8.85000008941, -0.299999946356, -7.31000005171, 3.32999996364, -7.50000001788, 1.09999997467, -7.97000010863, 1.51999995291, -9.26000006884, 0.810000000298, -7.21000005692, 0.840000036955, -9.42000004306, 1.54000005558, -8.04000010476, 2.38999999598, -7.07000013247, 1.49999996051, -7.89000004143, 1.66999990299, -7.70000008419, -0.219999939501, -5.9000001438, -0.689999907315, -6.69000010923, 0.610000035316, -6.67000003934, -1.41999994174, -5.64000010177, -0.999999996275, -4.89000011295, -0.349999892712, -6.52000016823, -1.18000001281, -6.0500001058, -1.07999991819, -5.5200000535, 0.170000026673, -5.26000003979, -1.2799999398, -6.60000012815, -1.12999999717, -6.86000006735, -0.409999948889, -4.9400000459, -2.4099998416, -7.94000004515, -0.479999860823, -6.61000006139, -0.289999999702, -5.25000015944, -0.429999991953, -5.85000003353, 0.270000008047, -6.44000003844, -0.209999975711, -7.19000010252, -0.869999946207, -7.80000007972, 0.490000054091, -6.94000000268, -1.39999990314, -7.11000013068, -0.959999977946, -5.52000011012, 0.360000068843, -7.47000010639, -1.33000001654, -6.43000012457, -0.959999895245, -5.83000008956, -0.559999919087, -6.60999999881, -0.779999961406, -6.61000007555, -0.369999981225, -6.82000007808, -0.470000012517, -5.60000006929, -1.70999990642, -7.27000004753, -0.479999937564, -6.02000013098, 0.730000006109, -6.28000011638, -0.649999976158, -7.29000007272, 0.659999969751, -6.78000005081, -0.0799999703467, -6.89000011966, 0.440000084639, -7.63000008062, 1.84000001088, -7.649999962, -1.16999989554, -6.71000009716, -0.619999993891, -5.07000014588, 0.690000073463, -7.28000011563, -0.129999993443, -7.29000016138, -1.59999985322, -5.38000007316, 0.880000026971, -6.80000003129, 0.220000002086, -6.83000007391, 0.0099999846518, -7.98000000462, 0.130000003129, -6.06000003681, -1.20999998316, -7.58000005752, 0.410000055432, -6.16000012621, 1.36000000775, -5.55000015721, 0.380000042617, -6.72000005275, 0.659999947399, -5.29000015244, 1.81000003755, -7.1000001289, 1.96000012919, -8.27000013545, 3.60000002384, -7.70000005513, 0.790000147223, -7.16000015751, 0.410000068098, -6.46000014484, 1.91000016794, -7.55000014082, 0.500000041723, -8.10000014529, 0.940000083148, -6.08000009552, 1.40000010878, -6.08000007987, 1.0400000228, -7.33000012308, 1.76000002712, -8.89000007793, 1.3700000602, -6.01000010386, 0.300000105053, -7.95000008941, 1.34000016287, -7.13000015214, 1.85000008345, -6.41000013515, 1.40000005662, -8.32000009, 2.1099999921, -5.76000011727, -0.059999923557, -5.09000013232, -0.369999908209, -7.59000006378, 0.840000086874, -6.63000005081, -1.63999990582, -5.99000010923, -1.21999992982, -6.11000007853, -0.429999883175, -6.60000009015, -1.06999999091, -5.27000018984, -0.959999873638, -4.74000008613, 0.300000096858, -5.76000006735, -0.929999926388, -5.54000013977, -2.13999998257, -7.28000002995, 0.0200000415742, -5.17000007957, -1.20999989673, -6.99000010774, -0.249999904633, -5.77000017717, 0.0100000748038, -5.66000010759, -1.60999989226, -5.99000010476, 0.149999987334, -6.08000004336, 0.11999998793, -6.13000008732, -0.720000002831, -6.2400000608, 1.44000002876, -6.86000003308, -0.489999943823, -6.38000006571, -1.16000000104, -6.17000002369, 0.230000029206, -6.71000003606, -1.34000005186, -5.9800000836, -0.239999960959, -6.2000000447, 0.280000018775, -5.12000006318, -0.310000005513, -6.00000006557, 0.0100000099838, -6.76999997973, -0.0599999727309, -5.2000000298, -1.27999997109, -6.57000004828, -0.359999961555, -6.35000009835, 0.850000023097, -4.86000003904, 0.38999997735, -6.01000004649, 1.16999992162, -6.13000002921, 
+
+L3_zGEMM_A_mk
+0.8, 0.1, 0.1, 0.7, 0.9, 0.8, 0.9, 0.6, 0.6, 0.4, 0.6, 0.2, 0.5, 0.5, 0.6, 0.6, 0.8, 0.8, 0.8, 0.7, 0.5, 0.8, 0.1, 0.1, 0.6, 0.8, 0.5, 0.3, 0.8, 0.8, 0.7, 0.1, 0.6, 0.9, 0.2, 0.5, 0.6, 0.6, 0.3, 0.7, 0.5, 0.5, 0.4, 0.4, 0.5, 0.6, 0.9, 0.9, 0.2, 0.1, 0.5, 0.5, 0.9, 0.4, 0.8, 0.3, 0.9, 0.4, 0.7, 0.1, 0.1, 0.6, 0.4, 0.3, 0.6, 0.6, 0.7, 0.3, 0.8, 0.6, 0.5, 0.9, 0.2, 0.7, 0.2, 0.2, 0.8, 0.1, 0.4, 0.1, 0.1, 0.2, 0.6, 0.9, 0.5, 0.9, 0.9, 0.7, 0.1, 0.3, 0.5, 0.4, 0.5, 0.3, 0.4, 0.3, 0.5, 0.6, 0.3, 0.2, 0.1, 0.5, 0.2, 0.9, 0.3, 0.4, 0.1, 0.2, 0.6, 0.9, 0.4, 0.7, 0.3, 0.5, 0.3, 0.6, 0.5, 0.1, 0.9, 0.3, 0.3, 0.9, 0.2, 0.4, 0.7, 0.6, 0.1, 0.9, 0.7, 0.2, 0.1, 0.9, 0.5, 0.9, 0.9, 0.2, 0.4, 0.2, 0.7, 0.8, 0.7, 0.1, 0.1, 0.8, 0.8, 0.5, 0.4, 0.1, 0.8, 0.1, 0.2, 0.2, 0.7, 0.8, 0.9, 0.7, 0.4, 0.3, 0.3, 0.5, 0.1, 0.1, 0.5, 0.2, 0.1, 0.6, 0.2, 0.6, 0.7, 0.7, 0.7, 0.8, 0.9, 0.7, 0.9, 0.2, 0.3, 0.8, 0.3, 0.7, 0.5, 0.2, 0.5, 0.4, 0.6, 0.6, 0.6, 0.1, 0.8, 0.8, 0.3, 0.5, 0.8, 0.4, 0.8, 0.6, 0.7, 0.9, 0.5, 0.1, 0.3, 0.5, 0.9, 0.3, 0.9, 0.9, 0.4, 0.6, 0.5, 0.1, 0.6, 0.7, 0.4, 0.4, 0.9, 0.6, 0.9, 0.4, 0.5, 0.2, 0.3, 0.1, 0.7, 0.9, 0.7, 0.2, 0.6, 0.5, 0.2, 0.6, 0.2, 0.4, 0.8, 0.2, 0.5, 0.7, 0.1, 0.1, 0.3, 0.5, 0.2, 0.7, 0.4, 0.5, 0.5, 0.7, 0.7, 0.1, 0.1, 0.8, 0.8, 0.8, 0.2, 0.7, 0.8, 0.6, 0.1, 0.8, 0.8, 0.4, 0.1, 0.5, 0.7, 0.7, 0.7, 0.5, 0.1, 0.2, 0.1, 0.1, 0.1, 0.4, 0.7, 0.5, 0.2, 0.7, 0.8, 0.5, 0.8, 0.9, 0.5, 0.7, 0.4, 0.6, 0.6, 0.4, 0.8, 0.2, 0.9, 0.8, 0.8, 0.1, 0.6, 0.3, 0.2, 0.1, 0.3, 0.5, 0.5, 0.2, 0.4, 0.5, 0.1, 0.2, 0.8, 0.3, 0.7, 0.8, 0.7, 0.9, 0.4, 0.7, 0.7, 0.9, 0.7, 0.9, 0.5, 0.1, 0.4, 0.2, 
+
+L3_zGEMM_B_kn
+0.2, 0.8, 0.2, 0.2, 0.2, 0.2, 0.5, 0.2, 0.1, 0.1, 0.2, 0.5, 0.3, 0.8, 0.2, 0.3, 0.4, 0.4, 0.9, 0.7, 0.9, 0.7, 0.3, 0.7, 0.9, 0.4, 0.4, 0.9, 0.3, 0.9, 0.4, 0.2, 0.6, 0.3, 0.2, 0.8, 0.7, 0.3, 0.6, 0.7, 0.5, 0.5, 0.3, 0.2, 0.7, 0.7, 0.5, 0.3, 0.8, 0.8, 0.2, 0.2, 0.8, 0.2, 0.4, 0.4, 0.4, 0.1, 0.4, 0.7, 0.6, 0.2, 0.2, 0.2, 0.8, 0.8, 0.6, 0.2, 0.7, 0.9, 0.1, 0.8, 0.9, 0.3, 0.6, 0.6, 0.5, 0.7, 0.8, 0.5, 0.8, 0.9, 0.9, 0.4, 0.2, 0.4, 0.4, 0.3, 0.4, 0.1, 0.2, 0.5, 0.7, 0.1, 0.5, 0.3, 0.8, 0.4, 0.2, 0.6, 0.7, 0.8, 0.4, 0.4, 0.2, 0.3, 0.6, 0.1, 0.9, 0.9, 0.8, 0.9, 0.1, 0.4, 0.5, 0.4, 0.2, 0.2, 0.8, 0.2, 0.2, 0.4, 0.8, 0.2, 0.7, 0.1, 0.6, 0.5, 0.6, 0.5, 0.3, 0.6, 0.5, 0.6, 0.1, 0.8, 0.6, 0.3, 0.8, 0.4, 0.7, 0.4, 0.9, 0.1, 0.7, 0.6, 0.5, 0.5, 0.2, 0.7, 0.4, 0.5, 0.2, 0.6, 0.2, 0.9, 0.9, 0.7, 0.6, 0.2, 0.8, 0.2, 0.4, 0.6, 0.6, 0.5, 0.6, 0.5, 0.2, 0.4, 0.3, 0.5, 0.9, 0.3, 0.4, 0.1, 0.1, 0.5, 0.8, 0.4, 0.2, 0.4, 0.3, 0.6, 0.7, 0.4, 0.3, 0.9, 0.6, 0.6, 0.2, 0.2, 0.1, 0.7, 0.2, 0.1, 0.2, 0.7, 0.1, 0.7, 0.2, 0.6, 0.6, 0.8, 0.7, 0.7, 0.5, 0.3, 0.2, 0.7, 0.8, 0.7, 0.9, 0.8, 0.2, 0.3, 0.3, 0.8, 0.7, 0.3, 0.9, 0.9, 0.1, 0.6, 0.8, 0.6, 0.8, 0.7, 0.8, 0.4, 0.3, 0.9, 0.8, 0.9, 0.9, 0.6, 0.3, 0.9, 0.7, 0.1, 0.1, 0.2, 0.1, 0.2, 0.9, 0.3, 0.4, 0.3, 0.7, 0.1, 0.5, 0.5, 0.3, 0.6, 0.8, 0.1, 0.1, 0.9, 0.4, 0.1, 0.6, 0.6, 0.7, 0.3, 0.2, 0.7, 0.7, 0.7, 0.6, 0.1, 0.4, 0.8, 0.6, 0.3, 0.5, 0.4, 0.8, 0.1, 0.4, 0.2, 0.9, 0.4, 0.4, 0.4, 0.5, 0.4, 0.3, 0.1, 0.8, 0.7, 0.4, 0.6, 0.7, 0.9, 0.9, 0.3, 0.2, 0.4, 0.1, 0.6, 0.8, 0.6, 0.4, 0.7, 0.6, 0.6, 0.1, 0.4, 0.9, 0.4, 0.6, 0.1, 0.7, 0.6, 0.9, 0.8, 0.1, 0.4, 0.7, 0.4, 0.3, 0.8, 0.9, 0.8, 0.5, 0.2, 0.4, 0.3, 0.2, 0.4, 0.6, 0.8, 0.1, 0.8, 0.6, 0.3, 0.6, 0.1, 0.4, 0.6, 0.5, 0.8, 0.3, 0.2, 0.1, 0.7, 0.3, 0.5, 0.1, 0.3, 0.6, 0.1, 0.8, 0.1, 0.5, 0.1, 0.9, 0.7, 0.1, 0.7, 0.5, 0.6, 0.9, 0.8, 0.1, 0.4, 0.6, 0.2, 0.7, 0.3, 0.8, 0.9, 0.8, 0.4, 0.8, 0.6, 0.3, 0.6, 0.3, 0.6, 0.1, 0.7, 0.9, 0.4, 0.6, 0.3, 0.5, 0.7, 0.6, 0.1, 0.4, 0.6, 0.5, 0.4, 0.4, 0.8, 0.3, 0.6, 0.4, 0.4, 0.9, 0.2, 0.4, 0.7, 0.6, 0.1, 0.4, 0.4, 0.6, 0.6, 0.3, 0.2, 0.9, 0.8, 0.5, 0.9, 0.4, 0.4, 0.2, 0.6, 0.6, 0.6, 0.8, 0.6, 0.6, 0.8, 0.4, 0.2, 0.4, 0.4, 0.9, 0.1, 0.5, 0.1, 0.9, 0.1, 0.4, 0.7, 0.7, 0.2, 0.3, 0.6, 0.9, 0.1, 0.7, 0.6, 0.2, 0.8, 0.6, 0.3, 0.5, 0.7, 0.1, 0.1, 0.7, 0.6, 0.9, 0.8, 0.3, 0.4, 0.1, 0.7, 0.8, 0.4, 0.9, 0.2, 0.2, 0.9, 0.2, 0.6, 0.1, 0.3, 0.6, 0.8, 0.3, 0.4, 0.6, 0.6, 0.4, 0.5, 0.1, 0.3, 0.7, 0.3, 0.9, 0.6, 0.1, 0.8, 0.5, 0.1, 0.1, 0.1, 0.6, 0.8, 0.6, 0.3, 0.8, 0.2, 0.8, 0.7, 0.9, 0.4, 0.7, 0.4, 0.5, 0.9, 0.9, 0.5, 0.7, 0.8, 0.7, 0.4, 0.5, 0.8, 0.1, 0.8, 0.1, 0.7, 0.4, 0.7, 0.4, 0.3, 0.7, 0.9, 0.7, 0.4, 0.3, 0.1, 0.9, 0.5, 0.5, 0.2, 0.5, 0.7, 0.3, 0.1, 0.4, 0.1, 0.3, 0.8, 0.2, 0.5, 0.2, 0.4, 
+
+L3_zGEMM_C_mn
+0.1, 0.9, 0.1, 0.6, 0.2, 0.3, 0.2, 0.6, 0.2, 0.1, 0.5, 0.5, 0.5, 0.7, 0.3, 0.2, 0.2, 0.6, 0.3, 0.5, 0.6, 0.7, 0.9, 0.9, 0.4, 0.9, 0.1, 0.1, 0.3, 0.3, 0.6, 0.9, 0.7, 0.6, 0.4, 0.6, 0.6, 0.4, 0.4, 0.5, 0.3, 0.8, 0.8, 0.5, 0.8, 0.1, 0.3, 0.6, 0.9, 0.4, 0.6, 0.6, 0.3, 0.9, 0.7, 0.6, 0.5, 0.6, 0.9, 0.1, 0.6, 0.8, 0.2, 0.1, 0.7, 0.8, 0.5, 0.4, 0.5, 0.6, 0.7, 0.8, 0.3, 0.7, 0.7, 0.9, 0.2, 0.7, 0.5, 0.6, 0.6, 0.2, 0.8, 0.7, 0.7, 0.5, 0.4, 0.9, 0.9, 0.7, 0.9, 0.6, 0.8, 0.1, 0.4, 0.5, 0.6, 0.1, 0.9, 0.3, 0.5, 0.6, 0.1, 0.3, 0.2, 0.2, 0.6, 0.7, 0.4, 0.7, 0.7, 0.3, 0.1, 0.6, 0.3, 0.2, 0.7, 0.4, 0.9, 0.4, 0.4, 0.6, 0.3, 0.5, 0.4, 0.8, 0.7, 0.2, 0.5, 0.9, 0.6, 0.6, 0.6, 0.2, 0.5, 0.5, 0.7, 0.7, 0.8, 0.2, 0.5, 0.6, 0.8, 0.7, 0.6, 0.8, 0.6, 0.7, 0.7, 0.3, 0.5, 0.7, 0.1, 0.5, 0.1, 0.2, 0.5, 0.5, 0.9, 0.6, 0.4, 0.8, 0.3, 0.4, 0.2, 0.9, 0.7, 0.3, 0.5, 0.4, 0.8, 0.4, 0.9, 0.5, 0.6, 0.4, 0.8, 0.4, 0.4, 0.7, 0.7, 0.4, 0.4, 0.7, 0.1, 0.7, 0.1, 0.5, 0.5, 0.3, 0.3, 0.1, 0.7, 0.1, 0.4, 0.4, 0.3, 0.4, 0.6, 0.1, 0.1, 0.4, 0.6, 0.9, 0.6, 0.8, 0.6, 0.4, 0.1, 0.4, 0.4, 0.3, 0.8, 0.5, 0.2, 0.2, 0.6, 0.1, 0.6, 0.2, 0.2, 0.5, 0.4, 0.1, 0.2, 0.4, 0.4, 0.4, 0.9, 0.4, 0.5, 0.3, 0.9, 0.5, 0.7, 0.2, 0.8, 0.5, 0.7, 0.4, 0.3, 0.8, 0.7, 0.7, 0.3, 0.7, 0.4, 0.1, 0.6, 0.3, 0.3, 0.9, 0.5, 0.5, 0.7, 0.2, 0.4, 0.1, 0.6, 0.5, 0.8, 0.4, 0.3, 0.6, 0.3, 0.9, 0.2, 0.6, 0.9, 0.5, 0.1, 0.3, 0.8, 0.1, 0.4, 0.5, 0.2, 0.8, 0.3, 0.7, 0.6, 0.8, 0.9, 0.2, 0.3, 0.5, 0.7, 0.9, 0.5, 0.4, 0.1, 0.8, 0.2, 0.3, 0.2, 0.3, 0.3, 0.5, 0.1, 0.6, 0.1, 0.2, 0.1, 0.7, 0.5, 0.2, 0.5, 0.4, 0.8, 0.8, 0.8, 0.4, 0.6, 0.7, 0.7, 0.1, 0.7, 0.4, 0.1, 0.5, 0.9, 0.4, 0.8, 0.3, 0.2, 0.3, 0.2, 0.3, 0.2, 0.2, 0.1, 0.9, 0.7, 0.5, 0.6, 0.2, 0.5, 0.2, 0.7, 0.6, 
+
+L3_zGEMM_o_NN
+0.77, 10.23, 1.25, 8.29, 1.15, 7.99, 1.58, 10.38, 1.75, 10.51, 0.21, 7.72, 1.79, 10.8, 1.62, 8.23, 1.02, 10.89, 0.56, 8.66, 3.2, 9.29, 2.99, 10.69, 2.5, 8.87, 0.3, 8.99, 0.63, 10.83, 1.45, 10.68, 0.02, 10.67, 1.01, 8.88, 1.26, 6.88, 0.89, 7.69, 0.92, 9.92, 1.41, 9.07, 0.95, 5.97, 0.63, 9.39, 2.5, 7.67, 1.37, 9.5, -0.64, 8.89, 2.39, 8.93, 1.61, 8.84, 2.29, 8.03, 0.4, 8.33, -0.53, 8.91, 2.12, 9.04, -0.44, 8.73, 0.63, 8.83, 0.98, 7.59, 0.28, 7.64, 1.0, 9.15, 0.74, 9.24, 0.67, 6.44, 0.87, 8.8, 2.15, 7.46, 0.84, 8.66, 0.08, 7.71, 2.09, 8.46, 1.62, 8.5, 1.94, 7.35, 0.55, 7.89, 0.36, 8.24, 1.88, 8.24, 0.07, 8.38, -0.97, 8.35, -0.93, 6.09, -1.12, 7.07, -1.27, 8.66, -0.64, 8.45, -1.28, 5.75, -1.93, 7.73, -0.11, 6.72, -0.19, 8.87, -1.51, 7.25, 0.42, 8.7, -0.07, 9.06, 0.81, 7.58, -0.92, 7.62, -2.14, 8.62, 0.53, 7.6, -2.14, 7.19, 1.64, 9.23, 1.65, 6.86, 1.01, 7.77, 1.79, 8.81, 2.23, 9.44, 0.16, 7.07, 1.05, 8.99, 1.48, 8.48, 1.54, 8.81, -0.22, 8.04, 3.33, 8.06, 3.28, 8.42, 2.01, 7.68, 0.78, 8.07, 0.13, 9.18, 1.72, 8.7, 0.1, 8.96, 1.3, 8.52, 1.47, 7.53, 0.54, 8.03, 1.19, 8.62, 0.8, 10.44, 0.07, 6.16, -0.07, 8.92, 1.39, 8.08, -0.37, 9.64, -0.41, 8.09, 1.6, 8.07, 1.97, 8.46, 1.91, 7.77, -0.18, 7.92, -0.54, 9.15, 1.26, 8.68, -1.0, 9.28, 1.6, 10.65, 1.88, 8.02, 0.83, 8.24, 1.21, 9.85, 2.62, 10.0, 0.94, 7.64, 0.96, 10.26, 2.97, 8.94, 1.48, 10.04, 1.24, 8.4, 2.65, 8.92, 1.86, 9.0, 3.3, 8.37, 1.51, 8.53, 0.9, 10.65, 2.73, 9.14, 0.91, 9.63, 0.48, 8.32, 0.62, 7.74, -0.25, 7.67, -0.35, 8.03, 0.06, 8.18, 0.1, 5.83, -0.12, 9.69, 0.93, 8.09, -0.56, 8.0, -0.2, 7.5, 1.75, 8.2, 0.9, 8.66, 0.57, 7.22, -0.22, 7.78, -1.49, 8.31, 0.38, 8.45, -1.55, 7.58, 0.76, 8.22, 0.68, 7.18, 0.08, 8.24, -0.12, 8.94, 0.96, 9.37, 0.6, 6.24, -0.02, 8.54, 1.3, 7.65, 0.13, 8.57, -0.58, 7.94, 0.95, 8.66, 1.5, 7.96, 0.31, 7.76, 0.14, 7.31, -1.16, 8.16, 1.0, 9.32, -0.63, 7.6, 0.9, 9.38, 2.12, 7.8, 1.0, 7.42, 1.17, 8.76, 1.78, 8.35, 1.14, 6.6, 0.58, 9.29, 2.4, 8.22, 0.85, 9.46, 0.34, 7.38, 1.5, 8.77, 1.66, 8.64, 1.16, 8.24, 0.79, 8.14, 0.39, 8.69, 2.01, 9.11, 1.1, 8.59, 
+
+L3_zGEMM_A_km
+0.7, 0.7, 0.6, 0.5, 0.1, 0.5, 0.2, 0.4, 0.7, 0.9, 0.7, 0.1, 0.9, 0.1, 0.2, 0.4, 0.8, 0.9, 0.9, 0.4, 0.1, 0.2, 0.2, 0.8, 0.7, 0.9, 0.5, 0.7, 0.1, 0.7, 0.1, 0.2, 0.8, 0.5, 0.8, 0.4, 0.7, 0.2, 0.9, 0.7, 0.2, 0.6, 0.4, 0.6, 0.8, 0.1, 0.2, 0.7, 0.4, 0.6, 0.6, 0.6, 0.8, 0.1, 0.8, 0.5, 0.2, 0.7, 0.9, 0.9, 0.3, 0.9, 0.6, 0.3, 0.3, 0.2, 0.8, 0.5, 0.1, 0.9, 0.7, 0.1, 0.1, 0.3, 0.8, 0.7, 0.6, 0.2, 0.8, 0.4, 0.5, 0.3, 0.4, 0.2, 0.5, 0.5, 0.8, 0.4, 0.9, 0.8, 0.2, 0.3, 0.6, 0.4, 0.7, 0.7, 0.4, 0.8, 0.5, 0.9, 0.3, 0.4, 0.9, 0.3, 0.2, 0.7, 0.5, 0.1, 0.6, 0.7, 0.2, 0.2, 0.9, 0.4, 0.5, 0.1, 0.5, 0.4, 0.6, 0.8, 0.5, 0.8, 0.3, 0.2, 0.6, 0.9, 0.5, 0.8, 0.5, 0.3, 0.7, 0.2, 0.1, 0.6, 0.1, 0.7, 0.6, 0.4, 0.5, 0.9, 0.5, 0.1, 0.5, 0.8, 0.4, 0.3, 0.1, 0.7, 0.6, 0.1, 0.7, 0.4, 0.9, 0.3, 0.5, 0.3, 0.9, 0.3, 0.9, 0.1, 0.1, 0.9, 0.4, 0.1, 0.5, 0.7, 0.5, 0.2, 0.2, 0.8, 0.8, 0.7, 0.8, 0.3, 0.5, 0.3, 0.1, 0.4, 0.8, 0.9, 0.5, 0.2, 0.6, 0.9, 0.5, 0.5, 0.8, 0.8, 0.3, 0.6, 0.5, 0.9, 0.2, 0.7, 0.3, 0.8, 0.5, 0.2, 0.6, 0.2, 0.1, 0.2, 0.1, 0.8, 0.5, 0.8, 0.6, 0.3, 0.2, 0.7, 0.8, 0.9, 0.4, 0.6, 0.6, 0.5, 0.1, 0.8, 0.8, 0.7, 0.8, 0.9, 0.3, 0.9, 0.5, 0.1, 0.6, 0.7, 0.3, 0.2, 0.8, 0.6, 0.3, 0.1, 0.3, 0.6, 0.7, 0.9, 0.5, 0.9, 0.4, 0.7, 0.4, 0.4, 0.9, 0.9, 0.5, 0.6, 0.3, 0.8, 0.2, 0.1, 0.1, 0.1, 0.3, 0.2, 0.8, 0.2, 0.4, 0.9, 0.8, 0.1, 0.2, 0.8, 0.7, 0.2, 0.9, 0.4, 0.1, 0.2, 0.6, 0.4, 0.1, 0.8, 0.4, 0.2, 0.8, 0.1, 0.7, 0.8, 0.3, 0.1, 0.1, 0.9, 0.2, 0.2, 0.6, 0.3, 0.2, 0.5, 0.2, 0.4, 0.6, 0.1, 0.8, 0.6, 0.1, 0.1, 0.2, 0.9, 0.9, 0.4, 0.1, 0.4, 0.9, 0.7, 0.7, 0.5, 0.2, 0.4, 0.7, 0.7, 0.1, 0.7, 0.5, 0.1, 0.4, 0.3, 0.5, 0.6, 
+
+L3_zGEMM_B_nk
+0.3, 0.9, 0.9, 0.7, 0.2, 0.6, 0.2, 0.1, 0.7, 0.1, 0.6, 0.8, 0.1, 0.3, 0.8, 0.2, 0.4, 0.7, 0.8, 0.4, 0.6, 0.8, 0.2, 0.9, 0.6, 0.8, 0.8, 0.6, 0.7, 0.4, 0.5, 0.9, 0.5, 0.6, 0.4, 0.6, 0.6, 0.2, 0.9, 0.2, 0.5, 0.9, 0.9, 0.6, 0.5, 0.9, 0.8, 0.4, 0.5, 0.8, 0.1, 0.7, 0.6, 0.5, 0.4, 0.7, 0.7, 0.5, 0.2, 0.9, 0.5, 0.3, 0.5, 0.4, 0.9, 0.9, 0.4, 0.6, 0.3, 0.9, 0.7, 0.7, 0.3, 0.3, 0.4, 0.5, 0.3, 0.6, 0.5, 0.1, 0.6, 0.8, 0.6, 0.5, 0.5, 0.4, 0.5, 0.6, 0.6, 0.4, 0.2, 0.6, 0.9, 0.2, 0.6, 0.6, 0.5, 0.1, 0.9, 0.9, 0.7, 0.6, 0.4, 0.9, 0.2, 0.5, 0.7, 0.1, 0.2, 0.5, 0.6, 0.1, 0.5, 0.8, 0.3, 0.9, 0.6, 0.1, 0.7, 0.1, 0.5, 0.1, 0.4, 0.4, 0.5, 0.4, 0.7, 0.7, 0.8, 0.1, 0.9, 0.5, 0.2, 0.2, 0.6, 0.9, 0.6, 0.9, 0.3, 0.9, 0.4, 0.6, 0.4, 0.7, 0.1, 0.5, 0.3, 0.5, 0.4, 0.6, 0.2, 0.1, 0.2, 0.4, 0.3, 0.1, 0.2, 0.5, 0.6, 0.6, 0.4, 0.6, 0.9, 0.9, 0.4, 0.8, 0.4, 0.1, 0.3, 0.4, 0.1, 0.7, 0.9, 0.3, 0.5, 0.8, 0.7, 0.3, 0.5, 0.6, 0.4, 0.9, 0.8, 0.1, 0.3, 0.6, 0.6, 0.4, 0.7, 0.4, 0.7, 0.6, 0.7, 0.2, 0.5, 0.4, 0.8, 0.6, 0.3, 0.7, 0.9, 0.3, 0.2, 0.5, 0.4, 0.5, 0.4, 0.4, 0.6, 0.7, 0.4, 0.9, 0.1, 0.6, 0.1, 0.8, 0.8, 0.8, 0.4, 0.8, 0.9, 0.3, 0.9, 0.3, 0.7, 0.7, 0.6, 0.7, 0.6, 0.3, 0.4, 0.8, 0.9, 0.1, 0.6, 0.2, 0.1, 0.5, 0.2, 0.5, 0.9, 0.9, 0.6, 0.7, 0.8, 0.8, 0.4, 0.5, 0.7, 0.7, 0.1, 0.8, 0.6, 0.2, 0.9, 0.4, 0.4, 0.9, 0.1, 0.2, 0.3, 0.1, 0.7, 0.1, 0.2, 0.7, 0.3, 0.5, 0.3, 0.7, 0.9, 0.3, 0.5, 0.6, 0.3, 0.7, 0.6, 0.5, 0.7, 0.2, 0.3, 0.6, 0.8, 0.8, 0.6, 0.1, 0.5, 0.5, 0.2, 0.6, 0.3, 0.2, 0.8, 0.2, 0.8, 0.8, 0.2, 0.9, 0.6, 0.8, 0.6, 0.6, 0.5, 0.9, 0.4, 0.6, 0.5, 0.4, 0.9, 0.4, 0.2, 0.5, 0.1, 0.2, 0.5, 0.8, 0.3, 0.3, 0.3, 0.1, 0.2, 0.5, 0.3, 0.7, 0.1, 0.4, 0.5, 0.9, 0.2, 0.7, 0.4, 0.4, 0.8, 0.6, 0.2, 0.4, 0.1, 0.1, 0.6, 0.1, 0.3, 0.2, 0.2, 0.3, 0.9, 0.2, 0.4, 0.4, 0.5, 0.5, 0.2, 0.8, 0.8, 0.3, 0.5, 0.3, 0.1, 0.7, 0.1, 0.3, 0.3, 0.6, 0.3, 0.3, 0.9, 0.5, 0.7, 0.2, 0.1, 0.3, 0.3, 0.5, 0.7, 0.8, 0.3, 0.4, 0.2, 0.1, 0.9, 0.7, 0.8, 0.3, 0.7, 0.3, 0.6, 0.3, 0.2, 0.3, 0.2, 0.2, 0.1, 0.8, 0.2, 0.8, 0.2, 0.6, 0.3, 0.3, 0.3, 0.7, 0.9, 0.8, 0.7, 0.2, 0.6, 0.1, 0.4, 0.6, 0.6, 0.1, 0.1, 0.8, 0.3, 0.1, 0.2, 0.9, 0.3, 0.6, 0.4, 0.6, 0.3, 0.7, 0.8, 0.2, 0.1, 0.7, 0.2, 0.4, 0.5, 0.3, 0.6, 0.1, 0.9, 0.6, 0.7, 0.1, 0.6, 0.9, 0.8, 0.2, 0.3, 0.4, 0.9, 0.9, 0.4, 0.6, 0.9, 0.4, 0.7, 0.5, 0.9, 0.2, 0.8, 0.8, 0.4, 0.3, 0.1, 0.6, 0.9, 0.9, 0.5, 0.1, 0.4, 0.9, 0.6, 0.7, 0.9, 0.4, 0.7, 0.2, 0.6, 0.1, 0.4, 0.2, 0.7, 0.9, 0.5, 0.4, 0.9, 0.2, 0.6, 0.6, 0.2, 0.3, 0.4, 0.8, 0.3, 0.2, 0.5, 0.6, 0.1, 0.3, 0.7, 0.2, 0.6, 0.9, 0.5, 0.3, 0.9, 0.6, 0.2, 0.5, 0.7, 0.6, 0.4, 0.8, 0.8, 0.9, 0.3, 0.9, 0.1, 0.2, 0.3, 0.6, 0.2, 0.1, 0.7, 0.5, 0.2, 0.2, 0.3, 0.2, 0.3, 0.5, 0.4, 0.9, 0.7, 0.7, 0.3, 0.5, 0.9, 0.2, 0.7, 0.4, 0.7, 0.6, 0.7, 0.8, 0.2, 0.1, 0.3, 0.5, 0.6, 0.6, 
+
+L3_zGEMM_o_TT
+-0.85, 7.98, -0.76, 9.17, -0.91, 8.16, 0.27, 7.31, -0.48, 6.17, 1.1, 7.99, -0.11, 8.33, -0.39, 8.24, 0.27, 7.71, -0.86, 7.58, -0.23, 6.87, 1.88, 6.71, -0.96, 7.74, 0.95, 7.48, 1.63, 7.96, 0.66, 8.37, 0.16, 7.45, -1.79, 9.13, -0.73, 8.28, -0.93, 8.64, -0.35, 8.4, -0.7, 7.41, -1.47, 8.34, -1.77, 8.4, -0.66, 8.43, -0.48, 8.11, -1.16, 8.54, -0.72, 6.47, -0.86, 7.61, -0.51, 6.37, -0.65, 8.38, -5.55111512313e-17, 9.24, -1.92, 8.3, -0.52, 7.8, -0.15, 10.08, -0.1, 10.08, -0.19, 9.48, 1.43, 9.26, -1.04, 8.28, 0.41, 9.66, 0.85, 9.34, 0.84, 10.43, 0.07, 7.66, 0.12, 8.22, 0.45, 7.81, 1.56, 8.22, 0.18, 7.43, 1.08, 8.84, 2.61, 8.98, 0.82, 8.21, 0.65, 8.3, 0.47, 9.33, 1.66533453694e-16, 9.67, 0.64, 9.46, 0.86, 9.32, 0.38, 8.33, 0.56, 9.53, 0.2, 9.54, 1.23, 9.56, 1.4, 8.39, 0.39, 8.85, 0.07, 7.79, 1.25, 8.53, 0.19, 7.6, 2.16, 9.71, 2.67, 9.48, 0.19, 8.86, 0.59, 8.26, -1.74, 8.48, -1.11, 8.87, -1.93, 8.62, -0.86, 7.56, -1.89, 7.91, -1.68, 8.33, -1.09, 8.15, -1.39, 9.25, -1.89, 7.36, -2.2, 7.76, -1.73, 6.54, -0.03, 6.79, -1.66, 7.26, -1.91, 7.64, -0.71, 9.59, -1.22, 7.34, -0.82, 7.34, 0.55, 9.1, 1.51, 8.63, 1.38, 8.84, 1.91, 7.82, 0.45, 7.09, 1.68, 8.46, 0.43, 8.95, 0.86, 10.0, 1.44, 7.95, 1.5, 8.2, 0.59, 5.94, 1.74, 7.0, 0.6, 7.66, 2.25, 8.61, 2.86, 8.57, 0.52, 8.09, 1.82, 8.85, 1.43, 8.91, 1.16, 7.61, 0.94, 7.44, 1.69, 6.51, 0.78, 7.11, 0.71, 8.33, 1.33, 6.72, 1.75, 7.41, 0.34, 6.75, 0.58, 7.33, -0.51, 6.09, 1.12, 6.79, 0.68, 6.08, 0.98, 7.97, 3.04, 9.0, 0.93, 7.45, 1.7, 6.9, 1.66, 8.28, 0.74, 8.63, 1.07, 8.74, 1.23, 8.14, 0.12, 7.46, 1.41, 8.74, 0.77, 8.8, 1.52, 8.65, 1.3, 6.59, 0.51, 7.55, 0.01, 7.22, 1.22, 7.11, -0.14, 7.18, 1.33, 8.87, 2.3, 8.7, 0.25, 8.51, 0.56, 7.02, 0.91, 7.9, 0.71, 9.15, 0.33, 8.74, 2.08, 7.71, 1.03, 7.64, 1.63, 8.02, 0.76, 8.56, 1.15, 9.9, 1.09, 7.61, -0.25, 8.49, 0.49, 6.17, 1.22, 6.56, -0.1, 7.35, 0.99, 7.53, 2.03, 8.2, 0.5, 8.53, 0.93, 7.52, -0.66, 12.0, -0.04, 12.61, 0.03, 11.87, 1.5, 11.37, -0.14, 9.44, 0.68, 12.36, -0.75, 12.28, 1.05, 12.99, 0.68, 10.07, -0.2, 10.71, -1.21, 9.14, 0.42, 9.78, -1.09, 9.99, 0.67, 11.4, 2.42, 12.14, -0.65, 10.62, 0.35, 10.15, 
+
+L3_zGEMM_o_HH
+-0.85, -6.18, -0.76, -7.97, -0.91, -7.56, 0.27, -6.11, -0.48, -5.97, 1.1, -6.99, -0.11, -6.93, -0.39, -7.84, 0.27, -6.51, -0.86, -6.58, -0.23, -5.47, 1.88, -4.91, -0.96, -5.94, 0.95, -7.28, 1.63, -7.36, 0.66, -6.57, 0.16, -6.25, -1.79, -7.93, -0.73, -7.48, -0.93, -7.64, -0.35, -6.8, -0.7, -6.41, -1.47, -8.14, -1.77, -7.2, -0.66, -7.63, -0.48, -6.91, -1.16, -6.74, -0.72, -5.27, -0.86, -6.41, -0.51, -6.17, -0.65, -6.78, -5.55111512313e-17, -9.04, -1.92, -6.7, -0.52, -7.0, -0.15, -8.88, -0.1, -8.48, -0.19, -8.08, 1.43, -7.46, -1.04, -6.88, 0.41, -8.46, 0.85, -8.94, 0.84, -9.03, 0.07, -6.66, 0.12, -6.42, 0.45, -6.41, 1.56, -7.02, 0.18, -7.23, 1.08, -7.84, 2.61, -8.78, 0.82, -7.61, 0.65, -7.1, 0.47, -8.73, 1.66533453694e-16, -9.27, 0.64, -8.06, 0.86, -7.92, 0.38, -7.73, 0.56, -8.33, 0.2, -9.14, 1.23, -8.76, 1.4, -7.59, 0.39, -7.65, 0.07, -6.79, 1.25, -6.93, 0.19, -7.2, 2.16, -7.91, 2.67, -8.28, 0.19, -8.46, 0.59, -7.26, -1.74, -7.08, -1.11, -8.47, -1.93, -7.42, -0.86, -6.16, -1.89, -6.31, -1.68, -6.93, -1.09, -7.55, -1.39, -7.85, -1.89, -6.36, -2.2, -7.36, -1.73, -5.54, -0.03, -5.59, -1.66, -5.66, -1.91, -6.84, -0.71, -7.79, -1.22, -6.74, -0.82, -6.54, 0.55, -8.3, 1.51, -7.63, 1.38, -8.04, 1.91, -7.02, 0.45, -5.69, 1.68, -7.66, 0.43, -7.55, 0.86, -8.6, 1.44, -6.95, 1.5, -7.6, 0.59, -5.74, 1.74, -6.8, 0.6, -6.86, 2.25, -7.81, 2.86, -8.37, 0.52, -7.29, 1.82, -7.05, 1.43, -7.31, 1.16, -6.81, 0.94, -6.64, 1.69, -5.91, 0.78, -6.11, 0.71, -7.93, 1.33, -6.52, 1.75, -7.01, 0.34, -5.75, 0.58, -7.13, -0.51, -5.29, 1.12, -5.99, 0.68, -5.28, 0.98, -7.37, 3.04, -8.0, 0.93, -7.05, 1.7, -5.9, 1.66, -7.48, 0.74, -7.03, 1.07, -7.34, 1.23, -6.74, 0.12, -7.26, 1.41, -8.14, 0.77, -7.0, 1.52, -7.65, 1.3, -6.19, 0.51, -7.35, 0.01, -6.22, 1.22, -6.31, -0.14, -5.98, 1.33, -7.07, 2.3, -7.5, 0.25, -7.51, 0.56, -6.42, 0.91, -7.7, 0.71, -8.15, 0.33, -7.14, 2.08, -6.31, 1.03, -6.04, 1.63, -7.62, 0.76, -7.56, 1.15, -8.1, 1.09, -6.81, -0.25, -6.89, 0.49, -5.57, 1.22, -5.96, -0.1, -6.35, 0.99, -6.33, 2.03, -7.8, 0.5, -7.13, 0.93, -7.12, -0.66, -11.2, -0.04, -11.01, 0.03, -11.07, 1.5, -9.97, -0.14, -9.24, 0.68, -11.56, -0.75, -11.28, 1.05, -12.19, 0.68, -9.47, -0.2, -10.11, -1.21, -8.54, 0.42, -9.38, -1.09, -8.19, 0.67, -10.4, 2.42, -11.74, -0.65, -10.22, 0.35, -8.95, 
+
+L3_sSYMM_A_mm
+0.5, 0.6, 0.1, 0.2, 0.2, 0.2, 0.3, 0.8, 0.5, 0.9, 0.6, 0.8, 0.7, 0.9, 0.6, 0.2, 0.6, 0.2, 0.2, 0.6, 0.1, 0.7, 0.5, 0.9, 0.1, 0.8, 0.6, 0.4, 0.6, 0.6, 0.2, 0.9, 0.9, 0.7, 0.2, 0.6, 0.1, 0.9, 0.7, 0.8, 0.2, 0.6, 0.1, 0.2, 0.5, 0.5, 0.5, 0.6, 0.8, 0.4, 0.2, 0.2, 0.8, 0.6, 0.5, 0.4, 0.4, 0.2, 0.1, 0.3, 0.3, 0.6, 0.6, 0.1, 0.5, 0.4, 0.1, 0.7, 0.9, 0.2, 0.8, 0.2, 0.4, 0.9, 0.6, 0.2, 0.7, 0.2, 0.5, 0.8, 0.5, 0.2, 0.6, 0.7, 0.8, 0.1, 0.9, 0.5, 0.2, 0.3, 0.9, 0.6, 0.6, 0.8, 0.4, 0.3, 0.2, 0.8, 0.3, 0.2, 
+
+L3_sSYMM_B_mn
+0.4, 0.7, 0.2, 0.9, 0.6, 0.8, 0.4, 0.9, 0.6, 0.4, 0.4, 0.5, 0.9, 0.7, 0.4, 0.7, 0.3, 0.2, 0.1, 0.8, 0.1, 0.2, 0.7, 0.9, 0.9, 0.6, 0.7, 0.7, 0.5, 0.9, 0.3, 0.5, 0.4, 0.6, 0.3, 0.9, 0.9, 0.7, 0.6, 0.4, 0.5, 0.3, 0.9, 0.5, 0.3, 0.8, 0.6, 0.4, 0.3, 0.9, 0.2, 0.5, 0.7, 0.4, 0.5, 0.7, 0.3, 0.4, 0.3, 0.3, 0.8, 0.7, 0.2, 0.3, 0.6, 0.5, 0.6, 0.4, 0.6, 0.5, 0.1, 0.1, 0.5, 0.9, 0.4, 0.6, 0.7, 0.8, 0.2, 0.6, 0.9, 0.5, 0.1, 0.5, 0.9, 0.7, 0.9, 0.5, 0.9, 0.6, 0.6, 0.5, 0.1, 0.2, 0.2, 0.5, 0.6, 0.8, 0.4, 0.7, 0.4, 0.9, 0.6, 0.3, 0.5, 0.9, 0.5, 0.2, 0.7, 0.7, 0.2, 0.2, 0.3, 0.6, 0.9, 0.1, 0.3, 0.2, 0.4, 0.3, 0.4, 0.6, 0.2, 0.7, 0.1, 0.7, 0.3, 0.4, 0.2, 0.8, 0.5, 0.6, 0.1, 0.4, 0.3, 0.5, 0.7, 0.2, 0.3, 0.3, 0.8, 0.6, 0.6, 0.4, 0.2, 0.3, 0.9, 0.4, 0.6, 0.4, 0.4, 0.6, 0.2, 0.1, 0.3, 0.3, 0.1, 0.9, 0.9, 0.3, 0.4, 0.7, 0.1, 0.2, 0.5, 0.3, 0.3, 0.3, 0.3, 0.7, 
+
+L3_sSYMM_C_mn
+0.6, 0.7, 0.5, 0.3, 0.5, 0.6, 0.6, 0.4, 0.7, 0.4, 0.6, 0.5, 0.8, 0.8, 0.9, 0.6, 0.4, 0.6, 0.9, 0.8, 0.9, 0.9, 0.6, 0.8, 0.6, 0.3, 0.6, 0.4, 0.4, 0.8, 0.2, 0.3, 0.5, 0.2, 0.1, 0.2, 0.6, 0.1, 0.1, 0.7, 0.3, 0.3, 0.3, 0.6, 0.5, 0.8, 0.8, 0.8, 0.9, 0.1, 0.1, 0.4, 0.9, 0.8, 0.6, 0.4, 0.6, 0.6, 0.4, 0.7, 0.1, 0.9, 0.6, 0.9, 0.6, 0.3, 0.8, 0.1, 0.9, 0.4, 0.9, 0.5, 0.9, 0.6, 0.6, 0.5, 0.5, 0.4, 0.7, 0.4, 0.8, 0.2, 0.9, 0.2, 0.4, 0.9, 0.9, 0.3, 0.5, 0.1, 0.7, 0.3, 0.3, 0.9, 0.2, 0.6, 0.5, 0.4, 0.4, 0.7, 0.8, 0.5, 0.5, 0.6, 0.6, 0.4, 0.1, 0.7, 0.3, 0.1, 0.8, 0.8, 0.8, 0.9, 0.4, 0.3, 0.8, 0.6, 0.3, 0.8, 0.8, 0.3, 0.2, 0.5, 0.5, 0.8, 0.2, 0.1, 0.3, 0.1, 0.3, 0.8, 0.4, 0.1, 0.9, 0.6, 0.4, 0.2, 0.4, 0.9, 0.9, 0.2, 0.9, 0.3, 0.3, 0.5, 0.9, 0.2, 0.4, 0.9, 0.6, 0.4, 0.3, 0.6, 0.4, 0.3, 0.2, 0.4, 0.9, 0.2, 0.2, 0.1, 0.3, 0.7, 0.6, 0.9, 0.3, 0.2, 0.5, 0.8, 
+
+L3_sSYMM_o_L
+2.17000006318, 2.40000000522, 2.42000007287, 1.85000001639, 3.25999999732, 3.07000002295, 2.99000006005, 2.63000002995, 2.80000001863, 1.89000004292, 2.8900000526, 2.64000003994, 3.57000006169, 2.25000004247, 2.57000001773, 2.45000007227, 2.62000002593, 2.78000009775, 3.61999997526, 3.37000004679, 3.39999997318, 4.03000003368, 3.65000008643, 3.67000005126, 3.52000008851, 3.16000007331, 3.27000006318, 2.90000002682, 3.16000010014, 4.41000007033, 2.40000006706, 2.3200000602, 3.27000004381, 2.88000006944, 2.46000004649, 2.82999999568, 3.30000006706, 2.65000000149, 3.36000006065, 3.37000004902, 3.26000004053, 2.60000004098, 2.55000004843, 2.78000003368, 3.39000000715, 3.42000009671, 4.14000008017, 2.71000006884, 3.22000001103, 2.59000006229, 2.80000003278, 2.72000001252, 3.83999993414, 4.00999999955, 2.96999999911, 4.14999999478, 3.75000002906, 3.95999998018, 2.98999999151, 3.71999996483, 2.58999998033, 4.24999992177, 3.68000003666, 4.58999999598, 2.75000005886, 2.80000002012, 3.8200000155, 3.07000000209, 2.96000002041, 2.20000002608, 2.86000005394, 2.2600000003, 3.56000002861, 3.03000006944, 3.17000007585, 2.6700000453, 2.36000005171, 2.1100000532, 3.15000002906, 2.64000008315, 3.90000006706, 1.68000004783, 2.64000002354, 2.12000007287, 2.76000003606, 2.54000003397, 3.11999999017, 2.1500000447, 2.43000000611, 2.34000006676, 2.62000002742, 2.17000004679, 1.92000005871, 2.86000000179, 1.96000005245, 2.21000006661, 2.5300000754, 2.82000005275, 1.88000006199, 2.08000003442, 2.80000005513, 2.38000002325, 2.47000002071, 2.64000003695, 2.77000008255, 2.1300000225, 2.76000003755, 3.13000003219, 2.8600000383, 2.18000004411, 2.96000005767, 2.65000005513, 3.33000000536, 3.26000004053, 3.48000006348, 1.90000005141, 2.51000004575, 2.89000007272, 2.43000003219, 3.14000005484, 3.48000001132, 2.36000003755, 2.80999996603, 3.92000002295, 3.5500000447, 3.37000004083, 2.94000003099, 2.67000004679, 2.61000005245, 2.5100000003, 2.90000008196, 4.20000003427, 2.63000005081, 2.02000003338, 3.56000002265, 3.16000004798, 2.58000005901, 2.6900000079, 2.51000003234, 3.30999993324, 3.78000000089, 2.59000003025, 3.41999997899, 2.79000003099, 2.68000004858, 2.7300000374, 3.0299999927, 2.7300000754, 3.72000000209, 2.72000001252, 2.22000005499, 2.77000004381, 2.6400000228, 2.70000008941, 3.16000001371, 2.74000009805, 2.64999999404, 3.4400000757, 3.5400000295, 2.97000005424, 2.82000003114, 2.68000007391, 2.7100000748, 3.46000004202, 3.15000010282, 4.35000003278, 2.4300000605, 2.2500000596, 3.2300000605, 3.18000007093, 
+
+L3_sSYMM_A_nn
+0.6, 0.6, 0.5, 0.9, 0.1, 0.5, 0.1, 0.9, 0.3, 0.9, 0.7, 0.3, 0.3, 0.2, 0.6, 0.9, 0.8, 0.6, 0.7, 0.6, 0.6, 0.2, 0.1, 0.9, 0.6, 0.7, 0.4, 0.3, 0.5, 0.3, 0.3, 0.5, 0.5, 0.3, 0.5, 0.6, 0.6, 0.4, 0.1, 0.6, 0.5, 0.9, 0.6, 0.3, 0.5, 0.3, 0.9, 0.9, 0.8, 0.6, 0.4, 0.9, 0.6, 0.4, 0.1, 0.5, 0.7, 0.9, 0.1, 0.2, 0.1, 0.4, 0.3, 0.4, 0.7, 0.4, 0.4, 0.4, 0.1, 0.2, 0.1, 0.5, 0.3, 0.8, 0.7, 0.8, 0.3, 0.7, 0.2, 0.1, 0.9, 0.5, 0.7, 0.2, 0.4, 0.5, 0.1, 0.6, 0.7, 0.8, 0.4, 0.2, 0.4, 0.4, 0.1, 0.5, 0.3, 0.8, 0.2, 0.6, 0.5, 0.2, 0.1, 0.9, 0.5, 0.9, 0.7, 0.2, 0.2, 0.1, 0.9, 0.8, 0.6, 0.1, 0.4, 0.2, 0.1, 0.1, 0.5, 0.9, 0.6, 0.9, 0.1, 0.8, 0.4, 0.1, 0.3, 0.4, 0.1, 0.6, 0.9, 0.1, 0.3, 0.9, 0.1, 0.2, 0.3, 0.7, 0.6, 0.2, 0.3, 0.4, 0.9, 0.4, 0.3, 0.3, 0.4, 0.3, 0.5, 0.8, 0.3, 0.6, 0.6, 0.9, 0.4, 0.3, 0.1, 0.7, 0.1, 0.8, 0.1, 0.3, 0.4, 0.2, 0.4, 0.3, 0.7, 0.5, 0.3, 0.4, 0.7, 0.3, 0.5, 0.4, 0.2, 0.5, 0.6, 0.6, 0.4, 0.2, 0.5, 0.9, 0.7, 0.6, 0.9, 0.8, 0.3, 0.3, 0.5, 0.3, 0.3, 0.1, 0.3, 0.1, 0.9, 0.3, 0.4, 0.9, 0.1, 0.3, 0.2, 0.3, 0.8, 0.1, 0.3, 0.3, 0.9, 0.4, 0.9, 0.8, 0.4, 0.1, 0.5, 0.3, 0.7, 0.3, 0.9, 0.3, 0.9, 0.2, 0.2, 0.2, 0.3, 0.9, 0.7, 0.5, 0.2, 0.2, 0.3, 0.8, 0.7, 0.6, 0.2, 0.3, 0.1, 0.3, 0.4, 0.1, 0.6, 0.5, 0.8, 0.4, 0.7, 0.6, 0.1, 0.9, 0.3, 0.5, 0.9, 0.3, 0.9, 0.3, 0.8, 0.1, 0.8, 0.9, 0.5, 0.6, 0.4, 0.2, 0.5, 0.1, 0.1, 0.6, 0.3, 0.8, 0.8, 0.2, 0.4, 0.1, 0.9, 0.7, 0.8, 0.3, 0.4, 0.4, 0.4, 0.2, 0.5, 0.2, 0.6, 0.4, 0.3, 0.1, 0.2, 0.1, 0.8, 0.7, 0.4, 
+
+L3_sSYMM_o_R
+5.96999999017, 5.26000004351, 6.28000000387, 4.44000003248, 5.25999998763, 5.00000006482, 4.84000000492, 4.32000006691, 5.17000004679, 4.01000004947, 5.88000004858, 4.32000000805, 5.53000003144, 4.58000006348, 6.29999998137, 4.98000005528, 4.0200000751, 5.46000000626, 5.24000001907, 6.21000002563, 4.74999996126, 5.52999991745, 4.45000007898, 4.33000004187, 4.34000003621, 4.70000007078, 3.98000007093, 5.42000001773, 3.90999999881, 5.53999996841, 3.91000003979, 5.73999998927, 4.48000006795, 3.63000005975, 5.05999999657, 5.04000002354, 5.7700001213, 4.07000004455, 3.81000004351, 4.86000007033, 4.85999994367, 4.66000003457, 4.76000008374, 4.27000009, 5.55000004768, 4.23000005826, 5.54000002876, 5.10000000596, 5.69000004739, 4.87000002667, 3.90000004768, 5.03000005677, 4.7200000684, 5.19000013307, 4.25000006855, 3.86000006512, 4.0400000973, 4.49000003174, 4.09000003994, 4.54000010848, 3.60000004694, 5.00000007153, 3.78000008509, 4.91999999836, 4.04000008017, 4.86000005841, 4.71000007331, 3.50000008494, 5.63000001207, 4.30000008196, 5.87000001624, 4.48000000089, 5.20999996752, 4.11000006884, 4.34000000045, 4.00000005364, 4.65000007227, 3.9900000526, 5.28000004262, 3.45000006333, 4.89000000268, 3.32000004753, 5.87999999866, 4.51000002414, 3.6900000675, 6.00999998689, 5.33000001878, 5.46000007108, 4.98000001952, 4.15000000894, 4.98000005677, 4.54999996275, 4.8000000231, 5.34000004441, 4.15000002459, 5.68000004858, 3.55000004545, 5.34000001907, 3.90000003725, 6.20000002235, 5.46000001967, 4.33000003964, 4.55000002086, 4.46000010088, 4.82000004232, 3.65000003353, 3.66999996781, 4.39000002727, 3.49999999255, 3.43000005454, 4.21000006586, 3.85000006333, 5.01000005394, 3.51000001222, 4.21999999315, 3.32000003189, 5.27000002593, 3.90000009462, 3.24000007719, 4.28000009999, 4.26000009343, 4.06000012398, 3.41000004724, 3.3900000377, 3.77000010639, 3.98000004858, 3.72000005797, 3.50000009537, 3.32000006318, 3.88000007913, 2.85000008121, 4.71000003159, 3.38000008956, 4.34000006899, 4.26000006363, 3.46000010982, 4.44000007272, 3.710000121, 4.71000011802, 4.75000002533, 4.36000006884, 3.9400001137, 3.9300000374, 4.06000005543, 3.92000014812, 3.91000005916, 5.29000007123, 3.28000005752, 4.66000006139, 3.93000006795, 5.16000008523, 4.24000005633, 3.51000010461, 3.76000006735, 3.22000006393, 3.83000010297, 3.22000002071, 3.410000045, 3.84000003174, 3.09999997616, 3.40000002384, 3.15000009537, 2.9200000453, 4.06000004575, 2.6800000754, 4.51999996483, 2.81000004798, 4.0300000374, 3.6400000295, 3.29000006825, 
+
+L3_dSYMM_A_mm
+0.3, 0.5, 0.4, 0.3, 0.9, 0.9, 0.4, 0.6, 0.4, 0.8, 0.5, 0.1, 0.4, 0.7, 0.8, 0.7, 0.7, 0.5, 0.6, 0.8, 0.4, 0.4, 0.7, 0.5, 0.8, 0.6, 0.7, 0.1, 0.9, 0.1, 0.3, 0.7, 0.5, 0.8, 0.1, 0.2, 0.7, 0.2, 0.6, 0.6, 0.9, 0.8, 0.8, 0.1, 0.9, 0.2, 0.3, 0.7, 0.9, 0.3, 0.9, 0.7, 0.6, 0.2, 0.2, 0.2, 0.6, 0.7, 0.3, 0.8, 0.4, 0.7, 0.7, 0.7, 0.3, 0.6, 0.5, 0.5, 0.2, 0.5, 0.6, 0.5, 0.1, 0.2, 0.7, 0.7, 0.5, 0.3, 0.8, 0.8, 0.4, 0.6, 0.9, 0.6, 0.9, 0.3, 0.2, 0.8, 0.6, 0.9, 0.8, 0.8, 0.1, 0.6, 0.3, 0.8, 0.5, 0.8, 0.9, 0.8, 
+
+L3_dSYMM_B_mn
+0.3, 0.4, 0.1, 0.9, 0.6, 0.5, 0.3, 0.3, 0.3, 0.8, 0.7, 0.1, 0.7, 0.7, 0.1, 0.3, 0.3, 0.5, 0.1, 0.1, 0.2, 0.8, 0.5, 0.2, 0.9, 0.3, 0.4, 0.5, 0.6, 0.1, 0.8, 0.7, 0.2, 0.9, 0.5, 0.9, 0.6, 0.8, 0.5, 0.3, 0.6, 0.1, 0.7, 0.5, 0.6, 0.5, 0.4, 0.6, 0.1, 0.2, 0.3, 0.6, 0.9, 0.1, 0.7, 0.3, 0.7, 0.2, 0.2, 0.4, 0.8, 0.5, 0.3, 0.1, 0.3, 0.9, 0.7, 0.9, 0.7, 0.4, 0.3, 0.5, 0.2, 0.1, 0.1, 0.9, 0.5, 0.3, 0.6, 0.5, 0.4, 0.5, 0.6, 0.9, 0.1, 0.4, 0.6, 0.9, 0.3, 0.5, 0.4, 0.7, 0.2, 0.5, 0.8, 0.1, 0.1, 0.4, 0.1, 0.3, 0.7, 0.3, 0.7, 0.1, 0.2, 0.2, 0.7, 0.7, 0.4, 0.2, 0.5, 0.8, 0.9, 0.6, 0.2, 0.6, 0.1, 0.8, 0.8, 0.5, 0.8, 0.9, 0.7, 0.6, 0.7, 0.2, 0.5, 0.9, 0.4, 0.3, 0.5, 0.1, 0.4, 0.1, 0.3, 0.7, 0.2, 0.6, 0.1, 0.2, 0.8, 0.4, 0.2, 0.9, 0.3, 0.7, 0.2, 0.9, 0.6, 0.8, 0.4, 0.9, 0.8, 0.6, 0.9, 0.9, 0.2, 0.2, 0.6, 0.3, 0.6, 0.6, 0.8, 0.3, 0.8, 0.2, 0.2, 0.9, 0.9, 0.1, 
+
+L3_dSYMM_C_mn
+0.1, 0.1, 0.5, 0.3, 0.3, 0.4, 0.6, 0.6, 0.8, 0.1, 0.4, 0.3, 0.6, 0.9, 0.1, 0.7, 0.8, 0.6, 0.3, 0.7, 0.4, 0.5, 0.7, 0.7, 0.5, 0.7, 0.2, 0.7, 0.5, 0.8, 0.8, 0.6, 0.8, 0.6, 0.6, 0.2, 0.3, 0.9, 0.7, 0.2, 0.2, 0.4, 0.4, 0.9, 0.8, 0.3, 0.3, 0.5, 0.9, 0.6, 0.4, 0.6, 0.7, 0.7, 0.5, 0.7, 0.6, 0.8, 0.9, 0.7, 0.8, 0.9, 0.5, 0.1, 0.3, 0.8, 0.6, 0.1, 0.8, 0.3, 0.3, 0.2, 0.4, 0.8, 0.5, 0.9, 0.6, 0.6, 0.8, 0.2, 0.5, 0.9, 0.7, 0.6, 0.3, 0.4, 0.2, 0.2, 0.3, 0.2, 0.2, 0.2, 0.2, 0.9, 0.5, 0.4, 0.5, 0.3, 0.7, 0.6, 0.6, 0.2, 0.7, 0.5, 0.1, 0.7, 0.5, 0.8, 0.3, 0.3, 0.6, 0.6, 0.2, 0.1, 0.9, 0.5, 0.3, 0.8, 0.1, 0.6, 0.3, 0.7, 0.8, 0.8, 0.5, 0.6, 0.1, 0.3, 0.6, 0.1, 0.2, 0.2, 0.9, 0.8, 0.4, 0.7, 0.4, 0.4, 0.5, 0.8, 0.2, 0.8, 0.6, 0.9, 0.7, 0.7, 0.8, 0.9, 0.5, 0.6, 0.3, 0.2, 0.5, 0.1, 0.5, 0.4, 0.3, 0.4, 0.3, 0.3, 0.8, 0.2, 0.5, 0.6, 0.2, 0.7, 0.4, 0.5, 0.4, 0.2, 
+
+L3_dSYMM_o_L
+2.95, 3.28, 3.31, 2.66, 2.92, 2.92, 2.41, 3.45, 3.68, 3.45, 2.74, 3.0, 2.31, 3.34, 2.58, 4.2, 3.23, 3.6, 3.79, 3.31, 3.06, 3.23, 3.53, 2.56, 3.19, 3.65, 4.02, 3.38, 3.34, 2.7, 3.41, 3.16, 4.72, 3.35, 3.15, 2.94, 2.04, 3.24, 3.51, 2.46, 1.93, 2.95, 2.8, 4.16, 3.36, 2.9, 2.22, 3.33, 2.93, 3.92, 3.16, 2.99, 3.35, 2.31, 2.5, 3.26, 3.13, 2.26, 3.1, 2.89, 3.94, 3.23, 3.05, 1.42, 2.78, 3.08, 3.42, 3.0, 3.56, 3.43, 2.46, 3.18, 3.7, 3.37, 2.19, 4.24, 3.49, 3.94, 3.67, 3.25, 2.71, 4.39, 2.85, 3.74, 3.25, 2.97, 3.07, 2.48, 2.86, 3.04, 2.93, 1.85, 2.64, 3.58, 3.79, 3.03, 3.11, 1.95, 3.47, 2.57, 3.27, 2.83, 3.33, 3.49, 2.35, 3.17, 3.13, 3.4, 2.06, 2.48, 3.21, 3.82, 2.63, 2.46, 2.33, 2.94, 2.52, 3.56, 2.86, 3.11, 3.05, 2.9, 2.85, 3.49, 2.93, 2.2, 3.0, 2.72, 3.98, 2.36, 2.9, 2.06, 3.48, 3.15, 3.89, 3.15, 3.58, 4.34, 3.37, 3.86, 3.16, 3.68, 2.43, 4.16, 4.01, 4.32, 3.6, 4.19, 2.4, 3.66, 3.17, 3.81, 3.44, 3.09, 4.08, 3.12, 3.07, 3.92, 3.65, 2.25, 4.11, 3.26, 4.71, 3.29, 3.37, 2.76, 3.57, 3.32, 4.24, 3.76, 
+
+L3_dSYMM_A_nn
+0.1, 0.6, 0.4, 0.6, 0.1, 0.1, 0.1, 0.8, 0.2, 0.8, 0.1, 0.9, 0.4, 0.7, 0.7, 0.3, 0.6, 0.6, 0.1, 0.5, 0.3, 0.5, 0.9, 0.4, 0.6, 0.6, 0.2, 0.1, 0.7, 0.1, 0.5, 0.4, 0.8, 0.1, 0.4, 0.5, 0.7, 0.9, 0.5, 0.2, 0.1, 0.2, 0.9, 0.3, 0.4, 0.5, 0.2, 0.8, 0.6, 0.1, 0.3, 0.6, 0.3, 0.9, 0.5, 0.9, 0.1, 0.3, 0.6, 0.9, 0.4, 0.5, 0.1, 0.7, 0.1, 0.9, 0.6, 0.5, 0.1, 0.5, 0.5, 0.9, 0.9, 0.9, 0.4, 0.1, 0.7, 0.9, 0.5, 0.3, 0.1, 0.1, 0.6, 0.3, 0.4, 0.1, 0.9, 0.2, 0.1, 0.9, 0.2, 0.9, 0.2, 0.9, 0.2, 0.6, 0.7, 0.8, 0.8, 0.4, 0.8, 0.4, 0.1, 0.4, 0.1, 0.3, 0.4, 0.9, 0.4, 0.5, 0.6, 0.6, 0.4, 0.1, 0.4, 0.6, 0.3, 0.8, 0.7, 0.8, 0.6, 0.2, 0.6, 0.1, 0.2, 0.5, 0.4, 0.9, 0.8, 0.7, 0.4, 0.7, 0.7, 0.3, 0.1, 0.2, 0.2, 0.6, 0.9, 0.9, 0.7, 0.9, 0.6, 0.9, 0.4, 0.3, 0.8, 0.7, 0.8, 0.3, 0.4, 0.4, 0.4, 0.8, 0.2, 0.3, 0.4, 0.9, 0.2, 0.6, 0.8, 0.3, 0.5, 0.8, 0.4, 0.9, 0.3, 0.4, 0.8, 0.6, 0.1, 0.1, 0.4, 0.5, 0.5, 0.6, 0.4, 0.7, 0.8, 0.8, 0.4, 0.8, 0.3, 0.5, 0.4, 0.8, 0.6, 0.9, 0.7, 0.5, 0.1, 0.3, 0.7, 0.1, 0.4, 0.7, 0.4, 0.8, 0.2, 0.4, 0.4, 0.5, 0.5, 0.4, 0.4, 0.1, 0.2, 0.7, 0.1, 0.8, 0.4, 0.7, 0.8, 0.9, 0.3, 0.4, 0.6, 0.9, 0.4, 0.7, 0.9, 0.7, 0.5, 0.8, 0.1, 0.1, 0.8, 0.6, 0.7, 0.3, 0.3, 0.5, 0.4, 0.9, 0.7, 0.2, 0.8, 0.9, 0.7, 0.4, 0.6, 0.9, 0.6, 0.4, 0.3, 0.3, 0.4, 0.4, 0.4, 0.5, 0.4, 0.2, 0.7, 0.7, 0.5, 0.3, 0.8, 0.1, 0.6, 0.3, 0.8, 0.8, 0.1, 0.4, 0.8, 0.8, 0.5, 0.7, 0.8, 0.7, 0.7, 0.2, 0.6, 0.1, 0.3, 0.5, 0.4, 0.4, 0.7, 0.2, 0.4, 0.6, 0.6, 0.4, 0.9, 0.9, 0.5, 0.2, 0.7, 
+
+L3_dSYMM_o_R
+3.3, 2.9, 3.91, 3.93, 4.25, 4.31, 4.16, 4.61, 5.36, 4.26, 4.15, 3.66, 4.98, 4.7, 3.7, 5.27, 4.85, 4.4, 3.86, 4.16, 4.38, 4.1, 4.65, 4.36, 3.96, 5.17, 4.63, 4.96, 4.12, 5.36, 4.99, 4.3, 4.71, 4.61, 4.07, 3.45, 4.48, 5.01, 4.92, 4.89, 3.6, 4.85, 5.37, 4.99, 4.72, 4.16, 4.49, 4.67, 4.93, 5.33, 4.47, 4.61, 4.22, 4.53, 4.83, 5.38, 4.82, 5.0, 4.98, 5.4, 5.14, 5.27, 4.85, 5.05, 4.75, 5.35, 5.72, 4.15, 4.4, 3.86, 3.74, 4.4, 3.5, 4.75, 3.77, 4.74, 5.03, 5.02, 4.78, 4.01, 4.7, 5.05, 4.61, 4.69, 3.77, 3.33, 3.39, 3.28, 4.46, 4.08, 4.13, 3.51, 3.57, 5.19, 4.36, 4.11, 3.93, 4.1, 4.76, 4.3, 4.61, 3.54, 4.03, 4.4, 3.57, 4.82, 4.74, 5.4, 4.53, 4.36, 5.3, 5.52, 4.93, 4.34, 5.91, 5.29, 4.42, 5.61, 4.52, 4.34, 4.21, 5.06, 5.37, 5.4, 4.86, 4.46, 4.17, 5.65, 4.73, 4.58, 4.43, 4.87, 5.53, 5.13, 4.63, 4.49, 5.08, 4.46, 4.15, 5.19, 4.18, 6.04, 5.03, 4.86, 5.9, 5.83, 5.91, 4.83, 5.79, 5.67, 4.53, 5.1, 4.83, 4.46, 4.9, 4.43, 5.18, 4.86, 4.94, 4.21, 5.02, 5.51, 4.99, 5.39, 4.83, 5.38, 5.31, 5.14, 5.45, 3.95, 
+
+L3_cSYMM_A_mm
+0.10000000149, 0.699999988079, 0.800000011921, 0.5, 0.899999976158, 0.5, 0.40000000596, 0.699999988079, 0.300000011921, 0.600000023842, 0.5, 0.10000000149, 0.300000011921, 0.699999988079, 0.20000000298, 0.300000011921, 0.699999988079, 0.20000000298, 0.899999976158, 0.800000011921, 0.800000011921, 0.5, 0.699999988079, 0.5, 0.10000000149, 0.40000000596, 0.600000023842, 0.600000023842, 0.600000023842, 0.10000000149, 0.300000011921, 0.300000011921, 0.600000023842, 0.899999976158, 0.800000011921, 0.300000011921, 0.800000011921, 0.20000000298, 0.600000023842, 0.699999988079, 0.899999976158, 0.5, 0.10000000149, 0.40000000596, 0.40000000596, 0.800000011921, 0.10000000149, 0.699999988079, 0.20000000298, 0.600000023842, 0.600000023842, 0.20000000298, 0.600000023842, 0.10000000149, 0.600000023842, 0.5, 0.10000000149, 0.40000000596, 0.899999976158, 0.600000023842, 0.40000000596, 0.699999988079, 0.600000023842, 0.600000023842, 0.10000000149, 0.699999988079, 0.699999988079, 0.5, 0.800000011921, 0.300000011921, 0.40000000596, 0.5, 0.600000023842, 0.600000023842, 0.699999988079, 0.899999976158, 0.800000011921, 0.20000000298, 0.800000011921, 0.300000011921, 0.300000011921, 0.600000023842, 0.600000023842, 0.10000000149, 0.20000000298, 0.600000023842, 0.800000011921, 0.300000011921, 0.5, 0.300000011921, 0.899999976158, 0.699999988079, 0.600000023842, 0.20000000298, 0.600000023842, 0.5, 0.5, 0.40000000596, 0.300000011921, 0.699999988079, 0.5, 0.10000000149, 0.300000011921, 0.300000011921, 0.600000023842, 0.20000000298, 0.40000000596, 0.5, 0.899999976158, 0.699999988079, 0.600000023842, 0.800000011921, 0.699999988079, 0.40000000596, 0.10000000149, 0.800000011921, 0.899999976158, 0.20000000298, 0.800000011921, 0.300000011921, 0.300000011921, 0.699999988079, 0.600000023842, 0.899999976158, 0.600000023842, 0.10000000149, 0.600000023842, 0.600000023842, 0.600000023842, 0.20000000298, 0.699999988079, 0.40000000596, 0.20000000298, 0.40000000596, 0.699999988079, 0.20000000298, 0.600000023842, 0.699999988079, 0.300000011921, 0.899999976158, 0.20000000298, 0.300000011921, 0.800000011921, 0.300000011921, 0.600000023842, 0.5, 0.699999988079, 0.899999976158, 0.600000023842, 0.5, 0.10000000149, 0.800000011921, 0.699999988079, 0.20000000298, 0.20000000298, 0.899999976158, 0.899999976158, 0.5, 0.40000000596, 0.10000000149, 0.699999988079, 0.20000000298, 0.800000011921, 0.20000000298, 0.10000000149, 0.40000000596, 0.800000011921, 0.20000000298, 0.5, 0.40000000596, 0.899999976158, 0.20000000298, 0.600000023842, 0.699999988079, 0.899999976158, 0.5, 0.10000000149, 0.899999976158, 0.5, 0.5, 0.899999976158, 0.800000011921, 0.600000023842, 0.699999988079, 0.899999976158, 0.600000023842, 0.800000011921, 0.300000011921, 0.300000011921, 0.699999988079, 0.800000011921, 0.300000011921, 0.300000011921, 0.899999976158, 0.40000000596, 0.10000000149, 0.5, 0.5, 0.699999988079, 0.40000000596, 
+
+L3_cSYMM_B_mn
+0.20000000298, 0.5, 0.899999976158, 0.600000023842, 0.800000011921, 0.300000011921, 0.40000000596, 0.300000011921, 0.40000000596, 0.10000000149, 0.300000011921, 0.10000000149, 0.699999988079, 0.40000000596, 0.20000000298, 0.899999976158, 0.20000000298, 0.20000000298, 0.300000011921, 0.699999988079, 0.20000000298, 0.40000000596, 0.600000023842, 0.40000000596, 0.699999988079, 0.5, 0.699999988079, 0.800000011921, 0.300000011921, 0.600000023842, 0.699999988079, 0.5, 0.20000000298, 0.699999988079, 0.20000000298, 0.5, 0.10000000149, 0.40000000596, 0.800000011921, 0.20000000298, 0.699999988079, 0.300000011921, 0.300000011921, 0.600000023842, 0.5, 0.300000011921, 0.800000011921, 0.20000000298, 0.899999976158, 0.800000011921, 0.40000000596, 0.600000023842, 0.800000011921, 0.600000023842, 0.899999976158, 0.300000011921, 0.600000023842, 0.899999976158, 0.300000011921, 0.699999988079, 0.600000023842, 0.40000000596, 0.40000000596, 0.699999988079, 0.300000011921, 0.10000000149, 0.800000011921, 0.10000000149, 0.699999988079, 0.300000011921, 0.800000011921, 0.5, 0.20000000298, 0.20000000298, 0.40000000596, 0.40000000596, 0.40000000596, 0.600000023842, 0.600000023842, 0.20000000298, 0.699999988079, 0.600000023842, 0.899999976158, 0.800000011921, 0.20000000298, 0.300000011921, 0.20000000298, 0.600000023842, 0.699999988079, 0.40000000596, 0.800000011921, 0.10000000149, 0.20000000298, 0.899999976158, 0.899999976158, 0.800000011921, 0.5, 0.40000000596, 0.5, 0.300000011921, 0.300000011921, 0.20000000298, 0.800000011921, 0.40000000596, 0.5, 0.10000000149, 0.20000000298, 0.899999976158, 0.800000011921, 0.699999988079, 0.5, 0.600000023842, 0.699999988079, 0.699999988079, 0.699999988079, 0.5, 0.40000000596, 0.300000011921, 0.40000000596, 0.5, 0.800000011921, 0.5, 0.5, 0.699999988079, 0.300000011921, 0.699999988079, 0.20000000298, 0.5, 0.20000000298, 0.699999988079, 0.40000000596, 0.600000023842, 0.800000011921, 0.600000023842, 0.300000011921, 0.300000011921, 0.5, 0.300000011921, 0.40000000596, 0.5, 0.300000011921, 0.10000000149, 0.5, 0.899999976158, 0.800000011921, 0.800000011921, 0.40000000596, 0.699999988079, 0.40000000596, 0.40000000596, 0.20000000298, 0.300000011921, 0.20000000298, 0.10000000149, 0.800000011921, 0.40000000596, 0.10000000149, 0.600000023842, 0.600000023842, 0.20000000298, 0.699999988079, 0.899999976158, 0.20000000298, 0.899999976158, 0.20000000298, 0.800000011921, 0.899999976158, 0.300000011921, 0.5, 0.800000011921, 0.899999976158, 0.20000000298, 0.699999988079, 0.10000000149, 0.899999976158, 0.5, 0.699999988079, 0.300000011921, 0.5, 0.40000000596, 0.600000023842, 0.5, 0.899999976158, 0.699999988079, 0.899999976158, 0.899999976158, 0.800000011921, 0.300000011921, 0.40000000596, 0.600000023842, 0.300000011921, 0.300000011921, 0.800000011921, 0.899999976158, 0.699999988079, 0.699999988079, 0.600000023842, 0.40000000596, 0.899999976158, 0.20000000298, 0.5, 0.5, 0.899999976158, 0.800000011921, 0.10000000149, 0.40000000596, 0.10000000149, 0.40000000596, 0.300000011921, 0.40000000596, 0.699999988079, 0.600000023842, 0.600000023842, 0.600000023842, 0.600000023842, 0.800000011921, 0.600000023842, 0.300000011921, 0.699999988079, 0.20000000298, 0.899999976158, 0.10000000149, 0.699999988079, 0.899999976158, 0.699999988079, 0.10000000149, 0.20000000298, 0.300000011921, 0.899999976158, 0.899999976158, 0.699999988079, 0.5, 0.300000011921, 0.300000011921, 0.800000011921, 0.10000000149, 0.300000011921, 0.800000011921, 0.5, 0.300000011921, 0.300000011921, 0.40000000596, 0.699999988079, 0.300000011921, 0.800000011921, 0.5, 0.899999976158, 0.300000011921, 0.5, 0.899999976158, 0.600000023842, 0.300000011921, 0.40000000596, 0.899999976158, 0.20000000298, 0.899999976158, 0.20000000298, 0.300000011921, 0.5, 0.300000011921, 0.10000000149, 0.40000000596, 0.10000000149, 0.899999976158, 0.600000023842, 0.300000011921, 0.300000011921, 0.20000000298, 0.699999988079, 0.40000000596, 0.5, 0.800000011921, 0.800000011921, 0.40000000596, 0.5, 0.899999976158, 0.20000000298, 0.10000000149, 0.40000000596, 0.699999988079, 0.899999976158, 0.20000000298, 0.10000000149, 0.800000011921, 0.600000023842, 0.40000000596, 0.40000000596, 0.600000023842, 0.10000000149, 0.899999976158, 0.699999988079, 0.20000000298, 0.10000000149, 0.40000000596, 0.699999988079, 0.899999976158, 0.699999988079, 0.10000000149, 0.899999976158, 0.800000011921, 0.20000000298, 0.20000000298, 0.300000011921, 0.600000023842, 0.5, 0.5, 0.899999976158, 0.800000011921, 0.5, 0.40000000596, 0.10000000149, 0.899999976158, 0.699999988079, 0.10000000149, 0.699999988079, 0.10000000149, 0.800000011921, 0.699999988079, 0.899999976158, 0.40000000596, 0.300000011921, 0.800000011921, 0.800000011921, 0.800000011921, 0.699999988079, 0.10000000149, 0.800000011921, 0.10000000149, 0.600000023842, 0.800000011921, 0.20000000298, 0.5, 0.699999988079, 0.300000011921, 0.40000000596, 0.10000000149, 0.5, 0.800000011921, 0.600000023842, 0.800000011921, 
+
+L3_cSYMM_C_mn
+0.40000000596, 0.300000011921, 0.20000000298, 0.5, 0.40000000596, 0.600000023842, 0.800000011921, 0.10000000149, 0.899999976158, 0.40000000596, 0.40000000596, 0.300000011921, 0.40000000596, 0.300000011921, 0.899999976158, 0.20000000298, 0.300000011921, 0.20000000298, 0.899999976158, 0.699999988079, 0.5, 0.5, 0.600000023842, 0.699999988079, 0.300000011921, 0.899999976158, 0.300000011921, 0.899999976158, 0.10000000149, 0.5, 0.300000011921, 0.600000023842, 0.5, 0.40000000596, 0.40000000596, 0.600000023842, 0.300000011921, 0.300000011921, 0.800000011921, 0.899999976158, 0.600000023842, 0.899999976158, 0.800000011921, 0.899999976158, 0.899999976158, 0.5, 0.600000023842, 0.300000011921, 0.5, 0.800000011921, 0.600000023842, 0.40000000596, 0.300000011921, 0.10000000149, 0.899999976158, 0.800000011921, 0.300000011921, 0.800000011921, 0.40000000596, 0.800000011921, 0.300000011921, 0.699999988079, 0.600000023842, 0.800000011921, 0.40000000596, 0.10000000149, 0.600000023842, 0.300000011921, 0.800000011921, 0.699999988079, 0.300000011921, 0.5, 0.600000023842, 0.699999988079, 0.800000011921, 0.699999988079, 0.699999988079, 0.600000023842, 0.899999976158, 0.5, 0.10000000149, 0.5, 0.40000000596, 0.40000000596, 0.300000011921, 0.5, 0.899999976158, 0.10000000149, 0.300000011921, 0.10000000149, 0.300000011921, 0.40000000596, 0.300000011921, 0.20000000298, 0.10000000149, 0.20000000298, 0.899999976158, 0.800000011921, 0.5, 0.40000000596, 0.899999976158, 0.800000011921, 0.899999976158, 0.899999976158, 0.699999988079, 0.40000000596, 0.20000000298, 0.20000000298, 0.699999988079, 0.800000011921, 0.10000000149, 0.899999976158, 0.300000011921, 0.699999988079, 0.899999976158, 0.899999976158, 0.899999976158, 0.600000023842, 0.40000000596, 0.300000011921, 0.600000023842, 0.20000000298, 0.300000011921, 0.5, 0.20000000298, 0.800000011921, 0.40000000596, 0.5, 0.300000011921, 0.800000011921, 0.800000011921, 0.300000011921, 0.899999976158, 0.699999988079, 0.800000011921, 0.300000011921, 0.5, 0.300000011921, 0.5, 0.899999976158, 0.899999976158, 0.899999976158, 0.699999988079, 0.300000011921, 0.20000000298, 0.899999976158, 0.20000000298, 0.699999988079, 0.899999976158, 0.899999976158, 0.899999976158, 0.10000000149, 0.5, 0.300000011921, 0.20000000298, 0.800000011921, 0.10000000149, 0.10000000149, 0.10000000149, 0.800000011921, 0.300000011921, 0.20000000298, 0.600000023842, 0.10000000149, 0.899999976158, 0.600000023842, 0.300000011921, 0.300000011921, 0.699999988079, 0.5, 0.600000023842, 0.600000023842, 0.899999976158, 0.5, 0.800000011921, 0.20000000298, 0.800000011921, 0.800000011921, 0.40000000596, 0.899999976158, 0.5, 0.40000000596, 0.20000000298, 0.899999976158, 0.600000023842, 0.20000000298, 0.40000000596, 0.40000000596, 0.40000000596, 0.800000011921, 0.300000011921, 0.5, 0.5, 0.600000023842, 0.800000011921, 0.699999988079, 0.600000023842, 0.40000000596, 0.300000011921, 0.10000000149, 0.300000011921, 0.899999976158, 0.800000011921, 0.899999976158, 0.40000000596, 0.300000011921, 0.20000000298, 0.899999976158, 0.699999988079, 0.10000000149, 0.40000000596, 0.40000000596, 0.10000000149, 0.800000011921, 0.899999976158, 0.20000000298, 0.800000011921, 0.600000023842, 0.300000011921, 0.899999976158, 0.40000000596, 0.10000000149, 0.800000011921, 0.300000011921, 0.40000000596, 0.300000011921, 0.300000011921, 0.300000011921, 0.300000011921, 0.899999976158, 0.600000023842, 0.699999988079, 0.5, 0.899999976158, 0.20000000298, 0.899999976158, 0.5, 0.300000011921, 0.40000000596, 0.899999976158, 0.800000011921, 0.899999976158, 0.699999988079, 0.300000011921, 0.699999988079, 0.10000000149, 0.800000011921, 0.20000000298, 0.699999988079, 0.699999988079, 0.300000011921, 0.10000000149, 0.699999988079, 0.20000000298, 0.899999976158, 0.5, 0.20000000298, 0.699999988079, 0.899999976158, 0.899999976158, 0.300000011921, 0.20000000298, 0.899999976158, 0.300000011921, 0.899999976158, 0.10000000149, 0.899999976158, 0.800000011921, 0.800000011921, 0.40000000596, 0.300000011921, 0.699999988079, 0.600000023842, 0.600000023842, 0.5, 0.699999988079, 0.20000000298, 0.300000011921, 0.20000000298, 0.20000000298, 0.300000011921, 0.600000023842, 0.20000000298, 0.300000011921, 0.600000023842, 0.800000011921, 0.699999988079, 0.10000000149, 0.40000000596, 0.800000011921, 0.10000000149, 0.40000000596, 0.899999976158, 0.300000011921, 0.600000023842, 0.40000000596, 0.699999988079, 0.10000000149, 0.20000000298, 0.899999976158, 0.699999988079, 0.20000000298, 0.699999988079, 0.699999988079, 0.800000011921, 0.300000011921, 0.20000000298, 0.10000000149, 0.600000023842, 0.5, 0.600000023842, 0.800000011921, 0.10000000149, 0.699999988079, 0.300000011921, 0.899999976158, 0.20000000298, 0.20000000298, 0.20000000298, 0.600000023842, 0.800000011921, 0.10000000149, 0.800000011921, 0.899999976158, 0.600000023842, 0.899999976158, 0.20000000298, 0.20000000298, 0.10000000149, 0.20000000298, 0.300000011921, 0.300000011921, 0.699999988079, 0.10000000149, 0.600000023842, 0.899999976158, 0.20000000298, 0.10000000149, 0.5, 0.300000011921, 
+
+L3_cSYMM_o_L
+1.30999990419, 5.19000004366, 0.499999948591, 5.15999998689, 0.1200000453, 4.68000002474, 1.44999997541, 5.42000002369, 1.60999987885, 5.52000012428, 0.310000039041, 5.86000006139, 2.07999993533, 6.00000003502, 0.879999900311, 6.15000000298, 0.349999993294, 5.1800000158, 1.29999998137, 6.01000007182, 1.5199999395, 4.8900000228, 1.0400000608, 6.42000003487, -1.03999995053, 6.43999990135, 0.619999950677, 6.7799999845, -0.060000051707, 4.23000006795, 0.78999997437, 6.10000006482, 0.279999982268, 5.19000010103, 1.42000005871, 5.45000013337, 1.14000004664, 5.02000010043, 1.42000007659, 5.04000007719, 2.28000006348, 6.71000006065, 2.63000001431, 5.76000012845, 1.15000007898, 6.6100001359, 2.77000008777, 5.78000011861, 0.470000012517, 7.07000007659, 0.90000006333, 5.77000005051, 1.34000009432, 5.49000008911, 2.1799999778, 5.51000008821, 0.65000012964, 6.4400001286, 0.230000085086, 6.57000000879, 1.3700000453, 6.95000008196, 0.87000005275, 5.03000014842, 2.1200000453, 5.39000015095, 0.840000081658, 5.9100001955, 1.22999992639, 5.62000004306, 0.639999949783, 4.90000007376, 0.860000048727, 4.62000002444, 1.23000001356, 5.26000009194, 1.27999992192, 4.96000014037, 0.750000040978, 5.45000009164, 1.29999993891, 5.71000008002, -0.550000026077, 6.05000001043, 0.200000008941, 4.21000007406, 0.889999935627, 4.97000010118, 0.619999988675, 3.72000006616, 0.140000067502, 5.39000013977, -0.689999985546, 5.14000001758, 0.0599999600649, 5.44000007719, 0.659999951869, 4.11000010237, 1.13999993265, 5.4000000596, 0.459999954104, 6.11000013664, 2.17999993905, 6.13000004336, 1.05999997497, 5.55000004321, 0.670000031143, 5.32000001773, 1.99999998435, 7.13000006199, 1.64999992847, 6.43000009775, 0.400000078231, 7.2700000751, 2.69000000343, 6.89000005931, 0.0200000341237, 7.1700000751, 0.470000052005, 5.53000007764, 1.44000003323, 5.42000013471, 1.17000001103, 5.37000006542, 0.410000106096, 6.94000011519, -0.599999915808, 6.50999999136, 0.690000027269, 7.49000008613, 0.690000005662, 4.82000011981, 2.45999997273, 6.57000007883, 0.750000045449, 6.40000014752, 1.71999995813, 5.12000008106, 0.989999966919, 5.40000006035, 1.64000000864, 5.13000002101, 2.28999999374, 5.59000008464, 1.7899999781, 5.99000010177, 0.560000091195, 6.25000010133, 2.55999998689, 6.34000002503, 0.659999961555, 5.68000005826, 0.790000028014, 4.69000009134, 1.30000000373, 5.63000012532, 1.05999999434, 4.09000008836, 0.300000087172, 6.58000010148, 0.0400000183284, 5.69000001088, 1.05000001639, 5.93000008136, 1.59999992698, 4.67000012502, 1.40000001788, 5.08000011936, 0.749999983609, 5.80000011027, 2.49999997094, 5.60000008568, 2.24999996871, 5.1200000155, 1.25000003353, 4.54000003994, 1.90000000894, 6.58000002697, 1.98999992967, 6.17000007212, 0.570000090003, 6.11000005916, 2.25999999583, 6.33000007838, 0.790000006407, 6.01000008747, 0.940000005662, 4.88000007167, 1.83999994308, 5.9100000897, 1.21999999911, 4.50000007972, 1.46000007331, 5.92000009596, 0.789999985546, 6.32999993905, 1.85999999285, 6.37000008255, 0.770000019968, 4.25000007972, 1.99999995306, 6.24000005856, 0.829999992698, 6.79000004813, 1.10000005886, 5.10000008419, 0.460000080019, 5.43000002027, 0.900000043213, 4.33000004187, 1.4400000526, 6.16000005022, 1.38999999523, 6.08000012457, 0.690000077933, 5.79000007421, 2.37000007659, 6.59000007048, -0.249999940395, 6.98000001952, -0.359999929518, 5.01000006959, 1.2800000985, 5.92000010863, 1.06000002638, 4.96000007704, -0.339999788851, 6.10000008345, -0.319999908954, 6.72999995172, 0.830000090301, 6.96000005767, 0.550000020117, 5.01000009567, 0.890000035465, 5.87000009522, 0.410000054687, 5.81000010833, 1.4699999842, 6.19999999776, 1.08000002995, 5.84999998584, 0.600000053644, 4.60000000149, 1.17000001624, 6.08000000685, 1.65999996305, 5.81000007555, 0.200000094622, 6.33000001431, 1.50000003204, 5.55000005662, 0.259999984652, 5.85000006258, 0.450000010431, 4.89000003174, 1.15999996305, 5.85000004843, 1.43999994904, 5.01000001222, 0.220000126511, 5.6900000295, 0.0300000225008, 5.68999998853, 1.11999995664, 6.18000005677, 0.639999973625, 5.22000008404, 1.62000000507, 5.53000004932, -0.0999999657273, 5.81000004351, 1.95999995932, 5.37000004977, 1.01999998793, 4.64000002801, 1.94999997765, 4.41000002265, 1.93999999747, 5.38000002325, 2.01999995142, 6.00000008643, 0.630000069439, 5.6900000295, 3.09999997988, 5.9900000459, 1.29999993816, 6.15999993026, 0.940000058562, 5.27000000954, 1.50000003874, 5.88000002548, 2.45999995261, 4.34000004143, 1.10000012368, 6.04999999851, 0.770000010282, 6.33999987751, 0.950000022352, 6.83999995202, 1.73999995947, 4.13000007913, 2.61999994174, 5.57000001922, 1.29999999851, 5.87000005499, 1.66999994099, 5.17000006765, 1.53999996468, 5.53000004932, 1.70000002831, 5.78000004783, 1.21000000849, 6.42000002369, 1.28999995276, 6.3900001137, 0.710000070333, 5.89000009432, 2.56999992236, 6.95000009388, 0.989999945313, 7.28999997586, 1.36000002116, 6.04000000939, 0.930000059754, 7.1100000383, 1.389999955, 5.07000002965, 0.940000087619, 6.70000009462, -0.549999935925, 7.13999992445, 1.22999993905, 7.13000002921, 0.810000001788, 5.35000008941, 1.84999995232, 6.1300000605, 0.490000030249, 6.08000009254, 
+
+L3_cSYMM_A_nn
+0.600000023842, 0.20000000298, 0.300000011921, 0.899999976158, 0.800000011921, 0.40000000596, 0.20000000298, 0.899999976158, 0.300000011921, 0.5, 0.899999976158, 0.20000000298, 0.300000011921, 0.5, 0.699999988079, 0.899999976158, 0.699999988079, 0.40000000596, 0.20000000298, 0.300000011921, 0.699999988079, 0.899999976158, 0.40000000596, 0.800000011921, 0.600000023842, 0.40000000596, 0.600000023842, 0.699999988079, 0.20000000298, 0.10000000149, 0.300000011921, 0.20000000298, 0.800000011921, 0.20000000298, 0.300000011921, 0.899999976158, 0.800000011921, 0.800000011921, 0.5, 0.300000011921, 0.600000023842, 0.600000023842, 0.40000000596, 0.600000023842, 0.10000000149, 0.699999988079, 0.899999976158, 0.300000011921, 0.40000000596, 0.600000023842, 0.5, 0.10000000149, 0.10000000149, 0.20000000298, 0.600000023842, 0.800000011921, 0.800000011921, 0.10000000149, 0.20000000298, 0.5, 0.300000011921, 0.600000023842, 0.40000000596, 0.800000011921, 0.899999976158, 0.600000023842, 0.40000000596, 0.899999976158, 0.800000011921, 0.40000000596, 0.5, 0.300000011921, 0.5, 0.800000011921, 0.600000023842, 0.10000000149, 0.699999988079, 0.40000000596, 0.600000023842, 0.800000011921, 0.699999988079, 0.699999988079, 0.20000000298, 0.20000000298, 0.800000011921, 0.899999976158, 0.10000000149, 0.300000011921, 0.699999988079, 0.10000000149, 0.300000011921, 0.300000011921, 0.10000000149, 0.5, 0.40000000596, 0.40000000596, 0.5, 0.600000023842, 0.10000000149, 0.800000011921, 0.5, 0.699999988079, 0.20000000298, 0.899999976158, 0.600000023842, 0.600000023842, 0.600000023842, 0.10000000149, 0.600000023842, 0.300000011921, 0.600000023842, 0.40000000596, 0.600000023842, 0.40000000596, 0.300000011921, 0.40000000596, 0.699999988079, 0.600000023842, 0.20000000298, 0.899999976158, 0.10000000149, 0.899999976158, 0.600000023842, 0.600000023842, 0.300000011921, 0.899999976158, 0.5, 0.40000000596, 0.899999976158, 0.10000000149, 0.10000000149, 0.300000011921, 0.899999976158, 0.300000011921, 0.600000023842, 0.899999976158, 0.300000011921, 0.5, 0.40000000596, 0.600000023842, 0.699999988079, 0.40000000596, 0.600000023842, 0.40000000596, 0.40000000596, 0.300000011921, 0.899999976158, 0.5, 0.600000023842, 0.5, 0.10000000149, 0.800000011921, 0.600000023842, 0.600000023842, 0.5, 0.600000023842, 0.699999988079, 0.5, 0.5, 0.10000000149, 0.699999988079, 0.300000011921, 0.5, 0.20000000298, 0.899999976158, 0.699999988079, 0.5, 0.40000000596, 0.600000023842, 0.5, 0.899999976158, 0.20000000298, 0.10000000149, 0.699999988079, 0.600000023842, 0.800000011921, 0.600000023842, 0.40000000596, 0.899999976158, 0.5, 0.899999976158, 0.5, 0.600000023842, 0.899999976158, 0.899999976158, 0.800000011921, 0.5, 0.40000000596, 0.899999976158, 0.10000000149, 0.5, 0.800000011921, 0.800000011921, 0.699999988079, 0.300000011921, 0.300000011921, 0.10000000149, 0.899999976158, 0.5, 0.5, 0.40000000596, 0.300000011921, 0.899999976158, 0.300000011921, 0.300000011921, 0.5, 0.899999976158, 0.300000011921, 0.699999988079, 0.699999988079, 0.300000011921, 0.40000000596, 0.600000023842, 0.5, 0.600000023842, 0.899999976158, 0.300000011921, 0.600000023842, 0.300000011921, 0.699999988079, 0.5, 0.699999988079, 0.5, 0.40000000596, 0.10000000149, 0.800000011921, 0.600000023842, 0.300000011921, 0.699999988079, 0.600000023842, 0.40000000596, 0.699999988079, 0.600000023842, 0.5, 0.20000000298, 0.699999988079, 0.40000000596, 0.699999988079, 0.699999988079, 0.899999976158, 0.40000000596, 0.600000023842, 0.20000000298, 0.20000000298, 0.699999988079, 0.600000023842, 0.10000000149, 0.800000011921, 0.899999976158, 0.800000011921, 0.300000011921, 0.699999988079, 0.800000011921, 0.40000000596, 0.699999988079, 0.800000011921, 0.5, 0.800000011921, 0.10000000149, 0.20000000298, 0.20000000298, 0.20000000298, 0.20000000298, 0.600000023842, 0.600000023842, 0.5, 0.699999988079, 0.600000023842, 0.800000011921, 0.10000000149, 0.5, 0.300000011921, 0.699999988079, 0.40000000596, 0.5, 0.10000000149, 0.800000011921, 0.899999976158, 0.20000000298, 0.899999976158, 0.600000023842, 0.600000023842, 0.5, 0.40000000596, 0.5, 0.699999988079, 0.699999988079, 0.800000011921, 0.300000011921, 0.300000011921, 0.5, 0.699999988079, 0.40000000596, 0.699999988079, 0.699999988079, 0.800000011921, 0.10000000149, 0.20000000298, 0.5, 0.699999988079, 0.800000011921, 0.300000011921, 0.40000000596, 0.20000000298, 0.300000011921, 0.40000000596, 0.20000000298, 0.300000011921, 0.10000000149, 0.20000000298, 0.10000000149, 0.300000011921, 0.10000000149, 0.899999976158, 0.5, 0.600000023842, 0.899999976158, 0.10000000149, 0.5, 0.40000000596, 0.5, 0.800000011921, 0.5, 0.699999988079, 0.10000000149, 0.5, 0.40000000596, 0.600000023842, 0.800000011921, 0.899999976158, 0.800000011921, 0.899999976158, 0.600000023842, 0.5, 0.10000000149, 0.20000000298, 0.899999976158, 0.600000023842, 0.899999976158, 0.40000000596, 0.699999988079, 0.899999976158, 0.600000023842, 0.800000011921, 0.699999988079, 0.10000000149, 0.600000023842, 0.600000023842, 0.699999988079, 0.5, 0.5, 0.800000011921, 0.10000000149, 0.800000011921, 0.10000000149, 0.20000000298, 0.40000000596, 0.699999988079, 0.40000000596, 0.600000023842, 0.10000000149, 0.5, 0.600000023842, 0.20000000298, 0.899999976158, 0.5, 0.20000000298, 0.699999988079, 0.800000011921, 0.600000023842, 0.699999988079, 0.699999988079, 0.40000000596, 0.10000000149, 0.40000000596, 0.800000011921, 0.800000011921, 0.10000000149, 0.300000011921, 0.300000011921, 0.300000011921, 0.899999976158, 0.5, 0.10000000149, 0.800000011921, 0.699999988079, 0.600000023842, 0.300000011921, 0.20000000298, 0.20000000298, 0.699999988079, 0.800000011921, 0.800000011921, 0.899999976158, 0.600000023842, 0.20000000298, 0.800000011921, 0.800000011921, 0.699999988079, 0.10000000149, 0.699999988079, 0.300000011921, 0.899999976158, 0.600000023842, 0.699999988079, 0.699999988079, 0.300000011921, 0.899999976158, 0.600000023842, 0.40000000596, 0.20000000298, 0.5, 0.10000000149, 0.5, 0.5, 0.40000000596, 0.699999988079, 0.300000011921, 0.300000011921, 0.300000011921, 0.699999988079, 0.600000023842, 0.20000000298, 0.600000023842, 0.10000000149, 0.20000000298, 0.800000011921, 0.899999976158, 0.899999976158, 0.5, 0.699999988079, 0.10000000149, 0.699999988079, 0.699999988079, 0.699999988079, 0.699999988079, 0.300000011921, 0.800000011921, 0.40000000596, 0.40000000596, 0.10000000149, 0.10000000149, 0.600000023842, 0.699999988079, 0.300000011921, 0.600000023842, 0.40000000596, 0.40000000596, 0.899999976158, 0.10000000149, 0.5, 0.20000000298, 0.10000000149, 0.899999976158, 0.40000000596, 0.699999988079, 0.600000023842, 0.5, 0.5, 0.699999988079, 0.600000023842, 0.5, 0.20000000298, 0.699999988079, 0.699999988079, 0.300000011921, 0.699999988079, 0.699999988079, 0.10000000149, 0.300000011921, 0.800000011921, 0.800000011921, 0.699999988079, 0.20000000298, 0.40000000596, 0.800000011921, 0.20000000298, 0.10000000149, 0.40000000596, 0.800000011921, 0.5, 0.600000023842, 0.10000000149, 0.300000011921, 0.899999976158, 0.699999988079, 0.5, 0.5, 0.600000023842, 0.5, 0.699999988079, 0.600000023842, 0.800000011921, 0.300000011921, 0.10000000149, 0.20000000298, 0.800000011921, 0.600000023842, 0.899999976158, 0.600000023842, 0.300000011921, 0.800000011921, 0.800000011921, 0.800000011921, 0.800000011921, 0.10000000149, 0.899999976158, 0.5, 0.600000023842, 0.40000000596, 0.300000011921, 0.20000000298, 0.899999976158, 0.600000023842, 0.10000000149, 0.800000011921, 0.899999976158, 0.300000011921, 0.5, 0.40000000596, 0.40000000596, 0.300000011921, 0.20000000298, 0.699999988079, 0.800000011921, 0.10000000149, 0.40000000596, 0.20000000298, 0.899999976158, 0.600000023842, 0.699999988079, 0.699999988079, 0.699999988079, 0.699999988079, 0.40000000596, 0.40000000596, 0.699999988079, 0.20000000298, 0.899999976158, 0.5, 0.10000000149, 0.899999976158, 0.5, 0.600000023842, 0.800000011921, 0.20000000298, 0.40000000596, 0.899999976158, 0.5, 0.699999988079, 0.600000023842, 0.899999976158, 0.600000023842, 0.5, 0.899999976158, 0.300000011921, 0.40000000596, 0.699999988079, 0.5, 0.300000011921, 0.300000011921, 0.40000000596, 0.899999976158, 0.40000000596, 0.40000000596, 0.10000000149, 0.300000011921, 0.899999976158, 0.10000000149, 0.10000000149, 0.40000000596, 0.800000011921, 0.600000023842, 0.40000000596, 0.5, 0.600000023842, 0.800000011921, 0.300000011921, 
+
+L3_cSYMM_o_R
+-0.0399998991191, 8.4100000681, -0.220000080317, 8.34000016585, 0.219999972284, 7.86000014484, 0.640000045151, 7.70000011474, 1.36999993503, 7.85000014603, 0.120000038594, 9.56999997601, -0.189999983311, 8.35000012815, 0.329999922663, 8.25000012815, -0.0699999551475, 8.37000006989, 0.35999995634, 8.42000002891, 0.459999957085, 8.54000008985, 1.42000004381, 8.81000012621, -0.170000043064, 8.47000002593, -0.210000004768, 8.78000008807, 0.689999914765, 9.50000013486, 0.569999908954, 9.65000005439, 0.230000002384, 9.24000004962, 1.33000004113, 9.36000009269, 0.869999993891, 8.69000019491, 1.79999998659, 8.72000016525, 0.870000097454, 9.24000012785, 2.49999997541, 9.4500000976, 2.95999995857, 10.7900000906, 0.390000077188, 9.9300001514, 0.629999901801, 9.15000018254, 1.17000001103, 10.3400000668, 0.250000029802, 8.74000011966, 0.809999977201, 9.37000015855, 1.67000007734, 10.510000118, 1.15999996379, 9.16000012174, 0.760000045747, 9.92000008926, 2.28999999821, 9.99000020981, 2.42999992713, 9.54000011146, 1.9800000754, 8.79000019416, 1.23000003517, 9.48000002846, 0.73999991104, 9.2000001803, 1.58999996245, 7.95000014305, 1.80999995261, 9.34000012785, 1.80999988928, 8.77000014737, 2.01999988735, 10.2500000425, -0.309999997318, 9.34000008315, 0.669999870956, 8.71000016198, 1.02999991968, 9.0900000906, 0.96999991715, 8.21000009641, 0.0299999643862, 8.8200000684, 2.54999998361, 9.15000014901, 0.579999897331, 8.40000008568, 0.319999985695, 8.76000011727, 2.3699998568, 9.81000021264, 2.45999985278, 9.05000007525, 1.90999995708, 9.3200001429, 0.240000082403, 9.76000002041, 0.0299999405444, 9.66000016347, -0.269999998361, 8.73000011116, 0.270000067651, 10.1400001584, 0.729999991208, 10.5400000697, 0.670000032634, 10.5700000431, -1.02999992639, 10.1000000924, 0.71999991864, 9.95000013486, -0.80999990195, 9.55000009611, -0.589999996722, 8.91000010908, -0.43999996841, 10.4500001043, 0.430000068694, 11.190000104, 0.250000014901, 9.14000005707, 9.68575473159e-08, 9.9100000681, 0.749999973178, 9.6600001359, 0.929999947995, 9.76000001818, 0.960000100881, 9.44000012338, -0.539999867827, 8.21000012994, -1.40000005737, 8.92000013545, 0.0699999804795, 8.9800000903, 0.239999981821, 9.27000012502, 0.339999976605, 9.55000007674, 0.450000008196, 9.46000006065, -0.709999960065, 9.45000007749, -0.450000111014, 8.71000010759, -0.499999941885, 8.34000015095, -0.570000017732, 9.47000006095, -0.610000030845, 9.00000006929, 0.40000006184, 10.4300000538, -0.219999985695, 8.30000003278, -0.0199999752641, 8.27000006095, 0.529999931604, 9.49000018224, 0.259999931753, 9.77000001699, 0.570000057966, 9.29000013828, 2.61000008151, 10.8600000107, 2.5999998942, 11.1000000201, 2.53999997959, 9.77000005051, 1.90000007451, 11.4100000264, 3.31999993652, 11.0800000329, 3.41999991864, 12.4699999589, 1.01000002712, 11.7200000006, 2.60999989823, 10.6100000808, 1.79999996796, 10.9499999784, 1.18999998555, 11.5999999687, 2.48999992818, 10.7600000279, 3.07999999717, 11.590000072, 2.17999995619, 10.1799999912, 2.38999999002, 11.2699999835, 2.92999994352, 10.8500000902, 2.63999988869, 10.9599999779, 3.03000003517, 11.3199999909, 1.61000000253, 8.91000005618, 0.0899999631941, 8.60000019893, 1.10999996603, 8.08000016481, 1.11000004724, 8.75000015199, 1.88999994904, 9.56000015303, 2.72999992639, 10.0200000669, 0.360000033826, 10.3100001203, 0.439999902844, 9.62000010639, 0.400000021607, 8.64000008464, 1.60999999657, 9.46000002787, 0.559999934733, 9.63000010297, 1.68000002623, 9.460000083, 1.12999997333, 9.24000002578, 0.980000002384, 9.27000004455, 2.12999995545, 9.36000016049, 1.61999983892, 9.54000003546, 1.45000000596, 9.06000013739, 0.200000090897, 9.7199999924, 0.180000011325, 9.29000015095, 0.41000002712, 8.0500001289, 0.380000071675, 7.99000013158, 1.10000000447, 8.46000010908, 1.35999993697, 10.4300000151, -1.51999988586, 8.94000006378, 0.0299999517202, 8.89000006452, 0.689999990016, 8.84000006378, -0.869999991655, 9.35000002682, 0.399999953061, 9.3900000608, 0.140000091344, 8.9100000599, 0.989999949038, 7.31000012994, -0.139999960959, 8.05000006706, 1.31999991193, 9.58000013202, 1.2399999401, 8.8000000447, 0.99000003919, 9.26000008747, -0.55999983564, 9.29000004217, -0.480000039637, 9.71000008896, -0.340000010133, 8.1400001055, -0.699999948591, 9.20000007972, 0.399999959767, 8.6700001429, 0.28999996841, 9.58999999374, -0.579999957681, 9.25000007749, -0.250000045449, 9.56000007108, -0.0600000070035, 9.48000003591, -0.699999991059, 9.37000001773, 0.0299999405444, 8.81000008449, 0.550000039488, 9.69000005484, 1.5899998872, 7.83000001803, -0.199999982119, 8.94000001609, 0.759999878109, 9.78000006571, 1.37999988168, 9.50999997497, 0.140000092089, 9.0700000684, 1.37000004679, 10.2200000513, 1.07000000954, 10.4300001246, 1.16000001222, 9.6400001286, 0.0600000718236, 10.8600000905, 2.04999998584, 10.1600000979, 2.15999992132, 11.0500000179, -0.619999898523, 10.6600001098, 1.81999992982, 10.5600000808, 1.4200000006, 10.8000000149, 1.0399999848, 10.8100000398, 0.630000006855, 10.7000000246, 1.60000001341, 10.6000000924, 2.11999991789, 8.09000008464, 0.810000001043, 9.87000007883, 2.27999996737, 10.7900001219, 1.73999991626, 8.69000010028, 2.02000000954, 9.82000006989, 
+
+L3_zSYMM_A_mm
+0.5, 0.1, 0.9, 0.9, 0.1, 0.8, 0.1, 0.8, 0.5, 0.9, 0.4, 0.1, 0.7, 0.2, 0.7, 0.5, 0.6, 0.9, 0.5, 0.6, 0.9, 0.9, 0.5, 0.3, 0.1, 0.3, 0.9, 0.6, 0.6, 0.3, 0.2, 0.5, 0.7, 0.3, 0.4, 0.6, 0.8, 0.5, 0.5, 0.3, 0.1, 0.8, 0.1, 0.3, 0.6, 0.7, 0.3, 0.2, 0.7, 0.4, 0.5, 0.5, 0.5, 0.2, 0.8, 0.4, 0.8, 0.1, 0.7, 0.9, 0.1, 0.8, 0.9, 0.6, 0.3, 0.2, 0.5, 0.1, 0.2, 0.9, 0.8, 0.5, 0.2, 0.4, 0.1, 0.2, 0.7, 0.3, 0.8, 0.8, 0.5, 0.9, 0.6, 0.3, 0.7, 0.4, 0.2, 0.9, 0.9, 0.2, 0.7, 0.4, 0.4, 0.4, 0.3, 0.5, 0.4, 0.5, 0.7, 0.8, 0.4, 0.1, 0.2, 0.5, 0.5, 0.5, 0.8, 0.5, 0.7, 0.4, 0.1, 0.5, 0.3, 0.9, 0.7, 0.9, 0.7, 0.6, 0.6, 0.4, 0.7, 0.2, 0.7, 0.3, 0.5, 0.2, 0.2, 0.4, 0.4, 0.4, 0.3, 0.9, 0.2, 0.4, 0.4, 0.8, 0.2, 0.3, 0.4, 0.4, 0.7, 0.5, 0.4, 0.6, 0.8, 0.4, 0.1, 0.2, 0.3, 0.5, 0.7, 0.9, 0.4, 0.8, 0.5, 0.3, 0.8, 0.7, 0.7, 0.8, 0.6, 0.9, 0.8, 0.5, 0.8, 0.1, 0.7, 0.3, 0.4, 0.5, 0.7, 0.6, 0.2, 0.3, 0.8, 0.7, 0.9, 0.7, 0.9, 0.1, 0.5, 0.6, 0.5, 0.3, 0.7, 0.9, 0.8, 0.8, 0.7, 0.8, 0.6, 0.4, 0.4, 0.4, 0.7, 0.8, 0.9, 0.1, 0.1, 0.1, 
+
+L3_zSYMM_B_mn
+0.3, 0.5, 0.9, 0.9, 0.6, 0.9, 0.8, 0.2, 0.5, 0.4, 0.6, 0.4, 0.6, 0.1, 0.3, 0.1, 0.7, 0.2, 0.9, 0.7, 0.5, 0.8, 0.6, 0.6, 0.1, 0.3, 0.8, 0.2, 0.4, 0.2, 0.4, 0.2, 0.3, 0.9, 0.4, 0.6, 0.8, 0.7, 0.7, 0.2, 0.5, 0.7, 0.7, 0.7, 0.6, 0.3, 0.4, 0.6, 0.7, 0.3, 0.3, 0.5, 0.4, 0.2, 0.4, 0.5, 0.3, 0.6, 0.8, 0.2, 0.6, 0.8, 0.2, 0.5, 0.8, 0.3, 0.7, 0.5, 0.8, 0.2, 0.1, 0.9, 0.7, 0.3, 0.1, 0.9, 0.4, 0.6, 0.7, 0.6, 0.9, 0.2, 0.5, 0.1, 0.4, 0.6, 0.8, 0.9, 0.4, 0.2, 0.5, 0.9, 0.4, 0.2, 0.4, 0.4, 0.4, 0.3, 0.1, 0.4, 0.2, 0.6, 0.2, 0.8, 0.8, 0.5, 0.1, 0.5, 0.6, 0.2, 0.2, 0.7, 0.6, 0.2, 0.6, 0.3, 0.5, 0.1, 0.7, 0.7, 0.8, 0.9, 0.1, 0.1, 0.1, 0.2, 0.6, 0.5, 0.3, 0.4, 0.8, 0.1, 0.4, 0.4, 0.1, 0.2, 0.4, 0.7, 0.4, 0.5, 0.4, 0.1, 0.4, 0.1, 0.5, 0.4, 0.5, 0.1, 0.4, 0.8, 0.4, 0.4, 0.5, 0.3, 0.1, 0.8, 0.4, 0.4, 0.3, 0.8, 0.8, 0.1, 0.2, 0.2, 0.5, 0.6, 0.1, 0.1, 0.9, 0.9, 0.3, 0.2, 0.3, 0.7, 0.6, 0.8, 0.3, 0.6, 0.1, 0.3, 0.7, 0.2, 0.5, 0.2, 0.8, 0.1, 0.4, 0.7, 0.5, 0.7, 0.7, 0.5, 0.6, 0.7, 0.1, 0.8, 0.3, 0.5, 0.2, 0.9, 0.9, 0.2, 0.2, 0.5, 0.8, 0.8, 0.9, 0.3, 0.3, 0.2, 0.4, 0.3, 0.6, 0.4, 0.5, 0.8, 0.5, 0.9, 0.1, 0.1, 0.9, 0.6, 0.6, 0.9, 0.6, 0.6, 0.3, 0.1, 0.5, 0.5, 0.9, 0.7, 0.8, 0.1, 0.7, 0.7, 0.6, 0.3, 0.1, 0.5, 0.9, 0.9, 0.4, 0.2, 0.8, 0.3, 0.8, 0.1, 0.6, 0.1, 0.6, 0.6, 0.7, 0.5, 0.8, 0.4, 0.9, 0.6, 0.1, 0.7, 0.1, 0.4, 0.7, 0.1, 0.5, 0.6, 0.8, 0.8, 0.1, 0.4, 0.3, 0.6, 0.5, 0.9, 0.2, 0.2, 0.8, 0.8, 0.5, 0.1, 0.9, 0.6, 0.7, 0.9, 0.6, 0.8, 0.8, 0.3, 0.4, 0.4, 0.8, 0.7, 0.3, 0.1, 0.8, 0.4, 0.2, 0.9, 0.4, 0.8, 0.6, 0.5, 0.7, 0.5, 0.4, 0.2, 0.2, 0.5, 0.7, 0.8, 0.4, 0.7, 0.8, 0.9, 0.6, 0.3, 0.3, 0.2, 0.5, 0.6, 0.9, 0.6, 0.8, 0.6, 0.1, 0.2, 0.2, 0.5, 0.7, 0.8, 0.3, 0.9, 0.1, 0.2, 0.9, 0.4, 0.6, 0.4, 0.4, 0.1, 
+
+L3_zSYMM_C_mn
+0.4, 0.2, 0.2, 0.3, 0.2, 0.4, 0.4, 0.4, 0.9, 0.1, 0.5, 0.1, 0.4, 0.5, 0.1, 0.3, 0.6, 0.3, 0.9, 0.2, 0.1, 0.7, 0.7, 0.8, 0.9, 0.9, 0.5, 0.2, 0.5, 0.4, 0.9, 0.3, 0.8, 0.3, 0.5, 0.2, 0.8, 0.3, 0.2, 0.2, 0.9, 0.3, 0.4, 0.1, 0.5, 0.2, 0.6, 0.5, 0.2, 0.6, 0.2, 0.4, 0.2, 0.2, 0.9, 0.1, 0.4, 0.4, 0.8, 0.1, 0.5, 0.8, 0.8, 0.4, 0.6, 0.3, 0.8, 0.6, 0.4, 0.2, 0.3, 0.9, 0.5, 0.3, 0.2, 0.5, 0.2, 0.6, 0.3, 0.8, 0.4, 0.9, 0.4, 0.8, 0.3, 0.9, 0.3, 0.7, 0.7, 0.3, 0.6, 0.6, 0.9, 0.8, 0.1, 0.4, 0.5, 0.4, 0.2, 0.9, 0.5, 0.7, 0.4, 0.7, 0.5, 0.5, 0.9, 0.4, 0.3, 0.8, 0.4, 0.2, 0.9, 0.2, 0.2, 0.4, 0.3, 0.3, 0.1, 0.6, 0.2, 0.2, 0.9, 0.9, 0.8, 0.5, 0.2, 0.5, 0.4, 0.3, 0.4, 0.8, 0.9, 0.6, 0.2, 0.3, 0.7, 0.5, 0.7, 0.4, 0.1, 0.1, 0.4, 0.6, 0.2, 0.5, 0.6, 0.8, 0.4, 0.6, 0.7, 0.5, 0.4, 0.3, 0.4, 0.4, 0.6, 0.6, 0.8, 0.2, 0.5, 0.1, 0.7, 0.9, 0.3, 0.1, 0.7, 0.7, 0.8, 0.5, 0.7, 0.9, 0.8, 0.4, 0.7, 0.9, 0.6, 0.1, 0.6, 0.4, 0.4, 0.8, 0.3, 0.9, 0.6, 0.9, 0.8, 0.7, 0.3, 0.2, 0.5, 0.3, 0.7, 0.2, 0.8, 0.1, 0.8, 0.6, 0.8, 0.5, 0.5, 0.4, 0.8, 0.4, 0.5, 0.8, 0.1, 0.7, 0.4, 0.6, 0.5, 0.9, 0.9, 0.6, 0.5, 0.6, 0.2, 0.7, 0.8, 0.5, 0.6, 0.7, 0.7, 0.5, 0.1, 0.7, 0.2, 0.6, 0.8, 0.4, 0.8, 0.2, 0.4, 0.2, 0.5, 0.9, 0.8, 0.9, 0.9, 0.9, 0.7, 0.4, 0.3, 0.8, 0.4, 0.3, 0.9, 0.3, 0.9, 0.5, 0.8, 0.7, 0.4, 0.1, 0.1, 0.7, 0.8, 0.2, 0.5, 0.9, 0.2, 0.5, 0.9, 0.1, 0.1, 0.6, 0.2, 0.6, 0.7, 0.8, 0.5, 0.1, 0.3, 0.3, 0.7, 0.5, 0.9, 0.9, 0.4, 0.2, 0.3, 0.4, 0.7, 0.2, 0.5, 0.1, 0.2, 0.4, 0.2, 0.1, 0.1, 0.5, 0.1, 0.9, 0.3, 0.8, 0.7, 0.3, 0.5, 0.6, 0.9, 0.4, 0.6, 0.7, 0.8, 0.4, 0.3, 0.7, 0.2, 0.2, 0.2, 0.7, 0.7, 0.6, 0.5, 0.9, 0.1, 0.2, 0.9, 0.8, 0.3, 0.7, 0.2, 0.9, 0.1, 0.7, 0.5, 0.6, 0.9, 0.2, 0.9, 0.4, 0.9, 0.7, 0.4, 0.6, 0.7, 0.8, 0.9, 0.8, 
+
+L3_zSYMM_o_L
+-1.2, 5.58, -0.02, 6.56, 0.46, 5.56, 0.66, 5.35, 1.0, 5.55, 1.14, 5.42, -0.26, 6.72, 1.28, 5.31, 0.68, 5.78, -0.01, 6.38, -0.03, 5.0, -0.5, 5.81, 0.88, 6.15, 0.11, 5.13, 0.73, 6.07, 1.49, 4.67, 0.57, 5.33, 0.01, 5.51, 1.48, 6.52, 0.34, 5.31, 2.42, 4.76, 1.49, 5.14, 2.0, 5.21, 1.57, 6.13, 2.06, 4.58, 1.53, 5.84, 0.51, 7.06, 0.7, 4.22, 0.36, 5.07, 1.26, 4.58, 1.09, 5.68, 2.18, 5.04, 1.78, 4.53, 0.81, 4.85, 0.3, 4.83, -0.35, 6.73, 0.69, 4.92, 0.42, 5.12, 1.25, 4.93, 1.74, 5.3, 1.39, 6.44, 2.25, 5.02, 1.17, 6.19, 0.43, 6.64, 0.23, 4.1, -0.05, 5.65, 1.18, 5.03, 0.37, 4.76, 1.66, 5.39, 0.97, 4.82, 0.27, 4.71, -0.57, 5.11, -0.14, 6.3, 1.03, 5.32, 0.53, 5.84, 0.75, 5.04, 1.96, 4.54, 0.12, 5.23, 2.04, 4.29, 0.32, 5.96, -0.31, 5.06, 0.21, 4.63, 0.07, 5.45, -0.01, 5.25, 0.17, 4.82, 0.59, 5.55, 2.27, 4.63, -0.54, 4.4, -0.12, 5.23, 0.11, 7.45, 0.03, 5.06, 0.79, 6.28, 0.58, 5.6, 1.73, 5.73, 0.97, 6.39, 2.49, 5.02, 0.74, 6.33, -0.32, 7.21, 0.41, 4.79, 0.52, 5.97, 0.3, 4.6, 0.61, 5.67, 1.05, 5.88, 1.32, 4.99, 0.89, 5.14, -0.59, 6.22, 0.57, 6.78, 0.87, 5.72, 1.15, 4.66, 1.11, 5.65, 1.09, 5.72, 0.12, 6.56, 2.06, 5.37, 1.11, 6.38, -0.26, 6.87, -0.33, 4.17, 0.15, 4.92, 0.85, 4.9, -0.07, 5.36, 1.54, 5.8, 0.32, 4.79, 0.48, 4.91, -0.23, 4.39, -0.21, 6.17, 0.54, 4.51, 0.81, 5.07, 1.41, 4.57, 1.48, 4.51, 0.26, 4.88, 1.88, 4.21, 0.6, 5.15, 0.22, 5.44, -0.41, 4.28, -0.37, 4.77, 0.61, 3.84, 0.58, 3.84, 0.07, 4.39, 0.84, 4.35, 0.48, 4.76, -0.03, 6.12, 0.1, 7.3, 0.45, 6.7, 0.52, 5.77, 1.39, 5.68, 1.74, 6.05, 0.89, 6.37, 2.18, 4.88, 0.25, 6.67, 0.5, 6.73, 0.01, 5.7, -0.25, 6.53, -0.1, 5.08, -0.31, 5.77, 0.44, 6.21, 1.29, 5.97, -0.01, 5.17, 0.07, 5.71, 1.59, 7.99, 2.04, 6.86, 2.49, 6.05, 2.0, 6.15, 2.93, 5.56, 2.07, 5.94, 3.33, 4.98, 1.98, 6.25, 1.09, 7.77, 0.1, 5.56, 0.92, 6.8, 1.63, 5.53, 0.96, 6.25, 2.36, 5.99, 2.36, 5.42, 0.76, 5.43, -0.11, 6.26, -0.12, 6.93, 1.16, 5.82, 1.53, 5.35, 1.3, 6.19, 2.02, 5.65, 1.94, 6.85, 2.44, 4.76, 0.94, 6.91, 0.06, 8.26, 0.34, 4.75, 0.42, 5.14, 1.95, 5.54, 1.26, 6.03, 1.37, 6.18, 1.6, 4.71, 0.28, 5.75, 
+
+L3_zSYMM_A_nn
+0.7, 0.2, 0.1, 0.2, 0.4, 0.9, 0.8, 0.1, 0.8, 0.3, 0.1, 0.7, 0.1, 0.5, 0.6, 0.3, 0.8, 0.8, 0.2, 0.2, 0.4, 0.5, 0.3, 0.4, 0.8, 0.2, 0.1, 0.2, 0.5, 0.4, 0.2, 0.8, 0.7, 0.8, 0.1, 0.2, 0.7, 0.9, 0.2, 0.2, 0.5, 0.9, 0.8, 0.3, 0.4, 0.4, 0.1, 0.3, 0.6, 0.8, 0.5, 0.5, 0.3, 0.7, 0.1, 0.8, 0.4, 0.3, 0.5, 0.3, 0.8, 0.4, 0.1, 0.1, 0.6, 0.7, 0.5, 0.8, 0.4, 0.9, 0.2, 0.2, 0.4, 0.7, 0.8, 0.1, 0.7, 0.6, 0.3, 0.8, 0.6, 0.8, 0.9, 0.8, 0.1, 0.9, 0.4, 0.2, 0.3, 0.3, 0.4, 0.9, 0.5, 0.7, 0.2, 0.2, 0.4, 0.8, 0.4, 0.1, 0.8, 0.1, 0.8, 0.1, 0.5, 0.9, 0.8, 0.1, 0.6, 0.3, 0.4, 0.6, 0.3, 0.2, 0.7, 0.3, 0.1, 0.2, 0.2, 0.8, 0.9, 0.9, 0.8, 0.1, 0.7, 0.6, 0.3, 0.7, 0.6, 0.1, 0.5, 0.3, 0.3, 0.5, 0.1, 0.4, 0.8, 0.3, 0.8, 0.3, 0.7, 0.6, 0.4, 0.6, 0.8, 0.9, 0.5, 0.2, 0.8, 0.8, 0.6, 0.9, 0.8, 0.7, 0.5, 0.6, 0.9, 0.3, 0.9, 0.1, 0.2, 0.2, 0.1, 0.2, 0.8, 0.8, 0.7, 0.5, 0.8, 0.9, 0.1, 0.7, 0.4, 0.4, 0.3, 0.8, 0.3, 0.2, 0.5, 0.2, 0.3, 0.5, 0.9, 0.2, 0.3, 0.4, 0.7, 0.4, 0.4, 0.5, 0.6, 0.3, 0.1, 0.2, 0.9, 0.4, 0.4, 0.7, 0.9, 0.4, 0.2, 0.4, 0.4, 0.4, 0.1, 0.5, 0.1, 0.3, 0.6, 0.8, 0.7, 0.3, 0.8, 0.8, 0.9, 0.2, 0.6, 0.4, 0.2, 0.8, 0.5, 0.9, 0.5, 0.4, 0.2, 0.3, 0.7, 0.4, 0.1, 0.3, 0.7, 0.6, 0.1, 0.6, 0.3, 0.4, 0.9, 0.8, 0.6, 0.3, 0.6, 0.8, 0.9, 0.8, 0.1, 0.2, 0.6, 0.9, 0.3, 0.4, 0.2, 0.8, 0.6, 0.7, 0.4, 0.8, 0.7, 0.7, 0.4, 0.1, 0.2, 0.5, 0.7, 0.9, 0.6, 0.4, 0.8, 0.9, 0.6, 0.1, 0.8, 0.8, 0.8, 0.8, 0.5, 0.5, 0.1, 0.9, 0.2, 0.8, 0.8, 0.7, 0.7, 0.4, 0.5, 0.9, 0.4, 0.8, 0.3, 0.9, 0.2, 0.2, 0.8, 0.9, 0.5, 0.6, 0.7, 0.4, 0.3, 0.4, 0.7, 0.6, 0.7, 0.8, 0.7, 0.4, 0.2, 0.2, 0.3, 0.7, 0.4, 0.2, 0.9, 0.9, 0.5, 0.6, 0.4, 0.5, 0.5, 0.4, 0.7, 0.7, 0.2, 0.2, 0.6, 0.6, 0.2, 0.8, 0.7, 0.8, 0.5, 0.5, 0.6, 0.6, 0.8, 0.3, 0.7, 0.8, 0.2, 0.3, 0.4, 0.5, 0.1, 0.8, 0.3, 0.3, 0.8, 0.1, 0.9, 0.3, 0.6, 0.3, 0.2, 0.3, 0.4, 0.1, 0.8, 0.9, 0.2, 0.8, 0.7, 0.1, 0.1, 0.4, 0.9, 0.9, 0.3, 0.9, 0.7, 0.1, 0.8, 0.7, 0.5, 0.4, 0.3, 0.4, 0.4, 0.3, 0.4, 0.9, 0.7, 0.6, 0.9, 0.1, 0.1, 0.2, 0.7, 0.4, 0.2, 0.5, 0.5, 0.6, 0.7, 0.8, 0.1, 0.4, 0.1, 0.3, 0.5, 0.1, 0.6, 0.4, 0.2, 0.8, 0.9, 0.8, 0.7, 0.2, 0.8, 0.2, 0.5, 0.3, 0.5, 0.7, 0.3, 0.7, 0.2, 0.2, 0.9, 0.4, 0.1, 0.3, 0.7, 0.9, 0.7, 0.4, 0.5, 0.5, 0.9, 0.9, 0.5, 0.1, 0.4, 0.3, 0.7, 0.9, 0.1, 0.5, 0.7, 0.6, 0.9, 0.5, 0.1, 0.2, 0.8, 0.4, 0.2, 0.2, 0.6, 0.1, 0.1, 0.2, 0.4, 0.7, 0.7, 0.6, 0.6, 0.4, 0.3, 0.4, 0.6, 0.6, 0.3, 0.9, 0.6, 0.4, 0.7, 0.9, 0.5, 0.6, 0.3, 0.4, 0.7, 0.4, 0.8, 0.4, 0.5, 0.4, 0.1, 0.1, 0.4, 0.8, 0.5, 0.3, 0.8, 0.8, 0.9, 0.4, 0.1, 0.6, 0.8, 0.9, 0.7, 0.6, 0.8, 0.3, 0.7, 0.1, 0.2, 0.8, 0.1, 0.5, 0.3, 0.4, 0.9, 0.5, 0.5, 0.1, 0.6, 0.6, 0.2, 0.8, 0.6, 0.7, 0.4, 0.1, 0.3, 0.5, 0.7, 0.5, 0.2, 0.4, 0.3, 0.4, 0.6, 0.1, 0.7, 0.8, 0.7, 0.8, 0.8, 0.7, 0.9, 0.8, 0.7, 0.6, 0.7, 0.4, 0.5, 0.1, 0.2, 0.8, 0.9, 0.4, 0.7, 0.8, 0.5, 0.8, 0.8, 0.1, 0.1, 0.4, 0.8, 0.9, 0.4, 0.4, 0.9, 0.8, 0.8, 0.8, 0.7, 0.4, 0.2, 0.3, 0.5, 0.4, 0.7, 0.2, 0.9, 0.5, 0.8, 0.4, 0.6, 0.6, 0.9, 0.4, 0.1, 0.9, 
+
+L3_zSYMM_o_R
+0.46, 7.37, 0.17, 8.33, 0.51, 8.27, 2.15, 8.81, 3.18, 10.19, 1.17, 7.06, 1.23, 8.84, 0.2, 10.17, 0.25, 10.19, 1.6, 8.58, 0.84, 8.64, 1.81, 8.67, 2.27, 10.2, 1.62, 8.05, 1.81, 8.47, 1.86, 9.98, 2.2, 9.07, 1.35, 8.04, 1.03, 8.96, 0.42, 8.5, 1.9, 8.52, 1.97, 10.4, 1.28, 7.86, 0.74, 9.35, 0.69, 10.29, -0.28, 10.65, 0.22, 9.38, 2.0, 8.74, 1.6, 8.41, 2.16, 9.18, 1.77, 9.02, 1.56, 8.91, 1.29, 9.69, 1.94, 10.71, 0.15, 7.22, -1.62, 8.13, 0.11, 8.95, 0.39, 7.78, 1.17, 10.11, 0.67, 7.64, 0.09, 9.43, -0.37, 9.76, -0.66, 9.97, -0.82, 8.7, 0.07, 7.78, 0.23, 8.41, 1.41, 8.93, 0.05, 8.49, 0.88, 8.83, -0.54, 9.7, 1.31, 9.1, 0.74, 6.88, 0.48, 7.45, 0.49, 7.26, 0.52, 8.25, 1.51, 8.64, 1.7, 6.21, -0.34, 7.13, -0.07, 9.04, -0.47, 8.59, 0.86, 7.29, 0.83, 8.15, 1.19, 7.87, 0.97, 7.8, 1.43, 6.93, 1.21, 7.6, 0.72, 8.25, 0.98, 8.67, 1.39, 6.98, 0.09, 6.66, -0.4, 7.69, 0.3, 7.58, 0.79, 9.82, 1.35, 7.06, -0.02, 7.95, -0.01, 9.17, -0.07, 8.89, -0.02, 7.35, 1.37, 6.85, 0.9, 6.41, 1.38, 7.37, 0.97, 8.03, 0.34, 7.62, 0.89, 8.68, 0.67, 8.86, -0.22, 8.64, -0.39, 7.99, -0.46, 8.57, 0.39, 7.55, 1.34, 9.73, -0.27, 8.22, -0.67, 8.5, -1.16, 9.65, -0.72, 10.0, -0.36, 8.84, -0.19, 7.9, -0.29, 7.93, 1.2, 8.6, 0.56, 8.41, 0.8, 8.31, -0.13, 9.55, 1.42, 9.04, 1.18, 8.42, 0.3, 9.03, 0.15, 9.11, 2.11, 9.85, 3.4, 10.85, 1.63, 8.78, 0.74, 9.88, 1.79, 10.65, 0.79, 11.48, 1.02, 9.41, 0.9, 10.22, 1.36, 9.46, 2.41, 10.05, 1.33, 8.85, 2.14, 8.83, 1.15, 10.71, 2.49, 11.55, 1.92, 7.59, 0.66, 8.3, 0.81, 9.11, 1.5, 8.95, 2.38, 10.99, 2.39, 7.88, 1.13, 8.75, 0.75, 10.68, -0.49, 10.43, 1.4, 8.85, 1.69, 8.86, 1.01, 8.26, 1.27, 8.91, 1.05, 8.82, 1.87, 9.14, 1.7, 9.82, 1.45, 9.8, 0.46, 8.49, 1.06, 8.75, 0.04, 10.28, 1.75, 8.96, 2.29, 11.3, 0.46, 8.43, 0.78, 9.66, -0.31, 11.26, -0.57, 11.2, 0.84, 10.12, 0.2, 9.47, 0.78, 9.84, 1.66, 9.87, 0.56, 8.8, 1.74, 10.1, 1.08, 10.09, 2.08, 11.54, 0.9, 8.67, -0.44, 8.25, -0.59, 9.61, 0.67, 8.94, 2.14, 11.61, 0.62, 7.38, 0.45, 9.1, -0.57, 10.42, -1.46, 11.11, -0.16, 9.86, 1.07, 8.53, 0.82, 8.16, 0.99, 8.92, 1.29, 8.5, 0.71, 8.93, 0.7, 9.71, 1.74, 11.15, 
+
+L3_cHEMM_A_mm
+0.899999976158, 0.0, 0.10000000149, 0.300000011921, 0.899999976158, 0.5, 0.800000011921, 0.800000011921, 0.40000000596, 0.600000023842, 0.10000000149, 0.699999988079, 0.899999976158, 0.10000000149, 0.300000011921, 0.699999988079, 0.600000023842, 0.899999976158, 0.800000011921, 0.300000011921, 0.10000000149, -0.300000011921, 0.10000000149, 0.0, 0.5, 0.300000011921, 0.5, 0.800000011921, 0.899999976158, 0.5, 0.699999988079, 0.5, 0.5, 0.600000023842, 0.300000011921, 0.20000000298, 0.800000011921, 0.800000011921, 0.5, 0.600000023842, 0.899999976158, -0.5, 0.5, -0.300000011921, 0.5, 0.0, 0.800000011921, 0.20000000298, 0.5, 0.699999988079, 0.5, 0.800000011921, 0.899999976158, 0.699999988079, 0.300000011921, 0.300000011921, 0.40000000596, 0.699999988079, 0.899999976158, 0.10000000149, 0.800000011921, -0.800000011921, 0.5, -0.800000011921, 0.800000011921, -0.20000000298, 0.899999976158, 0.0, 0.899999976158, 0.5, 0.10000000149, 0.600000023842, 0.10000000149, 0.10000000149, 0.699999988079, 0.699999988079, 0.699999988079, 0.40000000596, 0.10000000149, 0.600000023842, 0.40000000596, -0.600000023842, 0.899999976158, -0.5, 0.5, -0.699999988079, 0.899999976158, -0.5, 0.899999976158, 0.0, 0.600000023842, 0.800000011921, 0.20000000298, 0.40000000596, 0.800000011921, 0.10000000149, 0.40000000596, 0.20000000298, 0.5, 0.899999976158, 0.10000000149, -0.699999988079, 0.699999988079, -0.5, 0.5, -0.800000011921, 0.10000000149, -0.600000023842, 0.600000023842, -0.800000011921, 0.899999976158, 0.0, 0.699999988079, 0.600000023842, 0.40000000596, 0.600000023842, 0.600000023842, 0.20000000298, 0.600000023842, 0.20000000298, 0.899999976158, -0.10000000149, 0.5, -0.600000023842, 0.899999976158, -0.699999988079, 0.10000000149, -0.10000000149, 0.20000000298, -0.40000000596, 0.699999988079, -0.600000023842, 0.600000023842, 0.0, 0.899999976158, 0.300000011921, 0.10000000149, 0.20000000298, 0.899999976158, 0.699999988079, 0.300000011921, -0.699999988079, 0.300000011921, -0.20000000298, 0.300000011921, -0.300000011921, 0.699999988079, -0.699999988079, 0.800000011921, -0.10000000149, 0.40000000596, -0.600000023842, 0.899999976158, -0.300000011921, 0.20000000298, 0.0, 0.899999976158, 0.600000023842, 0.800000011921, 0.20000000298, 0.600000023842, -0.899999976158, 0.800000011921, -0.800000011921, 0.40000000596, -0.699999988079, 0.699999988079, -0.40000000596, 0.40000000596, -0.20000000298, 0.600000023842, -0.20000000298, 0.10000000149, -0.20000000298, 0.899999976158, -0.600000023842, 0.10000000149, 0.0, 0.600000023842, 0.40000000596, 0.800000011921, -0.300000011921, 0.5, -0.600000023842, 0.899999976158, -0.10000000149, 0.10000000149, -0.600000023842, 0.5, -0.899999976158, 0.600000023842, -0.20000000298, 0.899999976158, -0.699999988079, 0.800000011921, -0.20000000298, 0.600000023842, -0.40000000596, 0.600000023842, 0.0, 
+
+L3_cHEMM_B_mn
+0.10000000149, 0.600000023842, 0.300000011921, 0.10000000149, 0.800000011921, 0.40000000596, 0.40000000596, 0.5, 0.699999988079, 0.20000000298, 0.10000000149, 0.5, 0.40000000596, 0.20000000298, 0.699999988079, 0.300000011921, 0.20000000298, 0.10000000149, 0.600000023842, 0.40000000596, 0.20000000298, 0.5, 0.20000000298, 0.899999976158, 0.5, 0.800000011921, 0.20000000298, 0.699999988079, 0.40000000596, 0.600000023842, 0.10000000149, 0.300000011921, 0.20000000298, 0.800000011921, 0.20000000298, 0.699999988079, 0.899999976158, 0.20000000298, 0.300000011921, 0.5, 0.40000000596, 0.600000023842, 0.20000000298, 0.600000023842, 0.600000023842, 0.300000011921, 0.5, 0.699999988079, 0.800000011921, 0.300000011921, 0.20000000298, 0.40000000596, 0.300000011921, 0.40000000596, 0.600000023842, 0.699999988079, 0.699999988079, 0.40000000596, 0.600000023842, 0.40000000596, 0.300000011921, 0.5, 0.5, 0.800000011921, 0.10000000149, 0.20000000298, 0.899999976158, 0.899999976158, 0.600000023842, 0.899999976158, 0.300000011921, 0.600000023842, 0.300000011921, 0.40000000596, 0.5, 0.699999988079, 0.10000000149, 0.5, 0.5, 0.899999976158, 0.899999976158, 0.20000000298, 0.5, 0.20000000298, 0.699999988079, 0.20000000298, 0.20000000298, 0.20000000298, 0.699999988079, 0.10000000149, 0.899999976158, 0.699999988079, 0.40000000596, 0.5, 0.5, 0.800000011921, 0.800000011921, 0.600000023842, 0.5, 0.300000011921, 0.600000023842, 0.600000023842, 0.40000000596, 0.699999988079, 0.40000000596, 0.40000000596, 0.10000000149, 0.600000023842, 0.800000011921, 0.800000011921, 0.5, 0.40000000596, 0.300000011921, 0.600000023842, 0.699999988079, 0.800000011921, 0.800000011921, 0.10000000149, 0.20000000298, 0.5, 0.40000000596, 0.20000000298, 0.800000011921, 0.600000023842, 0.300000011921, 0.800000011921, 0.5, 0.300000011921, 0.699999988079, 0.699999988079, 0.10000000149, 0.5, 0.300000011921, 0.5, 0.40000000596, 0.40000000596, 0.20000000298, 0.899999976158, 0.699999988079, 0.5, 0.899999976158, 0.699999988079, 0.899999976158, 0.20000000298, 0.20000000298, 0.600000023842, 0.300000011921, 0.699999988079, 0.40000000596, 0.600000023842, 0.40000000596, 0.600000023842, 0.899999976158, 0.600000023842, 0.699999988079, 0.699999988079, 0.899999976158, 0.20000000298, 0.40000000596, 0.800000011921, 0.600000023842, 0.899999976158, 0.40000000596, 0.5, 0.899999976158, 0.600000023842, 0.10000000149, 0.5, 0.5, 0.20000000298, 0.10000000149, 0.10000000149, 0.800000011921, 0.800000011921, 0.600000023842, 0.20000000298, 0.20000000298, 0.10000000149, 0.600000023842, 0.600000023842, 0.600000023842, 0.20000000298, 0.600000023842, 0.10000000149, 0.600000023842, 0.20000000298, 0.300000011921, 0.40000000596, 0.800000011921, 0.899999976158, 0.300000011921, 0.10000000149, 0.5, 0.800000011921, 0.699999988079, 0.899999976158, 0.10000000149, 0.699999988079, 0.899999976158, 0.699999988079, 0.20000000298, 0.40000000596, 0.899999976158, 0.40000000596, 0.600000023842, 0.300000011921, 0.300000011921, 0.300000011921, 0.300000011921, 0.300000011921, 0.699999988079, 0.300000011921, 0.40000000596, 0.40000000596, 0.5, 0.10000000149, 0.40000000596, 0.899999976158, 0.699999988079, 0.699999988079, 0.40000000596, 0.800000011921, 0.5, 0.800000011921, 0.800000011921, 0.800000011921, 0.40000000596, 0.300000011921, 0.5, 0.10000000149, 0.899999976158, 0.600000023842, 0.40000000596, 0.800000011921, 0.800000011921, 0.600000023842, 0.300000011921, 0.40000000596, 0.40000000596, 0.699999988079, 0.800000011921, 0.899999976158, 0.699999988079, 0.300000011921, 0.899999976158, 0.20000000298, 0.10000000149, 0.899999976158, 0.800000011921, 0.40000000596, 0.800000011921, 0.5, 0.899999976158, 0.40000000596, 0.10000000149, 0.899999976158, 0.300000011921, 0.800000011921, 0.20000000298, 0.699999988079, 0.5, 0.899999976158, 0.300000011921, 0.899999976158, 0.300000011921, 0.600000023842, 0.600000023842, 0.300000011921, 0.800000011921, 0.899999976158, 0.10000000149, 0.20000000298, 0.899999976158, 0.10000000149, 0.800000011921, 0.300000011921, 0.300000011921, 0.5, 0.899999976158, 0.600000023842, 0.5, 0.20000000298, 0.5, 0.300000011921, 0.600000023842, 0.40000000596, 0.20000000298, 0.800000011921, 0.5, 0.5, 0.600000023842, 0.699999988079, 0.10000000149, 0.10000000149, 0.600000023842, 0.300000011921, 0.600000023842, 0.20000000298, 0.10000000149, 0.20000000298, 0.699999988079, 0.40000000596, 0.800000011921, 0.600000023842, 0.10000000149, 0.10000000149, 0.300000011921, 0.5, 0.699999988079, 0.800000011921, 0.300000011921, 0.10000000149, 0.800000011921, 0.20000000298, 0.10000000149, 0.800000011921, 0.699999988079, 0.600000023842, 0.5, 0.699999988079, 0.699999988079, 0.20000000298, 0.5, 0.800000011921, 0.40000000596, 0.600000023842, 0.899999976158, 0.10000000149, 0.5, 0.699999988079, 0.40000000596, 0.699999988079, 0.5, 0.10000000149, 0.5, 0.300000011921, 0.40000000596, 0.899999976158, 0.800000011921, 0.40000000596, 
+
+L3_cHEMM_C_mn
+0.899999976158, 0.699999988079, 0.10000000149, 0.10000000149, 0.40000000596, 0.10000000149, 0.5, 0.20000000298, 0.300000011921, 0.699999988079, 0.300000011921, 0.600000023842, 0.20000000298, 0.300000011921, 0.800000011921, 0.800000011921, 0.899999976158, 0.20000000298, 0.899999976158, 0.800000011921, 0.899999976158, 0.40000000596, 0.40000000596, 0.899999976158, 0.600000023842, 0.699999988079, 0.600000023842, 0.300000011921, 0.600000023842, 0.5, 0.800000011921, 0.20000000298, 0.5, 0.800000011921, 0.20000000298, 0.600000023842, 0.20000000298, 0.40000000596, 0.40000000596, 0.600000023842, 0.20000000298, 0.5, 0.20000000298, 0.899999976158, 0.800000011921, 0.300000011921, 0.800000011921, 0.699999988079, 0.5, 0.10000000149, 0.40000000596, 0.40000000596, 0.10000000149, 0.20000000298, 0.10000000149, 0.20000000298, 0.600000023842, 0.40000000596, 0.10000000149, 0.600000023842, 0.699999988079, 0.40000000596, 0.20000000298, 0.699999988079, 0.300000011921, 0.699999988079, 0.20000000298, 0.600000023842, 0.800000011921, 0.699999988079, 0.10000000149, 0.40000000596, 0.40000000596, 0.699999988079, 0.40000000596, 0.10000000149, 0.300000011921, 0.5, 0.10000000149, 0.800000011921, 0.600000023842, 0.5, 0.40000000596, 0.600000023842, 0.300000011921, 0.40000000596, 0.40000000596, 0.5, 0.699999988079, 0.699999988079, 0.600000023842, 0.20000000298, 0.40000000596, 0.600000023842, 0.10000000149, 0.800000011921, 0.800000011921, 0.5, 0.899999976158, 0.300000011921, 0.40000000596, 0.300000011921, 0.20000000298, 0.699999988079, 0.5, 0.40000000596, 0.40000000596, 0.899999976158, 0.300000011921, 0.699999988079, 0.300000011921, 0.5, 0.899999976158, 0.40000000596, 0.300000011921, 0.600000023842, 0.40000000596, 0.5, 0.40000000596, 0.600000023842, 0.600000023842, 0.600000023842, 0.800000011921, 0.5, 0.10000000149, 0.699999988079, 0.20000000298, 0.899999976158, 0.5, 0.40000000596, 0.40000000596, 0.699999988079, 0.10000000149, 0.600000023842, 0.899999976158, 0.20000000298, 0.40000000596, 0.20000000298, 0.5, 0.699999988079, 0.10000000149, 0.300000011921, 0.899999976158, 0.600000023842, 0.20000000298, 0.10000000149, 0.699999988079, 0.899999976158, 0.600000023842, 0.300000011921, 0.600000023842, 0.800000011921, 0.10000000149, 0.800000011921, 0.20000000298, 0.40000000596, 0.800000011921, 0.699999988079, 0.40000000596, 0.600000023842, 0.20000000298, 0.300000011921, 0.5, 0.40000000596, 0.899999976158, 0.899999976158, 0.300000011921, 0.40000000596, 0.600000023842, 0.5, 0.20000000298, 0.600000023842, 0.600000023842, 0.10000000149, 0.40000000596, 0.800000011921, 0.10000000149, 0.600000023842, 0.899999976158, 0.40000000596, 0.899999976158, 0.600000023842, 0.5, 0.5, 0.800000011921, 0.10000000149, 0.20000000298, 0.600000023842, 0.600000023842, 0.300000011921, 0.40000000596, 0.300000011921, 0.300000011921, 0.800000011921, 0.40000000596, 0.5, 0.699999988079, 0.699999988079, 0.300000011921, 0.20000000298, 0.699999988079, 0.5, 0.40000000596, 0.899999976158, 0.40000000596, 0.600000023842, 0.300000011921, 0.300000011921, 0.800000011921, 0.300000011921, 0.300000011921, 0.10000000149, 0.300000011921, 0.600000023842, 0.5, 0.800000011921, 0.600000023842, 0.10000000149, 0.20000000298, 0.10000000149, 0.300000011921, 0.600000023842, 0.300000011921, 0.5, 0.20000000298, 0.5, 0.699999988079, 0.20000000298, 0.5, 0.699999988079, 0.40000000596, 0.5, 0.600000023842, 0.40000000596, 0.899999976158, 0.5, 0.10000000149, 0.20000000298, 0.699999988079, 0.10000000149, 0.800000011921, 0.5, 0.20000000298, 0.899999976158, 0.5, 0.10000000149, 0.899999976158, 0.5, 0.40000000596, 0.40000000596, 0.20000000298, 0.40000000596, 0.800000011921, 0.40000000596, 0.40000000596, 0.10000000149, 0.10000000149, 0.5, 0.20000000298, 0.20000000298, 0.800000011921, 0.40000000596, 0.40000000596, 0.20000000298, 0.20000000298, 0.899999976158, 0.699999988079, 0.699999988079, 0.300000011921, 0.5, 0.20000000298, 0.300000011921, 0.5, 0.600000023842, 0.600000023842, 0.699999988079, 0.5, 0.600000023842, 0.5, 0.699999988079, 0.800000011921, 0.899999976158, 0.20000000298, 0.899999976158, 0.800000011921, 0.300000011921, 0.40000000596, 0.600000023842, 0.40000000596, 0.300000011921, 0.899999976158, 0.600000023842, 0.600000023842, 0.10000000149, 0.600000023842, 0.800000011921, 0.40000000596, 0.699999988079, 0.40000000596, 0.300000011921, 0.899999976158, 0.899999976158, 0.300000011921, 0.899999976158, 0.300000011921, 0.40000000596, 0.10000000149, 0.300000011921, 0.699999988079, 0.40000000596, 0.5, 0.20000000298, 0.600000023842, 0.800000011921, 0.800000011921, 0.5, 0.40000000596, 0.10000000149, 0.899999976158, 0.5, 0.800000011921, 0.699999988079, 0.10000000149, 0.899999976158, 0.300000011921, 0.899999976158, 0.20000000298, 0.40000000596, 0.40000000596, 0.600000023842, 0.20000000298, 0.699999988079, 0.300000011921, 0.800000011921, 0.800000011921, 0.899999976158, 0.10000000149, 0.899999976158, 0.600000023842, 0.800000011921, 
+
+L3_cHEMM_o_L
+0.810000040531, 6.09999996275, 0.250000034273, 5.95000008792, 0.709999999553, 4.55000007302, 2.31999995738, 6.36000000402, -0.270000039339, 5.04000004515, 0.549999988824, 6.08000008658, 1.16999995962, 6.49000004366, 2.49999995008, 5.89000007123, 0.709999946654, 5.15000005662, 0.670000044554, 6.18000009626, 2.7399999319, 5.1500000678, -0.110000011474, 7.26999997973, 0.590000088364, 6.19000003919, 0.759999970496, 5.20000003651, 1.08999998182, 6.70000004396, 0.720000041574, 5.49000006899, 1.24000000566, 5.64000005782, 0.420000027418, 5.06000004053, 1.03999993637, 5.47000009447, 1.05999996454, 4.07000007063, 1.94999989495, 5.42000007212, -0.200000055134, 4.76000005618, 1.40999998093, 4.70000008643, 1.2699999842, 5.56000006735, 1.49999996051, 4.46000009194, 0.319999896288, 4.96000006884, 0.239999976605, 5.27000003636, 1.66999991119, 4.19000007942, 0.679999976307, 5.5900000824, 0.8400000377, 5.49000003323, 0.759999933243, 4.78000003964, 1.27999989212, 5.70000004023, 0.0199999894202, 5.41000009641, 1.38999994904, 4.17000010118, 2.17000008106, 5.45999995336, 1.76999998048, 5.11000005096, 2.04000003844, 4.39000002354, 3.71999996632, 4.83999996915, 1.0899999781, 4.56000006214, 2.06000001818, 5.18000005528, 2.53000004336, 5.41000000477, 2.87999997854, 4.15000004694, 0.799999980628, 5.05999999806, 1.12000006914, 5.61999999613, 3.66999995068, 4.76999997154, 1.91999998197, 5.6199999924, 2.10000006706, 5.5299999927, 1.57999994501, 5.27999997929, 2.55999999806, 6.04999999776, 1.55999998391, 5.14000003025, 3.08999999374, 4.38000000536, 2.26000003755, 5.01999991938, 2.08999996468, 4.04000003546, 2.9799999994, 4.26999996334, 4.50999993324, 4.84999997467, 1.04999998882, 3.300000038, 2.88999998182, 4.50000001416, 3.08999997735, 4.13000006199, 3.11999997303, 3.09000002578, 1.2599999474, 3.99000001088, 1.6900000377, 4.18000000983, 3.90999998912, 3.35999997571, 1.96999997601, 5.16999997973, 1.93000009179, 4.65999995485, 2.45999997124, 4.03000000089, 3.48999998853, 4.87000004679, 0.750000026822, 4.43000003815, 3.8199999693, 3.05000006631, 3.42000002369, 3.95999991387, 3.56999998793, 4.40000001192, 3.56000003085, 3.06000001594, 5.9099999243, 3.45000002012, 1.59000001684, 3.51000006586, 4.26000003457, 4.49999997616, 4.03000006869, 3.34000004143, 4.28000003144, 2.87000003934, 1.58999996766, 4.16000003904, 1.94000005335, 4.25000000969, 4.72999998376, 3.26999995142, 3.55000000075, 4.77000004157, 2.99000011519, 4.15999995634, 3.4499999769, 3.72999999344, 4.60999999434, 4.71000000104, 1.64000009283, 3.99000001833, 4.3900000146, 3.58999998033, 4.11000002787, 2.94000002131, 4.37000007361, 2.10000008643, 4.07000007212, 1.73000006497, 4.73000002921, 1.70000007153, 3.1300000374, 2.56000009567, 5.38000002697, 2.57000006989, 4.0000000827, 2.08000005081, 4.13000004485, 1.29000004366, 2.39000003919, 2.32000010416, 3.32000003189, 2.7800000307, 3.68000002176, 0.720000013262, 4.71000002488, 3.02000007287, 4.46000006586, 2.38999996096, 4.10999995857, 2.76999999762, 4.9700000453, 2.15000008121, 2.95000003576, 3.63000009328, 4.72000000507, 1.79999997467, 3.38000002772, 3.66999994099, 4.02000002891, 2.7799999465, 4.48000002623, 1.47999999046, 4.54999996722, 2.0899999781, 2.60000007078, 3.34999996647, 4.26999996781, 3.13999991179, 4.30000002161, 1.88999996394, 4.43999994829, 1.30999995336, 2.44000002429, 2.87000000209, 3.36000003606, 3.14999996349, 3.69999998584, 1.98999993488, 4.57999997109, 3.34999989271, 4.06000002712, 3.51999983743, 4.00000000671, 3.38999996915, 5.34000003844, 2.46000004426, 3.15000002906, 3.67999996662, 4.0800000076, 1.90999997124, 4.51999999315, 2.67999998599, 4.97000006616, 2.35000004172, 3.45000007302, 2.12999997705, 5.51999994397, 1.62000004306, 3.81000002339, 2.16000006959, 4.09000003621, 2.2400000228, 4.16000003755, 2.44000000268, 4.3400000228, 1.15000000224, 3.58000001803, 2.77000002295, 3.83000005081, 2.76999998942, 4.80000002384, 0.939999988526, 5.28000005156, 3.04000005484, 4.73000007391, 1.88000002548, 4.53999997735, 2.54000000715, 5.40000001416, 2.87000003785, 3.4200000371, 3.37000002369, 4.21000007257, 1.16000003904, 4.56000002488, 2.62999998301, 5.28000009179, 1.5499999851, 4.66000009194, 0.760000050962, 5.65000002533, 0.920000034124, 4.16000009269, 2.61000004575, 4.63000006646, 1.85999997497, 5.4700000751, 0.690000024289, 5.21000007257, -0.379999933839, 3.45000006184, 1.92000004157, 4.86000008896, 1.9300000374, 5.31000008747, 0.709999973476, 5.74000003099, 2.74000004143, 5.12000009224, 2.27999996811, 4.89000004664, 1.9200000304, 6.06000008523, 1.76000004947, 3.45000008047, 2.43999995276, 5.19000006527, 1.35000006407, 4.9300000523, 2.19999996722, 5.91000009939, 1.16000005469, 5.53000010967, 0.620000037104, 6.3400000973, 0.510000071079, 4.77000011459, 2.35000003576, 5.30000010356, 1.21999996856, 7.00000005588, 1.40999995336, 6.56000004798, 0.799999994785, 4.83000004187, 2.43000004709, 5.58000010669, 2.59000000715, 5.36000004649, 0.379999990463, 6.12000006914, 2.8700000073, 5.35000007823, 2.17999993682, 5.0200000371, 2.45000005364, 7.13000012159, 2.24000008538, 4.87000009, 2.72000000954, 5.17000010639, 1.83000003964, 
+
+L3_cHEMM_A_nn
+0.800000011921, 0.0, 0.300000011921, 0.20000000298, 0.899999976158, 0.300000011921, 0.10000000149, 0.10000000149, 0.20000000298, 0.800000011921, 0.899999976158, 0.10000000149, 0.600000023842, 0.40000000596, 0.600000023842, 0.699999988079, 0.20000000298, 0.10000000149, 0.699999988079, 0.899999976158, 0.40000000596, 0.300000011921, 0.899999976158, 0.800000011921, 0.800000011921, 0.800000011921, 0.20000000298, 0.800000011921, 0.600000023842, 0.40000000596, 0.300000011921, 0.40000000596, 0.600000023842, 0.5, 0.300000011921, -0.20000000298, 0.40000000596, 0.0, 0.10000000149, 0.699999988079, 0.600000023842, 0.5, 0.10000000149, 0.699999988079, 0.699999988079, 0.699999988079, 0.800000011921, 0.300000011921, 0.600000023842, 0.5, 0.5, 0.10000000149, 0.600000023842, 0.20000000298, 0.10000000149, 0.300000011921, 0.10000000149, 0.300000011921, 0.20000000298, 0.899999976158, 0.899999976158, 0.800000011921, 0.10000000149, 0.899999976158, 0.899999976158, 0.800000011921, 0.300000011921, 0.600000023842, 0.899999976158, -0.300000011921, 0.10000000149, -0.699999988079, 0.10000000149, 0.0, 0.20000000298, 0.800000011921, 0.20000000298, 0.5, 0.600000023842, 0.899999976158, 0.5, 0.40000000596, 0.300000011921, 0.5, 0.40000000596, 0.300000011921, 0.20000000298, 0.699999988079, 0.800000011921, 0.899999976158, 0.800000011921, 0.899999976158, 0.300000011921, 0.20000000298, 0.699999988079, 0.300000011921, 0.10000000149, 0.699999988079, 0.899999976158, 0.20000000298, 0.40000000596, 0.40000000596, 0.10000000149, -0.10000000149, 0.600000023842, -0.5, 0.20000000298, -0.800000011921, 0.40000000596, 0.0, 0.600000023842, 0.899999976158, 0.10000000149, 0.40000000596, 0.699999988079, 0.40000000596, 0.899999976158, 0.600000023842, 0.5, 0.10000000149, 0.800000011921, 0.699999988079, 0.300000011921, 0.5, 0.800000011921, 0.20000000298, 0.5, 0.300000011921, 0.699999988079, 0.800000011921, 0.20000000298, 0.800000011921, 0.699999988079, 0.5, 0.899999976158, 0.899999976158, 0.20000000298, -0.800000011921, 0.10000000149, -0.699999988079, 0.20000000298, -0.5, 0.600000023842, -0.899999976158, 0.899999976158, 0.0, 0.800000011921, 0.300000011921, 0.40000000596, 0.600000023842, 0.20000000298, 0.600000023842, 0.20000000298, 0.600000023842, 0.300000011921, 0.899999976158, 0.5, 0.899999976158, 0.10000000149, 0.10000000149, 0.600000023842, 0.40000000596, 0.40000000596, 0.300000011921, 0.800000011921, 0.699999988079, 0.20000000298, 0.699999988079, 0.600000023842, 0.600000023842, 0.899999976158, -0.10000000149, 0.699999988079, -0.699999988079, 0.600000023842, -0.899999976158, 0.10000000149, -0.40000000596, 0.800000011921, -0.300000011921, 0.20000000298, 0.0, 0.10000000149, 0.40000000596, 0.899999976158, 0.899999976158, 0.600000023842, 0.10000000149, 0.899999976158, 0.800000011921, 0.699999988079, 0.699999988079, 0.10000000149, 0.5, 0.600000023842, 0.699999988079, 0.20000000298, 0.300000011921, 0.800000011921, 0.699999988079, 0.899999976158, 0.300000011921, 0.10000000149, 0.600000023842, 0.600000023842, -0.40000000596, 0.800000011921, -0.300000011921, 0.5, -0.40000000596, 0.699999988079, -0.40000000596, 0.40000000596, -0.600000023842, 0.10000000149, -0.40000000596, 0.300000011921, 0.0, 0.5, 0.899999976158, 0.300000011921, 0.899999976158, 0.300000011921, 0.10000000149, 0.899999976158, 0.10000000149, 0.699999988079, 0.899999976158, 0.600000023842, 0.699999988079, 0.800000011921, 0.300000011921, 0.800000011921, 0.300000011921, 0.899999976158, 0.899999976158, 0.10000000149, 0.5, 0.600000023842, -0.699999988079, 0.600000023842, -0.5, 0.300000011921, -0.5, 0.899999976158, -0.600000023842, 0.20000000298, -0.600000023842, 0.899999976158, -0.899999976158, 0.5, -0.899999976158, 0.10000000149, 0.0, 0.600000023842, 0.10000000149, 0.899999976158, 0.600000023842, 0.600000023842, 0.699999988079, 0.699999988079, 0.5, 0.40000000596, 0.800000011921, 0.5, 0.40000000596, 0.20000000298, 0.300000011921, 0.600000023842, 0.699999988079, 0.800000011921, 0.40000000596, 0.20000000298, -0.10000000149, 0.5, -0.10000000149, 0.40000000596, -0.300000011921, 0.5, -0.10000000149, 0.20000000298, -0.600000023842, 0.600000023842, -0.10000000149, 0.300000011921, -0.899999976158, 0.600000023842, -0.10000000149, 0.5, 0.0, 0.899999976158, 0.40000000596, 0.10000000149, 0.800000011921, 0.800000011921, 0.600000023842, 0.10000000149, 0.600000023842, 0.10000000149, 0.300000011921, 0.600000023842, 0.800000011921, 0.800000011921, 0.40000000596, 0.899999976158, 0.699999988079, 0.699999988079, -0.899999976158, 0.600000023842, -0.20000000298, 0.20000000298, -0.699999988079, 0.800000011921, -0.699999988079, 0.300000011921, -0.899999976158, 0.899999976158, -0.800000011921, 0.300000011921, -0.10000000149, 0.899999976158, -0.600000023842, 0.899999976158, -0.40000000596, 0.10000000149, 0.0, 0.40000000596, 0.40000000596, 0.5, 0.20000000298, 0.10000000149, 0.800000011921, 0.699999988079, 0.899999976158, 0.10000000149, 0.5, 0.800000011921, 0.40000000596, 0.300000011921, 0.800000011921, 0.40000000596, -0.300000011921, 0.10000000149, -0.300000011921, 0.800000011921, -0.899999976158, 0.300000011921, -0.5, 0.5, -0.899999976158, 0.699999988079, -0.699999988079, 0.899999976158, -0.10000000149, 0.600000023842, -0.699999988079, 0.10000000149, -0.800000011921, 0.40000000596, -0.40000000596, 0.5, 0.0, 0.600000023842, 0.300000011921, 0.899999976158, 0.699999988079, 0.600000023842, 0.300000011921, 0.40000000596, 0.699999988079, 0.10000000149, 0.10000000149, 0.5, 0.10000000149, 0.899999976158, -0.800000011921, 0.10000000149, -0.300000011921, 0.800000011921, -0.899999976158, 0.800000011921, -0.20000000298, 0.10000000149, -0.10000000149, 0.10000000149, -0.5, 0.699999988079, -0.899999976158, 0.699999988079, -0.5, 0.800000011921, -0.600000023842, 0.5, -0.20000000298, 0.600000023842, -0.300000011921, 0.300000011921, 0.0, 0.300000011921, 0.600000023842, 0.20000000298, 0.20000000298, 0.600000023842, 0.10000000149, 0.300000011921, 0.800000011921, 0.899999976158, 0.300000011921, 0.800000011921, -0.800000011921, 0.20000000298, -0.899999976158, 0.300000011921, -0.20000000298, 0.5, -0.300000011921, 0.600000023842, -0.40000000596, 0.600000023842, -0.699999988079, 0.600000023842, -0.699999988079, 0.40000000596, -0.800000011921, 0.10000000149, -0.600000023842, 0.10000000149, -0.800000011921, 0.899999976158, -0.699999988079, 0.300000011921, -0.600000023842, 0.699999988079, 0.0, 0.800000011921, 0.899999976158, 0.10000000149, 0.899999976158, 0.899999976158, 0.899999976158, 0.300000011921, 0.20000000298, 0.20000000298, -0.800000011921, 0.899999976158, -0.800000011921, 0.699999988079, -0.300000011921, 0.699999988079, -0.800000011921, 0.40000000596, -0.300000011921, 0.20000000298, -0.300000011921, 0.800000011921, -0.300000011921, 0.5, -0.40000000596, 0.10000000149, -0.300000011921, 0.699999988079, -0.899999976158, 0.600000023842, -0.300000011921, 0.20000000298, -0.20000000298, 0.800000011921, -0.899999976158, 0.20000000298, 0.0, 0.800000011921, 0.899999976158, 0.600000023842, 0.699999988079, 0.899999976158, 0.10000000149, 0.600000023842, -0.40000000596, 0.10000000149, -0.899999976158, 0.10000000149, -0.699999988079, 0.20000000298, -0.800000011921, 0.800000011921, -0.699999988079, 0.800000011921, -0.699999988079, 0.800000011921, -0.300000011921, 0.20000000298, -0.300000011921, 0.600000023842, -0.800000011921, 0.10000000149, -0.5, 0.40000000596, -0.699999988079, 0.600000023842, -0.10000000149, 0.10000000149, -0.899999976158, 0.800000011921, -0.899999976158, 0.20000000298, 0.0, 0.899999976158, 0.899999976158, 0.40000000596, 0.10000000149, 0.300000011921, -0.40000000596, 0.899999976158, -0.800000011921, 0.899999976158, -0.20000000298, 0.699999988079, -0.5, 0.20000000298, -0.699999988079, 0.899999976158, -0.300000011921, 0.899999976158, -0.899999976158, 0.600000023842, -0.699999988079, 0.800000011921, -0.40000000596, 0.800000011921, -0.40000000596, 0.10000000149, -0.10000000149, 0.300000011921, -0.800000011921, 0.899999976158, -0.899999976158, 0.600000023842, -0.699999988079, 0.899999976158, -0.899999976158, 0.20000000298, 0.0, 0.699999988079, 0.5, 0.600000023842, -0.5, 0.300000011921, -0.600000023842, 0.40000000596, -0.40000000596, 0.899999976158, -0.899999976158, 0.600000023842, -0.600000023842, 0.10000000149, -0.600000023842, 0.10000000149, -0.5, 0.800000011921, -0.40000000596, 0.899999976158, -0.699999988079, 0.300000011921, -0.800000011921, 0.5, -0.10000000149, 0.899999976158, -0.300000011921, 0.300000011921, -0.20000000298, 0.899999976158, -0.10000000149, 0.40000000596, -0.10000000149, 0.699999988079, -0.5, 0.10000000149, 0.0, 
+
+L3_cHEMM_o_R
+8.16000009716, 2.23000002474, 6.58000012308, -0.0399999415874, 5.98000001654, 1.53000003666, 6.95000007898, 2.47000003114, 4.79000011072, 2.96000006661, 6.45000009164, 3.30000010133, 5.32000002295, 4.01000013515, 4.62000009969, 5.73000003964, 6.0500001058, 3.81000004202, 4.17000000879, 5.63000000983, 4.00000003129, 6.59000005409, 2.91000007853, 6.57000005648, 1.92000000954, 6.70000012368, 2.22000002667, 6.7800001432, -0.579999906272, 7.20000009686, 1.2700000371, 8.41000002339, 0.819999984205, 7.68000009403, 8.58000017375, 1.49000003099, 7.55000014305, -0.0799999934435, 7.45000011623, 1.11999999538, 8.17000002444, 2.1499999769, 5.61000014484, 2.93999996543, 6.87000005648, 2.45000000969, 6.26000002638, 3.45000011772, 4.80000006855, 4.75000001788, 5.86000006586, 2.73000001058, 3.80000003353, 4.08000007018, 3.01000006065, 5.76000006288, 2.82000009298, 6.84000003397, 1.74000004068, 7.62000013843, 3.4499999173, 7.89000012189, -0.429999930114, 8.39000011444, 1.83999998257, 10.0000000082, 0.629999977797, 7.90000017136, 9.29000016063, 1.63999997288, 8.1000000596, -0.149999992549, 7.94999998137, 0.55000006482, 7.74000003025, 0.960000045747, 4.37000020102, 1.67000006989, 5.49000007644, 2.12000006542, 6.350000038, 2.62000017866, 4.52000014365, 5.37000001773, 5.87000014737, 2.69999999925, 4.20000010654, 5.01999998495, 3.91000006959, 5.84000003323, 4.16000012845, 6.13000001281, 2.96000005692, 7.04000013307, 2.38000004709, 6.92000014737, 1.09000012338, 8.02000008181, 2.31999996707, 10.109999963, 1.63999993414, 8.19000004441, 7.48000019833, 1.79000004143, 8.25000014901, 0.720000013262, 7.65000011399, 1.88999999598, 7.23000006422, 2.01000001818, 4.83000016704, 2.42000005648, 6.10000002906, 2.42000004753, 5.7900000079, 4.3600001359, 3.87000008553, 5.84000008762, 4.56000014707, 3.8700000602, 3.9000000827, 5.77000009596, 3.21000004426, 6.54000011891, 1.96000003457, 6.91000007555, 2.17999994054, 8.07000016823, 2.40999993548, 7.91000016719, -0.149999965727, 9.14000010923, 0.300000002235, 9.97000004753, 1.26999994099, 8.310000083, 9.87000009373, 2.15999999806, 8.64000004888, 0.390000077188, 7.05000005364, 0.760000094175, 8.46000005767, 3.17000008255, 6.11000015453, 1.96000004947, 7.84000000268, 4.75999996454, 7.789999955, 3.95000014752, 5.51000006139, 5.71000002712, 5.5700000155, 3.53000008807, 3.33999999076, 5.67999997258, 3.40000003055, 7.72999998376, 3.52000000283, 7.68000002697, 1.0199999395, 7.70000011176, 2.84999993667, 8.4300001052, -0.349999934435, 10.5200000215, 1.41999987617, 11.2999999575, 1.14999987483, 9.57000004977, 9.72000012353, 0.369999974519, 7.84000012338, -1.35000000522, 6.25000007823, 0.250000026077, 8.04000005782, 1.86000006661, 7.09000005856, 0.940000006407, 7.89000002205, 2.64000003844, 6.99000001162, 3.27000014439, 6.94000007123, 4.23000005901, 6.89000008091, 3.03000009552, 5.1800000754, 3.77000015035, 4.64000003621, 5.44000014573, 4.55000007302, 5.45000011995, 2.59000002578, 6.28000019833, 4.05000001565, 7.45000009984, 0.0600001947582, 7.19000013605, 2.54000002056, 9.90999999061, 1.00000003204, 8.40000014827, 8.81000017762, 0.730000108182, 8.41000012323, -0.129999913722, 8.98000008211, 0.27000011906, 8.70000007376, 1.51000004649, 7.49000013009, 1.72000008851, 8.33000003666, 3.37000008032, 8.16000003979, 2.92000019506, 5.74000015467, 4.11000013441, 5.53000020355, 3.21000007629, 5.16000003979, 4.99000008687, 2.94000006378, 6.01000007182, 3.25000009015, 6.24000011295, 3.33000000089, 6.48000020429, 3.34000000566, 7.67000015631, 1.53000005081, 8.29000011221, 1.8899999997, 9.98000003815, 1.58999992222, 8.5000001438, 10.5100000748, 2.13999994457, 9.60000006482, 0.729999978542, 7.47000002518, 2.66999993876, 8.36000001818, 3.90999990866, 6.85000009909, 3.46999990448, 7.25000002682, 5.46999987468, 7.6399998939, 5.21000004575, 6.23000007391, 7.53999997139, 6.3200001511, 4.55999992803, 4.39000006676, 7.46999989256, 2.58000008881, 7.10999994069, 3.62000004008, 7.26999997303, 1.200000076, 7.97000000358, 1.70000004545, 8.6700000222, -0.429999863803, 9.22000002369, 0.600000070035, 11.219999979, -0.100000012666, 10.1300000106, 8.0700001429, 0.409999990612, 7.52000016376, 0.0400000607967, 7.03000007167, 0.0600000829995, 6.80000014752, 2.06000001147, 6.04000012264, 2.47999995694, 6.68000003517, 3.46999994919, 7.48000005007, 2.62000011832, 5.43000007987, 4.92000001997, 5.26000013441, 3.01000005245, 4.36999998271, 5.58000000238, 2.62000009894, 4.6900000824, 3.57000008181, 5.88000007242, 2.71000000402, 6.0100001806, 3.50000002608, 6.76000016943, 2.34000002876, 7.15000008866, 2.73999998331, 9.94000005931, 1.71999996483, 8.39000013158, 8.6400001055, 1.10000004396, 8.45000004768, 0.0400000153482, 7.40000005141, 0.110000047237, 8.29000004441, 2.4900000459, 6.6800001432, 1.65000005588, 6.49999999702, 2.57000003934, 7.80999984086, 3.02000011161, 5.89000005111, 5.4700000535, 5.27000008926, 3.47000001028, 4.29999998882, 5.48000001356, 2.79999998286, 5.88000001132, 3.99000002727, 6.13000005081, 1.7199999246, 7.4400000377, 2.85999993995, 7.98000011414, 1.2900000146, 9.40000000969, 1.50999996752, 10.1799999659, 1.0599999176, 8.7100000748, 
+
+L3_zHEMM_A_mm
+0.2, 0.0, 0.3, 0.5, 0.2, 0.9, 0.8, 0.2, 0.9, 0.1, 0.8, 0.3, 0.1, 0.3, 0.8, 0.9, 0.8, 0.4, 0.5, 0.1, 0.3, -0.5, 0.3, 0.0, 0.3, 0.2, 0.8, 0.9, 0.2, 0.2, 0.8, 0.9, 0.5, 0.4, 0.6, 0.9, 0.8, 0.6, 0.5, 0.9, 0.2, -0.9, 0.3, -0.2, 0.7, 0.0, 0.5, 0.8, 0.9, 0.3, 0.2, 0.1, 0.8, 0.7, 0.8, 0.9, 0.9, 0.8, 0.1, 0.6, 0.8, -0.2, 0.8, -0.9, 0.5, -0.8, 0.2, 0.0, 0.7, 0.7, 0.8, 0.6, 0.5, 0.2, 0.7, 0.6, 0.1, 0.5, 0.1, 0.2, 0.9, -0.1, 0.2, -0.2, 0.9, -0.3, 0.7, -0.7, 0.4, 0.0, 0.4, 0.7, 0.7, 0.5, 0.2, 0.4, 0.8, 0.6, 0.7, 0.4, 0.8, -0.3, 0.8, -0.9, 0.2, -0.1, 0.8, -0.6, 0.4, -0.7, 0.3, 0.0, 0.1, 0.4, 0.7, 0.2, 0.6, 0.3, 0.8, 0.8, 0.1, -0.3, 0.5, -0.4, 0.8, -0.7, 0.5, -0.2, 0.7, -0.5, 0.1, -0.4, 0.9, 0.0, 0.5, 0.2, 0.7, 0.2, 0.7, 0.1, 0.8, -0.9, 0.6, -0.9, 0.8, -0.9, 0.7, -0.6, 0.2, -0.4, 0.7, -0.2, 0.5, -0.2, 0.6, 0.0, 0.9, 0.8, 0.1, 0.6, 0.8, -0.4, 0.8, -0.6, 0.9, -0.8, 0.1, -0.5, 0.8, -0.6, 0.6, -0.3, 0.7, -0.2, 0.9, -0.8, 0.8, 0.0, 0.7, 0.4, 0.5, -0.1, 0.5, -0.9, 0.1, -0.6, 0.1, -0.2, 0.7, -0.4, 0.8, -0.8, 0.7, -0.1, 0.1, -0.6, 0.7, -0.4, 0.2, 0.0, 
+
+L3_zHEMM_B_mn
+0.8, 0.9, 0.2, 0.7, 0.1, 0.8, 0.4, 0.4, 0.4, 0.7, 0.9, 0.8, 0.5, 0.2, 0.1, 0.7, 0.8, 0.5, 0.9, 0.7, 0.7, 0.5, 0.8, 0.4, 0.3, 0.3, 0.5, 0.3, 0.4, 0.9, 0.8, 0.8, 0.8, 0.2, 0.1, 0.6, 0.6, 0.3, 0.2, 0.3, 0.3, 0.4, 0.1, 0.4, 0.1, 0.5, 0.2, 0.9, 0.5, 0.4, 0.7, 0.2, 0.9, 0.4, 0.7, 0.8, 0.6, 0.8, 0.6, 0.3, 0.4, 0.5, 0.4, 0.2, 0.1, 0.8, 0.5, 0.3, 0.1, 0.2, 0.2, 0.1, 0.9, 0.6, 0.9, 0.4, 0.6, 0.5, 0.3, 0.4, 0.2, 0.2, 0.6, 0.7, 0.5, 0.6, 0.9, 0.6, 0.9, 0.8, 0.8, 0.9, 0.3, 0.6, 0.3, 0.8, 0.8, 0.8, 0.9, 0.7, 0.8, 0.5, 0.2, 0.5, 0.2, 0.3, 0.6, 0.7, 0.1, 0.3, 0.9, 0.8, 0.4, 0.4, 0.2, 0.1, 0.7, 0.5, 0.5, 0.6, 0.9, 0.4, 0.2, 0.4, 0.1, 0.6, 0.9, 0.9, 0.2, 0.9, 0.1, 0.8, 0.1, 0.4, 0.2, 0.2, 0.2, 0.7, 0.7, 0.2, 0.5, 0.2, 0.2, 0.2, 0.3, 0.7, 0.2, 0.6, 0.2, 0.7, 0.1, 0.4, 0.9, 0.9, 0.7, 0.3, 0.6, 0.6, 0.7, 0.9, 0.3, 0.6, 0.8, 0.3, 0.2, 0.6, 0.5, 0.8, 0.9, 0.7, 0.6, 0.9, 0.5, 0.4, 0.5, 0.5, 0.2, 0.4, 0.5, 0.7, 0.3, 0.7, 0.8, 0.1, 0.8, 0.4, 0.6, 0.6, 0.3, 0.4, 0.5, 0.8, 0.1, 0.4, 0.8, 0.8, 0.2, 0.9, 0.7, 0.7, 0.8, 0.9, 0.8, 0.6, 0.4, 0.3, 0.3, 0.9, 0.3, 0.9, 0.2, 0.7, 0.8, 0.9, 0.1, 0.5, 0.6, 0.6, 0.8, 0.4, 0.6, 0.9, 0.2, 0.2, 0.8, 0.8, 0.8, 0.9, 0.3, 0.5, 0.3, 0.5, 0.7, 0.3, 0.6, 0.9, 0.6, 0.5, 0.3, 0.8, 0.9, 0.1, 0.4, 0.1, 0.8, 0.1, 0.3, 0.9, 0.9, 0.4, 0.5, 0.7, 0.6, 0.7, 0.4, 0.2, 0.3, 0.7, 0.9, 0.6, 0.2, 0.8, 0.6, 0.3, 0.9, 0.1, 0.8, 0.9, 0.8, 0.6, 0.8, 0.7, 0.5, 0.7, 0.4, 0.5, 0.5, 0.6, 0.3, 0.6, 0.2, 0.8, 0.1, 0.5, 0.6, 0.3, 0.2, 0.9, 0.4, 0.2, 0.1, 0.9, 0.2, 0.5, 0.2, 0.8, 0.2, 0.2, 0.9, 0.7, 0.4, 0.7, 0.4, 0.2, 0.6, 0.1, 0.9, 0.3, 0.3, 0.5, 0.4, 0.2, 0.7, 0.2, 0.5, 0.8, 0.5, 0.2, 0.5, 0.9, 0.4, 0.6, 0.3, 0.8, 0.4, 0.6, 0.4, 0.6, 0.6, 0.3, 0.1, 0.9, 0.9, 0.3, 0.6, 0.1, 0.9, 0.8, 0.1, 0.8, 
+
+L3_zHEMM_C_mn
+0.8, 0.2, 0.7, 0.7, 0.5, 0.2, 0.2, 0.7, 0.3, 0.8, 0.1, 0.2, 0.9, 0.4, 0.8, 0.1, 0.8, 0.9, 0.8, 0.7, 0.7, 0.6, 0.3, 0.6, 0.1, 0.8, 0.7, 0.1, 0.5, 0.5, 0.3, 0.2, 0.5, 0.5, 0.2, 0.3, 0.7, 0.6, 0.3, 0.1, 0.3, 0.4, 0.2, 0.3, 0.2, 0.3, 0.4, 0.3, 0.3, 0.3, 0.9, 0.2, 0.6, 0.8, 0.5, 0.1, 0.4, 0.9, 0.2, 0.8, 0.2, 0.7, 0.2, 0.2, 0.3, 0.8, 0.6, 0.1, 0.8, 0.6, 0.7, 0.7, 0.9, 0.2, 0.6, 0.5, 0.7, 0.3, 0.1, 0.6, 0.6, 0.1, 0.6, 0.5, 0.1, 0.6, 0.2, 0.9, 0.5, 0.6, 0.5, 0.5, 0.1, 0.4, 0.6, 0.4, 0.9, 0.5, 0.6, 0.9, 0.9, 0.7, 0.5, 0.6, 0.6, 0.3, 0.8, 0.6, 0.9, 0.9, 0.5, 0.7, 0.4, 0.4, 0.8, 0.7, 0.9, 0.6, 0.8, 0.8, 0.7, 0.4, 0.6, 0.9, 0.2, 0.6, 0.1, 0.2, 0.9, 0.3, 0.4, 0.6, 0.2, 0.8, 0.2, 0.8, 0.8, 0.6, 0.7, 0.5, 0.3, 0.3, 0.2, 0.7, 0.8, 0.2, 0.1, 0.1, 0.1, 0.7, 0.9, 0.5, 0.7, 0.9, 0.3, 0.1, 0.1, 0.4, 0.5, 0.2, 0.4, 0.4, 0.7, 0.8, 0.5, 0.3, 0.4, 0.8, 0.7, 0.2, 0.4, 0.5, 0.4, 0.6, 0.1, 0.2, 0.7, 0.5, 0.9, 0.5, 0.4, 0.6, 0.6, 0.8, 0.8, 0.8, 0.7, 0.2, 0.1, 0.7, 0.5, 0.9, 0.2, 0.8, 0.4, 0.9, 0.7, 0.2, 0.1, 0.7, 0.6, 0.7, 0.2, 0.3, 0.7, 0.2, 0.6, 0.8, 0.1, 0.7, 0.2, 0.6, 0.3, 0.5, 0.9, 0.9, 0.4, 0.6, 0.1, 0.8, 0.1, 0.2, 0.3, 0.1, 0.7, 0.9, 0.5, 0.7, 0.2, 0.3, 0.1, 0.1, 0.7, 0.9, 0.7, 0.5, 0.6, 0.5, 0.1, 0.4, 0.1, 0.3, 0.9, 0.3, 0.1, 0.9, 0.4, 0.5, 0.6, 0.9, 0.6, 0.6, 0.5, 0.6, 0.7, 0.4, 0.8, 0.9, 0.6, 0.4, 0.1, 0.2, 0.9, 0.1, 0.7, 0.8, 0.8, 0.9, 0.7, 0.6, 0.8, 0.1, 0.7, 0.9, 0.7, 0.1, 0.1, 0.9, 0.7, 0.6, 0.7, 0.7, 0.7, 0.8, 0.6, 0.9, 0.9, 0.6, 0.7, 0.9, 0.9, 0.1, 0.2, 0.8, 0.7, 0.5, 0.5, 0.1, 0.7, 0.2, 0.6, 0.1, 0.4, 0.1, 0.2, 0.5, 0.4, 0.1, 0.7, 0.3, 0.7, 0.6, 0.7, 0.3, 0.5, 0.7, 0.8, 0.7, 0.3, 0.2, 0.4, 0.9, 0.4, 0.6, 0.1, 0.4, 0.9, 0.7, 0.2, 0.5, 0.6, 0.6, 0.4, 0.8, 0.5, 0.2, 0.6, 0.5, 0.5, 0.3, 
+
+L3_zHEMM_o_L
+0.92, 4.79, 2.32, 4.34, 1.42, 4.38, 0.9, 4.48, 0.08, 6.43, 0.48, 4.32, 1.5, 4.35, 1.04, 5.28, 2.17, 5.66, 1.48, 5.6, 0.95, 6.44, -0.59, 5.93, 0.99, 5.61, 1.94, 5.02, 0.57, 6.32, 0.88, 5.95, 2.02, 5.58, -0.11, 5.33, 1.32, 4.84, 0.8, 5.06, 0.77, 4.25, -0.91, 6.55, 0.28, 4.44, 0.72, 4.63, 0.45, 6.06, 1.06, 4.84, 0.73, 5.27, 0.36, 5.46, -0.55, 5.47, -0.32, 6.05, 0.23, 6.31, 0.19, 5.89, 0.4, 6.76, 1.05, 4.58, 1.12, 4.73, 2.17, 4.35, 2.3, 4.62, 1.73, 3.85, 0.39, 6.09, 0.92, 4.1, 1.04, 4.11, 1.29, 5.67, 1.42, 4.7, 1.36, 4.42, 1.97, 5.42, 0.7, 5.47, 0.37, 4.5, 2.04, 5.38, 1.97, 5.64, 2.07, 5.92, 2.78, 4.53, 1.38, 4.88, 2.64, 3.2, 2.77, 3.42, 2.83, 2.76, 1.38, 4.68, 2.01, 3.82, 2.63, 4.18, 2.88, 3.67, 3.32, 4.0, 3.36, 2.24, 3.79, 4.52, 2.46, 3.91, 1.95, 3.18, 3.32, 4.08, 2.36, 4.3, 2.91, 5.6, 3.01, 4.07, 2.44, 4.97, 1.82, 4.01, 2.56, 4.04, 2.03, 3.66, 2.56, 4.81, 1.66, 3.45, 1.8, 4.39, 2.77, 4.77, 3.29, 4.86, 2.86, 2.81, 2.43, 4.84, 2.87, 4.51, 2.18, 3.9, 3.32, 5.33, 2.95, 5.18, 3.04, 6.08, 3.23, 3.7, 3.72, 4.43, 2.69, 2.15, 2.69, 2.33, 3.18, 2.53, 3.39, 4.27, 3.65, 3.16, 3.1, 3.87, 3.35, 3.84, 4.04, 1.72, 3.53, 2.08, 4.04, 3.59, 3.61, 3.76, 3.25, 2.77, 4.64, 2.96, 3.46, 4.27, 4.25, 4.71, 3.2, 1.8, 3.83, 2.47, 3.48, 2.25, 3.79, 2.28, 3.32, 1.95, 4.03, 3.55, 3.79, 2.81, 3.27, 2.95, 3.72, 3.0, 4.4, 1.96, 4.01, 1.09, 5.45, 3.08, 4.9, 3.5, 3.53, 2.26, 4.6, 2.38, 4.89, 2.96, 5.53, 3.03, 4.73, 1.63, 4.01, 3.69, 3.3, 1.7, 5.28, 2.39, 3.45, 2.28, 4.51, 3.23, 4.61, 2.82, 4.08, 2.31, 4.57, 2.7, 5.59, 1.05, 5.1, 1.16, 6.0, 1.86, 4.83, 2.3, 5.11, 1.27, 5.25, 3.91, 5.86, 3.7, 6.43, 3.12, 5.55, 0.27, 6.03, 4.31, 4.94, 0.96, 4.94, 2.34, 5.2, 1.54, 6.14, 4.05, 5.51, 2.78, 5.3, 3.25, 6.18, 2.82, 6.63, 2.24, 6.61, 1.25, 7.26, 2.73, 7.51, 3.59, 5.09, 1.49, 6.86, 1.9, 7.33, 2.37, 7.56, 3.03, 6.57, 1.05, 4.98, 1.72, 3.88, 0.26, 4.15, 1.0, 3.49, 0.46, 5.02, 2.34, 4.22, 1.84, 4.39, 0.52, 4.63, 1.11, 5.0, 0.72, 4.34, 0.16, 6.25, 1.0, 5.39, 1.77, 4.48, 0.65, 5.1, 1.17, 5.22, 0.45, 5.97, 1.41, 5.36, -0.59, 
+
+L3_zHEMM_A_nn
+0.7, 0.0, 0.2, 0.2, 0.1, 0.1, 0.7, 0.4, 0.1, 0.6, 0.8, 0.2, 0.8, 0.5, 0.1, 0.2, 0.2, 0.7, 0.7, 0.3, 0.9, 0.9, 0.7, 0.7, 0.4, 0.7, 0.2, 0.7, 0.3, 0.2, 0.6, 0.5, 0.5, 0.3, 0.2, -0.2, 0.2, 0.0, 0.1, 0.8, 0.4, 0.9, 0.6, 0.1, 0.9, 0.3, 0.7, 0.7, 0.1, 0.4, 0.4, 0.7, 0.5, 0.8, 0.8, 0.7, 0.9, 0.9, 0.9, 0.8, 0.1, 0.3, 0.7, 0.8, 0.1, 0.3, 0.1, 0.1, 0.1, -0.1, 0.1, -0.8, 0.7, 0.0, 0.1, 0.9, 0.7, 0.3, 0.6, 0.5, 0.5, 0.5, 0.5, 0.9, 0.7, 0.3, 0.3, 0.8, 0.3, 0.4, 0.7, 0.9, 0.4, 0.2, 0.5, 0.9, 0.8, 0.8, 0.4, 0.5, 0.5, 0.5, 0.7, -0.4, 0.4, -0.9, 0.1, -0.9, 0.6, 0.0, 0.3, 0.3, 0.3, 0.8, 0.2, 0.5, 0.5, 0.1, 0.2, 0.8, 0.4, 0.3, 0.8, 0.8, 0.8, 0.5, 0.9, 0.2, 0.3, 0.1, 0.9, 0.1, 0.1, 0.4, 0.7, 0.9, 0.1, -0.6, 0.6, -0.1, 0.7, -0.3, 0.3, -0.3, 0.4, 0.0, 0.4, 0.9, 0.5, 0.2, 0.1, 0.6, 0.1, 0.1, 0.4, 0.1, 0.6, 0.5, 0.4, 0.3, 0.3, 0.4, 0.5, 0.9, 0.2, 0.3, 0.7, 0.9, 0.3, 0.7, 0.8, -0.2, 0.9, -0.3, 0.6, -0.5, 0.3, -0.8, 0.4, -0.9, 0.7, 0.0, 0.3, 0.8, 0.5, 0.5, 0.2, 0.8, 0.2, 0.2, 0.2, 0.5, 0.4, 0.7, 0.1, 0.1, 0.6, 0.9, 0.7, 0.2, 0.1, 0.6, 0.7, 0.6, 0.8, -0.5, 0.7, -0.7, 0.5, -0.5, 0.2, -0.5, 0.5, -0.2, 0.3, -0.8, 0.1, 0.0, 0.4, 0.8, 0.2, 0.9, 0.4, 0.8, 0.8, 0.7, 0.9, 0.3, 0.2, 0.9, 0.8, 0.5, 0.8, 0.7, 0.1, 0.8, 0.2, 0.1, 0.1, -0.2, 0.1, -0.4, 0.5, -0.9, 0.5, -0.1, 0.1, -0.6, 0.5, -0.5, 0.4, -0.8, 0.5, 0.0, 0.2, 0.8, 0.2, 0.6, 0.6, 0.1, 0.8, 0.6, 0.4, 0.1, 0.1, 0.9, 0.4, 0.5, 0.6, 0.2, 0.2, 0.8, 0.2, -0.7, 0.4, -0.7, 0.7, -0.3, 0.2, -0.8, 0.1, -0.1, 0.2, -0.8, 0.2, -0.9, 0.2, -0.8, 0.4, 0.0, 0.6, 0.1, 0.9, 0.2, 0.9, 0.9, 0.9, 0.6, 0.7, 0.2, 0.8, 0.4, 0.5, 0.9, 0.2, 0.3, 0.7, -0.3, 0.5, -0.8, 0.3, -0.8, 0.4, -0.3, 0.4, -0.1, 0.2, -0.2, 0.4, -0.8, 0.2, -0.6, 0.6, -0.1, 0.9, 0.0, 0.5, 0.8, 0.5, 0.2, 0.1, 0.2, 0.2, 0.5, 0.5, 0.1, 0.9, 0.2, 0.5, 0.7, 0.9, -0.9, 0.8, -0.7, 0.3, -0.4, 0.8, -0.8, 0.6, -0.5, 0.2, -0.5, 0.8, -0.7, 0.6, -0.1, 0.9, -0.2, 0.5, -0.8, 0.8, 0.0, 0.6, 0.7, 0.3, 0.3, 0.4, 0.8, 0.2, 0.1, 0.9, 0.6, 0.4, 0.1, 0.7, -0.7, 0.9, -0.9, 0.7, -0.9, 0.8, -0.5, 0.4, -0.3, 0.4, -0.7, 0.9, -0.3, 0.8, -0.6, 0.9, -0.9, 0.5, -0.2, 0.6, -0.7, 0.5, 0.0, 0.4, 0.7, 0.9, 0.8, 0.5, 0.2, 0.3, 0.5, 0.5, 0.8, 0.4, -0.7, 0.9, -0.8, 0.4, -0.2, 0.9, -0.2, 0.3, -0.4, 0.1, -0.1, 0.2, -0.9, 0.4, -0.1, 0.9, -0.6, 0.1, -0.2, 0.3, -0.3, 0.4, -0.7, 0.7, 0.0, 0.6, 0.2, 0.7, 0.2, 0.3, 0.9, 0.3, 0.3, 0.2, -0.7, 0.1, -0.3, 0.5, -0.9, 0.3, -0.1, 0.5, -0.9, 0.6, -0.9, 0.8, -0.5, 0.1, -0.9, 0.7, -0.2, 0.2, -0.5, 0.4, -0.8, 0.9, -0.8, 0.6, -0.2, 0.8, 0.0, 0.7, 0.2, 0.5, 0.1, 0.6, 0.5, 0.3, -0.2, 0.7, -0.8, 0.8, -0.8, 0.9, -0.1, 0.2, -0.3, 0.7, -0.2, 0.8, -0.7, 0.4, -0.5, 0.8, -0.4, 0.5, -0.1, 0.2, -0.1, 0.5, -0.2, 0.7, -0.2, 0.7, -0.2, 0.3, 0.0, 0.1, 0.6, 0.2, 0.2, 0.6, -0.5, 0.1, -0.3, 0.4, -0.5, 0.1, -0.4, 0.7, -0.9, 0.1, -0.6, 0.1, -0.8, 0.6, -0.2, 0.5, -0.9, 0.9, -0.2, 0.9, -0.6, 0.3, -0.5, 0.3, -0.9, 0.5, -0.1, 0.1, -0.6, 0.8, 0.0, 0.2, 0.3, 0.5, -0.3, 0.1, -0.1, 0.5, -0.5, 0.7, -0.9, 0.3, -0.7, 0.7, -0.6, 0.2, -0.1, 0.2, -0.8, 0.2, -0.3, 0.5, -0.7, 0.4, -0.1, 0.5, -0.8, 0.3, -0.3, 0.6, -0.5, 0.2, -0.2, 0.2, -0.3, 0.9, 0.0, 
+
+L3_zHEMM_o_R
+9.61, 0.42, 9.77, 0.45, 8.71, 0.16, 5.97, 1.69, 6.09, 1.54, 5.06, 2.21, 6.62, 3.08, 4.24, 1.9, 4.02, 5.47, 4.33, 5.05, 4.07, 7.78, 2.7, 8.21, 2.07, 7.05, 1.13, 8.12, 2.74, 6.56, 0.12, 8.67, 0.44, 8.15, 7.24, 1.47, 8.09, 0.51, 7.34, 0.47, 6.35, 2.35, 5.33, 1.72, 5.35, 1.54, 5.44, 1.39, 3.01, 1.79, 4.29, 3.98, 3.55, 4.61, 3.53, 6.17, 3.26, 7.36, 1.79, 5.82, -0.16, 7.54, 2.24, 5.91, -0.15, 7.55, 0.01, 6.3, 10.06, 0.51, 10.44, -0.64, 10.98, -0.37, 8.23, 2.69, 8.15, 1.09, 6.84, 2.76, 8.62, 1.91, 6.61, 2.95, 6.12, 5.37, 5.56, 5.14, 6.21, 7.02, 5.29, 8.04, 3.41, 5.84, 1.87, 9.27, 3.99, 6.7, 1.15, 9.32, 0.99, 9.19, 6.98, 1.35, 8.25, 1.06, 8.07, 2.35, 5.3, 4.04, 5.31, 2.47, 4.4, 3.91, 5.91, 3.32, 4.03, 3.77, 4.06, 6.25, 3.18, 5.02, 3.47, 7.36, 2.79, 7.68, 1.36, 6.06, 0.17, 8.47, 1.77, 7.13, -0.96, 8.19, -1.28, 7.51, 8.78, 1.5, 8.53, 1.28, 8.43, 1.7, 7.24, 3.25, 7.07, 1.12, 6.4, 1.52, 6.54, 2.73, 4.75, 2.03, 5.11, 4.8, 4.26, 4.27, 3.96, 6.69, 4.07, 6.99, 2.23, 6.14, 1.22, 8.56, 2.94, 6.45, -0.58, 7.97, 0.49, 7.0, 8.9, 1.58, 8.78, 0.96, 8.72, 1.38, 7.41, 3.55, 7.5, 1.8, 6.34, 3.11, 6.73, 3.3, 5.26, 4.09, 4.85, 6.07, 4.56, 6.28, 4.93, 8.34, 4.35, 8.45, 3.28, 7.15, 1.29, 8.53, 2.73, 7.54, -0.11, 9.51, -0.6, 7.75, 9.49, 1.1, 9.91, 1.44, 8.48, 1.73, 6.62, 2.83, 6.19, 2.51, 6.24, 3.21, 6.17, 2.83, 3.5, 4.02, 3.64, 5.32, 3.25, 5.18, 4.38, 8.29, 2.73, 9.15, 1.41, 7.38, -0.11, 9.19, 1.67, 8.35, -0.56, 8.99, -0.79, 8.09, 8.68, 0.41, 8.73, -0.25, 9.99, 0.04, 7.99, 3.16, 7.16, -0.18, 7.55, 2.59, 7.75, 3.0, 5.1, 2.99, 5.57, 5.47, 5.19, 5.53, 5.09, 6.88, 5.31, 6.91, 4.14, 4.71, 2.02, 8.6, 4.7, 6.54, 0.81, 8.86, 1.55, 7.56, 7.01, 2.47, 7.51, 1.56, 7.59, 2.58, 4.65, 4.23, 5.19, 2.4, 4.82, 3.44, 5.1, 4.85, 3.31, 3.23, 2.29, 5.93, 2.57, 4.71, 1.86, 6.72, 2.27, 6.99, 1.19, 5.34, -0.65, 6.24, 1.43, 6.32, -1.36, 6.74, -1.85, 6.5, 8.9, 0.73, 8.51, 0.41, 8.16, 0.48, 7.46, 2.93, 6.72, 1.93, 7.17, 2.5, 7.51, 2.26, 4.25, 3.39, 4.12, 5.37, 3.86, 5.27, 4.78, 7.55, 4.31, 7.69, 2.63, 6.04, 1.4, 8.77, 2.8, 6.13, 0.25, 8.31, 0.72, 7.53, 
+
+L3_sSYRK_A_nk
+0.5, 0.2, 0.4, 0.6, 0.6, 0.1, 0.3, 0.2, 0.7, 0.9, 0.4, 0.4, 0.7, 0.5, 0.8, 0.9, 0.2, 0.2, 0.2, 0.8, 0.8, 0.6, 0.7, 0.5, 0.4, 0.9, 0.5, 0.3, 0.1, 0.8, 0.5, 0.3, 0.3, 0.7, 0.4, 0.2, 0.7, 0.4, 0.7, 0.6, 0.3, 0.2, 0.1, 0.3, 0.2, 0.6, 0.6, 0.7, 0.7, 0.9, 0.6, 0.1, 0.6, 0.8, 0.6, 0.4, 0.5, 0.5, 0.2, 0.8, 0.2, 0.9, 0.8, 0.8, 0.6, 0.6, 0.1, 0.1, 0.8, 0.6, 0.5, 0.5, 0.9, 0.2, 0.5, 0.1, 0.1, 0.4, 0.1, 0.8, 0.3, 0.6, 0.4, 0.9, 0.7, 0.6, 0.7, 0.9, 0.8, 0.1, 0.6, 0.7, 0.5, 0.8, 0.2, 0.6, 0.2, 0.6, 0.3, 0.1, 0.2, 0.7, 0.4, 0.5, 0.1, 0.6, 0.3, 0.7, 0.8, 0.9, 0.2, 0.6, 0.8, 0.9, 0.1, 0.3, 0.5, 0.6, 0.2, 0.6, 0.1, 0.3, 0.7, 0.4, 0.3, 0.6, 0.8, 0.9, 0.5, 0.5, 0.2, 0.1, 0.6, 0.1, 0.8, 0.1, 0.7, 0.8, 0.5, 0.8, 0.2, 0.3, 0.2, 0.9, 0.1, 0.1, 0.9, 0.5, 0.6, 0.2, 0.9, 0.1, 0.5, 0.5, 0.3, 0.6, 0.2, 0.4, 0.5, 0.5, 0.7, 0.3, 0.3, 0.3, 0.2, 0.9, 0.4, 0.9, 0.5, 0.2, 0.2, 0.8, 0.4, 0.8, 0.1, 0.5, 0.8, 0.7, 0.1, 0.3, 0.9, 0.8, 0.3, 0.2, 0.8, 0.9, 0.8, 0.1, 0.5, 0.3, 0.1, 0.2, 0.1, 0.2, 0.2, 0.5, 0.5, 0.2, 0.5, 0.1, 0.6, 0.5, 0.6, 0.9, 0.1, 0.4, 0.8, 0.4, 0.2, 0.1, 0.7, 0.8, 0.7, 0.3, 0.6, 0.4, 0.7, 0.5, 0.9, 0.6, 0.9, 0.1, 0.8, 0.5, 0.3, 0.9, 0.4, 0.8, 0.9, 0.4, 0.2, 0.6, 0.5, 0.4, 0.3, 0.3, 0.8, 0.1, 0.5, 0.7, 0.6, 0.1, 0.2, 0.4, 0.8, 0.9, 0.3, 0.6, 0.5, 0.6, 0.8, 0.9, 0.5, 0.3, 0.6, 0.2, 0.6, 0.1, 0.4, 0.3, 0.9, 0.1, 0.5, 0.6, 0.2, 0.1, 0.7, 0.7, 0.3, 0.2, 0.2, 0.9, 
+
+L3_sSYRK_C_nn
+0.5, 0.8, 0.8, 0.8, 0.9, 0.8, 0.4, 0.3, 0.1, 0.7, 0.4, 0.7, 0.5, 0.2, 0.7, 0.6, 0.5, 0.8, 0.1, 0.3, 0.3, 0.8, 0.7, 0.1, 0.6, 0.7, 0.2, 0.6, 0.7, 0.7, 0.3, 0.1, 0.5, 0.6, 0.8, 0.3, 0.7, 0.9, 0.6, 0.2, 0.9, 0.3, 0.1, 0.5, 0.6, 0.5, 0.8, 0.8, 0.7, 0.5, 0.5, 0.8, 0.3, 0.9, 0.4, 0.1, 0.8, 0.1, 0.7, 0.4, 0.6, 0.1, 0.4, 0.5, 0.9, 0.2, 0.9, 0.2, 0.9, 0.8, 0.6, 0.1, 0.4, 0.2, 0.4, 0.3, 0.1, 0.1, 0.1, 0.3, 0.5, 0.9, 0.3, 0.8, 0.8, 0.8, 0.7, 0.2, 0.8, 0.2, 0.2, 0.5, 0.6, 0.5, 0.1, 0.7, 0.5, 0.4, 0.2, 0.9, 0.7, 0.9, 0.4, 0.1, 0.9, 0.1, 0.4, 0.5, 0.4, 0.3, 0.7, 0.2, 0.8, 0.5, 0.4, 0.5, 0.1, 0.2, 0.8, 0.3, 0.6, 0.3, 0.7, 0.3, 0.6, 0.3, 0.2, 0.4, 0.6, 0.4, 0.6, 0.6, 0.4, 0.3, 0.3, 0.3, 0.1, 0.7, 0.1, 0.4, 0.1, 0.5, 0.7, 0.4, 0.4, 0.1, 0.8, 0.9, 0.5, 0.4, 0.6, 0.3, 0.7, 0.7, 0.2, 0.5, 0.6, 0.1, 0.1, 0.2, 0.6, 0.1, 0.1, 0.8, 0.5, 0.9, 0.2, 0.4, 0.3, 0.7, 0.4, 0.6, 0.6, 0.1, 0.1, 0.7, 0.8, 0.4, 0.8, 0.8, 0.3, 0.2, 0.7, 0.9, 0.4, 0.2, 0.7, 0.7, 0.7, 0.5, 0.4, 0.3, 0.5, 0.5, 0.6, 0.9, 0.5, 0.2, 0.2, 0.8, 0.4, 0.8, 0.8, 0.3, 0.5, 0.7, 0.8, 0.5, 0.5, 0.4, 0.4, 0.6, 0.5, 0.9, 0.7, 0.8, 0.2, 0.1, 0.7, 0.6, 0.7, 0.2, 0.3, 0.8, 0.9, 0.9, 0.2, 0.5, 0.4, 0.4, 0.2, 0.9, 0.4, 0.1, 0.4, 0.3, 0.2, 0.2, 0.7, 0.1, 0.7, 0.2, 0.3, 0.9, 0.1, 0.3, 0.6, 0.4, 0.4, 0.8, 0.7, 0.3, 0.1, 0.5, 0.7, 0.6, 0.5, 0.5, 0.9, 0.8, 0.7, 0.2, 0.3, 0.3, 0.3, 0.2, 0.8, 0.6, 0.2, 0.5, 0.4, 0.9, 0.5, 0.6, 0.5, 0.2, 0.8, 0.9, 0.8, 0.3, 0.7, 0.7, 0.7, 0.3, 0.7, 0.2, 0.7, 0.9, 0.9, 
+
+L3_sSYRK_o_N
+5.61999998122, 4.90000006035, 4.26000007182, 5.4800000605, 4.3300000076, 5.26000007406, 3.93000005007, 4.38000005677, 4.21000000626, 4.45000002906, 3.76000003383, 4.69999999404, 4.2000000596, 5.10000001937, 5.0200000222, 4.75000012144, 4.05000001714, 4.90000006035, 4.90000005066, 3.78000008509, 4.77000010043, 4.18000008881, 5.43000005156, 3.53000005752, 4.36000012919, 4.29000004664, 3.82000004157, 4.13000008509, 4.7300000225, 4.23000004336, 4.58000006124, 3.88000006199, 4.75000010952, 3.78000005901, 4.26000007182, 3.78000008509, 4.46000004202, 5.53000006348, 3.9800000903, 4.4600000748, 4.15000004917, 4.17000007957, 3.41000003532, 3.64000003025, 3.94000009209, 3.62000002816, 3.62000007287, 4.29000007272, 4.39000000343, 3.80000010952, 3.64000001609, 5.4800000605, 4.77000010043, 5.53000006348, 6.90000007302, 4.42000010043, 6.15000011325, 4.67000005201, 5.92000004381, 4.9700000751, 4.69000011072, 4.82000003561, 4.82000003859, 4.45000007004, 5.38000008285, 4.72000004455, 5.63000008211, 4.11000005916, 4.3300000076, 4.18000008881, 3.9800000903, 4.42000010043, 4.57000009447, 4.57000009671, 3.32000009671, 4.13000010148, 3.72000004157, 2.85000004023, 3.55000004172, 4.34000008315, 3.17000006095, 4.31999999017, 3.94000005633, 4.36000010461, 4.09000004217, 5.26000007406, 5.43000005156, 4.4600000748, 6.15000011325, 4.57000009671, 6.56000003308, 4.75000006482, 5.22000013545, 4.67000006467, 4.13000003293, 5.51000002712, 4.88000009328, 4.28000005454, 5.33000002697, 5.79000002503, 5.53000005603, 5.11999999613, 3.93000005007, 3.53000005752, 4.15000004917, 4.67000005201, 3.32000009671, 4.75000006482, 4.64000005782, 4.12000010341, 4.00000006929, 3.05000005737, 4.67000002444, 3.84000006154, 3.15000004023, 4.01000006437, 3.58000008732, 3.88000005081, 3.66000005394, 4.38000005677, 4.36000012919, 4.17000007957, 5.92000004381, 4.13000010148, 5.22000013545, 4.12000010341, 5.41000005245, 4.07000002146, 3.47000008479, 4.31000007182, 4.62000007361, 3.82000008628, 4.36000005618, 4.55000004098, 4.51000014335, 3.97000002742, 4.21000000626, 4.29000004664, 3.41000003532, 4.9700000751, 3.72000004157, 4.67000006467, 4.00000006929, 4.07000002146, 4.97000004381, 3.6300000523, 4.05000005439, 4.7300000076, 3.97000004977, 4.38000004485, 4.14000004217, 4.04000009954, 4.26999998122, 4.45000002906, 3.82000004157, 3.64000003025, 4.69000011072, 2.85000004023, 4.13000003293, 3.05000005737, 3.47000008479, 3.6300000523, 4.04999998808, 3.66000006586, 3.40000004396, 4.21000002414, 4.42000003487, 3.66000004351, 3.69000010103, 3.82000000432, 3.76000003383, 4.13000008509, 3.94000009209, 4.82000003561, 3.55000004172, 5.51000002712, 4.67000002444, 4.31000007182, 4.05000005439, 3.66000006586, 4.90999998242, 3.6600000383, 3.4900000295, 4.41000002787, 3.83000006273, 4.31000002339, 3.94000002056, 4.69999999404, 4.7300000225, 3.62000002816, 4.82000003859, 4.34000008315, 4.88000009328, 3.84000006154, 4.62000007361, 4.7300000076, 3.40000004396, 3.6600000383, 5.50000000149, 3.80000007153, 4.52000000134, 4.91000001296, 5.25000008494, 3.43000002846, 4.2000000596, 4.23000004336, 3.62000007287, 4.45000007004, 3.17000006095, 4.28000005454, 3.15000004023, 3.82000008628, 3.97000004977, 4.21000002414, 3.4900000295, 3.80000007153, 3.84000005037, 4.15000006482, 3.83000003293, 4.33000008807, 3.63999998629, 5.10000001937, 4.58000006124, 4.29000007272, 5.38000008285, 4.31999999017, 5.33000002697, 4.01000006437, 4.36000005618, 4.38000004485, 4.42000003487, 4.41000002787, 4.52000000134, 4.15000006482, 6.29999997914, 4.9600000383, 5.01000007108, 4.19000000119, 5.0200000222, 3.88000006199, 4.39000000343, 4.72000004455, 3.94000005633, 5.79000002503, 3.58000008732, 4.55000004098, 4.14000004217, 3.66000004351, 3.83000006273, 4.91000001296, 3.83000003293, 4.9600000383, 5.15000000298, 4.54000009358, 4.2300000076, 4.75000012144, 4.75000010952, 3.80000010952, 5.63000008211, 4.36000010461, 5.53000005603, 3.88000005081, 4.51000014335, 4.04000009954, 3.69000010103, 4.31000002339, 5.25000008494, 4.33000008807, 5.01000007108, 4.54000009358, 5.67000009447, 4.65000002906, 4.05000001714, 3.78000005901, 3.64000001609, 4.11000005916, 4.09000004217, 5.11999999613, 3.66000005394, 3.97000002742, 4.26999998122, 3.82000000432, 3.94000002056, 3.43000002846, 3.63999998629, 4.19000000119, 4.2300000076, 4.65000002906, 4.95999993771, 
+
+L3_sSYRK_A_kn
+0.1, 0.5, 0.7, 0.6, 0.6, 0.1, 0.8, 0.9, 0.2, 0.1, 0.3, 0.1, 0.8, 0.8, 0.5, 0.9, 0.7, 0.9, 0.4, 0.2, 0.8, 0.9, 0.1, 0.7, 0.6, 0.2, 0.2, 0.7, 0.5, 0.5, 0.6, 0.1, 0.1, 0.6, 0.4, 0.1, 0.2, 0.5, 0.2, 0.4, 0.9, 0.6, 0.7, 0.7, 0.9, 0.6, 0.8, 0.4, 0.6, 0.4, 0.3, 0.6, 0.7, 0.3, 0.9, 0.7, 0.5, 0.7, 0.2, 0.9, 0.6, 0.7, 0.6, 0.4, 0.6, 0.2, 0.7, 0.1, 0.6, 0.4, 0.8, 0.5, 0.5, 0.6, 0.7, 0.4, 0.3, 0.8, 0.9, 0.4, 0.7, 0.1, 0.6, 0.2, 0.1, 0.9, 0.6, 0.6, 0.1, 0.1, 0.2, 0.7, 0.2, 0.5, 0.4, 0.3, 0.5, 0.3, 0.3, 0.4, 0.5, 0.4, 0.8, 0.9, 0.8, 0.1, 0.1, 0.3, 0.2, 0.8, 0.5, 0.2, 0.7, 0.3, 0.8, 0.5, 0.4, 0.2, 0.4, 0.6, 0.1, 0.6, 0.5, 0.9, 0.9, 0.1, 0.8, 0.7, 0.4, 0.6, 0.9, 0.5, 0.4, 0.3, 0.7, 0.2, 0.8, 0.5, 0.9, 0.6, 0.9, 0.5, 0.4, 0.8, 0.6, 0.9, 0.7, 0.6, 0.6, 0.4, 0.2, 0.9, 0.9, 0.2, 0.2, 0.2, 0.7, 0.5, 0.7, 0.1, 0.5, 0.7, 0.5, 0.1, 0.1, 0.7, 0.4, 0.6, 0.8, 0.4, 0.8, 0.6, 0.1, 0.6, 0.1, 0.2, 0.4, 0.9, 0.5, 0.8, 0.8, 0.3, 0.3, 0.2, 0.9, 0.5, 0.3, 0.2, 0.2, 0.6, 0.4, 0.7, 0.6, 0.4, 0.3, 0.9, 0.7, 0.3, 0.1, 0.9, 0.6, 0.8, 0.7, 0.3, 0.5, 0.8, 0.6, 0.6, 0.1, 0.2, 0.1, 0.5, 0.7, 0.9, 0.6, 0.7, 0.8, 0.2, 0.2, 0.1, 0.2, 0.1, 0.4, 0.1, 0.8, 0.6, 0.6, 0.2, 0.3, 0.7, 0.4, 0.1, 0.2, 0.6, 0.1, 0.8, 0.4, 0.8, 0.5, 0.2, 0.5, 0.9, 0.8, 0.4, 0.9, 0.2, 0.4, 0.7, 0.7, 0.7, 0.5, 0.4, 0.6, 0.8, 0.6, 0.9, 0.4, 0.9, 0.1, 0.5, 0.6, 0.9, 0.9, 0.6, 0.7, 0.4, 0.6, 0.7, 0.2, 0.6, 0.4, 0.4, 
+
+L3_sSYRK_o_T
+6.69000002205, 5.09000007346, 5.66000007853, 5.19000009805, 5.27999996215, 4.40000010654, 5.22999994501, 5.54000006974, 4.93000005826, 5.84000002205, 5.87000004753, 5.250000076, 5.600000076, 3.48000009775, 4.60000008643, 4.78000005081, 4.09000005409, 5.09000007346, 4.04000004143, 4.07000007063, 3.90000009015, 3.84000002354, 3.25000005364, 3.49000001386, 4.5900000608, 4.60000000596, 4.07000004828, 4.5700000535, 3.79000006527, 4.95000006184, 2.9900000757, 3.2200000833, 3.760000007, 3.48000007689, 5.66000007853, 4.07000007063, 6.01000004947, 4.65000006035, 4.84000002503, 3.79000010177, 5.18999995351, 5.12000004083, 4.55000008047, 5.18000001058, 5.15000007302, 4.35000008792, 6.09000008538, 3.9700001049, 4.3800001134, 4.77999998972, 3.92000001848, 5.19000009805, 3.90000009015, 4.65000006035, 6.17000006169, 5.17000001028, 4.56000005767, 4.53999997735, 5.20000009909, 5.34999999702, 5.58000005975, 4.97000002369, 4.35000006184, 5.72000009447, 4.3900000824, 4.35000011623, 5.68999998108, 4.03000010967, 5.27999996215, 3.84000002354, 4.84000002503, 5.17000001028, 5.99999992251, 4.1800000158, 4.73999996319, 4.77000003338, 4.72999996364, 4.58999996319, 4.51999995515, 4.18000000834, 5.52000001103, 4.41000004426, 4.01000011951, 5.6399999617, 4.63000005528, 4.40000010654, 3.25000005364, 3.79000010177, 4.56000005767, 4.1800000158, 3.99000007868, 3.70000003204, 4.3400000973, 4.8400000295, 4.19000005782, 4.3200000371, 3.73000005752, 4.75000008717, 2.69000008166, 4.43000013724, 4.57000000432, 3.61000005543, 5.22999994501, 3.49000001386, 5.18999995351, 4.53999997735, 4.73999996319, 3.70000003204, 6.01999984711, 4.72999999791, 4.96999995217, 4.8299999398, 5.66999991715, 4.36000001073, 5.36999998868, 3.86000005767, 4.14000005782, 4.52999995917, 4.29000004441, 5.54000006974, 4.5900000608, 5.12000004083, 5.20000009909, 4.77000003338, 4.3400000973, 4.72999999791, 6.23000001132, 5.21000005096, 5.47000002667, 5.48000005752, 4.61000011727, 6.2400001055, 3.93000009403, 4.60000008643, 4.91999999091, 4.19000006825, 4.93000005826, 4.60000000596, 4.55000008047, 5.34999999702, 4.72999996364, 4.8400000295, 4.96999995217, 5.21000005096, 6.26999990821, 5.53999997139, 5.62000001401, 5.07000002444, 6.20000000745, 3.86000006288, 5.12000009447, 5.19999997094, 4.25000004619, 5.84000002205, 4.07000004828, 5.18000001058, 5.58000005975, 4.58999996319, 4.19000005782, 4.8299999398, 5.47000002667, 5.53999997139, 6.13999993265, 6.11999999464, 4.85000004023, 6.47999997407, 3.28000006646, 4.95000009015, 4.97999998301, 4.22000000879, 5.87000004753, 4.5700000535, 5.15000007302, 4.97000002369, 4.51999995515, 4.3200000371, 5.66999991715, 5.48000005752, 5.62000001401, 6.11999999464, 6.17999994576, 4.6700000602, 6.04000002578, 4.26000004575, 4.44000008538, 4.4199999924, 4.06000003457, 5.250000076, 3.79000006527, 4.35000008792, 4.35000006184, 4.18000000834, 3.73000005752, 4.36000001073, 4.61000011727, 5.07000002444, 4.85000004023, 4.6700000602, 4.34000006229, 5.03000010371, 3.04000009805, 3.82000013322, 4.41000004202, 3.11000009418, 5.600000076, 4.95000006184, 6.09000008538, 5.72000009447, 5.52000001103, 4.75000008717, 5.36999998868, 6.2400001055, 6.20000000745, 6.47999997407, 6.04000002578, 5.03000010371, 6.85000006258, 4.04000010476, 5.61000011876, 5.65000003502, 4.85000009015, 3.48000009775, 2.9900000757, 3.9700001049, 4.3900000824, 4.41000004426, 2.69000008166, 3.86000005767, 3.93000009403, 3.86000006288, 3.28000006646, 4.26000004575, 3.04000009805, 4.04000010476, 3.40000014603, 3.08000012308, 3.77000004977, 2.9100000897, 4.60000008643, 3.2200000833, 4.3800001134, 4.35000011623, 4.01000011951, 4.43000013724, 4.14000005782, 4.60000008643, 5.12000009447, 4.95000009015, 4.44000008538, 3.82000013322, 5.61000011876, 3.08000012308, 4.78000016034, 4.68000007838, 3.9600001061, 4.78000005081, 3.760000007, 4.77999998972, 5.68999998108, 5.6399999617, 4.57000000432, 4.52999995917, 4.91999999091, 5.19999997094, 4.97999998301, 4.4199999924, 4.41000004202, 5.65000003502, 3.77000004977, 4.68000007838, 5.84999992549, 4.68999998257, 4.09000005409, 3.48000007689, 3.92000001848, 4.03000010967, 4.63000005528, 3.61000005543, 4.29000004441, 4.19000006825, 4.25000004619, 4.22000000879, 4.06000003457, 3.11000009418, 4.85000009015, 2.9100000897, 3.9600001061, 4.68999998257, 4.57000003636, 
+
+L3_dSYRK_A_nk
+0.9, 0.2, 0.9, 0.5, 0.4, 0.5, 0.6, 0.2, 0.9, 0.6, 0.4, 0.3, 0.6, 0.4, 0.7, 0.1, 0.4, 0.9, 0.8, 0.4, 0.6, 0.7, 0.6, 0.5, 0.5, 0.6, 0.6, 0.4, 0.7, 0.4, 0.1, 0.9, 0.7, 0.8, 0.2, 0.7, 0.1, 0.2, 0.6, 0.7, 0.7, 0.8, 0.1, 0.4, 0.6, 0.2, 0.7, 0.2, 0.5, 0.2, 0.1, 0.4, 0.6, 0.8, 0.2, 0.8, 0.4, 0.2, 0.1, 0.8, 0.7, 0.4, 0.1, 0.1, 0.1, 0.5, 0.8, 0.1, 0.1, 0.5, 0.9, 0.5, 0.3, 0.2, 0.1, 0.2, 0.4, 0.8, 0.4, 0.5, 0.5, 0.4, 0.1, 0.9, 0.5, 0.2, 0.3, 0.4, 0.6, 0.9, 0.2, 0.4, 0.1, 0.6, 0.1, 0.9, 0.1, 0.5, 0.6, 0.4, 0.3, 0.1, 0.5, 0.8, 0.7, 0.8, 0.9, 0.4, 0.1, 0.1, 0.3, 0.5, 0.4, 0.6, 0.7, 0.6, 0.3, 0.2, 0.6, 0.2, 0.7, 0.7, 0.2, 0.1, 0.7, 0.1, 0.7, 0.9, 0.2, 0.3, 0.6, 0.9, 0.5, 0.9, 0.2, 0.5, 0.4, 0.6, 0.9, 0.4, 0.9, 0.1, 0.4, 0.3, 0.8, 0.7, 0.2, 0.8, 0.5, 0.2, 0.1, 0.8, 0.7, 0.4, 0.6, 0.5, 0.8, 0.3, 0.8, 0.5, 0.4, 0.6, 0.8, 0.5, 0.3, 0.2, 0.7, 0.3, 0.4, 0.3, 0.3, 0.5, 0.3, 0.8, 0.8, 0.2, 0.9, 0.3, 0.4, 0.9, 0.1, 0.1, 0.7, 0.2, 0.2, 0.4, 0.7, 0.9, 0.3, 0.9, 0.1, 0.5, 0.4, 0.3, 0.6, 0.6, 0.3, 0.5, 0.5, 0.7, 0.9, 0.8, 0.1, 0.8, 0.6, 0.9, 0.4, 0.2, 0.8, 0.2, 0.3, 0.3, 0.4, 0.2, 0.4, 0.3, 0.1, 0.4, 0.6, 0.8, 0.6, 0.1, 0.3, 0.8, 0.2, 0.4, 0.1, 0.4, 0.6, 0.8, 0.3, 0.4, 0.8, 0.6, 0.2, 0.9, 0.4, 0.3, 0.2, 0.9, 0.7, 0.6, 0.5, 0.3, 0.3, 0.1, 0.4, 0.3, 0.1, 0.9, 0.6, 0.8, 0.2, 0.2, 0.8, 0.9, 0.4, 0.6, 0.6, 0.2, 0.8, 0.5, 0.2, 0.9, 0.3, 0.8, 0.2, 0.6, 0.6, 0.4, 0.7, 0.4, 
+
+L3_dSYRK_C_nn
+0.1, 0.4, 0.5, 0.9, 0.3, 0.9, 0.1, 0.2, 0.5, 0.8, 0.8, 0.1, 0.9, 0.9, 0.4, 0.2, 0.8, 0.4, 0.6, 0.3, 0.8, 0.1, 0.3, 0.1, 0.9, 0.2, 0.6, 0.7, 0.1, 0.7, 0.9, 0.5, 0.7, 0.2, 0.5, 0.3, 0.1, 0.2, 0.5, 0.7, 0.1, 0.8, 0.8, 0.4, 0.1, 0.8, 0.9, 0.5, 0.1, 0.9, 0.2, 0.9, 0.8, 0.2, 0.8, 0.5, 0.8, 0.4, 0.6, 0.8, 0.4, 0.7, 0.3, 0.9, 0.5, 0.1, 0.3, 0.8, 0.3, 0.1, 0.5, 0.5, 0.8, 0.8, 0.9, 0.1, 0.3, 0.7, 0.2, 0.6, 0.2, 0.1, 0.6, 0.7, 0.8, 0.9, 0.3, 0.7, 0.8, 0.8, 0.4, 0.5, 0.6, 0.9, 0.8, 0.5, 0.5, 0.5, 0.4, 0.7, 0.8, 0.2, 0.1, 0.1, 0.1, 0.4, 0.9, 0.5, 0.3, 0.7, 0.8, 0.5, 0.6, 0.8, 0.2, 0.9, 0.6, 0.6, 0.7, 0.2, 0.9, 0.8, 0.6, 0.1, 0.6, 0.7, 0.7, 0.6, 0.1, 0.4, 0.8, 0.3, 0.5, 0.7, 0.9, 0.7, 0.5, 0.2, 0.8, 0.8, 0.3, 0.9, 0.8, 0.6, 0.2, 0.7, 0.1, 0.9, 0.7, 0.5, 0.1, 0.1, 0.2, 0.8, 0.6, 0.4, 0.4, 0.7, 0.8, 0.5, 0.1, 0.7, 0.4, 0.5, 0.4, 0.5, 0.9, 0.1, 0.5, 0.7, 0.8, 0.7, 0.1, 0.7, 0.2, 0.5, 0.6, 0.4, 0.1, 0.5, 0.4, 0.6, 0.5, 0.8, 0.6, 0.2, 0.4, 0.1, 0.1, 0.8, 0.3, 0.6, 0.5, 0.8, 0.8, 0.9, 0.4, 0.6, 0.2, 0.6, 0.6, 0.8, 0.4, 0.6, 0.9, 0.7, 0.9, 0.9, 0.2, 0.5, 0.2, 0.3, 0.7, 0.5, 0.5, 0.6, 0.9, 0.9, 0.3, 0.5, 0.6, 0.9, 0.9, 0.5, 0.5, 0.1, 0.4, 0.9, 0.5, 0.5, 0.9, 0.8, 0.6, 0.9, 0.2, 0.4, 0.8, 0.7, 0.4, 0.5, 0.1, 0.1, 0.6, 0.7, 0.6, 0.7, 0.1, 0.1, 0.6, 0.8, 0.3, 0.4, 0.5, 0.6, 0.7, 0.2, 0.7, 0.9, 0.3, 0.7, 0.8, 0.6, 0.9, 0.1, 0.5, 0.2, 0.4, 0.5, 0.8, 0.6, 0.5, 0.4, 0.8, 0.2, 0.2, 0.8, 0.8, 0.2, 0.7, 0.7, 0.2, 0.7, 0.4, 0.6, 0.6, 0.7, 0.7, 0.4, 0.4, 
+
+L3_dSYRK_o_N
+5.26, 4.82, 4.68, 4.02, 3.57, 4.27, 3.61, 4.43, 4.69, 5.23, 4.84, 3.96, 5.56, 4.14, 3.87, 3.98, 4.85, 4.82, 6.43, 4.45, 4.31, 3.97, 4.37, 4.3, 5.52, 4.93, 5.29, 4.68, 4.21, 5.34, 4.71, 4.95, 5.06, 4.86, 4.68, 4.45, 4.89, 3.27, 3.44, 4.32, 3.65, 4.91, 4.54, 5.1, 3.76, 4.39, 5.34, 3.54, 3.58, 4.75, 4.27, 4.02, 4.31, 3.27, 4.46, 2.83, 3.51, 2.81, 3.06, 4.27, 4.03, 3.3, 3.23, 4.71, 3.2, 3.52, 2.83, 4.37, 3.57, 3.97, 3.44, 2.83, 4.42, 3.31, 3.64, 3.31, 3.13, 3.59, 3.63, 3.56, 3.83, 2.37, 3.36, 3.53, 4.03, 4.27, 4.37, 4.32, 3.51, 3.31, 4.73, 3.84, 4.24, 4.26, 4.75, 3.53, 4.29, 4.52, 3.39, 4.51, 4.46, 3.71, 3.61, 4.3, 3.65, 2.81, 3.64, 3.84, 4.53, 4.28, 4.53, 4.38, 3.76, 4.04, 3.99, 3.77, 3.93, 4.31, 4.37, 4.43, 5.52, 4.91, 3.06, 3.31, 4.24, 4.28, 5.43, 4.48, 4.41, 4.02, 4.14, 4.31, 3.7, 4.3, 4.91, 4.58, 4.69, 4.93, 4.54, 4.27, 3.13, 4.26, 4.53, 4.48, 5.41, 5.24, 3.45, 4.46, 4.92, 3.83, 3.92, 3.69, 4.34, 5.23, 5.29, 5.1, 4.03, 3.59, 4.75, 4.38, 4.41, 5.24, 6.03, 4.35, 4.44, 5.07, 4.64, 4.08, 4.77, 5.27, 4.84, 4.68, 3.76, 3.3, 3.63, 3.53, 3.76, 4.02, 3.45, 4.35, 4.52, 4.36, 4.66, 3.56, 3.58, 3.8, 4.11, 3.96, 4.21, 4.39, 3.23, 3.56, 4.29, 4.04, 4.14, 4.46, 4.44, 4.36, 5.28, 4.82, 4.19, 4.14, 4.35, 3.88, 5.56, 5.34, 5.34, 4.71, 3.83, 4.52, 3.99, 4.31, 4.92, 5.07, 4.66, 4.82, 6.42, 4.11, 4.52, 4.3, 5.13, 4.14, 4.71, 3.54, 3.2, 2.37, 3.39, 3.77, 3.7, 3.83, 4.64, 3.56, 4.19, 4.11, 3.78, 3.64, 4.58, 4.03, 3.87, 4.95, 3.58, 3.52, 3.36, 4.51, 3.93, 4.3, 3.92, 4.08, 3.58, 4.14, 4.52, 3.64, 5.07, 4.22, 4.62, 3.98, 5.06, 4.75, 2.83, 3.53, 4.46, 4.31, 4.91, 3.69, 4.77, 3.8, 4.35, 4.3, 4.58, 4.22, 5.39, 4.51, 4.85, 4.86, 4.27, 4.37, 4.03, 3.71, 4.37, 4.58, 4.34, 5.27, 4.11, 3.88, 5.13, 4.03, 4.62, 4.51, 5.36, 
+
+L3_dSYRK_A_kn
+0.8, 0.5, 0.1, 0.4, 0.9, 0.5, 0.2, 0.6, 0.9, 0.2, 0.7, 0.8, 0.2, 0.2, 0.3, 0.5, 0.5, 0.9, 0.2, 0.3, 0.8, 0.6, 0.4, 0.5, 0.1, 0.6, 0.4, 0.9, 0.8, 0.4, 0.1, 0.4, 0.7, 0.9, 0.3, 0.3, 0.4, 0.8, 0.6, 0.7, 0.9, 0.6, 0.5, 0.3, 0.6, 0.9, 0.2, 0.8, 0.9, 0.2, 0.8, 0.9, 0.2, 0.7, 0.7, 0.3, 0.1, 0.3, 0.2, 0.6, 0.4, 0.5, 0.2, 0.7, 0.5, 0.3, 0.6, 0.9, 0.8, 0.3, 0.1, 0.4, 0.7, 0.7, 0.6, 0.5, 0.6, 0.9, 0.6, 0.7, 0.3, 0.3, 0.7, 0.2, 0.4, 0.3, 0.3, 0.5, 0.2, 0.7, 0.4, 0.6, 0.5, 0.2, 0.6, 0.4, 0.2, 0.7, 0.7, 0.2, 0.2, 0.2, 0.4, 0.2, 0.1, 0.3, 0.5, 0.1, 0.6, 0.3, 0.4, 0.3, 0.9, 0.7, 0.5, 0.5, 0.6, 0.9, 0.2, 0.4, 0.8, 0.1, 0.6, 0.4, 0.5, 0.5, 0.5, 0.2, 0.2, 0.6, 0.7, 0.2, 0.2, 0.1, 0.3, 0.4, 0.4, 0.4, 0.5, 0.5, 0.8, 0.8, 0.2, 0.3, 0.7, 0.3, 0.9, 0.3, 0.7, 0.1, 0.5, 0.5, 0.8, 0.4, 0.4, 0.9, 0.7, 0.8, 0.6, 0.5, 0.3, 0.2, 0.5, 0.2, 0.4, 0.9, 0.4, 0.6, 0.1, 0.9, 0.8, 0.1, 0.3, 0.7, 0.5, 0.5, 0.7, 0.6, 0.7, 0.7, 0.7, 0.9, 0.3, 0.1, 0.4, 0.3, 0.3, 0.6, 0.3, 0.1, 0.5, 0.6, 0.1, 0.5, 0.9, 0.1, 0.6, 0.8, 0.1, 0.3, 0.9, 0.5, 0.7, 0.1, 0.1, 0.2, 0.5, 0.3, 0.9, 0.5, 0.6, 0.1, 0.7, 0.8, 0.1, 0.9, 0.2, 0.8, 0.8, 0.2, 0.2, 0.7, 0.8, 0.3, 0.4, 0.3, 0.9, 0.2, 0.4, 0.8, 0.2, 0.1, 0.2, 0.6, 0.9, 0.5, 0.4, 0.6, 0.5, 0.2, 0.3, 0.3, 0.6, 0.8, 0.7, 0.4, 0.1, 0.1, 0.3, 0.9, 0.4, 0.5, 0.6, 0.6, 0.4, 0.9, 0.9, 0.1, 0.8, 0.6, 0.3, 0.3, 0.1, 0.7, 0.6, 0.8, 0.2, 0.6, 0.3, 0.4, 0.5, 0.1, 
+
+L3_dSYRK_o_T
+6.38, 4.05, 3.27, 6.07, 5.68, 5.25, 4.31, 3.84, 5.52, 4.92, 6.43, 5.01, 5.08, 4.62, 4.59, 4.48, 5.39, 4.05, 3.83, 2.06, 4.12, 3.7, 3.5, 2.7, 3.28, 3.41, 3.07, 4.1, 3.04, 3.54, 3.65, 3.2, 3.22, 3.02, 3.27, 2.06, 2.73, 3.1, 3.84, 3.44, 2.72, 2.64, 3.35, 2.8, 2.61, 3.52, 3.8, 3.05, 2.79, 2.85, 3.39, 6.07, 4.12, 3.1, 5.84, 5.5, 4.85, 4.55, 3.85, 5.13, 4.13, 5.76, 4.96, 4.72, 4.02, 4.17, 3.89, 5.28, 5.68, 3.7, 3.84, 5.5, 7.32, 5.77, 5.76, 4.0, 5.27, 5.25, 5.76, 6.26, 4.55, 4.46, 5.56, 4.73, 5.45, 5.25, 3.5, 3.44, 4.85, 5.77, 5.27, 4.42, 3.78, 5.04, 4.1, 4.54, 5.21, 4.03, 3.95, 4.81, 3.76, 4.37, 4.31, 2.7, 2.72, 4.55, 5.76, 4.42, 4.83, 4.03, 4.37, 4.18, 5.02, 5.75, 3.48, 4.7, 4.76, 3.82, 4.34, 3.84, 3.28, 2.64, 3.85, 4.0, 3.78, 4.03, 4.0, 3.52, 2.92, 4.16, 4.34, 2.88, 3.65, 3.78, 3.59, 3.52, 5.52, 3.41, 3.35, 5.13, 5.27, 5.04, 4.37, 3.52, 5.24, 4.34, 4.77, 5.5, 4.19, 3.85, 4.06, 3.53, 4.26, 4.92, 3.07, 2.8, 4.13, 5.25, 4.1, 4.18, 2.92, 4.34, 4.39, 4.5, 4.28, 3.65, 4.19, 3.73, 3.24, 3.72, 6.43, 4.1, 2.61, 5.76, 5.76, 4.54, 5.02, 4.16, 4.77, 4.5, 6.73, 5.67, 4.44, 4.31, 4.84, 4.67, 4.7, 5.01, 3.04, 3.52, 4.96, 6.26, 5.21, 5.75, 4.34, 5.5, 4.28, 5.67, 6.61, 3.89, 4.28, 5.49, 4.11, 4.92, 5.08, 3.54, 3.8, 4.72, 4.55, 4.03, 3.48, 2.88, 4.19, 3.65, 4.44, 3.89, 4.9, 4.17, 3.68, 3.61, 4.4, 4.62, 3.65, 3.05, 4.02, 4.46, 3.95, 4.7, 3.65, 3.85, 4.19, 4.31, 4.28, 4.17, 4.79, 4.33, 3.86, 3.91, 4.59, 3.2, 2.79, 4.17, 5.56, 4.81, 4.76, 3.78, 4.06, 3.73, 4.84, 5.49, 3.68, 4.33, 4.98, 3.84, 4.53, 4.48, 3.22, 2.85, 3.89, 4.73, 3.76, 3.82, 3.59, 3.53, 3.24, 4.67, 4.11, 3.61, 3.86, 3.84, 4.27, 3.62, 5.39, 3.02, 3.39, 5.28, 5.45, 4.37, 4.34, 3.52, 4.26, 3.72, 4.7, 4.92, 4.4, 3.91, 4.53, 3.62, 5.43, 
+
+L3_cSYRK_A_nk
+0.40000000596, 0.300000011921, 0.800000011921, 0.300000011921, 0.800000011921, 0.20000000298, 0.10000000149, 0.40000000596, 0.600000023842, 0.699999988079, 0.800000011921, 0.20000000298, 0.600000023842, 0.899999976158, 0.800000011921, 0.10000000149, 0.10000000149, 0.5, 0.899999976158, 0.5, 0.899999976158, 0.699999988079, 0.5, 0.600000023842, 0.699999988079, 0.10000000149, 0.699999988079, 0.40000000596, 0.20000000298, 0.10000000149, 0.699999988079, 0.899999976158, 0.300000011921, 0.300000011921, 0.600000023842, 0.899999976158, 0.40000000596, 0.10000000149, 0.600000023842, 0.40000000596, 0.600000023842, 0.699999988079, 0.699999988079, 0.5, 0.40000000596, 0.20000000298, 0.5, 0.40000000596, 0.10000000149, 0.899999976158, 0.800000011921, 0.40000000596, 0.600000023842, 0.300000011921, 0.600000023842, 0.600000023842, 0.20000000298, 0.699999988079, 0.899999976158, 0.800000011921, 0.899999976158, 0.10000000149, 0.800000011921, 0.5, 0.699999988079, 0.20000000298, 0.10000000149, 0.699999988079, 0.899999976158, 0.300000011921, 0.600000023842, 0.40000000596, 0.10000000149, 0.600000023842, 0.899999976158, 0.20000000298, 0.600000023842, 0.800000011921, 0.10000000149, 0.800000011921, 0.600000023842, 0.20000000298, 0.10000000149, 0.40000000596, 0.40000000596, 0.300000011921, 0.600000023842, 0.800000011921, 0.5, 0.800000011921, 0.300000011921, 0.600000023842, 0.5, 0.800000011921, 0.40000000596, 0.699999988079, 0.800000011921, 0.5, 0.899999976158, 0.5, 0.5, 0.300000011921, 0.5, 0.10000000149, 0.40000000596, 0.600000023842, 0.600000023842, 0.20000000298, 0.899999976158, 0.10000000149, 0.600000023842, 0.800000011921, 0.10000000149, 0.300000011921, 0.699999988079, 0.899999976158, 0.699999988079, 0.20000000298, 0.40000000596, 0.899999976158, 0.10000000149, 0.699999988079, 0.40000000596, 0.5, 0.699999988079, 0.800000011921, 0.20000000298, 0.40000000596, 0.5, 0.600000023842, 0.10000000149, 0.20000000298, 0.10000000149, 0.40000000596, 0.899999976158, 0.699999988079, 0.40000000596, 0.800000011921, 0.899999976158, 0.300000011921, 0.20000000298, 0.899999976158, 0.899999976158, 0.300000011921, 0.699999988079, 0.20000000298, 0.40000000596, 0.699999988079, 0.20000000298, 0.40000000596, 0.20000000298, 0.800000011921, 0.40000000596, 0.10000000149, 0.5, 0.899999976158, 0.20000000298, 0.899999976158, 0.699999988079, 0.699999988079, 0.899999976158, 0.300000011921, 0.10000000149, 0.600000023842, 0.899999976158, 0.899999976158, 0.600000023842, 0.699999988079, 0.40000000596, 0.300000011921, 0.5, 0.899999976158, 0.5, 0.699999988079, 0.300000011921, 0.699999988079, 0.600000023842, 0.600000023842, 0.699999988079, 0.5, 0.800000011921, 0.5, 0.800000011921, 0.800000011921, 0.10000000149, 0.600000023842, 0.600000023842, 0.300000011921, 0.600000023842, 0.600000023842, 0.899999976158, 0.40000000596, 0.800000011921, 0.800000011921, 0.899999976158, 0.600000023842, 0.800000011921, 0.899999976158, 0.699999988079, 0.10000000149, 0.699999988079, 0.800000011921, 0.40000000596, 0.300000011921, 0.10000000149, 0.600000023842, 0.800000011921, 0.300000011921, 0.40000000596, 0.40000000596, 0.5, 0.40000000596, 0.699999988079, 0.699999988079, 0.20000000298, 0.300000011921, 0.40000000596, 0.40000000596, 0.800000011921, 0.699999988079, 0.899999976158, 0.800000011921, 0.600000023842, 0.899999976158, 0.40000000596, 0.20000000298, 0.899999976158, 0.300000011921, 0.800000011921, 0.699999988079, 0.5, 0.899999976158, 0.20000000298, 0.20000000298, 0.600000023842, 0.699999988079, 0.800000011921, 0.600000023842, 0.10000000149, 0.5, 0.600000023842, 0.600000023842, 0.40000000596, 0.300000011921, 0.20000000298, 0.300000011921, 0.10000000149, 0.40000000596, 0.10000000149, 0.600000023842, 0.899999976158, 0.300000011921, 0.600000023842, 0.300000011921, 0.10000000149, 0.5, 0.699999988079, 0.20000000298, 0.10000000149, 0.699999988079, 0.20000000298, 0.600000023842, 0.300000011921, 0.5, 0.20000000298, 0.5, 0.5, 0.20000000298, 0.899999976158, 0.20000000298, 0.5, 0.800000011921, 0.800000011921, 0.10000000149, 0.40000000596, 0.10000000149, 0.800000011921, 0.699999988079, 0.40000000596, 0.20000000298, 0.10000000149, 0.300000011921, 0.699999988079, 0.899999976158, 0.40000000596, 0.800000011921, 0.699999988079, 0.699999988079, 0.800000011921, 0.10000000149, 0.10000000149, 0.600000023842, 0.800000011921, 0.800000011921, 0.600000023842, 0.5, 0.699999988079, 0.20000000298, 0.20000000298, 0.300000011921, 0.40000000596, 0.40000000596, 0.800000011921, 0.699999988079, 0.40000000596, 0.699999988079, 0.40000000596, 0.699999988079, 0.300000011921, 0.20000000298, 0.899999976158, 0.20000000298, 0.699999988079, 0.20000000298, 0.800000011921, 0.699999988079, 0.5, 0.40000000596, 0.10000000149, 0.899999976158, 0.899999976158, 0.5, 0.699999988079, 0.899999976158, 0.40000000596, 0.899999976158, 0.20000000298, 0.10000000149, 0.20000000298, 0.5, 0.699999988079, 0.10000000149, 0.699999988079, 0.20000000298, 0.20000000298, 0.800000011921, 0.10000000149, 0.40000000596, 0.899999976158, 0.699999988079, 0.699999988079, 0.899999976158, 0.20000000298, 0.300000011921, 0.300000011921, 0.699999988079, 0.899999976158, 0.800000011921, 0.899999976158, 0.699999988079, 0.800000011921, 0.40000000596, 0.5, 0.5, 0.5, 0.10000000149, 0.300000011921, 0.5, 0.5, 0.300000011921, 0.20000000298, 0.10000000149, 0.699999988079, 0.20000000298, 0.699999988079, 0.699999988079, 0.600000023842, 0.300000011921, 0.600000023842, 0.20000000298, 0.899999976158, 0.20000000298, 0.300000011921, 0.10000000149, 0.10000000149, 0.600000023842, 0.40000000596, 0.40000000596, 0.800000011921, 0.800000011921, 0.5, 0.20000000298, 0.699999988079, 0.899999976158, 0.20000000298, 0.899999976158, 0.300000011921, 0.699999988079, 0.300000011921, 0.10000000149, 0.899999976158, 0.699999988079, 0.10000000149, 0.40000000596, 0.600000023842, 0.800000011921, 0.800000011921, 0.300000011921, 0.699999988079, 0.699999988079, 0.600000023842, 0.40000000596, 0.5, 0.40000000596, 0.10000000149, 0.800000011921, 0.600000023842, 0.20000000298, 0.20000000298, 0.600000023842, 0.10000000149, 0.600000023842, 0.300000011921, 0.800000011921, 0.899999976158, 0.899999976158, 0.600000023842, 0.10000000149, 0.40000000596, 0.10000000149, 0.899999976158, 0.899999976158, 0.10000000149, 0.5, 0.800000011921, 0.800000011921, 0.5, 0.699999988079, 0.699999988079, 0.40000000596, 0.20000000298, 0.899999976158, 0.5, 0.10000000149, 0.899999976158, 0.300000011921, 0.699999988079, 0.10000000149, 0.300000011921, 0.600000023842, 0.800000011921, 0.300000011921, 0.10000000149, 0.20000000298, 0.5, 0.300000011921, 0.899999976158, 0.699999988079, 0.5, 0.699999988079, 0.699999988079, 0.600000023842, 0.5, 0.600000023842, 0.899999976158, 0.40000000596, 0.5, 0.20000000298, 0.800000011921, 0.40000000596, 0.20000000298, 0.5, 0.899999976158, 0.300000011921, 0.899999976158, 0.20000000298, 0.10000000149, 0.40000000596, 0.20000000298, 0.699999988079, 0.800000011921, 0.40000000596, 0.5, 0.300000011921, 0.800000011921, 0.800000011921, 0.40000000596, 0.20000000298, 0.300000011921, 0.600000023842, 0.5, 0.699999988079, 0.699999988079, 0.600000023842, 0.899999976158, 0.600000023842, 0.699999988079, 0.699999988079, 0.40000000596, 0.800000011921, 0.699999988079, 0.40000000596, 0.600000023842, 0.5, 0.20000000298, 0.800000011921, 0.699999988079, 0.899999976158, 0.800000011921, 0.800000011921, 0.899999976158, 0.20000000298, 0.699999988079, 0.300000011921, 0.699999988079, 0.5, 0.699999988079, 0.600000023842, 0.20000000298, 0.800000011921, 0.40000000596, 0.5, 0.300000011921, 0.40000000596, 0.699999988079, 0.300000011921, 0.800000011921, 0.20000000298, 0.600000023842, 0.20000000298, 0.600000023842, 0.10000000149, 0.800000011921, 0.699999988079, 0.20000000298, 0.300000011921, 0.5, 0.300000011921, 0.300000011921, 0.300000011921, 0.899999976158, 0.10000000149, 0.699999988079, 0.600000023842, 0.5, 0.10000000149, 0.5, 0.800000011921, 0.300000011921, 0.10000000149, 0.300000011921, 0.300000011921, 0.699999988079, 0.40000000596, 
+
+L3_cSYRK_C_nn
+0.300000011921, 0.699999988079, 0.20000000298, 0.699999988079, 0.699999988079, 0.800000011921, 0.40000000596, 0.600000023842, 0.10000000149, 0.40000000596, 0.600000023842, 0.800000011921, 0.40000000596, 0.5, 0.300000011921, 0.800000011921, 0.10000000149, 0.600000023842, 0.800000011921, 0.300000011921, 0.699999988079, 0.20000000298, 0.899999976158, 0.40000000596, 0.699999988079, 0.10000000149, 0.899999976158, 0.800000011921, 0.300000011921, 0.600000023842, 0.40000000596, 0.40000000596, 0.5, 0.899999976158, 0.20000000298, 0.699999988079, 0.10000000149, 0.40000000596, 0.300000011921, 0.300000011921, 0.699999988079, 0.20000000298, 0.800000011921, 0.5, 0.300000011921, 0.300000011921, 0.40000000596, 0.5, 0.10000000149, 0.20000000298, 0.699999988079, 0.899999976158, 0.899999976158, 0.899999976158, 0.40000000596, 0.10000000149, 0.600000023842, 0.5, 0.300000011921, 0.800000011921, 0.40000000596, 0.40000000596, 0.899999976158, 0.600000023842, 0.5, 0.699999988079, 0.699999988079, 0.5, 0.699999988079, 0.800000011921, 0.300000011921, 0.300000011921, 0.800000011921, 0.5, 0.300000011921, 0.5, 0.899999976158, 0.40000000596, 0.800000011921, 0.899999976158, 0.300000011921, 0.10000000149, 0.40000000596, 0.5, 0.300000011921, 0.40000000596, 0.5, 0.300000011921, 0.20000000298, 0.5, 0.600000023842, 0.899999976158, 0.10000000149, 0.300000011921, 0.600000023842, 0.800000011921, 0.40000000596, 0.300000011921, 0.10000000149, 0.5, 0.20000000298, 0.20000000298, 0.40000000596, 0.600000023842, 0.699999988079, 0.20000000298, 0.300000011921, 0.5, 0.600000023842, 0.10000000149, 0.600000023842, 0.40000000596, 0.5, 0.40000000596, 0.899999976158, 0.10000000149, 0.699999988079, 0.899999976158, 0.800000011921, 0.10000000149, 0.300000011921, 0.699999988079, 0.10000000149, 0.899999976158, 0.600000023842, 0.300000011921, 0.40000000596, 0.5, 0.600000023842, 0.10000000149, 0.40000000596, 0.20000000298, 0.899999976158, 0.20000000298, 0.40000000596, 0.10000000149, 0.10000000149, 0.40000000596, 0.800000011921, 0.5, 0.899999976158, 0.40000000596, 0.600000023842, 0.40000000596, 0.5, 0.300000011921, 0.600000023842, 0.5, 0.40000000596, 0.300000011921, 0.40000000596, 0.40000000596, 0.20000000298, 0.800000011921, 0.800000011921, 0.600000023842, 0.600000023842, 0.899999976158, 0.5, 0.10000000149, 0.300000011921, 0.600000023842, 0.600000023842, 0.20000000298, 0.40000000596, 0.800000011921, 0.600000023842, 0.40000000596, 0.10000000149, 0.10000000149, 0.600000023842, 0.800000011921, 0.300000011921, 0.300000011921, 0.800000011921, 0.899999976158, 0.5, 0.40000000596, 0.600000023842, 0.5, 0.899999976158, 0.600000023842, 0.300000011921, 0.600000023842, 0.699999988079, 0.5, 0.5, 0.800000011921, 0.20000000298, 0.20000000298, 0.300000011921, 0.10000000149, 0.699999988079, 0.10000000149, 0.20000000298, 0.20000000298, 0.5, 0.699999988079, 0.20000000298, 0.600000023842, 0.10000000149, 0.699999988079, 0.699999988079, 0.600000023842, 0.40000000596, 0.5, 0.40000000596, 0.5, 0.300000011921, 0.10000000149, 0.899999976158, 0.10000000149, 0.40000000596, 0.300000011921, 0.300000011921, 0.600000023842, 0.10000000149, 0.300000011921, 0.5, 0.600000023842, 0.899999976158, 0.5, 0.40000000596, 0.20000000298, 0.800000011921, 0.800000011921, 0.20000000298, 0.300000011921, 0.899999976158, 0.800000011921, 0.800000011921, 0.10000000149, 0.10000000149, 0.300000011921, 0.899999976158, 0.20000000298, 0.600000023842, 0.10000000149, 0.300000011921, 0.800000011921, 0.10000000149, 0.20000000298, 0.40000000596, 0.5, 0.699999988079, 0.899999976158, 0.40000000596, 0.40000000596, 0.699999988079, 0.5, 0.5, 0.600000023842, 0.10000000149, 0.800000011921, 0.800000011921, 0.699999988079, 0.699999988079, 0.5, 0.5, 0.899999976158, 0.10000000149, 0.800000011921, 0.899999976158, 0.20000000298, 0.20000000298, 0.40000000596, 0.899999976158, 0.20000000298, 0.699999988079, 0.899999976158, 0.899999976158, 0.800000011921, 0.10000000149, 0.600000023842, 0.699999988079, 0.899999976158, 0.300000011921, 0.40000000596, 0.800000011921, 0.10000000149, 0.20000000298, 0.800000011921, 0.5, 0.800000011921, 0.899999976158, 0.5, 0.800000011921, 0.699999988079, 0.5, 0.899999976158, 0.300000011921, 0.899999976158, 0.40000000596, 0.20000000298, 0.40000000596, 0.5, 0.899999976158, 0.5, 0.40000000596, 0.600000023842, 0.20000000298, 0.800000011921, 0.20000000298, 0.800000011921, 0.899999976158, 0.600000023842, 0.800000011921, 0.300000011921, 0.899999976158, 0.899999976158, 0.5, 0.300000011921, 0.300000011921, 0.699999988079, 0.800000011921, 0.600000023842, 0.20000000298, 0.20000000298, 0.40000000596, 0.20000000298, 0.699999988079, 0.5, 0.300000011921, 0.899999976158, 0.40000000596, 0.899999976158, 0.699999988079, 0.10000000149, 0.699999988079, 0.300000011921, 0.40000000596, 0.600000023842, 0.5, 0.800000011921, 0.10000000149, 0.800000011921, 0.10000000149, 0.5, 0.600000023842, 0.800000011921, 0.699999988079, 0.20000000298, 0.40000000596, 0.10000000149, 0.20000000298, 0.5, 0.10000000149, 0.899999976158, 0.600000023842, 0.899999976158, 0.300000011921, 0.10000000149, 0.800000011921, 0.800000011921, 0.5, 0.899999976158, 0.40000000596, 0.20000000298, 0.699999988079, 0.10000000149, 0.800000011921, 0.5, 0.899999976158, 0.899999976158, 0.20000000298, 0.5, 0.699999988079, 0.20000000298, 0.40000000596, 0.600000023842, 0.40000000596, 0.40000000596, 0.10000000149, 0.899999976158, 0.899999976158, 0.40000000596, 0.600000023842, 0.5, 0.600000023842, 0.899999976158, 0.600000023842, 0.300000011921, 0.5, 0.10000000149, 0.699999988079, 0.10000000149, 0.20000000298, 0.300000011921, 0.10000000149, 0.800000011921, 0.40000000596, 0.5, 0.699999988079, 0.300000011921, 0.899999976158, 0.899999976158, 0.10000000149, 0.10000000149, 0.600000023842, 0.20000000298, 0.699999988079, 0.40000000596, 0.10000000149, 0.600000023842, 0.5, 0.899999976158, 0.10000000149, 0.800000011921, 0.699999988079, 0.10000000149, 0.300000011921, 0.800000011921, 0.10000000149, 0.300000011921, 0.40000000596, 0.5, 0.300000011921, 0.600000023842, 0.20000000298, 0.20000000298, 0.899999976158, 0.800000011921, 0.899999976158, 0.20000000298, 0.899999976158, 0.5, 0.40000000596, 0.600000023842, 0.20000000298, 0.5, 0.600000023842, 0.20000000298, 0.40000000596, 0.800000011921, 0.10000000149, 0.20000000298, 0.600000023842, 0.20000000298, 0.5, 0.5, 0.800000011921, 0.699999988079, 0.899999976158, 0.800000011921, 0.40000000596, 0.40000000596, 0.600000023842, 0.800000011921, 0.600000023842, 0.10000000149, 0.600000023842, 0.20000000298, 0.5, 0.699999988079, 0.800000011921, 0.10000000149, 0.20000000298, 0.40000000596, 0.40000000596, 0.600000023842, 0.5, 0.800000011921, 0.699999988079, 0.20000000298, 0.699999988079, 0.40000000596, 0.10000000149, 0.20000000298, 0.899999976158, 0.699999988079, 0.5, 0.300000011921, 0.300000011921, 0.899999976158, 0.600000023842, 0.800000011921, 0.300000011921, 0.600000023842, 0.899999976158, 0.600000023842, 0.40000000596, 0.300000011921, 0.40000000596, 0.20000000298, 0.40000000596, 0.800000011921, 0.20000000298, 0.600000023842, 0.10000000149, 0.300000011921, 0.899999976158, 0.20000000298, 0.20000000298, 0.800000011921, 0.10000000149, 0.800000011921, 0.40000000596, 0.600000023842, 0.10000000149, 0.600000023842, 0.600000023842, 0.20000000298, 0.5, 0.300000011921, 0.20000000298, 0.800000011921, 0.800000011921, 0.699999988079, 0.5, 0.600000023842, 0.40000000596, 0.40000000596, 0.5, 0.699999988079, 0.10000000149, 0.5, 0.899999976158, 0.20000000298, 0.600000023842, 0.40000000596, 0.10000000149, 0.699999988079, 0.899999976158, 0.20000000298, 0.699999988079, 0.899999976158, 0.20000000298, 0.800000011921, 0.10000000149, 0.5, 0.40000000596, 0.40000000596, 0.5, 0.899999976158, 0.5, 0.5, 0.300000011921, 0.899999976158, 0.800000011921, 0.699999988079, 0.40000000596, 0.10000000149, 0.40000000596, 0.5, 0.5, 0.899999976158, 0.699999988079, 0.5, 0.20000000298, 0.20000000298, 0.40000000596, 0.10000000149, 0.10000000149, 0.10000000149, 0.699999988079, 0.600000023842, 0.600000023842, 0.10000000149, 0.899999976158, 0.800000011921, 0.899999976158, 0.600000023842, 0.600000023842, 0.800000011921, 0.10000000149, 0.899999976158, 0.10000000149, 0.800000011921, 0.800000011921, 0.699999988079, 0.600000023842, 0.800000011921, 0.5, 0.600000023842, 0.40000000596, 0.5, 0.10000000149, 0.20000000298, 
+
+L3_cSYRK_o_N
+3.07000007957, 9.07999997854, 2.4000000529, 9.34000008315, 1.03999997362, 9.07000017568, 2.71000000328, 9.05000000969, -0.139999984801, 8.4600000003, 2.24999998808, 10.8500000678, 2.14000003546, 9.83000006199, 1.49000001758, 8.01000012249, 1.55000002012, 9.1700000006, 2.39000008985, 8.31000006288, 2.89999992549, 9.96999990001, 2.99999999702, 7.68000001654, 0.900000044703, 9.07000003859, 3.65999993548, 9.43999998406, 1.9800000076, 8.70000013784, 2.56999992535, 10.200000114, 4.199999962, 7.9300000523, 2.4000000529, 9.34000008315, 1.18000013947, 8.92000017643, -0.109999980927, 8.55000020713, 1.77000002667, 8.49000008538, 0.909999978691, 9.839999993, 1.32000004455, 9.50000019297, 1.99000001535, 10.3500000916, 0.799999988824, 7.71000009418, 1.42000003561, 9.21000003159, 1.69000007346, 9.39000005409, 1.60999997869, 9.12000001177, 2.60999999732, 8.09000008762, -0.169999934286, 9.64000014126, 2.13000001878, 8.51000007406, 2.29999995157, 9.75000013039, 1.06000001296, 10.970000084, 3.30000004992, 7.40000011548, 1.03999997362, 9.07000017568, -0.109999980927, 8.55000020713, -0.220000104904, 7.58000022441, -0.550000030547, 8.11000009418, -0.730000087321, 8.07000009373, 0.509999933988, 10.2400001293, -0.370000074357, 9.3600001128, 0.179999972582, 8.09000013977, -0.350000010431, 7.37000010863, 0.430000021011, 8.30000016615, -0.700000080466, 8.76000000775, 0.739999998212, 8.35000010654, -1.29999997243, 8.48000012606, 0.829999938309, 8.81000007555, 0.939999921471, 8.52000015035, -0.270000160784, 9.610000121, 1.43999996915, 7.34000013009, 2.71000000328, 9.05000000969, 1.77000002667, 8.49000008538, -0.550000030547, 8.11000009418, 1.14999999404, 8.20000004023, -0.369999970794, 8.68999999151, 0.989999951273, 9.8100000681, 1.91999987915, 9.8300000903, 1.87999992117, 7.65000007972, 1.27999995172, 7.50000003129, 0.970000069141, 9.12000002146, 0.619999897033, 10.0599998677, 2.23999998257, 7.26000006363, -0.289999989271, 8.81000006214, 1.75999993771, 7.93000005826, 1.56999996036, 8.66000006661, 1.13999984026, 9.74000004217, 2.73999997139, 7.02000009, -0.139999984801, 8.4600000003, 0.909999978691, 9.839999993, -0.730000087321, 8.07000009373, -0.369999970794, 8.68999999151, -1.06000005692, 7.99999996722, -0.180000003129, 10.43999999, -0.490000026524, 9.20000002012, -0.460000012964, 8.33999997586, -0.380000002384, 8.69999994934, 0.440000073463, 9.2599999921, -0.340000010878, 9.70999986097, 0.819999979734, 7.59999996498, -0.820000054985, 9.41999997526, 0.229999971092, 8.589999917, 0.959999866933, 8.61000006139, -0.630000083596, 10.2599999563, 1.75999994889, 7.19000006005, 2.24999998808, 10.8500000678, 1.32000004455, 9.50000019297, 0.509999933988, 10.2400001293, 0.989999951273, 9.8100000681, -0.180000003129, 10.43999999, 1.20999997199, 11.4000001371, 0.989999979585, 11.6300000851, 0.0900000332296, 9.1900001502, 1.21999996856, 9.40000009611, 0.730000050813, 9.71000007555, 0.709999933243, 9.9599999921, 1.99999997243, 8.81000006884, -0.680000009835, 10.1300001, 1.43999996543, 9.97000000954, 0.989999976605, 10.6600001076, 0.39999987185, 12.120000046, 2.65999995336, 8.68000014544, 2.14000003546, 9.83000006199, 1.99000001535, 10.3500000916, -0.370000074357, 9.3600001128, 1.91999987915, 9.8300000903, -0.490000026524, 9.20000002012, 0.989999979585, 11.6300000851, 0.889999954998, 11.9800000843, 1.3499999322, 9.12000015408, 0.649999999255, 10.2800000113, 1.25000007153, 9.73000009701, 0.9399999699, 12.3499999262, 1.51000005171, 8.330000135, -0.500000032783, 10.3900000891, 2.10999999881, 9.84000001386, 1.25999990717, 9.42000016153, 1.17999980643, 11.7200000677, 3.1199999842, 7.96000013366, 1.49000001758, 8.01000012249, 0.799999988824, 7.71000009418, 0.179999972582, 8.09000013977, 1.87999992117, 7.65000007972, -0.460000012964, 8.33999997586, 0.0900000332296, 9.1900001502, 1.3499999322, 9.12000015408, 0.710000000298, 7.7800001961, 1.07999999493, 7.75000006035, 0.640000028759, 8.20000013113, 1.29999990836, 8.6999999918, 1.3199999924, 7.52000011757, -0.119999984205, 8.13000012159, 0.430000045598, 7.2100000912, 1.88999989316, 8.26000008747, 1.00999989748, 10.180000097, 2.13999997288, 7.05000016242, 1.55000002012, 9.1700000006, 1.42000003561, 9.21000003159, -0.350000010431, 7.37000010863, 1.27999995172, 7.50000003129, -0.380000002384, 8.69999994934, 1.21999996856, 9.40000009611, 0.649999999255, 10.2800000113, 1.07999999493, 7.75000006035, 0.539999983311, 7.87999995768, 0.260000056922, 8.61000002041, 0.17999994725, 8.56999994621, 1.78999999523, 7.67000001326, -0.0999999970198, 8.25000003204, 1.1799999629, 7.47000002891, 0.67999995172, 8.87000003338, 0.339999897629, 9.64999999404, 2.3699999477, 7.24000012338, 2.39000008985, 8.31000006288, 1.69000007346, 9.39000005409, 0.430000021011, 8.30000016615, 0.970000069141, 9.12000002146, 0.440000073463, 9.2599999921, 0.730000050813, 9.71000007555, 1.25000007153, 9.73000009701, 0.640000028759, 8.20000013113, 0.260000056922, 8.61000002041, 1.39000009805, 8.48000006348, 0.420000003576, 9.20999998763, 1.57000008702, 8.15000008792, -0.389999918491, 8.9900000973, 1.35000005811, 9.02999999791, 1.65999993697, 8.98000008881, 0.339999949038, 10.4400000772, 2.75000005811, 7.5800001052, 2.89999992549, 9.96999990001, 1.60999997869, 9.12000001177, -0.700000080466, 8.76000000775, 0.619999897033, 10.0599998677, -0.340000010878, 9.70999986097, 0.709999933243, 9.9599999921, 0.9399999699, 12.3499999262, 1.29999990836, 8.6999999918, 0.17999994725, 8.56999994621, 0.420000003576, 9.20999998763, 0.909999931753, 10.8399997821, 2.82999985933, 9.04999997243, -1.30999998242, 9.33999998704, 2.19999992028, 8.6299999249, 0.359999940693, 9.87000000507, 0.309999860227, 11.1199998985, 2.03999991849, 8.83999997213, 2.99999999702, 7.68000001654, 2.60999999732, 8.09000008762, 0.739999998212, 8.35000010654, 2.23999998257, 7.26000006363, 0.819999979734, 7.59999996498, 1.99999997243, 8.81000006884, 1.51000005171, 8.330000135, 1.3199999924, 7.52000011757, 1.78999999523, 7.67000001326, 1.57000008702, 8.15000008792, 2.82999985933, 9.04999997243, 1.79999999255, 6.80000003725, 1.20000002608, 8.33000006199, 2.41999993578, 7.21999999538, 1.51999996781, 7.84000016659, 2.0299999316, 9.82000006244, 2.72999998301, 6.55000011846, 0.900000044703, 9.07000003859, -0.169999934286, 9.64000014126, -1.29999997243, 8.48000012606, -0.289999989271, 8.81000006214, -0.820000054985, 9.41999997526, -0.680000009835, 10.1300001, -0.500000032783, 10.3900000891, -0.119999984205, 8.13000012159, -0.0999999970198, 8.25000003204, -0.389999918491, 8.9900000973, -1.30999998242, 9.33999998704, 1.20000002608, 8.33000006199, -1.48999996841, 9.14000002354, 0.150000009686, 8.78000003144, 0.459999977946, 8.5400000906, -0.850000011921, 10.2800000463, 1.31999997973, 8.00000009909, 3.65999993548, 9.43999998406, 2.13000001878, 8.51000007406, 0.829999938309, 8.81000007555, 1.75999993771, 7.93000005826, 0.229999971092, 8.589999917, 1.43999996543, 9.97000000954, 2.10999999881, 9.84000001386, 0.430000045598, 7.2100000912, 1.1799999629, 7.47000002891, 1.35000005811, 9.02999999791, 2.19999992028, 8.6299999249, 2.41999993578, 7.21999999538, 0.150000009686, 8.78000003144, 2.64999993742, 8.739999955, 1.64999995381, 8.47000004977, 1.63999988943, 10.2500000007, 3.64999997616, 8.06000010908, 1.9800000076, 8.70000013784, 2.29999995157, 9.75000013039, 0.939999921471, 8.52000015035, 1.56999996036, 8.66000006661, 0.959999866933, 8.61000006139, 0.989999976605, 10.6600001076, 1.25999990717, 9.42000016153, 1.88999989316, 8.26000008747, 0.67999995172, 8.87000003338, 1.65999993697, 8.98000008881, 0.359999940693, 9.87000000507, 1.51999996781, 7.84000016659, 0.459999977946, 8.5400000906, 1.64999995381, 8.47000004977, 2.48999982089, 8.70000016689, 2.08999981046, 11.0400000265, 2.84999997243, 7.45000016615, 2.56999992535, 10.200000114, 1.06000001296, 10.970000084, -0.270000160784, 9.610000121, 1.13999984026, 9.74000004217, -0.630000083596, 10.2599999563, 0.39999987185, 12.120000046, 1.17999980643, 11.7200000677, 1.00999989748, 10.180000097, 0.339999897629, 9.64999999404, 0.339999949038, 10.4400000772, 0.309999860227, 11.1199998985, 2.0299999316, 9.82000006244, -0.850000011921, 10.2800000463, 1.63999988943, 10.2500000007, 2.08999981046, 11.0400000265, 0.629999763966, 11.4000000522, 3.13999990061, 8.88000014395, 4.199999962, 7.9300000523, 3.30000004992, 7.40000011548, 1.43999996915, 7.34000013009, 2.73999997139, 7.02000009, 1.75999994889, 7.19000006005, 2.65999995336, 8.68000014544, 3.1199999842, 7.96000013366, 2.13999997288, 7.05000016242, 2.3699999477, 7.24000012338, 2.75000005811, 7.5800001052, 2.03999991849, 8.83999997213, 2.72999998301, 6.55000011846, 1.31999997973, 8.00000009909, 3.64999997616, 8.06000010908, 2.84999997243, 7.45000016615, 3.13999990061, 8.88000014395, 3.14999995381, 5.98000013202, 
+
+L3_cSYRK_A_kn
+0.800000011921, 0.20000000298, 0.20000000298, 0.899999976158, 0.699999988079, 0.899999976158, 0.40000000596, 0.20000000298, 0.20000000298, 0.300000011921, 0.600000023842, 0.600000023842, 0.20000000298, 0.20000000298, 0.600000023842, 0.5, 0.20000000298, 0.40000000596, 0.899999976158, 0.600000023842, 0.20000000298, 0.40000000596, 0.899999976158, 0.899999976158, 0.899999976158, 0.10000000149, 0.300000011921, 0.699999988079, 0.5, 0.5, 0.5, 0.800000011921, 0.899999976158, 0.899999976158, 0.20000000298, 0.300000011921, 0.800000011921, 0.300000011921, 0.300000011921, 0.5, 0.5, 0.5, 0.800000011921, 0.600000023842, 0.40000000596, 0.300000011921, 0.899999976158, 0.699999988079, 0.300000011921, 0.20000000298, 0.800000011921, 0.800000011921, 0.20000000298, 0.800000011921, 0.300000011921, 0.699999988079, 0.300000011921, 0.40000000596, 0.800000011921, 0.899999976158, 0.5, 0.40000000596, 0.699999988079, 0.699999988079, 0.800000011921, 0.5, 0.699999988079, 0.5, 0.300000011921, 0.899999976158, 0.600000023842, 0.699999988079, 0.40000000596, 0.600000023842, 0.899999976158, 0.40000000596, 0.5, 0.300000011921, 0.40000000596, 0.5, 0.20000000298, 0.300000011921, 0.600000023842, 0.800000011921, 0.899999976158, 0.300000011921, 0.800000011921, 0.20000000298, 0.5, 0.600000023842, 0.800000011921, 0.600000023842, 0.10000000149, 0.5, 0.600000023842, 0.899999976158, 0.10000000149, 0.899999976158, 0.600000023842, 0.10000000149, 0.300000011921, 0.800000011921, 0.899999976158, 0.800000011921, 0.5, 0.800000011921, 0.10000000149, 0.5, 0.699999988079, 0.600000023842, 0.10000000149, 0.5, 0.10000000149, 0.40000000596, 0.40000000596, 0.20000000298, 0.699999988079, 0.40000000596, 0.40000000596, 0.300000011921, 0.300000011921, 0.300000011921, 0.699999988079, 0.40000000596, 0.5, 0.10000000149, 0.600000023842, 0.10000000149, 0.10000000149, 0.40000000596, 0.5, 0.10000000149, 0.10000000149, 0.600000023842, 0.300000011921, 0.899999976158, 0.300000011921, 0.300000011921, 0.600000023842, 0.899999976158, 0.699999988079, 0.40000000596, 0.600000023842, 0.800000011921, 0.40000000596, 0.20000000298, 0.899999976158, 0.10000000149, 0.699999988079, 0.300000011921, 0.20000000298, 0.20000000298, 0.40000000596, 0.20000000298, 0.800000011921, 0.800000011921, 0.40000000596, 0.300000011921, 0.899999976158, 0.10000000149, 0.600000023842, 0.10000000149, 0.899999976158, 0.600000023842, 0.10000000149, 0.40000000596, 0.300000011921, 0.5, 0.40000000596, 0.800000011921, 0.800000011921, 0.5, 0.899999976158, 0.300000011921, 0.699999988079, 0.800000011921, 0.20000000298, 0.899999976158, 0.40000000596, 0.300000011921, 0.10000000149, 0.800000011921, 0.20000000298, 0.300000011921, 0.699999988079, 0.899999976158, 0.600000023842, 0.899999976158, 0.699999988079, 0.300000011921, 0.20000000298, 0.10000000149, 0.40000000596, 0.899999976158, 0.40000000596, 0.300000011921, 0.600000023842, 0.899999976158, 0.899999976158, 0.300000011921, 0.600000023842, 0.5, 0.300000011921, 0.40000000596, 0.300000011921, 0.5, 0.10000000149, 0.600000023842, 0.300000011921, 0.20000000298, 0.699999988079, 0.800000011921, 0.300000011921, 0.10000000149, 0.699999988079, 0.40000000596, 0.40000000596, 0.699999988079, 0.800000011921, 0.600000023842, 0.40000000596, 0.699999988079, 0.699999988079, 0.20000000298, 0.300000011921, 0.5, 0.40000000596, 0.899999976158, 0.20000000298, 0.899999976158, 0.800000011921, 0.20000000298, 0.20000000298, 0.899999976158, 0.40000000596, 0.300000011921, 0.40000000596, 0.5, 0.40000000596, 0.300000011921, 0.600000023842, 0.10000000149, 0.5, 0.600000023842, 0.899999976158, 0.800000011921, 0.899999976158, 0.600000023842, 0.10000000149, 0.800000011921, 0.20000000298, 0.20000000298, 0.300000011921, 0.10000000149, 0.5, 0.20000000298, 0.699999988079, 0.10000000149, 0.5, 0.20000000298, 0.40000000596, 0.5, 0.5, 0.5, 0.600000023842, 0.40000000596, 0.300000011921, 0.800000011921, 0.699999988079, 0.300000011921, 0.899999976158, 0.300000011921, 0.699999988079, 0.800000011921, 0.40000000596, 0.20000000298, 0.5, 0.5, 0.40000000596, 0.699999988079, 0.600000023842, 0.899999976158, 0.10000000149, 0.699999988079, 0.10000000149, 0.899999976158, 0.899999976158, 0.600000023842, 0.300000011921, 0.5, 0.40000000596, 0.20000000298, 0.10000000149, 0.899999976158, 0.600000023842, 0.5, 0.10000000149, 0.899999976158, 0.600000023842, 0.800000011921, 0.699999988079, 0.20000000298, 0.800000011921, 0.10000000149, 0.699999988079, 0.600000023842, 0.5, 0.5, 0.300000011921, 0.300000011921, 0.800000011921, 0.600000023842, 0.10000000149, 0.5, 0.40000000596, 0.10000000149, 0.40000000596, 0.699999988079, 0.699999988079, 0.899999976158, 0.899999976158, 0.40000000596, 0.600000023842, 0.10000000149, 0.10000000149, 0.300000011921, 0.10000000149, 0.10000000149, 0.300000011921, 0.40000000596, 0.20000000298, 0.5, 0.10000000149, 0.5, 0.800000011921, 0.10000000149, 0.10000000149, 0.600000023842, 0.20000000298, 0.20000000298, 0.20000000298, 0.5, 0.800000011921, 0.600000023842, 0.600000023842, 0.800000011921, 0.20000000298, 0.40000000596, 0.899999976158, 0.800000011921, 0.899999976158, 0.800000011921, 0.5, 0.800000011921, 0.20000000298, 0.600000023842, 0.600000023842, 0.40000000596, 0.40000000596, 0.800000011921, 0.5, 0.800000011921, 0.20000000298, 0.300000011921, 0.800000011921, 0.699999988079, 0.40000000596, 0.699999988079, 0.10000000149, 0.10000000149, 0.10000000149, 0.600000023842, 0.600000023842, 0.899999976158, 0.699999988079, 0.20000000298, 0.600000023842, 0.300000011921, 0.600000023842, 0.600000023842, 0.600000023842, 0.600000023842, 0.20000000298, 0.600000023842, 0.600000023842, 0.899999976158, 0.5, 0.800000011921, 0.5, 0.40000000596, 0.899999976158, 0.40000000596, 0.899999976158, 0.699999988079, 0.20000000298, 0.300000011921, 0.10000000149, 0.20000000298, 0.300000011921, 0.699999988079, 0.800000011921, 0.699999988079, 0.5, 0.40000000596, 0.800000011921, 0.600000023842, 0.300000011921, 0.10000000149, 0.5, 0.40000000596, 0.20000000298, 0.800000011921, 0.10000000149, 0.20000000298, 0.10000000149, 0.899999976158, 0.699999988079, 0.40000000596, 0.20000000298, 0.5, 0.20000000298, 0.10000000149, 0.10000000149, 0.40000000596, 0.300000011921, 0.300000011921, 0.600000023842, 0.699999988079, 0.300000011921, 0.20000000298, 0.5, 0.800000011921, 0.600000023842, 0.5, 0.800000011921, 0.800000011921, 0.600000023842, 0.300000011921, 0.5, 0.800000011921, 0.300000011921, 0.300000011921, 0.300000011921, 0.10000000149, 0.40000000596, 0.899999976158, 0.5, 0.20000000298, 0.10000000149, 0.899999976158, 0.600000023842, 0.699999988079, 0.40000000596, 0.800000011921, 0.20000000298, 0.20000000298, 0.10000000149, 0.699999988079, 0.10000000149, 0.300000011921, 0.600000023842, 0.800000011921, 0.600000023842, 0.20000000298, 0.10000000149, 0.699999988079, 0.20000000298, 0.600000023842, 0.800000011921, 0.899999976158, 0.20000000298, 0.20000000298, 0.20000000298, 0.5, 0.800000011921, 0.5, 0.5, 0.600000023842, 0.699999988079, 0.899999976158, 0.600000023842, 0.20000000298, 0.699999988079, 0.600000023842, 0.300000011921, 0.5, 0.600000023842, 0.40000000596, 0.899999976158, 0.10000000149, 0.699999988079, 0.699999988079, 0.699999988079, 0.300000011921, 0.40000000596, 0.300000011921, 0.300000011921, 0.600000023842, 0.40000000596, 0.300000011921, 0.20000000298, 0.300000011921, 0.800000011921, 0.699999988079, 0.10000000149, 0.40000000596, 0.10000000149, 0.899999976158, 0.5, 0.40000000596, 0.600000023842, 0.40000000596, 0.5, 0.20000000298, 0.40000000596, 0.800000011921, 0.40000000596, 0.10000000149, 0.20000000298, 0.5, 0.300000011921, 0.20000000298, 0.40000000596, 0.40000000596, 0.800000011921, 0.699999988079, 0.10000000149, 0.600000023842, 0.20000000298, 0.600000023842, 0.300000011921, 0.600000023842, 0.600000023842, 0.5, 0.5, 0.800000011921, 0.20000000298, 0.20000000298, 0.20000000298, 0.300000011921, 0.600000023842, 0.10000000149, 0.699999988079, 0.20000000298, 
+
+L3_cSYRK_o_T
+0.949999980628, 8.2800001052, 0.210000005513, 8.81000012174, 0.789999962449, 8.64000018373, -0.250000049174, 9.08000008509, -0.0800000098348, 7.410000121, -0.39999993816, 8.23000010744, 0.109999996573, 6.85000005662, 0.979999960661, 9.41000010163, 0.76999998495, 7.81000015602, 2.26999994993, 7.61000017092, -0.240000042915, 6.03000011861, 1.20000000596, 8.12000012428, 0.390000051111, 6.7500001274, 0.480000086576, 9.60000014827, 1.04000000194, 6.5100001277, 0.839999994487, 7.62000018835, 0.449999999255, 8.43000007913, 0.210000005513, 8.81000012174, -1.05999982446, 8.90000014305, 0.290000062287, 9.05000018403, -0.759999983907, 9.25000008792, 1.07000004753, 8.4300001812, -0.769999973774, 9.20000013486, 0.979999950975, 7.91000007629, -0.429999985993, 8.66000009269, 1.87000000656, 8.60000009388, 0.669999984205, 10.0900001413, -0.379999993443, 7.14000016734, -0.279999887645, 8.65000002235, 0.140000074953, 9.07000014812, -0.729999799728, 10.7900000943, 0.679999988973, 6.95000016019, -0.599999918789, 7.91000015751, -0.309999907911, 9.25000009984, 0.789999962449, 8.64000018373, 0.290000062287, 9.05000018403, 0.0199999529123, 9.30000021011, -0.760000033081, 8.99000013456, 0.569999926835, 7.77000018463, -0.440000024289, 9.02000013918, -0.230000038892, 7.12000011757, 0.23999996841, 9.23000015065, 0.540000033975, 7.73000020206, 0.839999893159, 8.66000018135, -1.06000002339, 6.48000018269, -0.0499999806285, 8.87000006393, -0.869999998361, 8.25000014603, -0.189999892414, 9.88000017896, 0.259999954849, 7.00000010505, -0.430000030696, 8.4300002408, -0.199999983609, 8.71000009269, -0.250000049174, 9.08000008509, -0.759999983907, 9.25000008792, -0.760000033081, 8.99000013456, -1.5400000459, 9.02000012577, -0.530000036657, 8.59000009954, -1.86999999017, 8.19000008836, 0.0399999386072, 7.09000006005, -0.040000025034, 9.27000003189, 0.819999961853, 7.8500001438, 0.149999944866, 9.33000012904, -0.860000056177, 7.78000011042, -0.669999914914, 7.99000006005, -1.50999992952, 8.26000007257, -1.23999987081, 10.4200001042, -1.06000002861, 8.18999995947, -0.300000059605, 7.88000013128, -0.530000068694, 9.0100000532, -0.0800000098348, 7.410000121, 1.07000004753, 8.4300001812, 0.569999926835, 7.77000018463, -0.530000036657, 8.59000009954, 0.749999932945, 8.0600001657, -0.710000037551, 7.89000013381, -3.2037498876e-08, 6.73000008136, -0.109999992847, 7.62000012055, 0.839999973625, 7.46000019327, 1.00999995261, 8.19000018671, -0.349999984354, 6.96000010908, 0.220000010282, 7.05000013262, -0.519999961108, 8.25000014901, 0.27000011757, 9.12000015929, 0.679999966621, 6.99000007793, 0.659999983907, 7.48000019386, 0.429999988973, 8.28000010446, -0.39999993816, 8.23000010744, -0.769999973774, 9.20000013486, -0.440000024289, 9.02000013918, -1.86999999017, 8.19000008836, -0.710000037551, 7.89000013381, -0.930000063479, 7.76000015974, -0.54999999553, 7.19000006378, -0.720000002086, 8.5400000906, 0.329999990463, 8.02000012949, 0.0099999473989, 9.05000011697, -0.970000003576, 6.23000015661, -0.840000025779, 6.89000011593, -1.41999993578, 7.42000010341, -1.28999991477, 9.79000014797, -1.14000000045, 7.44000006303, -1.66000003085, 8.41000015751, -0.220000008792, 9.15000009537, 0.109999996573, 6.85000005662, 0.979999950975, 7.91000007629, -0.230000038892, 7.12000011757, 0.0399999386072, 7.09000006005, -3.2037498876e-08, 6.73000008136, -0.54999999553, 7.19000006378, -0.560000046492, 6.75999996603, 0.449999912083, 7.89000000641, 1.41999994397, 7.07000009149, 0.159999942929, 7.20000006482, -0.449999964982, 5.90000009388, -0.249999984354, 5.94000008985, -0.58999990806, 7.21000003904, 0.370000016987, 7.61000005618, -0.0800000083447, 6.26999997526, 0.449999926984, 7.26000007629, 0.389999996722, 6.99000000939, 0.979999960661, 9.41000010163, -0.429999985993, 8.66000009269, 0.23999996841, 9.23000015065, -0.040000025034, 9.27000003189, -0.109999992847, 7.62000012055, -0.720000002086, 8.5400000906, 0.449999912083, 7.89000000641, 0.739999944568, 10.1600000882, 1.23000000611, 8.37000010341, 1.17999992266, 8.28000014916, -0.660000056922, 7.50000010803, -0.379999919683, 8.92000010267, -0.310000009984, 7.90000005439, -0.98999985218, 9.84000011072, 1.39999991432, 6.87000006244, 0.680000030696, 8.25000014752, 0.709999949634, 9.13000010669, 0.76999998495, 7.81000015602, 1.87000000656, 8.60000009388, 0.540000033975, 7.73000020206, 0.819999961853, 7.8500001438, 0.839999973625, 7.46000019327, 0.329999990463, 8.02000012949, 1.41999994397, 7.07000009149, 1.23000000611, 8.37000010341, 1.72999999195, 7.52000013024, 1.36999990597, 8.10000009164, -0.100000018626, 5.79000016585, -0.00999992877245, 7.09000015318, 0.230000067204, 7.72000009149, 0.890000088364, 9.280000135, 0.490000030249, 7.40000000224, 0.830000001639, 8.1200002189, 1.12999998972, 8.08000014395, 2.26999994993, 7.61000017092, 0.669999984205, 10.0900001413, 0.839999893159, 8.66000018135, 0.149999944866, 9.33000012904, 1.00999995261, 8.19000018671, 0.0099999473989, 9.05000011697, 0.159999942929, 7.20000006482, 1.17999992266, 8.28000014916, 1.36999990597, 8.10000009164, 1.39999985695, 9.32000014067, 0.389999950528, 6.27000018165, 1.29999993891, 8.450000076, 0.100000011921, 8.77000015557, 1.11000006512, 10.9400000958, 0.549999943376, 7.86000006512, 0.209999930263, 8.18000018418, 1.04999997169, 9.63000015885, -0.240000042915, 6.03000011861, -0.379999993443, 7.14000016734, -1.06000002339, 6.48000018269, -0.860000056177, 7.78000011042, -0.349999984354, 6.96000010908, -0.970000003576, 6.23000015661, -0.449999964982, 5.90000009388, -0.660000056922, 7.50000010803, -0.100000018626, 5.79000016585, 0.389999950528, 6.27000018165, -0.760000004768, 5.22000016004, 0.119999974519, 6.81000013888, -1.40999990642, 6.26000014186, -0.379999939054, 7.29000016138, -0.709999989122, 5.41000006586, -0.450000012666, 6.31000018358, -0.949999977648, 7.92000004902, 1.20000000596, 8.12000012428, -0.279999887645, 8.65000002235, -0.0499999806285, 8.87000006393, -0.669999914914, 7.99000006005, 0.220000010282, 7.05000013262, -0.840000025779, 6.89000011593, -0.249999984354, 5.94000008985, -0.379999919683, 8.92000010267, -0.00999992877245, 7.09000015318, 1.29999993891, 8.450000076, 0.119999974519, 6.81000013888, -0.769999900758, 7.82000006318, -0.389999926686, 7.05000008419, -0.419999881387, 9.59000013456, -0.749999950081, 7.45000004098, 0.0900000585616, 8.25000008345, -0.109999983907, 9.53000002325, 0.390000051111, 6.7500001274, 0.140000074953, 9.07000014812, -0.869999998361, 8.25000014603, -1.50999992952, 8.26000007257, -0.519999961108, 8.25000014901, -1.41999993578, 7.42000010341, -0.58999990806, 7.21000003904, -0.310000009984, 7.90000005439, 0.230000067204, 7.72000009149, 0.100000011921, 8.77000015557, -1.40999990642, 6.26000014186, -0.389999926686, 7.05000008419, -1.11999979645, 7.54000008017, -1.21999985531, 9.08000013351, -0.179999889135, 6.4400000295, 0.100000017136, 8.58000016034, 0.8400000377, 9.27000001326, 0.480000086576, 9.60000014827, -0.729999799728, 10.7900000943, -0.189999892414, 9.88000017896, -1.23999987081, 10.4200001042, 0.27000011757, 9.12000015929, -1.28999991477, 9.79000014797, 0.370000016987, 7.61000005618, -0.98999985218, 9.84000011072, 0.890000088364, 9.280000135, 1.11000006512, 10.9400000958, -0.379999939054, 7.29000016138, -0.419999881387, 9.59000013456, -1.21999985531, 9.08000013351, 0.0700002688169, 12.3000001565, -0.0299999114871, 8.460000083, -0.459999866933, 9.72000015035, -0.0899998566508, 10.2400001331, 1.04000000194, 6.5100001277, 0.679999988973, 6.95000016019, 0.259999954849, 7.00000010505, -1.06000002861, 8.18999995947, 0.679999966621, 6.99000007793, -1.14000000045, 7.44000006303, -0.0800000083447, 6.26999997526, 1.39999991432, 6.87000006244, 0.490000030249, 7.40000000224, 0.549999943376, 7.86000006512, -0.709999989122, 5.41000006586, -0.749999950081, 7.45000004098, -0.179999889135, 6.4400000295, -0.0299999114871, 8.460000083, 0.130000030696, 5.5200000602, 1.22999999791, 7.5000001274, 0.249999992549, 7.21000004128, 0.839999994487, 7.62000018835, -0.599999918789, 7.91000015751, -0.430000030696, 8.4300002408, -0.300000059605, 7.88000013128, 0.659999983907, 7.48000019386, -1.66000003085, 8.41000015751, 0.449999926984, 7.26000007629, 0.680000030696, 8.25000014752, 0.830000001639, 8.1200002189, 0.209999930263, 8.18000018418, -0.450000012666, 6.31000018358, 0.0900000585616, 8.25000008345, 0.100000017136, 8.58000016034, -0.459999866933, 9.72000015035, 1.22999999791, 7.5000001274, -0.0199999782443, 6.16000018656, 0.289999990761, 7.8000001736, 0.449999999255, 8.43000007913, -0.309999907911, 9.25000009984, -0.199999983609, 8.71000009269, -0.530000068694, 9.0100000532, 0.429999988973, 8.28000010446, -0.220000008792, 9.15000009537, 0.389999996722, 6.99000000939, 0.709999949634, 9.13000010669, 1.12999998972, 8.08000014395, 1.04999997169, 9.63000015885, -0.949999977648, 7.92000004902, -0.109999983907, 9.53000002325, 0.8400000377, 9.27000001326, -0.0899998566508, 10.2400001331, 0.249999992549, 7.21000004128, 0.289999990761, 7.8000001736, -0.160000004768, 9.08000005454, 
+
+L3_zSYRK_A_nk
+0.5, 0.7, 0.8, 0.2, 0.4, 0.8, 0.2, 0.1, 0.4, 0.6, 0.2, 0.5, 0.7, 0.7, 0.8, 0.1, 0.1, 0.6, 0.8, 0.8, 0.3, 0.9, 0.9, 0.1, 0.4, 0.8, 0.6, 0.6, 0.2, 0.4, 0.2, 0.3, 0.2, 0.2, 0.5, 0.5, 0.6, 0.7, 0.8, 0.9, 0.5, 0.1, 0.7, 0.1, 0.9, 0.7, 0.1, 0.1, 0.5, 0.6, 0.8, 0.8, 0.6, 0.2, 0.7, 0.1, 0.2, 0.6, 0.3, 0.6, 0.1, 0.7, 0.8, 0.4, 0.5, 0.7, 0.1, 0.3, 0.9, 0.2, 0.4, 0.6, 0.2, 0.9, 0.2, 0.7, 0.9, 0.2, 0.2, 0.8, 0.5, 0.8, 0.6, 0.4, 0.8, 0.3, 0.6, 0.5, 0.9, 0.8, 0.6, 0.5, 0.8, 0.5, 0.4, 0.7, 0.4, 0.8, 0.9, 0.9, 0.3, 0.6, 0.5, 0.9, 0.8, 0.3, 0.7, 0.5, 0.1, 0.6, 0.2, 0.5, 0.5, 0.6, 0.3, 0.1, 0.2, 0.9, 0.8, 0.7, 0.8, 0.2, 0.9, 0.4, 0.1, 0.5, 0.2, 0.1, 0.6, 0.8, 0.3, 0.3, 0.8, 0.3, 0.3, 0.6, 0.5, 0.5, 0.6, 0.8, 0.8, 0.4, 0.6, 0.2, 0.4, 0.3, 0.2, 0.5, 0.3, 0.1, 0.5, 0.9, 0.6, 0.8, 0.3, 0.6, 0.2, 0.1, 0.7, 0.9, 0.6, 0.4, 0.4, 0.3, 0.3, 0.1, 0.3, 0.8, 0.2, 0.4, 0.2, 0.9, 0.1, 0.7, 0.3, 0.7, 0.2, 0.4, 0.8, 0.9, 0.4, 0.4, 0.4, 0.5, 0.8, 0.8, 0.9, 0.8, 0.8, 0.5, 0.4, 0.7, 0.3, 0.4, 0.1, 0.9, 0.7, 0.4, 0.5, 0.4, 0.9, 0.7, 0.9, 0.5, 0.1, 0.1, 0.9, 0.9, 0.4, 0.2, 0.3, 0.4, 0.8, 0.4, 0.6, 0.3, 0.1, 0.2, 0.1, 0.8, 0.7, 0.3, 0.3, 0.3, 0.2, 0.9, 0.4, 0.3, 0.4, 0.1, 0.2, 0.9, 0.2, 0.1, 0.6, 0.6, 0.1, 0.7, 0.7, 0.6, 0.5, 0.6, 0.7, 0.7, 0.8, 0.5, 0.4, 0.7, 0.3, 0.2, 0.7, 0.6, 0.8, 0.3, 0.4, 0.5, 0.2, 0.7, 0.2, 0.5, 0.6, 0.4, 0.2, 0.9, 0.9, 0.4, 0.4, 0.1, 0.7, 0.4, 0.9, 0.6, 0.2, 0.2, 0.4, 0.8, 0.4, 0.5, 0.1, 0.6, 0.5, 0.8, 0.5, 0.7, 0.8, 0.3, 0.4, 0.6, 0.8, 0.3, 0.3, 0.7, 0.3, 0.2, 0.5, 0.3, 0.9, 0.7, 0.2, 0.1, 0.6, 0.7, 0.6, 0.9, 0.3, 0.7, 0.8, 0.7, 0.1, 0.5, 0.6, 0.6, 0.7, 0.5, 0.7, 0.5, 0.1, 0.6, 0.5, 0.2, 0.7, 0.5, 0.2, 0.9, 0.5, 0.6, 0.4, 0.3, 0.2, 0.8, 0.8, 0.9, 0.2, 0.1, 0.7, 0.7, 0.7, 0.4, 0.2, 0.5, 0.9, 0.6, 0.5, 0.2, 0.8, 0.4, 0.7, 0.1, 0.2, 0.7, 0.9, 0.9, 0.8, 0.1, 0.6, 0.7, 0.8, 0.6, 0.2, 0.1, 0.8, 0.6, 0.7, 0.4, 0.6, 0.2, 0.4, 0.8, 0.1, 0.8, 0.3, 0.1, 0.6, 0.9, 0.8, 0.3, 0.3, 0.4, 0.5, 0.1, 0.9, 0.6, 0.6, 0.5, 0.5, 0.4, 0.8, 0.4, 0.1, 0.4, 0.1, 0.6, 0.6, 0.9, 0.8, 0.4, 0.3, 0.8, 0.6, 0.3, 0.5, 0.1, 0.2, 0.3, 0.2, 0.4, 0.9, 0.2, 0.5, 0.5, 0.6, 0.7, 0.6, 0.2, 0.1, 0.8, 0.8, 0.4, 0.8, 0.6, 0.3, 0.5, 0.3, 0.6, 0.4, 0.9, 0.8, 0.7, 0.9, 0.3, 0.5, 0.9, 0.2, 0.8, 0.7, 0.9, 0.2, 0.9, 0.7, 0.6, 0.6, 0.1, 0.1, 0.8, 0.5, 0.3, 0.3, 0.3, 0.3, 0.4, 0.2, 0.3, 0.3, 0.7, 0.8, 0.8, 0.4, 0.4, 0.3, 0.8, 0.3, 0.2, 0.1, 0.3, 0.6, 0.5, 0.8, 0.7, 0.6, 0.7, 0.9, 0.3, 0.4, 0.4, 0.6, 0.6, 0.2, 0.2, 0.1, 0.7, 0.1, 0.2, 0.3, 0.8, 0.8, 0.3, 0.1, 0.4, 0.8, 0.9, 0.3, 0.2, 0.3, 0.5, 0.8, 0.3, 0.8, 0.7, 0.3, 0.6, 0.2, 0.8, 0.7, 0.7, 0.5, 0.1, 0.8, 0.8, 0.4, 0.9, 0.1, 0.8, 0.9, 0.8, 0.7, 0.4, 0.3, 0.5, 0.1, 0.4, 0.7, 0.4, 0.1, 0.1, 0.1, 0.9, 0.7, 0.9, 0.7, 0.8, 0.4, 0.5, 0.9, 0.3, 0.5, 0.3, 0.7, 0.5, 0.9, 0.7, 0.2, 0.6, 0.1, 0.2, 
+
+L3_zSYRK_C_nn
+0.1, 0.5, 0.3, 0.9, 0.1, 0.7, 0.4, 0.9, 0.7, 0.4, 0.2, 0.4, 0.3, 0.5, 0.6, 0.8, 0.2, 0.9, 0.4, 0.8, 0.5, 0.1, 0.8, 0.1, 0.1, 0.4, 0.3, 0.4, 0.7, 0.3, 0.1, 0.9, 0.6, 0.7, 0.3, 0.9, 0.2, 0.4, 0.5, 0.5, 0.7, 0.7, 0.1, 0.8, 0.3, 0.9, 0.6, 0.6, 0.1, 0.4, 0.4, 0.3, 0.9, 0.7, 0.1, 0.3, 0.4, 0.3, 0.7, 0.9, 0.2, 0.2, 0.5, 0.7, 0.5, 0.6, 0.2, 0.9, 0.1, 0.7, 0.5, 0.5, 0.8, 0.9, 0.1, 0.6, 0.8, 0.1, 0.7, 0.3, 0.8, 0.9, 0.5, 0.8, 0.6, 0.4, 0.6, 0.6, 0.4, 0.2, 0.2, 0.3, 0.8, 0.6, 0.8, 0.5, 0.9, 0.2, 0.1, 0.4, 0.6, 0.6, 0.4, 0.9, 0.7, 0.7, 0.1, 0.6, 0.5, 0.7, 0.8, 0.2, 0.9, 0.3, 0.9, 0.5, 0.4, 0.3, 0.6, 0.4, 0.4, 0.5, 0.7, 0.2, 0.6, 0.2, 0.9, 0.1, 0.4, 0.1, 0.1, 0.3, 0.9, 0.5, 0.2, 0.5, 0.7, 0.4, 0.1, 0.8, 0.8, 0.1, 0.8, 0.2, 0.7, 0.3, 0.3, 0.5, 0.1, 0.8, 0.5, 0.1, 0.3, 0.2, 0.9, 0.5, 0.8, 0.7, 0.2, 0.7, 0.9, 0.8, 0.2, 0.2, 0.1, 0.8, 0.5, 0.2, 0.8, 0.1, 0.2, 0.4, 0.3, 0.9, 0.7, 0.3, 0.9, 0.3, 0.3, 0.5, 0.2, 0.8, 0.9, 0.1, 0.4, 0.2, 0.4, 0.5, 0.4, 0.2, 0.7, 0.4, 0.4, 0.3, 0.2, 0.1, 0.9, 0.7, 0.8, 0.2, 0.3, 0.3, 0.9, 0.8, 0.3, 0.5, 0.6, 0.6, 0.8, 0.9, 0.9, 0.5, 0.1, 0.8, 0.9, 0.1, 0.5, 0.6, 0.7, 0.8, 0.4, 0.2, 0.8, 0.3, 0.5, 0.9, 0.6, 0.1, 0.5, 0.7, 0.2, 0.2, 0.7, 0.1, 0.9, 0.6, 0.7, 0.7, 0.6, 0.8, 0.1, 0.4, 0.5, 0.8, 0.4, 0.3, 0.5, 0.1, 0.4, 0.2, 0.7, 0.8, 0.4, 0.3, 0.1, 0.3, 0.4, 0.5, 0.3, 0.3, 0.2, 0.9, 0.9, 0.7, 0.4, 0.8, 0.6, 0.3, 0.1, 0.5, 0.8, 0.4, 0.2, 0.9, 0.4, 0.3, 0.6, 0.4, 0.6, 0.4, 0.3, 0.2, 0.4, 0.5, 0.4, 0.2, 0.1, 0.3, 0.5, 0.7, 0.6, 0.1, 0.4, 0.2, 0.2, 0.3, 0.4, 0.8, 0.8, 0.7, 0.7, 0.1, 0.9, 0.6, 0.8, 0.4, 0.4, 0.8, 0.9, 0.7, 0.6, 0.6, 0.4, 0.5, 0.9, 0.5, 0.4, 0.2, 0.8, 0.3, 0.4, 0.5, 0.6, 0.1, 0.2, 0.5, 0.1, 0.9, 0.6, 0.5, 0.6, 0.3, 0.6, 0.9, 0.8, 0.4, 0.4, 0.7, 0.5, 0.1, 0.5, 0.1, 0.1, 0.3, 0.4, 0.2, 0.7, 0.2, 0.8, 0.7, 0.7, 0.4, 0.5, 0.9, 0.3, 0.3, 0.4, 0.2, 0.1, 0.9, 0.8, 0.4, 0.6, 0.7, 0.9, 0.4, 0.4, 0.2, 0.5, 0.8, 0.4, 0.8, 0.7, 0.9, 0.8, 0.1, 0.4, 0.3, 0.2, 0.3, 0.6, 0.2, 0.2, 0.7, 0.4, 0.3, 0.6, 0.1, 0.2, 0.9, 0.2, 0.3, 0.6, 0.5, 0.6, 0.7, 0.8, 0.1, 0.3, 0.2, 0.3, 0.3, 0.6, 0.1, 0.5, 0.1, 0.1, 0.2, 0.1, 0.4, 0.7, 0.9, 0.8, 0.6, 0.9, 0.1, 0.9, 0.8, 0.2, 0.1, 0.5, 0.7, 0.9, 0.7, 0.4, 0.8, 0.6, 0.3, 0.9, 0.4, 0.3, 0.2, 0.6, 0.9, 0.6, 0.1, 0.2, 0.5, 0.8, 0.9, 0.3, 0.3, 0.3, 0.4, 0.2, 0.2, 0.8, 0.5, 0.4, 0.1, 0.2, 0.2, 0.9, 0.7, 0.2, 0.2, 0.4, 0.8, 0.8, 0.7, 0.6, 0.9, 0.4, 0.2, 0.3, 0.3, 0.6, 0.1, 0.4, 0.5, 0.1, 0.9, 0.2, 0.3, 0.3, 0.4, 0.7, 0.3, 0.5, 0.7, 0.9, 0.2, 0.1, 0.3, 0.1, 0.8, 0.8, 0.2, 0.7, 0.1, 0.6, 0.3, 0.7, 0.1, 0.8, 0.4, 0.5, 0.8, 0.6, 0.1, 0.2, 0.5, 0.1, 0.9, 0.9, 0.3, 0.5, 0.5, 0.7, 0.5, 0.1, 0.9, 0.5, 0.6, 0.1, 0.4, 0.9, 0.5, 0.5, 0.2, 0.3, 0.3, 0.9, 0.6, 0.1, 0.5, 0.9, 0.6, 0.4, 0.7, 0.4, 0.8, 0.5, 0.1, 0.8, 0.9, 0.2, 0.3, 0.5, 0.5, 0.2, 0.9, 0.1, 0.5, 0.6, 0.7, 0.2, 0.9, 0.6, 0.6, 0.2, 0.5, 0.8, 0.1, 0.9, 0.8, 0.7, 0.7, 0.8, 0.4, 0.8, 0.4, 0.5, 0.1, 0.7, 0.9, 0.1, 0.2, 0.3, 0.3, 0.3, 0.4, 0.7, 0.5, 0.1, 0.5, 0.1, 0.6, 
+
+L3_zSYRK_o_N
+-0.69, 7.78, 0.26, 8.42, -0.3, 9.65, 0.06, 8.71, 0.33, 8.27, -0.98, 8.67, 0.27, 8.0, 0.04, 8.68, -0.58, 9.15, 0.54, 9.31, -0.1, 8.39, 1.46, 7.84, 0.03, 7.2, -0.29, 9.15, -0.21, 7.27, -0.7, 8.85, 0.28, 9.29, 0.26, 8.42, 1.04, 8.42, 1.3, 9.21, 0.75, 8.44, 0.77, 8.57, -0.9, 9.44, 1.56, 6.81, -0.15, 8.27, -0.25, 7.98, 1.29, 8.28, 0.9, 8.11, 2.07, 7.41, 0.71, 7.8, 0.47, 8.79, 0.68, 8.61, -0.22, 8.55, -0.39, 7.93, -0.3, 9.65, 1.3, 9.21, 0.81, 9.58, -0.67, 9.71, 0.19, 8.61, -0.53, 9.14, 0.53, 8.61, -0.12, 9.17, -0.06, 9.27, 0.2, 9.69, 0.05, 9.32, 1.02, 8.81, 0.17, 8.87, -0.37, 9.55, 0.37, 8.17, -0.81, 9.37, 0.18, 9.95, 0.06, 8.71, 0.75, 8.44, -0.67, 9.71, -0.19, 9.04, 0.34, 8.65, -0.09, 8.28, 0.37, 8.68, -1.0, 7.96, -0.71, 8.14, 0.19, 8.29, 0.38, 8.81, 0.83, 8.41, 1.47, 7.88, -0.93, 9.31, -0.47, 8.02, 0.01, 8.56, 0.04, 8.69, 0.33, 8.27, 0.77, 8.57, 0.19, 8.61, 0.34, 8.65, -0.24, 8.64, -1.78, 8.6, 0.4, 7.62, -0.83, 7.32, -0.58, 7.44, 1.21, 8.8, 0.96, 9.57, 1.78, 8.75, 0.32, 8.5, -0.22, 8.86, -1.19, 8.29, -0.09, 7.54, 0.59, 8.02, -0.98, 8.67, -0.9, 9.44, -0.53, 9.14, -0.09, 8.28, -1.78, 8.6, -1.92, 9.54, -0.28, 7.6, -1.18, 8.26, -1.56, 9.03, -0.58, 8.78, -0.24, 9.16, 0.71, 7.97, -0.95, 7.52, -1.16, 9.62, -0.83, 7.9, -1.51, 8.35, 0.05, 8.87, 0.27, 8.0, 1.56, 6.81, 0.53, 8.61, 0.37, 8.68, 0.4, 7.62, -0.28, 7.6, 1.47, 7.98, 1.03, 8.13, 0.52, 7.38, 0.37, 7.9, 0.51, 9.39, 1.86, 8.3, 0.78, 7.74, -0.98, 8.92, 0.36, 7.0, 0.53, 8.53, 0.67, 8.46, 0.04, 8.68, -0.15, 8.27, -0.12, 9.17, -1.0, 7.96, -0.83, 7.32, -1.18, 8.26, 1.03, 8.13, -0.65, 7.86, -1.03, 7.44, -0.5, 8.75, 0.5, 9.09, 1.19, 8.96, 0.71, 7.47, -1.25, 10.03, -0.46, 8.1, -0.82, 8.27, 0.18, 8.22, -0.58, 9.15, -0.25, 7.98, -0.06, 9.27, -0.71, 8.14, -0.58, 7.44, -1.56, 9.03, 0.52, 7.38, -1.03, 7.44, -0.35, 8.16, 0.03, 8.94, -0.09, 8.98, 1.27, 8.41, -0.32, 8.16, -0.55, 9.43, -0.95, 7.52, 0.08, 8.47, -0.07, 8.99, 0.54, 9.31, 1.29, 8.28, 0.2, 9.69, 0.19, 8.29, 1.21, 8.8, -0.58, 8.78, 0.37, 7.9, -0.5, 8.75, 0.03, 8.94, 0.18, 9.12, -0.01, 8.84, 1.02, 7.9, 0.67, 8.47, -0.4, 9.99, 0.83, 7.87, -0.73, 9.18, 0.1, 9.03, -0.1, 8.39, 0.9, 8.11, 0.05, 9.32, 0.38, 8.81, 0.96, 9.57, -0.24, 9.16, 0.51, 9.39, 0.5, 9.09, -0.09, 8.98, -0.01, 8.84, 0.78, 9.8, 0.76, 9.93, 0.84, 8.39, -0.89, 9.77, -0.31, 8.53, -0.68, 8.99, 1.35, 9.35, 1.46, 7.84, 2.07, 7.41, 1.02, 8.81, 0.83, 8.41, 1.78, 8.75, 0.71, 7.97, 1.86, 8.3, 1.19, 8.96, 1.27, 8.41, 1.02, 7.9, 0.76, 9.93, 2.34, 8.3, 1.7, 7.9, 0.52, 8.81, 0.68, 7.07, 0.22, 8.99, 0.84, 8.57, 0.03, 7.2, 0.71, 7.8, 0.17, 8.87, 1.47, 7.88, 0.32, 8.5, -0.95, 7.52, 0.78, 7.74, 0.71, 7.47, -0.32, 8.16, 0.67, 8.47, 0.84, 8.39, 1.7, 7.9, 0.82, 7.18, 0.45, 8.31, -0.46, 6.77, 0.3, 8.37, 0.64, 7.65, -0.29, 9.15, 0.47, 8.79, -0.37, 9.55, -0.93, 9.31, -0.22, 8.86, -1.16, 9.62, -0.98, 8.92, -1.25, 10.03, -0.55, 9.43, -0.4, 9.99, -0.89, 9.77, 0.52, 8.81, 0.45, 8.31, -1.29, 9.58, -1.64, 9.1, -2.19, 9.24, -0.86, 9.9, -0.21, 7.27, 0.68, 8.61, 0.37, 8.17, -0.47, 8.02, -1.19, 8.29, -0.83, 7.9, 0.36, 7.0, -0.46, 8.1, -0.95, 7.52, 0.83, 7.87, -0.31, 8.53, 0.68, 7.07, -0.46, 6.77, -1.64, 9.1, 0.17, 7.7, -0.63, 7.94, 0.56, 7.72, -0.7, 8.85, -0.22, 8.55, -0.81, 9.37, 0.01, 8.56, -0.09, 7.54, -1.51, 8.35, 0.53, 8.53, -0.82, 8.27, 0.08, 8.47, -0.73, 9.18, -0.68, 8.99, 0.22, 8.99, 0.3, 8.37, -2.19, 9.24, -0.63, 7.94, -1.47, 9.36, -0.31, 9.24, 0.28, 9.29, -0.39, 7.93, 0.18, 9.95, 0.04, 8.69, 0.59, 8.02, 0.05, 8.87, 0.67, 8.46, 0.18, 8.22, -0.07, 8.99, 0.1, 9.03, 1.35, 9.35, 0.84, 8.57, 0.64, 7.65, -0.86, 9.9, 0.56, 7.72, -0.31, 9.24, 0.35, 9.6, 
+
+L3_zSYRK_A_kn
+0.4, 0.8, 0.7, 0.6, 0.9, 0.3, 0.7, 0.9, 0.7, 0.6, 0.3, 0.8, 0.7, 0.1, 0.8, 0.7, 0.1, 0.8, 0.4, 0.9, 0.3, 0.2, 0.7, 0.5, 0.1, 0.6, 0.7, 0.6, 0.4, 0.2, 0.6, 0.6, 0.9, 0.3, 0.4, 0.6, 0.4, 0.3, 0.2, 0.6, 0.4, 0.2, 0.3, 0.3, 0.2, 0.9, 0.8, 0.4, 0.6, 0.4, 0.1, 0.3, 0.2, 0.4, 0.8, 0.4, 0.1, 0.1, 0.4, 0.6, 0.9, 0.5, 0.6, 0.2, 0.3, 0.2, 0.8, 0.9, 0.2, 0.3, 0.9, 0.1, 0.3, 0.3, 0.7, 0.5, 0.1, 0.1, 0.6, 0.2, 0.1, 0.5, 0.2, 0.2, 0.1, 0.6, 0.3, 0.7, 0.1, 0.7, 0.5, 0.2, 0.8, 0.3, 0.8, 0.3, 0.7, 0.5, 0.8, 0.7, 0.7, 0.3, 0.4, 0.9, 0.3, 0.1, 0.6, 0.4, 0.9, 0.2, 0.1, 0.5, 0.5, 0.3, 0.8, 0.9, 0.5, 0.7, 0.2, 0.9, 0.9, 0.5, 0.3, 0.3, 0.3, 0.6, 0.6, 0.2, 0.2, 0.3, 0.2, 0.3, 0.1, 0.5, 0.4, 0.9, 0.1, 0.1, 0.6, 0.4, 0.8, 0.1, 0.6, 0.3, 0.1, 0.7, 0.9, 0.9, 0.8, 0.4, 0.9, 0.3, 0.5, 0.7, 0.8, 0.6, 0.4, 0.1, 0.8, 0.8, 0.6, 0.7, 0.2, 0.8, 0.8, 0.4, 0.6, 0.3, 0.6, 0.4, 0.3, 0.2, 0.3, 0.8, 0.3, 0.9, 0.2, 0.6, 0.7, 0.1, 0.1, 0.6, 0.4, 0.8, 0.3, 0.1, 0.4, 0.6, 0.4, 0.5, 0.5, 0.2, 0.3, 0.6, 0.5, 0.1, 0.7, 0.8, 0.2, 0.9, 0.2, 0.6, 0.9, 0.6, 0.7, 0.2, 0.3, 0.4, 0.3, 0.2, 0.1, 0.3, 0.4, 0.5, 0.2, 0.7, 0.9, 0.6, 0.3, 0.9, 0.1, 0.4, 0.7, 0.7, 0.7, 0.6, 0.6, 0.1, 0.9, 0.4, 0.7, 0.4, 0.3, 0.9, 0.6, 0.4, 0.3, 0.4, 0.5, 0.8, 0.3, 0.3, 0.4, 0.8, 0.5, 0.6, 0.2, 0.3, 0.5, 0.9, 0.4, 0.6, 0.5, 0.6, 0.1, 0.7, 0.3, 0.9, 0.8, 0.8, 0.8, 0.6, 0.8, 0.1, 0.3, 0.5, 0.1, 0.6, 0.7, 0.6, 0.1, 0.6, 0.4, 0.9, 0.7, 0.3, 0.8, 0.5, 0.5, 0.5, 0.7, 0.7, 0.1, 0.7, 0.3, 0.5, 0.7, 0.6, 0.6, 0.8, 0.5, 0.2, 0.6, 0.9, 0.9, 0.4, 0.6, 0.4, 0.9, 0.8, 0.8, 0.2, 0.9, 0.6, 0.6, 0.8, 0.1, 0.7, 0.6, 0.1, 0.5, 0.8, 0.8, 0.9, 0.4, 0.4, 0.3, 0.5, 0.9, 0.6, 0.2, 0.7, 0.6, 0.7, 0.9, 0.3, 0.5, 0.2, 0.6, 0.5, 0.8, 0.1, 0.3, 0.3, 0.3, 0.2, 0.6, 0.7, 0.9, 0.5, 0.3, 0.3, 0.6, 0.6, 0.4, 0.1, 0.2, 0.8, 0.9, 0.9, 0.7, 0.6, 0.6, 0.6, 0.6, 0.7, 0.3, 0.4, 0.3, 0.8, 0.4, 0.1, 0.7, 0.8, 0.4, 0.2, 0.5, 0.5, 0.3, 0.8, 0.6, 0.3, 0.1, 0.2, 0.2, 0.3, 0.1, 0.9, 0.6, 0.2, 0.7, 0.6, 0.9, 0.9, 0.4, 0.2, 0.9, 0.8, 0.4, 0.8, 0.6, 0.9, 0.6, 0.1, 0.9, 0.3, 0.2, 0.9, 0.6, 0.4, 0.7, 0.3, 0.8, 0.2, 0.4, 0.3, 0.1, 0.9, 0.1, 0.3, 0.9, 0.2, 0.6, 0.3, 0.7, 0.8, 0.4, 0.9, 0.4, 0.2, 0.4, 0.6, 0.8, 0.9, 0.4, 0.8, 0.3, 0.3, 0.6, 0.7, 0.7, 0.6, 0.2, 0.2, 0.5, 0.7, 0.7, 0.9, 0.9, 0.1, 0.5, 0.4, 0.1, 0.4, 0.7, 0.2, 0.8, 0.6, 0.3, 0.9, 0.6, 0.9, 0.5, 0.3, 0.1, 0.1, 0.4, 0.2, 0.6, 0.2, 0.4, 0.4, 0.7, 0.1, 0.4, 0.8, 0.6, 0.9, 0.6, 0.5, 0.8, 0.5, 0.9, 0.6, 0.6, 0.8, 0.8, 0.7, 0.3, 0.9, 0.2, 0.4, 0.4, 0.5, 0.5, 0.9, 0.6, 0.5, 0.5, 0.2, 0.6, 0.3, 0.2, 0.6, 0.6, 0.4, 0.4, 0.1, 0.7, 0.3, 0.3, 0.6, 0.3, 0.6, 0.1, 0.1, 0.1, 0.7, 0.5, 0.1, 0.9, 0.8, 0.7, 0.8, 0.7, 0.1, 0.5, 0.4, 0.8, 0.7, 0.7, 0.7, 0.1, 0.5, 0.3, 0.5, 0.7, 0.4, 0.7, 0.5, 0.4, 0.4, 0.4, 0.3, 0.4, 0.9, 0.6, 0.8, 0.6, 0.2, 0.7, 0.3, 0.6, 0.6, 
+
+L3_zSYRK_o_T
+-2.26, 7.54, -0.38, 8.34, -0.75, 7.51, -1.5, 8.45, -1.09, 7.93, -2.1, 7.55, -0.75, 7.83, -1.17, 8.28, -3.23, 7.2, -0.65, 8.48, 0.16, 6.76, 0.1, 7.15, -0.35, 7.47, -0.88, 8.27, 0.19, 6.37, -1.06, 8.27, -1.19, 8.35, -0.38, 8.34, 1.16, 6.84, 2.65, 7.34, 1.24, 8.99, -0.36, 10.07, 0.05, 8.63, 1.03, 8.41, 0.85, 8.4, -0.78, 7.96, 1.52, 8.72, 1.92, 7.47, 1.61, 8.14, 1.79, 7.96, 0.92, 8.96, 2.06, 7.69, 2.76, 7.97, 1.54, 8.74, -0.75, 7.51, 2.65, 7.34, 2.26, 7.34, 0.8, 8.91, 1.84, 8.52, 0.69, 7.41, 1.79, 8.47, 1.85, 8.55, -0.07, 8.04, 1.89, 8.09, 2.14, 7.04, 1.69, 8.44, 2.79, 8.26, 1.87, 8.95, 2.46, 6.44, 1.78, 7.84, 1.31, 9.32, -1.5, 8.45, 1.24, 8.99, 0.8, 8.91, -0.44, 10.0, -1.13, 9.84, -0.18, 8.47, 1.17, 9.51, -0.3, 9.48, -1.99, 9.33, 0.29, 8.96, 1.55, 8.15, 0.07, 9.64, 1.64, 8.01, -0.17, 9.35, 0.06, 7.77, 1.12, 9.88, 0.14, 10.07, -1.09, 7.93, -0.36, 10.07, 1.84, 8.52, -1.13, 9.84, -1.06, 10.6, -1.51, 9.29, -0.34, 9.87, -1.02, 9.65, -2.3, 8.57, 0.32, 9.27, 1.84, 8.49, -0.89, 10.3, 0.29, 8.9, -0.33, 9.68, -0.02, 9.1, 0.86, 9.26, -0.13, 8.92, -2.1, 7.55, 0.05, 8.63, 0.69, 7.41, -0.18, 8.47, -1.51, 9.29, -2.0, 8.58, 0.15, 8.67, -0.68, 8.63, -2.4, 7.69, -0.85, 8.64, 0.62, 7.59, 0.06, 9.29, -0.05, 8.14, -0.91, 9.55, 0.39, 7.31, 0.14, 8.48, -0.47, 9.25, -0.75, 7.83, 1.03, 8.41, 1.79, 8.47, 1.17, 9.51, -0.34, 9.87, 0.15, 8.67, 1.53, 10.1, 0.56, 9.94, -2.09, 8.75, 1.71, 9.16, 1.94, 8.25, 0.9, 8.82, 2.5, 8.75, 0.49, 9.06, 0.63, 7.55, 1.51, 8.81, 0.45, 9.57, -1.17, 8.28, 0.85, 8.4, 1.85, 8.55, -0.3, 9.48, -1.02, 9.65, -0.68, 8.63, 0.56, 9.94, -0.39, 9.28, -2.73, 8.44, 0.1, 9.35, 0.96, 8.1, 0.56, 10.08, 1.54, 8.86, 0.32, 10.23, 0.75, 7.86, 0.99, 9.05, 0.41, 8.8, -3.23, 7.2, -0.78, 7.96, -0.07, 8.04, -1.99, 9.33, -2.3, 8.57, -2.4, 7.69, -2.09, 8.75, -2.73, 8.44, -3.48, 7.6, -1.09, 7.76, -0.46, 7.22, -1.99, 9.04, -0.27, 8.62, -1.4, 9.2, -0.29, 7.06, -0.33, 8.53, -1.49, 8.92, -0.65, 8.48, 1.52, 8.72, 1.89, 8.09, 0.29, 8.96, 0.32, 9.27, -0.85, 8.64, 1.71, 9.16, 0.1, 9.35, -1.09, 7.76, 0.23, 8.6, 1.2, 7.8, 1.08, 9.5, 1.96, 8.27, 0.34, 9.75, 0.69, 7.25, 0.85, 9.36, 0.99, 8.99, 0.16, 6.76, 1.92, 7.47, 2.14, 7.04, 1.55, 8.15, 1.84, 8.49, 0.62, 7.59, 1.94, 8.25, 0.96, 8.1, -0.46, 7.22, 1.2, 7.8, 2.47, 7.16, 2.34, 8.66, 3.34, 7.49, 1.89, 8.48, 1.74, 7.73, 2.35, 8.49, 1.38, 9.0, 0.1, 7.15, 1.61, 8.14, 1.69, 8.44, 0.07, 9.64, -0.89, 10.3, 0.06, 9.29, 0.9, 8.82, 0.56, 10.08, -1.99, 9.04, 1.08, 9.5, 2.34, 8.66, 1.3, 9.04, 1.69, 7.99, 0.46, 9.41, 0.96, 8.16, 2.15, 8.96, 0.09, 8.38, -0.35, 7.47, 1.79, 7.96, 2.79, 8.26, 1.64, 8.01, 0.29, 8.9, -0.05, 8.14, 2.5, 8.75, 1.54, 8.86, -0.27, 8.62, 1.96, 8.27, 3.34, 7.49, 1.69, 7.99, 2.09, 7.56, 1.42, 8.35, 1.85, 8.22, 2.75, 9.08, 0.98, 9.0, -0.88, 8.27, 0.92, 8.96, 1.87, 8.95, -0.17, 9.35, -0.33, 9.68, -0.91, 9.55, 0.49, 9.06, 0.32, 10.23, -1.4, 9.2, 0.34, 9.75, 1.89, 8.48, 0.46, 9.41, 1.42, 8.35, 0.9, 10.3, 0.86, 9.21, 1.49, 9.44, 0.7, 10.37, 0.19, 6.37, 2.06, 7.69, 2.46, 6.44, 0.06, 7.77, -0.02, 9.1, 0.39, 7.31, 0.63, 7.55, 0.75, 7.86, -0.29, 7.06, 0.69, 7.25, 1.74, 7.73, 0.96, 8.16, 1.85, 8.22, 0.86, 9.21, 1.26, 6.74, 2.33, 8.07, 1.4, 8.54, -1.06, 8.27, 2.76, 7.97, 1.78, 7.84, 1.12, 9.88, 0.86, 9.26, 0.14, 8.48, 1.51, 8.81, 0.99, 9.05, -0.33, 8.53, 0.85, 9.36, 2.35, 8.49, 2.15, 8.96, 2.75, 9.08, 1.49, 9.44, 2.33, 8.07, 2.27, 9.22, 0.96, 9.59, -1.19, 8.35, 1.54, 8.74, 1.31, 9.32, 0.14, 10.07, -0.13, 8.92, -0.47, 9.25, 0.45, 9.57, 0.41, 8.8, -1.49, 8.92, 0.99, 8.99, 1.38, 9.0, 0.09, 8.38, 0.98, 9.0, 0.7, 10.37, 1.4, 8.54, 0.96, 9.59, 0.13, 9.9, 
+
+L3_cHERK_A_nk
+0.40000000596, 0.10000000149, 0.800000011921, 0.10000000149, 0.20000000298, 0.5, 0.800000011921, 0.899999976158, 0.699999988079, 0.600000023842, 0.300000011921, 0.10000000149, 0.5, 0.5, 0.699999988079, 0.800000011921, 0.699999988079, 0.300000011921, 0.20000000298, 0.699999988079, 0.699999988079, 0.5, 0.600000023842, 0.10000000149, 0.300000011921, 0.699999988079, 0.10000000149, 0.40000000596, 0.899999976158, 0.5, 0.600000023842, 0.800000011921, 0.800000011921, 0.699999988079, 0.699999988079, 0.899999976158, 0.40000000596, 0.300000011921, 0.20000000298, 0.40000000596, 0.699999988079, 0.800000011921, 0.40000000596, 0.5, 0.5, 0.10000000149, 0.300000011921, 0.300000011921, 0.600000023842, 0.800000011921, 0.40000000596, 0.899999976158, 0.20000000298, 0.699999988079, 0.899999976158, 0.20000000298, 0.10000000149, 0.800000011921, 0.5, 0.300000011921, 0.600000023842, 0.800000011921, 0.300000011921, 0.899999976158, 0.40000000596, 0.40000000596, 0.899999976158, 0.800000011921, 0.300000011921, 0.899999976158, 0.20000000298, 0.600000023842, 0.20000000298, 0.699999988079, 0.800000011921, 0.800000011921, 0.699999988079, 0.899999976158, 0.20000000298, 0.300000011921, 0.899999976158, 0.699999988079, 0.899999976158, 0.699999988079, 0.10000000149, 0.699999988079, 0.20000000298, 0.699999988079, 0.800000011921, 0.20000000298, 0.800000011921, 0.899999976158, 0.600000023842, 0.10000000149, 0.5, 0.40000000596, 0.300000011921, 0.800000011921, 0.699999988079, 0.899999976158, 0.300000011921, 0.40000000596, 0.10000000149, 0.899999976158, 0.40000000596, 0.20000000298, 0.600000023842, 0.699999988079, 0.600000023842, 0.300000011921, 0.899999976158, 0.699999988079, 0.20000000298, 0.40000000596, 0.10000000149, 0.40000000596, 0.10000000149, 0.600000023842, 0.40000000596, 0.5, 0.5, 0.10000000149, 0.699999988079, 0.600000023842, 0.20000000298, 0.800000011921, 0.800000011921, 0.899999976158, 0.10000000149, 0.699999988079, 0.699999988079, 0.300000011921, 0.10000000149, 0.10000000149, 0.40000000596, 0.40000000596, 0.5, 0.20000000298, 0.800000011921, 0.600000023842, 0.699999988079, 0.600000023842, 0.40000000596, 0.600000023842, 0.20000000298, 0.800000011921, 0.899999976158, 0.800000011921, 0.300000011921, 0.20000000298, 0.40000000596, 0.20000000298, 0.40000000596, 0.300000011921, 0.5, 0.300000011921, 0.800000011921, 0.40000000596, 0.40000000596, 0.800000011921, 0.5, 0.40000000596, 0.20000000298, 0.10000000149, 0.699999988079, 0.20000000298, 0.600000023842, 0.699999988079, 0.699999988079, 0.5, 0.699999988079, 0.10000000149, 0.600000023842, 0.40000000596, 0.20000000298, 0.40000000596, 0.10000000149, 0.699999988079, 0.699999988079, 0.800000011921, 0.699999988079, 0.40000000596, 0.10000000149, 0.300000011921, 0.699999988079, 0.20000000298, 0.40000000596, 0.20000000298, 0.40000000596, 0.300000011921, 0.800000011921, 0.899999976158, 0.699999988079, 0.20000000298, 0.5, 0.10000000149, 0.699999988079, 0.20000000298, 0.20000000298, 0.40000000596, 0.5, 0.899999976158, 0.800000011921, 0.600000023842, 0.899999976158, 0.10000000149, 0.800000011921, 0.10000000149, 0.10000000149, 0.300000011921, 0.800000011921, 0.600000023842, 0.20000000298, 0.300000011921, 0.40000000596, 0.5, 0.600000023842, 0.40000000596, 0.899999976158, 0.899999976158, 0.5, 0.699999988079, 0.600000023842, 0.20000000298, 0.800000011921, 0.600000023842, 0.800000011921, 0.20000000298, 0.5, 0.5, 0.300000011921, 0.40000000596, 0.20000000298, 0.800000011921, 0.10000000149, 0.800000011921, 0.300000011921, 0.600000023842, 0.800000011921, 0.40000000596, 0.10000000149, 0.899999976158, 0.10000000149, 0.20000000298, 0.800000011921, 0.300000011921, 0.600000023842, 0.20000000298, 0.10000000149, 0.40000000596, 0.600000023842, 0.800000011921, 0.300000011921, 0.10000000149, 0.800000011921, 0.40000000596, 0.20000000298, 0.40000000596, 0.300000011921, 0.800000011921, 0.800000011921, 0.40000000596, 0.5, 0.899999976158, 0.40000000596, 0.10000000149, 0.40000000596, 0.300000011921, 0.10000000149, 0.899999976158, 0.20000000298, 0.899999976158, 0.699999988079, 0.300000011921, 0.699999988079, 0.899999976158, 0.699999988079, 0.300000011921, 0.40000000596, 0.899999976158, 0.899999976158, 0.800000011921, 0.800000011921, 0.699999988079, 0.40000000596, 0.699999988079, 0.899999976158, 0.20000000298, 0.40000000596, 0.5, 0.300000011921, 0.300000011921, 0.800000011921, 0.600000023842, 0.20000000298, 0.600000023842, 0.40000000596, 0.800000011921, 0.300000011921, 0.699999988079, 0.40000000596, 0.5, 0.5, 0.40000000596, 0.600000023842, 0.699999988079, 0.699999988079, 0.300000011921, 0.800000011921, 0.10000000149, 0.10000000149, 0.899999976158, 0.899999976158, 0.300000011921, 0.699999988079, 0.300000011921, 0.800000011921, 0.5, 0.300000011921, 0.5, 0.20000000298, 0.300000011921, 0.699999988079, 0.300000011921, 0.10000000149, 0.20000000298, 0.600000023842, 0.20000000298, 0.10000000149, 0.800000011921, 0.300000011921, 0.699999988079, 0.20000000298, 0.10000000149, 0.699999988079, 0.800000011921, 0.800000011921, 0.5, 0.40000000596, 0.5, 0.800000011921, 0.800000011921, 0.699999988079, 0.40000000596, 0.5, 0.40000000596, 0.800000011921, 0.20000000298, 0.600000023842, 0.800000011921, 0.300000011921, 0.800000011921, 0.300000011921, 0.300000011921, 0.10000000149, 0.899999976158, 0.899999976158, 0.600000023842, 0.5, 0.5, 0.899999976158, 0.5, 0.10000000149, 0.699999988079, 0.899999976158, 0.10000000149, 0.800000011921, 0.600000023842, 0.899999976158, 0.800000011921, 0.40000000596, 0.10000000149, 0.40000000596, 0.800000011921, 0.300000011921, 0.899999976158, 0.10000000149, 0.800000011921, 0.20000000298, 0.899999976158, 0.699999988079, 0.699999988079, 0.20000000298, 0.600000023842, 0.5, 0.40000000596, 0.5, 0.699999988079, 0.5, 0.40000000596, 0.800000011921, 0.40000000596, 0.600000023842, 0.899999976158, 0.40000000596, 0.10000000149, 0.10000000149, 0.300000011921, 0.20000000298, 0.800000011921, 0.10000000149, 0.300000011921, 0.800000011921, 0.20000000298, 0.600000023842, 0.40000000596, 0.600000023842, 0.800000011921, 0.5, 0.40000000596, 0.899999976158, 0.20000000298, 0.600000023842, 0.10000000149, 0.800000011921, 0.40000000596, 0.20000000298, 0.600000023842, 0.699999988079, 0.899999976158, 0.20000000298, 0.20000000298, 0.699999988079, 0.40000000596, 0.699999988079, 0.899999976158, 0.600000023842, 0.300000011921, 0.10000000149, 0.899999976158, 0.20000000298, 0.300000011921, 0.800000011921, 0.10000000149, 0.600000023842, 0.5, 0.10000000149, 0.899999976158, 0.899999976158, 0.600000023842, 0.10000000149, 0.899999976158, 0.5, 0.10000000149, 0.800000011921, 0.300000011921, 0.10000000149, 0.800000011921, 0.600000023842, 0.20000000298, 0.300000011921, 0.899999976158, 0.40000000596, 0.10000000149, 0.699999988079, 0.800000011921, 0.5, 0.600000023842, 0.600000023842, 0.20000000298, 0.10000000149, 0.800000011921, 0.20000000298, 0.899999976158, 0.40000000596, 0.20000000298, 0.899999976158, 0.699999988079, 0.40000000596, 0.10000000149, 0.800000011921, 0.600000023842, 0.10000000149, 0.800000011921, 0.5, 0.5, 0.40000000596, 0.699999988079, 0.600000023842, 0.300000011921, 0.899999976158, 0.10000000149, 0.300000011921, 0.600000023842, 0.300000011921, 0.10000000149, 0.20000000298, 0.300000011921, 0.40000000596, 0.699999988079, 0.40000000596, 0.800000011921, 0.40000000596, 0.40000000596, 0.20000000298, 0.899999976158, 0.20000000298, 0.5, 0.300000011921, 0.899999976158, 0.5, 0.5, 0.800000011921, 0.699999988079, 0.5, 0.300000011921, 0.699999988079, 0.699999988079, 0.899999976158, 0.10000000149, 0.300000011921, 0.899999976158, 0.300000011921, 0.20000000298, 0.600000023842, 0.10000000149, 0.5, 0.800000011921, 0.20000000298, 0.899999976158, 0.300000011921, 0.899999976158, 0.300000011921, 0.10000000149, 0.800000011921, 0.899999976158, 0.300000011921, 0.300000011921, 0.600000023842, 0.899999976158, 0.699999988079, 0.40000000596, 0.300000011921, 0.899999976158, 0.600000023842, 0.699999988079, 0.20000000298, 0.40000000596, 0.40000000596, 0.20000000298, 0.800000011921, 0.899999976158, 0.699999988079, 0.300000011921, 
+
+L3_cHERK_C_nn
+0.300000011921, 0.0, 0.600000023842, 0.20000000298, 0.800000011921, 0.699999988079, 0.899999976158, 0.20000000298, 0.5, 0.899999976158, 0.5, 0.10000000149, 0.600000023842, 0.10000000149, 0.899999976158, 0.800000011921, 0.40000000596, 0.5, 0.800000011921, 0.20000000298, 0.10000000149, 0.300000011921, 0.899999976158, 0.300000011921, 0.40000000596, 0.600000023842, 0.899999976158, 0.40000000596, 0.10000000149, 0.699999988079, 0.699999988079, 0.899999976158, 0.40000000596, 0.899999976158, 0.600000023842, -0.20000000298, 0.5, 0.0, 0.800000011921, 0.5, 0.300000011921, 0.40000000596, 0.40000000596, 0.300000011921, 0.300000011921, 0.5, 0.800000011921, 0.800000011921, 0.5, 0.300000011921, 0.40000000596, 0.800000011921, 0.300000011921, 0.600000023842, 0.300000011921, 0.699999988079, 0.20000000298, 0.899999976158, 0.5, 0.10000000149, 0.5, 0.800000011921, 0.40000000596, 0.5, 0.300000011921, 0.5, 0.800000011921, 0.5, 0.800000011921, -0.699999988079, 0.800000011921, -0.5, 0.699999988079, 0.0, 0.40000000596, 0.699999988079, 0.300000011921, 0.699999988079, 0.40000000596, 0.5, 0.600000023842, 0.600000023842, 0.899999976158, 0.800000011921, 0.5, 0.800000011921, 0.699999988079, 0.899999976158, 0.20000000298, 0.800000011921, 0.699999988079, 0.699999988079, 0.300000011921, 0.5, 0.600000023842, 0.40000000596, 0.699999988079, 0.40000000596, 0.899999976158, 0.5, 0.10000000149, 0.40000000596, 0.899999976158, -0.20000000298, 0.300000011921, -0.40000000596, 0.40000000596, -0.699999988079, 0.300000011921, 0.0, 0.10000000149, 0.5, 0.20000000298, 0.699999988079, 0.899999976158, 0.600000023842, 0.699999988079, 0.600000023842, 0.600000023842, 0.20000000298, 0.5, 0.20000000298, 0.40000000596, 0.899999976158, 0.800000011921, 0.800000011921, 0.300000011921, 0.699999988079, 0.10000000149, 0.800000011921, 0.300000011921, 0.800000011921, 0.699999988079, 0.5, 0.699999988079, 0.600000023842, 0.5, -0.899999976158, 0.40000000596, -0.300000011921, 0.300000011921, -0.699999988079, 0.10000000149, -0.5, 0.10000000149, 0.0, 0.899999976158, 0.5, 0.600000023842, 0.899999976158, 0.800000011921, 0.600000023842, 0.40000000596, 0.800000011921, 0.20000000298, 0.699999988079, 0.5, 0.600000023842, 0.40000000596, 0.300000011921, 0.899999976158, 0.300000011921, 0.10000000149, 0.20000000298, 0.699999988079, 0.5, 0.300000011921, 0.600000023842, 0.600000023842, 0.20000000298, 0.5, -0.10000000149, 0.300000011921, -0.5, 0.40000000596, -0.5, 0.20000000298, -0.699999988079, 0.899999976158, -0.5, 0.699999988079, 0.0, 0.899999976158, 0.899999976158, 0.20000000298, 0.699999988079, 0.899999976158, 0.800000011921, 0.699999988079, 0.699999988079, 0.600000023842, 0.20000000298, 0.300000011921, 0.699999988079, 0.699999988079, 0.20000000298, 0.300000011921, 0.10000000149, 0.10000000149, 0.10000000149, 0.300000011921, 0.10000000149, 0.5, 0.699999988079, 0.600000023842, -0.10000000149, 0.800000011921, -0.800000011921, 0.600000023842, -0.600000023842, 0.899999976158, -0.600000023842, 0.600000023842, -0.899999976158, 0.899999976158, -0.899999976158, 0.600000023842, 0.0, 0.699999988079, 0.20000000298, 0.10000000149, 0.10000000149, 0.899999976158, 0.600000023842, 0.20000000298, 0.600000023842, 0.5, 0.40000000596, 0.800000011921, 0.899999976158, 0.899999976158, 0.10000000149, 0.800000011921, 0.800000011921, 0.800000011921, 0.5, 0.10000000149, 0.10000000149, 0.899999976158, -0.800000011921, 0.5, -0.300000011921, 0.899999976158, -0.800000011921, 0.699999988079, -0.600000023842, 0.800000011921, -0.600000023842, 0.20000000298, -0.699999988079, 0.699999988079, -0.20000000298, 0.20000000298, 0.0, 0.600000023842, 0.40000000596, 0.300000011921, 0.699999988079, 0.699999988079, 0.800000011921, 0.40000000596, 0.899999976158, 0.20000000298, 0.300000011921, 0.300000011921, 0.40000000596, 0.10000000149, 0.800000011921, 0.899999976158, 0.699999988079, 0.800000011921, 0.600000023842, 0.40000000596, -0.5, 0.40000000596, -0.800000011921, 0.5, -0.800000011921, 0.600000023842, -0.20000000298, 0.40000000596, -0.800000011921, 0.899999976158, -0.800000011921, 0.10000000149, -0.10000000149, 0.600000023842, -0.40000000596, 0.800000011921, 0.0, 0.20000000298, 0.800000011921, 0.600000023842, 0.20000000298, 0.800000011921, 0.300000011921, 0.699999988079, 0.699999988079, 0.600000023842, 0.600000023842, 0.300000011921, 0.10000000149, 0.20000000298, 0.899999976158, 0.600000023842, 0.40000000596, 0.800000011921, -0.20000000298, 0.300000011921, -0.600000023842, 0.699999988079, -0.899999976158, 0.5, -0.20000000298, 0.20000000298, -0.699999988079, 0.699999988079, -0.699999988079, 0.899999976158, -0.600000023842, 0.300000011921, -0.699999988079, 0.20000000298, -0.800000011921, 0.40000000596, 0.0, 0.699999988079, 0.699999988079, 0.899999976158, 0.20000000298, 0.5, 0.899999976158, 0.20000000298, 0.899999976158, 0.899999976158, 0.40000000596, 0.10000000149, 0.800000011921, 0.899999976158, 0.40000000596, 0.10000000149, -0.300000011921, 0.300000011921, -0.699999988079, 0.20000000298, -0.800000011921, 0.40000000596, -0.899999976158, 0.5, -0.600000023842, 0.600000023842, -0.20000000298, 0.20000000298, -0.600000023842, 0.699999988079, -0.800000011921, 0.600000023842, -0.20000000298, 0.699999988079, -0.699999988079, 0.10000000149, 0.0, 0.20000000298, 0.600000023842, 0.800000011921, 0.300000011921, 0.699999988079, 0.20000000298, 0.40000000596, 0.600000023842, 0.600000023842, 0.20000000298, 0.10000000149, 0.800000011921, 0.899999976158, -0.300000011921, 0.20000000298, -0.899999976158, 0.699999988079, -0.699999988079, 0.800000011921, -0.800000011921, 0.40000000596, -0.300000011921, 0.300000011921, -0.699999988079, 0.5, -0.40000000596, 0.40000000596, -0.899999976158, 0.800000011921, -0.300000011921, 0.899999976158, -0.20000000298, 0.20000000298, -0.600000023842, 0.5, 0.0, 0.800000011921, 0.300000011921, 0.20000000298, 0.20000000298, 0.699999988079, 0.600000023842, 0.40000000596, 0.10000000149, 0.899999976158, 0.40000000596, 0.40000000596, -0.600000023842, 0.5, -0.10000000149, 0.300000011921, -0.5, 0.300000011921, -0.699999988079, 0.899999976158, -0.300000011921, 0.699999988079, -0.20000000298, 0.800000011921, -0.899999976158, 0.20000000298, -0.300000011921, 0.699999988079, -0.699999988079, 0.5, -0.899999976158, 0.800000011921, -0.300000011921, 0.800000011921, -0.300000011921, 0.699999988079, 0.0, 0.300000011921, 0.10000000149, 0.10000000149, 0.899999976158, 0.10000000149, 0.899999976158, 0.20000000298, 0.899999976158, 0.899999976158, -0.40000000596, 0.5, -0.800000011921, 0.600000023842, -0.40000000596, 0.10000000149, -0.800000011921, 0.10000000149, -0.20000000298, 0.300000011921, -0.10000000149, 0.899999976158, -0.10000000149, 0.300000011921, -0.40000000596, 0.600000023842, -0.600000023842, 0.20000000298, -0.899999976158, 0.699999988079, -0.20000000298, 0.20000000298, -0.20000000298, 0.300000011921, -0.10000000149, 0.600000023842, 0.0, 0.10000000149, 0.300000011921, 0.800000011921, 0.899999976158, 0.20000000298, 0.5, 0.10000000149, -0.699999988079, 0.40000000596, -0.5, 0.699999988079, -0.40000000596, 0.300000011921, -0.800000011921, 0.699999988079, -0.5, 0.10000000149, -0.10000000149, 0.800000011921, -0.800000011921, 0.10000000149, -0.800000011921, 0.300000011921, -0.10000000149, 0.899999976158, -0.40000000596, 0.40000000596, -0.600000023842, 0.699999988079, -0.600000023842, 0.10000000149, -0.899999976158, 0.10000000149, -0.300000011921, 0.800000011921, 0.0, 0.40000000596, 0.300000011921, 0.600000023842, 0.600000023842, 0.699999988079, -0.899999976158, 0.300000011921, -0.5, 0.899999976158, -0.5, 0.699999988079, -0.5, 0.300000011921, -0.600000023842, 0.300000011921, -0.10000000149, 0.800000011921, -0.5, 0.899999976158, -0.699999988079, 0.20000000298, -0.899999976158, 0.10000000149, -0.800000011921, 0.600000023842, -0.20000000298, 0.40000000596, -0.10000000149, 0.10000000149, -0.899999976158, 0.800000011921, -0.899999976158, 0.40000000596, -0.300000011921, 0.800000011921, 0.0, 0.20000000298, 0.699999988079, 0.40000000596, -0.899999976158, 0.800000011921, -0.5, 0.10000000149, -0.40000000596, 0.699999988079, -0.600000023842, 0.600000023842, -0.20000000298, 0.5, -0.699999988079, 0.10000000149, -0.10000000149, 0.800000011921, -0.600000023842, 0.600000023842, -0.40000000596, 0.899999976158, -0.40000000596, 0.10000000149, -0.800000011921, 0.899999976158, -0.40000000596, 0.20000000298, -0.899999976158, 0.20000000298, -0.5, 0.600000023842, -0.600000023842, 0.20000000298, -0.699999988079, 0.40000000596, 0.0, 
+
+L3_cHERK_o_N
+10.4700000229, 6.66133814775e-16, 9.30000010133, -2.08999994233, 9.22000003412, -0.450000023842, 8.7200000304, -1.80999996752, 8.12000013173, 0.679999892861, 8.17000005573, 0.679999997914, 7.95000010431, 1.21000003457, 8.35000016689, 0.330000042617, 9.17999995694, -0.190000016093, 8.44000014722, -0.020000025928, 8.4800001432, -0.599999988824, 9.63999999225, -1.07000002518, 7.99000018969, 0.910000043511, 9.36999998048, -1.42999999195, 8.3500001058, -0.610000027865, 8.67000000358, -0.520000014007, 9.1400000824, -0.839999873787, 9.30000010133, 2.08999994233, 11.5999999732, 0.0, 10.2100000323, 1.06999999762, 9.07000003487, -0.21000002563, 8.58000009552, 1.47999989361, 7.90000003874, 2.46999991342, 9.09000008613, 2.63000003517, 8.34000016958, 0.719999977499, 9.04000005856, 1.63999998704, 8.30000016987, 1.48000004783, 9.03000013053, 1.70999996006, 9.79000005782, 0.379999971092, 8.35000009984, 1.84000005335, 10.0199999619, 1.13000003517, 9.00000009611, 1.05999999881, 9.25000000075, 0.750000015646, 9.67000011012, 0.810000081509, 9.22000003412, 0.450000023842, 10.2100000323, -1.06999999762, 13.5499998182, 4.4408920985e-16, 9.71000006512, 0.160000004768, 9.17000008628, 1.05999988556, 8.5000000231, 2.08999998108, 9.86000004053, 2.77999990925, 9.20000008196, 0.920000040829, 10.8699999276, 0.680000003874, 10.3000000477, 1.67999993756, 8.76000008076, 1.61999998942, 10.3199999201, 0.309999878854, 8.8400000757, 2.67000000954, 9.94000001088, 0.600000029802, 9.41000005245, 0.490000041425, 10.1199999797, 0.040000025779, 10.0299999398, 1.02000008851, 8.7200000304, 1.80999996752, 9.07000003487, 0.21000002563, 9.71000006512, -0.160000004768, 10.5899999952, 2.22044604925e-16, 7.90000011995, 1.66999989852, 7.42000006467, 2.60999998987, 8.92000007883, 3.20000002906, 8.32000014812, 1.94000002652, 9.5400000079, 0.620000031143, 8.2700000751, 1.12000003114, 8.35000007749, 2.20999997944, 9.62000004083, 0.370000005811, 7.60000008568, 2.64000003099, 7.68000004932, 1.25999998316, 7.96000008598, 1.42000006989, 8.6400000079, 0.550000047684, 8.66000006884, 1.97000007883, 8.12000013173, -0.679999892861, 8.58000009552, -1.47999989361, 9.17000008628, -1.05999988556, 7.90000011995, -1.66999989852, 8.83000015736, 0.0, 8.38000005528, 1.13000006646, 8.02000013992, 1.81000006512, 7.44000022247, 0.380000074655, 8.45000008717, -0.369999885112, 7.67000013173, 0.590000054836, 7.91000018135, 0.210000085235, 7.84000011668, -0.659999943674, 7.82000014886, 1.00000010207, 7.74000013456, -0.829999877214, 8.12000012651, -0.479999893606, 7.96000012025, -0.709999901205, 8.24000012562, -0.099999833107, 8.17000005573, -0.679999997914, 7.90000003874, -2.46999991342, 8.5000000231, -2.08999998108, 7.42000006467, -2.60999998987, 8.38000005528, -1.13000006646, 9.30999995708, 0.0, 8.39000004441, 1.00000001192, 6.73000011414, -0.350000016391, 9.25999993101, 0.0799999725819, 8.42000003487, 0.0499999836087, 7.38000014469, -0.709999964535, 7.67000004232, -0.400000053644, 8.09000009656, 0.730000053048, 7.07000006318, -1.66999994695, 7.3800000903, -0.420000026673, 7.66999999389, -1.46999992833, 8.20000002384, -0.539999931157, 7.95000010431, -1.21000003457, 9.09000008613, -2.63000003517, 9.86000004053, -2.77999990925, 8.92000007883, -3.20000002906, 8.02000013992, -1.81000006512, 8.39000004441, -1.00000001192, 10.5700000095, 0.0, 8.19000013307, -1.90000000596, 8.45000002608, -1.96999992833, 9.13000004783, -0.380000002384, 7.64000011221, -0.500000000745, 8.92999995247, -1.82000005424, 8.27000008106, 1.12999998748, 7.90000003576, -1.22000000134, 8.4300001201, -0.799999967217, 8.76000002116, -1.30000000671, 8.2900000295, -1.33999990359, 8.35000016689, -0.330000042617, 8.34000016958, -0.719999977499, 9.20000008196, -0.920000040829, 8.32000014812, -1.94000002652, 7.44000022247, -0.380000074655, 6.73000011414, 0.350000016391, 8.19000013307, 1.90000000596, 9.28000028104, -2.22044604925e-16, 8.14000015095, 0.179999965876, 7.84000019416, 1.23999997139, 8.04000017628, 0.7099999623, 8.18000014246, 0.159999849051, 7.30000021011, 0.58000000909, 6.90000014529, -0.330000039637, 6.95000023618, 0.630000024736, 8.50000010356, 0.0900000041723, 8.38000015065, 0.410000082999, 9.17999995694, 0.190000016093, 9.04000005856, -1.63999998704, 10.8699999276, -0.680000003874, 9.5400000079, -0.620000031143, 8.45000008717, 0.369999885112, 9.25999993101, -0.0799999725819, 8.45000002608, 1.96999992833, 8.14000015095, -0.179999965876, 13.1899997658, -8.881784197e-16, 9.54000001684, 1.61999995515, 8.93000010595, 1.07999997854, 10.209999963, -0.750000075251, 9.69000004739, 2.47999997184, 9.35000003129, 0.700000026077, 10.3799999711, 0.489999955744, 8.89999996275, 0.740000008643, 9.69999996126, 0.390000094324, 8.44000014722, 0.020000025928, 8.30000016987, -1.48000004783, 10.3000000477, -1.67999993756, 8.2700000751, -1.12000003114, 7.67000013173, -0.590000054836, 8.42000003487, -0.0499999836087, 9.13000004783, 0.380000002384, 7.84000019416, -1.23999997139, 9.54000001684, -1.61999995515, 10.2000000864, 0.0, 8.70000013262, 0.239999956489, 9.94000003099, -0.710000077039, 8.48000012904, 1.900000038, 7.70000013709, 0.789999990761, 8.50000013337, 0.260000070333, 8.18000002697, 0.480000036657, 9.54000006005, -0.499999904633, 8.4800001432, 0.599999988824, 9.03000013053, -1.70999996006, 8.76000008076, -1.61999998942, 8.35000007749, -2.20999997944, 7.91000018135, -0.210000085235, 7.38000014469, 0.709999964535, 7.64000011221, 0.500000000745, 8.04000017628, -0.7099999623, 8.93000010595, -1.07999997854, 8.70000013262, -0.239999956489, 9.72000019431, -4.4408920985e-16, 8.63000013202, -1.0099999854, 8.43000019833, 1.13000010893, 8.98000010297, -0.149999960512, 7.93000015736, -0.00999991238117, 8.81000007778, -0.609999951869, 8.13000013426, 0.150000116974, 9.63999999225, 1.07000002518, 9.79000005782, -0.379999971092, 10.3199999201, -0.309999878854, 9.62000004083, -0.370000005811, 7.84000011668, 0.659999943674, 7.67000004232, 0.400000053644, 8.92999995247, 1.82000005424, 8.18000014246, -0.159999849051, 10.209999963, 0.750000075251, 9.94000003099, 0.710000077039, 8.63000013202, 1.0099999854, 12.7499998465, 2.22044604925e-16, 8.65000011995, 2.14000006527, 8.88999999896, 1.15, 9.01000001594, 1.01000009194, 8.88000000611, 0.950000040978, 10.0699999842, -0.539999735206, 7.99000018969, -0.910000043511, 8.35000009984, -1.84000005335, 8.8400000757, -2.67000000954, 7.60000008568, -2.64000003099, 7.82000014886, -1.00000010207, 8.09000009656, -0.730000053048, 8.27000008106, -1.12999998748, 7.30000021011, -0.58000000909, 9.69000004739, -2.47999997184, 8.48000012904, -1.900000038, 8.43000019833, -1.13000010893, 8.65000011995, -2.14000006527, 9.91000014782, 2.22044604925e-16, 8.50000008941, -1.36000009939, 8.52000015408, -0.440000047386, 8.08000007093, -0.790000001192, 8.00000011325, -0.58999997437, 9.36999998048, 1.42999999195, 10.0199999619, -1.13000003517, 9.94000001088, -0.600000029802, 7.68000004932, -1.25999998316, 7.74000013456, 0.829999877214, 7.07000006318, 1.66999994695, 7.90000003576, 1.22000000134, 6.90000014529, 0.330000039637, 9.35000003129, -0.700000026077, 7.70000013709, -0.789999990761, 8.98000010297, 0.149999960512, 8.88999999896, -1.15, 8.50000008941, 1.36000009939, 11.4399999207, 0.0, 8.92000005722, 0.0400000801682, 8.95000001788, 0.850000011921, 8.73000001952, 0.320000146627, 8.3500001058, 0.610000027865, 9.00000009611, -1.05999999881, 9.41000005245, -0.490000041425, 7.96000008598, -1.42000006989, 8.12000012651, 0.479999893606, 7.3800000903, 0.420000026673, 8.4300001201, 0.799999967217, 6.95000023618, -0.630000024736, 10.3799999711, -0.489999955744, 8.50000013337, -0.260000070333, 7.93000015736, 0.00999991238117, 9.01000001594, -1.01000009194, 8.52000015408, 0.440000047386, 8.92000005722, -0.0400000801682, 10.8300000918, 6.66133814775e-16, 8.59000007495, -0.259999953359, 8.79000011593, 0.610000128448, 8.67000000358, 0.520000014007, 9.25000000075, -0.750000015646, 10.1199999797, -0.040000025779, 8.6400000079, -0.550000047684, 7.96000012025, 0.709999901205, 7.66999999389, 1.46999992833, 8.76000002116, 1.30000000671, 8.50000010356, -0.0900000041723, 8.89999996275, -0.740000008643, 8.18000002697, -0.480000036657, 8.81000007778, 0.609999951869, 8.88000000611, -0.950000040978, 8.08000007093, 0.790000001192, 8.95000001788, -0.850000011921, 8.59000007495, 0.259999953359, 10.7799998638, 0.0, 7.87000004306, 0.790000066012, 9.1400000824, 0.839999873787, 9.67000011012, -0.810000081509, 10.0299999398, -1.02000008851, 8.66000006884, -1.97000007883, 8.24000012562, 0.099999833107, 8.20000002384, 0.539999931157, 8.2900000295, 1.33999990359, 8.38000015065, -0.410000082999, 9.69999996126, -0.390000094324, 9.54000006005, 0.499999904633, 8.13000013426, -0.150000116974, 10.0699999842, 0.539999735206, 8.00000011325, 0.58999997437, 8.73000001952, -0.320000146627, 8.79000011593, -0.610000128448, 7.87000004306, -0.790000066012, 11.2699999112, -4.4408920985e-16, 
+
+L3_cHERK_A_kn
+0.800000011921, 0.699999988079, 0.699999988079, 0.699999988079, 0.20000000298, 0.699999988079, 0.10000000149, 0.40000000596, 0.10000000149, 0.800000011921, 0.20000000298, 0.5, 0.300000011921, 0.300000011921, 0.800000011921, 0.800000011921, 0.300000011921, 0.600000023842, 0.600000023842, 0.800000011921, 0.10000000149, 0.300000011921, 0.600000023842, 0.699999988079, 0.10000000149, 0.5, 0.5, 0.800000011921, 0.300000011921, 0.10000000149, 0.10000000149, 0.5, 0.600000023842, 0.800000011921, 0.300000011921, 0.600000023842, 0.300000011921, 0.20000000298, 0.600000023842, 0.899999976158, 0.20000000298, 0.600000023842, 0.899999976158, 0.800000011921, 0.800000011921, 0.300000011921, 0.300000011921, 0.899999976158, 0.10000000149, 0.20000000298, 0.5, 0.5, 0.5, 0.20000000298, 0.5, 0.600000023842, 0.10000000149, 0.20000000298, 0.40000000596, 0.699999988079, 0.40000000596, 0.40000000596, 0.899999976158, 0.800000011921, 0.899999976158, 0.600000023842, 0.800000011921, 0.10000000149, 0.600000023842, 0.5, 0.300000011921, 0.800000011921, 0.800000011921, 0.10000000149, 0.40000000596, 0.10000000149, 0.300000011921, 0.800000011921, 0.10000000149, 0.600000023842, 0.20000000298, 0.600000023842, 0.600000023842, 0.10000000149, 0.899999976158, 0.600000023842, 0.40000000596, 0.10000000149, 0.10000000149, 0.600000023842, 0.20000000298, 0.20000000298, 0.5, 0.300000011921, 0.300000011921, 0.20000000298, 0.5, 0.800000011921, 0.800000011921, 0.699999988079, 0.10000000149, 0.300000011921, 0.10000000149, 0.5, 0.300000011921, 0.5, 0.10000000149, 0.40000000596, 0.20000000298, 0.899999976158, 0.699999988079, 0.300000011921, 0.10000000149, 0.899999976158, 0.300000011921, 0.40000000596, 0.40000000596, 0.899999976158, 0.40000000596, 0.300000011921, 0.10000000149, 0.699999988079, 0.899999976158, 0.899999976158, 0.40000000596, 0.699999988079, 0.899999976158, 0.899999976158, 0.800000011921, 0.5, 0.20000000298, 0.800000011921, 0.899999976158, 0.899999976158, 0.10000000149, 0.40000000596, 0.699999988079, 0.899999976158, 0.800000011921, 0.800000011921, 0.5, 0.600000023842, 0.40000000596, 0.5, 0.10000000149, 0.10000000149, 0.899999976158, 0.5, 0.600000023842, 0.10000000149, 0.600000023842, 0.899999976158, 0.300000011921, 0.10000000149, 0.5, 0.699999988079, 0.699999988079, 0.899999976158, 0.800000011921, 0.699999988079, 0.800000011921, 0.20000000298, 0.899999976158, 0.5, 0.600000023842, 0.800000011921, 0.300000011921, 0.899999976158, 0.10000000149, 0.800000011921, 0.300000011921, 0.40000000596, 0.10000000149, 0.899999976158, 0.899999976158, 0.899999976158, 0.600000023842, 0.300000011921, 0.699999988079, 0.699999988079, 0.600000023842, 0.699999988079, 0.300000011921, 0.600000023842, 0.40000000596, 0.899999976158, 0.699999988079, 0.800000011921, 0.699999988079, 0.699999988079, 0.600000023842, 0.300000011921, 0.800000011921, 0.10000000149, 0.699999988079, 0.600000023842, 0.300000011921, 0.20000000298, 0.20000000298, 0.899999976158, 0.40000000596, 0.800000011921, 0.10000000149, 0.800000011921, 0.600000023842, 0.10000000149, 0.5, 0.899999976158, 0.899999976158, 0.899999976158, 0.699999988079, 0.699999988079, 0.300000011921, 0.699999988079, 0.899999976158, 0.300000011921, 0.600000023842, 0.40000000596, 0.800000011921, 0.300000011921, 0.20000000298, 0.10000000149, 0.800000011921, 0.20000000298, 0.5, 0.20000000298, 0.20000000298, 0.800000011921, 0.40000000596, 0.899999976158, 0.300000011921, 0.20000000298, 0.800000011921, 0.40000000596, 0.10000000149, 0.600000023842, 0.40000000596, 0.20000000298, 0.20000000298, 0.600000023842, 0.699999988079, 0.5, 0.40000000596, 0.10000000149, 0.5, 0.10000000149, 0.20000000298, 0.40000000596, 0.699999988079, 0.20000000298, 0.20000000298, 0.600000023842, 0.20000000298, 0.600000023842, 0.5, 0.300000011921, 0.899999976158, 0.600000023842, 0.800000011921, 0.40000000596, 0.800000011921, 0.800000011921, 0.300000011921, 0.10000000149, 0.5, 0.40000000596, 0.600000023842, 0.10000000149, 0.300000011921, 0.300000011921, 0.699999988079, 0.20000000298, 0.800000011921, 0.300000011921, 0.5, 0.40000000596, 0.40000000596, 0.5, 0.40000000596, 0.300000011921, 0.300000011921, 0.5, 0.899999976158, 0.600000023842, 0.5, 0.300000011921, 0.800000011921, 0.5, 0.40000000596, 0.5, 0.699999988079, 0.20000000298, 0.10000000149, 0.40000000596, 0.699999988079, 0.600000023842, 0.10000000149, 0.40000000596, 0.20000000298, 0.20000000298, 0.699999988079, 0.800000011921, 0.899999976158, 0.699999988079, 0.300000011921, 0.5, 0.10000000149, 0.10000000149, 0.5, 0.5, 0.699999988079, 0.10000000149, 0.10000000149, 0.40000000596, 0.699999988079, 0.5, 0.699999988079, 0.5, 0.20000000298, 0.20000000298, 0.600000023842, 0.600000023842, 0.899999976158, 0.800000011921, 0.20000000298, 0.899999976158, 0.800000011921, 0.899999976158, 0.10000000149, 0.800000011921, 0.20000000298, 0.20000000298, 0.20000000298, 0.600000023842, 0.699999988079, 0.40000000596, 0.20000000298, 0.800000011921, 0.300000011921, 0.899999976158, 0.800000011921, 0.800000011921, 0.699999988079, 0.5, 0.600000023842, 0.699999988079, 0.300000011921, 0.5, 0.800000011921, 0.899999976158, 0.5, 0.600000023842, 0.800000011921, 0.10000000149, 0.699999988079, 0.300000011921, 0.40000000596, 0.899999976158, 0.5, 0.10000000149, 0.10000000149, 0.20000000298, 0.20000000298, 0.40000000596, 0.10000000149, 0.20000000298, 0.40000000596, 0.40000000596, 0.5, 0.300000011921, 0.40000000596, 0.40000000596, 0.40000000596, 0.10000000149, 0.40000000596, 0.699999988079, 0.40000000596, 0.600000023842, 0.20000000298, 0.899999976158, 0.899999976158, 0.800000011921, 0.699999988079, 0.20000000298, 0.40000000596, 0.600000023842, 0.20000000298, 0.10000000149, 0.699999988079, 0.800000011921, 0.300000011921, 0.899999976158, 0.20000000298, 0.300000011921, 0.40000000596, 0.10000000149, 0.600000023842, 0.899999976158, 0.300000011921, 0.5, 0.5, 0.20000000298, 0.20000000298, 0.600000023842, 0.20000000298, 0.10000000149, 0.899999976158, 0.699999988079, 0.800000011921, 0.5, 0.300000011921, 0.40000000596, 0.699999988079, 0.300000011921, 0.20000000298, 0.20000000298, 0.20000000298, 0.300000011921, 0.20000000298, 0.40000000596, 0.800000011921, 0.300000011921, 0.10000000149, 0.40000000596, 0.20000000298, 0.10000000149, 0.10000000149, 0.899999976158, 0.899999976158, 0.600000023842, 0.5, 0.600000023842, 0.40000000596, 0.699999988079, 0.5, 0.300000011921, 0.600000023842, 0.800000011921, 0.899999976158, 0.40000000596, 0.600000023842, 0.300000011921, 0.10000000149, 0.10000000149, 0.10000000149, 0.300000011921, 0.300000011921, 0.800000011921, 0.899999976158, 0.40000000596, 0.300000011921, 0.699999988079, 0.899999976158, 0.699999988079, 0.40000000596, 0.600000023842, 0.600000023842, 0.5, 0.40000000596, 0.300000011921, 0.300000011921, 0.40000000596, 0.40000000596, 0.800000011921, 0.899999976158, 0.800000011921, 0.40000000596, 0.20000000298, 0.5, 0.40000000596, 0.10000000149, 0.300000011921, 0.699999988079, 0.300000011921, 0.20000000298, 0.300000011921, 0.600000023842, 0.5, 0.699999988079, 0.899999976158, 0.300000011921, 0.800000011921, 0.40000000596, 0.800000011921, 0.40000000596, 0.699999988079, 0.5, 0.699999988079, 0.600000023842, 0.600000023842, 0.300000011921, 0.800000011921, 0.10000000149, 0.899999976158, 0.10000000149, 0.800000011921, 0.699999988079, 0.20000000298, 0.5, 0.300000011921, 0.899999976158, 0.300000011921, 0.800000011921, 0.300000011921, 0.300000011921, 0.5, 0.800000011921, 0.40000000596, 0.300000011921, 0.800000011921, 0.600000023842, 0.699999988079, 0.20000000298, 0.300000011921, 0.10000000149, 0.600000023842, 0.899999976158, 0.20000000298, 0.40000000596, 0.40000000596, 0.800000011921, 0.10000000149, 0.10000000149, 0.40000000596, 0.699999988079, 0.10000000149, 0.300000011921, 0.300000011921, 0.699999988079, 0.699999988079, 0.699999988079, 0.600000023842, 0.40000000596, 0.800000011921, 0.600000023842, 0.899999976158, 0.899999976158, 0.300000011921, 0.300000011921, 0.600000023842, 0.20000000298, 0.800000011921, 0.20000000298, 0.300000011921, 
+
+L3_cHERK_o_H
+10.1200002033, 0.0, 9.06000011206, 1.01000008747, 9.38000012159, 1.8700000222, 7.85000009909, 0.0500001087785, 7.68000014991, 1.76000006065, 8.82000011086, -0.359999869168, 7.2600002782, -0.339999937117, 9.7800001283, 0.660000075549, 7.39000012934, 1.17000005201, 8.74000009432, 0.37000005126, 7.46000009641, -0.329999851882, 9.24000008762, 0.740000076443, 7.36000009418, 0.680000089556, 7.92000011012, -1.27999987498, 8.54000022247, 1.51000006884, 9.15000007749, 1.46000005394, 7.17000015929, 1.26000003681, 9.06000011206, -1.01000008747, 10.5299999338, -4.4408920985e-16, 9.63000001207, -0.269999975264, 7.43000004858, -0.41999998197, 8.42000000134, 0.289999994487, 9.35000000894, -1.02999991223, 7.5500001967, -0.450000008941, 9.78000007018, -0.580000034422, 8.00000005886, 0.55000000298, 8.53999999672, 0.0900000421703, 8.11000008076, -0.679999958426, 8.8400001055, 0.649999950081, 7.76000003234, -1.39999996796, 7.48000008136, -0.949999971688, 9.20000014156, -0.119999961108, 8.94000006303, 0.170000019222, 8.49000009432, 0.819999980479, 9.38000012159, -1.8700000222, 9.63000001207, 0.269999975264, 12.2599998751, 2.22044604925e-16, 8.46000005692, -0.819999931306, 9.21999998048, 0.840000057071, 9.83000001505, -1.39999989793, 7.83000018045, -0.0599999816716, 10.0600000614, -0.420000001341, 9.0799999465, 1.22000005871, 8.9300000225, 0.259999952614, 8.18000009328, 0.0500000655651, 9.39000005335, 0.0199999983609, 8.39999998808, -0.180000034422, 7.13000013426, -1.75999996752, 10.1200000982, 0.890000042915, 9.90000006482, 0.610000068843, 7.3400001204, 0.140000028014, 7.85000009909, -0.0500001087785, 7.43000004858, 0.41999998197, 8.46000005692, 0.819999931306, 8.89999996424, 4.4408920985e-16, 7.09000005782, 0.679999968857, 8.88999999598, 0.1800000076, 6.37000014067, 0.539999997467, 9.16000005245, 0.529999974817, 7.27000010118, 0.999999972433, 7.73000001654, 0.759999961555, 7.53000002697, 0.330000023991, 9.07000005797, 2.04999992475, 7.36000003755, 0.709999948144, 6.56000004873, -0.79999999404, 7.36000016943, 1.57000002891, 8.03000004187, 0.650000038743, 6.96000003979, 0.94999999702, 7.68000014991, -1.76000006065, 8.42000000134, -0.289999994487, 9.21999998048, -0.840000057071, 7.09000005782, -0.679999968857, 10.0299999249, 0.0, 9.50000003129, -0.679999924898, 7.25000020862, 0.299999940395, 8.73000010967, -0.300000033528, 8.5500000149, 1.07000000134, 7.30000003427, -0.12000004977, 8.27000008106, 0.150000026822, 7.96000011206, 0.200000017881, 8.13999998704, 0.269999980479, 6.71000010833, -1.24999999851, 8.68000006348, 0.560000017434, 9.0100000532, 0.170000062436, 7.30000008792, 0.0999999321997, 8.82000011086, 0.359999869168, 9.35000000894, 1.02999991223, 9.83000001505, 1.39999989793, 8.88999999598, -0.1800000076, 9.50000003129, 0.679999924898, 12.1799998996, 0.0, 7.87000014067, 1.3399999252, 10.1800000396, 1.13999985591, 9.18000004634, 1.50999999359, 9.73999992073, 1.95999990419, 9.600000038, 0.78000001505, 9.63000005454, 2.18999994233, 8.40000004545, 0.510000004768, 7.87000004977, -0.710000001788, 9.62000009671, 1.71999997303, 9.37999999791, 0.940000022054, 8.11000008151, 2.11999990746, 7.2600002782, 0.339999937117, 7.5500001967, 0.450000008941, 7.83000018045, 0.0599999816716, 6.37000014067, -0.539999997467, 7.25000020862, -0.299999940395, 7.87000014067, -1.3399999252, 7.33000032425, -1.11022302463e-16, 7.27000023305, 0.73999997735, 5.60000019222, 0.220000004321, 6.91000015527, 0.740000030994, 6.76000020444, 0.170000050515, 6.97000022635, 0.900000017881, 6.84000015244, 0.719999966323, 6.39000017703, -0.779999998659, 7.76000025585, 1.34000008613, 8.0400001964, 0.260000056922, 5.22000023603, 0.460000044256, 9.7800001283, -0.660000075549, 9.78000007018, 0.580000034422, 10.0600000614, 0.420000001341, 9.16000005245, -0.529999974817, 8.73000010967, 0.300000033528, 10.1800000396, -1.13999985591, 7.27000023305, -0.73999997735, 11.4700001496, 2.22044604925e-16, 8.7500001736, 1.20000004694, 9.57000009149, 1.03000002623, 8.76000005171, -0.0599998766184, 9.76000016868, 1.3000000149, 7.49000010177, 6.33299346298e-08, 7.82000015259, -1.08999990657, 8.79000014201, 1.67000006393, 9.57000004157, 1.42000010341, 8.75000012591, 1.52000004306, 7.39000012934, -1.17000005201, 8.00000005886, -0.55000000298, 9.0799999465, -1.22000005871, 7.27000010118, -0.999999972433, 8.5500000149, -1.07000000134, 9.18000004634, -1.50999999359, 5.60000019222, -0.220000004321, 8.7500001736, -1.20000004694, 9.81999995589, -1.11022302463e-16, 7.36000005916, 0.819999958873, 7.43000014767, 0.259999986887, 8.11000012547, 0.339999996722, 6.94000006452, 0.309999998808, 6.48000017375, -0.559999969006, 7.98000010669, 0.600000014901, 8.00000008866, 1.16999997303, 7.20000011846, 0.469999994636, 8.74000009432, -0.37000005126, 8.53999999672, -0.0900000421703, 8.9300000225, -0.259999952614, 7.73000001654, -0.759999961555, 7.30000003427, 0.12000004977, 9.73999992073, -1.95999990419, 6.91000015527, -0.740000030994, 9.57000009149, -1.03000002623, 7.36000005916, -0.819999958873, 10.3999999061, 0.0, 8.70999996901, -1.18999989465, 9.77000003636, 0.139999998212, 7.42999998972, 0.289999985546, 7.06000007108, -1.08999995649, 9.22000003114, 0.649999991059, 8.22999997854, 1.14000008091, 8.34000003546, 0.519999979734, 7.46000009641, 0.329999851882, 8.11000008076, 0.679999958426, 8.18000009328, -0.0500000655651, 7.53000002697, -0.330000023991, 8.27000008106, -0.150000026822, 9.600000038, -0.78000001505, 6.76000020444, -0.170000050515, 8.76000005171, 0.0599998766184, 7.43000014767, -0.259999986887, 8.70999996901, 1.18999989465, 10.8299999756, 6.66133814775e-16, 9.21000010461, 1.86999999315, 8.91000001967, 0.659999906421, 8.54000002801, -0.929999971837, 9.0900001882, 1.64999998882, 10.0099999988, 0.779999994934, 6.97000008255, 2.28999994978, 9.24000008762, -0.740000076443, 8.8400001055, -0.649999950081, 9.39000005335, -0.0199999983609, 9.07000005797, -2.04999992475, 7.96000011206, -0.200000017881, 9.63000005454, -2.18999994233, 6.97000022635, -0.900000017881, 9.76000016868, -1.3000000149, 8.11000012547, -0.339999996722, 9.77000003636, -0.139999998212, 9.21000010461, -1.86999999315, 11.9400001428, 4.4408920985e-16, 8.92000005051, -0.240000001937, 7.99000013232, -1.83999993637, 8.68000022069, 0.59999999404, 9.52000006765, 0.23000001803, 8.24000009283, 0.620000052005, 7.36000009418, -0.680000089556, 7.76000003234, 1.39999996796, 8.39999998808, 0.180000034422, 7.36000003755, -0.709999948144, 8.13999998704, -0.269999980479, 8.40000004545, -0.510000004768, 6.84000015244, -0.719999966323, 7.49000010177, -6.33299350739e-08, 6.94000006452, -0.309999998808, 7.42999998972, -0.289999985546, 8.91000001967, -0.659999906421, 8.92000005051, 0.240000001937, 9.72999985933, 0.0, 7.15000007227, -1.3699999328, 7.80000013709, 1.88000002176, 8.7099999921, 1.46000004798, 5.64000012115, 1.53000000089, 7.92000011012, 1.27999987498, 7.48000008136, 0.949999971688, 7.13000013426, 1.75999996752, 6.56000004873, 0.79999999404, 6.71000010833, 1.24999999851, 7.87000004977, 0.710000001788, 6.39000017703, 0.779999998659, 7.82000015259, 1.08999990657, 6.48000017375, 0.559999969006, 7.06000007108, 1.08999995649, 8.54000002801, 0.929999971837, 7.99000013232, 1.83999993637, 7.15000007227, 1.3699999328, 8.03000010371, -2.22044604925e-16, 6.49000018373, 2.12000002146, 8.32000011235, 2.82999995992, 6.05000013784, 2.05999997497, 8.54000022247, -1.51000006884, 9.20000014156, 0.119999961108, 10.1200000982, -0.890000042915, 7.36000016943, -1.57000002891, 8.68000006348, -0.560000017434, 9.62000009671, -1.71999997303, 7.76000025585, -1.34000008613, 8.79000014201, -1.67000006393, 7.98000010669, -0.600000014901, 9.22000003114, -0.649999991059, 9.0900001882, -1.64999998882, 8.68000022069, -0.59999999404, 7.80000013709, -1.88000002176, 6.49000018373, -2.12000002146, 11.350000219, -4.4408920985e-16, 9.93000008136, -0.469999940991, 8.02000019878, 0.699999981374, 9.15000007749, -1.46000005394, 8.94000006303, -0.170000019222, 9.90000006482, -0.610000068843, 8.03000004187, -0.650000038743, 9.0100000532, -0.170000062436, 9.37999999791, -0.940000022054, 8.0400001964, -0.260000056922, 9.57000004157, -1.42000010341, 8.00000008866, -1.16999997303, 8.22999997854, -1.14000008091, 10.0099999988, -0.779999994934, 9.52000006765, -0.23000001803, 8.7099999921, -1.46000004798, 8.32000011235, -2.82999995992, 9.93000008136, 0.469999940991, 12.6099999139, 0.0, 7.62000009224, 1.25999993697, 7.17000015929, -1.26000003681, 8.49000009432, -0.819999980479, 7.3400001204, -0.140000028014, 6.96000003979, -0.94999999702, 7.30000008792, -0.0999999321997, 8.11000008151, -2.11999990746, 5.22000023603, -0.460000044256, 8.75000012591, -1.52000004306, 7.20000011846, -0.469999994636, 8.34000003546, -0.519999979734, 6.97000008255, -2.28999994978, 8.24000009283, -0.620000052005, 5.64000012115, -1.53000000089, 6.05000013784, -2.05999997497, 8.02000019878, -0.699999981374, 7.62000009224, -1.25999993697, 8.50000011027, 2.22044604925e-16, 
+
+L3_zHERK_A_nk
+0.2, 0.4, 0.8, 0.1, 0.1, 0.1, 0.7, 0.1, 0.7, 0.9, 0.4, 0.9, 0.5, 0.3, 0.5, 0.8, 0.3, 0.4, 0.3, 0.9, 0.3, 0.3, 0.3, 0.1, 0.9, 0.1, 0.5, 0.8, 0.5, 0.3, 0.5, 0.4, 0.1, 0.9, 0.6, 0.7, 0.4, 0.6, 0.6, 0.7, 0.6, 0.8, 0.8, 0.4, 0.4, 0.2, 0.3, 0.9, 0.7, 0.9, 0.2, 0.9, 0.9, 0.6, 0.3, 0.3, 0.2, 0.5, 0.2, 0.2, 0.9, 0.6, 0.8, 0.7, 0.5, 0.8, 0.9, 0.1, 0.8, 0.6, 0.5, 0.8, 0.1, 0.7, 0.4, 0.7, 0.1, 0.1, 0.1, 0.4, 0.7, 0.8, 0.9, 0.2, 0.4, 0.1, 0.5, 0.3, 0.5, 0.5, 0.8, 0.3, 0.3, 0.8, 0.7, 0.8, 0.4, 0.9, 0.9, 0.5, 0.3, 0.6, 0.9, 0.2, 0.8, 0.8, 0.7, 0.1, 0.4, 0.1, 0.6, 0.4, 0.2, 0.9, 0.3, 0.6, 0.3, 0.6, 0.2, 0.3, 0.6, 0.9, 0.7, 0.6, 0.4, 0.4, 0.8, 0.4, 0.6, 0.6, 0.2, 0.7, 0.6, 0.2, 0.7, 0.3, 0.5, 0.2, 0.4, 0.7, 0.8, 0.4, 0.7, 0.2, 0.5, 0.7, 0.5, 0.8, 0.6, 0.2, 0.7, 0.2, 0.7, 0.2, 0.3, 0.3, 0.5, 0.9, 0.5, 0.7, 0.3, 0.5, 0.9, 0.3, 0.1, 0.7, 0.7, 0.8, 0.3, 0.7, 0.9, 0.7, 0.8, 0.4, 0.4, 0.1, 0.2, 0.9, 0.2, 0.4, 0.6, 0.4, 0.5, 0.5, 0.1, 0.3, 0.3, 0.9, 0.3, 0.2, 0.4, 0.2, 0.6, 0.1, 0.7, 0.6, 0.6, 0.7, 0.3, 0.8, 0.3, 0.1, 0.4, 0.1, 0.7, 0.8, 0.5, 0.8, 0.1, 0.2, 0.8, 0.1, 0.5, 0.7, 0.3, 0.4, 0.3, 0.8, 0.6, 0.7, 0.7, 0.4, 0.4, 0.7, 0.7, 0.8, 0.2, 0.9, 0.6, 0.2, 0.4, 0.6, 0.7, 0.8, 0.3, 0.1, 0.6, 0.7, 0.3, 0.5, 0.2, 0.3, 0.8, 0.5, 0.1, 0.5, 0.7, 0.7, 0.6, 0.1, 0.2, 0.7, 0.3, 0.6, 0.1, 0.1, 0.4, 0.3, 0.5, 0.7, 0.1, 0.7, 0.8, 0.3, 0.1, 0.4, 0.5, 0.8, 0.5, 0.5, 0.2, 0.4, 0.2, 0.6, 0.8, 0.8, 0.4, 0.9, 0.9, 0.2, 0.3, 0.6, 0.4, 0.6, 0.1, 0.7, 0.8, 0.7, 0.7, 0.7, 0.2, 0.5, 0.3, 0.7, 0.3, 0.3, 0.4, 0.1, 0.9, 0.3, 0.6, 0.7, 0.1, 0.4, 0.7, 0.6, 0.1, 0.8, 0.1, 0.5, 0.8, 0.7, 0.8, 0.8, 0.8, 0.3, 0.8, 0.7, 0.5, 0.8, 0.8, 0.9, 0.1, 0.4, 0.3, 0.6, 0.4, 0.3, 0.8, 0.7, 0.9, 0.1, 0.6, 0.6, 0.1, 0.5, 0.5, 0.7, 0.9, 0.8, 0.6, 0.3, 0.2, 0.8, 0.8, 0.3, 0.4, 0.5, 0.3, 0.6, 0.4, 0.4, 0.2, 0.3, 0.7, 0.9, 0.2, 0.1, 0.5, 0.7, 0.9, 0.4, 0.6, 0.2, 0.5, 0.6, 0.9, 0.5, 0.4, 0.8, 0.6, 0.5, 0.4, 0.7, 0.8, 0.9, 0.4, 0.6, 0.8, 0.2, 0.3, 0.6, 0.2, 0.8, 0.4, 0.9, 0.9, 0.3, 0.5, 0.1, 0.6, 0.5, 0.3, 0.3, 0.3, 0.8, 0.6, 0.4, 0.4, 0.3, 0.6, 0.7, 0.2, 0.5, 0.1, 0.1, 0.7, 0.8, 0.2, 0.5, 0.1, 0.1, 0.3, 0.3, 0.5, 0.4, 0.8, 0.1, 0.7, 0.5, 0.9, 0.6, 0.2, 0.7, 0.1, 0.9, 0.5, 0.7, 0.3, 0.9, 0.7, 0.3, 0.2, 0.4, 0.8, 0.1, 0.5, 0.4, 0.5, 0.3, 0.1, 0.6, 0.1, 0.4, 0.3, 0.8, 0.8, 0.7, 0.9, 0.5, 0.6, 0.5, 0.5, 0.8, 0.2, 0.5, 0.3, 0.2, 0.4, 0.2, 0.1, 0.4, 0.9, 0.8, 0.2, 0.3, 0.1, 0.3, 0.6, 0.1, 0.3, 0.2, 0.1, 0.5, 0.2, 0.6, 0.5, 0.3, 0.3, 0.2, 0.4, 0.5, 0.9, 0.5, 0.9, 0.1, 0.3, 0.4, 0.8, 0.9, 0.3, 0.2, 0.1, 0.1, 0.8, 0.1, 0.1, 0.7, 0.1, 0.3, 0.8, 0.7, 0.7, 0.4, 0.5, 0.1, 0.2, 0.3, 0.6, 0.8, 0.8, 0.8, 0.1, 0.7, 0.4, 0.9, 0.9, 0.3, 0.8, 0.2, 0.8, 0.6, 0.9, 0.9, 0.4, 0.7, 0.3, 0.1, 0.9, 0.8, 0.2, 0.9, 0.2, 0.6, 0.3, 0.7, 0.7, 0.3, 0.5, 0.7, 0.1, 0.2, 0.4, 0.6, 
+
+L3_zHERK_C_nn
+0.7, 0.0, 0.5, 0.7, 0.2, 0.9, 0.9, 0.8, 0.6, 0.9, 0.6, 0.4, 0.3, 0.1, 0.7, 0.4, 0.6, 0.3, 0.1, 0.4, 0.4, 0.7, 0.6, 0.8, 0.1, 0.4, 0.6, 0.7, 0.8, 0.1, 0.6, 0.5, 0.8, 0.4, 0.5, -0.7, 0.9, 0.0, 0.3, 0.2, 0.1, 0.5, 0.1, 0.2, 0.7, 0.7, 0.1, 0.1, 0.9, 0.2, 0.1, 0.4, 0.7, 0.3, 0.9, 0.9, 0.8, 0.4, 0.1, 0.2, 0.4, 0.4, 0.2, 0.3, 0.4, 0.7, 0.3, 0.1, 0.2, -0.9, 0.3, -0.2, 0.1, 0.0, 0.4, 0.3, 0.8, 0.6, 0.4, 0.1, 0.8, 0.2, 0.9, 0.4, 0.2, 0.2, 0.6, 0.5, 0.8, 0.4, 0.2, 0.5, 0.3, 0.9, 0.9, 0.6, 0.3, 0.7, 0.2, 0.7, 0.5, 0.2, 0.9, -0.8, 0.1, -0.5, 0.4, -0.3, 0.4, 0.0, 0.4, 0.3, 0.9, 0.4, 0.5, 0.2, 0.9, 0.7, 0.4, 0.2, 0.2, 0.5, 0.8, 0.2, 0.5, 0.2, 0.8, 0.3, 0.9, 0.1, 0.8, 0.5, 0.6, 0.7, 0.2, 0.4, 0.6, -0.9, 0.1, -0.2, 0.8, -0.6, 0.4, -0.3, 0.1, 0.0, 0.2, 0.8, 0.9, 0.8, 0.6, 0.8, 0.9, 0.6, 0.5, 0.7, 0.1, 0.1, 0.7, 0.1, 0.8, 0.3, 0.3, 0.3, 0.4, 0.2, 0.2, 0.9, 0.5, 0.5, 0.6, -0.4, 0.7, -0.7, 0.4, -0.1, 0.9, -0.4, 0.2, -0.8, 0.9, 0.0, 0.1, 0.3, 0.5, 0.1, 0.4, 0.5, 0.2, 0.6, 0.3, 0.7, 0.7, 0.7, 0.4, 0.9, 0.9, 0.2, 0.3, 0.7, 0.2, 0.5, 0.9, 0.8, 0.3, -0.1, 0.1, -0.1, 0.8, -0.2, 0.5, -0.2, 0.9, -0.8, 0.1, -0.3, 0.2, 0.0, 0.1, 0.1, 0.3, 0.5, 0.6, 0.2, 0.7, 0.2, 0.2, 0.6, 0.7, 0.1, 0.7, 0.8, 0.3, 0.5, 0.6, 0.6, 0.9, 0.3, 0.7, -0.4, 0.9, -0.2, 0.9, -0.4, 0.9, -0.7, 0.6, -0.8, 0.5, -0.1, 0.1, -0.1, 0.1, 0.0, 0.8, 0.3, 0.9, 0.7, 0.8, 0.8, 0.6, 0.3, 0.6, 0.9, 0.9, 0.1, 0.8, 0.6, 0.7, 0.2, 0.1, 0.1, 0.6, -0.3, 0.1, -0.4, 0.2, -0.2, 0.4, -0.2, 0.9, -0.6, 0.4, -0.5, 0.3, -0.5, 0.8, -0.3, 0.5, 0.0, 0.7, 0.1, 0.9, 0.1, 0.8, 0.8, 0.9, 0.9, 0.3, 0.7, 0.3, 0.4, 0.1, 0.6, 0.5, 0.9, 0.1, -0.4, 0.7, -0.3, 0.6, -0.5, 0.2, -0.5, 0.5, -0.7, 0.2, -0.6, 0.6, -0.2, 0.9, -0.7, 0.7, -0.1, 0.3, 0.0, 0.2, 0.2, 0.9, 0.7, 0.7, 0.8, 0.9, 0.2, 0.3, 0.2, 0.6, 0.7, 0.1, 0.2, 0.4, -0.7, 0.9, -0.9, 0.8, -0.4, 0.8, -0.2, 0.1, -0.1, 0.3, -0.7, 0.7, -0.2, 0.8, -0.8, 0.9, -0.1, 0.2, -0.2, 0.7, 0.0, 0.2, 0.7, 0.4, 0.8, 0.4, 0.4, 0.1, 0.6, 0.5, 0.4, 0.9, 0.3, 0.6, -0.8, 0.8, -0.4, 0.2, -0.5, 0.5, -0.2, 0.7, -0.1, 0.7, -0.7, 0.2, -0.6, 0.6, -0.3, 0.8, -0.8, 0.9, -0.7, 0.2, -0.7, 0.7, 0.0, 0.4, 0.1, 0.1, 0.8, 0.5, 0.8, 0.8, 0.2, 0.9, 0.8, 0.1, -0.4, 0.1, -0.2, 0.3, -0.9, 0.8, -0.3, 0.8, -0.3, 0.4, -0.9, 0.7, -0.1, 0.6, -0.9, 0.9, -0.9, 0.7, -0.8, 0.4, -0.8, 0.4, -0.1, 0.1, 0.0, 0.4, 0.8, 0.7, 0.5, 0.3, 0.2, 0.8, 0.5, 0.6, -0.7, 0.4, -0.4, 0.9, -0.6, 0.9, -0.1, 0.3, -0.3, 0.9, -0.2, 0.7, -0.8, 0.9, -0.1, 0.3, -0.7, 0.9, -0.2, 0.4, -0.4, 0.1, -0.8, 0.4, -0.8, 0.9, 0.0, 0.5, 0.8, 0.2, 0.1, 0.3, 0.1, 0.8, -0.1, 0.2, -0.3, 0.3, -0.7, 0.8, -0.5, 0.4, -0.2, 0.3, -0.7, 0.3, -0.5, 0.8, -0.6, 0.3, -0.4, 0.3, -0.2, 0.1, -0.6, 0.5, -0.8, 0.7, -0.5, 0.5, -0.8, 0.1, 0.0, 0.1, 0.4, 0.7, 0.9, 0.6, -0.5, 0.4, -0.7, 0.2, -0.7, 0.6, -0.7, 0.2, -0.9, 0.2, -0.5, 0.6, -0.6, 0.7, -0.2, 0.1, -0.6, 0.6, -0.7, 0.5, -0.4, 0.8, -0.2, 0.3, -0.2, 0.2, -0.1, 0.1, -0.4, 0.9, 0.0, 0.9, 0.1, 0.8, -0.4, 0.3, -0.1, 0.5, -0.2, 0.2, -0.4, 0.5, -0.5, 0.9, -0.8, 0.9, -0.3, 0.1, -0.1, 0.5, -0.9, 0.1, -0.2, 0.9, -0.3, 0.9, -0.8, 0.8, -0.5, 0.3, -0.1, 0.7, -0.9, 0.9, -0.1, 0.7, 0.0, 
+
+L3_zHERK_o_N
+9.46, 2.77555756156e-17, 8.78, -0.52, 7.37, 0.5, 9.1, 0.78, 8.0, 1.13, 7.71, -0.25, 6.62, -0.52, 7.27, -0.54, 8.0, -1.08, 7.26, -0.13, 7.88, 1.1, 8.01, 0.59, 6.33, -0.43, 7.08, -0.44, 6.11, -0.23, 7.6, 0.41, 9.0, -0.3, 8.78, 0.52, 13.01, 7.77156117238e-16, 9.56, 1.07, 10.12, 1.94, 9.12, 1.61, 9.41, 0.75, 8.4, 0.9, 8.68, 0.64, 9.16, -0.44, 10.22, 0.5, 10.32, 2.16, 10.32, 0.75, 7.96, 1.08, 8.89, 0.67, 7.34, 1.8, 9.5, 1.88, 10.01, 0.32, 7.37, -0.5, 9.56, -1.07, 10.62, -1.66533453694e-15, 9.08, 0.18, 8.88, 0.93, 8.05, -1.11, 8.53, -0.34, 7.91, -0.22, 8.55, -1.58, 9.01, 0.17, 9.1, 0.22, 8.45, -0.29, 7.76, 0.69, 9.62, 0.37, 6.44, 0.49, 8.23, 1.31, 8.88, -0.53, 9.1, -0.78, 10.12, -1.94, 9.08, -0.18, 11.22, -9.43689570931e-16, 8.56, 0.91, 9.31, -0.99, 8.41, -0.42, 8.44, 4.4408920985e-16, 9.02, -1.51, 9.12, 0.41, 9.78, 0.65, 9.67, -0.29, 8.07, -0.03, 8.66, -0.97, 7.48, 0.32, 9.12, 1.33, 9.51, -0.24, 8.0, -1.13, 9.12, -1.61, 8.88, -0.93, 8.56, -0.91, 9.67, -4.99600361081e-16, 7.44, -0.17, 8.18, -0.02, 8.22, -0.66, 9.32, -0.9, 9.26, -0.45, 8.56, -0.82, 9.38, -1.29, 8.0, -0.49, 8.16, -0.66, 6.43, -0.55, 8.22, 0.74, 9.43, -0.91, 7.71, 0.25, 9.41, -0.75, 8.05, 1.11, 9.31, 0.99, 7.44, 0.17, 10.02, -1.11022302463e-16, 7.29, 0.25, 7.24, -0.28, 8.38, -0.11, 7.71, 1.36, 7.99, 1.71, 8.67, 0.86, 7.33, 1.04, 8.44, -0.46, 6.3, 0.85, 7.28, 1.2, 9.21, 1.13, 6.62, 0.52, 8.4, -0.9, 8.53, 0.34, 8.41, 0.42, 8.18, 0.02, 7.29, -0.25, 9.86, -3.33066907388e-16, 7.42, -1.1, 8.32, -0.64, 8.84, -0.57, 8.41, -0.65, 8.86, 0.64, 6.75, 0.42, 9.21, 0.47, 7.13, 0.27, 7.64, 1.92, 8.18, -0.33, 7.27, 0.54, 8.68, -0.64, 7.91, 0.22, 8.44, 4.4408920985e-16, 8.22, 0.66, 7.24, 0.28, 7.42, 1.1, 9.05, 1.31838984174e-16, 8.14, 0.31, 8.63, 0.64, 9.37, 0.56, 8.86, 1.49, 6.91, 1.23, 8.27, 0.32, 6.53, 1.19, 7.78, 1.81, 8.27, -0.38, 8.0, 1.08, 9.16, 0.44, 8.55, 1.58, 9.02, 1.51, 9.32, 0.9, 8.38, 0.11, 8.32, 0.64, 8.14, -0.31, 10.58, 0.0, 9.41, 0.5, 9.05, 1.26, 9.51, 1.11, 7.78, 1.04, 8.73, 1.76, 6.19, 1.38, 7.49, 2.47, 9.19, 1.03, 7.26, 0.13, 10.22, -0.5, 9.01, -0.17, 9.12, -0.41, 9.26, 0.45, 7.71, -1.36, 8.84, 0.57, 8.63, -0.64, 9.41, -0.5, 11.34, -6.66133814775e-16, 9.51, 0.38, 10.12, 0.57, 8.08, 0.53, 8.59, 0.29, 6.68, 0.51, 8.02, 1.78, 9.44, -0.63, 7.88, -1.1, 10.32, -2.16, 9.1, -0.22, 9.78, -0.65, 8.56, 0.82, 7.99, -1.71, 8.41, 0.65, 9.37, -0.56, 9.05, -1.26, 9.51, -0.38, 11.18, -1.11022302463e-16, 8.95, 1.11, 7.2, 0.54, 8.1, 0.3, 6.33, 1.08, 7.92, 1.19, 10.12, -0.93, 8.01, -0.59, 10.32, -0.75, 8.45, 0.29, 9.67, 0.29, 9.38, 1.29, 8.67, -0.86, 8.86, -0.64, 8.86, -1.49, 9.51, -1.11, 10.12, -0.57, 8.95, -1.11, 11.8, -7.21644966006e-16, 7.92, 0.65, 8.35, 0.48, 6.89, 0.66, 9.39, 1.45, 10.24, -0.11, 6.33, 0.43, 7.96, -1.08, 7.76, -0.69, 8.07, 0.03, 8.0, 0.49, 7.33, -1.04, 6.75, -0.42, 6.91, -1.23, 7.78, -1.04, 8.08, -0.53, 7.2, -0.54, 7.92, -0.65, 7.71, -8.04911692853e-16, 7.16, 0.53, 5.91, 0.42, 6.94, 0.47, 8.62, 0.02, 7.08, 0.44, 8.89, -0.67, 9.62, -0.37, 8.66, 0.97, 8.16, 0.66, 8.44, 0.46, 9.21, -0.47, 8.27, -0.32, 8.73, -1.76, 8.59, -0.29, 8.1, -0.3, 8.35, -0.48, 7.16, -0.53, 11.03, 3.33066907388e-16, 7.23, 0.53, 8.38, 1.54, 8.12, 0.28, 6.11, 0.23, 7.34, -1.8, 6.44, -0.49, 7.48, -0.32, 6.43, 0.55, 6.3, -0.85, 7.13, -0.27, 6.53, -1.19, 6.19, -1.38, 6.68, -0.51, 6.33, -1.08, 6.89, -0.66, 5.91, -0.42, 7.23, -0.53, 6.76, 4.16333634234e-16, 6.15, 1.06, 6.56, 0.85, 7.6, -0.41, 9.5, -1.88, 8.23, -1.31, 9.12, -1.33, 8.22, -0.74, 7.28, -1.2, 7.64, -1.92, 7.78, -1.81, 7.49, -2.47, 8.02, -1.78, 7.92, -1.19, 9.39, -1.45, 6.94, -0.47, 8.38, -1.54, 6.15, -1.06, 10.74, 4.4408920985e-16, 8.97, -1.05, 9.0, 0.3, 10.01, -0.32, 8.88, 0.53, 9.51, 0.24, 9.43, 0.91, 9.21, -1.13, 8.18, 0.33, 8.27, 0.38, 9.19, -1.03, 9.44, 0.63, 10.12, 0.93, 10.24, 0.11, 8.62, -0.02, 8.12, -0.28, 6.56, -0.85, 8.97, 1.05, 12.29, 5.55111512313e-16, 
+
+L3_zHERK_A_kn
+0.4, 0.7, 0.5, 0.5, 0.2, 0.2, 0.3, 0.6, 0.3, 0.5, 0.1, 0.2, 0.2, 0.2, 0.7, 0.4, 0.1, 0.1, 0.6, 0.7, 0.3, 0.8, 0.2, 0.2, 0.4, 0.4, 0.3, 0.7, 0.1, 0.3, 0.9, 0.1, 0.5, 0.7, 0.1, 0.5, 0.6, 0.8, 0.9, 0.1, 0.4, 0.9, 0.7, 0.5, 0.8, 0.7, 0.7, 0.6, 0.1, 0.6, 0.8, 0.8, 0.4, 0.6, 0.4, 0.2, 0.6, 0.8, 0.5, 0.6, 0.8, 0.2, 0.3, 0.3, 0.2, 0.8, 0.2, 0.7, 0.4, 0.2, 0.9, 0.3, 0.2, 0.3, 0.6, 0.6, 0.2, 0.4, 0.4, 0.2, 0.6, 0.9, 0.2, 0.2, 0.6, 0.4, 0.7, 0.4, 0.8, 0.8, 0.5, 0.8, 0.5, 0.1, 0.6, 0.3, 0.5, 0.4, 0.6, 0.4, 0.8, 0.5, 0.9, 0.6, 0.3, 0.5, 0.1, 0.9, 0.8, 0.6, 0.6, 0.7, 0.3, 0.6, 0.2, 0.3, 0.3, 0.5, 0.9, 0.2, 0.1, 0.9, 0.4, 0.4, 0.7, 0.8, 0.6, 0.2, 0.7, 0.8, 0.6, 0.1, 0.3, 0.7, 0.6, 0.2, 0.8, 0.7, 0.6, 0.5, 0.4, 0.9, 0.5, 0.9, 0.9, 0.6, 0.4, 0.6, 0.8, 0.5, 0.7, 0.1, 0.8, 0.1, 0.1, 0.3, 0.5, 0.4, 0.4, 0.4, 0.3, 0.3, 0.7, 0.4, 0.9, 0.3, 0.7, 0.9, 0.7, 0.6, 0.5, 0.4, 0.4, 0.6, 0.9, 0.3, 0.8, 0.9, 0.2, 0.6, 0.6, 0.6, 0.8, 0.5, 0.6, 0.7, 0.6, 0.7, 0.5, 0.7, 0.9, 0.9, 0.7, 0.4, 0.3, 0.8, 0.1, 0.9, 0.6, 0.1, 0.2, 0.1, 0.6, 0.3, 0.3, 0.9, 0.9, 0.1, 0.8, 0.9, 0.3, 0.5, 0.1, 0.7, 0.7, 0.7, 0.4, 0.9, 0.9, 0.5, 0.6, 0.4, 0.4, 0.5, 0.8, 0.4, 0.3, 0.2, 0.5, 0.5, 0.3, 0.4, 0.1, 0.4, 0.7, 0.1, 0.7, 0.7, 0.9, 0.2, 0.5, 0.4, 0.9, 0.2, 0.1, 0.5, 0.8, 0.6, 0.1, 0.5, 0.4, 0.5, 0.3, 0.3, 0.1, 0.2, 0.6, 0.9, 0.4, 0.5, 0.6, 0.2, 0.1, 0.3, 0.2, 0.9, 0.6, 0.7, 0.7, 0.4, 0.3, 0.2, 0.1, 0.4, 0.1, 0.2, 0.5, 0.3, 0.9, 0.2, 0.7, 0.3, 0.8, 0.1, 0.4, 0.1, 0.9, 0.3, 0.9, 0.4, 0.1, 0.3, 0.9, 0.5, 0.8, 0.6, 0.7, 0.1, 0.6, 0.5, 0.3, 0.8, 0.3, 0.3, 0.6, 0.3, 0.2, 0.2, 0.2, 0.6, 0.7, 0.2, 0.2, 0.7, 0.3, 0.4, 0.7, 0.3, 0.8, 0.8, 0.9, 0.7, 0.7, 0.4, 0.5, 0.2, 0.4, 0.1, 0.2, 0.8, 0.1, 0.1, 0.9, 0.1, 0.8, 0.5, 0.9, 0.2, 0.6, 0.8, 0.9, 0.1, 0.6, 0.8, 0.1, 0.6, 0.5, 0.9, 0.6, 0.3, 0.9, 0.6, 0.2, 0.7, 0.7, 0.1, 0.5, 0.3, 0.9, 0.8, 0.3, 0.4, 0.8, 0.9, 0.3, 0.6, 0.1, 0.7, 0.4, 0.5, 0.6, 0.2, 0.4, 0.2, 0.9, 0.9, 0.8, 0.4, 0.7, 0.7, 0.8, 0.6, 0.7, 0.7, 0.7, 0.4, 0.6, 0.3, 0.2, 0.7, 0.2, 0.2, 0.2, 0.6, 0.2, 0.3, 0.5, 0.7, 0.6, 0.4, 0.1, 0.2, 0.4, 0.7, 0.7, 0.3, 0.1, 0.6, 0.6, 0.1, 0.4, 0.9, 0.4, 0.9, 0.9, 0.1, 0.8, 0.6, 0.7, 0.5, 0.7, 0.2, 0.2, 0.9, 0.2, 0.6, 0.7, 0.2, 0.2, 0.1, 0.9, 0.7, 0.8, 0.8, 0.6, 0.7, 0.1, 0.9, 0.5, 0.6, 0.3, 0.5, 0.4, 0.3, 0.9, 0.3, 0.7, 0.1, 0.7, 0.5, 0.5, 0.2, 0.6, 0.6, 0.8, 0.5, 0.6, 0.1, 0.2, 0.4, 0.9, 0.2, 0.1, 0.9, 0.7, 0.2, 0.6, 0.9, 0.8, 0.8, 0.8, 0.7, 0.9, 0.8, 0.8, 0.6, 0.1, 0.1, 0.7, 0.9, 0.8, 0.5, 0.5, 0.2, 0.7, 0.8, 0.9, 0.8, 0.3, 0.5, 0.9, 0.6, 0.5, 0.7, 0.7, 0.3, 0.5, 0.5, 0.3, 0.6, 0.9, 0.8, 0.5, 0.1, 0.9, 0.2, 0.3, 0.5, 0.9, 0.5, 0.4, 0.5, 0.6, 0.5, 0.5, 0.1, 0.8, 0.9, 0.2, 0.5, 0.1, 0.1, 0.2, 0.8, 0.4, 0.8, 0.8, 0.7, 0.9, 0.2, 0.9, 0.6, 0.8, 0.1, 0.6, 0.8, 0.8, 0.4, 0.1, 0.8, 0.7, 0.6, 0.2, 0.8, 
+
+L3_zHERK_o_H
+10.01, -1.11022302463e-16, 8.04, 0.77, 7.53, 1.36, 9.86, 1.94, 8.93, 1.85, 7.68, 0.77, 7.58, 0.63, 7.69, 0.21, 6.88, -0.82, 7.57, 2.06, 7.2, 0.95, 8.53, 1.49, 6.7, 0.76, 7.32, 2.07, 7.69, 1.13, 8.25, 7.77156117238e-16, 8.31, 0.63, 8.04, -0.77, 12.03, -2.77555756156e-16, 9.18, -0.21, 10.13, 1.27, 9.05, 0.33, 9.86, 0.29, 8.91, 0.99, 9.79, -0.12, 8.31, -0.23, 9.8, 0.01, 8.97, 1.79, 10.49, 0.1, 9.07, 0.73, 8.88, 0.5, 8.26, 0.59, 9.68, 0.31, 9.31, 0.84, 7.53, -1.36, 9.18, 0.21, 10.96, -4.57966997658e-16, 9.17, 1.17, 9.59, 1.29, 9.35, 0.33, 9.24, 1.36, 9.16, 1.0, 7.35, 0.36, 8.77, 1.51, 8.31, 1.2, 9.09, 0.69, 7.85, 1.75, 8.94, 1.45, 7.96, 1.64, 8.36, 0.51, 8.45, 1.08, 9.86, -1.94, 10.13, -1.27, 9.17, -1.17, 13.39, -1.88737914186e-15, 10.16, 0.35, 10.6, -0.52, 10.62, -0.45, 9.87, 0.21, 9.41, -1.29, 9.78, -0.33, 10.33, -0.18, 11.23, -0.2, 10.43, 0.84, 10.46, 0.05, 9.12, 0.53, 9.69, -0.68, 9.9, 0.15, 8.93, -1.85, 9.05, -0.33, 9.59, -1.29, 10.16, -0.35, 10.27, -1.02695629778e-15, 9.17, 0.4, 9.49, 0.39, 9.08, 0.1, 8.67, -0.59, 8.71, 0.71, 7.63, -0.55, 9.97, 0.22, 9.1, 0.03, 8.67, 0.49, 8.41, 0.45, 8.41, 0.46, 8.89, 0.14, 7.68, -0.77, 9.86, -0.29, 9.35, -0.33, 10.6, 0.52, 9.17, -0.4, 11.19, -2.15105711021e-16, 8.81, 0.94, 9.06, 0.24, 8.49, 0.57, 8.57, 0.77, 8.08, 1.11, 9.75, 1.82, 9.01, 1.66, 9.15, 0.56, 7.79, 1.04, 8.39, 0.19, 9.32, 1.19, 7.58, -0.63, 8.91, -0.99, 9.24, -1.36, 10.62, 0.45, 9.49, -0.39, 8.81, -0.94, 10.46, 6.93889390391e-16, 8.13, -0.6, 8.21, -0.7, 8.57, -0.97, 8.69, -0.44, 9.04, 0.52, 8.5, 0.32, 8.89, 0.41, 8.36, 0.45, 8.83, -0.61, 9.73, 0.18, 7.69, -0.21, 9.79, 0.12, 9.16, -1.0, 9.87, -0.21, 9.08, -0.1, 9.06, -0.24, 8.13, 0.6, 10.55, 8.881784197e-16, 9.18, -0.27, 8.8, 0.71, 8.64, 1.27, 9.02, 0.29, 8.64, 1.06, 8.73, 0.43, 8.85, 1.43, 8.98, -0.59, 9.31, 1.12, 6.88, 0.82, 8.31, 0.23, 7.35, -0.36, 9.41, 1.29, 8.67, 0.59, 8.49, -0.57, 8.21, 0.7, 9.18, 0.27, 9.75, -2.22044604925e-16, 7.49, 0.3, 9.04, 0.42, 9.22, 1.67, 8.84, 1.11, 8.29, 1.01, 7.59, 1.17, 7.48, 1.24, 8.64, 1.9, 7.57, -2.06, 9.8, -0.01, 8.77, -1.51, 9.78, 0.33, 8.71, -0.71, 8.57, -0.77, 8.57, 0.97, 8.8, -0.71, 7.49, -0.3, 10.61, 7.77156117238e-16, 8.09, 0.83, 9.94, 0.39, 8.31, 2.05, 9.55, 1.33, 7.39, 0.94, 8.81, -0.02, 7.92, 0.78, 7.2, -0.95, 8.97, -1.79, 8.31, -1.2, 10.33, 0.18, 7.63, 0.55, 8.08, -1.11, 8.69, 0.44, 8.64, -1.27, 9.04, -0.42, 8.09, -0.83, 10.62, -1.11022302463e-16, 8.29, 0.25, 8.29, 0.68, 8.87, 0.59, 7.17, 0.52, 8.0, -0.98, 9.15, -0.06, 8.53, -1.49, 10.49, -0.1, 9.09, -0.69, 11.23, 0.2, 9.97, -0.22, 9.75, -1.82, 9.04, -0.52, 9.02, -0.29, 9.22, -1.67, 9.94, -0.39, 8.29, -0.25, 12.1, -2.22044604925e-16, 8.66, 0.56, 8.53, 1.48, 8.33, 1.41, 9.35, -1.11022302463e-16, 9.33, 0.75, 6.7, -0.76, 9.07, -0.73, 7.85, -1.75, 10.43, -0.84, 9.1, -0.03, 9.01, -1.66, 8.5, -0.32, 8.64, -1.06, 8.84, -1.11, 8.31, -2.05, 8.29, -0.68, 8.66, -0.56, 9.59, 5.55111512313e-16, 8.68, 0.76, 7.94, 0.92, 8.05, -0.41, 9.01, 0.65, 7.32, -2.07, 8.88, -0.5, 8.94, -1.45, 10.46, -0.05, 8.67, -0.49, 9.15, -0.56, 8.89, -0.41, 8.73, -0.43, 8.29, -1.01, 9.55, -1.33, 8.87, -0.59, 8.53, -1.48, 8.68, -0.76, 11.48, -8.32667268469e-16, 8.48, 1.14, 8.39, -0.25, 8.31, 0.5, 7.69, -1.13, 8.26, -0.59, 7.96, -1.64, 9.12, -0.53, 8.41, -0.45, 7.79, -1.04, 8.36, -0.45, 8.85, -1.43, 7.59, -1.17, 7.39, -0.94, 7.17, -0.52, 8.33, -1.41, 7.94, -0.92, 8.48, -1.14, 9.58, 1.94289029309e-16, 7.84, -0.73, 9.21, 1.0, 8.25, -6.66133814775e-16, 9.68, -0.31, 8.36, -0.51, 9.69, 0.68, 8.41, -0.46, 8.39, -0.19, 8.83, 0.61, 8.98, 0.59, 7.48, -1.24, 8.81, 0.02, 8.0, 0.98, 9.35, 1.05471187339e-15, 8.05, 0.41, 8.39, 0.25, 7.84, 0.73, 11.26, 1.05471187339e-15, 9.34, 1.56, 8.31, -0.63, 9.31, -0.84, 8.45, -1.08, 9.9, -0.15, 8.89, -0.14, 9.32, -1.19, 9.73, -0.18, 9.31, -1.12, 8.64, -1.9, 7.92, -0.78, 9.15, 0.06, 9.33, -0.75, 9.01, -0.65, 8.31, -0.5, 9.21, -1.0, 9.34, -1.56, 10.77, 5.55111512313e-17, 
+
+L3_sSYR2K_A_nk
+0.2, 0.7, 0.6, 0.9, 0.4, 0.3, 0.2, 0.1, 0.7, 0.8, 0.2, 0.7, 0.2, 0.7, 0.7, 0.4, 0.1, 0.4, 0.6, 0.3, 0.2, 0.7, 0.2, 0.8, 0.7, 0.1, 0.8, 0.6, 0.2, 0.9, 0.5, 0.1, 0.3, 0.1, 0.4, 0.4, 0.7, 0.4, 0.4, 0.5, 0.1, 0.7, 0.2, 0.5, 0.6, 0.7, 0.9, 0.9, 0.3, 0.2, 0.9, 0.7, 0.7, 0.7, 0.3, 0.2, 0.3, 0.1, 0.7, 0.2, 0.1, 0.5, 0.3, 0.3, 0.4, 0.1, 0.8, 0.6, 0.1, 0.9, 0.9, 0.3, 0.3, 0.9, 0.4, 0.7, 0.4, 0.4, 0.6, 0.4, 0.9, 0.4, 0.2, 0.8, 0.2, 0.2, 0.4, 0.4, 0.4, 0.9, 0.1, 0.9, 0.4, 0.8, 0.6, 0.1, 0.9, 0.4, 0.9, 0.9, 0.8, 0.9, 0.5, 0.4, 0.9, 0.3, 0.4, 0.7, 0.3, 0.6, 0.9, 0.4, 0.1, 0.2, 0.2, 0.5, 0.2, 0.8, 0.9, 0.7, 0.1, 0.3, 0.9, 0.1, 0.4, 0.9, 0.2, 0.3, 0.1, 0.3, 0.9, 0.7, 0.3, 0.6, 0.5, 0.4, 0.1, 0.8, 0.9, 0.5, 0.7, 0.9, 0.1, 0.1, 0.6, 0.2, 0.4, 0.1, 0.1, 0.6, 0.6, 0.2, 0.7, 0.3, 0.4, 0.1, 0.7, 0.2, 0.1, 0.7, 0.9, 0.2, 0.1, 0.8, 0.6, 0.8, 0.8, 0.6, 0.4, 0.8, 0.4, 0.9, 0.1, 0.4, 0.1, 0.1, 0.2, 0.3, 0.4, 0.1, 0.9, 0.5, 0.9, 0.8, 0.1, 0.4, 0.6, 0.7, 0.1, 0.3, 0.7, 0.6, 0.1, 0.7, 0.9, 0.2, 0.5, 0.6, 0.3, 0.7, 0.8, 0.3, 0.9, 0.4, 0.5, 0.4, 0.4, 0.6, 0.5, 0.7, 0.6, 0.5, 0.4, 0.7, 0.8, 0.5, 0.8, 0.1, 0.3, 0.8, 0.8, 0.8, 0.4, 0.7, 0.6, 0.3, 0.5, 0.4, 0.9, 0.2, 0.8, 0.3, 0.8, 0.4, 0.1, 0.6, 0.5, 0.3, 0.2, 0.3, 0.3, 0.9, 0.7, 0.8, 0.5, 0.5, 0.3, 0.9, 0.3, 0.9, 0.7, 0.3, 0.1, 0.4, 0.9, 0.9, 0.5, 0.3, 0.9, 0.5, 0.1, 0.5, 0.2, 0.6, 0.7, 0.8, 0.8, 0.5, 0.8, 0.5, 0.2, 0.8, 
+
+L3_sSYR2K_B_nk
+0.3, 0.8, 0.6, 0.5, 0.7, 0.4, 0.3, 0.3, 0.6, 0.3, 0.5, 0.6, 0.6, 0.2, 0.1, 0.6, 0.5, 0.7, 0.4, 0.5, 0.7, 0.1, 0.4, 0.2, 0.9, 0.9, 0.5, 0.5, 0.5, 0.3, 0.2, 0.9, 0.9, 0.1, 0.9, 0.8, 0.2, 0.9, 0.1, 0.6, 0.4, 0.5, 0.5, 0.4, 0.1, 0.3, 0.9, 0.9, 0.8, 0.1, 0.5, 0.2, 0.7, 0.4, 0.5, 0.6, 0.1, 0.4, 0.1, 0.5, 0.7, 0.9, 0.6, 0.5, 0.2, 0.8, 0.2, 0.6, 0.4, 0.1, 0.9, 0.1, 0.7, 0.7, 0.9, 0.3, 0.3, 0.5, 0.2, 0.1, 0.2, 0.2, 0.2, 0.3, 0.3, 0.9, 0.2, 0.9, 0.5, 0.1, 0.7, 0.7, 0.9, 0.6, 0.6, 0.9, 0.8, 0.7, 0.6, 0.6, 0.5, 0.4, 0.4, 0.9, 0.3, 0.1, 0.8, 0.5, 0.5, 0.1, 0.5, 0.4, 0.3, 0.7, 0.6, 0.5, 0.3, 0.1, 0.5, 0.9, 0.8, 0.5, 0.8, 0.8, 0.1, 0.5, 0.4, 0.1, 0.1, 0.6, 0.6, 0.4, 0.4, 0.9, 0.3, 0.3, 0.6, 0.2, 0.7, 0.4, 0.4, 0.4, 0.9, 0.5, 0.3, 0.6, 0.3, 0.6, 0.2, 0.9, 0.9, 0.5, 0.8, 0.3, 0.6, 0.6, 0.9, 0.2, 0.9, 0.1, 0.8, 0.7, 0.1, 0.7, 0.7, 0.6, 0.6, 0.6, 0.2, 0.4, 0.1, 0.8, 0.7, 0.8, 0.7, 0.8, 0.6, 0.5, 0.5, 0.7, 0.1, 0.6, 0.6, 0.4, 0.4, 0.4, 0.9, 0.6, 0.2, 0.2, 0.5, 0.9, 0.3, 0.2, 0.1, 0.7, 0.6, 0.6, 0.8, 0.6, 0.7, 0.9, 0.3, 0.9, 0.4, 0.4, 0.8, 0.9, 0.5, 0.7, 0.6, 0.1, 0.1, 0.7, 0.4, 0.6, 0.5, 0.3, 0.5, 0.3, 0.3, 0.9, 0.3, 0.2, 0.5, 0.3, 0.1, 0.3, 0.1, 0.7, 0.3, 0.9, 0.9, 0.5, 0.5, 0.8, 0.3, 0.5, 0.8, 0.1, 0.8, 0.7, 0.1, 0.1, 0.8, 0.1, 0.5, 0.4, 0.7, 0.4, 0.9, 0.1, 0.5, 0.3, 0.7, 0.6, 0.5, 0.9, 0.6, 0.7, 0.4, 0.3, 0.2, 0.5, 0.2, 0.7, 0.8, 0.3, 0.6, 0.5, 0.3, 0.7, 
+
+L3_sSYR2K_C_nn
+0.7, 0.3, 0.2, 0.7, 0.4, 0.5, 0.5, 0.7, 0.6, 0.5, 0.9, 0.9, 0.8, 0.8, 0.7, 0.9, 0.8, 0.3, 0.9, 0.5, 0.2, 0.4, 0.3, 0.7, 0.7, 0.5, 0.6, 0.6, 0.2, 0.4, 0.7, 0.2, 0.8, 0.3, 0.2, 0.5, 0.9, 0.6, 0.8, 0.4, 0.3, 0.5, 0.3, 0.7, 0.7, 0.9, 0.3, 0.1, 0.6, 0.7, 0.3, 0.7, 0.2, 0.6, 0.1, 0.6, 0.1, 0.9, 0.7, 0.9, 0.9, 0.6, 0.1, 0.2, 0.1, 0.6, 0.4, 0.6, 0.4, 0.4, 0.8, 0.6, 0.4, 0.1, 0.4, 0.1, 0.7, 0.9, 0.4, 0.9, 0.3, 0.5, 0.8, 0.2, 0.6, 0.5, 0.3, 0.4, 0.1, 0.1, 0.7, 0.8, 0.6, 0.1, 0.2, 0.1, 0.1, 0.1, 0.9, 0.9, 0.5, 0.6, 0.5, 0.7, 0.3, 0.9, 0.4, 0.8, 0.6, 0.6, 0.8, 0.5, 0.6, 0.7, 0.7, 0.2, 0.9, 0.8, 0.7, 0.7, 0.7, 0.5, 0.7, 0.1, 0.6, 0.6, 0.7, 0.9, 0.1, 0.7, 0.1, 0.3, 0.2, 0.8, 0.7, 0.9, 0.6, 0.5, 0.3, 0.9, 0.7, 0.1, 0.8, 0.9, 0.8, 0.8, 0.5, 0.1, 0.8, 0.1, 0.2, 0.4, 0.3, 0.5, 0.6, 0.7, 0.9, 0.9, 0.2, 0.5, 0.1, 0.8, 0.8, 0.7, 0.2, 0.8, 0.9, 0.9, 0.1, 0.2, 0.9, 0.6, 0.7, 0.6, 0.4, 0.1, 0.6, 0.7, 0.5, 0.7, 0.5, 0.2, 0.9, 0.2, 0.6, 0.7, 0.4, 0.9, 0.2, 0.9, 0.1, 0.9, 0.1, 0.7, 0.1, 0.1, 0.2, 0.2, 0.6, 0.3, 0.3, 0.8, 0.6, 0.7, 0.8, 0.4, 0.3, 0.2, 0.3, 0.1, 0.7, 0.3, 0.8, 0.8, 0.9, 0.3, 0.8, 0.2, 0.7, 0.5, 0.8, 0.8, 0.7, 0.1, 0.1, 0.5, 0.9, 0.2, 0.2, 0.1, 0.9, 0.2, 0.3, 0.2, 0.4, 0.5, 0.6, 0.5, 0.7, 0.2, 0.6, 0.6, 0.8, 0.9, 0.9, 0.8, 0.2, 0.9, 0.6, 0.8, 0.7, 0.5, 0.1, 0.1, 0.5, 0.9, 0.8, 0.7, 0.4, 0.2, 0.5, 0.8, 0.7, 0.4, 0.1, 0.7, 0.6, 0.5, 0.6, 0.1, 0.8, 0.1, 0.8, 0.3, 0.3, 0.6, 0.6, 0.6, 0.7, 0.9, 0.3, 0.2, 0.4, 0.7, 0.8, 0.5, 0.5, 0.1, 0.7, 
+
+L3_sSYR2K_o_N
+8.0400006175, 7.79999953508, 7.75000019372, 7.22999972105, 7.5300001204, 7.22000026703, 8.66999912262, 7.55000036955, 8.07000029087, 7.45000076294, 8.91000020504, 8.14999997616, 9.66999989748, 8.62000018358, 7.96999949217, 8.5799998045, 9.02000027895, 7.79999953508, 7.19999921322, 8.31999969482, 6.52999992669, 7.42999973893, 8.44000035524, 9.38999956846, 7.7600004077, 8.17999982834, 7.99999964237, 8.40000021458, 7.45000000298, 8.54999962449, 9.19999998808, 8.31000061333, 8.88999921083, 8.53000050783, 7.75000019372, 8.31999969482, 9.65999925137, 8.75999987125, 8.45999985933, 8.80000057817, 9.9099996686, 7.25, 8.01000005007, 7.87000006437, 9.91999930143, 8.61999976635, 9.64000016451, 7.87999973446, 7.49999964237, 9.89000052214, 9.16999989748, 7.22999972105, 6.52999992669, 8.75999987125, 6.06000003964, 7.28999960423, 7.25000009686, 9.18999898434, 7.10999983549, 8.0799998045, 7.04999959469, 7.86000025272, 7.33000002056, 7.08999939263, 7.56999931484, 6.88999998569, 7.40000000596, 7.92999994755, 7.5300001204, 7.42999973893, 8.45999985933, 7.28999960423, 7.47999992967, 7.60000000149, 8.35999956727, 7.32000026852, 8.52000063658, 8.22999989986, 8.65000000596, 8.50000035763, 9.04000073671, 8.06999969482, 8.10000020266, 7.52000065148, 8.23000013828, 7.22000026703, 8.44000035524, 8.80000057817, 7.25000009686, 7.60000000149, 7.69999951124, 9.45999985933, 8.47999966145, 7.27999982983, 7.60000009835, 8.7599998489, 7.87999973446, 9.40000019222, 9.34000051022, 8.19000041485, 8.59000015259, 9.20999968052, 8.66999912262, 9.38999956846, 9.9099996686, 9.18999898434, 8.35999956727, 9.45999985933, 10.9799991846, 8.95000040531, 9.76999932528, 9.08999919891, 10.530000329, 9.81999891996, 10.9100000262, 9.29000015557, 9.42999875546, 10.4399994016, 9.89000052214, 7.55000036955, 7.7600004077, 7.25, 7.10999983549, 7.32000026852, 8.47999966145, 8.95000040531, 7.47999972105, 8.33000028133, 6.61999950558, 8.64999979734, 7.56000003964, 8.57999974489, 8.16000004113, 7.65000039339, 8.60999983549, 8.75000035763, 8.07000029087, 8.17999982834, 8.01000005007, 8.0799998045, 8.52000063658, 7.27999982983, 9.76999932528, 8.33000028133, 8.33999949694, 7.89999991655, 8.01999998093, 7.7599998489, 9.41000062227, 8.40999946743, 6.78000040352, 8.30999985337, 8.81000119448, 7.45000076294, 7.99999964237, 7.87000006437, 7.04999959469, 8.22999989986, 7.60000009835, 9.08999919891, 6.61999950558, 7.89999991655, 7.71999913454, 8.37000006437, 7.49999971688, 8.74999982119, 8.98000085354, 7.51999938488, 7.94000015408, 7.67999954522, 8.91000020504, 8.40000021458, 9.91999930143, 7.86000025272, 8.65000000596, 8.7599998489, 10.530000329, 8.64999979734, 8.01999998093, 8.37000006437, 10.2400007248, 8.83999939263, 10.1499999762, 9.2699996978, 8.97000086308, 9.53999918699, 8.76000061631, 8.14999997616, 7.45000000298, 8.61999976635, 7.33000002056, 8.50000035763, 7.87999973446, 9.81999891996, 7.56000003964, 7.7599998489, 7.49999971688, 8.83999939263, 8.43999969959, 9.34999924898, 8.15000039339, 7.74999982119, 9.46999895573, 8.92000025511, 9.66999989748, 8.54999962449, 9.64000016451, 7.08999939263, 9.04000073671, 9.40000019222, 10.9100000262, 8.57999974489, 9.41000062227, 8.74999982119, 10.1499999762, 9.34999924898, 9.60000020266, 9.47000046074, 8.96000021696, 10.1199989319, 10.0299995542, 8.62000018358, 9.19999998808, 7.87999973446, 7.56999931484, 8.06999969482, 9.34000051022, 9.29000015557, 8.16000004113, 8.40999946743, 8.98000085354, 9.2699996978, 8.15000039339, 9.47000046074, 9.07999935746, 7.85000038147, 8.91999971867, 8.97000026703, 7.96999949217, 8.31000061333, 7.49999964237, 6.88999998569, 8.10000020266, 8.19000041485, 9.42999875546, 7.65000039339, 6.78000040352, 7.51999938488, 8.97000086308, 7.74999982119, 8.96000021696, 7.85000038147, 6.5800004974, 8.04999981076, 7.9000005722, 8.5799998045, 8.88999921083, 9.89000052214, 7.40000000596, 7.52000065148, 8.59000015259, 10.4399994016, 8.60999983549, 8.30999985337, 7.94000015408, 9.53999918699, 9.46999895573, 10.1199989319, 8.91999971867, 8.04999981076, 9.89999943972, 9.37000045925, 9.02000027895, 8.53000050783, 9.16999989748, 7.92999994755, 8.23000013828, 9.20999968052, 9.89000052214, 8.75000035763, 8.81000119448, 7.67999954522, 8.76000061631, 8.92000025511, 10.0299995542, 8.97000026703, 7.9000005722, 9.37000045925, 10.259999454, 
+
+L3_sSYR2K_A_kn
+0.6, 0.3, 0.8, 0.5, 0.6, 0.9, 0.6, 0.8, 0.5, 0.7, 0.5, 0.6, 0.3, 0.5, 0.9, 0.5, 0.5, 0.9, 0.3, 0.3, 0.1, 0.6, 0.4, 0.7, 0.6, 0.2, 0.3, 0.3, 0.9, 0.3, 0.1, 0.2, 0.9, 0.2, 0.6, 0.9, 0.6, 0.9, 0.3, 0.5, 0.4, 0.3, 0.5, 0.9, 0.5, 0.5, 0.8, 0.4, 0.3, 0.9, 0.6, 0.7, 0.8, 0.1, 0.1, 0.8, 0.4, 0.1, 0.2, 0.1, 0.7, 0.6, 0.4, 0.5, 0.5, 0.4, 0.4, 0.3, 0.5, 0.9, 0.1, 0.6, 0.6, 0.1, 0.7, 0.2, 0.2, 0.5, 0.8, 0.9, 0.4, 0.3, 0.9, 0.7, 0.4, 0.4, 0.3, 0.1, 0.9, 0.2, 0.5, 0.2, 0.9, 0.4, 0.1, 0.4, 0.7, 0.4, 0.2, 0.1, 0.9, 0.1, 0.6, 0.7, 0.4, 0.7, 0.7, 0.6, 0.7, 0.6, 0.5, 0.6, 0.5, 0.4, 0.3, 0.5, 0.3, 0.2, 0.3, 0.1, 0.1, 0.1, 0.5, 0.9, 0.3, 0.3, 0.6, 0.4, 0.1, 0.7, 0.2, 0.6, 0.8, 0.5, 0.2, 0.6, 0.1, 0.1, 0.7, 0.3, 0.8, 0.9, 0.7, 0.3, 0.2, 0.7, 0.4, 0.1, 0.3, 0.7, 0.6, 0.9, 0.5, 0.1, 0.3, 0.4, 0.5, 0.9, 0.7, 0.2, 0.5, 0.6, 0.5, 0.6, 0.7, 0.2, 0.8, 0.1, 0.1, 0.7, 0.4, 0.5, 0.2, 0.2, 0.4, 0.5, 0.2, 0.8, 0.7, 0.8, 0.4, 0.7, 0.9, 0.5, 0.9, 0.3, 0.7, 0.4, 0.3, 0.8, 0.3, 0.1, 0.8, 0.8, 0.9, 0.1, 0.8, 0.5, 0.6, 0.8, 0.4, 0.9, 0.3, 0.2, 0.8, 0.8, 0.6, 0.6, 0.4, 0.6, 0.1, 0.1, 0.3, 0.7, 0.1, 0.9, 0.6, 0.3, 0.8, 0.1, 0.3, 0.1, 0.9, 0.2, 0.7, 0.8, 0.4, 0.1, 0.6, 0.8, 0.3, 0.7, 0.4, 0.8, 0.5, 0.9, 0.9, 0.1, 0.7, 0.8, 0.2, 0.6, 0.2, 0.1, 0.1, 0.4, 0.5, 0.7, 0.5, 0.9, 0.8, 0.3, 0.1, 0.3, 0.6, 0.5, 0.6, 0.9, 0.5, 0.9, 0.6, 0.6, 0.2, 0.1, 0.8, 0.8, 0.7, 0.7, 0.9, 0.7, 0.1, 0.8, 
+
+L3_sSYR2K_B_kn
+0.9, 0.1, 0.2, 0.5, 0.8, 0.6, 0.4, 0.8, 0.2, 0.2, 0.7, 0.7, 0.4, 0.6, 0.3, 0.9, 0.7, 0.7, 0.7, 0.6, 0.3, 0.6, 0.1, 0.7, 0.1, 0.7, 0.4, 0.5, 0.8, 0.8, 0.2, 0.6, 0.9, 0.4, 0.8, 0.3, 0.3, 0.9, 0.7, 0.1, 0.4, 0.8, 0.4, 0.5, 0.5, 0.2, 0.2, 0.8, 0.3, 0.3, 0.7, 0.6, 0.7, 0.7, 0.6, 0.3, 0.4, 0.2, 0.7, 0.5, 0.5, 0.3, 0.6, 0.9, 0.2, 0.6, 0.5, 0.3, 0.5, 0.9, 0.4, 0.1, 0.8, 0.6, 0.4, 0.4, 0.7, 0.6, 0.3, 0.3, 0.7, 0.5, 0.3, 0.8, 0.1, 0.9, 0.7, 0.2, 0.2, 0.6, 0.4, 0.8, 0.4, 0.6, 0.7, 0.9, 0.4, 0.4, 0.4, 0.7, 0.3, 0.5, 0.4, 0.8, 0.2, 0.3, 0.8, 0.9, 0.3, 0.1, 0.7, 0.8, 0.1, 0.1, 0.8, 0.2, 0.2, 0.8, 0.4, 0.4, 0.9, 0.1, 0.6, 0.6, 0.3, 0.5, 0.4, 0.4, 0.2, 0.5, 0.9, 0.3, 0.1, 0.5, 0.3, 0.4, 0.4, 0.5, 0.5, 0.4, 0.9, 0.1, 0.7, 0.2, 0.3, 0.1, 0.5, 0.1, 0.4, 0.7, 0.8, 0.1, 0.8, 0.1, 0.3, 0.6, 0.6, 0.8, 0.1, 0.6, 0.5, 0.9, 0.6, 0.6, 0.5, 0.6, 0.8, 0.3, 0.4, 0.7, 0.4, 0.5, 0.8, 0.5, 0.7, 0.4, 0.8, 0.7, 0.8, 0.4, 0.8, 0.6, 0.1, 0.7, 0.6, 0.1, 0.5, 0.6, 0.5, 0.6, 0.2, 0.2, 0.7, 0.5, 0.6, 0.8, 0.1, 0.6, 0.9, 0.9, 0.8, 0.2, 0.7, 0.2, 0.3, 0.3, 0.9, 0.3, 0.6, 0.5, 0.4, 0.5, 0.9, 0.1, 0.7, 0.6, 0.3, 0.6, 0.2, 0.7, 0.7, 0.8, 0.1, 0.8, 0.2, 0.6, 0.3, 0.6, 0.9, 0.2, 0.9, 0.9, 0.5, 0.1, 0.3, 0.5, 0.9, 0.2, 0.3, 0.5, 0.6, 0.6, 0.4, 0.7, 0.9, 0.9, 0.4, 0.7, 0.5, 0.7, 0.2, 0.9, 0.7, 0.1, 0.1, 0.7, 0.7, 0.9, 0.8, 0.7, 0.2, 0.9, 0.7, 0.1, 0.4, 0.8, 0.6, 0.9, 0.6, 0.9, 0.5, 0.7, 
+
+L3_sSYR2K_o_T
+9.27999991179, 9.17999917269, 7.99999971688, 8.64999979734, 9.80999985337, 8.44999980927, 8.36999988556, 9.4499990344, 8.12000048161, 8.78999996185, 9.60999906063, 10.249999404, 9.7399995923, 8.69000035524, 9.12000006437, 10.0899995565, 7.64999943972, 9.17999917269, 9.75999963284, 8.42000007629, 8.15000028908, 10.7400001585, 8.03000050783, 9.08999937773, 10.0299999118, 7.88999938965, 9.65000021458, 9.9699999094, 9.5199996978, 9.0300001204, 9.34999960661, 8.39999981225, 9.50000077486, 7.55999976397, 7.99999971688, 8.42000007629, 8.09999978542, 7.54999983311, 9.91999989748, 7.28000059724, 7.11999970675, 7.94000053406, 6.64999943972, 8.22000044584, 8.87000006437, 9.71000039577, 8.78999978304, 8.15000019222, 8.52999985218, 7.97999972105, 7.58999997377, 8.64999979734, 8.15000028908, 7.54999983311, 7.21999988705, 10.1200004816, 7.15999994427, 8.12000024319, 8.48000019789, 7.79000031948, 9.38999974728, 9.14000093937, 8.03999958187, 7.83000011742, 8.23000011593, 7.73999989033, 7.63999977708, 8.02000010014, 9.80999985337, 10.7400001585, 9.91999989748, 10.1200004816, 12.7200006545, 8.78000030667, 9.79999962449, 9.81000003964, 9.32999914885, 10.8700002432, 10.7999996245, 11.6199992895, 10.3299987912, 9.890001297, 10.8899992108, 10.1799995452, 9.67999994755, 8.44999980927, 8.03000050783, 7.28000059724, 7.15999994427, 8.78000030667, 7.12000006437, 8.1800006032, 8.41999971867, 6.98000011593, 7.27999992669, 8.35000000149, 8.42000064999, 7.96000061184, 8.33000028133, 8.45999991894, 7.53000068665, 7.56000006199, 8.36999988556, 9.08999937773, 7.11999970675, 8.12000024319, 9.79999962449, 8.1800006032, 7.82000029087, 8.32000029087, 7.80000001192, 8.22999954224, 8.7199999094, 9.67999953032, 9.7699996829, 8.04000063241, 8.61000001431, 9.0600002408, 7.89999979734, 9.4499990344, 10.0299999118, 7.94000053406, 8.48000019789, 9.81000003964, 8.41999971867, 8.32000029087, 9.33999937773, 8.94999921322, 9.12999973446, 10.3099986911, 10.0099998489, 9.50999909639, 8.60999985039, 9.57000046968, 8.97999972105, 8.43999993801, 8.12000048161, 7.88999938965, 6.64999943972, 7.79000031948, 9.32999914885, 6.98000011593, 7.80000001192, 8.94999921322, 7.31999999285, 8.89000016451, 8.36999988556, 8.79999981076, 7.66000062227, 7.19000015408, 7.46000023186, 7.24000015855, 6.6599996686, 8.78999996185, 9.65000021458, 8.22000044584, 9.38999974728, 10.8700002432, 7.27999992669, 8.22999954224, 9.12999973446, 8.89000016451, 8.49999934435, 9.85999983549, 9.38000030816, 9.42999917269, 9.6800006628, 8.58999955654, 8.4299999252, 7.60999985039, 9.60999906063, 9.9699999094, 8.87000006437, 9.14000093937, 10.7999996245, 8.35000000149, 8.7199999094, 10.3099986911, 8.36999988556, 9.85999983549, 9.89999961853, 10.2699996978, 10.5300000906, 8.92000027001, 9.92999994755, 9.60999983549, 7.99000015855, 10.249999404, 9.5199996978, 9.71000039577, 8.03999958187, 11.6199992895, 8.42000064999, 9.67999953032, 10.0099998489, 8.79999981076, 9.38000030816, 10.2699996978, 11.3200002909, 10.0899999738, 9.69999963045, 10.0800006986, 9.44999945164, 8.62999981642, 9.7399995923, 9.0300001204, 8.78999978304, 7.83000011742, 10.3299987912, 7.96000061184, 9.7699996829, 9.50999909639, 7.66000062227, 9.42999917269, 10.5300000906, 10.0899999738, 8.6599996686, 8.96000023186, 9.15999907255, 8.23999929428, 7.87999993563, 8.69000035524, 9.34999960661, 8.15000019222, 8.23000011593, 9.890001297, 8.33000028133, 8.04000063241, 8.60999985039, 7.19000015408, 9.6800006628, 8.92000027001, 9.69999963045, 8.96000023186, 8.58000031114, 8.98000049591, 8.17999994755, 8.42000007629, 9.12000006437, 8.39999981225, 8.52999985218, 7.73999989033, 10.8899992108, 8.45999991894, 8.61000001431, 9.57000046968, 7.46000023186, 8.58999955654, 9.92999994755, 10.0800006986, 9.15999907255, 8.98000049591, 7.92000064999, 9.0099998489, 7.92000007629, 10.0899995565, 9.50000077486, 7.97999972105, 7.63999977708, 10.1799995452, 7.53000068665, 9.0600002408, 8.97999972105, 7.24000015855, 8.4299999252, 9.60999983549, 9.44999945164, 8.23999929428, 8.17999994755, 9.0099998489, 9.02000027895, 6.61999950558, 7.64999943972, 7.55999976397, 7.58999997377, 8.02000010014, 9.67999994755, 7.56000006199, 7.89999979734, 8.43999993801, 6.6599996686, 7.60999985039, 7.99000015855, 8.62999981642, 7.87999993563, 8.42000007629, 7.92000007629, 6.61999950558, 7.73999947309, 
+
+L3_dSYR2K_A_nk
+0.9, 0.2, 0.3, 0.4, 0.3, 0.5, 0.9, 0.9, 0.9, 0.2, 0.2, 0.4, 0.7, 0.1, 0.4, 0.1, 0.6, 0.2, 0.2, 0.3, 0.1, 0.4, 0.3, 0.8, 0.2, 0.5, 0.7, 0.5, 0.3, 0.5, 0.1, 0.3, 0.2, 0.5, 0.9, 0.1, 0.7, 0.2, 0.5, 0.8, 0.8, 0.7, 0.8, 0.1, 0.2, 0.6, 0.5, 0.3, 0.4, 0.7, 0.2, 0.5, 0.2, 0.8, 0.8, 0.9, 0.5, 0.5, 0.8, 0.3, 0.9, 0.3, 0.6, 0.5, 0.6, 0.5, 0.3, 0.3, 0.4, 0.2, 0.1, 0.4, 0.9, 0.8, 0.2, 0.3, 0.2, 0.3, 0.2, 0.4, 0.4, 0.5, 0.9, 0.1, 0.3, 0.1, 0.9, 0.1, 0.1, 0.5, 0.6, 0.4, 0.2, 0.1, 0.9, 0.9, 0.1, 0.1, 0.7, 0.4, 0.8, 0.4, 0.5, 0.3, 0.1, 0.3, 0.6, 0.1, 0.5, 0.8, 0.7, 0.5, 0.5, 0.2, 0.9, 0.2, 0.9, 0.7, 0.7, 0.2, 0.8, 0.4, 0.9, 0.9, 0.4, 0.9, 0.7, 0.6, 0.6, 0.9, 0.4, 0.4, 0.3, 0.1, 0.9, 0.4, 0.4, 0.7, 0.3, 0.7, 0.4, 0.8, 0.3, 0.9, 0.1, 0.8, 0.2, 0.4, 0.7, 0.9, 0.4, 0.2, 0.6, 0.7, 0.5, 0.2, 0.3, 0.2, 0.9, 0.2, 0.5, 0.5, 0.3, 0.2, 0.6, 0.9, 0.5, 0.4, 0.6, 0.8, 0.3, 0.5, 0.8, 0.2, 0.3, 0.1, 0.6, 0.6, 0.4, 0.2, 0.1, 0.7, 0.1, 0.4, 0.7, 0.8, 0.8, 0.4, 0.6, 0.9, 0.9, 0.1, 0.1, 0.5, 0.1, 0.7, 0.2, 0.6, 0.9, 0.3, 0.9, 0.8, 0.4, 0.1, 0.3, 0.6, 0.9, 0.3, 0.2, 0.8, 0.8, 0.9, 0.8, 0.3, 0.6, 0.8, 0.4, 0.6, 0.5, 0.8, 0.9, 0.9, 0.5, 0.8, 0.7, 0.2, 0.4, 0.7, 0.8, 0.7, 0.7, 0.3, 0.6, 0.1, 0.8, 0.5, 0.1, 0.7, 0.4, 0.2, 0.3, 0.2, 0.5, 0.6, 0.7, 0.1, 0.7, 0.9, 0.6, 0.2, 0.5, 0.9, 0.6, 0.7, 0.8, 0.4, 0.4, 0.6, 0.8, 0.4, 0.1, 0.6, 0.5, 0.9, 0.7, 0.5, 0.9, 0.9, 0.3, 0.9, 0.4, 0.8, 
+
+L3_dSYR2K_B_nk
+0.1, 0.9, 0.9, 0.9, 0.4, 0.9, 0.8, 0.9, 0.3, 0.9, 0.6, 0.1, 0.1, 0.2, 0.1, 0.3, 0.2, 0.4, 0.5, 0.2, 0.3, 0.4, 0.6, 0.3, 0.6, 0.9, 0.4, 0.6, 0.6, 0.1, 0.6, 0.2, 0.4, 0.9, 0.1, 0.9, 0.8, 0.7, 0.8, 0.3, 0.8, 0.4, 0.4, 0.5, 0.3, 0.5, 0.5, 0.7, 0.7, 0.7, 0.8, 0.4, 0.5, 0.5, 0.4, 0.4, 0.8, 0.8, 0.1, 0.2, 0.8, 0.1, 0.7, 0.5, 0.9, 0.8, 0.4, 0.4, 0.5, 0.5, 0.3, 0.3, 0.9, 0.4, 0.6, 0.7, 0.2, 0.1, 0.8, 0.1, 0.9, 0.5, 0.9, 0.8, 0.5, 0.6, 0.1, 0.3, 0.7, 0.9, 0.7, 0.7, 0.4, 0.3, 0.7, 0.6, 0.5, 0.5, 0.5, 0.2, 0.4, 0.4, 0.1, 0.5, 0.9, 0.2, 0.9, 0.5, 0.8, 0.6, 0.7, 0.5, 0.8, 0.1, 0.4, 0.4, 0.4, 0.8, 0.6, 0.5, 0.1, 0.5, 0.3, 0.9, 0.6, 0.4, 0.7, 0.6, 0.5, 0.4, 0.4, 0.3, 0.1, 0.2, 0.4, 0.7, 0.7, 0.7, 0.4, 0.9, 0.9, 0.4, 0.6, 0.1, 0.5, 0.1, 0.8, 0.4, 0.8, 0.9, 0.3, 0.8, 0.9, 0.5, 0.4, 0.1, 0.5, 0.1, 0.2, 0.6, 0.1, 0.6, 0.5, 0.5, 0.3, 0.7, 0.2, 0.3, 0.8, 0.6, 0.7, 0.8, 0.1, 0.1, 0.9, 0.6, 0.1, 0.9, 0.9, 0.6, 0.6, 0.2, 0.8, 0.1, 0.5, 0.7, 0.8, 0.3, 0.2, 0.9, 0.9, 0.9, 0.9, 0.9, 0.3, 0.5, 0.2, 0.8, 0.6, 0.2, 0.9, 0.3, 0.4, 0.1, 0.5, 0.7, 0.3, 0.2, 0.1, 0.9, 0.7, 0.7, 0.8, 0.6, 0.8, 0.3, 0.9, 0.9, 0.9, 0.2, 0.7, 0.4, 0.5, 0.9, 0.9, 0.9, 0.8, 0.3, 0.3, 0.6, 0.7, 0.1, 0.5, 0.5, 0.2, 0.8, 0.1, 0.3, 0.6, 0.9, 0.4, 0.7, 0.5, 0.2, 0.7, 0.1, 0.1, 0.7, 0.6, 0.5, 0.4, 0.7, 0.9, 0.3, 0.7, 0.4, 0.8, 0.7, 0.2, 0.2, 0.9, 0.4, 0.5, 0.1, 0.2, 0.4, 0.8, 0.2, 0.2, 0.9, 0.1, 0.4, 
+
+L3_dSYR2K_C_nn
+0.8, 0.8, 0.1, 0.1, 0.5, 0.7, 0.7, 0.5, 0.3, 0.9, 0.5, 0.4, 0.5, 0.7, 0.5, 0.5, 0.5, 0.8, 0.1, 0.1, 0.4, 0.2, 0.4, 0.4, 0.6, 0.6, 0.9, 0.4, 0.2, 0.4, 0.1, 0.2, 0.7, 0.8, 0.1, 0.1, 0.3, 0.9, 0.6, 0.7, 0.5, 0.9, 0.9, 0.3, 0.4, 0.5, 0.1, 0.9, 0.6, 0.6, 0.8, 0.1, 0.4, 0.9, 0.9, 0.9, 0.9, 0.3, 0.9, 0.4, 0.2, 0.9, 0.3, 0.6, 0.6, 0.2, 0.8, 0.2, 0.5, 0.2, 0.6, 0.9, 0.4, 0.8, 0.9, 0.3, 0.9, 0.2, 0.5, 0.9, 0.7, 0.8, 0.7, 0.1, 0.4, 0.7, 0.4, 0.7, 0.9, 0.8, 0.2, 0.9, 0.5, 0.7, 0.5, 0.8, 0.2, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.4, 0.5, 0.3, 0.9, 0.9, 0.1, 0.5, 0.3, 0.5, 0.3, 0.9, 0.8, 0.1, 0.4, 0.7, 0.8, 0.5, 0.6, 0.9, 0.9, 0.3, 0.5, 0.5, 0.8, 0.1, 0.3, 0.7, 0.3, 0.5, 0.3, 0.7, 0.1, 0.3, 0.3, 0.6, 0.9, 0.4, 0.9, 0.7, 0.3, 0.1, 0.2, 0.6, 0.5, 0.4, 0.9, 0.1, 0.9, 0.7, 0.8, 0.9, 0.9, 0.3, 0.2, 0.2, 0.5, 0.5, 0.3, 0.6, 0.3, 0.3, 0.9, 0.4, 0.8, 0.2, 0.9, 0.7, 0.5, 0.4, 0.4, 0.9, 0.5, 0.8, 0.3, 0.7, 0.5, 0.3, 0.1, 0.5, 0.9, 0.5, 0.4, 0.1, 0.7, 0.4, 0.2, 0.5, 0.3, 0.9, 0.2, 0.9, 0.3, 0.4, 0.9, 0.5, 0.8, 0.9, 0.5, 0.7, 0.9, 0.7, 0.5, 0.4, 0.1, 0.6, 0.7, 0.7, 0.8, 0.5, 0.9, 0.4, 0.9, 0.9, 0.9, 0.7, 0.7, 0.9, 0.7, 0.7, 0.1, 0.9, 0.6, 0.8, 0.7, 0.1, 0.3, 0.1, 0.8, 0.5, 0.5, 0.7, 0.1, 0.2, 0.2, 0.5, 0.5, 0.2, 0.6, 0.2, 0.7, 0.7, 0.4, 0.7, 0.9, 0.2, 0.4, 0.7, 0.7, 0.2, 0.6, 0.2, 0.2, 0.5, 0.7, 0.6, 0.8, 0.1, 0.7, 0.7, 0.1, 0.7, 0.9, 0.1, 0.9, 0.9, 0.2, 0.2, 0.9, 0.7, 0.5, 0.8, 0.8, 0.2, 0.4, 0.7, 0.8, 0.3, 0.8, 0.7, 0.7, 0.7, 0.7, 0.5, 0.2, 0.7, 0.3, 
+
+L3_dSYR2K_o_N
+8.34, 7.38, 8.81, 9.29, 7.65, 8.58, 8.06, 9.09, 8.7, 9.19, 7.82, 7.88, 8.87, 10.72, 8.37, 8.28, 8.55, 7.38, 5.04, 6.71, 7.14, 5.83, 7.26, 6.32, 8.11, 7.34, 7.31, 6.79, 7.09, 6.92, 8.03, 6.2, 7.27, 7.62, 8.81, 6.71, 8.62, 10.17, 8.01, 9.15, 8.49, 9.73, 9.64, 9.13, 8.54, 9.96, 8.62, 12.33, 9.22, 9.44, 9.58, 9.29, 7.14, 10.17, 10.24, 8.79, 9.72, 8.37, 10.29, 9.23, 8.73, 9.52, 9.68, 9.29, 11.87, 8.23, 9.39, 8.5, 7.65, 5.83, 8.01, 8.79, 7.12, 8.25, 6.97, 8.05, 7.98, 7.52, 7.5, 8.83, 7.8, 9.54, 8.21, 7.46, 7.73, 8.58, 7.26, 9.15, 9.72, 8.25, 8.86, 8.28, 10.17, 8.69, 8.09, 9.0, 10.45, 8.11, 11.63, 9.89, 8.97, 9.48, 8.06, 6.32, 8.49, 8.37, 6.97, 8.28, 7.24, 9.32, 7.27, 7.66, 7.23, 10.31, 7.59, 10.05, 7.7, 8.6, 9.27, 9.09, 8.11, 9.73, 10.29, 8.05, 10.17, 9.32, 11.02, 8.96, 8.74, 9.67, 10.57, 8.78, 11.84, 10.09, 9.36, 9.77, 8.7, 7.34, 9.64, 9.23, 7.98, 8.69, 7.27, 8.96, 8.4, 7.49, 8.29, 10.26, 8.85, 10.75, 9.35, 9.33, 9.6, 9.19, 7.31, 9.13, 8.73, 7.52, 8.09, 7.66, 8.74, 7.49, 7.66, 8.49, 9.31, 7.8, 10.98, 8.03, 8.62, 8.6, 7.82, 6.79, 8.54, 9.52, 7.5, 9.0, 7.23, 9.67, 8.29, 8.49, 7.36, 8.64, 8.91, 10.34, 8.04, 8.09, 8.92, 7.88, 7.09, 9.96, 9.68, 8.83, 10.45, 10.31, 10.57, 10.26, 9.31, 8.64, 10.6, 10.37, 12.21, 9.5, 10.18, 10.27, 8.87, 6.92, 8.62, 9.29, 7.8, 8.11, 7.59, 8.78, 8.85, 7.8, 8.91, 10.37, 9.22, 10.85, 8.76, 8.07, 8.45, 10.72, 8.03, 12.33, 11.87, 9.54, 11.63, 10.05, 11.84, 10.75, 10.98, 10.34, 12.21, 10.85, 13.98, 10.46, 10.92, 11.11, 8.37, 6.2, 9.22, 8.23, 8.21, 9.89, 7.7, 10.09, 9.35, 8.03, 8.04, 9.5, 8.76, 10.46, 8.74, 7.82, 9.42, 8.28, 7.27, 9.44, 9.39, 7.46, 8.97, 8.6, 9.36, 9.33, 8.62, 8.09, 10.18, 8.07, 10.92, 7.82, 10.08, 8.85, 8.55, 7.62, 9.58, 8.5, 7.73, 9.48, 9.27, 9.77, 9.6, 8.6, 8.92, 10.27, 8.45, 11.11, 9.42, 8.85, 8.54, 
+
+L3_dSYR2K_A_kn
+0.1, 0.5, 0.7, 0.6, 0.4, 0.2, 0.1, 0.8, 0.9, 0.9, 0.9, 0.2, 0.3, 0.1, 0.5, 0.8, 0.9, 0.6, 0.2, 0.2, 0.5, 0.1, 0.3, 0.5, 0.4, 0.9, 0.9, 0.3, 0.2, 0.6, 0.5, 0.5, 0.7, 0.9, 0.8, 0.6, 0.2, 0.6, 0.6, 0.8, 0.5, 0.9, 0.1, 0.1, 0.1, 0.7, 0.3, 0.3, 0.8, 0.6, 0.6, 0.7, 0.5, 0.4, 0.7, 0.1, 0.8, 0.5, 0.7, 0.8, 0.4, 0.9, 0.6, 0.8, 0.1, 0.2, 0.8, 0.2, 0.9, 0.1, 0.5, 0.9, 0.9, 0.3, 0.5, 0.4, 0.2, 0.3, 0.2, 0.6, 0.3, 0.7, 0.5, 0.8, 0.9, 0.7, 0.7, 0.5, 0.7, 0.8, 0.5, 0.3, 0.9, 0.6, 0.6, 0.6, 0.3, 0.2, 0.2, 0.7, 0.3, 0.6, 0.5, 0.9, 0.6, 0.5, 0.4, 0.2, 0.5, 0.2, 0.6, 0.6, 0.5, 0.2, 0.4, 0.3, 0.5, 0.1, 0.9, 0.9, 0.5, 0.5, 0.7, 0.7, 0.4, 0.6, 0.8, 0.2, 0.5, 0.8, 0.2, 0.3, 0.4, 0.2, 0.8, 0.9, 0.1, 0.6, 0.5, 0.4, 0.5, 0.5, 0.7, 0.5, 0.7, 0.5, 0.5, 0.2, 0.5, 0.1, 0.5, 0.4, 0.5, 0.6, 0.8, 0.5, 0.3, 0.1, 0.1, 0.1, 0.3, 0.1, 0.6, 0.6, 0.8, 0.7, 0.1, 0.8, 0.9, 0.2, 0.2, 0.7, 0.6, 0.6, 0.9, 0.3, 0.4, 0.3, 0.1, 0.6, 0.3, 0.2, 0.8, 0.7, 0.3, 0.9, 0.8, 0.6, 0.6, 0.4, 0.6, 0.1, 0.2, 0.3, 0.9, 0.2, 0.8, 0.1, 0.9, 0.4, 0.2, 0.7, 0.9, 0.2, 0.2, 0.5, 0.7, 0.6, 0.9, 0.8, 0.2, 0.2, 0.4, 0.8, 0.9, 0.7, 0.7, 0.6, 0.7, 0.2, 0.5, 0.1, 0.5, 0.2, 0.3, 0.6, 0.9, 0.5, 0.9, 0.3, 0.7, 0.9, 0.4, 0.5, 0.9, 0.4, 0.4, 0.5, 0.9, 0.3, 0.6, 0.7, 0.7, 0.9, 0.7, 0.4, 0.6, 0.4, 0.8, 0.9, 0.3, 0.4, 0.8, 0.7, 0.7, 0.9, 0.9, 0.7, 0.5, 0.1, 0.1, 0.1, 0.2, 0.1, 0.3, 0.5, 0.9, 0.2, 0.9, 0.7, 0.4, 0.6, 
+
+L3_dSYR2K_B_kn
+0.7, 0.9, 0.4, 0.9, 0.4, 0.9, 0.3, 0.7, 0.1, 0.7, 0.1, 0.4, 0.2, 0.1, 0.2, 0.6, 0.4, 0.9, 0.5, 0.6, 0.3, 0.6, 0.5, 0.2, 0.8, 0.8, 0.3, 0.8, 0.7, 0.3, 0.1, 0.4, 0.5, 0.3, 0.1, 0.4, 0.1, 0.4, 0.6, 0.3, 0.7, 0.5, 0.4, 0.1, 0.8, 0.3, 0.9, 0.2, 0.1, 0.2, 0.5, 0.9, 0.4, 0.1, 0.5, 0.1, 0.9, 0.9, 0.6, 0.7, 0.6, 0.4, 0.6, 0.8, 0.6, 0.3, 0.3, 0.5, 0.8, 0.9, 0.6, 0.6, 0.2, 0.9, 0.7, 0.9, 0.3, 0.4, 0.3, 0.3, 0.4, 0.7, 0.2, 0.6, 0.4, 0.9, 0.4, 0.4, 0.5, 0.9, 0.9, 0.1, 0.7, 0.8, 0.9, 0.3, 0.7, 0.5, 0.6, 0.6, 0.3, 0.2, 0.8, 0.7, 0.2, 0.8, 0.6, 0.3, 0.8, 0.6, 0.6, 0.9, 0.7, 0.4, 0.1, 0.7, 0.1, 0.1, 0.3, 0.9, 0.6, 0.4, 0.1, 0.9, 0.6, 0.4, 0.5, 0.1, 0.8, 0.5, 0.9, 0.7, 0.5, 0.4, 0.3, 0.8, 0.2, 0.3, 0.3, 0.8, 0.9, 0.3, 0.4, 0.1, 0.9, 0.5, 0.4, 0.7, 0.6, 0.1, 0.3, 0.1, 0.3, 0.5, 0.5, 0.4, 0.9, 0.6, 0.5, 0.9, 0.2, 0.5, 0.7, 0.4, 0.5, 0.3, 0.9, 0.4, 0.6, 0.9, 0.1, 0.1, 0.3, 0.6, 0.3, 0.8, 0.2, 0.9, 0.4, 0.1, 0.6, 0.4, 0.4, 0.7, 0.6, 0.6, 0.8, 0.8, 0.8, 0.7, 0.2, 0.4, 0.8, 0.3, 0.2, 0.1, 0.3, 0.7, 0.6, 0.8, 0.1, 0.2, 0.5, 0.7, 0.4, 0.9, 0.3, 0.3, 0.3, 0.8, 0.8, 0.2, 0.5, 0.6, 0.8, 0.2, 0.1, 0.4, 0.6, 0.3, 0.6, 0.8, 0.3, 0.5, 0.8, 0.1, 0.2, 0.3, 0.9, 0.2, 0.4, 0.2, 0.1, 0.4, 0.3, 0.8, 0.2, 0.2, 0.2, 0.5, 0.4, 0.1, 0.5, 0.4, 0.5, 0.4, 0.9, 0.5, 0.6, 0.2, 0.4, 0.1, 0.4, 0.7, 0.9, 0.8, 0.3, 0.1, 0.9, 0.2, 0.2, 0.2, 0.7, 0.2, 0.9, 0.8, 0.3, 0.4, 0.4, 0.3, 0.2, 0.1, 
+
+L3_dSYR2K_o_T
+12.32, 10.9, 7.92, 10.05, 9.11, 9.84, 8.92, 11.16, 8.95, 11.72, 11.14, 9.3, 9.21, 8.55, 8.48, 9.86, 11.16, 10.9, 8.98, 7.31, 10.82, 8.83, 8.97, 7.95, 10.01, 8.45, 11.18, 10.01, 8.68, 8.13, 7.28, 8.25, 8.95, 10.52, 7.92, 7.31, 5.72, 8.67, 7.18, 7.89, 6.66, 8.48, 6.99, 8.51, 7.54, 6.84, 5.94, 6.63, 6.65, 7.44, 8.4, 10.05, 10.82, 8.67, 10.2, 9.2, 10.13, 7.93, 10.68, 8.39, 10.08, 10.67, 8.67, 8.94, 7.98, 8.24, 9.48, 10.17, 9.11, 8.83, 7.18, 9.2, 8.16, 8.98, 7.94, 9.32, 8.07, 8.58, 8.56, 7.55, 7.35, 6.68, 8.27, 7.62, 9.38, 9.84, 8.97, 7.89, 10.13, 8.98, 8.42, 8.22, 9.81, 8.71, 9.66, 9.84, 7.73, 8.72, 6.79, 8.64, 9.38, 10.1, 8.92, 7.95, 6.66, 7.93, 7.94, 8.22, 6.44, 8.03, 6.91, 7.82, 8.18, 8.22, 7.85, 5.35, 7.07, 7.71, 8.51, 11.16, 10.01, 8.48, 10.68, 9.32, 9.81, 8.03, 10.74, 7.7, 9.87, 9.78, 8.58, 9.15, 7.72, 8.51, 8.82, 10.64, 8.95, 8.45, 6.99, 8.39, 8.07, 8.71, 6.91, 7.7, 7.98, 8.69, 8.06, 7.37, 7.38, 5.05, 7.6, 7.49, 8.35, 11.72, 11.18, 8.51, 10.08, 8.58, 9.66, 7.82, 9.87, 8.69, 10.2, 10.37, 9.4, 7.78, 7.6, 8.55, 9.3, 10.57, 11.14, 10.01, 7.54, 10.67, 8.56, 9.84, 8.18, 9.78, 8.06, 10.37, 8.56, 8.99, 8.51, 7.78, 8.92, 8.33, 10.33, 9.3, 8.68, 6.84, 8.67, 7.55, 7.73, 8.22, 8.58, 7.37, 9.4, 8.99, 7.26, 8.11, 6.15, 7.29, 8.79, 9.49, 9.21, 8.13, 5.94, 8.94, 7.35, 8.72, 7.85, 9.15, 7.38, 7.78, 8.51, 8.11, 7.38, 6.59, 7.52, 8.56, 8.72, 8.55, 7.28, 6.63, 7.98, 6.68, 6.79, 5.35, 7.72, 5.05, 7.6, 7.78, 6.15, 6.59, 5.54, 6.38, 6.6, 7.39, 8.48, 8.25, 6.65, 8.24, 8.27, 8.64, 7.07, 8.51, 7.6, 8.55, 8.92, 7.29, 7.52, 6.38, 6.9, 7.09, 8.15, 9.86, 8.95, 7.44, 9.48, 7.62, 9.38, 7.71, 8.82, 7.49, 9.3, 8.33, 8.79, 8.56, 6.6, 7.09, 9.48, 9.99, 11.16, 10.52, 8.4, 10.17, 9.38, 10.1, 8.51, 10.64, 8.35, 10.57, 10.33, 9.49, 8.72, 7.39, 8.15, 9.99, 9.7, 
+
+L3_cSYR2K_A_nk
+0.10000000149, 0.699999988079, 0.40000000596, 0.699999988079, 0.600000023842, 0.10000000149, 0.699999988079, 0.5, 0.899999976158, 0.300000011921, 0.699999988079, 0.40000000596, 0.5, 0.5, 0.5, 0.20000000298, 0.699999988079, 0.40000000596, 0.40000000596, 0.699999988079, 0.300000011921, 0.600000023842, 0.300000011921, 0.699999988079, 0.5, 0.699999988079, 0.300000011921, 0.20000000298, 0.20000000298, 0.899999976158, 0.600000023842, 0.40000000596, 0.899999976158, 0.800000011921, 0.40000000596, 0.5, 0.800000011921, 0.10000000149, 0.899999976158, 0.10000000149, 0.40000000596, 0.300000011921, 0.600000023842, 0.699999988079, 0.40000000596, 0.5, 0.300000011921, 0.699999988079, 0.300000011921, 0.10000000149, 0.600000023842, 0.899999976158, 0.699999988079, 0.40000000596, 0.10000000149, 0.5, 0.20000000298, 0.300000011921, 0.699999988079, 0.40000000596, 0.40000000596, 0.600000023842, 0.899999976158, 0.5, 0.699999988079, 0.800000011921, 0.899999976158, 0.899999976158, 0.800000011921, 0.899999976158, 0.800000011921, 0.300000011921, 0.5, 0.800000011921, 0.899999976158, 0.20000000298, 0.800000011921, 0.300000011921, 0.5, 0.699999988079, 0.699999988079, 0.300000011921, 0.600000023842, 0.10000000149, 0.899999976158, 0.300000011921, 0.10000000149, 0.20000000298, 0.20000000298, 0.800000011921, 0.600000023842, 0.899999976158, 0.300000011921, 0.600000023842, 0.899999976158, 0.699999988079, 0.800000011921, 0.20000000298, 0.40000000596, 0.899999976158, 0.5, 0.5, 0.20000000298, 0.899999976158, 0.699999988079, 0.40000000596, 0.10000000149, 0.800000011921, 0.10000000149, 0.899999976158, 0.20000000298, 0.40000000596, 0.5, 0.699999988079, 0.40000000596, 0.5, 0.5, 0.699999988079, 0.600000023842, 0.10000000149, 0.5, 0.10000000149, 0.10000000149, 0.699999988079, 0.800000011921, 0.899999976158, 0.20000000298, 0.20000000298, 0.600000023842, 0.5, 0.300000011921, 0.300000011921, 0.5, 0.300000011921, 0.40000000596, 0.899999976158, 0.699999988079, 0.10000000149, 0.600000023842, 0.300000011921, 0.300000011921, 0.300000011921, 0.40000000596, 0.600000023842, 0.5, 0.10000000149, 0.40000000596, 0.10000000149, 0.10000000149, 0.699999988079, 0.40000000596, 0.699999988079, 0.800000011921, 0.40000000596, 0.800000011921, 0.699999988079, 0.5, 0.10000000149, 0.899999976158, 0.5, 0.699999988079, 0.899999976158, 0.20000000298, 0.40000000596, 0.5, 0.300000011921, 0.20000000298, 0.10000000149, 0.40000000596, 0.300000011921, 0.600000023842, 0.20000000298, 0.899999976158, 0.899999976158, 0.600000023842, 0.300000011921, 0.40000000596, 0.699999988079, 0.5, 0.899999976158, 0.300000011921, 0.5, 0.899999976158, 0.5, 0.20000000298, 0.899999976158, 0.40000000596, 0.300000011921, 0.40000000596, 0.800000011921, 0.40000000596, 0.40000000596, 0.20000000298, 0.40000000596, 0.10000000149, 0.800000011921, 0.600000023842, 0.899999976158, 0.300000011921, 0.300000011921, 0.10000000149, 0.5, 0.10000000149, 0.899999976158, 0.300000011921, 0.300000011921, 0.10000000149, 0.800000011921, 0.300000011921, 0.899999976158, 0.600000023842, 0.20000000298, 0.800000011921, 0.899999976158, 0.899999976158, 0.699999988079, 0.699999988079, 0.800000011921, 0.40000000596, 0.10000000149, 0.5, 0.800000011921, 0.300000011921, 0.10000000149, 0.899999976158, 0.699999988079, 0.800000011921, 0.20000000298, 0.699999988079, 0.800000011921, 0.20000000298, 0.10000000149, 0.800000011921, 0.699999988079, 0.800000011921, 0.40000000596, 0.40000000596, 0.5, 0.40000000596, 0.10000000149, 0.899999976158, 0.899999976158, 0.5, 0.800000011921, 0.10000000149, 0.800000011921, 0.5, 0.300000011921, 0.20000000298, 0.10000000149, 0.20000000298, 0.300000011921, 0.800000011921, 0.5, 0.899999976158, 0.40000000596, 0.699999988079, 0.40000000596, 0.699999988079, 0.699999988079, 0.899999976158, 0.600000023842, 0.5, 0.20000000298, 0.20000000298, 0.800000011921, 0.5, 0.40000000596, 0.300000011921, 0.600000023842, 0.300000011921, 0.10000000149, 0.5, 0.5, 0.600000023842, 0.10000000149, 0.800000011921, 0.699999988079, 0.600000023842, 0.5, 0.600000023842, 0.20000000298, 0.300000011921, 0.699999988079, 0.300000011921, 0.10000000149, 0.300000011921, 0.20000000298, 0.300000011921, 0.5, 0.5, 0.800000011921, 0.699999988079, 0.600000023842, 0.40000000596, 0.899999976158, 0.699999988079, 0.699999988079, 0.40000000596, 0.600000023842, 0.10000000149, 0.899999976158, 0.899999976158, 0.300000011921, 0.20000000298, 0.40000000596, 0.300000011921, 0.20000000298, 0.10000000149, 0.20000000298, 0.5, 0.699999988079, 0.899999976158, 0.40000000596, 0.40000000596, 0.40000000596, 0.300000011921, 0.899999976158, 0.300000011921, 0.600000023842, 0.5, 0.300000011921, 0.600000023842, 0.899999976158, 0.40000000596, 0.5, 0.40000000596, 0.10000000149, 0.899999976158, 0.699999988079, 0.40000000596, 0.20000000298, 0.40000000596, 0.20000000298, 0.600000023842, 0.699999988079, 0.40000000596, 0.5, 0.20000000298, 0.40000000596, 0.40000000596, 0.5, 0.10000000149, 0.899999976158, 0.699999988079, 0.20000000298, 0.800000011921, 0.40000000596, 0.20000000298, 0.20000000298, 0.10000000149, 0.5, 0.5, 0.800000011921, 0.699999988079, 0.300000011921, 0.800000011921, 0.899999976158, 0.300000011921, 0.899999976158, 0.800000011921, 0.20000000298, 0.699999988079, 0.10000000149, 0.5, 0.10000000149, 0.600000023842, 0.800000011921, 0.40000000596, 0.300000011921, 0.899999976158, 0.5, 0.40000000596, 0.899999976158, 0.300000011921, 0.20000000298, 0.699999988079, 0.699999988079, 0.699999988079, 0.600000023842, 0.20000000298, 0.800000011921, 0.899999976158, 0.5, 0.899999976158, 0.40000000596, 0.20000000298, 0.600000023842, 0.699999988079, 0.300000011921, 0.5, 0.800000011921, 0.40000000596, 0.20000000298, 0.699999988079, 0.10000000149, 0.800000011921, 0.899999976158, 0.800000011921, 0.20000000298, 0.699999988079, 0.600000023842, 0.800000011921, 0.600000023842, 0.899999976158, 0.40000000596, 0.5, 0.40000000596, 0.40000000596, 0.40000000596, 0.699999988079, 0.699999988079, 0.40000000596, 0.300000011921, 0.10000000149, 0.899999976158, 0.5, 0.5, 0.300000011921, 0.300000011921, 0.20000000298, 0.899999976158, 0.40000000596, 0.10000000149, 0.20000000298, 0.699999988079, 0.300000011921, 0.600000023842, 0.40000000596, 0.800000011921, 0.800000011921, 0.10000000149, 0.699999988079, 0.899999976158, 0.40000000596, 0.10000000149, 0.699999988079, 0.600000023842, 0.40000000596, 0.699999988079, 0.20000000298, 0.40000000596, 0.800000011921, 0.300000011921, 0.800000011921, 0.300000011921, 0.800000011921, 0.10000000149, 0.40000000596, 0.20000000298, 0.800000011921, 0.899999976158, 0.40000000596, 0.699999988079, 0.300000011921, 0.899999976158, 0.10000000149, 0.40000000596, 0.5, 0.800000011921, 0.20000000298, 0.5, 0.300000011921, 0.899999976158, 0.40000000596, 0.5, 0.899999976158, 0.10000000149, 0.600000023842, 0.600000023842, 0.10000000149, 0.899999976158, 0.899999976158, 0.600000023842, 0.899999976158, 0.300000011921, 0.699999988079, 0.40000000596, 0.40000000596, 0.899999976158, 0.699999988079, 0.10000000149, 0.600000023842, 0.5, 0.5, 0.10000000149, 0.5, 0.800000011921, 0.600000023842, 0.899999976158, 0.899999976158, 0.5, 0.800000011921, 0.699999988079, 0.800000011921, 0.5, 0.5, 0.600000023842, 0.699999988079, 0.600000023842, 0.800000011921, 0.20000000298, 0.699999988079, 0.40000000596, 0.300000011921, 0.20000000298, 0.600000023842, 0.899999976158, 0.800000011921, 0.800000011921, 0.10000000149, 0.899999976158, 0.699999988079, 0.699999988079, 0.600000023842, 0.800000011921, 0.20000000298, 0.899999976158, 0.40000000596, 0.20000000298, 0.300000011921, 0.10000000149, 0.300000011921, 0.800000011921, 0.10000000149, 0.800000011921, 0.40000000596, 0.800000011921, 0.40000000596, 0.600000023842, 0.40000000596, 0.699999988079, 0.40000000596, 0.699999988079, 0.899999976158, 0.10000000149, 0.300000011921, 0.10000000149, 0.20000000298, 0.10000000149, 0.899999976158, 0.10000000149, 0.10000000149, 0.600000023842, 
+
+L3_cSYR2K_B_nk
+0.40000000596, 0.300000011921, 0.40000000596, 0.40000000596, 0.800000011921, 0.5, 0.10000000149, 0.699999988079, 0.300000011921, 0.600000023842, 0.800000011921, 0.800000011921, 0.600000023842, 0.20000000298, 0.40000000596, 0.800000011921, 0.800000011921, 0.20000000298, 0.699999988079, 0.20000000298, 0.699999988079, 0.20000000298, 0.40000000596, 0.800000011921, 0.20000000298, 0.800000011921, 0.600000023842, 0.800000011921, 0.899999976158, 0.899999976158, 0.600000023842, 0.600000023842, 0.20000000298, 0.20000000298, 0.300000011921, 0.20000000298, 0.20000000298, 0.899999976158, 0.5, 0.10000000149, 0.600000023842, 0.10000000149, 0.800000011921, 0.10000000149, 0.699999988079, 0.300000011921, 0.699999988079, 0.10000000149, 0.899999976158, 0.800000011921, 0.10000000149, 0.40000000596, 0.40000000596, 0.20000000298, 0.800000011921, 0.10000000149, 0.10000000149, 0.5, 0.10000000149, 0.899999976158, 0.20000000298, 0.20000000298, 0.899999976158, 0.40000000596, 0.800000011921, 0.20000000298, 0.40000000596, 0.40000000596, 0.300000011921, 0.20000000298, 0.10000000149, 0.899999976158, 0.300000011921, 0.10000000149, 0.699999988079, 0.899999976158, 0.20000000298, 0.300000011921, 0.40000000596, 0.20000000298, 0.20000000298, 0.5, 0.899999976158, 0.800000011921, 0.800000011921, 0.40000000596, 0.10000000149, 0.699999988079, 0.699999988079, 0.40000000596, 0.20000000298, 0.10000000149, 0.800000011921, 0.5, 0.20000000298, 0.600000023842, 0.5, 0.300000011921, 0.899999976158, 0.10000000149, 0.300000011921, 0.699999988079, 0.20000000298, 0.600000023842, 0.40000000596, 0.699999988079, 0.10000000149, 0.699999988079, 0.800000011921, 0.699999988079, 0.800000011921, 0.300000011921, 0.899999976158, 0.800000011921, 0.600000023842, 0.800000011921, 0.600000023842, 0.600000023842, 0.300000011921, 0.600000023842, 0.800000011921, 0.699999988079, 0.600000023842, 0.10000000149, 0.40000000596, 0.899999976158, 0.899999976158, 0.20000000298, 0.20000000298, 0.5, 0.5, 0.10000000149, 0.10000000149, 0.899999976158, 0.300000011921, 0.699999988079, 0.800000011921, 0.10000000149, 0.800000011921, 0.5, 0.300000011921, 0.10000000149, 0.800000011921, 0.300000011921, 0.800000011921, 0.40000000596, 0.5, 0.10000000149, 0.600000023842, 0.699999988079, 0.699999988079, 0.699999988079, 0.5, 0.800000011921, 0.10000000149, 0.40000000596, 0.300000011921, 0.699999988079, 0.20000000298, 0.5, 0.699999988079, 0.10000000149, 0.899999976158, 0.40000000596, 0.20000000298, 0.10000000149, 0.300000011921, 0.10000000149, 0.300000011921, 0.899999976158, 0.699999988079, 0.800000011921, 0.20000000298, 0.800000011921, 0.300000011921, 0.10000000149, 0.300000011921, 0.600000023842, 0.600000023842, 0.899999976158, 0.300000011921, 0.10000000149, 0.300000011921, 0.5, 0.20000000298, 0.5, 0.600000023842, 0.20000000298, 0.40000000596, 0.699999988079, 0.10000000149, 0.20000000298, 0.300000011921, 0.5, 0.600000023842, 0.20000000298, 0.40000000596, 0.5, 0.300000011921, 0.899999976158, 0.800000011921, 0.5, 0.899999976158, 0.40000000596, 0.699999988079, 0.40000000596, 0.600000023842, 0.600000023842, 0.899999976158, 0.20000000298, 0.699999988079, 0.600000023842, 0.800000011921, 0.20000000298, 0.20000000298, 0.300000011921, 0.300000011921, 0.800000011921, 0.10000000149, 0.899999976158, 0.899999976158, 0.300000011921, 0.10000000149, 0.40000000596, 0.300000011921, 0.5, 0.699999988079, 0.899999976158, 0.300000011921, 0.600000023842, 0.899999976158, 0.800000011921, 0.899999976158, 0.40000000596, 0.5, 0.600000023842, 0.699999988079, 0.899999976158, 0.5, 0.5, 0.899999976158, 0.20000000298, 0.5, 0.800000011921, 0.600000023842, 0.600000023842, 0.699999988079, 0.10000000149, 0.10000000149, 0.699999988079, 0.600000023842, 0.300000011921, 0.10000000149, 0.600000023842, 0.899999976158, 0.10000000149, 0.800000011921, 0.300000011921, 0.40000000596, 0.300000011921, 0.5, 0.899999976158, 0.40000000596, 0.20000000298, 0.699999988079, 0.40000000596, 0.40000000596, 0.899999976158, 0.300000011921, 0.800000011921, 0.40000000596, 0.899999976158, 0.300000011921, 0.899999976158, 0.10000000149, 0.699999988079, 0.40000000596, 0.600000023842, 0.600000023842, 0.800000011921, 0.10000000149, 0.20000000298, 0.40000000596, 0.600000023842, 0.20000000298, 0.800000011921, 0.899999976158, 0.800000011921, 0.10000000149, 0.40000000596, 0.300000011921, 0.40000000596, 0.800000011921, 0.10000000149, 0.600000023842, 0.600000023842, 0.40000000596, 0.5, 0.20000000298, 0.40000000596, 0.600000023842, 0.20000000298, 0.300000011921, 0.899999976158, 0.10000000149, 0.899999976158, 0.5, 0.20000000298, 0.20000000298, 0.699999988079, 0.10000000149, 0.5, 0.300000011921, 0.600000023842, 0.800000011921, 0.699999988079, 0.899999976158, 0.800000011921, 0.699999988079, 0.40000000596, 0.800000011921, 0.300000011921, 0.10000000149, 0.20000000298, 0.10000000149, 0.5, 0.300000011921, 0.800000011921, 0.20000000298, 0.5, 0.20000000298, 0.10000000149, 0.899999976158, 0.40000000596, 0.600000023842, 0.600000023842, 0.5, 0.800000011921, 0.40000000596, 0.40000000596, 0.600000023842, 0.300000011921, 0.10000000149, 0.10000000149, 0.20000000298, 0.600000023842, 0.899999976158, 0.800000011921, 0.5, 0.10000000149, 0.300000011921, 0.800000011921, 0.800000011921, 0.800000011921, 0.10000000149, 0.300000011921, 0.40000000596, 0.600000023842, 0.899999976158, 0.5, 0.40000000596, 0.40000000596, 0.300000011921, 0.5, 0.899999976158, 0.699999988079, 0.899999976158, 0.10000000149, 0.5, 0.699999988079, 0.600000023842, 0.600000023842, 0.5, 0.600000023842, 0.600000023842, 0.899999976158, 0.300000011921, 0.800000011921, 0.5, 0.899999976158, 0.5, 0.5, 0.600000023842, 0.10000000149, 0.699999988079, 0.699999988079, 0.20000000298, 0.300000011921, 0.699999988079, 0.5, 0.10000000149, 0.800000011921, 0.800000011921, 0.10000000149, 0.20000000298, 0.40000000596, 0.600000023842, 0.40000000596, 0.10000000149, 0.600000023842, 0.40000000596, 0.600000023842, 0.699999988079, 0.20000000298, 0.40000000596, 0.5, 0.600000023842, 0.10000000149, 0.300000011921, 0.600000023842, 0.40000000596, 0.5, 0.600000023842, 0.40000000596, 0.20000000298, 0.600000023842, 0.20000000298, 0.600000023842, 0.800000011921, 0.699999988079, 0.5, 0.10000000149, 0.20000000298, 0.40000000596, 0.40000000596, 0.5, 0.899999976158, 0.800000011921, 0.20000000298, 0.10000000149, 0.20000000298, 0.600000023842, 0.300000011921, 0.20000000298, 0.40000000596, 0.20000000298, 0.300000011921, 0.10000000149, 0.899999976158, 0.5, 0.899999976158, 0.5, 0.699999988079, 0.40000000596, 0.10000000149, 0.300000011921, 0.300000011921, 0.899999976158, 0.899999976158, 0.300000011921, 0.300000011921, 0.20000000298, 0.300000011921, 0.699999988079, 0.699999988079, 0.899999976158, 0.699999988079, 0.20000000298, 0.10000000149, 0.5, 0.10000000149, 0.300000011921, 0.600000023842, 0.5, 0.600000023842, 0.20000000298, 0.40000000596, 0.20000000298, 0.300000011921, 0.300000011921, 0.600000023842, 0.800000011921, 0.5, 0.40000000596, 0.10000000149, 0.699999988079, 0.40000000596, 0.699999988079, 0.600000023842, 0.899999976158, 0.699999988079, 0.300000011921, 0.899999976158, 0.20000000298, 0.800000011921, 0.699999988079, 0.40000000596, 0.300000011921, 0.40000000596, 0.600000023842, 0.10000000149, 0.20000000298, 0.10000000149, 0.20000000298, 0.10000000149, 0.899999976158, 0.899999976158, 0.600000023842, 0.20000000298, 0.10000000149, 0.5, 0.20000000298, 0.20000000298, 0.699999988079, 0.40000000596, 0.40000000596, 0.800000011921, 0.899999976158, 0.899999976158, 0.899999976158, 0.800000011921, 0.300000011921, 0.899999976158, 0.600000023842, 0.800000011921, 0.10000000149, 0.699999988079, 0.300000011921, 0.899999976158, 0.899999976158, 0.300000011921, 0.699999988079, 0.10000000149, 0.300000011921, 0.699999988079, 0.5, 0.699999988079, 0.600000023842, 0.800000011921, 0.600000023842, 0.600000023842, 0.10000000149, 0.300000011921, 0.5, 0.300000011921, 0.600000023842, 0.10000000149, 0.699999988079, 0.40000000596, 0.699999988079, 0.800000011921, 0.300000011921, 0.10000000149, 0.800000011921, 
+
+L3_cSYR2K_C_nn
+0.600000023842, 0.20000000298, 0.699999988079, 0.800000011921, 0.699999988079, 0.699999988079, 0.699999988079, 0.899999976158, 0.5, 0.899999976158, 0.899999976158, 0.5, 0.600000023842, 0.5, 0.899999976158, 0.5, 0.300000011921, 0.5, 0.20000000298, 0.20000000298, 0.10000000149, 0.699999988079, 0.10000000149, 0.5, 0.10000000149, 0.40000000596, 0.800000011921, 0.800000011921, 0.10000000149, 0.699999988079, 0.800000011921, 0.800000011921, 0.20000000298, 0.899999976158, 0.699999988079, 0.800000011921, 0.800000011921, 0.300000011921, 0.699999988079, 0.800000011921, 0.10000000149, 0.800000011921, 0.800000011921, 0.699999988079, 0.899999976158, 0.899999976158, 0.20000000298, 0.300000011921, 0.300000011921, 0.899999976158, 0.699999988079, 0.600000023842, 0.20000000298, 0.699999988079, 0.40000000596, 0.10000000149, 0.5, 0.5, 0.300000011921, 0.10000000149, 0.899999976158, 0.20000000298, 0.20000000298, 0.10000000149, 0.899999976158, 0.600000023842, 0.899999976158, 0.699999988079, 0.699999988079, 0.699999988079, 0.699999988079, 0.800000011921, 0.600000023842, 0.600000023842, 0.5, 0.40000000596, 0.10000000149, 0.40000000596, 0.300000011921, 0.300000011921, 0.10000000149, 0.10000000149, 0.20000000298, 0.699999988079, 0.800000011921, 0.600000023842, 0.800000011921, 0.5, 0.10000000149, 0.699999988079, 0.20000000298, 0.40000000596, 0.800000011921, 0.699999988079, 0.10000000149, 0.600000023842, 0.10000000149, 0.20000000298, 0.10000000149, 0.20000000298, 0.800000011921, 0.600000023842, 0.699999988079, 0.899999976158, 0.10000000149, 0.800000011921, 0.5, 0.40000000596, 0.300000011921, 0.300000011921, 0.10000000149, 0.600000023842, 0.699999988079, 0.600000023842, 0.600000023842, 0.899999976158, 0.20000000298, 0.5, 0.40000000596, 0.10000000149, 0.20000000298, 0.5, 0.20000000298, 0.800000011921, 0.20000000298, 0.699999988079, 0.5, 0.40000000596, 0.40000000596, 0.699999988079, 0.300000011921, 0.300000011921, 0.10000000149, 0.800000011921, 0.600000023842, 0.899999976158, 0.5, 0.899999976158, 0.800000011921, 0.699999988079, 0.10000000149, 0.40000000596, 0.10000000149, 0.600000023842, 0.10000000149, 0.899999976158, 0.699999988079, 0.800000011921, 0.899999976158, 0.899999976158, 0.300000011921, 0.40000000596, 0.300000011921, 0.20000000298, 0.800000011921, 0.699999988079, 0.40000000596, 0.300000011921, 0.300000011921, 0.800000011921, 0.800000011921, 0.10000000149, 0.699999988079, 0.600000023842, 0.899999976158, 0.40000000596, 0.300000011921, 0.10000000149, 0.300000011921, 0.10000000149, 0.899999976158, 0.5, 0.899999976158, 0.899999976158, 0.300000011921, 0.300000011921, 0.699999988079, 0.600000023842, 0.699999988079, 0.800000011921, 0.300000011921, 0.300000011921, 0.600000023842, 0.600000023842, 0.5, 0.10000000149, 0.300000011921, 0.10000000149, 0.10000000149, 0.5, 0.5, 0.10000000149, 0.800000011921, 0.300000011921, 0.5, 0.10000000149, 0.40000000596, 0.20000000298, 0.10000000149, 0.5, 0.899999976158, 0.40000000596, 0.899999976158, 0.800000011921, 0.600000023842, 0.5, 0.20000000298, 0.300000011921, 0.10000000149, 0.10000000149, 0.600000023842, 0.899999976158, 0.899999976158, 0.899999976158, 0.600000023842, 0.600000023842, 0.40000000596, 0.699999988079, 0.5, 0.40000000596, 0.800000011921, 0.40000000596, 0.300000011921, 0.20000000298, 0.600000023842, 0.300000011921, 0.5, 0.600000023842, 0.20000000298, 0.20000000298, 0.899999976158, 0.699999988079, 0.699999988079, 0.20000000298, 0.20000000298, 0.10000000149, 0.800000011921, 0.20000000298, 0.899999976158, 0.5, 0.300000011921, 0.899999976158, 0.20000000298, 0.699999988079, 0.20000000298, 0.5, 0.300000011921, 0.40000000596, 0.5, 0.10000000149, 0.5, 0.40000000596, 0.20000000298, 0.10000000149, 0.40000000596, 0.600000023842, 0.40000000596, 0.800000011921, 0.699999988079, 0.20000000298, 0.40000000596, 0.10000000149, 0.899999976158, 0.10000000149, 0.800000011921, 0.800000011921, 0.899999976158, 0.699999988079, 0.20000000298, 0.800000011921, 0.40000000596, 0.699999988079, 0.300000011921, 0.5, 0.699999988079, 0.600000023842, 0.800000011921, 0.600000023842, 0.40000000596, 0.10000000149, 0.300000011921, 0.20000000298, 0.300000011921, 0.10000000149, 0.800000011921, 0.40000000596, 0.40000000596, 0.600000023842, 0.300000011921, 0.40000000596, 0.800000011921, 0.5, 0.699999988079, 0.300000011921, 0.800000011921, 0.40000000596, 0.20000000298, 0.899999976158, 0.899999976158, 0.5, 0.40000000596, 0.899999976158, 0.600000023842, 0.20000000298, 0.800000011921, 0.40000000596, 0.20000000298, 0.20000000298, 0.20000000298, 0.699999988079, 0.800000011921, 0.5, 0.20000000298, 0.5, 0.800000011921, 0.699999988079, 0.10000000149, 0.5, 0.300000011921, 0.20000000298, 0.40000000596, 0.800000011921, 0.800000011921, 0.5, 0.800000011921, 0.20000000298, 0.699999988079, 0.10000000149, 0.600000023842, 0.800000011921, 0.300000011921, 0.10000000149, 0.899999976158, 0.600000023842, 0.10000000149, 0.10000000149, 0.20000000298, 0.5, 0.10000000149, 0.800000011921, 0.10000000149, 0.699999988079, 0.40000000596, 0.10000000149, 0.10000000149, 0.699999988079, 0.20000000298, 0.800000011921, 0.40000000596, 0.300000011921, 0.5, 0.10000000149, 0.600000023842, 0.300000011921, 0.699999988079, 0.20000000298, 0.699999988079, 0.300000011921, 0.699999988079, 0.10000000149, 0.5, 0.699999988079, 0.300000011921, 0.20000000298, 0.40000000596, 0.600000023842, 0.699999988079, 0.600000023842, 0.40000000596, 0.899999976158, 0.600000023842, 0.800000011921, 0.10000000149, 0.5, 0.10000000149, 0.5, 0.5, 0.5, 0.20000000298, 0.40000000596, 0.20000000298, 0.699999988079, 0.300000011921, 0.800000011921, 0.800000011921, 0.300000011921, 0.5, 0.600000023842, 0.40000000596, 0.10000000149, 0.800000011921, 0.40000000596, 0.600000023842, 0.800000011921, 0.300000011921, 0.20000000298, 0.300000011921, 0.800000011921, 0.800000011921, 0.20000000298, 0.300000011921, 0.899999976158, 0.899999976158, 0.600000023842, 0.899999976158, 0.40000000596, 0.40000000596, 0.699999988079, 0.10000000149, 0.40000000596, 0.300000011921, 0.10000000149, 0.800000011921, 0.699999988079, 0.5, 0.40000000596, 0.800000011921, 0.10000000149, 0.5, 0.10000000149, 0.20000000298, 0.20000000298, 0.899999976158, 0.10000000149, 0.20000000298, 0.899999976158, 0.300000011921, 0.10000000149, 0.40000000596, 0.600000023842, 0.800000011921, 0.20000000298, 0.699999988079, 0.899999976158, 0.800000011921, 0.20000000298, 0.699999988079, 0.300000011921, 0.5, 0.20000000298, 0.40000000596, 0.20000000298, 0.800000011921, 0.800000011921, 0.899999976158, 0.20000000298, 0.10000000149, 0.600000023842, 0.40000000596, 0.699999988079, 0.699999988079, 0.600000023842, 0.40000000596, 0.20000000298, 0.899999976158, 0.699999988079, 0.800000011921, 0.800000011921, 0.899999976158, 0.5, 0.899999976158, 0.600000023842, 0.699999988079, 0.600000023842, 0.300000011921, 0.899999976158, 0.800000011921, 0.20000000298, 0.5, 0.800000011921, 0.300000011921, 0.5, 0.899999976158, 0.899999976158, 0.40000000596, 0.699999988079, 0.10000000149, 0.699999988079, 0.20000000298, 0.10000000149, 0.10000000149, 0.20000000298, 0.300000011921, 0.300000011921, 0.899999976158, 0.40000000596, 0.10000000149, 0.5, 0.699999988079, 0.20000000298, 0.899999976158, 0.699999988079, 0.40000000596, 0.899999976158, 0.10000000149, 0.10000000149, 0.40000000596, 0.899999976158, 0.899999976158, 0.600000023842, 0.699999988079, 0.300000011921, 0.300000011921, 0.5, 0.699999988079, 0.5, 0.300000011921, 0.899999976158, 0.300000011921, 0.40000000596, 0.800000011921, 0.800000011921, 0.899999976158, 0.600000023842, 0.10000000149, 0.20000000298, 0.10000000149, 0.800000011921, 0.300000011921, 0.10000000149, 0.899999976158, 0.40000000596, 0.20000000298, 0.10000000149, 0.20000000298, 0.800000011921, 0.600000023842, 0.20000000298, 0.20000000298, 0.5, 0.600000023842, 0.800000011921, 0.899999976158, 0.40000000596, 0.5, 0.20000000298, 0.899999976158, 0.899999976158, 0.300000011921, 0.899999976158, 0.699999988079, 0.800000011921, 0.899999976158, 0.899999976158, 0.20000000298, 0.899999976158, 0.899999976158, 0.699999988079, 0.800000011921, 0.600000023842, 0.600000023842, 0.899999976158, 0.300000011921, 0.10000000149, 0.899999976158, 0.800000011921, 0.800000011921, 0.20000000298, 0.40000000596, 0.699999988079, 0.800000011921, 0.40000000596, 0.10000000149, 0.800000011921, 0.10000000149, 0.5, 0.40000000596, 0.699999988079, 0.40000000596, 0.20000000298, 0.40000000596, 0.699999988079, 0.300000011921, 0.40000000596, 0.899999976158, 0.899999976158, 0.300000011921, 0.10000000149, 
+
+L3_cSYR2K_o_N
+0.100000205636, 17.3600001836, 3.19999998882, 15.6400001837, 0.390000019819, 17.9800001387, -0.719999894798, 18.6800000799, 1.09000013381, 16.1700002398, 0.0500000879169, 16.4000001229, -0.399999970943, 17.5600000837, 3.10999989375, 18.5100001754, -0.0299999681115, 16.5200002718, -2.50999992356, 16.6200001667, -0.619999962598, 15.6900002359, -0.189999952763, 18.5300001998, 1.24999995008, 16.4600003006, 1.80000002831, 16.6200002114, -1.32999993458, 17.4800001253, 1.6600000979, 18.590000186, -8.86619080376e-08, 18.1200001273, 3.19999998882, 15.6400001837, 4.21999997973, 13.2200000334, 2.71000001818, 15.8300001067, 0.550000087172, 15.7400001331, 2.84000010625, 14.7500000276, 1.8400000526, 13.4300000791, 0.490000068247, 15.7300000612, 2.89999991283, 16.1500000499, 0.86000001967, 15.2300002103, 0.889999989271, 14.75000007, 1.98000000536, 13.9000001088, 2.50999998763, 16.2200000855, 2.16999993131, 14.8900000653, 1.93999998927, 13.9300000672, 0.570000029653, 16.1999999344, 4.10999997422, 15.1500001065, 2.23999989912, 15.0200001094, 0.390000019819, 17.9800001387, 2.71000001818, 15.8300001067, 3.37999994129, 17.5200001705, 1.31000006512, 17.6800001156, 0.95000012368, 14.7500001468, 0.850000036508, 15.7600000703, 0.0400000473857, 16.5800002132, 2.63999987826, 18.9900000921, 1.53000002474, 17.6200001489, -0.53999991104, 16.1100001098, 0.340000019819, 14.6300001924, 1.61999995813, 18.5800001611, 1.69999990091, 16.5600001806, 0.860000013709, 15.6600001284, -0.409999904931, 16.420000131, 1.58999997735, 17.4500000671, 1.29999994412, 17.4900000995, -0.719999894798, 18.6800000799, 0.550000087172, 15.7400001331, 1.31000006512, 17.6800001156, -2.59999978095, 18.060000045, 0.920000131726, 15.9400002091, -1.58999983653, 16.960000083, -1.93999978215, 18.3000000894, -1.21000002638, 18.5100000241, -1.44999985024, 15.8100002313, -3.029999872, 16.8700000975, -0.599999890476, 15.430000053, -0.309999875128, 19.1700000967, 1.04000002205, 17.230000176, 0.0600000874698, 15.2500001542, -0.719999842644, 16.3300000709, 0.480000142455, 19.5200000237, -0.709999872148, 18.1600000972, 1.09000013381, 16.1700002398, 2.84000010625, 14.7500000276, 0.95000012368, 14.7500001468, 0.920000131726, 15.9400002091, 0.380000218451, 14.5200001734, 1.70000014752, 14.1800001477, -0.689999858886, 16.6000001661, 2.43000000834, 15.9900001286, 0.890000083894, 15.7700001757, 0.160000083745, 15.2000001699, 0.860000102371, 14.1500001788, 0.450000228733, 16.9900001793, 2.11000006363, 13.9900002106, 1.62000008553, 15.0400001696, -0.419999831468, 16.2000000969, 2.96000013366, 15.8500001319, 0.0800001402199, 15.2000001483, 0.0500000879169, 16.4000001229, 1.8400000526, 13.4300000791, 0.850000036508, 15.7600000703, -1.58999983653, 16.960000083, 1.70000014752, 14.1800001477, -2.01999979496, 14.1000001103, -1.1199999015, 15.2300001186, 0.370000032634, 15.6800001149, -1.09999993518, 14.6700001936, -2.54999989718, 14.1900001316, 0.310000056922, 13.2100001061, 1.27000007063, 17.0200000758, 0.999999981374, 14.5300002289, 0.0800000292063, 12.8600001769, -0.269999954402, 15.1700000453, 0.600000037253, 16.3700000989, 0.459999935478, 15.7400001442, -0.399999970943, 17.5600000837, 0.490000068247, 15.7300000612, 0.0400000473857, 16.5800002132, -1.93999978215, 18.3000000894, -0.689999858886, 16.6000001661, -1.1199999015, 15.2300001186, -1.32000000507, 18.1800001082, 0.629999933839, 17.1200001019, -1.66999981359, 15.7200002725, -2.93999987751, 15.5600001381, 0.0600000539422, 13.9800002378, -0.98999991402, 18.3200001965, 0.489999958724, 15.3100002417, 1.19999991283, 15.6200000781, -1.12999992639, 16.5600001694, 0.220000107884, 17.3200000677, -0.44999999404, 16.0600002052, 3.10999989375, 18.5100001754, 2.89999991283, 16.1500000499, 2.63999987826, 18.9900000921, -1.21000002638, 18.5100000241, 2.43000000834, 15.9900001286, 0.370000032634, 15.6800001149, 0.629999933839, 17.1200001019, 2.95999968141, 18.060000115, 0.429999964386, 18.8200001384, -0.830000011325, 17.6600000443, 1.39999996349, 15.9100000726, 1.3199998866, 18.4600001188, 2.82999986678, 18.330000135, 2.93999993041, 16.3400001651, 0.989999978095, 18.869999938, 3.03999986783, 20.4800000508, 0.549999915063, 17.4800001961, -0.0299999681115, 16.5200002718, 0.86000001967, 15.2300002103, 1.53000002474, 17.6200001489, -1.44999985024, 15.8100002313, 0.890000083894, 15.7700001757, -1.09999993518, 14.6700001936, -1.66999981359, 15.7200002725, 0.429999964386, 18.8200001384, -1.21999999166, 16.6800002676, -1.96999992609, 15.5100002149, -0.829999933094, 14.0800002296, -0.00999994292855, 18.1900002143, 0.10999996379, 17.5300001656, 0.570000049025, 15.7900002076, -2.26999984786, 16.6000001155, 0.22000004679, 17.6700000915, -1.02999996737, 15.4400002545, -2.50999992356, 16.6200001667, 0.889999989271, 14.75000007, -0.53999991104, 16.1100001098, -3.029999872, 16.8700000975, 0.160000083745, 15.2000001699, -2.54999989718, 14.1900001316, -2.93999987751, 15.5600001381, -0.830000011325, 17.6600000443, -1.96999992609, 15.5100002149, -2.29999995232, 16.1400001234, -1.59999992177, 13.6400001472, -1.29999994859, 18.110000115, -0.880000041127, 15.9000001684, 0.409999938458, 15.490000174, -2.71999992758, 15.8500001058, -1.34999990016, 18.5200000587, -2.33000002995, 16.5900001167, -0.619999962598, 15.6900002359, 1.98000000536, 13.9000001088, 0.340000019819, 14.6300001924, -0.599999890476, 15.430000053, 0.860000102371, 14.1500001788, 0.310000056922, 13.2100001061, 0.0600000539422, 13.9800002378, 1.39999996349, 15.9100000726, -0.829999933094, 14.0800002296, -1.59999992177, 13.6400001472, 0.480000005364, 12.96000027, -0.300000012666, 16.2600002402, 1.12999990404, 14.910000241, 1.5800000374, 14.2000002131, -0.789999981821, 14.4000001952, 0.720000101179, 15.9100001583, -0.660000046492, 14.0300001991, -0.189999952763, 18.5300001998, 2.50999998763, 16.2200000855, 1.61999995813, 18.5800001611, -0.309999875128, 19.1700000967, 0.450000228733, 16.9900001793, 1.27000007063, 17.0200000758, -0.98999991402, 18.3200001965, 1.3199998866, 18.4600001188, -0.00999994292855, 18.1900002143, -1.29999994859, 18.110000115, -0.300000012666, 16.2600002402, 0.540000016093, 20.8400001204, 1.60999992803, 18.3000001512, 1.40999994516, 16.740000069, -0.609999887794, 18.9900000541, 2.36000000253, 20.030000132, -0.200000020117, 18.8100001024, 1.24999995008, 16.4600003006, 2.16999993131, 14.8900000653, 1.69999990091, 16.5600001806, 1.04000002205, 17.230000176, 2.11000006363, 13.9900002106, 0.999999981374, 14.5300002289, 0.489999958724, 15.3100002417, 2.82999986678, 18.330000135, 0.10999996379, 17.5300001656, -0.880000041127, 15.9000001684, 1.12999990404, 14.910000241, 1.60999992803, 18.3000001512, 1.95999982446, 16.3000002071, 1.67999996886, 14.7100002626, -0.340000032485, 15.2600002432, 2.31999990001, 16.8300001976, 0.659999901205, 15.6000001907, 1.80000002831, 16.6200002114, 1.93999998927, 13.9300000672, 0.860000013709, 15.6600001284, 0.0600000874698, 15.2500001542, 1.62000008553, 15.0400001696, 0.0800000292063, 12.8600001769, 1.19999991283, 15.6200000781, 2.93999993041, 16.3400001651, 0.570000049025, 15.7900002076, 0.409999938458, 15.490000174, 1.5800000374, 14.2000002131, 1.40999994516, 16.740000069, 1.67999996886, 14.7100002626, 1.2799999994, 14.760000203, -0.0299999278784, 15.800000076, 2.24999999851, 16.560000077, 0.54999994114, 15.2400002031, -1.32999993458, 17.4800001253, 0.570000029653, 16.1999999344, -0.409999904931, 16.420000131, -0.719999842644, 16.3300000709, -0.419999831468, 16.2000000969, -0.269999954402, 15.1700000453, -1.12999992639, 16.5600001694, 0.989999978095, 18.869999938, -2.26999984786, 16.6000001155, -2.71999992758, 15.8500001058, -0.789999981821, 14.4000001952, -0.609999887794, 18.9900000541, -0.340000032485, 15.2600002432, -0.0299999278784, 15.800000076, -3.35999974102, 16.5000000745, -0.0399998469651, 17.6200000244, -0.97999994725, 15.5800000791, 1.6600000979, 18.590000186, 4.10999997422, 15.1500001065, 1.58999997735, 17.4500000671, 0.480000142455, 19.5200000237, 2.96000013366, 15.8500001319, 0.600000037253, 16.3700000989, 0.220000107884, 17.3200000677, 3.03999986783, 20.4800000508, 0.22000004679, 17.6700000915, -1.34999990016, 18.5200000587, 0.720000101179, 15.9100001583, 2.36000000253, 20.030000132, 2.31999990001, 16.8300001976, 2.24999999851, 16.560000077, -0.0399998469651, 17.6200000244, 1.42000006169, 19.2200000781, 1.94999997839, 17.6300001343, -8.86619080376e-08, 18.1200001273, 2.23999989912, 15.0200001094, 1.29999994412, 17.4900000995, -0.709999872148, 18.1600000972, 0.0800001402199, 15.2000001483, 0.459999935478, 15.7400001442, -0.44999999404, 16.0600002052, 0.549999915063, 17.4800001961, -1.02999996737, 15.4400002545, -2.33000002995, 16.5900001167, -0.660000046492, 14.0300001991, -0.200000020117, 18.8100001024, 0.659999901205, 15.6000001907, 0.54999994114, 15.2400002031, -0.97999994725, 15.5800000791, 1.94999997839, 17.6300001343, 0.779999850392, 15.8000001729, 
+
+L3_cSYR2K_A_kn
+0.10000000149, 0.10000000149, 0.300000011921, 0.800000011921, 0.699999988079, 0.699999988079, 0.800000011921, 0.40000000596, 0.699999988079, 0.20000000298, 0.899999976158, 0.5, 0.600000023842, 0.20000000298, 0.40000000596, 0.899999976158, 0.5, 0.20000000298, 0.800000011921, 0.899999976158, 0.10000000149, 0.5, 0.899999976158, 0.300000011921, 0.300000011921, 0.40000000596, 0.40000000596, 0.300000011921, 0.10000000149, 0.5, 0.800000011921, 0.899999976158, 0.300000011921, 0.699999988079, 0.10000000149, 0.40000000596, 0.600000023842, 0.800000011921, 0.10000000149, 0.600000023842, 0.20000000298, 0.800000011921, 0.699999988079, 0.899999976158, 0.10000000149, 0.800000011921, 0.20000000298, 0.600000023842, 0.300000011921, 0.40000000596, 0.20000000298, 0.800000011921, 0.600000023842, 0.20000000298, 0.5, 0.300000011921, 0.300000011921, 0.300000011921, 0.899999976158, 0.300000011921, 0.20000000298, 0.899999976158, 0.600000023842, 0.699999988079, 0.5, 0.20000000298, 0.699999988079, 0.899999976158, 0.600000023842, 0.40000000596, 0.5, 0.5, 0.300000011921, 0.800000011921, 0.5, 0.300000011921, 0.5, 0.800000011921, 0.800000011921, 0.600000023842, 0.899999976158, 0.899999976158, 0.899999976158, 0.899999976158, 0.600000023842, 0.600000023842, 0.699999988079, 0.600000023842, 0.5, 0.800000011921, 0.40000000596, 0.800000011921, 0.699999988079, 0.10000000149, 0.600000023842, 0.899999976158, 0.699999988079, 0.300000011921, 0.699999988079, 0.600000023842, 0.10000000149, 0.20000000298, 0.800000011921, 0.10000000149, 0.20000000298, 0.600000023842, 0.20000000298, 0.800000011921, 0.300000011921, 0.5, 0.10000000149, 0.899999976158, 0.300000011921, 0.899999976158, 0.800000011921, 0.899999976158, 0.800000011921, 0.899999976158, 0.5, 0.300000011921, 0.899999976158, 0.40000000596, 0.20000000298, 0.5, 0.600000023842, 0.699999988079, 0.699999988079, 0.20000000298, 0.300000011921, 0.800000011921, 0.40000000596, 0.899999976158, 0.899999976158, 0.600000023842, 0.899999976158, 0.300000011921, 0.20000000298, 0.699999988079, 0.10000000149, 0.699999988079, 0.800000011921, 0.10000000149, 0.20000000298, 0.5, 0.699999988079, 0.5, 0.10000000149, 0.5, 0.10000000149, 0.600000023842, 0.800000011921, 0.699999988079, 0.699999988079, 0.40000000596, 0.899999976158, 0.800000011921, 0.300000011921, 0.10000000149, 0.40000000596, 0.10000000149, 0.800000011921, 0.10000000149, 0.300000011921, 0.10000000149, 0.600000023842, 0.699999988079, 0.600000023842, 0.699999988079, 0.5, 0.600000023842, 0.10000000149, 0.800000011921, 0.800000011921, 0.20000000298, 0.800000011921, 0.10000000149, 0.20000000298, 0.5, 0.5, 0.20000000298, 0.699999988079, 0.40000000596, 0.5, 0.899999976158, 0.10000000149, 0.20000000298, 0.600000023842, 0.300000011921, 0.300000011921, 0.10000000149, 0.800000011921, 0.300000011921, 0.899999976158, 0.699999988079, 0.600000023842, 0.800000011921, 0.899999976158, 0.20000000298, 0.20000000298, 0.699999988079, 0.899999976158, 0.300000011921, 0.699999988079, 0.10000000149, 0.20000000298, 0.20000000298, 0.20000000298, 0.699999988079, 0.899999976158, 0.600000023842, 0.699999988079, 0.20000000298, 0.800000011921, 0.10000000149, 0.800000011921, 0.40000000596, 0.5, 0.5, 0.800000011921, 0.10000000149, 0.10000000149, 0.20000000298, 0.699999988079, 0.20000000298, 0.5, 0.5, 0.600000023842, 0.40000000596, 0.699999988079, 0.800000011921, 0.40000000596, 0.10000000149, 0.800000011921, 0.699999988079, 0.800000011921, 0.20000000298, 0.300000011921, 0.10000000149, 0.40000000596, 0.699999988079, 0.40000000596, 0.20000000298, 0.5, 0.699999988079, 0.5, 0.699999988079, 0.300000011921, 0.699999988079, 0.600000023842, 0.5, 0.300000011921, 0.40000000596, 0.5, 0.5, 0.20000000298, 0.600000023842, 0.800000011921, 0.300000011921, 0.800000011921, 0.5, 0.300000011921, 0.5, 0.699999988079, 0.20000000298, 0.20000000298, 0.699999988079, 0.10000000149, 0.5, 0.699999988079, 0.5, 0.899999976158, 0.899999976158, 0.699999988079, 0.10000000149, 0.600000023842, 0.699999988079, 0.300000011921, 0.800000011921, 0.20000000298, 0.300000011921, 0.899999976158, 0.300000011921, 0.40000000596, 0.899999976158, 0.20000000298, 0.699999988079, 0.600000023842, 0.300000011921, 0.10000000149, 0.5, 0.300000011921, 0.699999988079, 0.5, 0.800000011921, 0.699999988079, 0.600000023842, 0.5, 0.699999988079, 0.899999976158, 0.899999976158, 0.40000000596, 0.5, 0.10000000149, 0.20000000298, 0.10000000149, 0.20000000298, 0.800000011921, 0.600000023842, 0.899999976158, 0.300000011921, 0.20000000298, 0.699999988079, 0.600000023842, 0.20000000298, 0.5, 0.699999988079, 0.800000011921, 0.10000000149, 0.10000000149, 0.600000023842, 0.300000011921, 0.10000000149, 0.20000000298, 0.10000000149, 0.600000023842, 0.300000011921, 0.699999988079, 0.20000000298, 0.20000000298, 0.10000000149, 0.20000000298, 0.5, 0.20000000298, 0.5, 0.300000011921, 0.40000000596, 0.40000000596, 0.300000011921, 0.699999988079, 0.899999976158, 0.5, 0.40000000596, 0.899999976158, 0.800000011921, 0.899999976158, 0.10000000149, 0.600000023842, 0.899999976158, 0.20000000298, 0.699999988079, 0.800000011921, 0.899999976158, 0.5, 0.600000023842, 0.600000023842, 0.800000011921, 0.899999976158, 0.699999988079, 0.300000011921, 0.40000000596, 0.300000011921, 0.40000000596, 0.10000000149, 0.699999988079, 0.699999988079, 0.10000000149, 0.699999988079, 0.5, 0.699999988079, 0.5, 0.899999976158, 0.300000011921, 0.40000000596, 0.40000000596, 0.600000023842, 0.40000000596, 0.10000000149, 0.40000000596, 0.600000023842, 0.5, 0.300000011921, 0.899999976158, 0.40000000596, 0.300000011921, 0.600000023842, 0.10000000149, 0.40000000596, 0.10000000149, 0.5, 0.5, 0.800000011921, 0.40000000596, 0.899999976158, 0.800000011921, 0.800000011921, 0.10000000149, 0.300000011921, 0.300000011921, 0.600000023842, 0.40000000596, 0.699999988079, 0.899999976158, 0.699999988079, 0.10000000149, 0.699999988079, 0.800000011921, 0.600000023842, 0.300000011921, 0.800000011921, 0.5, 0.600000023842, 0.20000000298, 0.20000000298, 0.40000000596, 0.5, 0.300000011921, 0.699999988079, 0.899999976158, 0.600000023842, 0.5, 0.699999988079, 0.20000000298, 0.800000011921, 0.300000011921, 0.600000023842, 0.699999988079, 0.300000011921, 0.800000011921, 0.899999976158, 0.699999988079, 0.600000023842, 0.899999976158, 0.300000011921, 0.600000023842, 0.899999976158, 0.699999988079, 0.40000000596, 0.40000000596, 0.300000011921, 0.899999976158, 0.20000000298, 0.5, 0.5, 0.899999976158, 0.40000000596, 0.5, 0.699999988079, 0.899999976158, 0.800000011921, 0.699999988079, 0.40000000596, 0.300000011921, 0.800000011921, 0.699999988079, 0.899999976158, 0.600000023842, 0.600000023842, 0.300000011921, 0.699999988079, 0.899999976158, 0.10000000149, 0.40000000596, 0.20000000298, 0.899999976158, 0.899999976158, 0.800000011921, 0.20000000298, 0.10000000149, 0.5, 0.5, 0.20000000298, 0.5, 0.40000000596, 0.600000023842, 0.40000000596, 0.600000023842, 0.899999976158, 0.10000000149, 0.899999976158, 0.300000011921, 0.20000000298, 0.10000000149, 0.699999988079, 0.40000000596, 0.699999988079, 0.600000023842, 0.10000000149, 0.40000000596, 0.300000011921, 0.600000023842, 0.40000000596, 0.10000000149, 0.5, 0.699999988079, 0.20000000298, 0.40000000596, 0.800000011921, 0.5, 0.600000023842, 0.899999976158, 0.5, 0.899999976158, 0.10000000149, 0.300000011921, 0.899999976158, 0.800000011921, 0.699999988079, 0.899999976158, 0.10000000149, 0.899999976158, 0.20000000298, 0.40000000596, 0.40000000596, 0.899999976158, 0.5, 0.5, 0.800000011921, 0.800000011921, 0.300000011921, 0.5, 0.20000000298, 0.40000000596, 0.899999976158, 0.800000011921, 0.10000000149, 0.800000011921, 0.300000011921, 0.899999976158, 0.600000023842, 0.899999976158, 0.20000000298, 0.10000000149, 0.10000000149, 0.40000000596, 0.5, 0.699999988079, 0.600000023842, 0.600000023842, 0.699999988079, 0.800000011921, 0.800000011921, 0.600000023842, 0.899999976158, 0.699999988079, 
+
+L3_cSYR2K_B_kn
+0.800000011921, 0.699999988079, 0.899999976158, 0.40000000596, 0.5, 0.600000023842, 0.300000011921, 0.800000011921, 0.300000011921, 0.20000000298, 0.600000023842, 0.20000000298, 0.800000011921, 0.600000023842, 0.800000011921, 0.10000000149, 0.800000011921, 0.899999976158, 0.300000011921, 0.5, 0.800000011921, 0.20000000298, 0.20000000298, 0.699999988079, 0.5, 0.10000000149, 0.10000000149, 0.699999988079, 0.40000000596, 0.40000000596, 0.10000000149, 0.10000000149, 0.40000000596, 0.10000000149, 0.10000000149, 0.800000011921, 0.5, 0.800000011921, 0.40000000596, 0.20000000298, 0.10000000149, 0.10000000149, 0.699999988079, 0.899999976158, 0.899999976158, 0.600000023842, 0.300000011921, 0.20000000298, 0.899999976158, 0.40000000596, 0.899999976158, 0.800000011921, 0.300000011921, 0.20000000298, 0.10000000149, 0.20000000298, 0.899999976158, 0.600000023842, 0.5, 0.10000000149, 0.699999988079, 0.800000011921, 0.10000000149, 0.600000023842, 0.600000023842, 0.5, 0.10000000149, 0.699999988079, 0.40000000596, 0.5, 0.699999988079, 0.5, 0.10000000149, 0.800000011921, 0.699999988079, 0.899999976158, 0.800000011921, 0.40000000596, 0.5, 0.300000011921, 0.800000011921, 0.5, 0.800000011921, 0.699999988079, 0.40000000596, 0.20000000298, 0.10000000149, 0.300000011921, 0.300000011921, 0.40000000596, 0.600000023842, 0.10000000149, 0.20000000298, 0.699999988079, 0.300000011921, 0.40000000596, 0.5, 0.5, 0.5, 0.800000011921, 0.699999988079, 0.10000000149, 0.600000023842, 0.5, 0.800000011921, 0.600000023842, 0.899999976158, 0.10000000149, 0.20000000298, 0.5, 0.699999988079, 0.5, 0.899999976158, 0.40000000596, 0.10000000149, 0.899999976158, 0.800000011921, 0.10000000149, 0.20000000298, 0.10000000149, 0.800000011921, 0.800000011921, 0.899999976158, 0.699999988079, 0.699999988079, 0.300000011921, 0.40000000596, 0.600000023842, 0.40000000596, 0.10000000149, 0.600000023842, 0.699999988079, 0.800000011921, 0.899999976158, 0.40000000596, 0.699999988079, 0.5, 0.10000000149, 0.300000011921, 0.899999976158, 0.600000023842, 0.40000000596, 0.40000000596, 0.20000000298, 0.300000011921, 0.300000011921, 0.800000011921, 0.899999976158, 0.899999976158, 0.699999988079, 0.800000011921, 0.899999976158, 0.5, 0.300000011921, 0.600000023842, 0.5, 0.10000000149, 0.20000000298, 0.800000011921, 0.899999976158, 0.600000023842, 0.899999976158, 0.40000000596, 0.40000000596, 0.899999976158, 0.20000000298, 0.899999976158, 0.899999976158, 0.699999988079, 0.699999988079, 0.800000011921, 0.40000000596, 0.20000000298, 0.40000000596, 0.800000011921, 0.699999988079, 0.600000023842, 0.800000011921, 0.20000000298, 0.40000000596, 0.300000011921, 0.699999988079, 0.899999976158, 0.10000000149, 0.300000011921, 0.699999988079, 0.20000000298, 0.5, 0.600000023842, 0.10000000149, 0.800000011921, 0.600000023842, 0.300000011921, 0.300000011921, 0.5, 0.300000011921, 0.20000000298, 0.600000023842, 0.5, 0.800000011921, 0.5, 0.899999976158, 0.800000011921, 0.600000023842, 0.800000011921, 0.5, 0.20000000298, 0.5, 0.40000000596, 0.600000023842, 0.899999976158, 0.300000011921, 0.10000000149, 0.40000000596, 0.20000000298, 0.5, 0.5, 0.10000000149, 0.699999988079, 0.899999976158, 0.800000011921, 0.699999988079, 0.600000023842, 0.20000000298, 0.10000000149, 0.600000023842, 0.600000023842, 0.40000000596, 0.300000011921, 0.5, 0.899999976158, 0.699999988079, 0.5, 0.300000011921, 0.40000000596, 0.20000000298, 0.20000000298, 0.899999976158, 0.699999988079, 0.300000011921, 0.300000011921, 0.899999976158, 0.40000000596, 0.600000023842, 0.600000023842, 0.300000011921, 0.5, 0.699999988079, 0.800000011921, 0.600000023842, 0.40000000596, 0.899999976158, 0.899999976158, 0.20000000298, 0.600000023842, 0.699999988079, 0.5, 0.800000011921, 0.5, 0.899999976158, 0.20000000298, 0.699999988079, 0.300000011921, 0.10000000149, 0.20000000298, 0.899999976158, 0.20000000298, 0.20000000298, 0.600000023842, 0.300000011921, 0.699999988079, 0.699999988079, 0.699999988079, 0.300000011921, 0.5, 0.20000000298, 0.800000011921, 0.600000023842, 0.899999976158, 0.5, 0.40000000596, 0.699999988079, 0.300000011921, 0.300000011921, 0.20000000298, 0.899999976158, 0.20000000298, 0.899999976158, 0.699999988079, 0.699999988079, 0.10000000149, 0.699999988079, 0.600000023842, 0.600000023842, 0.5, 0.40000000596, 0.699999988079, 0.600000023842, 0.5, 0.699999988079, 0.600000023842, 0.600000023842, 0.40000000596, 0.10000000149, 0.899999976158, 0.40000000596, 0.10000000149, 0.800000011921, 0.899999976158, 0.300000011921, 0.5, 0.899999976158, 0.40000000596, 0.300000011921, 0.699999988079, 0.40000000596, 0.899999976158, 0.600000023842, 0.800000011921, 0.40000000596, 0.600000023842, 0.300000011921, 0.5, 0.40000000596, 0.300000011921, 0.800000011921, 0.899999976158, 0.5, 0.300000011921, 0.800000011921, 0.899999976158, 0.20000000298, 0.10000000149, 0.899999976158, 0.40000000596, 0.300000011921, 0.899999976158, 0.899999976158, 0.699999988079, 0.300000011921, 0.600000023842, 0.20000000298, 0.20000000298, 0.699999988079, 0.300000011921, 0.600000023842, 0.699999988079, 0.20000000298, 0.10000000149, 0.5, 0.699999988079, 0.699999988079, 0.699999988079, 0.5, 0.5, 0.20000000298, 0.20000000298, 0.899999976158, 0.5, 0.600000023842, 0.40000000596, 0.300000011921, 0.20000000298, 0.800000011921, 0.40000000596, 0.20000000298, 0.600000023842, 0.20000000298, 0.5, 0.40000000596, 0.20000000298, 0.899999976158, 0.40000000596, 0.300000011921, 0.20000000298, 0.899999976158, 0.10000000149, 0.800000011921, 0.699999988079, 0.40000000596, 0.20000000298, 0.10000000149, 0.800000011921, 0.800000011921, 0.5, 0.600000023842, 0.20000000298, 0.20000000298, 0.20000000298, 0.699999988079, 0.300000011921, 0.20000000298, 0.5, 0.600000023842, 0.899999976158, 0.10000000149, 0.699999988079, 0.800000011921, 0.10000000149, 0.699999988079, 0.40000000596, 0.5, 0.300000011921, 0.300000011921, 0.899999976158, 0.20000000298, 0.899999976158, 0.10000000149, 0.800000011921, 0.899999976158, 0.300000011921, 0.699999988079, 0.699999988079, 0.10000000149, 0.10000000149, 0.699999988079, 0.20000000298, 0.600000023842, 0.20000000298, 0.40000000596, 0.899999976158, 0.699999988079, 0.5, 0.899999976158, 0.10000000149, 0.40000000596, 0.40000000596, 0.600000023842, 0.699999988079, 0.800000011921, 0.699999988079, 0.40000000596, 0.899999976158, 0.699999988079, 0.300000011921, 0.800000011921, 0.300000011921, 0.40000000596, 0.600000023842, 0.600000023842, 0.699999988079, 0.600000023842, 0.699999988079, 0.300000011921, 0.5, 0.899999976158, 0.600000023842, 0.20000000298, 0.5, 0.899999976158, 0.800000011921, 0.20000000298, 0.699999988079, 0.40000000596, 0.20000000298, 0.600000023842, 0.40000000596, 0.600000023842, 0.300000011921, 0.899999976158, 0.10000000149, 0.20000000298, 0.20000000298, 0.699999988079, 0.699999988079, 0.699999988079, 0.10000000149, 0.10000000149, 0.800000011921, 0.5, 0.899999976158, 0.600000023842, 0.600000023842, 0.899999976158, 0.40000000596, 0.899999976158, 0.10000000149, 0.20000000298, 0.600000023842, 0.899999976158, 0.899999976158, 0.699999988079, 0.800000011921, 0.600000023842, 0.600000023842, 0.5, 0.800000011921, 0.300000011921, 0.40000000596, 0.800000011921, 0.10000000149, 0.10000000149, 0.899999976158, 0.5, 0.300000011921, 0.300000011921, 0.10000000149, 0.800000011921, 0.5, 0.699999988079, 0.40000000596, 0.20000000298, 0.5, 0.600000023842, 0.899999976158, 0.800000011921, 0.600000023842, 0.800000011921, 0.800000011921, 0.10000000149, 0.800000011921, 0.800000011921, 0.40000000596, 0.600000023842, 0.800000011921, 0.20000000298, 0.899999976158, 0.899999976158, 0.20000000298, 0.10000000149, 0.699999988079, 0.600000023842, 0.40000000596, 0.699999988079, 0.300000011921, 0.10000000149, 0.5, 0.300000011921, 0.40000000596, 0.899999976158, 0.800000011921, 0.20000000298, 0.20000000298, 0.899999976158, 0.5, 0.300000011921, 0.800000011921, 0.699999988079, 0.800000011921, 0.699999988079, 0.5, 0.40000000596, 0.40000000596, 0.699999988079, 
+
+L3_cSYR2K_o_T
+1.22000005275, 15.4400001681, -0.509999865443, 17.0800001968, 2.36999992535, 16.5100001806, 1.20000006333, 16.6700001697, 1.30000008121, 16.4700001027, 2.79000000492, 17.7300002088, 1.34000004664, 18.4100000644, 1.730000211, 16.4800001588, -0.0699999022484, 15.1300001179, 0.0600001001358, 16.6600002961, 1.43000004187, 16.8800001059, 0.490000062287, 16.9500001684, 2.08000002325, 14.8600002074, -0.379999884665, 16.7800001097, 0.500000003725, 17.0500001132, 1.98000019312, 19.5400001651, 1.06000005022, 16.4600000502, -0.509999865443, 17.0800001968, -2.22000001401, 17.9800001112, -0.520000070632, 19.4800000732, -1.68999990359, 18.0800001059, -1.30999996603, 17.6400000779, 0.0199999335408, 19.3900001755, -1.8100000599, 18.4100001098, -0.819999798685, 18.6900000973, -2.72999991447, 18.3500000946, -2.22999996811, 17.5500002272, -0.199999958277, 17.1700001779, -2.83999988571, 18.1800001559, 0.759999995083, 15.4100001143, -2.98999989912, 18.3500000976, -2.34000000194, 18.3500001669, -0.769999940991, 21.00000007, -0.889999948293, 17.9300000434, 2.36999992535, 16.5100001806, -0.520000070632, 19.4800000732, 1.68000001878, 17.9800002736, 1.3100000152, 17.4100001687, 0.209999983162, 17.3400001204, 1.75999992505, 19.4100001523, -0.130000067949, 16.780000205, 1.71000004947, 18.1100001746, 0.850000056624, 17.8000001043, 1.18999998331, 16.5000002913, 1.09999995306, 17.110000127, 0.200000044703, 18.64000011, 2.34000000864, 16.2500001259, -0.48999997437, 17.7000001408, 0.879999867529, 17.3200001839, 1.81999998793, 19.8500000969, 1.71000004798, 17.6199999902, 1.20000006333, 16.6700001697, -1.68999990359, 18.0800001059, 1.3100000152, 17.4100001687, 1.22000002444, 17.6000001162, -0.21999992609, 16.0600001448, 1.15000005588, 18.990000136, -0.519999950677, 19.560000001, 0.930000178963, 16.4200000758, -1.05999983117, 16.9100000785, -1.33999989986, 16.2400002195, 0.370000127256, 16.8300001216, -2.51999988362, 19.1200000602, 1.84999997914, 14.5500001028, -0.779999931604, 18.2600000279, 0.299999913573, 16.9900001256, -0.00999989748001, 19.4400001696, 0.310000076294, 17.029999951, 1.30000008121, 16.4700001027, -1.30999996603, 17.6400000779, 0.209999983162, 17.3400001204, -0.21999992609, 16.0600001448, -1.31999990374, 17.6999999866, 0.740000051856, 18.4300001283, -8.9406961834e-09, 17.5900000258, 1.62000012055, 17.9899999885, 0.29000004217, 16.2700000952, -0.149999985844, 16.070000201, 0.34000003472, 16.6300001074, -0.639999947548, 17.7300001231, 2.29999995604, 15.0599999839, -2.03999987453, 18.1900000288, 0.569999973029, 16.380000176, -0.0599999593198, 18.5300001104, 0.790000003427, 16.8699999708, 2.79000000492, 17.7300002088, 0.0199999335408, 19.3900001755, 1.75999992505, 19.4100001523, 1.15000005588, 18.990000136, 0.740000051856, 18.4300001283, 1.54000006229, 19.3600001955, 0.360000003278, 18.6400002255, 2.31000016347, 18.7000001453, -0.309999911636, 18.4100000443, 0.850000028312, 17.6700003597, 2.47000000954, 16.7000002481, 0.400000128895, 18.2000001714, 3.13999989837, 15.610000162, -0.959999958575, 19.040000069, -2.23517417908e-08, 18.7500001788, 2.46000001073, 20.5300002177, 2.39999989346, 19.6900000466, 1.34000004664, 18.4100000644, -1.8100000599, 18.4100001098, -0.130000067949, 16.780000205, -0.519999950677, 19.560000001, -8.9406961834e-09, 17.5900000258, 0.360000003278, 18.6400002255, -1.72000004381, 19.280000056, 0.300000147521, 18.2800000747, -1.05999995783, 17.000000079, -1.34999995157, 17.210000194, 0.449999964982, 16.7000000849, -1.45000008419, 18.3200001138, 0.789999998957, 15.9500000551, -1.17000004977, 17.6300000665, -0.990000051856, 18.300000082, -1.25999997273, 20.2200000237, -0.820000018477, 18.0699998963, 1.730000211, 16.4800001588, -0.819999798685, 18.6900000973, 1.71000004947, 18.1100001746, 0.930000178963, 16.4200000758, 1.62000012055, 17.9899999885, 2.31000016347, 18.7000001453, 0.300000147521, 18.2800000747, 3.72000023305, 19.120000011, 0.530000184178, 16.540000174, 0.990000150949, 16.920000236, 1.77000007659, 17.1400000988, 0.520000198781, 17.1000001274, 3.07000006914, 14.9200001019, 0.200000292063, 18.300000044, 1.69000015989, 17.620000122, 2.32000020623, 19.1300001194, 3.09999999553, 17.2000000104, -0.0699999022484, 15.1300001179, -2.72999991447, 18.3500000946, 0.850000056624, 17.8000001043, -1.05999983117, 16.9100000785, 0.29000004217, 16.2700000952, -0.309999911636, 18.4100000443, -1.05999995783, 17.000000079, 0.530000184178, 16.540000174, -2.81999984562, 16.1399999878, 0.290000128597, 15.3800002542, 0.240000074953, 15.0700001682, -1.00999985278, 17.6200000125, 1.20000000447, 16.0399999818, -1.92999989286, 16.9500000395, -0.470000005811, 17.6000000566, 0.600000137836, 19.1900000526, -0.0699998754263, 16.859999963, 0.0600001001358, 16.6600002961, -2.22999996811, 17.5500002272, 1.18999998331, 16.5000002913, -1.33999989986, 16.2400002195, -0.149999985844, 16.070000201, 0.850000028312, 17.6700003597, -1.34999995157, 17.210000194, 0.990000150949, 16.920000236, 0.290000128597, 15.3800002542, -0.459999933243, 16.2800003749, 1.92999996364, 15.0800002326, -0.869999902993, 17.090000256, 1.02000011086, 15.0500001572, -1.96999997526, 16.6800002371, -0.639999966174, 16.2300002691, 1.3199999328, 18.5300002185, 0.639999983311, 17.690000075, 1.43000004187, 16.8800001059, -0.199999958277, 17.1700001779, 1.09999995306, 17.110000127, 0.370000127256, 16.8300001216, 0.34000003472, 16.6300001074, 2.47000000954, 16.7000002481, 0.449999964982, 16.7000000849, 1.77000007659, 17.1400000988, 0.240000074953, 15.0700001682, 1.92999996364, 15.0800002326, 0.8199999246, 16.2200001884, -0.0399999661744, 17.060000194, 1.99999991283, 14.930000129, 2.2351743123e-08, 17.8800001074, -0.520000060946, 16.5000001632, 2.45000001192, 18.6400001755, 2.25999996305, 16.1499999732, 0.490000062287, 16.9500001684, -2.83999988571, 18.1800001559, 0.200000044703, 18.64000011, -2.51999988362, 19.1200000602, -0.639999947548, 17.7300001231, 0.400000128895, 18.2000001714, -1.45000008419, 18.3200001138, 0.520000198781, 17.1000001274, -1.00999985278, 17.6200000125, -0.869999902993, 17.090000256, -0.0399999661744, 17.060000194, -0.479999893606, 17.960000115, 1.77000001624, 15.3900001465, -2.14999997318, 18.6100000472, -0.419999999106, 18.6600001471, -0.659999839365, 20.0500001319, -0.989999946803, 18.7799999912, 2.08000002325, 14.8600002074, 0.759999995083, 15.4100001143, 2.34000000864, 16.2500001259, 1.84999997914, 14.5500001028, 2.29999995604, 15.0599999839, 3.13999989837, 15.610000162, 0.789999998957, 15.9500000551, 3.07000006914, 14.9200001019, 1.20000000447, 16.0399999818, 1.02000011086, 15.0500001572, 1.99999991283, 14.930000129, 1.77000001624, 15.3900001465, 3.0599999705, 15.3400000504, 0.48999997288, 15.9300000151, 1.48999998033, 15.9500001267, 2.64000005856, 16.9100000554, 2.94999992028, 15.7499999575, -0.379999884665, 16.7800001097, -2.98999989912, 18.3500000976, -0.48999997437, 17.7000001408, -0.779999931604, 18.2600000279, -2.03999987453, 18.1900000288, -0.959999958575, 19.040000069, -1.17000004977, 17.6300000665, 0.200000292063, 18.300000044, -1.92999989286, 16.9500000395, -1.96999997526, 16.6800002371, 2.2351743123e-08, 17.8800001074, -2.14999997318, 18.6100000472, 0.48999997288, 15.9300000151, -2.93999978065, 17.880000065, -1.21999996409, 17.3700001764, -0.22999995023, 19.8500000782, -0.829999937564, 18.0299998936, 0.500000003725, 17.0500001132, -2.34000000194, 18.3500001669, 0.879999867529, 17.3200001839, 0.299999913573, 16.9900001256, 0.569999973029, 16.380000176, -2.23517417908e-08, 18.7500001788, -0.990000051856, 18.300000082, 1.69000015989, 17.620000122, -0.470000005811, 17.6000000566, -0.639999966174, 16.2300002691, -0.520000060946, 16.5000001632, -0.419999999106, 18.6600001471, 1.48999998033, 15.9500001267, -1.21999996409, 17.3700001764, -0.0600001075864, 18.3800001216, 0.500000043958, 20.4100000875, -0.289999987036, 16.9700000468, 1.98000019312, 19.5400001651, -0.769999940991, 21.00000007, 1.81999998793, 19.8500000969, -0.00999989748001, 19.4400001696, -0.0599999593198, 18.5300001104, 2.46000001073, 20.5300002177, -1.25999997273, 20.2200000237, 2.32000020623, 19.1300001194, 0.600000137836, 19.1900000526, 1.3199999328, 18.5300002185, 2.45000001192, 18.6400001755, -0.659999839365, 20.0500001319, 2.64000005856, 16.9100000554, -0.22999995023, 19.8500000782, 0.500000043958, 20.4100000875, 1.8399999401, 23.1600000033, 2.55999991685, 20.7199999022, 1.06000005022, 16.4600000502, -0.889999948293, 17.9300000434, 1.71000004798, 17.6199999902, 0.310000076294, 17.029999951, 0.790000003427, 16.8699999708, 2.39999989346, 19.6900000466, -0.820000018477, 18.0699998963, 3.09999999553, 17.2000000104, -0.0699998754263, 16.859999963, 0.639999983311, 17.690000075, 2.25999996305, 16.1499999732, -0.989999946803, 18.7799999912, 2.94999992028, 15.7499999575, -0.829999937564, 18.0299998936, -0.289999987036, 16.9700000468, 2.55999991685, 20.7199999022, 0.679999991953, 18.0799997923, 
+
+L3_zSYR2K_A_nk
+0.7, 0.6, 0.3, 0.5, 0.4, 0.8, 0.6, 0.8, 0.9, 0.9, 0.5, 0.8, 0.7, 0.8, 0.7, 0.4, 0.2, 0.1, 0.8, 0.3, 0.6, 0.8, 0.8, 0.1, 0.8, 0.8, 0.5, 0.8, 0.8, 0.4, 0.2, 0.9, 0.5, 0.6, 0.8, 0.8, 0.7, 0.8, 0.1, 0.1, 0.6, 0.3, 0.8, 0.2, 0.6, 0.2, 0.6, 0.8, 0.8, 0.3, 0.9, 0.6, 0.4, 0.8, 0.8, 0.5, 0.8, 0.7, 0.7, 0.9, 0.5, 0.9, 0.8, 0.5, 0.4, 0.1, 0.3, 0.2, 0.4, 0.9, 0.5, 0.6, 0.3, 0.5, 0.3, 0.8, 0.9, 0.1, 0.8, 0.4, 0.9, 0.8, 0.2, 0.9, 0.5, 0.7, 0.2, 0.5, 0.6, 0.2, 0.1, 0.7, 0.6, 0.6, 0.8, 0.7, 0.7, 0.4, 0.4, 0.8, 0.1, 0.5, 0.7, 0.7, 0.1, 0.5, 0.8, 0.4, 0.2, 0.6, 0.3, 0.5, 0.7, 0.4, 0.2, 0.1, 0.7, 0.7, 0.1, 0.3, 0.7, 0.7, 0.8, 0.3, 0.1, 0.9, 0.3, 0.6, 0.3, 0.5, 0.8, 0.7, 0.4, 0.2, 0.4, 0.7, 0.8, 0.5, 0.5, 0.8, 0.3, 0.4, 0.2, 0.1, 0.3, 0.1, 0.6, 0.5, 0.7, 0.1, 0.3, 0.2, 0.2, 0.3, 0.9, 0.4, 0.6, 0.8, 0.7, 0.8, 0.5, 0.2, 0.9, 0.9, 0.6, 0.2, 0.1, 0.9, 0.9, 0.3, 0.8, 0.8, 0.6, 0.8, 0.8, 0.2, 0.1, 0.2, 0.2, 0.2, 0.2, 0.2, 0.6, 0.1, 0.4, 0.5, 0.6, 0.9, 0.1, 0.6, 0.2, 0.2, 0.7, 0.6, 0.5, 0.8, 0.3, 0.2, 0.2, 0.2, 0.9, 0.6, 0.5, 0.9, 0.4, 0.6, 0.4, 0.3, 0.9, 0.6, 0.4, 0.7, 0.8, 0.5, 0.7, 0.7, 0.5, 0.7, 0.4, 0.1, 0.7, 0.6, 0.6, 0.6, 0.2, 0.9, 0.9, 0.5, 0.2, 0.2, 0.4, 0.5, 0.2, 0.7, 0.2, 0.5, 0.3, 0.4, 0.6, 0.3, 0.6, 0.8, 0.6, 0.9, 0.5, 0.7, 0.6, 0.8, 0.1, 0.4, 0.8, 0.5, 0.2, 0.1, 0.7, 0.1, 0.6, 0.1, 0.2, 0.3, 0.3, 0.2, 0.5, 0.9, 0.3, 0.8, 0.8, 0.9, 0.2, 0.1, 0.3, 0.4, 0.3, 0.5, 0.3, 0.4, 0.7, 0.6, 0.5, 0.4, 0.7, 0.7, 0.5, 0.5, 0.7, 0.6, 0.9, 0.8, 0.7, 0.1, 0.2, 0.5, 0.7, 0.1, 0.3, 0.4, 0.3, 0.3, 0.4, 0.6, 0.3, 0.4, 0.1, 0.9, 0.4, 0.3, 0.1, 0.8, 0.1, 0.1, 0.6, 0.2, 0.4, 0.2, 0.2, 0.7, 0.9, 0.7, 0.5, 0.8, 0.4, 0.6, 0.2, 0.8, 0.7, 0.5, 0.6, 0.7, 0.2, 0.3, 0.2, 0.2, 0.8, 0.3, 0.6, 0.9, 0.3, 0.4, 0.5, 0.4, 0.8, 0.7, 0.5, 0.3, 0.1, 0.5, 0.8, 0.4, 0.1, 0.7, 0.1, 0.6, 0.2, 0.9, 0.3, 0.3, 0.1, 0.1, 0.9, 0.6, 0.2, 0.9, 0.6, 0.8, 0.6, 0.3, 0.4, 0.3, 0.8, 0.5, 0.5, 0.7, 0.9, 0.7, 0.6, 0.5, 0.4, 0.5, 0.8, 0.4, 0.3, 0.5, 0.9, 0.7, 0.9, 0.1, 0.5, 0.7, 0.9, 0.9, 0.2, 0.3, 0.9, 0.6, 0.1, 0.2, 0.7, 0.2, 0.1, 0.8, 0.3, 0.1, 0.9, 0.7, 0.5, 0.4, 0.5, 0.6, 0.1, 0.9, 0.1, 0.2, 0.7, 0.2, 0.2, 0.5, 0.1, 0.5, 0.4, 0.9, 0.1, 0.3, 0.1, 0.8, 0.9, 0.4, 0.2, 0.3, 0.6, 0.7, 0.2, 0.9, 0.1, 0.4, 0.4, 0.5, 0.7, 0.1, 0.9, 0.8, 0.2, 0.3, 0.9, 0.7, 0.8, 0.5, 0.2, 0.2, 0.2, 0.7, 0.9, 0.6, 0.6, 0.6, 0.1, 0.7, 0.1, 0.4, 0.8, 0.3, 0.7, 0.7, 0.5, 0.1, 0.7, 0.3, 0.9, 0.5, 0.5, 0.2, 0.5, 0.1, 0.4, 0.6, 0.8, 0.3, 0.5, 0.2, 0.5, 0.2, 0.6, 0.7, 0.3, 0.8, 0.7, 0.2, 0.3, 0.6, 0.6, 0.1, 0.7, 0.1, 0.5, 0.7, 0.7, 0.6, 0.3, 0.7, 0.2, 0.9, 0.3, 0.5, 0.5, 0.1, 0.8, 0.7, 0.2, 0.5, 0.2, 0.1, 0.8, 0.4, 0.8, 0.7, 0.2, 0.1, 0.5, 0.5, 0.6, 0.2, 0.7, 0.7, 0.1, 0.1, 0.1, 0.7, 0.6, 0.3, 0.4, 0.9, 0.6, 0.3, 0.1, 0.3, 0.1, 0.3, 0.9, 0.8, 0.7, 0.5, 0.9, 0.3, 0.7, 0.4, 
+
+L3_zSYR2K_B_nk
+0.5, 0.6, 0.2, 0.8, 0.6, 0.8, 0.2, 0.7, 0.2, 0.6, 0.6, 0.7, 0.9, 0.3, 0.6, 0.2, 0.4, 0.3, 0.2, 0.2, 0.9, 0.8, 0.4, 0.7, 0.7, 0.7, 0.5, 0.6, 0.8, 0.6, 0.9, 0.7, 0.4, 0.9, 0.4, 0.9, 0.9, 0.7, 0.1, 0.4, 0.9, 0.7, 0.8, 0.8, 0.2, 0.9, 0.2, 0.6, 0.6, 0.7, 0.5, 0.9, 0.1, 0.2, 0.8, 0.8, 0.5, 0.3, 0.5, 0.1, 0.5, 0.4, 0.2, 0.5, 0.7, 0.2, 0.9, 0.6, 0.4, 0.4, 0.1, 0.7, 0.3, 0.7, 0.5, 0.1, 0.7, 0.3, 0.9, 0.6, 0.9, 0.7, 0.9, 0.8, 0.6, 0.9, 0.4, 0.7, 0.6, 0.8, 0.8, 0.3, 0.6, 0.4, 0.4, 0.3, 0.4, 0.7, 0.1, 0.1, 0.5, 0.8, 0.3, 0.9, 0.4, 0.7, 0.4, 0.9, 0.8, 0.3, 0.7, 0.8, 0.3, 0.9, 0.3, 0.3, 0.8, 0.8, 0.7, 0.5, 0.8, 0.1, 0.2, 0.3, 0.7, 0.6, 0.1, 0.8, 0.8, 0.7, 0.1, 0.5, 0.3, 0.4, 0.8, 0.8, 0.8, 0.9, 0.5, 0.5, 0.8, 0.2, 0.4, 0.2, 0.2, 0.2, 0.2, 0.1, 0.8, 0.1, 0.7, 0.5, 0.3, 0.9, 0.8, 0.9, 0.7, 0.3, 0.8, 0.5, 0.8, 0.6, 0.7, 0.3, 0.4, 0.3, 0.8, 0.7, 0.2, 0.2, 0.4, 0.1, 0.4, 0.3, 0.7, 0.7, 0.8, 0.9, 0.7, 0.4, 0.6, 0.1, 0.3, 0.5, 0.4, 0.4, 0.1, 0.2, 0.9, 0.5, 0.5, 0.2, 0.2, 0.9, 0.7, 0.6, 0.7, 0.5, 0.6, 0.3, 0.6, 0.4, 0.5, 0.5, 0.4, 0.7, 0.4, 0.4, 0.3, 0.5, 0.4, 0.2, 0.1, 0.5, 0.9, 0.9, 0.2, 0.5, 0.8, 0.2, 0.5, 0.4, 0.8, 0.9, 0.3, 0.5, 0.4, 0.2, 0.2, 0.1, 0.8, 0.3, 0.9, 0.1, 0.3, 0.2, 0.1, 0.3, 0.8, 0.3, 0.3, 0.7, 0.6, 0.7, 0.8, 0.2, 0.9, 0.6, 0.9, 0.3, 0.5, 0.7, 0.9, 0.1, 0.9, 0.9, 0.4, 0.7, 0.3, 0.1, 0.1, 0.7, 0.8, 0.5, 0.7, 0.6, 0.1, 0.5, 0.1, 0.3, 0.8, 0.8, 0.5, 0.1, 0.4, 0.8, 0.6, 0.9, 0.6, 0.4, 0.2, 0.2, 0.1, 0.7, 0.9, 0.5, 0.7, 0.4, 0.1, 0.7, 0.4, 0.3, 0.8, 0.8, 0.2, 0.9, 0.9, 0.8, 0.9, 0.2, 0.5, 0.6, 0.2, 0.2, 0.2, 0.2, 0.1, 0.8, 0.6, 0.2, 0.6, 0.4, 0.2, 0.3, 0.2, 0.3, 0.2, 0.6, 0.4, 0.2, 0.6, 0.4, 0.8, 0.7, 0.8, 0.5, 0.2, 0.9, 0.6, 0.1, 0.3, 0.2, 0.1, 0.8, 0.3, 0.6, 0.5, 0.5, 0.8, 0.3, 0.9, 0.8, 0.9, 0.7, 0.8, 0.6, 0.5, 0.9, 0.9, 0.5, 0.5, 0.4, 0.1, 0.2, 0.3, 0.1, 0.8, 0.6, 0.8, 0.9, 0.1, 0.7, 0.6, 0.7, 0.7, 0.9, 0.5, 0.6, 0.8, 0.1, 0.2, 0.7, 0.3, 0.9, 0.7, 0.5, 0.9, 0.2, 0.8, 0.2, 0.5, 0.2, 0.8, 0.5, 0.1, 0.2, 0.3, 0.2, 0.2, 0.2, 0.1, 0.5, 0.7, 0.2, 0.4, 0.3, 0.6, 0.9, 0.1, 0.9, 0.6, 0.2, 0.8, 0.9, 0.3, 0.2, 0.6, 0.8, 0.5, 0.5, 0.3, 0.4, 0.4, 0.1, 0.4, 0.4, 0.9, 0.2, 0.6, 0.5, 0.5, 0.1, 0.9, 0.1, 0.1, 0.2, 0.1, 0.2, 0.4, 0.9, 0.1, 0.6, 0.1, 0.2, 0.6, 0.5, 0.9, 0.2, 0.5, 0.9, 0.4, 0.8, 0.1, 0.8, 0.5, 0.8, 0.8, 0.5, 0.1, 0.3, 0.8, 0.9, 0.4, 0.2, 0.9, 0.9, 0.7, 0.7, 0.4, 0.1, 0.8, 0.8, 0.1, 0.6, 0.3, 0.5, 0.3, 0.7, 0.5, 0.8, 0.4, 0.1, 0.6, 0.4, 0.3, 0.8, 0.2, 0.1, 0.2, 0.8, 0.9, 0.6, 0.6, 0.8, 0.6, 0.4, 0.1, 0.5, 0.4, 0.1, 0.7, 0.3, 0.5, 0.5, 0.5, 0.6, 0.2, 0.6, 0.4, 0.5, 0.8, 0.3, 0.3, 0.9, 0.4, 0.1, 0.8, 0.5, 0.7, 0.3, 0.6, 0.8, 0.6, 0.1, 0.4, 0.9, 0.3, 0.3, 0.1, 0.5, 0.5, 0.2, 0.9, 0.5, 0.7, 0.4, 0.5, 0.9, 0.3, 0.6, 0.8, 0.1, 0.2, 0.2, 0.5, 0.2, 0.9, 0.5, 0.8, 0.8, 0.2, 0.7, 0.2, 0.3, 
+
+L3_zSYR2K_C_nn
+0.6, 0.1, 0.6, 0.9, 0.4, 0.3, 0.4, 0.1, 0.6, 0.2, 0.6, 0.3, 0.3, 0.2, 0.4, 0.6, 0.7, 0.6, 0.5, 0.6, 0.6, 0.1, 0.7, 0.1, 0.8, 0.2, 0.7, 0.9, 0.8, 0.6, 0.9, 0.9, 0.5, 0.2, 0.6, 0.9, 0.5, 0.3, 0.6, 0.4, 0.4, 0.2, 0.4, 0.8, 0.1, 0.5, 0.1, 0.8, 0.4, 0.2, 0.1, 0.4, 0.5, 0.7, 0.6, 0.4, 0.9, 0.5, 0.9, 0.2, 0.6, 0.2, 0.6, 0.9, 0.6, 0.6, 0.7, 0.4, 0.4, 0.3, 0.6, 0.4, 0.4, 0.5, 0.8, 0.8, 0.8, 0.3, 0.4, 0.3, 0.1, 0.7, 0.3, 0.1, 0.1, 0.9, 0.1, 0.3, 0.3, 0.1, 0.7, 0.6, 0.6, 0.5, 0.5, 0.1, 0.9, 0.2, 0.6, 0.9, 0.3, 0.4, 0.4, 0.1, 0.4, 0.2, 0.8, 0.8, 0.5, 0.5, 0.7, 0.9, 0.3, 0.3, 0.7, 0.9, 0.9, 0.2, 0.3, 0.7, 0.7, 0.1, 0.2, 0.4, 0.6, 0.6, 0.4, 0.3, 0.1, 0.8, 0.1, 0.6, 0.5, 0.2, 0.7, 0.7, 0.6, 0.2, 0.4, 0.8, 0.8, 0.3, 0.7, 0.9, 0.2, 0.3, 0.8, 0.1, 0.7, 0.7, 0.8, 0.1, 0.1, 0.6, 0.7, 0.7, 0.9, 0.1, 0.3, 0.8, 0.7, 0.1, 0.4, 0.3, 0.1, 0.1, 0.9, 0.3, 0.5, 0.1, 0.6, 0.3, 0.1, 0.5, 0.4, 0.3, 0.3, 0.3, 0.8, 0.1, 0.3, 0.5, 0.3, 0.4, 0.3, 0.2, 0.8, 0.7, 0.1, 0.2, 0.9, 0.1, 0.3, 0.7, 0.4, 0.2, 0.2, 0.9, 0.8, 0.5, 0.2, 0.1, 0.3, 0.2, 0.3, 0.2, 0.1, 0.8, 0.1, 0.7, 0.7, 0.9, 0.7, 0.7, 0.3, 0.4, 0.4, 0.2, 0.6, 0.5, 0.2, 0.2, 0.8, 0.2, 0.1, 0.5, 0.1, 0.4, 0.5, 0.3, 0.7, 0.4, 0.1, 0.9, 0.9, 0.7, 0.6, 0.9, 0.4, 0.6, 0.4, 0.2, 0.3, 0.1, 0.9, 0.2, 0.8, 0.1, 0.3, 0.2, 0.6, 0.5, 0.7, 0.9, 0.8, 0.6, 0.3, 0.4, 0.1, 0.3, 0.3, 0.2, 0.1, 0.2, 0.6, 0.7, 0.1, 0.6, 0.3, 0.9, 0.2, 0.2, 0.7, 0.6, 0.1, 0.4, 0.1, 0.9, 0.3, 0.7, 0.1, 0.6, 0.8, 0.7, 0.2, 0.2, 0.8, 0.6, 0.9, 0.6, 0.6, 0.6, 0.9, 0.9, 0.6, 0.9, 0.8, 0.2, 0.7, 0.9, 0.1, 0.3, 0.5, 0.2, 0.6, 0.1, 0.5, 0.6, 0.5, 0.7, 0.1, 0.3, 0.7, 0.1, 0.7, 0.7, 0.1, 0.2, 0.8, 0.2, 0.3, 0.4, 0.6, 0.6, 0.7, 0.4, 0.9, 0.4, 0.2, 0.6, 0.2, 0.5, 0.2, 0.1, 0.5, 0.2, 0.5, 0.8, 0.9, 0.7, 0.6, 0.1, 0.6, 0.4, 0.3, 0.1, 0.2, 0.4, 0.9, 0.1, 0.9, 0.1, 0.1, 0.5, 0.1, 0.3, 0.9, 0.9, 0.9, 0.4, 0.8, 0.2, 0.2, 0.8, 0.7, 0.1, 0.2, 0.9, 0.4, 0.7, 0.2, 0.8, 0.2, 0.8, 0.7, 0.1, 0.9, 0.5, 0.7, 0.6, 0.6, 0.6, 0.3, 0.8, 0.3, 0.7, 0.1, 0.4, 0.3, 0.2, 0.6, 0.9, 0.2, 0.6, 0.2, 0.8, 0.4, 0.8, 0.7, 0.6, 0.3, 0.4, 0.9, 0.4, 0.8, 0.2, 0.8, 0.2, 0.8, 0.2, 0.9, 0.2, 0.6, 0.5, 0.4, 0.3, 0.7, 0.1, 0.4, 0.2, 0.5, 0.3, 0.1, 0.2, 0.8, 0.2, 0.2, 0.5, 0.7, 0.1, 0.7, 0.6, 0.1, 0.2, 0.7, 0.4, 0.4, 0.4, 0.8, 0.2, 0.1, 0.9, 0.7, 0.9, 0.6, 0.2, 0.5, 0.1, 0.1, 0.8, 0.4, 0.3, 0.2, 0.9, 0.7, 0.4, 0.6, 0.7, 0.7, 0.9, 0.2, 0.1, 0.2, 0.9, 0.3, 0.4, 0.7, 0.4, 0.8, 0.1, 0.3, 0.5, 0.9, 0.8, 0.4, 0.3, 0.8, 0.6, 0.6, 0.9, 0.9, 0.2, 0.1, 0.6, 0.1, 0.1, 0.8, 0.5, 0.1, 0.9, 0.1, 0.6, 0.1, 0.3, 0.5, 0.2, 0.4, 0.7, 0.9, 0.4, 0.4, 0.4, 0.3, 0.5, 0.7, 0.6, 0.9, 0.1, 0.6, 0.5, 0.9, 0.9, 0.6, 0.6, 0.6, 0.9, 0.5, 0.2, 0.9, 0.3, 0.2, 0.1, 0.9, 0.7, 0.3, 0.9, 0.5, 0.2, 0.5, 0.8, 0.2, 0.8, 0.8, 0.2, 0.8, 0.2, 0.9, 0.8, 0.9, 0.1, 0.5, 0.4, 0.2, 0.4, 0.5, 0.2, 0.7, 0.4, 0.3, 0.4, 0.7, 0.7, 0.5, 0.1, 0.3, 0.2, 0.6, 0.9, 0.2, 0.2, 0.6, 0.1, 0.9, 0.7, 0.2, 0.8, 0.8, 0.2, 0.1, 0.9, 0.4, 0.3, 0.6, 0.5, 0.2, 0.4, 0.3, 0.8, 
+
+L3_zSYR2K_o_N
+-1.52, 22.08, -0.2, 22.21, 0.8, 19.83, -1.98, 19.01, 0.75, 19.53, 1.84, 17.26, -0.4, 19.89, 1.94, 17.78, -0.36, 19.16, -0.56, 17.55, -0.15, 19.17, -0.06, 20.14, 0.33, 16.49, -0.09, 18.49, 0.19, 18.35, 1.92, 19.23, 1.58, 17.62, -0.2, 22.21, 0.98, 22.08, 0.5, 20.97, -1.73, 17.81, 0.96, 18.47, 1.94, 17.73, -0.44, 20.74, 0.68, 18.57, -1.43, 17.84, -0.11, 15.59, -0.08, 19.41, 0.91, 19.08, 1.18, 17.22, -1.38, 17.3, 0.13, 18.37, 0.73, 18.97, 1.32, 17.52, 0.8, 19.83, 0.5, 20.97, 0.68, 19.0, -1.19, 18.01, 2.83, 16.59, 2.89, 16.54, 0.37, 19.93, 1.28, 17.61, -0.95, 17.01, -1.13, 15.01, -0.41, 18.75, 1.23, 19.3, 0.28, 16.13, 0.19, 16.77, 2.18, 16.44, 0.44, 18.41, 1.03, 16.8, -1.98, 19.01, -1.73, 17.81, -1.19, 18.01, -3.36, 17.22, -0.35, 16.86, 0.52, 15.28, -1.36, 18.12, -0.02, 16.11, -2.5, 16.84, -1.78, 13.19, -2.4, 17.58, -1.12, 17.81, -0.78, 14.08, -1.7, 15.27, -1.23, 16.18, 0.08, 16.12, -0.28, 15.92, 0.75, 19.53, 0.96, 18.47, 2.83, 16.59, -0.35, 16.86, 2.08, 16.74, 2.55, 14.95, 2.43, 17.42, 2.85, 15.38, 0.73, 17.0, 1.09, 14.32, 2.47, 16.15, 1.64, 17.8, 1.94, 12.9, 1.21, 15.53, 0.7, 15.34, 2.82, 15.9, 2.02, 15.69, 1.84, 17.26, 1.94, 17.73, 2.89, 16.54, 0.52, 15.28, 2.55, 14.95, 2.16, 13.48, 2.55, 16.75, 2.46, 14.12, 1.62, 14.69, 1.1, 13.12, 0.82, 15.58, 1.9, 16.97, 1.82, 13.03, -1.05, 14.64, 2.02, 15.25, 1.61, 15.22, 2.07, 14.84, -0.4, 19.89, -0.44, 20.74, 0.37, 19.93, -1.36, 18.12, 2.43, 17.42, 2.55, 16.75, -0.72, 18.5, 2.38, 16.82, 0.34, 17.08, 0.6, 15.36, 0.41, 18.04, 0.2, 17.73, 0.55, 15.64, 0.07, 16.51, 0.49, 16.96, 1.41, 17.46, 1.24, 16.48, 1.94, 17.78, 0.68, 18.57, 1.28, 17.61, -0.02, 16.11, 2.85, 15.38, 2.46, 14.12, 2.38, 16.82, 2.36, 17.12, 1.71, 16.61, -0.53, 13.38, 0.55, 17.6, 1.89, 16.97, 0.82, 14.57, 1.68, 15.65, 0.91, 15.76, 1.22, 16.46, 2.67, 15.42, -0.36, 19.16, -1.43, 17.84, -0.95, 17.01, -2.5, 16.84, 0.73, 17.0, 1.62, 14.69, 0.34, 17.08, 1.71, 16.61, 0.04, 17.06, -0.71, 14.02, -0.2, 18.15, 0.18, 18.07, 0.09, 14.17, 0.28, 15.86, -1.1, 14.84, 0.85, 15.17, 1.26, 14.64, -0.56, 17.55, -0.11, 15.59, -1.13, 15.01, -1.78, 13.19, 1.09, 14.32, 1.1, 13.12, 0.6, 15.36, -0.53, 13.38, -0.71, 14.02, -0.32, 11.72, 0.02, 13.93, -0.6, 14.44, -1.08, 13.29, -1.39, 12.26, -1.29, 11.71, 0.18, 13.44, -0.8, 13.78, -0.15, 19.17, -0.08, 19.41, -0.41, 18.75, -2.4, 17.58, 2.47, 16.15, 0.82, 15.58, 0.41, 18.04, 0.55, 17.6, -0.2, 18.15, 0.02, 13.93, -1.22, 19.08, 0.42, 19.65, 0.77, 15.04, -0.87, 17.03, 0.3, 16.93, -0.45, 17.13, 0.56, 15.81, -0.06, 20.14, 0.91, 19.08, 1.23, 19.3, -1.12, 17.81, 1.64, 17.8, 1.9, 16.97, 0.2, 17.73, 1.89, 16.97, 0.18, 18.07, -0.6, 14.44, 0.42, 19.65, 1.82, 18.64, 0.22, 16.22, 0.23, 16.81, 1.67, 16.95, 1.87, 17.41, 2.58, 16.03, 0.33, 16.49, 1.18, 17.22, 0.28, 16.13, -0.78, 14.08, 1.94, 12.9, 1.82, 13.03, 0.55, 15.64, 0.82, 14.57, 0.09, 14.17, -1.08, 13.29, 0.77, 15.04, 0.22, 16.22, -0.3, 12.44, 0.12, 13.3, 0.64, 14.15, 0.72, 13.96, 0.5, 13.6, -0.09, 18.49, -1.38, 17.3, 0.19, 16.77, -1.7, 15.27, 1.21, 15.53, -1.05, 14.64, 0.07, 16.51, 1.68, 15.65, 0.28, 15.86, -1.39, 12.26, -0.87, 17.03, 0.23, 16.81, 0.12, 13.3, -2.08, 15.38, -0.42, 15.89, 0.02, 15.61, 0.01, 14.32, 0.19, 18.35, 0.13, 18.37, 2.18, 16.44, -1.23, 16.18, 0.7, 15.34, 2.02, 15.25, 0.49, 16.96, 0.91, 15.76, -1.1, 14.84, -1.29, 11.71, 0.3, 16.93, 1.67, 16.95, 0.64, 14.15, -0.42, 15.89, 0.54, 16.74, 1.0, 15.36, 1.78, 15.45, 1.92, 19.23, 0.73, 18.97, 0.44, 18.41, 0.08, 16.12, 2.82, 15.9, 1.61, 15.22, 1.41, 17.46, 1.22, 16.46, 0.85, 15.17, 0.18, 13.44, -0.45, 17.13, 1.87, 17.41, 0.72, 13.96, 0.02, 15.61, 1.0, 15.36, 0.82, 15.68, 1.66, 14.93, 1.58, 17.62, 1.32, 17.52, 1.03, 16.8, -0.28, 15.92, 2.02, 15.69, 2.07, 14.84, 1.24, 16.48, 2.67, 15.42, 1.26, 14.64, -0.8, 13.78, 0.56, 15.81, 2.58, 16.03, 0.5, 13.6, 0.01, 14.32, 1.78, 15.45, 1.66, 14.93, 2.24, 15.52, 
+
+L3_zSYR2K_A_kn
+0.4, 0.7, 0.4, 0.4, 0.7, 0.8, 0.2, 0.2, 0.4, 0.6, 0.8, 0.7, 0.9, 0.6, 0.5, 0.6, 0.5, 0.6, 0.5, 0.2, 0.9, 0.1, 0.4, 0.5, 0.5, 0.1, 0.2, 0.8, 0.4, 0.5, 0.3, 0.3, 0.4, 0.8, 0.6, 0.4, 0.9, 0.5, 0.8, 0.1, 0.3, 0.8, 0.9, 0.3, 0.1, 0.6, 0.5, 0.8, 0.7, 0.1, 0.1, 0.7, 0.1, 0.9, 0.8, 0.2, 0.9, 0.4, 0.9, 0.1, 0.2, 0.9, 0.4, 0.7, 0.7, 0.3, 0.3, 0.1, 0.8, 0.2, 0.5, 0.6, 0.8, 0.7, 0.2, 0.2, 0.2, 0.6, 0.9, 0.7, 0.5, 0.6, 0.9, 0.2, 0.1, 0.4, 0.5, 0.1, 0.3, 0.8, 0.7, 0.6, 0.8, 0.2, 0.4, 0.3, 0.1, 0.3, 0.2, 0.2, 0.3, 0.4, 0.5, 0.4, 0.8, 0.8, 0.3, 0.7, 0.1, 0.3, 0.3, 0.6, 0.6, 0.3, 0.9, 0.3, 0.1, 0.7, 0.8, 0.6, 0.9, 0.8, 0.9, 0.1, 0.5, 0.5, 0.6, 0.5, 0.8, 0.1, 0.6, 0.8, 0.8, 0.2, 0.1, 0.4, 0.8, 0.2, 0.1, 0.6, 0.2, 0.3, 0.9, 0.4, 0.9, 0.6, 0.3, 0.2, 0.8, 0.9, 0.7, 0.6, 0.7, 0.2, 0.8, 0.2, 0.1, 0.3, 0.6, 0.3, 0.4, 0.1, 0.2, 0.3, 0.8, 0.5, 0.4, 0.6, 0.6, 0.1, 0.3, 0.9, 0.9, 0.4, 0.8, 0.2, 0.4, 0.2, 0.6, 0.1, 0.8, 0.1, 0.6, 0.9, 0.4, 0.1, 0.9, 0.5, 0.4, 0.8, 0.7, 0.1, 0.8, 0.2, 0.1, 0.7, 0.7, 0.7, 0.7, 0.4, 0.6, 0.6, 0.6, 0.9, 0.2, 0.9, 0.9, 0.7, 0.5, 0.4, 0.2, 0.3, 0.6, 0.2, 0.6, 0.1, 0.5, 0.9, 0.3, 0.1, 0.2, 0.6, 0.5, 0.5, 0.9, 0.9, 0.8, 0.8, 0.1, 0.6, 0.5, 0.9, 0.4, 0.3, 0.3, 0.9, 0.6, 0.4, 0.3, 0.4, 0.2, 0.8, 0.3, 0.1, 0.6, 0.8, 0.9, 0.9, 0.7, 0.3, 0.3, 0.5, 0.6, 0.7, 0.7, 0.2, 0.3, 0.7, 0.9, 0.1, 0.3, 0.6, 0.8, 0.3, 0.3, 0.9, 0.4, 0.4, 0.1, 0.8, 0.6, 0.4, 0.5, 0.3, 0.2, 0.2, 0.8, 0.1, 0.5, 0.6, 0.2, 0.3, 0.5, 0.1, 0.8, 0.9, 0.5, 0.6, 0.2, 0.2, 0.5, 0.5, 0.1, 0.1, 0.8, 0.7, 0.6, 0.2, 0.1, 0.7, 0.2, 0.9, 0.9, 0.2, 0.7, 0.9, 0.2, 0.7, 0.5, 0.9, 0.6, 0.5, 0.1, 0.8, 0.1, 0.8, 0.2, 0.6, 0.4, 0.2, 0.5, 0.5, 0.7, 0.3, 0.8, 0.5, 0.2, 0.5, 0.8, 0.2, 0.8, 0.7, 0.2, 0.5, 0.5, 0.5, 0.6, 0.8, 0.1, 0.2, 0.1, 0.1, 0.7, 0.6, 0.3, 0.1, 0.2, 0.3, 0.1, 0.7, 0.9, 0.5, 0.8, 0.3, 0.8, 0.8, 0.7, 0.9, 0.7, 0.8, 0.1, 0.5, 0.1, 0.1, 0.4, 0.5, 0.5, 0.6, 0.4, 0.4, 0.5, 0.4, 0.8, 0.6, 0.6, 0.5, 0.5, 0.2, 0.3, 0.2, 0.7, 0.9, 0.9, 0.5, 0.2, 0.1, 0.7, 0.1, 0.3, 0.9, 0.2, 0.6, 0.9, 0.4, 0.2, 0.3, 0.7, 0.1, 0.3, 0.5, 0.7, 0.4, 0.2, 0.1, 0.5, 0.2, 0.9, 0.2, 0.5, 0.8, 0.1, 0.6, 0.4, 0.6, 0.7, 0.8, 0.4, 0.8, 0.9, 0.5, 0.2, 0.7, 0.5, 0.4, 0.5, 0.9, 0.5, 0.1, 0.5, 0.3, 0.8, 0.6, 0.6, 0.7, 0.3, 0.9, 0.9, 0.4, 0.3, 0.4, 0.1, 0.5, 0.4, 0.4, 0.6, 0.4, 0.2, 0.9, 0.4, 0.6, 0.3, 0.5, 0.7, 0.2, 0.6, 0.7, 0.1, 0.1, 0.2, 0.8, 0.4, 0.8, 0.2, 0.2, 0.4, 0.6, 0.6, 0.2, 0.5, 0.7, 0.3, 0.4, 0.1, 0.2, 0.8, 0.6, 0.6, 0.9, 0.9, 0.2, 0.9, 0.2, 0.3, 0.6, 0.7, 0.5, 0.6, 0.5, 0.3, 0.1, 0.8, 0.3, 0.2, 0.1, 0.7, 0.7, 0.3, 0.9, 0.7, 0.4, 0.8, 0.7, 0.6, 0.8, 0.5, 0.6, 0.6, 0.9, 0.4, 0.5, 0.1, 0.2, 0.7, 0.6, 0.2, 0.7, 0.3, 0.5, 0.3, 0.6, 0.9, 0.7, 0.7, 0.6, 0.8, 0.4, 0.6, 0.5, 0.5, 0.8, 0.1, 0.3, 0.6, 0.9, 0.1, 0.2, 0.6, 0.3, 0.5, 0.7, 0.1, 0.9, 0.3, 0.5, 
+
+L3_zSYR2K_B_kn
+0.7, 0.2, 0.6, 0.4, 0.5, 0.4, 0.6, 0.6, 0.7, 0.5, 0.2, 0.2, 0.3, 0.1, 0.5, 0.7, 0.1, 0.3, 0.9, 0.4, 0.3, 0.3, 0.6, 0.2, 0.2, 0.7, 0.6, 0.9, 0.4, 0.3, 0.2, 0.5, 0.6, 0.2, 0.2, 0.1, 0.5, 0.9, 0.6, 0.2, 0.8, 0.1, 0.2, 0.3, 0.7, 0.1, 0.1, 0.2, 0.5, 0.4, 0.6, 0.3, 0.2, 0.8, 0.1, 0.1, 0.7, 0.9, 0.8, 0.6, 0.9, 0.4, 0.6, 0.3, 0.1, 0.4, 0.7, 0.6, 0.3, 0.4, 0.8, 0.6, 0.4, 0.1, 0.5, 0.3, 0.7, 0.4, 0.3, 0.3, 0.6, 0.6, 0.6, 0.8, 0.4, 0.5, 0.1, 0.8, 0.2, 0.3, 0.8, 0.9, 0.9, 0.6, 0.4, 0.1, 0.7, 0.1, 0.2, 0.7, 0.8, 0.5, 0.3, 0.7, 0.8, 0.2, 0.9, 0.9, 0.1, 0.1, 0.9, 0.2, 0.3, 0.7, 0.8, 0.5, 0.4, 0.2, 0.7, 0.7, 0.9, 0.1, 0.5, 0.4, 0.1, 0.4, 0.3, 0.6, 0.6, 0.6, 0.1, 0.5, 0.5, 0.4, 0.1, 0.8, 0.7, 0.2, 0.1, 0.6, 0.2, 0.4, 0.1, 0.9, 0.2, 0.7, 0.4, 0.4, 0.9, 0.6, 0.2, 0.9, 0.4, 0.6, 0.1, 0.1, 0.5, 0.3, 0.7, 0.4, 0.7, 0.2, 0.5, 0.1, 0.9, 0.7, 0.6, 0.7, 0.2, 0.4, 0.1, 0.1, 0.4, 0.8, 0.4, 0.4, 0.2, 0.5, 0.3, 0.7, 0.8, 0.3, 0.9, 0.8, 0.3, 0.8, 0.4, 0.3, 0.2, 0.9, 0.7, 0.8, 0.3, 0.8, 0.5, 0.9, 0.5, 0.1, 0.4, 0.3, 0.9, 0.1, 0.6, 0.8, 0.7, 0.4, 0.7, 0.3, 0.4, 0.3, 0.6, 0.6, 0.2, 0.3, 0.8, 0.4, 0.8, 0.1, 0.9, 0.9, 0.1, 0.4, 0.8, 0.3, 0.4, 0.7, 0.8, 0.9, 0.6, 0.5, 0.8, 0.5, 0.6, 0.3, 0.4, 0.5, 0.9, 0.5, 0.5, 0.4, 0.3, 0.4, 0.5, 0.9, 0.8, 0.3, 0.2, 0.5, 0.8, 0.6, 0.1, 0.7, 0.7, 0.2, 0.6, 0.7, 0.6, 0.5, 0.4, 0.1, 0.7, 0.3, 0.5, 0.4, 0.2, 0.3, 0.9, 0.1, 0.5, 0.8, 0.1, 0.7, 0.5, 0.5, 0.6, 0.8, 0.8, 0.8, 0.6, 0.5, 0.9, 0.9, 0.8, 0.3, 0.2, 0.5, 0.8, 0.3, 0.3, 0.6, 0.8, 0.6, 0.3, 0.5, 0.2, 0.8, 0.9, 0.4, 0.3, 0.2, 0.1, 0.8, 0.7, 0.8, 0.2, 0.4, 0.4, 0.9, 0.8, 0.6, 0.1, 0.1, 0.1, 0.3, 0.7, 0.1, 0.9, 0.2, 0.2, 0.1, 0.2, 0.7, 0.2, 0.6, 0.6, 0.6, 0.9, 0.3, 0.5, 0.3, 0.2, 0.5, 0.4, 0.4, 0.6, 0.9, 0.2, 0.2, 0.7, 0.2, 0.8, 0.8, 0.3, 0.8, 0.3, 0.3, 0.5, 0.5, 0.3, 0.3, 0.7, 0.4, 0.8, 0.4, 0.2, 0.9, 0.7, 0.2, 0.5, 0.3, 0.2, 0.6, 0.4, 0.7, 0.7, 0.9, 0.1, 0.6, 0.5, 0.5, 0.4, 0.9, 0.1, 0.2, 0.3, 0.4, 0.4, 0.5, 0.3, 0.9, 0.2, 0.3, 0.1, 0.2, 0.4, 0.3, 0.8, 0.1, 0.7, 0.6, 0.9, 0.5, 0.5, 0.6, 0.7, 0.2, 0.4, 0.1, 0.5, 0.6, 0.9, 0.8, 0.2, 0.4, 0.9, 0.1, 0.3, 0.1, 0.1, 0.8, 0.2, 0.6, 0.9, 0.4, 0.8, 0.2, 0.9, 0.1, 0.4, 0.3, 0.1, 0.8, 0.2, 0.3, 0.2, 0.1, 0.6, 0.1, 0.2, 0.7, 0.2, 0.4, 0.3, 0.8, 0.8, 0.5, 0.6, 0.2, 0.3, 0.5, 0.2, 0.3, 0.2, 0.6, 0.1, 0.1, 0.7, 0.8, 0.3, 0.5, 0.1, 0.5, 0.3, 0.3, 0.6, 0.5, 0.9, 0.1, 0.2, 0.3, 0.3, 0.5, 0.4, 0.3, 0.1, 0.5, 0.6, 0.2, 0.2, 0.7, 0.4, 0.9, 0.8, 0.8, 0.5, 0.5, 0.7, 0.2, 0.1, 0.3, 0.9, 0.1, 0.5, 0.9, 0.7, 0.5, 0.3, 0.2, 0.7, 0.9, 0.8, 0.4, 0.1, 0.7, 0.6, 0.8, 0.4, 0.4, 0.2, 0.7, 0.3, 0.2, 0.5, 0.4, 0.7, 0.9, 0.1, 0.8, 0.2, 0.4, 0.6, 0.6, 0.2, 0.6, 0.1, 0.5, 0.3, 0.1, 0.8, 0.7, 0.6, 0.7, 0.4, 0.7, 0.4, 0.2, 0.3, 0.8, 0.9, 0.3, 0.8, 0.2, 0.4, 0.3, 0.4, 0.8, 0.7, 0.9, 0.8, 0.9, 0.3, 0.8, 0.3, 0.6, 
+
+L3_zSYR2K_o_T
+-0.52, 12.4, -0.8, 15.71, 0.86, 13.79, -1.58, 12.76, -0.16, 13.93, 2.75, 14.48, 0.91, 15.94, 0.29, 15.73, -0.85, 13.4, -0.16, 16.88, 0.19, 12.01, 0.07, 15.02, 0.57, 13.91, -0.56, 15.83, 0.09, 15.06, -0.5, 15.3, -0.1, 13.49, -0.8, 15.71, -0.32, 17.5, 2.12, 15.78, -1.51, 14.17, -0.24, 16.47, 2.34, 16.3, 0.47, 18.1, 0.37, 17.08, -1.78, 15.37, 0.9, 18.28, 2.08, 13.95, 1.08, 18.65, 1.18, 16.86, -0.81, 16.29, -0.42, 17.78, -1.11, 16.03, -0.36, 15.54, 0.86, 13.79, 2.12, 15.78, 2.84, 13.58, 1.02, 14.51, 2.27, 15.73, 5.14, 13.22, 1.33, 17.31, 1.53, 14.71, -0.7, 14.52, 1.51, 17.56, 3.31, 12.6, 2.56, 16.64, 3.2, 15.16, 0.27, 15.66, 1.55, 15.12, 0.65, 14.81, 0.99, 15.16, -1.58, 12.76, -1.51, 14.17, 1.02, 14.51, -0.44, 13.68, 0.22, 15.01, 2.87, 14.15, -0.15, 16.08, 1.29, 14.34, -1.43, 13.65, -0.57, 15.0, 0.87, 11.76, 0.58, 14.83, 0.74, 13.71, -2.3, 15.78, -1.0, 14.7, -1.56, 13.75, -0.81, 13.51, -0.16, 13.93, -0.24, 16.47, 2.27, 15.73, 0.22, 15.01, -0.58, 16.18, 4.53, 15.26, 0.95, 17.19, 2.2, 15.87, -0.08, 14.81, 1.49, 17.07, 2.48, 12.26, 1.68, 17.07, 2.2, 14.97, -0.19, 15.38, 0.32, 16.06, -0.28, 14.8, -0.86, 14.57, 2.75, 14.48, 2.34, 16.3, 5.14, 13.22, 2.87, 14.15, 4.53, 15.26, 6.16, 14.3, 4.28, 17.04, 3.96, 14.84, 2.69, 14.57, 3.87, 16.57, 4.87, 12.5, 3.8, 16.29, 3.92, 15.43, 2.16, 17.18, 4.01, 15.83, 1.79, 15.04, 3.01, 14.19, 0.91, 15.94, 0.47, 18.1, 1.33, 17.31, -0.15, 16.08, 0.95, 17.19, 4.28, 17.04, 2.18, 17.8, 1.56, 18.48, 0.48, 15.94, 2.71, 17.95, 1.33, 14.39, 0.01, 17.84, 1.07, 18.54, 1.38, 17.93, 0.31, 18.49, -0.12, 17.61, 0.44, 16.58, 0.29, 15.73, 0.37, 17.08, 1.53, 14.71, 1.29, 14.34, 2.2, 15.87, 3.96, 14.84, 1.56, 18.48, 1.54, 17.24, -0.75, 16.02, 1.92, 18.62, 1.43, 13.59, 3.11, 17.61, 1.75, 15.71, -0.13, 16.86, 1.11, 16.28, -1.34, 17.27, 1.33, 14.29, -0.85, 13.4, -1.78, 15.37, -0.7, 14.52, -1.43, 13.65, -0.08, 14.81, 2.69, 14.57, 0.48, 15.94, -0.75, 16.02, 0.42, 14.34, 0.43, 16.24, 1.18, 12.31, -0.79, 15.0, -0.45, 15.27, -1.42, 15.48, -1.02, 14.34, -1.64, 13.79, -0.55, 13.09, -0.16, 16.88, 0.9, 18.28, 1.51, 17.56, -0.57, 15.0, 1.49, 17.07, 3.87, 16.57, 2.71, 17.95, 1.92, 18.62, 0.43, 16.24, 1.8, 18.06, 3.14, 14.36, 0.81, 18.18, 0.93, 17.96, -0.61, 17.48, 0.4, 17.32, -0.32, 17.83, -0.11, 16.02, 0.19, 12.01, 2.08, 13.95, 3.31, 12.6, 0.87, 11.76, 2.48, 12.26, 4.87, 12.5, 1.33, 14.39, 1.43, 13.59, 1.18, 12.31, 3.14, 14.36, 1.76, 10.76, 1.75, 14.71, 1.54, 13.27, 1.13, 14.04, 1.52, 13.28, -0.31, 13.2, 1.1, 13.46, 0.07, 15.02, 1.08, 18.65, 2.56, 16.64, 0.58, 14.83, 1.68, 17.07, 3.8, 16.29, 0.01, 17.84, 3.11, 17.61, -0.79, 15.0, 0.81, 18.18, 1.75, 14.71, 0.96, 18.8, 2.24, 17.16, -0.51, 16.81, 0.99, 16.56, -0.98, 16.25, 0.72, 14.93, 0.57, 13.91, 1.18, 16.86, 3.2, 15.16, 0.74, 13.71, 2.2, 14.97, 3.92, 15.43, 1.07, 18.54, 1.75, 15.71, -0.45, 15.27, 0.93, 17.96, 1.54, 13.27, 2.24, 17.16, 1.62, 14.58, -0.06, 16.54, 0.96, 16.18, 0.33, 15.65, 0.67, 15.12, -0.56, 15.83, -0.81, 16.29, 0.27, 15.66, -2.3, 15.78, -0.19, 15.38, 2.16, 17.18, 1.38, 17.93, -0.13, 16.86, -1.42, 15.48, -0.61, 17.48, 1.13, 14.04, -0.51, 16.81, -0.06, 16.54, -0.88, 17.34, -0.59, 16.72, -1.22, 15.77, -1.2, 14.95, 0.09, 15.06, -0.42, 17.78, 1.55, 15.12, -1.0, 14.7, 0.32, 16.06, 4.01, 15.83, 0.31, 18.49, 1.11, 16.28, -1.02, 14.34, 0.4, 17.32, 1.52, 13.28, 0.99, 16.56, 0.96, 16.18, -0.59, 16.72, 0.08, 16.14, -1.71, 16.03, -0.46, 14.38, -0.5, 15.3, -1.11, 16.03, 0.65, 14.81, -1.56, 13.75, -0.28, 14.8, 1.79, 15.04, -0.12, 17.61, -1.34, 17.27, -1.64, 13.79, -0.32, 17.83, -0.31, 13.2, -0.98, 16.25, 0.33, 15.65, -1.22, 15.77, -1.71, 16.03, -2.26, 13.92, -1.11, 14.89, -0.1, 13.49, -0.36, 15.54, 0.99, 15.16, -0.81, 13.51, -0.86, 14.57, 3.01, 14.19, 0.44, 16.58, 1.33, 14.29, -0.55, 13.09, -0.11, 16.02, 1.1, 13.46, 0.72, 14.93, 0.67, 15.12, -1.2, 14.95, -0.46, 14.38, -1.11, 14.89, -0.78, 13.22, 
+
+L3_cHER2K_A_nk
+0.699999988079, 0.699999988079, 0.899999976158, 0.20000000298, 0.600000023842, 0.699999988079, 0.800000011921, 0.40000000596, 0.40000000596, 0.899999976158, 0.800000011921, 0.20000000298, 0.899999976158, 0.40000000596, 0.40000000596, 0.10000000149, 0.600000023842, 0.10000000149, 0.5, 0.5, 0.300000011921, 0.40000000596, 0.699999988079, 0.10000000149, 0.300000011921, 0.5, 0.5, 0.899999976158, 0.800000011921, 0.20000000298, 0.800000011921, 0.800000011921, 0.20000000298, 0.699999988079, 0.800000011921, 0.600000023842, 0.20000000298, 0.20000000298, 0.800000011921, 0.40000000596, 0.20000000298, 0.5, 0.899999976158, 0.40000000596, 0.5, 0.40000000596, 0.10000000149, 0.800000011921, 0.699999988079, 0.800000011921, 0.20000000298, 0.20000000298, 0.5, 0.300000011921, 0.5, 0.20000000298, 0.800000011921, 0.800000011921, 0.699999988079, 0.5, 0.10000000149, 0.800000011921, 0.5, 0.5, 0.699999988079, 0.5, 0.5, 0.10000000149, 0.5, 0.800000011921, 0.899999976158, 0.20000000298, 0.300000011921, 0.5, 0.10000000149, 0.40000000596, 0.699999988079, 0.5, 0.300000011921, 0.5, 0.300000011921, 0.5, 0.899999976158, 0.300000011921, 0.10000000149, 0.600000023842, 0.5, 0.899999976158, 0.5, 0.600000023842, 0.699999988079, 0.300000011921, 0.5, 0.300000011921, 0.899999976158, 0.20000000298, 0.899999976158, 0.5, 0.300000011921, 0.800000011921, 0.899999976158, 0.300000011921, 0.10000000149, 0.699999988079, 0.10000000149, 0.699999988079, 0.10000000149, 0.600000023842, 0.5, 0.5, 0.300000011921, 0.40000000596, 0.10000000149, 0.600000023842, 0.40000000596, 0.10000000149, 0.10000000149, 0.10000000149, 0.10000000149, 0.10000000149, 0.600000023842, 0.699999988079, 0.10000000149, 0.699999988079, 0.20000000298, 0.10000000149, 0.600000023842, 0.899999976158, 0.300000011921, 0.10000000149, 0.800000011921, 0.20000000298, 0.20000000298, 0.300000011921, 0.5, 0.5, 0.10000000149, 0.40000000596, 0.20000000298, 0.40000000596, 0.10000000149, 0.899999976158, 0.800000011921, 0.800000011921, 0.800000011921, 0.5, 0.600000023842, 0.600000023842, 0.40000000596, 0.10000000149, 0.20000000298, 0.10000000149, 0.899999976158, 0.40000000596, 0.300000011921, 0.600000023842, 0.40000000596, 0.699999988079, 0.20000000298, 0.600000023842, 0.699999988079, 0.40000000596, 0.600000023842, 0.800000011921, 0.600000023842, 0.300000011921, 0.5, 0.20000000298, 0.600000023842, 0.899999976158, 0.699999988079, 0.800000011921, 0.10000000149, 0.899999976158, 0.600000023842, 0.899999976158, 0.5, 0.10000000149, 0.600000023842, 0.899999976158, 0.20000000298, 0.600000023842, 0.20000000298, 0.600000023842, 0.20000000298, 0.899999976158, 0.800000011921, 0.699999988079, 0.40000000596, 0.10000000149, 0.40000000596, 0.40000000596, 0.899999976158, 0.20000000298, 0.40000000596, 0.800000011921, 0.5, 0.899999976158, 0.40000000596, 0.800000011921, 0.40000000596, 0.800000011921, 0.699999988079, 0.300000011921, 0.10000000149, 0.10000000149, 0.300000011921, 0.300000011921, 0.5, 0.300000011921, 0.699999988079, 0.40000000596, 0.5, 0.800000011921, 0.800000011921, 0.300000011921, 0.10000000149, 0.20000000298, 0.899999976158, 0.899999976158, 0.699999988079, 0.800000011921, 0.20000000298, 0.300000011921, 0.10000000149, 0.20000000298, 0.699999988079, 0.699999988079, 0.300000011921, 0.300000011921, 0.20000000298, 0.20000000298, 0.699999988079, 0.600000023842, 0.300000011921, 0.10000000149, 0.10000000149, 0.699999988079, 0.899999976158, 0.800000011921, 0.699999988079, 0.899999976158, 0.5, 0.699999988079, 0.5, 0.899999976158, 0.5, 0.5, 0.300000011921, 0.699999988079, 0.5, 0.20000000298, 0.600000023842, 0.699999988079, 0.600000023842, 0.20000000298, 0.20000000298, 0.800000011921, 0.899999976158, 0.10000000149, 0.899999976158, 0.40000000596, 0.10000000149, 0.10000000149, 0.20000000298, 0.800000011921, 0.699999988079, 0.600000023842, 0.40000000596, 0.300000011921, 0.699999988079, 0.899999976158, 0.40000000596, 0.10000000149, 0.40000000596, 0.699999988079, 0.600000023842, 0.800000011921, 0.5, 0.300000011921, 0.699999988079, 0.699999988079, 0.300000011921, 0.20000000298, 0.800000011921, 0.800000011921, 0.10000000149, 0.300000011921, 0.40000000596, 0.899999976158, 0.300000011921, 0.10000000149, 0.5, 0.600000023842, 0.40000000596, 0.899999976158, 0.800000011921, 0.5, 0.800000011921, 0.300000011921, 0.899999976158, 0.10000000149, 0.300000011921, 0.40000000596, 0.600000023842, 0.20000000298, 0.5, 0.300000011921, 0.20000000298, 0.300000011921, 0.40000000596, 0.899999976158, 0.300000011921, 0.800000011921, 0.600000023842, 0.40000000596, 0.699999988079, 0.20000000298, 0.699999988079, 0.800000011921, 0.40000000596, 0.10000000149, 0.5, 0.5, 0.20000000298, 0.300000011921, 0.899999976158, 0.699999988079, 0.40000000596, 0.699999988079, 0.10000000149, 0.5, 0.40000000596, 0.5, 0.5, 0.10000000149, 0.40000000596, 0.800000011921, 0.10000000149, 0.800000011921, 0.20000000298, 0.699999988079, 0.800000011921, 0.10000000149, 0.699999988079, 0.5, 0.10000000149, 0.20000000298, 0.20000000298, 0.600000023842, 0.699999988079, 0.20000000298, 0.699999988079, 0.699999988079, 0.600000023842, 0.300000011921, 0.800000011921, 0.20000000298, 0.5, 0.20000000298, 0.600000023842, 0.899999976158, 0.800000011921, 0.40000000596, 0.20000000298, 0.699999988079, 0.800000011921, 0.600000023842, 0.800000011921, 0.5, 0.699999988079, 0.20000000298, 0.300000011921, 0.20000000298, 0.699999988079, 0.40000000596, 0.699999988079, 0.5, 0.699999988079, 0.899999976158, 0.20000000298, 0.899999976158, 0.300000011921, 0.800000011921, 0.5, 0.699999988079, 0.20000000298, 0.899999976158, 0.600000023842, 0.300000011921, 0.800000011921, 0.300000011921, 0.40000000596, 0.699999988079, 0.699999988079, 0.600000023842, 0.20000000298, 0.20000000298, 0.5, 0.899999976158, 0.10000000149, 0.300000011921, 0.5, 0.20000000298, 0.800000011921, 0.600000023842, 0.20000000298, 0.20000000298, 0.20000000298, 0.800000011921, 0.699999988079, 0.10000000149, 0.800000011921, 0.899999976158, 0.10000000149, 0.300000011921, 0.300000011921, 0.300000011921, 0.20000000298, 0.899999976158, 0.40000000596, 0.600000023842, 0.699999988079, 0.5, 0.800000011921, 0.300000011921, 0.600000023842, 0.5, 0.20000000298, 0.20000000298, 0.800000011921, 0.699999988079, 0.300000011921, 0.600000023842, 0.899999976158, 0.40000000596, 0.40000000596, 0.899999976158, 0.300000011921, 0.899999976158, 0.20000000298, 0.800000011921, 0.300000011921, 0.10000000149, 0.800000011921, 0.5, 0.40000000596, 0.899999976158, 0.5, 0.600000023842, 0.699999988079, 0.800000011921, 0.600000023842, 0.10000000149, 0.699999988079, 0.800000011921, 0.899999976158, 0.10000000149, 0.800000011921, 0.800000011921, 0.40000000596, 0.20000000298, 0.5, 0.40000000596, 0.300000011921, 0.20000000298, 0.699999988079, 0.300000011921, 0.5, 0.699999988079, 0.300000011921, 0.5, 0.5, 0.600000023842, 0.699999988079, 0.600000023842, 0.40000000596, 0.40000000596, 0.800000011921, 0.699999988079, 0.20000000298, 0.5, 0.10000000149, 0.600000023842, 0.699999988079, 0.899999976158, 0.20000000298, 0.40000000596, 0.600000023842, 0.300000011921, 0.40000000596, 0.20000000298, 0.699999988079, 0.300000011921, 0.5, 0.5, 0.899999976158, 0.600000023842, 0.300000011921, 0.40000000596, 0.899999976158, 0.20000000298, 0.600000023842, 0.10000000149, 0.40000000596, 0.40000000596, 0.899999976158, 0.600000023842, 0.800000011921, 0.300000011921, 0.800000011921, 0.5, 0.300000011921, 0.10000000149, 0.899999976158, 0.40000000596, 0.300000011921, 0.10000000149, 0.600000023842, 0.800000011921, 0.300000011921, 0.699999988079, 0.40000000596, 0.899999976158, 0.40000000596, 0.699999988079, 0.899999976158, 0.20000000298, 0.600000023842, 0.40000000596, 0.5, 0.20000000298, 0.20000000298, 0.699999988079, 0.40000000596, 0.800000011921, 0.600000023842, 0.699999988079, 0.10000000149, 0.40000000596, 0.600000023842, 0.800000011921, 0.10000000149, 0.899999976158, 
+
+L3_cHER2K_B_nk
+0.800000011921, 0.5, 0.5, 0.20000000298, 0.20000000298, 0.5, 0.899999976158, 0.899999976158, 0.10000000149, 0.800000011921, 0.10000000149, 0.600000023842, 0.20000000298, 0.699999988079, 0.600000023842, 0.899999976158, 0.40000000596, 0.699999988079, 0.699999988079, 0.5, 0.800000011921, 0.699999988079, 0.300000011921, 0.899999976158, 0.10000000149, 0.20000000298, 0.300000011921, 0.5, 0.5, 0.10000000149, 0.699999988079, 0.20000000298, 0.600000023842, 0.300000011921, 0.40000000596, 0.20000000298, 0.800000011921, 0.20000000298, 0.20000000298, 0.800000011921, 0.10000000149, 0.20000000298, 0.699999988079, 0.699999988079, 0.20000000298, 0.600000023842, 0.5, 0.800000011921, 0.800000011921, 0.20000000298, 0.800000011921, 0.40000000596, 0.899999976158, 0.300000011921, 0.10000000149, 0.899999976158, 0.300000011921, 0.40000000596, 0.300000011921, 0.300000011921, 0.800000011921, 0.10000000149, 0.899999976158, 0.699999988079, 0.5, 0.10000000149, 0.5, 0.899999976158, 0.699999988079, 0.800000011921, 0.600000023842, 0.20000000298, 0.800000011921, 0.800000011921, 0.40000000596, 0.5, 0.699999988079, 0.800000011921, 0.40000000596, 0.800000011921, 0.5, 0.800000011921, 0.10000000149, 0.600000023842, 0.600000023842, 0.40000000596, 0.300000011921, 0.20000000298, 0.40000000596, 0.899999976158, 0.10000000149, 0.20000000298, 0.600000023842, 0.600000023842, 0.699999988079, 0.5, 0.40000000596, 0.300000011921, 0.600000023842, 0.40000000596, 0.600000023842, 0.40000000596, 0.40000000596, 0.899999976158, 0.20000000298, 0.5, 0.899999976158, 0.600000023842, 0.20000000298, 0.600000023842, 0.20000000298, 0.800000011921, 0.800000011921, 0.20000000298, 0.300000011921, 0.20000000298, 0.800000011921, 0.10000000149, 0.300000011921, 0.899999976158, 0.300000011921, 0.20000000298, 0.899999976158, 0.899999976158, 0.600000023842, 0.20000000298, 0.20000000298, 0.800000011921, 0.899999976158, 0.10000000149, 0.899999976158, 0.600000023842, 0.699999988079, 0.20000000298, 0.300000011921, 0.20000000298, 0.600000023842, 0.20000000298, 0.40000000596, 0.10000000149, 0.800000011921, 0.300000011921, 0.600000023842, 0.300000011921, 0.20000000298, 0.40000000596, 0.699999988079, 0.10000000149, 0.10000000149, 0.300000011921, 0.699999988079, 0.10000000149, 0.10000000149, 0.600000023842, 0.600000023842, 0.5, 0.20000000298, 0.5, 0.40000000596, 0.600000023842, 0.600000023842, 0.5, 0.600000023842, 0.800000011921, 0.10000000149, 0.899999976158, 0.5, 0.600000023842, 0.699999988079, 0.300000011921, 0.699999988079, 0.300000011921, 0.800000011921, 0.40000000596, 0.899999976158, 0.699999988079, 0.699999988079, 0.699999988079, 0.40000000596, 0.20000000298, 0.300000011921, 0.300000011921, 0.40000000596, 0.800000011921, 0.800000011921, 0.20000000298, 0.20000000298, 0.10000000149, 0.10000000149, 0.5, 0.20000000298, 0.5, 0.5, 0.300000011921, 0.40000000596, 0.20000000298, 0.40000000596, 0.5, 0.20000000298, 0.600000023842, 0.300000011921, 0.5, 0.899999976158, 0.699999988079, 0.899999976158, 0.10000000149, 0.5, 0.300000011921, 0.800000011921, 0.10000000149, 0.699999988079, 0.10000000149, 0.600000023842, 0.800000011921, 0.40000000596, 0.699999988079, 0.699999988079, 0.800000011921, 0.20000000298, 0.5, 0.10000000149, 0.10000000149, 0.10000000149, 0.5, 0.699999988079, 0.699999988079, 0.600000023842, 0.899999976158, 0.899999976158, 0.600000023842, 0.600000023842, 0.800000011921, 0.300000011921, 0.10000000149, 0.600000023842, 0.10000000149, 0.699999988079, 0.800000011921, 0.5, 0.300000011921, 0.10000000149, 0.899999976158, 0.20000000298, 0.20000000298, 0.899999976158, 0.300000011921, 0.40000000596, 0.10000000149, 0.600000023842, 0.10000000149, 0.800000011921, 0.600000023842, 0.5, 0.40000000596, 0.40000000596, 0.699999988079, 0.10000000149, 0.699999988079, 0.699999988079, 0.40000000596, 0.300000011921, 0.300000011921, 0.300000011921, 0.600000023842, 0.300000011921, 0.800000011921, 0.600000023842, 0.20000000298, 0.699999988079, 0.5, 0.20000000298, 0.899999976158, 0.40000000596, 0.10000000149, 0.20000000298, 0.40000000596, 0.699999988079, 0.300000011921, 0.10000000149, 0.800000011921, 0.5, 0.5, 0.5, 0.699999988079, 0.20000000298, 0.600000023842, 0.800000011921, 0.40000000596, 0.800000011921, 0.899999976158, 0.699999988079, 0.20000000298, 0.20000000298, 0.300000011921, 0.300000011921, 0.300000011921, 0.800000011921, 0.40000000596, 0.5, 0.899999976158, 0.699999988079, 0.5, 0.40000000596, 0.800000011921, 0.40000000596, 0.5, 0.10000000149, 0.699999988079, 0.699999988079, 0.20000000298, 0.899999976158, 0.600000023842, 0.300000011921, 0.10000000149, 0.40000000596, 0.20000000298, 0.20000000298, 0.300000011921, 0.300000011921, 0.10000000149, 0.40000000596, 0.300000011921, 0.20000000298, 0.699999988079, 0.600000023842, 0.899999976158, 0.20000000298, 0.300000011921, 0.40000000596, 0.600000023842, 0.800000011921, 0.800000011921, 0.40000000596, 0.20000000298, 0.699999988079, 0.800000011921, 0.5, 0.899999976158, 0.300000011921, 0.20000000298, 0.600000023842, 0.800000011921, 0.300000011921, 0.5, 0.699999988079, 0.10000000149, 0.20000000298, 0.699999988079, 0.10000000149, 0.20000000298, 0.20000000298, 0.600000023842, 0.699999988079, 0.600000023842, 0.10000000149, 0.20000000298, 0.300000011921, 0.699999988079, 0.600000023842, 0.899999976158, 0.300000011921, 0.5, 0.40000000596, 0.800000011921, 0.899999976158, 0.300000011921, 0.899999976158, 0.300000011921, 0.800000011921, 0.800000011921, 0.699999988079, 0.300000011921, 0.899999976158, 0.10000000149, 0.40000000596, 0.5, 0.600000023842, 0.300000011921, 0.20000000298, 0.600000023842, 0.20000000298, 0.5, 0.699999988079, 0.300000011921, 0.40000000596, 0.899999976158, 0.40000000596, 0.800000011921, 0.699999988079, 0.40000000596, 0.600000023842, 0.699999988079, 0.899999976158, 0.300000011921, 0.20000000298, 0.300000011921, 0.5, 0.10000000149, 0.40000000596, 0.5, 0.5, 0.899999976158, 0.600000023842, 0.300000011921, 0.300000011921, 0.800000011921, 0.699999988079, 0.699999988079, 0.600000023842, 0.600000023842, 0.40000000596, 0.800000011921, 0.300000011921, 0.300000011921, 0.699999988079, 0.600000023842, 0.40000000596, 0.300000011921, 0.699999988079, 0.600000023842, 0.300000011921, 0.300000011921, 0.20000000298, 0.40000000596, 0.300000011921, 0.10000000149, 0.899999976158, 0.10000000149, 0.899999976158, 0.600000023842, 0.699999988079, 0.10000000149, 0.10000000149, 0.600000023842, 0.10000000149, 0.10000000149, 0.10000000149, 0.300000011921, 0.10000000149, 0.20000000298, 0.600000023842, 0.699999988079, 0.800000011921, 0.300000011921, 0.20000000298, 0.699999988079, 0.40000000596, 0.600000023842, 0.40000000596, 0.20000000298, 0.699999988079, 0.600000023842, 0.5, 0.600000023842, 0.800000011921, 0.10000000149, 0.800000011921, 0.10000000149, 0.10000000149, 0.20000000298, 0.300000011921, 0.600000023842, 0.699999988079, 0.699999988079, 0.20000000298, 0.10000000149, 0.40000000596, 0.699999988079, 0.10000000149, 0.600000023842, 0.40000000596, 0.10000000149, 0.899999976158, 0.20000000298, 0.699999988079, 0.5, 0.40000000596, 0.40000000596, 0.800000011921, 0.40000000596, 0.600000023842, 0.899999976158, 0.899999976158, 0.10000000149, 0.20000000298, 0.5, 0.5, 0.40000000596, 0.800000011921, 0.10000000149, 0.300000011921, 0.5, 0.600000023842, 0.20000000298, 0.300000011921, 0.899999976158, 0.899999976158, 0.5, 0.10000000149, 0.699999988079, 0.300000011921, 0.699999988079, 0.5, 0.699999988079, 0.10000000149, 0.699999988079, 0.10000000149, 0.5, 0.600000023842, 0.300000011921, 0.899999976158, 0.40000000596, 0.300000011921, 0.40000000596, 0.800000011921, 0.300000011921, 0.800000011921, 0.10000000149, 0.699999988079, 0.600000023842, 0.40000000596, 0.699999988079, 0.5, 0.40000000596, 0.10000000149, 0.300000011921, 0.40000000596, 0.800000011921, 0.899999976158, 0.699999988079, 0.899999976158, 0.40000000596, 0.5, 0.800000011921, 0.300000011921, 0.10000000149, 0.800000011921, 0.300000011921, 0.699999988079, 0.10000000149, 0.20000000298, 0.10000000149, 0.40000000596, 0.300000011921, 
+
+L3_cHER2K_C_nn
+0.10000000149, 0.0, 0.800000011921, 0.40000000596, 0.800000011921, 0.699999988079, 0.300000011921, 0.899999976158, 0.300000011921, 0.40000000596, 0.5, 0.20000000298, 0.40000000596, 0.899999976158, 0.300000011921, 0.10000000149, 0.699999988079, 0.40000000596, 0.899999976158, 0.899999976158, 0.20000000298, 0.600000023842, 0.699999988079, 0.600000023842, 0.20000000298, 0.40000000596, 0.20000000298, 0.20000000298, 0.800000011921, 0.800000011921, 0.5, 0.699999988079, 0.5, 0.899999976158, 0.800000011921, -0.40000000596, 0.899999976158, 0.0, 0.10000000149, 0.699999988079, 0.899999976158, 0.600000023842, 0.40000000596, 0.300000011921, 0.40000000596, 0.5, 0.10000000149, 0.899999976158, 0.899999976158, 0.600000023842, 0.40000000596, 0.20000000298, 0.5, 0.600000023842, 0.20000000298, 0.5, 0.899999976158, 0.40000000596, 0.20000000298, 0.600000023842, 0.899999976158, 0.699999988079, 0.899999976158, 0.300000011921, 0.699999988079, 0.5, 0.300000011921, 0.600000023842, 0.800000011921, -0.699999988079, 0.10000000149, -0.699999988079, 0.800000011921, 0.0, 0.5, 0.300000011921, 0.600000023842, 0.5, 0.300000011921, 0.899999976158, 0.40000000596, 0.899999976158, 0.20000000298, 0.300000011921, 0.699999988079, 0.40000000596, 0.300000011921, 0.600000023842, 0.899999976158, 0.10000000149, 0.800000011921, 0.20000000298, 0.5, 0.300000011921, 0.899999976158, 0.600000023842, 0.20000000298, 0.699999988079, 0.899999976158, 0.600000023842, 0.300000011921, 0.5, 0.300000011921, -0.899999976158, 0.899999976158, -0.600000023842, 0.5, -0.300000011921, 0.899999976158, 0.0, 0.5, 0.300000011921, 0.899999976158, 0.699999988079, 0.300000011921, 0.600000023842, 0.10000000149, 0.300000011921, 0.699999988079, 0.5, 0.300000011921, 0.800000011921, 0.5, 0.699999988079, 0.699999988079, 0.40000000596, 0.20000000298, 0.5, 0.20000000298, 0.300000011921, 0.600000023842, 0.10000000149, 0.600000023842, 0.40000000596, 0.10000000149, 0.40000000596, 0.300000011921, -0.40000000596, 0.40000000596, -0.300000011921, 0.600000023842, -0.5, 0.5, -0.300000011921, 0.10000000149, 0.0, 0.10000000149, 0.300000011921, 0.10000000149, 0.800000011921, 0.40000000596, 0.300000011921, 0.5, 0.20000000298, 0.800000011921, 0.600000023842, 0.20000000298, 0.40000000596, 0.40000000596, 0.5, 0.600000023842, 0.40000000596, 0.600000023842, 0.5, 0.10000000149, 0.40000000596, 0.40000000596, 0.600000023842, 0.5, 0.600000023842, 0.5, -0.20000000298, 0.40000000596, -0.5, 0.300000011921, -0.899999976158, 0.899999976158, -0.699999988079, 0.10000000149, -0.300000011921, 0.40000000596, 0.0, 0.10000000149, 0.800000011921, 0.699999988079, 0.300000011921, 0.899999976158, 0.699999988079, 0.20000000298, 0.800000011921, 0.10000000149, 0.40000000596, 0.899999976158, 0.800000011921, 0.899999976158, 0.600000023842, 0.699999988079, 0.600000023842, 0.10000000149, 0.699999988079, 0.20000000298, 0.20000000298, 0.10000000149, 0.20000000298, 0.40000000596, -0.899999976158, 0.10000000149, -0.899999976158, 0.40000000596, -0.899999976158, 0.300000011921, -0.600000023842, 0.10000000149, -0.800000011921, 0.10000000149, -0.800000011921, 0.10000000149, 0.0, 0.40000000596, 0.300000011921, 0.899999976158, 0.5, 0.40000000596, 0.300000011921, 0.40000000596, 0.5, 0.40000000596, 0.300000011921, 0.600000023842, 0.800000011921, 0.699999988079, 0.699999988079, 0.699999988079, 0.5, 0.20000000298, 0.899999976158, 0.699999988079, 0.699999988079, 0.300000011921, -0.10000000149, 0.899999976158, -0.600000023842, 0.20000000298, -0.300000011921, 0.10000000149, -0.300000011921, 0.40000000596, -0.300000011921, 0.699999988079, -0.300000011921, 0.40000000596, -0.300000011921, 0.300000011921, 0.0, 0.20000000298, 0.40000000596, 0.5, 0.899999976158, 0.800000011921, 0.899999976158, 0.20000000298, 0.800000011921, 0.899999976158, 0.300000011921, 0.300000011921, 0.699999988079, 0.20000000298, 0.800000011921, 0.600000023842, 0.800000011921, 0.300000011921, 0.300000011921, 0.699999988079, -0.40000000596, 0.40000000596, -0.20000000298, 0.699999988079, -0.40000000596, 0.699999988079, -0.5, 0.5, -0.20000000298, 0.899999976158, -0.699999988079, 0.899999976158, -0.5, 0.20000000298, -0.40000000596, 0.20000000298, 0.0, 0.800000011921, 0.20000000298, 0.20000000298, 0.5, 0.10000000149, 0.699999988079, 0.10000000149, 0.699999988079, 0.300000011921, 0.899999976158, 0.40000000596, 0.300000011921, 0.899999976158, 0.300000011921, 0.600000023842, 0.300000011921, 0.899999976158, -0.899999976158, 0.5, -0.600000023842, 0.300000011921, -0.600000023842, 0.300000011921, -0.800000011921, 0.800000011921, -0.600000023842, 0.20000000298, -0.800000011921, 0.40000000596, -0.300000011921, 0.5, -0.899999976158, 0.800000011921, -0.20000000298, 0.300000011921, 0.0, 0.600000023842, 0.699999988079, 0.699999988079, 0.699999988079, 0.600000023842, 0.10000000149, 0.600000023842, 0.40000000596, 0.20000000298, 0.800000011921, 0.10000000149, 0.600000023842, 0.600000023842, 0.600000023842, 0.20000000298, -0.600000023842, 0.20000000298, -0.5, 0.899999976158, -0.10000000149, 0.5, -0.699999988079, 0.20000000298, -0.40000000596, 0.10000000149, -0.40000000596, 0.40000000596, -0.5, 0.800000011921, -0.899999976158, 0.20000000298, -0.5, 0.600000023842, -0.699999988079, 0.300000011921, 0.0, 0.20000000298, 0.699999988079, 0.699999988079, 0.300000011921, 0.899999976158, 0.5, 0.600000023842, 0.899999976158, 0.800000011921, 0.40000000596, 0.20000000298, 0.10000000149, 0.699999988079, -0.600000023842, 0.899999976158, -0.40000000596, 0.800000011921, -0.20000000298, 0.699999988079, -0.40000000596, 0.40000000596, -0.5, 0.899999976158, -0.800000011921, 0.40000000596, -0.300000011921, 0.20000000298, -0.800000011921, 0.10000000149, -0.699999988079, 0.699999988079, -0.699999988079, 0.20000000298, -0.699999988079, 0.5, 0.0, 0.600000023842, 0.300000011921, 0.800000011921, 0.10000000149, 0.5, 0.600000023842, 0.800000011921, 0.20000000298, 0.600000023842, 0.800000011921, 0.20000000298, -0.40000000596, 0.20000000298, -0.600000023842, 0.5, -0.300000011921, 0.20000000298, -0.5, 0.600000023842, -0.40000000596, 0.899999976158, -0.600000023842, 0.600000023842, -0.800000011921, 0.899999976158, -0.300000011921, 0.10000000149, -0.699999988079, 0.600000023842, -0.10000000149, 0.699999988079, -0.300000011921, 0.600000023842, -0.300000011921, 0.300000011921, 0.0, 0.899999976158, 0.899999976158, 0.10000000149, 0.5, 0.699999988079, 0.5, 0.300000011921, 0.5, 0.20000000298, -0.20000000298, 0.899999976158, -0.699999988079, 0.899999976158, -0.600000023842, 0.20000000298, -0.300000011921, 0.600000023842, -0.5, 0.699999988079, -0.600000023842, 0.699999988079, -0.699999988079, 0.300000011921, -0.699999988079, 0.300000011921, -0.899999976158, 0.600000023842, -0.40000000596, 0.899999976158, -0.5, 0.800000011921, -0.10000000149, 0.899999976158, -0.899999976158, 0.10000000149, 0.0, 0.699999988079, 0.899999976158, 0.699999988079, 0.20000000298, 0.600000023842, 0.600000023842, 0.800000011921, -0.800000011921, 0.899999976158, -0.300000011921, 0.20000000298, -0.699999988079, 0.600000023842, -0.10000000149, 0.10000000149, -0.40000000596, 0.10000000149, -0.699999988079, 0.699999988079, -0.5, 0.20000000298, -0.800000011921, 0.40000000596, -0.300000011921, 0.20000000298, -0.800000011921, 0.600000023842, -0.899999976158, 0.5, -0.600000023842, 0.10000000149, -0.5, 0.699999988079, -0.899999976158, 0.300000011921, 0.0, 0.20000000298, 0.300000011921, 0.20000000298, 0.20000000298, 0.5, -0.699999988079, 0.699999988079, -0.5, 0.899999976158, -0.600000023842, 0.600000023842, -0.40000000596, 0.40000000596, -0.600000023842, 0.20000000298, -0.20000000298, 0.20000000298, -0.899999976158, 0.600000023842, -0.800000011921, 0.899999976158, -0.300000011921, 0.10000000149, -0.600000023842, 0.800000011921, -0.40000000596, 0.800000011921, -0.20000000298, 0.699999988079, -0.5, 0.699999988079, -0.20000000298, 0.20000000298, -0.300000011921, 0.600000023842, 0.0, 0.300000011921, 0.10000000149, 0.5, -0.899999976158, 0.300000011921, -0.600000023842, 0.300000011921, -0.5, 0.10000000149, -0.40000000596, 0.5, -0.600000023842, 0.10000000149, -0.20000000298, 0.699999988079, -0.699999988079, 0.300000011921, -0.300000011921, 0.600000023842, -0.300000011921, 0.600000023842, -0.600000023842, 0.20000000298, -0.10000000149, 0.600000023842, -0.800000011921, 0.300000011921, -0.5, 0.600000023842, -0.600000023842, 0.20000000298, -0.20000000298, 0.300000011921, -0.10000000149, 0.600000023842, 0.0, 
+
+L3_cHER2K_o_N
+16.7000000253, -1.33226762955e-15, 16.3100001925, 0.0299998816848, 18.260000039, 0.319999764413, 15.3900001539, -1.89000006229, 15.3100001419, 1.47999986008, 17.3600000994, -1.34000002801, 16.5900000705, 0.709999814034, 17.3500000954, -0.63000007689, 16.2800001164, -1.12000010863, 16.3199999641, 0.719999999851, 14.9700000863, -1.36000007182, 17.760000086, 1.20999989152, 16.860000159, -0.550000102818, 15.7500000365, -0.570000060201, 16.8200001407, 2.32999984741, 16.6000000745, 1.23999989465, 16.5300001149, 1.38999987304, 16.3100001925, -0.0299998816848, 15.1400001383, -3.33066907388e-16, 16.1700001921, 0.699999976158, 15.5700001377, -1.12999984965, 14.0000003263, 0.629999983013, 17.0700002435, 0.0700000587106, 14.760000156, 0.1299999547, 16.7600001895, -0.319999841154, 16.1700001876, -1.25000002161, 16.0800001164, 1.35000008419, 13.4900001748, -0.899999985099, 17.2500002533, 0.960000034571, 16.040000262, -1.28999993414, 16.4300001231, -0.429999971092, 16.4600001985, 2.07999999121, 16.3600000606, 1.00000007302, 16.2500001878, 0.790000140518, 18.260000039, -0.319999764413, 16.1700001921, -0.699999976158, 17.0600002104, -2.22044604925e-16, 15.0700001034, -1.64999979585, 14.770000248, 2.2199999842, 17.3000001445, 0.330000127554, 15.5800001797, 1.04999995828, 16.8300001484, 0.340000114441, 16.2900001509, -0.220000038594, 15.4200001884, 1.90000008941, 15.7500001729, -0.519999971539, 17.9500001825, 1.31000011653, 17.6000001974, -1.03999991328, 15.9900002009, -0.189999897629, 16.1700001965, 2.45999998391, 17.6400001144, 1.35000015274, 16.1000001512, 1.31000006959, 15.3900001539, 1.89000006229, 15.5700001377, 1.12999984965, 15.0700001034, 1.64999979585, 13.9200001198, 2.22044604925e-16, 13.7300002505, 2.38999994159, 16.090000212, 1.90000004768, 14.8400000705, 1.67999990404, 14.7400001234, 1.53000004038, 14.370000207, 1.43999991998, 14.130000167, 3.30000005886, 12.8200001958, 1.29999991804, 16.8400001934, 2.93000001431, 15.220000204, 1.49999988377, 13.7400002314, 1.51999993056, 14.8500002563, 3.22999983847, 14.6000001587, 2.71999994248, 14.2500002459, 2.30999999434, 15.3100001419, -1.47999986008, 14.0000003263, -0.629999983013, 14.770000248, -2.2199999842, 13.7300002505, -2.38999994159, 11.3800003138, 2.22044604925e-16, 14.4200002711, -2.31999993578, 13.2800001805, -0.25000006035, 14.060000232, -0.70999989599, 13.3600001538, -1.3299999927, 13.5500002772, -0.539999925941, 12.400000231, -1.39999997318, 15.6900002545, 0.0199999976158, 13.7000003479, -2.00999992281, 13.1900002992, -1.03999995276, 14.3800002207, 0.70000000447, 13.5000002593, -0.3199999246, 14.3900002165, -0.199999940395, 17.3600000994, 1.34000002801, 17.0700002435, -0.0700000587106, 17.3000001445, -0.330000127554, 16.090000212, -1.90000004768, 14.4200002711, 2.31999993578, 16.2600002596, 0.0, 15.5100001881, 3.19999983981, 16.6600001113, 1.08000001505, 16.4200001027, 0.919999851584, 16.2000001684, 2.22000000507, 15.1000002347, 0.0199999588728, 17.4800001998, 2.51999990299, 16.9300002192, -6.70552391391e-09, 15.9400001726, 1.90999991834, 16.4000002332, 3.25999978572, 16.3100000688, 1.42999995843, 16.6300002423, 1.73999998033, 16.5900000705, -0.709999814034, 14.760000156, -0.1299999547, 15.5800001797, -1.04999995828, 14.8400000705, -1.67999990404, 13.2800001805, 0.25000006035, 15.5100001881, -3.19999983981, 14.8000001207, 0.0, 15.4800001283, 0.0700001391768, 15.5100001664, -0.969999974519, 15.3800001648, 0.15000012666, 14.1700001474, -1.64999989867, 16.5500001013, 0.210000110567, 15.9100002581, -0.27999988988, 14.5500001356, 3.50177284947e-08, 15.7700001772, 2.49000000343, 14.4200001325, 1.10000010207, 16.1600001054, 1.12000011533, 17.3500000954, 0.63000007689, 16.7600001895, 0.319999841154, 16.8300001484, -0.340000114441, 14.7400001234, -1.53000004038, 14.060000232, 0.70999989599, 16.6600001113, -1.08000001505, 15.4800001283, -0.0700001391768, 15.4800000873, 0.0, 14.9600001739, -0.970000097454, 15.5000001281, 1.57999992117, 15.2300001246, -0.410000073314, 16.7000001356, 2.14999992251, 17.4100000688, -0.989999978095, 14.7200001511, -0.590000064522, 16.6200001802, 1.64999988154, 17.4800000344, 1.6699999775, 15.8700001645, 0.419999969304, 16.2800001164, 1.12000010863, 16.1700001876, 1.25000002161, 16.2900001509, 0.220000038594, 14.370000207, -1.43999991998, 13.3600001538, 1.3299999927, 16.4200001027, -0.919999851584, 15.5100001664, 0.969999974519, 14.9600001739, 0.970000097454, 15.5200001347, 4.4408920985e-16, 16.2700001355, 2.01000007108, 13.7800002177, 0.150000099838, 15.7800002125, 3.02999997035, 15.0200001712, 0.940000025034, 13.6800001618, 1.23000006422, 15.3500001691, 2.03999994308, 16.130000053, 1.30000016391, 15.7800002021, 1.01000007257, 16.3199999641, -0.719999999851, 16.0800001164, -1.35000008419, 15.4200001884, -1.90000008941, 14.130000167, -3.30000005886, 13.5500002772, 0.539999925941, 16.2000001684, -2.22000000507, 15.3800001648, -0.15000012666, 15.5000001281, -1.57999992117, 16.2700001355, -2.01000007108, 14.9800001723, 4.4408920985e-16, 14.1600002544, -1.24999999851, 17.2100001292, 1.00999993399, 16.5000001438, -0.480000074655, 14.140000253, -0.659999928027, 14.420000242, 2.30999992579, 15.79000011, 0.98999997139, 14.6300002229, 0.48000007093, 14.9700000863, 1.36000007182, 13.4900001748, 0.899999985099, 15.7500001729, 0.519999971539, 12.8200001958, -1.29999991804, 12.400000231, 1.39999997318, 15.1000002347, -0.0199999588728, 14.1700001474, 1.64999989867, 15.2300001246, 0.410000073314, 13.7800002177, -0.150000099838, 14.1600002544, 1.24999999851, 13.0000001281, -1.11022302463e-16, 16.0600001985, 3.7600000301, 15.6100001985, 0.490000058562, 14.6700001772, 0.570000025183, 15.1800002401, 4.27999993607, 15.3500001222, 3.13999999076, 14.5300001402, 1.98999997884, 17.760000086, -1.20999989152, 17.2500002533, -0.960000034571, 17.9500001825, -1.31000011653, 16.8400001934, -2.93000001431, 15.6900002545, -0.0199999976158, 17.4800001998, -2.51999990299, 16.5500001013, -0.210000110567, 16.7000001356, -2.14999992251, 15.7800002125, -3.02999997035, 17.2100001292, -1.00999993399, 16.0600001985, -3.7600000301, 18.5000001997, -4.4408920985e-16, 17.3600002357, -1.2700000155, 16.3300002192, -0.399999993294, 16.9200002085, 2.09999997392, 17.4500001401, 0.21000008896, 17.5200002033, -0.329999930859, 16.860000159, 0.550000102818, 16.040000262, 1.28999993414, 17.6000001974, 1.03999991328, 15.220000204, -1.49999988377, 13.7000003479, 2.00999992281, 16.9300002192, 6.70552546822e-09, 15.9100002581, 0.27999988988, 17.4100000688, 0.989999978095, 15.0200001712, -0.940000025034, 16.5000001438, 0.480000074655, 15.6100001985, -0.490000058562, 17.3600002357, 1.2700000155, 16.1400003082, 2.22044604925e-16, 16.4100001433, 1.23999997139, 16.4100002357, 3.279999872, 16.3200001906, 2.15999999508, 15.9900002694, 1.18000005677, 15.7500000365, 0.570000060201, 16.4300001231, 0.429999971092, 15.9900002009, 0.189999897629, 13.7400002314, -1.51999993056, 13.1900002992, 1.03999995276, 15.9400001726, -1.90999991834, 14.5500001356, -3.50177287167e-08, 14.7200001511, 0.590000064522, 13.6800001618, -1.23000006422, 14.140000253, 0.659999928027, 14.6700001772, -0.570000025183, 16.3300002192, 0.399999993294, 16.4100001433, -1.23999997139, 13.1400002724, 2.22044604925e-16, 15.3100002164, 2.35999994218, 15.2600001709, 1.46999996632, 15.1500001706, 1.42000012353, 16.8200001407, -2.32999984741, 16.4600001985, -2.07999999121, 16.1700001965, -2.45999998391, 14.8500002563, -3.22999983847, 14.3800002207, -0.70000000447, 16.4000002332, -3.25999978572, 15.7700001772, -2.49000000343, 16.6200001802, -1.64999988154, 15.3500001691, -2.03999994308, 14.420000242, -2.30999992579, 15.1800002401, -4.27999993607, 16.9200002085, -2.09999997392, 16.4100002357, -3.279999872, 15.3100002164, -2.35999994218, 16.1800001812, 6.66133814775e-16, 15.8700001906, -0.649999931455, 15.2600002015, -0.959999923557, 16.6000000745, -1.23999989465, 16.3600000606, -1.00000007302, 17.6400001144, -1.35000015274, 14.6000001587, -2.71999994248, 13.5000002593, 0.3199999246, 16.3100000688, -1.42999995843, 14.4200001325, -1.10000010207, 17.4800000344, -1.6699999775, 16.130000053, -1.30000016391, 15.79000011, -0.98999997139, 15.3500001222, -3.13999999076, 17.4500001401, -0.21000008896, 16.3200001906, -2.15999999508, 15.2600001709, -1.46999996632, 15.8700001906, 0.649999931455, 16.1600001404, 2.22044604925e-16, 15.2000001252, -0.249999957532, 16.5300001149, -1.38999987304, 16.2500001878, -0.790000140518, 16.1000001512, -1.31000006959, 14.2500002459, -2.30999999434, 14.3900002165, 0.199999940395, 16.6300002423, -1.73999998033, 16.1600001054, -1.12000011533, 15.8700001645, -0.419999969304, 15.7800002021, -1.01000007257, 14.6300002229, -0.48000007093, 14.5300001402, -1.98999997884, 17.5200002033, 0.329999930859, 15.9900002694, -1.18000005677, 15.1500001706, -1.42000012353, 15.2600002015, 0.959999923557, 15.2000001252, 0.249999957532, 15.7600002298, -2.22044604925e-16, 
+
+L3_cHER2K_A_kn
+0.20000000298, 0.600000023842, 0.800000011921, 0.5, 0.600000023842, 0.800000011921, 0.5, 0.20000000298, 0.800000011921, 0.699999988079, 0.300000011921, 0.40000000596, 0.600000023842, 0.20000000298, 0.5, 0.10000000149, 0.10000000149, 0.600000023842, 0.600000023842, 0.899999976158, 0.699999988079, 0.899999976158, 0.800000011921, 0.600000023842, 0.800000011921, 0.800000011921, 0.699999988079, 0.600000023842, 0.899999976158, 0.40000000596, 0.899999976158, 0.699999988079, 0.800000011921, 0.600000023842, 0.20000000298, 0.5, 0.40000000596, 0.5, 0.20000000298, 0.5, 0.5, 0.5, 0.600000023842, 0.20000000298, 0.5, 0.800000011921, 0.699999988079, 0.699999988079, 0.899999976158, 0.699999988079, 0.5, 0.40000000596, 0.600000023842, 0.5, 0.5, 0.899999976158, 0.5, 0.699999988079, 0.899999976158, 0.5, 0.800000011921, 0.40000000596, 0.300000011921, 0.40000000596, 0.40000000596, 0.40000000596, 0.899999976158, 0.40000000596, 0.600000023842, 0.699999988079, 0.300000011921, 0.40000000596, 0.699999988079, 0.300000011921, 0.10000000149, 0.300000011921, 0.300000011921, 0.699999988079, 0.20000000298, 0.899999976158, 0.300000011921, 0.300000011921, 0.699999988079, 0.20000000298, 0.40000000596, 0.600000023842, 0.899999976158, 0.600000023842, 0.800000011921, 0.300000011921, 0.600000023842, 0.600000023842, 0.10000000149, 0.20000000298, 0.20000000298, 0.800000011921, 0.40000000596, 0.699999988079, 0.40000000596, 0.10000000149, 0.5, 0.5, 0.20000000298, 0.699999988079, 0.600000023842, 0.800000011921, 0.20000000298, 0.699999988079, 0.20000000298, 0.899999976158, 0.40000000596, 0.10000000149, 0.800000011921, 0.40000000596, 0.20000000298, 0.300000011921, 0.899999976158, 0.300000011921, 0.40000000596, 0.40000000596, 0.600000023842, 0.600000023842, 0.899999976158, 0.600000023842, 0.300000011921, 0.5, 0.600000023842, 0.20000000298, 0.5, 0.699999988079, 0.40000000596, 0.10000000149, 0.40000000596, 0.699999988079, 0.899999976158, 0.40000000596, 0.600000023842, 0.40000000596, 0.40000000596, 0.10000000149, 0.300000011921, 0.899999976158, 0.899999976158, 0.40000000596, 0.10000000149, 0.10000000149, 0.40000000596, 0.10000000149, 0.699999988079, 0.40000000596, 0.899999976158, 0.800000011921, 0.10000000149, 0.5, 0.800000011921, 0.899999976158, 0.10000000149, 0.899999976158, 0.10000000149, 0.800000011921, 0.800000011921, 0.800000011921, 0.600000023842, 0.40000000596, 0.300000011921, 0.699999988079, 0.5, 0.800000011921, 0.899999976158, 0.600000023842, 0.20000000298, 0.800000011921, 0.800000011921, 0.699999988079, 0.5, 0.20000000298, 0.899999976158, 0.10000000149, 0.10000000149, 0.40000000596, 0.300000011921, 0.899999976158, 0.600000023842, 0.600000023842, 0.800000011921, 0.10000000149, 0.600000023842, 0.20000000298, 0.5, 0.899999976158, 0.20000000298, 0.5, 0.600000023842, 0.20000000298, 0.300000011921, 0.40000000596, 0.300000011921, 0.10000000149, 0.5, 0.899999976158, 0.300000011921, 0.300000011921, 0.40000000596, 0.5, 0.899999976158, 0.20000000298, 0.40000000596, 0.699999988079, 0.699999988079, 0.699999988079, 0.20000000298, 0.40000000596, 0.40000000596, 0.899999976158, 0.20000000298, 0.40000000596, 0.10000000149, 0.699999988079, 0.40000000596, 0.800000011921, 0.20000000298, 0.300000011921, 0.699999988079, 0.20000000298, 0.300000011921, 0.699999988079, 0.20000000298, 0.5, 0.699999988079, 0.800000011921, 0.40000000596, 0.5, 0.10000000149, 0.800000011921, 0.899999976158, 0.800000011921, 0.10000000149, 0.5, 0.20000000298, 0.699999988079, 0.10000000149, 0.899999976158, 0.800000011921, 0.899999976158, 0.10000000149, 0.10000000149, 0.300000011921, 0.40000000596, 0.699999988079, 0.899999976158, 0.600000023842, 0.300000011921, 0.40000000596, 0.800000011921, 0.5, 0.5, 0.10000000149, 0.800000011921, 0.10000000149, 0.10000000149, 0.10000000149, 0.10000000149, 0.20000000298, 0.10000000149, 0.899999976158, 0.600000023842, 0.10000000149, 0.899999976158, 0.600000023842, 0.800000011921, 0.40000000596, 0.10000000149, 0.5, 0.20000000298, 0.40000000596, 0.699999988079, 0.300000011921, 0.899999976158, 0.40000000596, 0.899999976158, 0.800000011921, 0.20000000298, 0.5, 0.20000000298, 0.40000000596, 0.300000011921, 0.5, 0.5, 0.300000011921, 0.5, 0.5, 0.600000023842, 0.5, 0.699999988079, 0.10000000149, 0.899999976158, 0.800000011921, 0.800000011921, 0.5, 0.800000011921, 0.699999988079, 0.699999988079, 0.899999976158, 0.40000000596, 0.20000000298, 0.699999988079, 0.899999976158, 0.699999988079, 0.5, 0.899999976158, 0.300000011921, 0.300000011921, 0.5, 0.5, 0.699999988079, 0.699999988079, 0.20000000298, 0.40000000596, 0.40000000596, 0.600000023842, 0.899999976158, 0.600000023842, 0.899999976158, 0.699999988079, 0.40000000596, 0.800000011921, 0.600000023842, 0.600000023842, 0.600000023842, 0.20000000298, 0.40000000596, 0.899999976158, 0.899999976158, 0.40000000596, 0.40000000596, 0.40000000596, 0.20000000298, 0.899999976158, 0.699999988079, 0.300000011921, 0.699999988079, 0.10000000149, 0.800000011921, 0.600000023842, 0.40000000596, 0.40000000596, 0.699999988079, 0.600000023842, 0.899999976158, 0.10000000149, 0.699999988079, 0.40000000596, 0.20000000298, 0.10000000149, 0.699999988079, 0.699999988079, 0.10000000149, 0.699999988079, 0.600000023842, 0.600000023842, 0.300000011921, 0.5, 0.699999988079, 0.800000011921, 0.800000011921, 0.699999988079, 0.800000011921, 0.800000011921, 0.20000000298, 0.800000011921, 0.300000011921, 0.899999976158, 0.300000011921, 0.800000011921, 0.20000000298, 0.40000000596, 0.899999976158, 0.40000000596, 0.20000000298, 0.10000000149, 0.699999988079, 0.600000023842, 0.699999988079, 0.5, 0.20000000298, 0.20000000298, 0.600000023842, 0.600000023842, 0.899999976158, 0.899999976158, 0.10000000149, 0.10000000149, 0.40000000596, 0.40000000596, 0.5, 0.20000000298, 0.10000000149, 0.40000000596, 0.10000000149, 0.5, 0.600000023842, 0.20000000298, 0.5, 0.20000000298, 0.699999988079, 0.5, 0.699999988079, 0.800000011921, 0.300000011921, 0.699999988079, 0.20000000298, 0.800000011921, 0.600000023842, 0.10000000149, 0.899999976158, 0.10000000149, 0.10000000149, 0.300000011921, 0.699999988079, 0.699999988079, 0.300000011921, 0.5, 0.800000011921, 0.300000011921, 0.5, 0.5, 0.699999988079, 0.800000011921, 0.20000000298, 0.800000011921, 0.600000023842, 0.800000011921, 0.600000023842, 0.20000000298, 0.40000000596, 0.5, 0.40000000596, 0.10000000149, 0.800000011921, 0.800000011921, 0.10000000149, 0.600000023842, 0.699999988079, 0.899999976158, 0.20000000298, 0.10000000149, 0.5, 0.899999976158, 0.20000000298, 0.300000011921, 0.800000011921, 0.40000000596, 0.20000000298, 0.699999988079, 0.5, 0.899999976158, 0.20000000298, 0.800000011921, 0.20000000298, 0.600000023842, 0.300000011921, 0.800000011921, 0.300000011921, 0.699999988079, 0.40000000596, 0.20000000298, 0.10000000149, 0.800000011921, 0.800000011921, 0.10000000149, 0.10000000149, 0.699999988079, 0.300000011921, 0.800000011921, 0.699999988079, 0.300000011921, 0.20000000298, 0.20000000298, 0.600000023842, 0.10000000149, 0.300000011921, 0.899999976158, 0.800000011921, 0.5, 0.20000000298, 0.300000011921, 0.5, 0.800000011921, 0.899999976158, 0.300000011921, 0.899999976158, 0.800000011921, 0.5, 0.10000000149, 0.10000000149, 0.5, 0.5, 0.899999976158, 0.300000011921, 0.800000011921, 0.800000011921, 0.300000011921, 0.699999988079, 0.300000011921, 0.699999988079, 0.699999988079, 0.899999976158, 0.20000000298, 0.20000000298, 0.5, 0.800000011921, 0.40000000596, 0.20000000298, 0.20000000298, 0.5, 0.899999976158, 0.600000023842, 0.800000011921, 0.20000000298, 0.699999988079, 0.5, 0.300000011921, 0.20000000298, 0.5, 0.5, 0.699999988079, 0.5, 0.600000023842, 0.10000000149, 0.300000011921, 0.5, 0.10000000149, 0.5, 0.300000011921, 0.20000000298, 0.800000011921, 0.800000011921, 0.899999976158, 0.600000023842, 0.899999976158, 0.10000000149, 0.300000011921, 0.699999988079, 0.40000000596, 
+
+L3_cHER2K_B_kn
+0.800000011921, 0.5, 0.10000000149, 0.5, 0.300000011921, 0.600000023842, 0.899999976158, 0.20000000298, 0.300000011921, 0.20000000298, 0.600000023842, 0.699999988079, 0.699999988079, 0.300000011921, 0.800000011921, 0.699999988079, 0.10000000149, 0.899999976158, 0.699999988079, 0.800000011921, 0.20000000298, 0.899999976158, 0.10000000149, 0.699999988079, 0.600000023842, 0.40000000596, 0.20000000298, 0.600000023842, 0.10000000149, 0.5, 0.20000000298, 0.10000000149, 0.300000011921, 0.10000000149, 0.20000000298, 0.300000011921, 0.5, 0.5, 0.300000011921, 0.600000023842, 0.899999976158, 0.800000011921, 0.699999988079, 0.40000000596, 0.699999988079, 0.600000023842, 0.699999988079, 0.600000023842, 0.20000000298, 0.5, 0.800000011921, 0.40000000596, 0.5, 0.899999976158, 0.10000000149, 0.300000011921, 0.699999988079, 0.10000000149, 0.20000000298, 0.20000000298, 0.899999976158, 0.300000011921, 0.10000000149, 0.20000000298, 0.800000011921, 0.699999988079, 0.20000000298, 0.600000023842, 0.10000000149, 0.300000011921, 0.300000011921, 0.600000023842, 0.10000000149, 0.899999976158, 0.40000000596, 0.800000011921, 0.899999976158, 0.5, 0.800000011921, 0.600000023842, 0.5, 0.40000000596, 0.800000011921, 0.20000000298, 0.800000011921, 0.20000000298, 0.800000011921, 0.899999976158, 0.5, 0.5, 0.600000023842, 0.20000000298, 0.600000023842, 0.899999976158, 0.899999976158, 0.5, 0.899999976158, 0.20000000298, 0.699999988079, 0.10000000149, 0.800000011921, 0.10000000149, 0.600000023842, 0.5, 0.899999976158, 0.899999976158, 0.10000000149, 0.600000023842, 0.699999988079, 0.800000011921, 0.800000011921, 0.20000000298, 0.10000000149, 0.300000011921, 0.800000011921, 0.899999976158, 0.800000011921, 0.899999976158, 0.20000000298, 0.10000000149, 0.899999976158, 0.699999988079, 0.10000000149, 0.5, 0.600000023842, 0.300000011921, 0.20000000298, 0.20000000298, 0.40000000596, 0.10000000149, 0.5, 0.20000000298, 0.600000023842, 0.20000000298, 0.600000023842, 0.5, 0.20000000298, 0.20000000298, 0.800000011921, 0.20000000298, 0.600000023842, 0.899999976158, 0.800000011921, 0.10000000149, 0.899999976158, 0.10000000149, 0.600000023842, 0.5, 0.40000000596, 0.899999976158, 0.300000011921, 0.10000000149, 0.600000023842, 0.10000000149, 0.10000000149, 0.600000023842, 0.20000000298, 0.800000011921, 0.699999988079, 0.600000023842, 0.300000011921, 0.600000023842, 0.300000011921, 0.600000023842, 0.20000000298, 0.5, 0.20000000298, 0.5, 0.20000000298, 0.20000000298, 0.800000011921, 0.800000011921, 0.10000000149, 0.40000000596, 0.5, 0.20000000298, 0.5, 0.20000000298, 0.5, 0.800000011921, 0.600000023842, 0.40000000596, 0.699999988079, 0.600000023842, 0.300000011921, 0.5, 0.899999976158, 0.699999988079, 0.300000011921, 0.300000011921, 0.899999976158, 0.20000000298, 0.699999988079, 0.800000011921, 0.300000011921, 0.20000000298, 0.600000023842, 0.800000011921, 0.20000000298, 0.20000000298, 0.300000011921, 0.5, 0.600000023842, 0.600000023842, 0.5, 0.600000023842, 0.899999976158, 0.20000000298, 0.800000011921, 0.40000000596, 0.40000000596, 0.800000011921, 0.600000023842, 0.10000000149, 0.40000000596, 0.600000023842, 0.800000011921, 0.899999976158, 0.20000000298, 0.10000000149, 0.600000023842, 0.20000000298, 0.699999988079, 0.5, 0.5, 0.800000011921, 0.699999988079, 0.5, 0.600000023842, 0.300000011921, 0.10000000149, 0.800000011921, 0.600000023842, 0.40000000596, 0.600000023842, 0.899999976158, 0.800000011921, 0.20000000298, 0.20000000298, 0.20000000298, 0.5, 0.10000000149, 0.800000011921, 0.899999976158, 0.5, 0.600000023842, 0.600000023842, 0.699999988079, 0.10000000149, 0.600000023842, 0.699999988079, 0.800000011921, 0.300000011921, 0.300000011921, 0.600000023842, 0.20000000298, 0.10000000149, 0.600000023842, 0.699999988079, 0.300000011921, 0.300000011921, 0.300000011921, 0.899999976158, 0.300000011921, 0.5, 0.699999988079, 0.300000011921, 0.699999988079, 0.5, 0.699999988079, 0.800000011921, 0.10000000149, 0.899999976158, 0.800000011921, 0.300000011921, 0.20000000298, 0.699999988079, 0.600000023842, 0.600000023842, 0.40000000596, 0.300000011921, 0.800000011921, 0.899999976158, 0.899999976158, 0.800000011921, 0.300000011921, 0.800000011921, 0.20000000298, 0.800000011921, 0.40000000596, 0.20000000298, 0.5, 0.5, 0.40000000596, 0.10000000149, 0.40000000596, 0.699999988079, 0.300000011921, 0.899999976158, 0.699999988079, 0.600000023842, 0.600000023842, 0.800000011921, 0.20000000298, 0.899999976158, 0.899999976158, 0.800000011921, 0.899999976158, 0.20000000298, 0.600000023842, 0.800000011921, 0.699999988079, 0.800000011921, 0.20000000298, 0.10000000149, 0.10000000149, 0.40000000596, 0.600000023842, 0.10000000149, 0.600000023842, 0.40000000596, 0.20000000298, 0.40000000596, 0.10000000149, 0.20000000298, 0.800000011921, 0.800000011921, 0.899999976158, 0.40000000596, 0.800000011921, 0.5, 0.20000000298, 0.20000000298, 0.699999988079, 0.5, 0.600000023842, 0.40000000596, 0.600000023842, 0.899999976158, 0.699999988079, 0.699999988079, 0.600000023842, 0.20000000298, 0.800000011921, 0.800000011921, 0.40000000596, 0.10000000149, 0.600000023842, 0.699999988079, 0.40000000596, 0.600000023842, 0.300000011921, 0.300000011921, 0.899999976158, 0.699999988079, 0.20000000298, 0.20000000298, 0.800000011921, 0.600000023842, 0.699999988079, 0.5, 0.10000000149, 0.300000011921, 0.899999976158, 0.20000000298, 0.899999976158, 0.300000011921, 0.5, 0.300000011921, 0.10000000149, 0.600000023842, 0.600000023842, 0.300000011921, 0.600000023842, 0.699999988079, 0.20000000298, 0.300000011921, 0.800000011921, 0.800000011921, 0.600000023842, 0.5, 0.699999988079, 0.600000023842, 0.899999976158, 0.899999976158, 0.600000023842, 0.800000011921, 0.699999988079, 0.40000000596, 0.600000023842, 0.300000011921, 0.10000000149, 0.600000023842, 0.300000011921, 0.300000011921, 0.40000000596, 0.300000011921, 0.600000023842, 0.20000000298, 0.10000000149, 0.10000000149, 0.899999976158, 0.300000011921, 0.10000000149, 0.600000023842, 0.699999988079, 0.300000011921, 0.300000011921, 0.5, 0.10000000149, 0.699999988079, 0.40000000596, 0.600000023842, 0.800000011921, 0.10000000149, 0.300000011921, 0.600000023842, 0.40000000596, 0.10000000149, 0.699999988079, 0.600000023842, 0.600000023842, 0.5, 0.5, 0.699999988079, 0.5, 0.800000011921, 0.699999988079, 0.5, 0.699999988079, 0.10000000149, 0.40000000596, 0.40000000596, 0.40000000596, 0.20000000298, 0.600000023842, 0.699999988079, 0.5, 0.5, 0.20000000298, 0.600000023842, 0.300000011921, 0.800000011921, 0.699999988079, 0.600000023842, 0.600000023842, 0.800000011921, 0.20000000298, 0.40000000596, 0.800000011921, 0.800000011921, 0.5, 0.899999976158, 0.600000023842, 0.600000023842, 0.800000011921, 0.600000023842, 0.10000000149, 0.899999976158, 0.300000011921, 0.800000011921, 0.10000000149, 0.10000000149, 0.10000000149, 0.5, 0.600000023842, 0.10000000149, 0.300000011921, 0.600000023842, 0.600000023842, 0.699999988079, 0.10000000149, 0.899999976158, 0.5, 0.20000000298, 0.699999988079, 0.699999988079, 0.10000000149, 0.40000000596, 0.899999976158, 0.300000011921, 0.10000000149, 0.5, 0.699999988079, 0.800000011921, 0.300000011921, 0.699999988079, 0.5, 0.20000000298, 0.20000000298, 0.899999976158, 0.20000000298, 0.20000000298, 0.5, 0.899999976158, 0.20000000298, 0.20000000298, 0.899999976158, 0.800000011921, 0.10000000149, 0.699999988079, 0.699999988079, 0.5, 0.699999988079, 0.600000023842, 0.20000000298, 0.800000011921, 0.10000000149, 0.600000023842, 0.300000011921, 0.10000000149, 0.899999976158, 0.800000011921, 0.899999976158, 0.699999988079, 0.40000000596, 0.10000000149, 0.300000011921, 0.10000000149, 0.300000011921, 0.5, 0.800000011921, 0.10000000149, 0.5, 0.10000000149, 0.40000000596, 0.699999988079, 0.40000000596, 0.699999988079, 0.300000011921, 0.600000023842, 0.800000011921, 0.20000000298, 0.10000000149, 0.800000011921, 0.300000011921, 0.40000000596, 0.600000023842, 0.300000011921, 0.600000023842, 0.300000011921, 0.600000023842, 0.800000011921, 0.899999976158, 
+
+L3_cHER2K_o_H
+15.859999966, -5.55111512313e-16, 17.8500001632, 1.51999998197, 18.5300001, 1.91999987021, 16.4000000961, 0.510000042766, 16.0600000666, -2.25000000373, 16.7900001815, 1.56000006512, 16.8700002226, 1.97999996588, 16.9800000806, -2.21999998346, 14.8100001702, -1.24999989867, 18.5500001647, 2.48999998704, 15.9700000982, 3.18999999374, 15.0500002749, 1.75999997348, 16.1900002068, 1.30999995336, 17.5400001889, 0.110000080019, 16.0200000677, 1.52000006095, 17.610000042, 1.73999997959, 16.5500001557, 0.409999994338, 17.8500001632, -1.51999998197, 15.200000225, -6.66133814775e-16, 17.5800001186, 1.29999991804, 17.3500001654, -0.819999829978, 14.9700002174, -1.97000008926, 17.8000001989, 0.700000106543, 16.800000266, 0.470000004321, 18.3000000894, -1.96999984339, 13.5900002173, -0.969999910444, 18.9800002512, 1.03000004411, 15.7300000583, 0.64000004366, 15.6400002508, 1.25000000596, 14.8700002539, -0.4799998869, 18.0800001626, 0.340000028759, 14.5700001481, -0.469999976754, 17.4600001687, -0.160000004023, 16.4600002402, -2.60999979541, 18.5300001, -1.91999987021, 17.5800001186, -1.29999991804, 19.1600002104, 8.881784197e-16, 17.380000217, -1.45999976933, 16.4900001755, -2.0999999918, 18.0400001383, 0.25000019148, 18.0200002457, 0.620000099689, 17.4800001998, -2.729999796, 15.8500001676, -1.10999983266, 19.2500002876, 0.270000271797, 17.9500000998, 1.43000007465, 15.9700003172, 0.100000120699, 16.9200003143, -0.589999916255, 20.4300002296, -0.409999785721, 15.4200000893, 1.49999998435, 19.090000145, -0.47999988094, 17.7000002339, -2.479999796, 16.4000000961, -0.510000042766, 17.3500001654, 0.819999829978, 17.380000217, 1.45999976933, 16.9200001109, -5.55111512313e-17, 15.580000132, -0.980000166297, 17.8900001763, 1.77999991074, 17.070000166, 1.8499999404, 17.6900000183, -1.49999996498, 14.1200001809, 1.04999990612, 17.6600002909, 2.44999989197, 16.5600000547, 4.01999978378, 14.9600002193, 2.55999986768, 15.180000246, 1.17999992266, 16.9900002329, 0.989999990761, 14.6500001848, 1.29999990687, 17.2000002585, 0.139999867827, 17.2100001195, -0.349999937415, 16.0600000666, 2.25000000373, 14.9700002174, 1.97000008926, 16.4900001755, 2.0999999918, 15.580000132, 0.980000166297, 13.4600002134, -6.66133814775e-16, 16.8200001429, 3.33000012085, 15.8500002503, 2.80000004992, 17.0600000562, 0.770000109375, 12.5100002104, 1.01000003904, 17.8700002174, 3.84000012934, 14.5000000693, 3.75999998465, 13.2800002475, 4.22000001922, 14.350000257, 1.41999999389, 16.9900002858, 2.76000007108, 13.3000001416, 2.38000001207, 16.6600002253, 2.30000008419, 15.5100000837, 1.50000014529, 16.7900001815, -1.56000006512, 17.8000001989, -0.700000106543, 18.0400001383, -0.25000019148, 17.8900001763, -1.77999991074, 16.8200001429, -3.33000012085, 16.6800002602, 4.4408920985e-16, 17.7300002944, 0.489999949038, 18.6200001317, -2.20000006109, 15.100000196, -1.20999995634, 19.1200002353, 0.919999985695, 16.5500000782, 1.46999992609, 15.8800002669, 0.809999952614, 17.3900001815, 0.089999987781, 19.2000002086, -1.38999996692, 15.2100001307, 0.819999958873, 17.8300001685, -2.30999999061, 16.980000249, -1.5600000219, 16.8700002226, -1.97999996588, 16.800000266, -0.470000004321, 18.0200002457, -0.620000099689, 17.070000166, -1.8499999404, 15.8500002503, -2.80000004992, 17.7300002944, -0.489999949038, 17.6000003487, 4.4408920985e-16, 18.4900001748, -2.31999989405, 14.8100002372, -0.959999985397, 18.9600003318, 0.60000006333, 16.5800001894, 2.62999990925, 15.5600003102, 0.910000057667, 16.4000002958, 0.139999992996, 18.7500002705, 0.070000037849, 15.4200001466, 1.23999991998, 19.6800001723, 0.0599999846518, 17.4100002462, -1.23999992147, 16.9800000806, 2.21999998346, 18.3000000894, 1.96999984339, 17.4800001998, 2.729999796, 17.6900000183, 1.49999996498, 17.0600000562, -0.770000109375, 18.6200001317, 2.20000006109, 18.4900001748, 2.31999989405, 16.9200000438, 5.55111512313e-16, 14.0200001496, 0.969999976009, 18.9700001474, 4.84999995083, 17.4500001125, 5.56999986202, 15.7600002193, 3.82999999866, 16.2700001884, 1.7899999699, 18.5600001106, 4.19999999255, 14.3800001097, 2.45999992803, 19.2600000964, 1.78999991179, 17.3900002106, 1.03000002697, 14.8100001702, 1.24999989867, 13.5900002173, 0.969999910444, 15.8500001676, 1.10999983266, 14.1200001809, -1.04999990612, 12.5100002104, -1.01000003904, 15.100000196, 1.20999995634, 14.8100002372, 0.959999985397, 14.0200001496, -0.969999976009, 12.6600002044, -4.4408920985e-16, 16.7100001724, 2.42999994949, 14.2800001104, 3.22999992639, 13.2100002469, 1.72000000432, 13.550000225, 0.789999952763, 15.6000003055, 1.79000000268, 12.8700001645, 2.18999997213, 15.1400002038, 0.580000056028, 15.5500001729, 0.420000021458, 18.5500001647, -2.48999998704, 18.9800002512, -1.03000004411, 19.2500002876, -0.270000271797, 17.6600002909, -2.44999989197, 17.8700002174, -3.84000012934, 19.1200002353, -0.919999985695, 18.9600003318, -0.60000006333, 18.9700001474, -4.84999995083, 16.7100001724, -2.42999994949, 20.8600003326, 1.22124532709e-15, 18.9200000393, 1.76999993727, 18.3700002867, 1.07000003189, 17.1700002919, -1.37000004157, 20.5400002672, -0.450000008196, 16.150000117, 0.399999909103, 18.9900001748, -1.1300000605, 18.2800002527, -2.08999992818, 15.9700000982, -3.18999999374, 15.7300000583, -0.64000004366, 17.9500000998, -1.43000007465, 16.5600000547, -4.01999978378, 14.5000000693, -3.75999998465, 16.5500000782, -1.46999992609, 16.5800001894, -2.62999990925, 17.4500001125, -5.56999986202, 14.2800001104, -3.22999992639, 18.9200000393, -1.76999993727, 16.4400000206, -2.22044604925e-16, 15.3500002496, -1.20999992579, 15.7200001571, -2.02999998674, 18.2600000942, -1.56999985009, 14.6000001311, -0.410000036061, 17.0500001088, -3.27999988765, 15.7000002146, -2.85999994516, 15.0500002749, -1.75999997348, 15.6400002508, -1.25000000596, 15.9700003172, -0.100000120699, 14.9600002193, -2.55999986768, 13.2800002475, -4.22000001922, 15.8800002669, -0.809999952614, 15.5600003102, -0.910000057667, 15.7600002193, -3.82999999866, 13.2100002469, -1.72000000432, 18.3700002867, -1.07000003189, 15.3500002496, 1.20999992579, 13.3600003415, 4.4408920985e-16, 15.5900003238, -0.740000070482, 16.2300003354, -1.44999987185, 13.1600002357, 0.509999969006, 16.1100002395, -1.86000002936, 15.5900003253, -1.20999999359, 16.1900002068, -1.30999995336, 14.8700002539, 0.4799998869, 16.9200003143, 0.589999916255, 15.180000246, -1.17999992266, 14.350000257, -1.41999999389, 17.3900001815, -0.089999987781, 16.4000002958, -0.139999992996, 16.2700001884, -1.7899999699, 13.550000225, -0.789999952763, 17.1700002919, 1.37000004157, 15.7200001571, 2.02999998674, 15.5900003238, 0.740000070482, 14.340000326, -4.4408920985e-16, 18.1500001892, 2.36000006065, 13.9700002539, 2.08999995574, 17.3200002353, -0.0600000487268, 15.8200002651, -0.21999991864, 17.5400001889, -0.110000080019, 18.0800001626, -0.340000028759, 20.4300002296, 0.409999785721, 16.9900002329, -0.989999990761, 16.9900002858, -2.76000007108, 19.2000002086, 1.38999996692, 18.7500002705, -0.070000037849, 18.5600001106, -4.19999999255, 15.6000003055, -1.79000000268, 20.5400002672, 0.450000008196, 18.2600000942, 1.56999985009, 16.2300003354, 1.44999987185, 18.1500001892, -2.36000006065, 17.8400002933, 0.0, 16.8000001617, 1.41999987096, 18.8500002451, -1.4100000003, 18.3500001989, -1.07000002071, 16.0200000677, -1.52000006095, 14.5700001481, 0.469999976754, 15.4200000893, -1.49999998435, 14.6500001848, -1.29999990687, 13.3000001416, -2.38000001207, 15.2100001307, -0.819999958873, 15.4200001466, -1.23999991998, 14.3800001097, -2.45999992803, 12.8700001645, -2.18999997213, 16.150000117, -0.399999909103, 14.6000001311, 0.410000036061, 13.1600002357, -0.509999969006, 13.9700002539, -2.08999995574, 16.8000001617, -1.41999987096, 12.6800001454, 4.4408920985e-16, 15.5700001809, -1.70999992356, 14.1200001392, -1.79999990985, 17.610000042, -1.73999997959, 17.4600001687, 0.160000004023, 19.090000145, 0.47999988094, 17.2000002585, -0.139999867827, 16.6600002253, -2.30000008419, 17.8300001685, 2.30999999061, 19.6800001723, -0.0599999846518, 19.2600000964, -1.78999991179, 15.1400002038, -0.580000056028, 18.9900001748, 1.1300000605, 17.0500001088, 3.27999988765, 16.1100002395, 1.86000002936, 17.3200002353, 0.0600000487268, 18.8500002451, 1.4100000003, 15.5700001809, 1.70999992356, 19.5400002366, 1.33226762955e-15, 17.0800002043, -1.17999990031, 16.5500001557, -0.409999994338, 16.4600002402, 2.60999979541, 17.7000002339, 2.479999796, 17.2100001195, 0.349999937415, 15.5100000837, -1.50000014529, 16.980000249, 1.5600000219, 17.4100002462, 1.23999992147, 17.3900002106, -1.03000002697, 15.5500001729, -0.420000021458, 18.2800002527, 2.08999992818, 15.7000002146, 2.85999994516, 15.5900003253, 1.20999999359, 15.8200002651, 0.21999991864, 18.3500001989, 1.07000002071, 14.1200001392, 1.79999990985, 17.0800002043, 1.17999990031, 16.0200002554, 8.881784197e-16, 
+
+L3_zHER2K_A_nk
+0.1, 0.6, 0.1, 0.8, 0.8, 0.1, 0.9, 0.2, 0.1, 0.2, 0.4, 0.7, 0.6, 0.5, 0.6, 0.5, 0.6, 0.4, 0.3, 0.1, 0.1, 0.7, 0.4, 0.5, 0.7, 0.7, 0.6, 0.5, 0.5, 0.3, 0.7, 0.3, 0.8, 0.7, 0.8, 0.8, 0.3, 0.2, 0.8, 0.5, 0.5, 0.1, 0.5, 0.9, 0.2, 0.8, 0.2, 0.4, 0.7, 0.5, 0.8, 0.5, 0.3, 0.4, 0.7, 0.2, 0.4, 0.3, 0.6, 0.5, 0.3, 0.8, 0.1, 0.1, 0.3, 0.9, 0.3, 0.4, 0.1, 0.8, 0.2, 0.5, 0.2, 0.3, 0.1, 0.8, 0.4, 0.2, 0.8, 0.8, 0.8, 0.1, 0.6, 0.4, 0.6, 0.5, 0.1, 0.1, 0.3, 0.8, 0.7, 0.9, 0.9, 0.6, 0.9, 0.5, 0.7, 0.3, 0.7, 0.8, 0.7, 0.3, 0.1, 0.8, 0.7, 0.2, 0.9, 0.5, 0.5, 0.3, 0.1, 0.8, 0.2, 0.6, 0.3, 0.7, 0.2, 0.5, 0.1, 0.7, 0.9, 0.3, 0.1, 0.9, 0.4, 0.7, 0.9, 0.9, 0.5, 0.7, 0.6, 0.2, 0.1, 0.2, 0.4, 0.8, 0.2, 0.7, 0.3, 0.5, 0.6, 0.8, 0.2, 0.6, 0.7, 0.2, 0.1, 0.4, 0.5, 0.7, 0.2, 0.1, 0.8, 0.1, 0.3, 0.5, 0.5, 0.2, 0.7, 0.5, 0.1, 0.5, 0.4, 0.9, 0.1, 0.5, 0.3, 0.4, 0.3, 0.9, 0.8, 0.5, 0.7, 0.4, 0.2, 0.3, 0.4, 0.9, 0.7, 0.8, 0.3, 0.7, 0.8, 0.8, 0.1, 0.9, 0.1, 0.4, 0.8, 0.2, 0.8, 0.6, 0.4, 0.8, 0.5, 0.1, 0.3, 0.7, 0.3, 0.4, 0.4, 0.2, 0.3, 0.6, 0.2, 0.4, 0.9, 0.6, 0.6, 0.4, 0.3, 0.7, 0.3, 0.6, 0.7, 0.6, 0.1, 0.4, 0.1, 0.9, 0.3, 0.2, 0.3, 0.3, 0.2, 0.4, 0.7, 0.2, 0.2, 0.9, 0.8, 0.7, 0.1, 0.6, 0.7, 0.7, 0.1, 0.7, 0.7, 0.4, 0.3, 0.3, 0.8, 0.5, 0.7, 0.4, 0.4, 0.7, 0.8, 0.4, 0.2, 0.5, 0.9, 0.8, 0.6, 0.8, 0.9, 0.1, 0.5, 0.2, 0.7, 0.7, 0.1, 0.3, 0.7, 0.2, 0.8, 0.3, 0.8, 0.8, 0.5, 0.7, 0.6, 0.8, 0.5, 0.4, 0.5, 0.2, 0.4, 0.3, 0.1, 0.3, 0.7, 0.2, 0.2, 0.6, 0.6, 0.3, 0.4, 0.2, 0.8, 0.3, 0.2, 0.3, 0.3, 0.8, 0.6, 0.3, 0.9, 0.4, 0.3, 0.9, 0.6, 0.7, 0.4, 0.9, 0.2, 0.2, 0.4, 0.5, 0.2, 0.3, 0.9, 0.7, 0.2, 0.7, 0.5, 0.5, 0.6, 0.6, 0.3, 0.7, 0.4, 0.1, 0.9, 0.1, 0.9, 0.7, 0.9, 0.2, 0.1, 0.3, 0.4, 0.7, 0.9, 0.1, 0.5, 0.1, 0.3, 0.4, 0.9, 0.2, 0.4, 0.7, 0.5, 0.9, 0.3, 0.1, 0.6, 0.2, 0.9, 0.3, 0.8, 0.9, 0.7, 0.2, 0.7, 0.7, 0.8, 0.6, 0.8, 0.1, 0.2, 0.6, 0.4, 0.2, 0.7, 0.6, 0.3, 0.7, 0.9, 0.6, 0.6, 0.9, 0.4, 0.5, 0.6, 0.3, 0.1, 0.7, 0.5, 0.3, 0.3, 0.3, 0.7, 0.5, 0.4, 0.4, 0.7, 0.7, 0.3, 0.1, 0.2, 0.1, 0.4, 0.7, 0.5, 0.8, 0.7, 0.5, 0.6, 0.5, 0.8, 0.5, 0.9, 0.7, 0.6, 0.1, 0.3, 0.7, 0.4, 0.9, 0.8, 0.5, 0.7, 0.6, 0.8, 0.3, 0.9, 0.1, 0.5, 0.3, 0.2, 0.7, 0.5, 0.7, 0.6, 0.4, 0.6, 0.5, 0.7, 0.4, 0.9, 0.4, 0.8, 0.5, 0.3, 0.4, 0.7, 0.2, 0.1, 0.6, 0.4, 0.8, 0.8, 0.7, 0.8, 0.6, 0.5, 0.2, 0.9, 0.9, 0.4, 0.7, 0.5, 0.3, 0.4, 0.5, 0.8, 0.2, 0.3, 0.1, 0.6, 0.5, 0.1, 0.9, 0.6, 0.8, 0.6, 0.4, 0.2, 0.5, 0.4, 0.1, 0.6, 0.4, 0.5, 0.8, 0.5, 0.3, 0.7, 0.4, 0.3, 0.8, 0.2, 0.5, 0.6, 0.4, 0.9, 0.2, 0.6, 0.6, 0.2, 0.3, 0.3, 0.9, 0.4, 0.4, 0.2, 0.1, 0.7, 0.1, 0.8, 0.6, 0.6, 0.4, 0.9, 0.7, 0.8, 0.5, 0.7, 0.1, 0.3, 0.4, 0.4, 0.7, 0.9, 0.6, 0.4, 0.3, 0.4, 0.1, 0.8, 0.1, 0.8, 0.8, 0.7, 0.7, 0.1, 0.6, 0.4, 0.8, 0.2, 0.8, 0.9, 0.9, 0.6, 0.9, 0.6, 0.3, 0.6, 0.9, 0.1, 0.5, 
+
+L3_zHER2K_B_nk
+0.1, 0.1, 0.2, 0.5, 0.9, 0.3, 0.7, 0.2, 0.1, 0.8, 0.1, 0.7, 0.1, 0.5, 0.9, 0.8, 0.7, 0.8, 0.5, 0.9, 0.6, 0.9, 0.8, 0.5, 0.8, 0.8, 0.3, 0.6, 0.6, 0.4, 0.9, 0.9, 0.7, 0.6, 0.9, 0.3, 0.6, 0.3, 0.5, 0.7, 0.9, 0.9, 0.2, 0.9, 0.6, 0.8, 0.6, 0.5, 0.7, 0.5, 0.2, 0.5, 0.1, 0.1, 0.2, 0.1, 0.1, 0.3, 0.7, 0.5, 0.4, 0.4, 0.1, 0.2, 0.3, 0.1, 0.2, 0.1, 0.1, 0.3, 0.8, 0.2, 0.5, 0.7, 0.9, 0.5, 0.4, 0.4, 0.9, 0.1, 0.1, 0.4, 0.4, 0.6, 0.9, 0.3, 0.7, 0.6, 0.2, 0.7, 0.4, 0.7, 0.7, 0.1, 0.9, 0.5, 0.6, 0.6, 0.4, 0.7, 0.1, 0.1, 0.1, 0.1, 0.9, 0.7, 0.8, 0.1, 0.3, 0.4, 0.1, 0.9, 0.2, 0.5, 0.2, 0.4, 0.1, 0.1, 0.4, 0.2, 0.6, 0.1, 0.7, 0.9, 0.9, 0.7, 0.6, 0.7, 0.4, 0.5, 0.8, 0.7, 0.4, 0.1, 0.1, 0.8, 0.2, 0.7, 0.5, 0.4, 0.1, 0.4, 0.3, 0.5, 0.5, 0.3, 0.7, 0.2, 0.7, 0.7, 0.1, 0.2, 0.8, 0.6, 0.3, 0.4, 0.8, 0.8, 0.3, 0.8, 0.9, 0.6, 0.4, 0.7, 0.7, 0.7, 0.7, 0.5, 0.4, 0.7, 0.1, 0.8, 0.3, 0.2, 0.6, 0.4, 0.7, 0.2, 0.7, 0.8, 0.7, 0.8, 0.6, 0.2, 0.8, 0.6, 0.3, 0.3, 0.9, 0.2, 0.4, 0.2, 0.8, 0.8, 0.4, 0.6, 0.3, 0.7, 0.2, 0.4, 0.5, 0.4, 0.4, 0.7, 0.5, 0.6, 0.2, 0.6, 0.3, 0.5, 0.2, 0.9, 0.8, 0.9, 0.4, 0.7, 0.6, 0.8, 0.7, 0.1, 0.7, 0.3, 0.8, 0.1, 0.1, 0.7, 0.2, 0.9, 0.5, 0.6, 0.1, 0.3, 0.1, 0.6, 0.9, 0.3, 0.9, 0.4, 0.5, 0.2, 0.3, 0.9, 0.4, 0.3, 0.1, 0.7, 0.4, 0.8, 0.9, 0.7, 0.3, 0.5, 0.9, 0.5, 0.3, 0.1, 0.7, 0.6, 0.6, 0.8, 0.7, 0.9, 0.8, 0.5, 0.4, 0.7, 0.7, 0.2, 0.1, 0.8, 0.9, 0.7, 0.1, 0.8, 0.9, 0.1, 0.7, 0.3, 0.3, 0.4, 0.6, 0.5, 0.4, 0.9, 0.5, 0.1, 0.8, 0.1, 0.9, 0.6, 0.9, 0.9, 0.3, 0.1, 0.1, 0.8, 0.3, 0.9, 0.1, 0.8, 0.9, 0.1, 0.5, 0.5, 0.6, 0.9, 0.7, 0.2, 0.3, 0.5, 0.1, 0.5, 0.9, 0.2, 0.5, 0.9, 0.4, 0.9, 0.3, 0.4, 0.5, 0.7, 0.2, 0.6, 0.7, 0.3, 0.9, 0.4, 0.7, 0.1, 0.3, 0.2, 0.2, 0.6, 0.8, 0.8, 0.7, 0.3, 0.3, 0.9, 0.5, 0.4, 0.1, 0.8, 0.1, 0.7, 0.6, 0.3, 0.5, 0.6, 0.3, 0.4, 0.8, 0.9, 0.2, 0.7, 0.9, 0.2, 0.8, 0.3, 0.2, 0.8, 0.5, 0.5, 0.8, 0.6, 0.2, 0.4, 0.2, 0.1, 0.6, 0.8, 0.3, 0.1, 0.4, 0.4, 0.2, 0.6, 0.2, 0.8, 0.3, 0.2, 0.2, 0.2, 0.5, 0.6, 0.8, 0.7, 0.1, 0.2, 0.1, 0.8, 0.2, 0.1, 0.6, 0.7, 0.8, 0.6, 0.2, 0.5, 0.6, 0.3, 0.8, 0.3, 0.2, 0.4, 0.5, 0.2, 0.4, 0.2, 0.2, 0.7, 0.7, 0.2, 0.9, 0.8, 0.4, 0.8, 0.2, 0.2, 0.1, 0.7, 0.8, 0.5, 0.3, 0.6, 0.9, 0.4, 0.5, 0.9, 0.3, 0.8, 0.8, 0.3, 0.8, 0.5, 0.7, 0.1, 0.4, 0.5, 0.3, 0.2, 0.5, 0.9, 0.4, 0.2, 0.8, 0.9, 0.8, 0.8, 0.9, 0.2, 0.4, 0.9, 0.3, 0.6, 0.8, 0.9, 0.3, 0.5, 0.7, 0.4, 0.8, 0.3, 0.2, 0.1, 0.6, 0.9, 0.2, 0.2, 0.6, 0.7, 0.6, 0.3, 0.2, 0.6, 0.7, 0.8, 0.4, 0.1, 0.9, 0.2, 0.6, 0.4, 0.1, 0.4, 0.2, 0.7, 0.6, 0.3, 0.6, 0.2, 0.6, 0.5, 0.8, 0.6, 0.8, 0.4, 0.4, 0.7, 0.6, 0.6, 0.2, 0.1, 0.2, 0.2, 0.2, 0.2, 0.4, 0.6, 0.8, 0.4, 0.9, 0.5, 0.9, 0.2, 0.3, 0.3, 0.6, 0.1, 0.4, 0.4, 0.8, 0.9, 0.2, 0.8, 0.9, 0.2, 0.5, 0.3, 0.9, 0.5, 0.4, 0.6, 0.2, 0.9, 0.3, 0.6, 0.2, 0.7, 0.3, 0.6, 0.9, 0.9, 
+
+L3_zHER2K_C_nn
+0.4, 0.0, 0.7, 0.8, 0.5, 0.3, 0.8, 0.2, 0.8, 0.7, 0.2, 0.2, 0.3, 0.8, 0.7, 0.3, 0.6, 0.9, 0.8, 0.3, 0.7, 0.9, 0.1, 0.2, 0.1, 0.4, 0.3, 0.1, 0.3, 0.3, 0.4, 0.1, 0.8, 0.1, 0.7, -0.8, 0.1, 0.0, 0.1, 0.6, 0.6, 0.9, 0.4, 0.8, 0.5, 0.1, 0.2, 0.8, 0.6, 0.4, 0.6, 0.2, 0.4, 0.7, 0.8, 0.3, 0.2, 0.7, 0.2, 0.9, 0.3, 0.9, 0.4, 0.8, 0.5, 0.3, 0.8, 0.3, 0.5, -0.3, 0.1, -0.6, 0.4, 0.0, 0.9, 0.4, 0.3, 0.8, 0.5, 0.2, 0.5, 0.5, 0.4, 0.4, 0.8, 0.6, 0.4, 0.9, 0.6, 0.6, 0.1, 0.3, 0.9, 0.2, 0.3, 0.6, 0.1, 0.7, 0.7, 0.3, 0.2, 0.7, 0.8, -0.2, 0.6, -0.9, 0.9, -0.4, 0.2, 0.0, 0.6, 0.2, 0.7, 0.4, 0.8, 0.1, 0.8, 0.7, 0.2, 0.1, 0.9, 0.7, 0.4, 0.2, 0.4, 0.3, 0.5, 0.5, 0.4, 0.3, 0.3, 0.5, 0.2, 0.3, 0.4, 0.7, 0.8, -0.7, 0.4, -0.8, 0.3, -0.8, 0.6, -0.2, 0.6, 0.0, 0.2, 0.9, 0.6, 0.1, 0.7, 0.4, 0.7, 0.4, 0.3, 0.8, 0.3, 0.6, 0.1, 0.8, 0.1, 0.4, 0.9, 0.7, 0.2, 0.2, 0.1, 0.6, 0.7, 0.4, 0.2, -0.2, 0.5, -0.1, 0.5, -0.2, 0.7, -0.4, 0.2, -0.9, 0.1, 0.0, 0.3, 0.2, 0.7, 0.9, 0.9, 0.5, 0.3, 0.6, 0.2, 0.1, 0.1, 0.2, 0.4, 0.1, 0.5, 0.4, 0.2, 0.2, 0.6, 0.8, 0.2, 0.7, 0.3, -0.8, 0.2, -0.8, 0.5, -0.5, 0.8, -0.1, 0.6, -0.1, 0.3, -0.2, 0.5, 0.0, 0.4, 0.7, 0.6, 0.4, 0.9, 0.4, 0.7, 0.6, 0.2, 0.4, 0.4, 0.9, 0.3, 0.7, 0.1, 0.2, 0.1, 0.8, 0.3, 0.4, 0.7, -0.3, 0.6, -0.4, 0.4, -0.4, 0.8, -0.7, 0.7, -0.4, 0.7, -0.9, 0.4, -0.7, 0.6, 0.0, 0.2, 0.8, 0.2, 0.2, 0.2, 0.1, 0.1, 0.4, 0.2, 0.9, 0.8, 0.1, 0.9, 0.5, 0.6, 0.4, 0.1, 0.3, 0.6, -0.9, 0.6, -0.2, 0.8, -0.6, 0.2, -0.1, 0.7, -0.4, 0.9, -0.5, 0.6, -0.4, 0.2, -0.8, 0.1, 0.0, 0.5, 0.7, 0.2, 0.2, 0.1, 0.5, 0.8, 0.6, 0.6, 0.6, 0.5, 0.2, 0.5, 0.3, 0.2, 0.1, 0.8, -0.3, 0.4, -0.7, 0.4, -0.9, 0.9, -0.7, 0.3, -0.8, 0.3, -0.6, 0.9, -0.4, 0.2, -0.2, 0.5, -0.7, 0.8, 0.0, 0.9, 0.1, 0.1, 0.1, 0.5, 0.7, 0.9, 0.4, 0.5, 0.9, 0.6, 0.6, 0.4, 0.1, 0.7, -0.9, 0.8, -0.3, 0.6, -0.6, 0.4, -0.2, 0.3, -0.6, 0.2, -0.1, 0.7, -0.6, 0.2, -0.1, 0.2, -0.2, 0.9, -0.1, 0.8, 0.0, 0.8, 0.4, 0.2, 0.6, 0.4, 0.8, 0.1, 0.9, 0.1, 0.6, 0.9, 0.1, 0.1, -0.2, 0.2, -0.7, 0.1, -0.3, 0.4, -0.3, 0.1, -0.8, 0.1, -0.2, 0.2, -0.4, 0.1, -0.4, 0.1, -0.5, 0.1, -0.1, 0.8, -0.4, 0.2, 0.0, 0.5, 0.7, 0.5, 0.9, 0.2, 0.4, 0.2, 0.1, 0.3, 0.2, 0.1, -0.4, 0.2, -0.9, 0.9, -0.2, 0.5, -0.5, 0.1, -0.4, 0.4, -0.1, 0.4, -0.9, 0.2, -0.9, 0.8, -0.6, 0.5, -0.7, 0.2, -0.6, 0.5, -0.7, 0.6, 0.0, 0.9, 0.5, 0.2, 0.3, 0.3, 0.2, 0.3, 0.4, 0.3, -0.1, 0.3, -0.9, 0.3, -0.6, 0.4, -0.3, 0.9, -0.7, 0.5, -0.4, 0.3, -0.7, 0.8, -0.1, 0.6, -0.6, 0.9, -0.4, 0.4, -0.8, 0.5, -0.9, 0.9, -0.5, 0.4, 0.0, 0.4, 0.1, 0.3, 0.1, 0.3, 0.2, 0.3, -0.3, 0.4, -0.8, 0.1, -0.7, 0.3, -0.5, 0.2, -0.2, 0.2, -0.2, 0.1, -0.2, 0.9, -0.5, 0.5, -0.2, 0.5, -0.9, 0.1, -0.9, 0.2, -0.4, 0.2, -0.3, 0.4, -0.1, 0.2, 0.0, 0.5, 0.7, 0.6, 0.4, 0.4, -0.1, 0.5, -0.3, 0.7, -0.3, 0.2, -0.3, 0.1, -0.6, 0.6, -0.8, 0.1, -0.8, 0.6, -0.4, 0.5, -0.3, 0.6, -0.6, 0.1, -0.6, 0.2, -0.1, 0.3, -0.2, 0.3, -0.1, 0.5, -0.7, 0.9, 0.0, 0.6, 0.7, 0.8, -0.1, 0.8, -0.3, 0.2, -0.7, 0.4, -0.7, 0.7, -0.4, 0.2, -0.7, 0.3, -0.4, 0.1, -0.3, 0.2, -0.1, 0.4, -0.1, 0.9, -0.1, 0.3, -0.2, 0.3, -0.4, 0.3, -0.2, 0.6, -0.4, 0.6, -0.7, 0.7, 0.0, 
+
+L3_zHER2K_o_N
+18.44, -1.99840144433e-15, 15.34, 1.79, 16.34, 1.52, 16.2, -0.34, 15.27, 1.29, 17.95, 0.27, 16.05, 0.21, 18.46, 0.28, 16.46, 2.3, 17.33, 0.38, 16.83, 2.79, 16.43, 0.54, 17.2, 1.65, 17.27, 1.25, 15.48, 1.04, 14.74, 2.46, 18.63, -0.7, 15.34, -1.79, 16.32, -5.55111512313e-16, 13.95, 0.64, 15.09, 0.43, 14.89, 0.06, 16.18, -1.01, 15.09, -1.01, 15.16, -0.88, 16.69, 1.5, 16.7, -0.41, 15.71, 1.36, 15.69, 0.49, 15.65, 1.44, 17.03, 2.03, 15.65, 0.43, 14.97, 1.73, 17.06, 0.82, 16.34, -1.52, 13.95, -0.64, 15.06, -4.4408920985e-16, 15.26, -1.89, 14.26, -0.88, 17.82, 0.33, 15.79, -0.76, 16.36, -1.3, 16.25, 2.89, 16.41, -0.7, 16.15, 1.35, 14.42, -0.2, 17.16, -0.48, 17.31, 0.15, 15.65, 1.26, 15.74, 1.32, 16.72, 0.25, 16.2, 0.34, 15.09, -0.43, 15.26, 1.89, 17.34, 1.11022302463e-16, 15.49, 0.26, 16.47, 0.37, 15.36, -0.06, 16.42, -0.1, 16.12, 3.67, 18.13, 0.98, 13.87, 2.64, 14.77, 0.8, 16.55, 2.06, 16.93, 2.59, 16.43, 2.03, 16.27, 3.33, 17.43, 1.51, 15.27, -1.29, 14.89, -0.06, 14.26, 0.88, 15.49, -0.26, 14.86, 4.4408920985e-16, 15.62, 0.8, 14.19, -0.33, 15.85, 0.33, 14.56, 2.53, 16.26, 1.11, 13.31, 3.68, 14.13, 2.13, 15.6, 0.81, 17.18, 2.88, 14.94, 1.71, 14.07, 3.75, 16.08, 0.02, 17.95, -0.27, 16.18, 1.01, 17.82, -0.33, 16.47, -0.37, 15.62, -0.8, 17.58, 0.0, 17.02, -0.72, 19.08, 0.57, 17.18, 3.7, 16.55, 0.86, 16.06, 1.56, 17.53, 0.79, 18.27, 1.44, 18.34, 1.95, 16.79, 1.58, 16.34, 3.13, 18.05, -0.18, 16.05, -0.21, 15.09, 1.01, 15.79, 0.76, 15.36, 0.06, 14.19, 0.33, 17.02, 0.72, 15.2, 1.44328993201e-15, 15.61, 1.14, 16.28, 4.0, 16.06, 0.86, 15.86, 3.2, 15.54, 2.84, 16.14, 2.65, 16.3, 3.17, 16.12, 2.29, 15.24, 3.61, 17.68, 2.0, 18.46, -0.28, 15.16, 0.88, 16.36, 1.3, 16.42, 0.1, 15.85, -0.33, 19.08, -0.57, 15.61, -1.14, 17.08, 4.4408920985e-16, 16.87, 3.8, 16.8, -0.61, 14.8, 1.67, 15.15, 2.59, 16.5, 1.92, 18.15, 2.89, 18.06, 2.19, 15.69, 2.45, 19.65, 0.46, 16.46, -2.3, 16.69, -1.5, 16.25, -2.89, 16.12, -3.67, 14.56, -2.53, 17.18, -3.7, 16.28, -4.0, 16.87, -3.8, 16.86, 3.10862446895e-15, 17.31, -1.66, 15.91, 0.89, 16.41, -1.4, 17.57, -0.75, 17.8, -0.73, 17.38, -1.33, 17.26, 0.68, 17.62, -2.23, 17.33, -0.38, 16.7, 0.41, 16.41, 0.7, 18.13, -0.98, 16.26, -1.11, 16.55, -0.86, 16.06, -0.86, 16.8, 0.61, 17.31, 1.66, 18.04, -2.22044604925e-16, 14.99, 2.53, 15.6, 0.83, 17.07, 1.47, 18.65, 3.49, 17.04, 2.6, 16.46, 4.19, 17.81, -0.41, 16.83, -2.79, 15.71, -1.36, 16.15, -1.35, 13.87, -2.64, 13.31, -3.68, 16.06, -1.56, 15.86, -3.2, 14.8, -1.67, 15.91, -0.89, 14.99, -2.53, 17.26, -8.881784197e-16, 16.11, 0.18, 14.96, 0.63, 15.98, 0.21, 15.56, -0.21, 14.72, 0.03, 18.27, -0.91, 16.43, -0.54, 15.69, -0.49, 14.42, 0.2, 14.77, -0.8, 14.13, -2.13, 17.53, -0.79, 15.54, -2.84, 15.15, -2.59, 16.41, 1.4, 15.6, -0.83, 16.11, -0.18, 15.74, 4.4408920985e-16, 16.15, 0.77, 16.72, 2.33, 16.3, 0.31, 14.77, 1.83, 17.65, 0.87, 17.2, -1.65, 15.65, -1.44, 17.16, 0.48, 16.55, -2.06, 15.6, -0.81, 18.27, -1.44, 16.14, -2.65, 16.5, -1.92, 17.57, 0.75, 17.07, -1.47, 14.96, -0.63, 16.15, -0.77, 17.48, -4.4408920985e-16, 18.95, 1.04, 15.84, -0.05, 15.65, 1.37, 17.68, -1.39, 17.27, -1.25, 17.03, -2.03, 17.31, -0.15, 16.93, -2.59, 17.18, -2.88, 18.34, -1.95, 16.3, -3.17, 18.15, -2.89, 17.8, 0.73, 18.65, -3.49, 15.98, -0.21, 16.72, -2.33, 18.95, -1.04, 18.7, -4.4408920985e-16, 17.61, -0.65, 17.25, 1.3, 18.51, -1.05, 15.48, -1.04, 15.65, -0.43, 15.65, -1.26, 16.43, -2.03, 14.94, -1.71, 16.79, -1.58, 16.12, -2.29, 18.06, -2.19, 17.38, 1.33, 17.04, -2.6, 15.56, 0.21, 16.3, -0.31, 15.84, 0.05, 17.61, 0.65, 16.94, -2.37310171514e-15, 16.0, 2.04, 18.1, 0.03, 14.74, -2.46, 14.97, -1.73, 15.74, -1.32, 16.27, -3.33, 14.07, -3.75, 16.34, -3.13, 15.24, -3.61, 15.69, -2.45, 17.26, -0.68, 16.46, -4.19, 14.72, -0.03, 14.77, -1.83, 15.65, -1.37, 17.25, -1.3, 16.0, -2.04, 14.96, -6.93889390391e-16, 16.17, -1.95, 18.63, 0.7, 17.06, -0.82, 16.72, -0.25, 17.43, -1.51, 16.08, -0.02, 18.05, 0.18, 17.68, -2.0, 19.65, -0.46, 17.62, 2.23, 17.81, 0.41, 18.27, 0.91, 17.65, -0.87, 17.68, 1.39, 18.51, 1.05, 18.1, -0.03, 16.17, 1.95, 18.78, 2.38697950294e-15, 
+
+L3_zHER2K_A_kn
+0.8, 0.9, 0.5, 0.5, 0.9, 0.3, 0.6, 0.8, 0.5, 0.5, 0.2, 0.7, 0.8, 0.3, 0.8, 0.1, 0.4, 0.5, 0.4, 0.8, 0.4, 0.3, 0.5, 0.8, 0.9, 0.2, 0.8, 0.2, 0.6, 0.4, 0.3, 0.2, 0.8, 0.3, 0.8, 0.1, 0.5, 0.1, 0.3, 0.5, 0.6, 0.6, 0.9, 0.4, 0.2, 0.4, 0.1, 0.6, 0.3, 0.9, 0.5, 0.6, 0.6, 0.7, 0.1, 0.6, 0.7, 0.6, 0.2, 0.5, 0.2, 0.6, 0.1, 0.1, 0.7, 0.9, 0.4, 0.8, 0.5, 0.5, 0.8, 0.4, 0.5, 0.9, 0.5, 0.6, 0.4, 0.2, 0.1, 0.6, 0.6, 0.5, 0.6, 0.3, 0.5, 0.9, 0.6, 0.4, 0.1, 0.4, 0.7, 0.5, 0.6, 0.3, 0.4, 0.5, 0.3, 0.5, 0.1, 0.3, 0.9, 0.1, 0.7, 0.1, 0.5, 0.5, 0.4, 0.5, 0.8, 0.6, 0.1, 0.3, 0.7, 0.5, 0.5, 0.3, 0.2, 0.6, 0.7, 0.5, 0.1, 0.3, 0.1, 0.9, 0.5, 0.3, 0.5, 0.4, 0.2, 0.3, 0.2, 0.1, 0.5, 0.2, 0.4, 0.8, 0.6, 0.3, 0.7, 0.8, 0.2, 0.7, 0.6, 0.4, 0.1, 0.8, 0.6, 0.7, 0.8, 0.6, 0.3, 0.9, 0.9, 0.6, 0.5, 0.5, 0.4, 0.2, 0.3, 0.8, 0.5, 0.6, 0.1, 0.1, 0.9, 0.7, 0.5, 0.9, 0.7, 0.3, 0.7, 0.5, 0.7, 0.2, 0.8, 0.5, 0.6, 0.6, 0.1, 0.5, 0.5, 0.6, 0.6, 0.5, 0.9, 0.9, 0.2, 0.1, 0.6, 0.8, 0.8, 0.8, 0.8, 0.8, 0.1, 0.3, 0.5, 0.2, 0.1, 0.8, 0.7, 0.1, 0.6, 0.8, 0.2, 0.4, 0.2, 0.2, 0.1, 0.1, 0.8, 0.4, 0.6, 0.5, 0.8, 0.1, 0.7, 0.9, 0.8, 0.8, 0.9, 0.7, 0.2, 0.7, 0.7, 0.2, 0.7, 0.6, 0.6, 0.4, 0.1, 0.3, 0.3, 0.2, 0.1, 0.9, 0.4, 0.2, 0.3, 0.7, 0.7, 0.3, 0.1, 0.3, 0.6, 0.4, 0.5, 0.2, 0.4, 0.9, 0.1, 0.5, 0.4, 0.2, 0.8, 0.6, 0.4, 0.9, 0.3, 0.9, 0.1, 0.4, 0.1, 0.8, 0.9, 0.1, 0.5, 0.3, 0.3, 0.5, 0.1, 0.1, 0.3, 0.9, 0.6, 0.2, 0.8, 0.6, 0.8, 0.9, 0.5, 0.1, 0.8, 0.7, 0.7, 0.6, 0.5, 0.5, 0.8, 0.5, 0.6, 0.6, 0.5, 0.9, 0.3, 0.5, 0.7, 0.5, 0.2, 0.7, 0.1, 0.3, 0.6, 0.6, 0.8, 0.2, 0.8, 0.1, 0.7, 0.2, 0.6, 0.1, 0.5, 0.6, 0.5, 0.3, 0.1, 0.7, 0.2, 0.4, 0.1, 0.7, 0.9, 0.3, 0.8, 0.4, 0.2, 0.2, 0.9, 0.4, 0.8, 0.2, 0.3, 0.1, 0.2, 0.4, 0.2, 0.3, 0.5, 0.8, 0.4, 0.3, 0.5, 0.1, 0.4, 0.5, 0.3, 0.1, 0.6, 0.2, 0.3, 0.6, 0.9, 0.3, 0.1, 0.4, 0.2, 0.9, 0.6, 0.1, 0.7, 0.8, 0.9, 0.5, 0.5, 0.9, 0.5, 0.4, 0.5, 0.2, 0.8, 0.2, 0.3, 0.2, 0.9, 0.3, 0.8, 0.9, 0.3, 0.4, 0.3, 0.4, 0.2, 0.6, 0.9, 0.8, 0.7, 0.4, 0.6, 0.2, 0.9, 0.8, 0.2, 0.1, 0.1, 0.6, 0.5, 0.3, 0.8, 0.5, 0.5, 0.9, 0.9, 0.7, 0.6, 0.3, 0.4, 0.5, 0.1, 0.5, 0.2, 0.7, 0.8, 0.8, 0.4, 0.3, 0.4, 0.7, 0.5, 0.3, 0.3, 0.1, 0.3, 0.2, 0.7, 0.9, 0.8, 0.1, 0.8, 0.4, 0.1, 0.8, 0.1, 0.1, 0.7, 0.4, 0.6, 0.8, 0.1, 0.6, 0.3, 0.2, 0.5, 0.2, 0.6, 0.6, 0.3, 0.3, 0.1, 0.2, 0.9, 0.2, 0.8, 0.1, 0.3, 0.5, 0.4, 0.7, 0.5, 0.3, 0.9, 0.8, 0.5, 0.9, 0.8, 0.9, 0.3, 0.9, 0.5, 0.8, 0.6, 0.7, 0.8, 0.3, 0.1, 0.1, 0.5, 0.9, 0.6, 0.8, 0.5, 0.1, 0.4, 0.5, 0.7, 0.8, 0.4, 0.5, 0.4, 0.2, 0.3, 0.1, 0.4, 0.5, 0.6, 0.3, 0.2, 0.4, 0.3, 0.7, 0.7, 0.3, 0.8, 0.6, 0.3, 0.8, 0.4, 0.1, 0.4, 0.3, 0.2, 0.8, 0.5, 0.9, 0.9, 0.7, 0.8, 0.6, 0.8, 0.5, 0.8, 0.6, 0.5, 0.9, 0.9, 0.3, 0.1, 0.1, 0.7, 0.4, 0.5, 0.7, 0.4, 0.7, 0.8, 0.3, 0.7, 0.1, 0.2, 0.6, 0.2, 0.9, 0.2, 0.2, 
+
+L3_zHER2K_B_kn
+0.3, 0.9, 0.9, 0.3, 0.7, 0.5, 0.5, 0.4, 0.9, 0.2, 0.7, 0.5, 0.1, 0.2, 0.6, 0.6, 0.1, 0.7, 0.5, 0.3, 0.9, 0.5, 0.5, 0.7, 0.4, 0.7, 0.4, 0.4, 0.3, 0.5, 0.4, 0.3, 0.5, 0.9, 0.8, 0.1, 0.6, 0.6, 0.4, 0.8, 0.7, 0.2, 0.6, 0.1, 0.9, 0.2, 0.3, 0.3, 0.4, 0.1, 0.7, 0.3, 0.4, 0.2, 0.2, 0.3, 0.4, 0.2, 0.9, 0.3, 0.8, 0.5, 0.9, 0.8, 0.9, 0.1, 0.3, 0.9, 0.1, 0.8, 0.5, 0.1, 0.6, 0.3, 0.4, 0.1, 0.9, 0.2, 0.6, 0.9, 0.9, 0.2, 0.8, 0.9, 0.9, 0.9, 0.1, 0.2, 0.2, 0.6, 0.3, 0.8, 0.4, 0.5, 0.3, 0.7, 0.6, 0.5, 0.2, 0.1, 0.6, 0.9, 0.2, 0.3, 0.9, 0.7, 0.1, 0.9, 0.1, 0.8, 0.8, 0.8, 0.3, 0.8, 0.4, 0.5, 0.3, 0.3, 0.2, 0.9, 0.5, 0.5, 0.2, 0.5, 0.5, 0.6, 0.3, 0.2, 0.9, 0.8, 0.5, 0.9, 0.8, 0.9, 0.5, 0.2, 0.2, 0.5, 0.4, 0.3, 0.1, 0.7, 0.8, 0.7, 0.8, 0.9, 0.7, 0.8, 0.6, 0.7, 0.4, 0.8, 0.3, 0.1, 0.7, 0.9, 0.4, 0.6, 0.5, 0.9, 0.8, 0.2, 0.4, 0.9, 0.2, 0.7, 0.2, 0.4, 0.8, 0.4, 0.7, 0.8, 0.6, 0.9, 0.1, 0.7, 0.7, 0.5, 0.2, 0.9, 0.1, 0.9, 0.4, 0.3, 0.3, 0.4, 0.3, 0.4, 0.2, 0.4, 0.6, 0.3, 0.2, 0.8, 0.3, 0.3, 0.2, 0.4, 0.2, 0.3, 0.2, 0.3, 0.1, 0.3, 0.6, 0.5, 0.3, 0.7, 0.9, 0.2, 0.9, 0.4, 0.6, 0.3, 0.1, 0.1, 0.1, 0.1, 0.1, 0.5, 0.3, 0.2, 0.7, 0.4, 0.9, 0.7, 0.3, 0.2, 0.7, 0.1, 0.1, 0.3, 0.4, 0.2, 0.2, 0.5, 0.3, 0.9, 0.7, 0.6, 0.1, 0.8, 0.5, 0.3, 0.7, 0.1, 0.7, 0.9, 0.1, 0.4, 0.3, 0.7, 0.7, 0.7, 0.5, 0.1, 0.6, 0.6, 0.3, 0.2, 0.6, 0.9, 0.9, 0.7, 0.3, 0.9, 0.8, 0.8, 0.9, 0.8, 0.9, 0.6, 0.5, 0.2, 0.3, 0.4, 0.2, 0.9, 0.3, 0.2, 0.5, 0.6, 0.9, 0.9, 0.4, 0.8, 0.4, 0.3, 0.1, 0.3, 0.2, 0.9, 0.3, 0.2, 0.6, 0.2, 0.5, 0.3, 0.1, 0.3, 0.2, 0.4, 0.3, 0.6, 0.2, 0.2, 0.2, 0.9, 0.6, 0.5, 0.2, 0.9, 0.4, 0.4, 0.8, 0.5, 0.2, 0.1, 0.3, 0.7, 0.9, 0.5, 0.6, 0.2, 0.3, 0.9, 0.2, 0.2, 0.4, 0.5, 0.7, 0.7, 0.3, 0.2, 0.1, 0.9, 0.5, 0.8, 0.8, 0.2, 0.7, 0.7, 0.2, 0.3, 0.8, 0.8, 0.5, 0.5, 0.4, 0.4, 0.5, 0.8, 0.6, 0.1, 0.5, 0.7, 0.2, 0.4, 0.3, 0.8, 0.3, 0.5, 0.5, 0.4, 0.5, 0.1, 0.5, 0.6, 0.6, 0.7, 0.6, 0.1, 0.6, 0.8, 0.1, 0.2, 0.1, 0.8, 0.4, 0.3, 0.3, 0.3, 0.9, 0.3, 0.3, 0.7, 0.2, 0.5, 0.2, 0.2, 0.5, 0.3, 0.4, 0.9, 0.9, 0.3, 0.2, 0.8, 0.8, 0.6, 0.9, 0.2, 0.2, 0.8, 0.2, 0.5, 0.8, 0.9, 0.1, 0.6, 0.4, 0.5, 0.9, 0.4, 0.8, 0.5, 0.6, 0.1, 0.4, 0.3, 0.7, 0.4, 0.6, 0.1, 0.9, 0.9, 0.2, 0.4, 0.3, 0.4, 0.6, 0.4, 0.1, 0.5, 0.4, 0.6, 0.5, 0.5, 0.5, 0.3, 0.4, 0.3, 0.1, 0.2, 0.4, 0.8, 0.7, 0.9, 0.6, 0.2, 0.8, 0.4, 0.5, 0.7, 0.7, 0.6, 0.4, 0.7, 0.6, 0.1, 0.2, 0.7, 0.4, 0.6, 0.3, 0.7, 0.7, 0.6, 0.8, 0.9, 0.2, 0.8, 0.9, 0.4, 0.2, 0.1, 0.2, 0.3, 0.8, 0.6, 0.1, 0.5, 0.7, 0.8, 0.9, 0.6, 0.3, 0.7, 0.8, 0.5, 0.1, 0.5, 0.8, 0.6, 0.3, 0.7, 0.6, 0.4, 0.4, 0.6, 0.1, 0.7, 0.6, 0.7, 0.8, 0.8, 0.6, 0.9, 0.3, 0.2, 0.5, 0.2, 0.8, 0.5, 0.7, 0.9, 0.3, 0.9, 0.5, 0.1, 0.9, 0.6, 0.2, 0.4, 0.8, 0.1, 0.7, 0.7, 0.5, 0.4, 0.5, 0.7, 0.1, 0.8, 0.2, 0.1, 0.4, 0.2, 0.5, 0.7, 0.7, 0.9, 0.6, 0.2, 
+
+L3_zHER2K_o_H
+13.76, 0.0, 15.48, -0.88, 14.52, 0.6, 15.95, -1.51, 16.57, -1.53, 16.2, 1.55, 13.52, 0.25, 14.65, 0.16, 15.64, -0.47, 15.22, 1.48, 14.55, 1.0, 15.99, 1.41, 13.95, -0.26, 13.66, -0.19, 13.83, 1.71, 14.45, 0.58, 14.14, -0.63, 15.48, 0.88, 17.1, 1.11022302463e-15, 16.39, 2.45, 17.94, 0.44, 17.69, -0.89, 17.8, 1.55, 15.98, 1.11, 16.6, 1.08, 17.28, -1.36, 17.09, 2.63, 16.69, 1.21, 18.24, 4.0, 16.85, 0.29, 16.05, 0.64, 16.28, 4.08, 16.22, 0.49, 16.26, 0.74, 14.52, -0.6, 16.39, -2.45, 17.0, 8.881784197e-16, 17.08, -1.87, 16.7, -2.79, 18.64, -0.44, 15.74, -1.06, 16.87, -1.24, 17.4, 0.04, 16.06, 0.49, 17.17, 1.22, 17.78, 1.04, 15.26, -1.75, 15.34, -0.36, 15.67, 2.07, 15.05, -0.39, 14.56, -1.95, 15.95, 1.51, 17.94, -0.44, 17.08, 1.87, 16.4, 3.88578058619e-16, 17.89, -0.35, 17.79, 2.04, 15.43, 1.06, 15.9, 1.87, 16.58, 1.58, 16.76, 3.38, 15.43, 2.11, 17.44, 4.17, 15.12, -0.15, 14.47, 1.27, 16.37, 4.07, 15.51, 2.43, 15.21, 1.15, 16.57, 1.53, 17.69, 0.89, 16.7, 2.79, 17.89, 0.35, 17.34, 0.0, 17.94, 4.16, 15.82, 1.59, 16.29, 2.82, 18.45, 1.83, 16.72, 3.89, 15.15, 3.66, 17.24, 5.15, 16.64, 1.82, 15.85, 2.81, 16.61, 4.7, 15.56, 2.6, 15.67, 1.47, 16.2, -1.55, 17.8, -1.55, 18.64, 0.44, 17.79, -2.04, 17.94, -4.16, 18.56, -8.881784197e-16, 16.1, -1.28, 16.2, -1.05, 17.55, -1.19, 17.71, 0.86, 16.6, 0.54, 18.33, 1.17, 17.08, -3.11, 16.32, -0.53, 16.93, 1.07, 16.31, 0.37, 15.55, -2.65, 13.52, -0.25, 15.98, -1.11, 15.74, 1.06, 15.43, -1.06, 15.82, -1.59, 16.1, 1.28, 14.14, 9.43689570931e-16, 13.78, 1.51, 14.42, 0.17, 16.08, 1.36, 15.4, 2.39, 15.67, 3.58, 13.79, -0.7, 13.81, 1.55, 14.36, 2.68, 13.74, 0.53, 14.15, 0.3, 14.65, -0.16, 16.6, -1.08, 16.87, 1.24, 15.9, -1.87, 16.29, -2.82, 16.2, 1.05, 13.78, -1.51, 14.74, -7.91033905045e-16, 15.02, 0.46, 16.03, 0.64, 14.71, 1.66, 15.6, 2.38, 14.22, -1.3, 14.55, -0.8, 15.29, 1.91, 13.39, 0.48, 12.99, -0.19, 15.64, 0.47, 17.28, 1.36, 17.4, -0.04, 16.58, -1.58, 18.45, -1.83, 17.55, 1.19, 14.42, -0.17, 15.02, -0.46, 17.14, 2.22044604925e-16, 16.94, 2.95, 15.15, 1.63, 17.3, 3.33, 16.17, -0.65, 16.46, 1.16, 16.41, 3.65, 14.61, 1.99, 16.25, -0.53, 15.22, -1.48, 17.09, -2.63, 16.06, -0.49, 16.76, -3.38, 16.72, -3.89, 17.71, -0.86, 16.08, -1.36, 16.03, -0.64, 16.94, -2.95, 15.06, -1.55431223448e-15, 15.57, -0.2, 16.67, 0.78, 15.91, -2.28, 15.64, -0.31, 16.22, 1.69, 15.53, -0.6, 14.46, -1.59, 14.55, -1.0, 16.69, -1.21, 17.17, -1.22, 15.43, -2.11, 15.15, -3.66, 16.6, -0.54, 15.4, -2.39, 14.71, -1.66, 15.15, -1.63, 15.57, 0.2, 14.66, -2.22044604925e-16, 17.12, 0.96, 14.13, -2.54, 14.2, -0.65, 15.34, 1.07, 14.23, -1.4, 13.51, -1.86, 15.99, -1.41, 18.24, -4.0, 17.78, -1.04, 17.44, -4.17, 17.24, -5.15, 18.33, -1.17, 15.67, -3.58, 15.6, -2.38, 17.3, -3.33, 16.67, -0.78, 17.12, -0.96, 17.98, -2.22044604925e-15, 16.56, -2.63, 16.26, -1.47, 17.28, 0.35, 15.68, -2.12, 15.23, -1.72, 13.95, 0.26, 16.85, -0.29, 15.26, 1.75, 15.12, 0.15, 16.64, -1.82, 17.08, 3.11, 13.79, 0.7, 14.22, 1.3, 16.17, 0.65, 15.91, 2.28, 14.13, 2.54, 16.56, 2.63, 14.52, 2.22044604925e-16, 15.2, 0.57, 15.39, 3.06, 13.8, 2.11, 14.36, 1.11, 13.66, 0.19, 16.05, -0.64, 15.34, 0.36, 14.47, -1.27, 15.85, -2.81, 16.32, 0.53, 13.81, -1.55, 14.55, 0.8, 16.46, -1.16, 15.64, 0.31, 14.2, 0.65, 16.26, 1.47, 15.2, -0.57, 14.04, 4.4408920985e-16, 15.48, 1.97, 14.63, -0.02, 13.25, 0.41, 13.83, -1.71, 16.28, -4.08, 15.67, -2.07, 16.37, -4.07, 16.61, -4.7, 16.93, -1.07, 14.36, -2.68, 15.29, -1.91, 16.41, -3.65, 16.22, -1.69, 15.34, -1.07, 17.28, -0.35, 15.39, -3.06, 15.48, -1.97, 14.96, 4.4408920985e-16, 14.76, -1.2, 14.5, -1.66, 14.45, -0.58, 16.22, -0.49, 15.05, 0.39, 15.51, -2.43, 15.56, -2.6, 16.31, -0.37, 13.74, -0.53, 13.39, -0.48, 14.61, -1.99, 15.53, 0.6, 14.23, 1.4, 15.68, 2.12, 13.8, -2.11, 14.63, 0.02, 14.76, 1.2, 15.5, 3.33066907388e-16, 13.54, 0.14, 14.14, 0.63, 16.26, -0.74, 14.56, 1.95, 15.21, -1.15, 15.67, -1.47, 15.55, 2.65, 14.15, -0.3, 12.99, 0.19, 16.25, 0.53, 14.46, 1.59, 13.51, 1.86, 15.23, 1.72, 14.36, -1.11, 13.25, -0.41, 14.5, 1.66, 13.54, -0.14, 13.4, -4.4408920985e-16, 
+
+L3_sTRMM_A_mm
+0.5, 0.8, 0.6, 0.6, 0.3, 0.2, 0.2, 0.1, 0.3, 0.4, 0.0, 0.6, 0.7, 0.7, 0.6, 0.3, 0.6, 0.7, 0.9, 0.1, 0.0, 0.0, 0.2, 0.8, 0.5, 0.5, 0.1, 0.9, 0.7, 0.1, 0.0, 0.0, 0.0, 0.1, 0.1, 0.6, 0.6, 0.2, 0.7, 0.3, 0.0, 0.0, 0.0, 0.0, 0.1, 0.3, 0.9, 0.1, 0.1, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.3, 0.7, 0.5, 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.5, 0.3, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.9, 0.8, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.4, 
+
+L3_sTRMM_B_mn
+0.4, 0.2, 0.3, 0.8, 0.3, 0.9, 0.7, 0.4, 0.3, 0.7, 0.7, 0.2, 0.8, 0.5, 0.4, 0.4, 0.8, 0.8, 0.3, 0.5, 0.7, 0.4, 0.7, 0.6, 0.9, 0.5, 0.5, 0.7, 0.4, 0.4, 0.9, 0.6, 0.1, 0.9, 0.5, 0.1, 0.9, 0.4, 0.9, 0.6, 0.3, 0.3, 0.2, 0.2, 0.7, 0.4, 0.4, 0.1, 0.6, 0.6, 0.6, 0.5, 0.7, 0.5, 0.4, 0.8, 0.2, 0.3, 0.6, 0.9, 0.8, 0.4, 0.5, 0.9, 0.2, 0.8, 0.8, 0.4, 0.5, 0.3, 0.6, 0.5, 0.8, 0.7, 0.7, 0.6, 0.9, 0.5, 0.9, 0.2, 0.6, 0.9, 0.8, 0.9, 0.3, 0.7, 0.9, 0.7, 0.6, 0.3, 0.8, 0.7, 0.9, 0.2, 0.1, 0.1, 0.6, 0.1, 0.3, 0.2, 0.1, 0.2, 0.7, 0.2, 0.9, 0.7, 0.3, 0.6, 0.1, 0.6, 0.4, 0.9, 0.8, 0.4, 0.5, 0.2, 0.9, 0.3, 0.4, 0.9, 0.9, 0.5, 0.3, 0.7, 0.6, 0.4, 0.6, 0.3, 0.2, 0.2, 0.1, 0.9, 0.6, 0.2, 0.1, 0.7, 0.8, 0.9, 0.8, 0.8, 0.5, 0.1, 0.2, 0.7, 0.9, 0.6, 0.1, 0.4, 0.3, 0.1, 0.5, 0.2, 0.1, 0.4, 0.1, 0.6, 0.6, 0.3, 0.7, 0.7, 0.3, 0.1, 0.1, 0.2, 0.1, 0.9, 0.4, 0.9, 0.8, 0.8, 
+
+L3_sTRMM_o_LUN
+2.3600000681, 1.5300000374, 2.42000006989, 2.36000007108, 2.19000008091, 2.35000004247, 1.94000005782, 2.33000007093, 1.94000003919, 1.94000005335, 2.15000002906, 1.39000005633, 2.34000005409, 1.77000001922, 2.51000009865, 1.86000008076, 2.35000006109, 3.50000000596, 2.75999995187, 3.52000000805, 2.87000004381, 3.15000000522, 2.58000007838, 2.0000000529, 3.24000006601, 2.9399999699, 2.5600000383, 2.49000002652, 1.85000003651, 2.83000000238, 2.05000003725, 3.10000006035, 2.12000003487, 2.38000003144, 2.57999995843, 2.649999924, 2.38999999896, 1.91000002936, 2.40999999881, 1.77000002146, 1.58000000015, 2.41000002488, 2.25999996006, 1.68000002772, 1.30999999881, 1.30000002161, 2.30999996826, 1.4500000082, 1.97000002295, 1.60000001714, 1.50999999955, 1.80000002384, 1.59999998733, 1.91000003532, 1.67000005648, 1.10000003427, 1.33000006646, 1.01000002116, 1.72000003934, 1.25999999508, 1.22000002593, 0.840000033975, 1.0000000447, 1.17000002369, 0.720000033379, 1.48000001729, 0.810000032336, 0.880000035167, 1.37999998897, 0.740000003427, 1.68999999449, 1.45000001788, 0.800000026822, 1.4800000225, 0.990000004172, 1.24000003025, 0.710000001043, 1.04999996573, 1.02999999791, 0.690000014603, 1.37999998525, 0.750000017136, 1.73999995574, 1.06000002414, 1.17000001997, 1.65999998242, 1.3899999617, 1.58000001281, 1.36000003159, 1.09999999851, 1.30000001267, 1.03999998555, 1.34000002056, 0.890000000447, 0.800000015646, 0.590000013858, 0.580000015795, 1.57999995768, 0.870000016242, 1.32999997705, 0.840000007898, 1.25999999061, 1.03000000387, 0.809999993593, 0.970000022948, 0.830000030696, 0.710000009239, 0.800000014156, 0.630000000894, 0.780000029206, 0.550000012666, 0.510000014454, 0.390000009388, 0.300000010431, 1.0899999848, 0.570000017732, 0.879999993443, 0.570000013262, 0.860000004023, 1.80999997199, 1.6199999477, 1.63000001431, 1.4500000298, 1.29999998212, 1.24999998212, 1.14999997318, 1.37000000954, 1.07999999419, 0.750000023097, 0.439999998212, 0.500000007451, 1.85999992728, 0.980000005364, 1.38999996096, 0.969999995381, 1.42999996662, 0.480000026226, 0.330000006855, 0.600000041723, 0.600000041723, 0.330000020266, 0.450000011176, 0.480000012815, 0.390000019073, 0.330000006855, 0.240000017583, 0.150000008196, 0.180000009835, 0.630000014305, 0.270000014752, 0.690000013113, 0.540000029504, 0.510000027865, 0.160000004768, 0.0400000011921, 0.240000013113, 0.240000013113, 0.120000006557, 0.279999999404, 0.279999999404, 0.120000006557, 0.0400000011921, 0.0400000011921, 0.0800000023842, 0.0400000011921, 0.359999995828, 0.160000004768, 0.359999995828, 0.320000009537, 0.320000009537, 
+
+L3_sTRMM_A_nn
+0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.2, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.2, 0.6, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.2, 0.1, 0.2, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6, 0.3, 0.1, 0.2, 0.9, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.4, 0.7, 0.5, 0.6, 0.2, 0.8, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.3, 0.3, 0.2, 0.5, 0.2, 0.3, 0.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.9, 0.8, 0.1, 0.9, 0.3, 0.6, 0.3, 0.9, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, 0.9, 0.7, 0.3, 0.1, 0.4, 0.3, 0.3, 0.9, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.9, 0.9, 0.1, 0.5, 0.7, 0.4, 0.8, 0.1, 0.5, 0.5, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.3, 0.6, 0.2, 0.4, 0.7, 0.2, 0.9, 0.4, 0.9, 0.8, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, 0.3, 0.7, 0.7, 0.2, 0.9, 0.1, 0.7, 0.3, 0.5, 0.4, 0.7, 0.6, 0.0, 0.0, 0.0, 0.0, 0.5, 0.8, 0.2, 0.1, 0.3, 0.3, 0.9, 0.5, 0.6, 0.4, 0.3, 0.6, 0.6, 0.3, 0.0, 0.0, 0.0, 0.3, 0.1, 0.2, 0.6, 0.7, 0.1, 0.6, 0.4, 0.8, 0.8, 0.5, 0.3, 0.5, 0.1, 0.8, 0.0, 0.0, 0.4, 0.6, 0.1, 0.2, 0.2, 0.5, 0.4, 0.5, 0.7, 0.7, 0.7, 0.4, 0.9, 0.2, 0.8, 0.3, 0.0, 0.8, 0.6, 0.1, 0.7, 0.7, 0.5, 0.5, 0.6, 0.8, 0.3, 0.8, 0.8, 0.6, 0.8, 0.2, 0.3, 0.3, 
+
+L3_sTRMM_o_RLT
+0.20000000298, 0.400000017881, 0.260000016689, 1.02000000954, 0.420000014752, 1.30000003353, 2.13000004113, 1.21000003159, 2.74000001237, 2.29000003174, 3.26999997452, 3.09999998212, 3.71000000253, 3.11000005692, 3.54000008017, 3.98999999449, 4.77000009224, 0.40000000596, 0.720000039339, 0.440000017583, 1.14999999255, 0.53000000909, 1.54000003919, 2.20000005364, 1.66000003159, 3.61999995366, 2.94000002801, 3.64999998659, 3.59999997467, 4.16999997228, 3.59000007644, 3.90000009015, 4.21000001967, 5.64000006676, 0.25, 0.380000014305, 0.610000008494, 1.02000000507, 0.689999990761, 1.6700000006, 1.80000004247, 1.41000001594, 2.15000002608, 2.03000000983, 2.79999996498, 2.77000002965, 3.26000000775, 2.34000007048, 3.05000005364, 3.15000005439, 3.99000007942, 0.25, 0.860000010729, 0.490000012368, 0.900000008941, 0.720000009537, 1.48000001803, 1.68000002325, 1.46000004053, 3.21999997452, 3.13999996841, 3.47999997184, 3.25000004247, 3.75000003353, 3.70000007898, 4.38000007465, 4.83000000462, 5.22000010714, 0.25, 0.540000025034, 0.470000032634, 0.970000021458, 0.670000014752, 1.69000002503, 2.1500000447, 1.61000004649, 3.4199999842, 3.05000000298, 3.9999999404, 3.74000001907, 3.92000003114, 3.80000007525, 4.55000006631, 4.95000000149, 5.96000006288, 0.34999999404, 1.14000000119, 0.670000007302, 1.28000001431, 0.590000010133, 1.63000004932, 2.74000002652, 1.83000002027, 3.72999996439, 3.09999997169, 3.2299999547, 2.95999999359, 3.84999998063, 3.38000001803, 2.58000007391, 3.06000003085, 4.27000008479, 0.34999999404, 0.580000014305, 0.650000008196, 1.34999998063, 0.490000005662, 1.34000004366, 1.8900000295, 1.36000002787, 2.88999998927, 2.86999998868, 3.20999996975, 3.70000002086, 4.23999999374, 2.86000007927, 3.95000004321, 4.25999999657, 4.58000010371, 0.449999988079, 1.25999999881, 0.570000008792, 0.930000011325, 0.729999994934, 1.91000001594, 2.28000002176, 1.76000002116, 3.35000000373, 2.94999998882, 3.35999993548, 2.69000005037, 3.57000002965, 3.45000005439, 2.87000004828, 3.56000001073, 4.71000009567, 0.40000000596, 1.20000001788, 0.740000026524, 1.54000002056, 0.750000007451, 1.50000002831, 2.13000002474, 1.6800000307, 3.94999991953, 3.71999996707, 3.46999995589, 3.11000003085, 3.80000003502, 3.33000005528, 3.66000008076, 3.71000002265, 4.49000007421, 0.20000000298, 0.320000015497, 0.420000030398, 1.00000003874, 0.390000017583, 1.1400000377, 1.93000005677, 1.15000004247, 2.12000003263, 1.760000045, 2.17000001401, 1.95000004172, 2.9300000225, 2.4200000304, 2.93000005156, 3.4099999854, 3.82000008479, 
+
+L3_dTRMM_A_mm
+0.2, 0.2, 0.4, 0.1, 0.4, 0.1, 0.6, 0.9, 0.2, 0.5, 0.0, 0.4, 0.8, 0.6, 0.8, 0.9, 0.7, 0.9, 0.6, 0.4, 0.0, 0.0, 0.7, 0.8, 0.1, 0.4, 0.5, 0.2, 0.5, 0.9, 0.0, 0.0, 0.0, 0.7, 0.3, 0.9, 0.1, 0.3, 0.2, 0.3, 0.0, 0.0, 0.0, 0.0, 0.8, 0.3, 0.6, 0.8, 0.4, 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.9, 0.5, 0.1, 0.5, 0.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.9, 0.4, 0.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, 0.7, 0.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 
+
+L3_dTRMM_B_mn
+0.2, 0.5, 0.8, 0.7, 0.7, 0.3, 0.7, 0.7, 0.9, 0.6, 0.8, 0.1, 0.4, 0.3, 0.8, 0.3, 0.4, 0.8, 0.8, 0.4, 0.5, 0.7, 0.2, 0.4, 0.3, 0.8, 0.2, 0.4, 0.5, 0.9, 0.7, 0.5, 0.6, 0.4, 0.7, 0.1, 0.4, 0.4, 0.8, 0.4, 0.8, 0.1, 0.9, 0.8, 0.6, 0.2, 0.4, 0.7, 0.1, 0.2, 0.2, 0.3, 0.9, 0.9, 0.2, 0.4, 0.1, 0.2, 0.4, 0.6, 0.5, 0.4, 0.3, 0.6, 0.9, 0.7, 0.7, 0.9, 0.6, 0.5, 0.7, 0.4, 0.6, 0.3, 0.3, 0.6, 0.2, 0.9, 0.9, 0.2, 0.8, 0.6, 0.8, 0.5, 0.3, 0.4, 0.3, 0.9, 0.6, 0.9, 0.8, 0.7, 0.9, 0.8, 0.4, 0.2, 0.2, 0.4, 0.2, 0.9, 0.5, 0.2, 0.4, 0.1, 0.3, 0.8, 0.7, 0.2, 0.3, 0.6, 0.3, 0.9, 0.2, 0.3, 0.7, 0.1, 0.1, 0.6, 0.4, 0.4, 0.8, 0.6, 0.3, 0.8, 0.9, 0.3, 0.8, 0.7, 0.9, 0.8, 0.9, 0.2, 0.6, 0.9, 0.8, 0.2, 0.5, 0.5, 0.1, 0.6, 0.7, 0.4, 0.9, 0.4, 0.3, 0.6, 0.3, 0.4, 0.3, 0.5, 0.6, 0.3, 0.4, 0.5, 0.4, 0.8, 0.7, 0.8, 0.6, 0.3, 0.5, 0.2, 0.4, 0.3, 0.8, 0.2, 0.9, 0.7, 0.1, 0.2, 
+
+L3_dTRMM_o_LUN
+1.74, 1.7, 2.0, 1.86, 2.65, 1.78, 1.53, 2.02, 1.89, 2.6, 1.95, 1.8, 1.6, 1.98, 2.12, 1.77, 1.07, 3.04, 2.86, 3.52, 2.97, 4.4, 2.85, 2.93, 3.31, 3.38, 4.06, 2.94, 2.46, 2.97, 3.31, 3.67, 3.03, 2.06, 1.93, 1.78, 2.47, 2.11, 2.88, 1.73, 1.96, 1.92, 2.07, 2.5, 1.59, 1.73, 1.72, 2.58, 2.23, 1.65, 1.59, 1.16, 1.52, 2.12, 1.3, 1.96, 1.43, 1.25, 1.8, 1.56, 1.58, 1.14, 1.07, 1.27, 1.55, 2.15, 1.48, 1.14, 1.71, 1.67, 2.09, 1.95, 2.65, 1.9, 1.44, 2.26, 1.4, 2.62, 1.87, 1.84, 1.6, 1.91, 2.42, 1.74, 1.0, 1.05, 0.81, 1.39, 1.55, 1.91, 1.35, 1.38, 1.59, 1.17, 1.36, 0.63, 0.94, 0.96, 0.9, 1.53, 1.02, 0.68, 0.84, 1.1, 0.96, 0.95, 1.46, 1.25, 0.81, 1.2, 0.89, 1.39, 1.0, 1.35, 0.52, 1.12, 1.35, 1.0, 0.5, 0.87, 1.15, 0.87, 0.94, 1.45, 1.24, 0.99, 1.12, 0.85, 1.3, 0.97, 1.32, 0.45, 1.19, 1.42, 0.89, 0.52, 0.7, 0.64, 0.56, 0.9, 1.04, 0.68, 0.9, 0.62, 0.36, 0.72, 0.42, 0.8, 0.36, 0.94, 0.9, 0.3, 0.44, 0.15, 0.12, 0.24, 0.21, 0.24, 0.18, 0.09, 0.15, 0.06, 0.12, 0.09, 0.24, 0.06, 0.27, 0.21, 0.03, 0.06, 
+
+L3_dTRMM_A_nn
+0.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7, 0.8, 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.9, 0.3, 0.3, 0.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.3, 0.7, 0.3, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7, 0.5, 0.5, 0.3, 0.7, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.7, 0.4, 0.3, 0.7, 0.7, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7, 0.5, 0.7, 0.9, 0.4, 0.8, 0.1, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.4, 0.8, 0.1, 0.8, 0.9, 0.3, 0.9, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.8, 0.4, 0.8, 0.8, 0.4, 0.9, 0.6, 0.7, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.1, 0.9, 0.2, 0.4, 0.3, 0.9, 0.9, 0.3, 0.1, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7, 0.6, 0.9, 0.9, 0.9, 0.9, 0.8, 0.3, 0.5, 0.2, 0.4, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.9, 0.7, 0.3, 0.4, 0.3, 0.5, 0.2, 0.3, 0.3, 0.8, 0.2, 0.7, 0.4, 0.0, 0.0, 0.0, 0.0, 0.7, 0.1, 0.1, 0.1, 0.8, 0.3, 0.6, 0.3, 0.1, 0.2, 0.9, 0.4, 0.7, 0.7, 0.0, 0.0, 0.0, 0.7, 0.3, 0.8, 0.7, 0.7, 0.6, 0.2, 0.6, 0.4, 0.3, 0.7, 0.9, 0.8, 0.3, 0.6, 0.0, 0.0, 0.4, 0.7, 0.4, 0.4, 0.2, 0.1, 0.5, 0.6, 0.6, 0.4, 0.9, 0.4, 0.3, 0.7, 0.3, 0.1, 0.0, 0.6, 0.1, 0.2, 0.2, 0.6, 0.4, 0.9, 0.7, 0.4, 0.4, 0.4, 0.6, 0.1, 0.5, 0.6, 0.2, 0.3, 
+
+L3_dTRMM_o_RLT
+0.08, 0.32, 1.1, 0.85, 1.09, 1.58, 2.27, 2.31, 2.87, 3.92, 3.39, 4.36, 2.9, 3.08, 4.73, 4.11, 3.96, 0.32, 0.56, 1.48, 1.28, 1.14, 1.86, 2.1, 2.23, 2.14, 3.4, 2.17, 3.72, 3.27, 3.48, 4.68, 3.87, 3.65, 0.28, 0.13, 0.85, 0.94, 0.86, 1.54, 2.12, 1.92, 2.07, 3.36, 2.55, 3.89, 2.94, 3.49, 3.93, 3.47, 3.61, 0.12, 0.57, 1.56, 0.89, 1.15, 1.48, 1.67, 1.81, 2.14, 2.74, 2.2, 3.06, 2.69, 2.69, 4.07, 3.75, 3.35, 0.24, 0.36, 1.31, 1.06, 1.12, 1.65, 1.83, 2.15, 2.3, 2.94, 2.71, 3.6, 3.25, 3.58, 4.89, 4.01, 3.77, 0.16, 0.22, 1.15, 0.96, 1.19, 1.93, 2.69, 2.85, 3.64, 4.17, 3.48, 4.75, 3.06, 2.95, 4.98, 3.6, 4.21, 0.16, 0.1, 0.57, 0.8, 0.75, 1.27, 1.45, 1.85, 1.86, 2.79, 1.97, 3.0, 2.73, 2.45, 3.59, 2.55, 2.82, 0.16, 0.52, 1.34, 0.9, 1.03, 1.9, 2.47, 2.6, 3.34, 3.83, 3.12, 4.52, 4.01, 3.67, 5.65, 4.65, 4.75, 0.2, 0.35, 0.82, 0.87, 0.72, 1.44, 2.3, 1.98, 2.03, 3.33, 2.26, 3.54, 2.81, 2.95, 3.77, 3.2, 3.7, 0.2, 0.29, 1.23, 1.09, 1.22, 1.9, 2.21, 2.67, 2.7, 3.16, 2.5, 3.97, 3.08, 3.15, 4.86, 3.53, 3.79, 
+
+L3_cTRMM_A_mm
+0.40000000596, 0.300000011921, 0.10000000149, 0.300000011921, 0.699999988079, 0.40000000596, 0.899999976158, 0.300000011921, 0.5, 0.300000011921, 0.40000000596, 0.899999976158, 0.899999976158, 0.5, 0.600000023842, 0.699999988079, 0.10000000149, 0.5, 0.5, 0.300000011921, 0.0, 0.0, 0.5, 0.899999976158, 0.800000011921, 0.10000000149, 0.40000000596, 0.40000000596, 0.899999976158, 0.800000011921, 0.10000000149, 0.800000011921, 0.699999988079, 0.20000000298, 0.699999988079, 0.800000011921, 0.10000000149, 0.5, 0.699999988079, 0.10000000149, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.10000000149, 0.40000000596, 0.600000023842, 0.300000011921, 0.10000000149, 0.5, 0.20000000298, 0.300000011921, 0.300000011921, 0.40000000596, 0.40000000596, 0.800000011921, 0.699999988079, 0.800000011921, 0.10000000149, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.699999988079, 0.800000011921, 0.20000000298, 0.20000000298, 0.5, 0.600000023842, 0.10000000149, 0.600000023842, 0.800000011921, 0.20000000298, 0.800000011921, 0.40000000596, 0.300000011921, 0.800000011921, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.10000000149, 0.10000000149, 0.699999988079, 0.10000000149, 0.899999976158, 0.899999976158, 0.300000011921, 0.600000023842, 0.899999976158, 0.600000023842, 0.300000011921, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.699999988079, 0.10000000149, 0.699999988079, 0.5, 0.10000000149, 0.5, 0.10000000149, 0.40000000596, 0.300000011921, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.300000011921, 0.899999976158, 0.20000000298, 0.600000023842, 0.5, 0.800000011921, 0.699999988079, 0.40000000596, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.10000000149, 0.5, 0.600000023842, 0.10000000149, 0.20000000298, 0.699999988079, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.40000000596, 0.600000023842, 0.10000000149, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.600000023842, 
+
+L3_cTRMM_B_mn
+0.20000000298, 0.10000000149, 0.800000011921, 0.800000011921, 0.300000011921, 0.699999988079, 0.40000000596, 0.10000000149, 0.899999976158, 0.300000011921, 0.10000000149, 0.20000000298, 0.40000000596, 0.699999988079, 0.300000011921, 0.600000023842, 0.10000000149, 0.40000000596, 0.10000000149, 0.899999976158, 0.20000000298, 0.10000000149, 0.40000000596, 0.899999976158, 0.300000011921, 0.300000011921, 0.20000000298, 0.10000000149, 0.5, 0.10000000149, 0.600000023842, 0.40000000596, 0.899999976158, 0.5, 0.40000000596, 0.300000011921, 0.800000011921, 0.5, 0.5, 0.20000000298, 0.800000011921, 0.10000000149, 0.20000000298, 0.5, 0.800000011921, 0.10000000149, 0.699999988079, 0.40000000596, 0.899999976158, 0.40000000596, 0.20000000298, 0.5, 0.300000011921, 0.600000023842, 0.300000011921, 0.699999988079, 0.20000000298, 0.300000011921, 0.10000000149, 0.10000000149, 0.5, 0.300000011921, 0.20000000298, 0.699999988079, 0.699999988079, 0.40000000596, 0.20000000298, 0.10000000149, 0.899999976158, 0.800000011921, 0.899999976158, 0.899999976158, 0.5, 0.699999988079, 0.10000000149, 0.300000011921, 0.300000011921, 0.600000023842, 0.699999988079, 0.10000000149, 0.300000011921, 0.40000000596, 0.600000023842, 0.300000011921, 0.699999988079, 0.10000000149, 0.10000000149, 0.899999976158, 0.40000000596, 0.600000023842, 0.899999976158, 0.600000023842, 0.699999988079, 0.40000000596, 0.300000011921, 0.300000011921, 0.10000000149, 0.800000011921, 0.600000023842, 0.5, 0.800000011921, 0.600000023842, 0.5, 0.5, 0.600000023842, 0.20000000298, 0.10000000149, 0.300000011921, 0.20000000298, 0.699999988079, 0.699999988079, 0.20000000298, 0.5, 0.40000000596, 0.20000000298, 0.20000000298, 0.699999988079, 0.300000011921, 0.899999976158, 0.20000000298, 0.800000011921, 0.20000000298, 0.40000000596, 0.10000000149, 0.20000000298, 0.600000023842, 0.10000000149, 0.699999988079, 0.20000000298, 0.699999988079, 0.600000023842, 0.20000000298, 0.40000000596, 0.800000011921, 0.600000023842, 0.300000011921, 0.899999976158, 0.699999988079, 0.899999976158, 0.20000000298, 0.600000023842, 0.40000000596, 0.300000011921, 0.10000000149, 0.899999976158, 0.40000000596, 0.40000000596, 0.5, 0.5, 0.20000000298, 0.699999988079, 0.10000000149, 0.40000000596, 0.899999976158, 0.300000011921, 0.600000023842, 0.800000011921, 0.10000000149, 0.20000000298, 0.20000000298, 0.40000000596, 0.600000023842, 0.899999976158, 0.600000023842, 0.20000000298, 0.10000000149, 0.5, 0.899999976158, 0.800000011921, 0.699999988079, 0.300000011921, 0.20000000298, 0.10000000149, 0.800000011921, 0.600000023842, 0.20000000298, 0.40000000596, 0.600000023842, 0.300000011921, 0.300000011921, 0.899999976158, 0.20000000298, 0.600000023842, 0.5, 0.5, 0.699999988079, 0.899999976158, 0.800000011921, 0.300000011921, 0.699999988079, 0.899999976158, 0.600000023842, 0.5, 0.800000011921, 0.10000000149, 0.600000023842, 0.600000023842, 0.5, 0.600000023842, 0.20000000298, 0.899999976158, 0.5, 0.300000011921, 0.899999976158, 0.300000011921, 0.20000000298, 0.10000000149, 0.699999988079, 0.40000000596, 0.800000011921, 0.10000000149, 0.600000023842, 0.800000011921, 0.10000000149, 0.40000000596, 0.699999988079, 0.10000000149, 0.699999988079, 0.20000000298, 0.10000000149, 0.5, 0.5, 0.899999976158, 0.5, 0.5, 0.600000023842, 0.300000011921, 0.10000000149, 0.5, 0.40000000596, 0.300000011921, 0.899999976158, 0.20000000298, 0.899999976158, 0.899999976158, 0.600000023842, 0.699999988079, 0.20000000298, 0.20000000298, 0.10000000149, 0.300000011921, 0.300000011921, 0.20000000298, 0.600000023842, 0.899999976158, 0.5, 0.800000011921, 0.40000000596, 0.600000023842, 0.899999976158, 0.40000000596, 0.899999976158, 0.20000000298, 0.10000000149, 0.600000023842, 0.300000011921, 0.800000011921, 0.600000023842, 0.300000011921, 0.300000011921, 0.800000011921, 0.20000000298, 0.40000000596, 0.600000023842, 0.300000011921, 0.899999976158, 0.800000011921, 0.300000011921, 0.699999988079, 0.899999976158, 0.5, 0.600000023842, 0.300000011921, 0.20000000298, 0.5, 0.40000000596, 0.600000023842, 0.300000011921, 0.20000000298, 0.5, 0.300000011921, 0.300000011921, 0.699999988079, 0.800000011921, 0.800000011921, 0.40000000596, 0.20000000298, 0.699999988079, 0.20000000298, 0.800000011921, 0.699999988079, 0.600000023842, 0.899999976158, 0.40000000596, 0.5, 0.800000011921, 0.800000011921, 0.899999976158, 0.800000011921, 0.800000011921, 0.800000011921, 0.600000023842, 0.699999988079, 0.20000000298, 0.20000000298, 0.600000023842, 0.899999976158, 0.600000023842, 0.10000000149, 0.10000000149, 0.800000011921, 0.600000023842, 0.20000000298, 0.899999976158, 0.5, 0.10000000149, 0.899999976158, 0.600000023842, 0.600000023842, 0.899999976158, 0.300000011921, 0.800000011921, 0.40000000596, 0.5, 0.40000000596, 0.20000000298, 0.300000011921, 0.600000023842, 0.899999976158, 0.20000000298, 0.800000011921, 0.699999988079, 0.5, 0.899999976158, 0.300000011921, 0.20000000298, 0.899999976158, 0.300000011921, 0.699999988079, 0.699999988079, 
+
+L3_cTRMM_o_LUN
+1.20999991462, 4.01000003383, 0.0499999791384, 4.42000002667, -1.7881393255e-08, 4.82000009298, -0.58000000909, 4.27000000581, 1.82999994054, 3.96000008076, 0.719999982715, 5.26999998868, -0.689999937117, 4.85000002608, 0.399999979138, 3.61000006214, 0.579999932349, 4.64999999478, -0.0200000356138, 5.02000002369, 0.409999944419, 4.45000004992, 0.329999956191, 4.50000004321, -0.370000042319, 4.55000005513, -0.839999965429, 5.40000000224, 0.210000030845, 4.31000002563, 0.9299999547, 6.43999997437, 0.739999976605, 4.91000007182, 1.41999991417, 4.36000002638, 0.569999943972, 4.48999999523, 0.629999959916, 4.71000008672, -0.090000051856, 4.40000000373, 1.30999993324, 4.10000006109, 0.869999968559, 5.40999998167, -0.159999991357, 5.03999997139, 0.719999987185, 3.92999999344, -0.150000028312, 4.65999998465, -0.260000080019, 4.97000007138, 0.389999981821, 4.76000007331, 0.609999915361, 3.51000007853, -0.160000077039, 4.03000004262, -0.560000049472, 5.73999997959, -0.119999984205, 4.40000006557, 0.529999935329, 6.20999993175, 0.639999949783, 4.5700000535, 1.50000001118, 2.7400000973, 0.720000019222, 2.88000007167, 1.06000004277, 2.95000012442, -0.260000005513, 3.08000005081, 1.39000003919, 2.64000010699, 1.29999999925, 3.69000007421, 0.800000077486, 3.37000004455, 0.640000051856, 2.91000005841, 0.960000010729, 3.52000007883, 0.850000009686, 3.88000009701, 1.4299999994, 3.30000010133, 1.16999998644, 3.15000009611, 0.52000005424, 3.78000006571, 0.190000057817, 4.06000006512, 0.840000045896, 3.20000012219, 1.51999998197, 3.74000005335, 0.96000002861, 3.6800001134, 0.0199999730289, 2.85000004917, -0.0700000229478, 2.36000007033, -0.230000023991, 3.09000014871, -0.97000004679, 2.88000004411, 1.16999999166, 3.05000008717, 0.289999953508, 4.4700000535, -0.289999965429, 3.37000008181, -0.3700000453, 2.95000004768, 0.0699999417365, 3.96000007406, 0.659999974221, 3.86000011429, 0.469999910444, 3.1700000982, 0.189999958724, 3.4900000757, -0.870000002831, 3.92000007659, -1.05999997422, 4.2400000675, 0.850000028312, 2.85000013337, 0.329999918193, 4.66000001967, -0.390000009388, 3.97000010788, 0.359999980927, 2.01000004351, -0.390000011623, 2.42000000432, -3.27825566693e-08, 2.97000008851, -0.840000036955, 2.78000003666, 1.03999998555, 2.56000006139, 0.0299999241531, 3.80000002384, -0.439999979585, 3.18000004113, -0.200000037998, 2.20999999583, 0.0199999387562, 3.36000002712, 0.619999900758, 3.79000000864, 0.759999867678, 3.12000005946, 0.689999961704, 3.17000004679, -0.160000047237, 3.74000003994, -0.739999984801, 3.86000001147, 0.170000012517, 3.05000004321, 1.07999987647, 3.8499999918, -0.0200000751019, 3.39000000119, 0.189999998212, 1.34000001833, -0.540000004172, 1.60999999732, -0.120000011027, 1.97000004455, -0.740000004172, 1.93000001803, 0.580000000894, 1.58000002921, -0.130000025481, 2.3, -0.669999948442, 2.17000000954, -0.230000004619, 1.36000000849, 0.129999959171, 2.09000001907, 0.149999959767, 2.37999998525, 0.219999936521, 2.09000004292, 0.309999989867, 2.04000000864, -0.489999997467, 2.24000003472, -0.82999995023, 2.34999999627, -0.149999988079, 1.95000000671, 0.639999939352, 2.58999997884, -0.100000025332, 2.15999997571, 0.269999967813, 1.59000003397, -0.759999992847, 1.25000003129, -0.540000028014, 2.21000007331, -1.15000002012, 2.03000000164, 0.289999991506, 1.97000004381, -0.830000032187, 2.85000003725, -0.919999965578, 2.4300000225, -0.619999999851, 1.54000001088, -0.820000011027, 2.09000003546, -0.310000043511, 2.72000001103, -0.410000042021, 2.3300000307, 0.199999957532, 2.12000004008, -0.530000002384, 2.83000001431, -1.44999996871, 2.77000001997, -0.719999981225, 2.19000006825, 0.0299999442697, 2.81999997973, -0.400000061095, 2.33999999374, -0.109999998063, 1.00999998912, 0.0900000071526, 0.560000021905, -0.209999989122, 1.08000002772, -0.679999966621, 1.13999999896, 0.0600000137091, 1.02000001773, -0.289999989271, 1.69000001609, -0.479999927878, 1.21000002488, -0.479999988973, 0.920000021458, -0.319999990165, 1.21000004128, 0.079999999404, 1.2100000383, 0.0199999953806, 0.840000030994, 0.240000008643, 1.6200000073, -0.199999962002, 1.58000001431, -0.54999993369, 1.33000002548, 0.270000022948, 1.12000004455, -0.00999998614192, 1.31999997526, -0.539999991506, 1.3200000155, 0.550000007451, 0.670000035614, 0.139999998212, 0.470000009537, 0.600000028312, 0.830000050068, -0.0699999938905, 0.890000010133, 0.320000011027, 0.38000001654, 0.509999988377, 1.13000003293, 0.510000030845, 1.12000002295, -0.0799999859929, 0.940000024289, -0.0299999956787, 0.820000021458, 0.329999993443, 0.740000019073, 0.409999994338, 0.950000029057, 0.44999999702, 0.810000014454, 0.450000036508, 1.27000000954, 0.290000009388, 1.31000002339, 0.320000006557, 0.770000029653, 0.779999997169, 0.650000014156, 0.209999998063, 0.870000023693, -0.180000030696, 0.660000013709, -0.0400000026822, 0.0800000038743, -0.200000023842, 0.600000032783, -0.50000000596, 0.30000000447, 0.0399999982119, 0.320000012517, -0.180000030696, 0.660000013709, -0.420000000596, 0.540000026524, -0.420000022948, 0.340000019073, -0.220000009537, 0.340000014603, -0.0400000041723, 0.280000014305, -0.300000025332, 0.300000020862, 0.0599999913573, 0.580000008345, -0.260000004768, 0.620000025928, -0.440000005662, 0.480000009835, -0.0600000032783, 0.220000015497, -1.63912776685e-08, 0.600000010431, -0.280000009835, 0.560000009239, 
+
+L3_cTRMM_A_nn
+0.20000000298, 0.899999976158, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.10000000149, 0.20000000298, 0.40000000596, 0.40000000596, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.300000011921, 0.5, 0.600000023842, 0.40000000596, 0.40000000596, 0.10000000149, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.899999976158, 0.300000011921, 0.800000011921, 0.899999976158, 0.10000000149, 0.40000000596, 0.20000000298, 0.20000000298, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.699999988079, 0.10000000149, 0.699999988079, 0.5, 0.800000011921, 0.40000000596, 0.899999976158, 0.20000000298, 0.10000000149, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.699999988079, 0.40000000596, 0.899999976158, 0.10000000149, 0.5, 0.40000000596, 0.899999976158, 0.699999988079, 0.899999976158, 0.40000000596, 0.300000011921, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.800000011921, 0.800000011921, 0.5, 0.899999976158, 0.40000000596, 0.699999988079, 0.5, 0.20000000298, 0.899999976158, 0.20000000298, 0.5, 0.600000023842, 0.300000011921, 0.10000000149, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.10000000149, 0.20000000298, 0.699999988079, 0.899999976158, 0.5, 0.699999988079, 0.10000000149, 0.600000023842, 0.800000011921, 0.800000011921, 0.5, 0.899999976158, 0.5, 0.5, 0.899999976158, 0.800000011921, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.5, 0.300000011921, 0.5, 0.899999976158, 0.600000023842, 0.40000000596, 0.40000000596, 0.699999988079, 0.800000011921, 0.699999988079, 0.699999988079, 0.40000000596, 0.699999988079, 0.899999976158, 0.300000011921, 0.899999976158, 0.40000000596, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.300000011921, 0.20000000298, 0.10000000149, 0.20000000298, 0.899999976158, 0.300000011921, 0.699999988079, 0.600000023842, 0.20000000298, 0.600000023842, 0.20000000298, 0.899999976158, 0.600000023842, 0.5, 0.5, 0.899999976158, 0.300000011921, 0.10000000149, 0.20000000298, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.699999988079, 0.800000011921, 0.20000000298, 0.20000000298, 0.699999988079, 0.5, 0.300000011921, 0.699999988079, 0.20000000298, 0.800000011921, 0.800000011921, 0.10000000149, 0.300000011921, 0.600000023842, 0.10000000149, 0.300000011921, 0.899999976158, 0.10000000149, 0.40000000596, 0.800000011921, 0.20000000298, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.600000023842, 0.800000011921, 0.699999988079, 0.899999976158, 0.800000011921, 0.300000011921, 0.800000011921, 0.5, 0.10000000149, 0.40000000596, 0.300000011921, 0.40000000596, 0.40000000596, 0.600000023842, 0.20000000298, 0.600000023842, 0.300000011921, 0.40000000596, 0.40000000596, 0.5, 0.800000011921, 0.40000000596, 0.10000000149, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.899999976158, 0.40000000596, 0.20000000298, 0.600000023842, 0.600000023842, 0.600000023842, 0.20000000298, 0.899999976158, 0.600000023842, 0.800000011921, 0.300000011921, 0.20000000298, 0.699999988079, 0.899999976158, 0.300000011921, 0.899999976158, 0.800000011921, 0.800000011921, 0.800000011921, 0.5, 0.600000023842, 0.699999988079, 0.40000000596, 0.300000011921, 0.899999976158, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.10000000149, 0.800000011921, 0.40000000596, 0.699999988079, 0.20000000298, 0.300000011921, 0.800000011921, 0.600000023842, 0.40000000596, 0.20000000298, 0.800000011921, 0.600000023842, 0.5, 0.10000000149, 0.40000000596, 0.40000000596, 0.10000000149, 0.699999988079, 0.300000011921, 0.300000011921, 0.600000023842, 0.40000000596, 0.20000000298, 0.20000000298, 0.800000011921, 0.300000011921, 0.40000000596, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.20000000298, 0.300000011921, 0.40000000596, 0.699999988079, 0.20000000298, 0.40000000596, 0.20000000298, 0.300000011921, 0.40000000596, 0.5, 0.40000000596, 0.300000011921, 0.40000000596, 0.800000011921, 0.5, 0.699999988079, 0.40000000596, 0.20000000298, 0.800000011921, 0.699999988079, 0.899999976158, 0.699999988079, 0.5, 0.20000000298, 0.800000011921, 0.600000023842, 0.300000011921, 0.5, 0.10000000149, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.10000000149, 0.5, 0.10000000149, 0.20000000298, 0.20000000298, 0.40000000596, 0.40000000596, 0.40000000596, 0.10000000149, 0.899999976158, 0.699999988079, 0.699999988079, 0.600000023842, 0.600000023842, 0.899999976158, 0.10000000149, 0.300000011921, 0.800000011921, 0.899999976158, 0.899999976158, 0.899999976158, 0.300000011921, 0.600000023842, 0.10000000149, 0.20000000298, 0.899999976158, 0.800000011921, 0.20000000298, 0.40000000596, 0.300000011921, 0.300000011921, 0.0, 0.0, 0.800000011921, 0.40000000596, 0.800000011921, 0.40000000596, 0.20000000298, 0.5, 0.800000011921, 0.899999976158, 0.899999976158, 0.10000000149, 0.800000011921, 0.20000000298, 0.800000011921, 0.600000023842, 0.300000011921, 0.600000023842, 0.300000011921, 0.40000000596, 0.800000011921, 0.899999976158, 0.40000000596, 0.300000011921, 0.5, 0.899999976158, 0.20000000298, 0.5, 0.600000023842, 0.699999988079, 0.300000011921, 0.600000023842, 0.40000000596, 0.600000023842, 0.300000011921, 0.40000000596, 
+
+L3_cTRMM_o_RLT
+-0.0499999977648, 0.19999999851, 0.0, 0.690000020564, 0.220000025928, 1.24000003994, -0.119999972284, 1.80000002235, 0.499999985844, 2.47000002071, 1.51999994099, 2.52999999866, 0.29999999702, 2.84000002429, -0.530000004619, 4.62000002667, -0.110000024885, 4.5400000228, -0.339999979585, 3.36000003532, -1.12000000656, 3.98000002921, -0.0599999630451, 5.09000008389, -0.590000014603, 6.07000006318, 0.0400000190735, 5.19000006974, -0.629999966621, 5.10000006333, -0.809999958575, 5.26000009045, -0.469999935776, 7.20000013337, -0.190000001192, 0.419999999106, 0.10000000447, 0.63000001654, 0.430000026226, 1.04000003472, 0.570000022203, 1.91000001669, 1.29999997988, 1.78000002474, 1.81999998048, 2.8100000003, 1.06000002563, 3.38000003889, 0.929999952465, 5.0799999994, 1.58999994829, 4.72000002518, 1.24999997839, 4.06000001892, 0.209999980181, 4.28000007316, 1.21000002787, 5.49000013605, 1.09999997392, 5.90000008792, 0.83000001356, 5.43000014022, 0.890000019819, 5.60000008866, 0.989999984801, 6.77000004828, 1.35000002608, 7.62000014514, -0.539999993742, 0.969999961853, -0.0700000058115, 0.979999991953, 0.18000001207, 1.92000000432, 0.209999977201, 2.86999995068, 0.549999929965, 3.01999998197, 1.06999991044, 3.74999996051, -0.0899999855459, 4.6399999848, -0.390000008643, 4.98999997437, 0.939999930412, 5.1500000298, 0.389999995977, 3.47000006616, -0.52000011161, 4.48000004187, 0.51999998793, 6.350000076, 0.53999991551, 8.0200000684, 0.239999934137, 6.27000008255, 0.599999951571, 7.0100001061, -0.190000031739, 7.09000009581, -0.200000014156, 9.31000015229, -0.349999986589, 0.549999989569, 0.110000009984, 0.470000017732, 0.190000031739, 0.890000032485, 0.390000005662, 1.55000000969, 0.569999988675, 2.23000000462, 0.789999979585, 2.57999998152, 0.549999973178, 2.92000003859, 0.309999955595, 3.64000002131, 1.44999990836, 4.17000003189, 1.01999997079, 2.88000005081, 0.75999995932, 4.12000006616, 1.32000002369, 4.28000013053, 1.70999994591, 6.17000011235, 0.150000018626, 4.17000011086, 1.08999998629, 5.71000009939, 0.559999984652, 6.12000002593, 0.440000061542, 7.31000016198, -0.449999974668, 0.949999956787, 0.229999992698, 0.689999995977, 0.580000026226, 1.36000000328, 1.07999994725, 2.22999995619, 1.5099999541, 2.46000000328, 1.99999989942, 2.92999999642, 1.27999995321, 4.01999997824, 1.23999995053, 4.65999997795, 1.63999995723, 5.58999996766, 1.13999998704, 4.13000001952, 0.669999960363, 5.82000000432, 2.09999999553, 5.76000010684, 1.18999996915, 7.4600000748, 1.33999998108, 5.62000011757, 1.77999997109, 6.42000006616, 1.71999991044, 6.76000004724, 1.75999998987, 8.40000013933, -0.119999994636, 0.310000004768, -0.290000007898, 0.440000014603, -0.0499999880791, 0.870000042319, -0.489999992251, 1.46000004575, 0.34999999851, 2.01000004426, 0.619999993891, 3.05000002086, 0.26000002265, 2.95000007376, -0.610000015199, 4.52000000432, 1.12999991521, 5.20000003949, 0.799999967963, 4.41000006661, 0.339999928921, 4.64000010177, 0.449999976903, 6.20000017807, 0.459999905676, 7.94000013158, -0.470000032634, 6.16000015303, 0.519999950677, 7.09000008762, 0.149999950081, 8.36000007331, -0.59999993518, 9.28000022888, -0.119999994636, 0.310000004768, -0.249999997765, 0.40000000447, -0.149999988079, 1.0300000307, -0.719999984205, 1.30000001714, -0.0999999985099, 2.56000004351, 0.149999987334, 2.89000001311, -0.529999977052, 2.82000004828, -1.3499999471, 3.5400000079, -0.340000010133, 4.40000003129, -0.509999987632, 3.44000001386, -0.49000004366, 4.94000005037, -0.690000028759, 4.96000008896, 0.269999961108, 6.73000012755, -0.81000003159, 5.29000010625, -0.489999994487, 6.66000005543, -1.00000000298, 7.27999995396, -0.8699999924, 8.25000009984, -0.0499999977648, 0.19999999851, 0.0, 0.290000014603, 0.0900000093877, 0.6900000377, -0.0200000102818, 1.08000002399, 0.659999934733, 2.1600000532, 0.949999964982, 3.16000000328, 0.399999985844, 3.11000004947, -0.929999945015, 4.41000004798, 0.120000024438, 4.89000004515, 0.320000044554, 4.18000002176, -0.119999998361, 5.15000008568, 0.450000029802, 5.11000013292, 1.06999999613, 6.93000019833, -0.35999995634, 5.96000017613, 0.50000000447, 6.42000015557, -0.169999943972, 8.06000004351, 0.460000067353, 9.7000001274, -0.119999994636, 0.310000004768, 0.0299999986589, 0.440000011623, 0.340000024289, 0.830000035167, 0.130000006855, 1.45000002012, 0.629999998659, 1.88000003219, 0.509999994338, 2.63000002697, 0.280000000894, 3.23000005752, -0.760000001043, 4.45000000522, 0.0399999758601, 5.2600000301, 0.1199999924, 4.28000008658, 0.0399999579787, 5.1700001049, 0.60999996677, 6.03000015885, -0.130000023246, 8.57000011981, -0.380000005364, 6.47000017196, 0.0799999830127, 8.20000010282, 0.129999892861, 8.78000005901, -0.219999980479, 9.70000022873, -0.360000009239, 0.929999963641, -0.0300000075996, 0.320000003576, 0.25, 1.05000002235, 0.319999938756, 1.58000002399, 0.979999971837, 2.59000001535, 0.559999954849, 3.36999998719, 0.629999933094, 3.99000004515, -0.880000023991, 4.76999999836, 0.57999994427, 6.07000003561, -0.279999985993, 4.76000003904, 0.0199999335408, 5.36000010833, 0.269999950677, 5.7800001812, 0.599999976158, 8.3600001277, -0.709999995828, 5.8500001289, 0.689999985546, 7.53000014022, -0.420000028163, 8.05000004396, 0.150000028312, 9.57000013173, 
+
+L3_zTRMM_A_mm
+0.9, 0.9, 0.6, 0.1, 0.9, 0.2, 0.2, 0.6, 0.9, 0.9, 0.7, 0.6, 0.8, 0.8, 0.4, 0.3, 0.4, 0.8, 0.9, 0.5, 0.0, 0.0, 0.7, 0.5, 0.8, 0.1, 0.9, 0.2, 0.3, 0.1, 0.4, 0.6, 0.7, 0.7, 0.9, 0.8, 0.3, 0.3, 0.7, 0.1, 0.0, 0.0, 0.0, 0.0, 0.4, 0.9, 0.1, 0.9, 0.1, 0.6, 0.5, 0.9, 0.8, 0.6, 0.3, 0.8, 0.6, 0.7, 0.2, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, 0.9, 0.8, 0.8, 0.4, 0.5, 0.7, 0.3, 0.6, 0.8, 0.6, 0.7, 0.7, 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.6, 0.7, 0.2, 0.5, 0.8, 0.5, 0.9, 0.6, 0.1, 0.1, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, 0.6, 0.5, 0.8, 0.7, 0.1, 0.2, 0.2, 0.7, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.9, 0.1, 0.6, 0.5, 0.5, 0.8, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6, 0.1, 0.8, 0.9, 0.7, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.2, 0.1, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7, 0.8, 
+
+L3_zTRMM_B_mn
+0.8, 0.2, 0.7, 0.9, 0.2, 0.9, 0.2, 0.5, 0.1, 0.7, 0.6, 0.9, 0.4, 0.7, 0.2, 0.6, 0.4, 0.9, 0.1, 0.6, 0.3, 0.4, 0.5, 0.3, 0.9, 0.2, 0.6, 0.4, 0.2, 0.7, 0.8, 0.8, 0.2, 0.4, 0.9, 0.9, 0.5, 0.5, 0.3, 0.9, 0.7, 0.7, 0.2, 0.8, 0.4, 0.1, 0.5, 0.3, 0.2, 0.2, 0.4, 0.3, 0.9, 0.8, 0.3, 0.9, 0.8, 0.7, 0.1, 0.6, 0.6, 0.5, 0.1, 0.7, 0.4, 0.8, 0.6, 0.6, 0.6, 0.4, 0.4, 0.7, 0.1, 0.4, 0.9, 0.4, 0.9, 0.8, 0.6, 0.9, 0.4, 0.4, 0.7, 0.8, 0.9, 0.3, 0.8, 0.8, 0.1, 0.2, 0.7, 0.9, 0.4, 0.9, 0.4, 0.3, 0.4, 0.8, 0.7, 0.6, 0.2, 0.2, 0.1, 0.6, 0.5, 0.2, 0.2, 0.2, 0.7, 0.1, 0.7, 0.7, 0.1, 0.8, 0.9, 0.3, 0.7, 0.2, 0.8, 0.3, 0.2, 0.3, 0.4, 0.7, 0.8, 0.1, 0.8, 0.1, 0.2, 0.6, 0.8, 0.7, 0.9, 0.1, 0.4, 0.9, 0.1, 0.3, 0.1, 0.9, 0.2, 0.9, 0.1, 0.4, 0.5, 0.9, 0.2, 0.2, 0.4, 0.1, 0.7, 0.1, 0.6, 0.9, 0.5, 0.9, 0.9, 0.8, 0.2, 0.2, 0.7, 0.6, 0.8, 0.1, 0.8, 0.8, 0.6, 0.2, 0.4, 0.3, 0.2, 0.5, 0.6, 0.2, 0.1, 0.6, 0.5, 0.7, 0.5, 0.1, 0.7, 0.3, 0.8, 0.3, 0.5, 0.1, 0.2, 0.8, 0.8, 0.2, 0.7, 0.1, 0.5, 0.5, 0.1, 0.2, 0.5, 0.9, 0.5, 0.4, 0.4, 0.6, 0.8, 0.7, 0.8, 0.9, 0.8, 0.8, 0.8, 0.2, 0.4, 0.2, 0.8, 0.8, 0.6, 0.9, 0.9, 0.1, 0.5, 0.9, 0.8, 0.3, 0.6, 0.3, 0.2, 0.3, 0.1, 0.3, 0.9, 0.7, 0.2, 0.7, 0.7, 0.4, 0.4, 0.6, 0.1, 0.1, 0.5, 0.7, 0.3, 0.7, 0.6, 0.9, 0.9, 0.3, 0.7, 0.7, 0.7, 0.4, 0.8, 0.7, 0.3, 0.6, 0.7, 0.3, 0.8, 0.8, 0.1, 0.7, 0.1, 0.9, 0.8, 0.4, 0.6, 0.3, 0.7, 0.2, 0.6, 0.8, 0.4, 0.5, 0.9, 0.7, 0.1, 0.3, 0.3, 0.8, 0.8, 0.1, 0.7, 0.2, 0.7, 0.8, 0.3, 0.4, 0.6, 0.9, 0.1, 0.5, 0.1, 0.9, 0.4, 0.3, 0.2, 0.6, 0.4, 0.6, 0.1, 0.7, 0.7, 0.3, 0.2, 0.1, 0.4, 0.3, 0.9, 0.6, 0.9, 0.7, 0.5, 0.2, 0.8, 0.4, 0.4, 0.6, 0.5, 0.8, 0.5, 0.8, 0.4, 0.7, 0.9, 0.4, 0.9, 0.1, 0.6, 0.4, 0.2, 0.6, 0.4, 0.3, 0.9, 0.7, 0.1, 0.6, 0.3, 0.8, 0.8, 0.6, 
+
+L3_zTRMM_o_LUN
+0.99, 6.8, 0.02, 7.17, -1.25, 5.9, 1.74, 5.65, 0.05, 7.46, -0.22, 7.01, 1.53, 6.09, 0.21, 6.39, 0.72, 6.71, 0.91, 6.4, 0.24, 5.61, 0.28, 5.43, 1.2, 6.83, 0.6, 6.05, -0.12, 7.12, 0.78, 6.95, 0.38, 5.06, 0.82, 5.65, 1.03, 4.89, 0.01, 4.43, 2.64, 4.23, 1.51, 5.86, 1.03, 5.44, 2.44, 4.73, 1.08, 4.45, 2.38, 4.09, 1.84, 5.37, 0.32, 4.06, 0.51, 4.36, 1.5, 4.54, 0.74, 4.48, 1.47, 5.03, 1.05, 4.76, 0.92, 4.3, -1.37, 4.53, -1.43, 4.04, -1.83, 3.27, 0.09, 4.58, -1.2, 5.42, -1.67, 4.98, -0.09, 4.66, -1.24, 5.15, -0.96, 4.71, -1.43, 4.75, -1.34, 3.21, -2.01, 3.87, -1.02, 4.76, -1.88, 4.17, -1.14, 4.85, -1.21, 4.59, -1.43, 3.4, -0.5, 4.98, -0.35, 4.62, -0.87, 4.09, 1.29, 4.26, 0.08, 5.69, -0.61, 5.01, 1.07, 4.73, 0.31, 4.83, 0.52, 5.05, -0.05, 4.84, -0.28, 4.6, -0.76, 3.49, 1.04, 4.74, -0.31, 4.81, 0.5, 5.3, 0.33, 4.44, -0.39, 4.48, -0.37, 3.18, -0.87, 2.69, -0.69, 3.19, 0.69, 2.49, -0.26, 3.09, 0.17, 3.02, 0.73, 2.93, -0.21, 2.79, -0.12, 3.33, -0.09, 3.36, -0.27, 2.12, -0.8, 1.88, -0.03, 3.26, -0.14, 3.12, 0.51, 2.92, -0.5, 2.7, 0.25, 2.16, 0.01, 3.61, 0.29, 3.37, 0.38, 2.73, 1.0, 2.68, 0.42, 2.9, 0.1, 3.2, 1.01, 3.16, -0.32, 2.79, 0.53, 2.95, 1.45, 2.9, 0.48, 2.21, -0.53, 2.31, 0.37, 2.38, -0.26, 3.17, 0.33, 2.29, -0.39, 2.82, 0.52, 2.76, -0.3, 2.91, -0.46, 2.24, -0.33, 2.09, 0.72, 2.0, -0.44, 2.5, -0.69, 2.81, -0.05, 2.53, -1.03, 2.39, 0.26, 2.15, -0.2, 2.04, -0.21, 1.25, -0.99, 1.27, -0.39, 2.4, -0.48, 2.01, -0.1, 2.2, -0.79, 1.86, 0.19, 1.48, 0.83, 2.44, 0.41, 1.45, 0.1, 1.75, 1.54, 1.51, 0.89, 1.78, 0.41, 2.24, 0.48, 1.75, -0.07, 2.22, 0.57, 1.2, 0.28, 1.62, 0.38, 1.43, -0.39, 1.67, 0.44, 1.45, 0.27, 1.56, 0.64, 1.5, 0.4, 1.42, 0.68, 1.52, 0.07, 0.47, -0.02, 0.24, -0.07, 0.29, 0.18, 0.3, 0.08, 0.28, -0.05, 0.43, -0.05, 0.27, -0.09, 0.41, -0.03, 0.25, -0.08, 0.3, 0.04, 0.24, -0.12, 0.24, -0.03, 0.27, -0.1, 0.32, 0.03, 0.27, -0.03, 0.17, 0.04, 0.28, 0.15, 1.14, 0.07, 1.21, 0.19, 0.54, 0.24, 0.92, -0.2, 0.74, -0.29, 0.96, -0.29, 0.96, -0.28, 0.81, 0.31, 1.0, 0.55, 0.79, 0.1, 0.76, -0.34, 0.58, 0.04, 0.53, 0.07, 1.21, -0.41, 0.5, -0.43, 0.8, 0.08, 1.06, 
+
+L3_zTRMM_A_nn
+0.9, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, 0.8, 0.5, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.2, 0.4, 0.4, 0.8, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.7, 0.3, 0.7, 0.7, 0.1, 0.4, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.8, 0.2, 0.8, 0.4, 0.6, 0.1, 0.4, 0.3, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, 0.9, 0.8, 0.3, 0.1, 0.7, 0.8, 0.7, 0.4, 0.1, 0.4, 0.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.9, 0.1, 0.2, 0.7, 0.5, 0.5, 0.8, 0.4, 0.9, 0.4, 0.9, 0.8, 0.2, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.3, 0.7, 0.2, 0.6, 0.8, 0.6, 0.5, 0.8, 0.7, 0.1, 0.5, 0.1, 0.7, 0.6, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.9, 0.7, 0.8, 0.9, 0.7, 0.9, 0.2, 0.2, 0.5, 0.7, 0.3, 0.2, 0.6, 0.4, 0.8, 0.4, 0.2, 0.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7, 0.1, 0.1, 0.2, 0.8, 0.9, 0.5, 0.9, 0.5, 0.1, 0.8, 0.1, 0.7, 0.9, 0.3, 0.3, 0.4, 0.5, 0.6, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6, 0.6, 0.4, 0.8, 0.9, 0.4, 0.6, 0.1, 0.9, 0.8, 0.3, 0.4, 0.5, 0.2, 0.5, 0.9, 0.8, 0.9, 0.8, 0.2, 0.2, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.2, 0.1, 0.7, 0.6, 0.8, 0.8, 0.3, 0.1, 0.9, 0.9, 0.6, 0.4, 0.9, 0.6, 0.3, 0.4, 0.4, 0.6, 0.3, 0.7, 0.9, 0.3, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6, 0.2, 0.9, 0.7, 0.1, 0.1, 0.1, 0.7, 0.5, 0.4, 0.4, 0.2, 0.4, 0.9, 0.4, 0.3, 0.9, 0.6, 0.1, 0.1, 0.6, 0.6, 0.9, 0.9, 0.6, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, 0.9, 0.8, 0.9, 0.3, 0.1, 0.6, 0.4, 0.2, 0.7, 0.5, 0.5, 0.9, 0.7, 0.8, 0.2, 0.9, 0.9, 0.8, 0.6, 0.6, 0.6, 0.5, 0.4, 0.9, 0.9, 0.9, 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.1, 0.3, 0.9, 0.4, 0.4, 0.3, 0.8, 0.4, 0.2, 0.1, 0.9, 0.2, 0.1, 0.4, 0.8, 0.8, 0.7, 0.4, 0.8, 0.6, 0.6, 0.3, 0.6, 0.6, 0.8, 0.2, 0.3, 0.6, 0.3, 0.0, 0.0, 0.0, 0.0, 0.1, 0.3, 0.8, 0.3, 0.5, 0.8, 0.5, 0.2, 0.1, 0.4, 0.1, 0.8, 0.1, 0.3, 0.1, 0.5, 0.3, 0.4, 0.7, 0.1, 0.9, 0.4, 0.8, 0.4, 0.5, 0.8, 0.1, 0.2, 0.9, 0.7, 0.9, 0.7, 0.0, 0.0, 0.5, 0.8, 0.1, 0.4, 0.3, 0.8, 0.5, 0.1, 0.7, 0.8, 0.2, 0.1, 0.7, 0.8, 0.4, 0.5, 0.8, 0.1, 0.1, 0.7, 0.6, 0.2, 0.1, 0.9, 0.3, 0.8, 0.6, 0.9, 0.8, 0.5, 0.3, 0.1, 0.4, 0.4, 
+
+L3_zTRMM_o_RLT
+0.68, 0.34, 0.65, 1.39, 0.01, 1.64, -0.45, 2.23, -1.61, 2.3, -0.2, 3.47, -0.68, 4.18, -1.49, 3.94, -1.24, 5.33, -0.96, 4.94, -2.05, 6.79, -2.69, 6.35, -0.45, 6.88, -0.38, 9.54, -2.87, 6.99, -1.41, 7.93, -1.92, 8.22, 0.63, 0.99, 0.15, 1.79, 0.06, 1.66, -0.48, 2.3, -1.89, 2.65, -0.25, 3.97, 0.6, 4.21, -0.71, 4.07, -0.61, 4.96, 0.52, 5.05, -0.35, 6.57, -1.46, 6.6, -0.71, 6.71, -0.18, 9.45, -2.25, 7.34, -1.0, 7.84, -2.61, 8.77, 0.46, 0.48, 0.22, 1.23, -0.06, 1.03, -0.28, 1.58, -1.16, 2.42, 0.56, 3.61, 0.77, 4.34, 0.07, 4.48, 0.03, 5.49, 1.35, 5.4, 0.66, 7.17, -0.89, 7.1, -0.22, 7.77, 0.46, 10.3, -2.16, 8.22, -0.84, 8.38, -1.35, 8.4, -0.03, 0.56, -0.19, 0.76, 0.13, 0.7, -0.02, 0.88, -0.74, 1.76, 0.18, 2.32, 0.4, 3.54, 0.43, 3.24, 0.64, 4.16, 1.31, 4.65, 0.51, 5.56, -0.16, 6.16, 1.88, 6.69, 1.6, 7.75, 0.56, 6.56, 1.67, 6.56, 0.82, 8.05, 0.03, 0.29, -0.29, 0.79, -0.46, 1.29, -0.79, 1.27, -1.92, 1.53, -1.08, 2.27, -0.82, 2.93, -0.85, 3.44, -1.46, 3.96, -0.42, 4.12, -1.46, 7.03, -1.83, 5.73, -0.73, 6.4, -0.34, 8.42, -1.59, 7.39, -0.2, 8.02, -0.52, 7.91, 0.08, 0.49, 0.02, 0.78, 0.02, 1.02, -0.22, 1.48, -0.86, 1.68, -0.02, 2.45, 0.85, 3.46, 0.22, 3.14, 0.39, 3.69, 0.59, 4.02, 1.03, 5.49, 0.66, 6.04, 0.58, 5.5, 1.24, 7.87, -0.51, 6.34, 0.74, 6.02, -0.06, 7.53, 0.54, 0.97, 0.16, 1.92, 0.64, 1.47, -0.21, 1.83, -1.12, 3.08, 0.47, 4.34, 1.14, 5.05, 0.66, 5.18, 0.85, 6.78, 2.5, 5.61, 0.81, 7.2, -0.08, 6.99, 1.0, 7.67, 1.03, 10.52, -0.82, 7.62, -0.04, 7.88, -0.17, 8.78, 0.31, 0.73, -0.15, 1.37, 0.06, 1.61, -0.21, 1.83, -1.5, 2.66, 0.07, 3.83, 1.01, 4.59, -0.37, 5.05, -0.49, 6.0, 1.19, 6.21, 0.28, 7.13, -1.6, 7.11, -0.82, 7.62, 0.58, 10.38, -1.31, 7.82, -0.37, 8.84, -1.13, 8.87, 0.67, 0.81, 0.15, 1.45, 0.05, 1.28, -0.15, 1.65, -0.83, 2.31, 0.34, 3.32, 1.38, 3.71, 0.06, 3.88, -0.02, 5.03, 0.67, 4.99, -0.4, 6.3, -0.87, 6.21, -0.53, 5.9, -0.89, 8.76, -2.33, 6.27, -1.21, 6.44, -1.67, 6.86, 0.69, 0.72, 0.55, 1.73, 0.57, 1.31, 0.02, 2.04, -0.92, 2.86, 0.94, 4.17, 0.86, 4.52, 0.14, 4.3, 0.54, 6.13, 1.47, 5.42, 0.98, 7.12, -0.32, 6.92, 0.38, 7.38, 1.8, 10.75, -0.82, 7.84, -0.14, 7.28, -0.41, 9.23, 
+
+L3_sTRSM_A_mm
+1.0, 4.0, 4.0, 2.0, 3.0, 6.0, 9.0, 9.0, 3.0, 8.0, 0.0, 2.0, 3.0, 8.0, 3.0, 6.0, 5.0, 1.0, 9.0, 5.0, 0.0, 0.0, 2.0, 2.0, 5.0, 7.0, 1.0, 8.0, 2.0, 1.0, 0.0, 0.0, 0.0, 5.0, 5.0, 8.0, 1.0, 1.0, 5.0, 2.0, 0.0, 0.0, 0.0, 0.0, 6.0, 6.0, 5.0, 6.0, 8.0, 7.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.0, 2.0, 1.0, 7.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.0, 4.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 8.0, 3.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 
+
+L3_sTRSM_B_mn
+0.5, 0.6, 0.6, 0.8, 0.9, 0.2, 0.5, 0.7, 0.8, 0.7, 0.8, 0.6, 0.1, 0.2, 0.6, 0.4, 0.6, 0.2, 0.9, 0.6, 0.4, 0.2, 0.6, 0.4, 0.4, 0.1, 0.6, 0.2, 0.1, 0.2, 0.7, 0.1, 0.9, 0.2, 0.1, 0.5, 0.5, 0.6, 0.9, 0.6, 0.2, 0.4, 0.4, 0.9, 0.6, 0.4, 0.2, 0.2, 0.4, 0.4, 0.3, 0.4, 0.4, 0.5, 0.1, 0.7, 0.2, 0.3, 0.7, 0.3, 0.2, 0.9, 0.4, 0.8, 0.7, 0.7, 0.9, 0.4, 0.5, 0.1, 0.4, 0.3, 0.9, 0.1, 0.8, 0.3, 0.6, 0.7, 0.9, 0.7, 0.2, 0.1, 0.1, 0.8, 0.8, 0.6, 0.8, 0.2, 0.7, 0.4, 0.4, 0.8, 0.8, 0.3, 0.3, 0.3, 0.6, 0.6, 0.5, 0.9, 0.5, 0.7, 0.8, 0.5, 0.4, 0.8, 0.1, 0.5, 0.7, 0.7, 0.6, 0.6, 0.4, 0.9, 0.3, 0.9, 0.1, 0.9, 0.4, 0.3, 0.4, 0.1, 0.3, 0.5, 0.7, 0.4, 0.7, 0.1, 0.9, 0.1, 0.5, 0.7, 0.9, 0.9, 0.1, 0.6, 0.3, 0.8, 0.8, 0.5, 0.5, 0.5, 0.6, 0.4, 0.7, 0.7, 0.2, 0.4, 0.6, 0.5, 0.4, 0.4, 0.2, 0.1, 0.7, 0.4, 0.7, 0.1, 0.4, 0.4, 0.5, 0.1, 0.5, 0.5, 0.9, 0.9, 0.9, 0.6, 0.5, 0.1, 
+
+L3_sTRSM_o_LUN
+1.46520638466, -1.54896688461, 1.99039387703, -2.01419639587, 1.81852555275, -0.895377159119, -1.13288402557, -0.886934757233, 4.2189283371, -1.06383061409, -1.27475452423, -3.97711014748, -3.44645786285, -3.54849243164, -2.61162471771, -1.03318476677, -1.06028676033, -0.666151702404, -0.401585698128, -1.12818288803, -0.364658713341, -0.545352995396, -0.39260995388, -0.161377370358, -0.200671315193, -1.51934599876, -0.355410814285, 0.0172800421715, 0.257222175598, 0.371354043484, 0.153767347336, 0.533437430859, -0.428796291351, 0.320115804672, -0.00877776741982, 0.209888875484, 0.397222280502, 0.205888926983, 0.133555576205, 0.169222265482, -0.0421110987663, -0.178222194314, 0.440888911486, 0.202777802944, -0.174555510283, -0.245333313942, -0.394999951124, -0.340666621923, -0.396999955177, -0.0332221984863, -0.263444423676, 0.0949467644095, 0.0233287215233, 0.131134271622, -0.0575671195984, 0.0300439726561, 0.0690300837159, -0.0392546504736, 0.0696573853493, 0.135557845235, 0.0204282253981, -0.0239398255944, -0.0935555547476, 0.000208348035812, 0.110284730792, -0.0436250045896, 0.0934073925018, -0.0557685121894, -0.144363433123, -0.428495377302, -0.0853009298444, -0.417349547148, 0.0290393531322, -0.261446774006, -0.22891202569, -0.391990721226, 0.0170254632831, -0.172511577606, -0.132893532515, -0.434444457293, -0.467708319426, -0.52253472805, -0.461875021458, -0.210740745068, -0.121898137033, 0.0496874935925, 0.345624983311, 0.0218749940395, 0.374062478542, 0.0165624953806, 0.158437490463, 0.204374969006, 0.326249986887, -0.122812509537, 0.129687488079, 0.276874989271, 0.490000009537, 0.496874988079, 0.444062501192, 0.474375009537, 0.219999998808, 0.148749992251, 0.140555560589, 0.112222224474, 0.105555564165, 0.177222236991, -0.0161111094058, 0.0605555549264, 0.132222220302, 0.10444444418, 0.12722222507, 0.0694444552064, 0.101111114025, 0.18666665256, 0.0500000044703, 0.148333325982, -0.0299999900162, 0.204444423318, 0.0288888923824, 0.0145833343267, -0.0291666667908, -0.0541666671634, -0.0229166653007, 0.0270833335817, 0.0395833328366, -0.00416666828096, 0.0416666641831, -0.0354166664183, 0.0479166582227, -0.0208333339542, 0.0, 0.0124999955297, 0.0437499955297, 0.0624999962747, -0.0333333350718, 0.0583333335817, 0.00555555894971, -0.177777782083, -0.0444444417953, -0.227777779102, 0.0388888902962, -0.0944444462657, -0.0777777731419, -0.155555546284, 0.0722222179174, -0.105555556715, -0.188888892531, -0.333333343267, -0.300000011921, -0.316666662693, -0.200000017881, -0.155555546284, -0.0111111104488, 0.0333333350718, 0.233333334327, 0.133333340287, 0.233333334327, 0.0333333350718, 0.133333340287, 0.133333340287, 0.166666671634, 0.0333333350718, 0.166666671634, 0.166666671634, 0.300000011921, 0.300000011921, 0.300000011921, 0.200000017881, 0.166666671634, 0.0333333350718, 
+
+L3_sTRSM_A_nn
+0.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.5, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, 0.9, 0.6, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6, 0.8, 0.6, 0.6, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.9, 0.1, 0.9, 0.9, 0.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.3, 0.3, 0.7, 0.5, 0.6, 0.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, 0.5, 0.4, 0.3, 0.5, 0.7, 0.6, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.2, 0.2, 0.8, 0.5, 0.8, 0.7, 0.2, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.2, 0.5, 0.1, 0.7, 0.7, 0.2, 0.1, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.8, 0.1, 0.2, 0.7, 0.8, 0.8, 0.6, 0.5, 0.8, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.6, 0.3, 0.5, 0.2, 0.7, 0.2, 0.3, 0.6, 0.1, 0.3, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, 0.2, 0.6, 0.6, 0.5, 0.5, 0.7, 0.9, 0.4, 0.6, 0.4, 0.5, 0.9, 0.0, 0.0, 0.0, 0.0, 0.9, 0.2, 0.9, 0.6, 0.6, 0.2, 0.9, 0.5, 0.3, 0.1, 0.2, 0.1, 0.2, 0.3, 0.0, 0.0, 0.0, 0.6, 0.3, 0.4, 0.9, 0.8, 0.4, 0.7, 0.8, 0.9, 0.9, 0.7, 0.1, 0.6, 0.6, 0.4, 0.0, 0.0, 0.2, 0.5, 0.1, 0.6, 0.8, 0.9, 0.7, 0.6, 0.6, 0.6, 0.8, 0.8, 0.5, 0.4, 0.9, 0.1, 0.0, 0.3, 0.1, 0.8, 0.1, 0.5, 0.4, 0.3, 0.5, 0.8, 0.7, 0.3, 0.2, 0.2, 0.8, 0.2, 0.1, 0.6, 
+
+L3_sTRSM_o_RLT
+1.25, -0.0416666269302, 4.95833301544, -10.4583330154, 17.4166660309, -16.9270839691, 19.171875, -8.31944561005, 2.2704873085, -10.9107666016, 1.33900761604, 21.1916599274, -10.291601181, -63.9414329529, 106.560028076, -791.99621582, 176.765274048, 0.5, 1.08333325386, 0.0833339691162, -3.4166674614, 5.16666793823, -5.14583396912, 7.23958396912, -3.19444537163, -0.690971434116, -0.428475856781, -9.7613363266, 13.096663475, -3.03346061707, -11.6049003601, 33.1082611084, -259.884613037, 49.2269973755, 0.25, 0.625, 1.625, -3.79166698456, 7.75, -9.34374904633, 9.71354103088, -3.09722232819, 0.756597876549, -1.20798754692, -9.01191520691, 15.5116615295, -6.41001653671, -26.284286499, 52.0520133972, -386.388214111, 80.1968383789, 1.0, -0.16666662693, 4.83333301544, -11.5000009537, 21.1666660309, -22.5833320618, 24.5416660309, -8.88889122009, 1.09722340107, -9.61944675446, -5.17684555054, 31.7799949646, -14.3599767685, -73.6030273438, 128.730529785, -966.596191406, 211.087921143, 1.25, -0.874999940395, 7.125, -13.9583339691, 24.75, -24.46875, 27.1927089691, -11.6527795792, 1.77465426922, -13.7982635498, 2.30984330177, 31.5983257294, -15.9633569717, -90.2416534424, 148.418395996, -1105.81958008, 248.000167847, 1.5, 0.0833333730698, 0.0833334922791, -2.0833337307, 3.16666698456, -2.3958325386, 4.78125095367, -2.91666698456, -1.29374969006, -0.814582705498, -3.94930410385, 8.84333133698, -2.62183618546, -10.1927108765, 26.7363319397, -218.988800049, 43.3896217346, 2.0, -0.833333313465, 6.16666650772, -12.5, 16.8333320618, -9.16666889191, 11.8333330154, -9.22222328186, 3.62222337723, -20.1777763367, 26.3259296417, 1.99333024025, -2.24361944199, -57.2452316284, 72.9840316772, -545.544616699, 136.073165894, 0.75, 0.0416666865349, 0.0416667461395, -1.20833349228, 3.58333349228, -4.07291555405, 4.49479198456, -1.3472224474, -0.870485842228, 1.71076393127, -10.1390028, 12.0483312607, -3.9380273819, -7.00769615173, 24.7647743225, -204.368988037, 36.0493278503, 0.75, 0.70833337307, 3.70833349228, -9.875, 15.9166679382, -15.2395820618, 18.2447910309, -8.12500095367, 1.45729315281, -8.99479103088, -4.4704785347, 22.7283267975, -7.77897167206, -53.1657066345, 96.0997085571, -728.817810059, 157.212936401, 0.25, 0.958333313465, -1.04166650772, 0.874999284744, -3.58333301544, 5.07291603088, -3.66145801544, 0.458334028721, -0.807291805744, 1.47812449932, -0.457289814949, -3.18166708946, 3.58205962181, 16.2832775116, -22.6479034424, 147.264984131, -37.0808677673, 
+
+L3_dTRSM_A_mm
+6.0, 5.0, 8.0, 5.0, 2.0, 8.0, 5.0, 1.0, 4.0, 2.0, 0.0, 6.0, 5.0, 1.0, 8.0, 1.0, 4.0, 2.0, 3.0, 9.0, 0.0, 0.0, 2.0, 9.0, 1.0, 5.0, 7.0, 3.0, 9.0, 3.0, 0.0, 0.0, 0.0, 2.0, 2.0, 5.0, 7.0, 7.0, 9.0, 6.0, 0.0, 0.0, 0.0, 0.0, 8.0, 3.0, 2.0, 7.0, 2.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0, 8.0, 8.0, 5.0, 7.0, 7.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.0, 1.0, 6.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 7.0, 1.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 8.0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.0, 
+
+L3_dTRSM_B_mn
+0.5, 0.1, 0.8, 0.2, 0.7, 0.3, 0.1, 0.6, 0.5, 0.2, 0.2, 0.3, 0.6, 0.2, 0.2, 0.1, 0.3, 0.8, 0.1, 0.8, 0.9, 0.9, 0.2, 0.1, 0.8, 0.5, 0.4, 0.1, 0.8, 0.1, 0.7, 0.1, 0.7, 0.4, 0.4, 0.4, 0.1, 0.5, 0.3, 0.7, 0.2, 0.4, 0.2, 0.7, 0.2, 0.1, 0.5, 0.4, 0.4, 0.5, 0.2, 0.2, 0.1, 0.7, 0.5, 0.2, 0.1, 0.4, 0.3, 0.3, 0.1, 0.2, 0.8, 0.6, 0.6, 0.4, 0.1, 0.9, 0.7, 0.5, 0.1, 0.4, 0.2, 0.4, 0.3, 0.6, 0.1, 0.7, 0.2, 0.7, 0.4, 0.2, 0.2, 0.8, 0.2, 0.1, 0.7, 0.2, 0.9, 0.1, 0.8, 0.1, 0.3, 0.1, 0.8, 0.2, 0.9, 0.7, 0.2, 0.4, 0.4, 0.9, 0.5, 0.5, 0.4, 0.5, 0.9, 0.3, 0.7, 0.9, 0.8, 0.4, 0.4, 0.1, 0.1, 0.6, 0.7, 0.8, 0.3, 0.1, 0.7, 0.7, 0.3, 0.4, 0.9, 0.3, 0.8, 0.4, 0.2, 0.2, 0.9, 0.5, 0.4, 0.9, 0.9, 0.4, 0.9, 0.3, 0.7, 0.2, 0.7, 0.2, 0.6, 0.2, 0.5, 0.2, 0.7, 0.7, 0.6, 0.2, 0.1, 0.7, 0.2, 0.6, 0.7, 0.1, 0.2, 0.4, 0.1, 0.5, 0.6, 0.7, 0.9, 0.6, 0.4, 0.5, 0.7, 0.3, 0.2, 0.1, 
+
+L3_dTRSM_o_LUN
+0.0674593874008, -0.373323102679, 0.250619109623, -0.372651909722, -0.110824962798, -0.952495039683, 0.301252480159, -0.119270213294, 0.33933500744, -0.21607514881, 0.205055493552, -0.00562282986111, 0.187065972222, 0.541959325397, -0.185227244544, -0.919556361607, 0.200939980159, -0.378703497024, -1.12616629464, 0.42337983631, -0.506848958333, -0.670329241071, -1.51952380952, -0.146949404762, -0.92173735119, -0.153565848214, -0.906183035714, -0.129242931548, 0.175169270833, 0.103645833333, 0.433720238095, -0.73763578869, -1.77744977679, 0.443050595238, 0.313973214286, 1.19915178571, -0.332901785714, 0.693125, 0.808794642857, 1.95616071429, -0.0428571428571, 0.996785714286, 0.0232589285714, 0.833571428571, -0.0123660714286, -0.0934375, -0.2, -0.673392857143, 0.835223214286, 2.19111607143, -0.475982142857, -0.0440736607143, -0.242332589286, 0.0528013392857, -0.17453125, -0.186283482143, -0.410089285714, 0.0102678571429, -0.199933035714, 0.0122433035714, -0.123616071429, 0.0194308035714, -0.008828125, 0.078125, 0.200357142857, -0.171729910714, -0.498024553571, 0.0608928571429, 0.0580022321429, -0.0565959821429, -0.0576227678571, -0.01546875, -0.0106808035714, -0.0697321428571, 0.000446428571429, -0.0173883928571, -0.0406361607143, -0.00102678571429, -0.0215736607143, -0.058671875, -0.053125, -0.0385714285714, -0.0730915178571, 0.00891741071429, -0.0514285714286, -0.115446428571, -0.135803571429, -0.0654464285714, -0.03625, -0.223839285714, -0.0185714285714, -0.189285714286, -0.287321428571, -0.252767857143, -0.104642857143, -0.100267857143, 0.049375, 0.025, -0.215714285714, -0.201696428571, -0.163482142857, 0.0207142857143, 0.0499107142857, 0.153839285714, -0.0375892857143, 0.10875, 0.144732142857, 0.0217857142857, 0.132142857143, 0.253035714286, 0.202946428571, 0.196071428571, 0.0579464285714, -0.073125, -0.025, 0.207857142857, 0.171160714286, 0.0708035714286, 0.0396428571429, -0.0746428571429, 0.00964285714286, 0.0753571428571, 0.015, -0.00392857142857, 0.112857142857, -0.0285714285714, 0.0378571428571, -0.0367857142857, -0.0842857142857, -0.0567857142857, 0.0675, 6.93889390391e-18, -0.0314285714286, 0.0903571428571, 0.0917857142857, 0.0414285714286, 0.0225, -0.0675, 0.0725, -0.005, 0.0275, 0.01, -1.38777878078e-17, -0.065, -0.0425, -0.11, -0.0025, 0.0275, -1.38777878078e-17, -0.08, -0.0325, 0.0575, 0.01, 0.12, 0.14, 0.02, 0.04, 0.08, 0.02, 0.1, 0.12, 0.14, 0.18, 0.12, 0.08, 0.1, 0.14, 0.06, 0.04, 0.02, 
+
+L3_dTRSM_A_nn
+0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7, 0.2, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.7, 0.8, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.1, 0.8, 0.9, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7, 0.8, 0.7, 0.8, 0.3, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.2, 0.5, 0.9, 0.5, 0.6, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.2, 0.1, 0.7, 0.8, 0.6, 0.5, 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, 0.5, 0.8, 0.8, 0.8, 0.6, 0.9, 0.5, 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2, 0.3, 0.2, 0.2, 0.3, 0.2, 0.4, 0.8, 0.6, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7, 0.8, 0.1, 0.6, 0.2, 0.8, 0.1, 0.3, 0.2, 0.9, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, 0.6, 0.5, 0.6, 0.9, 0.8, 0.9, 0.3, 0.1, 0.6, 0.8, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.9, 0.2, 0.5, 0.1, 0.5, 0.7, 0.8, 0.8, 0.1, 0.3, 0.2, 0.9, 0.6, 0.0, 0.0, 0.0, 0.0, 0.9, 0.4, 0.4, 0.1, 0.7, 0.6, 0.2, 0.2, 0.8, 0.8, 0.3, 0.3, 0.8, 0.4, 0.0, 0.0, 0.0, 0.3, 0.1, 0.8, 0.9, 0.4, 0.4, 0.9, 0.6, 0.7, 0.6, 0.2, 0.3, 0.3, 0.8, 0.7, 0.0, 0.0, 0.6, 0.3, 0.5, 0.1, 0.5, 0.8, 0.9, 0.3, 0.3, 0.5, 0.2, 0.1, 0.7, 0.6, 0.4, 0.3, 0.0, 0.4, 0.6, 0.9, 0.9, 0.7, 0.9, 0.2, 0.8, 0.4, 0.8, 0.2, 0.7, 0.9, 0.6, 0.1, 0.4, 0.7, 
+
+L3_dTRSM_o_RLT
+0.555555555556, -1.44444444444, 1.4, -0.251851851852, -0.653333333333, 0.605185185185, -0.575111111111, 1.5635978836, -0.350548752834, -0.492165616864, 2.41928949358, -1.4215239215, -0.32576685983, 0.687357856723, -1.55104068435, -0.460651240234, -0.0668249165347, 0.888888888889, -2.61111111111, 1.4, 4.47037037037, -8.85333333333, -0.292037037037, 0.468222222222, 6.61756613757, -0.105922902494, -3.19099907617, 5.36577475435, 1.88985006019, -6.94746816998, 27.2790749139, -35.9615205641, 17.6737228874, -22.8409931072, 0.444444444444, 0.444444444444, -0.6, 1.78518518519, -2.18666666667, -0.398518518519, 0.00711111111112, 1.26306878307, 0.0351201814059, -0.0643634836651, -3.50119425548, 3.82691369223, -3.73240245234, 10.7776156883, -12.2439782121, 8.77068584173, -11.0944239527, 0.222222222222, -0.277777777778, 1.2, -1.10740740741, 0.306666666667, 0.150740740741, 1.08355555556, 0.0315343915344, -1.62815419501, 0.573850004199, 1.06845049131, -1.73797172532, 0.260862265894, 1.12333165365, -0.933043527817, -6.7320077972, 4.82082387292, 0.777777777778, -0.222222222222, -0.8, 3.20740740741, -4.82666666667, -0.655740740741, 0.862444444444, 2.73417989418, -0.322213151927, -0.700240026875, -2.4434164777, 4.85100422721, -6.36028516839, 19.5621218611, -23.6343706283, 14.799242671, -17.6038039532, 0.111111111111, 3.11111111111, -1.0, -1.7037037037, 4.13333333333, -1.17962962963, 0.237777777778, -2.57566137566, -1.29505668934, 2.35951457126, -7.47679516251, 3.27144648806, -1.24960401445, -2.20582850424, 6.690148952, -1.98253247723, 2.87346488765, 0.555555555556, 0.555555555556, -0.2, 0.348148148148, 0.826666666667, -1.14981481481, 0.970888888889, -0.242116402116, -1.09275283447, 0.595049802637, -0.697173091459, -1.22444002128, 0.891306836315, 0.375078945158, 0.103402950245, -1.75868379611, 0.986152500282, 0.111111111111, 3.11111111111, -2.20606726491e-15, -6.37037037037, 11.5333333333, -0.037962962963, -0.732222222222, -6.08042328042, -2.36117913832, 4.04449567481, -6.97067271353, -1.90430811008, 3.75936612917, -21.7177143697, 33.4798733338, -18.1277933982, 21.68599013, 1.0, -2.0, 0.8, 2.2, -4.44, 0.14, 0.912, 2.13142857143, -0.169306122449, -0.738176870748, 3.14530612245, -0.280707482993, -1.61797278912, 7.84074829932, -12.52898931, 6.62129640428, -7.17676856865, 0.666666666667, 1.16666666667, -1.2, 0.477777777778, 0.96, -1.41277777778, 1.20866666667, -1.00825396825, -0.489850340136, 1.30301486521, -3.07192743764, 0.761796086336, 0.257254598136, 0.094609473419, 0.00809406831515, -1.1310244894, 0.493807445914, 
+
+L3_cTRSM_A_mm
+8.0, 2.0, 8.0, 1.0, 3.0, 2.0, 2.0, 3.0, 4.0, 9.0, 2.0, 9.0, 3.0, 7.0, 3.0, 9.0, 4.0, 4.0, 4.0, 1.0, 0.0, 0.0, 6.0, 1.0, 8.0, 8.0, 6.0, 9.0, 5.0, 6.0, 1.0, 8.0, 9.0, 4.0, 4.0, 7.0, 4.0, 5.0, 6.0, 9.0, 0.0, 0.0, 0.0, 0.0, 3.0, 8.0, 1.0, 3.0, 2.0, 3.0, 2.0, 6.0, 1.0, 3.0, 9.0, 1.0, 7.0, 3.0, 2.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.0, 7.0, 8.0, 5.0, 3.0, 7.0, 8.0, 5.0, 4.0, 5.0, 1.0, 1.0, 7.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.0, 5.0, 6.0, 5.0, 9.0, 5.0, 2.0, 7.0, 1.0, 4.0, 7.0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 9.0, 7.0, 2.0, 9.0, 8.0, 2.0, 5.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 5.0, 3.0, 4.0, 5.0, 3.0, 7.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.0, 4.0, 6.0, 2.0, 9.0, 9.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 7.0, 8.0, 7.0, 9.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 7.0, 
+
+L3_cTRSM_B_mn
+0.20000000298, 0.899999976158, 0.800000011921, 0.699999988079, 0.40000000596, 0.5, 0.899999976158, 0.40000000596, 0.800000011921, 0.800000011921, 0.600000023842, 0.40000000596, 0.300000011921, 0.5, 0.899999976158, 0.20000000298, 0.899999976158, 0.699999988079, 0.800000011921, 0.300000011921, 0.10000000149, 0.300000011921, 0.5, 0.10000000149, 0.699999988079, 0.699999988079, 0.5, 0.300000011921, 0.300000011921, 0.800000011921, 0.600000023842, 0.10000000149, 0.699999988079, 0.5, 0.300000011921, 0.10000000149, 0.600000023842, 0.10000000149, 0.300000011921, 0.800000011921, 0.899999976158, 0.20000000298, 0.800000011921, 0.40000000596, 0.20000000298, 0.20000000298, 0.300000011921, 0.5, 0.699999988079, 0.800000011921, 0.800000011921, 0.800000011921, 0.5, 0.5, 0.40000000596, 0.600000023842, 0.5, 0.699999988079, 0.699999988079, 0.699999988079, 0.10000000149, 0.699999988079, 0.40000000596, 0.5, 0.20000000298, 0.899999976158, 0.10000000149, 0.20000000298, 0.600000023842, 0.300000011921, 0.20000000298, 0.899999976158, 0.20000000298, 0.300000011921, 0.800000011921, 0.10000000149, 0.20000000298, 0.300000011921, 0.600000023842, 0.800000011921, 0.40000000596, 0.10000000149, 0.20000000298, 0.300000011921, 0.699999988079, 0.899999976158, 0.10000000149, 0.899999976158, 0.5, 0.699999988079, 0.5, 0.600000023842, 0.5, 0.20000000298, 0.899999976158, 0.5, 0.699999988079, 0.10000000149, 0.10000000149, 0.300000011921, 0.300000011921, 0.800000011921, 0.5, 0.600000023842, 0.300000011921, 0.899999976158, 0.699999988079, 0.10000000149, 0.300000011921, 0.10000000149, 0.40000000596, 0.600000023842, 0.600000023842, 0.10000000149, 0.899999976158, 0.20000000298, 0.600000023842, 0.600000023842, 0.899999976158, 0.20000000298, 0.20000000298, 0.5, 0.20000000298, 0.10000000149, 0.40000000596, 0.600000023842, 0.300000011921, 0.20000000298, 0.899999976158, 0.300000011921, 0.300000011921, 0.40000000596, 0.40000000596, 0.40000000596, 0.10000000149, 0.20000000298, 0.5, 0.899999976158, 0.800000011921, 0.10000000149, 0.5, 0.5, 0.10000000149, 0.600000023842, 0.899999976158, 0.899999976158, 0.800000011921, 0.300000011921, 0.899999976158, 0.20000000298, 0.300000011921, 0.20000000298, 0.600000023842, 0.10000000149, 0.40000000596, 0.800000011921, 0.800000011921, 0.20000000298, 0.10000000149, 0.20000000298, 0.10000000149, 0.5, 0.699999988079, 0.10000000149, 0.10000000149, 0.10000000149, 0.300000011921, 0.899999976158, 0.800000011921, 0.600000023842, 0.10000000149, 0.20000000298, 0.10000000149, 0.10000000149, 0.20000000298, 0.5, 0.20000000298, 0.899999976158, 0.10000000149, 0.5, 0.10000000149, 0.800000011921, 0.20000000298, 0.10000000149, 0.20000000298, 0.300000011921, 0.10000000149, 0.5, 0.600000023842, 0.300000011921, 0.40000000596, 0.699999988079, 0.600000023842, 0.40000000596, 0.600000023842, 0.300000011921, 0.800000011921, 0.699999988079, 0.5, 0.899999976158, 0.600000023842, 0.300000011921, 0.20000000298, 0.699999988079, 0.5, 0.699999988079, 0.899999976158, 0.699999988079, 0.800000011921, 0.899999976158, 0.600000023842, 0.10000000149, 0.600000023842, 0.20000000298, 0.300000011921, 0.899999976158, 0.5, 0.40000000596, 0.10000000149, 0.20000000298, 0.300000011921, 0.5, 0.699999988079, 0.800000011921, 0.600000023842, 0.600000023842, 0.20000000298, 0.899999976158, 0.300000011921, 0.899999976158, 0.20000000298, 0.899999976158, 0.800000011921, 0.40000000596, 0.300000011921, 0.20000000298, 0.10000000149, 0.800000011921, 0.5, 0.5, 0.899999976158, 0.20000000298, 0.800000011921, 0.40000000596, 0.600000023842, 0.40000000596, 0.40000000596, 0.10000000149, 0.40000000596, 0.600000023842, 0.300000011921, 0.5, 0.300000011921, 0.10000000149, 0.10000000149, 0.600000023842, 0.10000000149, 0.300000011921, 0.5, 0.899999976158, 0.10000000149, 0.5, 0.699999988079, 0.5, 0.600000023842, 0.300000011921, 0.5, 0.600000023842, 0.10000000149, 0.300000011921, 0.5, 0.899999976158, 0.699999988079, 0.5, 0.600000023842, 0.10000000149, 0.800000011921, 0.300000011921, 0.600000023842, 0.899999976158, 0.300000011921, 0.10000000149, 0.600000023842, 0.10000000149, 0.10000000149, 0.699999988079, 0.10000000149, 0.800000011921, 0.40000000596, 0.300000011921, 0.899999976158, 0.10000000149, 0.899999976158, 0.20000000298, 0.20000000298, 0.10000000149, 0.899999976158, 0.699999988079, 0.300000011921, 0.600000023842, 0.10000000149, 0.699999988079, 0.40000000596, 0.300000011921, 0.10000000149, 0.899999976158, 0.20000000298, 0.600000023842, 0.699999988079, 0.300000011921, 0.40000000596, 0.800000011921, 0.800000011921, 0.899999976158, 0.699999988079, 0.5, 0.699999988079, 0.40000000596, 0.699999988079, 0.20000000298, 0.899999976158, 0.699999988079, 0.10000000149, 0.10000000149, 0.300000011921, 0.20000000298, 0.40000000596, 0.800000011921, 0.699999988079, 0.40000000596, 0.600000023842, 0.699999988079, 0.10000000149, 0.899999976158, 0.40000000596, 0.800000011921, 0.300000011921, 0.600000023842, 0.699999988079, 0.699999988079, 
+
+L3_cTRSM_o_LUN
+0.329132588213, 0.290983445686, 0.518608890416, 0.450196678153, 0.59571196627, 0.333239109024, 0.807574982661, -0.307282948652, 0.532035038056, -0.166371615227, 0.396249635758, -0.0151301144297, 0.215690257052, -0.345604787386, 0.748164415979, -0.267674370174, 0.0230110472586, -0.054737867756, 0.29684452105, -0.153817808947, 0.14229890285, 0.0778728674113, 0.416792329049, -0.204635719884, 0.412984492231, 0.135348752859, 0.631664019438, 0.49230799723, 0.632190181758, 0.0104684502782, 0.337012656824, -0.32228511293, 0.328758498139, 0.056546513907, -0.480492886975, -0.413052117291, -0.823867218711, -0.664741879488, -0.87659115525, -0.472506386307, -0.823887182769, 0.601166816594, -0.646982430633, 0.23380446764, -0.450590407047, -0.12590112238, -0.407571331233, 0.340184591706, -0.790302344175, 0.320752521432, 0.00225306717399, 0.0680875999274, -0.260370712498, 0.0420986120425, -0.138956112778, -0.0997526423358, -0.339441849887, -0.00149673230105, -0.36340069964, -0.290458217323, -0.795143312374, -0.692900475193, -0.754201690112, 0.222163757593, -0.201301434402, 0.295653097511, -0.317864896997, -0.257372231279, 0.473204254415, -0.0511578474303, 0.776631765195, -0.299306031636, 0.77534765503, -0.0988899177863, 0.233904499388, -0.699907489587, 0.349208153287, -0.537165320026, 0.367858800363, -0.142890125039, 0.170325758528, -0.452782048209, 0.415971872253, -0.532645494953, -0.0224603350875, -0.0362953265799, 0.211016081385, -0.173731075134, 0.217661533137, 0.0449093984318, 0.383660994825, -0.111264311302, 0.536568362345, 0.0401773954804, 0.735559101649, 0.214556970308, 0.324030905281, -0.440376627925, 0.0893926728849, -0.10017952398, 0.446071807497, -0.0677657625545, -0.44786413179, 0.539273296714, -0.243963300324, 1.33049162938, -0.483647044419, 0.884941168953, 0.308416184748, 0.420066381715, 0.0879201118076, 0.728919060165, -0.350498418455, 0.544288094865, 0.0369674484374, 0.692570792665, -0.0529057724369, 0.629825082104, 0.0808144226271, 0.0467457051333, -0.0832147547532, 0.398661367271, -0.336831347372, 0.145000576864, -0.50130529731, 0.418361500248, -0.752655616474, 0.455224091141, -0.789686869352, 0.331402634912, 0.159779003254, 0.45480297157, -0.175209524234, -0.0684370114627, -0.645024480938, 0.514515369092, 1.01798421074, 0.265736825651, 1.79507192861, -0.351450690041, 1.47686610636, 0.131430006596, 0.472894345416, -0.631143938025, 0.951318859842, -0.575110593075, 0.899727768759, 0.0602936616812, 0.967481467645, -0.493097453218, 0.976572440131, -0.176342152909, 0.0323085948794, -0.169432819907, 0.587679912908, -0.152717166778, 0.267770683165, 0.305291273015, 0.871964895125, 0.518556298855, 1.08468911466, 0.756843205244, 0.872120402327, 0.945645313259, 0.482536367515, -0.339251893584, 0.116576581664, 0.272477384295, 1.00996556082, 0.448549974153, -1.01187196302, -0.31068589079, -1.86004791772, 0.238580597367, -1.6270790887, -0.22210951623, -0.615089810619, 0.76630010891, -0.951613075389, 0.650753261395, -0.930374968557, -0.137471270174, -0.887196193697, 0.49220926558, -1.02710780924, 0.260015430996, -0.0178976789243, 0.0906117130146, -0.637543531318, 0.207283128951, -0.348201005626, -0.352171984869, -0.945315117009, -0.448338017751, -1.15201692465, -0.763114307642, -1.00379624616, -1.08615326276, -0.686885214367, 0.401387322611, -0.121636766229, -0.123993655176, -0.941323687807, -0.481315418513, 0.11861660694, 0.0630726204339, 0.195093698521, -0.00668271511545, 0.204411762255, 0.0926470568598, 0.154216552534, -0.000722285451242, 0.175800364411, -0.0284357121106, 0.181721752362, 0.0162675655527, 0.13067412641, -0.0935645461459, 0.188144190454, 0.0368688201022, 0.0395887542365, -0.0421980777833, 0.188625717074, -0.0478201446893, 0.111979448349, 0.0135150982211, 0.216410719047, 0.00424908861064, 0.175162676832, 0.109057773248, 0.152492182456, 0.205765221906, 0.140415149467, -0.010684541591, 0.10612962379, 0.0117972407341, 0.134643416818, 0.0549453437059, -0.0362297860894, 0.0108635910998, -0.00440570980204, 0.0158109581322, -0.0396551737629, -0.024137931592, -0.17842919669, -0.00143804813476, -0.0942592291516, 0.0119736031608, -0.0283147659565, 0.116657768817, -0.0782842501779, 0.0731499820128, -0.218812934101, -0.0149527034405, 0.0232873069137, 0.0949992401876, -0.0418484890436, 0.124858864666, -0.0071330532252, 0.0886939211777, -0.0676952999152, 0.100949799671, -0.0949153199515, 0.0348909098063, -0.0708613017987, -0.116367864913, -0.0742790641199, -0.0434963353749, -0.0945643919643, 0.0220514191565, -0.0806835498735, 0.034574303601, -0.009429360049, -0.031095514469, -0.0375648450662, 0.033079031856, -0.0551724140878, -0.0379310345864, -0.0628318563627, 0.0575221237301, -0.081354896179, 0.0417454966779, -0.0501678348552, 0.0267927948184, -0.0134574309546, 0.111931642263, -0.0819652081468, 0.111901127459, 0.0271284720944, -0.00341775973586, 0.0187671625936, -0.0322856240027, -0.0560573726883, -0.0512053688916, -0.0749465972094, 0.0551113803662, -0.0206286260585, 0.0112603037576, -0.0586512000333, -0.0280439403109, -0.0702166642094, 0.0364052478609, -0.0484589589035, -0.00964296580743, -0.0623130905858, 0.0928898359313, 0.0827586237213, 0.00689655259765, 0.0724137939256, -0.068965515186, 0.117241381057, -0.0068965518269, 0.149999997739, -0.0500000026719, 0.0965517235213, -0.0586206882164, 0.0844827587235, -0.0637931017012, 0.0603448273293, -0.0741379294416, 0.131034480087, -0.0724137908426, 0.0172413795673, -0.0068965518269, 0.0396551733901, -0.0258620702501, 0.117241381057, -0.0068965518269, 0.0844827587235, -0.0637931017012, 0.115517241174, -0.0362069000458, 0.113793100648, 0.0344827572076, 0.117241381057, -0.0068965518269, 0.0879310379768, -0.00517241399864, 0.120689653117, -0.0482758612468, 
+
+L3_cTRSM_A_nn
+0.300000011921, 0.40000000596, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.800000011921, 0.699999988079, 0.300000011921, 0.20000000298, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.10000000149, 0.40000000596, 0.10000000149, 0.5, 0.5, 0.20000000298, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.40000000596, 0.10000000149, 0.699999988079, 0.40000000596, 0.20000000298, 0.10000000149, 0.600000023842, 0.10000000149, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.40000000596, 0.10000000149, 0.300000011921, 0.899999976158, 0.899999976158, 0.300000011921, 0.20000000298, 0.300000011921, 0.300000011921, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.40000000596, 0.699999988079, 0.899999976158, 0.899999976158, 0.300000011921, 0.20000000298, 0.10000000149, 0.20000000298, 0.300000011921, 0.699999988079, 0.600000023842, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.800000011921, 0.5, 0.40000000596, 0.5, 0.699999988079, 0.800000011921, 0.300000011921, 0.699999988079, 0.5, 0.800000011921, 0.20000000298, 0.5, 0.800000011921, 0.10000000149, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.699999988079, 0.699999988079, 0.600000023842, 0.800000011921, 0.20000000298, 0.800000011921, 0.600000023842, 0.600000023842, 0.699999988079, 0.300000011921, 0.800000011921, 0.10000000149, 0.20000000298, 0.10000000149, 0.600000023842, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.600000023842, 0.600000023842, 0.5, 0.699999988079, 0.300000011921, 0.600000023842, 0.600000023842, 0.699999988079, 0.899999976158, 0.800000011921, 0.800000011921, 0.300000011921, 0.40000000596, 0.699999988079, 0.20000000298, 0.899999976158, 0.300000011921, 0.10000000149, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.40000000596, 0.40000000596, 0.5, 0.10000000149, 0.40000000596, 0.699999988079, 0.300000011921, 0.899999976158, 0.699999988079, 0.899999976158, 0.699999988079, 0.899999976158, 0.899999976158, 0.600000023842, 0.20000000298, 0.699999988079, 0.600000023842, 0.300000011921, 0.600000023842, 0.699999988079, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.10000000149, 0.10000000149, 0.5, 0.10000000149, 0.5, 0.800000011921, 0.300000011921, 0.20000000298, 0.20000000298, 0.600000023842, 0.699999988079, 0.699999988079, 0.40000000596, 0.10000000149, 0.600000023842, 0.300000011921, 0.300000011921, 0.699999988079, 0.40000000596, 0.10000000149, 0.10000000149, 0.10000000149, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.300000011921, 0.699999988079, 0.20000000298, 0.10000000149, 0.10000000149, 0.40000000596, 0.5, 0.899999976158, 0.600000023842, 0.600000023842, 0.300000011921, 0.300000011921, 0.5, 0.800000011921, 0.699999988079, 0.300000011921, 0.800000011921, 0.20000000298, 0.10000000149, 0.300000011921, 0.699999988079, 0.800000011921, 0.800000011921, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.10000000149, 0.800000011921, 0.800000011921, 0.800000011921, 0.600000023842, 0.600000023842, 0.20000000298, 0.5, 0.10000000149, 0.40000000596, 0.699999988079, 0.5, 0.10000000149, 0.800000011921, 0.699999988079, 0.300000011921, 0.699999988079, 0.899999976158, 0.800000011921, 0.40000000596, 0.600000023842, 0.699999988079, 0.699999988079, 0.300000011921, 0.699999988079, 0.600000023842, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.20000000298, 0.40000000596, 0.20000000298, 0.20000000298, 0.899999976158, 0.300000011921, 0.5, 0.300000011921, 0.899999976158, 0.699999988079, 0.899999976158, 0.300000011921, 0.5, 0.699999988079, 0.699999988079, 0.800000011921, 0.600000023842, 0.800000011921, 0.699999988079, 0.800000011921, 0.20000000298, 0.600000023842, 0.899999976158, 0.800000011921, 0.800000011921, 0.899999976158, 0.800000011921, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.10000000149, 0.10000000149, 0.5, 0.5, 0.300000011921, 0.10000000149, 0.800000011921, 0.899999976158, 0.699999988079, 0.300000011921, 0.20000000298, 0.40000000596, 0.40000000596, 0.300000011921, 0.300000011921, 0.600000023842, 0.20000000298, 0.40000000596, 0.10000000149, 0.300000011921, 0.600000023842, 0.10000000149, 0.20000000298, 0.600000023842, 0.800000011921, 0.300000011921, 0.40000000596, 0.5, 0.800000011921, 0.800000011921, 0.0, 0.0, 0.0, 0.0, 0.899999976158, 0.20000000298, 0.300000011921, 0.800000011921, 0.699999988079, 0.300000011921, 0.300000011921, 0.10000000149, 0.699999988079, 0.600000023842, 0.800000011921, 0.20000000298, 0.699999988079, 0.5, 0.899999976158, 0.800000011921, 0.5, 0.5, 0.300000011921, 0.20000000298, 0.20000000298, 0.899999976158, 0.699999988079, 0.300000011921, 0.5, 0.300000011921, 0.699999988079, 0.10000000149, 0.20000000298, 0.699999988079, 0.600000023842, 0.899999976158, 0.0, 0.0, 0.699999988079, 0.699999988079, 0.699999988079, 0.300000011921, 0.899999976158, 0.699999988079, 0.699999988079, 0.10000000149, 0.300000011921, 0.300000011921, 0.300000011921, 0.300000011921, 0.5, 0.10000000149, 0.300000011921, 0.300000011921, 0.40000000596, 0.600000023842, 0.20000000298, 0.699999988079, 0.800000011921, 0.40000000596, 0.40000000596, 0.800000011921, 0.699999988079, 0.10000000149, 0.800000011921, 0.300000011921, 0.20000000298, 0.10000000149, 0.300000011921, 0.600000023842, 0.40000000596, 0.10000000149, 
+
+L3_cTRSM_o_RLT
+1.67999991632, 0.759999968529, -1.69538434108, -2.48307671443, -0.33931028015, 1.8317238564, 1.75765674459, 3.06021323111, 0.585745284258, -6.85189338833, -1.63353699604, 6.67286980754, 0.000959390164332, 0.216487260406, -0.727348486408, -3.1358742578, -10.1429168345, 4.3685838467, 7.71081038778, -8.7110985358, 65.6802732624, 9.92302133024, -29.4099425286, -16.6939457264, -24.8344729512, -10.4877177906, 28.4642727556, 23.3848352086, -11.8524871075, 19.0874764207, -19.9631034063, -31.8548662784, -139.885318318, 27.1869354532, 0.520000008583, -0.360000002503, -0.119999954985, 0.159999991408, 0.801379300572, 1.02344824357, 1.19448260124, -0.293793071317, -1.85724112856, -3.17310319017, -0.609790967585, 3.04011264086, -0.361343777873, 1.52979339832, 0.931884405582, -1.71123304671, 0.248635733027, 1.57473051435, -0.192799010887, -2.7172814814, 6.80443254935, -7.89169301645, -4.22216516114, 4.51843426281, -4.49336734933, 0.917969187391, 4.36693978702, -0.535341848317, 3.59140682231, 3.09039986078, -8.29561445716, -0.38186485114, -5.04546803723, 18.766682786, 1.20000002623, -0.599999995232, -1.89230775479, 3.06153831848, 3.04827576645, -0.17931025339, 3.14993181827, -2.91685386908, -9.56824289783, 2.45004130334, 10.2381901924, -1.50468017004, -0.225730006256, -2.88434154029, -3.83194620666, 1.44183565442, 5.6183924538, 18.6532356715, -12.3068309129, -8.50922080102, 22.0776695017, -93.0940213305, -28.0425331456, 37.1303660105, -19.0967213639, 33.8218691411, 41.9847843332, -37.8252941288, 22.8627220686, 19.1052532302, -47.2094044371, 26.4297586128, 20.7991151033, 202.687902914, 1.56000000191, -0.0799999508858, -2.51384609398, 1.24923055492, 2.81793083241, 0.104827602781, 2.17567688944, -0.688748708747, -7.97975692369, 0.520548951678, 8.61388753898, 0.565967103179, 1.19720571237, -2.27396124285, -2.82715461133, 0.203501372167, 0.165392174888, 10.1741900769, -6.71005472238, -6.25503436169, 12.9058433932, -44.6834068804, -11.0757742946, 17.4501156854, -11.3760300002, 16.866416402, 20.2825001837, -15.4983088186, 12.1816651301, 6.58157547078, -25.1364964735, 15.4060069199, 7.79243016012, 88.9124742882, 2.03999990988, 0.279999989033, -3.85538420434, -2.60307674094, 0.395862053267, 3.52965478575, 2.80075066828, 4.37119179344, -1.49417981798, -11.7043190143, 0.563008016326, 11.1883233417, 1.63603714951, 0.287903545504, -1.32969693006, -3.37608500479, -15.8803174444, 5.45970314172, 9.64624356726, -12.769162384, 83.7781785236, 1.0282072251, -37.8717061034, -12.7808478524, -34.6731579882, -9.80879193149, 38.3240707105, 24.4324370684, -8.26559310622, 24.0229074031, -32.2435529464, -34.6351508366, -159.359885665, 54.7649451264, 0.439999995112, 0.0800000045299, -0.870769185026, -0.326153836442, 0.733793103045, 1.27448270522, 1.08728067783, 1.60601895099, -2.31665473867, -4.03289125767, 1.44985876196, 4.56110908056, 1.58318353146, -0.332410652563, -0.897702513666, -2.58073502069, -8.34227645985, 3.31803439919, 3.92590632128, -5.7896042397, 44.665809798, 10.567607219, -17.0654718408, -14.0594508363, -18.0085829768, -9.3014064921, 19.955841365, 21.5047227326, -8.78300196637, 9.16611021857, -13.4134128091, -20.8476712848, -98.2515099469, 6.05619155639, 1.71999993944, 0.0400000052452, -1.85846138447, -0.547692215793, 1.78068968207, 1.67172392491, 1.45395633132, 0.634932834626, -5.97644416334, -5.59734076626, 3.82604135329, 7.63881801064, 1.7246691959, 1.02484299446, -2.72301495574, -3.37893397943, -5.25597054885, 8.81631803923, 1.0811224398, -10.328733993, 52.0361342214, -30.6214656454, -28.2304782516, 6.23471149207, -26.5030593691, 6.0761789177, 34.719761658, 0.878809790678, 5.1075849796, 18.1310021403, -36.0624237836, -9.53757355549, -78.7473293002, 96.4253813812, 1.39999996901, -0.199999978542, -1.78461527254, -0.876923010455, 1.13103452765, 1.22758607577, 1.67544605794, 1.90254481531, -4.84229665654, -4.57615051408, 3.60703618702, 6.5574875994, 2.19719852196, 0.653175535422, -2.91755171075, -3.20928638183, -7.07749782598, 6.82274143327, 1.7291711383, -9.33758466576, 57.2116644619, -12.5388509499, -27.5637334594, -5.35888354408, -25.1267129094, -1.22995412304, 32.4091243293, 12.2799900392, -3.36058089806, 16.7269071597, -27.9420386115, -16.9115321538, -106.749841706, 64.3199559284, 1.63999995279, -0.519999948978, -3.45538428301, 0.196922946733, 2.47172394154, 1.81931013513, 3.79459972803, 1.99635529703, -9.68749971232, -5.82861334931, 8.3822122484, 7.38774878553, 2.76373567412, 0.197721735731, -3.40276542304, -2.55056141222, -5.53076170098, 9.16103128127, -2.24440575496, -12.8333088411, 41.1968899739, -34.1353052562, -21.3307448808, 9.1539906215, -21.4669480287, 10.1295786911, 27.2639448603, -0.314860866604, 7.21959529993, 11.4838956611, -33.281192872, -0.579878201698, -54.8822985595, 87.4250704373, 1.20000000834, 0.40000002861, -1.27692306474, -2.01538455498, 0.0137931900618, 2.23448270158, 1.64960914158, 3.21383583072, -0.838872730612, -8.4708118791, -1.42559503597, 8.133199623, 1.35165436708, 1.11007750638, 0.298360526841, -3.75726722065, -14.0170761831, -0.0323845440388, 9.75416091125, -7.08888853629, 62.1032648557, 39.1233604822, -19.0664270127, -29.5706275294, -22.3689160698, -22.3290804208, 18.6576095623, 41.1612152132, -18.670155371, 9.45567102512, -8.90589354986, -38.129342871, -150.807653441, -41.9973898509, 
+
+L3_zTRSM_A_mm
+8.0, 9.0, 9.0, 5.0, 9.0, 9.0, 8.0, 3.0, 7.0, 8.0, 6.0, 7.0, 2.0, 2.0, 2.0, 1.0, 9.0, 1.0, 4.0, 5.0, 0.0, 0.0, 9.0, 8.0, 4.0, 9.0, 2.0, 8.0, 6.0, 3.0, 7.0, 4.0, 2.0, 8.0, 5.0, 1.0, 9.0, 3.0, 3.0, 5.0, 0.0, 0.0, 0.0, 0.0, 9.0, 8.0, 5.0, 9.0, 2.0, 8.0, 1.0, 1.0, 4.0, 6.0, 1.0, 6.0, 3.0, 5.0, 3.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 8.0, 6.0, 8.0, 6.0, 1.0, 8.0, 1.0, 5.0, 9.0, 5.0, 3.0, 1.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 8.0, 3.0, 3.0, 6.0, 6.0, 8.0, 7.0, 1.0, 7.0, 6.0, 5.0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 8.0, 6.0, 5.0, 5.0, 8.0, 3.0, 3.0, 4.0, 4.0, 8.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.0, 2.0, 1.0, 2.0, 9.0, 3.0, 9.0, 7.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.0, 2.0, 7.0, 3.0, 8.0, 9.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.0, 2.0, 5.0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 9.0, 
+
+L3_zTRSM_B_mn
+0.6, 0.7, 0.1, 0.1, 0.7, 0.5, 0.4, 0.2, 0.5, 0.7, 0.4, 0.3, 0.3, 0.3, 0.2, 0.3, 0.1, 0.3, 0.1, 0.9, 0.6, 0.2, 0.5, 0.9, 0.6, 0.9, 0.1, 0.1, 0.5, 0.4, 0.2, 0.6, 0.7, 0.5, 0.6, 0.8, 0.4, 0.6, 0.3, 0.8, 0.8, 0.2, 0.1, 0.2, 0.3, 0.3, 0.7, 0.5, 0.5, 0.8, 0.2, 0.5, 0.3, 0.8, 0.1, 0.3, 0.1, 0.2, 0.8, 0.8, 0.1, 0.9, 0.1, 0.2, 0.6, 0.7, 0.6, 0.3, 0.7, 0.7, 0.8, 0.7, 0.5, 0.1, 0.6, 0.4, 0.1, 0.6, 0.6, 0.9, 0.8, 0.9, 0.1, 0.2, 0.4, 0.7, 0.6, 0.2, 0.6, 0.2, 0.7, 0.6, 0.2, 0.7, 0.6, 0.7, 0.6, 0.8, 0.5, 0.1, 0.6, 0.9, 0.4, 0.3, 0.8, 0.5, 0.8, 0.5, 0.4, 0.2, 0.9, 0.4, 0.1, 0.9, 0.7, 0.8, 0.6, 0.2, 0.8, 0.6, 0.2, 0.4, 0.5, 0.8, 0.1, 0.1, 0.4, 0.7, 0.4, 0.6, 0.2, 0.3, 0.2, 0.8, 0.8, 0.8, 0.4, 0.3, 0.9, 0.4, 0.1, 0.3, 0.7, 0.8, 0.3, 0.2, 0.3, 0.5, 0.1, 0.4, 0.6, 0.3, 0.1, 0.7, 0.7, 0.1, 0.7, 0.8, 0.3, 0.5, 0.8, 0.1, 0.4, 0.3, 0.4, 0.6, 0.9, 0.3, 0.8, 0.3, 0.1, 0.5, 0.6, 0.7, 0.6, 0.4, 0.1, 0.5, 0.4, 0.8, 0.9, 0.9, 0.5, 0.9, 0.2, 0.5, 0.5, 0.6, 0.4, 0.4, 0.8, 0.2, 0.3, 0.2, 0.4, 0.4, 0.3, 0.3, 0.1, 0.7, 0.1, 0.8, 0.9, 0.9, 0.4, 0.6, 0.6, 0.3, 0.7, 0.1, 0.9, 0.1, 0.8, 0.5, 0.9, 0.4, 0.8, 0.4, 0.7, 0.1, 0.9, 0.8, 0.7, 0.9, 0.4, 0.3, 0.6, 0.2, 0.9, 0.6, 0.5, 0.2, 0.6, 0.7, 0.6, 0.4, 0.5, 0.1, 0.1, 0.5, 0.1, 0.3, 0.2, 0.4, 0.1, 0.1, 0.3, 0.7, 0.9, 0.9, 0.2, 0.1, 0.4, 0.8, 0.8, 0.7, 0.6, 0.9, 0.2, 0.1, 0.7, 0.1, 0.5, 0.5, 0.4, 0.5, 0.3, 0.9, 0.4, 0.7, 0.7, 0.1, 0.7, 0.5, 0.6, 0.8, 0.2, 0.4, 0.8, 0.3, 0.3, 0.9, 0.8, 0.5, 0.7, 0.6, 0.5, 0.8, 0.2, 0.7, 0.8, 0.5, 0.3, 0.2, 0.2, 0.5, 0.1, 0.9, 0.2, 0.8, 0.6, 0.1, 0.8, 0.8, 0.5, 0.5, 0.3, 0.5, 0.5, 0.6, 0.9, 0.9, 0.4, 0.7, 0.3, 0.1, 0.2, 0.9, 0.2, 0.7, 0.5, 0.6, 0.6, 0.1, 0.2, 0.1, 0.1, 0.5, 0.7, 0.3, 0.9, 0.8, 0.2, 0.5, 0.8, 0.7, 0.5, 0.9, 0.3, 0.3, 
+
+L3_zTRSM_o_LUN
+-0.133958047225, 0.0634023358484, -0.229395361146, 0.0019440773242, 0.0129991149435, 0.00295962291275, -0.120025004919, -0.014606037272, 0.0653351315443, 0.0580553772721, 0.00608264893155, 0.0320668880271, -0.126348882414, 0.0696735063329, -0.044177548257, -0.0502170168136, 0.0522860973768, 0.036810427771, -0.0664892116058, 0.18989329588, -0.0375597994313, -0.0275390571767, 0.00870806224388, -0.0700975283092, -0.104577165629, 0.0383595871779, -0.0619419158678, -0.0757518930715, -0.0557894015604, 0.0664938853937, -0.184517662625, 0.0196137392561, -0.0949210300684, -0.0304115608193, 0.00359490016574, 0.0296444215786, -0.0702236760827, 0.0231733017109, 0.0232103541111, -0.0087275635157, -0.0309628976085, -0.021056980123, -0.0372198465751, -0.058278935698, -0.066225517515, -0.0303442676089, -0.0360089621826, -0.0510206414236, 0.0177940788551, 0.00506527587377, -0.0300546336791, -0.0604138046683, 0.0170327950245, 0.101334473014, -0.0717738695849, 0.0692380499707, -0.0779814679933, -0.0523878250108, 0.0703523517282, -0.0586185162717, -0.0454528399349, 0.00843251396343, -0.0257737754508, -0.0133396070809, -0.00436180784171, 0.0597108371938, -0.0711525797109, -0.0222505361281, 0.0360949489608, -0.0189699613951, 0.0216083084991, -0.055554647386, -0.0397030805685, 0.0541809370015, 0.044520325295, -0.0156491073175, -0.0705400040511, 0.0239758416537, -0.00973008140189, 0.0331645117989, -0.0234601152208, -0.0280363313687, -0.0262208353337, 0.0666168234385, 0.023301531523, 0.0402349038871, -0.0261517269967, -0.0874177357089, -0.0144525547592, -0.0612651780432, 0.158607562703, -0.000349319494803, 0.0201660941589, -0.0278132634654, 0.0188873817629, 0.0174304814112, 0.0859319234439, 0.0386937865608, -0.00437738220405, -0.0769941563961, 0.0312701548396, -0.0326239737149, 0.0290051239392, 0.0517531091139, 0.0200295195647, 0.123820434735, 0.0794637653298, -0.0720673352695, -0.0400311865241, 0.0315069978245, 0.0818066545241, 0.0407339255733, 0.120215863434, -0.00944115085266, 0.128069456553, 0.0893168438244, -0.00875999697558, -0.0402889951796, 0.000516531239594, -0.0609614066776, 0.0669900723735, 0.0830178622181, 0.0428576236321, 0.00970051385759, -0.14037004318, 0.00733230807618, -0.0370168081054, 0.112840401769, 0.0199351305638, -0.00559938448532, -0.0238751260468, -0.0362600511932, -0.0116826188016, 0.112092594679, 0.0092104972435, 0.105881476364, 0.0416925499118, -0.0682518953071, 0.084448549975, -0.077911404558, -0.000930781906544, -0.000697974900251, 0.0922679184012, 0.011955012654, -0.0431252487344, -0.0940662263104, -0.0749553909254, 0.010252209449, -0.0114065153767, -0.0452389587963, 0.0335658206213, -0.0205401306942, -0.0487380679532, -0.0130192249246, -0.0287451612394, -0.106177023589, 0.0459277994176, 0.0408918896563, 0.0458419959347, 0.0354121587773, 0.0741133847671, -0.0698810090088, 0.0183565138432, 0.0121731293456, 0.0385894026379, -0.0524649875877, 0.104782397274, -0.0682930088564, 0.0355549910916, -0.0500824092637, 0.0674926385779, -0.0311124228238, 0.123709478255, 0.0159810027817, 0.046337472013, -0.0281180541421, 0.0639560350092, 0.0120628265147, 0.0193178641699, 0.0339603772305, 0.0638918515503, -0.0100080059706, 0.121624940634, 0.0401738245471, 0.0147084605468, 0.0269608521609, -0.0449512178574, -0.00616744690956, -0.0022122260669, -0.0766020761246, 0.0766254155641, -0.0452167718298, -0.0171635796187, 0.0316277902164, -0.00764841576769, 0.00589470113305, 0.0126037044576, 0.0390200149264, 0.00950932899111, -0.087315285976, 0.0740282244386, 0.0286921772169, 0.107964583757, 0.0616987583961, -0.0432178899518, 0.0334484456205, -0.0351676016012, -0.019795845037, 0.00814990433544, 0.00268010584164, -0.0219320985141, 0.00585111608657, 0.043428335708, -0.0472336196486, -0.0359114892462, -0.0200928204084, -0.0281111120157, -0.00386401791166, -0.0176438075853, -0.0614647235226, 0.0684794735057, 0.00583490874551, 0.00200184544406, 0.0365965397924, -0.0129022158898, 0.0152881253816, 0.0111644914852, -0.0106977352602, 0.0366999606486, -0.00801811249067, -0.00943461021779, -0.0649279489789, -0.0025281118122, 0.0907113861185, -0.0672198873736, -0.0143031033313, -0.0336919682475, -0.0307169713006, -0.0806292964245, 0.00124659746251, -0.0911783160323, -0.0412239907728, -0.0742366782007, 0.0089937716263, -0.11307266436, -0.0265720876586, 0.000429988465975, -0.00167289504037, -0.0115880046136, 0.00234417531719, -0.0856050749712, -0.0663404844291, -0.0386938869666, 0.00436770472895, 0.0497130334487, 0.0195713956171, -0.0023137254902, 0.0445882352941, -0.0339644752018, -0.0280166089965, 0.0109305651672, -0.0273614763552, -0.0274874279123, -0.0281444059977, -0.000563321799308, -0.039260438293, -0.0721739331027, 0.0912761245675, -0.0833014994233, -0.0185430219146, 0.00165813148789, -0.0470089965398, 0.0387450980392, 0.0143529411765, 0.0154117647059, 0.0510196078431, -0.0809411764706, 0.0157647058824, 0.0272549019608, -0.0190196078431, 0.0257254901961, 0.0957647058824, 0.0368235294118, -0.0226274509804, 0.0385490196078, 0.00513725490196, 0.00482352941176, 0.0533725490196, -0.0118039215686, 0.0918823529412, 0.0766666666667, 0.0366666666667, 0.0041568627451, -0.0179607843137, -0.0338823529412, 0.060862745098, -0.0747843137255, 0.0784705882353, 0.000274509803922, 0.0529019607843, -0.0282745098039, -0.015568627451, 0.0216470588235, 0.0240784313725, 0.0275294117647, 0.0338823529412, 0.06, -0.0133333333333, 0.0766666666667, -0.03, 0.12, -0.06, 0.0833333333333, -0.0166666666667, 0.02, -0.0266666666667, 0.0966666666667, 0.01, 0.0766666666667, 0.00333333333333, 0.0766666666667, -0.03, 0.03, -0.0566666666667, 0.0166666666667, -0.0166666666667, 0.0533333333333, 0.00666666666667, 0.0533333333333, -0.06, 0.11, -0.0633333333333, 0.0566666666667, -0.00333333333333, 0.0966666666667, -0.0566666666667, 0.106666666667, -0.02, 0.04, -0.02, 
+
+L3_zTRSM_A_nn
+0.2, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.7, 0.4, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, 0.2, 0.8, 0.6, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.2, 0.4, 0.9, 0.5, 0.6, 0.7, 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.4, 0.4, 0.2, 0.5, 0.3, 0.3, 0.4, 0.4, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, 0.6, 0.1, 0.6, 0.1, 0.3, 0.9, 0.7, 0.9, 0.3, 0.9, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7, 0.5, 0.1, 0.9, 0.2, 0.6, 0.6, 0.6, 0.4, 0.1, 0.5, 0.2, 0.3, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6, 0.3, 0.4, 0.2, 0.3, 0.1, 0.2, 0.5, 0.6, 0.3, 0.9, 0.4, 0.4, 0.2, 0.2, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8, 0.3, 0.1, 0.2, 0.3, 0.7, 0.8, 0.7, 0.7, 0.3, 0.9, 0.6, 0.9, 0.6, 0.5, 0.5, 0.1, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.5, 0.3, 0.9, 0.2, 0.5, 0.6, 0.9, 0.7, 0.6, 0.5, 0.8, 0.1, 0.7, 0.6, 0.3, 0.1, 0.2, 0.2, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.3, 0.2, 0.7, 0.3, 0.4, 0.6, 0.2, 0.6, 0.5, 0.5, 0.2, 0.8, 0.9, 0.8, 0.2, 0.7, 0.3, 0.2, 0.1, 0.9, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.2, 0.7, 0.5, 0.7, 0.4, 0.3, 0.9, 0.3, 0.6, 0.4, 0.3, 0.5, 0.1, 0.7, 0.5, 0.7, 0.5, 0.3, 0.3, 0.2, 0.6, 0.1, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.1, 0.1, 0.4, 0.7, 0.4, 0.5, 0.1, 0.1, 0.9, 0.9, 0.3, 0.9, 0.9, 0.4, 0.4, 0.8, 0.3, 0.1, 0.2, 0.5, 0.8, 0.9, 0.4, 0.8, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7, 0.2, 0.5, 0.9, 0.9, 0.2, 0.5, 0.9, 0.4, 0.8, 0.3, 0.3, 0.6, 0.5, 0.6, 0.8, 0.7, 0.4, 0.3, 0.6, 0.5, 0.4, 0.4, 0.4, 0.6, 0.5, 0.3, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1, 0.2, 0.8, 0.2, 0.5, 0.9, 0.4, 0.7, 0.3, 0.1, 0.5, 0.9, 0.4, 0.5, 0.6, 0.8, 0.5, 0.2, 0.2, 0.8, 0.6, 0.2, 0.9, 0.7, 0.6, 0.9, 0.1, 0.6, 0.8, 0.4, 0.0, 0.0, 0.0, 0.0, 0.7, 0.8, 0.1, 0.4, 0.5, 0.7, 0.9, 0.7, 0.4, 0.6, 0.1, 0.2, 0.8, 0.6, 0.5, 0.7, 0.2, 0.5, 0.6, 0.9, 0.8, 0.5, 0.4, 0.1, 0.2, 0.3, 0.2, 0.6, 0.6, 0.4, 0.9, 0.1, 0.0, 0.0, 0.2, 0.6, 0.1, 0.3, 0.1, 0.8, 0.4, 0.6, 0.8, 0.2, 0.8, 0.1, 0.7, 0.3, 0.5, 0.1, 0.1, 0.7, 0.7, 0.6, 0.6, 0.7, 0.6, 0.5, 0.6, 0.8, 0.5, 0.4, 0.8, 0.3, 0.3, 0.8, 0.8, 0.9, 
+
+L3_zTRSM_o_RLT
+2.53846153846, -0.307692307692, -4.15384615385, -2.76923076923, 5.21538461538, 4.67692307692, -1.67032967033, 0.562637362637, -1.61789962615, -0.426758808202, 1.30479681244, 1.29092252982, -1.39577608417, -0.0483354595973, -0.208248556046, 0.0157485581257, -2.02035446306, -34.2377188373, 5.69400474025, 6.16629014222, -2.055880265, 26.7795013692, 20.2801007147, 0.278781388609, -6.25011901787, 6.68033222065, -4.12199872781, 5.13849823069, -2.29543358145, -22.0613616902, -7.99109118095, -10.4457153525, -6.66624028927, 3.46331067699, 2.76923076923, -0.153846153846, -3.31221719457, -2.3257918552, 3.52533936652, 4.90904977376, -0.8116354234, -0.524563671622, -2.41070845467, -0.246187166381, 0.729709858838, 1.49444808619, -0.42191991045, -0.671009605184, 0.000773037351422, -0.370450372745, -0.00130467069877, -21.1058235257, 4.1354934297, 3.510742543, -2.55678416358, 17.4503433975, 11.9832781916, 1.28734237506, -3.29038338627, 3.52567535025, -5.63831248523, 7.04314615589, 2.39776977535, -16.8129785333, -5.32238564128, -6.21393748331, -3.65402287287, 0.742114632218, 2.69230769231, -0.538461538462, -2.71040723982, -1.61085972851, 2.34751131222, 3.46696832579, -0.171816418875, 0.275371687136, -1.64351355134, 0.0156818318128, 0.168410734054, 0.873667804485, 0.165145889102, -0.0927408839467, -0.748944788567, -0.170503340371, -0.0961770961587, -17.0867957406, 2.36254716039, 1.43059904007, -1.01356575191, 13.0879883852, 10.5001711663, 0.360988341662, -5.51078502821, 3.47243269102, 1.35004023866, 6.05762015159, 2.46624134146, -12.4092405352, -7.63693603868, -7.78872991181, -3.27576706848, 4.99494351606, 1.30769230769, -0.461538461538, -0.524886877828, -0.330316742081, 1.07013574661, 1.3036199095, -0.50465416936, -0.23839689722, -0.280630951826, -0.255264262723, -0.528016914973, 1.46191156682, 0.633149468622, -0.980241636281, -0.432232432901, -0.445317384693, 5.30822261293, -2.07028985163, -0.566963802194, 0.016982586198, -4.31464745211, 1.5670058865, 1.53041642631, 3.79356533355, -3.16476205317, -1.51247583365, 1.79859544629, 6.13411478114, 5.95391524855, -5.79066511702, -1.88281388485, -1.81491681163, -0.353228514663, 0.427052252733, 1.30769230769, -0.461538461538, -0.348416289593, -0.62443438914, -0.0180995475113, 2.25067873303, 0.791984486102, -0.480413703943, -1.09967279537, -0.189310871057, -0.817521482201, 0.662763946994, -0.257990720685, -0.113867691238, 0.0744146168347, -1.3252465096, 9.81203388397, 2.34390357873, -0.849335367589, -0.663692181433, -5.58114129107, -1.22420572359, -2.72646876007, 5.68098357425, -0.294067581753, -3.76422238669, -6.8481772104, 5.645062895, 9.24436713199, -0.42753814601, 2.24819912654, -2.28205905397, -0.959987448054, -4.73388687297, 1.30769230769, 0.538461538462, 0.475113122172, -1.33031674208, -1.02986425339, 2.0036199095, -0.30465416936, -0.13839689722, 0.192564924463, -0.644954984373, -0.108052117387, 0.569429796638, 0.175456705824, -0.181404942941, -0.320928629805, 0.449351598639, 7.93853301365, -5.95304327899, -1.54921582808, 1.44540181613, -6.16283041715, 2.49515570153, 2.6474178988, 5.34680760955, -3.04712049237, -1.15044450837, -0.790782115983, 1.925040681, 6.81450686799, -2.61955436635, 0.369845380883, -4.44821450918, -2.69242270613, 0.0129199093012, 2.0, -1.00180120306e-14, -1.58823529412, -2.35294117647, 1.49411764706, 3.57647058824, -0.56974789916, -0.30756302521, -0.748800138612, -0.708897167114, -0.160427500143, 1.26297048364, -0.378591893501, -0.241123944142, -0.265897391581, -0.640956708658, 11.8162836787, -13.2459191191, 0.854494198758, 3.29188659552, -10.5662371442, 9.22982933662, 7.23290619328, 7.94219010944, -4.8198313183, -0.265492608928, -4.28523934809, 4.93193453847, 9.1289867142, -11.5275406773, -1.34903647525, -7.15891029276, -4.2179011628, -0.802262005682, 1.30769230769, 0.538461538462, -0.93665158371, -1.97737556561, 0.676018099547, 3.02714932127, -0.777763413058, -0.245119586296, -0.188384568736, -0.690549717111, 0.624547515376, 1.46602323411, -1.37757905802, -0.538098068801, -0.0256531620363, -0.297484429759, 14.7149585002, -15.3217706237, -0.247114014262, 4.02045016071, -12.8325779909, 10.5455082286, 7.72893334625, 8.50289849881, -4.81759944993, 1.61211987571, -2.48088891757, 0.00422538669345, 6.97778944266, -12.1728944531, 0.82877103129, -6.07537214734, -3.66381659073, -2.57786582966, 2.23076923077, -0.846153846154, -2.80542986425, -0.144796380091, 2.8334841629, 2.02624434389, 0.323400129282, -0.114091790562, -1.26034759661, 0.56446664312, -0.0173885913817, 0.257394546763, 0.123747653039, 0.328399812669, -0.052001074913, -0.336106066568, -10.2450611787, -8.3265399976, 3.94284803098, -0.803047613867, 7.42671088274, 7.91688706589, 4.6789781649, -4.95090202473, 0.490431402225, 2.46397654929, -3.65001545059, 6.55600322606, -1.95689400404, -6.09235040312, -7.18696801329, -1.57535421932, -0.664443491156, 3.1835957169, 1.61538461538, 0.0769230769231, -0.932126696833, -1.19004524887, 1.6814479638, 2.37194570136, -0.749644473174, -0.0238526179703, -1.31686270067, -0.300972950639, 0.814887835175, 1.04060724733, -1.00626442169, -0.502843676322, 0.00138141101527, -0.270867647939, 5.00518717734, -16.1468502699, 0.643427728952, 3.09479951647, -5.18511978123, 12.7925473525, 9.21147753243, 2.88082426014, -3.21234806046, 3.89942511486, -2.51974230756, 0.685276255354, 1.3928270861, -11.4078509372, -1.40871362384, -3.80464519077, -2.60694542596, -2.04083275412, 
+
diff --git a/tests/tests/renderscript/assets/blas_gen.py b/tests/tests/renderscript/assets/blas_gen.py
new file mode 100644
index 0000000..301b249
--- /dev/null
+++ b/tests/tests/renderscript/assets/blas_gen.py
@@ -0,0 +1,901 @@
+#
+# Copyright (C) 2015 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.
+#
+
+# This Python script is used to generate all input and output
+# reference data into BLASData.txt
+
+#!/usr/bin/python
+
+from numpy import *
+
+# functions used for generating input matrices.
+
+# Modify a regular matrix to a triangular matrix.
+def triangularMatrixGen(a, uplo):
+    if uplo == 'u': #upper = 1, lower = 2
+        for i in range(1, a.shape[0]):
+            for j in range(0, i):
+                a[i, j] = 0
+    elif uplo == 'l':
+        for i in range(0, a.shape[0]-1):
+            for j in range(i+1, a.shape[1]):
+                a[i, j] = 0
+
+# Modify a regular matrix to a symmetric matrix.
+def symm(a):
+    for i in range(1, a.shape[0]):
+        for j in range(0, i):
+            a[i, j] = a[j, i];
+
+# Modify a regular matrix to a hermitian matrix.
+def herm(a):
+    for i in range(0, a.shape[0]):
+        a[i,i] = complex(a[i,i].real, 0);
+    for i in range(1, a.shape[0]):
+        for j in range(0, i):
+            a[i, j] = complex(a[j, i].real, -a[j, i].imag);
+
+# Zero all elments in a matrix
+def zero(a):
+    for i in range(0, a.shape[0]):
+        for j in range(0, a.shape[1]):
+            a[i, j] = 0;
+
+# Generate a random float matrix given a scale.
+def sMatGen(m, n, scale):
+    a = mat(random.randint(1, 10, size=(m, n)).astype('f4')/scale)
+    return a;
+
+# Generate a random double matrix given a scale.
+def dMatGen(m, n, scale):
+    a = mat(random.randint(1, 10, size=(m, n)).astype('f8')/scale)
+    return a;
+
+# Generate a random float complex matrix given a scale.
+def cMatGen(m, n, scale):
+    a_real = mat(random.randint(1, 10, size=(m, n)).astype('f4')/scale)
+    a_img = mat(random.randint(1, 10, size=(m, n)).astype('f4')/scale)
+    a = a_real + 1j * a_img
+    return a;
+
+# Generate a random double complex matrix given a scale.
+def zMatGen(m, n, scale):
+    a_real = mat(random.randint(1, 10, size=(m, n)).astype('f8')/scale)
+    a_img = mat(random.randint(1, 10, size=(m, n)).astype('f8')/scale)
+    a = a_real + 1j * a_img
+    return a;
+
+# A wrapper to generated random matrices given a scale
+def matrixCreateScale(dt, m, n, scale):
+    if dt == 's':
+        return sMatGen(m, n, scale);
+    elif dt == 'd':
+        return dMatGen(m, n, scale);
+    elif dt == 'c':
+        return cMatGen(m, n, scale);
+    else:
+        return zMatGen(m, n, scale);
+
+# A wrapper to generated random matrices
+def matrixCreate(dt, m, n):
+    return matrixCreateScale(dt, m, n, 10);
+
+# Write a float matrix into a given file.
+# For each element, can pad arbitrary number of 0s after it.
+def writeFloatMatrix(a, name, skip, fo):
+    fo.write(name + '\n');
+    for i in range(0, a.shape[0]):
+        for j in range(0, a.shape[1]):
+            fo.write(str(a[i,j]) + ", ");
+            for hh in range(0, skip):
+                fo.write("0.0, ");
+    fo.write("\n\n");
+
+# Write a double matrix into a given file.
+# For each element, can pad arbitrary number of 0s after it.
+def writeDoubleMatrix(a, name, skip, fo):
+    writeFloatMatrix(a, name, skip, fo);
+
+# Write a float complex matrix into a given file.
+# For each element, can pad arbitrary number of 0s after it.
+def writeFloatComplexMatrix(a, name, skip, fo):
+    fo.write(name + '\n');
+    for i in range(0, a.shape[0]):
+        for j in range(0, a.shape[1]):
+            fo.write(str(real(a[i,j])) + ", ");
+            fo.write(str(imag(a[i,j])) + ", ");
+            for hh in range(0, skip):
+                fo.write("0.0, ");
+                fo.write("0.0, ");
+    fo.write("\n\n");
+
+# Write a double complex matrix into a given file.
+# For each element, can pad arbitrary number of 0s after it.
+def writeDoubleComplexMatrix(a, name, skip, fo):
+    writeFloatComplexMatrix(a, name, skip, fo);
+
+# Wrapper to write a matrix into a given file.
+# For each element, can pad arbitrary number of 0s after it.
+def writeMatrixWithIncrements(dt, a, name, skip, fo):
+    if dt == 's':
+        writeFloatMatrix(a, name, skip, fo);
+    elif dt == 'd':
+        writeDoubleMatrix(a, name, skip, fo);
+    elif dt == 'c':
+        writeFloatComplexMatrix(a, name, skip, fo);
+    else:
+        writeDoubleComplexMatrix(a, name, skip, fo);
+
+# Wrapper to write a matrix into a given file.
+def writeMatrix(dt, a, name, fo):
+    writeMatrixWithIncrements(dt, a, name, 0, fo);
+
+# Write a symmetric or hermitian float matrix into a given file, in a packed form.
+def writeFloatPackedMatrix(a, name, fo):
+    fo.write(name + '\n');
+    for i in range(0, a.shape[0]):
+        for j in range(i, a.shape[1]):
+            fo.write(str(a[i,j]) + ", ");
+    fo.write("\n\n");
+
+# Write a symmetric or hermitian double matrix into a given file, in a packed form.
+def writeDoublePackedMatrix(a, name, fo):
+    writeFloatPackedMatrix(a, name, fo);
+
+# Write a symmetric or hermitian float complex matrix into a given file, in a packed form.
+def writeFloatComplexPackedMatrix(a, name, fo):
+    fo.write(name + '\n');
+    for i in range(0, a.shape[0]):
+        for j in range(i, a.shape[1]):
+            fo.write(str(real(a[i,j])) + ", ");
+            fo.write(str(imag(a[i,j])) + ", ");
+    fo.write("\n\n");
+
+# Write a symmetric or hermitian double complex matrix into a given file, in a packed form.
+def writeDoubleComplexPackedMatrix(a, name, fo):
+    writeFloatComplexPackedMatrix(a, name, fo);
+
+# Wrapper to write a symmetric or hermitian matrix into a given file, in a packed form.
+def writePackedMatrix(dt, a, name, fo):
+    if dt == 's':
+        writeFloatPackedMatrix(a, name, fo);
+    elif dt == 'd':
+        writeDoublePackedMatrix(a, name, fo);
+    elif dt == 'c':
+        writeFloatComplexPackedMatrix(a, name, fo);
+    else:
+        writeDoubleComplexPackedMatrix(a, name, fo);
+
+# Write a float band matrix into a given file, in a banded-storage form.
+def writeGeneralFloatBandedMatrix(a, kl, ku, name, fo):
+    m = a.shape[0];
+    n = a.shape[1];
+    b = sMatGen(m, kl + ku + 1, 1);
+    zero(b);
+    for i in range(0, m):
+        for j in range(max(0, i-kl), min(i+ku+1, n)):
+            b[i, j-i+kl] = a[i, j]
+    writeFloatMatrix(b, name, 0, fo);
+    zero(a);
+    for i in range(0, m):
+        for j in range(max(0, i-kl), min(i+ku+1, n)):
+            a[i, j] = b[i, j-i+kl]
+
+# Write a double band matrix into a given file, in a banded-storage form.
+def writeGeneralDoubleBandedMatrix(a, kl, ku, name, fo):
+    m = a.shape[0];
+    n = a.shape[1];
+    b = dMatGen(m, kl + ku + 1, 1);
+    zero(b);
+    for i in range(0, m):
+        for j in range(max(0, i-kl), min(i+ku+1, n)):
+            b[i, j-i+kl] = a[i, j]
+    writeDoubleMatrix(b, name, 0, fo);
+    zero(a);
+    for i in range(0, m):
+        for j in range(max(0, i-kl), min(i+ku+1, n)):
+            a[i, j] = b[i, j-i+kl]
+
+# Write a float complex band matrix into a given file, in a banded-storage form.
+def writeGeneralFloatComplexBandedMatrix(a, kl, ku, name, fo):
+    m = a.shape[0];
+    n = a.shape[1];
+    b = cMatGen(m, kl + ku + 1, 1);
+    zero(b);
+    for i in range(0, m):
+        for j in range(max(0, i-kl), min(i+ku+1, n)):
+            b[i, j-i+kl] = a[i, j]
+    writeFloatComplexMatrix(b, name, 0, fo);
+    zero(a);
+    for i in range(0, m):
+        for j in range(max(0, i-kl), min(i+ku+1, n)):
+            a[i, j] = b[i, j-i+kl]
+
+# Write a double complex band matrix into a given file, in a banded-storage form.
+def writeGeneralDoubleComplexBandedMatrix(a, kl, ku, name, fo):
+    m = a.shape[0];
+    n = a.shape[1];
+    b = zMatGen(m, kl + ku + 1, 1);
+    zero(b);
+    for i in range(0, m):
+        for j in range(max(0, i-kl), min(i+ku+1, n)):
+            b[i, j-i+kl] = a[i, j]
+    writeDoubleComplexMatrix(b, name, 0, fo);
+    zero(a);
+    for i in range(0, m):
+        for j in range(max(0, i-kl), min(i+ku+1, n)):
+            a[i, j] = b[i, j-i+kl]
+
+# Wrapper to write a band matrix into a given file, in a banded-storage form.
+def writeGeneralBandedMatrix(dt, a, kl, ku, name, fo):
+    if dt == 's':
+        writeGeneralFloatBandedMatrix(a, kl, ku, name, fo);
+    elif dt == 'd':
+        writeGeneralDoubleBandedMatrix(a, kl, ku, name, fo);
+    elif dt == 'c':
+        writeGeneralFloatComplexBandedMatrix(a, kl, ku, name, fo);
+    else:
+        writeGeneralDoubleComplexBandedMatrix(a, kl, ku, name, fo);
+
+# Write a float symmetric or hermitian band matrix into a given file, in a banded-storage form.
+def writeFloatSymmBandedMatrix(a, k, name, fo):
+    n = a.shape[1];
+    b = sMatGen(n, k+1, 1);
+    zero(b);
+    for i in range(0, n):
+        for j in range(i, min(i+k+1, n)):
+            b[i, j-i] = a[i, j]
+    writeFloatMatrix(b, name, 0, fo);
+    zero(a);
+    for i in range(0, n):
+        for j in range(i, min(i+k+1, n)):
+            a[i, j] = b[i, j-i]
+
+# Write a double symmetric or hermitian band matrix into a given file, in a banded-storage form.
+def writeDoubleSymmBandedMatrix(a, k, name, fo):
+    n = a.shape[1];
+    b = dMatGen(n, k+1, 1);
+    zero(b);
+    for i in range(0, n):
+        for j in range(i, min(i+k+1, n)):
+            b[i, j-i] = a[i, j]
+    writeDoubleMatrix(b, name, 0, fo);
+    zero(a);
+    for i in range(0, n):
+        for j in range(i, min(i+k+1, n)):
+            a[i, j] = b[i, j-i]
+
+# Write a float complex symmetric or hermitian band matrix into a given file, in a banded-storage form.
+def writeFloatComplexSymmBandedMatrix(a, k, name, fo):
+    n = a.shape[1];
+    b = cMatGen(n, k+1, 1);
+    zero(b);
+    for i in range(0, n):
+        for j in range(i, min(i+k+1, n)):
+            b[i, j-i] = a[i, j]
+    writeFloatComplexMatrix(b, name, 0, fo);
+    zero(a);
+    for i in range(0, n):
+        for j in range(i, min(i+k+1, n)):
+            a[i, j] = b[i, j-i]
+
+# Write a double complex symmetric or hermitian band matrix into a given file, in a banded-storage form.
+def writeDoubleComplexSymmBandedMatrix(a, k, name, fo):
+    n = a.shape[1];
+    b = zMatGen(n, k+1, 1);
+    zero(b);
+    for i in range(0, n):
+        for j in range(i, min(i+k+1, n)):
+            b[i, j-i] = a[i, j]
+    writeDoubleComplexMatrix(b, name, 0, fo);
+    zero(a);
+    for i in range(0, n):
+        for j in range(i, min(i+k+1, n)):
+            a[i, j] = b[i, j-i]
+
+# Wrapper to write a symmetric or hermitian band matrix into a given file, in a banded-storage form.
+def writeSymmBandedMatrix(dt, a, k, name, fo):
+    if dt == 's':
+        writeFloatSymmBandedMatrix(a, k, name, fo);
+    elif dt == 'd':
+        writeDoubleSymmBandedMatrix(a, k, name, fo);
+    elif dt == 'c':
+        writeFloatComplexSymmBandedMatrix(a, k, name, fo);
+    else:
+        writeDoubleComplexSymmBandedMatrix(a, k, name, fo);
+
+
+
+#L3 Functions, generate input and output matrices to file.
+def L3_xGEMM(fo, alpha, beta, m, n, k):
+    dataType = ['s', 'd', 'c', 'z'];
+
+    for dt in dataType:
+        a = matrixCreate(dt, m, k);
+        b = matrixCreate(dt, k, n);
+        c = matrixCreate(dt, m, n);
+        writeMatrix(dt, a, "L3_" + dt + "GEMM_A_mk", fo);
+        writeMatrix(dt, b, "L3_" + dt + "GEMM_B_kn", fo);
+        writeMatrix(dt, c, "L3_" + dt + "GEMM_C_mn", fo);
+
+        d = alpha * a * b + beta * c;
+        writeMatrix(dt, d, "L3_" + dt + "GEMM_o_NN", fo);
+
+        a = matrixCreate(dt, k, m);
+        b = matrixCreate(dt, n, k);
+        writeMatrix(dt, a, "L3_" + dt + "GEMM_A_km", fo);
+        writeMatrix(dt, b, "L3_" + dt + "GEMM_B_nk", fo);
+
+        d = alpha * a.T * b.T + beta * c;
+        writeMatrix(dt, d, "L3_" + dt + "GEMM_o_TT", fo);
+        d = alpha * a.H * b.H + beta * c;
+        writeMatrix(dt, d, "L3_" + dt + "GEMM_o_HH", fo);
+
+def L3_xSYMM(fo, alpha, beta, m, n):
+    dataType = ['s', 'd', 'c', 'z'];
+
+    for dt in dataType:
+        a = matrixCreate(dt, m, m);
+        symm(a);
+        writeMatrix(dt, a, "L3_" + dt + "SYMM_A_mm", fo);
+
+        b = matrixCreate(dt, m, n);
+        c = matrixCreate(dt, m, n);
+        writeMatrix(dt, b, "L3_" + dt + "SYMM_B_mn", fo);
+        writeMatrix(dt, c, "L3_" + dt + "SYMM_C_mn", fo);
+
+        d = alpha * a * b + beta * c;
+        writeMatrix(dt, d, "L3_" + dt + "SYMM_o_L", fo);
+
+        a = matrixCreate(dt, n, n);
+        symm(a);
+        writeMatrix(dt, a, "L3_" + dt + "SYMM_A_nn", fo);
+        d = alpha * b * a + beta * c;
+        writeMatrix(dt, d, "L3_" + dt + "SYMM_o_R", fo);
+
+def L3_xHEMM(fo, alpha, beta, m, n):
+    dataType = ['c', 'z'];
+
+    for dt in dataType:
+        a = matrixCreate(dt, m, m);
+        herm(a);
+        writeMatrix(dt, a, "L3_" + dt + "HEMM_A_mm", fo);
+
+        b = matrixCreate(dt, m, n);
+        c = matrixCreate(dt, m, n);
+        writeMatrix(dt, b, "L3_" + dt + "HEMM_B_mn", fo);
+        writeMatrix(dt, c, "L3_" + dt + "HEMM_C_mn", fo);
+
+        d = alpha * a * b + beta * c;
+        writeMatrix(dt, d, "L3_" + dt + "HEMM_o_L", fo);
+
+        a = matrixCreate(dt, n, n);
+        herm(a);
+        writeMatrix(dt, a, "L3_" + dt + "HEMM_A_nn", fo);
+        d = alpha * b * a + beta * c;
+        writeMatrix(dt, d, "L3_" + dt + "HEMM_o_R", fo);
+
+def L3_xSYRK(fo, alpha, beta, n, k):
+    dataType = ['s', 'd', 'c', 'z'];
+
+    for dt in dataType:
+        a = matrixCreate(dt, n, k);
+        writeMatrix(dt, a, "L3_" + dt + "SYRK_A_nk", fo);
+        c = matrixCreate(dt, n, n);
+        symm(c);
+        writeMatrix(dt, c, "L3_" + dt + "SYRK_C_nn", fo);
+        d = alpha * a * a.T + beta * c;
+        writeMatrix(dt, d, "L3_" + dt + "SYRK_o_N", fo);
+
+        a = matrixCreate(dt, k, n);
+        writeMatrix(dt, a, "L3_" + dt + "SYRK_A_kn", fo);
+        d = alpha * a.T * a + beta * c;
+        writeMatrix(dt, d, "L3_" + dt + "SYRK_o_T", fo);
+
+def L3_xHERK(fo, alpha, beta, n, k):
+    dataType = ['c', 'z'];
+
+    for dt in dataType:
+        a = matrixCreate(dt, n, k);
+        writeMatrix(dt, a, "L3_" + dt + "HERK_A_nk", fo);
+        c = matrixCreate(dt, n, n);
+        herm(c);
+        writeMatrix(dt, c, "L3_" + dt + "HERK_C_nn", fo);
+        d = alpha * a * a.H + beta * c;
+        writeMatrix(dt, d, "L3_" + dt + "HERK_o_N", fo);
+
+        a = matrixCreate(dt, k, n);
+        writeMatrix(dt, a, "L3_" + dt + "HERK_A_kn", fo);
+        d = alpha * a.H * a + beta * c;
+        writeMatrix(dt, d, "L3_" + dt + "HERK_o_H", fo);
+
+def L3_xSYR2K(fo, alpha, beta, n, k):
+    dataType = ['s', 'd', 'c', 'z'];
+
+    for dt in dataType:
+        a = matrixCreate(dt, n, k);
+        b = matrixCreate(dt, n, k);
+        writeMatrix(dt, a, "L3_" + dt + "SYR2K_A_nk", fo);
+        writeMatrix(dt, b, "L3_" + dt + "SYR2K_B_nk", fo);
+        c = matrixCreate(dt, n, n);
+        symm(c);
+        writeMatrix(dt, c, "L3_" + dt + "SYR2K_C_nn", fo);
+        d = alpha * (a * b.T + b * a.T) + beta * c;
+        writeMatrix(dt, d, "L3_" + dt + "SYR2K_o_N", fo);
+
+        a = matrixCreate(dt, k, n);
+        b = matrixCreate(dt, k, n);
+        writeMatrix(dt, a, "L3_" + dt + "SYR2K_A_kn", fo);
+        writeMatrix(dt, b, "L3_" + dt + "SYR2K_B_kn", fo);
+        d = alpha * (a.T * b + b.T * a) + beta * c;
+        writeMatrix(dt, d, "L3_" + dt + "SYR2K_o_T", fo);
+
+def L3_xHER2K(fo, alpha, beta, n, k):
+    dataType = ['c', 'z'];
+
+    for dt in dataType:
+        a = matrixCreate(dt, n, k);
+        b = matrixCreate(dt, n, k);
+        writeMatrix(dt, a, "L3_" + dt + "HER2K_A_nk", fo);
+        writeMatrix(dt, b, "L3_" + dt + "HER2K_B_nk", fo);
+        c = matrixCreate(dt, n, n);
+        herm(c);
+        writeMatrix(dt, c, "L3_" + dt + "HER2K_C_nn", fo);
+        d = alpha * (a * b.H + b * a.H) + beta * c;
+        writeMatrix(dt, d, "L3_" + dt + "HER2K_o_N", fo);
+
+        a = matrixCreate(dt, k, n);
+        b = matrixCreate(dt, k, n);
+        writeMatrix(dt, a, "L3_" + dt + "HER2K_A_kn", fo);
+        writeMatrix(dt, b, "L3_" + dt + "HER2K_B_kn", fo);
+        d = alpha * (a.H * b + b.H * a) + beta * c;
+        writeMatrix(dt, d, "L3_" + dt + "HER2K_o_H", fo);
+
+
+def L3_xTRMM(fo, alpha, m, n):
+    dataType = ['s', 'd', 'c', 'z'];
+
+    for dt in dataType:
+        a = matrixCreate(dt, m, m);
+        triangularMatrixGen(a, 'u');
+        writeMatrix(dt, a, "L3_" + dt + "TRMM_A_mm", fo);
+        b = matrixCreate(dt, m, n);
+        writeMatrix(dt, b, "L3_" + dt + "TRMM_B_mn", fo);
+        d = alpha * a * b;
+        writeMatrix(dt, d, "L3_" + dt + "TRMM_o_LUN", fo);
+
+        a = matrixCreate(dt, n, n);
+        triangularMatrixGen(a, 'l');
+        writeMatrix(dt, a, "L3_" + dt + "TRMM_A_nn", fo);
+        d = alpha * b * a.T;
+        writeMatrix(dt, d, "L3_" + dt + "TRMM_o_RLT", fo);
+
+def L3_xTRSM(fo, alpha, m, n):
+    dataType = ['s', 'd', 'c', 'z'];
+
+    for dt in dataType:
+        a = matrixCreateScale(dt, m, m, 1);
+        triangularMatrixGen(a, 'u');
+        writeMatrix(dt, a, "L3_" + dt + "TRSM_A_mm", fo);
+        b = matrixCreate(dt, m, n);
+        writeMatrix(dt, b, "L3_" + dt + "TRSM_B_mn", fo);
+
+        d = alpha * (a.I * b);
+        writeMatrix(dt, d, "L3_" + dt + "TRSM_o_LUN", fo);
+
+        a = matrixCreate(dt, n, n);
+        triangularMatrixGen(a, 'l');
+        writeMatrix(dt, a, "L3_" + dt + "TRSM_A_nn", fo);
+
+        d = alpha * (b * a.I.T);
+        writeMatrix(dt, d, "L3_" + dt + "TRSM_o_RLT", fo);
+
+#L2 Functions, generate input and output matrices to file.
+def L2_xGEMV(fo, alpha, beta, m, n):
+    dataType = ['s', 'd', 'c', 'z'];
+    for dt in dataType:
+        a = matrixCreate(dt, m, n);
+        writeMatrix(dt, a, "L2_" + dt + "GEMV_A_mn", fo);
+
+        x = matrixCreate(dt, n, 1);
+        writeMatrix(dt, x, "L2_" + dt + "GEMV_x_n1", fo);
+        writeMatrixWithIncrements(dt, x, "L2_" + dt + "GEMV_x_n2", 1, fo);
+
+        y = matrixCreate(dt, m, 1);
+        writeMatrix(dt, y, "L2_" + dt + "GEMV_y_m1", fo);
+        writeMatrixWithIncrements(dt, y, "L2_" + dt + "GEMV_y_m2", 2, fo);
+
+        d = alpha * a * x + beta * y;
+        writeMatrix(dt, d, "L2_" + dt + "GEMV_o_N", fo);
+        writeMatrixWithIncrements(dt, d, "L2_" + dt + "GEMV_o_N2", 2, fo);
+
+        d = alpha * a.T * y + beta * x;
+        writeMatrix(dt, d, "L2_" + dt + "GEMV_o_T", fo);
+
+        d = alpha * a.H * y + beta * x;
+        writeMatrix(dt, d, "L2_" + dt + "GEMV_o_H", fo);
+
+def L2_xGBMV(fo, alpha, beta, m, n, kl, ku):
+    dataType = ['s', 'd', 'c', 'z'];
+    for dt in dataType:
+        a = matrixCreate(dt, m, n);
+        writeGeneralBandedMatrix(dt, a, kl, ku, "L2_" + dt + "GBMV_A_mn", fo);
+
+        x = matrixCreate(dt, n, 1);
+        writeMatrix(dt, x, "L2_" + dt + "GBMV_x_n1", fo);
+        writeMatrixWithIncrements(dt, x, "L2_" + dt + "GBMV_x_n2", 1, fo);
+
+        y = matrixCreate(dt, m, 1);
+        writeMatrix(dt, y, "L2_" + dt + "GBMV_y_m1", fo);
+        writeMatrixWithIncrements(dt, y, "L2_" + dt + "GBMV_y_m2", 2, fo);
+
+        d = alpha * a * x + beta * y;
+        writeMatrix(dt, d, "L2_" + dt + "GBMV_o_N", fo);
+        writeMatrixWithIncrements(dt, d, "L2_" + dt + "GBMV_o_N2", 2, fo);
+
+        d = alpha * a.T * y + beta * x;
+        writeMatrix(dt, d, "L2_" + dt + "GBMV_o_T", fo);
+
+        d = alpha * a.H * y + beta * x;
+        writeMatrix(dt, d, "L2_" + dt + "GBMV_o_H", fo);
+
+def L2_xHEMV(fo, alpha, beta, n):
+    dataType = ['c', 'z'];
+    for dt in dataType:
+        a = matrixCreate(dt, n, n);
+        herm(a);
+        writeMatrix(dt, a, "L2_" + dt + "HEMV_A_nn", fo);
+        writePackedMatrix(dt, a, "L2_" + dt + "HEMV_A_nn_pu", fo);
+
+        x = matrixCreate(dt, n, 1);
+        writeMatrix(dt, x, "L2_" + dt + "HEMV_x_n1", fo);
+        writeMatrixWithIncrements(dt, x, "L2_" + dt + "HEMV_x_n2", 1, fo);
+
+        y = matrixCreate(dt, n, 1);
+        writeMatrix(dt, y, "L2_" + dt + "HEMV_y_n1", fo);
+        writeMatrixWithIncrements(dt, y, "L2_" + dt + "HEMV_y_n2", 2, fo);
+
+        d = alpha * a * x + beta * y;
+        writeMatrix(dt, d, "L2_" + dt + "HEMV_o_N", fo);
+        writeMatrixWithIncrements(dt, d, "L2_" + dt + "HEMV_o_N2", 2, fo);
+
+def L2_xHBMV(fo, alpha, beta, n, k):
+    dataType = ['c', 'z'];
+    for dt in dataType:
+        a = matrixCreate(dt, n, n);
+        herm(a);
+        writeSymmBandedMatrix(dt, a, k, "L2_" + dt + "HBMV_A_nn", fo);
+        herm(a);
+
+        x = matrixCreate(dt, n, 1);
+        writeMatrix(dt, x, "L2_" + dt + "HBMV_x_n1", fo);
+        writeMatrixWithIncrements(dt, x, "L2_" + dt + "HBMV_x_n2", 1, fo);
+
+        y = matrixCreate(dt, n, 1);
+        writeMatrix(dt, y, "L2_" + dt + "HBMV_y_n1", fo);
+        writeMatrixWithIncrements(dt, y, "L2_" + dt + "HBMV_y_n2", 2, fo);
+
+        d = alpha * a * x + beta * y;
+        writeMatrix(dt, d, "L2_" + dt + "HBMV_o_N", fo);
+        writeMatrixWithIncrements(dt, d, "L2_" + dt + "HBMV_o_N2", 2, fo);
+
+
+def L2_xSYMV(fo, alpha, beta, n):
+    dataType = ['s', 'd'];
+    for dt in dataType:
+        a = matrixCreate(dt, n, n);
+        symm(a);
+        writeMatrix(dt, a, "L2_" + dt + "SYMV_A_nn", fo);
+        writePackedMatrix(dt, a, "L2_" + dt + "SYMV_A_nn_pu", fo);
+
+        x = matrixCreate(dt, n, 1);
+        writeMatrix(dt, x, "L2_" + dt + "SYMV_x_n1", fo);
+        writeMatrixWithIncrements(dt, x, "L2_" + dt + "SYMV_x_n2", 1, fo);
+
+        y = matrixCreate(dt, n, 1);
+        writeMatrix(dt, y, "L2_" + dt + "SYMV_y_n1", fo);
+        writeMatrixWithIncrements(dt, y, "L2_" + dt + "SYMV_y_n2", 2, fo);
+
+        d = alpha * a * x + beta * y;
+        writeMatrix(dt, d, "L2_" + dt + "SYMV_o_N", fo);
+        writeMatrixWithIncrements(dt, d, "L2_" + dt + "SYMV_o_N2", 2, fo);
+
+def L2_xSBMV(fo, alpha, beta, n, k):
+    dataType = ['s', 'd'];
+    for dt in dataType:
+        a = matrixCreate(dt, n, n);
+        symm(a);
+        writeSymmBandedMatrix(dt, a, k, "L2_" + dt + "SBMV_A_nn", fo);
+        symm(a);
+
+        x = matrixCreate(dt, n, 1);
+        writeMatrix(dt, x, "L2_" + dt + "SBMV_x_n1", fo);
+        writeMatrixWithIncrements(dt, x, "L2_" + dt + "SBMV_x_n2", 1, fo);
+
+        y = matrixCreate(dt, n, 1);
+        writeMatrix(dt, y, "L2_" + dt + "SBMV_y_n1", fo);
+        writeMatrixWithIncrements(dt, y, "L2_" + dt + "SBMV_y_n2", 2, fo);
+
+        d = alpha * a * x + beta * y;
+        writeMatrix(dt, d, "L2_" + dt + "SBMV_o_N", fo);
+        writeMatrixWithIncrements(dt, d, "L2_" + dt + "SBMV_o_N2", 2, fo);
+
+
+def L2_xTRMV(fo, n):
+    dataType = ['s', 'd', 'c', 'z'];
+    for dt in dataType:
+        a = matrixCreate(dt, n, n);
+        triangularMatrixGen(a, 'u');
+        writeMatrix(dt, a, "L2_" + dt + "TRMV_A_nn", fo);
+        writePackedMatrix(dt, a, "L2_" + dt + "TRMV_A_nn_pu", fo);
+
+        x = matrixCreate(dt, n, 1);
+        writeMatrix(dt, x, "L2_" + dt + "TRMV_x_n1", fo);
+        writeMatrixWithIncrements(dt, x, "L2_" + dt + "TRMV_x_n2", 1, fo);
+
+        d = a * x;
+        writeMatrix(dt, d, "L2_" + dt + "TRMV_o_UN", fo);
+        writeMatrixWithIncrements(dt, d, "L2_" + dt + "TRMV_o_UN2", 1, fo);
+
+        d = a.T * x;
+        writeMatrix(dt, d, "L2_" + dt + "TRMV_o_UT", fo);
+
+        d = a.H * x;
+        writeMatrix(dt, d, "L2_" + dt + "TRMV_o_UH", fo);
+
+def L2_xTBMV(fo, n, k):
+    dataType = ['s', 'd', 'c', 'z'];
+    for dt in dataType:
+        a = matrixCreate(dt, n, n);
+        writeSymmBandedMatrix(dt, a, k, "L2_" + dt + "TBMV_A_nn", fo);
+
+        x = matrixCreate(dt, n, 1);
+        writeMatrix(dt, x, "L2_" + dt + "TBMV_x_n1", fo);
+        writeMatrixWithIncrements(dt, x, "L2_" + dt + "TBMV_x_n2", 1, fo);
+
+        d = a * x;
+        writeMatrix(dt, d, "L2_" + dt + "TBMV_o_UN", fo);
+        writeMatrixWithIncrements(dt, d, "L2_" + dt + "TBMV_o_UN2", 1, fo);
+
+        d = a.T * x;
+        writeMatrix(dt, d, "L2_" + dt + "TBMV_o_UT", fo);
+
+        d = a.H * x;
+        writeMatrix(dt, d, "L2_" + dt + "TBMV_o_UH", fo);
+
+
+def L2_xTRSV(fo, n):
+    dataType = ['s', 'd', 'c', 'z'];
+    for dt in dataType:
+        a = matrixCreateScale(dt, n, n, 0.25);
+        triangularMatrixGen(a, 'u');
+        writeMatrix(dt, a, "L2_" + dt + "TRSV_A_nn", fo);
+        writePackedMatrix(dt, a, "L2_" + dt + "TRSV_A_nn_pu", fo);
+
+        x = matrixCreate(dt, n, 1);
+        writeMatrix(dt, x, "L2_" + dt + "TRSV_x_n1", fo);
+        writeMatrixWithIncrements(dt, x, "L2_" + dt + "TRSV_x_n2", 1, fo);
+
+        d = a.I * x;
+        writeMatrix(dt, d, "L2_" + dt + "TRSV_o_UN", fo);
+        writeMatrixWithIncrements(dt, d, "L2_" + dt + "TRSV_o_UN2", 1, fo);
+
+        d = a.I.T * x;
+        writeMatrix(dt, d, "L2_" + dt + "TRSV_o_UT", fo);
+
+        d = a.I.H * x;
+        writeMatrix(dt, d, "L2_" + dt + "TRSV_o_UH", fo);
+
+def L2_xTBSV(fo, n, k):
+    dataType = ['s', 'd', 'c', 'z'];
+    for dt in dataType:
+        a = matrixCreateScale(dt, n, n, 0.25);
+        writeSymmBandedMatrix(dt, a, k, "L2_" + dt + "TBSV_A_nn", fo);
+
+        x = matrixCreate(dt, n, 1);
+        writeMatrix(dt, x, "L2_" + dt + "TBSV_x_n1", fo);
+        writeMatrixWithIncrements(dt, x, "L2_" + dt + "TBSV_x_n2", 1, fo);
+
+        d = a.I * x;
+        writeMatrix(dt, d, "L2_" + dt + "TBSV_o_UN", fo);
+        writeMatrixWithIncrements(dt, d, "L2_" + dt + "TBSV_o_UN2", 1, fo);
+
+        d = a.I.T * x;
+        writeMatrix(dt, d, "L2_" + dt + "TBSV_o_UT", fo);
+
+        d = a.I.H * x;
+        writeMatrix(dt, d, "L2_" + dt + "TBSV_o_UH", fo);
+
+
+def L2_xGER(fo, alpha, m, n):
+    dataType = ['s', 'd'];
+    for dt in dataType:
+        a = matrixCreate(dt, m, n);
+        writeMatrix(dt, a, "L2_" + dt + "GER_A_mn", fo);
+
+        x = matrixCreate(dt, m, 1);
+        writeMatrix(dt, x, "L2_" + dt + "GER_x_m1", fo);
+        writeMatrixWithIncrements(dt, x, "L2_" + dt + "GER_x_m2", 1, fo);
+
+        y = matrixCreate(dt, n, 1);
+        writeMatrix(dt, y, "L2_" + dt + "GER_y_n1", fo);
+        writeMatrixWithIncrements(dt, y, "L2_" + dt + "GER_y_n2", 2, fo);
+
+        d = alpha * x * y.T + a;
+        writeMatrix(dt, d, "L2_" + dt + "GER_o_N", fo);
+
+def L2_xGERU(fo, alpha, m, n):
+    dataType = ['c', 'z'];
+    for dt in dataType:
+        a = matrixCreate(dt, m, n);
+        writeMatrix(dt, a, "L2_" + dt + "GERU_A_mn", fo);
+
+        x = matrixCreate(dt, m, 1);
+        writeMatrix(dt, x, "L2_" + dt + "GERU_x_m1", fo);
+        writeMatrixWithIncrements(dt, x, "L2_" + dt + "GERU_x_m2", 1, fo);
+
+        y = matrixCreate(dt, n, 1);
+        writeMatrix(dt, y, "L2_" + dt + "GERU_y_n1", fo);
+        writeMatrixWithIncrements(dt, y, "L2_" + dt + "GERU_y_n2", 2, fo);
+
+        d = alpha * x * y.T + a;
+        writeMatrix(dt, d, "L2_" + dt + "GERU_o_N", fo);
+
+def L2_xGERC(fo, alpha, m, n):
+    dataType = ['c', 'z'];
+    for dt in dataType:
+        a = matrixCreate(dt, m, n);
+        writeMatrix(dt, a, "L2_" + dt + "GERC_A_mn", fo);
+
+        x = matrixCreate(dt, m, 1);
+        writeMatrix(dt, x, "L2_" + dt + "GERC_x_m1", fo);
+        writeMatrixWithIncrements(dt, x, "L2_" + dt + "GERC_x_m2", 1, fo);
+
+        y = matrixCreate(dt, n, 1);
+        writeMatrix(dt, y, "L2_" + dt + "GERC_y_n1", fo);
+        writeMatrixWithIncrements(dt, y, "L2_" + dt + "GERC_y_n2", 2, fo);
+
+        d = alpha * x * y.H + a;
+        writeMatrix(dt, d, "L2_" + dt + "GERC_o_N", fo);
+
+def L2_xHER(fo, alpha, n):
+    dataType = ['c', 'z'];
+    for dt in dataType:
+        a = matrixCreate(dt, n, n);
+        herm(a);
+        writeMatrix(dt, a, "L2_" + dt + "HER_A_nn", fo);
+        writePackedMatrix(dt, a, "L2_" + dt + "HER_A_nn_pu", fo);
+
+        x = matrixCreate(dt, n, 1);
+        writeMatrix(dt, x, "L2_" + dt + "HER_x_n1", fo);
+        writeMatrixWithIncrements(dt, x, "L2_" + dt + "HER_x_n2", 1, fo);
+
+        d = alpha * x * x.H + a;
+        writeMatrix(dt, d, "L2_" + dt + "HER_o_N", fo);
+        writePackedMatrix(dt, d, "L2_" + dt + "HER_o_N_pu", fo);
+
+
+def L2_xHER2(fo, alpha, n):
+    dataType = ['c', 'z'];
+    for dt in dataType:
+        a = matrixCreate(dt, n, n);
+        herm(a);
+        writeMatrix(dt, a, "L2_" + dt + "HER2_A_nn", fo);
+        writePackedMatrix(dt, a, "L2_" + dt + "HER2_A_nn_pu", fo);
+
+        x = matrixCreate(dt, n, 1);
+        writeMatrix(dt, x, "L2_" + dt + "HER2_x_n1", fo);
+        writeMatrixWithIncrements(dt, x, "L2_" + dt + "HER2_x_n2", 1, fo);
+
+        y = matrixCreate(dt, n, 1);
+        writeMatrix(dt, y, "L2_" + dt + "HER2_y_n1", fo);
+        writeMatrixWithIncrements(dt, y, "L2_" + dt + "HER2_y_n2", 2, fo);
+
+        d = alpha * x * y.H + y * (alpha * x.H) + a;
+        writeMatrix(dt, d, "L2_" + dt + "HER2_o_N", fo);
+        writePackedMatrix(dt, d, "L2_" + dt + "HER2_o_N_pu", fo);
+
+def L2_xSYR(fo, alpha, n):
+    dataType = ['s', 'd'];
+    for dt in dataType:
+        a = matrixCreate(dt, n, n);
+        writeMatrix(dt, a, "L2_" + dt + "SYR_A_nn", fo);
+        writePackedMatrix(dt, a, "L2_" + dt + "SYR_A_nn_pu", fo);
+
+        x = matrixCreate(dt, n, 1);
+        writeMatrix(dt, x, "L2_" + dt + "SYR_x_n1", fo);
+        writeMatrixWithIncrements(dt, x, "L2_" + dt + "SYR_x_n2", 1, fo);
+
+        d = alpha * x * x.T + a;
+        writeMatrix(dt, d, "L2_" + dt + "SYR_o_N", fo);
+        writePackedMatrix(dt, d, "L2_" + dt + "SYR_o_N_pu", fo);
+
+def L2_xSYR2(fo, alpha, n):
+    dataType = ['s', 'd'];
+    for dt in dataType:
+        a = matrixCreate(dt, n, n);
+        writeMatrix(dt, a, "L2_" + dt + "SYR2_A_nn", fo);
+        writePackedMatrix(dt, a, "L2_" + dt + "SYR2_A_nn_pu", fo);
+
+        x = matrixCreate(dt, n, 1);
+        writeMatrix(dt, x, "L2_" + dt + "SYR2_x_n1", fo);
+        writeMatrixWithIncrements(dt, x, "L2_" + dt + "SYR2_x_n2", 1, fo);
+
+        y = matrixCreate(dt, n, 1);
+        writeMatrix(dt, y, "L2_" + dt + "SYR2_y_n1", fo);
+        writeMatrixWithIncrements(dt, y, "L2_" + dt + "SYR2_y_n2", 2, fo);
+
+        d = alpha * x * y.T + y * (alpha * x.T) + a;
+        writeMatrix(dt, d, "L2_" + dt + "SYR2_o_N", fo);
+        writePackedMatrix(dt, d, "L2_" + dt + "SYR2_o_N_pu", fo);
+
+
+def testBLASL2L3(fo):
+    m = random.randint(10, 20);
+    n = random.randint(10, 20);
+    k = random.randint(10, 20);
+    kl = random.randint(1, 5);
+    ku = random.randint(1, 5);
+
+    alpha = 1.0;
+    beta = 1.0;
+
+    fo.write("M, N, K, KL, KU" + ';\n');
+    fo.write(str(m) + " " + str(n) + " " + str(k) + " " + str(kl) + " " + str(ku) + '\n');
+    fo.write('\n');
+
+    L2_xGEMV(fo, alpha, beta, m, n);
+    L2_xGBMV(fo, alpha, beta, m, n, kl, ku);
+    L2_xHEMV(fo, alpha, beta, n);
+    L2_xHBMV(fo, alpha, beta, n, kl);
+    L2_xSYMV(fo, alpha, beta, n);
+    L2_xSBMV(fo, alpha, beta, n, kl);
+    L2_xTRMV(fo, n);
+    L2_xTBMV(fo, n, kl);
+    L2_xTRSV(fo, n);
+    L2_xTBSV(fo, n, kl);
+    L2_xGER(fo, alpha, m, n);
+    L2_xGERU(fo, alpha, m, n);
+    L2_xGERC(fo, alpha, m, n);
+    L2_xHER(fo, alpha, n);
+    L2_xHER2(fo, alpha, n);
+    L2_xSYR(fo, alpha, n);
+    L2_xSYR2(fo, alpha, n);
+
+    L3_xGEMM(fo, alpha, beta, m, n, k);
+    L3_xSYMM(fo, alpha, beta, m, n);
+    L3_xHEMM(fo, alpha, beta, m, n);
+    L3_xSYRK(fo, alpha, beta, n, k);
+    L3_xHERK(fo, alpha, beta, n, k);
+    L3_xSYR2K(fo, alpha, beta, n, k);
+    L3_xHER2K(fo, alpha, beta, n, k);
+    L3_xTRMM(fo, alpha, m, n);
+    L3_xTRSM(fo, alpha, m, n);
+
+    return;
+
+def javaDataGen():
+    fo = open("BLASData.txt", "w+")
+    fo.write("/* Don't edit this file!  It is auto-generated by blas_gen.py. */\n");
+    fo.write("\n");
+
+    #data body
+    testBLASL2L3(fo);
+    fo.close()
+    return;
+
+javaDataGen();
+
diff --git a/tests/tests/renderscript/libbnnmdata/Android.mk b/tests/tests/renderscript/libbnnmdata/Android.mk
new file mode 100644
index 0000000..471d74a
--- /dev/null
+++ b/tests/tests/renderscript/libbnnmdata/Android.mk
@@ -0,0 +1,25 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+LOCAL_CLANG := true
+
+LOCAL_MODULE := libbnnmdata_jni
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := test_data.cpp
+
+LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/tests/tests/renderscript/libbnnmdata/test_data.cpp b/tests/tests/renderscript/libbnnmdata/test_data.cpp
new file mode 100644
index 0000000..91222c2
--- /dev/null
+++ b/tests/tests/renderscript/libbnnmdata/test_data.cpp
@@ -0,0 +1,56591 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#include <jni.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+const int m = 256;
+const int n = 192;
+const int k = 1152;
+const int a_offset = 0;
+const int b_offset = 84;
+const int c_mult_int = 3401;
+const int c_offset = 74980;
+
+const int a_count = (m * k);
+const int b_count = (n * k);
+const int c_count = (m * n);
+
+unsigned char a_data[a_count] = {
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 39, 14, 0, 0, 0, 63, 31,
+  0, 36, 15, 0, 0, 12, 10, 93, 23, 78,
+  37, 39, 52, 0, 44, 62, 9, 23, 34, 48,
+  251, 53, 0, 0, 103, 0, 11, 0, 0, 19,
+  12, 43, 34, 0, 10, 7, 84, 61, 0, 22,
+  0, 69, 0, 28, 41, 0, 20, 0, 7, 14,
+  0, 3, 6, 7, 15, 0, 0, 16, 25, 16,
+  0, 28, 0, 14, 83, 9, 21, 62, 7, 4,
+  7, 0, 53, 0, 16, 0, 0, 1, 0, 4,
+  66, 24, 50, 9, 0, 0, 69, 27, 15, 2,
+  14, 33, 3, 0, 1, 18, 73, 0, 43, 0,
+  0, 6, 26, 16, 10, 44, 0, 0, 22, 18,
+  0, 41, 77, 0, 0, 0, 0, 0, 27, 20,
+  27, 77, 56, 1, 0, 0, 53, 33, 0, 26,
+  0, 19, 15, 40, 3, 80, 27, 70, 9, 40,
+  13, 19, 51, 56, 1, 0, 62, 39, 168, 33,
+  0, 2, 112, 0, 35, 0, 0, 8, 0, 15,
+  15, 0, 16, 4, 70, 57, 0, 21, 0, 58,
+  0, 81, 74, 0, 31, 0, 4, 0, 0, 0,
+  31, 0, 5, 36, 0, 9, 25, 0, 0, 65,
+  0, 19, 22, 10, 17, 20, 19, 22, 19, 0,
+  39, 0, 23, 18, 0, 9, 5, 21, 68, 17,
+  39, 0, 0, 0, 34, 0, 67, 16, 7, 35,
+  9, 16, 42, 18, 111, 0, 19, 7, 30, 4,
+  45, 33, 26, 6, 0, 0, 14, 0, 1, 30,
+  86, 0, 9, 0, 3, 0, 26, 19, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 12, 21, 64, 6,
+  0, 0, 17, 8, 0, 10, 24, 0, 0, 65,
+  0, 74, 92, 76, 35, 40, 22, 3, 39, 33,
+  0, 0, 31, 58, 156, 6, 15, 0, 58, 0,
+  0, 0, 0, 18, 0, 18, 5, 27, 0, 0,
+  53, 31, 0, 18, 0, 0, 0, 47, 40, 0,
+  10, 0, 0, 9, 0, 6, 28, 0, 0, 0,
+  0, 7, 44, 0, 48, 45, 0, 16, 17, 16,
+  28, 6, 22, 3, 0, 16, 38, 0, 14, 0,
+  0, 13, 0, 23, 45, 25, 8, 25, 0, 0,
+  67, 0, 51, 0, 0, 39, 3, 0, 27, 11,
+  67, 0, 18, 0, 0, 0, 20, 21, 9, 43,
+  3, 0, 12, 0, 0, 0, 64, 0, 5, 0,
+  0, 0, 55, 0, 56, 59, 50, 27, 4, 0,
+  2, 0, 0, 0, 8, 0, 48, 60, 4, 28,
+  76, 49, 0, 0, 0, 6, 1, 61, 24, 0,
+  35, 40, 0, 0, 13, 0, 67, 0, 0, 0,
+  0, 0, 0, 1, 0, 66, 2, 0, 30, 28,
+  26, 42, 0, 12, 0, 69, 96, 0, 23, 0,
+  0, 0, 0, 0, 51, 0, 0, 65, 0, 8,
+  82, 0, 40, 45, 0, 20, 0, 33, 32, 0,
+  14, 3, 0, 16, 42, 0, 37, 0, 0, 30,
+  0, 27, 36, 9, 13, 0, 0, 22, 2, 0,
+  70, 5, 0, 64, 0, 23, 40, 0, 76, 0,
+  6, 0, 58, 8, 17, 40, 5, 0, 26, 0,
+  1, 0, 0, 0, 39, 0, 71, 0, 10, 9,
+  14, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 39, 14, 0,
+  0, 0, 63, 31, 0, 36, 15, 0, 0, 12,
+  10, 93, 23, 78, 37, 39, 52, 0, 44, 62,
+  9, 23, 34, 48, 251, 53, 0, 0, 103, 0,
+  11, 0, 0, 19, 12, 43, 34, 0, 10, 7,
+  84, 61, 0, 22, 0, 69, 0, 28, 41, 0,
+  20, 0, 7, 14, 0, 3, 6, 7, 15, 0,
+  0, 16, 25, 16, 0, 28, 0, 14, 83, 9,
+  21, 62, 7, 4, 7, 0, 53, 0, 16, 0,
+  0, 1, 0, 4, 66, 24, 50, 9, 0, 0,
+  69, 27, 15, 2, 14, 33, 3, 0, 1, 18,
+  73, 0, 43, 0, 0, 6, 26, 16, 10, 44,
+  0, 0, 22, 18, 0, 41, 77, 0, 0, 0,
+  0, 0, 27, 20, 27, 77, 56, 1, 0, 0,
+  53, 33, 0, 26, 0, 19, 15, 40, 3, 80,
+  27, 70, 9, 40, 13, 19, 51, 56, 1, 0,
+  62, 39, 168, 33, 0, 2, 112, 0, 35, 0,
+  0, 8, 0, 15, 15, 0, 16, 4, 70, 57,
+  0, 21, 0, 58, 0, 81, 74, 0, 31, 0,
+  4, 0, 0, 0, 31, 0, 5, 36, 0, 9,
+  25, 0, 0, 65, 0, 19, 22, 10, 17, 20,
+  19, 22, 19, 0, 39, 0, 23, 18, 0, 9,
+  5, 21, 68, 17, 39, 0, 0, 0, 34, 0,
+  67, 16, 7, 35, 9, 16, 42, 18, 111, 0,
+  19, 7, 30, 4, 45, 33, 26, 6, 0, 0,
+  14, 0, 1, 30, 86, 0, 9, 0, 3, 0,
+  26, 19, 51, 73, 59, 31, 0, 25, 25, 27,
+  1, 0, 0, 49, 62, 54, 0, 17, 9, 31,
+  5, 0, 0, 97, 24, 47, 40, 0, 67, 36,
+  173, 0, 0, 93, 100, 0, 16, 5, 0, 0,
+  0, 8, 0, 0, 58, 12, 35, 124, 53, 23,
+  0, 49, 0, 76, 26, 0, 69, 0, 16, 0,
+  0, 0, 74, 49, 11, 40, 2, 17, 33, 10,
+  4, 69, 21, 19, 13, 0, 5, 0, 39, 35,
+  1, 0, 24, 0, 46, 72, 0, 11, 18, 1,
+  41, 28, 0, 0, 0, 0, 0, 0, 56, 0,
+  0, 45, 33, 55, 30, 39, 114, 0, 28, 15,
+  40, 0, 15, 24, 15, 0, 0, 0, 36, 0,
+  25, 27, 59, 0, 0, 0, 16, 0, 11, 50,
+  12, 21, 64, 6, 0, 0, 17, 8, 0, 10,
+  24, 0, 0, 65, 0, 74, 92, 76, 35, 40,
+  22, 3, 39, 33, 0, 0, 31, 58, 156, 6,
+  15, 0, 58, 0, 0, 0, 0, 18, 0, 18,
+  5, 27, 0, 0, 53, 31, 0, 18, 0, 0,
+  0, 47, 40, 0, 10, 0, 0, 9, 0, 6,
+  28, 0, 0, 0, 0, 7, 44, 0, 48, 45,
+  0, 16, 17, 16, 28, 6, 22, 3, 0, 16,
+  38, 0, 14, 0, 0, 13, 0, 23, 45, 25,
+  8, 25, 0, 0, 67, 0, 51, 0, 0, 39,
+  3, 0, 27, 11, 67, 0, 18, 0, 0, 0,
+  20, 21, 9, 43, 3, 0, 12, 0, 0, 0,
+  64, 0, 5, 0, 0, 0, 55, 0, 56, 59,
+  50, 27, 4, 0, 2, 0, 0, 0, 8, 0,
+  48, 60, 4, 28, 76, 49, 0, 0, 0, 6,
+  1, 61, 24, 0, 35, 40, 0, 0, 13, 0,
+  67, 0, 0, 0, 0, 0, 0, 1, 0, 66,
+  2, 0, 30, 28, 26, 42, 0, 12, 0, 69,
+  96, 0, 23, 0, 0, 0, 0, 0, 51, 0,
+  0, 65, 0, 8, 82, 0, 40, 45, 0, 20,
+  0, 33, 32, 0, 14, 3, 0, 16, 42, 0,
+  37, 0, 0, 30, 0, 27, 36, 9, 13, 0,
+  0, 22, 2, 0, 70, 5, 0, 64, 0, 23,
+  40, 0, 76, 0, 6, 0, 58, 8, 17, 40,
+  5, 0, 26, 0, 1, 0, 0, 0, 39, 0,
+  71, 0, 10, 9, 14, 0, 2, 55, 59, 38,
+  4, 35, 16, 13, 17, 0, 0, 16, 84, 0,
+  0, 22, 51, 18, 0, 0, 0, 56, 0, 33,
+  67, 0, 5, 30, 0, 0, 0, 43, 70, 0,
+  18, 0, 0, 0, 0, 41, 0, 35, 57, 2,
+  29, 80, 44, 19, 0, 21, 0, 34, 36, 10,
+  35, 0, 10, 0, 0, 0, 30, 26, 0, 32,
+  0, 0, 35, 1, 27, 0, 0, 17, 9, 19,
+  26, 0, 10, 16, 0, 22, 23, 0, 61, 69,
+  0, 5, 0, 0, 0, 42, 5, 0, 0, 31,
+  0, 24, 35, 0, 0, 65, 2, 0, 10, 12,
+  63, 0, 37, 0, 27, 0, 0, 14, 0, 0,
+  0, 0, 0, 0, 0, 0, 4, 0, 41, 0,
+  35, 0, 8, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 27, 77,
+  56, 1, 0, 0, 53, 33, 0, 26, 0, 19,
+  15, 40, 3, 80, 27, 70, 9, 40, 13, 19,
+  51, 56, 1, 0, 62, 39, 168, 33, 0, 2,
+  112, 0, 35, 0, 0, 8, 0, 15, 15, 0,
+  16, 4, 70, 57, 0, 21, 0, 58, 0, 81,
+  74, 0, 31, 0, 4, 0, 0, 0, 31, 0,
+  5, 36, 0, 9, 25, 0, 0, 65, 0, 19,
+  22, 10, 17, 20, 19, 22, 19, 0, 39, 0,
+  23, 18, 0, 9, 5, 21, 68, 17, 39, 0,
+  0, 0, 34, 0, 67, 16, 7, 35, 9, 16,
+  42, 18, 111, 0, 19, 7, 30, 4, 45, 33,
+  26, 6, 0, 0, 14, 0, 1, 30, 86, 0,
+  9, 0, 3, 0, 26, 19, 51, 73, 59, 31,
+  0, 25, 25, 27, 1, 0, 0, 49, 62, 54,
+  0, 17, 9, 31, 5, 0, 0, 97, 24, 47,
+  40, 0, 67, 36, 173, 0, 0, 93, 100, 0,
+  16, 5, 0, 0, 0, 8, 0, 0, 58, 12,
+  35, 124, 53, 23, 0, 49, 0, 76, 26, 0,
+  69, 0, 16, 0, 0, 0, 74, 49, 11, 40,
+  2, 17, 33, 10, 4, 69, 21, 19, 13, 0,
+  5, 0, 39, 35, 1, 0, 24, 0, 46, 72,
+  0, 11, 18, 1, 41, 28, 0, 0, 0, 0,
+  0, 0, 56, 0, 0, 45, 33, 55, 30, 39,
+  114, 0, 28, 15, 40, 0, 15, 24, 15, 0,
+  0, 0, 36, 0, 25, 27, 59, 0, 0, 0,
+  16, 0, 11, 50, 1, 0, 0, 19, 11, 92,
+  28, 0, 0, 0, 0, 57, 41, 55, 0, 0,
+  0, 21, 17, 3, 0, 71, 14, 58, 40, 0,
+  38, 15, 173, 20, 0, 66, 63, 35, 0, 0,
+  0, 0, 0, 44, 0, 0, 10, 45, 6, 158,
+  67, 62, 0, 26, 0, 54, 50, 0, 21, 0,
+  34, 0, 34, 0, 70, 66, 0, 18, 13, 4,
+  36, 35, 62, 39, 52, 9, 43, 0, 28, 0,
+  37, 0, 0, 0, 49, 0, 22, 62, 0, 0,
+  39, 14, 21, 0, 0, 25, 16, 0, 24, 37,
+  0, 0, 11, 49, 15, 31, 12, 45, 82, 9,
+  31, 0, 0, 16, 0, 14, 0, 7, 0, 44,
+  106, 21, 47, 22, 46, 0, 0, 0, 16, 0,
+  13, 16, 56, 59, 50, 27, 4, 0, 2, 0,
+  0, 0, 8, 0, 48, 60, 4, 28, 76, 49,
+  0, 0, 0, 6, 1, 61, 24, 0, 35, 40,
+  0, 0, 13, 0, 67, 0, 0, 0, 0, 0,
+  0, 1, 0, 66, 2, 0, 30, 28, 26, 42,
+  0, 12, 0, 69, 96, 0, 23, 0, 0, 0,
+  0, 0, 51, 0, 0, 65, 0, 8, 82, 0,
+  40, 45, 0, 20, 0, 33, 32, 0, 14, 3,
+  0, 16, 42, 0, 37, 0, 0, 30, 0, 27,
+  36, 9, 13, 0, 0, 22, 2, 0, 70, 5,
+  0, 64, 0, 23, 40, 0, 76, 0, 6, 0,
+  58, 8, 17, 40, 5, 0, 26, 0, 1, 0,
+  0, 0, 39, 0, 71, 0, 10, 9, 14, 0,
+  2, 55, 59, 38, 4, 35, 16, 13, 17, 0,
+  0, 16, 84, 0, 0, 22, 51, 18, 0, 0,
+  0, 56, 0, 33, 67, 0, 5, 30, 0, 0,
+  0, 43, 70, 0, 18, 0, 0, 0, 0, 41,
+  0, 35, 57, 2, 29, 80, 44, 19, 0, 21,
+  0, 34, 36, 10, 35, 0, 10, 0, 0, 0,
+  30, 26, 0, 32, 0, 0, 35, 1, 27, 0,
+  0, 17, 9, 19, 26, 0, 10, 16, 0, 22,
+  23, 0, 61, 69, 0, 5, 0, 0, 0, 42,
+  5, 0, 0, 31, 0, 24, 35, 0, 0, 65,
+  2, 0, 10, 12, 63, 0, 37, 0, 27, 0,
+  0, 14, 0, 0, 0, 0, 0, 0, 0, 0,
+  4, 0, 41, 0, 35, 0, 8, 0, 0, 0,
+  0, 18, 14, 124, 8, 0, 7, 0, 0, 29,
+  52, 11, 0, 6, 15, 0, 0, 0, 0, 77,
+  2, 24, 40, 0, 0, 9, 0, 14, 0, 31,
+  15, 32, 0, 0, 0, 21, 0, 76, 0, 37,
+  0, 65, 12, 85, 61, 31, 0, 0, 0, 31,
+  31, 4, 2, 0, 40, 0, 18, 0, 23, 69,
+  0, 16, 12, 9, 0, 29, 58, 0, 39, 20,
+  11, 0, 25, 21, 19, 0, 0, 29, 42, 0,
+  16, 44, 15, 0, 11, 0, 0, 8, 0, 6,
+  0, 0, 4, 72, 0, 0, 0, 72, 0, 0,
+  4, 12, 57, 0, 27, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 77, 0, 47, 0, 6, 3,
+  0, 0, 55, 0, 22, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  51, 73, 59, 31, 0, 25, 25, 27, 1, 0,
+  0, 49, 62, 54, 0, 17, 9, 31, 5, 0,
+  0, 97, 24, 47, 40, 0, 67, 36, 173, 0,
+  0, 93, 100, 0, 16, 5, 0, 0, 0, 8,
+  0, 0, 58, 12, 35, 124, 53, 23, 0, 49,
+  0, 76, 26, 0, 69, 0, 16, 0, 0, 0,
+  74, 49, 11, 40, 2, 17, 33, 10, 4, 69,
+  21, 19, 13, 0, 5, 0, 39, 35, 1, 0,
+  24, 0, 46, 72, 0, 11, 18, 1, 41, 28,
+  0, 0, 0, 0, 0, 0, 56, 0, 0, 45,
+  33, 55, 30, 39, 114, 0, 28, 15, 40, 0,
+  15, 24, 15, 0, 0, 0, 36, 0, 25, 27,
+  59, 0, 0, 0, 16, 0, 11, 50, 1, 0,
+  0, 19, 11, 92, 28, 0, 0, 0, 0, 57,
+  41, 55, 0, 0, 0, 21, 17, 3, 0, 71,
+  14, 58, 40, 0, 38, 15, 173, 20, 0, 66,
+  63, 35, 0, 0, 0, 0, 0, 44, 0, 0,
+  10, 45, 6, 158, 67, 62, 0, 26, 0, 54,
+  50, 0, 21, 0, 34, 0, 34, 0, 70, 66,
+  0, 18, 13, 4, 36, 35, 62, 39, 52, 9,
+  43, 0, 28, 0, 37, 0, 0, 0, 49, 0,
+  22, 62, 0, 0, 39, 14, 21, 0, 0, 25,
+  16, 0, 24, 37, 0, 0, 11, 49, 15, 31,
+  12, 45, 82, 9, 31, 0, 0, 16, 0, 14,
+  0, 7, 0, 44, 106, 21, 47, 22, 46, 0,
+  0, 0, 16, 0, 13, 16, 0, 38, 0, 0,
+  45, 3, 47, 0, 0, 5, 2, 35, 43, 41,
+  0, 12, 6, 26, 23, 27, 41, 0, 0, 68,
+  18, 30, 36, 25, 149, 46, 0, 0, 61, 42,
+  0, 0, 0, 0, 0, 81, 0, 0, 0, 48,
+  15, 76, 31, 35, 0, 47, 0, 53, 104, 0,
+  0, 15, 21, 0, 0, 5, 36, 26, 0, 63,
+  0, 10, 50, 5, 36, 4, 6, 13, 12, 0,
+  42, 49, 0, 0, 30, 0, 84, 0, 8, 23,
+  8, 1, 28, 38, 67, 0, 15, 10, 39, 0,
+  22, 34, 0, 0, 46, 45, 0, 15, 23, 0,
+  43, 0, 19, 15, 9, 58, 9, 7, 0, 4,
+  0, 0, 41, 21, 33, 22, 54, 6, 20, 0,
+  41, 0, 6, 0, 2, 55, 59, 38, 4, 35,
+  16, 13, 17, 0, 0, 16, 84, 0, 0, 22,
+  51, 18, 0, 0, 0, 56, 0, 33, 67, 0,
+  5, 30, 0, 0, 0, 43, 70, 0, 18, 0,
+  0, 0, 0, 41, 0, 35, 57, 2, 29, 80,
+  44, 19, 0, 21, 0, 34, 36, 10, 35, 0,
+  10, 0, 0, 0, 30, 26, 0, 32, 0, 0,
+  35, 1, 27, 0, 0, 17, 9, 19, 26, 0,
+  10, 16, 0, 22, 23, 0, 61, 69, 0, 5,
+  0, 0, 0, 42, 5, 0, 0, 31, 0, 24,
+  35, 0, 0, 65, 2, 0, 10, 12, 63, 0,
+  37, 0, 27, 0, 0, 14, 0, 0, 0, 0,
+  0, 0, 0, 0, 4, 0, 41, 0, 35, 0,
+  8, 0, 0, 0, 0, 18, 14, 124, 8, 0,
+  7, 0, 0, 29, 52, 11, 0, 6, 15, 0,
+  0, 0, 0, 77, 2, 24, 40, 0, 0, 9,
+  0, 14, 0, 31, 15, 32, 0, 0, 0, 21,
+  0, 76, 0, 37, 0, 65, 12, 85, 61, 31,
+  0, 0, 0, 31, 31, 4, 2, 0, 40, 0,
+  18, 0, 23, 69, 0, 16, 12, 9, 0, 29,
+  58, 0, 39, 20, 11, 0, 25, 21, 19, 0,
+  0, 29, 42, 0, 16, 44, 15, 0, 11, 0,
+  0, 8, 0, 6, 0, 0, 4, 72, 0, 0,
+  0, 72, 0, 0, 4, 12, 57, 0, 27, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 77, 0,
+  47, 0, 6, 3, 0, 0, 55, 0, 22, 0,
+  0, 12, 0, 0, 34, 31, 37, 0, 16, 0,
+  1, 11, 52, 11, 10, 28, 23, 12, 0, 12,
+  51, 0, 0, 50, 24, 48, 0, 15, 0, 35,
+  0, 0, 38, 48, 0, 0, 0, 6, 0, 75,
+  0, 43, 0, 59, 29, 41, 15, 15, 0, 19,
+  0, 15, 107, 18, 0, 0, 17, 0, 0, 28,
+  25, 21, 0, 41, 0, 0, 45, 6, 26, 0,
+  0, 8, 0, 14, 33, 51, 4, 0, 0, 28,
+  84, 14, 0, 6, 19, 0, 12, 21, 18, 26,
+  0, 9, 9, 21, 0, 72, 0, 4, 31, 72,
+  0, 0, 2, 0, 39, 0, 26, 7, 9, 48,
+  0, 0, 0, 3, 0, 0, 39, 24, 41, 0,
+  37, 0, 84, 0, 64, 0, 13, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 1, 0, 0, 19, 11, 92, 28, 0,
+  0, 0, 0, 57, 41, 55, 0, 0, 0, 21,
+  17, 3, 0, 71, 14, 58, 40, 0, 38, 15,
+  173, 20, 0, 66, 63, 35, 0, 0, 0, 0,
+  0, 44, 0, 0, 10, 45, 6, 158, 67, 62,
+  0, 26, 0, 54, 50, 0, 21, 0, 34, 0,
+  34, 0, 70, 66, 0, 18, 13, 4, 36, 35,
+  62, 39, 52, 9, 43, 0, 28, 0, 37, 0,
+  0, 0, 49, 0, 22, 62, 0, 0, 39, 14,
+  21, 0, 0, 25, 16, 0, 24, 37, 0, 0,
+  11, 49, 15, 31, 12, 45, 82, 9, 31, 0,
+  0, 16, 0, 14, 0, 7, 0, 44, 106, 21,
+  47, 22, 46, 0, 0, 0, 16, 0, 13, 16,
+  0, 38, 0, 0, 45, 3, 47, 0, 0, 5,
+  2, 35, 43, 41, 0, 12, 6, 26, 23, 27,
+  41, 0, 0, 68, 18, 30, 36, 25, 149, 46,
+  0, 0, 61, 42, 0, 0, 0, 0, 0, 81,
+  0, 0, 0, 48, 15, 76, 31, 35, 0, 47,
+  0, 53, 104, 0, 0, 15, 21, 0, 0, 5,
+  36, 26, 0, 63, 0, 10, 50, 5, 36, 4,
+  6, 13, 12, 0, 42, 49, 0, 0, 30, 0,
+  84, 0, 8, 23, 8, 1, 28, 38, 67, 0,
+  15, 10, 39, 0, 22, 34, 0, 0, 46, 45,
+  0, 15, 23, 0, 43, 0, 19, 15, 9, 58,
+  9, 7, 0, 4, 0, 0, 41, 21, 33, 22,
+  54, 6, 20, 0, 41, 0, 6, 0, 0, 46,
+  0, 5, 8, 0, 87, 3, 13, 14, 0, 39,
+  38, 29, 17, 42, 21, 66, 26, 57, 83, 0,
+  35, 35, 10, 13, 59, 37, 156, 43, 0, 0,
+  97, 0, 28, 0, 0, 0, 0, 60, 0, 0,
+  0, 58, 6, 89, 17, 14, 0, 43, 0, 39,
+  81, 11, 0, 0, 23, 0, 0, 26, 0, 12,
+  14, 12, 0, 0, 12, 25, 19, 1, 23, 0,
+  31, 0, 56, 15, 12, 6, 36, 0, 63, 0,
+  17, 12, 2, 0, 24, 1, 58, 22, 24, 0,
+  0, 0, 11, 31, 0, 0, 72, 22, 0, 0,
+  23, 0, 40, 0, 15, 32, 13, 36, 18, 8,
+  0, 1, 0, 0, 17, 8, 16, 23, 55, 3,
+  28, 0, 23, 0, 16, 0, 0, 0, 0, 18,
+  14, 124, 8, 0, 7, 0, 0, 29, 52, 11,
+  0, 6, 15, 0, 0, 0, 0, 77, 2, 24,
+  40, 0, 0, 9, 0, 14, 0, 31, 15, 32,
+  0, 0, 0, 21, 0, 76, 0, 37, 0, 65,
+  12, 85, 61, 31, 0, 0, 0, 31, 31, 4,
+  2, 0, 40, 0, 18, 0, 23, 69, 0, 16,
+  12, 9, 0, 29, 58, 0, 39, 20, 11, 0,
+  25, 21, 19, 0, 0, 29, 42, 0, 16, 44,
+  15, 0, 11, 0, 0, 8, 0, 6, 0, 0,
+  4, 72, 0, 0, 0, 72, 0, 0, 4, 12,
+  57, 0, 27, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 77, 0, 47, 0, 6, 3, 0, 0,
+  55, 0, 22, 0, 0, 12, 0, 0, 34, 31,
+  37, 0, 16, 0, 1, 11, 52, 11, 10, 28,
+  23, 12, 0, 12, 51, 0, 0, 50, 24, 48,
+  0, 15, 0, 35, 0, 0, 38, 48, 0, 0,
+  0, 6, 0, 75, 0, 43, 0, 59, 29, 41,
+  15, 15, 0, 19, 0, 15, 107, 18, 0, 0,
+  17, 0, 0, 28, 25, 21, 0, 41, 0, 0,
+  45, 6, 26, 0, 0, 8, 0, 14, 33, 51,
+  4, 0, 0, 28, 84, 14, 0, 6, 19, 0,
+  12, 21, 18, 26, 0, 9, 9, 21, 0, 72,
+  0, 4, 31, 72, 0, 0, 2, 0, 39, 0,
+  26, 7, 9, 48, 0, 0, 0, 3, 0, 0,
+  39, 24, 41, 0, 37, 0, 84, 0, 64, 0,
+  13, 0, 0, 32, 0, 0, 20, 0, 56, 0,
+  35, 0, 0, 29, 28, 20, 52, 24, 39, 50,
+  3, 36, 95, 0, 10, 21, 21, 25, 9, 34,
+  0, 29, 0, 0, 63, 0, 10, 0, 0, 0,
+  0, 48, 0, 3, 0, 63, 16, 61, 5, 1,
+  0, 6, 0, 3, 79, 33, 0, 0, 18, 0,
+  0, 7, 0, 7, 0, 0, 0, 0, 32, 20,
+  20, 0, 0, 0, 0, 0, 62, 0, 13, 2,
+  0, 6, 67, 26, 0, 0, 6, 0, 7, 0,
+  11, 49, 18, 0, 0, 4, 0, 55, 0, 6,
+  64, 36, 0, 0, 3, 0, 34, 0, 22, 9,
+  31, 35, 0, 0, 0, 0, 0, 0, 14, 2,
+  12, 0, 45, 0, 77, 0, 41, 0, 26, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 38, 0, 0, 45, 3,
+  47, 0, 0, 5, 2, 35, 43, 41, 0, 12,
+  6, 26, 23, 27, 41, 0, 0, 68, 18, 30,
+  36, 25, 149, 46, 0, 0, 61, 42, 0, 0,
+  0, 0, 0, 81, 0, 0, 0, 48, 15, 76,
+  31, 35, 0, 47, 0, 53, 104, 0, 0, 15,
+  21, 0, 0, 5, 36, 26, 0, 63, 0, 10,
+  50, 5, 36, 4, 6, 13, 12, 0, 42, 49,
+  0, 0, 30, 0, 84, 0, 8, 23, 8, 1,
+  28, 38, 67, 0, 15, 10, 39, 0, 22, 34,
+  0, 0, 46, 45, 0, 15, 23, 0, 43, 0,
+  19, 15, 9, 58, 9, 7, 0, 4, 0, 0,
+  41, 21, 33, 22, 54, 6, 20, 0, 41, 0,
+  6, 0, 0, 46, 0, 5, 8, 0, 87, 3,
+  13, 14, 0, 39, 38, 29, 17, 42, 21, 66,
+  26, 57, 83, 0, 35, 35, 10, 13, 59, 37,
+  156, 43, 0, 0, 97, 0, 28, 0, 0, 0,
+  0, 60, 0, 0, 0, 58, 6, 89, 17, 14,
+  0, 43, 0, 39, 81, 11, 0, 0, 23, 0,
+  0, 26, 0, 12, 14, 12, 0, 0, 12, 25,
+  19, 1, 23, 0, 31, 0, 56, 15, 12, 6,
+  36, 0, 63, 0, 17, 12, 2, 0, 24, 1,
+  58, 22, 24, 0, 0, 0, 11, 31, 0, 0,
+  72, 22, 0, 0, 23, 0, 40, 0, 15, 32,
+  13, 36, 18, 8, 0, 1, 0, 0, 17, 8,
+  16, 23, 55, 3, 28, 0, 23, 0, 16, 0,
+  0, 26, 0, 19, 10, 0, 77, 11, 23, 31,
+  0, 35, 23, 57, 9, 52, 22, 74, 37, 27,
+  102, 0, 0, 31, 15, 13, 55, 46, 154, 59,
+  0, 4, 97, 0, 27, 0, 0, 0, 0, 55,
+  0, 0, 0, 52, 12, 66, 15, 9, 0, 41,
+  0, 76, 57, 46, 4, 14, 7, 0, 0, 16,
+  0, 0, 24, 8, 0, 8, 10, 17, 12, 30,
+  0, 0, 27, 0, 37, 13, 12, 0, 23, 0,
+  76, 0, 17, 2, 0, 0, 21, 18, 71, 15,
+  30, 0, 0, 0, 29, 12, 20, 0, 83, 41,
+  0, 0, 20, 0, 63, 0, 2, 35, 27, 25,
+  17, 5, 25, 0, 6, 0, 30, 0, 13, 13,
+  58, 0, 47, 0, 29, 0, 20, 0, 0, 12,
+  0, 0, 34, 31, 37, 0, 16, 0, 1, 11,
+  52, 11, 10, 28, 23, 12, 0, 12, 51, 0,
+  0, 50, 24, 48, 0, 15, 0, 35, 0, 0,
+  38, 48, 0, 0, 0, 6, 0, 75, 0, 43,
+  0, 59, 29, 41, 15, 15, 0, 19, 0, 15,
+  107, 18, 0, 0, 17, 0, 0, 28, 25, 21,
+  0, 41, 0, 0, 45, 6, 26, 0, 0, 8,
+  0, 14, 33, 51, 4, 0, 0, 28, 84, 14,
+  0, 6, 19, 0, 12, 21, 18, 26, 0, 9,
+  9, 21, 0, 72, 0, 4, 31, 72, 0, 0,
+  2, 0, 39, 0, 26, 7, 9, 48, 0, 0,
+  0, 3, 0, 0, 39, 24, 41, 0, 37, 0,
+  84, 0, 64, 0, 13, 0, 0, 32, 0, 0,
+  20, 0, 56, 0, 35, 0, 0, 29, 28, 20,
+  52, 24, 39, 50, 3, 36, 95, 0, 10, 21,
+  21, 25, 9, 34, 0, 29, 0, 0, 63, 0,
+  10, 0, 0, 0, 0, 48, 0, 3, 0, 63,
+  16, 61, 5, 1, 0, 6, 0, 3, 79, 33,
+  0, 0, 18, 0, 0, 7, 0, 7, 0, 0,
+  0, 0, 32, 20, 20, 0, 0, 0, 0, 0,
+  62, 0, 13, 2, 0, 6, 67, 26, 0, 0,
+  6, 0, 7, 0, 11, 49, 18, 0, 0, 4,
+  0, 55, 0, 6, 64, 36, 0, 0, 3, 0,
+  34, 0, 22, 9, 31, 35, 0, 0, 0, 0,
+  0, 0, 14, 2, 12, 0, 45, 0, 77, 0,
+  41, 0, 26, 0, 0, 27, 0, 15, 17, 0,
+  54, 0, 26, 19, 0, 24, 19, 41, 54, 36,
+  42, 53, 0, 29, 105, 0, 0, 24, 36, 35,
+  13, 47, 0, 36, 0, 0, 67, 9, 22, 0,
+  0, 0, 0, 30, 0, 0, 0, 58, 16, 44,
+  12, 18, 0, 3, 21, 11, 61, 51, 0, 0,
+  3, 0, 0, 16, 0, 0, 0, 0, 0, 0,
+  38, 18, 25, 0, 0, 0, 0, 0, 56, 0,
+  14, 7, 0, 10, 79, 42, 2, 0, 11, 0,
+  6, 6, 16, 33, 14, 0, 0, 12, 0, 42,
+  0, 6, 83, 38, 0, 0, 5, 0, 37, 0,
+  29, 9, 43, 27, 0, 0, 1, 0, 0, 0,
+  12, 0, 2, 0, 32, 0, 100, 0, 40, 0,
+  22, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 46, 0, 5,
+  8, 0, 87, 3, 13, 14, 0, 39, 38, 29,
+  17, 42, 21, 66, 26, 57, 83, 0, 35, 35,
+  10, 13, 59, 37, 156, 43, 0, 0, 97, 0,
+  28, 0, 0, 0, 0, 60, 0, 0, 0, 58,
+  6, 89, 17, 14, 0, 43, 0, 39, 81, 11,
+  0, 0, 23, 0, 0, 26, 0, 12, 14, 12,
+  0, 0, 12, 25, 19, 1, 23, 0, 31, 0,
+  56, 15, 12, 6, 36, 0, 63, 0, 17, 12,
+  2, 0, 24, 1, 58, 22, 24, 0, 0, 0,
+  11, 31, 0, 0, 72, 22, 0, 0, 23, 0,
+  40, 0, 15, 32, 13, 36, 18, 8, 0, 1,
+  0, 0, 17, 8, 16, 23, 55, 3, 28, 0,
+  23, 0, 16, 0, 0, 26, 0, 19, 10, 0,
+  77, 11, 23, 31, 0, 35, 23, 57, 9, 52,
+  22, 74, 37, 27, 102, 0, 0, 31, 15, 13,
+  55, 46, 154, 59, 0, 4, 97, 0, 27, 0,
+  0, 0, 0, 55, 0, 0, 0, 52, 12, 66,
+  15, 9, 0, 41, 0, 76, 57, 46, 4, 14,
+  7, 0, 0, 16, 0, 0, 24, 8, 0, 8,
+  10, 17, 12, 30, 0, 0, 27, 0, 37, 13,
+  12, 0, 23, 0, 76, 0, 17, 2, 0, 0,
+  21, 18, 71, 15, 30, 0, 0, 0, 29, 12,
+  20, 0, 83, 41, 0, 0, 20, 0, 63, 0,
+  2, 35, 27, 25, 17, 5, 25, 0, 6, 0,
+  30, 0, 13, 13, 58, 0, 47, 0, 29, 0,
+  20, 0, 0, 16, 0, 14, 1, 0, 63, 29,
+  23, 32, 0, 13, 0, 45, 0, 47, 19, 68,
+  39, 6, 67, 0, 0, 42, 12, 16, 57, 47,
+  121, 62, 0, 0, 87, 0, 30, 0, 0, 0,
+  0, 41, 0, 0, 0, 17, 8, 43, 25, 0,
+  0, 37, 11, 79, 44, 41, 28, 6, 2, 20,
+  0, 16, 0, 0, 13, 18, 0, 16, 25, 5,
+  1, 40, 0, 0, 44, 0, 27, 34, 0, 0,
+  27, 0, 77, 0, 17, 14, 0, 0, 18, 24,
+  76, 0, 60, 4, 0, 4, 30, 0, 46, 0,
+  60, 49, 0, 0, 9, 0, 57, 0, 0, 18,
+  38, 31, 23, 17, 38, 0, 21, 0, 27, 0,
+  7, 10, 58, 0, 64, 0, 40, 0, 0, 0,
+  0, 32, 0, 0, 20, 0, 56, 0, 35, 0,
+  0, 29, 28, 20, 52, 24, 39, 50, 3, 36,
+  95, 0, 10, 21, 21, 25, 9, 34, 0, 29,
+  0, 0, 63, 0, 10, 0, 0, 0, 0, 48,
+  0, 3, 0, 63, 16, 61, 5, 1, 0, 6,
+  0, 3, 79, 33, 0, 0, 18, 0, 0, 7,
+  0, 7, 0, 0, 0, 0, 32, 20, 20, 0,
+  0, 0, 0, 0, 62, 0, 13, 2, 0, 6,
+  67, 26, 0, 0, 6, 0, 7, 0, 11, 49,
+  18, 0, 0, 4, 0, 55, 0, 6, 64, 36,
+  0, 0, 3, 0, 34, 0, 22, 9, 31, 35,
+  0, 0, 0, 0, 0, 0, 14, 2, 12, 0,
+  45, 0, 77, 0, 41, 0, 26, 0, 0, 27,
+  0, 15, 17, 0, 54, 0, 26, 19, 0, 24,
+  19, 41, 54, 36, 42, 53, 0, 29, 105, 0,
+  0, 24, 36, 35, 13, 47, 0, 36, 0, 0,
+  67, 9, 22, 0, 0, 0, 0, 30, 0, 0,
+  0, 58, 16, 44, 12, 18, 0, 3, 21, 11,
+  61, 51, 0, 0, 3, 0, 0, 16, 0, 0,
+  0, 0, 0, 0, 38, 18, 25, 0, 0, 0,
+  0, 0, 56, 0, 14, 7, 0, 10, 79, 42,
+  2, 0, 11, 0, 6, 6, 16, 33, 14, 0,
+  0, 12, 0, 42, 0, 6, 83, 38, 0, 0,
+  5, 0, 37, 0, 29, 9, 43, 27, 0, 0,
+  1, 0, 0, 0, 12, 0, 2, 0, 32, 0,
+  100, 0, 40, 0, 22, 0, 0, 22, 0, 0,
+  8, 0, 32, 0, 33, 28, 0, 1, 0, 29,
+  40, 48, 56, 56, 12, 13, 56, 0, 0, 29,
+  28, 42, 16, 56, 0, 19, 0, 0, 57, 2,
+  6, 0, 0, 0, 0, 24, 0, 0, 0, 16,
+  1, 14, 21, 10, 0, 5, 37, 5, 41, 38,
+  0, 11, 0, 24, 0, 42, 0, 0, 0, 0,
+  0, 0, 70, 24, 23, 0, 0, 0, 11, 21,
+  44, 0, 8, 0, 0, 12, 70, 39, 7, 8,
+  19, 29, 0, 28, 16, 3, 38, 30, 0, 36,
+  4, 7, 0, 4, 60, 56, 0, 0, 5, 0,
+  33, 0, 12, 9, 35, 35, 0, 12, 2, 0,
+  10, 0, 0, 0, 0, 0, 6, 0, 111, 0,
+  30, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 26,
+  0, 19, 10, 0, 77, 11, 23, 31, 0, 35,
+  23, 57, 9, 52, 22, 74, 37, 27, 102, 0,
+  0, 31, 15, 13, 55, 46, 154, 59, 0, 4,
+  97, 0, 27, 0, 0, 0, 0, 55, 0, 0,
+  0, 52, 12, 66, 15, 9, 0, 41, 0, 76,
+  57, 46, 4, 14, 7, 0, 0, 16, 0, 0,
+  24, 8, 0, 8, 10, 17, 12, 30, 0, 0,
+  27, 0, 37, 13, 12, 0, 23, 0, 76, 0,
+  17, 2, 0, 0, 21, 18, 71, 15, 30, 0,
+  0, 0, 29, 12, 20, 0, 83, 41, 0, 0,
+  20, 0, 63, 0, 2, 35, 27, 25, 17, 5,
+  25, 0, 6, 0, 30, 0, 13, 13, 58, 0,
+  47, 0, 29, 0, 20, 0, 0, 16, 0, 14,
+  1, 0, 63, 29, 23, 32, 0, 13, 0, 45,
+  0, 47, 19, 68, 39, 6, 67, 0, 0, 42,
+  12, 16, 57, 47, 121, 62, 0, 0, 87, 0,
+  30, 0, 0, 0, 0, 41, 0, 0, 0, 17,
+  8, 43, 25, 0, 0, 37, 11, 79, 44, 41,
+  28, 6, 2, 20, 0, 16, 0, 0, 13, 18,
+  0, 16, 25, 5, 1, 40, 0, 0, 44, 0,
+  27, 34, 0, 0, 27, 0, 77, 0, 17, 14,
+  0, 0, 18, 24, 76, 0, 60, 4, 0, 4,
+  30, 0, 46, 0, 60, 49, 0, 0, 9, 0,
+  57, 0, 0, 18, 38, 31, 23, 17, 38, 0,
+  21, 0, 27, 0, 7, 10, 58, 0, 64, 0,
+  40, 0, 0, 0, 0, 26, 0, 7, 2, 0,
+  63, 38, 23, 37, 2, 6, 0, 40, 0, 45,
+  6, 67, 46, 14, 38, 0, 0, 48, 16, 24,
+  55, 58, 112, 45, 0, 0, 68, 0, 26, 0,
+  0, 0, 0, 44, 0, 0, 0, 2, 1, 25,
+  39, 0, 0, 36, 14, 72, 25, 35, 35, 0,
+  0, 49, 0, 21, 0, 0, 16, 34, 0, 26,
+  35, 0, 2, 44, 0, 0, 64, 0, 29, 35,
+  0, 1, 39, 0, 66, 5, 11, 30, 0, 6,
+  14, 27, 89, 0, 74, 5, 0, 3, 35, 0,
+  49, 0, 45, 48, 0, 0, 10, 0, 56, 0,
+  0, 23, 42, 24, 30, 23, 39, 0, 31, 0,
+  11, 0, 7, 13, 40, 0, 62, 0, 52, 0,
+  0, 2, 0, 27, 0, 15, 17, 0, 54, 0,
+  26, 19, 0, 24, 19, 41, 54, 36, 42, 53,
+  0, 29, 105, 0, 0, 24, 36, 35, 13, 47,
+  0, 36, 0, 0, 67, 9, 22, 0, 0, 0,
+  0, 30, 0, 0, 0, 58, 16, 44, 12, 18,
+  0, 3, 21, 11, 61, 51, 0, 0, 3, 0,
+  0, 16, 0, 0, 0, 0, 0, 0, 38, 18,
+  25, 0, 0, 0, 0, 0, 56, 0, 14, 7,
+  0, 10, 79, 42, 2, 0, 11, 0, 6, 6,
+  16, 33, 14, 0, 0, 12, 0, 42, 0, 6,
+  83, 38, 0, 0, 5, 0, 37, 0, 29, 9,
+  43, 27, 0, 0, 1, 0, 0, 0, 12, 0,
+  2, 0, 32, 0, 100, 0, 40, 0, 22, 0,
+  0, 22, 0, 0, 8, 0, 32, 0, 33, 28,
+  0, 1, 0, 29, 40, 48, 56, 56, 12, 13,
+  56, 0, 0, 29, 28, 42, 16, 56, 0, 19,
+  0, 0, 57, 2, 6, 0, 0, 0, 0, 24,
+  0, 0, 0, 16, 1, 14, 21, 10, 0, 5,
+  37, 5, 41, 38, 0, 11, 0, 24, 0, 42,
+  0, 0, 0, 0, 0, 0, 70, 24, 23, 0,
+  0, 0, 11, 21, 44, 0, 8, 0, 0, 12,
+  70, 39, 7, 8, 19, 29, 0, 28, 16, 3,
+  38, 30, 0, 36, 4, 7, 0, 4, 60, 56,
+  0, 0, 5, 0, 33, 0, 12, 9, 35, 35,
+  0, 12, 2, 0, 10, 0, 0, 0, 0, 0,
+  6, 0, 111, 0, 30, 0, 9, 0, 0, 40,
+  0, 0, 15, 0, 26, 0, 40, 45, 1, 0,
+  0, 24, 16, 54, 51, 59, 27, 8, 15, 0,
+  0, 41, 35, 63, 9, 78, 0, 0, 8, 0,
+  21, 0, 0, 0, 0, 0, 0, 35, 0, 0,
+  0, 0, 0, 0, 38, 0, 0, 5, 22, 8,
+  24, 27, 0, 0, 0, 65, 0, 36, 0, 0,
+  0, 33, 0, 2, 97, 14, 35, 0, 0, 0,
+  20, 36, 43, 5, 0, 0, 0, 9, 52, 53,
+  0, 20, 31, 37, 0, 46, 33, 0, 42, 41,
+  0, 48, 0, 0, 2, 16, 45, 62, 0, 0,
+  12, 0, 34, 0, 0, 17, 24, 34, 0, 27,
+  0, 0, 25, 0, 0, 14, 10, 0, 0, 8,
+  110, 0, 42, 0, 17, 9, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 16, 0, 14, 1, 0, 63, 29, 23, 32,
+  0, 13, 0, 45, 0, 47, 19, 68, 39, 6,
+  67, 0, 0, 42, 12, 16, 57, 47, 121, 62,
+  0, 0, 87, 0, 30, 0, 0, 0, 0, 41,
+  0, 0, 0, 17, 8, 43, 25, 0, 0, 37,
+  11, 79, 44, 41, 28, 6, 2, 20, 0, 16,
+  0, 0, 13, 18, 0, 16, 25, 5, 1, 40,
+  0, 0, 44, 0, 27, 34, 0, 0, 27, 0,
+  77, 0, 17, 14, 0, 0, 18, 24, 76, 0,
+  60, 4, 0, 4, 30, 0, 46, 0, 60, 49,
+  0, 0, 9, 0, 57, 0, 0, 18, 38, 31,
+  23, 17, 38, 0, 21, 0, 27, 0, 7, 10,
+  58, 0, 64, 0, 40, 0, 0, 0, 0, 26,
+  0, 7, 2, 0, 63, 38, 23, 37, 2, 6,
+  0, 40, 0, 45, 6, 67, 46, 14, 38, 0,
+  0, 48, 16, 24, 55, 58, 112, 45, 0, 0,
+  68, 0, 26, 0, 0, 0, 0, 44, 0, 0,
+  0, 2, 1, 25, 39, 0, 0, 36, 14, 72,
+  25, 35, 35, 0, 0, 49, 0, 21, 0, 0,
+  16, 34, 0, 26, 35, 0, 2, 44, 0, 0,
+  64, 0, 29, 35, 0, 1, 39, 0, 66, 5,
+  11, 30, 0, 6, 14, 27, 89, 0, 74, 5,
+  0, 3, 35, 0, 49, 0, 45, 48, 0, 0,
+  10, 0, 56, 0, 0, 23, 42, 24, 30, 23,
+  39, 0, 31, 0, 11, 0, 7, 13, 40, 0,
+  62, 0, 52, 0, 0, 2, 0, 45, 0, 0,
+  0, 0, 62, 43, 22, 57, 2, 15, 0, 41,
+  7, 47, 6, 61, 60, 24, 15, 0, 0, 43,
+  26, 39, 53, 69, 110, 31, 0, 0, 54, 0,
+  28, 0, 0, 0, 0, 53, 0, 0, 0, 0,
+  3, 7, 35, 0, 0, 41, 15, 67, 26, 42,
+  26, 0, 0, 57, 0, 32, 0, 0, 14, 45,
+  0, 35, 43, 0, 0, 32, 0, 1, 56, 0,
+  32, 31, 0, 8, 48, 0, 66, 25, 6, 25,
+  12, 12, 17, 31, 106, 0, 60, 5, 0, 7,
+  27, 0, 51, 1, 26, 50, 0, 0, 24, 0,
+  67, 0, 2, 18, 45, 33, 35, 9, 30, 0,
+  39, 0, 0, 6, 16, 9, 41, 0, 67, 0,
+  44, 0, 11, 14, 0, 22, 0, 0, 8, 0,
+  32, 0, 33, 28, 0, 1, 0, 29, 40, 48,
+  56, 56, 12, 13, 56, 0, 0, 29, 28, 42,
+  16, 56, 0, 19, 0, 0, 57, 2, 6, 0,
+  0, 0, 0, 24, 0, 0, 0, 16, 1, 14,
+  21, 10, 0, 5, 37, 5, 41, 38, 0, 11,
+  0, 24, 0, 42, 0, 0, 0, 0, 0, 0,
+  70, 24, 23, 0, 0, 0, 11, 21, 44, 0,
+  8, 0, 0, 12, 70, 39, 7, 8, 19, 29,
+  0, 28, 16, 3, 38, 30, 0, 36, 4, 7,
+  0, 4, 60, 56, 0, 0, 5, 0, 33, 0,
+  12, 9, 35, 35, 0, 12, 2, 0, 10, 0,
+  0, 0, 0, 0, 6, 0, 111, 0, 30, 0,
+  9, 0, 0, 40, 0, 0, 15, 0, 26, 0,
+  40, 45, 1, 0, 0, 24, 16, 54, 51, 59,
+  27, 8, 15, 0, 0, 41, 35, 63, 9, 78,
+  0, 0, 8, 0, 21, 0, 0, 0, 0, 0,
+  0, 35, 0, 0, 0, 0, 0, 0, 38, 0,
+  0, 5, 22, 8, 24, 27, 0, 0, 0, 65,
+  0, 36, 0, 0, 0, 33, 0, 2, 97, 14,
+  35, 0, 0, 0, 20, 36, 43, 5, 0, 0,
+  0, 9, 52, 53, 0, 20, 31, 37, 0, 46,
+  33, 0, 42, 41, 0, 48, 0, 0, 2, 16,
+  45, 62, 0, 0, 12, 0, 34, 0, 0, 17,
+  24, 34, 0, 27, 0, 0, 25, 0, 0, 14,
+  10, 0, 0, 8, 110, 0, 42, 0, 17, 9,
+  0, 44, 12, 0, 11, 0, 23, 0, 54, 79,
+  0, 0, 0, 0, 3, 53, 49, 60, 36, 23,
+  0, 0, 0, 42, 29, 49, 27, 93, 0, 0,
+  15, 0, 15, 0, 0, 0, 0, 32, 0, 20,
+  0, 0, 0, 0, 0, 7, 42, 0, 0, 5,
+  12, 12, 37, 19, 0, 0, 0, 60, 0, 25,
+  1, 12, 0, 29, 0, 0, 86, 0, 36, 9,
+  0, 0, 13, 38, 43, 13, 0, 16, 0, 0,
+  60, 35, 0, 10, 27, 23, 0, 45, 43, 0,
+  17, 49, 0, 42, 0, 0, 4, 7, 24, 57,
+  0, 0, 23, 0, 36, 0, 0, 1, 19, 59,
+  0, 22, 0, 0, 36, 0, 0, 24, 28, 0,
+  1, 18, 93, 0, 22, 0, 42, 20, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 26, 0, 7, 2, 0, 63, 38,
+  23, 37, 2, 6, 0, 40, 0, 45, 6, 67,
+  46, 14, 38, 0, 0, 48, 16, 24, 55, 58,
+  112, 45, 0, 0, 68, 0, 26, 0, 0, 0,
+  0, 44, 0, 0, 0, 2, 1, 25, 39, 0,
+  0, 36, 14, 72, 25, 35, 35, 0, 0, 49,
+  0, 21, 0, 0, 16, 34, 0, 26, 35, 0,
+  2, 44, 0, 0, 64, 0, 29, 35, 0, 1,
+  39, 0, 66, 5, 11, 30, 0, 6, 14, 27,
+  89, 0, 74, 5, 0, 3, 35, 0, 49, 0,
+  45, 48, 0, 0, 10, 0, 56, 0, 0, 23,
+  42, 24, 30, 23, 39, 0, 31, 0, 11, 0,
+  7, 13, 40, 0, 62, 0, 52, 0, 0, 2,
+  0, 45, 0, 0, 0, 0, 62, 43, 22, 57,
+  2, 15, 0, 41, 7, 47, 6, 61, 60, 24,
+  15, 0, 0, 43, 26, 39, 53, 69, 110, 31,
+  0, 0, 54, 0, 28, 0, 0, 0, 0, 53,
+  0, 0, 0, 0, 3, 7, 35, 0, 0, 41,
+  15, 67, 26, 42, 26, 0, 0, 57, 0, 32,
+  0, 0, 14, 45, 0, 35, 43, 0, 0, 32,
+  0, 1, 56, 0, 32, 31, 0, 8, 48, 0,
+  66, 25, 6, 25, 12, 12, 17, 31, 106, 0,
+  60, 5, 0, 7, 27, 0, 51, 1, 26, 50,
+  0, 0, 24, 0, 67, 0, 2, 18, 45, 33,
+  35, 9, 30, 0, 39, 0, 0, 6, 16, 9,
+  41, 0, 67, 0, 44, 0, 11, 14, 0, 50,
+  11, 0, 0, 0, 74, 36, 26, 54, 0, 25,
+  0, 0, 19, 41, 32, 80, 62, 25, 0, 0,
+  0, 42, 46, 46, 53, 65, 120, 31, 0, 0,
+  44, 0, 29, 0, 0, 0, 0, 45, 0, 0,
+  34, 0, 9, 14, 37, 0, 0, 29, 26, 40,
+  42, 29, 11, 0, 0, 42, 0, 48, 0, 0,
+  13, 56, 0, 27, 47, 0, 0, 21, 0, 6,
+  37, 0, 32, 21, 1, 6, 34, 0, 57, 25,
+  7, 31, 24, 9, 22, 28, 77, 0, 42, 0,
+  0, 21, 17, 0, 36, 22, 1, 31, 0, 0,
+  35, 0, 70, 0, 6, 12, 44, 44, 51, 12,
+  23, 0, 31, 0, 0, 14, 39, 0, 40, 13,
+  69, 0, 18, 0, 49, 15, 0, 40, 0, 0,
+  15, 0, 26, 0, 40, 45, 1, 0, 0, 24,
+  16, 54, 51, 59, 27, 8, 15, 0, 0, 41,
+  35, 63, 9, 78, 0, 0, 8, 0, 21, 0,
+  0, 0, 0, 0, 0, 35, 0, 0, 0, 0,
+  0, 0, 38, 0, 0, 5, 22, 8, 24, 27,
+  0, 0, 0, 65, 0, 36, 0, 0, 0, 33,
+  0, 2, 97, 14, 35, 0, 0, 0, 20, 36,
+  43, 5, 0, 0, 0, 9, 52, 53, 0, 20,
+  31, 37, 0, 46, 33, 0, 42, 41, 0, 48,
+  0, 0, 2, 16, 45, 62, 0, 0, 12, 0,
+  34, 0, 0, 17, 24, 34, 0, 27, 0, 0,
+  25, 0, 0, 14, 10, 0, 0, 8, 110, 0,
+  42, 0, 17, 9, 0, 44, 12, 0, 11, 0,
+  23, 0, 54, 79, 0, 0, 0, 0, 3, 53,
+  49, 60, 36, 23, 0, 0, 0, 42, 29, 49,
+  27, 93, 0, 0, 15, 0, 15, 0, 0, 0,
+  0, 32, 0, 20, 0, 0, 0, 0, 0, 7,
+  42, 0, 0, 5, 12, 12, 37, 19, 0, 0,
+  0, 60, 0, 25, 1, 12, 0, 29, 0, 0,
+  86, 0, 36, 9, 0, 0, 13, 38, 43, 13,
+  0, 16, 0, 0, 60, 35, 0, 10, 27, 23,
+  0, 45, 43, 0, 17, 49, 0, 42, 0, 0,
+  4, 7, 24, 57, 0, 0, 23, 0, 36, 0,
+  0, 1, 19, 59, 0, 22, 0, 0, 36, 0,
+  0, 24, 28, 0, 1, 18, 93, 0, 22, 0,
+  42, 20, 0, 38, 33, 0, 0, 0, 27, 0,
+  63, 89, 0, 12, 0, 0, 14, 41, 49, 72,
+  30, 11, 0, 0, 0, 57, 37, 23, 43, 98,
+  0, 0, 23, 0, 9, 0, 0, 0, 0, 70,
+  0, 0, 14, 15, 16, 0, 0, 17, 24, 0,
+  0, 0, 12, 0, 48, 0, 0, 0, 0, 33,
+  0, 3, 10, 18, 0, 50, 0, 0, 81, 0,
+  15, 42, 0, 0, 7, 44, 23, 12, 4, 28,
+  0, 0, 63, 33, 2, 27, 31, 25, 2, 25,
+  25, 0, 0, 46, 0, 33, 0, 0, 0, 14,
+  0, 51, 3, 0, 8, 0, 41, 0, 0, 18,
+  2, 64, 10, 19, 0, 0, 55, 0, 0, 23,
+  45, 0, 7, 3, 63, 0, 0, 0, 78, 18,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 45, 0, 0, 0, 0,
+  62, 43, 22, 57, 2, 15, 0, 41, 7, 47,
+  6, 61, 60, 24, 15, 0, 0, 43, 26, 39,
+  53, 69, 110, 31, 0, 0, 54, 0, 28, 0,
+  0, 0, 0, 53, 0, 0, 0, 0, 3, 7,
+  35, 0, 0, 41, 15, 67, 26, 42, 26, 0,
+  0, 57, 0, 32, 0, 0, 14, 45, 0, 35,
+  43, 0, 0, 32, 0, 1, 56, 0, 32, 31,
+  0, 8, 48, 0, 66, 25, 6, 25, 12, 12,
+  17, 31, 106, 0, 60, 5, 0, 7, 27, 0,
+  51, 1, 26, 50, 0, 0, 24, 0, 67, 0,
+  2, 18, 45, 33, 35, 9, 30, 0, 39, 0,
+  0, 6, 16, 9, 41, 0, 67, 0, 44, 0,
+  11, 14, 0, 50, 11, 0, 0, 0, 74, 36,
+  26, 54, 0, 25, 0, 0, 19, 41, 32, 80,
+  62, 25, 0, 0, 0, 42, 46, 46, 53, 65,
+  120, 31, 0, 0, 44, 0, 29, 0, 0, 0,
+  0, 45, 0, 0, 34, 0, 9, 14, 37, 0,
+  0, 29, 26, 40, 42, 29, 11, 0, 0, 42,
+  0, 48, 0, 0, 13, 56, 0, 27, 47, 0,
+  0, 21, 0, 6, 37, 0, 32, 21, 1, 6,
+  34, 0, 57, 25, 7, 31, 24, 9, 22, 28,
+  77, 0, 42, 0, 0, 21, 17, 0, 36, 22,
+  1, 31, 0, 0, 35, 0, 70, 0, 6, 12,
+  44, 44, 51, 12, 23, 0, 31, 0, 0, 14,
+  39, 0, 40, 13, 69, 0, 18, 0, 49, 15,
+  0, 53, 6, 0, 0, 0, 108, 18, 35, 62,
+  0, 10, 0, 0, 14, 70, 19, 66, 42, 16,
+  0, 0, 0, 59, 58, 43, 47, 64, 123, 32,
+  0, 0, 54, 0, 29, 0, 0, 0, 9, 45,
+  0, 0, 26, 16, 0, 23, 56, 0, 0, 30,
+  14, 43, 57, 13, 7, 3, 3, 60, 0, 52,
+  0, 9, 11, 62, 0, 31, 41, 10, 20, 3,
+  0, 13, 31, 0, 45, 36, 0, 0, 32, 0,
+  56, 38, 10, 21, 24, 0, 26, 22, 84, 1,
+  35, 0, 0, 34, 0, 0, 6, 15, 19, 40,
+  0, 0, 26, 0, 74, 0, 0, 29, 37, 36,
+  50, 12, 2, 0, 29, 0, 0, 35, 51, 0,
+  32, 0, 64, 0, 33, 0, 43, 1, 0, 44,
+  12, 0, 11, 0, 23, 0, 54, 79, 0, 0,
+  0, 0, 3, 53, 49, 60, 36, 23, 0, 0,
+  0, 42, 29, 49, 27, 93, 0, 0, 15, 0,
+  15, 0, 0, 0, 0, 32, 0, 20, 0, 0,
+  0, 0, 0, 7, 42, 0, 0, 5, 12, 12,
+  37, 19, 0, 0, 0, 60, 0, 25, 1, 12,
+  0, 29, 0, 0, 86, 0, 36, 9, 0, 0,
+  13, 38, 43, 13, 0, 16, 0, 0, 60, 35,
+  0, 10, 27, 23, 0, 45, 43, 0, 17, 49,
+  0, 42, 0, 0, 4, 7, 24, 57, 0, 0,
+  23, 0, 36, 0, 0, 1, 19, 59, 0, 22,
+  0, 0, 36, 0, 0, 24, 28, 0, 1, 18,
+  93, 0, 22, 0, 42, 20, 0, 38, 33, 0,
+  0, 0, 27, 0, 63, 89, 0, 12, 0, 0,
+  14, 41, 49, 72, 30, 11, 0, 0, 0, 57,
+  37, 23, 43, 98, 0, 0, 23, 0, 9, 0,
+  0, 0, 0, 70, 0, 0, 14, 15, 16, 0,
+  0, 17, 24, 0, 0, 0, 12, 0, 48, 0,
+  0, 0, 0, 33, 0, 3, 10, 18, 0, 50,
+  0, 0, 81, 0, 15, 42, 0, 0, 7, 44,
+  23, 12, 4, 28, 0, 0, 63, 33, 2, 27,
+  31, 25, 2, 25, 25, 0, 0, 46, 0, 33,
+  0, 0, 0, 14, 0, 51, 3, 0, 8, 0,
+  41, 0, 0, 18, 2, 64, 10, 19, 0, 0,
+  55, 0, 0, 23, 45, 0, 7, 3, 63, 0,
+  0, 0, 78, 18, 0, 39, 39, 0, 0, 0,
+  25, 0, 78, 78, 0, 0, 0, 3, 0, 17,
+  3, 41, 11, 0, 0, 0, 16, 61, 36, 0,
+  50, 80, 0, 0, 9, 0, 0, 0, 0, 0,
+  16, 73, 0, 0, 40, 8, 4, 0, 0, 14,
+  31, 0, 0, 0, 18, 0, 26, 0, 2, 0,
+  24, 52, 0, 0, 0, 48, 0, 57, 2, 2,
+  88, 0, 14, 69, 0, 0, 2, 41, 6, 46,
+  1, 15, 0, 0, 48, 46, 0, 40, 32, 26,
+  15, 28, 27, 0, 0, 65, 0, 8, 0, 0,
+  0, 0, 0, 52, 25, 0, 0, 0, 32, 0,
+  0, 39, 0, 43, 11, 0, 0, 0, 70, 0,
+  0, 25, 54, 0, 0, 0, 11, 0, 0, 0,
+  64, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 50, 11, 0,
+  0, 0, 74, 36, 26, 54, 0, 25, 0, 0,
+  19, 41, 32, 80, 62, 25, 0, 0, 0, 42,
+  46, 46, 53, 65, 120, 31, 0, 0, 44, 0,
+  29, 0, 0, 0, 0, 45, 0, 0, 34, 0,
+  9, 14, 37, 0, 0, 29, 26, 40, 42, 29,
+  11, 0, 0, 42, 0, 48, 0, 0, 13, 56,
+  0, 27, 47, 0, 0, 21, 0, 6, 37, 0,
+  32, 21, 1, 6, 34, 0, 57, 25, 7, 31,
+  24, 9, 22, 28, 77, 0, 42, 0, 0, 21,
+  17, 0, 36, 22, 1, 31, 0, 0, 35, 0,
+  70, 0, 6, 12, 44, 44, 51, 12, 23, 0,
+  31, 0, 0, 14, 39, 0, 40, 13, 69, 0,
+  18, 0, 49, 15, 0, 53, 6, 0, 0, 0,
+  108, 18, 35, 62, 0, 10, 0, 0, 14, 70,
+  19, 66, 42, 16, 0, 0, 0, 59, 58, 43,
+  47, 64, 123, 32, 0, 0, 54, 0, 29, 0,
+  0, 0, 9, 45, 0, 0, 26, 16, 0, 23,
+  56, 0, 0, 30, 14, 43, 57, 13, 7, 3,
+  3, 60, 0, 52, 0, 9, 11, 62, 0, 31,
+  41, 10, 20, 3, 0, 13, 31, 0, 45, 36,
+  0, 0, 32, 0, 56, 38, 10, 21, 24, 0,
+  26, 22, 84, 1, 35, 0, 0, 34, 0, 0,
+  6, 15, 19, 40, 0, 0, 26, 0, 74, 0,
+  0, 29, 37, 36, 50, 12, 2, 0, 29, 0,
+  0, 35, 51, 0, 32, 0, 64, 0, 33, 0,
+  43, 1, 0, 47, 0, 0, 0, 0, 99, 35,
+  39, 50, 0, 17, 0, 0, 7, 70, 34, 67,
+  46, 6, 16, 0, 0, 47, 51, 51, 43, 68,
+  129, 40, 9, 0, 53, 0, 19, 0, 0, 3,
+  0, 46, 0, 0, 4, 18, 0, 21, 43, 0,
+  0, 29, 3, 44, 51, 16, 0, 0, 8, 61,
+  0, 57, 0, 8, 10, 70, 0, 30, 41, 15,
+  26, 0, 0, 5, 28, 0, 43, 38, 0, 0,
+  35, 0, 53, 27, 7, 21, 30, 0, 31, 28,
+  62, 0, 36, 0, 0, 42, 1, 0, 11, 10,
+  39, 35, 0, 0, 24, 0, 67, 0, 0, 27,
+  42, 50, 46, 18, 14, 0, 25, 0, 0, 33,
+  56, 0, 33, 24, 74, 0, 21, 0, 46, 9,
+  0, 38, 33, 0, 0, 0, 27, 0, 63, 89,
+  0, 12, 0, 0, 14, 41, 49, 72, 30, 11,
+  0, 0, 0, 57, 37, 23, 43, 98, 0, 0,
+  23, 0, 9, 0, 0, 0, 0, 70, 0, 0,
+  14, 15, 16, 0, 0, 17, 24, 0, 0, 0,
+  12, 0, 48, 0, 0, 0, 0, 33, 0, 3,
+  10, 18, 0, 50, 0, 0, 81, 0, 15, 42,
+  0, 0, 7, 44, 23, 12, 4, 28, 0, 0,
+  63, 33, 2, 27, 31, 25, 2, 25, 25, 0,
+  0, 46, 0, 33, 0, 0, 0, 14, 0, 51,
+  3, 0, 8, 0, 41, 0, 0, 18, 2, 64,
+  10, 19, 0, 0, 55, 0, 0, 23, 45, 0,
+  7, 3, 63, 0, 0, 0, 78, 18, 0, 39,
+  39, 0, 0, 0, 25, 0, 78, 78, 0, 0,
+  0, 3, 0, 17, 3, 41, 11, 0, 0, 0,
+  16, 61, 36, 0, 50, 80, 0, 0, 9, 0,
+  0, 0, 0, 0, 16, 73, 0, 0, 40, 8,
+  4, 0, 0, 14, 31, 0, 0, 0, 18, 0,
+  26, 0, 2, 0, 24, 52, 0, 0, 0, 48,
+  0, 57, 2, 2, 88, 0, 14, 69, 0, 0,
+  2, 41, 6, 46, 1, 15, 0, 0, 48, 46,
+  0, 40, 32, 26, 15, 28, 27, 0, 0, 65,
+  0, 8, 0, 0, 0, 0, 0, 52, 25, 0,
+  0, 0, 32, 0, 0, 39, 0, 43, 11, 0,
+  0, 0, 70, 0, 0, 25, 54, 0, 0, 0,
+  11, 0, 0, 0, 64, 2, 0, 29, 0, 0,
+  0, 0, 15, 0, 80, 38, 0, 0, 0, 0,
+  0, 0, 0, 35, 26, 0, 14, 0, 0, 45,
+  31, 0, 42, 64, 0, 0, 16, 0, 0, 5,
+  0, 0, 32, 60, 1, 0, 52, 0, 0, 0,
+  0, 15, 40, 0, 0, 0, 0, 2, 11, 0,
+  19, 50, 26, 49, 0, 0, 6, 43, 3, 66,
+  19, 0, 76, 0, 18, 84, 0, 0, 2, 19,
+  0, 39, 0, 5, 14, 0, 39, 27, 3, 12,
+  27, 17, 21, 31, 23, 0, 0, 98, 2, 0,
+  0, 0, 0, 0, 39, 39, 30, 37, 0, 0,
+  15, 0, 0, 33, 0, 44, 1, 9, 0, 0,
+  55, 0, 0, 24, 71, 0, 0, 0, 0, 0,
+  0, 0, 42, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 53,
+  6, 0, 0, 0, 108, 18, 35, 62, 0, 10,
+  0, 0, 14, 70, 19, 66, 42, 16, 0, 0,
+  0, 59, 58, 43, 47, 64, 123, 32, 0, 0,
+  54, 0, 29, 0, 0, 0, 9, 45, 0, 0,
+  26, 16, 0, 23, 56, 0, 0, 30, 14, 43,
+  57, 13, 7, 3, 3, 60, 0, 52, 0, 9,
+  11, 62, 0, 31, 41, 10, 20, 3, 0, 13,
+  31, 0, 45, 36, 0, 0, 32, 0, 56, 38,
+  10, 21, 24, 0, 26, 22, 84, 1, 35, 0,
+  0, 34, 0, 0, 6, 15, 19, 40, 0, 0,
+  26, 0, 74, 0, 0, 29, 37, 36, 50, 12,
+  2, 0, 29, 0, 0, 35, 51, 0, 32, 0,
+  64, 0, 33, 0, 43, 1, 0, 47, 0, 0,
+  0, 0, 99, 35, 39, 50, 0, 17, 0, 0,
+  7, 70, 34, 67, 46, 6, 16, 0, 0, 47,
+  51, 51, 43, 68, 129, 40, 9, 0, 53, 0,
+  19, 0, 0, 3, 0, 46, 0, 0, 4, 18,
+  0, 21, 43, 0, 0, 29, 3, 44, 51, 16,
+  0, 0, 8, 61, 0, 57, 0, 8, 10, 70,
+  0, 30, 41, 15, 26, 0, 0, 5, 28, 0,
+  43, 38, 0, 0, 35, 0, 53, 27, 7, 21,
+  30, 0, 31, 28, 62, 0, 36, 0, 0, 42,
+  1, 0, 11, 10, 39, 35, 0, 0, 24, 0,
+  67, 0, 0, 27, 42, 50, 46, 18, 14, 0,
+  25, 0, 0, 33, 56, 0, 33, 24, 74, 0,
+  21, 0, 46, 9, 0, 40, 0, 0, 5, 0,
+  79, 51, 29, 30, 0, 28, 9, 0, 6, 57,
+  44, 75, 60, 18, 9, 0, 0, 32, 53, 70,
+  33, 61, 135, 47, 36, 0, 45, 8, 29, 0,
+  0, 4, 0, 55, 0, 0, 25, 9, 0, 4,
+  34, 0, 0, 18, 21, 51, 44, 48, 0, 10,
+  3, 61, 0, 58, 0, 0, 12, 61, 0, 22,
+  46, 13, 15, 0, 0, 2, 14, 0, 34, 33,
+  0, 3, 31, 0, 57, 9, 0, 22, 46, 0,
+  23, 34, 53, 5, 53, 2, 0, 39, 29, 0,
+  36, 10, 25, 36, 0, 0, 19, 0, 58, 0,
+  0, 20, 53, 51, 44, 24, 38, 2, 31, 0,
+  0, 13, 50, 0, 40, 53, 98, 0, 37, 0,
+  54, 1, 0, 39, 39, 0, 0, 0, 25, 0,
+  78, 78, 0, 0, 0, 3, 0, 17, 3, 41,
+  11, 0, 0, 0, 16, 61, 36, 0, 50, 80,
+  0, 0, 9, 0, 0, 0, 0, 0, 16, 73,
+  0, 0, 40, 8, 4, 0, 0, 14, 31, 0,
+  0, 0, 18, 0, 26, 0, 2, 0, 24, 52,
+  0, 0, 0, 48, 0, 57, 2, 2, 88, 0,
+  14, 69, 0, 0, 2, 41, 6, 46, 1, 15,
+  0, 0, 48, 46, 0, 40, 32, 26, 15, 28,
+  27, 0, 0, 65, 0, 8, 0, 0, 0, 0,
+  0, 52, 25, 0, 0, 0, 32, 0, 0, 39,
+  0, 43, 11, 0, 0, 0, 70, 0, 0, 25,
+  54, 0, 0, 0, 11, 0, 0, 0, 64, 2,
+  0, 29, 0, 0, 0, 0, 15, 0, 80, 38,
+  0, 0, 0, 0, 0, 0, 0, 35, 26, 0,
+  14, 0, 0, 45, 31, 0, 42, 64, 0, 0,
+  16, 0, 0, 5, 0, 0, 32, 60, 1, 0,
+  52, 0, 0, 0, 0, 15, 40, 0, 0, 0,
+  0, 2, 11, 0, 19, 50, 26, 49, 0, 0,
+  6, 43, 3, 66, 19, 0, 76, 0, 18, 84,
+  0, 0, 2, 19, 0, 39, 0, 5, 14, 0,
+  39, 27, 3, 12, 27, 17, 21, 31, 23, 0,
+  0, 98, 2, 0, 0, 0, 0, 0, 39, 39,
+  30, 37, 0, 0, 15, 0, 0, 33, 0, 44,
+  1, 9, 0, 0, 55, 0, 0, 24, 71, 0,
+  0, 0, 0, 0, 0, 0, 42, 0, 0, 21,
+  0, 0, 2, 0, 15, 0, 74, 29, 0, 18,
+  0, 12, 0, 34, 16, 63, 31, 0, 0, 0,
+  0, 43, 15, 0, 18, 55, 0, 0, 44, 0,
+  0, 15, 0, 0, 19, 53, 0, 0, 37, 0,
+  0, 0, 0, 6, 28, 0, 0, 0, 0, 19,
+  26, 0, 3, 71, 33, 50, 0, 0, 10, 18,
+  0, 54, 2, 0, 62, 0, 20, 53, 0, 0,
+  0, 10, 0, 34, 0, 0, 19, 0, 50, 13,
+  6, 0, 30, 11, 7, 22, 34, 0, 0, 109,
+  0, 6, 0, 0, 0, 0, 36, 46, 17, 32,
+  7, 0, 17, 0, 0, 18, 0, 40, 0, 25,
+  0, 9, 51, 0, 0, 9, 68, 0, 0, 9,
+  34, 0, 14, 0, 50, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 47, 0, 0, 0, 0, 99, 35, 39, 50,
+  0, 17, 0, 0, 7, 70, 34, 67, 46, 6,
+  16, 0, 0, 47, 51, 51, 43, 68, 129, 40,
+  9, 0, 53, 0, 19, 0, 0, 3, 0, 46,
+  0, 0, 4, 18, 0, 21, 43, 0, 0, 29,
+  3, 44, 51, 16, 0, 0, 8, 61, 0, 57,
+  0, 8, 10, 70, 0, 30, 41, 15, 26, 0,
+  0, 5, 28, 0, 43, 38, 0, 0, 35, 0,
+  53, 27, 7, 21, 30, 0, 31, 28, 62, 0,
+  36, 0, 0, 42, 1, 0, 11, 10, 39, 35,
+  0, 0, 24, 0, 67, 0, 0, 27, 42, 50,
+  46, 18, 14, 0, 25, 0, 0, 33, 56, 0,
+  33, 24, 74, 0, 21, 0, 46, 9, 0, 40,
+  0, 0, 5, 0, 79, 51, 29, 30, 0, 28,
+  9, 0, 6, 57, 44, 75, 60, 18, 9, 0,
+  0, 32, 53, 70, 33, 61, 135, 47, 36, 0,
+  45, 8, 29, 0, 0, 4, 0, 55, 0, 0,
+  25, 9, 0, 4, 34, 0, 0, 18, 21, 51,
+  44, 48, 0, 10, 3, 61, 0, 58, 0, 0,
+  12, 61, 0, 22, 46, 13, 15, 0, 0, 2,
+  14, 0, 34, 33, 0, 3, 31, 0, 57, 9,
+  0, 22, 46, 0, 23, 34, 53, 5, 53, 2,
+  0, 39, 29, 0, 36, 10, 25, 36, 0, 0,
+  19, 0, 58, 0, 0, 20, 53, 51, 44, 24,
+  38, 2, 31, 0, 0, 13, 50, 0, 40, 53,
+  98, 0, 37, 0, 54, 1, 0, 57, 0, 0,
+  7, 0, 75, 49, 21, 35, 0, 26, 12, 9,
+  20, 56, 23, 65, 41, 43, 0, 0, 0, 51,
+  49, 70, 25, 60, 128, 38, 16, 1, 47, 0,
+  34, 0, 0, 0, 0, 68, 0, 0, 51, 15,
+  10, 0, 33, 0, 0, 22, 41, 66, 39, 66,
+  0, 5, 0, 59, 0, 43, 0, 0, 13, 40,
+  0, 20, 49, 2, 9, 0, 0, 5, 40, 0,
+  43, 31, 0, 19, 43, 2, 80, 35, 0, 14,
+  27, 0, 17, 32, 100, 3, 76, 2, 0, 16,
+  24, 9, 46, 5, 10, 44, 0, 0, 7, 0,
+  65, 0, 4, 31, 54, 32, 37, 0, 31, 0,
+  29, 0, 0, 0, 10, 17, 45, 22, 97, 0,
+  76, 0, 23, 0, 0, 29, 0, 0, 0, 0,
+  15, 0, 80, 38, 0, 0, 0, 0, 0, 0,
+  0, 35, 26, 0, 14, 0, 0, 45, 31, 0,
+  42, 64, 0, 0, 16, 0, 0, 5, 0, 0,
+  32, 60, 1, 0, 52, 0, 0, 0, 0, 15,
+  40, 0, 0, 0, 0, 2, 11, 0, 19, 50,
+  26, 49, 0, 0, 6, 43, 3, 66, 19, 0,
+  76, 0, 18, 84, 0, 0, 2, 19, 0, 39,
+  0, 5, 14, 0, 39, 27, 3, 12, 27, 17,
+  21, 31, 23, 0, 0, 98, 2, 0, 0, 0,
+  0, 0, 39, 39, 30, 37, 0, 0, 15, 0,
+  0, 33, 0, 44, 1, 9, 0, 0, 55, 0,
+  0, 24, 71, 0, 0, 0, 0, 0, 0, 0,
+  42, 0, 0, 21, 0, 0, 2, 0, 15, 0,
+  74, 29, 0, 18, 0, 12, 0, 34, 16, 63,
+  31, 0, 0, 0, 0, 43, 15, 0, 18, 55,
+  0, 0, 44, 0, 0, 15, 0, 0, 19, 53,
+  0, 0, 37, 0, 0, 0, 0, 6, 28, 0,
+  0, 0, 0, 19, 26, 0, 3, 71, 33, 50,
+  0, 0, 10, 18, 0, 54, 2, 0, 62, 0,
+  20, 53, 0, 0, 0, 10, 0, 34, 0, 0,
+  19, 0, 50, 13, 6, 0, 30, 11, 7, 22,
+  34, 0, 0, 109, 0, 6, 0, 0, 0, 0,
+  36, 46, 17, 32, 7, 0, 17, 0, 0, 18,
+  0, 40, 0, 25, 0, 9, 51, 0, 0, 9,
+  68, 0, 0, 9, 34, 0, 14, 0, 50, 0,
+  0, 44, 0, 0, 11, 0, 30, 0, 44, 53,
+  0, 11, 18, 12, 0, 82, 51, 71, 16, 19,
+  0, 0, 0, 63, 28, 37, 0, 67, 2, 0,
+  45, 0, 33, 25, 0, 0, 0, 52, 0, 0,
+  18, 0, 13, 17, 0, 3, 20, 20, 0, 7,
+  2, 12, 49, 14, 0, 32, 19, 44, 0, 21,
+  12, 0, 0, 24, 0, 0, 80, 1, 40, 3,
+  0, 0, 8, 26, 18, 45, 0, 0, 0, 0,
+  87, 25, 0, 0, 27, 11, 0, 26, 28, 6,
+  18, 90, 0, 29, 0, 0, 0, 0, 0, 71,
+  9, 2, 14, 0, 37, 0, 0, 24, 1, 42,
+  0, 27, 0, 6, 32, 0, 0, 6, 43, 0,
+  9, 0, 103, 0, 43, 0, 51, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 40, 0, 0, 5, 0, 79, 51,
+  29, 30, 0, 28, 9, 0, 6, 57, 44, 75,
+  60, 18, 9, 0, 0, 32, 53, 70, 33, 61,
+  135, 47, 36, 0, 45, 8, 29, 0, 0, 4,
+  0, 55, 0, 0, 25, 9, 0, 4, 34, 0,
+  0, 18, 21, 51, 44, 48, 0, 10, 3, 61,
+  0, 58, 0, 0, 12, 61, 0, 22, 46, 13,
+  15, 0, 0, 2, 14, 0, 34, 33, 0, 3,
+  31, 0, 57, 9, 0, 22, 46, 0, 23, 34,
+  53, 5, 53, 2, 0, 39, 29, 0, 36, 10,
+  25, 36, 0, 0, 19, 0, 58, 0, 0, 20,
+  53, 51, 44, 24, 38, 2, 31, 0, 0, 13,
+  50, 0, 40, 53, 98, 0, 37, 0, 54, 1,
+  0, 57, 0, 0, 7, 0, 75, 49, 21, 35,
+  0, 26, 12, 9, 20, 56, 23, 65, 41, 43,
+  0, 0, 0, 51, 49, 70, 25, 60, 128, 38,
+  16, 1, 47, 0, 34, 0, 0, 0, 0, 68,
+  0, 0, 51, 15, 10, 0, 33, 0, 0, 22,
+  41, 66, 39, 66, 0, 5, 0, 59, 0, 43,
+  0, 0, 13, 40, 0, 20, 49, 2, 9, 0,
+  0, 5, 40, 0, 43, 31, 0, 19, 43, 2,
+  80, 35, 0, 14, 27, 0, 17, 32, 100, 3,
+  76, 2, 0, 16, 24, 9, 46, 5, 10, 44,
+  0, 0, 7, 0, 65, 0, 4, 31, 54, 32,
+  37, 0, 31, 0, 29, 0, 0, 0, 10, 17,
+  45, 22, 97, 0, 76, 0, 23, 0, 0, 100,
+  25, 10, 0, 0, 70, 30, 19, 50, 0, 57,
+  14, 13, 11, 54, 10, 51, 32, 74, 0, 0,
+  0, 42, 41, 47, 55, 47, 140, 28, 0, 6,
+  69, 0, 51, 0, 0, 0, 0, 61, 0, 0,
+  55, 28, 10, 25, 39, 0, 0, 40, 29, 63,
+  62, 56, 3, 0, 0, 4, 0, 42, 0, 0,
+  18, 10, 0, 13, 27, 0, 4, 2, 3, 7,
+  57, 0, 55, 33, 0, 39, 43, 0, 86, 34,
+  0, 21, 5, 0, 34, 32, 104, 0, 59, 5,
+  0, 0, 22, 8, 33, 0, 3, 36, 0, 11,
+  27, 0, 66, 0, 37, 39, 34, 16, 38, 0,
+  27, 2, 5, 0, 0, 0, 0, 19, 44, 4,
+  64, 0, 73, 0, 11, 0, 0, 21, 0, 0,
+  2, 0, 15, 0, 74, 29, 0, 18, 0, 12,
+  0, 34, 16, 63, 31, 0, 0, 0, 0, 43,
+  15, 0, 18, 55, 0, 0, 44, 0, 0, 15,
+  0, 0, 19, 53, 0, 0, 37, 0, 0, 0,
+  0, 6, 28, 0, 0, 0, 0, 19, 26, 0,
+  3, 71, 33, 50, 0, 0, 10, 18, 0, 54,
+  2, 0, 62, 0, 20, 53, 0, 0, 0, 10,
+  0, 34, 0, 0, 19, 0, 50, 13, 6, 0,
+  30, 11, 7, 22, 34, 0, 0, 109, 0, 6,
+  0, 0, 0, 0, 36, 46, 17, 32, 7, 0,
+  17, 0, 0, 18, 0, 40, 0, 25, 0, 9,
+  51, 0, 0, 9, 68, 0, 0, 9, 34, 0,
+  14, 0, 50, 0, 0, 44, 0, 0, 11, 0,
+  30, 0, 44, 53, 0, 11, 18, 12, 0, 82,
+  51, 71, 16, 19, 0, 0, 0, 63, 28, 37,
+  0, 67, 2, 0, 45, 0, 33, 25, 0, 0,
+  0, 52, 0, 0, 18, 0, 13, 17, 0, 3,
+  20, 20, 0, 7, 2, 12, 49, 14, 0, 32,
+  19, 44, 0, 21, 12, 0, 0, 24, 0, 0,
+  80, 1, 40, 3, 0, 0, 8, 26, 18, 45,
+  0, 0, 0, 0, 87, 25, 0, 0, 27, 11,
+  0, 26, 28, 6, 18, 90, 0, 29, 0, 0,
+  0, 0, 0, 71, 9, 2, 14, 0, 37, 0,
+  0, 24, 1, 42, 0, 27, 0, 6, 32, 0,
+  0, 6, 43, 0, 9, 0, 103, 0, 43, 0,
+  51, 0, 0, 102, 14, 0, 4, 0, 39, 0,
+  27, 51, 8, 13, 23, 3, 26, 91, 67, 61,
+  21, 56, 0, 0, 0, 56, 53, 69, 6, 74,
+  0, 0, 14, 0, 81, 1, 0, 0, 0, 25,
+  0, 38, 0, 16, 42, 22, 1, 7, 22, 19,
+  0, 49, 2, 1, 68, 52, 0, 0, 0, 9,
+  0, 50, 0, 0, 0, 0, 0, 0, 91, 11,
+  34, 0, 0, 0, 15, 26, 42, 23, 0, 6,
+  0, 4, 107, 11, 0, 0, 11, 8, 10, 15,
+  30, 12, 42, 45, 0, 41, 0, 10, 0, 0,
+  0, 81, 0, 0, 14, 0, 46, 0, 23, 15,
+  32, 37, 0, 0, 0, 0, 0, 0, 0, 0,
+  12, 0, 30, 11, 149, 0, 76, 0, 46, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 57, 0, 0, 7, 0,
+  75, 49, 21, 35, 0, 26, 12, 9, 20, 56,
+  23, 65, 41, 43, 0, 0, 0, 51, 49, 70,
+  25, 60, 128, 38, 16, 1, 47, 0, 34, 0,
+  0, 0, 0, 68, 0, 0, 51, 15, 10, 0,
+  33, 0, 0, 22, 41, 66, 39, 66, 0, 5,
+  0, 59, 0, 43, 0, 0, 13, 40, 0, 20,
+  49, 2, 9, 0, 0, 5, 40, 0, 43, 31,
+  0, 19, 43, 2, 80, 35, 0, 14, 27, 0,
+  17, 32, 100, 3, 76, 2, 0, 16, 24, 9,
+  46, 5, 10, 44, 0, 0, 7, 0, 65, 0,
+  4, 31, 54, 32, 37, 0, 31, 0, 29, 0,
+  0, 0, 10, 17, 45, 22, 97, 0, 76, 0,
+  23, 0, 0, 100, 25, 10, 0, 0, 70, 30,
+  19, 50, 0, 57, 14, 13, 11, 54, 10, 51,
+  32, 74, 0, 0, 0, 42, 41, 47, 55, 47,
+  140, 28, 0, 6, 69, 0, 51, 0, 0, 0,
+  0, 61, 0, 0, 55, 28, 10, 25, 39, 0,
+  0, 40, 29, 63, 62, 56, 3, 0, 0, 4,
+  0, 42, 0, 0, 18, 10, 0, 13, 27, 0,
+  4, 2, 3, 7, 57, 0, 55, 33, 0, 39,
+  43, 0, 86, 34, 0, 21, 5, 0, 34, 32,
+  104, 0, 59, 5, 0, 0, 22, 8, 33, 0,
+  3, 36, 0, 11, 27, 0, 66, 0, 37, 39,
+  34, 16, 38, 0, 27, 2, 5, 0, 0, 0,
+  0, 19, 44, 4, 64, 0, 73, 0, 11, 0,
+  0, 123, 31, 8, 0, 0, 58, 2, 5, 19,
+  0, 61, 49, 0, 0, 22, 6, 34, 22, 59,
+  0, 0, 47, 46, 38, 9, 61, 16, 179, 16,
+  0, 0, 76, 0, 51, 37, 0, 0, 40, 47,
+  0, 0, 71, 33, 17, 78, 26, 17, 0, 47,
+  0, 63, 77, 0, 7, 0, 7, 0, 0, 10,
+  13, 30, 0, 26, 0, 3, 14, 0, 1, 0,
+  72, 10, 34, 0, 44, 21, 8, 54, 16, 0,
+  64, 0, 25, 21, 0, 5, 39, 21, 53, 0,
+  0, 0, 23, 0, 9, 12, 0, 0, 0, 25,
+  0, 51, 27, 5, 41, 0, 55, 0, 0, 34,
+  30, 0, 0, 7, 0, 0, 0, 10, 31, 34,
+  58, 5, 0, 0, 20, 0, 0, 0, 0, 44,
+  0, 0, 11, 0, 30, 0, 44, 53, 0, 11,
+  18, 12, 0, 82, 51, 71, 16, 19, 0, 0,
+  0, 63, 28, 37, 0, 67, 2, 0, 45, 0,
+  33, 25, 0, 0, 0, 52, 0, 0, 18, 0,
+  13, 17, 0, 3, 20, 20, 0, 7, 2, 12,
+  49, 14, 0, 32, 19, 44, 0, 21, 12, 0,
+  0, 24, 0, 0, 80, 1, 40, 3, 0, 0,
+  8, 26, 18, 45, 0, 0, 0, 0, 87, 25,
+  0, 0, 27, 11, 0, 26, 28, 6, 18, 90,
+  0, 29, 0, 0, 0, 0, 0, 71, 9, 2,
+  14, 0, 37, 0, 0, 24, 1, 42, 0, 27,
+  0, 6, 32, 0, 0, 6, 43, 0, 9, 0,
+  103, 0, 43, 0, 51, 0, 0, 102, 14, 0,
+  4, 0, 39, 0, 27, 51, 8, 13, 23, 3,
+  26, 91, 67, 61, 21, 56, 0, 0, 0, 56,
+  53, 69, 6, 74, 0, 0, 14, 0, 81, 1,
+  0, 0, 0, 25, 0, 38, 0, 16, 42, 22,
+  1, 7, 22, 19, 0, 49, 2, 1, 68, 52,
+  0, 0, 0, 9, 0, 50, 0, 0, 0, 0,
+  0, 0, 91, 11, 34, 0, 0, 0, 15, 26,
+  42, 23, 0, 6, 0, 4, 107, 11, 0, 0,
+  11, 8, 10, 15, 30, 12, 42, 45, 0, 41,
+  0, 10, 0, 0, 0, 81, 0, 0, 14, 0,
+  46, 0, 23, 15, 32, 37, 0, 0, 0, 0,
+  0, 0, 0, 0, 12, 0, 30, 11, 149, 0,
+  76, 0, 46, 0, 0, 131, 52, 5, 17, 0,
+  45, 0, 11, 44, 5, 23, 60, 0, 17, 55,
+  55, 49, 15, 72, 0, 0, 12, 32, 54, 53,
+  11, 54, 0, 20, 0, 0, 76, 0, 17, 0,
+  0, 0, 0, 41, 0, 25, 68, 41, 28, 22,
+  40, 0, 0, 52, 0, 3, 85, 24, 0, 0,
+  0, 0, 0, 44, 4, 0, 0, 5, 0, 0,
+  29, 13, 13, 0, 0, 0, 8, 16, 74, 5,
+  15, 32, 0, 0, 97, 0, 0, 0, 14, 0,
+  30, 16, 22, 9, 0, 0, 0, 20, 0, 26,
+  0, 0, 0, 38, 5, 16, 9, 0, 39, 0,
+  48, 8, 25, 53, 0, 0, 0, 5, 0, 0,
+  0, 24, 33, 0, 34, 5, 77, 0, 62, 0,
+  29, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 100, 25, 10,
+  0, 0, 70, 30, 19, 50, 0, 57, 14, 13,
+  11, 54, 10, 51, 32, 74, 0, 0, 0, 42,
+  41, 47, 55, 47, 140, 28, 0, 6, 69, 0,
+  51, 0, 0, 0, 0, 61, 0, 0, 55, 28,
+  10, 25, 39, 0, 0, 40, 29, 63, 62, 56,
+  3, 0, 0, 4, 0, 42, 0, 0, 18, 10,
+  0, 13, 27, 0, 4, 2, 3, 7, 57, 0,
+  55, 33, 0, 39, 43, 0, 86, 34, 0, 21,
+  5, 0, 34, 32, 104, 0, 59, 5, 0, 0,
+  22, 8, 33, 0, 3, 36, 0, 11, 27, 0,
+  66, 0, 37, 39, 34, 16, 38, 0, 27, 2,
+  5, 0, 0, 0, 0, 19, 44, 4, 64, 0,
+  73, 0, 11, 0, 0, 123, 31, 8, 0, 0,
+  58, 2, 5, 19, 0, 61, 49, 0, 0, 22,
+  6, 34, 22, 59, 0, 0, 47, 46, 38, 9,
+  61, 16, 179, 16, 0, 0, 76, 0, 51, 37,
+  0, 0, 40, 47, 0, 0, 71, 33, 17, 78,
+  26, 17, 0, 47, 0, 63, 77, 0, 7, 0,
+  7, 0, 0, 10, 13, 30, 0, 26, 0, 3,
+  14, 0, 1, 0, 72, 10, 34, 0, 44, 21,
+  8, 54, 16, 0, 64, 0, 25, 21, 0, 5,
+  39, 21, 53, 0, 0, 0, 23, 0, 9, 12,
+  0, 0, 0, 25, 0, 51, 27, 5, 41, 0,
+  55, 0, 0, 34, 30, 0, 0, 7, 0, 0,
+  0, 10, 31, 34, 58, 5, 0, 0, 20, 0,
+  0, 0, 5, 63, 0, 6, 0, 6, 70, 9,
+  0, 0, 0, 80, 68, 0, 0, 0, 4, 24,
+  17, 28, 10, 34, 89, 45, 45, 0, 53, 4,
+  206, 0, 0, 11, 57, 5, 17, 54, 0, 0,
+  60, 39, 0, 0, 1, 61, 12, 128, 21, 26,
+  0, 14, 0, 73, 56, 0, 20, 6, 28, 0,
+  28, 0, 56, 44, 0, 46, 15, 2, 13, 32,
+  46, 0, 134, 11, 24, 0, 54, 0, 56, 54,
+  12, 0, 36, 0, 34, 0, 0, 7, 35, 1,
+  23, 0, 0, 0, 35, 0, 0, 29, 0, 0,
+  59, 43, 6, 53, 7, 33, 53, 18, 22, 0,
+  0, 36, 0, 23, 0, 10, 0, 29, 0, 20,
+  61, 20, 68, 0, 0, 0, 0, 0, 0, 0,
+  0, 102, 14, 0, 4, 0, 39, 0, 27, 51,
+  8, 13, 23, 3, 26, 91, 67, 61, 21, 56,
+  0, 0, 0, 56, 53, 69, 6, 74, 0, 0,
+  14, 0, 81, 1, 0, 0, 0, 25, 0, 38,
+  0, 16, 42, 22, 1, 7, 22, 19, 0, 49,
+  2, 1, 68, 52, 0, 0, 0, 9, 0, 50,
+  0, 0, 0, 0, 0, 0, 91, 11, 34, 0,
+  0, 0, 15, 26, 42, 23, 0, 6, 0, 4,
+  107, 11, 0, 0, 11, 8, 10, 15, 30, 12,
+  42, 45, 0, 41, 0, 10, 0, 0, 0, 81,
+  0, 0, 14, 0, 46, 0, 23, 15, 32, 37,
+  0, 0, 0, 0, 0, 0, 0, 0, 12, 0,
+  30, 11, 149, 0, 76, 0, 46, 0, 0, 131,
+  52, 5, 17, 0, 45, 0, 11, 44, 5, 23,
+  60, 0, 17, 55, 55, 49, 15, 72, 0, 0,
+  12, 32, 54, 53, 11, 54, 0, 20, 0, 0,
+  76, 0, 17, 0, 0, 0, 0, 41, 0, 25,
+  68, 41, 28, 22, 40, 0, 0, 52, 0, 3,
+  85, 24, 0, 0, 0, 0, 0, 44, 4, 0,
+  0, 5, 0, 0, 29, 13, 13, 0, 0, 0,
+  8, 16, 74, 5, 15, 32, 0, 0, 97, 0,
+  0, 0, 14, 0, 30, 16, 22, 9, 0, 0,
+  0, 20, 0, 26, 0, 0, 0, 38, 5, 16,
+  9, 0, 39, 0, 48, 8, 25, 53, 0, 0,
+  0, 5, 0, 0, 0, 24, 33, 0, 34, 5,
+  77, 0, 62, 0, 29, 0, 0, 75, 0, 0,
+  5, 14, 48, 1, 0, 0, 0, 56, 51, 0,
+  0, 4, 32, 10, 13, 41, 0, 10, 71, 13,
+  29, 0, 10, 14, 0, 17, 0, 0, 42, 0,
+  5, 27, 0, 0, 9, 20, 0, 26, 0, 66,
+  11, 74, 35, 26, 0, 2, 0, 16, 68, 0,
+  0, 0, 30, 0, 1, 5, 28, 45, 0, 49,
+  0, 0, 0, 37, 29, 0, 51, 0, 22, 9,
+  83, 12, 47, 23, 0, 0, 69, 0, 4, 0,
+  38, 0, 23, 2, 0, 0, 0, 0, 0, 6,
+  0, 38, 0, 0, 22, 49, 15, 29, 19, 13,
+  22, 0, 31, 11, 0, 28, 0, 0, 0, 0,
+  0, 0, 0, 19, 71, 6, 22, 4, 0, 0,
+  22, 0, 10, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 123,
+  31, 8, 0, 0, 58, 2, 5, 19, 0, 61,
+  49, 0, 0, 22, 6, 34, 22, 59, 0, 0,
+  47, 46, 38, 9, 61, 16, 179, 16, 0, 0,
+  76, 0, 51, 37, 0, 0, 40, 47, 0, 0,
+  71, 33, 17, 78, 26, 17, 0, 47, 0, 63,
+  77, 0, 7, 0, 7, 0, 0, 10, 13, 30,
+  0, 26, 0, 3, 14, 0, 1, 0, 72, 10,
+  34, 0, 44, 21, 8, 54, 16, 0, 64, 0,
+  25, 21, 0, 5, 39, 21, 53, 0, 0, 0,
+  23, 0, 9, 12, 0, 0, 0, 25, 0, 51,
+  27, 5, 41, 0, 55, 0, 0, 34, 30, 0,
+  0, 7, 0, 0, 0, 10, 31, 34, 58, 5,
+  0, 0, 20, 0, 0, 0, 5, 63, 0, 6,
+  0, 6, 70, 9, 0, 0, 0, 80, 68, 0,
+  0, 0, 4, 24, 17, 28, 10, 34, 89, 45,
+  45, 0, 53, 4, 206, 0, 0, 11, 57, 5,
+  17, 54, 0, 0, 60, 39, 0, 0, 1, 61,
+  12, 128, 21, 26, 0, 14, 0, 73, 56, 0,
+  20, 6, 28, 0, 28, 0, 56, 44, 0, 46,
+  15, 2, 13, 32, 46, 0, 134, 11, 24, 0,
+  54, 0, 56, 54, 12, 0, 36, 0, 34, 0,
+  0, 7, 35, 1, 23, 0, 0, 0, 35, 0,
+  0, 29, 0, 0, 59, 43, 6, 53, 7, 33,
+  53, 18, 22, 0, 0, 36, 0, 23, 0, 10,
+  0, 29, 0, 20, 61, 20, 68, 0, 0, 0,
+  0, 0, 0, 0, 23, 19, 0, 34, 10, 9,
+  83, 40, 0, 0, 0, 24, 57, 8, 0, 49,
+  29, 55, 14, 27, 77, 6, 23, 33, 54, 0,
+  58, 20, 192, 4, 0, 22, 109, 15, 46, 0,
+  0, 37, 38, 5, 0, 0, 0, 70, 41, 137,
+  1, 46, 0, 13, 0, 79, 54, 2, 11, 54,
+  16, 0, 0, 0, 37, 0, 13, 6, 0, 0,
+  18, 17, 31, 11, 84, 0, 5, 0, 13, 0,
+  66, 45, 13, 0, 58, 0, 30, 0, 0, 0,
+  28, 0, 31, 38, 0, 18, 0, 18, 32, 25,
+  25, 0, 48, 37, 18, 2, 0, 55, 81, 0,
+  12, 13, 23, 14, 0, 32, 10, 37, 0, 0,
+  29, 0, 19, 21, 86, 0, 13, 0, 0, 0,
+  37, 12, 0, 131, 52, 5, 17, 0, 45, 0,
+  11, 44, 5, 23, 60, 0, 17, 55, 55, 49,
+  15, 72, 0, 0, 12, 32, 54, 53, 11, 54,
+  0, 20, 0, 0, 76, 0, 17, 0, 0, 0,
+  0, 41, 0, 25, 68, 41, 28, 22, 40, 0,
+  0, 52, 0, 3, 85, 24, 0, 0, 0, 0,
+  0, 44, 4, 0, 0, 5, 0, 0, 29, 13,
+  13, 0, 0, 0, 8, 16, 74, 5, 15, 32,
+  0, 0, 97, 0, 0, 0, 14, 0, 30, 16,
+  22, 9, 0, 0, 0, 20, 0, 26, 0, 0,
+  0, 38, 5, 16, 9, 0, 39, 0, 48, 8,
+  25, 53, 0, 0, 0, 5, 0, 0, 0, 24,
+  33, 0, 34, 5, 77, 0, 62, 0, 29, 0,
+  0, 75, 0, 0, 5, 14, 48, 1, 0, 0,
+  0, 56, 51, 0, 0, 4, 32, 10, 13, 41,
+  0, 10, 71, 13, 29, 0, 10, 14, 0, 17,
+  0, 0, 42, 0, 5, 27, 0, 0, 9, 20,
+  0, 26, 0, 66, 11, 74, 35, 26, 0, 2,
+  0, 16, 68, 0, 0, 0, 30, 0, 1, 5,
+  28, 45, 0, 49, 0, 0, 0, 37, 29, 0,
+  51, 0, 22, 9, 83, 12, 47, 23, 0, 0,
+  69, 0, 4, 0, 38, 0, 23, 2, 0, 0,
+  0, 0, 0, 6, 0, 38, 0, 0, 22, 49,
+  15, 29, 19, 13, 22, 0, 31, 11, 0, 28,
+  0, 0, 0, 0, 0, 0, 0, 19, 71, 6,
+  22, 4, 0, 0, 22, 0, 10, 0, 7, 18,
+  0, 16, 0, 21, 57, 17, 0, 0, 0, 41,
+  57, 2, 0, 6, 60, 44, 5, 5, 45, 0,
+  15, 0, 37, 0, 27, 0, 0, 35, 0, 0,
+  85, 0, 0, 0, 0, 5, 0, 0, 0, 23,
+  0, 64, 4, 113, 25, 79, 0, 0, 0, 41,
+  66, 0, 0, 22, 11, 0, 0, 0, 15, 0,
+  0, 2, 0, 0, 0, 36, 38, 0, 60, 0,
+  2, 0, 50, 0, 47, 0, 0, 0, 62, 0,
+  47, 0, 7, 0, 20, 0, 0, 8, 0, 4,
+  0, 8, 0, 7, 0, 0, 51, 44, 26, 26,
+  0, 37, 18, 0, 29, 6, 9, 13, 0, 18,
+  0, 17, 0, 0, 6, 0, 36, 0, 37, 0,
+  37, 0, 0, 0, 38, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  5, 63, 0, 6, 0, 6, 70, 9, 0, 0,
+  0, 80, 68, 0, 0, 0, 4, 24, 17, 28,
+  10, 34, 89, 45, 45, 0, 53, 4, 206, 0,
+  0, 11, 57, 5, 17, 54, 0, 0, 60, 39,
+  0, 0, 1, 61, 12, 128, 21, 26, 0, 14,
+  0, 73, 56, 0, 20, 6, 28, 0, 28, 0,
+  56, 44, 0, 46, 15, 2, 13, 32, 46, 0,
+  134, 11, 24, 0, 54, 0, 56, 54, 12, 0,
+  36, 0, 34, 0, 0, 7, 35, 1, 23, 0,
+  0, 0, 35, 0, 0, 29, 0, 0, 59, 43,
+  6, 53, 7, 33, 53, 18, 22, 0, 0, 36,
+  0, 23, 0, 10, 0, 29, 0, 20, 61, 20,
+  68, 0, 0, 0, 0, 0, 0, 0, 23, 19,
+  0, 34, 10, 9, 83, 40, 0, 0, 0, 24,
+  57, 8, 0, 49, 29, 55, 14, 27, 77, 6,
+  23, 33, 54, 0, 58, 20, 192, 4, 0, 22,
+  109, 15, 46, 0, 0, 37, 38, 5, 0, 0,
+  0, 70, 41, 137, 1, 46, 0, 13, 0, 79,
+  54, 2, 11, 54, 16, 0, 0, 0, 37, 0,
+  13, 6, 0, 0, 18, 17, 31, 11, 84, 0,
+  5, 0, 13, 0, 66, 45, 13, 0, 58, 0,
+  30, 0, 0, 0, 28, 0, 31, 38, 0, 18,
+  0, 18, 32, 25, 25, 0, 48, 37, 18, 2,
+  0, 55, 81, 0, 12, 13, 23, 14, 0, 32,
+  10, 37, 0, 0, 29, 0, 19, 21, 86, 0,
+  13, 0, 0, 0, 37, 12, 0, 33, 0, 8,
+  0, 0, 88, 51, 0, 25, 4, 29, 23, 1,
+  15, 91, 42, 50, 0, 22, 30, 0, 0, 49,
+  47, 30, 47, 45, 143, 63, 23, 6, 105, 25,
+  47, 0, 0, 39, 4, 30, 0, 3, 39, 25,
+  43, 65, 2, 47, 0, 56, 16, 77, 68, 39,
+  2, 24, 5, 0, 0, 43, 0, 0, 0, 26,
+  0, 4, 28, 0, 0, 0, 1, 21, 0, 0,
+  4, 46, 30, 14, 4, 0, 94, 0, 0, 19,
+  0, 0, 9, 3, 54, 33, 28, 12, 0, 25,
+  28, 16, 54, 0, 16, 44, 0, 0, 10, 24,
+  96, 0, 13, 21, 39, 36, 23, 10, 46, 34,
+  8, 0, 13, 0, 3, 31, 63, 19, 94, 0,
+  15, 0, 17, 0, 0, 75, 0, 0, 5, 14,
+  48, 1, 0, 0, 0, 56, 51, 0, 0, 4,
+  32, 10, 13, 41, 0, 10, 71, 13, 29, 0,
+  10, 14, 0, 17, 0, 0, 42, 0, 5, 27,
+  0, 0, 9, 20, 0, 26, 0, 66, 11, 74,
+  35, 26, 0, 2, 0, 16, 68, 0, 0, 0,
+  30, 0, 1, 5, 28, 45, 0, 49, 0, 0,
+  0, 37, 29, 0, 51, 0, 22, 9, 83, 12,
+  47, 23, 0, 0, 69, 0, 4, 0, 38, 0,
+  23, 2, 0, 0, 0, 0, 0, 6, 0, 38,
+  0, 0, 22, 49, 15, 29, 19, 13, 22, 0,
+  31, 11, 0, 28, 0, 0, 0, 0, 0, 0,
+  0, 19, 71, 6, 22, 4, 0, 0, 22, 0,
+  10, 0, 7, 18, 0, 16, 0, 21, 57, 17,
+  0, 0, 0, 41, 57, 2, 0, 6, 60, 44,
+  5, 5, 45, 0, 15, 0, 37, 0, 27, 0,
+  0, 35, 0, 0, 85, 0, 0, 0, 0, 5,
+  0, 0, 0, 23, 0, 64, 4, 113, 25, 79,
+  0, 0, 0, 41, 66, 0, 0, 22, 11, 0,
+  0, 0, 15, 0, 0, 2, 0, 0, 0, 36,
+  38, 0, 60, 0, 2, 0, 50, 0, 47, 0,
+  0, 0, 62, 0, 47, 0, 7, 0, 20, 0,
+  0, 8, 0, 4, 0, 8, 0, 7, 0, 0,
+  51, 44, 26, 26, 0, 37, 18, 0, 29, 6,
+  9, 13, 0, 18, 0, 17, 0, 0, 6, 0,
+  36, 0, 37, 0, 37, 0, 0, 0, 38, 0,
+  0, 12, 0, 42, 6, 15, 37, 28, 4, 4,
+  6, 14, 22, 0, 5, 59, 66, 39, 0, 24,
+  0, 0, 0, 20, 47, 15, 29, 33, 0, 35,
+  0, 0, 91, 34, 6, 0, 0, 11, 0, 10,
+  0, 18, 0, 22, 0, 58, 46, 78, 0, 43,
+  0, 62, 86, 46, 0, 56, 0, 0, 0, 20,
+  4, 0, 0, 0, 0, 0, 39, 0, 35, 6,
+  23, 0, 0, 0, 28, 23, 8, 0, 0, 0,
+  113, 0, 11, 9, 0, 0, 7, 22, 0, 0,
+  22, 29, 0, 8, 36, 0, 36, 0, 26, 59,
+  19, 7, 14, 19, 16, 0, 26, 17, 35, 32,
+  0, 9, 19, 42, 0, 0, 5, 0, 0, 0,
+  14, 11, 125, 0, 35, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 23, 19, 0, 34, 10, 9, 83, 40,
+  0, 0, 0, 24, 57, 8, 0, 49, 29, 55,
+  14, 27, 77, 6, 23, 33, 54, 0, 58, 20,
+  192, 4, 0, 22, 109, 15, 46, 0, 0, 37,
+  38, 5, 0, 0, 0, 70, 41, 137, 1, 46,
+  0, 13, 0, 79, 54, 2, 11, 54, 16, 0,
+  0, 0, 37, 0, 13, 6, 0, 0, 18, 17,
+  31, 11, 84, 0, 5, 0, 13, 0, 66, 45,
+  13, 0, 58, 0, 30, 0, 0, 0, 28, 0,
+  31, 38, 0, 18, 0, 18, 32, 25, 25, 0,
+  48, 37, 18, 2, 0, 55, 81, 0, 12, 13,
+  23, 14, 0, 32, 10, 37, 0, 0, 29, 0,
+  19, 21, 86, 0, 13, 0, 0, 0, 37, 12,
+  0, 33, 0, 8, 0, 0, 88, 51, 0, 25,
+  4, 29, 23, 1, 15, 91, 42, 50, 0, 22,
+  30, 0, 0, 49, 47, 30, 47, 45, 143, 63,
+  23, 6, 105, 25, 47, 0, 0, 39, 4, 30,
+  0, 3, 39, 25, 43, 65, 2, 47, 0, 56,
+  16, 77, 68, 39, 2, 24, 5, 0, 0, 43,
+  0, 0, 0, 26, 0, 4, 28, 0, 0, 0,
+  1, 21, 0, 0, 4, 46, 30, 14, 4, 0,
+  94, 0, 0, 19, 0, 0, 9, 3, 54, 33,
+  28, 12, 0, 25, 28, 16, 54, 0, 16, 44,
+  0, 0, 10, 24, 96, 0, 13, 21, 39, 36,
+  23, 10, 46, 34, 8, 0, 13, 0, 3, 31,
+  63, 19, 94, 0, 15, 0, 17, 0, 0, 98,
+  1, 0, 0, 0, 70, 26, 1, 40, 0, 18,
+  8, 0, 0, 55, 20, 56, 0, 28, 0, 0,
+  9, 77, 37, 43, 56, 51, 165, 33, 18, 0,
+  85, 0, 49, 0, 0, 7, 13, 31, 0, 0,
+  65, 0, 42, 42, 0, 0, 0, 51, 14, 68,
+  75, 5, 23, 0, 0, 0, 0, 38, 0, 3,
+  1, 24, 0, 20, 44, 0, 0, 18, 0, 29,
+  38, 5, 30, 64, 3, 48, 31, 0, 73, 0,
+  0, 22, 0, 9, 14, 16, 72, 24, 54, 0,
+  0, 3, 10, 1, 31, 0, 4, 29, 0, 13,
+  27, 0, 87, 0, 38, 9, 40, 53, 46, 4,
+  16, 15, 5, 0, 5, 0, 11, 52, 56, 10,
+  49, 0, 36, 0, 7, 0, 7, 18, 0, 16,
+  0, 21, 57, 17, 0, 0, 0, 41, 57, 2,
+  0, 6, 60, 44, 5, 5, 45, 0, 15, 0,
+  37, 0, 27, 0, 0, 35, 0, 0, 85, 0,
+  0, 0, 0, 5, 0, 0, 0, 23, 0, 64,
+  4, 113, 25, 79, 0, 0, 0, 41, 66, 0,
+  0, 22, 11, 0, 0, 0, 15, 0, 0, 2,
+  0, 0, 0, 36, 38, 0, 60, 0, 2, 0,
+  50, 0, 47, 0, 0, 0, 62, 0, 47, 0,
+  7, 0, 20, 0, 0, 8, 0, 4, 0, 8,
+  0, 7, 0, 0, 51, 44, 26, 26, 0, 37,
+  18, 0, 29, 6, 9, 13, 0, 18, 0, 17,
+  0, 0, 6, 0, 36, 0, 37, 0, 37, 0,
+  0, 0, 38, 0, 0, 12, 0, 42, 6, 15,
+  37, 28, 4, 4, 6, 14, 22, 0, 5, 59,
+  66, 39, 0, 24, 0, 0, 0, 20, 47, 15,
+  29, 33, 0, 35, 0, 0, 91, 34, 6, 0,
+  0, 11, 0, 10, 0, 18, 0, 22, 0, 58,
+  46, 78, 0, 43, 0, 62, 86, 46, 0, 56,
+  0, 0, 0, 20, 4, 0, 0, 0, 0, 0,
+  39, 0, 35, 6, 23, 0, 0, 0, 28, 23,
+  8, 0, 0, 0, 113, 0, 11, 9, 0, 0,
+  7, 22, 0, 0, 22, 29, 0, 8, 36, 0,
+  36, 0, 26, 59, 19, 7, 14, 19, 16, 0,
+  26, 17, 35, 32, 0, 9, 19, 42, 0, 0,
+  5, 0, 0, 0, 14, 11, 125, 0, 35, 0,
+  0, 0, 0, 93, 5, 24, 14, 0, 37, 16,
+  19, 24, 15, 1, 7, 0, 45, 74, 66, 43,
+  0, 20, 0, 0, 0, 49, 65, 69, 6, 62,
+  0, 1, 5, 0, 69, 27, 8, 0, 0, 8,
+  0, 34, 0, 35, 41, 0, 16, 0, 40, 0,
+  0, 56, 0, 37, 99, 45, 0, 4, 0, 17,
+  0, 45, 12, 0, 0, 33, 0, 12, 78, 0,
+  23, 0, 0, 0, 0, 6, 46, 35, 1, 18,
+  0, 2, 119, 0, 0, 1, 0, 16, 0, 27,
+  17, 29, 59, 0, 0, 26, 0, 8, 27, 0,
+  0, 42, 0, 0, 29, 0, 16, 0, 32, 10,
+  52, 56, 0, 0, 9, 11, 0, 0, 0, 0,
+  0, 0, 4, 23, 137, 0, 66, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 33, 0, 8, 0, 0,
+  88, 51, 0, 25, 4, 29, 23, 1, 15, 91,
+  42, 50, 0, 22, 30, 0, 0, 49, 47, 30,
+  47, 45, 143, 63, 23, 6, 105, 25, 47, 0,
+  0, 39, 4, 30, 0, 3, 39, 25, 43, 65,
+  2, 47, 0, 56, 16, 77, 68, 39, 2, 24,
+  5, 0, 0, 43, 0, 0, 0, 26, 0, 4,
+  28, 0, 0, 0, 1, 21, 0, 0, 4, 46,
+  30, 14, 4, 0, 94, 0, 0, 19, 0, 0,
+  9, 3, 54, 33, 28, 12, 0, 25, 28, 16,
+  54, 0, 16, 44, 0, 0, 10, 24, 96, 0,
+  13, 21, 39, 36, 23, 10, 46, 34, 8, 0,
+  13, 0, 3, 31, 63, 19, 94, 0, 15, 0,
+  17, 0, 0, 98, 1, 0, 0, 0, 70, 26,
+  1, 40, 0, 18, 8, 0, 0, 55, 20, 56,
+  0, 28, 0, 0, 9, 77, 37, 43, 56, 51,
+  165, 33, 18, 0, 85, 0, 49, 0, 0, 7,
+  13, 31, 0, 0, 65, 0, 42, 42, 0, 0,
+  0, 51, 14, 68, 75, 5, 23, 0, 0, 0,
+  0, 38, 0, 3, 1, 24, 0, 20, 44, 0,
+  0, 18, 0, 29, 38, 5, 30, 64, 3, 48,
+  31, 0, 73, 0, 0, 22, 0, 9, 14, 16,
+  72, 24, 54, 0, 0, 3, 10, 1, 31, 0,
+  4, 29, 0, 13, 27, 0, 87, 0, 38, 9,
+  40, 53, 46, 4, 16, 15, 5, 0, 5, 0,
+  11, 52, 56, 10, 49, 0, 36, 0, 7, 0,
+  21, 87, 0, 17, 0, 0, 7, 0, 27, 18,
+  0, 30, 39, 0, 0, 11, 9, 43, 15, 26,
+  0, 36, 93, 68, 12, 0, 68, 46, 209, 0,
+  0, 0, 54, 0, 48, 43, 0, 0, 65, 3,
+  0, 0, 39, 14, 18, 96, 0, 0, 0, 10,
+  0, 107, 61, 0, 69, 0, 19, 0, 17, 0,
+  20, 40, 0, 0, 35, 25, 0, 0, 0, 58,
+  134, 10, 46, 0, 8, 33, 3, 95, 34, 0,
+  24, 0, 8, 20, 0, 5, 21, 22, 59, 0,
+  30, 0, 0, 0, 54, 0, 27, 0, 10, 43,
+  26, 72, 29, 15, 69, 18, 47, 0, 13, 38,
+  8, 8, 0, 1, 0, 0, 3, 0, 8, 49,
+  53, 0, 0, 0, 36, 0, 0, 0, 0, 12,
+  0, 42, 6, 15, 37, 28, 4, 4, 6, 14,
+  22, 0, 5, 59, 66, 39, 0, 24, 0, 0,
+  0, 20, 47, 15, 29, 33, 0, 35, 0, 0,
+  91, 34, 6, 0, 0, 11, 0, 10, 0, 18,
+  0, 22, 0, 58, 46, 78, 0, 43, 0, 62,
+  86, 46, 0, 56, 0, 0, 0, 20, 4, 0,
+  0, 0, 0, 0, 39, 0, 35, 6, 23, 0,
+  0, 0, 28, 23, 8, 0, 0, 0, 113, 0,
+  11, 9, 0, 0, 7, 22, 0, 0, 22, 29,
+  0, 8, 36, 0, 36, 0, 26, 59, 19, 7,
+  14, 19, 16, 0, 26, 17, 35, 32, 0, 9,
+  19, 42, 0, 0, 5, 0, 0, 0, 14, 11,
+  125, 0, 35, 0, 0, 0, 0, 93, 5, 24,
+  14, 0, 37, 16, 19, 24, 15, 1, 7, 0,
+  45, 74, 66, 43, 0, 20, 0, 0, 0, 49,
+  65, 69, 6, 62, 0, 1, 5, 0, 69, 27,
+  8, 0, 0, 8, 0, 34, 0, 35, 41, 0,
+  16, 0, 40, 0, 0, 56, 0, 37, 99, 45,
+  0, 4, 0, 17, 0, 45, 12, 0, 0, 33,
+  0, 12, 78, 0, 23, 0, 0, 0, 0, 6,
+  46, 35, 1, 18, 0, 2, 119, 0, 0, 1,
+  0, 16, 0, 27, 17, 29, 59, 0, 0, 26,
+  0, 8, 27, 0, 0, 42, 0, 0, 29, 0,
+  16, 0, 32, 10, 52, 56, 0, 0, 9, 11,
+  0, 0, 0, 0, 0, 0, 4, 23, 137, 0,
+  66, 0, 0, 0, 0, 115, 36, 17, 6, 0,
+  3, 0, 44, 17, 0, 0, 3, 0, 0, 24,
+  36, 38, 6, 35, 0, 0, 67, 53, 19, 0,
+  40, 54, 0, 0, 0, 0, 68, 0, 53, 8,
+  0, 0, 28, 2, 0, 0, 37, 25, 0, 67,
+  27, 0, 0, 2, 0, 53, 88, 0, 20, 0,
+  26, 0, 0, 0, 0, 27, 0, 0, 0, 0,
+  0, 0, 0, 14, 53, 0, 37, 17, 61, 42,
+  0, 74, 24, 0, 64, 0, 4, 21, 0, 0,
+  6, 36, 25, 20, 74, 0, 0, 0, 24, 0,
+  0, 0, 0, 53, 38, 17, 0, 0, 21, 4,
+  62, 0, 41, 58, 0, 16, 0, 3, 0, 0,
+  0, 0, 0, 6, 0, 0, 35, 0, 53, 1,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 98, 1, 0,
+  0, 0, 70, 26, 1, 40, 0, 18, 8, 0,
+  0, 55, 20, 56, 0, 28, 0, 0, 9, 77,
+  37, 43, 56, 51, 165, 33, 18, 0, 85, 0,
+  49, 0, 0, 7, 13, 31, 0, 0, 65, 0,
+  42, 42, 0, 0, 0, 51, 14, 68, 75, 5,
+  23, 0, 0, 0, 0, 38, 0, 3, 1, 24,
+  0, 20, 44, 0, 0, 18, 0, 29, 38, 5,
+  30, 64, 3, 48, 31, 0, 73, 0, 0, 22,
+  0, 9, 14, 16, 72, 24, 54, 0, 0, 3,
+  10, 1, 31, 0, 4, 29, 0, 13, 27, 0,
+  87, 0, 38, 9, 40, 53, 46, 4, 16, 15,
+  5, 0, 5, 0, 11, 52, 56, 10, 49, 0,
+  36, 0, 7, 0, 21, 87, 0, 17, 0, 0,
+  7, 0, 27, 18, 0, 30, 39, 0, 0, 11,
+  9, 43, 15, 26, 0, 36, 93, 68, 12, 0,
+  68, 46, 209, 0, 0, 0, 54, 0, 48, 43,
+  0, 0, 65, 3, 0, 0, 39, 14, 18, 96,
+  0, 0, 0, 10, 0, 107, 61, 0, 69, 0,
+  19, 0, 17, 0, 20, 40, 0, 0, 35, 25,
+  0, 0, 0, 58, 134, 10, 46, 0, 8, 33,
+  3, 95, 34, 0, 24, 0, 8, 20, 0, 5,
+  21, 22, 59, 0, 30, 0, 0, 0, 54, 0,
+  27, 0, 10, 43, 26, 72, 29, 15, 69, 18,
+  47, 0, 13, 38, 8, 8, 0, 1, 0, 0,
+  3, 0, 8, 49, 53, 0, 0, 0, 36, 0,
+  0, 0, 121, 68, 0, 69, 37, 0, 10, 0,
+  13, 0, 0, 24, 109, 0, 0, 19, 14, 0,
+  23, 0, 0, 116, 51, 34, 64, 0, 36, 36,
+  222, 0, 6, 97, 40, 17, 23, 41, 0, 0,
+  124, 6, 0, 0, 30, 56, 59, 90, 15, 0,
+  0, 12, 0, 135, 15, 0, 103, 17, 27, 22,
+  53, 0, 58, 43, 30, 87, 0, 83, 14, 0,
+  21, 25, 137, 20, 29, 0, 0, 0, 51, 86,
+  41, 0, 7, 0, 17, 24, 0, 13, 21, 0,
+  55, 9, 0, 0, 0, 0, 22, 16, 63, 0,
+  40, 42, 4, 62, 32, 21, 74, 29, 0, 42,
+  54, 0, 12, 14, 0, 0, 0, 27, 4, 0,
+  11, 38, 71, 25, 0, 34, 62, 0, 9, 24,
+  0, 93, 5, 24, 14, 0, 37, 16, 19, 24,
+  15, 1, 7, 0, 45, 74, 66, 43, 0, 20,
+  0, 0, 0, 49, 65, 69, 6, 62, 0, 1,
+  5, 0, 69, 27, 8, 0, 0, 8, 0, 34,
+  0, 35, 41, 0, 16, 0, 40, 0, 0, 56,
+  0, 37, 99, 45, 0, 4, 0, 17, 0, 45,
+  12, 0, 0, 33, 0, 12, 78, 0, 23, 0,
+  0, 0, 0, 6, 46, 35, 1, 18, 0, 2,
+  119, 0, 0, 1, 0, 16, 0, 27, 17, 29,
+  59, 0, 0, 26, 0, 8, 27, 0, 0, 42,
+  0, 0, 29, 0, 16, 0, 32, 10, 52, 56,
+  0, 0, 9, 11, 0, 0, 0, 0, 0, 0,
+  4, 23, 137, 0, 66, 0, 0, 0, 0, 115,
+  36, 17, 6, 0, 3, 0, 44, 17, 0, 0,
+  3, 0, 0, 24, 36, 38, 6, 35, 0, 0,
+  67, 53, 19, 0, 40, 54, 0, 0, 0, 0,
+  68, 0, 53, 8, 0, 0, 28, 2, 0, 0,
+  37, 25, 0, 67, 27, 0, 0, 2, 0, 53,
+  88, 0, 20, 0, 26, 0, 0, 0, 0, 27,
+  0, 0, 0, 0, 0, 0, 0, 14, 53, 0,
+  37, 17, 61, 42, 0, 74, 24, 0, 64, 0,
+  4, 21, 0, 0, 6, 36, 25, 20, 74, 0,
+  0, 0, 24, 0, 0, 0, 0, 53, 38, 17,
+  0, 0, 21, 4, 62, 0, 41, 58, 0, 16,
+  0, 3, 0, 0, 0, 0, 0, 6, 0, 0,
+  35, 0, 53, 1, 0, 0, 55, 68, 5, 59,
+  7, 0, 0, 0, 39, 0, 0, 18, 78, 0,
+  0, 0, 25, 2, 0, 0, 0, 34, 65, 19,
+  34, 0, 18, 36, 0, 0, 0, 6, 13, 0,
+  31, 16, 0, 0, 71, 0, 0, 16, 19, 37,
+  0, 40, 14, 0, 0, 0, 0, 107, 29, 0,
+  61, 0, 36, 0, 0, 0, 0, 19, 0, 10,
+  41, 34, 0, 0, 22, 0, 133, 0, 33, 13,
+  17, 0, 9, 54, 28, 7, 16, 0, 14, 15,
+  15, 0, 15, 0, 48, 0, 1, 0, 0, 0,
+  0, 0, 10, 0, 0, 40, 0, 1, 9, 0,
+  35, 68, 7, 20, 38, 3, 0, 13, 0, 0,
+  0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
+  53, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 21, 87,
+  0, 17, 0, 0, 7, 0, 27, 18, 0, 30,
+  39, 0, 0, 11, 9, 43, 15, 26, 0, 36,
+  93, 68, 12, 0, 68, 46, 209, 0, 0, 0,
+  54, 0, 48, 43, 0, 0, 65, 3, 0, 0,
+  39, 14, 18, 96, 0, 0, 0, 10, 0, 107,
+  61, 0, 69, 0, 19, 0, 17, 0, 20, 40,
+  0, 0, 35, 25, 0, 0, 0, 58, 134, 10,
+  46, 0, 8, 33, 3, 95, 34, 0, 24, 0,
+  8, 20, 0, 5, 21, 22, 59, 0, 30, 0,
+  0, 0, 54, 0, 27, 0, 10, 43, 26, 72,
+  29, 15, 69, 18, 47, 0, 13, 38, 8, 8,
+  0, 1, 0, 0, 3, 0, 8, 49, 53, 0,
+  0, 0, 36, 0, 0, 0, 121, 68, 0, 69,
+  37, 0, 10, 0, 13, 0, 0, 24, 109, 0,
+  0, 19, 14, 0, 23, 0, 0, 116, 51, 34,
+  64, 0, 36, 36, 222, 0, 6, 97, 40, 17,
+  23, 41, 0, 0, 124, 6, 0, 0, 30, 56,
+  59, 90, 15, 0, 0, 12, 0, 135, 15, 0,
+  103, 17, 27, 22, 53, 0, 58, 43, 30, 87,
+  0, 83, 14, 0, 21, 25, 137, 20, 29, 0,
+  0, 0, 51, 86, 41, 0, 7, 0, 17, 24,
+  0, 13, 21, 0, 55, 9, 0, 0, 0, 0,
+  22, 16, 63, 0, 40, 42, 4, 62, 32, 21,
+  74, 29, 0, 42, 54, 0, 12, 14, 0, 0,
+  0, 27, 4, 0, 11, 38, 71, 25, 0, 34,
+  62, 0, 9, 24, 66, 10, 0, 31, 29, 110,
+  12, 0, 20, 0, 0, 9, 85, 0, 0, 46,
+  16, 30, 0, 0, 33, 111, 0, 60, 48, 0,
+  3, 44, 255, 0, 0, 72, 42, 37, 17, 24,
+  0, 22, 96, 20, 32, 0, 17, 61, 85, 122,
+  14, 0, 0, 23, 0, 130, 26, 0, 91, 47,
+  26, 11, 67, 0, 34, 60, 32, 28, 0, 46,
+  0, 4, 12, 28, 143, 0, 41, 3, 0, 22,
+  11, 56, 20, 0, 23, 0, 1, 24, 0, 0,
+  19, 5, 50, 28, 0, 55, 8, 0, 61, 18,
+  20, 0, 39, 55, 9, 30, 21, 7, 86, 7,
+  1, 22, 0, 7, 0, 16, 0, 0, 0, 31,
+  20, 0, 35, 34, 69, 0, 0, 44, 59, 0,
+  6, 4, 0, 115, 36, 17, 6, 0, 3, 0,
+  44, 17, 0, 0, 3, 0, 0, 24, 36, 38,
+  6, 35, 0, 0, 67, 53, 19, 0, 40, 54,
+  0, 0, 0, 0, 68, 0, 53, 8, 0, 0,
+  28, 2, 0, 0, 37, 25, 0, 67, 27, 0,
+  0, 2, 0, 53, 88, 0, 20, 0, 26, 0,
+  0, 0, 0, 27, 0, 0, 0, 0, 0, 0,
+  0, 14, 53, 0, 37, 17, 61, 42, 0, 74,
+  24, 0, 64, 0, 4, 21, 0, 0, 6, 36,
+  25, 20, 74, 0, 0, 0, 24, 0, 0, 0,
+  0, 53, 38, 17, 0, 0, 21, 4, 62, 0,
+  41, 58, 0, 16, 0, 3, 0, 0, 0, 0,
+  0, 6, 0, 0, 35, 0, 53, 1, 0, 0,
+  55, 68, 5, 59, 7, 0, 0, 0, 39, 0,
+  0, 18, 78, 0, 0, 0, 25, 2, 0, 0,
+  0, 34, 65, 19, 34, 0, 18, 36, 0, 0,
+  0, 6, 13, 0, 31, 16, 0, 0, 71, 0,
+  0, 16, 19, 37, 0, 40, 14, 0, 0, 0,
+  0, 107, 29, 0, 61, 0, 36, 0, 0, 0,
+  0, 19, 0, 10, 41, 34, 0, 0, 22, 0,
+  133, 0, 33, 13, 17, 0, 9, 54, 28, 7,
+  16, 0, 14, 15, 15, 0, 15, 0, 48, 0,
+  1, 0, 0, 0, 0, 0, 10, 0, 0, 40,
+  0, 1, 9, 0, 35, 68, 7, 20, 38, 3,
+  0, 13, 0, 0, 0, 0, 0, 0, 0, 9,
+  0, 0, 0, 0, 53, 0, 0, 0, 104, 21,
+  0, 47, 20, 66, 0, 0, 53, 0, 0, 0,
+  116, 0, 0, 40, 62, 0, 2, 0, 11, 68,
+  0, 8, 23, 0, 0, 43, 3, 1, 13, 72,
+  0, 27, 24, 0, 0, 21, 96, 5, 13, 87,
+  14, 47, 59, 16, 0, 0, 0, 0, 0, 111,
+  0, 0, 107, 59, 25, 17, 19, 0, 0, 13,
+  9, 35, 0, 93, 0, 0, 13, 0, 155, 30,
+  22, 32, 0, 0, 34, 19, 0, 47, 0, 0,
+  15, 14, 42, 14, 8, 0, 73, 0, 0, 0,
+  0, 2, 0, 0, 31, 0, 21, 50, 0, 0,
+  5, 0, 30, 31, 0, 67, 22, 0, 17, 0,
+  0, 0, 0, 0, 0, 0, 0, 1, 0, 3,
+  0, 16, 53, 0, 3, 16, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  121, 68, 0, 69, 37, 0, 10, 0, 13, 0,
+  0, 24, 109, 0, 0, 19, 14, 0, 23, 0,
+  0, 116, 51, 34, 64, 0, 36, 36, 222, 0,
+  6, 97, 40, 17, 23, 41, 0, 0, 124, 6,
+  0, 0, 30, 56, 59, 90, 15, 0, 0, 12,
+  0, 135, 15, 0, 103, 17, 27, 22, 53, 0,
+  58, 43, 30, 87, 0, 83, 14, 0, 21, 25,
+  137, 20, 29, 0, 0, 0, 51, 86, 41, 0,
+  7, 0, 17, 24, 0, 13, 21, 0, 55, 9,
+  0, 0, 0, 0, 22, 16, 63, 0, 40, 42,
+  4, 62, 32, 21, 74, 29, 0, 42, 54, 0,
+  12, 14, 0, 0, 0, 27, 4, 0, 11, 38,
+  71, 25, 0, 34, 62, 0, 9, 24, 66, 10,
+  0, 31, 29, 110, 12, 0, 20, 0, 0, 9,
+  85, 0, 0, 46, 16, 30, 0, 0, 33, 111,
+  0, 60, 48, 0, 3, 44, 255, 0, 0, 72,
+  42, 37, 17, 24, 0, 22, 96, 20, 32, 0,
+  17, 61, 85, 122, 14, 0, 0, 23, 0, 130,
+  26, 0, 91, 47, 26, 11, 67, 0, 34, 60,
+  32, 28, 0, 46, 0, 4, 12, 28, 143, 0,
+  41, 3, 0, 22, 11, 56, 20, 0, 23, 0,
+  1, 24, 0, 0, 19, 5, 50, 28, 0, 55,
+  8, 0, 61, 18, 20, 0, 39, 55, 9, 30,
+  21, 7, 86, 7, 1, 22, 0, 7, 0, 16,
+  0, 0, 0, 31, 20, 0, 35, 34, 69, 0,
+  0, 44, 59, 0, 6, 4, 0, 38, 0, 0,
+  7, 72, 57, 6, 59, 17, 0, 6, 46, 16,
+  0, 163, 49, 58, 0, 0, 76, 0, 0, 90,
+  29, 28, 5, 40, 214, 33, 0, 0, 89, 29,
+  32, 0, 0, 53, 10, 75, 12, 0, 0, 45,
+  49, 87, 5, 9, 0, 73, 3, 65, 107, 1,
+  7, 49, 22, 23, 0, 54, 0, 5, 0, 32,
+  0, 1, 11, 0, 25, 0, 29, 0, 39, 11,
+  0, 97, 0, 37, 0, 1, 62, 0, 14, 26,
+  0, 4, 35, 12, 60, 53, 62, 78, 0, 3,
+  68, 5, 0, 0, 50, 64, 14, 0, 0, 0,
+  76, 0, 29, 16, 1, 58, 17, 0, 0, 22,
+  0, 0, 0, 12, 39, 12, 66, 4, 74, 0,
+  59, 0, 32, 0, 55, 68, 5, 59, 7, 0,
+  0, 0, 39, 0, 0, 18, 78, 0, 0, 0,
+  25, 2, 0, 0, 0, 34, 65, 19, 34, 0,
+  18, 36, 0, 0, 0, 6, 13, 0, 31, 16,
+  0, 0, 71, 0, 0, 16, 19, 37, 0, 40,
+  14, 0, 0, 0, 0, 107, 29, 0, 61, 0,
+  36, 0, 0, 0, 0, 19, 0, 10, 41, 34,
+  0, 0, 22, 0, 133, 0, 33, 13, 17, 0,
+  9, 54, 28, 7, 16, 0, 14, 15, 15, 0,
+  15, 0, 48, 0, 1, 0, 0, 0, 0, 0,
+  10, 0, 0, 40, 0, 1, 9, 0, 35, 68,
+  7, 20, 38, 3, 0, 13, 0, 0, 0, 0,
+  0, 0, 0, 9, 0, 0, 0, 0, 53, 0,
+  0, 0, 104, 21, 0, 47, 20, 66, 0, 0,
+  53, 0, 0, 0, 116, 0, 0, 40, 62, 0,
+  2, 0, 11, 68, 0, 8, 23, 0, 0, 43,
+  3, 1, 13, 72, 0, 27, 24, 0, 0, 21,
+  96, 5, 13, 87, 14, 47, 59, 16, 0, 0,
+  0, 0, 0, 111, 0, 0, 107, 59, 25, 17,
+  19, 0, 0, 13, 9, 35, 0, 93, 0, 0,
+  13, 0, 155, 30, 22, 32, 0, 0, 34, 19,
+  0, 47, 0, 0, 15, 14, 42, 14, 8, 0,
+  73, 0, 0, 0, 0, 2, 0, 0, 31, 0,
+  21, 50, 0, 0, 5, 0, 30, 31, 0, 67,
+  22, 0, 17, 0, 0, 0, 0, 0, 0, 0,
+  0, 1, 0, 3, 0, 16, 53, 0, 3, 16,
+  0, 0, 0, 0, 0, 145, 0, 0, 46, 0,
+  0, 0, 34, 21, 0, 109, 67, 48, 0, 0,
+  39, 1, 0, 58, 0, 0, 0, 56, 1, 0,
+  0, 0, 49, 0, 0, 0, 22, 71, 0, 0,
+  22, 0, 0, 3, 13, 87, 0, 0, 0, 14,
+  12, 53, 23, 0, 62, 19, 29, 0, 0, 0,
+  0, 48, 0, 0, 12, 0, 16, 0, 17, 13,
+  58, 0, 50, 76, 0, 66, 0, 52, 0, 0,
+  8, 0, 17, 64, 0, 25, 19, 0, 22, 2,
+  35, 128, 0, 0, 75, 0, 0, 0, 0, 93,
+  86, 0, 0, 0, 15, 0, 0, 38, 0, 19,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 13, 0, 4, 15, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 66, 10, 0, 31, 29, 110, 12, 0,
+  20, 0, 0, 9, 85, 0, 0, 46, 16, 30,
+  0, 0, 33, 111, 0, 60, 48, 0, 3, 44,
+  255, 0, 0, 72, 42, 37, 17, 24, 0, 22,
+  96, 20, 32, 0, 17, 61, 85, 122, 14, 0,
+  0, 23, 0, 130, 26, 0, 91, 47, 26, 11,
+  67, 0, 34, 60, 32, 28, 0, 46, 0, 4,
+  12, 28, 143, 0, 41, 3, 0, 22, 11, 56,
+  20, 0, 23, 0, 1, 24, 0, 0, 19, 5,
+  50, 28, 0, 55, 8, 0, 61, 18, 20, 0,
+  39, 55, 9, 30, 21, 7, 86, 7, 1, 22,
+  0, 7, 0, 16, 0, 0, 0, 31, 20, 0,
+  35, 34, 69, 0, 0, 44, 59, 0, 6, 4,
+  0, 38, 0, 0, 7, 72, 57, 6, 59, 17,
+  0, 6, 46, 16, 0, 163, 49, 58, 0, 0,
+  76, 0, 0, 90, 29, 28, 5, 40, 214, 33,
+  0, 0, 89, 29, 32, 0, 0, 53, 10, 75,
+  12, 0, 0, 45, 49, 87, 5, 9, 0, 73,
+  3, 65, 107, 1, 7, 49, 22, 23, 0, 54,
+  0, 5, 0, 32, 0, 1, 11, 0, 25, 0,
+  29, 0, 39, 11, 0, 97, 0, 37, 0, 1,
+  62, 0, 14, 26, 0, 4, 35, 12, 60, 53,
+  62, 78, 0, 3, 68, 5, 0, 0, 50, 64,
+  14, 0, 0, 0, 76, 0, 29, 16, 1, 58,
+  17, 0, 0, 22, 0, 0, 0, 12, 39, 12,
+  66, 4, 74, 0, 59, 0, 32, 0, 0, 58,
+  63, 0, 7, 0, 21, 41, 98, 32, 26, 34,
+  16, 64, 0, 150, 62, 63, 48, 14, 52, 0,
+  0, 72, 12, 0, 54, 79, 175, 35, 0, 0,
+  104, 0, 8, 0, 3, 53, 0, 34, 0, 0,
+  0, 32, 8, 71, 0, 0, 0, 50, 34, 80,
+  101, 18, 30, 0, 24, 14, 0, 49, 0, 0,
+  0, 16, 0, 0, 47, 0, 11, 29, 0, 0,
+  63, 28, 0, 75, 0, 60, 0, 1, 62, 4,
+  40, 45, 0, 23, 18, 40, 92, 24, 106, 1,
+  0, 0, 68, 0, 17, 0, 31, 98, 42, 0,
+  7, 0, 83, 0, 3, 51, 27, 30, 31, 0,
+  16, 5, 20, 0, 0, 18, 0, 32, 51, 0,
+  76, 0, 65, 0, 38, 22, 104, 21, 0, 47,
+  20, 66, 0, 0, 53, 0, 0, 0, 116, 0,
+  0, 40, 62, 0, 2, 0, 11, 68, 0, 8,
+  23, 0, 0, 43, 3, 1, 13, 72, 0, 27,
+  24, 0, 0, 21, 96, 5, 13, 87, 14, 47,
+  59, 16, 0, 0, 0, 0, 0, 111, 0, 0,
+  107, 59, 25, 17, 19, 0, 0, 13, 9, 35,
+  0, 93, 0, 0, 13, 0, 155, 30, 22, 32,
+  0, 0, 34, 19, 0, 47, 0, 0, 15, 14,
+  42, 14, 8, 0, 73, 0, 0, 0, 0, 2,
+  0, 0, 31, 0, 21, 50, 0, 0, 5, 0,
+  30, 31, 0, 67, 22, 0, 17, 0, 0, 0,
+  0, 0, 0, 0, 0, 1, 0, 3, 0, 16,
+  53, 0, 3, 16, 0, 0, 0, 0, 0, 145,
+  0, 0, 46, 0, 0, 0, 34, 21, 0, 109,
+  67, 48, 0, 0, 39, 1, 0, 58, 0, 0,
+  0, 56, 1, 0, 0, 0, 49, 0, 0, 0,
+  22, 71, 0, 0, 22, 0, 0, 3, 13, 87,
+  0, 0, 0, 14, 12, 53, 23, 0, 62, 19,
+  29, 0, 0, 0, 0, 48, 0, 0, 12, 0,
+  16, 0, 17, 13, 58, 0, 50, 76, 0, 66,
+  0, 52, 0, 0, 8, 0, 17, 64, 0, 25,
+  19, 0, 22, 2, 35, 128, 0, 0, 75, 0,
+  0, 0, 0, 93, 86, 0, 0, 0, 15, 0,
+  0, 38, 0, 19, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 13, 0,
+  4, 15, 0, 0, 92, 0, 0, 76, 0, 0,
+  44, 0, 0, 15, 13, 93, 0, 13, 41, 74,
+  27, 0, 22, 35, 4, 32, 0, 0, 0, 34,
+  0, 0, 18, 4, 5, 0, 0, 0, 14, 65,
+  0, 0, 0, 14, 0, 0, 0, 18, 0, 0,
+  0, 0, 19, 112, 26, 0, 66, 0, 49, 0,
+  1, 0, 0, 12, 0, 0, 37, 7, 27, 10,
+  26, 96, 0, 0, 36, 15, 0, 30, 0, 21,
+  0, 0, 0, 0, 33, 83, 0, 28, 14, 34,
+  42, 0, 16, 32, 0, 0, 39, 0, 0, 0,
+  13, 107, 45, 0, 0, 0, 3, 18, 0, 20,
+  0, 5, 17, 0, 0, 0, 49, 0, 46, 44,
+  22, 4, 0, 0, 0, 0, 20, 0, 0, 18,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 38, 0, 0, 7, 72,
+  57, 6, 59, 17, 0, 6, 46, 16, 0, 163,
+  49, 58, 0, 0, 76, 0, 0, 90, 29, 28,
+  5, 40, 214, 33, 0, 0, 89, 29, 32, 0,
+  0, 53, 10, 75, 12, 0, 0, 45, 49, 87,
+  5, 9, 0, 73, 3, 65, 107, 1, 7, 49,
+  22, 23, 0, 54, 0, 5, 0, 32, 0, 1,
+  11, 0, 25, 0, 29, 0, 39, 11, 0, 97,
+  0, 37, 0, 1, 62, 0, 14, 26, 0, 4,
+  35, 12, 60, 53, 62, 78, 0, 3, 68, 5,
+  0, 0, 50, 64, 14, 0, 0, 0, 76, 0,
+  29, 16, 1, 58, 17, 0, 0, 22, 0, 0,
+  0, 12, 39, 12, 66, 4, 74, 0, 59, 0,
+  32, 0, 0, 58, 63, 0, 7, 0, 21, 41,
+  98, 32, 26, 34, 16, 64, 0, 150, 62, 63,
+  48, 14, 52, 0, 0, 72, 12, 0, 54, 79,
+  175, 35, 0, 0, 104, 0, 8, 0, 3, 53,
+  0, 34, 0, 0, 0, 32, 8, 71, 0, 0,
+  0, 50, 34, 80, 101, 18, 30, 0, 24, 14,
+  0, 49, 0, 0, 0, 16, 0, 0, 47, 0,
+  11, 29, 0, 0, 63, 28, 0, 75, 0, 60,
+  0, 1, 62, 4, 40, 45, 0, 23, 18, 40,
+  92, 24, 106, 1, 0, 0, 68, 0, 17, 0,
+  31, 98, 42, 0, 7, 0, 83, 0, 3, 51,
+  27, 30, 31, 0, 16, 5, 20, 0, 0, 18,
+  0, 32, 51, 0, 76, 0, 65, 0, 38, 22,
+  50, 21, 117, 0, 0, 33, 0, 34, 48, 0,
+  0, 21, 0, 97, 0, 11, 24, 76, 56, 29,
+  7, 79, 14, 26, 0, 0, 21, 72, 178, 23,
+  2, 77, 15, 0, 0, 17, 0, 58, 0, 0,
+  0, 0, 23, 6, 0, 52, 0, 0, 0, 0,
+  17, 138, 16, 0, 76, 0, 43, 0, 26, 0,
+  0, 0, 10, 14, 41, 10, 2, 8, 11, 125,
+  0, 0, 81, 0, 0, 29, 11, 26, 12, 0,
+  0, 0, 1, 82, 0, 0, 46, 37, 66, 0,
+  39, 0, 0, 0, 91, 0, 6, 0, 15, 66,
+  24, 0, 23, 6, 85, 90, 0, 23, 0, 0,
+  42, 20, 11, 6, 52, 0, 44, 28, 0, 49,
+  48, 0, 0, 0, 21, 0, 24, 28, 0, 0,
+  0, 0, 0, 145, 0, 0, 46, 0, 0, 0,
+  34, 21, 0, 109, 67, 48, 0, 0, 39, 1,
+  0, 58, 0, 0, 0, 56, 1, 0, 0, 0,
+  49, 0, 0, 0, 22, 71, 0, 0, 22, 0,
+  0, 3, 13, 87, 0, 0, 0, 14, 12, 53,
+  23, 0, 62, 19, 29, 0, 0, 0, 0, 48,
+  0, 0, 12, 0, 16, 0, 17, 13, 58, 0,
+  50, 76, 0, 66, 0, 52, 0, 0, 8, 0,
+  17, 64, 0, 25, 19, 0, 22, 2, 35, 128,
+  0, 0, 75, 0, 0, 0, 0, 93, 86, 0,
+  0, 0, 15, 0, 0, 38, 0, 19, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 13, 0, 4, 15, 0, 0, 92, 0,
+  0, 76, 0, 0, 44, 0, 0, 15, 13, 93,
+  0, 13, 41, 74, 27, 0, 22, 35, 4, 32,
+  0, 0, 0, 34, 0, 0, 18, 4, 5, 0,
+  0, 0, 14, 65, 0, 0, 0, 14, 0, 0,
+  0, 18, 0, 0, 0, 0, 19, 112, 26, 0,
+  66, 0, 49, 0, 1, 0, 0, 12, 0, 0,
+  37, 7, 27, 10, 26, 96, 0, 0, 36, 15,
+  0, 30, 0, 21, 0, 0, 0, 0, 33, 83,
+  0, 28, 14, 34, 42, 0, 16, 32, 0, 0,
+  39, 0, 0, 0, 13, 107, 45, 0, 0, 0,
+  3, 18, 0, 20, 0, 5, 17, 0, 0, 0,
+  49, 0, 46, 44, 22, 4, 0, 0, 0, 0,
+  20, 0, 0, 18, 0, 0, 91, 0, 0, 56,
+  0, 0, 0, 0, 0, 21, 6, 68, 0, 0,
+  3, 66, 22, 26, 0, 44, 1, 12, 25, 0,
+  0, 0, 0, 0, 35, 19, 0, 0, 0, 0,
+  0, 41, 0, 0, 0, 9, 0, 13, 0, 4,
+  17, 0, 0, 0, 11, 90, 12, 0, 37, 0,
+  34, 0, 44, 0, 0, 20, 0, 0, 71, 0,
+  0, 58, 0, 66, 0, 22, 34, 0, 4, 12,
+  0, 0, 14, 0, 0, 0, 11, 67, 48, 0,
+  47, 25, 46, 0, 0, 0, 0, 0, 2, 0,
+  0, 5, 16, 47, 0, 0, 0, 1, 0, 93,
+  0, 9, 0, 23, 27, 12, 0, 4, 70, 6,
+  57, 62, 45, 37, 28, 1, 0, 0, 18, 8,
+  3, 27, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 58, 63, 0,
+  7, 0, 21, 41, 98, 32, 26, 34, 16, 64,
+  0, 150, 62, 63, 48, 14, 52, 0, 0, 72,
+  12, 0, 54, 79, 175, 35, 0, 0, 104, 0,
+  8, 0, 3, 53, 0, 34, 0, 0, 0, 32,
+  8, 71, 0, 0, 0, 50, 34, 80, 101, 18,
+  30, 0, 24, 14, 0, 49, 0, 0, 0, 16,
+  0, 0, 47, 0, 11, 29, 0, 0, 63, 28,
+  0, 75, 0, 60, 0, 1, 62, 4, 40, 45,
+  0, 23, 18, 40, 92, 24, 106, 1, 0, 0,
+  68, 0, 17, 0, 31, 98, 42, 0, 7, 0,
+  83, 0, 3, 51, 27, 30, 31, 0, 16, 5,
+  20, 0, 0, 18, 0, 32, 51, 0, 76, 0,
+  65, 0, 38, 22, 50, 21, 117, 0, 0, 33,
+  0, 34, 48, 0, 0, 21, 0, 97, 0, 11,
+  24, 76, 56, 29, 7, 79, 14, 26, 0, 0,
+  21, 72, 178, 23, 2, 77, 15, 0, 0, 17,
+  0, 58, 0, 0, 0, 0, 23, 6, 0, 52,
+  0, 0, 0, 0, 17, 138, 16, 0, 76, 0,
+  43, 0, 26, 0, 0, 0, 10, 14, 41, 10,
+  2, 8, 11, 125, 0, 0, 81, 0, 0, 29,
+  11, 26, 12, 0, 0, 0, 1, 82, 0, 0,
+  46, 37, 66, 0, 39, 0, 0, 0, 91, 0,
+  6, 0, 15, 66, 24, 0, 23, 6, 85, 90,
+  0, 23, 0, 0, 42, 20, 11, 6, 52, 0,
+  44, 28, 0, 49, 48, 0, 0, 0, 21, 0,
+  24, 28, 37, 2, 61, 0, 0, 73, 0, 0,
+  0, 0, 0, 0, 0, 114, 0, 0, 5, 58,
+  36, 11, 0, 72, 12, 49, 0, 0, 26, 41,
+  217, 0, 0, 48, 0, 41, 0, 0, 6, 3,
+  0, 0, 0, 0, 13, 0, 0, 63, 19, 55,
+  0, 0, 20, 92, 0, 0, 70, 0, 42, 0,
+  39, 0, 25, 1, 0, 0, 74, 12, 10, 4,
+  28, 139, 25, 13, 70, 0, 0, 6, 18, 0,
+  2, 4, 0, 0, 4, 80, 0, 0, 46, 48,
+  69, 0, 0, 0, 12, 0, 60, 0, 0, 0,
+  11, 29, 28, 90, 42, 8, 49, 129, 4, 0,
+  0, 1, 4, 23, 0, 0, 30, 66, 51, 23,
+  16, 39, 2, 0, 0, 0, 0, 0, 0, 44,
+  0, 0, 92, 0, 0, 76, 0, 0, 44, 0,
+  0, 15, 13, 93, 0, 13, 41, 74, 27, 0,
+  22, 35, 4, 32, 0, 0, 0, 34, 0, 0,
+  18, 4, 5, 0, 0, 0, 14, 65, 0, 0,
+  0, 14, 0, 0, 0, 18, 0, 0, 0, 0,
+  19, 112, 26, 0, 66, 0, 49, 0, 1, 0,
+  0, 12, 0, 0, 37, 7, 27, 10, 26, 96,
+  0, 0, 36, 15, 0, 30, 0, 21, 0, 0,
+  0, 0, 33, 83, 0, 28, 14, 34, 42, 0,
+  16, 32, 0, 0, 39, 0, 0, 0, 13, 107,
+  45, 0, 0, 0, 3, 18, 0, 20, 0, 5,
+  17, 0, 0, 0, 49, 0, 46, 44, 22, 4,
+  0, 0, 0, 0, 20, 0, 0, 18, 0, 0,
+  91, 0, 0, 56, 0, 0, 0, 0, 0, 21,
+  6, 68, 0, 0, 3, 66, 22, 26, 0, 44,
+  1, 12, 25, 0, 0, 0, 0, 0, 35, 19,
+  0, 0, 0, 0, 0, 41, 0, 0, 0, 9,
+  0, 13, 0, 4, 17, 0, 0, 0, 11, 90,
+  12, 0, 37, 0, 34, 0, 44, 0, 0, 20,
+  0, 0, 71, 0, 0, 58, 0, 66, 0, 22,
+  34, 0, 4, 12, 0, 0, 14, 0, 0, 0,
+  11, 67, 48, 0, 47, 25, 46, 0, 0, 0,
+  0, 0, 2, 0, 0, 5, 16, 47, 0, 0,
+  0, 1, 0, 93, 0, 9, 0, 23, 27, 12,
+  0, 4, 70, 6, 57, 62, 45, 37, 28, 1,
+  0, 0, 18, 8, 3, 27, 0, 16, 49, 0,
+  0, 5, 31, 0, 1, 0, 0, 6, 0, 41,
+  0, 0, 0, 25, 35, 4, 0, 0, 0, 52,
+  24, 0, 16, 5, 179, 11, 21, 0, 23, 0,
+  0, 0, 0, 11, 0, 43, 0, 24, 1, 8,
+  2, 65, 31, 0, 0, 0, 0, 37, 49, 0,
+  7, 0, 6, 0, 40, 14, 28, 28, 0, 0,
+  0, 18, 44, 18, 0, 7, 0, 39, 35, 0,
+  13, 18, 0, 0, 20, 0, 17, 2, 0, 51,
+  0, 0, 32, 30, 78, 35, 0, 0, 40, 0,
+  0, 22, 0, 0, 33, 23, 14, 18, 8, 0,
+  15, 74, 44, 16, 21, 36, 0, 12, 0, 0,
+  6, 34, 56, 40, 46, 34, 33, 8, 0, 0,
+  18, 0, 14, 30, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 50, 21,
+  117, 0, 0, 33, 0, 34, 48, 0, 0, 21,
+  0, 97, 0, 11, 24, 76, 56, 29, 7, 79,
+  14, 26, 0, 0, 21, 72, 178, 23, 2, 77,
+  15, 0, 0, 17, 0, 58, 0, 0, 0, 0,
+  23, 6, 0, 52, 0, 0, 0, 0, 17, 138,
+  16, 0, 76, 0, 43, 0, 26, 0, 0, 0,
+  10, 14, 41, 10, 2, 8, 11, 125, 0, 0,
+  81, 0, 0, 29, 11, 26, 12, 0, 0, 0,
+  1, 82, 0, 0, 46, 37, 66, 0, 39, 0,
+  0, 0, 91, 0, 6, 0, 15, 66, 24, 0,
+  23, 6, 85, 90, 0, 23, 0, 0, 42, 20,
+  11, 6, 52, 0, 44, 28, 0, 49, 48, 0,
+  0, 0, 21, 0, 24, 28, 37, 2, 61, 0,
+  0, 73, 0, 0, 0, 0, 0, 0, 0, 114,
+  0, 0, 5, 58, 36, 11, 0, 72, 12, 49,
+  0, 0, 26, 41, 217, 0, 0, 48, 0, 41,
+  0, 0, 6, 3, 0, 0, 0, 0, 13, 0,
+  0, 63, 19, 55, 0, 0, 20, 92, 0, 0,
+  70, 0, 42, 0, 39, 0, 25, 1, 0, 0,
+  74, 12, 10, 4, 28, 139, 25, 13, 70, 0,
+  0, 6, 18, 0, 2, 4, 0, 0, 4, 80,
+  0, 0, 46, 48, 69, 0, 0, 0, 12, 0,
+  60, 0, 0, 0, 11, 29, 28, 90, 42, 8,
+  49, 129, 4, 0, 0, 1, 4, 23, 0, 0,
+  30, 66, 51, 23, 16, 39, 2, 0, 0, 0,
+  0, 0, 0, 44, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 91, 0, 0, 56, 0, 0,
+  0, 0, 0, 21, 6, 68, 0, 0, 3, 66,
+  22, 26, 0, 44, 1, 12, 25, 0, 0, 0,
+  0, 0, 35, 19, 0, 0, 0, 0, 0, 41,
+  0, 0, 0, 9, 0, 13, 0, 4, 17, 0,
+  0, 0, 11, 90, 12, 0, 37, 0, 34, 0,
+  44, 0, 0, 20, 0, 0, 71, 0, 0, 58,
+  0, 66, 0, 22, 34, 0, 4, 12, 0, 0,
+  14, 0, 0, 0, 11, 67, 48, 0, 47, 25,
+  46, 0, 0, 0, 0, 0, 2, 0, 0, 5,
+  16, 47, 0, 0, 0, 1, 0, 93, 0, 9,
+  0, 23, 27, 12, 0, 4, 70, 6, 57, 62,
+  45, 37, 28, 1, 0, 0, 18, 8, 3, 27,
+  0, 16, 49, 0, 0, 5, 31, 0, 1, 0,
+  0, 6, 0, 41, 0, 0, 0, 25, 35, 4,
+  0, 0, 0, 52, 24, 0, 16, 5, 179, 11,
+  21, 0, 23, 0, 0, 0, 0, 11, 0, 43,
+  0, 24, 1, 8, 2, 65, 31, 0, 0, 0,
+  0, 37, 49, 0, 7, 0, 6, 0, 40, 14,
+  28, 28, 0, 0, 0, 18, 44, 18, 0, 7,
+  0, 39, 35, 0, 13, 18, 0, 0, 20, 0,
+  17, 2, 0, 51, 0, 0, 32, 30, 78, 35,
+  0, 0, 40, 0, 0, 22, 0, 0, 33, 23,
+  14, 18, 8, 0, 15, 74, 44, 16, 21, 36,
+  0, 12, 0, 0, 6, 34, 56, 40, 46, 34,
+  33, 8, 0, 0, 18, 0, 14, 30, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 39, 14, 0, 0, 0,
+  63, 31, 0, 36, 15, 0, 0, 12, 10, 93,
+  23, 78, 37, 39, 52, 0, 44, 62, 9, 23,
+  34, 48, 251, 53, 0, 0, 103, 0, 11, 0,
+  0, 19, 12, 43, 34, 0, 10, 7, 84, 61,
+  0, 22, 0, 69, 0, 28, 41, 0, 20, 0,
+  7, 14, 0, 3, 6, 7, 15, 0, 0, 16,
+  25, 16, 0, 28, 0, 14, 83, 9, 21, 62,
+  7, 4, 7, 0, 53, 0, 16, 0, 0, 1,
+  0, 4, 66, 24, 50, 9, 0, 0, 69, 27,
+  15, 2, 14, 33, 3, 0, 1, 18, 73, 0,
+  43, 0, 0, 6, 26, 16, 10, 44, 0, 0,
+  22, 18, 0, 41, 77, 0, 0, 0, 0, 0,
+  27, 20, 27, 77, 56, 1, 0, 0, 53, 33,
+  0, 26, 0, 19, 15, 40, 3, 80, 27, 70,
+  9, 40, 13, 19, 51, 56, 1, 0, 62, 39,
+  168, 33, 0, 2, 112, 0, 35, 0, 0, 8,
+  0, 15, 15, 0, 16, 4, 70, 57, 0, 21,
+  0, 58, 0, 81, 74, 0, 31, 0, 4, 0,
+  0, 0, 31, 0, 5, 36, 0, 9, 25, 0,
+  0, 65, 0, 19, 22, 10, 17, 20, 19, 22,
+  19, 0, 39, 0, 23, 18, 0, 9, 5, 21,
+  68, 17, 39, 0, 0, 0, 34, 0, 67, 16,
+  7, 35, 9, 16, 42, 18, 111, 0, 19, 7,
+  30, 4, 45, 33, 26, 6, 0, 0, 14, 0,
+  1, 30, 86, 0, 9, 0, 3, 0, 26, 19,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 12, 21,
+  64, 6, 0, 0, 17, 8, 0, 10, 24, 0,
+  0, 65, 0, 74, 92, 76, 35, 40, 22, 3,
+  39, 33, 0, 0, 31, 58, 156, 6, 15, 0,
+  58, 0, 0, 0, 0, 18, 0, 18, 5, 27,
+  0, 0, 53, 31, 0, 18, 0, 0, 0, 47,
+  40, 0, 10, 0, 0, 9, 0, 6, 28, 0,
+  0, 0, 0, 7, 44, 0, 48, 45, 0, 16,
+  17, 16, 28, 6, 22, 3, 0, 16, 38, 0,
+  14, 0, 0, 13, 0, 23, 45, 25, 8, 25,
+  0, 0, 67, 0, 51, 0, 0, 39, 3, 0,
+  27, 11, 67, 0, 18, 0, 0, 0, 20, 21,
+  9, 43, 3, 0, 12, 0, 0, 0, 64, 0,
+  5, 0, 0, 0, 55, 0, 56, 59, 50, 27,
+  4, 0, 2, 0, 0, 0, 8, 0, 48, 60,
+  4, 28, 76, 49, 0, 0, 0, 6, 1, 61,
+  24, 0, 35, 40, 0, 0, 13, 0, 67, 0,
+  0, 0, 0, 0, 0, 1, 0, 66, 2, 0,
+  30, 28, 26, 42, 0, 12, 0, 69, 96, 0,
+  23, 0, 0, 0, 0, 0, 51, 0, 0, 65,
+  0, 8, 82, 0, 40, 45, 0, 20, 0, 33,
+  32, 0, 14, 3, 0, 16, 42, 0, 37, 0,
+  0, 30, 0, 27, 36, 9, 13, 0, 0, 22,
+  2, 0, 70, 5, 0, 64, 0, 23, 40, 0,
+  76, 0, 6, 0, 58, 8, 17, 40, 5, 0,
+  26, 0, 1, 0, 0, 0, 39, 0, 71, 0,
+  10, 9, 14, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 47, 23, 86, 28, 0, 0, 29, 6,
+  18, 0, 12, 0, 0, 94, 0, 55, 94, 25,
+  14, 29, 7, 39, 13, 18, 25, 0, 29, 32,
+  164, 9, 5, 45, 79, 0, 0, 0, 0, 37,
+  0, 0, 0, 4, 0, 10, 7, 71, 53, 0,
+  0, 0, 0, 40, 22, 15, 17, 0, 13, 0,
+  0, 3, 39, 29, 0, 0, 0, 0, 72, 0,
+  119, 51, 0, 0, 21, 0, 24, 0, 65, 11,
+  0, 23, 14, 0, 42, 0, 0, 26, 0, 0,
+  59, 5, 0, 16, 0, 5, 15, 0, 38, 1,
+  14, 93, 25, 0, 14, 51, 54, 47, 12, 0,
+  25, 0, 4, 10, 0, 41, 10, 0, 18, 0,
+  17, 0, 59, 0, 0, 0, 0, 24, 48, 21,
+  43, 69, 0, 8, 5, 11, 0, 0, 0, 0,
+  0, 0, 16, 73, 0, 0, 82, 18, 0, 0,
+  0, 41, 0, 50, 15, 0, 5, 16, 0, 0,
+  0, 19, 83, 23, 0, 0, 0, 9, 0, 0,
+  0, 6, 0, 0, 9, 74, 35, 102, 0, 0,
+  0, 29, 56, 0, 22, 0, 18, 0, 0, 0,
+  78, 24, 0, 51, 0, 0, 97, 0, 107, 49,
+  0, 0, 4, 13, 45, 0, 27, 0, 0, 5,
+  25, 0, 35, 12, 0, 12, 0, 6, 0, 6,
+  0, 26, 0, 19, 1, 0, 34, 0, 12, 95,
+  20, 81, 35, 21, 44, 44, 10, 0, 51, 0,
+  0, 63, 0, 7, 0, 0, 0, 0, 11, 0,
+  22, 0, 33, 0, 0, 27, 27, 0, 0, 39,
+  14, 0, 0, 0, 63, 31, 0, 36, 15, 0,
+  0, 12, 10, 93, 23, 78, 37, 39, 52, 0,
+  44, 62, 9, 23, 34, 48, 251, 53, 0, 0,
+  103, 0, 11, 0, 0, 19, 12, 43, 34, 0,
+  10, 7, 84, 61, 0, 22, 0, 69, 0, 28,
+  41, 0, 20, 0, 7, 14, 0, 3, 6, 7,
+  15, 0, 0, 16, 25, 16, 0, 28, 0, 14,
+  83, 9, 21, 62, 7, 4, 7, 0, 53, 0,
+  16, 0, 0, 1, 0, 4, 66, 24, 50, 9,
+  0, 0, 69, 27, 15, 2, 14, 33, 3, 0,
+  1, 18, 73, 0, 43, 0, 0, 6, 26, 16,
+  10, 44, 0, 0, 22, 18, 0, 41, 77, 0,
+  0, 0, 0, 0, 27, 20, 27, 77, 56, 1,
+  0, 0, 53, 33, 0, 26, 0, 19, 15, 40,
+  3, 80, 27, 70, 9, 40, 13, 19, 51, 56,
+  1, 0, 62, 39, 168, 33, 0, 2, 112, 0,
+  35, 0, 0, 8, 0, 15, 15, 0, 16, 4,
+  70, 57, 0, 21, 0, 58, 0, 81, 74, 0,
+  31, 0, 4, 0, 0, 0, 31, 0, 5, 36,
+  0, 9, 25, 0, 0, 65, 0, 19, 22, 10,
+  17, 20, 19, 22, 19, 0, 39, 0, 23, 18,
+  0, 9, 5, 21, 68, 17, 39, 0, 0, 0,
+  34, 0, 67, 16, 7, 35, 9, 16, 42, 18,
+  111, 0, 19, 7, 30, 4, 45, 33, 26, 6,
+  0, 0, 14, 0, 1, 30, 86, 0, 9, 0,
+  3, 0, 26, 19, 51, 73, 59, 31, 0, 25,
+  25, 27, 1, 0, 0, 49, 62, 54, 0, 17,
+  9, 31, 5, 0, 0, 97, 24, 47, 40, 0,
+  67, 36, 173, 0, 0, 93, 100, 0, 16, 5,
+  0, 0, 0, 8, 0, 0, 58, 12, 35, 124,
+  53, 23, 0, 49, 0, 76, 26, 0, 69, 0,
+  16, 0, 0, 0, 74, 49, 11, 40, 2, 17,
+  33, 10, 4, 69, 21, 19, 13, 0, 5, 0,
+  39, 35, 1, 0, 24, 0, 46, 72, 0, 11,
+  18, 1, 41, 28, 0, 0, 0, 0, 0, 0,
+  56, 0, 0, 45, 33, 55, 30, 39, 114, 0,
+  28, 15, 40, 0, 15, 24, 15, 0, 0, 0,
+  36, 0, 25, 27, 59, 0, 0, 0, 16, 0,
+  11, 50, 12, 21, 64, 6, 0, 0, 17, 8,
+  0, 10, 24, 0, 0, 65, 0, 74, 92, 76,
+  35, 40, 22, 3, 39, 33, 0, 0, 31, 58,
+  156, 6, 15, 0, 58, 0, 0, 0, 0, 18,
+  0, 18, 5, 27, 0, 0, 53, 31, 0, 18,
+  0, 0, 0, 47, 40, 0, 10, 0, 0, 9,
+  0, 6, 28, 0, 0, 0, 0, 7, 44, 0,
+  48, 45, 0, 16, 17, 16, 28, 6, 22, 3,
+  0, 16, 38, 0, 14, 0, 0, 13, 0, 23,
+  45, 25, 8, 25, 0, 0, 67, 0, 51, 0,
+  0, 39, 3, 0, 27, 11, 67, 0, 18, 0,
+  0, 0, 20, 21, 9, 43, 3, 0, 12, 0,
+  0, 0, 64, 0, 5, 0, 0, 0, 55, 0,
+  56, 59, 50, 27, 4, 0, 2, 0, 0, 0,
+  8, 0, 48, 60, 4, 28, 76, 49, 0, 0,
+  0, 6, 1, 61, 24, 0, 35, 40, 0, 0,
+  13, 0, 67, 0, 0, 0, 0, 0, 0, 1,
+  0, 66, 2, 0, 30, 28, 26, 42, 0, 12,
+  0, 69, 96, 0, 23, 0, 0, 0, 0, 0,
+  51, 0, 0, 65, 0, 8, 82, 0, 40, 45,
+  0, 20, 0, 33, 32, 0, 14, 3, 0, 16,
+  42, 0, 37, 0, 0, 30, 0, 27, 36, 9,
+  13, 0, 0, 22, 2, 0, 70, 5, 0, 64,
+  0, 23, 40, 0, 76, 0, 6, 0, 58, 8,
+  17, 40, 5, 0, 26, 0, 1, 0, 0, 0,
+  39, 0, 71, 0, 10, 9, 14, 0, 2, 55,
+  59, 38, 4, 35, 16, 13, 17, 0, 0, 16,
+  84, 0, 0, 22, 51, 18, 0, 0, 0, 56,
+  0, 33, 67, 0, 5, 30, 0, 0, 0, 43,
+  70, 0, 18, 0, 0, 0, 0, 41, 0, 35,
+  57, 2, 29, 80, 44, 19, 0, 21, 0, 34,
+  36, 10, 35, 0, 10, 0, 0, 0, 30, 26,
+  0, 32, 0, 0, 35, 1, 27, 0, 0, 17,
+  9, 19, 26, 0, 10, 16, 0, 22, 23, 0,
+  61, 69, 0, 5, 0, 0, 0, 42, 5, 0,
+  0, 31, 0, 24, 35, 0, 0, 65, 2, 0,
+  10, 12, 63, 0, 37, 0, 27, 0, 0, 14,
+  0, 0, 0, 0, 0, 0, 0, 0, 4, 0,
+  41, 0, 35, 0, 8, 0, 47, 23, 86, 28,
+  0, 0, 29, 6, 18, 0, 12, 0, 0, 94,
+  0, 55, 94, 25, 14, 29, 7, 39, 13, 18,
+  25, 0, 29, 32, 164, 9, 5, 45, 79, 0,
+  0, 0, 0, 37, 0, 0, 0, 4, 0, 10,
+  7, 71, 53, 0, 0, 0, 0, 40, 22, 15,
+  17, 0, 13, 0, 0, 3, 39, 29, 0, 0,
+  0, 0, 72, 0, 119, 51, 0, 0, 21, 0,
+  24, 0, 65, 11, 0, 23, 14, 0, 42, 0,
+  0, 26, 0, 0, 59, 5, 0, 16, 0, 5,
+  15, 0, 38, 1, 14, 93, 25, 0, 14, 51,
+  54, 47, 12, 0, 25, 0, 4, 10, 0, 41,
+  10, 0, 18, 0, 17, 0, 59, 0, 0, 0,
+  0, 24, 48, 21, 43, 69, 0, 8, 5, 11,
+  0, 0, 0, 0, 0, 0, 16, 73, 0, 0,
+  82, 18, 0, 0, 0, 41, 0, 50, 15, 0,
+  5, 16, 0, 0, 0, 19, 83, 23, 0, 0,
+  0, 9, 0, 0, 0, 6, 0, 0, 9, 74,
+  35, 102, 0, 0, 0, 29, 56, 0, 22, 0,
+  18, 0, 0, 0, 78, 24, 0, 51, 0, 0,
+  97, 0, 107, 49, 0, 0, 4, 13, 45, 0,
+  27, 0, 0, 5, 25, 0, 35, 12, 0, 12,
+  0, 6, 0, 6, 0, 26, 0, 19, 1, 0,
+  34, 0, 12, 95, 20, 81, 35, 21, 44, 44,
+  10, 0, 51, 0, 0, 63, 0, 7, 0, 0,
+  0, 0, 11, 0, 22, 0, 33, 0, 0, 27,
+  27, 0, 0, 39, 39, 29, 0, 48, 7, 15,
+  23, 0, 0, 11, 81, 0, 0, 23, 58, 7,
+  0, 0, 0, 63, 0, 21, 41, 0, 0, 12,
+  0, 0, 0, 32, 67, 3, 1, 0, 0, 13,
+  0, 47, 0, 18, 41, 13, 22, 69, 25, 53,
+  0, 12, 0, 37, 21, 7, 22, 0, 22, 0,
+  0, 0, 16, 31, 0, 29, 0, 0, 7, 0,
+  37, 0, 18, 0, 9, 21, 4, 0, 5, 11,
+  0, 39, 27, 0, 62, 62, 0, 0, 0, 0,
+  0, 18, 1, 0, 0, 19, 0, 19, 32, 0,
+  0, 78, 11, 0, 0, 10, 15, 0, 33, 0,
+  0, 0, 0, 8, 0, 0, 0, 0, 7, 0,
+  0, 0, 0, 0, 38, 0, 39, 0, 9, 0,
+  27, 77, 56, 1, 0, 0, 53, 33, 0, 26,
+  0, 19, 15, 40, 3, 80, 27, 70, 9, 40,
+  13, 19, 51, 56, 1, 0, 62, 39, 168, 33,
+  0, 2, 112, 0, 35, 0, 0, 8, 0, 15,
+  15, 0, 16, 4, 70, 57, 0, 21, 0, 58,
+  0, 81, 74, 0, 31, 0, 4, 0, 0, 0,
+  31, 0, 5, 36, 0, 9, 25, 0, 0, 65,
+  0, 19, 22, 10, 17, 20, 19, 22, 19, 0,
+  39, 0, 23, 18, 0, 9, 5, 21, 68, 17,
+  39, 0, 0, 0, 34, 0, 67, 16, 7, 35,
+  9, 16, 42, 18, 111, 0, 19, 7, 30, 4,
+  45, 33, 26, 6, 0, 0, 14, 0, 1, 30,
+  86, 0, 9, 0, 3, 0, 26, 19, 51, 73,
+  59, 31, 0, 25, 25, 27, 1, 0, 0, 49,
+  62, 54, 0, 17, 9, 31, 5, 0, 0, 97,
+  24, 47, 40, 0, 67, 36, 173, 0, 0, 93,
+  100, 0, 16, 5, 0, 0, 0, 8, 0, 0,
+  58, 12, 35, 124, 53, 23, 0, 49, 0, 76,
+  26, 0, 69, 0, 16, 0, 0, 0, 74, 49,
+  11, 40, 2, 17, 33, 10, 4, 69, 21, 19,
+  13, 0, 5, 0, 39, 35, 1, 0, 24, 0,
+  46, 72, 0, 11, 18, 1, 41, 28, 0, 0,
+  0, 0, 0, 0, 56, 0, 0, 45, 33, 55,
+  30, 39, 114, 0, 28, 15, 40, 0, 15, 24,
+  15, 0, 0, 0, 36, 0, 25, 27, 59, 0,
+  0, 0, 16, 0, 11, 50, 1, 0, 0, 19,
+  11, 92, 28, 0, 0, 0, 0, 57, 41, 55,
+  0, 0, 0, 21, 17, 3, 0, 71, 14, 58,
+  40, 0, 38, 15, 173, 20, 0, 66, 63, 35,
+  0, 0, 0, 0, 0, 44, 0, 0, 10, 45,
+  6, 158, 67, 62, 0, 26, 0, 54, 50, 0,
+  21, 0, 34, 0, 34, 0, 70, 66, 0, 18,
+  13, 4, 36, 35, 62, 39, 52, 9, 43, 0,
+  28, 0, 37, 0, 0, 0, 49, 0, 22, 62,
+  0, 0, 39, 14, 21, 0, 0, 25, 16, 0,
+  24, 37, 0, 0, 11, 49, 15, 31, 12, 45,
+  82, 9, 31, 0, 0, 16, 0, 14, 0, 7,
+  0, 44, 106, 21, 47, 22, 46, 0, 0, 0,
+  16, 0, 13, 16, 56, 59, 50, 27, 4, 0,
+  2, 0, 0, 0, 8, 0, 48, 60, 4, 28,
+  76, 49, 0, 0, 0, 6, 1, 61, 24, 0,
+  35, 40, 0, 0, 13, 0, 67, 0, 0, 0,
+  0, 0, 0, 1, 0, 66, 2, 0, 30, 28,
+  26, 42, 0, 12, 0, 69, 96, 0, 23, 0,
+  0, 0, 0, 0, 51, 0, 0, 65, 0, 8,
+  82, 0, 40, 45, 0, 20, 0, 33, 32, 0,
+  14, 3, 0, 16, 42, 0, 37, 0, 0, 30,
+  0, 27, 36, 9, 13, 0, 0, 22, 2, 0,
+  70, 5, 0, 64, 0, 23, 40, 0, 76, 0,
+  6, 0, 58, 8, 17, 40, 5, 0, 26, 0,
+  1, 0, 0, 0, 39, 0, 71, 0, 10, 9,
+  14, 0, 2, 55, 59, 38, 4, 35, 16, 13,
+  17, 0, 0, 16, 84, 0, 0, 22, 51, 18,
+  0, 0, 0, 56, 0, 33, 67, 0, 5, 30,
+  0, 0, 0, 43, 70, 0, 18, 0, 0, 0,
+  0, 41, 0, 35, 57, 2, 29, 80, 44, 19,
+  0, 21, 0, 34, 36, 10, 35, 0, 10, 0,
+  0, 0, 30, 26, 0, 32, 0, 0, 35, 1,
+  27, 0, 0, 17, 9, 19, 26, 0, 10, 16,
+  0, 22, 23, 0, 61, 69, 0, 5, 0, 0,
+  0, 42, 5, 0, 0, 31, 0, 24, 35, 0,
+  0, 65, 2, 0, 10, 12, 63, 0, 37, 0,
+  27, 0, 0, 14, 0, 0, 0, 0, 0, 0,
+  0, 0, 4, 0, 41, 0, 35, 0, 8, 0,
+  0, 0, 0, 18, 14, 124, 8, 0, 7, 0,
+  0, 29, 52, 11, 0, 6, 15, 0, 0, 0,
+  0, 77, 2, 24, 40, 0, 0, 9, 0, 14,
+  0, 31, 15, 32, 0, 0, 0, 21, 0, 76,
+  0, 37, 0, 65, 12, 85, 61, 31, 0, 0,
+  0, 31, 31, 4, 2, 0, 40, 0, 18, 0,
+  23, 69, 0, 16, 12, 9, 0, 29, 58, 0,
+  39, 20, 11, 0, 25, 21, 19, 0, 0, 29,
+  42, 0, 16, 44, 15, 0, 11, 0, 0, 8,
+  0, 6, 0, 0, 4, 72, 0, 0, 0, 72,
+  0, 0, 4, 12, 57, 0, 27, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 77, 0, 47, 0,
+  6, 3, 0, 0, 55, 0, 22, 0, 43, 69,
+  0, 8, 5, 11, 0, 0, 0, 0, 0, 0,
+  16, 73, 0, 0, 82, 18, 0, 0, 0, 41,
+  0, 50, 15, 0, 5, 16, 0, 0, 0, 19,
+  83, 23, 0, 0, 0, 9, 0, 0, 0, 6,
+  0, 0, 9, 74, 35, 102, 0, 0, 0, 29,
+  56, 0, 22, 0, 18, 0, 0, 0, 78, 24,
+  0, 51, 0, 0, 97, 0, 107, 49, 0, 0,
+  4, 13, 45, 0, 27, 0, 0, 5, 25, 0,
+  35, 12, 0, 12, 0, 6, 0, 6, 0, 26,
+  0, 19, 1, 0, 34, 0, 12, 95, 20, 81,
+  35, 21, 44, 44, 10, 0, 51, 0, 0, 63,
+  0, 7, 0, 0, 0, 0, 11, 0, 22, 0,
+  33, 0, 0, 27, 27, 0, 0, 39, 39, 29,
+  0, 48, 7, 15, 23, 0, 0, 11, 81, 0,
+  0, 23, 58, 7, 0, 0, 0, 63, 0, 21,
+  41, 0, 0, 12, 0, 0, 0, 32, 67, 3,
+  1, 0, 0, 13, 0, 47, 0, 18, 41, 13,
+  22, 69, 25, 53, 0, 12, 0, 37, 21, 7,
+  22, 0, 22, 0, 0, 0, 16, 31, 0, 29,
+  0, 0, 7, 0, 37, 0, 18, 0, 9, 21,
+  4, 0, 5, 11, 0, 39, 27, 0, 62, 62,
+  0, 0, 0, 0, 0, 18, 1, 0, 0, 19,
+  0, 19, 32, 0, 0, 78, 11, 0, 0, 10,
+  15, 0, 33, 0, 0, 0, 0, 8, 0, 0,
+  0, 0, 7, 0, 0, 0, 0, 0, 38, 0,
+  39, 0, 9, 0, 0, 0, 0, 12, 0, 128,
+  4, 0, 24, 0, 0, 24, 44, 0, 0, 3,
+  15, 0, 0, 0, 17, 87, 14, 19, 11, 0,
+  0, 0, 0, 0, 0, 22, 19, 26, 0, 6,
+  0, 37, 0, 56, 0, 21, 0, 56, 0, 77,
+  54, 47, 0, 0, 0, 41, 15, 0, 2, 0,
+  67, 0, 29, 0, 3, 66, 0, 12, 54, 5,
+  0, 16, 73, 0, 77, 17, 14, 1, 0, 19,
+  20, 20, 0, 39, 27, 0, 45, 41, 10, 0,
+  5, 0, 0, 0, 0, 17, 0, 0, 0, 33,
+  0, 0, 7, 75, 14, 0, 0, 3, 5, 0,
+  19, 0, 0, 0, 0, 0, 0, 14, 0, 0,
+  93, 0, 37, 0, 0, 0, 0, 0, 36, 0,
+  0, 0, 51, 73, 59, 31, 0, 25, 25, 27,
+  1, 0, 0, 49, 62, 54, 0, 17, 9, 31,
+  5, 0, 0, 97, 24, 47, 40, 0, 67, 36,
+  173, 0, 0, 93, 100, 0, 16, 5, 0, 0,
+  0, 8, 0, 0, 58, 12, 35, 124, 53, 23,
+  0, 49, 0, 76, 26, 0, 69, 0, 16, 0,
+  0, 0, 74, 49, 11, 40, 2, 17, 33, 10,
+  4, 69, 21, 19, 13, 0, 5, 0, 39, 35,
+  1, 0, 24, 0, 46, 72, 0, 11, 18, 1,
+  41, 28, 0, 0, 0, 0, 0, 0, 56, 0,
+  0, 45, 33, 55, 30, 39, 114, 0, 28, 15,
+  40, 0, 15, 24, 15, 0, 0, 0, 36, 0,
+  25, 27, 59, 0, 0, 0, 16, 0, 11, 50,
+  1, 0, 0, 19, 11, 92, 28, 0, 0, 0,
+  0, 57, 41, 55, 0, 0, 0, 21, 17, 3,
+  0, 71, 14, 58, 40, 0, 38, 15, 173, 20,
+  0, 66, 63, 35, 0, 0, 0, 0, 0, 44,
+  0, 0, 10, 45, 6, 158, 67, 62, 0, 26,
+  0, 54, 50, 0, 21, 0, 34, 0, 34, 0,
+  70, 66, 0, 18, 13, 4, 36, 35, 62, 39,
+  52, 9, 43, 0, 28, 0, 37, 0, 0, 0,
+  49, 0, 22, 62, 0, 0, 39, 14, 21, 0,
+  0, 25, 16, 0, 24, 37, 0, 0, 11, 49,
+  15, 31, 12, 45, 82, 9, 31, 0, 0, 16,
+  0, 14, 0, 7, 0, 44, 106, 21, 47, 22,
+  46, 0, 0, 0, 16, 0, 13, 16, 0, 38,
+  0, 0, 45, 3, 47, 0, 0, 5, 2, 35,
+  43, 41, 0, 12, 6, 26, 23, 27, 41, 0,
+  0, 68, 18, 30, 36, 25, 149, 46, 0, 0,
+  61, 42, 0, 0, 0, 0, 0, 81, 0, 0,
+  0, 48, 15, 76, 31, 35, 0, 47, 0, 53,
+  104, 0, 0, 15, 21, 0, 0, 5, 36, 26,
+  0, 63, 0, 10, 50, 5, 36, 4, 6, 13,
+  12, 0, 42, 49, 0, 0, 30, 0, 84, 0,
+  8, 23, 8, 1, 28, 38, 67, 0, 15, 10,
+  39, 0, 22, 34, 0, 0, 46, 45, 0, 15,
+  23, 0, 43, 0, 19, 15, 9, 58, 9, 7,
+  0, 4, 0, 0, 41, 21, 33, 22, 54, 6,
+  20, 0, 41, 0, 6, 0, 2, 55, 59, 38,
+  4, 35, 16, 13, 17, 0, 0, 16, 84, 0,
+  0, 22, 51, 18, 0, 0, 0, 56, 0, 33,
+  67, 0, 5, 30, 0, 0, 0, 43, 70, 0,
+  18, 0, 0, 0, 0, 41, 0, 35, 57, 2,
+  29, 80, 44, 19, 0, 21, 0, 34, 36, 10,
+  35, 0, 10, 0, 0, 0, 30, 26, 0, 32,
+  0, 0, 35, 1, 27, 0, 0, 17, 9, 19,
+  26, 0, 10, 16, 0, 22, 23, 0, 61, 69,
+  0, 5, 0, 0, 0, 42, 5, 0, 0, 31,
+  0, 24, 35, 0, 0, 65, 2, 0, 10, 12,
+  63, 0, 37, 0, 27, 0, 0, 14, 0, 0,
+  0, 0, 0, 0, 0, 0, 4, 0, 41, 0,
+  35, 0, 8, 0, 0, 0, 0, 18, 14, 124,
+  8, 0, 7, 0, 0, 29, 52, 11, 0, 6,
+  15, 0, 0, 0, 0, 77, 2, 24, 40, 0,
+  0, 9, 0, 14, 0, 31, 15, 32, 0, 0,
+  0, 21, 0, 76, 0, 37, 0, 65, 12, 85,
+  61, 31, 0, 0, 0, 31, 31, 4, 2, 0,
+  40, 0, 18, 0, 23, 69, 0, 16, 12, 9,
+  0, 29, 58, 0, 39, 20, 11, 0, 25, 21,
+  19, 0, 0, 29, 42, 0, 16, 44, 15, 0,
+  11, 0, 0, 8, 0, 6, 0, 0, 4, 72,
+  0, 0, 0, 72, 0, 0, 4, 12, 57, 0,
+  27, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  77, 0, 47, 0, 6, 3, 0, 0, 55, 0,
+  22, 0, 0, 12, 0, 0, 34, 31, 37, 0,
+  16, 0, 1, 11, 52, 11, 10, 28, 23, 12,
+  0, 12, 51, 0, 0, 50, 24, 48, 0, 15,
+  0, 35, 0, 0, 38, 48, 0, 0, 0, 6,
+  0, 75, 0, 43, 0, 59, 29, 41, 15, 15,
+  0, 19, 0, 15, 107, 18, 0, 0, 17, 0,
+  0, 28, 25, 21, 0, 41, 0, 0, 45, 6,
+  26, 0, 0, 8, 0, 14, 33, 51, 4, 0,
+  0, 28, 84, 14, 0, 6, 19, 0, 12, 21,
+  18, 26, 0, 9, 9, 21, 0, 72, 0, 4,
+  31, 72, 0, 0, 2, 0, 39, 0, 26, 7,
+  9, 48, 0, 0, 0, 3, 0, 0, 39, 24,
+  41, 0, 37, 0, 84, 0, 64, 0, 13, 0,
+  0, 39, 39, 29, 0, 48, 7, 15, 23, 0,
+  0, 11, 81, 0, 0, 23, 58, 7, 0, 0,
+  0, 63, 0, 21, 41, 0, 0, 12, 0, 0,
+  0, 32, 67, 3, 1, 0, 0, 13, 0, 47,
+  0, 18, 41, 13, 22, 69, 25, 53, 0, 12,
+  0, 37, 21, 7, 22, 0, 22, 0, 0, 0,
+  16, 31, 0, 29, 0, 0, 7, 0, 37, 0,
+  18, 0, 9, 21, 4, 0, 5, 11, 0, 39,
+  27, 0, 62, 62, 0, 0, 0, 0, 0, 18,
+  1, 0, 0, 19, 0, 19, 32, 0, 0, 78,
+  11, 0, 0, 10, 15, 0, 33, 0, 0, 0,
+  0, 8, 0, 0, 0, 0, 7, 0, 0, 0,
+  0, 0, 38, 0, 39, 0, 9, 0, 0, 0,
+  0, 12, 0, 128, 4, 0, 24, 0, 0, 24,
+  44, 0, 0, 3, 15, 0, 0, 0, 17, 87,
+  14, 19, 11, 0, 0, 0, 0, 0, 0, 22,
+  19, 26, 0, 6, 0, 37, 0, 56, 0, 21,
+  0, 56, 0, 77, 54, 47, 0, 0, 0, 41,
+  15, 0, 2, 0, 67, 0, 29, 0, 3, 66,
+  0, 12, 54, 5, 0, 16, 73, 0, 77, 17,
+  14, 1, 0, 19, 20, 20, 0, 39, 27, 0,
+  45, 41, 10, 0, 5, 0, 0, 0, 0, 17,
+  0, 0, 0, 33, 0, 0, 7, 75, 14, 0,
+  0, 3, 5, 0, 19, 0, 0, 0, 0, 0,
+  0, 14, 0, 0, 93, 0, 37, 0, 0, 0,
+  0, 0, 36, 0, 0, 0, 0, 0, 0, 0,
+  0, 48, 47, 0, 22, 0, 0, 0, 38, 0,
+  10, 49, 31, 17, 0, 15, 62, 0, 0, 40,
+  0, 20, 12, 0, 0, 26, 0, 0, 64, 55,
+  8, 0, 0, 16, 0, 41, 0, 28, 0, 56,
+  0, 45, 21, 45, 0, 12, 2, 10, 93, 9,
+  0, 9, 48, 0, 0, 35, 16, 4, 0, 1,
+  0, 0, 17, 7, 42, 0, 2, 3, 0, 21,
+  13, 42, 3, 0, 0, 26, 69, 0, 18, 2,
+  18, 0, 12, 0, 9, 8, 0, 31, 0, 8,
+  5, 29, 0, 0, 36, 54, 18, 0, 0, 0,
+  1, 0, 24, 4, 0, 31, 0, 1, 0, 19,
+  0, 0, 51, 3, 32, 0, 21, 0, 83, 0,
+  35, 0, 4, 0, 1, 0, 0, 19, 11, 92,
+  28, 0, 0, 0, 0, 57, 41, 55, 0, 0,
+  0, 21, 17, 3, 0, 71, 14, 58, 40, 0,
+  38, 15, 173, 20, 0, 66, 63, 35, 0, 0,
+  0, 0, 0, 44, 0, 0, 10, 45, 6, 158,
+  67, 62, 0, 26, 0, 54, 50, 0, 21, 0,
+  34, 0, 34, 0, 70, 66, 0, 18, 13, 4,
+  36, 35, 62, 39, 52, 9, 43, 0, 28, 0,
+  37, 0, 0, 0, 49, 0, 22, 62, 0, 0,
+  39, 14, 21, 0, 0, 25, 16, 0, 24, 37,
+  0, 0, 11, 49, 15, 31, 12, 45, 82, 9,
+  31, 0, 0, 16, 0, 14, 0, 7, 0, 44,
+  106, 21, 47, 22, 46, 0, 0, 0, 16, 0,
+  13, 16, 0, 38, 0, 0, 45, 3, 47, 0,
+  0, 5, 2, 35, 43, 41, 0, 12, 6, 26,
+  23, 27, 41, 0, 0, 68, 18, 30, 36, 25,
+  149, 46, 0, 0, 61, 42, 0, 0, 0, 0,
+  0, 81, 0, 0, 0, 48, 15, 76, 31, 35,
+  0, 47, 0, 53, 104, 0, 0, 15, 21, 0,
+  0, 5, 36, 26, 0, 63, 0, 10, 50, 5,
+  36, 4, 6, 13, 12, 0, 42, 49, 0, 0,
+  30, 0, 84, 0, 8, 23, 8, 1, 28, 38,
+  67, 0, 15, 10, 39, 0, 22, 34, 0, 0,
+  46, 45, 0, 15, 23, 0, 43, 0, 19, 15,
+  9, 58, 9, 7, 0, 4, 0, 0, 41, 21,
+  33, 22, 54, 6, 20, 0, 41, 0, 6, 0,
+  0, 46, 0, 5, 8, 0, 87, 3, 13, 14,
+  0, 39, 38, 29, 17, 42, 21, 66, 26, 57,
+  83, 0, 35, 35, 10, 13, 59, 37, 156, 43,
+  0, 0, 97, 0, 28, 0, 0, 0, 0, 60,
+  0, 0, 0, 58, 6, 89, 17, 14, 0, 43,
+  0, 39, 81, 11, 0, 0, 23, 0, 0, 26,
+  0, 12, 14, 12, 0, 0, 12, 25, 19, 1,
+  23, 0, 31, 0, 56, 15, 12, 6, 36, 0,
+  63, 0, 17, 12, 2, 0, 24, 1, 58, 22,
+  24, 0, 0, 0, 11, 31, 0, 0, 72, 22,
+  0, 0, 23, 0, 40, 0, 15, 32, 13, 36,
+  18, 8, 0, 1, 0, 0, 17, 8, 16, 23,
+  55, 3, 28, 0, 23, 0, 16, 0, 0, 0,
+  0, 18, 14, 124, 8, 0, 7, 0, 0, 29,
+  52, 11, 0, 6, 15, 0, 0, 0, 0, 77,
+  2, 24, 40, 0, 0, 9, 0, 14, 0, 31,
+  15, 32, 0, 0, 0, 21, 0, 76, 0, 37,
+  0, 65, 12, 85, 61, 31, 0, 0, 0, 31,
+  31, 4, 2, 0, 40, 0, 18, 0, 23, 69,
+  0, 16, 12, 9, 0, 29, 58, 0, 39, 20,
+  11, 0, 25, 21, 19, 0, 0, 29, 42, 0,
+  16, 44, 15, 0, 11, 0, 0, 8, 0, 6,
+  0, 0, 4, 72, 0, 0, 0, 72, 0, 0,
+  4, 12, 57, 0, 27, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 77, 0, 47, 0, 6, 3,
+  0, 0, 55, 0, 22, 0, 0, 12, 0, 0,
+  34, 31, 37, 0, 16, 0, 1, 11, 52, 11,
+  10, 28, 23, 12, 0, 12, 51, 0, 0, 50,
+  24, 48, 0, 15, 0, 35, 0, 0, 38, 48,
+  0, 0, 0, 6, 0, 75, 0, 43, 0, 59,
+  29, 41, 15, 15, 0, 19, 0, 15, 107, 18,
+  0, 0, 17, 0, 0, 28, 25, 21, 0, 41,
+  0, 0, 45, 6, 26, 0, 0, 8, 0, 14,
+  33, 51, 4, 0, 0, 28, 84, 14, 0, 6,
+  19, 0, 12, 21, 18, 26, 0, 9, 9, 21,
+  0, 72, 0, 4, 31, 72, 0, 0, 2, 0,
+  39, 0, 26, 7, 9, 48, 0, 0, 0, 3,
+  0, 0, 39, 24, 41, 0, 37, 0, 84, 0,
+  64, 0, 13, 0, 0, 32, 0, 0, 20, 0,
+  56, 0, 35, 0, 0, 29, 28, 20, 52, 24,
+  39, 50, 3, 36, 95, 0, 10, 21, 21, 25,
+  9, 34, 0, 29, 0, 0, 63, 0, 10, 0,
+  0, 0, 0, 48, 0, 3, 0, 63, 16, 61,
+  5, 1, 0, 6, 0, 3, 79, 33, 0, 0,
+  18, 0, 0, 7, 0, 7, 0, 0, 0, 0,
+  32, 20, 20, 0, 0, 0, 0, 0, 62, 0,
+  13, 2, 0, 6, 67, 26, 0, 0, 6, 0,
+  7, 0, 11, 49, 18, 0, 0, 4, 0, 55,
+  0, 6, 64, 36, 0, 0, 3, 0, 34, 0,
+  22, 9, 31, 35, 0, 0, 0, 0, 0, 0,
+  14, 2, 12, 0, 45, 0, 77, 0, 41, 0,
+  26, 0, 0, 0, 0, 12, 0, 128, 4, 0,
+  24, 0, 0, 24, 44, 0, 0, 3, 15, 0,
+  0, 0, 17, 87, 14, 19, 11, 0, 0, 0,
+  0, 0, 0, 22, 19, 26, 0, 6, 0, 37,
+  0, 56, 0, 21, 0, 56, 0, 77, 54, 47,
+  0, 0, 0, 41, 15, 0, 2, 0, 67, 0,
+  29, 0, 3, 66, 0, 12, 54, 5, 0, 16,
+  73, 0, 77, 17, 14, 1, 0, 19, 20, 20,
+  0, 39, 27, 0, 45, 41, 10, 0, 5, 0,
+  0, 0, 0, 17, 0, 0, 0, 33, 0, 0,
+  7, 75, 14, 0, 0, 3, 5, 0, 19, 0,
+  0, 0, 0, 0, 0, 14, 0, 0, 93, 0,
+  37, 0, 0, 0, 0, 0, 36, 0, 0, 0,
+  0, 0, 0, 0, 0, 48, 47, 0, 22, 0,
+  0, 0, 38, 0, 10, 49, 31, 17, 0, 15,
+  62, 0, 0, 40, 0, 20, 12, 0, 0, 26,
+  0, 0, 64, 55, 8, 0, 0, 16, 0, 41,
+  0, 28, 0, 56, 0, 45, 21, 45, 0, 12,
+  2, 10, 93, 9, 0, 9, 48, 0, 0, 35,
+  16, 4, 0, 1, 0, 0, 17, 7, 42, 0,
+  2, 3, 0, 21, 13, 42, 3, 0, 0, 26,
+  69, 0, 18, 2, 18, 0, 12, 0, 9, 8,
+  0, 31, 0, 8, 5, 29, 0, 0, 36, 54,
+  18, 0, 0, 0, 1, 0, 24, 4, 0, 31,
+  0, 1, 0, 19, 0, 0, 51, 3, 32, 0,
+  21, 0, 83, 0, 35, 0, 4, 0, 0, 9,
+  0, 0, 15, 0, 57, 0, 37, 0, 0, 0,
+  30, 12, 51, 40, 45, 47, 0, 28, 101, 0,
+  0, 27, 0, 9, 25, 8, 0, 23, 0, 0,
+  52, 4, 22, 0, 0, 12, 0, 35, 0, 7,
+  0, 70, 5, 54, 4, 16, 0, 0, 13, 8,
+  68, 27, 0, 0, 28, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 23, 1, 27, 0, 0, 0,
+  0, 10, 48, 0, 7, 9, 0, 11, 57, 13,
+  9, 0, 13, 0, 0, 0, 22, 29, 9, 0,
+  0, 15, 0, 34, 0, 0, 59, 37, 0, 0,
+  0, 0, 12, 0, 17, 14, 11, 27, 0, 0,
+  0, 5, 0, 0, 24, 0, 14, 0, 27, 0,
+  77, 0, 21, 0, 13, 0, 0, 38, 0, 0,
+  45, 3, 47, 0, 0, 5, 2, 35, 43, 41,
+  0, 12, 6, 26, 23, 27, 41, 0, 0, 68,
+  18, 30, 36, 25, 149, 46, 0, 0, 61, 42,
+  0, 0, 0, 0, 0, 81, 0, 0, 0, 48,
+  15, 76, 31, 35, 0, 47, 0, 53, 104, 0,
+  0, 15, 21, 0, 0, 5, 36, 26, 0, 63,
+  0, 10, 50, 5, 36, 4, 6, 13, 12, 0,
+  42, 49, 0, 0, 30, 0, 84, 0, 8, 23,
+  8, 1, 28, 38, 67, 0, 15, 10, 39, 0,
+  22, 34, 0, 0, 46, 45, 0, 15, 23, 0,
+  43, 0, 19, 15, 9, 58, 9, 7, 0, 4,
+  0, 0, 41, 21, 33, 22, 54, 6, 20, 0,
+  41, 0, 6, 0, 0, 46, 0, 5, 8, 0,
+  87, 3, 13, 14, 0, 39, 38, 29, 17, 42,
+  21, 66, 26, 57, 83, 0, 35, 35, 10, 13,
+  59, 37, 156, 43, 0, 0, 97, 0, 28, 0,
+  0, 0, 0, 60, 0, 0, 0, 58, 6, 89,
+  17, 14, 0, 43, 0, 39, 81, 11, 0, 0,
+  23, 0, 0, 26, 0, 12, 14, 12, 0, 0,
+  12, 25, 19, 1, 23, 0, 31, 0, 56, 15,
+  12, 6, 36, 0, 63, 0, 17, 12, 2, 0,
+  24, 1, 58, 22, 24, 0, 0, 0, 11, 31,
+  0, 0, 72, 22, 0, 0, 23, 0, 40, 0,
+  15, 32, 13, 36, 18, 8, 0, 1, 0, 0,
+  17, 8, 16, 23, 55, 3, 28, 0, 23, 0,
+  16, 0, 0, 26, 0, 19, 10, 0, 77, 11,
+  23, 31, 0, 35, 23, 57, 9, 52, 22, 74,
+  37, 27, 102, 0, 0, 31, 15, 13, 55, 46,
+  154, 59, 0, 4, 97, 0, 27, 0, 0, 0,
+  0, 55, 0, 0, 0, 52, 12, 66, 15, 9,
+  0, 41, 0, 76, 57, 46, 4, 14, 7, 0,
+  0, 16, 0, 0, 24, 8, 0, 8, 10, 17,
+  12, 30, 0, 0, 27, 0, 37, 13, 12, 0,
+  23, 0, 76, 0, 17, 2, 0, 0, 21, 18,
+  71, 15, 30, 0, 0, 0, 29, 12, 20, 0,
+  83, 41, 0, 0, 20, 0, 63, 0, 2, 35,
+  27, 25, 17, 5, 25, 0, 6, 0, 30, 0,
+  13, 13, 58, 0, 47, 0, 29, 0, 20, 0,
+  0, 12, 0, 0, 34, 31, 37, 0, 16, 0,
+  1, 11, 52, 11, 10, 28, 23, 12, 0, 12,
+  51, 0, 0, 50, 24, 48, 0, 15, 0, 35,
+  0, 0, 38, 48, 0, 0, 0, 6, 0, 75,
+  0, 43, 0, 59, 29, 41, 15, 15, 0, 19,
+  0, 15, 107, 18, 0, 0, 17, 0, 0, 28,
+  25, 21, 0, 41, 0, 0, 45, 6, 26, 0,
+  0, 8, 0, 14, 33, 51, 4, 0, 0, 28,
+  84, 14, 0, 6, 19, 0, 12, 21, 18, 26,
+  0, 9, 9, 21, 0, 72, 0, 4, 31, 72,
+  0, 0, 2, 0, 39, 0, 26, 7, 9, 48,
+  0, 0, 0, 3, 0, 0, 39, 24, 41, 0,
+  37, 0, 84, 0, 64, 0, 13, 0, 0, 32,
+  0, 0, 20, 0, 56, 0, 35, 0, 0, 29,
+  28, 20, 52, 24, 39, 50, 3, 36, 95, 0,
+  10, 21, 21, 25, 9, 34, 0, 29, 0, 0,
+  63, 0, 10, 0, 0, 0, 0, 48, 0, 3,
+  0, 63, 16, 61, 5, 1, 0, 6, 0, 3,
+  79, 33, 0, 0, 18, 0, 0, 7, 0, 7,
+  0, 0, 0, 0, 32, 20, 20, 0, 0, 0,
+  0, 0, 62, 0, 13, 2, 0, 6, 67, 26,
+  0, 0, 6, 0, 7, 0, 11, 49, 18, 0,
+  0, 4, 0, 55, 0, 6, 64, 36, 0, 0,
+  3, 0, 34, 0, 22, 9, 31, 35, 0, 0,
+  0, 0, 0, 0, 14, 2, 12, 0, 45, 0,
+  77, 0, 41, 0, 26, 0, 0, 27, 0, 15,
+  17, 0, 54, 0, 26, 19, 0, 24, 19, 41,
+  54, 36, 42, 53, 0, 29, 105, 0, 0, 24,
+  36, 35, 13, 47, 0, 36, 0, 0, 67, 9,
+  22, 0, 0, 0, 0, 30, 0, 0, 0, 58,
+  16, 44, 12, 18, 0, 3, 21, 11, 61, 51,
+  0, 0, 3, 0, 0, 16, 0, 0, 0, 0,
+  0, 0, 38, 18, 25, 0, 0, 0, 0, 0,
+  56, 0, 14, 7, 0, 10, 79, 42, 2, 0,
+  11, 0, 6, 6, 16, 33, 14, 0, 0, 12,
+  0, 42, 0, 6, 83, 38, 0, 0, 5, 0,
+  37, 0, 29, 9, 43, 27, 0, 0, 1, 0,
+  0, 0, 12, 0, 2, 0, 32, 0, 100, 0,
+  40, 0, 22, 0, 0, 0, 0, 0, 0, 48,
+  47, 0, 22, 0, 0, 0, 38, 0, 10, 49,
+  31, 17, 0, 15, 62, 0, 0, 40, 0, 20,
+  12, 0, 0, 26, 0, 0, 64, 55, 8, 0,
+  0, 16, 0, 41, 0, 28, 0, 56, 0, 45,
+  21, 45, 0, 12, 2, 10, 93, 9, 0, 9,
+  48, 0, 0, 35, 16, 4, 0, 1, 0, 0,
+  17, 7, 42, 0, 2, 3, 0, 21, 13, 42,
+  3, 0, 0, 26, 69, 0, 18, 2, 18, 0,
+  12, 0, 9, 8, 0, 31, 0, 8, 5, 29,
+  0, 0, 36, 54, 18, 0, 0, 0, 1, 0,
+  24, 4, 0, 31, 0, 1, 0, 19, 0, 0,
+  51, 3, 32, 0, 21, 0, 83, 0, 35, 0,
+  4, 0, 0, 9, 0, 0, 15, 0, 57, 0,
+  37, 0, 0, 0, 30, 12, 51, 40, 45, 47,
+  0, 28, 101, 0, 0, 27, 0, 9, 25, 8,
+  0, 23, 0, 0, 52, 4, 22, 0, 0, 12,
+  0, 35, 0, 7, 0, 70, 5, 54, 4, 16,
+  0, 0, 13, 8, 68, 27, 0, 0, 28, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 23, 1,
+  27, 0, 0, 0, 0, 10, 48, 0, 7, 9,
+  0, 11, 57, 13, 9, 0, 13, 0, 0, 0,
+  22, 29, 9, 0, 0, 15, 0, 34, 0, 0,
+  59, 37, 0, 0, 0, 0, 12, 0, 17, 14,
+  11, 27, 0, 0, 0, 5, 0, 0, 24, 0,
+  14, 0, 27, 0, 77, 0, 21, 0, 13, 0,
+  0, 33, 0, 0, 27, 0, 41, 0, 45, 22,
+  0, 7, 22, 44, 69, 48, 60, 49, 0, 17,
+  100, 0, 0, 26, 19, 29, 19, 25, 0, 21,
+  0, 0, 29, 10, 19, 0, 0, 21, 0, 35,
+  0, 0, 0, 56, 7, 31, 16, 4, 0, 0,
+  48, 0, 33, 46, 0, 2, 16, 0, 0, 12,
+  0, 0, 0, 0, 0, 0, 48, 0, 33, 0,
+  0, 0, 0, 6, 51, 0, 15, 23, 0, 30,
+  42, 35, 0, 0, 24, 0, 0, 0, 26, 42,
+  0, 0, 0, 46, 0, 27, 0, 13, 75, 38,
+  0, 0, 0, 0, 17, 0, 16, 5, 28, 44,
+  0, 0, 0, 5, 8, 0, 2, 0, 24, 0,
+  4, 0, 105, 0, 27, 6, 32, 0, 0, 46,
+  0, 5, 8, 0, 87, 3, 13, 14, 0, 39,
+  38, 29, 17, 42, 21, 66, 26, 57, 83, 0,
+  35, 35, 10, 13, 59, 37, 156, 43, 0, 0,
+  97, 0, 28, 0, 0, 0, 0, 60, 0, 0,
+  0, 58, 6, 89, 17, 14, 0, 43, 0, 39,
+  81, 11, 0, 0, 23, 0, 0, 26, 0, 12,
+  14, 12, 0, 0, 12, 25, 19, 1, 23, 0,
+  31, 0, 56, 15, 12, 6, 36, 0, 63, 0,
+  17, 12, 2, 0, 24, 1, 58, 22, 24, 0,
+  0, 0, 11, 31, 0, 0, 72, 22, 0, 0,
+  23, 0, 40, 0, 15, 32, 13, 36, 18, 8,
+  0, 1, 0, 0, 17, 8, 16, 23, 55, 3,
+  28, 0, 23, 0, 16, 0, 0, 26, 0, 19,
+  10, 0, 77, 11, 23, 31, 0, 35, 23, 57,
+  9, 52, 22, 74, 37, 27, 102, 0, 0, 31,
+  15, 13, 55, 46, 154, 59, 0, 4, 97, 0,
+  27, 0, 0, 0, 0, 55, 0, 0, 0, 52,
+  12, 66, 15, 9, 0, 41, 0, 76, 57, 46,
+  4, 14, 7, 0, 0, 16, 0, 0, 24, 8,
+  0, 8, 10, 17, 12, 30, 0, 0, 27, 0,
+  37, 13, 12, 0, 23, 0, 76, 0, 17, 2,
+  0, 0, 21, 18, 71, 15, 30, 0, 0, 0,
+  29, 12, 20, 0, 83, 41, 0, 0, 20, 0,
+  63, 0, 2, 35, 27, 25, 17, 5, 25, 0,
+  6, 0, 30, 0, 13, 13, 58, 0, 47, 0,
+  29, 0, 20, 0, 0, 16, 0, 14, 1, 0,
+  63, 29, 23, 32, 0, 13, 0, 45, 0, 47,
+  19, 68, 39, 6, 67, 0, 0, 42, 12, 16,
+  57, 47, 121, 62, 0, 0, 87, 0, 30, 0,
+  0, 0, 0, 41, 0, 0, 0, 17, 8, 43,
+  25, 0, 0, 37, 11, 79, 44, 41, 28, 6,
+  2, 20, 0, 16, 0, 0, 13, 18, 0, 16,
+  25, 5, 1, 40, 0, 0, 44, 0, 27, 34,
+  0, 0, 27, 0, 77, 0, 17, 14, 0, 0,
+  18, 24, 76, 0, 60, 4, 0, 4, 30, 0,
+  46, 0, 60, 49, 0, 0, 9, 0, 57, 0,
+  0, 18, 38, 31, 23, 17, 38, 0, 21, 0,
+  27, 0, 7, 10, 58, 0, 64, 0, 40, 0,
+  0, 0, 0, 32, 0, 0, 20, 0, 56, 0,
+  35, 0, 0, 29, 28, 20, 52, 24, 39, 50,
+  3, 36, 95, 0, 10, 21, 21, 25, 9, 34,
+  0, 29, 0, 0, 63, 0, 10, 0, 0, 0,
+  0, 48, 0, 3, 0, 63, 16, 61, 5, 1,
+  0, 6, 0, 3, 79, 33, 0, 0, 18, 0,
+  0, 7, 0, 7, 0, 0, 0, 0, 32, 20,
+  20, 0, 0, 0, 0, 0, 62, 0, 13, 2,
+  0, 6, 67, 26, 0, 0, 6, 0, 7, 0,
+  11, 49, 18, 0, 0, 4, 0, 55, 0, 6,
+  64, 36, 0, 0, 3, 0, 34, 0, 22, 9,
+  31, 35, 0, 0, 0, 0, 0, 0, 14, 2,
+  12, 0, 45, 0, 77, 0, 41, 0, 26, 0,
+  0, 27, 0, 15, 17, 0, 54, 0, 26, 19,
+  0, 24, 19, 41, 54, 36, 42, 53, 0, 29,
+  105, 0, 0, 24, 36, 35, 13, 47, 0, 36,
+  0, 0, 67, 9, 22, 0, 0, 0, 0, 30,
+  0, 0, 0, 58, 16, 44, 12, 18, 0, 3,
+  21, 11, 61, 51, 0, 0, 3, 0, 0, 16,
+  0, 0, 0, 0, 0, 0, 38, 18, 25, 0,
+  0, 0, 0, 0, 56, 0, 14, 7, 0, 10,
+  79, 42, 2, 0, 11, 0, 6, 6, 16, 33,
+  14, 0, 0, 12, 0, 42, 0, 6, 83, 38,
+  0, 0, 5, 0, 37, 0, 29, 9, 43, 27,
+  0, 0, 1, 0, 0, 0, 12, 0, 2, 0,
+  32, 0, 100, 0, 40, 0, 22, 0, 0, 22,
+  0, 0, 8, 0, 32, 0, 33, 28, 0, 1,
+  0, 29, 40, 48, 56, 56, 12, 13, 56, 0,
+  0, 29, 28, 42, 16, 56, 0, 19, 0, 0,
+  57, 2, 6, 0, 0, 0, 0, 24, 0, 0,
+  0, 16, 1, 14, 21, 10, 0, 5, 37, 5,
+  41, 38, 0, 11, 0, 24, 0, 42, 0, 0,
+  0, 0, 0, 0, 70, 24, 23, 0, 0, 0,
+  11, 21, 44, 0, 8, 0, 0, 12, 70, 39,
+  7, 8, 19, 29, 0, 28, 16, 3, 38, 30,
+  0, 36, 4, 7, 0, 4, 60, 56, 0, 0,
+  5, 0, 33, 0, 12, 9, 35, 35, 0, 12,
+  2, 0, 10, 0, 0, 0, 0, 0, 6, 0,
+  111, 0, 30, 0, 9, 0, 0, 9, 0, 0,
+  15, 0, 57, 0, 37, 0, 0, 0, 30, 12,
+  51, 40, 45, 47, 0, 28, 101, 0, 0, 27,
+  0, 9, 25, 8, 0, 23, 0, 0, 52, 4,
+  22, 0, 0, 12, 0, 35, 0, 7, 0, 70,
+  5, 54, 4, 16, 0, 0, 13, 8, 68, 27,
+  0, 0, 28, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 23, 1, 27, 0, 0, 0, 0, 10,
+  48, 0, 7, 9, 0, 11, 57, 13, 9, 0,
+  13, 0, 0, 0, 22, 29, 9, 0, 0, 15,
+  0, 34, 0, 0, 59, 37, 0, 0, 0, 0,
+  12, 0, 17, 14, 11, 27, 0, 0, 0, 5,
+  0, 0, 24, 0, 14, 0, 27, 0, 77, 0,
+  21, 0, 13, 0, 0, 33, 0, 0, 27, 0,
+  41, 0, 45, 22, 0, 7, 22, 44, 69, 48,
+  60, 49, 0, 17, 100, 0, 0, 26, 19, 29,
+  19, 25, 0, 21, 0, 0, 29, 10, 19, 0,
+  0, 21, 0, 35, 0, 0, 0, 56, 7, 31,
+  16, 4, 0, 0, 48, 0, 33, 46, 0, 2,
+  16, 0, 0, 12, 0, 0, 0, 0, 0, 0,
+  48, 0, 33, 0, 0, 0, 0, 6, 51, 0,
+  15, 23, 0, 30, 42, 35, 0, 0, 24, 0,
+  0, 0, 26, 42, 0, 0, 0, 46, 0, 27,
+  0, 13, 75, 38, 0, 0, 0, 0, 17, 0,
+  16, 5, 28, 44, 0, 0, 0, 5, 8, 0,
+  2, 0, 24, 0, 4, 0, 105, 0, 27, 6,
+  32, 0, 0, 33, 0, 0, 36, 0, 0, 3,
+  48, 28, 0, 0, 10, 59, 39, 46, 67, 44,
+  12, 0, 51, 0, 0, 36, 0, 22, 41, 60,
+  0, 0, 0, 0, 19, 0, 7, 0, 0, 22,
+  0, 24, 0, 0, 0, 4, 0, 17, 23, 0,
+  0, 0, 55, 0, 1, 17, 0, 0, 18, 15,
+  0, 17, 0, 0, 0, 0, 0, 0, 102, 0,
+  17, 0, 0, 0, 5, 41, 35, 0, 3, 53,
+  0, 13, 18, 38, 12, 42, 10, 28, 0, 30,
+  22, 26, 21, 17, 0, 42, 0, 0, 0, 2,
+  49, 55, 1, 0, 0, 0, 16, 0, 14, 19,
+  32, 69, 0, 3, 0, 0, 21, 0, 0, 0,
+  17, 0, 0, 13, 100, 0, 0, 0, 30, 37,
+  0, 26, 0, 19, 10, 0, 77, 11, 23, 31,
+  0, 35, 23, 57, 9, 52, 22, 74, 37, 27,
+  102, 0, 0, 31, 15, 13, 55, 46, 154, 59,
+  0, 4, 97, 0, 27, 0, 0, 0, 0, 55,
+  0, 0, 0, 52, 12, 66, 15, 9, 0, 41,
+  0, 76, 57, 46, 4, 14, 7, 0, 0, 16,
+  0, 0, 24, 8, 0, 8, 10, 17, 12, 30,
+  0, 0, 27, 0, 37, 13, 12, 0, 23, 0,
+  76, 0, 17, 2, 0, 0, 21, 18, 71, 15,
+  30, 0, 0, 0, 29, 12, 20, 0, 83, 41,
+  0, 0, 20, 0, 63, 0, 2, 35, 27, 25,
+  17, 5, 25, 0, 6, 0, 30, 0, 13, 13,
+  58, 0, 47, 0, 29, 0, 20, 0, 0, 16,
+  0, 14, 1, 0, 63, 29, 23, 32, 0, 13,
+  0, 45, 0, 47, 19, 68, 39, 6, 67, 0,
+  0, 42, 12, 16, 57, 47, 121, 62, 0, 0,
+  87, 0, 30, 0, 0, 0, 0, 41, 0, 0,
+  0, 17, 8, 43, 25, 0, 0, 37, 11, 79,
+  44, 41, 28, 6, 2, 20, 0, 16, 0, 0,
+  13, 18, 0, 16, 25, 5, 1, 40, 0, 0,
+  44, 0, 27, 34, 0, 0, 27, 0, 77, 0,
+  17, 14, 0, 0, 18, 24, 76, 0, 60, 4,
+  0, 4, 30, 0, 46, 0, 60, 49, 0, 0,
+  9, 0, 57, 0, 0, 18, 38, 31, 23, 17,
+  38, 0, 21, 0, 27, 0, 7, 10, 58, 0,
+  64, 0, 40, 0, 0, 0, 0, 26, 0, 7,
+  2, 0, 63, 38, 23, 37, 2, 6, 0, 40,
+  0, 45, 6, 67, 46, 14, 38, 0, 0, 48,
+  16, 24, 55, 58, 112, 45, 0, 0, 68, 0,
+  26, 0, 0, 0, 0, 44, 0, 0, 0, 2,
+  1, 25, 39, 0, 0, 36, 14, 72, 25, 35,
+  35, 0, 0, 49, 0, 21, 0, 0, 16, 34,
+  0, 26, 35, 0, 2, 44, 0, 0, 64, 0,
+  29, 35, 0, 1, 39, 0, 66, 5, 11, 30,
+  0, 6, 14, 27, 89, 0, 74, 5, 0, 3,
+  35, 0, 49, 0, 45, 48, 0, 0, 10, 0,
+  56, 0, 0, 23, 42, 24, 30, 23, 39, 0,
+  31, 0, 11, 0, 7, 13, 40, 0, 62, 0,
+  52, 0, 0, 2, 0, 27, 0, 15, 17, 0,
+  54, 0, 26, 19, 0, 24, 19, 41, 54, 36,
+  42, 53, 0, 29, 105, 0, 0, 24, 36, 35,
+  13, 47, 0, 36, 0, 0, 67, 9, 22, 0,
+  0, 0, 0, 30, 0, 0, 0, 58, 16, 44,
+  12, 18, 0, 3, 21, 11, 61, 51, 0, 0,
+  3, 0, 0, 16, 0, 0, 0, 0, 0, 0,
+  38, 18, 25, 0, 0, 0, 0, 0, 56, 0,
+  14, 7, 0, 10, 79, 42, 2, 0, 11, 0,
+  6, 6, 16, 33, 14, 0, 0, 12, 0, 42,
+  0, 6, 83, 38, 0, 0, 5, 0, 37, 0,
+  29, 9, 43, 27, 0, 0, 1, 0, 0, 0,
+  12, 0, 2, 0, 32, 0, 100, 0, 40, 0,
+  22, 0, 0, 22, 0, 0, 8, 0, 32, 0,
+  33, 28, 0, 1, 0, 29, 40, 48, 56, 56,
+  12, 13, 56, 0, 0, 29, 28, 42, 16, 56,
+  0, 19, 0, 0, 57, 2, 6, 0, 0, 0,
+  0, 24, 0, 0, 0, 16, 1, 14, 21, 10,
+  0, 5, 37, 5, 41, 38, 0, 11, 0, 24,
+  0, 42, 0, 0, 0, 0, 0, 0, 70, 24,
+  23, 0, 0, 0, 11, 21, 44, 0, 8, 0,
+  0, 12, 70, 39, 7, 8, 19, 29, 0, 28,
+  16, 3, 38, 30, 0, 36, 4, 7, 0, 4,
+  60, 56, 0, 0, 5, 0, 33, 0, 12, 9,
+  35, 35, 0, 12, 2, 0, 10, 0, 0, 0,
+  0, 0, 6, 0, 111, 0, 30, 0, 9, 0,
+  0, 40, 0, 0, 15, 0, 26, 0, 40, 45,
+  1, 0, 0, 24, 16, 54, 51, 59, 27, 8,
+  15, 0, 0, 41, 35, 63, 9, 78, 0, 0,
+  8, 0, 21, 0, 0, 0, 0, 0, 0, 35,
+  0, 0, 0, 0, 0, 0, 38, 0, 0, 5,
+  22, 8, 24, 27, 0, 0, 0, 65, 0, 36,
+  0, 0, 0, 33, 0, 2, 97, 14, 35, 0,
+  0, 0, 20, 36, 43, 5, 0, 0, 0, 9,
+  52, 53, 0, 20, 31, 37, 0, 46, 33, 0,
+  42, 41, 0, 48, 0, 0, 2, 16, 45, 62,
+  0, 0, 12, 0, 34, 0, 0, 17, 24, 34,
+  0, 27, 0, 0, 25, 0, 0, 14, 10, 0,
+  0, 8, 110, 0, 42, 0, 17, 9, 0, 33,
+  0, 0, 27, 0, 41, 0, 45, 22, 0, 7,
+  22, 44, 69, 48, 60, 49, 0, 17, 100, 0,
+  0, 26, 19, 29, 19, 25, 0, 21, 0, 0,
+  29, 10, 19, 0, 0, 21, 0, 35, 0, 0,
+  0, 56, 7, 31, 16, 4, 0, 0, 48, 0,
+  33, 46, 0, 2, 16, 0, 0, 12, 0, 0,
+  0, 0, 0, 0, 48, 0, 33, 0, 0, 0,
+  0, 6, 51, 0, 15, 23, 0, 30, 42, 35,
+  0, 0, 24, 0, 0, 0, 26, 42, 0, 0,
+  0, 46, 0, 27, 0, 13, 75, 38, 0, 0,
+  0, 0, 17, 0, 16, 5, 28, 44, 0, 0,
+  0, 5, 8, 0, 2, 0, 24, 0, 4, 0,
+  105, 0, 27, 6, 32, 0, 0, 33, 0, 0,
+  36, 0, 0, 3, 48, 28, 0, 0, 10, 59,
+  39, 46, 67, 44, 12, 0, 51, 0, 0, 36,
+  0, 22, 41, 60, 0, 0, 0, 0, 19, 0,
+  7, 0, 0, 22, 0, 24, 0, 0, 0, 4,
+  0, 17, 23, 0, 0, 0, 55, 0, 1, 17,
+  0, 0, 18, 15, 0, 17, 0, 0, 0, 0,
+  0, 0, 102, 0, 17, 0, 0, 0, 5, 41,
+  35, 0, 3, 53, 0, 13, 18, 38, 12, 42,
+  10, 28, 0, 30, 22, 26, 21, 17, 0, 42,
+  0, 0, 0, 2, 49, 55, 1, 0, 0, 0,
+  16, 0, 14, 19, 32, 69, 0, 3, 0, 0,
+  21, 0, 0, 0, 17, 0, 0, 13, 100, 0,
+  0, 0, 30, 37, 12, 0, 30, 0, 18, 0,
+  0, 0, 37, 30, 0, 0, 4, 71, 11, 0,
+  44, 48, 26, 0, 25, 1, 22, 8, 0, 6,
+  34, 49, 0, 0, 16, 0, 0, 5, 0, 0,
+  40, 32, 0, 1, 1, 0, 0, 0, 0, 0,
+  9, 0, 0, 0, 31, 0, 0, 10, 0, 0,
+  0, 51, 0, 0, 2, 6, 23, 5, 0, 0,
+  106, 5, 12, 82, 0, 0, 6, 39, 0, 0,
+  0, 50, 1, 0, 0, 34, 0, 54, 42, 31,
+  0, 69, 0, 0, 0, 56, 0, 0, 20, 0,
+  0, 15, 19, 45, 10, 6, 0, 0, 0, 0,
+  0, 21, 1, 57, 6, 0, 0, 0, 53, 11,
+  0, 0, 15, 0, 0, 26, 8, 0, 0, 12,
+  42, 48, 0, 16, 0, 14, 1, 0, 63, 29,
+  23, 32, 0, 13, 0, 45, 0, 47, 19, 68,
+  39, 6, 67, 0, 0, 42, 12, 16, 57, 47,
+  121, 62, 0, 0, 87, 0, 30, 0, 0, 0,
+  0, 41, 0, 0, 0, 17, 8, 43, 25, 0,
+  0, 37, 11, 79, 44, 41, 28, 6, 2, 20,
+  0, 16, 0, 0, 13, 18, 0, 16, 25, 5,
+  1, 40, 0, 0, 44, 0, 27, 34, 0, 0,
+  27, 0, 77, 0, 17, 14, 0, 0, 18, 24,
+  76, 0, 60, 4, 0, 4, 30, 0, 46, 0,
+  60, 49, 0, 0, 9, 0, 57, 0, 0, 18,
+  38, 31, 23, 17, 38, 0, 21, 0, 27, 0,
+  7, 10, 58, 0, 64, 0, 40, 0, 0, 0,
+  0, 26, 0, 7, 2, 0, 63, 38, 23, 37,
+  2, 6, 0, 40, 0, 45, 6, 67, 46, 14,
+  38, 0, 0, 48, 16, 24, 55, 58, 112, 45,
+  0, 0, 68, 0, 26, 0, 0, 0, 0, 44,
+  0, 0, 0, 2, 1, 25, 39, 0, 0, 36,
+  14, 72, 25, 35, 35, 0, 0, 49, 0, 21,
+  0, 0, 16, 34, 0, 26, 35, 0, 2, 44,
+  0, 0, 64, 0, 29, 35, 0, 1, 39, 0,
+  66, 5, 11, 30, 0, 6, 14, 27, 89, 0,
+  74, 5, 0, 3, 35, 0, 49, 0, 45, 48,
+  0, 0, 10, 0, 56, 0, 0, 23, 42, 24,
+  30, 23, 39, 0, 31, 0, 11, 0, 7, 13,
+  40, 0, 62, 0, 52, 0, 0, 2, 0, 45,
+  0, 0, 0, 0, 62, 43, 22, 57, 2, 15,
+  0, 41, 7, 47, 6, 61, 60, 24, 15, 0,
+  0, 43, 26, 39, 53, 69, 110, 31, 0, 0,
+  54, 0, 28, 0, 0, 0, 0, 53, 0, 0,
+  0, 0, 3, 7, 35, 0, 0, 41, 15, 67,
+  26, 42, 26, 0, 0, 57, 0, 32, 0, 0,
+  14, 45, 0, 35, 43, 0, 0, 32, 0, 1,
+  56, 0, 32, 31, 0, 8, 48, 0, 66, 25,
+  6, 25, 12, 12, 17, 31, 106, 0, 60, 5,
+  0, 7, 27, 0, 51, 1, 26, 50, 0, 0,
+  24, 0, 67, 0, 2, 18, 45, 33, 35, 9,
+  30, 0, 39, 0, 0, 6, 16, 9, 41, 0,
+  67, 0, 44, 0, 11, 14, 0, 22, 0, 0,
+  8, 0, 32, 0, 33, 28, 0, 1, 0, 29,
+  40, 48, 56, 56, 12, 13, 56, 0, 0, 29,
+  28, 42, 16, 56, 0, 19, 0, 0, 57, 2,
+  6, 0, 0, 0, 0, 24, 0, 0, 0, 16,
+  1, 14, 21, 10, 0, 5, 37, 5, 41, 38,
+  0, 11, 0, 24, 0, 42, 0, 0, 0, 0,
+  0, 0, 70, 24, 23, 0, 0, 0, 11, 21,
+  44, 0, 8, 0, 0, 12, 70, 39, 7, 8,
+  19, 29, 0, 28, 16, 3, 38, 30, 0, 36,
+  4, 7, 0, 4, 60, 56, 0, 0, 5, 0,
+  33, 0, 12, 9, 35, 35, 0, 12, 2, 0,
+  10, 0, 0, 0, 0, 0, 6, 0, 111, 0,
+  30, 0, 9, 0, 0, 40, 0, 0, 15, 0,
+  26, 0, 40, 45, 1, 0, 0, 24, 16, 54,
+  51, 59, 27, 8, 15, 0, 0, 41, 35, 63,
+  9, 78, 0, 0, 8, 0, 21, 0, 0, 0,
+  0, 0, 0, 35, 0, 0, 0, 0, 0, 0,
+  38, 0, 0, 5, 22, 8, 24, 27, 0, 0,
+  0, 65, 0, 36, 0, 0, 0, 33, 0, 2,
+  97, 14, 35, 0, 0, 0, 20, 36, 43, 5,
+  0, 0, 0, 9, 52, 53, 0, 20, 31, 37,
+  0, 46, 33, 0, 42, 41, 0, 48, 0, 0,
+  2, 16, 45, 62, 0, 0, 12, 0, 34, 0,
+  0, 17, 24, 34, 0, 27, 0, 0, 25, 0,
+  0, 14, 10, 0, 0, 8, 110, 0, 42, 0,
+  17, 9, 0, 44, 12, 0, 11, 0, 23, 0,
+  54, 79, 0, 0, 0, 0, 3, 53, 49, 60,
+  36, 23, 0, 0, 0, 42, 29, 49, 27, 93,
+  0, 0, 15, 0, 15, 0, 0, 0, 0, 32,
+  0, 20, 0, 0, 0, 0, 0, 7, 42, 0,
+  0, 5, 12, 12, 37, 19, 0, 0, 0, 60,
+  0, 25, 1, 12, 0, 29, 0, 0, 86, 0,
+  36, 9, 0, 0, 13, 38, 43, 13, 0, 16,
+  0, 0, 60, 35, 0, 10, 27, 23, 0, 45,
+  43, 0, 17, 49, 0, 42, 0, 0, 4, 7,
+  24, 57, 0, 0, 23, 0, 36, 0, 0, 1,
+  19, 59, 0, 22, 0, 0, 36, 0, 0, 24,
+  28, 0, 1, 18, 93, 0, 22, 0, 42, 20,
+  0, 33, 0, 0, 36, 0, 0, 3, 48, 28,
+  0, 0, 10, 59, 39, 46, 67, 44, 12, 0,
+  51, 0, 0, 36, 0, 22, 41, 60, 0, 0,
+  0, 0, 19, 0, 7, 0, 0, 22, 0, 24,
+  0, 0, 0, 4, 0, 17, 23, 0, 0, 0,
+  55, 0, 1, 17, 0, 0, 18, 15, 0, 17,
+  0, 0, 0, 0, 0, 0, 102, 0, 17, 0,
+  0, 0, 5, 41, 35, 0, 3, 53, 0, 13,
+  18, 38, 12, 42, 10, 28, 0, 30, 22, 26,
+  21, 17, 0, 42, 0, 0, 0, 2, 49, 55,
+  1, 0, 0, 0, 16, 0, 14, 19, 32, 69,
+  0, 3, 0, 0, 21, 0, 0, 0, 17, 0,
+  0, 13, 100, 0, 0, 0, 30, 37, 12, 0,
+  30, 0, 18, 0, 0, 0, 37, 30, 0, 0,
+  4, 71, 11, 0, 44, 48, 26, 0, 25, 1,
+  22, 8, 0, 6, 34, 49, 0, 0, 16, 0,
+  0, 5, 0, 0, 40, 32, 0, 1, 1, 0,
+  0, 0, 0, 0, 9, 0, 0, 0, 31, 0,
+  0, 10, 0, 0, 0, 51, 0, 0, 2, 6,
+  23, 5, 0, 0, 106, 5, 12, 82, 0, 0,
+  6, 39, 0, 0, 0, 50, 1, 0, 0, 34,
+  0, 54, 42, 31, 0, 69, 0, 0, 0, 56,
+  0, 0, 20, 0, 0, 15, 19, 45, 10, 6,
+  0, 0, 0, 0, 0, 21, 1, 57, 6, 0,
+  0, 0, 53, 11, 0, 0, 15, 0, 0, 26,
+  8, 0, 0, 12, 42, 48, 16, 0, 43, 0,
+  0, 0, 0, 0, 40, 54, 0, 16, 0, 59,
+  14, 0, 21, 57, 23, 17, 21, 14, 54, 0,
+  0, 0, 42, 21, 0, 0, 0, 0, 0, 0,
+  0, 0, 54, 47, 0, 0, 9, 0, 0, 0,
+  0, 0, 9, 0, 0, 0, 23, 0, 0, 0,
+  10, 0, 8, 40, 0, 0, 0, 25, 50, 0,
+  59, 21, 36, 7, 0, 114, 0, 9, 8, 6,
+  0, 0, 4, 34, 0, 0, 0, 19, 0, 29,
+  42, 2, 22, 44, 6, 0, 0, 57, 0, 0,
+  19, 0, 0, 0, 14, 17, 24, 0, 0, 0,
+  0, 0, 0, 0, 0, 39, 0, 0, 0, 0,
+  81, 4, 14, 0, 20, 0, 0, 18, 0, 0,
+  0, 19, 37, 4, 0, 26, 0, 7, 2, 0,
+  63, 38, 23, 37, 2, 6, 0, 40, 0, 45,
+  6, 67, 46, 14, 38, 0, 0, 48, 16, 24,
+  55, 58, 112, 45, 0, 0, 68, 0, 26, 0,
+  0, 0, 0, 44, 0, 0, 0, 2, 1, 25,
+  39, 0, 0, 36, 14, 72, 25, 35, 35, 0,
+  0, 49, 0, 21, 0, 0, 16, 34, 0, 26,
+  35, 0, 2, 44, 0, 0, 64, 0, 29, 35,
+  0, 1, 39, 0, 66, 5, 11, 30, 0, 6,
+  14, 27, 89, 0, 74, 5, 0, 3, 35, 0,
+  49, 0, 45, 48, 0, 0, 10, 0, 56, 0,
+  0, 23, 42, 24, 30, 23, 39, 0, 31, 0,
+  11, 0, 7, 13, 40, 0, 62, 0, 52, 0,
+  0, 2, 0, 45, 0, 0, 0, 0, 62, 43,
+  22, 57, 2, 15, 0, 41, 7, 47, 6, 61,
+  60, 24, 15, 0, 0, 43, 26, 39, 53, 69,
+  110, 31, 0, 0, 54, 0, 28, 0, 0, 0,
+  0, 53, 0, 0, 0, 0, 3, 7, 35, 0,
+  0, 41, 15, 67, 26, 42, 26, 0, 0, 57,
+  0, 32, 0, 0, 14, 45, 0, 35, 43, 0,
+  0, 32, 0, 1, 56, 0, 32, 31, 0, 8,
+  48, 0, 66, 25, 6, 25, 12, 12, 17, 31,
+  106, 0, 60, 5, 0, 7, 27, 0, 51, 1,
+  26, 50, 0, 0, 24, 0, 67, 0, 2, 18,
+  45, 33, 35, 9, 30, 0, 39, 0, 0, 6,
+  16, 9, 41, 0, 67, 0, 44, 0, 11, 14,
+  0, 50, 11, 0, 0, 0, 74, 36, 26, 54,
+  0, 25, 0, 0, 19, 41, 32, 80, 62, 25,
+  0, 0, 0, 42, 46, 46, 53, 65, 120, 31,
+  0, 0, 44, 0, 29, 0, 0, 0, 0, 45,
+  0, 0, 34, 0, 9, 14, 37, 0, 0, 29,
+  26, 40, 42, 29, 11, 0, 0, 42, 0, 48,
+  0, 0, 13, 56, 0, 27, 47, 0, 0, 21,
+  0, 6, 37, 0, 32, 21, 1, 6, 34, 0,
+  57, 25, 7, 31, 24, 9, 22, 28, 77, 0,
+  42, 0, 0, 21, 17, 0, 36, 22, 1, 31,
+  0, 0, 35, 0, 70, 0, 6, 12, 44, 44,
+  51, 12, 23, 0, 31, 0, 0, 14, 39, 0,
+  40, 13, 69, 0, 18, 0, 49, 15, 0, 40,
+  0, 0, 15, 0, 26, 0, 40, 45, 1, 0,
+  0, 24, 16, 54, 51, 59, 27, 8, 15, 0,
+  0, 41, 35, 63, 9, 78, 0, 0, 8, 0,
+  21, 0, 0, 0, 0, 0, 0, 35, 0, 0,
+  0, 0, 0, 0, 38, 0, 0, 5, 22, 8,
+  24, 27, 0, 0, 0, 65, 0, 36, 0, 0,
+  0, 33, 0, 2, 97, 14, 35, 0, 0, 0,
+  20, 36, 43, 5, 0, 0, 0, 9, 52, 53,
+  0, 20, 31, 37, 0, 46, 33, 0, 42, 41,
+  0, 48, 0, 0, 2, 16, 45, 62, 0, 0,
+  12, 0, 34, 0, 0, 17, 24, 34, 0, 27,
+  0, 0, 25, 0, 0, 14, 10, 0, 0, 8,
+  110, 0, 42, 0, 17, 9, 0, 44, 12, 0,
+  11, 0, 23, 0, 54, 79, 0, 0, 0, 0,
+  3, 53, 49, 60, 36, 23, 0, 0, 0, 42,
+  29, 49, 27, 93, 0, 0, 15, 0, 15, 0,
+  0, 0, 0, 32, 0, 20, 0, 0, 0, 0,
+  0, 7, 42, 0, 0, 5, 12, 12, 37, 19,
+  0, 0, 0, 60, 0, 25, 1, 12, 0, 29,
+  0, 0, 86, 0, 36, 9, 0, 0, 13, 38,
+  43, 13, 0, 16, 0, 0, 60, 35, 0, 10,
+  27, 23, 0, 45, 43, 0, 17, 49, 0, 42,
+  0, 0, 4, 7, 24, 57, 0, 0, 23, 0,
+  36, 0, 0, 1, 19, 59, 0, 22, 0, 0,
+  36, 0, 0, 24, 28, 0, 1, 18, 93, 0,
+  22, 0, 42, 20, 0, 38, 33, 0, 0, 0,
+  27, 0, 63, 89, 0, 12, 0, 0, 14, 41,
+  49, 72, 30, 11, 0, 0, 0, 57, 37, 23,
+  43, 98, 0, 0, 23, 0, 9, 0, 0, 0,
+  0, 70, 0, 0, 14, 15, 16, 0, 0, 17,
+  24, 0, 0, 0, 12, 0, 48, 0, 0, 0,
+  0, 33, 0, 3, 10, 18, 0, 50, 0, 0,
+  81, 0, 15, 42, 0, 0, 7, 44, 23, 12,
+  4, 28, 0, 0, 63, 33, 2, 27, 31, 25,
+  2, 25, 25, 0, 0, 46, 0, 33, 0, 0,
+  0, 14, 0, 51, 3, 0, 8, 0, 41, 0,
+  0, 18, 2, 64, 10, 19, 0, 0, 55, 0,
+  0, 23, 45, 0, 7, 3, 63, 0, 0, 0,
+  78, 18, 12, 0, 30, 0, 18, 0, 0, 0,
+  37, 30, 0, 0, 4, 71, 11, 0, 44, 48,
+  26, 0, 25, 1, 22, 8, 0, 6, 34, 49,
+  0, 0, 16, 0, 0, 5, 0, 0, 40, 32,
+  0, 1, 1, 0, 0, 0, 0, 0, 9, 0,
+  0, 0, 31, 0, 0, 10, 0, 0, 0, 51,
+  0, 0, 2, 6, 23, 5, 0, 0, 106, 5,
+  12, 82, 0, 0, 6, 39, 0, 0, 0, 50,
+  1, 0, 0, 34, 0, 54, 42, 31, 0, 69,
+  0, 0, 0, 56, 0, 0, 20, 0, 0, 15,
+  19, 45, 10, 6, 0, 0, 0, 0, 0, 21,
+  1, 57, 6, 0, 0, 0, 53, 11, 0, 0,
+  15, 0, 0, 26, 8, 0, 0, 12, 42, 48,
+  16, 0, 43, 0, 0, 0, 0, 0, 40, 54,
+  0, 16, 0, 59, 14, 0, 21, 57, 23, 17,
+  21, 14, 54, 0, 0, 0, 42, 21, 0, 0,
+  0, 0, 0, 0, 0, 0, 54, 47, 0, 0,
+  9, 0, 0, 0, 0, 0, 9, 0, 0, 0,
+  23, 0, 0, 0, 10, 0, 8, 40, 0, 0,
+  0, 25, 50, 0, 59, 21, 36, 7, 0, 114,
+  0, 9, 8, 6, 0, 0, 4, 34, 0, 0,
+  0, 19, 0, 29, 42, 2, 22, 44, 6, 0,
+  0, 57, 0, 0, 19, 0, 0, 0, 14, 17,
+  24, 0, 0, 0, 0, 0, 0, 0, 0, 39,
+  0, 0, 0, 0, 81, 4, 14, 0, 20, 0,
+  0, 18, 0, 0, 0, 19, 37, 4, 30, 0,
+  21, 8, 18, 0, 0, 0, 23, 36, 0, 0,
+  0, 54, 7, 0, 0, 65, 15, 16, 55, 1,
+  62, 10, 0, 0, 52, 0, 0, 0, 14, 0,
+  0, 0, 0, 0, 9, 33, 0, 0, 29, 0,
+  0, 9, 0, 0, 15, 0, 0, 0, 30, 30,
+  0, 0, 29, 0, 20, 15, 0, 0, 0, 14,
+  64, 0, 89, 22, 8, 0, 0, 130, 0, 14,
+  8, 0, 2, 0, 14, 22, 0, 0, 24, 0,
+  8, 22, 41, 0, 39, 0, 26, 0, 0, 30,
+  15, 0, 0, 0, 0, 0, 23, 0, 15, 0,
+  0, 0, 0, 0, 0, 32, 0, 10, 0, 9,
+  0, 0, 99, 17, 35, 0, 24, 0, 6, 0,
+  0, 0, 0, 31, 25, 0, 0, 45, 0, 0,
+  0, 0, 62, 43, 22, 57, 2, 15, 0, 41,
+  7, 47, 6, 61, 60, 24, 15, 0, 0, 43,
+  26, 39, 53, 69, 110, 31, 0, 0, 54, 0,
+  28, 0, 0, 0, 0, 53, 0, 0, 0, 0,
+  3, 7, 35, 0, 0, 41, 15, 67, 26, 42,
+  26, 0, 0, 57, 0, 32, 0, 0, 14, 45,
+  0, 35, 43, 0, 0, 32, 0, 1, 56, 0,
+  32, 31, 0, 8, 48, 0, 66, 25, 6, 25,
+  12, 12, 17, 31, 106, 0, 60, 5, 0, 7,
+  27, 0, 51, 1, 26, 50, 0, 0, 24, 0,
+  67, 0, 2, 18, 45, 33, 35, 9, 30, 0,
+  39, 0, 0, 6, 16, 9, 41, 0, 67, 0,
+  44, 0, 11, 14, 0, 50, 11, 0, 0, 0,
+  74, 36, 26, 54, 0, 25, 0, 0, 19, 41,
+  32, 80, 62, 25, 0, 0, 0, 42, 46, 46,
+  53, 65, 120, 31, 0, 0, 44, 0, 29, 0,
+  0, 0, 0, 45, 0, 0, 34, 0, 9, 14,
+  37, 0, 0, 29, 26, 40, 42, 29, 11, 0,
+  0, 42, 0, 48, 0, 0, 13, 56, 0, 27,
+  47, 0, 0, 21, 0, 6, 37, 0, 32, 21,
+  1, 6, 34, 0, 57, 25, 7, 31, 24, 9,
+  22, 28, 77, 0, 42, 0, 0, 21, 17, 0,
+  36, 22, 1, 31, 0, 0, 35, 0, 70, 0,
+  6, 12, 44, 44, 51, 12, 23, 0, 31, 0,
+  0, 14, 39, 0, 40, 13, 69, 0, 18, 0,
+  49, 15, 0, 53, 6, 0, 0, 0, 108, 18,
+  35, 62, 0, 10, 0, 0, 14, 70, 19, 66,
+  42, 16, 0, 0, 0, 59, 58, 43, 47, 64,
+  123, 32, 0, 0, 54, 0, 29, 0, 0, 0,
+  9, 45, 0, 0, 26, 16, 0, 23, 56, 0,
+  0, 30, 14, 43, 57, 13, 7, 3, 3, 60,
+  0, 52, 0, 9, 11, 62, 0, 31, 41, 10,
+  20, 3, 0, 13, 31, 0, 45, 36, 0, 0,
+  32, 0, 56, 38, 10, 21, 24, 0, 26, 22,
+  84, 1, 35, 0, 0, 34, 0, 0, 6, 15,
+  19, 40, 0, 0, 26, 0, 74, 0, 0, 29,
+  37, 36, 50, 12, 2, 0, 29, 0, 0, 35,
+  51, 0, 32, 0, 64, 0, 33, 0, 43, 1,
+  0, 44, 12, 0, 11, 0, 23, 0, 54, 79,
+  0, 0, 0, 0, 3, 53, 49, 60, 36, 23,
+  0, 0, 0, 42, 29, 49, 27, 93, 0, 0,
+  15, 0, 15, 0, 0, 0, 0, 32, 0, 20,
+  0, 0, 0, 0, 0, 7, 42, 0, 0, 5,
+  12, 12, 37, 19, 0, 0, 0, 60, 0, 25,
+  1, 12, 0, 29, 0, 0, 86, 0, 36, 9,
+  0, 0, 13, 38, 43, 13, 0, 16, 0, 0,
+  60, 35, 0, 10, 27, 23, 0, 45, 43, 0,
+  17, 49, 0, 42, 0, 0, 4, 7, 24, 57,
+  0, 0, 23, 0, 36, 0, 0, 1, 19, 59,
+  0, 22, 0, 0, 36, 0, 0, 24, 28, 0,
+  1, 18, 93, 0, 22, 0, 42, 20, 0, 38,
+  33, 0, 0, 0, 27, 0, 63, 89, 0, 12,
+  0, 0, 14, 41, 49, 72, 30, 11, 0, 0,
+  0, 57, 37, 23, 43, 98, 0, 0, 23, 0,
+  9, 0, 0, 0, 0, 70, 0, 0, 14, 15,
+  16, 0, 0, 17, 24, 0, 0, 0, 12, 0,
+  48, 0, 0, 0, 0, 33, 0, 3, 10, 18,
+  0, 50, 0, 0, 81, 0, 15, 42, 0, 0,
+  7, 44, 23, 12, 4, 28, 0, 0, 63, 33,
+  2, 27, 31, 25, 2, 25, 25, 0, 0, 46,
+  0, 33, 0, 0, 0, 14, 0, 51, 3, 0,
+  8, 0, 41, 0, 0, 18, 2, 64, 10, 19,
+  0, 0, 55, 0, 0, 23, 45, 0, 7, 3,
+  63, 0, 0, 0, 78, 18, 0, 39, 39, 0,
+  0, 0, 25, 0, 78, 78, 0, 0, 0, 3,
+  0, 17, 3, 41, 11, 0, 0, 0, 16, 61,
+  36, 0, 50, 80, 0, 0, 9, 0, 0, 0,
+  0, 0, 16, 73, 0, 0, 40, 8, 4, 0,
+  0, 14, 31, 0, 0, 0, 18, 0, 26, 0,
+  2, 0, 24, 52, 0, 0, 0, 48, 0, 57,
+  2, 2, 88, 0, 14, 69, 0, 0, 2, 41,
+  6, 46, 1, 15, 0, 0, 48, 46, 0, 40,
+  32, 26, 15, 28, 27, 0, 0, 65, 0, 8,
+  0, 0, 0, 0, 0, 52, 25, 0, 0, 0,
+  32, 0, 0, 39, 0, 43, 11, 0, 0, 0,
+  70, 0, 0, 25, 54, 0, 0, 0, 11, 0,
+  0, 0, 64, 2, 16, 0, 43, 0, 0, 0,
+  0, 0, 40, 54, 0, 16, 0, 59, 14, 0,
+  21, 57, 23, 17, 21, 14, 54, 0, 0, 0,
+  42, 21, 0, 0, 0, 0, 0, 0, 0, 0,
+  54, 47, 0, 0, 9, 0, 0, 0, 0, 0,
+  9, 0, 0, 0, 23, 0, 0, 0, 10, 0,
+  8, 40, 0, 0, 0, 25, 50, 0, 59, 21,
+  36, 7, 0, 114, 0, 9, 8, 6, 0, 0,
+  4, 34, 0, 0, 0, 19, 0, 29, 42, 2,
+  22, 44, 6, 0, 0, 57, 0, 0, 19, 0,
+  0, 0, 14, 17, 24, 0, 0, 0, 0, 0,
+  0, 0, 0, 39, 0, 0, 0, 0, 81, 4,
+  14, 0, 20, 0, 0, 18, 0, 0, 0, 19,
+  37, 4, 30, 0, 21, 8, 18, 0, 0, 0,
+  23, 36, 0, 0, 0, 54, 7, 0, 0, 65,
+  15, 16, 55, 1, 62, 10, 0, 0, 52, 0,
+  0, 0, 14, 0, 0, 0, 0, 0, 9, 33,
+  0, 0, 29, 0, 0, 9, 0, 0, 15, 0,
+  0, 0, 30, 30, 0, 0, 29, 0, 20, 15,
+  0, 0, 0, 14, 64, 0, 89, 22, 8, 0,
+  0, 130, 0, 14, 8, 0, 2, 0, 14, 22,
+  0, 0, 24, 0, 8, 22, 41, 0, 39, 0,
+  26, 0, 0, 30, 15, 0, 0, 0, 0, 0,
+  23, 0, 15, 0, 0, 0, 0, 0, 0, 32,
+  0, 10, 0, 9, 0, 0, 99, 17, 35, 0,
+  24, 0, 6, 0, 0, 0, 0, 31, 25, 0,
+  5, 13, 0, 32, 19, 0, 8, 0, 42, 4,
+  0, 13, 0, 36, 0, 0, 0, 57, 0, 20,
+  78, 0, 62, 17, 0, 0, 48, 0, 0, 0,
+  23, 0, 0, 0, 0, 0, 0, 22, 0, 0,
+  41, 0, 0, 33, 9, 0, 6, 0, 0, 0,
+  32, 6, 0, 0, 33, 0, 37, 0, 4, 0,
+  0, 39, 62, 0, 84, 8, 32, 22, 0, 130,
+  0, 9, 16, 0, 0, 9, 33, 13, 0, 0,
+  29, 13, 0, 22, 32, 0, 33, 0, 24, 0,
+  0, 28, 10, 0, 0, 0, 8, 0, 32, 0,
+  10, 12, 0, 0, 0, 0, 0, 83, 0, 0,
+  2, 0, 0, 0, 98, 36, 46, 0, 18, 0,
+  8, 0, 0, 0, 0, 28, 8, 0, 0, 50,
+  11, 0, 0, 0, 74, 36, 26, 54, 0, 25,
+  0, 0, 19, 41, 32, 80, 62, 25, 0, 0,
+  0, 42, 46, 46, 53, 65, 120, 31, 0, 0,
+  44, 0, 29, 0, 0, 0, 0, 45, 0, 0,
+  34, 0, 9, 14, 37, 0, 0, 29, 26, 40,
+  42, 29, 11, 0, 0, 42, 0, 48, 0, 0,
+  13, 56, 0, 27, 47, 0, 0, 21, 0, 6,
+  37, 0, 32, 21, 1, 6, 34, 0, 57, 25,
+  7, 31, 24, 9, 22, 28, 77, 0, 42, 0,
+  0, 21, 17, 0, 36, 22, 1, 31, 0, 0,
+  35, 0, 70, 0, 6, 12, 44, 44, 51, 12,
+  23, 0, 31, 0, 0, 14, 39, 0, 40, 13,
+  69, 0, 18, 0, 49, 15, 0, 53, 6, 0,
+  0, 0, 108, 18, 35, 62, 0, 10, 0, 0,
+  14, 70, 19, 66, 42, 16, 0, 0, 0, 59,
+  58, 43, 47, 64, 123, 32, 0, 0, 54, 0,
+  29, 0, 0, 0, 9, 45, 0, 0, 26, 16,
+  0, 23, 56, 0, 0, 30, 14, 43, 57, 13,
+  7, 3, 3, 60, 0, 52, 0, 9, 11, 62,
+  0, 31, 41, 10, 20, 3, 0, 13, 31, 0,
+  45, 36, 0, 0, 32, 0, 56, 38, 10, 21,
+  24, 0, 26, 22, 84, 1, 35, 0, 0, 34,
+  0, 0, 6, 15, 19, 40, 0, 0, 26, 0,
+  74, 0, 0, 29, 37, 36, 50, 12, 2, 0,
+  29, 0, 0, 35, 51, 0, 32, 0, 64, 0,
+  33, 0, 43, 1, 0, 47, 0, 0, 0, 0,
+  99, 35, 39, 50, 0, 17, 0, 0, 7, 70,
+  34, 67, 46, 6, 16, 0, 0, 47, 51, 51,
+  43, 68, 129, 40, 9, 0, 53, 0, 19, 0,
+  0, 3, 0, 46, 0, 0, 4, 18, 0, 21,
+  43, 0, 0, 29, 3, 44, 51, 16, 0, 0,
+  8, 61, 0, 57, 0, 8, 10, 70, 0, 30,
+  41, 15, 26, 0, 0, 5, 28, 0, 43, 38,
+  0, 0, 35, 0, 53, 27, 7, 21, 30, 0,
+  31, 28, 62, 0, 36, 0, 0, 42, 1, 0,
+  11, 10, 39, 35, 0, 0, 24, 0, 67, 0,
+  0, 27, 42, 50, 46, 18, 14, 0, 25, 0,
+  0, 33, 56, 0, 33, 24, 74, 0, 21, 0,
+  46, 9, 0, 38, 33, 0, 0, 0, 27, 0,
+  63, 89, 0, 12, 0, 0, 14, 41, 49, 72,
+  30, 11, 0, 0, 0, 57, 37, 23, 43, 98,
+  0, 0, 23, 0, 9, 0, 0, 0, 0, 70,
+  0, 0, 14, 15, 16, 0, 0, 17, 24, 0,
+  0, 0, 12, 0, 48, 0, 0, 0, 0, 33,
+  0, 3, 10, 18, 0, 50, 0, 0, 81, 0,
+  15, 42, 0, 0, 7, 44, 23, 12, 4, 28,
+  0, 0, 63, 33, 2, 27, 31, 25, 2, 25,
+  25, 0, 0, 46, 0, 33, 0, 0, 0, 14,
+  0, 51, 3, 0, 8, 0, 41, 0, 0, 18,
+  2, 64, 10, 19, 0, 0, 55, 0, 0, 23,
+  45, 0, 7, 3, 63, 0, 0, 0, 78, 18,
+  0, 39, 39, 0, 0, 0, 25, 0, 78, 78,
+  0, 0, 0, 3, 0, 17, 3, 41, 11, 0,
+  0, 0, 16, 61, 36, 0, 50, 80, 0, 0,
+  9, 0, 0, 0, 0, 0, 16, 73, 0, 0,
+  40, 8, 4, 0, 0, 14, 31, 0, 0, 0,
+  18, 0, 26, 0, 2, 0, 24, 52, 0, 0,
+  0, 48, 0, 57, 2, 2, 88, 0, 14, 69,
+  0, 0, 2, 41, 6, 46, 1, 15, 0, 0,
+  48, 46, 0, 40, 32, 26, 15, 28, 27, 0,
+  0, 65, 0, 8, 0, 0, 0, 0, 0, 52,
+  25, 0, 0, 0, 32, 0, 0, 39, 0, 43,
+  11, 0, 0, 0, 70, 0, 0, 25, 54, 0,
+  0, 0, 11, 0, 0, 0, 64, 2, 0, 29,
+  0, 0, 0, 0, 15, 0, 80, 38, 0, 0,
+  0, 0, 0, 0, 0, 35, 26, 0, 14, 0,
+  0, 45, 31, 0, 42, 64, 0, 0, 16, 0,
+  0, 5, 0, 0, 32, 60, 1, 0, 52, 0,
+  0, 0, 0, 15, 40, 0, 0, 0, 0, 2,
+  11, 0, 19, 50, 26, 49, 0, 0, 6, 43,
+  3, 66, 19, 0, 76, 0, 18, 84, 0, 0,
+  2, 19, 0, 39, 0, 5, 14, 0, 39, 27,
+  3, 12, 27, 17, 21, 31, 23, 0, 0, 98,
+  2, 0, 0, 0, 0, 0, 39, 39, 30, 37,
+  0, 0, 15, 0, 0, 33, 0, 44, 1, 9,
+  0, 0, 55, 0, 0, 24, 71, 0, 0, 0,
+  0, 0, 0, 0, 42, 0, 30, 0, 21, 8,
+  18, 0, 0, 0, 23, 36, 0, 0, 0, 54,
+  7, 0, 0, 65, 15, 16, 55, 1, 62, 10,
+  0, 0, 52, 0, 0, 0, 14, 0, 0, 0,
+  0, 0, 9, 33, 0, 0, 29, 0, 0, 9,
+  0, 0, 15, 0, 0, 0, 30, 30, 0, 0,
+  29, 0, 20, 15, 0, 0, 0, 14, 64, 0,
+  89, 22, 8, 0, 0, 130, 0, 14, 8, 0,
+  2, 0, 14, 22, 0, 0, 24, 0, 8, 22,
+  41, 0, 39, 0, 26, 0, 0, 30, 15, 0,
+  0, 0, 0, 0, 23, 0, 15, 0, 0, 0,
+  0, 0, 0, 32, 0, 10, 0, 9, 0, 0,
+  99, 17, 35, 0, 24, 0, 6, 0, 0, 0,
+  0, 31, 25, 0, 5, 13, 0, 32, 19, 0,
+  8, 0, 42, 4, 0, 13, 0, 36, 0, 0,
+  0, 57, 0, 20, 78, 0, 62, 17, 0, 0,
+  48, 0, 0, 0, 23, 0, 0, 0, 0, 0,
+  0, 22, 0, 0, 41, 0, 0, 33, 9, 0,
+  6, 0, 0, 0, 32, 6, 0, 0, 33, 0,
+  37, 0, 4, 0, 0, 39, 62, 0, 84, 8,
+  32, 22, 0, 130, 0, 9, 16, 0, 0, 9,
+  33, 13, 0, 0, 29, 13, 0, 22, 32, 0,
+  33, 0, 24, 0, 0, 28, 10, 0, 0, 0,
+  8, 0, 32, 0, 10, 12, 0, 0, 0, 0,
+  0, 83, 0, 0, 2, 0, 0, 0, 98, 36,
+  46, 0, 18, 0, 8, 0, 0, 0, 0, 28,
+  8, 0, 11, 29, 0, 45, 2, 0, 17, 0,
+  59, 0, 0, 24, 0, 0, 0, 0, 0, 40,
+  1, 11, 70, 0, 8, 10, 0, 0, 32, 0,
+  0, 0, 26, 22, 0, 7, 0, 0, 17, 26,
+  2, 0, 47, 0, 0, 21, 13, 9, 8, 0,
+  0, 0, 39, 2, 0, 18, 67, 54, 46, 0,
+  21, 0, 0, 41, 60, 20, 72, 13, 27, 31,
+  0, 123, 0, 13, 17, 0, 0, 28, 28, 13,
+  17, 0, 23, 19, 0, 3, 26, 0, 27, 0,
+  23, 0, 0, 39, 0, 0, 0, 3, 33, 0,
+  52, 9, 4, 75, 0, 0, 0, 0, 0, 100,
+  0, 0, 2, 0, 0, 11, 51, 34, 23, 0,
+  31, 0, 14, 0, 0, 0, 3, 31, 7, 0,
+  0, 53, 6, 0, 0, 0, 108, 18, 35, 62,
+  0, 10, 0, 0, 14, 70, 19, 66, 42, 16,
+  0, 0, 0, 59, 58, 43, 47, 64, 123, 32,
+  0, 0, 54, 0, 29, 0, 0, 0, 9, 45,
+  0, 0, 26, 16, 0, 23, 56, 0, 0, 30,
+  14, 43, 57, 13, 7, 3, 3, 60, 0, 52,
+  0, 9, 11, 62, 0, 31, 41, 10, 20, 3,
+  0, 13, 31, 0, 45, 36, 0, 0, 32, 0,
+  56, 38, 10, 21, 24, 0, 26, 22, 84, 1,
+  35, 0, 0, 34, 0, 0, 6, 15, 19, 40,
+  0, 0, 26, 0, 74, 0, 0, 29, 37, 36,
+  50, 12, 2, 0, 29, 0, 0, 35, 51, 0,
+  32, 0, 64, 0, 33, 0, 43, 1, 0, 47,
+  0, 0, 0, 0, 99, 35, 39, 50, 0, 17,
+  0, 0, 7, 70, 34, 67, 46, 6, 16, 0,
+  0, 47, 51, 51, 43, 68, 129, 40, 9, 0,
+  53, 0, 19, 0, 0, 3, 0, 46, 0, 0,
+  4, 18, 0, 21, 43, 0, 0, 29, 3, 44,
+  51, 16, 0, 0, 8, 61, 0, 57, 0, 8,
+  10, 70, 0, 30, 41, 15, 26, 0, 0, 5,
+  28, 0, 43, 38, 0, 0, 35, 0, 53, 27,
+  7, 21, 30, 0, 31, 28, 62, 0, 36, 0,
+  0, 42, 1, 0, 11, 10, 39, 35, 0, 0,
+  24, 0, 67, 0, 0, 27, 42, 50, 46, 18,
+  14, 0, 25, 0, 0, 33, 56, 0, 33, 24,
+  74, 0, 21, 0, 46, 9, 0, 40, 0, 0,
+  5, 0, 79, 51, 29, 30, 0, 28, 9, 0,
+  6, 57, 44, 75, 60, 18, 9, 0, 0, 32,
+  53, 70, 33, 61, 135, 47, 36, 0, 45, 8,
+  29, 0, 0, 4, 0, 55, 0, 0, 25, 9,
+  0, 4, 34, 0, 0, 18, 21, 51, 44, 48,
+  0, 10, 3, 61, 0, 58, 0, 0, 12, 61,
+  0, 22, 46, 13, 15, 0, 0, 2, 14, 0,
+  34, 33, 0, 3, 31, 0, 57, 9, 0, 22,
+  46, 0, 23, 34, 53, 5, 53, 2, 0, 39,
+  29, 0, 36, 10, 25, 36, 0, 0, 19, 0,
+  58, 0, 0, 20, 53, 51, 44, 24, 38, 2,
+  31, 0, 0, 13, 50, 0, 40, 53, 98, 0,
+  37, 0, 54, 1, 0, 39, 39, 0, 0, 0,
+  25, 0, 78, 78, 0, 0, 0, 3, 0, 17,
+  3, 41, 11, 0, 0, 0, 16, 61, 36, 0,
+  50, 80, 0, 0, 9, 0, 0, 0, 0, 0,
+  16, 73, 0, 0, 40, 8, 4, 0, 0, 14,
+  31, 0, 0, 0, 18, 0, 26, 0, 2, 0,
+  24, 52, 0, 0, 0, 48, 0, 57, 2, 2,
+  88, 0, 14, 69, 0, 0, 2, 41, 6, 46,
+  1, 15, 0, 0, 48, 46, 0, 40, 32, 26,
+  15, 28, 27, 0, 0, 65, 0, 8, 0, 0,
+  0, 0, 0, 52, 25, 0, 0, 0, 32, 0,
+  0, 39, 0, 43, 11, 0, 0, 0, 70, 0,
+  0, 25, 54, 0, 0, 0, 11, 0, 0, 0,
+  64, 2, 0, 29, 0, 0, 0, 0, 15, 0,
+  80, 38, 0, 0, 0, 0, 0, 0, 0, 35,
+  26, 0, 14, 0, 0, 45, 31, 0, 42, 64,
+  0, 0, 16, 0, 0, 5, 0, 0, 32, 60,
+  1, 0, 52, 0, 0, 0, 0, 15, 40, 0,
+  0, 0, 0, 2, 11, 0, 19, 50, 26, 49,
+  0, 0, 6, 43, 3, 66, 19, 0, 76, 0,
+  18, 84, 0, 0, 2, 19, 0, 39, 0, 5,
+  14, 0, 39, 27, 3, 12, 27, 17, 21, 31,
+  23, 0, 0, 98, 2, 0, 0, 0, 0, 0,
+  39, 39, 30, 37, 0, 0, 15, 0, 0, 33,
+  0, 44, 1, 9, 0, 0, 55, 0, 0, 24,
+  71, 0, 0, 0, 0, 0, 0, 0, 42, 0,
+  0, 21, 0, 0, 2, 0, 15, 0, 74, 29,
+  0, 18, 0, 12, 0, 34, 16, 63, 31, 0,
+  0, 0, 0, 43, 15, 0, 18, 55, 0, 0,
+  44, 0, 0, 15, 0, 0, 19, 53, 0, 0,
+  37, 0, 0, 0, 0, 6, 28, 0, 0, 0,
+  0, 19, 26, 0, 3, 71, 33, 50, 0, 0,
+  10, 18, 0, 54, 2, 0, 62, 0, 20, 53,
+  0, 0, 0, 10, 0, 34, 0, 0, 19, 0,
+  50, 13, 6, 0, 30, 11, 7, 22, 34, 0,
+  0, 109, 0, 6, 0, 0, 0, 0, 36, 46,
+  17, 32, 7, 0, 17, 0, 0, 18, 0, 40,
+  0, 25, 0, 9, 51, 0, 0, 9, 68, 0,
+  0, 9, 34, 0, 14, 0, 50, 0, 5, 13,
+  0, 32, 19, 0, 8, 0, 42, 4, 0, 13,
+  0, 36, 0, 0, 0, 57, 0, 20, 78, 0,
+  62, 17, 0, 0, 48, 0, 0, 0, 23, 0,
+  0, 0, 0, 0, 0, 22, 0, 0, 41, 0,
+  0, 33, 9, 0, 6, 0, 0, 0, 32, 6,
+  0, 0, 33, 0, 37, 0, 4, 0, 0, 39,
+  62, 0, 84, 8, 32, 22, 0, 130, 0, 9,
+  16, 0, 0, 9, 33, 13, 0, 0, 29, 13,
+  0, 22, 32, 0, 33, 0, 24, 0, 0, 28,
+  10, 0, 0, 0, 8, 0, 32, 0, 10, 12,
+  0, 0, 0, 0, 0, 83, 0, 0, 2, 0,
+  0, 0, 98, 36, 46, 0, 18, 0, 8, 0,
+  0, 0, 0, 28, 8, 0, 11, 29, 0, 45,
+  2, 0, 17, 0, 59, 0, 0, 24, 0, 0,
+  0, 0, 0, 40, 1, 11, 70, 0, 8, 10,
+  0, 0, 32, 0, 0, 0, 26, 22, 0, 7,
+  0, 0, 17, 26, 2, 0, 47, 0, 0, 21,
+  13, 9, 8, 0, 0, 0, 39, 2, 0, 18,
+  67, 54, 46, 0, 21, 0, 0, 41, 60, 20,
+  72, 13, 27, 31, 0, 123, 0, 13, 17, 0,
+  0, 28, 28, 13, 17, 0, 23, 19, 0, 3,
+  26, 0, 27, 0, 23, 0, 0, 39, 0, 0,
+  0, 3, 33, 0, 52, 9, 4, 75, 0, 0,
+  0, 0, 0, 100, 0, 0, 2, 0, 0, 11,
+  51, 34, 23, 0, 31, 0, 14, 0, 0, 0,
+  3, 31, 7, 0, 11, 24, 0, 20, 0, 8,
+  0, 0, 72, 0, 0, 35, 0, 0, 0, 0,
+  0, 45, 6, 0, 35, 11, 0, 11, 0, 0,
+  13, 0, 0, 0, 2, 13, 0, 0, 0, 0,
+  29, 44, 34, 0, 50, 0, 0, 11, 0, 7,
+  0, 0, 0, 0, 8, 60, 0, 0, 108, 136,
+  34, 5, 37, 0, 0, 24, 71, 27, 134, 39,
+  0, 0, 0, 158, 66, 0, 9, 0, 0, 10,
+  0, 0, 39, 0, 9, 0, 13, 5, 9, 0,
+  4, 0, 70, 0, 0, 80, 0, 0, 27, 0,
+  26, 0, 39, 45, 33, 130, 0, 0, 0, 0,
+  0, 84, 0, 0, 0, 0, 0, 24, 23, 13,
+  0, 0, 36, 0, 0, 0, 0, 0, 23, 31,
+  12, 0, 0, 47, 0, 0, 0, 0, 99, 35,
+  39, 50, 0, 17, 0, 0, 7, 70, 34, 67,
+  46, 6, 16, 0, 0, 47, 51, 51, 43, 68,
+  129, 40, 9, 0, 53, 0, 19, 0, 0, 3,
+  0, 46, 0, 0, 4, 18, 0, 21, 43, 0,
+  0, 29, 3, 44, 51, 16, 0, 0, 8, 61,
+  0, 57, 0, 8, 10, 70, 0, 30, 41, 15,
+  26, 0, 0, 5, 28, 0, 43, 38, 0, 0,
+  35, 0, 53, 27, 7, 21, 30, 0, 31, 28,
+  62, 0, 36, 0, 0, 42, 1, 0, 11, 10,
+  39, 35, 0, 0, 24, 0, 67, 0, 0, 27,
+  42, 50, 46, 18, 14, 0, 25, 0, 0, 33,
+  56, 0, 33, 24, 74, 0, 21, 0, 46, 9,
+  0, 40, 0, 0, 5, 0, 79, 51, 29, 30,
+  0, 28, 9, 0, 6, 57, 44, 75, 60, 18,
+  9, 0, 0, 32, 53, 70, 33, 61, 135, 47,
+  36, 0, 45, 8, 29, 0, 0, 4, 0, 55,
+  0, 0, 25, 9, 0, 4, 34, 0, 0, 18,
+  21, 51, 44, 48, 0, 10, 3, 61, 0, 58,
+  0, 0, 12, 61, 0, 22, 46, 13, 15, 0,
+  0, 2, 14, 0, 34, 33, 0, 3, 31, 0,
+  57, 9, 0, 22, 46, 0, 23, 34, 53, 5,
+  53, 2, 0, 39, 29, 0, 36, 10, 25, 36,
+  0, 0, 19, 0, 58, 0, 0, 20, 53, 51,
+  44, 24, 38, 2, 31, 0, 0, 13, 50, 0,
+  40, 53, 98, 0, 37, 0, 54, 1, 0, 57,
+  0, 0, 7, 0, 75, 49, 21, 35, 0, 26,
+  12, 9, 20, 56, 23, 65, 41, 43, 0, 0,
+  0, 51, 49, 70, 25, 60, 128, 38, 16, 1,
+  47, 0, 34, 0, 0, 0, 0, 68, 0, 0,
+  51, 15, 10, 0, 33, 0, 0, 22, 41, 66,
+  39, 66, 0, 5, 0, 59, 0, 43, 0, 0,
+  13, 40, 0, 20, 49, 2, 9, 0, 0, 5,
+  40, 0, 43, 31, 0, 19, 43, 2, 80, 35,
+  0, 14, 27, 0, 17, 32, 100, 3, 76, 2,
+  0, 16, 24, 9, 46, 5, 10, 44, 0, 0,
+  7, 0, 65, 0, 4, 31, 54, 32, 37, 0,
+  31, 0, 29, 0, 0, 0, 10, 17, 45, 22,
+  97, 0, 76, 0, 23, 0, 0, 29, 0, 0,
+  0, 0, 15, 0, 80, 38, 0, 0, 0, 0,
+  0, 0, 0, 35, 26, 0, 14, 0, 0, 45,
+  31, 0, 42, 64, 0, 0, 16, 0, 0, 5,
+  0, 0, 32, 60, 1, 0, 52, 0, 0, 0,
+  0, 15, 40, 0, 0, 0, 0, 2, 11, 0,
+  19, 50, 26, 49, 0, 0, 6, 43, 3, 66,
+  19, 0, 76, 0, 18, 84, 0, 0, 2, 19,
+  0, 39, 0, 5, 14, 0, 39, 27, 3, 12,
+  27, 17, 21, 31, 23, 0, 0, 98, 2, 0,
+  0, 0, 0, 0, 39, 39, 30, 37, 0, 0,
+  15, 0, 0, 33, 0, 44, 1, 9, 0, 0,
+  55, 0, 0, 24, 71, 0, 0, 0, 0, 0,
+  0, 0, 42, 0, 0, 21, 0, 0, 2, 0,
+  15, 0, 74, 29, 0, 18, 0, 12, 0, 34,
+  16, 63, 31, 0, 0, 0, 0, 43, 15, 0,
+  18, 55, 0, 0, 44, 0, 0, 15, 0, 0,
+  19, 53, 0, 0, 37, 0, 0, 0, 0, 6,
+  28, 0, 0, 0, 0, 19, 26, 0, 3, 71,
+  33, 50, 0, 0, 10, 18, 0, 54, 2, 0,
+  62, 0, 20, 53, 0, 0, 0, 10, 0, 34,
+  0, 0, 19, 0, 50, 13, 6, 0, 30, 11,
+  7, 22, 34, 0, 0, 109, 0, 6, 0, 0,
+  0, 0, 36, 46, 17, 32, 7, 0, 17, 0,
+  0, 18, 0, 40, 0, 25, 0, 9, 51, 0,
+  0, 9, 68, 0, 0, 9, 34, 0, 14, 0,
+  50, 0, 0, 44, 0, 0, 11, 0, 30, 0,
+  44, 53, 0, 11, 18, 12, 0, 82, 51, 71,
+  16, 19, 0, 0, 0, 63, 28, 37, 0, 67,
+  2, 0, 45, 0, 33, 25, 0, 0, 0, 52,
+  0, 0, 18, 0, 13, 17, 0, 3, 20, 20,
+  0, 7, 2, 12, 49, 14, 0, 32, 19, 44,
+  0, 21, 12, 0, 0, 24, 0, 0, 80, 1,
+  40, 3, 0, 0, 8, 26, 18, 45, 0, 0,
+  0, 0, 87, 25, 0, 0, 27, 11, 0, 26,
+  28, 6, 18, 90, 0, 29, 0, 0, 0, 0,
+  0, 71, 9, 2, 14, 0, 37, 0, 0, 24,
+  1, 42, 0, 27, 0, 6, 32, 0, 0, 6,
+  43, 0, 9, 0, 103, 0, 43, 0, 51, 0,
+  11, 29, 0, 45, 2, 0, 17, 0, 59, 0,
+  0, 24, 0, 0, 0, 0, 0, 40, 1, 11,
+  70, 0, 8, 10, 0, 0, 32, 0, 0, 0,
+  26, 22, 0, 7, 0, 0, 17, 26, 2, 0,
+  47, 0, 0, 21, 13, 9, 8, 0, 0, 0,
+  39, 2, 0, 18, 67, 54, 46, 0, 21, 0,
+  0, 41, 60, 20, 72, 13, 27, 31, 0, 123,
+  0, 13, 17, 0, 0, 28, 28, 13, 17, 0,
+  23, 19, 0, 3, 26, 0, 27, 0, 23, 0,
+  0, 39, 0, 0, 0, 3, 33, 0, 52, 9,
+  4, 75, 0, 0, 0, 0, 0, 100, 0, 0,
+  2, 0, 0, 11, 51, 34, 23, 0, 31, 0,
+  14, 0, 0, 0, 3, 31, 7, 0, 11, 24,
+  0, 20, 0, 8, 0, 0, 72, 0, 0, 35,
+  0, 0, 0, 0, 0, 45, 6, 0, 35, 11,
+  0, 11, 0, 0, 13, 0, 0, 0, 2, 13,
+  0, 0, 0, 0, 29, 44, 34, 0, 50, 0,
+  0, 11, 0, 7, 0, 0, 0, 0, 8, 60,
+  0, 0, 108, 136, 34, 5, 37, 0, 0, 24,
+  71, 27, 134, 39, 0, 0, 0, 158, 66, 0,
+  9, 0, 0, 10, 0, 0, 39, 0, 9, 0,
+  13, 5, 9, 0, 4, 0, 70, 0, 0, 80,
+  0, 0, 27, 0, 26, 0, 39, 45, 33, 130,
+  0, 0, 0, 0, 0, 84, 0, 0, 0, 0,
+  0, 24, 23, 13, 0, 0, 36, 0, 0, 0,
+  0, 0, 23, 31, 12, 0, 0, 15, 0, 0,
+  0, 50, 0, 0, 53, 14, 0, 2, 0, 0,
+  0, 0, 0, 48, 12, 0, 0, 0, 0, 19,
+  0, 0, 0, 3, 0, 0, 3, 11, 0, 0,
+  0, 9, 43, 82, 35, 0, 70, 0, 5, 16,
+  0, 7, 7, 0, 0, 0, 0, 63, 0, 0,
+  57, 160, 47, 9, 35, 0, 0, 29, 57, 0,
+  153, 4, 0, 0, 0, 121, 122, 0, 14, 27,
+  0, 33, 0, 0, 46, 0, 6, 0, 5, 13,
+  16, 0, 0, 10, 64, 0, 0, 128, 0, 0,
+  35, 0, 0, 0, 10, 76, 58, 96, 0, 0,
+  0, 0, 0, 62, 0, 0, 0, 3, 0, 35,
+  0, 0, 0, 0, 53, 0, 0, 0, 0, 0,
+  18, 28, 29, 0, 0, 40, 0, 0, 5, 0,
+  79, 51, 29, 30, 0, 28, 9, 0, 6, 57,
+  44, 75, 60, 18, 9, 0, 0, 32, 53, 70,
+  33, 61, 135, 47, 36, 0, 45, 8, 29, 0,
+  0, 4, 0, 55, 0, 0, 25, 9, 0, 4,
+  34, 0, 0, 18, 21, 51, 44, 48, 0, 10,
+  3, 61, 0, 58, 0, 0, 12, 61, 0, 22,
+  46, 13, 15, 0, 0, 2, 14, 0, 34, 33,
+  0, 3, 31, 0, 57, 9, 0, 22, 46, 0,
+  23, 34, 53, 5, 53, 2, 0, 39, 29, 0,
+  36, 10, 25, 36, 0, 0, 19, 0, 58, 0,
+  0, 20, 53, 51, 44, 24, 38, 2, 31, 0,
+  0, 13, 50, 0, 40, 53, 98, 0, 37, 0,
+  54, 1, 0, 57, 0, 0, 7, 0, 75, 49,
+  21, 35, 0, 26, 12, 9, 20, 56, 23, 65,
+  41, 43, 0, 0, 0, 51, 49, 70, 25, 60,
+  128, 38, 16, 1, 47, 0, 34, 0, 0, 0,
+  0, 68, 0, 0, 51, 15, 10, 0, 33, 0,
+  0, 22, 41, 66, 39, 66, 0, 5, 0, 59,
+  0, 43, 0, 0, 13, 40, 0, 20, 49, 2,
+  9, 0, 0, 5, 40, 0, 43, 31, 0, 19,
+  43, 2, 80, 35, 0, 14, 27, 0, 17, 32,
+  100, 3, 76, 2, 0, 16, 24, 9, 46, 5,
+  10, 44, 0, 0, 7, 0, 65, 0, 4, 31,
+  54, 32, 37, 0, 31, 0, 29, 0, 0, 0,
+  10, 17, 45, 22, 97, 0, 76, 0, 23, 0,
+  0, 100, 25, 10, 0, 0, 70, 30, 19, 50,
+  0, 57, 14, 13, 11, 54, 10, 51, 32, 74,
+  0, 0, 0, 42, 41, 47, 55, 47, 140, 28,
+  0, 6, 69, 0, 51, 0, 0, 0, 0, 61,
+  0, 0, 55, 28, 10, 25, 39, 0, 0, 40,
+  29, 63, 62, 56, 3, 0, 0, 4, 0, 42,
+  0, 0, 18, 10, 0, 13, 27, 0, 4, 2,
+  3, 7, 57, 0, 55, 33, 0, 39, 43, 0,
+  86, 34, 0, 21, 5, 0, 34, 32, 104, 0,
+  59, 5, 0, 0, 22, 8, 33, 0, 3, 36,
+  0, 11, 27, 0, 66, 0, 37, 39, 34, 16,
+  38, 0, 27, 2, 5, 0, 0, 0, 0, 19,
+  44, 4, 64, 0, 73, 0, 11, 0, 0, 21,
+  0, 0, 2, 0, 15, 0, 74, 29, 0, 18,
+  0, 12, 0, 34, 16, 63, 31, 0, 0, 0,
+  0, 43, 15, 0, 18, 55, 0, 0, 44, 0,
+  0, 15, 0, 0, 19, 53, 0, 0, 37, 0,
+  0, 0, 0, 6, 28, 0, 0, 0, 0, 19,
+  26, 0, 3, 71, 33, 50, 0, 0, 10, 18,
+  0, 54, 2, 0, 62, 0, 20, 53, 0, 0,
+  0, 10, 0, 34, 0, 0, 19, 0, 50, 13,
+  6, 0, 30, 11, 7, 22, 34, 0, 0, 109,
+  0, 6, 0, 0, 0, 0, 36, 46, 17, 32,
+  7, 0, 17, 0, 0, 18, 0, 40, 0, 25,
+  0, 9, 51, 0, 0, 9, 68, 0, 0, 9,
+  34, 0, 14, 0, 50, 0, 0, 44, 0, 0,
+  11, 0, 30, 0, 44, 53, 0, 11, 18, 12,
+  0, 82, 51, 71, 16, 19, 0, 0, 0, 63,
+  28, 37, 0, 67, 2, 0, 45, 0, 33, 25,
+  0, 0, 0, 52, 0, 0, 18, 0, 13, 17,
+  0, 3, 20, 20, 0, 7, 2, 12, 49, 14,
+  0, 32, 19, 44, 0, 21, 12, 0, 0, 24,
+  0, 0, 80, 1, 40, 3, 0, 0, 8, 26,
+  18, 45, 0, 0, 0, 0, 87, 25, 0, 0,
+  27, 11, 0, 26, 28, 6, 18, 90, 0, 29,
+  0, 0, 0, 0, 0, 71, 9, 2, 14, 0,
+  37, 0, 0, 24, 1, 42, 0, 27, 0, 6,
+  32, 0, 0, 6, 43, 0, 9, 0, 103, 0,
+  43, 0, 51, 0, 0, 102, 14, 0, 4, 0,
+  39, 0, 27, 51, 8, 13, 23, 3, 26, 91,
+  67, 61, 21, 56, 0, 0, 0, 56, 53, 69,
+  6, 74, 0, 0, 14, 0, 81, 1, 0, 0,
+  0, 25, 0, 38, 0, 16, 42, 22, 1, 7,
+  22, 19, 0, 49, 2, 1, 68, 52, 0, 0,
+  0, 9, 0, 50, 0, 0, 0, 0, 0, 0,
+  91, 11, 34, 0, 0, 0, 15, 26, 42, 23,
+  0, 6, 0, 4, 107, 11, 0, 0, 11, 8,
+  10, 15, 30, 12, 42, 45, 0, 41, 0, 10,
+  0, 0, 0, 81, 0, 0, 14, 0, 46, 0,
+  23, 15, 32, 37, 0, 0, 0, 0, 0, 0,
+  0, 0, 12, 0, 30, 11, 149, 0, 76, 0,
+  46, 0, 11, 24, 0, 20, 0, 8, 0, 0,
+  72, 0, 0, 35, 0, 0, 0, 0, 0, 45,
+  6, 0, 35, 11, 0, 11, 0, 0, 13, 0,
+  0, 0, 2, 13, 0, 0, 0, 0, 29, 44,
+  34, 0, 50, 0, 0, 11, 0, 7, 0, 0,
+  0, 0, 8, 60, 0, 0, 108, 136, 34, 5,
+  37, 0, 0, 24, 71, 27, 134, 39, 0, 0,
+  0, 158, 66, 0, 9, 0, 0, 10, 0, 0,
+  39, 0, 9, 0, 13, 5, 9, 0, 4, 0,
+  70, 0, 0, 80, 0, 0, 27, 0, 26, 0,
+  39, 45, 33, 130, 0, 0, 0, 0, 0, 84,
+  0, 0, 0, 0, 0, 24, 23, 13, 0, 0,
+  36, 0, 0, 0, 0, 0, 23, 31, 12, 0,
+  0, 15, 0, 0, 0, 50, 0, 0, 53, 14,
+  0, 2, 0, 0, 0, 0, 0, 48, 12, 0,
+  0, 0, 0, 19, 0, 0, 0, 3, 0, 0,
+  3, 11, 0, 0, 0, 9, 43, 82, 35, 0,
+  70, 0, 5, 16, 0, 7, 7, 0, 0, 0,
+  0, 63, 0, 0, 57, 160, 47, 9, 35, 0,
+  0, 29, 57, 0, 153, 4, 0, 0, 0, 121,
+  122, 0, 14, 27, 0, 33, 0, 0, 46, 0,
+  6, 0, 5, 13, 16, 0, 0, 10, 64, 0,
+  0, 128, 0, 0, 35, 0, 0, 0, 10, 76,
+  58, 96, 0, 0, 0, 0, 0, 62, 0, 0,
+  0, 3, 0, 35, 0, 0, 0, 0, 53, 0,
+  0, 0, 0, 0, 18, 28, 29, 0, 0, 39,
+  0, 0, 0, 29, 0, 0, 78, 47, 0, 0,
+  30, 0, 0, 88, 39, 61, 6, 17, 0, 0,
+  0, 41, 0, 0, 7, 53, 6, 0, 17, 0,
+  36, 0, 0, 0, 35, 96, 0, 0, 48, 0,
+  9, 30, 0, 28, 42, 19, 0, 0, 0, 32,
+  2, 0, 4, 101, 46, 8, 0, 0, 0, 0,
+  0, 0, 66, 0, 6, 4, 24, 53, 52, 0,
+  17, 37, 0, 49, 0, 0, 5, 0, 39, 0,
+  0, 0, 0, 1, 0, 30, 51, 0, 0, 131,
+  0, 0, 11, 0, 0, 0, 0, 86, 87, 31,
+  0, 0, 0, 0, 0, 48, 0, 13, 0, 11,
+  0, 8, 2, 0, 0, 2, 51, 0, 25, 0,
+  41, 0, 28, 12, 43, 0, 0, 57, 0, 0,
+  7, 0, 75, 49, 21, 35, 0, 26, 12, 9,
+  20, 56, 23, 65, 41, 43, 0, 0, 0, 51,
+  49, 70, 25, 60, 128, 38, 16, 1, 47, 0,
+  34, 0, 0, 0, 0, 68, 0, 0, 51, 15,
+  10, 0, 33, 0, 0, 22, 41, 66, 39, 66,
+  0, 5, 0, 59, 0, 43, 0, 0, 13, 40,
+  0, 20, 49, 2, 9, 0, 0, 5, 40, 0,
+  43, 31, 0, 19, 43, 2, 80, 35, 0, 14,
+  27, 0, 17, 32, 100, 3, 76, 2, 0, 16,
+  24, 9, 46, 5, 10, 44, 0, 0, 7, 0,
+  65, 0, 4, 31, 54, 32, 37, 0, 31, 0,
+  29, 0, 0, 0, 10, 17, 45, 22, 97, 0,
+  76, 0, 23, 0, 0, 100, 25, 10, 0, 0,
+  70, 30, 19, 50, 0, 57, 14, 13, 11, 54,
+  10, 51, 32, 74, 0, 0, 0, 42, 41, 47,
+  55, 47, 140, 28, 0, 6, 69, 0, 51, 0,
+  0, 0, 0, 61, 0, 0, 55, 28, 10, 25,
+  39, 0, 0, 40, 29, 63, 62, 56, 3, 0,
+  0, 4, 0, 42, 0, 0, 18, 10, 0, 13,
+  27, 0, 4, 2, 3, 7, 57, 0, 55, 33,
+  0, 39, 43, 0, 86, 34, 0, 21, 5, 0,
+  34, 32, 104, 0, 59, 5, 0, 0, 22, 8,
+  33, 0, 3, 36, 0, 11, 27, 0, 66, 0,
+  37, 39, 34, 16, 38, 0, 27, 2, 5, 0,
+  0, 0, 0, 19, 44, 4, 64, 0, 73, 0,
+  11, 0, 0, 123, 31, 8, 0, 0, 58, 2,
+  5, 19, 0, 61, 49, 0, 0, 22, 6, 34,
+  22, 59, 0, 0, 47, 46, 38, 9, 61, 16,
+  179, 16, 0, 0, 76, 0, 51, 37, 0, 0,
+  40, 47, 0, 0, 71, 33, 17, 78, 26, 17,
+  0, 47, 0, 63, 77, 0, 7, 0, 7, 0,
+  0, 10, 13, 30, 0, 26, 0, 3, 14, 0,
+  1, 0, 72, 10, 34, 0, 44, 21, 8, 54,
+  16, 0, 64, 0, 25, 21, 0, 5, 39, 21,
+  53, 0, 0, 0, 23, 0, 9, 12, 0, 0,
+  0, 25, 0, 51, 27, 5, 41, 0, 55, 0,
+  0, 34, 30, 0, 0, 7, 0, 0, 0, 10,
+  31, 34, 58, 5, 0, 0, 20, 0, 0, 0,
+  0, 44, 0, 0, 11, 0, 30, 0, 44, 53,
+  0, 11, 18, 12, 0, 82, 51, 71, 16, 19,
+  0, 0, 0, 63, 28, 37, 0, 67, 2, 0,
+  45, 0, 33, 25, 0, 0, 0, 52, 0, 0,
+  18, 0, 13, 17, 0, 3, 20, 20, 0, 7,
+  2, 12, 49, 14, 0, 32, 19, 44, 0, 21,
+  12, 0, 0, 24, 0, 0, 80, 1, 40, 3,
+  0, 0, 8, 26, 18, 45, 0, 0, 0, 0,
+  87, 25, 0, 0, 27, 11, 0, 26, 28, 6,
+  18, 90, 0, 29, 0, 0, 0, 0, 0, 71,
+  9, 2, 14, 0, 37, 0, 0, 24, 1, 42,
+  0, 27, 0, 6, 32, 0, 0, 6, 43, 0,
+  9, 0, 103, 0, 43, 0, 51, 0, 0, 102,
+  14, 0, 4, 0, 39, 0, 27, 51, 8, 13,
+  23, 3, 26, 91, 67, 61, 21, 56, 0, 0,
+  0, 56, 53, 69, 6, 74, 0, 0, 14, 0,
+  81, 1, 0, 0, 0, 25, 0, 38, 0, 16,
+  42, 22, 1, 7, 22, 19, 0, 49, 2, 1,
+  68, 52, 0, 0, 0, 9, 0, 50, 0, 0,
+  0, 0, 0, 0, 91, 11, 34, 0, 0, 0,
+  15, 26, 42, 23, 0, 6, 0, 4, 107, 11,
+  0, 0, 11, 8, 10, 15, 30, 12, 42, 45,
+  0, 41, 0, 10, 0, 0, 0, 81, 0, 0,
+  14, 0, 46, 0, 23, 15, 32, 37, 0, 0,
+  0, 0, 0, 0, 0, 0, 12, 0, 30, 11,
+  149, 0, 76, 0, 46, 0, 0, 131, 52, 5,
+  17, 0, 45, 0, 11, 44, 5, 23, 60, 0,
+  17, 55, 55, 49, 15, 72, 0, 0, 12, 32,
+  54, 53, 11, 54, 0, 20, 0, 0, 76, 0,
+  17, 0, 0, 0, 0, 41, 0, 25, 68, 41,
+  28, 22, 40, 0, 0, 52, 0, 3, 85, 24,
+  0, 0, 0, 0, 0, 44, 4, 0, 0, 5,
+  0, 0, 29, 13, 13, 0, 0, 0, 8, 16,
+  74, 5, 15, 32, 0, 0, 97, 0, 0, 0,
+  14, 0, 30, 16, 22, 9, 0, 0, 0, 20,
+  0, 26, 0, 0, 0, 38, 5, 16, 9, 0,
+  39, 0, 48, 8, 25, 53, 0, 0, 0, 5,
+  0, 0, 0, 24, 33, 0, 34, 5, 77, 0,
+  62, 0, 29, 0, 0, 15, 0, 0, 0, 50,
+  0, 0, 53, 14, 0, 2, 0, 0, 0, 0,
+  0, 48, 12, 0, 0, 0, 0, 19, 0, 0,
+  0, 3, 0, 0, 3, 11, 0, 0, 0, 9,
+  43, 82, 35, 0, 70, 0, 5, 16, 0, 7,
+  7, 0, 0, 0, 0, 63, 0, 0, 57, 160,
+  47, 9, 35, 0, 0, 29, 57, 0, 153, 4,
+  0, 0, 0, 121, 122, 0, 14, 27, 0, 33,
+  0, 0, 46, 0, 6, 0, 5, 13, 16, 0,
+  0, 10, 64, 0, 0, 128, 0, 0, 35, 0,
+  0, 0, 10, 76, 58, 96, 0, 0, 0, 0,
+  0, 62, 0, 0, 0, 3, 0, 35, 0, 0,
+  0, 0, 53, 0, 0, 0, 0, 0, 18, 28,
+  29, 0, 0, 39, 0, 0, 0, 29, 0, 0,
+  78, 47, 0, 0, 30, 0, 0, 88, 39, 61,
+  6, 17, 0, 0, 0, 41, 0, 0, 7, 53,
+  6, 0, 17, 0, 36, 0, 0, 0, 35, 96,
+  0, 0, 48, 0, 9, 30, 0, 28, 42, 19,
+  0, 0, 0, 32, 2, 0, 4, 101, 46, 8,
+  0, 0, 0, 0, 0, 0, 66, 0, 6, 4,
+  24, 53, 52, 0, 17, 37, 0, 49, 0, 0,
+  5, 0, 39, 0, 0, 0, 0, 1, 0, 30,
+  51, 0, 0, 131, 0, 0, 11, 0, 0, 0,
+  0, 86, 87, 31, 0, 0, 0, 0, 0, 48,
+  0, 13, 0, 11, 0, 8, 2, 0, 0, 2,
+  51, 0, 25, 0, 41, 0, 28, 12, 43, 0,
+  0, 93, 41, 0, 7, 0, 52, 3, 86, 40,
+  12, 0, 76, 3, 0, 125, 70, 39, 2, 33,
+  0, 0, 0, 54, 36, 13, 16, 61, 3, 0,
+  21, 0, 90, 1, 0, 0, 0, 58, 0, 29,
+  9, 0, 26, 52, 0, 59, 72, 36, 0, 44,
+  0, 0, 84, 12, 0, 0, 22, 0, 0, 42,
+  0, 0, 0, 0, 0, 0, 47, 0, 62, 0,
+  0, 0, 2, 50, 38, 28, 0, 0, 0, 0,
+  77, 11, 8, 0, 0, 21, 0, 22, 43, 0,
+  0, 57, 0, 32, 0, 0, 0, 0, 0, 79,
+  66, 0, 0, 0, 15, 0, 10, 29, 0, 69,
+  0, 1, 0, 0, 0, 0, 0, 36, 65, 0,
+  62, 0, 139, 0, 57, 16, 25, 0, 0, 100,
+  25, 10, 0, 0, 70, 30, 19, 50, 0, 57,
+  14, 13, 11, 54, 10, 51, 32, 74, 0, 0,
+  0, 42, 41, 47, 55, 47, 140, 28, 0, 6,
+  69, 0, 51, 0, 0, 0, 0, 61, 0, 0,
+  55, 28, 10, 25, 39, 0, 0, 40, 29, 63,
+  62, 56, 3, 0, 0, 4, 0, 42, 0, 0,
+  18, 10, 0, 13, 27, 0, 4, 2, 3, 7,
+  57, 0, 55, 33, 0, 39, 43, 0, 86, 34,
+  0, 21, 5, 0, 34, 32, 104, 0, 59, 5,
+  0, 0, 22, 8, 33, 0, 3, 36, 0, 11,
+  27, 0, 66, 0, 37, 39, 34, 16, 38, 0,
+  27, 2, 5, 0, 0, 0, 0, 19, 44, 4,
+  64, 0, 73, 0, 11, 0, 0, 123, 31, 8,
+  0, 0, 58, 2, 5, 19, 0, 61, 49, 0,
+  0, 22, 6, 34, 22, 59, 0, 0, 47, 46,
+  38, 9, 61, 16, 179, 16, 0, 0, 76, 0,
+  51, 37, 0, 0, 40, 47, 0, 0, 71, 33,
+  17, 78, 26, 17, 0, 47, 0, 63, 77, 0,
+  7, 0, 7, 0, 0, 10, 13, 30, 0, 26,
+  0, 3, 14, 0, 1, 0, 72, 10, 34, 0,
+  44, 21, 8, 54, 16, 0, 64, 0, 25, 21,
+  0, 5, 39, 21, 53, 0, 0, 0, 23, 0,
+  9, 12, 0, 0, 0, 25, 0, 51, 27, 5,
+  41, 0, 55, 0, 0, 34, 30, 0, 0, 7,
+  0, 0, 0, 10, 31, 34, 58, 5, 0, 0,
+  20, 0, 0, 0, 5, 63, 0, 6, 0, 6,
+  70, 9, 0, 0, 0, 80, 68, 0, 0, 0,
+  4, 24, 17, 28, 10, 34, 89, 45, 45, 0,
+  53, 4, 206, 0, 0, 11, 57, 5, 17, 54,
+  0, 0, 60, 39, 0, 0, 1, 61, 12, 128,
+  21, 26, 0, 14, 0, 73, 56, 0, 20, 6,
+  28, 0, 28, 0, 56, 44, 0, 46, 15, 2,
+  13, 32, 46, 0, 134, 11, 24, 0, 54, 0,
+  56, 54, 12, 0, 36, 0, 34, 0, 0, 7,
+  35, 1, 23, 0, 0, 0, 35, 0, 0, 29,
+  0, 0, 59, 43, 6, 53, 7, 33, 53, 18,
+  22, 0, 0, 36, 0, 23, 0, 10, 0, 29,
+  0, 20, 61, 20, 68, 0, 0, 0, 0, 0,
+  0, 0, 0, 102, 14, 0, 4, 0, 39, 0,
+  27, 51, 8, 13, 23, 3, 26, 91, 67, 61,
+  21, 56, 0, 0, 0, 56, 53, 69, 6, 74,
+  0, 0, 14, 0, 81, 1, 0, 0, 0, 25,
+  0, 38, 0, 16, 42, 22, 1, 7, 22, 19,
+  0, 49, 2, 1, 68, 52, 0, 0, 0, 9,
+  0, 50, 0, 0, 0, 0, 0, 0, 91, 11,
+  34, 0, 0, 0, 15, 26, 42, 23, 0, 6,
+  0, 4, 107, 11, 0, 0, 11, 8, 10, 15,
+  30, 12, 42, 45, 0, 41, 0, 10, 0, 0,
+  0, 81, 0, 0, 14, 0, 46, 0, 23, 15,
+  32, 37, 0, 0, 0, 0, 0, 0, 0, 0,
+  12, 0, 30, 11, 149, 0, 76, 0, 46, 0,
+  0, 131, 52, 5, 17, 0, 45, 0, 11, 44,
+  5, 23, 60, 0, 17, 55, 55, 49, 15, 72,
+  0, 0, 12, 32, 54, 53, 11, 54, 0, 20,
+  0, 0, 76, 0, 17, 0, 0, 0, 0, 41,
+  0, 25, 68, 41, 28, 22, 40, 0, 0, 52,
+  0, 3, 85, 24, 0, 0, 0, 0, 0, 44,
+  4, 0, 0, 5, 0, 0, 29, 13, 13, 0,
+  0, 0, 8, 16, 74, 5, 15, 32, 0, 0,
+  97, 0, 0, 0, 14, 0, 30, 16, 22, 9,
+  0, 0, 0, 20, 0, 26, 0, 0, 0, 38,
+  5, 16, 9, 0, 39, 0, 48, 8, 25, 53,
+  0, 0, 0, 5, 0, 0, 0, 24, 33, 0,
+  34, 5, 77, 0, 62, 0, 29, 0, 0, 75,
+  0, 0, 5, 14, 48, 1, 0, 0, 0, 56,
+  51, 0, 0, 4, 32, 10, 13, 41, 0, 10,
+  71, 13, 29, 0, 10, 14, 0, 17, 0, 0,
+  42, 0, 5, 27, 0, 0, 9, 20, 0, 26,
+  0, 66, 11, 74, 35, 26, 0, 2, 0, 16,
+  68, 0, 0, 0, 30, 0, 1, 5, 28, 45,
+  0, 49, 0, 0, 0, 37, 29, 0, 51, 0,
+  22, 9, 83, 12, 47, 23, 0, 0, 69, 0,
+  4, 0, 38, 0, 23, 2, 0, 0, 0, 0,
+  0, 6, 0, 38, 0, 0, 22, 49, 15, 29,
+  19, 13, 22, 0, 31, 11, 0, 28, 0, 0,
+  0, 0, 0, 0, 0, 19, 71, 6, 22, 4,
+  0, 0, 22, 0, 10, 0, 0, 39, 0, 0,
+  0, 29, 0, 0, 78, 47, 0, 0, 30, 0,
+  0, 88, 39, 61, 6, 17, 0, 0, 0, 41,
+  0, 0, 7, 53, 6, 0, 17, 0, 36, 0,
+  0, 0, 35, 96, 0, 0, 48, 0, 9, 30,
+  0, 28, 42, 19, 0, 0, 0, 32, 2, 0,
+  4, 101, 46, 8, 0, 0, 0, 0, 0, 0,
+  66, 0, 6, 4, 24, 53, 52, 0, 17, 37,
+  0, 49, 0, 0, 5, 0, 39, 0, 0, 0,
+  0, 1, 0, 30, 51, 0, 0, 131, 0, 0,
+  11, 0, 0, 0, 0, 86, 87, 31, 0, 0,
+  0, 0, 0, 48, 0, 13, 0, 11, 0, 8,
+  2, 0, 0, 2, 51, 0, 25, 0, 41, 0,
+  28, 12, 43, 0, 0, 93, 41, 0, 7, 0,
+  52, 3, 86, 40, 12, 0, 76, 3, 0, 125,
+  70, 39, 2, 33, 0, 0, 0, 54, 36, 13,
+  16, 61, 3, 0, 21, 0, 90, 1, 0, 0,
+  0, 58, 0, 29, 9, 0, 26, 52, 0, 59,
+  72, 36, 0, 44, 0, 0, 84, 12, 0, 0,
+  22, 0, 0, 42, 0, 0, 0, 0, 0, 0,
+  47, 0, 62, 0, 0, 0, 2, 50, 38, 28,
+  0, 0, 0, 0, 77, 11, 8, 0, 0, 21,
+  0, 22, 43, 0, 0, 57, 0, 32, 0, 0,
+  0, 0, 0, 79, 66, 0, 0, 0, 15, 0,
+  10, 29, 0, 69, 0, 1, 0, 0, 0, 0,
+  0, 36, 65, 0, 62, 0, 139, 0, 57, 16,
+  25, 0, 0, 58, 49, 0, 14, 0, 50, 16,
+  63, 8, 3, 26, 61, 1, 7, 53, 52, 0,
+  0, 15, 0, 27, 43, 19, 23, 0, 0, 13,
+  0, 0, 0, 0, 41, 0, 0, 6, 0, 16,
+  0, 79, 0, 24, 0, 55, 1, 70, 61, 46,
+  0, 21, 0, 20, 72, 1, 0, 0, 29, 0,
+  0, 0, 15, 36, 0, 43, 0, 14, 0, 0,
+  79, 0, 0, 0, 7, 27, 66, 15, 34, 28,
+  0, 0, 79, 0, 29, 0, 25, 0, 16, 0,
+  0, 0, 0, 0, 0, 17, 0, 26, 0, 0,
+  5, 71, 31, 0, 0, 0, 26, 0, 28, 0,
+  0, 38, 0, 0, 0, 2, 0, 0, 2, 14,
+  69, 0, 27, 0, 63, 0, 43, 7, 17, 0,
+  0, 123, 31, 8, 0, 0, 58, 2, 5, 19,
+  0, 61, 49, 0, 0, 22, 6, 34, 22, 59,
+  0, 0, 47, 46, 38, 9, 61, 16, 179, 16,
+  0, 0, 76, 0, 51, 37, 0, 0, 40, 47,
+  0, 0, 71, 33, 17, 78, 26, 17, 0, 47,
+  0, 63, 77, 0, 7, 0, 7, 0, 0, 10,
+  13, 30, 0, 26, 0, 3, 14, 0, 1, 0,
+  72, 10, 34, 0, 44, 21, 8, 54, 16, 0,
+  64, 0, 25, 21, 0, 5, 39, 21, 53, 0,
+  0, 0, 23, 0, 9, 12, 0, 0, 0, 25,
+  0, 51, 27, 5, 41, 0, 55, 0, 0, 34,
+  30, 0, 0, 7, 0, 0, 0, 10, 31, 34,
+  58, 5, 0, 0, 20, 0, 0, 0, 5, 63,
+  0, 6, 0, 6, 70, 9, 0, 0, 0, 80,
+  68, 0, 0, 0, 4, 24, 17, 28, 10, 34,
+  89, 45, 45, 0, 53, 4, 206, 0, 0, 11,
+  57, 5, 17, 54, 0, 0, 60, 39, 0, 0,
+  1, 61, 12, 128, 21, 26, 0, 14, 0, 73,
+  56, 0, 20, 6, 28, 0, 28, 0, 56, 44,
+  0, 46, 15, 2, 13, 32, 46, 0, 134, 11,
+  24, 0, 54, 0, 56, 54, 12, 0, 36, 0,
+  34, 0, 0, 7, 35, 1, 23, 0, 0, 0,
+  35, 0, 0, 29, 0, 0, 59, 43, 6, 53,
+  7, 33, 53, 18, 22, 0, 0, 36, 0, 23,
+  0, 10, 0, 29, 0, 20, 61, 20, 68, 0,
+  0, 0, 0, 0, 0, 0, 23, 19, 0, 34,
+  10, 9, 83, 40, 0, 0, 0, 24, 57, 8,
+  0, 49, 29, 55, 14, 27, 77, 6, 23, 33,
+  54, 0, 58, 20, 192, 4, 0, 22, 109, 15,
+  46, 0, 0, 37, 38, 5, 0, 0, 0, 70,
+  41, 137, 1, 46, 0, 13, 0, 79, 54, 2,
+  11, 54, 16, 0, 0, 0, 37, 0, 13, 6,
+  0, 0, 18, 17, 31, 11, 84, 0, 5, 0,
+  13, 0, 66, 45, 13, 0, 58, 0, 30, 0,
+  0, 0, 28, 0, 31, 38, 0, 18, 0, 18,
+  32, 25, 25, 0, 48, 37, 18, 2, 0, 55,
+  81, 0, 12, 13, 23, 14, 0, 32, 10, 37,
+  0, 0, 29, 0, 19, 21, 86, 0, 13, 0,
+  0, 0, 37, 12, 0, 131, 52, 5, 17, 0,
+  45, 0, 11, 44, 5, 23, 60, 0, 17, 55,
+  55, 49, 15, 72, 0, 0, 12, 32, 54, 53,
+  11, 54, 0, 20, 0, 0, 76, 0, 17, 0,
+  0, 0, 0, 41, 0, 25, 68, 41, 28, 22,
+  40, 0, 0, 52, 0, 3, 85, 24, 0, 0,
+  0, 0, 0, 44, 4, 0, 0, 5, 0, 0,
+  29, 13, 13, 0, 0, 0, 8, 16, 74, 5,
+  15, 32, 0, 0, 97, 0, 0, 0, 14, 0,
+  30, 16, 22, 9, 0, 0, 0, 20, 0, 26,
+  0, 0, 0, 38, 5, 16, 9, 0, 39, 0,
+  48, 8, 25, 53, 0, 0, 0, 5, 0, 0,
+  0, 24, 33, 0, 34, 5, 77, 0, 62, 0,
+  29, 0, 0, 75, 0, 0, 5, 14, 48, 1,
+  0, 0, 0, 56, 51, 0, 0, 4, 32, 10,
+  13, 41, 0, 10, 71, 13, 29, 0, 10, 14,
+  0, 17, 0, 0, 42, 0, 5, 27, 0, 0,
+  9, 20, 0, 26, 0, 66, 11, 74, 35, 26,
+  0, 2, 0, 16, 68, 0, 0, 0, 30, 0,
+  1, 5, 28, 45, 0, 49, 0, 0, 0, 37,
+  29, 0, 51, 0, 22, 9, 83, 12, 47, 23,
+  0, 0, 69, 0, 4, 0, 38, 0, 23, 2,
+  0, 0, 0, 0, 0, 6, 0, 38, 0, 0,
+  22, 49, 15, 29, 19, 13, 22, 0, 31, 11,
+  0, 28, 0, 0, 0, 0, 0, 0, 0, 19,
+  71, 6, 22, 4, 0, 0, 22, 0, 10, 0,
+  7, 18, 0, 16, 0, 21, 57, 17, 0, 0,
+  0, 41, 57, 2, 0, 6, 60, 44, 5, 5,
+  45, 0, 15, 0, 37, 0, 27, 0, 0, 35,
+  0, 0, 85, 0, 0, 0, 0, 5, 0, 0,
+  0, 23, 0, 64, 4, 113, 25, 79, 0, 0,
+  0, 41, 66, 0, 0, 22, 11, 0, 0, 0,
+  15, 0, 0, 2, 0, 0, 0, 36, 38, 0,
+  60, 0, 2, 0, 50, 0, 47, 0, 0, 0,
+  62, 0, 47, 0, 7, 0, 20, 0, 0, 8,
+  0, 4, 0, 8, 0, 7, 0, 0, 51, 44,
+  26, 26, 0, 37, 18, 0, 29, 6, 9, 13,
+  0, 18, 0, 17, 0, 0, 6, 0, 36, 0,
+  37, 0, 37, 0, 0, 0, 38, 0, 0, 93,
+  41, 0, 7, 0, 52, 3, 86, 40, 12, 0,
+  76, 3, 0, 125, 70, 39, 2, 33, 0, 0,
+  0, 54, 36, 13, 16, 61, 3, 0, 21, 0,
+  90, 1, 0, 0, 0, 58, 0, 29, 9, 0,
+  26, 52, 0, 59, 72, 36, 0, 44, 0, 0,
+  84, 12, 0, 0, 22, 0, 0, 42, 0, 0,
+  0, 0, 0, 0, 47, 0, 62, 0, 0, 0,
+  2, 50, 38, 28, 0, 0, 0, 0, 77, 11,
+  8, 0, 0, 21, 0, 22, 43, 0, 0, 57,
+  0, 32, 0, 0, 0, 0, 0, 79, 66, 0,
+  0, 0, 15, 0, 10, 29, 0, 69, 0, 1,
+  0, 0, 0, 0, 0, 36, 65, 0, 62, 0,
+  139, 0, 57, 16, 25, 0, 0, 58, 49, 0,
+  14, 0, 50, 16, 63, 8, 3, 26, 61, 1,
+  7, 53, 52, 0, 0, 15, 0, 27, 43, 19,
+  23, 0, 0, 13, 0, 0, 0, 0, 41, 0,
+  0, 6, 0, 16, 0, 79, 0, 24, 0, 55,
+  1, 70, 61, 46, 0, 21, 0, 20, 72, 1,
+  0, 0, 29, 0, 0, 0, 15, 36, 0, 43,
+  0, 14, 0, 0, 79, 0, 0, 0, 7, 27,
+  66, 15, 34, 28, 0, 0, 79, 0, 29, 0,
+  25, 0, 16, 0, 0, 0, 0, 0, 0, 17,
+  0, 26, 0, 0, 5, 71, 31, 0, 0, 0,
+  26, 0, 28, 0, 0, 38, 0, 0, 0, 2,
+  0, 0, 2, 14, 69, 0, 27, 0, 63, 0,
+  43, 7, 17, 0, 0, 6, 0, 0, 0, 1,
+  30, 12, 26, 0, 0, 25, 43, 0, 8, 23,
+  56, 23, 0, 0, 32, 29, 18, 2, 25, 0,
+  0, 0, 0, 0, 0, 0, 36, 17, 0, 0,
+  0, 0, 0, 34, 0, 11, 0, 58, 21, 87,
+  29, 59, 0, 1, 0, 52, 63, 0, 3, 0,
+  12, 0, 0, 0, 25, 4, 0, 38, 0, 10,
+  4, 0, 42, 0, 34, 0, 0, 17, 34, 0,
+  45, 41, 0, 0, 77, 0, 55, 0, 5, 0,
+  14, 0, 0, 0, 0, 31, 0, 0, 0, 22,
+  0, 0, 32, 57, 30, 0, 0, 9, 8, 0,
+  15, 0, 0, 13, 0, 14, 0, 2, 0, 0,
+  29, 0, 33, 0, 14, 0, 33, 0, 13, 6,
+  20, 0, 5, 63, 0, 6, 0, 6, 70, 9,
+  0, 0, 0, 80, 68, 0, 0, 0, 4, 24,
+  17, 28, 10, 34, 89, 45, 45, 0, 53, 4,
+  206, 0, 0, 11, 57, 5, 17, 54, 0, 0,
+  60, 39, 0, 0, 1, 61, 12, 128, 21, 26,
+  0, 14, 0, 73, 56, 0, 20, 6, 28, 0,
+  28, 0, 56, 44, 0, 46, 15, 2, 13, 32,
+  46, 0, 134, 11, 24, 0, 54, 0, 56, 54,
+  12, 0, 36, 0, 34, 0, 0, 7, 35, 1,
+  23, 0, 0, 0, 35, 0, 0, 29, 0, 0,
+  59, 43, 6, 53, 7, 33, 53, 18, 22, 0,
+  0, 36, 0, 23, 0, 10, 0, 29, 0, 20,
+  61, 20, 68, 0, 0, 0, 0, 0, 0, 0,
+  23, 19, 0, 34, 10, 9, 83, 40, 0, 0,
+  0, 24, 57, 8, 0, 49, 29, 55, 14, 27,
+  77, 6, 23, 33, 54, 0, 58, 20, 192, 4,
+  0, 22, 109, 15, 46, 0, 0, 37, 38, 5,
+  0, 0, 0, 70, 41, 137, 1, 46, 0, 13,
+  0, 79, 54, 2, 11, 54, 16, 0, 0, 0,
+  37, 0, 13, 6, 0, 0, 18, 17, 31, 11,
+  84, 0, 5, 0, 13, 0, 66, 45, 13, 0,
+  58, 0, 30, 0, 0, 0, 28, 0, 31, 38,
+  0, 18, 0, 18, 32, 25, 25, 0, 48, 37,
+  18, 2, 0, 55, 81, 0, 12, 13, 23, 14,
+  0, 32, 10, 37, 0, 0, 29, 0, 19, 21,
+  86, 0, 13, 0, 0, 0, 37, 12, 0, 33,
+  0, 8, 0, 0, 88, 51, 0, 25, 4, 29,
+  23, 1, 15, 91, 42, 50, 0, 22, 30, 0,
+  0, 49, 47, 30, 47, 45, 143, 63, 23, 6,
+  105, 25, 47, 0, 0, 39, 4, 30, 0, 3,
+  39, 25, 43, 65, 2, 47, 0, 56, 16, 77,
+  68, 39, 2, 24, 5, 0, 0, 43, 0, 0,
+  0, 26, 0, 4, 28, 0, 0, 0, 1, 21,
+  0, 0, 4, 46, 30, 14, 4, 0, 94, 0,
+  0, 19, 0, 0, 9, 3, 54, 33, 28, 12,
+  0, 25, 28, 16, 54, 0, 16, 44, 0, 0,
+  10, 24, 96, 0, 13, 21, 39, 36, 23, 10,
+  46, 34, 8, 0, 13, 0, 3, 31, 63, 19,
+  94, 0, 15, 0, 17, 0, 0, 75, 0, 0,
+  5, 14, 48, 1, 0, 0, 0, 56, 51, 0,
+  0, 4, 32, 10, 13, 41, 0, 10, 71, 13,
+  29, 0, 10, 14, 0, 17, 0, 0, 42, 0,
+  5, 27, 0, 0, 9, 20, 0, 26, 0, 66,
+  11, 74, 35, 26, 0, 2, 0, 16, 68, 0,
+  0, 0, 30, 0, 1, 5, 28, 45, 0, 49,
+  0, 0, 0, 37, 29, 0, 51, 0, 22, 9,
+  83, 12, 47, 23, 0, 0, 69, 0, 4, 0,
+  38, 0, 23, 2, 0, 0, 0, 0, 0, 6,
+  0, 38, 0, 0, 22, 49, 15, 29, 19, 13,
+  22, 0, 31, 11, 0, 28, 0, 0, 0, 0,
+  0, 0, 0, 19, 71, 6, 22, 4, 0, 0,
+  22, 0, 10, 0, 7, 18, 0, 16, 0, 21,
+  57, 17, 0, 0, 0, 41, 57, 2, 0, 6,
+  60, 44, 5, 5, 45, 0, 15, 0, 37, 0,
+  27, 0, 0, 35, 0, 0, 85, 0, 0, 0,
+  0, 5, 0, 0, 0, 23, 0, 64, 4, 113,
+  25, 79, 0, 0, 0, 41, 66, 0, 0, 22,
+  11, 0, 0, 0, 15, 0, 0, 2, 0, 0,
+  0, 36, 38, 0, 60, 0, 2, 0, 50, 0,
+  47, 0, 0, 0, 62, 0, 47, 0, 7, 0,
+  20, 0, 0, 8, 0, 4, 0, 8, 0, 7,
+  0, 0, 51, 44, 26, 26, 0, 37, 18, 0,
+  29, 6, 9, 13, 0, 18, 0, 17, 0, 0,
+  6, 0, 36, 0, 37, 0, 37, 0, 0, 0,
+  38, 0, 0, 12, 0, 42, 6, 15, 37, 28,
+  4, 4, 6, 14, 22, 0, 5, 59, 66, 39,
+  0, 24, 0, 0, 0, 20, 47, 15, 29, 33,
+  0, 35, 0, 0, 91, 34, 6, 0, 0, 11,
+  0, 10, 0, 18, 0, 22, 0, 58, 46, 78,
+  0, 43, 0, 62, 86, 46, 0, 56, 0, 0,
+  0, 20, 4, 0, 0, 0, 0, 0, 39, 0,
+  35, 6, 23, 0, 0, 0, 28, 23, 8, 0,
+  0, 0, 113, 0, 11, 9, 0, 0, 7, 22,
+  0, 0, 22, 29, 0, 8, 36, 0, 36, 0,
+  26, 59, 19, 7, 14, 19, 16, 0, 26, 17,
+  35, 32, 0, 9, 19, 42, 0, 0, 5, 0,
+  0, 0, 14, 11, 125, 0, 35, 0, 0, 0,
+  0, 58, 49, 0, 14, 0, 50, 16, 63, 8,
+  3, 26, 61, 1, 7, 53, 52, 0, 0, 15,
+  0, 27, 43, 19, 23, 0, 0, 13, 0, 0,
+  0, 0, 41, 0, 0, 6, 0, 16, 0, 79,
+  0, 24, 0, 55, 1, 70, 61, 46, 0, 21,
+  0, 20, 72, 1, 0, 0, 29, 0, 0, 0,
+  15, 36, 0, 43, 0, 14, 0, 0, 79, 0,
+  0, 0, 7, 27, 66, 15, 34, 28, 0, 0,
+  79, 0, 29, 0, 25, 0, 16, 0, 0, 0,
+  0, 0, 0, 17, 0, 26, 0, 0, 5, 71,
+  31, 0, 0, 0, 26, 0, 28, 0, 0, 38,
+  0, 0, 0, 2, 0, 0, 2, 14, 69, 0,
+  27, 0, 63, 0, 43, 7, 17, 0, 0, 6,
+  0, 0, 0, 1, 30, 12, 26, 0, 0, 25,
+  43, 0, 8, 23, 56, 23, 0, 0, 32, 29,
+  18, 2, 25, 0, 0, 0, 0, 0, 0, 0,
+  36, 17, 0, 0, 0, 0, 0, 34, 0, 11,
+  0, 58, 21, 87, 29, 59, 0, 1, 0, 52,
+  63, 0, 3, 0, 12, 0, 0, 0, 25, 4,
+  0, 38, 0, 10, 4, 0, 42, 0, 34, 0,
+  0, 17, 34, 0, 45, 41, 0, 0, 77, 0,
+  55, 0, 5, 0, 14, 0, 0, 0, 0, 31,
+  0, 0, 0, 22, 0, 0, 32, 57, 30, 0,
+  0, 9, 8, 0, 15, 0, 0, 13, 0, 14,
+  0, 2, 0, 0, 29, 0, 33, 0, 14, 0,
+  33, 0, 13, 6, 20, 0, 0, 5, 0, 30,
+  11, 9, 0, 0, 16, 0, 14, 0, 28, 0,
+  0, 43, 62, 17, 0, 4, 0, 0, 0, 14,
+  39, 0, 19, 14, 0, 0, 0, 0, 39, 51,
+  0, 0, 0, 0, 8, 0, 0, 0, 0, 26,
+  0, 76, 41, 64, 0, 17, 0, 73, 78, 15,
+  1, 58, 0, 0, 0, 0, 35, 0, 0, 26,
+  0, 0, 54, 0, 52, 39, 59, 0, 0, 16,
+  4, 0, 13, 36, 0, 0, 89, 0, 49, 0,
+  0, 20, 1, 30, 0, 0, 0, 79, 0, 0,
+  39, 0, 21, 0, 17, 79, 53, 5, 0, 14,
+  0, 0, 0, 9, 0, 17, 0, 33, 0, 25,
+  0, 0, 3, 0, 0, 0, 0, 0, 77, 0,
+  14, 5, 4, 0, 23, 19, 0, 34, 10, 9,
+  83, 40, 0, 0, 0, 24, 57, 8, 0, 49,
+  29, 55, 14, 27, 77, 6, 23, 33, 54, 0,
+  58, 20, 192, 4, 0, 22, 109, 15, 46, 0,
+  0, 37, 38, 5, 0, 0, 0, 70, 41, 137,
+  1, 46, 0, 13, 0, 79, 54, 2, 11, 54,
+  16, 0, 0, 0, 37, 0, 13, 6, 0, 0,
+  18, 17, 31, 11, 84, 0, 5, 0, 13, 0,
+  66, 45, 13, 0, 58, 0, 30, 0, 0, 0,
+  28, 0, 31, 38, 0, 18, 0, 18, 32, 25,
+  25, 0, 48, 37, 18, 2, 0, 55, 81, 0,
+  12, 13, 23, 14, 0, 32, 10, 37, 0, 0,
+  29, 0, 19, 21, 86, 0, 13, 0, 0, 0,
+  37, 12, 0, 33, 0, 8, 0, 0, 88, 51,
+  0, 25, 4, 29, 23, 1, 15, 91, 42, 50,
+  0, 22, 30, 0, 0, 49, 47, 30, 47, 45,
+  143, 63, 23, 6, 105, 25, 47, 0, 0, 39,
+  4, 30, 0, 3, 39, 25, 43, 65, 2, 47,
+  0, 56, 16, 77, 68, 39, 2, 24, 5, 0,
+  0, 43, 0, 0, 0, 26, 0, 4, 28, 0,
+  0, 0, 1, 21, 0, 0, 4, 46, 30, 14,
+  4, 0, 94, 0, 0, 19, 0, 0, 9, 3,
+  54, 33, 28, 12, 0, 25, 28, 16, 54, 0,
+  16, 44, 0, 0, 10, 24, 96, 0, 13, 21,
+  39, 36, 23, 10, 46, 34, 8, 0, 13, 0,
+  3, 31, 63, 19, 94, 0, 15, 0, 17, 0,
+  0, 98, 1, 0, 0, 0, 70, 26, 1, 40,
+  0, 18, 8, 0, 0, 55, 20, 56, 0, 28,
+  0, 0, 9, 77, 37, 43, 56, 51, 165, 33,
+  18, 0, 85, 0, 49, 0, 0, 7, 13, 31,
+  0, 0, 65, 0, 42, 42, 0, 0, 0, 51,
+  14, 68, 75, 5, 23, 0, 0, 0, 0, 38,
+  0, 3, 1, 24, 0, 20, 44, 0, 0, 18,
+  0, 29, 38, 5, 30, 64, 3, 48, 31, 0,
+  73, 0, 0, 22, 0, 9, 14, 16, 72, 24,
+  54, 0, 0, 3, 10, 1, 31, 0, 4, 29,
+  0, 13, 27, 0, 87, 0, 38, 9, 40, 53,
+  46, 4, 16, 15, 5, 0, 5, 0, 11, 52,
+  56, 10, 49, 0, 36, 0, 7, 0, 7, 18,
+  0, 16, 0, 21, 57, 17, 0, 0, 0, 41,
+  57, 2, 0, 6, 60, 44, 5, 5, 45, 0,
+  15, 0, 37, 0, 27, 0, 0, 35, 0, 0,
+  85, 0, 0, 0, 0, 5, 0, 0, 0, 23,
+  0, 64, 4, 113, 25, 79, 0, 0, 0, 41,
+  66, 0, 0, 22, 11, 0, 0, 0, 15, 0,
+  0, 2, 0, 0, 0, 36, 38, 0, 60, 0,
+  2, 0, 50, 0, 47, 0, 0, 0, 62, 0,
+  47, 0, 7, 0, 20, 0, 0, 8, 0, 4,
+  0, 8, 0, 7, 0, 0, 51, 44, 26, 26,
+  0, 37, 18, 0, 29, 6, 9, 13, 0, 18,
+  0, 17, 0, 0, 6, 0, 36, 0, 37, 0,
+  37, 0, 0, 0, 38, 0, 0, 12, 0, 42,
+  6, 15, 37, 28, 4, 4, 6, 14, 22, 0,
+  5, 59, 66, 39, 0, 24, 0, 0, 0, 20,
+  47, 15, 29, 33, 0, 35, 0, 0, 91, 34,
+  6, 0, 0, 11, 0, 10, 0, 18, 0, 22,
+  0, 58, 46, 78, 0, 43, 0, 62, 86, 46,
+  0, 56, 0, 0, 0, 20, 4, 0, 0, 0,
+  0, 0, 39, 0, 35, 6, 23, 0, 0, 0,
+  28, 23, 8, 0, 0, 0, 113, 0, 11, 9,
+  0, 0, 7, 22, 0, 0, 22, 29, 0, 8,
+  36, 0, 36, 0, 26, 59, 19, 7, 14, 19,
+  16, 0, 26, 17, 35, 32, 0, 9, 19, 42,
+  0, 0, 5, 0, 0, 0, 14, 11, 125, 0,
+  35, 0, 0, 0, 0, 93, 5, 24, 14, 0,
+  37, 16, 19, 24, 15, 1, 7, 0, 45, 74,
+  66, 43, 0, 20, 0, 0, 0, 49, 65, 69,
+  6, 62, 0, 1, 5, 0, 69, 27, 8, 0,
+  0, 8, 0, 34, 0, 35, 41, 0, 16, 0,
+  40, 0, 0, 56, 0, 37, 99, 45, 0, 4,
+  0, 17, 0, 45, 12, 0, 0, 33, 0, 12,
+  78, 0, 23, 0, 0, 0, 0, 6, 46, 35,
+  1, 18, 0, 2, 119, 0, 0, 1, 0, 16,
+  0, 27, 17, 29, 59, 0, 0, 26, 0, 8,
+  27, 0, 0, 42, 0, 0, 29, 0, 16, 0,
+  32, 10, 52, 56, 0, 0, 9, 11, 0, 0,
+  0, 0, 0, 0, 4, 23, 137, 0, 66, 0,
+  0, 0, 0, 6, 0, 0, 0, 1, 30, 12,
+  26, 0, 0, 25, 43, 0, 8, 23, 56, 23,
+  0, 0, 32, 29, 18, 2, 25, 0, 0, 0,
+  0, 0, 0, 0, 36, 17, 0, 0, 0, 0,
+  0, 34, 0, 11, 0, 58, 21, 87, 29, 59,
+  0, 1, 0, 52, 63, 0, 3, 0, 12, 0,
+  0, 0, 25, 4, 0, 38, 0, 10, 4, 0,
+  42, 0, 34, 0, 0, 17, 34, 0, 45, 41,
+  0, 0, 77, 0, 55, 0, 5, 0, 14, 0,
+  0, 0, 0, 31, 0, 0, 0, 22, 0, 0,
+  32, 57, 30, 0, 0, 9, 8, 0, 15, 0,
+  0, 13, 0, 14, 0, 2, 0, 0, 29, 0,
+  33, 0, 14, 0, 33, 0, 13, 6, 20, 0,
+  0, 5, 0, 30, 11, 9, 0, 0, 16, 0,
+  14, 0, 28, 0, 0, 43, 62, 17, 0, 4,
+  0, 0, 0, 14, 39, 0, 19, 14, 0, 0,
+  0, 0, 39, 51, 0, 0, 0, 0, 8, 0,
+  0, 0, 0, 26, 0, 76, 41, 64, 0, 17,
+  0, 73, 78, 15, 1, 58, 0, 0, 0, 0,
+  35, 0, 0, 26, 0, 0, 54, 0, 52, 39,
+  59, 0, 0, 16, 4, 0, 13, 36, 0, 0,
+  89, 0, 49, 0, 0, 20, 1, 30, 0, 0,
+  0, 79, 0, 0, 39, 0, 21, 0, 17, 79,
+  53, 5, 0, 14, 0, 0, 0, 9, 0, 17,
+  0, 33, 0, 25, 0, 0, 3, 0, 0, 0,
+  0, 0, 77, 0, 14, 5, 4, 0, 0, 37,
+  0, 30, 19, 0, 8, 0, 29, 1, 5, 0,
+  23, 0, 24, 68, 78, 31, 0, 2, 0, 0,
+  0, 40, 45, 0, 20, 28, 0, 0, 7, 0,
+  46, 69, 0, 0, 0, 8, 7, 0, 0, 0,
+  0, 16, 0, 35, 63, 39, 0, 11, 0, 42,
+  72, 27, 0, 30, 0, 4, 0, 3, 38, 0,
+  0, 31, 0, 0, 79, 0, 75, 41, 0, 0,
+  0, 12, 16, 0, 14, 1, 0, 0, 85, 0,
+  26, 0, 0, 32, 0, 18, 6, 0, 14, 72,
+  0, 6, 28, 0, 15, 0, 0, 80, 18, 0,
+  0, 7, 0, 0, 0, 0, 2, 22, 0, 30,
+  8, 22, 3, 0, 0, 0, 0, 0, 0, 0,
+  101, 0, 9, 26, 7, 0, 0, 33, 0, 8,
+  0, 0, 88, 51, 0, 25, 4, 29, 23, 1,
+  15, 91, 42, 50, 0, 22, 30, 0, 0, 49,
+  47, 30, 47, 45, 143, 63, 23, 6, 105, 25,
+  47, 0, 0, 39, 4, 30, 0, 3, 39, 25,
+  43, 65, 2, 47, 0, 56, 16, 77, 68, 39,
+  2, 24, 5, 0, 0, 43, 0, 0, 0, 26,
+  0, 4, 28, 0, 0, 0, 1, 21, 0, 0,
+  4, 46, 30, 14, 4, 0, 94, 0, 0, 19,
+  0, 0, 9, 3, 54, 33, 28, 12, 0, 25,
+  28, 16, 54, 0, 16, 44, 0, 0, 10, 24,
+  96, 0, 13, 21, 39, 36, 23, 10, 46, 34,
+  8, 0, 13, 0, 3, 31, 63, 19, 94, 0,
+  15, 0, 17, 0, 0, 98, 1, 0, 0, 0,
+  70, 26, 1, 40, 0, 18, 8, 0, 0, 55,
+  20, 56, 0, 28, 0, 0, 9, 77, 37, 43,
+  56, 51, 165, 33, 18, 0, 85, 0, 49, 0,
+  0, 7, 13, 31, 0, 0, 65, 0, 42, 42,
+  0, 0, 0, 51, 14, 68, 75, 5, 23, 0,
+  0, 0, 0, 38, 0, 3, 1, 24, 0, 20,
+  44, 0, 0, 18, 0, 29, 38, 5, 30, 64,
+  3, 48, 31, 0, 73, 0, 0, 22, 0, 9,
+  14, 16, 72, 24, 54, 0, 0, 3, 10, 1,
+  31, 0, 4, 29, 0, 13, 27, 0, 87, 0,
+  38, 9, 40, 53, 46, 4, 16, 15, 5, 0,
+  5, 0, 11, 52, 56, 10, 49, 0, 36, 0,
+  7, 0, 21, 87, 0, 17, 0, 0, 7, 0,
+  27, 18, 0, 30, 39, 0, 0, 11, 9, 43,
+  15, 26, 0, 36, 93, 68, 12, 0, 68, 46,
+  209, 0, 0, 0, 54, 0, 48, 43, 0, 0,
+  65, 3, 0, 0, 39, 14, 18, 96, 0, 0,
+  0, 10, 0, 107, 61, 0, 69, 0, 19, 0,
+  17, 0, 20, 40, 0, 0, 35, 25, 0, 0,
+  0, 58, 134, 10, 46, 0, 8, 33, 3, 95,
+  34, 0, 24, 0, 8, 20, 0, 5, 21, 22,
+  59, 0, 30, 0, 0, 0, 54, 0, 27, 0,
+  10, 43, 26, 72, 29, 15, 69, 18, 47, 0,
+  13, 38, 8, 8, 0, 1, 0, 0, 3, 0,
+  8, 49, 53, 0, 0, 0, 36, 0, 0, 0,
+  0, 12, 0, 42, 6, 15, 37, 28, 4, 4,
+  6, 14, 22, 0, 5, 59, 66, 39, 0, 24,
+  0, 0, 0, 20, 47, 15, 29, 33, 0, 35,
+  0, 0, 91, 34, 6, 0, 0, 11, 0, 10,
+  0, 18, 0, 22, 0, 58, 46, 78, 0, 43,
+  0, 62, 86, 46, 0, 56, 0, 0, 0, 20,
+  4, 0, 0, 0, 0, 0, 39, 0, 35, 6,
+  23, 0, 0, 0, 28, 23, 8, 0, 0, 0,
+  113, 0, 11, 9, 0, 0, 7, 22, 0, 0,
+  22, 29, 0, 8, 36, 0, 36, 0, 26, 59,
+  19, 7, 14, 19, 16, 0, 26, 17, 35, 32,
+  0, 9, 19, 42, 0, 0, 5, 0, 0, 0,
+  14, 11, 125, 0, 35, 0, 0, 0, 0, 93,
+  5, 24, 14, 0, 37, 16, 19, 24, 15, 1,
+  7, 0, 45, 74, 66, 43, 0, 20, 0, 0,
+  0, 49, 65, 69, 6, 62, 0, 1, 5, 0,
+  69, 27, 8, 0, 0, 8, 0, 34, 0, 35,
+  41, 0, 16, 0, 40, 0, 0, 56, 0, 37,
+  99, 45, 0, 4, 0, 17, 0, 45, 12, 0,
+  0, 33, 0, 12, 78, 0, 23, 0, 0, 0,
+  0, 6, 46, 35, 1, 18, 0, 2, 119, 0,
+  0, 1, 0, 16, 0, 27, 17, 29, 59, 0,
+  0, 26, 0, 8, 27, 0, 0, 42, 0, 0,
+  29, 0, 16, 0, 32, 10, 52, 56, 0, 0,
+  9, 11, 0, 0, 0, 0, 0, 0, 4, 23,
+  137, 0, 66, 0, 0, 0, 0, 115, 36, 17,
+  6, 0, 3, 0, 44, 17, 0, 0, 3, 0,
+  0, 24, 36, 38, 6, 35, 0, 0, 67, 53,
+  19, 0, 40, 54, 0, 0, 0, 0, 68, 0,
+  53, 8, 0, 0, 28, 2, 0, 0, 37, 25,
+  0, 67, 27, 0, 0, 2, 0, 53, 88, 0,
+  20, 0, 26, 0, 0, 0, 0, 27, 0, 0,
+  0, 0, 0, 0, 0, 14, 53, 0, 37, 17,
+  61, 42, 0, 74, 24, 0, 64, 0, 4, 21,
+  0, 0, 6, 36, 25, 20, 74, 0, 0, 0,
+  24, 0, 0, 0, 0, 53, 38, 17, 0, 0,
+  21, 4, 62, 0, 41, 58, 0, 16, 0, 3,
+  0, 0, 0, 0, 0, 6, 0, 0, 35, 0,
+  53, 1, 0, 0, 0, 5, 0, 30, 11, 9,
+  0, 0, 16, 0, 14, 0, 28, 0, 0, 43,
+  62, 17, 0, 4, 0, 0, 0, 14, 39, 0,
+  19, 14, 0, 0, 0, 0, 39, 51, 0, 0,
+  0, 0, 8, 0, 0, 0, 0, 26, 0, 76,
+  41, 64, 0, 17, 0, 73, 78, 15, 1, 58,
+  0, 0, 0, 0, 35, 0, 0, 26, 0, 0,
+  54, 0, 52, 39, 59, 0, 0, 16, 4, 0,
+  13, 36, 0, 0, 89, 0, 49, 0, 0, 20,
+  1, 30, 0, 0, 0, 79, 0, 0, 39, 0,
+  21, 0, 17, 79, 53, 5, 0, 14, 0, 0,
+  0, 9, 0, 17, 0, 33, 0, 25, 0, 0,
+  3, 0, 0, 0, 0, 0, 77, 0, 14, 5,
+  4, 0, 0, 37, 0, 30, 19, 0, 8, 0,
+  29, 1, 5, 0, 23, 0, 24, 68, 78, 31,
+  0, 2, 0, 0, 0, 40, 45, 0, 20, 28,
+  0, 0, 7, 0, 46, 69, 0, 0, 0, 8,
+  7, 0, 0, 0, 0, 16, 0, 35, 63, 39,
+  0, 11, 0, 42, 72, 27, 0, 30, 0, 4,
+  0, 3, 38, 0, 0, 31, 0, 0, 79, 0,
+  75, 41, 0, 0, 0, 12, 16, 0, 14, 1,
+  0, 0, 85, 0, 26, 0, 0, 32, 0, 18,
+  6, 0, 14, 72, 0, 6, 28, 0, 15, 0,
+  0, 80, 18, 0, 0, 7, 0, 0, 0, 0,
+  2, 22, 0, 30, 8, 22, 3, 0, 0, 0,
+  0, 0, 0, 0, 101, 0, 9, 26, 7, 0,
+  0, 119, 31, 10, 0, 0, 55, 0, 33, 18,
+  0, 0, 0, 0, 46, 39, 65, 38, 5, 18,
+  0, 0, 0, 46, 49, 6, 24, 40, 0, 0,
+  0, 0, 84, 26, 0, 0, 0, 16, 0, 3,
+  0, 0, 24, 17, 0, 45, 64, 6, 0, 10,
+  0, 0, 73, 0, 0, 0, 32, 0, 0, 35,
+  7, 5, 0, 0, 0, 0, 63, 0, 26, 11,
+  0, 0, 0, 15, 64, 26, 8, 27, 5, 0,
+  67, 3, 18, 28, 0, 6, 0, 0, 1, 26,
+  36, 0, 0, 22, 0, 0, 0, 0, 0, 60,
+  6, 0, 0, 0, 2, 0, 43, 0, 35, 36,
+  0, 21, 0, 19, 0, 0, 0, 0, 13, 0,
+  0, 0, 95, 0, 24, 41, 20, 0, 0, 98,
+  1, 0, 0, 0, 70, 26, 1, 40, 0, 18,
+  8, 0, 0, 55, 20, 56, 0, 28, 0, 0,
+  9, 77, 37, 43, 56, 51, 165, 33, 18, 0,
+  85, 0, 49, 0, 0, 7, 13, 31, 0, 0,
+  65, 0, 42, 42, 0, 0, 0, 51, 14, 68,
+  75, 5, 23, 0, 0, 0, 0, 38, 0, 3,
+  1, 24, 0, 20, 44, 0, 0, 18, 0, 29,
+  38, 5, 30, 64, 3, 48, 31, 0, 73, 0,
+  0, 22, 0, 9, 14, 16, 72, 24, 54, 0,
+  0, 3, 10, 1, 31, 0, 4, 29, 0, 13,
+  27, 0, 87, 0, 38, 9, 40, 53, 46, 4,
+  16, 15, 5, 0, 5, 0, 11, 52, 56, 10,
+  49, 0, 36, 0, 7, 0, 21, 87, 0, 17,
+  0, 0, 7, 0, 27, 18, 0, 30, 39, 0,
+  0, 11, 9, 43, 15, 26, 0, 36, 93, 68,
+  12, 0, 68, 46, 209, 0, 0, 0, 54, 0,
+  48, 43, 0, 0, 65, 3, 0, 0, 39, 14,
+  18, 96, 0, 0, 0, 10, 0, 107, 61, 0,
+  69, 0, 19, 0, 17, 0, 20, 40, 0, 0,
+  35, 25, 0, 0, 0, 58, 134, 10, 46, 0,
+  8, 33, 3, 95, 34, 0, 24, 0, 8, 20,
+  0, 5, 21, 22, 59, 0, 30, 0, 0, 0,
+  54, 0, 27, 0, 10, 43, 26, 72, 29, 15,
+  69, 18, 47, 0, 13, 38, 8, 8, 0, 1,
+  0, 0, 3, 0, 8, 49, 53, 0, 0, 0,
+  36, 0, 0, 0, 121, 68, 0, 69, 37, 0,
+  10, 0, 13, 0, 0, 24, 109, 0, 0, 19,
+  14, 0, 23, 0, 0, 116, 51, 34, 64, 0,
+  36, 36, 222, 0, 6, 97, 40, 17, 23, 41,
+  0, 0, 124, 6, 0, 0, 30, 56, 59, 90,
+  15, 0, 0, 12, 0, 135, 15, 0, 103, 17,
+  27, 22, 53, 0, 58, 43, 30, 87, 0, 83,
+  14, 0, 21, 25, 137, 20, 29, 0, 0, 0,
+  51, 86, 41, 0, 7, 0, 17, 24, 0, 13,
+  21, 0, 55, 9, 0, 0, 0, 0, 22, 16,
+  63, 0, 40, 42, 4, 62, 32, 21, 74, 29,
+  0, 42, 54, 0, 12, 14, 0, 0, 0, 27,
+  4, 0, 11, 38, 71, 25, 0, 34, 62, 0,
+  9, 24, 0, 93, 5, 24, 14, 0, 37, 16,
+  19, 24, 15, 1, 7, 0, 45, 74, 66, 43,
+  0, 20, 0, 0, 0, 49, 65, 69, 6, 62,
+  0, 1, 5, 0, 69, 27, 8, 0, 0, 8,
+  0, 34, 0, 35, 41, 0, 16, 0, 40, 0,
+  0, 56, 0, 37, 99, 45, 0, 4, 0, 17,
+  0, 45, 12, 0, 0, 33, 0, 12, 78, 0,
+  23, 0, 0, 0, 0, 6, 46, 35, 1, 18,
+  0, 2, 119, 0, 0, 1, 0, 16, 0, 27,
+  17, 29, 59, 0, 0, 26, 0, 8, 27, 0,
+  0, 42, 0, 0, 29, 0, 16, 0, 32, 10,
+  52, 56, 0, 0, 9, 11, 0, 0, 0, 0,
+  0, 0, 4, 23, 137, 0, 66, 0, 0, 0,
+  0, 115, 36, 17, 6, 0, 3, 0, 44, 17,
+  0, 0, 3, 0, 0, 24, 36, 38, 6, 35,
+  0, 0, 67, 53, 19, 0, 40, 54, 0, 0,
+  0, 0, 68, 0, 53, 8, 0, 0, 28, 2,
+  0, 0, 37, 25, 0, 67, 27, 0, 0, 2,
+  0, 53, 88, 0, 20, 0, 26, 0, 0, 0,
+  0, 27, 0, 0, 0, 0, 0, 0, 0, 14,
+  53, 0, 37, 17, 61, 42, 0, 74, 24, 0,
+  64, 0, 4, 21, 0, 0, 6, 36, 25, 20,
+  74, 0, 0, 0, 24, 0, 0, 0, 0, 53,
+  38, 17, 0, 0, 21, 4, 62, 0, 41, 58,
+  0, 16, 0, 3, 0, 0, 0, 0, 0, 6,
+  0, 0, 35, 0, 53, 1, 0, 0, 55, 68,
+  5, 59, 7, 0, 0, 0, 39, 0, 0, 18,
+  78, 0, 0, 0, 25, 2, 0, 0, 0, 34,
+  65, 19, 34, 0, 18, 36, 0, 0, 0, 6,
+  13, 0, 31, 16, 0, 0, 71, 0, 0, 16,
+  19, 37, 0, 40, 14, 0, 0, 0, 0, 107,
+  29, 0, 61, 0, 36, 0, 0, 0, 0, 19,
+  0, 10, 41, 34, 0, 0, 22, 0, 133, 0,
+  33, 13, 17, 0, 9, 54, 28, 7, 16, 0,
+  14, 15, 15, 0, 15, 0, 48, 0, 1, 0,
+  0, 0, 0, 0, 10, 0, 0, 40, 0, 1,
+  9, 0, 35, 68, 7, 20, 38, 3, 0, 13,
+  0, 0, 0, 0, 0, 0, 0, 9, 0, 0,
+  0, 0, 53, 0, 0, 0, 0, 37, 0, 30,
+  19, 0, 8, 0, 29, 1, 5, 0, 23, 0,
+  24, 68, 78, 31, 0, 2, 0, 0, 0, 40,
+  45, 0, 20, 28, 0, 0, 7, 0, 46, 69,
+  0, 0, 0, 8, 7, 0, 0, 0, 0, 16,
+  0, 35, 63, 39, 0, 11, 0, 42, 72, 27,
+  0, 30, 0, 4, 0, 3, 38, 0, 0, 31,
+  0, 0, 79, 0, 75, 41, 0, 0, 0, 12,
+  16, 0, 14, 1, 0, 0, 85, 0, 26, 0,
+  0, 32, 0, 18, 6, 0, 14, 72, 0, 6,
+  28, 0, 15, 0, 0, 80, 18, 0, 0, 7,
+  0, 0, 0, 0, 2, 22, 0, 30, 8, 22,
+  3, 0, 0, 0, 0, 0, 0, 0, 101, 0,
+  9, 26, 7, 0, 0, 119, 31, 10, 0, 0,
+  55, 0, 33, 18, 0, 0, 0, 0, 46, 39,
+  65, 38, 5, 18, 0, 0, 0, 46, 49, 6,
+  24, 40, 0, 0, 0, 0, 84, 26, 0, 0,
+  0, 16, 0, 3, 0, 0, 24, 17, 0, 45,
+  64, 6, 0, 10, 0, 0, 73, 0, 0, 0,
+  32, 0, 0, 35, 7, 5, 0, 0, 0, 0,
+  63, 0, 26, 11, 0, 0, 0, 15, 64, 26,
+  8, 27, 5, 0, 67, 3, 18, 28, 0, 6,
+  0, 0, 1, 26, 36, 0, 0, 22, 0, 0,
+  0, 0, 0, 60, 6, 0, 0, 0, 2, 0,
+  43, 0, 35, 36, 0, 21, 0, 19, 0, 0,
+  0, 0, 13, 0, 0, 0, 95, 0, 24, 41,
+  20, 0, 0, 104, 16, 18, 0, 0, 0, 0,
+  47, 19, 0, 0, 6, 0, 7, 17, 36, 23,
+  0, 2, 0, 0, 72, 39, 0, 0, 14, 29,
+  0, 0, 0, 0, 40, 0, 36, 14, 0, 1,
+  11, 0, 0, 0, 22, 32, 0, 52, 25, 0,
+  0, 0, 0, 42, 40, 0, 22, 0, 44, 0,
+  3, 0, 0, 33, 0, 0, 52, 0, 0, 0,
+  0, 10, 106, 0, 39, 32, 46, 45, 0, 59,
+  28, 0, 21, 0, 1, 31, 0, 0, 5, 21,
+  26, 0, 31, 0, 0, 0, 5, 0, 0, 0,
+  0, 52, 28, 23, 1, 0, 7, 59, 48, 1,
+  0, 29, 0, 28, 0, 8, 0, 0, 0, 0,
+  0, 12, 0, 0, 0, 0, 49, 26, 5, 0,
+  21, 87, 0, 17, 0, 0, 7, 0, 27, 18,
+  0, 30, 39, 0, 0, 11, 9, 43, 15, 26,
+  0, 36, 93, 68, 12, 0, 68, 46, 209, 0,
+  0, 0, 54, 0, 48, 43, 0, 0, 65, 3,
+  0, 0, 39, 14, 18, 96, 0, 0, 0, 10,
+  0, 107, 61, 0, 69, 0, 19, 0, 17, 0,
+  20, 40, 0, 0, 35, 25, 0, 0, 0, 58,
+  134, 10, 46, 0, 8, 33, 3, 95, 34, 0,
+  24, 0, 8, 20, 0, 5, 21, 22, 59, 0,
+  30, 0, 0, 0, 54, 0, 27, 0, 10, 43,
+  26, 72, 29, 15, 69, 18, 47, 0, 13, 38,
+  8, 8, 0, 1, 0, 0, 3, 0, 8, 49,
+  53, 0, 0, 0, 36, 0, 0, 0, 121, 68,
+  0, 69, 37, 0, 10, 0, 13, 0, 0, 24,
+  109, 0, 0, 19, 14, 0, 23, 0, 0, 116,
+  51, 34, 64, 0, 36, 36, 222, 0, 6, 97,
+  40, 17, 23, 41, 0, 0, 124, 6, 0, 0,
+  30, 56, 59, 90, 15, 0, 0, 12, 0, 135,
+  15, 0, 103, 17, 27, 22, 53, 0, 58, 43,
+  30, 87, 0, 83, 14, 0, 21, 25, 137, 20,
+  29, 0, 0, 0, 51, 86, 41, 0, 7, 0,
+  17, 24, 0, 13, 21, 0, 55, 9, 0, 0,
+  0, 0, 22, 16, 63, 0, 40, 42, 4, 62,
+  32, 21, 74, 29, 0, 42, 54, 0, 12, 14,
+  0, 0, 0, 27, 4, 0, 11, 38, 71, 25,
+  0, 34, 62, 0, 9, 24, 66, 10, 0, 31,
+  29, 110, 12, 0, 20, 0, 0, 9, 85, 0,
+  0, 46, 16, 30, 0, 0, 33, 111, 0, 60,
+  48, 0, 3, 44, 255, 0, 0, 72, 42, 37,
+  17, 24, 0, 22, 96, 20, 32, 0, 17, 61,
+  85, 122, 14, 0, 0, 23, 0, 130, 26, 0,
+  91, 47, 26, 11, 67, 0, 34, 60, 32, 28,
+  0, 46, 0, 4, 12, 28, 143, 0, 41, 3,
+  0, 22, 11, 56, 20, 0, 23, 0, 1, 24,
+  0, 0, 19, 5, 50, 28, 0, 55, 8, 0,
+  61, 18, 20, 0, 39, 55, 9, 30, 21, 7,
+  86, 7, 1, 22, 0, 7, 0, 16, 0, 0,
+  0, 31, 20, 0, 35, 34, 69, 0, 0, 44,
+  59, 0, 6, 4, 0, 115, 36, 17, 6, 0,
+  3, 0, 44, 17, 0, 0, 3, 0, 0, 24,
+  36, 38, 6, 35, 0, 0, 67, 53, 19, 0,
+  40, 54, 0, 0, 0, 0, 68, 0, 53, 8,
+  0, 0, 28, 2, 0, 0, 37, 25, 0, 67,
+  27, 0, 0, 2, 0, 53, 88, 0, 20, 0,
+  26, 0, 0, 0, 0, 27, 0, 0, 0, 0,
+  0, 0, 0, 14, 53, 0, 37, 17, 61, 42,
+  0, 74, 24, 0, 64, 0, 4, 21, 0, 0,
+  6, 36, 25, 20, 74, 0, 0, 0, 24, 0,
+  0, 0, 0, 53, 38, 17, 0, 0, 21, 4,
+  62, 0, 41, 58, 0, 16, 0, 3, 0, 0,
+  0, 0, 0, 6, 0, 0, 35, 0, 53, 1,
+  0, 0, 55, 68, 5, 59, 7, 0, 0, 0,
+  39, 0, 0, 18, 78, 0, 0, 0, 25, 2,
+  0, 0, 0, 34, 65, 19, 34, 0, 18, 36,
+  0, 0, 0, 6, 13, 0, 31, 16, 0, 0,
+  71, 0, 0, 16, 19, 37, 0, 40, 14, 0,
+  0, 0, 0, 107, 29, 0, 61, 0, 36, 0,
+  0, 0, 0, 19, 0, 10, 41, 34, 0, 0,
+  22, 0, 133, 0, 33, 13, 17, 0, 9, 54,
+  28, 7, 16, 0, 14, 15, 15, 0, 15, 0,
+  48, 0, 1, 0, 0, 0, 0, 0, 10, 0,
+  0, 40, 0, 1, 9, 0, 35, 68, 7, 20,
+  38, 3, 0, 13, 0, 0, 0, 0, 0, 0,
+  0, 9, 0, 0, 0, 0, 53, 0, 0, 0,
+  104, 21, 0, 47, 20, 66, 0, 0, 53, 0,
+  0, 0, 116, 0, 0, 40, 62, 0, 2, 0,
+  11, 68, 0, 8, 23, 0, 0, 43, 3, 1,
+  13, 72, 0, 27, 24, 0, 0, 21, 96, 5,
+  13, 87, 14, 47, 59, 16, 0, 0, 0, 0,
+  0, 111, 0, 0, 107, 59, 25, 17, 19, 0,
+  0, 13, 9, 35, 0, 93, 0, 0, 13, 0,
+  155, 30, 22, 32, 0, 0, 34, 19, 0, 47,
+  0, 0, 15, 14, 42, 14, 8, 0, 73, 0,
+  0, 0, 0, 2, 0, 0, 31, 0, 21, 50,
+  0, 0, 5, 0, 30, 31, 0, 67, 22, 0,
+  17, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+  0, 3, 0, 16, 53, 0, 3, 16, 0, 119,
+  31, 10, 0, 0, 55, 0, 33, 18, 0, 0,
+  0, 0, 46, 39, 65, 38, 5, 18, 0, 0,
+  0, 46, 49, 6, 24, 40, 0, 0, 0, 0,
+  84, 26, 0, 0, 0, 16, 0, 3, 0, 0,
+  24, 17, 0, 45, 64, 6, 0, 10, 0, 0,
+  73, 0, 0, 0, 32, 0, 0, 35, 7, 5,
+  0, 0, 0, 0, 63, 0, 26, 11, 0, 0,
+  0, 15, 64, 26, 8, 27, 5, 0, 67, 3,
+  18, 28, 0, 6, 0, 0, 1, 26, 36, 0,
+  0, 22, 0, 0, 0, 0, 0, 60, 6, 0,
+  0, 0, 2, 0, 43, 0, 35, 36, 0, 21,
+  0, 19, 0, 0, 0, 0, 13, 0, 0, 0,
+  95, 0, 24, 41, 20, 0, 0, 104, 16, 18,
+  0, 0, 0, 0, 47, 19, 0, 0, 6, 0,
+  7, 17, 36, 23, 0, 2, 0, 0, 72, 39,
+  0, 0, 14, 29, 0, 0, 0, 0, 40, 0,
+  36, 14, 0, 1, 11, 0, 0, 0, 22, 32,
+  0, 52, 25, 0, 0, 0, 0, 42, 40, 0,
+  22, 0, 44, 0, 3, 0, 0, 33, 0, 0,
+  52, 0, 0, 0, 0, 10, 106, 0, 39, 32,
+  46, 45, 0, 59, 28, 0, 21, 0, 1, 31,
+  0, 0, 5, 21, 26, 0, 31, 0, 0, 0,
+  5, 0, 0, 0, 0, 52, 28, 23, 1, 0,
+  7, 59, 48, 1, 0, 29, 0, 28, 0, 8,
+  0, 0, 0, 0, 0, 12, 0, 0, 0, 0,
+  49, 26, 5, 0, 107, 66, 16, 65, 30, 0,
+  0, 17, 71, 14, 28, 0, 85, 0, 0, 80,
+  60, 0, 13, 0, 0, 32, 32, 6, 0, 0,
+  0, 61, 0, 37, 19, 69, 10, 6, 18, 5,
+  0, 44, 103, 0, 0, 23, 0, 23, 18, 0,
+  0, 0, 0, 0, 0, 86, 0, 0, 83, 13,
+  32, 36, 9, 0, 0, 0, 0, 0, 15, 55,
+  0, 0, 11, 0, 91, 19, 43, 55, 0, 39,
+  28, 49, 0, 26, 0, 0, 19, 64, 28, 26,
+  14, 0, 86, 0, 32, 0, 0, 14, 0, 0,
+  66, 0, 5, 67, 43, 0, 9, 0, 0, 58,
+  0, 60, 9, 0, 6, 0, 0, 0, 0, 0,
+  0, 0, 0, 15, 0, 4, 0, 18, 46, 15,
+  12, 30, 121, 68, 0, 69, 37, 0, 10, 0,
+  13, 0, 0, 24, 109, 0, 0, 19, 14, 0,
+  23, 0, 0, 116, 51, 34, 64, 0, 36, 36,
+  222, 0, 6, 97, 40, 17, 23, 41, 0, 0,
+  124, 6, 0, 0, 30, 56, 59, 90, 15, 0,
+  0, 12, 0, 135, 15, 0, 103, 17, 27, 22,
+  53, 0, 58, 43, 30, 87, 0, 83, 14, 0,
+  21, 25, 137, 20, 29, 0, 0, 0, 51, 86,
+  41, 0, 7, 0, 17, 24, 0, 13, 21, 0,
+  55, 9, 0, 0, 0, 0, 22, 16, 63, 0,
+  40, 42, 4, 62, 32, 21, 74, 29, 0, 42,
+  54, 0, 12, 14, 0, 0, 0, 27, 4, 0,
+  11, 38, 71, 25, 0, 34, 62, 0, 9, 24,
+  66, 10, 0, 31, 29, 110, 12, 0, 20, 0,
+  0, 9, 85, 0, 0, 46, 16, 30, 0, 0,
+  33, 111, 0, 60, 48, 0, 3, 44, 255, 0,
+  0, 72, 42, 37, 17, 24, 0, 22, 96, 20,
+  32, 0, 17, 61, 85, 122, 14, 0, 0, 23,
+  0, 130, 26, 0, 91, 47, 26, 11, 67, 0,
+  34, 60, 32, 28, 0, 46, 0, 4, 12, 28,
+  143, 0, 41, 3, 0, 22, 11, 56, 20, 0,
+  23, 0, 1, 24, 0, 0, 19, 5, 50, 28,
+  0, 55, 8, 0, 61, 18, 20, 0, 39, 55,
+  9, 30, 21, 7, 86, 7, 1, 22, 0, 7,
+  0, 16, 0, 0, 0, 31, 20, 0, 35, 34,
+  69, 0, 0, 44, 59, 0, 6, 4, 0, 38,
+  0, 0, 7, 72, 57, 6, 59, 17, 0, 6,
+  46, 16, 0, 163, 49, 58, 0, 0, 76, 0,
+  0, 90, 29, 28, 5, 40, 214, 33, 0, 0,
+  89, 29, 32, 0, 0, 53, 10, 75, 12, 0,
+  0, 45, 49, 87, 5, 9, 0, 73, 3, 65,
+  107, 1, 7, 49, 22, 23, 0, 54, 0, 5,
+  0, 32, 0, 1, 11, 0, 25, 0, 29, 0,
+  39, 11, 0, 97, 0, 37, 0, 1, 62, 0,
+  14, 26, 0, 4, 35, 12, 60, 53, 62, 78,
+  0, 3, 68, 5, 0, 0, 50, 64, 14, 0,
+  0, 0, 76, 0, 29, 16, 1, 58, 17, 0,
+  0, 22, 0, 0, 0, 12, 39, 12, 66, 4,
+  74, 0, 59, 0, 32, 0, 55, 68, 5, 59,
+  7, 0, 0, 0, 39, 0, 0, 18, 78, 0,
+  0, 0, 25, 2, 0, 0, 0, 34, 65, 19,
+  34, 0, 18, 36, 0, 0, 0, 6, 13, 0,
+  31, 16, 0, 0, 71, 0, 0, 16, 19, 37,
+  0, 40, 14, 0, 0, 0, 0, 107, 29, 0,
+  61, 0, 36, 0, 0, 0, 0, 19, 0, 10,
+  41, 34, 0, 0, 22, 0, 133, 0, 33, 13,
+  17, 0, 9, 54, 28, 7, 16, 0, 14, 15,
+  15, 0, 15, 0, 48, 0, 1, 0, 0, 0,
+  0, 0, 10, 0, 0, 40, 0, 1, 9, 0,
+  35, 68, 7, 20, 38, 3, 0, 13, 0, 0,
+  0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
+  53, 0, 0, 0, 104, 21, 0, 47, 20, 66,
+  0, 0, 53, 0, 0, 0, 116, 0, 0, 40,
+  62, 0, 2, 0, 11, 68, 0, 8, 23, 0,
+  0, 43, 3, 1, 13, 72, 0, 27, 24, 0,
+  0, 21, 96, 5, 13, 87, 14, 47, 59, 16,
+  0, 0, 0, 0, 0, 111, 0, 0, 107, 59,
+  25, 17, 19, 0, 0, 13, 9, 35, 0, 93,
+  0, 0, 13, 0, 155, 30, 22, 32, 0, 0,
+  34, 19, 0, 47, 0, 0, 15, 14, 42, 14,
+  8, 0, 73, 0, 0, 0, 0, 2, 0, 0,
+  31, 0, 21, 50, 0, 0, 5, 0, 30, 31,
+  0, 67, 22, 0, 17, 0, 0, 0, 0, 0,
+  0, 0, 0, 1, 0, 3, 0, 16, 53, 0,
+  3, 16, 0, 0, 0, 0, 0, 145, 0, 0,
+  46, 0, 0, 0, 34, 21, 0, 109, 67, 48,
+  0, 0, 39, 1, 0, 58, 0, 0, 0, 56,
+  1, 0, 0, 0, 49, 0, 0, 0, 22, 71,
+  0, 0, 22, 0, 0, 3, 13, 87, 0, 0,
+  0, 14, 12, 53, 23, 0, 62, 19, 29, 0,
+  0, 0, 0, 48, 0, 0, 12, 0, 16, 0,
+  17, 13, 58, 0, 50, 76, 0, 66, 0, 52,
+  0, 0, 8, 0, 17, 64, 0, 25, 19, 0,
+  22, 2, 35, 128, 0, 0, 75, 0, 0, 0,
+  0, 93, 86, 0, 0, 0, 15, 0, 0, 38,
+  0, 19, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 13, 0, 4, 15,
+  0, 104, 16, 18, 0, 0, 0, 0, 47, 19,
+  0, 0, 6, 0, 7, 17, 36, 23, 0, 2,
+  0, 0, 72, 39, 0, 0, 14, 29, 0, 0,
+  0, 0, 40, 0, 36, 14, 0, 1, 11, 0,
+  0, 0, 22, 32, 0, 52, 25, 0, 0, 0,
+  0, 42, 40, 0, 22, 0, 44, 0, 3, 0,
+  0, 33, 0, 0, 52, 0, 0, 0, 0, 10,
+  106, 0, 39, 32, 46, 45, 0, 59, 28, 0,
+  21, 0, 1, 31, 0, 0, 5, 21, 26, 0,
+  31, 0, 0, 0, 5, 0, 0, 0, 0, 52,
+  28, 23, 1, 0, 7, 59, 48, 1, 0, 29,
+  0, 28, 0, 8, 0, 0, 0, 0, 0, 12,
+  0, 0, 0, 0, 49, 26, 5, 0, 107, 66,
+  16, 65, 30, 0, 0, 17, 71, 14, 28, 0,
+  85, 0, 0, 80, 60, 0, 13, 0, 0, 32,
+  32, 6, 0, 0, 0, 61, 0, 37, 19, 69,
+  10, 6, 18, 5, 0, 44, 103, 0, 0, 23,
+  0, 23, 18, 0, 0, 0, 0, 0, 0, 86,
+  0, 0, 83, 13, 32, 36, 9, 0, 0, 0,
+  0, 0, 15, 55, 0, 0, 11, 0, 91, 19,
+  43, 55, 0, 39, 28, 49, 0, 26, 0, 0,
+  19, 64, 28, 26, 14, 0, 86, 0, 32, 0,
+  0, 14, 0, 0, 66, 0, 5, 67, 43, 0,
+  9, 0, 0, 58, 0, 60, 9, 0, 6, 0,
+  0, 0, 0, 0, 0, 0, 0, 15, 0, 4,
+  0, 18, 46, 15, 12, 30, 14, 0, 60, 29,
+  0, 164, 0, 0, 18, 0, 0, 0, 3, 20,
+  0, 48, 30, 38, 0, 0, 13, 76, 24, 1,
+  0, 0, 0, 35, 0, 48, 0, 88, 0, 0,
+  0, 20, 63, 58, 24, 0, 0, 0, 0, 0,
+  0, 11, 0, 0, 13, 0, 0, 83, 0, 0,
+  99, 0, 57, 0, 22, 0, 0, 57, 14, 0,
+  110, 0, 0, 29, 2, 76, 21, 14, 67, 27,
+  0, 44, 44, 26, 0, 0, 0, 0, 32, 108,
+  0, 10, 10, 0, 11, 0, 10, 13, 0, 0,
+  58, 0, 30, 0, 0, 71, 79, 0, 0, 0,
+  0, 18, 0, 26, 0, 0, 0, 0, 0, 0,
+  4, 4, 54, 0, 0, 35, 0, 18, 0, 0,
+  0, 17, 0, 23, 66, 10, 0, 31, 29, 110,
+  12, 0, 20, 0, 0, 9, 85, 0, 0, 46,
+  16, 30, 0, 0, 33, 111, 0, 60, 48, 0,
+  3, 44, 255, 0, 0, 72, 42, 37, 17, 24,
+  0, 22, 96, 20, 32, 0, 17, 61, 85, 122,
+  14, 0, 0, 23, 0, 130, 26, 0, 91, 47,
+  26, 11, 67, 0, 34, 60, 32, 28, 0, 46,
+  0, 4, 12, 28, 143, 0, 41, 3, 0, 22,
+  11, 56, 20, 0, 23, 0, 1, 24, 0, 0,
+  19, 5, 50, 28, 0, 55, 8, 0, 61, 18,
+  20, 0, 39, 55, 9, 30, 21, 7, 86, 7,
+  1, 22, 0, 7, 0, 16, 0, 0, 0, 31,
+  20, 0, 35, 34, 69, 0, 0, 44, 59, 0,
+  6, 4, 0, 38, 0, 0, 7, 72, 57, 6,
+  59, 17, 0, 6, 46, 16, 0, 163, 49, 58,
+  0, 0, 76, 0, 0, 90, 29, 28, 5, 40,
+  214, 33, 0, 0, 89, 29, 32, 0, 0, 53,
+  10, 75, 12, 0, 0, 45, 49, 87, 5, 9,
+  0, 73, 3, 65, 107, 1, 7, 49, 22, 23,
+  0, 54, 0, 5, 0, 32, 0, 1, 11, 0,
+  25, 0, 29, 0, 39, 11, 0, 97, 0, 37,
+  0, 1, 62, 0, 14, 26, 0, 4, 35, 12,
+  60, 53, 62, 78, 0, 3, 68, 5, 0, 0,
+  50, 64, 14, 0, 0, 0, 76, 0, 29, 16,
+  1, 58, 17, 0, 0, 22, 0, 0, 0, 12,
+  39, 12, 66, 4, 74, 0, 59, 0, 32, 0,
+  0, 58, 63, 0, 7, 0, 21, 41, 98, 32,
+  26, 34, 16, 64, 0, 150, 62, 63, 48, 14,
+  52, 0, 0, 72, 12, 0, 54, 79, 175, 35,
+  0, 0, 104, 0, 8, 0, 3, 53, 0, 34,
+  0, 0, 0, 32, 8, 71, 0, 0, 0, 50,
+  34, 80, 101, 18, 30, 0, 24, 14, 0, 49,
+  0, 0, 0, 16, 0, 0, 47, 0, 11, 29,
+  0, 0, 63, 28, 0, 75, 0, 60, 0, 1,
+  62, 4, 40, 45, 0, 23, 18, 40, 92, 24,
+  106, 1, 0, 0, 68, 0, 17, 0, 31, 98,
+  42, 0, 7, 0, 83, 0, 3, 51, 27, 30,
+  31, 0, 16, 5, 20, 0, 0, 18, 0, 32,
+  51, 0, 76, 0, 65, 0, 38, 22, 104, 21,
+  0, 47, 20, 66, 0, 0, 53, 0, 0, 0,
+  116, 0, 0, 40, 62, 0, 2, 0, 11, 68,
+  0, 8, 23, 0, 0, 43, 3, 1, 13, 72,
+  0, 27, 24, 0, 0, 21, 96, 5, 13, 87,
+  14, 47, 59, 16, 0, 0, 0, 0, 0, 111,
+  0, 0, 107, 59, 25, 17, 19, 0, 0, 13,
+  9, 35, 0, 93, 0, 0, 13, 0, 155, 30,
+  22, 32, 0, 0, 34, 19, 0, 47, 0, 0,
+  15, 14, 42, 14, 8, 0, 73, 0, 0, 0,
+  0, 2, 0, 0, 31, 0, 21, 50, 0, 0,
+  5, 0, 30, 31, 0, 67, 22, 0, 17, 0,
+  0, 0, 0, 0, 0, 0, 0, 1, 0, 3,
+  0, 16, 53, 0, 3, 16, 0, 0, 0, 0,
+  0, 145, 0, 0, 46, 0, 0, 0, 34, 21,
+  0, 109, 67, 48, 0, 0, 39, 1, 0, 58,
+  0, 0, 0, 56, 1, 0, 0, 0, 49, 0,
+  0, 0, 22, 71, 0, 0, 22, 0, 0, 3,
+  13, 87, 0, 0, 0, 14, 12, 53, 23, 0,
+  62, 19, 29, 0, 0, 0, 0, 48, 0, 0,
+  12, 0, 16, 0, 17, 13, 58, 0, 50, 76,
+  0, 66, 0, 52, 0, 0, 8, 0, 17, 64,
+  0, 25, 19, 0, 22, 2, 35, 128, 0, 0,
+  75, 0, 0, 0, 0, 93, 86, 0, 0, 0,
+  15, 0, 0, 38, 0, 19, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  13, 0, 4, 15, 0, 0, 92, 0, 0, 76,
+  0, 0, 44, 0, 0, 15, 13, 93, 0, 13,
+  41, 74, 27, 0, 22, 35, 4, 32, 0, 0,
+  0, 34, 0, 0, 18, 4, 5, 0, 0, 0,
+  14, 65, 0, 0, 0, 14, 0, 0, 0, 18,
+  0, 0, 0, 0, 19, 112, 26, 0, 66, 0,
+  49, 0, 1, 0, 0, 12, 0, 0, 37, 7,
+  27, 10, 26, 96, 0, 0, 36, 15, 0, 30,
+  0, 21, 0, 0, 0, 0, 33, 83, 0, 28,
+  14, 34, 42, 0, 16, 32, 0, 0, 39, 0,
+  0, 0, 13, 107, 45, 0, 0, 0, 3, 18,
+  0, 20, 0, 5, 17, 0, 0, 0, 49, 0,
+  46, 44, 22, 4, 0, 0, 0, 0, 20, 0,
+  0, 18, 107, 66, 16, 65, 30, 0, 0, 17,
+  71, 14, 28, 0, 85, 0, 0, 80, 60, 0,
+  13, 0, 0, 32, 32, 6, 0, 0, 0, 61,
+  0, 37, 19, 69, 10, 6, 18, 5, 0, 44,
+  103, 0, 0, 23, 0, 23, 18, 0, 0, 0,
+  0, 0, 0, 86, 0, 0, 83, 13, 32, 36,
+  9, 0, 0, 0, 0, 0, 15, 55, 0, 0,
+  11, 0, 91, 19, 43, 55, 0, 39, 28, 49,
+  0, 26, 0, 0, 19, 64, 28, 26, 14, 0,
+  86, 0, 32, 0, 0, 14, 0, 0, 66, 0,
+  5, 67, 43, 0, 9, 0, 0, 58, 0, 60,
+  9, 0, 6, 0, 0, 0, 0, 0, 0, 0,
+  0, 15, 0, 4, 0, 18, 46, 15, 12, 30,
+  14, 0, 60, 29, 0, 164, 0, 0, 18, 0,
+  0, 0, 3, 20, 0, 48, 30, 38, 0, 0,
+  13, 76, 24, 1, 0, 0, 0, 35, 0, 48,
+  0, 88, 0, 0, 0, 20, 63, 58, 24, 0,
+  0, 0, 0, 0, 0, 11, 0, 0, 13, 0,
+  0, 83, 0, 0, 99, 0, 57, 0, 22, 0,
+  0, 57, 14, 0, 110, 0, 0, 29, 2, 76,
+  21, 14, 67, 27, 0, 44, 44, 26, 0, 0,
+  0, 0, 32, 108, 0, 10, 10, 0, 11, 0,
+  10, 13, 0, 0, 58, 0, 30, 0, 0, 71,
+  79, 0, 0, 0, 0, 18, 0, 26, 0, 0,
+  0, 0, 0, 0, 4, 4, 54, 0, 0, 35,
+  0, 18, 0, 0, 0, 17, 0, 23, 0, 0,
+  70, 0, 4, 150, 0, 0, 0, 0, 0, 1,
+  23, 94, 0, 0, 0, 44, 0, 0, 21, 54,
+  0, 39, 0, 0, 0, 0, 0, 45, 16, 26,
+  0, 7, 0, 0, 0, 50, 0, 0, 0, 11,
+  0, 27, 0, 8, 1, 0, 0, 0, 12, 123,
+  0, 0, 39, 0, 39, 0, 42, 0, 0, 32,
+  0, 0, 97, 0, 0, 31, 0, 64, 0, 26,
+  51, 0, 0, 17, 0, 0, 0, 0, 0, 0,
+  27, 70, 21, 0, 16, 15, 54, 0, 0, 0,
+  24, 0, 2, 0, 0, 0, 0, 60, 12, 0,
+  0, 0, 0, 79, 0, 14, 0, 5, 25, 0,
+  0, 14, 51, 41, 105, 41, 29, 52, 23, 0,
+  0, 0, 17, 23, 0, 13, 0, 38, 0, 0,
+  7, 72, 57, 6, 59, 17, 0, 6, 46, 16,
+  0, 163, 49, 58, 0, 0, 76, 0, 0, 90,
+  29, 28, 5, 40, 214, 33, 0, 0, 89, 29,
+  32, 0, 0, 53, 10, 75, 12, 0, 0, 45,
+  49, 87, 5, 9, 0, 73, 3, 65, 107, 1,
+  7, 49, 22, 23, 0, 54, 0, 5, 0, 32,
+  0, 1, 11, 0, 25, 0, 29, 0, 39, 11,
+  0, 97, 0, 37, 0, 1, 62, 0, 14, 26,
+  0, 4, 35, 12, 60, 53, 62, 78, 0, 3,
+  68, 5, 0, 0, 50, 64, 14, 0, 0, 0,
+  76, 0, 29, 16, 1, 58, 17, 0, 0, 22,
+  0, 0, 0, 12, 39, 12, 66, 4, 74, 0,
+  59, 0, 32, 0, 0, 58, 63, 0, 7, 0,
+  21, 41, 98, 32, 26, 34, 16, 64, 0, 150,
+  62, 63, 48, 14, 52, 0, 0, 72, 12, 0,
+  54, 79, 175, 35, 0, 0, 104, 0, 8, 0,
+  3, 53, 0, 34, 0, 0, 0, 32, 8, 71,
+  0, 0, 0, 50, 34, 80, 101, 18, 30, 0,
+  24, 14, 0, 49, 0, 0, 0, 16, 0, 0,
+  47, 0, 11, 29, 0, 0, 63, 28, 0, 75,
+  0, 60, 0, 1, 62, 4, 40, 45, 0, 23,
+  18, 40, 92, 24, 106, 1, 0, 0, 68, 0,
+  17, 0, 31, 98, 42, 0, 7, 0, 83, 0,
+  3, 51, 27, 30, 31, 0, 16, 5, 20, 0,
+  0, 18, 0, 32, 51, 0, 76, 0, 65, 0,
+  38, 22, 50, 21, 117, 0, 0, 33, 0, 34,
+  48, 0, 0, 21, 0, 97, 0, 11, 24, 76,
+  56, 29, 7, 79, 14, 26, 0, 0, 21, 72,
+  178, 23, 2, 77, 15, 0, 0, 17, 0, 58,
+  0, 0, 0, 0, 23, 6, 0, 52, 0, 0,
+  0, 0, 17, 138, 16, 0, 76, 0, 43, 0,
+  26, 0, 0, 0, 10, 14, 41, 10, 2, 8,
+  11, 125, 0, 0, 81, 0, 0, 29, 11, 26,
+  12, 0, 0, 0, 1, 82, 0, 0, 46, 37,
+  66, 0, 39, 0, 0, 0, 91, 0, 6, 0,
+  15, 66, 24, 0, 23, 6, 85, 90, 0, 23,
+  0, 0, 42, 20, 11, 6, 52, 0, 44, 28,
+  0, 49, 48, 0, 0, 0, 21, 0, 24, 28,
+  0, 0, 0, 0, 0, 145, 0, 0, 46, 0,
+  0, 0, 34, 21, 0, 109, 67, 48, 0, 0,
+  39, 1, 0, 58, 0, 0, 0, 56, 1, 0,
+  0, 0, 49, 0, 0, 0, 22, 71, 0, 0,
+  22, 0, 0, 3, 13, 87, 0, 0, 0, 14,
+  12, 53, 23, 0, 62, 19, 29, 0, 0, 0,
+  0, 48, 0, 0, 12, 0, 16, 0, 17, 13,
+  58, 0, 50, 76, 0, 66, 0, 52, 0, 0,
+  8, 0, 17, 64, 0, 25, 19, 0, 22, 2,
+  35, 128, 0, 0, 75, 0, 0, 0, 0, 93,
+  86, 0, 0, 0, 15, 0, 0, 38, 0, 19,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 13, 0, 4, 15, 0, 0,
+  92, 0, 0, 76, 0, 0, 44, 0, 0, 15,
+  13, 93, 0, 13, 41, 74, 27, 0, 22, 35,
+  4, 32, 0, 0, 0, 34, 0, 0, 18, 4,
+  5, 0, 0, 0, 14, 65, 0, 0, 0, 14,
+  0, 0, 0, 18, 0, 0, 0, 0, 19, 112,
+  26, 0, 66, 0, 49, 0, 1, 0, 0, 12,
+  0, 0, 37, 7, 27, 10, 26, 96, 0, 0,
+  36, 15, 0, 30, 0, 21, 0, 0, 0, 0,
+  33, 83, 0, 28, 14, 34, 42, 0, 16, 32,
+  0, 0, 39, 0, 0, 0, 13, 107, 45, 0,
+  0, 0, 3, 18, 0, 20, 0, 5, 17, 0,
+  0, 0, 49, 0, 46, 44, 22, 4, 0, 0,
+  0, 0, 20, 0, 0, 18, 0, 0, 91, 0,
+  0, 56, 0, 0, 0, 0, 0, 21, 6, 68,
+  0, 0, 3, 66, 22, 26, 0, 44, 1, 12,
+  25, 0, 0, 0, 0, 0, 35, 19, 0, 0,
+  0, 0, 0, 41, 0, 0, 0, 9, 0, 13,
+  0, 4, 17, 0, 0, 0, 11, 90, 12, 0,
+  37, 0, 34, 0, 44, 0, 0, 20, 0, 0,
+  71, 0, 0, 58, 0, 66, 0, 22, 34, 0,
+  4, 12, 0, 0, 14, 0, 0, 0, 11, 67,
+  48, 0, 47, 25, 46, 0, 0, 0, 0, 0,
+  2, 0, 0, 5, 16, 47, 0, 0, 0, 1,
+  0, 93, 0, 9, 0, 23, 27, 12, 0, 4,
+  70, 6, 57, 62, 45, 37, 28, 1, 0, 0,
+  18, 8, 3, 27, 14, 0, 60, 29, 0, 164,
+  0, 0, 18, 0, 0, 0, 3, 20, 0, 48,
+  30, 38, 0, 0, 13, 76, 24, 1, 0, 0,
+  0, 35, 0, 48, 0, 88, 0, 0, 0, 20,
+  63, 58, 24, 0, 0, 0, 0, 0, 0, 11,
+  0, 0, 13, 0, 0, 83, 0, 0, 99, 0,
+  57, 0, 22, 0, 0, 57, 14, 0, 110, 0,
+  0, 29, 2, 76, 21, 14, 67, 27, 0, 44,
+  44, 26, 0, 0, 0, 0, 32, 108, 0, 10,
+  10, 0, 11, 0, 10, 13, 0, 0, 58, 0,
+  30, 0, 0, 71, 79, 0, 0, 0, 0, 18,
+  0, 26, 0, 0, 0, 0, 0, 0, 4, 4,
+  54, 0, 0, 35, 0, 18, 0, 0, 0, 17,
+  0, 23, 0, 0, 70, 0, 4, 150, 0, 0,
+  0, 0, 0, 1, 23, 94, 0, 0, 0, 44,
+  0, 0, 21, 54, 0, 39, 0, 0, 0, 0,
+  0, 45, 16, 26, 0, 7, 0, 0, 0, 50,
+  0, 0, 0, 11, 0, 27, 0, 8, 1, 0,
+  0, 0, 12, 123, 0, 0, 39, 0, 39, 0,
+  42, 0, 0, 32, 0, 0, 97, 0, 0, 31,
+  0, 64, 0, 26, 51, 0, 0, 17, 0, 0,
+  0, 0, 0, 0, 27, 70, 21, 0, 16, 15,
+  54, 0, 0, 0, 24, 0, 2, 0, 0, 0,
+  0, 60, 12, 0, 0, 0, 0, 79, 0, 14,
+  0, 5, 25, 0, 0, 14, 51, 41, 105, 41,
+  29, 52, 23, 0, 0, 0, 17, 23, 0, 13,
+  0, 43, 48, 0, 24, 32, 13, 0, 8, 0,
+  0, 0, 63, 49, 0, 0, 3, 17, 8, 10,
+  0, 0, 0, 37, 41, 35, 6, 0, 0, 48,
+  48, 0, 0, 14, 0, 0, 0, 2, 0, 39,
+  0, 40, 0, 41, 21, 0, 3, 0, 0, 0,
+  0, 40, 61, 0, 0, 0, 14, 6, 2, 35,
+  0, 6, 0, 21, 0, 0, 0, 27, 0, 0,
+  0, 32, 20, 0, 21, 28, 0, 0, 0, 25,
+  16, 25, 21, 40, 63, 0, 39, 18, 50, 13,
+  0, 0, 32, 28, 0, 22, 0, 38, 15, 31,
+  0, 0, 0, 0, 0, 28, 14, 0, 53, 57,
+  40, 0, 0, 20, 46, 0, 33, 38, 62, 29,
+  61, 16, 47, 0, 46, 37, 0, 1, 0, 58,
+  63, 0, 7, 0, 21, 41, 98, 32, 26, 34,
+  16, 64, 0, 150, 62, 63, 48, 14, 52, 0,
+  0, 72, 12, 0, 54, 79, 175, 35, 0, 0,
+  104, 0, 8, 0, 3, 53, 0, 34, 0, 0,
+  0, 32, 8, 71, 0, 0, 0, 50, 34, 80,
+  101, 18, 30, 0, 24, 14, 0, 49, 0, 0,
+  0, 16, 0, 0, 47, 0, 11, 29, 0, 0,
+  63, 28, 0, 75, 0, 60, 0, 1, 62, 4,
+  40, 45, 0, 23, 18, 40, 92, 24, 106, 1,
+  0, 0, 68, 0, 17, 0, 31, 98, 42, 0,
+  7, 0, 83, 0, 3, 51, 27, 30, 31, 0,
+  16, 5, 20, 0, 0, 18, 0, 32, 51, 0,
+  76, 0, 65, 0, 38, 22, 50, 21, 117, 0,
+  0, 33, 0, 34, 48, 0, 0, 21, 0, 97,
+  0, 11, 24, 76, 56, 29, 7, 79, 14, 26,
+  0, 0, 21, 72, 178, 23, 2, 77, 15, 0,
+  0, 17, 0, 58, 0, 0, 0, 0, 23, 6,
+  0, 52, 0, 0, 0, 0, 17, 138, 16, 0,
+  76, 0, 43, 0, 26, 0, 0, 0, 10, 14,
+  41, 10, 2, 8, 11, 125, 0, 0, 81, 0,
+  0, 29, 11, 26, 12, 0, 0, 0, 1, 82,
+  0, 0, 46, 37, 66, 0, 39, 0, 0, 0,
+  91, 0, 6, 0, 15, 66, 24, 0, 23, 6,
+  85, 90, 0, 23, 0, 0, 42, 20, 11, 6,
+  52, 0, 44, 28, 0, 49, 48, 0, 0, 0,
+  21, 0, 24, 28, 37, 2, 61, 0, 0, 73,
+  0, 0, 0, 0, 0, 0, 0, 114, 0, 0,
+  5, 58, 36, 11, 0, 72, 12, 49, 0, 0,
+  26, 41, 217, 0, 0, 48, 0, 41, 0, 0,
+  6, 3, 0, 0, 0, 0, 13, 0, 0, 63,
+  19, 55, 0, 0, 20, 92, 0, 0, 70, 0,
+  42, 0, 39, 0, 25, 1, 0, 0, 74, 12,
+  10, 4, 28, 139, 25, 13, 70, 0, 0, 6,
+  18, 0, 2, 4, 0, 0, 4, 80, 0, 0,
+  46, 48, 69, 0, 0, 0, 12, 0, 60, 0,
+  0, 0, 11, 29, 28, 90, 42, 8, 49, 129,
+  4, 0, 0, 1, 4, 23, 0, 0, 30, 66,
+  51, 23, 16, 39, 2, 0, 0, 0, 0, 0,
+  0, 44, 0, 0, 92, 0, 0, 76, 0, 0,
+  44, 0, 0, 15, 13, 93, 0, 13, 41, 74,
+  27, 0, 22, 35, 4, 32, 0, 0, 0, 34,
+  0, 0, 18, 4, 5, 0, 0, 0, 14, 65,
+  0, 0, 0, 14, 0, 0, 0, 18, 0, 0,
+  0, 0, 19, 112, 26, 0, 66, 0, 49, 0,
+  1, 0, 0, 12, 0, 0, 37, 7, 27, 10,
+  26, 96, 0, 0, 36, 15, 0, 30, 0, 21,
+  0, 0, 0, 0, 33, 83, 0, 28, 14, 34,
+  42, 0, 16, 32, 0, 0, 39, 0, 0, 0,
+  13, 107, 45, 0, 0, 0, 3, 18, 0, 20,
+  0, 5, 17, 0, 0, 0, 49, 0, 46, 44,
+  22, 4, 0, 0, 0, 0, 20, 0, 0, 18,
+  0, 0, 91, 0, 0, 56, 0, 0, 0, 0,
+  0, 21, 6, 68, 0, 0, 3, 66, 22, 26,
+  0, 44, 1, 12, 25, 0, 0, 0, 0, 0,
+  35, 19, 0, 0, 0, 0, 0, 41, 0, 0,
+  0, 9, 0, 13, 0, 4, 17, 0, 0, 0,
+  11, 90, 12, 0, 37, 0, 34, 0, 44, 0,
+  0, 20, 0, 0, 71, 0, 0, 58, 0, 66,
+  0, 22, 34, 0, 4, 12, 0, 0, 14, 0,
+  0, 0, 11, 67, 48, 0, 47, 25, 46, 0,
+  0, 0, 0, 0, 2, 0, 0, 5, 16, 47,
+  0, 0, 0, 1, 0, 93, 0, 9, 0, 23,
+  27, 12, 0, 4, 70, 6, 57, 62, 45, 37,
+  28, 1, 0, 0, 18, 8, 3, 27, 0, 16,
+  49, 0, 0, 5, 31, 0, 1, 0, 0, 6,
+  0, 41, 0, 0, 0, 25, 35, 4, 0, 0,
+  0, 52, 24, 0, 16, 5, 179, 11, 21, 0,
+  23, 0, 0, 0, 0, 11, 0, 43, 0, 24,
+  1, 8, 2, 65, 31, 0, 0, 0, 0, 37,
+  49, 0, 7, 0, 6, 0, 40, 14, 28, 28,
+  0, 0, 0, 18, 44, 18, 0, 7, 0, 39,
+  35, 0, 13, 18, 0, 0, 20, 0, 17, 2,
+  0, 51, 0, 0, 32, 30, 78, 35, 0, 0,
+  40, 0, 0, 22, 0, 0, 33, 23, 14, 18,
+  8, 0, 15, 74, 44, 16, 21, 36, 0, 12,
+  0, 0, 6, 34, 56, 40, 46, 34, 33, 8,
+  0, 0, 18, 0, 14, 30, 0, 0, 70, 0,
+  4, 150, 0, 0, 0, 0, 0, 1, 23, 94,
+  0, 0, 0, 44, 0, 0, 21, 54, 0, 39,
+  0, 0, 0, 0, 0, 45, 16, 26, 0, 7,
+  0, 0, 0, 50, 0, 0, 0, 11, 0, 27,
+  0, 8, 1, 0, 0, 0, 12, 123, 0, 0,
+  39, 0, 39, 0, 42, 0, 0, 32, 0, 0,
+  97, 0, 0, 31, 0, 64, 0, 26, 51, 0,
+  0, 17, 0, 0, 0, 0, 0, 0, 27, 70,
+  21, 0, 16, 15, 54, 0, 0, 0, 24, 0,
+  2, 0, 0, 0, 0, 60, 12, 0, 0, 0,
+  0, 79, 0, 14, 0, 5, 25, 0, 0, 14,
+  51, 41, 105, 41, 29, 52, 23, 0, 0, 0,
+  17, 23, 0, 13, 0, 43, 48, 0, 24, 32,
+  13, 0, 8, 0, 0, 0, 63, 49, 0, 0,
+  3, 17, 8, 10, 0, 0, 0, 37, 41, 35,
+  6, 0, 0, 48, 48, 0, 0, 14, 0, 0,
+  0, 2, 0, 39, 0, 40, 0, 41, 21, 0,
+  3, 0, 0, 0, 0, 40, 61, 0, 0, 0,
+  14, 6, 2, 35, 0, 6, 0, 21, 0, 0,
+  0, 27, 0, 0, 0, 32, 20, 0, 21, 28,
+  0, 0, 0, 25, 16, 25, 21, 40, 63, 0,
+  39, 18, 50, 13, 0, 0, 32, 28, 0, 22,
+  0, 38, 15, 31, 0, 0, 0, 0, 0, 28,
+  14, 0, 53, 57, 40, 0, 0, 20, 46, 0,
+  33, 38, 62, 29, 61, 16, 47, 0, 46, 37,
+  0, 1, 0, 41, 74, 0, 7, 0, 37, 0,
+  26, 0, 0, 0, 8, 45, 0, 15, 14, 0,
+  13, 0, 0, 0, 20, 55, 23, 53, 16, 0,
+  159, 1, 19, 0, 8, 19, 20, 0, 0, 0,
+  0, 81, 7, 52, 28, 35, 49, 21, 9, 3,
+  0, 0, 0, 24, 50, 0, 0, 0, 1, 33,
+  4, 24, 7, 14, 0, 0, 0, 27, 51, 0,
+  10, 0, 0, 31, 38, 26, 32, 14, 0, 0,
+  0, 32, 48, 29, 26, 13, 31, 0, 3, 25,
+  74, 17, 4, 0, 45, 17, 0, 32, 0, 0,
+  21, 15, 0, 0, 0, 0, 6, 22, 50, 8,
+  38, 32, 47, 0, 0, 0, 1, 0, 13, 0,
+  30, 2, 0, 0, 24, 0, 46, 24, 32, 0,
+  50, 21, 117, 0, 0, 33, 0, 34, 48, 0,
+  0, 21, 0, 97, 0, 11, 24, 76, 56, 29,
+  7, 79, 14, 26, 0, 0, 21, 72, 178, 23,
+  2, 77, 15, 0, 0, 17, 0, 58, 0, 0,
+  0, 0, 23, 6, 0, 52, 0, 0, 0, 0,
+  17, 138, 16, 0, 76, 0, 43, 0, 26, 0,
+  0, 0, 10, 14, 41, 10, 2, 8, 11, 125,
+  0, 0, 81, 0, 0, 29, 11, 26, 12, 0,
+  0, 0, 1, 82, 0, 0, 46, 37, 66, 0,
+  39, 0, 0, 0, 91, 0, 6, 0, 15, 66,
+  24, 0, 23, 6, 85, 90, 0, 23, 0, 0,
+  42, 20, 11, 6, 52, 0, 44, 28, 0, 49,
+  48, 0, 0, 0, 21, 0, 24, 28, 37, 2,
+  61, 0, 0, 73, 0, 0, 0, 0, 0, 0,
+  0, 114, 0, 0, 5, 58, 36, 11, 0, 72,
+  12, 49, 0, 0, 26, 41, 217, 0, 0, 48,
+  0, 41, 0, 0, 6, 3, 0, 0, 0, 0,
+  13, 0, 0, 63, 19, 55, 0, 0, 20, 92,
+  0, 0, 70, 0, 42, 0, 39, 0, 25, 1,
+  0, 0, 74, 12, 10, 4, 28, 139, 25, 13,
+  70, 0, 0, 6, 18, 0, 2, 4, 0, 0,
+  4, 80, 0, 0, 46, 48, 69, 0, 0, 0,
+  12, 0, 60, 0, 0, 0, 11, 29, 28, 90,
+  42, 8, 49, 129, 4, 0, 0, 1, 4, 23,
+  0, 0, 30, 66, 51, 23, 16, 39, 2, 0,
+  0, 0, 0, 0, 0, 44, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 91, 0, 0, 56,
+  0, 0, 0, 0, 0, 21, 6, 68, 0, 0,
+  3, 66, 22, 26, 0, 44, 1, 12, 25, 0,
+  0, 0, 0, 0, 35, 19, 0, 0, 0, 0,
+  0, 41, 0, 0, 0, 9, 0, 13, 0, 4,
+  17, 0, 0, 0, 11, 90, 12, 0, 37, 0,
+  34, 0, 44, 0, 0, 20, 0, 0, 71, 0,
+  0, 58, 0, 66, 0, 22, 34, 0, 4, 12,
+  0, 0, 14, 0, 0, 0, 11, 67, 48, 0,
+  47, 25, 46, 0, 0, 0, 0, 0, 2, 0,
+  0, 5, 16, 47, 0, 0, 0, 1, 0, 93,
+  0, 9, 0, 23, 27, 12, 0, 4, 70, 6,
+  57, 62, 45, 37, 28, 1, 0, 0, 18, 8,
+  3, 27, 0, 16, 49, 0, 0, 5, 31, 0,
+  1, 0, 0, 6, 0, 41, 0, 0, 0, 25,
+  35, 4, 0, 0, 0, 52, 24, 0, 16, 5,
+  179, 11, 21, 0, 23, 0, 0, 0, 0, 11,
+  0, 43, 0, 24, 1, 8, 2, 65, 31, 0,
+  0, 0, 0, 37, 49, 0, 7, 0, 6, 0,
+  40, 14, 28, 28, 0, 0, 0, 18, 44, 18,
+  0, 7, 0, 39, 35, 0, 13, 18, 0, 0,
+  20, 0, 17, 2, 0, 51, 0, 0, 32, 30,
+  78, 35, 0, 0, 40, 0, 0, 22, 0, 0,
+  33, 23, 14, 18, 8, 0, 15, 74, 44, 16,
+  21, 36, 0, 12, 0, 0, 6, 34, 56, 40,
+  46, 34, 33, 8, 0, 0, 18, 0, 14, 30,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 43,
+  48, 0, 24, 32, 13, 0, 8, 0, 0, 0,
+  63, 49, 0, 0, 3, 17, 8, 10, 0, 0,
+  0, 37, 41, 35, 6, 0, 0, 48, 48, 0,
+  0, 14, 0, 0, 0, 2, 0, 39, 0, 40,
+  0, 41, 21, 0, 3, 0, 0, 0, 0, 40,
+  61, 0, 0, 0, 14, 6, 2, 35, 0, 6,
+  0, 21, 0, 0, 0, 27, 0, 0, 0, 32,
+  20, 0, 21, 28, 0, 0, 0, 25, 16, 25,
+  21, 40, 63, 0, 39, 18, 50, 13, 0, 0,
+  32, 28, 0, 22, 0, 38, 15, 31, 0, 0,
+  0, 0, 0, 28, 14, 0, 53, 57, 40, 0,
+  0, 20, 46, 0, 33, 38, 62, 29, 61, 16,
+  47, 0, 46, 37, 0, 1, 0, 41, 74, 0,
+  7, 0, 37, 0, 26, 0, 0, 0, 8, 45,
+  0, 15, 14, 0, 13, 0, 0, 0, 20, 55,
+  23, 53, 16, 0, 159, 1, 19, 0, 8, 19,
+  20, 0, 0, 0, 0, 81, 7, 52, 28, 35,
+  49, 21, 9, 3, 0, 0, 0, 24, 50, 0,
+  0, 0, 1, 33, 4, 24, 7, 14, 0, 0,
+  0, 27, 51, 0, 10, 0, 0, 31, 38, 26,
+  32, 14, 0, 0, 0, 32, 48, 29, 26, 13,
+  31, 0, 3, 25, 74, 17, 4, 0, 45, 17,
+  0, 32, 0, 0, 21, 15, 0, 0, 0, 0,
+  6, 22, 50, 8, 38, 32, 47, 0, 0, 0,
+  1, 0, 13, 0, 30, 2, 0, 0, 24, 0,
+  46, 24, 32, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  12, 21, 64, 6, 0, 0, 17, 8, 0, 10,
+  24, 0, 0, 65, 0, 74, 92, 76, 35, 40,
+  22, 3, 39, 33, 0, 0, 31, 58, 156, 6,
+  15, 0, 58, 0, 0, 0, 0, 18, 0, 18,
+  5, 27, 0, 0, 53, 31, 0, 18, 0, 0,
+  0, 47, 40, 0, 10, 0, 0, 9, 0, 6,
+  28, 0, 0, 0, 0, 7, 44, 0, 48, 45,
+  0, 16, 17, 16, 28, 6, 22, 3, 0, 16,
+  38, 0, 14, 0, 0, 13, 0, 23, 45, 25,
+  8, 25, 0, 0, 67, 0, 51, 0, 0, 39,
+  3, 0, 27, 11, 67, 0, 18, 0, 0, 0,
+  20, 21, 9, 43, 3, 0, 12, 0, 0, 0,
+  64, 0, 5, 0, 0, 0, 55, 0, 56, 59,
+  50, 27, 4, 0, 2, 0, 0, 0, 8, 0,
+  48, 60, 4, 28, 76, 49, 0, 0, 0, 6,
+  1, 61, 24, 0, 35, 40, 0, 0, 13, 0,
+  67, 0, 0, 0, 0, 0, 0, 1, 0, 66,
+  2, 0, 30, 28, 26, 42, 0, 12, 0, 69,
+  96, 0, 23, 0, 0, 0, 0, 0, 51, 0,
+  0, 65, 0, 8, 82, 0, 40, 45, 0, 20,
+  0, 33, 32, 0, 14, 3, 0, 16, 42, 0,
+  37, 0, 0, 30, 0, 27, 36, 9, 13, 0,
+  0, 22, 2, 0, 70, 5, 0, 64, 0, 23,
+  40, 0, 76, 0, 6, 0, 58, 8, 17, 40,
+  5, 0, 26, 0, 1, 0, 0, 0, 39, 0,
+  71, 0, 10, 9, 14, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 47, 23, 86, 28, 0, 0,
+  29, 6, 18, 0, 12, 0, 0, 94, 0, 55,
+  94, 25, 14, 29, 7, 39, 13, 18, 25, 0,
+  29, 32, 164, 9, 5, 45, 79, 0, 0, 0,
+  0, 37, 0, 0, 0, 4, 0, 10, 7, 71,
+  53, 0, 0, 0, 0, 40, 22, 15, 17, 0,
+  13, 0, 0, 3, 39, 29, 0, 0, 0, 0,
+  72, 0, 119, 51, 0, 0, 21, 0, 24, 0,
+  65, 11, 0, 23, 14, 0, 42, 0, 0, 26,
+  0, 0, 59, 5, 0, 16, 0, 5, 15, 0,
+  38, 1, 14, 93, 25, 0, 14, 51, 54, 47,
+  12, 0, 25, 0, 4, 10, 0, 41, 10, 0,
+  18, 0, 17, 0, 59, 0, 0, 0, 0, 24,
+  48, 21, 43, 69, 0, 8, 5, 11, 0, 0,
+  0, 0, 0, 0, 16, 73, 0, 0, 82, 18,
+  0, 0, 0, 41, 0, 50, 15, 0, 5, 16,
+  0, 0, 0, 19, 83, 23, 0, 0, 0, 9,
+  0, 0, 0, 6, 0, 0, 9, 74, 35, 102,
+  0, 0, 0, 29, 56, 0, 22, 0, 18, 0,
+  0, 0, 78, 24, 0, 51, 0, 0, 97, 0,
+  107, 49, 0, 0, 4, 13, 45, 0, 27, 0,
+  0, 5, 25, 0, 35, 12, 0, 12, 0, 6,
+  0, 6, 0, 26, 0, 19, 1, 0, 34, 0,
+  12, 95, 20, 81, 35, 21, 44, 44, 10, 0,
+  51, 0, 0, 63, 0, 7, 0, 0, 0, 0,
+  11, 0, 22, 0, 33, 0, 0, 27, 27, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 23, 32,
+  93, 27, 1, 9, 26, 5, 18, 0, 0, 0,
+  0, 103, 0, 30, 67, 4, 0, 16, 13, 75,
+  10, 41, 20, 0, 6, 20, 201, 42, 3, 62,
+  71, 0, 24, 0, 0, 56, 0, 4, 5, 32,
+  0, 22, 9, 88, 48, 0, 0, 0, 0, 51,
+  21, 3, 55, 0, 44, 0, 32, 0, 31, 72,
+  0, 0, 0, 0, 48, 9, 120, 30, 0, 10,
+  58, 0, 32, 0, 53, 0, 0, 37, 0, 0,
+  36, 11, 0, 15, 0, 0, 58, 5, 0, 0,
+  0, 3, 0, 36, 0, 0, 40, 101, 17, 0,
+  0, 52, 55, 89, 20, 0, 9, 0, 2, 9,
+  0, 33, 6, 2, 40, 0, 19, 12, 51, 0,
+  0, 0, 3, 0, 39, 30, 0, 67, 0, 11,
+  0, 33, 2, 0, 0, 0, 0, 17, 28, 49,
+  0, 0, 52, 3, 0, 0, 28, 58, 0, 42,
+  19, 0, 0, 8, 0, 9, 0, 26, 82, 21,
+  0, 0, 0, 27, 0, 8, 0, 40, 0, 22,
+  24, 91, 9, 110, 0, 0, 0, 27, 50, 0,
+  37, 0, 28, 0, 14, 0, 55, 50, 0, 43,
+  0, 0, 49, 11, 81, 0, 4, 0, 22, 7,
+  42, 0, 12, 0, 0, 26, 21, 0, 21, 24,
+  0, 0, 0, 0, 0, 9, 0, 0, 0, 9,
+  0, 20, 0, 0, 47, 83, 0, 52, 17, 21,
+  41, 51, 25, 0, 40, 5, 0, 40, 0, 11,
+  0, 0, 21, 0, 13, 13, 31, 0, 15, 0,
+  35, 1, 15, 0, 12, 21, 64, 6, 0, 0,
+  17, 8, 0, 10, 24, 0, 0, 65, 0, 74,
+  92, 76, 35, 40, 22, 3, 39, 33, 0, 0,
+  31, 58, 156, 6, 15, 0, 58, 0, 0, 0,
+  0, 18, 0, 18, 5, 27, 0, 0, 53, 31,
+  0, 18, 0, 0, 0, 47, 40, 0, 10, 0,
+  0, 9, 0, 6, 28, 0, 0, 0, 0, 7,
+  44, 0, 48, 45, 0, 16, 17, 16, 28, 6,
+  22, 3, 0, 16, 38, 0, 14, 0, 0, 13,
+  0, 23, 45, 25, 8, 25, 0, 0, 67, 0,
+  51, 0, 0, 39, 3, 0, 27, 11, 67, 0,
+  18, 0, 0, 0, 20, 21, 9, 43, 3, 0,
+  12, 0, 0, 0, 64, 0, 5, 0, 0, 0,
+  55, 0, 56, 59, 50, 27, 4, 0, 2, 0,
+  0, 0, 8, 0, 48, 60, 4, 28, 76, 49,
+  0, 0, 0, 6, 1, 61, 24, 0, 35, 40,
+  0, 0, 13, 0, 67, 0, 0, 0, 0, 0,
+  0, 1, 0, 66, 2, 0, 30, 28, 26, 42,
+  0, 12, 0, 69, 96, 0, 23, 0, 0, 0,
+  0, 0, 51, 0, 0, 65, 0, 8, 82, 0,
+  40, 45, 0, 20, 0, 33, 32, 0, 14, 3,
+  0, 16, 42, 0, 37, 0, 0, 30, 0, 27,
+  36, 9, 13, 0, 0, 22, 2, 0, 70, 5,
+  0, 64, 0, 23, 40, 0, 76, 0, 6, 0,
+  58, 8, 17, 40, 5, 0, 26, 0, 1, 0,
+  0, 0, 39, 0, 71, 0, 10, 9, 14, 0,
+  2, 55, 59, 38, 4, 35, 16, 13, 17, 0,
+  0, 16, 84, 0, 0, 22, 51, 18, 0, 0,
+  0, 56, 0, 33, 67, 0, 5, 30, 0, 0,
+  0, 43, 70, 0, 18, 0, 0, 0, 0, 41,
+  0, 35, 57, 2, 29, 80, 44, 19, 0, 21,
+  0, 34, 36, 10, 35, 0, 10, 0, 0, 0,
+  30, 26, 0, 32, 0, 0, 35, 1, 27, 0,
+  0, 17, 9, 19, 26, 0, 10, 16, 0, 22,
+  23, 0, 61, 69, 0, 5, 0, 0, 0, 42,
+  5, 0, 0, 31, 0, 24, 35, 0, 0, 65,
+  2, 0, 10, 12, 63, 0, 37, 0, 27, 0,
+  0, 14, 0, 0, 0, 0, 0, 0, 0, 0,
+  4, 0, 41, 0, 35, 0, 8, 0, 47, 23,
+  86, 28, 0, 0, 29, 6, 18, 0, 12, 0,
+  0, 94, 0, 55, 94, 25, 14, 29, 7, 39,
+  13, 18, 25, 0, 29, 32, 164, 9, 5, 45,
+  79, 0, 0, 0, 0, 37, 0, 0, 0, 4,
+  0, 10, 7, 71, 53, 0, 0, 0, 0, 40,
+  22, 15, 17, 0, 13, 0, 0, 3, 39, 29,
+  0, 0, 0, 0, 72, 0, 119, 51, 0, 0,
+  21, 0, 24, 0, 65, 11, 0, 23, 14, 0,
+  42, 0, 0, 26, 0, 0, 59, 5, 0, 16,
+  0, 5, 15, 0, 38, 1, 14, 93, 25, 0,
+  14, 51, 54, 47, 12, 0, 25, 0, 4, 10,
+  0, 41, 10, 0, 18, 0, 17, 0, 59, 0,
+  0, 0, 0, 24, 48, 21, 43, 69, 0, 8,
+  5, 11, 0, 0, 0, 0, 0, 0, 16, 73,
+  0, 0, 82, 18, 0, 0, 0, 41, 0, 50,
+  15, 0, 5, 16, 0, 0, 0, 19, 83, 23,
+  0, 0, 0, 9, 0, 0, 0, 6, 0, 0,
+  9, 74, 35, 102, 0, 0, 0, 29, 56, 0,
+  22, 0, 18, 0, 0, 0, 78, 24, 0, 51,
+  0, 0, 97, 0, 107, 49, 0, 0, 4, 13,
+  45, 0, 27, 0, 0, 5, 25, 0, 35, 12,
+  0, 12, 0, 6, 0, 6, 0, 26, 0, 19,
+  1, 0, 34, 0, 12, 95, 20, 81, 35, 21,
+  44, 44, 10, 0, 51, 0, 0, 63, 0, 7,
+  0, 0, 0, 0, 11, 0, 22, 0, 33, 0,
+  0, 27, 27, 0, 0, 39, 39, 29, 0, 48,
+  7, 15, 23, 0, 0, 11, 81, 0, 0, 23,
+  58, 7, 0, 0, 0, 63, 0, 21, 41, 0,
+  0, 12, 0, 0, 0, 32, 67, 3, 1, 0,
+  0, 13, 0, 47, 0, 18, 41, 13, 22, 69,
+  25, 53, 0, 12, 0, 37, 21, 7, 22, 0,
+  22, 0, 0, 0, 16, 31, 0, 29, 0, 0,
+  7, 0, 37, 0, 18, 0, 9, 21, 4, 0,
+  5, 11, 0, 39, 27, 0, 62, 62, 0, 0,
+  0, 0, 0, 18, 1, 0, 0, 19, 0, 19,
+  32, 0, 0, 78, 11, 0, 0, 10, 15, 0,
+  33, 0, 0, 0, 0, 8, 0, 0, 0, 0,
+  7, 0, 0, 0, 0, 0, 38, 0, 39, 0,
+  9, 0, 23, 32, 93, 27, 1, 9, 26, 5,
+  18, 0, 0, 0, 0, 103, 0, 30, 67, 4,
+  0, 16, 13, 75, 10, 41, 20, 0, 6, 20,
+  201, 42, 3, 62, 71, 0, 24, 0, 0, 56,
+  0, 4, 5, 32, 0, 22, 9, 88, 48, 0,
+  0, 0, 0, 51, 21, 3, 55, 0, 44, 0,
+  32, 0, 31, 72, 0, 0, 0, 0, 48, 9,
+  120, 30, 0, 10, 58, 0, 32, 0, 53, 0,
+  0, 37, 0, 0, 36, 11, 0, 15, 0, 0,
+  58, 5, 0, 0, 0, 3, 0, 36, 0, 0,
+  40, 101, 17, 0, 0, 52, 55, 89, 20, 0,
+  9, 0, 2, 9, 0, 33, 6, 2, 40, 0,
+  19, 12, 51, 0, 0, 0, 3, 0, 39, 30,
+  0, 67, 0, 11, 0, 33, 2, 0, 0, 0,
+  0, 17, 28, 49, 0, 0, 52, 3, 0, 0,
+  28, 58, 0, 42, 19, 0, 0, 8, 0, 9,
+  0, 26, 82, 21, 0, 0, 0, 27, 0, 8,
+  0, 40, 0, 22, 24, 91, 9, 110, 0, 0,
+  0, 27, 50, 0, 37, 0, 28, 0, 14, 0,
+  55, 50, 0, 43, 0, 0, 49, 11, 81, 0,
+  4, 0, 22, 7, 42, 0, 12, 0, 0, 26,
+  21, 0, 21, 24, 0, 0, 0, 0, 0, 9,
+  0, 0, 0, 9, 0, 20, 0, 0, 47, 83,
+  0, 52, 17, 21, 41, 51, 25, 0, 40, 5,
+  0, 40, 0, 11, 0, 0, 21, 0, 13, 13,
+  31, 0, 15, 0, 35, 1, 15, 0, 0, 27,
+  36, 37, 0, 42, 17, 9, 15, 0, 0, 22,
+  97, 0, 7, 27, 55, 8, 0, 0, 0, 69,
+  0, 8, 46, 0, 0, 20, 0, 2, 0, 37,
+  78, 0, 3, 0, 0, 24, 0, 73, 0, 34,
+  30, 29, 29, 57, 25, 42, 0, 28, 0, 43,
+  34, 9, 17, 0, 10, 0, 0, 0, 6, 14,
+  0, 16, 0, 0, 0, 0, 28, 0, 23, 6,
+  0, 10, 7, 0, 0, 23, 0, 35, 38, 0,
+  52, 56, 0, 0, 11, 0, 0, 18, 0, 0,
+  0, 4, 0, 16, 29, 0, 0, 66, 6, 0,
+  0, 10, 18, 0, 38, 0, 0, 6, 0, 7,
+  0, 1, 0, 0, 17, 0, 0, 0, 5, 0,
+  43, 0, 63, 0, 11, 0, 56, 59, 50, 27,
+  4, 0, 2, 0, 0, 0, 8, 0, 48, 60,
+  4, 28, 76, 49, 0, 0, 0, 6, 1, 61,
+  24, 0, 35, 40, 0, 0, 13, 0, 67, 0,
+  0, 0, 0, 0, 0, 1, 0, 66, 2, 0,
+  30, 28, 26, 42, 0, 12, 0, 69, 96, 0,
+  23, 0, 0, 0, 0, 0, 51, 0, 0, 65,
+  0, 8, 82, 0, 40, 45, 0, 20, 0, 33,
+  32, 0, 14, 3, 0, 16, 42, 0, 37, 0,
+  0, 30, 0, 27, 36, 9, 13, 0, 0, 22,
+  2, 0, 70, 5, 0, 64, 0, 23, 40, 0,
+  76, 0, 6, 0, 58, 8, 17, 40, 5, 0,
+  26, 0, 1, 0, 0, 0, 39, 0, 71, 0,
+  10, 9, 14, 0, 2, 55, 59, 38, 4, 35,
+  16, 13, 17, 0, 0, 16, 84, 0, 0, 22,
+  51, 18, 0, 0, 0, 56, 0, 33, 67, 0,
+  5, 30, 0, 0, 0, 43, 70, 0, 18, 0,
+  0, 0, 0, 41, 0, 35, 57, 2, 29, 80,
+  44, 19, 0, 21, 0, 34, 36, 10, 35, 0,
+  10, 0, 0, 0, 30, 26, 0, 32, 0, 0,
+  35, 1, 27, 0, 0, 17, 9, 19, 26, 0,
+  10, 16, 0, 22, 23, 0, 61, 69, 0, 5,
+  0, 0, 0, 42, 5, 0, 0, 31, 0, 24,
+  35, 0, 0, 65, 2, 0, 10, 12, 63, 0,
+  37, 0, 27, 0, 0, 14, 0, 0, 0, 0,
+  0, 0, 0, 0, 4, 0, 41, 0, 35, 0,
+  8, 0, 0, 0, 0, 18, 14, 124, 8, 0,
+  7, 0, 0, 29, 52, 11, 0, 6, 15, 0,
+  0, 0, 0, 77, 2, 24, 40, 0, 0, 9,
+  0, 14, 0, 31, 15, 32, 0, 0, 0, 21,
+  0, 76, 0, 37, 0, 65, 12, 85, 61, 31,
+  0, 0, 0, 31, 31, 4, 2, 0, 40, 0,
+  18, 0, 23, 69, 0, 16, 12, 9, 0, 29,
+  58, 0, 39, 20, 11, 0, 25, 21, 19, 0,
+  0, 29, 42, 0, 16, 44, 15, 0, 11, 0,
+  0, 8, 0, 6, 0, 0, 4, 72, 0, 0,
+  0, 72, 0, 0, 4, 12, 57, 0, 27, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 77, 0,
+  47, 0, 6, 3, 0, 0, 55, 0, 22, 0,
+  43, 69, 0, 8, 5, 11, 0, 0, 0, 0,
+  0, 0, 16, 73, 0, 0, 82, 18, 0, 0,
+  0, 41, 0, 50, 15, 0, 5, 16, 0, 0,
+  0, 19, 83, 23, 0, 0, 0, 9, 0, 0,
+  0, 6, 0, 0, 9, 74, 35, 102, 0, 0,
+  0, 29, 56, 0, 22, 0, 18, 0, 0, 0,
+  78, 24, 0, 51, 0, 0, 97, 0, 107, 49,
+  0, 0, 4, 13, 45, 0, 27, 0, 0, 5,
+  25, 0, 35, 12, 0, 12, 0, 6, 0, 6,
+  0, 26, 0, 19, 1, 0, 34, 0, 12, 95,
+  20, 81, 35, 21, 44, 44, 10, 0, 51, 0,
+  0, 63, 0, 7, 0, 0, 0, 0, 11, 0,
+  22, 0, 33, 0, 0, 27, 27, 0, 0, 39,
+  39, 29, 0, 48, 7, 15, 23, 0, 0, 11,
+  81, 0, 0, 23, 58, 7, 0, 0, 0, 63,
+  0, 21, 41, 0, 0, 12, 0, 0, 0, 32,
+  67, 3, 1, 0, 0, 13, 0, 47, 0, 18,
+  41, 13, 22, 69, 25, 53, 0, 12, 0, 37,
+  21, 7, 22, 0, 22, 0, 0, 0, 16, 31,
+  0, 29, 0, 0, 7, 0, 37, 0, 18, 0,
+  9, 21, 4, 0, 5, 11, 0, 39, 27, 0,
+  62, 62, 0, 0, 0, 0, 0, 18, 1, 0,
+  0, 19, 0, 19, 32, 0, 0, 78, 11, 0,
+  0, 10, 15, 0, 33, 0, 0, 0, 0, 8,
+  0, 0, 0, 0, 7, 0, 0, 0, 0, 0,
+  38, 0, 39, 0, 9, 0, 0, 0, 0, 12,
+  0, 128, 4, 0, 24, 0, 0, 24, 44, 0,
+  0, 3, 15, 0, 0, 0, 17, 87, 14, 19,
+  11, 0, 0, 0, 0, 0, 0, 22, 19, 26,
+  0, 6, 0, 37, 0, 56, 0, 21, 0, 56,
+  0, 77, 54, 47, 0, 0, 0, 41, 15, 0,
+  2, 0, 67, 0, 29, 0, 3, 66, 0, 12,
+  54, 5, 0, 16, 73, 0, 77, 17, 14, 1,
+  0, 19, 20, 20, 0, 39, 27, 0, 45, 41,
+  10, 0, 5, 0, 0, 0, 0, 17, 0, 0,
+  0, 33, 0, 0, 7, 75, 14, 0, 0, 3,
+  5, 0, 19, 0, 0, 0, 0, 0, 0, 14,
+  0, 0, 93, 0, 37, 0, 0, 0, 0, 0,
+  36, 0, 0, 0, 0, 67, 0, 11, 0, 33,
+  2, 0, 0, 0, 0, 17, 28, 49, 0, 0,
+  52, 3, 0, 0, 28, 58, 0, 42, 19, 0,
+  0, 8, 0, 9, 0, 26, 82, 21, 0, 0,
+  0, 27, 0, 8, 0, 40, 0, 22, 24, 91,
+  9, 110, 0, 0, 0, 27, 50, 0, 37, 0,
+  28, 0, 14, 0, 55, 50, 0, 43, 0, 0,
+  49, 11, 81, 0, 4, 0, 22, 7, 42, 0,
+  12, 0, 0, 26, 21, 0, 21, 24, 0, 0,
+  0, 0, 0, 9, 0, 0, 0, 9, 0, 20,
+  0, 0, 47, 83, 0, 52, 17, 21, 41, 51,
+  25, 0, 40, 5, 0, 40, 0, 11, 0, 0,
+  21, 0, 13, 13, 31, 0, 15, 0, 35, 1,
+  15, 0, 0, 27, 36, 37, 0, 42, 17, 9,
+  15, 0, 0, 22, 97, 0, 7, 27, 55, 8,
+  0, 0, 0, 69, 0, 8, 46, 0, 0, 20,
+  0, 2, 0, 37, 78, 0, 3, 0, 0, 24,
+  0, 73, 0, 34, 30, 29, 29, 57, 25, 42,
+  0, 28, 0, 43, 34, 9, 17, 0, 10, 0,
+  0, 0, 6, 14, 0, 16, 0, 0, 0, 0,
+  28, 0, 23, 6, 0, 10, 7, 0, 0, 23,
+  0, 35, 38, 0, 52, 56, 0, 0, 11, 0,
+  0, 18, 0, 0, 0, 4, 0, 16, 29, 0,
+  0, 66, 6, 0, 0, 10, 18, 0, 38, 0,
+  0, 6, 0, 7, 0, 1, 0, 0, 17, 0,
+  0, 0, 5, 0, 43, 0, 63, 0, 11, 0,
+  0, 0, 0, 15, 0, 142, 5, 0, 3, 0,
+  0, 27, 43, 0, 0, 0, 6, 0, 0, 0,
+  37, 88, 23, 15, 8, 0, 0, 0, 0, 13,
+  0, 22, 26, 24, 0, 2, 0, 36, 0, 50,
+  0, 35, 0, 56, 1, 71, 43, 43, 0, 0,
+  0, 38, 8, 0, 4, 0, 67, 0, 33, 0,
+  0, 57, 0, 0, 64, 0, 0, 26, 62, 0,
+  74, 26, 27, 3, 4, 32, 9, 25, 0, 31,
+  35, 0, 37, 52, 8, 0, 19, 0, 0, 0,
+  0, 11, 7, 0, 1, 26, 0, 0, 10, 66,
+  18, 0, 0, 7, 8, 0, 31, 0, 0, 0,
+  0, 0, 0, 15, 0, 0, 111, 2, 35, 3,
+  0, 0, 0, 0, 41, 0, 0, 0, 2, 55,
+  59, 38, 4, 35, 16, 13, 17, 0, 0, 16,
+  84, 0, 0, 22, 51, 18, 0, 0, 0, 56,
+  0, 33, 67, 0, 5, 30, 0, 0, 0, 43,
+  70, 0, 18, 0, 0, 0, 0, 41, 0, 35,
+  57, 2, 29, 80, 44, 19, 0, 21, 0, 34,
+  36, 10, 35, 0, 10, 0, 0, 0, 30, 26,
+  0, 32, 0, 0, 35, 1, 27, 0, 0, 17,
+  9, 19, 26, 0, 10, 16, 0, 22, 23, 0,
+  61, 69, 0, 5, 0, 0, 0, 42, 5, 0,
+  0, 31, 0, 24, 35, 0, 0, 65, 2, 0,
+  10, 12, 63, 0, 37, 0, 27, 0, 0, 14,
+  0, 0, 0, 0, 0, 0, 0, 0, 4, 0,
+  41, 0, 35, 0, 8, 0, 0, 0, 0, 18,
+  14, 124, 8, 0, 7, 0, 0, 29, 52, 11,
+  0, 6, 15, 0, 0, 0, 0, 77, 2, 24,
+  40, 0, 0, 9, 0, 14, 0, 31, 15, 32,
+  0, 0, 0, 21, 0, 76, 0, 37, 0, 65,
+  12, 85, 61, 31, 0, 0, 0, 31, 31, 4,
+  2, 0, 40, 0, 18, 0, 23, 69, 0, 16,
+  12, 9, 0, 29, 58, 0, 39, 20, 11, 0,
+  25, 21, 19, 0, 0, 29, 42, 0, 16, 44,
+  15, 0, 11, 0, 0, 8, 0, 6, 0, 0,
+  4, 72, 0, 0, 0, 72, 0, 0, 4, 12,
+  57, 0, 27, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 77, 0, 47, 0, 6, 3, 0, 0,
+  55, 0, 22, 0, 0, 12, 0, 0, 34, 31,
+  37, 0, 16, 0, 1, 11, 52, 11, 10, 28,
+  23, 12, 0, 12, 51, 0, 0, 50, 24, 48,
+  0, 15, 0, 35, 0, 0, 38, 48, 0, 0,
+  0, 6, 0, 75, 0, 43, 0, 59, 29, 41,
+  15, 15, 0, 19, 0, 15, 107, 18, 0, 0,
+  17, 0, 0, 28, 25, 21, 0, 41, 0, 0,
+  45, 6, 26, 0, 0, 8, 0, 14, 33, 51,
+  4, 0, 0, 28, 84, 14, 0, 6, 19, 0,
+  12, 21, 18, 26, 0, 9, 9, 21, 0, 72,
+  0, 4, 31, 72, 0, 0, 2, 0, 39, 0,
+  26, 7, 9, 48, 0, 0, 0, 3, 0, 0,
+  39, 24, 41, 0, 37, 0, 84, 0, 64, 0,
+  13, 0, 0, 39, 39, 29, 0, 48, 7, 15,
+  23, 0, 0, 11, 81, 0, 0, 23, 58, 7,
+  0, 0, 0, 63, 0, 21, 41, 0, 0, 12,
+  0, 0, 0, 32, 67, 3, 1, 0, 0, 13,
+  0, 47, 0, 18, 41, 13, 22, 69, 25, 53,
+  0, 12, 0, 37, 21, 7, 22, 0, 22, 0,
+  0, 0, 16, 31, 0, 29, 0, 0, 7, 0,
+  37, 0, 18, 0, 9, 21, 4, 0, 5, 11,
+  0, 39, 27, 0, 62, 62, 0, 0, 0, 0,
+  0, 18, 1, 0, 0, 19, 0, 19, 32, 0,
+  0, 78, 11, 0, 0, 10, 15, 0, 33, 0,
+  0, 0, 0, 8, 0, 0, 0, 0, 7, 0,
+  0, 0, 0, 0, 38, 0, 39, 0, 9, 0,
+  0, 0, 0, 12, 0, 128, 4, 0, 24, 0,
+  0, 24, 44, 0, 0, 3, 15, 0, 0, 0,
+  17, 87, 14, 19, 11, 0, 0, 0, 0, 0,
+  0, 22, 19, 26, 0, 6, 0, 37, 0, 56,
+  0, 21, 0, 56, 0, 77, 54, 47, 0, 0,
+  0, 41, 15, 0, 2, 0, 67, 0, 29, 0,
+  3, 66, 0, 12, 54, 5, 0, 16, 73, 0,
+  77, 17, 14, 1, 0, 19, 20, 20, 0, 39,
+  27, 0, 45, 41, 10, 0, 5, 0, 0, 0,
+  0, 17, 0, 0, 0, 33, 0, 0, 7, 75,
+  14, 0, 0, 3, 5, 0, 19, 0, 0, 0,
+  0, 0, 0, 14, 0, 0, 93, 0, 37, 0,
+  0, 0, 0, 0, 36, 0, 0, 0, 0, 0,
+  0, 0, 0, 48, 47, 0, 22, 0, 0, 0,
+  38, 0, 10, 49, 31, 17, 0, 15, 62, 0,
+  0, 40, 0, 20, 12, 0, 0, 26, 0, 0,
+  64, 55, 8, 0, 0, 16, 0, 41, 0, 28,
+  0, 56, 0, 45, 21, 45, 0, 12, 2, 10,
+  93, 9, 0, 9, 48, 0, 0, 35, 16, 4,
+  0, 1, 0, 0, 17, 7, 42, 0, 2, 3,
+  0, 21, 13, 42, 3, 0, 0, 26, 69, 0,
+  18, 2, 18, 0, 12, 0, 9, 8, 0, 31,
+  0, 8, 5, 29, 0, 0, 36, 54, 18, 0,
+  0, 0, 1, 0, 24, 4, 0, 31, 0, 1,
+  0, 19, 0, 0, 51, 3, 32, 0, 21, 0,
+  83, 0, 35, 0, 4, 0, 0, 27, 36, 37,
+  0, 42, 17, 9, 15, 0, 0, 22, 97, 0,
+  7, 27, 55, 8, 0, 0, 0, 69, 0, 8,
+  46, 0, 0, 20, 0, 2, 0, 37, 78, 0,
+  3, 0, 0, 24, 0, 73, 0, 34, 30, 29,
+  29, 57, 25, 42, 0, 28, 0, 43, 34, 9,
+  17, 0, 10, 0, 0, 0, 6, 14, 0, 16,
+  0, 0, 0, 0, 28, 0, 23, 6, 0, 10,
+  7, 0, 0, 23, 0, 35, 38, 0, 52, 56,
+  0, 0, 11, 0, 0, 18, 0, 0, 0, 4,
+  0, 16, 29, 0, 0, 66, 6, 0, 0, 10,
+  18, 0, 38, 0, 0, 6, 0, 7, 0, 1,
+  0, 0, 17, 0, 0, 0, 5, 0, 43, 0,
+  63, 0, 11, 0, 0, 0, 0, 15, 0, 142,
+  5, 0, 3, 0, 0, 27, 43, 0, 0, 0,
+  6, 0, 0, 0, 37, 88, 23, 15, 8, 0,
+  0, 0, 0, 13, 0, 22, 26, 24, 0, 2,
+  0, 36, 0, 50, 0, 35, 0, 56, 1, 71,
+  43, 43, 0, 0, 0, 38, 8, 0, 4, 0,
+  67, 0, 33, 0, 0, 57, 0, 0, 64, 0,
+  0, 26, 62, 0, 74, 26, 27, 3, 4, 32,
+  9, 25, 0, 31, 35, 0, 37, 52, 8, 0,
+  19, 0, 0, 0, 0, 11, 7, 0, 1, 26,
+  0, 0, 10, 66, 18, 0, 0, 7, 8, 0,
+  31, 0, 0, 0, 0, 0, 0, 15, 0, 0,
+  111, 2, 35, 3, 0, 0, 0, 0, 41, 0,
+  0, 0, 0, 0, 0, 0, 0, 51, 48, 0,
+  17, 0, 0, 1, 56, 0, 12, 28, 33, 20,
+  5, 18, 77, 0, 0, 29, 0, 42, 17, 0,
+  0, 38, 0, 0, 71, 57, 0, 0, 0, 12,
+  0, 39, 0, 43, 0, 51, 0, 34, 20, 45,
+  0, 31, 15, 0, 71, 13, 0, 6, 44, 0,
+  0, 54, 15, 0, 0, 0, 0, 0, 23, 28,
+  33, 0, 0, 13, 0, 22, 15, 54, 0, 0,
+  0, 29, 69, 6, 16, 0, 25, 0, 11, 13,
+  3, 2, 0, 26, 5, 14, 0, 26, 0, 0,
+  43, 47, 11, 6, 0, 0, 0, 0, 43, 0,
+  0, 46, 1, 0, 0, 11, 0, 0, 48, 15,
+  46, 0, 23, 0, 104, 0, 47, 0, 0, 0,
+  0, 0, 0, 18, 14, 124, 8, 0, 7, 0,
+  0, 29, 52, 11, 0, 6, 15, 0, 0, 0,
+  0, 77, 2, 24, 40, 0, 0, 9, 0, 14,
+  0, 31, 15, 32, 0, 0, 0, 21, 0, 76,
+  0, 37, 0, 65, 12, 85, 61, 31, 0, 0,
+  0, 31, 31, 4, 2, 0, 40, 0, 18, 0,
+  23, 69, 0, 16, 12, 9, 0, 29, 58, 0,
+  39, 20, 11, 0, 25, 21, 19, 0, 0, 29,
+  42, 0, 16, 44, 15, 0, 11, 0, 0, 8,
+  0, 6, 0, 0, 4, 72, 0, 0, 0, 72,
+  0, 0, 4, 12, 57, 0, 27, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 77, 0, 47, 0,
+  6, 3, 0, 0, 55, 0, 22, 0, 0, 12,
+  0, 0, 34, 31, 37, 0, 16, 0, 1, 11,
+  52, 11, 10, 28, 23, 12, 0, 12, 51, 0,
+  0, 50, 24, 48, 0, 15, 0, 35, 0, 0,
+  38, 48, 0, 0, 0, 6, 0, 75, 0, 43,
+  0, 59, 29, 41, 15, 15, 0, 19, 0, 15,
+  107, 18, 0, 0, 17, 0, 0, 28, 25, 21,
+  0, 41, 0, 0, 45, 6, 26, 0, 0, 8,
+  0, 14, 33, 51, 4, 0, 0, 28, 84, 14,
+  0, 6, 19, 0, 12, 21, 18, 26, 0, 9,
+  9, 21, 0, 72, 0, 4, 31, 72, 0, 0,
+  2, 0, 39, 0, 26, 7, 9, 48, 0, 0,
+  0, 3, 0, 0, 39, 24, 41, 0, 37, 0,
+  84, 0, 64, 0, 13, 0, 0, 32, 0, 0,
+  20, 0, 56, 0, 35, 0, 0, 29, 28, 20,
+  52, 24, 39, 50, 3, 36, 95, 0, 10, 21,
+  21, 25, 9, 34, 0, 29, 0, 0, 63, 0,
+  10, 0, 0, 0, 0, 48, 0, 3, 0, 63,
+  16, 61, 5, 1, 0, 6, 0, 3, 79, 33,
+  0, 0, 18, 0, 0, 7, 0, 7, 0, 0,
+  0, 0, 32, 20, 20, 0, 0, 0, 0, 0,
+  62, 0, 13, 2, 0, 6, 67, 26, 0, 0,
+  6, 0, 7, 0, 11, 49, 18, 0, 0, 4,
+  0, 55, 0, 6, 64, 36, 0, 0, 3, 0,
+  34, 0, 22, 9, 31, 35, 0, 0, 0, 0,
+  0, 0, 14, 2, 12, 0, 45, 0, 77, 0,
+  41, 0, 26, 0, 0, 0, 0, 12, 0, 128,
+  4, 0, 24, 0, 0, 24, 44, 0, 0, 3,
+  15, 0, 0, 0, 17, 87, 14, 19, 11, 0,
+  0, 0, 0, 0, 0, 22, 19, 26, 0, 6,
+  0, 37, 0, 56, 0, 21, 0, 56, 0, 77,
+  54, 47, 0, 0, 0, 41, 15, 0, 2, 0,
+  67, 0, 29, 0, 3, 66, 0, 12, 54, 5,
+  0, 16, 73, 0, 77, 17, 14, 1, 0, 19,
+  20, 20, 0, 39, 27, 0, 45, 41, 10, 0,
+  5, 0, 0, 0, 0, 17, 0, 0, 0, 33,
+  0, 0, 7, 75, 14, 0, 0, 3, 5, 0,
+  19, 0, 0, 0, 0, 0, 0, 14, 0, 0,
+  93, 0, 37, 0, 0, 0, 0, 0, 36, 0,
+  0, 0, 0, 0, 0, 0, 0, 48, 47, 0,
+  22, 0, 0, 0, 38, 0, 10, 49, 31, 17,
+  0, 15, 62, 0, 0, 40, 0, 20, 12, 0,
+  0, 26, 0, 0, 64, 55, 8, 0, 0, 16,
+  0, 41, 0, 28, 0, 56, 0, 45, 21, 45,
+  0, 12, 2, 10, 93, 9, 0, 9, 48, 0,
+  0, 35, 16, 4, 0, 1, 0, 0, 17, 7,
+  42, 0, 2, 3, 0, 21, 13, 42, 3, 0,
+  0, 26, 69, 0, 18, 2, 18, 0, 12, 0,
+  9, 8, 0, 31, 0, 8, 5, 29, 0, 0,
+  36, 54, 18, 0, 0, 0, 1, 0, 24, 4,
+  0, 31, 0, 1, 0, 19, 0, 0, 51, 3,
+  32, 0, 21, 0, 83, 0, 35, 0, 4, 0,
+  0, 9, 0, 0, 15, 0, 57, 0, 37, 0,
+  0, 0, 30, 12, 51, 40, 45, 47, 0, 28,
+  101, 0, 0, 27, 0, 9, 25, 8, 0, 23,
+  0, 0, 52, 4, 22, 0, 0, 12, 0, 35,
+  0, 7, 0, 70, 5, 54, 4, 16, 0, 0,
+  13, 8, 68, 27, 0, 0, 28, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 23, 1, 27, 0,
+  0, 0, 0, 10, 48, 0, 7, 9, 0, 11,
+  57, 13, 9, 0, 13, 0, 0, 0, 22, 29,
+  9, 0, 0, 15, 0, 34, 0, 0, 59, 37,
+  0, 0, 0, 0, 12, 0, 17, 14, 11, 27,
+  0, 0, 0, 5, 0, 0, 24, 0, 14, 0,
+  27, 0, 77, 0, 21, 0, 13, 0, 0, 0,
+  0, 15, 0, 142, 5, 0, 3, 0, 0, 27,
+  43, 0, 0, 0, 6, 0, 0, 0, 37, 88,
+  23, 15, 8, 0, 0, 0, 0, 13, 0, 22,
+  26, 24, 0, 2, 0, 36, 0, 50, 0, 35,
+  0, 56, 1, 71, 43, 43, 0, 0, 0, 38,
+  8, 0, 4, 0, 67, 0, 33, 0, 0, 57,
+  0, 0, 64, 0, 0, 26, 62, 0, 74, 26,
+  27, 3, 4, 32, 9, 25, 0, 31, 35, 0,
+  37, 52, 8, 0, 19, 0, 0, 0, 0, 11,
+  7, 0, 1, 26, 0, 0, 10, 66, 18, 0,
+  0, 7, 8, 0, 31, 0, 0, 0, 0, 0,
+  0, 15, 0, 0, 111, 2, 35, 3, 0, 0,
+  0, 0, 41, 0, 0, 0, 0, 0, 0, 0,
+  0, 51, 48, 0, 17, 0, 0, 1, 56, 0,
+  12, 28, 33, 20, 5, 18, 77, 0, 0, 29,
+  0, 42, 17, 0, 0, 38, 0, 0, 71, 57,
+  0, 0, 0, 12, 0, 39, 0, 43, 0, 51,
+  0, 34, 20, 45, 0, 31, 15, 0, 71, 13,
+  0, 6, 44, 0, 0, 54, 15, 0, 0, 0,
+  0, 0, 23, 28, 33, 0, 0, 13, 0, 22,
+  15, 54, 0, 0, 0, 29, 69, 6, 16, 0,
+  25, 0, 11, 13, 3, 2, 0, 26, 5, 14,
+  0, 26, 0, 0, 43, 47, 11, 6, 0, 0,
+  0, 0, 43, 0, 0, 46, 1, 0, 0, 11,
+  0, 0, 48, 15, 46, 0, 23, 0, 104, 0,
+  47, 0, 0, 0, 0, 29, 0, 0, 20, 0,
+  45, 0, 38, 0, 0, 2, 26, 28, 73, 29,
+  52, 53, 0, 24, 91, 0, 0, 24, 16, 39,
+  26, 0, 0, 20, 0, 0, 40, 12, 3, 0,
+  0, 8, 0, 47, 0, 9, 0, 58, 0, 33,
+  12, 19, 0, 0, 17, 3, 66, 44, 0, 0,
+  7, 0, 0, 3, 7, 0, 0, 0, 0, 0,
+  42, 7, 32, 0, 0, 0, 0, 10, 51, 0,
+  4, 0, 0, 8, 61, 18, 25, 0, 32, 0,
+  8, 4, 12, 12, 2, 0, 0, 26, 0, 31,
+  0, 0, 56, 29, 0, 2, 0, 0, 0, 0,
+  30, 0, 7, 37, 0, 0, 0, 21, 0, 0,
+  7, 6, 14, 0, 16, 0, 90, 0, 25, 0,
+  12, 0, 0, 12, 0, 0, 34, 31, 37, 0,
+  16, 0, 1, 11, 52, 11, 10, 28, 23, 12,
+  0, 12, 51, 0, 0, 50, 24, 48, 0, 15,
+  0, 35, 0, 0, 38, 48, 0, 0, 0, 6,
+  0, 75, 0, 43, 0, 59, 29, 41, 15, 15,
+  0, 19, 0, 15, 107, 18, 0, 0, 17, 0,
+  0, 28, 25, 21, 0, 41, 0, 0, 45, 6,
+  26, 0, 0, 8, 0, 14, 33, 51, 4, 0,
+  0, 28, 84, 14, 0, 6, 19, 0, 12, 21,
+  18, 26, 0, 9, 9, 21, 0, 72, 0, 4,
+  31, 72, 0, 0, 2, 0, 39, 0, 26, 7,
+  9, 48, 0, 0, 0, 3, 0, 0, 39, 24,
+  41, 0, 37, 0, 84, 0, 64, 0, 13, 0,
+  0, 32, 0, 0, 20, 0, 56, 0, 35, 0,
+  0, 29, 28, 20, 52, 24, 39, 50, 3, 36,
+  95, 0, 10, 21, 21, 25, 9, 34, 0, 29,
+  0, 0, 63, 0, 10, 0, 0, 0, 0, 48,
+  0, 3, 0, 63, 16, 61, 5, 1, 0, 6,
+  0, 3, 79, 33, 0, 0, 18, 0, 0, 7,
+  0, 7, 0, 0, 0, 0, 32, 20, 20, 0,
+  0, 0, 0, 0, 62, 0, 13, 2, 0, 6,
+  67, 26, 0, 0, 6, 0, 7, 0, 11, 49,
+  18, 0, 0, 4, 0, 55, 0, 6, 64, 36,
+  0, 0, 3, 0, 34, 0, 22, 9, 31, 35,
+  0, 0, 0, 0, 0, 0, 14, 2, 12, 0,
+  45, 0, 77, 0, 41, 0, 26, 0, 0, 27,
+  0, 15, 17, 0, 54, 0, 26, 19, 0, 24,
+  19, 41, 54, 36, 42, 53, 0, 29, 105, 0,
+  0, 24, 36, 35, 13, 47, 0, 36, 0, 0,
+  67, 9, 22, 0, 0, 0, 0, 30, 0, 0,
+  0, 58, 16, 44, 12, 18, 0, 3, 21, 11,
+  61, 51, 0, 0, 3, 0, 0, 16, 0, 0,
+  0, 0, 0, 0, 38, 18, 25, 0, 0, 0,
+  0, 0, 56, 0, 14, 7, 0, 10, 79, 42,
+  2, 0, 11, 0, 6, 6, 16, 33, 14, 0,
+  0, 12, 0, 42, 0, 6, 83, 38, 0, 0,
+  5, 0, 37, 0, 29, 9, 43, 27, 0, 0,
+  1, 0, 0, 0, 12, 0, 2, 0, 32, 0,
+  100, 0, 40, 0, 22, 0, 0, 0, 0, 0,
+  0, 48, 47, 0, 22, 0, 0, 0, 38, 0,
+  10, 49, 31, 17, 0, 15, 62, 0, 0, 40,
+  0, 20, 12, 0, 0, 26, 0, 0, 64, 55,
+  8, 0, 0, 16, 0, 41, 0, 28, 0, 56,
+  0, 45, 21, 45, 0, 12, 2, 10, 93, 9,
+  0, 9, 48, 0, 0, 35, 16, 4, 0, 1,
+  0, 0, 17, 7, 42, 0, 2, 3, 0, 21,
+  13, 42, 3, 0, 0, 26, 69, 0, 18, 2,
+  18, 0, 12, 0, 9, 8, 0, 31, 0, 8,
+  5, 29, 0, 0, 36, 54, 18, 0, 0, 0,
+  1, 0, 24, 4, 0, 31, 0, 1, 0, 19,
+  0, 0, 51, 3, 32, 0, 21, 0, 83, 0,
+  35, 0, 4, 0, 0, 9, 0, 0, 15, 0,
+  57, 0, 37, 0, 0, 0, 30, 12, 51, 40,
+  45, 47, 0, 28, 101, 0, 0, 27, 0, 9,
+  25, 8, 0, 23, 0, 0, 52, 4, 22, 0,
+  0, 12, 0, 35, 0, 7, 0, 70, 5, 54,
+  4, 16, 0, 0, 13, 8, 68, 27, 0, 0,
+  28, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  23, 1, 27, 0, 0, 0, 0, 10, 48, 0,
+  7, 9, 0, 11, 57, 13, 9, 0, 13, 0,
+  0, 0, 22, 29, 9, 0, 0, 15, 0, 34,
+  0, 0, 59, 37, 0, 0, 0, 0, 12, 0,
+  17, 14, 11, 27, 0, 0, 0, 5, 0, 0,
+  24, 0, 14, 0, 27, 0, 77, 0, 21, 0,
+  13, 0, 0, 33, 0, 0, 27, 0, 41, 0,
+  45, 22, 0, 7, 22, 44, 69, 48, 60, 49,
+  0, 17, 100, 0, 0, 26, 19, 29, 19, 25,
+  0, 21, 0, 0, 29, 10, 19, 0, 0, 21,
+  0, 35, 0, 0, 0, 56, 7, 31, 16, 4,
+  0, 0, 48, 0, 33, 46, 0, 2, 16, 0,
+  0, 12, 0, 0, 0, 0, 0, 0, 48, 0,
+  33, 0, 0, 0, 0, 6, 51, 0, 15, 23,
+  0, 30, 42, 35, 0, 0, 24, 0, 0, 0,
+  26, 42, 0, 0, 0, 46, 0, 27, 0, 13,
+  75, 38, 0, 0, 0, 0, 17, 0, 16, 5,
+  28, 44, 0, 0, 0, 5, 8, 0, 2, 0,
+  24, 0, 4, 0, 105, 0, 27, 6, 32, 0,
+  0, 0, 0, 0, 0, 51, 48, 0, 17, 0,
+  0, 1, 56, 0, 12, 28, 33, 20, 5, 18,
+  77, 0, 0, 29, 0, 42, 17, 0, 0, 38,
+  0, 0, 71, 57, 0, 0, 0, 12, 0, 39,
+  0, 43, 0, 51, 0, 34, 20, 45, 0, 31,
+  15, 0, 71, 13, 0, 6, 44, 0, 0, 54,
+  15, 0, 0, 0, 0, 0, 23, 28, 33, 0,
+  0, 13, 0, 22, 15, 54, 0, 0, 0, 29,
+  69, 6, 16, 0, 25, 0, 11, 13, 3, 2,
+  0, 26, 5, 14, 0, 26, 0, 0, 43, 47,
+  11, 6, 0, 0, 0, 0, 43, 0, 0, 46,
+  1, 0, 0, 11, 0, 0, 48, 15, 46, 0,
+  23, 0, 104, 0, 47, 0, 0, 0, 0, 29,
+  0, 0, 20, 0, 45, 0, 38, 0, 0, 2,
+  26, 28, 73, 29, 52, 53, 0, 24, 91, 0,
+  0, 24, 16, 39, 26, 0, 0, 20, 0, 0,
+  40, 12, 3, 0, 0, 8, 0, 47, 0, 9,
+  0, 58, 0, 33, 12, 19, 0, 0, 17, 3,
+  66, 44, 0, 0, 7, 0, 0, 3, 7, 0,
+  0, 0, 0, 0, 42, 7, 32, 0, 0, 0,
+  0, 10, 51, 0, 4, 0, 0, 8, 61, 18,
+  25, 0, 32, 0, 8, 4, 12, 12, 2, 0,
+  0, 26, 0, 31, 0, 0, 56, 29, 0, 2,
+  0, 0, 0, 0, 30, 0, 7, 37, 0, 0,
+  0, 21, 0, 0, 7, 6, 14, 0, 16, 0,
+  90, 0, 25, 0, 12, 0, 0, 65, 0, 0,
+  34, 0, 36, 0, 61, 12, 0, 5, 44, 54,
+  61, 74, 64, 45, 0, 12, 72, 0, 0, 33,
+  31, 57, 17, 27, 0, 12, 0, 0, 29, 8,
+  17, 0, 0, 37, 0, 58, 0, 3, 0, 54,
+  0, 29, 24, 4, 0, 0, 35, 0, 43, 56,
+  0, 0, 7, 0, 0, 32, 0, 0, 0, 0,
+  0, 0, 70, 9, 41, 0, 0, 0, 0, 18,
+  51, 0, 0, 21, 0, 27, 40, 52, 13, 20,
+  40, 15, 0, 9, 25, 57, 3, 0, 0, 59,
+  0, 27, 0, 5, 69, 44, 0, 0, 0, 0,
+  2, 0, 12, 20, 36, 60, 0, 0, 0, 21,
+  0, 0, 0, 18, 24, 0, 0, 1, 134, 0,
+  38, 0, 44, 0, 0, 32, 0, 0, 20, 0,
+  56, 0, 35, 0, 0, 29, 28, 20, 52, 24,
+  39, 50, 3, 36, 95, 0, 10, 21, 21, 25,
+  9, 34, 0, 29, 0, 0, 63, 0, 10, 0,
+  0, 0, 0, 48, 0, 3, 0, 63, 16, 61,
+  5, 1, 0, 6, 0, 3, 79, 33, 0, 0,
+  18, 0, 0, 7, 0, 7, 0, 0, 0, 0,
+  32, 20, 20, 0, 0, 0, 0, 0, 62, 0,
+  13, 2, 0, 6, 67, 26, 0, 0, 6, 0,
+  7, 0, 11, 49, 18, 0, 0, 4, 0, 55,
+  0, 6, 64, 36, 0, 0, 3, 0, 34, 0,
+  22, 9, 31, 35, 0, 0, 0, 0, 0, 0,
+  14, 2, 12, 0, 45, 0, 77, 0, 41, 0,
+  26, 0, 0, 27, 0, 15, 17, 0, 54, 0,
+  26, 19, 0, 24, 19, 41, 54, 36, 42, 53,
+  0, 29, 105, 0, 0, 24, 36, 35, 13, 47,
+  0, 36, 0, 0, 67, 9, 22, 0, 0, 0,
+  0, 30, 0, 0, 0, 58, 16, 44, 12, 18,
+  0, 3, 21, 11, 61, 51, 0, 0, 3, 0,
+  0, 16, 0, 0, 0, 0, 0, 0, 38, 18,
+  25, 0, 0, 0, 0, 0, 56, 0, 14, 7,
+  0, 10, 79, 42, 2, 0, 11, 0, 6, 6,
+  16, 33, 14, 0, 0, 12, 0, 42, 0, 6,
+  83, 38, 0, 0, 5, 0, 37, 0, 29, 9,
+  43, 27, 0, 0, 1, 0, 0, 0, 12, 0,
+  2, 0, 32, 0, 100, 0, 40, 0, 22, 0,
+  0, 22, 0, 0, 8, 0, 32, 0, 33, 28,
+  0, 1, 0, 29, 40, 48, 56, 56, 12, 13,
+  56, 0, 0, 29, 28, 42, 16, 56, 0, 19,
+  0, 0, 57, 2, 6, 0, 0, 0, 0, 24,
+  0, 0, 0, 16, 1, 14, 21, 10, 0, 5,
+  37, 5, 41, 38, 0, 11, 0, 24, 0, 42,
+  0, 0, 0, 0, 0, 0, 70, 24, 23, 0,
+  0, 0, 11, 21, 44, 0, 8, 0, 0, 12,
+  70, 39, 7, 8, 19, 29, 0, 28, 16, 3,
+  38, 30, 0, 36, 4, 7, 0, 4, 60, 56,
+  0, 0, 5, 0, 33, 0, 12, 9, 35, 35,
+  0, 12, 2, 0, 10, 0, 0, 0, 0, 0,
+  6, 0, 111, 0, 30, 0, 9, 0, 0, 9,
+  0, 0, 15, 0, 57, 0, 37, 0, 0, 0,
+  30, 12, 51, 40, 45, 47, 0, 28, 101, 0,
+  0, 27, 0, 9, 25, 8, 0, 23, 0, 0,
+  52, 4, 22, 0, 0, 12, 0, 35, 0, 7,
+  0, 70, 5, 54, 4, 16, 0, 0, 13, 8,
+  68, 27, 0, 0, 28, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 23, 1, 27, 0, 0, 0,
+  0, 10, 48, 0, 7, 9, 0, 11, 57, 13,
+  9, 0, 13, 0, 0, 0, 22, 29, 9, 0,
+  0, 15, 0, 34, 0, 0, 59, 37, 0, 0,
+  0, 0, 12, 0, 17, 14, 11, 27, 0, 0,
+  0, 5, 0, 0, 24, 0, 14, 0, 27, 0,
+  77, 0, 21, 0, 13, 0, 0, 33, 0, 0,
+  27, 0, 41, 0, 45, 22, 0, 7, 22, 44,
+  69, 48, 60, 49, 0, 17, 100, 0, 0, 26,
+  19, 29, 19, 25, 0, 21, 0, 0, 29, 10,
+  19, 0, 0, 21, 0, 35, 0, 0, 0, 56,
+  7, 31, 16, 4, 0, 0, 48, 0, 33, 46,
+  0, 2, 16, 0, 0, 12, 0, 0, 0, 0,
+  0, 0, 48, 0, 33, 0, 0, 0, 0, 6,
+  51, 0, 15, 23, 0, 30, 42, 35, 0, 0,
+  24, 0, 0, 0, 26, 42, 0, 0, 0, 46,
+  0, 27, 0, 13, 75, 38, 0, 0, 0, 0,
+  17, 0, 16, 5, 28, 44, 0, 0, 0, 5,
+  8, 0, 2, 0, 24, 0, 4, 0, 105, 0,
+  27, 6, 32, 0, 0, 33, 0, 0, 36, 0,
+  0, 3, 48, 28, 0, 0, 10, 59, 39, 46,
+  67, 44, 12, 0, 51, 0, 0, 36, 0, 22,
+  41, 60, 0, 0, 0, 0, 19, 0, 7, 0,
+  0, 22, 0, 24, 0, 0, 0, 4, 0, 17,
+  23, 0, 0, 0, 55, 0, 1, 17, 0, 0,
+  18, 15, 0, 17, 0, 0, 0, 0, 0, 0,
+  102, 0, 17, 0, 0, 0, 5, 41, 35, 0,
+  3, 53, 0, 13, 18, 38, 12, 42, 10, 28,
+  0, 30, 22, 26, 21, 17, 0, 42, 0, 0,
+  0, 2, 49, 55, 1, 0, 0, 0, 16, 0,
+  14, 19, 32, 69, 0, 3, 0, 0, 21, 0,
+  0, 0, 17, 0, 0, 13, 100, 0, 0, 0,
+  30, 37, 0, 29, 0, 0, 20, 0, 45, 0,
+  38, 0, 0, 2, 26, 28, 73, 29, 52, 53,
+  0, 24, 91, 0, 0, 24, 16, 39, 26, 0,
+  0, 20, 0, 0, 40, 12, 3, 0, 0, 8,
+  0, 47, 0, 9, 0, 58, 0, 33, 12, 19,
+  0, 0, 17, 3, 66, 44, 0, 0, 7, 0,
+  0, 3, 7, 0, 0, 0, 0, 0, 42, 7,
+  32, 0, 0, 0, 0, 10, 51, 0, 4, 0,
+  0, 8, 61, 18, 25, 0, 32, 0, 8, 4,
+  12, 12, 2, 0, 0, 26, 0, 31, 0, 0,
+  56, 29, 0, 2, 0, 0, 0, 0, 30, 0,
+  7, 37, 0, 0, 0, 21, 0, 0, 7, 6,
+  14, 0, 16, 0, 90, 0, 25, 0, 12, 0,
+  0, 65, 0, 0, 34, 0, 36, 0, 61, 12,
+  0, 5, 44, 54, 61, 74, 64, 45, 0, 12,
+  72, 0, 0, 33, 31, 57, 17, 27, 0, 12,
+  0, 0, 29, 8, 17, 0, 0, 37, 0, 58,
+  0, 3, 0, 54, 0, 29, 24, 4, 0, 0,
+  35, 0, 43, 56, 0, 0, 7, 0, 0, 32,
+  0, 0, 0, 0, 0, 0, 70, 9, 41, 0,
+  0, 0, 0, 18, 51, 0, 0, 21, 0, 27,
+  40, 52, 13, 20, 40, 15, 0, 9, 25, 57,
+  3, 0, 0, 59, 0, 27, 0, 5, 69, 44,
+  0, 0, 0, 0, 2, 0, 12, 20, 36, 60,
+  0, 0, 0, 21, 0, 0, 0, 18, 24, 0,
+  0, 1, 134, 0, 38, 0, 44, 0, 0, 26,
+  42, 0, 40, 0, 0, 0, 68, 7, 0, 5,
+  43, 69, 21, 36, 59, 16, 3, 0, 30, 7,
+  16, 33, 0, 0, 32, 69, 0, 5, 0, 0,
+  0, 0, 0, 0, 0, 55, 0, 45, 0, 4,
+  0, 0, 0, 8, 12, 0, 0, 16, 23, 16,
+  0, 8, 0, 0, 24, 20, 0, 0, 0, 0,
+  0, 0, 0, 0, 70, 10, 16, 0, 0, 0,
+  0, 27, 24, 0, 0, 57, 0, 13, 0, 13,
+  15, 76, 12, 31, 0, 45, 9, 26, 24, 0,
+  0, 11, 0, 0, 0, 0, 52, 56, 16, 0,
+  0, 0, 1, 0, 7, 24, 39, 91, 4, 0,
+  0, 0, 0, 0, 11, 0, 10, 0, 0, 35,
+  51, 0, 0, 0, 24, 66, 0, 27, 0, 15,
+  17, 0, 54, 0, 26, 19, 0, 24, 19, 41,
+  54, 36, 42, 53, 0, 29, 105, 0, 0, 24,
+  36, 35, 13, 47, 0, 36, 0, 0, 67, 9,
+  22, 0, 0, 0, 0, 30, 0, 0, 0, 58,
+  16, 44, 12, 18, 0, 3, 21, 11, 61, 51,
+  0, 0, 3, 0, 0, 16, 0, 0, 0, 0,
+  0, 0, 38, 18, 25, 0, 0, 0, 0, 0,
+  56, 0, 14, 7, 0, 10, 79, 42, 2, 0,
+  11, 0, 6, 6, 16, 33, 14, 0, 0, 12,
+  0, 42, 0, 6, 83, 38, 0, 0, 5, 0,
+  37, 0, 29, 9, 43, 27, 0, 0, 1, 0,
+  0, 0, 12, 0, 2, 0, 32, 0, 100, 0,
+  40, 0, 22, 0, 0, 22, 0, 0, 8, 0,
+  32, 0, 33, 28, 0, 1, 0, 29, 40, 48,
+  56, 56, 12, 13, 56, 0, 0, 29, 28, 42,
+  16, 56, 0, 19, 0, 0, 57, 2, 6, 0,
+  0, 0, 0, 24, 0, 0, 0, 16, 1, 14,
+  21, 10, 0, 5, 37, 5, 41, 38, 0, 11,
+  0, 24, 0, 42, 0, 0, 0, 0, 0, 0,
+  70, 24, 23, 0, 0, 0, 11, 21, 44, 0,
+  8, 0, 0, 12, 70, 39, 7, 8, 19, 29,
+  0, 28, 16, 3, 38, 30, 0, 36, 4, 7,
+  0, 4, 60, 56, 0, 0, 5, 0, 33, 0,
+  12, 9, 35, 35, 0, 12, 2, 0, 10, 0,
+  0, 0, 0, 0, 6, 0, 111, 0, 30, 0,
+  9, 0, 0, 40, 0, 0, 15, 0, 26, 0,
+  40, 45, 1, 0, 0, 24, 16, 54, 51, 59,
+  27, 8, 15, 0, 0, 41, 35, 63, 9, 78,
+  0, 0, 8, 0, 21, 0, 0, 0, 0, 0,
+  0, 35, 0, 0, 0, 0, 0, 0, 38, 0,
+  0, 5, 22, 8, 24, 27, 0, 0, 0, 65,
+  0, 36, 0, 0, 0, 33, 0, 2, 97, 14,
+  35, 0, 0, 0, 20, 36, 43, 5, 0, 0,
+  0, 9, 52, 53, 0, 20, 31, 37, 0, 46,
+  33, 0, 42, 41, 0, 48, 0, 0, 2, 16,
+  45, 62, 0, 0, 12, 0, 34, 0, 0, 17,
+  24, 34, 0, 27, 0, 0, 25, 0, 0, 14,
+  10, 0, 0, 8, 110, 0, 42, 0, 17, 9,
+  0, 33, 0, 0, 27, 0, 41, 0, 45, 22,
+  0, 7, 22, 44, 69, 48, 60, 49, 0, 17,
+  100, 0, 0, 26, 19, 29, 19, 25, 0, 21,
+  0, 0, 29, 10, 19, 0, 0, 21, 0, 35,
+  0, 0, 0, 56, 7, 31, 16, 4, 0, 0,
+  48, 0, 33, 46, 0, 2, 16, 0, 0, 12,
+  0, 0, 0, 0, 0, 0, 48, 0, 33, 0,
+  0, 0, 0, 6, 51, 0, 15, 23, 0, 30,
+  42, 35, 0, 0, 24, 0, 0, 0, 26, 42,
+  0, 0, 0, 46, 0, 27, 0, 13, 75, 38,
+  0, 0, 0, 0, 17, 0, 16, 5, 28, 44,
+  0, 0, 0, 5, 8, 0, 2, 0, 24, 0,
+  4, 0, 105, 0, 27, 6, 32, 0, 0, 33,
+  0, 0, 36, 0, 0, 3, 48, 28, 0, 0,
+  10, 59, 39, 46, 67, 44, 12, 0, 51, 0,
+  0, 36, 0, 22, 41, 60, 0, 0, 0, 0,
+  19, 0, 7, 0, 0, 22, 0, 24, 0, 0,
+  0, 4, 0, 17, 23, 0, 0, 0, 55, 0,
+  1, 17, 0, 0, 18, 15, 0, 17, 0, 0,
+  0, 0, 0, 0, 102, 0, 17, 0, 0, 0,
+  5, 41, 35, 0, 3, 53, 0, 13, 18, 38,
+  12, 42, 10, 28, 0, 30, 22, 26, 21, 17,
+  0, 42, 0, 0, 0, 2, 49, 55, 1, 0,
+  0, 0, 16, 0, 14, 19, 32, 69, 0, 3,
+  0, 0, 21, 0, 0, 0, 17, 0, 0, 13,
+  100, 0, 0, 0, 30, 37, 12, 0, 30, 0,
+  18, 0, 0, 0, 37, 30, 0, 0, 4, 71,
+  11, 0, 44, 48, 26, 0, 25, 1, 22, 8,
+  0, 6, 34, 49, 0, 0, 16, 0, 0, 5,
+  0, 0, 40, 32, 0, 1, 1, 0, 0, 0,
+  0, 0, 9, 0, 0, 0, 31, 0, 0, 10,
+  0, 0, 0, 51, 0, 0, 2, 6, 23, 5,
+  0, 0, 106, 5, 12, 82, 0, 0, 6, 39,
+  0, 0, 0, 50, 1, 0, 0, 34, 0, 54,
+  42, 31, 0, 69, 0, 0, 0, 56, 0, 0,
+  20, 0, 0, 15, 19, 45, 10, 6, 0, 0,
+  0, 0, 0, 21, 1, 57, 6, 0, 0, 0,
+  53, 11, 0, 0, 15, 0, 0, 26, 8, 0,
+  0, 12, 42, 48, 0, 65, 0, 0, 34, 0,
+  36, 0, 61, 12, 0, 5, 44, 54, 61, 74,
+  64, 45, 0, 12, 72, 0, 0, 33, 31, 57,
+  17, 27, 0, 12, 0, 0, 29, 8, 17, 0,
+  0, 37, 0, 58, 0, 3, 0, 54, 0, 29,
+  24, 4, 0, 0, 35, 0, 43, 56, 0, 0,
+  7, 0, 0, 32, 0, 0, 0, 0, 0, 0,
+  70, 9, 41, 0, 0, 0, 0, 18, 51, 0,
+  0, 21, 0, 27, 40, 52, 13, 20, 40, 15,
+  0, 9, 25, 57, 3, 0, 0, 59, 0, 27,
+  0, 5, 69, 44, 0, 0, 0, 0, 2, 0,
+  12, 20, 36, 60, 0, 0, 0, 21, 0, 0,
+  0, 18, 24, 0, 0, 1, 134, 0, 38, 0,
+  44, 0, 0, 26, 42, 0, 40, 0, 0, 0,
+  68, 7, 0, 5, 43, 69, 21, 36, 59, 16,
+  3, 0, 30, 7, 16, 33, 0, 0, 32, 69,
+  0, 5, 0, 0, 0, 0, 0, 0, 0, 55,
+  0, 45, 0, 4, 0, 0, 0, 8, 12, 0,
+  0, 16, 23, 16, 0, 8, 0, 0, 24, 20,
+  0, 0, 0, 0, 0, 0, 0, 0, 70, 10,
+  16, 0, 0, 0, 0, 27, 24, 0, 0, 57,
+  0, 13, 0, 13, 15, 76, 12, 31, 0, 45,
+  9, 26, 24, 0, 0, 11, 0, 0, 0, 0,
+  52, 56, 16, 0, 0, 0, 1, 0, 7, 24,
+  39, 91, 4, 0, 0, 0, 0, 0, 11, 0,
+  10, 0, 0, 35, 51, 0, 0, 0, 24, 66,
+  70, 0, 17, 0, 20, 30, 0, 0, 12, 0,
+  0, 0, 2, 79, 18, 0, 26, 23, 6, 5,
+  29, 52, 17, 15, 0, 0, 8, 29, 0, 0,
+  0, 9, 0, 47, 0, 0, 7, 43, 0, 12,
+  0, 10, 0, 0, 5, 0, 16, 5, 10, 0,
+  24, 4, 0, 0, 15, 0, 23, 37, 5, 0,
+  30, 16, 31, 0, 0, 12, 69, 32, 32, 66,
+  0, 18, 10, 0, 25, 0, 0, 55, 11, 6,
+  0, 12, 0, 37, 48, 12, 31, 65, 0, 0,
+  0, 0, 0, 0, 29, 0, 0, 17, 57, 30,
+  0, 27, 0, 0, 0, 60, 0, 14, 29, 64,
+  0, 0, 0, 1, 7, 52, 58, 0, 0, 0,
+  0, 32, 0, 0, 0, 19, 23, 49, 0, 22,
+  0, 0, 8, 0, 32, 0, 33, 28, 0, 1,
+  0, 29, 40, 48, 56, 56, 12, 13, 56, 0,
+  0, 29, 28, 42, 16, 56, 0, 19, 0, 0,
+  57, 2, 6, 0, 0, 0, 0, 24, 0, 0,
+  0, 16, 1, 14, 21, 10, 0, 5, 37, 5,
+  41, 38, 0, 11, 0, 24, 0, 42, 0, 0,
+  0, 0, 0, 0, 70, 24, 23, 0, 0, 0,
+  11, 21, 44, 0, 8, 0, 0, 12, 70, 39,
+  7, 8, 19, 29, 0, 28, 16, 3, 38, 30,
+  0, 36, 4, 7, 0, 4, 60, 56, 0, 0,
+  5, 0, 33, 0, 12, 9, 35, 35, 0, 12,
+  2, 0, 10, 0, 0, 0, 0, 0, 6, 0,
+  111, 0, 30, 0, 9, 0, 0, 40, 0, 0,
+  15, 0, 26, 0, 40, 45, 1, 0, 0, 24,
+  16, 54, 51, 59, 27, 8, 15, 0, 0, 41,
+  35, 63, 9, 78, 0, 0, 8, 0, 21, 0,
+  0, 0, 0, 0, 0, 35, 0, 0, 0, 0,
+  0, 0, 38, 0, 0, 5, 22, 8, 24, 27,
+  0, 0, 0, 65, 0, 36, 0, 0, 0, 33,
+  0, 2, 97, 14, 35, 0, 0, 0, 20, 36,
+  43, 5, 0, 0, 0, 9, 52, 53, 0, 20,
+  31, 37, 0, 46, 33, 0, 42, 41, 0, 48,
+  0, 0, 2, 16, 45, 62, 0, 0, 12, 0,
+  34, 0, 0, 17, 24, 34, 0, 27, 0, 0,
+  25, 0, 0, 14, 10, 0, 0, 8, 110, 0,
+  42, 0, 17, 9, 0, 44, 12, 0, 11, 0,
+  23, 0, 54, 79, 0, 0, 0, 0, 3, 53,
+  49, 60, 36, 23, 0, 0, 0, 42, 29, 49,
+  27, 93, 0, 0, 15, 0, 15, 0, 0, 0,
+  0, 32, 0, 20, 0, 0, 0, 0, 0, 7,
+  42, 0, 0, 5, 12, 12, 37, 19, 0, 0,
+  0, 60, 0, 25, 1, 12, 0, 29, 0, 0,
+  86, 0, 36, 9, 0, 0, 13, 38, 43, 13,
+  0, 16, 0, 0, 60, 35, 0, 10, 27, 23,
+  0, 45, 43, 0, 17, 49, 0, 42, 0, 0,
+  4, 7, 24, 57, 0, 0, 23, 0, 36, 0,
+  0, 1, 19, 59, 0, 22, 0, 0, 36, 0,
+  0, 24, 28, 0, 1, 18, 93, 0, 22, 0,
+  42, 20, 0, 33, 0, 0, 36, 0, 0, 3,
+  48, 28, 0, 0, 10, 59, 39, 46, 67, 44,
+  12, 0, 51, 0, 0, 36, 0, 22, 41, 60,
+  0, 0, 0, 0, 19, 0, 7, 0, 0, 22,
+  0, 24, 0, 0, 0, 4, 0, 17, 23, 0,
+  0, 0, 55, 0, 1, 17, 0, 0, 18, 15,
+  0, 17, 0, 0, 0, 0, 0, 0, 102, 0,
+  17, 0, 0, 0, 5, 41, 35, 0, 3, 53,
+  0, 13, 18, 38, 12, 42, 10, 28, 0, 30,
+  22, 26, 21, 17, 0, 42, 0, 0, 0, 2,
+  49, 55, 1, 0, 0, 0, 16, 0, 14, 19,
+  32, 69, 0, 3, 0, 0, 21, 0, 0, 0,
+  17, 0, 0, 13, 100, 0, 0, 0, 30, 37,
+  12, 0, 30, 0, 18, 0, 0, 0, 37, 30,
+  0, 0, 4, 71, 11, 0, 44, 48, 26, 0,
+  25, 1, 22, 8, 0, 6, 34, 49, 0, 0,
+  16, 0, 0, 5, 0, 0, 40, 32, 0, 1,
+  1, 0, 0, 0, 0, 0, 9, 0, 0, 0,
+  31, 0, 0, 10, 0, 0, 0, 51, 0, 0,
+  2, 6, 23, 5, 0, 0, 106, 5, 12, 82,
+  0, 0, 6, 39, 0, 0, 0, 50, 1, 0,
+  0, 34, 0, 54, 42, 31, 0, 69, 0, 0,
+  0, 56, 0, 0, 20, 0, 0, 15, 19, 45,
+  10, 6, 0, 0, 0, 0, 0, 21, 1, 57,
+  6, 0, 0, 0, 53, 11, 0, 0, 15, 0,
+  0, 26, 8, 0, 0, 12, 42, 48, 16, 0,
+  43, 0, 0, 0, 0, 0, 40, 54, 0, 16,
+  0, 59, 14, 0, 21, 57, 23, 17, 21, 14,
+  54, 0, 0, 0, 42, 21, 0, 0, 0, 0,
+  0, 0, 0, 0, 54, 47, 0, 0, 9, 0,
+  0, 0, 0, 0, 9, 0, 0, 0, 23, 0,
+  0, 0, 10, 0, 8, 40, 0, 0, 0, 25,
+  50, 0, 59, 21, 36, 7, 0, 114, 0, 9,
+  8, 6, 0, 0, 4, 34, 0, 0, 0, 19,
+  0, 29, 42, 2, 22, 44, 6, 0, 0, 57,
+  0, 0, 19, 0, 0, 0, 14, 17, 24, 0,
+  0, 0, 0, 0, 0, 0, 0, 39, 0, 0,
+  0, 0, 81, 4, 14, 0, 20, 0, 0, 18,
+  0, 0, 0, 19, 37, 4, 0, 26, 42, 0,
+  40, 0, 0, 0, 68, 7, 0, 5, 43, 69,
+  21, 36, 59, 16, 3, 0, 30, 7, 16, 33,
+  0, 0, 32, 69, 0, 5, 0, 0, 0, 0,
+  0, 0, 0, 55, 0, 45, 0, 4, 0, 0,
+  0, 8, 12, 0, 0, 16, 23, 16, 0, 8,
+  0, 0, 24, 20, 0, 0, 0, 0, 0, 0,
+  0, 0, 70, 10, 16, 0, 0, 0, 0, 27,
+  24, 0, 0, 57, 0, 13, 0, 13, 15, 76,
+  12, 31, 0, 45, 9, 26, 24, 0, 0, 11,
+  0, 0, 0, 0, 52, 56, 16, 0, 0, 0,
+  1, 0, 7, 24, 39, 91, 4, 0, 0, 0,
+  0, 0, 11, 0, 10, 0, 0, 35, 51, 0,
+  0, 0, 24, 66, 70, 0, 17, 0, 20, 30,
+  0, 0, 12, 0, 0, 0, 2, 79, 18, 0,
+  26, 23, 6, 5, 29, 52, 17, 15, 0, 0,
+  8, 29, 0, 0, 0, 9, 0, 47, 0, 0,
+  7, 43, 0, 12, 0, 10, 0, 0, 5, 0,
+  16, 5, 10, 0, 24, 4, 0, 0, 15, 0,
+  23, 37, 5, 0, 30, 16, 31, 0, 0, 12,
+  69, 32, 32, 66, 0, 18, 10, 0, 25, 0,
+  0, 55, 11, 6, 0, 12, 0, 37, 48, 12,
+  31, 65, 0, 0, 0, 0, 0, 0, 29, 0,
+  0, 17, 57, 30, 0, 27, 0, 0, 0, 60,
+  0, 14, 29, 64, 0, 0, 0, 1, 7, 52,
+  58, 0, 0, 0, 0, 32, 0, 0, 0, 19,
+  23, 49, 22, 3, 0, 0, 24, 14, 0, 0,
+  31, 13, 0, 23, 0, 61, 30, 0, 16, 46,
+  7, 38, 53, 0, 0, 0, 7, 20, 37, 0,
+  0, 0, 0, 0, 0, 35, 0, 0, 9, 0,
+  0, 0, 0, 3, 0, 3, 12, 0, 13, 5,
+  0, 0, 57, 0, 3, 0, 0, 0, 27, 17,
+  0, 0, 5, 8, 37, 0, 0, 0, 19, 60,
+  0, 39, 0, 33, 30, 0, 37, 12, 0, 30,
+  0, 10, 5, 30, 0, 0, 41, 0, 71, 36,
+  0, 13, 0, 0, 4, 0, 18, 0, 0, 16,
+  44, 2, 0, 26, 0, 0, 0, 38, 5, 6,
+  19, 51, 0, 0, 0, 14, 43, 20, 37, 0,
+  0, 0, 39, 13, 0, 0, 0, 39, 17, 0,
+  0, 40, 0, 0, 15, 0, 26, 0, 40, 45,
+  1, 0, 0, 24, 16, 54, 51, 59, 27, 8,
+  15, 0, 0, 41, 35, 63, 9, 78, 0, 0,
+  8, 0, 21, 0, 0, 0, 0, 0, 0, 35,
+  0, 0, 0, 0, 0, 0, 38, 0, 0, 5,
+  22, 8, 24, 27, 0, 0, 0, 65, 0, 36,
+  0, 0, 0, 33, 0, 2, 97, 14, 35, 0,
+  0, 0, 20, 36, 43, 5, 0, 0, 0, 9,
+  52, 53, 0, 20, 31, 37, 0, 46, 33, 0,
+  42, 41, 0, 48, 0, 0, 2, 16, 45, 62,
+  0, 0, 12, 0, 34, 0, 0, 17, 24, 34,
+  0, 27, 0, 0, 25, 0, 0, 14, 10, 0,
+  0, 8, 110, 0, 42, 0, 17, 9, 0, 44,
+  12, 0, 11, 0, 23, 0, 54, 79, 0, 0,
+  0, 0, 3, 53, 49, 60, 36, 23, 0, 0,
+  0, 42, 29, 49, 27, 93, 0, 0, 15, 0,
+  15, 0, 0, 0, 0, 32, 0, 20, 0, 0,
+  0, 0, 0, 7, 42, 0, 0, 5, 12, 12,
+  37, 19, 0, 0, 0, 60, 0, 25, 1, 12,
+  0, 29, 0, 0, 86, 0, 36, 9, 0, 0,
+  13, 38, 43, 13, 0, 16, 0, 0, 60, 35,
+  0, 10, 27, 23, 0, 45, 43, 0, 17, 49,
+  0, 42, 0, 0, 4, 7, 24, 57, 0, 0,
+  23, 0, 36, 0, 0, 1, 19, 59, 0, 22,
+  0, 0, 36, 0, 0, 24, 28, 0, 1, 18,
+  93, 0, 22, 0, 42, 20, 0, 38, 33, 0,
+  0, 0, 27, 0, 63, 89, 0, 12, 0, 0,
+  14, 41, 49, 72, 30, 11, 0, 0, 0, 57,
+  37, 23, 43, 98, 0, 0, 23, 0, 9, 0,
+  0, 0, 0, 70, 0, 0, 14, 15, 16, 0,
+  0, 17, 24, 0, 0, 0, 12, 0, 48, 0,
+  0, 0, 0, 33, 0, 3, 10, 18, 0, 50,
+  0, 0, 81, 0, 15, 42, 0, 0, 7, 44,
+  23, 12, 4, 28, 0, 0, 63, 33, 2, 27,
+  31, 25, 2, 25, 25, 0, 0, 46, 0, 33,
+  0, 0, 0, 14, 0, 51, 3, 0, 8, 0,
+  41, 0, 0, 18, 2, 64, 10, 19, 0, 0,
+  55, 0, 0, 23, 45, 0, 7, 3, 63, 0,
+  0, 0, 78, 18, 12, 0, 30, 0, 18, 0,
+  0, 0, 37, 30, 0, 0, 4, 71, 11, 0,
+  44, 48, 26, 0, 25, 1, 22, 8, 0, 6,
+  34, 49, 0, 0, 16, 0, 0, 5, 0, 0,
+  40, 32, 0, 1, 1, 0, 0, 0, 0, 0,
+  9, 0, 0, 0, 31, 0, 0, 10, 0, 0,
+  0, 51, 0, 0, 2, 6, 23, 5, 0, 0,
+  106, 5, 12, 82, 0, 0, 6, 39, 0, 0,
+  0, 50, 1, 0, 0, 34, 0, 54, 42, 31,
+  0, 69, 0, 0, 0, 56, 0, 0, 20, 0,
+  0, 15, 19, 45, 10, 6, 0, 0, 0, 0,
+  0, 21, 1, 57, 6, 0, 0, 0, 53, 11,
+  0, 0, 15, 0, 0, 26, 8, 0, 0, 12,
+  42, 48, 16, 0, 43, 0, 0, 0, 0, 0,
+  40, 54, 0, 16, 0, 59, 14, 0, 21, 57,
+  23, 17, 21, 14, 54, 0, 0, 0, 42, 21,
+  0, 0, 0, 0, 0, 0, 0, 0, 54, 47,
+  0, 0, 9, 0, 0, 0, 0, 0, 9, 0,
+  0, 0, 23, 0, 0, 0, 10, 0, 8, 40,
+  0, 0, 0, 25, 50, 0, 59, 21, 36, 7,
+  0, 114, 0, 9, 8, 6, 0, 0, 4, 34,
+  0, 0, 0, 19, 0, 29, 42, 2, 22, 44,
+  6, 0, 0, 57, 0, 0, 19, 0, 0, 0,
+  14, 17, 24, 0, 0, 0, 0, 0, 0, 0,
+  0, 39, 0, 0, 0, 0, 81, 4, 14, 0,
+  20, 0, 0, 18, 0, 0, 0, 19, 37, 4,
+  30, 0, 21, 8, 18, 0, 0, 0, 23, 36,
+  0, 0, 0, 54, 7, 0, 0, 65, 15, 16,
+  55, 1, 62, 10, 0, 0, 52, 0, 0, 0,
+  14, 0, 0, 0, 0, 0, 9, 33, 0, 0,
+  29, 0, 0, 9, 0, 0, 15, 0, 0, 0,
+  30, 30, 0, 0, 29, 0, 20, 15, 0, 0,
+  0, 14, 64, 0, 89, 22, 8, 0, 0, 130,
+  0, 14, 8, 0, 2, 0, 14, 22, 0, 0,
+  24, 0, 8, 22, 41, 0, 39, 0, 26, 0,
+  0, 30, 15, 0, 0, 0, 0, 0, 23, 0,
+  15, 0, 0, 0, 0, 0, 0, 32, 0, 10,
+  0, 9, 0, 0, 99, 17, 35, 0, 24, 0,
+  6, 0, 0, 0, 0, 31, 25, 0, 70, 0,
+  17, 0, 20, 30, 0, 0, 12, 0, 0, 0,
+  2, 79, 18, 0, 26, 23, 6, 5, 29, 52,
+  17, 15, 0, 0, 8, 29, 0, 0, 0, 9,
+  0, 47, 0, 0, 7, 43, 0, 12, 0, 10,
+  0, 0, 5, 0, 16, 5, 10, 0, 24, 4,
+  0, 0, 15, 0, 23, 37, 5, 0, 30, 16,
+  31, 0, 0, 12, 69, 32, 32, 66, 0, 18,
+  10, 0, 25, 0, 0, 55, 11, 6, 0, 12,
+  0, 37, 48, 12, 31, 65, 0, 0, 0, 0,
+  0, 0, 29, 0, 0, 17, 57, 30, 0, 27,
+  0, 0, 0, 60, 0, 14, 29, 64, 0, 0,
+  0, 1, 7, 52, 58, 0, 0, 0, 0, 32,
+  0, 0, 0, 19, 23, 49, 22, 3, 0, 0,
+  24, 14, 0, 0, 31, 13, 0, 23, 0, 61,
+  30, 0, 16, 46, 7, 38, 53, 0, 0, 0,
+  7, 20, 37, 0, 0, 0, 0, 0, 0, 35,
+  0, 0, 9, 0, 0, 0, 0, 3, 0, 3,
+  12, 0, 13, 5, 0, 0, 57, 0, 3, 0,
+  0, 0, 27, 17, 0, 0, 5, 8, 37, 0,
+  0, 0, 19, 60, 0, 39, 0, 33, 30, 0,
+  37, 12, 0, 30, 0, 10, 5, 30, 0, 0,
+  41, 0, 71, 36, 0, 13, 0, 0, 4, 0,
+  18, 0, 0, 16, 44, 2, 0, 26, 0, 0,
+  0, 38, 5, 6, 19, 51, 0, 0, 0, 14,
+  43, 20, 37, 0, 0, 0, 39, 13, 0, 0,
+  0, 39, 17, 0, 19, 51, 0, 11, 63, 0,
+  36, 0, 33, 2, 0, 24, 2, 46, 28, 0,
+  6, 25, 11, 52, 60, 0, 0, 15, 21, 37,
+  39, 0, 0, 21, 42, 0, 0, 33, 0, 0,
+  0, 0, 0, 0, 0, 29, 0, 51, 23, 0,
+  7, 28, 0, 0, 51, 0, 37, 15, 0, 12,
+  5, 0, 0, 22, 16, 2, 15, 0, 0, 0,
+  4, 57, 0, 0, 0, 41, 5, 0, 60, 0,
+  19, 1, 4, 1, 52, 31, 4, 0, 58, 0,
+  51, 26, 21, 39, 0, 0, 0, 32, 0, 23,
+  0, 0, 55, 8, 0, 36, 1, 0, 0, 0,
+  14, 29, 63, 36, 0, 0, 0, 0, 46, 0,
+  12, 0, 4, 0, 35, 1, 40, 0, 0, 33,
+  0, 0, 0, 44, 12, 0, 11, 0, 23, 0,
+  54, 79, 0, 0, 0, 0, 3, 53, 49, 60,
+  36, 23, 0, 0, 0, 42, 29, 49, 27, 93,
+  0, 0, 15, 0, 15, 0, 0, 0, 0, 32,
+  0, 20, 0, 0, 0, 0, 0, 7, 42, 0,
+  0, 5, 12, 12, 37, 19, 0, 0, 0, 60,
+  0, 25, 1, 12, 0, 29, 0, 0, 86, 0,
+  36, 9, 0, 0, 13, 38, 43, 13, 0, 16,
+  0, 0, 60, 35, 0, 10, 27, 23, 0, 45,
+  43, 0, 17, 49, 0, 42, 0, 0, 4, 7,
+  24, 57, 0, 0, 23, 0, 36, 0, 0, 1,
+  19, 59, 0, 22, 0, 0, 36, 0, 0, 24,
+  28, 0, 1, 18, 93, 0, 22, 0, 42, 20,
+  0, 38, 33, 0, 0, 0, 27, 0, 63, 89,
+  0, 12, 0, 0, 14, 41, 49, 72, 30, 11,
+  0, 0, 0, 57, 37, 23, 43, 98, 0, 0,
+  23, 0, 9, 0, 0, 0, 0, 70, 0, 0,
+  14, 15, 16, 0, 0, 17, 24, 0, 0, 0,
+  12, 0, 48, 0, 0, 0, 0, 33, 0, 3,
+  10, 18, 0, 50, 0, 0, 81, 0, 15, 42,
+  0, 0, 7, 44, 23, 12, 4, 28, 0, 0,
+  63, 33, 2, 27, 31, 25, 2, 25, 25, 0,
+  0, 46, 0, 33, 0, 0, 0, 14, 0, 51,
+  3, 0, 8, 0, 41, 0, 0, 18, 2, 64,
+  10, 19, 0, 0, 55, 0, 0, 23, 45, 0,
+  7, 3, 63, 0, 0, 0, 78, 18, 0, 39,
+  39, 0, 0, 0, 25, 0, 78, 78, 0, 0,
+  0, 3, 0, 17, 3, 41, 11, 0, 0, 0,
+  16, 61, 36, 0, 50, 80, 0, 0, 9, 0,
+  0, 0, 0, 0, 16, 73, 0, 0, 40, 8,
+  4, 0, 0, 14, 31, 0, 0, 0, 18, 0,
+  26, 0, 2, 0, 24, 52, 0, 0, 0, 48,
+  0, 57, 2, 2, 88, 0, 14, 69, 0, 0,
+  2, 41, 6, 46, 1, 15, 0, 0, 48, 46,
+  0, 40, 32, 26, 15, 28, 27, 0, 0, 65,
+  0, 8, 0, 0, 0, 0, 0, 52, 25, 0,
+  0, 0, 32, 0, 0, 39, 0, 43, 11, 0,
+  0, 0, 70, 0, 0, 25, 54, 0, 0, 0,
+  11, 0, 0, 0, 64, 2, 16, 0, 43, 0,
+  0, 0, 0, 0, 40, 54, 0, 16, 0, 59,
+  14, 0, 21, 57, 23, 17, 21, 14, 54, 0,
+  0, 0, 42, 21, 0, 0, 0, 0, 0, 0,
+  0, 0, 54, 47, 0, 0, 9, 0, 0, 0,
+  0, 0, 9, 0, 0, 0, 23, 0, 0, 0,
+  10, 0, 8, 40, 0, 0, 0, 25, 50, 0,
+  59, 21, 36, 7, 0, 114, 0, 9, 8, 6,
+  0, 0, 4, 34, 0, 0, 0, 19, 0, 29,
+  42, 2, 22, 44, 6, 0, 0, 57, 0, 0,
+  19, 0, 0, 0, 14, 17, 24, 0, 0, 0,
+  0, 0, 0, 0, 0, 39, 0, 0, 0, 0,
+  81, 4, 14, 0, 20, 0, 0, 18, 0, 0,
+  0, 19, 37, 4, 30, 0, 21, 8, 18, 0,
+  0, 0, 23, 36, 0, 0, 0, 54, 7, 0,
+  0, 65, 15, 16, 55, 1, 62, 10, 0, 0,
+  52, 0, 0, 0, 14, 0, 0, 0, 0, 0,
+  9, 33, 0, 0, 29, 0, 0, 9, 0, 0,
+  15, 0, 0, 0, 30, 30, 0, 0, 29, 0,
+  20, 15, 0, 0, 0, 14, 64, 0, 89, 22,
+  8, 0, 0, 130, 0, 14, 8, 0, 2, 0,
+  14, 22, 0, 0, 24, 0, 8, 22, 41, 0,
+  39, 0, 26, 0, 0, 30, 15, 0, 0, 0,
+  0, 0, 23, 0, 15, 0, 0, 0, 0, 0,
+  0, 32, 0, 10, 0, 9, 0, 0, 99, 17,
+  35, 0, 24, 0, 6, 0, 0, 0, 0, 31,
+  25, 0, 5, 13, 0, 32, 19, 0, 8, 0,
+  42, 4, 0, 13, 0, 36, 0, 0, 0, 57,
+  0, 20, 78, 0, 62, 17, 0, 0, 48, 0,
+  0, 0, 23, 0, 0, 0, 0, 0, 0, 22,
+  0, 0, 41, 0, 0, 33, 9, 0, 6, 0,
+  0, 0, 32, 6, 0, 0, 33, 0, 37, 0,
+  4, 0, 0, 39, 62, 0, 84, 8, 32, 22,
+  0, 130, 0, 9, 16, 0, 0, 9, 33, 13,
+  0, 0, 29, 13, 0, 22, 32, 0, 33, 0,
+  24, 0, 0, 28, 10, 0, 0, 0, 8, 0,
+  32, 0, 10, 12, 0, 0, 0, 0, 0, 83,
+  0, 0, 2, 0, 0, 0, 98, 36, 46, 0,
+  18, 0, 8, 0, 0, 0, 0, 28, 8, 0,
+  22, 3, 0, 0, 24, 14, 0, 0, 31, 13,
+  0, 23, 0, 61, 30, 0, 16, 46, 7, 38,
+  53, 0, 0, 0, 7, 20, 37, 0, 0, 0,
+  0, 0, 0, 35, 0, 0, 9, 0, 0, 0,
+  0, 3, 0, 3, 12, 0, 13, 5, 0, 0,
+  57, 0, 3, 0, 0, 0, 27, 17, 0, 0,
+  5, 8, 37, 0, 0, 0, 19, 60, 0, 39,
+  0, 33, 30, 0, 37, 12, 0, 30, 0, 10,
+  5, 30, 0, 0, 41, 0, 71, 36, 0, 13,
+  0, 0, 4, 0, 18, 0, 0, 16, 44, 2,
+  0, 26, 0, 0, 0, 38, 5, 6, 19, 51,
+  0, 0, 0, 14, 43, 20, 37, 0, 0, 0,
+  39, 13, 0, 0, 0, 39, 17, 0, 19, 51,
+  0, 11, 63, 0, 36, 0, 33, 2, 0, 24,
+  2, 46, 28, 0, 6, 25, 11, 52, 60, 0,
+  0, 15, 21, 37, 39, 0, 0, 21, 42, 0,
+  0, 33, 0, 0, 0, 0, 0, 0, 0, 29,
+  0, 51, 23, 0, 7, 28, 0, 0, 51, 0,
+  37, 15, 0, 12, 5, 0, 0, 22, 16, 2,
+  15, 0, 0, 0, 4, 57, 0, 0, 0, 41,
+  5, 0, 60, 0, 19, 1, 4, 1, 52, 31,
+  4, 0, 58, 0, 51, 26, 21, 39, 0, 0,
+  0, 32, 0, 23, 0, 0, 55, 8, 0, 36,
+  1, 0, 0, 0, 14, 29, 63, 36, 0, 0,
+  0, 0, 46, 0, 12, 0, 4, 0, 35, 1,
+  40, 0, 0, 33, 0, 0, 0, 99, 0, 38,
+  55, 0, 74, 0, 47, 0, 0, 55, 43, 30,
+  27, 0, 3, 36, 0, 59, 80, 0, 0, 26,
+  36, 49, 32, 1, 0, 12, 51, 0, 22, 17,
+  3, 0, 0, 0, 0, 0, 0, 20, 0, 83,
+  20, 23, 0, 15, 0, 0, 26, 0, 67, 45,
+  0, 11, 23, 0, 0, 37, 22, 0, 0, 0,
+  0, 0, 14, 67, 0, 0, 0, 11, 0, 0,
+  67, 0, 16, 0, 7, 0, 80, 54, 0, 0,
+  42, 0, 37, 1, 24, 67, 6, 0, 0, 40,
+  0, 45, 0, 0, 77, 8, 0, 34, 3, 0,
+  0, 0, 25, 58, 103, 36, 0, 0, 0, 0,
+  32, 0, 0, 0, 0, 0, 21, 22, 80, 0,
+  38, 25, 8, 0, 0, 38, 33, 0, 0, 0,
+  27, 0, 63, 89, 0, 12, 0, 0, 14, 41,
+  49, 72, 30, 11, 0, 0, 0, 57, 37, 23,
+  43, 98, 0, 0, 23, 0, 9, 0, 0, 0,
+  0, 70, 0, 0, 14, 15, 16, 0, 0, 17,
+  24, 0, 0, 0, 12, 0, 48, 0, 0, 0,
+  0, 33, 0, 3, 10, 18, 0, 50, 0, 0,
+  81, 0, 15, 42, 0, 0, 7, 44, 23, 12,
+  4, 28, 0, 0, 63, 33, 2, 27, 31, 25,
+  2, 25, 25, 0, 0, 46, 0, 33, 0, 0,
+  0, 14, 0, 51, 3, 0, 8, 0, 41, 0,
+  0, 18, 2, 64, 10, 19, 0, 0, 55, 0,
+  0, 23, 45, 0, 7, 3, 63, 0, 0, 0,
+  78, 18, 0, 39, 39, 0, 0, 0, 25, 0,
+  78, 78, 0, 0, 0, 3, 0, 17, 3, 41,
+  11, 0, 0, 0, 16, 61, 36, 0, 50, 80,
+  0, 0, 9, 0, 0, 0, 0, 0, 16, 73,
+  0, 0, 40, 8, 4, 0, 0, 14, 31, 0,
+  0, 0, 18, 0, 26, 0, 2, 0, 24, 52,
+  0, 0, 0, 48, 0, 57, 2, 2, 88, 0,
+  14, 69, 0, 0, 2, 41, 6, 46, 1, 15,
+  0, 0, 48, 46, 0, 40, 32, 26, 15, 28,
+  27, 0, 0, 65, 0, 8, 0, 0, 0, 0,
+  0, 52, 25, 0, 0, 0, 32, 0, 0, 39,
+  0, 43, 11, 0, 0, 0, 70, 0, 0, 25,
+  54, 0, 0, 0, 11, 0, 0, 0, 64, 2,
+  0, 29, 0, 0, 0, 0, 15, 0, 80, 38,
+  0, 0, 0, 0, 0, 0, 0, 35, 26, 0,
+  14, 0, 0, 45, 31, 0, 42, 64, 0, 0,
+  16, 0, 0, 5, 0, 0, 32, 60, 1, 0,
+  52, 0, 0, 0, 0, 15, 40, 0, 0, 0,
+  0, 2, 11, 0, 19, 50, 26, 49, 0, 0,
+  6, 43, 3, 66, 19, 0, 76, 0, 18, 84,
+  0, 0, 2, 19, 0, 39, 0, 5, 14, 0,
+  39, 27, 3, 12, 27, 17, 21, 31, 23, 0,
+  0, 98, 2, 0, 0, 0, 0, 0, 39, 39,
+  30, 37, 0, 0, 15, 0, 0, 33, 0, 44,
+  1, 9, 0, 0, 55, 0, 0, 24, 71, 0,
+  0, 0, 0, 0, 0, 0, 42, 0, 30, 0,
+  21, 8, 18, 0, 0, 0, 23, 36, 0, 0,
+  0, 54, 7, 0, 0, 65, 15, 16, 55, 1,
+  62, 10, 0, 0, 52, 0, 0, 0, 14, 0,
+  0, 0, 0, 0, 9, 33, 0, 0, 29, 0,
+  0, 9, 0, 0, 15, 0, 0, 0, 30, 30,
+  0, 0, 29, 0, 20, 15, 0, 0, 0, 14,
+  64, 0, 89, 22, 8, 0, 0, 130, 0, 14,
+  8, 0, 2, 0, 14, 22, 0, 0, 24, 0,
+  8, 22, 41, 0, 39, 0, 26, 0, 0, 30,
+  15, 0, 0, 0, 0, 0, 23, 0, 15, 0,
+  0, 0, 0, 0, 0, 32, 0, 10, 0, 9,
+  0, 0, 99, 17, 35, 0, 24, 0, 6, 0,
+  0, 0, 0, 31, 25, 0, 5, 13, 0, 32,
+  19, 0, 8, 0, 42, 4, 0, 13, 0, 36,
+  0, 0, 0, 57, 0, 20, 78, 0, 62, 17,
+  0, 0, 48, 0, 0, 0, 23, 0, 0, 0,
+  0, 0, 0, 22, 0, 0, 41, 0, 0, 33,
+  9, 0, 6, 0, 0, 0, 32, 6, 0, 0,
+  33, 0, 37, 0, 4, 0, 0, 39, 62, 0,
+  84, 8, 32, 22, 0, 130, 0, 9, 16, 0,
+  0, 9, 33, 13, 0, 0, 29, 13, 0, 22,
+  32, 0, 33, 0, 24, 0, 0, 28, 10, 0,
+  0, 0, 8, 0, 32, 0, 10, 12, 0, 0,
+  0, 0, 0, 83, 0, 0, 2, 0, 0, 0,
+  98, 36, 46, 0, 18, 0, 8, 0, 0, 0,
+  0, 28, 8, 0, 11, 29, 0, 45, 2, 0,
+  17, 0, 59, 0, 0, 24, 0, 0, 0, 0,
+  0, 40, 1, 11, 70, 0, 8, 10, 0, 0,
+  32, 0, 0, 0, 26, 22, 0, 7, 0, 0,
+  17, 26, 2, 0, 47, 0, 0, 21, 13, 9,
+  8, 0, 0, 0, 39, 2, 0, 18, 67, 54,
+  46, 0, 21, 0, 0, 41, 60, 20, 72, 13,
+  27, 31, 0, 123, 0, 13, 17, 0, 0, 28,
+  28, 13, 17, 0, 23, 19, 0, 3, 26, 0,
+  27, 0, 23, 0, 0, 39, 0, 0, 0, 3,
+  33, 0, 52, 9, 4, 75, 0, 0, 0, 0,
+  0, 100, 0, 0, 2, 0, 0, 11, 51, 34,
+  23, 0, 31, 0, 14, 0, 0, 0, 3, 31,
+  7, 0, 19, 51, 0, 11, 63, 0, 36, 0,
+  33, 2, 0, 24, 2, 46, 28, 0, 6, 25,
+  11, 52, 60, 0, 0, 15, 21, 37, 39, 0,
+  0, 21, 42, 0, 0, 33, 0, 0, 0, 0,
+  0, 0, 0, 29, 0, 51, 23, 0, 7, 28,
+  0, 0, 51, 0, 37, 15, 0, 12, 5, 0,
+  0, 22, 16, 2, 15, 0, 0, 0, 4, 57,
+  0, 0, 0, 41, 5, 0, 60, 0, 19, 1,
+  4, 1, 52, 31, 4, 0, 58, 0, 51, 26,
+  21, 39, 0, 0, 0, 32, 0, 23, 0, 0,
+  55, 8, 0, 36, 1, 0, 0, 0, 14, 29,
+  63, 36, 0, 0, 0, 0, 46, 0, 12, 0,
+  4, 0, 35, 1, 40, 0, 0, 33, 0, 0,
+  0, 99, 0, 38, 55, 0, 74, 0, 47, 0,
+  0, 55, 43, 30, 27, 0, 3, 36, 0, 59,
+  80, 0, 0, 26, 36, 49, 32, 1, 0, 12,
+  51, 0, 22, 17, 3, 0, 0, 0, 0, 0,
+  0, 20, 0, 83, 20, 23, 0, 15, 0, 0,
+  26, 0, 67, 45, 0, 11, 23, 0, 0, 37,
+  22, 0, 0, 0, 0, 0, 14, 67, 0, 0,
+  0, 11, 0, 0, 67, 0, 16, 0, 7, 0,
+  80, 54, 0, 0, 42, 0, 37, 1, 24, 67,
+  6, 0, 0, 40, 0, 45, 0, 0, 77, 8,
+  0, 34, 3, 0, 0, 0, 25, 58, 103, 36,
+  0, 0, 0, 0, 32, 0, 0, 0, 0, 0,
+  21, 22, 80, 0, 38, 25, 8, 0, 0, 129,
+  0, 59, 30, 0, 80, 0, 63, 0, 2, 62,
+  41, 13, 24, 8, 0, 36, 0, 50, 73, 0,
+  0, 34, 40, 69, 39, 5, 0, 13, 44, 0,
+  63, 0, 17, 0, 0, 0, 0, 0, 0, 30,
+  0, 55, 31, 26, 0, 15, 0, 0, 34, 0,
+  63, 66, 0, 6, 53, 0, 0, 76, 13, 0,
+  0, 0, 0, 0, 32, 81, 0, 0, 0, 20,
+  0, 0, 48, 49, 0, 0, 0, 0, 65, 72,
+  1, 0, 21, 0, 34, 0, 17, 106, 73, 0,
+  0, 66, 0, 33, 16, 0, 73, 22, 0, 27,
+  0, 0, 0, 0, 17, 70, 123, 31, 8, 0,
+  18, 0, 19, 0, 0, 0, 0, 0, 16, 21,
+  113, 10, 49, 16, 11, 0, 0, 39, 39, 0,
+  0, 0, 25, 0, 78, 78, 0, 0, 0, 3,
+  0, 17, 3, 41, 11, 0, 0, 0, 16, 61,
+  36, 0, 50, 80, 0, 0, 9, 0, 0, 0,
+  0, 0, 16, 73, 0, 0, 40, 8, 4, 0,
+  0, 14, 31, 0, 0, 0, 18, 0, 26, 0,
+  2, 0, 24, 52, 0, 0, 0, 48, 0, 57,
+  2, 2, 88, 0, 14, 69, 0, 0, 2, 41,
+  6, 46, 1, 15, 0, 0, 48, 46, 0, 40,
+  32, 26, 15, 28, 27, 0, 0, 65, 0, 8,
+  0, 0, 0, 0, 0, 52, 25, 0, 0, 0,
+  32, 0, 0, 39, 0, 43, 11, 0, 0, 0,
+  70, 0, 0, 25, 54, 0, 0, 0, 11, 0,
+  0, 0, 64, 2, 0, 29, 0, 0, 0, 0,
+  15, 0, 80, 38, 0, 0, 0, 0, 0, 0,
+  0, 35, 26, 0, 14, 0, 0, 45, 31, 0,
+  42, 64, 0, 0, 16, 0, 0, 5, 0, 0,
+  32, 60, 1, 0, 52, 0, 0, 0, 0, 15,
+  40, 0, 0, 0, 0, 2, 11, 0, 19, 50,
+  26, 49, 0, 0, 6, 43, 3, 66, 19, 0,
+  76, 0, 18, 84, 0, 0, 2, 19, 0, 39,
+  0, 5, 14, 0, 39, 27, 3, 12, 27, 17,
+  21, 31, 23, 0, 0, 98, 2, 0, 0, 0,
+  0, 0, 39, 39, 30, 37, 0, 0, 15, 0,
+  0, 33, 0, 44, 1, 9, 0, 0, 55, 0,
+  0, 24, 71, 0, 0, 0, 0, 0, 0, 0,
+  42, 0, 0, 21, 0, 0, 2, 0, 15, 0,
+  74, 29, 0, 18, 0, 12, 0, 34, 16, 63,
+  31, 0, 0, 0, 0, 43, 15, 0, 18, 55,
+  0, 0, 44, 0, 0, 15, 0, 0, 19, 53,
+  0, 0, 37, 0, 0, 0, 0, 6, 28, 0,
+  0, 0, 0, 19, 26, 0, 3, 71, 33, 50,
+  0, 0, 10, 18, 0, 54, 2, 0, 62, 0,
+  20, 53, 0, 0, 0, 10, 0, 34, 0, 0,
+  19, 0, 50, 13, 6, 0, 30, 11, 7, 22,
+  34, 0, 0, 109, 0, 6, 0, 0, 0, 0,
+  36, 46, 17, 32, 7, 0, 17, 0, 0, 18,
+  0, 40, 0, 25, 0, 9, 51, 0, 0, 9,
+  68, 0, 0, 9, 34, 0, 14, 0, 50, 0,
+  5, 13, 0, 32, 19, 0, 8, 0, 42, 4,
+  0, 13, 0, 36, 0, 0, 0, 57, 0, 20,
+  78, 0, 62, 17, 0, 0, 48, 0, 0, 0,
+  23, 0, 0, 0, 0, 0, 0, 22, 0, 0,
+  41, 0, 0, 33, 9, 0, 6, 0, 0, 0,
+  32, 6, 0, 0, 33, 0, 37, 0, 4, 0,
+  0, 39, 62, 0, 84, 8, 32, 22, 0, 130,
+  0, 9, 16, 0, 0, 9, 33, 13, 0, 0,
+  29, 13, 0, 22, 32, 0, 33, 0, 24, 0,
+  0, 28, 10, 0, 0, 0, 8, 0, 32, 0,
+  10, 12, 0, 0, 0, 0, 0, 83, 0, 0,
+  2, 0, 0, 0, 98, 36, 46, 0, 18, 0,
+  8, 0, 0, 0, 0, 28, 8, 0, 11, 29,
+  0, 45, 2, 0, 17, 0, 59, 0, 0, 24,
+  0, 0, 0, 0, 0, 40, 1, 11, 70, 0,
+  8, 10, 0, 0, 32, 0, 0, 0, 26, 22,
+  0, 7, 0, 0, 17, 26, 2, 0, 47, 0,
+  0, 21, 13, 9, 8, 0, 0, 0, 39, 2,
+  0, 18, 67, 54, 46, 0, 21, 0, 0, 41,
+  60, 20, 72, 13, 27, 31, 0, 123, 0, 13,
+  17, 0, 0, 28, 28, 13, 17, 0, 23, 19,
+  0, 3, 26, 0, 27, 0, 23, 0, 0, 39,
+  0, 0, 0, 3, 33, 0, 52, 9, 4, 75,
+  0, 0, 0, 0, 0, 100, 0, 0, 2, 0,
+  0, 11, 51, 34, 23, 0, 31, 0, 14, 0,
+  0, 0, 3, 31, 7, 0, 11, 24, 0, 20,
+  0, 8, 0, 0, 72, 0, 0, 35, 0, 0,
+  0, 0, 0, 45, 6, 0, 35, 11, 0, 11,
+  0, 0, 13, 0, 0, 0, 2, 13, 0, 0,
+  0, 0, 29, 44, 34, 0, 50, 0, 0, 11,
+  0, 7, 0, 0, 0, 0, 8, 60, 0, 0,
+  108, 136, 34, 5, 37, 0, 0, 24, 71, 27,
+  134, 39, 0, 0, 0, 158, 66, 0, 9, 0,
+  0, 10, 0, 0, 39, 0, 9, 0, 13, 5,
+  9, 0, 4, 0, 70, 0, 0, 80, 0, 0,
+  27, 0, 26, 0, 39, 45, 33, 130, 0, 0,
+  0, 0, 0, 84, 0, 0, 0, 0, 0, 24,
+  23, 13, 0, 0, 36, 0, 0, 0, 0, 0,
+  23, 31, 12, 0, 0, 99, 0, 38, 55, 0,
+  74, 0, 47, 0, 0, 55, 43, 30, 27, 0,
+  3, 36, 0, 59, 80, 0, 0, 26, 36, 49,
+  32, 1, 0, 12, 51, 0, 22, 17, 3, 0,
+  0, 0, 0, 0, 0, 20, 0, 83, 20, 23,
+  0, 15, 0, 0, 26, 0, 67, 45, 0, 11,
+  23, 0, 0, 37, 22, 0, 0, 0, 0, 0,
+  14, 67, 0, 0, 0, 11, 0, 0, 67, 0,
+  16, 0, 7, 0, 80, 54, 0, 0, 42, 0,
+  37, 1, 24, 67, 6, 0, 0, 40, 0, 45,
+  0, 0, 77, 8, 0, 34, 3, 0, 0, 0,
+  25, 58, 103, 36, 0, 0, 0, 0, 32, 0,
+  0, 0, 0, 0, 21, 22, 80, 0, 38, 25,
+  8, 0, 0, 129, 0, 59, 30, 0, 80, 0,
+  63, 0, 2, 62, 41, 13, 24, 8, 0, 36,
+  0, 50, 73, 0, 0, 34, 40, 69, 39, 5,
+  0, 13, 44, 0, 63, 0, 17, 0, 0, 0,
+  0, 0, 0, 30, 0, 55, 31, 26, 0, 15,
+  0, 0, 34, 0, 63, 66, 0, 6, 53, 0,
+  0, 76, 13, 0, 0, 0, 0, 0, 32, 81,
+  0, 0, 0, 20, 0, 0, 48, 49, 0, 0,
+  0, 0, 65, 72, 1, 0, 21, 0, 34, 0,
+  17, 106, 73, 0, 0, 66, 0, 33, 16, 0,
+  73, 22, 0, 27, 0, 0, 0, 0, 17, 70,
+  123, 31, 8, 0, 18, 0, 19, 0, 0, 0,
+  0, 0, 16, 21, 113, 10, 49, 16, 11, 0,
+  4, 112, 0, 54, 23, 0, 15, 0, 85, 7,
+  0, 53, 5, 3, 0, 0, 0, 18, 0, 13,
+  49, 0, 0, 31, 10, 11, 45, 17, 0, 0,
+  0, 9, 32, 0, 23, 0, 0, 18, 0, 0,
+  0, 0, 0, 18, 25, 27, 0, 0, 0, 0,
+  33, 14, 7, 64, 44, 38, 45, 0, 0, 10,
+  0, 11, 7, 12, 0, 7, 17, 45, 0, 29,
+  0, 13, 26, 0, 1, 55, 0, 8, 5, 0,
+  20, 44, 16, 23, 0, 0, 15, 29, 38, 55,
+  93, 0, 0, 17, 0, 0, 52, 0, 35, 52,
+  0, 80, 0, 0, 0, 0, 0, 84, 112, 0,
+  31, 0, 15, 3, 1, 0, 0, 0, 0, 0,
+  3, 0, 28, 0, 45, 32, 0, 0, 0, 29,
+  0, 0, 0, 0, 15, 0, 80, 38, 0, 0,
+  0, 0, 0, 0, 0, 35, 26, 0, 14, 0,
+  0, 45, 31, 0, 42, 64, 0, 0, 16, 0,
+  0, 5, 0, 0, 32, 60, 1, 0, 52, 0,
+  0, 0, 0, 15, 40, 0, 0, 0, 0, 2,
+  11, 0, 19, 50, 26, 49, 0, 0, 6, 43,
+  3, 66, 19, 0, 76, 0, 18, 84, 0, 0,
+  2, 19, 0, 39, 0, 5, 14, 0, 39, 27,
+  3, 12, 27, 17, 21, 31, 23, 0, 0, 98,
+  2, 0, 0, 0, 0, 0, 39, 39, 30, 37,
+  0, 0, 15, 0, 0, 33, 0, 44, 1, 9,
+  0, 0, 55, 0, 0, 24, 71, 0, 0, 0,
+  0, 0, 0, 0, 42, 0, 0, 21, 0, 0,
+  2, 0, 15, 0, 74, 29, 0, 18, 0, 12,
+  0, 34, 16, 63, 31, 0, 0, 0, 0, 43,
+  15, 0, 18, 55, 0, 0, 44, 0, 0, 15,
+  0, 0, 19, 53, 0, 0, 37, 0, 0, 0,
+  0, 6, 28, 0, 0, 0, 0, 19, 26, 0,
+  3, 71, 33, 50, 0, 0, 10, 18, 0, 54,
+  2, 0, 62, 0, 20, 53, 0, 0, 0, 10,
+  0, 34, 0, 0, 19, 0, 50, 13, 6, 0,
+  30, 11, 7, 22, 34, 0, 0, 109, 0, 6,
+  0, 0, 0, 0, 36, 46, 17, 32, 7, 0,
+  17, 0, 0, 18, 0, 40, 0, 25, 0, 9,
+  51, 0, 0, 9, 68, 0, 0, 9, 34, 0,
+  14, 0, 50, 0, 0, 44, 0, 0, 11, 0,
+  30, 0, 44, 53, 0, 11, 18, 12, 0, 82,
+  51, 71, 16, 19, 0, 0, 0, 63, 28, 37,
+  0, 67, 2, 0, 45, 0, 33, 25, 0, 0,
+  0, 52, 0, 0, 18, 0, 13, 17, 0, 3,
+  20, 20, 0, 7, 2, 12, 49, 14, 0, 32,
+  19, 44, 0, 21, 12, 0, 0, 24, 0, 0,
+  80, 1, 40, 3, 0, 0, 8, 26, 18, 45,
+  0, 0, 0, 0, 87, 25, 0, 0, 27, 11,
+  0, 26, 28, 6, 18, 90, 0, 29, 0, 0,
+  0, 0, 0, 71, 9, 2, 14, 0, 37, 0,
+  0, 24, 1, 42, 0, 27, 0, 6, 32, 0,
+  0, 6, 43, 0, 9, 0, 103, 0, 43, 0,
+  51, 0, 11, 29, 0, 45, 2, 0, 17, 0,
+  59, 0, 0, 24, 0, 0, 0, 0, 0, 40,
+  1, 11, 70, 0, 8, 10, 0, 0, 32, 0,
+  0, 0, 26, 22, 0, 7, 0, 0, 17, 26,
+  2, 0, 47, 0, 0, 21, 13, 9, 8, 0,
+  0, 0, 39, 2, 0, 18, 67, 54, 46, 0,
+  21, 0, 0, 41, 60, 20, 72, 13, 27, 31,
+  0, 123, 0, 13, 17, 0, 0, 28, 28, 13,
+  17, 0, 23, 19, 0, 3, 26, 0, 27, 0,
+  23, 0, 0, 39, 0, 0, 0, 3, 33, 0,
+  52, 9, 4, 75, 0, 0, 0, 0, 0, 100,
+  0, 0, 2, 0, 0, 11, 51, 34, 23, 0,
+  31, 0, 14, 0, 0, 0, 3, 31, 7, 0,
+  11, 24, 0, 20, 0, 8, 0, 0, 72, 0,
+  0, 35, 0, 0, 0, 0, 0, 45, 6, 0,
+  35, 11, 0, 11, 0, 0, 13, 0, 0, 0,
+  2, 13, 0, 0, 0, 0, 29, 44, 34, 0,
+  50, 0, 0, 11, 0, 7, 0, 0, 0, 0,
+  8, 60, 0, 0, 108, 136, 34, 5, 37, 0,
+  0, 24, 71, 27, 134, 39, 0, 0, 0, 158,
+  66, 0, 9, 0, 0, 10, 0, 0, 39, 0,
+  9, 0, 13, 5, 9, 0, 4, 0, 70, 0,
+  0, 80, 0, 0, 27, 0, 26, 0, 39, 45,
+  33, 130, 0, 0, 0, 0, 0, 84, 0, 0,
+  0, 0, 0, 24, 23, 13, 0, 0, 36, 0,
+  0, 0, 0, 0, 23, 31, 12, 0, 0, 15,
+  0, 0, 0, 50, 0, 0, 53, 14, 0, 2,
+  0, 0, 0, 0, 0, 48, 12, 0, 0, 0,
+  0, 19, 0, 0, 0, 3, 0, 0, 3, 11,
+  0, 0, 0, 9, 43, 82, 35, 0, 70, 0,
+  5, 16, 0, 7, 7, 0, 0, 0, 0, 63,
+  0, 0, 57, 160, 47, 9, 35, 0, 0, 29,
+  57, 0, 153, 4, 0, 0, 0, 121, 122, 0,
+  14, 27, 0, 33, 0, 0, 46, 0, 6, 0,
+  5, 13, 16, 0, 0, 10, 64, 0, 0, 128,
+  0, 0, 35, 0, 0, 0, 10, 76, 58, 96,
+  0, 0, 0, 0, 0, 62, 0, 0, 0, 3,
+  0, 35, 0, 0, 0, 0, 53, 0, 0, 0,
+  0, 0, 18, 28, 29, 0, 0, 129, 0, 59,
+  30, 0, 80, 0, 63, 0, 2, 62, 41, 13,
+  24, 8, 0, 36, 0, 50, 73, 0, 0, 34,
+  40, 69, 39, 5, 0, 13, 44, 0, 63, 0,
+  17, 0, 0, 0, 0, 0, 0, 30, 0, 55,
+  31, 26, 0, 15, 0, 0, 34, 0, 63, 66,
+  0, 6, 53, 0, 0, 76, 13, 0, 0, 0,
+  0, 0, 32, 81, 0, 0, 0, 20, 0, 0,
+  48, 49, 0, 0, 0, 0, 65, 72, 1, 0,
+  21, 0, 34, 0, 17, 106, 73, 0, 0, 66,
+  0, 33, 16, 0, 73, 22, 0, 27, 0, 0,
+  0, 0, 17, 70, 123, 31, 8, 0, 18, 0,
+  19, 0, 0, 0, 0, 0, 16, 21, 113, 10,
+  49, 16, 11, 0, 4, 112, 0, 54, 23, 0,
+  15, 0, 85, 7, 0, 53, 5, 3, 0, 0,
+  0, 18, 0, 13, 49, 0, 0, 31, 10, 11,
+  45, 17, 0, 0, 0, 9, 32, 0, 23, 0,
+  0, 18, 0, 0, 0, 0, 0, 18, 25, 27,
+  0, 0, 0, 0, 33, 14, 7, 64, 44, 38,
+  45, 0, 0, 10, 0, 11, 7, 12, 0, 7,
+  17, 45, 0, 29, 0, 13, 26, 0, 1, 55,
+  0, 8, 5, 0, 20, 44, 16, 23, 0, 0,
+  15, 29, 38, 55, 93, 0, 0, 17, 0, 0,
+  52, 0, 35, 52, 0, 80, 0, 0, 0, 0,
+  0, 84, 112, 0, 31, 0, 15, 3, 1, 0,
+  0, 0, 0, 0, 3, 0, 28, 0, 45, 32,
+  0, 0, 29, 57, 0, 24, 0, 27, 0, 0,
+  42, 0, 0, 31, 0, 13, 0, 0, 0, 38,
+  15, 0, 3, 20, 0, 0, 0, 0, 2, 0,
+  0, 0, 0, 33, 0, 0, 0, 22, 12, 36,
+  5, 0, 22, 0, 25, 16, 5, 0, 6, 0,
+  0, 0, 0, 74, 0, 26, 125, 100, 30, 22,
+  18, 0, 0, 43, 75, 37, 102, 36, 0, 20,
+  0, 109, 123, 3, 27, 0, 0, 17, 0, 0,
+  34, 0, 0, 1, 35, 33, 3, 0, 0, 8,
+  62, 0, 21, 30, 0, 0, 38, 0, 43, 0,
+  9, 59, 0, 117, 0, 0, 0, 0, 0, 80,
+  21, 0, 14, 0, 0, 24, 0, 0, 0, 0,
+  10, 0, 0, 0, 0, 0, 32, 35, 0, 0,
+  0, 21, 0, 0, 2, 0, 15, 0, 74, 29,
+  0, 18, 0, 12, 0, 34, 16, 63, 31, 0,
+  0, 0, 0, 43, 15, 0, 18, 55, 0, 0,
+  44, 0, 0, 15, 0, 0, 19, 53, 0, 0,
+  37, 0, 0, 0, 0, 6, 28, 0, 0, 0,
+  0, 19, 26, 0, 3, 71, 33, 50, 0, 0,
+  10, 18, 0, 54, 2, 0, 62, 0, 20, 53,
+  0, 0, 0, 10, 0, 34, 0, 0, 19, 0,
+  50, 13, 6, 0, 30, 11, 7, 22, 34, 0,
+  0, 109, 0, 6, 0, 0, 0, 0, 36, 46,
+  17, 32, 7, 0, 17, 0, 0, 18, 0, 40,
+  0, 25, 0, 9, 51, 0, 0, 9, 68, 0,
+  0, 9, 34, 0, 14, 0, 50, 0, 0, 44,
+  0, 0, 11, 0, 30, 0, 44, 53, 0, 11,
+  18, 12, 0, 82, 51, 71, 16, 19, 0, 0,
+  0, 63, 28, 37, 0, 67, 2, 0, 45, 0,
+  33, 25, 0, 0, 0, 52, 0, 0, 18, 0,
+  13, 17, 0, 3, 20, 20, 0, 7, 2, 12,
+  49, 14, 0, 32, 19, 44, 0, 21, 12, 0,
+  0, 24, 0, 0, 80, 1, 40, 3, 0, 0,
+  8, 26, 18, 45, 0, 0, 0, 0, 87, 25,
+  0, 0, 27, 11, 0, 26, 28, 6, 18, 90,
+  0, 29, 0, 0, 0, 0, 0, 71, 9, 2,
+  14, 0, 37, 0, 0, 24, 1, 42, 0, 27,
+  0, 6, 32, 0, 0, 6, 43, 0, 9, 0,
+  103, 0, 43, 0, 51, 0, 0, 102, 14, 0,
+  4, 0, 39, 0, 27, 51, 8, 13, 23, 3,
+  26, 91, 67, 61, 21, 56, 0, 0, 0, 56,
+  53, 69, 6, 74, 0, 0, 14, 0, 81, 1,
+  0, 0, 0, 25, 0, 38, 0, 16, 42, 22,
+  1, 7, 22, 19, 0, 49, 2, 1, 68, 52,
+  0, 0, 0, 9, 0, 50, 0, 0, 0, 0,
+  0, 0, 91, 11, 34, 0, 0, 0, 15, 26,
+  42, 23, 0, 6, 0, 4, 107, 11, 0, 0,
+  11, 8, 10, 15, 30, 12, 42, 45, 0, 41,
+  0, 10, 0, 0, 0, 81, 0, 0, 14, 0,
+  46, 0, 23, 15, 32, 37, 0, 0, 0, 0,
+  0, 0, 0, 0, 12, 0, 30, 11, 149, 0,
+  76, 0, 46, 0, 11, 24, 0, 20, 0, 8,
+  0, 0, 72, 0, 0, 35, 0, 0, 0, 0,
+  0, 45, 6, 0, 35, 11, 0, 11, 0, 0,
+  13, 0, 0, 0, 2, 13, 0, 0, 0, 0,
+  29, 44, 34, 0, 50, 0, 0, 11, 0, 7,
+  0, 0, 0, 0, 8, 60, 0, 0, 108, 136,
+  34, 5, 37, 0, 0, 24, 71, 27, 134, 39,
+  0, 0, 0, 158, 66, 0, 9, 0, 0, 10,
+  0, 0, 39, 0, 9, 0, 13, 5, 9, 0,
+  4, 0, 70, 0, 0, 80, 0, 0, 27, 0,
+  26, 0, 39, 45, 33, 130, 0, 0, 0, 0,
+  0, 84, 0, 0, 0, 0, 0, 24, 23, 13,
+  0, 0, 36, 0, 0, 0, 0, 0, 23, 31,
+  12, 0, 0, 15, 0, 0, 0, 50, 0, 0,
+  53, 14, 0, 2, 0, 0, 0, 0, 0, 48,
+  12, 0, 0, 0, 0, 19, 0, 0, 0, 3,
+  0, 0, 3, 11, 0, 0, 0, 9, 43, 82,
+  35, 0, 70, 0, 5, 16, 0, 7, 7, 0,
+  0, 0, 0, 63, 0, 0, 57, 160, 47, 9,
+  35, 0, 0, 29, 57, 0, 153, 4, 0, 0,
+  0, 121, 122, 0, 14, 27, 0, 33, 0, 0,
+  46, 0, 6, 0, 5, 13, 16, 0, 0, 10,
+  64, 0, 0, 128, 0, 0, 35, 0, 0, 0,
+  10, 76, 58, 96, 0, 0, 0, 0, 0, 62,
+  0, 0, 0, 3, 0, 35, 0, 0, 0, 0,
+  53, 0, 0, 0, 0, 0, 18, 28, 29, 0,
+  0, 39, 0, 0, 0, 29, 0, 0, 78, 47,
+  0, 0, 30, 0, 0, 88, 39, 61, 6, 17,
+  0, 0, 0, 41, 0, 0, 7, 53, 6, 0,
+  17, 0, 36, 0, 0, 0, 35, 96, 0, 0,
+  48, 0, 9, 30, 0, 28, 42, 19, 0, 0,
+  0, 32, 2, 0, 4, 101, 46, 8, 0, 0,
+  0, 0, 0, 0, 66, 0, 6, 4, 24, 53,
+  52, 0, 17, 37, 0, 49, 0, 0, 5, 0,
+  39, 0, 0, 0, 0, 1, 0, 30, 51, 0,
+  0, 131, 0, 0, 11, 0, 0, 0, 0, 86,
+  87, 31, 0, 0, 0, 0, 0, 48, 0, 13,
+  0, 11, 0, 8, 2, 0, 0, 2, 51, 0,
+  25, 0, 41, 0, 28, 12, 43, 0, 4, 112,
+  0, 54, 23, 0, 15, 0, 85, 7, 0, 53,
+  5, 3, 0, 0, 0, 18, 0, 13, 49, 0,
+  0, 31, 10, 11, 45, 17, 0, 0, 0, 9,
+  32, 0, 23, 0, 0, 18, 0, 0, 0, 0,
+  0, 18, 25, 27, 0, 0, 0, 0, 33, 14,
+  7, 64, 44, 38, 45, 0, 0, 10, 0, 11,
+  7, 12, 0, 7, 17, 45, 0, 29, 0, 13,
+  26, 0, 1, 55, 0, 8, 5, 0, 20, 44,
+  16, 23, 0, 0, 15, 29, 38, 55, 93, 0,
+  0, 17, 0, 0, 52, 0, 35, 52, 0, 80,
+  0, 0, 0, 0, 0, 84, 112, 0, 31, 0,
+  15, 3, 1, 0, 0, 0, 0, 0, 3, 0,
+  28, 0, 45, 32, 0, 0, 29, 57, 0, 24,
+  0, 27, 0, 0, 42, 0, 0, 31, 0, 13,
+  0, 0, 0, 38, 15, 0, 3, 20, 0, 0,
+  0, 0, 2, 0, 0, 0, 0, 33, 0, 0,
+  0, 22, 12, 36, 5, 0, 22, 0, 25, 16,
+  5, 0, 6, 0, 0, 0, 0, 74, 0, 26,
+  125, 100, 30, 22, 18, 0, 0, 43, 75, 37,
+  102, 36, 0, 20, 0, 109, 123, 3, 27, 0,
+  0, 17, 0, 0, 34, 0, 0, 1, 35, 33,
+  3, 0, 0, 8, 62, 0, 21, 30, 0, 0,
+  38, 0, 43, 0, 9, 59, 0, 117, 0, 0,
+  0, 0, 0, 80, 21, 0, 14, 0, 0, 24,
+  0, 0, 0, 0, 10, 0, 0, 0, 0, 0,
+  32, 35, 0, 0, 10, 25, 0, 0, 0, 85,
+  0, 0, 22, 0, 0, 0, 0, 0, 0, 0,
+  0, 39, 3, 8, 0, 40, 0, 0, 0, 0,
+  8, 3, 0, 0, 0, 38, 0, 0, 0, 43,
+  47, 68, 23, 0, 46, 0, 22, 15, 0, 13,
+  59, 13, 0, 0, 0, 55, 0, 0, 112, 118,
+  34, 26, 48, 0, 0, 57, 67, 0, 179, 5,
+  0, 32, 0, 139, 175, 0, 10, 15, 0, 0,
+  0, 0, 42, 0, 0, 0, 28, 19, 31, 0,
+  0, 11, 42, 0, 0, 116, 13, 0, 34, 0,
+  0, 0, 6, 54, 43, 142, 0, 0, 0, 0,
+  0, 58, 0, 0, 0, 29, 0, 30, 0, 10,
+  0, 0, 53, 0, 0, 0, 0, 0, 1, 29,
+  1, 6, 0, 44, 0, 0, 11, 0, 30, 0,
+  44, 53, 0, 11, 18, 12, 0, 82, 51, 71,
+  16, 19, 0, 0, 0, 63, 28, 37, 0, 67,
+  2, 0, 45, 0, 33, 25, 0, 0, 0, 52,
+  0, 0, 18, 0, 13, 17, 0, 3, 20, 20,
+  0, 7, 2, 12, 49, 14, 0, 32, 19, 44,
+  0, 21, 12, 0, 0, 24, 0, 0, 80, 1,
+  40, 3, 0, 0, 8, 26, 18, 45, 0, 0,
+  0, 0, 87, 25, 0, 0, 27, 11, 0, 26,
+  28, 6, 18, 90, 0, 29, 0, 0, 0, 0,
+  0, 71, 9, 2, 14, 0, 37, 0, 0, 24,
+  1, 42, 0, 27, 0, 6, 32, 0, 0, 6,
+  43, 0, 9, 0, 103, 0, 43, 0, 51, 0,
+  0, 102, 14, 0, 4, 0, 39, 0, 27, 51,
+  8, 13, 23, 3, 26, 91, 67, 61, 21, 56,
+  0, 0, 0, 56, 53, 69, 6, 74, 0, 0,
+  14, 0, 81, 1, 0, 0, 0, 25, 0, 38,
+  0, 16, 42, 22, 1, 7, 22, 19, 0, 49,
+  2, 1, 68, 52, 0, 0, 0, 9, 0, 50,
+  0, 0, 0, 0, 0, 0, 91, 11, 34, 0,
+  0, 0, 15, 26, 42, 23, 0, 6, 0, 4,
+  107, 11, 0, 0, 11, 8, 10, 15, 30, 12,
+  42, 45, 0, 41, 0, 10, 0, 0, 0, 81,
+  0, 0, 14, 0, 46, 0, 23, 15, 32, 37,
+  0, 0, 0, 0, 0, 0, 0, 0, 12, 0,
+  30, 11, 149, 0, 76, 0, 46, 0, 0, 131,
+  52, 5, 17, 0, 45, 0, 11, 44, 5, 23,
+  60, 0, 17, 55, 55, 49, 15, 72, 0, 0,
+  12, 32, 54, 53, 11, 54, 0, 20, 0, 0,
+  76, 0, 17, 0, 0, 0, 0, 41, 0, 25,
+  68, 41, 28, 22, 40, 0, 0, 52, 0, 3,
+  85, 24, 0, 0, 0, 0, 0, 44, 4, 0,
+  0, 5, 0, 0, 29, 13, 13, 0, 0, 0,
+  8, 16, 74, 5, 15, 32, 0, 0, 97, 0,
+  0, 0, 14, 0, 30, 16, 22, 9, 0, 0,
+  0, 20, 0, 26, 0, 0, 0, 38, 5, 16,
+  9, 0, 39, 0, 48, 8, 25, 53, 0, 0,
+  0, 5, 0, 0, 0, 24, 33, 0, 34, 5,
+  77, 0, 62, 0, 29, 0, 0, 15, 0, 0,
+  0, 50, 0, 0, 53, 14, 0, 2, 0, 0,
+  0, 0, 0, 48, 12, 0, 0, 0, 0, 19,
+  0, 0, 0, 3, 0, 0, 3, 11, 0, 0,
+  0, 9, 43, 82, 35, 0, 70, 0, 5, 16,
+  0, 7, 7, 0, 0, 0, 0, 63, 0, 0,
+  57, 160, 47, 9, 35, 0, 0, 29, 57, 0,
+  153, 4, 0, 0, 0, 121, 122, 0, 14, 27,
+  0, 33, 0, 0, 46, 0, 6, 0, 5, 13,
+  16, 0, 0, 10, 64, 0, 0, 128, 0, 0,
+  35, 0, 0, 0, 10, 76, 58, 96, 0, 0,
+  0, 0, 0, 62, 0, 0, 0, 3, 0, 35,
+  0, 0, 0, 0, 53, 0, 0, 0, 0, 0,
+  18, 28, 29, 0, 0, 39, 0, 0, 0, 29,
+  0, 0, 78, 47, 0, 0, 30, 0, 0, 88,
+  39, 61, 6, 17, 0, 0, 0, 41, 0, 0,
+  7, 53, 6, 0, 17, 0, 36, 0, 0, 0,
+  35, 96, 0, 0, 48, 0, 9, 30, 0, 28,
+  42, 19, 0, 0, 0, 32, 2, 0, 4, 101,
+  46, 8, 0, 0, 0, 0, 0, 0, 66, 0,
+  6, 4, 24, 53, 52, 0, 17, 37, 0, 49,
+  0, 0, 5, 0, 39, 0, 0, 0, 0, 1,
+  0, 30, 51, 0, 0, 131, 0, 0, 11, 0,
+  0, 0, 0, 86, 87, 31, 0, 0, 0, 0,
+  0, 48, 0, 13, 0, 11, 0, 8, 2, 0,
+  0, 2, 51, 0, 25, 0, 41, 0, 28, 12,
+  43, 0, 0, 93, 41, 0, 7, 0, 52, 3,
+  86, 40, 12, 0, 76, 3, 0, 125, 70, 39,
+  2, 33, 0, 0, 0, 54, 36, 13, 16, 61,
+  3, 0, 21, 0, 90, 1, 0, 0, 0, 58,
+  0, 29, 9, 0, 26, 52, 0, 59, 72, 36,
+  0, 44, 0, 0, 84, 12, 0, 0, 22, 0,
+  0, 42, 0, 0, 0, 0, 0, 0, 47, 0,
+  62, 0, 0, 0, 2, 50, 38, 28, 0, 0,
+  0, 0, 77, 11, 8, 0, 0, 21, 0, 22,
+  43, 0, 0, 57, 0, 32, 0, 0, 0, 0,
+  0, 79, 66, 0, 0, 0, 15, 0, 10, 29,
+  0, 69, 0, 1, 0, 0, 0, 0, 0, 36,
+  65, 0, 62, 0, 139, 0, 57, 16, 25, 0,
+  29, 57, 0, 24, 0, 27, 0, 0, 42, 0,
+  0, 31, 0, 13, 0, 0, 0, 38, 15, 0,
+  3, 20, 0, 0, 0, 0, 2, 0, 0, 0,
+  0, 33, 0, 0, 0, 22, 12, 36, 5, 0,
+  22, 0, 25, 16, 5, 0, 6, 0, 0, 0,
+  0, 74, 0, 26, 125, 100, 30, 22, 18, 0,
+  0, 43, 75, 37, 102, 36, 0, 20, 0, 109,
+  123, 3, 27, 0, 0, 17, 0, 0, 34, 0,
+  0, 1, 35, 33, 3, 0, 0, 8, 62, 0,
+  21, 30, 0, 0, 38, 0, 43, 0, 9, 59,
+  0, 117, 0, 0, 0, 0, 0, 80, 21, 0,
+  14, 0, 0, 24, 0, 0, 0, 0, 10, 0,
+  0, 0, 0, 0, 32, 35, 0, 0, 10, 25,
+  0, 0, 0, 85, 0, 0, 22, 0, 0, 0,
+  0, 0, 0, 0, 0, 39, 3, 8, 0, 40,
+  0, 0, 0, 0, 8, 3, 0, 0, 0, 38,
+  0, 0, 0, 43, 47, 68, 23, 0, 46, 0,
+  22, 15, 0, 13, 59, 13, 0, 0, 0, 55,
+  0, 0, 112, 118, 34, 26, 48, 0, 0, 57,
+  67, 0, 179, 5, 0, 32, 0, 139, 175, 0,
+  10, 15, 0, 0, 0, 0, 42, 0, 0, 0,
+  28, 19, 31, 0, 0, 11, 42, 0, 0, 116,
+  13, 0, 34, 0, 0, 0, 6, 54, 43, 142,
+  0, 0, 0, 0, 0, 58, 0, 0, 0, 29,
+  0, 30, 0, 10, 0, 0, 53, 0, 0, 0,
+  0, 0, 1, 29, 1, 6, 0, 37, 0, 0,
+  0, 81, 0, 0, 83, 32, 0, 0, 0, 9,
+  0, 42, 6, 26, 0, 10, 0, 0, 0, 25,
+  0, 0, 22, 40, 7, 0, 0, 0, 67, 0,
+  0, 20, 33, 86, 0, 0, 32, 0, 0, 10,
+  0, 67, 54, 81, 0, 26, 0, 6, 0, 0,
+  25, 36, 58, 0, 32, 0, 0, 65, 0, 0,
+  102, 0, 0, 34, 25, 57, 85, 0, 33, 59,
+  0, 79, 0, 0, 3, 0, 3, 0, 2, 0,
+  0, 0, 0, 49, 15, 0, 0, 173, 0, 0,
+  0, 0, 0, 0, 0, 64, 113, 110, 0, 0,
+  0, 0, 0, 29, 0, 22, 0, 30, 0, 19,
+  0, 0, 0, 29, 61, 0, 40, 0, 0, 0,
+  0, 15, 1, 35, 0, 102, 14, 0, 4, 0,
+  39, 0, 27, 51, 8, 13, 23, 3, 26, 91,
+  67, 61, 21, 56, 0, 0, 0, 56, 53, 69,
+  6, 74, 0, 0, 14, 0, 81, 1, 0, 0,
+  0, 25, 0, 38, 0, 16, 42, 22, 1, 7,
+  22, 19, 0, 49, 2, 1, 68, 52, 0, 0,
+  0, 9, 0, 50, 0, 0, 0, 0, 0, 0,
+  91, 11, 34, 0, 0, 0, 15, 26, 42, 23,
+  0, 6, 0, 4, 107, 11, 0, 0, 11, 8,
+  10, 15, 30, 12, 42, 45, 0, 41, 0, 10,
+  0, 0, 0, 81, 0, 0, 14, 0, 46, 0,
+  23, 15, 32, 37, 0, 0, 0, 0, 0, 0,
+  0, 0, 12, 0, 30, 11, 149, 0, 76, 0,
+  46, 0, 0, 131, 52, 5, 17, 0, 45, 0,
+  11, 44, 5, 23, 60, 0, 17, 55, 55, 49,
+  15, 72, 0, 0, 12, 32, 54, 53, 11, 54,
+  0, 20, 0, 0, 76, 0, 17, 0, 0, 0,
+  0, 41, 0, 25, 68, 41, 28, 22, 40, 0,
+  0, 52, 0, 3, 85, 24, 0, 0, 0, 0,
+  0, 44, 4, 0, 0, 5, 0, 0, 29, 13,
+  13, 0, 0, 0, 8, 16, 74, 5, 15, 32,
+  0, 0, 97, 0, 0, 0, 14, 0, 30, 16,
+  22, 9, 0, 0, 0, 20, 0, 26, 0, 0,
+  0, 38, 5, 16, 9, 0, 39, 0, 48, 8,
+  25, 53, 0, 0, 0, 5, 0, 0, 0, 24,
+  33, 0, 34, 5, 77, 0, 62, 0, 29, 0,
+  0, 75, 0, 0, 5, 14, 48, 1, 0, 0,
+  0, 56, 51, 0, 0, 4, 32, 10, 13, 41,
+  0, 10, 71, 13, 29, 0, 10, 14, 0, 17,
+  0, 0, 42, 0, 5, 27, 0, 0, 9, 20,
+  0, 26, 0, 66, 11, 74, 35, 26, 0, 2,
+  0, 16, 68, 0, 0, 0, 30, 0, 1, 5,
+  28, 45, 0, 49, 0, 0, 0, 37, 29, 0,
+  51, 0, 22, 9, 83, 12, 47, 23, 0, 0,
+  69, 0, 4, 0, 38, 0, 23, 2, 0, 0,
+  0, 0, 0, 6, 0, 38, 0, 0, 22, 49,
+  15, 29, 19, 13, 22, 0, 31, 11, 0, 28,
+  0, 0, 0, 0, 0, 0, 0, 19, 71, 6,
+  22, 4, 0, 0, 22, 0, 10, 0, 0, 39,
+  0, 0, 0, 29, 0, 0, 78, 47, 0, 0,
+  30, 0, 0, 88, 39, 61, 6, 17, 0, 0,
+  0, 41, 0, 0, 7, 53, 6, 0, 17, 0,
+  36, 0, 0, 0, 35, 96, 0, 0, 48, 0,
+  9, 30, 0, 28, 42, 19, 0, 0, 0, 32,
+  2, 0, 4, 101, 46, 8, 0, 0, 0, 0,
+  0, 0, 66, 0, 6, 4, 24, 53, 52, 0,
+  17, 37, 0, 49, 0, 0, 5, 0, 39, 0,
+  0, 0, 0, 1, 0, 30, 51, 0, 0, 131,
+  0, 0, 11, 0, 0, 0, 0, 86, 87, 31,
+  0, 0, 0, 0, 0, 48, 0, 13, 0, 11,
+  0, 8, 2, 0, 0, 2, 51, 0, 25, 0,
+  41, 0, 28, 12, 43, 0, 0, 93, 41, 0,
+  7, 0, 52, 3, 86, 40, 12, 0, 76, 3,
+  0, 125, 70, 39, 2, 33, 0, 0, 0, 54,
+  36, 13, 16, 61, 3, 0, 21, 0, 90, 1,
+  0, 0, 0, 58, 0, 29, 9, 0, 26, 52,
+  0, 59, 72, 36, 0, 44, 0, 0, 84, 12,
+  0, 0, 22, 0, 0, 42, 0, 0, 0, 0,
+  0, 0, 47, 0, 62, 0, 0, 0, 2, 50,
+  38, 28, 0, 0, 0, 0, 77, 11, 8, 0,
+  0, 21, 0, 22, 43, 0, 0, 57, 0, 32,
+  0, 0, 0, 0, 0, 79, 66, 0, 0, 0,
+  15, 0, 10, 29, 0, 69, 0, 1, 0, 0,
+  0, 0, 0, 36, 65, 0, 62, 0, 139, 0,
+  57, 16, 25, 0, 0, 58, 49, 0, 14, 0,
+  50, 16, 63, 8, 3, 26, 61, 1, 7, 53,
+  52, 0, 0, 15, 0, 27, 43, 19, 23, 0,
+  0, 13, 0, 0, 0, 0, 41, 0, 0, 6,
+  0, 16, 0, 79, 0, 24, 0, 55, 1, 70,
+  61, 46, 0, 21, 0, 20, 72, 1, 0, 0,
+  29, 0, 0, 0, 15, 36, 0, 43, 0, 14,
+  0, 0, 79, 0, 0, 0, 7, 27, 66, 15,
+  34, 28, 0, 0, 79, 0, 29, 0, 25, 0,
+  16, 0, 0, 0, 0, 0, 0, 17, 0, 26,
+  0, 0, 5, 71, 31, 0, 0, 0, 26, 0,
+  28, 0, 0, 38, 0, 0, 0, 2, 0, 0,
+  2, 14, 69, 0, 27, 0, 63, 0, 43, 7,
+  17, 0, 10, 25, 0, 0, 0, 85, 0, 0,
+  22, 0, 0, 0, 0, 0, 0, 0, 0, 39,
+  3, 8, 0, 40, 0, 0, 0, 0, 8, 3,
+  0, 0, 0, 38, 0, 0, 0, 43, 47, 68,
+  23, 0, 46, 0, 22, 15, 0, 13, 59, 13,
+  0, 0, 0, 55, 0, 0, 112, 118, 34, 26,
+  48, 0, 0, 57, 67, 0, 179, 5, 0, 32,
+  0, 139, 175, 0, 10, 15, 0, 0, 0, 0,
+  42, 0, 0, 0, 28, 19, 31, 0, 0, 11,
+  42, 0, 0, 116, 13, 0, 34, 0, 0, 0,
+  6, 54, 43, 142, 0, 0, 0, 0, 0, 58,
+  0, 0, 0, 29, 0, 30, 0, 10, 0, 0,
+  53, 0, 0, 0, 0, 0, 1, 29, 1, 6,
+  0, 37, 0, 0, 0, 81, 0, 0, 83, 32,
+  0, 0, 0, 9, 0, 42, 6, 26, 0, 10,
+  0, 0, 0, 25, 0, 0, 22, 40, 7, 0,
+  0, 0, 67, 0, 0, 20, 33, 86, 0, 0,
+  32, 0, 0, 10, 0, 67, 54, 81, 0, 26,
+  0, 6, 0, 0, 25, 36, 58, 0, 32, 0,
+  0, 65, 0, 0, 102, 0, 0, 34, 25, 57,
+  85, 0, 33, 59, 0, 79, 0, 0, 3, 0,
+  3, 0, 2, 0, 0, 0, 0, 49, 15, 0,
+  0, 173, 0, 0, 0, 0, 0, 0, 0, 64,
+  113, 110, 0, 0, 0, 0, 0, 29, 0, 22,
+  0, 30, 0, 19, 0, 0, 0, 29, 61, 0,
+  40, 0, 0, 0, 0, 15, 1, 35, 0, 34,
+  21, 0, 0, 0, 48, 33, 91, 15, 14, 16,
+  57, 1, 0, 81, 49, 0, 0, 0, 6, 20,
+  26, 30, 1, 0, 0, 23, 0, 0, 0, 0,
+  60, 0, 3, 0, 0, 56, 0, 42, 4, 5,
+  0, 43, 0, 101, 57, 64, 0, 36, 0, 14,
+  67, 0, 0, 0, 60, 0, 18, 0, 6, 36,
+  0, 46, 0, 0, 0, 0, 80, 0, 0, 0,
+  27, 50, 26, 48, 16, 11, 0, 0, 59, 0,
+  25, 0, 0, 9, 9, 3, 5, 0, 0, 63,
+  0, 14, 0, 0, 0, 0, 4, 79, 88, 0,
+  0, 0, 17, 0, 30, 2, 0, 51, 0, 7,
+  0, 20, 0, 0, 0, 31, 77, 0, 50, 0,
+  85, 0, 42, 0, 14, 0, 0, 131, 52, 5,
+  17, 0, 45, 0, 11, 44, 5, 23, 60, 0,
+  17, 55, 55, 49, 15, 72, 0, 0, 12, 32,
+  54, 53, 11, 54, 0, 20, 0, 0, 76, 0,
+  17, 0, 0, 0, 0, 41, 0, 25, 68, 41,
+  28, 22, 40, 0, 0, 52, 0, 3, 85, 24,
+  0, 0, 0, 0, 0, 44, 4, 0, 0, 5,
+  0, 0, 29, 13, 13, 0, 0, 0, 8, 16,
+  74, 5, 15, 32, 0, 0, 97, 0, 0, 0,
+  14, 0, 30, 16, 22, 9, 0, 0, 0, 20,
+  0, 26, 0, 0, 0, 38, 5, 16, 9, 0,
+  39, 0, 48, 8, 25, 53, 0, 0, 0, 5,
+  0, 0, 0, 24, 33, 0, 34, 5, 77, 0,
+  62, 0, 29, 0, 0, 75, 0, 0, 5, 14,
+  48, 1, 0, 0, 0, 56, 51, 0, 0, 4,
+  32, 10, 13, 41, 0, 10, 71, 13, 29, 0,
+  10, 14, 0, 17, 0, 0, 42, 0, 5, 27,
+  0, 0, 9, 20, 0, 26, 0, 66, 11, 74,
+  35, 26, 0, 2, 0, 16, 68, 0, 0, 0,
+  30, 0, 1, 5, 28, 45, 0, 49, 0, 0,
+  0, 37, 29, 0, 51, 0, 22, 9, 83, 12,
+  47, 23, 0, 0, 69, 0, 4, 0, 38, 0,
+  23, 2, 0, 0, 0, 0, 0, 6, 0, 38,
+  0, 0, 22, 49, 15, 29, 19, 13, 22, 0,
+  31, 11, 0, 28, 0, 0, 0, 0, 0, 0,
+  0, 19, 71, 6, 22, 4, 0, 0, 22, 0,
+  10, 0, 7, 18, 0, 16, 0, 21, 57, 17,
+  0, 0, 0, 41, 57, 2, 0, 6, 60, 44,
+  5, 5, 45, 0, 15, 0, 37, 0, 27, 0,
+  0, 35, 0, 0, 85, 0, 0, 0, 0, 5,
+  0, 0, 0, 23, 0, 64, 4, 113, 25, 79,
+  0, 0, 0, 41, 66, 0, 0, 22, 11, 0,
+  0, 0, 15, 0, 0, 2, 0, 0, 0, 36,
+  38, 0, 60, 0, 2, 0, 50, 0, 47, 0,
+  0, 0, 62, 0, 47, 0, 7, 0, 20, 0,
+  0, 8, 0, 4, 0, 8, 0, 7, 0, 0,
+  51, 44, 26, 26, 0, 37, 18, 0, 29, 6,
+  9, 13, 0, 18, 0, 17, 0, 0, 6, 0,
+  36, 0, 37, 0, 37, 0, 0, 0, 38, 0,
+  0, 93, 41, 0, 7, 0, 52, 3, 86, 40,
+  12, 0, 76, 3, 0, 125, 70, 39, 2, 33,
+  0, 0, 0, 54, 36, 13, 16, 61, 3, 0,
+  21, 0, 90, 1, 0, 0, 0, 58, 0, 29,
+  9, 0, 26, 52, 0, 59, 72, 36, 0, 44,
+  0, 0, 84, 12, 0, 0, 22, 0, 0, 42,
+  0, 0, 0, 0, 0, 0, 47, 0, 62, 0,
+  0, 0, 2, 50, 38, 28, 0, 0, 0, 0,
+  77, 11, 8, 0, 0, 21, 0, 22, 43, 0,
+  0, 57, 0, 32, 0, 0, 0, 0, 0, 79,
+  66, 0, 0, 0, 15, 0, 10, 29, 0, 69,
+  0, 1, 0, 0, 0, 0, 0, 36, 65, 0,
+  62, 0, 139, 0, 57, 16, 25, 0, 0, 58,
+  49, 0, 14, 0, 50, 16, 63, 8, 3, 26,
+  61, 1, 7, 53, 52, 0, 0, 15, 0, 27,
+  43, 19, 23, 0, 0, 13, 0, 0, 0, 0,
+  41, 0, 0, 6, 0, 16, 0, 79, 0, 24,
+  0, 55, 1, 70, 61, 46, 0, 21, 0, 20,
+  72, 1, 0, 0, 29, 0, 0, 0, 15, 36,
+  0, 43, 0, 14, 0, 0, 79, 0, 0, 0,
+  7, 27, 66, 15, 34, 28, 0, 0, 79, 0,
+  29, 0, 25, 0, 16, 0, 0, 0, 0, 0,
+  0, 17, 0, 26, 0, 0, 5, 71, 31, 0,
+  0, 0, 26, 0, 28, 0, 0, 38, 0, 0,
+  0, 2, 0, 0, 2, 14, 69, 0, 27, 0,
+  63, 0, 43, 7, 17, 0, 0, 6, 0, 0,
+  0, 1, 30, 12, 26, 0, 0, 25, 43, 0,
+  8, 23, 56, 23, 0, 0, 32, 29, 18, 2,
+  25, 0, 0, 0, 0, 0, 0, 0, 36, 17,
+  0, 0, 0, 0, 0, 34, 0, 11, 0, 58,
+  21, 87, 29, 59, 0, 1, 0, 52, 63, 0,
+  3, 0, 12, 0, 0, 0, 25, 4, 0, 38,
+  0, 10, 4, 0, 42, 0, 34, 0, 0, 17,
+  34, 0, 45, 41, 0, 0, 77, 0, 55, 0,
+  5, 0, 14, 0, 0, 0, 0, 31, 0, 0,
+  0, 22, 0, 0, 32, 57, 30, 0, 0, 9,
+  8, 0, 15, 0, 0, 13, 0, 14, 0, 2,
+  0, 0, 29, 0, 33, 0, 14, 0, 33, 0,
+  13, 6, 20, 0, 0, 37, 0, 0, 0, 81,
+  0, 0, 83, 32, 0, 0, 0, 9, 0, 42,
+  6, 26, 0, 10, 0, 0, 0, 25, 0, 0,
+  22, 40, 7, 0, 0, 0, 67, 0, 0, 20,
+  33, 86, 0, 0, 32, 0, 0, 10, 0, 67,
+  54, 81, 0, 26, 0, 6, 0, 0, 25, 36,
+  58, 0, 32, 0, 0, 65, 0, 0, 102, 0,
+  0, 34, 25, 57, 85, 0, 33, 59, 0, 79,
+  0, 0, 3, 0, 3, 0, 2, 0, 0, 0,
+  0, 49, 15, 0, 0, 173, 0, 0, 0, 0,
+  0, 0, 0, 64, 113, 110, 0, 0, 0, 0,
+  0, 29, 0, 22, 0, 30, 0, 19, 0, 0,
+  0, 29, 61, 0, 40, 0, 0, 0, 0, 15,
+  1, 35, 0, 34, 21, 0, 0, 0, 48, 33,
+  91, 15, 14, 16, 57, 1, 0, 81, 49, 0,
+  0, 0, 6, 20, 26, 30, 1, 0, 0, 23,
+  0, 0, 0, 0, 60, 0, 3, 0, 0, 56,
+  0, 42, 4, 5, 0, 43, 0, 101, 57, 64,
+  0, 36, 0, 14, 67, 0, 0, 0, 60, 0,
+  18, 0, 6, 36, 0, 46, 0, 0, 0, 0,
+  80, 0, 0, 0, 27, 50, 26, 48, 16, 11,
+  0, 0, 59, 0, 25, 0, 0, 9, 9, 3,
+  5, 0, 0, 63, 0, 14, 0, 0, 0, 0,
+  4, 79, 88, 0, 0, 0, 17, 0, 30, 2,
+  0, 51, 0, 7, 0, 20, 0, 0, 0, 31,
+  77, 0, 50, 0, 85, 0, 42, 0, 14, 0,
+  0, 27, 0, 6, 0, 0, 33, 17, 40, 0,
+  12, 29, 62, 0, 14, 33, 65, 28, 0, 0,
+  26, 32, 26, 12, 42, 0, 0, 27, 0, 0,
+  0, 0, 69, 0, 0, 0, 0, 14, 0, 40,
+  0, 14, 0, 40, 23, 88, 0, 29, 0, 18,
+  0, 24, 66, 1, 4, 0, 0, 0, 0, 0,
+  30, 14, 0, 50, 0, 7, 42, 0, 37, 0,
+  0, 0, 0, 48, 16, 0, 58, 78, 0, 0,
+  60, 0, 43, 4, 0, 14, 12, 0, 0, 2,
+  0, 24, 0, 6, 0, 25, 4, 0, 5, 84,
+  38, 0, 0, 3, 48, 0, 12, 5, 0, 1,
+  0, 12, 0, 2, 0, 0, 15, 0, 12, 0,
+  16, 0, 60, 0, 26, 0, 25, 0, 0, 75,
+  0, 0, 5, 14, 48, 1, 0, 0, 0, 56,
+  51, 0, 0, 4, 32, 10, 13, 41, 0, 10,
+  71, 13, 29, 0, 10, 14, 0, 17, 0, 0,
+  42, 0, 5, 27, 0, 0, 9, 20, 0, 26,
+  0, 66, 11, 74, 35, 26, 0, 2, 0, 16,
+  68, 0, 0, 0, 30, 0, 1, 5, 28, 45,
+  0, 49, 0, 0, 0, 37, 29, 0, 51, 0,
+  22, 9, 83, 12, 47, 23, 0, 0, 69, 0,
+  4, 0, 38, 0, 23, 2, 0, 0, 0, 0,
+  0, 6, 0, 38, 0, 0, 22, 49, 15, 29,
+  19, 13, 22, 0, 31, 11, 0, 28, 0, 0,
+  0, 0, 0, 0, 0, 19, 71, 6, 22, 4,
+  0, 0, 22, 0, 10, 0, 7, 18, 0, 16,
+  0, 21, 57, 17, 0, 0, 0, 41, 57, 2,
+  0, 6, 60, 44, 5, 5, 45, 0, 15, 0,
+  37, 0, 27, 0, 0, 35, 0, 0, 85, 0,
+  0, 0, 0, 5, 0, 0, 0, 23, 0, 64,
+  4, 113, 25, 79, 0, 0, 0, 41, 66, 0,
+  0, 22, 11, 0, 0, 0, 15, 0, 0, 2,
+  0, 0, 0, 36, 38, 0, 60, 0, 2, 0,
+  50, 0, 47, 0, 0, 0, 62, 0, 47, 0,
+  7, 0, 20, 0, 0, 8, 0, 4, 0, 8,
+  0, 7, 0, 0, 51, 44, 26, 26, 0, 37,
+  18, 0, 29, 6, 9, 13, 0, 18, 0, 17,
+  0, 0, 6, 0, 36, 0, 37, 0, 37, 0,
+  0, 0, 38, 0, 0, 12, 0, 42, 6, 15,
+  37, 28, 4, 4, 6, 14, 22, 0, 5, 59,
+  66, 39, 0, 24, 0, 0, 0, 20, 47, 15,
+  29, 33, 0, 35, 0, 0, 91, 34, 6, 0,
+  0, 11, 0, 10, 0, 18, 0, 22, 0, 58,
+  46, 78, 0, 43, 0, 62, 86, 46, 0, 56,
+  0, 0, 0, 20, 4, 0, 0, 0, 0, 0,
+  39, 0, 35, 6, 23, 0, 0, 0, 28, 23,
+  8, 0, 0, 0, 113, 0, 11, 9, 0, 0,
+  7, 22, 0, 0, 22, 29, 0, 8, 36, 0,
+  36, 0, 26, 59, 19, 7, 14, 19, 16, 0,
+  26, 17, 35, 32, 0, 9, 19, 42, 0, 0,
+  5, 0, 0, 0, 14, 11, 125, 0, 35, 0,
+  0, 0, 0, 58, 49, 0, 14, 0, 50, 16,
+  63, 8, 3, 26, 61, 1, 7, 53, 52, 0,
+  0, 15, 0, 27, 43, 19, 23, 0, 0, 13,
+  0, 0, 0, 0, 41, 0, 0, 6, 0, 16,
+  0, 79, 0, 24, 0, 55, 1, 70, 61, 46,
+  0, 21, 0, 20, 72, 1, 0, 0, 29, 0,
+  0, 0, 15, 36, 0, 43, 0, 14, 0, 0,
+  79, 0, 0, 0, 7, 27, 66, 15, 34, 28,
+  0, 0, 79, 0, 29, 0, 25, 0, 16, 0,
+  0, 0, 0, 0, 0, 17, 0, 26, 0, 0,
+  5, 71, 31, 0, 0, 0, 26, 0, 28, 0,
+  0, 38, 0, 0, 0, 2, 0, 0, 2, 14,
+  69, 0, 27, 0, 63, 0, 43, 7, 17, 0,
+  0, 6, 0, 0, 0, 1, 30, 12, 26, 0,
+  0, 25, 43, 0, 8, 23, 56, 23, 0, 0,
+  32, 29, 18, 2, 25, 0, 0, 0, 0, 0,
+  0, 0, 36, 17, 0, 0, 0, 0, 0, 34,
+  0, 11, 0, 58, 21, 87, 29, 59, 0, 1,
+  0, 52, 63, 0, 3, 0, 12, 0, 0, 0,
+  25, 4, 0, 38, 0, 10, 4, 0, 42, 0,
+  34, 0, 0, 17, 34, 0, 45, 41, 0, 0,
+  77, 0, 55, 0, 5, 0, 14, 0, 0, 0,
+  0, 31, 0, 0, 0, 22, 0, 0, 32, 57,
+  30, 0, 0, 9, 8, 0, 15, 0, 0, 13,
+  0, 14, 0, 2, 0, 0, 29, 0, 33, 0,
+  14, 0, 33, 0, 13, 6, 20, 0, 0, 5,
+  0, 30, 11, 9, 0, 0, 16, 0, 14, 0,
+  28, 0, 0, 43, 62, 17, 0, 4, 0, 0,
+  0, 14, 39, 0, 19, 14, 0, 0, 0, 0,
+  39, 51, 0, 0, 0, 0, 8, 0, 0, 0,
+  0, 26, 0, 76, 41, 64, 0, 17, 0, 73,
+  78, 15, 1, 58, 0, 0, 0, 0, 35, 0,
+  0, 26, 0, 0, 54, 0, 52, 39, 59, 0,
+  0, 16, 4, 0, 13, 36, 0, 0, 89, 0,
+  49, 0, 0, 20, 1, 30, 0, 0, 0, 79,
+  0, 0, 39, 0, 21, 0, 17, 79, 53, 5,
+  0, 14, 0, 0, 0, 9, 0, 17, 0, 33,
+  0, 25, 0, 0, 3, 0, 0, 0, 0, 0,
+  77, 0, 14, 5, 4, 0, 0, 34, 21, 0,
+  0, 0, 48, 33, 91, 15, 14, 16, 57, 1,
+  0, 81, 49, 0, 0, 0, 6, 20, 26, 30,
+  1, 0, 0, 23, 0, 0, 0, 0, 60, 0,
+  3, 0, 0, 56, 0, 42, 4, 5, 0, 43,
+  0, 101, 57, 64, 0, 36, 0, 14, 67, 0,
+  0, 0, 60, 0, 18, 0, 6, 36, 0, 46,
+  0, 0, 0, 0, 80, 0, 0, 0, 27, 50,
+  26, 48, 16, 11, 0, 0, 59, 0, 25, 0,
+  0, 9, 9, 3, 5, 0, 0, 63, 0, 14,
+  0, 0, 0, 0, 4, 79, 88, 0, 0, 0,
+  17, 0, 30, 2, 0, 51, 0, 7, 0, 20,
+  0, 0, 0, 31, 77, 0, 50, 0, 85, 0,
+  42, 0, 14, 0, 0, 27, 0, 6, 0, 0,
+  33, 17, 40, 0, 12, 29, 62, 0, 14, 33,
+  65, 28, 0, 0, 26, 32, 26, 12, 42, 0,
+  0, 27, 0, 0, 0, 0, 69, 0, 0, 0,
+  0, 14, 0, 40, 0, 14, 0, 40, 23, 88,
+  0, 29, 0, 18, 0, 24, 66, 1, 4, 0,
+  0, 0, 0, 0, 30, 14, 0, 50, 0, 7,
+  42, 0, 37, 0, 0, 0, 0, 48, 16, 0,
+  58, 78, 0, 0, 60, 0, 43, 4, 0, 14,
+  12, 0, 0, 2, 0, 24, 0, 6, 0, 25,
+  4, 0, 5, 84, 38, 0, 0, 3, 48, 0,
+  12, 5, 0, 1, 0, 12, 0, 2, 0, 0,
+  15, 0, 12, 0, 16, 0, 60, 0, 26, 0,
+  25, 0, 32, 14, 0, 17, 0, 0, 0, 0,
+  0, 0, 1, 1, 16, 0, 0, 0, 49, 11,
+  3, 0, 0, 29, 0, 16, 72, 0, 37, 30,
+  0, 0, 0, 15, 79, 12, 0, 0, 0, 13,
+  41, 0, 0, 0, 0, 11, 0, 105, 32, 28,
+  0, 0, 0, 8, 36, 0, 22, 20, 3, 0,
+  0, 0, 87, 22, 0, 54, 0, 0, 130, 30,
+  67, 49, 31, 0, 0, 36, 0, 0, 48, 46,
+  0, 0, 36, 0, 58, 28, 0, 42, 0, 0,
+  0, 0, 0, 73, 0, 0, 0, 0, 0, 0,
+  0, 113, 49, 57, 10, 33, 35, 37, 0, 0,
+  24, 0, 0, 52, 0, 0, 0, 0, 4, 0,
+  10, 0, 8, 0, 23, 0, 0, 0, 31, 19,
+  7, 18, 0, 16, 0, 21, 57, 17, 0, 0,
+  0, 41, 57, 2, 0, 6, 60, 44, 5, 5,
+  45, 0, 15, 0, 37, 0, 27, 0, 0, 35,
+  0, 0, 85, 0, 0, 0, 0, 5, 0, 0,
+  0, 23, 0, 64, 4, 113, 25, 79, 0, 0,
+  0, 41, 66, 0, 0, 22, 11, 0, 0, 0,
+  15, 0, 0, 2, 0, 0, 0, 36, 38, 0,
+  60, 0, 2, 0, 50, 0, 47, 0, 0, 0,
+  62, 0, 47, 0, 7, 0, 20, 0, 0, 8,
+  0, 4, 0, 8, 0, 7, 0, 0, 51, 44,
+  26, 26, 0, 37, 18, 0, 29, 6, 9, 13,
+  0, 18, 0, 17, 0, 0, 6, 0, 36, 0,
+  37, 0, 37, 0, 0, 0, 38, 0, 0, 12,
+  0, 42, 6, 15, 37, 28, 4, 4, 6, 14,
+  22, 0, 5, 59, 66, 39, 0, 24, 0, 0,
+  0, 20, 47, 15, 29, 33, 0, 35, 0, 0,
+  91, 34, 6, 0, 0, 11, 0, 10, 0, 18,
+  0, 22, 0, 58, 46, 78, 0, 43, 0, 62,
+  86, 46, 0, 56, 0, 0, 0, 20, 4, 0,
+  0, 0, 0, 0, 39, 0, 35, 6, 23, 0,
+  0, 0, 28, 23, 8, 0, 0, 0, 113, 0,
+  11, 9, 0, 0, 7, 22, 0, 0, 22, 29,
+  0, 8, 36, 0, 36, 0, 26, 59, 19, 7,
+  14, 19, 16, 0, 26, 17, 35, 32, 0, 9,
+  19, 42, 0, 0, 5, 0, 0, 0, 14, 11,
+  125, 0, 35, 0, 0, 0, 0, 93, 5, 24,
+  14, 0, 37, 16, 19, 24, 15, 1, 7, 0,
+  45, 74, 66, 43, 0, 20, 0, 0, 0, 49,
+  65, 69, 6, 62, 0, 1, 5, 0, 69, 27,
+  8, 0, 0, 8, 0, 34, 0, 35, 41, 0,
+  16, 0, 40, 0, 0, 56, 0, 37, 99, 45,
+  0, 4, 0, 17, 0, 45, 12, 0, 0, 33,
+  0, 12, 78, 0, 23, 0, 0, 0, 0, 6,
+  46, 35, 1, 18, 0, 2, 119, 0, 0, 1,
+  0, 16, 0, 27, 17, 29, 59, 0, 0, 26,
+  0, 8, 27, 0, 0, 42, 0, 0, 29, 0,
+  16, 0, 32, 10, 52, 56, 0, 0, 9, 11,
+  0, 0, 0, 0, 0, 0, 4, 23, 137, 0,
+  66, 0, 0, 0, 0, 6, 0, 0, 0, 1,
+  30, 12, 26, 0, 0, 25, 43, 0, 8, 23,
+  56, 23, 0, 0, 32, 29, 18, 2, 25, 0,
+  0, 0, 0, 0, 0, 0, 36, 17, 0, 0,
+  0, 0, 0, 34, 0, 11, 0, 58, 21, 87,
+  29, 59, 0, 1, 0, 52, 63, 0, 3, 0,
+  12, 0, 0, 0, 25, 4, 0, 38, 0, 10,
+  4, 0, 42, 0, 34, 0, 0, 17, 34, 0,
+  45, 41, 0, 0, 77, 0, 55, 0, 5, 0,
+  14, 0, 0, 0, 0, 31, 0, 0, 0, 22,
+  0, 0, 32, 57, 30, 0, 0, 9, 8, 0,
+  15, 0, 0, 13, 0, 14, 0, 2, 0, 0,
+  29, 0, 33, 0, 14, 0, 33, 0, 13, 6,
+  20, 0, 0, 5, 0, 30, 11, 9, 0, 0,
+  16, 0, 14, 0, 28, 0, 0, 43, 62, 17,
+  0, 4, 0, 0, 0, 14, 39, 0, 19, 14,
+  0, 0, 0, 0, 39, 51, 0, 0, 0, 0,
+  8, 0, 0, 0, 0, 26, 0, 76, 41, 64,
+  0, 17, 0, 73, 78, 15, 1, 58, 0, 0,
+  0, 0, 35, 0, 0, 26, 0, 0, 54, 0,
+  52, 39, 59, 0, 0, 16, 4, 0, 13, 36,
+  0, 0, 89, 0, 49, 0, 0, 20, 1, 30,
+  0, 0, 0, 79, 0, 0, 39, 0, 21, 0,
+  17, 79, 53, 5, 0, 14, 0, 0, 0, 9,
+  0, 17, 0, 33, 0, 25, 0, 0, 3, 0,
+  0, 0, 0, 0, 77, 0, 14, 5, 4, 0,
+  0, 37, 0, 30, 19, 0, 8, 0, 29, 1,
+  5, 0, 23, 0, 24, 68, 78, 31, 0, 2,
+  0, 0, 0, 40, 45, 0, 20, 28, 0, 0,
+  7, 0, 46, 69, 0, 0, 0, 8, 7, 0,
+  0, 0, 0, 16, 0, 35, 63, 39, 0, 11,
+  0, 42, 72, 27, 0, 30, 0, 4, 0, 3,
+  38, 0, 0, 31, 0, 0, 79, 0, 75, 41,
+  0, 0, 0, 12, 16, 0, 14, 1, 0, 0,
+  85, 0, 26, 0, 0, 32, 0, 18, 6, 0,
+  14, 72, 0, 6, 28, 0, 15, 0, 0, 80,
+  18, 0, 0, 7, 0, 0, 0, 0, 2, 22,
+  0, 30, 8, 22, 3, 0, 0, 0, 0, 0,
+  0, 0, 101, 0, 9, 26, 7, 0, 0, 27,
+  0, 6, 0, 0, 33, 17, 40, 0, 12, 29,
+  62, 0, 14, 33, 65, 28, 0, 0, 26, 32,
+  26, 12, 42, 0, 0, 27, 0, 0, 0, 0,
+  69, 0, 0, 0, 0, 14, 0, 40, 0, 14,
+  0, 40, 23, 88, 0, 29, 0, 18, 0, 24,
+  66, 1, 4, 0, 0, 0, 0, 0, 30, 14,
+  0, 50, 0, 7, 42, 0, 37, 0, 0, 0,
+  0, 48, 16, 0, 58, 78, 0, 0, 60, 0,
+  43, 4, 0, 14, 12, 0, 0, 2, 0, 24,
+  0, 6, 0, 25, 4, 0, 5, 84, 38, 0,
+  0, 3, 48, 0, 12, 5, 0, 1, 0, 12,
+  0, 2, 0, 0, 15, 0, 12, 0, 16, 0,
+  60, 0, 26, 0, 25, 0, 32, 14, 0, 17,
+  0, 0, 0, 0, 0, 0, 1, 1, 16, 0,
+  0, 0, 49, 11, 3, 0, 0, 29, 0, 16,
+  72, 0, 37, 30, 0, 0, 0, 15, 79, 12,
+  0, 0, 0, 13, 41, 0, 0, 0, 0, 11,
+  0, 105, 32, 28, 0, 0, 0, 8, 36, 0,
+  22, 20, 3, 0, 0, 0, 87, 22, 0, 54,
+  0, 0, 130, 30, 67, 49, 31, 0, 0, 36,
+  0, 0, 48, 46, 0, 0, 36, 0, 58, 28,
+  0, 42, 0, 0, 0, 0, 0, 73, 0, 0,
+  0, 0, 0, 0, 0, 113, 49, 57, 10, 33,
+  35, 37, 0, 0, 24, 0, 0, 52, 0, 0,
+  0, 0, 4, 0, 10, 0, 8, 0, 23, 0,
+  0, 0, 31, 19, 12, 13, 0, 21, 6, 5,
+  0, 0, 11, 0, 0, 0, 48, 0, 0, 18,
+  58, 12, 0, 0, 0, 8, 0, 28, 33, 0,
+  31, 20, 0, 0, 0, 2, 67, 50, 0, 0,
+  0, 26, 49, 0, 0, 0, 0, 31, 0, 97,
+  52, 74, 0, 0, 0, 36, 26, 0, 0, 44,
+  0, 0, 0, 0, 64, 9, 0, 12, 0, 0,
+  87, 26, 88, 48, 67, 0, 0, 16, 0, 0,
+  28, 0, 0, 0, 33, 0, 46, 22, 0, 32,
+  0, 0, 2, 0, 0, 84, 0, 0, 12, 0,
+  0, 0, 1, 115, 49, 54, 0, 40, 17, 26,
+  0, 0, 9, 0, 0, 49, 0, 16, 0, 0,
+  0, 0, 29, 0, 1, 0, 46, 0, 0, 0,
+  33, 16, 0, 12, 0, 42, 6, 15, 37, 28,
+  4, 4, 6, 14, 22, 0, 5, 59, 66, 39,
+  0, 24, 0, 0, 0, 20, 47, 15, 29, 33,
+  0, 35, 0, 0, 91, 34, 6, 0, 0, 11,
+  0, 10, 0, 18, 0, 22, 0, 58, 46, 78,
+  0, 43, 0, 62, 86, 46, 0, 56, 0, 0,
+  0, 20, 4, 0, 0, 0, 0, 0, 39, 0,
+  35, 6, 23, 0, 0, 0, 28, 23, 8, 0,
+  0, 0, 113, 0, 11, 9, 0, 0, 7, 22,
+  0, 0, 22, 29, 0, 8, 36, 0, 36, 0,
+  26, 59, 19, 7, 14, 19, 16, 0, 26, 17,
+  35, 32, 0, 9, 19, 42, 0, 0, 5, 0,
+  0, 0, 14, 11, 125, 0, 35, 0, 0, 0,
+  0, 93, 5, 24, 14, 0, 37, 16, 19, 24,
+  15, 1, 7, 0, 45, 74, 66, 43, 0, 20,
+  0, 0, 0, 49, 65, 69, 6, 62, 0, 1,
+  5, 0, 69, 27, 8, 0, 0, 8, 0, 34,
+  0, 35, 41, 0, 16, 0, 40, 0, 0, 56,
+  0, 37, 99, 45, 0, 4, 0, 17, 0, 45,
+  12, 0, 0, 33, 0, 12, 78, 0, 23, 0,
+  0, 0, 0, 6, 46, 35, 1, 18, 0, 2,
+  119, 0, 0, 1, 0, 16, 0, 27, 17, 29,
+  59, 0, 0, 26, 0, 8, 27, 0, 0, 42,
+  0, 0, 29, 0, 16, 0, 32, 10, 52, 56,
+  0, 0, 9, 11, 0, 0, 0, 0, 0, 0,
+  4, 23, 137, 0, 66, 0, 0, 0, 0, 115,
+  36, 17, 6, 0, 3, 0, 44, 17, 0, 0,
+  3, 0, 0, 24, 36, 38, 6, 35, 0, 0,
+  67, 53, 19, 0, 40, 54, 0, 0, 0, 0,
+  68, 0, 53, 8, 0, 0, 28, 2, 0, 0,
+  37, 25, 0, 67, 27, 0, 0, 2, 0, 53,
+  88, 0, 20, 0, 26, 0, 0, 0, 0, 27,
+  0, 0, 0, 0, 0, 0, 0, 14, 53, 0,
+  37, 17, 61, 42, 0, 74, 24, 0, 64, 0,
+  4, 21, 0, 0, 6, 36, 25, 20, 74, 0,
+  0, 0, 24, 0, 0, 0, 0, 53, 38, 17,
+  0, 0, 21, 4, 62, 0, 41, 58, 0, 16,
+  0, 3, 0, 0, 0, 0, 0, 6, 0, 0,
+  35, 0, 53, 1, 0, 0, 0, 5, 0, 30,
+  11, 9, 0, 0, 16, 0, 14, 0, 28, 0,
+  0, 43, 62, 17, 0, 4, 0, 0, 0, 14,
+  39, 0, 19, 14, 0, 0, 0, 0, 39, 51,
+  0, 0, 0, 0, 8, 0, 0, 0, 0, 26,
+  0, 76, 41, 64, 0, 17, 0, 73, 78, 15,
+  1, 58, 0, 0, 0, 0, 35, 0, 0, 26,
+  0, 0, 54, 0, 52, 39, 59, 0, 0, 16,
+  4, 0, 13, 36, 0, 0, 89, 0, 49, 0,
+  0, 20, 1, 30, 0, 0, 0, 79, 0, 0,
+  39, 0, 21, 0, 17, 79, 53, 5, 0, 14,
+  0, 0, 0, 9, 0, 17, 0, 33, 0, 25,
+  0, 0, 3, 0, 0, 0, 0, 0, 77, 0,
+  14, 5, 4, 0, 0, 37, 0, 30, 19, 0,
+  8, 0, 29, 1, 5, 0, 23, 0, 24, 68,
+  78, 31, 0, 2, 0, 0, 0, 40, 45, 0,
+  20, 28, 0, 0, 7, 0, 46, 69, 0, 0,
+  0, 8, 7, 0, 0, 0, 0, 16, 0, 35,
+  63, 39, 0, 11, 0, 42, 72, 27, 0, 30,
+  0, 4, 0, 3, 38, 0, 0, 31, 0, 0,
+  79, 0, 75, 41, 0, 0, 0, 12, 16, 0,
+  14, 1, 0, 0, 85, 0, 26, 0, 0, 32,
+  0, 18, 6, 0, 14, 72, 0, 6, 28, 0,
+  15, 0, 0, 80, 18, 0, 0, 7, 0, 0,
+  0, 0, 2, 22, 0, 30, 8, 22, 3, 0,
+  0, 0, 0, 0, 0, 0, 101, 0, 9, 26,
+  7, 0, 0, 119, 31, 10, 0, 0, 55, 0,
+  33, 18, 0, 0, 0, 0, 46, 39, 65, 38,
+  5, 18, 0, 0, 0, 46, 49, 6, 24, 40,
+  0, 0, 0, 0, 84, 26, 0, 0, 0, 16,
+  0, 3, 0, 0, 24, 17, 0, 45, 64, 6,
+  0, 10, 0, 0, 73, 0, 0, 0, 32, 0,
+  0, 35, 7, 5, 0, 0, 0, 0, 63, 0,
+  26, 11, 0, 0, 0, 15, 64, 26, 8, 27,
+  5, 0, 67, 3, 18, 28, 0, 6, 0, 0,
+  1, 26, 36, 0, 0, 22, 0, 0, 0, 0,
+  0, 60, 6, 0, 0, 0, 2, 0, 43, 0,
+  35, 36, 0, 21, 0, 19, 0, 0, 0, 0,
+  13, 0, 0, 0, 95, 0, 24, 41, 20, 0,
+  32, 14, 0, 17, 0, 0, 0, 0, 0, 0,
+  1, 1, 16, 0, 0, 0, 49, 11, 3, 0,
+  0, 29, 0, 16, 72, 0, 37, 30, 0, 0,
+  0, 15, 79, 12, 0, 0, 0, 13, 41, 0,
+  0, 0, 0, 11, 0, 105, 32, 28, 0, 0,
+  0, 8, 36, 0, 22, 20, 3, 0, 0, 0,
+  87, 22, 0, 54, 0, 0, 130, 30, 67, 49,
+  31, 0, 0, 36, 0, 0, 48, 46, 0, 0,
+  36, 0, 58, 28, 0, 42, 0, 0, 0, 0,
+  0, 73, 0, 0, 0, 0, 0, 0, 0, 113,
+  49, 57, 10, 33, 35, 37, 0, 0, 24, 0,
+  0, 52, 0, 0, 0, 0, 4, 0, 10, 0,
+  8, 0, 23, 0, 0, 0, 31, 19, 12, 13,
+  0, 21, 6, 5, 0, 0, 11, 0, 0, 0,
+  48, 0, 0, 18, 58, 12, 0, 0, 0, 8,
+  0, 28, 33, 0, 31, 20, 0, 0, 0, 2,
+  67, 50, 0, 0, 0, 26, 49, 0, 0, 0,
+  0, 31, 0, 97, 52, 74, 0, 0, 0, 36,
+  26, 0, 0, 44, 0, 0, 0, 0, 64, 9,
+  0, 12, 0, 0, 87, 26, 88, 48, 67, 0,
+  0, 16, 0, 0, 28, 0, 0, 0, 33, 0,
+  46, 22, 0, 32, 0, 0, 2, 0, 0, 84,
+  0, 0, 12, 0, 0, 0, 1, 115, 49, 54,
+  0, 40, 17, 26, 0, 0, 9, 0, 0, 49,
+  0, 16, 0, 0, 0, 0, 29, 0, 1, 0,
+  46, 0, 0, 0, 33, 16, 0, 98, 0, 20,
+  14, 0, 60, 12, 44, 16, 32, 0, 54, 0,
+  44, 107, 104, 30, 6, 0, 0, 0, 0, 40,
+  41, 45, 0, 53, 0, 0, 0, 0, 87, 64,
+  0, 0, 0, 27, 0, 41, 0, 0, 16, 28,
+  30, 44, 24, 53, 0, 28, 0, 0, 87, 10,
+  0, 0, 0, 14, 0, 58, 10, 0, 0, 24,
+  0, 0, 75, 0, 41, 0, 0, 0, 0, 48,
+  17, 40, 0, 0, 0, 12, 73, 0, 9, 26,
+  0, 32, 2, 2, 0, 43, 49, 36, 0, 65,
+  0, 26, 0, 0, 0, 86, 27, 0, 0, 0,
+  9, 0, 28, 10, 24, 30, 0, 17, 0, 27,
+  0, 0, 0, 0, 2, 0, 8, 0, 164, 0,
+  52, 9, 40, 0, 0, 93, 5, 24, 14, 0,
+  37, 16, 19, 24, 15, 1, 7, 0, 45, 74,
+  66, 43, 0, 20, 0, 0, 0, 49, 65, 69,
+  6, 62, 0, 1, 5, 0, 69, 27, 8, 0,
+  0, 8, 0, 34, 0, 35, 41, 0, 16, 0,
+  40, 0, 0, 56, 0, 37, 99, 45, 0, 4,
+  0, 17, 0, 45, 12, 0, 0, 33, 0, 12,
+  78, 0, 23, 0, 0, 0, 0, 6, 46, 35,
+  1, 18, 0, 2, 119, 0, 0, 1, 0, 16,
+  0, 27, 17, 29, 59, 0, 0, 26, 0, 8,
+  27, 0, 0, 42, 0, 0, 29, 0, 16, 0,
+  32, 10, 52, 56, 0, 0, 9, 11, 0, 0,
+  0, 0, 0, 0, 4, 23, 137, 0, 66, 0,
+  0, 0, 0, 115, 36, 17, 6, 0, 3, 0,
+  44, 17, 0, 0, 3, 0, 0, 24, 36, 38,
+  6, 35, 0, 0, 67, 53, 19, 0, 40, 54,
+  0, 0, 0, 0, 68, 0, 53, 8, 0, 0,
+  28, 2, 0, 0, 37, 25, 0, 67, 27, 0,
+  0, 2, 0, 53, 88, 0, 20, 0, 26, 0,
+  0, 0, 0, 27, 0, 0, 0, 0, 0, 0,
+  0, 14, 53, 0, 37, 17, 61, 42, 0, 74,
+  24, 0, 64, 0, 4, 21, 0, 0, 6, 36,
+  25, 20, 74, 0, 0, 0, 24, 0, 0, 0,
+  0, 53, 38, 17, 0, 0, 21, 4, 62, 0,
+  41, 58, 0, 16, 0, 3, 0, 0, 0, 0,
+  0, 6, 0, 0, 35, 0, 53, 1, 0, 0,
+  55, 68, 5, 59, 7, 0, 0, 0, 39, 0,
+  0, 18, 78, 0, 0, 0, 25, 2, 0, 0,
+  0, 34, 65, 19, 34, 0, 18, 36, 0, 0,
+  0, 6, 13, 0, 31, 16, 0, 0, 71, 0,
+  0, 16, 19, 37, 0, 40, 14, 0, 0, 0,
+  0, 107, 29, 0, 61, 0, 36, 0, 0, 0,
+  0, 19, 0, 10, 41, 34, 0, 0, 22, 0,
+  133, 0, 33, 13, 17, 0, 9, 54, 28, 7,
+  16, 0, 14, 15, 15, 0, 15, 0, 48, 0,
+  1, 0, 0, 0, 0, 0, 10, 0, 0, 40,
+  0, 1, 9, 0, 35, 68, 7, 20, 38, 3,
+  0, 13, 0, 0, 0, 0, 0, 0, 0, 9,
+  0, 0, 0, 0, 53, 0, 0, 0, 0, 37,
+  0, 30, 19, 0, 8, 0, 29, 1, 5, 0,
+  23, 0, 24, 68, 78, 31, 0, 2, 0, 0,
+  0, 40, 45, 0, 20, 28, 0, 0, 7, 0,
+  46, 69, 0, 0, 0, 8, 7, 0, 0, 0,
+  0, 16, 0, 35, 63, 39, 0, 11, 0, 42,
+  72, 27, 0, 30, 0, 4, 0, 3, 38, 0,
+  0, 31, 0, 0, 79, 0, 75, 41, 0, 0,
+  0, 12, 16, 0, 14, 1, 0, 0, 85, 0,
+  26, 0, 0, 32, 0, 18, 6, 0, 14, 72,
+  0, 6, 28, 0, 15, 0, 0, 80, 18, 0,
+  0, 7, 0, 0, 0, 0, 2, 22, 0, 30,
+  8, 22, 3, 0, 0, 0, 0, 0, 0, 0,
+  101, 0, 9, 26, 7, 0, 0, 119, 31, 10,
+  0, 0, 55, 0, 33, 18, 0, 0, 0, 0,
+  46, 39, 65, 38, 5, 18, 0, 0, 0, 46,
+  49, 6, 24, 40, 0, 0, 0, 0, 84, 26,
+  0, 0, 0, 16, 0, 3, 0, 0, 24, 17,
+  0, 45, 64, 6, 0, 10, 0, 0, 73, 0,
+  0, 0, 32, 0, 0, 35, 7, 5, 0, 0,
+  0, 0, 63, 0, 26, 11, 0, 0, 0, 15,
+  64, 26, 8, 27, 5, 0, 67, 3, 18, 28,
+  0, 6, 0, 0, 1, 26, 36, 0, 0, 22,
+  0, 0, 0, 0, 0, 60, 6, 0, 0, 0,
+  2, 0, 43, 0, 35, 36, 0, 21, 0, 19,
+  0, 0, 0, 0, 13, 0, 0, 0, 95, 0,
+  24, 41, 20, 0, 0, 104, 16, 18, 0, 0,
+  0, 0, 47, 19, 0, 0, 6, 0, 7, 17,
+  36, 23, 0, 2, 0, 0, 72, 39, 0, 0,
+  14, 29, 0, 0, 0, 0, 40, 0, 36, 14,
+  0, 1, 11, 0, 0, 0, 22, 32, 0, 52,
+  25, 0, 0, 0, 0, 42, 40, 0, 22, 0,
+  44, 0, 3, 0, 0, 33, 0, 0, 52, 0,
+  0, 0, 0, 10, 106, 0, 39, 32, 46, 45,
+  0, 59, 28, 0, 21, 0, 1, 31, 0, 0,
+  5, 21, 26, 0, 31, 0, 0, 0, 5, 0,
+  0, 0, 0, 52, 28, 23, 1, 0, 7, 59,
+  48, 1, 0, 29, 0, 28, 0, 8, 0, 0,
+  0, 0, 0, 12, 0, 0, 0, 0, 49, 26,
+  5, 0, 12, 13, 0, 21, 6, 5, 0, 0,
+  11, 0, 0, 0, 48, 0, 0, 18, 58, 12,
+  0, 0, 0, 8, 0, 28, 33, 0, 31, 20,
+  0, 0, 0, 2, 67, 50, 0, 0, 0, 26,
+  49, 0, 0, 0, 0, 31, 0, 97, 52, 74,
+  0, 0, 0, 36, 26, 0, 0, 44, 0, 0,
+  0, 0, 64, 9, 0, 12, 0, 0, 87, 26,
+  88, 48, 67, 0, 0, 16, 0, 0, 28, 0,
+  0, 0, 33, 0, 46, 22, 0, 32, 0, 0,
+  2, 0, 0, 84, 0, 0, 12, 0, 0, 0,
+  1, 115, 49, 54, 0, 40, 17, 26, 0, 0,
+  9, 0, 0, 49, 0, 16, 0, 0, 0, 0,
+  29, 0, 1, 0, 46, 0, 0, 0, 33, 16,
+  0, 98, 0, 20, 14, 0, 60, 12, 44, 16,
+  32, 0, 54, 0, 44, 107, 104, 30, 6, 0,
+  0, 0, 0, 40, 41, 45, 0, 53, 0, 0,
+  0, 0, 87, 64, 0, 0, 0, 27, 0, 41,
+  0, 0, 16, 28, 30, 44, 24, 53, 0, 28,
+  0, 0, 87, 10, 0, 0, 0, 14, 0, 58,
+  10, 0, 0, 24, 0, 0, 75, 0, 41, 0,
+  0, 0, 0, 48, 17, 40, 0, 0, 0, 12,
+  73, 0, 9, 26, 0, 32, 2, 2, 0, 43,
+  49, 36, 0, 65, 0, 26, 0, 0, 0, 86,
+  27, 0, 0, 0, 9, 0, 28, 10, 24, 30,
+  0, 17, 0, 27, 0, 0, 0, 0, 2, 0,
+  8, 0, 164, 0, 52, 9, 40, 0, 0, 111,
+  49, 4, 4, 0, 0, 13, 78, 36, 24, 0,
+  20, 0, 0, 97, 83, 24, 24, 5, 0, 0,
+  48, 50, 0, 0, 1, 78, 1, 0, 0, 0,
+  68, 0, 12, 0, 0, 28, 0, 3, 0, 0,
+  11, 19, 11, 36, 0, 0, 0, 29, 0, 18,
+  44, 0, 0, 0, 1, 0, 0, 8, 0, 0,
+  0, 0, 0, 0, 29, 0, 0, 0, 0, 0,
+  32, 72, 9, 90, 0, 112, 2, 20, 35, 0,
+  0, 53, 0, 31, 6, 61, 21, 24, 117, 0,
+  0, 0, 26, 0, 0, 0, 0, 100, 90, 0,
+  0, 0, 7, 0, 54, 21, 0, 21, 0, 0,
+  0, 15, 0, 0, 0, 0, 0, 21, 0, 0,
+  73, 0, 76, 10, 35, 0, 0, 115, 36, 17,
+  6, 0, 3, 0, 44, 17, 0, 0, 3, 0,
+  0, 24, 36, 38, 6, 35, 0, 0, 67, 53,
+  19, 0, 40, 54, 0, 0, 0, 0, 68, 0,
+  53, 8, 0, 0, 28, 2, 0, 0, 37, 25,
+  0, 67, 27, 0, 0, 2, 0, 53, 88, 0,
+  20, 0, 26, 0, 0, 0, 0, 27, 0, 0,
+  0, 0, 0, 0, 0, 14, 53, 0, 37, 17,
+  61, 42, 0, 74, 24, 0, 64, 0, 4, 21,
+  0, 0, 6, 36, 25, 20, 74, 0, 0, 0,
+  24, 0, 0, 0, 0, 53, 38, 17, 0, 0,
+  21, 4, 62, 0, 41, 58, 0, 16, 0, 3,
+  0, 0, 0, 0, 0, 6, 0, 0, 35, 0,
+  53, 1, 0, 0, 55, 68, 5, 59, 7, 0,
+  0, 0, 39, 0, 0, 18, 78, 0, 0, 0,
+  25, 2, 0, 0, 0, 34, 65, 19, 34, 0,
+  18, 36, 0, 0, 0, 6, 13, 0, 31, 16,
+  0, 0, 71, 0, 0, 16, 19, 37, 0, 40,
+  14, 0, 0, 0, 0, 107, 29, 0, 61, 0,
+  36, 0, 0, 0, 0, 19, 0, 10, 41, 34,
+  0, 0, 22, 0, 133, 0, 33, 13, 17, 0,
+  9, 54, 28, 7, 16, 0, 14, 15, 15, 0,
+  15, 0, 48, 0, 1, 0, 0, 0, 0, 0,
+  10, 0, 0, 40, 0, 1, 9, 0, 35, 68,
+  7, 20, 38, 3, 0, 13, 0, 0, 0, 0,
+  0, 0, 0, 9, 0, 0, 0, 0, 53, 0,
+  0, 0, 104, 21, 0, 47, 20, 66, 0, 0,
+  53, 0, 0, 0, 116, 0, 0, 40, 62, 0,
+  2, 0, 11, 68, 0, 8, 23, 0, 0, 43,
+  3, 1, 13, 72, 0, 27, 24, 0, 0, 21,
+  96, 5, 13, 87, 14, 47, 59, 16, 0, 0,
+  0, 0, 0, 111, 0, 0, 107, 59, 25, 17,
+  19, 0, 0, 13, 9, 35, 0, 93, 0, 0,
+  13, 0, 155, 30, 22, 32, 0, 0, 34, 19,
+  0, 47, 0, 0, 15, 14, 42, 14, 8, 0,
+  73, 0, 0, 0, 0, 2, 0, 0, 31, 0,
+  21, 50, 0, 0, 5, 0, 30, 31, 0, 67,
+  22, 0, 17, 0, 0, 0, 0, 0, 0, 0,
+  0, 1, 0, 3, 0, 16, 53, 0, 3, 16,
+  0, 119, 31, 10, 0, 0, 55, 0, 33, 18,
+  0, 0, 0, 0, 46, 39, 65, 38, 5, 18,
+  0, 0, 0, 46, 49, 6, 24, 40, 0, 0,
+  0, 0, 84, 26, 0, 0, 0, 16, 0, 3,
+  0, 0, 24, 17, 0, 45, 64, 6, 0, 10,
+  0, 0, 73, 0, 0, 0, 32, 0, 0, 35,
+  7, 5, 0, 0, 0, 0, 63, 0, 26, 11,
+  0, 0, 0, 15, 64, 26, 8, 27, 5, 0,
+  67, 3, 18, 28, 0, 6, 0, 0, 1, 26,
+  36, 0, 0, 22, 0, 0, 0, 0, 0, 60,
+  6, 0, 0, 0, 2, 0, 43, 0, 35, 36,
+  0, 21, 0, 19, 0, 0, 0, 0, 13, 0,
+  0, 0, 95, 0, 24, 41, 20, 0, 0, 104,
+  16, 18, 0, 0, 0, 0, 47, 19, 0, 0,
+  6, 0, 7, 17, 36, 23, 0, 2, 0, 0,
+  72, 39, 0, 0, 14, 29, 0, 0, 0, 0,
+  40, 0, 36, 14, 0, 1, 11, 0, 0, 0,
+  22, 32, 0, 52, 25, 0, 0, 0, 0, 42,
+  40, 0, 22, 0, 44, 0, 3, 0, 0, 33,
+  0, 0, 52, 0, 0, 0, 0, 10, 106, 0,
+  39, 32, 46, 45, 0, 59, 28, 0, 21, 0,
+  1, 31, 0, 0, 5, 21, 26, 0, 31, 0,
+  0, 0, 5, 0, 0, 0, 0, 52, 28, 23,
+  1, 0, 7, 59, 48, 1, 0, 29, 0, 28,
+  0, 8, 0, 0, 0, 0, 0, 12, 0, 0,
+  0, 0, 49, 26, 5, 0, 107, 66, 16, 65,
+  30, 0, 0, 17, 71, 14, 28, 0, 85, 0,
+  0, 80, 60, 0, 13, 0, 0, 32, 32, 6,
+  0, 0, 0, 61, 0, 37, 19, 69, 10, 6,
+  18, 5, 0, 44, 103, 0, 0, 23, 0, 23,
+  18, 0, 0, 0, 0, 0, 0, 86, 0, 0,
+  83, 13, 32, 36, 9, 0, 0, 0, 0, 0,
+  15, 55, 0, 0, 11, 0, 91, 19, 43, 55,
+  0, 39, 28, 49, 0, 26, 0, 0, 19, 64,
+  28, 26, 14, 0, 86, 0, 32, 0, 0, 14,
+  0, 0, 66, 0, 5, 67, 43, 0, 9, 0,
+  0, 58, 0, 60, 9, 0, 6, 0, 0, 0,
+  0, 0, 0, 0, 0, 15, 0, 4, 0, 18,
+  46, 15, 12, 30, 0, 98, 0, 20, 14, 0,
+  60, 12, 44, 16, 32, 0, 54, 0, 44, 107,
+  104, 30, 6, 0, 0, 0, 0, 40, 41, 45,
+  0, 53, 0, 0, 0, 0, 87, 64, 0, 0,
+  0, 27, 0, 41, 0, 0, 16, 28, 30, 44,
+  24, 53, 0, 28, 0, 0, 87, 10, 0, 0,
+  0, 14, 0, 58, 10, 0, 0, 24, 0, 0,
+  75, 0, 41, 0, 0, 0, 0, 48, 17, 40,
+  0, 0, 0, 12, 73, 0, 9, 26, 0, 32,
+  2, 2, 0, 43, 49, 36, 0, 65, 0, 26,
+  0, 0, 0, 86, 27, 0, 0, 0, 9, 0,
+  28, 10, 24, 30, 0, 17, 0, 27, 0, 0,
+  0, 0, 2, 0, 8, 0, 164, 0, 52, 9,
+  40, 0, 0, 111, 49, 4, 4, 0, 0, 13,
+  78, 36, 24, 0, 20, 0, 0, 97, 83, 24,
+  24, 5, 0, 0, 48, 50, 0, 0, 1, 78,
+  1, 0, 0, 0, 68, 0, 12, 0, 0, 28,
+  0, 3, 0, 0, 11, 19, 11, 36, 0, 0,
+  0, 29, 0, 18, 44, 0, 0, 0, 1, 0,
+  0, 8, 0, 0, 0, 0, 0, 0, 29, 0,
+  0, 0, 0, 0, 32, 72, 9, 90, 0, 112,
+  2, 20, 35, 0, 0, 53, 0, 31, 6, 61,
+  21, 24, 117, 0, 0, 0, 26, 0, 0, 0,
+  0, 100, 90, 0, 0, 0, 7, 0, 54, 21,
+  0, 21, 0, 0, 0, 15, 0, 0, 0, 0,
+  0, 21, 0, 0, 73, 0, 76, 10, 35, 0,
+  59, 1, 72, 42, 0, 0, 0, 22, 38, 13,
+  13, 6, 0, 7, 0, 21, 38, 13, 14, 0,
+  0, 64, 43, 11, 0, 0, 1, 54, 0, 38,
+  0, 39, 17, 0, 12, 19, 36, 29, 3, 0,
+  0, 0, 0, 0, 0, 11, 0, 0, 0, 0,
+  0, 70, 0, 0, 91, 0, 38, 0, 8, 0,
+  0, 4, 0, 0, 64, 10, 0, 0, 0, 114,
+  20, 0, 74, 27, 0, 45, 12, 51, 27, 0,
+  0, 0, 15, 101, 0, 21, 22, 36, 22, 0,
+  57, 0, 0, 0, 62, 0, 29, 0, 0, 72,
+  95, 0, 0, 0, 0, 80, 0, 16, 0, 0,
+  0, 13, 0, 0, 0, 0, 0, 0, 0, 33,
+  0, 3, 0, 0, 0, 0, 4, 22, 55, 68,
+  5, 59, 7, 0, 0, 0, 39, 0, 0, 18,
+  78, 0, 0, 0, 25, 2, 0, 0, 0, 34,
+  65, 19, 34, 0, 18, 36, 0, 0, 0, 6,
+  13, 0, 31, 16, 0, 0, 71, 0, 0, 16,
+  19, 37, 0, 40, 14, 0, 0, 0, 0, 107,
+  29, 0, 61, 0, 36, 0, 0, 0, 0, 19,
+  0, 10, 41, 34, 0, 0, 22, 0, 133, 0,
+  33, 13, 17, 0, 9, 54, 28, 7, 16, 0,
+  14, 15, 15, 0, 15, 0, 48, 0, 1, 0,
+  0, 0, 0, 0, 10, 0, 0, 40, 0, 1,
+  9, 0, 35, 68, 7, 20, 38, 3, 0, 13,
+  0, 0, 0, 0, 0, 0, 0, 9, 0, 0,
+  0, 0, 53, 0, 0, 0, 104, 21, 0, 47,
+  20, 66, 0, 0, 53, 0, 0, 0, 116, 0,
+  0, 40, 62, 0, 2, 0, 11, 68, 0, 8,
+  23, 0, 0, 43, 3, 1, 13, 72, 0, 27,
+  24, 0, 0, 21, 96, 5, 13, 87, 14, 47,
+  59, 16, 0, 0, 0, 0, 0, 111, 0, 0,
+  107, 59, 25, 17, 19, 0, 0, 13, 9, 35,
+  0, 93, 0, 0, 13, 0, 155, 30, 22, 32,
+  0, 0, 34, 19, 0, 47, 0, 0, 15, 14,
+  42, 14, 8, 0, 73, 0, 0, 0, 0, 2,
+  0, 0, 31, 0, 21, 50, 0, 0, 5, 0,
+  30, 31, 0, 67, 22, 0, 17, 0, 0, 0,
+  0, 0, 0, 0, 0, 1, 0, 3, 0, 16,
+  53, 0, 3, 16, 0, 0, 0, 0, 0, 145,
+  0, 0, 46, 0, 0, 0, 34, 21, 0, 109,
+  67, 48, 0, 0, 39, 1, 0, 58, 0, 0,
+  0, 56, 1, 0, 0, 0, 49, 0, 0, 0,
+  22, 71, 0, 0, 22, 0, 0, 3, 13, 87,
+  0, 0, 0, 14, 12, 53, 23, 0, 62, 19,
+  29, 0, 0, 0, 0, 48, 0, 0, 12, 0,
+  16, 0, 17, 13, 58, 0, 50, 76, 0, 66,
+  0, 52, 0, 0, 8, 0, 17, 64, 0, 25,
+  19, 0, 22, 2, 35, 128, 0, 0, 75, 0,
+  0, 0, 0, 93, 86, 0, 0, 0, 15, 0,
+  0, 38, 0, 19, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 13, 0,
+  4, 15, 0, 104, 16, 18, 0, 0, 0, 0,
+  47, 19, 0, 0, 6, 0, 7, 17, 36, 23,
+  0, 2, 0, 0, 72, 39, 0, 0, 14, 29,
+  0, 0, 0, 0, 40, 0, 36, 14, 0, 1,
+  11, 0, 0, 0, 22, 32, 0, 52, 25, 0,
+  0, 0, 0, 42, 40, 0, 22, 0, 44, 0,
+  3, 0, 0, 33, 0, 0, 52, 0, 0, 0,
+  0, 10, 106, 0, 39, 32, 46, 45, 0, 59,
+  28, 0, 21, 0, 1, 31, 0, 0, 5, 21,
+  26, 0, 31, 0, 0, 0, 5, 0, 0, 0,
+  0, 52, 28, 23, 1, 0, 7, 59, 48, 1,
+  0, 29, 0, 28, 0, 8, 0, 0, 0, 0,
+  0, 12, 0, 0, 0, 0, 49, 26, 5, 0,
+  107, 66, 16, 65, 30, 0, 0, 17, 71, 14,
+  28, 0, 85, 0, 0, 80, 60, 0, 13, 0,
+  0, 32, 32, 6, 0, 0, 0, 61, 0, 37,
+  19, 69, 10, 6, 18, 5, 0, 44, 103, 0,
+  0, 23, 0, 23, 18, 0, 0, 0, 0, 0,
+  0, 86, 0, 0, 83, 13, 32, 36, 9, 0,
+  0, 0, 0, 0, 15, 55, 0, 0, 11, 0,
+  91, 19, 43, 55, 0, 39, 28, 49, 0, 26,
+  0, 0, 19, 64, 28, 26, 14, 0, 86, 0,
+  32, 0, 0, 14, 0, 0, 66, 0, 5, 67,
+  43, 0, 9, 0, 0, 58, 0, 60, 9, 0,
+  6, 0, 0, 0, 0, 0, 0, 0, 0, 15,
+  0, 4, 0, 18, 46, 15, 12, 30, 14, 0,
+  60, 29, 0, 164, 0, 0, 18, 0, 0, 0,
+  3, 20, 0, 48, 30, 38, 0, 0, 13, 76,
+  24, 1, 0, 0, 0, 35, 0, 48, 0, 88,
+  0, 0, 0, 20, 63, 58, 24, 0, 0, 0,
+  0, 0, 0, 11, 0, 0, 13, 0, 0, 83,
+  0, 0, 99, 0, 57, 0, 22, 0, 0, 57,
+  14, 0, 110, 0, 0, 29, 2, 76, 21, 14,
+  67, 27, 0, 44, 44, 26, 0, 0, 0, 0,
+  32, 108, 0, 10, 10, 0, 11, 0, 10, 13,
+  0, 0, 58, 0, 30, 0, 0, 71, 79, 0,
+  0, 0, 0, 18, 0, 26, 0, 0, 0, 0,
+  0, 0, 4, 4, 54, 0, 0, 35, 0, 18,
+  0, 0, 0, 17, 0, 23, 0, 111, 49, 4,
+  4, 0, 0, 13, 78, 36, 24, 0, 20, 0,
+  0, 97, 83, 24, 24, 5, 0, 0, 48, 50,
+  0, 0, 1, 78, 1, 0, 0, 0, 68, 0,
+  12, 0, 0, 28, 0, 3, 0, 0, 11, 19,
+  11, 36, 0, 0, 0, 29, 0, 18, 44, 0,
+  0, 0, 1, 0, 0, 8, 0, 0, 0, 0,
+  0, 0, 29, 0, 0, 0, 0, 0, 32, 72,
+  9, 90, 0, 112, 2, 20, 35, 0, 0, 53,
+  0, 31, 6, 61, 21, 24, 117, 0, 0, 0,
+  26, 0, 0, 0, 0, 100, 90, 0, 0, 0,
+  7, 0, 54, 21, 0, 21, 0, 0, 0, 15,
+  0, 0, 0, 0, 0, 21, 0, 0, 73, 0,
+  76, 10, 35, 0, 59, 1, 72, 42, 0, 0,
+  0, 22, 38, 13, 13, 6, 0, 7, 0, 21,
+  38, 13, 14, 0, 0, 64, 43, 11, 0, 0,
+  1, 54, 0, 38, 0, 39, 17, 0, 12, 19,
+  36, 29, 3, 0, 0, 0, 0, 0, 0, 11,
+  0, 0, 0, 0, 0, 70, 0, 0, 91, 0,
+  38, 0, 8, 0, 0, 4, 0, 0, 64, 10,
+  0, 0, 0, 114, 20, 0, 74, 27, 0, 45,
+  12, 51, 27, 0, 0, 0, 15, 101, 0, 21,
+  22, 36, 22, 0, 57, 0, 0, 0, 62, 0,
+  29, 0, 0, 72, 95, 0, 0, 0, 0, 80,
+  0, 16, 0, 0, 0, 13, 0, 0, 0, 0,
+  0, 0, 0, 33, 0, 3, 0, 0, 0, 0,
+  4, 22, 21, 0, 99, 34, 0, 157, 0, 0,
+  0, 0, 0, 17, 14, 49, 0, 0, 14, 40,
+  0, 1, 5, 82, 30, 0, 0, 0, 0, 0,
+  0, 147, 4, 78, 0, 24, 0, 23, 87, 19,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+  42, 0, 0, 78, 0, 0, 59, 0, 56, 0,
+  27, 0, 0, 28, 13, 0, 118, 0, 0, 48,
+  0, 113, 0, 36, 68, 0, 0, 7, 28, 0,
+  17, 0, 0, 0, 10, 108, 35, 0, 27, 10,
+  7, 0, 0, 0, 13, 0, 52, 0, 0, 0,
+  0, 5, 41, 0, 0, 0, 0, 82, 0, 16,
+  0, 8, 18, 0, 0, 0, 39, 10, 84, 0,
+  0, 54, 5, 43, 0, 6, 0, 3, 0, 26,
+  104, 21, 0, 47, 20, 66, 0, 0, 53, 0,
+  0, 0, 116, 0, 0, 40, 62, 0, 2, 0,
+  11, 68, 0, 8, 23, 0, 0, 43, 3, 1,
+  13, 72, 0, 27, 24, 0, 0, 21, 96, 5,
+  13, 87, 14, 47, 59, 16, 0, 0, 0, 0,
+  0, 111, 0, 0, 107, 59, 25, 17, 19, 0,
+  0, 13, 9, 35, 0, 93, 0, 0, 13, 0,
+  155, 30, 22, 32, 0, 0, 34, 19, 0, 47,
+  0, 0, 15, 14, 42, 14, 8, 0, 73, 0,
+  0, 0, 0, 2, 0, 0, 31, 0, 21, 50,
+  0, 0, 5, 0, 30, 31, 0, 67, 22, 0,
+  17, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+  0, 3, 0, 16, 53, 0, 3, 16, 0, 0,
+  0, 0, 0, 145, 0, 0, 46, 0, 0, 0,
+  34, 21, 0, 109, 67, 48, 0, 0, 39, 1,
+  0, 58, 0, 0, 0, 56, 1, 0, 0, 0,
+  49, 0, 0, 0, 22, 71, 0, 0, 22, 0,
+  0, 3, 13, 87, 0, 0, 0, 14, 12, 53,
+  23, 0, 62, 19, 29, 0, 0, 0, 0, 48,
+  0, 0, 12, 0, 16, 0, 17, 13, 58, 0,
+  50, 76, 0, 66, 0, 52, 0, 0, 8, 0,
+  17, 64, 0, 25, 19, 0, 22, 2, 35, 128,
+  0, 0, 75, 0, 0, 0, 0, 93, 86, 0,
+  0, 0, 15, 0, 0, 38, 0, 19, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 13, 0, 4, 15, 0, 0, 92, 0,
+  0, 76, 0, 0, 44, 0, 0, 15, 13, 93,
+  0, 13, 41, 74, 27, 0, 22, 35, 4, 32,
+  0, 0, 0, 34, 0, 0, 18, 4, 5, 0,
+  0, 0, 14, 65, 0, 0, 0, 14, 0, 0,
+  0, 18, 0, 0, 0, 0, 19, 112, 26, 0,
+  66, 0, 49, 0, 1, 0, 0, 12, 0, 0,
+  37, 7, 27, 10, 26, 96, 0, 0, 36, 15,
+  0, 30, 0, 21, 0, 0, 0, 0, 33, 83,
+  0, 28, 14, 34, 42, 0, 16, 32, 0, 0,
+  39, 0, 0, 0, 13, 107, 45, 0, 0, 0,
+  3, 18, 0, 20, 0, 5, 17, 0, 0, 0,
+  49, 0, 46, 44, 22, 4, 0, 0, 0, 0,
+  20, 0, 0, 18, 107, 66, 16, 65, 30, 0,
+  0, 17, 71, 14, 28, 0, 85, 0, 0, 80,
+  60, 0, 13, 0, 0, 32, 32, 6, 0, 0,
+  0, 61, 0, 37, 19, 69, 10, 6, 18, 5,
+  0, 44, 103, 0, 0, 23, 0, 23, 18, 0,
+  0, 0, 0, 0, 0, 86, 0, 0, 83, 13,
+  32, 36, 9, 0, 0, 0, 0, 0, 15, 55,
+  0, 0, 11, 0, 91, 19, 43, 55, 0, 39,
+  28, 49, 0, 26, 0, 0, 19, 64, 28, 26,
+  14, 0, 86, 0, 32, 0, 0, 14, 0, 0,
+  66, 0, 5, 67, 43, 0, 9, 0, 0, 58,
+  0, 60, 9, 0, 6, 0, 0, 0, 0, 0,
+  0, 0, 0, 15, 0, 4, 0, 18, 46, 15,
+  12, 30, 14, 0, 60, 29, 0, 164, 0, 0,
+  18, 0, 0, 0, 3, 20, 0, 48, 30, 38,
+  0, 0, 13, 76, 24, 1, 0, 0, 0, 35,
+  0, 48, 0, 88, 0, 0, 0, 20, 63, 58,
+  24, 0, 0, 0, 0, 0, 0, 11, 0, 0,
+  13, 0, 0, 83, 0, 0, 99, 0, 57, 0,
+  22, 0, 0, 57, 14, 0, 110, 0, 0, 29,
+  2, 76, 21, 14, 67, 27, 0, 44, 44, 26,
+  0, 0, 0, 0, 32, 108, 0, 10, 10, 0,
+  11, 0, 10, 13, 0, 0, 58, 0, 30, 0,
+  0, 71, 79, 0, 0, 0, 0, 18, 0, 26,
+  0, 0, 0, 0, 0, 0, 4, 4, 54, 0,
+  0, 35, 0, 18, 0, 0, 0, 17, 0, 23,
+  0, 0, 70, 0, 4, 150, 0, 0, 0, 0,
+  0, 1, 23, 94, 0, 0, 0, 44, 0, 0,
+  21, 54, 0, 39, 0, 0, 0, 0, 0, 45,
+  16, 26, 0, 7, 0, 0, 0, 50, 0, 0,
+  0, 11, 0, 27, 0, 8, 1, 0, 0, 0,
+  12, 123, 0, 0, 39, 0, 39, 0, 42, 0,
+  0, 32, 0, 0, 97, 0, 0, 31, 0, 64,
+  0, 26, 51, 0, 0, 17, 0, 0, 0, 0,
+  0, 0, 27, 70, 21, 0, 16, 15, 54, 0,
+  0, 0, 24, 0, 2, 0, 0, 0, 0, 60,
+  12, 0, 0, 0, 0, 79, 0, 14, 0, 5,
+  25, 0, 0, 14, 51, 41, 105, 41, 29, 52,
+  23, 0, 0, 0, 17, 23, 0, 13, 59, 1,
+  72, 42, 0, 0, 0, 22, 38, 13, 13, 6,
+  0, 7, 0, 21, 38, 13, 14, 0, 0, 64,
+  43, 11, 0, 0, 1, 54, 0, 38, 0, 39,
+  17, 0, 12, 19, 36, 29, 3, 0, 0, 0,
+  0, 0, 0, 11, 0, 0, 0, 0, 0, 70,
+  0, 0, 91, 0, 38, 0, 8, 0, 0, 4,
+  0, 0, 64, 10, 0, 0, 0, 114, 20, 0,
+  74, 27, 0, 45, 12, 51, 27, 0, 0, 0,
+  15, 101, 0, 21, 22, 36, 22, 0, 57, 0,
+  0, 0, 62, 0, 29, 0, 0, 72, 95, 0,
+  0, 0, 0, 80, 0, 16, 0, 0, 0, 13,
+  0, 0, 0, 0, 0, 0, 0, 33, 0, 3,
+  0, 0, 0, 0, 4, 22, 21, 0, 99, 34,
+  0, 157, 0, 0, 0, 0, 0, 17, 14, 49,
+  0, 0, 14, 40, 0, 1, 5, 82, 30, 0,
+  0, 0, 0, 0, 0, 147, 4, 78, 0, 24,
+  0, 23, 87, 19, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 3, 42, 0, 0, 78, 0, 0,
+  59, 0, 56, 0, 27, 0, 0, 28, 13, 0,
+  118, 0, 0, 48, 0, 113, 0, 36, 68, 0,
+  0, 7, 28, 0, 17, 0, 0, 0, 10, 108,
+  35, 0, 27, 10, 7, 0, 0, 0, 13, 0,
+  52, 0, 0, 0, 0, 5, 41, 0, 0, 0,
+  0, 82, 0, 16, 0, 8, 18, 0, 0, 0,
+  39, 10, 84, 0, 0, 54, 5, 43, 0, 6,
+  0, 3, 0, 26, 0, 9, 38, 0, 15, 120,
+  0, 0, 0, 0, 0, 3, 58, 72, 0, 0,
+  0, 18, 0, 18, 44, 0, 0, 51, 0, 3,
+  0, 0, 0, 91, 41, 0, 0, 22, 0, 0,
+  0, 22, 0, 25, 0, 45, 0, 53, 1, 0,
+  0, 32, 0, 0, 0, 70, 11, 0, 0, 0,
+  19, 0, 13, 14, 0, 9, 0, 0, 0, 0,
+  0, 11, 0, 0, 0, 58, 10, 0, 0, 20,
+  0, 0, 2, 19, 0, 27, 10, 28, 51, 0,
+  32, 5, 54, 4, 0, 0, 52, 5, 0, 37,
+  0, 0, 0, 30, 0, 0, 0, 0, 3, 4,
+  0, 16, 10, 25, 57, 0, 0, 17, 37, 0,
+  63, 43, 24, 47, 55, 1, 2, 0, 25, 2,
+  0, 0, 0, 0, 0, 0, 0, 145, 0, 0,
+  46, 0, 0, 0, 34, 21, 0, 109, 67, 48,
+  0, 0, 39, 1, 0, 58, 0, 0, 0, 56,
+  1, 0, 0, 0, 49, 0, 0, 0, 22, 71,
+  0, 0, 22, 0, 0, 3, 13, 87, 0, 0,
+  0, 14, 12, 53, 23, 0, 62, 19, 29, 0,
+  0, 0, 0, 48, 0, 0, 12, 0, 16, 0,
+  17, 13, 58, 0, 50, 76, 0, 66, 0, 52,
+  0, 0, 8, 0, 17, 64, 0, 25, 19, 0,
+  22, 2, 35, 128, 0, 0, 75, 0, 0, 0,
+  0, 93, 86, 0, 0, 0, 15, 0, 0, 38,
+  0, 19, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 13, 0, 4, 15,
+  0, 0, 92, 0, 0, 76, 0, 0, 44, 0,
+  0, 15, 13, 93, 0, 13, 41, 74, 27, 0,
+  22, 35, 4, 32, 0, 0, 0, 34, 0, 0,
+  18, 4, 5, 0, 0, 0, 14, 65, 0, 0,
+  0, 14, 0, 0, 0, 18, 0, 0, 0, 0,
+  19, 112, 26, 0, 66, 0, 49, 0, 1, 0,
+  0, 12, 0, 0, 37, 7, 27, 10, 26, 96,
+  0, 0, 36, 15, 0, 30, 0, 21, 0, 0,
+  0, 0, 33, 83, 0, 28, 14, 34, 42, 0,
+  16, 32, 0, 0, 39, 0, 0, 0, 13, 107,
+  45, 0, 0, 0, 3, 18, 0, 20, 0, 5,
+  17, 0, 0, 0, 49, 0, 46, 44, 22, 4,
+  0, 0, 0, 0, 20, 0, 0, 18, 0, 0,
+  91, 0, 0, 56, 0, 0, 0, 0, 0, 21,
+  6, 68, 0, 0, 3, 66, 22, 26, 0, 44,
+  1, 12, 25, 0, 0, 0, 0, 0, 35, 19,
+  0, 0, 0, 0, 0, 41, 0, 0, 0, 9,
+  0, 13, 0, 4, 17, 0, 0, 0, 11, 90,
+  12, 0, 37, 0, 34, 0, 44, 0, 0, 20,
+  0, 0, 71, 0, 0, 58, 0, 66, 0, 22,
+  34, 0, 4, 12, 0, 0, 14, 0, 0, 0,
+  11, 67, 48, 0, 47, 25, 46, 0, 0, 0,
+  0, 0, 2, 0, 0, 5, 16, 47, 0, 0,
+  0, 1, 0, 93, 0, 9, 0, 23, 27, 12,
+  0, 4, 70, 6, 57, 62, 45, 37, 28, 1,
+  0, 0, 18, 8, 3, 27, 14, 0, 60, 29,
+  0, 164, 0, 0, 18, 0, 0, 0, 3, 20,
+  0, 48, 30, 38, 0, 0, 13, 76, 24, 1,
+  0, 0, 0, 35, 0, 48, 0, 88, 0, 0,
+  0, 20, 63, 58, 24, 0, 0, 0, 0, 0,
+  0, 11, 0, 0, 13, 0, 0, 83, 0, 0,
+  99, 0, 57, 0, 22, 0, 0, 57, 14, 0,
+  110, 0, 0, 29, 2, 76, 21, 14, 67, 27,
+  0, 44, 44, 26, 0, 0, 0, 0, 32, 108,
+  0, 10, 10, 0, 11, 0, 10, 13, 0, 0,
+  58, 0, 30, 0, 0, 71, 79, 0, 0, 0,
+  0, 18, 0, 26, 0, 0, 0, 0, 0, 0,
+  4, 4, 54, 0, 0, 35, 0, 18, 0, 0,
+  0, 17, 0, 23, 0, 0, 70, 0, 4, 150,
+  0, 0, 0, 0, 0, 1, 23, 94, 0, 0,
+  0, 44, 0, 0, 21, 54, 0, 39, 0, 0,
+  0, 0, 0, 45, 16, 26, 0, 7, 0, 0,
+  0, 50, 0, 0, 0, 11, 0, 27, 0, 8,
+  1, 0, 0, 0, 12, 123, 0, 0, 39, 0,
+  39, 0, 42, 0, 0, 32, 0, 0, 97, 0,
+  0, 31, 0, 64, 0, 26, 51, 0, 0, 17,
+  0, 0, 0, 0, 0, 0, 27, 70, 21, 0,
+  16, 15, 54, 0, 0, 0, 24, 0, 2, 0,
+  0, 0, 0, 60, 12, 0, 0, 0, 0, 79,
+  0, 14, 0, 5, 25, 0, 0, 14, 51, 41,
+  105, 41, 29, 52, 23, 0, 0, 0, 17, 23,
+  0, 13, 0, 43, 48, 0, 24, 32, 13, 0,
+  8, 0, 0, 0, 63, 49, 0, 0, 3, 17,
+  8, 10, 0, 0, 0, 37, 41, 35, 6, 0,
+  0, 48, 48, 0, 0, 14, 0, 0, 0, 2,
+  0, 39, 0, 40, 0, 41, 21, 0, 3, 0,
+  0, 0, 0, 40, 61, 0, 0, 0, 14, 6,
+  2, 35, 0, 6, 0, 21, 0, 0, 0, 27,
+  0, 0, 0, 32, 20, 0, 21, 28, 0, 0,
+  0, 25, 16, 25, 21, 40, 63, 0, 39, 18,
+  50, 13, 0, 0, 32, 28, 0, 22, 0, 38,
+  15, 31, 0, 0, 0, 0, 0, 28, 14, 0,
+  53, 57, 40, 0, 0, 20, 46, 0, 33, 38,
+  62, 29, 61, 16, 47, 0, 46, 37, 0, 1,
+  21, 0, 99, 34, 0, 157, 0, 0, 0, 0,
+  0, 17, 14, 49, 0, 0, 14, 40, 0, 1,
+  5, 82, 30, 0, 0, 0, 0, 0, 0, 147,
+  4, 78, 0, 24, 0, 23, 87, 19, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 3, 42, 0,
+  0, 78, 0, 0, 59, 0, 56, 0, 27, 0,
+  0, 28, 13, 0, 118, 0, 0, 48, 0, 113,
+  0, 36, 68, 0, 0, 7, 28, 0, 17, 0,
+  0, 0, 10, 108, 35, 0, 27, 10, 7, 0,
+  0, 0, 13, 0, 52, 0, 0, 0, 0, 5,
+  41, 0, 0, 0, 0, 82, 0, 16, 0, 8,
+  18, 0, 0, 0, 39, 10, 84, 0, 0, 54,
+  5, 43, 0, 6, 0, 3, 0, 26, 0, 9,
+  38, 0, 15, 120, 0, 0, 0, 0, 0, 3,
+  58, 72, 0, 0, 0, 18, 0, 18, 44, 0,
+  0, 51, 0, 3, 0, 0, 0, 91, 41, 0,
+  0, 22, 0, 0, 0, 22, 0, 25, 0, 45,
+  0, 53, 1, 0, 0, 32, 0, 0, 0, 70,
+  11, 0, 0, 0, 19, 0, 13, 14, 0, 9,
+  0, 0, 0, 0, 0, 11, 0, 0, 0, 58,
+  10, 0, 0, 20, 0, 0, 2, 19, 0, 27,
+  10, 28, 51, 0, 32, 5, 54, 4, 0, 0,
+  52, 5, 0, 37, 0, 0, 0, 30, 0, 0,
+  0, 0, 3, 4, 0, 16, 10, 25, 57, 0,
+  0, 17, 37, 0, 63, 43, 24, 47, 55, 1,
+  2, 0, 25, 2, 0, 0, 0, 70, 65, 0,
+  63, 0, 15, 0, 1, 0, 14, 0, 64, 75,
+  0, 51, 17, 7, 26, 16, 9, 0, 0, 47,
+  38, 59, 0, 0, 0, 0, 53, 0, 0, 37,
+  12, 0, 0, 0, 0, 53, 50, 43, 24, 71,
+  73, 0, 0, 0, 0, 0, 0, 26, 50, 0,
+  0, 0, 0, 20, 1, 27, 24, 0, 0, 63,
+  0, 2, 29, 0, 0, 0, 0, 0, 7, 41,
+  16, 12, 0, 17, 0, 23, 46, 34, 33, 22,
+  87, 14, 32, 4, 49, 40, 0, 20, 24, 31,
+  0, 54, 0, 35, 3, 41, 0, 0, 0, 0,
+  0, 0, 7, 10, 34, 32, 82, 0, 0, 13,
+  31, 0, 0, 29, 54, 8, 7, 0, 55, 0,
+  75, 11, 2, 0, 0, 0, 92, 0, 0, 76,
+  0, 0, 44, 0, 0, 15, 13, 93, 0, 13,
+  41, 74, 27, 0, 22, 35, 4, 32, 0, 0,
+  0, 34, 0, 0, 18, 4, 5, 0, 0, 0,
+  14, 65, 0, 0, 0, 14, 0, 0, 0, 18,
+  0, 0, 0, 0, 19, 112, 26, 0, 66, 0,
+  49, 0, 1, 0, 0, 12, 0, 0, 37, 7,
+  27, 10, 26, 96, 0, 0, 36, 15, 0, 30,
+  0, 21, 0, 0, 0, 0, 33, 83, 0, 28,
+  14, 34, 42, 0, 16, 32, 0, 0, 39, 0,
+  0, 0, 13, 107, 45, 0, 0, 0, 3, 18,
+  0, 20, 0, 5, 17, 0, 0, 0, 49, 0,
+  46, 44, 22, 4, 0, 0, 0, 0, 20, 0,
+  0, 18, 0, 0, 91, 0, 0, 56, 0, 0,
+  0, 0, 0, 21, 6, 68, 0, 0, 3, 66,
+  22, 26, 0, 44, 1, 12, 25, 0, 0, 0,
+  0, 0, 35, 19, 0, 0, 0, 0, 0, 41,
+  0, 0, 0, 9, 0, 13, 0, 4, 17, 0,
+  0, 0, 11, 90, 12, 0, 37, 0, 34, 0,
+  44, 0, 0, 20, 0, 0, 71, 0, 0, 58,
+  0, 66, 0, 22, 34, 0, 4, 12, 0, 0,
+  14, 0, 0, 0, 11, 67, 48, 0, 47, 25,
+  46, 0, 0, 0, 0, 0, 2, 0, 0, 5,
+  16, 47, 0, 0, 0, 1, 0, 93, 0, 9,
+  0, 23, 27, 12, 0, 4, 70, 6, 57, 62,
+  45, 37, 28, 1, 0, 0, 18, 8, 3, 27,
+  0, 16, 49, 0, 0, 5, 31, 0, 1, 0,
+  0, 6, 0, 41, 0, 0, 0, 25, 35, 4,
+  0, 0, 0, 52, 24, 0, 16, 5, 179, 11,
+  21, 0, 23, 0, 0, 0, 0, 11, 0, 43,
+  0, 24, 1, 8, 2, 65, 31, 0, 0, 0,
+  0, 37, 49, 0, 7, 0, 6, 0, 40, 14,
+  28, 28, 0, 0, 0, 18, 44, 18, 0, 7,
+  0, 39, 35, 0, 13, 18, 0, 0, 20, 0,
+  17, 2, 0, 51, 0, 0, 32, 30, 78, 35,
+  0, 0, 40, 0, 0, 22, 0, 0, 33, 23,
+  14, 18, 8, 0, 15, 74, 44, 16, 21, 36,
+  0, 12, 0, 0, 6, 34, 56, 40, 46, 34,
+  33, 8, 0, 0, 18, 0, 14, 30, 0, 0,
+  70, 0, 4, 150, 0, 0, 0, 0, 0, 1,
+  23, 94, 0, 0, 0, 44, 0, 0, 21, 54,
+  0, 39, 0, 0, 0, 0, 0, 45, 16, 26,
+  0, 7, 0, 0, 0, 50, 0, 0, 0, 11,
+  0, 27, 0, 8, 1, 0, 0, 0, 12, 123,
+  0, 0, 39, 0, 39, 0, 42, 0, 0, 32,
+  0, 0, 97, 0, 0, 31, 0, 64, 0, 26,
+  51, 0, 0, 17, 0, 0, 0, 0, 0, 0,
+  27, 70, 21, 0, 16, 15, 54, 0, 0, 0,
+  24, 0, 2, 0, 0, 0, 0, 60, 12, 0,
+  0, 0, 0, 79, 0, 14, 0, 5, 25, 0,
+  0, 14, 51, 41, 105, 41, 29, 52, 23, 0,
+  0, 0, 17, 23, 0, 13, 0, 43, 48, 0,
+  24, 32, 13, 0, 8, 0, 0, 0, 63, 49,
+  0, 0, 3, 17, 8, 10, 0, 0, 0, 37,
+  41, 35, 6, 0, 0, 48, 48, 0, 0, 14,
+  0, 0, 0, 2, 0, 39, 0, 40, 0, 41,
+  21, 0, 3, 0, 0, 0, 0, 40, 61, 0,
+  0, 0, 14, 6, 2, 35, 0, 6, 0, 21,
+  0, 0, 0, 27, 0, 0, 0, 32, 20, 0,
+  21, 28, 0, 0, 0, 25, 16, 25, 21, 40,
+  63, 0, 39, 18, 50, 13, 0, 0, 32, 28,
+  0, 22, 0, 38, 15, 31, 0, 0, 0, 0,
+  0, 28, 14, 0, 53, 57, 40, 0, 0, 20,
+  46, 0, 33, 38, 62, 29, 61, 16, 47, 0,
+  46, 37, 0, 1, 0, 41, 74, 0, 7, 0,
+  37, 0, 26, 0, 0, 0, 8, 45, 0, 15,
+  14, 0, 13, 0, 0, 0, 20, 55, 23, 53,
+  16, 0, 159, 1, 19, 0, 8, 19, 20, 0,
+  0, 0, 0, 81, 7, 52, 28, 35, 49, 21,
+  9, 3, 0, 0, 0, 24, 50, 0, 0, 0,
+  1, 33, 4, 24, 7, 14, 0, 0, 0, 27,
+  51, 0, 10, 0, 0, 31, 38, 26, 32, 14,
+  0, 0, 0, 32, 48, 29, 26, 13, 31, 0,
+  3, 25, 74, 17, 4, 0, 45, 17, 0, 32,
+  0, 0, 21, 15, 0, 0, 0, 0, 6, 22,
+  50, 8, 38, 32, 47, 0, 0, 0, 1, 0,
+  13, 0, 30, 2, 0, 0, 24, 0, 46, 24,
+  32, 0, 0, 9, 38, 0, 15, 120, 0, 0,
+  0, 0, 0, 3, 58, 72, 0, 0, 0, 18,
+  0, 18, 44, 0, 0, 51, 0, 3, 0, 0,
+  0, 91, 41, 0, 0, 22, 0, 0, 0, 22,
+  0, 25, 0, 45, 0, 53, 1, 0, 0, 32,
+  0, 0, 0, 70, 11, 0, 0, 0, 19, 0,
+  13, 14, 0, 9, 0, 0, 0, 0, 0, 11,
+  0, 0, 0, 58, 10, 0, 0, 20, 0, 0,
+  2, 19, 0, 27, 10, 28, 51, 0, 32, 5,
+  54, 4, 0, 0, 52, 5, 0, 37, 0, 0,
+  0, 30, 0, 0, 0, 0, 3, 4, 0, 16,
+  10, 25, 57, 0, 0, 17, 37, 0, 63, 43,
+  24, 47, 55, 1, 2, 0, 25, 2, 0, 0,
+  0, 70, 65, 0, 63, 0, 15, 0, 1, 0,
+  14, 0, 64, 75, 0, 51, 17, 7, 26, 16,
+  9, 0, 0, 47, 38, 59, 0, 0, 0, 0,
+  53, 0, 0, 37, 12, 0, 0, 0, 0, 53,
+  50, 43, 24, 71, 73, 0, 0, 0, 0, 0,
+  0, 26, 50, 0, 0, 0, 0, 20, 1, 27,
+  24, 0, 0, 63, 0, 2, 29, 0, 0, 0,
+  0, 0, 7, 41, 16, 12, 0, 17, 0, 23,
+  46, 34, 33, 22, 87, 14, 32, 4, 49, 40,
+  0, 20, 24, 31, 0, 54, 0, 35, 3, 41,
+  0, 0, 0, 0, 0, 0, 7, 10, 34, 32,
+  82, 0, 0, 13, 31, 0, 0, 29, 54, 8,
+  7, 0, 55, 0, 75, 11, 2, 0, 0, 0,
+  119, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 103, 0, 9, 0, 6, 10, 5, 9, 50,
+  108, 24, 0, 0, 0, 8, 184, 0, 22, 0,
+  0, 31, 0, 0, 11, 12, 0, 10, 106, 0,
+  19, 21, 57, 33, 0, 2, 16, 0, 0, 65,
+  0, 0, 30, 0, 14, 26, 31, 0, 30, 40,
+  20, 0, 16, 5, 36, 0, 0, 70, 0, 0,
+  38, 61, 0, 0, 13, 0, 0, 0, 25, 10,
+  0, 19, 7, 11, 0, 47, 49, 0, 0, 54,
+  39, 0, 33, 24, 0, 0, 0, 22, 19, 7,
+  17, 0, 40, 27, 0, 5, 0, 0, 50, 3,
+  0, 0, 37, 20, 52, 0, 0, 30, 0, 0,
+  0, 0, 2, 25, 2, 0, 0, 0, 91, 0,
+  0, 56, 0, 0, 0, 0, 0, 21, 6, 68,
+  0, 0, 3, 66, 22, 26, 0, 44, 1, 12,
+  25, 0, 0, 0, 0, 0, 35, 19, 0, 0,
+  0, 0, 0, 41, 0, 0, 0, 9, 0, 13,
+  0, 4, 17, 0, 0, 0, 11, 90, 12, 0,
+  37, 0, 34, 0, 44, 0, 0, 20, 0, 0,
+  71, 0, 0, 58, 0, 66, 0, 22, 34, 0,
+  4, 12, 0, 0, 14, 0, 0, 0, 11, 67,
+  48, 0, 47, 25, 46, 0, 0, 0, 0, 0,
+  2, 0, 0, 5, 16, 47, 0, 0, 0, 1,
+  0, 93, 0, 9, 0, 23, 27, 12, 0, 4,
+  70, 6, 57, 62, 45, 37, 28, 1, 0, 0,
+  18, 8, 3, 27, 0, 16, 49, 0, 0, 5,
+  31, 0, 1, 0, 0, 6, 0, 41, 0, 0,
+  0, 25, 35, 4, 0, 0, 0, 52, 24, 0,
+  16, 5, 179, 11, 21, 0, 23, 0, 0, 0,
+  0, 11, 0, 43, 0, 24, 1, 8, 2, 65,
+  31, 0, 0, 0, 0, 37, 49, 0, 7, 0,
+  6, 0, 40, 14, 28, 28, 0, 0, 0, 18,
+  44, 18, 0, 7, 0, 39, 35, 0, 13, 18,
+  0, 0, 20, 0, 17, 2, 0, 51, 0, 0,
+  32, 30, 78, 35, 0, 0, 40, 0, 0, 22,
+  0, 0, 33, 23, 14, 18, 8, 0, 15, 74,
+  44, 16, 21, 36, 0, 12, 0, 0, 6, 34,
+  56, 40, 46, 34, 33, 8, 0, 0, 18, 0,
+  14, 30, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 43, 48, 0, 24, 32, 13, 0, 8, 0,
+  0, 0, 63, 49, 0, 0, 3, 17, 8, 10,
+  0, 0, 0, 37, 41, 35, 6, 0, 0, 48,
+  48, 0, 0, 14, 0, 0, 0, 2, 0, 39,
+  0, 40, 0, 41, 21, 0, 3, 0, 0, 0,
+  0, 40, 61, 0, 0, 0, 14, 6, 2, 35,
+  0, 6, 0, 21, 0, 0, 0, 27, 0, 0,
+  0, 32, 20, 0, 21, 28, 0, 0, 0, 25,
+  16, 25, 21, 40, 63, 0, 39, 18, 50, 13,
+  0, 0, 32, 28, 0, 22, 0, 38, 15, 31,
+  0, 0, 0, 0, 0, 28, 14, 0, 53, 57,
+  40, 0, 0, 20, 46, 0, 33, 38, 62, 29,
+  61, 16, 47, 0, 46, 37, 0, 1, 0, 41,
+  74, 0, 7, 0, 37, 0, 26, 0, 0, 0,
+  8, 45, 0, 15, 14, 0, 13, 0, 0, 0,
+  20, 55, 23, 53, 16, 0, 159, 1, 19, 0,
+  8, 19, 20, 0, 0, 0, 0, 81, 7, 52,
+  28, 35, 49, 21, 9, 3, 0, 0, 0, 24,
+  50, 0, 0, 0, 1, 33, 4, 24, 7, 14,
+  0, 0, 0, 27, 51, 0, 10, 0, 0, 31,
+  38, 26, 32, 14, 0, 0, 0, 32, 48, 29,
+  26, 13, 31, 0, 3, 25, 74, 17, 4, 0,
+  45, 17, 0, 32, 0, 0, 21, 15, 0, 0,
+  0, 0, 6, 22, 50, 8, 38, 32, 47, 0,
+  0, 0, 1, 0, 13, 0, 30, 2, 0, 0,
+  24, 0, 46, 24, 32, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 70, 65, 0, 63, 0,
+  15, 0, 1, 0, 14, 0, 64, 75, 0, 51,
+  17, 7, 26, 16, 9, 0, 0, 47, 38, 59,
+  0, 0, 0, 0, 53, 0, 0, 37, 12, 0,
+  0, 0, 0, 53, 50, 43, 24, 71, 73, 0,
+  0, 0, 0, 0, 0, 26, 50, 0, 0, 0,
+  0, 20, 1, 27, 24, 0, 0, 63, 0, 2,
+  29, 0, 0, 0, 0, 0, 7, 41, 16, 12,
+  0, 17, 0, 23, 46, 34, 33, 22, 87, 14,
+  32, 4, 49, 40, 0, 20, 24, 31, 0, 54,
+  0, 35, 3, 41, 0, 0, 0, 0, 0, 0,
+  7, 10, 34, 32, 82, 0, 0, 13, 31, 0,
+  0, 29, 54, 8, 7, 0, 55, 0, 75, 11,
+  2, 0, 0, 0, 119, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 103, 0, 9, 0, 6,
+  10, 5, 9, 50, 108, 24, 0, 0, 0, 8,
+  184, 0, 22, 0, 0, 31, 0, 0, 11, 12,
+  0, 10, 106, 0, 19, 21, 57, 33, 0, 2,
+  16, 0, 0, 65, 0, 0, 30, 0, 14, 26,
+  31, 0, 30, 40, 20, 0, 16, 5, 36, 0,
+  0, 70, 0, 0, 38, 61, 0, 0, 13, 0,
+  0, 0, 25, 10, 0, 19, 7, 11, 0, 47,
+  49, 0, 0, 54, 39, 0, 33, 24, 0, 0,
+  0, 22, 19, 7, 17, 0, 40, 27, 0, 5,
+  0, 0, 50, 3, 0, 0, 37, 20, 52, 0,
+  0, 30, 0, 0, 0, 0, 2, 25, 2, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 47, 23, 86, 28,
+  0, 0, 29, 6, 18, 0, 12, 0, 0, 94,
+  0, 55, 94, 25, 14, 29, 7, 39, 13, 18,
+  25, 0, 29, 32, 164, 9, 5, 45, 79, 0,
+  0, 0, 0, 37, 0, 0, 0, 4, 0, 10,
+  7, 71, 53, 0, 0, 0, 0, 40, 22, 15,
+  17, 0, 13, 0, 0, 3, 39, 29, 0, 0,
+  0, 0, 72, 0, 119, 51, 0, 0, 21, 0,
+  24, 0, 65, 11, 0, 23, 14, 0, 42, 0,
+  0, 26, 0, 0, 59, 5, 0, 16, 0, 5,
+  15, 0, 38, 1, 14, 93, 25, 0, 14, 51,
+  54, 47, 12, 0, 25, 0, 4, 10, 0, 41,
+  10, 0, 18, 0, 17, 0, 59, 0, 0, 0,
+  0, 24, 48, 21, 43, 69, 0, 8, 5, 11,
+  0, 0, 0, 0, 0, 0, 16, 73, 0, 0,
+  82, 18, 0, 0, 0, 41, 0, 50, 15, 0,
+  5, 16, 0, 0, 0, 19, 83, 23, 0, 0,
+  0, 9, 0, 0, 0, 6, 0, 0, 9, 74,
+  35, 102, 0, 0, 0, 29, 56, 0, 22, 0,
+  18, 0, 0, 0, 78, 24, 0, 51, 0, 0,
+  97, 0, 107, 49, 0, 0, 4, 13, 45, 0,
+  27, 0, 0, 5, 25, 0, 35, 12, 0, 12,
+  0, 6, 0, 6, 0, 26, 0, 19, 1, 0,
+  34, 0, 12, 95, 20, 81, 35, 21, 44, 44,
+  10, 0, 51, 0, 0, 63, 0, 7, 0, 0,
+  0, 0, 11, 0, 22, 0, 33, 0, 0, 27,
+  27, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  23, 32, 93, 27, 1, 9, 26, 5, 18, 0,
+  0, 0, 0, 103, 0, 30, 67, 4, 0, 16,
+  13, 75, 10, 41, 20, 0, 6, 20, 201, 42,
+  3, 62, 71, 0, 24, 0, 0, 56, 0, 4,
+  5, 32, 0, 22, 9, 88, 48, 0, 0, 0,
+  0, 51, 21, 3, 55, 0, 44, 0, 32, 0,
+  31, 72, 0, 0, 0, 0, 48, 9, 120, 30,
+  0, 10, 58, 0, 32, 0, 53, 0, 0, 37,
+  0, 0, 36, 11, 0, 15, 0, 0, 58, 5,
+  0, 0, 0, 3, 0, 36, 0, 0, 40, 101,
+  17, 0, 0, 52, 55, 89, 20, 0, 9, 0,
+  2, 9, 0, 33, 6, 2, 40, 0, 19, 12,
+  51, 0, 0, 0, 3, 0, 39, 30, 0, 67,
+  0, 11, 0, 33, 2, 0, 0, 0, 0, 17,
+  28, 49, 0, 0, 52, 3, 0, 0, 28, 58,
+  0, 42, 19, 0, 0, 8, 0, 9, 0, 26,
+  82, 21, 0, 0, 0, 27, 0, 8, 0, 40,
+  0, 22, 24, 91, 9, 110, 0, 0, 0, 27,
+  50, 0, 37, 0, 28, 0, 14, 0, 55, 50,
+  0, 43, 0, 0, 49, 11, 81, 0, 4, 0,
+  22, 7, 42, 0, 12, 0, 0, 26, 21, 0,
+  21, 24, 0, 0, 0, 0, 0, 9, 0, 0,
+  0, 9, 0, 20, 0, 0, 47, 83, 0, 52,
+  17, 21, 41, 51, 25, 0, 40, 5, 0, 40,
+  0, 11, 0, 0, 21, 0, 13, 13, 31, 0,
+  15, 0, 35, 1, 15, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 13, 24, 67, 6, 0, 18,
+  27, 22, 0, 0, 0, 0, 0, 97, 0, 0,
+  60, 4, 0, 5, 27, 86, 27, 52, 0, 0,
+  8, 9, 193, 55, 1, 28, 52, 0, 59, 1,
+  0, 58, 0, 17, 14, 39, 0, 14, 26, 83,
+  17, 0, 2, 0, 0, 64, 30, 0, 71, 0,
+  60, 0, 49, 0, 15, 71, 0, 0, 0, 0,
+  7, 6, 77, 33, 0, 22, 82, 11, 31, 27,
+  25, 0, 20, 13, 0, 0, 15, 5, 0, 0,
+  0, 0, 62, 3, 0, 0, 23, 0, 15, 37,
+  0, 0, 49, 67, 15, 0, 0, 37, 46, 75,
+  26, 0, 0, 6, 1, 16, 0, 37, 12, 0,
+  55, 0, 9, 28, 40, 0, 0, 0, 4, 0,
+  26, 26, 0, 60, 0, 15, 0, 5, 36, 23,
+  2, 0, 0, 31, 86, 8, 0, 0, 59, 11,
+  0, 0, 65, 56, 0, 25, 23, 0, 0, 13,
+  0, 13, 0, 11, 92, 0, 18, 0, 0, 32,
+  0, 53, 0, 28, 0, 44, 48, 94, 4, 86,
+  0, 7, 0, 38, 52, 0, 35, 0, 21, 0,
+  24, 0, 13, 27, 0, 40, 0, 11, 10, 0,
+  33, 0, 8, 0, 25, 13, 37, 0, 0, 0,
+  0, 15, 39, 0, 14, 13, 0, 0, 0, 0,
+  0, 24, 0, 0, 0, 13, 0, 47, 0, 0,
+  62, 50, 3, 0, 0, 13, 20, 1, 44, 0,
+  24, 28, 0, 29, 0, 15, 0, 0, 25, 0,
+  11, 10, 47, 0, 42, 0, 79, 0, 14, 0,
+  47, 23, 86, 28, 0, 0, 29, 6, 18, 0,
+  12, 0, 0, 94, 0, 55, 94, 25, 14, 29,
+  7, 39, 13, 18, 25, 0, 29, 32, 164, 9,
+  5, 45, 79, 0, 0, 0, 0, 37, 0, 0,
+  0, 4, 0, 10, 7, 71, 53, 0, 0, 0,
+  0, 40, 22, 15, 17, 0, 13, 0, 0, 3,
+  39, 29, 0, 0, 0, 0, 72, 0, 119, 51,
+  0, 0, 21, 0, 24, 0, 65, 11, 0, 23,
+  14, 0, 42, 0, 0, 26, 0, 0, 59, 5,
+  0, 16, 0, 5, 15, 0, 38, 1, 14, 93,
+  25, 0, 14, 51, 54, 47, 12, 0, 25, 0,
+  4, 10, 0, 41, 10, 0, 18, 0, 17, 0,
+  59, 0, 0, 0, 0, 24, 48, 21, 43, 69,
+  0, 8, 5, 11, 0, 0, 0, 0, 0, 0,
+  16, 73, 0, 0, 82, 18, 0, 0, 0, 41,
+  0, 50, 15, 0, 5, 16, 0, 0, 0, 19,
+  83, 23, 0, 0, 0, 9, 0, 0, 0, 6,
+  0, 0, 9, 74, 35, 102, 0, 0, 0, 29,
+  56, 0, 22, 0, 18, 0, 0, 0, 78, 24,
+  0, 51, 0, 0, 97, 0, 107, 49, 0, 0,
+  4, 13, 45, 0, 27, 0, 0, 5, 25, 0,
+  35, 12, 0, 12, 0, 6, 0, 6, 0, 26,
+  0, 19, 1, 0, 34, 0, 12, 95, 20, 81,
+  35, 21, 44, 44, 10, 0, 51, 0, 0, 63,
+  0, 7, 0, 0, 0, 0, 11, 0, 22, 0,
+  33, 0, 0, 27, 27, 0, 0, 39, 39, 29,
+  0, 48, 7, 15, 23, 0, 0, 11, 81, 0,
+  0, 23, 58, 7, 0, 0, 0, 63, 0, 21,
+  41, 0, 0, 12, 0, 0, 0, 32, 67, 3,
+  1, 0, 0, 13, 0, 47, 0, 18, 41, 13,
+  22, 69, 25, 53, 0, 12, 0, 37, 21, 7,
+  22, 0, 22, 0, 0, 0, 16, 31, 0, 29,
+  0, 0, 7, 0, 37, 0, 18, 0, 9, 21,
+  4, 0, 5, 11, 0, 39, 27, 0, 62, 62,
+  0, 0, 0, 0, 0, 18, 1, 0, 0, 19,
+  0, 19, 32, 0, 0, 78, 11, 0, 0, 10,
+  15, 0, 33, 0, 0, 0, 0, 8, 0, 0,
+  0, 0, 7, 0, 0, 0, 0, 0, 38, 0,
+  39, 0, 9, 0, 23, 32, 93, 27, 1, 9,
+  26, 5, 18, 0, 0, 0, 0, 103, 0, 30,
+  67, 4, 0, 16, 13, 75, 10, 41, 20, 0,
+  6, 20, 201, 42, 3, 62, 71, 0, 24, 0,
+  0, 56, 0, 4, 5, 32, 0, 22, 9, 88,
+  48, 0, 0, 0, 0, 51, 21, 3, 55, 0,
+  44, 0, 32, 0, 31, 72, 0, 0, 0, 0,
+  48, 9, 120, 30, 0, 10, 58, 0, 32, 0,
+  53, 0, 0, 37, 0, 0, 36, 11, 0, 15,
+  0, 0, 58, 5, 0, 0, 0, 3, 0, 36,
+  0, 0, 40, 101, 17, 0, 0, 52, 55, 89,
+  20, 0, 9, 0, 2, 9, 0, 33, 6, 2,
+  40, 0, 19, 12, 51, 0, 0, 0, 3, 0,
+  39, 30, 0, 67, 0, 11, 0, 33, 2, 0,
+  0, 0, 0, 17, 28, 49, 0, 0, 52, 3,
+  0, 0, 28, 58, 0, 42, 19, 0, 0, 8,
+  0, 9, 0, 26, 82, 21, 0, 0, 0, 27,
+  0, 8, 0, 40, 0, 22, 24, 91, 9, 110,
+  0, 0, 0, 27, 50, 0, 37, 0, 28, 0,
+  14, 0, 55, 50, 0, 43, 0, 0, 49, 11,
+  81, 0, 4, 0, 22, 7, 42, 0, 12, 0,
+  0, 26, 21, 0, 21, 24, 0, 0, 0, 0,
+  0, 9, 0, 0, 0, 9, 0, 20, 0, 0,
+  47, 83, 0, 52, 17, 21, 41, 51, 25, 0,
+  40, 5, 0, 40, 0, 11, 0, 0, 21, 0,
+  13, 13, 31, 0, 15, 0, 35, 1, 15, 0,
+  0, 27, 36, 37, 0, 42, 17, 9, 15, 0,
+  0, 22, 97, 0, 7, 27, 55, 8, 0, 0,
+  0, 69, 0, 8, 46, 0, 0, 20, 0, 2,
+  0, 37, 78, 0, 3, 0, 0, 24, 0, 73,
+  0, 34, 30, 29, 29, 57, 25, 42, 0, 28,
+  0, 43, 34, 9, 17, 0, 10, 0, 0, 0,
+  6, 14, 0, 16, 0, 0, 0, 0, 28, 0,
+  23, 6, 0, 10, 7, 0, 0, 23, 0, 35,
+  38, 0, 52, 56, 0, 0, 11, 0, 0, 18,
+  0, 0, 0, 4, 0, 16, 29, 0, 0, 66,
+  6, 0, 0, 10, 18, 0, 38, 0, 0, 6,
+  0, 7, 0, 1, 0, 0, 17, 0, 0, 0,
+  5, 0, 43, 0, 63, 0, 11, 0, 13, 24,
+  67, 6, 0, 18, 27, 22, 0, 0, 0, 0,
+  0, 97, 0, 0, 60, 4, 0, 5, 27, 86,
+  27, 52, 0, 0, 8, 9, 193, 55, 1, 28,
+  52, 0, 59, 1, 0, 58, 0, 17, 14, 39,
+  0, 14, 26, 83, 17, 0, 2, 0, 0, 64,
+  30, 0, 71, 0, 60, 0, 49, 0, 15, 71,
+  0, 0, 0, 0, 7, 6, 77, 33, 0, 22,
+  82, 11, 31, 27, 25, 0, 20, 13, 0, 0,
+  15, 5, 0, 0, 0, 0, 62, 3, 0, 0,
+  23, 0, 15, 37, 0, 0, 49, 67, 15, 0,
+  0, 37, 46, 75, 26, 0, 0, 6, 1, 16,
+  0, 37, 12, 0, 55, 0, 9, 28, 40, 0,
+  0, 0, 4, 0, 26, 26, 0, 60, 0, 15,
+  0, 5, 36, 23, 2, 0, 0, 31, 86, 8,
+  0, 0, 59, 11, 0, 0, 65, 56, 0, 25,
+  23, 0, 0, 13, 0, 13, 0, 11, 92, 0,
+  18, 0, 0, 32, 0, 53, 0, 28, 0, 44,
+  48, 94, 4, 86, 0, 7, 0, 38, 52, 0,
+  35, 0, 21, 0, 24, 0, 13, 27, 0, 40,
+  0, 11, 10, 0, 33, 0, 8, 0, 25, 13,
+  37, 0, 0, 0, 0, 15, 39, 0, 14, 13,
+  0, 0, 0, 0, 0, 24, 0, 0, 0, 13,
+  0, 47, 0, 0, 62, 50, 3, 0, 0, 13,
+  20, 1, 44, 0, 24, 28, 0, 29, 0, 15,
+  0, 0, 25, 0, 11, 10, 47, 0, 42, 0,
+  79, 0, 14, 0, 3, 28, 40, 34, 0, 19,
+  25, 3, 20, 0, 0, 31, 114, 0, 21, 37,
+  61, 3, 0, 0, 0, 74, 0, 5, 57, 0,
+  0, 30, 0, 1, 0, 41, 79, 0, 10, 0,
+  0, 27, 0, 80, 0, 41, 32, 32, 31, 55,
+  32, 23, 0, 44, 0, 50, 31, 17, 17, 0,
+  7, 0, 0, 0, 12, 0, 0, 36, 0, 0,
+  4, 0, 28, 0, 17, 10, 0, 3, 3, 0,
+  15, 36, 0, 33, 36, 0, 51, 45, 0, 0,
+  5, 0, 0, 36, 0, 0, 0, 5, 0, 25,
+  33, 0, 3, 68, 5, 0, 5, 7, 24, 0,
+  28, 0, 2, 10, 6, 14, 0, 1, 0, 0,
+  2, 0, 6, 0, 15, 4, 59, 0, 74, 0,
+  21, 0, 43, 69, 0, 8, 5, 11, 0, 0,
+  0, 0, 0, 0, 16, 73, 0, 0, 82, 18,
+  0, 0, 0, 41, 0, 50, 15, 0, 5, 16,
+  0, 0, 0, 19, 83, 23, 0, 0, 0, 9,
+  0, 0, 0, 6, 0, 0, 9, 74, 35, 102,
+  0, 0, 0, 29, 56, 0, 22, 0, 18, 0,
+  0, 0, 78, 24, 0, 51, 0, 0, 97, 0,
+  107, 49, 0, 0, 4, 13, 45, 0, 27, 0,
+  0, 5, 25, 0, 35, 12, 0, 12, 0, 6,
+  0, 6, 0, 26, 0, 19, 1, 0, 34, 0,
+  12, 95, 20, 81, 35, 21, 44, 44, 10, 0,
+  51, 0, 0, 63, 0, 7, 0, 0, 0, 0,
+  11, 0, 22, 0, 33, 0, 0, 27, 27, 0,
+  0, 39, 39, 29, 0, 48, 7, 15, 23, 0,
+  0, 11, 81, 0, 0, 23, 58, 7, 0, 0,
+  0, 63, 0, 21, 41, 0, 0, 12, 0, 0,
+  0, 32, 67, 3, 1, 0, 0, 13, 0, 47,
+  0, 18, 41, 13, 22, 69, 25, 53, 0, 12,
+  0, 37, 21, 7, 22, 0, 22, 0, 0, 0,
+  16, 31, 0, 29, 0, 0, 7, 0, 37, 0,
+  18, 0, 9, 21, 4, 0, 5, 11, 0, 39,
+  27, 0, 62, 62, 0, 0, 0, 0, 0, 18,
+  1, 0, 0, 19, 0, 19, 32, 0, 0, 78,
+  11, 0, 0, 10, 15, 0, 33, 0, 0, 0,
+  0, 8, 0, 0, 0, 0, 7, 0, 0, 0,
+  0, 0, 38, 0, 39, 0, 9, 0, 0, 0,
+  0, 12, 0, 128, 4, 0, 24, 0, 0, 24,
+  44, 0, 0, 3, 15, 0, 0, 0, 17, 87,
+  14, 19, 11, 0, 0, 0, 0, 0, 0, 22,
+  19, 26, 0, 6, 0, 37, 0, 56, 0, 21,
+  0, 56, 0, 77, 54, 47, 0, 0, 0, 41,
+  15, 0, 2, 0, 67, 0, 29, 0, 3, 66,
+  0, 12, 54, 5, 0, 16, 73, 0, 77, 17,
+  14, 1, 0, 19, 20, 20, 0, 39, 27, 0,
+  45, 41, 10, 0, 5, 0, 0, 0, 0, 17,
+  0, 0, 0, 33, 0, 0, 7, 75, 14, 0,
+  0, 3, 5, 0, 19, 0, 0, 0, 0, 0,
+  0, 14, 0, 0, 93, 0, 37, 0, 0, 0,
+  0, 0, 36, 0, 0, 0, 0, 67, 0, 11,
+  0, 33, 2, 0, 0, 0, 0, 17, 28, 49,
+  0, 0, 52, 3, 0, 0, 28, 58, 0, 42,
+  19, 0, 0, 8, 0, 9, 0, 26, 82, 21,
+  0, 0, 0, 27, 0, 8, 0, 40, 0, 22,
+  24, 91, 9, 110, 0, 0, 0, 27, 50, 0,
+  37, 0, 28, 0, 14, 0, 55, 50, 0, 43,
+  0, 0, 49, 11, 81, 0, 4, 0, 22, 7,
+  42, 0, 12, 0, 0, 26, 21, 0, 21, 24,
+  0, 0, 0, 0, 0, 9, 0, 0, 0, 9,
+  0, 20, 0, 0, 47, 83, 0, 52, 17, 21,
+  41, 51, 25, 0, 40, 5, 0, 40, 0, 11,
+  0, 0, 21, 0, 13, 13, 31, 0, 15, 0,
+  35, 1, 15, 0, 0, 27, 36, 37, 0, 42,
+  17, 9, 15, 0, 0, 22, 97, 0, 7, 27,
+  55, 8, 0, 0, 0, 69, 0, 8, 46, 0,
+  0, 20, 0, 2, 0, 37, 78, 0, 3, 0,
+  0, 24, 0, 73, 0, 34, 30, 29, 29, 57,
+  25, 42, 0, 28, 0, 43, 34, 9, 17, 0,
+  10, 0, 0, 0, 6, 14, 0, 16, 0, 0,
+  0, 0, 28, 0, 23, 6, 0, 10, 7, 0,
+  0, 23, 0, 35, 38, 0, 52, 56, 0, 0,
+  11, 0, 0, 18, 0, 0, 0, 4, 0, 16,
+  29, 0, 0, 66, 6, 0, 0, 10, 18, 0,
+  38, 0, 0, 6, 0, 7, 0, 1, 0, 0,
+  17, 0, 0, 0, 5, 0, 43, 0, 63, 0,
+  11, 0, 0, 0, 0, 15, 0, 142, 5, 0,
+  3, 0, 0, 27, 43, 0, 0, 0, 6, 0,
+  0, 0, 37, 88, 23, 15, 8, 0, 0, 0,
+  0, 13, 0, 22, 26, 24, 0, 2, 0, 36,
+  0, 50, 0, 35, 0, 56, 1, 71, 43, 43,
+  0, 0, 0, 38, 8, 0, 4, 0, 67, 0,
+  33, 0, 0, 57, 0, 0, 64, 0, 0, 26,
+  62, 0, 74, 26, 27, 3, 4, 32, 9, 25,
+  0, 31, 35, 0, 37, 52, 8, 0, 19, 0,
+  0, 0, 0, 11, 7, 0, 1, 26, 0, 0,
+  10, 66, 18, 0, 0, 7, 8, 0, 31, 0,
+  0, 0, 0, 0, 0, 15, 0, 0, 111, 2,
+  35, 3, 0, 0, 0, 0, 41, 0, 0, 0,
+  0, 60, 0, 15, 0, 5, 36, 23, 2, 0,
+  0, 31, 86, 8, 0, 0, 59, 11, 0, 0,
+  65, 56, 0, 25, 23, 0, 0, 13, 0, 13,
+  0, 11, 92, 0, 18, 0, 0, 32, 0, 53,
+  0, 28, 0, 44, 48, 94, 4, 86, 0, 7,
+  0, 38, 52, 0, 35, 0, 21, 0, 24, 0,
+  13, 27, 0, 40, 0, 11, 10, 0, 33, 0,
+  8, 0, 25, 13, 37, 0, 0, 0, 0, 15,
+  39, 0, 14, 13, 0, 0, 0, 0, 0, 24,
+  0, 0, 0, 13, 0, 47, 0, 0, 62, 50,
+  3, 0, 0, 13, 20, 1, 44, 0, 24, 28,
+  0, 29, 0, 15, 0, 0, 25, 0, 11, 10,
+  47, 0, 42, 0, 79, 0, 14, 0, 3, 28,
+  40, 34, 0, 19, 25, 3, 20, 0, 0, 31,
+  114, 0, 21, 37, 61, 3, 0, 0, 0, 74,
+  0, 5, 57, 0, 0, 30, 0, 1, 0, 41,
+  79, 0, 10, 0, 0, 27, 0, 80, 0, 41,
+  32, 32, 31, 55, 32, 23, 0, 44, 0, 50,
+  31, 17, 17, 0, 7, 0, 0, 0, 12, 0,
+  0, 36, 0, 0, 4, 0, 28, 0, 17, 10,
+  0, 3, 3, 0, 15, 36, 0, 33, 36, 0,
+  51, 45, 0, 0, 5, 0, 0, 36, 0, 0,
+  0, 5, 0, 25, 33, 0, 3, 68, 5, 0,
+  5, 7, 24, 0, 28, 0, 2, 10, 6, 14,
+  0, 1, 0, 0, 2, 0, 6, 0, 15, 4,
+  59, 0, 74, 0, 21, 0, 0, 0, 0, 16,
+  0, 145, 3, 0, 12, 0, 0, 27, 50, 0,
+  0, 22, 2, 0, 1, 0, 35, 91, 18, 9,
+  3, 0, 0, 0, 0, 4, 0, 27, 23, 43,
+  0, 0, 0, 30, 0, 60, 0, 29, 0, 69,
+  6, 72, 26, 52, 0, 0, 0, 48, 12, 0,
+  0, 0, 56, 0, 35, 0, 2, 55, 0, 0,
+  72, 0, 0, 20, 53, 0, 83, 22, 17, 0,
+  0, 33, 2, 22, 0, 37, 41, 0, 32, 49,
+  7, 0, 27, 0, 0, 0, 0, 13, 1, 0,
+  15, 38, 0, 0, 2, 68, 27, 0, 0, 7,
+  17, 0, 22, 0, 0, 0, 0, 0, 0, 29,
+  0, 0, 104, 4, 40, 7, 0, 0, 0, 0,
+  54, 0, 3, 0, 0, 39, 39, 29, 0, 48,
+  7, 15, 23, 0, 0, 11, 81, 0, 0, 23,
+  58, 7, 0, 0, 0, 63, 0, 21, 41, 0,
+  0, 12, 0, 0, 0, 32, 67, 3, 1, 0,
+  0, 13, 0, 47, 0, 18, 41, 13, 22, 69,
+  25, 53, 0, 12, 0, 37, 21, 7, 22, 0,
+  22, 0, 0, 0, 16, 31, 0, 29, 0, 0,
+  7, 0, 37, 0, 18, 0, 9, 21, 4, 0,
+  5, 11, 0, 39, 27, 0, 62, 62, 0, 0,
+  0, 0, 0, 18, 1, 0, 0, 19, 0, 19,
+  32, 0, 0, 78, 11, 0, 0, 10, 15, 0,
+  33, 0, 0, 0, 0, 8, 0, 0, 0, 0,
+  7, 0, 0, 0, 0, 0, 38, 0, 39, 0,
+  9, 0, 0, 0, 0, 12, 0, 128, 4, 0,
+  24, 0, 0, 24, 44, 0, 0, 3, 15, 0,
+  0, 0, 17, 87, 14, 19, 11, 0, 0, 0,
+  0, 0, 0, 22, 19, 26, 0, 6, 0, 37,
+  0, 56, 0, 21, 0, 56, 0, 77, 54, 47,
+  0, 0, 0, 41, 15, 0, 2, 0, 67, 0,
+  29, 0, 3, 66, 0, 12, 54, 5, 0, 16,
+  73, 0, 77, 17, 14, 1, 0, 19, 20, 20,
+  0, 39, 27, 0, 45, 41, 10, 0, 5, 0,
+  0, 0, 0, 17, 0, 0, 0, 33, 0, 0,
+  7, 75, 14, 0, 0, 3, 5, 0, 19, 0,
+  0, 0, 0, 0, 0, 14, 0, 0, 93, 0,
+  37, 0, 0, 0, 0, 0, 36, 0, 0, 0,
+  0, 0, 0, 0, 0, 48, 47, 0, 22, 0,
+  0, 0, 38, 0, 10, 49, 31, 17, 0, 15,
+  62, 0, 0, 40, 0, 20, 12, 0, 0, 26,
+  0, 0, 64, 55, 8, 0, 0, 16, 0, 41,
+  0, 28, 0, 56, 0, 45, 21, 45, 0, 12,
+  2, 10, 93, 9, 0, 9, 48, 0, 0, 35,
+  16, 4, 0, 1, 0, 0, 17, 7, 42, 0,
+  2, 3, 0, 21, 13, 42, 3, 0, 0, 26,
+  69, 0, 18, 2, 18, 0, 12, 0, 9, 8,
+  0, 31, 0, 8, 5, 29, 0, 0, 36, 54,
+  18, 0, 0, 0, 1, 0, 24, 4, 0, 31,
+  0, 1, 0, 19, 0, 0, 51, 3, 32, 0,
+  21, 0, 83, 0, 35, 0, 4, 0, 0, 27,
+  36, 37, 0, 42, 17, 9, 15, 0, 0, 22,
+  97, 0, 7, 27, 55, 8, 0, 0, 0, 69,
+  0, 8, 46, 0, 0, 20, 0, 2, 0, 37,
+  78, 0, 3, 0, 0, 24, 0, 73, 0, 34,
+  30, 29, 29, 57, 25, 42, 0, 28, 0, 43,
+  34, 9, 17, 0, 10, 0, 0, 0, 6, 14,
+  0, 16, 0, 0, 0, 0, 28, 0, 23, 6,
+  0, 10, 7, 0, 0, 23, 0, 35, 38, 0,
+  52, 56, 0, 0, 11, 0, 0, 18, 0, 0,
+  0, 4, 0, 16, 29, 0, 0, 66, 6, 0,
+  0, 10, 18, 0, 38, 0, 0, 6, 0, 7,
+  0, 1, 0, 0, 17, 0, 0, 0, 5, 0,
+  43, 0, 63, 0, 11, 0, 0, 0, 0, 15,
+  0, 142, 5, 0, 3, 0, 0, 27, 43, 0,
+  0, 0, 6, 0, 0, 0, 37, 88, 23, 15,
+  8, 0, 0, 0, 0, 13, 0, 22, 26, 24,
+  0, 2, 0, 36, 0, 50, 0, 35, 0, 56,
+  1, 71, 43, 43, 0, 0, 0, 38, 8, 0,
+  4, 0, 67, 0, 33, 0, 0, 57, 0, 0,
+  64, 0, 0, 26, 62, 0, 74, 26, 27, 3,
+  4, 32, 9, 25, 0, 31, 35, 0, 37, 52,
+  8, 0, 19, 0, 0, 0, 0, 11, 7, 0,
+  1, 26, 0, 0, 10, 66, 18, 0, 0, 7,
+  8, 0, 31, 0, 0, 0, 0, 0, 0, 15,
+  0, 0, 111, 2, 35, 3, 0, 0, 0, 0,
+  41, 0, 0, 0, 0, 0, 0, 0, 0, 51,
+  48, 0, 17, 0, 0, 1, 56, 0, 12, 28,
+  33, 20, 5, 18, 77, 0, 0, 29, 0, 42,
+  17, 0, 0, 38, 0, 0, 71, 57, 0, 0,
+  0, 12, 0, 39, 0, 43, 0, 51, 0, 34,
+  20, 45, 0, 31, 15, 0, 71, 13, 0, 6,
+  44, 0, 0, 54, 15, 0, 0, 0, 0, 0,
+  23, 28, 33, 0, 0, 13, 0, 22, 15, 54,
+  0, 0, 0, 29, 69, 6, 16, 0, 25, 0,
+  11, 13, 3, 2, 0, 26, 5, 14, 0, 26,
+  0, 0, 43, 47, 11, 6, 0, 0, 0, 0,
+  43, 0, 0, 46, 1, 0, 0, 11, 0, 0,
+  48, 15, 46, 0, 23, 0, 104, 0, 47, 0,
+  0, 0, 3, 28, 40, 34, 0, 19, 25, 3,
+  20, 0, 0, 31, 114, 0, 21, 37, 61, 3,
+  0, 0, 0, 74, 0, 5, 57, 0, 0, 30,
+  0, 1, 0, 41, 79, 0, 10, 0, 0, 27,
+  0, 80, 0, 41, 32, 32, 31, 55, 32, 23,
+  0, 44, 0, 50, 31, 17, 17, 0, 7, 0,
+  0, 0, 12, 0, 0, 36, 0, 0, 4, 0,
+  28, 0, 17, 10, 0, 3, 3, 0, 15, 36,
+  0, 33, 36, 0, 51, 45, 0, 0, 5, 0,
+  0, 36, 0, 0, 0, 5, 0, 25, 33, 0,
+  3, 68, 5, 0, 5, 7, 24, 0, 28, 0,
+  2, 10, 6, 14, 0, 1, 0, 0, 2, 0,
+  6, 0, 15, 4, 59, 0, 74, 0, 21, 0,
+  0, 0, 0, 16, 0, 145, 3, 0, 12, 0,
+  0, 27, 50, 0, 0, 22, 2, 0, 1, 0,
+  35, 91, 18, 9, 3, 0, 0, 0, 0, 4,
+  0, 27, 23, 43, 0, 0, 0, 30, 0, 60,
+  0, 29, 0, 69, 6, 72, 26, 52, 0, 0,
+  0, 48, 12, 0, 0, 0, 56, 0, 35, 0,
+  2, 55, 0, 0, 72, 0, 0, 20, 53, 0,
+  83, 22, 17, 0, 0, 33, 2, 22, 0, 37,
+  41, 0, 32, 49, 7, 0, 27, 0, 0, 0,
+  0, 13, 1, 0, 15, 38, 0, 0, 2, 68,
+  27, 0, 0, 7, 17, 0, 22, 0, 0, 0,
+  0, 0, 0, 29, 0, 0, 104, 4, 40, 7,
+  0, 0, 0, 0, 54, 0, 3, 0, 0, 0,
+  0, 0, 0, 45, 41, 0, 20, 0, 0, 0,
+  75, 11, 19, 55, 39, 21, 25, 2, 84, 0,
+  0, 27, 13, 52, 3, 2, 0, 52, 0, 0,
+  56, 63, 0, 0, 0, 0, 0, 59, 0, 43,
+  0, 45, 7, 20, 17, 36, 0, 46, 0, 0,
+  66, 22, 0, 0, 25, 0, 0, 76, 20, 0,
+  0, 2, 0, 0, 13, 21, 31, 0, 0, 26,
+  0, 14, 8, 55, 0, 0, 0, 54, 58, 17,
+  20, 5, 37, 0, 12, 14, 8, 14, 4, 15,
+  7, 17, 1, 41, 0, 0, 39, 55, 6, 0,
+  4, 0, 0, 0, 35, 0, 0, 42, 13, 0,
+  0, 5, 0, 0, 43, 15, 52, 0, 18, 3,
+  121, 0, 68, 0, 9, 0, 0, 0, 0, 12,
+  0, 128, 4, 0, 24, 0, 0, 24, 44, 0,
+  0, 3, 15, 0, 0, 0, 17, 87, 14, 19,
+  11, 0, 0, 0, 0, 0, 0, 22, 19, 26,
+  0, 6, 0, 37, 0, 56, 0, 21, 0, 56,
+  0, 77, 54, 47, 0, 0, 0, 41, 15, 0,
+  2, 0, 67, 0, 29, 0, 3, 66, 0, 12,
+  54, 5, 0, 16, 73, 0, 77, 17, 14, 1,
+  0, 19, 20, 20, 0, 39, 27, 0, 45, 41,
+  10, 0, 5, 0, 0, 0, 0, 17, 0, 0,
+  0, 33, 0, 0, 7, 75, 14, 0, 0, 3,
+  5, 0, 19, 0, 0, 0, 0, 0, 0, 14,
+  0, 0, 93, 0, 37, 0, 0, 0, 0, 0,
+  36, 0, 0, 0, 0, 0, 0, 0, 0, 48,
+  47, 0, 22, 0, 0, 0, 38, 0, 10, 49,
+  31, 17, 0, 15, 62, 0, 0, 40, 0, 20,
+  12, 0, 0, 26, 0, 0, 64, 55, 8, 0,
+  0, 16, 0, 41, 0, 28, 0, 56, 0, 45,
+  21, 45, 0, 12, 2, 10, 93, 9, 0, 9,
+  48, 0, 0, 35, 16, 4, 0, 1, 0, 0,
+  17, 7, 42, 0, 2, 3, 0, 21, 13, 42,
+  3, 0, 0, 26, 69, 0, 18, 2, 18, 0,
+  12, 0, 9, 8, 0, 31, 0, 8, 5, 29,
+  0, 0, 36, 54, 18, 0, 0, 0, 1, 0,
+  24, 4, 0, 31, 0, 1, 0, 19, 0, 0,
+  51, 3, 32, 0, 21, 0, 83, 0, 35, 0,
+  4, 0, 0, 9, 0, 0, 15, 0, 57, 0,
+  37, 0, 0, 0, 30, 12, 51, 40, 45, 47,
+  0, 28, 101, 0, 0, 27, 0, 9, 25, 8,
+  0, 23, 0, 0, 52, 4, 22, 0, 0, 12,
+  0, 35, 0, 7, 0, 70, 5, 54, 4, 16,
+  0, 0, 13, 8, 68, 27, 0, 0, 28, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 23, 1,
+  27, 0, 0, 0, 0, 10, 48, 0, 7, 9,
+  0, 11, 57, 13, 9, 0, 13, 0, 0, 0,
+  22, 29, 9, 0, 0, 15, 0, 34, 0, 0,
+  59, 37, 0, 0, 0, 0, 12, 0, 17, 14,
+  11, 27, 0, 0, 0, 5, 0, 0, 24, 0,
+  14, 0, 27, 0, 77, 0, 21, 0, 13, 0,
+  0, 0, 0, 15, 0, 142, 5, 0, 3, 0,
+  0, 27, 43, 0, 0, 0, 6, 0, 0, 0,
+  37, 88, 23, 15, 8, 0, 0, 0, 0, 13,
+  0, 22, 26, 24, 0, 2, 0, 36, 0, 50,
+  0, 35, 0, 56, 1, 71, 43, 43, 0, 0,
+  0, 38, 8, 0, 4, 0, 67, 0, 33, 0,
+  0, 57, 0, 0, 64, 0, 0, 26, 62, 0,
+  74, 26, 27, 3, 4, 32, 9, 25, 0, 31,
+  35, 0, 37, 52, 8, 0, 19, 0, 0, 0,
+  0, 11, 7, 0, 1, 26, 0, 0, 10, 66,
+  18, 0, 0, 7, 8, 0, 31, 0, 0, 0,
+  0, 0, 0, 15, 0, 0, 111, 2, 35, 3,
+  0, 0, 0, 0, 41, 0, 0, 0, 0, 0,
+  0, 0, 0, 51, 48, 0, 17, 0, 0, 1,
+  56, 0, 12, 28, 33, 20, 5, 18, 77, 0,
+  0, 29, 0, 42, 17, 0, 0, 38, 0, 0,
+  71, 57, 0, 0, 0, 12, 0, 39, 0, 43,
+  0, 51, 0, 34, 20, 45, 0, 31, 15, 0,
+  71, 13, 0, 6, 44, 0, 0, 54, 15, 0,
+  0, 0, 0, 0, 23, 28, 33, 0, 0, 13,
+  0, 22, 15, 54, 0, 0, 0, 29, 69, 6,
+  16, 0, 25, 0, 11, 13, 3, 2, 0, 26,
+  5, 14, 0, 26, 0, 0, 43, 47, 11, 6,
+  0, 0, 0, 0, 43, 0, 0, 46, 1, 0,
+  0, 11, 0, 0, 48, 15, 46, 0, 23, 0,
+  104, 0, 47, 0, 0, 0, 0, 29, 0, 0,
+  20, 0, 45, 0, 38, 0, 0, 2, 26, 28,
+  73, 29, 52, 53, 0, 24, 91, 0, 0, 24,
+  16, 39, 26, 0, 0, 20, 0, 0, 40, 12,
+  3, 0, 0, 8, 0, 47, 0, 9, 0, 58,
+  0, 33, 12, 19, 0, 0, 17, 3, 66, 44,
+  0, 0, 7, 0, 0, 3, 7, 0, 0, 0,
+  0, 0, 42, 7, 32, 0, 0, 0, 0, 10,
+  51, 0, 4, 0, 0, 8, 61, 18, 25, 0,
+  32, 0, 8, 4, 12, 12, 2, 0, 0, 26,
+  0, 31, 0, 0, 56, 29, 0, 2, 0, 0,
+  0, 0, 30, 0, 7, 37, 0, 0, 0, 21,
+  0, 0, 7, 6, 14, 0, 16, 0, 90, 0,
+  25, 0, 12, 0, 0, 0, 0, 16, 0, 145,
+  3, 0, 12, 0, 0, 27, 50, 0, 0, 22,
+  2, 0, 1, 0, 35, 91, 18, 9, 3, 0,
+  0, 0, 0, 4, 0, 27, 23, 43, 0, 0,
+  0, 30, 0, 60, 0, 29, 0, 69, 6, 72,
+  26, 52, 0, 0, 0, 48, 12, 0, 0, 0,
+  56, 0, 35, 0, 2, 55, 0, 0, 72, 0,
+  0, 20, 53, 0, 83, 22, 17, 0, 0, 33,
+  2, 22, 0, 37, 41, 0, 32, 49, 7, 0,
+  27, 0, 0, 0, 0, 13, 1, 0, 15, 38,
+  0, 0, 2, 68, 27, 0, 0, 7, 17, 0,
+  22, 0, 0, 0, 0, 0, 0, 29, 0, 0,
+  104, 4, 40, 7, 0, 0, 0, 0, 54, 0,
+  3, 0, 0, 0, 0, 0, 0, 45, 41, 0,
+  20, 0, 0, 0, 75, 11, 19, 55, 39, 21,
+  25, 2, 84, 0, 0, 27, 13, 52, 3, 2,
+  0, 52, 0, 0, 56, 63, 0, 0, 0, 0,
+  0, 59, 0, 43, 0, 45, 7, 20, 17, 36,
+  0, 46, 0, 0, 66, 22, 0, 0, 25, 0,
+  0, 76, 20, 0, 0, 2, 0, 0, 13, 21,
+  31, 0, 0, 26, 0, 14, 8, 55, 0, 0,
+  0, 54, 58, 17, 20, 5, 37, 0, 12, 14,
+  8, 14, 4, 15, 7, 17, 1, 41, 0, 0,
+  39, 55, 6, 0, 4, 0, 0, 0, 35, 0,
+  0, 42, 13, 0, 0, 5, 0, 0, 43, 15,
+  52, 0, 18, 3, 121, 0, 68, 0, 9, 0,
+  0, 49, 1, 0, 30, 0, 15, 0, 64, 0,
+  0, 7, 46, 41, 52, 60, 59, 47, 14, 4,
+  85, 0, 0, 29, 21, 32, 22, 9, 0, 19,
+  0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+  0, 0, 0, 54, 0, 32, 4, 0, 0, 16,
+  7, 12, 54, 37, 0, 0, 0, 0, 0, 0,
+  1, 0, 0, 0, 0, 0, 49, 0, 30, 0,
+  0, 0, 5, 29, 27, 0, 0, 9, 0, 21,
+  35, 23, 45, 0, 23, 22, 4, 26, 21, 30,
+  26, 0, 0, 24, 0, 19, 0, 0, 46, 43,
+  11, 0, 0, 0, 0, 0, 30, 1, 0, 44,
+  0, 0, 0, 16, 0, 0, 1, 3, 6, 0,
+  0, 0, 95, 0, 52, 0, 20, 0, 0, 0,
+  0, 0, 0, 48, 47, 0, 22, 0, 0, 0,
+  38, 0, 10, 49, 31, 17, 0, 15, 62, 0,
+  0, 40, 0, 20, 12, 0, 0, 26, 0, 0,
+  64, 55, 8, 0, 0, 16, 0, 41, 0, 28,
+  0, 56, 0, 45, 21, 45, 0, 12, 2, 10,
+  93, 9, 0, 9, 48, 0, 0, 35, 16, 4,
+  0, 1, 0, 0, 17, 7, 42, 0, 2, 3,
+  0, 21, 13, 42, 3, 0, 0, 26, 69, 0,
+  18, 2, 18, 0, 12, 0, 9, 8, 0, 31,
+  0, 8, 5, 29, 0, 0, 36, 54, 18, 0,
+  0, 0, 1, 0, 24, 4, 0, 31, 0, 1,
+  0, 19, 0, 0, 51, 3, 32, 0, 21, 0,
+  83, 0, 35, 0, 4, 0, 0, 9, 0, 0,
+  15, 0, 57, 0, 37, 0, 0, 0, 30, 12,
+  51, 40, 45, 47, 0, 28, 101, 0, 0, 27,
+  0, 9, 25, 8, 0, 23, 0, 0, 52, 4,
+  22, 0, 0, 12, 0, 35, 0, 7, 0, 70,
+  5, 54, 4, 16, 0, 0, 13, 8, 68, 27,
+  0, 0, 28, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 23, 1, 27, 0, 0, 0, 0, 10,
+  48, 0, 7, 9, 0, 11, 57, 13, 9, 0,
+  13, 0, 0, 0, 22, 29, 9, 0, 0, 15,
+  0, 34, 0, 0, 59, 37, 0, 0, 0, 0,
+  12, 0, 17, 14, 11, 27, 0, 0, 0, 5,
+  0, 0, 24, 0, 14, 0, 27, 0, 77, 0,
+  21, 0, 13, 0, 0, 33, 0, 0, 27, 0,
+  41, 0, 45, 22, 0, 7, 22, 44, 69, 48,
+  60, 49, 0, 17, 100, 0, 0, 26, 19, 29,
+  19, 25, 0, 21, 0, 0, 29, 10, 19, 0,
+  0, 21, 0, 35, 0, 0, 0, 56, 7, 31,
+  16, 4, 0, 0, 48, 0, 33, 46, 0, 2,
+  16, 0, 0, 12, 0, 0, 0, 0, 0, 0,
+  48, 0, 33, 0, 0, 0, 0, 6, 51, 0,
+  15, 23, 0, 30, 42, 35, 0, 0, 24, 0,
+  0, 0, 26, 42, 0, 0, 0, 46, 0, 27,
+  0, 13, 75, 38, 0, 0, 0, 0, 17, 0,
+  16, 5, 28, 44, 0, 0, 0, 5, 8, 0,
+  2, 0, 24, 0, 4, 0, 105, 0, 27, 6,
+  32, 0, 0, 0, 0, 0, 0, 51, 48, 0,
+  17, 0, 0, 1, 56, 0, 12, 28, 33, 20,
+  5, 18, 77, 0, 0, 29, 0, 42, 17, 0,
+  0, 38, 0, 0, 71, 57, 0, 0, 0, 12,
+  0, 39, 0, 43, 0, 51, 0, 34, 20, 45,
+  0, 31, 15, 0, 71, 13, 0, 6, 44, 0,
+  0, 54, 15, 0, 0, 0, 0, 0, 23, 28,
+  33, 0, 0, 13, 0, 22, 15, 54, 0, 0,
+  0, 29, 69, 6, 16, 0, 25, 0, 11, 13,
+  3, 2, 0, 26, 5, 14, 0, 26, 0, 0,
+  43, 47, 11, 6, 0, 0, 0, 0, 43, 0,
+  0, 46, 1, 0, 0, 11, 0, 0, 48, 15,
+  46, 0, 23, 0, 104, 0, 47, 0, 0, 0,
+  0, 29, 0, 0, 20, 0, 45, 0, 38, 0,
+  0, 2, 26, 28, 73, 29, 52, 53, 0, 24,
+  91, 0, 0, 24, 16, 39, 26, 0, 0, 20,
+  0, 0, 40, 12, 3, 0, 0, 8, 0, 47,
+  0, 9, 0, 58, 0, 33, 12, 19, 0, 0,
+  17, 3, 66, 44, 0, 0, 7, 0, 0, 3,
+  7, 0, 0, 0, 0, 0, 42, 7, 32, 0,
+  0, 0, 0, 10, 51, 0, 4, 0, 0, 8,
+  61, 18, 25, 0, 32, 0, 8, 4, 12, 12,
+  2, 0, 0, 26, 0, 31, 0, 0, 56, 29,
+  0, 2, 0, 0, 0, 0, 30, 0, 7, 37,
+  0, 0, 0, 21, 0, 0, 7, 6, 14, 0,
+  16, 0, 90, 0, 25, 0, 12, 0, 0, 65,
+  0, 0, 34, 0, 36, 0, 61, 12, 0, 5,
+  44, 54, 61, 74, 64, 45, 0, 12, 72, 0,
+  0, 33, 31, 57, 17, 27, 0, 12, 0, 0,
+  29, 8, 17, 0, 0, 37, 0, 58, 0, 3,
+  0, 54, 0, 29, 24, 4, 0, 0, 35, 0,
+  43, 56, 0, 0, 7, 0, 0, 32, 0, 0,
+  0, 0, 0, 0, 70, 9, 41, 0, 0, 0,
+  0, 18, 51, 0, 0, 21, 0, 27, 40, 52,
+  13, 20, 40, 15, 0, 9, 25, 57, 3, 0,
+  0, 59, 0, 27, 0, 5, 69, 44, 0, 0,
+  0, 0, 2, 0, 12, 20, 36, 60, 0, 0,
+  0, 21, 0, 0, 0, 18, 24, 0, 0, 1,
+  134, 0, 38, 0, 44, 0, 0, 0, 0, 0,
+  0, 45, 41, 0, 20, 0, 0, 0, 75, 11,
+  19, 55, 39, 21, 25, 2, 84, 0, 0, 27,
+  13, 52, 3, 2, 0, 52, 0, 0, 56, 63,
+  0, 0, 0, 0, 0, 59, 0, 43, 0, 45,
+  7, 20, 17, 36, 0, 46, 0, 0, 66, 22,
+  0, 0, 25, 0, 0, 76, 20, 0, 0, 2,
+  0, 0, 13, 21, 31, 0, 0, 26, 0, 14,
+  8, 55, 0, 0, 0, 54, 58, 17, 20, 5,
+  37, 0, 12, 14, 8, 14, 4, 15, 7, 17,
+  1, 41, 0, 0, 39, 55, 6, 0, 4, 0,
+  0, 0, 35, 0, 0, 42, 13, 0, 0, 5,
+  0, 0, 43, 15, 52, 0, 18, 3, 121, 0,
+  68, 0, 9, 0, 0, 49, 1, 0, 30, 0,
+  15, 0, 64, 0, 0, 7, 46, 41, 52, 60,
+  59, 47, 14, 4, 85, 0, 0, 29, 21, 32,
+  22, 9, 0, 19, 0, 0, 33, 0, 0, 0,
+  0, 0, 0, 62, 0, 0, 0, 54, 0, 32,
+  4, 0, 0, 16, 7, 12, 54, 37, 0, 0,
+  0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+  49, 0, 30, 0, 0, 0, 5, 29, 27, 0,
+  0, 9, 0, 21, 35, 23, 45, 0, 23, 22,
+  4, 26, 21, 30, 26, 0, 0, 24, 0, 19,
+  0, 0, 46, 43, 11, 0, 0, 0, 0, 0,
+  30, 1, 0, 44, 0, 0, 0, 16, 0, 0,
+  1, 3, 6, 0, 0, 0, 95, 0, 52, 0,
+  20, 0, 0, 44, 27, 0, 33, 0, 0, 0,
+  76, 0, 0, 1, 67, 69, 11, 51, 63, 32,
+  6, 0, 66, 0, 0, 38, 0, 0, 28, 40,
+  0, 0, 0, 0, 7, 0, 0, 0, 0, 27,
+  0, 47, 0, 0, 0, 20, 0, 38, 0, 0,
+  0, 16, 0, 34, 21, 7, 0, 0, 0, 8,
+  0, 0, 0, 0, 0, 0, 0, 0, 98, 0,
+  25, 5, 0, 0, 0, 78, 9, 0, 0, 35,
+  0, 0, 12, 5, 38, 41, 20, 53, 0, 44,
+  32, 14, 27, 37, 0, 13, 0, 0, 0, 0,
+  28, 63, 38, 0, 0, 0, 0, 0, 3, 36,
+  0, 61, 0, 0, 0, 5, 3, 0, 4, 0,
+  0, 0, 0, 0, 77, 0, 26, 0, 18, 21,
+  0, 9, 0, 0, 15, 0, 57, 0, 37, 0,
+  0, 0, 30, 12, 51, 40, 45, 47, 0, 28,
+  101, 0, 0, 27, 0, 9, 25, 8, 0, 23,
+  0, 0, 52, 4, 22, 0, 0, 12, 0, 35,
+  0, 7, 0, 70, 5, 54, 4, 16, 0, 0,
+  13, 8, 68, 27, 0, 0, 28, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 23, 1, 27, 0,
+  0, 0, 0, 10, 48, 0, 7, 9, 0, 11,
+  57, 13, 9, 0, 13, 0, 0, 0, 22, 29,
+  9, 0, 0, 15, 0, 34, 0, 0, 59, 37,
+  0, 0, 0, 0, 12, 0, 17, 14, 11, 27,
+  0, 0, 0, 5, 0, 0, 24, 0, 14, 0,
+  27, 0, 77, 0, 21, 0, 13, 0, 0, 33,
+  0, 0, 27, 0, 41, 0, 45, 22, 0, 7,
+  22, 44, 69, 48, 60, 49, 0, 17, 100, 0,
+  0, 26, 19, 29, 19, 25, 0, 21, 0, 0,
+  29, 10, 19, 0, 0, 21, 0, 35, 0, 0,
+  0, 56, 7, 31, 16, 4, 0, 0, 48, 0,
+  33, 46, 0, 2, 16, 0, 0, 12, 0, 0,
+  0, 0, 0, 0, 48, 0, 33, 0, 0, 0,
+  0, 6, 51, 0, 15, 23, 0, 30, 42, 35,
+  0, 0, 24, 0, 0, 0, 26, 42, 0, 0,
+  0, 46, 0, 27, 0, 13, 75, 38, 0, 0,
+  0, 0, 17, 0, 16, 5, 28, 44, 0, 0,
+  0, 5, 8, 0, 2, 0, 24, 0, 4, 0,
+  105, 0, 27, 6, 32, 0, 0, 33, 0, 0,
+  36, 0, 0, 3, 48, 28, 0, 0, 10, 59,
+  39, 46, 67, 44, 12, 0, 51, 0, 0, 36,
+  0, 22, 41, 60, 0, 0, 0, 0, 19, 0,
+  7, 0, 0, 22, 0, 24, 0, 0, 0, 4,
+  0, 17, 23, 0, 0, 0, 55, 0, 1, 17,
+  0, 0, 18, 15, 0, 17, 0, 0, 0, 0,
+  0, 0, 102, 0, 17, 0, 0, 0, 5, 41,
+  35, 0, 3, 53, 0, 13, 18, 38, 12, 42,
+  10, 28, 0, 30, 22, 26, 21, 17, 0, 42,
+  0, 0, 0, 2, 49, 55, 1, 0, 0, 0,
+  16, 0, 14, 19, 32, 69, 0, 3, 0, 0,
+  21, 0, 0, 0, 17, 0, 0, 13, 100, 0,
+  0, 0, 30, 37, 0, 29, 0, 0, 20, 0,
+  45, 0, 38, 0, 0, 2, 26, 28, 73, 29,
+  52, 53, 0, 24, 91, 0, 0, 24, 16, 39,
+  26, 0, 0, 20, 0, 0, 40, 12, 3, 0,
+  0, 8, 0, 47, 0, 9, 0, 58, 0, 33,
+  12, 19, 0, 0, 17, 3, 66, 44, 0, 0,
+  7, 0, 0, 3, 7, 0, 0, 0, 0, 0,
+  42, 7, 32, 0, 0, 0, 0, 10, 51, 0,
+  4, 0, 0, 8, 61, 18, 25, 0, 32, 0,
+  8, 4, 12, 12, 2, 0, 0, 26, 0, 31,
+  0, 0, 56, 29, 0, 2, 0, 0, 0, 0,
+  30, 0, 7, 37, 0, 0, 0, 21, 0, 0,
+  7, 6, 14, 0, 16, 0, 90, 0, 25, 0,
+  12, 0, 0, 65, 0, 0, 34, 0, 36, 0,
+  61, 12, 0, 5, 44, 54, 61, 74, 64, 45,
+  0, 12, 72, 0, 0, 33, 31, 57, 17, 27,
+  0, 12, 0, 0, 29, 8, 17, 0, 0, 37,
+  0, 58, 0, 3, 0, 54, 0, 29, 24, 4,
+  0, 0, 35, 0, 43, 56, 0, 0, 7, 0,
+  0, 32, 0, 0, 0, 0, 0, 0, 70, 9,
+  41, 0, 0, 0, 0, 18, 51, 0, 0, 21,
+  0, 27, 40, 52, 13, 20, 40, 15, 0, 9,
+  25, 57, 3, 0, 0, 59, 0, 27, 0, 5,
+  69, 44, 0, 0, 0, 0, 2, 0, 12, 20,
+  36, 60, 0, 0, 0, 21, 0, 0, 0, 18,
+  24, 0, 0, 1, 134, 0, 38, 0, 44, 0,
+  0, 26, 42, 0, 40, 0, 0, 0, 68, 7,
+  0, 5, 43, 69, 21, 36, 59, 16, 3, 0,
+  30, 7, 16, 33, 0, 0, 32, 69, 0, 5,
+  0, 0, 0, 0, 0, 0, 0, 55, 0, 45,
+  0, 4, 0, 0, 0, 8, 12, 0, 0, 16,
+  23, 16, 0, 8, 0, 0, 24, 20, 0, 0,
+  0, 0, 0, 0, 0, 0, 70, 10, 16, 0,
+  0, 0, 0, 27, 24, 0, 0, 57, 0, 13,
+  0, 13, 15, 76, 12, 31, 0, 45, 9, 26,
+  24, 0, 0, 11, 0, 0, 0, 0, 52, 56,
+  16, 0, 0, 0, 1, 0, 7, 24, 39, 91,
+  4, 0, 0, 0, 0, 0, 11, 0, 10, 0,
+  0, 35, 51, 0, 0, 0, 24, 66, 0, 49,
+  1, 0, 30, 0, 15, 0, 64, 0, 0, 7,
+  46, 41, 52, 60, 59, 47, 14, 4, 85, 0,
+  0, 29, 21, 32, 22, 9, 0, 19, 0, 0,
+  33, 0, 0, 0, 0, 0, 0, 62, 0, 0,
+  0, 54, 0, 32, 4, 0, 0, 16, 7, 12,
+  54, 37, 0, 0, 0, 0, 0, 0, 1, 0,
+  0, 0, 0, 0, 49, 0, 30, 0, 0, 0,
+  5, 29, 27, 0, 0, 9, 0, 21, 35, 23,
+  45, 0, 23, 22, 4, 26, 21, 30, 26, 0,
+  0, 24, 0, 19, 0, 0, 46, 43, 11, 0,
+  0, 0, 0, 0, 30, 1, 0, 44, 0, 0,
+  0, 16, 0, 0, 1, 3, 6, 0, 0, 0,
+  95, 0, 52, 0, 20, 0, 0, 44, 27, 0,
+  33, 0, 0, 0, 76, 0, 0, 1, 67, 69,
+  11, 51, 63, 32, 6, 0, 66, 0, 0, 38,
+  0, 0, 28, 40, 0, 0, 0, 0, 7, 0,
+  0, 0, 0, 27, 0, 47, 0, 0, 0, 20,
+  0, 38, 0, 0, 0, 16, 0, 34, 21, 7,
+  0, 0, 0, 8, 0, 0, 0, 0, 0, 0,
+  0, 0, 98, 0, 25, 5, 0, 0, 0, 78,
+  9, 0, 0, 35, 0, 0, 12, 5, 38, 41,
+  20, 53, 0, 44, 32, 14, 27, 37, 0, 13,
+  0, 0, 0, 0, 28, 63, 38, 0, 0, 0,
+  0, 0, 3, 36, 0, 61, 0, 0, 0, 5,
+  3, 0, 4, 0, 0, 0, 0, 0, 77, 0,
+  26, 0, 18, 21, 29, 0, 57, 0, 12, 30,
+  0, 0, 52, 0, 0, 2, 43, 101, 14, 0,
+  40, 0, 0, 0, 32, 66, 0, 35, 0, 0,
+  0, 29, 0, 8, 0, 0, 0, 11, 0, 0,
+  0, 50, 0, 48, 0, 31, 0, 0, 0, 0,
+  0, 0, 6, 9, 0, 67, 0, 0, 11, 0,
+  13, 40, 0, 0, 5, 7, 0, 44, 0, 15,
+  58, 0, 30, 45, 0, 14, 0, 32, 0, 0,
+  0, 10, 0, 27, 0, 3, 29, 32, 45, 49,
+  0, 64, 21, 0, 0, 14, 0, 0, 0, 0,
+  0, 0, 30, 78, 0, 0, 0, 0, 0, 18,
+  0, 23, 14, 57, 17, 0, 0, 0, 29, 0,
+  59, 1, 9, 2, 0, 17, 0, 0, 0, 0,
+  0, 41, 0, 33, 0, 0, 27, 0, 41, 0,
+  45, 22, 0, 7, 22, 44, 69, 48, 60, 49,
+  0, 17, 100, 0, 0, 26, 19, 29, 19, 25,
+  0, 21, 0, 0, 29, 10, 19, 0, 0, 21,
+  0, 35, 0, 0, 0, 56, 7, 31, 16, 4,
+  0, 0, 48, 0, 33, 46, 0, 2, 16, 0,
+  0, 12, 0, 0, 0, 0, 0, 0, 48, 0,
+  33, 0, 0, 0, 0, 6, 51, 0, 15, 23,
+  0, 30, 42, 35, 0, 0, 24, 0, 0, 0,
+  26, 42, 0, 0, 0, 46, 0, 27, 0, 13,
+  75, 38, 0, 0, 0, 0, 17, 0, 16, 5,
+  28, 44, 0, 0, 0, 5, 8, 0, 2, 0,
+  24, 0, 4, 0, 105, 0, 27, 6, 32, 0,
+  0, 33, 0, 0, 36, 0, 0, 3, 48, 28,
+  0, 0, 10, 59, 39, 46, 67, 44, 12, 0,
+  51, 0, 0, 36, 0, 22, 41, 60, 0, 0,
+  0, 0, 19, 0, 7, 0, 0, 22, 0, 24,
+  0, 0, 0, 4, 0, 17, 23, 0, 0, 0,
+  55, 0, 1, 17, 0, 0, 18, 15, 0, 17,
+  0, 0, 0, 0, 0, 0, 102, 0, 17, 0,
+  0, 0, 5, 41, 35, 0, 3, 53, 0, 13,
+  18, 38, 12, 42, 10, 28, 0, 30, 22, 26,
+  21, 17, 0, 42, 0, 0, 0, 2, 49, 55,
+  1, 0, 0, 0, 16, 0, 14, 19, 32, 69,
+  0, 3, 0, 0, 21, 0, 0, 0, 17, 0,
+  0, 13, 100, 0, 0, 0, 30, 37, 12, 0,
+  30, 0, 18, 0, 0, 0, 37, 30, 0, 0,
+  4, 71, 11, 0, 44, 48, 26, 0, 25, 1,
+  22, 8, 0, 6, 34, 49, 0, 0, 16, 0,
+  0, 5, 0, 0, 40, 32, 0, 1, 1, 0,
+  0, 0, 0, 0, 9, 0, 0, 0, 31, 0,
+  0, 10, 0, 0, 0, 51, 0, 0, 2, 6,
+  23, 5, 0, 0, 106, 5, 12, 82, 0, 0,
+  6, 39, 0, 0, 0, 50, 1, 0, 0, 34,
+  0, 54, 42, 31, 0, 69, 0, 0, 0, 56,
+  0, 0, 20, 0, 0, 15, 19, 45, 10, 6,
+  0, 0, 0, 0, 0, 21, 1, 57, 6, 0,
+  0, 0, 53, 11, 0, 0, 15, 0, 0, 26,
+  8, 0, 0, 12, 42, 48, 0, 65, 0, 0,
+  34, 0, 36, 0, 61, 12, 0, 5, 44, 54,
+  61, 74, 64, 45, 0, 12, 72, 0, 0, 33,
+  31, 57, 17, 27, 0, 12, 0, 0, 29, 8,
+  17, 0, 0, 37, 0, 58, 0, 3, 0, 54,
+  0, 29, 24, 4, 0, 0, 35, 0, 43, 56,
+  0, 0, 7, 0, 0, 32, 0, 0, 0, 0,
+  0, 0, 70, 9, 41, 0, 0, 0, 0, 18,
+  51, 0, 0, 21, 0, 27, 40, 52, 13, 20,
+  40, 15, 0, 9, 25, 57, 3, 0, 0, 59,
+  0, 27, 0, 5, 69, 44, 0, 0, 0, 0,
+  2, 0, 12, 20, 36, 60, 0, 0, 0, 21,
+  0, 0, 0, 18, 24, 0, 0, 1, 134, 0,
+  38, 0, 44, 0, 0, 26, 42, 0, 40, 0,
+  0, 0, 68, 7, 0, 5, 43, 69, 21, 36,
+  59, 16, 3, 0, 30, 7, 16, 33, 0, 0,
+  32, 69, 0, 5, 0, 0, 0, 0, 0, 0,
+  0, 55, 0, 45, 0, 4, 0, 0, 0, 8,
+  12, 0, 0, 16, 23, 16, 0, 8, 0, 0,
+  24, 20, 0, 0, 0, 0, 0, 0, 0, 0,
+  70, 10, 16, 0, 0, 0, 0, 27, 24, 0,
+  0, 57, 0, 13, 0, 13, 15, 76, 12, 31,
+  0, 45, 9, 26, 24, 0, 0, 11, 0, 0,
+  0, 0, 52, 56, 16, 0, 0, 0, 1, 0,
+  7, 24, 39, 91, 4, 0, 0, 0, 0, 0,
+  11, 0, 10, 0, 0, 35, 51, 0, 0, 0,
+  24, 66, 70, 0, 17, 0, 20, 30, 0, 0,
+  12, 0, 0, 0, 2, 79, 18, 0, 26, 23,
+  6, 5, 29, 52, 17, 15, 0, 0, 8, 29,
+  0, 0, 0, 9, 0, 47, 0, 0, 7, 43,
+  0, 12, 0, 10, 0, 0, 5, 0, 16, 5,
+  10, 0, 24, 4, 0, 0, 15, 0, 23, 37,
+  5, 0, 30, 16, 31, 0, 0, 12, 69, 32,
+  32, 66, 0, 18, 10, 0, 25, 0, 0, 55,
+  11, 6, 0, 12, 0, 37, 48, 12, 31, 65,
+  0, 0, 0, 0, 0, 0, 29, 0, 0, 17,
+  57, 30, 0, 27, 0, 0, 0, 60, 0, 14,
+  29, 64, 0, 0, 0, 1, 7, 52, 58, 0,
+  0, 0, 0, 32, 0, 0, 0, 19, 23, 49,
+  0, 44, 27, 0, 33, 0, 0, 0, 76, 0,
+  0, 1, 67, 69, 11, 51, 63, 32, 6, 0,
+  66, 0, 0, 38, 0, 0, 28, 40, 0, 0,
+  0, 0, 7, 0, 0, 0, 0, 27, 0, 47,
+  0, 0, 0, 20, 0, 38, 0, 0, 0, 16,
+  0, 34, 21, 7, 0, 0, 0, 8, 0, 0,
+  0, 0, 0, 0, 0, 0, 98, 0, 25, 5,
+  0, 0, 0, 78, 9, 0, 0, 35, 0, 0,
+  12, 5, 38, 41, 20, 53, 0, 44, 32, 14,
+  27, 37, 0, 13, 0, 0, 0, 0, 28, 63,
+  38, 0, 0, 0, 0, 0, 3, 36, 0, 61,
+  0, 0, 0, 5, 3, 0, 4, 0, 0, 0,
+  0, 0, 77, 0, 26, 0, 18, 21, 29, 0,
+  57, 0, 12, 30, 0, 0, 52, 0, 0, 2,
+  43, 101, 14, 0, 40, 0, 0, 0, 32, 66,
+  0, 35, 0, 0, 0, 29, 0, 8, 0, 0,
+  0, 11, 0, 0, 0, 50, 0, 48, 0, 31,
+  0, 0, 0, 0, 0, 0, 6, 9, 0, 67,
+  0, 0, 11, 0, 13, 40, 0, 0, 5, 7,
+  0, 44, 0, 15, 58, 0, 30, 45, 0, 14,
+  0, 32, 0, 0, 0, 10, 0, 27, 0, 3,
+  29, 32, 45, 49, 0, 64, 21, 0, 0, 14,
+  0, 0, 0, 0, 0, 0, 30, 78, 0, 0,
+  0, 0, 0, 18, 0, 23, 14, 57, 17, 0,
+  0, 0, 29, 0, 59, 1, 9, 2, 0, 17,
+  0, 0, 0, 0, 0, 41, 0, 0, 0, 0,
+  31, 51, 0, 0, 37, 2, 0, 0, 4, 70,
+  43, 0, 24, 35, 0, 14, 56, 0, 0, 39,
+  0, 0, 9, 13, 0, 36, 0, 0, 0, 14,
+  0, 0, 0, 19, 0, 41, 0, 0, 0, 5,
+  3, 0, 4, 0, 0, 0, 23, 13, 20, 0,
+  0, 0, 18, 34, 0, 0, 4, 17, 0, 0,
+  0, 0, 21, 0, 0, 0, 0, 23, 10, 1,
+  39, 9, 0, 0, 1, 25, 3, 20, 0, 8,
+  17, 5, 38, 41, 32, 19, 10, 0, 6, 0,
+  0, 0, 0, 5, 45, 39, 4, 0, 0, 0,
+  0, 31, 0, 9, 12, 73, 0, 0, 0, 0,
+  2, 0, 65, 11, 0, 5, 37, 0, 20, 0,
+  0, 11, 0, 8, 0, 33, 0, 0, 36, 0,
+  0, 3, 48, 28, 0, 0, 10, 59, 39, 46,
+  67, 44, 12, 0, 51, 0, 0, 36, 0, 22,
+  41, 60, 0, 0, 0, 0, 19, 0, 7, 0,
+  0, 22, 0, 24, 0, 0, 0, 4, 0, 17,
+  23, 0, 0, 0, 55, 0, 1, 17, 0, 0,
+  18, 15, 0, 17, 0, 0, 0, 0, 0, 0,
+  102, 0, 17, 0, 0, 0, 5, 41, 35, 0,
+  3, 53, 0, 13, 18, 38, 12, 42, 10, 28,
+  0, 30, 22, 26, 21, 17, 0, 42, 0, 0,
+  0, 2, 49, 55, 1, 0, 0, 0, 16, 0,
+  14, 19, 32, 69, 0, 3, 0, 0, 21, 0,
+  0, 0, 17, 0, 0, 13, 100, 0, 0, 0,
+  30, 37, 12, 0, 30, 0, 18, 0, 0, 0,
+  37, 30, 0, 0, 4, 71, 11, 0, 44, 48,
+  26, 0, 25, 1, 22, 8, 0, 6, 34, 49,
+  0, 0, 16, 0, 0, 5, 0, 0, 40, 32,
+  0, 1, 1, 0, 0, 0, 0, 0, 9, 0,
+  0, 0, 31, 0, 0, 10, 0, 0, 0, 51,
+  0, 0, 2, 6, 23, 5, 0, 0, 106, 5,
+  12, 82, 0, 0, 6, 39, 0, 0, 0, 50,
+  1, 0, 0, 34, 0, 54, 42, 31, 0, 69,
+  0, 0, 0, 56, 0, 0, 20, 0, 0, 15,
+  19, 45, 10, 6, 0, 0, 0, 0, 0, 21,
+  1, 57, 6, 0, 0, 0, 53, 11, 0, 0,
+  15, 0, 0, 26, 8, 0, 0, 12, 42, 48,
+  16, 0, 43, 0, 0, 0, 0, 0, 40, 54,
+  0, 16, 0, 59, 14, 0, 21, 57, 23, 17,
+  21, 14, 54, 0, 0, 0, 42, 21, 0, 0,
+  0, 0, 0, 0, 0, 0, 54, 47, 0, 0,
+  9, 0, 0, 0, 0, 0, 9, 0, 0, 0,
+  23, 0, 0, 0, 10, 0, 8, 40, 0, 0,
+  0, 25, 50, 0, 59, 21, 36, 7, 0, 114,
+  0, 9, 8, 6, 0, 0, 4, 34, 0, 0,
+  0, 19, 0, 29, 42, 2, 22, 44, 6, 0,
+  0, 57, 0, 0, 19, 0, 0, 0, 14, 17,
+  24, 0, 0, 0, 0, 0, 0, 0, 0, 39,
+  0, 0, 0, 0, 81, 4, 14, 0, 20, 0,
+  0, 18, 0, 0, 0, 19, 37, 4, 0, 26,
+  42, 0, 40, 0, 0, 0, 68, 7, 0, 5,
+  43, 69, 21, 36, 59, 16, 3, 0, 30, 7,
+  16, 33, 0, 0, 32, 69, 0, 5, 0, 0,
+  0, 0, 0, 0, 0, 55, 0, 45, 0, 4,
+  0, 0, 0, 8, 12, 0, 0, 16, 23, 16,
+  0, 8, 0, 0, 24, 20, 0, 0, 0, 0,
+  0, 0, 0, 0, 70, 10, 16, 0, 0, 0,
+  0, 27, 24, 0, 0, 57, 0, 13, 0, 13,
+  15, 76, 12, 31, 0, 45, 9, 26, 24, 0,
+  0, 11, 0, 0, 0, 0, 52, 56, 16, 0,
+  0, 0, 1, 0, 7, 24, 39, 91, 4, 0,
+  0, 0, 0, 0, 11, 0, 10, 0, 0, 35,
+  51, 0, 0, 0, 24, 66, 70, 0, 17, 0,
+  20, 30, 0, 0, 12, 0, 0, 0, 2, 79,
+  18, 0, 26, 23, 6, 5, 29, 52, 17, 15,
+  0, 0, 8, 29, 0, 0, 0, 9, 0, 47,
+  0, 0, 7, 43, 0, 12, 0, 10, 0, 0,
+  5, 0, 16, 5, 10, 0, 24, 4, 0, 0,
+  15, 0, 23, 37, 5, 0, 30, 16, 31, 0,
+  0, 12, 69, 32, 32, 66, 0, 18, 10, 0,
+  25, 0, 0, 55, 11, 6, 0, 12, 0, 37,
+  48, 12, 31, 65, 0, 0, 0, 0, 0, 0,
+  29, 0, 0, 17, 57, 30, 0, 27, 0, 0,
+  0, 60, 0, 14, 29, 64, 0, 0, 0, 1,
+  7, 52, 58, 0, 0, 0, 0, 32, 0, 0,
+  0, 19, 23, 49, 22, 3, 0, 0, 24, 14,
+  0, 0, 31, 13, 0, 23, 0, 61, 30, 0,
+  16, 46, 7, 38, 53, 0, 0, 0, 7, 20,
+  37, 0, 0, 0, 0, 0, 0, 35, 0, 0,
+  9, 0, 0, 0, 0, 3, 0, 3, 12, 0,
+  13, 5, 0, 0, 57, 0, 3, 0, 0, 0,
+  27, 17, 0, 0, 5, 8, 37, 0, 0, 0,
+  19, 60, 0, 39, 0, 33, 30, 0, 37, 12,
+  0, 30, 0, 10, 5, 30, 0, 0, 41, 0,
+  71, 36, 0, 13, 0, 0, 4, 0, 18, 0,
+  0, 16, 44, 2, 0, 26, 0, 0, 0, 38,
+  5, 6, 19, 51, 0, 0, 0, 14, 43, 20,
+  37, 0, 0, 0, 39, 13, 0, 0, 0, 39,
+  17, 0, 29, 0, 57, 0, 12, 30, 0, 0,
+  52, 0, 0, 2, 43, 101, 14, 0, 40, 0,
+  0, 0, 32, 66, 0, 35, 0, 0, 0, 29,
+  0, 8, 0, 0, 0, 11, 0, 0, 0, 50,
+  0, 48, 0, 31, 0, 0, 0, 0, 0, 0,
+  6, 9, 0, 67, 0, 0, 11, 0, 13, 40,
+  0, 0, 5, 7, 0, 44, 0, 15, 58, 0,
+  30, 45, 0, 14, 0, 32, 0, 0, 0, 10,
+  0, 27, 0, 3, 29, 32, 45, 49, 0, 64,
+  21, 0, 0, 14, 0, 0, 0, 0, 0, 0,
+  30, 78, 0, 0, 0, 0, 0, 18, 0, 23,
+  14, 57, 17, 0, 0, 0, 29, 0, 59, 1,
+  9, 2, 0, 17, 0, 0, 0, 0, 0, 41,
+  0, 0, 0, 0, 31, 51, 0, 0, 37, 2,
+  0, 0, 4, 70, 43, 0, 24, 35, 0, 14,
+  56, 0, 0, 39, 0, 0, 9, 13, 0, 36,
+  0, 0, 0, 14, 0, 0, 0, 19, 0, 41,
+  0, 0, 0, 5, 3, 0, 4, 0, 0, 0,
+  23, 13, 20, 0, 0, 0, 18, 34, 0, 0,
+  4, 17, 0, 0, 0, 0, 21, 0, 0, 0,
+  0, 23, 10, 1, 39, 9, 0, 0, 1, 25,
+  3, 20, 0, 8, 17, 5, 38, 41, 32, 19,
+  10, 0, 6, 0, 0, 0, 0, 5, 45, 39,
+  4, 0, 0, 0, 0, 31, 0, 9, 12, 73,
+  0, 0, 0, 0, 2, 0, 65, 11, 0, 5,
+  37, 0, 20, 0, 0, 11, 0, 8, 0, 32,
+  0, 0, 31, 0, 19, 0, 50, 0, 0, 16,
+  7, 64, 58, 24, 16, 46, 0, 28, 76, 0,
+  0, 47, 16, 40, 25, 0, 0, 27, 0, 0,
+  0, 37, 5, 0, 0, 0, 0, 29, 0, 1,
+  0, 41, 21, 3, 4, 6, 0, 0, 60, 0,
+  56, 11, 0, 0, 8, 6, 0, 26, 13, 0,
+  0, 0, 0, 0, 17, 6, 0, 0, 0, 25,
+  0, 0, 41, 13, 0, 0, 0, 30, 48, 39,
+  12, 0, 31, 0, 58, 23, 37, 56, 3, 0,
+  8, 19, 0, 16, 0, 10, 57, 33, 0, 0,
+  0, 0, 0, 0, 23, 0, 31, 59, 0, 0,
+  0, 1, 24, 0, 21, 0, 8, 0, 47, 0,
+  77, 0, 1, 23, 9, 0, 12, 0, 30, 0,
+  18, 0, 0, 0, 37, 30, 0, 0, 4, 71,
+  11, 0, 44, 48, 26, 0, 25, 1, 22, 8,
+  0, 6, 34, 49, 0, 0, 16, 0, 0, 5,
+  0, 0, 40, 32, 0, 1, 1, 0, 0, 0,
+  0, 0, 9, 0, 0, 0, 31, 0, 0, 10,
+  0, 0, 0, 51, 0, 0, 2, 6, 23, 5,
+  0, 0, 106, 5, 12, 82, 0, 0, 6, 39,
+  0, 0, 0, 50, 1, 0, 0, 34, 0, 54,
+  42, 31, 0, 69, 0, 0, 0, 56, 0, 0,
+  20, 0, 0, 15, 19, 45, 10, 6, 0, 0,
+  0, 0, 0, 21, 1, 57, 6, 0, 0, 0,
+  53, 11, 0, 0, 15, 0, 0, 26, 8, 0,
+  0, 12, 42, 48, 16, 0, 43, 0, 0, 0,
+  0, 0, 40, 54, 0, 16, 0, 59, 14, 0,
+  21, 57, 23, 17, 21, 14, 54, 0, 0, 0,
+  42, 21, 0, 0, 0, 0, 0, 0, 0, 0,
+  54, 47, 0, 0, 9, 0, 0, 0, 0, 0,
+  9, 0, 0, 0, 23, 0, 0, 0, 10, 0,
+  8, 40, 0, 0, 0, 25, 50, 0, 59, 21,
+  36, 7, 0, 114, 0, 9, 8, 6, 0, 0,
+  4, 34, 0, 0, 0, 19, 0, 29, 42, 2,
+  22, 44, 6, 0, 0, 57, 0, 0, 19, 0,
+  0, 0, 14, 17, 24, 0, 0, 0, 0, 0,
+  0, 0, 0, 39, 0, 0, 0, 0, 81, 4,
+  14, 0, 20, 0, 0, 18, 0, 0, 0, 19,
+  37, 4, 30, 0, 21, 8, 18, 0, 0, 0,
+  23, 36, 0, 0, 0, 54, 7, 0, 0, 65,
+  15, 16, 55, 1, 62, 10, 0, 0, 52, 0,
+  0, 0, 14, 0, 0, 0, 0, 0, 9, 33,
+  0, 0, 29, 0, 0, 9, 0, 0, 15, 0,
+  0, 0, 30, 30, 0, 0, 29, 0, 20, 15,
+  0, 0, 0, 14, 64, 0, 89, 22, 8, 0,
+  0, 130, 0, 14, 8, 0, 2, 0, 14, 22,
+  0, 0, 24, 0, 8, 22, 41, 0, 39, 0,
+  26, 0, 0, 30, 15, 0, 0, 0, 0, 0,
+  23, 0, 15, 0, 0, 0, 0, 0, 0, 32,
+  0, 10, 0, 9, 0, 0, 99, 17, 35, 0,
+  24, 0, 6, 0, 0, 0, 0, 31, 25, 0,
+  70, 0, 17, 0, 20, 30, 0, 0, 12, 0,
+  0, 0, 2, 79, 18, 0, 26, 23, 6, 5,
+  29, 52, 17, 15, 0, 0, 8, 29, 0, 0,
+  0, 9, 0, 47, 0, 0, 7, 43, 0, 12,
+  0, 10, 0, 0, 5, 0, 16, 5, 10, 0,
+  24, 4, 0, 0, 15, 0, 23, 37, 5, 0,
+  30, 16, 31, 0, 0, 12, 69, 32, 32, 66,
+  0, 18, 10, 0, 25, 0, 0, 55, 11, 6,
+  0, 12, 0, 37, 48, 12, 31, 65, 0, 0,
+  0, 0, 0, 0, 29, 0, 0, 17, 57, 30,
+  0, 27, 0, 0, 0, 60, 0, 14, 29, 64,
+  0, 0, 0, 1, 7, 52, 58, 0, 0, 0,
+  0, 32, 0, 0, 0, 19, 23, 49, 22, 3,
+  0, 0, 24, 14, 0, 0, 31, 13, 0, 23,
+  0, 61, 30, 0, 16, 46, 7, 38, 53, 0,
+  0, 0, 7, 20, 37, 0, 0, 0, 0, 0,
+  0, 35, 0, 0, 9, 0, 0, 0, 0, 3,
+  0, 3, 12, 0, 13, 5, 0, 0, 57, 0,
+  3, 0, 0, 0, 27, 17, 0, 0, 5, 8,
+  37, 0, 0, 0, 19, 60, 0, 39, 0, 33,
+  30, 0, 37, 12, 0, 30, 0, 10, 5, 30,
+  0, 0, 41, 0, 71, 36, 0, 13, 0, 0,
+  4, 0, 18, 0, 0, 16, 44, 2, 0, 26,
+  0, 0, 0, 38, 5, 6, 19, 51, 0, 0,
+  0, 14, 43, 20, 37, 0, 0, 0, 39, 13,
+  0, 0, 0, 39, 17, 0, 19, 51, 0, 11,
+  63, 0, 36, 0, 33, 2, 0, 24, 2, 46,
+  28, 0, 6, 25, 11, 52, 60, 0, 0, 15,
+  21, 37, 39, 0, 0, 21, 42, 0, 0, 33,
+  0, 0, 0, 0, 0, 0, 0, 29, 0, 51,
+  23, 0, 7, 28, 0, 0, 51, 0, 37, 15,
+  0, 12, 5, 0, 0, 22, 16, 2, 15, 0,
+  0, 0, 4, 57, 0, 0, 0, 41, 5, 0,
+  60, 0, 19, 1, 4, 1, 52, 31, 4, 0,
+  58, 0, 51, 26, 21, 39, 0, 0, 0, 32,
+  0, 23, 0, 0, 55, 8, 0, 36, 1, 0,
+  0, 0, 14, 29, 63, 36, 0, 0, 0, 0,
+  46, 0, 12, 0, 4, 0, 35, 1, 40, 0,
+  0, 33, 0, 0, 0, 0, 0, 0, 31, 51,
+  0, 0, 37, 2, 0, 0, 4, 70, 43, 0,
+  24, 35, 0, 14, 56, 0, 0, 39, 0, 0,
+  9, 13, 0, 36, 0, 0, 0, 14, 0, 0,
+  0, 19, 0, 41, 0, 0, 0, 5, 3, 0,
+  4, 0, 0, 0, 23, 13, 20, 0, 0, 0,
+  18, 34, 0, 0, 4, 17, 0, 0, 0, 0,
+  21, 0, 0, 0, 0, 23, 10, 1, 39, 9,
+  0, 0, 1, 25, 3, 20, 0, 8, 17, 5,
+  38, 41, 32, 19, 10, 0, 6, 0, 0, 0,
+  0, 5, 45, 39, 4, 0, 0, 0, 0, 31,
+  0, 9, 12, 73, 0, 0, 0, 0, 2, 0,
+  65, 11, 0, 5, 37, 0, 20, 0, 0, 11,
+  0, 8, 0, 32, 0, 0, 31, 0, 19, 0,
+  50, 0, 0, 16, 7, 64, 58, 24, 16, 46,
+  0, 28, 76, 0, 0, 47, 16, 40, 25, 0,
+  0, 27, 0, 0, 0, 37, 5, 0, 0, 0,
+  0, 29, 0, 1, 0, 41, 21, 3, 4, 6,
+  0, 0, 60, 0, 56, 11, 0, 0, 8, 6,
+  0, 26, 13, 0, 0, 0, 0, 0, 17, 6,
+  0, 0, 0, 25, 0, 0, 41, 13, 0, 0,
+  0, 30, 48, 39, 12, 0, 31, 0, 58, 23,
+  37, 56, 3, 0, 8, 19, 0, 16, 0, 10,
+  57, 33, 0, 0, 0, 0, 0, 0, 23, 0,
+  31, 59, 0, 0, 0, 1, 24, 0, 21, 0,
+  8, 0, 47, 0, 77, 0, 1, 23, 9, 0,
+  0, 86, 6, 8, 42, 0, 32, 0, 64, 4,
+  0, 0, 6, 42, 74, 53, 38, 43, 0, 27,
+  68, 0, 0, 42, 0, 47, 25, 9, 0, 24,
+  6, 0, 0, 29, 9, 0, 0, 0, 0, 25,
+  0, 26, 0, 59, 9, 0, 0, 24, 0, 0,
+  45, 0, 88, 34, 0, 0, 0, 0, 0, 9,
+  6, 0, 0, 0, 0, 0, 36, 0, 0, 0,
+  0, 0, 0, 17, 64, 0, 2, 0, 1, 0,
+  91, 28, 8, 0, 51, 13, 35, 13, 47, 25,
+  0, 0, 0, 32, 0, 22, 0, 0, 48, 22,
+  0, 7, 0, 0, 23, 0, 25, 21, 43, 64,
+  10, 0, 0, 0, 29, 0, 0, 0, 18, 0,
+  4, 0, 74, 0, 0, 37, 25, 0, 16, 0,
+  43, 0, 0, 0, 0, 0, 40, 54, 0, 16,
+  0, 59, 14, 0, 21, 57, 23, 17, 21, 14,
+  54, 0, 0, 0, 42, 21, 0, 0, 0, 0,
+  0, 0, 0, 0, 54, 47, 0, 0, 9, 0,
+  0, 0, 0, 0, 9, 0, 0, 0, 23, 0,
+  0, 0, 10, 0, 8, 40, 0, 0, 0, 25,
+  50, 0, 59, 21, 36, 7, 0, 114, 0, 9,
+  8, 6, 0, 0, 4, 34, 0, 0, 0, 19,
+  0, 29, 42, 2, 22, 44, 6, 0, 0, 57,
+  0, 0, 19, 0, 0, 0, 14, 17, 24, 0,
+  0, 0, 0, 0, 0, 0, 0, 39, 0, 0,
+  0, 0, 81, 4, 14, 0, 20, 0, 0, 18,
+  0, 0, 0, 19, 37, 4, 30, 0, 21, 8,
+  18, 0, 0, 0, 23, 36, 0, 0, 0, 54,
+  7, 0, 0, 65, 15, 16, 55, 1, 62, 10,
+  0, 0, 52, 0, 0, 0, 14, 0, 0, 0,
+  0, 0, 9, 33, 0, 0, 29, 0, 0, 9,
+  0, 0, 15, 0, 0, 0, 30, 30, 0, 0,
+  29, 0, 20, 15, 0, 0, 0, 14, 64, 0,
+  89, 22, 8, 0, 0, 130, 0, 14, 8, 0,
+  2, 0, 14, 22, 0, 0, 24, 0, 8, 22,
+  41, 0, 39, 0, 26, 0, 0, 30, 15, 0,
+  0, 0, 0, 0, 23, 0, 15, 0, 0, 0,
+  0, 0, 0, 32, 0, 10, 0, 9, 0, 0,
+  99, 17, 35, 0, 24, 0, 6, 0, 0, 0,
+  0, 31, 25, 0, 5, 13, 0, 32, 19, 0,
+  8, 0, 42, 4, 0, 13, 0, 36, 0, 0,
+  0, 57, 0, 20, 78, 0, 62, 17, 0, 0,
+  48, 0, 0, 0, 23, 0, 0, 0, 0, 0,
+  0, 22, 0, 0, 41, 0, 0, 33, 9, 0,
+  6, 0, 0, 0, 32, 6, 0, 0, 33, 0,
+  37, 0, 4, 0, 0, 39, 62, 0, 84, 8,
+  32, 22, 0, 130, 0, 9, 16, 0, 0, 9,
+  33, 13, 0, 0, 29, 13, 0, 22, 32, 0,
+  33, 0, 24, 0, 0, 28, 10, 0, 0, 0,
+  8, 0, 32, 0, 10, 12, 0, 0, 0, 0,
+  0, 83, 0, 0, 2, 0, 0, 0, 98, 36,
+  46, 0, 18, 0, 8, 0, 0, 0, 0, 28,
+  8, 0, 22, 3, 0, 0, 24, 14, 0, 0,
+  31, 13, 0, 23, 0, 61, 30, 0, 16, 46,
+  7, 38, 53, 0, 0, 0, 7, 20, 37, 0,
+  0, 0, 0, 0, 0, 35, 0, 0, 9, 0,
+  0, 0, 0, 3, 0, 3, 12, 0, 13, 5,
+  0, 0, 57, 0, 3, 0, 0, 0, 27, 17,
+  0, 0, 5, 8, 37, 0, 0, 0, 19, 60,
+  0, 39, 0, 33, 30, 0, 37, 12, 0, 30,
+  0, 10, 5, 30, 0, 0, 41, 0, 71, 36,
+  0, 13, 0, 0, 4, 0, 18, 0, 0, 16,
+  44, 2, 0, 26, 0, 0, 0, 38, 5, 6,
+  19, 51, 0, 0, 0, 14, 43, 20, 37, 0,
+  0, 0, 39, 13, 0, 0, 0, 39, 17, 0,
+  19, 51, 0, 11, 63, 0, 36, 0, 33, 2,
+  0, 24, 2, 46, 28, 0, 6, 25, 11, 52,
+  60, 0, 0, 15, 21, 37, 39, 0, 0, 21,
+  42, 0, 0, 33, 0, 0, 0, 0, 0, 0,
+  0, 29, 0, 51, 23, 0, 7, 28, 0, 0,
+  51, 0, 37, 15, 0, 12, 5, 0, 0, 22,
+  16, 2, 15, 0, 0, 0, 4, 57, 0, 0,
+  0, 41, 5, 0, 60, 0, 19, 1, 4, 1,
+  52, 31, 4, 0, 58, 0, 51, 26, 21, 39,
+  0, 0, 0, 32, 0, 23, 0, 0, 55, 8,
+  0, 36, 1, 0, 0, 0, 14, 29, 63, 36,
+  0, 0, 0, 0, 46, 0, 12, 0, 4, 0,
+  35, 1, 40, 0, 0, 33, 0, 0, 0, 99,
+  0, 38, 55, 0, 74, 0, 47, 0, 0, 55,
+  43, 30, 27, 0, 3, 36, 0, 59, 80, 0,
+  0, 26, 36, 49, 32, 1, 0, 12, 51, 0,
+  22, 17, 3, 0, 0, 0, 0, 0, 0, 20,
+  0, 83, 20, 23, 0, 15, 0, 0, 26, 0,
+  67, 45, 0, 11, 23, 0, 0, 37, 22, 0,
+  0, 0, 0, 0, 14, 67, 0, 0, 0, 11,
+  0, 0, 67, 0, 16, 0, 7, 0, 80, 54,
+  0, 0, 42, 0, 37, 1, 24, 67, 6, 0,
+  0, 40, 0, 45, 0, 0, 77, 8, 0, 34,
+  3, 0, 0, 0, 25, 58, 103, 36, 0, 0,
+  0, 0, 32, 0, 0, 0, 0, 0, 21, 22,
+  80, 0, 38, 25, 8, 0, 0, 32, 0, 0,
+  31, 0, 19, 0, 50, 0, 0, 16, 7, 64,
+  58, 24, 16, 46, 0, 28, 76, 0, 0, 47,
+  16, 40, 25, 0, 0, 27, 0, 0, 0, 37,
+  5, 0, 0, 0, 0, 29, 0, 1, 0, 41,
+  21, 3, 4, 6, 0, 0, 60, 0, 56, 11,
+  0, 0, 8, 6, 0, 26, 13, 0, 0, 0,
+  0, 0, 17, 6, 0, 0, 0, 25, 0, 0,
+  41, 13, 0, 0, 0, 30, 48, 39, 12, 0,
+  31, 0, 58, 23, 37, 56, 3, 0, 8, 19,
+  0, 16, 0, 10, 57, 33, 0, 0, 0, 0,
+  0, 0, 23, 0, 31, 59, 0, 0, 0, 1,
+  24, 0, 21, 0, 8, 0, 47, 0, 77, 0,
+  1, 23, 9, 0, 0, 86, 6, 8, 42, 0,
+  32, 0, 64, 4, 0, 0, 6, 42, 74, 53,
+  38, 43, 0, 27, 68, 0, 0, 42, 0, 47,
+  25, 9, 0, 24, 6, 0, 0, 29, 9, 0,
+  0, 0, 0, 25, 0, 26, 0, 59, 9, 0,
+  0, 24, 0, 0, 45, 0, 88, 34, 0, 0,
+  0, 0, 0, 9, 6, 0, 0, 0, 0, 0,
+  36, 0, 0, 0, 0, 0, 0, 17, 64, 0,
+  2, 0, 1, 0, 91, 28, 8, 0, 51, 13,
+  35, 13, 47, 25, 0, 0, 0, 32, 0, 22,
+  0, 0, 48, 22, 0, 7, 0, 0, 23, 0,
+  25, 21, 43, 64, 10, 0, 0, 0, 29, 0,
+  0, 0, 18, 0, 4, 0, 74, 0, 0, 37,
+  25, 0, 0, 96, 8, 3, 33, 0, 35, 0,
+  85, 3, 0, 27, 4, 58, 40, 66, 33, 44,
+  0, 33, 67, 0, 11, 33, 0, 10, 35, 17,
+  0, 0, 0, 0, 16, 0, 0, 0, 0, 12,
+  0, 0, 0, 9, 0, 67, 0, 25, 0, 38,
+  0, 0, 28, 0, 77, 30, 0, 0, 25, 0,
+  0, 0, 0, 0, 0, 0, 2, 0, 21, 0,
+  17, 0, 0, 0, 18, 29, 78, 0, 11, 0,
+  0, 0, 78, 36, 3, 0, 35, 3, 44, 7,
+  36, 20, 0, 27, 0, 26, 0, 8, 0, 0,
+  61, 33, 8, 16, 0, 0, 58, 0, 22, 29,
+  12, 37, 7, 0, 0, 0, 41, 0, 0, 0,
+  20, 0, 0, 0, 52, 0, 0, 31, 46, 0,
+  30, 0, 21, 8, 18, 0, 0, 0, 23, 36,
+  0, 0, 0, 54, 7, 0, 0, 65, 15, 16,
+  55, 1, 62, 10, 0, 0, 52, 0, 0, 0,
+  14, 0, 0, 0, 0, 0, 9, 33, 0, 0,
+  29, 0, 0, 9, 0, 0, 15, 0, 0, 0,
+  30, 30, 0, 0, 29, 0, 20, 15, 0, 0,
+  0, 14, 64, 0, 89, 22, 8, 0, 0, 130,
+  0, 14, 8, 0, 2, 0, 14, 22, 0, 0,
+  24, 0, 8, 22, 41, 0, 39, 0, 26, 0,
+  0, 30, 15, 0, 0, 0, 0, 0, 23, 0,
+  15, 0, 0, 0, 0, 0, 0, 32, 0, 10,
+  0, 9, 0, 0, 99, 17, 35, 0, 24, 0,
+  6, 0, 0, 0, 0, 31, 25, 0, 5, 13,
+  0, 32, 19, 0, 8, 0, 42, 4, 0, 13,
+  0, 36, 0, 0, 0, 57, 0, 20, 78, 0,
+  62, 17, 0, 0, 48, 0, 0, 0, 23, 0,
+  0, 0, 0, 0, 0, 22, 0, 0, 41, 0,
+  0, 33, 9, 0, 6, 0, 0, 0, 32, 6,
+  0, 0, 33, 0, 37, 0, 4, 0, 0, 39,
+  62, 0, 84, 8, 32, 22, 0, 130, 0, 9,
+  16, 0, 0, 9, 33, 13, 0, 0, 29, 13,
+  0, 22, 32, 0, 33, 0, 24, 0, 0, 28,
+  10, 0, 0, 0, 8, 0, 32, 0, 10, 12,
+  0, 0, 0, 0, 0, 83, 0, 0, 2, 0,
+  0, 0, 98, 36, 46, 0, 18, 0, 8, 0,
+  0, 0, 0, 28, 8, 0, 11, 29, 0, 45,
+  2, 0, 17, 0, 59, 0, 0, 24, 0, 0,
+  0, 0, 0, 40, 1, 11, 70, 0, 8, 10,
+  0, 0, 32, 0, 0, 0, 26, 22, 0, 7,
+  0, 0, 17, 26, 2, 0, 47, 0, 0, 21,
+  13, 9, 8, 0, 0, 0, 39, 2, 0, 18,
+  67, 54, 46, 0, 21, 0, 0, 41, 60, 20,
+  72, 13, 27, 31, 0, 123, 0, 13, 17, 0,
+  0, 28, 28, 13, 17, 0, 23, 19, 0, 3,
+  26, 0, 27, 0, 23, 0, 0, 39, 0, 0,
+  0, 3, 33, 0, 52, 9, 4, 75, 0, 0,
+  0, 0, 0, 100, 0, 0, 2, 0, 0, 11,
+  51, 34, 23, 0, 31, 0, 14, 0, 0, 0,
+  3, 31, 7, 0, 19, 51, 0, 11, 63, 0,
+  36, 0, 33, 2, 0, 24, 2, 46, 28, 0,
+  6, 25, 11, 52, 60, 0, 0, 15, 21, 37,
+  39, 0, 0, 21, 42, 0, 0, 33, 0, 0,
+  0, 0, 0, 0, 0, 29, 0, 51, 23, 0,
+  7, 28, 0, 0, 51, 0, 37, 15, 0, 12,
+  5, 0, 0, 22, 16, 2, 15, 0, 0, 0,
+  4, 57, 0, 0, 0, 41, 5, 0, 60, 0,
+  19, 1, 4, 1, 52, 31, 4, 0, 58, 0,
+  51, 26, 21, 39, 0, 0, 0, 32, 0, 23,
+  0, 0, 55, 8, 0, 36, 1, 0, 0, 0,
+  14, 29, 63, 36, 0, 0, 0, 0, 46, 0,
+  12, 0, 4, 0, 35, 1, 40, 0, 0, 33,
+  0, 0, 0, 99, 0, 38, 55, 0, 74, 0,
+  47, 0, 0, 55, 43, 30, 27, 0, 3, 36,
+  0, 59, 80, 0, 0, 26, 36, 49, 32, 1,
+  0, 12, 51, 0, 22, 17, 3, 0, 0, 0,
+  0, 0, 0, 20, 0, 83, 20, 23, 0, 15,
+  0, 0, 26, 0, 67, 45, 0, 11, 23, 0,
+  0, 37, 22, 0, 0, 0, 0, 0, 14, 67,
+  0, 0, 0, 11, 0, 0, 67, 0, 16, 0,
+  7, 0, 80, 54, 0, 0, 42, 0, 37, 1,
+  24, 67, 6, 0, 0, 40, 0, 45, 0, 0,
+  77, 8, 0, 34, 3, 0, 0, 0, 25, 58,
+  103, 36, 0, 0, 0, 0, 32, 0, 0, 0,
+  0, 0, 21, 22, 80, 0, 38, 25, 8, 0,
+  0, 129, 0, 59, 30, 0, 80, 0, 63, 0,
+  2, 62, 41, 13, 24, 8, 0, 36, 0, 50,
+  73, 0, 0, 34, 40, 69, 39, 5, 0, 13,
+  44, 0, 63, 0, 17, 0, 0, 0, 0, 0,
+  0, 30, 0, 55, 31, 26, 0, 15, 0, 0,
+  34, 0, 63, 66, 0, 6, 53, 0, 0, 76,
+  13, 0, 0, 0, 0, 0, 32, 81, 0, 0,
+  0, 20, 0, 0, 48, 49, 0, 0, 0, 0,
+  65, 72, 1, 0, 21, 0, 34, 0, 17, 106,
+  73, 0, 0, 66, 0, 33, 16, 0, 73, 22,
+  0, 27, 0, 0, 0, 0, 17, 70, 123, 31,
+  8, 0, 18, 0, 19, 0, 0, 0, 0, 0,
+  16, 21, 113, 10, 49, 16, 11, 0, 0, 86,
+  6, 8, 42, 0, 32, 0, 64, 4, 0, 0,
+  6, 42, 74, 53, 38, 43, 0, 27, 68, 0,
+  0, 42, 0, 47, 25, 9, 0, 24, 6, 0,
+  0, 29, 9, 0, 0, 0, 0, 25, 0, 26,
+  0, 59, 9, 0, 0, 24, 0, 0, 45, 0,
+  88, 34, 0, 0, 0, 0, 0, 9, 6, 0,
+  0, 0, 0, 0, 36, 0, 0, 0, 0, 0,
+  0, 17, 64, 0, 2, 0, 1, 0, 91, 28,
+  8, 0, 51, 13, 35, 13, 47, 25, 0, 0,
+  0, 32, 0, 22, 0, 0, 48, 22, 0, 7,
+  0, 0, 23, 0, 25, 21, 43, 64, 10, 0,
+  0, 0, 29, 0, 0, 0, 18, 0, 4, 0,
+  74, 0, 0, 37, 25, 0, 0, 96, 8, 3,
+  33, 0, 35, 0, 85, 3, 0, 27, 4, 58,
+  40, 66, 33, 44, 0, 33, 67, 0, 11, 33,
+  0, 10, 35, 17, 0, 0, 0, 0, 16, 0,
+  0, 0, 0, 12, 0, 0, 0, 9, 0, 67,
+  0, 25, 0, 38, 0, 0, 28, 0, 77, 30,
+  0, 0, 25, 0, 0, 0, 0, 0, 0, 0,
+  2, 0, 21, 0, 17, 0, 0, 0, 18, 29,
+  78, 0, 11, 0, 0, 0, 78, 36, 3, 0,
+  35, 3, 44, 7, 36, 20, 0, 27, 0, 26,
+  0, 8, 0, 0, 61, 33, 8, 16, 0, 0,
+  58, 0, 22, 29, 12, 37, 7, 0, 0, 0,
+  41, 0, 0, 0, 20, 0, 0, 0, 52, 0,
+  0, 31, 46, 0, 0, 50, 11, 21, 17, 0,
+  0, 0, 67, 0, 0, 42, 4, 106, 9, 17,
+  15, 45, 0, 24, 71, 0, 40, 19, 0, 0,
+  0, 3, 0, 0, 0, 0, 0, 10, 0, 0,
+  0, 0, 0, 0, 4, 19, 0, 50, 0, 0,
+  0, 45, 0, 0, 34, 65, 36, 45, 0, 0,
+  44, 0, 0, 0, 0, 0, 7, 0, 60, 7,
+  0, 7, 12, 15, 0, 0, 10, 2, 40, 0,
+  0, 0, 0, 1, 42, 35, 2, 0, 21, 0,
+  58, 15, 51, 12, 0, 30, 0, 0, 0, 9,
+  0, 0, 58, 45, 6, 2, 0, 0, 16, 0,
+  0, 13, 0, 3, 7, 0, 0, 0, 80, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
+  12, 0, 5, 13, 0, 32, 19, 0, 8, 0,
+  42, 4, 0, 13, 0, 36, 0, 0, 0, 57,
+  0, 20, 78, 0, 62, 17, 0, 0, 48, 0,
+  0, 0, 23, 0, 0, 0, 0, 0, 0, 22,
+  0, 0, 41, 0, 0, 33, 9, 0, 6, 0,
+  0, 0, 32, 6, 0, 0, 33, 0, 37, 0,
+  4, 0, 0, 39, 62, 0, 84, 8, 32, 22,
+  0, 130, 0, 9, 16, 0, 0, 9, 33, 13,
+  0, 0, 29, 13, 0, 22, 32, 0, 33, 0,
+  24, 0, 0, 28, 10, 0, 0, 0, 8, 0,
+  32, 0, 10, 12, 0, 0, 0, 0, 0, 83,
+  0, 0, 2, 0, 0, 0, 98, 36, 46, 0,
+  18, 0, 8, 0, 0, 0, 0, 28, 8, 0,
+  11, 29, 0, 45, 2, 0, 17, 0, 59, 0,
+  0, 24, 0, 0, 0, 0, 0, 40, 1, 11,
+  70, 0, 8, 10, 0, 0, 32, 0, 0, 0,
+  26, 22, 0, 7, 0, 0, 17, 26, 2, 0,
+  47, 0, 0, 21, 13, 9, 8, 0, 0, 0,
+  39, 2, 0, 18, 67, 54, 46, 0, 21, 0,
+  0, 41, 60, 20, 72, 13, 27, 31, 0, 123,
+  0, 13, 17, 0, 0, 28, 28, 13, 17, 0,
+  23, 19, 0, 3, 26, 0, 27, 0, 23, 0,
+  0, 39, 0, 0, 0, 3, 33, 0, 52, 9,
+  4, 75, 0, 0, 0, 0, 0, 100, 0, 0,
+  2, 0, 0, 11, 51, 34, 23, 0, 31, 0,
+  14, 0, 0, 0, 3, 31, 7, 0, 11, 24,
+  0, 20, 0, 8, 0, 0, 72, 0, 0, 35,
+  0, 0, 0, 0, 0, 45, 6, 0, 35, 11,
+  0, 11, 0, 0, 13, 0, 0, 0, 2, 13,
+  0, 0, 0, 0, 29, 44, 34, 0, 50, 0,
+  0, 11, 0, 7, 0, 0, 0, 0, 8, 60,
+  0, 0, 108, 136, 34, 5, 37, 0, 0, 24,
+  71, 27, 134, 39, 0, 0, 0, 158, 66, 0,
+  9, 0, 0, 10, 0, 0, 39, 0, 9, 0,
+  13, 5, 9, 0, 4, 0, 70, 0, 0, 80,
+  0, 0, 27, 0, 26, 0, 39, 45, 33, 130,
+  0, 0, 0, 0, 0, 84, 0, 0, 0, 0,
+  0, 24, 23, 13, 0, 0, 36, 0, 0, 0,
+  0, 0, 23, 31, 12, 0, 0, 99, 0, 38,
+  55, 0, 74, 0, 47, 0, 0, 55, 43, 30,
+  27, 0, 3, 36, 0, 59, 80, 0, 0, 26,
+  36, 49, 32, 1, 0, 12, 51, 0, 22, 17,
+  3, 0, 0, 0, 0, 0, 0, 20, 0, 83,
+  20, 23, 0, 15, 0, 0, 26, 0, 67, 45,
+  0, 11, 23, 0, 0, 37, 22, 0, 0, 0,
+  0, 0, 14, 67, 0, 0, 0, 11, 0, 0,
+  67, 0, 16, 0, 7, 0, 80, 54, 0, 0,
+  42, 0, 37, 1, 24, 67, 6, 0, 0, 40,
+  0, 45, 0, 0, 77, 8, 0, 34, 3, 0,
+  0, 0, 25, 58, 103, 36, 0, 0, 0, 0,
+  32, 0, 0, 0, 0, 0, 21, 22, 80, 0,
+  38, 25, 8, 0, 0, 129, 0, 59, 30, 0,
+  80, 0, 63, 0, 2, 62, 41, 13, 24, 8,
+  0, 36, 0, 50, 73, 0, 0, 34, 40, 69,
+  39, 5, 0, 13, 44, 0, 63, 0, 17, 0,
+  0, 0, 0, 0, 0, 30, 0, 55, 31, 26,
+  0, 15, 0, 0, 34, 0, 63, 66, 0, 6,
+  53, 0, 0, 76, 13, 0, 0, 0, 0, 0,
+  32, 81, 0, 0, 0, 20, 0, 0, 48, 49,
+  0, 0, 0, 0, 65, 72, 1, 0, 21, 0,
+  34, 0, 17, 106, 73, 0, 0, 66, 0, 33,
+  16, 0, 73, 22, 0, 27, 0, 0, 0, 0,
+  17, 70, 123, 31, 8, 0, 18, 0, 19, 0,
+  0, 0, 0, 0, 16, 21, 113, 10, 49, 16,
+  11, 0, 4, 112, 0, 54, 23, 0, 15, 0,
+  85, 7, 0, 53, 5, 3, 0, 0, 0, 18,
+  0, 13, 49, 0, 0, 31, 10, 11, 45, 17,
+  0, 0, 0, 9, 32, 0, 23, 0, 0, 18,
+  0, 0, 0, 0, 0, 18, 25, 27, 0, 0,
+  0, 0, 33, 14, 7, 64, 44, 38, 45, 0,
+  0, 10, 0, 11, 7, 12, 0, 7, 17, 45,
+  0, 29, 0, 13, 26, 0, 1, 55, 0, 8,
+  5, 0, 20, 44, 16, 23, 0, 0, 15, 29,
+  38, 55, 93, 0, 0, 17, 0, 0, 52, 0,
+  35, 52, 0, 80, 0, 0, 0, 0, 0, 84,
+  112, 0, 31, 0, 15, 3, 1, 0, 0, 0,
+  0, 0, 3, 0, 28, 0, 45, 32, 0, 0,
+  0, 96, 8, 3, 33, 0, 35, 0, 85, 3,
+  0, 27, 4, 58, 40, 66, 33, 44, 0, 33,
+  67, 0, 11, 33, 0, 10, 35, 17, 0, 0,
+  0, 0, 16, 0, 0, 0, 0, 12, 0, 0,
+  0, 9, 0, 67, 0, 25, 0, 38, 0, 0,
+  28, 0, 77, 30, 0, 0, 25, 0, 0, 0,
+  0, 0, 0, 0, 2, 0, 21, 0, 17, 0,
+  0, 0, 18, 29, 78, 0, 11, 0, 0, 0,
+  78, 36, 3, 0, 35, 3, 44, 7, 36, 20,
+  0, 27, 0, 26, 0, 8, 0, 0, 61, 33,
+  8, 16, 0, 0, 58, 0, 22, 29, 12, 37,
+  7, 0, 0, 0, 41, 0, 0, 0, 20, 0,
+  0, 0, 52, 0, 0, 31, 46, 0, 0, 50,
+  11, 21, 17, 0, 0, 0, 67, 0, 0, 42,
+  4, 106, 9, 17, 15, 45, 0, 24, 71, 0,
+  40, 19, 0, 0, 0, 3, 0, 0, 0, 0,
+  0, 10, 0, 0, 0, 0, 0, 0, 4, 19,
+  0, 50, 0, 0, 0, 45, 0, 0, 34, 65,
+  36, 45, 0, 0, 44, 0, 0, 0, 0, 0,
+  7, 0, 60, 7, 0, 7, 12, 15, 0, 0,
+  10, 2, 40, 0, 0, 0, 0, 1, 42, 35,
+  2, 0, 21, 0, 58, 15, 51, 12, 0, 30,
+  0, 0, 0, 9, 0, 0, 58, 45, 6, 2,
+  0, 0, 16, 0, 0, 13, 0, 3, 7, 0,
+  0, 0, 80, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 4, 12, 0, 20, 58, 19, 29,
+  24, 0, 0, 0, 79, 0, 0, 44, 19, 100,
+  0, 0, 0, 11, 0, 4, 57, 0, 28, 24,
+  0, 0, 2, 0, 0, 3, 5, 0, 0, 6,
+  0, 0, 0, 0, 0, 0, 0, 34, 0, 24,
+  0, 0, 6, 41, 0, 0, 50, 104, 10, 72,
+  18, 0, 43, 0, 5, 0, 0, 0, 14, 0,
+  25, 49, 0, 0, 0, 41, 0, 14, 1, 0,
+  14, 2, 0, 0, 0, 33, 14, 52, 21, 0,
+  21, 0, 41, 46, 70, 27, 15, 0, 0, 0,
+  0, 6, 30, 0, 57, 63, 0, 18, 0, 0,
+  0, 0, 0, 23, 55, 0, 32, 0, 0, 0,
+  90, 0, 14, 0, 0, 0, 5, 1, 0, 0,
+  20, 7, 0, 0, 11, 29, 0, 45, 2, 0,
+  17, 0, 59, 0, 0, 24, 0, 0, 0, 0,
+  0, 40, 1, 11, 70, 0, 8, 10, 0, 0,
+  32, 0, 0, 0, 26, 22, 0, 7, 0, 0,
+  17, 26, 2, 0, 47, 0, 0, 21, 13, 9,
+  8, 0, 0, 0, 39, 2, 0, 18, 67, 54,
+  46, 0, 21, 0, 0, 41, 60, 20, 72, 13,
+  27, 31, 0, 123, 0, 13, 17, 0, 0, 28,
+  28, 13, 17, 0, 23, 19, 0, 3, 26, 0,
+  27, 0, 23, 0, 0, 39, 0, 0, 0, 3,
+  33, 0, 52, 9, 4, 75, 0, 0, 0, 0,
+  0, 100, 0, 0, 2, 0, 0, 11, 51, 34,
+  23, 0, 31, 0, 14, 0, 0, 0, 3, 31,
+  7, 0, 11, 24, 0, 20, 0, 8, 0, 0,
+  72, 0, 0, 35, 0, 0, 0, 0, 0, 45,
+  6, 0, 35, 11, 0, 11, 0, 0, 13, 0,
+  0, 0, 2, 13, 0, 0, 0, 0, 29, 44,
+  34, 0, 50, 0, 0, 11, 0, 7, 0, 0,
+  0, 0, 8, 60, 0, 0, 108, 136, 34, 5,
+  37, 0, 0, 24, 71, 27, 134, 39, 0, 0,
+  0, 158, 66, 0, 9, 0, 0, 10, 0, 0,
+  39, 0, 9, 0, 13, 5, 9, 0, 4, 0,
+  70, 0, 0, 80, 0, 0, 27, 0, 26, 0,
+  39, 45, 33, 130, 0, 0, 0, 0, 0, 84,
+  0, 0, 0, 0, 0, 24, 23, 13, 0, 0,
+  36, 0, 0, 0, 0, 0, 23, 31, 12, 0,
+  0, 15, 0, 0, 0, 50, 0, 0, 53, 14,
+  0, 2, 0, 0, 0, 0, 0, 48, 12, 0,
+  0, 0, 0, 19, 0, 0, 0, 3, 0, 0,
+  3, 11, 0, 0, 0, 9, 43, 82, 35, 0,
+  70, 0, 5, 16, 0, 7, 7, 0, 0, 0,
+  0, 63, 0, 0, 57, 160, 47, 9, 35, 0,
+  0, 29, 57, 0, 153, 4, 0, 0, 0, 121,
+  122, 0, 14, 27, 0, 33, 0, 0, 46, 0,
+  6, 0, 5, 13, 16, 0, 0, 10, 64, 0,
+  0, 128, 0, 0, 35, 0, 0, 0, 10, 76,
+  58, 96, 0, 0, 0, 0, 0, 62, 0, 0,
+  0, 3, 0, 35, 0, 0, 0, 0, 53, 0,
+  0, 0, 0, 0, 18, 28, 29, 0, 0, 129,
+  0, 59, 30, 0, 80, 0, 63, 0, 2, 62,
+  41, 13, 24, 8, 0, 36, 0, 50, 73, 0,
+  0, 34, 40, 69, 39, 5, 0, 13, 44, 0,
+  63, 0, 17, 0, 0, 0, 0, 0, 0, 30,
+  0, 55, 31, 26, 0, 15, 0, 0, 34, 0,
+  63, 66, 0, 6, 53, 0, 0, 76, 13, 0,
+  0, 0, 0, 0, 32, 81, 0, 0, 0, 20,
+  0, 0, 48, 49, 0, 0, 0, 0, 65, 72,
+  1, 0, 21, 0, 34, 0, 17, 106, 73, 0,
+  0, 66, 0, 33, 16, 0, 73, 22, 0, 27,
+  0, 0, 0, 0, 17, 70, 123, 31, 8, 0,
+  18, 0, 19, 0, 0, 0, 0, 0, 16, 21,
+  113, 10, 49, 16, 11, 0, 4, 112, 0, 54,
+  23, 0, 15, 0, 85, 7, 0, 53, 5, 3,
+  0, 0, 0, 18, 0, 13, 49, 0, 0, 31,
+  10, 11, 45, 17, 0, 0, 0, 9, 32, 0,
+  23, 0, 0, 18, 0, 0, 0, 0, 0, 18,
+  25, 27, 0, 0, 0, 0, 33, 14, 7, 64,
+  44, 38, 45, 0, 0, 10, 0, 11, 7, 12,
+  0, 7, 17, 45, 0, 29, 0, 13, 26, 0,
+  1, 55, 0, 8, 5, 0, 20, 44, 16, 23,
+  0, 0, 15, 29, 38, 55, 93, 0, 0, 17,
+  0, 0, 52, 0, 35, 52, 0, 80, 0, 0,
+  0, 0, 0, 84, 112, 0, 31, 0, 15, 3,
+  1, 0, 0, 0, 0, 0, 3, 0, 28, 0,
+  45, 32, 0, 0, 29, 57, 0, 24, 0, 27,
+  0, 0, 42, 0, 0, 31, 0, 13, 0, 0,
+  0, 38, 15, 0, 3, 20, 0, 0, 0, 0,
+  2, 0, 0, 0, 0, 33, 0, 0, 0, 22,
+  12, 36, 5, 0, 22, 0, 25, 16, 5, 0,
+  6, 0, 0, 0, 0, 74, 0, 26, 125, 100,
+  30, 22, 18, 0, 0, 43, 75, 37, 102, 36,
+  0, 20, 0, 109, 123, 3, 27, 0, 0, 17,
+  0, 0, 34, 0, 0, 1, 35, 33, 3, 0,
+  0, 8, 62, 0, 21, 30, 0, 0, 38, 0,
+  43, 0, 9, 59, 0, 117, 0, 0, 0, 0,
+  0, 80, 21, 0, 14, 0, 0, 24, 0, 0,
+  0, 0, 10, 0, 0, 0, 0, 0, 32, 35,
+  0, 0, 0, 50, 11, 21, 17, 0, 0, 0,
+  67, 0, 0, 42, 4, 106, 9, 17, 15, 45,
+  0, 24, 71, 0, 40, 19, 0, 0, 0, 3,
+  0, 0, 0, 0, 0, 10, 0, 0, 0, 0,
+  0, 0, 4, 19, 0, 50, 0, 0, 0, 45,
+  0, 0, 34, 65, 36, 45, 0, 0, 44, 0,
+  0, 0, 0, 0, 7, 0, 60, 7, 0, 7,
+  12, 15, 0, 0, 10, 2, 40, 0, 0, 0,
+  0, 1, 42, 35, 2, 0, 21, 0, 58, 15,
+  51, 12, 0, 30, 0, 0, 0, 9, 0, 0,
+  58, 45, 6, 2, 0, 0, 16, 0, 0, 13,
+  0, 3, 7, 0, 0, 0, 80, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 4, 12, 0,
+  20, 58, 19, 29, 24, 0, 0, 0, 79, 0,
+  0, 44, 19, 100, 0, 0, 0, 11, 0, 4,
+  57, 0, 28, 24, 0, 0, 2, 0, 0, 3,
+  5, 0, 0, 6, 0, 0, 0, 0, 0, 0,
+  0, 34, 0, 24, 0, 0, 6, 41, 0, 0,
+  50, 104, 10, 72, 18, 0, 43, 0, 5, 0,
+  0, 0, 14, 0, 25, 49, 0, 0, 0, 41,
+  0, 14, 1, 0, 14, 2, 0, 0, 0, 33,
+  14, 52, 21, 0, 21, 0, 41, 46, 70, 27,
+  15, 0, 0, 0, 0, 6, 30, 0, 57, 63,
+  0, 18, 0, 0, 0, 0, 0, 23, 55, 0,
+  32, 0, 0, 0, 90, 0, 14, 0, 0, 0,
+  5, 1, 0, 0, 20, 7, 0, 0, 56, 103,
+  0, 45, 15, 0, 0, 0, 58, 0, 0, 52,
+  30, 60, 0, 0, 0, 11, 22, 8, 26, 0,
+  0, 48, 0, 0, 58, 0, 0, 0, 19, 13,
+  0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+  0, 14, 26, 11, 2, 0, 0, 0, 23, 83,
+  1, 41, 67, 0, 39, 3, 0, 0, 0, 31,
+  34, 12, 4, 15, 0, 13, 0, 63, 0, 12,
+  10, 0, 0, 36, 0, 0, 33, 0, 0, 39,
+  30, 13, 0, 0, 19, 60, 73, 69, 93, 0,
+  0, 0, 0, 0, 59, 0, 21, 68, 23, 82,
+  0, 0, 0, 0, 0, 52, 129, 3, 21, 0,
+  0, 7, 40, 0, 0, 0, 3, 0, 26, 0,
+  14, 0, 57, 39, 0, 0, 11, 24, 0, 20,
+  0, 8, 0, 0, 72, 0, 0, 35, 0, 0,
+  0, 0, 0, 45, 6, 0, 35, 11, 0, 11,
+  0, 0, 13, 0, 0, 0, 2, 13, 0, 0,
+  0, 0, 29, 44, 34, 0, 50, 0, 0, 11,
+  0, 7, 0, 0, 0, 0, 8, 60, 0, 0,
+  108, 136, 34, 5, 37, 0, 0, 24, 71, 27,
+  134, 39, 0, 0, 0, 158, 66, 0, 9, 0,
+  0, 10, 0, 0, 39, 0, 9, 0, 13, 5,
+  9, 0, 4, 0, 70, 0, 0, 80, 0, 0,
+  27, 0, 26, 0, 39, 45, 33, 130, 0, 0,
+  0, 0, 0, 84, 0, 0, 0, 0, 0, 24,
+  23, 13, 0, 0, 36, 0, 0, 0, 0, 0,
+  23, 31, 12, 0, 0, 15, 0, 0, 0, 50,
+  0, 0, 53, 14, 0, 2, 0, 0, 0, 0,
+  0, 48, 12, 0, 0, 0, 0, 19, 0, 0,
+  0, 3, 0, 0, 3, 11, 0, 0, 0, 9,
+  43, 82, 35, 0, 70, 0, 5, 16, 0, 7,
+  7, 0, 0, 0, 0, 63, 0, 0, 57, 160,
+  47, 9, 35, 0, 0, 29, 57, 0, 153, 4,
+  0, 0, 0, 121, 122, 0, 14, 27, 0, 33,
+  0, 0, 46, 0, 6, 0, 5, 13, 16, 0,
+  0, 10, 64, 0, 0, 128, 0, 0, 35, 0,
+  0, 0, 10, 76, 58, 96, 0, 0, 0, 0,
+  0, 62, 0, 0, 0, 3, 0, 35, 0, 0,
+  0, 0, 53, 0, 0, 0, 0, 0, 18, 28,
+  29, 0, 0, 39, 0, 0, 0, 29, 0, 0,
+  78, 47, 0, 0, 30, 0, 0, 88, 39, 61,
+  6, 17, 0, 0, 0, 41, 0, 0, 7, 53,
+  6, 0, 17, 0, 36, 0, 0, 0, 35, 96,
+  0, 0, 48, 0, 9, 30, 0, 28, 42, 19,
+  0, 0, 0, 32, 2, 0, 4, 101, 46, 8,
+  0, 0, 0, 0, 0, 0, 66, 0, 6, 4,
+  24, 53, 52, 0, 17, 37, 0, 49, 0, 0,
+  5, 0, 39, 0, 0, 0, 0, 1, 0, 30,
+  51, 0, 0, 131, 0, 0, 11, 0, 0, 0,
+  0, 86, 87, 31, 0, 0, 0, 0, 0, 48,
+  0, 13, 0, 11, 0, 8, 2, 0, 0, 2,
+  51, 0, 25, 0, 41, 0, 28, 12, 43, 0,
+  4, 112, 0, 54, 23, 0, 15, 0, 85, 7,
+  0, 53, 5, 3, 0, 0, 0, 18, 0, 13,
+  49, 0, 0, 31, 10, 11, 45, 17, 0, 0,
+  0, 9, 32, 0, 23, 0, 0, 18, 0, 0,
+  0, 0, 0, 18, 25, 27, 0, 0, 0, 0,
+  33, 14, 7, 64, 44, 38, 45, 0, 0, 10,
+  0, 11, 7, 12, 0, 7, 17, 45, 0, 29,
+  0, 13, 26, 0, 1, 55, 0, 8, 5, 0,
+  20, 44, 16, 23, 0, 0, 15, 29, 38, 55,
+  93, 0, 0, 17, 0, 0, 52, 0, 35, 52,
+  0, 80, 0, 0, 0, 0, 0, 84, 112, 0,
+  31, 0, 15, 3, 1, 0, 0, 0, 0, 0,
+  3, 0, 28, 0, 45, 32, 0, 0, 29, 57,
+  0, 24, 0, 27, 0, 0, 42, 0, 0, 31,
+  0, 13, 0, 0, 0, 38, 15, 0, 3, 20,
+  0, 0, 0, 0, 2, 0, 0, 0, 0, 33,
+  0, 0, 0, 22, 12, 36, 5, 0, 22, 0,
+  25, 16, 5, 0, 6, 0, 0, 0, 0, 74,
+  0, 26, 125, 100, 30, 22, 18, 0, 0, 43,
+  75, 37, 102, 36, 0, 20, 0, 109, 123, 3,
+  27, 0, 0, 17, 0, 0, 34, 0, 0, 1,
+  35, 33, 3, 0, 0, 8, 62, 0, 21, 30,
+  0, 0, 38, 0, 43, 0, 9, 59, 0, 117,
+  0, 0, 0, 0, 0, 80, 21, 0, 14, 0,
+  0, 24, 0, 0, 0, 0, 10, 0, 0, 0,
+  0, 0, 32, 35, 0, 0, 10, 25, 0, 0,
+  0, 85, 0, 0, 22, 0, 0, 0, 0, 0,
+  0, 0, 0, 39, 3, 8, 0, 40, 0, 0,
+  0, 0, 8, 3, 0, 0, 0, 38, 0, 0,
+  0, 43, 47, 68, 23, 0, 46, 0, 22, 15,
+  0, 13, 59, 13, 0, 0, 0, 55, 0, 0,
+  112, 118, 34, 26, 48, 0, 0, 57, 67, 0,
+  179, 5, 0, 32, 0, 139, 175, 0, 10, 15,
+  0, 0, 0, 0, 42, 0, 0, 0, 28, 19,
+  31, 0, 0, 11, 42, 0, 0, 116, 13, 0,
+  34, 0, 0, 0, 6, 54, 43, 142, 0, 0,
+  0, 0, 0, 58, 0, 0, 0, 29, 0, 30,
+  0, 10, 0, 0, 53, 0, 0, 0, 0, 0,
+  1, 29, 1, 6, 20, 58, 19, 29, 24, 0,
+  0, 0, 79, 0, 0, 44, 19, 100, 0, 0,
+  0, 11, 0, 4, 57, 0, 28, 24, 0, 0,
+  2, 0, 0, 3, 5, 0, 0, 6, 0, 0,
+  0, 0, 0, 0, 0, 34, 0, 24, 0, 0,
+  6, 41, 0, 0, 50, 104, 10, 72, 18, 0,
+  43, 0, 5, 0, 0, 0, 14, 0, 25, 49,
+  0, 0, 0, 41, 0, 14, 1, 0, 14, 2,
+  0, 0, 0, 33, 14, 52, 21, 0, 21, 0,
+  41, 46, 70, 27, 15, 0, 0, 0, 0, 6,
+  30, 0, 57, 63, 0, 18, 0, 0, 0, 0,
+  0, 23, 55, 0, 32, 0, 0, 0, 90, 0,
+  14, 0, 0, 0, 5, 1, 0, 0, 20, 7,
+  0, 0, 56, 103, 0, 45, 15, 0, 0, 0,
+  58, 0, 0, 52, 30, 60, 0, 0, 0, 11,
+  22, 8, 26, 0, 0, 48, 0, 0, 58, 0,
+  0, 0, 19, 13, 0, 0, 3, 0, 0, 0,
+  0, 0, 0, 0, 0, 14, 26, 11, 2, 0,
+  0, 0, 23, 83, 1, 41, 67, 0, 39, 3,
+  0, 0, 0, 31, 34, 12, 4, 15, 0, 13,
+  0, 63, 0, 12, 10, 0, 0, 36, 0, 0,
+  33, 0, 0, 39, 30, 13, 0, 0, 19, 60,
+  73, 69, 93, 0, 0, 0, 0, 0, 59, 0,
+  21, 68, 23, 82, 0, 0, 0, 0, 0, 52,
+  129, 3, 21, 0, 0, 7, 40, 0, 0, 0,
+  3, 0, 26, 0, 14, 0, 57, 39, 0, 0,
+  46, 82, 0, 50, 1, 35, 0, 0, 22, 0,
+  0, 15, 41, 6, 0, 0, 0, 19, 21, 11,
+  13, 31, 0, 0, 0, 0, 64, 0, 0, 0,
+  30, 54, 0, 0, 28, 29, 0, 17, 0, 0,
+  0, 0, 1, 18, 5, 11, 10, 0, 0, 0,
+  0, 57, 0, 22, 95, 48, 30, 4, 0, 0,
+  0, 73, 54, 11, 88, 0, 0, 66, 0, 94,
+  130, 13, 9, 0, 0, 4, 0, 2, 68, 0,
+  0, 0, 23, 16, 20, 0, 0, 28, 33, 13,
+  56, 0, 0, 0, 6, 0, 47, 0, 18, 68,
+  22, 150, 0, 0, 0, 0, 0, 82, 91, 0,
+  7, 26, 10, 31, 0, 0, 0, 0, 31, 0,
+  0, 0, 0, 0, 50, 35, 0, 2, 0, 15,
+  0, 0, 0, 50, 0, 0, 53, 14, 0, 2,
+  0, 0, 0, 0, 0, 48, 12, 0, 0, 0,
+  0, 19, 0, 0, 0, 3, 0, 0, 3, 11,
+  0, 0, 0, 9, 43, 82, 35, 0, 70, 0,
+  5, 16, 0, 7, 7, 0, 0, 0, 0, 63,
+  0, 0, 57, 160, 47, 9, 35, 0, 0, 29,
+  57, 0, 153, 4, 0, 0, 0, 121, 122, 0,
+  14, 27, 0, 33, 0, 0, 46, 0, 6, 0,
+  5, 13, 16, 0, 0, 10, 64, 0, 0, 128,
+  0, 0, 35, 0, 0, 0, 10, 76, 58, 96,
+  0, 0, 0, 0, 0, 62, 0, 0, 0, 3,
+  0, 35, 0, 0, 0, 0, 53, 0, 0, 0,
+  0, 0, 18, 28, 29, 0, 0, 39, 0, 0,
+  0, 29, 0, 0, 78, 47, 0, 0, 30, 0,
+  0, 88, 39, 61, 6, 17, 0, 0, 0, 41,
+  0, 0, 7, 53, 6, 0, 17, 0, 36, 0,
+  0, 0, 35, 96, 0, 0, 48, 0, 9, 30,
+  0, 28, 42, 19, 0, 0, 0, 32, 2, 0,
+  4, 101, 46, 8, 0, 0, 0, 0, 0, 0,
+  66, 0, 6, 4, 24, 53, 52, 0, 17, 37,
+  0, 49, 0, 0, 5, 0, 39, 0, 0, 0,
+  0, 1, 0, 30, 51, 0, 0, 131, 0, 0,
+  11, 0, 0, 0, 0, 86, 87, 31, 0, 0,
+  0, 0, 0, 48, 0, 13, 0, 11, 0, 8,
+  2, 0, 0, 2, 51, 0, 25, 0, 41, 0,
+  28, 12, 43, 0, 0, 93, 41, 0, 7, 0,
+  52, 3, 86, 40, 12, 0, 76, 3, 0, 125,
+  70, 39, 2, 33, 0, 0, 0, 54, 36, 13,
+  16, 61, 3, 0, 21, 0, 90, 1, 0, 0,
+  0, 58, 0, 29, 9, 0, 26, 52, 0, 59,
+  72, 36, 0, 44, 0, 0, 84, 12, 0, 0,
+  22, 0, 0, 42, 0, 0, 0, 0, 0, 0,
+  47, 0, 62, 0, 0, 0, 2, 50, 38, 28,
+  0, 0, 0, 0, 77, 11, 8, 0, 0, 21,
+  0, 22, 43, 0, 0, 57, 0, 32, 0, 0,
+  0, 0, 0, 79, 66, 0, 0, 0, 15, 0,
+  10, 29, 0, 69, 0, 1, 0, 0, 0, 0,
+  0, 36, 65, 0, 62, 0, 139, 0, 57, 16,
+  25, 0, 29, 57, 0, 24, 0, 27, 0, 0,
+  42, 0, 0, 31, 0, 13, 0, 0, 0, 38,
+  15, 0, 3, 20, 0, 0, 0, 0, 2, 0,
+  0, 0, 0, 33, 0, 0, 0, 22, 12, 36,
+  5, 0, 22, 0, 25, 16, 5, 0, 6, 0,
+  0, 0, 0, 74, 0, 26, 125, 100, 30, 22,
+  18, 0, 0, 43, 75, 37, 102, 36, 0, 20,
+  0, 109, 123, 3, 27, 0, 0, 17, 0, 0,
+  34, 0, 0, 1, 35, 33, 3, 0, 0, 8,
+  62, 0, 21, 30, 0, 0, 38, 0, 43, 0,
+  9, 59, 0, 117, 0, 0, 0, 0, 0, 80,
+  21, 0, 14, 0, 0, 24, 0, 0, 0, 0,
+  10, 0, 0, 0, 0, 0, 32, 35, 0, 0,
+  10, 25, 0, 0, 0, 85, 0, 0, 22, 0,
+  0, 0, 0, 0, 0, 0, 0, 39, 3, 8,
+  0, 40, 0, 0, 0, 0, 8, 3, 0, 0,
+  0, 38, 0, 0, 0, 43, 47, 68, 23, 0,
+  46, 0, 22, 15, 0, 13, 59, 13, 0, 0,
+  0, 55, 0, 0, 112, 118, 34, 26, 48, 0,
+  0, 57, 67, 0, 179, 5, 0, 32, 0, 139,
+  175, 0, 10, 15, 0, 0, 0, 0, 42, 0,
+  0, 0, 28, 19, 31, 0, 0, 11, 42, 0,
+  0, 116, 13, 0, 34, 0, 0, 0, 6, 54,
+  43, 142, 0, 0, 0, 0, 0, 58, 0, 0,
+  0, 29, 0, 30, 0, 10, 0, 0, 53, 0,
+  0, 0, 0, 0, 1, 29, 1, 6, 0, 37,
+  0, 0, 0, 81, 0, 0, 83, 32, 0, 0,
+  0, 9, 0, 42, 6, 26, 0, 10, 0, 0,
+  0, 25, 0, 0, 22, 40, 7, 0, 0, 0,
+  67, 0, 0, 20, 33, 86, 0, 0, 32, 0,
+  0, 10, 0, 67, 54, 81, 0, 26, 0, 6,
+  0, 0, 25, 36, 58, 0, 32, 0, 0, 65,
+  0, 0, 102, 0, 0, 34, 25, 57, 85, 0,
+  33, 59, 0, 79, 0, 0, 3, 0, 3, 0,
+  2, 0, 0, 0, 0, 49, 15, 0, 0, 173,
+  0, 0, 0, 0, 0, 0, 0, 64, 113, 110,
+  0, 0, 0, 0, 0, 29, 0, 22, 0, 30,
+  0, 19, 0, 0, 0, 29, 61, 0, 40, 0,
+  0, 0, 0, 15, 1, 35, 56, 103, 0, 45,
+  15, 0, 0, 0, 58, 0, 0, 52, 30, 60,
+  0, 0, 0, 11, 22, 8, 26, 0, 0, 48,
+  0, 0, 58, 0, 0, 0, 19, 13, 0, 0,
+  3, 0, 0, 0, 0, 0, 0, 0, 0, 14,
+  26, 11, 2, 0, 0, 0, 23, 83, 1, 41,
+  67, 0, 39, 3, 0, 0, 0, 31, 34, 12,
+  4, 15, 0, 13, 0, 63, 0, 12, 10, 0,
+  0, 36, 0, 0, 33, 0, 0, 39, 30, 13,
+  0, 0, 19, 60, 73, 69, 93, 0, 0, 0,
+  0, 0, 59, 0, 21, 68, 23, 82, 0, 0,
+  0, 0, 0, 52, 129, 3, 21, 0, 0, 7,
+  40, 0, 0, 0, 3, 0, 26, 0, 14, 0,
+  57, 39, 0, 0, 46, 82, 0, 50, 1, 35,
+  0, 0, 22, 0, 0, 15, 41, 6, 0, 0,
+  0, 19, 21, 11, 13, 31, 0, 0, 0, 0,
+  64, 0, 0, 0, 30, 54, 0, 0, 28, 29,
+  0, 17, 0, 0, 0, 0, 1, 18, 5, 11,
+  10, 0, 0, 0, 0, 57, 0, 22, 95, 48,
+  30, 4, 0, 0, 0, 73, 54, 11, 88, 0,
+  0, 66, 0, 94, 130, 13, 9, 0, 0, 4,
+  0, 2, 68, 0, 0, 0, 23, 16, 20, 0,
+  0, 28, 33, 13, 56, 0, 0, 0, 6, 0,
+  47, 0, 18, 68, 22, 150, 0, 0, 0, 0,
+  0, 82, 91, 0, 7, 26, 10, 31, 0, 0,
+  0, 0, 31, 0, 0, 0, 0, 0, 50, 35,
+  0, 2, 1, 12, 0, 19, 0, 115, 0, 0,
+  17, 0, 0, 0, 0, 1, 0, 0, 0, 28,
+  11, 16, 0, 65, 2, 0, 0, 0, 23, 0,
+  0, 0, 0, 17, 8, 0, 9, 65, 12, 45,
+  5, 0, 48, 0, 0, 18, 0, 33, 46, 0,
+  0, 7, 0, 29, 0, 0, 131, 59, 54, 5,
+  43, 0, 0, 107, 51, 0, 166, 0, 0, 46,
+  0, 112, 193, 0, 44, 0, 0, 35, 0, 0,
+  29, 0, 0, 0, 32, 0, 28, 0, 0, 1,
+  14, 0, 0, 79, 16, 0, 38, 0, 0, 0,
+  3, 61, 47, 127, 0, 0, 0, 0, 0, 36,
+  0, 0, 0, 55, 0, 53, 0, 0, 0, 0,
+  47, 0, 0, 0, 0, 0, 13, 18, 0, 12,
+  0, 39, 0, 0, 0, 29, 0, 0, 78, 47,
+  0, 0, 30, 0, 0, 88, 39, 61, 6, 17,
+  0, 0, 0, 41, 0, 0, 7, 53, 6, 0,
+  17, 0, 36, 0, 0, 0, 35, 96, 0, 0,
+  48, 0, 9, 30, 0, 28, 42, 19, 0, 0,
+  0, 32, 2, 0, 4, 101, 46, 8, 0, 0,
+  0, 0, 0, 0, 66, 0, 6, 4, 24, 53,
+  52, 0, 17, 37, 0, 49, 0, 0, 5, 0,
+  39, 0, 0, 0, 0, 1, 0, 30, 51, 0,
+  0, 131, 0, 0, 11, 0, 0, 0, 0, 86,
+  87, 31, 0, 0, 0, 0, 0, 48, 0, 13,
+  0, 11, 0, 8, 2, 0, 0, 2, 51, 0,
+  25, 0, 41, 0, 28, 12, 43, 0, 0, 93,
+  41, 0, 7, 0, 52, 3, 86, 40, 12, 0,
+  76, 3, 0, 125, 70, 39, 2, 33, 0, 0,
+  0, 54, 36, 13, 16, 61, 3, 0, 21, 0,
+  90, 1, 0, 0, 0, 58, 0, 29, 9, 0,
+  26, 52, 0, 59, 72, 36, 0, 44, 0, 0,
+  84, 12, 0, 0, 22, 0, 0, 42, 0, 0,
+  0, 0, 0, 0, 47, 0, 62, 0, 0, 0,
+  2, 50, 38, 28, 0, 0, 0, 0, 77, 11,
+  8, 0, 0, 21, 0, 22, 43, 0, 0, 57,
+  0, 32, 0, 0, 0, 0, 0, 79, 66, 0,
+  0, 0, 15, 0, 10, 29, 0, 69, 0, 1,
+  0, 0, 0, 0, 0, 36, 65, 0, 62, 0,
+  139, 0, 57, 16, 25, 0, 0, 58, 49, 0,
+  14, 0, 50, 16, 63, 8, 3, 26, 61, 1,
+  7, 53, 52, 0, 0, 15, 0, 27, 43, 19,
+  23, 0, 0, 13, 0, 0, 0, 0, 41, 0,
+  0, 6, 0, 16, 0, 79, 0, 24, 0, 55,
+  1, 70, 61, 46, 0, 21, 0, 20, 72, 1,
+  0, 0, 29, 0, 0, 0, 15, 36, 0, 43,
+  0, 14, 0, 0, 79, 0, 0, 0, 7, 27,
+  66, 15, 34, 28, 0, 0, 79, 0, 29, 0,
+  25, 0, 16, 0, 0, 0, 0, 0, 0, 17,
+  0, 26, 0, 0, 5, 71, 31, 0, 0, 0,
+  26, 0, 28, 0, 0, 38, 0, 0, 0, 2,
+  0, 0, 2, 14, 69, 0, 27, 0, 63, 0,
+  43, 7, 17, 0, 10, 25, 0, 0, 0, 85,
+  0, 0, 22, 0, 0, 0, 0, 0, 0, 0,
+  0, 39, 3, 8, 0, 40, 0, 0, 0, 0,
+  8, 3, 0, 0, 0, 38, 0, 0, 0, 43,
+  47, 68, 23, 0, 46, 0, 22, 15, 0, 13,
+  59, 13, 0, 0, 0, 55, 0, 0, 112, 118,
+  34, 26, 48, 0, 0, 57, 67, 0, 179, 5,
+  0, 32, 0, 139, 175, 0, 10, 15, 0, 0,
+  0, 0, 42, 0, 0, 0, 28, 19, 31, 0,
+  0, 11, 42, 0, 0, 116, 13, 0, 34, 0,
+  0, 0, 6, 54, 43, 142, 0, 0, 0, 0,
+  0, 58, 0, 0, 0, 29, 0, 30, 0, 10,
+  0, 0, 53, 0, 0, 0, 0, 0, 1, 29,
+  1, 6, 0, 37, 0, 0, 0, 81, 0, 0,
+  83, 32, 0, 0, 0, 9, 0, 42, 6, 26,
+  0, 10, 0, 0, 0, 25, 0, 0, 22, 40,
+  7, 0, 0, 0, 67, 0, 0, 20, 33, 86,
+  0, 0, 32, 0, 0, 10, 0, 67, 54, 81,
+  0, 26, 0, 6, 0, 0, 25, 36, 58, 0,
+  32, 0, 0, 65, 0, 0, 102, 0, 0, 34,
+  25, 57, 85, 0, 33, 59, 0, 79, 0, 0,
+  3, 0, 3, 0, 2, 0, 0, 0, 0, 49,
+  15, 0, 0, 173, 0, 0, 0, 0, 0, 0,
+  0, 64, 113, 110, 0, 0, 0, 0, 0, 29,
+  0, 22, 0, 30, 0, 19, 0, 0, 0, 29,
+  61, 0, 40, 0, 0, 0, 0, 15, 1, 35,
+  0, 34, 21, 0, 0, 0, 48, 33, 91, 15,
+  14, 16, 57, 1, 0, 81, 49, 0, 0, 0,
+  6, 20, 26, 30, 1, 0, 0, 23, 0, 0,
+  0, 0, 60, 0, 3, 0, 0, 56, 0, 42,
+  4, 5, 0, 43, 0, 101, 57, 64, 0, 36,
+  0, 14, 67, 0, 0, 0, 60, 0, 18, 0,
+  6, 36, 0, 46, 0, 0, 0, 0, 80, 0,
+  0, 0, 27, 50, 26, 48, 16, 11, 0, 0,
+  59, 0, 25, 0, 0, 9, 9, 3, 5, 0,
+  0, 63, 0, 14, 0, 0, 0, 0, 4, 79,
+  88, 0, 0, 0, 17, 0, 30, 2, 0, 51,
+  0, 7, 0, 20, 0, 0, 0, 31, 77, 0,
+  50, 0, 85, 0, 42, 0, 14, 0, 46, 82,
+  0, 50, 1, 35, 0, 0, 22, 0, 0, 15,
+  41, 6, 0, 0, 0, 19, 21, 11, 13, 31,
+  0, 0, 0, 0, 64, 0, 0, 0, 30, 54,
+  0, 0, 28, 29, 0, 17, 0, 0, 0, 0,
+  1, 18, 5, 11, 10, 0, 0, 0, 0, 57,
+  0, 22, 95, 48, 30, 4, 0, 0, 0, 73,
+  54, 11, 88, 0, 0, 66, 0, 94, 130, 13,
+  9, 0, 0, 4, 0, 2, 68, 0, 0, 0,
+  23, 16, 20, 0, 0, 28, 33, 13, 56, 0,
+  0, 0, 6, 0, 47, 0, 18, 68, 22, 150,
+  0, 0, 0, 0, 0, 82, 91, 0, 7, 26,
+  10, 31, 0, 0, 0, 0, 31, 0, 0, 0,
+  0, 0, 50, 35, 0, 2, 1, 12, 0, 19,
+  0, 115, 0, 0, 17, 0, 0, 0, 0, 1,
+  0, 0, 0, 28, 11, 16, 0, 65, 2, 0,
+  0, 0, 23, 0, 0, 0, 0, 17, 8, 0,
+  9, 65, 12, 45, 5, 0, 48, 0, 0, 18,
+  0, 33, 46, 0, 0, 7, 0, 29, 0, 0,
+  131, 59, 54, 5, 43, 0, 0, 107, 51, 0,
+  166, 0, 0, 46, 0, 112, 193, 0, 44, 0,
+  0, 35, 0, 0, 29, 0, 0, 0, 32, 0,
+  28, 0, 0, 1, 14, 0, 0, 79, 16, 0,
+  38, 0, 0, 0, 3, 61, 47, 127, 0, 0,
+  0, 0, 0, 36, 0, 0, 0, 55, 0, 53,
+  0, 0, 0, 0, 47, 0, 0, 0, 0, 0,
+  13, 18, 0, 12, 0, 1, 0, 0, 0, 57,
+  0, 18, 70, 15, 0, 4, 0, 0, 0, 50,
+  13, 20, 0, 0, 47, 47, 29, 12, 0, 0,
+  0, 10, 0, 0, 0, 0, 50, 0, 0, 44,
+  0, 64, 0, 0, 54, 0, 0, 47, 0, 99,
+  16, 46, 0, 15, 0, 37, 0, 0, 63, 0,
+  74, 0, 64, 0, 0, 62, 0, 0, 90, 0,
+  0, 12, 30, 23, 61, 0, 70, 60, 0, 76,
+  0, 1, 0, 0, 21, 0, 0, 0, 0, 0,
+  8, 0, 5, 0, 0, 121, 9, 0, 0, 0,
+  0, 0, 20, 54, 116, 17, 0, 0, 0, 0,
+  11, 9, 0, 21, 0, 19, 0, 73, 0, 0,
+  0, 0, 56, 0, 53, 0, 0, 0, 21, 0,
+  18, 0, 0, 93, 41, 0, 7, 0, 52, 3,
+  86, 40, 12, 0, 76, 3, 0, 125, 70, 39,
+  2, 33, 0, 0, 0, 54, 36, 13, 16, 61,
+  3, 0, 21, 0, 90, 1, 0, 0, 0, 58,
+  0, 29, 9, 0, 26, 52, 0, 59, 72, 36,
+  0, 44, 0, 0, 84, 12, 0, 0, 22, 0,
+  0, 42, 0, 0, 0, 0, 0, 0, 47, 0,
+  62, 0, 0, 0, 2, 50, 38, 28, 0, 0,
+  0, 0, 77, 11, 8, 0, 0, 21, 0, 22,
+  43, 0, 0, 57, 0, 32, 0, 0, 0, 0,
+  0, 79, 66, 0, 0, 0, 15, 0, 10, 29,
+  0, 69, 0, 1, 0, 0, 0, 0, 0, 36,
+  65, 0, 62, 0, 139, 0, 57, 16, 25, 0,
+  0, 58, 49, 0, 14, 0, 50, 16, 63, 8,
+  3, 26, 61, 1, 7, 53, 52, 0, 0, 15,
+  0, 27, 43, 19, 23, 0, 0, 13, 0, 0,
+  0, 0, 41, 0, 0, 6, 0, 16, 0, 79,
+  0, 24, 0, 55, 1, 70, 61, 46, 0, 21,
+  0, 20, 72, 1, 0, 0, 29, 0, 0, 0,
+  15, 36, 0, 43, 0, 14, 0, 0, 79, 0,
+  0, 0, 7, 27, 66, 15, 34, 28, 0, 0,
+  79, 0, 29, 0, 25, 0, 16, 0, 0, 0,
+  0, 0, 0, 17, 0, 26, 0, 0, 5, 71,
+  31, 0, 0, 0, 26, 0, 28, 0, 0, 38,
+  0, 0, 0, 2, 0, 0, 2, 14, 69, 0,
+  27, 0, 63, 0, 43, 7, 17, 0, 0, 6,
+  0, 0, 0, 1, 30, 12, 26, 0, 0, 25,
+  43, 0, 8, 23, 56, 23, 0, 0, 32, 29,
+  18, 2, 25, 0, 0, 0, 0, 0, 0, 0,
+  36, 17, 0, 0, 0, 0, 0, 34, 0, 11,
+  0, 58, 21, 87, 29, 59, 0, 1, 0, 52,
+  63, 0, 3, 0, 12, 0, 0, 0, 25, 4,
+  0, 38, 0, 10, 4, 0, 42, 0, 34, 0,
+  0, 17, 34, 0, 45, 41, 0, 0, 77, 0,
+  55, 0, 5, 0, 14, 0, 0, 0, 0, 31,
+  0, 0, 0, 22, 0, 0, 32, 57, 30, 0,
+  0, 9, 8, 0, 15, 0, 0, 13, 0, 14,
+  0, 2, 0, 0, 29, 0, 33, 0, 14, 0,
+  33, 0, 13, 6, 20, 0, 0, 37, 0, 0,
+  0, 81, 0, 0, 83, 32, 0, 0, 0, 9,
+  0, 42, 6, 26, 0, 10, 0, 0, 0, 25,
+  0, 0, 22, 40, 7, 0, 0, 0, 67, 0,
+  0, 20, 33, 86, 0, 0, 32, 0, 0, 10,
+  0, 67, 54, 81, 0, 26, 0, 6, 0, 0,
+  25, 36, 58, 0, 32, 0, 0, 65, 0, 0,
+  102, 0, 0, 34, 25, 57, 85, 0, 33, 59,
+  0, 79, 0, 0, 3, 0, 3, 0, 2, 0,
+  0, 0, 0, 49, 15, 0, 0, 173, 0, 0,
+  0, 0, 0, 0, 0, 64, 113, 110, 0, 0,
+  0, 0, 0, 29, 0, 22, 0, 30, 0, 19,
+  0, 0, 0, 29, 61, 0, 40, 0, 0, 0,
+  0, 15, 1, 35, 0, 34, 21, 0, 0, 0,
+  48, 33, 91, 15, 14, 16, 57, 1, 0, 81,
+  49, 0, 0, 0, 6, 20, 26, 30, 1, 0,
+  0, 23, 0, 0, 0, 0, 60, 0, 3, 0,
+  0, 56, 0, 42, 4, 5, 0, 43, 0, 101,
+  57, 64, 0, 36, 0, 14, 67, 0, 0, 0,
+  60, 0, 18, 0, 6, 36, 0, 46, 0, 0,
+  0, 0, 80, 0, 0, 0, 27, 50, 26, 48,
+  16, 11, 0, 0, 59, 0, 25, 0, 0, 9,
+  9, 3, 5, 0, 0, 63, 0, 14, 0, 0,
+  0, 0, 4, 79, 88, 0, 0, 0, 17, 0,
+  30, 2, 0, 51, 0, 7, 0, 20, 0, 0,
+  0, 31, 77, 0, 50, 0, 85, 0, 42, 0,
+  14, 0, 0, 27, 0, 6, 0, 0, 33, 17,
+  40, 0, 12, 29, 62, 0, 14, 33, 65, 28,
+  0, 0, 26, 32, 26, 12, 42, 0, 0, 27,
+  0, 0, 0, 0, 69, 0, 0, 0, 0, 14,
+  0, 40, 0, 14, 0, 40, 23, 88, 0, 29,
+  0, 18, 0, 24, 66, 1, 4, 0, 0, 0,
+  0, 0, 30, 14, 0, 50, 0, 7, 42, 0,
+  37, 0, 0, 0, 0, 48, 16, 0, 58, 78,
+  0, 0, 60, 0, 43, 4, 0, 14, 12, 0,
+  0, 2, 0, 24, 0, 6, 0, 25, 4, 0,
+  5, 84, 38, 0, 0, 3, 48, 0, 12, 5,
+  0, 1, 0, 12, 0, 2, 0, 0, 15, 0,
+  12, 0, 16, 0, 60, 0, 26, 0, 25, 0,
+  1, 12, 0, 19, 0, 115, 0, 0, 17, 0,
+  0, 0, 0, 1, 0, 0, 0, 28, 11, 16,
+  0, 65, 2, 0, 0, 0, 23, 0, 0, 0,
+  0, 17, 8, 0, 9, 65, 12, 45, 5, 0,
+  48, 0, 0, 18, 0, 33, 46, 0, 0, 7,
+  0, 29, 0, 0, 131, 59, 54, 5, 43, 0,
+  0, 107, 51, 0, 166, 0, 0, 46, 0, 112,
+  193, 0, 44, 0, 0, 35, 0, 0, 29, 0,
+  0, 0, 32, 0, 28, 0, 0, 1, 14, 0,
+  0, 79, 16, 0, 38, 0, 0, 0, 3, 61,
+  47, 127, 0, 0, 0, 0, 0, 36, 0, 0,
+  0, 55, 0, 53, 0, 0, 0, 0, 47, 0,
+  0, 0, 0, 0, 13, 18, 0, 12, 0, 1,
+  0, 0, 0, 57, 0, 18, 70, 15, 0, 4,
+  0, 0, 0, 50, 13, 20, 0, 0, 47, 47,
+  29, 12, 0, 0, 0, 10, 0, 0, 0, 0,
+  50, 0, 0, 44, 0, 64, 0, 0, 54, 0,
+  0, 47, 0, 99, 16, 46, 0, 15, 0, 37,
+  0, 0, 63, 0, 74, 0, 64, 0, 0, 62,
+  0, 0, 90, 0, 0, 12, 30, 23, 61, 0,
+  70, 60, 0, 76, 0, 1, 0, 0, 21, 0,
+  0, 0, 0, 0, 8, 0, 5, 0, 0, 121,
+  9, 0, 0, 0, 0, 0, 20, 54, 116, 17,
+  0, 0, 0, 0, 11, 9, 0, 21, 0, 19,
+  0, 73, 0, 0, 0, 0, 56, 0, 53, 0,
+  0, 0, 21, 0, 18, 0, 0, 48, 16, 0,
+  0, 0, 50, 44, 75, 3, 3, 42, 110, 0,
+  16, 61, 79, 13, 2, 0, 31, 54, 4, 6,
+  49, 0, 0, 45, 0, 0, 0, 0, 83, 0,
+  2, 0, 0, 62, 0, 80, 0, 35, 4, 49,
+  18, 97, 6, 35, 0, 42, 0, 40, 48, 0,
+  23, 0, 3, 0, 0, 0, 0, 5, 0, 59,
+  0, 17, 20, 0, 40, 0, 0, 0, 0, 48,
+  8, 0, 29, 54, 0, 0, 33, 0, 42, 5,
+  0, 9, 4, 0, 0, 8, 0, 4, 0, 44,
+  0, 13, 5, 8, 15, 84, 41, 0, 0, 0,
+  34, 0, 24, 13, 4, 22, 0, 21, 0, 22,
+  0, 0, 0, 0, 35, 0, 31, 0, 111, 0,
+  71, 0, 32, 0, 0, 58, 49, 0, 14, 0,
+  50, 16, 63, 8, 3, 26, 61, 1, 7, 53,
+  52, 0, 0, 15, 0, 27, 43, 19, 23, 0,
+  0, 13, 0, 0, 0, 0, 41, 0, 0, 6,
+  0, 16, 0, 79, 0, 24, 0, 55, 1, 70,
+  61, 46, 0, 21, 0, 20, 72, 1, 0, 0,
+  29, 0, 0, 0, 15, 36, 0, 43, 0, 14,
+  0, 0, 79, 0, 0, 0, 7, 27, 66, 15,
+  34, 28, 0, 0, 79, 0, 29, 0, 25, 0,
+  16, 0, 0, 0, 0, 0, 0, 17, 0, 26,
+  0, 0, 5, 71, 31, 0, 0, 0, 26, 0,
+  28, 0, 0, 38, 0, 0, 0, 2, 0, 0,
+  2, 14, 69, 0, 27, 0, 63, 0, 43, 7,
+  17, 0, 0, 6, 0, 0, 0, 1, 30, 12,
+  26, 0, 0, 25, 43, 0, 8, 23, 56, 23,
+  0, 0, 32, 29, 18, 2, 25, 0, 0, 0,
+  0, 0, 0, 0, 36, 17, 0, 0, 0, 0,
+  0, 34, 0, 11, 0, 58, 21, 87, 29, 59,
+  0, 1, 0, 52, 63, 0, 3, 0, 12, 0,
+  0, 0, 25, 4, 0, 38, 0, 10, 4, 0,
+  42, 0, 34, 0, 0, 17, 34, 0, 45, 41,
+  0, 0, 77, 0, 55, 0, 5, 0, 14, 0,
+  0, 0, 0, 31, 0, 0, 0, 22, 0, 0,
+  32, 57, 30, 0, 0, 9, 8, 0, 15, 0,
+  0, 13, 0, 14, 0, 2, 0, 0, 29, 0,
+  33, 0, 14, 0, 33, 0, 13, 6, 20, 0,
+  0, 5, 0, 30, 11, 9, 0, 0, 16, 0,
+  14, 0, 28, 0, 0, 43, 62, 17, 0, 4,
+  0, 0, 0, 14, 39, 0, 19, 14, 0, 0,
+  0, 0, 39, 51, 0, 0, 0, 0, 8, 0,
+  0, 0, 0, 26, 0, 76, 41, 64, 0, 17,
+  0, 73, 78, 15, 1, 58, 0, 0, 0, 0,
+  35, 0, 0, 26, 0, 0, 54, 0, 52, 39,
+  59, 0, 0, 16, 4, 0, 13, 36, 0, 0,
+  89, 0, 49, 0, 0, 20, 1, 30, 0, 0,
+  0, 79, 0, 0, 39, 0, 21, 0, 17, 79,
+  53, 5, 0, 14, 0, 0, 0, 9, 0, 17,
+  0, 33, 0, 25, 0, 0, 3, 0, 0, 0,
+  0, 0, 77, 0, 14, 5, 4, 0, 0, 34,
+  21, 0, 0, 0, 48, 33, 91, 15, 14, 16,
+  57, 1, 0, 81, 49, 0, 0, 0, 6, 20,
+  26, 30, 1, 0, 0, 23, 0, 0, 0, 0,
+  60, 0, 3, 0, 0, 56, 0, 42, 4, 5,
+  0, 43, 0, 101, 57, 64, 0, 36, 0, 14,
+  67, 0, 0, 0, 60, 0, 18, 0, 6, 36,
+  0, 46, 0, 0, 0, 0, 80, 0, 0, 0,
+  27, 50, 26, 48, 16, 11, 0, 0, 59, 0,
+  25, 0, 0, 9, 9, 3, 5, 0, 0, 63,
+  0, 14, 0, 0, 0, 0, 4, 79, 88, 0,
+  0, 0, 17, 0, 30, 2, 0, 51, 0, 7,
+  0, 20, 0, 0, 0, 31, 77, 0, 50, 0,
+  85, 0, 42, 0, 14, 0, 0, 27, 0, 6,
+  0, 0, 33, 17, 40, 0, 12, 29, 62, 0,
+  14, 33, 65, 28, 0, 0, 26, 32, 26, 12,
+  42, 0, 0, 27, 0, 0, 0, 0, 69, 0,
+  0, 0, 0, 14, 0, 40, 0, 14, 0, 40,
+  23, 88, 0, 29, 0, 18, 0, 24, 66, 1,
+  4, 0, 0, 0, 0, 0, 30, 14, 0, 50,
+  0, 7, 42, 0, 37, 0, 0, 0, 0, 48,
+  16, 0, 58, 78, 0, 0, 60, 0, 43, 4,
+  0, 14, 12, 0, 0, 2, 0, 24, 0, 6,
+  0, 25, 4, 0, 5, 84, 38, 0, 0, 3,
+  48, 0, 12, 5, 0, 1, 0, 12, 0, 2,
+  0, 0, 15, 0, 12, 0, 16, 0, 60, 0,
+  26, 0, 25, 0, 32, 14, 0, 17, 0, 0,
+  0, 0, 0, 0, 1, 1, 16, 0, 0, 0,
+  49, 11, 3, 0, 0, 29, 0, 16, 72, 0,
+  37, 30, 0, 0, 0, 15, 79, 12, 0, 0,
+  0, 13, 41, 0, 0, 0, 0, 11, 0, 105,
+  32, 28, 0, 0, 0, 8, 36, 0, 22, 20,
+  3, 0, 0, 0, 87, 22, 0, 54, 0, 0,
+  130, 30, 67, 49, 31, 0, 0, 36, 0, 0,
+  48, 46, 0, 0, 36, 0, 58, 28, 0, 42,
+  0, 0, 0, 0, 0, 73, 0, 0, 0, 0,
+  0, 0, 0, 113, 49, 57, 10, 33, 35, 37,
+  0, 0, 24, 0, 0, 52, 0, 0, 0, 0,
+  4, 0, 10, 0, 8, 0, 23, 0, 0, 0,
+  31, 19, 0, 1, 0, 0, 0, 57, 0, 18,
+  70, 15, 0, 4, 0, 0, 0, 50, 13, 20,
+  0, 0, 47, 47, 29, 12, 0, 0, 0, 10,
+  0, 0, 0, 0, 50, 0, 0, 44, 0, 64,
+  0, 0, 54, 0, 0, 47, 0, 99, 16, 46,
+  0, 15, 0, 37, 0, 0, 63, 0, 74, 0,
+  64, 0, 0, 62, 0, 0, 90, 0, 0, 12,
+  30, 23, 61, 0, 70, 60, 0, 76, 0, 1,
+  0, 0, 21, 0, 0, 0, 0, 0, 8, 0,
+  5, 0, 0, 121, 9, 0, 0, 0, 0, 0,
+  20, 54, 116, 17, 0, 0, 0, 0, 11, 9,
+  0, 21, 0, 19, 0, 73, 0, 0, 0, 0,
+  56, 0, 53, 0, 0, 0, 21, 0, 18, 0,
+  0, 48, 16, 0, 0, 0, 50, 44, 75, 3,
+  3, 42, 110, 0, 16, 61, 79, 13, 2, 0,
+  31, 54, 4, 6, 49, 0, 0, 45, 0, 0,
+  0, 0, 83, 0, 2, 0, 0, 62, 0, 80,
+  0, 35, 4, 49, 18, 97, 6, 35, 0, 42,
+  0, 40, 48, 0, 23, 0, 3, 0, 0, 0,
+  0, 5, 0, 59, 0, 17, 20, 0, 40, 0,
+  0, 0, 0, 48, 8, 0, 29, 54, 0, 0,
+  33, 0, 42, 5, 0, 9, 4, 0, 0, 8,
+  0, 4, 0, 44, 0, 13, 5, 8, 15, 84,
+  41, 0, 0, 0, 34, 0, 24, 13, 4, 22,
+  0, 21, 0, 22, 0, 0, 0, 0, 35, 0,
+  31, 0, 111, 0, 71, 0, 32, 0, 3, 37,
+  0, 0, 14, 0, 32, 0, 0, 0, 3, 23,
+  56, 0, 0, 4, 62, 15, 4, 0, 0, 72,
+  0, 17, 107, 0, 0, 48, 0, 0, 0, 48,
+  90, 0, 0, 0, 0, 51, 43, 7, 0, 46,
+  21, 29, 25, 100, 41, 0, 0, 5, 0, 0,
+  5, 0, 27, 0, 7, 0, 20, 2, 58, 63,
+  0, 50, 0, 0, 97, 52, 73, 0, 0, 0,
+  9, 20, 30, 0, 53, 59, 0, 0, 0, 0,
+  39, 57, 10, 31, 0, 0, 0, 14, 0, 0,
+  0, 54, 0, 21, 0, 18, 0, 113, 24, 11,
+  22, 20, 39, 43, 10, 0, 43, 0, 0, 50,
+  0, 0, 0, 0, 10, 1, 48, 0, 7, 0,
+  27, 0, 30, 0, 30, 47, 0, 6, 0, 0,
+  0, 1, 30, 12, 26, 0, 0, 25, 43, 0,
+  8, 23, 56, 23, 0, 0, 32, 29, 18, 2,
+  25, 0, 0, 0, 0, 0, 0, 0, 36, 17,
+  0, 0, 0, 0, 0, 34, 0, 11, 0, 58,
+  21, 87, 29, 59, 0, 1, 0, 52, 63, 0,
+  3, 0, 12, 0, 0, 0, 25, 4, 0, 38,
+  0, 10, 4, 0, 42, 0, 34, 0, 0, 17,
+  34, 0, 45, 41, 0, 0, 77, 0, 55, 0,
+  5, 0, 14, 0, 0, 0, 0, 31, 0, 0,
+  0, 22, 0, 0, 32, 57, 30, 0, 0, 9,
+  8, 0, 15, 0, 0, 13, 0, 14, 0, 2,
+  0, 0, 29, 0, 33, 0, 14, 0, 33, 0,
+  13, 6, 20, 0, 0, 5, 0, 30, 11, 9,
+  0, 0, 16, 0, 14, 0, 28, 0, 0, 43,
+  62, 17, 0, 4, 0, 0, 0, 14, 39, 0,
+  19, 14, 0, 0, 0, 0, 39, 51, 0, 0,
+  0, 0, 8, 0, 0, 0, 0, 26, 0, 76,
+  41, 64, 0, 17, 0, 73, 78, 15, 1, 58,
+  0, 0, 0, 0, 35, 0, 0, 26, 0, 0,
+  54, 0, 52, 39, 59, 0, 0, 16, 4, 0,
+  13, 36, 0, 0, 89, 0, 49, 0, 0, 20,
+  1, 30, 0, 0, 0, 79, 0, 0, 39, 0,
+  21, 0, 17, 79, 53, 5, 0, 14, 0, 0,
+  0, 9, 0, 17, 0, 33, 0, 25, 0, 0,
+  3, 0, 0, 0, 0, 0, 77, 0, 14, 5,
+  4, 0, 0, 37, 0, 30, 19, 0, 8, 0,
+  29, 1, 5, 0, 23, 0, 24, 68, 78, 31,
+  0, 2, 0, 0, 0, 40, 45, 0, 20, 28,
+  0, 0, 7, 0, 46, 69, 0, 0, 0, 8,
+  7, 0, 0, 0, 0, 16, 0, 35, 63, 39,
+  0, 11, 0, 42, 72, 27, 0, 30, 0, 4,
+  0, 3, 38, 0, 0, 31, 0, 0, 79, 0,
+  75, 41, 0, 0, 0, 12, 16, 0, 14, 1,
+  0, 0, 85, 0, 26, 0, 0, 32, 0, 18,
+  6, 0, 14, 72, 0, 6, 28, 0, 15, 0,
+  0, 80, 18, 0, 0, 7, 0, 0, 0, 0,
+  2, 22, 0, 30, 8, 22, 3, 0, 0, 0,
+  0, 0, 0, 0, 101, 0, 9, 26, 7, 0,
+  0, 27, 0, 6, 0, 0, 33, 17, 40, 0,
+  12, 29, 62, 0, 14, 33, 65, 28, 0, 0,
+  26, 32, 26, 12, 42, 0, 0, 27, 0, 0,
+  0, 0, 69, 0, 0, 0, 0, 14, 0, 40,
+  0, 14, 0, 40, 23, 88, 0, 29, 0, 18,
+  0, 24, 66, 1, 4, 0, 0, 0, 0, 0,
+  30, 14, 0, 50, 0, 7, 42, 0, 37, 0,
+  0, 0, 0, 48, 16, 0, 58, 78, 0, 0,
+  60, 0, 43, 4, 0, 14, 12, 0, 0, 2,
+  0, 24, 0, 6, 0, 25, 4, 0, 5, 84,
+  38, 0, 0, 3, 48, 0, 12, 5, 0, 1,
+  0, 12, 0, 2, 0, 0, 15, 0, 12, 0,
+  16, 0, 60, 0, 26, 0, 25, 0, 32, 14,
+  0, 17, 0, 0, 0, 0, 0, 0, 1, 1,
+  16, 0, 0, 0, 49, 11, 3, 0, 0, 29,
+  0, 16, 72, 0, 37, 30, 0, 0, 0, 15,
+  79, 12, 0, 0, 0, 13, 41, 0, 0, 0,
+  0, 11, 0, 105, 32, 28, 0, 0, 0, 8,
+  36, 0, 22, 20, 3, 0, 0, 0, 87, 22,
+  0, 54, 0, 0, 130, 30, 67, 49, 31, 0,
+  0, 36, 0, 0, 48, 46, 0, 0, 36, 0,
+  58, 28, 0, 42, 0, 0, 0, 0, 0, 73,
+  0, 0, 0, 0, 0, 0, 0, 113, 49, 57,
+  10, 33, 35, 37, 0, 0, 24, 0, 0, 52,
+  0, 0, 0, 0, 4, 0, 10, 0, 8, 0,
+  23, 0, 0, 0, 31, 19, 12, 13, 0, 21,
+  6, 5, 0, 0, 11, 0, 0, 0, 48, 0,
+  0, 18, 58, 12, 0, 0, 0, 8, 0, 28,
+  33, 0, 31, 20, 0, 0, 0, 2, 67, 50,
+  0, 0, 0, 26, 49, 0, 0, 0, 0, 31,
+  0, 97, 52, 74, 0, 0, 0, 36, 26, 0,
+  0, 44, 0, 0, 0, 0, 64, 9, 0, 12,
+  0, 0, 87, 26, 88, 48, 67, 0, 0, 16,
+  0, 0, 28, 0, 0, 0, 33, 0, 46, 22,
+  0, 32, 0, 0, 2, 0, 0, 84, 0, 0,
+  12, 0, 0, 0, 1, 115, 49, 54, 0, 40,
+  17, 26, 0, 0, 9, 0, 0, 49, 0, 16,
+  0, 0, 0, 0, 29, 0, 1, 0, 46, 0,
+  0, 0, 33, 16, 0, 48, 16, 0, 0, 0,
+  50, 44, 75, 3, 3, 42, 110, 0, 16, 61,
+  79, 13, 2, 0, 31, 54, 4, 6, 49, 0,
+  0, 45, 0, 0, 0, 0, 83, 0, 2, 0,
+  0, 62, 0, 80, 0, 35, 4, 49, 18, 97,
+  6, 35, 0, 42, 0, 40, 48, 0, 23, 0,
+  3, 0, 0, 0, 0, 5, 0, 59, 0, 17,
+  20, 0, 40, 0, 0, 0, 0, 48, 8, 0,
+  29, 54, 0, 0, 33, 0, 42, 5, 0, 9,
+  4, 0, 0, 8, 0, 4, 0, 44, 0, 13,
+  5, 8, 15, 84, 41, 0, 0, 0, 34, 0,
+  24, 13, 4, 22, 0, 21, 0, 22, 0, 0,
+  0, 0, 35, 0, 31, 0, 111, 0, 71, 0,
+  32, 0, 3, 37, 0, 0, 14, 0, 32, 0,
+  0, 0, 3, 23, 56, 0, 0, 4, 62, 15,
+  4, 0, 0, 72, 0, 17, 107, 0, 0, 48,
+  0, 0, 0, 48, 90, 0, 0, 0, 0, 51,
+  43, 7, 0, 46, 21, 29, 25, 100, 41, 0,
+  0, 5, 0, 0, 5, 0, 27, 0, 7, 0,
+  20, 2, 58, 63, 0, 50, 0, 0, 97, 52,
+  73, 0, 0, 0, 9, 20, 30, 0, 53, 59,
+  0, 0, 0, 0, 39, 57, 10, 31, 0, 0,
+  0, 14, 0, 0, 0, 54, 0, 21, 0, 18,
+  0, 113, 24, 11, 22, 20, 39, 43, 10, 0,
+  43, 0, 0, 50, 0, 0, 0, 0, 10, 1,
+  48, 0, 7, 0, 27, 0, 30, 0, 30, 47,
+  0, 22, 0, 0, 13, 12, 20, 0, 30, 0,
+  12, 20, 47, 4, 0, 16, 61, 0, 3, 0,
+  0, 56, 0, 10, 36, 0, 0, 41, 0, 0,
+  2, 0, 51, 24, 0, 0, 0, 75, 57, 0,
+  0, 1, 0, 46, 0, 115, 40, 68, 0, 0,
+  0, 16, 0, 0, 30, 32, 30, 0, 49, 0,
+  37, 54, 0, 31, 7, 0, 25, 63, 98, 0,
+  89, 0, 26, 32, 28, 22, 29, 0, 0, 0,
+  0, 0, 23, 34, 22, 43, 0, 13, 0, 0,
+  0, 67, 0, 29, 0, 0, 0, 0, 28, 122,
+  64, 34, 0, 28, 14, 55, 5, 5, 0, 0,
+  0, 59, 0, 9, 0, 5, 0, 38, 80, 0,
+  0, 0, 7, 0, 12, 0, 22, 22, 0, 5,
+  0, 30, 11, 9, 0, 0, 16, 0, 14, 0,
+  28, 0, 0, 43, 62, 17, 0, 4, 0, 0,
+  0, 14, 39, 0, 19, 14, 0, 0, 0, 0,
+  39, 51, 0, 0, 0, 0, 8, 0, 0, 0,
+  0, 26, 0, 76, 41, 64, 0, 17, 0, 73,
+  78, 15, 1, 58, 0, 0, 0, 0, 35, 0,
+  0, 26, 0, 0, 54, 0, 52, 39, 59, 0,
+  0, 16, 4, 0, 13, 36, 0, 0, 89, 0,
+  49, 0, 0, 20, 1, 30, 0, 0, 0, 79,
+  0, 0, 39, 0, 21, 0, 17, 79, 53, 5,
+  0, 14, 0, 0, 0, 9, 0, 17, 0, 33,
+  0, 25, 0, 0, 3, 0, 0, 0, 0, 0,
+  77, 0, 14, 5, 4, 0, 0, 37, 0, 30,
+  19, 0, 8, 0, 29, 1, 5, 0, 23, 0,
+  24, 68, 78, 31, 0, 2, 0, 0, 0, 40,
+  45, 0, 20, 28, 0, 0, 7, 0, 46, 69,
+  0, 0, 0, 8, 7, 0, 0, 0, 0, 16,
+  0, 35, 63, 39, 0, 11, 0, 42, 72, 27,
+  0, 30, 0, 4, 0, 3, 38, 0, 0, 31,
+  0, 0, 79, 0, 75, 41, 0, 0, 0, 12,
+  16, 0, 14, 1, 0, 0, 85, 0, 26, 0,
+  0, 32, 0, 18, 6, 0, 14, 72, 0, 6,
+  28, 0, 15, 0, 0, 80, 18, 0, 0, 7,
+  0, 0, 0, 0, 2, 22, 0, 30, 8, 22,
+  3, 0, 0, 0, 0, 0, 0, 0, 101, 0,
+  9, 26, 7, 0, 0, 119, 31, 10, 0, 0,
+  55, 0, 33, 18, 0, 0, 0, 0, 46, 39,
+  65, 38, 5, 18, 0, 0, 0, 46, 49, 6,
+  24, 40, 0, 0, 0, 0, 84, 26, 0, 0,
+  0, 16, 0, 3, 0, 0, 24, 17, 0, 45,
+  64, 6, 0, 10, 0, 0, 73, 0, 0, 0,
+  32, 0, 0, 35, 7, 5, 0, 0, 0, 0,
+  63, 0, 26, 11, 0, 0, 0, 15, 64, 26,
+  8, 27, 5, 0, 67, 3, 18, 28, 0, 6,
+  0, 0, 1, 26, 36, 0, 0, 22, 0, 0,
+  0, 0, 0, 60, 6, 0, 0, 0, 2, 0,
+  43, 0, 35, 36, 0, 21, 0, 19, 0, 0,
+  0, 0, 13, 0, 0, 0, 95, 0, 24, 41,
+  20, 0, 32, 14, 0, 17, 0, 0, 0, 0,
+  0, 0, 1, 1, 16, 0, 0, 0, 49, 11,
+  3, 0, 0, 29, 0, 16, 72, 0, 37, 30,
+  0, 0, 0, 15, 79, 12, 0, 0, 0, 13,
+  41, 0, 0, 0, 0, 11, 0, 105, 32, 28,
+  0, 0, 0, 8, 36, 0, 22, 20, 3, 0,
+  0, 0, 87, 22, 0, 54, 0, 0, 130, 30,
+  67, 49, 31, 0, 0, 36, 0, 0, 48, 46,
+  0, 0, 36, 0, 58, 28, 0, 42, 0, 0,
+  0, 0, 0, 73, 0, 0, 0, 0, 0, 0,
+  0, 113, 49, 57, 10, 33, 35, 37, 0, 0,
+  24, 0, 0, 52, 0, 0, 0, 0, 4, 0,
+  10, 0, 8, 0, 23, 0, 0, 0, 31, 19,
+  12, 13, 0, 21, 6, 5, 0, 0, 11, 0,
+  0, 0, 48, 0, 0, 18, 58, 12, 0, 0,
+  0, 8, 0, 28, 33, 0, 31, 20, 0, 0,
+  0, 2, 67, 50, 0, 0, 0, 26, 49, 0,
+  0, 0, 0, 31, 0, 97, 52, 74, 0, 0,
+  0, 36, 26, 0, 0, 44, 0, 0, 0, 0,
+  64, 9, 0, 12, 0, 0, 87, 26, 88, 48,
+  67, 0, 0, 16, 0, 0, 28, 0, 0, 0,
+  33, 0, 46, 22, 0, 32, 0, 0, 2, 0,
+  0, 84, 0, 0, 12, 0, 0, 0, 1, 115,
+  49, 54, 0, 40, 17, 26, 0, 0, 9, 0,
+  0, 49, 0, 16, 0, 0, 0, 0, 29, 0,
+  1, 0, 46, 0, 0, 0, 33, 16, 0, 98,
+  0, 20, 14, 0, 60, 12, 44, 16, 32, 0,
+  54, 0, 44, 107, 104, 30, 6, 0, 0, 0,
+  0, 40, 41, 45, 0, 53, 0, 0, 0, 0,
+  87, 64, 0, 0, 0, 27, 0, 41, 0, 0,
+  16, 28, 30, 44, 24, 53, 0, 28, 0, 0,
+  87, 10, 0, 0, 0, 14, 0, 58, 10, 0,
+  0, 24, 0, 0, 75, 0, 41, 0, 0, 0,
+  0, 48, 17, 40, 0, 0, 0, 12, 73, 0,
+  9, 26, 0, 32, 2, 2, 0, 43, 49, 36,
+  0, 65, 0, 26, 0, 0, 0, 86, 27, 0,
+  0, 0, 9, 0, 28, 10, 24, 30, 0, 17,
+  0, 27, 0, 0, 0, 0, 2, 0, 8, 0,
+  164, 0, 52, 9, 40, 0, 3, 37, 0, 0,
+  14, 0, 32, 0, 0, 0, 3, 23, 56, 0,
+  0, 4, 62, 15, 4, 0, 0, 72, 0, 17,
+  107, 0, 0, 48, 0, 0, 0, 48, 90, 0,
+  0, 0, 0, 51, 43, 7, 0, 46, 21, 29,
+  25, 100, 41, 0, 0, 5, 0, 0, 5, 0,
+  27, 0, 7, 0, 20, 2, 58, 63, 0, 50,
+  0, 0, 97, 52, 73, 0, 0, 0, 9, 20,
+  30, 0, 53, 59, 0, 0, 0, 0, 39, 57,
+  10, 31, 0, 0, 0, 14, 0, 0, 0, 54,
+  0, 21, 0, 18, 0, 113, 24, 11, 22, 20,
+  39, 43, 10, 0, 43, 0, 0, 50, 0, 0,
+  0, 0, 10, 1, 48, 0, 7, 0, 27, 0,
+  30, 0, 30, 47, 0, 22, 0, 0, 13, 12,
+  20, 0, 30, 0, 12, 20, 47, 4, 0, 16,
+  61, 0, 3, 0, 0, 56, 0, 10, 36, 0,
+  0, 41, 0, 0, 2, 0, 51, 24, 0, 0,
+  0, 75, 57, 0, 0, 1, 0, 46, 0, 115,
+  40, 68, 0, 0, 0, 16, 0, 0, 30, 32,
+  30, 0, 49, 0, 37, 54, 0, 31, 7, 0,
+  25, 63, 98, 0, 89, 0, 26, 32, 28, 22,
+  29, 0, 0, 0, 0, 0, 23, 34, 22, 43,
+  0, 13, 0, 0, 0, 67, 0, 29, 0, 0,
+  0, 0, 28, 122, 64, 34, 0, 28, 14, 55,
+  5, 5, 0, 0, 0, 59, 0, 9, 0, 5,
+  0, 38, 80, 0, 0, 0, 7, 0, 12, 0,
+  22, 22, 0, 49, 0, 0, 0, 0, 12, 0,
+  80, 43, 25, 0, 73, 2, 0, 149, 100, 43,
+  17, 0, 0, 0, 0, 25, 0, 0, 21, 90,
+  9, 0, 9, 0, 115, 13, 0, 0, 4, 73,
+  0, 0, 23, 0, 0, 26, 0, 80, 0, 54,
+  0, 37, 0, 15, 61, 0, 0, 23, 13, 7,
+  0, 32, 0, 0, 0, 0, 0, 0, 27, 12,
+  61, 0, 7, 0, 0, 98, 0, 66, 0, 13,
+  0, 0, 19, 3, 24, 48, 0, 47, 3, 23,
+  13, 19, 53, 124, 0, 32, 23, 0, 0, 0,
+  0, 90, 142, 0, 0, 0, 8, 0, 0, 33,
+  0, 34, 0, 47, 0, 22, 0, 0, 0, 0,
+  6, 0, 0, 0, 122, 0, 29, 0, 52, 16,
+  0, 37, 0, 30, 19, 0, 8, 0, 29, 1,
+  5, 0, 23, 0, 24, 68, 78, 31, 0, 2,
+  0, 0, 0, 40, 45, 0, 20, 28, 0, 0,
+  7, 0, 46, 69, 0, 0, 0, 8, 7, 0,
+  0, 0, 0, 16, 0, 35, 63, 39, 0, 11,
+  0, 42, 72, 27, 0, 30, 0, 4, 0, 3,
+  38, 0, 0, 31, 0, 0, 79, 0, 75, 41,
+  0, 0, 0, 12, 16, 0, 14, 1, 0, 0,
+  85, 0, 26, 0, 0, 32, 0, 18, 6, 0,
+  14, 72, 0, 6, 28, 0, 15, 0, 0, 80,
+  18, 0, 0, 7, 0, 0, 0, 0, 2, 22,
+  0, 30, 8, 22, 3, 0, 0, 0, 0, 0,
+  0, 0, 101, 0, 9, 26, 7, 0, 0, 119,
+  31, 10, 0, 0, 55, 0, 33, 18, 0, 0,
+  0, 0, 46, 39, 65, 38, 5, 18, 0, 0,
+  0, 46, 49, 6, 24, 40, 0, 0, 0, 0,
+  84, 26, 0, 0, 0, 16, 0, 3, 0, 0,
+  24, 17, 0, 45, 64, 6, 0, 10, 0, 0,
+  73, 0, 0, 0, 32, 0, 0, 35, 7, 5,
+  0, 0, 0, 0, 63, 0, 26, 11, 0, 0,
+  0, 15, 64, 26, 8, 27, 5, 0, 67, 3,
+  18, 28, 0, 6, 0, 0, 1, 26, 36, 0,
+  0, 22, 0, 0, 0, 0, 0, 60, 6, 0,
+  0, 0, 2, 0, 43, 0, 35, 36, 0, 21,
+  0, 19, 0, 0, 0, 0, 13, 0, 0, 0,
+  95, 0, 24, 41, 20, 0, 0, 104, 16, 18,
+  0, 0, 0, 0, 47, 19, 0, 0, 6, 0,
+  7, 17, 36, 23, 0, 2, 0, 0, 72, 39,
+  0, 0, 14, 29, 0, 0, 0, 0, 40, 0,
+  36, 14, 0, 1, 11, 0, 0, 0, 22, 32,
+  0, 52, 25, 0, 0, 0, 0, 42, 40, 0,
+  22, 0, 44, 0, 3, 0, 0, 33, 0, 0,
+  52, 0, 0, 0, 0, 10, 106, 0, 39, 32,
+  46, 45, 0, 59, 28, 0, 21, 0, 1, 31,
+  0, 0, 5, 21, 26, 0, 31, 0, 0, 0,
+  5, 0, 0, 0, 0, 52, 28, 23, 1, 0,
+  7, 59, 48, 1, 0, 29, 0, 28, 0, 8,
+  0, 0, 0, 0, 0, 12, 0, 0, 0, 0,
+  49, 26, 5, 0, 12, 13, 0, 21, 6, 5,
+  0, 0, 11, 0, 0, 0, 48, 0, 0, 18,
+  58, 12, 0, 0, 0, 8, 0, 28, 33, 0,
+  31, 20, 0, 0, 0, 2, 67, 50, 0, 0,
+  0, 26, 49, 0, 0, 0, 0, 31, 0, 97,
+  52, 74, 0, 0, 0, 36, 26, 0, 0, 44,
+  0, 0, 0, 0, 64, 9, 0, 12, 0, 0,
+  87, 26, 88, 48, 67, 0, 0, 16, 0, 0,
+  28, 0, 0, 0, 33, 0, 46, 22, 0, 32,
+  0, 0, 2, 0, 0, 84, 0, 0, 12, 0,
+  0, 0, 1, 115, 49, 54, 0, 40, 17, 26,
+  0, 0, 9, 0, 0, 49, 0, 16, 0, 0,
+  0, 0, 29, 0, 1, 0, 46, 0, 0, 0,
+  33, 16, 0, 98, 0, 20, 14, 0, 60, 12,
+  44, 16, 32, 0, 54, 0, 44, 107, 104, 30,
+  6, 0, 0, 0, 0, 40, 41, 45, 0, 53,
+  0, 0, 0, 0, 87, 64, 0, 0, 0, 27,
+  0, 41, 0, 0, 16, 28, 30, 44, 24, 53,
+  0, 28, 0, 0, 87, 10, 0, 0, 0, 14,
+  0, 58, 10, 0, 0, 24, 0, 0, 75, 0,
+  41, 0, 0, 0, 0, 48, 17, 40, 0, 0,
+  0, 12, 73, 0, 9, 26, 0, 32, 2, 2,
+  0, 43, 49, 36, 0, 65, 0, 26, 0, 0,
+  0, 86, 27, 0, 0, 0, 9, 0, 28, 10,
+  24, 30, 0, 17, 0, 27, 0, 0, 0, 0,
+  2, 0, 8, 0, 164, 0, 52, 9, 40, 0,
+  0, 111, 49, 4, 4, 0, 0, 13, 78, 36,
+  24, 0, 20, 0, 0, 97, 83, 24, 24, 5,
+  0, 0, 48, 50, 0, 0, 1, 78, 1, 0,
+  0, 0, 68, 0, 12, 0, 0, 28, 0, 3,
+  0, 0, 11, 19, 11, 36, 0, 0, 0, 29,
+  0, 18, 44, 0, 0, 0, 1, 0, 0, 8,
+  0, 0, 0, 0, 0, 0, 29, 0, 0, 0,
+  0, 0, 32, 72, 9, 90, 0, 112, 2, 20,
+  35, 0, 0, 53, 0, 31, 6, 61, 21, 24,
+  117, 0, 0, 0, 26, 0, 0, 0, 0, 100,
+  90, 0, 0, 0, 7, 0, 54, 21, 0, 21,
+  0, 0, 0, 15, 0, 0, 0, 0, 0, 21,
+  0, 0, 73, 0, 76, 10, 35, 0, 0, 22,
+  0, 0, 13, 12, 20, 0, 30, 0, 12, 20,
+  47, 4, 0, 16, 61, 0, 3, 0, 0, 56,
+  0, 10, 36, 0, 0, 41, 0, 0, 2, 0,
+  51, 24, 0, 0, 0, 75, 57, 0, 0, 1,
+  0, 46, 0, 115, 40, 68, 0, 0, 0, 16,
+  0, 0, 30, 32, 30, 0, 49, 0, 37, 54,
+  0, 31, 7, 0, 25, 63, 98, 0, 89, 0,
+  26, 32, 28, 22, 29, 0, 0, 0, 0, 0,
+  23, 34, 22, 43, 0, 13, 0, 0, 0, 67,
+  0, 29, 0, 0, 0, 0, 28, 122, 64, 34,
+  0, 28, 14, 55, 5, 5, 0, 0, 0, 59,
+  0, 9, 0, 5, 0, 38, 80, 0, 0, 0,
+  7, 0, 12, 0, 22, 22, 0, 49, 0, 0,
+  0, 0, 12, 0, 80, 43, 25, 0, 73, 2,
+  0, 149, 100, 43, 17, 0, 0, 0, 0, 25,
+  0, 0, 21, 90, 9, 0, 9, 0, 115, 13,
+  0, 0, 4, 73, 0, 0, 23, 0, 0, 26,
+  0, 80, 0, 54, 0, 37, 0, 15, 61, 0,
+  0, 23, 13, 7, 0, 32, 0, 0, 0, 0,
+  0, 0, 27, 12, 61, 0, 7, 0, 0, 98,
+  0, 66, 0, 13, 0, 0, 19, 3, 24, 48,
+  0, 47, 3, 23, 13, 19, 53, 124, 0, 32,
+  23, 0, 0, 0, 0, 90, 142, 0, 0, 0,
+  8, 0, 0, 33, 0, 34, 0, 47, 0, 22,
+  0, 0, 0, 0, 6, 0, 0, 0, 122, 0,
+  29, 0, 52, 16, 0, 27, 108, 0, 0, 0,
+  0, 0, 90, 42, 15, 0, 26, 53, 0, 84,
+  60, 35, 50, 0, 0, 15, 20, 31, 0, 0,
+  3, 111, 0, 0, 0, 0, 61, 0, 0, 0,
+  0, 79, 0, 0, 3, 0, 0, 0, 0, 28,
+  0, 0, 0, 35, 0, 82, 11, 0, 69, 0,
+  27, 18, 0, 0, 0, 0, 0, 0, 27, 0,
+  48, 0, 11, 70, 0, 0, 22, 90, 0, 69,
+  0, 68, 0, 0, 7, 0, 32, 92, 0, 47,
+  0, 58, 48, 0, 85, 34, 0, 0, 11, 0,
+  0, 0, 0, 133, 125, 0, 0, 0, 8, 0,
+  0, 61, 0, 16, 7, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 45, 0, 54, 0,
+  21, 46, 0, 119, 31, 10, 0, 0, 55, 0,
+  33, 18, 0, 0, 0, 0, 46, 39, 65, 38,
+  5, 18, 0, 0, 0, 46, 49, 6, 24, 40,
+  0, 0, 0, 0, 84, 26, 0, 0, 0, 16,
+  0, 3, 0, 0, 24, 17, 0, 45, 64, 6,
+  0, 10, 0, 0, 73, 0, 0, 0, 32, 0,
+  0, 35, 7, 5, 0, 0, 0, 0, 63, 0,
+  26, 11, 0, 0, 0, 15, 64, 26, 8, 27,
+  5, 0, 67, 3, 18, 28, 0, 6, 0, 0,
+  1, 26, 36, 0, 0, 22, 0, 0, 0, 0,
+  0, 60, 6, 0, 0, 0, 2, 0, 43, 0,
+  35, 36, 0, 21, 0, 19, 0, 0, 0, 0,
+  13, 0, 0, 0, 95, 0, 24, 41, 20, 0,
+  0, 104, 16, 18, 0, 0, 0, 0, 47, 19,
+  0, 0, 6, 0, 7, 17, 36, 23, 0, 2,
+  0, 0, 72, 39, 0, 0, 14, 29, 0, 0,
+  0, 0, 40, 0, 36, 14, 0, 1, 11, 0,
+  0, 0, 22, 32, 0, 52, 25, 0, 0, 0,
+  0, 42, 40, 0, 22, 0, 44, 0, 3, 0,
+  0, 33, 0, 0, 52, 0, 0, 0, 0, 10,
+  106, 0, 39, 32, 46, 45, 0, 59, 28, 0,
+  21, 0, 1, 31, 0, 0, 5, 21, 26, 0,
+  31, 0, 0, 0, 5, 0, 0, 0, 0, 52,
+  28, 23, 1, 0, 7, 59, 48, 1, 0, 29,
+  0, 28, 0, 8, 0, 0, 0, 0, 0, 12,
+  0, 0, 0, 0, 49, 26, 5, 0, 107, 66,
+  16, 65, 30, 0, 0, 17, 71, 14, 28, 0,
+  85, 0, 0, 80, 60, 0, 13, 0, 0, 32,
+  32, 6, 0, 0, 0, 61, 0, 37, 19, 69,
+  10, 6, 18, 5, 0, 44, 103, 0, 0, 23,
+  0, 23, 18, 0, 0, 0, 0, 0, 0, 86,
+  0, 0, 83, 13, 32, 36, 9, 0, 0, 0,
+  0, 0, 15, 55, 0, 0, 11, 0, 91, 19,
+  43, 55, 0, 39, 28, 49, 0, 26, 0, 0,
+  19, 64, 28, 26, 14, 0, 86, 0, 32, 0,
+  0, 14, 0, 0, 66, 0, 5, 67, 43, 0,
+  9, 0, 0, 58, 0, 60, 9, 0, 6, 0,
+  0, 0, 0, 0, 0, 0, 0, 15, 0, 4,
+  0, 18, 46, 15, 12, 30, 0, 98, 0, 20,
+  14, 0, 60, 12, 44, 16, 32, 0, 54, 0,
+  44, 107, 104, 30, 6, 0, 0, 0, 0, 40,
+  41, 45, 0, 53, 0, 0, 0, 0, 87, 64,
+  0, 0, 0, 27, 0, 41, 0, 0, 16, 28,
+  30, 44, 24, 53, 0, 28, 0, 0, 87, 10,
+  0, 0, 0, 14, 0, 58, 10, 0, 0, 24,
+  0, 0, 75, 0, 41, 0, 0, 0, 0, 48,
+  17, 40, 0, 0, 0, 12, 73, 0, 9, 26,
+  0, 32, 2, 2, 0, 43, 49, 36, 0, 65,
+  0, 26, 0, 0, 0, 86, 27, 0, 0, 0,
+  9, 0, 28, 10, 24, 30, 0, 17, 0, 27,
+  0, 0, 0, 0, 2, 0, 8, 0, 164, 0,
+  52, 9, 40, 0, 0, 111, 49, 4, 4, 0,
+  0, 13, 78, 36, 24, 0, 20, 0, 0, 97,
+  83, 24, 24, 5, 0, 0, 48, 50, 0, 0,
+  1, 78, 1, 0, 0, 0, 68, 0, 12, 0,
+  0, 28, 0, 3, 0, 0, 11, 19, 11, 36,
+  0, 0, 0, 29, 0, 18, 44, 0, 0, 0,
+  1, 0, 0, 8, 0, 0, 0, 0, 0, 0,
+  29, 0, 0, 0, 0, 0, 32, 72, 9, 90,
+  0, 112, 2, 20, 35, 0, 0, 53, 0, 31,
+  6, 61, 21, 24, 117, 0, 0, 0, 26, 0,
+  0, 0, 0, 100, 90, 0, 0, 0, 7, 0,
+  54, 21, 0, 21, 0, 0, 0, 15, 0, 0,
+  0, 0, 0, 21, 0, 0, 73, 0, 76, 10,
+  35, 0, 59, 1, 72, 42, 0, 0, 0, 22,
+  38, 13, 13, 6, 0, 7, 0, 21, 38, 13,
+  14, 0, 0, 64, 43, 11, 0, 0, 1, 54,
+  0, 38, 0, 39, 17, 0, 12, 19, 36, 29,
+  3, 0, 0, 0, 0, 0, 0, 11, 0, 0,
+  0, 0, 0, 70, 0, 0, 91, 0, 38, 0,
+  8, 0, 0, 4, 0, 0, 64, 10, 0, 0,
+  0, 114, 20, 0, 74, 27, 0, 45, 12, 51,
+  27, 0, 0, 0, 15, 101, 0, 21, 22, 36,
+  22, 0, 57, 0, 0, 0, 62, 0, 29, 0,
+  0, 72, 95, 0, 0, 0, 0, 80, 0, 16,
+  0, 0, 0, 13, 0, 0, 0, 0, 0, 0,
+  0, 33, 0, 3, 0, 0, 0, 0, 4, 22,
+  0, 49, 0, 0, 0, 0, 12, 0, 80, 43,
+  25, 0, 73, 2, 0, 149, 100, 43, 17, 0,
+  0, 0, 0, 25, 0, 0, 21, 90, 9, 0,
+  9, 0, 115, 13, 0, 0, 4, 73, 0, 0,
+  23, 0, 0, 26, 0, 80, 0, 54, 0, 37,
+  0, 15, 61, 0, 0, 23, 13, 7, 0, 32,
+  0, 0, 0, 0, 0, 0, 27, 12, 61, 0,
+  7, 0, 0, 98, 0, 66, 0, 13, 0, 0,
+  19, 3, 24, 48, 0, 47, 3, 23, 13, 19,
+  53, 124, 0, 32, 23, 0, 0, 0, 0, 90,
+  142, 0, 0, 0, 8, 0, 0, 33, 0, 34,
+  0, 47, 0, 22, 0, 0, 0, 0, 6, 0,
+  0, 0, 122, 0, 29, 0, 52, 16, 0, 27,
+  108, 0, 0, 0, 0, 0, 90, 42, 15, 0,
+  26, 53, 0, 84, 60, 35, 50, 0, 0, 15,
+  20, 31, 0, 0, 3, 111, 0, 0, 0, 0,
+  61, 0, 0, 0, 0, 79, 0, 0, 3, 0,
+  0, 0, 0, 28, 0, 0, 0, 35, 0, 82,
+  11, 0, 69, 0, 27, 18, 0, 0, 0, 0,
+  0, 0, 27, 0, 48, 0, 11, 70, 0, 0,
+  22, 90, 0, 69, 0, 68, 0, 0, 7, 0,
+  32, 92, 0, 47, 0, 58, 48, 0, 85, 34,
+  0, 0, 11, 0, 0, 0, 0, 133, 125, 0,
+  0, 0, 8, 0, 0, 61, 0, 16, 7, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  45, 0, 54, 0, 21, 46, 0, 0, 117, 0,
+  0, 75, 0, 0, 21, 0, 0, 1, 34, 80,
+  0, 0, 0, 31, 19, 0, 0, 94, 14, 24,
+  0, 0, 0, 29, 0, 0, 10, 39, 0, 0,
+  0, 0, 0, 56, 0, 0, 0, 0, 0, 7,
+  0, 0, 0, 0, 0, 0, 0, 155, 0, 0,
+  71, 0, 21, 0, 50, 0, 0, 5, 0, 0,
+  108, 0, 0, 0, 0, 98, 0, 0, 39, 7,
+  0, 0, 0, 22, 15, 0, 0, 0, 31, 74,
+  16, 3, 15, 30, 48, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 72, 30, 0, 0, 0,
+  0, 78, 0, 23, 0, 11, 40, 0, 0, 0,
+  17, 16, 68, 25, 10, 51, 0, 3, 0, 0,
+  33, 0, 0, 53, 0, 104, 16, 18, 0, 0,
+  0, 0, 47, 19, 0, 0, 6, 0, 7, 17,
+  36, 23, 0, 2, 0, 0, 72, 39, 0, 0,
+  14, 29, 0, 0, 0, 0, 40, 0, 36, 14,
+  0, 1, 11, 0, 0, 0, 22, 32, 0, 52,
+  25, 0, 0, 0, 0, 42, 40, 0, 22, 0,
+  44, 0, 3, 0, 0, 33, 0, 0, 52, 0,
+  0, 0, 0, 10, 106, 0, 39, 32, 46, 45,
+  0, 59, 28, 0, 21, 0, 1, 31, 0, 0,
+  5, 21, 26, 0, 31, 0, 0, 0, 5, 0,
+  0, 0, 0, 52, 28, 23, 1, 0, 7, 59,
+  48, 1, 0, 29, 0, 28, 0, 8, 0, 0,
+  0, 0, 0, 12, 0, 0, 0, 0, 49, 26,
+  5, 0, 107, 66, 16, 65, 30, 0, 0, 17,
+  71, 14, 28, 0, 85, 0, 0, 80, 60, 0,
+  13, 0, 0, 32, 32, 6, 0, 0, 0, 61,
+  0, 37, 19, 69, 10, 6, 18, 5, 0, 44,
+  103, 0, 0, 23, 0, 23, 18, 0, 0, 0,
+  0, 0, 0, 86, 0, 0, 83, 13, 32, 36,
+  9, 0, 0, 0, 0, 0, 15, 55, 0, 0,
+  11, 0, 91, 19, 43, 55, 0, 39, 28, 49,
+  0, 26, 0, 0, 19, 64, 28, 26, 14, 0,
+  86, 0, 32, 0, 0, 14, 0, 0, 66, 0,
+  5, 67, 43, 0, 9, 0, 0, 58, 0, 60,
+  9, 0, 6, 0, 0, 0, 0, 0, 0, 0,
+  0, 15, 0, 4, 0, 18, 46, 15, 12, 30,
+  14, 0, 60, 29, 0, 164, 0, 0, 18, 0,
+  0, 0, 3, 20, 0, 48, 30, 38, 0, 0,
+  13, 76, 24, 1, 0, 0, 0, 35, 0, 48,
+  0, 88, 0, 0, 0, 20, 63, 58, 24, 0,
+  0, 0, 0, 0, 0, 11, 0, 0, 13, 0,
+  0, 83, 0, 0, 99, 0, 57, 0, 22, 0,
+  0, 57, 14, 0, 110, 0, 0, 29, 2, 76,
+  21, 14, 67, 27, 0, 44, 44, 26, 0, 0,
+  0, 0, 32, 108, 0, 10, 10, 0, 11, 0,
+  10, 13, 0, 0, 58, 0, 30, 0, 0, 71,
+  79, 0, 0, 0, 0, 18, 0, 26, 0, 0,
+  0, 0, 0, 0, 4, 4, 54, 0, 0, 35,
+  0, 18, 0, 0, 0, 17, 0, 23, 0, 111,
+  49, 4, 4, 0, 0, 13, 78, 36, 24, 0,
+  20, 0, 0, 97, 83, 24, 24, 5, 0, 0,
+  48, 50, 0, 0, 1, 78, 1, 0, 0, 0,
+  68, 0, 12, 0, 0, 28, 0, 3, 0, 0,
+  11, 19, 11, 36, 0, 0, 0, 29, 0, 18,
+  44, 0, 0, 0, 1, 0, 0, 8, 0, 0,
+  0, 0, 0, 0, 29, 0, 0, 0, 0, 0,
+  32, 72, 9, 90, 0, 112, 2, 20, 35, 0,
+  0, 53, 0, 31, 6, 61, 21, 24, 117, 0,
+  0, 0, 26, 0, 0, 0, 0, 100, 90, 0,
+  0, 0, 7, 0, 54, 21, 0, 21, 0, 0,
+  0, 15, 0, 0, 0, 0, 0, 21, 0, 0,
+  73, 0, 76, 10, 35, 0, 59, 1, 72, 42,
+  0, 0, 0, 22, 38, 13, 13, 6, 0, 7,
+  0, 21, 38, 13, 14, 0, 0, 64, 43, 11,
+  0, 0, 1, 54, 0, 38, 0, 39, 17, 0,
+  12, 19, 36, 29, 3, 0, 0, 0, 0, 0,
+  0, 11, 0, 0, 0, 0, 0, 70, 0, 0,
+  91, 0, 38, 0, 8, 0, 0, 4, 0, 0,
+  64, 10, 0, 0, 0, 114, 20, 0, 74, 27,
+  0, 45, 12, 51, 27, 0, 0, 0, 15, 101,
+  0, 21, 22, 36, 22, 0, 57, 0, 0, 0,
+  62, 0, 29, 0, 0, 72, 95, 0, 0, 0,
+  0, 80, 0, 16, 0, 0, 0, 13, 0, 0,
+  0, 0, 0, 0, 0, 33, 0, 3, 0, 0,
+  0, 0, 4, 22, 21, 0, 99, 34, 0, 157,
+  0, 0, 0, 0, 0, 17, 14, 49, 0, 0,
+  14, 40, 0, 1, 5, 82, 30, 0, 0, 0,
+  0, 0, 0, 147, 4, 78, 0, 24, 0, 23,
+  87, 19, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 3, 42, 0, 0, 78, 0, 0, 59, 0,
+  56, 0, 27, 0, 0, 28, 13, 0, 118, 0,
+  0, 48, 0, 113, 0, 36, 68, 0, 0, 7,
+  28, 0, 17, 0, 0, 0, 10, 108, 35, 0,
+  27, 10, 7, 0, 0, 0, 13, 0, 52, 0,
+  0, 0, 0, 5, 41, 0, 0, 0, 0, 82,
+  0, 16, 0, 8, 18, 0, 0, 0, 39, 10,
+  84, 0, 0, 54, 5, 43, 0, 6, 0, 3,
+  0, 26, 0, 27, 108, 0, 0, 0, 0, 0,
+  90, 42, 15, 0, 26, 53, 0, 84, 60, 35,
+  50, 0, 0, 15, 20, 31, 0, 0, 3, 111,
+  0, 0, 0, 0, 61, 0, 0, 0, 0, 79,
+  0, 0, 3, 0, 0, 0, 0, 28, 0, 0,
+  0, 35, 0, 82, 11, 0, 69, 0, 27, 18,
+  0, 0, 0, 0, 0, 0, 27, 0, 48, 0,
+  11, 70, 0, 0, 22, 90, 0, 69, 0, 68,
+  0, 0, 7, 0, 32, 92, 0, 47, 0, 58,
+  48, 0, 85, 34, 0, 0, 11, 0, 0, 0,
+  0, 133, 125, 0, 0, 0, 8, 0, 0, 61,
+  0, 16, 7, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 45, 0, 54, 0, 21, 46,
+  0, 0, 117, 0, 0, 75, 0, 0, 21, 0,
+  0, 1, 34, 80, 0, 0, 0, 31, 19, 0,
+  0, 94, 14, 24, 0, 0, 0, 29, 0, 0,
+  10, 39, 0, 0, 0, 0, 0, 56, 0, 0,
+  0, 0, 0, 7, 0, 0, 0, 0, 0, 0,
+  0, 155, 0, 0, 71, 0, 21, 0, 50, 0,
+  0, 5, 0, 0, 108, 0, 0, 0, 0, 98,
+  0, 0, 39, 7, 0, 0, 0, 22, 15, 0,
+  0, 0, 31, 74, 16, 3, 15, 30, 48, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 72,
+  30, 0, 0, 0, 0, 78, 0, 23, 0, 11,
+  40, 0, 0, 0, 17, 16, 68, 25, 10, 51,
+  0, 3, 0, 0, 33, 0, 0, 53, 0, 0,
+  59, 0, 5, 69, 0, 0, 0, 0, 0, 19,
+  45, 76, 0, 0, 0, 17, 2, 8, 10, 22,
+  0, 35, 0, 0, 0, 0, 0, 77, 41, 11,
+  0, 18, 0, 0, 0, 17, 0, 13, 0, 0,
+  0, 39, 0, 0, 0, 0, 0, 0, 0, 110,
+  0, 0, 0, 0, 15, 4, 28, 0, 0, 0,
+  0, 0, 48, 0, 0, 6, 0, 9, 0, 40,
+  17, 0, 0, 0, 0, 0, 53, 0, 0, 17,
+  0, 52, 45, 0, 40, 9, 68, 0, 0, 0,
+  56, 0, 0, 5, 0, 0, 0, 21, 0, 0,
+  0, 0, 1, 53, 0, 16, 7, 45, 50, 0,
+  0, 13, 38, 10, 68, 48, 19, 52, 56, 0,
+  0, 0, 26, 9, 0, 10, 107, 66, 16, 65,
+  30, 0, 0, 17, 71, 14, 28, 0, 85, 0,
+  0, 80, 60, 0, 13, 0, 0, 32, 32, 6,
+  0, 0, 0, 61, 0, 37, 19, 69, 10, 6,
+  18, 5, 0, 44, 103, 0, 0, 23, 0, 23,
+  18, 0, 0, 0, 0, 0, 0, 86, 0, 0,
+  83, 13, 32, 36, 9, 0, 0, 0, 0, 0,
+  15, 55, 0, 0, 11, 0, 91, 19, 43, 55,
+  0, 39, 28, 49, 0, 26, 0, 0, 19, 64,
+  28, 26, 14, 0, 86, 0, 32, 0, 0, 14,
+  0, 0, 66, 0, 5, 67, 43, 0, 9, 0,
+  0, 58, 0, 60, 9, 0, 6, 0, 0, 0,
+  0, 0, 0, 0, 0, 15, 0, 4, 0, 18,
+  46, 15, 12, 30, 14, 0, 60, 29, 0, 164,
+  0, 0, 18, 0, 0, 0, 3, 20, 0, 48,
+  30, 38, 0, 0, 13, 76, 24, 1, 0, 0,
+  0, 35, 0, 48, 0, 88, 0, 0, 0, 20,
+  63, 58, 24, 0, 0, 0, 0, 0, 0, 11,
+  0, 0, 13, 0, 0, 83, 0, 0, 99, 0,
+  57, 0, 22, 0, 0, 57, 14, 0, 110, 0,
+  0, 29, 2, 76, 21, 14, 67, 27, 0, 44,
+  44, 26, 0, 0, 0, 0, 32, 108, 0, 10,
+  10, 0, 11, 0, 10, 13, 0, 0, 58, 0,
+  30, 0, 0, 71, 79, 0, 0, 0, 0, 18,
+  0, 26, 0, 0, 0, 0, 0, 0, 4, 4,
+  54, 0, 0, 35, 0, 18, 0, 0, 0, 17,
+  0, 23, 0, 0, 70, 0, 4, 150, 0, 0,
+  0, 0, 0, 1, 23, 94, 0, 0, 0, 44,
+  0, 0, 21, 54, 0, 39, 0, 0, 0, 0,
+  0, 45, 16, 26, 0, 7, 0, 0, 0, 50,
+  0, 0, 0, 11, 0, 27, 0, 8, 1, 0,
+  0, 0, 12, 123, 0, 0, 39, 0, 39, 0,
+  42, 0, 0, 32, 0, 0, 97, 0, 0, 31,
+  0, 64, 0, 26, 51, 0, 0, 17, 0, 0,
+  0, 0, 0, 0, 27, 70, 21, 0, 16, 15,
+  54, 0, 0, 0, 24, 0, 2, 0, 0, 0,
+  0, 60, 12, 0, 0, 0, 0, 79, 0, 14,
+  0, 5, 25, 0, 0, 14, 51, 41, 105, 41,
+  29, 52, 23, 0, 0, 0, 17, 23, 0, 13,
+  59, 1, 72, 42, 0, 0, 0, 22, 38, 13,
+  13, 6, 0, 7, 0, 21, 38, 13, 14, 0,
+  0, 64, 43, 11, 0, 0, 1, 54, 0, 38,
+  0, 39, 17, 0, 12, 19, 36, 29, 3, 0,
+  0, 0, 0, 0, 0, 11, 0, 0, 0, 0,
+  0, 70, 0, 0, 91, 0, 38, 0, 8, 0,
+  0, 4, 0, 0, 64, 10, 0, 0, 0, 114,
+  20, 0, 74, 27, 0, 45, 12, 51, 27, 0,
+  0, 0, 15, 101, 0, 21, 22, 36, 22, 0,
+  57, 0, 0, 0, 62, 0, 29, 0, 0, 72,
+  95, 0, 0, 0, 0, 80, 0, 16, 0, 0,
+  0, 13, 0, 0, 0, 0, 0, 0, 0, 33,
+  0, 3, 0, 0, 0, 0, 4, 22, 21, 0,
+  99, 34, 0, 157, 0, 0, 0, 0, 0, 17,
+  14, 49, 0, 0, 14, 40, 0, 1, 5, 82,
+  30, 0, 0, 0, 0, 0, 0, 147, 4, 78,
+  0, 24, 0, 23, 87, 19, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 3, 42, 0, 0, 78,
+  0, 0, 59, 0, 56, 0, 27, 0, 0, 28,
+  13, 0, 118, 0, 0, 48, 0, 113, 0, 36,
+  68, 0, 0, 7, 28, 0, 17, 0, 0, 0,
+  10, 108, 35, 0, 27, 10, 7, 0, 0, 0,
+  13, 0, 52, 0, 0, 0, 0, 5, 41, 0,
+  0, 0, 0, 82, 0, 16, 0, 8, 18, 0,
+  0, 0, 39, 10, 84, 0, 0, 54, 5, 43,
+  0, 6, 0, 3, 0, 26, 0, 9, 38, 0,
+  15, 120, 0, 0, 0, 0, 0, 3, 58, 72,
+  0, 0, 0, 18, 0, 18, 44, 0, 0, 51,
+  0, 3, 0, 0, 0, 91, 41, 0, 0, 22,
+  0, 0, 0, 22, 0, 25, 0, 45, 0, 53,
+  1, 0, 0, 32, 0, 0, 0, 70, 11, 0,
+  0, 0, 19, 0, 13, 14, 0, 9, 0, 0,
+  0, 0, 0, 11, 0, 0, 0, 58, 10, 0,
+  0, 20, 0, 0, 2, 19, 0, 27, 10, 28,
+  51, 0, 32, 5, 54, 4, 0, 0, 52, 5,
+  0, 37, 0, 0, 0, 30, 0, 0, 0, 0,
+  3, 4, 0, 16, 10, 25, 57, 0, 0, 17,
+  37, 0, 63, 43, 24, 47, 55, 1, 2, 0,
+  25, 2, 0, 0, 0, 0, 117, 0, 0, 75,
+  0, 0, 21, 0, 0, 1, 34, 80, 0, 0,
+  0, 31, 19, 0, 0, 94, 14, 24, 0, 0,
+  0, 29, 0, 0, 10, 39, 0, 0, 0, 0,
+  0, 56, 0, 0, 0, 0, 0, 7, 0, 0,
+  0, 0, 0, 0, 0, 155, 0, 0, 71, 0,
+  21, 0, 50, 0, 0, 5, 0, 0, 108, 0,
+  0, 0, 0, 98, 0, 0, 39, 7, 0, 0,
+  0, 22, 15, 0, 0, 0, 31, 74, 16, 3,
+  15, 30, 48, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 72, 30, 0, 0, 0, 0, 78,
+  0, 23, 0, 11, 40, 0, 0, 0, 17, 16,
+  68, 25, 10, 51, 0, 3, 0, 0, 33, 0,
+  0, 53, 0, 0, 59, 0, 5, 69, 0, 0,
+  0, 0, 0, 19, 45, 76, 0, 0, 0, 17,
+  2, 8, 10, 22, 0, 35, 0, 0, 0, 0,
+  0, 77, 41, 11, 0, 18, 0, 0, 0, 17,
+  0, 13, 0, 0, 0, 39, 0, 0, 0, 0,
+  0, 0, 0, 110, 0, 0, 0, 0, 15, 4,
+  28, 0, 0, 0, 0, 0, 48, 0, 0, 6,
+  0, 9, 0, 40, 17, 0, 0, 0, 0, 0,
+  53, 0, 0, 17, 0, 52, 45, 0, 40, 9,
+  68, 0, 0, 0, 56, 0, 0, 5, 0, 0,
+  0, 21, 0, 0, 0, 0, 1, 53, 0, 16,
+  7, 45, 50, 0, 0, 13, 38, 10, 68, 48,
+  19, 52, 56, 0, 0, 0, 26, 9, 0, 10,
+  0, 52, 52, 0, 44, 0, 21, 0, 7, 0,
+  0, 3, 68, 73, 3, 33, 10, 1, 18, 0,
+  44, 0, 0, 50, 14, 42, 0, 0, 0, 12,
+  60, 0, 0, 39, 0, 0, 0, 7, 0, 62,
+  39, 63, 0, 87, 51, 0, 0, 0, 0, 0,
+  0, 78, 42, 0, 0, 0, 18, 20, 19, 14,
+  11, 0, 3, 81, 0, 28, 0, 0, 0, 0,
+  0, 30, 0, 13, 8, 1, 0, 0, 0, 18,
+  37, 38, 21, 0, 88, 0, 16, 0, 65, 54,
+  0, 0, 46, 25, 0, 61, 0, 19, 5, 30,
+  0, 0, 0, 0, 0, 0, 0, 15, 38, 43,
+  88, 0, 0, 20, 22, 0, 0, 24, 58, 18,
+  39, 4, 45, 0, 79, 0, 1, 0, 14, 0,
+  60, 29, 0, 164, 0, 0, 18, 0, 0, 0,
+  3, 20, 0, 48, 30, 38, 0, 0, 13, 76,
+  24, 1, 0, 0, 0, 35, 0, 48, 0, 88,
+  0, 0, 0, 20, 63, 58, 24, 0, 0, 0,
+  0, 0, 0, 11, 0, 0, 13, 0, 0, 83,
+  0, 0, 99, 0, 57, 0, 22, 0, 0, 57,
+  14, 0, 110, 0, 0, 29, 2, 76, 21, 14,
+  67, 27, 0, 44, 44, 26, 0, 0, 0, 0,
+  32, 108, 0, 10, 10, 0, 11, 0, 10, 13,
+  0, 0, 58, 0, 30, 0, 0, 71, 79, 0,
+  0, 0, 0, 18, 0, 26, 0, 0, 0, 0,
+  0, 0, 4, 4, 54, 0, 0, 35, 0, 18,
+  0, 0, 0, 17, 0, 23, 0, 0, 70, 0,
+  4, 150, 0, 0, 0, 0, 0, 1, 23, 94,
+  0, 0, 0, 44, 0, 0, 21, 54, 0, 39,
+  0, 0, 0, 0, 0, 45, 16, 26, 0, 7,
+  0, 0, 0, 50, 0, 0, 0, 11, 0, 27,
+  0, 8, 1, 0, 0, 0, 12, 123, 0, 0,
+  39, 0, 39, 0, 42, 0, 0, 32, 0, 0,
+  97, 0, 0, 31, 0, 64, 0, 26, 51, 0,
+  0, 17, 0, 0, 0, 0, 0, 0, 27, 70,
+  21, 0, 16, 15, 54, 0, 0, 0, 24, 0,
+  2, 0, 0, 0, 0, 60, 12, 0, 0, 0,
+  0, 79, 0, 14, 0, 5, 25, 0, 0, 14,
+  51, 41, 105, 41, 29, 52, 23, 0, 0, 0,
+  17, 23, 0, 13, 0, 43, 48, 0, 24, 32,
+  13, 0, 8, 0, 0, 0, 63, 49, 0, 0,
+  3, 17, 8, 10, 0, 0, 0, 37, 41, 35,
+  6, 0, 0, 48, 48, 0, 0, 14, 0, 0,
+  0, 2, 0, 39, 0, 40, 0, 41, 21, 0,
+  3, 0, 0, 0, 0, 40, 61, 0, 0, 0,
+  14, 6, 2, 35, 0, 6, 0, 21, 0, 0,
+  0, 27, 0, 0, 0, 32, 20, 0, 21, 28,
+  0, 0, 0, 25, 16, 25, 21, 40, 63, 0,
+  39, 18, 50, 13, 0, 0, 32, 28, 0, 22,
+  0, 38, 15, 31, 0, 0, 0, 0, 0, 28,
+  14, 0, 53, 57, 40, 0, 0, 20, 46, 0,
+  33, 38, 62, 29, 61, 16, 47, 0, 46, 37,
+  0, 1, 21, 0, 99, 34, 0, 157, 0, 0,
+  0, 0, 0, 17, 14, 49, 0, 0, 14, 40,
+  0, 1, 5, 82, 30, 0, 0, 0, 0, 0,
+  0, 147, 4, 78, 0, 24, 0, 23, 87, 19,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+  42, 0, 0, 78, 0, 0, 59, 0, 56, 0,
+  27, 0, 0, 28, 13, 0, 118, 0, 0, 48,
+  0, 113, 0, 36, 68, 0, 0, 7, 28, 0,
+  17, 0, 0, 0, 10, 108, 35, 0, 27, 10,
+  7, 0, 0, 0, 13, 0, 52, 0, 0, 0,
+  0, 5, 41, 0, 0, 0, 0, 82, 0, 16,
+  0, 8, 18, 0, 0, 0, 39, 10, 84, 0,
+  0, 54, 5, 43, 0, 6, 0, 3, 0, 26,
+  0, 9, 38, 0, 15, 120, 0, 0, 0, 0,
+  0, 3, 58, 72, 0, 0, 0, 18, 0, 18,
+  44, 0, 0, 51, 0, 3, 0, 0, 0, 91,
+  41, 0, 0, 22, 0, 0, 0, 22, 0, 25,
+  0, 45, 0, 53, 1, 0, 0, 32, 0, 0,
+  0, 70, 11, 0, 0, 0, 19, 0, 13, 14,
+  0, 9, 0, 0, 0, 0, 0, 11, 0, 0,
+  0, 58, 10, 0, 0, 20, 0, 0, 2, 19,
+  0, 27, 10, 28, 51, 0, 32, 5, 54, 4,
+  0, 0, 52, 5, 0, 37, 0, 0, 0, 30,
+  0, 0, 0, 0, 3, 4, 0, 16, 10, 25,
+  57, 0, 0, 17, 37, 0, 63, 43, 24, 47,
+  55, 1, 2, 0, 25, 2, 0, 0, 0, 70,
+  65, 0, 63, 0, 15, 0, 1, 0, 14, 0,
+  64, 75, 0, 51, 17, 7, 26, 16, 9, 0,
+  0, 47, 38, 59, 0, 0, 0, 0, 53, 0,
+  0, 37, 12, 0, 0, 0, 0, 53, 50, 43,
+  24, 71, 73, 0, 0, 0, 0, 0, 0, 26,
+  50, 0, 0, 0, 0, 20, 1, 27, 24, 0,
+  0, 63, 0, 2, 29, 0, 0, 0, 0, 0,
+  7, 41, 16, 12, 0, 17, 0, 23, 46, 34,
+  33, 22, 87, 14, 32, 4, 49, 40, 0, 20,
+  24, 31, 0, 54, 0, 35, 3, 41, 0, 0,
+  0, 0, 0, 0, 7, 10, 34, 32, 82, 0,
+  0, 13, 31, 0, 0, 29, 54, 8, 7, 0,
+  55, 0, 75, 11, 2, 0, 0, 0, 59, 0,
+  5, 69, 0, 0, 0, 0, 0, 19, 45, 76,
+  0, 0, 0, 17, 2, 8, 10, 22, 0, 35,
+  0, 0, 0, 0, 0, 77, 41, 11, 0, 18,
+  0, 0, 0, 17, 0, 13, 0, 0, 0, 39,
+  0, 0, 0, 0, 0, 0, 0, 110, 0, 0,
+  0, 0, 15, 4, 28, 0, 0, 0, 0, 0,
+  48, 0, 0, 6, 0, 9, 0, 40, 17, 0,
+  0, 0, 0, 0, 53, 0, 0, 17, 0, 52,
+  45, 0, 40, 9, 68, 0, 0, 0, 56, 0,
+  0, 5, 0, 0, 0, 21, 0, 0, 0, 0,
+  1, 53, 0, 16, 7, 45, 50, 0, 0, 13,
+  38, 10, 68, 48, 19, 52, 56, 0, 0, 0,
+  26, 9, 0, 10, 0, 52, 52, 0, 44, 0,
+  21, 0, 7, 0, 0, 3, 68, 73, 3, 33,
+  10, 1, 18, 0, 44, 0, 0, 50, 14, 42,
+  0, 0, 0, 12, 60, 0, 0, 39, 0, 0,
+  0, 7, 0, 62, 39, 63, 0, 87, 51, 0,
+  0, 0, 0, 0, 0, 78, 42, 0, 0, 0,
+  18, 20, 19, 14, 11, 0, 3, 81, 0, 28,
+  0, 0, 0, 0, 0, 30, 0, 13, 8, 1,
+  0, 0, 0, 18, 37, 38, 21, 0, 88, 0,
+  16, 0, 65, 54, 0, 0, 46, 25, 0, 61,
+  0, 19, 5, 30, 0, 0, 0, 0, 0, 0,
+  0, 15, 38, 43, 88, 0, 0, 20, 22, 0,
+  0, 24, 58, 18, 39, 4, 45, 0, 79, 0,
+  1, 0, 0, 16, 100, 0, 22, 0, 0, 0,
+  0, 0, 0, 11, 22, 94, 0, 49, 0, 51,
+  31, 35, 50, 27, 110, 9, 0, 0, 0, 0,
+  0, 0, 32, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 94, 0, 0, 96, 51, 18, 0, 0,
+  0, 0, 0, 79, 0, 0, 15, 0, 24, 0,
+  24, 0, 7, 8, 19, 6, 56, 0, 0, 10,
+  0, 51, 0, 0, 21, 34, 0, 0, 0, 16,
+  0, 0, 24, 0, 36, 0, 41, 12, 2, 0,
+  43, 21, 0, 36, 0, 0, 5, 39, 0, 0,
+  0, 27, 23, 0, 0, 0, 0, 0, 0, 11,
+  0, 6, 79, 9, 0, 5, 40, 0, 52, 15,
+  28, 31, 21, 0, 0, 0, 55, 12, 0, 0,
+  0, 0, 70, 0, 4, 150, 0, 0, 0, 0,
+  0, 1, 23, 94, 0, 0, 0, 44, 0, 0,
+  21, 54, 0, 39, 0, 0, 0, 0, 0, 45,
+  16, 26, 0, 7, 0, 0, 0, 50, 0, 0,
+  0, 11, 0, 27, 0, 8, 1, 0, 0, 0,
+  12, 123, 0, 0, 39, 0, 39, 0, 42, 0,
+  0, 32, 0, 0, 97, 0, 0, 31, 0, 64,
+  0, 26, 51, 0, 0, 17, 0, 0, 0, 0,
+  0, 0, 27, 70, 21, 0, 16, 15, 54, 0,
+  0, 0, 24, 0, 2, 0, 0, 0, 0, 60,
+  12, 0, 0, 0, 0, 79, 0, 14, 0, 5,
+  25, 0, 0, 14, 51, 41, 105, 41, 29, 52,
+  23, 0, 0, 0, 17, 23, 0, 13, 0, 43,
+  48, 0, 24, 32, 13, 0, 8, 0, 0, 0,
+  63, 49, 0, 0, 3, 17, 8, 10, 0, 0,
+  0, 37, 41, 35, 6, 0, 0, 48, 48, 0,
+  0, 14, 0, 0, 0, 2, 0, 39, 0, 40,
+  0, 41, 21, 0, 3, 0, 0, 0, 0, 40,
+  61, 0, 0, 0, 14, 6, 2, 35, 0, 6,
+  0, 21, 0, 0, 0, 27, 0, 0, 0, 32,
+  20, 0, 21, 28, 0, 0, 0, 25, 16, 25,
+  21, 40, 63, 0, 39, 18, 50, 13, 0, 0,
+  32, 28, 0, 22, 0, 38, 15, 31, 0, 0,
+  0, 0, 0, 28, 14, 0, 53, 57, 40, 0,
+  0, 20, 46, 0, 33, 38, 62, 29, 61, 16,
+  47, 0, 46, 37, 0, 1, 0, 41, 74, 0,
+  7, 0, 37, 0, 26, 0, 0, 0, 8, 45,
+  0, 15, 14, 0, 13, 0, 0, 0, 20, 55,
+  23, 53, 16, 0, 159, 1, 19, 0, 8, 19,
+  20, 0, 0, 0, 0, 81, 7, 52, 28, 35,
+  49, 21, 9, 3, 0, 0, 0, 24, 50, 0,
+  0, 0, 1, 33, 4, 24, 7, 14, 0, 0,
+  0, 27, 51, 0, 10, 0, 0, 31, 38, 26,
+  32, 14, 0, 0, 0, 32, 48, 29, 26, 13,
+  31, 0, 3, 25, 74, 17, 4, 0, 45, 17,
+  0, 32, 0, 0, 21, 15, 0, 0, 0, 0,
+  6, 22, 50, 8, 38, 32, 47, 0, 0, 0,
+  1, 0, 13, 0, 30, 2, 0, 0, 24, 0,
+  46, 24, 32, 0, 0, 9, 38, 0, 15, 120,
+  0, 0, 0, 0, 0, 3, 58, 72, 0, 0,
+  0, 18, 0, 18, 44, 0, 0, 51, 0, 3,
+  0, 0, 0, 91, 41, 0, 0, 22, 0, 0,
+  0, 22, 0, 25, 0, 45, 0, 53, 1, 0,
+  0, 32, 0, 0, 0, 70, 11, 0, 0, 0,
+  19, 0, 13, 14, 0, 9, 0, 0, 0, 0,
+  0, 11, 0, 0, 0, 58, 10, 0, 0, 20,
+  0, 0, 2, 19, 0, 27, 10, 28, 51, 0,
+  32, 5, 54, 4, 0, 0, 52, 5, 0, 37,
+  0, 0, 0, 30, 0, 0, 0, 0, 3, 4,
+  0, 16, 10, 25, 57, 0, 0, 17, 37, 0,
+  63, 43, 24, 47, 55, 1, 2, 0, 25, 2,
+  0, 0, 0, 70, 65, 0, 63, 0, 15, 0,
+  1, 0, 14, 0, 64, 75, 0, 51, 17, 7,
+  26, 16, 9, 0, 0, 47, 38, 59, 0, 0,
+  0, 0, 53, 0, 0, 37, 12, 0, 0, 0,
+  0, 53, 50, 43, 24, 71, 73, 0, 0, 0,
+  0, 0, 0, 26, 50, 0, 0, 0, 0, 20,
+  1, 27, 24, 0, 0, 63, 0, 2, 29, 0,
+  0, 0, 0, 0, 7, 41, 16, 12, 0, 17,
+  0, 23, 46, 34, 33, 22, 87, 14, 32, 4,
+  49, 40, 0, 20, 24, 31, 0, 54, 0, 35,
+  3, 41, 0, 0, 0, 0, 0, 0, 7, 10,
+  34, 32, 82, 0, 0, 13, 31, 0, 0, 29,
+  54, 8, 7, 0, 55, 0, 75, 11, 2, 0,
+  0, 0, 119, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 103, 0, 9, 0, 6, 10, 5,
+  9, 50, 108, 24, 0, 0, 0, 8, 184, 0,
+  22, 0, 0, 31, 0, 0, 11, 12, 0, 10,
+  106, 0, 19, 21, 57, 33, 0, 2, 16, 0,
+  0, 65, 0, 0, 30, 0, 14, 26, 31, 0,
+  30, 40, 20, 0, 16, 5, 36, 0, 0, 70,
+  0, 0, 38, 61, 0, 0, 13, 0, 0, 0,
+  25, 10, 0, 19, 7, 11, 0, 47, 49, 0,
+  0, 54, 39, 0, 33, 24, 0, 0, 0, 22,
+  19, 7, 17, 0, 40, 27, 0, 5, 0, 0,
+  50, 3, 0, 0, 37, 20, 52, 0, 0, 30,
+  0, 0, 0, 0, 2, 25, 2, 0, 0, 52,
+  52, 0, 44, 0, 21, 0, 7, 0, 0, 3,
+  68, 73, 3, 33, 10, 1, 18, 0, 44, 0,
+  0, 50, 14, 42, 0, 0, 0, 12, 60, 0,
+  0, 39, 0, 0, 0, 7, 0, 62, 39, 63,
+  0, 87, 51, 0, 0, 0, 0, 0, 0, 78,
+  42, 0, 0, 0, 18, 20, 19, 14, 11, 0,
+  3, 81, 0, 28, 0, 0, 0, 0, 0, 30,
+  0, 13, 8, 1, 0, 0, 0, 18, 37, 38,
+  21, 0, 88, 0, 16, 0, 65, 54, 0, 0,
+  46, 25, 0, 61, 0, 19, 5, 30, 0, 0,
+  0, 0, 0, 0, 0, 15, 38, 43, 88, 0,
+  0, 20, 22, 0, 0, 24, 58, 18, 39, 4,
+  45, 0, 79, 0, 1, 0, 0, 16, 100, 0,
+  22, 0, 0, 0, 0, 0, 0, 11, 22, 94,
+  0, 49, 0, 51, 31, 35, 50, 27, 110, 9,
+  0, 0, 0, 0, 0, 0, 32, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 94, 0, 0, 96,
+  51, 18, 0, 0, 0, 0, 0, 79, 0, 0,
+  15, 0, 24, 0, 24, 0, 7, 8, 19, 6,
+  56, 0, 0, 10, 0, 51, 0, 0, 21, 34,
+  0, 0, 0, 16, 0, 0, 24, 0, 36, 0,
+  41, 12, 2, 0, 43, 21, 0, 36, 0, 0,
+  5, 39, 0, 0, 0, 27, 23, 0, 0, 0,
+  0, 0, 0, 11, 0, 6, 79, 9, 0, 5,
+  40, 0, 52, 15, 28, 31, 21, 0, 0, 0,
+  55, 12, 0, 0, 20, 0, 91, 19, 0, 0,
+  0, 12, 20, 0, 0, 0, 0, 125, 0, 0,
+  0, 22, 28, 1, 36, 70, 81, 11, 0, 0,
+  7, 35, 205, 0, 23, 21, 0, 15, 0, 0,
+  0, 31, 0, 0, 65, 0, 0, 38, 53, 70,
+  0, 0, 0, 0, 0, 120, 0, 6, 74, 0,
+  21, 12, 39, 0, 24, 17, 49, 0, 50, 0,
+  10, 0, 0, 102, 0, 0, 27, 14, 0, 0,
+  25, 0, 0, 0, 12, 2, 2, 20, 0, 0,
+  0, 33, 96, 33, 0, 2, 0, 0, 53, 20,
+  39, 0, 2, 26, 35, 12, 15, 0, 81, 19,
+  3, 30, 19, 0, 74, 0, 14, 0, 19, 31,
+  105, 0, 0, 54, 0, 0, 0, 0, 40, 22,
+  0, 17, 0, 43, 48, 0, 24, 32, 13, 0,
+  8, 0, 0, 0, 63, 49, 0, 0, 3, 17,
+  8, 10, 0, 0, 0, 37, 41, 35, 6, 0,
+  0, 48, 48, 0, 0, 14, 0, 0, 0, 2,
+  0, 39, 0, 40, 0, 41, 21, 0, 3, 0,
+  0, 0, 0, 40, 61, 0, 0, 0, 14, 6,
+  2, 35, 0, 6, 0, 21, 0, 0, 0, 27,
+  0, 0, 0, 32, 20, 0, 21, 28, 0, 0,
+  0, 25, 16, 25, 21, 40, 63, 0, 39, 18,
+  50, 13, 0, 0, 32, 28, 0, 22, 0, 38,
+  15, 31, 0, 0, 0, 0, 0, 28, 14, 0,
+  53, 57, 40, 0, 0, 20, 46, 0, 33, 38,
+  62, 29, 61, 16, 47, 0, 46, 37, 0, 1,
+  0, 41, 74, 0, 7, 0, 37, 0, 26, 0,
+  0, 0, 8, 45, 0, 15, 14, 0, 13, 0,
+  0, 0, 20, 55, 23, 53, 16, 0, 159, 1,
+  19, 0, 8, 19, 20, 0, 0, 0, 0, 81,
+  7, 52, 28, 35, 49, 21, 9, 3, 0, 0,
+  0, 24, 50, 0, 0, 0, 1, 33, 4, 24,
+  7, 14, 0, 0, 0, 27, 51, 0, 10, 0,
+  0, 31, 38, 26, 32, 14, 0, 0, 0, 32,
+  48, 29, 26, 13, 31, 0, 3, 25, 74, 17,
+  4, 0, 45, 17, 0, 32, 0, 0, 21, 15,
+  0, 0, 0, 0, 6, 22, 50, 8, 38, 32,
+  47, 0, 0, 0, 1, 0, 13, 0, 30, 2,
+  0, 0, 24, 0, 46, 24, 32, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 70, 65, 0,
+  63, 0, 15, 0, 1, 0, 14, 0, 64, 75,
+  0, 51, 17, 7, 26, 16, 9, 0, 0, 47,
+  38, 59, 0, 0, 0, 0, 53, 0, 0, 37,
+  12, 0, 0, 0, 0, 53, 50, 43, 24, 71,
+  73, 0, 0, 0, 0, 0, 0, 26, 50, 0,
+  0, 0, 0, 20, 1, 27, 24, 0, 0, 63,
+  0, 2, 29, 0, 0, 0, 0, 0, 7, 41,
+  16, 12, 0, 17, 0, 23, 46, 34, 33, 22,
+  87, 14, 32, 4, 49, 40, 0, 20, 24, 31,
+  0, 54, 0, 35, 3, 41, 0, 0, 0, 0,
+  0, 0, 7, 10, 34, 32, 82, 0, 0, 13,
+  31, 0, 0, 29, 54, 8, 7, 0, 55, 0,
+  75, 11, 2, 0, 0, 0, 119, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 103, 0, 9,
+  0, 6, 10, 5, 9, 50, 108, 24, 0, 0,
+  0, 8, 184, 0, 22, 0, 0, 31, 0, 0,
+  11, 12, 0, 10, 106, 0, 19, 21, 57, 33,
+  0, 2, 16, 0, 0, 65, 0, 0, 30, 0,
+  14, 26, 31, 0, 30, 40, 20, 0, 16, 5,
+  36, 0, 0, 70, 0, 0, 38, 61, 0, 0,
+  13, 0, 0, 0, 25, 10, 0, 19, 7, 11,
+  0, 47, 49, 0, 0, 54, 39, 0, 33, 24,
+  0, 0, 0, 22, 19, 7, 17, 0, 40, 27,
+  0, 5, 0, 0, 50, 3, 0, 0, 37, 20,
+  52, 0, 0, 30, 0, 0, 0, 0, 2, 25,
+  2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 16, 100, 0, 22, 0, 0, 0, 0, 0,
+  0, 11, 22, 94, 0, 49, 0, 51, 31, 35,
+  50, 27, 110, 9, 0, 0, 0, 0, 0, 0,
+  32, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  94, 0, 0, 96, 51, 18, 0, 0, 0, 0,
+  0, 79, 0, 0, 15, 0, 24, 0, 24, 0,
+  7, 8, 19, 6, 56, 0, 0, 10, 0, 51,
+  0, 0, 21, 34, 0, 0, 0, 16, 0, 0,
+  24, 0, 36, 0, 41, 12, 2, 0, 43, 21,
+  0, 36, 0, 0, 5, 39, 0, 0, 0, 27,
+  23, 0, 0, 0, 0, 0, 0, 11, 0, 6,
+  79, 9, 0, 5, 40, 0, 52, 15, 28, 31,
+  21, 0, 0, 0, 55, 12, 0, 0, 20, 0,
+  91, 19, 0, 0, 0, 12, 20, 0, 0, 0,
+  0, 125, 0, 0, 0, 22, 28, 1, 36, 70,
+  81, 11, 0, 0, 7, 35, 205, 0, 23, 21,
+  0, 15, 0, 0, 0, 31, 0, 0, 65, 0,
+  0, 38, 53, 70, 0, 0, 0, 0, 0, 120,
+  0, 6, 74, 0, 21, 12, 39, 0, 24, 17,
+  49, 0, 50, 0, 10, 0, 0, 102, 0, 0,
+  27, 14, 0, 0, 25, 0, 0, 0, 12, 2,
+  2, 20, 0, 0, 0, 33, 96, 33, 0, 2,
+  0, 0, 53, 20, 39, 0, 2, 26, 35, 12,
+  15, 0, 81, 19, 3, 30, 19, 0, 74, 0,
+  14, 0, 19, 31, 105, 0, 0, 54, 0, 0,
+  0, 0, 40, 22, 0, 17, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 23, 32, 93, 27, 1, 9, 26, 5,
+  18, 0, 0, 0, 0, 103, 0, 30, 67, 4,
+  0, 16, 13, 75, 10, 41, 20, 0, 6, 20,
+  201, 42, 3, 62, 71, 0, 24, 0, 0, 56,
+  0, 4, 5, 32, 0, 22, 9, 88, 48, 0,
+  0, 0, 0, 51, 21, 3, 55, 0, 44, 0,
+  32, 0, 31, 72, 0, 0, 0, 0, 48, 9,
+  120, 30, 0, 10, 58, 0, 32, 0, 53, 0,
+  0, 37, 0, 0, 36, 11, 0, 15, 0, 0,
+  58, 5, 0, 0, 0, 3, 0, 36, 0, 0,
+  40, 101, 17, 0, 0, 52, 55, 89, 20, 0,
+  9, 0, 2, 9, 0, 33, 6, 2, 40, 0,
+  19, 12, 51, 0, 0, 0, 3, 0, 39, 30,
+  0, 67, 0, 11, 0, 33, 2, 0, 0, 0,
+  0, 17, 28, 49, 0, 0, 52, 3, 0, 0,
+  28, 58, 0, 42, 19, 0, 0, 8, 0, 9,
+  0, 26, 82, 21, 0, 0, 0, 27, 0, 8,
+  0, 40, 0, 22, 24, 91, 9, 110, 0, 0,
+  0, 27, 50, 0, 37, 0, 28, 0, 14, 0,
+  55, 50, 0, 43, 0, 0, 49, 11, 81, 0,
+  4, 0, 22, 7, 42, 0, 12, 0, 0, 26,
+  21, 0, 21, 24, 0, 0, 0, 0, 0, 9,
+  0, 0, 0, 9, 0, 20, 0, 0, 47, 83,
+  0, 52, 17, 21, 41, 51, 25, 0, 40, 5,
+  0, 40, 0, 11, 0, 0, 21, 0, 13, 13,
+  31, 0, 15, 0, 35, 1, 15, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 13, 24, 67, 6,
+  0, 18, 27, 22, 0, 0, 0, 0, 0, 97,
+  0, 0, 60, 4, 0, 5, 27, 86, 27, 52,
+  0, 0, 8, 9, 193, 55, 1, 28, 52, 0,
+  59, 1, 0, 58, 0, 17, 14, 39, 0, 14,
+  26, 83, 17, 0, 2, 0, 0, 64, 30, 0,
+  71, 0, 60, 0, 49, 0, 15, 71, 0, 0,
+  0, 0, 7, 6, 77, 33, 0, 22, 82, 11,
+  31, 27, 25, 0, 20, 13, 0, 0, 15, 5,
+  0, 0, 0, 0, 62, 3, 0, 0, 23, 0,
+  15, 37, 0, 0, 49, 67, 15, 0, 0, 37,
+  46, 75, 26, 0, 0, 6, 1, 16, 0, 37,
+  12, 0, 55, 0, 9, 28, 40, 0, 0, 0,
+  4, 0, 26, 26, 0, 60, 0, 15, 0, 5,
+  36, 23, 2, 0, 0, 31, 86, 8, 0, 0,
+  59, 11, 0, 0, 65, 56, 0, 25, 23, 0,
+  0, 13, 0, 13, 0, 11, 92, 0, 18, 0,
+  0, 32, 0, 53, 0, 28, 0, 44, 48, 94,
+  4, 86, 0, 7, 0, 38, 52, 0, 35, 0,
+  21, 0, 24, 0, 13, 27, 0, 40, 0, 11,
+  10, 0, 33, 0, 8, 0, 25, 13, 37, 0,
+  0, 0, 0, 15, 39, 0, 14, 13, 0, 0,
+  0, 0, 0, 24, 0, 0, 0, 13, 0, 47,
+  0, 0, 62, 50, 3, 0, 0, 13, 20, 1,
+  44, 0, 24, 28, 0, 29, 0, 15, 0, 0,
+  25, 0, 11, 10, 47, 0, 42, 0, 79, 0,
+  14, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 30, 25, 0, 1, 3, 33, 18, 0, 0,
+  0, 0, 0, 38, 0, 18, 43, 15, 0, 40,
+  38, 17, 58, 51, 0, 9, 8, 5, 128, 38,
+  0, 0, 54, 0, 69, 16, 0, 30, 0, 38,
+  21, 38, 0, 22, 60, 37, 2, 0, 0, 0,
+  0, 13, 47, 0, 16, 0, 64, 0, 29, 0,
+  6, 33, 7, 0, 0, 0, 7, 19, 25, 0,
+  0, 36, 79, 26, 45, 46, 0, 7, 30, 1,
+  38, 2, 13, 0, 0, 0, 0, 0, 54, 6,
+  3, 0, 38, 1, 15, 56, 0, 0, 37, 35,
+  9, 0, 0, 19, 20, 19, 57, 1, 0, 26,
+  0, 8, 0, 33, 5, 0, 23, 13, 0, 22,
+  19, 0, 0, 0, 19, 0, 11, 9, 0, 48,
+  13, 14, 0, 0, 29, 34, 3, 0, 0, 37,
+  105, 0, 2, 11, 53, 15, 0, 14, 67, 51,
+  53, 17, 9, 0, 0, 9, 0, 0, 0, 0,
+  96, 0, 32, 9, 0, 24, 0, 75, 0, 32,
+  0, 38, 68, 64, 0, 61, 0, 41, 0, 28,
+  43, 1, 16, 0, 14, 0, 11, 0, 0, 0,
+  0, 18, 0, 0, 0, 0, 17, 0, 10, 2,
+  29, 20, 37, 0, 16, 39, 0, 22, 45, 0,
+  41, 0, 0, 0, 0, 0, 0, 7, 0, 0,
+  0, 7, 0, 48, 0, 0, 52, 46, 8, 0,
+  0, 12, 18, 0, 59, 0, 0, 16, 0, 17,
+  0, 17, 0, 0, 14, 0, 6, 8, 40, 0,
+  40, 0, 76, 0, 11, 0, 23, 32, 93, 27,
+  1, 9, 26, 5, 18, 0, 0, 0, 0, 103,
+  0, 30, 67, 4, 0, 16, 13, 75, 10, 41,
+  20, 0, 6, 20, 201, 42, 3, 62, 71, 0,
+  24, 0, 0, 56, 0, 4, 5, 32, 0, 22,
+  9, 88, 48, 0, 0, 0, 0, 51, 21, 3,
+  55, 0, 44, 0, 32, 0, 31, 72, 0, 0,
+  0, 0, 48, 9, 120, 30, 0, 10, 58, 0,
+  32, 0, 53, 0, 0, 37, 0, 0, 36, 11,
+  0, 15, 0, 0, 58, 5, 0, 0, 0, 3,
+  0, 36, 0, 0, 40, 101, 17, 0, 0, 52,
+  55, 89, 20, 0, 9, 0, 2, 9, 0, 33,
+  6, 2, 40, 0, 19, 12, 51, 0, 0, 0,
+  3, 0, 39, 30, 0, 67, 0, 11, 0, 33,
+  2, 0, 0, 0, 0, 17, 28, 49, 0, 0,
+  52, 3, 0, 0, 28, 58, 0, 42, 19, 0,
+  0, 8, 0, 9, 0, 26, 82, 21, 0, 0,
+  0, 27, 0, 8, 0, 40, 0, 22, 24, 91,
+  9, 110, 0, 0, 0, 27, 50, 0, 37, 0,
+  28, 0, 14, 0, 55, 50, 0, 43, 0, 0,
+  49, 11, 81, 0, 4, 0, 22, 7, 42, 0,
+  12, 0, 0, 26, 21, 0, 21, 24, 0, 0,
+  0, 0, 0, 9, 0, 0, 0, 9, 0, 20,
+  0, 0, 47, 83, 0, 52, 17, 21, 41, 51,
+  25, 0, 40, 5, 0, 40, 0, 11, 0, 0,
+  21, 0, 13, 13, 31, 0, 15, 0, 35, 1,
+  15, 0, 0, 27, 36, 37, 0, 42, 17, 9,
+  15, 0, 0, 22, 97, 0, 7, 27, 55, 8,
+  0, 0, 0, 69, 0, 8, 46, 0, 0, 20,
+  0, 2, 0, 37, 78, 0, 3, 0, 0, 24,
+  0, 73, 0, 34, 30, 29, 29, 57, 25, 42,
+  0, 28, 0, 43, 34, 9, 17, 0, 10, 0,
+  0, 0, 6, 14, 0, 16, 0, 0, 0, 0,
+  28, 0, 23, 6, 0, 10, 7, 0, 0, 23,
+  0, 35, 38, 0, 52, 56, 0, 0, 11, 0,
+  0, 18, 0, 0, 0, 4, 0, 16, 29, 0,
+  0, 66, 6, 0, 0, 10, 18, 0, 38, 0,
+  0, 6, 0, 7, 0, 1, 0, 0, 17, 0,
+  0, 0, 5, 0, 43, 0, 63, 0, 11, 0,
+  13, 24, 67, 6, 0, 18, 27, 22, 0, 0,
+  0, 0, 0, 97, 0, 0, 60, 4, 0, 5,
+  27, 86, 27, 52, 0, 0, 8, 9, 193, 55,
+  1, 28, 52, 0, 59, 1, 0, 58, 0, 17,
+  14, 39, 0, 14, 26, 83, 17, 0, 2, 0,
+  0, 64, 30, 0, 71, 0, 60, 0, 49, 0,
+  15, 71, 0, 0, 0, 0, 7, 6, 77, 33,
+  0, 22, 82, 11, 31, 27, 25, 0, 20, 13,
+  0, 0, 15, 5, 0, 0, 0, 0, 62, 3,
+  0, 0, 23, 0, 15, 37, 0, 0, 49, 67,
+  15, 0, 0, 37, 46, 75, 26, 0, 0, 6,
+  1, 16, 0, 37, 12, 0, 55, 0, 9, 28,
+  40, 0, 0, 0, 4, 0, 26, 26, 0, 60,
+  0, 15, 0, 5, 36, 23, 2, 0, 0, 31,
+  86, 8, 0, 0, 59, 11, 0, 0, 65, 56,
+  0, 25, 23, 0, 0, 13, 0, 13, 0, 11,
+  92, 0, 18, 0, 0, 32, 0, 53, 0, 28,
+  0, 44, 48, 94, 4, 86, 0, 7, 0, 38,
+  52, 0, 35, 0, 21, 0, 24, 0, 13, 27,
+  0, 40, 0, 11, 10, 0, 33, 0, 8, 0,
+  25, 13, 37, 0, 0, 0, 0, 15, 39, 0,
+  14, 13, 0, 0, 0, 0, 0, 24, 0, 0,
+  0, 13, 0, 47, 0, 0, 62, 50, 3, 0,
+  0, 13, 20, 1, 44, 0, 24, 28, 0, 29,
+  0, 15, 0, 0, 25, 0, 11, 10, 47, 0,
+  42, 0, 79, 0, 14, 0, 3, 28, 40, 34,
+  0, 19, 25, 3, 20, 0, 0, 31, 114, 0,
+  21, 37, 61, 3, 0, 0, 0, 74, 0, 5,
+  57, 0, 0, 30, 0, 1, 0, 41, 79, 0,
+  10, 0, 0, 27, 0, 80, 0, 41, 32, 32,
+  31, 55, 32, 23, 0, 44, 0, 50, 31, 17,
+  17, 0, 7, 0, 0, 0, 12, 0, 0, 36,
+  0, 0, 4, 0, 28, 0, 17, 10, 0, 3,
+  3, 0, 15, 36, 0, 33, 36, 0, 51, 45,
+  0, 0, 5, 0, 0, 36, 0, 0, 0, 5,
+  0, 25, 33, 0, 3, 68, 5, 0, 5, 7,
+  24, 0, 28, 0, 2, 10, 6, 14, 0, 1,
+  0, 0, 2, 0, 6, 0, 15, 4, 59, 0,
+  74, 0, 21, 0, 0, 30, 25, 0, 1, 3,
+  33, 18, 0, 0, 0, 0, 0, 38, 0, 18,
+  43, 15, 0, 40, 38, 17, 58, 51, 0, 9,
+  8, 5, 128, 38, 0, 0, 54, 0, 69, 16,
+  0, 30, 0, 38, 21, 38, 0, 22, 60, 37,
+  2, 0, 0, 0, 0, 13, 47, 0, 16, 0,
+  64, 0, 29, 0, 6, 33, 7, 0, 0, 0,
+  7, 19, 25, 0, 0, 36, 79, 26, 45, 46,
+  0, 7, 30, 1, 38, 2, 13, 0, 0, 0,
+  0, 0, 54, 6, 3, 0, 38, 1, 15, 56,
+  0, 0, 37, 35, 9, 0, 0, 19, 20, 19,
+  57, 1, 0, 26, 0, 8, 0, 33, 5, 0,
+  23, 13, 0, 22, 19, 0, 0, 0, 19, 0,
+  11, 9, 0, 48, 13, 14, 0, 0, 29, 34,
+  3, 0, 0, 37, 105, 0, 2, 11, 53, 15,
+  0, 14, 67, 51, 53, 17, 9, 0, 0, 9,
+  0, 0, 0, 0, 96, 0, 32, 9, 0, 24,
+  0, 75, 0, 32, 0, 38, 68, 64, 0, 61,
+  0, 41, 0, 28, 43, 1, 16, 0, 14, 0,
+  11, 0, 0, 0, 0, 18, 0, 0, 0, 0,
+  17, 0, 10, 2, 29, 20, 37, 0, 16, 39,
+  0, 22, 45, 0, 41, 0, 0, 0, 0, 0,
+  0, 7, 0, 0, 0, 7, 0, 48, 0, 0,
+  52, 46, 8, 0, 0, 12, 18, 0, 59, 0,
+  0, 16, 0, 17, 0, 17, 0, 0, 14, 0,
+  6, 8, 40, 0, 40, 0, 76, 0, 11, 0,
+  4, 29, 39, 21, 0, 5, 28, 2, 19, 0,
+  0, 34, 112, 0, 22, 39, 53, 0, 0, 0,
+  0, 83, 0, 10, 59, 0, 0, 23, 0, 0,
+  0, 41, 82, 0, 23, 0, 0, 23, 0, 78,
+  0, 55, 37, 22, 36, 48, 30, 16, 0, 54,
+  0, 60, 33, 24, 31, 0, 11, 0, 7, 0,
+  17, 0, 0, 63, 0, 10, 7, 0, 36, 0,
+  8, 20, 0, 4, 0, 0, 33, 43, 0, 29,
+  44, 0, 61, 29, 0, 0, 0, 0, 0, 31,
+  0, 0, 0, 4, 0, 29, 42, 0, 5, 76,
+  2, 0, 8, 14, 30, 0, 21, 0, 0, 0,
+  8, 15, 0, 0, 0, 0, 0, 0, 6, 2,
+  19, 0, 53, 0, 69, 0, 17, 0, 0, 67,
+  0, 11, 0, 33, 2, 0, 0, 0, 0, 17,
+  28, 49, 0, 0, 52, 3, 0, 0, 28, 58,
+  0, 42, 19, 0, 0, 8, 0, 9, 0, 26,
+  82, 21, 0, 0, 0, 27, 0, 8, 0, 40,
+  0, 22, 24, 91, 9, 110, 0, 0, 0, 27,
+  50, 0, 37, 0, 28, 0, 14, 0, 55, 50,
+  0, 43, 0, 0, 49, 11, 81, 0, 4, 0,
+  22, 7, 42, 0, 12, 0, 0, 26, 21, 0,
+  21, 24, 0, 0, 0, 0, 0, 9, 0, 0,
+  0, 9, 0, 20, 0, 0, 47, 83, 0, 52,
+  17, 21, 41, 51, 25, 0, 40, 5, 0, 40,
+  0, 11, 0, 0, 21, 0, 13, 13, 31, 0,
+  15, 0, 35, 1, 15, 0, 0, 27, 36, 37,
+  0, 42, 17, 9, 15, 0, 0, 22, 97, 0,
+  7, 27, 55, 8, 0, 0, 0, 69, 0, 8,
+  46, 0, 0, 20, 0, 2, 0, 37, 78, 0,
+  3, 0, 0, 24, 0, 73, 0, 34, 30, 29,
+  29, 57, 25, 42, 0, 28, 0, 43, 34, 9,
+  17, 0, 10, 0, 0, 0, 6, 14, 0, 16,
+  0, 0, 0, 0, 28, 0, 23, 6, 0, 10,
+  7, 0, 0, 23, 0, 35, 38, 0, 52, 56,
+  0, 0, 11, 0, 0, 18, 0, 0, 0, 4,
+  0, 16, 29, 0, 0, 66, 6, 0, 0, 10,
+  18, 0, 38, 0, 0, 6, 0, 7, 0, 1,
+  0, 0, 17, 0, 0, 0, 5, 0, 43, 0,
+  63, 0, 11, 0, 0, 0, 0, 15, 0, 142,
+  5, 0, 3, 0, 0, 27, 43, 0, 0, 0,
+  6, 0, 0, 0, 37, 88, 23, 15, 8, 0,
+  0, 0, 0, 13, 0, 22, 26, 24, 0, 2,
+  0, 36, 0, 50, 0, 35, 0, 56, 1, 71,
+  43, 43, 0, 0, 0, 38, 8, 0, 4, 0,
+  67, 0, 33, 0, 0, 57, 0, 0, 64, 0,
+  0, 26, 62, 0, 74, 26, 27, 3, 4, 32,
+  9, 25, 0, 31, 35, 0, 37, 52, 8, 0,
+  19, 0, 0, 0, 0, 11, 7, 0, 1, 26,
+  0, 0, 10, 66, 18, 0, 0, 7, 8, 0,
+  31, 0, 0, 0, 0, 0, 0, 15, 0, 0,
+  111, 2, 35, 3, 0, 0, 0, 0, 41, 0,
+  0, 0, 0, 60, 0, 15, 0, 5, 36, 23,
+  2, 0, 0, 31, 86, 8, 0, 0, 59, 11,
+  0, 0, 65, 56, 0, 25, 23, 0, 0, 13,
+  0, 13, 0, 11, 92, 0, 18, 0, 0, 32,
+  0, 53, 0, 28, 0, 44, 48, 94, 4, 86,
+  0, 7, 0, 38, 52, 0, 35, 0, 21, 0,
+  24, 0, 13, 27, 0, 40, 0, 11, 10, 0,
+  33, 0, 8, 0, 25, 13, 37, 0, 0, 0,
+  0, 15, 39, 0, 14, 13, 0, 0, 0, 0,
+  0, 24, 0, 0, 0, 13, 0, 47, 0, 0,
+  62, 50, 3, 0, 0, 13, 20, 1, 44, 0,
+  24, 28, 0, 29, 0, 15, 0, 0, 25, 0,
+  11, 10, 47, 0, 42, 0, 79, 0, 14, 0,
+  3, 28, 40, 34, 0, 19, 25, 3, 20, 0,
+  0, 31, 114, 0, 21, 37, 61, 3, 0, 0,
+  0, 74, 0, 5, 57, 0, 0, 30, 0, 1,
+  0, 41, 79, 0, 10, 0, 0, 27, 0, 80,
+  0, 41, 32, 32, 31, 55, 32, 23, 0, 44,
+  0, 50, 31, 17, 17, 0, 7, 0, 0, 0,
+  12, 0, 0, 36, 0, 0, 4, 0, 28, 0,
+  17, 10, 0, 3, 3, 0, 15, 36, 0, 33,
+  36, 0, 51, 45, 0, 0, 5, 0, 0, 36,
+  0, 0, 0, 5, 0, 25, 33, 0, 3, 68,
+  5, 0, 5, 7, 24, 0, 28, 0, 2, 10,
+  6, 14, 0, 1, 0, 0, 2, 0, 6, 0,
+  15, 4, 59, 0, 74, 0, 21, 0, 0, 0,
+  0, 16, 0, 145, 3, 0, 12, 0, 0, 27,
+  50, 0, 0, 22, 2, 0, 1, 0, 35, 91,
+  18, 9, 3, 0, 0, 0, 0, 4, 0, 27,
+  23, 43, 0, 0, 0, 30, 0, 60, 0, 29,
+  0, 69, 6, 72, 26, 52, 0, 0, 0, 48,
+  12, 0, 0, 0, 56, 0, 35, 0, 2, 55,
+  0, 0, 72, 0, 0, 20, 53, 0, 83, 22,
+  17, 0, 0, 33, 2, 22, 0, 37, 41, 0,
+  32, 49, 7, 0, 27, 0, 0, 0, 0, 13,
+  1, 0, 15, 38, 0, 0, 2, 68, 27, 0,
+  0, 7, 17, 0, 22, 0, 0, 0, 0, 0,
+  0, 29, 0, 0, 104, 4, 40, 7, 0, 0,
+  0, 0, 54, 0, 3, 0, 0, 48, 13, 14,
+  0, 0, 29, 34, 3, 0, 0, 37, 105, 0,
+  2, 11, 53, 15, 0, 14, 67, 51, 53, 17,
+  9, 0, 0, 9, 0, 0, 0, 0, 96, 0,
+  32, 9, 0, 24, 0, 75, 0, 32, 0, 38,
+  68, 64, 0, 61, 0, 41, 0, 28, 43, 1,
+  16, 0, 14, 0, 11, 0, 0, 0, 0, 18,
+  0, 0, 0, 0, 17, 0, 10, 2, 29, 20,
+  37, 0, 16, 39, 0, 22, 45, 0, 41, 0,
+  0, 0, 0, 0, 0, 7, 0, 0, 0, 7,
+  0, 48, 0, 0, 52, 46, 8, 0, 0, 12,
+  18, 0, 59, 0, 0, 16, 0, 17, 0, 17,
+  0, 0, 14, 0, 6, 8, 40, 0, 40, 0,
+  76, 0, 11, 0, 4, 29, 39, 21, 0, 5,
+  28, 2, 19, 0, 0, 34, 112, 0, 22, 39,
+  53, 0, 0, 0, 0, 83, 0, 10, 59, 0,
+  0, 23, 0, 0, 0, 41, 82, 0, 23, 0,
+  0, 23, 0, 78, 0, 55, 37, 22, 36, 48,
+  30, 16, 0, 54, 0, 60, 33, 24, 31, 0,
+  11, 0, 7, 0, 17, 0, 0, 63, 0, 10,
+  7, 0, 36, 0, 8, 20, 0, 4, 0, 0,
+  33, 43, 0, 29, 44, 0, 61, 29, 0, 0,
+  0, 0, 0, 31, 0, 0, 0, 4, 0, 29,
+  42, 0, 5, 76, 2, 0, 8, 14, 30, 0,
+  21, 0, 0, 0, 8, 15, 0, 0, 0, 0,
+  0, 0, 6, 2, 19, 0, 53, 0, 69, 0,
+  17, 0, 0, 0, 0, 10, 0, 139, 4, 0,
+  12, 0, 0, 18, 33, 0, 0, 25, 0, 0,
+  0, 0, 30, 95, 19, 11, 3, 0, 0, 0,
+  0, 0, 0, 27, 29, 38, 0, 0, 0, 23,
+  0, 54, 0, 22, 0, 53, 1, 90, 35, 56,
+  0, 0, 0, 51, 6, 0, 10, 0, 55, 0,
+  49, 0, 11, 61, 0, 0, 76, 3, 0, 3,
+  55, 0, 82, 11, 11, 0, 0, 21, 26, 25,
+  0, 32, 34, 0, 41, 44, 0, 0, 22, 0,
+  0, 7, 0, 21, 4, 0, 4, 31, 0, 0,
+  7, 66, 36, 0, 0, 23, 27, 0, 16, 0,
+  0, 0, 0, 0, 0, 35, 0, 0, 100, 2,
+  34, 1, 0, 0, 0, 0, 28, 0, 0, 0,
+  0, 27, 36, 37, 0, 42, 17, 9, 15, 0,
+  0, 22, 97, 0, 7, 27, 55, 8, 0, 0,
+  0, 69, 0, 8, 46, 0, 0, 20, 0, 2,
+  0, 37, 78, 0, 3, 0, 0, 24, 0, 73,
+  0, 34, 30, 29, 29, 57, 25, 42, 0, 28,
+  0, 43, 34, 9, 17, 0, 10, 0, 0, 0,
+  6, 14, 0, 16, 0, 0, 0, 0, 28, 0,
+  23, 6, 0, 10, 7, 0, 0, 23, 0, 35,
+  38, 0, 52, 56, 0, 0, 11, 0, 0, 18,
+  0, 0, 0, 4, 0, 16, 29, 0, 0, 66,
+  6, 0, 0, 10, 18, 0, 38, 0, 0, 6,
+  0, 7, 0, 1, 0, 0, 17, 0, 0, 0,
+  5, 0, 43, 0, 63, 0, 11, 0, 0, 0,
+  0, 15, 0, 142, 5, 0, 3, 0, 0, 27,
+  43, 0, 0, 0, 6, 0, 0, 0, 37, 88,
+  23, 15, 8, 0, 0, 0, 0, 13, 0, 22,
+  26, 24, 0, 2, 0, 36, 0, 50, 0, 35,
+  0, 56, 1, 71, 43, 43, 0, 0, 0, 38,
+  8, 0, 4, 0, 67, 0, 33, 0, 0, 57,
+  0, 0, 64, 0, 0, 26, 62, 0, 74, 26,
+  27, 3, 4, 32, 9, 25, 0, 31, 35, 0,
+  37, 52, 8, 0, 19, 0, 0, 0, 0, 11,
+  7, 0, 1, 26, 0, 0, 10, 66, 18, 0,
+  0, 7, 8, 0, 31, 0, 0, 0, 0, 0,
+  0, 15, 0, 0, 111, 2, 35, 3, 0, 0,
+  0, 0, 41, 0, 0, 0, 0, 0, 0, 0,
+  0, 51, 48, 0, 17, 0, 0, 1, 56, 0,
+  12, 28, 33, 20, 5, 18, 77, 0, 0, 29,
+  0, 42, 17, 0, 0, 38, 0, 0, 71, 57,
+  0, 0, 0, 12, 0, 39, 0, 43, 0, 51,
+  0, 34, 20, 45, 0, 31, 15, 0, 71, 13,
+  0, 6, 44, 0, 0, 54, 15, 0, 0, 0,
+  0, 0, 23, 28, 33, 0, 0, 13, 0, 22,
+  15, 54, 0, 0, 0, 29, 69, 6, 16, 0,
+  25, 0, 11, 13, 3, 2, 0, 26, 5, 14,
+  0, 26, 0, 0, 43, 47, 11, 6, 0, 0,
+  0, 0, 43, 0, 0, 46, 1, 0, 0, 11,
+  0, 0, 48, 15, 46, 0, 23, 0, 104, 0,
+  47, 0, 0, 0, 3, 28, 40, 34, 0, 19,
+  25, 3, 20, 0, 0, 31, 114, 0, 21, 37,
+  61, 3, 0, 0, 0, 74, 0, 5, 57, 0,
+  0, 30, 0, 1, 0, 41, 79, 0, 10, 0,
+  0, 27, 0, 80, 0, 41, 32, 32, 31, 55,
+  32, 23, 0, 44, 0, 50, 31, 17, 17, 0,
+  7, 0, 0, 0, 12, 0, 0, 36, 0, 0,
+  4, 0, 28, 0, 17, 10, 0, 3, 3, 0,
+  15, 36, 0, 33, 36, 0, 51, 45, 0, 0,
+  5, 0, 0, 36, 0, 0, 0, 5, 0, 25,
+  33, 0, 3, 68, 5, 0, 5, 7, 24, 0,
+  28, 0, 2, 10, 6, 14, 0, 1, 0, 0,
+  2, 0, 6, 0, 15, 4, 59, 0, 74, 0,
+  21, 0, 0, 0, 0, 16, 0, 145, 3, 0,
+  12, 0, 0, 27, 50, 0, 0, 22, 2, 0,
+  1, 0, 35, 91, 18, 9, 3, 0, 0, 0,
+  0, 4, 0, 27, 23, 43, 0, 0, 0, 30,
+  0, 60, 0, 29, 0, 69, 6, 72, 26, 52,
+  0, 0, 0, 48, 12, 0, 0, 0, 56, 0,
+  35, 0, 2, 55, 0, 0, 72, 0, 0, 20,
+  53, 0, 83, 22, 17, 0, 0, 33, 2, 22,
+  0, 37, 41, 0, 32, 49, 7, 0, 27, 0,
+  0, 0, 0, 13, 1, 0, 15, 38, 0, 0,
+  2, 68, 27, 0, 0, 7, 17, 0, 22, 0,
+  0, 0, 0, 0, 0, 29, 0, 0, 104, 4,
+  40, 7, 0, 0, 0, 0, 54, 0, 3, 0,
+  0, 0, 0, 0, 0, 45, 41, 0, 20, 0,
+  0, 0, 75, 11, 19, 55, 39, 21, 25, 2,
+  84, 0, 0, 27, 13, 52, 3, 2, 0, 52,
+  0, 0, 56, 63, 0, 0, 0, 0, 0, 59,
+  0, 43, 0, 45, 7, 20, 17, 36, 0, 46,
+  0, 0, 66, 22, 0, 0, 25, 0, 0, 76,
+  20, 0, 0, 2, 0, 0, 13, 21, 31, 0,
+  0, 26, 0, 14, 8, 55, 0, 0, 0, 54,
+  58, 17, 20, 5, 37, 0, 12, 14, 8, 14,
+  4, 15, 7, 17, 1, 41, 0, 0, 39, 55,
+  6, 0, 4, 0, 0, 0, 35, 0, 0, 42,
+  13, 0, 0, 5, 0, 0, 43, 15, 52, 0,
+  18, 3, 121, 0, 68, 0, 9, 0, 4, 29,
+  39, 21, 0, 5, 28, 2, 19, 0, 0, 34,
+  112, 0, 22, 39, 53, 0, 0, 0, 0, 83,
+  0, 10, 59, 0, 0, 23, 0, 0, 0, 41,
+  82, 0, 23, 0, 0, 23, 0, 78, 0, 55,
+  37, 22, 36, 48, 30, 16, 0, 54, 0, 60,
+  33, 24, 31, 0, 11, 0, 7, 0, 17, 0,
+  0, 63, 0, 10, 7, 0, 36, 0, 8, 20,
+  0, 4, 0, 0, 33, 43, 0, 29, 44, 0,
+  61, 29, 0, 0, 0, 0, 0, 31, 0, 0,
+  0, 4, 0, 29, 42, 0, 5, 76, 2, 0,
+  8, 14, 30, 0, 21, 0, 0, 0, 8, 15,
+  0, 0, 0, 0, 0, 0, 6, 2, 19, 0,
+  53, 0, 69, 0, 17, 0, 0, 0, 0, 10,
+  0, 139, 4, 0, 12, 0, 0, 18, 33, 0,
+  0, 25, 0, 0, 0, 0, 30, 95, 19, 11,
+  3, 0, 0, 0, 0, 0, 0, 27, 29, 38,
+  0, 0, 0, 23, 0, 54, 0, 22, 0, 53,
+  1, 90, 35, 56, 0, 0, 0, 51, 6, 0,
+  10, 0, 55, 0, 49, 0, 11, 61, 0, 0,
+  76, 3, 0, 3, 55, 0, 82, 11, 11, 0,
+  0, 21, 26, 25, 0, 32, 34, 0, 41, 44,
+  0, 0, 22, 0, 0, 7, 0, 21, 4, 0,
+  4, 31, 0, 0, 7, 66, 36, 0, 0, 23,
+  27, 0, 16, 0, 0, 0, 0, 0, 0, 35,
+  0, 0, 100, 2, 34, 1, 0, 0, 0, 0,
+  28, 0, 0, 0, 0, 0, 0, 0, 9, 38,
+  29, 0, 28, 0, 15, 0, 49, 21, 13, 59,
+  25, 11, 12, 5, 68, 0, 0, 42, 2, 24,
+  1, 0, 0, 35, 0, 0, 51, 61, 4, 0,
+  0, 0, 0, 42, 8, 38, 0, 45, 9, 26,
+  16, 31, 0, 20, 23, 0, 74, 24, 0, 0,
+  43, 0, 0, 56, 26, 7, 0, 0, 0, 0,
+  26, 8, 30, 0, 0, 7, 0, 8, 2, 45,
+  9, 0, 0, 52, 52, 14, 29, 21, 20, 0,
+  7, 19, 17, 28, 6, 32, 0, 6, 20, 41,
+  0, 0, 30, 59, 7, 0, 1, 0, 0, 0,
+  35, 0, 0, 25, 13, 0, 0, 13, 0, 0,
+  41, 20, 37, 0, 1, 0, 90, 0, 36, 0,
+  0, 0, 0, 0, 0, 15, 0, 142, 5, 0,
+  3, 0, 0, 27, 43, 0, 0, 0, 6, 0,
+  0, 0, 37, 88, 23, 15, 8, 0, 0, 0,
+  0, 13, 0, 22, 26, 24, 0, 2, 0, 36,
+  0, 50, 0, 35, 0, 56, 1, 71, 43, 43,
+  0, 0, 0, 38, 8, 0, 4, 0, 67, 0,
+  33, 0, 0, 57, 0, 0, 64, 0, 0, 26,
+  62, 0, 74, 26, 27, 3, 4, 32, 9, 25,
+  0, 31, 35, 0, 37, 52, 8, 0, 19, 0,
+  0, 0, 0, 11, 7, 0, 1, 26, 0, 0,
+  10, 66, 18, 0, 0, 7, 8, 0, 31, 0,
+  0, 0, 0, 0, 0, 15, 0, 0, 111, 2,
+  35, 3, 0, 0, 0, 0, 41, 0, 0, 0,
+  0, 0, 0, 0, 0, 51, 48, 0, 17, 0,
+  0, 1, 56, 0, 12, 28, 33, 20, 5, 18,
+  77, 0, 0, 29, 0, 42, 17, 0, 0, 38,
+  0, 0, 71, 57, 0, 0, 0, 12, 0, 39,
+  0, 43, 0, 51, 0, 34, 20, 45, 0, 31,
+  15, 0, 71, 13, 0, 6, 44, 0, 0, 54,
+  15, 0, 0, 0, 0, 0, 23, 28, 33, 0,
+  0, 13, 0, 22, 15, 54, 0, 0, 0, 29,
+  69, 6, 16, 0, 25, 0, 11, 13, 3, 2,
+  0, 26, 5, 14, 0, 26, 0, 0, 43, 47,
+  11, 6, 0, 0, 0, 0, 43, 0, 0, 46,
+  1, 0, 0, 11, 0, 0, 48, 15, 46, 0,
+  23, 0, 104, 0, 47, 0, 0, 0, 0, 29,
+  0, 0, 20, 0, 45, 0, 38, 0, 0, 2,
+  26, 28, 73, 29, 52, 53, 0, 24, 91, 0,
+  0, 24, 16, 39, 26, 0, 0, 20, 0, 0,
+  40, 12, 3, 0, 0, 8, 0, 47, 0, 9,
+  0, 58, 0, 33, 12, 19, 0, 0, 17, 3,
+  66, 44, 0, 0, 7, 0, 0, 3, 7, 0,
+  0, 0, 0, 0, 42, 7, 32, 0, 0, 0,
+  0, 10, 51, 0, 4, 0, 0, 8, 61, 18,
+  25, 0, 32, 0, 8, 4, 12, 12, 2, 0,
+  0, 26, 0, 31, 0, 0, 56, 29, 0, 2,
+  0, 0, 0, 0, 30, 0, 7, 37, 0, 0,
+  0, 21, 0, 0, 7, 6, 14, 0, 16, 0,
+  90, 0, 25, 0, 12, 0, 0, 0, 0, 16,
+  0, 145, 3, 0, 12, 0, 0, 27, 50, 0,
+  0, 22, 2, 0, 1, 0, 35, 91, 18, 9,
+  3, 0, 0, 0, 0, 4, 0, 27, 23, 43,
+  0, 0, 0, 30, 0, 60, 0, 29, 0, 69,
+  6, 72, 26, 52, 0, 0, 0, 48, 12, 0,
+  0, 0, 56, 0, 35, 0, 2, 55, 0, 0,
+  72, 0, 0, 20, 53, 0, 83, 22, 17, 0,
+  0, 33, 2, 22, 0, 37, 41, 0, 32, 49,
+  7, 0, 27, 0, 0, 0, 0, 13, 1, 0,
+  15, 38, 0, 0, 2, 68, 27, 0, 0, 7,
+  17, 0, 22, 0, 0, 0, 0, 0, 0, 29,
+  0, 0, 104, 4, 40, 7, 0, 0, 0, 0,
+  54, 0, 3, 0, 0, 0, 0, 0, 0, 45,
+  41, 0, 20, 0, 0, 0, 75, 11, 19, 55,
+  39, 21, 25, 2, 84, 0, 0, 27, 13, 52,
+  3, 2, 0, 52, 0, 0, 56, 63, 0, 0,
+  0, 0, 0, 59, 0, 43, 0, 45, 7, 20,
+  17, 36, 0, 46, 0, 0, 66, 22, 0, 0,
+  25, 0, 0, 76, 20, 0, 0, 2, 0, 0,
+  13, 21, 31, 0, 0, 26, 0, 14, 8, 55,
+  0, 0, 0, 54, 58, 17, 20, 5, 37, 0,
+  12, 14, 8, 14, 4, 15, 7, 17, 1, 41,
+  0, 0, 39, 55, 6, 0, 4, 0, 0, 0,
+  35, 0, 0, 42, 13, 0, 0, 5, 0, 0,
+  43, 15, 52, 0, 18, 3, 121, 0, 68, 0,
+  9, 0, 0, 49, 1, 0, 30, 0, 15, 0,
+  64, 0, 0, 7, 46, 41, 52, 60, 59, 47,
+  14, 4, 85, 0, 0, 29, 21, 32, 22, 9,
+  0, 19, 0, 0, 33, 0, 0, 0, 0, 0,
+  0, 62, 0, 0, 0, 54, 0, 32, 4, 0,
+  0, 16, 7, 12, 54, 37, 0, 0, 0, 0,
+  0, 0, 1, 0, 0, 0, 0, 0, 49, 0,
+  30, 0, 0, 0, 5, 29, 27, 0, 0, 9,
+  0, 21, 35, 23, 45, 0, 23, 22, 4, 26,
+  21, 30, 26, 0, 0, 24, 0, 19, 0, 0,
+  46, 43, 11, 0, 0, 0, 0, 0, 30, 1,
+  0, 44, 0, 0, 0, 16, 0, 0, 1, 3,
+  6, 0, 0, 0, 95, 0, 52, 0, 20, 0,
+  0, 0, 0, 10, 0, 139, 4, 0, 12, 0,
+  0, 18, 33, 0, 0, 25, 0, 0, 0, 0,
+  30, 95, 19, 11, 3, 0, 0, 0, 0, 0,
+  0, 27, 29, 38, 0, 0, 0, 23, 0, 54,
+  0, 22, 0, 53, 1, 90, 35, 56, 0, 0,
+  0, 51, 6, 0, 10, 0, 55, 0, 49, 0,
+  11, 61, 0, 0, 76, 3, 0, 3, 55, 0,
+  82, 11, 11, 0, 0, 21, 26, 25, 0, 32,
+  34, 0, 41, 44, 0, 0, 22, 0, 0, 7,
+  0, 21, 4, 0, 4, 31, 0, 0, 7, 66,
+  36, 0, 0, 23, 27, 0, 16, 0, 0, 0,
+  0, 0, 0, 35, 0, 0, 100, 2, 34, 1,
+  0, 0, 0, 0, 28, 0, 0, 0, 0, 0,
+  0, 0, 9, 38, 29, 0, 28, 0, 15, 0,
+  49, 21, 13, 59, 25, 11, 12, 5, 68, 0,
+  0, 42, 2, 24, 1, 0, 0, 35, 0, 0,
+  51, 61, 4, 0, 0, 0, 0, 42, 8, 38,
+  0, 45, 9, 26, 16, 31, 0, 20, 23, 0,
+  74, 24, 0, 0, 43, 0, 0, 56, 26, 7,
+  0, 0, 0, 0, 26, 8, 30, 0, 0, 7,
+  0, 8, 2, 45, 9, 0, 0, 52, 52, 14,
+  29, 21, 20, 0, 7, 19, 17, 28, 6, 32,
+  0, 6, 20, 41, 0, 0, 30, 59, 7, 0,
+  1, 0, 0, 0, 35, 0, 0, 25, 13, 0,
+  0, 13, 0, 0, 41, 20, 37, 0, 1, 0,
+  90, 0, 36, 0, 0, 0, 0, 41, 38, 0,
+  0, 0, 0, 0, 61, 6, 0, 16, 12, 19,
+  25, 54, 49, 37, 21, 5, 43, 0, 53, 32,
+  0, 0, 35, 21, 0, 0, 0, 0, 32, 0,
+  3, 0, 0, 0, 0, 35, 0, 0, 0, 27,
+  0, 26, 0, 0, 0, 15, 28, 3, 38, 9,
+  0, 0, 27, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 56, 0, 5, 0, 0, 0, 1, 44,
+  11, 11, 0, 62, 0, 23, 13, 12, 56, 44,
+  1, 24, 0, 29, 27, 31, 52, 10, 0, 0,
+  12, 0, 0, 0, 11, 51, 42, 0, 0, 0,
+  0, 0, 41, 0, 0, 48, 5, 0, 0, 10,
+  0, 0, 7, 0, 0, 0, 0, 0, 47, 0,
+  21, 0, 1, 20, 0, 0, 0, 0, 0, 51,
+  48, 0, 17, 0, 0, 1, 56, 0, 12, 28,
+  33, 20, 5, 18, 77, 0, 0, 29, 0, 42,
+  17, 0, 0, 38, 0, 0, 71, 57, 0, 0,
+  0, 12, 0, 39, 0, 43, 0, 51, 0, 34,
+  20, 45, 0, 31, 15, 0, 71, 13, 0, 6,
+  44, 0, 0, 54, 15, 0, 0, 0, 0, 0,
+  23, 28, 33, 0, 0, 13, 0, 22, 15, 54,
+  0, 0, 0, 29, 69, 6, 16, 0, 25, 0,
+  11, 13, 3, 2, 0, 26, 5, 14, 0, 26,
+  0, 0, 43, 47, 11, 6, 0, 0, 0, 0,
+  43, 0, 0, 46, 1, 0, 0, 11, 0, 0,
+  48, 15, 46, 0, 23, 0, 104, 0, 47, 0,
+  0, 0, 0, 29, 0, 0, 20, 0, 45, 0,
+  38, 0, 0, 2, 26, 28, 73, 29, 52, 53,
+  0, 24, 91, 0, 0, 24, 16, 39, 26, 0,
+  0, 20, 0, 0, 40, 12, 3, 0, 0, 8,
+  0, 47, 0, 9, 0, 58, 0, 33, 12, 19,
+  0, 0, 17, 3, 66, 44, 0, 0, 7, 0,
+  0, 3, 7, 0, 0, 0, 0, 0, 42, 7,
+  32, 0, 0, 0, 0, 10, 51, 0, 4, 0,
+  0, 8, 61, 18, 25, 0, 32, 0, 8, 4,
+  12, 12, 2, 0, 0, 26, 0, 31, 0, 0,
+  56, 29, 0, 2, 0, 0, 0, 0, 30, 0,
+  7, 37, 0, 0, 0, 21, 0, 0, 7, 6,
+  14, 0, 16, 0, 90, 0, 25, 0, 12, 0,
+  0, 65, 0, 0, 34, 0, 36, 0, 61, 12,
+  0, 5, 44, 54, 61, 74, 64, 45, 0, 12,
+  72, 0, 0, 33, 31, 57, 17, 27, 0, 12,
+  0, 0, 29, 8, 17, 0, 0, 37, 0, 58,
+  0, 3, 0, 54, 0, 29, 24, 4, 0, 0,
+  35, 0, 43, 56, 0, 0, 7, 0, 0, 32,
+  0, 0, 0, 0, 0, 0, 70, 9, 41, 0,
+  0, 0, 0, 18, 51, 0, 0, 21, 0, 27,
+  40, 52, 13, 20, 40, 15, 0, 9, 25, 57,
+  3, 0, 0, 59, 0, 27, 0, 5, 69, 44,
+  0, 0, 0, 0, 2, 0, 12, 20, 36, 60,
+  0, 0, 0, 21, 0, 0, 0, 18, 24, 0,
+  0, 1, 134, 0, 38, 0, 44, 0, 0, 0,
+  0, 0, 0, 45, 41, 0, 20, 0, 0, 0,
+  75, 11, 19, 55, 39, 21, 25, 2, 84, 0,
+  0, 27, 13, 52, 3, 2, 0, 52, 0, 0,
+  56, 63, 0, 0, 0, 0, 0, 59, 0, 43,
+  0, 45, 7, 20, 17, 36, 0, 46, 0, 0,
+  66, 22, 0, 0, 25, 0, 0, 76, 20, 0,
+  0, 2, 0, 0, 13, 21, 31, 0, 0, 26,
+  0, 14, 8, 55, 0, 0, 0, 54, 58, 17,
+  20, 5, 37, 0, 12, 14, 8, 14, 4, 15,
+  7, 17, 1, 41, 0, 0, 39, 55, 6, 0,
+  4, 0, 0, 0, 35, 0, 0, 42, 13, 0,
+  0, 5, 0, 0, 43, 15, 52, 0, 18, 3,
+  121, 0, 68, 0, 9, 0, 0, 49, 1, 0,
+  30, 0, 15, 0, 64, 0, 0, 7, 46, 41,
+  52, 60, 59, 47, 14, 4, 85, 0, 0, 29,
+  21, 32, 22, 9, 0, 19, 0, 0, 33, 0,
+  0, 0, 0, 0, 0, 62, 0, 0, 0, 54,
+  0, 32, 4, 0, 0, 16, 7, 12, 54, 37,
+  0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+  0, 0, 49, 0, 30, 0, 0, 0, 5, 29,
+  27, 0, 0, 9, 0, 21, 35, 23, 45, 0,
+  23, 22, 4, 26, 21, 30, 26, 0, 0, 24,
+  0, 19, 0, 0, 46, 43, 11, 0, 0, 0,
+  0, 0, 30, 1, 0, 44, 0, 0, 0, 16,
+  0, 0, 1, 3, 6, 0, 0, 0, 95, 0,
+  52, 0, 20, 0, 0, 44, 27, 0, 33, 0,
+  0, 0, 76, 0, 0, 1, 67, 69, 11, 51,
+  63, 32, 6, 0, 66, 0, 0, 38, 0, 0,
+  28, 40, 0, 0, 0, 0, 7, 0, 0, 0,
+  0, 27, 0, 47, 0, 0, 0, 20, 0, 38,
+  0, 0, 0, 16, 0, 34, 21, 7, 0, 0,
+  0, 8, 0, 0, 0, 0, 0, 0, 0, 0,
+  98, 0, 25, 5, 0, 0, 0, 78, 9, 0,
+  0, 35, 0, 0, 12, 5, 38, 41, 20, 53,
+  0, 44, 32, 14, 27, 37, 0, 13, 0, 0,
+  0, 0, 28, 63, 38, 0, 0, 0, 0, 0,
+  3, 36, 0, 61, 0, 0, 0, 5, 3, 0,
+  4, 0, 0, 0, 0, 0, 77, 0, 26, 0,
+  18, 21, 0, 0, 0, 0, 9, 38, 29, 0,
+  28, 0, 15, 0, 49, 21, 13, 59, 25, 11,
+  12, 5, 68, 0, 0, 42, 2, 24, 1, 0,
+  0, 35, 0, 0, 51, 61, 4, 0, 0, 0,
+  0, 42, 8, 38, 0, 45, 9, 26, 16, 31,
+  0, 20, 23, 0, 74, 24, 0, 0, 43, 0,
+  0, 56, 26, 7, 0, 0, 0, 0, 26, 8,
+  30, 0, 0, 7, 0, 8, 2, 45, 9, 0,
+  0, 52, 52, 14, 29, 21, 20, 0, 7, 19,
+  17, 28, 6, 32, 0, 6, 20, 41, 0, 0,
+  30, 59, 7, 0, 1, 0, 0, 0, 35, 0,
+  0, 25, 13, 0, 0, 13, 0, 0, 41, 20,
+  37, 0, 1, 0, 90, 0, 36, 0, 0, 0,
+  0, 41, 38, 0, 0, 0, 0, 0, 61, 6,
+  0, 16, 12, 19, 25, 54, 49, 37, 21, 5,
+  43, 0, 53, 32, 0, 0, 35, 21, 0, 0,
+  0, 0, 32, 0, 3, 0, 0, 0, 0, 35,
+  0, 0, 0, 27, 0, 26, 0, 0, 0, 15,
+  28, 3, 38, 9, 0, 0, 27, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 56, 0, 5, 0,
+  0, 0, 1, 44, 11, 11, 0, 62, 0, 23,
+  13, 12, 56, 44, 1, 24, 0, 29, 27, 31,
+  52, 10, 0, 0, 12, 0, 0, 0, 11, 51,
+  42, 0, 0, 0, 0, 0, 41, 0, 0, 48,
+  5, 0, 0, 10, 0, 0, 7, 0, 0, 0,
+  0, 0, 47, 0, 21, 0, 1, 20, 52, 0,
+  43, 0, 22, 0, 0, 0, 29, 0, 0, 0,
+  38, 88, 0, 0, 38, 0, 13, 0, 33, 104,
+  68, 26, 0, 0, 8, 50, 0, 0, 0, 10,
+  0, 4, 0, 0, 0, 20, 0, 11, 1, 0,
+  0, 0, 0, 16, 0, 0, 0, 7, 0, 77,
+  0, 0, 52, 0, 26, 23, 6, 0, 25, 0,
+  0, 6, 24, 0, 92, 16, 18, 73, 0, 0,
+  0, 73, 0, 0, 0, 50, 0, 0, 0, 0,
+  11, 59, 10, 49, 0, 55, 10, 0, 0, 37,
+  0, 0, 5, 0, 13, 0, 23, 61, 29, 7,
+  1, 0, 19, 2, 0, 26, 0, 53, 0, 7,
+  0, 0, 0, 23, 69, 0, 1, 0, 0, 31,
+  0, 0, 4, 0, 0, 61, 0, 29, 0, 0,
+  20, 0, 45, 0, 38, 0, 0, 2, 26, 28,
+  73, 29, 52, 53, 0, 24, 91, 0, 0, 24,
+  16, 39, 26, 0, 0, 20, 0, 0, 40, 12,
+  3, 0, 0, 8, 0, 47, 0, 9, 0, 58,
+  0, 33, 12, 19, 0, 0, 17, 3, 66, 44,
+  0, 0, 7, 0, 0, 3, 7, 0, 0, 0,
+  0, 0, 42, 7, 32, 0, 0, 0, 0, 10,
+  51, 0, 4, 0, 0, 8, 61, 18, 25, 0,
+  32, 0, 8, 4, 12, 12, 2, 0, 0, 26,
+  0, 31, 0, 0, 56, 29, 0, 2, 0, 0,
+  0, 0, 30, 0, 7, 37, 0, 0, 0, 21,
+  0, 0, 7, 6, 14, 0, 16, 0, 90, 0,
+  25, 0, 12, 0, 0, 65, 0, 0, 34, 0,
+  36, 0, 61, 12, 0, 5, 44, 54, 61, 74,
+  64, 45, 0, 12, 72, 0, 0, 33, 31, 57,
+  17, 27, 0, 12, 0, 0, 29, 8, 17, 0,
+  0, 37, 0, 58, 0, 3, 0, 54, 0, 29,
+  24, 4, 0, 0, 35, 0, 43, 56, 0, 0,
+  7, 0, 0, 32, 0, 0, 0, 0, 0, 0,
+  70, 9, 41, 0, 0, 0, 0, 18, 51, 0,
+  0, 21, 0, 27, 40, 52, 13, 20, 40, 15,
+  0, 9, 25, 57, 3, 0, 0, 59, 0, 27,
+  0, 5, 69, 44, 0, 0, 0, 0, 2, 0,
+  12, 20, 36, 60, 0, 0, 0, 21, 0, 0,
+  0, 18, 24, 0, 0, 1, 134, 0, 38, 0,
+  44, 0, 0, 26, 42, 0, 40, 0, 0, 0,
+  68, 7, 0, 5, 43, 69, 21, 36, 59, 16,
+  3, 0, 30, 7, 16, 33, 0, 0, 32, 69,
+  0, 5, 0, 0, 0, 0, 0, 0, 0, 55,
+  0, 45, 0, 4, 0, 0, 0, 8, 12, 0,
+  0, 16, 23, 16, 0, 8, 0, 0, 24, 20,
+  0, 0, 0, 0, 0, 0, 0, 0, 70, 10,
+  16, 0, 0, 0, 0, 27, 24, 0, 0, 57,
+  0, 13, 0, 13, 15, 76, 12, 31, 0, 45,
+  9, 26, 24, 0, 0, 11, 0, 0, 0, 0,
+  52, 56, 16, 0, 0, 0, 1, 0, 7, 24,
+  39, 91, 4, 0, 0, 0, 0, 0, 11, 0,
+  10, 0, 0, 35, 51, 0, 0, 0, 24, 66,
+  0, 49, 1, 0, 30, 0, 15, 0, 64, 0,
+  0, 7, 46, 41, 52, 60, 59, 47, 14, 4,
+  85, 0, 0, 29, 21, 32, 22, 9, 0, 19,
+  0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+  0, 0, 0, 54, 0, 32, 4, 0, 0, 16,
+  7, 12, 54, 37, 0, 0, 0, 0, 0, 0,
+  1, 0, 0, 0, 0, 0, 49, 0, 30, 0,
+  0, 0, 5, 29, 27, 0, 0, 9, 0, 21,
+  35, 23, 45, 0, 23, 22, 4, 26, 21, 30,
+  26, 0, 0, 24, 0, 19, 0, 0, 46, 43,
+  11, 0, 0, 0, 0, 0, 30, 1, 0, 44,
+  0, 0, 0, 16, 0, 0, 1, 3, 6, 0,
+  0, 0, 95, 0, 52, 0, 20, 0, 0, 44,
+  27, 0, 33, 0, 0, 0, 76, 0, 0, 1,
+  67, 69, 11, 51, 63, 32, 6, 0, 66, 0,
+  0, 38, 0, 0, 28, 40, 0, 0, 0, 0,
+  7, 0, 0, 0, 0, 27, 0, 47, 0, 0,
+  0, 20, 0, 38, 0, 0, 0, 16, 0, 34,
+  21, 7, 0, 0, 0, 8, 0, 0, 0, 0,
+  0, 0, 0, 0, 98, 0, 25, 5, 0, 0,
+  0, 78, 9, 0, 0, 35, 0, 0, 12, 5,
+  38, 41, 20, 53, 0, 44, 32, 14, 27, 37,
+  0, 13, 0, 0, 0, 0, 28, 63, 38, 0,
+  0, 0, 0, 0, 3, 36, 0, 61, 0, 0,
+  0, 5, 3, 0, 4, 0, 0, 0, 0, 0,
+  77, 0, 26, 0, 18, 21, 29, 0, 57, 0,
+  12, 30, 0, 0, 52, 0, 0, 2, 43, 101,
+  14, 0, 40, 0, 0, 0, 32, 66, 0, 35,
+  0, 0, 0, 29, 0, 8, 0, 0, 0, 11,
+  0, 0, 0, 50, 0, 48, 0, 31, 0, 0,
+  0, 0, 0, 0, 6, 9, 0, 67, 0, 0,
+  11, 0, 13, 40, 0, 0, 5, 7, 0, 44,
+  0, 15, 58, 0, 30, 45, 0, 14, 0, 32,
+  0, 0, 0, 10, 0, 27, 0, 3, 29, 32,
+  45, 49, 0, 64, 21, 0, 0, 14, 0, 0,
+  0, 0, 0, 0, 30, 78, 0, 0, 0, 0,
+  0, 18, 0, 23, 14, 57, 17, 0, 0, 0,
+  29, 0, 59, 1, 9, 2, 0, 17, 0, 0,
+  0, 0, 0, 41, 0, 41, 38, 0, 0, 0,
+  0, 0, 61, 6, 0, 16, 12, 19, 25, 54,
+  49, 37, 21, 5, 43, 0, 53, 32, 0, 0,
+  35, 21, 0, 0, 0, 0, 32, 0, 3, 0,
+  0, 0, 0, 35, 0, 0, 0, 27, 0, 26,
+  0, 0, 0, 15, 28, 3, 38, 9, 0, 0,
+  27, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  56, 0, 5, 0, 0, 0, 1, 44, 11, 11,
+  0, 62, 0, 23, 13, 12, 56, 44, 1, 24,
+  0, 29, 27, 31, 52, 10, 0, 0, 12, 0,
+  0, 0, 11, 51, 42, 0, 0, 0, 0, 0,
+  41, 0, 0, 48, 5, 0, 0, 10, 0, 0,
+  7, 0, 0, 0, 0, 0, 47, 0, 21, 0,
+  1, 20, 52, 0, 43, 0, 22, 0, 0, 0,
+  29, 0, 0, 0, 38, 88, 0, 0, 38, 0,
+  13, 0, 33, 104, 68, 26, 0, 0, 8, 50,
+  0, 0, 0, 10, 0, 4, 0, 0, 0, 20,
+  0, 11, 1, 0, 0, 0, 0, 16, 0, 0,
+  0, 7, 0, 77, 0, 0, 52, 0, 26, 23,
+  6, 0, 25, 0, 0, 6, 24, 0, 92, 16,
+  18, 73, 0, 0, 0, 73, 0, 0, 0, 50,
+  0, 0, 0, 0, 11, 59, 10, 49, 0, 55,
+  10, 0, 0, 37, 0, 0, 5, 0, 13, 0,
+  23, 61, 29, 7, 1, 0, 19, 2, 0, 26,
+  0, 53, 0, 7, 0, 0, 0, 23, 69, 0,
+  1, 0, 0, 31, 0, 0, 4, 0, 0, 61,
+  44, 0, 0, 0, 25, 73, 0, 0, 7, 0,
+  0, 0, 26, 81, 0, 0, 48, 0, 0, 0,
+  40, 70, 0, 48, 0, 0, 0, 16, 0, 0,
+  0, 0, 0, 39, 0, 0, 0, 36, 0, 27,
+  0, 6, 0, 0, 20, 1, 0, 24, 22, 0,
+  0, 39, 0, 0, 0, 0, 10, 25, 0, 0,
+  31, 12, 0, 4, 0, 0, 87, 23, 22, 30,
+  0, 6, 0, 43, 7, 0, 0, 5, 0, 16,
+  0, 0, 0, 7, 9, 33, 0, 49, 1, 0,
+  0, 56, 0, 0, 0, 0, 0, 0, 17, 64,
+  6, 22, 16, 0, 10, 13, 0, 13, 8, 65,
+  0, 0, 0, 0, 0, 16, 82, 0, 8, 0,
+  12, 7, 0, 0, 0, 7, 4, 20, 0, 65,
+  0, 0, 34, 0, 36, 0, 61, 12, 0, 5,
+  44, 54, 61, 74, 64, 45, 0, 12, 72, 0,
+  0, 33, 31, 57, 17, 27, 0, 12, 0, 0,
+  29, 8, 17, 0, 0, 37, 0, 58, 0, 3,
+  0, 54, 0, 29, 24, 4, 0, 0, 35, 0,
+  43, 56, 0, 0, 7, 0, 0, 32, 0, 0,
+  0, 0, 0, 0, 70, 9, 41, 0, 0, 0,
+  0, 18, 51, 0, 0, 21, 0, 27, 40, 52,
+  13, 20, 40, 15, 0, 9, 25, 57, 3, 0,
+  0, 59, 0, 27, 0, 5, 69, 44, 0, 0,
+  0, 0, 2, 0, 12, 20, 36, 60, 0, 0,
+  0, 21, 0, 0, 0, 18, 24, 0, 0, 1,
+  134, 0, 38, 0, 44, 0, 0, 26, 42, 0,
+  40, 0, 0, 0, 68, 7, 0, 5, 43, 69,
+  21, 36, 59, 16, 3, 0, 30, 7, 16, 33,
+  0, 0, 32, 69, 0, 5, 0, 0, 0, 0,
+  0, 0, 0, 55, 0, 45, 0, 4, 0, 0,
+  0, 8, 12, 0, 0, 16, 23, 16, 0, 8,
+  0, 0, 24, 20, 0, 0, 0, 0, 0, 0,
+  0, 0, 70, 10, 16, 0, 0, 0, 0, 27,
+  24, 0, 0, 57, 0, 13, 0, 13, 15, 76,
+  12, 31, 0, 45, 9, 26, 24, 0, 0, 11,
+  0, 0, 0, 0, 52, 56, 16, 0, 0, 0,
+  1, 0, 7, 24, 39, 91, 4, 0, 0, 0,
+  0, 0, 11, 0, 10, 0, 0, 35, 51, 0,
+  0, 0, 24, 66, 70, 0, 17, 0, 20, 30,
+  0, 0, 12, 0, 0, 0, 2, 79, 18, 0,
+  26, 23, 6, 5, 29, 52, 17, 15, 0, 0,
+  8, 29, 0, 0, 0, 9, 0, 47, 0, 0,
+  7, 43, 0, 12, 0, 10, 0, 0, 5, 0,
+  16, 5, 10, 0, 24, 4, 0, 0, 15, 0,
+  23, 37, 5, 0, 30, 16, 31, 0, 0, 12,
+  69, 32, 32, 66, 0, 18, 10, 0, 25, 0,
+  0, 55, 11, 6, 0, 12, 0, 37, 48, 12,
+  31, 65, 0, 0, 0, 0, 0, 0, 29, 0,
+  0, 17, 57, 30, 0, 27, 0, 0, 0, 60,
+  0, 14, 29, 64, 0, 0, 0, 1, 7, 52,
+  58, 0, 0, 0, 0, 32, 0, 0, 0, 19,
+  23, 49, 0, 44, 27, 0, 33, 0, 0, 0,
+  76, 0, 0, 1, 67, 69, 11, 51, 63, 32,
+  6, 0, 66, 0, 0, 38, 0, 0, 28, 40,
+  0, 0, 0, 0, 7, 0, 0, 0, 0, 27,
+  0, 47, 0, 0, 0, 20, 0, 38, 0, 0,
+  0, 16, 0, 34, 21, 7, 0, 0, 0, 8,
+  0, 0, 0, 0, 0, 0, 0, 0, 98, 0,
+  25, 5, 0, 0, 0, 78, 9, 0, 0, 35,
+  0, 0, 12, 5, 38, 41, 20, 53, 0, 44,
+  32, 14, 27, 37, 0, 13, 0, 0, 0, 0,
+  28, 63, 38, 0, 0, 0, 0, 0, 3, 36,
+  0, 61, 0, 0, 0, 5, 3, 0, 4, 0,
+  0, 0, 0, 0, 77, 0, 26, 0, 18, 21,
+  29, 0, 57, 0, 12, 30, 0, 0, 52, 0,
+  0, 2, 43, 101, 14, 0, 40, 0, 0, 0,
+  32, 66, 0, 35, 0, 0, 0, 29, 0, 8,
+  0, 0, 0, 11, 0, 0, 0, 50, 0, 48,
+  0, 31, 0, 0, 0, 0, 0, 0, 6, 9,
+  0, 67, 0, 0, 11, 0, 13, 40, 0, 0,
+  5, 7, 0, 44, 0, 15, 58, 0, 30, 45,
+  0, 14, 0, 32, 0, 0, 0, 10, 0, 27,
+  0, 3, 29, 32, 45, 49, 0, 64, 21, 0,
+  0, 14, 0, 0, 0, 0, 0, 0, 30, 78,
+  0, 0, 0, 0, 0, 18, 0, 23, 14, 57,
+  17, 0, 0, 0, 29, 0, 59, 1, 9, 2,
+  0, 17, 0, 0, 0, 0, 0, 41, 0, 0,
+  0, 0, 31, 51, 0, 0, 37, 2, 0, 0,
+  4, 70, 43, 0, 24, 35, 0, 14, 56, 0,
+  0, 39, 0, 0, 9, 13, 0, 36, 0, 0,
+  0, 14, 0, 0, 0, 19, 0, 41, 0, 0,
+  0, 5, 3, 0, 4, 0, 0, 0, 23, 13,
+  20, 0, 0, 0, 18, 34, 0, 0, 4, 17,
+  0, 0, 0, 0, 21, 0, 0, 0, 0, 23,
+  10, 1, 39, 9, 0, 0, 1, 25, 3, 20,
+  0, 8, 17, 5, 38, 41, 32, 19, 10, 0,
+  6, 0, 0, 0, 0, 5, 45, 39, 4, 0,
+  0, 0, 0, 31, 0, 9, 12, 73, 0, 0,
+  0, 0, 2, 0, 65, 11, 0, 5, 37, 0,
+  20, 0, 0, 11, 0, 8, 52, 0, 43, 0,
+  22, 0, 0, 0, 29, 0, 0, 0, 38, 88,
+  0, 0, 38, 0, 13, 0, 33, 104, 68, 26,
+  0, 0, 8, 50, 0, 0, 0, 10, 0, 4,
+  0, 0, 0, 20, 0, 11, 1, 0, 0, 0,
+  0, 16, 0, 0, 0, 7, 0, 77, 0, 0,
+  52, 0, 26, 23, 6, 0, 25, 0, 0, 6,
+  24, 0, 92, 16, 18, 73, 0, 0, 0, 73,
+  0, 0, 0, 50, 0, 0, 0, 0, 11, 59,
+  10, 49, 0, 55, 10, 0, 0, 37, 0, 0,
+  5, 0, 13, 0, 23, 61, 29, 7, 1, 0,
+  19, 2, 0, 26, 0, 53, 0, 7, 0, 0,
+  0, 23, 69, 0, 1, 0, 0, 31, 0, 0,
+  4, 0, 0, 61, 44, 0, 0, 0, 25, 73,
+  0, 0, 7, 0, 0, 0, 26, 81, 0, 0,
+  48, 0, 0, 0, 40, 70, 0, 48, 0, 0,
+  0, 16, 0, 0, 0, 0, 0, 39, 0, 0,
+  0, 36, 0, 27, 0, 6, 0, 0, 20, 1,
+  0, 24, 22, 0, 0, 39, 0, 0, 0, 0,
+  10, 25, 0, 0, 31, 12, 0, 4, 0, 0,
+  87, 23, 22, 30, 0, 6, 0, 43, 7, 0,
+  0, 5, 0, 16, 0, 0, 0, 7, 9, 33,
+  0, 49, 1, 0, 0, 56, 0, 0, 0, 0,
+  0, 0, 17, 64, 6, 22, 16, 0, 10, 13,
+  0, 13, 8, 65, 0, 0, 0, 0, 0, 16,
+  82, 0, 8, 0, 12, 7, 0, 0, 0, 7,
+  4, 20, 0, 17, 0, 0, 21, 28, 30, 14,
+  58, 16, 0, 5, 32, 30, 51, 35, 42, 53,
+  0, 21, 81, 0, 0, 49, 7, 50, 21, 0,
+  0, 19, 0, 0, 2, 16, 18, 0, 0, 7,
+  0, 43, 0, 40, 0, 33, 27, 19, 0, 12,
+  0, 0, 23, 0, 84, 2, 0, 0, 0, 0,
+  0, 29, 0, 0, 0, 0, 0, 0, 33, 0,
+  0, 0, 0, 25, 18, 30, 44, 27, 0, 0,
+  0, 44, 47, 23, 14, 0, 26, 7, 56, 14,
+  51, 35, 8, 27, 0, 39, 0, 19, 0, 4,
+  43, 43, 0, 0, 0, 0, 0, 0, 8, 13,
+  9, 61, 0, 0, 0, 0, 12, 0, 28, 21,
+  21, 0, 50, 0, 111, 0, 14, 14, 3, 0,
+  0, 26, 42, 0, 40, 0, 0, 0, 68, 7,
+  0, 5, 43, 69, 21, 36, 59, 16, 3, 0,
+  30, 7, 16, 33, 0, 0, 32, 69, 0, 5,
+  0, 0, 0, 0, 0, 0, 0, 55, 0, 45,
+  0, 4, 0, 0, 0, 8, 12, 0, 0, 16,
+  23, 16, 0, 8, 0, 0, 24, 20, 0, 0,
+  0, 0, 0, 0, 0, 0, 70, 10, 16, 0,
+  0, 0, 0, 27, 24, 0, 0, 57, 0, 13,
+  0, 13, 15, 76, 12, 31, 0, 45, 9, 26,
+  24, 0, 0, 11, 0, 0, 0, 0, 52, 56,
+  16, 0, 0, 0, 1, 0, 7, 24, 39, 91,
+  4, 0, 0, 0, 0, 0, 11, 0, 10, 0,
+  0, 35, 51, 0, 0, 0, 24, 66, 70, 0,
+  17, 0, 20, 30, 0, 0, 12, 0, 0, 0,
+  2, 79, 18, 0, 26, 23, 6, 5, 29, 52,
+  17, 15, 0, 0, 8, 29, 0, 0, 0, 9,
+  0, 47, 0, 0, 7, 43, 0, 12, 0, 10,
+  0, 0, 5, 0, 16, 5, 10, 0, 24, 4,
+  0, 0, 15, 0, 23, 37, 5, 0, 30, 16,
+  31, 0, 0, 12, 69, 32, 32, 66, 0, 18,
+  10, 0, 25, 0, 0, 55, 11, 6, 0, 12,
+  0, 37, 48, 12, 31, 65, 0, 0, 0, 0,
+  0, 0, 29, 0, 0, 17, 57, 30, 0, 27,
+  0, 0, 0, 60, 0, 14, 29, 64, 0, 0,
+  0, 1, 7, 52, 58, 0, 0, 0, 0, 32,
+  0, 0, 0, 19, 23, 49, 22, 3, 0, 0,
+  24, 14, 0, 0, 31, 13, 0, 23, 0, 61,
+  30, 0, 16, 46, 7, 38, 53, 0, 0, 0,
+  7, 20, 37, 0, 0, 0, 0, 0, 0, 35,
+  0, 0, 9, 0, 0, 0, 0, 3, 0, 3,
+  12, 0, 13, 5, 0, 0, 57, 0, 3, 0,
+  0, 0, 27, 17, 0, 0, 5, 8, 37, 0,
+  0, 0, 19, 60, 0, 39, 0, 33, 30, 0,
+  37, 12, 0, 30, 0, 10, 5, 30, 0, 0,
+  41, 0, 71, 36, 0, 13, 0, 0, 4, 0,
+  18, 0, 0, 16, 44, 2, 0, 26, 0, 0,
+  0, 38, 5, 6, 19, 51, 0, 0, 0, 14,
+  43, 20, 37, 0, 0, 0, 39, 13, 0, 0,
+  0, 39, 17, 0, 29, 0, 57, 0, 12, 30,
+  0, 0, 52, 0, 0, 2, 43, 101, 14, 0,
+  40, 0, 0, 0, 32, 66, 0, 35, 0, 0,
+  0, 29, 0, 8, 0, 0, 0, 11, 0, 0,
+  0, 50, 0, 48, 0, 31, 0, 0, 0, 0,
+  0, 0, 6, 9, 0, 67, 0, 0, 11, 0,
+  13, 40, 0, 0, 5, 7, 0, 44, 0, 15,
+  58, 0, 30, 45, 0, 14, 0, 32, 0, 0,
+  0, 10, 0, 27, 0, 3, 29, 32, 45, 49,
+  0, 64, 21, 0, 0, 14, 0, 0, 0, 0,
+  0, 0, 30, 78, 0, 0, 0, 0, 0, 18,
+  0, 23, 14, 57, 17, 0, 0, 0, 29, 0,
+  59, 1, 9, 2, 0, 17, 0, 0, 0, 0,
+  0, 41, 0, 0, 0, 0, 31, 51, 0, 0,
+  37, 2, 0, 0, 4, 70, 43, 0, 24, 35,
+  0, 14, 56, 0, 0, 39, 0, 0, 9, 13,
+  0, 36, 0, 0, 0, 14, 0, 0, 0, 19,
+  0, 41, 0, 0, 0, 5, 3, 0, 4, 0,
+  0, 0, 23, 13, 20, 0, 0, 0, 18, 34,
+  0, 0, 4, 17, 0, 0, 0, 0, 21, 0,
+  0, 0, 0, 23, 10, 1, 39, 9, 0, 0,
+  1, 25, 3, 20, 0, 8, 17, 5, 38, 41,
+  32, 19, 10, 0, 6, 0, 0, 0, 0, 5,
+  45, 39, 4, 0, 0, 0, 0, 31, 0, 9,
+  12, 73, 0, 0, 0, 0, 2, 0, 65, 11,
+  0, 5, 37, 0, 20, 0, 0, 11, 0, 8,
+  0, 32, 0, 0, 31, 0, 19, 0, 50, 0,
+  0, 16, 7, 64, 58, 24, 16, 46, 0, 28,
+  76, 0, 0, 47, 16, 40, 25, 0, 0, 27,
+  0, 0, 0, 37, 5, 0, 0, 0, 0, 29,
+  0, 1, 0, 41, 21, 3, 4, 6, 0, 0,
+  60, 0, 56, 11, 0, 0, 8, 6, 0, 26,
+  13, 0, 0, 0, 0, 0, 17, 6, 0, 0,
+  0, 25, 0, 0, 41, 13, 0, 0, 0, 30,
+  48, 39, 12, 0, 31, 0, 58, 23, 37, 56,
+  3, 0, 8, 19, 0, 16, 0, 10, 57, 33,
+  0, 0, 0, 0, 0, 0, 23, 0, 31, 59,
+  0, 0, 0, 1, 24, 0, 21, 0, 8, 0,
+  47, 0, 77, 0, 1, 23, 9, 0, 44, 0,
+  0, 0, 25, 73, 0, 0, 7, 0, 0, 0,
+  26, 81, 0, 0, 48, 0, 0, 0, 40, 70,
+  0, 48, 0, 0, 0, 16, 0, 0, 0, 0,
+  0, 39, 0, 0, 0, 36, 0, 27, 0, 6,
+  0, 0, 20, 1, 0, 24, 22, 0, 0, 39,
+  0, 0, 0, 0, 10, 25, 0, 0, 31, 12,
+  0, 4, 0, 0, 87, 23, 22, 30, 0, 6,
+  0, 43, 7, 0, 0, 5, 0, 16, 0, 0,
+  0, 7, 9, 33, 0, 49, 1, 0, 0, 56,
+  0, 0, 0, 0, 0, 0, 17, 64, 6, 22,
+  16, 0, 10, 13, 0, 13, 8, 65, 0, 0,
+  0, 0, 0, 16, 82, 0, 8, 0, 12, 7,
+  0, 0, 0, 7, 4, 20, 0, 17, 0, 0,
+  21, 28, 30, 14, 58, 16, 0, 5, 32, 30,
+  51, 35, 42, 53, 0, 21, 81, 0, 0, 49,
+  7, 50, 21, 0, 0, 19, 0, 0, 2, 16,
+  18, 0, 0, 7, 0, 43, 0, 40, 0, 33,
+  27, 19, 0, 12, 0, 0, 23, 0, 84, 2,
+  0, 0, 0, 0, 0, 29, 0, 0, 0, 0,
+  0, 0, 33, 0, 0, 0, 0, 25, 18, 30,
+  44, 27, 0, 0, 0, 44, 47, 23, 14, 0,
+  26, 7, 56, 14, 51, 35, 8, 27, 0, 39,
+  0, 19, 0, 4, 43, 43, 0, 0, 0, 0,
+  0, 0, 8, 13, 9, 61, 0, 0, 0, 0,
+  12, 0, 28, 21, 21, 0, 50, 0, 111, 0,
+  14, 14, 3, 0, 0, 47, 23, 0, 8, 0,
+  33, 0, 55, 0, 0, 17, 28, 56, 45, 66,
+  49, 49, 0, 15, 78, 0, 0, 46, 13, 29,
+  27, 0, 0, 0, 14, 0, 11, 19, 4, 0,
+  0, 0, 0, 33, 12, 13, 0, 55, 6, 0,
+  0, 0, 0, 0, 63, 12, 64, 29, 0, 0,
+  0, 0, 0, 23, 0, 0, 0, 0, 0, 0,
+  42, 0, 0, 0, 0, 0, 0, 41, 36, 0,
+  0, 29, 0, 27, 65, 51, 36, 6, 50, 11,
+  55, 0, 58, 33, 0, 14, 0, 30, 0, 20,
+  0, 12, 43, 51, 0, 0, 0, 0, 0, 0,
+  5, 6, 14, 33, 30, 0, 0, 0, 41, 0,
+  0, 0, 5, 0, 0, 0, 81, 0, 6, 22,
+  17, 0, 70, 0, 17, 0, 20, 30, 0, 0,
+  12, 0, 0, 0, 2, 79, 18, 0, 26, 23,
+  6, 5, 29, 52, 17, 15, 0, 0, 8, 29,
+  0, 0, 0, 9, 0, 47, 0, 0, 7, 43,
+  0, 12, 0, 10, 0, 0, 5, 0, 16, 5,
+  10, 0, 24, 4, 0, 0, 15, 0, 23, 37,
+  5, 0, 30, 16, 31, 0, 0, 12, 69, 32,
+  32, 66, 0, 18, 10, 0, 25, 0, 0, 55,
+  11, 6, 0, 12, 0, 37, 48, 12, 31, 65,
+  0, 0, 0, 0, 0, 0, 29, 0, 0, 17,
+  57, 30, 0, 27, 0, 0, 0, 60, 0, 14,
+  29, 64, 0, 0, 0, 1, 7, 52, 58, 0,
+  0, 0, 0, 32, 0, 0, 0, 19, 23, 49,
+  22, 3, 0, 0, 24, 14, 0, 0, 31, 13,
+  0, 23, 0, 61, 30, 0, 16, 46, 7, 38,
+  53, 0, 0, 0, 7, 20, 37, 0, 0, 0,
+  0, 0, 0, 35, 0, 0, 9, 0, 0, 0,
+  0, 3, 0, 3, 12, 0, 13, 5, 0, 0,
+  57, 0, 3, 0, 0, 0, 27, 17, 0, 0,
+  5, 8, 37, 0, 0, 0, 19, 60, 0, 39,
+  0, 33, 30, 0, 37, 12, 0, 30, 0, 10,
+  5, 30, 0, 0, 41, 0, 71, 36, 0, 13,
+  0, 0, 4, 0, 18, 0, 0, 16, 44, 2,
+  0, 26, 0, 0, 0, 38, 5, 6, 19, 51,
+  0, 0, 0, 14, 43, 20, 37, 0, 0, 0,
+  39, 13, 0, 0, 0, 39, 17, 0, 19, 51,
+  0, 11, 63, 0, 36, 0, 33, 2, 0, 24,
+  2, 46, 28, 0, 6, 25, 11, 52, 60, 0,
+  0, 15, 21, 37, 39, 0, 0, 21, 42, 0,
+  0, 33, 0, 0, 0, 0, 0, 0, 0, 29,
+  0, 51, 23, 0, 7, 28, 0, 0, 51, 0,
+  37, 15, 0, 12, 5, 0, 0, 22, 16, 2,
+  15, 0, 0, 0, 4, 57, 0, 0, 0, 41,
+  5, 0, 60, 0, 19, 1, 4, 1, 52, 31,
+  4, 0, 58, 0, 51, 26, 21, 39, 0, 0,
+  0, 32, 0, 23, 0, 0, 55, 8, 0, 36,
+  1, 0, 0, 0, 14, 29, 63, 36, 0, 0,
+  0, 0, 46, 0, 12, 0, 4, 0, 35, 1,
+  40, 0, 0, 33, 0, 0, 0, 0, 0, 0,
+  31, 51, 0, 0, 37, 2, 0, 0, 4, 70,
+  43, 0, 24, 35, 0, 14, 56, 0, 0, 39,
+  0, 0, 9, 13, 0, 36, 0, 0, 0, 14,
+  0, 0, 0, 19, 0, 41, 0, 0, 0, 5,
+  3, 0, 4, 0, 0, 0, 23, 13, 20, 0,
+  0, 0, 18, 34, 0, 0, 4, 17, 0, 0,
+  0, 0, 21, 0, 0, 0, 0, 23, 10, 1,
+  39, 9, 0, 0, 1, 25, 3, 20, 0, 8,
+  17, 5, 38, 41, 32, 19, 10, 0, 6, 0,
+  0, 0, 0, 5, 45, 39, 4, 0, 0, 0,
+  0, 31, 0, 9, 12, 73, 0, 0, 0, 0,
+  2, 0, 65, 11, 0, 5, 37, 0, 20, 0,
+  0, 11, 0, 8, 0, 32, 0, 0, 31, 0,
+  19, 0, 50, 0, 0, 16, 7, 64, 58, 24,
+  16, 46, 0, 28, 76, 0, 0, 47, 16, 40,
+  25, 0, 0, 27, 0, 0, 0, 37, 5, 0,
+  0, 0, 0, 29, 0, 1, 0, 41, 21, 3,
+  4, 6, 0, 0, 60, 0, 56, 11, 0, 0,
+  8, 6, 0, 26, 13, 0, 0, 0, 0, 0,
+  17, 6, 0, 0, 0, 25, 0, 0, 41, 13,
+  0, 0, 0, 30, 48, 39, 12, 0, 31, 0,
+  58, 23, 37, 56, 3, 0, 8, 19, 0, 16,
+  0, 10, 57, 33, 0, 0, 0, 0, 0, 0,
+  23, 0, 31, 59, 0, 0, 0, 1, 24, 0,
+  21, 0, 8, 0, 47, 0, 77, 0, 1, 23,
+  9, 0, 0, 86, 6, 8, 42, 0, 32, 0,
+  64, 4, 0, 0, 6, 42, 74, 53, 38, 43,
+  0, 27, 68, 0, 0, 42, 0, 47, 25, 9,
+  0, 24, 6, 0, 0, 29, 9, 0, 0, 0,
+  0, 25, 0, 26, 0, 59, 9, 0, 0, 24,
+  0, 0, 45, 0, 88, 34, 0, 0, 0, 0,
+  0, 9, 6, 0, 0, 0, 0, 0, 36, 0,
+  0, 0, 0, 0, 0, 17, 64, 0, 2, 0,
+  1, 0, 91, 28, 8, 0, 51, 13, 35, 13,
+  47, 25, 0, 0, 0, 32, 0, 22, 0, 0,
+  48, 22, 0, 7, 0, 0, 23, 0, 25, 21,
+  43, 64, 10, 0, 0, 0, 29, 0, 0, 0,
+  18, 0, 4, 0, 74, 0, 0, 37, 25, 0,
+  0, 17, 0, 0, 21, 28, 30, 14, 58, 16,
+  0, 5, 32, 30, 51, 35, 42, 53, 0, 21,
+  81, 0, 0, 49, 7, 50, 21, 0, 0, 19,
+  0, 0, 2, 16, 18, 0, 0, 7, 0, 43,
+  0, 40, 0, 33, 27, 19, 0, 12, 0, 0,
+  23, 0, 84, 2, 0, 0, 0, 0, 0, 29,
+  0, 0, 0, 0, 0, 0, 33, 0, 0, 0,
+  0, 25, 18, 30, 44, 27, 0, 0, 0, 44,
+  47, 23, 14, 0, 26, 7, 56, 14, 51, 35,
+  8, 27, 0, 39, 0, 19, 0, 4, 43, 43,
+  0, 0, 0, 0, 0, 0, 8, 13, 9, 61,
+  0, 0, 0, 0, 12, 0, 28, 21, 21, 0,
+  50, 0, 111, 0, 14, 14, 3, 0, 0, 47,
+  23, 0, 8, 0, 33, 0, 55, 0, 0, 17,
+  28, 56, 45, 66, 49, 49, 0, 15, 78, 0,
+  0, 46, 13, 29, 27, 0, 0, 0, 14, 0,
+  11, 19, 4, 0, 0, 0, 0, 33, 12, 13,
+  0, 55, 6, 0, 0, 0, 0, 0, 63, 12,
+  64, 29, 0, 0, 0, 0, 0, 23, 0, 0,
+  0, 0, 0, 0, 42, 0, 0, 0, 0, 0,
+  0, 41, 36, 0, 0, 29, 0, 27, 65, 51,
+  36, 6, 50, 11, 55, 0, 58, 33, 0, 14,
+  0, 30, 0, 20, 0, 12, 43, 51, 0, 0,
+  0, 0, 0, 0, 5, 6, 14, 33, 30, 0,
+  0, 0, 41, 0, 0, 0, 5, 0, 0, 0,
+  81, 0, 6, 22, 17, 0, 0, 43, 70, 0,
+  11, 0, 9, 0, 57, 6, 0, 0, 0, 60,
+  23, 63, 30, 38, 0, 12, 39, 0, 33, 35,
+  0, 0, 9, 14, 0, 0, 27, 0, 0, 0,
+  0, 0, 0, 17, 0, 12, 27, 0, 0, 40,
+  0, 0, 0, 0, 0, 0, 48, 52, 41, 12,
+  0, 0, 19, 12, 0, 0, 0, 0, 0, 0,
+  24, 0, 45, 0, 11, 4, 0, 0, 0, 28,
+  32, 0, 0, 18, 0, 0, 58, 19, 0, 21,
+  59, 13, 23, 9, 64, 10, 0, 32, 0, 0,
+  0, 0, 0, 0, 40, 51, 0, 0, 0, 0,
+  36, 0, 0, 22, 4, 24, 40, 0, 0, 0,
+  86, 0, 2, 0, 26, 0, 0, 1, 21, 0,
+  0, 24, 22, 0, 22, 3, 0, 0, 24, 14,
+  0, 0, 31, 13, 0, 23, 0, 61, 30, 0,
+  16, 46, 7, 38, 53, 0, 0, 0, 7, 20,
+  37, 0, 0, 0, 0, 0, 0, 35, 0, 0,
+  9, 0, 0, 0, 0, 3, 0, 3, 12, 0,
+  13, 5, 0, 0, 57, 0, 3, 0, 0, 0,
+  27, 17, 0, 0, 5, 8, 37, 0, 0, 0,
+  19, 60, 0, 39, 0, 33, 30, 0, 37, 12,
+  0, 30, 0, 10, 5, 30, 0, 0, 41, 0,
+  71, 36, 0, 13, 0, 0, 4, 0, 18, 0,
+  0, 16, 44, 2, 0, 26, 0, 0, 0, 38,
+  5, 6, 19, 51, 0, 0, 0, 14, 43, 20,
+  37, 0, 0, 0, 39, 13, 0, 0, 0, 39,
+  17, 0, 19, 51, 0, 11, 63, 0, 36, 0,
+  33, 2, 0, 24, 2, 46, 28, 0, 6, 25,
+  11, 52, 60, 0, 0, 15, 21, 37, 39, 0,
+  0, 21, 42, 0, 0, 33, 0, 0, 0, 0,
+  0, 0, 0, 29, 0, 51, 23, 0, 7, 28,
+  0, 0, 51, 0, 37, 15, 0, 12, 5, 0,
+  0, 22, 16, 2, 15, 0, 0, 0, 4, 57,
+  0, 0, 0, 41, 5, 0, 60, 0, 19, 1,
+  4, 1, 52, 31, 4, 0, 58, 0, 51, 26,
+  21, 39, 0, 0, 0, 32, 0, 23, 0, 0,
+  55, 8, 0, 36, 1, 0, 0, 0, 14, 29,
+  63, 36, 0, 0, 0, 0, 46, 0, 12, 0,
+  4, 0, 35, 1, 40, 0, 0, 33, 0, 0,
+  0, 99, 0, 38, 55, 0, 74, 0, 47, 0,
+  0, 55, 43, 30, 27, 0, 3, 36, 0, 59,
+  80, 0, 0, 26, 36, 49, 32, 1, 0, 12,
+  51, 0, 22, 17, 3, 0, 0, 0, 0, 0,
+  0, 20, 0, 83, 20, 23, 0, 15, 0, 0,
+  26, 0, 67, 45, 0, 11, 23, 0, 0, 37,
+  22, 0, 0, 0, 0, 0, 14, 67, 0, 0,
+  0, 11, 0, 0, 67, 0, 16, 0, 7, 0,
+  80, 54, 0, 0, 42, 0, 37, 1, 24, 67,
+  6, 0, 0, 40, 0, 45, 0, 0, 77, 8,
+  0, 34, 3, 0, 0, 0, 25, 58, 103, 36,
+  0, 0, 0, 0, 32, 0, 0, 0, 0, 0,
+  21, 22, 80, 0, 38, 25, 8, 0, 0, 32,
+  0, 0, 31, 0, 19, 0, 50, 0, 0, 16,
+  7, 64, 58, 24, 16, 46, 0, 28, 76, 0,
+  0, 47, 16, 40, 25, 0, 0, 27, 0, 0,
+  0, 37, 5, 0, 0, 0, 0, 29, 0, 1,
+  0, 41, 21, 3, 4, 6, 0, 0, 60, 0,
+  56, 11, 0, 0, 8, 6, 0, 26, 13, 0,
+  0, 0, 0, 0, 17, 6, 0, 0, 0, 25,
+  0, 0, 41, 13, 0, 0, 0, 30, 48, 39,
+  12, 0, 31, 0, 58, 23, 37, 56, 3, 0,
+  8, 19, 0, 16, 0, 10, 57, 33, 0, 0,
+  0, 0, 0, 0, 23, 0, 31, 59, 0, 0,
+  0, 1, 24, 0, 21, 0, 8, 0, 47, 0,
+  77, 0, 1, 23, 9, 0, 0, 86, 6, 8,
+  42, 0, 32, 0, 64, 4, 0, 0, 6, 42,
+  74, 53, 38, 43, 0, 27, 68, 0, 0, 42,
+  0, 47, 25, 9, 0, 24, 6, 0, 0, 29,
+  9, 0, 0, 0, 0, 25, 0, 26, 0, 59,
+  9, 0, 0, 24, 0, 0, 45, 0, 88, 34,
+  0, 0, 0, 0, 0, 9, 6, 0, 0, 0,
+  0, 0, 36, 0, 0, 0, 0, 0, 0, 17,
+  64, 0, 2, 0, 1, 0, 91, 28, 8, 0,
+  51, 13, 35, 13, 47, 25, 0, 0, 0, 32,
+  0, 22, 0, 0, 48, 22, 0, 7, 0, 0,
+  23, 0, 25, 21, 43, 64, 10, 0, 0, 0,
+  29, 0, 0, 0, 18, 0, 4, 0, 74, 0,
+  0, 37, 25, 0, 0, 96, 8, 3, 33, 0,
+  35, 0, 85, 3, 0, 27, 4, 58, 40, 66,
+  33, 44, 0, 33, 67, 0, 11, 33, 0, 10,
+  35, 17, 0, 0, 0, 0, 16, 0, 0, 0,
+  0, 12, 0, 0, 0, 9, 0, 67, 0, 25,
+  0, 38, 0, 0, 28, 0, 77, 30, 0, 0,
+  25, 0, 0, 0, 0, 0, 0, 0, 2, 0,
+  21, 0, 17, 0, 0, 0, 18, 29, 78, 0,
+  11, 0, 0, 0, 78, 36, 3, 0, 35, 3,
+  44, 7, 36, 20, 0, 27, 0, 26, 0, 8,
+  0, 0, 61, 33, 8, 16, 0, 0, 58, 0,
+  22, 29, 12, 37, 7, 0, 0, 0, 41, 0,
+  0, 0, 20, 0, 0, 0, 52, 0, 0, 31,
+  46, 0, 0, 47, 23, 0, 8, 0, 33, 0,
+  55, 0, 0, 17, 28, 56, 45, 66, 49, 49,
+  0, 15, 78, 0, 0, 46, 13, 29, 27, 0,
+  0, 0, 14, 0, 11, 19, 4, 0, 0, 0,
+  0, 33, 12, 13, 0, 55, 6, 0, 0, 0,
+  0, 0, 63, 12, 64, 29, 0, 0, 0, 0,
+  0, 23, 0, 0, 0, 0, 0, 0, 42, 0,
+  0, 0, 0, 0, 0, 41, 36, 0, 0, 29,
+  0, 27, 65, 51, 36, 6, 50, 11, 55, 0,
+  58, 33, 0, 14, 0, 30, 0, 20, 0, 12,
+  43, 51, 0, 0, 0, 0, 0, 0, 5, 6,
+  14, 33, 30, 0, 0, 0, 41, 0, 0, 0,
+  5, 0, 0, 0, 81, 0, 6, 22, 17, 0,
+  0, 43, 70, 0, 11, 0, 9, 0, 57, 6,
+  0, 0, 0, 60, 23, 63, 30, 38, 0, 12,
+  39, 0, 33, 35, 0, 0, 9, 14, 0, 0,
+  27, 0, 0, 0, 0, 0, 0, 17, 0, 12,
+  27, 0, 0, 40, 0, 0, 0, 0, 0, 0,
+  48, 52, 41, 12, 0, 0, 19, 12, 0, 0,
+  0, 0, 0, 0, 24, 0, 45, 0, 11, 4,
+  0, 0, 0, 28, 32, 0, 0, 18, 0, 0,
+  58, 19, 0, 21, 59, 13, 23, 9, 64, 10,
+  0, 32, 0, 0, 0, 0, 0, 0, 40, 51,
+  0, 0, 0, 0, 36, 0, 0, 22, 4, 24,
+  40, 0, 0, 0, 86, 0, 2, 0, 26, 0,
+  0, 1, 21, 0, 0, 24, 22, 0, 0, 1,
+  54, 0, 0, 0, 0, 0, 42, 0, 0, 7,
+  0, 86, 0, 0, 1, 43, 0, 15, 50, 15,
+  93, 16, 0, 0, 0, 18, 0, 0, 16, 0,
+  0, 0, 0, 0, 0, 25, 0, 0, 34, 33,
+  0, 35, 0, 0, 0, 17, 0, 0, 34, 96,
+  0, 0, 21, 0, 40, 0, 14, 0, 0, 2,
+  21, 0, 100, 23, 1, 3, 2, 71, 0, 0,
+  0, 0, 18, 0, 0, 0, 0, 0, 25, 5,
+  0, 25, 63, 0, 32, 16, 62, 0, 0, 28,
+  0, 0, 0, 0, 0, 0, 67, 44, 0, 0,
+  0, 0, 26, 0, 0, 29, 0, 5, 41, 0,
+  0, 0, 99, 0, 45, 0, 46, 0, 0, 13,
+  0, 0, 0, 6, 19, 0, 19, 51, 0, 11,
+  63, 0, 36, 0, 33, 2, 0, 24, 2, 46,
+  28, 0, 6, 25, 11, 52, 60, 0, 0, 15,
+  21, 37, 39, 0, 0, 21, 42, 0, 0, 33,
+  0, 0, 0, 0, 0, 0, 0, 29, 0, 51,
+  23, 0, 7, 28, 0, 0, 51, 0, 37, 15,
+  0, 12, 5, 0, 0, 22, 16, 2, 15, 0,
+  0, 0, 4, 57, 0, 0, 0, 41, 5, 0,
+  60, 0, 19, 1, 4, 1, 52, 31, 4, 0,
+  58, 0, 51, 26, 21, 39, 0, 0, 0, 32,
+  0, 23, 0, 0, 55, 8, 0, 36, 1, 0,
+  0, 0, 14, 29, 63, 36, 0, 0, 0, 0,
+  46, 0, 12, 0, 4, 0, 35, 1, 40, 0,
+  0, 33, 0, 0, 0, 99, 0, 38, 55, 0,
+  74, 0, 47, 0, 0, 55, 43, 30, 27, 0,
+  3, 36, 0, 59, 80, 0, 0, 26, 36, 49,
+  32, 1, 0, 12, 51, 0, 22, 17, 3, 0,
+  0, 0, 0, 0, 0, 20, 0, 83, 20, 23,
+  0, 15, 0, 0, 26, 0, 67, 45, 0, 11,
+  23, 0, 0, 37, 22, 0, 0, 0, 0, 0,
+  14, 67, 0, 0, 0, 11, 0, 0, 67, 0,
+  16, 0, 7, 0, 80, 54, 0, 0, 42, 0,
+  37, 1, 24, 67, 6, 0, 0, 40, 0, 45,
+  0, 0, 77, 8, 0, 34, 3, 0, 0, 0,
+  25, 58, 103, 36, 0, 0, 0, 0, 32, 0,
+  0, 0, 0, 0, 21, 22, 80, 0, 38, 25,
+  8, 0, 0, 129, 0, 59, 30, 0, 80, 0,
+  63, 0, 2, 62, 41, 13, 24, 8, 0, 36,
+  0, 50, 73, 0, 0, 34, 40, 69, 39, 5,
+  0, 13, 44, 0, 63, 0, 17, 0, 0, 0,
+  0, 0, 0, 30, 0, 55, 31, 26, 0, 15,
+  0, 0, 34, 0, 63, 66, 0, 6, 53, 0,
+  0, 76, 13, 0, 0, 0, 0, 0, 32, 81,
+  0, 0, 0, 20, 0, 0, 48, 49, 0, 0,
+  0, 0, 65, 72, 1, 0, 21, 0, 34, 0,
+  17, 106, 73, 0, 0, 66, 0, 33, 16, 0,
+  73, 22, 0, 27, 0, 0, 0, 0, 17, 70,
+  123, 31, 8, 0, 18, 0, 19, 0, 0, 0,
+  0, 0, 16, 21, 113, 10, 49, 16, 11, 0,
+  0, 86, 6, 8, 42, 0, 32, 0, 64, 4,
+  0, 0, 6, 42, 74, 53, 38, 43, 0, 27,
+  68, 0, 0, 42, 0, 47, 25, 9, 0, 24,
+  6, 0, 0, 29, 9, 0, 0, 0, 0, 25,
+  0, 26, 0, 59, 9, 0, 0, 24, 0, 0,
+  45, 0, 88, 34, 0, 0, 0, 0, 0, 9,
+  6, 0, 0, 0, 0, 0, 36, 0, 0, 0,
+  0, 0, 0, 17, 64, 0, 2, 0, 1, 0,
+  91, 28, 8, 0, 51, 13, 35, 13, 47, 25,
+  0, 0, 0, 32, 0, 22, 0, 0, 48, 22,
+  0, 7, 0, 0, 23, 0, 25, 21, 43, 64,
+  10, 0, 0, 0, 29, 0, 0, 0, 18, 0,
+  4, 0, 74, 0, 0, 37, 25, 0, 0, 96,
+  8, 3, 33, 0, 35, 0, 85, 3, 0, 27,
+  4, 58, 40, 66, 33, 44, 0, 33, 67, 0,
+  11, 33, 0, 10, 35, 17, 0, 0, 0, 0,
+  16, 0, 0, 0, 0, 12, 0, 0, 0, 9,
+  0, 67, 0, 25, 0, 38, 0, 0, 28, 0,
+  77, 30, 0, 0, 25, 0, 0, 0, 0, 0,
+  0, 0, 2, 0, 21, 0, 17, 0, 0, 0,
+  18, 29, 78, 0, 11, 0, 0, 0, 78, 36,
+  3, 0, 35, 3, 44, 7, 36, 20, 0, 27,
+  0, 26, 0, 8, 0, 0, 61, 33, 8, 16,
+  0, 0, 58, 0, 22, 29, 12, 37, 7, 0,
+  0, 0, 41, 0, 0, 0, 20, 0, 0, 0,
+  52, 0, 0, 31, 46, 0, 0, 50, 11, 21,
+  17, 0, 0, 0, 67, 0, 0, 42, 4, 106,
+  9, 17, 15, 45, 0, 24, 71, 0, 40, 19,
+  0, 0, 0, 3, 0, 0, 0, 0, 0, 10,
+  0, 0, 0, 0, 0, 0, 4, 19, 0, 50,
+  0, 0, 0, 45, 0, 0, 34, 65, 36, 45,
+  0, 0, 44, 0, 0, 0, 0, 0, 7, 0,
+  60, 7, 0, 7, 12, 15, 0, 0, 10, 2,
+  40, 0, 0, 0, 0, 1, 42, 35, 2, 0,
+  21, 0, 58, 15, 51, 12, 0, 30, 0, 0,
+  0, 9, 0, 0, 58, 45, 6, 2, 0, 0,
+  16, 0, 0, 13, 0, 3, 7, 0, 0, 0,
+  80, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 4, 12, 0, 0, 43, 70, 0, 11, 0,
+  9, 0, 57, 6, 0, 0, 0, 60, 23, 63,
+  30, 38, 0, 12, 39, 0, 33, 35, 0, 0,
+  9, 14, 0, 0, 27, 0, 0, 0, 0, 0,
+  0, 17, 0, 12, 27, 0, 0, 40, 0, 0,
+  0, 0, 0, 0, 48, 52, 41, 12, 0, 0,
+  19, 12, 0, 0, 0, 0, 0, 0, 24, 0,
+  45, 0, 11, 4, 0, 0, 0, 28, 32, 0,
+  0, 18, 0, 0, 58, 19, 0, 21, 59, 13,
+  23, 9, 64, 10, 0, 32, 0, 0, 0, 0,
+  0, 0, 40, 51, 0, 0, 0, 0, 36, 0,
+  0, 22, 4, 24, 40, 0, 0, 0, 86, 0,
+  2, 0, 26, 0, 0, 1, 21, 0, 0, 24,
+  22, 0, 0, 1, 54, 0, 0, 0, 0, 0,
+  42, 0, 0, 7, 0, 86, 0, 0, 1, 43,
+  0, 15, 50, 15, 93, 16, 0, 0, 0, 18,
+  0, 0, 16, 0, 0, 0, 0, 0, 0, 25,
+  0, 0, 34, 33, 0, 35, 0, 0, 0, 17,
+  0, 0, 34, 96, 0, 0, 21, 0, 40, 0,
+  14, 0, 0, 2, 21, 0, 100, 23, 1, 3,
+  2, 71, 0, 0, 0, 0, 18, 0, 0, 0,
+  0, 0, 25, 5, 0, 25, 63, 0, 32, 16,
+  62, 0, 0, 28, 0, 0, 0, 0, 0, 0,
+  67, 44, 0, 0, 0, 0, 26, 0, 0, 29,
+  0, 5, 41, 0, 0, 0, 99, 0, 45, 0,
+  46, 0, 0, 13, 0, 0, 0, 6, 19, 0,
+  16, 0, 16, 11, 0, 0, 0, 0, 35, 0,
+  0, 25, 4, 106, 0, 0, 0, 36, 2, 10,
+  68, 10, 49, 2, 0, 0, 0, 0, 0, 0,
+  0, 2, 0, 9, 0, 0, 0, 0, 0, 0,
+  5, 41, 0, 45, 0, 0, 0, 31, 0, 0,
+  66, 127, 0, 42, 14, 0, 16, 0, 2, 0,
+  0, 0, 48, 0, 110, 32, 0, 9, 0, 60,
+  0, 11, 0, 0, 22, 0, 0, 0, 0, 41,
+  18, 32, 0, 0, 51, 0, 58, 18, 81, 0,
+  0, 0, 0, 0, 0, 12, 11, 0, 73, 49,
+  0, 0, 0, 0, 6, 0, 0, 8, 11, 0,
+  36, 0, 0, 0, 95, 0, 70, 0, 20, 0,
+  1, 0, 0, 0, 8, 0, 11, 0, 0, 99,
+  0, 38, 55, 0, 74, 0, 47, 0, 0, 55,
+  43, 30, 27, 0, 3, 36, 0, 59, 80, 0,
+  0, 26, 36, 49, 32, 1, 0, 12, 51, 0,
+  22, 17, 3, 0, 0, 0, 0, 0, 0, 20,
+  0, 83, 20, 23, 0, 15, 0, 0, 26, 0,
+  67, 45, 0, 11, 23, 0, 0, 37, 22, 0,
+  0, 0, 0, 0, 14, 67, 0, 0, 0, 11,
+  0, 0, 67, 0, 16, 0, 7, 0, 80, 54,
+  0, 0, 42, 0, 37, 1, 24, 67, 6, 0,
+  0, 40, 0, 45, 0, 0, 77, 8, 0, 34,
+  3, 0, 0, 0, 25, 58, 103, 36, 0, 0,
+  0, 0, 32, 0, 0, 0, 0, 0, 21, 22,
+  80, 0, 38, 25, 8, 0, 0, 129, 0, 59,
+  30, 0, 80, 0, 63, 0, 2, 62, 41, 13,
+  24, 8, 0, 36, 0, 50, 73, 0, 0, 34,
+  40, 69, 39, 5, 0, 13, 44, 0, 63, 0,
+  17, 0, 0, 0, 0, 0, 0, 30, 0, 55,
+  31, 26, 0, 15, 0, 0, 34, 0, 63, 66,
+  0, 6, 53, 0, 0, 76, 13, 0, 0, 0,
+  0, 0, 32, 81, 0, 0, 0, 20, 0, 0,
+  48, 49, 0, 0, 0, 0, 65, 72, 1, 0,
+  21, 0, 34, 0, 17, 106, 73, 0, 0, 66,
+  0, 33, 16, 0, 73, 22, 0, 27, 0, 0,
+  0, 0, 17, 70, 123, 31, 8, 0, 18, 0,
+  19, 0, 0, 0, 0, 0, 16, 21, 113, 10,
+  49, 16, 11, 0, 4, 112, 0, 54, 23, 0,
+  15, 0, 85, 7, 0, 53, 5, 3, 0, 0,
+  0, 18, 0, 13, 49, 0, 0, 31, 10, 11,
+  45, 17, 0, 0, 0, 9, 32, 0, 23, 0,
+  0, 18, 0, 0, 0, 0, 0, 18, 25, 27,
+  0, 0, 0, 0, 33, 14, 7, 64, 44, 38,
+  45, 0, 0, 10, 0, 11, 7, 12, 0, 7,
+  17, 45, 0, 29, 0, 13, 26, 0, 1, 55,
+  0, 8, 5, 0, 20, 44, 16, 23, 0, 0,
+  15, 29, 38, 55, 93, 0, 0, 17, 0, 0,
+  52, 0, 35, 52, 0, 80, 0, 0, 0, 0,
+  0, 84, 112, 0, 31, 0, 15, 3, 1, 0,
+  0, 0, 0, 0, 3, 0, 28, 0, 45, 32,
+  0, 0, 0, 96, 8, 3, 33, 0, 35, 0,
+  85, 3, 0, 27, 4, 58, 40, 66, 33, 44,
+  0, 33, 67, 0, 11, 33, 0, 10, 35, 17,
+  0, 0, 0, 0, 16, 0, 0, 0, 0, 12,
+  0, 0, 0, 9, 0, 67, 0, 25, 0, 38,
+  0, 0, 28, 0, 77, 30, 0, 0, 25, 0,
+  0, 0, 0, 0, 0, 0, 2, 0, 21, 0,
+  17, 0, 0, 0, 18, 29, 78, 0, 11, 0,
+  0, 0, 78, 36, 3, 0, 35, 3, 44, 7,
+  36, 20, 0, 27, 0, 26, 0, 8, 0, 0,
+  61, 33, 8, 16, 0, 0, 58, 0, 22, 29,
+  12, 37, 7, 0, 0, 0, 41, 0, 0, 0,
+  20, 0, 0, 0, 52, 0, 0, 31, 46, 0,
+  0, 50, 11, 21, 17, 0, 0, 0, 67, 0,
+  0, 42, 4, 106, 9, 17, 15, 45, 0, 24,
+  71, 0, 40, 19, 0, 0, 0, 3, 0, 0,
+  0, 0, 0, 10, 0, 0, 0, 0, 0, 0,
+  4, 19, 0, 50, 0, 0, 0, 45, 0, 0,
+  34, 65, 36, 45, 0, 0, 44, 0, 0, 0,
+  0, 0, 7, 0, 60, 7, 0, 7, 12, 15,
+  0, 0, 10, 2, 40, 0, 0, 0, 0, 1,
+  42, 35, 2, 0, 21, 0, 58, 15, 51, 12,
+  0, 30, 0, 0, 0, 9, 0, 0, 58, 45,
+  6, 2, 0, 0, 16, 0, 0, 13, 0, 3,
+  7, 0, 0, 0, 80, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 4, 12, 0, 20, 58,
+  19, 29, 24, 0, 0, 0, 79, 0, 0, 44,
+  19, 100, 0, 0, 0, 11, 0, 4, 57, 0,
+  28, 24, 0, 0, 2, 0, 0, 3, 5, 0,
+  0, 6, 0, 0, 0, 0, 0, 0, 0, 34,
+  0, 24, 0, 0, 6, 41, 0, 0, 50, 104,
+  10, 72, 18, 0, 43, 0, 5, 0, 0, 0,
+  14, 0, 25, 49, 0, 0, 0, 41, 0, 14,
+  1, 0, 14, 2, 0, 0, 0, 33, 14, 52,
+  21, 0, 21, 0, 41, 46, 70, 27, 15, 0,
+  0, 0, 0, 6, 30, 0, 57, 63, 0, 18,
+  0, 0, 0, 0, 0, 23, 55, 0, 32, 0,
+  0, 0, 90, 0, 14, 0, 0, 0, 5, 1,
+  0, 0, 20, 7, 0, 0, 0, 1, 54, 0,
+  0, 0, 0, 0, 42, 0, 0, 7, 0, 86,
+  0, 0, 1, 43, 0, 15, 50, 15, 93, 16,
+  0, 0, 0, 18, 0, 0, 16, 0, 0, 0,
+  0, 0, 0, 25, 0, 0, 34, 33, 0, 35,
+  0, 0, 0, 17, 0, 0, 34, 96, 0, 0,
+  21, 0, 40, 0, 14, 0, 0, 2, 21, 0,
+  100, 23, 1, 3, 2, 71, 0, 0, 0, 0,
+  18, 0, 0, 0, 0, 0, 25, 5, 0, 25,
+  63, 0, 32, 16, 62, 0, 0, 28, 0, 0,
+  0, 0, 0, 0, 67, 44, 0, 0, 0, 0,
+  26, 0, 0, 29, 0, 5, 41, 0, 0, 0,
+  99, 0, 45, 0, 46, 0, 0, 13, 0, 0,
+  0, 6, 19, 0, 16, 0, 16, 11, 0, 0,
+  0, 0, 35, 0, 0, 25, 4, 106, 0, 0,
+  0, 36, 2, 10, 68, 10, 49, 2, 0, 0,
+  0, 0, 0, 0, 0, 2, 0, 9, 0, 0,
+  0, 0, 0, 0, 5, 41, 0, 45, 0, 0,
+  0, 31, 0, 0, 66, 127, 0, 42, 14, 0,
+  16, 0, 2, 0, 0, 0, 48, 0, 110, 32,
+  0, 9, 0, 60, 0, 11, 0, 0, 22, 0,
+  0, 0, 0, 41, 18, 32, 0, 0, 51, 0,
+  58, 18, 81, 0, 0, 0, 0, 0, 0, 12,
+  11, 0, 73, 49, 0, 0, 0, 0, 6, 0,
+  0, 8, 11, 0, 36, 0, 0, 0, 95, 0,
+  70, 0, 20, 0, 1, 0, 0, 0, 8, 0,
+  11, 0, 7, 17, 0, 25, 21, 11, 0, 0,
+  61, 0, 0, 19, 7, 87, 0, 0, 0, 20,
+  13, 16, 69, 0, 0, 19, 0, 0, 0, 0,
+  0, 18, 0, 0, 0, 6, 0, 0, 0, 0,
+  0, 0, 0, 18, 0, 55, 0, 0, 10, 38,
+  0, 0, 71, 103, 0, 69, 0, 0, 31, 9,
+  0, 0, 0, 0, 4, 0, 42, 20, 0, 14,
+  0, 7, 0, 2, 0, 0, 39, 0, 0, 0,
+  0, 43, 31, 45, 9, 0, 36, 0, 50, 45,
+  79, 24, 11, 1, 0, 0, 0, 13, 32, 0,
+  65, 65, 1, 23, 0, 0, 0, 0, 0, 13,
+  64, 0, 7, 0, 0, 0, 59, 0, 45, 0,
+  6, 0, 45, 0, 40, 0, 47, 0, 8, 0,
+  0, 129, 0, 59, 30, 0, 80, 0, 63, 0,
+  2, 62, 41, 13, 24, 8, 0, 36, 0, 50,
+  73, 0, 0, 34, 40, 69, 39, 5, 0, 13,
+  44, 0, 63, 0, 17, 0, 0, 0, 0, 0,
+  0, 30, 0, 55, 31, 26, 0, 15, 0, 0,
+  34, 0, 63, 66, 0, 6, 53, 0, 0, 76,
+  13, 0, 0, 0, 0, 0, 32, 81, 0, 0,
+  0, 20, 0, 0, 48, 49, 0, 0, 0, 0,
+  65, 72, 1, 0, 21, 0, 34, 0, 17, 106,
+  73, 0, 0, 66, 0, 33, 16, 0, 73, 22,
+  0, 27, 0, 0, 0, 0, 17, 70, 123, 31,
+  8, 0, 18, 0, 19, 0, 0, 0, 0, 0,
+  16, 21, 113, 10, 49, 16, 11, 0, 4, 112,
+  0, 54, 23, 0, 15, 0, 85, 7, 0, 53,
+  5, 3, 0, 0, 0, 18, 0, 13, 49, 0,
+  0, 31, 10, 11, 45, 17, 0, 0, 0, 9,
+  32, 0, 23, 0, 0, 18, 0, 0, 0, 0,
+  0, 18, 25, 27, 0, 0, 0, 0, 33, 14,
+  7, 64, 44, 38, 45, 0, 0, 10, 0, 11,
+  7, 12, 0, 7, 17, 45, 0, 29, 0, 13,
+  26, 0, 1, 55, 0, 8, 5, 0, 20, 44,
+  16, 23, 0, 0, 15, 29, 38, 55, 93, 0,
+  0, 17, 0, 0, 52, 0, 35, 52, 0, 80,
+  0, 0, 0, 0, 0, 84, 112, 0, 31, 0,
+  15, 3, 1, 0, 0, 0, 0, 0, 3, 0,
+  28, 0, 45, 32, 0, 0, 29, 57, 0, 24,
+  0, 27, 0, 0, 42, 0, 0, 31, 0, 13,
+  0, 0, 0, 38, 15, 0, 3, 20, 0, 0,
+  0, 0, 2, 0, 0, 0, 0, 33, 0, 0,
+  0, 22, 12, 36, 5, 0, 22, 0, 25, 16,
+  5, 0, 6, 0, 0, 0, 0, 74, 0, 26,
+  125, 100, 30, 22, 18, 0, 0, 43, 75, 37,
+  102, 36, 0, 20, 0, 109, 123, 3, 27, 0,
+  0, 17, 0, 0, 34, 0, 0, 1, 35, 33,
+  3, 0, 0, 8, 62, 0, 21, 30, 0, 0,
+  38, 0, 43, 0, 9, 59, 0, 117, 0, 0,
+  0, 0, 0, 80, 21, 0, 14, 0, 0, 24,
+  0, 0, 0, 0, 10, 0, 0, 0, 0, 0,
+  32, 35, 0, 0, 0, 50, 11, 21, 17, 0,
+  0, 0, 67, 0, 0, 42, 4, 106, 9, 17,
+  15, 45, 0, 24, 71, 0, 40, 19, 0, 0,
+  0, 3, 0, 0, 0, 0, 0, 10, 0, 0,
+  0, 0, 0, 0, 4, 19, 0, 50, 0, 0,
+  0, 45, 0, 0, 34, 65, 36, 45, 0, 0,
+  44, 0, 0, 0, 0, 0, 7, 0, 60, 7,
+  0, 7, 12, 15, 0, 0, 10, 2, 40, 0,
+  0, 0, 0, 1, 42, 35, 2, 0, 21, 0,
+  58, 15, 51, 12, 0, 30, 0, 0, 0, 9,
+  0, 0, 58, 45, 6, 2, 0, 0, 16, 0,
+  0, 13, 0, 3, 7, 0, 0, 0, 80, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
+  12, 0, 20, 58, 19, 29, 24, 0, 0, 0,
+  79, 0, 0, 44, 19, 100, 0, 0, 0, 11,
+  0, 4, 57, 0, 28, 24, 0, 0, 2, 0,
+  0, 3, 5, 0, 0, 6, 0, 0, 0, 0,
+  0, 0, 0, 34, 0, 24, 0, 0, 6, 41,
+  0, 0, 50, 104, 10, 72, 18, 0, 43, 0,
+  5, 0, 0, 0, 14, 0, 25, 49, 0, 0,
+  0, 41, 0, 14, 1, 0, 14, 2, 0, 0,
+  0, 33, 14, 52, 21, 0, 21, 0, 41, 46,
+  70, 27, 15, 0, 0, 0, 0, 6, 30, 0,
+  57, 63, 0, 18, 0, 0, 0, 0, 0, 23,
+  55, 0, 32, 0, 0, 0, 90, 0, 14, 0,
+  0, 0, 5, 1, 0, 0, 20, 7, 0, 0,
+  56, 103, 0, 45, 15, 0, 0, 0, 58, 0,
+  0, 52, 30, 60, 0, 0, 0, 11, 22, 8,
+  26, 0, 0, 48, 0, 0, 58, 0, 0, 0,
+  19, 13, 0, 0, 3, 0, 0, 0, 0, 0,
+  0, 0, 0, 14, 26, 11, 2, 0, 0, 0,
+  23, 83, 1, 41, 67, 0, 39, 3, 0, 0,
+  0, 31, 34, 12, 4, 15, 0, 13, 0, 63,
+  0, 12, 10, 0, 0, 36, 0, 0, 33, 0,
+  0, 39, 30, 13, 0, 0, 19, 60, 73, 69,
+  93, 0, 0, 0, 0, 0, 59, 0, 21, 68,
+  23, 82, 0, 0, 0, 0, 0, 52, 129, 3,
+  21, 0, 0, 7, 40, 0, 0, 0, 3, 0,
+  26, 0, 14, 0, 57, 39, 0, 0, 16, 0,
+  16, 11, 0, 0, 0, 0, 35, 0, 0, 25,
+  4, 106, 0, 0, 0, 36, 2, 10, 68, 10,
+  49, 2, 0, 0, 0, 0, 0, 0, 0, 2,
+  0, 9, 0, 0, 0, 0, 0, 0, 5, 41,
+  0, 45, 0, 0, 0, 31, 0, 0, 66, 127,
+  0, 42, 14, 0, 16, 0, 2, 0, 0, 0,
+  48, 0, 110, 32, 0, 9, 0, 60, 0, 11,
+  0, 0, 22, 0, 0, 0, 0, 41, 18, 32,
+  0, 0, 51, 0, 58, 18, 81, 0, 0, 0,
+  0, 0, 0, 12, 11, 0, 73, 49, 0, 0,
+  0, 0, 6, 0, 0, 8, 11, 0, 36, 0,
+  0, 0, 95, 0, 70, 0, 20, 0, 1, 0,
+  0, 0, 8, 0, 11, 0, 7, 17, 0, 25,
+  21, 11, 0, 0, 61, 0, 0, 19, 7, 87,
+  0, 0, 0, 20, 13, 16, 69, 0, 0, 19,
+  0, 0, 0, 0, 0, 18, 0, 0, 0, 6,
+  0, 0, 0, 0, 0, 0, 0, 18, 0, 55,
+  0, 0, 10, 38, 0, 0, 71, 103, 0, 69,
+  0, 0, 31, 9, 0, 0, 0, 0, 4, 0,
+  42, 20, 0, 14, 0, 7, 0, 2, 0, 0,
+  39, 0, 0, 0, 0, 43, 31, 45, 9, 0,
+  36, 0, 50, 45, 79, 24, 11, 1, 0, 0,
+  0, 13, 32, 0, 65, 65, 1, 23, 0, 0,
+  0, 0, 0, 13, 64, 0, 7, 0, 0, 0,
+  59, 0, 45, 0, 6, 0, 45, 0, 40, 0,
+  47, 0, 8, 0, 0, 108, 0, 50, 20, 0,
+  23, 0, 76, 0, 5, 27, 31, 30, 12, 0,
+  0, 17, 12, 30, 55, 0, 0, 56, 13, 61,
+  39, 0, 0, 26, 15, 0, 27, 4, 0, 0,
+  0, 0, 0, 5, 0, 21, 0, 47, 11, 0,
+  10, 19, 0, 0, 54, 49, 57, 86, 0, 0,
+  20, 0, 0, 49, 9, 0, 0, 0, 0, 0,
+  32, 13, 0, 0, 0, 12, 0, 0, 51, 32,
+  0, 0, 0, 19, 65, 67, 24, 0, 19, 0,
+  39, 50, 52, 88, 74, 0, 0, 18, 0, 13,
+  42, 0, 60, 63, 11, 32, 0, 0, 0, 0,
+  14, 25, 123, 40, 2, 0, 0, 0, 13, 0,
+  5, 0, 0, 0, 42, 3, 144, 0, 86, 0,
+  0, 0, 4, 112, 0, 54, 23, 0, 15, 0,
+  85, 7, 0, 53, 5, 3, 0, 0, 0, 18,
+  0, 13, 49, 0, 0, 31, 10, 11, 45, 17,
+  0, 0, 0, 9, 32, 0, 23, 0, 0, 18,
+  0, 0, 0, 0, 0, 18, 25, 27, 0, 0,
+  0, 0, 33, 14, 7, 64, 44, 38, 45, 0,
+  0, 10, 0, 11, 7, 12, 0, 7, 17, 45,
+  0, 29, 0, 13, 26, 0, 1, 55, 0, 8,
+  5, 0, 20, 44, 16, 23, 0, 0, 15, 29,
+  38, 55, 93, 0, 0, 17, 0, 0, 52, 0,
+  35, 52, 0, 80, 0, 0, 0, 0, 0, 84,
+  112, 0, 31, 0, 15, 3, 1, 0, 0, 0,
+  0, 0, 3, 0, 28, 0, 45, 32, 0, 0,
+  29, 57, 0, 24, 0, 27, 0, 0, 42, 0,
+  0, 31, 0, 13, 0, 0, 0, 38, 15, 0,
+  3, 20, 0, 0, 0, 0, 2, 0, 0, 0,
+  0, 33, 0, 0, 0, 22, 12, 36, 5, 0,
+  22, 0, 25, 16, 5, 0, 6, 0, 0, 0,
+  0, 74, 0, 26, 125, 100, 30, 22, 18, 0,
+  0, 43, 75, 37, 102, 36, 0, 20, 0, 109,
+  123, 3, 27, 0, 0, 17, 0, 0, 34, 0,
+  0, 1, 35, 33, 3, 0, 0, 8, 62, 0,
+  21, 30, 0, 0, 38, 0, 43, 0, 9, 59,
+  0, 117, 0, 0, 0, 0, 0, 80, 21, 0,
+  14, 0, 0, 24, 0, 0, 0, 0, 10, 0,
+  0, 0, 0, 0, 32, 35, 0, 0, 10, 25,
+  0, 0, 0, 85, 0, 0, 22, 0, 0, 0,
+  0, 0, 0, 0, 0, 39, 3, 8, 0, 40,
+  0, 0, 0, 0, 8, 3, 0, 0, 0, 38,
+  0, 0, 0, 43, 47, 68, 23, 0, 46, 0,
+  22, 15, 0, 13, 59, 13, 0, 0, 0, 55,
+  0, 0, 112, 118, 34, 26, 48, 0, 0, 57,
+  67, 0, 179, 5, 0, 32, 0, 139, 175, 0,
+  10, 15, 0, 0, 0, 0, 42, 0, 0, 0,
+  28, 19, 31, 0, 0, 11, 42, 0, 0, 116,
+  13, 0, 34, 0, 0, 0, 6, 54, 43, 142,
+  0, 0, 0, 0, 0, 58, 0, 0, 0, 29,
+  0, 30, 0, 10, 0, 0, 53, 0, 0, 0,
+  0, 0, 1, 29, 1, 6, 20, 58, 19, 29,
+  24, 0, 0, 0, 79, 0, 0, 44, 19, 100,
+  0, 0, 0, 11, 0, 4, 57, 0, 28, 24,
+  0, 0, 2, 0, 0, 3, 5, 0, 0, 6,
+  0, 0, 0, 0, 0, 0, 0, 34, 0, 24,
+  0, 0, 6, 41, 0, 0, 50, 104, 10, 72,
+  18, 0, 43, 0, 5, 0, 0, 0, 14, 0,
+  25, 49, 0, 0, 0, 41, 0, 14, 1, 0,
+  14, 2, 0, 0, 0, 33, 14, 52, 21, 0,
+  21, 0, 41, 46, 70, 27, 15, 0, 0, 0,
+  0, 6, 30, 0, 57, 63, 0, 18, 0, 0,
+  0, 0, 0, 23, 55, 0, 32, 0, 0, 0,
+  90, 0, 14, 0, 0, 0, 5, 1, 0, 0,
+  20, 7, 0, 0, 56, 103, 0, 45, 15, 0,
+  0, 0, 58, 0, 0, 52, 30, 60, 0, 0,
+  0, 11, 22, 8, 26, 0, 0, 48, 0, 0,
+  58, 0, 0, 0, 19, 13, 0, 0, 3, 0,
+  0, 0, 0, 0, 0, 0, 0, 14, 26, 11,
+  2, 0, 0, 0, 23, 83, 1, 41, 67, 0,
+  39, 3, 0, 0, 0, 31, 34, 12, 4, 15,
+  0, 13, 0, 63, 0, 12, 10, 0, 0, 36,
+  0, 0, 33, 0, 0, 39, 30, 13, 0, 0,
+  19, 60, 73, 69, 93, 0, 0, 0, 0, 0,
+  59, 0, 21, 68, 23, 82, 0, 0, 0, 0,
+  0, 52, 129, 3, 21, 0, 0, 7, 40, 0,
+  0, 0, 3, 0, 26, 0, 14, 0, 57, 39,
+  0, 0, 46, 82, 0, 50, 1, 35, 0, 0,
+  22, 0, 0, 15, 41, 6, 0, 0, 0, 19,
+  21, 11, 13, 31, 0, 0, 0, 0, 64, 0,
+  0, 0, 30, 54, 0, 0, 28, 29, 0, 17,
+  0, 0, 0, 0, 1, 18, 5, 11, 10, 0,
+  0, 0, 0, 57, 0, 22, 95, 48, 30, 4,
+  0, 0, 0, 73, 54, 11, 88, 0, 0, 66,
+  0, 94, 130, 13, 9, 0, 0, 4, 0, 2,
+  68, 0, 0, 0, 23, 16, 20, 0, 0, 28,
+  33, 13, 56, 0, 0, 0, 6, 0, 47, 0,
+  18, 68, 22, 150, 0, 0, 0, 0, 0, 82,
+  91, 0, 7, 26, 10, 31, 0, 0, 0, 0,
+  31, 0, 0, 0, 0, 0, 50, 35, 0, 2,
+  7, 17, 0, 25, 21, 11, 0, 0, 61, 0,
+  0, 19, 7, 87, 0, 0, 0, 20, 13, 16,
+  69, 0, 0, 19, 0, 0, 0, 0, 0, 18,
+  0, 0, 0, 6, 0, 0, 0, 0, 0, 0,
+  0, 18, 0, 55, 0, 0, 10, 38, 0, 0,
+  71, 103, 0, 69, 0, 0, 31, 9, 0, 0,
+  0, 0, 4, 0, 42, 20, 0, 14, 0, 7,
+  0, 2, 0, 0, 39, 0, 0, 0, 0, 43,
+  31, 45, 9, 0, 36, 0, 50, 45, 79, 24,
+  11, 1, 0, 0, 0, 13, 32, 0, 65, 65,
+  1, 23, 0, 0, 0, 0, 0, 13, 64, 0,
+  7, 0, 0, 0, 59, 0, 45, 0, 6, 0,
+  45, 0, 40, 0, 47, 0, 8, 0, 0, 108,
+  0, 50, 20, 0, 23, 0, 76, 0, 5, 27,
+  31, 30, 12, 0, 0, 17, 12, 30, 55, 0,
+  0, 56, 13, 61, 39, 0, 0, 26, 15, 0,
+  27, 4, 0, 0, 0, 0, 0, 5, 0, 21,
+  0, 47, 11, 0, 10, 19, 0, 0, 54, 49,
+  57, 86, 0, 0, 20, 0, 0, 49, 9, 0,
+  0, 0, 0, 0, 32, 13, 0, 0, 0, 12,
+  0, 0, 51, 32, 0, 0, 0, 19, 65, 67,
+  24, 0, 19, 0, 39, 50, 52, 88, 74, 0,
+  0, 18, 0, 13, 42, 0, 60, 63, 11, 32,
+  0, 0, 0, 0, 14, 25, 123, 40, 2, 0,
+  0, 0, 13, 0, 5, 0, 0, 0, 42, 3,
+  144, 0, 86, 0, 0, 0, 0, 155, 0, 57,
+  4, 0, 35, 0, 65, 0, 13, 22, 77, 0,
+  0, 0, 0, 12, 22, 43, 12, 0, 0, 61,
+  29, 33, 73, 13, 3, 0, 36, 0, 52, 0,
+  38, 0, 0, 0, 0, 0, 0, 22, 0, 53,
+  11, 0, 16, 0, 0, 0, 43, 52, 47, 51,
+  11, 17, 36, 0, 0, 49, 1, 0, 0, 0,
+  0, 0, 2, 16, 0, 0, 11, 34, 0, 0,
+  39, 55, 0, 69, 4, 0, 37, 56, 49, 10,
+  11, 0, 0, 58, 72, 93, 137, 0, 0, 11,
+  0, 0, 57, 0, 44, 81, 42, 39, 0, 0,
+  0, 0, 27, 70, 152, 18, 4, 0, 17, 10,
+  0, 0, 0, 0, 0, 0, 3, 0, 133, 2,
+  119, 5, 0, 0, 29, 57, 0, 24, 0, 27,
+  0, 0, 42, 0, 0, 31, 0, 13, 0, 0,
+  0, 38, 15, 0, 3, 20, 0, 0, 0, 0,
+  2, 0, 0, 0, 0, 33, 0, 0, 0, 22,
+  12, 36, 5, 0, 22, 0, 25, 16, 5, 0,
+  6, 0, 0, 0, 0, 74, 0, 26, 125, 100,
+  30, 22, 18, 0, 0, 43, 75, 37, 102, 36,
+  0, 20, 0, 109, 123, 3, 27, 0, 0, 17,
+  0, 0, 34, 0, 0, 1, 35, 33, 3, 0,
+  0, 8, 62, 0, 21, 30, 0, 0, 38, 0,
+  43, 0, 9, 59, 0, 117, 0, 0, 0, 0,
+  0, 80, 21, 0, 14, 0, 0, 24, 0, 0,
+  0, 0, 10, 0, 0, 0, 0, 0, 32, 35,
+  0, 0, 10, 25, 0, 0, 0, 85, 0, 0,
+  22, 0, 0, 0, 0, 0, 0, 0, 0, 39,
+  3, 8, 0, 40, 0, 0, 0, 0, 8, 3,
+  0, 0, 0, 38, 0, 0, 0, 43, 47, 68,
+  23, 0, 46, 0, 22, 15, 0, 13, 59, 13,
+  0, 0, 0, 55, 0, 0, 112, 118, 34, 26,
+  48, 0, 0, 57, 67, 0, 179, 5, 0, 32,
+  0, 139, 175, 0, 10, 15, 0, 0, 0, 0,
+  42, 0, 0, 0, 28, 19, 31, 0, 0, 11,
+  42, 0, 0, 116, 13, 0, 34, 0, 0, 0,
+  6, 54, 43, 142, 0, 0, 0, 0, 0, 58,
+  0, 0, 0, 29, 0, 30, 0, 10, 0, 0,
+  53, 0, 0, 0, 0, 0, 1, 29, 1, 6,
+  0, 37, 0, 0, 0, 81, 0, 0, 83, 32,
+  0, 0, 0, 9, 0, 42, 6, 26, 0, 10,
+  0, 0, 0, 25, 0, 0, 22, 40, 7, 0,
+  0, 0, 67, 0, 0, 20, 33, 86, 0, 0,
+  32, 0, 0, 10, 0, 67, 54, 81, 0, 26,
+  0, 6, 0, 0, 25, 36, 58, 0, 32, 0,
+  0, 65, 0, 0, 102, 0, 0, 34, 25, 57,
+  85, 0, 33, 59, 0, 79, 0, 0, 3, 0,
+  3, 0, 2, 0, 0, 0, 0, 49, 15, 0,
+  0, 173, 0, 0, 0, 0, 0, 0, 0, 64,
+  113, 110, 0, 0, 0, 0, 0, 29, 0, 22,
+  0, 30, 0, 19, 0, 0, 0, 29, 61, 0,
+  40, 0, 0, 0, 0, 15, 1, 35, 56, 103,
+  0, 45, 15, 0, 0, 0, 58, 0, 0, 52,
+  30, 60, 0, 0, 0, 11, 22, 8, 26, 0,
+  0, 48, 0, 0, 58, 0, 0, 0, 19, 13,
+  0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+  0, 14, 26, 11, 2, 0, 0, 0, 23, 83,
+  1, 41, 67, 0, 39, 3, 0, 0, 0, 31,
+  34, 12, 4, 15, 0, 13, 0, 63, 0, 12,
+  10, 0, 0, 36, 0, 0, 33, 0, 0, 39,
+  30, 13, 0, 0, 19, 60, 73, 69, 93, 0,
+  0, 0, 0, 0, 59, 0, 21, 68, 23, 82,
+  0, 0, 0, 0, 0, 52, 129, 3, 21, 0,
+  0, 7, 40, 0, 0, 0, 3, 0, 26, 0,
+  14, 0, 57, 39, 0, 0, 46, 82, 0, 50,
+  1, 35, 0, 0, 22, 0, 0, 15, 41, 6,
+  0, 0, 0, 19, 21, 11, 13, 31, 0, 0,
+  0, 0, 64, 0, 0, 0, 30, 54, 0, 0,
+  28, 29, 0, 17, 0, 0, 0, 0, 1, 18,
+  5, 11, 10, 0, 0, 0, 0, 57, 0, 22,
+  95, 48, 30, 4, 0, 0, 0, 73, 54, 11,
+  88, 0, 0, 66, 0, 94, 130, 13, 9, 0,
+  0, 4, 0, 2, 68, 0, 0, 0, 23, 16,
+  20, 0, 0, 28, 33, 13, 56, 0, 0, 0,
+  6, 0, 47, 0, 18, 68, 22, 150, 0, 0,
+  0, 0, 0, 82, 91, 0, 7, 26, 10, 31,
+  0, 0, 0, 0, 31, 0, 0, 0, 0, 0,
+  50, 35, 0, 2, 1, 12, 0, 19, 0, 115,
+  0, 0, 17, 0, 0, 0, 0, 1, 0, 0,
+  0, 28, 11, 16, 0, 65, 2, 0, 0, 0,
+  23, 0, 0, 0, 0, 17, 8, 0, 9, 65,
+  12, 45, 5, 0, 48, 0, 0, 18, 0, 33,
+  46, 0, 0, 7, 0, 29, 0, 0, 131, 59,
+  54, 5, 43, 0, 0, 107, 51, 0, 166, 0,
+  0, 46, 0, 112, 193, 0, 44, 0, 0, 35,
+  0, 0, 29, 0, 0, 0, 32, 0, 28, 0,
+  0, 1, 14, 0, 0, 79, 16, 0, 38, 0,
+  0, 0, 3, 61, 47, 127, 0, 0, 0, 0,
+  0, 36, 0, 0, 0, 55, 0, 53, 0, 0,
+  0, 0, 47, 0, 0, 0, 0, 0, 13, 18,
+  0, 12, 0, 108, 0, 50, 20, 0, 23, 0,
+  76, 0, 5, 27, 31, 30, 12, 0, 0, 17,
+  12, 30, 55, 0, 0, 56, 13, 61, 39, 0,
+  0, 26, 15, 0, 27, 4, 0, 0, 0, 0,
+  0, 5, 0, 21, 0, 47, 11, 0, 10, 19,
+  0, 0, 54, 49, 57, 86, 0, 0, 20, 0,
+  0, 49, 9, 0, 0, 0, 0, 0, 32, 13,
+  0, 0, 0, 12, 0, 0, 51, 32, 0, 0,
+  0, 19, 65, 67, 24, 0, 19, 0, 39, 50,
+  52, 88, 74, 0, 0, 18, 0, 13, 42, 0,
+  60, 63, 11, 32, 0, 0, 0, 0, 14, 25,
+  123, 40, 2, 0, 0, 0, 13, 0, 5, 0,
+  0, 0, 42, 3, 144, 0, 86, 0, 0, 0,
+  0, 155, 0, 57, 4, 0, 35, 0, 65, 0,
+  13, 22, 77, 0, 0, 0, 0, 12, 22, 43,
+  12, 0, 0, 61, 29, 33, 73, 13, 3, 0,
+  36, 0, 52, 0, 38, 0, 0, 0, 0, 0,
+  0, 22, 0, 53, 11, 0, 16, 0, 0, 0,
+  43, 52, 47, 51, 11, 17, 36, 0, 0, 49,
+  1, 0, 0, 0, 0, 0, 2, 16, 0, 0,
+  11, 34, 0, 0, 39, 55, 0, 69, 4, 0,
+  37, 56, 49, 10, 11, 0, 0, 58, 72, 93,
+  137, 0, 0, 11, 0, 0, 57, 0, 44, 81,
+  42, 39, 0, 0, 0, 0, 27, 70, 152, 18,
+  4, 0, 17, 10, 0, 0, 0, 0, 0, 0,
+  3, 0, 133, 2, 119, 5, 0, 0, 21, 77,
+  0, 54, 0, 57, 1, 0, 24, 0, 0, 9,
+  43, 0, 0, 0, 0, 20, 47, 27, 0, 27,
+  1, 0, 0, 0, 69, 0, 0, 0, 4, 19,
+  15, 0, 32, 49, 0, 0, 3, 0, 0, 7,
+  0, 34, 8, 10, 16, 0, 0, 0, 3, 45,
+  0, 0, 93, 35, 51, 0, 0, 0, 0, 53,
+  20, 0, 103, 0, 0, 43, 0, 68, 175, 29,
+  22, 0, 0, 35, 0, 61, 4, 6, 0, 0,
+  64, 5, 21, 0, 0, 19, 51, 0, 81, 0,
+  0, 0, 7, 0, 55, 0, 12, 95, 28, 106,
+  1, 0, 0, 0, 4, 67, 71, 0, 2, 16,
+  0, 39, 0, 0, 0, 0, 25, 0, 0, 0,
+  0, 18, 65, 17, 0, 0, 10, 25, 0, 0,
+  0, 85, 0, 0, 22, 0, 0, 0, 0, 0,
+  0, 0, 0, 39, 3, 8, 0, 40, 0, 0,
+  0, 0, 8, 3, 0, 0, 0, 38, 0, 0,
+  0, 43, 47, 68, 23, 0, 46, 0, 22, 15,
+  0, 13, 59, 13, 0, 0, 0, 55, 0, 0,
+  112, 118, 34, 26, 48, 0, 0, 57, 67, 0,
+  179, 5, 0, 32, 0, 139, 175, 0, 10, 15,
+  0, 0, 0, 0, 42, 0, 0, 0, 28, 19,
+  31, 0, 0, 11, 42, 0, 0, 116, 13, 0,
+  34, 0, 0, 0, 6, 54, 43, 142, 0, 0,
+  0, 0, 0, 58, 0, 0, 0, 29, 0, 30,
+  0, 10, 0, 0, 53, 0, 0, 0, 0, 0,
+  1, 29, 1, 6, 0, 37, 0, 0, 0, 81,
+  0, 0, 83, 32, 0, 0, 0, 9, 0, 42,
+  6, 26, 0, 10, 0, 0, 0, 25, 0, 0,
+  22, 40, 7, 0, 0, 0, 67, 0, 0, 20,
+  33, 86, 0, 0, 32, 0, 0, 10, 0, 67,
+  54, 81, 0, 26, 0, 6, 0, 0, 25, 36,
+  58, 0, 32, 0, 0, 65, 0, 0, 102, 0,
+  0, 34, 25, 57, 85, 0, 33, 59, 0, 79,
+  0, 0, 3, 0, 3, 0, 2, 0, 0, 0,
+  0, 49, 15, 0, 0, 173, 0, 0, 0, 0,
+  0, 0, 0, 64, 113, 110, 0, 0, 0, 0,
+  0, 29, 0, 22, 0, 30, 0, 19, 0, 0,
+  0, 29, 61, 0, 40, 0, 0, 0, 0, 15,
+  1, 35, 0, 34, 21, 0, 0, 0, 48, 33,
+  91, 15, 14, 16, 57, 1, 0, 81, 49, 0,
+  0, 0, 6, 20, 26, 30, 1, 0, 0, 23,
+  0, 0, 0, 0, 60, 0, 3, 0, 0, 56,
+  0, 42, 4, 5, 0, 43, 0, 101, 57, 64,
+  0, 36, 0, 14, 67, 0, 0, 0, 60, 0,
+  18, 0, 6, 36, 0, 46, 0, 0, 0, 0,
+  80, 0, 0, 0, 27, 50, 26, 48, 16, 11,
+  0, 0, 59, 0, 25, 0, 0, 9, 9, 3,
+  5, 0, 0, 63, 0, 14, 0, 0, 0, 0,
+  4, 79, 88, 0, 0, 0, 17, 0, 30, 2,
+  0, 51, 0, 7, 0, 20, 0, 0, 0, 31,
+  77, 0, 50, 0, 85, 0, 42, 0, 14, 0,
+  46, 82, 0, 50, 1, 35, 0, 0, 22, 0,
+  0, 15, 41, 6, 0, 0, 0, 19, 21, 11,
+  13, 31, 0, 0, 0, 0, 64, 0, 0, 0,
+  30, 54, 0, 0, 28, 29, 0, 17, 0, 0,
+  0, 0, 1, 18, 5, 11, 10, 0, 0, 0,
+  0, 57, 0, 22, 95, 48, 30, 4, 0, 0,
+  0, 73, 54, 11, 88, 0, 0, 66, 0, 94,
+  130, 13, 9, 0, 0, 4, 0, 2, 68, 0,
+  0, 0, 23, 16, 20, 0, 0, 28, 33, 13,
+  56, 0, 0, 0, 6, 0, 47, 0, 18, 68,
+  22, 150, 0, 0, 0, 0, 0, 82, 91, 0,
+  7, 26, 10, 31, 0, 0, 0, 0, 31, 0,
+  0, 0, 0, 0, 50, 35, 0, 2, 1, 12,
+  0, 19, 0, 115, 0, 0, 17, 0, 0, 0,
+  0, 1, 0, 0, 0, 28, 11, 16, 0, 65,
+  2, 0, 0, 0, 23, 0, 0, 0, 0, 17,
+  8, 0, 9, 65, 12, 45, 5, 0, 48, 0,
+  0, 18, 0, 33, 46, 0, 0, 7, 0, 29,
+  0, 0, 131, 59, 54, 5, 43, 0, 0, 107,
+  51, 0, 166, 0, 0, 46, 0, 112, 193, 0,
+  44, 0, 0, 35, 0, 0, 29, 0, 0, 0,
+  32, 0, 28, 0, 0, 1, 14, 0, 0, 79,
+  16, 0, 38, 0, 0, 0, 3, 61, 47, 127,
+  0, 0, 0, 0, 0, 36, 0, 0, 0, 55,
+  0, 53, 0, 0, 0, 0, 47, 0, 0, 0,
+  0, 0, 13, 18, 0, 12, 0, 1, 0, 0,
+  0, 57, 0, 18, 70, 15, 0, 4, 0, 0,
+  0, 50, 13, 20, 0, 0, 47, 47, 29, 12,
+  0, 0, 0, 10, 0, 0, 0, 0, 50, 0,
+  0, 44, 0, 64, 0, 0, 54, 0, 0, 47,
+  0, 99, 16, 46, 0, 15, 0, 37, 0, 0,
+  63, 0, 74, 0, 64, 0, 0, 62, 0, 0,
+  90, 0, 0, 12, 30, 23, 61, 0, 70, 60,
+  0, 76, 0, 1, 0, 0, 21, 0, 0, 0,
+  0, 0, 8, 0, 5, 0, 0, 121, 9, 0,
+  0, 0, 0, 0, 20, 54, 116, 17, 0, 0,
+  0, 0, 11, 9, 0, 21, 0, 19, 0, 73,
+  0, 0, 0, 0, 56, 0, 53, 0, 0, 0,
+  21, 0, 18, 0, 0, 155, 0, 57, 4, 0,
+  35, 0, 65, 0, 13, 22, 77, 0, 0, 0,
+  0, 12, 22, 43, 12, 0, 0, 61, 29, 33,
+  73, 13, 3, 0, 36, 0, 52, 0, 38, 0,
+  0, 0, 0, 0, 0, 22, 0, 53, 11, 0,
+  16, 0, 0, 0, 43, 52, 47, 51, 11, 17,
+  36, 0, 0, 49, 1, 0, 0, 0, 0, 0,
+  2, 16, 0, 0, 11, 34, 0, 0, 39, 55,
+  0, 69, 4, 0, 37, 56, 49, 10, 11, 0,
+  0, 58, 72, 93, 137, 0, 0, 11, 0, 0,
+  57, 0, 44, 81, 42, 39, 0, 0, 0, 0,
+  27, 70, 152, 18, 4, 0, 17, 10, 0, 0,
+  0, 0, 0, 0, 3, 0, 133, 2, 119, 5,
+  0, 0, 21, 77, 0, 54, 0, 57, 1, 0,
+  24, 0, 0, 9, 43, 0, 0, 0, 0, 20,
+  47, 27, 0, 27, 1, 0, 0, 0, 69, 0,
+  0, 0, 4, 19, 15, 0, 32, 49, 0, 0,
+  3, 0, 0, 7, 0, 34, 8, 10, 16, 0,
+  0, 0, 3, 45, 0, 0, 93, 35, 51, 0,
+  0, 0, 0, 53, 20, 0, 103, 0, 0, 43,
+  0, 68, 175, 29, 22, 0, 0, 35, 0, 61,
+  4, 6, 0, 0, 64, 5, 21, 0, 0, 19,
+  51, 0, 81, 0, 0, 0, 7, 0, 55, 0,
+  12, 95, 28, 106, 1, 0, 0, 0, 4, 67,
+  71, 0, 2, 16, 0, 39, 0, 0, 0, 0,
+  25, 0, 0, 0, 0, 18, 65, 17, 0, 0,
+  0, 0, 0, 25, 0, 135, 0, 7, 42, 0,
+  0, 4, 0, 6, 0, 0, 0, 25, 13, 0,
+  41, 106, 15, 0, 0, 0, 0, 1, 0, 0,
+  0, 1, 9, 0, 0, 82, 0, 40, 0, 0,
+  45, 0, 0, 46, 0, 80, 0, 4, 0, 0,
+  0, 52, 0, 0, 133, 36, 44, 0, 57, 0,
+  0, 92, 42, 0, 155, 0, 0, 30, 0, 77,
+  196, 0, 59, 34, 0, 31, 0, 16, 9, 0,
+  0, 0, 35, 0, 0, 0, 1, 0, 11, 0,
+  0, 92, 0, 0, 27, 0, 0, 0, 7, 76,
+  78, 108, 0, 0, 0, 0, 0, 30, 0, 0,
+  0, 38, 0, 95, 0, 0, 0, 0, 52, 0,
+  0, 0, 0, 0, 21, 0, 0, 6, 0, 37,
+  0, 0, 0, 81, 0, 0, 83, 32, 0, 0,
+  0, 9, 0, 42, 6, 26, 0, 10, 0, 0,
+  0, 25, 0, 0, 22, 40, 7, 0, 0, 0,
+  67, 0, 0, 20, 33, 86, 0, 0, 32, 0,
+  0, 10, 0, 67, 54, 81, 0, 26, 0, 6,
+  0, 0, 25, 36, 58, 0, 32, 0, 0, 65,
+  0, 0, 102, 0, 0, 34, 25, 57, 85, 0,
+  33, 59, 0, 79, 0, 0, 3, 0, 3, 0,
+  2, 0, 0, 0, 0, 49, 15, 0, 0, 173,
+  0, 0, 0, 0, 0, 0, 0, 64, 113, 110,
+  0, 0, 0, 0, 0, 29, 0, 22, 0, 30,
+  0, 19, 0, 0, 0, 29, 61, 0, 40, 0,
+  0, 0, 0, 15, 1, 35, 0, 34, 21, 0,
+  0, 0, 48, 33, 91, 15, 14, 16, 57, 1,
+  0, 81, 49, 0, 0, 0, 6, 20, 26, 30,
+  1, 0, 0, 23, 0, 0, 0, 0, 60, 0,
+  3, 0, 0, 56, 0, 42, 4, 5, 0, 43,
+  0, 101, 57, 64, 0, 36, 0, 14, 67, 0,
+  0, 0, 60, 0, 18, 0, 6, 36, 0, 46,
+  0, 0, 0, 0, 80, 0, 0, 0, 27, 50,
+  26, 48, 16, 11, 0, 0, 59, 0, 25, 0,
+  0, 9, 9, 3, 5, 0, 0, 63, 0, 14,
+  0, 0, 0, 0, 4, 79, 88, 0, 0, 0,
+  17, 0, 30, 2, 0, 51, 0, 7, 0, 20,
+  0, 0, 0, 31, 77, 0, 50, 0, 85, 0,
+  42, 0, 14, 0, 0, 27, 0, 6, 0, 0,
+  33, 17, 40, 0, 12, 29, 62, 0, 14, 33,
+  65, 28, 0, 0, 26, 32, 26, 12, 42, 0,
+  0, 27, 0, 0, 0, 0, 69, 0, 0, 0,
+  0, 14, 0, 40, 0, 14, 0, 40, 23, 88,
+  0, 29, 0, 18, 0, 24, 66, 1, 4, 0,
+  0, 0, 0, 0, 30, 14, 0, 50, 0, 7,
+  42, 0, 37, 0, 0, 0, 0, 48, 16, 0,
+  58, 78, 0, 0, 60, 0, 43, 4, 0, 14,
+  12, 0, 0, 2, 0, 24, 0, 6, 0, 25,
+  4, 0, 5, 84, 38, 0, 0, 3, 48, 0,
+  12, 5, 0, 1, 0, 12, 0, 2, 0, 0,
+  15, 0, 12, 0, 16, 0, 60, 0, 26, 0,
+  25, 0, 1, 12, 0, 19, 0, 115, 0, 0,
+  17, 0, 0, 0, 0, 1, 0, 0, 0, 28,
+  11, 16, 0, 65, 2, 0, 0, 0, 23, 0,
+  0, 0, 0, 17, 8, 0, 9, 65, 12, 45,
+  5, 0, 48, 0, 0, 18, 0, 33, 46, 0,
+  0, 7, 0, 29, 0, 0, 131, 59, 54, 5,
+  43, 0, 0, 107, 51, 0, 166, 0, 0, 46,
+  0, 112, 193, 0, 44, 0, 0, 35, 0, 0,
+  29, 0, 0, 0, 32, 0, 28, 0, 0, 1,
+  14, 0, 0, 79, 16, 0, 38, 0, 0, 0,
+  3, 61, 47, 127, 0, 0, 0, 0, 0, 36,
+  0, 0, 0, 55, 0, 53, 0, 0, 0, 0,
+  47, 0, 0, 0, 0, 0, 13, 18, 0, 12,
+  0, 1, 0, 0, 0, 57, 0, 18, 70, 15,
+  0, 4, 0, 0, 0, 50, 13, 20, 0, 0,
+  47, 47, 29, 12, 0, 0, 0, 10, 0, 0,
+  0, 0, 50, 0, 0, 44, 0, 64, 0, 0,
+  54, 0, 0, 47, 0, 99, 16, 46, 0, 15,
+  0, 37, 0, 0, 63, 0, 74, 0, 64, 0,
+  0, 62, 0, 0, 90, 0, 0, 12, 30, 23,
+  61, 0, 70, 60, 0, 76, 0, 1, 0, 0,
+  21, 0, 0, 0, 0, 0, 8, 0, 5, 0,
+  0, 121, 9, 0, 0, 0, 0, 0, 20, 54,
+  116, 17, 0, 0, 0, 0, 11, 9, 0, 21,
+  0, 19, 0, 73, 0, 0, 0, 0, 56, 0,
+  53, 0, 0, 0, 21, 0, 18, 0, 0, 48,
+  16, 0, 0, 0, 50, 44, 75, 3, 3, 42,
+  110, 0, 16, 61, 79, 13, 2, 0, 31, 54,
+  4, 6, 49, 0, 0, 45, 0, 0, 0, 0,
+  83, 0, 2, 0, 0, 62, 0, 80, 0, 35,
+  4, 49, 18, 97, 6, 35, 0, 42, 0, 40,
+  48, 0, 23, 0, 3, 0, 0, 0, 0, 5,
+  0, 59, 0, 17, 20, 0, 40, 0, 0, 0,
+  0, 48, 8, 0, 29, 54, 0, 0, 33, 0,
+  42, 5, 0, 9, 4, 0, 0, 8, 0, 4,
+  0, 44, 0, 13, 5, 8, 15, 84, 41, 0,
+  0, 0, 34, 0, 24, 13, 4, 22, 0, 21,
+  0, 22, 0, 0, 0, 0, 35, 0, 31, 0,
+  111, 0, 71, 0, 32, 0, 21, 77, 0, 54,
+  0, 57, 1, 0, 24, 0, 0, 9, 43, 0,
+  0, 0, 0, 20, 47, 27, 0, 27, 1, 0,
+  0, 0, 69, 0, 0, 0, 4, 19, 15, 0,
+  32, 49, 0, 0, 3, 0, 0, 7, 0, 34,
+  8, 10, 16, 0, 0, 0, 3, 45, 0, 0,
+  93, 35, 51, 0, 0, 0, 0, 53, 20, 0,
+  103, 0, 0, 43, 0, 68, 175, 29, 22, 0,
+  0, 35, 0, 61, 4, 6, 0, 0, 64, 5,
+  21, 0, 0, 19, 51, 0, 81, 0, 0, 0,
+  7, 0, 55, 0, 12, 95, 28, 106, 1, 0,
+  0, 0, 4, 67, 71, 0, 2, 16, 0, 39,
+  0, 0, 0, 0, 25, 0, 0, 0, 0, 18,
+  65, 17, 0, 0, 0, 0, 0, 25, 0, 135,
+  0, 7, 42, 0, 0, 4, 0, 6, 0, 0,
+  0, 25, 13, 0, 41, 106, 15, 0, 0, 0,
+  0, 1, 0, 0, 0, 1, 9, 0, 0, 82,
+  0, 40, 0, 0, 45, 0, 0, 46, 0, 80,
+  0, 4, 0, 0, 0, 52, 0, 0, 133, 36,
+  44, 0, 57, 0, 0, 92, 42, 0, 155, 0,
+  0, 30, 0, 77, 196, 0, 59, 34, 0, 31,
+  0, 16, 9, 0, 0, 0, 35, 0, 0, 0,
+  1, 0, 11, 0, 0, 92, 0, 0, 27, 0,
+  0, 0, 7, 76, 78, 108, 0, 0, 0, 0,
+  0, 30, 0, 0, 0, 38, 0, 95, 0, 0,
+  0, 0, 52, 0, 0, 0, 0, 0, 21, 0,
+  0, 6, 0, 28, 0, 8, 0, 24, 24, 29,
+  104, 12, 0, 37, 106, 0, 0, 105, 62, 22,
+  0, 0, 41, 62, 0, 12, 2, 0, 0, 43,
+  0, 0, 0, 0, 76, 0, 33, 0, 0, 91,
+  0, 53, 32, 0, 4, 39, 5, 115, 2, 34,
+  0, 36, 0, 56, 16, 0, 56, 0, 6, 0,
+  36, 0, 0, 14, 0, 21, 0, 0, 0, 0,
+  27, 0, 37, 0, 47, 52, 0, 14, 8, 31,
+  0, 0, 8, 0, 29, 0, 0, 10, 11, 0,
+  20, 0, 0, 68, 0, 34, 0, 0, 0, 0,
+  26, 84, 90, 0, 0, 0, 22, 0, 15, 31,
+  0, 34, 0, 30, 0, 52, 0, 0, 0, 0,
+  60, 0, 39, 0, 79, 0, 69, 0, 34, 16,
+  0, 34, 21, 0, 0, 0, 48, 33, 91, 15,
+  14, 16, 57, 1, 0, 81, 49, 0, 0, 0,
+  6, 20, 26, 30, 1, 0, 0, 23, 0, 0,
+  0, 0, 60, 0, 3, 0, 0, 56, 0, 42,
+  4, 5, 0, 43, 0, 101, 57, 64, 0, 36,
+  0, 14, 67, 0, 0, 0, 60, 0, 18, 0,
+  6, 36, 0, 46, 0, 0, 0, 0, 80, 0,
+  0, 0, 27, 50, 26, 48, 16, 11, 0, 0,
+  59, 0, 25, 0, 0, 9, 9, 3, 5, 0,
+  0, 63, 0, 14, 0, 0, 0, 0, 4, 79,
+  88, 0, 0, 0, 17, 0, 30, 2, 0, 51,
+  0, 7, 0, 20, 0, 0, 0, 31, 77, 0,
+  50, 0, 85, 0, 42, 0, 14, 0, 0, 27,
+  0, 6, 0, 0, 33, 17, 40, 0, 12, 29,
+  62, 0, 14, 33, 65, 28, 0, 0, 26, 32,
+  26, 12, 42, 0, 0, 27, 0, 0, 0, 0,
+  69, 0, 0, 0, 0, 14, 0, 40, 0, 14,
+  0, 40, 23, 88, 0, 29, 0, 18, 0, 24,
+  66, 1, 4, 0, 0, 0, 0, 0, 30, 14,
+  0, 50, 0, 7, 42, 0, 37, 0, 0, 0,
+  0, 48, 16, 0, 58, 78, 0, 0, 60, 0,
+  43, 4, 0, 14, 12, 0, 0, 2, 0, 24,
+  0, 6, 0, 25, 4, 0, 5, 84, 38, 0,
+  0, 3, 48, 0, 12, 5, 0, 1, 0, 12,
+  0, 2, 0, 0, 15, 0, 12, 0, 16, 0,
+  60, 0, 26, 0, 25, 0, 32, 14, 0, 17,
+  0, 0, 0, 0, 0, 0, 1, 1, 16, 0,
+  0, 0, 49, 11, 3, 0, 0, 29, 0, 16,
+  72, 0, 37, 30, 0, 0, 0, 15, 79, 12,
+  0, 0, 0, 13, 41, 0, 0, 0, 0, 11,
+  0, 105, 32, 28, 0, 0, 0, 8, 36, 0,
+  22, 20, 3, 0, 0, 0, 87, 22, 0, 54,
+  0, 0, 130, 30, 67, 49, 31, 0, 0, 36,
+  0, 0, 48, 46, 0, 0, 36, 0, 58, 28,
+  0, 42, 0, 0, 0, 0, 0, 73, 0, 0,
+  0, 0, 0, 0, 0, 113, 49, 57, 10, 33,
+  35, 37, 0, 0, 24, 0, 0, 52, 0, 0,
+  0, 0, 4, 0, 10, 0, 8, 0, 23, 0,
+  0, 0, 31, 19, 0, 1, 0, 0, 0, 57,
+  0, 18, 70, 15, 0, 4, 0, 0, 0, 50,
+  13, 20, 0, 0, 47, 47, 29, 12, 0, 0,
+  0, 10, 0, 0, 0, 0, 50, 0, 0, 44,
+  0, 64, 0, 0, 54, 0, 0, 47, 0, 99,
+  16, 46, 0, 15, 0, 37, 0, 0, 63, 0,
+  74, 0, 64, 0, 0, 62, 0, 0, 90, 0,
+  0, 12, 30, 23, 61, 0, 70, 60, 0, 76,
+  0, 1, 0, 0, 21, 0, 0, 0, 0, 0,
+  8, 0, 5, 0, 0, 121, 9, 0, 0, 0,
+  0, 0, 20, 54, 116, 17, 0, 0, 0, 0,
+  11, 9, 0, 21, 0, 19, 0, 73, 0, 0,
+  0, 0, 56, 0, 53, 0, 0, 0, 21, 0,
+  18, 0, 0, 48, 16, 0, 0, 0, 50, 44,
+  75, 3, 3, 42, 110, 0, 16, 61, 79, 13,
+  2, 0, 31, 54, 4, 6, 49, 0, 0, 45,
+  0, 0, 0, 0, 83, 0, 2, 0, 0, 62,
+  0, 80, 0, 35, 4, 49, 18, 97, 6, 35,
+  0, 42, 0, 40, 48, 0, 23, 0, 3, 0,
+  0, 0, 0, 5, 0, 59, 0, 17, 20, 0,
+  40, 0, 0, 0, 0, 48, 8, 0, 29, 54,
+  0, 0, 33, 0, 42, 5, 0, 9, 4, 0,
+  0, 8, 0, 4, 0, 44, 0, 13, 5, 8,
+  15, 84, 41, 0, 0, 0, 34, 0, 24, 13,
+  4, 22, 0, 21, 0, 22, 0, 0, 0, 0,
+  35, 0, 31, 0, 111, 0, 71, 0, 32, 0,
+  3, 37, 0, 0, 14, 0, 32, 0, 0, 0,
+  3, 23, 56, 0, 0, 4, 62, 15, 4, 0,
+  0, 72, 0, 17, 107, 0, 0, 48, 0, 0,
+  0, 48, 90, 0, 0, 0, 0, 51, 43, 7,
+  0, 46, 21, 29, 25, 100, 41, 0, 0, 5,
+  0, 0, 5, 0, 27, 0, 7, 0, 20, 2,
+  58, 63, 0, 50, 0, 0, 97, 52, 73, 0,
+  0, 0, 9, 20, 30, 0, 53, 59, 0, 0,
+  0, 0, 39, 57, 10, 31, 0, 0, 0, 14,
+  0, 0, 0, 54, 0, 21, 0, 18, 0, 113,
+  24, 11, 22, 20, 39, 43, 10, 0, 43, 0,
+  0, 50, 0, 0, 0, 0, 10, 1, 48, 0,
+  7, 0, 27, 0, 30, 0, 30, 47, 0, 0,
+  0, 25, 0, 135, 0, 7, 42, 0, 0, 4,
+  0, 6, 0, 0, 0, 25, 13, 0, 41, 106,
+  15, 0, 0, 0, 0, 1, 0, 0, 0, 1,
+  9, 0, 0, 82, 0, 40, 0, 0, 45, 0,
+  0, 46, 0, 80, 0, 4, 0, 0, 0, 52,
+  0, 0, 133, 36, 44, 0, 57, 0, 0, 92,
+  42, 0, 155, 0, 0, 30, 0, 77, 196, 0,
+  59, 34, 0, 31, 0, 16, 9, 0, 0, 0,
+  35, 0, 0, 0, 1, 0, 11, 0, 0, 92,
+  0, 0, 27, 0, 0, 0, 7, 76, 78, 108,
+  0, 0, 0, 0, 0, 30, 0, 0, 0, 38,
+  0, 95, 0, 0, 0, 0, 52, 0, 0, 0,
+  0, 0, 21, 0, 0, 6, 0, 28, 0, 8,
+  0, 24, 24, 29, 104, 12, 0, 37, 106, 0,
+  0, 105, 62, 22, 0, 0, 41, 62, 0, 12,
+  2, 0, 0, 43, 0, 0, 0, 0, 76, 0,
+  33, 0, 0, 91, 0, 53, 32, 0, 4, 39,
+  5, 115, 2, 34, 0, 36, 0, 56, 16, 0,
+  56, 0, 6, 0, 36, 0, 0, 14, 0, 21,
+  0, 0, 0, 0, 27, 0, 37, 0, 47, 52,
+  0, 14, 8, 31, 0, 0, 8, 0, 29, 0,
+  0, 10, 11, 0, 20, 0, 0, 68, 0, 34,
+  0, 0, 0, 0, 26, 84, 90, 0, 0, 0,
+  22, 0, 15, 31, 0, 34, 0, 30, 0, 52,
+  0, 0, 0, 0, 60, 0, 39, 0, 79, 0,
+  69, 0, 34, 16, 0, 39, 58, 0, 0, 0,
+  35, 20, 76, 0, 11, 39, 97, 0, 0, 94,
+  63, 17, 0, 0, 0, 47, 11, 21, 63, 0,
+  0, 58, 0, 0, 0, 24, 97, 0, 27, 0,
+  0, 89, 26, 22, 38, 4, 46, 33, 23, 117,
+  42, 0, 0, 22, 0, 0, 14, 0, 32, 0,
+  5, 0, 47, 0, 0, 49, 0, 19, 0, 0,
+  17, 1, 30, 0, 0, 0, 56, 43, 10, 31,
+  22, 65, 0, 0, 6, 0, 19, 88, 0, 42,
+  0, 0, 0, 23, 0, 11, 0, 31, 0, 0,
+  0, 0, 0, 85, 98, 0, 0, 0, 13, 0,
+  31, 29, 0, 24, 0, 19, 0, 5, 0, 0,
+  0, 12, 70, 0, 0, 0, 32, 0, 63, 0,
+  24, 34, 0, 27, 0, 6, 0, 0, 33, 17,
+  40, 0, 12, 29, 62, 0, 14, 33, 65, 28,
+  0, 0, 26, 32, 26, 12, 42, 0, 0, 27,
+  0, 0, 0, 0, 69, 0, 0, 0, 0, 14,
+  0, 40, 0, 14, 0, 40, 23, 88, 0, 29,
+  0, 18, 0, 24, 66, 1, 4, 0, 0, 0,
+  0, 0, 30, 14, 0, 50, 0, 7, 42, 0,
+  37, 0, 0, 0, 0, 48, 16, 0, 58, 78,
+  0, 0, 60, 0, 43, 4, 0, 14, 12, 0,
+  0, 2, 0, 24, 0, 6, 0, 25, 4, 0,
+  5, 84, 38, 0, 0, 3, 48, 0, 12, 5,
+  0, 1, 0, 12, 0, 2, 0, 0, 15, 0,
+  12, 0, 16, 0, 60, 0, 26, 0, 25, 0,
+  32, 14, 0, 17, 0, 0, 0, 0, 0, 0,
+  1, 1, 16, 0, 0, 0, 49, 11, 3, 0,
+  0, 29, 0, 16, 72, 0, 37, 30, 0, 0,
+  0, 15, 79, 12, 0, 0, 0, 13, 41, 0,
+  0, 0, 0, 11, 0, 105, 32, 28, 0, 0,
+  0, 8, 36, 0, 22, 20, 3, 0, 0, 0,
+  87, 22, 0, 54, 0, 0, 130, 30, 67, 49,
+  31, 0, 0, 36, 0, 0, 48, 46, 0, 0,
+  36, 0, 58, 28, 0, 42, 0, 0, 0, 0,
+  0, 73, 0, 0, 0, 0, 0, 0, 0, 113,
+  49, 57, 10, 33, 35, 37, 0, 0, 24, 0,
+  0, 52, 0, 0, 0, 0, 4, 0, 10, 0,
+  8, 0, 23, 0, 0, 0, 31, 19, 12, 13,
+  0, 21, 6, 5, 0, 0, 11, 0, 0, 0,
+  48, 0, 0, 18, 58, 12, 0, 0, 0, 8,
+  0, 28, 33, 0, 31, 20, 0, 0, 0, 2,
+  67, 50, 0, 0, 0, 26, 49, 0, 0, 0,
+  0, 31, 0, 97, 52, 74, 0, 0, 0, 36,
+  26, 0, 0, 44, 0, 0, 0, 0, 64, 9,
+  0, 12, 0, 0, 87, 26, 88, 48, 67, 0,
+  0, 16, 0, 0, 28, 0, 0, 0, 33, 0,
+  46, 22, 0, 32, 0, 0, 2, 0, 0, 84,
+  0, 0, 12, 0, 0, 0, 1, 115, 49, 54,
+  0, 40, 17, 26, 0, 0, 9, 0, 0, 49,
+  0, 16, 0, 0, 0, 0, 29, 0, 1, 0,
+  46, 0, 0, 0, 33, 16, 0, 48, 16, 0,
+  0, 0, 50, 44, 75, 3, 3, 42, 110, 0,
+  16, 61, 79, 13, 2, 0, 31, 54, 4, 6,
+  49, 0, 0, 45, 0, 0, 0, 0, 83, 0,
+  2, 0, 0, 62, 0, 80, 0, 35, 4, 49,
+  18, 97, 6, 35, 0, 42, 0, 40, 48, 0,
+  23, 0, 3, 0, 0, 0, 0, 5, 0, 59,
+  0, 17, 20, 0, 40, 0, 0, 0, 0, 48,
+  8, 0, 29, 54, 0, 0, 33, 0, 42, 5,
+  0, 9, 4, 0, 0, 8, 0, 4, 0, 44,
+  0, 13, 5, 8, 15, 84, 41, 0, 0, 0,
+  34, 0, 24, 13, 4, 22, 0, 21, 0, 22,
+  0, 0, 0, 0, 35, 0, 31, 0, 111, 0,
+  71, 0, 32, 0, 3, 37, 0, 0, 14, 0,
+  32, 0, 0, 0, 3, 23, 56, 0, 0, 4,
+  62, 15, 4, 0, 0, 72, 0, 17, 107, 0,
+  0, 48, 0, 0, 0, 48, 90, 0, 0, 0,
+  0, 51, 43, 7, 0, 46, 21, 29, 25, 100,
+  41, 0, 0, 5, 0, 0, 5, 0, 27, 0,
+  7, 0, 20, 2, 58, 63, 0, 50, 0, 0,
+  97, 52, 73, 0, 0, 0, 9, 20, 30, 0,
+  53, 59, 0, 0, 0, 0, 39, 57, 10, 31,
+  0, 0, 0, 14, 0, 0, 0, 54, 0, 21,
+  0, 18, 0, 113, 24, 11, 22, 20, 39, 43,
+  10, 0, 43, 0, 0, 50, 0, 0, 0, 0,
+  10, 1, 48, 0, 7, 0, 27, 0, 30, 0,
+  30, 47, 0, 22, 0, 0, 13, 12, 20, 0,
+  30, 0, 12, 20, 47, 4, 0, 16, 61, 0,
+  3, 0, 0, 56, 0, 10, 36, 0, 0, 41,
+  0, 0, 2, 0, 51, 24, 0, 0, 0, 75,
+  57, 0, 0, 1, 0, 46, 0, 115, 40, 68,
+  0, 0, 0, 16, 0, 0, 30, 32, 30, 0,
+  49, 0, 37, 54, 0, 31, 7, 0, 25, 63,
+  98, 0, 89, 0, 26, 32, 28, 22, 29, 0,
+  0, 0, 0, 0, 23, 34, 22, 43, 0, 13,
+  0, 0, 0, 67, 0, 29, 0, 0, 0, 0,
+  28, 122, 64, 34, 0, 28, 14, 55, 5, 5,
+  0, 0, 0, 59, 0, 9, 0, 5, 0, 38,
+  80, 0, 0, 0, 7, 0, 12, 0, 22, 22,
+  0, 28, 0, 8, 0, 24, 24, 29, 104, 12,
+  0, 37, 106, 0, 0, 105, 62, 22, 0, 0,
+  41, 62, 0, 12, 2, 0, 0, 43, 0, 0,
+  0, 0, 76, 0, 33, 0, 0, 91, 0, 53,
+  32, 0, 4, 39, 5, 115, 2, 34, 0, 36,
+  0, 56, 16, 0, 56, 0, 6, 0, 36, 0,
+  0, 14, 0, 21, 0, 0, 0, 0, 27, 0,
+  37, 0, 47, 52, 0, 14, 8, 31, 0, 0,
+  8, 0, 29, 0, 0, 10, 11, 0, 20, 0,
+  0, 68, 0, 34, 0, 0, 0, 0, 26, 84,
+  90, 0, 0, 0, 22, 0, 15, 31, 0, 34,
+  0, 30, 0, 52, 0, 0, 0, 0, 60, 0,
+  39, 0, 79, 0, 69, 0, 34, 16, 0, 39,
+  58, 0, 0, 0, 35, 20, 76, 0, 11, 39,
+  97, 0, 0, 94, 63, 17, 0, 0, 0, 47,
+  11, 21, 63, 0, 0, 58, 0, 0, 0, 24,
+  97, 0, 27, 0, 0, 89, 26, 22, 38, 4,
+  46, 33, 23, 117, 42, 0, 0, 22, 0, 0,
+  14, 0, 32, 0, 5, 0, 47, 0, 0, 49,
+  0, 19, 0, 0, 17, 1, 30, 0, 0, 0,
+  56, 43, 10, 31, 22, 65, 0, 0, 6, 0,
+  19, 88, 0, 42, 0, 0, 0, 23, 0, 11,
+  0, 31, 0, 0, 0, 0, 0, 85, 98, 0,
+  0, 0, 13, 0, 31, 29, 0, 24, 0, 19,
+  0, 5, 0, 0, 0, 12, 70, 0, 0, 0,
+  32, 0, 63, 0, 24, 34, 0, 10, 0, 0,
+  0, 0, 0, 1, 32, 2, 16, 56, 0, 30,
+  0, 9, 3, 0, 2, 0, 1, 27, 71, 20,
+  5, 0, 0, 23, 0, 18, 0, 0, 30, 0,
+  15, 0, 59, 84, 34, 0, 85, 0, 0, 5,
+  0, 98, 39, 10, 0, 0, 0, 0, 0, 0,
+  57, 0, 55, 0, 96, 0, 0, 81, 9, 12,
+  28, 9, 50, 46, 29, 21, 0, 0, 85, 58,
+  7, 94, 37, 18, 0, 0, 0, 22, 0, 74,
+  0, 50, 11, 36, 0, 0, 0, 84, 19, 16,
+  0, 0, 0, 0, 17, 49, 89, 0, 0, 0,
+  0, 27, 5, 0, 0, 3, 0, 9, 0, 9,
+  21, 75, 0, 33, 64, 0, 0, 0, 0, 0,
+  0, 0, 0, 41, 32, 14, 0, 17, 0, 0,
+  0, 0, 0, 0, 1, 1, 16, 0, 0, 0,
+  49, 11, 3, 0, 0, 29, 0, 16, 72, 0,
+  37, 30, 0, 0, 0, 15, 79, 12, 0, 0,
+  0, 13, 41, 0, 0, 0, 0, 11, 0, 105,
+  32, 28, 0, 0, 0, 8, 36, 0, 22, 20,
+  3, 0, 0, 0, 87, 22, 0, 54, 0, 0,
+  130, 30, 67, 49, 31, 0, 0, 36, 0, 0,
+  48, 46, 0, 0, 36, 0, 58, 28, 0, 42,
+  0, 0, 0, 0, 0, 73, 0, 0, 0, 0,
+  0, 0, 0, 113, 49, 57, 10, 33, 35, 37,
+  0, 0, 24, 0, 0, 52, 0, 0, 0, 0,
+  4, 0, 10, 0, 8, 0, 23, 0, 0, 0,
+  31, 19, 12, 13, 0, 21, 6, 5, 0, 0,
+  11, 0, 0, 0, 48, 0, 0, 18, 58, 12,
+  0, 0, 0, 8, 0, 28, 33, 0, 31, 20,
+  0, 0, 0, 2, 67, 50, 0, 0, 0, 26,
+  49, 0, 0, 0, 0, 31, 0, 97, 52, 74,
+  0, 0, 0, 36, 26, 0, 0, 44, 0, 0,
+  0, 0, 64, 9, 0, 12, 0, 0, 87, 26,
+  88, 48, 67, 0, 0, 16, 0, 0, 28, 0,
+  0, 0, 33, 0, 46, 22, 0, 32, 0, 0,
+  2, 0, 0, 84, 0, 0, 12, 0, 0, 0,
+  1, 115, 49, 54, 0, 40, 17, 26, 0, 0,
+  9, 0, 0, 49, 0, 16, 0, 0, 0, 0,
+  29, 0, 1, 0, 46, 0, 0, 0, 33, 16,
+  0, 98, 0, 20, 14, 0, 60, 12, 44, 16,
+  32, 0, 54, 0, 44, 107, 104, 30, 6, 0,
+  0, 0, 0, 40, 41, 45, 0, 53, 0, 0,
+  0, 0, 87, 64, 0, 0, 0, 27, 0, 41,
+  0, 0, 16, 28, 30, 44, 24, 53, 0, 28,
+  0, 0, 87, 10, 0, 0, 0, 14, 0, 58,
+  10, 0, 0, 24, 0, 0, 75, 0, 41, 0,
+  0, 0, 0, 48, 17, 40, 0, 0, 0, 12,
+  73, 0, 9, 26, 0, 32, 2, 2, 0, 43,
+  49, 36, 0, 65, 0, 26, 0, 0, 0, 86,
+  27, 0, 0, 0, 9, 0, 28, 10, 24, 30,
+  0, 17, 0, 27, 0, 0, 0, 0, 2, 0,
+  8, 0, 164, 0, 52, 9, 40, 0, 3, 37,
+  0, 0, 14, 0, 32, 0, 0, 0, 3, 23,
+  56, 0, 0, 4, 62, 15, 4, 0, 0, 72,
+  0, 17, 107, 0, 0, 48, 0, 0, 0, 48,
+  90, 0, 0, 0, 0, 51, 43, 7, 0, 46,
+  21, 29, 25, 100, 41, 0, 0, 5, 0, 0,
+  5, 0, 27, 0, 7, 0, 20, 2, 58, 63,
+  0, 50, 0, 0, 97, 52, 73, 0, 0, 0,
+  9, 20, 30, 0, 53, 59, 0, 0, 0, 0,
+  39, 57, 10, 31, 0, 0, 0, 14, 0, 0,
+  0, 54, 0, 21, 0, 18, 0, 113, 24, 11,
+  22, 20, 39, 43, 10, 0, 43, 0, 0, 50,
+  0, 0, 0, 0, 10, 1, 48, 0, 7, 0,
+  27, 0, 30, 0, 30, 47, 0, 22, 0, 0,
+  13, 12, 20, 0, 30, 0, 12, 20, 47, 4,
+  0, 16, 61, 0, 3, 0, 0, 56, 0, 10,
+  36, 0, 0, 41, 0, 0, 2, 0, 51, 24,
+  0, 0, 0, 75, 57, 0, 0, 1, 0, 46,
+  0, 115, 40, 68, 0, 0, 0, 16, 0, 0,
+  30, 32, 30, 0, 49, 0, 37, 54, 0, 31,
+  7, 0, 25, 63, 98, 0, 89, 0, 26, 32,
+  28, 22, 29, 0, 0, 0, 0, 0, 23, 34,
+  22, 43, 0, 13, 0, 0, 0, 67, 0, 29,
+  0, 0, 0, 0, 28, 122, 64, 34, 0, 28,
+  14, 55, 5, 5, 0, 0, 0, 59, 0, 9,
+  0, 5, 0, 38, 80, 0, 0, 0, 7, 0,
+  12, 0, 22, 22, 0, 49, 0, 0, 0, 0,
+  12, 0, 80, 43, 25, 0, 73, 2, 0, 149,
+  100, 43, 17, 0, 0, 0, 0, 25, 0, 0,
+  21, 90, 9, 0, 9, 0, 115, 13, 0, 0,
+  4, 73, 0, 0, 23, 0, 0, 26, 0, 80,
+  0, 54, 0, 37, 0, 15, 61, 0, 0, 23,
+  13, 7, 0, 32, 0, 0, 0, 0, 0, 0,
+  27, 12, 61, 0, 7, 0, 0, 98, 0, 66,
+  0, 13, 0, 0, 19, 3, 24, 48, 0, 47,
+  3, 23, 13, 19, 53, 124, 0, 32, 23, 0,
+  0, 0, 0, 90, 142, 0, 0, 0, 8, 0,
+  0, 33, 0, 34, 0, 47, 0, 22, 0, 0,
+  0, 0, 6, 0, 0, 0, 122, 0, 29, 0,
+  52, 16, 0, 39, 58, 0, 0, 0, 35, 20,
+  76, 0, 11, 39, 97, 0, 0, 94, 63, 17,
+  0, 0, 0, 47, 11, 21, 63, 0, 0, 58,
+  0, 0, 0, 24, 97, 0, 27, 0, 0, 89,
+  26, 22, 38, 4, 46, 33, 23, 117, 42, 0,
+  0, 22, 0, 0, 14, 0, 32, 0, 5, 0,
+  47, 0, 0, 49, 0, 19, 0, 0, 17, 1,
+  30, 0, 0, 0, 56, 43, 10, 31, 22, 65,
+  0, 0, 6, 0, 19, 88, 0, 42, 0, 0,
+  0, 23, 0, 11, 0, 31, 0, 0, 0, 0,
+  0, 85, 98, 0, 0, 0, 13, 0, 31, 29,
+  0, 24, 0, 19, 0, 5, 0, 0, 0, 12,
+  70, 0, 0, 0, 32, 0, 63, 0, 24, 34,
+  0, 10, 0, 0, 0, 0, 0, 1, 32, 2,
+  16, 56, 0, 30, 0, 9, 3, 0, 2, 0,
+  1, 27, 71, 20, 5, 0, 0, 23, 0, 18,
+  0, 0, 30, 0, 15, 0, 59, 84, 34, 0,
+  85, 0, 0, 5, 0, 98, 39, 10, 0, 0,
+  0, 0, 0, 0, 57, 0, 55, 0, 96, 0,
+  0, 81, 9, 12, 28, 9, 50, 46, 29, 21,
+  0, 0, 85, 58, 7, 94, 37, 18, 0, 0,
+  0, 22, 0, 74, 0, 50, 11, 36, 0, 0,
+  0, 84, 19, 16, 0, 0, 0, 0, 17, 49,
+  89, 0, 0, 0, 0, 27, 5, 0, 0, 3,
+  0, 9, 0, 9, 21, 75, 0, 33, 64, 0,
+  0, 0, 0, 0, 0, 0, 0, 41, 4, 18,
+  11, 6, 0, 0, 0, 0, 60, 44, 0, 0,
+  0, 54, 0, 0, 0, 29, 17, 0, 3, 11,
+  34, 17, 0, 0, 58, 48, 0, 0, 0, 0,
+  53, 0, 0, 0, 74, 109, 0, 0, 46, 0,
+  0, 0, 0, 59, 0, 51, 0, 23, 0, 0,
+  0, 0, 78, 7, 34, 8, 0, 0, 0, 52,
+  29, 14, 74, 2, 53, 17, 8, 144, 9, 0,
+  46, 89, 0, 57, 27, 0, 12, 0, 0, 0,
+  31, 87, 0, 30, 0, 43, 20, 0, 0, 171,
+  0, 0, 22, 0, 7, 0, 0, 57, 123, 33,
+  0, 0, 0, 0, 0, 2, 0, 0, 0, 24,
+  0, 10, 20, 24, 0, 0, 14, 0, 0, 0,
+  0, 0, 0, 4, 58, 62, 12, 13, 0, 21,
+  6, 5, 0, 0, 11, 0, 0, 0, 48, 0,
+  0, 18, 58, 12, 0, 0, 0, 8, 0, 28,
+  33, 0, 31, 20, 0, 0, 0, 2, 67, 50,
+  0, 0, 0, 26, 49, 0, 0, 0, 0, 31,
+  0, 97, 52, 74, 0, 0, 0, 36, 26, 0,
+  0, 44, 0, 0, 0, 0, 64, 9, 0, 12,
+  0, 0, 87, 26, 88, 48, 67, 0, 0, 16,
+  0, 0, 28, 0, 0, 0, 33, 0, 46, 22,
+  0, 32, 0, 0, 2, 0, 0, 84, 0, 0,
+  12, 0, 0, 0, 1, 115, 49, 54, 0, 40,
+  17, 26, 0, 0, 9, 0, 0, 49, 0, 16,
+  0, 0, 0, 0, 29, 0, 1, 0, 46, 0,
+  0, 0, 33, 16, 0, 98, 0, 20, 14, 0,
+  60, 12, 44, 16, 32, 0, 54, 0, 44, 107,
+  104, 30, 6, 0, 0, 0, 0, 40, 41, 45,
+  0, 53, 0, 0, 0, 0, 87, 64, 0, 0,
+  0, 27, 0, 41, 0, 0, 16, 28, 30, 44,
+  24, 53, 0, 28, 0, 0, 87, 10, 0, 0,
+  0, 14, 0, 58, 10, 0, 0, 24, 0, 0,
+  75, 0, 41, 0, 0, 0, 0, 48, 17, 40,
+  0, 0, 0, 12, 73, 0, 9, 26, 0, 32,
+  2, 2, 0, 43, 49, 36, 0, 65, 0, 26,
+  0, 0, 0, 86, 27, 0, 0, 0, 9, 0,
+  28, 10, 24, 30, 0, 17, 0, 27, 0, 0,
+  0, 0, 2, 0, 8, 0, 164, 0, 52, 9,
+  40, 0, 0, 111, 49, 4, 4, 0, 0, 13,
+  78, 36, 24, 0, 20, 0, 0, 97, 83, 24,
+  24, 5, 0, 0, 48, 50, 0, 0, 1, 78,
+  1, 0, 0, 0, 68, 0, 12, 0, 0, 28,
+  0, 3, 0, 0, 11, 19, 11, 36, 0, 0,
+  0, 29, 0, 18, 44, 0, 0, 0, 1, 0,
+  0, 8, 0, 0, 0, 0, 0, 0, 29, 0,
+  0, 0, 0, 0, 32, 72, 9, 90, 0, 112,
+  2, 20, 35, 0, 0, 53, 0, 31, 6, 61,
+  21, 24, 117, 0, 0, 0, 26, 0, 0, 0,
+  0, 100, 90, 0, 0, 0, 7, 0, 54, 21,
+  0, 21, 0, 0, 0, 15, 0, 0, 0, 0,
+  0, 21, 0, 0, 73, 0, 76, 10, 35, 0,
+  0, 22, 0, 0, 13, 12, 20, 0, 30, 0,
+  12, 20, 47, 4, 0, 16, 61, 0, 3, 0,
+  0, 56, 0, 10, 36, 0, 0, 41, 0, 0,
+  2, 0, 51, 24, 0, 0, 0, 75, 57, 0,
+  0, 1, 0, 46, 0, 115, 40, 68, 0, 0,
+  0, 16, 0, 0, 30, 32, 30, 0, 49, 0,
+  37, 54, 0, 31, 7, 0, 25, 63, 98, 0,
+  89, 0, 26, 32, 28, 22, 29, 0, 0, 0,
+  0, 0, 23, 34, 22, 43, 0, 13, 0, 0,
+  0, 67, 0, 29, 0, 0, 0, 0, 28, 122,
+  64, 34, 0, 28, 14, 55, 5, 5, 0, 0,
+  0, 59, 0, 9, 0, 5, 0, 38, 80, 0,
+  0, 0, 7, 0, 12, 0, 22, 22, 0, 49,
+  0, 0, 0, 0, 12, 0, 80, 43, 25, 0,
+  73, 2, 0, 149, 100, 43, 17, 0, 0, 0,
+  0, 25, 0, 0, 21, 90, 9, 0, 9, 0,
+  115, 13, 0, 0, 4, 73, 0, 0, 23, 0,
+  0, 26, 0, 80, 0, 54, 0, 37, 0, 15,
+  61, 0, 0, 23, 13, 7, 0, 32, 0, 0,
+  0, 0, 0, 0, 27, 12, 61, 0, 7, 0,
+  0, 98, 0, 66, 0, 13, 0, 0, 19, 3,
+  24, 48, 0, 47, 3, 23, 13, 19, 53, 124,
+  0, 32, 23, 0, 0, 0, 0, 90, 142, 0,
+  0, 0, 8, 0, 0, 33, 0, 34, 0, 47,
+  0, 22, 0, 0, 0, 0, 6, 0, 0, 0,
+  122, 0, 29, 0, 52, 16, 0, 27, 108, 0,
+  0, 0, 0, 0, 90, 42, 15, 0, 26, 53,
+  0, 84, 60, 35, 50, 0, 0, 15, 20, 31,
+  0, 0, 3, 111, 0, 0, 0, 0, 61, 0,
+  0, 0, 0, 79, 0, 0, 3, 0, 0, 0,
+  0, 28, 0, 0, 0, 35, 0, 82, 11, 0,
+  69, 0, 27, 18, 0, 0, 0, 0, 0, 0,
+  27, 0, 48, 0, 11, 70, 0, 0, 22, 90,
+  0, 69, 0, 68, 0, 0, 7, 0, 32, 92,
+  0, 47, 0, 58, 48, 0, 85, 34, 0, 0,
+  11, 0, 0, 0, 0, 133, 125, 0, 0, 0,
+  8, 0, 0, 61, 0, 16, 7, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 45, 0,
+  54, 0, 21, 46, 0, 10, 0, 0, 0, 0,
+  0, 1, 32, 2, 16, 56, 0, 30, 0, 9,
+  3, 0, 2, 0, 1, 27, 71, 20, 5, 0,
+  0, 23, 0, 18, 0, 0, 30, 0, 15, 0,
+  59, 84, 34, 0, 85, 0, 0, 5, 0, 98,
+  39, 10, 0, 0, 0, 0, 0, 0, 57, 0,
+  55, 0, 96, 0, 0, 81, 9, 12, 28, 9,
+  50, 46, 29, 21, 0, 0, 85, 58, 7, 94,
+  37, 18, 0, 0, 0, 22, 0, 74, 0, 50,
+  11, 36, 0, 0, 0, 84, 19, 16, 0, 0,
+  0, 0, 17, 49, 89, 0, 0, 0, 0, 27,
+  5, 0, 0, 3, 0, 9, 0, 9, 21, 75,
+  0, 33, 64, 0, 0, 0, 0, 0, 0, 0,
+  0, 41, 4, 18, 11, 6, 0, 0, 0, 0,
+  60, 44, 0, 0, 0, 54, 0, 0, 0, 29,
+  17, 0, 3, 11, 34, 17, 0, 0, 58, 48,
+  0, 0, 0, 0, 53, 0, 0, 0, 74, 109,
+  0, 0, 46, 0, 0, 0, 0, 59, 0, 51,
+  0, 23, 0, 0, 0, 0, 78, 7, 34, 8,
+  0, 0, 0, 52, 29, 14, 74, 2, 53, 17,
+  8, 144, 9, 0, 46, 89, 0, 57, 27, 0,
+  12, 0, 0, 0, 31, 87, 0, 30, 0, 43,
+  20, 0, 0, 171, 0, 0, 22, 0, 7, 0,
+  0, 57, 123, 33, 0, 0, 0, 0, 0, 2,
+  0, 0, 0, 24, 0, 10, 20, 24, 0, 0,
+  14, 0, 0, 0, 0, 0, 0, 4, 58, 62,
+  28, 0, 51, 0, 0, 127, 0, 0, 28, 13,
+  0, 0, 0, 82, 0, 0, 9, 29, 31, 0,
+  0, 85, 28, 32, 0, 0, 13, 55, 0, 0,
+  0, 43, 0, 0, 0, 17, 44, 93, 0, 0,
+  24, 0, 15, 0, 0, 32, 0, 29, 0, 35,
+  0, 77, 0, 0, 138, 0, 12, 0, 0, 0,
+  0, 64, 0, 0, 81, 0, 9, 6, 12, 125,
+  8, 0, 33, 55, 0, 39, 22, 0, 0, 0,
+  0, 0, 28, 82, 0, 10, 0, 46, 0, 0,
+  0, 123, 0, 0, 55, 0, 11, 0, 0, 88,
+  63, 49, 0, 0, 27, 0, 0, 10, 0, 6,
+  1, 11, 0, 0, 9, 35, 24, 0, 11, 0,
+  0, 0, 0, 0, 0, 3, 9, 79, 0, 98,
+  0, 20, 14, 0, 60, 12, 44, 16, 32, 0,
+  54, 0, 44, 107, 104, 30, 6, 0, 0, 0,
+  0, 40, 41, 45, 0, 53, 0, 0, 0, 0,
+  87, 64, 0, 0, 0, 27, 0, 41, 0, 0,
+  16, 28, 30, 44, 24, 53, 0, 28, 0, 0,
+  87, 10, 0, 0, 0, 14, 0, 58, 10, 0,
+  0, 24, 0, 0, 75, 0, 41, 0, 0, 0,
+  0, 48, 17, 40, 0, 0, 0, 12, 73, 0,
+  9, 26, 0, 32, 2, 2, 0, 43, 49, 36,
+  0, 65, 0, 26, 0, 0, 0, 86, 27, 0,
+  0, 0, 9, 0, 28, 10, 24, 30, 0, 17,
+  0, 27, 0, 0, 0, 0, 2, 0, 8, 0,
+  164, 0, 52, 9, 40, 0, 0, 111, 49, 4,
+  4, 0, 0, 13, 78, 36, 24, 0, 20, 0,
+  0, 97, 83, 24, 24, 5, 0, 0, 48, 50,
+  0, 0, 1, 78, 1, 0, 0, 0, 68, 0,
+  12, 0, 0, 28, 0, 3, 0, 0, 11, 19,
+  11, 36, 0, 0, 0, 29, 0, 18, 44, 0,
+  0, 0, 1, 0, 0, 8, 0, 0, 0, 0,
+  0, 0, 29, 0, 0, 0, 0, 0, 32, 72,
+  9, 90, 0, 112, 2, 20, 35, 0, 0, 53,
+  0, 31, 6, 61, 21, 24, 117, 0, 0, 0,
+  26, 0, 0, 0, 0, 100, 90, 0, 0, 0,
+  7, 0, 54, 21, 0, 21, 0, 0, 0, 15,
+  0, 0, 0, 0, 0, 21, 0, 0, 73, 0,
+  76, 10, 35, 0, 59, 1, 72, 42, 0, 0,
+  0, 22, 38, 13, 13, 6, 0, 7, 0, 21,
+  38, 13, 14, 0, 0, 64, 43, 11, 0, 0,
+  1, 54, 0, 38, 0, 39, 17, 0, 12, 19,
+  36, 29, 3, 0, 0, 0, 0, 0, 0, 11,
+  0, 0, 0, 0, 0, 70, 0, 0, 91, 0,
+  38, 0, 8, 0, 0, 4, 0, 0, 64, 10,
+  0, 0, 0, 114, 20, 0, 74, 27, 0, 45,
+  12, 51, 27, 0, 0, 0, 15, 101, 0, 21,
+  22, 36, 22, 0, 57, 0, 0, 0, 62, 0,
+  29, 0, 0, 72, 95, 0, 0, 0, 0, 80,
+  0, 16, 0, 0, 0, 13, 0, 0, 0, 0,
+  0, 0, 0, 33, 0, 3, 0, 0, 0, 0,
+  4, 22, 0, 49, 0, 0, 0, 0, 12, 0,
+  80, 43, 25, 0, 73, 2, 0, 149, 100, 43,
+  17, 0, 0, 0, 0, 25, 0, 0, 21, 90,
+  9, 0, 9, 0, 115, 13, 0, 0, 4, 73,
+  0, 0, 23, 0, 0, 26, 0, 80, 0, 54,
+  0, 37, 0, 15, 61, 0, 0, 23, 13, 7,
+  0, 32, 0, 0, 0, 0, 0, 0, 27, 12,
+  61, 0, 7, 0, 0, 98, 0, 66, 0, 13,
+  0, 0, 19, 3, 24, 48, 0, 47, 3, 23,
+  13, 19, 53, 124, 0, 32, 23, 0, 0, 0,
+  0, 90, 142, 0, 0, 0, 8, 0, 0, 33,
+  0, 34, 0, 47, 0, 22, 0, 0, 0, 0,
+  6, 0, 0, 0, 122, 0, 29, 0, 52, 16,
+  0, 27, 108, 0, 0, 0, 0, 0, 90, 42,
+  15, 0, 26, 53, 0, 84, 60, 35, 50, 0,
+  0, 15, 20, 31, 0, 0, 3, 111, 0, 0,
+  0, 0, 61, 0, 0, 0, 0, 79, 0, 0,
+  3, 0, 0, 0, 0, 28, 0, 0, 0, 35,
+  0, 82, 11, 0, 69, 0, 27, 18, 0, 0,
+  0, 0, 0, 0, 27, 0, 48, 0, 11, 70,
+  0, 0, 22, 90, 0, 69, 0, 68, 0, 0,
+  7, 0, 32, 92, 0, 47, 0, 58, 48, 0,
+  85, 34, 0, 0, 11, 0, 0, 0, 0, 133,
+  125, 0, 0, 0, 8, 0, 0, 61, 0, 16,
+  7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 45, 0, 54, 0, 21, 46, 0, 0,
+  117, 0, 0, 75, 0, 0, 21, 0, 0, 1,
+  34, 80, 0, 0, 0, 31, 19, 0, 0, 94,
+  14, 24, 0, 0, 0, 29, 0, 0, 10, 39,
+  0, 0, 0, 0, 0, 56, 0, 0, 0, 0,
+  0, 7, 0, 0, 0, 0, 0, 0, 0, 155,
+  0, 0, 71, 0, 21, 0, 50, 0, 0, 5,
+  0, 0, 108, 0, 0, 0, 0, 98, 0, 0,
+  39, 7, 0, 0, 0, 22, 15, 0, 0, 0,
+  31, 74, 16, 3, 15, 30, 48, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 72, 30, 0,
+  0, 0, 0, 78, 0, 23, 0, 11, 40, 0,
+  0, 0, 17, 16, 68, 25, 10, 51, 0, 3,
+  0, 0, 33, 0, 0, 53, 4, 18, 11, 6,
+  0, 0, 0, 0, 60, 44, 0, 0, 0, 54,
+  0, 0, 0, 29, 17, 0, 3, 11, 34, 17,
+  0, 0, 58, 48, 0, 0, 0, 0, 53, 0,
+  0, 0, 74, 109, 0, 0, 46, 0, 0, 0,
+  0, 59, 0, 51, 0, 23, 0, 0, 0, 0,
+  78, 7, 34, 8, 0, 0, 0, 52, 29, 14,
+  74, 2, 53, 17, 8, 144, 9, 0, 46, 89,
+  0, 57, 27, 0, 12, 0, 0, 0, 31, 87,
+  0, 30, 0, 43, 20, 0, 0, 171, 0, 0,
+  22, 0, 7, 0, 0, 57, 123, 33, 0, 0,
+  0, 0, 0, 2, 0, 0, 0, 24, 0, 10,
+  20, 24, 0, 0, 14, 0, 0, 0, 0, 0,
+  0, 4, 58, 62, 28, 0, 51, 0, 0, 127,
+  0, 0, 28, 13, 0, 0, 0, 82, 0, 0,
+  9, 29, 31, 0, 0, 85, 28, 32, 0, 0,
+  13, 55, 0, 0, 0, 43, 0, 0, 0, 17,
+  44, 93, 0, 0, 24, 0, 15, 0, 0, 32,
+  0, 29, 0, 35, 0, 77, 0, 0, 138, 0,
+  12, 0, 0, 0, 0, 64, 0, 0, 81, 0,
+  9, 6, 12, 125, 8, 0, 33, 55, 0, 39,
+  22, 0, 0, 0, 0, 0, 28, 82, 0, 10,
+  0, 46, 0, 0, 0, 123, 0, 0, 55, 0,
+  11, 0, 0, 88, 63, 49, 0, 0, 27, 0,
+  0, 10, 0, 6, 1, 11, 0, 0, 9, 35,
+  24, 0, 11, 0, 0, 0, 0, 0, 0, 3,
+  9, 79, 0, 0, 30, 0, 26, 161, 0, 0,
+  0, 0, 0, 0, 49, 60, 0, 0, 11, 55,
+  0, 0, 7, 16, 0, 50, 0, 0, 0, 0,
+  0, 35, 21, 0, 0, 13, 0, 0, 0, 55,
+  0, 3, 0, 20, 0, 22, 0, 12, 34, 22,
+  0, 0, 13, 103, 4, 0, 17, 0, 10, 0,
+  46, 0, 0, 0, 0, 0, 54, 0, 0, 2,
+  0, 4, 0, 34, 24, 5, 0, 40, 0, 0,
+  0, 10, 0, 0, 18, 36, 19, 0, 31, 36,
+  38, 0, 0, 22, 13, 0, 4, 0, 0, 0,
+  1, 46, 1, 0, 0, 0, 0, 10, 0, 22,
+  0, 25, 23, 0, 0, 0, 5, 29, 102, 47,
+  32, 3, 54, 0, 0, 0, 37, 15, 0, 14,
+  0, 111, 49, 4, 4, 0, 0, 13, 78, 36,
+  24, 0, 20, 0, 0, 97, 83, 24, 24, 5,
+  0, 0, 48, 50, 0, 0, 1, 78, 1, 0,
+  0, 0, 68, 0, 12, 0, 0, 28, 0, 3,
+  0, 0, 11, 19, 11, 36, 0, 0, 0, 29,
+  0, 18, 44, 0, 0, 0, 1, 0, 0, 8,
+  0, 0, 0, 0, 0, 0, 29, 0, 0, 0,
+  0, 0, 32, 72, 9, 90, 0, 112, 2, 20,
+  35, 0, 0, 53, 0, 31, 6, 61, 21, 24,
+  117, 0, 0, 0, 26, 0, 0, 0, 0, 100,
+  90, 0, 0, 0, 7, 0, 54, 21, 0, 21,
+  0, 0, 0, 15, 0, 0, 0, 0, 0, 21,
+  0, 0, 73, 0, 76, 10, 35, 0, 59, 1,
+  72, 42, 0, 0, 0, 22, 38, 13, 13, 6,
+  0, 7, 0, 21, 38, 13, 14, 0, 0, 64,
+  43, 11, 0, 0, 1, 54, 0, 38, 0, 39,
+  17, 0, 12, 19, 36, 29, 3, 0, 0, 0,
+  0, 0, 0, 11, 0, 0, 0, 0, 0, 70,
+  0, 0, 91, 0, 38, 0, 8, 0, 0, 4,
+  0, 0, 64, 10, 0, 0, 0, 114, 20, 0,
+  74, 27, 0, 45, 12, 51, 27, 0, 0, 0,
+  15, 101, 0, 21, 22, 36, 22, 0, 57, 0,
+  0, 0, 62, 0, 29, 0, 0, 72, 95, 0,
+  0, 0, 0, 80, 0, 16, 0, 0, 0, 13,
+  0, 0, 0, 0, 0, 0, 0, 33, 0, 3,
+  0, 0, 0, 0, 4, 22, 21, 0, 99, 34,
+  0, 157, 0, 0, 0, 0, 0, 17, 14, 49,
+  0, 0, 14, 40, 0, 1, 5, 82, 30, 0,
+  0, 0, 0, 0, 0, 147, 4, 78, 0, 24,
+  0, 23, 87, 19, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 3, 42, 0, 0, 78, 0, 0,
+  59, 0, 56, 0, 27, 0, 0, 28, 13, 0,
+  118, 0, 0, 48, 0, 113, 0, 36, 68, 0,
+  0, 7, 28, 0, 17, 0, 0, 0, 10, 108,
+  35, 0, 27, 10, 7, 0, 0, 0, 13, 0,
+  52, 0, 0, 0, 0, 5, 41, 0, 0, 0,
+  0, 82, 0, 16, 0, 8, 18, 0, 0, 0,
+  39, 10, 84, 0, 0, 54, 5, 43, 0, 6,
+  0, 3, 0, 26, 0, 27, 108, 0, 0, 0,
+  0, 0, 90, 42, 15, 0, 26, 53, 0, 84,
+  60, 35, 50, 0, 0, 15, 20, 31, 0, 0,
+  3, 111, 0, 0, 0, 0, 61, 0, 0, 0,
+  0, 79, 0, 0, 3, 0, 0, 0, 0, 28,
+  0, 0, 0, 35, 0, 82, 11, 0, 69, 0,
+  27, 18, 0, 0, 0, 0, 0, 0, 27, 0,
+  48, 0, 11, 70, 0, 0, 22, 90, 0, 69,
+  0, 68, 0, 0, 7, 0, 32, 92, 0, 47,
+  0, 58, 48, 0, 85, 34, 0, 0, 11, 0,
+  0, 0, 0, 133, 125, 0, 0, 0, 8, 0,
+  0, 61, 0, 16, 7, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 45, 0, 54, 0,
+  21, 46, 0, 0, 117, 0, 0, 75, 0, 0,
+  21, 0, 0, 1, 34, 80, 0, 0, 0, 31,
+  19, 0, 0, 94, 14, 24, 0, 0, 0, 29,
+  0, 0, 10, 39, 0, 0, 0, 0, 0, 56,
+  0, 0, 0, 0, 0, 7, 0, 0, 0, 0,
+  0, 0, 0, 155, 0, 0, 71, 0, 21, 0,
+  50, 0, 0, 5, 0, 0, 108, 0, 0, 0,
+  0, 98, 0, 0, 39, 7, 0, 0, 0, 22,
+  15, 0, 0, 0, 31, 74, 16, 3, 15, 30,
+  48, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 72, 30, 0, 0, 0, 0, 78, 0, 23,
+  0, 11, 40, 0, 0, 0, 17, 16, 68, 25,
+  10, 51, 0, 3, 0, 0, 33, 0, 0, 53,
+  0, 0, 59, 0, 5, 69, 0, 0, 0, 0,
+  0, 19, 45, 76, 0, 0, 0, 17, 2, 8,
+  10, 22, 0, 35, 0, 0, 0, 0, 0, 77,
+  41, 11, 0, 18, 0, 0, 0, 17, 0, 13,
+  0, 0, 0, 39, 0, 0, 0, 0, 0, 0,
+  0, 110, 0, 0, 0, 0, 15, 4, 28, 0,
+  0, 0, 0, 0, 48, 0, 0, 6, 0, 9,
+  0, 40, 17, 0, 0, 0, 0, 0, 53, 0,
+  0, 17, 0, 52, 45, 0, 40, 9, 68, 0,
+  0, 0, 56, 0, 0, 5, 0, 0, 0, 21,
+  0, 0, 0, 0, 1, 53, 0, 16, 7, 45,
+  50, 0, 0, 13, 38, 10, 68, 48, 19, 52,
+  56, 0, 0, 0, 26, 9, 0, 10, 28, 0,
+  51, 0, 0, 127, 0, 0, 28, 13, 0, 0,
+  0, 82, 0, 0, 9, 29, 31, 0, 0, 85,
+  28, 32, 0, 0, 13, 55, 0, 0, 0, 43,
+  0, 0, 0, 17, 44, 93, 0, 0, 24, 0,
+  15, 0, 0, 32, 0, 29, 0, 35, 0, 77,
+  0, 0, 138, 0, 12, 0, 0, 0, 0, 64,
+  0, 0, 81, 0, 9, 6, 12, 125, 8, 0,
+  33, 55, 0, 39, 22, 0, 0, 0, 0, 0,
+  28, 82, 0, 10, 0, 46, 0, 0, 0, 123,
+  0, 0, 55, 0, 11, 0, 0, 88, 63, 49,
+  0, 0, 27, 0, 0, 10, 0, 6, 1, 11,
+  0, 0, 9, 35, 24, 0, 11, 0, 0, 0,
+  0, 0, 0, 3, 9, 79, 0, 0, 30, 0,
+  26, 161, 0, 0, 0, 0, 0, 0, 49, 60,
+  0, 0, 11, 55, 0, 0, 7, 16, 0, 50,
+  0, 0, 0, 0, 0, 35, 21, 0, 0, 13,
+  0, 0, 0, 55, 0, 3, 0, 20, 0, 22,
+  0, 12, 34, 22, 0, 0, 13, 103, 4, 0,
+  17, 0, 10, 0, 46, 0, 0, 0, 0, 0,
+  54, 0, 0, 2, 0, 4, 0, 34, 24, 5,
+  0, 40, 0, 0, 0, 10, 0, 0, 18, 36,
+  19, 0, 31, 36, 38, 0, 0, 22, 13, 0,
+  4, 0, 0, 0, 1, 46, 1, 0, 0, 0,
+  0, 10, 0, 22, 0, 25, 23, 0, 0, 0,
+  5, 29, 102, 47, 32, 3, 54, 0, 0, 0,
+  37, 15, 0, 14, 0, 49, 11, 0, 44, 0,
+  25, 0, 19, 0, 0, 0, 81, 51, 5, 17,
+  15, 0, 0, 0, 3, 0, 0, 60, 21, 63,
+  0, 0, 0, 12, 63, 0, 0, 27, 12, 0,
+  0, 6, 0, 70, 0, 97, 10, 75, 53, 0,
+  0, 0, 0, 6, 0, 65, 94, 0, 0, 3,
+  21, 23, 4, 21, 0, 0, 0, 70, 0, 12,
+  8, 0, 0, 0, 0, 33, 0, 19, 20, 29,
+  0, 0, 0, 27, 44, 20, 19, 0, 78, 0,
+  29, 0, 66, 38, 0, 0, 42, 37, 0, 32,
+  0, 38, 3, 45, 0, 0, 0, 0, 0, 0,
+  3, 5, 71, 72, 88, 0, 0, 7, 31, 0,
+  0, 31, 64, 18, 57, 10, 85, 0, 91, 2,
+  0, 0, 59, 1, 72, 42, 0, 0, 0, 22,
+  38, 13, 13, 6, 0, 7, 0, 21, 38, 13,
+  14, 0, 0, 64, 43, 11, 0, 0, 1, 54,
+  0, 38, 0, 39, 17, 0, 12, 19, 36, 29,
+  3, 0, 0, 0, 0, 0, 0, 11, 0, 0,
+  0, 0, 0, 70, 0, 0, 91, 0, 38, 0,
+  8, 0, 0, 4, 0, 0, 64, 10, 0, 0,
+  0, 114, 20, 0, 74, 27, 0, 45, 12, 51,
+  27, 0, 0, 0, 15, 101, 0, 21, 22, 36,
+  22, 0, 57, 0, 0, 0, 62, 0, 29, 0,
+  0, 72, 95, 0, 0, 0, 0, 80, 0, 16,
+  0, 0, 0, 13, 0, 0, 0, 0, 0, 0,
+  0, 33, 0, 3, 0, 0, 0, 0, 4, 22,
+  21, 0, 99, 34, 0, 157, 0, 0, 0, 0,
+  0, 17, 14, 49, 0, 0, 14, 40, 0, 1,
+  5, 82, 30, 0, 0, 0, 0, 0, 0, 147,
+  4, 78, 0, 24, 0, 23, 87, 19, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 3, 42, 0,
+  0, 78, 0, 0, 59, 0, 56, 0, 27, 0,
+  0, 28, 13, 0, 118, 0, 0, 48, 0, 113,
+  0, 36, 68, 0, 0, 7, 28, 0, 17, 0,
+  0, 0, 10, 108, 35, 0, 27, 10, 7, 0,
+  0, 0, 13, 0, 52, 0, 0, 0, 0, 5,
+  41, 0, 0, 0, 0, 82, 0, 16, 0, 8,
+  18, 0, 0, 0, 39, 10, 84, 0, 0, 54,
+  5, 43, 0, 6, 0, 3, 0, 26, 0, 9,
+  38, 0, 15, 120, 0, 0, 0, 0, 0, 3,
+  58, 72, 0, 0, 0, 18, 0, 18, 44, 0,
+  0, 51, 0, 3, 0, 0, 0, 91, 41, 0,
+  0, 22, 0, 0, 0, 22, 0, 25, 0, 45,
+  0, 53, 1, 0, 0, 32, 0, 0, 0, 70,
+  11, 0, 0, 0, 19, 0, 13, 14, 0, 9,
+  0, 0, 0, 0, 0, 11, 0, 0, 0, 58,
+  10, 0, 0, 20, 0, 0, 2, 19, 0, 27,
+  10, 28, 51, 0, 32, 5, 54, 4, 0, 0,
+  52, 5, 0, 37, 0, 0, 0, 30, 0, 0,
+  0, 0, 3, 4, 0, 16, 10, 25, 57, 0,
+  0, 17, 37, 0, 63, 43, 24, 47, 55, 1,
+  2, 0, 25, 2, 0, 0, 0, 0, 117, 0,
+  0, 75, 0, 0, 21, 0, 0, 1, 34, 80,
+  0, 0, 0, 31, 19, 0, 0, 94, 14, 24,
+  0, 0, 0, 29, 0, 0, 10, 39, 0, 0,
+  0, 0, 0, 56, 0, 0, 0, 0, 0, 7,
+  0, 0, 0, 0, 0, 0, 0, 155, 0, 0,
+  71, 0, 21, 0, 50, 0, 0, 5, 0, 0,
+  108, 0, 0, 0, 0, 98, 0, 0, 39, 7,
+  0, 0, 0, 22, 15, 0, 0, 0, 31, 74,
+  16, 3, 15, 30, 48, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 72, 30, 0, 0, 0,
+  0, 78, 0, 23, 0, 11, 40, 0, 0, 0,
+  17, 16, 68, 25, 10, 51, 0, 3, 0, 0,
+  33, 0, 0, 53, 0, 0, 59, 0, 5, 69,
+  0, 0, 0, 0, 0, 19, 45, 76, 0, 0,
+  0, 17, 2, 8, 10, 22, 0, 35, 0, 0,
+  0, 0, 0, 77, 41, 11, 0, 18, 0, 0,
+  0, 17, 0, 13, 0, 0, 0, 39, 0, 0,
+  0, 0, 0, 0, 0, 110, 0, 0, 0, 0,
+  15, 4, 28, 0, 0, 0, 0, 0, 48, 0,
+  0, 6, 0, 9, 0, 40, 17, 0, 0, 0,
+  0, 0, 53, 0, 0, 17, 0, 52, 45, 0,
+  40, 9, 68, 0, 0, 0, 56, 0, 0, 5,
+  0, 0, 0, 21, 0, 0, 0, 0, 1, 53,
+  0, 16, 7, 45, 50, 0, 0, 13, 38, 10,
+  68, 48, 19, 52, 56, 0, 0, 0, 26, 9,
+  0, 10, 0, 52, 52, 0, 44, 0, 21, 0,
+  7, 0, 0, 3, 68, 73, 3, 33, 10, 1,
+  18, 0, 44, 0, 0, 50, 14, 42, 0, 0,
+  0, 12, 60, 0, 0, 39, 0, 0, 0, 7,
+  0, 62, 39, 63, 0, 87, 51, 0, 0, 0,
+  0, 0, 0, 78, 42, 0, 0, 0, 18, 20,
+  19, 14, 11, 0, 3, 81, 0, 28, 0, 0,
+  0, 0, 0, 30, 0, 13, 8, 1, 0, 0,
+  0, 18, 37, 38, 21, 0, 88, 0, 16, 0,
+  65, 54, 0, 0, 46, 25, 0, 61, 0, 19,
+  5, 30, 0, 0, 0, 0, 0, 0, 0, 15,
+  38, 43, 88, 0, 0, 20, 22, 0, 0, 24,
+  58, 18, 39, 4, 45, 0, 79, 0, 1, 0,
+  0, 0, 30, 0, 26, 161, 0, 0, 0, 0,
+  0, 0, 49, 60, 0, 0, 11, 55, 0, 0,
+  7, 16, 0, 50, 0, 0, 0, 0, 0, 35,
+  21, 0, 0, 13, 0, 0, 0, 55, 0, 3,
+  0, 20, 0, 22, 0, 12, 34, 22, 0, 0,
+  13, 103, 4, 0, 17, 0, 10, 0, 46, 0,
+  0, 0, 0, 0, 54, 0, 0, 2, 0, 4,
+  0, 34, 24, 5, 0, 40, 0, 0, 0, 10,
+  0, 0, 18, 36, 19, 0, 31, 36, 38, 0,
+  0, 22, 13, 0, 4, 0, 0, 0, 1, 46,
+  1, 0, 0, 0, 0, 10, 0, 22, 0, 25,
+  23, 0, 0, 0, 5, 29, 102, 47, 32, 3,
+  54, 0, 0, 0, 37, 15, 0, 14, 0, 49,
+  11, 0, 44, 0, 25, 0, 19, 0, 0, 0,
+  81, 51, 5, 17, 15, 0, 0, 0, 3, 0,
+  0, 60, 21, 63, 0, 0, 0, 12, 63, 0,
+  0, 27, 12, 0, 0, 6, 0, 70, 0, 97,
+  10, 75, 53, 0, 0, 0, 0, 6, 0, 65,
+  94, 0, 0, 3, 21, 23, 4, 21, 0, 0,
+  0, 70, 0, 12, 8, 0, 0, 0, 0, 33,
+  0, 19, 20, 29, 0, 0, 0, 27, 44, 20,
+  19, 0, 78, 0, 29, 0, 66, 38, 0, 0,
+  42, 37, 0, 32, 0, 38, 3, 45, 0, 0,
+  0, 0, 0, 0, 3, 5, 71, 72, 88, 0,
+  0, 7, 31, 0, 0, 31, 64, 18, 57, 10,
+  85, 0, 91, 2, 0, 0, 0, 21, 76, 0,
+  26, 0, 1, 0, 0, 0, 0, 6, 28, 78,
+  0, 20, 4, 29, 21, 10, 35, 34, 113, 11,
+  0, 0, 0, 0, 0, 0, 18, 0, 0, 0,
+  0, 0, 0, 1, 0, 10, 66, 3, 0, 101,
+  57, 6, 0, 0, 0, 0, 0, 90, 1, 0,
+  17, 0, 40, 0, 25, 0, 0, 10, 7, 19,
+  34, 0, 0, 18, 0, 29, 0, 0, 0, 43,
+  3, 0, 0, 28, 0, 0, 37, 0, 22, 0,
+  65, 9, 0, 0, 20, 0, 0, 16, 13, 0,
+  0, 46, 0, 0, 0, 39, 0, 0, 0, 0,
+  1, 0, 0, 4, 0, 7, 72, 14, 0, 12,
+  20, 0, 52, 13, 51, 13, 13, 0, 0, 0,
+  64, 0, 0, 0, 21, 0, 99, 34, 0, 157,
+  0, 0, 0, 0, 0, 17, 14, 49, 0, 0,
+  14, 40, 0, 1, 5, 82, 30, 0, 0, 0,
+  0, 0, 0, 147, 4, 78, 0, 24, 0, 23,
+  87, 19, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 3, 42, 0, 0, 78, 0, 0, 59, 0,
+  56, 0, 27, 0, 0, 28, 13, 0, 118, 0,
+  0, 48, 0, 113, 0, 36, 68, 0, 0, 7,
+  28, 0, 17, 0, 0, 0, 10, 108, 35, 0,
+  27, 10, 7, 0, 0, 0, 13, 0, 52, 0,
+  0, 0, 0, 5, 41, 0, 0, 0, 0, 82,
+  0, 16, 0, 8, 18, 0, 0, 0, 39, 10,
+  84, 0, 0, 54, 5, 43, 0, 6, 0, 3,
+  0, 26, 0, 9, 38, 0, 15, 120, 0, 0,
+  0, 0, 0, 3, 58, 72, 0, 0, 0, 18,
+  0, 18, 44, 0, 0, 51, 0, 3, 0, 0,
+  0, 91, 41, 0, 0, 22, 0, 0, 0, 22,
+  0, 25, 0, 45, 0, 53, 1, 0, 0, 32,
+  0, 0, 0, 70, 11, 0, 0, 0, 19, 0,
+  13, 14, 0, 9, 0, 0, 0, 0, 0, 11,
+  0, 0, 0, 58, 10, 0, 0, 20, 0, 0,
+  2, 19, 0, 27, 10, 28, 51, 0, 32, 5,
+  54, 4, 0, 0, 52, 5, 0, 37, 0, 0,
+  0, 30, 0, 0, 0, 0, 3, 4, 0, 16,
+  10, 25, 57, 0, 0, 17, 37, 0, 63, 43,
+  24, 47, 55, 1, 2, 0, 25, 2, 0, 0,
+  0, 70, 65, 0, 63, 0, 15, 0, 1, 0,
+  14, 0, 64, 75, 0, 51, 17, 7, 26, 16,
+  9, 0, 0, 47, 38, 59, 0, 0, 0, 0,
+  53, 0, 0, 37, 12, 0, 0, 0, 0, 53,
+  50, 43, 24, 71, 73, 0, 0, 0, 0, 0,
+  0, 26, 50, 0, 0, 0, 0, 20, 1, 27,
+  24, 0, 0, 63, 0, 2, 29, 0, 0, 0,
+  0, 0, 7, 41, 16, 12, 0, 17, 0, 23,
+  46, 34, 33, 22, 87, 14, 32, 4, 49, 40,
+  0, 20, 24, 31, 0, 54, 0, 35, 3, 41,
+  0, 0, 0, 0, 0, 0, 7, 10, 34, 32,
+  82, 0, 0, 13, 31, 0, 0, 29, 54, 8,
+  7, 0, 55, 0, 75, 11, 2, 0, 0, 0,
+  59, 0, 5, 69, 0, 0, 0, 0, 0, 19,
+  45, 76, 0, 0, 0, 17, 2, 8, 10, 22,
+  0, 35, 0, 0, 0, 0, 0, 77, 41, 11,
+  0, 18, 0, 0, 0, 17, 0, 13, 0, 0,
+  0, 39, 0, 0, 0, 0, 0, 0, 0, 110,
+  0, 0, 0, 0, 15, 4, 28, 0, 0, 0,
+  0, 0, 48, 0, 0, 6, 0, 9, 0, 40,
+  17, 0, 0, 0, 0, 0, 53, 0, 0, 17,
+  0, 52, 45, 0, 40, 9, 68, 0, 0, 0,
+  56, 0, 0, 5, 0, 0, 0, 21, 0, 0,
+  0, 0, 1, 53, 0, 16, 7, 45, 50, 0,
+  0, 13, 38, 10, 68, 48, 19, 52, 56, 0,
+  0, 0, 26, 9, 0, 10, 0, 52, 52, 0,
+  44, 0, 21, 0, 7, 0, 0, 3, 68, 73,
+  3, 33, 10, 1, 18, 0, 44, 0, 0, 50,
+  14, 42, 0, 0, 0, 12, 60, 0, 0, 39,
+  0, 0, 0, 7, 0, 62, 39, 63, 0, 87,
+  51, 0, 0, 0, 0, 0, 0, 78, 42, 0,
+  0, 0, 18, 20, 19, 14, 11, 0, 3, 81,
+  0, 28, 0, 0, 0, 0, 0, 30, 0, 13,
+  8, 1, 0, 0, 0, 18, 37, 38, 21, 0,
+  88, 0, 16, 0, 65, 54, 0, 0, 46, 25,
+  0, 61, 0, 19, 5, 30, 0, 0, 0, 0,
+  0, 0, 0, 15, 38, 43, 88, 0, 0, 20,
+  22, 0, 0, 24, 58, 18, 39, 4, 45, 0,
+  79, 0, 1, 0, 0, 16, 100, 0, 22, 0,
+  0, 0, 0, 0, 0, 11, 22, 94, 0, 49,
+  0, 51, 31, 35, 50, 27, 110, 9, 0, 0,
+  0, 0, 0, 0, 32, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 94, 0, 0, 96, 51, 18,
+  0, 0, 0, 0, 0, 79, 0, 0, 15, 0,
+  24, 0, 24, 0, 7, 8, 19, 6, 56, 0,
+  0, 10, 0, 51, 0, 0, 21, 34, 0, 0,
+  0, 16, 0, 0, 24, 0, 36, 0, 41, 12,
+  2, 0, 43, 21, 0, 36, 0, 0, 5, 39,
+  0, 0, 0, 27, 23, 0, 0, 0, 0, 0,
+  0, 11, 0, 6, 79, 9, 0, 5, 40, 0,
+  52, 15, 28, 31, 21, 0, 0, 0, 55, 12,
+  0, 0, 0, 49, 11, 0, 44, 0, 25, 0,
+  19, 0, 0, 0, 81, 51, 5, 17, 15, 0,
+  0, 0, 3, 0, 0, 60, 21, 63, 0, 0,
+  0, 12, 63, 0, 0, 27, 12, 0, 0, 6,
+  0, 70, 0, 97, 10, 75, 53, 0, 0, 0,
+  0, 6, 0, 65, 94, 0, 0, 3, 21, 23,
+  4, 21, 0, 0, 0, 70, 0, 12, 8, 0,
+  0, 0, 0, 33, 0, 19, 20, 29, 0, 0,
+  0, 27, 44, 20, 19, 0, 78, 0, 29, 0,
+  66, 38, 0, 0, 42, 37, 0, 32, 0, 38,
+  3, 45, 0, 0, 0, 0, 0, 0, 3, 5,
+  71, 72, 88, 0, 0, 7, 31, 0, 0, 31,
+  64, 18, 57, 10, 85, 0, 91, 2, 0, 0,
+  0, 21, 76, 0, 26, 0, 1, 0, 0, 0,
+  0, 6, 28, 78, 0, 20, 4, 29, 21, 10,
+  35, 34, 113, 11, 0, 0, 0, 0, 0, 0,
+  18, 0, 0, 0, 0, 0, 0, 1, 0, 10,
+  66, 3, 0, 101, 57, 6, 0, 0, 0, 0,
+  0, 90, 1, 0, 17, 0, 40, 0, 25, 0,
+  0, 10, 7, 19, 34, 0, 0, 18, 0, 29,
+  0, 0, 0, 43, 3, 0, 0, 28, 0, 0,
+  37, 0, 22, 0, 65, 9, 0, 0, 20, 0,
+  0, 16, 13, 0, 0, 46, 0, 0, 0, 39,
+  0, 0, 0, 0, 1, 0, 0, 4, 0, 7,
+  72, 14, 0, 12, 20, 0, 52, 13, 51, 13,
+  13, 0, 0, 0, 64, 0, 0, 0, 4, 0,
+  79, 3, 6, 0, 0, 0, 14, 0, 0, 8,
+  0, 94, 0, 3, 0, 47, 45, 17, 53, 54,
+  102, 0, 0, 0, 0, 16, 0, 0, 0, 0,
+  0, 0, 0, 14, 0, 0, 0, 0, 37, 0,
+  0, 85, 38, 32, 0, 6, 0, 0, 0, 126,
+  0, 0, 66, 0, 24, 0, 20, 0, 0, 0,
+  29, 0, 99, 0, 0, 10, 0, 92, 0, 0,
+  18, 0, 0, 0, 4, 0, 0, 0, 11, 0,
+  20, 0, 18, 0, 0, 0, 39, 0, 0, 7,
+  0, 0, 22, 29, 2, 0, 4, 32, 23, 0,
+  0, 0, 28, 0, 0, 3, 17, 0, 84, 3,
+  0, 15, 21, 0, 112, 0, 10, 16, 55, 0,
+  0, 0, 57, 15, 0, 0, 0, 9, 38, 0,
+  15, 120, 0, 0, 0, 0, 0, 3, 58, 72,
+  0, 0, 0, 18, 0, 18, 44, 0, 0, 51,
+  0, 3, 0, 0, 0, 91, 41, 0, 0, 22,
+  0, 0, 0, 22, 0, 25, 0, 45, 0, 53,
+  1, 0, 0, 32, 0, 0, 0, 70, 11, 0,
+  0, 0, 19, 0, 13, 14, 0, 9, 0, 0,
+  0, 0, 0, 11, 0, 0, 0, 58, 10, 0,
+  0, 20, 0, 0, 2, 19, 0, 27, 10, 28,
+  51, 0, 32, 5, 54, 4, 0, 0, 52, 5,
+  0, 37, 0, 0, 0, 30, 0, 0, 0, 0,
+  3, 4, 0, 16, 10, 25, 57, 0, 0, 17,
+  37, 0, 63, 43, 24, 47, 55, 1, 2, 0,
+  25, 2, 0, 0, 0, 70, 65, 0, 63, 0,
+  15, 0, 1, 0, 14, 0, 64, 75, 0, 51,
+  17, 7, 26, 16, 9, 0, 0, 47, 38, 59,
+  0, 0, 0, 0, 53, 0, 0, 37, 12, 0,
+  0, 0, 0, 53, 50, 43, 24, 71, 73, 0,
+  0, 0, 0, 0, 0, 26, 50, 0, 0, 0,
+  0, 20, 1, 27, 24, 0, 0, 63, 0, 2,
+  29, 0, 0, 0, 0, 0, 7, 41, 16, 12,
+  0, 17, 0, 23, 46, 34, 33, 22, 87, 14,
+  32, 4, 49, 40, 0, 20, 24, 31, 0, 54,
+  0, 35, 3, 41, 0, 0, 0, 0, 0, 0,
+  7, 10, 34, 32, 82, 0, 0, 13, 31, 0,
+  0, 29, 54, 8, 7, 0, 55, 0, 75, 11,
+  2, 0, 0, 0, 119, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 103, 0, 9, 0, 6,
+  10, 5, 9, 50, 108, 24, 0, 0, 0, 8,
+  184, 0, 22, 0, 0, 31, 0, 0, 11, 12,
+  0, 10, 106, 0, 19, 21, 57, 33, 0, 2,
+  16, 0, 0, 65, 0, 0, 30, 0, 14, 26,
+  31, 0, 30, 40, 20, 0, 16, 5, 36, 0,
+  0, 70, 0, 0, 38, 61, 0, 0, 13, 0,
+  0, 0, 25, 10, 0, 19, 7, 11, 0, 47,
+  49, 0, 0, 54, 39, 0, 33, 24, 0, 0,
+  0, 22, 19, 7, 17, 0, 40, 27, 0, 5,
+  0, 0, 50, 3, 0, 0, 37, 20, 52, 0,
+  0, 30, 0, 0, 0, 0, 2, 25, 2, 0,
+  0, 52, 52, 0, 44, 0, 21, 0, 7, 0,
+  0, 3, 68, 73, 3, 33, 10, 1, 18, 0,
+  44, 0, 0, 50, 14, 42, 0, 0, 0, 12,
+  60, 0, 0, 39, 0, 0, 0, 7, 0, 62,
+  39, 63, 0, 87, 51, 0, 0, 0, 0, 0,
+  0, 78, 42, 0, 0, 0, 18, 20, 19, 14,
+  11, 0, 3, 81, 0, 28, 0, 0, 0, 0,
+  0, 30, 0, 13, 8, 1, 0, 0, 0, 18,
+  37, 38, 21, 0, 88, 0, 16, 0, 65, 54,
+  0, 0, 46, 25, 0, 61, 0, 19, 5, 30,
+  0, 0, 0, 0, 0, 0, 0, 15, 38, 43,
+  88, 0, 0, 20, 22, 0, 0, 24, 58, 18,
+  39, 4, 45, 0, 79, 0, 1, 0, 0, 16,
+  100, 0, 22, 0, 0, 0, 0, 0, 0, 11,
+  22, 94, 0, 49, 0, 51, 31, 35, 50, 27,
+  110, 9, 0, 0, 0, 0, 0, 0, 32, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 94, 0,
+  0, 96, 51, 18, 0, 0, 0, 0, 0, 79,
+  0, 0, 15, 0, 24, 0, 24, 0, 7, 8,
+  19, 6, 56, 0, 0, 10, 0, 51, 0, 0,
+  21, 34, 0, 0, 0, 16, 0, 0, 24, 0,
+  36, 0, 41, 12, 2, 0, 43, 21, 0, 36,
+  0, 0, 5, 39, 0, 0, 0, 27, 23, 0,
+  0, 0, 0, 0, 0, 11, 0, 6, 79, 9,
+  0, 5, 40, 0, 52, 15, 28, 31, 21, 0,
+  0, 0, 55, 12, 0, 0, 20, 0, 91, 19,
+  0, 0, 0, 12, 20, 0, 0, 0, 0, 125,
+  0, 0, 0, 22, 28, 1, 36, 70, 81, 11,
+  0, 0, 7, 35, 205, 0, 23, 21, 0, 15,
+  0, 0, 0, 31, 0, 0, 65, 0, 0, 38,
+  53, 70, 0, 0, 0, 0, 0, 120, 0, 6,
+  74, 0, 21, 12, 39, 0, 24, 17, 49, 0,
+  50, 0, 10, 0, 0, 102, 0, 0, 27, 14,
+  0, 0, 25, 0, 0, 0, 12, 2, 2, 20,
+  0, 0, 0, 33, 96, 33, 0, 2, 0, 0,
+  53, 20, 39, 0, 2, 26, 35, 12, 15, 0,
+  81, 19, 3, 30, 19, 0, 74, 0, 14, 0,
+  19, 31, 105, 0, 0, 54, 0, 0, 0, 0,
+  40, 22, 0, 17, 0, 21, 76, 0, 26, 0,
+  1, 0, 0, 0, 0, 6, 28, 78, 0, 20,
+  4, 29, 21, 10, 35, 34, 113, 11, 0, 0,
+  0, 0, 0, 0, 18, 0, 0, 0, 0, 0,
+  0, 1, 0, 10, 66, 3, 0, 101, 57, 6,
+  0, 0, 0, 0, 0, 90, 1, 0, 17, 0,
+  40, 0, 25, 0, 0, 10, 7, 19, 34, 0,
+  0, 18, 0, 29, 0, 0, 0, 43, 3, 0,
+  0, 28, 0, 0, 37, 0, 22, 0, 65, 9,
+  0, 0, 20, 0, 0, 16, 13, 0, 0, 46,
+  0, 0, 0, 39, 0, 0, 0, 0, 1, 0,
+  0, 4, 0, 7, 72, 14, 0, 12, 20, 0,
+  52, 13, 51, 13, 13, 0, 0, 0, 64, 0,
+  0, 0, 4, 0, 79, 3, 6, 0, 0, 0,
+  14, 0, 0, 8, 0, 94, 0, 3, 0, 47,
+  45, 17, 53, 54, 102, 0, 0, 0, 0, 16,
+  0, 0, 0, 0, 0, 0, 0, 14, 0, 0,
+  0, 0, 37, 0, 0, 85, 38, 32, 0, 6,
+  0, 0, 0, 126, 0, 0, 66, 0, 24, 0,
+  20, 0, 0, 0, 29, 0, 99, 0, 0, 10,
+  0, 92, 0, 0, 18, 0, 0, 0, 4, 0,
+  0, 0, 11, 0, 20, 0, 18, 0, 0, 0,
+  39, 0, 0, 7, 0, 0, 22, 29, 2, 0,
+  4, 32, 23, 0, 0, 0, 28, 0, 0, 3,
+  17, 0, 84, 3, 0, 15, 21, 0, 112, 0,
+  10, 16, 55, 0, 0, 0, 57, 15, 0, 0,
+  2, 0, 42, 31, 0, 0, 14, 24, 59, 0,
+  4, 0, 0, 82, 0, 0, 0, 8, 26, 0,
+  35, 19, 23, 27, 0, 0, 38, 57, 187, 16,
+  19, 10, 32, 0, 0, 0, 0, 25, 0, 0,
+  0, 0, 0, 32, 38, 93, 0, 17, 0, 0,
+  3, 110, 0, 32, 59, 0, 9, 0, 14, 0,
+  0, 22, 8, 0, 4, 0, 20, 0, 0, 39,
+  0, 6, 29, 4, 0, 9, 34, 0, 0, 0,
+  24, 0, 1, 24, 0, 0, 0, 30, 103, 45,
+  40, 0, 0, 0, 18, 12, 59, 0, 26, 51,
+  26, 6, 18, 0, 84, 0, 42, 12, 87, 0,
+  79, 0, 10, 0, 1, 0, 115, 0, 0, 34,
+  41, 0, 5, 0, 59, 9, 0, 24, 0, 70,
+  65, 0, 63, 0, 15, 0, 1, 0, 14, 0,
+  64, 75, 0, 51, 17, 7, 26, 16, 9, 0,
+  0, 47, 38, 59, 0, 0, 0, 0, 53, 0,
+  0, 37, 12, 0, 0, 0, 0, 53, 50, 43,
+  24, 71, 73, 0, 0, 0, 0, 0, 0, 26,
+  50, 0, 0, 0, 0, 20, 1, 27, 24, 0,
+  0, 63, 0, 2, 29, 0, 0, 0, 0, 0,
+  7, 41, 16, 12, 0, 17, 0, 23, 46, 34,
+  33, 22, 87, 14, 32, 4, 49, 40, 0, 20,
+  24, 31, 0, 54, 0, 35, 3, 41, 0, 0,
+  0, 0, 0, 0, 7, 10, 34, 32, 82, 0,
+  0, 13, 31, 0, 0, 29, 54, 8, 7, 0,
+  55, 0, 75, 11, 2, 0, 0, 0, 119, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 103,
+  0, 9, 0, 6, 10, 5, 9, 50, 108, 24,
+  0, 0, 0, 8, 184, 0, 22, 0, 0, 31,
+  0, 0, 11, 12, 0, 10, 106, 0, 19, 21,
+  57, 33, 0, 2, 16, 0, 0, 65, 0, 0,
+  30, 0, 14, 26, 31, 0, 30, 40, 20, 0,
+  16, 5, 36, 0, 0, 70, 0, 0, 38, 61,
+  0, 0, 13, 0, 0, 0, 25, 10, 0, 19,
+  7, 11, 0, 47, 49, 0, 0, 54, 39, 0,
+  33, 24, 0, 0, 0, 22, 19, 7, 17, 0,
+  40, 27, 0, 5, 0, 0, 50, 3, 0, 0,
+  37, 20, 52, 0, 0, 30, 0, 0, 0, 0,
+  2, 25, 2, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 16, 100, 0, 22, 0, 0, 0,
+  0, 0, 0, 11, 22, 94, 0, 49, 0, 51,
+  31, 35, 50, 27, 110, 9, 0, 0, 0, 0,
+  0, 0, 32, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 94, 0, 0, 96, 51, 18, 0, 0,
+  0, 0, 0, 79, 0, 0, 15, 0, 24, 0,
+  24, 0, 7, 8, 19, 6, 56, 0, 0, 10,
+  0, 51, 0, 0, 21, 34, 0, 0, 0, 16,
+  0, 0, 24, 0, 36, 0, 41, 12, 2, 0,
+  43, 21, 0, 36, 0, 0, 5, 39, 0, 0,
+  0, 27, 23, 0, 0, 0, 0, 0, 0, 11,
+  0, 6, 79, 9, 0, 5, 40, 0, 52, 15,
+  28, 31, 21, 0, 0, 0, 55, 12, 0, 0,
+  20, 0, 91, 19, 0, 0, 0, 12, 20, 0,
+  0, 0, 0, 125, 0, 0, 0, 22, 28, 1,
+  36, 70, 81, 11, 0, 0, 7, 35, 205, 0,
+  23, 21, 0, 15, 0, 0, 0, 31, 0, 0,
+  65, 0, 0, 38, 53, 70, 0, 0, 0, 0,
+  0, 120, 0, 6, 74, 0, 21, 12, 39, 0,
+  24, 17, 49, 0, 50, 0, 10, 0, 0, 102,
+  0, 0, 27, 14, 0, 0, 25, 0, 0, 0,
+  12, 2, 2, 20, 0, 0, 0, 33, 96, 33,
+  0, 2, 0, 0, 53, 20, 39, 0, 2, 26,
+  35, 12, 15, 0, 81, 19, 3, 30, 19, 0,
+  74, 0, 14, 0, 19, 31, 105, 0, 0, 54,
+  0, 0, 0, 0, 40, 22, 0, 17, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 4, 0, 79, 3,
+  6, 0, 0, 0, 14, 0, 0, 8, 0, 94,
+  0, 3, 0, 47, 45, 17, 53, 54, 102, 0,
+  0, 0, 0, 16, 0, 0, 0, 0, 0, 0,
+  0, 14, 0, 0, 0, 0, 37, 0, 0, 85,
+  38, 32, 0, 6, 0, 0, 0, 126, 0, 0,
+  66, 0, 24, 0, 20, 0, 0, 0, 29, 0,
+  99, 0, 0, 10, 0, 92, 0, 0, 18, 0,
+  0, 0, 4, 0, 0, 0, 11, 0, 20, 0,
+  18, 0, 0, 0, 39, 0, 0, 7, 0, 0,
+  22, 29, 2, 0, 4, 32, 23, 0, 0, 0,
+  28, 0, 0, 3, 17, 0, 84, 3, 0, 15,
+  21, 0, 112, 0, 10, 16, 55, 0, 0, 0,
+  57, 15, 0, 0, 2, 0, 42, 31, 0, 0,
+  14, 24, 59, 0, 4, 0, 0, 82, 0, 0,
+  0, 8, 26, 0, 35, 19, 23, 27, 0, 0,
+  38, 57, 187, 16, 19, 10, 32, 0, 0, 0,
+  0, 25, 0, 0, 0, 0, 0, 32, 38, 93,
+  0, 17, 0, 0, 3, 110, 0, 32, 59, 0,
+  9, 0, 14, 0, 0, 22, 8, 0, 4, 0,
+  20, 0, 0, 39, 0, 6, 29, 4, 0, 9,
+  34, 0, 0, 0, 24, 0, 1, 24, 0, 0,
+  0, 30, 103, 45, 40, 0, 0, 0, 18, 12,
+  59, 0, 26, 51, 26, 6, 18, 0, 84, 0,
+  42, 12, 87, 0, 79, 0, 10, 0, 1, 0,
+  115, 0, 0, 34, 41, 0, 5, 0, 59, 9,
+  0, 24, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 13, 24,
+  67, 6, 0, 18, 27, 22, 0, 0, 0, 0,
+  0, 97, 0, 0, 60, 4, 0, 5, 27, 86,
+  27, 52, 0, 0, 8, 9, 193, 55, 1, 28,
+  52, 0, 59, 1, 0, 58, 0, 17, 14, 39,
+  0, 14, 26, 83, 17, 0, 2, 0, 0, 64,
+  30, 0, 71, 0, 60, 0, 49, 0, 15, 71,
+  0, 0, 0, 0, 7, 6, 77, 33, 0, 22,
+  82, 11, 31, 27, 25, 0, 20, 13, 0, 0,
+  15, 5, 0, 0, 0, 0, 62, 3, 0, 0,
+  23, 0, 15, 37, 0, 0, 49, 67, 15, 0,
+  0, 37, 46, 75, 26, 0, 0, 6, 1, 16,
+  0, 37, 12, 0, 55, 0, 9, 28, 40, 0,
+  0, 0, 4, 0, 26, 26, 0, 60, 0, 15,
+  0, 5, 36, 23, 2, 0, 0, 31, 86, 8,
+  0, 0, 59, 11, 0, 0, 65, 56, 0, 25,
+  23, 0, 0, 13, 0, 13, 0, 11, 92, 0,
+  18, 0, 0, 32, 0, 53, 0, 28, 0, 44,
+  48, 94, 4, 86, 0, 7, 0, 38, 52, 0,
+  35, 0, 21, 0, 24, 0, 13, 27, 0, 40,
+  0, 11, 10, 0, 33, 0, 8, 0, 25, 13,
+  37, 0, 0, 0, 0, 15, 39, 0, 14, 13,
+  0, 0, 0, 0, 0, 24, 0, 0, 0, 13,
+  0, 47, 0, 0, 62, 50, 3, 0, 0, 13,
+  20, 1, 44, 0, 24, 28, 0, 29, 0, 15,
+  0, 0, 25, 0, 11, 10, 47, 0, 42, 0,
+  79, 0, 14, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 30, 25, 0, 1, 3, 33, 18,
+  0, 0, 0, 0, 0, 38, 0, 18, 43, 15,
+  0, 40, 38, 17, 58, 51, 0, 9, 8, 5,
+  128, 38, 0, 0, 54, 0, 69, 16, 0, 30,
+  0, 38, 21, 38, 0, 22, 60, 37, 2, 0,
+  0, 0, 0, 13, 47, 0, 16, 0, 64, 0,
+  29, 0, 6, 33, 7, 0, 0, 0, 7, 19,
+  25, 0, 0, 36, 79, 26, 45, 46, 0, 7,
+  30, 1, 38, 2, 13, 0, 0, 0, 0, 0,
+  54, 6, 3, 0, 38, 1, 15, 56, 0, 0,
+  37, 35, 9, 0, 0, 19, 20, 19, 57, 1,
+  0, 26, 0, 8, 0, 33, 5, 0, 23, 13,
+  0, 22, 19, 0, 0, 0, 19, 0, 11, 9,
+  0, 48, 13, 14, 0, 0, 29, 34, 3, 0,
+  0, 37, 105, 0, 2, 11, 53, 15, 0, 14,
+  67, 51, 53, 17, 9, 0, 0, 9, 0, 0,
+  0, 0, 96, 0, 32, 9, 0, 24, 0, 75,
+  0, 32, 0, 38, 68, 64, 0, 61, 0, 41,
+  0, 28, 43, 1, 16, 0, 14, 0, 11, 0,
+  0, 0, 0, 18, 0, 0, 0, 0, 17, 0,
+  10, 2, 29, 20, 37, 0, 16, 39, 0, 22,
+  45, 0, 41, 0, 0, 0, 0, 0, 0, 7,
+  0, 0, 0, 7, 0, 48, 0, 0, 52, 46,
+  8, 0, 0, 12, 18, 0, 59, 0, 0, 16,
+  0, 17, 0, 17, 0, 0, 14, 0, 6, 8,
+  40, 0, 40, 0, 76, 0, 11, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 62, 32, 0,
+  2, 1, 44, 3, 0, 0, 16, 4, 12, 0,
+  5, 53, 33, 30, 0, 74, 61, 0, 71, 46,
+  0, 36, 0, 3, 111, 34, 1, 0, 57, 0,
+  53, 22, 0, 16, 0, 48, 40, 30, 5, 36,
+  99, 16, 0, 12, 0, 8, 1, 0, 56, 0,
+  0, 0, 43, 0, 7, 33, 9, 0, 16, 0,
+  0, 0, 18, 21, 0, 0, 8, 32, 42, 43,
+  43, 31, 0, 15, 0, 0, 70, 13, 10, 0,
+  12, 12, 0, 0, 50, 9, 2, 0, 16, 0,
+  5, 73, 0, 0, 8, 21, 2, 0, 0, 16,
+  17, 0, 77, 9, 0, 22, 29, 1, 0, 33,
+  0, 0, 0, 15, 0, 33, 26, 0, 0, 0,
+  28, 0, 14, 0, 5, 45, 49, 8, 0, 13,
+  12, 23, 0, 0, 0, 49, 90, 0, 0, 29,
+  44, 13, 0, 25, 68, 58, 82, 13, 0, 0,
+  0, 11, 0, 0, 0, 0, 81, 0, 34, 31,
+  0, 20, 0, 59, 2, 29, 0, 28, 67, 52,
+  0, 60, 0, 43, 0, 42, 24, 0, 22, 0,
+  17, 0, 7, 0, 0, 0, 0, 9, 8, 0,
+  0, 0, 16, 0, 14, 13, 19, 19, 30, 0,
+  40, 53, 0, 19, 43, 0, 42, 0, 0, 11,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 33,
+  18, 0, 37, 45, 21, 0, 0, 23, 29, 0,
+  60, 0, 0, 7, 11, 13, 0, 17, 0, 0,
+  0, 0, 1, 9, 37, 0, 7, 0, 52, 0,
+  8, 2, 13, 24, 67, 6, 0, 18, 27, 22,
+  0, 0, 0, 0, 0, 97, 0, 0, 60, 4,
+  0, 5, 27, 86, 27, 52, 0, 0, 8, 9,
+  193, 55, 1, 28, 52, 0, 59, 1, 0, 58,
+  0, 17, 14, 39, 0, 14, 26, 83, 17, 0,
+  2, 0, 0, 64, 30, 0, 71, 0, 60, 0,
+  49, 0, 15, 71, 0, 0, 0, 0, 7, 6,
+  77, 33, 0, 22, 82, 11, 31, 27, 25, 0,
+  20, 13, 0, 0, 15, 5, 0, 0, 0, 0,
+  62, 3, 0, 0, 23, 0, 15, 37, 0, 0,
+  49, 67, 15, 0, 0, 37, 46, 75, 26, 0,
+  0, 6, 1, 16, 0, 37, 12, 0, 55, 0,
+  9, 28, 40, 0, 0, 0, 4, 0, 26, 26,
+  0, 60, 0, 15, 0, 5, 36, 23, 2, 0,
+  0, 31, 86, 8, 0, 0, 59, 11, 0, 0,
+  65, 56, 0, 25, 23, 0, 0, 13, 0, 13,
+  0, 11, 92, 0, 18, 0, 0, 32, 0, 53,
+  0, 28, 0, 44, 48, 94, 4, 86, 0, 7,
+  0, 38, 52, 0, 35, 0, 21, 0, 24, 0,
+  13, 27, 0, 40, 0, 11, 10, 0, 33, 0,
+  8, 0, 25, 13, 37, 0, 0, 0, 0, 15,
+  39, 0, 14, 13, 0, 0, 0, 0, 0, 24,
+  0, 0, 0, 13, 0, 47, 0, 0, 62, 50,
+  3, 0, 0, 13, 20, 1, 44, 0, 24, 28,
+  0, 29, 0, 15, 0, 0, 25, 0, 11, 10,
+  47, 0, 42, 0, 79, 0, 14, 0, 3, 28,
+  40, 34, 0, 19, 25, 3, 20, 0, 0, 31,
+  114, 0, 21, 37, 61, 3, 0, 0, 0, 74,
+  0, 5, 57, 0, 0, 30, 0, 1, 0, 41,
+  79, 0, 10, 0, 0, 27, 0, 80, 0, 41,
+  32, 32, 31, 55, 32, 23, 0, 44, 0, 50,
+  31, 17, 17, 0, 7, 0, 0, 0, 12, 0,
+  0, 36, 0, 0, 4, 0, 28, 0, 17, 10,
+  0, 3, 3, 0, 15, 36, 0, 33, 36, 0,
+  51, 45, 0, 0, 5, 0, 0, 36, 0, 0,
+  0, 5, 0, 25, 33, 0, 3, 68, 5, 0,
+  5, 7, 24, 0, 28, 0, 2, 10, 6, 14,
+  0, 1, 0, 0, 2, 0, 6, 0, 15, 4,
+  59, 0, 74, 0, 21, 0, 0, 30, 25, 0,
+  1, 3, 33, 18, 0, 0, 0, 0, 0, 38,
+  0, 18, 43, 15, 0, 40, 38, 17, 58, 51,
+  0, 9, 8, 5, 128, 38, 0, 0, 54, 0,
+  69, 16, 0, 30, 0, 38, 21, 38, 0, 22,
+  60, 37, 2, 0, 0, 0, 0, 13, 47, 0,
+  16, 0, 64, 0, 29, 0, 6, 33, 7, 0,
+  0, 0, 7, 19, 25, 0, 0, 36, 79, 26,
+  45, 46, 0, 7, 30, 1, 38, 2, 13, 0,
+  0, 0, 0, 0, 54, 6, 3, 0, 38, 1,
+  15, 56, 0, 0, 37, 35, 9, 0, 0, 19,
+  20, 19, 57, 1, 0, 26, 0, 8, 0, 33,
+  5, 0, 23, 13, 0, 22, 19, 0, 0, 0,
+  19, 0, 11, 9, 0, 48, 13, 14, 0, 0,
+  29, 34, 3, 0, 0, 37, 105, 0, 2, 11,
+  53, 15, 0, 14, 67, 51, 53, 17, 9, 0,
+  0, 9, 0, 0, 0, 0, 96, 0, 32, 9,
+  0, 24, 0, 75, 0, 32, 0, 38, 68, 64,
+  0, 61, 0, 41, 0, 28, 43, 1, 16, 0,
+  14, 0, 11, 0, 0, 0, 0, 18, 0, 0,
+  0, 0, 17, 0, 10, 2, 29, 20, 37, 0,
+  16, 39, 0, 22, 45, 0, 41, 0, 0, 0,
+  0, 0, 0, 7, 0, 0, 0, 7, 0, 48,
+  0, 0, 52, 46, 8, 0, 0, 12, 18, 0,
+  59, 0, 0, 16, 0, 17, 0, 17, 0, 0,
+  14, 0, 6, 8, 40, 0, 40, 0, 76, 0,
+  11, 0, 4, 29, 39, 21, 0, 5, 28, 2,
+  19, 0, 0, 34, 112, 0, 22, 39, 53, 0,
+  0, 0, 0, 83, 0, 10, 59, 0, 0, 23,
+  0, 0, 0, 41, 82, 0, 23, 0, 0, 23,
+  0, 78, 0, 55, 37, 22, 36, 48, 30, 16,
+  0, 54, 0, 60, 33, 24, 31, 0, 11, 0,
+  7, 0, 17, 0, 0, 63, 0, 10, 7, 0,
+  36, 0, 8, 20, 0, 4, 0, 0, 33, 43,
+  0, 29, 44, 0, 61, 29, 0, 0, 0, 0,
+  0, 31, 0, 0, 0, 4, 0, 29, 42, 0,
+  5, 76, 2, 0, 8, 14, 30, 0, 21, 0,
+  0, 0, 8, 15, 0, 0, 0, 0, 0, 0,
+  6, 2, 19, 0, 53, 0, 69, 0, 17, 0,
+  0, 62, 32, 0, 2, 1, 44, 3, 0, 0,
+  16, 4, 12, 0, 5, 53, 33, 30, 0, 74,
+  61, 0, 71, 46, 0, 36, 0, 3, 111, 34,
+  1, 0, 57, 0, 53, 22, 0, 16, 0, 48,
+  40, 30, 5, 36, 99, 16, 0, 12, 0, 8,
+  1, 0, 56, 0, 0, 0, 43, 0, 7, 33,
+  9, 0, 16, 0, 0, 0, 18, 21, 0, 0,
+  8, 32, 42, 43, 43, 31, 0, 15, 0, 0,
+  70, 13, 10, 0, 12, 12, 0, 0, 50, 9,
+  2, 0, 16, 0, 5, 73, 0, 0, 8, 21,
+  2, 0, 0, 16, 17, 0, 77, 9, 0, 22,
+  29, 1, 0, 33, 0, 0, 0, 15, 0, 33,
+  26, 0, 0, 0, 28, 0, 14, 0, 5, 45,
+  49, 8, 0, 13, 12, 23, 0, 0, 0, 49,
+  90, 0, 0, 29, 44, 13, 0, 25, 68, 58,
+  82, 13, 0, 0, 0, 11, 0, 0, 0, 0,
+  81, 0, 34, 31, 0, 20, 0, 59, 2, 29,
+  0, 28, 67, 52, 0, 60, 0, 43, 0, 42,
+  24, 0, 22, 0, 17, 0, 7, 0, 0, 0,
+  0, 9, 8, 0, 0, 0, 16, 0, 14, 13,
+  19, 19, 30, 0, 40, 53, 0, 19, 43, 0,
+  42, 0, 0, 11, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 33, 18, 0, 37, 45, 21, 0,
+  0, 23, 29, 0, 60, 0, 0, 7, 11, 13,
+  0, 17, 0, 0, 0, 0, 1, 9, 37, 0,
+  7, 0, 52, 0, 8, 2, 2, 29, 35, 14,
+  0, 2, 25, 15, 25, 0, 0, 41, 100, 0,
+  19, 33, 52, 0, 0, 0, 0, 93, 0, 8,
+  42, 0, 0, 23, 0, 0, 0, 43, 78, 0,
+  33, 0, 0, 18, 0, 68, 0, 56, 40, 13,
+  39, 47, 17, 12, 0, 48, 0, 63, 25, 25,
+  42, 0, 13, 0, 12, 0, 4, 7, 0, 68,
+  0, 15, 1, 0, 32, 0, 7, 15, 0, 11,
+  0, 0, 44, 48, 0, 33, 43, 0, 60, 25,
+  0, 0, 0, 0, 0, 17, 0, 0, 0, 3,
+  0, 32, 43, 0, 2, 82, 3, 0, 8, 22,
+  34, 0, 25, 0, 0, 0, 17, 10, 0, 0,
+  0, 0, 0, 0, 2, 15, 15, 5, 38, 0,
+  55, 0, 13, 0, 0, 60, 0, 15, 0, 5,
+  36, 23, 2, 0, 0, 31, 86, 8, 0, 0,
+  59, 11, 0, 0, 65, 56, 0, 25, 23, 0,
+  0, 13, 0, 13, 0, 11, 92, 0, 18, 0,
+  0, 32, 0, 53, 0, 28, 0, 44, 48, 94,
+  4, 86, 0, 7, 0, 38, 52, 0, 35, 0,
+  21, 0, 24, 0, 13, 27, 0, 40, 0, 11,
+  10, 0, 33, 0, 8, 0, 25, 13, 37, 0,
+  0, 0, 0, 15, 39, 0, 14, 13, 0, 0,
+  0, 0, 0, 24, 0, 0, 0, 13, 0, 47,
+  0, 0, 62, 50, 3, 0, 0, 13, 20, 1,
+  44, 0, 24, 28, 0, 29, 0, 15, 0, 0,
+  25, 0, 11, 10, 47, 0, 42, 0, 79, 0,
+  14, 0, 3, 28, 40, 34, 0, 19, 25, 3,
+  20, 0, 0, 31, 114, 0, 21, 37, 61, 3,
+  0, 0, 0, 74, 0, 5, 57, 0, 0, 30,
+  0, 1, 0, 41, 79, 0, 10, 0, 0, 27,
+  0, 80, 0, 41, 32, 32, 31, 55, 32, 23,
+  0, 44, 0, 50, 31, 17, 17, 0, 7, 0,
+  0, 0, 12, 0, 0, 36, 0, 0, 4, 0,
+  28, 0, 17, 10, 0, 3, 3, 0, 15, 36,
+  0, 33, 36, 0, 51, 45, 0, 0, 5, 0,
+  0, 36, 0, 0, 0, 5, 0, 25, 33, 0,
+  3, 68, 5, 0, 5, 7, 24, 0, 28, 0,
+  2, 10, 6, 14, 0, 1, 0, 0, 2, 0,
+  6, 0, 15, 4, 59, 0, 74, 0, 21, 0,
+  0, 0, 0, 16, 0, 145, 3, 0, 12, 0,
+  0, 27, 50, 0, 0, 22, 2, 0, 1, 0,
+  35, 91, 18, 9, 3, 0, 0, 0, 0, 4,
+  0, 27, 23, 43, 0, 0, 0, 30, 0, 60,
+  0, 29, 0, 69, 6, 72, 26, 52, 0, 0,
+  0, 48, 12, 0, 0, 0, 56, 0, 35, 0,
+  2, 55, 0, 0, 72, 0, 0, 20, 53, 0,
+  83, 22, 17, 0, 0, 33, 2, 22, 0, 37,
+  41, 0, 32, 49, 7, 0, 27, 0, 0, 0,
+  0, 13, 1, 0, 15, 38, 0, 0, 2, 68,
+  27, 0, 0, 7, 17, 0, 22, 0, 0, 0,
+  0, 0, 0, 29, 0, 0, 104, 4, 40, 7,
+  0, 0, 0, 0, 54, 0, 3, 0, 0, 48,
+  13, 14, 0, 0, 29, 34, 3, 0, 0, 37,
+  105, 0, 2, 11, 53, 15, 0, 14, 67, 51,
+  53, 17, 9, 0, 0, 9, 0, 0, 0, 0,
+  96, 0, 32, 9, 0, 24, 0, 75, 0, 32,
+  0, 38, 68, 64, 0, 61, 0, 41, 0, 28,
+  43, 1, 16, 0, 14, 0, 11, 0, 0, 0,
+  0, 18, 0, 0, 0, 0, 17, 0, 10, 2,
+  29, 20, 37, 0, 16, 39, 0, 22, 45, 0,
+  41, 0, 0, 0, 0, 0, 0, 7, 0, 0,
+  0, 7, 0, 48, 0, 0, 52, 46, 8, 0,
+  0, 12, 18, 0, 59, 0, 0, 16, 0, 17,
+  0, 17, 0, 0, 14, 0, 6, 8, 40, 0,
+  40, 0, 76, 0, 11, 0, 4, 29, 39, 21,
+  0, 5, 28, 2, 19, 0, 0, 34, 112, 0,
+  22, 39, 53, 0, 0, 0, 0, 83, 0, 10,
+  59, 0, 0, 23, 0, 0, 0, 41, 82, 0,
+  23, 0, 0, 23, 0, 78, 0, 55, 37, 22,
+  36, 48, 30, 16, 0, 54, 0, 60, 33, 24,
+  31, 0, 11, 0, 7, 0, 17, 0, 0, 63,
+  0, 10, 7, 0, 36, 0, 8, 20, 0, 4,
+  0, 0, 33, 43, 0, 29, 44, 0, 61, 29,
+  0, 0, 0, 0, 0, 31, 0, 0, 0, 4,
+  0, 29, 42, 0, 5, 76, 2, 0, 8, 14,
+  30, 0, 21, 0, 0, 0, 8, 15, 0, 0,
+  0, 0, 0, 0, 6, 2, 19, 0, 53, 0,
+  69, 0, 17, 0, 0, 0, 0, 10, 0, 139,
+  4, 0, 12, 0, 0, 18, 33, 0, 0, 25,
+  0, 0, 0, 0, 30, 95, 19, 11, 3, 0,
+  0, 0, 0, 0, 0, 27, 29, 38, 0, 0,
+  0, 23, 0, 54, 0, 22, 0, 53, 1, 90,
+  35, 56, 0, 0, 0, 51, 6, 0, 10, 0,
+  55, 0, 49, 0, 11, 61, 0, 0, 76, 3,
+  0, 3, 55, 0, 82, 11, 11, 0, 0, 21,
+  26, 25, 0, 32, 34, 0, 41, 44, 0, 0,
+  22, 0, 0, 7, 0, 21, 4, 0, 4, 31,
+  0, 0, 7, 66, 36, 0, 0, 23, 27, 0,
+  16, 0, 0, 0, 0, 0, 0, 35, 0, 0,
+  100, 2, 34, 1, 0, 0, 0, 0, 28, 0,
+  0, 0, 5, 45, 49, 8, 0, 13, 12, 23,
+  0, 0, 0, 49, 90, 0, 0, 29, 44, 13,
+  0, 25, 68, 58, 82, 13, 0, 0, 0, 11,
+  0, 0, 0, 0, 81, 0, 34, 31, 0, 20,
+  0, 59, 2, 29, 0, 28, 67, 52, 0, 60,
+  0, 43, 0, 42, 24, 0, 22, 0, 17, 0,
+  7, 0, 0, 0, 0, 9, 8, 0, 0, 0,
+  16, 0, 14, 13, 19, 19, 30, 0, 40, 53,
+  0, 19, 43, 0, 42, 0, 0, 11, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 33, 18, 0,
+  37, 45, 21, 0, 0, 23, 29, 0, 60, 0,
+  0, 7, 11, 13, 0, 17, 0, 0, 0, 0,
+  1, 9, 37, 0, 7, 0, 52, 0, 8, 2,
+  2, 29, 35, 14, 0, 2, 25, 15, 25, 0,
+  0, 41, 100, 0, 19, 33, 52, 0, 0, 0,
+  0, 93, 0, 8, 42, 0, 0, 23, 0, 0,
+  0, 43, 78, 0, 33, 0, 0, 18, 0, 68,
+  0, 56, 40, 13, 39, 47, 17, 12, 0, 48,
+  0, 63, 25, 25, 42, 0, 13, 0, 12, 0,
+  4, 7, 0, 68, 0, 15, 1, 0, 32, 0,
+  7, 15, 0, 11, 0, 0, 44, 48, 0, 33,
+  43, 0, 60, 25, 0, 0, 0, 0, 0, 17,
+  0, 0, 0, 3, 0, 32, 43, 0, 2, 82,
+  3, 0, 8, 22, 34, 0, 25, 0, 0, 0,
+  17, 10, 0, 0, 0, 0, 0, 0, 2, 15,
+  15, 5, 38, 0, 55, 0, 13, 0, 0, 0,
+  0, 2, 0, 130, 10, 0, 4, 0, 0, 17,
+  27, 0, 0, 13, 0, 0, 0, 0, 39, 101,
+  22, 12, 0, 0, 0, 0, 0, 3, 0, 24,
+  35, 28, 1, 0, 0, 22, 0, 43, 0, 20,
+  0, 45, 17, 92, 24, 56, 0, 1, 0, 50,
+  0, 0, 17, 0, 51, 0, 51, 0, 0, 57,
+  0, 0, 72, 8, 0, 8, 34, 0, 64, 5,
+  28, 6, 0, 15, 34, 35, 0, 21, 42, 0,
+  36, 58, 0, 0, 16, 0, 0, 0, 0, 14,
+  4, 0, 0, 35, 0, 0, 0, 63, 44, 0,
+  0, 33, 35, 0, 21, 0, 0, 0, 3, 0,
+  0, 32, 0, 0, 109, 11, 25, 17, 0, 0,
+  0, 0, 15, 0, 0, 0, 3, 28, 40, 34,
+  0, 19, 25, 3, 20, 0, 0, 31, 114, 0,
+  21, 37, 61, 3, 0, 0, 0, 74, 0, 5,
+  57, 0, 0, 30, 0, 1, 0, 41, 79, 0,
+  10, 0, 0, 27, 0, 80, 0, 41, 32, 32,
+  31, 55, 32, 23, 0, 44, 0, 50, 31, 17,
+  17, 0, 7, 0, 0, 0, 12, 0, 0, 36,
+  0, 0, 4, 0, 28, 0, 17, 10, 0, 3,
+  3, 0, 15, 36, 0, 33, 36, 0, 51, 45,
+  0, 0, 5, 0, 0, 36, 0, 0, 0, 5,
+  0, 25, 33, 0, 3, 68, 5, 0, 5, 7,
+  24, 0, 28, 0, 2, 10, 6, 14, 0, 1,
+  0, 0, 2, 0, 6, 0, 15, 4, 59, 0,
+  74, 0, 21, 0, 0, 0, 0, 16, 0, 145,
+  3, 0, 12, 0, 0, 27, 50, 0, 0, 22,
+  2, 0, 1, 0, 35, 91, 18, 9, 3, 0,
+  0, 0, 0, 4, 0, 27, 23, 43, 0, 0,
+  0, 30, 0, 60, 0, 29, 0, 69, 6, 72,
+  26, 52, 0, 0, 0, 48, 12, 0, 0, 0,
+  56, 0, 35, 0, 2, 55, 0, 0, 72, 0,
+  0, 20, 53, 0, 83, 22, 17, 0, 0, 33,
+  2, 22, 0, 37, 41, 0, 32, 49, 7, 0,
+  27, 0, 0, 0, 0, 13, 1, 0, 15, 38,
+  0, 0, 2, 68, 27, 0, 0, 7, 17, 0,
+  22, 0, 0, 0, 0, 0, 0, 29, 0, 0,
+  104, 4, 40, 7, 0, 0, 0, 0, 54, 0,
+  3, 0, 0, 0, 0, 0, 0, 45, 41, 0,
+  20, 0, 0, 0, 75, 11, 19, 55, 39, 21,
+  25, 2, 84, 0, 0, 27, 13, 52, 3, 2,
+  0, 52, 0, 0, 56, 63, 0, 0, 0, 0,
+  0, 59, 0, 43, 0, 45, 7, 20, 17, 36,
+  0, 46, 0, 0, 66, 22, 0, 0, 25, 0,
+  0, 76, 20, 0, 0, 2, 0, 0, 13, 21,
+  31, 0, 0, 26, 0, 14, 8, 55, 0, 0,
+  0, 54, 58, 17, 20, 5, 37, 0, 12, 14,
+  8, 14, 4, 15, 7, 17, 1, 41, 0, 0,
+  39, 55, 6, 0, 4, 0, 0, 0, 35, 0,
+  0, 42, 13, 0, 0, 5, 0, 0, 43, 15,
+  52, 0, 18, 3, 121, 0, 68, 0, 9, 0,
+  4, 29, 39, 21, 0, 5, 28, 2, 19, 0,
+  0, 34, 112, 0, 22, 39, 53, 0, 0, 0,
+  0, 83, 0, 10, 59, 0, 0, 23, 0, 0,
+  0, 41, 82, 0, 23, 0, 0, 23, 0, 78,
+  0, 55, 37, 22, 36, 48, 30, 16, 0, 54,
+  0, 60, 33, 24, 31, 0, 11, 0, 7, 0,
+  17, 0, 0, 63, 0, 10, 7, 0, 36, 0,
+  8, 20, 0, 4, 0, 0, 33, 43, 0, 29,
+  44, 0, 61, 29, 0, 0, 0, 0, 0, 31,
+  0, 0, 0, 4, 0, 29, 42, 0, 5, 76,
+  2, 0, 8, 14, 30, 0, 21, 0, 0, 0,
+  8, 15, 0, 0, 0, 0, 0, 0, 6, 2,
+  19, 0, 53, 0, 69, 0, 17, 0, 0, 0,
+  0, 10, 0, 139, 4, 0, 12, 0, 0, 18,
+  33, 0, 0, 25, 0, 0, 0, 0, 30, 95,
+  19, 11, 3, 0, 0, 0, 0, 0, 0, 27,
+  29, 38, 0, 0, 0, 23, 0, 54, 0, 22,
+  0, 53, 1, 90, 35, 56, 0, 0, 0, 51,
+  6, 0, 10, 0, 55, 0, 49, 0, 11, 61,
+  0, 0, 76, 3, 0, 3, 55, 0, 82, 11,
+  11, 0, 0, 21, 26, 25, 0, 32, 34, 0,
+  41, 44, 0, 0, 22, 0, 0, 7, 0, 21,
+  4, 0, 4, 31, 0, 0, 7, 66, 36, 0,
+  0, 23, 27, 0, 16, 0, 0, 0, 0, 0,
+  0, 35, 0, 0, 100, 2, 34, 1, 0, 0,
+  0, 0, 28, 0, 0, 0, 0, 0, 0, 0,
+  9, 38, 29, 0, 28, 0, 15, 0, 49, 21,
+  13, 59, 25, 11, 12, 5, 68, 0, 0, 42,
+  2, 24, 1, 0, 0, 35, 0, 0, 51, 61,
+  4, 0, 0, 0, 0, 42, 8, 38, 0, 45,
+  9, 26, 16, 31, 0, 20, 23, 0, 74, 24,
+  0, 0, 43, 0, 0, 56, 26, 7, 0, 0,
+  0, 0, 26, 8, 30, 0, 0, 7, 0, 8,
+  2, 45, 9, 0, 0, 52, 52, 14, 29, 21,
+  20, 0, 7, 19, 17, 28, 6, 32, 0, 6,
+  20, 41, 0, 0, 30, 59, 7, 0, 1, 0,
+  0, 0, 35, 0, 0, 25, 13, 0, 0, 13,
+  0, 0, 41, 20, 37, 0, 1, 0, 90, 0,
+  36, 0, 0, 0, 2, 29, 35, 14, 0, 2,
+  25, 15, 25, 0, 0, 41, 100, 0, 19, 33,
+  52, 0, 0, 0, 0, 93, 0, 8, 42, 0,
+  0, 23, 0, 0, 0, 43, 78, 0, 33, 0,
+  0, 18, 0, 68, 0, 56, 40, 13, 39, 47,
+  17, 12, 0, 48, 0, 63, 25, 25, 42, 0,
+  13, 0, 12, 0, 4, 7, 0, 68, 0, 15,
+  1, 0, 32, 0, 7, 15, 0, 11, 0, 0,
+  44, 48, 0, 33, 43, 0, 60, 25, 0, 0,
+  0, 0, 0, 17, 0, 0, 0, 3, 0, 32,
+  43, 0, 2, 82, 3, 0, 8, 22, 34, 0,
+  25, 0, 0, 0, 17, 10, 0, 0, 0, 0,
+  0, 0, 2, 15, 15, 5, 38, 0, 55, 0,
+  13, 0, 0, 0, 0, 2, 0, 130, 10, 0,
+  4, 0, 0, 17, 27, 0, 0, 13, 0, 0,
+  0, 0, 39, 101, 22, 12, 0, 0, 0, 0,
+  0, 3, 0, 24, 35, 28, 1, 0, 0, 22,
+  0, 43, 0, 20, 0, 45, 17, 92, 24, 56,
+  0, 1, 0, 50, 0, 0, 17, 0, 51, 0,
+  51, 0, 0, 57, 0, 0, 72, 8, 0, 8,
+  34, 0, 64, 5, 28, 6, 0, 15, 34, 35,
+  0, 21, 42, 0, 36, 58, 0, 0, 16, 0,
+  0, 0, 0, 14, 4, 0, 0, 35, 0, 0,
+  0, 63, 44, 0, 0, 33, 35, 0, 21, 0,
+  0, 0, 3, 0, 0, 32, 0, 0, 109, 11,
+  25, 17, 0, 0, 0, 0, 15, 0, 0, 0,
+  0, 0, 0, 0, 0, 30, 33, 0, 19, 0,
+  21, 0, 43, 0, 16, 54, 29, 19, 0, 10,
+  66, 0, 0, 44, 0, 21, 4, 0, 0, 41,
+  0, 0, 53, 56, 9, 0, 0, 0, 0, 18,
+  0, 34, 0, 47, 24, 21, 4, 29, 0, 18,
+  41, 0, 75, 14, 0, 0, 37, 0, 0, 75,
+  15, 0, 0, 0, 0, 0, 34, 16, 0, 0,
+  0, 2, 0, 21, 12, 35, 14, 9, 0, 42,
+  59, 0, 15, 48, 23, 0, 5, 24, 11, 27,
+  9, 21, 0, 6, 17, 45, 0, 0, 9, 43,
+  26, 0, 0, 0, 17, 0, 51, 8, 2, 21,
+  33, 2, 0, 20, 0, 0, 46, 39, 44, 11,
+  0, 0, 80, 0, 29, 15, 0, 0, 0, 0,
+  0, 16, 0, 145, 3, 0, 12, 0, 0, 27,
+  50, 0, 0, 22, 2, 0, 1, 0, 35, 91,
+  18, 9, 3, 0, 0, 0, 0, 4, 0, 27,
+  23, 43, 0, 0, 0, 30, 0, 60, 0, 29,
+  0, 69, 6, 72, 26, 52, 0, 0, 0, 48,
+  12, 0, 0, 0, 56, 0, 35, 0, 2, 55,
+  0, 0, 72, 0, 0, 20, 53, 0, 83, 22,
+  17, 0, 0, 33, 2, 22, 0, 37, 41, 0,
+  32, 49, 7, 0, 27, 0, 0, 0, 0, 13,
+  1, 0, 15, 38, 0, 0, 2, 68, 27, 0,
+  0, 7, 17, 0, 22, 0, 0, 0, 0, 0,
+  0, 29, 0, 0, 104, 4, 40, 7, 0, 0,
+  0, 0, 54, 0, 3, 0, 0, 0, 0, 0,
+  0, 45, 41, 0, 20, 0, 0, 0, 75, 11,
+  19, 55, 39, 21, 25, 2, 84, 0, 0, 27,
+  13, 52, 3, 2, 0, 52, 0, 0, 56, 63,
+  0, 0, 0, 0, 0, 59, 0, 43, 0, 45,
+  7, 20, 17, 36, 0, 46, 0, 0, 66, 22,
+  0, 0, 25, 0, 0, 76, 20, 0, 0, 2,
+  0, 0, 13, 21, 31, 0, 0, 26, 0, 14,
+  8, 55, 0, 0, 0, 54, 58, 17, 20, 5,
+  37, 0, 12, 14, 8, 14, 4, 15, 7, 17,
+  1, 41, 0, 0, 39, 55, 6, 0, 4, 0,
+  0, 0, 35, 0, 0, 42, 13, 0, 0, 5,
+  0, 0, 43, 15, 52, 0, 18, 3, 121, 0,
+  68, 0, 9, 0, 0, 49, 1, 0, 30, 0,
+  15, 0, 64, 0, 0, 7, 46, 41, 52, 60,
+  59, 47, 14, 4, 85, 0, 0, 29, 21, 32,
+  22, 9, 0, 19, 0, 0, 33, 0, 0, 0,
+  0, 0, 0, 62, 0, 0, 0, 54, 0, 32,
+  4, 0, 0, 16, 7, 12, 54, 37, 0, 0,
+  0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+  49, 0, 30, 0, 0, 0, 5, 29, 27, 0,
+  0, 9, 0, 21, 35, 23, 45, 0, 23, 22,
+  4, 26, 21, 30, 26, 0, 0, 24, 0, 19,
+  0, 0, 46, 43, 11, 0, 0, 0, 0, 0,
+  30, 1, 0, 44, 0, 0, 0, 16, 0, 0,
+  1, 3, 6, 0, 0, 0, 95, 0, 52, 0,
+  20, 0, 0, 0, 0, 10, 0, 139, 4, 0,
+  12, 0, 0, 18, 33, 0, 0, 25, 0, 0,
+  0, 0, 30, 95, 19, 11, 3, 0, 0, 0,
+  0, 0, 0, 27, 29, 38, 0, 0, 0, 23,
+  0, 54, 0, 22, 0, 53, 1, 90, 35, 56,
+  0, 0, 0, 51, 6, 0, 10, 0, 55, 0,
+  49, 0, 11, 61, 0, 0, 76, 3, 0, 3,
+  55, 0, 82, 11, 11, 0, 0, 21, 26, 25,
+  0, 32, 34, 0, 41, 44, 0, 0, 22, 0,
+  0, 7, 0, 21, 4, 0, 4, 31, 0, 0,
+  7, 66, 36, 0, 0, 23, 27, 0, 16, 0,
+  0, 0, 0, 0, 0, 35, 0, 0, 100, 2,
+  34, 1, 0, 0, 0, 0, 28, 0, 0, 0,
+  0, 0, 0, 0, 9, 38, 29, 0, 28, 0,
+  15, 0, 49, 21, 13, 59, 25, 11, 12, 5,
+  68, 0, 0, 42, 2, 24, 1, 0, 0, 35,
+  0, 0, 51, 61, 4, 0, 0, 0, 0, 42,
+  8, 38, 0, 45, 9, 26, 16, 31, 0, 20,
+  23, 0, 74, 24, 0, 0, 43, 0, 0, 56,
+  26, 7, 0, 0, 0, 0, 26, 8, 30, 0,
+  0, 7, 0, 8, 2, 45, 9, 0, 0, 52,
+  52, 14, 29, 21, 20, 0, 7, 19, 17, 28,
+  6, 32, 0, 6, 20, 41, 0, 0, 30, 59,
+  7, 0, 1, 0, 0, 0, 35, 0, 0, 25,
+  13, 0, 0, 13, 0, 0, 41, 20, 37, 0,
+  1, 0, 90, 0, 36, 0, 0, 0, 0, 41,
+  38, 0, 0, 0, 0, 0, 61, 6, 0, 16,
+  12, 19, 25, 54, 49, 37, 21, 5, 43, 0,
+  53, 32, 0, 0, 35, 21, 0, 0, 0, 0,
+  32, 0, 3, 0, 0, 0, 0, 35, 0, 0,
+  0, 27, 0, 26, 0, 0, 0, 15, 28, 3,
+  38, 9, 0, 0, 27, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 56, 0, 5, 0, 0, 0,
+  1, 44, 11, 11, 0, 62, 0, 23, 13, 12,
+  56, 44, 1, 24, 0, 29, 27, 31, 52, 10,
+  0, 0, 12, 0, 0, 0, 11, 51, 42, 0,
+  0, 0, 0, 0, 41, 0, 0, 48, 5, 0,
+  0, 10, 0, 0, 7, 0, 0, 0, 0, 0,
+  47, 0, 21, 0, 1, 20, 0, 0, 0, 2,
+  0, 130, 10, 0, 4, 0, 0, 17, 27, 0,
+  0, 13, 0, 0, 0, 0, 39, 101, 22, 12,
+  0, 0, 0, 0, 0, 3, 0, 24, 35, 28,
+  1, 0, 0, 22, 0, 43, 0, 20, 0, 45,
+  17, 92, 24, 56, 0, 1, 0, 50, 0, 0,
+  17, 0, 51, 0, 51, 0, 0, 57, 0, 0,
+  72, 8, 0, 8, 34, 0, 64, 5, 28, 6,
+  0, 15, 34, 35, 0, 21, 42, 0, 36, 58,
+  0, 0, 16, 0, 0, 0, 0, 14, 4, 0,
+  0, 35, 0, 0, 0, 63, 44, 0, 0, 33,
+  35, 0, 21, 0, 0, 0, 3, 0, 0, 32,
+  0, 0, 109, 11, 25, 17, 0, 0, 0, 0,
+  15, 0, 0, 0, 0, 0, 0, 0, 0, 30,
+  33, 0, 19, 0, 21, 0, 43, 0, 16, 54,
+  29, 19, 0, 10, 66, 0, 0, 44, 0, 21,
+  4, 0, 0, 41, 0, 0, 53, 56, 9, 0,
+  0, 0, 0, 18, 0, 34, 0, 47, 24, 21,
+  4, 29, 0, 18, 41, 0, 75, 14, 0, 0,
+  37, 0, 0, 75, 15, 0, 0, 0, 0, 0,
+  34, 16, 0, 0, 0, 2, 0, 21, 12, 35,
+  14, 9, 0, 42, 59, 0, 15, 48, 23, 0,
+  5, 24, 11, 27, 9, 21, 0, 6, 17, 45,
+  0, 0, 9, 43, 26, 0, 0, 0, 17, 0,
+  51, 8, 2, 21, 33, 2, 0, 20, 0, 0,
+  46, 39, 44, 11, 0, 0, 80, 0, 29, 15,
+  0, 0, 0, 47, 63, 0, 0, 0, 0, 0,
+  44, 1, 0, 11, 10, 3, 0, 58, 41, 16,
+  11, 0, 10, 0, 65, 40, 0, 0, 36, 16,
+  0, 0, 0, 0, 20, 0, 20, 14, 0, 0,
+  0, 16, 0, 3, 0, 22, 0, 2, 0, 0,
+  0, 1, 57, 3, 31, 0, 0, 0, 29, 0,
+  0, 14, 3, 0, 0, 0, 16, 0, 39, 2,
+  0, 0, 0, 0, 0, 49, 17, 0, 0, 86,
+  0, 30, 13, 0, 52, 56, 3, 30, 0, 29,
+  23, 24, 50, 0, 0, 0, 17, 0, 0, 0,
+  0, 53, 48, 0, 0, 0, 13, 0, 61, 0,
+  0, 31, 25, 0, 0, 5, 0, 0, 7, 0,
+  0, 16, 0, 0, 30, 0, 18, 13, 0, 31,
+  0, 0, 0, 0, 0, 45, 41, 0, 20, 0,
+  0, 0, 75, 11, 19, 55, 39, 21, 25, 2,
+  84, 0, 0, 27, 13, 52, 3, 2, 0, 52,
+  0, 0, 56, 63, 0, 0, 0, 0, 0, 59,
+  0, 43, 0, 45, 7, 20, 17, 36, 0, 46,
+  0, 0, 66, 22, 0, 0, 25, 0, 0, 76,
+  20, 0, 0, 2, 0, 0, 13, 21, 31, 0,
+  0, 26, 0, 14, 8, 55, 0, 0, 0, 54,
+  58, 17, 20, 5, 37, 0, 12, 14, 8, 14,
+  4, 15, 7, 17, 1, 41, 0, 0, 39, 55,
+  6, 0, 4, 0, 0, 0, 35, 0, 0, 42,
+  13, 0, 0, 5, 0, 0, 43, 15, 52, 0,
+  18, 3, 121, 0, 68, 0, 9, 0, 0, 49,
+  1, 0, 30, 0, 15, 0, 64, 0, 0, 7,
+  46, 41, 52, 60, 59, 47, 14, 4, 85, 0,
+  0, 29, 21, 32, 22, 9, 0, 19, 0, 0,
+  33, 0, 0, 0, 0, 0, 0, 62, 0, 0,
+  0, 54, 0, 32, 4, 0, 0, 16, 7, 12,
+  54, 37, 0, 0, 0, 0, 0, 0, 1, 0,
+  0, 0, 0, 0, 49, 0, 30, 0, 0, 0,
+  5, 29, 27, 0, 0, 9, 0, 21, 35, 23,
+  45, 0, 23, 22, 4, 26, 21, 30, 26, 0,
+  0, 24, 0, 19, 0, 0, 46, 43, 11, 0,
+  0, 0, 0, 0, 30, 1, 0, 44, 0, 0,
+  0, 16, 0, 0, 1, 3, 6, 0, 0, 0,
+  95, 0, 52, 0, 20, 0, 0, 44, 27, 0,
+  33, 0, 0, 0, 76, 0, 0, 1, 67, 69,
+  11, 51, 63, 32, 6, 0, 66, 0, 0, 38,
+  0, 0, 28, 40, 0, 0, 0, 0, 7, 0,
+  0, 0, 0, 27, 0, 47, 0, 0, 0, 20,
+  0, 38, 0, 0, 0, 16, 0, 34, 21, 7,
+  0, 0, 0, 8, 0, 0, 0, 0, 0, 0,
+  0, 0, 98, 0, 25, 5, 0, 0, 0, 78,
+  9, 0, 0, 35, 0, 0, 12, 5, 38, 41,
+  20, 53, 0, 44, 32, 14, 27, 37, 0, 13,
+  0, 0, 0, 0, 28, 63, 38, 0, 0, 0,
+  0, 0, 3, 36, 0, 61, 0, 0, 0, 5,
+  3, 0, 4, 0, 0, 0, 0, 0, 77, 0,
+  26, 0, 18, 21, 0, 0, 0, 0, 9, 38,
+  29, 0, 28, 0, 15, 0, 49, 21, 13, 59,
+  25, 11, 12, 5, 68, 0, 0, 42, 2, 24,
+  1, 0, 0, 35, 0, 0, 51, 61, 4, 0,
+  0, 0, 0, 42, 8, 38, 0, 45, 9, 26,
+  16, 31, 0, 20, 23, 0, 74, 24, 0, 0,
+  43, 0, 0, 56, 26, 7, 0, 0, 0, 0,
+  26, 8, 30, 0, 0, 7, 0, 8, 2, 45,
+  9, 0, 0, 52, 52, 14, 29, 21, 20, 0,
+  7, 19, 17, 28, 6, 32, 0, 6, 20, 41,
+  0, 0, 30, 59, 7, 0, 1, 0, 0, 0,
+  35, 0, 0, 25, 13, 0, 0, 13, 0, 0,
+  41, 20, 37, 0, 1, 0, 90, 0, 36, 0,
+  0, 0, 0, 41, 38, 0, 0, 0, 0, 0,
+  61, 6, 0, 16, 12, 19, 25, 54, 49, 37,
+  21, 5, 43, 0, 53, 32, 0, 0, 35, 21,
+  0, 0, 0, 0, 32, 0, 3, 0, 0, 0,
+  0, 35, 0, 0, 0, 27, 0, 26, 0, 0,
+  0, 15, 28, 3, 38, 9, 0, 0, 27, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 56, 0,
+  5, 0, 0, 0, 1, 44, 11, 11, 0, 62,
+  0, 23, 13, 12, 56, 44, 1, 24, 0, 29,
+  27, 31, 52, 10, 0, 0, 12, 0, 0, 0,
+  11, 51, 42, 0, 0, 0, 0, 0, 41, 0,
+  0, 48, 5, 0, 0, 10, 0, 0, 7, 0,
+  0, 0, 0, 0, 47, 0, 21, 0, 1, 20,
+  52, 0, 43, 0, 22, 0, 0, 0, 29, 0,
+  0, 0, 38, 88, 0, 0, 38, 0, 13, 0,
+  33, 104, 68, 26, 0, 0, 8, 50, 0, 0,
+  0, 10, 0, 4, 0, 0, 0, 20, 0, 11,
+  1, 0, 0, 0, 0, 16, 0, 0, 0, 7,
+  0, 77, 0, 0, 52, 0, 26, 23, 6, 0,
+  25, 0, 0, 6, 24, 0, 92, 16, 18, 73,
+  0, 0, 0, 73, 0, 0, 0, 50, 0, 0,
+  0, 0, 11, 59, 10, 49, 0, 55, 10, 0,
+  0, 37, 0, 0, 5, 0, 13, 0, 23, 61,
+  29, 7, 1, 0, 19, 2, 0, 26, 0, 53,
+  0, 7, 0, 0, 0, 23, 69, 0, 1, 0,
+  0, 31, 0, 0, 4, 0, 0, 61, 0, 0,
+  0, 0, 0, 30, 33, 0, 19, 0, 21, 0,
+  43, 0, 16, 54, 29, 19, 0, 10, 66, 0,
+  0, 44, 0, 21, 4, 0, 0, 41, 0, 0,
+  53, 56, 9, 0, 0, 0, 0, 18, 0, 34,
+  0, 47, 24, 21, 4, 29, 0, 18, 41, 0,
+  75, 14, 0, 0, 37, 0, 0, 75, 15, 0,
+  0, 0, 0, 0, 34, 16, 0, 0, 0, 2,
+  0, 21, 12, 35, 14, 9, 0, 42, 59, 0,
+  15, 48, 23, 0, 5, 24, 11, 27, 9, 21,
+  0, 6, 17, 45, 0, 0, 9, 43, 26, 0,
+  0, 0, 17, 0, 51, 8, 2, 21, 33, 2,
+  0, 20, 0, 0, 46, 39, 44, 11, 0, 0,
+  80, 0, 29, 15, 0, 0, 0, 47, 63, 0,
+  0, 0, 0, 0, 44, 1, 0, 11, 10, 3,
+  0, 58, 41, 16, 11, 0, 10, 0, 65, 40,
+  0, 0, 36, 16, 0, 0, 0, 0, 20, 0,
+  20, 14, 0, 0, 0, 16, 0, 3, 0, 22,
+  0, 2, 0, 0, 0, 1, 57, 3, 31, 0,
+  0, 0, 29, 0, 0, 14, 3, 0, 0, 0,
+  16, 0, 39, 2, 0, 0, 0, 0, 0, 49,
+  17, 0, 0, 86, 0, 30, 13, 0, 52, 56,
+  3, 30, 0, 29, 23, 24, 50, 0, 0, 0,
+  17, 0, 0, 0, 0, 53, 48, 0, 0, 0,
+  13, 0, 61, 0, 0, 31, 25, 0, 0, 5,
+  0, 0, 7, 0, 0, 16, 0, 0, 30, 0,
+  18, 13, 0, 31, 103, 0, 37, 5, 6, 15,
+  0, 0, 15, 0, 0, 23, 47, 54, 0, 0,
+  22, 0, 6, 0, 0, 173, 80, 13, 0, 0,
+  0, 33, 0, 0, 2, 56, 0, 34, 0, 21,
+  0, 29, 0, 25, 0, 22, 0, 0, 27, 6,
+  10, 8, 0, 0, 0, 77, 0, 0, 89, 0,
+  43, 20, 45, 0, 35, 11, 0, 32, 30, 49,
+  7, 15, 23, 23, 7, 28, 0, 22, 0, 0,
+  3, 45, 0, 13, 0, 0, 4, 42, 8, 27,
+  0, 9, 0, 0, 0, 0, 8, 0, 7, 0,
+  24, 0, 27, 61, 2, 0, 25, 0, 40, 28,
+  4, 8, 10, 35, 4, 0, 0, 0, 0, 15,
+  78, 0, 23, 10, 0, 35, 0, 0, 20, 3,
+  3, 48, 0, 49, 1, 0, 30, 0, 15, 0,
+  64, 0, 0, 7, 46, 41, 52, 60, 59, 47,
+  14, 4, 85, 0, 0, 29, 21, 32, 22, 9,
+  0, 19, 0, 0, 33, 0, 0, 0, 0, 0,
+  0, 62, 0, 0, 0, 54, 0, 32, 4, 0,
+  0, 16, 7, 12, 54, 37, 0, 0, 0, 0,
+  0, 0, 1, 0, 0, 0, 0, 0, 49, 0,
+  30, 0, 0, 0, 5, 29, 27, 0, 0, 9,
+  0, 21, 35, 23, 45, 0, 23, 22, 4, 26,
+  21, 30, 26, 0, 0, 24, 0, 19, 0, 0,
+  46, 43, 11, 0, 0, 0, 0, 0, 30, 1,
+  0, 44, 0, 0, 0, 16, 0, 0, 1, 3,
+  6, 0, 0, 0, 95, 0, 52, 0, 20, 0,
+  0, 44, 27, 0, 33, 0, 0, 0, 76, 0,
+  0, 1, 67, 69, 11, 51, 63, 32, 6, 0,
+  66, 0, 0, 38, 0, 0, 28, 40, 0, 0,
+  0, 0, 7, 0, 0, 0, 0, 27, 0, 47,
+  0, 0, 0, 20, 0, 38, 0, 0, 0, 16,
+  0, 34, 21, 7, 0, 0, 0, 8, 0, 0,
+  0, 0, 0, 0, 0, 0, 98, 0, 25, 5,
+  0, 0, 0, 78, 9, 0, 0, 35, 0, 0,
+  12, 5, 38, 41, 20, 53, 0, 44, 32, 14,
+  27, 37, 0, 13, 0, 0, 0, 0, 28, 63,
+  38, 0, 0, 0, 0, 0, 3, 36, 0, 61,
+  0, 0, 0, 5, 3, 0, 4, 0, 0, 0,
+  0, 0, 77, 0, 26, 0, 18, 21, 29, 0,
+  57, 0, 12, 30, 0, 0, 52, 0, 0, 2,
+  43, 101, 14, 0, 40, 0, 0, 0, 32, 66,
+  0, 35, 0, 0, 0, 29, 0, 8, 0, 0,
+  0, 11, 0, 0, 0, 50, 0, 48, 0, 31,
+  0, 0, 0, 0, 0, 0, 6, 9, 0, 67,
+  0, 0, 11, 0, 13, 40, 0, 0, 5, 7,
+  0, 44, 0, 15, 58, 0, 30, 45, 0, 14,
+  0, 32, 0, 0, 0, 10, 0, 27, 0, 3,
+  29, 32, 45, 49, 0, 64, 21, 0, 0, 14,
+  0, 0, 0, 0, 0, 0, 30, 78, 0, 0,
+  0, 0, 0, 18, 0, 23, 14, 57, 17, 0,
+  0, 0, 29, 0, 59, 1, 9, 2, 0, 17,
+  0, 0, 0, 0, 0, 41, 0, 41, 38, 0,
+  0, 0, 0, 0, 61, 6, 0, 16, 12, 19,
+  25, 54, 49, 37, 21, 5, 43, 0, 53, 32,
+  0, 0, 35, 21, 0, 0, 0, 0, 32, 0,
+  3, 0, 0, 0, 0, 35, 0, 0, 0, 27,
+  0, 26, 0, 0, 0, 15, 28, 3, 38, 9,
+  0, 0, 27, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 56, 0, 5, 0, 0, 0, 1, 44,
+  11, 11, 0, 62, 0, 23, 13, 12, 56, 44,
+  1, 24, 0, 29, 27, 31, 52, 10, 0, 0,
+  12, 0, 0, 0, 11, 51, 42, 0, 0, 0,
+  0, 0, 41, 0, 0, 48, 5, 0, 0, 10,
+  0, 0, 7, 0, 0, 0, 0, 0, 47, 0,
+  21, 0, 1, 20, 52, 0, 43, 0, 22, 0,
+  0, 0, 29, 0, 0, 0, 38, 88, 0, 0,
+  38, 0, 13, 0, 33, 104, 68, 26, 0, 0,
+  8, 50, 0, 0, 0, 10, 0, 4, 0, 0,
+  0, 20, 0, 11, 1, 0, 0, 0, 0, 16,
+  0, 0, 0, 7, 0, 77, 0, 0, 52, 0,
+  26, 23, 6, 0, 25, 0, 0, 6, 24, 0,
+  92, 16, 18, 73, 0, 0, 0, 73, 0, 0,
+  0, 50, 0, 0, 0, 0, 11, 59, 10, 49,
+  0, 55, 10, 0, 0, 37, 0, 0, 5, 0,
+  13, 0, 23, 61, 29, 7, 1, 0, 19, 2,
+  0, 26, 0, 53, 0, 7, 0, 0, 0, 23,
+  69, 0, 1, 0, 0, 31, 0, 0, 4, 0,
+  0, 61, 44, 0, 0, 0, 25, 73, 0, 0,
+  7, 0, 0, 0, 26, 81, 0, 0, 48, 0,
+  0, 0, 40, 70, 0, 48, 0, 0, 0, 16,
+  0, 0, 0, 0, 0, 39, 0, 0, 0, 36,
+  0, 27, 0, 6, 0, 0, 20, 1, 0, 24,
+  22, 0, 0, 39, 0, 0, 0, 0, 10, 25,
+  0, 0, 31, 12, 0, 4, 0, 0, 87, 23,
+  22, 30, 0, 6, 0, 43, 7, 0, 0, 5,
+  0, 16, 0, 0, 0, 7, 9, 33, 0, 49,
+  1, 0, 0, 56, 0, 0, 0, 0, 0, 0,
+  17, 64, 6, 22, 16, 0, 10, 13, 0, 13,
+  8, 65, 0, 0, 0, 0, 0, 16, 82, 0,
+  8, 0, 12, 7, 0, 0, 0, 7, 4, 20,
+  0, 47, 63, 0, 0, 0, 0, 0, 44, 1,
+  0, 11, 10, 3, 0, 58, 41, 16, 11, 0,
+  10, 0, 65, 40, 0, 0, 36, 16, 0, 0,
+  0, 0, 20, 0, 20, 14, 0, 0, 0, 16,
+  0, 3, 0, 22, 0, 2, 0, 0, 0, 1,
+  57, 3, 31, 0, 0, 0, 29, 0, 0, 14,
+  3, 0, 0, 0, 16, 0, 39, 2, 0, 0,
+  0, 0, 0, 49, 17, 0, 0, 86, 0, 30,
+  13, 0, 52, 56, 3, 30, 0, 29, 23, 24,
+  50, 0, 0, 0, 17, 0, 0, 0, 0, 53,
+  48, 0, 0, 0, 13, 0, 61, 0, 0, 31,
+  25, 0, 0, 5, 0, 0, 7, 0, 0, 16,
+  0, 0, 30, 0, 18, 13, 0, 31, 103, 0,
+  37, 5, 6, 15, 0, 0, 15, 0, 0, 23,
+  47, 54, 0, 0, 22, 0, 6, 0, 0, 173,
+  80, 13, 0, 0, 0, 33, 0, 0, 2, 56,
+  0, 34, 0, 21, 0, 29, 0, 25, 0, 22,
+  0, 0, 27, 6, 10, 8, 0, 0, 0, 77,
+  0, 0, 89, 0, 43, 20, 45, 0, 35, 11,
+  0, 32, 30, 49, 7, 15, 23, 23, 7, 28,
+  0, 22, 0, 0, 3, 45, 0, 13, 0, 0,
+  4, 42, 8, 27, 0, 9, 0, 0, 0, 0,
+  8, 0, 7, 0, 24, 0, 27, 61, 2, 0,
+  25, 0, 40, 28, 4, 8, 10, 35, 4, 0,
+  0, 0, 0, 15, 78, 0, 23, 10, 0, 35,
+  0, 0, 20, 3, 3, 48, 45, 0, 0, 0,
+  22, 82, 0, 0, 8, 0, 0, 0, 29, 61,
+  0, 8, 48, 0, 0, 0, 21, 71, 5, 41,
+  10, 3, 0, 14, 0, 2, 0, 9, 0, 69,
+  34, 19, 0, 41, 0, 34, 7, 20, 0, 34,
+  59, 23, 26, 10, 5, 0, 0, 0, 0, 0,
+  0, 0, 18, 22, 10, 15, 30, 39, 10, 0,
+  0, 0, 16, 36, 52, 0, 27, 32, 3, 0,
+  12, 28, 0, 21, 0, 48, 0, 2, 0, 34,
+  13, 5, 17, 11, 0, 25, 0, 47, 10, 1,
+  26, 5, 0, 0, 0, 67, 13, 0, 12, 0,
+  16, 0, 0, 15, 0, 51, 0, 0, 0, 0,
+  0, 0, 69, 0, 19, 0, 19, 11, 0, 0,
+  29, 2, 31, 0, 0, 44, 27, 0, 33, 0,
+  0, 0, 76, 0, 0, 1, 67, 69, 11, 51,
+  63, 32, 6, 0, 66, 0, 0, 38, 0, 0,
+  28, 40, 0, 0, 0, 0, 7, 0, 0, 0,
+  0, 27, 0, 47, 0, 0, 0, 20, 0, 38,
+  0, 0, 0, 16, 0, 34, 21, 7, 0, 0,
+  0, 8, 0, 0, 0, 0, 0, 0, 0, 0,
+  98, 0, 25, 5, 0, 0, 0, 78, 9, 0,
+  0, 35, 0, 0, 12, 5, 38, 41, 20, 53,
+  0, 44, 32, 14, 27, 37, 0, 13, 0, 0,
+  0, 0, 28, 63, 38, 0, 0, 0, 0, 0,
+  3, 36, 0, 61, 0, 0, 0, 5, 3, 0,
+  4, 0, 0, 0, 0, 0, 77, 0, 26, 0,
+  18, 21, 29, 0, 57, 0, 12, 30, 0, 0,
+  52, 0, 0, 2, 43, 101, 14, 0, 40, 0,
+  0, 0, 32, 66, 0, 35, 0, 0, 0, 29,
+  0, 8, 0, 0, 0, 11, 0, 0, 0, 50,
+  0, 48, 0, 31, 0, 0, 0, 0, 0, 0,
+  6, 9, 0, 67, 0, 0, 11, 0, 13, 40,
+  0, 0, 5, 7, 0, 44, 0, 15, 58, 0,
+  30, 45, 0, 14, 0, 32, 0, 0, 0, 10,
+  0, 27, 0, 3, 29, 32, 45, 49, 0, 64,
+  21, 0, 0, 14, 0, 0, 0, 0, 0, 0,
+  30, 78, 0, 0, 0, 0, 0, 18, 0, 23,
+  14, 57, 17, 0, 0, 0, 29, 0, 59, 1,
+  9, 2, 0, 17, 0, 0, 0, 0, 0, 41,
+  0, 0, 0, 0, 31, 51, 0, 0, 37, 2,
+  0, 0, 4, 70, 43, 0, 24, 35, 0, 14,
+  56, 0, 0, 39, 0, 0, 9, 13, 0, 36,
+  0, 0, 0, 14, 0, 0, 0, 19, 0, 41,
+  0, 0, 0, 5, 3, 0, 4, 0, 0, 0,
+  23, 13, 20, 0, 0, 0, 18, 34, 0, 0,
+  4, 17, 0, 0, 0, 0, 21, 0, 0, 0,
+  0, 23, 10, 1, 39, 9, 0, 0, 1, 25,
+  3, 20, 0, 8, 17, 5, 38, 41, 32, 19,
+  10, 0, 6, 0, 0, 0, 0, 5, 45, 39,
+  4, 0, 0, 0, 0, 31, 0, 9, 12, 73,
+  0, 0, 0, 0, 2, 0, 65, 11, 0, 5,
+  37, 0, 20, 0, 0, 11, 0, 8, 52, 0,
+  43, 0, 22, 0, 0, 0, 29, 0, 0, 0,
+  38, 88, 0, 0, 38, 0, 13, 0, 33, 104,
+  68, 26, 0, 0, 8, 50, 0, 0, 0, 10,
+  0, 4, 0, 0, 0, 20, 0, 11, 1, 0,
+  0, 0, 0, 16, 0, 0, 0, 7, 0, 77,
+  0, 0, 52, 0, 26, 23, 6, 0, 25, 0,
+  0, 6, 24, 0, 92, 16, 18, 73, 0, 0,
+  0, 73, 0, 0, 0, 50, 0, 0, 0, 0,
+  11, 59, 10, 49, 0, 55, 10, 0, 0, 37,
+  0, 0, 5, 0, 13, 0, 23, 61, 29, 7,
+  1, 0, 19, 2, 0, 26, 0, 53, 0, 7,
+  0, 0, 0, 23, 69, 0, 1, 0, 0, 31,
+  0, 0, 4, 0, 0, 61, 44, 0, 0, 0,
+  25, 73, 0, 0, 7, 0, 0, 0, 26, 81,
+  0, 0, 48, 0, 0, 0, 40, 70, 0, 48,
+  0, 0, 0, 16, 0, 0, 0, 0, 0, 39,
+  0, 0, 0, 36, 0, 27, 0, 6, 0, 0,
+  20, 1, 0, 24, 22, 0, 0, 39, 0, 0,
+  0, 0, 10, 25, 0, 0, 31, 12, 0, 4,
+  0, 0, 87, 23, 22, 30, 0, 6, 0, 43,
+  7, 0, 0, 5, 0, 16, 0, 0, 0, 7,
+  9, 33, 0, 49, 1, 0, 0, 56, 0, 0,
+  0, 0, 0, 0, 17, 64, 6, 22, 16, 0,
+  10, 13, 0, 13, 8, 65, 0, 0, 0, 0,
+  0, 16, 82, 0, 8, 0, 12, 7, 0, 0,
+  0, 7, 4, 20, 0, 17, 0, 0, 21, 28,
+  30, 14, 58, 16, 0, 5, 32, 30, 51, 35,
+  42, 53, 0, 21, 81, 0, 0, 49, 7, 50,
+  21, 0, 0, 19, 0, 0, 2, 16, 18, 0,
+  0, 7, 0, 43, 0, 40, 0, 33, 27, 19,
+  0, 12, 0, 0, 23, 0, 84, 2, 0, 0,
+  0, 0, 0, 29, 0, 0, 0, 0, 0, 0,
+  33, 0, 0, 0, 0, 25, 18, 30, 44, 27,
+  0, 0, 0, 44, 47, 23, 14, 0, 26, 7,
+  56, 14, 51, 35, 8, 27, 0, 39, 0, 19,
+  0, 4, 43, 43, 0, 0, 0, 0, 0, 0,
+  8, 13, 9, 61, 0, 0, 0, 0, 12, 0,
+  28, 21, 21, 0, 50, 0, 111, 0, 14, 14,
+  3, 0, 103, 0, 37, 5, 6, 15, 0, 0,
+  15, 0, 0, 23, 47, 54, 0, 0, 22, 0,
+  6, 0, 0, 173, 80, 13, 0, 0, 0, 33,
+  0, 0, 2, 56, 0, 34, 0, 21, 0, 29,
+  0, 25, 0, 22, 0, 0, 27, 6, 10, 8,
+  0, 0, 0, 77, 0, 0, 89, 0, 43, 20,
+  45, 0, 35, 11, 0, 32, 30, 49, 7, 15,
+  23, 23, 7, 28, 0, 22, 0, 0, 3, 45,
+  0, 13, 0, 0, 4, 42, 8, 27, 0, 9,
+  0, 0, 0, 0, 8, 0, 7, 0, 24, 0,
+  27, 61, 2, 0, 25, 0, 40, 28, 4, 8,
+  10, 35, 4, 0, 0, 0, 0, 15, 78, 0,
+  23, 10, 0, 35, 0, 0, 20, 3, 3, 48,
+  45, 0, 0, 0, 22, 82, 0, 0, 8, 0,
+  0, 0, 29, 61, 0, 8, 48, 0, 0, 0,
+  21, 71, 5, 41, 10, 3, 0, 14, 0, 2,
+  0, 9, 0, 69, 34, 19, 0, 41, 0, 34,
+  7, 20, 0, 34, 59, 23, 26, 10, 5, 0,
+  0, 0, 0, 0, 0, 0, 18, 22, 10, 15,
+  30, 39, 10, 0, 0, 0, 16, 36, 52, 0,
+  27, 32, 3, 0, 12, 28, 0, 21, 0, 48,
+  0, 2, 0, 34, 13, 5, 17, 11, 0, 25,
+  0, 47, 10, 1, 26, 5, 0, 0, 0, 67,
+  13, 0, 12, 0, 16, 0, 0, 15, 0, 51,
+  0, 0, 0, 0, 0, 0, 69, 0, 19, 0,
+  19, 11, 0, 0, 29, 2, 31, 0, 0, 24,
+  0, 0, 40, 11, 0, 0, 61, 11, 0, 15,
+  51, 85, 31, 58, 61, 16, 0, 9, 60, 0,
+  0, 53, 11, 51, 1, 8, 0, 10, 0, 0,
+  0, 42, 35, 0, 15, 23, 0, 51, 12, 18,
+  0, 69, 33, 20, 9, 0, 0, 0, 24, 0,
+  57, 28, 0, 0, 0, 2, 0, 18, 0, 0,
+  0, 0, 0, 0, 31, 0, 42, 0, 0, 0,
+  4, 14, 36, 12, 0, 6, 0, 29, 44, 60,
+  4, 0, 34, 12, 53, 16, 53, 25, 0, 50,
+  0, 27, 0, 9, 0, 0, 31, 64, 0, 0,
+  0, 0, 0, 0, 0, 12, 10, 60, 0, 0,
+  0, 0, 0, 0, 10, 13, 32, 0, 25, 0,
+  76, 0, 51, 15, 31, 0, 29, 0, 57, 0,
+  12, 30, 0, 0, 52, 0, 0, 2, 43, 101,
+  14, 0, 40, 0, 0, 0, 32, 66, 0, 35,
+  0, 0, 0, 29, 0, 8, 0, 0, 0, 11,
+  0, 0, 0, 50, 0, 48, 0, 31, 0, 0,
+  0, 0, 0, 0, 6, 9, 0, 67, 0, 0,
+  11, 0, 13, 40, 0, 0, 5, 7, 0, 44,
+  0, 15, 58, 0, 30, 45, 0, 14, 0, 32,
+  0, 0, 0, 10, 0, 27, 0, 3, 29, 32,
+  45, 49, 0, 64, 21, 0, 0, 14, 0, 0,
+  0, 0, 0, 0, 30, 78, 0, 0, 0, 0,
+  0, 18, 0, 23, 14, 57, 17, 0, 0, 0,
+  29, 0, 59, 1, 9, 2, 0, 17, 0, 0,
+  0, 0, 0, 41, 0, 0, 0, 0, 31, 51,
+  0, 0, 37, 2, 0, 0, 4, 70, 43, 0,
+  24, 35, 0, 14, 56, 0, 0, 39, 0, 0,
+  9, 13, 0, 36, 0, 0, 0, 14, 0, 0,
+  0, 19, 0, 41, 0, 0, 0, 5, 3, 0,
+  4, 0, 0, 0, 23, 13, 20, 0, 0, 0,
+  18, 34, 0, 0, 4, 17, 0, 0, 0, 0,
+  21, 0, 0, 0, 0, 23, 10, 1, 39, 9,
+  0, 0, 1, 25, 3, 20, 0, 8, 17, 5,
+  38, 41, 32, 19, 10, 0, 6, 0, 0, 0,
+  0, 5, 45, 39, 4, 0, 0, 0, 0, 31,
+  0, 9, 12, 73, 0, 0, 0, 0, 2, 0,
+  65, 11, 0, 5, 37, 0, 20, 0, 0, 11,
+  0, 8, 0, 32, 0, 0, 31, 0, 19, 0,
+  50, 0, 0, 16, 7, 64, 58, 24, 16, 46,
+  0, 28, 76, 0, 0, 47, 16, 40, 25, 0,
+  0, 27, 0, 0, 0, 37, 5, 0, 0, 0,
+  0, 29, 0, 1, 0, 41, 21, 3, 4, 6,
+  0, 0, 60, 0, 56, 11, 0, 0, 8, 6,
+  0, 26, 13, 0, 0, 0, 0, 0, 17, 6,
+  0, 0, 0, 25, 0, 0, 41, 13, 0, 0,
+  0, 30, 48, 39, 12, 0, 31, 0, 58, 23,
+  37, 56, 3, 0, 8, 19, 0, 16, 0, 10,
+  57, 33, 0, 0, 0, 0, 0, 0, 23, 0,
+  31, 59, 0, 0, 0, 1, 24, 0, 21, 0,
+  8, 0, 47, 0, 77, 0, 1, 23, 9, 0,
+  44, 0, 0, 0, 25, 73, 0, 0, 7, 0,
+  0, 0, 26, 81, 0, 0, 48, 0, 0, 0,
+  40, 70, 0, 48, 0, 0, 0, 16, 0, 0,
+  0, 0, 0, 39, 0, 0, 0, 36, 0, 27,
+  0, 6, 0, 0, 20, 1, 0, 24, 22, 0,
+  0, 39, 0, 0, 0, 0, 10, 25, 0, 0,
+  31, 12, 0, 4, 0, 0, 87, 23, 22, 30,
+  0, 6, 0, 43, 7, 0, 0, 5, 0, 16,
+  0, 0, 0, 7, 9, 33, 0, 49, 1, 0,
+  0, 56, 0, 0, 0, 0, 0, 0, 17, 64,
+  6, 22, 16, 0, 10, 13, 0, 13, 8, 65,
+  0, 0, 0, 0, 0, 16, 82, 0, 8, 0,
+  12, 7, 0, 0, 0, 7, 4, 20, 0, 17,
+  0, 0, 21, 28, 30, 14, 58, 16, 0, 5,
+  32, 30, 51, 35, 42, 53, 0, 21, 81, 0,
+  0, 49, 7, 50, 21, 0, 0, 19, 0, 0,
+  2, 16, 18, 0, 0, 7, 0, 43, 0, 40,
+  0, 33, 27, 19, 0, 12, 0, 0, 23, 0,
+  84, 2, 0, 0, 0, 0, 0, 29, 0, 0,
+  0, 0, 0, 0, 33, 0, 0, 0, 0, 25,
+  18, 30, 44, 27, 0, 0, 0, 44, 47, 23,
+  14, 0, 26, 7, 56, 14, 51, 35, 8, 27,
+  0, 39, 0, 19, 0, 4, 43, 43, 0, 0,
+  0, 0, 0, 0, 8, 13, 9, 61, 0, 0,
+  0, 0, 12, 0, 28, 21, 21, 0, 50, 0,
+  111, 0, 14, 14, 3, 0, 0, 47, 23, 0,
+  8, 0, 33, 0, 55, 0, 0, 17, 28, 56,
+  45, 66, 49, 49, 0, 15, 78, 0, 0, 46,
+  13, 29, 27, 0, 0, 0, 14, 0, 11, 19,
+  4, 0, 0, 0, 0, 33, 12, 13, 0, 55,
+  6, 0, 0, 0, 0, 0, 63, 12, 64, 29,
+  0, 0, 0, 0, 0, 23, 0, 0, 0, 0,
+  0, 0, 42, 0, 0, 0, 0, 0, 0, 41,
+  36, 0, 0, 29, 0, 27, 65, 51, 36, 6,
+  50, 11, 55, 0, 58, 33, 0, 14, 0, 30,
+  0, 20, 0, 12, 43, 51, 0, 0, 0, 0,
+  0, 0, 5, 6, 14, 33, 30, 0, 0, 0,
+  41, 0, 0, 0, 5, 0, 0, 0, 81, 0,
+  6, 22, 17, 0, 45, 0, 0, 0, 22, 82,
+  0, 0, 8, 0, 0, 0, 29, 61, 0, 8,
+  48, 0, 0, 0, 21, 71, 5, 41, 10, 3,
+  0, 14, 0, 2, 0, 9, 0, 69, 34, 19,
+  0, 41, 0, 34, 7, 20, 0, 34, 59, 23,
+  26, 10, 5, 0, 0, 0, 0, 0, 0, 0,
+  18, 22, 10, 15, 30, 39, 10, 0, 0, 0,
+  16, 36, 52, 0, 27, 32, 3, 0, 12, 28,
+  0, 21, 0, 48, 0, 2, 0, 34, 13, 5,
+  17, 11, 0, 25, 0, 47, 10, 1, 26, 5,
+  0, 0, 0, 67, 13, 0, 12, 0, 16, 0,
+  0, 15, 0, 51, 0, 0, 0, 0, 0, 0,
+  69, 0, 19, 0, 19, 11, 0, 0, 29, 2,
+  31, 0, 0, 24, 0, 0, 40, 11, 0, 0,
+  61, 11, 0, 15, 51, 85, 31, 58, 61, 16,
+  0, 9, 60, 0, 0, 53, 11, 51, 1, 8,
+  0, 10, 0, 0, 0, 42, 35, 0, 15, 23,
+  0, 51, 12, 18, 0, 69, 33, 20, 9, 0,
+  0, 0, 24, 0, 57, 28, 0, 0, 0, 2,
+  0, 18, 0, 0, 0, 0, 0, 0, 31, 0,
+  42, 0, 0, 0, 4, 14, 36, 12, 0, 6,
+  0, 29, 44, 60, 4, 0, 34, 12, 53, 16,
+  53, 25, 0, 50, 0, 27, 0, 9, 0, 0,
+  31, 64, 0, 0, 0, 0, 0, 0, 0, 12,
+  10, 60, 0, 0, 0, 0, 0, 0, 10, 13,
+  32, 0, 25, 0, 76, 0, 51, 15, 31, 0,
+  0, 35, 50, 0, 10, 0, 0, 0, 51, 2,
+  0, 18, 8, 100, 10, 27, 39, 26, 2, 4,
+  44, 0, 34, 24, 0, 0, 0, 5, 0, 0,
+  0, 0, 0, 0, 0, 0, 5, 0, 0, 22,
+  18, 0, 0, 35, 0, 0, 0, 0, 0, 0,
+  52, 66, 0, 34, 0, 0, 6, 2, 0, 0,
+  0, 0, 13, 0, 38, 2, 22, 0, 23, 0,
+  0, 0, 3, 15, 29, 0, 0, 37, 0, 21,
+  32, 48, 11, 18, 40, 3, 53, 7, 75, 6,
+  0, 23, 0, 0, 0, 1, 0, 0, 40, 70,
+  1, 0, 0, 0, 7, 0, 0, 9, 0, 8,
+  32, 0, 0, 0, 57, 0, 10, 0, 12, 0,
+  0, 0, 8, 0, 9, 14, 37, 0, 0, 0,
+  0, 0, 31, 51, 0, 0, 37, 2, 0, 0,
+  4, 70, 43, 0, 24, 35, 0, 14, 56, 0,
+  0, 39, 0, 0, 9, 13, 0, 36, 0, 0,
+  0, 14, 0, 0, 0, 19, 0, 41, 0, 0,
+  0, 5, 3, 0, 4, 0, 0, 0, 23, 13,
+  20, 0, 0, 0, 18, 34, 0, 0, 4, 17,
+  0, 0, 0, 0, 21, 0, 0, 0, 0, 23,
+  10, 1, 39, 9, 0, 0, 1, 25, 3, 20,
+  0, 8, 17, 5, 38, 41, 32, 19, 10, 0,
+  6, 0, 0, 0, 0, 5, 45, 39, 4, 0,
+  0, 0, 0, 31, 0, 9, 12, 73, 0, 0,
+  0, 0, 2, 0, 65, 11, 0, 5, 37, 0,
+  20, 0, 0, 11, 0, 8, 0, 32, 0, 0,
+  31, 0, 19, 0, 50, 0, 0, 16, 7, 64,
+  58, 24, 16, 46, 0, 28, 76, 0, 0, 47,
+  16, 40, 25, 0, 0, 27, 0, 0, 0, 37,
+  5, 0, 0, 0, 0, 29, 0, 1, 0, 41,
+  21, 3, 4, 6, 0, 0, 60, 0, 56, 11,
+  0, 0, 8, 6, 0, 26, 13, 0, 0, 0,
+  0, 0, 17, 6, 0, 0, 0, 25, 0, 0,
+  41, 13, 0, 0, 0, 30, 48, 39, 12, 0,
+  31, 0, 58, 23, 37, 56, 3, 0, 8, 19,
+  0, 16, 0, 10, 57, 33, 0, 0, 0, 0,
+  0, 0, 23, 0, 31, 59, 0, 0, 0, 1,
+  24, 0, 21, 0, 8, 0, 47, 0, 77, 0,
+  1, 23, 9, 0, 0, 86, 6, 8, 42, 0,
+  32, 0, 64, 4, 0, 0, 6, 42, 74, 53,
+  38, 43, 0, 27, 68, 0, 0, 42, 0, 47,
+  25, 9, 0, 24, 6, 0, 0, 29, 9, 0,
+  0, 0, 0, 25, 0, 26, 0, 59, 9, 0,
+  0, 24, 0, 0, 45, 0, 88, 34, 0, 0,
+  0, 0, 0, 9, 6, 0, 0, 0, 0, 0,
+  36, 0, 0, 0, 0, 0, 0, 17, 64, 0,
+  2, 0, 1, 0, 91, 28, 8, 0, 51, 13,
+  35, 13, 47, 25, 0, 0, 0, 32, 0, 22,
+  0, 0, 48, 22, 0, 7, 0, 0, 23, 0,
+  25, 21, 43, 64, 10, 0, 0, 0, 29, 0,
+  0, 0, 18, 0, 4, 0, 74, 0, 0, 37,
+  25, 0, 0, 17, 0, 0, 21, 28, 30, 14,
+  58, 16, 0, 5, 32, 30, 51, 35, 42, 53,
+  0, 21, 81, 0, 0, 49, 7, 50, 21, 0,
+  0, 19, 0, 0, 2, 16, 18, 0, 0, 7,
+  0, 43, 0, 40, 0, 33, 27, 19, 0, 12,
+  0, 0, 23, 0, 84, 2, 0, 0, 0, 0,
+  0, 29, 0, 0, 0, 0, 0, 0, 33, 0,
+  0, 0, 0, 25, 18, 30, 44, 27, 0, 0,
+  0, 44, 47, 23, 14, 0, 26, 7, 56, 14,
+  51, 35, 8, 27, 0, 39, 0, 19, 0, 4,
+  43, 43, 0, 0, 0, 0, 0, 0, 8, 13,
+  9, 61, 0, 0, 0, 0, 12, 0, 28, 21,
+  21, 0, 50, 0, 111, 0, 14, 14, 3, 0,
+  0, 47, 23, 0, 8, 0, 33, 0, 55, 0,
+  0, 17, 28, 56, 45, 66, 49, 49, 0, 15,
+  78, 0, 0, 46, 13, 29, 27, 0, 0, 0,
+  14, 0, 11, 19, 4, 0, 0, 0, 0, 33,
+  12, 13, 0, 55, 6, 0, 0, 0, 0, 0,
+  63, 12, 64, 29, 0, 0, 0, 0, 0, 23,
+  0, 0, 0, 0, 0, 0, 42, 0, 0, 0,
+  0, 0, 0, 41, 36, 0, 0, 29, 0, 27,
+  65, 51, 36, 6, 50, 11, 55, 0, 58, 33,
+  0, 14, 0, 30, 0, 20, 0, 12, 43, 51,
+  0, 0, 0, 0, 0, 0, 5, 6, 14, 33,
+  30, 0, 0, 0, 41, 0, 0, 0, 5, 0,
+  0, 0, 81, 0, 6, 22, 17, 0, 0, 43,
+  70, 0, 11, 0, 9, 0, 57, 6, 0, 0,
+  0, 60, 23, 63, 30, 38, 0, 12, 39, 0,
+  33, 35, 0, 0, 9, 14, 0, 0, 27, 0,
+  0, 0, 0, 0, 0, 17, 0, 12, 27, 0,
+  0, 40, 0, 0, 0, 0, 0, 0, 48, 52,
+  41, 12, 0, 0, 19, 12, 0, 0, 0, 0,
+  0, 0, 24, 0, 45, 0, 11, 4, 0, 0,
+  0, 28, 32, 0, 0, 18, 0, 0, 58, 19,
+  0, 21, 59, 13, 23, 9, 64, 10, 0, 32,
+  0, 0, 0, 0, 0, 0, 40, 51, 0, 0,
+  0, 0, 36, 0, 0, 22, 4, 24, 40, 0,
+  0, 0, 86, 0, 2, 0, 26, 0, 0, 1,
+  21, 0, 0, 24, 22, 0, 0, 24, 0, 0,
+  40, 11, 0, 0, 61, 11, 0, 15, 51, 85,
+  31, 58, 61, 16, 0, 9, 60, 0, 0, 53,
+  11, 51, 1, 8, 0, 10, 0, 0, 0, 42,
+  35, 0, 15, 23, 0, 51, 12, 18, 0, 69,
+  33, 20, 9, 0, 0, 0, 24, 0, 57, 28,
+  0, 0, 0, 2, 0, 18, 0, 0, 0, 0,
+  0, 0, 31, 0, 42, 0, 0, 0, 4, 14,
+  36, 12, 0, 6, 0, 29, 44, 60, 4, 0,
+  34, 12, 53, 16, 53, 25, 0, 50, 0, 27,
+  0, 9, 0, 0, 31, 64, 0, 0, 0, 0,
+  0, 0, 0, 12, 10, 60, 0, 0, 0, 0,
+  0, 0, 10, 13, 32, 0, 25, 0, 76, 0,
+  51, 15, 31, 0, 0, 35, 50, 0, 10, 0,
+  0, 0, 51, 2, 0, 18, 8, 100, 10, 27,
+  39, 26, 2, 4, 44, 0, 34, 24, 0, 0,
+  0, 5, 0, 0, 0, 0, 0, 0, 0, 0,
+  5, 0, 0, 22, 18, 0, 0, 35, 0, 0,
+  0, 0, 0, 0, 52, 66, 0, 34, 0, 0,
+  6, 2, 0, 0, 0, 0, 13, 0, 38, 2,
+  22, 0, 23, 0, 0, 0, 3, 15, 29, 0,
+  0, 37, 0, 21, 32, 48, 11, 18, 40, 3,
+  53, 7, 75, 6, 0, 23, 0, 0, 0, 1,
+  0, 0, 40, 70, 1, 0, 0, 0, 7, 0,
+  0, 9, 0, 8, 32, 0, 0, 0, 57, 0,
+  10, 0, 12, 0, 0, 0, 8, 0, 9, 14,
+  37, 0, 22, 0, 59, 0, 0, 0, 0, 0,
+  23, 0, 0, 0, 0, 116, 1, 0, 6, 27,
+  1, 0, 38, 30, 84, 8, 0, 0, 0, 4,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+  0, 0, 28, 17, 0, 30, 0, 0, 0, 0,
+  0, 0, 35, 131, 0, 15, 36, 0, 30, 17,
+  14, 0, 0, 0, 34, 0, 88, 47, 7, 2,
+  16, 67, 0, 0, 0, 0, 11, 0, 0, 0,
+  0, 24, 16, 22, 0, 15, 41, 0, 31, 10,
+  71, 0, 0, 11, 2, 0, 0, 5, 0, 0,
+  62, 66, 0, 0, 0, 0, 12, 10, 0, 7,
+  0, 0, 50, 0, 0, 0, 91, 3, 77, 0,
+  19, 0, 0, 0, 0, 0, 21, 6, 10, 0,
+  0, 32, 0, 0, 31, 0, 19, 0, 50, 0,
+  0, 16, 7, 64, 58, 24, 16, 46, 0, 28,
+  76, 0, 0, 47, 16, 40, 25, 0, 0, 27,
+  0, 0, 0, 37, 5, 0, 0, 0, 0, 29,
+  0, 1, 0, 41, 21, 3, 4, 6, 0, 0,
+  60, 0, 56, 11, 0, 0, 8, 6, 0, 26,
+  13, 0, 0, 0, 0, 0, 17, 6, 0, 0,
+  0, 25, 0, 0, 41, 13, 0, 0, 0, 30,
+  48, 39, 12, 0, 31, 0, 58, 23, 37, 56,
+  3, 0, 8, 19, 0, 16, 0, 10, 57, 33,
+  0, 0, 0, 0, 0, 0, 23, 0, 31, 59,
+  0, 0, 0, 1, 24, 0, 21, 0, 8, 0,
+  47, 0, 77, 0, 1, 23, 9, 0, 0, 86,
+  6, 8, 42, 0, 32, 0, 64, 4, 0, 0,
+  6, 42, 74, 53, 38, 43, 0, 27, 68, 0,
+  0, 42, 0, 47, 25, 9, 0, 24, 6, 0,
+  0, 29, 9, 0, 0, 0, 0, 25, 0, 26,
+  0, 59, 9, 0, 0, 24, 0, 0, 45, 0,
+  88, 34, 0, 0, 0, 0, 0, 9, 6, 0,
+  0, 0, 0, 0, 36, 0, 0, 0, 0, 0,
+  0, 17, 64, 0, 2, 0, 1, 0, 91, 28,
+  8, 0, 51, 13, 35, 13, 47, 25, 0, 0,
+  0, 32, 0, 22, 0, 0, 48, 22, 0, 7,
+  0, 0, 23, 0, 25, 21, 43, 64, 10, 0,
+  0, 0, 29, 0, 0, 0, 18, 0, 4, 0,
+  74, 0, 0, 37, 25, 0, 0, 96, 8, 3,
+  33, 0, 35, 0, 85, 3, 0, 27, 4, 58,
+  40, 66, 33, 44, 0, 33, 67, 0, 11, 33,
+  0, 10, 35, 17, 0, 0, 0, 0, 16, 0,
+  0, 0, 0, 12, 0, 0, 0, 9, 0, 67,
+  0, 25, 0, 38, 0, 0, 28, 0, 77, 30,
+  0, 0, 25, 0, 0, 0, 0, 0, 0, 0,
+  2, 0, 21, 0, 17, 0, 0, 0, 18, 29,
+  78, 0, 11, 0, 0, 0, 78, 36, 3, 0,
+  35, 3, 44, 7, 36, 20, 0, 27, 0, 26,
+  0, 8, 0, 0, 61, 33, 8, 16, 0, 0,
+  58, 0, 22, 29, 12, 37, 7, 0, 0, 0,
+  41, 0, 0, 0, 20, 0, 0, 0, 52, 0,
+  0, 31, 46, 0, 0, 47, 23, 0, 8, 0,
+  33, 0, 55, 0, 0, 17, 28, 56, 45, 66,
+  49, 49, 0, 15, 78, 0, 0, 46, 13, 29,
+  27, 0, 0, 0, 14, 0, 11, 19, 4, 0,
+  0, 0, 0, 33, 12, 13, 0, 55, 6, 0,
+  0, 0, 0, 0, 63, 12, 64, 29, 0, 0,
+  0, 0, 0, 23, 0, 0, 0, 0, 0, 0,
+  42, 0, 0, 0, 0, 0, 0, 41, 36, 0,
+  0, 29, 0, 27, 65, 51, 36, 6, 50, 11,
+  55, 0, 58, 33, 0, 14, 0, 30, 0, 20,
+  0, 12, 43, 51, 0, 0, 0, 0, 0, 0,
+  5, 6, 14, 33, 30, 0, 0, 0, 41, 0,
+  0, 0, 5, 0, 0, 0, 81, 0, 6, 22,
+  17, 0, 0, 43, 70, 0, 11, 0, 9, 0,
+  57, 6, 0, 0, 0, 60, 23, 63, 30, 38,
+  0, 12, 39, 0, 33, 35, 0, 0, 9, 14,
+  0, 0, 27, 0, 0, 0, 0, 0, 0, 17,
+  0, 12, 27, 0, 0, 40, 0, 0, 0, 0,
+  0, 0, 48, 52, 41, 12, 0, 0, 19, 12,
+  0, 0, 0, 0, 0, 0, 24, 0, 45, 0,
+  11, 4, 0, 0, 0, 28, 32, 0, 0, 18,
+  0, 0, 58, 19, 0, 21, 59, 13, 23, 9,
+  64, 10, 0, 32, 0, 0, 0, 0, 0, 0,
+  40, 51, 0, 0, 0, 0, 36, 0, 0, 22,
+  4, 24, 40, 0, 0, 0, 86, 0, 2, 0,
+  26, 0, 0, 1, 21, 0, 0, 24, 22, 0,
+  0, 1, 54, 0, 0, 0, 0, 0, 42, 0,
+  0, 7, 0, 86, 0, 0, 1, 43, 0, 15,
+  50, 15, 93, 16, 0, 0, 0, 18, 0, 0,
+  16, 0, 0, 0, 0, 0, 0, 25, 0, 0,
+  34, 33, 0, 35, 0, 0, 0, 17, 0, 0,
+  34, 96, 0, 0, 21, 0, 40, 0, 14, 0,
+  0, 2, 21, 0, 100, 23, 1, 3, 2, 71,
+  0, 0, 0, 0, 18, 0, 0, 0, 0, 0,
+  25, 5, 0, 25, 63, 0, 32, 16, 62, 0,
+  0, 28, 0, 0, 0, 0, 0, 0, 67, 44,
+  0, 0, 0, 0, 26, 0, 0, 29, 0, 5,
+  41, 0, 0, 0, 99, 0, 45, 0, 46, 0,
+  0, 13, 0, 0, 0, 6, 19, 0, 0, 35,
+  50, 0, 10, 0, 0, 0, 51, 2, 0, 18,
+  8, 100, 10, 27, 39, 26, 2, 4, 44, 0,
+  34, 24, 0, 0, 0, 5, 0, 0, 0, 0,
+  0, 0, 0, 0, 5, 0, 0, 22, 18, 0,
+  0, 35, 0, 0, 0, 0, 0, 0, 52, 66,
+  0, 34, 0, 0, 6, 2, 0, 0, 0, 0,
+  13, 0, 38, 2, 22, 0, 23, 0, 0, 0,
+  3, 15, 29, 0, 0, 37, 0, 21, 32, 48,
+  11, 18, 40, 3, 53, 7, 75, 6, 0, 23,
+  0, 0, 0, 1, 0, 0, 40, 70, 1, 0,
+  0, 0, 7, 0, 0, 9, 0, 8, 32, 0,
+  0, 0, 57, 0, 10, 0, 12, 0, 0, 0,
+  8, 0, 9, 14, 37, 0, 22, 0, 59, 0,
+  0, 0, 0, 0, 23, 0, 0, 0, 0, 116,
+  1, 0, 6, 27, 1, 0, 38, 30, 84, 8,
+  0, 0, 0, 4, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 2, 0, 0, 28, 17, 0, 30,
+  0, 0, 0, 0, 0, 0, 35, 131, 0, 15,
+  36, 0, 30, 17, 14, 0, 0, 0, 34, 0,
+  88, 47, 7, 2, 16, 67, 0, 0, 0, 0,
+  11, 0, 0, 0, 0, 24, 16, 22, 0, 15,
+  41, 0, 31, 10, 71, 0, 0, 11, 2, 0,
+  0, 5, 0, 0, 62, 66, 0, 0, 0, 0,
+  12, 10, 0, 7, 0, 0, 50, 0, 0, 0,
+  91, 3, 77, 0, 19, 0, 0, 0, 0, 0,
+  21, 6, 10, 0, 20, 0, 19, 16, 0, 0,
+  0, 0, 29, 0, 0, 0, 2, 73, 0, 0,
+  0, 28, 8, 5, 49, 5, 52, 6, 0, 0,
+  0, 7, 0, 12, 6, 1, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 29, 0, 45, 0, 0,
+  0, 16, 0, 0, 39, 114, 0, 30, 15, 0,
+  35, 10, 0, 0, 0, 0, 31, 0, 77, 23,
+  0, 26, 0, 48, 0, 8, 0, 0, 25, 0,
+  0, 0, 0, 24, 31, 18, 0, 15, 42, 0,
+  28, 19, 61, 0, 0, 0, 0, 0, 0, 9,
+  24, 0, 72, 41, 0, 0, 3, 0, 0, 0,
+  0, 13, 37, 0, 43, 0, 0, 5, 84, 0,
+  93, 0, 17, 0, 7, 5, 0, 0, 42, 4,
+  0, 0, 0, 86, 6, 8, 42, 0, 32, 0,
+  64, 4, 0, 0, 6, 42, 74, 53, 38, 43,
+  0, 27, 68, 0, 0, 42, 0, 47, 25, 9,
+  0, 24, 6, 0, 0, 29, 9, 0, 0, 0,
+  0, 25, 0, 26, 0, 59, 9, 0, 0, 24,
+  0, 0, 45, 0, 88, 34, 0, 0, 0, 0,
+  0, 9, 6, 0, 0, 0, 0, 0, 36, 0,
+  0, 0, 0, 0, 0, 17, 64, 0, 2, 0,
+  1, 0, 91, 28, 8, 0, 51, 13, 35, 13,
+  47, 25, 0, 0, 0, 32, 0, 22, 0, 0,
+  48, 22, 0, 7, 0, 0, 23, 0, 25, 21,
+  43, 64, 10, 0, 0, 0, 29, 0, 0, 0,
+  18, 0, 4, 0, 74, 0, 0, 37, 25, 0,
+  0, 96, 8, 3, 33, 0, 35, 0, 85, 3,
+  0, 27, 4, 58, 40, 66, 33, 44, 0, 33,
+  67, 0, 11, 33, 0, 10, 35, 17, 0, 0,
+  0, 0, 16, 0, 0, 0, 0, 12, 0, 0,
+  0, 9, 0, 67, 0, 25, 0, 38, 0, 0,
+  28, 0, 77, 30, 0, 0, 25, 0, 0, 0,
+  0, 0, 0, 0, 2, 0, 21, 0, 17, 0,
+  0, 0, 18, 29, 78, 0, 11, 0, 0, 0,
+  78, 36, 3, 0, 35, 3, 44, 7, 36, 20,
+  0, 27, 0, 26, 0, 8, 0, 0, 61, 33,
+  8, 16, 0, 0, 58, 0, 22, 29, 12, 37,
+  7, 0, 0, 0, 41, 0, 0, 0, 20, 0,
+  0, 0, 52, 0, 0, 31, 46, 0, 0, 50,
+  11, 21, 17, 0, 0, 0, 67, 0, 0, 42,
+  4, 106, 9, 17, 15, 45, 0, 24, 71, 0,
+  40, 19, 0, 0, 0, 3, 0, 0, 0, 0,
+  0, 10, 0, 0, 0, 0, 0, 0, 4, 19,
+  0, 50, 0, 0, 0, 45, 0, 0, 34, 65,
+  36, 45, 0, 0, 44, 0, 0, 0, 0, 0,
+  7, 0, 60, 7, 0, 7, 12, 15, 0, 0,
+  10, 2, 40, 0, 0, 0, 0, 1, 42, 35,
+  2, 0, 21, 0, 58, 15, 51, 12, 0, 30,
+  0, 0, 0, 9, 0, 0, 58, 45, 6, 2,
+  0, 0, 16, 0, 0, 13, 0, 3, 7, 0,
+  0, 0, 80, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 4, 12, 0, 0, 43, 70, 0,
+  11, 0, 9, 0, 57, 6, 0, 0, 0, 60,
+  23, 63, 30, 38, 0, 12, 39, 0, 33, 35,
+  0, 0, 9, 14, 0, 0, 27, 0, 0, 0,
+  0, 0, 0, 17, 0, 12, 27, 0, 0, 40,
+  0, 0, 0, 0, 0, 0, 48, 52, 41, 12,
+  0, 0, 19, 12, 0, 0, 0, 0, 0, 0,
+  24, 0, 45, 0, 11, 4, 0, 0, 0, 28,
+  32, 0, 0, 18, 0, 0, 58, 19, 0, 21,
+  59, 13, 23, 9, 64, 10, 0, 32, 0, 0,
+  0, 0, 0, 0, 40, 51, 0, 0, 0, 0,
+  36, 0, 0, 22, 4, 24, 40, 0, 0, 0,
+  86, 0, 2, 0, 26, 0, 0, 1, 21, 0,
+  0, 24, 22, 0, 0, 1, 54, 0, 0, 0,
+  0, 0, 42, 0, 0, 7, 0, 86, 0, 0,
+  1, 43, 0, 15, 50, 15, 93, 16, 0, 0,
+  0, 18, 0, 0, 16, 0, 0, 0, 0, 0,
+  0, 25, 0, 0, 34, 33, 0, 35, 0, 0,
+  0, 17, 0, 0, 34, 96, 0, 0, 21, 0,
+  40, 0, 14, 0, 0, 2, 21, 0, 100, 23,
+  1, 3, 2, 71, 0, 0, 0, 0, 18, 0,
+  0, 0, 0, 0, 25, 5, 0, 25, 63, 0,
+  32, 16, 62, 0, 0, 28, 0, 0, 0, 0,
+  0, 0, 67, 44, 0, 0, 0, 0, 26, 0,
+  0, 29, 0, 5, 41, 0, 0, 0, 99, 0,
+  45, 0, 46, 0, 0, 13, 0, 0, 0, 6,
+  19, 0, 16, 0, 16, 11, 0, 0, 0, 0,
+  35, 0, 0, 25, 4, 106, 0, 0, 0, 36,
+  2, 10, 68, 10, 49, 2, 0, 0, 0, 0,
+  0, 0, 0, 2, 0, 9, 0, 0, 0, 0,
+  0, 0, 5, 41, 0, 45, 0, 0, 0, 31,
+  0, 0, 66, 127, 0, 42, 14, 0, 16, 0,
+  2, 0, 0, 0, 48, 0, 110, 32, 0, 9,
+  0, 60, 0, 11, 0, 0, 22, 0, 0, 0,
+  0, 41, 18, 32, 0, 0, 51, 0, 58, 18,
+  81, 0, 0, 0, 0, 0, 0, 12, 11, 0,
+  73, 49, 0, 0, 0, 0, 6, 0, 0, 8,
+  11, 0, 36, 0, 0, 0, 95, 0, 70, 0,
+  20, 0, 1, 0, 0, 0, 8, 0, 11, 0,
+  22, 0, 59, 0, 0, 0, 0, 0, 23, 0,
+  0, 0, 0, 116, 1, 0, 6, 27, 1, 0,
+  38, 30, 84, 8, 0, 0, 0, 4, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 2, 0, 0,
+  28, 17, 0, 30, 0, 0, 0, 0, 0, 0,
+  35, 131, 0, 15, 36, 0, 30, 17, 14, 0,
+  0, 0, 34, 0, 88, 47, 7, 2, 16, 67,
+  0, 0, 0, 0, 11, 0, 0, 0, 0, 24,
+  16, 22, 0, 15, 41, 0, 31, 10, 71, 0,
+  0, 11, 2, 0, 0, 5, 0, 0, 62, 66,
+  0, 0, 0, 0, 12, 10, 0, 7, 0, 0,
+  50, 0, 0, 0, 91, 3, 77, 0, 19, 0,
+  0, 0, 0, 0, 21, 6, 10, 0, 20, 0,
+  19, 16, 0, 0, 0, 0, 29, 0, 0, 0,
+  2, 73, 0, 0, 0, 28, 8, 5, 49, 5,
+  52, 6, 0, 0, 0, 7, 0, 12, 6, 1,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 29,
+  0, 45, 0, 0, 0, 16, 0, 0, 39, 114,
+  0, 30, 15, 0, 35, 10, 0, 0, 0, 0,
+  31, 0, 77, 23, 0, 26, 0, 48, 0, 8,
+  0, 0, 25, 0, 0, 0, 0, 24, 31, 18,
+  0, 15, 42, 0, 28, 19, 61, 0, 0, 0,
+  0, 0, 0, 9, 24, 0, 72, 41, 0, 0,
+  3, 0, 0, 0, 0, 13, 37, 0, 43, 0,
+  0, 5, 84, 0, 93, 0, 17, 0, 7, 5,
+  0, 0, 42, 4, 0, 0, 3, 16, 0, 41,
+  1, 0, 4, 6, 70, 0, 0, 11, 25, 55,
+  18, 0, 14, 4, 17, 0, 52, 0, 0, 17,
+  0, 16, 4, 14, 0, 32, 2, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 25, 0, 53,
+  0, 0, 5, 16, 0, 0, 58, 87, 18, 68,
+  0, 0, 15, 25, 0, 19, 0, 0, 0, 0,
+  0, 11, 7, 13, 8, 0, 0, 9, 0, 0,
+  44, 3, 0, 0, 0, 43, 57, 57, 0, 0,
+  32, 0, 31, 33, 74, 29, 25, 0, 0, 0,
+  0, 11, 45, 0, 71, 48, 0, 0, 7, 0,
+  2, 0, 0, 12, 74, 6, 34, 0, 0, 0,
+  67, 0, 49, 0, 0, 0, 48, 9, 63, 0,
+  76, 0, 5, 0, 0, 96, 8, 3, 33, 0,
+  35, 0, 85, 3, 0, 27, 4, 58, 40, 66,
+  33, 44, 0, 33, 67, 0, 11, 33, 0, 10,
+  35, 17, 0, 0, 0, 0, 16, 0, 0, 0,
+  0, 12, 0, 0, 0, 9, 0, 67, 0, 25,
+  0, 38, 0, 0, 28, 0, 77, 30, 0, 0,
+  25, 0, 0, 0, 0, 0, 0, 0, 2, 0,
+  21, 0, 17, 0, 0, 0, 18, 29, 78, 0,
+  11, 0, 0, 0, 78, 36, 3, 0, 35, 3,
+  44, 7, 36, 20, 0, 27, 0, 26, 0, 8,
+  0, 0, 61, 33, 8, 16, 0, 0, 58, 0,
+  22, 29, 12, 37, 7, 0, 0, 0, 41, 0,
+  0, 0, 20, 0, 0, 0, 52, 0, 0, 31,
+  46, 0, 0, 50, 11, 21, 17, 0, 0, 0,
+  67, 0, 0, 42, 4, 106, 9, 17, 15, 45,
+  0, 24, 71, 0, 40, 19, 0, 0, 0, 3,
+  0, 0, 0, 0, 0, 10, 0, 0, 0, 0,
+  0, 0, 4, 19, 0, 50, 0, 0, 0, 45,
+  0, 0, 34, 65, 36, 45, 0, 0, 44, 0,
+  0, 0, 0, 0, 7, 0, 60, 7, 0, 7,
+  12, 15, 0, 0, 10, 2, 40, 0, 0, 0,
+  0, 1, 42, 35, 2, 0, 21, 0, 58, 15,
+  51, 12, 0, 30, 0, 0, 0, 9, 0, 0,
+  58, 45, 6, 2, 0, 0, 16, 0, 0, 13,
+  0, 3, 7, 0, 0, 0, 80, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 4, 12, 0,
+  20, 58, 19, 29, 24, 0, 0, 0, 79, 0,
+  0, 44, 19, 100, 0, 0, 0, 11, 0, 4,
+  57, 0, 28, 24, 0, 0, 2, 0, 0, 3,
+  5, 0, 0, 6, 0, 0, 0, 0, 0, 0,
+  0, 34, 0, 24, 0, 0, 6, 41, 0, 0,
+  50, 104, 10, 72, 18, 0, 43, 0, 5, 0,
+  0, 0, 14, 0, 25, 49, 0, 0, 0, 41,
+  0, 14, 1, 0, 14, 2, 0, 0, 0, 33,
+  14, 52, 21, 0, 21, 0, 41, 46, 70, 27,
+  15, 0, 0, 0, 0, 6, 30, 0, 57, 63,
+  0, 18, 0, 0, 0, 0, 0, 23, 55, 0,
+  32, 0, 0, 0, 90, 0, 14, 0, 0, 0,
+  5, 1, 0, 0, 20, 7, 0, 0, 0, 1,
+  54, 0, 0, 0, 0, 0, 42, 0, 0, 7,
+  0, 86, 0, 0, 1, 43, 0, 15, 50, 15,
+  93, 16, 0, 0, 0, 18, 0, 0, 16, 0,
+  0, 0, 0, 0, 0, 25, 0, 0, 34, 33,
+  0, 35, 0, 0, 0, 17, 0, 0, 34, 96,
+  0, 0, 21, 0, 40, 0, 14, 0, 0, 2,
+  21, 0, 100, 23, 1, 3, 2, 71, 0, 0,
+  0, 0, 18, 0, 0, 0, 0, 0, 25, 5,
+  0, 25, 63, 0, 32, 16, 62, 0, 0, 28,
+  0, 0, 0, 0, 0, 0, 67, 44, 0, 0,
+  0, 0, 26, 0, 0, 29, 0, 5, 41, 0,
+  0, 0, 99, 0, 45, 0, 46, 0, 0, 13,
+  0, 0, 0, 6, 19, 0, 16, 0, 16, 11,
+  0, 0, 0, 0, 35, 0, 0, 25, 4, 106,
+  0, 0, 0, 36, 2, 10, 68, 10, 49, 2,
+  0, 0, 0, 0, 0, 0, 0, 2, 0, 9,
+  0, 0, 0, 0, 0, 0, 5, 41, 0, 45,
+  0, 0, 0, 31, 0, 0, 66, 127, 0, 42,
+  14, 0, 16, 0, 2, 0, 0, 0, 48, 0,
+  110, 32, 0, 9, 0, 60, 0, 11, 0, 0,
+  22, 0, 0, 0, 0, 41, 18, 32, 0, 0,
+  51, 0, 58, 18, 81, 0, 0, 0, 0, 0,
+  0, 12, 11, 0, 73, 49, 0, 0, 0, 0,
+  6, 0, 0, 8, 11, 0, 36, 0, 0, 0,
+  95, 0, 70, 0, 20, 0, 1, 0, 0, 0,
+  8, 0, 11, 0, 7, 17, 0, 25, 21, 11,
+  0, 0, 61, 0, 0, 19, 7, 87, 0, 0,
+  0, 20, 13, 16, 69, 0, 0, 19, 0, 0,
+  0, 0, 0, 18, 0, 0, 0, 6, 0, 0,
+  0, 0, 0, 0, 0, 18, 0, 55, 0, 0,
+  10, 38, 0, 0, 71, 103, 0, 69, 0, 0,
+  31, 9, 0, 0, 0, 0, 4, 0, 42, 20,
+  0, 14, 0, 7, 0, 2, 0, 0, 39, 0,
+  0, 0, 0, 43, 31, 45, 9, 0, 36, 0,
+  50, 45, 79, 24, 11, 1, 0, 0, 0, 13,
+  32, 0, 65, 65, 1, 23, 0, 0, 0, 0,
+  0, 13, 64, 0, 7, 0, 0, 0, 59, 0,
+  45, 0, 6, 0, 45, 0, 40, 0, 47, 0,
+  8, 0, 20, 0, 19, 16, 0, 0, 0, 0,
+  29, 0, 0, 0, 2, 73, 0, 0, 0, 28,
+  8, 5, 49, 5, 52, 6, 0, 0, 0, 7,
+  0, 12, 6, 1, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 29, 0, 45, 0, 0, 0, 16,
+  0, 0, 39, 114, 0, 30, 15, 0, 35, 10,
+  0, 0, 0, 0, 31, 0, 77, 23, 0, 26,
+  0, 48, 0, 8, 0, 0, 25, 0, 0, 0,
+  0, 24, 31, 18, 0, 15, 42, 0, 28, 19,
+  61, 0, 0, 0, 0, 0, 0, 9, 24, 0,
+  72, 41, 0, 0, 3, 0, 0, 0, 0, 13,
+  37, 0, 43, 0, 0, 5, 84, 0, 93, 0,
+  17, 0, 7, 5, 0, 0, 42, 4, 0, 0,
+  3, 16, 0, 41, 1, 0, 4, 6, 70, 0,
+  0, 11, 25, 55, 18, 0, 14, 4, 17, 0,
+  52, 0, 0, 17, 0, 16, 4, 14, 0, 32,
+  2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 25, 0, 53, 0, 0, 5, 16, 0, 0,
+  58, 87, 18, 68, 0, 0, 15, 25, 0, 19,
+  0, 0, 0, 0, 0, 11, 7, 13, 8, 0,
+  0, 9, 0, 0, 44, 3, 0, 0, 0, 43,
+  57, 57, 0, 0, 32, 0, 31, 33, 74, 29,
+  25, 0, 0, 0, 0, 11, 45, 0, 71, 48,
+  0, 0, 7, 0, 2, 0, 0, 12, 74, 6,
+  34, 0, 0, 0, 67, 0, 49, 0, 0, 0,
+  48, 9, 63, 0, 76, 0, 5, 0, 0, 29,
+  0, 36, 17, 0, 0, 1, 82, 0, 0, 10,
+  14, 80, 41, 0, 22, 8, 10, 0, 47, 0,
+  0, 23, 0, 13, 0, 15, 0, 5, 0, 0,
+  0, 11, 0, 0, 0, 0, 0, 11, 0, 0,
+  0, 51, 0, 0, 23, 16, 0, 0, 35, 72,
+  21, 74, 0, 0, 3, 24, 0, 11, 0, 0,
+  0, 0, 0, 21, 29, 0, 30, 0, 0, 0,
+  0, 0, 58, 0, 0, 0, 0, 30, 56, 60,
+  4, 0, 25, 0, 29, 51, 61, 17, 7, 13,
+  0, 0, 0, 14, 29, 0, 67, 43, 0, 16,
+  0, 0, 10, 1, 0, 7, 54, 13, 18, 0,
+  0, 0, 34, 0, 15, 0, 0, 0, 35, 0,
+  63, 0, 64, 0, 8, 0, 0, 50, 11, 21,
+  17, 0, 0, 0, 67, 0, 0, 42, 4, 106,
+  9, 17, 15, 45, 0, 24, 71, 0, 40, 19,
+  0, 0, 0, 3, 0, 0, 0, 0, 0, 10,
+  0, 0, 0, 0, 0, 0, 4, 19, 0, 50,
+  0, 0, 0, 45, 0, 0, 34, 65, 36, 45,
+  0, 0, 44, 0, 0, 0, 0, 0, 7, 0,
+  60, 7, 0, 7, 12, 15, 0, 0, 10, 2,
+  40, 0, 0, 0, 0, 1, 42, 35, 2, 0,
+  21, 0, 58, 15, 51, 12, 0, 30, 0, 0,
+  0, 9, 0, 0, 58, 45, 6, 2, 0, 0,
+  16, 0, 0, 13, 0, 3, 7, 0, 0, 0,
+  80, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 4, 12, 0, 20, 58, 19, 29, 24, 0,
+  0, 0, 79, 0, 0, 44, 19, 100, 0, 0,
+  0, 11, 0, 4, 57, 0, 28, 24, 0, 0,
+  2, 0, 0, 3, 5, 0, 0, 6, 0, 0,
+  0, 0, 0, 0, 0, 34, 0, 24, 0, 0,
+  6, 41, 0, 0, 50, 104, 10, 72, 18, 0,
+  43, 0, 5, 0, 0, 0, 14, 0, 25, 49,
+  0, 0, 0, 41, 0, 14, 1, 0, 14, 2,
+  0, 0, 0, 33, 14, 52, 21, 0, 21, 0,
+  41, 46, 70, 27, 15, 0, 0, 0, 0, 6,
+  30, 0, 57, 63, 0, 18, 0, 0, 0, 0,
+  0, 23, 55, 0, 32, 0, 0, 0, 90, 0,
+  14, 0, 0, 0, 5, 1, 0, 0, 20, 7,
+  0, 0, 56, 103, 0, 45, 15, 0, 0, 0,
+  58, 0, 0, 52, 30, 60, 0, 0, 0, 11,
+  22, 8, 26, 0, 0, 48, 0, 0, 58, 0,
+  0, 0, 19, 13, 0, 0, 3, 0, 0, 0,
+  0, 0, 0, 0, 0, 14, 26, 11, 2, 0,
+  0, 0, 23, 83, 1, 41, 67, 0, 39, 3,
+  0, 0, 0, 31, 34, 12, 4, 15, 0, 13,
+  0, 63, 0, 12, 10, 0, 0, 36, 0, 0,
+  33, 0, 0, 39, 30, 13, 0, 0, 19, 60,
+  73, 69, 93, 0, 0, 0, 0, 0, 59, 0,
+  21, 68, 23, 82, 0, 0, 0, 0, 0, 52,
+  129, 3, 21, 0, 0, 7, 40, 0, 0, 0,
+  3, 0, 26, 0, 14, 0, 57, 39, 0, 0,
+  16, 0, 16, 11, 0, 0, 0, 0, 35, 0,
+  0, 25, 4, 106, 0, 0, 0, 36, 2, 10,
+  68, 10, 49, 2, 0, 0, 0, 0, 0, 0,
+  0, 2, 0, 9, 0, 0, 0, 0, 0, 0,
+  5, 41, 0, 45, 0, 0, 0, 31, 0, 0,
+  66, 127, 0, 42, 14, 0, 16, 0, 2, 0,
+  0, 0, 48, 0, 110, 32, 0, 9, 0, 60,
+  0, 11, 0, 0, 22, 0, 0, 0, 0, 41,
+  18, 32, 0, 0, 51, 0, 58, 18, 81, 0,
+  0, 0, 0, 0, 0, 12, 11, 0, 73, 49,
+  0, 0, 0, 0, 6, 0, 0, 8, 11, 0,
+  36, 0, 0, 0, 95, 0, 70, 0, 20, 0,
+  1, 0, 0, 0, 8, 0, 11, 0, 7, 17,
+  0, 25, 21, 11, 0, 0, 61, 0, 0, 19,
+  7, 87, 0, 0, 0, 20, 13, 16, 69, 0,
+  0, 19, 0, 0, 0, 0, 0, 18, 0, 0,
+  0, 6, 0, 0, 0, 0, 0, 0, 0, 18,
+  0, 55, 0, 0, 10, 38, 0, 0, 71, 103,
+  0, 69, 0, 0, 31, 9, 0, 0, 0, 0,
+  4, 0, 42, 20, 0, 14, 0, 7, 0, 2,
+  0, 0, 39, 0, 0, 0, 0, 43, 31, 45,
+  9, 0, 36, 0, 50, 45, 79, 24, 11, 1,
+  0, 0, 0, 13, 32, 0, 65, 65, 1, 23,
+  0, 0, 0, 0, 0, 13, 64, 0, 7, 0,
+  0, 0, 59, 0, 45, 0, 6, 0, 45, 0,
+  40, 0, 47, 0, 8, 0, 0, 108, 0, 50,
+  20, 0, 23, 0, 76, 0, 5, 27, 31, 30,
+  12, 0, 0, 17, 12, 30, 55, 0, 0, 56,
+  13, 61, 39, 0, 0, 26, 15, 0, 27, 4,
+  0, 0, 0, 0, 0, 5, 0, 21, 0, 47,
+  11, 0, 10, 19, 0, 0, 54, 49, 57, 86,
+  0, 0, 20, 0, 0, 49, 9, 0, 0, 0,
+  0, 0, 32, 13, 0, 0, 0, 12, 0, 0,
+  51, 32, 0, 0, 0, 19, 65, 67, 24, 0,
+  19, 0, 39, 50, 52, 88, 74, 0, 0, 18,
+  0, 13, 42, 0, 60, 63, 11, 32, 0, 0,
+  0, 0, 14, 25, 123, 40, 2, 0, 0, 0,
+  13, 0, 5, 0, 0, 0, 42, 3, 144, 0,
+  86, 0, 0, 0, 3, 16, 0, 41, 1, 0,
+  4, 6, 70, 0, 0, 11, 25, 55, 18, 0,
+  14, 4, 17, 0, 52, 0, 0, 17, 0, 16,
+  4, 14, 0, 32, 2, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 25, 0, 53, 0, 0,
+  5, 16, 0, 0, 58, 87, 18, 68, 0, 0,
+  15, 25, 0, 19, 0, 0, 0, 0, 0, 11,
+  7, 13, 8, 0, 0, 9, 0, 0, 44, 3,
+  0, 0, 0, 43, 57, 57, 0, 0, 32, 0,
+  31, 33, 74, 29, 25, 0, 0, 0, 0, 11,
+  45, 0, 71, 48, 0, 0, 7, 0, 2, 0,
+  0, 12, 74, 6, 34, 0, 0, 0, 67, 0,
+  49, 0, 0, 0, 48, 9, 63, 0, 76, 0,
+  5, 0, 0, 29, 0, 36, 17, 0, 0, 1,
+  82, 0, 0, 10, 14, 80, 41, 0, 22, 8,
+  10, 0, 47, 0, 0, 23, 0, 13, 0, 15,
+  0, 5, 0, 0, 0, 11, 0, 0, 0, 0,
+  0, 11, 0, 0, 0, 51, 0, 0, 23, 16,
+  0, 0, 35, 72, 21, 74, 0, 0, 3, 24,
+  0, 11, 0, 0, 0, 0, 0, 21, 29, 0,
+  30, 0, 0, 0, 0, 0, 58, 0, 0, 0,
+  0, 30, 56, 60, 4, 0, 25, 0, 29, 51,
+  61, 17, 7, 13, 0, 0, 0, 14, 29, 0,
+  67, 43, 0, 16, 0, 0, 10, 1, 0, 7,
+  54, 13, 18, 0, 0, 0, 34, 0, 15, 0,
+  0, 0, 35, 0, 63, 0, 64, 0, 8, 0,
+  0, 64, 0, 40, 20, 0, 10, 0, 63, 0,
+  7, 15, 12, 65, 48, 6, 31, 34, 0, 25,
+  58, 0, 0, 21, 0, 36, 3, 4, 0, 0,
+  0, 0, 0, 32, 0, 0, 0, 0, 0, 11,
+  0, 0, 0, 41, 0, 0, 21, 22, 0, 0,
+  26, 26, 28, 76, 0, 0, 10, 4, 0, 25,
+  19, 0, 0, 0, 0, 11, 55, 3, 50, 0,
+  0, 0, 0, 0, 62, 0, 0, 0, 0, 3,
+  57, 69, 4, 0, 25, 19, 41, 29, 30, 12,
+  0, 34, 0, 1, 0, 24, 19, 0, 63, 30,
+  0, 19, 0, 0, 12, 0, 3, 1, 34, 21,
+  0, 0, 0, 0, 15, 0, 0, 0, 0, 0,
+  0, 13, 75, 0, 41, 0, 17, 0, 20, 58,
+  19, 29, 24, 0, 0, 0, 79, 0, 0, 44,
+  19, 100, 0, 0, 0, 11, 0, 4, 57, 0,
+  28, 24, 0, 0, 2, 0, 0, 3, 5, 0,
+  0, 6, 0, 0, 0, 0, 0, 0, 0, 34,
+  0, 24, 0, 0, 6, 41, 0, 0, 50, 104,
+  10, 72, 18, 0, 43, 0, 5, 0, 0, 0,
+  14, 0, 25, 49, 0, 0, 0, 41, 0, 14,
+  1, 0, 14, 2, 0, 0, 0, 33, 14, 52,
+  21, 0, 21, 0, 41, 46, 70, 27, 15, 0,
+  0, 0, 0, 6, 30, 0, 57, 63, 0, 18,
+  0, 0, 0, 0, 0, 23, 55, 0, 32, 0,
+  0, 0, 90, 0, 14, 0, 0, 0, 5, 1,
+  0, 0, 20, 7, 0, 0, 56, 103, 0, 45,
+  15, 0, 0, 0, 58, 0, 0, 52, 30, 60,
+  0, 0, 0, 11, 22, 8, 26, 0, 0, 48,
+  0, 0, 58, 0, 0, 0, 19, 13, 0, 0,
+  3, 0, 0, 0, 0, 0, 0, 0, 0, 14,
+  26, 11, 2, 0, 0, 0, 23, 83, 1, 41,
+  67, 0, 39, 3, 0, 0, 0, 31, 34, 12,
+  4, 15, 0, 13, 0, 63, 0, 12, 10, 0,
+  0, 36, 0, 0, 33, 0, 0, 39, 30, 13,
+  0, 0, 19, 60, 73, 69, 93, 0, 0, 0,
+  0, 0, 59, 0, 21, 68, 23, 82, 0, 0,
+  0, 0, 0, 52, 129, 3, 21, 0, 0, 7,
+  40, 0, 0, 0, 3, 0, 26, 0, 14, 0,
+  57, 39, 0, 0, 46, 82, 0, 50, 1, 35,
+  0, 0, 22, 0, 0, 15, 41, 6, 0, 0,
+  0, 19, 21, 11, 13, 31, 0, 0, 0, 0,
+  64, 0, 0, 0, 30, 54, 0, 0, 28, 29,
+  0, 17, 0, 0, 0, 0, 1, 18, 5, 11,
+  10, 0, 0, 0, 0, 57, 0, 22, 95, 48,
+  30, 4, 0, 0, 0, 73, 54, 11, 88, 0,
+  0, 66, 0, 94, 130, 13, 9, 0, 0, 4,
+  0, 2, 68, 0, 0, 0, 23, 16, 20, 0,
+  0, 28, 33, 13, 56, 0, 0, 0, 6, 0,
+  47, 0, 18, 68, 22, 150, 0, 0, 0, 0,
+  0, 82, 91, 0, 7, 26, 10, 31, 0, 0,
+  0, 0, 31, 0, 0, 0, 0, 0, 50, 35,
+  0, 2, 7, 17, 0, 25, 21, 11, 0, 0,
+  61, 0, 0, 19, 7, 87, 0, 0, 0, 20,
+  13, 16, 69, 0, 0, 19, 0, 0, 0, 0,
+  0, 18, 0, 0, 0, 6, 0, 0, 0, 0,
+  0, 0, 0, 18, 0, 55, 0, 0, 10, 38,
+  0, 0, 71, 103, 0, 69, 0, 0, 31, 9,
+  0, 0, 0, 0, 4, 0, 42, 20, 0, 14,
+  0, 7, 0, 2, 0, 0, 39, 0, 0, 0,
+  0, 43, 31, 45, 9, 0, 36, 0, 50, 45,
+  79, 24, 11, 1, 0, 0, 0, 13, 32, 0,
+  65, 65, 1, 23, 0, 0, 0, 0, 0, 13,
+  64, 0, 7, 0, 0, 0, 59, 0, 45, 0,
+  6, 0, 45, 0, 40, 0, 47, 0, 8, 0,
+  0, 108, 0, 50, 20, 0, 23, 0, 76, 0,
+  5, 27, 31, 30, 12, 0, 0, 17, 12, 30,
+  55, 0, 0, 56, 13, 61, 39, 0, 0, 26,
+  15, 0, 27, 4, 0, 0, 0, 0, 0, 5,
+  0, 21, 0, 47, 11, 0, 10, 19, 0, 0,
+  54, 49, 57, 86, 0, 0, 20, 0, 0, 49,
+  9, 0, 0, 0, 0, 0, 32, 13, 0, 0,
+  0, 12, 0, 0, 51, 32, 0, 0, 0, 19,
+  65, 67, 24, 0, 19, 0, 39, 50, 52, 88,
+  74, 0, 0, 18, 0, 13, 42, 0, 60, 63,
+  11, 32, 0, 0, 0, 0, 14, 25, 123, 40,
+  2, 0, 0, 0, 13, 0, 5, 0, 0, 0,
+  42, 3, 144, 0, 86, 0, 0, 0, 0, 155,
+  0, 57, 4, 0, 35, 0, 65, 0, 13, 22,
+  77, 0, 0, 0, 0, 12, 22, 43, 12, 0,
+  0, 61, 29, 33, 73, 13, 3, 0, 36, 0,
+  52, 0, 38, 0, 0, 0, 0, 0, 0, 22,
+  0, 53, 11, 0, 16, 0, 0, 0, 43, 52,
+  47, 51, 11, 17, 36, 0, 0, 49, 1, 0,
+  0, 0, 0, 0, 2, 16, 0, 0, 11, 34,
+  0, 0, 39, 55, 0, 69, 4, 0, 37, 56,
+  49, 10, 11, 0, 0, 58, 72, 93, 137, 0,
+  0, 11, 0, 0, 57, 0, 44, 81, 42, 39,
+  0, 0, 0, 0, 27, 70, 152, 18, 4, 0,
+  17, 10, 0, 0, 0, 0, 0, 0, 3, 0,
+  133, 2, 119, 5, 0, 0, 0, 29, 0, 36,
+  17, 0, 0, 1, 82, 0, 0, 10, 14, 80,
+  41, 0, 22, 8, 10, 0, 47, 0, 0, 23,
+  0, 13, 0, 15, 0, 5, 0, 0, 0, 11,
+  0, 0, 0, 0, 0, 11, 0, 0, 0, 51,
+  0, 0, 23, 16, 0, 0, 35, 72, 21, 74,
+  0, 0, 3, 24, 0, 11, 0, 0, 0, 0,
+  0, 21, 29, 0, 30, 0, 0, 0, 0, 0,
+  58, 0, 0, 0, 0, 30, 56, 60, 4, 0,
+  25, 0, 29, 51, 61, 17, 7, 13, 0, 0,
+  0, 14, 29, 0, 67, 43, 0, 16, 0, 0,
+  10, 1, 0, 7, 54, 13, 18, 0, 0, 0,
+  34, 0, 15, 0, 0, 0, 35, 0, 63, 0,
+  64, 0, 8, 0, 0, 64, 0, 40, 20, 0,
+  10, 0, 63, 0, 7, 15, 12, 65, 48, 6,
+  31, 34, 0, 25, 58, 0, 0, 21, 0, 36,
+  3, 4, 0, 0, 0, 0, 0, 32, 0, 0,
+  0, 0, 0, 11, 0, 0, 0, 41, 0, 0,
+  21, 22, 0, 0, 26, 26, 28, 76, 0, 0,
+  10, 4, 0, 25, 19, 0, 0, 0, 0, 11,
+  55, 3, 50, 0, 0, 0, 0, 0, 62, 0,
+  0, 0, 0, 3, 57, 69, 4, 0, 25, 19,
+  41, 29, 30, 12, 0, 34, 0, 1, 0, 24,
+  19, 0, 63, 30, 0, 19, 0, 0, 12, 0,
+  3, 1, 34, 21, 0, 0, 0, 0, 15, 0,
+  0, 0, 0, 0, 0, 13, 75, 0, 41, 0,
+  17, 0, 0, 151, 1, 57, 8, 0, 17, 0,
+  42, 0, 26, 0, 19, 37, 38, 18, 29, 7,
+  6, 53, 10, 0, 0, 24, 1, 37, 15, 7,
+  0, 0, 0, 0, 46, 5, 0, 0, 0, 0,
+  0, 1, 0, 2, 0, 21, 0, 0, 21, 42,
+  0, 0, 40, 0, 12, 89, 0, 0, 18, 1,
+  0, 44, 24, 0, 0, 0, 0, 0, 73, 21,
+  53, 0, 0, 0, 0, 8, 68, 12, 0, 35,
+  0, 18, 49, 62, 21, 11, 30, 33, 16, 49,
+  19, 13, 53, 22, 0, 17, 0, 5, 44, 0,
+  24, 80, 3, 46, 0, 0, 12, 0, 22, 12,
+  52, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 89, 0, 51, 0, 16, 1,
+  56, 103, 0, 45, 15, 0, 0, 0, 58, 0,
+  0, 52, 30, 60, 0, 0, 0, 11, 22, 8,
+  26, 0, 0, 48, 0, 0, 58, 0, 0, 0,
+  19, 13, 0, 0, 3, 0, 0, 0, 0, 0,
+  0, 0, 0, 14, 26, 11, 2, 0, 0, 0,
+  23, 83, 1, 41, 67, 0, 39, 3, 0, 0,
+  0, 31, 34, 12, 4, 15, 0, 13, 0, 63,
+  0, 12, 10, 0, 0, 36, 0, 0, 33, 0,
+  0, 39, 30, 13, 0, 0, 19, 60, 73, 69,
+  93, 0, 0, 0, 0, 0, 59, 0, 21, 68,
+  23, 82, 0, 0, 0, 0, 0, 52, 129, 3,
+  21, 0, 0, 7, 40, 0, 0, 0, 3, 0,
+  26, 0, 14, 0, 57, 39, 0, 0, 46, 82,
+  0, 50, 1, 35, 0, 0, 22, 0, 0, 15,
+  41, 6, 0, 0, 0, 19, 21, 11, 13, 31,
+  0, 0, 0, 0, 64, 0, 0, 0, 30, 54,
+  0, 0, 28, 29, 0, 17, 0, 0, 0, 0,
+  1, 18, 5, 11, 10, 0, 0, 0, 0, 57,
+  0, 22, 95, 48, 30, 4, 0, 0, 0, 73,
+  54, 11, 88, 0, 0, 66, 0, 94, 130, 13,
+  9, 0, 0, 4, 0, 2, 68, 0, 0, 0,
+  23, 16, 20, 0, 0, 28, 33, 13, 56, 0,
+  0, 0, 6, 0, 47, 0, 18, 68, 22, 150,
+  0, 0, 0, 0, 0, 82, 91, 0, 7, 26,
+  10, 31, 0, 0, 0, 0, 31, 0, 0, 0,
+  0, 0, 50, 35, 0, 2, 1, 12, 0, 19,
+  0, 115, 0, 0, 17, 0, 0, 0, 0, 1,
+  0, 0, 0, 28, 11, 16, 0, 65, 2, 0,
+  0, 0, 23, 0, 0, 0, 0, 17, 8, 0,
+  9, 65, 12, 45, 5, 0, 48, 0, 0, 18,
+  0, 33, 46, 0, 0, 7, 0, 29, 0, 0,
+  131, 59, 54, 5, 43, 0, 0, 107, 51, 0,
+  166, 0, 0, 46, 0, 112, 193, 0, 44, 0,
+  0, 35, 0, 0, 29, 0, 0, 0, 32, 0,
+  28, 0, 0, 1, 14, 0, 0, 79, 16, 0,
+  38, 0, 0, 0, 3, 61, 47, 127, 0, 0,
+  0, 0, 0, 36, 0, 0, 0, 55, 0, 53,
+  0, 0, 0, 0, 47, 0, 0, 0, 0, 0,
+  13, 18, 0, 12, 0, 108, 0, 50, 20, 0,
+  23, 0, 76, 0, 5, 27, 31, 30, 12, 0,
+  0, 17, 12, 30, 55, 0, 0, 56, 13, 61,
+  39, 0, 0, 26, 15, 0, 27, 4, 0, 0,
+  0, 0, 0, 5, 0, 21, 0, 47, 11, 0,
+  10, 19, 0, 0, 54, 49, 57, 86, 0, 0,
+  20, 0, 0, 49, 9, 0, 0, 0, 0, 0,
+  32, 13, 0, 0, 0, 12, 0, 0, 51, 32,
+  0, 0, 0, 19, 65, 67, 24, 0, 19, 0,
+  39, 50, 52, 88, 74, 0, 0, 18, 0, 13,
+  42, 0, 60, 63, 11, 32, 0, 0, 0, 0,
+  14, 25, 123, 40, 2, 0, 0, 0, 13, 0,
+  5, 0, 0, 0, 42, 3, 144, 0, 86, 0,
+  0, 0, 0, 155, 0, 57, 4, 0, 35, 0,
+  65, 0, 13, 22, 77, 0, 0, 0, 0, 12,
+  22, 43, 12, 0, 0, 61, 29, 33, 73, 13,
+  3, 0, 36, 0, 52, 0, 38, 0, 0, 0,
+  0, 0, 0, 22, 0, 53, 11, 0, 16, 0,
+  0, 0, 43, 52, 47, 51, 11, 17, 36, 0,
+  0, 49, 1, 0, 0, 0, 0, 0, 2, 16,
+  0, 0, 11, 34, 0, 0, 39, 55, 0, 69,
+  4, 0, 37, 56, 49, 10, 11, 0, 0, 58,
+  72, 93, 137, 0, 0, 11, 0, 0, 57, 0,
+  44, 81, 42, 39, 0, 0, 0, 0, 27, 70,
+  152, 18, 4, 0, 17, 10, 0, 0, 0, 0,
+  0, 0, 3, 0, 133, 2, 119, 5, 0, 0,
+  21, 77, 0, 54, 0, 57, 1, 0, 24, 0,
+  0, 9, 43, 0, 0, 0, 0, 20, 47, 27,
+  0, 27, 1, 0, 0, 0, 69, 0, 0, 0,
+  4, 19, 15, 0, 32, 49, 0, 0, 3, 0,
+  0, 7, 0, 34, 8, 10, 16, 0, 0, 0,
+  3, 45, 0, 0, 93, 35, 51, 0, 0, 0,
+  0, 53, 20, 0, 103, 0, 0, 43, 0, 68,
+  175, 29, 22, 0, 0, 35, 0, 61, 4, 6,
+  0, 0, 64, 5, 21, 0, 0, 19, 51, 0,
+  81, 0, 0, 0, 7, 0, 55, 0, 12, 95,
+  28, 106, 1, 0, 0, 0, 4, 67, 71, 0,
+  2, 16, 0, 39, 0, 0, 0, 0, 25, 0,
+  0, 0, 0, 18, 65, 17, 0, 0, 0, 64,
+  0, 40, 20, 0, 10, 0, 63, 0, 7, 15,
+  12, 65, 48, 6, 31, 34, 0, 25, 58, 0,
+  0, 21, 0, 36, 3, 4, 0, 0, 0, 0,
+  0, 32, 0, 0, 0, 0, 0, 11, 0, 0,
+  0, 41, 0, 0, 21, 22, 0, 0, 26, 26,
+  28, 76, 0, 0, 10, 4, 0, 25, 19, 0,
+  0, 0, 0, 11, 55, 3, 50, 0, 0, 0,
+  0, 0, 62, 0, 0, 0, 0, 3, 57, 69,
+  4, 0, 25, 19, 41, 29, 30, 12, 0, 34,
+  0, 1, 0, 24, 19, 0, 63, 30, 0, 19,
+  0, 0, 12, 0, 3, 1, 34, 21, 0, 0,
+  0, 0, 15, 0, 0, 0, 0, 0, 0, 13,
+  75, 0, 41, 0, 17, 0, 0, 151, 1, 57,
+  8, 0, 17, 0, 42, 0, 26, 0, 19, 37,
+  38, 18, 29, 7, 6, 53, 10, 0, 0, 24,
+  1, 37, 15, 7, 0, 0, 0, 0, 46, 5,
+  0, 0, 0, 0, 0, 1, 0, 2, 0, 21,
+  0, 0, 21, 42, 0, 0, 40, 0, 12, 89,
+  0, 0, 18, 1, 0, 44, 24, 0, 0, 0,
+  0, 0, 73, 21, 53, 0, 0, 0, 0, 8,
+  68, 12, 0, 35, 0, 18, 49, 62, 21, 11,
+  30, 33, 16, 49, 19, 13, 53, 22, 0, 17,
+  0, 5, 44, 0, 24, 80, 3, 46, 0, 0,
+  12, 0, 22, 12, 52, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 89, 0,
+  51, 0, 16, 1, 6, 145, 0, 66, 0, 25,
+  0, 0, 52, 0, 6, 0, 69, 0, 0, 0,
+  0, 5, 33, 32, 0, 0, 14, 32, 3, 0,
+  70, 0, 0, 0, 0, 0, 77, 0, 13, 38,
+  0, 0, 0, 0, 0, 17, 0, 19, 0, 15,
+  48, 19, 0, 17, 5, 25, 0, 35, 17, 0,
+  54, 0, 0, 16, 0, 0, 0, 0, 16, 0,
+  16, 19, 0, 1, 65, 17, 3, 0, 34, 29,
+  0, 94, 0, 16, 0, 0, 90, 39, 0, 18,
+  0, 41, 51, 18, 99, 0, 0, 0, 0, 0,
+  61, 0, 18, 99, 42, 59, 0, 0, 0, 10,
+  57, 44, 87, 0, 0, 0, 0, 36, 0, 0,
+  0, 0, 5, 0, 3, 0, 48, 0, 39, 0,
+  0, 46, 46, 82, 0, 50, 1, 35, 0, 0,
+  22, 0, 0, 15, 41, 6, 0, 0, 0, 19,
+  21, 11, 13, 31, 0, 0, 0, 0, 64, 0,
+  0, 0, 30, 54, 0, 0, 28, 29, 0, 17,
+  0, 0, 0, 0, 1, 18, 5, 11, 10, 0,
+  0, 0, 0, 57, 0, 22, 95, 48, 30, 4,
+  0, 0, 0, 73, 54, 11, 88, 0, 0, 66,
+  0, 94, 130, 13, 9, 0, 0, 4, 0, 2,
+  68, 0, 0, 0, 23, 16, 20, 0, 0, 28,
+  33, 13, 56, 0, 0, 0, 6, 0, 47, 0,
+  18, 68, 22, 150, 0, 0, 0, 0, 0, 82,
+  91, 0, 7, 26, 10, 31, 0, 0, 0, 0,
+  31, 0, 0, 0, 0, 0, 50, 35, 0, 2,
+  1, 12, 0, 19, 0, 115, 0, 0, 17, 0,
+  0, 0, 0, 1, 0, 0, 0, 28, 11, 16,
+  0, 65, 2, 0, 0, 0, 23, 0, 0, 0,
+  0, 17, 8, 0, 9, 65, 12, 45, 5, 0,
+  48, 0, 0, 18, 0, 33, 46, 0, 0, 7,
+  0, 29, 0, 0, 131, 59, 54, 5, 43, 0,
+  0, 107, 51, 0, 166, 0, 0, 46, 0, 112,
+  193, 0, 44, 0, 0, 35, 0, 0, 29, 0,
+  0, 0, 32, 0, 28, 0, 0, 1, 14, 0,
+  0, 79, 16, 0, 38, 0, 0, 0, 3, 61,
+  47, 127, 0, 0, 0, 0, 0, 36, 0, 0,
+  0, 55, 0, 53, 0, 0, 0, 0, 47, 0,
+  0, 0, 0, 0, 13, 18, 0, 12, 0, 1,
+  0, 0, 0, 57, 0, 18, 70, 15, 0, 4,
+  0, 0, 0, 50, 13, 20, 0, 0, 47, 47,
+  29, 12, 0, 0, 0, 10, 0, 0, 0, 0,
+  50, 0, 0, 44, 0, 64, 0, 0, 54, 0,
+  0, 47, 0, 99, 16, 46, 0, 15, 0, 37,
+  0, 0, 63, 0, 74, 0, 64, 0, 0, 62,
+  0, 0, 90, 0, 0, 12, 30, 23, 61, 0,
+  70, 60, 0, 76, 0, 1, 0, 0, 21, 0,
+  0, 0, 0, 0, 8, 0, 5, 0, 0, 121,
+  9, 0, 0, 0, 0, 0, 20, 54, 116, 17,
+  0, 0, 0, 0, 11, 9, 0, 21, 0, 19,
+  0, 73, 0, 0, 0, 0, 56, 0, 53, 0,
+  0, 0, 21, 0, 18, 0, 0, 155, 0, 57,
+  4, 0, 35, 0, 65, 0, 13, 22, 77, 0,
+  0, 0, 0, 12, 22, 43, 12, 0, 0, 61,
+  29, 33, 73, 13, 3, 0, 36, 0, 52, 0,
+  38, 0, 0, 0, 0, 0, 0, 22, 0, 53,
+  11, 0, 16, 0, 0, 0, 43, 52, 47, 51,
+  11, 17, 36, 0, 0, 49, 1, 0, 0, 0,
+  0, 0, 2, 16, 0, 0, 11, 34, 0, 0,
+  39, 55, 0, 69, 4, 0, 37, 56, 49, 10,
+  11, 0, 0, 58, 72, 93, 137, 0, 0, 11,
+  0, 0, 57, 0, 44, 81, 42, 39, 0, 0,
+  0, 0, 27, 70, 152, 18, 4, 0, 17, 10,
+  0, 0, 0, 0, 0, 0, 3, 0, 133, 2,
+  119, 5, 0, 0, 21, 77, 0, 54, 0, 57,
+  1, 0, 24, 0, 0, 9, 43, 0, 0, 0,
+  0, 20, 47, 27, 0, 27, 1, 0, 0, 0,
+  69, 0, 0, 0, 4, 19, 15, 0, 32, 49,
+  0, 0, 3, 0, 0, 7, 0, 34, 8, 10,
+  16, 0, 0, 0, 3, 45, 0, 0, 93, 35,
+  51, 0, 0, 0, 0, 53, 20, 0, 103, 0,
+  0, 43, 0, 68, 175, 29, 22, 0, 0, 35,
+  0, 61, 4, 6, 0, 0, 64, 5, 21, 0,
+  0, 19, 51, 0, 81, 0, 0, 0, 7, 0,
+  55, 0, 12, 95, 28, 106, 1, 0, 0, 0,
+  4, 67, 71, 0, 2, 16, 0, 39, 0, 0,
+  0, 0, 25, 0, 0, 0, 0, 18, 65, 17,
+  0, 0, 0, 0, 0, 25, 0, 135, 0, 7,
+  42, 0, 0, 4, 0, 6, 0, 0, 0, 25,
+  13, 0, 41, 106, 15, 0, 0, 0, 0, 1,
+  0, 0, 0, 1, 9, 0, 0, 82, 0, 40,
+  0, 0, 45, 0, 0, 46, 0, 80, 0, 4,
+  0, 0, 0, 52, 0, 0, 133, 36, 44, 0,
+  57, 0, 0, 92, 42, 0, 155, 0, 0, 30,
+  0, 77, 196, 0, 59, 34, 0, 31, 0, 16,
+  9, 0, 0, 0, 35, 0, 0, 0, 1, 0,
+  11, 0, 0, 92, 0, 0, 27, 0, 0, 0,
+  7, 76, 78, 108, 0, 0, 0, 0, 0, 30,
+  0, 0, 0, 38, 0, 95, 0, 0, 0, 0,
+  52, 0, 0, 0, 0, 0, 21, 0, 0, 6,
+  0, 151, 1, 57, 8, 0, 17, 0, 42, 0,
+  26, 0, 19, 37, 38, 18, 29, 7, 6, 53,
+  10, 0, 0, 24, 1, 37, 15, 7, 0, 0,
+  0, 0, 46, 5, 0, 0, 0, 0, 0, 1,
+  0, 2, 0, 21, 0, 0, 21, 42, 0, 0,
+  40, 0, 12, 89, 0, 0, 18, 1, 0, 44,
+  24, 0, 0, 0, 0, 0, 73, 21, 53, 0,
+  0, 0, 0, 8, 68, 12, 0, 35, 0, 18,
+  49, 62, 21, 11, 30, 33, 16, 49, 19, 13,
+  53, 22, 0, 17, 0, 5, 44, 0, 24, 80,
+  3, 46, 0, 0, 12, 0, 22, 12, 52, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 89, 0, 51, 0, 16, 1, 6, 145,
+  0, 66, 0, 25, 0, 0, 52, 0, 6, 0,
+  69, 0, 0, 0, 0, 5, 33, 32, 0, 0,
+  14, 32, 3, 0, 70, 0, 0, 0, 0, 0,
+  77, 0, 13, 38, 0, 0, 0, 0, 0, 17,
+  0, 19, 0, 15, 48, 19, 0, 17, 5, 25,
+  0, 35, 17, 0, 54, 0, 0, 16, 0, 0,
+  0, 0, 16, 0, 16, 19, 0, 1, 65, 17,
+  3, 0, 34, 29, 0, 94, 0, 16, 0, 0,
+  90, 39, 0, 18, 0, 41, 51, 18, 99, 0,
+  0, 0, 0, 0, 61, 0, 18, 99, 42, 59,
+  0, 0, 0, 10, 57, 44, 87, 0, 0, 0,
+  0, 36, 0, 0, 0, 0, 5, 0, 3, 0,
+  48, 0, 39, 0, 0, 46, 58, 21, 0, 68,
+  2, 105, 0, 4, 38, 0, 0, 0, 40, 0,
+  0, 0, 2, 21, 35, 0, 0, 90, 13, 0,
+  0, 0, 31, 0, 9, 0, 0, 31, 3, 0,
+  67, 72, 9, 0, 27, 0, 20, 14, 0, 28,
+  22, 53, 41, 0, 0, 0, 0, 61, 0, 0,
+  135, 38, 37, 0, 7, 0, 0, 47, 34, 0,
+  96, 0, 0, 31, 0, 47, 198, 6, 55, 0,
+  0, 0, 0, 35, 0, 0, 0, 0, 77, 27,
+  31, 0, 1, 1, 38, 0, 0, 15, 0, 0,
+  17, 0, 39, 0, 26, 71, 33, 77, 0, 0,
+  0, 0, 6, 46, 5, 0, 19, 40, 0, 88,
+  0, 0, 0, 0, 55, 0, 0, 0, 0, 0,
+  28, 0, 0, 16, 1, 12, 0, 19, 0, 115,
+  0, 0, 17, 0, 0, 0, 0, 1, 0, 0,
+  0, 28, 11, 16, 0, 65, 2, 0, 0, 0,
+  23, 0, 0, 0, 0, 17, 8, 0, 9, 65,
+  12, 45, 5, 0, 48, 0, 0, 18, 0, 33,
+  46, 0, 0, 7, 0, 29, 0, 0, 131, 59,
+  54, 5, 43, 0, 0, 107, 51, 0, 166, 0,
+  0, 46, 0, 112, 193, 0, 44, 0, 0, 35,
+  0, 0, 29, 0, 0, 0, 32, 0, 28, 0,
+  0, 1, 14, 0, 0, 79, 16, 0, 38, 0,
+  0, 0, 3, 61, 47, 127, 0, 0, 0, 0,
+  0, 36, 0, 0, 0, 55, 0, 53, 0, 0,
+  0, 0, 47, 0, 0, 0, 0, 0, 13, 18,
+  0, 12, 0, 1, 0, 0, 0, 57, 0, 18,
+  70, 15, 0, 4, 0, 0, 0, 50, 13, 20,
+  0, 0, 47, 47, 29, 12, 0, 0, 0, 10,
+  0, 0, 0, 0, 50, 0, 0, 44, 0, 64,
+  0, 0, 54, 0, 0, 47, 0, 99, 16, 46,
+  0, 15, 0, 37, 0, 0, 63, 0, 74, 0,
+  64, 0, 0, 62, 0, 0, 90, 0, 0, 12,
+  30, 23, 61, 0, 70, 60, 0, 76, 0, 1,
+  0, 0, 21, 0, 0, 0, 0, 0, 8, 0,
+  5, 0, 0, 121, 9, 0, 0, 0, 0, 0,
+  20, 54, 116, 17, 0, 0, 0, 0, 11, 9,
+  0, 21, 0, 19, 0, 73, 0, 0, 0, 0,
+  56, 0, 53, 0, 0, 0, 21, 0, 18, 0,
+  0, 48, 16, 0, 0, 0, 50, 44, 75, 3,
+  3, 42, 110, 0, 16, 61, 79, 13, 2, 0,
+  31, 54, 4, 6, 49, 0, 0, 45, 0, 0,
+  0, 0, 83, 0, 2, 0, 0, 62, 0, 80,
+  0, 35, 4, 49, 18, 97, 6, 35, 0, 42,
+  0, 40, 48, 0, 23, 0, 3, 0, 0, 0,
+  0, 5, 0, 59, 0, 17, 20, 0, 40, 0,
+  0, 0, 0, 48, 8, 0, 29, 54, 0, 0,
+  33, 0, 42, 5, 0, 9, 4, 0, 0, 8,
+  0, 4, 0, 44, 0, 13, 5, 8, 15, 84,
+  41, 0, 0, 0, 34, 0, 24, 13, 4, 22,
+  0, 21, 0, 22, 0, 0, 0, 0, 35, 0,
+  31, 0, 111, 0, 71, 0, 32, 0, 21, 77,
+  0, 54, 0, 57, 1, 0, 24, 0, 0, 9,
+  43, 0, 0, 0, 0, 20, 47, 27, 0, 27,
+  1, 0, 0, 0, 69, 0, 0, 0, 4, 19,
+  15, 0, 32, 49, 0, 0, 3, 0, 0, 7,
+  0, 34, 8, 10, 16, 0, 0, 0, 3, 45,
+  0, 0, 93, 35, 51, 0, 0, 0, 0, 53,
+  20, 0, 103, 0, 0, 43, 0, 68, 175, 29,
+  22, 0, 0, 35, 0, 61, 4, 6, 0, 0,
+  64, 5, 21, 0, 0, 19, 51, 0, 81, 0,
+  0, 0, 7, 0, 55, 0, 12, 95, 28, 106,
+  1, 0, 0, 0, 4, 67, 71, 0, 2, 16,
+  0, 39, 0, 0, 0, 0, 25, 0, 0, 0,
+  0, 18, 65, 17, 0, 0, 0, 0, 0, 25,
+  0, 135, 0, 7, 42, 0, 0, 4, 0, 6,
+  0, 0, 0, 25, 13, 0, 41, 106, 15, 0,
+  0, 0, 0, 1, 0, 0, 0, 1, 9, 0,
+  0, 82, 0, 40, 0, 0, 45, 0, 0, 46,
+  0, 80, 0, 4, 0, 0, 0, 52, 0, 0,
+  133, 36, 44, 0, 57, 0, 0, 92, 42, 0,
+  155, 0, 0, 30, 0, 77, 196, 0, 59, 34,
+  0, 31, 0, 16, 9, 0, 0, 0, 35, 0,
+  0, 0, 1, 0, 11, 0, 0, 92, 0, 0,
+  27, 0, 0, 0, 7, 76, 78, 108, 0, 0,
+  0, 0, 0, 30, 0, 0, 0, 38, 0, 95,
+  0, 0, 0, 0, 52, 0, 0, 0, 0, 0,
+  21, 0, 0, 6, 0, 28, 0, 8, 0, 24,
+  24, 29, 104, 12, 0, 37, 106, 0, 0, 105,
+  62, 22, 0, 0, 41, 62, 0, 12, 2, 0,
+  0, 43, 0, 0, 0, 0, 76, 0, 33, 0,
+  0, 91, 0, 53, 32, 0, 4, 39, 5, 115,
+  2, 34, 0, 36, 0, 56, 16, 0, 56, 0,
+  6, 0, 36, 0, 0, 14, 0, 21, 0, 0,
+  0, 0, 27, 0, 37, 0, 47, 52, 0, 14,
+  8, 31, 0, 0, 8, 0, 29, 0, 0, 10,
+  11, 0, 20, 0, 0, 68, 0, 34, 0, 0,
+  0, 0, 26, 84, 90, 0, 0, 0, 22, 0,
+  15, 31, 0, 34, 0, 30, 0, 52, 0, 0,
+  0, 0, 60, 0, 39, 0, 79, 0, 69, 0,
+  34, 16, 6, 145, 0, 66, 0, 25, 0, 0,
+  52, 0, 6, 0, 69, 0, 0, 0, 0, 5,
+  33, 32, 0, 0, 14, 32, 3, 0, 70, 0,
+  0, 0, 0, 0, 77, 0, 13, 38, 0, 0,
+  0, 0, 0, 17, 0, 19, 0, 15, 48, 19,
+  0, 17, 5, 25, 0, 35, 17, 0, 54, 0,
+  0, 16, 0, 0, 0, 0, 16, 0, 16, 19,
+  0, 1, 65, 17, 3, 0, 34, 29, 0, 94,
+  0, 16, 0, 0, 90, 39, 0, 18, 0, 41,
+  51, 18, 99, 0, 0, 0, 0, 0, 61, 0,
+  18, 99, 42, 59, 0, 0, 0, 10, 57, 44,
+  87, 0, 0, 0, 0, 36, 0, 0, 0, 0,
+  5, 0, 3, 0, 48, 0, 39, 0, 0, 46,
+  58, 21, 0, 68, 2, 105, 0, 4, 38, 0,
+  0, 0, 40, 0, 0, 0, 2, 21, 35, 0,
+  0, 90, 13, 0, 0, 0, 31, 0, 9, 0,
+  0, 31, 3, 0, 67, 72, 9, 0, 27, 0,
+  20, 14, 0, 28, 22, 53, 41, 0, 0, 0,
+  0, 61, 0, 0, 135, 38, 37, 0, 7, 0,
+  0, 47, 34, 0, 96, 0, 0, 31, 0, 47,
+  198, 6, 55, 0, 0, 0, 0, 35, 0, 0,
+  0, 0, 77, 27, 31, 0, 1, 1, 38, 0,
+  0, 15, 0, 0, 17, 0, 39, 0, 26, 71,
+  33, 77, 0, 0, 0, 0, 6, 46, 5, 0,
+  19, 40, 0, 88, 0, 0, 0, 0, 55, 0,
+  0, 0, 0, 0, 28, 0, 0, 16, 0, 0,
+  0, 15, 0, 83, 0, 21, 90, 39, 0, 48,
+  26, 0, 0, 60, 13, 28, 16, 0, 25, 81,
+  1, 0, 0, 0, 1, 44, 17, 19, 0, 35,
+  60, 0, 78, 36, 79, 138, 7, 0, 76, 0,
+  2, 0, 0, 129, 0, 4, 0, 11, 0, 4,
+  0, 0, 138, 0, 2, 0, 27, 0, 0, 90,
+  14, 2, 90, 0, 0, 39, 0, 61, 111, 0,
+  118, 35, 0, 31, 35, 22, 25, 0, 0, 0,
+  0, 27, 0, 0, 12, 25, 0, 0, 0, 91,
+  0, 7, 15, 0, 6, 0, 0, 89, 131, 18,
+  0, 0, 39, 0, 0, 48, 0, 0, 1, 67,
+  0, 57, 0, 0, 0, 0, 75, 0, 0, 0,
+  0, 0, 0, 0, 75, 51, 0, 1, 0, 0,
+  0, 57, 0, 18, 70, 15, 0, 4, 0, 0,
+  0, 50, 13, 20, 0, 0, 47, 47, 29, 12,
+  0, 0, 0, 10, 0, 0, 0, 0, 50, 0,
+  0, 44, 0, 64, 0, 0, 54, 0, 0, 47,
+  0, 99, 16, 46, 0, 15, 0, 37, 0, 0,
+  63, 0, 74, 0, 64, 0, 0, 62, 0, 0,
+  90, 0, 0, 12, 30, 23, 61, 0, 70, 60,
+  0, 76, 0, 1, 0, 0, 21, 0, 0, 0,
+  0, 0, 8, 0, 5, 0, 0, 121, 9, 0,
+  0, 0, 0, 0, 20, 54, 116, 17, 0, 0,
+  0, 0, 11, 9, 0, 21, 0, 19, 0, 73,
+  0, 0, 0, 0, 56, 0, 53, 0, 0, 0,
+  21, 0, 18, 0, 0, 48, 16, 0, 0, 0,
+  50, 44, 75, 3, 3, 42, 110, 0, 16, 61,
+  79, 13, 2, 0, 31, 54, 4, 6, 49, 0,
+  0, 45, 0, 0, 0, 0, 83, 0, 2, 0,
+  0, 62, 0, 80, 0, 35, 4, 49, 18, 97,
+  6, 35, 0, 42, 0, 40, 48, 0, 23, 0,
+  3, 0, 0, 0, 0, 5, 0, 59, 0, 17,
+  20, 0, 40, 0, 0, 0, 0, 48, 8, 0,
+  29, 54, 0, 0, 33, 0, 42, 5, 0, 9,
+  4, 0, 0, 8, 0, 4, 0, 44, 0, 13,
+  5, 8, 15, 84, 41, 0, 0, 0, 34, 0,
+  24, 13, 4, 22, 0, 21, 0, 22, 0, 0,
+  0, 0, 35, 0, 31, 0, 111, 0, 71, 0,
+  32, 0, 3, 37, 0, 0, 14, 0, 32, 0,
+  0, 0, 3, 23, 56, 0, 0, 4, 62, 15,
+  4, 0, 0, 72, 0, 17, 107, 0, 0, 48,
+  0, 0, 0, 48, 90, 0, 0, 0, 0, 51,
+  43, 7, 0, 46, 21, 29, 25, 100, 41, 0,
+  0, 5, 0, 0, 5, 0, 27, 0, 7, 0,
+  20, 2, 58, 63, 0, 50, 0, 0, 97, 52,
+  73, 0, 0, 0, 9, 20, 30, 0, 53, 59,
+  0, 0, 0, 0, 39, 57, 10, 31, 0, 0,
+  0, 14, 0, 0, 0, 54, 0, 21, 0, 18,
+  0, 113, 24, 11, 22, 20, 39, 43, 10, 0,
+  43, 0, 0, 50, 0, 0, 0, 0, 10, 1,
+  48, 0, 7, 0, 27, 0, 30, 0, 30, 47,
+  0, 0, 0, 25, 0, 135, 0, 7, 42, 0,
+  0, 4, 0, 6, 0, 0, 0, 25, 13, 0,
+  41, 106, 15, 0, 0, 0, 0, 1, 0, 0,
+  0, 1, 9, 0, 0, 82, 0, 40, 0, 0,
+  45, 0, 0, 46, 0, 80, 0, 4, 0, 0,
+  0, 52, 0, 0, 133, 36, 44, 0, 57, 0,
+  0, 92, 42, 0, 155, 0, 0, 30, 0, 77,
+  196, 0, 59, 34, 0, 31, 0, 16, 9, 0,
+  0, 0, 35, 0, 0, 0, 1, 0, 11, 0,
+  0, 92, 0, 0, 27, 0, 0, 0, 7, 76,
+  78, 108, 0, 0, 0, 0, 0, 30, 0, 0,
+  0, 38, 0, 95, 0, 0, 0, 0, 52, 0,
+  0, 0, 0, 0, 21, 0, 0, 6, 0, 28,
+  0, 8, 0, 24, 24, 29, 104, 12, 0, 37,
+  106, 0, 0, 105, 62, 22, 0, 0, 41, 62,
+  0, 12, 2, 0, 0, 43, 0, 0, 0, 0,
+  76, 0, 33, 0, 0, 91, 0, 53, 32, 0,
+  4, 39, 5, 115, 2, 34, 0, 36, 0, 56,
+  16, 0, 56, 0, 6, 0, 36, 0, 0, 14,
+  0, 21, 0, 0, 0, 0, 27, 0, 37, 0,
+  47, 52, 0, 14, 8, 31, 0, 0, 8, 0,
+  29, 0, 0, 10, 11, 0, 20, 0, 0, 68,
+  0, 34, 0, 0, 0, 0, 26, 84, 90, 0,
+  0, 0, 22, 0, 15, 31, 0, 34, 0, 30,
+  0, 52, 0, 0, 0, 0, 60, 0, 39, 0,
+  79, 0, 69, 0, 34, 16, 0, 39, 58, 0,
+  0, 0, 35, 20, 76, 0, 11, 39, 97, 0,
+  0, 94, 63, 17, 0, 0, 0, 47, 11, 21,
+  63, 0, 0, 58, 0, 0, 0, 24, 97, 0,
+  27, 0, 0, 89, 26, 22, 38, 4, 46, 33,
+  23, 117, 42, 0, 0, 22, 0, 0, 14, 0,
+  32, 0, 5, 0, 47, 0, 0, 49, 0, 19,
+  0, 0, 17, 1, 30, 0, 0, 0, 56, 43,
+  10, 31, 22, 65, 0, 0, 6, 0, 19, 88,
+  0, 42, 0, 0, 0, 23, 0, 11, 0, 31,
+  0, 0, 0, 0, 0, 85, 98, 0, 0, 0,
+  13, 0, 31, 29, 0, 24, 0, 19, 0, 5,
+  0, 0, 0, 12, 70, 0, 0, 0, 32, 0,
+  63, 0, 24, 34, 58, 21, 0, 68, 2, 105,
+  0, 4, 38, 0, 0, 0, 40, 0, 0, 0,
+  2, 21, 35, 0, 0, 90, 13, 0, 0, 0,
+  31, 0, 9, 0, 0, 31, 3, 0, 67, 72,
+  9, 0, 27, 0, 20, 14, 0, 28, 22, 53,
+  41, 0, 0, 0, 0, 61, 0, 0, 135, 38,
+  37, 0, 7, 0, 0, 47, 34, 0, 96, 0,
+  0, 31, 0, 47, 198, 6, 55, 0, 0, 0,
+  0, 35, 0, 0, 0, 0, 77, 27, 31, 0,
+  1, 1, 38, 0, 0, 15, 0, 0, 17, 0,
+  39, 0, 26, 71, 33, 77, 0, 0, 0, 0,
+  6, 46, 5, 0, 19, 40, 0, 88, 0, 0,
+  0, 0, 55, 0, 0, 0, 0, 0, 28, 0,
+  0, 16, 0, 0, 0, 15, 0, 83, 0, 21,
+  90, 39, 0, 48, 26, 0, 0, 60, 13, 28,
+  16, 0, 25, 81, 1, 0, 0, 0, 1, 44,
+  17, 19, 0, 35, 60, 0, 78, 36, 79, 138,
+  7, 0, 76, 0, 2, 0, 0, 129, 0, 4,
+  0, 11, 0, 4, 0, 0, 138, 0, 2, 0,
+  27, 0, 0, 90, 14, 2, 90, 0, 0, 39,
+  0, 61, 111, 0, 118, 35, 0, 31, 35, 22,
+  25, 0, 0, 0, 0, 27, 0, 0, 12, 25,
+  0, 0, 0, 91, 0, 7, 15, 0, 6, 0,
+  0, 89, 131, 18, 0, 0, 39, 0, 0, 48,
+  0, 0, 1, 67, 0, 57, 0, 0, 0, 0,
+  75, 0, 0, 0, 0, 0, 0, 0, 75, 51,
+  0, 0, 95, 9, 0, 0, 0, 24, 67, 28,
+  0, 54, 35, 44, 0, 52, 0, 15, 0, 0,
+  0, 58, 28, 9, 0, 0, 21, 48, 6, 84,
+  0, 37, 76, 0, 22, 0, 105, 123, 0, 0,
+  100, 0, 38, 0, 0, 109, 0, 0, 0, 11,
+  0, 0, 0, 0, 96, 0, 19, 0, 47, 0,
+  0, 83, 53, 15, 66, 0, 7, 34, 0, 90,
+  0, 0, 122, 30, 0, 21, 7, 0, 14, 0,
+  0, 2, 0, 89, 0, 17, 21, 0, 35, 0,
+  0, 36, 0, 3, 0, 0, 0, 0, 0, 59,
+  137, 0, 0, 0, 0, 0, 0, 52, 0, 3,
+  30, 17, 0, 0, 80, 0, 22, 0, 52, 0,
+  0, 0, 0, 0, 0, 14, 61, 73, 0, 48,
+  16, 0, 0, 0, 50, 44, 75, 3, 3, 42,
+  110, 0, 16, 61, 79, 13, 2, 0, 31, 54,
+  4, 6, 49, 0, 0, 45, 0, 0, 0, 0,
+  83, 0, 2, 0, 0, 62, 0, 80, 0, 35,
+  4, 49, 18, 97, 6, 35, 0, 42, 0, 40,
+  48, 0, 23, 0, 3, 0, 0, 0, 0, 5,
+  0, 59, 0, 17, 20, 0, 40, 0, 0, 0,
+  0, 48, 8, 0, 29, 54, 0, 0, 33, 0,
+  42, 5, 0, 9, 4, 0, 0, 8, 0, 4,
+  0, 44, 0, 13, 5, 8, 15, 84, 41, 0,
+  0, 0, 34, 0, 24, 13, 4, 22, 0, 21,
+  0, 22, 0, 0, 0, 0, 35, 0, 31, 0,
+  111, 0, 71, 0, 32, 0, 3, 37, 0, 0,
+  14, 0, 32, 0, 0, 0, 3, 23, 56, 0,
+  0, 4, 62, 15, 4, 0, 0, 72, 0, 17,
+  107, 0, 0, 48, 0, 0, 0, 48, 90, 0,
+  0, 0, 0, 51, 43, 7, 0, 46, 21, 29,
+  25, 100, 41, 0, 0, 5, 0, 0, 5, 0,
+  27, 0, 7, 0, 20, 2, 58, 63, 0, 50,
+  0, 0, 97, 52, 73, 0, 0, 0, 9, 20,
+  30, 0, 53, 59, 0, 0, 0, 0, 39, 57,
+  10, 31, 0, 0, 0, 14, 0, 0, 0, 54,
+  0, 21, 0, 18, 0, 113, 24, 11, 22, 20,
+  39, 43, 10, 0, 43, 0, 0, 50, 0, 0,
+  0, 0, 10, 1, 48, 0, 7, 0, 27, 0,
+  30, 0, 30, 47, 0, 22, 0, 0, 13, 12,
+  20, 0, 30, 0, 12, 20, 47, 4, 0, 16,
+  61, 0, 3, 0, 0, 56, 0, 10, 36, 0,
+  0, 41, 0, 0, 2, 0, 51, 24, 0, 0,
+  0, 75, 57, 0, 0, 1, 0, 46, 0, 115,
+  40, 68, 0, 0, 0, 16, 0, 0, 30, 32,
+  30, 0, 49, 0, 37, 54, 0, 31, 7, 0,
+  25, 63, 98, 0, 89, 0, 26, 32, 28, 22,
+  29, 0, 0, 0, 0, 0, 23, 34, 22, 43,
+  0, 13, 0, 0, 0, 67, 0, 29, 0, 0,
+  0, 0, 28, 122, 64, 34, 0, 28, 14, 55,
+  5, 5, 0, 0, 0, 59, 0, 9, 0, 5,
+  0, 38, 80, 0, 0, 0, 7, 0, 12, 0,
+  22, 22, 0, 28, 0, 8, 0, 24, 24, 29,
+  104, 12, 0, 37, 106, 0, 0, 105, 62, 22,
+  0, 0, 41, 62, 0, 12, 2, 0, 0, 43,
+  0, 0, 0, 0, 76, 0, 33, 0, 0, 91,
+  0, 53, 32, 0, 4, 39, 5, 115, 2, 34,
+  0, 36, 0, 56, 16, 0, 56, 0, 6, 0,
+  36, 0, 0, 14, 0, 21, 0, 0, 0, 0,
+  27, 0, 37, 0, 47, 52, 0, 14, 8, 31,
+  0, 0, 8, 0, 29, 0, 0, 10, 11, 0,
+  20, 0, 0, 68, 0, 34, 0, 0, 0, 0,
+  26, 84, 90, 0, 0, 0, 22, 0, 15, 31,
+  0, 34, 0, 30, 0, 52, 0, 0, 0, 0,
+  60, 0, 39, 0, 79, 0, 69, 0, 34, 16,
+  0, 39, 58, 0, 0, 0, 35, 20, 76, 0,
+  11, 39, 97, 0, 0, 94, 63, 17, 0, 0,
+  0, 47, 11, 21, 63, 0, 0, 58, 0, 0,
+  0, 24, 97, 0, 27, 0, 0, 89, 26, 22,
+  38, 4, 46, 33, 23, 117, 42, 0, 0, 22,
+  0, 0, 14, 0, 32, 0, 5, 0, 47, 0,
+  0, 49, 0, 19, 0, 0, 17, 1, 30, 0,
+  0, 0, 56, 43, 10, 31, 22, 65, 0, 0,
+  6, 0, 19, 88, 0, 42, 0, 0, 0, 23,
+  0, 11, 0, 31, 0, 0, 0, 0, 0, 85,
+  98, 0, 0, 0, 13, 0, 31, 29, 0, 24,
+  0, 19, 0, 5, 0, 0, 0, 12, 70, 0,
+  0, 0, 32, 0, 63, 0, 24, 34, 0, 10,
+  0, 0, 0, 0, 0, 1, 32, 2, 16, 56,
+  0, 30, 0, 9, 3, 0, 2, 0, 1, 27,
+  71, 20, 5, 0, 0, 23, 0, 18, 0, 0,
+  30, 0, 15, 0, 59, 84, 34, 0, 85, 0,
+  0, 5, 0, 98, 39, 10, 0, 0, 0, 0,
+  0, 0, 57, 0, 55, 0, 96, 0, 0, 81,
+  9, 12, 28, 9, 50, 46, 29, 21, 0, 0,
+  85, 58, 7, 94, 37, 18, 0, 0, 0, 22,
+  0, 74, 0, 50, 11, 36, 0, 0, 0, 84,
+  19, 16, 0, 0, 0, 0, 17, 49, 89, 0,
+  0, 0, 0, 27, 5, 0, 0, 3, 0, 9,
+  0, 9, 21, 75, 0, 33, 64, 0, 0, 0,
+  0, 0, 0, 0, 0, 41, 0, 0, 0, 15,
+  0, 83, 0, 21, 90, 39, 0, 48, 26, 0,
+  0, 60, 13, 28, 16, 0, 25, 81, 1, 0,
+  0, 0, 1, 44, 17, 19, 0, 35, 60, 0,
+  78, 36, 79, 138, 7, 0, 76, 0, 2, 0,
+  0, 129, 0, 4, 0, 11, 0, 4, 0, 0,
+  138, 0, 2, 0, 27, 0, 0, 90, 14, 2,
+  90, 0, 0, 39, 0, 61, 111, 0, 118, 35,
+  0, 31, 35, 22, 25, 0, 0, 0, 0, 27,
+  0, 0, 12, 25, 0, 0, 0, 91, 0, 7,
+  15, 0, 6, 0, 0, 89, 131, 18, 0, 0,
+  39, 0, 0, 48, 0, 0, 1, 67, 0, 57,
+  0, 0, 0, 0, 75, 0, 0, 0, 0, 0,
+  0, 0, 75, 51, 0, 0, 95, 9, 0, 0,
+  0, 24, 67, 28, 0, 54, 35, 44, 0, 52,
+  0, 15, 0, 0, 0, 58, 28, 9, 0, 0,
+  21, 48, 6, 84, 0, 37, 76, 0, 22, 0,
+  105, 123, 0, 0, 100, 0, 38, 0, 0, 109,
+  0, 0, 0, 11, 0, 0, 0, 0, 96, 0,
+  19, 0, 47, 0, 0, 83, 53, 15, 66, 0,
+  7, 34, 0, 90, 0, 0, 122, 30, 0, 21,
+  7, 0, 14, 0, 0, 2, 0, 89, 0, 17,
+  21, 0, 35, 0, 0, 36, 0, 3, 0, 0,
+  0, 0, 0, 59, 137, 0, 0, 0, 0, 0,
+  0, 52, 0, 3, 30, 17, 0, 0, 80, 0,
+  22, 0, 52, 0, 0, 0, 0, 0, 0, 14,
+  61, 73, 19, 3, 82, 25, 7, 0, 0, 19,
+  0, 0, 0, 50, 24, 124, 0, 0, 0, 0,
+  0, 0, 16, 66, 70, 4, 0, 0, 12, 4,
+  0, 88, 7, 3, 0, 13, 0, 0, 74, 8,
+  0, 0, 84, 0, 0, 15, 17, 36, 17, 22,
+  4, 0, 9, 49, 0, 0, 86, 0, 46, 0,
+  71, 0, 0, 47, 100, 0, 96, 0, 0, 47,
+  0, 116, 0, 23, 90, 0, 0, 33, 0, 0,
+  23, 0, 0, 55, 0, 76, 0, 1, 45, 31,
+  68, 0, 0, 0, 10, 0, 0, 0, 0, 0,
+  0, 29, 67, 0, 0, 0, 0, 4, 0, 42,
+  0, 0, 54, 0, 0, 0, 124, 74, 44, 0,
+  25, 0, 0, 0, 0, 25, 0, 22, 0, 56,
+  3, 37, 0, 0, 14, 0, 32, 0, 0, 0,
+  3, 23, 56, 0, 0, 4, 62, 15, 4, 0,
+  0, 72, 0, 17, 107, 0, 0, 48, 0, 0,
+  0, 48, 90, 0, 0, 0, 0, 51, 43, 7,
+  0, 46, 21, 29, 25, 100, 41, 0, 0, 5,
+  0, 0, 5, 0, 27, 0, 7, 0, 20, 2,
+  58, 63, 0, 50, 0, 0, 97, 52, 73, 0,
+  0, 0, 9, 20, 30, 0, 53, 59, 0, 0,
+  0, 0, 39, 57, 10, 31, 0, 0, 0, 14,
+  0, 0, 0, 54, 0, 21, 0, 18, 0, 113,
+  24, 11, 22, 20, 39, 43, 10, 0, 43, 0,
+  0, 50, 0, 0, 0, 0, 10, 1, 48, 0,
+  7, 0, 27, 0, 30, 0, 30, 47, 0, 22,
+  0, 0, 13, 12, 20, 0, 30, 0, 12, 20,
+  47, 4, 0, 16, 61, 0, 3, 0, 0, 56,
+  0, 10, 36, 0, 0, 41, 0, 0, 2, 0,
+  51, 24, 0, 0, 0, 75, 57, 0, 0, 1,
+  0, 46, 0, 115, 40, 68, 0, 0, 0, 16,
+  0, 0, 30, 32, 30, 0, 49, 0, 37, 54,
+  0, 31, 7, 0, 25, 63, 98, 0, 89, 0,
+  26, 32, 28, 22, 29, 0, 0, 0, 0, 0,
+  23, 34, 22, 43, 0, 13, 0, 0, 0, 67,
+  0, 29, 0, 0, 0, 0, 28, 122, 64, 34,
+  0, 28, 14, 55, 5, 5, 0, 0, 0, 59,
+  0, 9, 0, 5, 0, 38, 80, 0, 0, 0,
+  7, 0, 12, 0, 22, 22, 0, 49, 0, 0,
+  0, 0, 12, 0, 80, 43, 25, 0, 73, 2,
+  0, 149, 100, 43, 17, 0, 0, 0, 0, 25,
+  0, 0, 21, 90, 9, 0, 9, 0, 115, 13,
+  0, 0, 4, 73, 0, 0, 23, 0, 0, 26,
+  0, 80, 0, 54, 0, 37, 0, 15, 61, 0,
+  0, 23, 13, 7, 0, 32, 0, 0, 0, 0,
+  0, 0, 27, 12, 61, 0, 7, 0, 0, 98,
+  0, 66, 0, 13, 0, 0, 19, 3, 24, 48,
+  0, 47, 3, 23, 13, 19, 53, 124, 0, 32,
+  23, 0, 0, 0, 0, 90, 142, 0, 0, 0,
+  8, 0, 0, 33, 0, 34, 0, 47, 0, 22,
+  0, 0, 0, 0, 6, 0, 0, 0, 122, 0,
+  29, 0, 52, 16, 0, 39, 58, 0, 0, 0,
+  35, 20, 76, 0, 11, 39, 97, 0, 0, 94,
+  63, 17, 0, 0, 0, 47, 11, 21, 63, 0,
+  0, 58, 0, 0, 0, 24, 97, 0, 27, 0,
+  0, 89, 26, 22, 38, 4, 46, 33, 23, 117,
+  42, 0, 0, 22, 0, 0, 14, 0, 32, 0,
+  5, 0, 47, 0, 0, 49, 0, 19, 0, 0,
+  17, 1, 30, 0, 0, 0, 56, 43, 10, 31,
+  22, 65, 0, 0, 6, 0, 19, 88, 0, 42,
+  0, 0, 0, 23, 0, 11, 0, 31, 0, 0,
+  0, 0, 0, 85, 98, 0, 0, 0, 13, 0,
+  31, 29, 0, 24, 0, 19, 0, 5, 0, 0,
+  0, 12, 70, 0, 0, 0, 32, 0, 63, 0,
+  24, 34, 0, 10, 0, 0, 0, 0, 0, 1,
+  32, 2, 16, 56, 0, 30, 0, 9, 3, 0,
+  2, 0, 1, 27, 71, 20, 5, 0, 0, 23,
+  0, 18, 0, 0, 30, 0, 15, 0, 59, 84,
+  34, 0, 85, 0, 0, 5, 0, 98, 39, 10,
+  0, 0, 0, 0, 0, 0, 57, 0, 55, 0,
+  96, 0, 0, 81, 9, 12, 28, 9, 50, 46,
+  29, 21, 0, 0, 85, 58, 7, 94, 37, 18,
+  0, 0, 0, 22, 0, 74, 0, 50, 11, 36,
+  0, 0, 0, 84, 19, 16, 0, 0, 0, 0,
+  17, 49, 89, 0, 0, 0, 0, 27, 5, 0,
+  0, 3, 0, 9, 0, 9, 21, 75, 0, 33,
+  64, 0, 0, 0, 0, 0, 0, 0, 0, 41,
+  4, 18, 11, 6, 0, 0, 0, 0, 60, 44,
+  0, 0, 0, 54, 0, 0, 0, 29, 17, 0,
+  3, 11, 34, 17, 0, 0, 58, 48, 0, 0,
+  0, 0, 53, 0, 0, 0, 74, 109, 0, 0,
+  46, 0, 0, 0, 0, 59, 0, 51, 0, 23,
+  0, 0, 0, 0, 78, 7, 34, 8, 0, 0,
+  0, 52, 29, 14, 74, 2, 53, 17, 8, 144,
+  9, 0, 46, 89, 0, 57, 27, 0, 12, 0,
+  0, 0, 31, 87, 0, 30, 0, 43, 20, 0,
+  0, 171, 0, 0, 22, 0, 7, 0, 0, 57,
+  123, 33, 0, 0, 0, 0, 0, 2, 0, 0,
+  0, 24, 0, 10, 20, 24, 0, 0, 14, 0,
+  0, 0, 0, 0, 0, 4, 58, 62, 0, 0,
+  95, 9, 0, 0, 0, 24, 67, 28, 0, 54,
+  35, 44, 0, 52, 0, 15, 0, 0, 0, 58,
+  28, 9, 0, 0, 21, 48, 6, 84, 0, 37,
+  76, 0, 22, 0, 105, 123, 0, 0, 100, 0,
+  38, 0, 0, 109, 0, 0, 0, 11, 0, 0,
+  0, 0, 96, 0, 19, 0, 47, 0, 0, 83,
+  53, 15, 66, 0, 7, 34, 0, 90, 0, 0,
+  122, 30, 0, 21, 7, 0, 14, 0, 0, 2,
+  0, 89, 0, 17, 21, 0, 35, 0, 0, 36,
+  0, 3, 0, 0, 0, 0, 0, 59, 137, 0,
+  0, 0, 0, 0, 0, 52, 0, 3, 30, 17,
+  0, 0, 80, 0, 22, 0, 52, 0, 0, 0,
+  0, 0, 0, 14, 61, 73, 19, 3, 82, 25,
+  7, 0, 0, 19, 0, 0, 0, 50, 24, 124,
+  0, 0, 0, 0, 0, 0, 16, 66, 70, 4,
+  0, 0, 12, 4, 0, 88, 7, 3, 0, 13,
+  0, 0, 74, 8, 0, 0, 84, 0, 0, 15,
+  17, 36, 17, 22, 4, 0, 9, 49, 0, 0,
+  86, 0, 46, 0, 71, 0, 0, 47, 100, 0,
+  96, 0, 0, 47, 0, 116, 0, 23, 90, 0,
+  0, 33, 0, 0, 23, 0, 0, 55, 0, 76,
+  0, 1, 45, 31, 68, 0, 0, 0, 10, 0,
+  0, 0, 0, 0, 0, 29, 67, 0, 0, 0,
+  0, 4, 0, 42, 0, 0, 54, 0, 0, 0,
+  124, 74, 44, 0, 25, 0, 0, 0, 0, 25,
+  0, 22, 0, 56, 83, 83, 12, 72, 44, 15,
+  0, 0, 20, 0, 22, 0, 23, 126, 0, 0,
+  0, 0, 39, 0, 24, 37, 34, 21, 0, 0,
+  35, 11, 0, 34, 52, 81, 0, 0, 0, 0,
+  0, 26, 0, 0, 0, 1, 0, 0, 1, 18,
+  42, 71, 0, 0, 11, 40, 0, 7, 106, 0,
+  38, 4, 10, 0, 0, 34, 61, 26, 20, 0,
+  27, 21, 0, 98, 0, 49, 51, 0, 0, 28,
+  54, 0, 44, 0, 0, 48, 15, 60, 0, 1,
+  2, 45, 68, 0, 14, 0, 0, 25, 0, 0,
+  81, 0, 11, 15, 12, 121, 4, 0, 0, 16,
+  0, 68, 74, 0, 26, 0, 17, 1, 24, 87,
+  0, 0, 20, 2, 10, 0, 0, 0, 0, 22,
+  0, 87, 0, 22, 0, 0, 13, 12, 20, 0,
+  30, 0, 12, 20, 47, 4, 0, 16, 61, 0,
+  3, 0, 0, 56, 0, 10, 36, 0, 0, 41,
+  0, 0, 2, 0, 51, 24, 0, 0, 0, 75,
+  57, 0, 0, 1, 0, 46, 0, 115, 40, 68,
+  0, 0, 0, 16, 0, 0, 30, 32, 30, 0,
+  49, 0, 37, 54, 0, 31, 7, 0, 25, 63,
+  98, 0, 89, 0, 26, 32, 28, 22, 29, 0,
+  0, 0, 0, 0, 23, 34, 22, 43, 0, 13,
+  0, 0, 0, 67, 0, 29, 0, 0, 0, 0,
+  28, 122, 64, 34, 0, 28, 14, 55, 5, 5,
+  0, 0, 0, 59, 0, 9, 0, 5, 0, 38,
+  80, 0, 0, 0, 7, 0, 12, 0, 22, 22,
+  0, 49, 0, 0, 0, 0, 12, 0, 80, 43,
+  25, 0, 73, 2, 0, 149, 100, 43, 17, 0,
+  0, 0, 0, 25, 0, 0, 21, 90, 9, 0,
+  9, 0, 115, 13, 0, 0, 4, 73, 0, 0,
+  23, 0, 0, 26, 0, 80, 0, 54, 0, 37,
+  0, 15, 61, 0, 0, 23, 13, 7, 0, 32,
+  0, 0, 0, 0, 0, 0, 27, 12, 61, 0,
+  7, 0, 0, 98, 0, 66, 0, 13, 0, 0,
+  19, 3, 24, 48, 0, 47, 3, 23, 13, 19,
+  53, 124, 0, 32, 23, 0, 0, 0, 0, 90,
+  142, 0, 0, 0, 8, 0, 0, 33, 0, 34,
+  0, 47, 0, 22, 0, 0, 0, 0, 6, 0,
+  0, 0, 122, 0, 29, 0, 52, 16, 0, 27,
+  108, 0, 0, 0, 0, 0, 90, 42, 15, 0,
+  26, 53, 0, 84, 60, 35, 50, 0, 0, 15,
+  20, 31, 0, 0, 3, 111, 0, 0, 0, 0,
+  61, 0, 0, 0, 0, 79, 0, 0, 3, 0,
+  0, 0, 0, 28, 0, 0, 0, 35, 0, 82,
+  11, 0, 69, 0, 27, 18, 0, 0, 0, 0,
+  0, 0, 27, 0, 48, 0, 11, 70, 0, 0,
+  22, 90, 0, 69, 0, 68, 0, 0, 7, 0,
+  32, 92, 0, 47, 0, 58, 48, 0, 85, 34,
+  0, 0, 11, 0, 0, 0, 0, 133, 125, 0,
+  0, 0, 8, 0, 0, 61, 0, 16, 7, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  45, 0, 54, 0, 21, 46, 0, 10, 0, 0,
+  0, 0, 0, 1, 32, 2, 16, 56, 0, 30,
+  0, 9, 3, 0, 2, 0, 1, 27, 71, 20,
+  5, 0, 0, 23, 0, 18, 0, 0, 30, 0,
+  15, 0, 59, 84, 34, 0, 85, 0, 0, 5,
+  0, 98, 39, 10, 0, 0, 0, 0, 0, 0,
+  57, 0, 55, 0, 96, 0, 0, 81, 9, 12,
+  28, 9, 50, 46, 29, 21, 0, 0, 85, 58,
+  7, 94, 37, 18, 0, 0, 0, 22, 0, 74,
+  0, 50, 11, 36, 0, 0, 0, 84, 19, 16,
+  0, 0, 0, 0, 17, 49, 89, 0, 0, 0,
+  0, 27, 5, 0, 0, 3, 0, 9, 0, 9,
+  21, 75, 0, 33, 64, 0, 0, 0, 0, 0,
+  0, 0, 0, 41, 4, 18, 11, 6, 0, 0,
+  0, 0, 60, 44, 0, 0, 0, 54, 0, 0,
+  0, 29, 17, 0, 3, 11, 34, 17, 0, 0,
+  58, 48, 0, 0, 0, 0, 53, 0, 0, 0,
+  74, 109, 0, 0, 46, 0, 0, 0, 0, 59,
+  0, 51, 0, 23, 0, 0, 0, 0, 78, 7,
+  34, 8, 0, 0, 0, 52, 29, 14, 74, 2,
+  53, 17, 8, 144, 9, 0, 46, 89, 0, 57,
+  27, 0, 12, 0, 0, 0, 31, 87, 0, 30,
+  0, 43, 20, 0, 0, 171, 0, 0, 22, 0,
+  7, 0, 0, 57, 123, 33, 0, 0, 0, 0,
+  0, 2, 0, 0, 0, 24, 0, 10, 20, 24,
+  0, 0, 14, 0, 0, 0, 0, 0, 0, 4,
+  58, 62, 28, 0, 51, 0, 0, 127, 0, 0,
+  28, 13, 0, 0, 0, 82, 0, 0, 9, 29,
+  31, 0, 0, 85, 28, 32, 0, 0, 13, 55,
+  0, 0, 0, 43, 0, 0, 0, 17, 44, 93,
+  0, 0, 24, 0, 15, 0, 0, 32, 0, 29,
+  0, 35, 0, 77, 0, 0, 138, 0, 12, 0,
+  0, 0, 0, 64, 0, 0, 81, 0, 9, 6,
+  12, 125, 8, 0, 33, 55, 0, 39, 22, 0,
+  0, 0, 0, 0, 28, 82, 0, 10, 0, 46,
+  0, 0, 0, 123, 0, 0, 55, 0, 11, 0,
+  0, 88, 63, 49, 0, 0, 27, 0, 0, 10,
+  0, 6, 1, 11, 0, 0, 9, 35, 24, 0,
+  11, 0, 0, 0, 0, 0, 0, 3, 9, 79,
+  19, 3, 82, 25, 7, 0, 0, 19, 0, 0,
+  0, 50, 24, 124, 0, 0, 0, 0, 0, 0,
+  16, 66, 70, 4, 0, 0, 12, 4, 0, 88,
+  7, 3, 0, 13, 0, 0, 74, 8, 0, 0,
+  84, 0, 0, 15, 17, 36, 17, 22, 4, 0,
+  9, 49, 0, 0, 86, 0, 46, 0, 71, 0,
+  0, 47, 100, 0, 96, 0, 0, 47, 0, 116,
+  0, 23, 90, 0, 0, 33, 0, 0, 23, 0,
+  0, 55, 0, 76, 0, 1, 45, 31, 68, 0,
+  0, 0, 10, 0, 0, 0, 0, 0, 0, 29,
+  67, 0, 0, 0, 0, 4, 0, 42, 0, 0,
+  54, 0, 0, 0, 124, 74, 44, 0, 25, 0,
+  0, 0, 0, 25, 0, 22, 0, 56, 83, 83,
+  12, 72, 44, 15, 0, 0, 20, 0, 22, 0,
+  23, 126, 0, 0, 0, 0, 39, 0, 24, 37,
+  34, 21, 0, 0, 35, 11, 0, 34, 52, 81,
+  0, 0, 0, 0, 0, 26, 0, 0, 0, 1,
+  0, 0, 1, 18, 42, 71, 0, 0, 11, 40,
+  0, 7, 106, 0, 38, 4, 10, 0, 0, 34,
+  61, 26, 20, 0, 27, 21, 0, 98, 0, 49,
+  51, 0, 0, 28, 54, 0, 44, 0, 0, 48,
+  15, 60, 0, 1, 2, 45, 68, 0, 14, 0,
+  0, 25, 0, 0, 81, 0, 11, 15, 12, 121,
+  4, 0, 0, 16, 0, 68, 74, 0, 26, 0,
+  17, 1, 24, 87, 0, 0, 20, 2, 10, 0,
+  0, 0, 0, 22, 0, 87, 35, 0, 20, 65,
+  14, 232, 0, 0, 1, 0, 0, 0, 0, 21,
+  0, 0, 0, 33, 62, 0, 0, 113, 15, 0,
+  0, 0, 0, 6, 0, 17, 8, 99, 0, 0,
+  0, 33, 0, 40, 0, 0, 0, 0, 0, 0,
+  0, 58, 44, 47, 7, 4, 0, 38, 0, 0,
+  142, 0, 48, 0, 21, 0, 27, 92, 17, 0,
+  115, 0, 0, 40, 0, 96, 83, 63, 62, 0,
+  0, 35, 43, 0, 0, 0, 0, 0, 46, 65,
+  0, 0, 0, 31, 0, 0, 7, 7, 0, 0,
+  70, 0, 52, 0, 0, 9, 17, 116, 2, 0,
+  0, 5, 18, 17, 0, 0, 0, 39, 0, 0,
+  0, 45, 36, 0, 13, 16, 0, 19, 0, 0,
+  0, 15, 0, 44, 0, 49, 0, 0, 0, 0,
+  12, 0, 80, 43, 25, 0, 73, 2, 0, 149,
+  100, 43, 17, 0, 0, 0, 0, 25, 0, 0,
+  21, 90, 9, 0, 9, 0, 115, 13, 0, 0,
+  4, 73, 0, 0, 23, 0, 0, 26, 0, 80,
+  0, 54, 0, 37, 0, 15, 61, 0, 0, 23,
+  13, 7, 0, 32, 0, 0, 0, 0, 0, 0,
+  27, 12, 61, 0, 7, 0, 0, 98, 0, 66,
+  0, 13, 0, 0, 19, 3, 24, 48, 0, 47,
+  3, 23, 13, 19, 53, 124, 0, 32, 23, 0,
+  0, 0, 0, 90, 142, 0, 0, 0, 8, 0,
+  0, 33, 0, 34, 0, 47, 0, 22, 0, 0,
+  0, 0, 6, 0, 0, 0, 122, 0, 29, 0,
+  52, 16, 0, 27, 108, 0, 0, 0, 0, 0,
+  90, 42, 15, 0, 26, 53, 0, 84, 60, 35,
+  50, 0, 0, 15, 20, 31, 0, 0, 3, 111,
+  0, 0, 0, 0, 61, 0, 0, 0, 0, 79,
+  0, 0, 3, 0, 0, 0, 0, 28, 0, 0,
+  0, 35, 0, 82, 11, 0, 69, 0, 27, 18,
+  0, 0, 0, 0, 0, 0, 27, 0, 48, 0,
+  11, 70, 0, 0, 22, 90, 0, 69, 0, 68,
+  0, 0, 7, 0, 32, 92, 0, 47, 0, 58,
+  48, 0, 85, 34, 0, 0, 11, 0, 0, 0,
+  0, 133, 125, 0, 0, 0, 8, 0, 0, 61,
+  0, 16, 7, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 45, 0, 54, 0, 21, 46,
+  0, 0, 117, 0, 0, 75, 0, 0, 21, 0,
+  0, 1, 34, 80, 0, 0, 0, 31, 19, 0,
+  0, 94, 14, 24, 0, 0, 0, 29, 0, 0,
+  10, 39, 0, 0, 0, 0, 0, 56, 0, 0,
+  0, 0, 0, 7, 0, 0, 0, 0, 0, 0,
+  0, 155, 0, 0, 71, 0, 21, 0, 50, 0,
+  0, 5, 0, 0, 108, 0, 0, 0, 0, 98,
+  0, 0, 39, 7, 0, 0, 0, 22, 15, 0,
+  0, 0, 31, 74, 16, 3, 15, 30, 48, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 72,
+  30, 0, 0, 0, 0, 78, 0, 23, 0, 11,
+  40, 0, 0, 0, 17, 16, 68, 25, 10, 51,
+  0, 3, 0, 0, 33, 0, 0, 53, 4, 18,
+  11, 6, 0, 0, 0, 0, 60, 44, 0, 0,
+  0, 54, 0, 0, 0, 29, 17, 0, 3, 11,
+  34, 17, 0, 0, 58, 48, 0, 0, 0, 0,
+  53, 0, 0, 0, 74, 109, 0, 0, 46, 0,
+  0, 0, 0, 59, 0, 51, 0, 23, 0, 0,
+  0, 0, 78, 7, 34, 8, 0, 0, 0, 52,
+  29, 14, 74, 2, 53, 17, 8, 144, 9, 0,
+  46, 89, 0, 57, 27, 0, 12, 0, 0, 0,
+  31, 87, 0, 30, 0, 43, 20, 0, 0, 171,
+  0, 0, 22, 0, 7, 0, 0, 57, 123, 33,
+  0, 0, 0, 0, 0, 2, 0, 0, 0, 24,
+  0, 10, 20, 24, 0, 0, 14, 0, 0, 0,
+  0, 0, 0, 4, 58, 62, 28, 0, 51, 0,
+  0, 127, 0, 0, 28, 13, 0, 0, 0, 82,
+  0, 0, 9, 29, 31, 0, 0, 85, 28, 32,
+  0, 0, 13, 55, 0, 0, 0, 43, 0, 0,
+  0, 17, 44, 93, 0, 0, 24, 0, 15, 0,
+  0, 32, 0, 29, 0, 35, 0, 77, 0, 0,
+  138, 0, 12, 0, 0, 0, 0, 64, 0, 0,
+  81, 0, 9, 6, 12, 125, 8, 0, 33, 55,
+  0, 39, 22, 0, 0, 0, 0, 0, 28, 82,
+  0, 10, 0, 46, 0, 0, 0, 123, 0, 0,
+  55, 0, 11, 0, 0, 88, 63, 49, 0, 0,
+  27, 0, 0, 10, 0, 6, 1, 11, 0, 0,
+  9, 35, 24, 0, 11, 0, 0, 0, 0, 0,
+  0, 3, 9, 79, 0, 0, 30, 0, 26, 161,
+  0, 0, 0, 0, 0, 0, 49, 60, 0, 0,
+  11, 55, 0, 0, 7, 16, 0, 50, 0, 0,
+  0, 0, 0, 35, 21, 0, 0, 13, 0, 0,
+  0, 55, 0, 3, 0, 20, 0, 22, 0, 12,
+  34, 22, 0, 0, 13, 103, 4, 0, 17, 0,
+  10, 0, 46, 0, 0, 0, 0, 0, 54, 0,
+  0, 2, 0, 4, 0, 34, 24, 5, 0, 40,
+  0, 0, 0, 10, 0, 0, 18, 36, 19, 0,
+  31, 36, 38, 0, 0, 22, 13, 0, 4, 0,
+  0, 0, 1, 46, 1, 0, 0, 0, 0, 10,
+  0, 22, 0, 25, 23, 0, 0, 0, 5, 29,
+  102, 47, 32, 3, 54, 0, 0, 0, 37, 15,
+  0, 14, 83, 83, 12, 72, 44, 15, 0, 0,
+  20, 0, 22, 0, 23, 126, 0, 0, 0, 0,
+  39, 0, 24, 37, 34, 21, 0, 0, 35, 11,
+  0, 34, 52, 81, 0, 0, 0, 0, 0, 26,
+  0, 0, 0, 1, 0, 0, 1, 18, 42, 71,
+  0, 0, 11, 40, 0, 7, 106, 0, 38, 4,
+  10, 0, 0, 34, 61, 26, 20, 0, 27, 21,
+  0, 98, 0, 49, 51, 0, 0, 28, 54, 0,
+  44, 0, 0, 48, 15, 60, 0, 1, 2, 45,
+  68, 0, 14, 0, 0, 25, 0, 0, 81, 0,
+  11, 15, 12, 121, 4, 0, 0, 16, 0, 68,
+  74, 0, 26, 0, 17, 1, 24, 87, 0, 0,
+  20, 2, 10, 0, 0, 0, 0, 22, 0, 87,
+  35, 0, 20, 65, 14, 232, 0, 0, 1, 0,
+  0, 0, 0, 21, 0, 0, 0, 33, 62, 0,
+  0, 113, 15, 0, 0, 0, 0, 6, 0, 17,
+  8, 99, 0, 0, 0, 33, 0, 40, 0, 0,
+  0, 0, 0, 0, 0, 58, 44, 47, 7, 4,
+  0, 38, 0, 0, 142, 0, 48, 0, 21, 0,
+  27, 92, 17, 0, 115, 0, 0, 40, 0, 96,
+  83, 63, 62, 0, 0, 35, 43, 0, 0, 0,
+  0, 0, 46, 65, 0, 0, 0, 31, 0, 0,
+  7, 7, 0, 0, 70, 0, 52, 0, 0, 9,
+  17, 116, 2, 0, 0, 5, 18, 17, 0, 0,
+  0, 39, 0, 0, 0, 45, 36, 0, 13, 16,
+  0, 19, 0, 0, 0, 15, 0, 44, 0, 0,
+  0, 5, 19, 184, 0, 0, 0, 0, 0, 0,
+  30, 14, 0, 24, 4, 50, 5, 0, 21, 0,
+  0, 62, 18, 19, 0, 0, 0, 10, 18, 0,
+  0, 34, 0, 4, 0, 24, 0, 24, 0, 55,
+  0, 16, 0, 17, 43, 43, 0, 20, 0, 38,
+  14, 0, 0, 0, 9, 0, 19, 12, 5, 26,
+  0, 0, 6, 0, 0, 22, 22, 0, 30, 56,
+  37, 1, 2, 80, 0, 0, 0, 42, 0, 0,
+  13, 12, 24, 0, 22, 14, 2, 28, 1, 67,
+  43, 9, 35, 30, 0, 0, 7, 25, 0, 0,
+  0, 0, 0, 0, 0, 6, 0, 17, 0, 1,
+  0, 13, 0, 7, 81, 29, 34, 0, 48, 9,
+  42, 0, 38, 19, 0, 0, 0, 27, 108, 0,
+  0, 0, 0, 0, 90, 42, 15, 0, 26, 53,
+  0, 84, 60, 35, 50, 0, 0, 15, 20, 31,
+  0, 0, 3, 111, 0, 0, 0, 0, 61, 0,
+  0, 0, 0, 79, 0, 0, 3, 0, 0, 0,
+  0, 28, 0, 0, 0, 35, 0, 82, 11, 0,
+  69, 0, 27, 18, 0, 0, 0, 0, 0, 0,
+  27, 0, 48, 0, 11, 70, 0, 0, 22, 90,
+  0, 69, 0, 68, 0, 0, 7, 0, 32, 92,
+  0, 47, 0, 58, 48, 0, 85, 34, 0, 0,
+  11, 0, 0, 0, 0, 133, 125, 0, 0, 0,
+  8, 0, 0, 61, 0, 16, 7, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 45, 0,
+  54, 0, 21, 46, 0, 0, 117, 0, 0, 75,
+  0, 0, 21, 0, 0, 1, 34, 80, 0, 0,
+  0, 31, 19, 0, 0, 94, 14, 24, 0, 0,
+  0, 29, 0, 0, 10, 39, 0, 0, 0, 0,
+  0, 56, 0, 0, 0, 0, 0, 7, 0, 0,
+  0, 0, 0, 0, 0, 155, 0, 0, 71, 0,
+  21, 0, 50, 0, 0, 5, 0, 0, 108, 0,
+  0, 0, 0, 98, 0, 0, 39, 7, 0, 0,
+  0, 22, 15, 0, 0, 0, 31, 74, 16, 3,
+  15, 30, 48, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 72, 30, 0, 0, 0, 0, 78,
+  0, 23, 0, 11, 40, 0, 0, 0, 17, 16,
+  68, 25, 10, 51, 0, 3, 0, 0, 33, 0,
+  0, 53, 0, 0, 59, 0, 5, 69, 0, 0,
+  0, 0, 0, 19, 45, 76, 0, 0, 0, 17,
+  2, 8, 10, 22, 0, 35, 0, 0, 0, 0,
+  0, 77, 41, 11, 0, 18, 0, 0, 0, 17,
+  0, 13, 0, 0, 0, 39, 0, 0, 0, 0,
+  0, 0, 0, 110, 0, 0, 0, 0, 15, 4,
+  28, 0, 0, 0, 0, 0, 48, 0, 0, 6,
+  0, 9, 0, 40, 17, 0, 0, 0, 0, 0,
+  53, 0, 0, 17, 0, 52, 45, 0, 40, 9,
+  68, 0, 0, 0, 56, 0, 0, 5, 0, 0,
+  0, 21, 0, 0, 0, 0, 1, 53, 0, 16,
+  7, 45, 50, 0, 0, 13, 38, 10, 68, 48,
+  19, 52, 56, 0, 0, 0, 26, 9, 0, 10,
+  28, 0, 51, 0, 0, 127, 0, 0, 28, 13,
+  0, 0, 0, 82, 0, 0, 9, 29, 31, 0,
+  0, 85, 28, 32, 0, 0, 13, 55, 0, 0,
+  0, 43, 0, 0, 0, 17, 44, 93, 0, 0,
+  24, 0, 15, 0, 0, 32, 0, 29, 0, 35,
+  0, 77, 0, 0, 138, 0, 12, 0, 0, 0,
+  0, 64, 0, 0, 81, 0, 9, 6, 12, 125,
+  8, 0, 33, 55, 0, 39, 22, 0, 0, 0,
+  0, 0, 28, 82, 0, 10, 0, 46, 0, 0,
+  0, 123, 0, 0, 55, 0, 11, 0, 0, 88,
+  63, 49, 0, 0, 27, 0, 0, 10, 0, 6,
+  1, 11, 0, 0, 9, 35, 24, 0, 11, 0,
+  0, 0, 0, 0, 0, 3, 9, 79, 0, 0,
+  30, 0, 26, 161, 0, 0, 0, 0, 0, 0,
+  49, 60, 0, 0, 11, 55, 0, 0, 7, 16,
+  0, 50, 0, 0, 0, 0, 0, 35, 21, 0,
+  0, 13, 0, 0, 0, 55, 0, 3, 0, 20,
+  0, 22, 0, 12, 34, 22, 0, 0, 13, 103,
+  4, 0, 17, 0, 10, 0, 46, 0, 0, 0,
+  0, 0, 54, 0, 0, 2, 0, 4, 0, 34,
+  24, 5, 0, 40, 0, 0, 0, 10, 0, 0,
+  18, 36, 19, 0, 31, 36, 38, 0, 0, 22,
+  13, 0, 4, 0, 0, 0, 1, 46, 1, 0,
+  0, 0, 0, 10, 0, 22, 0, 25, 23, 0,
+  0, 0, 5, 29, 102, 47, 32, 3, 54, 0,
+  0, 0, 37, 15, 0, 14, 0, 49, 11, 0,
+  44, 0, 25, 0, 19, 0, 0, 0, 81, 51,
+  5, 17, 15, 0, 0, 0, 3, 0, 0, 60,
+  21, 63, 0, 0, 0, 12, 63, 0, 0, 27,
+  12, 0, 0, 6, 0, 70, 0, 97, 10, 75,
+  53, 0, 0, 0, 0, 6, 0, 65, 94, 0,
+  0, 3, 21, 23, 4, 21, 0, 0, 0, 70,
+  0, 12, 8, 0, 0, 0, 0, 33, 0, 19,
+  20, 29, 0, 0, 0, 27, 44, 20, 19, 0,
+  78, 0, 29, 0, 66, 38, 0, 0, 42, 37,
+  0, 32, 0, 38, 3, 45, 0, 0, 0, 0,
+  0, 0, 3, 5, 71, 72, 88, 0, 0, 7,
+  31, 0, 0, 31, 64, 18, 57, 10, 85, 0,
+  91, 2, 0, 0, 35, 0, 20, 65, 14, 232,
+  0, 0, 1, 0, 0, 0, 0, 21, 0, 0,
+  0, 33, 62, 0, 0, 113, 15, 0, 0, 0,
+  0, 6, 0, 17, 8, 99, 0, 0, 0, 33,
+  0, 40, 0, 0, 0, 0, 0, 0, 0, 58,
+  44, 47, 7, 4, 0, 38, 0, 0, 142, 0,
+  48, 0, 21, 0, 27, 92, 17, 0, 115, 0,
+  0, 40, 0, 96, 83, 63, 62, 0, 0, 35,
+  43, 0, 0, 0, 0, 0, 46, 65, 0, 0,
+  0, 31, 0, 0, 7, 7, 0, 0, 70, 0,
+  52, 0, 0, 9, 17, 116, 2, 0, 0, 5,
+  18, 17, 0, 0, 0, 39, 0, 0, 0, 45,
+  36, 0, 13, 16, 0, 19, 0, 0, 0, 15,
+  0, 44, 0, 0, 0, 5, 19, 184, 0, 0,
+  0, 0, 0, 0, 30, 14, 0, 24, 4, 50,
+  5, 0, 21, 0, 0, 62, 18, 19, 0, 0,
+  0, 10, 18, 0, 0, 34, 0, 4, 0, 24,
+  0, 24, 0, 55, 0, 16, 0, 17, 43, 43,
+  0, 20, 0, 38, 14, 0, 0, 0, 9, 0,
+  19, 12, 5, 26, 0, 0, 6, 0, 0, 22,
+  22, 0, 30, 56, 37, 1, 2, 80, 0, 0,
+  0, 42, 0, 0, 13, 12, 24, 0, 22, 14,
+  2, 28, 1, 67, 43, 9, 35, 30, 0, 0,
+  7, 25, 0, 0, 0, 0, 0, 0, 0, 6,
+  0, 17, 0, 1, 0, 13, 0, 7, 81, 29,
+  34, 0, 48, 9, 42, 0, 38, 19, 0, 0,
+  0, 34, 49, 0, 25, 0, 17, 0, 0, 0,
+  0, 0, 29, 51, 2, 46, 15, 40, 0, 20,
+  33, 0, 79, 40, 0, 20, 0, 0, 0, 0,
+  25, 0, 0, 0, 0, 0, 0, 5, 0, 35,
+  63, 42, 0, 75, 56, 0, 0, 0, 0, 4,
+  0, 42, 63, 0, 1, 0, 44, 5, 9, 0,
+  0, 3, 0, 23, 0, 0, 26, 7, 0, 0,
+  0, 3, 4, 30, 12, 34, 0, 8, 0, 0,
+  40, 0, 0, 0, 68, 13, 0, 0, 40, 12,
+  0, 29, 32, 0, 0, 30, 0, 0, 0, 46,
+  0, 0, 0, 0, 5, 0, 0, 0, 0, 29,
+  58, 4, 0, 15, 30, 0, 26, 17, 54, 0,
+  15, 0, 9, 0, 76, 5, 0, 0, 0, 0,
+  117, 0, 0, 75, 0, 0, 21, 0, 0, 1,
+  34, 80, 0, 0, 0, 31, 19, 0, 0, 94,
+  14, 24, 0, 0, 0, 29, 0, 0, 10, 39,
+  0, 0, 0, 0, 0, 56, 0, 0, 0, 0,
+  0, 7, 0, 0, 0, 0, 0, 0, 0, 155,
+  0, 0, 71, 0, 21, 0, 50, 0, 0, 5,
+  0, 0, 108, 0, 0, 0, 0, 98, 0, 0,
+  39, 7, 0, 0, 0, 22, 15, 0, 0, 0,
+  31, 74, 16, 3, 15, 30, 48, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 72, 30, 0,
+  0, 0, 0, 78, 0, 23, 0, 11, 40, 0,
+  0, 0, 17, 16, 68, 25, 10, 51, 0, 3,
+  0, 0, 33, 0, 0, 53, 0, 0, 59, 0,
+  5, 69, 0, 0, 0, 0, 0, 19, 45, 76,
+  0, 0, 0, 17, 2, 8, 10, 22, 0, 35,
+  0, 0, 0, 0, 0, 77, 41, 11, 0, 18,
+  0, 0, 0, 17, 0, 13, 0, 0, 0, 39,
+  0, 0, 0, 0, 0, 0, 0, 110, 0, 0,
+  0, 0, 15, 4, 28, 0, 0, 0, 0, 0,
+  48, 0, 0, 6, 0, 9, 0, 40, 17, 0,
+  0, 0, 0, 0, 53, 0, 0, 17, 0, 52,
+  45, 0, 40, 9, 68, 0, 0, 0, 56, 0,
+  0, 5, 0, 0, 0, 21, 0, 0, 0, 0,
+  1, 53, 0, 16, 7, 45, 50, 0, 0, 13,
+  38, 10, 68, 48, 19, 52, 56, 0, 0, 0,
+  26, 9, 0, 10, 0, 52, 52, 0, 44, 0,
+  21, 0, 7, 0, 0, 3, 68, 73, 3, 33,
+  10, 1, 18, 0, 44, 0, 0, 50, 14, 42,
+  0, 0, 0, 12, 60, 0, 0, 39, 0, 0,
+  0, 7, 0, 62, 39, 63, 0, 87, 51, 0,
+  0, 0, 0, 0, 0, 78, 42, 0, 0, 0,
+  18, 20, 19, 14, 11, 0, 3, 81, 0, 28,
+  0, 0, 0, 0, 0, 30, 0, 13, 8, 1,
+  0, 0, 0, 18, 37, 38, 21, 0, 88, 0,
+  16, 0, 65, 54, 0, 0, 46, 25, 0, 61,
+  0, 19, 5, 30, 0, 0, 0, 0, 0, 0,
+  0, 15, 38, 43, 88, 0, 0, 20, 22, 0,
+  0, 24, 58, 18, 39, 4, 45, 0, 79, 0,
+  1, 0, 0, 0, 30, 0, 26, 161, 0, 0,
+  0, 0, 0, 0, 49, 60, 0, 0, 11, 55,
+  0, 0, 7, 16, 0, 50, 0, 0, 0, 0,
+  0, 35, 21, 0, 0, 13, 0, 0, 0, 55,
+  0, 3, 0, 20, 0, 22, 0, 12, 34, 22,
+  0, 0, 13, 103, 4, 0, 17, 0, 10, 0,
+  46, 0, 0, 0, 0, 0, 54, 0, 0, 2,
+  0, 4, 0, 34, 24, 5, 0, 40, 0, 0,
+  0, 10, 0, 0, 18, 36, 19, 0, 31, 36,
+  38, 0, 0, 22, 13, 0, 4, 0, 0, 0,
+  1, 46, 1, 0, 0, 0, 0, 10, 0, 22,
+  0, 25, 23, 0, 0, 0, 5, 29, 102, 47,
+  32, 3, 54, 0, 0, 0, 37, 15, 0, 14,
+  0, 49, 11, 0, 44, 0, 25, 0, 19, 0,
+  0, 0, 81, 51, 5, 17, 15, 0, 0, 0,
+  3, 0, 0, 60, 21, 63, 0, 0, 0, 12,
+  63, 0, 0, 27, 12, 0, 0, 6, 0, 70,
+  0, 97, 10, 75, 53, 0, 0, 0, 0, 6,
+  0, 65, 94, 0, 0, 3, 21, 23, 4, 21,
+  0, 0, 0, 70, 0, 12, 8, 0, 0, 0,
+  0, 33, 0, 19, 20, 29, 0, 0, 0, 27,
+  44, 20, 19, 0, 78, 0, 29, 0, 66, 38,
+  0, 0, 42, 37, 0, 32, 0, 38, 3, 45,
+  0, 0, 0, 0, 0, 0, 3, 5, 71, 72,
+  88, 0, 0, 7, 31, 0, 0, 31, 64, 18,
+  57, 10, 85, 0, 91, 2, 0, 0, 0, 21,
+  76, 0, 26, 0, 1, 0, 0, 0, 0, 6,
+  28, 78, 0, 20, 4, 29, 21, 10, 35, 34,
+  113, 11, 0, 0, 0, 0, 0, 0, 18, 0,
+  0, 0, 0, 0, 0, 1, 0, 10, 66, 3,
+  0, 101, 57, 6, 0, 0, 0, 0, 0, 90,
+  1, 0, 17, 0, 40, 0, 25, 0, 0, 10,
+  7, 19, 34, 0, 0, 18, 0, 29, 0, 0,
+  0, 43, 3, 0, 0, 28, 0, 0, 37, 0,
+  22, 0, 65, 9, 0, 0, 20, 0, 0, 16,
+  13, 0, 0, 46, 0, 0, 0, 39, 0, 0,
+  0, 0, 1, 0, 0, 4, 0, 7, 72, 14,
+  0, 12, 20, 0, 52, 13, 51, 13, 13, 0,
+  0, 0, 64, 0, 0, 0, 0, 0, 0, 5,
+  19, 184, 0, 0, 0, 0, 0, 0, 30, 14,
+  0, 24, 4, 50, 5, 0, 21, 0, 0, 62,
+  18, 19, 0, 0, 0, 10, 18, 0, 0, 34,
+  0, 4, 0, 24, 0, 24, 0, 55, 0, 16,
+  0, 17, 43, 43, 0, 20, 0, 38, 14, 0,
+  0, 0, 9, 0, 19, 12, 5, 26, 0, 0,
+  6, 0, 0, 22, 22, 0, 30, 56, 37, 1,
+  2, 80, 0, 0, 0, 42, 0, 0, 13, 12,
+  24, 0, 22, 14, 2, 28, 1, 67, 43, 9,
+  35, 30, 0, 0, 7, 25, 0, 0, 0, 0,
+  0, 0, 0, 6, 0, 17, 0, 1, 0, 13,
+  0, 7, 81, 29, 34, 0, 48, 9, 42, 0,
+  38, 19, 0, 0, 0, 34, 49, 0, 25, 0,
+  17, 0, 0, 0, 0, 0, 29, 51, 2, 46,
+  15, 40, 0, 20, 33, 0, 79, 40, 0, 20,
+  0, 0, 0, 0, 25, 0, 0, 0, 0, 0,
+  0, 5, 0, 35, 63, 42, 0, 75, 56, 0,
+  0, 0, 0, 4, 0, 42, 63, 0, 1, 0,
+  44, 5, 9, 0, 0, 3, 0, 23, 0, 0,
+  26, 7, 0, 0, 0, 3, 4, 30, 12, 34,
+  0, 8, 0, 0, 40, 0, 0, 0, 68, 13,
+  0, 0, 40, 12, 0, 29, 32, 0, 0, 30,
+  0, 0, 0, 46, 0, 0, 0, 0, 5, 0,
+  0, 0, 0, 29, 58, 4, 0, 15, 30, 0,
+  26, 17, 54, 0, 15, 0, 9, 0, 76, 5,
+  0, 0, 10, 0, 77, 0, 9, 10, 0, 0,
+  4, 0, 0, 8, 3, 82, 0, 0, 0, 46,
+  42, 0, 45, 68, 136, 0, 0, 0, 0, 0,
+  0, 0, 3, 0, 0, 0, 0, 9, 0, 0,
+  0, 0, 33, 0, 0, 90, 40, 14, 0, 21,
+  0, 0, 0, 136, 0, 0, 74, 0, 41, 0,
+  36, 0, 0, 0, 35, 0, 125, 0, 0, 23,
+  0, 91, 0, 0, 13, 4, 0, 0, 7, 0,
+  0, 0, 15, 0, 23, 0, 45, 6, 0, 0,
+  20, 0, 0, 0, 0, 0, 24, 27, 0, 0,
+  0, 52, 15, 0, 0, 0, 14, 0, 0, 2,
+  0, 0, 69, 4, 0, 37, 12, 0, 118, 0,
+  23, 19, 24, 0, 0, 0, 53, 0, 0, 0,
+  0, 0, 59, 0, 5, 69, 0, 0, 0, 0,
+  0, 19, 45, 76, 0, 0, 0, 17, 2, 8,
+  10, 22, 0, 35, 0, 0, 0, 0, 0, 77,
+  41, 11, 0, 18, 0, 0, 0, 17, 0, 13,
+  0, 0, 0, 39, 0, 0, 0, 0, 0, 0,
+  0, 110, 0, 0, 0, 0, 15, 4, 28, 0,
+  0, 0, 0, 0, 48, 0, 0, 6, 0, 9,
+  0, 40, 17, 0, 0, 0, 0, 0, 53, 0,
+  0, 17, 0, 52, 45, 0, 40, 9, 68, 0,
+  0, 0, 56, 0, 0, 5, 0, 0, 0, 21,
+  0, 0, 0, 0, 1, 53, 0, 16, 7, 45,
+  50, 0, 0, 13, 38, 10, 68, 48, 19, 52,
+  56, 0, 0, 0, 26, 9, 0, 10, 0, 52,
+  52, 0, 44, 0, 21, 0, 7, 0, 0, 3,
+  68, 73, 3, 33, 10, 1, 18, 0, 44, 0,
+  0, 50, 14, 42, 0, 0, 0, 12, 60, 0,
+  0, 39, 0, 0, 0, 7, 0, 62, 39, 63,
+  0, 87, 51, 0, 0, 0, 0, 0, 0, 78,
+  42, 0, 0, 0, 18, 20, 19, 14, 11, 0,
+  3, 81, 0, 28, 0, 0, 0, 0, 0, 30,
+  0, 13, 8, 1, 0, 0, 0, 18, 37, 38,
+  21, 0, 88, 0, 16, 0, 65, 54, 0, 0,
+  46, 25, 0, 61, 0, 19, 5, 30, 0, 0,
+  0, 0, 0, 0, 0, 15, 38, 43, 88, 0,
+  0, 20, 22, 0, 0, 24, 58, 18, 39, 4,
+  45, 0, 79, 0, 1, 0, 0, 16, 100, 0,
+  22, 0, 0, 0, 0, 0, 0, 11, 22, 94,
+  0, 49, 0, 51, 31, 35, 50, 27, 110, 9,
+  0, 0, 0, 0, 0, 0, 32, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 94, 0, 0, 96,
+  51, 18, 0, 0, 0, 0, 0, 79, 0, 0,
+  15, 0, 24, 0, 24, 0, 7, 8, 19, 6,
+  56, 0, 0, 10, 0, 51, 0, 0, 21, 34,
+  0, 0, 0, 16, 0, 0, 24, 0, 36, 0,
+  41, 12, 2, 0, 43, 21, 0, 36, 0, 0,
+  5, 39, 0, 0, 0, 27, 23, 0, 0, 0,
+  0, 0, 0, 11, 0, 6, 79, 9, 0, 5,
+  40, 0, 52, 15, 28, 31, 21, 0, 0, 0,
+  55, 12, 0, 0, 0, 49, 11, 0, 44, 0,
+  25, 0, 19, 0, 0, 0, 81, 51, 5, 17,
+  15, 0, 0, 0, 3, 0, 0, 60, 21, 63,
+  0, 0, 0, 12, 63, 0, 0, 27, 12, 0,
+  0, 6, 0, 70, 0, 97, 10, 75, 53, 0,
+  0, 0, 0, 6, 0, 65, 94, 0, 0, 3,
+  21, 23, 4, 21, 0, 0, 0, 70, 0, 12,
+  8, 0, 0, 0, 0, 33, 0, 19, 20, 29,
+  0, 0, 0, 27, 44, 20, 19, 0, 78, 0,
+  29, 0, 66, 38, 0, 0, 42, 37, 0, 32,
+  0, 38, 3, 45, 0, 0, 0, 0, 0, 0,
+  3, 5, 71, 72, 88, 0, 0, 7, 31, 0,
+  0, 31, 64, 18, 57, 10, 85, 0, 91, 2,
+  0, 0, 0, 21, 76, 0, 26, 0, 1, 0,
+  0, 0, 0, 6, 28, 78, 0, 20, 4, 29,
+  21, 10, 35, 34, 113, 11, 0, 0, 0, 0,
+  0, 0, 18, 0, 0, 0, 0, 0, 0, 1,
+  0, 10, 66, 3, 0, 101, 57, 6, 0, 0,
+  0, 0, 0, 90, 1, 0, 17, 0, 40, 0,
+  25, 0, 0, 10, 7, 19, 34, 0, 0, 18,
+  0, 29, 0, 0, 0, 43, 3, 0, 0, 28,
+  0, 0, 37, 0, 22, 0, 65, 9, 0, 0,
+  20, 0, 0, 16, 13, 0, 0, 46, 0, 0,
+  0, 39, 0, 0, 0, 0, 1, 0, 0, 4,
+  0, 7, 72, 14, 0, 12, 20, 0, 52, 13,
+  51, 13, 13, 0, 0, 0, 64, 0, 0, 0,
+  4, 0, 79, 3, 6, 0, 0, 0, 14, 0,
+  0, 8, 0, 94, 0, 3, 0, 47, 45, 17,
+  53, 54, 102, 0, 0, 0, 0, 16, 0, 0,
+  0, 0, 0, 0, 0, 14, 0, 0, 0, 0,
+  37, 0, 0, 85, 38, 32, 0, 6, 0, 0,
+  0, 126, 0, 0, 66, 0, 24, 0, 20, 0,
+  0, 0, 29, 0, 99, 0, 0, 10, 0, 92,
+  0, 0, 18, 0, 0, 0, 4, 0, 0, 0,
+  11, 0, 20, 0, 18, 0, 0, 0, 39, 0,
+  0, 7, 0, 0, 22, 29, 2, 0, 4, 32,
+  23, 0, 0, 0, 28, 0, 0, 3, 17, 0,
+  84, 3, 0, 15, 21, 0, 112, 0, 10, 16,
+  55, 0, 0, 0, 57, 15, 0, 0, 0, 34,
+  49, 0, 25, 0, 17, 0, 0, 0, 0, 0,
+  29, 51, 2, 46, 15, 40, 0, 20, 33, 0,
+  79, 40, 0, 20, 0, 0, 0, 0, 25, 0,
+  0, 0, 0, 0, 0, 5, 0, 35, 63, 42,
+  0, 75, 56, 0, 0, 0, 0, 4, 0, 42,
+  63, 0, 1, 0, 44, 5, 9, 0, 0, 3,
+  0, 23, 0, 0, 26, 7, 0, 0, 0, 3,
+  4, 30, 12, 34, 0, 8, 0, 0, 40, 0,
+  0, 0, 68, 13, 0, 0, 40, 12, 0, 29,
+  32, 0, 0, 30, 0, 0, 0, 46, 0, 0,
+  0, 0, 5, 0, 0, 0, 0, 29, 58, 4,
+  0, 15, 30, 0, 26, 17, 54, 0, 15, 0,
+  9, 0, 76, 5, 0, 0, 10, 0, 77, 0,
+  9, 10, 0, 0, 4, 0, 0, 8, 3, 82,
+  0, 0, 0, 46, 42, 0, 45, 68, 136, 0,
+  0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+  0, 9, 0, 0, 0, 0, 33, 0, 0, 90,
+  40, 14, 0, 21, 0, 0, 0, 136, 0, 0,
+  74, 0, 41, 0, 36, 0, 0, 0, 35, 0,
+  125, 0, 0, 23, 0, 91, 0, 0, 13, 4,
+  0, 0, 7, 0, 0, 0, 15, 0, 23, 0,
+  45, 6, 0, 0, 20, 0, 0, 0, 0, 0,
+  24, 27, 0, 0, 0, 52, 15, 0, 0, 0,
+  14, 0, 0, 2, 0, 0, 69, 4, 0, 37,
+  12, 0, 118, 0, 23, 19, 24, 0, 0, 0,
+  53, 0, 0, 0, 0, 0, 45, 1, 17, 0,
+  0, 0, 31, 0, 0, 0, 20, 82, 0, 0,
+  0, 11, 29, 0, 23, 30, 25, 5, 0, 0,
+  20, 43, 0, 53, 0, 0, 0, 0, 0, 0,
+  0, 4, 0, 0, 0, 0, 0, 45, 6, 26,
+  0, 49, 0, 0, 0, 152, 0, 16, 45, 0,
+  12, 0, 0, 0, 0, 0, 8, 0, 63, 0,
+  0, 6, 0, 72, 0, 0, 8, 0, 0, 0,
+  0, 0, 0, 0, 13, 0, 1, 0, 0, 0,
+  0, 44, 53, 0, 44, 0, 0, 0, 18, 0,
+  36, 0, 0, 72, 23, 0, 15, 0, 42, 0,
+  1, 20, 65, 0, 81, 0, 0, 14, 40, 0,
+  141, 0, 0, 33, 89, 0, 30, 0, 58, 0,
+  0, 0, 0, 52, 52, 0, 44, 0, 21, 0,
+  7, 0, 0, 3, 68, 73, 3, 33, 10, 1,
+  18, 0, 44, 0, 0, 50, 14, 42, 0, 0,
+  0, 12, 60, 0, 0, 39, 0, 0, 0, 7,
+  0, 62, 39, 63, 0, 87, 51, 0, 0, 0,
+  0, 0, 0, 78, 42, 0, 0, 0, 18, 20,
+  19, 14, 11, 0, 3, 81, 0, 28, 0, 0,
+  0, 0, 0, 30, 0, 13, 8, 1, 0, 0,
+  0, 18, 37, 38, 21, 0, 88, 0, 16, 0,
+  65, 54, 0, 0, 46, 25, 0, 61, 0, 19,
+  5, 30, 0, 0, 0, 0, 0, 0, 0, 15,
+  38, 43, 88, 0, 0, 20, 22, 0, 0, 24,
+  58, 18, 39, 4, 45, 0, 79, 0, 1, 0,
+  0, 16, 100, 0, 22, 0, 0, 0, 0, 0,
+  0, 11, 22, 94, 0, 49, 0, 51, 31, 35,
+  50, 27, 110, 9, 0, 0, 0, 0, 0, 0,
+  32, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  94, 0, 0, 96, 51, 18, 0, 0, 0, 0,
+  0, 79, 0, 0, 15, 0, 24, 0, 24, 0,
+  7, 8, 19, 6, 56, 0, 0, 10, 0, 51,
+  0, 0, 21, 34, 0, 0, 0, 16, 0, 0,
+  24, 0, 36, 0, 41, 12, 2, 0, 43, 21,
+  0, 36, 0, 0, 5, 39, 0, 0, 0, 27,
+  23, 0, 0, 0, 0, 0, 0, 11, 0, 6,
+  79, 9, 0, 5, 40, 0, 52, 15, 28, 31,
+  21, 0, 0, 0, 55, 12, 0, 0, 20, 0,
+  91, 19, 0, 0, 0, 12, 20, 0, 0, 0,
+  0, 125, 0, 0, 0, 22, 28, 1, 36, 70,
+  81, 11, 0, 0, 7, 35, 205, 0, 23, 21,
+  0, 15, 0, 0, 0, 31, 0, 0, 65, 0,
+  0, 38, 53, 70, 0, 0, 0, 0, 0, 120,
+  0, 6, 74, 0, 21, 12, 39, 0, 24, 17,
+  49, 0, 50, 0, 10, 0, 0, 102, 0, 0,
+  27, 14, 0, 0, 25, 0, 0, 0, 12, 2,
+  2, 20, 0, 0, 0, 33, 96, 33, 0, 2,
+  0, 0, 53, 20, 39, 0, 2, 26, 35, 12,
+  15, 0, 81, 19, 3, 30, 19, 0, 74, 0,
+  14, 0, 19, 31, 105, 0, 0, 54, 0, 0,
+  0, 0, 40, 22, 0, 17, 0, 21, 76, 0,
+  26, 0, 1, 0, 0, 0, 0, 6, 28, 78,
+  0, 20, 4, 29, 21, 10, 35, 34, 113, 11,
+  0, 0, 0, 0, 0, 0, 18, 0, 0, 0,
+  0, 0, 0, 1, 0, 10, 66, 3, 0, 101,
+  57, 6, 0, 0, 0, 0, 0, 90, 1, 0,
+  17, 0, 40, 0, 25, 0, 0, 10, 7, 19,
+  34, 0, 0, 18, 0, 29, 0, 0, 0, 43,
+  3, 0, 0, 28, 0, 0, 37, 0, 22, 0,
+  65, 9, 0, 0, 20, 0, 0, 16, 13, 0,
+  0, 46, 0, 0, 0, 39, 0, 0, 0, 0,
+  1, 0, 0, 4, 0, 7, 72, 14, 0, 12,
+  20, 0, 52, 13, 51, 13, 13, 0, 0, 0,
+  64, 0, 0, 0, 4, 0, 79, 3, 6, 0,
+  0, 0, 14, 0, 0, 8, 0, 94, 0, 3,
+  0, 47, 45, 17, 53, 54, 102, 0, 0, 0,
+  0, 16, 0, 0, 0, 0, 0, 0, 0, 14,
+  0, 0, 0, 0, 37, 0, 0, 85, 38, 32,
+  0, 6, 0, 0, 0, 126, 0, 0, 66, 0,
+  24, 0, 20, 0, 0, 0, 29, 0, 99, 0,
+  0, 10, 0, 92, 0, 0, 18, 0, 0, 0,
+  4, 0, 0, 0, 11, 0, 20, 0, 18, 0,
+  0, 0, 39, 0, 0, 7, 0, 0, 22, 29,
+  2, 0, 4, 32, 23, 0, 0, 0, 28, 0,
+  0, 3, 17, 0, 84, 3, 0, 15, 21, 0,
+  112, 0, 10, 16, 55, 0, 0, 0, 57, 15,
+  0, 0, 2, 0, 42, 31, 0, 0, 14, 24,
+  59, 0, 4, 0, 0, 82, 0, 0, 0, 8,
+  26, 0, 35, 19, 23, 27, 0, 0, 38, 57,
+  187, 16, 19, 10, 32, 0, 0, 0, 0, 25,
+  0, 0, 0, 0, 0, 32, 38, 93, 0, 17,
+  0, 0, 3, 110, 0, 32, 59, 0, 9, 0,
+  14, 0, 0, 22, 8, 0, 4, 0, 20, 0,
+  0, 39, 0, 6, 29, 4, 0, 9, 34, 0,
+  0, 0, 24, 0, 1, 24, 0, 0, 0, 30,
+  103, 45, 40, 0, 0, 0, 18, 12, 59, 0,
+  26, 51, 26, 6, 18, 0, 84, 0, 42, 12,
+  87, 0, 79, 0, 10, 0, 1, 0, 115, 0,
+  0, 34, 41, 0, 5, 0, 59, 9, 0, 24,
+  10, 0, 77, 0, 9, 10, 0, 0, 4, 0,
+  0, 8, 3, 82, 0, 0, 0, 46, 42, 0,
+  45, 68, 136, 0, 0, 0, 0, 0, 0, 0,
+  3, 0, 0, 0, 0, 9, 0, 0, 0, 0,
+  33, 0, 0, 90, 40, 14, 0, 21, 0, 0,
+  0, 136, 0, 0, 74, 0, 41, 0, 36, 0,
+  0, 0, 35, 0, 125, 0, 0, 23, 0, 91,
+  0, 0, 13, 4, 0, 0, 7, 0, 0, 0,
+  15, 0, 23, 0, 45, 6, 0, 0, 20, 0,
+  0, 0, 0, 0, 24, 27, 0, 0, 0, 52,
+  15, 0, 0, 0, 14, 0, 0, 2, 0, 0,
+  69, 4, 0, 37, 12, 0, 118, 0, 23, 19,
+  24, 0, 0, 0, 53, 0, 0, 0, 0, 0,
+  45, 1, 17, 0, 0, 0, 31, 0, 0, 0,
+  20, 82, 0, 0, 0, 11, 29, 0, 23, 30,
+  25, 5, 0, 0, 20, 43, 0, 53, 0, 0,
+  0, 0, 0, 0, 0, 4, 0, 0, 0, 0,
+  0, 45, 6, 26, 0, 49, 0, 0, 0, 152,
+  0, 16, 45, 0, 12, 0, 0, 0, 0, 0,
+  8, 0, 63, 0, 0, 6, 0, 72, 0, 0,
+  8, 0, 0, 0, 0, 0, 0, 0, 13, 0,
+  1, 0, 0, 0, 0, 44, 53, 0, 44, 0,
+  0, 0, 18, 0, 36, 0, 0, 72, 23, 0,
+  15, 0, 42, 0, 1, 20, 65, 0, 81, 0,
+  0, 14, 40, 0, 141, 0, 0, 33, 89, 0,
+  30, 0, 58, 0, 0, 0, 0, 0, 24, 23,
+  0, 0, 18, 24, 50, 29, 0, 0, 0, 30,
+  0, 5, 4, 7, 13, 0, 0, 0, 0, 53,
+  0, 0, 74, 59, 173, 47, 0, 0, 71, 0,
+  19, 0, 0, 20, 0, 24, 0, 0, 0, 0,
+  18, 88, 16, 0, 0, 16, 0, 67, 30, 34,
+  32, 0, 0, 4, 0, 6, 0, 39, 0, 0,
+  0, 0, 33, 0, 0, 14, 6, 12, 56, 3,
+  0, 51, 0, 0, 0, 3, 39, 0, 0, 33,
+  0, 0, 0, 48, 80, 41, 84, 0, 0, 0,
+  23, 0, 51, 0, 2, 59, 14, 2, 58, 0,
+  66, 2, 56, 3, 77, 5, 38, 0, 11, 0,
+  0, 0, 103, 0, 0, 17, 53, 0, 50, 0,
+  60, 0, 7, 11, 0, 16, 100, 0, 22, 0,
+  0, 0, 0, 0, 0, 11, 22, 94, 0, 49,
+  0, 51, 31, 35, 50, 27, 110, 9, 0, 0,
+  0, 0, 0, 0, 32, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 94, 0, 0, 96, 51, 18,
+  0, 0, 0, 0, 0, 79, 0, 0, 15, 0,
+  24, 0, 24, 0, 7, 8, 19, 6, 56, 0,
+  0, 10, 0, 51, 0, 0, 21, 34, 0, 0,
+  0, 16, 0, 0, 24, 0, 36, 0, 41, 12,
+  2, 0, 43, 21, 0, 36, 0, 0, 5, 39,
+  0, 0, 0, 27, 23, 0, 0, 0, 0, 0,
+  0, 11, 0, 6, 79, 9, 0, 5, 40, 0,
+  52, 15, 28, 31, 21, 0, 0, 0, 55, 12,
+  0, 0, 20, 0, 91, 19, 0, 0, 0, 12,
+  20, 0, 0, 0, 0, 125, 0, 0, 0, 22,
+  28, 1, 36, 70, 81, 11, 0, 0, 7, 35,
+  205, 0, 23, 21, 0, 15, 0, 0, 0, 31,
+  0, 0, 65, 0, 0, 38, 53, 70, 0, 0,
+  0, 0, 0, 120, 0, 6, 74, 0, 21, 12,
+  39, 0, 24, 17, 49, 0, 50, 0, 10, 0,
+  0, 102, 0, 0, 27, 14, 0, 0, 25, 0,
+  0, 0, 12, 2, 2, 20, 0, 0, 0, 33,
+  96, 33, 0, 2, 0, 0, 53, 20, 39, 0,
+  2, 26, 35, 12, 15, 0, 81, 19, 3, 30,
+  19, 0, 74, 0, 14, 0, 19, 31, 105, 0,
+  0, 54, 0, 0, 0, 0, 40, 22, 0, 17,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 4, 0,
+  79, 3, 6, 0, 0, 0, 14, 0, 0, 8,
+  0, 94, 0, 3, 0, 47, 45, 17, 53, 54,
+  102, 0, 0, 0, 0, 16, 0, 0, 0, 0,
+  0, 0, 0, 14, 0, 0, 0, 0, 37, 0,
+  0, 85, 38, 32, 0, 6, 0, 0, 0, 126,
+  0, 0, 66, 0, 24, 0, 20, 0, 0, 0,
+  29, 0, 99, 0, 0, 10, 0, 92, 0, 0,
+  18, 0, 0, 0, 4, 0, 0, 0, 11, 0,
+  20, 0, 18, 0, 0, 0, 39, 0, 0, 7,
+  0, 0, 22, 29, 2, 0, 4, 32, 23, 0,
+  0, 0, 28, 0, 0, 3, 17, 0, 84, 3,
+  0, 15, 21, 0, 112, 0, 10, 16, 55, 0,
+  0, 0, 57, 15, 0, 0, 2, 0, 42, 31,
+  0, 0, 14, 24, 59, 0, 4, 0, 0, 82,
+  0, 0, 0, 8, 26, 0, 35, 19, 23, 27,
+  0, 0, 38, 57, 187, 16, 19, 10, 32, 0,
+  0, 0, 0, 25, 0, 0, 0, 0, 0, 32,
+  38, 93, 0, 17, 0, 0, 3, 110, 0, 32,
+  59, 0, 9, 0, 14, 0, 0, 22, 8, 0,
+  4, 0, 20, 0, 0, 39, 0, 6, 29, 4,
+  0, 9, 34, 0, 0, 0, 24, 0, 1, 24,
+  0, 0, 0, 30, 103, 45, 40, 0, 0, 0,
+  18, 12, 59, 0, 26, 51, 26, 6, 18, 0,
+  84, 0, 42, 12, 87, 0, 79, 0, 10, 0,
+  1, 0, 115, 0, 0, 34, 41, 0, 5, 0,
+  59, 9, 0, 24, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 45, 1, 17, 0, 0, 0,
+  31, 0, 0, 0, 20, 82, 0, 0, 0, 11,
+  29, 0, 23, 30, 25, 5, 0, 0, 20, 43,
+  0, 53, 0, 0, 0, 0, 0, 0, 0, 4,
+  0, 0, 0, 0, 0, 45, 6, 26, 0, 49,
+  0, 0, 0, 152, 0, 16, 45, 0, 12, 0,
+  0, 0, 0, 0, 8, 0, 63, 0, 0, 6,
+  0, 72, 0, 0, 8, 0, 0, 0, 0, 0,
+  0, 0, 13, 0, 1, 0, 0, 0, 0, 44,
+  53, 0, 44, 0, 0, 0, 18, 0, 36, 0,
+  0, 72, 23, 0, 15, 0, 42, 0, 1, 20,
+  65, 0, 81, 0, 0, 14, 40, 0, 141, 0,
+  0, 33, 89, 0, 30, 0, 58, 0, 0, 0,
+  0, 0, 24, 23, 0, 0, 18, 24, 50, 29,
+  0, 0, 0, 30, 0, 5, 4, 7, 13, 0,
+  0, 0, 0, 53, 0, 0, 74, 59, 173, 47,
+  0, 0, 71, 0, 19, 0, 0, 20, 0, 24,
+  0, 0, 0, 0, 18, 88, 16, 0, 0, 16,
+  0, 67, 30, 34, 32, 0, 0, 4, 0, 6,
+  0, 39, 0, 0, 0, 0, 33, 0, 0, 14,
+  6, 12, 56, 3, 0, 51, 0, 0, 0, 3,
+  39, 0, 0, 33, 0, 0, 0, 48, 80, 41,
+  84, 0, 0, 0, 23, 0, 51, 0, 2, 59,
+  14, 2, 58, 0, 66, 2, 56, 3, 77, 5,
+  38, 0, 11, 0, 0, 0, 103, 0, 0, 17,
+  53, 0, 50, 0, 60, 0, 7, 11, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 30, 25, 0, 1, 3,
+  33, 18, 0, 0, 0, 0, 0, 38, 0, 18,
+  43, 15, 0, 40, 38, 17, 58, 51, 0, 9,
+  8, 5, 128, 38, 0, 0, 54, 0, 69, 16,
+  0, 30, 0, 38, 21, 38, 0, 22, 60, 37,
+  2, 0, 0, 0, 0, 13, 47, 0, 16, 0,
+  64, 0, 29, 0, 6, 33, 7, 0, 0, 0,
+  7, 19, 25, 0, 0, 36, 79, 26, 45, 46,
+  0, 7, 30, 1, 38, 2, 13, 0, 0, 0,
+  0, 0, 54, 6, 3, 0, 38, 1, 15, 56,
+  0, 0, 37, 35, 9, 0, 0, 19, 20, 19,
+  57, 1, 0, 26, 0, 8, 0, 33, 5, 0,
+  23, 13, 0, 22, 19, 0, 0, 0, 19, 0,
+  11, 9, 0, 48, 13, 14, 0, 0, 29, 34,
+  3, 0, 0, 37, 105, 0, 2, 11, 53, 15,
+  0, 14, 67, 51, 53, 17, 9, 0, 0, 9,
+  0, 0, 0, 0, 96, 0, 32, 9, 0, 24,
+  0, 75, 0, 32, 0, 38, 68, 64, 0, 61,
+  0, 41, 0, 28, 43, 1, 16, 0, 14, 0,
+  11, 0, 0, 0, 0, 18, 0, 0, 0, 0,
+  17, 0, 10, 2, 29, 20, 37, 0, 16, 39,
+  0, 22, 45, 0, 41, 0, 0, 0, 0, 0,
+  0, 7, 0, 0, 0, 7, 0, 48, 0, 0,
+  52, 46, 8, 0, 0, 12, 18, 0, 59, 0,
+  0, 16, 0, 17, 0, 17, 0, 0, 14, 0,
+  6, 8, 40, 0, 40, 0, 76, 0, 11, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 62,
+  32, 0, 2, 1, 44, 3, 0, 0, 16, 4,
+  12, 0, 5, 53, 33, 30, 0, 74, 61, 0,
+  71, 46, 0, 36, 0, 3, 111, 34, 1, 0,
+  57, 0, 53, 22, 0, 16, 0, 48, 40, 30,
+  5, 36, 99, 16, 0, 12, 0, 8, 1, 0,
+  56, 0, 0, 0, 43, 0, 7, 33, 9, 0,
+  16, 0, 0, 0, 18, 21, 0, 0, 8, 32,
+  42, 43, 43, 31, 0, 15, 0, 0, 70, 13,
+  10, 0, 12, 12, 0, 0, 50, 9, 2, 0,
+  16, 0, 5, 73, 0, 0, 8, 21, 2, 0,
+  0, 16, 17, 0, 77, 9, 0, 22, 29, 1,
+  0, 33, 0, 0, 0, 15, 0, 33, 26, 0,
+  0, 0, 28, 0, 14, 0, 5, 45, 49, 8,
+  0, 13, 12, 23, 0, 0, 0, 49, 90, 0,
+  0, 29, 44, 13, 0, 25, 68, 58, 82, 13,
+  0, 0, 0, 11, 0, 0, 0, 0, 81, 0,
+  34, 31, 0, 20, 0, 59, 2, 29, 0, 28,
+  67, 52, 0, 60, 0, 43, 0, 42, 24, 0,
+  22, 0, 17, 0, 7, 0, 0, 0, 0, 9,
+  8, 0, 0, 0, 16, 0, 14, 13, 19, 19,
+  30, 0, 40, 53, 0, 19, 43, 0, 42, 0,
+  0, 11, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 33, 18, 0, 37, 45, 21, 0, 0, 23,
+  29, 0, 60, 0, 0, 7, 11, 13, 0, 17,
+  0, 0, 0, 0, 1, 9, 37, 0, 7, 0,
+  52, 0, 8, 2, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 74, 43, 0, 0, 0, 41, 0,
+  0, 0, 0, 15, 3, 0, 14, 72, 38, 47,
+  0, 64, 66, 0, 81, 51, 0, 26, 10, 14,
+  118, 35, 2, 0, 62, 0, 42, 8, 0, 26,
+  7, 52, 32, 25, 0, 26, 85, 30, 0, 8,
+  0, 25, 0, 13, 61, 0, 0, 0, 25, 0,
+  4, 20, 16, 0, 7, 0, 0, 0, 21, 2,
+  0, 0, 14, 32, 32, 38, 42, 30, 5, 5,
+  0, 0, 76, 3, 4, 0, 0, 15, 0, 0,
+  64, 23, 0, 0, 7, 0, 8, 49, 0, 0,
+  22, 10, 3, 0, 1, 17, 39, 0, 77, 0,
+  0, 43, 30, 0, 0, 41, 0, 0, 0, 3,
+  0, 15, 30, 0, 0, 0, 22, 0, 36, 0,
+  4, 47, 62, 10, 0, 19, 11, 10, 1, 0,
+  0, 51, 73, 0, 0, 33, 47, 24, 0, 20,
+  69, 64, 93, 12, 0, 0, 0, 23, 0, 0,
+  0, 0, 74, 0, 23, 28, 0, 28, 0, 48,
+  1, 24, 0, 19, 53, 57, 0, 57, 0, 37,
+  0, 54, 25, 0, 42, 0, 29, 0, 2, 0,
+  1, 0, 0, 20, 15, 0, 0, 0, 26, 0,
+  13, 15, 11, 22, 32, 0, 46, 51, 0, 12,
+  44, 0, 35, 0, 0, 8, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 24, 31, 0, 40, 41,
+  11, 0, 10, 24, 51, 0, 57, 0, 0, 3,
+  17, 15, 0, 12, 0, 0, 7, 0, 0, 7,
+  15, 4, 0, 0, 47, 0, 18, 0, 0, 30,
+  25, 0, 1, 3, 33, 18, 0, 0, 0, 0,
+  0, 38, 0, 18, 43, 15, 0, 40, 38, 17,
+  58, 51, 0, 9, 8, 5, 128, 38, 0, 0,
+  54, 0, 69, 16, 0, 30, 0, 38, 21, 38,
+  0, 22, 60, 37, 2, 0, 0, 0, 0, 13,
+  47, 0, 16, 0, 64, 0, 29, 0, 6, 33,
+  7, 0, 0, 0, 7, 19, 25, 0, 0, 36,
+  79, 26, 45, 46, 0, 7, 30, 1, 38, 2,
+  13, 0, 0, 0, 0, 0, 54, 6, 3, 0,
+  38, 1, 15, 56, 0, 0, 37, 35, 9, 0,
+  0, 19, 20, 19, 57, 1, 0, 26, 0, 8,
+  0, 33, 5, 0, 23, 13, 0, 22, 19, 0,
+  0, 0, 19, 0, 11, 9, 0, 48, 13, 14,
+  0, 0, 29, 34, 3, 0, 0, 37, 105, 0,
+  2, 11, 53, 15, 0, 14, 67, 51, 53, 17,
+  9, 0, 0, 9, 0, 0, 0, 0, 96, 0,
+  32, 9, 0, 24, 0, 75, 0, 32, 0, 38,
+  68, 64, 0, 61, 0, 41, 0, 28, 43, 1,
+  16, 0, 14, 0, 11, 0, 0, 0, 0, 18,
+  0, 0, 0, 0, 17, 0, 10, 2, 29, 20,
+  37, 0, 16, 39, 0, 22, 45, 0, 41, 0,
+  0, 0, 0, 0, 0, 7, 0, 0, 0, 7,
+  0, 48, 0, 0, 52, 46, 8, 0, 0, 12,
+  18, 0, 59, 0, 0, 16, 0, 17, 0, 17,
+  0, 0, 14, 0, 6, 8, 40, 0, 40, 0,
+  76, 0, 11, 0, 4, 29, 39, 21, 0, 5,
+  28, 2, 19, 0, 0, 34, 112, 0, 22, 39,
+  53, 0, 0, 0, 0, 83, 0, 10, 59, 0,
+  0, 23, 0, 0, 0, 41, 82, 0, 23, 0,
+  0, 23, 0, 78, 0, 55, 37, 22, 36, 48,
+  30, 16, 0, 54, 0, 60, 33, 24, 31, 0,
+  11, 0, 7, 0, 17, 0, 0, 63, 0, 10,
+  7, 0, 36, 0, 8, 20, 0, 4, 0, 0,
+  33, 43, 0, 29, 44, 0, 61, 29, 0, 0,
+  0, 0, 0, 31, 0, 0, 0, 4, 0, 29,
+  42, 0, 5, 76, 2, 0, 8, 14, 30, 0,
+  21, 0, 0, 0, 8, 15, 0, 0, 0, 0,
+  0, 0, 6, 2, 19, 0, 53, 0, 69, 0,
+  17, 0, 0, 62, 32, 0, 2, 1, 44, 3,
+  0, 0, 16, 4, 12, 0, 5, 53, 33, 30,
+  0, 74, 61, 0, 71, 46, 0, 36, 0, 3,
+  111, 34, 1, 0, 57, 0, 53, 22, 0, 16,
+  0, 48, 40, 30, 5, 36, 99, 16, 0, 12,
+  0, 8, 1, 0, 56, 0, 0, 0, 43, 0,
+  7, 33, 9, 0, 16, 0, 0, 0, 18, 21,
+  0, 0, 8, 32, 42, 43, 43, 31, 0, 15,
+  0, 0, 70, 13, 10, 0, 12, 12, 0, 0,
+  50, 9, 2, 0, 16, 0, 5, 73, 0, 0,
+  8, 21, 2, 0, 0, 16, 17, 0, 77, 9,
+  0, 22, 29, 1, 0, 33, 0, 0, 0, 15,
+  0, 33, 26, 0, 0, 0, 28, 0, 14, 0,
+  5, 45, 49, 8, 0, 13, 12, 23, 0, 0,
+  0, 49, 90, 0, 0, 29, 44, 13, 0, 25,
+  68, 58, 82, 13, 0, 0, 0, 11, 0, 0,
+  0, 0, 81, 0, 34, 31, 0, 20, 0, 59,
+  2, 29, 0, 28, 67, 52, 0, 60, 0, 43,
+  0, 42, 24, 0, 22, 0, 17, 0, 7, 0,
+  0, 0, 0, 9, 8, 0, 0, 0, 16, 0,
+  14, 13, 19, 19, 30, 0, 40, 53, 0, 19,
+  43, 0, 42, 0, 0, 11, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 33, 18, 0, 37, 45,
+  21, 0, 0, 23, 29, 0, 60, 0, 0, 7,
+  11, 13, 0, 17, 0, 0, 0, 0, 1, 9,
+  37, 0, 7, 0, 52, 0, 8, 2, 2, 29,
+  35, 14, 0, 2, 25, 15, 25, 0, 0, 41,
+  100, 0, 19, 33, 52, 0, 0, 0, 0, 93,
+  0, 8, 42, 0, 0, 23, 0, 0, 0, 43,
+  78, 0, 33, 0, 0, 18, 0, 68, 0, 56,
+  40, 13, 39, 47, 17, 12, 0, 48, 0, 63,
+  25, 25, 42, 0, 13, 0, 12, 0, 4, 7,
+  0, 68, 0, 15, 1, 0, 32, 0, 7, 15,
+  0, 11, 0, 0, 44, 48, 0, 33, 43, 0,
+  60, 25, 0, 0, 0, 0, 0, 17, 0, 0,
+  0, 3, 0, 32, 43, 0, 2, 82, 3, 0,
+  8, 22, 34, 0, 25, 0, 0, 0, 17, 10,
+  0, 0, 0, 0, 0, 0, 2, 15, 15, 5,
+  38, 0, 55, 0, 13, 0, 0, 74, 43, 0,
+  0, 0, 41, 0, 0, 0, 0, 15, 3, 0,
+  14, 72, 38, 47, 0, 64, 66, 0, 81, 51,
+  0, 26, 10, 14, 118, 35, 2, 0, 62, 0,
+  42, 8, 0, 26, 7, 52, 32, 25, 0, 26,
+  85, 30, 0, 8, 0, 25, 0, 13, 61, 0,
+  0, 0, 25, 0, 4, 20, 16, 0, 7, 0,
+  0, 0, 21, 2, 0, 0, 14, 32, 32, 38,
+  42, 30, 5, 5, 0, 0, 76, 3, 4, 0,
+  0, 15, 0, 0, 64, 23, 0, 0, 7, 0,
+  8, 49, 0, 0, 22, 10, 3, 0, 1, 17,
+  39, 0, 77, 0, 0, 43, 30, 0, 0, 41,
+  0, 0, 0, 3, 0, 15, 30, 0, 0, 0,
+  22, 0, 36, 0, 4, 47, 62, 10, 0, 19,
+  11, 10, 1, 0, 0, 51, 73, 0, 0, 33,
+  47, 24, 0, 20, 69, 64, 93, 12, 0, 0,
+  0, 23, 0, 0, 0, 0, 74, 0, 23, 28,
+  0, 28, 0, 48, 1, 24, 0, 19, 53, 57,
+  0, 57, 0, 37, 0, 54, 25, 0, 42, 0,
+  29, 0, 2, 0, 1, 0, 0, 20, 15, 0,
+  0, 0, 26, 0, 13, 15, 11, 22, 32, 0,
+  46, 51, 0, 12, 44, 0, 35, 0, 0, 8,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 24,
+  31, 0, 40, 41, 11, 0, 10, 24, 51, 0,
+  57, 0, 0, 3, 17, 15, 0, 12, 0, 0,
+  7, 0, 0, 7, 15, 4, 0, 0, 47, 0,
+  18, 0, 3, 30, 27, 20, 0, 12, 23, 23,
+  27, 0, 0, 40, 83, 0, 11, 31, 57, 0,
+  0, 0, 0, 92, 0, 1, 37, 0, 0, 25,
+  0, 0, 0, 50, 77, 0, 34, 0, 0, 19,
+  0, 54, 0, 46, 24, 10, 34, 52, 12, 15,
+  0, 33, 0, 55, 12, 26, 53, 0, 30, 0,
+  10, 0, 0, 13, 0, 58, 0, 13, 0, 0,
+  32, 0, 13, 16, 12, 11, 0, 0, 49, 39,
+  0, 32, 30, 0, 50, 41, 0, 0, 7, 0,
+  0, 13, 0, 0, 0, 16, 0, 30, 52, 0,
+  6, 80, 2, 0, 18, 20, 43, 0, 29, 0,
+  4, 0, 21, 11, 0, 0, 0, 0, 0, 0,
+  0, 11, 4, 11, 36, 0, 51, 0, 18, 0,
+  0, 48, 13, 14, 0, 0, 29, 34, 3, 0,
+  0, 37, 105, 0, 2, 11, 53, 15, 0, 14,
+  67, 51, 53, 17, 9, 0, 0, 9, 0, 0,
+  0, 0, 96, 0, 32, 9, 0, 24, 0, 75,
+  0, 32, 0, 38, 68, 64, 0, 61, 0, 41,
+  0, 28, 43, 1, 16, 0, 14, 0, 11, 0,
+  0, 0, 0, 18, 0, 0, 0, 0, 17, 0,
+  10, 2, 29, 20, 37, 0, 16, 39, 0, 22,
+  45, 0, 41, 0, 0, 0, 0, 0, 0, 7,
+  0, 0, 0, 7, 0, 48, 0, 0, 52, 46,
+  8, 0, 0, 12, 18, 0, 59, 0, 0, 16,
+  0, 17, 0, 17, 0, 0, 14, 0, 6, 8,
+  40, 0, 40, 0, 76, 0, 11, 0, 4, 29,
+  39, 21, 0, 5, 28, 2, 19, 0, 0, 34,
+  112, 0, 22, 39, 53, 0, 0, 0, 0, 83,
+  0, 10, 59, 0, 0, 23, 0, 0, 0, 41,
+  82, 0, 23, 0, 0, 23, 0, 78, 0, 55,
+  37, 22, 36, 48, 30, 16, 0, 54, 0, 60,
+  33, 24, 31, 0, 11, 0, 7, 0, 17, 0,
+  0, 63, 0, 10, 7, 0, 36, 0, 8, 20,
+  0, 4, 0, 0, 33, 43, 0, 29, 44, 0,
+  61, 29, 0, 0, 0, 0, 0, 31, 0, 0,
+  0, 4, 0, 29, 42, 0, 5, 76, 2, 0,
+  8, 14, 30, 0, 21, 0, 0, 0, 8, 15,
+  0, 0, 0, 0, 0, 0, 6, 2, 19, 0,
+  53, 0, 69, 0, 17, 0, 0, 0, 0, 10,
+  0, 139, 4, 0, 12, 0, 0, 18, 33, 0,
+  0, 25, 0, 0, 0, 0, 30, 95, 19, 11,
+  3, 0, 0, 0, 0, 0, 0, 27, 29, 38,
+  0, 0, 0, 23, 0, 54, 0, 22, 0, 53,
+  1, 90, 35, 56, 0, 0, 0, 51, 6, 0,
+  10, 0, 55, 0, 49, 0, 11, 61, 0, 0,
+  76, 3, 0, 3, 55, 0, 82, 11, 11, 0,
+  0, 21, 26, 25, 0, 32, 34, 0, 41, 44,
+  0, 0, 22, 0, 0, 7, 0, 21, 4, 0,
+  4, 31, 0, 0, 7, 66, 36, 0, 0, 23,
+  27, 0, 16, 0, 0, 0, 0, 0, 0, 35,
+  0, 0, 100, 2, 34, 1, 0, 0, 0, 0,
+  28, 0, 0, 0, 5, 45, 49, 8, 0, 13,
+  12, 23, 0, 0, 0, 49, 90, 0, 0, 29,
+  44, 13, 0, 25, 68, 58, 82, 13, 0, 0,
+  0, 11, 0, 0, 0, 0, 81, 0, 34, 31,
+  0, 20, 0, 59, 2, 29, 0, 28, 67, 52,
+  0, 60, 0, 43, 0, 42, 24, 0, 22, 0,
+  17, 0, 7, 0, 0, 0, 0, 9, 8, 0,
+  0, 0, 16, 0, 14, 13, 19, 19, 30, 0,
+  40, 53, 0, 19, 43, 0, 42, 0, 0, 11,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 33,
+  18, 0, 37, 45, 21, 0, 0, 23, 29, 0,
+  60, 0, 0, 7, 11, 13, 0, 17, 0, 0,
+  0, 0, 1, 9, 37, 0, 7, 0, 52, 0,
+  8, 2, 2, 29, 35, 14, 0, 2, 25, 15,
+  25, 0, 0, 41, 100, 0, 19, 33, 52, 0,
+  0, 0, 0, 93, 0, 8, 42, 0, 0, 23,
+  0, 0, 0, 43, 78, 0, 33, 0, 0, 18,
+  0, 68, 0, 56, 40, 13, 39, 47, 17, 12,
+  0, 48, 0, 63, 25, 25, 42, 0, 13, 0,
+  12, 0, 4, 7, 0, 68, 0, 15, 1, 0,
+  32, 0, 7, 15, 0, 11, 0, 0, 44, 48,
+  0, 33, 43, 0, 60, 25, 0, 0, 0, 0,
+  0, 17, 0, 0, 0, 3, 0, 32, 43, 0,
+  2, 82, 3, 0, 8, 22, 34, 0, 25, 0,
+  0, 0, 17, 10, 0, 0, 0, 0, 0, 0,
+  2, 15, 15, 5, 38, 0, 55, 0, 13, 0,
+  0, 0, 0, 2, 0, 130, 10, 0, 4, 0,
+  0, 17, 27, 0, 0, 13, 0, 0, 0, 0,
+  39, 101, 22, 12, 0, 0, 0, 0, 0, 3,
+  0, 24, 35, 28, 1, 0, 0, 22, 0, 43,
+  0, 20, 0, 45, 17, 92, 24, 56, 0, 1,
+  0, 50, 0, 0, 17, 0, 51, 0, 51, 0,
+  0, 57, 0, 0, 72, 8, 0, 8, 34, 0,
+  64, 5, 28, 6, 0, 15, 34, 35, 0, 21,
+  42, 0, 36, 58, 0, 0, 16, 0, 0, 0,
+  0, 14, 4, 0, 0, 35, 0, 0, 0, 63,
+  44, 0, 0, 33, 35, 0, 21, 0, 0, 0,
+  3, 0, 0, 32, 0, 0, 109, 11, 25, 17,
+  0, 0, 0, 0, 15, 0, 0, 0, 4, 47,
+  62, 10, 0, 19, 11, 10, 1, 0, 0, 51,
+  73, 0, 0, 33, 47, 24, 0, 20, 69, 64,
+  93, 12, 0, 0, 0, 23, 0, 0, 0, 0,
+  74, 0, 23, 28, 0, 28, 0, 48, 1, 24,
+  0, 19, 53, 57, 0, 57, 0, 37, 0, 54,
+  25, 0, 42, 0, 29, 0, 2, 0, 1, 0,
+  0, 20, 15, 0, 0, 0, 26, 0, 13, 15,
+  11, 22, 32, 0, 46, 51, 0, 12, 44, 0,
+  35, 0, 0, 8, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 24, 31, 0, 40, 41, 11, 0,
+  10, 24, 51, 0, 57, 0, 0, 3, 17, 15,
+  0, 12, 0, 0, 7, 0, 0, 7, 15, 4,
+  0, 0, 47, 0, 18, 0, 3, 30, 27, 20,
+  0, 12, 23, 23, 27, 0, 0, 40, 83, 0,
+  11, 31, 57, 0, 0, 0, 0, 92, 0, 1,
+  37, 0, 0, 25, 0, 0, 0, 50, 77, 0,
+  34, 0, 0, 19, 0, 54, 0, 46, 24, 10,
+  34, 52, 12, 15, 0, 33, 0, 55, 12, 26,
+  53, 0, 30, 0, 10, 0, 0, 13, 0, 58,
+  0, 13, 0, 0, 32, 0, 13, 16, 12, 11,
+  0, 0, 49, 39, 0, 32, 30, 0, 50, 41,
+  0, 0, 7, 0, 0, 13, 0, 0, 0, 16,
+  0, 30, 52, 0, 6, 80, 2, 0, 18, 20,
+  43, 0, 29, 0, 4, 0, 21, 11, 0, 0,
+  0, 0, 0, 0, 0, 11, 4, 11, 36, 0,
+  51, 0, 18, 0, 0, 0, 0, 5, 0, 140,
+  8, 5, 3, 0, 0, 23, 36, 0, 0, 10,
+  2, 0, 0, 0, 35, 102, 17, 9, 0, 0,
+  0, 0, 0, 21, 0, 23, 35, 21, 4, 1,
+  0, 25, 0, 41, 0, 16, 0, 48, 13, 84,
+  13, 57, 0, 3, 0, 61, 0, 0, 24, 0,
+  45, 0, 39, 0, 0, 51, 0, 0, 78, 3,
+  0, 20, 24, 0, 67, 6, 31, 2, 0, 19,
+  16, 27, 0, 18, 39, 0, 33, 59, 0, 0,
+  10, 0, 0, 0, 0, 8, 0, 0, 12, 34,
+  0, 0, 0, 66, 43, 0, 0, 31, 31, 0,
+  26, 0, 0, 0, 14, 0, 0, 24, 0, 0,
+  117, 2, 21, 20, 0, 0, 0, 0, 24, 0,
+  0, 0, 4, 29, 39, 21, 0, 5, 28, 2,
+  19, 0, 0, 34, 112, 0, 22, 39, 53, 0,
+  0, 0, 0, 83, 0, 10, 59, 0, 0, 23,
+  0, 0, 0, 41, 82, 0, 23, 0, 0, 23,
+  0, 78, 0, 55, 37, 22, 36, 48, 30, 16,
+  0, 54, 0, 60, 33, 24, 31, 0, 11, 0,
+  7, 0, 17, 0, 0, 63, 0, 10, 7, 0,
+  36, 0, 8, 20, 0, 4, 0, 0, 33, 43,
+  0, 29, 44, 0, 61, 29, 0, 0, 0, 0,
+  0, 31, 0, 0, 0, 4, 0, 29, 42, 0,
+  5, 76, 2, 0, 8, 14, 30, 0, 21, 0,
+  0, 0, 8, 15, 0, 0, 0, 0, 0, 0,
+  6, 2, 19, 0, 53, 0, 69, 0, 17, 0,
+  0, 0, 0, 10, 0, 139, 4, 0, 12, 0,
+  0, 18, 33, 0, 0, 25, 0, 0, 0, 0,
+  30, 95, 19, 11, 3, 0, 0, 0, 0, 0,
+  0, 27, 29, 38, 0, 0, 0, 23, 0, 54,
+  0, 22, 0, 53, 1, 90, 35, 56, 0, 0,
+  0, 51, 6, 0, 10, 0, 55, 0, 49, 0,
+  11, 61, 0, 0, 76, 3, 0, 3, 55, 0,
+  82, 11, 11, 0, 0, 21, 26, 25, 0, 32,
+  34, 0, 41, 44, 0, 0, 22, 0, 0, 7,
+  0, 21, 4, 0, 4, 31, 0, 0, 7, 66,
+  36, 0, 0, 23, 27, 0, 16, 0, 0, 0,
+  0, 0, 0, 35, 0, 0, 100, 2, 34, 1,
+  0, 0, 0, 0, 28, 0, 0, 0, 0, 0,
+  0, 0, 9, 38, 29, 0, 28, 0, 15, 0,
+  49, 21, 13, 59, 25, 11, 12, 5, 68, 0,
+  0, 42, 2, 24, 1, 0, 0, 35, 0, 0,
+  51, 61, 4, 0, 0, 0, 0, 42, 8, 38,
+  0, 45, 9, 26, 16, 31, 0, 20, 23, 0,
+  74, 24, 0, 0, 43, 0, 0, 56, 26, 7,
+  0, 0, 0, 0, 26, 8, 30, 0, 0, 7,
+  0, 8, 2, 45, 9, 0, 0, 52, 52, 14,
+  29, 21, 20, 0, 7, 19, 17, 28, 6, 32,
+  0, 6, 20, 41, 0, 0, 30, 59, 7, 0,
+  1, 0, 0, 0, 35, 0, 0, 25, 13, 0,
+  0, 13, 0, 0, 41, 20, 37, 0, 1, 0,
+  90, 0, 36, 0, 0, 0, 2, 29, 35, 14,
+  0, 2, 25, 15, 25, 0, 0, 41, 100, 0,
+  19, 33, 52, 0, 0, 0, 0, 93, 0, 8,
+  42, 0, 0, 23, 0, 0, 0, 43, 78, 0,
+  33, 0, 0, 18, 0, 68, 0, 56, 40, 13,
+  39, 47, 17, 12, 0, 48, 0, 63, 25, 25,
+  42, 0, 13, 0, 12, 0, 4, 7, 0, 68,
+  0, 15, 1, 0, 32, 0, 7, 15, 0, 11,
+  0, 0, 44, 48, 0, 33, 43, 0, 60, 25,
+  0, 0, 0, 0, 0, 17, 0, 0, 0, 3,
+  0, 32, 43, 0, 2, 82, 3, 0, 8, 22,
+  34, 0, 25, 0, 0, 0, 17, 10, 0, 0,
+  0, 0, 0, 0, 2, 15, 15, 5, 38, 0,
+  55, 0, 13, 0, 0, 0, 0, 2, 0, 130,
+  10, 0, 4, 0, 0, 17, 27, 0, 0, 13,
+  0, 0, 0, 0, 39, 101, 22, 12, 0, 0,
+  0, 0, 0, 3, 0, 24, 35, 28, 1, 0,
+  0, 22, 0, 43, 0, 20, 0, 45, 17, 92,
+  24, 56, 0, 1, 0, 50, 0, 0, 17, 0,
+  51, 0, 51, 0, 0, 57, 0, 0, 72, 8,
+  0, 8, 34, 0, 64, 5, 28, 6, 0, 15,
+  34, 35, 0, 21, 42, 0, 36, 58, 0, 0,
+  16, 0, 0, 0, 0, 14, 4, 0, 0, 35,
+  0, 0, 0, 63, 44, 0, 0, 33, 35, 0,
+  21, 0, 0, 0, 3, 0, 0, 32, 0, 0,
+  109, 11, 25, 17, 0, 0, 0, 0, 15, 0,
+  0, 0, 0, 0, 0, 0, 0, 30, 33, 0,
+  19, 0, 21, 0, 43, 0, 16, 54, 29, 19,
+  0, 10, 66, 0, 0, 44, 0, 21, 4, 0,
+  0, 41, 0, 0, 53, 56, 9, 0, 0, 0,
+  0, 18, 0, 34, 0, 47, 24, 21, 4, 29,
+  0, 18, 41, 0, 75, 14, 0, 0, 37, 0,
+  0, 75, 15, 0, 0, 0, 0, 0, 34, 16,
+  0, 0, 0, 2, 0, 21, 12, 35, 14, 9,
+  0, 42, 59, 0, 15, 48, 23, 0, 5, 24,
+  11, 27, 9, 21, 0, 6, 17, 45, 0, 0,
+  9, 43, 26, 0, 0, 0, 17, 0, 51, 8,
+  2, 21, 33, 2, 0, 20, 0, 0, 46, 39,
+  44, 11, 0, 0, 80, 0, 29, 15, 0, 0,
+  3, 30, 27, 20, 0, 12, 23, 23, 27, 0,
+  0, 40, 83, 0, 11, 31, 57, 0, 0, 0,
+  0, 92, 0, 1, 37, 0, 0, 25, 0, 0,
+  0, 50, 77, 0, 34, 0, 0, 19, 0, 54,
+  0, 46, 24, 10, 34, 52, 12, 15, 0, 33,
+  0, 55, 12, 26, 53, 0, 30, 0, 10, 0,
+  0, 13, 0, 58, 0, 13, 0, 0, 32, 0,
+  13, 16, 12, 11, 0, 0, 49, 39, 0, 32,
+  30, 0, 50, 41, 0, 0, 7, 0, 0, 13,
+  0, 0, 0, 16, 0, 30, 52, 0, 6, 80,
+  2, 0, 18, 20, 43, 0, 29, 0, 4, 0,
+  21, 11, 0, 0, 0, 0, 0, 0, 0, 11,
+  4, 11, 36, 0, 51, 0, 18, 0, 0, 0,
+  0, 5, 0, 140, 8, 5, 3, 0, 0, 23,
+  36, 0, 0, 10, 2, 0, 0, 0, 35, 102,
+  17, 9, 0, 0, 0, 0, 0, 21, 0, 23,
+  35, 21, 4, 1, 0, 25, 0, 41, 0, 16,
+  0, 48, 13, 84, 13, 57, 0, 3, 0, 61,
+  0, 0, 24, 0, 45, 0, 39, 0, 0, 51,
+  0, 0, 78, 3, 0, 20, 24, 0, 67, 6,
+  31, 2, 0, 19, 16, 27, 0, 18, 39, 0,
+  33, 59, 0, 0, 10, 0, 0, 0, 0, 8,
+  0, 0, 12, 34, 0, 0, 0, 66, 43, 0,
+  0, 31, 31, 0, 26, 0, 0, 0, 14, 0,
+  0, 24, 0, 0, 117, 2, 21, 20, 0, 0,
+  0, 0, 24, 0, 0, 0, 0, 8, 0, 0,
+  0, 26, 43, 6, 20, 0, 13, 0, 59, 0,
+  10, 62, 36, 31, 3, 0, 46, 0, 0, 38,
+  0, 42, 6, 2, 0, 34, 0, 0, 63, 41,
+  15, 0, 0, 0, 0, 46, 0, 37, 0, 53,
+  25, 14, 17, 17, 0, 32, 15, 5, 91, 14,
+  0, 0, 28, 0, 0, 70, 0, 0, 0, 0,
+  0, 0, 24, 8, 0, 0, 0, 2, 0, 9,
+  17, 48, 0, 3, 0, 31, 71, 5, 13, 36,
+  17, 0, 4, 23, 26, 35, 36, 0, 0, 2,
+  17, 32, 0, 0, 2, 44, 36, 0, 0, 0,
+  12, 0, 55, 13, 24, 46, 43, 0, 0, 24,
+  0, 0, 42, 41, 44, 0, 0, 0, 108, 0,
+  71, 14, 0, 0, 0, 0, 0, 10, 0, 139,
+  4, 0, 12, 0, 0, 18, 33, 0, 0, 25,
+  0, 0, 0, 0, 30, 95, 19, 11, 3, 0,
+  0, 0, 0, 0, 0, 27, 29, 38, 0, 0,
+  0, 23, 0, 54, 0, 22, 0, 53, 1, 90,
+  35, 56, 0, 0, 0, 51, 6, 0, 10, 0,
+  55, 0, 49, 0, 11, 61, 0, 0, 76, 3,
+  0, 3, 55, 0, 82, 11, 11, 0, 0, 21,
+  26, 25, 0, 32, 34, 0, 41, 44, 0, 0,
+  22, 0, 0, 7, 0, 21, 4, 0, 4, 31,
+  0, 0, 7, 66, 36, 0, 0, 23, 27, 0,
+  16, 0, 0, 0, 0, 0, 0, 35, 0, 0,
+  100, 2, 34, 1, 0, 0, 0, 0, 28, 0,
+  0, 0, 0, 0, 0, 0, 9, 38, 29, 0,
+  28, 0, 15, 0, 49, 21, 13, 59, 25, 11,
+  12, 5, 68, 0, 0, 42, 2, 24, 1, 0,
+  0, 35, 0, 0, 51, 61, 4, 0, 0, 0,
+  0, 42, 8, 38, 0, 45, 9, 26, 16, 31,
+  0, 20, 23, 0, 74, 24, 0, 0, 43, 0,
+  0, 56, 26, 7, 0, 0, 0, 0, 26, 8,
+  30, 0, 0, 7, 0, 8, 2, 45, 9, 0,
+  0, 52, 52, 14, 29, 21, 20, 0, 7, 19,
+  17, 28, 6, 32, 0, 6, 20, 41, 0, 0,
+  30, 59, 7, 0, 1, 0, 0, 0, 35, 0,
+  0, 25, 13, 0, 0, 13, 0, 0, 41, 20,
+  37, 0, 1, 0, 90, 0, 36, 0, 0, 0,
+  0, 41, 38, 0, 0, 0, 0, 0, 61, 6,
+  0, 16, 12, 19, 25, 54, 49, 37, 21, 5,
+  43, 0, 53, 32, 0, 0, 35, 21, 0, 0,
+  0, 0, 32, 0, 3, 0, 0, 0, 0, 35,
+  0, 0, 0, 27, 0, 26, 0, 0, 0, 15,
+  28, 3, 38, 9, 0, 0, 27, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 56, 0, 5, 0,
+  0, 0, 1, 44, 11, 11, 0, 62, 0, 23,
+  13, 12, 56, 44, 1, 24, 0, 29, 27, 31,
+  52, 10, 0, 0, 12, 0, 0, 0, 11, 51,
+  42, 0, 0, 0, 0, 0, 41, 0, 0, 48,
+  5, 0, 0, 10, 0, 0, 7, 0, 0, 0,
+  0, 0, 47, 0, 21, 0, 1, 20, 0, 0,
+  0, 2, 0, 130, 10, 0, 4, 0, 0, 17,
+  27, 0, 0, 13, 0, 0, 0, 0, 39, 101,
+  22, 12, 0, 0, 0, 0, 0, 3, 0, 24,
+  35, 28, 1, 0, 0, 22, 0, 43, 0, 20,
+  0, 45, 17, 92, 24, 56, 0, 1, 0, 50,
+  0, 0, 17, 0, 51, 0, 51, 0, 0, 57,
+  0, 0, 72, 8, 0, 8, 34, 0, 64, 5,
+  28, 6, 0, 15, 34, 35, 0, 21, 42, 0,
+  36, 58, 0, 0, 16, 0, 0, 0, 0, 14,
+  4, 0, 0, 35, 0, 0, 0, 63, 44, 0,
+  0, 33, 35, 0, 21, 0, 0, 0, 3, 0,
+  0, 32, 0, 0, 109, 11, 25, 17, 0, 0,
+  0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+  0, 30, 33, 0, 19, 0, 21, 0, 43, 0,
+  16, 54, 29, 19, 0, 10, 66, 0, 0, 44,
+  0, 21, 4, 0, 0, 41, 0, 0, 53, 56,
+  9, 0, 0, 0, 0, 18, 0, 34, 0, 47,
+  24, 21, 4, 29, 0, 18, 41, 0, 75, 14,
+  0, 0, 37, 0, 0, 75, 15, 0, 0, 0,
+  0, 0, 34, 16, 0, 0, 0, 2, 0, 21,
+  12, 35, 14, 9, 0, 42, 59, 0, 15, 48,
+  23, 0, 5, 24, 11, 27, 9, 21, 0, 6,
+  17, 45, 0, 0, 9, 43, 26, 0, 0, 0,
+  17, 0, 51, 8, 2, 21, 33, 2, 0, 20,
+  0, 0, 46, 39, 44, 11, 0, 0, 80, 0,
+  29, 15, 0, 0, 0, 47, 63, 0, 0, 0,
+  0, 0, 44, 1, 0, 11, 10, 3, 0, 58,
+  41, 16, 11, 0, 10, 0, 65, 40, 0, 0,
+  36, 16, 0, 0, 0, 0, 20, 0, 20, 14,
+  0, 0, 0, 16, 0, 3, 0, 22, 0, 2,
+  0, 0, 0, 1, 57, 3, 31, 0, 0, 0,
+  29, 0, 0, 14, 3, 0, 0, 0, 16, 0,
+  39, 2, 0, 0, 0, 0, 0, 49, 17, 0,
+  0, 86, 0, 30, 13, 0, 52, 56, 3, 30,
+  0, 29, 23, 24, 50, 0, 0, 0, 17, 0,
+  0, 0, 0, 53, 48, 0, 0, 0, 13, 0,
+  61, 0, 0, 31, 25, 0, 0, 5, 0, 0,
+  7, 0, 0, 16, 0, 0, 30, 0, 18, 13,
+  0, 31, 0, 0, 0, 5, 0, 140, 8, 5,
+  3, 0, 0, 23, 36, 0, 0, 10, 2, 0,
+  0, 0, 35, 102, 17, 9, 0, 0, 0, 0,
+  0, 21, 0, 23, 35, 21, 4, 1, 0, 25,
+  0, 41, 0, 16, 0, 48, 13, 84, 13, 57,
+  0, 3, 0, 61, 0, 0, 24, 0, 45, 0,
+  39, 0, 0, 51, 0, 0, 78, 3, 0, 20,
+  24, 0, 67, 6, 31, 2, 0, 19, 16, 27,
+  0, 18, 39, 0, 33, 59, 0, 0, 10, 0,
+  0, 0, 0, 8, 0, 0, 12, 34, 0, 0,
+  0, 66, 43, 0, 0, 31, 31, 0, 26, 0,
+  0, 0, 14, 0, 0, 24, 0, 0, 117, 2,
+  21, 20, 0, 0, 0, 0, 24, 0, 0, 0,
+  0, 8, 0, 0, 0, 26, 43, 6, 20, 0,
+  13, 0, 59, 0, 10, 62, 36, 31, 3, 0,
+  46, 0, 0, 38, 0, 42, 6, 2, 0, 34,
+  0, 0, 63, 41, 15, 0, 0, 0, 0, 46,
+  0, 37, 0, 53, 25, 14, 17, 17, 0, 32,
+  15, 5, 91, 14, 0, 0, 28, 0, 0, 70,
+  0, 0, 0, 0, 0, 0, 24, 8, 0, 0,
+  0, 2, 0, 9, 17, 48, 0, 3, 0, 31,
+  71, 5, 13, 36, 17, 0, 4, 23, 26, 35,
+  36, 0, 0, 2, 17, 32, 0, 0, 2, 44,
+  36, 0, 0, 0, 12, 0, 55, 13, 24, 46,
+  43, 0, 0, 24, 0, 0, 42, 41, 44, 0,
+  0, 0, 108, 0, 71, 14, 0, 0, 0, 44,
+  70, 0, 0, 0, 0, 9, 53, 0, 0, 29,
+  11, 20, 0, 36, 26, 0, 0, 0, 0, 7,
+  73, 51, 0, 0, 16, 18, 0, 0, 0, 0,
+  0, 0, 29, 22, 0, 0, 0, 40, 0, 13,
+  0, 10, 0, 1, 22, 0, 0, 0, 35, 32,
+  22, 15, 0, 0, 28, 0, 0, 0, 0, 0,
+  0, 0, 20, 0, 30, 0, 2, 0, 0, 8,
+  3, 20, 33, 0, 0, 85, 0, 28, 19, 0,
+  42, 48, 0, 18, 0, 36, 33, 9, 46, 0,
+  0, 0, 8, 0, 0, 0, 0, 81, 37, 0,
+  0, 0, 25, 0, 70, 0, 22, 26, 14, 0,
+  0, 8, 0, 0, 28, 0, 0, 18, 0, 0,
+  19, 0, 44, 20, 0, 20, 0, 0, 0, 0,
+  9, 38, 29, 0, 28, 0, 15, 0, 49, 21,
+  13, 59, 25, 11, 12, 5, 68, 0, 0, 42,
+  2, 24, 1, 0, 0, 35, 0, 0, 51, 61,
+  4, 0, 0, 0, 0, 42, 8, 38, 0, 45,
+  9, 26, 16, 31, 0, 20, 23, 0, 74, 24,
+  0, 0, 43, 0, 0, 56, 26, 7, 0, 0,
+  0, 0, 26, 8, 30, 0, 0, 7, 0, 8,
+  2, 45, 9, 0, 0, 52, 52, 14, 29, 21,
+  20, 0, 7, 19, 17, 28, 6, 32, 0, 6,
+  20, 41, 0, 0, 30, 59, 7, 0, 1, 0,
+  0, 0, 35, 0, 0, 25, 13, 0, 0, 13,
+  0, 0, 41, 20, 37, 0, 1, 0, 90, 0,
+  36, 0, 0, 0, 0, 41, 38, 0, 0, 0,
+  0, 0, 61, 6, 0, 16, 12, 19, 25, 54,
+  49, 37, 21, 5, 43, 0, 53, 32, 0, 0,
+  35, 21, 0, 0, 0, 0, 32, 0, 3, 0,
+  0, 0, 0, 35, 0, 0, 0, 27, 0, 26,
+  0, 0, 0, 15, 28, 3, 38, 9, 0, 0,
+  27, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  56, 0, 5, 0, 0, 0, 1, 44, 11, 11,
+  0, 62, 0, 23, 13, 12, 56, 44, 1, 24,
+  0, 29, 27, 31, 52, 10, 0, 0, 12, 0,
+  0, 0, 11, 51, 42, 0, 0, 0, 0, 0,
+  41, 0, 0, 48, 5, 0, 0, 10, 0, 0,
+  7, 0, 0, 0, 0, 0, 47, 0, 21, 0,
+  1, 20, 52, 0, 43, 0, 22, 0, 0, 0,
+  29, 0, 0, 0, 38, 88, 0, 0, 38, 0,
+  13, 0, 33, 104, 68, 26, 0, 0, 8, 50,
+  0, 0, 0, 10, 0, 4, 0, 0, 0, 20,
+  0, 11, 1, 0, 0, 0, 0, 16, 0, 0,
+  0, 7, 0, 77, 0, 0, 52, 0, 26, 23,
+  6, 0, 25, 0, 0, 6, 24, 0, 92, 16,
+  18, 73, 0, 0, 0, 73, 0, 0, 0, 50,
+  0, 0, 0, 0, 11, 59, 10, 49, 0, 55,
+  10, 0, 0, 37, 0, 0, 5, 0, 13, 0,
+  23, 61, 29, 7, 1, 0, 19, 2, 0, 26,
+  0, 53, 0, 7, 0, 0, 0, 23, 69, 0,
+  1, 0, 0, 31, 0, 0, 4, 0, 0, 61,
+  0, 0, 0, 0, 0, 30, 33, 0, 19, 0,
+  21, 0, 43, 0, 16, 54, 29, 19, 0, 10,
+  66, 0, 0, 44, 0, 21, 4, 0, 0, 41,
+  0, 0, 53, 56, 9, 0, 0, 0, 0, 18,
+  0, 34, 0, 47, 24, 21, 4, 29, 0, 18,
+  41, 0, 75, 14, 0, 0, 37, 0, 0, 75,
+  15, 0, 0, 0, 0, 0, 34, 16, 0, 0,
+  0, 2, 0, 21, 12, 35, 14, 9, 0, 42,
+  59, 0, 15, 48, 23, 0, 5, 24, 11, 27,
+  9, 21, 0, 6, 17, 45, 0, 0, 9, 43,
+  26, 0, 0, 0, 17, 0, 51, 8, 2, 21,
+  33, 2, 0, 20, 0, 0, 46, 39, 44, 11,
+  0, 0, 80, 0, 29, 15, 0, 0, 0, 47,
+  63, 0, 0, 0, 0, 0, 44, 1, 0, 11,
+  10, 3, 0, 58, 41, 16, 11, 0, 10, 0,
+  65, 40, 0, 0, 36, 16, 0, 0, 0, 0,
+  20, 0, 20, 14, 0, 0, 0, 16, 0, 3,
+  0, 22, 0, 2, 0, 0, 0, 1, 57, 3,
+  31, 0, 0, 0, 29, 0, 0, 14, 3, 0,
+  0, 0, 16, 0, 39, 2, 0, 0, 0, 0,
+  0, 49, 17, 0, 0, 86, 0, 30, 13, 0,
+  52, 56, 3, 30, 0, 29, 23, 24, 50, 0,
+  0, 0, 17, 0, 0, 0, 0, 53, 48, 0,
+  0, 0, 13, 0, 61, 0, 0, 31, 25, 0,
+  0, 5, 0, 0, 7, 0, 0, 16, 0, 0,
+  30, 0, 18, 13, 0, 31, 103, 0, 37, 5,
+  6, 15, 0, 0, 15, 0, 0, 23, 47, 54,
+  0, 0, 22, 0, 6, 0, 0, 173, 80, 13,
+  0, 0, 0, 33, 0, 0, 2, 56, 0, 34,
+  0, 21, 0, 29, 0, 25, 0, 22, 0, 0,
+  27, 6, 10, 8, 0, 0, 0, 77, 0, 0,
+  89, 0, 43, 20, 45, 0, 35, 11, 0, 32,
+  30, 49, 7, 15, 23, 23, 7, 28, 0, 22,
+  0, 0, 3, 45, 0, 13, 0, 0, 4, 42,
+  8, 27, 0, 9, 0, 0, 0, 0, 8, 0,
+  7, 0, 24, 0, 27, 61, 2, 0, 25, 0,
+  40, 28, 4, 8, 10, 35, 4, 0, 0, 0,
+  0, 15, 78, 0, 23, 10, 0, 35, 0, 0,
+  20, 3, 3, 48, 0, 8, 0, 0, 0, 26,
+  43, 6, 20, 0, 13, 0, 59, 0, 10, 62,
+  36, 31, 3, 0, 46, 0, 0, 38, 0, 42,
+  6, 2, 0, 34, 0, 0, 63, 41, 15, 0,
+  0, 0, 0, 46, 0, 37, 0, 53, 25, 14,
+  17, 17, 0, 32, 15, 5, 91, 14, 0, 0,
+  28, 0, 0, 70, 0, 0, 0, 0, 0, 0,
+  24, 8, 0, 0, 0, 2, 0, 9, 17, 48,
+  0, 3, 0, 31, 71, 5, 13, 36, 17, 0,
+  4, 23, 26, 35, 36, 0, 0, 2, 17, 32,
+  0, 0, 2, 44, 36, 0, 0, 0, 12, 0,
+  55, 13, 24, 46, 43, 0, 0, 24, 0, 0,
+  42, 41, 44, 0, 0, 0, 108, 0, 71, 14,
+  0, 0, 0, 44, 70, 0, 0, 0, 0, 9,
+  53, 0, 0, 29, 11, 20, 0, 36, 26, 0,
+  0, 0, 0, 7, 73, 51, 0, 0, 16, 18,
+  0, 0, 0, 0, 0, 0, 29, 22, 0, 0,
+  0, 40, 0, 13, 0, 10, 0, 1, 22, 0,
+  0, 0, 35, 32, 22, 15, 0, 0, 28, 0,
+  0, 0, 0, 0, 0, 0, 20, 0, 30, 0,
+  2, 0, 0, 8, 3, 20, 33, 0, 0, 85,
+  0, 28, 19, 0, 42, 48, 0, 18, 0, 36,
+  33, 9, 46, 0, 0, 0, 8, 0, 0, 0,
+  0, 81, 37, 0, 0, 0, 25, 0, 70, 0,
+  22, 26, 14, 0, 0, 8, 0, 0, 28, 0,
+  0, 18, 0, 0, 19, 0, 44, 20, 0, 20,
+  102, 0, 40, 4, 0, 12, 0, 0, 45, 0,
+  0, 35, 56, 20, 0, 0, 9, 0, 0, 0,
+  0, 189, 80, 25, 0, 0, 0, 31, 0, 0,
+  16, 61, 0, 11, 0, 30, 0, 40, 0, 30,
+  0, 28, 48, 0, 38, 21, 24, 29, 0, 0,
+  0, 80, 0, 0, 100, 0, 63, 0, 47, 0,
+  14, 23, 0, 56, 27, 66, 0, 1, 0, 4,
+  12, 26, 10, 13, 0, 0, 0, 47, 0, 15,
+  0, 0, 7, 21, 0, 11, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 25, 0, 18, 61,
+  0, 0, 17, 0, 54, 23, 26, 12, 6, 14,
+  8, 6, 0, 0, 0, 2, 87, 0, 36, 39,
+  0, 9, 0, 0, 23, 15, 18, 29, 0, 41,
+  38, 0, 0, 0, 0, 0, 61, 6, 0, 16,
+  12, 19, 25, 54, 49, 37, 21, 5, 43, 0,
+  53, 32, 0, 0, 35, 21, 0, 0, 0, 0,
+  32, 0, 3, 0, 0, 0, 0, 35, 0, 0,
+  0, 27, 0, 26, 0, 0, 0, 15, 28, 3,
+  38, 9, 0, 0, 27, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 56, 0, 5, 0, 0, 0,
+  1, 44, 11, 11, 0, 62, 0, 23, 13, 12,
+  56, 44, 1, 24, 0, 29, 27, 31, 52, 10,
+  0, 0, 12, 0, 0, 0, 11, 51, 42, 0,
+  0, 0, 0, 0, 41, 0, 0, 48, 5, 0,
+  0, 10, 0, 0, 7, 0, 0, 0, 0, 0,
+  47, 0, 21, 0, 1, 20, 52, 0, 43, 0,
+  22, 0, 0, 0, 29, 0, 0, 0, 38, 88,
+  0, 0, 38, 0, 13, 0, 33, 104, 68, 26,
+  0, 0, 8, 50, 0, 0, 0, 10, 0, 4,
+  0, 0, 0, 20, 0, 11, 1, 0, 0, 0,
+  0, 16, 0, 0, 0, 7, 0, 77, 0, 0,
+  52, 0, 26, 23, 6, 0, 25, 0, 0, 6,
+  24, 0, 92, 16, 18, 73, 0, 0, 0, 73,
+  0, 0, 0, 50, 0, 0, 0, 0, 11, 59,
+  10, 49, 0, 55, 10, 0, 0, 37, 0, 0,
+  5, 0, 13, 0, 23, 61, 29, 7, 1, 0,
+  19, 2, 0, 26, 0, 53, 0, 7, 0, 0,
+  0, 23, 69, 0, 1, 0, 0, 31, 0, 0,
+  4, 0, 0, 61, 44, 0, 0, 0, 25, 73,
+  0, 0, 7, 0, 0, 0, 26, 81, 0, 0,
+  48, 0, 0, 0, 40, 70, 0, 48, 0, 0,
+  0, 16, 0, 0, 0, 0, 0, 39, 0, 0,
+  0, 36, 0, 27, 0, 6, 0, 0, 20, 1,
+  0, 24, 22, 0, 0, 39, 0, 0, 0, 0,
+  10, 25, 0, 0, 31, 12, 0, 4, 0, 0,
+  87, 23, 22, 30, 0, 6, 0, 43, 7, 0,
+  0, 5, 0, 16, 0, 0, 0, 7, 9, 33,
+  0, 49, 1, 0, 0, 56, 0, 0, 0, 0,
+  0, 0, 17, 64, 6, 22, 16, 0, 10, 13,
+  0, 13, 8, 65, 0, 0, 0, 0, 0, 16,
+  82, 0, 8, 0, 12, 7, 0, 0, 0, 7,
+  4, 20, 0, 47, 63, 0, 0, 0, 0, 0,
+  44, 1, 0, 11, 10, 3, 0, 58, 41, 16,
+  11, 0, 10, 0, 65, 40, 0, 0, 36, 16,
+  0, 0, 0, 0, 20, 0, 20, 14, 0, 0,
+  0, 16, 0, 3, 0, 22, 0, 2, 0, 0,
+  0, 1, 57, 3, 31, 0, 0, 0, 29, 0,
+  0, 14, 3, 0, 0, 0, 16, 0, 39, 2,
+  0, 0, 0, 0, 0, 49, 17, 0, 0, 86,
+  0, 30, 13, 0, 52, 56, 3, 30, 0, 29,
+  23, 24, 50, 0, 0, 0, 17, 0, 0, 0,
+  0, 53, 48, 0, 0, 0, 13, 0, 61, 0,
+  0, 31, 25, 0, 0, 5, 0, 0, 7, 0,
+  0, 16, 0, 0, 30, 0, 18, 13, 0, 31,
+  103, 0, 37, 5, 6, 15, 0, 0, 15, 0,
+  0, 23, 47, 54, 0, 0, 22, 0, 6, 0,
+  0, 173, 80, 13, 0, 0, 0, 33, 0, 0,
+  2, 56, 0, 34, 0, 21, 0, 29, 0, 25,
+  0, 22, 0, 0, 27, 6, 10, 8, 0, 0,
+  0, 77, 0, 0, 89, 0, 43, 20, 45, 0,
+  35, 11, 0, 32, 30, 49, 7, 15, 23, 23,
+  7, 28, 0, 22, 0, 0, 3, 45, 0, 13,
+  0, 0, 4, 42, 8, 27, 0, 9, 0, 0,
+  0, 0, 8, 0, 7, 0, 24, 0, 27, 61,
+  2, 0, 25, 0, 40, 28, 4, 8, 10, 35,
+  4, 0, 0, 0, 0, 15, 78, 0, 23, 10,
+  0, 35, 0, 0, 20, 3, 3, 48, 45, 0,
+  0, 0, 22, 82, 0, 0, 8, 0, 0, 0,
+  29, 61, 0, 8, 48, 0, 0, 0, 21, 71,
+  5, 41, 10, 3, 0, 14, 0, 2, 0, 9,
+  0, 69, 34, 19, 0, 41, 0, 34, 7, 20,
+  0, 34, 59, 23, 26, 10, 5, 0, 0, 0,
+  0, 0, 0, 0, 18, 22, 10, 15, 30, 39,
+  10, 0, 0, 0, 16, 36, 52, 0, 27, 32,
+  3, 0, 12, 28, 0, 21, 0, 48, 0, 2,
+  0, 34, 13, 5, 17, 11, 0, 25, 0, 47,
+  10, 1, 26, 5, 0, 0, 0, 67, 13, 0,
+  12, 0, 16, 0, 0, 15, 0, 51, 0, 0,
+  0, 0, 0, 0, 69, 0, 19, 0, 19, 11,
+  0, 0, 29, 2, 31, 0, 0, 44, 70, 0,
+  0, 0, 0, 9, 53, 0, 0, 29, 11, 20,
+  0, 36, 26, 0, 0, 0, 0, 7, 73, 51,
+  0, 0, 16, 18, 0, 0, 0, 0, 0, 0,
+  29, 22, 0, 0, 0, 40, 0, 13, 0, 10,
+  0, 1, 22, 0, 0, 0, 35, 32, 22, 15,
+  0, 0, 28, 0, 0, 0, 0, 0, 0, 0,
+  20, 0, 30, 0, 2, 0, 0, 8, 3, 20,
+  33, 0, 0, 85, 0, 28, 19, 0, 42, 48,
+  0, 18, 0, 36, 33, 9, 46, 0, 0, 0,
+  8, 0, 0, 0, 0, 81, 37, 0, 0, 0,
+  25, 0, 70, 0, 22, 26, 14, 0, 0, 8,
+  0, 0, 28, 0, 0, 18, 0, 0, 19, 0,
+  44, 20, 0, 20, 102, 0, 40, 4, 0, 12,
+  0, 0, 45, 0, 0, 35, 56, 20, 0, 0,
+  9, 0, 0, 0, 0, 189, 80, 25, 0, 0,
+  0, 31, 0, 0, 16, 61, 0, 11, 0, 30,
+  0, 40, 0, 30, 0, 28, 48, 0, 38, 21,
+  24, 29, 0, 0, 0, 80, 0, 0, 100, 0,
+  63, 0, 47, 0, 14, 23, 0, 56, 27, 66,
+  0, 1, 0, 4, 12, 26, 10, 13, 0, 0,
+  0, 47, 0, 15, 0, 0, 7, 21, 0, 11,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  25, 0, 18, 61, 0, 0, 17, 0, 54, 23,
+  26, 12, 6, 14, 8, 6, 0, 0, 0, 2,
+  87, 0, 36, 39, 0, 9, 0, 0, 23, 15,
+  18, 29, 9, 0, 0, 9, 0, 65, 0, 0,
+  41, 0, 0, 0, 45, 38, 0, 38, 32, 25,
+  0, 0, 8, 14, 5, 56, 28, 0, 0, 19,
+  0, 0, 0, 21, 10, 40, 27, 4, 0, 33,
+  0, 8, 9, 4, 50, 58, 50, 77, 14, 17,
+  0, 0, 0, 0, 0, 0, 0, 0, 54, 0,
+  0, 0, 4, 43, 0, 0, 0, 0, 0, 0,
+  12, 0, 54, 0, 14, 11, 0, 28, 0, 28,
+  0, 28, 0, 16, 0, 39, 0, 0, 31, 0,
+  14, 62, 0, 63, 0, 0, 13, 17, 0, 0,
+  0, 56, 19, 0, 0, 0, 17, 0, 0, 4,
+  0, 40, 0, 0, 0, 9, 0, 0, 61, 0,
+  8, 0, 37, 0, 3, 0, 29, 10, 44, 0,
+  52, 0, 43, 0, 22, 0, 0, 0, 29, 0,
+  0, 0, 38, 88, 0, 0, 38, 0, 13, 0,
+  33, 104, 68, 26, 0, 0, 8, 50, 0, 0,
+  0, 10, 0, 4, 0, 0, 0, 20, 0, 11,
+  1, 0, 0, 0, 0, 16, 0, 0, 0, 7,
+  0, 77, 0, 0, 52, 0, 26, 23, 6, 0,
+  25, 0, 0, 6, 24, 0, 92, 16, 18, 73,
+  0, 0, 0, 73, 0, 0, 0, 50, 0, 0,
+  0, 0, 11, 59, 10, 49, 0, 55, 10, 0,
+  0, 37, 0, 0, 5, 0, 13, 0, 23, 61,
+  29, 7, 1, 0, 19, 2, 0, 26, 0, 53,
+  0, 7, 0, 0, 0, 23, 69, 0, 1, 0,
+  0, 31, 0, 0, 4, 0, 0, 61, 44, 0,
+  0, 0, 25, 73, 0, 0, 7, 0, 0, 0,
+  26, 81, 0, 0, 48, 0, 0, 0, 40, 70,
+  0, 48, 0, 0, 0, 16, 0, 0, 0, 0,
+  0, 39, 0, 0, 0, 36, 0, 27, 0, 6,
+  0, 0, 20, 1, 0, 24, 22, 0, 0, 39,
+  0, 0, 0, 0, 10, 25, 0, 0, 31, 12,
+  0, 4, 0, 0, 87, 23, 22, 30, 0, 6,
+  0, 43, 7, 0, 0, 5, 0, 16, 0, 0,
+  0, 7, 9, 33, 0, 49, 1, 0, 0, 56,
+  0, 0, 0, 0, 0, 0, 17, 64, 6, 22,
+  16, 0, 10, 13, 0, 13, 8, 65, 0, 0,
+  0, 0, 0, 16, 82, 0, 8, 0, 12, 7,
+  0, 0, 0, 7, 4, 20, 0, 17, 0, 0,
+  21, 28, 30, 14, 58, 16, 0, 5, 32, 30,
+  51, 35, 42, 53, 0, 21, 81, 0, 0, 49,
+  7, 50, 21, 0, 0, 19, 0, 0, 2, 16,
+  18, 0, 0, 7, 0, 43, 0, 40, 0, 33,
+  27, 19, 0, 12, 0, 0, 23, 0, 84, 2,
+  0, 0, 0, 0, 0, 29, 0, 0, 0, 0,
+  0, 0, 33, 0, 0, 0, 0, 25, 18, 30,
+  44, 27, 0, 0, 0, 44, 47, 23, 14, 0,
+  26, 7, 56, 14, 51, 35, 8, 27, 0, 39,
+  0, 19, 0, 4, 43, 43, 0, 0, 0, 0,
+  0, 0, 8, 13, 9, 61, 0, 0, 0, 0,
+  12, 0, 28, 21, 21, 0, 50, 0, 111, 0,
+  14, 14, 3, 0, 103, 0, 37, 5, 6, 15,
+  0, 0, 15, 0, 0, 23, 47, 54, 0, 0,
+  22, 0, 6, 0, 0, 173, 80, 13, 0, 0,
+  0, 33, 0, 0, 2, 56, 0, 34, 0, 21,
+  0, 29, 0, 25, 0, 22, 0, 0, 27, 6,
+  10, 8, 0, 0, 0, 77, 0, 0, 89, 0,
+  43, 20, 45, 0, 35, 11, 0, 32, 30, 49,
+  7, 15, 23, 23, 7, 28, 0, 22, 0, 0,
+  3, 45, 0, 13, 0, 0, 4, 42, 8, 27,
+  0, 9, 0, 0, 0, 0, 8, 0, 7, 0,
+  24, 0, 27, 61, 2, 0, 25, 0, 40, 28,
+  4, 8, 10, 35, 4, 0, 0, 0, 0, 15,
+  78, 0, 23, 10, 0, 35, 0, 0, 20, 3,
+  3, 48, 45, 0, 0, 0, 22, 82, 0, 0,
+  8, 0, 0, 0, 29, 61, 0, 8, 48, 0,
+  0, 0, 21, 71, 5, 41, 10, 3, 0, 14,
+  0, 2, 0, 9, 0, 69, 34, 19, 0, 41,
+  0, 34, 7, 20, 0, 34, 59, 23, 26, 10,
+  5, 0, 0, 0, 0, 0, 0, 0, 18, 22,
+  10, 15, 30, 39, 10, 0, 0, 0, 16, 36,
+  52, 0, 27, 32, 3, 0, 12, 28, 0, 21,
+  0, 48, 0, 2, 0, 34, 13, 5, 17, 11,
+  0, 25, 0, 47, 10, 1, 26, 5, 0, 0,
+  0, 67, 13, 0, 12, 0, 16, 0, 0, 15,
+  0, 51, 0, 0, 0, 0, 0, 0, 69, 0,
+  19, 0, 19, 11, 0, 0, 29, 2, 31, 0,
+  0, 24, 0, 0, 40, 11, 0, 0, 61, 11,
+  0, 15, 51, 85, 31, 58, 61, 16, 0, 9,
+  60, 0, 0, 53, 11, 51, 1, 8, 0, 10,
+  0, 0, 0, 42, 35, 0, 15, 23, 0, 51,
+  12, 18, 0, 69, 33, 20, 9, 0, 0, 0,
+  24, 0, 57, 28, 0, 0, 0, 2, 0, 18,
+  0, 0, 0, 0, 0, 0, 31, 0, 42, 0,
+  0, 0, 4, 14, 36, 12, 0, 6, 0, 29,
+  44, 60, 4, 0, 34, 12, 53, 16, 53, 25,
+  0, 50, 0, 27, 0, 9, 0, 0, 31, 64,
+  0, 0, 0, 0, 0, 0, 0, 12, 10, 60,
+  0, 0, 0, 0, 0, 0, 10, 13, 32, 0,
+  25, 0, 76, 0, 51, 15, 31, 0, 102, 0,
+  40, 4, 0, 12, 0, 0, 45, 0, 0, 35,
+  56, 20, 0, 0, 9, 0, 0, 0, 0, 189,
+  80, 25, 0, 0, 0, 31, 0, 0, 16, 61,
+  0, 11, 0, 30, 0, 40, 0, 30, 0, 28,
+  48, 0, 38, 21, 24, 29, 0, 0, 0, 80,
+  0, 0, 100, 0, 63, 0, 47, 0, 14, 23,
+  0, 56, 27, 66, 0, 1, 0, 4, 12, 26,
+  10, 13, 0, 0, 0, 47, 0, 15, 0, 0,
+  7, 21, 0, 11, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 25, 0, 18, 61, 0, 0,
+  17, 0, 54, 23, 26, 12, 6, 14, 8, 6,
+  0, 0, 0, 2, 87, 0, 36, 39, 0, 9,
+  0, 0, 23, 15, 18, 29, 9, 0, 0, 9,
+  0, 65, 0, 0, 41, 0, 0, 0, 45, 38,
+  0, 38, 32, 25, 0, 0, 8, 14, 5, 56,
+  28, 0, 0, 19, 0, 0, 0, 21, 10, 40,
+  27, 4, 0, 33, 0, 8, 9, 4, 50, 58,
+  50, 77, 14, 17, 0, 0, 0, 0, 0, 0,
+  0, 0, 54, 0, 0, 0, 4, 43, 0, 0,
+  0, 0, 0, 0, 12, 0, 54, 0, 14, 11,
+  0, 28, 0, 28, 0, 28, 0, 16, 0, 39,
+  0, 0, 31, 0, 14, 62, 0, 63, 0, 0,
+  13, 17, 0, 0, 0, 56, 19, 0, 0, 0,
+  17, 0, 0, 4, 0, 40, 0, 0, 0, 9,
+  0, 0, 61, 0, 8, 0, 37, 0, 3, 0,
+  29, 10, 44, 0, 0, 14, 0, 0, 35, 12,
+  0, 0, 40, 0, 0, 15, 31, 88, 14, 51,
+  40, 12, 0, 18, 47, 0, 19, 50, 3, 20,
+  0, 2, 0, 0, 0, 0, 0, 38, 7, 0,
+  3, 31, 0, 29, 36, 1, 0, 74, 29, 39,
+  8, 0, 0, 0, 18, 2, 39, 14, 0, 6,
+  37, 0, 0, 0, 0, 4, 5, 0, 0, 0,
+  26, 0, 49, 0, 0, 0, 3, 3, 17, 22,
+  0, 17, 0, 21, 27, 60, 0, 26, 24, 3,
+  57, 0, 52, 33, 0, 62, 14, 8, 23, 27,
+  0, 0, 26, 70, 5, 0, 0, 0, 0, 0,
+  0, 16, 0, 35, 0, 0, 0, 12, 0, 0,
+  17, 3, 26, 0, 0, 0, 20, 0, 35, 8,
+  37, 0, 44, 0, 0, 0, 25, 73, 0, 0,
+  7, 0, 0, 0, 26, 81, 0, 0, 48, 0,
+  0, 0, 40, 70, 0, 48, 0, 0, 0, 16,
+  0, 0, 0, 0, 0, 39, 0, 0, 0, 36,
+  0, 27, 0, 6, 0, 0, 20, 1, 0, 24,
+  22, 0, 0, 39, 0, 0, 0, 0, 10, 25,
+  0, 0, 31, 12, 0, 4, 0, 0, 87, 23,
+  22, 30, 0, 6, 0, 43, 7, 0, 0, 5,
+  0, 16, 0, 0, 0, 7, 9, 33, 0, 49,
+  1, 0, 0, 56, 0, 0, 0, 0, 0, 0,
+  17, 64, 6, 22, 16, 0, 10, 13, 0, 13,
+  8, 65, 0, 0, 0, 0, 0, 16, 82, 0,
+  8, 0, 12, 7, 0, 0, 0, 7, 4, 20,
+  0, 17, 0, 0, 21, 28, 30, 14, 58, 16,
+  0, 5, 32, 30, 51, 35, 42, 53, 0, 21,
+  81, 0, 0, 49, 7, 50, 21, 0, 0, 19,
+  0, 0, 2, 16, 18, 0, 0, 7, 0, 43,
+  0, 40, 0, 33, 27, 19, 0, 12, 0, 0,
+  23, 0, 84, 2, 0, 0, 0, 0, 0, 29,
+  0, 0, 0, 0, 0, 0, 33, 0, 0, 0,
+  0, 25, 18, 30, 44, 27, 0, 0, 0, 44,
+  47, 23, 14, 0, 26, 7, 56, 14, 51, 35,
+  8, 27, 0, 39, 0, 19, 0, 4, 43, 43,
+  0, 0, 0, 0, 0, 0, 8, 13, 9, 61,
+  0, 0, 0, 0, 12, 0, 28, 21, 21, 0,
+  50, 0, 111, 0, 14, 14, 3, 0, 0, 47,
+  23, 0, 8, 0, 33, 0, 55, 0, 0, 17,
+  28, 56, 45, 66, 49, 49, 0, 15, 78, 0,
+  0, 46, 13, 29, 27, 0, 0, 0, 14, 0,
+  11, 19, 4, 0, 0, 0, 0, 33, 12, 13,
+  0, 55, 6, 0, 0, 0, 0, 0, 63, 12,
+  64, 29, 0, 0, 0, 0, 0, 23, 0, 0,
+  0, 0, 0, 0, 42, 0, 0, 0, 0, 0,
+  0, 41, 36, 0, 0, 29, 0, 27, 65, 51,
+  36, 6, 50, 11, 55, 0, 58, 33, 0, 14,
+  0, 30, 0, 20, 0, 12, 43, 51, 0, 0,
+  0, 0, 0, 0, 5, 6, 14, 33, 30, 0,
+  0, 0, 41, 0, 0, 0, 5, 0, 0, 0,
+  81, 0, 6, 22, 17, 0, 45, 0, 0, 0,
+  22, 82, 0, 0, 8, 0, 0, 0, 29, 61,
+  0, 8, 48, 0, 0, 0, 21, 71, 5, 41,
+  10, 3, 0, 14, 0, 2, 0, 9, 0, 69,
+  34, 19, 0, 41, 0, 34, 7, 20, 0, 34,
+  59, 23, 26, 10, 5, 0, 0, 0, 0, 0,
+  0, 0, 18, 22, 10, 15, 30, 39, 10, 0,
+  0, 0, 16, 36, 52, 0, 27, 32, 3, 0,
+  12, 28, 0, 21, 0, 48, 0, 2, 0, 34,
+  13, 5, 17, 11, 0, 25, 0, 47, 10, 1,
+  26, 5, 0, 0, 0, 67, 13, 0, 12, 0,
+  16, 0, 0, 15, 0, 51, 0, 0, 0, 0,
+  0, 0, 69, 0, 19, 0, 19, 11, 0, 0,
+  29, 2, 31, 0, 0, 24, 0, 0, 40, 11,
+  0, 0, 61, 11, 0, 15, 51, 85, 31, 58,
+  61, 16, 0, 9, 60, 0, 0, 53, 11, 51,
+  1, 8, 0, 10, 0, 0, 0, 42, 35, 0,
+  15, 23, 0, 51, 12, 18, 0, 69, 33, 20,
+  9, 0, 0, 0, 24, 0, 57, 28, 0, 0,
+  0, 2, 0, 18, 0, 0, 0, 0, 0, 0,
+  31, 0, 42, 0, 0, 0, 4, 14, 36, 12,
+  0, 6, 0, 29, 44, 60, 4, 0, 34, 12,
+  53, 16, 53, 25, 0, 50, 0, 27, 0, 9,
+  0, 0, 31, 64, 0, 0, 0, 0, 0, 0,
+  0, 12, 10, 60, 0, 0, 0, 0, 0, 0,
+  10, 13, 32, 0, 25, 0, 76, 0, 51, 15,
+  31, 0, 0, 35, 50, 0, 10, 0, 0, 0,
+  51, 2, 0, 18, 8, 100, 10, 27, 39, 26,
+  2, 4, 44, 0, 34, 24, 0, 0, 0, 5,
+  0, 0, 0, 0, 0, 0, 0, 0, 5, 0,
+  0, 22, 18, 0, 0, 35, 0, 0, 0, 0,
+  0, 0, 52, 66, 0, 34, 0, 0, 6, 2,
+  0, 0, 0, 0, 13, 0, 38, 2, 22, 0,
+  23, 0, 0, 0, 3, 15, 29, 0, 0, 37,
+  0, 21, 32, 48, 11, 18, 40, 3, 53, 7,
+  75, 6, 0, 23, 0, 0, 0, 1, 0, 0,
+  40, 70, 1, 0, 0, 0, 7, 0, 0, 9,
+  0, 8, 32, 0, 0, 0, 57, 0, 10, 0,
+  12, 0, 0, 0, 8, 0, 9, 14, 37, 0,
+  9, 0, 0, 9, 0, 65, 0, 0, 41, 0,
+  0, 0, 45, 38, 0, 38, 32, 25, 0, 0,
+  8, 14, 5, 56, 28, 0, 0, 19, 0, 0,
+  0, 21, 10, 40, 27, 4, 0, 33, 0, 8,
+  9, 4, 50, 58, 50, 77, 14, 17, 0, 0,
+  0, 0, 0, 0, 0, 0, 54, 0, 0, 0,
+  4, 43, 0, 0, 0, 0, 0, 0, 12, 0,
+  54, 0, 14, 11, 0, 28, 0, 28, 0, 28,
+  0, 16, 0, 39, 0, 0, 31, 0, 14, 62,
+  0, 63, 0, 0, 13, 17, 0, 0, 0, 56,
+  19, 0, 0, 0, 17, 0, 0, 4, 0, 40,
+  0, 0, 0, 9, 0, 0, 61, 0, 8, 0,
+  37, 0, 3, 0, 29, 10, 44, 0, 0, 14,
+  0, 0, 35, 12, 0, 0, 40, 0, 0, 15,
+  31, 88, 14, 51, 40, 12, 0, 18, 47, 0,
+  19, 50, 3, 20, 0, 2, 0, 0, 0, 0,
+  0, 38, 7, 0, 3, 31, 0, 29, 36, 1,
+  0, 74, 29, 39, 8, 0, 0, 0, 18, 2,
+  39, 14, 0, 6, 37, 0, 0, 0, 0, 4,
+  5, 0, 0, 0, 26, 0, 49, 0, 0, 0,
+  3, 3, 17, 22, 0, 17, 0, 21, 27, 60,
+  0, 26, 24, 3, 57, 0, 52, 33, 0, 62,
+  14, 8, 23, 27, 0, 0, 26, 70, 5, 0,
+  0, 0, 0, 0, 0, 16, 0, 35, 0, 0,
+  0, 12, 0, 0, 17, 3, 26, 0, 0, 0,
+  20, 0, 35, 8, 37, 0, 24, 0, 53, 0,
+  32, 0, 0, 0, 25, 0, 0, 1, 9, 122,
+  15, 0, 27, 21, 0, 8, 41, 13, 69, 7,
+  0, 0, 0, 4, 0, 0, 0, 0, 0, 5,
+  0, 0, 0, 4, 0, 26, 14, 10, 0, 48,
+  14, 0, 0, 0, 0, 0, 37, 104, 0, 37,
+  0, 0, 9, 6, 3, 0, 0, 0, 33, 0,
+  50, 22, 0, 0, 24, 22, 0, 1, 0, 0,
+  27, 0, 0, 13, 0, 41, 14, 36, 0, 5,
+  48, 0, 45, 11, 72, 0, 0, 2, 0, 0,
+  0, 25, 0, 0, 41, 57, 0, 0, 0, 0,
+  0, 0, 0, 10, 1, 0, 35, 0, 0, 0,
+  51, 0, 55, 0, 5, 0, 0, 0, 0, 0,
+  28, 1, 16, 0, 0, 17, 0, 0, 21, 28,
+  30, 14, 58, 16, 0, 5, 32, 30, 51, 35,
+  42, 53, 0, 21, 81, 0, 0, 49, 7, 50,
+  21, 0, 0, 19, 0, 0, 2, 16, 18, 0,
+  0, 7, 0, 43, 0, 40, 0, 33, 27, 19,
+  0, 12, 0, 0, 23, 0, 84, 2, 0, 0,
+  0, 0, 0, 29, 0, 0, 0, 0, 0, 0,
+  33, 0, 0, 0, 0, 25, 18, 30, 44, 27,
+  0, 0, 0, 44, 47, 23, 14, 0, 26, 7,
+  56, 14, 51, 35, 8, 27, 0, 39, 0, 19,
+  0, 4, 43, 43, 0, 0, 0, 0, 0, 0,
+  8, 13, 9, 61, 0, 0, 0, 0, 12, 0,
+  28, 21, 21, 0, 50, 0, 111, 0, 14, 14,
+  3, 0, 0, 47, 23, 0, 8, 0, 33, 0,
+  55, 0, 0, 17, 28, 56, 45, 66, 49, 49,
+  0, 15, 78, 0, 0, 46, 13, 29, 27, 0,
+  0, 0, 14, 0, 11, 19, 4, 0, 0, 0,
+  0, 33, 12, 13, 0, 55, 6, 0, 0, 0,
+  0, 0, 63, 12, 64, 29, 0, 0, 0, 0,
+  0, 23, 0, 0, 0, 0, 0, 0, 42, 0,
+  0, 0, 0, 0, 0, 41, 36, 0, 0, 29,
+  0, 27, 65, 51, 36, 6, 50, 11, 55, 0,
+  58, 33, 0, 14, 0, 30, 0, 20, 0, 12,
+  43, 51, 0, 0, 0, 0, 0, 0, 5, 6,
+  14, 33, 30, 0, 0, 0, 41, 0, 0, 0,
+  5, 0, 0, 0, 81, 0, 6, 22, 17, 0,
+  0, 43, 70, 0, 11, 0, 9, 0, 57, 6,
+  0, 0, 0, 60, 23, 63, 30, 38, 0, 12,
+  39, 0, 33, 35, 0, 0, 9, 14, 0, 0,
+  27, 0, 0, 0, 0, 0, 0, 17, 0, 12,
+  27, 0, 0, 40, 0, 0, 0, 0, 0, 0,
+  48, 52, 41, 12, 0, 0, 19, 12, 0, 0,
+  0, 0, 0, 0, 24, 0, 45, 0, 11, 4,
+  0, 0, 0, 28, 32, 0, 0, 18, 0, 0,
+  58, 19, 0, 21, 59, 13, 23, 9, 64, 10,
+  0, 32, 0, 0, 0, 0, 0, 0, 40, 51,
+  0, 0, 0, 0, 36, 0, 0, 22, 4, 24,
+  40, 0, 0, 0, 86, 0, 2, 0, 26, 0,
+  0, 1, 21, 0, 0, 24, 22, 0, 0, 24,
+  0, 0, 40, 11, 0, 0, 61, 11, 0, 15,
+  51, 85, 31, 58, 61, 16, 0, 9, 60, 0,
+  0, 53, 11, 51, 1, 8, 0, 10, 0, 0,
+  0, 42, 35, 0, 15, 23, 0, 51, 12, 18,
+  0, 69, 33, 20, 9, 0, 0, 0, 24, 0,
+  57, 28, 0, 0, 0, 2, 0, 18, 0, 0,
+  0, 0, 0, 0, 31, 0, 42, 0, 0, 0,
+  4, 14, 36, 12, 0, 6, 0, 29, 44, 60,
+  4, 0, 34, 12, 53, 16, 53, 25, 0, 50,
+  0, 27, 0, 9, 0, 0, 31, 64, 0, 0,
+  0, 0, 0, 0, 0, 12, 10, 60, 0, 0,
+  0, 0, 0, 0, 10, 13, 32, 0, 25, 0,
+  76, 0, 51, 15, 31, 0, 0, 35, 50, 0,
+  10, 0, 0, 0, 51, 2, 0, 18, 8, 100,
+  10, 27, 39, 26, 2, 4, 44, 0, 34, 24,
+  0, 0, 0, 5, 0, 0, 0, 0, 0, 0,
+  0, 0, 5, 0, 0, 22, 18, 0, 0, 35,
+  0, 0, 0, 0, 0, 0, 52, 66, 0, 34,
+  0, 0, 6, 2, 0, 0, 0, 0, 13, 0,
+  38, 2, 22, 0, 23, 0, 0, 0, 3, 15,
+  29, 0, 0, 37, 0, 21, 32, 48, 11, 18,
+  40, 3, 53, 7, 75, 6, 0, 23, 0, 0,
+  0, 1, 0, 0, 40, 70, 1, 0, 0, 0,
+  7, 0, 0, 9, 0, 8, 32, 0, 0, 0,
+  57, 0, 10, 0, 12, 0, 0, 0, 8, 0,
+  9, 14, 37, 0, 22, 0, 59, 0, 0, 0,
+  0, 0, 23, 0, 0, 0, 0, 116, 1, 0,
+  6, 27, 1, 0, 38, 30, 84, 8, 0, 0,
+  0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 2, 0, 0, 28, 17, 0, 30, 0, 0,
+  0, 0, 0, 0, 35, 131, 0, 15, 36, 0,
+  30, 17, 14, 0, 0, 0, 34, 0, 88, 47,
+  7, 2, 16, 67, 0, 0, 0, 0, 11, 0,
+  0, 0, 0, 24, 16, 22, 0, 15, 41, 0,
+  31, 10, 71, 0, 0, 11, 2, 0, 0, 5,
+  0, 0, 62, 66, 0, 0, 0, 0, 12, 10,
+  0, 7, 0, 0, 50, 0, 0, 0, 91, 3,
+  77, 0, 19, 0, 0, 0, 0, 0, 21, 6,
+  10, 0, 0, 14, 0, 0, 35, 12, 0, 0,
+  40, 0, 0, 15, 31, 88, 14, 51, 40, 12,
+  0, 18, 47, 0, 19, 50, 3, 20, 0, 2,
+  0, 0, 0, 0, 0, 38, 7, 0, 3, 31,
+  0, 29, 36, 1, 0, 74, 29, 39, 8, 0,
+  0, 0, 18, 2, 39, 14, 0, 6, 37, 0,
+  0, 0, 0, 4, 5, 0, 0, 0, 26, 0,
+  49, 0, 0, 0, 3, 3, 17, 22, 0, 17,
+  0, 21, 27, 60, 0, 26, 24, 3, 57, 0,
+  52, 33, 0, 62, 14, 8, 23, 27, 0, 0,
+  26, 70, 5, 0, 0, 0, 0, 0, 0, 16,
+  0, 35, 0, 0, 0, 12, 0, 0, 17, 3,
+  26, 0, 0, 0, 20, 0, 35, 8, 37, 0,
+  24, 0, 53, 0, 32, 0, 0, 0, 25, 0,
+  0, 1, 9, 122, 15, 0, 27, 21, 0, 8,
+  41, 13, 69, 7, 0, 0, 0, 4, 0, 0,
+  0, 0, 0, 5, 0, 0, 0, 4, 0, 26,
+  14, 10, 0, 48, 14, 0, 0, 0, 0, 0,
+  37, 104, 0, 37, 0, 0, 9, 6, 3, 0,
+  0, 0, 33, 0, 50, 22, 0, 0, 24, 22,
+  0, 1, 0, 0, 27, 0, 0, 13, 0, 41,
+  14, 36, 0, 5, 48, 0, 45, 11, 72, 0,
+  0, 2, 0, 0, 0, 25, 0, 0, 41, 57,
+  0, 0, 0, 0, 0, 0, 0, 10, 1, 0,
+  35, 0, 0, 0, 51, 0, 55, 0, 5, 0,
+  0, 0, 0, 0, 28, 1, 16, 0, 30, 0,
+  17, 10, 31, 0, 0, 0, 35, 0, 0, 3,
+  12, 104, 13, 0, 18, 16, 0, 5, 51, 0,
+  33, 3, 0, 0, 0, 16, 0, 15, 0, 9,
+  0, 7, 0, 0, 0, 0, 0, 7, 0, 12,
+  0, 50, 13, 0, 0, 0, 0, 0, 32, 102,
+  0, 61, 0, 0, 22, 15, 0, 0, 0, 0,
+  29, 0, 32, 22, 10, 15, 12, 12, 0, 0,
+  0, 0, 42, 0, 0, 0, 0, 33, 26, 38,
+  0, 3, 31, 0, 30, 10, 63, 12, 0, 0,
+  0, 0, 0, 25, 23, 0, 69, 64, 0, 0,
+  2, 0, 4, 5, 0, 9, 49, 0, 33, 0,
+  0, 3, 60, 0, 68, 0, 0, 0, 8, 0,
+  0, 0, 49, 3, 11, 0, 0, 47, 23, 0,
+  8, 0, 33, 0, 55, 0, 0, 17, 28, 56,
+  45, 66, 49, 49, 0, 15, 78, 0, 0, 46,
+  13, 29, 27, 0, 0, 0, 14, 0, 11, 19,
+  4, 0, 0, 0, 0, 33, 12, 13, 0, 55,
+  6, 0, 0, 0, 0, 0, 63, 12, 64, 29,
+  0, 0, 0, 0, 0, 23, 0, 0, 0, 0,
+  0, 0, 42, 0, 0, 0, 0, 0, 0, 41,
+  36, 0, 0, 29, 0, 27, 65, 51, 36, 6,
+  50, 11, 55, 0, 58, 33, 0, 14, 0, 30,
+  0, 20, 0, 12, 43, 51, 0, 0, 0, 0,
+  0, 0, 5, 6, 14, 33, 30, 0, 0, 0,
+  41, 0, 0, 0, 5, 0, 0, 0, 81, 0,
+  6, 22, 17, 0, 0, 43, 70, 0, 11, 0,
+  9, 0, 57, 6, 0, 0, 0, 60, 23, 63,
+  30, 38, 0, 12, 39, 0, 33, 35, 0, 0,
+  9, 14, 0, 0, 27, 0, 0, 0, 0, 0,
+  0, 17, 0, 12, 27, 0, 0, 40, 0, 0,
+  0, 0, 0, 0, 48, 52, 41, 12, 0, 0,
+  19, 12, 0, 0, 0, 0, 0, 0, 24, 0,
+  45, 0, 11, 4, 0, 0, 0, 28, 32, 0,
+  0, 18, 0, 0, 58, 19, 0, 21, 59, 13,
+  23, 9, 64, 10, 0, 32, 0, 0, 0, 0,
+  0, 0, 40, 51, 0, 0, 0, 0, 36, 0,
+  0, 22, 4, 24, 40, 0, 0, 0, 86, 0,
+  2, 0, 26, 0, 0, 1, 21, 0, 0, 24,
+  22, 0, 0, 1, 54, 0, 0, 0, 0, 0,
+  42, 0, 0, 7, 0, 86, 0, 0, 1, 43,
+  0, 15, 50, 15, 93, 16, 0, 0, 0, 18,
+  0, 0, 16, 0, 0, 0, 0, 0, 0, 25,
+  0, 0, 34, 33, 0, 35, 0, 0, 0, 17,
+  0, 0, 34, 96, 0, 0, 21, 0, 40, 0,
+  14, 0, 0, 2, 21, 0, 100, 23, 1, 3,
+  2, 71, 0, 0, 0, 0, 18, 0, 0, 0,
+  0, 0, 25, 5, 0, 25, 63, 0, 32, 16,
+  62, 0, 0, 28, 0, 0, 0, 0, 0, 0,
+  67, 44, 0, 0, 0, 0, 26, 0, 0, 29,
+  0, 5, 41, 0, 0, 0, 99, 0, 45, 0,
+  46, 0, 0, 13, 0, 0, 0, 6, 19, 0,
+  0, 35, 50, 0, 10, 0, 0, 0, 51, 2,
+  0, 18, 8, 100, 10, 27, 39, 26, 2, 4,
+  44, 0, 34, 24, 0, 0, 0, 5, 0, 0,
+  0, 0, 0, 0, 0, 0, 5, 0, 0, 22,
+  18, 0, 0, 35, 0, 0, 0, 0, 0, 0,
+  52, 66, 0, 34, 0, 0, 6, 2, 0, 0,
+  0, 0, 13, 0, 38, 2, 22, 0, 23, 0,
+  0, 0, 3, 15, 29, 0, 0, 37, 0, 21,
+  32, 48, 11, 18, 40, 3, 53, 7, 75, 6,
+  0, 23, 0, 0, 0, 1, 0, 0, 40, 70,
+  1, 0, 0, 0, 7, 0, 0, 9, 0, 8,
+  32, 0, 0, 0, 57, 0, 10, 0, 12, 0,
+  0, 0, 8, 0, 9, 14, 37, 0, 22, 0,
+  59, 0, 0, 0, 0, 0, 23, 0, 0, 0,
+  0, 116, 1, 0, 6, 27, 1, 0, 38, 30,
+  84, 8, 0, 0, 0, 4, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 2, 0, 0, 28, 17,
+  0, 30, 0, 0, 0, 0, 0, 0, 35, 131,
+  0, 15, 36, 0, 30, 17, 14, 0, 0, 0,
+  34, 0, 88, 47, 7, 2, 16, 67, 0, 0,
+  0, 0, 11, 0, 0, 0, 0, 24, 16, 22,
+  0, 15, 41, 0, 31, 10, 71, 0, 0, 11,
+  2, 0, 0, 5, 0, 0, 62, 66, 0, 0,
+  0, 0, 12, 10, 0, 7, 0, 0, 50, 0,
+  0, 0, 91, 3, 77, 0, 19, 0, 0, 0,
+  0, 0, 21, 6, 10, 0, 20, 0, 19, 16,
+  0, 0, 0, 0, 29, 0, 0, 0, 2, 73,
+  0, 0, 0, 28, 8, 5, 49, 5, 52, 6,
+  0, 0, 0, 7, 0, 12, 6, 1, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 29, 0, 45,
+  0, 0, 0, 16, 0, 0, 39, 114, 0, 30,
+  15, 0, 35, 10, 0, 0, 0, 0, 31, 0,
+  77, 23, 0, 26, 0, 48, 0, 8, 0, 0,
+  25, 0, 0, 0, 0, 24, 31, 18, 0, 15,
+  42, 0, 28, 19, 61, 0, 0, 0, 0, 0,
+  0, 9, 24, 0, 72, 41, 0, 0, 3, 0,
+  0, 0, 0, 13, 37, 0, 43, 0, 0, 5,
+  84, 0, 93, 0, 17, 0, 7, 5, 0, 0,
+  42, 4, 0, 0, 24, 0, 53, 0, 32, 0,
+  0, 0, 25, 0, 0, 1, 9, 122, 15, 0,
+  27, 21, 0, 8, 41, 13, 69, 7, 0, 0,
+  0, 4, 0, 0, 0, 0, 0, 5, 0, 0,
+  0, 4, 0, 26, 14, 10, 0, 48, 14, 0,
+  0, 0, 0, 0, 37, 104, 0, 37, 0, 0,
+  9, 6, 3, 0, 0, 0, 33, 0, 50, 22,
+  0, 0, 24, 22, 0, 1, 0, 0, 27, 0,
+  0, 13, 0, 41, 14, 36, 0, 5, 48, 0,
+  45, 11, 72, 0, 0, 2, 0, 0, 0, 25,
+  0, 0, 41, 57, 0, 0, 0, 0, 0, 0,
+  0, 10, 1, 0, 35, 0, 0, 0, 51, 0,
+  55, 0, 5, 0, 0, 0, 0, 0, 28, 1,
+  16, 0, 30, 0, 17, 10, 31, 0, 0, 0,
+  35, 0, 0, 3, 12, 104, 13, 0, 18, 16,
+  0, 5, 51, 0, 33, 3, 0, 0, 0, 16,
+  0, 15, 0, 9, 0, 7, 0, 0, 0, 0,
+  0, 7, 0, 12, 0, 50, 13, 0, 0, 0,
+  0, 0, 32, 102, 0, 61, 0, 0, 22, 15,
+  0, 0, 0, 0, 29, 0, 32, 22, 10, 15,
+  12, 12, 0, 0, 0, 0, 42, 0, 0, 0,
+  0, 33, 26, 38, 0, 3, 31, 0, 30, 10,
+  63, 12, 0, 0, 0, 0, 0, 25, 23, 0,
+  69, 64, 0, 0, 2, 0, 4, 5, 0, 9,
+  49, 0, 33, 0, 0, 3, 60, 0, 68, 0,
+  0, 0, 8, 0, 0, 0, 49, 3, 11, 0,
+  0, 22, 0, 46, 29, 0, 0, 10, 69, 0,
+  0, 23, 38, 83, 24, 20, 35, 2, 0, 9,
+  58, 0, 0, 0, 4, 48, 0, 23, 0, 8,
+  10, 0, 0, 43, 1, 0, 0, 4, 0, 24,
+  0, 21, 0, 69, 0, 0, 10, 17, 0, 0,
+  39, 72, 4, 92, 0, 0, 6, 27, 0, 37,
+  0, 0, 0, 0, 0, 8, 23, 24, 37, 0,
+  0, 3, 0, 0, 58, 0, 0, 14, 0, 39,
+  58, 70, 0, 0, 36, 5, 31, 21, 43, 20,
+  8, 4, 0, 16, 0, 28, 38, 0, 72, 48,
+  0, 0, 6, 0, 2, 0, 0, 22, 64, 11,
+  22, 0, 0, 9, 42, 0, 28, 0, 0, 0,
+  25, 29, 79, 0, 79, 5, 10, 0, 0, 43,
+  70, 0, 11, 0, 9, 0, 57, 6, 0, 0,
+  0, 60, 23, 63, 30, 38, 0, 12, 39, 0,
+  33, 35, 0, 0, 9, 14, 0, 0, 27, 0,
+  0, 0, 0, 0, 0, 17, 0, 12, 27, 0,
+  0, 40, 0, 0, 0, 0, 0, 0, 48, 52,
+  41, 12, 0, 0, 19, 12, 0, 0, 0, 0,
+  0, 0, 24, 0, 45, 0, 11, 4, 0, 0,
+  0, 28, 32, 0, 0, 18, 0, 0, 58, 19,
+  0, 21, 59, 13, 23, 9, 64, 10, 0, 32,
+  0, 0, 0, 0, 0, 0, 40, 51, 0, 0,
+  0, 0, 36, 0, 0, 22, 4, 24, 40, 0,
+  0, 0, 86, 0, 2, 0, 26, 0, 0, 1,
+  21, 0, 0, 24, 22, 0, 0, 1, 54, 0,
+  0, 0, 0, 0, 42, 0, 0, 7, 0, 86,
+  0, 0, 1, 43, 0, 15, 50, 15, 93, 16,
+  0, 0, 0, 18, 0, 0, 16, 0, 0, 0,
+  0, 0, 0, 25, 0, 0, 34, 33, 0, 35,
+  0, 0, 0, 17, 0, 0, 34, 96, 0, 0,
+  21, 0, 40, 0, 14, 0, 0, 2, 21, 0,
+  100, 23, 1, 3, 2, 71, 0, 0, 0, 0,
+  18, 0, 0, 0, 0, 0, 25, 5, 0, 25,
+  63, 0, 32, 16, 62, 0, 0, 28, 0, 0,
+  0, 0, 0, 0, 67, 44, 0, 0, 0, 0,
+  26, 0, 0, 29, 0, 5, 41, 0, 0, 0,
+  99, 0, 45, 0, 46, 0, 0, 13, 0, 0,
+  0, 6, 19, 0, 16, 0, 16, 11, 0, 0,
+  0, 0, 35, 0, 0, 25, 4, 106, 0, 0,
+  0, 36, 2, 10, 68, 10, 49, 2, 0, 0,
+  0, 0, 0, 0, 0, 2, 0, 9, 0, 0,
+  0, 0, 0, 0, 5, 41, 0, 45, 0, 0,
+  0, 31, 0, 0, 66, 127, 0, 42, 14, 0,
+  16, 0, 2, 0, 0, 0, 48, 0, 110, 32,
+  0, 9, 0, 60, 0, 11, 0, 0, 22, 0,
+  0, 0, 0, 41, 18, 32, 0, 0, 51, 0,
+  58, 18, 81, 0, 0, 0, 0, 0, 0, 12,
+  11, 0, 73, 49, 0, 0, 0, 0, 6, 0,
+  0, 8, 11, 0, 36, 0, 0, 0, 95, 0,
+  70, 0, 20, 0, 1, 0, 0, 0, 8, 0,
+  11, 0, 22, 0, 59, 0, 0, 0, 0, 0,
+  23, 0, 0, 0, 0, 116, 1, 0, 6, 27,
+  1, 0, 38, 30, 84, 8, 0, 0, 0, 4,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
+  0, 0, 28, 17, 0, 30, 0, 0, 0, 0,
+  0, 0, 35, 131, 0, 15, 36, 0, 30, 17,
+  14, 0, 0, 0, 34, 0, 88, 47, 7, 2,
+  16, 67, 0, 0, 0, 0, 11, 0, 0, 0,
+  0, 24, 16, 22, 0, 15, 41, 0, 31, 10,
+  71, 0, 0, 11, 2, 0, 0, 5, 0, 0,
+  62, 66, 0, 0, 0, 0, 12, 10, 0, 7,
+  0, 0, 50, 0, 0, 0, 91, 3, 77, 0,
+  19, 0, 0, 0, 0, 0, 21, 6, 10, 0,
+  20, 0, 19, 16, 0, 0, 0, 0, 29, 0,
+  0, 0, 2, 73, 0, 0, 0, 28, 8, 5,
+  49, 5, 52, 6, 0, 0, 0, 7, 0, 12,
+  6, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 29, 0, 45, 0, 0, 0, 16, 0, 0,
+  39, 114, 0, 30, 15, 0, 35, 10, 0, 0,
+  0, 0, 31, 0, 77, 23, 0, 26, 0, 48,
+  0, 8, 0, 0, 25, 0, 0, 0, 0, 24,
+  31, 18, 0, 15, 42, 0, 28, 19, 61, 0,
+  0, 0, 0, 0, 0, 9, 24, 0, 72, 41,
+  0, 0, 3, 0, 0, 0, 0, 13, 37, 0,
+  43, 0, 0, 5, 84, 0, 93, 0, 17, 0,
+  7, 5, 0, 0, 42, 4, 0, 0, 3, 16,
+  0, 41, 1, 0, 4, 6, 70, 0, 0, 11,
+  25, 55, 18, 0, 14, 4, 17, 0, 52, 0,
+  0, 17, 0, 16, 4, 14, 0, 32, 2, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 25,
+  0, 53, 0, 0, 5, 16, 0, 0, 58, 87,
+  18, 68, 0, 0, 15, 25, 0, 19, 0, 0,
+  0, 0, 0, 11, 7, 13, 8, 0, 0, 9,
+  0, 0, 44, 3, 0, 0, 0, 43, 57, 57,
+  0, 0, 32, 0, 31, 33, 74, 29, 25, 0,
+  0, 0, 0, 11, 45, 0, 71, 48, 0, 0,
+  7, 0, 2, 0, 0, 12, 74, 6, 34, 0,
+  0, 0, 67, 0, 49, 0, 0, 0, 48, 9,
+  63, 0, 76, 0, 5, 0, 30, 0, 17, 10,
+  31, 0, 0, 0, 35, 0, 0, 3, 12, 104,
+  13, 0, 18, 16, 0, 5, 51, 0, 33, 3,
+  0, 0, 0, 16, 0, 15, 0, 9, 0, 7,
+  0, 0, 0, 0, 0, 7, 0, 12, 0, 50,
+  13, 0, 0, 0, 0, 0, 32, 102, 0, 61,
+  0, 0, 22, 15, 0, 0, 0, 0, 29, 0,
+  32, 22, 10, 15, 12, 12, 0, 0, 0, 0,
+  42, 0, 0, 0, 0, 33, 26, 38, 0, 3,
+  31, 0, 30, 10, 63, 12, 0, 0, 0, 0,
+  0, 25, 23, 0, 69, 64, 0, 0, 2, 0,
+  4, 5, 0, 9, 49, 0, 33, 0, 0, 3,
+  60, 0, 68, 0, 0, 0, 8, 0, 0, 0,
+  49, 3, 11, 0, 0, 22, 0, 46, 29, 0,
+  0, 10, 69, 0, 0, 23, 38, 83, 24, 20,
+  35, 2, 0, 9, 58, 0, 0, 0, 4, 48,
+  0, 23, 0, 8, 10, 0, 0, 43, 1, 0,
+  0, 4, 0, 24, 0, 21, 0, 69, 0, 0,
+  10, 17, 0, 0, 39, 72, 4, 92, 0, 0,
+  6, 27, 0, 37, 0, 0, 0, 0, 0, 8,
+  23, 24, 37, 0, 0, 3, 0, 0, 58, 0,
+  0, 14, 0, 39, 58, 70, 0, 0, 36, 5,
+  31, 21, 43, 20, 8, 4, 0, 16, 0, 28,
+  38, 0, 72, 48, 0, 0, 6, 0, 2, 0,
+  0, 22, 64, 11, 22, 0, 0, 9, 42, 0,
+  28, 0, 0, 0, 25, 29, 79, 0, 79, 5,
+  10, 0, 0, 19, 0, 49, 12, 0, 0, 25,
+  85, 2, 1, 7, 23, 85, 32, 34, 52, 0,
+  5, 0, 23, 0, 0, 0, 0, 25, 0, 34,
+  0, 0, 0, 0, 0, 25, 0, 0, 0, 0,
+  0, 23, 0, 6, 0, 46, 0, 0, 22, 18,
+  0, 0, 24, 75, 20, 83, 0, 0, 0, 46,
+  0, 19, 0, 0, 0, 0, 0, 30, 41, 0,
+  59, 0, 0, 0, 0, 12, 50, 0, 0, 9,
+  0, 32, 59, 63, 9, 0, 17, 31, 16, 61,
+  46, 0, 20, 36, 0, 0, 0, 9, 42, 0,
+  48, 63, 0, 0, 0, 0, 9, 0, 0, 19,
+  28, 6, 15, 0, 0, 0, 28, 0, 22, 0,
+  0, 0, 15, 1, 73, 0, 78, 3, 7, 0,
+  0, 1, 54, 0, 0, 0, 0, 0, 42, 0,
+  0, 7, 0, 86, 0, 0, 1, 43, 0, 15,
+  50, 15, 93, 16, 0, 0, 0, 18, 0, 0,
+  16, 0, 0, 0, 0, 0, 0, 25, 0, 0,
+  34, 33, 0, 35, 0, 0, 0, 17, 0, 0,
+  34, 96, 0, 0, 21, 0, 40, 0, 14, 0,
+  0, 2, 21, 0, 100, 23, 1, 3, 2, 71,
+  0, 0, 0, 0, 18, 0, 0, 0, 0, 0,
+  25, 5, 0, 25, 63, 0, 32, 16, 62, 0,
+  0, 28, 0, 0, 0, 0, 0, 0, 67, 44,
+  0, 0, 0, 0, 26, 0, 0, 29, 0, 5,
+  41, 0, 0, 0, 99, 0, 45, 0, 46, 0,
+  0, 13, 0, 0, 0, 6, 19, 0, 16, 0,
+  16, 11, 0, 0, 0, 0, 35, 0, 0, 25,
+  4, 106, 0, 0, 0, 36, 2, 10, 68, 10,
+  49, 2, 0, 0, 0, 0, 0, 0, 0, 2,
+  0, 9, 0, 0, 0, 0, 0, 0, 5, 41,
+  0, 45, 0, 0, 0, 31, 0, 0, 66, 127,
+  0, 42, 14, 0, 16, 0, 2, 0, 0, 0,
+  48, 0, 110, 32, 0, 9, 0, 60, 0, 11,
+  0, 0, 22, 0, 0, 0, 0, 41, 18, 32,
+  0, 0, 51, 0, 58, 18, 81, 0, 0, 0,
+  0, 0, 0, 12, 11, 0, 73, 49, 0, 0,
+  0, 0, 6, 0, 0, 8, 11, 0, 36, 0,
+  0, 0, 95, 0, 70, 0, 20, 0, 1, 0,
+  0, 0, 8, 0, 11, 0, 7, 17, 0, 25,
+  21, 11, 0, 0, 61, 0, 0, 19, 7, 87,
+  0, 0, 0, 20, 13, 16, 69, 0, 0, 19,
+  0, 0, 0, 0, 0, 18, 0, 0, 0, 6,
+  0, 0, 0, 0, 0, 0, 0, 18, 0, 55,
+  0, 0, 10, 38, 0, 0, 71, 103, 0, 69,
+  0, 0, 31, 9, 0, 0, 0, 0, 4, 0,
+  42, 20, 0, 14, 0, 7, 0, 2, 0, 0,
+  39, 0, 0, 0, 0, 43, 31, 45, 9, 0,
+  36, 0, 50, 45, 79, 24, 11, 1, 0, 0,
+  0, 13, 32, 0, 65, 65, 1, 23, 0, 0,
+  0, 0, 0, 13, 64, 0, 7, 0, 0, 0,
+  59, 0, 45, 0, 6, 0, 45, 0, 40, 0,
+  47, 0, 8, 0, 20, 0, 19, 16, 0, 0,
+  0, 0, 29, 0, 0, 0, 2, 73, 0, 0,
+  0, 28, 8, 5, 49, 5, 52, 6, 0, 0,
+  0, 7, 0, 12, 6, 1, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 29, 0, 45, 0, 0,
+  0, 16, 0, 0, 39, 114, 0, 30, 15, 0,
+  35, 10, 0, 0, 0, 0, 31, 0, 77, 23,
+  0, 26, 0, 48, 0, 8, 0, 0, 25, 0,
+  0, 0, 0, 24, 31, 18, 0, 15, 42, 0,
+  28, 19, 61, 0, 0, 0, 0, 0, 0, 9,
+  24, 0, 72, 41, 0, 0, 3, 0, 0, 0,
+  0, 13, 37, 0, 43, 0, 0, 5, 84, 0,
+  93, 0, 17, 0, 7, 5, 0, 0, 42, 4,
+  0, 0, 3, 16, 0, 41, 1, 0, 4, 6,
+  70, 0, 0, 11, 25, 55, 18, 0, 14, 4,
+  17, 0, 52, 0, 0, 17, 0, 16, 4, 14,
+  0, 32, 2, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 25, 0, 53, 0, 0, 5, 16,
+  0, 0, 58, 87, 18, 68, 0, 0, 15, 25,
+  0, 19, 0, 0, 0, 0, 0, 11, 7, 13,
+  8, 0, 0, 9, 0, 0, 44, 3, 0, 0,
+  0, 43, 57, 57, 0, 0, 32, 0, 31, 33,
+  74, 29, 25, 0, 0, 0, 0, 11, 45, 0,
+  71, 48, 0, 0, 7, 0, 2, 0, 0, 12,
+  74, 6, 34, 0, 0, 0, 67, 0, 49, 0,
+  0, 0, 48, 9, 63, 0, 76, 0, 5, 0,
+  0, 29, 0, 36, 17, 0, 0, 1, 82, 0,
+  0, 10, 14, 80, 41, 0, 22, 8, 10, 0,
+  47, 0, 0, 23, 0, 13, 0, 15, 0, 5,
+  0, 0, 0, 11, 0, 0, 0, 0, 0, 11,
+  0, 0, 0, 51, 0, 0, 23, 16, 0, 0,
+  35, 72, 21, 74, 0, 0, 3, 24, 0, 11,
+  0, 0, 0, 0, 0, 21, 29, 0, 30, 0,
+  0, 0, 0, 0, 58, 0, 0, 0, 0, 30,
+  56, 60, 4, 0, 25, 0, 29, 51, 61, 17,
+  7, 13, 0, 0, 0, 14, 29, 0, 67, 43,
+  0, 16, 0, 0, 10, 1, 0, 7, 54, 13,
+  18, 0, 0, 0, 34, 0, 15, 0, 0, 0,
+  35, 0, 63, 0, 64, 0, 8, 0, 0, 22,
+  0, 46, 29, 0, 0, 10, 69, 0, 0, 23,
+  38, 83, 24, 20, 35, 2, 0, 9, 58, 0,
+  0, 0, 4, 48, 0, 23, 0, 8, 10, 0,
+  0, 43, 1, 0, 0, 4, 0, 24, 0, 21,
+  0, 69, 0, 0, 10, 17, 0, 0, 39, 72,
+  4, 92, 0, 0, 6, 27, 0, 37, 0, 0,
+  0, 0, 0, 8, 23, 24, 37, 0, 0, 3,
+  0, 0, 58, 0, 0, 14, 0, 39, 58, 70,
+  0, 0, 36, 5, 31, 21, 43, 20, 8, 4,
+  0, 16, 0, 28, 38, 0, 72, 48, 0, 0,
+  6, 0, 2, 0, 0, 22, 64, 11, 22, 0,
+  0, 9, 42, 0, 28, 0, 0, 0, 25, 29,
+  79, 0, 79, 5, 10, 0, 0, 19, 0, 49,
+  12, 0, 0, 25, 85, 2, 1, 7, 23, 85,
+  32, 34, 52, 0, 5, 0, 23, 0, 0, 0,
+  0, 25, 0, 34, 0, 0, 0, 0, 0, 25,
+  0, 0, 0, 0, 0, 23, 0, 6, 0, 46,
+  0, 0, 22, 18, 0, 0, 24, 75, 20, 83,
+  0, 0, 0, 46, 0, 19, 0, 0, 0, 0,
+  0, 30, 41, 0, 59, 0, 0, 0, 0, 12,
+  50, 0, 0, 9, 0, 32, 59, 63, 9, 0,
+  17, 31, 16, 61, 46, 0, 20, 36, 0, 0,
+  0, 9, 42, 0, 48, 63, 0, 0, 0, 0,
+  9, 0, 0, 19, 28, 6, 15, 0, 0, 0,
+  28, 0, 22, 0, 0, 0, 15, 1, 73, 0,
+  78, 3, 7, 0, 0, 4, 2, 46, 13, 0,
+  0, 32, 107, 4, 2, 0, 4, 83, 44, 32,
+  46, 4, 0, 0, 3, 0, 0, 10, 0, 0,
+  0, 35, 0, 0, 0, 0, 0, 15, 0, 0,
+  0, 0, 0, 24, 0, 0, 0, 32, 0, 0,
+  49, 17, 0, 0, 0, 80, 25, 73, 0, 0,
+  0, 50, 0, 3, 0, 0, 0, 0, 0, 35,
+  49, 0, 61, 9, 0, 0, 3, 17, 57, 9,
+  0, 0, 0, 10, 48, 46, 9, 0, 7, 32,
+  17, 79, 43, 0, 37, 35, 0, 0, 0, 5,
+  31, 0, 49, 67, 11, 1, 0, 0, 15, 0,
+  0, 19, 8, 3, 5, 0, 0, 0, 19, 0,
+  26, 0, 0, 0, 5, 0, 65, 0, 62, 0,
+  2, 0, 16, 0, 16, 11, 0, 0, 0, 0,
+  35, 0, 0, 25, 4, 106, 0, 0, 0, 36,
+  2, 10, 68, 10, 49, 2, 0, 0, 0, 0,
+  0, 0, 0, 2, 0, 9, 0, 0, 0, 0,
+  0, 0, 5, 41, 0, 45, 0, 0, 0, 31,
+  0, 0, 66, 127, 0, 42, 14, 0, 16, 0,
+  2, 0, 0, 0, 48, 0, 110, 32, 0, 9,
+  0, 60, 0, 11, 0, 0, 22, 0, 0, 0,
+  0, 41, 18, 32, 0, 0, 51, 0, 58, 18,
+  81, 0, 0, 0, 0, 0, 0, 12, 11, 0,
+  73, 49, 0, 0, 0, 0, 6, 0, 0, 8,
+  11, 0, 36, 0, 0, 0, 95, 0, 70, 0,
+  20, 0, 1, 0, 0, 0, 8, 0, 11, 0,
+  7, 17, 0, 25, 21, 11, 0, 0, 61, 0,
+  0, 19, 7, 87, 0, 0, 0, 20, 13, 16,
+  69, 0, 0, 19, 0, 0, 0, 0, 0, 18,
+  0, 0, 0, 6, 0, 0, 0, 0, 0, 0,
+  0, 18, 0, 55, 0, 0, 10, 38, 0, 0,
+  71, 103, 0, 69, 0, 0, 31, 9, 0, 0,
+  0, 0, 4, 0, 42, 20, 0, 14, 0, 7,
+  0, 2, 0, 0, 39, 0, 0, 0, 0, 43,
+  31, 45, 9, 0, 36, 0, 50, 45, 79, 24,
+  11, 1, 0, 0, 0, 13, 32, 0, 65, 65,
+  1, 23, 0, 0, 0, 0, 0, 13, 64, 0,
+  7, 0, 0, 0, 59, 0, 45, 0, 6, 0,
+  45, 0, 40, 0, 47, 0, 8, 0, 0, 108,
+  0, 50, 20, 0, 23, 0, 76, 0, 5, 27,
+  31, 30, 12, 0, 0, 17, 12, 30, 55, 0,
+  0, 56, 13, 61, 39, 0, 0, 26, 15, 0,
+  27, 4, 0, 0, 0, 0, 0, 5, 0, 21,
+  0, 47, 11, 0, 10, 19, 0, 0, 54, 49,
+  57, 86, 0, 0, 20, 0, 0, 49, 9, 0,
+  0, 0, 0, 0, 32, 13, 0, 0, 0, 12,
+  0, 0, 51, 32, 0, 0, 0, 19, 65, 67,
+  24, 0, 19, 0, 39, 50, 52, 88, 74, 0,
+  0, 18, 0, 13, 42, 0, 60, 63, 11, 32,
+  0, 0, 0, 0, 14, 25, 123, 40, 2, 0,
+  0, 0, 13, 0, 5, 0, 0, 0, 42, 3,
+  144, 0, 86, 0, 0, 0, 3, 16, 0, 41,
+  1, 0, 4, 6, 70, 0, 0, 11, 25, 55,
+  18, 0, 14, 4, 17, 0, 52, 0, 0, 17,
+  0, 16, 4, 14, 0, 32, 2, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 25, 0, 53,
+  0, 0, 5, 16, 0, 0, 58, 87, 18, 68,
+  0, 0, 15, 25, 0, 19, 0, 0, 0, 0,
+  0, 11, 7, 13, 8, 0, 0, 9, 0, 0,
+  44, 3, 0, 0, 0, 43, 57, 57, 0, 0,
+  32, 0, 31, 33, 74, 29, 25, 0, 0, 0,
+  0, 11, 45, 0, 71, 48, 0, 0, 7, 0,
+  2, 0, 0, 12, 74, 6, 34, 0, 0, 0,
+  67, 0, 49, 0, 0, 0, 48, 9, 63, 0,
+  76, 0, 5, 0, 0, 29, 0, 36, 17, 0,
+  0, 1, 82, 0, 0, 10, 14, 80, 41, 0,
+  22, 8, 10, 0, 47, 0, 0, 23, 0, 13,
+  0, 15, 0, 5, 0, 0, 0, 11, 0, 0,
+  0, 0, 0, 11, 0, 0, 0, 51, 0, 0,
+  23, 16, 0, 0, 35, 72, 21, 74, 0, 0,
+  3, 24, 0, 11, 0, 0, 0, 0, 0, 21,
+  29, 0, 30, 0, 0, 0, 0, 0, 58, 0,
+  0, 0, 0, 30, 56, 60, 4, 0, 25, 0,
+  29, 51, 61, 17, 7, 13, 0, 0, 0, 14,
+  29, 0, 67, 43, 0, 16, 0, 0, 10, 1,
+  0, 7, 54, 13, 18, 0, 0, 0, 34, 0,
+  15, 0, 0, 0, 35, 0, 63, 0, 64, 0,
+  8, 0, 0, 64, 0, 40, 20, 0, 10, 0,
+  63, 0, 7, 15, 12, 65, 48, 6, 31, 34,
+  0, 25, 58, 0, 0, 21, 0, 36, 3, 4,
+  0, 0, 0, 0, 0, 32, 0, 0, 0, 0,
+  0, 11, 0, 0, 0, 41, 0, 0, 21, 22,
+  0, 0, 26, 26, 28, 76, 0, 0, 10, 4,
+  0, 25, 19, 0, 0, 0, 0, 11, 55, 3,
+  50, 0, 0, 0, 0, 0, 62, 0, 0, 0,
+  0, 3, 57, 69, 4, 0, 25, 19, 41, 29,
+  30, 12, 0, 34, 0, 1, 0, 24, 19, 0,
+  63, 30, 0, 19, 0, 0, 12, 0, 3, 1,
+  34, 21, 0, 0, 0, 0, 15, 0, 0, 0,
+  0, 0, 0, 13, 75, 0, 41, 0, 17, 0,
+  0, 19, 0, 49, 12, 0, 0, 25, 85, 2,
+  1, 7, 23, 85, 32, 34, 52, 0, 5, 0,
+  23, 0, 0, 0, 0, 25, 0, 34, 0, 0,
+  0, 0, 0, 25, 0, 0, 0, 0, 0, 23,
+  0, 6, 0, 46, 0, 0, 22, 18, 0, 0,
+  24, 75, 20, 83, 0, 0, 0, 46, 0, 19,
+  0, 0, 0, 0, 0, 30, 41, 0, 59, 0,
+  0, 0, 0, 12, 50, 0, 0, 9, 0, 32,
+  59, 63, 9, 0, 17, 31, 16, 61, 46, 0,
+  20, 36, 0, 0, 0, 9, 42, 0, 48, 63,
+  0, 0, 0, 0, 9, 0, 0, 19, 28, 6,
+  15, 0, 0, 0, 28, 0, 22, 0, 0, 0,
+  15, 1, 73, 0, 78, 3, 7, 0, 0, 4,
+  2, 46, 13, 0, 0, 32, 107, 4, 2, 0,
+  4, 83, 44, 32, 46, 4, 0, 0, 3, 0,
+  0, 10, 0, 0, 0, 35, 0, 0, 0, 0,
+  0, 15, 0, 0, 0, 0, 0, 24, 0, 0,
+  0, 32, 0, 0, 49, 17, 0, 0, 0, 80,
+  25, 73, 0, 0, 0, 50, 0, 3, 0, 0,
+  0, 0, 0, 35, 49, 0, 61, 9, 0, 0,
+  3, 17, 57, 9, 0, 0, 0, 10, 48, 46,
+  9, 0, 7, 32, 17, 79, 43, 0, 37, 35,
+  0, 0, 0, 5, 31, 0, 49, 67, 11, 1,
+  0, 0, 15, 0, 0, 19, 8, 3, 5, 0,
+  0, 0, 19, 0, 26, 0, 0, 0, 5, 0,
+  65, 0, 62, 0, 2, 0, 0, 37, 0, 44,
+  22, 0, 8, 20, 82, 0, 25, 11, 12, 56,
+  55, 36, 59, 22, 0, 12, 31, 0, 0, 0,
+  1, 27, 0, 18, 0, 0, 0, 0, 0, 37,
+  0, 0, 0, 0, 0, 14, 0, 0, 0, 28,
+  0, 0, 38, 1, 0, 0, 0, 23, 0, 87,
+  0, 0, 4, 32, 0, 38, 0, 0, 0, 0,
+  0, 27, 62, 7, 79, 0, 0, 0, 0, 8,
+  73, 0, 0, 19, 6, 1, 28, 74, 0, 0,
+  22, 50, 31, 43, 10, 0, 10, 37, 0, 20,
+  0, 33, 31, 10, 59, 36, 0, 0, 0, 0,
+  17, 0, 0, 13, 9, 1, 0, 0, 0, 0,
+  9, 0, 0, 0, 0, 0, 0, 23, 74, 0,
+  31, 0, 36, 0, 7, 17, 0, 25, 21, 11,
+  0, 0, 61, 0, 0, 19, 7, 87, 0, 0,
+  0, 20, 13, 16, 69, 0, 0, 19, 0, 0,
+  0, 0, 0, 18, 0, 0, 0, 6, 0, 0,
+  0, 0, 0, 0, 0, 18, 0, 55, 0, 0,
+  10, 38, 0, 0, 71, 103, 0, 69, 0, 0,
+  31, 9, 0, 0, 0, 0, 4, 0, 42, 20,
+  0, 14, 0, 7, 0, 2, 0, 0, 39, 0,
+  0, 0, 0, 43, 31, 45, 9, 0, 36, 0,
+  50, 45, 79, 24, 11, 1, 0, 0, 0, 13,
+  32, 0, 65, 65, 1, 23, 0, 0, 0, 0,
+  0, 13, 64, 0, 7, 0, 0, 0, 59, 0,
+  45, 0, 6, 0, 45, 0, 40, 0, 47, 0,
+  8, 0, 0, 108, 0, 50, 20, 0, 23, 0,
+  76, 0, 5, 27, 31, 30, 12, 0, 0, 17,
+  12, 30, 55, 0, 0, 56, 13, 61, 39, 0,
+  0, 26, 15, 0, 27, 4, 0, 0, 0, 0,
+  0, 5, 0, 21, 0, 47, 11, 0, 10, 19,
+  0, 0, 54, 49, 57, 86, 0, 0, 20, 0,
+  0, 49, 9, 0, 0, 0, 0, 0, 32, 13,
+  0, 0, 0, 12, 0, 0, 51, 32, 0, 0,
+  0, 19, 65, 67, 24, 0, 19, 0, 39, 50,
+  52, 88, 74, 0, 0, 18, 0, 13, 42, 0,
+  60, 63, 11, 32, 0, 0, 0, 0, 14, 25,
+  123, 40, 2, 0, 0, 0, 13, 0, 5, 0,
+  0, 0, 42, 3, 144, 0, 86, 0, 0, 0,
+  0, 155, 0, 57, 4, 0, 35, 0, 65, 0,
+  13, 22, 77, 0, 0, 0, 0, 12, 22, 43,
+  12, 0, 0, 61, 29, 33, 73, 13, 3, 0,
+  36, 0, 52, 0, 38, 0, 0, 0, 0, 0,
+  0, 22, 0, 53, 11, 0, 16, 0, 0, 0,
+  43, 52, 47, 51, 11, 17, 36, 0, 0, 49,
+  1, 0, 0, 0, 0, 0, 2, 16, 0, 0,
+  11, 34, 0, 0, 39, 55, 0, 69, 4, 0,
+  37, 56, 49, 10, 11, 0, 0, 58, 72, 93,
+  137, 0, 0, 11, 0, 0, 57, 0, 44, 81,
+  42, 39, 0, 0, 0, 0, 27, 70, 152, 18,
+  4, 0, 17, 10, 0, 0, 0, 0, 0, 0,
+  3, 0, 133, 2, 119, 5, 0, 0, 0, 29,
+  0, 36, 17, 0, 0, 1, 82, 0, 0, 10,
+  14, 80, 41, 0, 22, 8, 10, 0, 47, 0,
+  0, 23, 0, 13, 0, 15, 0, 5, 0, 0,
+  0, 11, 0, 0, 0, 0, 0, 11, 0, 0,
+  0, 51, 0, 0, 23, 16, 0, 0, 35, 72,
+  21, 74, 0, 0, 3, 24, 0, 11, 0, 0,
+  0, 0, 0, 21, 29, 0, 30, 0, 0, 0,
+  0, 0, 58, 0, 0, 0, 0, 30, 56, 60,
+  4, 0, 25, 0, 29, 51, 61, 17, 7, 13,
+  0, 0, 0, 14, 29, 0, 67, 43, 0, 16,
+  0, 0, 10, 1, 0, 7, 54, 13, 18, 0,
+  0, 0, 34, 0, 15, 0, 0, 0, 35, 0,
+  63, 0, 64, 0, 8, 0, 0, 64, 0, 40,
+  20, 0, 10, 0, 63, 0, 7, 15, 12, 65,
+  48, 6, 31, 34, 0, 25, 58, 0, 0, 21,
+  0, 36, 3, 4, 0, 0, 0, 0, 0, 32,
+  0, 0, 0, 0, 0, 11, 0, 0, 0, 41,
+  0, 0, 21, 22, 0, 0, 26, 26, 28, 76,
+  0, 0, 10, 4, 0, 25, 19, 0, 0, 0,
+  0, 11, 55, 3, 50, 0, 0, 0, 0, 0,
+  62, 0, 0, 0, 0, 3, 57, 69, 4, 0,
+  25, 19, 41, 29, 30, 12, 0, 34, 0, 1,
+  0, 24, 19, 0, 63, 30, 0, 19, 0, 0,
+  12, 0, 3, 1, 34, 21, 0, 0, 0, 0,
+  15, 0, 0, 0, 0, 0, 0, 13, 75, 0,
+  41, 0, 17, 0, 0, 151, 1, 57, 8, 0,
+  17, 0, 42, 0, 26, 0, 19, 37, 38, 18,
+  29, 7, 6, 53, 10, 0, 0, 24, 1, 37,
+  15, 7, 0, 0, 0, 0, 46, 5, 0, 0,
+  0, 0, 0, 1, 0, 2, 0, 21, 0, 0,
+  21, 42, 0, 0, 40, 0, 12, 89, 0, 0,
+  18, 1, 0, 44, 24, 0, 0, 0, 0, 0,
+  73, 21, 53, 0, 0, 0, 0, 8, 68, 12,
+  0, 35, 0, 18, 49, 62, 21, 11, 30, 33,
+  16, 49, 19, 13, 53, 22, 0, 17, 0, 5,
+  44, 0, 24, 80, 3, 46, 0, 0, 12, 0,
+  22, 12, 52, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 89, 0, 51, 0,
+  16, 1, 0, 4, 2, 46, 13, 0, 0, 32,
+  107, 4, 2, 0, 4, 83, 44, 32, 46, 4,
+  0, 0, 3, 0, 0, 10, 0, 0, 0, 35,
+  0, 0, 0, 0, 0, 15, 0, 0, 0, 0,
+  0, 24, 0, 0, 0, 32, 0, 0, 49, 17,
+  0, 0, 0, 80, 25, 73, 0, 0, 0, 50,
+  0, 3, 0, 0, 0, 0, 0, 35, 49, 0,
+  61, 9, 0, 0, 3, 17, 57, 9, 0, 0,
+  0, 10, 48, 46, 9, 0, 7, 32, 17, 79,
+  43, 0, 37, 35, 0, 0, 0, 5, 31, 0,
+  49, 67, 11, 1, 0, 0, 15, 0, 0, 19,
+  8, 3, 5, 0, 0, 0, 19, 0, 26, 0,
+  0, 0, 5, 0, 65, 0, 62, 0, 2, 0,
+  0, 37, 0, 44, 22, 0, 8, 20, 82, 0,
+  25, 11, 12, 56, 55, 36, 59, 22, 0, 12,
+  31, 0, 0, 0, 1, 27, 0, 18, 0, 0,
+  0, 0, 0, 37, 0, 0, 0, 0, 0, 14,
+  0, 0, 0, 28, 0, 0, 38, 1, 0, 0,
+  0, 23, 0, 87, 0, 0, 4, 32, 0, 38,
+  0, 0, 0, 0, 0, 27, 62, 7, 79, 0,
+  0, 0, 0, 8, 73, 0, 0, 19, 6, 1,
+  28, 74, 0, 0, 22, 50, 31, 43, 10, 0,
+  10, 37, 0, 20, 0, 33, 31, 10, 59, 36,
+  0, 0, 0, 0, 17, 0, 0, 13, 9, 1,
+  0, 0, 0, 0, 9, 0, 0, 0, 0, 0,
+  0, 23, 74, 0, 31, 0, 36, 0, 0, 74,
+  18, 48, 36, 0, 9, 0, 60, 0, 36, 0,
+  0, 63, 66, 33, 53, 1, 1, 40, 5, 0,
+  0, 0, 0, 29, 0, 0, 0, 0, 0, 0,
+  0, 33, 0, 0, 0, 0, 0, 13, 0, 0,
+  0, 7, 0, 0, 40, 19, 0, 0, 0, 0,
+  0, 107, 0, 0, 12, 52, 0, 31, 0, 27,
+  0, 0, 0, 19, 66, 8, 85, 0, 0, 0,
+  0, 0, 65, 0, 0, 12, 15, 13, 23, 55,
+  0, 0, 38, 70, 22, 57, 6, 0, 10, 41,
+  0, 20, 0, 27, 34, 9, 25, 65, 0, 0,
+  0, 0, 11, 0, 0, 0, 15, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  46, 0, 22, 0, 42, 0, 0, 108, 0, 50,
+  20, 0, 23, 0, 76, 0, 5, 27, 31, 30,
+  12, 0, 0, 17, 12, 30, 55, 0, 0, 56,
+  13, 61, 39, 0, 0, 26, 15, 0, 27, 4,
+  0, 0, 0, 0, 0, 5, 0, 21, 0, 47,
+  11, 0, 10, 19, 0, 0, 54, 49, 57, 86,
+  0, 0, 20, 0, 0, 49, 9, 0, 0, 0,
+  0, 0, 32, 13, 0, 0, 0, 12, 0, 0,
+  51, 32, 0, 0, 0, 19, 65, 67, 24, 0,
+  19, 0, 39, 50, 52, 88, 74, 0, 0, 18,
+  0, 13, 42, 0, 60, 63, 11, 32, 0, 0,
+  0, 0, 14, 25, 123, 40, 2, 0, 0, 0,
+  13, 0, 5, 0, 0, 0, 42, 3, 144, 0,
+  86, 0, 0, 0, 0, 155, 0, 57, 4, 0,
+  35, 0, 65, 0, 13, 22, 77, 0, 0, 0,
+  0, 12, 22, 43, 12, 0, 0, 61, 29, 33,
+  73, 13, 3, 0, 36, 0, 52, 0, 38, 0,
+  0, 0, 0, 0, 0, 22, 0, 53, 11, 0,
+  16, 0, 0, 0, 43, 52, 47, 51, 11, 17,
+  36, 0, 0, 49, 1, 0, 0, 0, 0, 0,
+  2, 16, 0, 0, 11, 34, 0, 0, 39, 55,
+  0, 69, 4, 0, 37, 56, 49, 10, 11, 0,
+  0, 58, 72, 93, 137, 0, 0, 11, 0, 0,
+  57, 0, 44, 81, 42, 39, 0, 0, 0, 0,
+  27, 70, 152, 18, 4, 0, 17, 10, 0, 0,
+  0, 0, 0, 0, 3, 0, 133, 2, 119, 5,
+  0, 0, 21, 77, 0, 54, 0, 57, 1, 0,
+  24, 0, 0, 9, 43, 0, 0, 0, 0, 20,
+  47, 27, 0, 27, 1, 0, 0, 0, 69, 0,
+  0, 0, 4, 19, 15, 0, 32, 49, 0, 0,
+  3, 0, 0, 7, 0, 34, 8, 10, 16, 0,
+  0, 0, 3, 45, 0, 0, 93, 35, 51, 0,
+  0, 0, 0, 53, 20, 0, 103, 0, 0, 43,
+  0, 68, 175, 29, 22, 0, 0, 35, 0, 61,
+  4, 6, 0, 0, 64, 5, 21, 0, 0, 19,
+  51, 0, 81, 0, 0, 0, 7, 0, 55, 0,
+  12, 95, 28, 106, 1, 0, 0, 0, 4, 67,
+  71, 0, 2, 16, 0, 39, 0, 0, 0, 0,
+  25, 0, 0, 0, 0, 18, 65, 17, 0, 0,
+  0, 64, 0, 40, 20, 0, 10, 0, 63, 0,
+  7, 15, 12, 65, 48, 6, 31, 34, 0, 25,
+  58, 0, 0, 21, 0, 36, 3, 4, 0, 0,
+  0, 0, 0, 32, 0, 0, 0, 0, 0, 11,
+  0, 0, 0, 41, 0, 0, 21, 22, 0, 0,
+  26, 26, 28, 76, 0, 0, 10, 4, 0, 25,
+  19, 0, 0, 0, 0, 11, 55, 3, 50, 0,
+  0, 0, 0, 0, 62, 0, 0, 0, 0, 3,
+  57, 69, 4, 0, 25, 19, 41, 29, 30, 12,
+  0, 34, 0, 1, 0, 24, 19, 0, 63, 30,
+  0, 19, 0, 0, 12, 0, 3, 1, 34, 21,
+  0, 0, 0, 0, 15, 0, 0, 0, 0, 0,
+  0, 13, 75, 0, 41, 0, 17, 0, 0, 151,
+  1, 57, 8, 0, 17, 0, 42, 0, 26, 0,
+  19, 37, 38, 18, 29, 7, 6, 53, 10, 0,
+  0, 24, 1, 37, 15, 7, 0, 0, 0, 0,
+  46, 5, 0, 0, 0, 0, 0, 1, 0, 2,
+  0, 21, 0, 0, 21, 42, 0, 0, 40, 0,
+  12, 89, 0, 0, 18, 1, 0, 44, 24, 0,
+  0, 0, 0, 0, 73, 21, 53, 0, 0, 0,
+  0, 8, 68, 12, 0, 35, 0, 18, 49, 62,
+  21, 11, 30, 33, 16, 49, 19, 13, 53, 22,
+  0, 17, 0, 5, 44, 0, 24, 80, 3, 46,
+  0, 0, 12, 0, 22, 12, 52, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  89, 0, 51, 0, 16, 1, 6, 145, 0, 66,
+  0, 25, 0, 0, 52, 0, 6, 0, 69, 0,
+  0, 0, 0, 5, 33, 32, 0, 0, 14, 32,
+  3, 0, 70, 0, 0, 0, 0, 0, 77, 0,
+  13, 38, 0, 0, 0, 0, 0, 17, 0, 19,
+  0, 15, 48, 19, 0, 17, 5, 25, 0, 35,
+  17, 0, 54, 0, 0, 16, 0, 0, 0, 0,
+  16, 0, 16, 19, 0, 1, 65, 17, 3, 0,
+  34, 29, 0, 94, 0, 16, 0, 0, 90, 39,
+  0, 18, 0, 41, 51, 18, 99, 0, 0, 0,
+  0, 0, 61, 0, 18, 99, 42, 59, 0, 0,
+  0, 10, 57, 44, 87, 0, 0, 0, 0, 36,
+  0, 0, 0, 0, 5, 0, 3, 0, 48, 0,
+  39, 0, 0, 46, 0, 37, 0, 44, 22, 0,
+  8, 20, 82, 0, 25, 11, 12, 56, 55, 36,
+  59, 22, 0, 12, 31, 0, 0, 0, 1, 27,
+  0, 18, 0, 0, 0, 0, 0, 37, 0, 0,
+  0, 0, 0, 14, 0, 0, 0, 28, 0, 0,
+  38, 1, 0, 0, 0, 23, 0, 87, 0, 0,
+  4, 32, 0, 38, 0, 0, 0, 0, 0, 27,
+  62, 7, 79, 0, 0, 0, 0, 8, 73, 0,
+  0, 19, 6, 1, 28, 74, 0, 0, 22, 50,
+  31, 43, 10, 0, 10, 37, 0, 20, 0, 33,
+  31, 10, 59, 36, 0, 0, 0, 0, 17, 0,
+  0, 13, 9, 1, 0, 0, 0, 0, 9, 0,
+  0, 0, 0, 0, 0, 23, 74, 0, 31, 0,
+  36, 0, 0, 74, 18, 48, 36, 0, 9, 0,
+  60, 0, 36, 0, 0, 63, 66, 33, 53, 1,
+  1, 40, 5, 0, 0, 0, 0, 29, 0, 0,
+  0, 0, 0, 0, 0, 33, 0, 0, 0, 0,
+  0, 13, 0, 0, 0, 7, 0, 0, 40, 19,
+  0, 0, 0, 0, 0, 107, 0, 0, 12, 52,
+  0, 31, 0, 27, 0, 0, 0, 19, 66, 8,
+  85, 0, 0, 0, 0, 0, 65, 0, 0, 12,
+  15, 13, 23, 55, 0, 0, 38, 70, 22, 57,
+  6, 0, 10, 41, 0, 20, 0, 27, 34, 9,
+  25, 65, 0, 0, 0, 0, 11, 0, 0, 0,
+  15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 46, 0, 22, 0, 42, 0,
+  0, 120, 19, 74, 27, 0, 31, 0, 61, 0,
+  8, 0, 21, 27, 26, 43, 32, 22, 11, 48,
+  0, 0, 11, 13, 20, 2, 39, 1, 0, 0,
+  0, 0, 45, 5, 15, 2, 0, 0, 0, 0,
+  0, 0, 0, 21, 0, 27, 87, 36, 0, 0,
+  16, 0, 0, 39, 0, 0, 30, 0, 0, 50,
+  0, 22, 0, 0, 0, 0, 32, 15, 38, 0,
+  0, 0, 27, 0, 82, 16, 0, 44, 0, 0,
+  23, 10, 32, 10, 15, 51, 24, 38, 8, 39,
+  22, 24, 0, 47, 0, 0, 15, 0, 42, 41,
+  18, 5, 0, 0, 5, 0, 39, 13, 35, 22,
+  0, 0, 0, 45, 0, 0, 0, 0, 9, 0,
+  0, 0, 49, 0, 6, 0, 21, 9, 0, 155,
+  0, 57, 4, 0, 35, 0, 65, 0, 13, 22,
+  77, 0, 0, 0, 0, 12, 22, 43, 12, 0,
+  0, 61, 29, 33, 73, 13, 3, 0, 36, 0,
+  52, 0, 38, 0, 0, 0, 0, 0, 0, 22,
+  0, 53, 11, 0, 16, 0, 0, 0, 43, 52,
+  47, 51, 11, 17, 36, 0, 0, 49, 1, 0,
+  0, 0, 0, 0, 2, 16, 0, 0, 11, 34,
+  0, 0, 39, 55, 0, 69, 4, 0, 37, 56,
+  49, 10, 11, 0, 0, 58, 72, 93, 137, 0,
+  0, 11, 0, 0, 57, 0, 44, 81, 42, 39,
+  0, 0, 0, 0, 27, 70, 152, 18, 4, 0,
+  17, 10, 0, 0, 0, 0, 0, 0, 3, 0,
+  133, 2, 119, 5, 0, 0, 21, 77, 0, 54,
+  0, 57, 1, 0, 24, 0, 0, 9, 43, 0,
+  0, 0, 0, 20, 47, 27, 0, 27, 1, 0,
+  0, 0, 69, 0, 0, 0, 4, 19, 15, 0,
+  32, 49, 0, 0, 3, 0, 0, 7, 0, 34,
+  8, 10, 16, 0, 0, 0, 3, 45, 0, 0,
+  93, 35, 51, 0, 0, 0, 0, 53, 20, 0,
+  103, 0, 0, 43, 0, 68, 175, 29, 22, 0,
+  0, 35, 0, 61, 4, 6, 0, 0, 64, 5,
+  21, 0, 0, 19, 51, 0, 81, 0, 0, 0,
+  7, 0, 55, 0, 12, 95, 28, 106, 1, 0,
+  0, 0, 4, 67, 71, 0, 2, 16, 0, 39,
+  0, 0, 0, 0, 25, 0, 0, 0, 0, 18,
+  65, 17, 0, 0, 0, 0, 0, 25, 0, 135,
+  0, 7, 42, 0, 0, 4, 0, 6, 0, 0,
+  0, 25, 13, 0, 41, 106, 15, 0, 0, 0,
+  0, 1, 0, 0, 0, 1, 9, 0, 0, 82,
+  0, 40, 0, 0, 45, 0, 0, 46, 0, 80,
+  0, 4, 0, 0, 0, 52, 0, 0, 133, 36,
+  44, 0, 57, 0, 0, 92, 42, 0, 155, 0,
+  0, 30, 0, 77, 196, 0, 59, 34, 0, 31,
+  0, 16, 9, 0, 0, 0, 35, 0, 0, 0,
+  1, 0, 11, 0, 0, 92, 0, 0, 27, 0,
+  0, 0, 7, 76, 78, 108, 0, 0, 0, 0,
+  0, 30, 0, 0, 0, 38, 0, 95, 0, 0,
+  0, 0, 52, 0, 0, 0, 0, 0, 21, 0,
+  0, 6, 0, 151, 1, 57, 8, 0, 17, 0,
+  42, 0, 26, 0, 19, 37, 38, 18, 29, 7,
+  6, 53, 10, 0, 0, 24, 1, 37, 15, 7,
+  0, 0, 0, 0, 46, 5, 0, 0, 0, 0,
+  0, 1, 0, 2, 0, 21, 0, 0, 21, 42,
+  0, 0, 40, 0, 12, 89, 0, 0, 18, 1,
+  0, 44, 24, 0, 0, 0, 0, 0, 73, 21,
+  53, 0, 0, 0, 0, 8, 68, 12, 0, 35,
+  0, 18, 49, 62, 21, 11, 30, 33, 16, 49,
+  19, 13, 53, 22, 0, 17, 0, 5, 44, 0,
+  24, 80, 3, 46, 0, 0, 12, 0, 22, 12,
+  52, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 89, 0, 51, 0, 16, 1,
+  6, 145, 0, 66, 0, 25, 0, 0, 52, 0,
+  6, 0, 69, 0, 0, 0, 0, 5, 33, 32,
+  0, 0, 14, 32, 3, 0, 70, 0, 0, 0,
+  0, 0, 77, 0, 13, 38, 0, 0, 0, 0,
+  0, 17, 0, 19, 0, 15, 48, 19, 0, 17,
+  5, 25, 0, 35, 17, 0, 54, 0, 0, 16,
+  0, 0, 0, 0, 16, 0, 16, 19, 0, 1,
+  65, 17, 3, 0, 34, 29, 0, 94, 0, 16,
+  0, 0, 90, 39, 0, 18, 0, 41, 51, 18,
+  99, 0, 0, 0, 0, 0, 61, 0, 18, 99,
+  42, 59, 0, 0, 0, 10, 57, 44, 87, 0,
+  0, 0, 0, 36, 0, 0, 0, 0, 5, 0,
+  3, 0, 48, 0, 39, 0, 0, 46, 58, 21,
+  0, 68, 2, 105, 0, 4, 38, 0, 0, 0,
+  40, 0, 0, 0, 2, 21, 35, 0, 0, 90,
+  13, 0, 0, 0, 31, 0, 9, 0, 0, 31,
+  3, 0, 67, 72, 9, 0, 27, 0, 20, 14,
+  0, 28, 22, 53, 41, 0, 0, 0, 0, 61,
+  0, 0, 135, 38, 37, 0, 7, 0, 0, 47,
+  34, 0, 96, 0, 0, 31, 0, 47, 198, 6,
+  55, 0, 0, 0, 0, 35, 0, 0, 0, 0,
+  77, 27, 31, 0, 1, 1, 38, 0, 0, 15,
+  0, 0, 17, 0, 39, 0, 26, 71, 33, 77,
+  0, 0, 0, 0, 6, 46, 5, 0, 19, 40,
+  0, 88, 0, 0, 0, 0, 55, 0, 0, 0,
+  0, 0, 28, 0, 0, 16, 0, 74, 18, 48,
+  36, 0, 9, 0, 60, 0, 36, 0, 0, 63,
+  66, 33, 53, 1, 1, 40, 5, 0, 0, 0,
+  0, 29, 0, 0, 0, 0, 0, 0, 0, 33,
+  0, 0, 0, 0, 0, 13, 0, 0, 0, 7,
+  0, 0, 40, 19, 0, 0, 0, 0, 0, 107,
+  0, 0, 12, 52, 0, 31, 0, 27, 0, 0,
+  0, 19, 66, 8, 85, 0, 0, 0, 0, 0,
+  65, 0, 0, 12, 15, 13, 23, 55, 0, 0,
+  38, 70, 22, 57, 6, 0, 10, 41, 0, 20,
+  0, 27, 34, 9, 25, 65, 0, 0, 0, 0,
+  11, 0, 0, 0, 15, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 46, 0,
+  22, 0, 42, 0, 0, 120, 19, 74, 27, 0,
+  31, 0, 61, 0, 8, 0, 21, 27, 26, 43,
+  32, 22, 11, 48, 0, 0, 11, 13, 20, 2,
+  39, 1, 0, 0, 0, 0, 45, 5, 15, 2,
+  0, 0, 0, 0, 0, 0, 0, 21, 0, 27,
+  87, 36, 0, 0, 16, 0, 0, 39, 0, 0,
+  30, 0, 0, 50, 0, 22, 0, 0, 0, 0,
+  32, 15, 38, 0, 0, 0, 27, 0, 82, 16,
+  0, 44, 0, 0, 23, 10, 32, 10, 15, 51,
+  24, 38, 8, 39, 22, 24, 0, 47, 0, 0,
+  15, 0, 42, 41, 18, 5, 0, 0, 5, 0,
+  39, 13, 35, 22, 0, 0, 0, 45, 0, 0,
+  0, 0, 9, 0, 0, 0, 49, 0, 6, 0,
+  21, 9, 64, 56, 7, 47, 47, 23, 0, 2,
+  27, 0, 0, 0, 42, 8, 0, 3, 0, 0,
+  56, 18, 0, 16, 26, 0, 2, 0, 57, 0,
+  1, 54, 0, 27, 23, 0, 74, 44, 54, 0,
+  12, 0, 0, 9, 0, 16, 14, 30, 64, 22,
+  0, 0, 0, 0, 0, 18, 39, 0, 31, 0,
+  0, 0, 0, 41, 29, 0, 11, 5, 0, 39,
+  0, 10, 75, 0, 74, 0, 24, 4, 0, 36,
+  30, 0, 0, 0, 49, 39, 40, 0, 0, 51,
+  36, 6, 0, 6, 0, 16, 0, 0, 38, 0,
+  41, 42, 30, 45, 15, 0, 0, 0, 5, 61,
+  41, 0, 5, 11, 0, 65, 38, 0, 0, 0,
+  29, 0, 0, 0, 0, 0, 0, 0, 8, 29,
+  21, 77, 0, 54, 0, 57, 1, 0, 24, 0,
+  0, 9, 43, 0, 0, 0, 0, 20, 47, 27,
+  0, 27, 1, 0, 0, 0, 69, 0, 0, 0,
+  4, 19, 15, 0, 32, 49, 0, 0, 3, 0,
+  0, 7, 0, 34, 8, 10, 16, 0, 0, 0,
+  3, 45, 0, 0, 93, 35, 51, 0, 0, 0,
+  0, 53, 20, 0, 103, 0, 0, 43, 0, 68,
+  175, 29, 22, 0, 0, 35, 0, 61, 4, 6,
+  0, 0, 64, 5, 21, 0, 0, 19, 51, 0,
+  81, 0, 0, 0, 7, 0, 55, 0, 12, 95,
+  28, 106, 1, 0, 0, 0, 4, 67, 71, 0,
+  2, 16, 0, 39, 0, 0, 0, 0, 25, 0,
+  0, 0, 0, 18, 65, 17, 0, 0, 0, 0,
+  0, 25, 0, 135, 0, 7, 42, 0, 0, 4,
+  0, 6, 0, 0, 0, 25, 13, 0, 41, 106,
+  15, 0, 0, 0, 0, 1, 0, 0, 0, 1,
+  9, 0, 0, 82, 0, 40, 0, 0, 45, 0,
+  0, 46, 0, 80, 0, 4, 0, 0, 0, 52,
+  0, 0, 133, 36, 44, 0, 57, 0, 0, 92,
+  42, 0, 155, 0, 0, 30, 0, 77, 196, 0,
+  59, 34, 0, 31, 0, 16, 9, 0, 0, 0,
+  35, 0, 0, 0, 1, 0, 11, 0, 0, 92,
+  0, 0, 27, 0, 0, 0, 7, 76, 78, 108,
+  0, 0, 0, 0, 0, 30, 0, 0, 0, 38,
+  0, 95, 0, 0, 0, 0, 52, 0, 0, 0,
+  0, 0, 21, 0, 0, 6, 0, 28, 0, 8,
+  0, 24, 24, 29, 104, 12, 0, 37, 106, 0,
+  0, 105, 62, 22, 0, 0, 41, 62, 0, 12,
+  2, 0, 0, 43, 0, 0, 0, 0, 76, 0,
+  33, 0, 0, 91, 0, 53, 32, 0, 4, 39,
+  5, 115, 2, 34, 0, 36, 0, 56, 16, 0,
+  56, 0, 6, 0, 36, 0, 0, 14, 0, 21,
+  0, 0, 0, 0, 27, 0, 37, 0, 47, 52,
+  0, 14, 8, 31, 0, 0, 8, 0, 29, 0,
+  0, 10, 11, 0, 20, 0, 0, 68, 0, 34,
+  0, 0, 0, 0, 26, 84, 90, 0, 0, 0,
+  22, 0, 15, 31, 0, 34, 0, 30, 0, 52,
+  0, 0, 0, 0, 60, 0, 39, 0, 79, 0,
+  69, 0, 34, 16, 6, 145, 0, 66, 0, 25,
+  0, 0, 52, 0, 6, 0, 69, 0, 0, 0,
+  0, 5, 33, 32, 0, 0, 14, 32, 3, 0,
+  70, 0, 0, 0, 0, 0, 77, 0, 13, 38,
+  0, 0, 0, 0, 0, 17, 0, 19, 0, 15,
+  48, 19, 0, 17, 5, 25, 0, 35, 17, 0,
+  54, 0, 0, 16, 0, 0, 0, 0, 16, 0,
+  16, 19, 0, 1, 65, 17, 3, 0, 34, 29,
+  0, 94, 0, 16, 0, 0, 90, 39, 0, 18,
+  0, 41, 51, 18, 99, 0, 0, 0, 0, 0,
+  61, 0, 18, 99, 42, 59, 0, 0, 0, 10,
+  57, 44, 87, 0, 0, 0, 0, 36, 0, 0,
+  0, 0, 5, 0, 3, 0, 48, 0, 39, 0,
+  0, 46, 58, 21, 0, 68, 2, 105, 0, 4,
+  38, 0, 0, 0, 40, 0, 0, 0, 2, 21,
+  35, 0, 0, 90, 13, 0, 0, 0, 31, 0,
+  9, 0, 0, 31, 3, 0, 67, 72, 9, 0,
+  27, 0, 20, 14, 0, 28, 22, 53, 41, 0,
+  0, 0, 0, 61, 0, 0, 135, 38, 37, 0,
+  7, 0, 0, 47, 34, 0, 96, 0, 0, 31,
+  0, 47, 198, 6, 55, 0, 0, 0, 0, 35,
+  0, 0, 0, 0, 77, 27, 31, 0, 1, 1,
+  38, 0, 0, 15, 0, 0, 17, 0, 39, 0,
+  26, 71, 33, 77, 0, 0, 0, 0, 6, 46,
+  5, 0, 19, 40, 0, 88, 0, 0, 0, 0,
+  55, 0, 0, 0, 0, 0, 28, 0, 0, 16,
+  0, 0, 0, 15, 0, 83, 0, 21, 90, 39,
+  0, 48, 26, 0, 0, 60, 13, 28, 16, 0,
+  25, 81, 1, 0, 0, 0, 1, 44, 17, 19,
+  0, 35, 60, 0, 78, 36, 79, 138, 7, 0,
+  76, 0, 2, 0, 0, 129, 0, 4, 0, 11,
+  0, 4, 0, 0, 138, 0, 2, 0, 27, 0,
+  0, 90, 14, 2, 90, 0, 0, 39, 0, 61,
+  111, 0, 118, 35, 0, 31, 35, 22, 25, 0,
+  0, 0, 0, 27, 0, 0, 12, 25, 0, 0,
+  0, 91, 0, 7, 15, 0, 6, 0, 0, 89,
+  131, 18, 0, 0, 39, 0, 0, 48, 0, 0,
+  1, 67, 0, 57, 0, 0, 0, 0, 75, 0,
+  0, 0, 0, 0, 0, 0, 75, 51, 0, 120,
+  19, 74, 27, 0, 31, 0, 61, 0, 8, 0,
+  21, 27, 26, 43, 32, 22, 11, 48, 0, 0,
+  11, 13, 20, 2, 39, 1, 0, 0, 0, 0,
+  45, 5, 15, 2, 0, 0, 0, 0, 0, 0,
+  0, 21, 0, 27, 87, 36, 0, 0, 16, 0,
+  0, 39, 0, 0, 30, 0, 0, 50, 0, 22,
+  0, 0, 0, 0, 32, 15, 38, 0, 0, 0,
+  27, 0, 82, 16, 0, 44, 0, 0, 23, 10,
+  32, 10, 15, 51, 24, 38, 8, 39, 22, 24,
+  0, 47, 0, 0, 15, 0, 42, 41, 18, 5,
+  0, 0, 5, 0, 39, 13, 35, 22, 0, 0,
+  0, 45, 0, 0, 0, 0, 9, 0, 0, 0,
+  49, 0, 6, 0, 21, 9, 64, 56, 7, 47,
+  47, 23, 0, 2, 27, 0, 0, 0, 42, 8,
+  0, 3, 0, 0, 56, 18, 0, 16, 26, 0,
+  2, 0, 57, 0, 1, 54, 0, 27, 23, 0,
+  74, 44, 54, 0, 12, 0, 0, 9, 0, 16,
+  14, 30, 64, 22, 0, 0, 0, 0, 0, 18,
+  39, 0, 31, 0, 0, 0, 0, 41, 29, 0,
+  11, 5, 0, 39, 0, 10, 75, 0, 74, 0,
+  24, 4, 0, 36, 30, 0, 0, 0, 49, 39,
+  40, 0, 0, 51, 36, 6, 0, 6, 0, 16,
+  0, 0, 38, 0, 41, 42, 30, 45, 15, 0,
+  0, 0, 5, 61, 41, 0, 5, 11, 0, 65,
+  38, 0, 0, 0, 29, 0, 0, 0, 0, 0,
+  0, 0, 8, 29, 59, 0, 21, 13, 0, 41,
+  0, 2, 0, 43, 0, 19, 0, 48, 0, 0,
+  0, 0, 56, 0, 3, 89, 5, 0, 0, 0,
+  21, 5, 0, 99, 0, 11, 0, 0, 67, 44,
+  117, 91, 15, 0, 39, 0, 3, 0, 0, 12,
+  0, 18, 5, 1, 0, 35, 0, 23, 119, 0,
+  0, 4, 0, 0, 0, 65, 91, 49, 82, 33,
+  0, 21, 0, 118, 80, 20, 83, 0, 0, 0,
+  0, 0, 100, 0, 0, 0, 15, 22, 26, 0,
+  0, 49, 63, 0, 0, 18, 0, 0, 55, 0,
+  41, 0, 0, 54, 58, 26, 28, 0, 0, 0,
+  0, 29, 0, 0, 19, 18, 0, 23, 56, 7,
+  0, 0, 19, 0, 0, 0, 0, 0, 0, 24,
+  61, 73, 0, 0, 0, 25, 0, 135, 0, 7,
+  42, 0, 0, 4, 0, 6, 0, 0, 0, 25,
+  13, 0, 41, 106, 15, 0, 0, 0, 0, 1,
+  0, 0, 0, 1, 9, 0, 0, 82, 0, 40,
+  0, 0, 45, 0, 0, 46, 0, 80, 0, 4,
+  0, 0, 0, 52, 0, 0, 133, 36, 44, 0,
+  57, 0, 0, 92, 42, 0, 155, 0, 0, 30,
+  0, 77, 196, 0, 59, 34, 0, 31, 0, 16,
+  9, 0, 0, 0, 35, 0, 0, 0, 1, 0,
+  11, 0, 0, 92, 0, 0, 27, 0, 0, 0,
+  7, 76, 78, 108, 0, 0, 0, 0, 0, 30,
+  0, 0, 0, 38, 0, 95, 0, 0, 0, 0,
+  52, 0, 0, 0, 0, 0, 21, 0, 0, 6,
+  0, 28, 0, 8, 0, 24, 24, 29, 104, 12,
+  0, 37, 106, 0, 0, 105, 62, 22, 0, 0,
+  41, 62, 0, 12, 2, 0, 0, 43, 0, 0,
+  0, 0, 76, 0, 33, 0, 0, 91, 0, 53,
+  32, 0, 4, 39, 5, 115, 2, 34, 0, 36,
+  0, 56, 16, 0, 56, 0, 6, 0, 36, 0,
+  0, 14, 0, 21, 0, 0, 0, 0, 27, 0,
+  37, 0, 47, 52, 0, 14, 8, 31, 0, 0,
+  8, 0, 29, 0, 0, 10, 11, 0, 20, 0,
+  0, 68, 0, 34, 0, 0, 0, 0, 26, 84,
+  90, 0, 0, 0, 22, 0, 15, 31, 0, 34,
+  0, 30, 0, 52, 0, 0, 0, 0, 60, 0,
+  39, 0, 79, 0, 69, 0, 34, 16, 0, 39,
+  58, 0, 0, 0, 35, 20, 76, 0, 11, 39,
+  97, 0, 0, 94, 63, 17, 0, 0, 0, 47,
+  11, 21, 63, 0, 0, 58, 0, 0, 0, 24,
+  97, 0, 27, 0, 0, 89, 26, 22, 38, 4,
+  46, 33, 23, 117, 42, 0, 0, 22, 0, 0,
+  14, 0, 32, 0, 5, 0, 47, 0, 0, 49,
+  0, 19, 0, 0, 17, 1, 30, 0, 0, 0,
+  56, 43, 10, 31, 22, 65, 0, 0, 6, 0,
+  19, 88, 0, 42, 0, 0, 0, 23, 0, 11,
+  0, 31, 0, 0, 0, 0, 0, 85, 98, 0,
+  0, 0, 13, 0, 31, 29, 0, 24, 0, 19,
+  0, 5, 0, 0, 0, 12, 70, 0, 0, 0,
+  32, 0, 63, 0, 24, 34, 58, 21, 0, 68,
+  2, 105, 0, 4, 38, 0, 0, 0, 40, 0,
+  0, 0, 2, 21, 35, 0, 0, 90, 13, 0,
+  0, 0, 31, 0, 9, 0, 0, 31, 3, 0,
+  67, 72, 9, 0, 27, 0, 20, 14, 0, 28,
+  22, 53, 41, 0, 0, 0, 0, 61, 0, 0,
+  135, 38, 37, 0, 7, 0, 0, 47, 34, 0,
+  96, 0, 0, 31, 0, 47, 198, 6, 55, 0,
+  0, 0, 0, 35, 0, 0, 0, 0, 77, 27,
+  31, 0, 1, 1, 38, 0, 0, 15, 0, 0,
+  17, 0, 39, 0, 26, 71, 33, 77, 0, 0,
+  0, 0, 6, 46, 5, 0, 19, 40, 0, 88,
+  0, 0, 0, 0, 55, 0, 0, 0, 0, 0,
+  28, 0, 0, 16, 0, 0, 0, 15, 0, 83,
+  0, 21, 90, 39, 0, 48, 26, 0, 0, 60,
+  13, 28, 16, 0, 25, 81, 1, 0, 0, 0,
+  1, 44, 17, 19, 0, 35, 60, 0, 78, 36,
+  79, 138, 7, 0, 76, 0, 2, 0, 0, 129,
+  0, 4, 0, 11, 0, 4, 0, 0, 138, 0,
+  2, 0, 27, 0, 0, 90, 14, 2, 90, 0,
+  0, 39, 0, 61, 111, 0, 118, 35, 0, 31,
+  35, 22, 25, 0, 0, 0, 0, 27, 0, 0,
+  12, 25, 0, 0, 0, 91, 0, 7, 15, 0,
+  6, 0, 0, 89, 131, 18, 0, 0, 39, 0,
+  0, 48, 0, 0, 1, 67, 0, 57, 0, 0,
+  0, 0, 75, 0, 0, 0, 0, 0, 0, 0,
+  75, 51, 0, 0, 95, 9, 0, 0, 0, 24,
+  67, 28, 0, 54, 35, 44, 0, 52, 0, 15,
+  0, 0, 0, 58, 28, 9, 0, 0, 21, 48,
+  6, 84, 0, 37, 76, 0, 22, 0, 105, 123,
+  0, 0, 100, 0, 38, 0, 0, 109, 0, 0,
+  0, 11, 0, 0, 0, 0, 96, 0, 19, 0,
+  47, 0, 0, 83, 53, 15, 66, 0, 7, 34,
+  0, 90, 0, 0, 122, 30, 0, 21, 7, 0,
+  14, 0, 0, 2, 0, 89, 0, 17, 21, 0,
+  35, 0, 0, 36, 0, 3, 0, 0, 0, 0,
+  0, 59, 137, 0, 0, 0, 0, 0, 0, 52,
+  0, 3, 30, 17, 0, 0, 80, 0, 22, 0,
+  52, 0, 0, 0, 0, 0, 0, 14, 61, 73,
+  64, 56, 7, 47, 47, 23, 0, 2, 27, 0,
+  0, 0, 42, 8, 0, 3, 0, 0, 56, 18,
+  0, 16, 26, 0, 2, 0, 57, 0, 1, 54,
+  0, 27, 23, 0, 74, 44, 54, 0, 12, 0,
+  0, 9, 0, 16, 14, 30, 64, 22, 0, 0,
+  0, 0, 0, 18, 39, 0, 31, 0, 0, 0,
+  0, 41, 29, 0, 11, 5, 0, 39, 0, 10,
+  75, 0, 74, 0, 24, 4, 0, 36, 30, 0,
+  0, 0, 49, 39, 40, 0, 0, 51, 36, 6,
+  0, 6, 0, 16, 0, 0, 38, 0, 41, 42,
+  30, 45, 15, 0, 0, 0, 5, 61, 41, 0,
+  5, 11, 0, 65, 38, 0, 0, 0, 29, 0,
+  0, 0, 0, 0, 0, 0, 8, 29, 59, 0,
+  21, 13, 0, 41, 0, 2, 0, 43, 0, 19,
+  0, 48, 0, 0, 0, 0, 56, 0, 3, 89,
+  5, 0, 0, 0, 21, 5, 0, 99, 0, 11,
+  0, 0, 67, 44, 117, 91, 15, 0, 39, 0,
+  3, 0, 0, 12, 0, 18, 5, 1, 0, 35,
+  0, 23, 119, 0, 0, 4, 0, 0, 0, 65,
+  91, 49, 82, 33, 0, 21, 0, 118, 80, 20,
+  83, 0, 0, 0, 0, 0, 100, 0, 0, 0,
+  15, 22, 26, 0, 0, 49, 63, 0, 0, 18,
+  0, 0, 55, 0, 41, 0, 0, 54, 58, 26,
+  28, 0, 0, 0, 0, 29, 0, 0, 19, 18,
+  0, 23, 56, 7, 0, 0, 19, 0, 0, 0,
+  0, 0, 0, 24, 61, 73, 32, 0, 66, 36,
+  9, 0, 0, 0, 5, 21, 0, 26, 30, 124,
+  0, 0, 0, 0, 23, 0, 28, 52, 0, 3,
+  0, 0, 50, 28, 0, 103, 0, 4, 0, 0,
+  39, 0, 82, 66, 0, 0, 35, 0, 2, 0,
+  0, 22, 7, 0, 0, 0, 0, 70, 0, 21,
+  74, 0, 0, 14, 10, 0, 0, 32, 91, 24,
+  64, 1, 0, 2, 0, 95, 0, 13, 72, 0,
+  0, 0, 0, 0, 86, 0, 0, 56, 11, 19,
+  0, 0, 12, 13, 141, 0, 0, 19, 0, 0,
+  4, 0, 38, 0, 0, 38, 31, 0, 0, 0,
+  0, 0, 0, 56, 51, 0, 69, 0, 0, 0,
+  107, 0, 36, 0, 0, 32, 38, 0, 0, 0,
+  0, 37, 0, 81, 0, 28, 0, 8, 0, 24,
+  24, 29, 104, 12, 0, 37, 106, 0, 0, 105,
+  62, 22, 0, 0, 41, 62, 0, 12, 2, 0,
+  0, 43, 0, 0, 0, 0, 76, 0, 33, 0,
+  0, 91, 0, 53, 32, 0, 4, 39, 5, 115,
+  2, 34, 0, 36, 0, 56, 16, 0, 56, 0,
+  6, 0, 36, 0, 0, 14, 0, 21, 0, 0,
+  0, 0, 27, 0, 37, 0, 47, 52, 0, 14,
+  8, 31, 0, 0, 8, 0, 29, 0, 0, 10,
+  11, 0, 20, 0, 0, 68, 0, 34, 0, 0,
+  0, 0, 26, 84, 90, 0, 0, 0, 22, 0,
+  15, 31, 0, 34, 0, 30, 0, 52, 0, 0,
+  0, 0, 60, 0, 39, 0, 79, 0, 69, 0,
+  34, 16, 0, 39, 58, 0, 0, 0, 35, 20,
+  76, 0, 11, 39, 97, 0, 0, 94, 63, 17,
+  0, 0, 0, 47, 11, 21, 63, 0, 0, 58,
+  0, 0, 0, 24, 97, 0, 27, 0, 0, 89,
+  26, 22, 38, 4, 46, 33, 23, 117, 42, 0,
+  0, 22, 0, 0, 14, 0, 32, 0, 5, 0,
+  47, 0, 0, 49, 0, 19, 0, 0, 17, 1,
+  30, 0, 0, 0, 56, 43, 10, 31, 22, 65,
+  0, 0, 6, 0, 19, 88, 0, 42, 0, 0,
+  0, 23, 0, 11, 0, 31, 0, 0, 0, 0,
+  0, 85, 98, 0, 0, 0, 13, 0, 31, 29,
+  0, 24, 0, 19, 0, 5, 0, 0, 0, 12,
+  70, 0, 0, 0, 32, 0, 63, 0, 24, 34,
+  0, 10, 0, 0, 0, 0, 0, 1, 32, 2,
+  16, 56, 0, 30, 0, 9, 3, 0, 2, 0,
+  1, 27, 71, 20, 5, 0, 0, 23, 0, 18,
+  0, 0, 30, 0, 15, 0, 59, 84, 34, 0,
+  85, 0, 0, 5, 0, 98, 39, 10, 0, 0,
+  0, 0, 0, 0, 57, 0, 55, 0, 96, 0,
+  0, 81, 9, 12, 28, 9, 50, 46, 29, 21,
+  0, 0, 85, 58, 7, 94, 37, 18, 0, 0,
+  0, 22, 0, 74, 0, 50, 11, 36, 0, 0,
+  0, 84, 19, 16, 0, 0, 0, 0, 17, 49,
+  89, 0, 0, 0, 0, 27, 5, 0, 0, 3,
+  0, 9, 0, 9, 21, 75, 0, 33, 64, 0,
+  0, 0, 0, 0, 0, 0, 0, 41, 0, 0,
+  0, 15, 0, 83, 0, 21, 90, 39, 0, 48,
+  26, 0, 0, 60, 13, 28, 16, 0, 25, 81,
+  1, 0, 0, 0, 1, 44, 17, 19, 0, 35,
+  60, 0, 78, 36, 79, 138, 7, 0, 76, 0,
+  2, 0, 0, 129, 0, 4, 0, 11, 0, 4,
+  0, 0, 138, 0, 2, 0, 27, 0, 0, 90,
+  14, 2, 90, 0, 0, 39, 0, 61, 111, 0,
+  118, 35, 0, 31, 35, 22, 25, 0, 0, 0,
+  0, 27, 0, 0, 12, 25, 0, 0, 0, 91,
+  0, 7, 15, 0, 6, 0, 0, 89, 131, 18,
+  0, 0, 39, 0, 0, 48, 0, 0, 1, 67,
+  0, 57, 0, 0, 0, 0, 75, 0, 0, 0,
+  0, 0, 0, 0, 75, 51, 0, 0, 95, 9,
+  0, 0, 0, 24, 67, 28, 0, 54, 35, 44,
+  0, 52, 0, 15, 0, 0, 0, 58, 28, 9,
+  0, 0, 21, 48, 6, 84, 0, 37, 76, 0,
+  22, 0, 105, 123, 0, 0, 100, 0, 38, 0,
+  0, 109, 0, 0, 0, 11, 0, 0, 0, 0,
+  96, 0, 19, 0, 47, 0, 0, 83, 53, 15,
+  66, 0, 7, 34, 0, 90, 0, 0, 122, 30,
+  0, 21, 7, 0, 14, 0, 0, 2, 0, 89,
+  0, 17, 21, 0, 35, 0, 0, 36, 0, 3,
+  0, 0, 0, 0, 0, 59, 137, 0, 0, 0,
+  0, 0, 0, 52, 0, 3, 30, 17, 0, 0,
+  80, 0, 22, 0, 52, 0, 0, 0, 0, 0,
+  0, 14, 61, 73, 19, 3, 82, 25, 7, 0,
+  0, 19, 0, 0, 0, 50, 24, 124, 0, 0,
+  0, 0, 0, 0, 16, 66, 70, 4, 0, 0,
+  12, 4, 0, 88, 7, 3, 0, 13, 0, 0,
+  74, 8, 0, 0, 84, 0, 0, 15, 17, 36,
+  17, 22, 4, 0, 9, 49, 0, 0, 86, 0,
+  46, 0, 71, 0, 0, 47, 100, 0, 96, 0,
+  0, 47, 0, 116, 0, 23, 90, 0, 0, 33,
+  0, 0, 23, 0, 0, 55, 0, 76, 0, 1,
+  45, 31, 68, 0, 0, 0, 10, 0, 0, 0,
+  0, 0, 0, 29, 67, 0, 0, 0, 0, 4,
+  0, 42, 0, 0, 54, 0, 0, 0, 124, 74,
+  44, 0, 25, 0, 0, 0, 0, 25, 0, 22,
+  0, 56, 59, 0, 21, 13, 0, 41, 0, 2,
+  0, 43, 0, 19, 0, 48, 0, 0, 0, 0,
+  56, 0, 3, 89, 5, 0, 0, 0, 21, 5,
+  0, 99, 0, 11, 0, 0, 67, 44, 117, 91,
+  15, 0, 39, 0, 3, 0, 0, 12, 0, 18,
+  5, 1, 0, 35, 0, 23, 119, 0, 0, 4,
+  0, 0, 0, 65, 91, 49, 82, 33, 0, 21,
+  0, 118, 80, 20, 83, 0, 0, 0, 0, 0,
+  100, 0, 0, 0, 15, 22, 26, 0, 0, 49,
+  63, 0, 0, 18, 0, 0, 55, 0, 41, 0,
+  0, 54, 58, 26, 28, 0, 0, 0, 0, 29,
+  0, 0, 19, 18, 0, 23, 56, 7, 0, 0,
+  19, 0, 0, 0, 0, 0, 0, 24, 61, 73,
+  32, 0, 66, 36, 9, 0, 0, 0, 5, 21,
+  0, 26, 30, 124, 0, 0, 0, 0, 23, 0,
+  28, 52, 0, 3, 0, 0, 50, 28, 0, 103,
+  0, 4, 0, 0, 39, 0, 82, 66, 0, 0,
+  35, 0, 2, 0, 0, 22, 7, 0, 0, 0,
+  0, 70, 0, 21, 74, 0, 0, 14, 10, 0,
+  0, 32, 91, 24, 64, 1, 0, 2, 0, 95,
+  0, 13, 72, 0, 0, 0, 0, 0, 86, 0,
+  0, 56, 11, 19, 0, 0, 12, 13, 141, 0,
+  0, 19, 0, 0, 4, 0, 38, 0, 0, 38,
+  31, 0, 0, 0, 0, 0, 0, 56, 51, 0,
+  69, 0, 0, 0, 107, 0, 36, 0, 0, 32,
+  38, 0, 0, 0, 0, 37, 0, 81, 51, 46,
+  25, 77, 65, 9, 0, 0, 20, 0, 19, 0,
+  51, 118, 0, 0, 0, 0, 16, 7, 12, 11,
+  0, 26, 0, 0, 55, 19, 0, 69, 20, 7,
+  22, 0, 56, 0, 0, 0, 0, 0, 0, 35,
+  0, 0, 31, 31, 30, 33, 0, 0, 23, 35,
+  0, 14, 38, 0, 27, 20, 0, 10, 0, 19,
+  19, 8, 0, 0, 0, 0, 2, 0, 0, 41,
+  51, 0, 0, 22, 0, 0, 35, 8, 0, 53,
+  41, 20, 0, 0, 35, 12, 95, 14, 26, 0,
+  0, 30, 0, 0, 70, 0, 0, 50, 0, 20,
+  0, 0, 0, 25, 0, 43, 127, 0, 82, 0,
+  12, 0, 31, 0, 14, 0, 0, 8, 49, 0,
+  2, 15, 10, 13, 0, 93, 0, 39, 58, 0,
+  0, 0, 35, 20, 76, 0, 11, 39, 97, 0,
+  0, 94, 63, 17, 0, 0, 0, 47, 11, 21,
+  63, 0, 0, 58, 0, 0, 0, 24, 97, 0,
+  27, 0, 0, 89, 26, 22, 38, 4, 46, 33,
+  23, 117, 42, 0, 0, 22, 0, 0, 14, 0,
+  32, 0, 5, 0, 47, 0, 0, 49, 0, 19,
+  0, 0, 17, 1, 30, 0, 0, 0, 56, 43,
+  10, 31, 22, 65, 0, 0, 6, 0, 19, 88,
+  0, 42, 0, 0, 0, 23, 0, 11, 0, 31,
+  0, 0, 0, 0, 0, 85, 98, 0, 0, 0,
+  13, 0, 31, 29, 0, 24, 0, 19, 0, 5,
+  0, 0, 0, 12, 70, 0, 0, 0, 32, 0,
+  63, 0, 24, 34, 0, 10, 0, 0, 0, 0,
+  0, 1, 32, 2, 16, 56, 0, 30, 0, 9,
+  3, 0, 2, 0, 1, 27, 71, 20, 5, 0,
+  0, 23, 0, 18, 0, 0, 30, 0, 15, 0,
+  59, 84, 34, 0, 85, 0, 0, 5, 0, 98,
+  39, 10, 0, 0, 0, 0, 0, 0, 57, 0,
+  55, 0, 96, 0, 0, 81, 9, 12, 28, 9,
+  50, 46, 29, 21, 0, 0, 85, 58, 7, 94,
+  37, 18, 0, 0, 0, 22, 0, 74, 0, 50,
+  11, 36, 0, 0, 0, 84, 19, 16, 0, 0,
+  0, 0, 17, 49, 89, 0, 0, 0, 0, 27,
+  5, 0, 0, 3, 0, 9, 0, 9, 21, 75,
+  0, 33, 64, 0, 0, 0, 0, 0, 0, 0,
+  0, 41, 4, 18, 11, 6, 0, 0, 0, 0,
+  60, 44, 0, 0, 0, 54, 0, 0, 0, 29,
+  17, 0, 3, 11, 34, 17, 0, 0, 58, 48,
+  0, 0, 0, 0, 53, 0, 0, 0, 74, 109,
+  0, 0, 46, 0, 0, 0, 0, 59, 0, 51,
+  0, 23, 0, 0, 0, 0, 78, 7, 34, 8,
+  0, 0, 0, 52, 29, 14, 74, 2, 53, 17,
+  8, 144, 9, 0, 46, 89, 0, 57, 27, 0,
+  12, 0, 0, 0, 31, 87, 0, 30, 0, 43,
+  20, 0, 0, 171, 0, 0, 22, 0, 7, 0,
+  0, 57, 123, 33, 0, 0, 0, 0, 0, 2,
+  0, 0, 0, 24, 0, 10, 20, 24, 0, 0,
+  14, 0, 0, 0, 0, 0, 0, 4, 58, 62,
+  0, 0, 95, 9, 0, 0, 0, 24, 67, 28,
+  0, 54, 35, 44, 0, 52, 0, 15, 0, 0,
+  0, 58, 28, 9, 0, 0, 21, 48, 6, 84,
+  0, 37, 76, 0, 22, 0, 105, 123, 0, 0,
+  100, 0, 38, 0, 0, 109, 0, 0, 0, 11,
+  0, 0, 0, 0, 96, 0, 19, 0, 47, 0,
+  0, 83, 53, 15, 66, 0, 7, 34, 0, 90,
+  0, 0, 122, 30, 0, 21, 7, 0, 14, 0,
+  0, 2, 0, 89, 0, 17, 21, 0, 35, 0,
+  0, 36, 0, 3, 0, 0, 0, 0, 0, 59,
+  137, 0, 0, 0, 0, 0, 0, 52, 0, 3,
+  30, 17, 0, 0, 80, 0, 22, 0, 52, 0,
+  0, 0, 0, 0, 0, 14, 61, 73, 19, 3,
+  82, 25, 7, 0, 0, 19, 0, 0, 0, 50,
+  24, 124, 0, 0, 0, 0, 0, 0, 16, 66,
+  70, 4, 0, 0, 12, 4, 0, 88, 7, 3,
+  0, 13, 0, 0, 74, 8, 0, 0, 84, 0,
+  0, 15, 17, 36, 17, 22, 4, 0, 9, 49,
+  0, 0, 86, 0, 46, 0, 71, 0, 0, 47,
+  100, 0, 96, 0, 0, 47, 0, 116, 0, 23,
+  90, 0, 0, 33, 0, 0, 23, 0, 0, 55,
+  0, 76, 0, 1, 45, 31, 68, 0, 0, 0,
+  10, 0, 0, 0, 0, 0, 0, 29, 67, 0,
+  0, 0, 0, 4, 0, 42, 0, 0, 54, 0,
+  0, 0, 124, 74, 44, 0, 25, 0, 0, 0,
+  0, 25, 0, 22, 0, 56, 83, 83, 12, 72,
+  44, 15, 0, 0, 20, 0, 22, 0, 23, 126,
+  0, 0, 0, 0, 39, 0, 24, 37, 34, 21,
+  0, 0, 35, 11, 0, 34, 52, 81, 0, 0,
+  0, 0, 0, 26, 0, 0, 0, 1, 0, 0,
+  1, 18, 42, 71, 0, 0, 11, 40, 0, 7,
+  106, 0, 38, 4, 10, 0, 0, 34, 61, 26,
+  20, 0, 27, 21, 0, 98, 0, 49, 51, 0,
+  0, 28, 54, 0, 44, 0, 0, 48, 15, 60,
+  0, 1, 2, 45, 68, 0, 14, 0, 0, 25,
+  0, 0, 81, 0, 11, 15, 12, 121, 4, 0,
+  0, 16, 0, 68, 74, 0, 26, 0, 17, 1,
+  24, 87, 0, 0, 20, 2, 10, 0, 0, 0,
+  0, 22, 0, 87, 32, 0, 66, 36, 9, 0,
+  0, 0, 5, 21, 0, 26, 30, 124, 0, 0,
+  0, 0, 23, 0, 28, 52, 0, 3, 0, 0,
+  50, 28, 0, 103, 0, 4, 0, 0, 39, 0,
+  82, 66, 0, 0, 35, 0, 2, 0, 0, 22,
+  7, 0, 0, 0, 0, 70, 0, 21, 74, 0,
+  0, 14, 10, 0, 0, 32, 91, 24, 64, 1,
+  0, 2, 0, 95, 0, 13, 72, 0, 0, 0,
+  0, 0, 86, 0, 0, 56, 11, 19, 0, 0,
+  12, 13, 141, 0, 0, 19, 0, 0, 4, 0,
+  38, 0, 0, 38, 31, 0, 0, 0, 0, 0,
+  0, 56, 51, 0, 69, 0, 0, 0, 107, 0,
+  36, 0, 0, 32, 38, 0, 0, 0, 0, 37,
+  0, 81, 51, 46, 25, 77, 65, 9, 0, 0,
+  20, 0, 19, 0, 51, 118, 0, 0, 0, 0,
+  16, 7, 12, 11, 0, 26, 0, 0, 55, 19,
+  0, 69, 20, 7, 22, 0, 56, 0, 0, 0,
+  0, 0, 0, 35, 0, 0, 31, 31, 30, 33,
+  0, 0, 23, 35, 0, 14, 38, 0, 27, 20,
+  0, 10, 0, 19, 19, 8, 0, 0, 0, 0,
+  2, 0, 0, 41, 51, 0, 0, 22, 0, 0,
+  35, 8, 0, 53, 41, 20, 0, 0, 35, 12,
+  95, 14, 26, 0, 0, 30, 0, 0, 70, 0,
+  0, 50, 0, 20, 0, 0, 0, 25, 0, 43,
+  127, 0, 82, 0, 12, 0, 31, 0, 14, 0,
+  0, 8, 49, 0, 2, 15, 10, 13, 0, 93,
+  42, 127, 15, 99, 80, 43, 0, 0, 43, 0,
+  32, 0, 35, 29, 0, 0, 11, 0, 41, 15,
+  0, 0, 0, 47, 24, 0, 52, 29, 0, 37,
+  5, 49, 69, 0, 20, 0, 0, 0, 0, 0,
+  0, 17, 0, 6, 19, 56, 44, 46, 0, 7,
+  4, 0, 0, 17, 32, 0, 50, 2, 0, 29,
+  21, 24, 0, 8, 0, 0, 52, 4, 27, 0,
+  0, 21, 45, 4, 6, 45, 10, 2, 0, 2,
+  0, 19, 40, 73, 0, 17, 5, 38, 21, 49,
+  107, 0, 0, 49, 0, 0, 90, 0, 23, 57,
+  7, 99, 1, 0, 25, 33, 41, 62, 122, 0,
+  7, 22, 36, 0, 0, 0, 0, 0, 0, 0,
+  13, 0, 43, 0, 45, 1, 13, 74, 0, 10,
+  0, 0, 0, 0, 0, 1, 32, 2, 16, 56,
+  0, 30, 0, 9, 3, 0, 2, 0, 1, 27,
+  71, 20, 5, 0, 0, 23, 0, 18, 0, 0,
+  30, 0, 15, 0, 59, 84, 34, 0, 85, 0,
+  0, 5, 0, 98, 39, 10, 0, 0, 0, 0,
+  0, 0, 57, 0, 55, 0, 96, 0, 0, 81,
+  9, 12, 28, 9, 50, 46, 29, 21, 0, 0,
+  85, 58, 7, 94, 37, 18, 0, 0, 0, 22,
+  0, 74, 0, 50, 11, 36, 0, 0, 0, 84,
+  19, 16, 0, 0, 0, 0, 17, 49, 89, 0,
+  0, 0, 0, 27, 5, 0, 0, 3, 0, 9,
+  0, 9, 21, 75, 0, 33, 64, 0, 0, 0,
+  0, 0, 0, 0, 0, 41, 4, 18, 11, 6,
+  0, 0, 0, 0, 60, 44, 0, 0, 0, 54,
+  0, 0, 0, 29, 17, 0, 3, 11, 34, 17,
+  0, 0, 58, 48, 0, 0, 0, 0, 53, 0,
+  0, 0, 74, 109, 0, 0, 46, 0, 0, 0,
+  0, 59, 0, 51, 0, 23, 0, 0, 0, 0,
+  78, 7, 34, 8, 0, 0, 0, 52, 29, 14,
+  74, 2, 53, 17, 8, 144, 9, 0, 46, 89,
+  0, 57, 27, 0, 12, 0, 0, 0, 31, 87,
+  0, 30, 0, 43, 20, 0, 0, 171, 0, 0,
+  22, 0, 7, 0, 0, 57, 123, 33, 0, 0,
+  0, 0, 0, 2, 0, 0, 0, 24, 0, 10,
+  20, 24, 0, 0, 14, 0, 0, 0, 0, 0,
+  0, 4, 58, 62, 28, 0, 51, 0, 0, 127,
+  0, 0, 28, 13, 0, 0, 0, 82, 0, 0,
+  9, 29, 31, 0, 0, 85, 28, 32, 0, 0,
+  13, 55, 0, 0, 0, 43, 0, 0, 0, 17,
+  44, 93, 0, 0, 24, 0, 15, 0, 0, 32,
+  0, 29, 0, 35, 0, 77, 0, 0, 138, 0,
+  12, 0, 0, 0, 0, 64, 0, 0, 81, 0,
+  9, 6, 12, 125, 8, 0, 33, 55, 0, 39,
+  22, 0, 0, 0, 0, 0, 28, 82, 0, 10,
+  0, 46, 0, 0, 0, 123, 0, 0, 55, 0,
+  11, 0, 0, 88, 63, 49, 0, 0, 27, 0,
+  0, 10, 0, 6, 1, 11, 0, 0, 9, 35,
+  24, 0, 11, 0, 0, 0, 0, 0, 0, 3,
+  9, 79, 19, 3, 82, 25, 7, 0, 0, 19,
+  0, 0, 0, 50, 24, 124, 0, 0, 0, 0,
+  0, 0, 16, 66, 70, 4, 0, 0, 12, 4,
+  0, 88, 7, 3, 0, 13, 0, 0, 74, 8,
+  0, 0, 84, 0, 0, 15, 17, 36, 17, 22,
+  4, 0, 9, 49, 0, 0, 86, 0, 46, 0,
+  71, 0, 0, 47, 100, 0, 96, 0, 0, 47,
+  0, 116, 0, 23, 90, 0, 0, 33, 0, 0,
+  23, 0, 0, 55, 0, 76, 0, 1, 45, 31,
+  68, 0, 0, 0, 10, 0, 0, 0, 0, 0,
+  0, 29, 67, 0, 0, 0, 0, 4, 0, 42,
+  0, 0, 54, 0, 0, 0, 124, 74, 44, 0,
+  25, 0, 0, 0, 0, 25, 0, 22, 0, 56,
+  83, 83, 12, 72, 44, 15, 0, 0, 20, 0,
+  22, 0, 23, 126, 0, 0, 0, 0, 39, 0,
+  24, 37, 34, 21, 0, 0, 35, 11, 0, 34,
+  52, 81, 0, 0, 0, 0, 0, 26, 0, 0,
+  0, 1, 0, 0, 1, 18, 42, 71, 0, 0,
+  11, 40, 0, 7, 106, 0, 38, 4, 10, 0,
+  0, 34, 61, 26, 20, 0, 27, 21, 0, 98,
+  0, 49, 51, 0, 0, 28, 54, 0, 44, 0,
+  0, 48, 15, 60, 0, 1, 2, 45, 68, 0,
+  14, 0, 0, 25, 0, 0, 81, 0, 11, 15,
+  12, 121, 4, 0, 0, 16, 0, 68, 74, 0,
+  26, 0, 17, 1, 24, 87, 0, 0, 20, 2,
+  10, 0, 0, 0, 0, 22, 0, 87, 35, 0,
+  20, 65, 14, 232, 0, 0, 1, 0, 0, 0,
+  0, 21, 0, 0, 0, 33, 62, 0, 0, 113,
+  15, 0, 0, 0, 0, 6, 0, 17, 8, 99,
+  0, 0, 0, 33, 0, 40, 0, 0, 0, 0,
+  0, 0, 0, 58, 44, 47, 7, 4, 0, 38,
+  0, 0, 142, 0, 48, 0, 21, 0, 27, 92,
+  17, 0, 115, 0, 0, 40, 0, 96, 83, 63,
+  62, 0, 0, 35, 43, 0, 0, 0, 0, 0,
+  46, 65, 0, 0, 0, 31, 0, 0, 7, 7,
+  0, 0, 70, 0, 52, 0, 0, 9, 17, 116,
+  2, 0, 0, 5, 18, 17, 0, 0, 0, 39,
+  0, 0, 0, 45, 36, 0, 13, 16, 0, 19,
+  0, 0, 0, 15, 0, 44, 51, 46, 25, 77,
+  65, 9, 0, 0, 20, 0, 19, 0, 51, 118,
+  0, 0, 0, 0, 16, 7, 12, 11, 0, 26,
+  0, 0, 55, 19, 0, 69, 20, 7, 22, 0,
+  56, 0, 0, 0, 0, 0, 0, 35, 0, 0,
+  31, 31, 30, 33, 0, 0, 23, 35, 0, 14,
+  38, 0, 27, 20, 0, 10, 0, 19, 19, 8,
+  0, 0, 0, 0, 2, 0, 0, 41, 51, 0,
+  0, 22, 0, 0, 35, 8, 0, 53, 41, 20,
+  0, 0, 35, 12, 95, 14, 26, 0, 0, 30,
+  0, 0, 70, 0, 0, 50, 0, 20, 0, 0,
+  0, 25, 0, 43, 127, 0, 82, 0, 12, 0,
+  31, 0, 14, 0, 0, 8, 49, 0, 2, 15,
+  10, 13, 0, 93, 42, 127, 15, 99, 80, 43,
+  0, 0, 43, 0, 32, 0, 35, 29, 0, 0,
+  11, 0, 41, 15, 0, 0, 0, 47, 24, 0,
+  52, 29, 0, 37, 5, 49, 69, 0, 20, 0,
+  0, 0, 0, 0, 0, 17, 0, 6, 19, 56,
+  44, 46, 0, 7, 4, 0, 0, 17, 32, 0,
+  50, 2, 0, 29, 21, 24, 0, 8, 0, 0,
+  52, 4, 27, 0, 0, 21, 45, 4, 6, 45,
+  10, 2, 0, 2, 0, 19, 40, 73, 0, 17,
+  5, 38, 21, 49, 107, 0, 0, 49, 0, 0,
+  90, 0, 23, 57, 7, 99, 1, 0, 25, 33,
+  41, 62, 122, 0, 7, 22, 36, 0, 0, 0,
+  0, 0, 0, 0, 13, 0, 43, 0, 45, 1,
+  13, 74, 17, 8, 86, 68, 23, 217, 0, 0,
+  29, 0, 0, 0, 32, 0, 0, 0, 31, 18,
+  66, 0, 0, 112, 15, 8, 7, 0, 0, 35,
+  0, 72, 0, 82, 0, 0, 0, 30, 0, 0,
+  1, 0, 0, 19, 0, 19, 0, 50, 59, 42,
+  0, 14, 0, 45, 0, 0, 97, 0, 62, 0,
+  33, 0, 0, 70, 0, 0, 53, 0, 0, 26,
+  12, 6, 27, 25, 76, 0, 0, 26, 25, 0,
+  0, 18, 0, 0, 77, 83, 0, 0, 0, 18,
+  0, 4, 54, 0, 0, 0, 24, 0, 25, 0,
+  15, 39, 25, 35, 17, 0, 0, 31, 47, 29,
+  0, 0, 0, 45, 0, 0, 0, 0, 38, 0,
+  3, 0, 0, 1, 0, 22, 25, 0, 0, 20,
+  4, 18, 11, 6, 0, 0, 0, 0, 60, 44,
+  0, 0, 0, 54, 0, 0, 0, 29, 17, 0,
+  3, 11, 34, 17, 0, 0, 58, 48, 0, 0,
+  0, 0, 53, 0, 0, 0, 74, 109, 0, 0,
+  46, 0, 0, 0, 0, 59, 0, 51, 0, 23,
+  0, 0, 0, 0, 78, 7, 34, 8, 0, 0,
+  0, 52, 29, 14, 74, 2, 53, 17, 8, 144,
+  9, 0, 46, 89, 0, 57, 27, 0, 12, 0,
+  0, 0, 31, 87, 0, 30, 0, 43, 20, 0,
+  0, 171, 0, 0, 22, 0, 7, 0, 0, 57,
+  123, 33, 0, 0, 0, 0, 0, 2, 0, 0,
+  0, 24, 0, 10, 20, 24, 0, 0, 14, 0,
+  0, 0, 0, 0, 0, 4, 58, 62, 28, 0,
+  51, 0, 0, 127, 0, 0, 28, 13, 0, 0,
+  0, 82, 0, 0, 9, 29, 31, 0, 0, 85,
+  28, 32, 0, 0, 13, 55, 0, 0, 0, 43,
+  0, 0, 0, 17, 44, 93, 0, 0, 24, 0,
+  15, 0, 0, 32, 0, 29, 0, 35, 0, 77,
+  0, 0, 138, 0, 12, 0, 0, 0, 0, 64,
+  0, 0, 81, 0, 9, 6, 12, 125, 8, 0,
+  33, 55, 0, 39, 22, 0, 0, 0, 0, 0,
+  28, 82, 0, 10, 0, 46, 0, 0, 0, 123,
+  0, 0, 55, 0, 11, 0, 0, 88, 63, 49,
+  0, 0, 27, 0, 0, 10, 0, 6, 1, 11,
+  0, 0, 9, 35, 24, 0, 11, 0, 0, 0,
+  0, 0, 0, 3, 9, 79, 0, 0, 30, 0,
+  26, 161, 0, 0, 0, 0, 0, 0, 49, 60,
+  0, 0, 11, 55, 0, 0, 7, 16, 0, 50,
+  0, 0, 0, 0, 0, 35, 21, 0, 0, 13,
+  0, 0, 0, 55, 0, 3, 0, 20, 0, 22,
+  0, 12, 34, 22, 0, 0, 13, 103, 4, 0,
+  17, 0, 10, 0, 46, 0, 0, 0, 0, 0,
+  54, 0, 0, 2, 0, 4, 0, 34, 24, 5,
+  0, 40, 0, 0, 0, 10, 0, 0, 18, 36,
+  19, 0, 31, 36, 38, 0, 0, 22, 13, 0,
+  4, 0, 0, 0, 1, 46, 1, 0, 0, 0,
+  0, 10, 0, 22, 0, 25, 23, 0, 0, 0,
+  5, 29, 102, 47, 32, 3, 54, 0, 0, 0,
+  37, 15, 0, 14, 83, 83, 12, 72, 44, 15,
+  0, 0, 20, 0, 22, 0, 23, 126, 0, 0,
+  0, 0, 39, 0, 24, 37, 34, 21, 0, 0,
+  35, 11, 0, 34, 52, 81, 0, 0, 0, 0,
+  0, 26, 0, 0, 0, 1, 0, 0, 1, 18,
+  42, 71, 0, 0, 11, 40, 0, 7, 106, 0,
+  38, 4, 10, 0, 0, 34, 61, 26, 20, 0,
+  27, 21, 0, 98, 0, 49, 51, 0, 0, 28,
+  54, 0, 44, 0, 0, 48, 15, 60, 0, 1,
+  2, 45, 68, 0, 14, 0, 0, 25, 0, 0,
+  81, 0, 11, 15, 12, 121, 4, 0, 0, 16,
+  0, 68, 74, 0, 26, 0, 17, 1, 24, 87,
+  0, 0, 20, 2, 10, 0, 0, 0, 0, 22,
+  0, 87, 35, 0, 20, 65, 14, 232, 0, 0,
+  1, 0, 0, 0, 0, 21, 0, 0, 0, 33,
+  62, 0, 0, 113, 15, 0, 0, 0, 0, 6,
+  0, 17, 8, 99, 0, 0, 0, 33, 0, 40,
+  0, 0, 0, 0, 0, 0, 0, 58, 44, 47,
+  7, 4, 0, 38, 0, 0, 142, 0, 48, 0,
+  21, 0, 27, 92, 17, 0, 115, 0, 0, 40,
+  0, 96, 83, 63, 62, 0, 0, 35, 43, 0,
+  0, 0, 0, 0, 46, 65, 0, 0, 0, 31,
+  0, 0, 7, 7, 0, 0, 70, 0, 52, 0,
+  0, 9, 17, 116, 2, 0, 0, 5, 18, 17,
+  0, 0, 0, 39, 0, 0, 0, 45, 36, 0,
+  13, 16, 0, 19, 0, 0, 0, 15, 0, 44,
+  0, 0, 0, 5, 19, 184, 0, 0, 0, 0,
+  0, 0, 30, 14, 0, 24, 4, 50, 5, 0,
+  21, 0, 0, 62, 18, 19, 0, 0, 0, 10,
+  18, 0, 0, 34, 0, 4, 0, 24, 0, 24,
+  0, 55, 0, 16, 0, 17, 43, 43, 0, 20,
+  0, 38, 14, 0, 0, 0, 9, 0, 19, 12,
+  5, 26, 0, 0, 6, 0, 0, 22, 22, 0,
+  30, 56, 37, 1, 2, 80, 0, 0, 0, 42,
+  0, 0, 13, 12, 24, 0, 22, 14, 2, 28,
+  1, 67, 43, 9, 35, 30, 0, 0, 7, 25,
+  0, 0, 0, 0, 0, 0, 0, 6, 0, 17,
+  0, 1, 0, 13, 0, 7, 81, 29, 34, 0,
+  48, 9, 42, 0, 38, 19, 0, 0, 42, 127,
+  15, 99, 80, 43, 0, 0, 43, 0, 32, 0,
+  35, 29, 0, 0, 11, 0, 41, 15, 0, 0,
+  0, 47, 24, 0, 52, 29, 0, 37, 5, 49,
+  69, 0, 20, 0, 0, 0, 0, 0, 0, 17,
+  0, 6, 19, 56, 44, 46, 0, 7, 4, 0,
+  0, 17, 32, 0, 50, 2, 0, 29, 21, 24,
+  0, 8, 0, 0, 52, 4, 27, 0, 0, 21,
+  45, 4, 6, 45, 10, 2, 0, 2, 0, 19,
+  40, 73, 0, 17, 5, 38, 21, 49, 107, 0,
+  0, 49, 0, 0, 90, 0, 23, 57, 7, 99,
+  1, 0, 25, 33, 41, 62, 122, 0, 7, 22,
+  36, 0, 0, 0, 0, 0, 0, 0, 13, 0,
+  43, 0, 45, 1, 13, 74, 17, 8, 86, 68,
+  23, 217, 0, 0, 29, 0, 0, 0, 32, 0,
+  0, 0, 31, 18, 66, 0, 0, 112, 15, 8,
+  7, 0, 0, 35, 0, 72, 0, 82, 0, 0,
+  0, 30, 0, 0, 1, 0, 0, 19, 0, 19,
+  0, 50, 59, 42, 0, 14, 0, 45, 0, 0,
+  97, 0, 62, 0, 33, 0, 0, 70, 0, 0,
+  53, 0, 0, 26, 12, 6, 27, 25, 76, 0,
+  0, 26, 25, 0, 0, 18, 0, 0, 77, 83,
+  0, 0, 0, 18, 0, 4, 54, 0, 0, 0,
+  24, 0, 25, 0, 15, 39, 25, 35, 17, 0,
+  0, 31, 47, 29, 0, 0, 0, 45, 0, 0,
+  0, 0, 38, 0, 3, 0, 0, 1, 0, 22,
+  25, 0, 0, 20, 0, 0, 0, 0, 1, 125,
+  0, 0, 0, 0, 0, 0, 59, 8, 0, 44,
+  12, 40, 18, 0, 40, 6, 0, 49, 0, 0,
+  0, 0, 0, 14, 40, 0, 0, 17, 0, 8,
+  0, 16, 0, 48, 35, 47, 0, 33, 1, 0,
+  7, 27, 0, 35, 0, 77, 28, 0, 14, 0,
+  38, 0, 36, 0, 0, 14, 0, 11, 0, 0,
+  0, 3, 8, 0, 16, 34, 27, 15, 0, 70,
+  0, 0, 0, 26, 7, 0, 14, 12, 42, 0,
+  12, 0, 8, 25, 0, 47, 52, 0, 15, 13,
+  0, 0, 17, 28, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 32, 29, 12, 0, 47, 0, 0,
+  66, 14, 50, 0, 35, 14, 18, 0, 67, 1,
+  0, 0, 28, 0, 51, 0, 0, 127, 0, 0,
+  28, 13, 0, 0, 0, 82, 0, 0, 9, 29,
+  31, 0, 0, 85, 28, 32, 0, 0, 13, 55,
+  0, 0, 0, 43, 0, 0, 0, 17, 44, 93,
+  0, 0, 24, 0, 15, 0, 0, 32, 0, 29,
+  0, 35, 0, 77, 0, 0, 138, 0, 12, 0,
+  0, 0, 0, 64, 0, 0, 81, 0, 9, 6,
+  12, 125, 8, 0, 33, 55, 0, 39, 22, 0,
+  0, 0, 0, 0, 28, 82, 0, 10, 0, 46,
+  0, 0, 0, 123, 0, 0, 55, 0, 11, 0,
+  0, 88, 63, 49, 0, 0, 27, 0, 0, 10,
+  0, 6, 1, 11, 0, 0, 9, 35, 24, 0,
+  11, 0, 0, 0, 0, 0, 0, 3, 9, 79,
+  0, 0, 30, 0, 26, 161, 0, 0, 0, 0,
+  0, 0, 49, 60, 0, 0, 11, 55, 0, 0,
+  7, 16, 0, 50, 0, 0, 0, 0, 0, 35,
+  21, 0, 0, 13, 0, 0, 0, 55, 0, 3,
+  0, 20, 0, 22, 0, 12, 34, 22, 0, 0,
+  13, 103, 4, 0, 17, 0, 10, 0, 46, 0,
+  0, 0, 0, 0, 54, 0, 0, 2, 0, 4,
+  0, 34, 24, 5, 0, 40, 0, 0, 0, 10,
+  0, 0, 18, 36, 19, 0, 31, 36, 38, 0,
+  0, 22, 13, 0, 4, 0, 0, 0, 1, 46,
+  1, 0, 0, 0, 0, 10, 0, 22, 0, 25,
+  23, 0, 0, 0, 5, 29, 102, 47, 32, 3,
+  54, 0, 0, 0, 37, 15, 0, 14, 0, 49,
+  11, 0, 44, 0, 25, 0, 19, 0, 0, 0,
+  81, 51, 5, 17, 15, 0, 0, 0, 3, 0,
+  0, 60, 21, 63, 0, 0, 0, 12, 63, 0,
+  0, 27, 12, 0, 0, 6, 0, 70, 0, 97,
+  10, 75, 53, 0, 0, 0, 0, 6, 0, 65,
+  94, 0, 0, 3, 21, 23, 4, 21, 0, 0,
+  0, 70, 0, 12, 8, 0, 0, 0, 0, 33,
+  0, 19, 20, 29, 0, 0, 0, 27, 44, 20,
+  19, 0, 78, 0, 29, 0, 66, 38, 0, 0,
+  42, 37, 0, 32, 0, 38, 3, 45, 0, 0,
+  0, 0, 0, 0, 3, 5, 71, 72, 88, 0,
+  0, 7, 31, 0, 0, 31, 64, 18, 57, 10,
+  85, 0, 91, 2, 0, 0, 35, 0, 20, 65,
+  14, 232, 0, 0, 1, 0, 0, 0, 0, 21,
+  0, 0, 0, 33, 62, 0, 0, 113, 15, 0,
+  0, 0, 0, 6, 0, 17, 8, 99, 0, 0,
+  0, 33, 0, 40, 0, 0, 0, 0, 0, 0,
+  0, 58, 44, 47, 7, 4, 0, 38, 0, 0,
+  142, 0, 48, 0, 21, 0, 27, 92, 17, 0,
+  115, 0, 0, 40, 0, 96, 83, 63, 62, 0,
+  0, 35, 43, 0, 0, 0, 0, 0, 46, 65,
+  0, 0, 0, 31, 0, 0, 7, 7, 0, 0,
+  70, 0, 52, 0, 0, 9, 17, 116, 2, 0,
+  0, 5, 18, 17, 0, 0, 0, 39, 0, 0,
+  0, 45, 36, 0, 13, 16, 0, 19, 0, 0,
+  0, 15, 0, 44, 0, 0, 0, 5, 19, 184,
+  0, 0, 0, 0, 0, 0, 30, 14, 0, 24,
+  4, 50, 5, 0, 21, 0, 0, 62, 18, 19,
+  0, 0, 0, 10, 18, 0, 0, 34, 0, 4,
+  0, 24, 0, 24, 0, 55, 0, 16, 0, 17,
+  43, 43, 0, 20, 0, 38, 14, 0, 0, 0,
+  9, 0, 19, 12, 5, 26, 0, 0, 6, 0,
+  0, 22, 22, 0, 30, 56, 37, 1, 2, 80,
+  0, 0, 0, 42, 0, 0, 13, 12, 24, 0,
+  22, 14, 2, 28, 1, 67, 43, 9, 35, 30,
+  0, 0, 7, 25, 0, 0, 0, 0, 0, 0,
+  0, 6, 0, 17, 0, 1, 0, 13, 0, 7,
+  81, 29, 34, 0, 48, 9, 42, 0, 38, 19,
+  0, 0, 0, 34, 49, 0, 25, 0, 17, 0,
+  0, 0, 0, 0, 29, 51, 2, 46, 15, 40,
+  0, 20, 33, 0, 79, 40, 0, 20, 0, 0,
+  0, 0, 25, 0, 0, 0, 0, 0, 0, 5,
+  0, 35, 63, 42, 0, 75, 56, 0, 0, 0,
+  0, 4, 0, 42, 63, 0, 1, 0, 44, 5,
+  9, 0, 0, 3, 0, 23, 0, 0, 26, 7,
+  0, 0, 0, 3, 4, 30, 12, 34, 0, 8,
+  0, 0, 40, 0, 0, 0, 68, 13, 0, 0,
+  40, 12, 0, 29, 32, 0, 0, 30, 0, 0,
+  0, 46, 0, 0, 0, 0, 5, 0, 0, 0,
+  0, 29, 58, 4, 0, 15, 30, 0, 26, 17,
+  54, 0, 15, 0, 9, 0, 76, 5, 0, 0,
+  17, 8, 86, 68, 23, 217, 0, 0, 29, 0,
+  0, 0, 32, 0, 0, 0, 31, 18, 66, 0,
+  0, 112, 15, 8, 7, 0, 0, 35, 0, 72,
+  0, 82, 0, 0, 0, 30, 0, 0, 1, 0,
+  0, 19, 0, 19, 0, 50, 59, 42, 0, 14,
+  0, 45, 0, 0, 97, 0, 62, 0, 33, 0,
+  0, 70, 0, 0, 53, 0, 0, 26, 12, 6,
+  27, 25, 76, 0, 0, 26, 25, 0, 0, 18,
+  0, 0, 77, 83, 0, 0, 0, 18, 0, 4,
+  54, 0, 0, 0, 24, 0, 25, 0, 15, 39,
+  25, 35, 17, 0, 0, 31, 47, 29, 0, 0,
+  0, 45, 0, 0, 0, 0, 38, 0, 3, 0,
+  0, 1, 0, 22, 25, 0, 0, 20, 0, 0,
+  0, 0, 1, 125, 0, 0, 0, 0, 0, 0,
+  59, 8, 0, 44, 12, 40, 18, 0, 40, 6,
+  0, 49, 0, 0, 0, 0, 0, 14, 40, 0,
+  0, 17, 0, 8, 0, 16, 0, 48, 35, 47,
+  0, 33, 1, 0, 7, 27, 0, 35, 0, 77,
+  28, 0, 14, 0, 38, 0, 36, 0, 0, 14,
+  0, 11, 0, 0, 0, 3, 8, 0, 16, 34,
+  27, 15, 0, 70, 0, 0, 0, 26, 7, 0,
+  14, 12, 42, 0, 12, 0, 8, 25, 0, 47,
+  52, 0, 15, 13, 0, 0, 17, 28, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 32, 29, 12,
+  0, 47, 0, 0, 66, 14, 50, 0, 35, 14,
+  18, 0, 67, 1, 0, 0, 0, 0, 77, 0,
+  0, 0, 2, 0, 0, 0, 0, 1, 29, 58,
+  0, 41, 0, 69, 29, 7, 59, 19, 117, 17,
+  0, 0, 0, 5, 0, 0, 15, 0, 0, 0,
+  0, 13, 0, 12, 0, 0, 66, 0, 0, 79,
+  32, 0, 0, 0, 0, 6, 0, 87, 7, 0,
+  39, 0, 49, 0, 7, 0, 0, 1, 10, 0,
+  77, 0, 0, 21, 0, 50, 0, 0, 2, 19,
+  0, 7, 0, 0, 0, 0, 19, 0, 2, 0,
+  62, 8, 0, 0, 25, 0, 0, 13, 0, 0,
+  16, 30, 0, 0, 0, 54, 3, 0, 0, 0,
+  20, 0, 0, 0, 0, 0, 62, 11, 0, 38,
+  13, 0, 89, 23, 44, 14, 34, 0, 0, 0,
+  57, 0, 15, 0, 0, 0, 30, 0, 26, 161,
+  0, 0, 0, 0, 0, 0, 49, 60, 0, 0,
+  11, 55, 0, 0, 7, 16, 0, 50, 0, 0,
+  0, 0, 0, 35, 21, 0, 0, 13, 0, 0,
+  0, 55, 0, 3, 0, 20, 0, 22, 0, 12,
+  34, 22, 0, 0, 13, 103, 4, 0, 17, 0,
+  10, 0, 46, 0, 0, 0, 0, 0, 54, 0,
+  0, 2, 0, 4, 0, 34, 24, 5, 0, 40,
+  0, 0, 0, 10, 0, 0, 18, 36, 19, 0,
+  31, 36, 38, 0, 0, 22, 13, 0, 4, 0,
+  0, 0, 1, 46, 1, 0, 0, 0, 0, 10,
+  0, 22, 0, 25, 23, 0, 0, 0, 5, 29,
+  102, 47, 32, 3, 54, 0, 0, 0, 37, 15,
+  0, 14, 0, 49, 11, 0, 44, 0, 25, 0,
+  19, 0, 0, 0, 81, 51, 5, 17, 15, 0,
+  0, 0, 3, 0, 0, 60, 21, 63, 0, 0,
+  0, 12, 63, 0, 0, 27, 12, 0, 0, 6,
+  0, 70, 0, 97, 10, 75, 53, 0, 0, 0,
+  0, 6, 0, 65, 94, 0, 0, 3, 21, 23,
+  4, 21, 0, 0, 0, 70, 0, 12, 8, 0,
+  0, 0, 0, 33, 0, 19, 20, 29, 0, 0,
+  0, 27, 44, 20, 19, 0, 78, 0, 29, 0,
+  66, 38, 0, 0, 42, 37, 0, 32, 0, 38,
+  3, 45, 0, 0, 0, 0, 0, 0, 3, 5,
+  71, 72, 88, 0, 0, 7, 31, 0, 0, 31,
+  64, 18, 57, 10, 85, 0, 91, 2, 0, 0,
+  0, 21, 76, 0, 26, 0, 1, 0, 0, 0,
+  0, 6, 28, 78, 0, 20, 4, 29, 21, 10,
+  35, 34, 113, 11, 0, 0, 0, 0, 0, 0,
+  18, 0, 0, 0, 0, 0, 0, 1, 0, 10,
+  66, 3, 0, 101, 57, 6, 0, 0, 0, 0,
+  0, 90, 1, 0, 17, 0, 40, 0, 25, 0,
+  0, 10, 7, 19, 34, 0, 0, 18, 0, 29,
+  0, 0, 0, 43, 3, 0, 0, 28, 0, 0,
+  37, 0, 22, 0, 65, 9, 0, 0, 20, 0,
+  0, 16, 13, 0, 0, 46, 0, 0, 0, 39,
+  0, 0, 0, 0, 1, 0, 0, 4, 0, 7,
+  72, 14, 0, 12, 20, 0, 52, 13, 51, 13,
+  13, 0, 0, 0, 64, 0, 0, 0, 0, 0,
+  0, 5, 19, 184, 0, 0, 0, 0, 0, 0,
+  30, 14, 0, 24, 4, 50, 5, 0, 21, 0,
+  0, 62, 18, 19, 0, 0, 0, 10, 18, 0,
+  0, 34, 0, 4, 0, 24, 0, 24, 0, 55,
+  0, 16, 0, 17, 43, 43, 0, 20, 0, 38,
+  14, 0, 0, 0, 9, 0, 19, 12, 5, 26,
+  0, 0, 6, 0, 0, 22, 22, 0, 30, 56,
+  37, 1, 2, 80, 0, 0, 0, 42, 0, 0,
+  13, 12, 24, 0, 22, 14, 2, 28, 1, 67,
+  43, 9, 35, 30, 0, 0, 7, 25, 0, 0,
+  0, 0, 0, 0, 0, 6, 0, 17, 0, 1,
+  0, 13, 0, 7, 81, 29, 34, 0, 48, 9,
+  42, 0, 38, 19, 0, 0, 0, 34, 49, 0,
+  25, 0, 17, 0, 0, 0, 0, 0, 29, 51,
+  2, 46, 15, 40, 0, 20, 33, 0, 79, 40,
+  0, 20, 0, 0, 0, 0, 25, 0, 0, 0,
+  0, 0, 0, 5, 0, 35, 63, 42, 0, 75,
+  56, 0, 0, 0, 0, 4, 0, 42, 63, 0,
+  1, 0, 44, 5, 9, 0, 0, 3, 0, 23,
+  0, 0, 26, 7, 0, 0, 0, 3, 4, 30,
+  12, 34, 0, 8, 0, 0, 40, 0, 0, 0,
+  68, 13, 0, 0, 40, 12, 0, 29, 32, 0,
+  0, 30, 0, 0, 0, 46, 0, 0, 0, 0,
+  5, 0, 0, 0, 0, 29, 58, 4, 0, 15,
+  30, 0, 26, 17, 54, 0, 15, 0, 9, 0,
+  76, 5, 0, 0, 10, 0, 77, 0, 9, 10,
+  0, 0, 4, 0, 0, 8, 3, 82, 0, 0,
+  0, 46, 42, 0, 45, 68, 136, 0, 0, 0,
+  0, 0, 0, 0, 3, 0, 0, 0, 0, 9,
+  0, 0, 0, 0, 33, 0, 0, 90, 40, 14,
+  0, 21, 0, 0, 0, 136, 0, 0, 74, 0,
+  41, 0, 36, 0, 0, 0, 35, 0, 125, 0,
+  0, 23, 0, 91, 0, 0, 13, 4, 0, 0,
+  7, 0, 0, 0, 15, 0, 23, 0, 45, 6,
+  0, 0, 20, 0, 0, 0, 0, 0, 24, 27,
+  0, 0, 0, 52, 15, 0, 0, 0, 14, 0,
+  0, 2, 0, 0, 69, 4, 0, 37, 12, 0,
+  118, 0, 23, 19, 24, 0, 0, 0, 53, 0,
+  0, 0, 0, 0, 0, 0, 1, 125, 0, 0,
+  0, 0, 0, 0, 59, 8, 0, 44, 12, 40,
+  18, 0, 40, 6, 0, 49, 0, 0, 0, 0,
+  0, 14, 40, 0, 0, 17, 0, 8, 0, 16,
+  0, 48, 35, 47, 0, 33, 1, 0, 7, 27,
+  0, 35, 0, 77, 28, 0, 14, 0, 38, 0,
+  36, 0, 0, 14, 0, 11, 0, 0, 0, 3,
+  8, 0, 16, 34, 27, 15, 0, 70, 0, 0,
+  0, 26, 7, 0, 14, 12, 42, 0, 12, 0,
+  8, 25, 0, 47, 52, 0, 15, 13, 0, 0,
+  17, 28, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 32, 29, 12, 0, 47, 0, 0, 66, 14,
+  50, 0, 35, 14, 18, 0, 67, 1, 0, 0,
+  0, 0, 77, 0, 0, 0, 2, 0, 0, 0,
+  0, 1, 29, 58, 0, 41, 0, 69, 29, 7,
+  59, 19, 117, 17, 0, 0, 0, 5, 0, 0,
+  15, 0, 0, 0, 0, 13, 0, 12, 0, 0,
+  66, 0, 0, 79, 32, 0, 0, 0, 0, 6,
+  0, 87, 7, 0, 39, 0, 49, 0, 7, 0,
+  0, 1, 10, 0, 77, 0, 0, 21, 0, 50,
+  0, 0, 2, 19, 0, 7, 0, 0, 0, 0,
+  19, 0, 2, 0, 62, 8, 0, 0, 25, 0,
+  0, 13, 0, 0, 16, 30, 0, 0, 0, 54,
+  3, 0, 0, 0, 20, 0, 0, 0, 0, 0,
+  62, 11, 0, 38, 13, 0, 89, 23, 44, 14,
+  34, 0, 0, 0, 57, 0, 15, 0, 25, 0,
+  64, 0, 17, 12, 0, 0, 23, 0, 0, 6,
+  16, 72, 0, 0, 0, 19, 42, 0, 48, 60,
+  61, 0, 0, 0, 0, 26, 0, 41, 0, 0,
+  0, 0, 0, 3, 0, 6, 0, 0, 0, 0,
+  0, 69, 18, 17, 0, 65, 0, 0, 0, 167,
+  0, 0, 66, 0, 29, 0, 4, 0, 0, 0,
+  24, 0, 113, 0, 0, 10, 0, 64, 0, 4,
+  0, 0, 0, 0, 0, 0, 0, 0, 12, 0,
+  12, 0, 32, 1, 0, 15, 43, 0, 26, 0,
+  0, 0, 27, 0, 11, 0, 0, 71, 39, 0,
+  0, 0, 13, 0, 0, 24, 30, 0, 73, 0,
+  0, 44, 14, 0, 155, 0, 5, 26, 74, 0,
+  0, 0, 54, 0, 0, 0, 0, 49, 11, 0,
+  44, 0, 25, 0, 19, 0, 0, 0, 81, 51,
+  5, 17, 15, 0, 0, 0, 3, 0, 0, 60,
+  21, 63, 0, 0, 0, 12, 63, 0, 0, 27,
+  12, 0, 0, 6, 0, 70, 0, 97, 10, 75,
+  53, 0, 0, 0, 0, 6, 0, 65, 94, 0,
+  0, 3, 21, 23, 4, 21, 0, 0, 0, 70,
+  0, 12, 8, 0, 0, 0, 0, 33, 0, 19,
+  20, 29, 0, 0, 0, 27, 44, 20, 19, 0,
+  78, 0, 29, 0, 66, 38, 0, 0, 42, 37,
+  0, 32, 0, 38, 3, 45, 0, 0, 0, 0,
+  0, 0, 3, 5, 71, 72, 88, 0, 0, 7,
+  31, 0, 0, 31, 64, 18, 57, 10, 85, 0,
+  91, 2, 0, 0, 0, 21, 76, 0, 26, 0,
+  1, 0, 0, 0, 0, 6, 28, 78, 0, 20,
+  4, 29, 21, 10, 35, 34, 113, 11, 0, 0,
+  0, 0, 0, 0, 18, 0, 0, 0, 0, 0,
+  0, 1, 0, 10, 66, 3, 0, 101, 57, 6,
+  0, 0, 0, 0, 0, 90, 1, 0, 17, 0,
+  40, 0, 25, 0, 0, 10, 7, 19, 34, 0,
+  0, 18, 0, 29, 0, 0, 0, 43, 3, 0,
+  0, 28, 0, 0, 37, 0, 22, 0, 65, 9,
+  0, 0, 20, 0, 0, 16, 13, 0, 0, 46,
+  0, 0, 0, 39, 0, 0, 0, 0, 1, 0,
+  0, 4, 0, 7, 72, 14, 0, 12, 20, 0,
+  52, 13, 51, 13, 13, 0, 0, 0, 64, 0,
+  0, 0, 4, 0, 79, 3, 6, 0, 0, 0,
+  14, 0, 0, 8, 0, 94, 0, 3, 0, 47,
+  45, 17, 53, 54, 102, 0, 0, 0, 0, 16,
+  0, 0, 0, 0, 0, 0, 0, 14, 0, 0,
+  0, 0, 37, 0, 0, 85, 38, 32, 0, 6,
+  0, 0, 0, 126, 0, 0, 66, 0, 24, 0,
+  20, 0, 0, 0, 29, 0, 99, 0, 0, 10,
+  0, 92, 0, 0, 18, 0, 0, 0, 4, 0,
+  0, 0, 11, 0, 20, 0, 18, 0, 0, 0,
+  39, 0, 0, 7, 0, 0, 22, 29, 2, 0,
+  4, 32, 23, 0, 0, 0, 28, 0, 0, 3,
+  17, 0, 84, 3, 0, 15, 21, 0, 112, 0,
+  10, 16, 55, 0, 0, 0, 57, 15, 0, 0,
+  0, 34, 49, 0, 25, 0, 17, 0, 0, 0,
+  0, 0, 29, 51, 2, 46, 15, 40, 0, 20,
+  33, 0, 79, 40, 0, 20, 0, 0, 0, 0,
+  25, 0, 0, 0, 0, 0, 0, 5, 0, 35,
+  63, 42, 0, 75, 56, 0, 0, 0, 0, 4,
+  0, 42, 63, 0, 1, 0, 44, 5, 9, 0,
+  0, 3, 0, 23, 0, 0, 26, 7, 0, 0,
+  0, 3, 4, 30, 12, 34, 0, 8, 0, 0,
+  40, 0, 0, 0, 68, 13, 0, 0, 40, 12,
+  0, 29, 32, 0, 0, 30, 0, 0, 0, 46,
+  0, 0, 0, 0, 5, 0, 0, 0, 0, 29,
+  58, 4, 0, 15, 30, 0, 26, 17, 54, 0,
+  15, 0, 9, 0, 76, 5, 0, 0, 10, 0,
+  77, 0, 9, 10, 0, 0, 4, 0, 0, 8,
+  3, 82, 0, 0, 0, 46, 42, 0, 45, 68,
+  136, 0, 0, 0, 0, 0, 0, 0, 3, 0,
+  0, 0, 0, 9, 0, 0, 0, 0, 33, 0,
+  0, 90, 40, 14, 0, 21, 0, 0, 0, 136,
+  0, 0, 74, 0, 41, 0, 36, 0, 0, 0,
+  35, 0, 125, 0, 0, 23, 0, 91, 0, 0,
+  13, 4, 0, 0, 7, 0, 0, 0, 15, 0,
+  23, 0, 45, 6, 0, 0, 20, 0, 0, 0,
+  0, 0, 24, 27, 0, 0, 0, 52, 15, 0,
+  0, 0, 14, 0, 0, 2, 0, 0, 69, 4,
+  0, 37, 12, 0, 118, 0, 23, 19, 24, 0,
+  0, 0, 53, 0, 0, 0, 0, 0, 45, 1,
+  17, 0, 0, 0, 31, 0, 0, 0, 20, 82,
+  0, 0, 0, 11, 29, 0, 23, 30, 25, 5,
+  0, 0, 20, 43, 0, 53, 0, 0, 0, 0,
+  0, 0, 0, 4, 0, 0, 0, 0, 0, 45,
+  6, 26, 0, 49, 0, 0, 0, 152, 0, 16,
+  45, 0, 12, 0, 0, 0, 0, 0, 8, 0,
+  63, 0, 0, 6, 0, 72, 0, 0, 8, 0,
+  0, 0, 0, 0, 0, 0, 13, 0, 1, 0,
+  0, 0, 0, 44, 53, 0, 44, 0, 0, 0,
+  18, 0, 36, 0, 0, 72, 23, 0, 15, 0,
+  42, 0, 1, 20, 65, 0, 81, 0, 0, 14,
+  40, 0, 141, 0, 0, 33, 89, 0, 30, 0,
+  58, 0, 0, 0, 0, 0, 77, 0, 0, 0,
+  2, 0, 0, 0, 0, 1, 29, 58, 0, 41,
+  0, 69, 29, 7, 59, 19, 117, 17, 0, 0,
+  0, 5, 0, 0, 15, 0, 0, 0, 0, 13,
+  0, 12, 0, 0, 66, 0, 0, 79, 32, 0,
+  0, 0, 0, 6, 0, 87, 7, 0, 39, 0,
+  49, 0, 7, 0, 0, 1, 10, 0, 77, 0,
+  0, 21, 0, 50, 0, 0, 2, 19, 0, 7,
+  0, 0, 0, 0, 19, 0, 2, 0, 62, 8,
+  0, 0, 25, 0, 0, 13, 0, 0, 16, 30,
+  0, 0, 0, 54, 3, 0, 0, 0, 20, 0,
+  0, 0, 0, 0, 62, 11, 0, 38, 13, 0,
+  89, 23, 44, 14, 34, 0, 0, 0, 57, 0,
+  15, 0, 25, 0, 64, 0, 17, 12, 0, 0,
+  23, 0, 0, 6, 16, 72, 0, 0, 0, 19,
+  42, 0, 48, 60, 61, 0, 0, 0, 0, 26,
+  0, 41, 0, 0, 0, 0, 0, 3, 0, 6,
+  0, 0, 0, 0, 0, 69, 18, 17, 0, 65,
+  0, 0, 0, 167, 0, 0, 66, 0, 29, 0,
+  4, 0, 0, 0, 24, 0, 113, 0, 0, 10,
+  0, 64, 0, 4, 0, 0, 0, 0, 0, 0,
+  0, 0, 12, 0, 12, 0, 32, 1, 0, 15,
+  43, 0, 26, 0, 0, 0, 27, 0, 11, 0,
+  0, 71, 39, 0, 0, 0, 13, 0, 0, 24,
+  30, 0, 73, 0, 0, 44, 14, 0, 155, 0,
+  5, 26, 74, 0, 0, 0, 54, 0, 0, 0,
+  0, 0, 0, 0, 12, 0, 0, 14, 34, 15,
+  0, 0, 26, 34, 0, 0, 0, 21, 29, 0,
+  8, 0, 0, 45, 0, 0, 48, 64, 6, 83,
+  0, 0, 55, 0, 0, 0, 0, 1, 0, 5,
+  0, 0, 0, 16, 10, 46, 0, 58, 0, 8,
+  7, 104, 37, 30, 33, 0, 15, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 6, 0, 0, 19,
+  0, 0, 21, 0, 0, 63, 0, 0, 0, 9,
+  39, 0, 0, 13, 0, 0, 0, 59, 43, 21,
+  114, 3, 0, 0, 28, 0, 36, 0, 0, 91,
+  40, 0, 32, 0, 7, 0, 28, 8, 75, 20,
+  37, 0, 0, 8, 5, 0, 131, 0, 0, 37,
+  103, 0, 101, 0, 70, 0, 0, 0, 0, 21,
+  76, 0, 26, 0, 1, 0, 0, 0, 0, 6,
+  28, 78, 0, 20, 4, 29, 21, 10, 35, 34,
+  113, 11, 0, 0, 0, 0, 0, 0, 18, 0,
+  0, 0, 0, 0, 0, 1, 0, 10, 66, 3,
+  0, 101, 57, 6, 0, 0, 0, 0, 0, 90,
+  1, 0, 17, 0, 40, 0, 25, 0, 0, 10,
+  7, 19, 34, 0, 0, 18, 0, 29, 0, 0,
+  0, 43, 3, 0, 0, 28, 0, 0, 37, 0,
+  22, 0, 65, 9, 0, 0, 20, 0, 0, 16,
+  13, 0, 0, 46, 0, 0, 0, 39, 0, 0,
+  0, 0, 1, 0, 0, 4, 0, 7, 72, 14,
+  0, 12, 20, 0, 52, 13, 51, 13, 13, 0,
+  0, 0, 64, 0, 0, 0, 4, 0, 79, 3,
+  6, 0, 0, 0, 14, 0, 0, 8, 0, 94,
+  0, 3, 0, 47, 45, 17, 53, 54, 102, 0,
+  0, 0, 0, 16, 0, 0, 0, 0, 0, 0,
+  0, 14, 0, 0, 0, 0, 37, 0, 0, 85,
+  38, 32, 0, 6, 0, 0, 0, 126, 0, 0,
+  66, 0, 24, 0, 20, 0, 0, 0, 29, 0,
+  99, 0, 0, 10, 0, 92, 0, 0, 18, 0,
+  0, 0, 4, 0, 0, 0, 11, 0, 20, 0,
+  18, 0, 0, 0, 39, 0, 0, 7, 0, 0,
+  22, 29, 2, 0, 4, 32, 23, 0, 0, 0,
+  28, 0, 0, 3, 17, 0, 84, 3, 0, 15,
+  21, 0, 112, 0, 10, 16, 55, 0, 0, 0,
+  57, 15, 0, 0, 2, 0, 42, 31, 0, 0,
+  14, 24, 59, 0, 4, 0, 0, 82, 0, 0,
+  0, 8, 26, 0, 35, 19, 23, 27, 0, 0,
+  38, 57, 187, 16, 19, 10, 32, 0, 0, 0,
+  0, 25, 0, 0, 0, 0, 0, 32, 38, 93,
+  0, 17, 0, 0, 3, 110, 0, 32, 59, 0,
+  9, 0, 14, 0, 0, 22, 8, 0, 4, 0,
+  20, 0, 0, 39, 0, 6, 29, 4, 0, 9,
+  34, 0, 0, 0, 24, 0, 1, 24, 0, 0,
+  0, 30, 103, 45, 40, 0, 0, 0, 18, 12,
+  59, 0, 26, 51, 26, 6, 18, 0, 84, 0,
+  42, 12, 87, 0, 79, 0, 10, 0, 1, 0,
+  115, 0, 0, 34, 41, 0, 5, 0, 59, 9,
+  0, 24, 10, 0, 77, 0, 9, 10, 0, 0,
+  4, 0, 0, 8, 3, 82, 0, 0, 0, 46,
+  42, 0, 45, 68, 136, 0, 0, 0, 0, 0,
+  0, 0, 3, 0, 0, 0, 0, 9, 0, 0,
+  0, 0, 33, 0, 0, 90, 40, 14, 0, 21,
+  0, 0, 0, 136, 0, 0, 74, 0, 41, 0,
+  36, 0, 0, 0, 35, 0, 125, 0, 0, 23,
+  0, 91, 0, 0, 13, 4, 0, 0, 7, 0,
+  0, 0, 15, 0, 23, 0, 45, 6, 0, 0,
+  20, 0, 0, 0, 0, 0, 24, 27, 0, 0,
+  0, 52, 15, 0, 0, 0, 14, 0, 0, 2,
+  0, 0, 69, 4, 0, 37, 12, 0, 118, 0,
+  23, 19, 24, 0, 0, 0, 53, 0, 0, 0,
+  0, 0, 45, 1, 17, 0, 0, 0, 31, 0,
+  0, 0, 20, 82, 0, 0, 0, 11, 29, 0,
+  23, 30, 25, 5, 0, 0, 20, 43, 0, 53,
+  0, 0, 0, 0, 0, 0, 0, 4, 0, 0,
+  0, 0, 0, 45, 6, 26, 0, 49, 0, 0,
+  0, 152, 0, 16, 45, 0, 12, 0, 0, 0,
+  0, 0, 8, 0, 63, 0, 0, 6, 0, 72,
+  0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
+  13, 0, 1, 0, 0, 0, 0, 44, 53, 0,
+  44, 0, 0, 0, 18, 0, 36, 0, 0, 72,
+  23, 0, 15, 0, 42, 0, 1, 20, 65, 0,
+  81, 0, 0, 14, 40, 0, 141, 0, 0, 33,
+  89, 0, 30, 0, 58, 0, 0, 0, 0, 0,
+  24, 23, 0, 0, 18, 24, 50, 29, 0, 0,
+  0, 30, 0, 5, 4, 7, 13, 0, 0, 0,
+  0, 53, 0, 0, 74, 59, 173, 47, 0, 0,
+  71, 0, 19, 0, 0, 20, 0, 24, 0, 0,
+  0, 0, 18, 88, 16, 0, 0, 16, 0, 67,
+  30, 34, 32, 0, 0, 4, 0, 6, 0, 39,
+  0, 0, 0, 0, 33, 0, 0, 14, 6, 12,
+  56, 3, 0, 51, 0, 0, 0, 3, 39, 0,
+  0, 33, 0, 0, 0, 48, 80, 41, 84, 0,
+  0, 0, 23, 0, 51, 0, 2, 59, 14, 2,
+  58, 0, 66, 2, 56, 3, 77, 5, 38, 0,
+  11, 0, 0, 0, 103, 0, 0, 17, 53, 0,
+  50, 0, 60, 0, 7, 11, 25, 0, 64, 0,
+  17, 12, 0, 0, 23, 0, 0, 6, 16, 72,
+  0, 0, 0, 19, 42, 0, 48, 60, 61, 0,
+  0, 0, 0, 26, 0, 41, 0, 0, 0, 0,
+  0, 3, 0, 6, 0, 0, 0, 0, 0, 69,
+  18, 17, 0, 65, 0, 0, 0, 167, 0, 0,
+  66, 0, 29, 0, 4, 0, 0, 0, 24, 0,
+  113, 0, 0, 10, 0, 64, 0, 4, 0, 0,
+  0, 0, 0, 0, 0, 0, 12, 0, 12, 0,
+  32, 1, 0, 15, 43, 0, 26, 0, 0, 0,
+  27, 0, 11, 0, 0, 71, 39, 0, 0, 0,
+  13, 0, 0, 24, 30, 0, 73, 0, 0, 44,
+  14, 0, 155, 0, 5, 26, 74, 0, 0, 0,
+  54, 0, 0, 0, 0, 0, 0, 0, 12, 0,
+  0, 14, 34, 15, 0, 0, 26, 34, 0, 0,
+  0, 21, 29, 0, 8, 0, 0, 45, 0, 0,
+  48, 64, 6, 83, 0, 0, 55, 0, 0, 0,
+  0, 1, 0, 5, 0, 0, 0, 16, 10, 46,
+  0, 58, 0, 8, 7, 104, 37, 30, 33, 0,
+  15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  6, 0, 0, 19, 0, 0, 21, 0, 0, 63,
+  0, 0, 0, 9, 39, 0, 0, 13, 0, 0,
+  0, 59, 43, 21, 114, 3, 0, 0, 28, 0,
+  36, 0, 0, 91, 40, 0, 32, 0, 7, 0,
+  28, 8, 75, 20, 37, 0, 0, 8, 5, 0,
+  131, 0, 0, 37, 103, 0, 101, 0, 70, 0,
+  0, 0, 0, 6, 23, 5, 0, 0, 44, 22,
+  34, 36, 0, 0, 1, 0, 0, 41, 20, 23,
+  3, 8, 0, 0, 0, 69, 18, 19, 51, 49,
+  164, 7, 0, 0, 85, 0, 15, 0, 0, 31,
+  6, 63, 0, 3, 29, 0, 23, 56, 20, 0,
+  0, 47, 0, 43, 48, 47, 7, 0, 0, 20,
+  0, 28, 0, 23, 0, 0, 0, 3, 58, 0,
+  2, 0, 18, 22, 54, 25, 23, 58, 0, 0,
+  0, 13, 76, 0, 7, 17, 0, 0, 4, 37,
+  62, 48, 83, 0, 0, 0, 8, 13, 24, 0,
+  0, 55, 0, 0, 26, 0, 38, 0, 56, 0,
+  44, 17, 29, 0, 10, 0, 0, 0, 37, 0,
+  0, 16, 21, 0, 77, 0, 71, 0, 5, 0,
+  4, 0, 79, 3, 6, 0, 0, 0, 14, 0,
+  0, 8, 0, 94, 0, 3, 0, 47, 45, 17,
+  53, 54, 102, 0, 0, 0, 0, 16, 0, 0,
+  0, 0, 0, 0, 0, 14, 0, 0, 0, 0,
+  37, 0, 0, 85, 38, 32, 0, 6, 0, 0,
+  0, 126, 0, 0, 66, 0, 24, 0, 20, 0,
+  0, 0, 29, 0, 99, 0, 0, 10, 0, 92,
+  0, 0, 18, 0, 0, 0, 4, 0, 0, 0,
+  11, 0, 20, 0, 18, 0, 0, 0, 39, 0,
+  0, 7, 0, 0, 22, 29, 2, 0, 4, 32,
+  23, 0, 0, 0, 28, 0, 0, 3, 17, 0,
+  84, 3, 0, 15, 21, 0, 112, 0, 10, 16,
+  55, 0, 0, 0, 57, 15, 0, 0, 2, 0,
+  42, 31, 0, 0, 14, 24, 59, 0, 4, 0,
+  0, 82, 0, 0, 0, 8, 26, 0, 35, 19,
+  23, 27, 0, 0, 38, 57, 187, 16, 19, 10,
+  32, 0, 0, 0, 0, 25, 0, 0, 0, 0,
+  0, 32, 38, 93, 0, 17, 0, 0, 3, 110,
+  0, 32, 59, 0, 9, 0, 14, 0, 0, 22,
+  8, 0, 4, 0, 20, 0, 0, 39, 0, 6,
+  29, 4, 0, 9, 34, 0, 0, 0, 24, 0,
+  1, 24, 0, 0, 0, 30, 103, 45, 40, 0,
+  0, 0, 18, 12, 59, 0, 26, 51, 26, 6,
+  18, 0, 84, 0, 42, 12, 87, 0, 79, 0,
+  10, 0, 1, 0, 115, 0, 0, 34, 41, 0,
+  5, 0, 59, 9, 0, 24, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 45, 1, 17, 0,
+  0, 0, 31, 0, 0, 0, 20, 82, 0, 0,
+  0, 11, 29, 0, 23, 30, 25, 5, 0, 0,
+  20, 43, 0, 53, 0, 0, 0, 0, 0, 0,
+  0, 4, 0, 0, 0, 0, 0, 45, 6, 26,
+  0, 49, 0, 0, 0, 152, 0, 16, 45, 0,
+  12, 0, 0, 0, 0, 0, 8, 0, 63, 0,
+  0, 6, 0, 72, 0, 0, 8, 0, 0, 0,
+  0, 0, 0, 0, 13, 0, 1, 0, 0, 0,
+  0, 44, 53, 0, 44, 0, 0, 0, 18, 0,
+  36, 0, 0, 72, 23, 0, 15, 0, 42, 0,
+  1, 20, 65, 0, 81, 0, 0, 14, 40, 0,
+  141, 0, 0, 33, 89, 0, 30, 0, 58, 0,
+  0, 0, 0, 0, 24, 23, 0, 0, 18, 24,
+  50, 29, 0, 0, 0, 30, 0, 5, 4, 7,
+  13, 0, 0, 0, 0, 53, 0, 0, 74, 59,
+  173, 47, 0, 0, 71, 0, 19, 0, 0, 20,
+  0, 24, 0, 0, 0, 0, 18, 88, 16, 0,
+  0, 16, 0, 67, 30, 34, 32, 0, 0, 4,
+  0, 6, 0, 39, 0, 0, 0, 0, 33, 0,
+  0, 14, 6, 12, 56, 3, 0, 51, 0, 0,
+  0, 3, 39, 0, 0, 33, 0, 0, 0, 48,
+  80, 41, 84, 0, 0, 0, 23, 0, 51, 0,
+  2, 59, 14, 2, 58, 0, 66, 2, 56, 3,
+  77, 5, 38, 0, 11, 0, 0, 0, 103, 0,
+  0, 17, 53, 0, 50, 0, 60, 0, 7, 11,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 12, 0, 0, 14, 34, 15, 0, 0,
+  26, 34, 0, 0, 0, 21, 29, 0, 8, 0,
+  0, 45, 0, 0, 48, 64, 6, 83, 0, 0,
+  55, 0, 0, 0, 0, 1, 0, 5, 0, 0,
+  0, 16, 10, 46, 0, 58, 0, 8, 7, 104,
+  37, 30, 33, 0, 15, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 6, 0, 0, 19, 0, 0,
+  21, 0, 0, 63, 0, 0, 0, 9, 39, 0,
+  0, 13, 0, 0, 0, 59, 43, 21, 114, 3,
+  0, 0, 28, 0, 36, 0, 0, 91, 40, 0,
+  32, 0, 7, 0, 28, 8, 75, 20, 37, 0,
+  0, 8, 5, 0, 131, 0, 0, 37, 103, 0,
+  101, 0, 70, 0, 0, 0, 0, 6, 23, 5,
+  0, 0, 44, 22, 34, 36, 0, 0, 1, 0,
+  0, 41, 20, 23, 3, 8, 0, 0, 0, 69,
+  18, 19, 51, 49, 164, 7, 0, 0, 85, 0,
+  15, 0, 0, 31, 6, 63, 0, 3, 29, 0,
+  23, 56, 20, 0, 0, 47, 0, 43, 48, 47,
+  7, 0, 0, 20, 0, 28, 0, 23, 0, 0,
+  0, 3, 58, 0, 2, 0, 18, 22, 54, 25,
+  23, 58, 0, 0, 0, 13, 76, 0, 7, 17,
+  0, 0, 4, 37, 62, 48, 83, 0, 0, 0,
+  8, 13, 24, 0, 0, 55, 0, 0, 26, 0,
+  38, 0, 56, 0, 44, 17, 29, 0, 10, 0,
+  0, 0, 37, 0, 0, 16, 21, 0, 77, 0,
+  71, 0, 5, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 62, 32, 0, 2, 1, 44, 3, 0, 0,
+  16, 4, 12, 0, 5, 53, 33, 30, 0, 74,
+  61, 0, 71, 46, 0, 36, 0, 3, 111, 34,
+  1, 0, 57, 0, 53, 22, 0, 16, 0, 48,
+  40, 30, 5, 36, 99, 16, 0, 12, 0, 8,
+  1, 0, 56, 0, 0, 0, 43, 0, 7, 33,
+  9, 0, 16, 0, 0, 0, 18, 21, 0, 0,
+  8, 32, 42, 43, 43, 31, 0, 15, 0, 0,
+  70, 13, 10, 0, 12, 12, 0, 0, 50, 9,
+  2, 0, 16, 0, 5, 73, 0, 0, 8, 21,
+  2, 0, 0, 16, 17, 0, 77, 9, 0, 22,
+  29, 1, 0, 33, 0, 0, 0, 15, 0, 33,
+  26, 0, 0, 0, 28, 0, 14, 0, 5, 45,
+  49, 8, 0, 13, 12, 23, 0, 0, 0, 49,
+  90, 0, 0, 29, 44, 13, 0, 25, 68, 58,
+  82, 13, 0, 0, 0, 11, 0, 0, 0, 0,
+  81, 0, 34, 31, 0, 20, 0, 59, 2, 29,
+  0, 28, 67, 52, 0, 60, 0, 43, 0, 42,
+  24, 0, 22, 0, 17, 0, 7, 0, 0, 0,
+  0, 9, 8, 0, 0, 0, 16, 0, 14, 13,
+  19, 19, 30, 0, 40, 53, 0, 19, 43, 0,
+  42, 0, 0, 11, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 33, 18, 0, 37, 45, 21, 0,
+  0, 23, 29, 0, 60, 0, 0, 7, 11, 13,
+  0, 17, 0, 0, 0, 0, 1, 9, 37, 0,
+  7, 0, 52, 0, 8, 2, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 74, 43, 0, 0, 0,
+  41, 0, 0, 0, 0, 15, 3, 0, 14, 72,
+  38, 47, 0, 64, 66, 0, 81, 51, 0, 26,
+  10, 14, 118, 35, 2, 0, 62, 0, 42, 8,
+  0, 26, 7, 52, 32, 25, 0, 26, 85, 30,
+  0, 8, 0, 25, 0, 13, 61, 0, 0, 0,
+  25, 0, 4, 20, 16, 0, 7, 0, 0, 0,
+  21, 2, 0, 0, 14, 32, 32, 38, 42, 30,
+  5, 5, 0, 0, 76, 3, 4, 0, 0, 15,
+  0, 0, 64, 23, 0, 0, 7, 0, 8, 49,
+  0, 0, 22, 10, 3, 0, 1, 17, 39, 0,
+  77, 0, 0, 43, 30, 0, 0, 41, 0, 0,
+  0, 3, 0, 15, 30, 0, 0, 0, 22, 0,
+  36, 0, 4, 47, 62, 10, 0, 19, 11, 10,
+  1, 0, 0, 51, 73, 0, 0, 33, 47, 24,
+  0, 20, 69, 64, 93, 12, 0, 0, 0, 23,
+  0, 0, 0, 0, 74, 0, 23, 28, 0, 28,
+  0, 48, 1, 24, 0, 19, 53, 57, 0, 57,
+  0, 37, 0, 54, 25, 0, 42, 0, 29, 0,
+  2, 0, 1, 0, 0, 20, 15, 0, 0, 0,
+  26, 0, 13, 15, 11, 22, 32, 0, 46, 51,
+  0, 12, 44, 0, 35, 0, 0, 8, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 24, 31, 0,
+  40, 41, 11, 0, 10, 24, 51, 0, 57, 0,
+  0, 3, 17, 15, 0, 12, 0, 0, 7, 0,
+  0, 7, 15, 4, 0, 0, 47, 0, 18, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 79,
+  42, 0, 0, 0, 53, 0, 5, 0, 0, 37,
+  2, 1, 18, 62, 41, 51, 0, 55, 86, 0,
+  87, 50, 0, 11, 5, 15, 128, 37, 1, 0,
+  72, 0, 36, 0, 0, 27, 0, 45, 39, 32,
+  0, 35, 80, 55, 0, 7, 0, 21, 12, 25,
+  62, 0, 16, 0, 27, 0, 29, 0, 13, 0,
+  11, 0, 0, 0, 25, 0, 9, 0, 3, 35,
+  41, 39, 37, 34, 23, 0, 0, 8, 79, 22,
+  1, 0, 0, 13, 0, 0, 82, 36, 0, 0,
+  20, 0, 0, 51, 0, 0, 48, 11, 5, 0,
+  0, 23, 29, 0, 77, 0, 0, 50, 18, 0,
+  0, 42, 0, 0, 0, 4, 5, 13, 24, 0,
+  0, 0, 28, 0, 34, 0, 7, 54, 57, 12,
+  0, 23, 17, 14, 2, 0, 0, 54, 68, 12,
+  2, 19, 58, 30, 0, 13, 72, 61, 94, 10,
+  0, 0, 0, 26, 0, 0, 0, 5, 68, 0,
+  20, 19, 0, 31, 0, 50, 4, 41, 0, 19,
+  53, 58, 0, 66, 0, 27, 0, 55, 24, 0,
+  51, 0, 26, 0, 10, 0, 0, 0, 0, 18,
+  3, 0, 0, 0, 34, 0, 14, 26, 9, 11,
+  35, 0, 48, 32, 0, 34, 37, 0, 35, 0,
+  0, 7, 0, 0, 0, 5, 0, 0, 0, 0,
+  0, 28, 25, 0, 59, 36, 0, 0, 14, 23,
+  43, 0, 49, 0, 0, 6, 11, 5, 0, 11,
+  0, 0, 8, 0, 8, 0, 0, 4, 5, 0,
+  45, 0, 20, 0, 0, 62, 32, 0, 2, 1,
+  44, 3, 0, 0, 16, 4, 12, 0, 5, 53,
+  33, 30, 0, 74, 61, 0, 71, 46, 0, 36,
+  0, 3, 111, 34, 1, 0, 57, 0, 53, 22,
+  0, 16, 0, 48, 40, 30, 5, 36, 99, 16,
+  0, 12, 0, 8, 1, 0, 56, 0, 0, 0,
+  43, 0, 7, 33, 9, 0, 16, 0, 0, 0,
+  18, 21, 0, 0, 8, 32, 42, 43, 43, 31,
+  0, 15, 0, 0, 70, 13, 10, 0, 12, 12,
+  0, 0, 50, 9, 2, 0, 16, 0, 5, 73,
+  0, 0, 8, 21, 2, 0, 0, 16, 17, 0,
+  77, 9, 0, 22, 29, 1, 0, 33, 0, 0,
+  0, 15, 0, 33, 26, 0, 0, 0, 28, 0,
+  14, 0, 5, 45, 49, 8, 0, 13, 12, 23,
+  0, 0, 0, 49, 90, 0, 0, 29, 44, 13,
+  0, 25, 68, 58, 82, 13, 0, 0, 0, 11,
+  0, 0, 0, 0, 81, 0, 34, 31, 0, 20,
+  0, 59, 2, 29, 0, 28, 67, 52, 0, 60,
+  0, 43, 0, 42, 24, 0, 22, 0, 17, 0,
+  7, 0, 0, 0, 0, 9, 8, 0, 0, 0,
+  16, 0, 14, 13, 19, 19, 30, 0, 40, 53,
+  0, 19, 43, 0, 42, 0, 0, 11, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 33, 18, 0,
+  37, 45, 21, 0, 0, 23, 29, 0, 60, 0,
+  0, 7, 11, 13, 0, 17, 0, 0, 0, 0,
+  1, 9, 37, 0, 7, 0, 52, 0, 8, 2,
+  2, 29, 35, 14, 0, 2, 25, 15, 25, 0,
+  0, 41, 100, 0, 19, 33, 52, 0, 0, 0,
+  0, 93, 0, 8, 42, 0, 0, 23, 0, 0,
+  0, 43, 78, 0, 33, 0, 0, 18, 0, 68,
+  0, 56, 40, 13, 39, 47, 17, 12, 0, 48,
+  0, 63, 25, 25, 42, 0, 13, 0, 12, 0,
+  4, 7, 0, 68, 0, 15, 1, 0, 32, 0,
+  7, 15, 0, 11, 0, 0, 44, 48, 0, 33,
+  43, 0, 60, 25, 0, 0, 0, 0, 0, 17,
+  0, 0, 0, 3, 0, 32, 43, 0, 2, 82,
+  3, 0, 8, 22, 34, 0, 25, 0, 0, 0,
+  17, 10, 0, 0, 0, 0, 0, 0, 2, 15,
+  15, 5, 38, 0, 55, 0, 13, 0, 0, 74,
+  43, 0, 0, 0, 41, 0, 0, 0, 0, 15,
+  3, 0, 14, 72, 38, 47, 0, 64, 66, 0,
+  81, 51, 0, 26, 10, 14, 118, 35, 2, 0,
+  62, 0, 42, 8, 0, 26, 7, 52, 32, 25,
+  0, 26, 85, 30, 0, 8, 0, 25, 0, 13,
+  61, 0, 0, 0, 25, 0, 4, 20, 16, 0,
+  7, 0, 0, 0, 21, 2, 0, 0, 14, 32,
+  32, 38, 42, 30, 5, 5, 0, 0, 76, 3,
+  4, 0, 0, 15, 0, 0, 64, 23, 0, 0,
+  7, 0, 8, 49, 0, 0, 22, 10, 3, 0,
+  1, 17, 39, 0, 77, 0, 0, 43, 30, 0,
+  0, 41, 0, 0, 0, 3, 0, 15, 30, 0,
+  0, 0, 22, 0, 36, 0, 4, 47, 62, 10,
+  0, 19, 11, 10, 1, 0, 0, 51, 73, 0,
+  0, 33, 47, 24, 0, 20, 69, 64, 93, 12,
+  0, 0, 0, 23, 0, 0, 0, 0, 74, 0,
+  23, 28, 0, 28, 0, 48, 1, 24, 0, 19,
+  53, 57, 0, 57, 0, 37, 0, 54, 25, 0,
+  42, 0, 29, 0, 2, 0, 1, 0, 0, 20,
+  15, 0, 0, 0, 26, 0, 13, 15, 11, 22,
+  32, 0, 46, 51, 0, 12, 44, 0, 35, 0,
+  0, 8, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 24, 31, 0, 40, 41, 11, 0, 10, 24,
+  51, 0, 57, 0, 0, 3, 17, 15, 0, 12,
+  0, 0, 7, 0, 0, 7, 15, 4, 0, 0,
+  47, 0, 18, 0, 3, 30, 27, 20, 0, 12,
+  23, 23, 27, 0, 0, 40, 83, 0, 11, 31,
+  57, 0, 0, 0, 0, 92, 0, 1, 37, 0,
+  0, 25, 0, 0, 0, 50, 77, 0, 34, 0,
+  0, 19, 0, 54, 0, 46, 24, 10, 34, 52,
+  12, 15, 0, 33, 0, 55, 12, 26, 53, 0,
+  30, 0, 10, 0, 0, 13, 0, 58, 0, 13,
+  0, 0, 32, 0, 13, 16, 12, 11, 0, 0,
+  49, 39, 0, 32, 30, 0, 50, 41, 0, 0,
+  7, 0, 0, 13, 0, 0, 0, 16, 0, 30,
+  52, 0, 6, 80, 2, 0, 18, 20, 43, 0,
+  29, 0, 4, 0, 21, 11, 0, 0, 0, 0,
+  0, 0, 0, 11, 4, 11, 36, 0, 51, 0,
+  18, 0, 0, 79, 42, 0, 0, 0, 53, 0,
+  5, 0, 0, 37, 2, 1, 18, 62, 41, 51,
+  0, 55, 86, 0, 87, 50, 0, 11, 5, 15,
+  128, 37, 1, 0, 72, 0, 36, 0, 0, 27,
+  0, 45, 39, 32, 0, 35, 80, 55, 0, 7,
+  0, 21, 12, 25, 62, 0, 16, 0, 27, 0,
+  29, 0, 13, 0, 11, 0, 0, 0, 25, 0,
+  9, 0, 3, 35, 41, 39, 37, 34, 23, 0,
+  0, 8, 79, 22, 1, 0, 0, 13, 0, 0,
+  82, 36, 0, 0, 20, 0, 0, 51, 0, 0,
+  48, 11, 5, 0, 0, 23, 29, 0, 77, 0,
+  0, 50, 18, 0, 0, 42, 0, 0, 0, 4,
+  5, 13, 24, 0, 0, 0, 28, 0, 34, 0,
+  7, 54, 57, 12, 0, 23, 17, 14, 2, 0,
+  0, 54, 68, 12, 2, 19, 58, 30, 0, 13,
+  72, 61, 94, 10, 0, 0, 0, 26, 0, 0,
+  0, 5, 68, 0, 20, 19, 0, 31, 0, 50,
+  4, 41, 0, 19, 53, 58, 0, 66, 0, 27,
+  0, 55, 24, 0, 51, 0, 26, 0, 10, 0,
+  0, 0, 0, 18, 3, 0, 0, 0, 34, 0,
+  14, 26, 9, 11, 35, 0, 48, 32, 0, 34,
+  37, 0, 35, 0, 0, 7, 0, 0, 0, 5,
+  0, 0, 0, 0, 0, 28, 25, 0, 59, 36,
+  0, 0, 14, 23, 43, 0, 49, 0, 0, 6,
+  11, 5, 0, 11, 0, 0, 8, 0, 8, 0,
+  0, 4, 5, 0, 45, 0, 20, 0, 10, 27,
+  29, 24, 0, 21, 22, 22, 24, 0, 0, 43,
+  79, 0, 6, 26, 56, 0, 0, 0, 0, 87,
+  1, 0, 41, 0, 0, 30, 0, 1, 0, 60,
+  72, 0, 24, 0, 0, 23, 0, 54, 0, 47,
+  13, 10, 23, 49, 26, 18, 0, 30, 0, 52,
+  4, 24, 54, 0, 32, 0, 10, 0, 1, 11,
+  0, 48, 0, 8, 0, 0, 39, 0, 18, 26,
+  11, 0, 0, 2, 47, 27, 0, 46, 24, 0,
+  46, 46, 0, 0, 13, 0, 0, 18, 0, 0,
+  0, 23, 0, 24, 55, 0, 15, 78, 0, 0,
+  25, 19, 40, 0, 26, 0, 5, 0, 17, 8,
+  0, 0, 0, 0, 7, 0, 0, 4, 0, 11,
+  36, 0, 55, 0, 17, 0, 5, 45, 49, 8,
+  0, 13, 12, 23, 0, 0, 0, 49, 90, 0,
+  0, 29, 44, 13, 0, 25, 68, 58, 82, 13,
+  0, 0, 0, 11, 0, 0, 0, 0, 81, 0,
+  34, 31, 0, 20, 0, 59, 2, 29, 0, 28,
+  67, 52, 0, 60, 0, 43, 0, 42, 24, 0,
+  22, 0, 17, 0, 7, 0, 0, 0, 0, 9,
+  8, 0, 0, 0, 16, 0, 14, 13, 19, 19,
+  30, 0, 40, 53, 0, 19, 43, 0, 42, 0,
+  0, 11, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 33, 18, 0, 37, 45, 21, 0, 0, 23,
+  29, 0, 60, 0, 0, 7, 11, 13, 0, 17,
+  0, 0, 0, 0, 1, 9, 37, 0, 7, 0,
+  52, 0, 8, 2, 2, 29, 35, 14, 0, 2,
+  25, 15, 25, 0, 0, 41, 100, 0, 19, 33,
+  52, 0, 0, 0, 0, 93, 0, 8, 42, 0,
+  0, 23, 0, 0, 0, 43, 78, 0, 33, 0,
+  0, 18, 0, 68, 0, 56, 40, 13, 39, 47,
+  17, 12, 0, 48, 0, 63, 25, 25, 42, 0,
+  13, 0, 12, 0, 4, 7, 0, 68, 0, 15,
+  1, 0, 32, 0, 7, 15, 0, 11, 0, 0,
+  44, 48, 0, 33, 43, 0, 60, 25, 0, 0,
+  0, 0, 0, 17, 0, 0, 0, 3, 0, 32,
+  43, 0, 2, 82, 3, 0, 8, 22, 34, 0,
+  25, 0, 0, 0, 17, 10, 0, 0, 0, 0,
+  0, 0, 2, 15, 15, 5, 38, 0, 55, 0,
+  13, 0, 0, 0, 0, 2, 0, 130, 10, 0,
+  4, 0, 0, 17, 27, 0, 0, 13, 0, 0,
+  0, 0, 39, 101, 22, 12, 0, 0, 0, 0,
+  0, 3, 0, 24, 35, 28, 1, 0, 0, 22,
+  0, 43, 0, 20, 0, 45, 17, 92, 24, 56,
+  0, 1, 0, 50, 0, 0, 17, 0, 51, 0,
+  51, 0, 0, 57, 0, 0, 72, 8, 0, 8,
+  34, 0, 64, 5, 28, 6, 0, 15, 34, 35,
+  0, 21, 42, 0, 36, 58, 0, 0, 16, 0,
+  0, 0, 0, 14, 4, 0, 0, 35, 0, 0,
+  0, 63, 44, 0, 0, 33, 35, 0, 21, 0,
+  0, 0, 3, 0, 0, 32, 0, 0, 109, 11,
+  25, 17, 0, 0, 0, 0, 15, 0, 0, 0,
+  4, 47, 62, 10, 0, 19, 11, 10, 1, 0,
+  0, 51, 73, 0, 0, 33, 47, 24, 0, 20,
+  69, 64, 93, 12, 0, 0, 0, 23, 0, 0,
+  0, 0, 74, 0, 23, 28, 0, 28, 0, 48,
+  1, 24, 0, 19, 53, 57, 0, 57, 0, 37,
+  0, 54, 25, 0, 42, 0, 29, 0, 2, 0,
+  1, 0, 0, 20, 15, 0, 0, 0, 26, 0,
+  13, 15, 11, 22, 32, 0, 46, 51, 0, 12,
+  44, 0, 35, 0, 0, 8, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 24, 31, 0, 40, 41,
+  11, 0, 10, 24, 51, 0, 57, 0, 0, 3,
+  17, 15, 0, 12, 0, 0, 7, 0, 0, 7,
+  15, 4, 0, 0, 47, 0, 18, 0, 3, 30,
+  27, 20, 0, 12, 23, 23, 27, 0, 0, 40,
+  83, 0, 11, 31, 57, 0, 0, 0, 0, 92,
+  0, 1, 37, 0, 0, 25, 0, 0, 0, 50,
+  77, 0, 34, 0, 0, 19, 0, 54, 0, 46,
+  24, 10, 34, 52, 12, 15, 0, 33, 0, 55,
+  12, 26, 53, 0, 30, 0, 10, 0, 0, 13,
+  0, 58, 0, 13, 0, 0, 32, 0, 13, 16,
+  12, 11, 0, 0, 49, 39, 0, 32, 30, 0,
+  50, 41, 0, 0, 7, 0, 0, 13, 0, 0,
+  0, 16, 0, 30, 52, 0, 6, 80, 2, 0,
+  18, 20, 43, 0, 29, 0, 4, 0, 21, 11,
+  0, 0, 0, 0, 0, 0, 0, 11, 4, 11,
+  36, 0, 51, 0, 18, 0, 0, 0, 0, 5,
+  0, 140, 8, 5, 3, 0, 0, 23, 36, 0,
+  0, 10, 2, 0, 0, 0, 35, 102, 17, 9,
+  0, 0, 0, 0, 0, 21, 0, 23, 35, 21,
+  4, 1, 0, 25, 0, 41, 0, 16, 0, 48,
+  13, 84, 13, 57, 0, 3, 0, 61, 0, 0,
+  24, 0, 45, 0, 39, 0, 0, 51, 0, 0,
+  78, 3, 0, 20, 24, 0, 67, 6, 31, 2,
+  0, 19, 16, 27, 0, 18, 39, 0, 33, 59,
+  0, 0, 10, 0, 0, 0, 0, 8, 0, 0,
+  12, 34, 0, 0, 0, 66, 43, 0, 0, 31,
+  31, 0, 26, 0, 0, 0, 14, 0, 0, 24,
+  0, 0, 117, 2, 21, 20, 0, 0, 0, 0,
+  24, 0, 0, 0, 7, 54, 57, 12, 0, 23,
+  17, 14, 2, 0, 0, 54, 68, 12, 2, 19,
+  58, 30, 0, 13, 72, 61, 94, 10, 0, 0,
+  0, 26, 0, 0, 0, 5, 68, 0, 20, 19,
+  0, 31, 0, 50, 4, 41, 0, 19, 53, 58,
+  0, 66, 0, 27, 0, 55, 24, 0, 51, 0,
+  26, 0, 10, 0, 0, 0, 0, 18, 3, 0,
+  0, 0, 34, 0, 14, 26, 9, 11, 35, 0,
+  48, 32, 0, 34, 37, 0, 35, 0, 0, 7,
+  0, 0, 0, 5, 0, 0, 0, 0, 0, 28,
+  25, 0, 59, 36, 0, 0, 14, 23, 43, 0,
+  49, 0, 0, 6, 11, 5, 0, 11, 0, 0,
+  8, 0, 8, 0, 0, 4, 5, 0, 45, 0,
+  20, 0, 10, 27, 29, 24, 0, 21, 22, 22,
+  24, 0, 0, 43, 79, 0, 6, 26, 56, 0,
+  0, 0, 0, 87, 1, 0, 41, 0, 0, 30,
+  0, 1, 0, 60, 72, 0, 24, 0, 0, 23,
+  0, 54, 0, 47, 13, 10, 23, 49, 26, 18,
+  0, 30, 0, 52, 4, 24, 54, 0, 32, 0,
+  10, 0, 1, 11, 0, 48, 0, 8, 0, 0,
+  39, 0, 18, 26, 11, 0, 0, 2, 47, 27,
+  0, 46, 24, 0, 46, 46, 0, 0, 13, 0,
+  0, 18, 0, 0, 0, 23, 0, 24, 55, 0,
+  15, 78, 0, 0, 25, 19, 40, 0, 26, 0,
+  5, 0, 17, 8, 0, 0, 0, 0, 7, 0,
+  0, 4, 0, 11, 36, 0, 55, 0, 17, 0,
+  0, 0, 0, 7, 0, 153, 0, 0, 0, 0,
+  0, 29, 38, 0, 0, 1, 3, 0, 0, 0,
+  24, 93, 13, 16, 0, 0, 0, 0, 0, 19,
+  0, 24, 31, 29, 0, 8, 0, 29, 0, 45,
+  0, 25, 0, 49, 3, 74, 23, 63, 0, 7,
+  0, 55, 0, 0, 19, 0, 43, 0, 36, 0,
+  0, 49, 0, 0, 76, 0, 0, 27, 37, 0,
+  74, 15, 23, 0, 0, 20, 11, 20, 0, 34,
+  35, 0, 40, 53, 0, 0, 16, 0, 0, 0,
+  0, 13, 0, 0, 26, 27, 0, 0, 0, 73,
+  26, 0, 0, 26, 12, 0, 22, 0, 0, 0,
+  6, 0, 0, 16, 0, 0, 114, 0, 19, 9,
+  0, 0, 0, 0, 29, 0, 0, 0, 2, 29,
+  35, 14, 0, 2, 25, 15, 25, 0, 0, 41,
+  100, 0, 19, 33, 52, 0, 0, 0, 0, 93,
+  0, 8, 42, 0, 0, 23, 0, 0, 0, 43,
+  78, 0, 33, 0, 0, 18, 0, 68, 0, 56,
+  40, 13, 39, 47, 17, 12, 0, 48, 0, 63,
+  25, 25, 42, 0, 13, 0, 12, 0, 4, 7,
+  0, 68, 0, 15, 1, 0, 32, 0, 7, 15,
+  0, 11, 0, 0, 44, 48, 0, 33, 43, 0,
+  60, 25, 0, 0, 0, 0, 0, 17, 0, 0,
+  0, 3, 0, 32, 43, 0, 2, 82, 3, 0,
+  8, 22, 34, 0, 25, 0, 0, 0, 17, 10,
+  0, 0, 0, 0, 0, 0, 2, 15, 15, 5,
+  38, 0, 55, 0, 13, 0, 0, 0, 0, 2,
+  0, 130, 10, 0, 4, 0, 0, 17, 27, 0,
+  0, 13, 0, 0, 0, 0, 39, 101, 22, 12,
+  0, 0, 0, 0, 0, 3, 0, 24, 35, 28,
+  1, 0, 0, 22, 0, 43, 0, 20, 0, 45,
+  17, 92, 24, 56, 0, 1, 0, 50, 0, 0,
+  17, 0, 51, 0, 51, 0, 0, 57, 0, 0,
+  72, 8, 0, 8, 34, 0, 64, 5, 28, 6,
+  0, 15, 34, 35, 0, 21, 42, 0, 36, 58,
+  0, 0, 16, 0, 0, 0, 0, 14, 4, 0,
+  0, 35, 0, 0, 0, 63, 44, 0, 0, 33,
+  35, 0, 21, 0, 0, 0, 3, 0, 0, 32,
+  0, 0, 109, 11, 25, 17, 0, 0, 0, 0,
+  15, 0, 0, 0, 0, 0, 0, 0, 0, 30,
+  33, 0, 19, 0, 21, 0, 43, 0, 16, 54,
+  29, 19, 0, 10, 66, 0, 0, 44, 0, 21,
+  4, 0, 0, 41, 0, 0, 53, 56, 9, 0,
+  0, 0, 0, 18, 0, 34, 0, 47, 24, 21,
+  4, 29, 0, 18, 41, 0, 75, 14, 0, 0,
+  37, 0, 0, 75, 15, 0, 0, 0, 0, 0,
+  34, 16, 0, 0, 0, 2, 0, 21, 12, 35,
+  14, 9, 0, 42, 59, 0, 15, 48, 23, 0,
+  5, 24, 11, 27, 9, 21, 0, 6, 17, 45,
+  0, 0, 9, 43, 26, 0, 0, 0, 17, 0,
+  51, 8, 2, 21, 33, 2, 0, 20, 0, 0,
+  46, 39, 44, 11, 0, 0, 80, 0, 29, 15,
+  0, 0, 3, 30, 27, 20, 0, 12, 23, 23,
+  27, 0, 0, 40, 83, 0, 11, 31, 57, 0,
+  0, 0, 0, 92, 0, 1, 37, 0, 0, 25,
+  0, 0, 0, 50, 77, 0, 34, 0, 0, 19,
+  0, 54, 0, 46, 24, 10, 34, 52, 12, 15,
+  0, 33, 0, 55, 12, 26, 53, 0, 30, 0,
+  10, 0, 0, 13, 0, 58, 0, 13, 0, 0,
+  32, 0, 13, 16, 12, 11, 0, 0, 49, 39,
+  0, 32, 30, 0, 50, 41, 0, 0, 7, 0,
+  0, 13, 0, 0, 0, 16, 0, 30, 52, 0,
+  6, 80, 2, 0, 18, 20, 43, 0, 29, 0,
+  4, 0, 21, 11, 0, 0, 0, 0, 0, 0,
+  0, 11, 4, 11, 36, 0, 51, 0, 18, 0,
+  0, 0, 0, 5, 0, 140, 8, 5, 3, 0,
+  0, 23, 36, 0, 0, 10, 2, 0, 0, 0,
+  35, 102, 17, 9, 0, 0, 0, 0, 0, 21,
+  0, 23, 35, 21, 4, 1, 0, 25, 0, 41,
+  0, 16, 0, 48, 13, 84, 13, 57, 0, 3,
+  0, 61, 0, 0, 24, 0, 45, 0, 39, 0,
+  0, 51, 0, 0, 78, 3, 0, 20, 24, 0,
+  67, 6, 31, 2, 0, 19, 16, 27, 0, 18,
+  39, 0, 33, 59, 0, 0, 10, 0, 0, 0,
+  0, 8, 0, 0, 12, 34, 0, 0, 0, 66,
+  43, 0, 0, 31, 31, 0, 26, 0, 0, 0,
+  14, 0, 0, 24, 0, 0, 117, 2, 21, 20,
+  0, 0, 0, 0, 24, 0, 0, 0, 0, 8,
+  0, 0, 0, 26, 43, 6, 20, 0, 13, 0,
+  59, 0, 10, 62, 36, 31, 3, 0, 46, 0,
+  0, 38, 0, 42, 6, 2, 0, 34, 0, 0,
+  63, 41, 15, 0, 0, 0, 0, 46, 0, 37,
+  0, 53, 25, 14, 17, 17, 0, 32, 15, 5,
+  91, 14, 0, 0, 28, 0, 0, 70, 0, 0,
+  0, 0, 0, 0, 24, 8, 0, 0, 0, 2,
+  0, 9, 17, 48, 0, 3, 0, 31, 71, 5,
+  13, 36, 17, 0, 4, 23, 26, 35, 36, 0,
+  0, 2, 17, 32, 0, 0, 2, 44, 36, 0,
+  0, 0, 12, 0, 55, 13, 24, 46, 43, 0,
+  0, 24, 0, 0, 42, 41, 44, 0, 0, 0,
+  108, 0, 71, 14, 0, 0, 10, 27, 29, 24,
+  0, 21, 22, 22, 24, 0, 0, 43, 79, 0,
+  6, 26, 56, 0, 0, 0, 0, 87, 1, 0,
+  41, 0, 0, 30, 0, 1, 0, 60, 72, 0,
+  24, 0, 0, 23, 0, 54, 0, 47, 13, 10,
+  23, 49, 26, 18, 0, 30, 0, 52, 4, 24,
+  54, 0, 32, 0, 10, 0, 1, 11, 0, 48,
+  0, 8, 0, 0, 39, 0, 18, 26, 11, 0,
+  0, 2, 47, 27, 0, 46, 24, 0, 46, 46,
+  0, 0, 13, 0, 0, 18, 0, 0, 0, 23,
+  0, 24, 55, 0, 15, 78, 0, 0, 25, 19,
+  40, 0, 26, 0, 5, 0, 17, 8, 0, 0,
+  0, 0, 7, 0, 0, 4, 0, 11, 36, 0,
+  55, 0, 17, 0, 0, 0, 0, 7, 0, 153,
+  0, 0, 0, 0, 0, 29, 38, 0, 0, 1,
+  3, 0, 0, 0, 24, 93, 13, 16, 0, 0,
+  0, 0, 0, 19, 0, 24, 31, 29, 0, 8,
+  0, 29, 0, 45, 0, 25, 0, 49, 3, 74,
+  23, 63, 0, 7, 0, 55, 0, 0, 19, 0,
+  43, 0, 36, 0, 0, 49, 0, 0, 76, 0,
+  0, 27, 37, 0, 74, 15, 23, 0, 0, 20,
+  11, 20, 0, 34, 35, 0, 40, 53, 0, 0,
+  16, 0, 0, 0, 0, 13, 0, 0, 26, 27,
+  0, 0, 0, 73, 26, 0, 0, 26, 12, 0,
+  22, 0, 0, 0, 6, 0, 0, 16, 0, 0,
+  114, 0, 19, 9, 0, 0, 0, 0, 29, 0,
+  0, 0, 0, 17, 0, 0, 0, 31, 35, 0,
+  13, 0, 8, 0, 56, 4, 16, 62, 36, 39,
+  10, 0, 30, 0, 0, 48, 4, 53, 0, 4,
+  0, 15, 0, 0, 72, 44, 0, 0, 0, 0,
+  0, 66, 0, 41, 0, 43, 20, 12, 12, 36,
+  0, 41, 0, 7, 95, 16, 0, 0, 21, 0,
+  0, 55, 9, 0, 0, 0, 0, 0, 32, 12,
+  11, 0, 0, 0, 0, 15, 10, 55, 0, 0,
+  0, 47, 64, 4, 32, 22, 15, 0, 7, 27,
+  13, 34, 54, 16, 0, 11, 39, 32, 0, 0,
+  0, 68, 22, 0, 0, 0, 0, 0, 48, 0,
+  0, 30, 26, 15, 0, 27, 0, 0, 25, 30,
+  24, 3, 1, 0, 121, 0, 65, 2, 0, 0,
+  0, 0, 0, 2, 0, 130, 10, 0, 4, 0,
+  0, 17, 27, 0, 0, 13, 0, 0, 0, 0,
+  39, 101, 22, 12, 0, 0, 0, 0, 0, 3,
+  0, 24, 35, 28, 1, 0, 0, 22, 0, 43,
+  0, 20, 0, 45, 17, 92, 24, 56, 0, 1,
+  0, 50, 0, 0, 17, 0, 51, 0, 51, 0,
+  0, 57, 0, 0, 72, 8, 0, 8, 34, 0,
+  64, 5, 28, 6, 0, 15, 34, 35, 0, 21,
+  42, 0, 36, 58, 0, 0, 16, 0, 0, 0,
+  0, 14, 4, 0, 0, 35, 0, 0, 0, 63,
+  44, 0, 0, 33, 35, 0, 21, 0, 0, 0,
+  3, 0, 0, 32, 0, 0, 109, 11, 25, 17,
+  0, 0, 0, 0, 15, 0, 0, 0, 0, 0,
+  0, 0, 0, 30, 33, 0, 19, 0, 21, 0,
+  43, 0, 16, 54, 29, 19, 0, 10, 66, 0,
+  0, 44, 0, 21, 4, 0, 0, 41, 0, 0,
+  53, 56, 9, 0, 0, 0, 0, 18, 0, 34,
+  0, 47, 24, 21, 4, 29, 0, 18, 41, 0,
+  75, 14, 0, 0, 37, 0, 0, 75, 15, 0,
+  0, 0, 0, 0, 34, 16, 0, 0, 0, 2,
+  0, 21, 12, 35, 14, 9, 0, 42, 59, 0,
+  15, 48, 23, 0, 5, 24, 11, 27, 9, 21,
+  0, 6, 17, 45, 0, 0, 9, 43, 26, 0,
+  0, 0, 17, 0, 51, 8, 2, 21, 33, 2,
+  0, 20, 0, 0, 46, 39, 44, 11, 0, 0,
+  80, 0, 29, 15, 0, 0, 0, 47, 63, 0,
+  0, 0, 0, 0, 44, 1, 0, 11, 10, 3,
+  0, 58, 41, 16, 11, 0, 10, 0, 65, 40,
+  0, 0, 36, 16, 0, 0, 0, 0, 20, 0,
+  20, 14, 0, 0, 0, 16, 0, 3, 0, 22,
+  0, 2, 0, 0, 0, 1, 57, 3, 31, 0,
+  0, 0, 29, 0, 0, 14, 3, 0, 0, 0,
+  16, 0, 39, 2, 0, 0, 0, 0, 0, 49,
+  17, 0, 0, 86, 0, 30, 13, 0, 52, 56,
+  3, 30, 0, 29, 23, 24, 50, 0, 0, 0,
+  17, 0, 0, 0, 0, 53, 48, 0, 0, 0,
+  13, 0, 61, 0, 0, 31, 25, 0, 0, 5,
+  0, 0, 7, 0, 0, 16, 0, 0, 30, 0,
+  18, 13, 0, 31, 0, 0, 0, 5, 0, 140,
+  8, 5, 3, 0, 0, 23, 36, 0, 0, 10,
+  2, 0, 0, 0, 35, 102, 17, 9, 0, 0,
+  0, 0, 0, 21, 0, 23, 35, 21, 4, 1,
+  0, 25, 0, 41, 0, 16, 0, 48, 13, 84,
+  13, 57, 0, 3, 0, 61, 0, 0, 24, 0,
+  45, 0, 39, 0, 0, 51, 0, 0, 78, 3,
+  0, 20, 24, 0, 67, 6, 31, 2, 0, 19,
+  16, 27, 0, 18, 39, 0, 33, 59, 0, 0,
+  10, 0, 0, 0, 0, 8, 0, 0, 12, 34,
+  0, 0, 0, 66, 43, 0, 0, 31, 31, 0,
+  26, 0, 0, 0, 14, 0, 0, 24, 0, 0,
+  117, 2, 21, 20, 0, 0, 0, 0, 24, 0,
+  0, 0, 0, 8, 0, 0, 0, 26, 43, 6,
+  20, 0, 13, 0, 59, 0, 10, 62, 36, 31,
+  3, 0, 46, 0, 0, 38, 0, 42, 6, 2,
+  0, 34, 0, 0, 63, 41, 15, 0, 0, 0,
+  0, 46, 0, 37, 0, 53, 25, 14, 17, 17,
+  0, 32, 15, 5, 91, 14, 0, 0, 28, 0,
+  0, 70, 0, 0, 0, 0, 0, 0, 24, 8,
+  0, 0, 0, 2, 0, 9, 17, 48, 0, 3,
+  0, 31, 71, 5, 13, 36, 17, 0, 4, 23,
+  26, 35, 36, 0, 0, 2, 17, 32, 0, 0,
+  2, 44, 36, 0, 0, 0, 12, 0, 55, 13,
+  24, 46, 43, 0, 0, 24, 0, 0, 42, 41,
+  44, 0, 0, 0, 108, 0, 71, 14, 0, 0,
+  0, 44, 70, 0, 0, 0, 0, 9, 53, 0,
+  0, 29, 11, 20, 0, 36, 26, 0, 0, 0,
+  0, 7, 73, 51, 0, 0, 16, 18, 0, 0,
+  0, 0, 0, 0, 29, 22, 0, 0, 0, 40,
+  0, 13, 0, 10, 0, 1, 22, 0, 0, 0,
+  35, 32, 22, 15, 0, 0, 28, 0, 0, 0,
+  0, 0, 0, 0, 20, 0, 30, 0, 2, 0,
+  0, 8, 3, 20, 33, 0, 0, 85, 0, 28,
+  19, 0, 42, 48, 0, 18, 0, 36, 33, 9,
+  46, 0, 0, 0, 8, 0, 0, 0, 0, 81,
+  37, 0, 0, 0, 25, 0, 70, 0, 22, 26,
+  14, 0, 0, 8, 0, 0, 28, 0, 0, 18,
+  0, 0, 19, 0, 44, 20, 0, 20, 0, 0,
+  0, 7, 0, 153, 0, 0, 0, 0, 0, 29,
+  38, 0, 0, 1, 3, 0, 0, 0, 24, 93,
+  13, 16, 0, 0, 0, 0, 0, 19, 0, 24,
+  31, 29, 0, 8, 0, 29, 0, 45, 0, 25,
+  0, 49, 3, 74, 23, 63, 0, 7, 0, 55,
+  0, 0, 19, 0, 43, 0, 36, 0, 0, 49,
+  0, 0, 76, 0, 0, 27, 37, 0, 74, 15,
+  23, 0, 0, 20, 11, 20, 0, 34, 35, 0,
+  40, 53, 0, 0, 16, 0, 0, 0, 0, 13,
+  0, 0, 26, 27, 0, 0, 0, 73, 26, 0,
+  0, 26, 12, 0, 22, 0, 0, 0, 6, 0,
+  0, 16, 0, 0, 114, 0, 19, 9, 0, 0,
+  0, 0, 29, 0, 0, 0, 0, 17, 0, 0,
+  0, 31, 35, 0, 13, 0, 8, 0, 56, 4,
+  16, 62, 36, 39, 10, 0, 30, 0, 0, 48,
+  4, 53, 0, 4, 0, 15, 0, 0, 72, 44,
+  0, 0, 0, 0, 0, 66, 0, 41, 0, 43,
+  20, 12, 12, 36, 0, 41, 0, 7, 95, 16,
+  0, 0, 21, 0, 0, 55, 9, 0, 0, 0,
+  0, 0, 32, 12, 11, 0, 0, 0, 0, 15,
+  10, 55, 0, 0, 0, 47, 64, 4, 32, 22,
+  15, 0, 7, 27, 13, 34, 54, 16, 0, 11,
+  39, 32, 0, 0, 0, 68, 22, 0, 0, 0,
+  0, 0, 48, 0, 0, 30, 26, 15, 0, 27,
+  0, 0, 25, 30, 24, 3, 1, 0, 121, 0,
+  65, 2, 0, 0, 0, 31, 59, 0, 8, 0,
+  0, 0, 53, 2, 0, 9, 30, 0, 0, 23,
+  15, 0, 8, 0, 0, 47, 79, 53, 0, 0,
+  0, 15, 0, 0, 0, 0, 0, 0, 52, 28,
+  0, 4, 0, 63, 0, 25, 0, 1, 0, 0,
+  25, 4, 0, 6, 0, 48, 20, 26, 0, 0,
+  19, 0, 8, 0, 0, 13, 0, 0, 18, 0,
+  16, 0, 9, 0, 10, 19, 20, 21, 21, 5,
+  0, 89, 0, 46, 12, 0, 50, 44, 4, 2,
+  0, 39, 7, 1, 49, 0, 0, 0, 4, 0,
+  0, 0, 6, 91, 22, 0, 0, 0, 9, 0,
+  71, 0, 0, 9, 0, 0, 0, 14, 0, 0,
+  23, 0, 0, 33, 0, 0, 26, 0, 73, 2,
+  0, 1, 0, 0, 0, 0, 0, 30, 33, 0,
+  19, 0, 21, 0, 43, 0, 16, 54, 29, 19,
+  0, 10, 66, 0, 0, 44, 0, 21, 4, 0,
+  0, 41, 0, 0, 53, 56, 9, 0, 0, 0,
+  0, 18, 0, 34, 0, 47, 24, 21, 4, 29,
+  0, 18, 41, 0, 75, 14, 0, 0, 37, 0,
+  0, 75, 15, 0, 0, 0, 0, 0, 34, 16,
+  0, 0, 0, 2, 0, 21, 12, 35, 14, 9,
+  0, 42, 59, 0, 15, 48, 23, 0, 5, 24,
+  11, 27, 9, 21, 0, 6, 17, 45, 0, 0,
+  9, 43, 26, 0, 0, 0, 17, 0, 51, 8,
+  2, 21, 33, 2, 0, 20, 0, 0, 46, 39,
+  44, 11, 0, 0, 80, 0, 29, 15, 0, 0,
+  0, 47, 63, 0, 0, 0, 0, 0, 44, 1,
+  0, 11, 10, 3, 0, 58, 41, 16, 11, 0,
+  10, 0, 65, 40, 0, 0, 36, 16, 0, 0,
+  0, 0, 20, 0, 20, 14, 0, 0, 0, 16,
+  0, 3, 0, 22, 0, 2, 0, 0, 0, 1,
+  57, 3, 31, 0, 0, 0, 29, 0, 0, 14,
+  3, 0, 0, 0, 16, 0, 39, 2, 0, 0,
+  0, 0, 0, 49, 17, 0, 0, 86, 0, 30,
+  13, 0, 52, 56, 3, 30, 0, 29, 23, 24,
+  50, 0, 0, 0, 17, 0, 0, 0, 0, 53,
+  48, 0, 0, 0, 13, 0, 61, 0, 0, 31,
+  25, 0, 0, 5, 0, 0, 7, 0, 0, 16,
+  0, 0, 30, 0, 18, 13, 0, 31, 103, 0,
+  37, 5, 6, 15, 0, 0, 15, 0, 0, 23,
+  47, 54, 0, 0, 22, 0, 6, 0, 0, 173,
+  80, 13, 0, 0, 0, 33, 0, 0, 2, 56,
+  0, 34, 0, 21, 0, 29, 0, 25, 0, 22,
+  0, 0, 27, 6, 10, 8, 0, 0, 0, 77,
+  0, 0, 89, 0, 43, 20, 45, 0, 35, 11,
+  0, 32, 30, 49, 7, 15, 23, 23, 7, 28,
+  0, 22, 0, 0, 3, 45, 0, 13, 0, 0,
+  4, 42, 8, 27, 0, 9, 0, 0, 0, 0,
+  8, 0, 7, 0, 24, 0, 27, 61, 2, 0,
+  25, 0, 40, 28, 4, 8, 10, 35, 4, 0,
+  0, 0, 0, 15, 78, 0, 23, 10, 0, 35,
+  0, 0, 20, 3, 3, 48, 0, 8, 0, 0,
+  0, 26, 43, 6, 20, 0, 13, 0, 59, 0,
+  10, 62, 36, 31, 3, 0, 46, 0, 0, 38,
+  0, 42, 6, 2, 0, 34, 0, 0, 63, 41,
+  15, 0, 0, 0, 0, 46, 0, 37, 0, 53,
+  25, 14, 17, 17, 0, 32, 15, 5, 91, 14,
+  0, 0, 28, 0, 0, 70, 0, 0, 0, 0,
+  0, 0, 24, 8, 0, 0, 0, 2, 0, 9,
+  17, 48, 0, 3, 0, 31, 71, 5, 13, 36,
+  17, 0, 4, 23, 26, 35, 36, 0, 0, 2,
+  17, 32, 0, 0, 2, 44, 36, 0, 0, 0,
+  12, 0, 55, 13, 24, 46, 43, 0, 0, 24,
+  0, 0, 42, 41, 44, 0, 0, 0, 108, 0,
+  71, 14, 0, 0, 0, 44, 70, 0, 0, 0,
+  0, 9, 53, 0, 0, 29, 11, 20, 0, 36,
+  26, 0, 0, 0, 0, 7, 73, 51, 0, 0,
+  16, 18, 0, 0, 0, 0, 0, 0, 29, 22,
+  0, 0, 0, 40, 0, 13, 0, 10, 0, 1,
+  22, 0, 0, 0, 35, 32, 22, 15, 0, 0,
+  28, 0, 0, 0, 0, 0, 0, 0, 20, 0,
+  30, 0, 2, 0, 0, 8, 3, 20, 33, 0,
+  0, 85, 0, 28, 19, 0, 42, 48, 0, 18,
+  0, 36, 33, 9, 46, 0, 0, 0, 8, 0,
+  0, 0, 0, 81, 37, 0, 0, 0, 25, 0,
+  70, 0, 22, 26, 14, 0, 0, 8, 0, 0,
+  28, 0, 0, 18, 0, 0, 19, 0, 44, 20,
+  0, 20, 102, 0, 40, 4, 0, 12, 0, 0,
+  45, 0, 0, 35, 56, 20, 0, 0, 9, 0,
+  0, 0, 0, 189, 80, 25, 0, 0, 0, 31,
+  0, 0, 16, 61, 0, 11, 0, 30, 0, 40,
+  0, 30, 0, 28, 48, 0, 38, 21, 24, 29,
+  0, 0, 0, 80, 0, 0, 100, 0, 63, 0,
+  47, 0, 14, 23, 0, 56, 27, 66, 0, 1,
+  0, 4, 12, 26, 10, 13, 0, 0, 0, 47,
+  0, 15, 0, 0, 7, 21, 0, 11, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 25, 0,
+  18, 61, 0, 0, 17, 0, 54, 23, 26, 12,
+  6, 14, 8, 6, 0, 0, 0, 2, 87, 0,
+  36, 39, 0, 9, 0, 0, 23, 15, 18, 29,
+  0, 17, 0, 0, 0, 31, 35, 0, 13, 0,
+  8, 0, 56, 4, 16, 62, 36, 39, 10, 0,
+  30, 0, 0, 48, 4, 53, 0, 4, 0, 15,
+  0, 0, 72, 44, 0, 0, 0, 0, 0, 66,
+  0, 41, 0, 43, 20, 12, 12, 36, 0, 41,
+  0, 7, 95, 16, 0, 0, 21, 0, 0, 55,
+  9, 0, 0, 0, 0, 0, 32, 12, 11, 0,
+  0, 0, 0, 15, 10, 55, 0, 0, 0, 47,
+  64, 4, 32, 22, 15, 0, 7, 27, 13, 34,
+  54, 16, 0, 11, 39, 32, 0, 0, 0, 68,
+  22, 0, 0, 0, 0, 0, 48, 0, 0, 30,
+  26, 15, 0, 27, 0, 0, 25, 30, 24, 3,
+  1, 0, 121, 0, 65, 2, 0, 0, 0, 31,
+  59, 0, 8, 0, 0, 0, 53, 2, 0, 9,
+  30, 0, 0, 23, 15, 0, 8, 0, 0, 47,
+  79, 53, 0, 0, 0, 15, 0, 0, 0, 0,
+  0, 0, 52, 28, 0, 4, 0, 63, 0, 25,
+  0, 1, 0, 0, 25, 4, 0, 6, 0, 48,
+  20, 26, 0, 0, 19, 0, 8, 0, 0, 13,
+  0, 0, 18, 0, 16, 0, 9, 0, 10, 19,
+  20, 21, 21, 5, 0, 89, 0, 46, 12, 0,
+  50, 44, 4, 2, 0, 39, 7, 1, 49, 0,
+  0, 0, 4, 0, 0, 0, 6, 91, 22, 0,
+  0, 0, 9, 0, 71, 0, 0, 9, 0, 0,
+  0, 14, 0, 0, 23, 0, 0, 33, 0, 0,
+  26, 0, 73, 2, 0, 1, 73, 0, 21, 29,
+  10, 2, 0, 11, 74, 0, 0, 18, 94, 0,
+  0, 0, 36, 0, 0, 0, 0, 148, 91, 19,
+  0, 0, 0, 47, 0, 0, 32, 47, 0, 0,
+  27, 32, 0, 52, 0, 43, 0, 24, 66, 17,
+  51, 51, 13, 28, 0, 0, 0, 63, 0, 0,
+  62, 0, 50, 0, 39, 0, 0, 6, 0, 30,
+  12, 20, 0, 4, 0, 0, 19, 4, 40, 42,
+  0, 0, 0, 87, 0, 19, 0, 0, 16, 26,
+  0, 11, 0, 0, 0, 0, 0, 0, 0, 8,
+  0, 0, 35, 0, 15, 55, 0, 0, 22, 0,
+  52, 8, 59, 31, 3, 19, 8, 16, 0, 0,
+  0, 0, 66, 0, 18, 40, 0, 4, 0, 0,
+  51, 0, 18, 14, 0, 47, 63, 0, 0, 0,
+  0, 0, 44, 1, 0, 11, 10, 3, 0, 58,
+  41, 16, 11, 0, 10, 0, 65, 40, 0, 0,
+  36, 16, 0, 0, 0, 0, 20, 0, 20, 14,
+  0, 0, 0, 16, 0, 3, 0, 22, 0, 2,
+  0, 0, 0, 1, 57, 3, 31, 0, 0, 0,
+  29, 0, 0, 14, 3, 0, 0, 0, 16, 0,
+  39, 2, 0, 0, 0, 0, 0, 49, 17, 0,
+  0, 86, 0, 30, 13, 0, 52, 56, 3, 30,
+  0, 29, 23, 24, 50, 0, 0, 0, 17, 0,
+  0, 0, 0, 53, 48, 0, 0, 0, 13, 0,
+  61, 0, 0, 31, 25, 0, 0, 5, 0, 0,
+  7, 0, 0, 16, 0, 0, 30, 0, 18, 13,
+  0, 31, 103, 0, 37, 5, 6, 15, 0, 0,
+  15, 0, 0, 23, 47, 54, 0, 0, 22, 0,
+  6, 0, 0, 173, 80, 13, 0, 0, 0, 33,
+  0, 0, 2, 56, 0, 34, 0, 21, 0, 29,
+  0, 25, 0, 22, 0, 0, 27, 6, 10, 8,
+  0, 0, 0, 77, 0, 0, 89, 0, 43, 20,
+  45, 0, 35, 11, 0, 32, 30, 49, 7, 15,
+  23, 23, 7, 28, 0, 22, 0, 0, 3, 45,
+  0, 13, 0, 0, 4, 42, 8, 27, 0, 9,
+  0, 0, 0, 0, 8, 0, 7, 0, 24, 0,
+  27, 61, 2, 0, 25, 0, 40, 28, 4, 8,
+  10, 35, 4, 0, 0, 0, 0, 15, 78, 0,
+  23, 10, 0, 35, 0, 0, 20, 3, 3, 48,
+  45, 0, 0, 0, 22, 82, 0, 0, 8, 0,
+  0, 0, 29, 61, 0, 8, 48, 0, 0, 0,
+  21, 71, 5, 41, 10, 3, 0, 14, 0, 2,
+  0, 9, 0, 69, 34, 19, 0, 41, 0, 34,
+  7, 20, 0, 34, 59, 23, 26, 10, 5, 0,
+  0, 0, 0, 0, 0, 0, 18, 22, 10, 15,
+  30, 39, 10, 0, 0, 0, 16, 36, 52, 0,
+  27, 32, 3, 0, 12, 28, 0, 21, 0, 48,
+  0, 2, 0, 34, 13, 5, 17, 11, 0, 25,
+  0, 47, 10, 1, 26, 5, 0, 0, 0, 67,
+  13, 0, 12, 0, 16, 0, 0, 15, 0, 51,
+  0, 0, 0, 0, 0, 0, 69, 0, 19, 0,
+  19, 11, 0, 0, 29, 2, 31, 0, 0, 44,
+  70, 0, 0, 0, 0, 9, 53, 0, 0, 29,
+  11, 20, 0, 36, 26, 0, 0, 0, 0, 7,
+  73, 51, 0, 0, 16, 18, 0, 0, 0, 0,
+  0, 0, 29, 22, 0, 0, 0, 40, 0, 13,
+  0, 10, 0, 1, 22, 0, 0, 0, 35, 32,
+  22, 15, 0, 0, 28, 0, 0, 0, 0, 0,
+  0, 0, 20, 0, 30, 0, 2, 0, 0, 8,
+  3, 20, 33, 0, 0, 85, 0, 28, 19, 0,
+  42, 48, 0, 18, 0, 36, 33, 9, 46, 0,
+  0, 0, 8, 0, 0, 0, 0, 81, 37, 0,
+  0, 0, 25, 0, 70, 0, 22, 26, 14, 0,
+  0, 8, 0, 0, 28, 0, 0, 18, 0, 0,
+  19, 0, 44, 20, 0, 20, 102, 0, 40, 4,
+  0, 12, 0, 0, 45, 0, 0, 35, 56, 20,
+  0, 0, 9, 0, 0, 0, 0, 189, 80, 25,
+  0, 0, 0, 31, 0, 0, 16, 61, 0, 11,
+  0, 30, 0, 40, 0, 30, 0, 28, 48, 0,
+  38, 21, 24, 29, 0, 0, 0, 80, 0, 0,
+  100, 0, 63, 0, 47, 0, 14, 23, 0, 56,
+  27, 66, 0, 1, 0, 4, 12, 26, 10, 13,
+  0, 0, 0, 47, 0, 15, 0, 0, 7, 21,
+  0, 11, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 25, 0, 18, 61, 0, 0, 17, 0,
+  54, 23, 26, 12, 6, 14, 8, 6, 0, 0,
+  0, 2, 87, 0, 36, 39, 0, 9, 0, 0,
+  23, 15, 18, 29, 9, 0, 0, 9, 0, 65,
+  0, 0, 41, 0, 0, 0, 45, 38, 0, 38,
+  32, 25, 0, 0, 8, 14, 5, 56, 28, 0,
+  0, 19, 0, 0, 0, 21, 10, 40, 27, 4,
+  0, 33, 0, 8, 9, 4, 50, 58, 50, 77,
+  14, 17, 0, 0, 0, 0, 0, 0, 0, 0,
+  54, 0, 0, 0, 4, 43, 0, 0, 0, 0,
+  0, 0, 12, 0, 54, 0, 14, 11, 0, 28,
+  0, 28, 0, 28, 0, 16, 0, 39, 0, 0,
+  31, 0, 14, 62, 0, 63, 0, 0, 13, 17,
+  0, 0, 0, 56, 19, 0, 0, 0, 17, 0,
+  0, 4, 0, 40, 0, 0, 0, 9, 0, 0,
+  61, 0, 8, 0, 37, 0, 3, 0, 29, 10,
+  44, 0, 0, 31, 59, 0, 8, 0, 0, 0,
+  53, 2, 0, 9, 30, 0, 0, 23, 15, 0,
+  8, 0, 0, 47, 79, 53, 0, 0, 0, 15,
+  0, 0, 0, 0, 0, 0, 52, 28, 0, 4,
+  0, 63, 0, 25, 0, 1, 0, 0, 25, 4,
+  0, 6, 0, 48, 20, 26, 0, 0, 19, 0,
+  8, 0, 0, 13, 0, 0, 18, 0, 16, 0,
+  9, 0, 10, 19, 20, 21, 21, 5, 0, 89,
+  0, 46, 12, 0, 50, 44, 4, 2, 0, 39,
+  7, 1, 49, 0, 0, 0, 4, 0, 0, 0,
+  6, 91, 22, 0, 0, 0, 9, 0, 71, 0,
+  0, 9, 0, 0, 0, 14, 0, 0, 23, 0,
+  0, 33, 0, 0, 26, 0, 73, 2, 0, 1,
+  73, 0, 21, 29, 10, 2, 0, 11, 74, 0,
+  0, 18, 94, 0, 0, 0, 36, 0, 0, 0,
+  0, 148, 91, 19, 0, 0, 0, 47, 0, 0,
+  32, 47, 0, 0, 27, 32, 0, 52, 0, 43,
+  0, 24, 66, 17, 51, 51, 13, 28, 0, 0,
+  0, 63, 0, 0, 62, 0, 50, 0, 39, 0,
+  0, 6, 0, 30, 12, 20, 0, 4, 0, 0,
+  19, 4, 40, 42, 0, 0, 0, 87, 0, 19,
+  0, 0, 16, 26, 0, 11, 0, 0, 0, 0,
+  0, 0, 0, 8, 0, 0, 35, 0, 15, 55,
+  0, 0, 22, 0, 52, 8, 59, 31, 3, 19,
+  8, 16, 0, 0, 0, 0, 66, 0, 18, 40,
+  0, 4, 0, 0, 51, 0, 18, 14, 0, 0,
+  0, 29, 1, 29, 8, 0, 54, 0, 0, 0,
+  67, 10, 9, 37, 50, 41, 0, 0, 0, 0,
+  0, 46, 33, 11, 2, 31, 0, 0, 8, 47,
+  45, 22, 0, 0, 0, 51, 0, 0, 0, 0,
+  95, 63, 29, 90, 0, 25, 0, 0, 0, 1,
+  11, 3, 0, 0, 29, 0, 0, 1, 0, 38,
+  0, 0, 3, 0, 26, 25, 4, 0, 48, 0,
+  30, 61, 0, 8, 0, 30, 0, 18, 0, 0,
+  0, 54, 0, 2, 33, 0, 0, 26, 0, 44,
+  0, 32, 0, 43, 0, 0, 0, 39, 13, 0,
+  8, 0, 38, 0, 3, 19, 0, 10, 9, 7,
+  0, 4, 0, 0, 50, 0, 0, 18, 13, 0,
+  27, 0, 42, 0, 53, 0, 103, 0, 37, 5,
+  6, 15, 0, 0, 15, 0, 0, 23, 47, 54,
+  0, 0, 22, 0, 6, 0, 0, 173, 80, 13,
+  0, 0, 0, 33, 0, 0, 2, 56, 0, 34,
+  0, 21, 0, 29, 0, 25, 0, 22, 0, 0,
+  27, 6, 10, 8, 0, 0, 0, 77, 0, 0,
+  89, 0, 43, 20, 45, 0, 35, 11, 0, 32,
+  30, 49, 7, 15, 23, 23, 7, 28, 0, 22,
+  0, 0, 3, 45, 0, 13, 0, 0, 4, 42,
+  8, 27, 0, 9, 0, 0, 0, 0, 8, 0,
+  7, 0, 24, 0, 27, 61, 2, 0, 25, 0,
+  40, 28, 4, 8, 10, 35, 4, 0, 0, 0,
+  0, 15, 78, 0, 23, 10, 0, 35, 0, 0,
+  20, 3, 3, 48, 45, 0, 0, 0, 22, 82,
+  0, 0, 8, 0, 0, 0, 29, 61, 0, 8,
+  48, 0, 0, 0, 21, 71, 5, 41, 10, 3,
+  0, 14, 0, 2, 0, 9, 0, 69, 34, 19,
+  0, 41, 0, 34, 7, 20, 0, 34, 59, 23,
+  26, 10, 5, 0, 0, 0, 0, 0, 0, 0,
+  18, 22, 10, 15, 30, 39, 10, 0, 0, 0,
+  16, 36, 52, 0, 27, 32, 3, 0, 12, 28,
+  0, 21, 0, 48, 0, 2, 0, 34, 13, 5,
+  17, 11, 0, 25, 0, 47, 10, 1, 26, 5,
+  0, 0, 0, 67, 13, 0, 12, 0, 16, 0,
+  0, 15, 0, 51, 0, 0, 0, 0, 0, 0,
+  69, 0, 19, 0, 19, 11, 0, 0, 29, 2,
+  31, 0, 0, 24, 0, 0, 40, 11, 0, 0,
+  61, 11, 0, 15, 51, 85, 31, 58, 61, 16,
+  0, 9, 60, 0, 0, 53, 11, 51, 1, 8,
+  0, 10, 0, 0, 0, 42, 35, 0, 15, 23,
+  0, 51, 12, 18, 0, 69, 33, 20, 9, 0,
+  0, 0, 24, 0, 57, 28, 0, 0, 0, 2,
+  0, 18, 0, 0, 0, 0, 0, 0, 31, 0,
+  42, 0, 0, 0, 4, 14, 36, 12, 0, 6,
+  0, 29, 44, 60, 4, 0, 34, 12, 53, 16,
+  53, 25, 0, 50, 0, 27, 0, 9, 0, 0,
+  31, 64, 0, 0, 0, 0, 0, 0, 0, 12,
+  10, 60, 0, 0, 0, 0, 0, 0, 10, 13,
+  32, 0, 25, 0, 76, 0, 51, 15, 31, 0,
+  102, 0, 40, 4, 0, 12, 0, 0, 45, 0,
+  0, 35, 56, 20, 0, 0, 9, 0, 0, 0,
+  0, 189, 80, 25, 0, 0, 0, 31, 0, 0,
+  16, 61, 0, 11, 0, 30, 0, 40, 0, 30,
+  0, 28, 48, 0, 38, 21, 24, 29, 0, 0,
+  0, 80, 0, 0, 100, 0, 63, 0, 47, 0,
+  14, 23, 0, 56, 27, 66, 0, 1, 0, 4,
+  12, 26, 10, 13, 0, 0, 0, 47, 0, 15,
+  0, 0, 7, 21, 0, 11, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 25, 0, 18, 61,
+  0, 0, 17, 0, 54, 23, 26, 12, 6, 14,
+  8, 6, 0, 0, 0, 2, 87, 0, 36, 39,
+  0, 9, 0, 0, 23, 15, 18, 29, 9, 0,
+  0, 9, 0, 65, 0, 0, 41, 0, 0, 0,
+  45, 38, 0, 38, 32, 25, 0, 0, 8, 14,
+  5, 56, 28, 0, 0, 19, 0, 0, 0, 21,
+  10, 40, 27, 4, 0, 33, 0, 8, 9, 4,
+  50, 58, 50, 77, 14, 17, 0, 0, 0, 0,
+  0, 0, 0, 0, 54, 0, 0, 0, 4, 43,
+  0, 0, 0, 0, 0, 0, 12, 0, 54, 0,
+  14, 11, 0, 28, 0, 28, 0, 28, 0, 16,
+  0, 39, 0, 0, 31, 0, 14, 62, 0, 63,
+  0, 0, 13, 17, 0, 0, 0, 56, 19, 0,
+  0, 0, 17, 0, 0, 4, 0, 40, 0, 0,
+  0, 9, 0, 0, 61, 0, 8, 0, 37, 0,
+  3, 0, 29, 10, 44, 0, 0, 14, 0, 0,
+  35, 12, 0, 0, 40, 0, 0, 15, 31, 88,
+  14, 51, 40, 12, 0, 18, 47, 0, 19, 50,
+  3, 20, 0, 2, 0, 0, 0, 0, 0, 38,
+  7, 0, 3, 31, 0, 29, 36, 1, 0, 74,
+  29, 39, 8, 0, 0, 0, 18, 2, 39, 14,
+  0, 6, 37, 0, 0, 0, 0, 4, 5, 0,
+  0, 0, 26, 0, 49, 0, 0, 0, 3, 3,
+  17, 22, 0, 17, 0, 21, 27, 60, 0, 26,
+  24, 3, 57, 0, 52, 33, 0, 62, 14, 8,
+  23, 27, 0, 0, 26, 70, 5, 0, 0, 0,
+  0, 0, 0, 16, 0, 35, 0, 0, 0, 12,
+  0, 0, 17, 3, 26, 0, 0, 0, 20, 0,
+  35, 8, 37, 0, 73, 0, 21, 29, 10, 2,
+  0, 11, 74, 0, 0, 18, 94, 0, 0, 0,
+  36, 0, 0, 0, 0, 148, 91, 19, 0, 0,
+  0, 47, 0, 0, 32, 47, 0, 0, 27, 32,
+  0, 52, 0, 43, 0, 24, 66, 17, 51, 51,
+  13, 28, 0, 0, 0, 63, 0, 0, 62, 0,
+  50, 0, 39, 0, 0, 6, 0, 30, 12, 20,
+  0, 4, 0, 0, 19, 4, 40, 42, 0, 0,
+  0, 87, 0, 19, 0, 0, 16, 26, 0, 11,
+  0, 0, 0, 0, 0, 0, 0, 8, 0, 0,
+  35, 0, 15, 55, 0, 0, 22, 0, 52, 8,
+  59, 31, 3, 19, 8, 16, 0, 0, 0, 0,
+  66, 0, 18, 40, 0, 4, 0, 0, 51, 0,
+  18, 14, 0, 0, 0, 29, 1, 29, 8, 0,
+  54, 0, 0, 0, 67, 10, 9, 37, 50, 41,
+  0, 0, 0, 0, 0, 46, 33, 11, 2, 31,
+  0, 0, 8, 47, 45, 22, 0, 0, 0, 51,
+  0, 0, 0, 0, 95, 63, 29, 90, 0, 25,
+  0, 0, 0, 1, 11, 3, 0, 0, 29, 0,
+  0, 1, 0, 38, 0, 0, 3, 0, 26, 25,
+  4, 0, 48, 0, 30, 61, 0, 8, 0, 30,
+  0, 18, 0, 0, 0, 54, 0, 2, 33, 0,
+  0, 26, 0, 44, 0, 32, 0, 43, 0, 0,
+  0, 39, 13, 0, 8, 0, 38, 0, 3, 19,
+  0, 10, 9, 7, 0, 4, 0, 0, 50, 0,
+  0, 18, 13, 0, 27, 0, 42, 0, 53, 0,
+  0, 0, 0, 5, 36, 43, 0, 0, 0, 0,
+  0, 1, 24, 87, 0, 16, 36, 0, 0, 9,
+  34, 0, 19, 29, 0, 11, 0, 0, 0, 24,
+  7, 0, 0, 36, 0, 0, 0, 26, 0, 8,
+  20, 9, 0, 66, 26, 13, 0, 36, 0, 0,
+  2, 42, 7, 10, 0, 0, 26, 0, 0, 0,
+  0, 31, 20, 0, 10, 0, 10, 15, 33, 0,
+  6, 11, 0, 7, 9, 11, 0, 16, 0, 29,
+  9, 31, 0, 20, 48, 0, 63, 19, 21, 0,
+  0, 52, 14, 4, 22, 50, 0, 0, 0, 71,
+  13, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+  3, 0, 0, 16, 0, 8, 57, 0, 8, 0,
+  0, 0, 0, 0, 20, 1, 25, 0, 45, 0,
+  0, 0, 22, 82, 0, 0, 8, 0, 0, 0,
+  29, 61, 0, 8, 48, 0, 0, 0, 21, 71,
+  5, 41, 10, 3, 0, 14, 0, 2, 0, 9,
+  0, 69, 34, 19, 0, 41, 0, 34, 7, 20,
+  0, 34, 59, 23, 26, 10, 5, 0, 0, 0,
+  0, 0, 0, 0, 18, 22, 10, 15, 30, 39,
+  10, 0, 0, 0, 16, 36, 52, 0, 27, 32,
+  3, 0, 12, 28, 0, 21, 0, 48, 0, 2,
+  0, 34, 13, 5, 17, 11, 0, 25, 0, 47,
+  10, 1, 26, 5, 0, 0, 0, 67, 13, 0,
+  12, 0, 16, 0, 0, 15, 0, 51, 0, 0,
+  0, 0, 0, 0, 69, 0, 19, 0, 19, 11,
+  0, 0, 29, 2, 31, 0, 0, 24, 0, 0,
+  40, 11, 0, 0, 61, 11, 0, 15, 51, 85,
+  31, 58, 61, 16, 0, 9, 60, 0, 0, 53,
+  11, 51, 1, 8, 0, 10, 0, 0, 0, 42,
+  35, 0, 15, 23, 0, 51, 12, 18, 0, 69,
+  33, 20, 9, 0, 0, 0, 24, 0, 57, 28,
+  0, 0, 0, 2, 0, 18, 0, 0, 0, 0,
+  0, 0, 31, 0, 42, 0, 0, 0, 4, 14,
+  36, 12, 0, 6, 0, 29, 44, 60, 4, 0,
+  34, 12, 53, 16, 53, 25, 0, 50, 0, 27,
+  0, 9, 0, 0, 31, 64, 0, 0, 0, 0,
+  0, 0, 0, 12, 10, 60, 0, 0, 0, 0,
+  0, 0, 10, 13, 32, 0, 25, 0, 76, 0,
+  51, 15, 31, 0, 0, 35, 50, 0, 10, 0,
+  0, 0, 51, 2, 0, 18, 8, 100, 10, 27,
+  39, 26, 2, 4, 44, 0, 34, 24, 0, 0,
+  0, 5, 0, 0, 0, 0, 0, 0, 0, 0,
+  5, 0, 0, 22, 18, 0, 0, 35, 0, 0,
+  0, 0, 0, 0, 52, 66, 0, 34, 0, 0,
+  6, 2, 0, 0, 0, 0, 13, 0, 38, 2,
+  22, 0, 23, 0, 0, 0, 3, 15, 29, 0,
+  0, 37, 0, 21, 32, 48, 11, 18, 40, 3,
+  53, 7, 75, 6, 0, 23, 0, 0, 0, 1,
+  0, 0, 40, 70, 1, 0, 0, 0, 7, 0,
+  0, 9, 0, 8, 32, 0, 0, 0, 57, 0,
+  10, 0, 12, 0, 0, 0, 8, 0, 9, 14,
+  37, 0, 9, 0, 0, 9, 0, 65, 0, 0,
+  41, 0, 0, 0, 45, 38, 0, 38, 32, 25,
+  0, 0, 8, 14, 5, 56, 28, 0, 0, 19,
+  0, 0, 0, 21, 10, 40, 27, 4, 0, 33,
+  0, 8, 9, 4, 50, 58, 50, 77, 14, 17,
+  0, 0, 0, 0, 0, 0, 0, 0, 54, 0,
+  0, 0, 4, 43, 0, 0, 0, 0, 0, 0,
+  12, 0, 54, 0, 14, 11, 0, 28, 0, 28,
+  0, 28, 0, 16, 0, 39, 0, 0, 31, 0,
+  14, 62, 0, 63, 0, 0, 13, 17, 0, 0,
+  0, 56, 19, 0, 0, 0, 17, 0, 0, 4,
+  0, 40, 0, 0, 0, 9, 0, 0, 61, 0,
+  8, 0, 37, 0, 3, 0, 29, 10, 44, 0,
+  0, 14, 0, 0, 35, 12, 0, 0, 40, 0,
+  0, 15, 31, 88, 14, 51, 40, 12, 0, 18,
+  47, 0, 19, 50, 3, 20, 0, 2, 0, 0,
+  0, 0, 0, 38, 7, 0, 3, 31, 0, 29,
+  36, 1, 0, 74, 29, 39, 8, 0, 0, 0,
+  18, 2, 39, 14, 0, 6, 37, 0, 0, 0,
+  0, 4, 5, 0, 0, 0, 26, 0, 49, 0,
+  0, 0, 3, 3, 17, 22, 0, 17, 0, 21,
+  27, 60, 0, 26, 24, 3, 57, 0, 52, 33,
+  0, 62, 14, 8, 23, 27, 0, 0, 26, 70,
+  5, 0, 0, 0, 0, 0, 0, 16, 0, 35,
+  0, 0, 0, 12, 0, 0, 17, 3, 26, 0,
+  0, 0, 20, 0, 35, 8, 37, 0, 24, 0,
+  53, 0, 32, 0, 0, 0, 25, 0, 0, 1,
+  9, 122, 15, 0, 27, 21, 0, 8, 41, 13,
+  69, 7, 0, 0, 0, 4, 0, 0, 0, 0,
+  0, 5, 0, 0, 0, 4, 0, 26, 14, 10,
+  0, 48, 14, 0, 0, 0, 0, 0, 37, 104,
+  0, 37, 0, 0, 9, 6, 3, 0, 0, 0,
+  33, 0, 50, 22, 0, 0, 24, 22, 0, 1,
+  0, 0, 27, 0, 0, 13, 0, 41, 14, 36,
+  0, 5, 48, 0, 45, 11, 72, 0, 0, 2,
+  0, 0, 0, 25, 0, 0, 41, 57, 0, 0,
+  0, 0, 0, 0, 0, 10, 1, 0, 35, 0,
+  0, 0, 51, 0, 55, 0, 5, 0, 0, 0,
+  0, 0, 28, 1, 16, 0, 0, 0, 0, 29,
+  1, 29, 8, 0, 54, 0, 0, 0, 67, 10,
+  9, 37, 50, 41, 0, 0, 0, 0, 0, 46,
+  33, 11, 2, 31, 0, 0, 8, 47, 45, 22,
+  0, 0, 0, 51, 0, 0, 0, 0, 95, 63,
+  29, 90, 0, 25, 0, 0, 0, 1, 11, 3,
+  0, 0, 29, 0, 0, 1, 0, 38, 0, 0,
+  3, 0, 26, 25, 4, 0, 48, 0, 30, 61,
+  0, 8, 0, 30, 0, 18, 0, 0, 0, 54,
+  0, 2, 33, 0, 0, 26, 0, 44, 0, 32,
+  0, 43, 0, 0, 0, 39, 13, 0, 8, 0,
+  38, 0, 3, 19, 0, 10, 9, 7, 0, 4,
+  0, 0, 50, 0, 0, 18, 13, 0, 27, 0,
+  42, 0, 53, 0, 0, 0, 0, 5, 36, 43,
+  0, 0, 0, 0, 0, 1, 24, 87, 0, 16,
+  36, 0, 0, 9, 34, 0, 19, 29, 0, 11,
+  0, 0, 0, 24, 7, 0, 0, 36, 0, 0,
+  0, 26, 0, 8, 20, 9, 0, 66, 26, 13,
+  0, 36, 0, 0, 2, 42, 7, 10, 0, 0,
+  26, 0, 0, 0, 0, 31, 20, 0, 10, 0,
+  10, 15, 33, 0, 6, 11, 0, 7, 9, 11,
+  0, 16, 0, 29, 9, 31, 0, 20, 48, 0,
+  63, 19, 21, 0, 0, 52, 14, 4, 22, 50,
+  0, 0, 0, 71, 13, 0, 0, 0, 0, 0,
+  0, 1, 0, 0, 3, 0, 0, 16, 0, 8,
+  57, 0, 8, 0, 0, 0, 0, 0, 20, 1,
+  25, 0, 15, 8, 22, 22, 74, 0, 0, 1,
+  31, 0, 0, 0, 40, 118, 28, 13, 44, 0,
+  0, 9, 37, 0, 0, 12, 0, 12, 0, 24,
+  0, 17, 2, 0, 0, 38, 0, 0, 0, 6,
+  0, 44, 0, 22, 0, 57, 17, 0, 18, 21,
+  0, 0, 25, 88, 0, 60, 0, 0, 0, 21,
+  0, 0, 0, 0, 0, 0, 0, 3, 13, 0,
+  39, 0, 0, 18, 0, 0, 44, 0, 0, 3,
+  0, 44, 27, 45, 2, 0, 52, 4, 48, 24,
+  64, 0, 0, 0, 0, 16, 0, 45, 3, 2,
+  31, 57, 0, 0, 0, 0, 0, 0, 0, 10,
+  30, 7, 17, 0, 0, 0, 33, 0, 43, 0,
+  0, 0, 30, 0, 35, 0, 54, 0, 0, 0,
+  0, 24, 0, 0, 40, 11, 0, 0, 61, 11,
+  0, 15, 51, 85, 31, 58, 61, 16, 0, 9,
+  60, 0, 0, 53, 11, 51, 1, 8, 0, 10,
+  0, 0, 0, 42, 35, 0, 15, 23, 0, 51,
+  12, 18, 0, 69, 33, 20, 9, 0, 0, 0,
+  24, 0, 57, 28, 0, 0, 0, 2, 0, 18,
+  0, 0, 0, 0, 0, 0, 31, 0, 42, 0,
+  0, 0, 4, 14, 36, 12, 0, 6, 0, 29,
+  44, 60, 4, 0, 34, 12, 53, 16, 53, 25,
+  0, 50, 0, 27, 0, 9, 0, 0, 31, 64,
+  0, 0, 0, 0, 0, 0, 0, 12, 10, 60,
+  0, 0, 0, 0, 0, 0, 10, 13, 32, 0,
+  25, 0, 76, 0, 51, 15, 31, 0, 0, 35,
+  50, 0, 10, 0, 0, 0, 51, 2, 0, 18,
+  8, 100, 10, 27, 39, 26, 2, 4, 44, 0,
+  34, 24, 0, 0, 0, 5, 0, 0, 0, 0,
+  0, 0, 0, 0, 5, 0, 0, 22, 18, 0,
+  0, 35, 0, 0, 0, 0, 0, 0, 52, 66,
+  0, 34, 0, 0, 6, 2, 0, 0, 0, 0,
+  13, 0, 38, 2, 22, 0, 23, 0, 0, 0,
+  3, 15, 29, 0, 0, 37, 0, 21, 32, 48,
+  11, 18, 40, 3, 53, 7, 75, 6, 0, 23,
+  0, 0, 0, 1, 0, 0, 40, 70, 1, 0,
+  0, 0, 7, 0, 0, 9, 0, 8, 32, 0,
+  0, 0, 57, 0, 10, 0, 12, 0, 0, 0,
+  8, 0, 9, 14, 37, 0, 22, 0, 59, 0,
+  0, 0, 0, 0, 23, 0, 0, 0, 0, 116,
+  1, 0, 6, 27, 1, 0, 38, 30, 84, 8,
+  0, 0, 0, 4, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 2, 0, 0, 28, 17, 0, 30,
+  0, 0, 0, 0, 0, 0, 35, 131, 0, 15,
+  36, 0, 30, 17, 14, 0, 0, 0, 34, 0,
+  88, 47, 7, 2, 16, 67, 0, 0, 0, 0,
+  11, 0, 0, 0, 0, 24, 16, 22, 0, 15,
+  41, 0, 31, 10, 71, 0, 0, 11, 2, 0,
+  0, 5, 0, 0, 62, 66, 0, 0, 0, 0,
+  12, 10, 0, 7, 0, 0, 50, 0, 0, 0,
+  91, 3, 77, 0, 19, 0, 0, 0, 0, 0,
+  21, 6, 10, 0, 0, 14, 0, 0, 35, 12,
+  0, 0, 40, 0, 0, 15, 31, 88, 14, 51,
+  40, 12, 0, 18, 47, 0, 19, 50, 3, 20,
+  0, 2, 0, 0, 0, 0, 0, 38, 7, 0,
+  3, 31, 0, 29, 36, 1, 0, 74, 29, 39,
+  8, 0, 0, 0, 18, 2, 39, 14, 0, 6,
+  37, 0, 0, 0, 0, 4, 5, 0, 0, 0,
+  26, 0, 49, 0, 0, 0, 3, 3, 17, 22,
+  0, 17, 0, 21, 27, 60, 0, 26, 24, 3,
+  57, 0, 52, 33, 0, 62, 14, 8, 23, 27,
+  0, 0, 26, 70, 5, 0, 0, 0, 0, 0,
+  0, 16, 0, 35, 0, 0, 0, 12, 0, 0,
+  17, 3, 26, 0, 0, 0, 20, 0, 35, 8,
+  37, 0, 24, 0, 53, 0, 32, 0, 0, 0,
+  25, 0, 0, 1, 9, 122, 15, 0, 27, 21,
+  0, 8, 41, 13, 69, 7, 0, 0, 0, 4,
+  0, 0, 0, 0, 0, 5, 0, 0, 0, 4,
+  0, 26, 14, 10, 0, 48, 14, 0, 0, 0,
+  0, 0, 37, 104, 0, 37, 0, 0, 9, 6,
+  3, 0, 0, 0, 33, 0, 50, 22, 0, 0,
+  24, 22, 0, 1, 0, 0, 27, 0, 0, 13,
+  0, 41, 14, 36, 0, 5, 48, 0, 45, 11,
+  72, 0, 0, 2, 0, 0, 0, 25, 0, 0,
+  41, 57, 0, 0, 0, 0, 0, 0, 0, 10,
+  1, 0, 35, 0, 0, 0, 51, 0, 55, 0,
+  5, 0, 0, 0, 0, 0, 28, 1, 16, 0,
+  30, 0, 17, 10, 31, 0, 0, 0, 35, 0,
+  0, 3, 12, 104, 13, 0, 18, 16, 0, 5,
+  51, 0, 33, 3, 0, 0, 0, 16, 0, 15,
+  0, 9, 0, 7, 0, 0, 0, 0, 0, 7,
+  0, 12, 0, 50, 13, 0, 0, 0, 0, 0,
+  32, 102, 0, 61, 0, 0, 22, 15, 0, 0,
+  0, 0, 29, 0, 32, 22, 10, 15, 12, 12,
+  0, 0, 0, 0, 42, 0, 0, 0, 0, 33,
+  26, 38, 0, 3, 31, 0, 30, 10, 63, 12,
+  0, 0, 0, 0, 0, 25, 23, 0, 69, 64,
+  0, 0, 2, 0, 4, 5, 0, 9, 49, 0,
+  33, 0, 0, 3, 60, 0, 68, 0, 0, 0,
+  8, 0, 0, 0, 49, 3, 11, 0, 0, 0,
+  0, 5, 36, 43, 0, 0, 0, 0, 0, 1,
+  24, 87, 0, 16, 36, 0, 0, 9, 34, 0,
+  19, 29, 0, 11, 0, 0, 0, 24, 7, 0,
+  0, 36, 0, 0, 0, 26, 0, 8, 20, 9,
+  0, 66, 26, 13, 0, 36, 0, 0, 2, 42,
+  7, 10, 0, 0, 26, 0, 0, 0, 0, 31,
+  20, 0, 10, 0, 10, 15, 33, 0, 6, 11,
+  0, 7, 9, 11, 0, 16, 0, 29, 9, 31,
+  0, 20, 48, 0, 63, 19, 21, 0, 0, 52,
+  14, 4, 22, 50, 0, 0, 0, 71, 13, 0,
+  0, 0, 0, 0, 0, 1, 0, 0, 3, 0,
+  0, 16, 0, 8, 57, 0, 8, 0, 0, 0,
+  0, 0, 20, 1, 25, 0, 15, 8, 22, 22,
+  74, 0, 0, 1, 31, 0, 0, 0, 40, 118,
+  28, 13, 44, 0, 0, 9, 37, 0, 0, 12,
+  0, 12, 0, 24, 0, 17, 2, 0, 0, 38,
+  0, 0, 0, 6, 0, 44, 0, 22, 0, 57,
+  17, 0, 18, 21, 0, 0, 25, 88, 0, 60,
+  0, 0, 0, 21, 0, 0, 0, 0, 0, 0,
+  0, 3, 13, 0, 39, 0, 0, 18, 0, 0,
+  44, 0, 0, 3, 0, 44, 27, 45, 2, 0,
+  52, 4, 48, 24, 64, 0, 0, 0, 0, 16,
+  0, 45, 3, 2, 31, 57, 0, 0, 0, 0,
+  0, 0, 0, 10, 30, 7, 17, 0, 0, 0,
+  33, 0, 43, 0, 0, 0, 30, 0, 35, 0,
+  54, 0, 0, 0, 0, 42, 26, 36, 66, 0,
+  0, 14, 62, 8, 0, 3, 37, 89, 51, 42,
+  59, 7, 0, 10, 42, 0, 0, 21, 16, 33,
+  0, 45, 0, 0, 4, 0, 0, 27, 0, 0,
+  0, 13, 0, 62, 0, 3, 0, 70, 16, 0,
+  32, 0, 0, 0, 21, 64, 8, 79, 0, 0,
+  0, 31, 0, 20, 0, 0, 0, 0, 0, 0,
+  49, 0, 44, 0, 0, 0, 0, 2, 62, 0,
+  0, 25, 0, 37, 50, 81, 8, 1, 28, 19,
+  26, 9, 59, 14, 0, 0, 0, 31, 0, 46,
+  17, 31, 61, 56, 0, 0, 3, 0, 4, 0,
+  0, 6, 50, 28, 14, 0, 0, 0, 10, 0,
+  0, 0, 0, 0, 7, 1, 83, 0, 80, 2,
+  9, 0, 0, 35, 50, 0, 10, 0, 0, 0,
+  51, 2, 0, 18, 8, 100, 10, 27, 39, 26,
+  2, 4, 44, 0, 34, 24, 0, 0, 0, 5,
+  0, 0, 0, 0, 0, 0, 0, 0, 5, 0,
+  0, 22, 18, 0, 0, 35, 0, 0, 0, 0,
+  0, 0, 52, 66, 0, 34, 0, 0, 6, 2,
+  0, 0, 0, 0, 13, 0, 38, 2, 22, 0,
+  23, 0, 0, 0, 3, 15, 29, 0, 0, 37,
+  0, 21, 32, 48, 11, 18, 40, 3, 53, 7,
+  75, 6, 0, 23, 0, 0, 0, 1, 0, 0,
+  40, 70, 1, 0, 0, 0, 7, 0, 0, 9,
+  0, 8, 32, 0, 0, 0, 57, 0, 10, 0,
+  12, 0, 0, 0, 8, 0, 9, 14, 37, 0,
+  22, 0, 59, 0, 0, 0, 0, 0, 23, 0,
+  0, 0, 0, 116, 1, 0, 6, 27, 1, 0,
+  38, 30, 84, 8, 0, 0, 0, 4, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 2, 0, 0,
+  28, 17, 0, 30, 0, 0, 0, 0, 0, 0,
+  35, 131, 0, 15, 36, 0, 30, 17, 14, 0,
+  0, 0, 34, 0, 88, 47, 7, 2, 16, 67,
+  0, 0, 0, 0, 11, 0, 0, 0, 0, 24,
+  16, 22, 0, 15, 41, 0, 31, 10, 71, 0,
+  0, 11, 2, 0, 0, 5, 0, 0, 62, 66,
+  0, 0, 0, 0, 12, 10, 0, 7, 0, 0,
+  50, 0, 0, 0, 91, 3, 77, 0, 19, 0,
+  0, 0, 0, 0, 21, 6, 10, 0, 20, 0,
+  19, 16, 0, 0, 0, 0, 29, 0, 0, 0,
+  2, 73, 0, 0, 0, 28, 8, 5, 49, 5,
+  52, 6, 0, 0, 0, 7, 0, 12, 6, 1,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 29,
+  0, 45, 0, 0, 0, 16, 0, 0, 39, 114,
+  0, 30, 15, 0, 35, 10, 0, 0, 0, 0,
+  31, 0, 77, 23, 0, 26, 0, 48, 0, 8,
+  0, 0, 25, 0, 0, 0, 0, 24, 31, 18,
+  0, 15, 42, 0, 28, 19, 61, 0, 0, 0,
+  0, 0, 0, 9, 24, 0, 72, 41, 0, 0,
+  3, 0, 0, 0, 0, 13, 37, 0, 43, 0,
+  0, 5, 84, 0, 93, 0, 17, 0, 7, 5,
+  0, 0, 42, 4, 0, 0, 24, 0, 53, 0,
+  32, 0, 0, 0, 25, 0, 0, 1, 9, 122,
+  15, 0, 27, 21, 0, 8, 41, 13, 69, 7,
+  0, 0, 0, 4, 0, 0, 0, 0, 0, 5,
+  0, 0, 0, 4, 0, 26, 14, 10, 0, 48,
+  14, 0, 0, 0, 0, 0, 37, 104, 0, 37,
+  0, 0, 9, 6, 3, 0, 0, 0, 33, 0,
+  50, 22, 0, 0, 24, 22, 0, 1, 0, 0,
+  27, 0, 0, 13, 0, 41, 14, 36, 0, 5,
+  48, 0, 45, 11, 72, 0, 0, 2, 0, 0,
+  0, 25, 0, 0, 41, 57, 0, 0, 0, 0,
+  0, 0, 0, 10, 1, 0, 35, 0, 0, 0,
+  51, 0, 55, 0, 5, 0, 0, 0, 0, 0,
+  28, 1, 16, 0, 30, 0, 17, 10, 31, 0,
+  0, 0, 35, 0, 0, 3, 12, 104, 13, 0,
+  18, 16, 0, 5, 51, 0, 33, 3, 0, 0,
+  0, 16, 0, 15, 0, 9, 0, 7, 0, 0,
+  0, 0, 0, 7, 0, 12, 0, 50, 13, 0,
+  0, 0, 0, 0, 32, 102, 0, 61, 0, 0,
+  22, 15, 0, 0, 0, 0, 29, 0, 32, 22,
+  10, 15, 12, 12, 0, 0, 0, 0, 42, 0,
+  0, 0, 0, 33, 26, 38, 0, 3, 31, 0,
+  30, 10, 63, 12, 0, 0, 0, 0, 0, 25,
+  23, 0, 69, 64, 0, 0, 2, 0, 4, 5,
+  0, 9, 49, 0, 33, 0, 0, 3, 60, 0,
+  68, 0, 0, 0, 8, 0, 0, 0, 49, 3,
+  11, 0, 0, 22, 0, 46, 29, 0, 0, 10,
+  69, 0, 0, 23, 38, 83, 24, 20, 35, 2,
+  0, 9, 58, 0, 0, 0, 4, 48, 0, 23,
+  0, 8, 10, 0, 0, 43, 1, 0, 0, 4,
+  0, 24, 0, 21, 0, 69, 0, 0, 10, 17,
+  0, 0, 39, 72, 4, 92, 0, 0, 6, 27,
+  0, 37, 0, 0, 0, 0, 0, 8, 23, 24,
+  37, 0, 0, 3, 0, 0, 58, 0, 0, 14,
+  0, 39, 58, 70, 0, 0, 36, 5, 31, 21,
+  43, 20, 8, 4, 0, 16, 0, 28, 38, 0,
+  72, 48, 0, 0, 6, 0, 2, 0, 0, 22,
+  64, 11, 22, 0, 0, 9, 42, 0, 28, 0,
+  0, 0, 25, 29, 79, 0, 79, 5, 10, 0,
+  15, 8, 22, 22, 74, 0, 0, 1, 31, 0,
+  0, 0, 40, 118, 28, 13, 44, 0, 0, 9,
+  37, 0, 0, 12, 0, 12, 0, 24, 0, 17,
+  2, 0, 0, 38, 0, 0, 0, 6, 0, 44,
+  0, 22, 0, 57, 17, 0, 18, 21, 0, 0,
+  25, 88, 0, 60, 0, 0, 0, 21, 0, 0,
+  0, 0, 0, 0, 0, 3, 13, 0, 39, 0,
+  0, 18, 0, 0, 44, 0, 0, 3, 0, 44,
+  27, 45, 2, 0, 52, 4, 48, 24, 64, 0,
+  0, 0, 0, 16, 0, 45, 3, 2, 31, 57,
+  0, 0, 0, 0, 0, 0, 0, 10, 30, 7,
+  17, 0, 0, 0, 33, 0, 43, 0, 0, 0,
+  30, 0, 35, 0, 54, 0, 0, 0, 0, 42,
+  26, 36, 66, 0, 0, 14, 62, 8, 0, 3,
+  37, 89, 51, 42, 59, 7, 0, 10, 42, 0,
+  0, 21, 16, 33, 0, 45, 0, 0, 4, 0,
+  0, 27, 0, 0, 0, 13, 0, 62, 0, 3,
+  0, 70, 16, 0, 32, 0, 0, 0, 21, 64,
+  8, 79, 0, 0, 0, 31, 0, 20, 0, 0,
+  0, 0, 0, 0, 49, 0, 44, 0, 0, 0,
+  0, 2, 62, 0, 0, 25, 0, 37, 50, 81,
+  8, 1, 28, 19, 26, 9, 59, 14, 0, 0,
+  0, 31, 0, 46, 17, 31, 61, 56, 0, 0,
+  3, 0, 4, 0, 0, 6, 50, 28, 14, 0,
+  0, 0, 10, 0, 0, 0, 0, 0, 7, 1,
+  83, 0, 80, 2, 9, 0, 0, 25, 11, 47,
+  41, 0, 0, 5, 47, 1, 0, 16, 5, 75,
+  19, 28, 49, 26, 0, 33, 25, 0, 0, 0,
+  18, 25, 0, 34, 0, 0, 0, 0, 0, 42,
+  0, 0, 0, 16, 0, 27, 0, 0, 0, 56,
+  0, 7, 36, 0, 0, 0, 0, 20, 0, 61,
+  0, 0, 3, 18, 0, 21, 2, 0, 0, 0,
+  0, 0, 62, 6, 75, 21, 0, 0, 9, 9,
+  54, 0, 0, 53, 0, 0, 29, 74, 8, 11,
+  30, 30, 27, 34, 17, 0, 0, 29, 0, 0,
+  22, 13, 14, 0, 41, 57, 0, 6, 0, 0,
+  3, 28, 0, 7, 12, 5, 0, 0, 0, 6,
+  0, 0, 0, 0, 0, 0, 0, 0, 32, 0,
+  54, 11, 27, 0, 22, 0, 59, 0, 0, 0,
+  0, 0, 23, 0, 0, 0, 0, 116, 1, 0,
+  6, 27, 1, 0, 38, 30, 84, 8, 0, 0,
+  0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 2, 0, 0, 28, 17, 0, 30, 0, 0,
+  0, 0, 0, 0, 35, 131, 0, 15, 36, 0,
+  30, 17, 14, 0, 0, 0, 34, 0, 88, 47,
+  7, 2, 16, 67, 0, 0, 0, 0, 11, 0,
+  0, 0, 0, 24, 16, 22, 0, 15, 41, 0,
+  31, 10, 71, 0, 0, 11, 2, 0, 0, 5,
+  0, 0, 62, 66, 0, 0, 0, 0, 12, 10,
+  0, 7, 0, 0, 50, 0, 0, 0, 91, 3,
+  77, 0, 19, 0, 0, 0, 0, 0, 21, 6,
+  10, 0, 20, 0, 19, 16, 0, 0, 0, 0,
+  29, 0, 0, 0, 2, 73, 0, 0, 0, 28,
+  8, 5, 49, 5, 52, 6, 0, 0, 0, 7,
+  0, 12, 6, 1, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 29, 0, 45, 0, 0, 0, 16,
+  0, 0, 39, 114, 0, 30, 15, 0, 35, 10,
+  0, 0, 0, 0, 31, 0, 77, 23, 0, 26,
+  0, 48, 0, 8, 0, 0, 25, 0, 0, 0,
+  0, 24, 31, 18, 0, 15, 42, 0, 28, 19,
+  61, 0, 0, 0, 0, 0, 0, 9, 24, 0,
+  72, 41, 0, 0, 3, 0, 0, 0, 0, 13,
+  37, 0, 43, 0, 0, 5, 84, 0, 93, 0,
+  17, 0, 7, 5, 0, 0, 42, 4, 0, 0,
+  3, 16, 0, 41, 1, 0, 4, 6, 70, 0,
+  0, 11, 25, 55, 18, 0, 14, 4, 17, 0,
+  52, 0, 0, 17, 0, 16, 4, 14, 0, 32,
+  2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 25, 0, 53, 0, 0, 5, 16, 0, 0,
+  58, 87, 18, 68, 0, 0, 15, 25, 0, 19,
+  0, 0, 0, 0, 0, 11, 7, 13, 8, 0,
+  0, 9, 0, 0, 44, 3, 0, 0, 0, 43,
+  57, 57, 0, 0, 32, 0, 31, 33, 74, 29,
+  25, 0, 0, 0, 0, 11, 45, 0, 71, 48,
+  0, 0, 7, 0, 2, 0, 0, 12, 74, 6,
+  34, 0, 0, 0, 67, 0, 49, 0, 0, 0,
+  48, 9, 63, 0, 76, 0, 5, 0, 30, 0,
+  17, 10, 31, 0, 0, 0, 35, 0, 0, 3,
+  12, 104, 13, 0, 18, 16, 0, 5, 51, 0,
+  33, 3, 0, 0, 0, 16, 0, 15, 0, 9,
+  0, 7, 0, 0, 0, 0, 0, 7, 0, 12,
+  0, 50, 13, 0, 0, 0, 0, 0, 32, 102,
+  0, 61, 0, 0, 22, 15, 0, 0, 0, 0,
+  29, 0, 32, 22, 10, 15, 12, 12, 0, 0,
+  0, 0, 42, 0, 0, 0, 0, 33, 26, 38,
+  0, 3, 31, 0, 30, 10, 63, 12, 0, 0,
+  0, 0, 0, 25, 23, 0, 69, 64, 0, 0,
+  2, 0, 4, 5, 0, 9, 49, 0, 33, 0,
+  0, 3, 60, 0, 68, 0, 0, 0, 8, 0,
+  0, 0, 49, 3, 11, 0, 0, 22, 0, 46,
+  29, 0, 0, 10, 69, 0, 0, 23, 38, 83,
+  24, 20, 35, 2, 0, 9, 58, 0, 0, 0,
+  4, 48, 0, 23, 0, 8, 10, 0, 0, 43,
+  1, 0, 0, 4, 0, 24, 0, 21, 0, 69,
+  0, 0, 10, 17, 0, 0, 39, 72, 4, 92,
+  0, 0, 6, 27, 0, 37, 0, 0, 0, 0,
+  0, 8, 23, 24, 37, 0, 0, 3, 0, 0,
+  58, 0, 0, 14, 0, 39, 58, 70, 0, 0,
+  36, 5, 31, 21, 43, 20, 8, 4, 0, 16,
+  0, 28, 38, 0, 72, 48, 0, 0, 6, 0,
+  2, 0, 0, 22, 64, 11, 22, 0, 0, 9,
+  42, 0, 28, 0, 0, 0, 25, 29, 79, 0,
+  79, 5, 10, 0, 0, 19, 0, 49, 12, 0,
+  0, 25, 85, 2, 1, 7, 23, 85, 32, 34,
+  52, 0, 5, 0, 23, 0, 0, 0, 0, 25,
+  0, 34, 0, 0, 0, 0, 0, 25, 0, 0,
+  0, 0, 0, 23, 0, 6, 0, 46, 0, 0,
+  22, 18, 0, 0, 24, 75, 20, 83, 0, 0,
+  0, 46, 0, 19, 0, 0, 0, 0, 0, 30,
+  41, 0, 59, 0, 0, 0, 0, 12, 50, 0,
+  0, 9, 0, 32, 59, 63, 9, 0, 17, 31,
+  16, 61, 46, 0, 20, 36, 0, 0, 0, 9,
+  42, 0, 48, 63, 0, 0, 0, 0, 9, 0,
+  0, 19, 28, 6, 15, 0, 0, 0, 28, 0,
+  22, 0, 0, 0, 15, 1, 73, 0, 78, 3,
+  7, 0, 0, 42, 26, 36, 66, 0, 0, 14,
+  62, 8, 0, 3, 37, 89, 51, 42, 59, 7,
+  0, 10, 42, 0, 0, 21, 16, 33, 0, 45,
+  0, 0, 4, 0, 0, 27, 0, 0, 0, 13,
+  0, 62, 0, 3, 0, 70, 16, 0, 32, 0,
+  0, 0, 21, 64, 8, 79, 0, 0, 0, 31,
+  0, 20, 0, 0, 0, 0, 0, 0, 49, 0,
+  44, 0, 0, 0, 0, 2, 62, 0, 0, 25,
+  0, 37, 50, 81, 8, 1, 28, 19, 26, 9,
+  59, 14, 0, 0, 0, 31, 0, 46, 17, 31,
+  61, 56, 0, 0, 3, 0, 4, 0, 0, 6,
+  50, 28, 14, 0, 0, 0, 10, 0, 0, 0,
+  0, 0, 7, 1, 83, 0, 80, 2, 9, 0,
+  0, 25, 11, 47, 41, 0, 0, 5, 47, 1,
+  0, 16, 5, 75, 19, 28, 49, 26, 0, 33,
+  25, 0, 0, 0, 18, 25, 0, 34, 0, 0,
+  0, 0, 0, 42, 0, 0, 0, 16, 0, 27,
+  0, 0, 0, 56, 0, 7, 36, 0, 0, 0,
+  0, 20, 0, 61, 0, 0, 3, 18, 0, 21,
+  2, 0, 0, 0, 0, 0, 62, 6, 75, 21,
+  0, 0, 9, 9, 54, 0, 0, 53, 0, 0,
+  29, 74, 8, 11, 30, 30, 27, 34, 17, 0,
+  0, 29, 0, 0, 22, 13, 14, 0, 41, 57,
+  0, 6, 0, 0, 3, 28, 0, 7, 12, 5,
+  0, 0, 0, 6, 0, 0, 0, 0, 0, 0,
+  0, 0, 32, 0, 54, 11, 27, 0, 0, 0,
+  0, 70, 0, 0, 0, 2, 33, 0, 0, 0,
+  0, 43, 0, 6, 22, 39, 0, 28, 7, 0,
+  9, 0, 0, 0, 28, 31, 0, 0, 0, 0,
+  0, 29, 0, 0, 2, 27, 0, 0, 0, 0,
+  0, 6, 0, 5, 36, 29, 18, 0, 0, 0,
+  0, 40, 0, 15, 23, 36, 0, 10, 8, 17,
+  0, 4, 56, 0, 56, 30, 68, 85, 5, 0,
+  19, 21, 32, 0, 0, 9, 20, 0, 0, 41,
+  10, 0, 11, 39, 17, 55, 0, 0, 0, 81,
+  0, 0, 54, 0, 6, 0, 21, 50, 24, 33,
+  0, 0, 0, 40, 0, 5, 0, 0, 0, 0,
+  0, 0, 7, 0, 7, 0, 0, 0, 0, 0,
+  0, 0, 0, 21, 20, 0, 20, 0, 19, 16,
+  0, 0, 0, 0, 29, 0, 0, 0, 2, 73,
+  0, 0, 0, 28, 8, 5, 49, 5, 52, 6,
+  0, 0, 0, 7, 0, 12, 6, 1, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 29, 0, 45,
+  0, 0, 0, 16, 0, 0, 39, 114, 0, 30,
+  15, 0, 35, 10, 0, 0, 0, 0, 31, 0,
+  77, 23, 0, 26, 0, 48, 0, 8, 0, 0,
+  25, 0, 0, 0, 0, 24, 31, 18, 0, 15,
+  42, 0, 28, 19, 61, 0, 0, 0, 0, 0,
+  0, 9, 24, 0, 72, 41, 0, 0, 3, 0,
+  0, 0, 0, 13, 37, 0, 43, 0, 0, 5,
+  84, 0, 93, 0, 17, 0, 7, 5, 0, 0,
+  42, 4, 0, 0, 3, 16, 0, 41, 1, 0,
+  4, 6, 70, 0, 0, 11, 25, 55, 18, 0,
+  14, 4, 17, 0, 52, 0, 0, 17, 0, 16,
+  4, 14, 0, 32, 2, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 25, 0, 53, 0, 0,
+  5, 16, 0, 0, 58, 87, 18, 68, 0, 0,
+  15, 25, 0, 19, 0, 0, 0, 0, 0, 11,
+  7, 13, 8, 0, 0, 9, 0, 0, 44, 3,
+  0, 0, 0, 43, 57, 57, 0, 0, 32, 0,
+  31, 33, 74, 29, 25, 0, 0, 0, 0, 11,
+  45, 0, 71, 48, 0, 0, 7, 0, 2, 0,
+  0, 12, 74, 6, 34, 0, 0, 0, 67, 0,
+  49, 0, 0, 0, 48, 9, 63, 0, 76, 0,
+  5, 0, 0, 29, 0, 36, 17, 0, 0, 1,
+  82, 0, 0, 10, 14, 80, 41, 0, 22, 8,
+  10, 0, 47, 0, 0, 23, 0, 13, 0, 15,
+  0, 5, 0, 0, 0, 11, 0, 0, 0, 0,
+  0, 11, 0, 0, 0, 51, 0, 0, 23, 16,
+  0, 0, 35, 72, 21, 74, 0, 0, 3, 24,
+  0, 11, 0, 0, 0, 0, 0, 21, 29, 0,
+  30, 0, 0, 0, 0, 0, 58, 0, 0, 0,
+  0, 30, 56, 60, 4, 0, 25, 0, 29, 51,
+  61, 17, 7, 13, 0, 0, 0, 14, 29, 0,
+  67, 43, 0, 16, 0, 0, 10, 1, 0, 7,
+  54, 13, 18, 0, 0, 0, 34, 0, 15, 0,
+  0, 0, 35, 0, 63, 0, 64, 0, 8, 0,
+  0, 22, 0, 46, 29, 0, 0, 10, 69, 0,
+  0, 23, 38, 83, 24, 20, 35, 2, 0, 9,
+  58, 0, 0, 0, 4, 48, 0, 23, 0, 8,
+  10, 0, 0, 43, 1, 0, 0, 4, 0, 24,
+  0, 21, 0, 69, 0, 0, 10, 17, 0, 0,
+  39, 72, 4, 92, 0, 0, 6, 27, 0, 37,
+  0, 0, 0, 0, 0, 8, 23, 24, 37, 0,
+  0, 3, 0, 0, 58, 0, 0, 14, 0, 39,
+  58, 70, 0, 0, 36, 5, 31, 21, 43, 20,
+  8, 4, 0, 16, 0, 28, 38, 0, 72, 48,
+  0, 0, 6, 0, 2, 0, 0, 22, 64, 11,
+  22, 0, 0, 9, 42, 0, 28, 0, 0, 0,
+  25, 29, 79, 0, 79, 5, 10, 0, 0, 19,
+  0, 49, 12, 0, 0, 25, 85, 2, 1, 7,
+  23, 85, 32, 34, 52, 0, 5, 0, 23, 0,
+  0, 0, 0, 25, 0, 34, 0, 0, 0, 0,
+  0, 25, 0, 0, 0, 0, 0, 23, 0, 6,
+  0, 46, 0, 0, 22, 18, 0, 0, 24, 75,
+  20, 83, 0, 0, 0, 46, 0, 19, 0, 0,
+  0, 0, 0, 30, 41, 0, 59, 0, 0, 0,
+  0, 12, 50, 0, 0, 9, 0, 32, 59, 63,
+  9, 0, 17, 31, 16, 61, 46, 0, 20, 36,
+  0, 0, 0, 9, 42, 0, 48, 63, 0, 0,
+  0, 0, 9, 0, 0, 19, 28, 6, 15, 0,
+  0, 0, 28, 0, 22, 0, 0, 0, 15, 1,
+  73, 0, 78, 3, 7, 0, 0, 4, 2, 46,
+  13, 0, 0, 32, 107, 4, 2, 0, 4, 83,
+  44, 32, 46, 4, 0, 0, 3, 0, 0, 10,
+  0, 0, 0, 35, 0, 0, 0, 0, 0, 15,
+  0, 0, 0, 0, 0, 24, 0, 0, 0, 32,
+  0, 0, 49, 17, 0, 0, 0, 80, 25, 73,
+  0, 0, 0, 50, 0, 3, 0, 0, 0, 0,
+  0, 35, 49, 0, 61, 9, 0, 0, 3, 17,
+  57, 9, 0, 0, 0, 10, 48, 46, 9, 0,
+  7, 32, 17, 79, 43, 0, 37, 35, 0, 0,
+  0, 5, 31, 0, 49, 67, 11, 1, 0, 0,
+  15, 0, 0, 19, 8, 3, 5, 0, 0, 0,
+  19, 0, 26, 0, 0, 0, 5, 0, 65, 0,
+  62, 0, 2, 0, 0, 25, 11, 47, 41, 0,
+  0, 5, 47, 1, 0, 16, 5, 75, 19, 28,
+  49, 26, 0, 33, 25, 0, 0, 0, 18, 25,
+  0, 34, 0, 0, 0, 0, 0, 42, 0, 0,
+  0, 16, 0, 27, 0, 0, 0, 56, 0, 7,
+  36, 0, 0, 0, 0, 20, 0, 61, 0, 0,
+  3, 18, 0, 21, 2, 0, 0, 0, 0, 0,
+  62, 6, 75, 21, 0, 0, 9, 9, 54, 0,
+  0, 53, 0, 0, 29, 74, 8, 11, 30, 30,
+  27, 34, 17, 0, 0, 29, 0, 0, 22, 13,
+  14, 0, 41, 57, 0, 6, 0, 0, 3, 28,
+  0, 7, 12, 5, 0, 0, 0, 6, 0, 0,
+  0, 0, 0, 0, 0, 0, 32, 0, 54, 11,
+  27, 0, 0, 0, 0, 70, 0, 0, 0, 2,
+  33, 0, 0, 0, 0, 43, 0, 6, 22, 39,
+  0, 28, 7, 0, 9, 0, 0, 0, 28, 31,
+  0, 0, 0, 0, 0, 29, 0, 0, 2, 27,
+  0, 0, 0, 0, 0, 6, 0, 5, 36, 29,
+  18, 0, 0, 0, 0, 40, 0, 15, 23, 36,
+  0, 10, 8, 17, 0, 4, 56, 0, 56, 30,
+  68, 85, 5, 0, 19, 21, 32, 0, 0, 9,
+  20, 0, 0, 41, 10, 0, 11, 39, 17, 55,
+  0, 0, 0, 81, 0, 0, 54, 0, 6, 0,
+  21, 50, 24, 33, 0, 0, 0, 40, 0, 5,
+  0, 0, 0, 0, 0, 0, 7, 0, 7, 0,
+  0, 0, 0, 0, 0, 0, 0, 21, 20, 0,
+  0, 8, 0, 102, 1, 0, 0, 14, 69, 27,
+  0, 0, 0, 1, 0, 66, 27, 37, 0, 17,
+  6, 0, 0, 0, 2, 0, 52, 58, 12, 0,
+  0, 0, 14, 27, 0, 0, 6, 45, 0, 0,
+  2, 0, 0, 11, 0, 17, 56, 34, 0, 0,
+  0, 0, 2, 38, 0, 25, 6, 68, 0, 37,
+  0, 16, 0, 2, 22, 0, 50, 18, 67, 47,
+  0, 0, 22, 50, 27, 21, 0, 3, 14, 0,
+  29, 40, 11, 0, 0, 47, 18, 59, 13, 0,
+  37, 101, 0, 22, 37, 0, 12, 0, 20, 34,
+  37, 0, 0, 0, 4, 0, 0, 14, 0, 6,
+  0, 13, 0, 0, 10, 0, 0, 0, 0, 0,
+  4, 0, 56, 0, 21, 28, 9, 0, 3, 16,
+  0, 41, 1, 0, 4, 6, 70, 0, 0, 11,
+  25, 55, 18, 0, 14, 4, 17, 0, 52, 0,
+  0, 17, 0, 16, 4, 14, 0, 32, 2, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 25,
+  0, 53, 0, 0, 5, 16, 0, 0, 58, 87,
+  18, 68, 0, 0, 15, 25, 0, 19, 0, 0,
+  0, 0, 0, 11, 7, 13, 8, 0, 0, 9,
+  0, 0, 44, 3, 0, 0, 0, 43, 57, 57,
+  0, 0, 32, 0, 31, 33, 74, 29, 25, 0,
+  0, 0, 0, 11, 45, 0, 71, 48, 0, 0,
+  7, 0, 2, 0, 0, 12, 74, 6, 34, 0,
+  0, 0, 67, 0, 49, 0, 0, 0, 48, 9,
+  63, 0, 76, 0, 5, 0, 0, 29, 0, 36,
+  17, 0, 0, 1, 82, 0, 0, 10, 14, 80,
+  41, 0, 22, 8, 10, 0, 47, 0, 0, 23,
+  0, 13, 0, 15, 0, 5, 0, 0, 0, 11,
+  0, 0, 0, 0, 0, 11, 0, 0, 0, 51,
+  0, 0, 23, 16, 0, 0, 35, 72, 21, 74,
+  0, 0, 3, 24, 0, 11, 0, 0, 0, 0,
+  0, 21, 29, 0, 30, 0, 0, 0, 0, 0,
+  58, 0, 0, 0, 0, 30, 56, 60, 4, 0,
+  25, 0, 29, 51, 61, 17, 7, 13, 0, 0,
+  0, 14, 29, 0, 67, 43, 0, 16, 0, 0,
+  10, 1, 0, 7, 54, 13, 18, 0, 0, 0,
+  34, 0, 15, 0, 0, 0, 35, 0, 63, 0,
+  64, 0, 8, 0, 0, 64, 0, 40, 20, 0,
+  10, 0, 63, 0, 7, 15, 12, 65, 48, 6,
+  31, 34, 0, 25, 58, 0, 0, 21, 0, 36,
+  3, 4, 0, 0, 0, 0, 0, 32, 0, 0,
+  0, 0, 0, 11, 0, 0, 0, 41, 0, 0,
+  21, 22, 0, 0, 26, 26, 28, 76, 0, 0,
+  10, 4, 0, 25, 19, 0, 0, 0, 0, 11,
+  55, 3, 50, 0, 0, 0, 0, 0, 62, 0,
+  0, 0, 0, 3, 57, 69, 4, 0, 25, 19,
+  41, 29, 30, 12, 0, 34, 0, 1, 0, 24,
+  19, 0, 63, 30, 0, 19, 0, 0, 12, 0,
+  3, 1, 34, 21, 0, 0, 0, 0, 15, 0,
+  0, 0, 0, 0, 0, 13, 75, 0, 41, 0,
+  17, 0, 0, 19, 0, 49, 12, 0, 0, 25,
+  85, 2, 1, 7, 23, 85, 32, 34, 52, 0,
+  5, 0, 23, 0, 0, 0, 0, 25, 0, 34,
+  0, 0, 0, 0, 0, 25, 0, 0, 0, 0,
+  0, 23, 0, 6, 0, 46, 0, 0, 22, 18,
+  0, 0, 24, 75, 20, 83, 0, 0, 0, 46,
+  0, 19, 0, 0, 0, 0, 0, 30, 41, 0,
+  59, 0, 0, 0, 0, 12, 50, 0, 0, 9,
+  0, 32, 59, 63, 9, 0, 17, 31, 16, 61,
+  46, 0, 20, 36, 0, 0, 0, 9, 42, 0,
+  48, 63, 0, 0, 0, 0, 9, 0, 0, 19,
+  28, 6, 15, 0, 0, 0, 28, 0, 22, 0,
+  0, 0, 15, 1, 73, 0, 78, 3, 7, 0,
+  0, 4, 2, 46, 13, 0, 0, 32, 107, 4,
+  2, 0, 4, 83, 44, 32, 46, 4, 0, 0,
+  3, 0, 0, 10, 0, 0, 0, 35, 0, 0,
+  0, 0, 0, 15, 0, 0, 0, 0, 0, 24,
+  0, 0, 0, 32, 0, 0, 49, 17, 0, 0,
+  0, 80, 25, 73, 0, 0, 0, 50, 0, 3,
+  0, 0, 0, 0, 0, 35, 49, 0, 61, 9,
+  0, 0, 3, 17, 57, 9, 0, 0, 0, 10,
+  48, 46, 9, 0, 7, 32, 17, 79, 43, 0,
+  37, 35, 0, 0, 0, 5, 31, 0, 49, 67,
+  11, 1, 0, 0, 15, 0, 0, 19, 8, 3,
+  5, 0, 0, 0, 19, 0, 26, 0, 0, 0,
+  5, 0, 65, 0, 62, 0, 2, 0, 0, 37,
+  0, 44, 22, 0, 8, 20, 82, 0, 25, 11,
+  12, 56, 55, 36, 59, 22, 0, 12, 31, 0,
+  0, 0, 1, 27, 0, 18, 0, 0, 0, 0,
+  0, 37, 0, 0, 0, 0, 0, 14, 0, 0,
+  0, 28, 0, 0, 38, 1, 0, 0, 0, 23,
+  0, 87, 0, 0, 4, 32, 0, 38, 0, 0,
+  0, 0, 0, 27, 62, 7, 79, 0, 0, 0,
+  0, 8, 73, 0, 0, 19, 6, 1, 28, 74,
+  0, 0, 22, 50, 31, 43, 10, 0, 10, 37,
+  0, 20, 0, 33, 31, 10, 59, 36, 0, 0,
+  0, 0, 17, 0, 0, 13, 9, 1, 0, 0,
+  0, 0, 9, 0, 0, 0, 0, 0, 0, 23,
+  74, 0, 31, 0, 36, 0, 0, 0, 0, 70,
+  0, 0, 0, 2, 33, 0, 0, 0, 0, 43,
+  0, 6, 22, 39, 0, 28, 7, 0, 9, 0,
+  0, 0, 28, 31, 0, 0, 0, 0, 0, 29,
+  0, 0, 2, 27, 0, 0, 0, 0, 0, 6,
+  0, 5, 36, 29, 18, 0, 0, 0, 0, 40,
+  0, 15, 23, 36, 0, 10, 8, 17, 0, 4,
+  56, 0, 56, 30, 68, 85, 5, 0, 19, 21,
+  32, 0, 0, 9, 20, 0, 0, 41, 10, 0,
+  11, 39, 17, 55, 0, 0, 0, 81, 0, 0,
+  54, 0, 6, 0, 21, 50, 24, 33, 0, 0,
+  0, 40, 0, 5, 0, 0, 0, 0, 0, 0,
+  7, 0, 7, 0, 0, 0, 0, 0, 0, 0,
+  0, 21, 20, 0, 0, 8, 0, 102, 1, 0,
+  0, 14, 69, 27, 0, 0, 0, 1, 0, 66,
+  27, 37, 0, 17, 6, 0, 0, 0, 2, 0,
+  52, 58, 12, 0, 0, 0, 14, 27, 0, 0,
+  6, 45, 0, 0, 2, 0, 0, 11, 0, 17,
+  56, 34, 0, 0, 0, 0, 2, 38, 0, 25,
+  6, 68, 0, 37, 0, 16, 0, 2, 22, 0,
+  50, 18, 67, 47, 0, 0, 22, 50, 27, 21,
+  0, 3, 14, 0, 29, 40, 11, 0, 0, 47,
+  18, 59, 13, 0, 37, 101, 0, 22, 37, 0,
+  12, 0, 20, 34, 37, 0, 0, 0, 4, 0,
+  0, 14, 0, 6, 0, 13, 0, 0, 10, 0,
+  0, 0, 0, 0, 4, 0, 56, 0, 21, 28,
+  9, 0, 0, 56, 17, 88, 0, 0, 31, 9,
+  81, 2, 5, 0, 0, 6, 2, 91, 38, 27,
+  0, 41, 0, 0, 0, 0, 13, 0, 37, 42,
+  0, 0, 0, 2, 9, 19, 0, 0, 16, 37,
+  0, 0, 16, 0, 0, 26, 0, 16, 70, 3,
+  0, 0, 0, 0, 0, 52, 0, 0, 15, 62,
+  0, 58, 0, 17, 0, 7, 22, 0, 63, 23,
+  93, 25, 0, 0, 31, 35, 54, 3, 0, 8,
+  19, 0, 32, 63, 17, 6, 25, 64, 9, 35,
+  25, 0, 32, 85, 0, 27, 5, 0, 11, 0,
+  41, 54, 31, 0, 0, 0, 12, 3, 0, 31,
+  0, 0, 0, 17, 0, 0, 32, 0, 0, 0,
+  0, 0, 0, 0, 65, 0, 25, 16, 30, 0,
+  0, 29, 0, 36, 17, 0, 0, 1, 82, 0,
+  0, 10, 14, 80, 41, 0, 22, 8, 10, 0,
+  47, 0, 0, 23, 0, 13, 0, 15, 0, 5,
+  0, 0, 0, 11, 0, 0, 0, 0, 0, 11,
+  0, 0, 0, 51, 0, 0, 23, 16, 0, 0,
+  35, 72, 21, 74, 0, 0, 3, 24, 0, 11,
+  0, 0, 0, 0, 0, 21, 29, 0, 30, 0,
+  0, 0, 0, 0, 58, 0, 0, 0, 0, 30,
+  56, 60, 4, 0, 25, 0, 29, 51, 61, 17,
+  7, 13, 0, 0, 0, 14, 29, 0, 67, 43,
+  0, 16, 0, 0, 10, 1, 0, 7, 54, 13,
+  18, 0, 0, 0, 34, 0, 15, 0, 0, 0,
+  35, 0, 63, 0, 64, 0, 8, 0, 0, 64,
+  0, 40, 20, 0, 10, 0, 63, 0, 7, 15,
+  12, 65, 48, 6, 31, 34, 0, 25, 58, 0,
+  0, 21, 0, 36, 3, 4, 0, 0, 0, 0,
+  0, 32, 0, 0, 0, 0, 0, 11, 0, 0,
+  0, 41, 0, 0, 21, 22, 0, 0, 26, 26,
+  28, 76, 0, 0, 10, 4, 0, 25, 19, 0,
+  0, 0, 0, 11, 55, 3, 50, 0, 0, 0,
+  0, 0, 62, 0, 0, 0, 0, 3, 57, 69,
+  4, 0, 25, 19, 41, 29, 30, 12, 0, 34,
+  0, 1, 0, 24, 19, 0, 63, 30, 0, 19,
+  0, 0, 12, 0, 3, 1, 34, 21, 0, 0,
+  0, 0, 15, 0, 0, 0, 0, 0, 0, 13,
+  75, 0, 41, 0, 17, 0, 0, 151, 1, 57,
+  8, 0, 17, 0, 42, 0, 26, 0, 19, 37,
+  38, 18, 29, 7, 6, 53, 10, 0, 0, 24,
+  1, 37, 15, 7, 0, 0, 0, 0, 46, 5,
+  0, 0, 0, 0, 0, 1, 0, 2, 0, 21,
+  0, 0, 21, 42, 0, 0, 40, 0, 12, 89,
+  0, 0, 18, 1, 0, 44, 24, 0, 0, 0,
+  0, 0, 73, 21, 53, 0, 0, 0, 0, 8,
+  68, 12, 0, 35, 0, 18, 49, 62, 21, 11,
+  30, 33, 16, 49, 19, 13, 53, 22, 0, 17,
+  0, 5, 44, 0, 24, 80, 3, 46, 0, 0,
+  12, 0, 22, 12, 52, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 89, 0,
+  51, 0, 16, 1, 0, 4, 2, 46, 13, 0,
+  0, 32, 107, 4, 2, 0, 4, 83, 44, 32,
+  46, 4, 0, 0, 3, 0, 0, 10, 0, 0,
+  0, 35, 0, 0, 0, 0, 0, 15, 0, 0,
+  0, 0, 0, 24, 0, 0, 0, 32, 0, 0,
+  49, 17, 0, 0, 0, 80, 25, 73, 0, 0,
+  0, 50, 0, 3, 0, 0, 0, 0, 0, 35,
+  49, 0, 61, 9, 0, 0, 3, 17, 57, 9,
+  0, 0, 0, 10, 48, 46, 9, 0, 7, 32,
+  17, 79, 43, 0, 37, 35, 0, 0, 0, 5,
+  31, 0, 49, 67, 11, 1, 0, 0, 15, 0,
+  0, 19, 8, 3, 5, 0, 0, 0, 19, 0,
+  26, 0, 0, 0, 5, 0, 65, 0, 62, 0,
+  2, 0, 0, 37, 0, 44, 22, 0, 8, 20,
+  82, 0, 25, 11, 12, 56, 55, 36, 59, 22,
+  0, 12, 31, 0, 0, 0, 1, 27, 0, 18,
+  0, 0, 0, 0, 0, 37, 0, 0, 0, 0,
+  0, 14, 0, 0, 0, 28, 0, 0, 38, 1,
+  0, 0, 0, 23, 0, 87, 0, 0, 4, 32,
+  0, 38, 0, 0, 0, 0, 0, 27, 62, 7,
+  79, 0, 0, 0, 0, 8, 73, 0, 0, 19,
+  6, 1, 28, 74, 0, 0, 22, 50, 31, 43,
+  10, 0, 10, 37, 0, 20, 0, 33, 31, 10,
+  59, 36, 0, 0, 0, 0, 17, 0, 0, 13,
+  9, 1, 0, 0, 0, 0, 9, 0, 0, 0,
+  0, 0, 0, 23, 74, 0, 31, 0, 36, 0,
+  0, 74, 18, 48, 36, 0, 9, 0, 60, 0,
+  36, 0, 0, 63, 66, 33, 53, 1, 1, 40,
+  5, 0, 0, 0, 0, 29, 0, 0, 0, 0,
+  0, 0, 0, 33, 0, 0, 0, 0, 0, 13,
+  0, 0, 0, 7, 0, 0, 40, 19, 0, 0,
+  0, 0, 0, 107, 0, 0, 12, 52, 0, 31,
+  0, 27, 0, 0, 0, 19, 66, 8, 85, 0,
+  0, 0, 0, 0, 65, 0, 0, 12, 15, 13,
+  23, 55, 0, 0, 38, 70, 22, 57, 6, 0,
+  10, 41, 0, 20, 0, 27, 34, 9, 25, 65,
+  0, 0, 0, 0, 11, 0, 0, 0, 15, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 46, 0, 22, 0, 42, 0, 0, 8,
+  0, 102, 1, 0, 0, 14, 69, 27, 0, 0,
+  0, 1, 0, 66, 27, 37, 0, 17, 6, 0,
+  0, 0, 2, 0, 52, 58, 12, 0, 0, 0,
+  14, 27, 0, 0, 6, 45, 0, 0, 2, 0,
+  0, 11, 0, 17, 56, 34, 0, 0, 0, 0,
+  2, 38, 0, 25, 6, 68, 0, 37, 0, 16,
+  0, 2, 22, 0, 50, 18, 67, 47, 0, 0,
+  22, 50, 27, 21, 0, 3, 14, 0, 29, 40,
+  11, 0, 0, 47, 18, 59, 13, 0, 37, 101,
+  0, 22, 37, 0, 12, 0, 20, 34, 37, 0,
+  0, 0, 4, 0, 0, 14, 0, 6, 0, 13,
+  0, 0, 10, 0, 0, 0, 0, 0, 4, 0,
+  56, 0, 21, 28, 9, 0, 0, 56, 17, 88,
+  0, 0, 31, 9, 81, 2, 5, 0, 0, 6,
+  2, 91, 38, 27, 0, 41, 0, 0, 0, 0,
+  13, 0, 37, 42, 0, 0, 0, 2, 9, 19,
+  0, 0, 16, 37, 0, 0, 16, 0, 0, 26,
+  0, 16, 70, 3, 0, 0, 0, 0, 0, 52,
+  0, 0, 15, 62, 0, 58, 0, 17, 0, 7,
+  22, 0, 63, 23, 93, 25, 0, 0, 31, 35,
+  54, 3, 0, 8, 19, 0, 32, 63, 17, 6,
+  25, 64, 9, 35, 25, 0, 32, 85, 0, 27,
+  5, 0, 11, 0, 41, 54, 31, 0, 0, 0,
+  12, 3, 0, 31, 0, 0, 0, 17, 0, 0,
+  32, 0, 0, 0, 0, 0, 0, 0, 65, 0,
+  25, 16, 30, 0, 0, 28, 8, 32, 27, 0,
+  2, 0, 68, 0, 19, 0, 0, 42, 7, 49,
+  43, 15, 20, 47, 0, 0, 0, 0, 0, 0,
+  3, 32, 0, 0, 0, 6, 4, 23, 0, 12,
+  7, 21, 0, 0, 2, 0, 0, 18, 0, 11,
+  54, 50, 0, 0, 0, 0, 0, 40, 0, 0,
+  45, 53, 0, 11, 0, 42, 0, 0, 22, 4,
+  38, 14, 110, 11, 16, 0, 30, 15, 57, 0,
+  0, 0, 2, 0, 0, 18, 21, 0, 59, 45,
+  0, 63, 2, 0, 3, 85, 0, 10, 16, 0,
+  9, 0, 31, 80, 7, 29, 0, 0, 22, 22,
+  0, 19, 0, 0, 0, 25, 0, 0, 16, 0,
+  0, 0, 0, 0, 0, 0, 11, 0, 0, 5,
+  46, 8, 0, 64, 0, 40, 20, 0, 10, 0,
+  63, 0, 7, 15, 12, 65, 48, 6, 31, 34,
+  0, 25, 58, 0, 0, 21, 0, 36, 3, 4,
+  0, 0, 0, 0, 0, 32, 0, 0, 0, 0,
+  0, 11, 0, 0, 0, 41, 0, 0, 21, 22,
+  0, 0, 26, 26, 28, 76, 0, 0, 10, 4,
+  0, 25, 19, 0, 0, 0, 0, 11, 55, 3,
+  50, 0, 0, 0, 0, 0, 62, 0, 0, 0,
+  0, 3, 57, 69, 4, 0, 25, 19, 41, 29,
+  30, 12, 0, 34, 0, 1, 0, 24, 19, 0,
+  63, 30, 0, 19, 0, 0, 12, 0, 3, 1,
+  34, 21, 0, 0, 0, 0, 15, 0, 0, 0,
+  0, 0, 0, 13, 75, 0, 41, 0, 17, 0,
+  0, 151, 1, 57, 8, 0, 17, 0, 42, 0,
+  26, 0, 19, 37, 38, 18, 29, 7, 6, 53,
+  10, 0, 0, 24, 1, 37, 15, 7, 0, 0,
+  0, 0, 46, 5, 0, 0, 0, 0, 0, 1,
+  0, 2, 0, 21, 0, 0, 21, 42, 0, 0,
+  40, 0, 12, 89, 0, 0, 18, 1, 0, 44,
+  24, 0, 0, 0, 0, 0, 73, 21, 53, 0,
+  0, 0, 0, 8, 68, 12, 0, 35, 0, 18,
+  49, 62, 21, 11, 30, 33, 16, 49, 19, 13,
+  53, 22, 0, 17, 0, 5, 44, 0, 24, 80,
+  3, 46, 0, 0, 12, 0, 22, 12, 52, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 89, 0, 51, 0, 16, 1, 6, 145,
+  0, 66, 0, 25, 0, 0, 52, 0, 6, 0,
+  69, 0, 0, 0, 0, 5, 33, 32, 0, 0,
+  14, 32, 3, 0, 70, 0, 0, 0, 0, 0,
+  77, 0, 13, 38, 0, 0, 0, 0, 0, 17,
+  0, 19, 0, 15, 48, 19, 0, 17, 5, 25,
+  0, 35, 17, 0, 54, 0, 0, 16, 0, 0,
+  0, 0, 16, 0, 16, 19, 0, 1, 65, 17,
+  3, 0, 34, 29, 0, 94, 0, 16, 0, 0,
+  90, 39, 0, 18, 0, 41, 51, 18, 99, 0,
+  0, 0, 0, 0, 61, 0, 18, 99, 42, 59,
+  0, 0, 0, 10, 57, 44, 87, 0, 0, 0,
+  0, 36, 0, 0, 0, 0, 5, 0, 3, 0,
+  48, 0, 39, 0, 0, 46, 0, 37, 0, 44,
+  22, 0, 8, 20, 82, 0, 25, 11, 12, 56,
+  55, 36, 59, 22, 0, 12, 31, 0, 0, 0,
+  1, 27, 0, 18, 0, 0, 0, 0, 0, 37,
+  0, 0, 0, 0, 0, 14, 0, 0, 0, 28,
+  0, 0, 38, 1, 0, 0, 0, 23, 0, 87,
+  0, 0, 4, 32, 0, 38, 0, 0, 0, 0,
+  0, 27, 62, 7, 79, 0, 0, 0, 0, 8,
+  73, 0, 0, 19, 6, 1, 28, 74, 0, 0,
+  22, 50, 31, 43, 10, 0, 10, 37, 0, 20,
+  0, 33, 31, 10, 59, 36, 0, 0, 0, 0,
+  17, 0, 0, 13, 9, 1, 0, 0, 0, 0,
+  9, 0, 0, 0, 0, 0, 0, 23, 74, 0,
+  31, 0, 36, 0, 0, 74, 18, 48, 36, 0,
+  9, 0, 60, 0, 36, 0, 0, 63, 66, 33,
+  53, 1, 1, 40, 5, 0, 0, 0, 0, 29,
+  0, 0, 0, 0, 0, 0, 0, 33, 0, 0,
+  0, 0, 0, 13, 0, 0, 0, 7, 0, 0,
+  40, 19, 0, 0, 0, 0, 0, 107, 0, 0,
+  12, 52, 0, 31, 0, 27, 0, 0, 0, 19,
+  66, 8, 85, 0, 0, 0, 0, 0, 65, 0,
+  0, 12, 15, 13, 23, 55, 0, 0, 38, 70,
+  22, 57, 6, 0, 10, 41, 0, 20, 0, 27,
+  34, 9, 25, 65, 0, 0, 0, 0, 11, 0,
+  0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 46, 0, 22, 0,
+  42, 0, 0, 120, 19, 74, 27, 0, 31, 0,
+  61, 0, 8, 0, 21, 27, 26, 43, 32, 22,
+  11, 48, 0, 0, 11, 13, 20, 2, 39, 1,
+  0, 0, 0, 0, 45, 5, 15, 2, 0, 0,
+  0, 0, 0, 0, 0, 21, 0, 27, 87, 36,
+  0, 0, 16, 0, 0, 39, 0, 0, 30, 0,
+  0, 50, 0, 22, 0, 0, 0, 0, 32, 15,
+  38, 0, 0, 0, 27, 0, 82, 16, 0, 44,
+  0, 0, 23, 10, 32, 10, 15, 51, 24, 38,
+  8, 39, 22, 24, 0, 47, 0, 0, 15, 0,
+  42, 41, 18, 5, 0, 0, 5, 0, 39, 13,
+  35, 22, 0, 0, 0, 45, 0, 0, 0, 0,
+  9, 0, 0, 0, 49, 0, 6, 0, 21, 9,
+  0, 56, 17, 88, 0, 0, 31, 9, 81, 2,
+  5, 0, 0, 6, 2, 91, 38, 27, 0, 41,
+  0, 0, 0, 0, 13, 0, 37, 42, 0, 0,
+  0, 2, 9, 19, 0, 0, 16, 37, 0, 0,
+  16, 0, 0, 26, 0, 16, 70, 3, 0, 0,
+  0, 0, 0, 52, 0, 0, 15, 62, 0, 58,
+  0, 17, 0, 7, 22, 0, 63, 23, 93, 25,
+  0, 0, 31, 35, 54, 3, 0, 8, 19, 0,
+  32, 63, 17, 6, 25, 64, 9, 35, 25, 0,
+  32, 85, 0, 27, 5, 0, 11, 0, 41, 54,
+  31, 0, 0, 0, 12, 3, 0, 31, 0, 0,
+  0, 17, 0, 0, 32, 0, 0, 0, 0, 0,
+  0, 0, 65, 0, 25, 16, 30, 0, 0, 28,
+  8, 32, 27, 0, 2, 0, 68, 0, 19, 0,
+  0, 42, 7, 49, 43, 15, 20, 47, 0, 0,
+  0, 0, 0, 0, 3, 32, 0, 0, 0, 6,
+  4, 23, 0, 12, 7, 21, 0, 0, 2, 0,
+  0, 18, 0, 11, 54, 50, 0, 0, 0, 0,
+  0, 40, 0, 0, 45, 53, 0, 11, 0, 42,
+  0, 0, 22, 4, 38, 14, 110, 11, 16, 0,
+  30, 15, 57, 0, 0, 0, 2, 0, 0, 18,
+  21, 0, 59, 45, 0, 63, 2, 0, 3, 85,
+  0, 10, 16, 0, 9, 0, 31, 80, 7, 29,
+  0, 0, 22, 22, 0, 19, 0, 0, 0, 25,
+  0, 0, 16, 0, 0, 0, 0, 0, 0, 0,
+  11, 0, 0, 5, 46, 8, 7, 49, 61, 23,
+  56, 0, 23, 0, 71, 0, 0, 0, 14, 98,
+  16, 58, 20, 15, 28, 30, 7, 0, 10, 8,
+  0, 0, 0, 49, 0, 0, 0, 0, 0, 27,
+  0, 0, 0, 0, 0, 0, 17, 10, 0, 57,
+  0, 0, 54, 50, 0, 0, 31, 38, 0, 36,
+  0, 0, 23, 53, 0, 29, 0, 9, 0, 0,
+  24, 18, 14, 0, 53, 0, 0, 0, 18, 6,
+  59, 0, 0, 0, 0, 0, 21, 44, 0, 0,
+  68, 38, 3, 47, 64, 0, 0, 40, 0, 20,
+  0, 9, 7, 0, 28, 55, 0, 0, 1, 0,
+  35, 0, 0, 37, 14, 0, 22, 0, 0, 15,
+  86, 0, 0, 0, 20, 0, 12, 0, 13, 0,
+  9, 8, 46, 0, 0, 151, 1, 57, 8, 0,
+  17, 0, 42, 0, 26, 0, 19, 37, 38, 18,
+  29, 7, 6, 53, 10, 0, 0, 24, 1, 37,
+  15, 7, 0, 0, 0, 0, 46, 5, 0, 0,
+  0, 0, 0, 1, 0, 2, 0, 21, 0, 0,
+  21, 42, 0, 0, 40, 0, 12, 89, 0, 0,
+  18, 1, 0, 44, 24, 0, 0, 0, 0, 0,
+  73, 21, 53, 0, 0, 0, 0, 8, 68, 12,
+  0, 35, 0, 18, 49, 62, 21, 11, 30, 33,
+  16, 49, 19, 13, 53, 22, 0, 17, 0, 5,
+  44, 0, 24, 80, 3, 46, 0, 0, 12, 0,
+  22, 12, 52, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 89, 0, 51, 0,
+  16, 1, 6, 145, 0, 66, 0, 25, 0, 0,
+  52, 0, 6, 0, 69, 0, 0, 0, 0, 5,
+  33, 32, 0, 0, 14, 32, 3, 0, 70, 0,
+  0, 0, 0, 0, 77, 0, 13, 38, 0, 0,
+  0, 0, 0, 17, 0, 19, 0, 15, 48, 19,
+  0, 17, 5, 25, 0, 35, 17, 0, 54, 0,
+  0, 16, 0, 0, 0, 0, 16, 0, 16, 19,
+  0, 1, 65, 17, 3, 0, 34, 29, 0, 94,
+  0, 16, 0, 0, 90, 39, 0, 18, 0, 41,
+  51, 18, 99, 0, 0, 0, 0, 0, 61, 0,
+  18, 99, 42, 59, 0, 0, 0, 10, 57, 44,
+  87, 0, 0, 0, 0, 36, 0, 0, 0, 0,
+  5, 0, 3, 0, 48, 0, 39, 0, 0, 46,
+  58, 21, 0, 68, 2, 105, 0, 4, 38, 0,
+  0, 0, 40, 0, 0, 0, 2, 21, 35, 0,
+  0, 90, 13, 0, 0, 0, 31, 0, 9, 0,
+  0, 31, 3, 0, 67, 72, 9, 0, 27, 0,
+  20, 14, 0, 28, 22, 53, 41, 0, 0, 0,
+  0, 61, 0, 0, 135, 38, 37, 0, 7, 0,
+  0, 47, 34, 0, 96, 0, 0, 31, 0, 47,
+  198, 6, 55, 0, 0, 0, 0, 35, 0, 0,
+  0, 0, 77, 27, 31, 0, 1, 1, 38, 0,
+  0, 15, 0, 0, 17, 0, 39, 0, 26, 71,
+  33, 77, 0, 0, 0, 0, 6, 46, 5, 0,
+  19, 40, 0, 88, 0, 0, 0, 0, 55, 0,
+  0, 0, 0, 0, 28, 0, 0, 16, 0, 74,
+  18, 48, 36, 0, 9, 0, 60, 0, 36, 0,
+  0, 63, 66, 33, 53, 1, 1, 40, 5, 0,
+  0, 0, 0, 29, 0, 0, 0, 0, 0, 0,
+  0, 33, 0, 0, 0, 0, 0, 13, 0, 0,
+  0, 7, 0, 0, 40, 19, 0, 0, 0, 0,
+  0, 107, 0, 0, 12, 52, 0, 31, 0, 27,
+  0, 0, 0, 19, 66, 8, 85, 0, 0, 0,
+  0, 0, 65, 0, 0, 12, 15, 13, 23, 55,
+  0, 0, 38, 70, 22, 57, 6, 0, 10, 41,
+  0, 20, 0, 27, 34, 9, 25, 65, 0, 0,
+  0, 0, 11, 0, 0, 0, 15, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  46, 0, 22, 0, 42, 0, 0, 120, 19, 74,
+  27, 0, 31, 0, 61, 0, 8, 0, 21, 27,
+  26, 43, 32, 22, 11, 48, 0, 0, 11, 13,
+  20, 2, 39, 1, 0, 0, 0, 0, 45, 5,
+  15, 2, 0, 0, 0, 0, 0, 0, 0, 21,
+  0, 27, 87, 36, 0, 0, 16, 0, 0, 39,
+  0, 0, 30, 0, 0, 50, 0, 22, 0, 0,
+  0, 0, 32, 15, 38, 0, 0, 0, 27, 0,
+  82, 16, 0, 44, 0, 0, 23, 10, 32, 10,
+  15, 51, 24, 38, 8, 39, 22, 24, 0, 47,
+  0, 0, 15, 0, 42, 41, 18, 5, 0, 0,
+  5, 0, 39, 13, 35, 22, 0, 0, 0, 45,
+  0, 0, 0, 0, 9, 0, 0, 0, 49, 0,
+  6, 0, 21, 9, 64, 56, 7, 47, 47, 23,
+  0, 2, 27, 0, 0, 0, 42, 8, 0, 3,
+  0, 0, 56, 18, 0, 16, 26, 0, 2, 0,
+  57, 0, 1, 54, 0, 27, 23, 0, 74, 44,
+  54, 0, 12, 0, 0, 9, 0, 16, 14, 30,
+  64, 22, 0, 0, 0, 0, 0, 18, 39, 0,
+  31, 0, 0, 0, 0, 41, 29, 0, 11, 5,
+  0, 39, 0, 10, 75, 0, 74, 0, 24, 4,
+  0, 36, 30, 0, 0, 0, 49, 39, 40, 0,
+  0, 51, 36, 6, 0, 6, 0, 16, 0, 0,
+  38, 0, 41, 42, 30, 45, 15, 0, 0, 0,
+  5, 61, 41, 0, 5, 11, 0, 65, 38, 0,
+  0, 0, 29, 0, 0, 0, 0, 0, 0, 0,
+  8, 29, 0, 28, 8, 32, 27, 0, 2, 0,
+  68, 0, 19, 0, 0, 42, 7, 49, 43, 15,
+  20, 47, 0, 0, 0, 0, 0, 0, 3, 32,
+  0, 0, 0, 6, 4, 23, 0, 12, 7, 21,
+  0, 0, 2, 0, 0, 18, 0, 11, 54, 50,
+  0, 0, 0, 0, 0, 40, 0, 0, 45, 53,
+  0, 11, 0, 42, 0, 0, 22, 4, 38, 14,
+  110, 11, 16, 0, 30, 15, 57, 0, 0, 0,
+  2, 0, 0, 18, 21, 0, 59, 45, 0, 63,
+  2, 0, 3, 85, 0, 10, 16, 0, 9, 0,
+  31, 80, 7, 29, 0, 0, 22, 22, 0, 19,
+  0, 0, 0, 25, 0, 0, 16, 0, 0, 0,
+  0, 0, 0, 0, 11, 0, 0, 5, 46, 8,
+  7, 49, 61, 23, 56, 0, 23, 0, 71, 0,
+  0, 0, 14, 98, 16, 58, 20, 15, 28, 30,
+  7, 0, 10, 8, 0, 0, 0, 49, 0, 0,
+  0, 0, 0, 27, 0, 0, 0, 0, 0, 0,
+  17, 10, 0, 57, 0, 0, 54, 50, 0, 0,
+  31, 38, 0, 36, 0, 0, 23, 53, 0, 29,
+  0, 9, 0, 0, 24, 18, 14, 0, 53, 0,
+  0, 0, 18, 6, 59, 0, 0, 0, 0, 0,
+  21, 44, 0, 0, 68, 38, 3, 47, 64, 0,
+  0, 40, 0, 20, 0, 9, 7, 0, 28, 55,
+  0, 0, 1, 0, 35, 0, 0, 37, 14, 0,
+  22, 0, 0, 15, 86, 0, 0, 0, 20, 0,
+  12, 0, 13, 0, 9, 8, 46, 0, 51, 65,
+  87, 26, 42, 0, 0, 0, 24, 1, 1, 1,
+  40, 128, 0, 10, 0, 0, 20, 34, 11, 2,
+  7, 22, 0, 0, 0, 18, 0, 18, 19, 8,
+  0, 36, 8, 0, 36, 0, 0, 0, 19, 59,
+  0, 24, 0, 0, 22, 33, 0, 0, 46, 60,
+  0, 37, 0, 0, 0, 36, 0, 23, 0, 0,
+  20, 0, 14, 43, 0, 0, 6, 10, 0, 33,
+  9, 0, 41, 0, 0, 0, 32, 7, 0, 63,
+  13, 0, 60, 24, 16, 45, 93, 12, 0, 0,
+  0, 1, 0, 0, 27, 0, 35, 36, 0, 2,
+  17, 0, 23, 17, 0, 42, 39, 0, 25, 0,
+  0, 19, 110, 2, 0, 0, 0, 0, 14, 0,
+  0, 0, 0, 15, 6, 19, 6, 145, 0, 66,
+  0, 25, 0, 0, 52, 0, 6, 0, 69, 0,
+  0, 0, 0, 5, 33, 32, 0, 0, 14, 32,
+  3, 0, 70, 0, 0, 0, 0, 0, 77, 0,
+  13, 38, 0, 0, 0, 0, 0, 17, 0, 19,
+  0, 15, 48, 19, 0, 17, 5, 25, 0, 35,
+  17, 0, 54, 0, 0, 16, 0, 0, 0, 0,
+  16, 0, 16, 19, 0, 1, 65, 17, 3, 0,
+  34, 29, 0, 94, 0, 16, 0, 0, 90, 39,
+  0, 18, 0, 41, 51, 18, 99, 0, 0, 0,
+  0, 0, 61, 0, 18, 99, 42, 59, 0, 0,
+  0, 10, 57, 44, 87, 0, 0, 0, 0, 36,
+  0, 0, 0, 0, 5, 0, 3, 0, 48, 0,
+  39, 0, 0, 46, 58, 21, 0, 68, 2, 105,
+  0, 4, 38, 0, 0, 0, 40, 0, 0, 0,
+  2, 21, 35, 0, 0, 90, 13, 0, 0, 0,
+  31, 0, 9, 0, 0, 31, 3, 0, 67, 72,
+  9, 0, 27, 0, 20, 14, 0, 28, 22, 53,
+  41, 0, 0, 0, 0, 61, 0, 0, 135, 38,
+  37, 0, 7, 0, 0, 47, 34, 0, 96, 0,
+  0, 31, 0, 47, 198, 6, 55, 0, 0, 0,
+  0, 35, 0, 0, 0, 0, 77, 27, 31, 0,
+  1, 1, 38, 0, 0, 15, 0, 0, 17, 0,
+  39, 0, 26, 71, 33, 77, 0, 0, 0, 0,
+  6, 46, 5, 0, 19, 40, 0, 88, 0, 0,
+  0, 0, 55, 0, 0, 0, 0, 0, 28, 0,
+  0, 16, 0, 0, 0, 15, 0, 83, 0, 21,
+  90, 39, 0, 48, 26, 0, 0, 60, 13, 28,
+  16, 0, 25, 81, 1, 0, 0, 0, 1, 44,
+  17, 19, 0, 35, 60, 0, 78, 36, 79, 138,
+  7, 0, 76, 0, 2, 0, 0, 129, 0, 4,
+  0, 11, 0, 4, 0, 0, 138, 0, 2, 0,
+  27, 0, 0, 90, 14, 2, 90, 0, 0, 39,
+  0, 61, 111, 0, 118, 35, 0, 31, 35, 22,
+  25, 0, 0, 0, 0, 27, 0, 0, 12, 25,
+  0, 0, 0, 91, 0, 7, 15, 0, 6, 0,
+  0, 89, 131, 18, 0, 0, 39, 0, 0, 48,
+  0, 0, 1, 67, 0, 57, 0, 0, 0, 0,
+  75, 0, 0, 0, 0, 0, 0, 0, 75, 51,
+  0, 120, 19, 74, 27, 0, 31, 0, 61, 0,
+  8, 0, 21, 27, 26, 43, 32, 22, 11, 48,
+  0, 0, 11, 13, 20, 2, 39, 1, 0, 0,
+  0, 0, 45, 5, 15, 2, 0, 0, 0, 0,
+  0, 0, 0, 21, 0, 27, 87, 36, 0, 0,
+  16, 0, 0, 39, 0, 0, 30, 0, 0, 50,
+  0, 22, 0, 0, 0, 0, 32, 15, 38, 0,
+  0, 0, 27, 0, 82, 16, 0, 44, 0, 0,
+  23, 10, 32, 10, 15, 51, 24, 38, 8, 39,
+  22, 24, 0, 47, 0, 0, 15, 0, 42, 41,
+  18, 5, 0, 0, 5, 0, 39, 13, 35, 22,
+  0, 0, 0, 45, 0, 0, 0, 0, 9, 0,
+  0, 0, 49, 0, 6, 0, 21, 9, 64, 56,
+  7, 47, 47, 23, 0, 2, 27, 0, 0, 0,
+  42, 8, 0, 3, 0, 0, 56, 18, 0, 16,
+  26, 0, 2, 0, 57, 0, 1, 54, 0, 27,
+  23, 0, 74, 44, 54, 0, 12, 0, 0, 9,
+  0, 16, 14, 30, 64, 22, 0, 0, 0, 0,
+  0, 18, 39, 0, 31, 0, 0, 0, 0, 41,
+  29, 0, 11, 5, 0, 39, 0, 10, 75, 0,
+  74, 0, 24, 4, 0, 36, 30, 0, 0, 0,
+  49, 39, 40, 0, 0, 51, 36, 6, 0, 6,
+  0, 16, 0, 0, 38, 0, 41, 42, 30, 45,
+  15, 0, 0, 0, 5, 61, 41, 0, 5, 11,
+  0, 65, 38, 0, 0, 0, 29, 0, 0, 0,
+  0, 0, 0, 0, 8, 29, 59, 0, 21, 13,
+  0, 41, 0, 2, 0, 43, 0, 19, 0, 48,
+  0, 0, 0, 0, 56, 0, 3, 89, 5, 0,
+  0, 0, 21, 5, 0, 99, 0, 11, 0, 0,
+  67, 44, 117, 91, 15, 0, 39, 0, 3, 0,
+  0, 12, 0, 18, 5, 1, 0, 35, 0, 23,
+  119, 0, 0, 4, 0, 0, 0, 65, 91, 49,
+  82, 33, 0, 21, 0, 118, 80, 20, 83, 0,
+  0, 0, 0, 0, 100, 0, 0, 0, 15, 22,
+  26, 0, 0, 49, 63, 0, 0, 18, 0, 0,
+  55, 0, 41, 0, 0, 54, 58, 26, 28, 0,
+  0, 0, 0, 29, 0, 0, 19, 18, 0, 23,
+  56, 7, 0, 0, 19, 0, 0, 0, 0, 0,
+  0, 24, 61, 73, 7, 49, 61, 23, 56, 0,
+  23, 0, 71, 0, 0, 0, 14, 98, 16, 58,
+  20, 15, 28, 30, 7, 0, 10, 8, 0, 0,
+  0, 49, 0, 0, 0, 0, 0, 27, 0, 0,
+  0, 0, 0, 0, 17, 10, 0, 57, 0, 0,
+  54, 50, 0, 0, 31, 38, 0, 36, 0, 0,
+  23, 53, 0, 29, 0, 9, 0, 0, 24, 18,
+  14, 0, 53, 0, 0, 0, 18, 6, 59, 0,
+  0, 0, 0, 0, 21, 44, 0, 0, 68, 38,
+  3, 47, 64, 0, 0, 40, 0, 20, 0, 9,
+  7, 0, 28, 55, 0, 0, 1, 0, 35, 0,
+  0, 37, 14, 0, 22, 0, 0, 15, 86, 0,
+  0, 0, 20, 0, 12, 0, 13, 0, 9, 8,
+  46, 0, 51, 65, 87, 26, 42, 0, 0, 0,
+  24, 1, 1, 1, 40, 128, 0, 10, 0, 0,
+  20, 34, 11, 2, 7, 22, 0, 0, 0, 18,
+  0, 18, 19, 8, 0, 36, 8, 0, 36, 0,
+  0, 0, 19, 59, 0, 24, 0, 0, 22, 33,
+  0, 0, 46, 60, 0, 37, 0, 0, 0, 36,
+  0, 23, 0, 0, 20, 0, 14, 43, 0, 0,
+  6, 10, 0, 33, 9, 0, 41, 0, 0, 0,
+  32, 7, 0, 63, 13, 0, 60, 24, 16, 45,
+  93, 12, 0, 0, 0, 1, 0, 0, 27, 0,
+  35, 36, 0, 2, 17, 0, 23, 17, 0, 42,
+  39, 0, 25, 0, 0, 19, 110, 2, 0, 0,
+  0, 0, 14, 0, 0, 0, 0, 15, 6, 19,
+  58, 29, 70, 32, 22, 7, 0, 0, 38, 0,
+  7, 32, 60, 93, 0, 0, 0, 0, 38, 0,
+  64, 26, 0, 33, 0, 0, 30, 14, 0, 67,
+  47, 0, 0, 0, 6, 0, 43, 9, 0, 0,
+  0, 21, 0, 0, 0, 0, 0, 24, 0, 6,
+  13, 86, 0, 24, 27, 0, 0, 48, 0, 0,
+  0, 0, 12, 26, 3, 21, 0, 0, 0, 30,
+  0, 44, 10, 2, 0, 0, 0, 0, 48, 0,
+  0, 39, 61, 0, 1, 12, 0, 35, 123, 0,
+  0, 0, 0, 0, 0, 0, 63, 0, 17, 39,
+  26, 0, 0, 0, 0, 26, 0, 33, 42, 10,
+  39, 0, 4, 0, 83, 0, 0, 0, 0, 28,
+  67, 0, 0, 0, 0, 33, 0, 82, 58, 21,
+  0, 68, 2, 105, 0, 4, 38, 0, 0, 0,
+  40, 0, 0, 0, 2, 21, 35, 0, 0, 90,
+  13, 0, 0, 0, 31, 0, 9, 0, 0, 31,
+  3, 0, 67, 72, 9, 0, 27, 0, 20, 14,
+  0, 28, 22, 53, 41, 0, 0, 0, 0, 61,
+  0, 0, 135, 38, 37, 0, 7, 0, 0, 47,
+  34, 0, 96, 0, 0, 31, 0, 47, 198, 6,
+  55, 0, 0, 0, 0, 35, 0, 0, 0, 0,
+  77, 27, 31, 0, 1, 1, 38, 0, 0, 15,
+  0, 0, 17, 0, 39, 0, 26, 71, 33, 77,
+  0, 0, 0, 0, 6, 46, 5, 0, 19, 40,
+  0, 88, 0, 0, 0, 0, 55, 0, 0, 0,
+  0, 0, 28, 0, 0, 16, 0, 0, 0, 15,
+  0, 83, 0, 21, 90, 39, 0, 48, 26, 0,
+  0, 60, 13, 28, 16, 0, 25, 81, 1, 0,
+  0, 0, 1, 44, 17, 19, 0, 35, 60, 0,
+  78, 36, 79, 138, 7, 0, 76, 0, 2, 0,
+  0, 129, 0, 4, 0, 11, 0, 4, 0, 0,
+  138, 0, 2, 0, 27, 0, 0, 90, 14, 2,
+  90, 0, 0, 39, 0, 61, 111, 0, 118, 35,
+  0, 31, 35, 22, 25, 0, 0, 0, 0, 27,
+  0, 0, 12, 25, 0, 0, 0, 91, 0, 7,
+  15, 0, 6, 0, 0, 89, 131, 18, 0, 0,
+  39, 0, 0, 48, 0, 0, 1, 67, 0, 57,
+  0, 0, 0, 0, 75, 0, 0, 0, 0, 0,
+  0, 0, 75, 51, 0, 0, 95, 9, 0, 0,
+  0, 24, 67, 28, 0, 54, 35, 44, 0, 52,
+  0, 15, 0, 0, 0, 58, 28, 9, 0, 0,
+  21, 48, 6, 84, 0, 37, 76, 0, 22, 0,
+  105, 123, 0, 0, 100, 0, 38, 0, 0, 109,
+  0, 0, 0, 11, 0, 0, 0, 0, 96, 0,
+  19, 0, 47, 0, 0, 83, 53, 15, 66, 0,
+  7, 34, 0, 90, 0, 0, 122, 30, 0, 21,
+  7, 0, 14, 0, 0, 2, 0, 89, 0, 17,
+  21, 0, 35, 0, 0, 36, 0, 3, 0, 0,
+  0, 0, 0, 59, 137, 0, 0, 0, 0, 0,
+  0, 52, 0, 3, 30, 17, 0, 0, 80, 0,
+  22, 0, 52, 0, 0, 0, 0, 0, 0, 14,
+  61, 73, 64, 56, 7, 47, 47, 23, 0, 2,
+  27, 0, 0, 0, 42, 8, 0, 3, 0, 0,
+  56, 18, 0, 16, 26, 0, 2, 0, 57, 0,
+  1, 54, 0, 27, 23, 0, 74, 44, 54, 0,
+  12, 0, 0, 9, 0, 16, 14, 30, 64, 22,
+  0, 0, 0, 0, 0, 18, 39, 0, 31, 0,
+  0, 0, 0, 41, 29, 0, 11, 5, 0, 39,
+  0, 10, 75, 0, 74, 0, 24, 4, 0, 36,
+  30, 0, 0, 0, 49, 39, 40, 0, 0, 51,
+  36, 6, 0, 6, 0, 16, 0, 0, 38, 0,
+  41, 42, 30, 45, 15, 0, 0, 0, 5, 61,
+  41, 0, 5, 11, 0, 65, 38, 0, 0, 0,
+  29, 0, 0, 0, 0, 0, 0, 0, 8, 29,
+  59, 0, 21, 13, 0, 41, 0, 2, 0, 43,
+  0, 19, 0, 48, 0, 0, 0, 0, 56, 0,
+  3, 89, 5, 0, 0, 0, 21, 5, 0, 99,
+  0, 11, 0, 0, 67, 44, 117, 91, 15, 0,
+  39, 0, 3, 0, 0, 12, 0, 18, 5, 1,
+  0, 35, 0, 23, 119, 0, 0, 4, 0, 0,
+  0, 65, 91, 49, 82, 33, 0, 21, 0, 118,
+  80, 20, 83, 0, 0, 0, 0, 0, 100, 0,
+  0, 0, 15, 22, 26, 0, 0, 49, 63, 0,
+  0, 18, 0, 0, 55, 0, 41, 0, 0, 54,
+  58, 26, 28, 0, 0, 0, 0, 29, 0, 0,
+  19, 18, 0, 23, 56, 7, 0, 0, 19, 0,
+  0, 0, 0, 0, 0, 24, 61, 73, 32, 0,
+  66, 36, 9, 0, 0, 0, 5, 21, 0, 26,
+  30, 124, 0, 0, 0, 0, 23, 0, 28, 52,
+  0, 3, 0, 0, 50, 28, 0, 103, 0, 4,
+  0, 0, 39, 0, 82, 66, 0, 0, 35, 0,
+  2, 0, 0, 22, 7, 0, 0, 0, 0, 70,
+  0, 21, 74, 0, 0, 14, 10, 0, 0, 32,
+  91, 24, 64, 1, 0, 2, 0, 95, 0, 13,
+  72, 0, 0, 0, 0, 0, 86, 0, 0, 56,
+  11, 19, 0, 0, 12, 13, 141, 0, 0, 19,
+  0, 0, 4, 0, 38, 0, 0, 38, 31, 0,
+  0, 0, 0, 0, 0, 56, 51, 0, 69, 0,
+  0, 0, 107, 0, 36, 0, 0, 32, 38, 0,
+  0, 0, 0, 37, 0, 81, 51, 65, 87, 26,
+  42, 0, 0, 0, 24, 1, 1, 1, 40, 128,
+  0, 10, 0, 0, 20, 34, 11, 2, 7, 22,
+  0, 0, 0, 18, 0, 18, 19, 8, 0, 36,
+  8, 0, 36, 0, 0, 0, 19, 59, 0, 24,
+  0, 0, 22, 33, 0, 0, 46, 60, 0, 37,
+  0, 0, 0, 36, 0, 23, 0, 0, 20, 0,
+  14, 43, 0, 0, 6, 10, 0, 33, 9, 0,
+  41, 0, 0, 0, 32, 7, 0, 63, 13, 0,
+  60, 24, 16, 45, 93, 12, 0, 0, 0, 1,
+  0, 0, 27, 0, 35, 36, 0, 2, 17, 0,
+  23, 17, 0, 42, 39, 0, 25, 0, 0, 19,
+  110, 2, 0, 0, 0, 0, 14, 0, 0, 0,
+  0, 15, 6, 19, 58, 29, 70, 32, 22, 7,
+  0, 0, 38, 0, 7, 32, 60, 93, 0, 0,
+  0, 0, 38, 0, 64, 26, 0, 33, 0, 0,
+  30, 14, 0, 67, 47, 0, 0, 0, 6, 0,
+  43, 9, 0, 0, 0, 21, 0, 0, 0, 0,
+  0, 24, 0, 6, 13, 86, 0, 24, 27, 0,
+  0, 48, 0, 0, 0, 0, 12, 26, 3, 21,
+  0, 0, 0, 30, 0, 44, 10, 2, 0, 0,
+  0, 0, 48, 0, 0, 39, 61, 0, 1, 12,
+  0, 35, 123, 0, 0, 0, 0, 0, 0, 0,
+  63, 0, 17, 39, 26, 0, 0, 0, 0, 26,
+  0, 33, 42, 10, 39, 0, 4, 0, 83, 0,
+  0, 0, 0, 28, 67, 0, 0, 0, 0, 33,
+  0, 82, 37, 48, 54, 46, 22, 17, 0, 0,
+  75, 0, 31, 10, 55, 60, 0, 21, 0, 0,
+  43, 0, 38, 0, 0, 48, 0, 0, 41, 28,
+  0, 38, 57, 0, 0, 0, 24, 0, 32, 0,
+  0, 0, 0, 80, 0, 0, 0, 0, 14, 21,
+  0, 28, 36, 67, 0, 12, 53, 0, 1, 49,
+  0, 34, 0, 0, 0, 41, 0, 12, 9, 0,
+  0, 0, 0, 43, 25, 31, 0, 22, 14, 0,
+  16, 22, 0, 32, 73, 0, 0, 30, 3, 13,
+  122, 5, 40, 0, 0, 1, 0, 0, 93, 0,
+  14, 55, 0, 0, 0, 0, 0, 54, 0, 32,
+  56, 22, 48, 0, 15, 0, 63, 0, 0, 0,
+  0, 46, 59, 0, 14, 0, 6, 28, 0, 93,
+  0, 0, 0, 15, 0, 83, 0, 21, 90, 39,
+  0, 48, 26, 0, 0, 60, 13, 28, 16, 0,
+  25, 81, 1, 0, 0, 0, 1, 44, 17, 19,
+  0, 35, 60, 0, 78, 36, 79, 138, 7, 0,
+  76, 0, 2, 0, 0, 129, 0, 4, 0, 11,
+  0, 4, 0, 0, 138, 0, 2, 0, 27, 0,
+  0, 90, 14, 2, 90, 0, 0, 39, 0, 61,
+  111, 0, 118, 35, 0, 31, 35, 22, 25, 0,
+  0, 0, 0, 27, 0, 0, 12, 25, 0, 0,
+  0, 91, 0, 7, 15, 0, 6, 0, 0, 89,
+  131, 18, 0, 0, 39, 0, 0, 48, 0, 0,
+  1, 67, 0, 57, 0, 0, 0, 0, 75, 0,
+  0, 0, 0, 0, 0, 0, 75, 51, 0, 0,
+  95, 9, 0, 0, 0, 24, 67, 28, 0, 54,
+  35, 44, 0, 52, 0, 15, 0, 0, 0, 58,
+  28, 9, 0, 0, 21, 48, 6, 84, 0, 37,
+  76, 0, 22, 0, 105, 123, 0, 0, 100, 0,
+  38, 0, 0, 109, 0, 0, 0, 11, 0, 0,
+  0, 0, 96, 0, 19, 0, 47, 0, 0, 83,
+  53, 15, 66, 0, 7, 34, 0, 90, 0, 0,
+  122, 30, 0, 21, 7, 0, 14, 0, 0, 2,
+  0, 89, 0, 17, 21, 0, 35, 0, 0, 36,
+  0, 3, 0, 0, 0, 0, 0, 59, 137, 0,
+  0, 0, 0, 0, 0, 52, 0, 3, 30, 17,
+  0, 0, 80, 0, 22, 0, 52, 0, 0, 0,
+  0, 0, 0, 14, 61, 73, 19, 3, 82, 25,
+  7, 0, 0, 19, 0, 0, 0, 50, 24, 124,
+  0, 0, 0, 0, 0, 0, 16, 66, 70, 4,
+  0, 0, 12, 4, 0, 88, 7, 3, 0, 13,
+  0, 0, 74, 8, 0, 0, 84, 0, 0, 15,
+  17, 36, 17, 22, 4, 0, 9, 49, 0, 0,
+  86, 0, 46, 0, 71, 0, 0, 47, 100, 0,
+  96, 0, 0, 47, 0, 116, 0, 23, 90, 0,
+  0, 33, 0, 0, 23, 0, 0, 55, 0, 76,
+  0, 1, 45, 31, 68, 0, 0, 0, 10, 0,
+  0, 0, 0, 0, 0, 29, 67, 0, 0, 0,
+  0, 4, 0, 42, 0, 0, 54, 0, 0, 0,
+  124, 74, 44, 0, 25, 0, 0, 0, 0, 25,
+  0, 22, 0, 56, 59, 0, 21, 13, 0, 41,
+  0, 2, 0, 43, 0, 19, 0, 48, 0, 0,
+  0, 0, 56, 0, 3, 89, 5, 0, 0, 0,
+  21, 5, 0, 99, 0, 11, 0, 0, 67, 44,
+  117, 91, 15, 0, 39, 0, 3, 0, 0, 12,
+  0, 18, 5, 1, 0, 35, 0, 23, 119, 0,
+  0, 4, 0, 0, 0, 65, 91, 49, 82, 33,
+  0, 21, 0, 118, 80, 20, 83, 0, 0, 0,
+  0, 0, 100, 0, 0, 0, 15, 22, 26, 0,
+  0, 49, 63, 0, 0, 18, 0, 0, 55, 0,
+  41, 0, 0, 54, 58, 26, 28, 0, 0, 0,
+  0, 29, 0, 0, 19, 18, 0, 23, 56, 7,
+  0, 0, 19, 0, 0, 0, 0, 0, 0, 24,
+  61, 73, 32, 0, 66, 36, 9, 0, 0, 0,
+  5, 21, 0, 26, 30, 124, 0, 0, 0, 0,
+  23, 0, 28, 52, 0, 3, 0, 0, 50, 28,
+  0, 103, 0, 4, 0, 0, 39, 0, 82, 66,
+  0, 0, 35, 0, 2, 0, 0, 22, 7, 0,
+  0, 0, 0, 70, 0, 21, 74, 0, 0, 14,
+  10, 0, 0, 32, 91, 24, 64, 1, 0, 2,
+  0, 95, 0, 13, 72, 0, 0, 0, 0, 0,
+  86, 0, 0, 56, 11, 19, 0, 0, 12, 13,
+  141, 0, 0, 19, 0, 0, 4, 0, 38, 0,
+  0, 38, 31, 0, 0, 0, 0, 0, 0, 56,
+  51, 0, 69, 0, 0, 0, 107, 0, 36, 0,
+  0, 32, 38, 0, 0, 0, 0, 37, 0, 81,
+  51, 46, 25, 77, 65, 9, 0, 0, 20, 0,
+  19, 0, 51, 118, 0, 0, 0, 0, 16, 7,
+  12, 11, 0, 26, 0, 0, 55, 19, 0, 69,
+  20, 7, 22, 0, 56, 0, 0, 0, 0, 0,
+  0, 35, 0, 0, 31, 31, 30, 33, 0, 0,
+  23, 35, 0, 14, 38, 0, 27, 20, 0, 10,
+  0, 19, 19, 8, 0, 0, 0, 0, 2, 0,
+  0, 41, 51, 0, 0, 22, 0, 0, 35, 8,
+  0, 53, 41, 20, 0, 0, 35, 12, 95, 14,
+  26, 0, 0, 30, 0, 0, 70, 0, 0, 50,
+  0, 20, 0, 0, 0, 25, 0, 43, 127, 0,
+  82, 0, 12, 0, 31, 0, 14, 0, 0, 8,
+  49, 0, 2, 15, 10, 13, 0, 93, 58, 29,
+  70, 32, 22, 7, 0, 0, 38, 0, 7, 32,
+  60, 93, 0, 0, 0, 0, 38, 0, 64, 26,
+  0, 33, 0, 0, 30, 14, 0, 67, 47, 0,
+  0, 0, 6, 0, 43, 9, 0, 0, 0, 21,
+  0, 0, 0, 0, 0, 24, 0, 6, 13, 86,
+  0, 24, 27, 0, 0, 48, 0, 0, 0, 0,
+  12, 26, 3, 21, 0, 0, 0, 30, 0, 44,
+  10, 2, 0, 0, 0, 0, 48, 0, 0, 39,
+  61, 0, 1, 12, 0, 35, 123, 0, 0, 0,
+  0, 0, 0, 0, 63, 0, 17, 39, 26, 0,
+  0, 0, 0, 26, 0, 33, 42, 10, 39, 0,
+  4, 0, 83, 0, 0, 0, 0, 28, 67, 0,
+  0, 0, 0, 33, 0, 82, 37, 48, 54, 46,
+  22, 17, 0, 0, 75, 0, 31, 10, 55, 60,
+  0, 21, 0, 0, 43, 0, 38, 0, 0, 48,
+  0, 0, 41, 28, 0, 38, 57, 0, 0, 0,
+  24, 0, 32, 0, 0, 0, 0, 80, 0, 0,
+  0, 0, 14, 21, 0, 28, 36, 67, 0, 12,
+  53, 0, 1, 49, 0, 34, 0, 0, 0, 41,
+  0, 12, 9, 0, 0, 0, 0, 43, 25, 31,
+  0, 22, 14, 0, 16, 22, 0, 32, 73, 0,
+  0, 30, 3, 13, 122, 5, 40, 0, 0, 1,
+  0, 0, 93, 0, 14, 55, 0, 0, 0, 0,
+  0, 54, 0, 32, 56, 22, 48, 0, 15, 0,
+  63, 0, 0, 0, 0, 46, 59, 0, 14, 0,
+  6, 28, 0, 93, 18, 58, 66, 69, 39, 34,
+  0, 0, 61, 0, 24, 0, 24, 41, 11, 21,
+  49, 14, 29, 7, 0, 0, 0, 34, 1, 0,
+  22, 29, 0, 26, 0, 5, 31, 0, 36, 0,
+  13, 0, 0, 0, 0, 34, 0, 0, 10, 55,
+  10, 6, 0, 0, 30, 0, 0, 0, 35, 0,
+  20, 14, 0, 4, 0, 6, 0, 0, 0, 0,
+  31, 0, 49, 0, 0, 0, 64, 30, 0, 37,
+  0, 10, 0, 53, 0, 8, 43, 93, 0, 42,
+  5, 3, 30, 39, 93, 5, 0, 0, 11, 0,
+  68, 0, 0, 79, 5, 0, 0, 0, 30, 61,
+  0, 15, 39, 0, 23, 0, 0, 0, 0, 0,
+  12, 0, 0, 0, 11, 0, 7, 0, 19, 17,
+  24, 37, 0, 0, 95, 9, 0, 0, 0, 24,
+  67, 28, 0, 54, 35, 44, 0, 52, 0, 15,
+  0, 0, 0, 58, 28, 9, 0, 0, 21, 48,
+  6, 84, 0, 37, 76, 0, 22, 0, 105, 123,
+  0, 0, 100, 0, 38, 0, 0, 109, 0, 0,
+  0, 11, 0, 0, 0, 0, 96, 0, 19, 0,
+  47, 0, 0, 83, 53, 15, 66, 0, 7, 34,
+  0, 90, 0, 0, 122, 30, 0, 21, 7, 0,
+  14, 0, 0, 2, 0, 89, 0, 17, 21, 0,
+  35, 0, 0, 36, 0, 3, 0, 0, 0, 0,
+  0, 59, 137, 0, 0, 0, 0, 0, 0, 52,
+  0, 3, 30, 17, 0, 0, 80, 0, 22, 0,
+  52, 0, 0, 0, 0, 0, 0, 14, 61, 73,
+  19, 3, 82, 25, 7, 0, 0, 19, 0, 0,
+  0, 50, 24, 124, 0, 0, 0, 0, 0, 0,
+  16, 66, 70, 4, 0, 0, 12, 4, 0, 88,
+  7, 3, 0, 13, 0, 0, 74, 8, 0, 0,
+  84, 0, 0, 15, 17, 36, 17, 22, 4, 0,
+  9, 49, 0, 0, 86, 0, 46, 0, 71, 0,
+  0, 47, 100, 0, 96, 0, 0, 47, 0, 116,
+  0, 23, 90, 0, 0, 33, 0, 0, 23, 0,
+  0, 55, 0, 76, 0, 1, 45, 31, 68, 0,
+  0, 0, 10, 0, 0, 0, 0, 0, 0, 29,
+  67, 0, 0, 0, 0, 4, 0, 42, 0, 0,
+  54, 0, 0, 0, 124, 74, 44, 0, 25, 0,
+  0, 0, 0, 25, 0, 22, 0, 56, 83, 83,
+  12, 72, 44, 15, 0, 0, 20, 0, 22, 0,
+  23, 126, 0, 0, 0, 0, 39, 0, 24, 37,
+  34, 21, 0, 0, 35, 11, 0, 34, 52, 81,
+  0, 0, 0, 0, 0, 26, 0, 0, 0, 1,
+  0, 0, 1, 18, 42, 71, 0, 0, 11, 40,
+  0, 7, 106, 0, 38, 4, 10, 0, 0, 34,
+  61, 26, 20, 0, 27, 21, 0, 98, 0, 49,
+  51, 0, 0, 28, 54, 0, 44, 0, 0, 48,
+  15, 60, 0, 1, 2, 45, 68, 0, 14, 0,
+  0, 25, 0, 0, 81, 0, 11, 15, 12, 121,
+  4, 0, 0, 16, 0, 68, 74, 0, 26, 0,
+  17, 1, 24, 87, 0, 0, 20, 2, 10, 0,
+  0, 0, 0, 22, 0, 87, 32, 0, 66, 36,
+  9, 0, 0, 0, 5, 21, 0, 26, 30, 124,
+  0, 0, 0, 0, 23, 0, 28, 52, 0, 3,
+  0, 0, 50, 28, 0, 103, 0, 4, 0, 0,
+  39, 0, 82, 66, 0, 0, 35, 0, 2, 0,
+  0, 22, 7, 0, 0, 0, 0, 70, 0, 21,
+  74, 0, 0, 14, 10, 0, 0, 32, 91, 24,
+  64, 1, 0, 2, 0, 95, 0, 13, 72, 0,
+  0, 0, 0, 0, 86, 0, 0, 56, 11, 19,
+  0, 0, 12, 13, 141, 0, 0, 19, 0, 0,
+  4, 0, 38, 0, 0, 38, 31, 0, 0, 0,
+  0, 0, 0, 56, 51, 0, 69, 0, 0, 0,
+  107, 0, 36, 0, 0, 32, 38, 0, 0, 0,
+  0, 37, 0, 81, 51, 46, 25, 77, 65, 9,
+  0, 0, 20, 0, 19, 0, 51, 118, 0, 0,
+  0, 0, 16, 7, 12, 11, 0, 26, 0, 0,
+  55, 19, 0, 69, 20, 7, 22, 0, 56, 0,
+  0, 0, 0, 0, 0, 35, 0, 0, 31, 31,
+  30, 33, 0, 0, 23, 35, 0, 14, 38, 0,
+  27, 20, 0, 10, 0, 19, 19, 8, 0, 0,
+  0, 0, 2, 0, 0, 41, 51, 0, 0, 22,
+  0, 0, 35, 8, 0, 53, 41, 20, 0, 0,
+  35, 12, 95, 14, 26, 0, 0, 30, 0, 0,
+  70, 0, 0, 50, 0, 20, 0, 0, 0, 25,
+  0, 43, 127, 0, 82, 0, 12, 0, 31, 0,
+  14, 0, 0, 8, 49, 0, 2, 15, 10, 13,
+  0, 93, 42, 127, 15, 99, 80, 43, 0, 0,
+  43, 0, 32, 0, 35, 29, 0, 0, 11, 0,
+  41, 15, 0, 0, 0, 47, 24, 0, 52, 29,
+  0, 37, 5, 49, 69, 0, 20, 0, 0, 0,
+  0, 0, 0, 17, 0, 6, 19, 56, 44, 46,
+  0, 7, 4, 0, 0, 17, 32, 0, 50, 2,
+  0, 29, 21, 24, 0, 8, 0, 0, 52, 4,
+  27, 0, 0, 21, 45, 4, 6, 45, 10, 2,
+  0, 2, 0, 19, 40, 73, 0, 17, 5, 38,
+  21, 49, 107, 0, 0, 49, 0, 0, 90, 0,
+  23, 57, 7, 99, 1, 0, 25, 33, 41, 62,
+  122, 0, 7, 22, 36, 0, 0, 0, 0, 0,
+  0, 0, 13, 0, 43, 0, 45, 1, 13, 74,
+  37, 48, 54, 46, 22, 17, 0, 0, 75, 0,
+  31, 10, 55, 60, 0, 21, 0, 0, 43, 0,
+  38, 0, 0, 48, 0, 0, 41, 28, 0, 38,
+  57, 0, 0, 0, 24, 0, 32, 0, 0, 0,
+  0, 80, 0, 0, 0, 0, 14, 21, 0, 28,
+  36, 67, 0, 12, 53, 0, 1, 49, 0, 34,
+  0, 0, 0, 41, 0, 12, 9, 0, 0, 0,
+  0, 43, 25, 31, 0, 22, 14, 0, 16, 22,
+  0, 32, 73, 0, 0, 30, 3, 13, 122, 5,
+  40, 0, 0, 1, 0, 0, 93, 0, 14, 55,
+  0, 0, 0, 0, 0, 54, 0, 32, 56, 22,
+  48, 0, 15, 0, 63, 0, 0, 0, 0, 46,
+  59, 0, 14, 0, 6, 28, 0, 93, 18, 58,
+  66, 69, 39, 34, 0, 0, 61, 0, 24, 0,
+  24, 41, 11, 21, 49, 14, 29, 7, 0, 0,
+  0, 34, 1, 0, 22, 29, 0, 26, 0, 5,
+  31, 0, 36, 0, 13, 0, 0, 0, 0, 34,
+  0, 0, 10, 55, 10, 6, 0, 0, 30, 0,
+  0, 0, 35, 0, 20, 14, 0, 4, 0, 6,
+  0, 0, 0, 0, 31, 0, 49, 0, 0, 0,
+  64, 30, 0, 37, 0, 10, 0, 53, 0, 8,
+  43, 93, 0, 42, 5, 3, 30, 39, 93, 5,
+  0, 0, 11, 0, 68, 0, 0, 79, 5, 0,
+  0, 0, 30, 61, 0, 15, 39, 0, 23, 0,
+  0, 0, 0, 0, 12, 0, 0, 0, 11, 0,
+  7, 0, 19, 17, 24, 37, 19, 83, 100, 57,
+  60, 86, 0, 0, 16, 0, 0, 0, 1, 37,
+  9, 22, 45, 0, 3, 24, 0, 9, 0, 26,
+  12, 0, 0, 30, 0, 58, 0, 45, 5, 36,
+  29, 8, 0, 14, 0, 6, 0, 0, 0, 30,
+  1, 47, 31, 38, 0, 0, 15, 0, 0, 0,
+  7, 0, 28, 11, 0, 0, 0, 19, 0, 0,
+  0, 0, 25, 0, 71, 0, 0, 0, 48, 11,
+  37, 0, 0, 0, 0, 14, 0, 10, 19, 113,
+  22, 41, 0, 37, 0, 20, 39, 0, 0, 0,
+  11, 0, 10, 0, 0, 52, 9, 11, 0, 0,
+  76, 50, 5, 16, 33, 0, 25, 22, 0, 4,
+  0, 0, 10, 0, 0, 0, 0, 0, 0, 0,
+  34, 0, 47, 18, 19, 3, 82, 25, 7, 0,
+  0, 19, 0, 0, 0, 50, 24, 124, 0, 0,
+  0, 0, 0, 0, 16, 66, 70, 4, 0, 0,
+  12, 4, 0, 88, 7, 3, 0, 13, 0, 0,
+  74, 8, 0, 0, 84, 0, 0, 15, 17, 36,
+  17, 22, 4, 0, 9, 49, 0, 0, 86, 0,
+  46, 0, 71, 0, 0, 47, 100, 0, 96, 0,
+  0, 47, 0, 116, 0, 23, 90, 0, 0, 33,
+  0, 0, 23, 0, 0, 55, 0, 76, 0, 1,
+  45, 31, 68, 0, 0, 0, 10, 0, 0, 0,
+  0, 0, 0, 29, 67, 0, 0, 0, 0, 4,
+  0, 42, 0, 0, 54, 0, 0, 0, 124, 74,
+  44, 0, 25, 0, 0, 0, 0, 25, 0, 22,
+  0, 56, 83, 83, 12, 72, 44, 15, 0, 0,
+  20, 0, 22, 0, 23, 126, 0, 0, 0, 0,
+  39, 0, 24, 37, 34, 21, 0, 0, 35, 11,
+  0, 34, 52, 81, 0, 0, 0, 0, 0, 26,
+  0, 0, 0, 1, 0, 0, 1, 18, 42, 71,
+  0, 0, 11, 40, 0, 7, 106, 0, 38, 4,
+  10, 0, 0, 34, 61, 26, 20, 0, 27, 21,
+  0, 98, 0, 49, 51, 0, 0, 28, 54, 0,
+  44, 0, 0, 48, 15, 60, 0, 1, 2, 45,
+  68, 0, 14, 0, 0, 25, 0, 0, 81, 0,
+  11, 15, 12, 121, 4, 0, 0, 16, 0, 68,
+  74, 0, 26, 0, 17, 1, 24, 87, 0, 0,
+  20, 2, 10, 0, 0, 0, 0, 22, 0, 87,
+  35, 0, 20, 65, 14, 232, 0, 0, 1, 0,
+  0, 0, 0, 21, 0, 0, 0, 33, 62, 0,
+  0, 113, 15, 0, 0, 0, 0, 6, 0, 17,
+  8, 99, 0, 0, 0, 33, 0, 40, 0, 0,
+  0, 0, 0, 0, 0, 58, 44, 47, 7, 4,
+  0, 38, 0, 0, 142, 0, 48, 0, 21, 0,
+  27, 92, 17, 0, 115, 0, 0, 40, 0, 96,
+  83, 63, 62, 0, 0, 35, 43, 0, 0, 0,
+  0, 0, 46, 65, 0, 0, 0, 31, 0, 0,
+  7, 7, 0, 0, 70, 0, 52, 0, 0, 9,
+  17, 116, 2, 0, 0, 5, 18, 17, 0, 0,
+  0, 39, 0, 0, 0, 45, 36, 0, 13, 16,
+  0, 19, 0, 0, 0, 15, 0, 44, 51, 46,
+  25, 77, 65, 9, 0, 0, 20, 0, 19, 0,
+  51, 118, 0, 0, 0, 0, 16, 7, 12, 11,
+  0, 26, 0, 0, 55, 19, 0, 69, 20, 7,
+  22, 0, 56, 0, 0, 0, 0, 0, 0, 35,
+  0, 0, 31, 31, 30, 33, 0, 0, 23, 35,
+  0, 14, 38, 0, 27, 20, 0, 10, 0, 19,
+  19, 8, 0, 0, 0, 0, 2, 0, 0, 41,
+  51, 0, 0, 22, 0, 0, 35, 8, 0, 53,
+  41, 20, 0, 0, 35, 12, 95, 14, 26, 0,
+  0, 30, 0, 0, 70, 0, 0, 50, 0, 20,
+  0, 0, 0, 25, 0, 43, 127, 0, 82, 0,
+  12, 0, 31, 0, 14, 0, 0, 8, 49, 0,
+  2, 15, 10, 13, 0, 93, 42, 127, 15, 99,
+  80, 43, 0, 0, 43, 0, 32, 0, 35, 29,
+  0, 0, 11, 0, 41, 15, 0, 0, 0, 47,
+  24, 0, 52, 29, 0, 37, 5, 49, 69, 0,
+  20, 0, 0, 0, 0, 0, 0, 17, 0, 6,
+  19, 56, 44, 46, 0, 7, 4, 0, 0, 17,
+  32, 0, 50, 2, 0, 29, 21, 24, 0, 8,
+  0, 0, 52, 4, 27, 0, 0, 21, 45, 4,
+  6, 45, 10, 2, 0, 2, 0, 19, 40, 73,
+  0, 17, 5, 38, 21, 49, 107, 0, 0, 49,
+  0, 0, 90, 0, 23, 57, 7, 99, 1, 0,
+  25, 33, 41, 62, 122, 0, 7, 22, 36, 0,
+  0, 0, 0, 0, 0, 0, 13, 0, 43, 0,
+  45, 1, 13, 74, 17, 8, 86, 68, 23, 217,
+  0, 0, 29, 0, 0, 0, 32, 0, 0, 0,
+  31, 18, 66, 0, 0, 112, 15, 8, 7, 0,
+  0, 35, 0, 72, 0, 82, 0, 0, 0, 30,
+  0, 0, 1, 0, 0, 19, 0, 19, 0, 50,
+  59, 42, 0, 14, 0, 45, 0, 0, 97, 0,
+  62, 0, 33, 0, 0, 70, 0, 0, 53, 0,
+  0, 26, 12, 6, 27, 25, 76, 0, 0, 26,
+  25, 0, 0, 18, 0, 0, 77, 83, 0, 0,
+  0, 18, 0, 4, 54, 0, 0, 0, 24, 0,
+  25, 0, 15, 39, 25, 35, 17, 0, 0, 31,
+  47, 29, 0, 0, 0, 45, 0, 0, 0, 0,
+  38, 0, 3, 0, 0, 1, 0, 22, 25, 0,
+  0, 20, 18, 58, 66, 69, 39, 34, 0, 0,
+  61, 0, 24, 0, 24, 41, 11, 21, 49, 14,
+  29, 7, 0, 0, 0, 34, 1, 0, 22, 29,
+  0, 26, 0, 5, 31, 0, 36, 0, 13, 0,
+  0, 0, 0, 34, 0, 0, 10, 55, 10, 6,
+  0, 0, 30, 0, 0, 0, 35, 0, 20, 14,
+  0, 4, 0, 6, 0, 0, 0, 0, 31, 0,
+  49, 0, 0, 0, 64, 30, 0, 37, 0, 10,
+  0, 53, 0, 8, 43, 93, 0, 42, 5, 3,
+  30, 39, 93, 5, 0, 0, 11, 0, 68, 0,
+  0, 79, 5, 0, 0, 0, 30, 61, 0, 15,
+  39, 0, 23, 0, 0, 0, 0, 0, 12, 0,
+  0, 0, 11, 0, 7, 0, 19, 17, 24, 37,
+  19, 83, 100, 57, 60, 86, 0, 0, 16, 0,
+  0, 0, 1, 37, 9, 22, 45, 0, 3, 24,
+  0, 9, 0, 26, 12, 0, 0, 30, 0, 58,
+  0, 45, 5, 36, 29, 8, 0, 14, 0, 6,
+  0, 0, 0, 30, 1, 47, 31, 38, 0, 0,
+  15, 0, 0, 0, 7, 0, 28, 11, 0, 0,
+  0, 19, 0, 0, 0, 0, 25, 0, 71, 0,
+  0, 0, 48, 11, 37, 0, 0, 0, 0, 14,
+  0, 10, 19, 113, 22, 41, 0, 37, 0, 20,
+  39, 0, 0, 0, 11, 0, 10, 0, 0, 52,
+  9, 11, 0, 0, 76, 50, 5, 16, 33, 0,
+  25, 22, 0, 4, 0, 0, 10, 0, 0, 0,
+  0, 0, 0, 0, 34, 0, 47, 18, 11, 11,
+  105, 33, 25, 144, 0, 0, 0, 0, 0, 0,
+  17, 0, 0, 0, 17, 5, 23, 0, 0, 94,
+  8, 12, 0, 0, 0, 0, 0, 52, 0, 26,
+  0, 34, 0, 30, 0, 0, 0, 25, 0, 0,
+  0, 39, 0, 0, 23, 37, 0, 0, 0, 86,
+  0, 0, 64, 0, 59, 0, 41, 0, 0, 32,
+  0, 17, 51, 3, 0, 0, 41, 0, 4, 7,
+  56, 0, 27, 0, 0, 0, 0, 10, 0, 0,
+  45, 50, 55, 11, 0, 9, 2, 0, 0, 0,
+  20, 0, 18, 0, 0, 0, 20, 19, 0, 0,
+  0, 0, 22, 38, 4, 0, 0, 0, 37, 28,
+  0, 0, 0, 0, 63, 0, 8, 0, 0, 0,
+  0, 12, 39, 5, 0, 0, 83, 83, 12, 72,
+  44, 15, 0, 0, 20, 0, 22, 0, 23, 126,
+  0, 0, 0, 0, 39, 0, 24, 37, 34, 21,
+  0, 0, 35, 11, 0, 34, 52, 81, 0, 0,
+  0, 0, 0, 26, 0, 0, 0, 1, 0, 0,
+  1, 18, 42, 71, 0, 0, 11, 40, 0, 7,
+  106, 0, 38, 4, 10, 0, 0, 34, 61, 26,
+  20, 0, 27, 21, 0, 98, 0, 49, 51, 0,
+  0, 28, 54, 0, 44, 0, 0, 48, 15, 60,
+  0, 1, 2, 45, 68, 0, 14, 0, 0, 25,
+  0, 0, 81, 0, 11, 15, 12, 121, 4, 0,
+  0, 16, 0, 68, 74, 0, 26, 0, 17, 1,
+  24, 87, 0, 0, 20, 2, 10, 0, 0, 0,
+  0, 22, 0, 87, 35, 0, 20, 65, 14, 232,
+  0, 0, 1, 0, 0, 0, 0, 21, 0, 0,
+  0, 33, 62, 0, 0, 113, 15, 0, 0, 0,
+  0, 6, 0, 17, 8, 99, 0, 0, 0, 33,
+  0, 40, 0, 0, 0, 0, 0, 0, 0, 58,
+  44, 47, 7, 4, 0, 38, 0, 0, 142, 0,
+  48, 0, 21, 0, 27, 92, 17, 0, 115, 0,
+  0, 40, 0, 96, 83, 63, 62, 0, 0, 35,
+  43, 0, 0, 0, 0, 0, 46, 65, 0, 0,
+  0, 31, 0, 0, 7, 7, 0, 0, 70, 0,
+  52, 0, 0, 9, 17, 116, 2, 0, 0, 5,
+  18, 17, 0, 0, 0, 39, 0, 0, 0, 45,
+  36, 0, 13, 16, 0, 19, 0, 0, 0, 15,
+  0, 44, 0, 0, 0, 5, 19, 184, 0, 0,
+  0, 0, 0, 0, 30, 14, 0, 24, 4, 50,
+  5, 0, 21, 0, 0, 62, 18, 19, 0, 0,
+  0, 10, 18, 0, 0, 34, 0, 4, 0, 24,
+  0, 24, 0, 55, 0, 16, 0, 17, 43, 43,
+  0, 20, 0, 38, 14, 0, 0, 0, 9, 0,
+  19, 12, 5, 26, 0, 0, 6, 0, 0, 22,
+  22, 0, 30, 56, 37, 1, 2, 80, 0, 0,
+  0, 42, 0, 0, 13, 12, 24, 0, 22, 14,
+  2, 28, 1, 67, 43, 9, 35, 30, 0, 0,
+  7, 25, 0, 0, 0, 0, 0, 0, 0, 6,
+  0, 17, 0, 1, 0, 13, 0, 7, 81, 29,
+  34, 0, 48, 9, 42, 0, 38, 19, 0, 0,
+  42, 127, 15, 99, 80, 43, 0, 0, 43, 0,
+  32, 0, 35, 29, 0, 0, 11, 0, 41, 15,
+  0, 0, 0, 47, 24, 0, 52, 29, 0, 37,
+  5, 49, 69, 0, 20, 0, 0, 0, 0, 0,
+  0, 17, 0, 6, 19, 56, 44, 46, 0, 7,
+  4, 0, 0, 17, 32, 0, 50, 2, 0, 29,
+  21, 24, 0, 8, 0, 0, 52, 4, 27, 0,
+  0, 21, 45, 4, 6, 45, 10, 2, 0, 2,
+  0, 19, 40, 73, 0, 17, 5, 38, 21, 49,
+  107, 0, 0, 49, 0, 0, 90, 0, 23, 57,
+  7, 99, 1, 0, 25, 33, 41, 62, 122, 0,
+  7, 22, 36, 0, 0, 0, 0, 0, 0, 0,
+  13, 0, 43, 0, 45, 1, 13, 74, 17, 8,
+  86, 68, 23, 217, 0, 0, 29, 0, 0, 0,
+  32, 0, 0, 0, 31, 18, 66, 0, 0, 112,
+  15, 8, 7, 0, 0, 35, 0, 72, 0, 82,
+  0, 0, 0, 30, 0, 0, 1, 0, 0, 19,
+  0, 19, 0, 50, 59, 42, 0, 14, 0, 45,
+  0, 0, 97, 0, 62, 0, 33, 0, 0, 70,
+  0, 0, 53, 0, 0, 26, 12, 6, 27, 25,
+  76, 0, 0, 26, 25, 0, 0, 18, 0, 0,
+  77, 83, 0, 0, 0, 18, 0, 4, 54, 0,
+  0, 0, 24, 0, 25, 0, 15, 39, 25, 35,
+  17, 0, 0, 31, 47, 29, 0, 0, 0, 45,
+  0, 0, 0, 0, 38, 0, 3, 0, 0, 1,
+  0, 22, 25, 0, 0, 20, 0, 0, 0, 0,
+  1, 125, 0, 0, 0, 0, 0, 0, 59, 8,
+  0, 44, 12, 40, 18, 0, 40, 6, 0, 49,
+  0, 0, 0, 0, 0, 14, 40, 0, 0, 17,
+  0, 8, 0, 16, 0, 48, 35, 47, 0, 33,
+  1, 0, 7, 27, 0, 35, 0, 77, 28, 0,
+  14, 0, 38, 0, 36, 0, 0, 14, 0, 11,
+  0, 0, 0, 3, 8, 0, 16, 34, 27, 15,
+  0, 70, 0, 0, 0, 26, 7, 0, 14, 12,
+  42, 0, 12, 0, 8, 25, 0, 47, 52, 0,
+  15, 13, 0, 0, 17, 28, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 32, 29, 12, 0, 47,
+  0, 0, 66, 14, 50, 0, 35, 14, 18, 0,
+  67, 1, 0, 0, 19, 83, 100, 57, 60, 86,
+  0, 0, 16, 0, 0, 0, 1, 37, 9, 22,
+  45, 0, 3, 24, 0, 9, 0, 26, 12, 0,
+  0, 30, 0, 58, 0, 45, 5, 36, 29, 8,
+  0, 14, 0, 6, 0, 0, 0, 30, 1, 47,
+  31, 38, 0, 0, 15, 0, 0, 0, 7, 0,
+  28, 11, 0, 0, 0, 19, 0, 0, 0, 0,
+  25, 0, 71, 0, 0, 0, 48, 11, 37, 0,
+  0, 0, 0, 14, 0, 10, 19, 113, 22, 41,
+  0, 37, 0, 20, 39, 0, 0, 0, 11, 0,
+  10, 0, 0, 52, 9, 11, 0, 0, 76, 50,
+  5, 16, 33, 0, 25, 22, 0, 4, 0, 0,
+  10, 0, 0, 0, 0, 0, 0, 0, 34, 0,
+  47, 18, 11, 11, 105, 33, 25, 144, 0, 0,
+  0, 0, 0, 0, 17, 0, 0, 0, 17, 5,
+  23, 0, 0, 94, 8, 12, 0, 0, 0, 0,
+  0, 52, 0, 26, 0, 34, 0, 30, 0, 0,
+  0, 25, 0, 0, 0, 39, 0, 0, 23, 37,
+  0, 0, 0, 86, 0, 0, 64, 0, 59, 0,
+  41, 0, 0, 32, 0, 17, 51, 3, 0, 0,
+  41, 0, 4, 7, 56, 0, 27, 0, 0, 0,
+  0, 10, 0, 0, 45, 50, 55, 11, 0, 9,
+  2, 0, 0, 0, 20, 0, 18, 0, 0, 0,
+  20, 19, 0, 0, 0, 0, 22, 38, 4, 0,
+  0, 0, 37, 28, 0, 0, 0, 0, 63, 0,
+  8, 0, 0, 0, 0, 12, 39, 5, 0, 0,
+  0, 2, 46, 0, 14, 18, 11, 0, 12, 0,
+  0, 11, 59, 26, 0, 39, 3, 30, 27, 0,
+  68, 23, 33, 23, 0, 0, 0, 0, 0, 0,
+  61, 0, 0, 0, 0, 7, 0, 8, 0, 25,
+  64, 32, 0, 78, 13, 0, 0, 10, 0, 12,
+  0, 114, 19, 0, 44, 0, 53, 0, 52, 0,
+  0, 0, 0, 20, 19, 0, 0, 11, 0, 0,
+  0, 19, 15, 39, 5, 36, 0, 0, 0, 0,
+  27, 0, 8, 0, 65, 1, 0, 0, 39, 0,
+  0, 25, 36, 0, 0, 17, 0, 0, 33, 36,
+  0, 0, 0, 0, 22, 0, 0, 0, 0, 13,
+  66, 18, 0, 34, 0, 0, 63, 12, 74, 5,
+  47, 3, 0, 0, 82, 14, 12, 0, 35, 0,
+  20, 65, 14, 232, 0, 0, 1, 0, 0, 0,
+  0, 21, 0, 0, 0, 33, 62, 0, 0, 113,
+  15, 0, 0, 0, 0, 6, 0, 17, 8, 99,
+  0, 0, 0, 33, 0, 40, 0, 0, 0, 0,
+  0, 0, 0, 58, 44, 47, 7, 4, 0, 38,
+  0, 0, 142, 0, 48, 0, 21, 0, 27, 92,
+  17, 0, 115, 0, 0, 40, 0, 96, 83, 63,
+  62, 0, 0, 35, 43, 0, 0, 0, 0, 0,
+  46, 65, 0, 0, 0, 31, 0, 0, 7, 7,
+  0, 0, 70, 0, 52, 0, 0, 9, 17, 116,
+  2, 0, 0, 5, 18, 17, 0, 0, 0, 39,
+  0, 0, 0, 45, 36, 0, 13, 16, 0, 19,
+  0, 0, 0, 15, 0, 44, 0, 0, 0, 5,
+  19, 184, 0, 0, 0, 0, 0, 0, 30, 14,
+  0, 24, 4, 50, 5, 0, 21, 0, 0, 62,
+  18, 19, 0, 0, 0, 10, 18, 0, 0, 34,
+  0, 4, 0, 24, 0, 24, 0, 55, 0, 16,
+  0, 17, 43, 43, 0, 20, 0, 38, 14, 0,
+  0, 0, 9, 0, 19, 12, 5, 26, 0, 0,
+  6, 0, 0, 22, 22, 0, 30, 56, 37, 1,
+  2, 80, 0, 0, 0, 42, 0, 0, 13, 12,
+  24, 0, 22, 14, 2, 28, 1, 67, 43, 9,
+  35, 30, 0, 0, 7, 25, 0, 0, 0, 0,
+  0, 0, 0, 6, 0, 17, 0, 1, 0, 13,
+  0, 7, 81, 29, 34, 0, 48, 9, 42, 0,
+  38, 19, 0, 0, 0, 34, 49, 0, 25, 0,
+  17, 0, 0, 0, 0, 0, 29, 51, 2, 46,
+  15, 40, 0, 20, 33, 0, 79, 40, 0, 20,
+  0, 0, 0, 0, 25, 0, 0, 0, 0, 0,
+  0, 5, 0, 35, 63, 42, 0, 75, 56, 0,
+  0, 0, 0, 4, 0, 42, 63, 0, 1, 0,
+  44, 5, 9, 0, 0, 3, 0, 23, 0, 0,
+  26, 7, 0, 0, 0, 3, 4, 30, 12, 34,
+  0, 8, 0, 0, 40, 0, 0, 0, 68, 13,
+  0, 0, 40, 12, 0, 29, 32, 0, 0, 30,
+  0, 0, 0, 46, 0, 0, 0, 0, 5, 0,
+  0, 0, 0, 29, 58, 4, 0, 15, 30, 0,
+  26, 17, 54, 0, 15, 0, 9, 0, 76, 5,
+  0, 0, 17, 8, 86, 68, 23, 217, 0, 0,
+  29, 0, 0, 0, 32, 0, 0, 0, 31, 18,
+  66, 0, 0, 112, 15, 8, 7, 0, 0, 35,
+  0, 72, 0, 82, 0, 0, 0, 30, 0, 0,
+  1, 0, 0, 19, 0, 19, 0, 50, 59, 42,
+  0, 14, 0, 45, 0, 0, 97, 0, 62, 0,
+  33, 0, 0, 70, 0, 0, 53, 0, 0, 26,
+  12, 6, 27, 25, 76, 0, 0, 26, 25, 0,
+  0, 18, 0, 0, 77, 83, 0, 0, 0, 18,
+  0, 4, 54, 0, 0, 0, 24, 0, 25, 0,
+  15, 39, 25, 35, 17, 0, 0, 31, 47, 29,
+  0, 0, 0, 45, 0, 0, 0, 0, 38, 0,
+  3, 0, 0, 1, 0, 22, 25, 0, 0, 20,
+  0, 0, 0, 0, 1, 125, 0, 0, 0, 0,
+  0, 0, 59, 8, 0, 44, 12, 40, 18, 0,
+  40, 6, 0, 49, 0, 0, 0, 0, 0, 14,
+  40, 0, 0, 17, 0, 8, 0, 16, 0, 48,
+  35, 47, 0, 33, 1, 0, 7, 27, 0, 35,
+  0, 77, 28, 0, 14, 0, 38, 0, 36, 0,
+  0, 14, 0, 11, 0, 0, 0, 3, 8, 0,
+  16, 34, 27, 15, 0, 70, 0, 0, 0, 26,
+  7, 0, 14, 12, 42, 0, 12, 0, 8, 25,
+  0, 47, 52, 0, 15, 13, 0, 0, 17, 28,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 32,
+  29, 12, 0, 47, 0, 0, 66, 14, 50, 0,
+  35, 14, 18, 0, 67, 1, 0, 0, 0, 0,
+  77, 0, 0, 0, 2, 0, 0, 0, 0, 1,
+  29, 58, 0, 41, 0, 69, 29, 7, 59, 19,
+  117, 17, 0, 0, 0, 5, 0, 0, 15, 0,
+  0, 0, 0, 13, 0, 12, 0, 0, 66, 0,
+  0, 79, 32, 0, 0, 0, 0, 6, 0, 87,
+  7, 0, 39, 0, 49, 0, 7, 0, 0, 1,
+  10, 0, 77, 0, 0, 21, 0, 50, 0, 0,
+  2, 19, 0, 7, 0, 0, 0, 0, 19, 0,
+  2, 0, 62, 8, 0, 0, 25, 0, 0, 13,
+  0, 0, 16, 30, 0, 0, 0, 54, 3, 0,
+  0, 0, 20, 0, 0, 0, 0, 0, 62, 11,
+  0, 38, 13, 0, 89, 23, 44, 14, 34, 0,
+  0, 0, 57, 0, 15, 0, 11, 11, 105, 33,
+  25, 144, 0, 0, 0, 0, 0, 0, 17, 0,
+  0, 0, 17, 5, 23, 0, 0, 94, 8, 12,
+  0, 0, 0, 0, 0, 52, 0, 26, 0, 34,
+  0, 30, 0, 0, 0, 25, 0, 0, 0, 39,
+  0, 0, 23, 37, 0, 0, 0, 86, 0, 0,
+  64, 0, 59, 0, 41, 0, 0, 32, 0, 17,
+  51, 3, 0, 0, 41, 0, 4, 7, 56, 0,
+  27, 0, 0, 0, 0, 10, 0, 0, 45, 50,
+  55, 11, 0, 9, 2, 0, 0, 0, 20, 0,
+  18, 0, 0, 0, 20, 19, 0, 0, 0, 0,
+  22, 38, 4, 0, 0, 0, 37, 28, 0, 0,
+  0, 0, 63, 0, 8, 0, 0, 0, 0, 12,
+  39, 5, 0, 0, 0, 2, 46, 0, 14, 18,
+  11, 0, 12, 0, 0, 11, 59, 26, 0, 39,
+  3, 30, 27, 0, 68, 23, 33, 23, 0, 0,
+  0, 0, 0, 0, 61, 0, 0, 0, 0, 7,
+  0, 8, 0, 25, 64, 32, 0, 78, 13, 0,
+  0, 10, 0, 12, 0, 114, 19, 0, 44, 0,
+  53, 0, 52, 0, 0, 0, 0, 20, 19, 0,
+  0, 11, 0, 0, 0, 19, 15, 39, 5, 36,
+  0, 0, 0, 0, 27, 0, 8, 0, 65, 1,
+  0, 0, 39, 0, 0, 25, 36, 0, 0, 17,
+  0, 0, 33, 36, 0, 0, 0, 0, 22, 0,
+  0, 0, 0, 13, 66, 18, 0, 34, 0, 0,
+  63, 12, 74, 5, 47, 3, 0, 0, 82, 14,
+  12, 0, 5, 0, 69, 0, 12, 8, 0, 0,
+  19, 0, 0, 0, 40, 75, 0, 7, 0, 50,
+  40, 0, 68, 50, 83, 1, 0, 0, 0, 31,
+  0, 3, 20, 0, 0, 0, 0, 5, 0, 22,
+  0, 0, 22, 4, 0, 91, 26, 21, 0, 48,
+  0, 0, 1, 153, 0, 0, 66, 0, 33, 0,
+  18, 0, 0, 0, 11, 0, 112, 0, 0, 0,
+  0, 59, 0, 0, 0, 7, 0, 0, 0, 0,
+  0, 0, 9, 0, 15, 0, 36, 8, 0, 0,
+  45, 0, 0, 0, 0, 0, 6, 8, 0, 0,
+  1, 53, 30, 0, 0, 0, 16, 0, 0, 5,
+  5, 0, 72, 5, 0, 42, 10, 0, 150, 0,
+  30, 25, 71, 0, 0, 0, 50, 0, 12, 0,
+  0, 0, 0, 5, 19, 184, 0, 0, 0, 0,
+  0, 0, 30, 14, 0, 24, 4, 50, 5, 0,
+  21, 0, 0, 62, 18, 19, 0, 0, 0, 10,
+  18, 0, 0, 34, 0, 4, 0, 24, 0, 24,
+  0, 55, 0, 16, 0, 17, 43, 43, 0, 20,
+  0, 38, 14, 0, 0, 0, 9, 0, 19, 12,
+  5, 26, 0, 0, 6, 0, 0, 22, 22, 0,
+  30, 56, 37, 1, 2, 80, 0, 0, 0, 42,
+  0, 0, 13, 12, 24, 0, 22, 14, 2, 28,
+  1, 67, 43, 9, 35, 30, 0, 0, 7, 25,
+  0, 0, 0, 0, 0, 0, 0, 6, 0, 17,
+  0, 1, 0, 13, 0, 7, 81, 29, 34, 0,
+  48, 9, 42, 0, 38, 19, 0, 0, 0, 34,
+  49, 0, 25, 0, 17, 0, 0, 0, 0, 0,
+  29, 51, 2, 46, 15, 40, 0, 20, 33, 0,
+  79, 40, 0, 20, 0, 0, 0, 0, 25, 0,
+  0, 0, 0, 0, 0, 5, 0, 35, 63, 42,
+  0, 75, 56, 0, 0, 0, 0, 4, 0, 42,
+  63, 0, 1, 0, 44, 5, 9, 0, 0, 3,
+  0, 23, 0, 0, 26, 7, 0, 0, 0, 3,
+  4, 30, 12, 34, 0, 8, 0, 0, 40, 0,
+  0, 0, 68, 13, 0, 0, 40, 12, 0, 29,
+  32, 0, 0, 30, 0, 0, 0, 46, 0, 0,
+  0, 0, 5, 0, 0, 0, 0, 29, 58, 4,
+  0, 15, 30, 0, 26, 17, 54, 0, 15, 0,
+  9, 0, 76, 5, 0, 0, 10, 0, 77, 0,
+  9, 10, 0, 0, 4, 0, 0, 8, 3, 82,
+  0, 0, 0, 46, 42, 0, 45, 68, 136, 0,
+  0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+  0, 9, 0, 0, 0, 0, 33, 0, 0, 90,
+  40, 14, 0, 21, 0, 0, 0, 136, 0, 0,
+  74, 0, 41, 0, 36, 0, 0, 0, 35, 0,
+  125, 0, 0, 23, 0, 91, 0, 0, 13, 4,
+  0, 0, 7, 0, 0, 0, 15, 0, 23, 0,
+  45, 6, 0, 0, 20, 0, 0, 0, 0, 0,
+  24, 27, 0, 0, 0, 52, 15, 0, 0, 0,
+  14, 0, 0, 2, 0, 0, 69, 4, 0, 37,
+  12, 0, 118, 0, 23, 19, 24, 0, 0, 0,
+  53, 0, 0, 0, 0, 0, 0, 0, 1, 125,
+  0, 0, 0, 0, 0, 0, 59, 8, 0, 44,
+  12, 40, 18, 0, 40, 6, 0, 49, 0, 0,
+  0, 0, 0, 14, 40, 0, 0, 17, 0, 8,
+  0, 16, 0, 48, 35, 47, 0, 33, 1, 0,
+  7, 27, 0, 35, 0, 77, 28, 0, 14, 0,
+  38, 0, 36, 0, 0, 14, 0, 11, 0, 0,
+  0, 3, 8, 0, 16, 34, 27, 15, 0, 70,
+  0, 0, 0, 26, 7, 0, 14, 12, 42, 0,
+  12, 0, 8, 25, 0, 47, 52, 0, 15, 13,
+  0, 0, 17, 28, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 32, 29, 12, 0, 47, 0, 0,
+  66, 14, 50, 0, 35, 14, 18, 0, 67, 1,
+  0, 0, 0, 0, 77, 0, 0, 0, 2, 0,
+  0, 0, 0, 1, 29, 58, 0, 41, 0, 69,
+  29, 7, 59, 19, 117, 17, 0, 0, 0, 5,
+  0, 0, 15, 0, 0, 0, 0, 13, 0, 12,
+  0, 0, 66, 0, 0, 79, 32, 0, 0, 0,
+  0, 6, 0, 87, 7, 0, 39, 0, 49, 0,
+  7, 0, 0, 1, 10, 0, 77, 0, 0, 21,
+  0, 50, 0, 0, 2, 19, 0, 7, 0, 0,
+  0, 0, 19, 0, 2, 0, 62, 8, 0, 0,
+  25, 0, 0, 13, 0, 0, 16, 30, 0, 0,
+  0, 54, 3, 0, 0, 0, 20, 0, 0, 0,
+  0, 0, 62, 11, 0, 38, 13, 0, 89, 23,
+  44, 14, 34, 0, 0, 0, 57, 0, 15, 0,
+  25, 0, 64, 0, 17, 12, 0, 0, 23, 0,
+  0, 6, 16, 72, 0, 0, 0, 19, 42, 0,
+  48, 60, 61, 0, 0, 0, 0, 26, 0, 41,
+  0, 0, 0, 0, 0, 3, 0, 6, 0, 0,
+  0, 0, 0, 69, 18, 17, 0, 65, 0, 0,
+  0, 167, 0, 0, 66, 0, 29, 0, 4, 0,
+  0, 0, 24, 0, 113, 0, 0, 10, 0, 64,
+  0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
+  12, 0, 12, 0, 32, 1, 0, 15, 43, 0,
+  26, 0, 0, 0, 27, 0, 11, 0, 0, 71,
+  39, 0, 0, 0, 13, 0, 0, 24, 30, 0,
+  73, 0, 0, 44, 14, 0, 155, 0, 5, 26,
+  74, 0, 0, 0, 54, 0, 0, 0, 0, 2,
+  46, 0, 14, 18, 11, 0, 12, 0, 0, 11,
+  59, 26, 0, 39, 3, 30, 27, 0, 68, 23,
+  33, 23, 0, 0, 0, 0, 0, 0, 61, 0,
+  0, 0, 0, 7, 0, 8, 0, 25, 64, 32,
+  0, 78, 13, 0, 0, 10, 0, 12, 0, 114,
+  19, 0, 44, 0, 53, 0, 52, 0, 0, 0,
+  0, 20, 19, 0, 0, 11, 0, 0, 0, 19,
+  15, 39, 5, 36, 0, 0, 0, 0, 27, 0,
+  8, 0, 65, 1, 0, 0, 39, 0, 0, 25,
+  36, 0, 0, 17, 0, 0, 33, 36, 0, 0,
+  0, 0, 22, 0, 0, 0, 0, 13, 66, 18,
+  0, 34, 0, 0, 63, 12, 74, 5, 47, 3,
+  0, 0, 82, 14, 12, 0, 5, 0, 69, 0,
+  12, 8, 0, 0, 19, 0, 0, 0, 40, 75,
+  0, 7, 0, 50, 40, 0, 68, 50, 83, 1,
+  0, 0, 0, 31, 0, 3, 20, 0, 0, 0,
+  0, 5, 0, 22, 0, 0, 22, 4, 0, 91,
+  26, 21, 0, 48, 0, 0, 1, 153, 0, 0,
+  66, 0, 33, 0, 18, 0, 0, 0, 11, 0,
+  112, 0, 0, 0, 0, 59, 0, 0, 0, 7,
+  0, 0, 0, 0, 0, 0, 9, 0, 15, 0,
+  36, 8, 0, 0, 45, 0, 0, 0, 0, 0,
+  6, 8, 0, 0, 1, 53, 30, 0, 0, 0,
+  16, 0, 0, 5, 5, 0, 72, 5, 0, 42,
+  10, 0, 150, 0, 30, 25, 71, 0, 0, 0,
+  50, 0, 12, 0, 0, 0, 9, 0, 23, 7,
+  0, 0, 42, 0, 0, 0, 8, 47, 0, 0,
+  0, 0, 32, 0, 34, 11, 0, 18, 0, 0,
+  19, 48, 0, 74, 0, 0, 9, 0, 0, 0,
+  0, 14, 0, 0, 0, 0, 0, 37, 0, 40,
+  0, 86, 0, 0, 8, 140, 13, 21, 34, 0,
+  22, 0, 0, 0, 0, 0, 0, 0, 51, 0,
+  0, 0, 0, 14, 0, 9, 0, 0, 0, 24,
+  0, 0, 0, 11, 28, 0, 0, 0, 0, 0,
+  0, 47, 50, 10, 57, 0, 0, 0, 10, 0,
+  28, 0, 0, 84, 46, 0, 26, 0, 7, 0,
+  21, 14, 59, 0, 50, 0, 0, 36, 7, 0,
+  152, 0, 0, 31, 100, 6, 74, 0, 41, 0,
+  0, 0, 0, 34, 49, 0, 25, 0, 17, 0,
+  0, 0, 0, 0, 29, 51, 2, 46, 15, 40,
+  0, 20, 33, 0, 79, 40, 0, 20, 0, 0,
+  0, 0, 25, 0, 0, 0, 0, 0, 0, 5,
+  0, 35, 63, 42, 0, 75, 56, 0, 0, 0,
+  0, 4, 0, 42, 63, 0, 1, 0, 44, 5,
+  9, 0, 0, 3, 0, 23, 0, 0, 26, 7,
+  0, 0, 0, 3, 4, 30, 12, 34, 0, 8,
+  0, 0, 40, 0, 0, 0, 68, 13, 0, 0,
+  40, 12, 0, 29, 32, 0, 0, 30, 0, 0,
+  0, 46, 0, 0, 0, 0, 5, 0, 0, 0,
+  0, 29, 58, 4, 0, 15, 30, 0, 26, 17,
+  54, 0, 15, 0, 9, 0, 76, 5, 0, 0,
+  10, 0, 77, 0, 9, 10, 0, 0, 4, 0,
+  0, 8, 3, 82, 0, 0, 0, 46, 42, 0,
+  45, 68, 136, 0, 0, 0, 0, 0, 0, 0,
+  3, 0, 0, 0, 0, 9, 0, 0, 0, 0,
+  33, 0, 0, 90, 40, 14, 0, 21, 0, 0,
+  0, 136, 0, 0, 74, 0, 41, 0, 36, 0,
+  0, 0, 35, 0, 125, 0, 0, 23, 0, 91,
+  0, 0, 13, 4, 0, 0, 7, 0, 0, 0,
+  15, 0, 23, 0, 45, 6, 0, 0, 20, 0,
+  0, 0, 0, 0, 24, 27, 0, 0, 0, 52,
+  15, 0, 0, 0, 14, 0, 0, 2, 0, 0,
+  69, 4, 0, 37, 12, 0, 118, 0, 23, 19,
+  24, 0, 0, 0, 53, 0, 0, 0, 0, 0,
+  45, 1, 17, 0, 0, 0, 31, 0, 0, 0,
+  20, 82, 0, 0, 0, 11, 29, 0, 23, 30,
+  25, 5, 0, 0, 20, 43, 0, 53, 0, 0,
+  0, 0, 0, 0, 0, 4, 0, 0, 0, 0,
+  0, 45, 6, 26, 0, 49, 0, 0, 0, 152,
+  0, 16, 45, 0, 12, 0, 0, 0, 0, 0,
+  8, 0, 63, 0, 0, 6, 0, 72, 0, 0,
+  8, 0, 0, 0, 0, 0, 0, 0, 13, 0,
+  1, 0, 0, 0, 0, 44, 53, 0, 44, 0,
+  0, 0, 18, 0, 36, 0, 0, 72, 23, 0,
+  15, 0, 42, 0, 1, 20, 65, 0, 81, 0,
+  0, 14, 40, 0, 141, 0, 0, 33, 89, 0,
+  30, 0, 58, 0, 0, 0, 0, 0, 77, 0,
+  0, 0, 2, 0, 0, 0, 0, 1, 29, 58,
+  0, 41, 0, 69, 29, 7, 59, 19, 117, 17,
+  0, 0, 0, 5, 0, 0, 15, 0, 0, 0,
+  0, 13, 0, 12, 0, 0, 66, 0, 0, 79,
+  32, 0, 0, 0, 0, 6, 0, 87, 7, 0,
+  39, 0, 49, 0, 7, 0, 0, 1, 10, 0,
+  77, 0, 0, 21, 0, 50, 0, 0, 2, 19,
+  0, 7, 0, 0, 0, 0, 19, 0, 2, 0,
+  62, 8, 0, 0, 25, 0, 0, 13, 0, 0,
+  16, 30, 0, 0, 0, 54, 3, 0, 0, 0,
+  20, 0, 0, 0, 0, 0, 62, 11, 0, 38,
+  13, 0, 89, 23, 44, 14, 34, 0, 0, 0,
+  57, 0, 15, 0, 25, 0, 64, 0, 17, 12,
+  0, 0, 23, 0, 0, 6, 16, 72, 0, 0,
+  0, 19, 42, 0, 48, 60, 61, 0, 0, 0,
+  0, 26, 0, 41, 0, 0, 0, 0, 0, 3,
+  0, 6, 0, 0, 0, 0, 0, 69, 18, 17,
+  0, 65, 0, 0, 0, 167, 0, 0, 66, 0,
+  29, 0, 4, 0, 0, 0, 24, 0, 113, 0,
+  0, 10, 0, 64, 0, 4, 0, 0, 0, 0,
+  0, 0, 0, 0, 12, 0, 12, 0, 32, 1,
+  0, 15, 43, 0, 26, 0, 0, 0, 27, 0,
+  11, 0, 0, 71, 39, 0, 0, 0, 13, 0,
+  0, 24, 30, 0, 73, 0, 0, 44, 14, 0,
+  155, 0, 5, 26, 74, 0, 0, 0, 54, 0,
+  0, 0, 0, 0, 0, 0, 12, 0, 0, 14,
+  34, 15, 0, 0, 26, 34, 0, 0, 0, 21,
+  29, 0, 8, 0, 0, 45, 0, 0, 48, 64,
+  6, 83, 0, 0, 55, 0, 0, 0, 0, 1,
+  0, 5, 0, 0, 0, 16, 10, 46, 0, 58,
+  0, 8, 7, 104, 37, 30, 33, 0, 15, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 6, 0,
+  0, 19, 0, 0, 21, 0, 0, 63, 0, 0,
+  0, 9, 39, 0, 0, 13, 0, 0, 0, 59,
+  43, 21, 114, 3, 0, 0, 28, 0, 36, 0,
+  0, 91, 40, 0, 32, 0, 7, 0, 28, 8,
+  75, 20, 37, 0, 0, 8, 5, 0, 131, 0,
+  0, 37, 103, 0, 101, 0, 70, 0, 0, 0,
+  5, 0, 69, 0, 12, 8, 0, 0, 19, 0,
+  0, 0, 40, 75, 0, 7, 0, 50, 40, 0,
+  68, 50, 83, 1, 0, 0, 0, 31, 0, 3,
+  20, 0, 0, 0, 0, 5, 0, 22, 0, 0,
+  22, 4, 0, 91, 26, 21, 0, 48, 0, 0,
+  1, 153, 0, 0, 66, 0, 33, 0, 18, 0,
+  0, 0, 11, 0, 112, 0, 0, 0, 0, 59,
+  0, 0, 0, 7, 0, 0, 0, 0, 0, 0,
+  9, 0, 15, 0, 36, 8, 0, 0, 45, 0,
+  0, 0, 0, 0, 6, 8, 0, 0, 1, 53,
+  30, 0, 0, 0, 16, 0, 0, 5, 5, 0,
+  72, 5, 0, 42, 10, 0, 150, 0, 30, 25,
+  71, 0, 0, 0, 50, 0, 12, 0, 0, 0,
+  9, 0, 23, 7, 0, 0, 42, 0, 0, 0,
+  8, 47, 0, 0, 0, 0, 32, 0, 34, 11,
+  0, 18, 0, 0, 19, 48, 0, 74, 0, 0,
+  9, 0, 0, 0, 0, 14, 0, 0, 0, 0,
+  0, 37, 0, 40, 0, 86, 0, 0, 8, 140,
+  13, 21, 34, 0, 22, 0, 0, 0, 0, 0,
+  0, 0, 51, 0, 0, 0, 0, 14, 0, 9,
+  0, 0, 0, 24, 0, 0, 0, 11, 28, 0,
+  0, 0, 0, 0, 0, 47, 50, 10, 57, 0,
+  0, 0, 10, 0, 28, 0, 0, 84, 46, 0,
+  26, 0, 7, 0, 21, 14, 59, 0, 50, 0,
+  0, 36, 7, 0, 152, 0, 0, 31, 100, 6,
+  74, 0, 41, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 24, 26, 15, 20, 0, 5, 0, 0,
+  4, 23, 15, 29, 19, 5, 0, 0, 0, 56,
+  21, 39, 37, 55, 0, 52, 0, 0, 82, 0,
+  11, 0, 0, 14, 0, 19, 0, 6, 0, 1,
+  10, 45, 30, 46, 0, 40, 24, 27, 55, 43,
+  0, 0, 9, 0, 0, 42, 0, 0, 0, 0,
+  0, 0, 32, 0, 0, 0, 0, 2, 11, 0,
+  20, 67, 0, 0, 0, 27, 69, 0, 0, 21,
+  0, 0, 2, 43, 16, 39, 82, 7, 0, 0,
+  15, 0, 21, 0, 0, 53, 8, 0, 42, 0,
+  0, 0, 48, 0, 67, 45, 15, 0, 2, 4,
+  0, 0, 73, 0, 0, 11, 69, 15, 131, 0,
+  65, 0, 0, 0, 10, 0, 77, 0, 9, 10,
+  0, 0, 4, 0, 0, 8, 3, 82, 0, 0,
+  0, 46, 42, 0, 45, 68, 136, 0, 0, 0,
+  0, 0, 0, 0, 3, 0, 0, 0, 0, 9,
+  0, 0, 0, 0, 33, 0, 0, 90, 40, 14,
+  0, 21, 0, 0, 0, 136, 0, 0, 74, 0,
+  41, 0, 36, 0, 0, 0, 35, 0, 125, 0,
+  0, 23, 0, 91, 0, 0, 13, 4, 0, 0,
+  7, 0, 0, 0, 15, 0, 23, 0, 45, 6,
+  0, 0, 20, 0, 0, 0, 0, 0, 24, 27,
+  0, 0, 0, 52, 15, 0, 0, 0, 14, 0,
+  0, 2, 0, 0, 69, 4, 0, 37, 12, 0,
+  118, 0, 23, 19, 24, 0, 0, 0, 53, 0,
+  0, 0, 0, 0, 45, 1, 17, 0, 0, 0,
+  31, 0, 0, 0, 20, 82, 0, 0, 0, 11,
+  29, 0, 23, 30, 25, 5, 0, 0, 20, 43,
+  0, 53, 0, 0, 0, 0, 0, 0, 0, 4,
+  0, 0, 0, 0, 0, 45, 6, 26, 0, 49,
+  0, 0, 0, 152, 0, 16, 45, 0, 12, 0,
+  0, 0, 0, 0, 8, 0, 63, 0, 0, 6,
+  0, 72, 0, 0, 8, 0, 0, 0, 0, 0,
+  0, 0, 13, 0, 1, 0, 0, 0, 0, 44,
+  53, 0, 44, 0, 0, 0, 18, 0, 36, 0,
+  0, 72, 23, 0, 15, 0, 42, 0, 1, 20,
+  65, 0, 81, 0, 0, 14, 40, 0, 141, 0,
+  0, 33, 89, 0, 30, 0, 58, 0, 0, 0,
+  0, 0, 24, 23, 0, 0, 18, 24, 50, 29,
+  0, 0, 0, 30, 0, 5, 4, 7, 13, 0,
+  0, 0, 0, 53, 0, 0, 74, 59, 173, 47,
+  0, 0, 71, 0, 19, 0, 0, 20, 0, 24,
+  0, 0, 0, 0, 18, 88, 16, 0, 0, 16,
+  0, 67, 30, 34, 32, 0, 0, 4, 0, 6,
+  0, 39, 0, 0, 0, 0, 33, 0, 0, 14,
+  6, 12, 56, 3, 0, 51, 0, 0, 0, 3,
+  39, 0, 0, 33, 0, 0, 0, 48, 80, 41,
+  84, 0, 0, 0, 23, 0, 51, 0, 2, 59,
+  14, 2, 58, 0, 66, 2, 56, 3, 77, 5,
+  38, 0, 11, 0, 0, 0, 103, 0, 0, 17,
+  53, 0, 50, 0, 60, 0, 7, 11, 25, 0,
+  64, 0, 17, 12, 0, 0, 23, 0, 0, 6,
+  16, 72, 0, 0, 0, 19, 42, 0, 48, 60,
+  61, 0, 0, 0, 0, 26, 0, 41, 0, 0,
+  0, 0, 0, 3, 0, 6, 0, 0, 0, 0,
+  0, 69, 18, 17, 0, 65, 0, 0, 0, 167,
+  0, 0, 66, 0, 29, 0, 4, 0, 0, 0,
+  24, 0, 113, 0, 0, 10, 0, 64, 0, 4,
+  0, 0, 0, 0, 0, 0, 0, 0, 12, 0,
+  12, 0, 32, 1, 0, 15, 43, 0, 26, 0,
+  0, 0, 27, 0, 11, 0, 0, 71, 39, 0,
+  0, 0, 13, 0, 0, 24, 30, 0, 73, 0,
+  0, 44, 14, 0, 155, 0, 5, 26, 74, 0,
+  0, 0, 54, 0, 0, 0, 0, 0, 0, 0,
+  12, 0, 0, 14, 34, 15, 0, 0, 26, 34,
+  0, 0, 0, 21, 29, 0, 8, 0, 0, 45,
+  0, 0, 48, 64, 6, 83, 0, 0, 55, 0,
+  0, 0, 0, 1, 0, 5, 0, 0, 0, 16,
+  10, 46, 0, 58, 0, 8, 7, 104, 37, 30,
+  33, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 6, 0, 0, 19, 0, 0, 21, 0,
+  0, 63, 0, 0, 0, 9, 39, 0, 0, 13,
+  0, 0, 0, 59, 43, 21, 114, 3, 0, 0,
+  28, 0, 36, 0, 0, 91, 40, 0, 32, 0,
+  7, 0, 28, 8, 75, 20, 37, 0, 0, 8,
+  5, 0, 131, 0, 0, 37, 103, 0, 101, 0,
+  70, 0, 0, 0, 0, 6, 23, 5, 0, 0,
+  44, 22, 34, 36, 0, 0, 1, 0, 0, 41,
+  20, 23, 3, 8, 0, 0, 0, 69, 18, 19,
+  51, 49, 164, 7, 0, 0, 85, 0, 15, 0,
+  0, 31, 6, 63, 0, 3, 29, 0, 23, 56,
+  20, 0, 0, 47, 0, 43, 48, 47, 7, 0,
+  0, 20, 0, 28, 0, 23, 0, 0, 0, 3,
+  58, 0, 2, 0, 18, 22, 54, 25, 23, 58,
+  0, 0, 0, 13, 76, 0, 7, 17, 0, 0,
+  4, 37, 62, 48, 83, 0, 0, 0, 8, 13,
+  24, 0, 0, 55, 0, 0, 26, 0, 38, 0,
+  56, 0, 44, 17, 29, 0, 10, 0, 0, 0,
+  37, 0, 0, 16, 21, 0, 77, 0, 71, 0,
+  5, 0, 0, 0, 9, 0, 23, 7, 0, 0,
+  42, 0, 0, 0, 8, 47, 0, 0, 0, 0,
+  32, 0, 34, 11, 0, 18, 0, 0, 19, 48,
+  0, 74, 0, 0, 9, 0, 0, 0, 0, 14,
+  0, 0, 0, 0, 0, 37, 0, 40, 0, 86,
+  0, 0, 8, 140, 13, 21, 34, 0, 22, 0,
+  0, 0, 0, 0, 0, 0, 51, 0, 0, 0,
+  0, 14, 0, 9, 0, 0, 0, 24, 0, 0,
+  0, 11, 28, 0, 0, 0, 0, 0, 0, 47,
+  50, 10, 57, 0, 0, 0, 10, 0, 28, 0,
+  0, 84, 46, 0, 26, 0, 7, 0, 21, 14,
+  59, 0, 50, 0, 0, 36, 7, 0, 152, 0,
+  0, 31, 100, 6, 74, 0, 41, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 24, 26, 15, 20,
+  0, 5, 0, 0, 4, 23, 15, 29, 19, 5,
+  0, 0, 0, 56, 21, 39, 37, 55, 0, 52,
+  0, 0, 82, 0, 11, 0, 0, 14, 0, 19,
+  0, 6, 0, 1, 10, 45, 30, 46, 0, 40,
+  24, 27, 55, 43, 0, 0, 9, 0, 0, 42,
+  0, 0, 0, 0, 0, 0, 32, 0, 0, 0,
+  0, 2, 11, 0, 20, 67, 0, 0, 0, 27,
+  69, 0, 0, 21, 0, 0, 2, 43, 16, 39,
+  82, 7, 0, 0, 15, 0, 21, 0, 0, 53,
+  8, 0, 42, 0, 0, 0, 48, 0, 67, 45,
+  15, 0, 2, 4, 0, 0, 73, 0, 0, 11,
+  69, 15, 131, 0, 65, 0, 0, 0, 0, 21,
+  39, 0, 0, 0, 39, 17, 22, 19, 5, 0,
+  0, 0, 20, 45, 30, 23, 5, 22, 0, 0,
+  0, 63, 27, 30, 38, 35, 115, 0, 0, 0,
+  74, 0, 11, 0, 0, 35, 3, 71, 0, 30,
+  31, 0, 4, 24, 50, 0, 0, 63, 18, 33,
+  32, 49, 0, 0, 0, 28, 0, 17, 6, 0,
+  0, 0, 0, 3, 73, 0, 42, 0, 0, 21,
+  39, 30, 32, 29, 0, 11, 0, 17, 87, 0,
+  23, 13, 0, 0, 7, 29, 62, 11, 41, 0,
+  0, 0, 0, 12, 26, 0, 0, 45, 0, 0,
+  5, 0, 19, 0, 45, 0, 16, 20, 23, 0,
+  12, 0, 0, 0, 0, 0, 0, 4, 0, 0,
+  66, 0, 50, 0, 0, 0, 0, 0, 45, 1,
+  17, 0, 0, 0, 31, 0, 0, 0, 20, 82,
+  0, 0, 0, 11, 29, 0, 23, 30, 25, 5,
+  0, 0, 20, 43, 0, 53, 0, 0, 0, 0,
+  0, 0, 0, 4, 0, 0, 0, 0, 0, 45,
+  6, 26, 0, 49, 0, 0, 0, 152, 0, 16,
+  45, 0, 12, 0, 0, 0, 0, 0, 8, 0,
+  63, 0, 0, 6, 0, 72, 0, 0, 8, 0,
+  0, 0, 0, 0, 0, 0, 13, 0, 1, 0,
+  0, 0, 0, 44, 53, 0, 44, 0, 0, 0,
+  18, 0, 36, 0, 0, 72, 23, 0, 15, 0,
+  42, 0, 1, 20, 65, 0, 81, 0, 0, 14,
+  40, 0, 141, 0, 0, 33, 89, 0, 30, 0,
+  58, 0, 0, 0, 0, 0, 24, 23, 0, 0,
+  18, 24, 50, 29, 0, 0, 0, 30, 0, 5,
+  4, 7, 13, 0, 0, 0, 0, 53, 0, 0,
+  74, 59, 173, 47, 0, 0, 71, 0, 19, 0,
+  0, 20, 0, 24, 0, 0, 0, 0, 18, 88,
+  16, 0, 0, 16, 0, 67, 30, 34, 32, 0,
+  0, 4, 0, 6, 0, 39, 0, 0, 0, 0,
+  33, 0, 0, 14, 6, 12, 56, 3, 0, 51,
+  0, 0, 0, 3, 39, 0, 0, 33, 0, 0,
+  0, 48, 80, 41, 84, 0, 0, 0, 23, 0,
+  51, 0, 2, 59, 14, 2, 58, 0, 66, 2,
+  56, 3, 77, 5, 38, 0, 11, 0, 0, 0,
+  103, 0, 0, 17, 53, 0, 50, 0, 60, 0,
+  7, 11, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 12, 0, 0, 14, 34, 15,
+  0, 0, 26, 34, 0, 0, 0, 21, 29, 0,
+  8, 0, 0, 45, 0, 0, 48, 64, 6, 83,
+  0, 0, 55, 0, 0, 0, 0, 1, 0, 5,
+  0, 0, 0, 16, 10, 46, 0, 58, 0, 8,
+  7, 104, 37, 30, 33, 0, 15, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 6, 0, 0, 19,
+  0, 0, 21, 0, 0, 63, 0, 0, 0, 9,
+  39, 0, 0, 13, 0, 0, 0, 59, 43, 21,
+  114, 3, 0, 0, 28, 0, 36, 0, 0, 91,
+  40, 0, 32, 0, 7, 0, 28, 8, 75, 20,
+  37, 0, 0, 8, 5, 0, 131, 0, 0, 37,
+  103, 0, 101, 0, 70, 0, 0, 0, 0, 6,
+  23, 5, 0, 0, 44, 22, 34, 36, 0, 0,
+  1, 0, 0, 41, 20, 23, 3, 8, 0, 0,
+  0, 69, 18, 19, 51, 49, 164, 7, 0, 0,
+  85, 0, 15, 0, 0, 31, 6, 63, 0, 3,
+  29, 0, 23, 56, 20, 0, 0, 47, 0, 43,
+  48, 47, 7, 0, 0, 20, 0, 28, 0, 23,
+  0, 0, 0, 3, 58, 0, 2, 0, 18, 22,
+  54, 25, 23, 58, 0, 0, 0, 13, 76, 0,
+  7, 17, 0, 0, 4, 37, 62, 48, 83, 0,
+  0, 0, 8, 13, 24, 0, 0, 55, 0, 0,
+  26, 0, 38, 0, 56, 0, 44, 17, 29, 0,
+  10, 0, 0, 0, 37, 0, 0, 16, 21, 0,
+  77, 0, 71, 0, 5, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  24, 26, 15, 20, 0, 5, 0, 0, 4, 23,
+  15, 29, 19, 5, 0, 0, 0, 56, 21, 39,
+  37, 55, 0, 52, 0, 0, 82, 0, 11, 0,
+  0, 14, 0, 19, 0, 6, 0, 1, 10, 45,
+  30, 46, 0, 40, 24, 27, 55, 43, 0, 0,
+  9, 0, 0, 42, 0, 0, 0, 0, 0, 0,
+  32, 0, 0, 0, 0, 2, 11, 0, 20, 67,
+  0, 0, 0, 27, 69, 0, 0, 21, 0, 0,
+  2, 43, 16, 39, 82, 7, 0, 0, 15, 0,
+  21, 0, 0, 53, 8, 0, 42, 0, 0, 0,
+  48, 0, 67, 45, 15, 0, 2, 4, 0, 0,
+  73, 0, 0, 11, 69, 15, 131, 0, 65, 0,
+  0, 0, 0, 21, 39, 0, 0, 0, 39, 17,
+  22, 19, 5, 0, 0, 0, 20, 45, 30, 23,
+  5, 22, 0, 0, 0, 63, 27, 30, 38, 35,
+  115, 0, 0, 0, 74, 0, 11, 0, 0, 35,
+  3, 71, 0, 30, 31, 0, 4, 24, 50, 0,
+  0, 63, 18, 33, 32, 49, 0, 0, 0, 28,
+  0, 17, 6, 0, 0, 0, 0, 3, 73, 0,
+  42, 0, 0, 21, 39, 30, 32, 29, 0, 11,
+  0, 17, 87, 0, 23, 13, 0, 0, 7, 29,
+  62, 11, 41, 0, 0, 0, 0, 12, 26, 0,
+  0, 45, 0, 0, 5, 0, 19, 0, 45, 0,
+  16, 20, 23, 0, 12, 0, 0, 0, 0, 0,
+  0, 4, 0, 0, 66, 0, 50, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 74, 43, 0,
+  0, 0, 41, 0, 0, 0, 0, 15, 3, 0,
+  14, 72, 38, 47, 0, 64, 66, 0, 81, 51,
+  0, 26, 10, 14, 118, 35, 2, 0, 62, 0,
+  42, 8, 0, 26, 7, 52, 32, 25, 0, 26,
+  85, 30, 0, 8, 0, 25, 0, 13, 61, 0,
+  0, 0, 25, 0, 4, 20, 16, 0, 7, 0,
+  0, 0, 21, 2, 0, 0, 14, 32, 32, 38,
+  42, 30, 5, 5, 0, 0, 76, 3, 4, 0,
+  0, 15, 0, 0, 64, 23, 0, 0, 7, 0,
+  8, 49, 0, 0, 22, 10, 3, 0, 1, 17,
+  39, 0, 77, 0, 0, 43, 30, 0, 0, 41,
+  0, 0, 0, 3, 0, 15, 30, 0, 0, 0,
+  22, 0, 36, 0, 4, 47, 62, 10, 0, 19,
+  11, 10, 1, 0, 0, 51, 73, 0, 0, 33,
+  47, 24, 0, 20, 69, 64, 93, 12, 0, 0,
+  0, 23, 0, 0, 0, 0, 74, 0, 23, 28,
+  0, 28, 0, 48, 1, 24, 0, 19, 53, 57,
+  0, 57, 0, 37, 0, 54, 25, 0, 42, 0,
+  29, 0, 2, 0, 1, 0, 0, 20, 15, 0,
+  0, 0, 26, 0, 13, 15, 11, 22, 32, 0,
+  46, 51, 0, 12, 44, 0, 35, 0, 0, 8,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 24,
+  31, 0, 40, 41, 11, 0, 10, 24, 51, 0,
+  57, 0, 0, 3, 17, 15, 0, 12, 0, 0,
+  7, 0, 0, 7, 15, 4, 0, 0, 47, 0,
+  18, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 79, 42, 0, 0, 0, 53, 0, 5, 0,
+  0, 37, 2, 1, 18, 62, 41, 51, 0, 55,
+  86, 0, 87, 50, 0, 11, 5, 15, 128, 37,
+  1, 0, 72, 0, 36, 0, 0, 27, 0, 45,
+  39, 32, 0, 35, 80, 55, 0, 7, 0, 21,
+  12, 25, 62, 0, 16, 0, 27, 0, 29, 0,
+  13, 0, 11, 0, 0, 0, 25, 0, 9, 0,
+  3, 35, 41, 39, 37, 34, 23, 0, 0, 8,
+  79, 22, 1, 0, 0, 13, 0, 0, 82, 36,
+  0, 0, 20, 0, 0, 51, 0, 0, 48, 11,
+  5, 0, 0, 23, 29, 0, 77, 0, 0, 50,
+  18, 0, 0, 42, 0, 0, 0, 4, 5, 13,
+  24, 0, 0, 0, 28, 0, 34, 0, 7, 54,
+  57, 12, 0, 23, 17, 14, 2, 0, 0, 54,
+  68, 12, 2, 19, 58, 30, 0, 13, 72, 61,
+  94, 10, 0, 0, 0, 26, 0, 0, 0, 5,
+  68, 0, 20, 19, 0, 31, 0, 50, 4, 41,
+  0, 19, 53, 58, 0, 66, 0, 27, 0, 55,
+  24, 0, 51, 0, 26, 0, 10, 0, 0, 0,
+  0, 18, 3, 0, 0, 0, 34, 0, 14, 26,
+  9, 11, 35, 0, 48, 32, 0, 34, 37, 0,
+  35, 0, 0, 7, 0, 0, 0, 5, 0, 0,
+  0, 0, 0, 28, 25, 0, 59, 36, 0, 0,
+  14, 23, 43, 0, 49, 0, 0, 6, 11, 5,
+  0, 11, 0, 0, 8, 0, 8, 0, 0, 4,
+  5, 0, 45, 0, 20, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 59, 38, 0, 0, 0,
+  51, 10, 0, 0, 0, 39, 16, 14, 0, 31,
+  37, 50, 8, 52, 96, 0, 89, 33, 0, 0,
+  10, 17, 130, 11, 0, 0, 60, 0, 23, 5,
+  0, 27, 0, 39, 18, 30, 0, 52, 72, 74,
+  0, 1, 0, 9, 3, 38, 49, 0, 21, 0,
+  26, 0, 35, 0, 7, 0, 20, 0, 0, 0,
+  28, 0, 11, 0, 19, 32, 48, 45, 30, 15,
+  29, 8, 0, 9, 64, 8, 4, 0, 0, 0,
+  0, 0, 71, 23, 0, 0, 12, 0, 0, 61,
+  0, 0, 46, 11, 0, 0, 7, 26, 31, 0,
+  76, 0, 0, 36, 15, 0, 0, 53, 0, 0,
+  0, 21, 21, 27, 13, 0, 0, 0, 35, 0,
+  35, 0, 5, 41, 42, 14, 0, 10, 22, 17,
+  7, 0, 0, 59, 79, 18, 12, 8, 57, 30,
+  0, 8, 80, 64, 78, 4, 4, 0, 0, 27,
+  0, 0, 0, 6, 69, 0, 21, 17, 0, 41,
+  0, 56, 0, 45, 0, 25, 49, 58, 0, 46,
+  0, 36, 0, 53, 24, 7, 45, 0, 22, 0,
+  8, 0, 0, 0, 0, 27, 0, 6, 0, 0,
+  31, 0, 5, 23, 14, 9, 30, 0, 48, 35,
+  0, 35, 39, 0, 24, 0, 2, 0, 0, 0,
+  0, 6, 0, 0, 0, 3, 0, 41, 26, 0,
+  61, 31, 0, 0, 30, 12, 49, 0, 50, 0,
+  0, 4, 7, 3, 0, 14, 0, 0, 14, 0,
+  21, 1, 1, 11, 20, 0, 59, 0, 36, 0,
+  0, 74, 43, 0, 0, 0, 41, 0, 0, 0,
+  0, 15, 3, 0, 14, 72, 38, 47, 0, 64,
+  66, 0, 81, 51, 0, 26, 10, 14, 118, 35,
+  2, 0, 62, 0, 42, 8, 0, 26, 7, 52,
+  32, 25, 0, 26, 85, 30, 0, 8, 0, 25,
+  0, 13, 61, 0, 0, 0, 25, 0, 4, 20,
+  16, 0, 7, 0, 0, 0, 21, 2, 0, 0,
+  14, 32, 32, 38, 42, 30, 5, 5, 0, 0,
+  76, 3, 4, 0, 0, 15, 0, 0, 64, 23,
+  0, 0, 7, 0, 8, 49, 0, 0, 22, 10,
+  3, 0, 1, 17, 39, 0, 77, 0, 0, 43,
+  30, 0, 0, 41, 0, 0, 0, 3, 0, 15,
+  30, 0, 0, 0, 22, 0, 36, 0, 4, 47,
+  62, 10, 0, 19, 11, 10, 1, 0, 0, 51,
+  73, 0, 0, 33, 47, 24, 0, 20, 69, 64,
+  93, 12, 0, 0, 0, 23, 0, 0, 0, 0,
+  74, 0, 23, 28, 0, 28, 0, 48, 1, 24,
+  0, 19, 53, 57, 0, 57, 0, 37, 0, 54,
+  25, 0, 42, 0, 29, 0, 2, 0, 1, 0,
+  0, 20, 15, 0, 0, 0, 26, 0, 13, 15,
+  11, 22, 32, 0, 46, 51, 0, 12, 44, 0,
+  35, 0, 0, 8, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 24, 31, 0, 40, 41, 11, 0,
+  10, 24, 51, 0, 57, 0, 0, 3, 17, 15,
+  0, 12, 0, 0, 7, 0, 0, 7, 15, 4,
+  0, 0, 47, 0, 18, 0, 3, 30, 27, 20,
+  0, 12, 23, 23, 27, 0, 0, 40, 83, 0,
+  11, 31, 57, 0, 0, 0, 0, 92, 0, 1,
+  37, 0, 0, 25, 0, 0, 0, 50, 77, 0,
+  34, 0, 0, 19, 0, 54, 0, 46, 24, 10,
+  34, 52, 12, 15, 0, 33, 0, 55, 12, 26,
+  53, 0, 30, 0, 10, 0, 0, 13, 0, 58,
+  0, 13, 0, 0, 32, 0, 13, 16, 12, 11,
+  0, 0, 49, 39, 0, 32, 30, 0, 50, 41,
+  0, 0, 7, 0, 0, 13, 0, 0, 0, 16,
+  0, 30, 52, 0, 6, 80, 2, 0, 18, 20,
+  43, 0, 29, 0, 4, 0, 21, 11, 0, 0,
+  0, 0, 0, 0, 0, 11, 4, 11, 36, 0,
+  51, 0, 18, 0, 0, 79, 42, 0, 0, 0,
+  53, 0, 5, 0, 0, 37, 2, 1, 18, 62,
+  41, 51, 0, 55, 86, 0, 87, 50, 0, 11,
+  5, 15, 128, 37, 1, 0, 72, 0, 36, 0,
+  0, 27, 0, 45, 39, 32, 0, 35, 80, 55,
+  0, 7, 0, 21, 12, 25, 62, 0, 16, 0,
+  27, 0, 29, 0, 13, 0, 11, 0, 0, 0,
+  25, 0, 9, 0, 3, 35, 41, 39, 37, 34,
+  23, 0, 0, 8, 79, 22, 1, 0, 0, 13,
+  0, 0, 82, 36, 0, 0, 20, 0, 0, 51,
+  0, 0, 48, 11, 5, 0, 0, 23, 29, 0,
+  77, 0, 0, 50, 18, 0, 0, 42, 0, 0,
+  0, 4, 5, 13, 24, 0, 0, 0, 28, 0,
+  34, 0, 7, 54, 57, 12, 0, 23, 17, 14,
+  2, 0, 0, 54, 68, 12, 2, 19, 58, 30,
+  0, 13, 72, 61, 94, 10, 0, 0, 0, 26,
+  0, 0, 0, 5, 68, 0, 20, 19, 0, 31,
+  0, 50, 4, 41, 0, 19, 53, 58, 0, 66,
+  0, 27, 0, 55, 24, 0, 51, 0, 26, 0,
+  10, 0, 0, 0, 0, 18, 3, 0, 0, 0,
+  34, 0, 14, 26, 9, 11, 35, 0, 48, 32,
+  0, 34, 37, 0, 35, 0, 0, 7, 0, 0,
+  0, 5, 0, 0, 0, 0, 0, 28, 25, 0,
+  59, 36, 0, 0, 14, 23, 43, 0, 49, 0,
+  0, 6, 11, 5, 0, 11, 0, 0, 8, 0,
+  8, 0, 0, 4, 5, 0, 45, 0, 20, 0,
+  10, 27, 29, 24, 0, 21, 22, 22, 24, 0,
+  0, 43, 79, 0, 6, 26, 56, 0, 0, 0,
+  0, 87, 1, 0, 41, 0, 0, 30, 0, 1,
+  0, 60, 72, 0, 24, 0, 0, 23, 0, 54,
+  0, 47, 13, 10, 23, 49, 26, 18, 0, 30,
+  0, 52, 4, 24, 54, 0, 32, 0, 10, 0,
+  1, 11, 0, 48, 0, 8, 0, 0, 39, 0,
+  18, 26, 11, 0, 0, 2, 47, 27, 0, 46,
+  24, 0, 46, 46, 0, 0, 13, 0, 0, 18,
+  0, 0, 0, 23, 0, 24, 55, 0, 15, 78,
+  0, 0, 25, 19, 40, 0, 26, 0, 5, 0,
+  17, 8, 0, 0, 0, 0, 7, 0, 0, 4,
+  0, 11, 36, 0, 55, 0, 17, 0, 0, 59,
+  38, 0, 0, 0, 51, 10, 0, 0, 0, 39,
+  16, 14, 0, 31, 37, 50, 8, 52, 96, 0,
+  89, 33, 0, 0, 10, 17, 130, 11, 0, 0,
+  60, 0, 23, 5, 0, 27, 0, 39, 18, 30,
+  0, 52, 72, 74, 0, 1, 0, 9, 3, 38,
+  49, 0, 21, 0, 26, 0, 35, 0, 7, 0,
+  20, 0, 0, 0, 28, 0, 11, 0, 19, 32,
+  48, 45, 30, 15, 29, 8, 0, 9, 64, 8,
+  4, 0, 0, 0, 0, 0, 71, 23, 0, 0,
+  12, 0, 0, 61, 0, 0, 46, 11, 0, 0,
+  7, 26, 31, 0, 76, 0, 0, 36, 15, 0,
+  0, 53, 0, 0, 0, 21, 21, 27, 13, 0,
+  0, 0, 35, 0, 35, 0, 5, 41, 42, 14,
+  0, 10, 22, 17, 7, 0, 0, 59, 79, 18,
+  12, 8, 57, 30, 0, 8, 80, 64, 78, 4,
+  4, 0, 0, 27, 0, 0, 0, 6, 69, 0,
+  21, 17, 0, 41, 0, 56, 0, 45, 0, 25,
+  49, 58, 0, 46, 0, 36, 0, 53, 24, 7,
+  45, 0, 22, 0, 8, 0, 0, 0, 0, 27,
+  0, 6, 0, 0, 31, 0, 5, 23, 14, 9,
+  30, 0, 48, 35, 0, 35, 39, 0, 24, 0,
+  2, 0, 0, 0, 0, 6, 0, 0, 0, 3,
+  0, 41, 26, 0, 61, 31, 0, 0, 30, 12,
+  49, 0, 50, 0, 0, 4, 7, 3, 0, 14,
+  0, 0, 14, 0, 21, 1, 1, 11, 20, 0,
+  59, 0, 36, 0, 7, 20, 30, 33, 0, 25,
+  20, 19, 31, 0, 0, 42, 85, 0, 9, 30,
+  51, 0, 0, 0, 0, 86, 1, 3, 48, 0,
+  0, 38, 0, 0, 0, 59, 74, 0, 25, 0,
+  0, 26, 0, 62, 0, 45, 16, 10, 25, 48,
+  31, 10, 0, 42, 0, 48, 3, 27, 52, 0,
+  29, 0, 9, 0, 0, 10, 0, 42, 0, 8,
+  0, 0, 37, 0, 14, 27, 13, 0, 0, 2,
+  45, 38, 0, 45, 25, 0, 49, 45, 0, 0,
+  20, 0, 0, 19, 0, 0, 0, 17, 0, 27,
+  57, 0, 16, 73, 0, 0, 26, 12, 40, 0,
+  28, 0, 0, 0, 14, 3, 0, 0, 0, 0,
+  11, 0, 0, 9, 2, 6, 37, 0, 65, 0,
+  15, 0, 4, 47, 62, 10, 0, 19, 11, 10,
+  1, 0, 0, 51, 73, 0, 0, 33, 47, 24,
+  0, 20, 69, 64, 93, 12, 0, 0, 0, 23,
+  0, 0, 0, 0, 74, 0, 23, 28, 0, 28,
+  0, 48, 1, 24, 0, 19, 53, 57, 0, 57,
+  0, 37, 0, 54, 25, 0, 42, 0, 29, 0,
+  2, 0, 1, 0, 0, 20, 15, 0, 0, 0,
+  26, 0, 13, 15, 11, 22, 32, 0, 46, 51,
+  0, 12, 44, 0, 35, 0, 0, 8, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 24, 31, 0,
+  40, 41, 11, 0, 10, 24, 51, 0, 57, 0,
+  0, 3, 17, 15, 0, 12, 0, 0, 7, 0,
+  0, 7, 15, 4, 0, 0, 47, 0, 18, 0,
+  3, 30, 27, 20, 0, 12, 23, 23, 27, 0,
+  0, 40, 83, 0, 11, 31, 57, 0, 0, 0,
+  0, 92, 0, 1, 37, 0, 0, 25, 0, 0,
+  0, 50, 77, 0, 34, 0, 0, 19, 0, 54,
+  0, 46, 24, 10, 34, 52, 12, 15, 0, 33,
+  0, 55, 12, 26, 53, 0, 30, 0, 10, 0,
+  0, 13, 0, 58, 0, 13, 0, 0, 32, 0,
+  13, 16, 12, 11, 0, 0, 49, 39, 0, 32,
+  30, 0, 50, 41, 0, 0, 7, 0, 0, 13,
+  0, 0, 0, 16, 0, 30, 52, 0, 6, 80,
+  2, 0, 18, 20, 43, 0, 29, 0, 4, 0,
+  21, 11, 0, 0, 0, 0, 0, 0, 0, 11,
+  4, 11, 36, 0, 51, 0, 18, 0, 0, 0,
+  0, 5, 0, 140, 8, 5, 3, 0, 0, 23,
+  36, 0, 0, 10, 2, 0, 0, 0, 35, 102,
+  17, 9, 0, 0, 0, 0, 0, 21, 0, 23,
+  35, 21, 4, 1, 0, 25, 0, 41, 0, 16,
+  0, 48, 13, 84, 13, 57, 0, 3, 0, 61,
+  0, 0, 24, 0, 45, 0, 39, 0, 0, 51,
+  0, 0, 78, 3, 0, 20, 24, 0, 67, 6,
+  31, 2, 0, 19, 16, 27, 0, 18, 39, 0,
+  33, 59, 0, 0, 10, 0, 0, 0, 0, 8,
+  0, 0, 12, 34, 0, 0, 0, 66, 43, 0,
+  0, 31, 31, 0, 26, 0, 0, 0, 14, 0,
+  0, 24, 0, 0, 117, 2, 21, 20, 0, 0,
+  0, 0, 24, 0, 0, 0, 7, 54, 57, 12,
+  0, 23, 17, 14, 2, 0, 0, 54, 68, 12,
+  2, 19, 58, 30, 0, 13, 72, 61, 94, 10,
+  0, 0, 0, 26, 0, 0, 0, 5, 68, 0,
+  20, 19, 0, 31, 0, 50, 4, 41, 0, 19,
+  53, 58, 0, 66, 0, 27, 0, 55, 24, 0,
+  51, 0, 26, 0, 10, 0, 0, 0, 0, 18,
+  3, 0, 0, 0, 34, 0, 14, 26, 9, 11,
+  35, 0, 48, 32, 0, 34, 37, 0, 35, 0,
+  0, 7, 0, 0, 0, 5, 0, 0, 0, 0,
+  0, 28, 25, 0, 59, 36, 0, 0, 14, 23,
+  43, 0, 49, 0, 0, 6, 11, 5, 0, 11,
+  0, 0, 8, 0, 8, 0, 0, 4, 5, 0,
+  45, 0, 20, 0, 10, 27, 29, 24, 0, 21,
+  22, 22, 24, 0, 0, 43, 79, 0, 6, 26,
+  56, 0, 0, 0, 0, 87, 1, 0, 41, 0,
+  0, 30, 0, 1, 0, 60, 72, 0, 24, 0,
+  0, 23, 0, 54, 0, 47, 13, 10, 23, 49,
+  26, 18, 0, 30, 0, 52, 4, 24, 54, 0,
+  32, 0, 10, 0, 1, 11, 0, 48, 0, 8,
+  0, 0, 39, 0, 18, 26, 11, 0, 0, 2,
+  47, 27, 0, 46, 24, 0, 46, 46, 0, 0,
+  13, 0, 0, 18, 0, 0, 0, 23, 0, 24,
+  55, 0, 15, 78, 0, 0, 25, 19, 40, 0,
+  26, 0, 5, 0, 17, 8, 0, 0, 0, 0,
+  7, 0, 0, 4, 0, 11, 36, 0, 55, 0,
+  17, 0, 0, 0, 0, 7, 0, 153, 0, 0,
+  0, 0, 0, 29, 38, 0, 0, 1, 3, 0,
+  0, 0, 24, 93, 13, 16, 0, 0, 0, 0,
+  0, 19, 0, 24, 31, 29, 0, 8, 0, 29,
+  0, 45, 0, 25, 0, 49, 3, 74, 23, 63,
+  0, 7, 0, 55, 0, 0, 19, 0, 43, 0,
+  36, 0, 0, 49, 0, 0, 76, 0, 0, 27,
+  37, 0, 74, 15, 23, 0, 0, 20, 11, 20,
+  0, 34, 35, 0, 40, 53, 0, 0, 16, 0,
+  0, 0, 0, 13, 0, 0, 26, 27, 0, 0,
+  0, 73, 26, 0, 0, 26, 12, 0, 22, 0,
+  0, 0, 6, 0, 0, 16, 0, 0, 114, 0,
+  19, 9, 0, 0, 0, 0, 29, 0, 0, 0,
+  5, 41, 42, 14, 0, 10, 22, 17, 7, 0,
+  0, 59, 79, 18, 12, 8, 57, 30, 0, 8,
+  80, 64, 78, 4, 4, 0, 0, 27, 0, 0,
+  0, 6, 69, 0, 21, 17, 0, 41, 0, 56,
+  0, 45, 0, 25, 49, 58, 0, 46, 0, 36,
+  0, 53, 24, 7, 45, 0, 22, 0, 8, 0,
+  0, 0, 0, 27, 0, 6, 0, 0, 31, 0,
+  5, 23, 14, 9, 30, 0, 48, 35, 0, 35,
+  39, 0, 24, 0, 2, 0, 0, 0, 0, 6,
+  0, 0, 0, 3, 0, 41, 26, 0, 61, 31,
+  0, 0, 30, 12, 49, 0, 50, 0, 0, 4,
+  7, 3, 0, 14, 0, 0, 14, 0, 21, 1,
+  1, 11, 20, 0, 59, 0, 36, 0, 7, 20,
+  30, 33, 0, 25, 20, 19, 31, 0, 0, 42,
+  85, 0, 9, 30, 51, 0, 0, 0, 0, 86,
+  1, 3, 48, 0, 0, 38, 0, 0, 0, 59,
+  74, 0, 25, 0, 0, 26, 0, 62, 0, 45,
+  16, 10, 25, 48, 31, 10, 0, 42, 0, 48,
+  3, 27, 52, 0, 29, 0, 9, 0, 0, 10,
+  0, 42, 0, 8, 0, 0, 37, 0, 14, 27,
+  13, 0, 0, 2, 45, 38, 0, 45, 25, 0,
+  49, 45, 0, 0, 20, 0, 0, 19, 0, 0,
+  0, 17, 0, 27, 57, 0, 16, 73, 0, 0,
+  26, 12, 40, 0, 28, 0, 0, 0, 14, 3,
+  0, 0, 0, 0, 11, 0, 0, 9, 2, 6,
+  37, 0, 65, 0, 15, 0, 0, 0, 0, 14,
+  0, 156, 0, 0, 5, 0, 0, 33, 46, 0,
+  0, 1, 2, 0, 0, 0, 35, 87, 15, 22,
+  9, 0, 0, 0, 0, 4, 0, 26, 27, 34,
+  0, 10, 0, 25, 0, 45, 0, 20, 0, 52,
+  5, 80, 36, 57, 0, 13, 0, 53, 0, 0,
+  18, 0, 38, 0, 42, 0, 0, 46, 0, 0,
+  78, 0, 0, 21, 42, 0, 77, 17, 26, 0,
+  0, 15, 17, 17, 0, 33, 33, 0, 40, 55,
+  0, 0, 30, 0, 0, 0, 0, 21, 0, 0,
+  19, 31, 0, 0, 3, 65, 28, 0, 0, 21,
+  9, 0, 22, 0, 0, 0, 0, 0, 0, 12,
+  0, 0, 106, 0, 25, 11, 0, 0, 0, 0,
+  36, 0, 0, 0, 3, 30, 27, 20, 0, 12,
+  23, 23, 27, 0, 0, 40, 83, 0, 11, 31,
+  57, 0, 0, 0, 0, 92, 0, 1, 37, 0,
+  0, 25, 0, 0, 0, 50, 77, 0, 34, 0,
+  0, 19, 0, 54, 0, 46, 24, 10, 34, 52,
+  12, 15, 0, 33, 0, 55, 12, 26, 53, 0,
+  30, 0, 10, 0, 0, 13, 0, 58, 0, 13,
+  0, 0, 32, 0, 13, 16, 12, 11, 0, 0,
+  49, 39, 0, 32, 30, 0, 50, 41, 0, 0,
+  7, 0, 0, 13, 0, 0, 0, 16, 0, 30,
+  52, 0, 6, 80, 2, 0, 18, 20, 43, 0,
+  29, 0, 4, 0, 21, 11, 0, 0, 0, 0,
+  0, 0, 0, 11, 4, 11, 36, 0, 51, 0,
+  18, 0, 0, 0, 0, 5, 0, 140, 8, 5,
+  3, 0, 0, 23, 36, 0, 0, 10, 2, 0,
+  0, 0, 35, 102, 17, 9, 0, 0, 0, 0,
+  0, 21, 0, 23, 35, 21, 4, 1, 0, 25,
+  0, 41, 0, 16, 0, 48, 13, 84, 13, 57,
+  0, 3, 0, 61, 0, 0, 24, 0, 45, 0,
+  39, 0, 0, 51, 0, 0, 78, 3, 0, 20,
+  24, 0, 67, 6, 31, 2, 0, 19, 16, 27,
+  0, 18, 39, 0, 33, 59, 0, 0, 10, 0,
+  0, 0, 0, 8, 0, 0, 12, 34, 0, 0,
+  0, 66, 43, 0, 0, 31, 31, 0, 26, 0,
+  0, 0, 14, 0, 0, 24, 0, 0, 117, 2,
+  21, 20, 0, 0, 0, 0, 24, 0, 0, 0,
+  0, 8, 0, 0, 0, 26, 43, 6, 20, 0,
+  13, 0, 59, 0, 10, 62, 36, 31, 3, 0,
+  46, 0, 0, 38, 0, 42, 6, 2, 0, 34,
+  0, 0, 63, 41, 15, 0, 0, 0, 0, 46,
+  0, 37, 0, 53, 25, 14, 17, 17, 0, 32,
+  15, 5, 91, 14, 0, 0, 28, 0, 0, 70,
+  0, 0, 0, 0, 0, 0, 24, 8, 0, 0,
+  0, 2, 0, 9, 17, 48, 0, 3, 0, 31,
+  71, 5, 13, 36, 17, 0, 4, 23, 26, 35,
+  36, 0, 0, 2, 17, 32, 0, 0, 2, 44,
+  36, 0, 0, 0, 12, 0, 55, 13, 24, 46,
+  43, 0, 0, 24, 0, 0, 42, 41, 44, 0,
+  0, 0, 108, 0, 71, 14, 0, 0, 10, 27,
+  29, 24, 0, 21, 22, 22, 24, 0, 0, 43,
+  79, 0, 6, 26, 56, 0, 0, 0, 0, 87,
+  1, 0, 41, 0, 0, 30, 0, 1, 0, 60,
+  72, 0, 24, 0, 0, 23, 0, 54, 0, 47,
+  13, 10, 23, 49, 26, 18, 0, 30, 0, 52,
+  4, 24, 54, 0, 32, 0, 10, 0, 1, 11,
+  0, 48, 0, 8, 0, 0, 39, 0, 18, 26,
+  11, 0, 0, 2, 47, 27, 0, 46, 24, 0,
+  46, 46, 0, 0, 13, 0, 0, 18, 0, 0,
+  0, 23, 0, 24, 55, 0, 15, 78, 0, 0,
+  25, 19, 40, 0, 26, 0, 5, 0, 17, 8,
+  0, 0, 0, 0, 7, 0, 0, 4, 0, 11,
+  36, 0, 55, 0, 17, 0, 0, 0, 0, 7,
+  0, 153, 0, 0, 0, 0, 0, 29, 38, 0,
+  0, 1, 3, 0, 0, 0, 24, 93, 13, 16,
+  0, 0, 0, 0, 0, 19, 0, 24, 31, 29,
+  0, 8, 0, 29, 0, 45, 0, 25, 0, 49,
+  3, 74, 23, 63, 0, 7, 0, 55, 0, 0,
+  19, 0, 43, 0, 36, 0, 0, 49, 0, 0,
+  76, 0, 0, 27, 37, 0, 74, 15, 23, 0,
+  0, 20, 11, 20, 0, 34, 35, 0, 40, 53,
+  0, 0, 16, 0, 0, 0, 0, 13, 0, 0,
+  26, 27, 0, 0, 0, 73, 26, 0, 0, 26,
+  12, 0, 22, 0, 0, 0, 6, 0, 0, 16,
+  0, 0, 114, 0, 19, 9, 0, 0, 0, 0,
+  29, 0, 0, 0, 0, 17, 0, 0, 0, 31,
+  35, 0, 13, 0, 8, 0, 56, 4, 16, 62,
+  36, 39, 10, 0, 30, 0, 0, 48, 4, 53,
+  0, 4, 0, 15, 0, 0, 72, 44, 0, 0,
+  0, 0, 0, 66, 0, 41, 0, 43, 20, 12,
+  12, 36, 0, 41, 0, 7, 95, 16, 0, 0,
+  21, 0, 0, 55, 9, 0, 0, 0, 0, 0,
+  32, 12, 11, 0, 0, 0, 0, 15, 10, 55,
+  0, 0, 0, 47, 64, 4, 32, 22, 15, 0,
+  7, 27, 13, 34, 54, 16, 0, 11, 39, 32,
+  0, 0, 0, 68, 22, 0, 0, 0, 0, 0,
+  48, 0, 0, 30, 26, 15, 0, 27, 0, 0,
+  25, 30, 24, 3, 1, 0, 121, 0, 65, 2,
+  0, 0, 7, 20, 30, 33, 0, 25, 20, 19,
+  31, 0, 0, 42, 85, 0, 9, 30, 51, 0,
+  0, 0, 0, 86, 1, 3, 48, 0, 0, 38,
+  0, 0, 0, 59, 74, 0, 25, 0, 0, 26,
+  0, 62, 0, 45, 16, 10, 25, 48, 31, 10,
+  0, 42, 0, 48, 3, 27, 52, 0, 29, 0,
+  9, 0, 0, 10, 0, 42, 0, 8, 0, 0,
+  37, 0, 14, 27, 13, 0, 0, 2, 45, 38,
+  0, 45, 25, 0, 49, 45, 0, 0, 20, 0,
+  0, 19, 0, 0, 0, 17, 0, 27, 57, 0,
+  16, 73, 0, 0, 26, 12, 40, 0, 28, 0,
+  0, 0, 14, 3, 0, 0, 0, 0, 11, 0,
+  0, 9, 2, 6, 37, 0, 65, 0, 15, 0,
+  0, 0, 0, 14, 0, 156, 0, 0, 5, 0,
+  0, 33, 46, 0, 0, 1, 2, 0, 0, 0,
+  35, 87, 15, 22, 9, 0, 0, 0, 0, 4,
+  0, 26, 27, 34, 0, 10, 0, 25, 0, 45,
+  0, 20, 0, 52, 5, 80, 36, 57, 0, 13,
+  0, 53, 0, 0, 18, 0, 38, 0, 42, 0,
+  0, 46, 0, 0, 78, 0, 0, 21, 42, 0,
+  77, 17, 26, 0, 0, 15, 17, 17, 0, 33,
+  33, 0, 40, 55, 0, 0, 30, 0, 0, 0,
+  0, 21, 0, 0, 19, 31, 0, 0, 3, 65,
+  28, 0, 0, 21, 9, 0, 22, 0, 0, 0,
+  0, 0, 0, 12, 0, 0, 106, 0, 25, 11,
+  0, 0, 0, 0, 36, 0, 0, 0, 0, 20,
+  0, 0, 0, 35, 28, 0, 25, 0, 6, 0,
+  68, 1, 9, 53, 37, 38, 8, 0, 43, 0,
+  0, 43, 7, 56, 0, 4, 0, 13, 10, 0,
+  65, 53, 0, 0, 0, 0, 0, 56, 0, 63,
+  0, 42, 23, 10, 1, 49, 0, 48, 0, 7,
+  80, 24, 0, 0, 14, 0, 0, 62, 18, 0,
+  0, 0, 0, 0, 30, 19, 15, 0, 0, 0,
+  0, 17, 1, 53, 0, 0, 0, 49, 63, 0,
+  24, 24, 20, 0, 11, 25, 0, 37, 36, 32,
+  0, 13, 32, 35, 0, 0, 0, 66, 17, 0,
+  0, 0, 0, 0, 37, 0, 0, 36, 37, 19,
+  0, 29, 0, 0, 14, 20, 42, 8, 3, 0,
+  121, 0, 63, 0, 10, 0, 0, 0, 0, 5,
+  0, 140, 8, 5, 3, 0, 0, 23, 36, 0,
+  0, 10, 2, 0, 0, 0, 35, 102, 17, 9,
+  0, 0, 0, 0, 0, 21, 0, 23, 35, 21,
+  4, 1, 0, 25, 0, 41, 0, 16, 0, 48,
+  13, 84, 13, 57, 0, 3, 0, 61, 0, 0,
+  24, 0, 45, 0, 39, 0, 0, 51, 0, 0,
+  78, 3, 0, 20, 24, 0, 67, 6, 31, 2,
+  0, 19, 16, 27, 0, 18, 39, 0, 33, 59,
+  0, 0, 10, 0, 0, 0, 0, 8, 0, 0,
+  12, 34, 0, 0, 0, 66, 43, 0, 0, 31,
+  31, 0, 26, 0, 0, 0, 14, 0, 0, 24,
+  0, 0, 117, 2, 21, 20, 0, 0, 0, 0,
+  24, 0, 0, 0, 0, 8, 0, 0, 0, 26,
+  43, 6, 20, 0, 13, 0, 59, 0, 10, 62,
+  36, 31, 3, 0, 46, 0, 0, 38, 0, 42,
+  6, 2, 0, 34, 0, 0, 63, 41, 15, 0,
+  0, 0, 0, 46, 0, 37, 0, 53, 25, 14,
+  17, 17, 0, 32, 15, 5, 91, 14, 0, 0,
+  28, 0, 0, 70, 0, 0, 0, 0, 0, 0,
+  24, 8, 0, 0, 0, 2, 0, 9, 17, 48,
+  0, 3, 0, 31, 71, 5, 13, 36, 17, 0,
+  4, 23, 26, 35, 36, 0, 0, 2, 17, 32,
+  0, 0, 2, 44, 36, 0, 0, 0, 12, 0,
+  55, 13, 24, 46, 43, 0, 0, 24, 0, 0,
+  42, 41, 44, 0, 0, 0, 108, 0, 71, 14,
+  0, 0, 0, 44, 70, 0, 0, 0, 0, 9,
+  53, 0, 0, 29, 11, 20, 0, 36, 26, 0,
+  0, 0, 0, 7, 73, 51, 0, 0, 16, 18,
+  0, 0, 0, 0, 0, 0, 29, 22, 0, 0,
+  0, 40, 0, 13, 0, 10, 0, 1, 22, 0,
+  0, 0, 35, 32, 22, 15, 0, 0, 28, 0,
+  0, 0, 0, 0, 0, 0, 20, 0, 30, 0,
+  2, 0, 0, 8, 3, 20, 33, 0, 0, 85,
+  0, 28, 19, 0, 42, 48, 0, 18, 0, 36,
+  33, 9, 46, 0, 0, 0, 8, 0, 0, 0,
+  0, 81, 37, 0, 0, 0, 25, 0, 70, 0,
+  22, 26, 14, 0, 0, 8, 0, 0, 28, 0,
+  0, 18, 0, 0, 19, 0, 44, 20, 0, 20,
+  0, 0, 0, 7, 0, 153, 0, 0, 0, 0,
+  0, 29, 38, 0, 0, 1, 3, 0, 0, 0,
+  24, 93, 13, 16, 0, 0, 0, 0, 0, 19,
+  0, 24, 31, 29, 0, 8, 0, 29, 0, 45,
+  0, 25, 0, 49, 3, 74, 23, 63, 0, 7,
+  0, 55, 0, 0, 19, 0, 43, 0, 36, 0,
+  0, 49, 0, 0, 76, 0, 0, 27, 37, 0,
+  74, 15, 23, 0, 0, 20, 11, 20, 0, 34,
+  35, 0, 40, 53, 0, 0, 16, 0, 0, 0,
+  0, 13, 0, 0, 26, 27, 0, 0, 0, 73,
+  26, 0, 0, 26, 12, 0, 22, 0, 0, 0,
+  6, 0, 0, 16, 0, 0, 114, 0, 19, 9,
+  0, 0, 0, 0, 29, 0, 0, 0, 0, 17,
+  0, 0, 0, 31, 35, 0, 13, 0, 8, 0,
+  56, 4, 16, 62, 36, 39, 10, 0, 30, 0,
+  0, 48, 4, 53, 0, 4, 0, 15, 0, 0,
+  72, 44, 0, 0, 0, 0, 0, 66, 0, 41,
+  0, 43, 20, 12, 12, 36, 0, 41, 0, 7,
+  95, 16, 0, 0, 21, 0, 0, 55, 9, 0,
+  0, 0, 0, 0, 32, 12, 11, 0, 0, 0,
+  0, 15, 10, 55, 0, 0, 0, 47, 64, 4,
+  32, 22, 15, 0, 7, 27, 13, 34, 54, 16,
+  0, 11, 39, 32, 0, 0, 0, 68, 22, 0,
+  0, 0, 0, 0, 48, 0, 0, 30, 26, 15,
+  0, 27, 0, 0, 25, 30, 24, 3, 1, 0,
+  121, 0, 65, 2, 0, 0, 0, 31, 59, 0,
+  8, 0, 0, 0, 53, 2, 0, 9, 30, 0,
+  0, 23, 15, 0, 8, 0, 0, 47, 79, 53,
+  0, 0, 0, 15, 0, 0, 0, 0, 0, 0,
+  52, 28, 0, 4, 0, 63, 0, 25, 0, 1,
+  0, 0, 25, 4, 0, 6, 0, 48, 20, 26,
+  0, 0, 19, 0, 8, 0, 0, 13, 0, 0,
+  18, 0, 16, 0, 9, 0, 10, 19, 20, 21,
+  21, 5, 0, 89, 0, 46, 12, 0, 50, 44,
+  4, 2, 0, 39, 7, 1, 49, 0, 0, 0,
+  4, 0, 0, 0, 6, 91, 22, 0, 0, 0,
+  9, 0, 71, 0, 0, 9, 0, 0, 0, 14,
+  0, 0, 23, 0, 0, 33, 0, 0, 26, 0,
+  73, 2, 0, 1, 0, 0, 0, 14, 0, 156,
+  0, 0, 5, 0, 0, 33, 46, 0, 0, 1,
+  2, 0, 0, 0, 35, 87, 15, 22, 9, 0,
+  0, 0, 0, 4, 0, 26, 27, 34, 0, 10,
+  0, 25, 0, 45, 0, 20, 0, 52, 5, 80,
+  36, 57, 0, 13, 0, 53, 0, 0, 18, 0,
+  38, 0, 42, 0, 0, 46, 0, 0, 78, 0,
+  0, 21, 42, 0, 77, 17, 26, 0, 0, 15,
+  17, 17, 0, 33, 33, 0, 40, 55, 0, 0,
+  30, 0, 0, 0, 0, 21, 0, 0, 19, 31,
+  0, 0, 3, 65, 28, 0, 0, 21, 9, 0,
+  22, 0, 0, 0, 0, 0, 0, 12, 0, 0,
+  106, 0, 25, 11, 0, 0, 0, 0, 36, 0,
+  0, 0, 0, 20, 0, 0, 0, 35, 28, 0,
+  25, 0, 6, 0, 68, 1, 9, 53, 37, 38,
+  8, 0, 43, 0, 0, 43, 7, 56, 0, 4,
+  0, 13, 10, 0, 65, 53, 0, 0, 0, 0,
+  0, 56, 0, 63, 0, 42, 23, 10, 1, 49,
+  0, 48, 0, 7, 80, 24, 0, 0, 14, 0,
+  0, 62, 18, 0, 0, 0, 0, 0, 30, 19,
+  15, 0, 0, 0, 0, 17, 1, 53, 0, 0,
+  0, 49, 63, 0, 24, 24, 20, 0, 11, 25,
+  0, 37, 36, 32, 0, 13, 32, 35, 0, 0,
+  0, 66, 17, 0, 0, 0, 0, 0, 37, 0,
+  0, 36, 37, 19, 0, 29, 0, 0, 14, 20,
+  42, 8, 3, 0, 121, 0, 63, 0, 10, 0,
+  0, 30, 54, 0, 0, 0, 0, 0, 58, 0,
+  7, 0, 28, 0, 0, 22, 10, 0, 2, 0,
+  0, 34, 90, 48, 0, 0, 0, 8, 0, 0,
+  0, 0, 0, 0, 60, 31, 0, 15, 0, 34,
+  0, 38, 22, 0, 0, 0, 0, 13, 0, 15,
+  0, 42, 9, 20, 3, 0, 31, 0, 11, 0,
+  0, 30, 0, 0, 11, 0, 36, 0, 0, 0,
+  39, 7, 39, 28, 0, 24, 0, 100, 0, 56,
+  6, 0, 40, 58, 4, 14, 0, 33, 0, 7,
+  54, 0, 0, 0, 20, 0, 0, 0, 0, 89,
+  27, 0, 0, 0, 2, 0, 51, 2, 0, 7,
+  14, 14, 0, 14, 0, 0, 0, 0, 9, 47,
+  0, 0, 11, 0, 57, 2, 5, 8, 0, 8,
+  0, 0, 0, 26, 43, 6, 20, 0, 13, 0,
+  59, 0, 10, 62, 36, 31, 3, 0, 46, 0,
+  0, 38, 0, 42, 6, 2, 0, 34, 0, 0,
+  63, 41, 15, 0, 0, 0, 0, 46, 0, 37,
+  0, 53, 25, 14, 17, 17, 0, 32, 15, 5,
+  91, 14, 0, 0, 28, 0, 0, 70, 0, 0,
+  0, 0, 0, 0, 24, 8, 0, 0, 0, 2,
+  0, 9, 17, 48, 0, 3, 0, 31, 71, 5,
+  13, 36, 17, 0, 4, 23, 26, 35, 36, 0,
+  0, 2, 17, 32, 0, 0, 2, 44, 36, 0,
+  0, 0, 12, 0, 55, 13, 24, 46, 43, 0,
+  0, 24, 0, 0, 42, 41, 44, 0, 0, 0,
+  108, 0, 71, 14, 0, 0, 0, 44, 70, 0,
+  0, 0, 0, 9, 53, 0, 0, 29, 11, 20,
+  0, 36, 26, 0, 0, 0, 0, 7, 73, 51,
+  0, 0, 16, 18, 0, 0, 0, 0, 0, 0,
+  29, 22, 0, 0, 0, 40, 0, 13, 0, 10,
+  0, 1, 22, 0, 0, 0, 35, 32, 22, 15,
+  0, 0, 28, 0, 0, 0, 0, 0, 0, 0,
+  20, 0, 30, 0, 2, 0, 0, 8, 3, 20,
+  33, 0, 0, 85, 0, 28, 19, 0, 42, 48,
+  0, 18, 0, 36, 33, 9, 46, 0, 0, 0,
+  8, 0, 0, 0, 0, 81, 37, 0, 0, 0,
+  25, 0, 70, 0, 22, 26, 14, 0, 0, 8,
+  0, 0, 28, 0, 0, 18, 0, 0, 19, 0,
+  44, 20, 0, 20, 102, 0, 40, 4, 0, 12,
+  0, 0, 45, 0, 0, 35, 56, 20, 0, 0,
+  9, 0, 0, 0, 0, 189, 80, 25, 0, 0,
+  0, 31, 0, 0, 16, 61, 0, 11, 0, 30,
+  0, 40, 0, 30, 0, 28, 48, 0, 38, 21,
+  24, 29, 0, 0, 0, 80, 0, 0, 100, 0,
+  63, 0, 47, 0, 14, 23, 0, 56, 27, 66,
+  0, 1, 0, 4, 12, 26, 10, 13, 0, 0,
+  0, 47, 0, 15, 0, 0, 7, 21, 0, 11,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  25, 0, 18, 61, 0, 0, 17, 0, 54, 23,
+  26, 12, 6, 14, 8, 6, 0, 0, 0, 2,
+  87, 0, 36, 39, 0, 9, 0, 0, 23, 15,
+  18, 29, 0, 17, 0, 0, 0, 31, 35, 0,
+  13, 0, 8, 0, 56, 4, 16, 62, 36, 39,
+  10, 0, 30, 0, 0, 48, 4, 53, 0, 4,
+  0, 15, 0, 0, 72, 44, 0, 0, 0, 0,
+  0, 66, 0, 41, 0, 43, 20, 12, 12, 36,
+  0, 41, 0, 7, 95, 16, 0, 0, 21, 0,
+  0, 55, 9, 0, 0, 0, 0, 0, 32, 12,
+  11, 0, 0, 0, 0, 15, 10, 55, 0, 0,
+  0, 47, 64, 4, 32, 22, 15, 0, 7, 27,
+  13, 34, 54, 16, 0, 11, 39, 32, 0, 0,
+  0, 68, 22, 0, 0, 0, 0, 0, 48, 0,
+  0, 30, 26, 15, 0, 27, 0, 0, 25, 30,
+  24, 3, 1, 0, 121, 0, 65, 2, 0, 0,
+  0, 31, 59, 0, 8, 0, 0, 0, 53, 2,
+  0, 9, 30, 0, 0, 23, 15, 0, 8, 0,
+  0, 47, 79, 53, 0, 0, 0, 15, 0, 0,
+  0, 0, 0, 0, 52, 28, 0, 4, 0, 63,
+  0, 25, 0, 1, 0, 0, 25, 4, 0, 6,
+  0, 48, 20, 26, 0, 0, 19, 0, 8, 0,
+  0, 13, 0, 0, 18, 0, 16, 0, 9, 0,
+  10, 19, 20, 21, 21, 5, 0, 89, 0, 46,
+  12, 0, 50, 44, 4, 2, 0, 39, 7, 1,
+  49, 0, 0, 0, 4, 0, 0, 0, 6, 91,
+  22, 0, 0, 0, 9, 0, 71, 0, 0, 9,
+  0, 0, 0, 14, 0, 0, 23, 0, 0, 33,
+  0, 0, 26, 0, 73, 2, 0, 1, 73, 0,
+  21, 29, 10, 2, 0, 11, 74, 0, 0, 18,
+  94, 0, 0, 0, 36, 0, 0, 0, 0, 148,
+  91, 19, 0, 0, 0, 47, 0, 0, 32, 47,
+  0, 0, 27, 32, 0, 52, 0, 43, 0, 24,
+  66, 17, 51, 51, 13, 28, 0, 0, 0, 63,
+  0, 0, 62, 0, 50, 0, 39, 0, 0, 6,
+  0, 30, 12, 20, 0, 4, 0, 0, 19, 4,
+  40, 42, 0, 0, 0, 87, 0, 19, 0, 0,
+  16, 26, 0, 11, 0, 0, 0, 0, 0, 0,
+  0, 8, 0, 0, 35, 0, 15, 55, 0, 0,
+  22, 0, 52, 8, 59, 31, 3, 19, 8, 16,
+  0, 0, 0, 0, 66, 0, 18, 40, 0, 4,
+  0, 0, 51, 0, 18, 14, 0, 20, 0, 0,
+  0, 35, 28, 0, 25, 0, 6, 0, 68, 1,
+  9, 53, 37, 38, 8, 0, 43, 0, 0, 43,
+  7, 56, 0, 4, 0, 13, 10, 0, 65, 53,
+  0, 0, 0, 0, 0, 56, 0, 63, 0, 42,
+  23, 10, 1, 49, 0, 48, 0, 7, 80, 24,
+  0, 0, 14, 0, 0, 62, 18, 0, 0, 0,
+  0, 0, 30, 19, 15, 0, 0, 0, 0, 17,
+  1, 53, 0, 0, 0, 49, 63, 0, 24, 24,
+  20, 0, 11, 25, 0, 37, 36, 32, 0, 13,
+  32, 35, 0, 0, 0, 66, 17, 0, 0, 0,
+  0, 0, 37, 0, 0, 36, 37, 19, 0, 29,
+  0, 0, 14, 20, 42, 8, 3, 0, 121, 0,
+  63, 0, 10, 0, 0, 30, 54, 0, 0, 0,
+  0, 0, 58, 0, 7, 0, 28, 0, 0, 22,
+  10, 0, 2, 0, 0, 34, 90, 48, 0, 0,
+  0, 8, 0, 0, 0, 0, 0, 0, 60, 31,
+  0, 15, 0, 34, 0, 38, 22, 0, 0, 0,
+  0, 13, 0, 15, 0, 42, 9, 20, 3, 0,
+  31, 0, 11, 0, 0, 30, 0, 0, 11, 0,
+  36, 0, 0, 0, 39, 7, 39, 28, 0, 24,
+  0, 100, 0, 56, 6, 0, 40, 58, 4, 14,
+  0, 33, 0, 7, 54, 0, 0, 0, 20, 0,
+  0, 0, 0, 89, 27, 0, 0, 0, 2, 0,
+  51, 2, 0, 7, 14, 14, 0, 14, 0, 0,
+  0, 0, 9, 47, 0, 0, 11, 0, 57, 2,
+  5, 8, 47, 0, 20, 39, 5, 0, 0, 0,
+  62, 0, 0, 14, 68, 0, 0, 21, 35, 5,
+  0, 0, 0, 128, 114, 15, 0, 0, 0, 47,
+  0, 0, 20, 52, 0, 0, 50, 20, 0, 61,
+  4, 20, 4, 18, 55, 0, 26, 27, 3, 14,
+  0, 0, 0, 37, 0, 16, 61, 0, 47, 0,
+  41, 0, 0, 22, 0, 3, 20, 0, 11, 19,
+  19, 0, 54, 9, 49, 31, 0, 0, 0, 94,
+  0, 41, 0, 0, 7, 31, 0, 19, 0, 0,
+  0, 0, 0, 0, 0, 7, 19, 0, 43, 0,
+  15, 77, 0, 0, 32, 0, 35, 20, 15, 28,
+  0, 0, 0, 17, 0, 0, 0, 0, 32, 0,
+  4, 45, 0, 0, 0, 0, 48, 0, 19, 13,
+  0, 44, 70, 0, 0, 0, 0, 9, 53, 0,
+  0, 29, 11, 20, 0, 36, 26, 0, 0, 0,
+  0, 7, 73, 51, 0, 0, 16, 18, 0, 0,
+  0, 0, 0, 0, 29, 22, 0, 0, 0, 40,
+  0, 13, 0, 10, 0, 1, 22, 0, 0, 0,
+  35, 32, 22, 15, 0, 0, 28, 0, 0, 0,
+  0, 0, 0, 0, 20, 0, 30, 0, 2, 0,
+  0, 8, 3, 20, 33, 0, 0, 85, 0, 28,
+  19, 0, 42, 48, 0, 18, 0, 36, 33, 9,
+  46, 0, 0, 0, 8, 0, 0, 0, 0, 81,
+  37, 0, 0, 0, 25, 0, 70, 0, 22, 26,
+  14, 0, 0, 8, 0, 0, 28, 0, 0, 18,
+  0, 0, 19, 0, 44, 20, 0, 20, 102, 0,
+  40, 4, 0, 12, 0, 0, 45, 0, 0, 35,
+  56, 20, 0, 0, 9, 0, 0, 0, 0, 189,
+  80, 25, 0, 0, 0, 31, 0, 0, 16, 61,
+  0, 11, 0, 30, 0, 40, 0, 30, 0, 28,
+  48, 0, 38, 21, 24, 29, 0, 0, 0, 80,
+  0, 0, 100, 0, 63, 0, 47, 0, 14, 23,
+  0, 56, 27, 66, 0, 1, 0, 4, 12, 26,
+  10, 13, 0, 0, 0, 47, 0, 15, 0, 0,
+  7, 21, 0, 11, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 25, 0, 18, 61, 0, 0,
+  17, 0, 54, 23, 26, 12, 6, 14, 8, 6,
+  0, 0, 0, 2, 87, 0, 36, 39, 0, 9,
+  0, 0, 23, 15, 18, 29, 9, 0, 0, 9,
+  0, 65, 0, 0, 41, 0, 0, 0, 45, 38,
+  0, 38, 32, 25, 0, 0, 8, 14, 5, 56,
+  28, 0, 0, 19, 0, 0, 0, 21, 10, 40,
+  27, 4, 0, 33, 0, 8, 9, 4, 50, 58,
+  50, 77, 14, 17, 0, 0, 0, 0, 0, 0,
+  0, 0, 54, 0, 0, 0, 4, 43, 0, 0,
+  0, 0, 0, 0, 12, 0, 54, 0, 14, 11,
+  0, 28, 0, 28, 0, 28, 0, 16, 0, 39,
+  0, 0, 31, 0, 14, 62, 0, 63, 0, 0,
+  13, 17, 0, 0, 0, 56, 19, 0, 0, 0,
+  17, 0, 0, 4, 0, 40, 0, 0, 0, 9,
+  0, 0, 61, 0, 8, 0, 37, 0, 3, 0,
+  29, 10, 44, 0, 0, 31, 59, 0, 8, 0,
+  0, 0, 53, 2, 0, 9, 30, 0, 0, 23,
+  15, 0, 8, 0, 0, 47, 79, 53, 0, 0,
+  0, 15, 0, 0, 0, 0, 0, 0, 52, 28,
+  0, 4, 0, 63, 0, 25, 0, 1, 0, 0,
+  25, 4, 0, 6, 0, 48, 20, 26, 0, 0,
+  19, 0, 8, 0, 0, 13, 0, 0, 18, 0,
+  16, 0, 9, 0, 10, 19, 20, 21, 21, 5,
+  0, 89, 0, 46, 12, 0, 50, 44, 4, 2,
+  0, 39, 7, 1, 49, 0, 0, 0, 4, 0,
+  0, 0, 6, 91, 22, 0, 0, 0, 9, 0,
+  71, 0, 0, 9, 0, 0, 0, 14, 0, 0,
+  23, 0, 0, 33, 0, 0, 26, 0, 73, 2,
+  0, 1, 73, 0, 21, 29, 10, 2, 0, 11,
+  74, 0, 0, 18, 94, 0, 0, 0, 36, 0,
+  0, 0, 0, 148, 91, 19, 0, 0, 0, 47,
+  0, 0, 32, 47, 0, 0, 27, 32, 0, 52,
+  0, 43, 0, 24, 66, 17, 51, 51, 13, 28,
+  0, 0, 0, 63, 0, 0, 62, 0, 50, 0,
+  39, 0, 0, 6, 0, 30, 12, 20, 0, 4,
+  0, 0, 19, 4, 40, 42, 0, 0, 0, 87,
+  0, 19, 0, 0, 16, 26, 0, 11, 0, 0,
+  0, 0, 0, 0, 0, 8, 0, 0, 35, 0,
+  15, 55, 0, 0, 22, 0, 52, 8, 59, 31,
+  3, 19, 8, 16, 0, 0, 0, 0, 66, 0,
+  18, 40, 0, 4, 0, 0, 51, 0, 18, 14,
+  0, 0, 0, 29, 1, 29, 8, 0, 54, 0,
+  0, 0, 67, 10, 9, 37, 50, 41, 0, 0,
+  0, 0, 0, 46, 33, 11, 2, 31, 0, 0,
+  8, 47, 45, 22, 0, 0, 0, 51, 0, 0,
+  0, 0, 95, 63, 29, 90, 0, 25, 0, 0,
+  0, 1, 11, 3, 0, 0, 29, 0, 0, 1,
+  0, 38, 0, 0, 3, 0, 26, 25, 4, 0,
+  48, 0, 30, 61, 0, 8, 0, 30, 0, 18,
+  0, 0, 0, 54, 0, 2, 33, 0, 0, 26,
+  0, 44, 0, 32, 0, 43, 0, 0, 0, 39,
+  13, 0, 8, 0, 38, 0, 3, 19, 0, 10,
+  9, 7, 0, 4, 0, 0, 50, 0, 0, 18,
+  13, 0, 27, 0, 42, 0, 53, 0, 0, 30,
+  54, 0, 0, 0, 0, 0, 58, 0, 7, 0,
+  28, 0, 0, 22, 10, 0, 2, 0, 0, 34,
+  90, 48, 0, 0, 0, 8, 0, 0, 0, 0,
+  0, 0, 60, 31, 0, 15, 0, 34, 0, 38,
+  22, 0, 0, 0, 0, 13, 0, 15, 0, 42,
+  9, 20, 3, 0, 31, 0, 11, 0, 0, 30,
+  0, 0, 11, 0, 36, 0, 0, 0, 39, 7,
+  39, 28, 0, 24, 0, 100, 0, 56, 6, 0,
+  40, 58, 4, 14, 0, 33, 0, 7, 54, 0,
+  0, 0, 20, 0, 0, 0, 0, 89, 27, 0,
+  0, 0, 2, 0, 51, 2, 0, 7, 14, 14,
+  0, 14, 0, 0, 0, 0, 9, 47, 0, 0,
+  11, 0, 57, 2, 5, 8, 47, 0, 20, 39,
+  5, 0, 0, 0, 62, 0, 0, 14, 68, 0,
+  0, 21, 35, 5, 0, 0, 0, 128, 114, 15,
+  0, 0, 0, 47, 0, 0, 20, 52, 0, 0,
+  50, 20, 0, 61, 4, 20, 4, 18, 55, 0,
+  26, 27, 3, 14, 0, 0, 0, 37, 0, 16,
+  61, 0, 47, 0, 41, 0, 0, 22, 0, 3,
+  20, 0, 11, 19, 19, 0, 54, 9, 49, 31,
+  0, 0, 0, 94, 0, 41, 0, 0, 7, 31,
+  0, 19, 0, 0, 0, 0, 0, 0, 0, 7,
+  19, 0, 43, 0, 15, 77, 0, 0, 32, 0,
+  35, 20, 15, 28, 0, 0, 0, 17, 0, 0,
+  0, 0, 32, 0, 4, 45, 0, 0, 0, 0,
+  48, 0, 19, 13, 7, 0, 3, 44, 17, 25,
+  0, 0, 33, 5, 0, 0, 79, 30, 6, 52,
+  69, 29, 0, 5, 0, 0, 0, 27, 43, 42,
+  0, 35, 0, 15, 23, 80, 17, 52, 0, 11,
+  0, 71, 0, 0, 0, 0, 79, 35, 26, 18,
+  0, 33, 18, 0, 0, 0, 0, 36, 0, 0,
+  12, 0, 0, 50, 0, 25, 11, 0, 0, 0,
+  34, 59, 45, 0, 6, 16, 27, 39, 11, 5,
+  0, 27, 0, 41, 0, 6, 0, 50, 30, 18,
+  19, 0, 0, 8, 0, 13, 0, 78, 0, 51,
+  3, 0, 0, 35, 0, 0, 32, 0, 33, 0,
+  0, 19, 0, 0, 22, 0, 0, 0, 0, 0,
+  41, 0, 0, 2, 9, 6, 34, 0, 46, 1,
+  49, 0, 102, 0, 40, 4, 0, 12, 0, 0,
+  45, 0, 0, 35, 56, 20, 0, 0, 9, 0,
+  0, 0, 0, 189, 80, 25, 0, 0, 0, 31,
+  0, 0, 16, 61, 0, 11, 0, 30, 0, 40,
+  0, 30, 0, 28, 48, 0, 38, 21, 24, 29,
+  0, 0, 0, 80, 0, 0, 100, 0, 63, 0,
+  47, 0, 14, 23, 0, 56, 27, 66, 0, 1,
+  0, 4, 12, 26, 10, 13, 0, 0, 0, 47,
+  0, 15, 0, 0, 7, 21, 0, 11, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 25, 0,
+  18, 61, 0, 0, 17, 0, 54, 23, 26, 12,
+  6, 14, 8, 6, 0, 0, 0, 2, 87, 0,
+  36, 39, 0, 9, 0, 0, 23, 15, 18, 29,
+  9, 0, 0, 9, 0, 65, 0, 0, 41, 0,
+  0, 0, 45, 38, 0, 38, 32, 25, 0, 0,
+  8, 14, 5, 56, 28, 0, 0, 19, 0, 0,
+  0, 21, 10, 40, 27, 4, 0, 33, 0, 8,
+  9, 4, 50, 58, 50, 77, 14, 17, 0, 0,
+  0, 0, 0, 0, 0, 0, 54, 0, 0, 0,
+  4, 43, 0, 0, 0, 0, 0, 0, 12, 0,
+  54, 0, 14, 11, 0, 28, 0, 28, 0, 28,
+  0, 16, 0, 39, 0, 0, 31, 0, 14, 62,
+  0, 63, 0, 0, 13, 17, 0, 0, 0, 56,
+  19, 0, 0, 0, 17, 0, 0, 4, 0, 40,
+  0, 0, 0, 9, 0, 0, 61, 0, 8, 0,
+  37, 0, 3, 0, 29, 10, 44, 0, 0, 14,
+  0, 0, 35, 12, 0, 0, 40, 0, 0, 15,
+  31, 88, 14, 51, 40, 12, 0, 18, 47, 0,
+  19, 50, 3, 20, 0, 2, 0, 0, 0, 0,
+  0, 38, 7, 0, 3, 31, 0, 29, 36, 1,
+  0, 74, 29, 39, 8, 0, 0, 0, 18, 2,
+  39, 14, 0, 6, 37, 0, 0, 0, 0, 4,
+  5, 0, 0, 0, 26, 0, 49, 0, 0, 0,
+  3, 3, 17, 22, 0, 17, 0, 21, 27, 60,
+  0, 26, 24, 3, 57, 0, 52, 33, 0, 62,
+  14, 8, 23, 27, 0, 0, 26, 70, 5, 0,
+  0, 0, 0, 0, 0, 16, 0, 35, 0, 0,
+  0, 12, 0, 0, 17, 3, 26, 0, 0, 0,
+  20, 0, 35, 8, 37, 0, 73, 0, 21, 29,
+  10, 2, 0, 11, 74, 0, 0, 18, 94, 0,
+  0, 0, 36, 0, 0, 0, 0, 148, 91, 19,
+  0, 0, 0, 47, 0, 0, 32, 47, 0, 0,
+  27, 32, 0, 52, 0, 43, 0, 24, 66, 17,
+  51, 51, 13, 28, 0, 0, 0, 63, 0, 0,
+  62, 0, 50, 0, 39, 0, 0, 6, 0, 30,
+  12, 20, 0, 4, 0, 0, 19, 4, 40, 42,
+  0, 0, 0, 87, 0, 19, 0, 0, 16, 26,
+  0, 11, 0, 0, 0, 0, 0, 0, 0, 8,
+  0, 0, 35, 0, 15, 55, 0, 0, 22, 0,
+  52, 8, 59, 31, 3, 19, 8, 16, 0, 0,
+  0, 0, 66, 0, 18, 40, 0, 4, 0, 0,
+  51, 0, 18, 14, 0, 0, 0, 29, 1, 29,
+  8, 0, 54, 0, 0, 0, 67, 10, 9, 37,
+  50, 41, 0, 0, 0, 0, 0, 46, 33, 11,
+  2, 31, 0, 0, 8, 47, 45, 22, 0, 0,
+  0, 51, 0, 0, 0, 0, 95, 63, 29, 90,
+  0, 25, 0, 0, 0, 1, 11, 3, 0, 0,
+  29, 0, 0, 1, 0, 38, 0, 0, 3, 0,
+  26, 25, 4, 0, 48, 0, 30, 61, 0, 8,
+  0, 30, 0, 18, 0, 0, 0, 54, 0, 2,
+  33, 0, 0, 26, 0, 44, 0, 32, 0, 43,
+  0, 0, 0, 39, 13, 0, 8, 0, 38, 0,
+  3, 19, 0, 10, 9, 7, 0, 4, 0, 0,
+  50, 0, 0, 18, 13, 0, 27, 0, 42, 0,
+  53, 0, 0, 0, 0, 5, 36, 43, 0, 0,
+  0, 0, 0, 1, 24, 87, 0, 16, 36, 0,
+  0, 9, 34, 0, 19, 29, 0, 11, 0, 0,
+  0, 24, 7, 0, 0, 36, 0, 0, 0, 26,
+  0, 8, 20, 9, 0, 66, 26, 13, 0, 36,
+  0, 0, 2, 42, 7, 10, 0, 0, 26, 0,
+  0, 0, 0, 31, 20, 0, 10, 0, 10, 15,
+  33, 0, 6, 11, 0, 7, 9, 11, 0, 16,
+  0, 29, 9, 31, 0, 20, 48, 0, 63, 19,
+  21, 0, 0, 52, 14, 4, 22, 50, 0, 0,
+  0, 71, 13, 0, 0, 0, 0, 0, 0, 1,
+  0, 0, 3, 0, 0, 16, 0, 8, 57, 0,
+  8, 0, 0, 0, 0, 0, 20, 1, 25, 0,
+  47, 0, 20, 39, 5, 0, 0, 0, 62, 0,
+  0, 14, 68, 0, 0, 21, 35, 5, 0, 0,
+  0, 128, 114, 15, 0, 0, 0, 47, 0, 0,
+  20, 52, 0, 0, 50, 20, 0, 61, 4, 20,
+  4, 18, 55, 0, 26, 27, 3, 14, 0, 0,
+  0, 37, 0, 16, 61, 0, 47, 0, 41, 0,
+  0, 22, 0, 3, 20, 0, 11, 19, 19, 0,
+  54, 9, 49, 31, 0, 0, 0, 94, 0, 41,
+  0, 0, 7, 31, 0, 19, 0, 0, 0, 0,
+  0, 0, 0, 7, 19, 0, 43, 0, 15, 77,
+  0, 0, 32, 0, 35, 20, 15, 28, 0, 0,
+  0, 17, 0, 0, 0, 0, 32, 0, 4, 45,
+  0, 0, 0, 0, 48, 0, 19, 13, 7, 0,
+  3, 44, 17, 25, 0, 0, 33, 5, 0, 0,
+  79, 30, 6, 52, 69, 29, 0, 5, 0, 0,
+  0, 27, 43, 42, 0, 35, 0, 15, 23, 80,
+  17, 52, 0, 11, 0, 71, 0, 0, 0, 0,
+  79, 35, 26, 18, 0, 33, 18, 0, 0, 0,
+  0, 36, 0, 0, 12, 0, 0, 50, 0, 25,
+  11, 0, 0, 0, 34, 59, 45, 0, 6, 16,
+  27, 39, 11, 5, 0, 27, 0, 41, 0, 6,
+  0, 50, 30, 18, 19, 0, 0, 8, 0, 13,
+  0, 78, 0, 51, 3, 0, 0, 35, 0, 0,
+  32, 0, 33, 0, 0, 19, 0, 0, 22, 0,
+  0, 0, 0, 0, 41, 0, 0, 2, 9, 6,
+  34, 0, 46, 1, 49, 0, 0, 0, 10, 17,
+  54, 56, 0, 0, 20, 0, 5, 0, 53, 99,
+  5, 43, 52, 0, 0, 5, 28, 0, 0, 23,
+  0, 24, 0, 5, 0, 39, 8, 0, 0, 50,
+  0, 0, 0, 26, 0, 39, 0, 24, 13, 63,
+  23, 0, 2, 41, 6, 0, 11, 51, 3, 40,
+  0, 0, 3, 3, 2, 3, 0, 28, 5, 0,
+  0, 0, 3, 0, 53, 0, 0, 21, 8, 0,
+  22, 6, 0, 28, 0, 59, 6, 44, 0, 0,
+  63, 6, 53, 24, 33, 0, 0, 30, 0, 30,
+  0, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+  0, 0, 0, 1, 0, 0, 20, 0, 0, 6,
+  0, 0, 60, 0, 0, 0, 34, 0, 15, 0,
+  39, 0, 0, 0, 9, 0, 0, 9, 0, 65,
+  0, 0, 41, 0, 0, 0, 45, 38, 0, 38,
+  32, 25, 0, 0, 8, 14, 5, 56, 28, 0,
+  0, 19, 0, 0, 0, 21, 10, 40, 27, 4,
+  0, 33, 0, 8, 9, 4, 50, 58, 50, 77,
+  14, 17, 0, 0, 0, 0, 0, 0, 0, 0,
+  54, 0, 0, 0, 4, 43, 0, 0, 0, 0,
+  0, 0, 12, 0, 54, 0, 14, 11, 0, 28,
+  0, 28, 0, 28, 0, 16, 0, 39, 0, 0,
+  31, 0, 14, 62, 0, 63, 0, 0, 13, 17,
+  0, 0, 0, 56, 19, 0, 0, 0, 17, 0,
+  0, 4, 0, 40, 0, 0, 0, 9, 0, 0,
+  61, 0, 8, 0, 37, 0, 3, 0, 29, 10,
+  44, 0, 0, 14, 0, 0, 35, 12, 0, 0,
+  40, 0, 0, 15, 31, 88, 14, 51, 40, 12,
+  0, 18, 47, 0, 19, 50, 3, 20, 0, 2,
+  0, 0, 0, 0, 0, 38, 7, 0, 3, 31,
+  0, 29, 36, 1, 0, 74, 29, 39, 8, 0,
+  0, 0, 18, 2, 39, 14, 0, 6, 37, 0,
+  0, 0, 0, 4, 5, 0, 0, 0, 26, 0,
+  49, 0, 0, 0, 3, 3, 17, 22, 0, 17,
+  0, 21, 27, 60, 0, 26, 24, 3, 57, 0,
+  52, 33, 0, 62, 14, 8, 23, 27, 0, 0,
+  26, 70, 5, 0, 0, 0, 0, 0, 0, 16,
+  0, 35, 0, 0, 0, 12, 0, 0, 17, 3,
+  26, 0, 0, 0, 20, 0, 35, 8, 37, 0,
+  24, 0, 53, 0, 32, 0, 0, 0, 25, 0,
+  0, 1, 9, 122, 15, 0, 27, 21, 0, 8,
+  41, 13, 69, 7, 0, 0, 0, 4, 0, 0,
+  0, 0, 0, 5, 0, 0, 0, 4, 0, 26,
+  14, 10, 0, 48, 14, 0, 0, 0, 0, 0,
+  37, 104, 0, 37, 0, 0, 9, 6, 3, 0,
+  0, 0, 33, 0, 50, 22, 0, 0, 24, 22,
+  0, 1, 0, 0, 27, 0, 0, 13, 0, 41,
+  14, 36, 0, 5, 48, 0, 45, 11, 72, 0,
+  0, 2, 0, 0, 0, 25, 0, 0, 41, 57,
+  0, 0, 0, 0, 0, 0, 0, 10, 1, 0,
+  35, 0, 0, 0, 51, 0, 55, 0, 5, 0,
+  0, 0, 0, 0, 28, 1, 16, 0, 0, 0,
+  0, 29, 1, 29, 8, 0, 54, 0, 0, 0,
+  67, 10, 9, 37, 50, 41, 0, 0, 0, 0,
+  0, 46, 33, 11, 2, 31, 0, 0, 8, 47,
+  45, 22, 0, 0, 0, 51, 0, 0, 0, 0,
+  95, 63, 29, 90, 0, 25, 0, 0, 0, 1,
+  11, 3, 0, 0, 29, 0, 0, 1, 0, 38,
+  0, 0, 3, 0, 26, 25, 4, 0, 48, 0,
+  30, 61, 0, 8, 0, 30, 0, 18, 0, 0,
+  0, 54, 0, 2, 33, 0, 0, 26, 0, 44,
+  0, 32, 0, 43, 0, 0, 0, 39, 13, 0,
+  8, 0, 38, 0, 3, 19, 0, 10, 9, 7,
+  0, 4, 0, 0, 50, 0, 0, 18, 13, 0,
+  27, 0, 42, 0, 53, 0, 0, 0, 0, 5,
+  36, 43, 0, 0, 0, 0, 0, 1, 24, 87,
+  0, 16, 36, 0, 0, 9, 34, 0, 19, 29,
+  0, 11, 0, 0, 0, 24, 7, 0, 0, 36,
+  0, 0, 0, 26, 0, 8, 20, 9, 0, 66,
+  26, 13, 0, 36, 0, 0, 2, 42, 7, 10,
+  0, 0, 26, 0, 0, 0, 0, 31, 20, 0,
+  10, 0, 10, 15, 33, 0, 6, 11, 0, 7,
+  9, 11, 0, 16, 0, 29, 9, 31, 0, 20,
+  48, 0, 63, 19, 21, 0, 0, 52, 14, 4,
+  22, 50, 0, 0, 0, 71, 13, 0, 0, 0,
+  0, 0, 0, 1, 0, 0, 3, 0, 0, 16,
+  0, 8, 57, 0, 8, 0, 0, 0, 0, 0,
+  20, 1, 25, 0, 15, 8, 22, 22, 74, 0,
+  0, 1, 31, 0, 0, 0, 40, 118, 28, 13,
+  44, 0, 0, 9, 37, 0, 0, 12, 0, 12,
+  0, 24, 0, 17, 2, 0, 0, 38, 0, 0,
+  0, 6, 0, 44, 0, 22, 0, 57, 17, 0,
+  18, 21, 0, 0, 25, 88, 0, 60, 0, 0,
+  0, 21, 0, 0, 0, 0, 0, 0, 0, 3,
+  13, 0, 39, 0, 0, 18, 0, 0, 44, 0,
+  0, 3, 0, 44, 27, 45, 2, 0, 52, 4,
+  48, 24, 64, 0, 0, 0, 0, 16, 0, 45,
+  3, 2, 31, 57, 0, 0, 0, 0, 0, 0,
+  0, 10, 30, 7, 17, 0, 0, 0, 33, 0,
+  43, 0, 0, 0, 30, 0, 35, 0, 54, 0,
+  0, 0, 7, 0, 3, 44, 17, 25, 0, 0,
+  33, 5, 0, 0, 79, 30, 6, 52, 69, 29,
+  0, 5, 0, 0, 0, 27, 43, 42, 0, 35,
+  0, 15, 23, 80, 17, 52, 0, 11, 0, 71,
+  0, 0, 0, 0, 79, 35, 26, 18, 0, 33,
+  18, 0, 0, 0, 0, 36, 0, 0, 12, 0,
+  0, 50, 0, 25, 11, 0, 0, 0, 34, 59,
+  45, 0, 6, 16, 27, 39, 11, 5, 0, 27,
+  0, 41, 0, 6, 0, 50, 30, 18, 19, 0,
+  0, 8, 0, 13, 0, 78, 0, 51, 3, 0,
+  0, 35, 0, 0, 32, 0, 33, 0, 0, 19,
+  0, 0, 22, 0, 0, 0, 0, 0, 41, 0,
+  0, 2, 9, 6, 34, 0, 46, 1, 49, 0,
+  0, 0, 10, 17, 54, 56, 0, 0, 20, 0,
+  5, 0, 53, 99, 5, 43, 52, 0, 0, 5,
+  28, 0, 0, 23, 0, 24, 0, 5, 0, 39,
+  8, 0, 0, 50, 0, 0, 0, 26, 0, 39,
+  0, 24, 13, 63, 23, 0, 2, 41, 6, 0,
+  11, 51, 3, 40, 0, 0, 3, 3, 2, 3,
+  0, 28, 5, 0, 0, 0, 3, 0, 53, 0,
+  0, 21, 8, 0, 22, 6, 0, 28, 0, 59,
+  6, 44, 0, 0, 63, 6, 53, 24, 33, 0,
+  0, 30, 0, 30, 0, 66, 0, 0, 0, 63,
+  0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+  20, 0, 0, 6, 0, 0, 60, 0, 0, 0,
+  34, 0, 15, 0, 39, 0, 0, 0, 0, 16,
+  49, 37, 80, 0, 0, 1, 64, 3, 2, 0,
+  54, 91, 27, 51, 45, 0, 0, 9, 23, 0,
+  0, 27, 0, 25, 0, 38, 0, 3, 12, 0,
+  0, 38, 0, 0, 0, 15, 0, 58, 0, 15,
+  0, 46, 0, 0, 33, 9, 0, 0, 4, 73,
+  21, 61, 0, 0, 0, 51, 0, 15, 0, 0,
+  0, 0, 0, 0, 58, 0, 53, 0, 0, 0,
+  0, 25, 36, 0, 0, 19, 0, 23, 49, 49,
+  13, 0, 41, 40, 36, 29, 68, 0, 0, 29,
+  0, 26, 0, 29, 0, 0, 3, 71, 0, 0,
+  0, 0, 0, 0, 0, 17, 24, 30, 27, 0,
+  0, 0, 28, 0, 19, 0, 0, 0, 24, 0,
+  70, 0, 63, 3, 0, 0, 0, 14, 0, 0,
+  35, 12, 0, 0, 40, 0, 0, 15, 31, 88,
+  14, 51, 40, 12, 0, 18, 47, 0, 19, 50,
+  3, 20, 0, 2, 0, 0, 0, 0, 0, 38,
+  7, 0, 3, 31, 0, 29, 36, 1, 0, 74,
+  29, 39, 8, 0, 0, 0, 18, 2, 39, 14,
+  0, 6, 37, 0, 0, 0, 0, 4, 5, 0,
+  0, 0, 26, 0, 49, 0, 0, 0, 3, 3,
+  17, 22, 0, 17, 0, 21, 27, 60, 0, 26,
+  24, 3, 57, 0, 52, 33, 0, 62, 14, 8,
+  23, 27, 0, 0, 26, 70, 5, 0, 0, 0,
+  0, 0, 0, 16, 0, 35, 0, 0, 0, 12,
+  0, 0, 17, 3, 26, 0, 0, 0, 20, 0,
+  35, 8, 37, 0, 24, 0, 53, 0, 32, 0,
+  0, 0, 25, 0, 0, 1, 9, 122, 15, 0,
+  27, 21, 0, 8, 41, 13, 69, 7, 0, 0,
+  0, 4, 0, 0, 0, 0, 0, 5, 0, 0,
+  0, 4, 0, 26, 14, 10, 0, 48, 14, 0,
+  0, 0, 0, 0, 37, 104, 0, 37, 0, 0,
+  9, 6, 3, 0, 0, 0, 33, 0, 50, 22,
+  0, 0, 24, 22, 0, 1, 0, 0, 27, 0,
+  0, 13, 0, 41, 14, 36, 0, 5, 48, 0,
+  45, 11, 72, 0, 0, 2, 0, 0, 0, 25,
+  0, 0, 41, 57, 0, 0, 0, 0, 0, 0,
+  0, 10, 1, 0, 35, 0, 0, 0, 51, 0,
+  55, 0, 5, 0, 0, 0, 0, 0, 28, 1,
+  16, 0, 30, 0, 17, 10, 31, 0, 0, 0,
+  35, 0, 0, 3, 12, 104, 13, 0, 18, 16,
+  0, 5, 51, 0, 33, 3, 0, 0, 0, 16,
+  0, 15, 0, 9, 0, 7, 0, 0, 0, 0,
+  0, 7, 0, 12, 0, 50, 13, 0, 0, 0,
+  0, 0, 32, 102, 0, 61, 0, 0, 22, 15,
+  0, 0, 0, 0, 29, 0, 32, 22, 10, 15,
+  12, 12, 0, 0, 0, 0, 42, 0, 0, 0,
+  0, 33, 26, 38, 0, 3, 31, 0, 30, 10,
+  63, 12, 0, 0, 0, 0, 0, 25, 23, 0,
+  69, 64, 0, 0, 2, 0, 4, 5, 0, 9,
+  49, 0, 33, 0, 0, 3, 60, 0, 68, 0,
+  0, 0, 8, 0, 0, 0, 49, 3, 11, 0,
+  0, 0, 0, 5, 36, 43, 0, 0, 0, 0,
+  0, 1, 24, 87, 0, 16, 36, 0, 0, 9,
+  34, 0, 19, 29, 0, 11, 0, 0, 0, 24,
+  7, 0, 0, 36, 0, 0, 0, 26, 0, 8,
+  20, 9, 0, 66, 26, 13, 0, 36, 0, 0,
+  2, 42, 7, 10, 0, 0, 26, 0, 0, 0,
+  0, 31, 20, 0, 10, 0, 10, 15, 33, 0,
+  6, 11, 0, 7, 9, 11, 0, 16, 0, 29,
+  9, 31, 0, 20, 48, 0, 63, 19, 21, 0,
+  0, 52, 14, 4, 22, 50, 0, 0, 0, 71,
+  13, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+  3, 0, 0, 16, 0, 8, 57, 0, 8, 0,
+  0, 0, 0, 0, 20, 1, 25, 0, 15, 8,
+  22, 22, 74, 0, 0, 1, 31, 0, 0, 0,
+  40, 118, 28, 13, 44, 0, 0, 9, 37, 0,
+  0, 12, 0, 12, 0, 24, 0, 17, 2, 0,
+  0, 38, 0, 0, 0, 6, 0, 44, 0, 22,
+  0, 57, 17, 0, 18, 21, 0, 0, 25, 88,
+  0, 60, 0, 0, 0, 21, 0, 0, 0, 0,
+  0, 0, 0, 3, 13, 0, 39, 0, 0, 18,
+  0, 0, 44, 0, 0, 3, 0, 44, 27, 45,
+  2, 0, 52, 4, 48, 24, 64, 0, 0, 0,
+  0, 16, 0, 45, 3, 2, 31, 57, 0, 0,
+  0, 0, 0, 0, 0, 10, 30, 7, 17, 0,
+  0, 0, 33, 0, 43, 0, 0, 0, 30, 0,
+  35, 0, 54, 0, 0, 0, 0, 42, 26, 36,
+  66, 0, 0, 14, 62, 8, 0, 3, 37, 89,
+  51, 42, 59, 7, 0, 10, 42, 0, 0, 21,
+  16, 33, 0, 45, 0, 0, 4, 0, 0, 27,
+  0, 0, 0, 13, 0, 62, 0, 3, 0, 70,
+  16, 0, 32, 0, 0, 0, 21, 64, 8, 79,
+  0, 0, 0, 31, 0, 20, 0, 0, 0, 0,
+  0, 0, 49, 0, 44, 0, 0, 0, 0, 2,
+  62, 0, 0, 25, 0, 37, 50, 81, 8, 1,
+  28, 19, 26, 9, 59, 14, 0, 0, 0, 31,
+  0, 46, 17, 31, 61, 56, 0, 0, 3, 0,
+  4, 0, 0, 6, 50, 28, 14, 0, 0, 0,
+  10, 0, 0, 0, 0, 0, 7, 1, 83, 0,
+  80, 2, 9, 0, 0, 0, 10, 17, 54, 56,
+  0, 0, 20, 0, 5, 0, 53, 99, 5, 43,
+  52, 0, 0, 5, 28, 0, 0, 23, 0, 24,
+  0, 5, 0, 39, 8, 0, 0, 50, 0, 0,
+  0, 26, 0, 39, 0, 24, 13, 63, 23, 0,
+  2, 41, 6, 0, 11, 51, 3, 40, 0, 0,
+  3, 3, 2, 3, 0, 28, 5, 0, 0, 0,
+  3, 0, 53, 0, 0, 21, 8, 0, 22, 6,
+  0, 28, 0, 59, 6, 44, 0, 0, 63, 6,
+  53, 24, 33, 0, 0, 30, 0, 30, 0, 66,
+  0, 0, 0, 63, 0, 0, 0, 0, 0, 0,
+  0, 1, 0, 0, 20, 0, 0, 6, 0, 0,
+  60, 0, 0, 0, 34, 0, 15, 0, 39, 0,
+  0, 0, 0, 16, 49, 37, 80, 0, 0, 1,
+  64, 3, 2, 0, 54, 91, 27, 51, 45, 0,
+  0, 9, 23, 0, 0, 27, 0, 25, 0, 38,
+  0, 3, 12, 0, 0, 38, 0, 0, 0, 15,
+  0, 58, 0, 15, 0, 46, 0, 0, 33, 9,
+  0, 0, 4, 73, 21, 61, 0, 0, 0, 51,
+  0, 15, 0, 0, 0, 0, 0, 0, 58, 0,
+  53, 0, 0, 0, 0, 25, 36, 0, 0, 19,
+  0, 23, 49, 49, 13, 0, 41, 40, 36, 29,
+  68, 0, 0, 29, 0, 26, 0, 29, 0, 0,
+  3, 71, 0, 0, 0, 0, 0, 0, 0, 17,
+  24, 30, 27, 0, 0, 0, 28, 0, 19, 0,
+  0, 0, 24, 0, 70, 0, 63, 3, 0, 0,
+  0, 17, 93, 43, 53, 0, 0, 8, 55, 26,
+  0, 0, 17, 57, 20, 55, 57, 27, 0, 29,
+  14, 0, 0, 5, 16, 11, 6, 56, 0, 0,
+  0, 0, 0, 8, 0, 0, 0, 41, 0, 41,
+  0, 0, 0, 42, 0, 5, 36, 0, 0, 0,
+  2, 40, 0, 36, 0, 0, 0, 42, 0, 17,
+  0, 0, 0, 0, 0, 0, 82, 0, 42, 17,
+  0, 0, 1, 48, 33, 0, 0, 61, 0, 0,
+  38, 68, 6, 58, 20, 52, 28, 25, 45, 0,
+  0, 24, 0, 24, 0, 8, 0, 6, 4, 57,
+  8, 0, 0, 0, 0, 2, 0, 5, 16, 36,
+  9, 0, 0, 0, 13, 0, 5, 0, 0, 0,
+  0, 0, 58, 0, 58, 12, 0, 0, 24, 0,
+  53, 0, 32, 0, 0, 0, 25, 0, 0, 1,
+  9, 122, 15, 0, 27, 21, 0, 8, 41, 13,
+  69, 7, 0, 0, 0, 4, 0, 0, 0, 0,
+  0, 5, 0, 0, 0, 4, 0, 26, 14, 10,
+  0, 48, 14, 0, 0, 0, 0, 0, 37, 104,
+  0, 37, 0, 0, 9, 6, 3, 0, 0, 0,
+  33, 0, 50, 22, 0, 0, 24, 22, 0, 1,
+  0, 0, 27, 0, 0, 13, 0, 41, 14, 36,
+  0, 5, 48, 0, 45, 11, 72, 0, 0, 2,
+  0, 0, 0, 25, 0, 0, 41, 57, 0, 0,
+  0, 0, 0, 0, 0, 10, 1, 0, 35, 0,
+  0, 0, 51, 0, 55, 0, 5, 0, 0, 0,
+  0, 0, 28, 1, 16, 0, 30, 0, 17, 10,
+  31, 0, 0, 0, 35, 0, 0, 3, 12, 104,
+  13, 0, 18, 16, 0, 5, 51, 0, 33, 3,
+  0, 0, 0, 16, 0, 15, 0, 9, 0, 7,
+  0, 0, 0, 0, 0, 7, 0, 12, 0, 50,
+  13, 0, 0, 0, 0, 0, 32, 102, 0, 61,
+  0, 0, 22, 15, 0, 0, 0, 0, 29, 0,
+  32, 22, 10, 15, 12, 12, 0, 0, 0, 0,
+  42, 0, 0, 0, 0, 33, 26, 38, 0, 3,
+  31, 0, 30, 10, 63, 12, 0, 0, 0, 0,
+  0, 25, 23, 0, 69, 64, 0, 0, 2, 0,
+  4, 5, 0, 9, 49, 0, 33, 0, 0, 3,
+  60, 0, 68, 0, 0, 0, 8, 0, 0, 0,
+  49, 3, 11, 0, 0, 22, 0, 46, 29, 0,
+  0, 10, 69, 0, 0, 23, 38, 83, 24, 20,
+  35, 2, 0, 9, 58, 0, 0, 0, 4, 48,
+  0, 23, 0, 8, 10, 0, 0, 43, 1, 0,
+  0, 4, 0, 24, 0, 21, 0, 69, 0, 0,
+  10, 17, 0, 0, 39, 72, 4, 92, 0, 0,
+  6, 27, 0, 37, 0, 0, 0, 0, 0, 8,
+  23, 24, 37, 0, 0, 3, 0, 0, 58, 0,
+  0, 14, 0, 39, 58, 70, 0, 0, 36, 5,
+  31, 21, 43, 20, 8, 4, 0, 16, 0, 28,
+  38, 0, 72, 48, 0, 0, 6, 0, 2, 0,
+  0, 22, 64, 11, 22, 0, 0, 9, 42, 0,
+  28, 0, 0, 0, 25, 29, 79, 0, 79, 5,
+  10, 0, 15, 8, 22, 22, 74, 0, 0, 1,
+  31, 0, 0, 0, 40, 118, 28, 13, 44, 0,
+  0, 9, 37, 0, 0, 12, 0, 12, 0, 24,
+  0, 17, 2, 0, 0, 38, 0, 0, 0, 6,
+  0, 44, 0, 22, 0, 57, 17, 0, 18, 21,
+  0, 0, 25, 88, 0, 60, 0, 0, 0, 21,
+  0, 0, 0, 0, 0, 0, 0, 3, 13, 0,
+  39, 0, 0, 18, 0, 0, 44, 0, 0, 3,
+  0, 44, 27, 45, 2, 0, 52, 4, 48, 24,
+  64, 0, 0, 0, 0, 16, 0, 45, 3, 2,
+  31, 57, 0, 0, 0, 0, 0, 0, 0, 10,
+  30, 7, 17, 0, 0, 0, 33, 0, 43, 0,
+  0, 0, 30, 0, 35, 0, 54, 0, 0, 0,
+  0, 42, 26, 36, 66, 0, 0, 14, 62, 8,
+  0, 3, 37, 89, 51, 42, 59, 7, 0, 10,
+  42, 0, 0, 21, 16, 33, 0, 45, 0, 0,
+  4, 0, 0, 27, 0, 0, 0, 13, 0, 62,
+  0, 3, 0, 70, 16, 0, 32, 0, 0, 0,
+  21, 64, 8, 79, 0, 0, 0, 31, 0, 20,
+  0, 0, 0, 0, 0, 0, 49, 0, 44, 0,
+  0, 0, 0, 2, 62, 0, 0, 25, 0, 37,
+  50, 81, 8, 1, 28, 19, 26, 9, 59, 14,
+  0, 0, 0, 31, 0, 46, 17, 31, 61, 56,
+  0, 0, 3, 0, 4, 0, 0, 6, 50, 28,
+  14, 0, 0, 0, 10, 0, 0, 0, 0, 0,
+  7, 1, 83, 0, 80, 2, 9, 0, 0, 25,
+  11, 47, 41, 0, 0, 5, 47, 1, 0, 16,
+  5, 75, 19, 28, 49, 26, 0, 33, 25, 0,
+  0, 0, 18, 25, 0, 34, 0, 0, 0, 0,
+  0, 42, 0, 0, 0, 16, 0, 27, 0, 0,
+  0, 56, 0, 7, 36, 0, 0, 0, 0, 20,
+  0, 61, 0, 0, 3, 18, 0, 21, 2, 0,
+  0, 0, 0, 0, 62, 6, 75, 21, 0, 0,
+  9, 9, 54, 0, 0, 53, 0, 0, 29, 74,
+  8, 11, 30, 30, 27, 34, 17, 0, 0, 29,
+  0, 0, 22, 13, 14, 0, 41, 57, 0, 6,
+  0, 0, 3, 28, 0, 7, 12, 5, 0, 0,
+  0, 6, 0, 0, 0, 0, 0, 0, 0, 0,
+  32, 0, 54, 11, 27, 0, 0, 16, 49, 37,
+  80, 0, 0, 1, 64, 3, 2, 0, 54, 91,
+  27, 51, 45, 0, 0, 9, 23, 0, 0, 27,
+  0, 25, 0, 38, 0, 3, 12, 0, 0, 38,
+  0, 0, 0, 15, 0, 58, 0, 15, 0, 46,
+  0, 0, 33, 9, 0, 0, 4, 73, 21, 61,
+  0, 0, 0, 51, 0, 15, 0, 0, 0, 0,
+  0, 0, 58, 0, 53, 0, 0, 0, 0, 25,
+  36, 0, 0, 19, 0, 23, 49, 49, 13, 0,
+  41, 40, 36, 29, 68, 0, 0, 29, 0, 26,
+  0, 29, 0, 0, 3, 71, 0, 0, 0, 0,
+  0, 0, 0, 17, 24, 30, 27, 0, 0, 0,
+  28, 0, 19, 0, 0, 0, 24, 0, 70, 0,
+  63, 3, 0, 0, 0, 17, 93, 43, 53, 0,
+  0, 8, 55, 26, 0, 0, 17, 57, 20, 55,
+  57, 27, 0, 29, 14, 0, 0, 5, 16, 11,
+  6, 56, 0, 0, 0, 0, 0, 8, 0, 0,
+  0, 41, 0, 41, 0, 0, 0, 42, 0, 5,
+  36, 0, 0, 0, 2, 40, 0, 36, 0, 0,
+  0, 42, 0, 17, 0, 0, 0, 0, 0, 0,
+  82, 0, 42, 17, 0, 0, 1, 48, 33, 0,
+  0, 61, 0, 0, 38, 68, 6, 58, 20, 52,
+  28, 25, 45, 0, 0, 24, 0, 24, 0, 8,
+  0, 6, 4, 57, 8, 0, 0, 0, 0, 2,
+  0, 5, 16, 36, 9, 0, 0, 0, 13, 0,
+  5, 0, 0, 0, 0, 0, 58, 0, 58, 12,
+  0, 0, 0, 24, 81, 40, 49, 0, 0, 0,
+  33, 2, 0, 17, 6, 77, 0, 0, 23, 56,
+  0, 52, 2, 0, 2, 1, 41, 13, 0, 29,
+  0, 0, 0, 10, 0, 43, 0, 0, 0, 63,
+  12, 17, 0, 0, 3, 48, 0, 11, 71, 0,
+  0, 0, 6, 7, 0, 21, 0, 0, 0, 19,
+  2, 14, 27, 0, 4, 0, 42, 0, 75, 3,
+  41, 71, 0, 0, 6, 9, 38, 0, 0, 42,
+  14, 0, 7, 92, 0, 60, 38, 46, 56, 57,
+  34, 0, 0, 15, 0, 1, 11, 17, 0, 0,
+  0, 26, 10, 3, 0, 0, 0, 39, 0, 3,
+  0, 23, 0, 0, 0, 14, 4, 15, 2, 36,
+  0, 0, 0, 0, 0, 0, 48, 33, 15, 0,
+  30, 0, 17, 10, 31, 0, 0, 0, 35, 0,
+  0, 3, 12, 104, 13, 0, 18, 16, 0, 5,
+  51, 0, 33, 3, 0, 0, 0, 16, 0, 15,
+  0, 9, 0, 7, 0, 0, 0, 0, 0, 7,
+  0, 12, 0, 50, 13, 0, 0, 0, 0, 0,
+  32, 102, 0, 61, 0, 0, 22, 15, 0, 0,
+  0, 0, 29, 0, 32, 22, 10, 15, 12, 12,
+  0, 0, 0, 0, 42, 0, 0, 0, 0, 33,
+  26, 38, 0, 3, 31, 0, 30, 10, 63, 12,
+  0, 0, 0, 0, 0, 25, 23, 0, 69, 64,
+  0, 0, 2, 0, 4, 5, 0, 9, 49, 0,
+  33, 0, 0, 3, 60, 0, 68, 0, 0, 0,
+  8, 0, 0, 0, 49, 3, 11, 0, 0, 22,
+  0, 46, 29, 0, 0, 10, 69, 0, 0, 23,
+  38, 83, 24, 20, 35, 2, 0, 9, 58, 0,
+  0, 0, 4, 48, 0, 23, 0, 8, 10, 0,
+  0, 43, 1, 0, 0, 4, 0, 24, 0, 21,
+  0, 69, 0, 0, 10, 17, 0, 0, 39, 72,
+  4, 92, 0, 0, 6, 27, 0, 37, 0, 0,
+  0, 0, 0, 8, 23, 24, 37, 0, 0, 3,
+  0, 0, 58, 0, 0, 14, 0, 39, 58, 70,
+  0, 0, 36, 5, 31, 21, 43, 20, 8, 4,
+  0, 16, 0, 28, 38, 0, 72, 48, 0, 0,
+  6, 0, 2, 0, 0, 22, 64, 11, 22, 0,
+  0, 9, 42, 0, 28, 0, 0, 0, 25, 29,
+  79, 0, 79, 5, 10, 0, 0, 19, 0, 49,
+  12, 0, 0, 25, 85, 2, 1, 7, 23, 85,
+  32, 34, 52, 0, 5, 0, 23, 0, 0, 0,
+  0, 25, 0, 34, 0, 0, 0, 0, 0, 25,
+  0, 0, 0, 0, 0, 23, 0, 6, 0, 46,
+  0, 0, 22, 18, 0, 0, 24, 75, 20, 83,
+  0, 0, 0, 46, 0, 19, 0, 0, 0, 0,
+  0, 30, 41, 0, 59, 0, 0, 0, 0, 12,
+  50, 0, 0, 9, 0, 32, 59, 63, 9, 0,
+  17, 31, 16, 61, 46, 0, 20, 36, 0, 0,
+  0, 9, 42, 0, 48, 63, 0, 0, 0, 0,
+  9, 0, 0, 19, 28, 6, 15, 0, 0, 0,
+  28, 0, 22, 0, 0, 0, 15, 1, 73, 0,
+  78, 3, 7, 0, 0, 42, 26, 36, 66, 0,
+  0, 14, 62, 8, 0, 3, 37, 89, 51, 42,
+  59, 7, 0, 10, 42, 0, 0, 21, 16, 33,
+  0, 45, 0, 0, 4, 0, 0, 27, 0, 0,
+  0, 13, 0, 62, 0, 3, 0, 70, 16, 0,
+  32, 0, 0, 0, 21, 64, 8, 79, 0, 0,
+  0, 31, 0, 20, 0, 0, 0, 0, 0, 0,
+  49, 0, 44, 0, 0, 0, 0, 2, 62, 0,
+  0, 25, 0, 37, 50, 81, 8, 1, 28, 19,
+  26, 9, 59, 14, 0, 0, 0, 31, 0, 46,
+  17, 31, 61, 56, 0, 0, 3, 0, 4, 0,
+  0, 6, 50, 28, 14, 0, 0, 0, 10, 0,
+  0, 0, 0, 0, 7, 1, 83, 0, 80, 2,
+  9, 0, 0, 25, 11, 47, 41, 0, 0, 5,
+  47, 1, 0, 16, 5, 75, 19, 28, 49, 26,
+  0, 33, 25, 0, 0, 0, 18, 25, 0, 34,
+  0, 0, 0, 0, 0, 42, 0, 0, 0, 16,
+  0, 27, 0, 0, 0, 56, 0, 7, 36, 0,
+  0, 0, 0, 20, 0, 61, 0, 0, 3, 18,
+  0, 21, 2, 0, 0, 0, 0, 0, 62, 6,
+  75, 21, 0, 0, 9, 9, 54, 0, 0, 53,
+  0, 0, 29, 74, 8, 11, 30, 30, 27, 34,
+  17, 0, 0, 29, 0, 0, 22, 13, 14, 0,
+  41, 57, 0, 6, 0, 0, 3, 28, 0, 7,
+  12, 5, 0, 0, 0, 6, 0, 0, 0, 0,
+  0, 0, 0, 0, 32, 0, 54, 11, 27, 0,
+  0, 0, 0, 70, 0, 0, 0, 2, 33, 0,
+  0, 0, 0, 43, 0, 6, 22, 39, 0, 28,
+  7, 0, 9, 0, 0, 0, 28, 31, 0, 0,
+  0, 0, 0, 29, 0, 0, 2, 27, 0, 0,
+  0, 0, 0, 6, 0, 5, 36, 29, 18, 0,
+  0, 0, 0, 40, 0, 15, 23, 36, 0, 10,
+  8, 17, 0, 4, 56, 0, 56, 30, 68, 85,
+  5, 0, 19, 21, 32, 0, 0, 9, 20, 0,
+  0, 41, 10, 0, 11, 39, 17, 55, 0, 0,
+  0, 81, 0, 0, 54, 0, 6, 0, 21, 50,
+  24, 33, 0, 0, 0, 40, 0, 5, 0, 0,
+  0, 0, 0, 0, 7, 0, 7, 0, 0, 0,
+  0, 0, 0, 0, 0, 21, 20, 0, 0, 17,
+  93, 43, 53, 0, 0, 8, 55, 26, 0, 0,
+  17, 57, 20, 55, 57, 27, 0, 29, 14, 0,
+  0, 5, 16, 11, 6, 56, 0, 0, 0, 0,
+  0, 8, 0, 0, 0, 41, 0, 41, 0, 0,
+  0, 42, 0, 5, 36, 0, 0, 0, 2, 40,
+  0, 36, 0, 0, 0, 42, 0, 17, 0, 0,
+  0, 0, 0, 0, 82, 0, 42, 17, 0, 0,
+  1, 48, 33, 0, 0, 61, 0, 0, 38, 68,
+  6, 58, 20, 52, 28, 25, 45, 0, 0, 24,
+  0, 24, 0, 8, 0, 6, 4, 57, 8, 0,
+  0, 0, 0, 2, 0, 5, 16, 36, 9, 0,
+  0, 0, 13, 0, 5, 0, 0, 0, 0, 0,
+  58, 0, 58, 12, 0, 0, 0, 24, 81, 40,
+  49, 0, 0, 0, 33, 2, 0, 17, 6, 77,
+  0, 0, 23, 56, 0, 52, 2, 0, 2, 1,
+  41, 13, 0, 29, 0, 0, 0, 10, 0, 43,
+  0, 0, 0, 63, 12, 17, 0, 0, 3, 48,
+  0, 11, 71, 0, 0, 0, 6, 7, 0, 21,
+  0, 0, 0, 19, 2, 14, 27, 0, 4, 0,
+  42, 0, 75, 3, 41, 71, 0, 0, 6, 9,
+  38, 0, 0, 42, 14, 0, 7, 92, 0, 60,
+  38, 46, 56, 57, 34, 0, 0, 15, 0, 1,
+  11, 17, 0, 0, 0, 26, 10, 3, 0, 0,
+  0, 39, 0, 3, 0, 23, 0, 0, 0, 14,
+  4, 15, 2, 36, 0, 0, 0, 0, 0, 0,
+  48, 33, 15, 0, 8, 39, 11, 59, 13, 4,
+  0, 0, 0, 0, 0, 12, 0, 75, 0, 0,
+  1, 65, 7, 50, 0, 0, 29, 0, 35, 15,
+  32, 17, 0, 0, 0, 20, 0, 56, 0, 0,
+  11, 51, 0, 0, 0, 0, 4, 4, 0, 24,
+  76, 35, 6, 0, 0, 0, 0, 0, 0, 0,
+  3, 20, 4, 30, 67, 17, 10, 0, 41, 0,
+  49, 47, 42, 68, 0, 0, 19, 0, 53, 0,
+  0, 1, 65, 0, 0, 87, 0, 24, 26, 31,
+  55, 42, 0, 0, 0, 24, 7, 17, 41, 0,
+  0, 12, 27, 0, 0, 75, 0, 0, 0, 65,
+  4, 0, 0, 51, 0, 13, 0, 12, 0, 43,
+  0, 36, 11, 0, 10, 5, 0, 0, 0, 42,
+  34, 0, 0, 22, 0, 46, 29, 0, 0, 10,
+  69, 0, 0, 23, 38, 83, 24, 20, 35, 2,
+  0, 9, 58, 0, 0, 0, 4, 48, 0, 23,
+  0, 8, 10, 0, 0, 43, 1, 0, 0, 4,
+  0, 24, 0, 21, 0, 69, 0, 0, 10, 17,
+  0, 0, 39, 72, 4, 92, 0, 0, 6, 27,
+  0, 37, 0, 0, 0, 0, 0, 8, 23, 24,
+  37, 0, 0, 3, 0, 0, 58, 0, 0, 14,
+  0, 39, 58, 70, 0, 0, 36, 5, 31, 21,
+  43, 20, 8, 4, 0, 16, 0, 28, 38, 0,
+  72, 48, 0, 0, 6, 0, 2, 0, 0, 22,
+  64, 11, 22, 0, 0, 9, 42, 0, 28, 0,
+  0, 0, 25, 29, 79, 0, 79, 5, 10, 0,
+  0, 19, 0, 49, 12, 0, 0, 25, 85, 2,
+  1, 7, 23, 85, 32, 34, 52, 0, 5, 0,
+  23, 0, 0, 0, 0, 25, 0, 34, 0, 0,
+  0, 0, 0, 25, 0, 0, 0, 0, 0, 23,
+  0, 6, 0, 46, 0, 0, 22, 18, 0, 0,
+  24, 75, 20, 83, 0, 0, 0, 46, 0, 19,
+  0, 0, 0, 0, 0, 30, 41, 0, 59, 0,
+  0, 0, 0, 12, 50, 0, 0, 9, 0, 32,
+  59, 63, 9, 0, 17, 31, 16, 61, 46, 0,
+  20, 36, 0, 0, 0, 9, 42, 0, 48, 63,
+  0, 0, 0, 0, 9, 0, 0, 19, 28, 6,
+  15, 0, 0, 0, 28, 0, 22, 0, 0, 0,
+  15, 1, 73, 0, 78, 3, 7, 0, 0, 4,
+  2, 46, 13, 0, 0, 32, 107, 4, 2, 0,
+  4, 83, 44, 32, 46, 4, 0, 0, 3, 0,
+  0, 10, 0, 0, 0, 35, 0, 0, 0, 0,
+  0, 15, 0, 0, 0, 0, 0, 24, 0, 0,
+  0, 32, 0, 0, 49, 17, 0, 0, 0, 80,
+  25, 73, 0, 0, 0, 50, 0, 3, 0, 0,
+  0, 0, 0, 35, 49, 0, 61, 9, 0, 0,
+  3, 17, 57, 9, 0, 0, 0, 10, 48, 46,
+  9, 0, 7, 32, 17, 79, 43, 0, 37, 35,
+  0, 0, 0, 5, 31, 0, 49, 67, 11, 1,
+  0, 0, 15, 0, 0, 19, 8, 3, 5, 0,
+  0, 0, 19, 0, 26, 0, 0, 0, 5, 0,
+  65, 0, 62, 0, 2, 0, 0, 25, 11, 47,
+  41, 0, 0, 5, 47, 1, 0, 16, 5, 75,
+  19, 28, 49, 26, 0, 33, 25, 0, 0, 0,
+  18, 25, 0, 34, 0, 0, 0, 0, 0, 42,
+  0, 0, 0, 16, 0, 27, 0, 0, 0, 56,
+  0, 7, 36, 0, 0, 0, 0, 20, 0, 61,
+  0, 0, 3, 18, 0, 21, 2, 0, 0, 0,
+  0, 0, 62, 6, 75, 21, 0, 0, 9, 9,
+  54, 0, 0, 53, 0, 0, 29, 74, 8, 11,
+  30, 30, 27, 34, 17, 0, 0, 29, 0, 0,
+  22, 13, 14, 0, 41, 57, 0, 6, 0, 0,
+  3, 28, 0, 7, 12, 5, 0, 0, 0, 6,
+  0, 0, 0, 0, 0, 0, 0, 0, 32, 0,
+  54, 11, 27, 0, 0, 0, 0, 70, 0, 0,
+  0, 2, 33, 0, 0, 0, 0, 43, 0, 6,
+  22, 39, 0, 28, 7, 0, 9, 0, 0, 0,
+  28, 31, 0, 0, 0, 0, 0, 29, 0, 0,
+  2, 27, 0, 0, 0, 0, 0, 6, 0, 5,
+  36, 29, 18, 0, 0, 0, 0, 40, 0, 15,
+  23, 36, 0, 10, 8, 17, 0, 4, 56, 0,
+  56, 30, 68, 85, 5, 0, 19, 21, 32, 0,
+  0, 9, 20, 0, 0, 41, 10, 0, 11, 39,
+  17, 55, 0, 0, 0, 81, 0, 0, 54, 0,
+  6, 0, 21, 50, 24, 33, 0, 0, 0, 40,
+  0, 5, 0, 0, 0, 0, 0, 0, 7, 0,
+  7, 0, 0, 0, 0, 0, 0, 0, 0, 21,
+  20, 0, 0, 8, 0, 102, 1, 0, 0, 14,
+  69, 27, 0, 0, 0, 1, 0, 66, 27, 37,
+  0, 17, 6, 0, 0, 0, 2, 0, 52, 58,
+  12, 0, 0, 0, 14, 27, 0, 0, 6, 45,
+  0, 0, 2, 0, 0, 11, 0, 17, 56, 34,
+  0, 0, 0, 0, 2, 38, 0, 25, 6, 68,
+  0, 37, 0, 16, 0, 2, 22, 0, 50, 18,
+  67, 47, 0, 0, 22, 50, 27, 21, 0, 3,
+  14, 0, 29, 40, 11, 0, 0, 47, 18, 59,
+  13, 0, 37, 101, 0, 22, 37, 0, 12, 0,
+  20, 34, 37, 0, 0, 0, 4, 0, 0, 14,
+  0, 6, 0, 13, 0, 0, 10, 0, 0, 0,
+  0, 0, 4, 0, 56, 0, 21, 28, 9, 0,
+  0, 24, 81, 40, 49, 0, 0, 0, 33, 2,
+  0, 17, 6, 77, 0, 0, 23, 56, 0, 52,
+  2, 0, 2, 1, 41, 13, 0, 29, 0, 0,
+  0, 10, 0, 43, 0, 0, 0, 63, 12, 17,
+  0, 0, 3, 48, 0, 11, 71, 0, 0, 0,
+  6, 7, 0, 21, 0, 0, 0, 19, 2, 14,
+  27, 0, 4, 0, 42, 0, 75, 3, 41, 71,
+  0, 0, 6, 9, 38, 0, 0, 42, 14, 0,
+  7, 92, 0, 60, 38, 46, 56, 57, 34, 0,
+  0, 15, 0, 1, 11, 17, 0, 0, 0, 26,
+  10, 3, 0, 0, 0, 39, 0, 3, 0, 23,
+  0, 0, 0, 14, 4, 15, 2, 36, 0, 0,
+  0, 0, 0, 0, 48, 33, 15, 0, 8, 39,
+  11, 59, 13, 4, 0, 0, 0, 0, 0, 12,
+  0, 75, 0, 0, 1, 65, 7, 50, 0, 0,
+  29, 0, 35, 15, 32, 17, 0, 0, 0, 20,
+  0, 56, 0, 0, 11, 51, 0, 0, 0, 0,
+  4, 4, 0, 24, 76, 35, 6, 0, 0, 0,
+  0, 0, 0, 0, 3, 20, 4, 30, 67, 17,
+  10, 0, 41, 0, 49, 47, 42, 68, 0, 0,
+  19, 0, 53, 0, 0, 1, 65, 0, 0, 87,
+  0, 24, 26, 31, 55, 42, 0, 0, 0, 24,
+  7, 17, 41, 0, 0, 12, 27, 0, 0, 75,
+  0, 0, 0, 65, 4, 0, 0, 51, 0, 13,
+  0, 12, 0, 43, 0, 36, 11, 0, 10, 5,
+  0, 0, 0, 42, 34, 0, 17, 15, 0, 79,
+  44, 0, 0, 0, 5, 0, 0, 0, 0, 55,
+  0, 0, 0, 35, 37, 28, 4, 0, 0, 0,
+  32, 0, 63, 0, 0, 0, 16, 16, 0, 50,
+  0, 12, 49, 23, 0, 0, 6, 0, 13, 0,
+  0, 14, 60, 14, 0, 0, 0, 0, 0, 1,
+  0, 30, 1, 49, 0, 8, 60, 30, 25, 6,
+  43, 0, 30, 41, 42, 56, 0, 0, 32, 5,
+  13, 0, 0, 18, 85, 0, 0, 46, 31, 7,
+  39, 35, 18, 32, 4, 0, 0, 59, 8, 21,
+  49, 0, 0, 0, 34, 1, 3, 39, 0, 0,
+  0, 65, 0, 8, 0, 14, 0, 11, 0, 5,
+  35, 42, 0, 21, 0, 9, 13, 0, 0, 0,
+  0, 31, 11, 3, 0, 19, 0, 49, 12, 0,
+  0, 25, 85, 2, 1, 7, 23, 85, 32, 34,
+  52, 0, 5, 0, 23, 0, 0, 0, 0, 25,
+  0, 34, 0, 0, 0, 0, 0, 25, 0, 0,
+  0, 0, 0, 23, 0, 6, 0, 46, 0, 0,
+  22, 18, 0, 0, 24, 75, 20, 83, 0, 0,
+  0, 46, 0, 19, 0, 0, 0, 0, 0, 30,
+  41, 0, 59, 0, 0, 0, 0, 12, 50, 0,
+  0, 9, 0, 32, 59, 63, 9, 0, 17, 31,
+  16, 61, 46, 0, 20, 36, 0, 0, 0, 9,
+  42, 0, 48, 63, 0, 0, 0, 0, 9, 0,
+  0, 19, 28, 6, 15, 0, 0, 0, 28, 0,
+  22, 0, 0, 0, 15, 1, 73, 0, 78, 3,
+  7, 0, 0, 4, 2, 46, 13, 0, 0, 32,
+  107, 4, 2, 0, 4, 83, 44, 32, 46, 4,
+  0, 0, 3, 0, 0, 10, 0, 0, 0, 35,
+  0, 0, 0, 0, 0, 15, 0, 0, 0, 0,
+  0, 24, 0, 0, 0, 32, 0, 0, 49, 17,
+  0, 0, 0, 80, 25, 73, 0, 0, 0, 50,
+  0, 3, 0, 0, 0, 0, 0, 35, 49, 0,
+  61, 9, 0, 0, 3, 17, 57, 9, 0, 0,
+  0, 10, 48, 46, 9, 0, 7, 32, 17, 79,
+  43, 0, 37, 35, 0, 0, 0, 5, 31, 0,
+  49, 67, 11, 1, 0, 0, 15, 0, 0, 19,
+  8, 3, 5, 0, 0, 0, 19, 0, 26, 0,
+  0, 0, 5, 0, 65, 0, 62, 0, 2, 0,
+  0, 37, 0, 44, 22, 0, 8, 20, 82, 0,
+  25, 11, 12, 56, 55, 36, 59, 22, 0, 12,
+  31, 0, 0, 0, 1, 27, 0, 18, 0, 0,
+  0, 0, 0, 37, 0, 0, 0, 0, 0, 14,
+  0, 0, 0, 28, 0, 0, 38, 1, 0, 0,
+  0, 23, 0, 87, 0, 0, 4, 32, 0, 38,
+  0, 0, 0, 0, 0, 27, 62, 7, 79, 0,
+  0, 0, 0, 8, 73, 0, 0, 19, 6, 1,
+  28, 74, 0, 0, 22, 50, 31, 43, 10, 0,
+  10, 37, 0, 20, 0, 33, 31, 10, 59, 36,
+  0, 0, 0, 0, 17, 0, 0, 13, 9, 1,
+  0, 0, 0, 0, 9, 0, 0, 0, 0, 0,
+  0, 23, 74, 0, 31, 0, 36, 0, 0, 0,
+  0, 70, 0, 0, 0, 2, 33, 0, 0, 0,
+  0, 43, 0, 6, 22, 39, 0, 28, 7, 0,
+  9, 0, 0, 0, 28, 31, 0, 0, 0, 0,
+  0, 29, 0, 0, 2, 27, 0, 0, 0, 0,
+  0, 6, 0, 5, 36, 29, 18, 0, 0, 0,
+  0, 40, 0, 15, 23, 36, 0, 10, 8, 17,
+  0, 4, 56, 0, 56, 30, 68, 85, 5, 0,
+  19, 21, 32, 0, 0, 9, 20, 0, 0, 41,
+  10, 0, 11, 39, 17, 55, 0, 0, 0, 81,
+  0, 0, 54, 0, 6, 0, 21, 50, 24, 33,
+  0, 0, 0, 40, 0, 5, 0, 0, 0, 0,
+  0, 0, 7, 0, 7, 0, 0, 0, 0, 0,
+  0, 0, 0, 21, 20, 0, 0, 8, 0, 102,
+  1, 0, 0, 14, 69, 27, 0, 0, 0, 1,
+  0, 66, 27, 37, 0, 17, 6, 0, 0, 0,
+  2, 0, 52, 58, 12, 0, 0, 0, 14, 27,
+  0, 0, 6, 45, 0, 0, 2, 0, 0, 11,
+  0, 17, 56, 34, 0, 0, 0, 0, 2, 38,
+  0, 25, 6, 68, 0, 37, 0, 16, 0, 2,
+  22, 0, 50, 18, 67, 47, 0, 0, 22, 50,
+  27, 21, 0, 3, 14, 0, 29, 40, 11, 0,
+  0, 47, 18, 59, 13, 0, 37, 101, 0, 22,
+  37, 0, 12, 0, 20, 34, 37, 0, 0, 0,
+  4, 0, 0, 14, 0, 6, 0, 13, 0, 0,
+  10, 0, 0, 0, 0, 0, 4, 0, 56, 0,
+  21, 28, 9, 0, 0, 56, 17, 88, 0, 0,
+  31, 9, 81, 2, 5, 0, 0, 6, 2, 91,
+  38, 27, 0, 41, 0, 0, 0, 0, 13, 0,
+  37, 42, 0, 0, 0, 2, 9, 19, 0, 0,
+  16, 37, 0, 0, 16, 0, 0, 26, 0, 16,
+  70, 3, 0, 0, 0, 0, 0, 52, 0, 0,
+  15, 62, 0, 58, 0, 17, 0, 7, 22, 0,
+  63, 23, 93, 25, 0, 0, 31, 35, 54, 3,
+  0, 8, 19, 0, 32, 63, 17, 6, 25, 64,
+  9, 35, 25, 0, 32, 85, 0, 27, 5, 0,
+  11, 0, 41, 54, 31, 0, 0, 0, 12, 3,
+  0, 31, 0, 0, 0, 17, 0, 0, 32, 0,
+  0, 0, 0, 0, 0, 0, 65, 0, 25, 16,
+  30, 0, 8, 39, 11, 59, 13, 4, 0, 0,
+  0, 0, 0, 12, 0, 75, 0, 0, 1, 65,
+  7, 50, 0, 0, 29, 0, 35, 15, 32, 17,
+  0, 0, 0, 20, 0, 56, 0, 0, 11, 51,
+  0, 0, 0, 0, 4, 4, 0, 24, 76, 35,
+  6, 0, 0, 0, 0, 0, 0, 0, 3, 20,
+  4, 30, 67, 17, 10, 0, 41, 0, 49, 47,
+  42, 68, 0, 0, 19, 0, 53, 0, 0, 1,
+  65, 0, 0, 87, 0, 24, 26, 31, 55, 42,
+  0, 0, 0, 24, 7, 17, 41, 0, 0, 12,
+  27, 0, 0, 75, 0, 0, 0, 65, 4, 0,
+  0, 51, 0, 13, 0, 12, 0, 43, 0, 36,
+  11, 0, 10, 5, 0, 0, 0, 42, 34, 0,
+  17, 15, 0, 79, 44, 0, 0, 0, 5, 0,
+  0, 0, 0, 55, 0, 0, 0, 35, 37, 28,
+  4, 0, 0, 0, 32, 0, 63, 0, 0, 0,
+  16, 16, 0, 50, 0, 12, 49, 23, 0, 0,
+  6, 0, 13, 0, 0, 14, 60, 14, 0, 0,
+  0, 0, 0, 1, 0, 30, 1, 49, 0, 8,
+  60, 30, 25, 6, 43, 0, 30, 41, 42, 56,
+  0, 0, 32, 5, 13, 0, 0, 18, 85, 0,
+  0, 46, 31, 7, 39, 35, 18, 32, 4, 0,
+  0, 59, 8, 21, 49, 0, 0, 0, 34, 1,
+  3, 39, 0, 0, 0, 65, 0, 8, 0, 14,
+  0, 11, 0, 5, 35, 42, 0, 21, 0, 9,
+  13, 0, 0, 0, 0, 31, 11, 3, 0, 52,
+  10, 53, 45, 0, 0, 0, 8, 0, 0, 0,
+  0, 74, 0, 0, 0, 0, 17, 52, 3, 0,
+  18, 7, 0, 0, 31, 0, 0, 0, 23, 43,
+  0, 29, 0, 19, 52, 39, 0, 0, 56, 0,
+  8, 9, 0, 0, 56, 49, 5, 0, 28, 0,
+  0, 0, 24, 0, 37, 43, 61, 0, 18, 41,
+  48, 0, 82, 16, 8, 42, 39, 40, 0, 0,
+  47, 0, 25, 13, 0, 0, 67, 0, 0, 21,
+  0, 18, 51, 32, 4, 15, 16, 0, 0, 74,
+  15, 0, 13, 0, 0, 0, 53, 45, 10, 84,
+  0, 0, 0, 82, 0, 44, 0, 0, 0, 0,
+  0, 19, 65, 68, 0, 14, 8, 17, 0, 0,
+  0, 0, 0, 9, 3, 4, 0, 4, 2, 46,
+  13, 0, 0, 32, 107, 4, 2, 0, 4, 83,
+  44, 32, 46, 4, 0, 0, 3, 0, 0, 10,
+  0, 0, 0, 35, 0, 0, 0, 0, 0, 15,
+  0, 0, 0, 0, 0, 24, 0, 0, 0, 32,
+  0, 0, 49, 17, 0, 0, 0, 80, 25, 73,
+  0, 0, 0, 50, 0, 3, 0, 0, 0, 0,
+  0, 35, 49, 0, 61, 9, 0, 0, 3, 17,
+  57, 9, 0, 0, 0, 10, 48, 46, 9, 0,
+  7, 32, 17, 79, 43, 0, 37, 35, 0, 0,
+  0, 5, 31, 0, 49, 67, 11, 1, 0, 0,
+  15, 0, 0, 19, 8, 3, 5, 0, 0, 0,
+  19, 0, 26, 0, 0, 0, 5, 0, 65, 0,
+  62, 0, 2, 0, 0, 37, 0, 44, 22, 0,
+  8, 20, 82, 0, 25, 11, 12, 56, 55, 36,
+  59, 22, 0, 12, 31, 0, 0, 0, 1, 27,
+  0, 18, 0, 0, 0, 0, 0, 37, 0, 0,
+  0, 0, 0, 14, 0, 0, 0, 28, 0, 0,
+  38, 1, 0, 0, 0, 23, 0, 87, 0, 0,
+  4, 32, 0, 38, 0, 0, 0, 0, 0, 27,
+  62, 7, 79, 0, 0, 0, 0, 8, 73, 0,
+  0, 19, 6, 1, 28, 74, 0, 0, 22, 50,
+  31, 43, 10, 0, 10, 37, 0, 20, 0, 33,
+  31, 10, 59, 36, 0, 0, 0, 0, 17, 0,
+  0, 13, 9, 1, 0, 0, 0, 0, 9, 0,
+  0, 0, 0, 0, 0, 23, 74, 0, 31, 0,
+  36, 0, 0, 74, 18, 48, 36, 0, 9, 0,
+  60, 0, 36, 0, 0, 63, 66, 33, 53, 1,
+  1, 40, 5, 0, 0, 0, 0, 29, 0, 0,
+  0, 0, 0, 0, 0, 33, 0, 0, 0, 0,
+  0, 13, 0, 0, 0, 7, 0, 0, 40, 19,
+  0, 0, 0, 0, 0, 107, 0, 0, 12, 52,
+  0, 31, 0, 27, 0, 0, 0, 19, 66, 8,
+  85, 0, 0, 0, 0, 0, 65, 0, 0, 12,
+  15, 13, 23, 55, 0, 0, 38, 70, 22, 57,
+  6, 0, 10, 41, 0, 20, 0, 27, 34, 9,
+  25, 65, 0, 0, 0, 0, 11, 0, 0, 0,
+  15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 46, 0, 22, 0, 42, 0,
+  0, 8, 0, 102, 1, 0, 0, 14, 69, 27,
+  0, 0, 0, 1, 0, 66, 27, 37, 0, 17,
+  6, 0, 0, 0, 2, 0, 52, 58, 12, 0,
+  0, 0, 14, 27, 0, 0, 6, 45, 0, 0,
+  2, 0, 0, 11, 0, 17, 56, 34, 0, 0,
+  0, 0, 2, 38, 0, 25, 6, 68, 0, 37,
+  0, 16, 0, 2, 22, 0, 50, 18, 67, 47,
+  0, 0, 22, 50, 27, 21, 0, 3, 14, 0,
+  29, 40, 11, 0, 0, 47, 18, 59, 13, 0,
+  37, 101, 0, 22, 37, 0, 12, 0, 20, 34,
+  37, 0, 0, 0, 4, 0, 0, 14, 0, 6,
+  0, 13, 0, 0, 10, 0, 0, 0, 0, 0,
+  4, 0, 56, 0, 21, 28, 9, 0, 0, 56,
+  17, 88, 0, 0, 31, 9, 81, 2, 5, 0,
+  0, 6, 2, 91, 38, 27, 0, 41, 0, 0,
+  0, 0, 13, 0, 37, 42, 0, 0, 0, 2,
+  9, 19, 0, 0, 16, 37, 0, 0, 16, 0,
+  0, 26, 0, 16, 70, 3, 0, 0, 0, 0,
+  0, 52, 0, 0, 15, 62, 0, 58, 0, 17,
+  0, 7, 22, 0, 63, 23, 93, 25, 0, 0,
+  31, 35, 54, 3, 0, 8, 19, 0, 32, 63,
+  17, 6, 25, 64, 9, 35, 25, 0, 32, 85,
+  0, 27, 5, 0, 11, 0, 41, 54, 31, 0,
+  0, 0, 12, 3, 0, 31, 0, 0, 0, 17,
+  0, 0, 32, 0, 0, 0, 0, 0, 0, 0,
+  65, 0, 25, 16, 30, 0, 0, 28, 8, 32,
+  27, 0, 2, 0, 68, 0, 19, 0, 0, 42,
+  7, 49, 43, 15, 20, 47, 0, 0, 0, 0,
+  0, 0, 3, 32, 0, 0, 0, 6, 4, 23,
+  0, 12, 7, 21, 0, 0, 2, 0, 0, 18,
+  0, 11, 54, 50, 0, 0, 0, 0, 0, 40,
+  0, 0, 45, 53, 0, 11, 0, 42, 0, 0,
+  22, 4, 38, 14, 110, 11, 16, 0, 30, 15,
+  57, 0, 0, 0, 2, 0, 0, 18, 21, 0,
+  59, 45, 0, 63, 2, 0, 3, 85, 0, 10,
+  16, 0, 9, 0, 31, 80, 7, 29, 0, 0,
+  22, 22, 0, 19, 0, 0, 0, 25, 0, 0,
+  16, 0, 0, 0, 0, 0, 0, 0, 11, 0,
+  0, 5, 46, 8, 17, 15, 0, 79, 44, 0,
+  0, 0, 5, 0, 0, 0, 0, 55, 0, 0,
+  0, 35, 37, 28, 4, 0, 0, 0, 32, 0,
+  63, 0, 0, 0, 16, 16, 0, 50, 0, 12,
+  49, 23, 0, 0, 6, 0, 13, 0, 0, 14,
+  60, 14, 0, 0, 0, 0, 0, 1, 0, 30,
+  1, 49, 0, 8, 60, 30, 25, 6, 43, 0,
+  30, 41, 42, 56, 0, 0, 32, 5, 13, 0,
+  0, 18, 85, 0, 0, 46, 31, 7, 39, 35,
+  18, 32, 4, 0, 0, 59, 8, 21, 49, 0,
+  0, 0, 34, 1, 3, 39, 0, 0, 0, 65,
+  0, 8, 0, 14, 0, 11, 0, 5, 35, 42,
+  0, 21, 0, 9, 13, 0, 0, 0, 0, 31,
+  11, 3, 0, 52, 10, 53, 45, 0, 0, 0,
+  8, 0, 0, 0, 0, 74, 0, 0, 0, 0,
+  17, 52, 3, 0, 18, 7, 0, 0, 31, 0,
+  0, 0, 23, 43, 0, 29, 0, 19, 52, 39,
+  0, 0, 56, 0, 8, 9, 0, 0, 56, 49,
+  5, 0, 28, 0, 0, 0, 24, 0, 37, 43,
+  61, 0, 18, 41, 48, 0, 82, 16, 8, 42,
+  39, 40, 0, 0, 47, 0, 25, 13, 0, 0,
+  67, 0, 0, 21, 0, 18, 51, 32, 4, 15,
+  16, 0, 0, 74, 15, 0, 13, 0, 0, 0,
+  53, 45, 10, 84, 0, 0, 0, 82, 0, 44,
+  0, 0, 0, 0, 0, 19, 65, 68, 0, 14,
+  8, 17, 0, 0, 0, 0, 0, 9, 3, 4,
+  0, 23, 27, 4, 12, 35, 0, 0, 0, 0,
+  7, 0, 0, 120, 0, 0, 0, 0, 0, 71,
+  1, 19, 66, 22, 0, 0, 0, 5, 0, 8,
+  4, 39, 0, 29, 0, 44, 65, 31, 0, 0,
+  54, 58, 0, 12, 0, 0, 47, 155, 11, 0,
+  50, 0, 0, 0, 45, 0, 62, 10, 71, 0,
+  0, 39, 35, 0, 91, 27, 0, 65, 34, 36,
+  0, 34, 14, 0, 51, 0, 0, 0, 19, 4,
+  0, 0, 14, 6, 95, 9, 0, 30, 0, 0,
+  0, 23, 0, 0, 8, 0, 0, 0, 51, 94,
+  0, 92, 0, 0, 16, 61, 0, 33, 0, 0,
+  0, 0, 0, 0, 47, 97, 0, 7, 27, 0,
+  4, 0, 0, 0, 0, 0, 0, 77, 0, 37,
+  0, 44, 22, 0, 8, 20, 82, 0, 25, 11,
+  12, 56, 55, 36, 59, 22, 0, 12, 31, 0,
+  0, 0, 1, 27, 0, 18, 0, 0, 0, 0,
+  0, 37, 0, 0, 0, 0, 0, 14, 0, 0,
+  0, 28, 0, 0, 38, 1, 0, 0, 0, 23,
+  0, 87, 0, 0, 4, 32, 0, 38, 0, 0,
+  0, 0, 0, 27, 62, 7, 79, 0, 0, 0,
+  0, 8, 73, 0, 0, 19, 6, 1, 28, 74,
+  0, 0, 22, 50, 31, 43, 10, 0, 10, 37,
+  0, 20, 0, 33, 31, 10, 59, 36, 0, 0,
+  0, 0, 17, 0, 0, 13, 9, 1, 0, 0,
+  0, 0, 9, 0, 0, 0, 0, 0, 0, 23,
+  74, 0, 31, 0, 36, 0, 0, 74, 18, 48,
+  36, 0, 9, 0, 60, 0, 36, 0, 0, 63,
+  66, 33, 53, 1, 1, 40, 5, 0, 0, 0,
+  0, 29, 0, 0, 0, 0, 0, 0, 0, 33,
+  0, 0, 0, 0, 0, 13, 0, 0, 0, 7,
+  0, 0, 40, 19, 0, 0, 0, 0, 0, 107,
+  0, 0, 12, 52, 0, 31, 0, 27, 0, 0,
+  0, 19, 66, 8, 85, 0, 0, 0, 0, 0,
+  65, 0, 0, 12, 15, 13, 23, 55, 0, 0,
+  38, 70, 22, 57, 6, 0, 10, 41, 0, 20,
+  0, 27, 34, 9, 25, 65, 0, 0, 0, 0,
+  11, 0, 0, 0, 15, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 46, 0,
+  22, 0, 42, 0, 0, 120, 19, 74, 27, 0,
+  31, 0, 61, 0, 8, 0, 21, 27, 26, 43,
+  32, 22, 11, 48, 0, 0, 11, 13, 20, 2,
+  39, 1, 0, 0, 0, 0, 45, 5, 15, 2,
+  0, 0, 0, 0, 0, 0, 0, 21, 0, 27,
+  87, 36, 0, 0, 16, 0, 0, 39, 0, 0,
+  30, 0, 0, 50, 0, 22, 0, 0, 0, 0,
+  32, 15, 38, 0, 0, 0, 27, 0, 82, 16,
+  0, 44, 0, 0, 23, 10, 32, 10, 15, 51,
+  24, 38, 8, 39, 22, 24, 0, 47, 0, 0,
+  15, 0, 42, 41, 18, 5, 0, 0, 5, 0,
+  39, 13, 35, 22, 0, 0, 0, 45, 0, 0,
+  0, 0, 9, 0, 0, 0, 49, 0, 6, 0,
+  21, 9, 0, 56, 17, 88, 0, 0, 31, 9,
+  81, 2, 5, 0, 0, 6, 2, 91, 38, 27,
+  0, 41, 0, 0, 0, 0, 13, 0, 37, 42,
+  0, 0, 0, 2, 9, 19, 0, 0, 16, 37,
+  0, 0, 16, 0, 0, 26, 0, 16, 70, 3,
+  0, 0, 0, 0, 0, 52, 0, 0, 15, 62,
+  0, 58, 0, 17, 0, 7, 22, 0, 63, 23,
+  93, 25, 0, 0, 31, 35, 54, 3, 0, 8,
+  19, 0, 32, 63, 17, 6, 25, 64, 9, 35,
+  25, 0, 32, 85, 0, 27, 5, 0, 11, 0,
+  41, 54, 31, 0, 0, 0, 12, 3, 0, 31,
+  0, 0, 0, 17, 0, 0, 32, 0, 0, 0,
+  0, 0, 0, 0, 65, 0, 25, 16, 30, 0,
+  0, 28, 8, 32, 27, 0, 2, 0, 68, 0,
+  19, 0, 0, 42, 7, 49, 43, 15, 20, 47,
+  0, 0, 0, 0, 0, 0, 3, 32, 0, 0,
+  0, 6, 4, 23, 0, 12, 7, 21, 0, 0,
+  2, 0, 0, 18, 0, 11, 54, 50, 0, 0,
+  0, 0, 0, 40, 0, 0, 45, 53, 0, 11,
+  0, 42, 0, 0, 22, 4, 38, 14, 110, 11,
+  16, 0, 30, 15, 57, 0, 0, 0, 2, 0,
+  0, 18, 21, 0, 59, 45, 0, 63, 2, 0,
+  3, 85, 0, 10, 16, 0, 9, 0, 31, 80,
+  7, 29, 0, 0, 22, 22, 0, 19, 0, 0,
+  0, 25, 0, 0, 16, 0, 0, 0, 0, 0,
+  0, 0, 11, 0, 0, 5, 46, 8, 7, 49,
+  61, 23, 56, 0, 23, 0, 71, 0, 0, 0,
+  14, 98, 16, 58, 20, 15, 28, 30, 7, 0,
+  10, 8, 0, 0, 0, 49, 0, 0, 0, 0,
+  0, 27, 0, 0, 0, 0, 0, 0, 17, 10,
+  0, 57, 0, 0, 54, 50, 0, 0, 31, 38,
+  0, 36, 0, 0, 23, 53, 0, 29, 0, 9,
+  0, 0, 24, 18, 14, 0, 53, 0, 0, 0,
+  18, 6, 59, 0, 0, 0, 0, 0, 21, 44,
+  0, 0, 68, 38, 3, 47, 64, 0, 0, 40,
+  0, 20, 0, 9, 7, 0, 28, 55, 0, 0,
+  1, 0, 35, 0, 0, 37, 14, 0, 22, 0,
+  0, 15, 86, 0, 0, 0, 20, 0, 12, 0,
+  13, 0, 9, 8, 46, 0, 0, 52, 10, 53,
+  45, 0, 0, 0, 8, 0, 0, 0, 0, 74,
+  0, 0, 0, 0, 17, 52, 3, 0, 18, 7,
+  0, 0, 31, 0, 0, 0, 23, 43, 0, 29,
+  0, 19, 52, 39, 0, 0, 56, 0, 8, 9,
+  0, 0, 56, 49, 5, 0, 28, 0, 0, 0,
+  24, 0, 37, 43, 61, 0, 18, 41, 48, 0,
+  82, 16, 8, 42, 39, 40, 0, 0, 47, 0,
+  25, 13, 0, 0, 67, 0, 0, 21, 0, 18,
+  51, 32, 4, 15, 16, 0, 0, 74, 15, 0,
+  13, 0, 0, 0, 53, 45, 10, 84, 0, 0,
+  0, 82, 0, 44, 0, 0, 0, 0, 0, 19,
+  65, 68, 0, 14, 8, 17, 0, 0, 0, 0,
+  0, 9, 3, 4, 0, 23, 27, 4, 12, 35,
+  0, 0, 0, 0, 7, 0, 0, 120, 0, 0,
+  0, 0, 0, 71, 1, 19, 66, 22, 0, 0,
+  0, 5, 0, 8, 4, 39, 0, 29, 0, 44,
+  65, 31, 0, 0, 54, 58, 0, 12, 0, 0,
+  47, 155, 11, 0, 50, 0, 0, 0, 45, 0,
+  62, 10, 71, 0, 0, 39, 35, 0, 91, 27,
+  0, 65, 34, 36, 0, 34, 14, 0, 51, 0,
+  0, 0, 19, 4, 0, 0, 14, 6, 95, 9,
+  0, 30, 0, 0, 0, 23, 0, 0, 8, 0,
+  0, 0, 51, 94, 0, 92, 0, 0, 16, 61,
+  0, 33, 0, 0, 0, 0, 0, 0, 47, 97,
+  0, 7, 27, 0, 4, 0, 0, 0, 0, 0,
+  0, 77, 45, 0, 33, 19, 45, 9, 0, 0,
+  4, 0, 2, 0, 45, 137, 0, 0, 0, 2,
+  10, 33, 44, 5, 15, 24, 0, 0, 11, 35,
+  0, 0, 0, 12, 0, 13, 0, 1, 6, 12,
+  0, 0, 8, 68, 0, 25, 0, 0, 28, 111,
+  8, 0, 44, 66, 0, 5, 0, 0, 15, 16,
+  0, 6, 0, 0, 27, 0, 53, 12, 0, 7,
+  33, 35, 0, 38, 0, 0, 31, 0, 0, 0,
+  0, 40, 0, 23, 24, 0, 54, 8, 0, 37,
+  61, 0, 0, 16, 0, 0, 0, 0, 30, 0,
+  25, 59, 0, 21, 4, 0, 13, 17, 0, 39,
+  33, 0, 20, 0, 0, 1, 63, 23, 29, 0,
+  0, 0, 72, 0, 0, 0, 0, 0, 0, 50,
+  0, 74, 18, 48, 36, 0, 9, 0, 60, 0,
+  36, 0, 0, 63, 66, 33, 53, 1, 1, 40,
+  5, 0, 0, 0, 0, 29, 0, 0, 0, 0,
+  0, 0, 0, 33, 0, 0, 0, 0, 0, 13,
+  0, 0, 0, 7, 0, 0, 40, 19, 0, 0,
+  0, 0, 0, 107, 0, 0, 12, 52, 0, 31,
+  0, 27, 0, 0, 0, 19, 66, 8, 85, 0,
+  0, 0, 0, 0, 65, 0, 0, 12, 15, 13,
+  23, 55, 0, 0, 38, 70, 22, 57, 6, 0,
+  10, 41, 0, 20, 0, 27, 34, 9, 25, 65,
+  0, 0, 0, 0, 11, 0, 0, 0, 15, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 46, 0, 22, 0, 42, 0, 0, 120,
+  19, 74, 27, 0, 31, 0, 61, 0, 8, 0,
+  21, 27, 26, 43, 32, 22, 11, 48, 0, 0,
+  11, 13, 20, 2, 39, 1, 0, 0, 0, 0,
+  45, 5, 15, 2, 0, 0, 0, 0, 0, 0,
+  0, 21, 0, 27, 87, 36, 0, 0, 16, 0,
+  0, 39, 0, 0, 30, 0, 0, 50, 0, 22,
+  0, 0, 0, 0, 32, 15, 38, 0, 0, 0,
+  27, 0, 82, 16, 0, 44, 0, 0, 23, 10,
+  32, 10, 15, 51, 24, 38, 8, 39, 22, 24,
+  0, 47, 0, 0, 15, 0, 42, 41, 18, 5,
+  0, 0, 5, 0, 39, 13, 35, 22, 0, 0,
+  0, 45, 0, 0, 0, 0, 9, 0, 0, 0,
+  49, 0, 6, 0, 21, 9, 64, 56, 7, 47,
+  47, 23, 0, 2, 27, 0, 0, 0, 42, 8,
+  0, 3, 0, 0, 56, 18, 0, 16, 26, 0,
+  2, 0, 57, 0, 1, 54, 0, 27, 23, 0,
+  74, 44, 54, 0, 12, 0, 0, 9, 0, 16,
+  14, 30, 64, 22, 0, 0, 0, 0, 0, 18,
+  39, 0, 31, 0, 0, 0, 0, 41, 29, 0,
+  11, 5, 0, 39, 0, 10, 75, 0, 74, 0,
+  24, 4, 0, 36, 30, 0, 0, 0, 49, 39,
+  40, 0, 0, 51, 36, 6, 0, 6, 0, 16,
+  0, 0, 38, 0, 41, 42, 30, 45, 15, 0,
+  0, 0, 5, 61, 41, 0, 5, 11, 0, 65,
+  38, 0, 0, 0, 29, 0, 0, 0, 0, 0,
+  0, 0, 8, 29, 0, 28, 8, 32, 27, 0,
+  2, 0, 68, 0, 19, 0, 0, 42, 7, 49,
+  43, 15, 20, 47, 0, 0, 0, 0, 0, 0,
+  3, 32, 0, 0, 0, 6, 4, 23, 0, 12,
+  7, 21, 0, 0, 2, 0, 0, 18, 0, 11,
+  54, 50, 0, 0, 0, 0, 0, 40, 0, 0,
+  45, 53, 0, 11, 0, 42, 0, 0, 22, 4,
+  38, 14, 110, 11, 16, 0, 30, 15, 57, 0,
+  0, 0, 2, 0, 0, 18, 21, 0, 59, 45,
+  0, 63, 2, 0, 3, 85, 0, 10, 16, 0,
+  9, 0, 31, 80, 7, 29, 0, 0, 22, 22,
+  0, 19, 0, 0, 0, 25, 0, 0, 16, 0,
+  0, 0, 0, 0, 0, 0, 11, 0, 0, 5,
+  46, 8, 7, 49, 61, 23, 56, 0, 23, 0,
+  71, 0, 0, 0, 14, 98, 16, 58, 20, 15,
+  28, 30, 7, 0, 10, 8, 0, 0, 0, 49,
+  0, 0, 0, 0, 0, 27, 0, 0, 0, 0,
+  0, 0, 17, 10, 0, 57, 0, 0, 54, 50,
+  0, 0, 31, 38, 0, 36, 0, 0, 23, 53,
+  0, 29, 0, 9, 0, 0, 24, 18, 14, 0,
+  53, 0, 0, 0, 18, 6, 59, 0, 0, 0,
+  0, 0, 21, 44, 0, 0, 68, 38, 3, 47,
+  64, 0, 0, 40, 0, 20, 0, 9, 7, 0,
+  28, 55, 0, 0, 1, 0, 35, 0, 0, 37,
+  14, 0, 22, 0, 0, 15, 86, 0, 0, 0,
+  20, 0, 12, 0, 13, 0, 9, 8, 46, 0,
+  51, 65, 87, 26, 42, 0, 0, 0, 24, 1,
+  1, 1, 40, 128, 0, 10, 0, 0, 20, 34,
+  11, 2, 7, 22, 0, 0, 0, 18, 0, 18,
+  19, 8, 0, 36, 8, 0, 36, 0, 0, 0,
+  19, 59, 0, 24, 0, 0, 22, 33, 0, 0,
+  46, 60, 0, 37, 0, 0, 0, 36, 0, 23,
+  0, 0, 20, 0, 14, 43, 0, 0, 6, 10,
+  0, 33, 9, 0, 41, 0, 0, 0, 32, 7,
+  0, 63, 13, 0, 60, 24, 16, 45, 93, 12,
+  0, 0, 0, 1, 0, 0, 27, 0, 35, 36,
+  0, 2, 17, 0, 23, 17, 0, 42, 39, 0,
+  25, 0, 0, 19, 110, 2, 0, 0, 0, 0,
+  14, 0, 0, 0, 0, 15, 6, 19, 0, 23,
+  27, 4, 12, 35, 0, 0, 0, 0, 7, 0,
+  0, 120, 0, 0, 0, 0, 0, 71, 1, 19,
+  66, 22, 0, 0, 0, 5, 0, 8, 4, 39,
+  0, 29, 0, 44, 65, 31, 0, 0, 54, 58,
+  0, 12, 0, 0, 47, 155, 11, 0, 50, 0,
+  0, 0, 45, 0, 62, 10, 71, 0, 0, 39,
+  35, 0, 91, 27, 0, 65, 34, 36, 0, 34,
+  14, 0, 51, 0, 0, 0, 19, 4, 0, 0,
+  14, 6, 95, 9, 0, 30, 0, 0, 0, 23,
+  0, 0, 8, 0, 0, 0, 51, 94, 0, 92,
+  0, 0, 16, 61, 0, 33, 0, 0, 0, 0,
+  0, 0, 47, 97, 0, 7, 27, 0, 4, 0,
+  0, 0, 0, 0, 0, 77, 45, 0, 33, 19,
+  45, 9, 0, 0, 4, 0, 2, 0, 45, 137,
+  0, 0, 0, 2, 10, 33, 44, 5, 15, 24,
+  0, 0, 11, 35, 0, 0, 0, 12, 0, 13,
+  0, 1, 6, 12, 0, 0, 8, 68, 0, 25,
+  0, 0, 28, 111, 8, 0, 44, 66, 0, 5,
+  0, 0, 15, 16, 0, 6, 0, 0, 27, 0,
+  53, 12, 0, 7, 33, 35, 0, 38, 0, 0,
+  31, 0, 0, 0, 0, 40, 0, 23, 24, 0,
+  54, 8, 0, 37, 61, 0, 0, 16, 0, 0,
+  0, 0, 30, 0, 25, 59, 0, 21, 4, 0,
+  13, 17, 0, 39, 33, 0, 20, 0, 0, 1,
+  63, 23, 29, 0, 0, 0, 72, 0, 0, 0,
+  0, 0, 0, 50, 46, 31, 46, 68, 33, 0,
+  0, 0, 66, 0, 8, 9, 61, 76, 4, 9,
+  2, 0, 9, 16, 52, 0, 0, 39, 0, 0,
+  46, 32, 0, 0, 28, 0, 0, 0, 1, 0,
+  0, 0, 0, 0, 0, 77, 0, 9, 0, 0,
+  10, 32, 0, 0, 39, 72, 0, 16, 9, 0,
+  2, 31, 0, 8, 0, 0, 0, 4, 0, 26,
+  19, 0, 10, 7, 0, 32, 9, 31, 6, 0,
+  0, 38, 0, 38, 15, 46, 46, 0, 9, 55,
+  0, 11, 92, 0, 0, 0, 0, 12, 0, 0,
+  74, 0, 27, 39, 0, 0, 0, 0, 18, 45,
+  0, 35, 42, 11, 31, 0, 15, 0, 62, 0,
+  3, 0, 0, 6, 60, 0, 0, 0, 0, 12,
+  0, 66, 0, 120, 19, 74, 27, 0, 31, 0,
+  61, 0, 8, 0, 21, 27, 26, 43, 32, 22,
+  11, 48, 0, 0, 11, 13, 20, 2, 39, 1,
+  0, 0, 0, 0, 45, 5, 15, 2, 0, 0,
+  0, 0, 0, 0, 0, 21, 0, 27, 87, 36,
+  0, 0, 16, 0, 0, 39, 0, 0, 30, 0,
+  0, 50, 0, 22, 0, 0, 0, 0, 32, 15,
+  38, 0, 0, 0, 27, 0, 82, 16, 0, 44,
+  0, 0, 23, 10, 32, 10, 15, 51, 24, 38,
+  8, 39, 22, 24, 0, 47, 0, 0, 15, 0,
+  42, 41, 18, 5, 0, 0, 5, 0, 39, 13,
+  35, 22, 0, 0, 0, 45, 0, 0, 0, 0,
+  9, 0, 0, 0, 49, 0, 6, 0, 21, 9,
+  64, 56, 7, 47, 47, 23, 0, 2, 27, 0,
+  0, 0, 42, 8, 0, 3, 0, 0, 56, 18,
+  0, 16, 26, 0, 2, 0, 57, 0, 1, 54,
+  0, 27, 23, 0, 74, 44, 54, 0, 12, 0,
+  0, 9, 0, 16, 14, 30, 64, 22, 0, 0,
+  0, 0, 0, 18, 39, 0, 31, 0, 0, 0,
+  0, 41, 29, 0, 11, 5, 0, 39, 0, 10,
+  75, 0, 74, 0, 24, 4, 0, 36, 30, 0,
+  0, 0, 49, 39, 40, 0, 0, 51, 36, 6,
+  0, 6, 0, 16, 0, 0, 38, 0, 41, 42,
+  30, 45, 15, 0, 0, 0, 5, 61, 41, 0,
+  5, 11, 0, 65, 38, 0, 0, 0, 29, 0,
+  0, 0, 0, 0, 0, 0, 8, 29, 59, 0,
+  21, 13, 0, 41, 0, 2, 0, 43, 0, 19,
+  0, 48, 0, 0, 0, 0, 56, 0, 3, 89,
+  5, 0, 0, 0, 21, 5, 0, 99, 0, 11,
+  0, 0, 67, 44, 117, 91, 15, 0, 39, 0,
+  3, 0, 0, 12, 0, 18, 5, 1, 0, 35,
+  0, 23, 119, 0, 0, 4, 0, 0, 0, 65,
+  91, 49, 82, 33, 0, 21, 0, 118, 80, 20,
+  83, 0, 0, 0, 0, 0, 100, 0, 0, 0,
+  15, 22, 26, 0, 0, 49, 63, 0, 0, 18,
+  0, 0, 55, 0, 41, 0, 0, 54, 58, 26,
+  28, 0, 0, 0, 0, 29, 0, 0, 19, 18,
+  0, 23, 56, 7, 0, 0, 19, 0, 0, 0,
+  0, 0, 0, 24, 61, 73, 7, 49, 61, 23,
+  56, 0, 23, 0, 71, 0, 0, 0, 14, 98,
+  16, 58, 20, 15, 28, 30, 7, 0, 10, 8,
+  0, 0, 0, 49, 0, 0, 0, 0, 0, 27,
+  0, 0, 0, 0, 0, 0, 17, 10, 0, 57,
+  0, 0, 54, 50, 0, 0, 31, 38, 0, 36,
+  0, 0, 23, 53, 0, 29, 0, 9, 0, 0,
+  24, 18, 14, 0, 53, 0, 0, 0, 18, 6,
+  59, 0, 0, 0, 0, 0, 21, 44, 0, 0,
+  68, 38, 3, 47, 64, 0, 0, 40, 0, 20,
+  0, 9, 7, 0, 28, 55, 0, 0, 1, 0,
+  35, 0, 0, 37, 14, 0, 22, 0, 0, 15,
+  86, 0, 0, 0, 20, 0, 12, 0, 13, 0,
+  9, 8, 46, 0, 51, 65, 87, 26, 42, 0,
+  0, 0, 24, 1, 1, 1, 40, 128, 0, 10,
+  0, 0, 20, 34, 11, 2, 7, 22, 0, 0,
+  0, 18, 0, 18, 19, 8, 0, 36, 8, 0,
+  36, 0, 0, 0, 19, 59, 0, 24, 0, 0,
+  22, 33, 0, 0, 46, 60, 0, 37, 0, 0,
+  0, 36, 0, 23, 0, 0, 20, 0, 14, 43,
+  0, 0, 6, 10, 0, 33, 9, 0, 41, 0,
+  0, 0, 32, 7, 0, 63, 13, 0, 60, 24,
+  16, 45, 93, 12, 0, 0, 0, 1, 0, 0,
+  27, 0, 35, 36, 0, 2, 17, 0, 23, 17,
+  0, 42, 39, 0, 25, 0, 0, 19, 110, 2,
+  0, 0, 0, 0, 14, 0, 0, 0, 0, 15,
+  6, 19, 58, 29, 70, 32, 22, 7, 0, 0,
+  38, 0, 7, 32, 60, 93, 0, 0, 0, 0,
+  38, 0, 64, 26, 0, 33, 0, 0, 30, 14,
+  0, 67, 47, 0, 0, 0, 6, 0, 43, 9,
+  0, 0, 0, 21, 0, 0, 0, 0, 0, 24,
+  0, 6, 13, 86, 0, 24, 27, 0, 0, 48,
+  0, 0, 0, 0, 12, 26, 3, 21, 0, 0,
+  0, 30, 0, 44, 10, 2, 0, 0, 0, 0,
+  48, 0, 0, 39, 61, 0, 1, 12, 0, 35,
+  123, 0, 0, 0, 0, 0, 0, 0, 63, 0,
+  17, 39, 26, 0, 0, 0, 0, 26, 0, 33,
+  42, 10, 39, 0, 4, 0, 83, 0, 0, 0,
+  0, 28, 67, 0, 0, 0, 0, 33, 0, 82,
+  45, 0, 33, 19, 45, 9, 0, 0, 4, 0,
+  2, 0, 45, 137, 0, 0, 0, 2, 10, 33,
+  44, 5, 15, 24, 0, 0, 11, 35, 0, 0,
+  0, 12, 0, 13, 0, 1, 6, 12, 0, 0,
+  8, 68, 0, 25, 0, 0, 28, 111, 8, 0,
+  44, 66, 0, 5, 0, 0, 15, 16, 0, 6,
+  0, 0, 27, 0, 53, 12, 0, 7, 33, 35,
+  0, 38, 0, 0, 31, 0, 0, 0, 0, 40,
+  0, 23, 24, 0, 54, 8, 0, 37, 61, 0,
+  0, 16, 0, 0, 0, 0, 30, 0, 25, 59,
+  0, 21, 4, 0, 13, 17, 0, 39, 33, 0,
+  20, 0, 0, 1, 63, 23, 29, 0, 0, 0,
+  72, 0, 0, 0, 0, 0, 0, 50, 46, 31,
+  46, 68, 33, 0, 0, 0, 66, 0, 8, 9,
+  61, 76, 4, 9, 2, 0, 9, 16, 52, 0,
+  0, 39, 0, 0, 46, 32, 0, 0, 28, 0,
+  0, 0, 1, 0, 0, 0, 0, 0, 0, 77,
+  0, 9, 0, 0, 10, 32, 0, 0, 39, 72,
+  0, 16, 9, 0, 2, 31, 0, 8, 0, 0,
+  0, 4, 0, 26, 19, 0, 10, 7, 0, 32,
+  9, 31, 6, 0, 0, 38, 0, 38, 15, 46,
+  46, 0, 9, 55, 0, 11, 92, 0, 0, 0,
+  0, 12, 0, 0, 74, 0, 27, 39, 0, 0,
+  0, 0, 18, 45, 0, 35, 42, 11, 31, 0,
+  15, 0, 62, 0, 3, 0, 0, 6, 60, 0,
+  0, 0, 0, 12, 0, 66, 23, 5, 71, 73,
+  1, 0, 0, 8, 79, 0, 18, 35, 49, 54,
+  0, 0, 0, 6, 44, 0, 41, 8, 0, 24,
+  0, 0, 55, 8, 0, 0, 32, 0, 5, 0,
+  0, 0, 12, 0, 0, 0, 0, 38, 0, 0,
+  0, 8, 0, 0, 0, 0, 32, 89, 0, 0,
+  52, 0, 19, 21, 0, 9, 0, 0, 0, 30,
+  3, 0, 40, 0, 15, 64, 0, 0, 41, 76,
+  0, 0, 9, 58, 0, 26, 12, 24, 95, 17,
+  0, 70, 0, 25, 100, 0, 27, 15, 0, 0,
+  8, 0, 68, 0, 16, 62, 13, 0, 0, 0,
+  0, 91, 0, 16, 1, 6, 23, 0, 3, 0,
+  73, 0, 19, 0, 0, 35, 21, 0, 0, 0,
+  0, 16, 0, 69, 64, 56, 7, 47, 47, 23,
+  0, 2, 27, 0, 0, 0, 42, 8, 0, 3,
+  0, 0, 56, 18, 0, 16, 26, 0, 2, 0,
+  57, 0, 1, 54, 0, 27, 23, 0, 74, 44,
+  54, 0, 12, 0, 0, 9, 0, 16, 14, 30,
+  64, 22, 0, 0, 0, 0, 0, 18, 39, 0,
+  31, 0, 0, 0, 0, 41, 29, 0, 11, 5,
+  0, 39, 0, 10, 75, 0, 74, 0, 24, 4,
+  0, 36, 30, 0, 0, 0, 49, 39, 40, 0,
+  0, 51, 36, 6, 0, 6, 0, 16, 0, 0,
+  38, 0, 41, 42, 30, 45, 15, 0, 0, 0,
+  5, 61, 41, 0, 5, 11, 0, 65, 38, 0,
+  0, 0, 29, 0, 0, 0, 0, 0, 0, 0,
+  8, 29, 59, 0, 21, 13, 0, 41, 0, 2,
+  0, 43, 0, 19, 0, 48, 0, 0, 0, 0,
+  56, 0, 3, 89, 5, 0, 0, 0, 21, 5,
+  0, 99, 0, 11, 0, 0, 67, 44, 117, 91,
+  15, 0, 39, 0, 3, 0, 0, 12, 0, 18,
+  5, 1, 0, 35, 0, 23, 119, 0, 0, 4,
+  0, 0, 0, 65, 91, 49, 82, 33, 0, 21,
+  0, 118, 80, 20, 83, 0, 0, 0, 0, 0,
+  100, 0, 0, 0, 15, 22, 26, 0, 0, 49,
+  63, 0, 0, 18, 0, 0, 55, 0, 41, 0,
+  0, 54, 58, 26, 28, 0, 0, 0, 0, 29,
+  0, 0, 19, 18, 0, 23, 56, 7, 0, 0,
+  19, 0, 0, 0, 0, 0, 0, 24, 61, 73,
+  32, 0, 66, 36, 9, 0, 0, 0, 5, 21,
+  0, 26, 30, 124, 0, 0, 0, 0, 23, 0,
+  28, 52, 0, 3, 0, 0, 50, 28, 0, 103,
+  0, 4, 0, 0, 39, 0, 82, 66, 0, 0,
+  35, 0, 2, 0, 0, 22, 7, 0, 0, 0,
+  0, 70, 0, 21, 74, 0, 0, 14, 10, 0,
+  0, 32, 91, 24, 64, 1, 0, 2, 0, 95,
+  0, 13, 72, 0, 0, 0, 0, 0, 86, 0,
+  0, 56, 11, 19, 0, 0, 12, 13, 141, 0,
+  0, 19, 0, 0, 4, 0, 38, 0, 0, 38,
+  31, 0, 0, 0, 0, 0, 0, 56, 51, 0,
+  69, 0, 0, 0, 107, 0, 36, 0, 0, 32,
+  38, 0, 0, 0, 0, 37, 0, 81, 51, 65,
+  87, 26, 42, 0, 0, 0, 24, 1, 1, 1,
+  40, 128, 0, 10, 0, 0, 20, 34, 11, 2,
+  7, 22, 0, 0, 0, 18, 0, 18, 19, 8,
+  0, 36, 8, 0, 36, 0, 0, 0, 19, 59,
+  0, 24, 0, 0, 22, 33, 0, 0, 46, 60,
+  0, 37, 0, 0, 0, 36, 0, 23, 0, 0,
+  20, 0, 14, 43, 0, 0, 6, 10, 0, 33,
+  9, 0, 41, 0, 0, 0, 32, 7, 0, 63,
+  13, 0, 60, 24, 16, 45, 93, 12, 0, 0,
+  0, 1, 0, 0, 27, 0, 35, 36, 0, 2,
+  17, 0, 23, 17, 0, 42, 39, 0, 25, 0,
+  0, 19, 110, 2, 0, 0, 0, 0, 14, 0,
+  0, 0, 0, 15, 6, 19, 58, 29, 70, 32,
+  22, 7, 0, 0, 38, 0, 7, 32, 60, 93,
+  0, 0, 0, 0, 38, 0, 64, 26, 0, 33,
+  0, 0, 30, 14, 0, 67, 47, 0, 0, 0,
+  6, 0, 43, 9, 0, 0, 0, 21, 0, 0,
+  0, 0, 0, 24, 0, 6, 13, 86, 0, 24,
+  27, 0, 0, 48, 0, 0, 0, 0, 12, 26,
+  3, 21, 0, 0, 0, 30, 0, 44, 10, 2,
+  0, 0, 0, 0, 48, 0, 0, 39, 61, 0,
+  1, 12, 0, 35, 123, 0, 0, 0, 0, 0,
+  0, 0, 63, 0, 17, 39, 26, 0, 0, 0,
+  0, 26, 0, 33, 42, 10, 39, 0, 4, 0,
+  83, 0, 0, 0, 0, 28, 67, 0, 0, 0,
+  0, 33, 0, 82, 37, 48, 54, 46, 22, 17,
+  0, 0, 75, 0, 31, 10, 55, 60, 0, 21,
+  0, 0, 43, 0, 38, 0, 0, 48, 0, 0,
+  41, 28, 0, 38, 57, 0, 0, 0, 24, 0,
+  32, 0, 0, 0, 0, 80, 0, 0, 0, 0,
+  14, 21, 0, 28, 36, 67, 0, 12, 53, 0,
+  1, 49, 0, 34, 0, 0, 0, 41, 0, 12,
+  9, 0, 0, 0, 0, 43, 25, 31, 0, 22,
+  14, 0, 16, 22, 0, 32, 73, 0, 0, 30,
+  3, 13, 122, 5, 40, 0, 0, 1, 0, 0,
+  93, 0, 14, 55, 0, 0, 0, 0, 0, 54,
+  0, 32, 56, 22, 48, 0, 15, 0, 63, 0,
+  0, 0, 0, 46, 59, 0, 14, 0, 6, 28,
+  0, 93, 46, 31, 46, 68, 33, 0, 0, 0,
+  66, 0, 8, 9, 61, 76, 4, 9, 2, 0,
+  9, 16, 52, 0, 0, 39, 0, 0, 46, 32,
+  0, 0, 28, 0, 0, 0, 1, 0, 0, 0,
+  0, 0, 0, 77, 0, 9, 0, 0, 10, 32,
+  0, 0, 39, 72, 0, 16, 9, 0, 2, 31,
+  0, 8, 0, 0, 0, 4, 0, 26, 19, 0,
+  10, 7, 0, 32, 9, 31, 6, 0, 0, 38,
+  0, 38, 15, 46, 46, 0, 9, 55, 0, 11,
+  92, 0, 0, 0, 0, 12, 0, 0, 74, 0,
+  27, 39, 0, 0, 0, 0, 18, 45, 0, 35,
+  42, 11, 31, 0, 15, 0, 62, 0, 3, 0,
+  0, 6, 60, 0, 0, 0, 0, 12, 0, 66,
+  23, 5, 71, 73, 1, 0, 0, 8, 79, 0,
+  18, 35, 49, 54, 0, 0, 0, 6, 44, 0,
+  41, 8, 0, 24, 0, 0, 55, 8, 0, 0,
+  32, 0, 5, 0, 0, 0, 12, 0, 0, 0,
+  0, 38, 0, 0, 0, 8, 0, 0, 0, 0,
+  32, 89, 0, 0, 52, 0, 19, 21, 0, 9,
+  0, 0, 0, 30, 3, 0, 40, 0, 15, 64,
+  0, 0, 41, 76, 0, 0, 9, 58, 0, 26,
+  12, 24, 95, 17, 0, 70, 0, 25, 100, 0,
+  27, 15, 0, 0, 8, 0, 68, 0, 16, 62,
+  13, 0, 0, 0, 0, 91, 0, 16, 1, 6,
+  23, 0, 3, 0, 73, 0, 19, 0, 0, 35,
+  21, 0, 0, 0, 0, 16, 0, 69, 0, 0,
+  76, 61, 0, 18, 0, 0, 58, 0, 2, 25,
+  0, 40, 0, 0, 19, 37, 29, 4, 20, 9,
+  0, 8, 0, 0, 28, 9, 0, 0, 7, 0,
+  8, 0, 0, 19, 34, 4, 0, 0, 0, 7,
+  0, 0, 0, 37, 0, 0, 0, 0, 40, 40,
+  0, 0, 62, 0, 3, 11, 0, 0, 0, 0,
+  0, 0, 17, 0, 43, 0, 29, 88, 0, 0,
+  53, 71, 0, 0, 0, 29, 0, 20, 2, 10,
+  49, 67, 0, 66, 3, 6, 58, 0, 34, 42,
+  0, 0, 38, 0, 45, 5, 0, 65, 19, 0,
+  0, 0, 12, 109, 0, 0, 0, 0, 12, 0,
+  0, 0, 66, 0, 15, 0, 0, 45, 0, 0,
+  0, 0, 0, 21, 19, 34, 59, 0, 21, 13,
+  0, 41, 0, 2, 0, 43, 0, 19, 0, 48,
+  0, 0, 0, 0, 56, 0, 3, 89, 5, 0,
+  0, 0, 21, 5, 0, 99, 0, 11, 0, 0,
+  67, 44, 117, 91, 15, 0, 39, 0, 3, 0,
+  0, 12, 0, 18, 5, 1, 0, 35, 0, 23,
+  119, 0, 0, 4, 0, 0, 0, 65, 91, 49,
+  82, 33, 0, 21, 0, 118, 80, 20, 83, 0,
+  0, 0, 0, 0, 100, 0, 0, 0, 15, 22,
+  26, 0, 0, 49, 63, 0, 0, 18, 0, 0,
+  55, 0, 41, 0, 0, 54, 58, 26, 28, 0,
+  0, 0, 0, 29, 0, 0, 19, 18, 0, 23,
+  56, 7, 0, 0, 19, 0, 0, 0, 0, 0,
+  0, 24, 61, 73, 32, 0, 66, 36, 9, 0,
+  0, 0, 5, 21, 0, 26, 30, 124, 0, 0,
+  0, 0, 23, 0, 28, 52, 0, 3, 0, 0,
+  50, 28, 0, 103, 0, 4, 0, 0, 39, 0,
+  82, 66, 0, 0, 35, 0, 2, 0, 0, 22,
+  7, 0, 0, 0, 0, 70, 0, 21, 74, 0,
+  0, 14, 10, 0, 0, 32, 91, 24, 64, 1,
+  0, 2, 0, 95, 0, 13, 72, 0, 0, 0,
+  0, 0, 86, 0, 0, 56, 11, 19, 0, 0,
+  12, 13, 141, 0, 0, 19, 0, 0, 4, 0,
+  38, 0, 0, 38, 31, 0, 0, 0, 0, 0,
+  0, 56, 51, 0, 69, 0, 0, 0, 107, 0,
+  36, 0, 0, 32, 38, 0, 0, 0, 0, 37,
+  0, 81, 51, 46, 25, 77, 65, 9, 0, 0,
+  20, 0, 19, 0, 51, 118, 0, 0, 0, 0,
+  16, 7, 12, 11, 0, 26, 0, 0, 55, 19,
+  0, 69, 20, 7, 22, 0, 56, 0, 0, 0,
+  0, 0, 0, 35, 0, 0, 31, 31, 30, 33,
+  0, 0, 23, 35, 0, 14, 38, 0, 27, 20,
+  0, 10, 0, 19, 19, 8, 0, 0, 0, 0,
+  2, 0, 0, 41, 51, 0, 0, 22, 0, 0,
+  35, 8, 0, 53, 41, 20, 0, 0, 35, 12,
+  95, 14, 26, 0, 0, 30, 0, 0, 70, 0,
+  0, 50, 0, 20, 0, 0, 0, 25, 0, 43,
+  127, 0, 82, 0, 12, 0, 31, 0, 14, 0,
+  0, 8, 49, 0, 2, 15, 10, 13, 0, 93,
+  58, 29, 70, 32, 22, 7, 0, 0, 38, 0,
+  7, 32, 60, 93, 0, 0, 0, 0, 38, 0,
+  64, 26, 0, 33, 0, 0, 30, 14, 0, 67,
+  47, 0, 0, 0, 6, 0, 43, 9, 0, 0,
+  0, 21, 0, 0, 0, 0, 0, 24, 0, 6,
+  13, 86, 0, 24, 27, 0, 0, 48, 0, 0,
+  0, 0, 12, 26, 3, 21, 0, 0, 0, 30,
+  0, 44, 10, 2, 0, 0, 0, 0, 48, 0,
+  0, 39, 61, 0, 1, 12, 0, 35, 123, 0,
+  0, 0, 0, 0, 0, 0, 63, 0, 17, 39,
+  26, 0, 0, 0, 0, 26, 0, 33, 42, 10,
+  39, 0, 4, 0, 83, 0, 0, 0, 0, 28,
+  67, 0, 0, 0, 0, 33, 0, 82, 37, 48,
+  54, 46, 22, 17, 0, 0, 75, 0, 31, 10,
+  55, 60, 0, 21, 0, 0, 43, 0, 38, 0,
+  0, 48, 0, 0, 41, 28, 0, 38, 57, 0,
+  0, 0, 24, 0, 32, 0, 0, 0, 0, 80,
+  0, 0, 0, 0, 14, 21, 0, 28, 36, 67,
+  0, 12, 53, 0, 1, 49, 0, 34, 0, 0,
+  0, 41, 0, 12, 9, 0, 0, 0, 0, 43,
+  25, 31, 0, 22, 14, 0, 16, 22, 0, 32,
+  73, 0, 0, 30, 3, 13, 122, 5, 40, 0,
+  0, 1, 0, 0, 93, 0, 14, 55, 0, 0,
+  0, 0, 0, 54, 0, 32, 56, 22, 48, 0,
+  15, 0, 63, 0, 0, 0, 0, 46, 59, 0,
+  14, 0, 6, 28, 0, 93, 18, 58, 66, 69,
+  39, 34, 0, 0, 61, 0, 24, 0, 24, 41,
+  11, 21, 49, 14, 29, 7, 0, 0, 0, 34,
+  1, 0, 22, 29, 0, 26, 0, 5, 31, 0,
+  36, 0, 13, 0, 0, 0, 0, 34, 0, 0,
+  10, 55, 10, 6, 0, 0, 30, 0, 0, 0,
+  35, 0, 20, 14, 0, 4, 0, 6, 0, 0,
+  0, 0, 31, 0, 49, 0, 0, 0, 64, 30,
+  0, 37, 0, 10, 0, 53, 0, 8, 43, 93,
+  0, 42, 5, 3, 30, 39, 93, 5, 0, 0,
+  11, 0, 68, 0, 0, 79, 5, 0, 0, 0,
+  30, 61, 0, 15, 39, 0, 23, 0, 0, 0,
+  0, 0, 12, 0, 0, 0, 11, 0, 7, 0,
+  19, 17, 24, 37, 23, 5, 71, 73, 1, 0,
+  0, 8, 79, 0, 18, 35, 49, 54, 0, 0,
+  0, 6, 44, 0, 41, 8, 0, 24, 0, 0,
+  55, 8, 0, 0, 32, 0, 5, 0, 0, 0,
+  12, 0, 0, 0, 0, 38, 0, 0, 0, 8,
+  0, 0, 0, 0, 32, 89, 0, 0, 52, 0,
+  19, 21, 0, 9, 0, 0, 0, 30, 3, 0,
+  40, 0, 15, 64, 0, 0, 41, 76, 0, 0,
+  9, 58, 0, 26, 12, 24, 95, 17, 0, 70,
+  0, 25, 100, 0, 27, 15, 0, 0, 8, 0,
+  68, 0, 16, 62, 13, 0, 0, 0, 0, 91,
+  0, 16, 1, 6, 23, 0, 3, 0, 73, 0,
+  19, 0, 0, 35, 21, 0, 0, 0, 0, 16,
+  0, 69, 0, 0, 76, 61, 0, 18, 0, 0,
+  58, 0, 2, 25, 0, 40, 0, 0, 19, 37,
+  29, 4, 20, 9, 0, 8, 0, 0, 28, 9,
+  0, 0, 7, 0, 8, 0, 0, 19, 34, 4,
+  0, 0, 0, 7, 0, 0, 0, 37, 0, 0,
+  0, 0, 40, 40, 0, 0, 62, 0, 3, 11,
+  0, 0, 0, 0, 0, 0, 17, 0, 43, 0,
+  29, 88, 0, 0, 53, 71, 0, 0, 0, 29,
+  0, 20, 2, 10, 49, 67, 0, 66, 3, 6,
+  58, 0, 34, 42, 0, 0, 38, 0, 45, 5,
+  0, 65, 19, 0, 0, 0, 12, 109, 0, 0,
+  0, 0, 12, 0, 0, 0, 66, 0, 15, 0,
+  0, 45, 0, 0, 0, 0, 0, 21, 19, 34,
+  21, 49, 94, 59, 0, 40, 0, 0, 37, 0,
+  0, 2, 0, 53, 10, 6, 39, 18, 0, 5,
+  0, 0, 0, 10, 0, 0, 0, 12, 0, 36,
+  18, 54, 0, 12, 26, 2, 59, 42, 0, 0,
+  0, 6, 17, 0, 0, 42, 0, 10, 0, 0,
+  60, 0, 0, 0, 47, 0, 14, 4, 5, 0,
+  0, 0, 0, 0, 0, 0, 19, 0, 49, 8,
+  0, 0, 50, 31, 0, 14, 0, 0, 0, 49,
+  0, 39, 0, 93, 0, 53, 2, 0, 47, 10,
+  28, 14, 0, 0, 7, 0, 11, 20, 0, 63,
+  0, 0, 0, 0, 64, 95, 0, 0, 0, 0,
+  42, 0, 0, 0, 37, 0, 0, 0, 0, 29,
+  0, 0, 0, 0, 8, 31, 58, 8, 32, 0,
+  66, 36, 9, 0, 0, 0, 5, 21, 0, 26,
+  30, 124, 0, 0, 0, 0, 23, 0, 28, 52,
+  0, 3, 0, 0, 50, 28, 0, 103, 0, 4,
+  0, 0, 39, 0, 82, 66, 0, 0, 35, 0,
+  2, 0, 0, 22, 7, 0, 0, 0, 0, 70,
+  0, 21, 74, 0, 0, 14, 10, 0, 0, 32,
+  91, 24, 64, 1, 0, 2, 0, 95, 0, 13,
+  72, 0, 0, 0, 0, 0, 86, 0, 0, 56,
+  11, 19, 0, 0, 12, 13, 141, 0, 0, 19,
+  0, 0, 4, 0, 38, 0, 0, 38, 31, 0,
+  0, 0, 0, 0, 0, 56, 51, 0, 69, 0,
+  0, 0, 107, 0, 36, 0, 0, 32, 38, 0,
+  0, 0, 0, 37, 0, 81, 51, 46, 25, 77,
+  65, 9, 0, 0, 20, 0, 19, 0, 51, 118,
+  0, 0, 0, 0, 16, 7, 12, 11, 0, 26,
+  0, 0, 55, 19, 0, 69, 20, 7, 22, 0,
+  56, 0, 0, 0, 0, 0, 0, 35, 0, 0,
+  31, 31, 30, 33, 0, 0, 23, 35, 0, 14,
+  38, 0, 27, 20, 0, 10, 0, 19, 19, 8,
+  0, 0, 0, 0, 2, 0, 0, 41, 51, 0,
+  0, 22, 0, 0, 35, 8, 0, 53, 41, 20,
+  0, 0, 35, 12, 95, 14, 26, 0, 0, 30,
+  0, 0, 70, 0, 0, 50, 0, 20, 0, 0,
+  0, 25, 0, 43, 127, 0, 82, 0, 12, 0,
+  31, 0, 14, 0, 0, 8, 49, 0, 2, 15,
+  10, 13, 0, 93, 42, 127, 15, 99, 80, 43,
+  0, 0, 43, 0, 32, 0, 35, 29, 0, 0,
+  11, 0, 41, 15, 0, 0, 0, 47, 24, 0,
+  52, 29, 0, 37, 5, 49, 69, 0, 20, 0,
+  0, 0, 0, 0, 0, 17, 0, 6, 19, 56,
+  44, 46, 0, 7, 4, 0, 0, 17, 32, 0,
+  50, 2, 0, 29, 21, 24, 0, 8, 0, 0,
+  52, 4, 27, 0, 0, 21, 45, 4, 6, 45,
+  10, 2, 0, 2, 0, 19, 40, 73, 0, 17,
+  5, 38, 21, 49, 107, 0, 0, 49, 0, 0,
+  90, 0, 23, 57, 7, 99, 1, 0, 25, 33,
+  41, 62, 122, 0, 7, 22, 36, 0, 0, 0,
+  0, 0, 0, 0, 13, 0, 43, 0, 45, 1,
+  13, 74, 37, 48, 54, 46, 22, 17, 0, 0,
+  75, 0, 31, 10, 55, 60, 0, 21, 0, 0,
+  43, 0, 38, 0, 0, 48, 0, 0, 41, 28,
+  0, 38, 57, 0, 0, 0, 24, 0, 32, 0,
+  0, 0, 0, 80, 0, 0, 0, 0, 14, 21,
+  0, 28, 36, 67, 0, 12, 53, 0, 1, 49,
+  0, 34, 0, 0, 0, 41, 0, 12, 9, 0,
+  0, 0, 0, 43, 25, 31, 0, 22, 14, 0,
+  16, 22, 0, 32, 73, 0, 0, 30, 3, 13,
+  122, 5, 40, 0, 0, 1, 0, 0, 93, 0,
+  14, 55, 0, 0, 0, 0, 0, 54, 0, 32,
+  56, 22, 48, 0, 15, 0, 63, 0, 0, 0,
+  0, 46, 59, 0, 14, 0, 6, 28, 0, 93,
+  18, 58, 66, 69, 39, 34, 0, 0, 61, 0,
+  24, 0, 24, 41, 11, 21, 49, 14, 29, 7,
+  0, 0, 0, 34, 1, 0, 22, 29, 0, 26,
+  0, 5, 31, 0, 36, 0, 13, 0, 0, 0,
+  0, 34, 0, 0, 10, 55, 10, 6, 0, 0,
+  30, 0, 0, 0, 35, 0, 20, 14, 0, 4,
+  0, 6, 0, 0, 0, 0, 31, 0, 49, 0,
+  0, 0, 64, 30, 0, 37, 0, 10, 0, 53,
+  0, 8, 43, 93, 0, 42, 5, 3, 30, 39,
+  93, 5, 0, 0, 11, 0, 68, 0, 0, 79,
+  5, 0, 0, 0, 30, 61, 0, 15, 39, 0,
+  23, 0, 0, 0, 0, 0, 12, 0, 0, 0,
+  11, 0, 7, 0, 19, 17, 24, 37, 19, 83,
+  100, 57, 60, 86, 0, 0, 16, 0, 0, 0,
+  1, 37, 9, 22, 45, 0, 3, 24, 0, 9,
+  0, 26, 12, 0, 0, 30, 0, 58, 0, 45,
+  5, 36, 29, 8, 0, 14, 0, 6, 0, 0,
+  0, 30, 1, 47, 31, 38, 0, 0, 15, 0,
+  0, 0, 7, 0, 28, 11, 0, 0, 0, 19,
+  0, 0, 0, 0, 25, 0, 71, 0, 0, 0,
+  48, 11, 37, 0, 0, 0, 0, 14, 0, 10,
+  19, 113, 22, 41, 0, 37, 0, 20, 39, 0,
+  0, 0, 11, 0, 10, 0, 0, 52, 9, 11,
+  0, 0, 76, 50, 5, 16, 33, 0, 25, 22,
+  0, 4, 0, 0, 10, 0, 0, 0, 0, 0,
+  0, 0, 34, 0, 47, 18, 0, 0, 76, 61,
+  0, 18, 0, 0, 58, 0, 2, 25, 0, 40,
+  0, 0, 19, 37, 29, 4, 20, 9, 0, 8,
+  0, 0, 28, 9, 0, 0, 7, 0, 8, 0,
+  0, 19, 34, 4, 0, 0, 0, 7, 0, 0,
+  0, 37, 0, 0, 0, 0, 40, 40, 0, 0,
+  62, 0, 3, 11, 0, 0, 0, 0, 0, 0,
+  17, 0, 43, 0, 29, 88, 0, 0, 53, 71,
+  0, 0, 0, 29, 0, 20, 2, 10, 49, 67,
+  0, 66, 3, 6, 58, 0, 34, 42, 0, 0,
+  38, 0, 45, 5, 0, 65, 19, 0, 0, 0,
+  12, 109, 0, 0, 0, 0, 12, 0, 0, 0,
+  66, 0, 15, 0, 0, 45, 0, 0, 0, 0,
+  0, 21, 19, 34, 21, 49, 94, 59, 0, 40,
+  0, 0, 37, 0, 0, 2, 0, 53, 10, 6,
+  39, 18, 0, 5, 0, 0, 0, 10, 0, 0,
+  0, 12, 0, 36, 18, 54, 0, 12, 26, 2,
+  59, 42, 0, 0, 0, 6, 17, 0, 0, 42,
+  0, 10, 0, 0, 60, 0, 0, 0, 47, 0,
+  14, 4, 5, 0, 0, 0, 0, 0, 0, 0,
+  19, 0, 49, 8, 0, 0, 50, 31, 0, 14,
+  0, 0, 0, 49, 0, 39, 0, 93, 0, 53,
+  2, 0, 47, 10, 28, 14, 0, 0, 7, 0,
+  11, 20, 0, 63, 0, 0, 0, 0, 64, 95,
+  0, 0, 0, 0, 42, 0, 0, 0, 37, 0,
+  0, 0, 0, 29, 0, 0, 0, 0, 8, 31,
+  58, 8, 24, 50, 130, 56, 9, 113, 0, 0,
+  0, 0, 0, 0, 18, 53, 0, 15, 32, 9,
+  0, 14, 0, 26, 0, 12, 0, 0, 0, 0,
+  0, 68, 18, 55, 0, 60, 43, 18, 30, 1,
+  0, 18, 0, 0, 0, 3, 0, 17, 0, 39,
+  0, 0, 36, 38, 0, 0, 41, 0, 32, 16,
+  29, 0, 0, 0, 0, 0, 31, 0, 0, 0,
+  41, 0, 0, 0, 42, 0, 0, 3, 0, 0,
+  2, 46, 0, 22, 20, 94, 27, 22, 13, 1,
+  28, 26, 6, 0, 0, 0, 15, 0, 0, 0,
+  0, 25, 2, 0, 0, 0, 20, 67, 0, 0,
+  0, 2, 64, 0, 0, 16, 0, 0, 21, 0,
+  0, 13, 0, 0, 0, 18, 28, 25, 23, 8,
+  51, 46, 25, 77, 65, 9, 0, 0, 20, 0,
+  19, 0, 51, 118, 0, 0, 0, 0, 16, 7,
+  12, 11, 0, 26, 0, 0, 55, 19, 0, 69,
+  20, 7, 22, 0, 56, 0, 0, 0, 0, 0,
+  0, 35, 0, 0, 31, 31, 30, 33, 0, 0,
+  23, 35, 0, 14, 38, 0, 27, 20, 0, 10,
+  0, 19, 19, 8, 0, 0, 0, 0, 2, 0,
+  0, 41, 51, 0, 0, 22, 0, 0, 35, 8,
+  0, 53, 41, 20, 0, 0, 35, 12, 95, 14,
+  26, 0, 0, 30, 0, 0, 70, 0, 0, 50,
+  0, 20, 0, 0, 0, 25, 0, 43, 127, 0,
+  82, 0, 12, 0, 31, 0, 14, 0, 0, 8,
+  49, 0, 2, 15, 10, 13, 0, 93, 42, 127,
+  15, 99, 80, 43, 0, 0, 43, 0, 32, 0,
+  35, 29, 0, 0, 11, 0, 41, 15, 0, 0,
+  0, 47, 24, 0, 52, 29, 0, 37, 5, 49,
+  69, 0, 20, 0, 0, 0, 0, 0, 0, 17,
+  0, 6, 19, 56, 44, 46, 0, 7, 4, 0,
+  0, 17, 32, 0, 50, 2, 0, 29, 21, 24,
+  0, 8, 0, 0, 52, 4, 27, 0, 0, 21,
+  45, 4, 6, 45, 10, 2, 0, 2, 0, 19,
+  40, 73, 0, 17, 5, 38, 21, 49, 107, 0,
+  0, 49, 0, 0, 90, 0, 23, 57, 7, 99,
+  1, 0, 25, 33, 41, 62, 122, 0, 7, 22,
+  36, 0, 0, 0, 0, 0, 0, 0, 13, 0,
+  43, 0, 45, 1, 13, 74, 17, 8, 86, 68,
+  23, 217, 0, 0, 29, 0, 0, 0, 32, 0,
+  0, 0, 31, 18, 66, 0, 0, 112, 15, 8,
+  7, 0, 0, 35, 0, 72, 0, 82, 0, 0,
+  0, 30, 0, 0, 1, 0, 0, 19, 0, 19,
+  0, 50, 59, 42, 0, 14, 0, 45, 0, 0,
+  97, 0, 62, 0, 33, 0, 0, 70, 0, 0,
+  53, 0, 0, 26, 12, 6, 27, 25, 76, 0,
+  0, 26, 25, 0, 0, 18, 0, 0, 77, 83,
+  0, 0, 0, 18, 0, 4, 54, 0, 0, 0,
+  24, 0, 25, 0, 15, 39, 25, 35, 17, 0,
+  0, 31, 47, 29, 0, 0, 0, 45, 0, 0,
+  0, 0, 38, 0, 3, 0, 0, 1, 0, 22,
+  25, 0, 0, 20, 18, 58, 66, 69, 39, 34,
+  0, 0, 61, 0, 24, 0, 24, 41, 11, 21,
+  49, 14, 29, 7, 0, 0, 0, 34, 1, 0,
+  22, 29, 0, 26, 0, 5, 31, 0, 36, 0,
+  13, 0, 0, 0, 0, 34, 0, 0, 10, 55,
+  10, 6, 0, 0, 30, 0, 0, 0, 35, 0,
+  20, 14, 0, 4, 0, 6, 0, 0, 0, 0,
+  31, 0, 49, 0, 0, 0, 64, 30, 0, 37,
+  0, 10, 0, 53, 0, 8, 43, 93, 0, 42,
+  5, 3, 30, 39, 93, 5, 0, 0, 11, 0,
+  68, 0, 0, 79, 5, 0, 0, 0, 30, 61,
+  0, 15, 39, 0, 23, 0, 0, 0, 0, 0,
+  12, 0, 0, 0, 11, 0, 7, 0, 19, 17,
+  24, 37, 19, 83, 100, 57, 60, 86, 0, 0,
+  16, 0, 0, 0, 1, 37, 9, 22, 45, 0,
+  3, 24, 0, 9, 0, 26, 12, 0, 0, 30,
+  0, 58, 0, 45, 5, 36, 29, 8, 0, 14,
+  0, 6, 0, 0, 0, 30, 1, 47, 31, 38,
+  0, 0, 15, 0, 0, 0, 7, 0, 28, 11,
+  0, 0, 0, 19, 0, 0, 0, 0, 25, 0,
+  71, 0, 0, 0, 48, 11, 37, 0, 0, 0,
+  0, 14, 0, 10, 19, 113, 22, 41, 0, 37,
+  0, 20, 39, 0, 0, 0, 11, 0, 10, 0,
+  0, 52, 9, 11, 0, 0, 76, 50, 5, 16,
+  33, 0, 25, 22, 0, 4, 0, 0, 10, 0,
+  0, 0, 0, 0, 0, 0, 34, 0, 47, 18,
+  11, 11, 105, 33, 25, 144, 0, 0, 0, 0,
+  0, 0, 17, 0, 0, 0, 17, 5, 23, 0,
+  0, 94, 8, 12, 0, 0, 0, 0, 0, 52,
+  0, 26, 0, 34, 0, 30, 0, 0, 0, 25,
+  0, 0, 0, 39, 0, 0, 23, 37, 0, 0,
+  0, 86, 0, 0, 64, 0, 59, 0, 41, 0,
+  0, 32, 0, 17, 51, 3, 0, 0, 41, 0,
+  4, 7, 56, 0, 27, 0, 0, 0, 0, 10,
+  0, 0, 45, 50, 55, 11, 0, 9, 2, 0,
+  0, 0, 20, 0, 18, 0, 0, 0, 20, 19,
+  0, 0, 0, 0, 22, 38, 4, 0, 0, 0,
+  37, 28, 0, 0, 0, 0, 63, 0, 8, 0,
+  0, 0, 0, 12, 39, 5, 0, 0, 21, 49,
+  94, 59, 0, 40, 0, 0, 37, 0, 0, 2,
+  0, 53, 10, 6, 39, 18, 0, 5, 0, 0,
+  0, 10, 0, 0, 0, 12, 0, 36, 18, 54,
+  0, 12, 26, 2, 59, 42, 0, 0, 0, 6,
+  17, 0, 0, 42, 0, 10, 0, 0, 60, 0,
+  0, 0, 47, 0, 14, 4, 5, 0, 0, 0,
+  0, 0, 0, 0, 19, 0, 49, 8, 0, 0,
+  50, 31, 0, 14, 0, 0, 0, 49, 0, 39,
+  0, 93, 0, 53, 2, 0, 47, 10, 28, 14,
+  0, 0, 7, 0, 11, 20, 0, 63, 0, 0,
+  0, 0, 64, 95, 0, 0, 0, 0, 42, 0,
+  0, 0, 37, 0, 0, 0, 0, 29, 0, 0,
+  0, 0, 8, 31, 58, 8, 24, 50, 130, 56,
+  9, 113, 0, 0, 0, 0, 0, 0, 18, 53,
+  0, 15, 32, 9, 0, 14, 0, 26, 0, 12,
+  0, 0, 0, 0, 0, 68, 18, 55, 0, 60,
+  43, 18, 30, 1, 0, 18, 0, 0, 0, 3,
+  0, 17, 0, 39, 0, 0, 36, 38, 0, 0,
+  41, 0, 32, 16, 29, 0, 0, 0, 0, 0,
+  31, 0, 0, 0, 41, 0, 0, 0, 42, 0,
+  0, 3, 0, 0, 2, 46, 0, 22, 20, 94,
+  27, 22, 13, 1, 28, 26, 6, 0, 0, 0,
+  15, 0, 0, 0, 0, 25, 2, 0, 0, 0,
+  20, 67, 0, 0, 0, 2, 64, 0, 0, 16,
+  0, 0, 21, 0, 0, 13, 0, 0, 0, 18,
+  28, 25, 23, 8, 18, 29, 81, 2, 20, 83,
+  0, 0, 0, 0, 0, 0, 29, 22, 0, 0,
+  11, 0, 22, 0, 16, 80, 7, 25, 0, 0,
+  0, 0, 0, 50, 53, 0, 0, 40, 19, 7,
+  0, 0, 0, 34, 18, 28, 0, 28, 19, 0,
+  0, 38, 0, 0, 0, 100, 0, 0, 72, 0,
+  56, 27, 67, 0, 0, 10, 0, 45, 0, 38,
+  0, 0, 0, 0, 0, 13, 35, 21, 7, 22,
+  0, 0, 0, 14, 4, 0, 18, 9, 61, 9,
+  0, 0, 33, 0, 0, 2, 69, 0, 11, 0,
+  0, 0, 29, 21, 0, 0, 0, 0, 26, 25,
+  0, 0, 0, 32, 64, 0, 0, 16, 0, 0,
+  50, 0, 17, 27, 16, 8, 0, 0, 53, 22,
+  0, 8, 42, 127, 15, 99, 80, 43, 0, 0,
+  43, 0, 32, 0, 35, 29, 0, 0, 11, 0,
+  41, 15, 0, 0, 0, 47, 24, 0, 52, 29,
+  0, 37, 5, 49, 69, 0, 20, 0, 0, 0,
+  0, 0, 0, 17, 0, 6, 19, 56, 44, 46,
+  0, 7, 4, 0, 0, 17, 32, 0, 50, 2,
+  0, 29, 21, 24, 0, 8, 0, 0, 52, 4,
+  27, 0, 0, 21, 45, 4, 6, 45, 10, 2,
+  0, 2, 0, 19, 40, 73, 0, 17, 5, 38,
+  21, 49, 107, 0, 0, 49, 0, 0, 90, 0,
+  23, 57, 7, 99, 1, 0, 25, 33, 41, 62,
+  122, 0, 7, 22, 36, 0, 0, 0, 0, 0,
+  0, 0, 13, 0, 43, 0, 45, 1, 13, 74,
+  17, 8, 86, 68, 23, 217, 0, 0, 29, 0,
+  0, 0, 32, 0, 0, 0, 31, 18, 66, 0,
+  0, 112, 15, 8, 7, 0, 0, 35, 0, 72,
+  0, 82, 0, 0, 0, 30, 0, 0, 1, 0,
+  0, 19, 0, 19, 0, 50, 59, 42, 0, 14,
+  0, 45, 0, 0, 97, 0, 62, 0, 33, 0,
+  0, 70, 0, 0, 53, 0, 0, 26, 12, 6,
+  27, 25, 76, 0, 0, 26, 25, 0, 0, 18,
+  0, 0, 77, 83, 0, 0, 0, 18, 0, 4,
+  54, 0, 0, 0, 24, 0, 25, 0, 15, 39,
+  25, 35, 17, 0, 0, 31, 47, 29, 0, 0,
+  0, 45, 0, 0, 0, 0, 38, 0, 3, 0,
+  0, 1, 0, 22, 25, 0, 0, 20, 0, 0,
+  0, 0, 1, 125, 0, 0, 0, 0, 0, 0,
+  59, 8, 0, 44, 12, 40, 18, 0, 40, 6,
+  0, 49, 0, 0, 0, 0, 0, 14, 40, 0,
+  0, 17, 0, 8, 0, 16, 0, 48, 35, 47,
+  0, 33, 1, 0, 7, 27, 0, 35, 0, 77,
+  28, 0, 14, 0, 38, 0, 36, 0, 0, 14,
+  0, 11, 0, 0, 0, 3, 8, 0, 16, 34,
+  27, 15, 0, 70, 0, 0, 0, 26, 7, 0,
+  14, 12, 42, 0, 12, 0, 8, 25, 0, 47,
+  52, 0, 15, 13, 0, 0, 17, 28, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 32, 29, 12,
+  0, 47, 0, 0, 66, 14, 50, 0, 35, 14,
+  18, 0, 67, 1, 0, 0, 19, 83, 100, 57,
+  60, 86, 0, 0, 16, 0, 0, 0, 1, 37,
+  9, 22, 45, 0, 3, 24, 0, 9, 0, 26,
+  12, 0, 0, 30, 0, 58, 0, 45, 5, 36,
+  29, 8, 0, 14, 0, 6, 0, 0, 0, 30,
+  1, 47, 31, 38, 0, 0, 15, 0, 0, 0,
+  7, 0, 28, 11, 0, 0, 0, 19, 0, 0,
+  0, 0, 25, 0, 71, 0, 0, 0, 48, 11,
+  37, 0, 0, 0, 0, 14, 0, 10, 19, 113,
+  22, 41, 0, 37, 0, 20, 39, 0, 0, 0,
+  11, 0, 10, 0, 0, 52, 9, 11, 0, 0,
+  76, 50, 5, 16, 33, 0, 25, 22, 0, 4,
+  0, 0, 10, 0, 0, 0, 0, 0, 0, 0,
+  34, 0, 47, 18, 11, 11, 105, 33, 25, 144,
+  0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+  17, 5, 23, 0, 0, 94, 8, 12, 0, 0,
+  0, 0, 0, 52, 0, 26, 0, 34, 0, 30,
+  0, 0, 0, 25, 0, 0, 0, 39, 0, 0,
+  23, 37, 0, 0, 0, 86, 0, 0, 64, 0,
+  59, 0, 41, 0, 0, 32, 0, 17, 51, 3,
+  0, 0, 41, 0, 4, 7, 56, 0, 27, 0,
+  0, 0, 0, 10, 0, 0, 45, 50, 55, 11,
+  0, 9, 2, 0, 0, 0, 20, 0, 18, 0,
+  0, 0, 20, 19, 0, 0, 0, 0, 22, 38,
+  4, 0, 0, 0, 37, 28, 0, 0, 0, 0,
+  63, 0, 8, 0, 0, 0, 0, 12, 39, 5,
+  0, 0, 0, 2, 46, 0, 14, 18, 11, 0,
+  12, 0, 0, 11, 59, 26, 0, 39, 3, 30,
+  27, 0, 68, 23, 33, 23, 0, 0, 0, 0,
+  0, 0, 61, 0, 0, 0, 0, 7, 0, 8,
+  0, 25, 64, 32, 0, 78, 13, 0, 0, 10,
+  0, 12, 0, 114, 19, 0, 44, 0, 53, 0,
+  52, 0, 0, 0, 0, 20, 19, 0, 0, 11,
+  0, 0, 0, 19, 15, 39, 5, 36, 0, 0,
+  0, 0, 27, 0, 8, 0, 65, 1, 0, 0,
+  39, 0, 0, 25, 36, 0, 0, 17, 0, 0,
+  33, 36, 0, 0, 0, 0, 22, 0, 0, 0,
+  0, 13, 66, 18, 0, 34, 0, 0, 63, 12,
+  74, 5, 47, 3, 0, 0, 82, 14, 12, 0,
+  24, 50, 130, 56, 9, 113, 0, 0, 0, 0,
+  0, 0, 18, 53, 0, 15, 32, 9, 0, 14,
+  0, 26, 0, 12, 0, 0, 0, 0, 0, 68,
+  18, 55, 0, 60, 43, 18, 30, 1, 0, 18,
+  0, 0, 0, 3, 0, 17, 0, 39, 0, 0,
+  36, 38, 0, 0, 41, 0, 32, 16, 29, 0,
+  0, 0, 0, 0, 31, 0, 0, 0, 41, 0,
+  0, 0, 42, 0, 0, 3, 0, 0, 2, 46,
+  0, 22, 20, 94, 27, 22, 13, 1, 28, 26,
+  6, 0, 0, 0, 15, 0, 0, 0, 0, 25,
+  2, 0, 0, 0, 20, 67, 0, 0, 0, 2,
+  64, 0, 0, 16, 0, 0, 21, 0, 0, 13,
+  0, 0, 0, 18, 28, 25, 23, 8, 18, 29,
+  81, 2, 20, 83, 0, 0, 0, 0, 0, 0,
+  29, 22, 0, 0, 11, 0, 22, 0, 16, 80,
+  7, 25, 0, 0, 0, 0, 0, 50, 53, 0,
+  0, 40, 19, 7, 0, 0, 0, 34, 18, 28,
+  0, 28, 19, 0, 0, 38, 0, 0, 0, 100,
+  0, 0, 72, 0, 56, 27, 67, 0, 0, 10,
+  0, 45, 0, 38, 0, 0, 0, 0, 0, 13,
+  35, 21, 7, 22, 0, 0, 0, 14, 4, 0,
+  18, 9, 61, 9, 0, 0, 33, 0, 0, 2,
+  69, 0, 11, 0, 0, 0, 29, 21, 0, 0,
+  0, 0, 26, 25, 0, 0, 0, 32, 64, 0,
+  0, 16, 0, 0, 50, 0, 17, 27, 16, 8,
+  0, 0, 53, 22, 0, 8, 0, 3, 48, 0,
+  28, 0, 0, 0, 12, 0, 0, 8, 33, 45,
+  0, 3, 0, 28, 37, 0, 73, 40, 75, 3,
+  0, 0, 0, 6, 0, 0, 38, 0, 0, 0,
+  0, 17, 0, 11, 18, 0, 45, 20, 0, 94,
+  30, 2, 0, 37, 0, 0, 0, 118, 0, 0,
+  57, 0, 32, 0, 52, 0, 0, 0, 6, 0,
+  65, 0, 0, 28, 0, 6, 0, 7, 0, 28,
+  10, 0, 0, 0, 0, 0, 20, 0, 18, 0,
+  66, 3, 0, 0, 33, 0, 0, 0, 0, 0,
+  0, 35, 0, 0, 33, 47, 0, 0, 0, 0,
+  30, 0, 0, 0, 0, 0, 68, 9, 0, 32,
+  0, 0, 91, 10, 53, 25, 59, 0, 0, 0,
+  63, 11, 16, 0, 17, 8, 86, 68, 23, 217,
+  0, 0, 29, 0, 0, 0, 32, 0, 0, 0,
+  31, 18, 66, 0, 0, 112, 15, 8, 7, 0,
+  0, 35, 0, 72, 0, 82, 0, 0, 0, 30,
+  0, 0, 1, 0, 0, 19, 0, 19, 0, 50,
+  59, 42, 0, 14, 0, 45, 0, 0, 97, 0,
+  62, 0, 33, 0, 0, 70, 0, 0, 53, 0,
+  0, 26, 12, 6, 27, 25, 76, 0, 0, 26,
+  25, 0, 0, 18, 0, 0, 77, 83, 0, 0,
+  0, 18, 0, 4, 54, 0, 0, 0, 24, 0,
+  25, 0, 15, 39, 25, 35, 17, 0, 0, 31,
+  47, 29, 0, 0, 0, 45, 0, 0, 0, 0,
+  38, 0, 3, 0, 0, 1, 0, 22, 25, 0,
+  0, 20, 0, 0, 0, 0, 1, 125, 0, 0,
+  0, 0, 0, 0, 59, 8, 0, 44, 12, 40,
+  18, 0, 40, 6, 0, 49, 0, 0, 0, 0,
+  0, 14, 40, 0, 0, 17, 0, 8, 0, 16,
+  0, 48, 35, 47, 0, 33, 1, 0, 7, 27,
+  0, 35, 0, 77, 28, 0, 14, 0, 38, 0,
+  36, 0, 0, 14, 0, 11, 0, 0, 0, 3,
+  8, 0, 16, 34, 27, 15, 0, 70, 0, 0,
+  0, 26, 7, 0, 14, 12, 42, 0, 12, 0,
+  8, 25, 0, 47, 52, 0, 15, 13, 0, 0,
+  17, 28, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 32, 29, 12, 0, 47, 0, 0, 66, 14,
+  50, 0, 35, 14, 18, 0, 67, 1, 0, 0,
+  0, 0, 77, 0, 0, 0, 2, 0, 0, 0,
+  0, 1, 29, 58, 0, 41, 0, 69, 29, 7,
+  59, 19, 117, 17, 0, 0, 0, 5, 0, 0,
+  15, 0, 0, 0, 0, 13, 0, 12, 0, 0,
+  66, 0, 0, 79, 32, 0, 0, 0, 0, 6,
+  0, 87, 7, 0, 39, 0, 49, 0, 7, 0,
+  0, 1, 10, 0, 77, 0, 0, 21, 0, 50,
+  0, 0, 2, 19, 0, 7, 0, 0, 0, 0,
+  19, 0, 2, 0, 62, 8, 0, 0, 25, 0,
+  0, 13, 0, 0, 16, 30, 0, 0, 0, 54,
+  3, 0, 0, 0, 20, 0, 0, 0, 0, 0,
+  62, 11, 0, 38, 13, 0, 89, 23, 44, 14,
+  34, 0, 0, 0, 57, 0, 15, 0, 11, 11,
+  105, 33, 25, 144, 0, 0, 0, 0, 0, 0,
+  17, 0, 0, 0, 17, 5, 23, 0, 0, 94,
+  8, 12, 0, 0, 0, 0, 0, 52, 0, 26,
+  0, 34, 0, 30, 0, 0, 0, 25, 0, 0,
+  0, 39, 0, 0, 23, 37, 0, 0, 0, 86,
+  0, 0, 64, 0, 59, 0, 41, 0, 0, 32,
+  0, 17, 51, 3, 0, 0, 41, 0, 4, 7,
+  56, 0, 27, 0, 0, 0, 0, 10, 0, 0,
+  45, 50, 55, 11, 0, 9, 2, 0, 0, 0,
+  20, 0, 18, 0, 0, 0, 20, 19, 0, 0,
+  0, 0, 22, 38, 4, 0, 0, 0, 37, 28,
+  0, 0, 0, 0, 63, 0, 8, 0, 0, 0,
+  0, 12, 39, 5, 0, 0, 0, 2, 46, 0,
+  14, 18, 11, 0, 12, 0, 0, 11, 59, 26,
+  0, 39, 3, 30, 27, 0, 68, 23, 33, 23,
+  0, 0, 0, 0, 0, 0, 61, 0, 0, 0,
+  0, 7, 0, 8, 0, 25, 64, 32, 0, 78,
+  13, 0, 0, 10, 0, 12, 0, 114, 19, 0,
+  44, 0, 53, 0, 52, 0, 0, 0, 0, 20,
+  19, 0, 0, 11, 0, 0, 0, 19, 15, 39,
+  5, 36, 0, 0, 0, 0, 27, 0, 8, 0,
+  65, 1, 0, 0, 39, 0, 0, 25, 36, 0,
+  0, 17, 0, 0, 33, 36, 0, 0, 0, 0,
+  22, 0, 0, 0, 0, 13, 66, 18, 0, 34,
+  0, 0, 63, 12, 74, 5, 47, 3, 0, 0,
+  82, 14, 12, 0, 5, 0, 69, 0, 12, 8,
+  0, 0, 19, 0, 0, 0, 40, 75, 0, 7,
+  0, 50, 40, 0, 68, 50, 83, 1, 0, 0,
+  0, 31, 0, 3, 20, 0, 0, 0, 0, 5,
+  0, 22, 0, 0, 22, 4, 0, 91, 26, 21,
+  0, 48, 0, 0, 1, 153, 0, 0, 66, 0,
+  33, 0, 18, 0, 0, 0, 11, 0, 112, 0,
+  0, 0, 0, 59, 0, 0, 0, 7, 0, 0,
+  0, 0, 0, 0, 9, 0, 15, 0, 36, 8,
+  0, 0, 45, 0, 0, 0, 0, 0, 6, 8,
+  0, 0, 1, 53, 30, 0, 0, 0, 16, 0,
+  0, 5, 5, 0, 72, 5, 0, 42, 10, 0,
+  150, 0, 30, 25, 71, 0, 0, 0, 50, 0,
+  12, 0, 18, 29, 81, 2, 20, 83, 0, 0,
+  0, 0, 0, 0, 29, 22, 0, 0, 11, 0,
+  22, 0, 16, 80, 7, 25, 0, 0, 0, 0,
+  0, 50, 53, 0, 0, 40, 19, 7, 0, 0,
+  0, 34, 18, 28, 0, 28, 19, 0, 0, 38,
+  0, 0, 0, 100, 0, 0, 72, 0, 56, 27,
+  67, 0, 0, 10, 0, 45, 0, 38, 0, 0,
+  0, 0, 0, 13, 35, 21, 7, 22, 0, 0,
+  0, 14, 4, 0, 18, 9, 61, 9, 0, 0,
+  33, 0, 0, 2, 69, 0, 11, 0, 0, 0,
+  29, 21, 0, 0, 0, 0, 26, 25, 0, 0,
+  0, 32, 64, 0, 0, 16, 0, 0, 50, 0,
+  17, 27, 16, 8, 0, 0, 53, 22, 0, 8,
+  0, 3, 48, 0, 28, 0, 0, 0, 12, 0,
+  0, 8, 33, 45, 0, 3, 0, 28, 37, 0,
+  73, 40, 75, 3, 0, 0, 0, 6, 0, 0,
+  38, 0, 0, 0, 0, 17, 0, 11, 18, 0,
+  45, 20, 0, 94, 30, 2, 0, 37, 0, 0,
+  0, 118, 0, 0, 57, 0, 32, 0, 52, 0,
+  0, 0, 6, 0, 65, 0, 0, 28, 0, 6,
+  0, 7, 0, 28, 10, 0, 0, 0, 0, 0,
+  20, 0, 18, 0, 66, 3, 0, 0, 33, 0,
+  0, 0, 0, 0, 0, 35, 0, 0, 33, 47,
+  0, 0, 0, 0, 30, 0, 0, 0, 0, 0,
+  68, 9, 0, 32, 0, 0, 91, 10, 53, 25,
+  59, 0, 0, 0, 63, 11, 16, 0, 8, 0,
+  33, 0, 50, 5, 0, 0, 41, 0, 0, 0,
+  30, 75, 0, 0, 0, 14, 33, 0, 50, 46,
+  16, 2, 0, 0, 0, 31, 0, 34, 0, 0,
+  0, 0, 0, 2, 0, 20, 0, 0, 0, 0,
+  0, 77, 19, 41, 0, 85, 0, 0, 0, 170,
+  0, 6, 47, 0, 22, 0, 0, 0, 0, 0,
+  0, 0, 84, 0, 0, 0, 0, 41, 0, 0,
+  0, 17, 0, 0, 0, 0, 0, 0, 22, 0,
+  8, 0, 16, 0, 0, 30, 54, 0, 23, 0,
+  0, 0, 0, 0, 8, 0, 0, 58, 30, 0,
+  2, 0, 14, 0, 12, 18, 40, 0, 63, 5,
+  0, 35, 4, 0, 159, 0, 5, 42, 83, 1,
+  29, 0, 53, 0, 1, 0, 0, 0, 0, 0,
+  1, 125, 0, 0, 0, 0, 0, 0, 59, 8,
+  0, 44, 12, 40, 18, 0, 40, 6, 0, 49,
+  0, 0, 0, 0, 0, 14, 40, 0, 0, 17,
+  0, 8, 0, 16, 0, 48, 35, 47, 0, 33,
+  1, 0, 7, 27, 0, 35, 0, 77, 28, 0,
+  14, 0, 38, 0, 36, 0, 0, 14, 0, 11,
+  0, 0, 0, 3, 8, 0, 16, 34, 27, 15,
+  0, 70, 0, 0, 0, 26, 7, 0, 14, 12,
+  42, 0, 12, 0, 8, 25, 0, 47, 52, 0,
+  15, 13, 0, 0, 17, 28, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 32, 29, 12, 0, 47,
+  0, 0, 66, 14, 50, 0, 35, 14, 18, 0,
+  67, 1, 0, 0, 0, 0, 77, 0, 0, 0,
+  2, 0, 0, 0, 0, 1, 29, 58, 0, 41,
+  0, 69, 29, 7, 59, 19, 117, 17, 0, 0,
+  0, 5, 0, 0, 15, 0, 0, 0, 0, 13,
+  0, 12, 0, 0, 66, 0, 0, 79, 32, 0,
+  0, 0, 0, 6, 0, 87, 7, 0, 39, 0,
+  49, 0, 7, 0, 0, 1, 10, 0, 77, 0,
+  0, 21, 0, 50, 0, 0, 2, 19, 0, 7,
+  0, 0, 0, 0, 19, 0, 2, 0, 62, 8,
+  0, 0, 25, 0, 0, 13, 0, 0, 16, 30,
+  0, 0, 0, 54, 3, 0, 0, 0, 20, 0,
+  0, 0, 0, 0, 62, 11, 0, 38, 13, 0,
+  89, 23, 44, 14, 34, 0, 0, 0, 57, 0,
+  15, 0, 25, 0, 64, 0, 17, 12, 0, 0,
+  23, 0, 0, 6, 16, 72, 0, 0, 0, 19,
+  42, 0, 48, 60, 61, 0, 0, 0, 0, 26,
+  0, 41, 0, 0, 0, 0, 0, 3, 0, 6,
+  0, 0, 0, 0, 0, 69, 18, 17, 0, 65,
+  0, 0, 0, 167, 0, 0, 66, 0, 29, 0,
+  4, 0, 0, 0, 24, 0, 113, 0, 0, 10,
+  0, 64, 0, 4, 0, 0, 0, 0, 0, 0,
+  0, 0, 12, 0, 12, 0, 32, 1, 0, 15,
+  43, 0, 26, 0, 0, 0, 27, 0, 11, 0,
+  0, 71, 39, 0, 0, 0, 13, 0, 0, 24,
+  30, 0, 73, 0, 0, 44, 14, 0, 155, 0,
+  5, 26, 74, 0, 0, 0, 54, 0, 0, 0,
+  0, 2, 46, 0, 14, 18, 11, 0, 12, 0,
+  0, 11, 59, 26, 0, 39, 3, 30, 27, 0,
+  68, 23, 33, 23, 0, 0, 0, 0, 0, 0,
+  61, 0, 0, 0, 0, 7, 0, 8, 0, 25,
+  64, 32, 0, 78, 13, 0, 0, 10, 0, 12,
+  0, 114, 19, 0, 44, 0, 53, 0, 52, 0,
+  0, 0, 0, 20, 19, 0, 0, 11, 0, 0,
+  0, 19, 15, 39, 5, 36, 0, 0, 0, 0,
+  27, 0, 8, 0, 65, 1, 0, 0, 39, 0,
+  0, 25, 36, 0, 0, 17, 0, 0, 33, 36,
+  0, 0, 0, 0, 22, 0, 0, 0, 0, 13,
+  66, 18, 0, 34, 0, 0, 63, 12, 74, 5,
+  47, 3, 0, 0, 82, 14, 12, 0, 5, 0,
+  69, 0, 12, 8, 0, 0, 19, 0, 0, 0,
+  40, 75, 0, 7, 0, 50, 40, 0, 68, 50,
+  83, 1, 0, 0, 0, 31, 0, 3, 20, 0,
+  0, 0, 0, 5, 0, 22, 0, 0, 22, 4,
+  0, 91, 26, 21, 0, 48, 0, 0, 1, 153,
+  0, 0, 66, 0, 33, 0, 18, 0, 0, 0,
+  11, 0, 112, 0, 0, 0, 0, 59, 0, 0,
+  0, 7, 0, 0, 0, 0, 0, 0, 9, 0,
+  15, 0, 36, 8, 0, 0, 45, 0, 0, 0,
+  0, 0, 6, 8, 0, 0, 1, 53, 30, 0,
+  0, 0, 16, 0, 0, 5, 5, 0, 72, 5,
+  0, 42, 10, 0, 150, 0, 30, 25, 71, 0,
+  0, 0, 50, 0, 12, 0, 0, 0, 9, 0,
+  23, 7, 0, 0, 42, 0, 0, 0, 8, 47,
+  0, 0, 0, 0, 32, 0, 34, 11, 0, 18,
+  0, 0, 19, 48, 0, 74, 0, 0, 9, 0,
+  0, 0, 0, 14, 0, 0, 0, 0, 0, 37,
+  0, 40, 0, 86, 0, 0, 8, 140, 13, 21,
+  34, 0, 22, 0, 0, 0, 0, 0, 0, 0,
+  51, 0, 0, 0, 0, 14, 0, 9, 0, 0,
+  0, 24, 0, 0, 0, 11, 28, 0, 0, 0,
+  0, 0, 0, 47, 50, 10, 57, 0, 0, 0,
+  10, 0, 28, 0, 0, 84, 46, 0, 26, 0,
+  7, 0, 21, 14, 59, 0, 50, 0, 0, 36,
+  7, 0, 152, 0, 0, 31, 100, 6, 74, 0,
+  41, 0, 0, 0, 0, 3, 48, 0, 28, 0,
+  0, 0, 12, 0, 0, 8, 33, 45, 0, 3,
+  0, 28, 37, 0, 73, 40, 75, 3, 0, 0,
+  0, 6, 0, 0, 38, 0, 0, 0, 0, 17,
+  0, 11, 18, 0, 45, 20, 0, 94, 30, 2,
+  0, 37, 0, 0, 0, 118, 0, 0, 57, 0,
+  32, 0, 52, 0, 0, 0, 6, 0, 65, 0,
+  0, 28, 0, 6, 0, 7, 0, 28, 10, 0,
+  0, 0, 0, 0, 20, 0, 18, 0, 66, 3,
+  0, 0, 33, 0, 0, 0, 0, 0, 0, 35,
+  0, 0, 33, 47, 0, 0, 0, 0, 30, 0,
+  0, 0, 0, 0, 68, 9, 0, 32, 0, 0,
+  91, 10, 53, 25, 59, 0, 0, 0, 63, 11,
+  16, 0, 8, 0, 33, 0, 50, 5, 0, 0,
+  41, 0, 0, 0, 30, 75, 0, 0, 0, 14,
+  33, 0, 50, 46, 16, 2, 0, 0, 0, 31,
+  0, 34, 0, 0, 0, 0, 0, 2, 0, 20,
+  0, 0, 0, 0, 0, 77, 19, 41, 0, 85,
+  0, 0, 0, 170, 0, 6, 47, 0, 22, 0,
+  0, 0, 0, 0, 0, 0, 84, 0, 0, 0,
+  0, 41, 0, 0, 0, 17, 0, 0, 0, 0,
+  0, 0, 22, 0, 8, 0, 16, 0, 0, 30,
+  54, 0, 23, 0, 0, 0, 0, 0, 8, 0,
+  0, 58, 30, 0, 2, 0, 14, 0, 12, 18,
+  40, 0, 63, 5, 0, 35, 4, 0, 159, 0,
+  5, 42, 83, 1, 29, 0, 53, 0, 1, 0,
+  0, 0, 0, 0, 8, 8, 0, 23, 35, 18,
+  0, 1, 2, 8, 0, 7, 6, 22, 10, 0,
+  3, 0, 0, 46, 0, 0, 38, 57, 0, 84,
+  0, 0, 66, 0, 0, 0, 0, 16, 0, 0,
+  0, 0, 1, 25, 24, 69, 0, 69, 0, 1,
+  25, 65, 56, 29, 12, 5, 16, 0, 0, 0,
+  0, 6, 0, 0, 0, 0, 12, 0, 0, 0,
+  0, 0, 13, 10, 0, 63, 0, 0, 0, 19,
+  57, 0, 0, 20, 0, 0, 0, 46, 34, 26,
+  87, 1, 0, 0, 7, 0, 9, 0, 0, 65,
+  36, 0, 32, 0, 1, 0, 50, 0, 55, 43,
+  17, 0, 0, 23, 0, 0, 119, 0, 0, 38,
+  90, 12, 104, 0, 46, 0, 0, 0, 0, 0,
+  77, 0, 0, 0, 2, 0, 0, 0, 0, 1,
+  29, 58, 0, 41, 0, 69, 29, 7, 59, 19,
+  117, 17, 0, 0, 0, 5, 0, 0, 15, 0,
+  0, 0, 0, 13, 0, 12, 0, 0, 66, 0,
+  0, 79, 32, 0, 0, 0, 0, 6, 0, 87,
+  7, 0, 39, 0, 49, 0, 7, 0, 0, 1,
+  10, 0, 77, 0, 0, 21, 0, 50, 0, 0,
+  2, 19, 0, 7, 0, 0, 0, 0, 19, 0,
+  2, 0, 62, 8, 0, 0, 25, 0, 0, 13,
+  0, 0, 16, 30, 0, 0, 0, 54, 3, 0,
+  0, 0, 20, 0, 0, 0, 0, 0, 62, 11,
+  0, 38, 13, 0, 89, 23, 44, 14, 34, 0,
+  0, 0, 57, 0, 15, 0, 25, 0, 64, 0,
+  17, 12, 0, 0, 23, 0, 0, 6, 16, 72,
+  0, 0, 0, 19, 42, 0, 48, 60, 61, 0,
+  0, 0, 0, 26, 0, 41, 0, 0, 0, 0,
+  0, 3, 0, 6, 0, 0, 0, 0, 0, 69,
+  18, 17, 0, 65, 0, 0, 0, 167, 0, 0,
+  66, 0, 29, 0, 4, 0, 0, 0, 24, 0,
+  113, 0, 0, 10, 0, 64, 0, 4, 0, 0,
+  0, 0, 0, 0, 0, 0, 12, 0, 12, 0,
+  32, 1, 0, 15, 43, 0, 26, 0, 0, 0,
+  27, 0, 11, 0, 0, 71, 39, 0, 0, 0,
+  13, 0, 0, 24, 30, 0, 73, 0, 0, 44,
+  14, 0, 155, 0, 5, 26, 74, 0, 0, 0,
+  54, 0, 0, 0, 0, 0, 0, 0, 12, 0,
+  0, 14, 34, 15, 0, 0, 26, 34, 0, 0,
+  0, 21, 29, 0, 8, 0, 0, 45, 0, 0,
+  48, 64, 6, 83, 0, 0, 55, 0, 0, 0,
+  0, 1, 0, 5, 0, 0, 0, 16, 10, 46,
+  0, 58, 0, 8, 7, 104, 37, 30, 33, 0,
+  15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  6, 0, 0, 19, 0, 0, 21, 0, 0, 63,
+  0, 0, 0, 9, 39, 0, 0, 13, 0, 0,
+  0, 59, 43, 21, 114, 3, 0, 0, 28, 0,
+  36, 0, 0, 91, 40, 0, 32, 0, 7, 0,
+  28, 8, 75, 20, 37, 0, 0, 8, 5, 0,
+  131, 0, 0, 37, 103, 0, 101, 0, 70, 0,
+  0, 0, 5, 0, 69, 0, 12, 8, 0, 0,
+  19, 0, 0, 0, 40, 75, 0, 7, 0, 50,
+  40, 0, 68, 50, 83, 1, 0, 0, 0, 31,
+  0, 3, 20, 0, 0, 0, 0, 5, 0, 22,
+  0, 0, 22, 4, 0, 91, 26, 21, 0, 48,
+  0, 0, 1, 153, 0, 0, 66, 0, 33, 0,
+  18, 0, 0, 0, 11, 0, 112, 0, 0, 0,
+  0, 59, 0, 0, 0, 7, 0, 0, 0, 0,
+  0, 0, 9, 0, 15, 0, 36, 8, 0, 0,
+  45, 0, 0, 0, 0, 0, 6, 8, 0, 0,
+  1, 53, 30, 0, 0, 0, 16, 0, 0, 5,
+  5, 0, 72, 5, 0, 42, 10, 0, 150, 0,
+  30, 25, 71, 0, 0, 0, 50, 0, 12, 0,
+  0, 0, 9, 0, 23, 7, 0, 0, 42, 0,
+  0, 0, 8, 47, 0, 0, 0, 0, 32, 0,
+  34, 11, 0, 18, 0, 0, 19, 48, 0, 74,
+  0, 0, 9, 0, 0, 0, 0, 14, 0, 0,
+  0, 0, 0, 37, 0, 40, 0, 86, 0, 0,
+  8, 140, 13, 21, 34, 0, 22, 0, 0, 0,
+  0, 0, 0, 0, 51, 0, 0, 0, 0, 14,
+  0, 9, 0, 0, 0, 24, 0, 0, 0, 11,
+  28, 0, 0, 0, 0, 0, 0, 47, 50, 10,
+  57, 0, 0, 0, 10, 0, 28, 0, 0, 84,
+  46, 0, 26, 0, 7, 0, 21, 14, 59, 0,
+  50, 0, 0, 36, 7, 0, 152, 0, 0, 31,
+  100, 6, 74, 0, 41, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 24, 26, 15, 20, 0, 5,
+  0, 0, 4, 23, 15, 29, 19, 5, 0, 0,
+  0, 56, 21, 39, 37, 55, 0, 52, 0, 0,
+  82, 0, 11, 0, 0, 14, 0, 19, 0, 6,
+  0, 1, 10, 45, 30, 46, 0, 40, 24, 27,
+  55, 43, 0, 0, 9, 0, 0, 42, 0, 0,
+  0, 0, 0, 0, 32, 0, 0, 0, 0, 2,
+  11, 0, 20, 67, 0, 0, 0, 27, 69, 0,
+  0, 21, 0, 0, 2, 43, 16, 39, 82, 7,
+  0, 0, 15, 0, 21, 0, 0, 53, 8, 0,
+  42, 0, 0, 0, 48, 0, 67, 45, 15, 0,
+  2, 4, 0, 0, 73, 0, 0, 11, 69, 15,
+  131, 0, 65, 0, 0, 0, 8, 0, 33, 0,
+  50, 5, 0, 0, 41, 0, 0, 0, 30, 75,
+  0, 0, 0, 14, 33, 0, 50, 46, 16, 2,
+  0, 0, 0, 31, 0, 34, 0, 0, 0, 0,
+  0, 2, 0, 20, 0, 0, 0, 0, 0, 77,
+  19, 41, 0, 85, 0, 0, 0, 170, 0, 6,
+  47, 0, 22, 0, 0, 0, 0, 0, 0, 0,
+  84, 0, 0, 0, 0, 41, 0, 0, 0, 17,
+  0, 0, 0, 0, 0, 0, 22, 0, 8, 0,
+  16, 0, 0, 30, 54, 0, 23, 0, 0, 0,
+  0, 0, 8, 0, 0, 58, 30, 0, 2, 0,
+  14, 0, 12, 18, 40, 0, 63, 5, 0, 35,
+  4, 0, 159, 0, 5, 42, 83, 1, 29, 0,
+  53, 0, 1, 0, 0, 0, 0, 0, 8, 8,
+  0, 23, 35, 18, 0, 1, 2, 8, 0, 7,
+  6, 22, 10, 0, 3, 0, 0, 46, 0, 0,
+  38, 57, 0, 84, 0, 0, 66, 0, 0, 0,
+  0, 16, 0, 0, 0, 0, 1, 25, 24, 69,
+  0, 69, 0, 1, 25, 65, 56, 29, 12, 5,
+  16, 0, 0, 0, 0, 6, 0, 0, 0, 0,
+  12, 0, 0, 0, 0, 0, 13, 10, 0, 63,
+  0, 0, 0, 19, 57, 0, 0, 20, 0, 0,
+  0, 46, 34, 26, 87, 1, 0, 0, 7, 0,
+  9, 0, 0, 65, 36, 0, 32, 0, 1, 0,
+  50, 0, 55, 43, 17, 0, 0, 23, 0, 0,
+  119, 0, 0, 38, 90, 12, 104, 0, 46, 0,
+  0, 0, 0, 20, 0, 0, 0, 0, 29, 14,
+  2, 19, 0, 0, 0, 0, 38, 41, 27, 40,
+  14, 6, 0, 0, 0, 54, 43, 60, 8, 44,
+  0, 27, 0, 0, 65, 7, 13, 0, 0, 22,
+  3, 41, 0, 34, 37, 0, 17, 26, 31, 26,
+  0, 52, 14, 29, 52, 44, 0, 0, 0, 0,
+  0, 20, 0, 0, 0, 0, 0, 10, 54, 0,
+  11, 0, 0, 0, 18, 12, 28, 41, 0, 0,
+  0, 31, 87, 0, 6, 24, 0, 0, 7, 23,
+  21, 17, 38, 3, 0, 3, 0, 15, 11, 0,
+  0, 33, 0, 2, 25, 0, 0, 0, 36, 0,
+  28, 44, 10, 0, 0, 0, 0, 0, 17, 0,
+  0, 11, 27, 15, 97, 0, 59, 0, 0, 0,
+  25, 0, 64, 0, 17, 12, 0, 0, 23, 0,
+  0, 6, 16, 72, 0, 0, 0, 19, 42, 0,
+  48, 60, 61, 0, 0, 0, 0, 26, 0, 41,
+  0, 0, 0, 0, 0, 3, 0, 6, 0, 0,
+  0, 0, 0, 69, 18, 17, 0, 65, 0, 0,
+  0, 167, 0, 0, 66, 0, 29, 0, 4, 0,
+  0, 0, 24, 0, 113, 0, 0, 10, 0, 64,
+  0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
+  12, 0, 12, 0, 32, 1, 0, 15, 43, 0,
+  26, 0, 0, 0, 27, 0, 11, 0, 0, 71,
+  39, 0, 0, 0, 13, 0, 0, 24, 30, 0,
+  73, 0, 0, 44, 14, 0, 155, 0, 5, 26,
+  74, 0, 0, 0, 54, 0, 0, 0, 0, 0,
+  0, 0, 12, 0, 0, 14, 34, 15, 0, 0,
+  26, 34, 0, 0, 0, 21, 29, 0, 8, 0,
+  0, 45, 0, 0, 48, 64, 6, 83, 0, 0,
+  55, 0, 0, 0, 0, 1, 0, 5, 0, 0,
+  0, 16, 10, 46, 0, 58, 0, 8, 7, 104,
+  37, 30, 33, 0, 15, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 6, 0, 0, 19, 0, 0,
+  21, 0, 0, 63, 0, 0, 0, 9, 39, 0,
+  0, 13, 0, 0, 0, 59, 43, 21, 114, 3,
+  0, 0, 28, 0, 36, 0, 0, 91, 40, 0,
+  32, 0, 7, 0, 28, 8, 75, 20, 37, 0,
+  0, 8, 5, 0, 131, 0, 0, 37, 103, 0,
+  101, 0, 70, 0, 0, 0, 0, 6, 23, 5,
+  0, 0, 44, 22, 34, 36, 0, 0, 1, 0,
+  0, 41, 20, 23, 3, 8, 0, 0, 0, 69,
+  18, 19, 51, 49, 164, 7, 0, 0, 85, 0,
+  15, 0, 0, 31, 6, 63, 0, 3, 29, 0,
+  23, 56, 20, 0, 0, 47, 0, 43, 48, 47,
+  7, 0, 0, 20, 0, 28, 0, 23, 0, 0,
+  0, 3, 58, 0, 2, 0, 18, 22, 54, 25,
+  23, 58, 0, 0, 0, 13, 76, 0, 7, 17,
+  0, 0, 4, 37, 62, 48, 83, 0, 0, 0,
+  8, 13, 24, 0, 0, 55, 0, 0, 26, 0,
+  38, 0, 56, 0, 44, 17, 29, 0, 10, 0,
+  0, 0, 37, 0, 0, 16, 21, 0, 77, 0,
+  71, 0, 5, 0, 0, 0, 9, 0, 23, 7,
+  0, 0, 42, 0, 0, 0, 8, 47, 0, 0,
+  0, 0, 32, 0, 34, 11, 0, 18, 0, 0,
+  19, 48, 0, 74, 0, 0, 9, 0, 0, 0,
+  0, 14, 0, 0, 0, 0, 0, 37, 0, 40,
+  0, 86, 0, 0, 8, 140, 13, 21, 34, 0,
+  22, 0, 0, 0, 0, 0, 0, 0, 51, 0,
+  0, 0, 0, 14, 0, 9, 0, 0, 0, 24,
+  0, 0, 0, 11, 28, 0, 0, 0, 0, 0,
+  0, 47, 50, 10, 57, 0, 0, 0, 10, 0,
+  28, 0, 0, 84, 46, 0, 26, 0, 7, 0,
+  21, 14, 59, 0, 50, 0, 0, 36, 7, 0,
+  152, 0, 0, 31, 100, 6, 74, 0, 41, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 24, 26,
+  15, 20, 0, 5, 0, 0, 4, 23, 15, 29,
+  19, 5, 0, 0, 0, 56, 21, 39, 37, 55,
+  0, 52, 0, 0, 82, 0, 11, 0, 0, 14,
+  0, 19, 0, 6, 0, 1, 10, 45, 30, 46,
+  0, 40, 24, 27, 55, 43, 0, 0, 9, 0,
+  0, 42, 0, 0, 0, 0, 0, 0, 32, 0,
+  0, 0, 0, 2, 11, 0, 20, 67, 0, 0,
+  0, 27, 69, 0, 0, 21, 0, 0, 2, 43,
+  16, 39, 82, 7, 0, 0, 15, 0, 21, 0,
+  0, 53, 8, 0, 42, 0, 0, 0, 48, 0,
+  67, 45, 15, 0, 2, 4, 0, 0, 73, 0,
+  0, 11, 69, 15, 131, 0, 65, 0, 0, 0,
+  0, 21, 39, 0, 0, 0, 39, 17, 22, 19,
+  5, 0, 0, 0, 20, 45, 30, 23, 5, 22,
+  0, 0, 0, 63, 27, 30, 38, 35, 115, 0,
+  0, 0, 74, 0, 11, 0, 0, 35, 3, 71,
+  0, 30, 31, 0, 4, 24, 50, 0, 0, 63,
+  18, 33, 32, 49, 0, 0, 0, 28, 0, 17,
+  6, 0, 0, 0, 0, 3, 73, 0, 42, 0,
+  0, 21, 39, 30, 32, 29, 0, 11, 0, 17,
+  87, 0, 23, 13, 0, 0, 7, 29, 62, 11,
+  41, 0, 0, 0, 0, 12, 26, 0, 0, 45,
+  0, 0, 5, 0, 19, 0, 45, 0, 16, 20,
+  23, 0, 12, 0, 0, 0, 0, 0, 0, 4,
+  0, 0, 66, 0, 50, 0, 0, 0, 0, 0,
+  0, 0, 8, 8, 0, 23, 35, 18, 0, 1,
+  2, 8, 0, 7, 6, 22, 10, 0, 3, 0,
+  0, 46, 0, 0, 38, 57, 0, 84, 0, 0,
+  66, 0, 0, 0, 0, 16, 0, 0, 0, 0,
+  1, 25, 24, 69, 0, 69, 0, 1, 25, 65,
+  56, 29, 12, 5, 16, 0, 0, 0, 0, 6,
+  0, 0, 0, 0, 12, 0, 0, 0, 0, 0,
+  13, 10, 0, 63, 0, 0, 0, 19, 57, 0,
+  0, 20, 0, 0, 0, 46, 34, 26, 87, 1,
+  0, 0, 7, 0, 9, 0, 0, 65, 36, 0,
+  32, 0, 1, 0, 50, 0, 55, 43, 17, 0,
+  0, 23, 0, 0, 119, 0, 0, 38, 90, 12,
+  104, 0, 46, 0, 0, 0, 0, 20, 0, 0,
+  0, 0, 29, 14, 2, 19, 0, 0, 0, 0,
+  38, 41, 27, 40, 14, 6, 0, 0, 0, 54,
+  43, 60, 8, 44, 0, 27, 0, 0, 65, 7,
+  13, 0, 0, 22, 3, 41, 0, 34, 37, 0,
+  17, 26, 31, 26, 0, 52, 14, 29, 52, 44,
+  0, 0, 0, 0, 0, 20, 0, 0, 0, 0,
+  0, 10, 54, 0, 11, 0, 0, 0, 18, 12,
+  28, 41, 0, 0, 0, 31, 87, 0, 6, 24,
+  0, 0, 7, 23, 21, 17, 38, 3, 0, 3,
+  0, 15, 11, 0, 0, 33, 0, 2, 25, 0,
+  0, 0, 36, 0, 28, 44, 10, 0, 0, 0,
+  0, 0, 17, 0, 0, 11, 27, 15, 97, 0,
+  59, 0, 0, 0, 0, 21, 41, 0, 0, 0,
+  50, 5, 27, 32, 0, 1, 0, 0, 18, 51,
+  26, 23, 10, 10, 0, 0, 3, 61, 32, 20,
+  24, 36, 100, 0, 0, 0, 68, 0, 15, 0,
+  0, 32, 0, 80, 0, 23, 33, 0, 0, 37,
+  49, 0, 0, 55, 6, 38, 34, 25, 3, 0,
+  7, 18, 0, 1, 6, 9, 0, 0, 0, 11,
+  56, 0, 58, 0, 18, 17, 48, 23, 33, 39,
+  0, 9, 0, 17, 86, 0, 20, 4, 0, 0,
+  14, 27, 46, 6, 34, 0, 0, 0, 0, 10,
+  3, 0, 0, 48, 0, 0, 5, 0, 21, 0,
+  43, 0, 0, 22, 7, 0, 0, 0, 0, 0,
+  0, 3, 4, 1, 0, 0, 46, 0, 47, 0,
+  0, 0, 0, 0, 0, 0, 12, 0, 0, 14,
+  34, 15, 0, 0, 26, 34, 0, 0, 0, 21,
+  29, 0, 8, 0, 0, 45, 0, 0, 48, 64,
+  6, 83, 0, 0, 55, 0, 0, 0, 0, 1,
+  0, 5, 0, 0, 0, 16, 10, 46, 0, 58,
+  0, 8, 7, 104, 37, 30, 33, 0, 15, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 6, 0,
+  0, 19, 0, 0, 21, 0, 0, 63, 0, 0,
+  0, 9, 39, 0, 0, 13, 0, 0, 0, 59,
+  43, 21, 114, 3, 0, 0, 28, 0, 36, 0,
+  0, 91, 40, 0, 32, 0, 7, 0, 28, 8,
+  75, 20, 37, 0, 0, 8, 5, 0, 131, 0,
+  0, 37, 103, 0, 101, 0, 70, 0, 0, 0,
+  0, 6, 23, 5, 0, 0, 44, 22, 34, 36,
+  0, 0, 1, 0, 0, 41, 20, 23, 3, 8,
+  0, 0, 0, 69, 18, 19, 51, 49, 164, 7,
+  0, 0, 85, 0, 15, 0, 0, 31, 6, 63,
+  0, 3, 29, 0, 23, 56, 20, 0, 0, 47,
+  0, 43, 48, 47, 7, 0, 0, 20, 0, 28,
+  0, 23, 0, 0, 0, 3, 58, 0, 2, 0,
+  18, 22, 54, 25, 23, 58, 0, 0, 0, 13,
+  76, 0, 7, 17, 0, 0, 4, 37, 62, 48,
+  83, 0, 0, 0, 8, 13, 24, 0, 0, 55,
+  0, 0, 26, 0, 38, 0, 56, 0, 44, 17,
+  29, 0, 10, 0, 0, 0, 37, 0, 0, 16,
+  21, 0, 77, 0, 71, 0, 5, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 24, 26, 15, 20, 0, 5, 0, 0,
+  4, 23, 15, 29, 19, 5, 0, 0, 0, 56,
+  21, 39, 37, 55, 0, 52, 0, 0, 82, 0,
+  11, 0, 0, 14, 0, 19, 0, 6, 0, 1,
+  10, 45, 30, 46, 0, 40, 24, 27, 55, 43,
+  0, 0, 9, 0, 0, 42, 0, 0, 0, 0,
+  0, 0, 32, 0, 0, 0, 0, 2, 11, 0,
+  20, 67, 0, 0, 0, 27, 69, 0, 0, 21,
+  0, 0, 2, 43, 16, 39, 82, 7, 0, 0,
+  15, 0, 21, 0, 0, 53, 8, 0, 42, 0,
+  0, 0, 48, 0, 67, 45, 15, 0, 2, 4,
+  0, 0, 73, 0, 0, 11, 69, 15, 131, 0,
+  65, 0, 0, 0, 0, 21, 39, 0, 0, 0,
+  39, 17, 22, 19, 5, 0, 0, 0, 20, 45,
+  30, 23, 5, 22, 0, 0, 0, 63, 27, 30,
+  38, 35, 115, 0, 0, 0, 74, 0, 11, 0,
+  0, 35, 3, 71, 0, 30, 31, 0, 4, 24,
+  50, 0, 0, 63, 18, 33, 32, 49, 0, 0,
+  0, 28, 0, 17, 6, 0, 0, 0, 0, 3,
+  73, 0, 42, 0, 0, 21, 39, 30, 32, 29,
+  0, 11, 0, 17, 87, 0, 23, 13, 0, 0,
+  7, 29, 62, 11, 41, 0, 0, 0, 0, 12,
+  26, 0, 0, 45, 0, 0, 5, 0, 19, 0,
+  45, 0, 16, 20, 23, 0, 12, 0, 0, 0,
+  0, 0, 0, 4, 0, 0, 66, 0, 50, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 20, 0, 0, 0, 0, 29, 14, 2, 19,
+  0, 0, 0, 0, 38, 41, 27, 40, 14, 6,
+  0, 0, 0, 54, 43, 60, 8, 44, 0, 27,
+  0, 0, 65, 7, 13, 0, 0, 22, 3, 41,
+  0, 34, 37, 0, 17, 26, 31, 26, 0, 52,
+  14, 29, 52, 44, 0, 0, 0, 0, 0, 20,
+  0, 0, 0, 0, 0, 10, 54, 0, 11, 0,
+  0, 0, 18, 12, 28, 41, 0, 0, 0, 31,
+  87, 0, 6, 24, 0, 0, 7, 23, 21, 17,
+  38, 3, 0, 3, 0, 15, 11, 0, 0, 33,
+  0, 2, 25, 0, 0, 0, 36, 0, 28, 44,
+  10, 0, 0, 0, 0, 0, 17, 0, 0, 11,
+  27, 15, 97, 0, 59, 0, 0, 0, 0, 21,
+  41, 0, 0, 0, 50, 5, 27, 32, 0, 1,
+  0, 0, 18, 51, 26, 23, 10, 10, 0, 0,
+  3, 61, 32, 20, 24, 36, 100, 0, 0, 0,
+  68, 0, 15, 0, 0, 32, 0, 80, 0, 23,
+  33, 0, 0, 37, 49, 0, 0, 55, 6, 38,
+  34, 25, 3, 0, 7, 18, 0, 1, 6, 9,
+  0, 0, 0, 11, 56, 0, 58, 0, 18, 17,
+  48, 23, 33, 39, 0, 9, 0, 17, 86, 0,
+  20, 4, 0, 0, 14, 27, 46, 6, 34, 0,
+  0, 0, 0, 10, 3, 0, 0, 48, 0, 0,
+  5, 0, 21, 0, 43, 0, 0, 22, 7, 0,
+  0, 0, 0, 0, 0, 3, 4, 1, 0, 0,
+  46, 0, 47, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 79, 42, 0, 0, 0, 53, 0,
+  5, 0, 0, 37, 2, 1, 18, 62, 41, 51,
+  0, 55, 86, 0, 87, 50, 0, 11, 5, 15,
+  128, 37, 1, 0, 72, 0, 36, 0, 0, 27,
+  0, 45, 39, 32, 0, 35, 80, 55, 0, 7,
+  0, 21, 12, 25, 62, 0, 16, 0, 27, 0,
+  29, 0, 13, 0, 11, 0, 0, 0, 25, 0,
+  9, 0, 3, 35, 41, 39, 37, 34, 23, 0,
+  0, 8, 79, 22, 1, 0, 0, 13, 0, 0,
+  82, 36, 0, 0, 20, 0, 0, 51, 0, 0,
+  48, 11, 5, 0, 0, 23, 29, 0, 77, 0,
+  0, 50, 18, 0, 0, 42, 0, 0, 0, 4,
+  5, 13, 24, 0, 0, 0, 28, 0, 34, 0,
+  7, 54, 57, 12, 0, 23, 17, 14, 2, 0,
+  0, 54, 68, 12, 2, 19, 58, 30, 0, 13,
+  72, 61, 94, 10, 0, 0, 0, 26, 0, 0,
+  0, 5, 68, 0, 20, 19, 0, 31, 0, 50,
+  4, 41, 0, 19, 53, 58, 0, 66, 0, 27,
+  0, 55, 24, 0, 51, 0, 26, 0, 10, 0,
+  0, 0, 0, 18, 3, 0, 0, 0, 34, 0,
+  14, 26, 9, 11, 35, 0, 48, 32, 0, 34,
+  37, 0, 35, 0, 0, 7, 0, 0, 0, 5,
+  0, 0, 0, 0, 0, 28, 25, 0, 59, 36,
+  0, 0, 14, 23, 43, 0, 49, 0, 0, 6,
+  11, 5, 0, 11, 0, 0, 8, 0, 8, 0,
+  0, 4, 5, 0, 45, 0, 20, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 59, 38, 0,
+  0, 0, 51, 10, 0, 0, 0, 39, 16, 14,
+  0, 31, 37, 50, 8, 52, 96, 0, 89, 33,
+  0, 0, 10, 17, 130, 11, 0, 0, 60, 0,
+  23, 5, 0, 27, 0, 39, 18, 30, 0, 52,
+  72, 74, 0, 1, 0, 9, 3, 38, 49, 0,
+  21, 0, 26, 0, 35, 0, 7, 0, 20, 0,
+  0, 0, 28, 0, 11, 0, 19, 32, 48, 45,
+  30, 15, 29, 8, 0, 9, 64, 8, 4, 0,
+  0, 0, 0, 0, 71, 23, 0, 0, 12, 0,
+  0, 61, 0, 0, 46, 11, 0, 0, 7, 26,
+  31, 0, 76, 0, 0, 36, 15, 0, 0, 53,
+  0, 0, 0, 21, 21, 27, 13, 0, 0, 0,
+  35, 0, 35, 0, 5, 41, 42, 14, 0, 10,
+  22, 17, 7, 0, 0, 59, 79, 18, 12, 8,
+  57, 30, 0, 8, 80, 64, 78, 4, 4, 0,
+  0, 27, 0, 0, 0, 6, 69, 0, 21, 17,
+  0, 41, 0, 56, 0, 45, 0, 25, 49, 58,
+  0, 46, 0, 36, 0, 53, 24, 7, 45, 0,
+  22, 0, 8, 0, 0, 0, 0, 27, 0, 6,
+  0, 0, 31, 0, 5, 23, 14, 9, 30, 0,
+  48, 35, 0, 35, 39, 0, 24, 0, 2, 0,
+  0, 0, 0, 6, 0, 0, 0, 3, 0, 41,
+  26, 0, 61, 31, 0, 0, 30, 12, 49, 0,
+  50, 0, 0, 4, 7, 3, 0, 14, 0, 0,
+  14, 0, 21, 1, 1, 11, 20, 0, 59, 0,
+  36, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 63, 25, 0, 12, 14, 50, 13, 5, 0,
+  0, 23, 35, 0, 0, 30, 38, 31, 5, 54,
+  55, 9, 80, 28, 0, 3, 10, 13, 116, 5,
+  0, 0, 52, 0, 36, 23, 0, 31, 3, 61,
+  0, 33, 0, 63, 55, 73, 9, 21, 0, 8,
+  0, 36, 57, 0, 2, 0, 23, 0, 17, 0,
+  5, 0, 0, 0, 6, 0, 4, 2, 29, 0,
+  67, 27, 41, 25, 49, 11, 15, 14, 0, 5,
+  68, 0, 19, 0, 11, 0, 0, 0, 45, 8,
+  0, 0, 0, 0, 0, 59, 0, 0, 45, 19,
+  0, 0, 13, 20, 31, 0, 79, 0, 0, 21,
+  1, 0, 0, 69, 0, 0, 0, 20, 30, 19,
+  9, 0, 0, 0, 44, 0, 32, 0, 1, 40,
+  20, 13, 0, 4, 30, 19, 7, 0, 0, 51,
+  83, 2, 5, 14, 52, 26, 0, 4, 59, 63,
+  73, 10, 9, 0, 0, 21, 0, 0, 0, 8,
+  79, 0, 30, 22, 0, 58, 0, 53, 0, 36,
+  0, 25, 34, 72, 4, 34, 0, 41, 0, 48,
+  26, 0, 42, 0, 22, 0, 6, 0, 0, 0,
+  0, 29, 9, 0, 0, 4, 44, 0, 36, 14,
+  25, 13, 34, 0, 45, 43, 0, 22, 40, 0,
+  24, 0, 0, 0, 0, 0, 0, 2, 0, 0,
+  0, 6, 0, 37, 22, 0, 63, 32, 0, 0,
+  27, 13, 56, 0, 49, 0, 0, 3, 0, 25,
+  0, 17, 0, 0, 5, 0, 25, 4, 6, 5,
+  11, 0, 60, 0, 35, 0, 0, 79, 42, 0,
+  0, 0, 53, 0, 5, 0, 0, 37, 2, 1,
+  18, 62, 41, 51, 0, 55, 86, 0, 87, 50,
+  0, 11, 5, 15, 128, 37, 1, 0, 72, 0,
+  36, 0, 0, 27, 0, 45, 39, 32, 0, 35,
+  80, 55, 0, 7, 0, 21, 12, 25, 62, 0,
+  16, 0, 27, 0, 29, 0, 13, 0, 11, 0,
+  0, 0, 25, 0, 9, 0, 3, 35, 41, 39,
+  37, 34, 23, 0, 0, 8, 79, 22, 1, 0,
+  0, 13, 0, 0, 82, 36, 0, 0, 20, 0,
+  0, 51, 0, 0, 48, 11, 5, 0, 0, 23,
+  29, 0, 77, 0, 0, 50, 18, 0, 0, 42,
+  0, 0, 0, 4, 5, 13, 24, 0, 0, 0,
+  28, 0, 34, 0, 7, 54, 57, 12, 0, 23,
+  17, 14, 2, 0, 0, 54, 68, 12, 2, 19,
+  58, 30, 0, 13, 72, 61, 94, 10, 0, 0,
+  0, 26, 0, 0, 0, 5, 68, 0, 20, 19,
+  0, 31, 0, 50, 4, 41, 0, 19, 53, 58,
+  0, 66, 0, 27, 0, 55, 24, 0, 51, 0,
+  26, 0, 10, 0, 0, 0, 0, 18, 3, 0,
+  0, 0, 34, 0, 14, 26, 9, 11, 35, 0,
+  48, 32, 0, 34, 37, 0, 35, 0, 0, 7,
+  0, 0, 0, 5, 0, 0, 0, 0, 0, 28,
+  25, 0, 59, 36, 0, 0, 14, 23, 43, 0,
+  49, 0, 0, 6, 11, 5, 0, 11, 0, 0,
+  8, 0, 8, 0, 0, 4, 5, 0, 45, 0,
+  20, 0, 10, 27, 29, 24, 0, 21, 22, 22,
+  24, 0, 0, 43, 79, 0, 6, 26, 56, 0,
+  0, 0, 0, 87, 1, 0, 41, 0, 0, 30,
+  0, 1, 0, 60, 72, 0, 24, 0, 0, 23,
+  0, 54, 0, 47, 13, 10, 23, 49, 26, 18,
+  0, 30, 0, 52, 4, 24, 54, 0, 32, 0,
+  10, 0, 1, 11, 0, 48, 0, 8, 0, 0,
+  39, 0, 18, 26, 11, 0, 0, 2, 47, 27,
+  0, 46, 24, 0, 46, 46, 0, 0, 13, 0,
+  0, 18, 0, 0, 0, 23, 0, 24, 55, 0,
+  15, 78, 0, 0, 25, 19, 40, 0, 26, 0,
+  5, 0, 17, 8, 0, 0, 0, 0, 7, 0,
+  0, 4, 0, 11, 36, 0, 55, 0, 17, 0,
+  0, 59, 38, 0, 0, 0, 51, 10, 0, 0,
+  0, 39, 16, 14, 0, 31, 37, 50, 8, 52,
+  96, 0, 89, 33, 0, 0, 10, 17, 130, 11,
+  0, 0, 60, 0, 23, 5, 0, 27, 0, 39,
+  18, 30, 0, 52, 72, 74, 0, 1, 0, 9,
+  3, 38, 49, 0, 21, 0, 26, 0, 35, 0,
+  7, 0, 20, 0, 0, 0, 28, 0, 11, 0,
+  19, 32, 48, 45, 30, 15, 29, 8, 0, 9,
+  64, 8, 4, 0, 0, 0, 0, 0, 71, 23,
+  0, 0, 12, 0, 0, 61, 0, 0, 46, 11,
+  0, 0, 7, 26, 31, 0, 76, 0, 0, 36,
+  15, 0, 0, 53, 0, 0, 0, 21, 21, 27,
+  13, 0, 0, 0, 35, 0, 35, 0, 5, 41,
+  42, 14, 0, 10, 22, 17, 7, 0, 0, 59,
+  79, 18, 12, 8, 57, 30, 0, 8, 80, 64,
+  78, 4, 4, 0, 0, 27, 0, 0, 0, 6,
+  69, 0, 21, 17, 0, 41, 0, 56, 0, 45,
+  0, 25, 49, 58, 0, 46, 0, 36, 0, 53,
+  24, 7, 45, 0, 22, 0, 8, 0, 0, 0,
+  0, 27, 0, 6, 0, 0, 31, 0, 5, 23,
+  14, 9, 30, 0, 48, 35, 0, 35, 39, 0,
+  24, 0, 2, 0, 0, 0, 0, 6, 0, 0,
+  0, 3, 0, 41, 26, 0, 61, 31, 0, 0,
+  30, 12, 49, 0, 50, 0, 0, 4, 7, 3,
+  0, 14, 0, 0, 14, 0, 21, 1, 1, 11,
+  20, 0, 59, 0, 36, 0, 7, 20, 30, 33,
+  0, 25, 20, 19, 31, 0, 0, 42, 85, 0,
+  9, 30, 51, 0, 0, 0, 0, 86, 1, 3,
+  48, 0, 0, 38, 0, 0, 0, 59, 74, 0,
+  25, 0, 0, 26, 0, 62, 0, 45, 16, 10,
+  25, 48, 31, 10, 0, 42, 0, 48, 3, 27,
+  52, 0, 29, 0, 9, 0, 0, 10, 0, 42,
+  0, 8, 0, 0, 37, 0, 14, 27, 13, 0,
+  0, 2, 45, 38, 0, 45, 25, 0, 49, 45,
+  0, 0, 20, 0, 0, 19, 0, 0, 0, 17,
+  0, 27, 57, 0, 16, 73, 0, 0, 26, 12,
+  40, 0, 28, 0, 0, 0, 14, 3, 0, 0,
+  0, 0, 11, 0, 0, 9, 2, 6, 37, 0,
+  65, 0, 15, 0, 0, 63, 25, 0, 12, 14,
+  50, 13, 5, 0, 0, 23, 35, 0, 0, 30,
+  38, 31, 5, 54, 55, 9, 80, 28, 0, 3,
+  10, 13, 116, 5, 0, 0, 52, 0, 36, 23,
+  0, 31, 3, 61, 0, 33, 0, 63, 55, 73,
+  9, 21, 0, 8, 0, 36, 57, 0, 2, 0,
+  23, 0, 17, 0, 5, 0, 0, 0, 6, 0,
+  4, 2, 29, 0, 67, 27, 41, 25, 49, 11,
+  15, 14, 0, 5, 68, 0, 19, 0, 11, 0,
+  0, 0, 45, 8, 0, 0, 0, 0, 0, 59,
+  0, 0, 45, 19, 0, 0, 13, 20, 31, 0,
+  79, 0, 0, 21, 1, 0, 0, 69, 0, 0,
+  0, 20, 30, 19, 9, 0, 0, 0, 44, 0,
+  32, 0, 1, 40, 20, 13, 0, 4, 30, 19,
+  7, 0, 0, 51, 83, 2, 5, 14, 52, 26,
+  0, 4, 59, 63, 73, 10, 9, 0, 0, 21,
+  0, 0, 0, 8, 79, 0, 30, 22, 0, 58,
+  0, 53, 0, 36, 0, 25, 34, 72, 4, 34,
+  0, 41, 0, 48, 26, 0, 42, 0, 22, 0,
+  6, 0, 0, 0, 0, 29, 9, 0, 0, 4,
+  44, 0, 36, 14, 25, 13, 34, 0, 45, 43,
+  0, 22, 40, 0, 24, 0, 0, 0, 0, 0,
+  0, 2, 0, 0, 0, 6, 0, 37, 22, 0,
+  63, 32, 0, 0, 27, 13, 56, 0, 49, 0,
+  0, 3, 0, 25, 0, 17, 0, 0, 5, 0,
+  25, 4, 6, 5, 11, 0, 60, 0, 35, 0,
+  2, 21, 34, 36, 0, 20, 23, 15, 27, 0,
+  0, 35, 85, 0, 12, 34, 49, 0, 0, 0,
+  0, 85, 1, 4, 48, 0, 0, 34, 0, 0,
+  0, 54, 82, 0, 29, 0, 0, 33, 0, 60,
+  0, 43, 14, 7, 23, 47, 31, 6, 0, 53,
+  0, 47, 6, 21, 54, 0, 28, 0, 6, 0,
+  3, 7, 0, 44, 0, 7, 0, 0, 39, 0,
+  13, 26, 14, 0, 0, 6, 45, 37, 0, 39,
+  28, 0, 49, 43, 0, 0, 21, 0, 0, 21,
+  1, 0, 0, 13, 0, 26, 58, 0, 13, 70,
+  1, 0, 22, 11, 31, 0, 26, 0, 0, 0,
+  14, 14, 0, 0, 0, 0, 7, 0, 0, 13,
+  6, 6, 31, 0, 67, 0, 13, 0, 7, 54,
+  57, 12, 0, 23, 17, 14, 2, 0, 0, 54,
+  68, 12, 2, 19, 58, 30, 0, 13, 72, 61,
+  94, 10, 0, 0, 0, 26, 0, 0, 0, 5,
+  68, 0, 20, 19, 0, 31, 0, 50, 4, 41,
+  0, 19, 53, 58, 0, 66, 0, 27, 0, 55,
+  24, 0, 51, 0, 26, 0, 10, 0, 0, 0,
+  0, 18, 3, 0, 0, 0, 34, 0, 14, 26,
+  9, 11, 35, 0, 48, 32, 0, 34, 37, 0,
+  35, 0, 0, 7, 0, 0, 0, 5, 0, 0,
+  0, 0, 0, 28, 25, 0, 59, 36, 0, 0,
+  14, 23, 43, 0, 49, 0, 0, 6, 11, 5,
+  0, 11, 0, 0, 8, 0, 8, 0, 0, 4,
+  5, 0, 45, 0, 20, 0, 10, 27, 29, 24,
+  0, 21, 22, 22, 24, 0, 0, 43, 79, 0,
+  6, 26, 56, 0, 0, 0, 0, 87, 1, 0,
+  41, 0, 0, 30, 0, 1, 0, 60, 72, 0,
+  24, 0, 0, 23, 0, 54, 0, 47, 13, 10,
+  23, 49, 26, 18, 0, 30, 0, 52, 4, 24,
+  54, 0, 32, 0, 10, 0, 1, 11, 0, 48,
+  0, 8, 0, 0, 39, 0, 18, 26, 11, 0,
+  0, 2, 47, 27, 0, 46, 24, 0, 46, 46,
+  0, 0, 13, 0, 0, 18, 0, 0, 0, 23,
+  0, 24, 55, 0, 15, 78, 0, 0, 25, 19,
+  40, 0, 26, 0, 5, 0, 17, 8, 0, 0,
+  0, 0, 7, 0, 0, 4, 0, 11, 36, 0,
+  55, 0, 17, 0, 0, 0, 0, 7, 0, 153,
+  0, 0, 0, 0, 0, 29, 38, 0, 0, 1,
+  3, 0, 0, 0, 24, 93, 13, 16, 0, 0,
+  0, 0, 0, 19, 0, 24, 31, 29, 0, 8,
+  0, 29, 0, 45, 0, 25, 0, 49, 3, 74,
+  23, 63, 0, 7, 0, 55, 0, 0, 19, 0,
+  43, 0, 36, 0, 0, 49, 0, 0, 76, 0,
+  0, 27, 37, 0, 74, 15, 23, 0, 0, 20,
+  11, 20, 0, 34, 35, 0, 40, 53, 0, 0,
+  16, 0, 0, 0, 0, 13, 0, 0, 26, 27,
+  0, 0, 0, 73, 26, 0, 0, 26, 12, 0,
+  22, 0, 0, 0, 6, 0, 0, 16, 0, 0,
+  114, 0, 19, 9, 0, 0, 0, 0, 29, 0,
+  0, 0, 5, 41, 42, 14, 0, 10, 22, 17,
+  7, 0, 0, 59, 79, 18, 12, 8, 57, 30,
+  0, 8, 80, 64, 78, 4, 4, 0, 0, 27,
+  0, 0, 0, 6, 69, 0, 21, 17, 0, 41,
+  0, 56, 0, 45, 0, 25, 49, 58, 0, 46,
+  0, 36, 0, 53, 24, 7, 45, 0, 22, 0,
+  8, 0, 0, 0, 0, 27, 0, 6, 0, 0,
+  31, 0, 5, 23, 14, 9, 30, 0, 48, 35,
+  0, 35, 39, 0, 24, 0, 2, 0, 0, 0,
+  0, 6, 0, 0, 0, 3, 0, 41, 26, 0,
+  61, 31, 0, 0, 30, 12, 49, 0, 50, 0,
+  0, 4, 7, 3, 0, 14, 0, 0, 14, 0,
+  21, 1, 1, 11, 20, 0, 59, 0, 36, 0,
+  7, 20, 30, 33, 0, 25, 20, 19, 31, 0,
+  0, 42, 85, 0, 9, 30, 51, 0, 0, 0,
+  0, 86, 1, 3, 48, 0, 0, 38, 0, 0,
+  0, 59, 74, 0, 25, 0, 0, 26, 0, 62,
+  0, 45, 16, 10, 25, 48, 31, 10, 0, 42,
+  0, 48, 3, 27, 52, 0, 29, 0, 9, 0,
+  0, 10, 0, 42, 0, 8, 0, 0, 37, 0,
+  14, 27, 13, 0, 0, 2, 45, 38, 0, 45,
+  25, 0, 49, 45, 0, 0, 20, 0, 0, 19,
+  0, 0, 0, 17, 0, 27, 57, 0, 16, 73,
+  0, 0, 26, 12, 40, 0, 28, 0, 0, 0,
+  14, 3, 0, 0, 0, 0, 11, 0, 0, 9,
+  2, 6, 37, 0, 65, 0, 15, 0, 0, 0,
+  0, 14, 0, 156, 0, 0, 5, 0, 0, 33,
+  46, 0, 0, 1, 2, 0, 0, 0, 35, 87,
+  15, 22, 9, 0, 0, 0, 0, 4, 0, 26,
+  27, 34, 0, 10, 0, 25, 0, 45, 0, 20,
+  0, 52, 5, 80, 36, 57, 0, 13, 0, 53,
+  0, 0, 18, 0, 38, 0, 42, 0, 0, 46,
+  0, 0, 78, 0, 0, 21, 42, 0, 77, 17,
+  26, 0, 0, 15, 17, 17, 0, 33, 33, 0,
+  40, 55, 0, 0, 30, 0, 0, 0, 0, 21,
+  0, 0, 19, 31, 0, 0, 3, 65, 28, 0,
+  0, 21, 9, 0, 22, 0, 0, 0, 0, 0,
+  0, 12, 0, 0, 106, 0, 25, 11, 0, 0,
+  0, 0, 36, 0, 0, 0, 1, 40, 20, 13,
+  0, 4, 30, 19, 7, 0, 0, 51, 83, 2,
+  5, 14, 52, 26, 0, 4, 59, 63, 73, 10,
+  9, 0, 0, 21, 0, 0, 0, 8, 79, 0,
+  30, 22, 0, 58, 0, 53, 0, 36, 0, 25,
+  34, 72, 4, 34, 0, 41, 0, 48, 26, 0,
+  42, 0, 22, 0, 6, 0, 0, 0, 0, 29,
+  9, 0, 0, 4, 44, 0, 36, 14, 25, 13,
+  34, 0, 45, 43, 0, 22, 40, 0, 24, 0,
+  0, 0, 0, 0, 0, 2, 0, 0, 0, 6,
+  0, 37, 22, 0, 63, 32, 0, 0, 27, 13,
+  56, 0, 49, 0, 0, 3, 0, 25, 0, 17,
+  0, 0, 5, 0, 25, 4, 6, 5, 11, 0,
+  60, 0, 35, 0, 2, 21, 34, 36, 0, 20,
+  23, 15, 27, 0, 0, 35, 85, 0, 12, 34,
+  49, 0, 0, 0, 0, 85, 1, 4, 48, 0,
+  0, 34, 0, 0, 0, 54, 82, 0, 29, 0,
+  0, 33, 0, 60, 0, 43, 14, 7, 23, 47,
+  31, 6, 0, 53, 0, 47, 6, 21, 54, 0,
+  28, 0, 6, 0, 3, 7, 0, 44, 0, 7,
+  0, 0, 39, 0, 13, 26, 14, 0, 0, 6,
+  45, 37, 0, 39, 28, 0, 49, 43, 0, 0,
+  21, 0, 0, 21, 1, 0, 0, 13, 0, 26,
+  58, 0, 13, 70, 1, 0, 22, 11, 31, 0,
+  26, 0, 0, 0, 14, 14, 0, 0, 0, 0,
+  7, 0, 0, 13, 6, 6, 31, 0, 67, 0,
+  13, 0, 0, 0, 0, 11, 0, 155, 2, 0,
+  5, 0, 0, 33, 42, 0, 0, 4, 0, 0,
+  0, 0, 32, 92, 22, 17, 9, 0, 0, 0,
+  0, 2, 0, 29, 24, 28, 0, 10, 0, 29,
+  0, 42, 0, 20, 0, 60, 3, 77, 36, 51,
+  0, 12, 0, 54, 0, 0, 17, 0, 44, 0,
+  43, 0, 0, 51, 0, 0, 85, 0, 0, 21,
+  43, 0, 79, 15, 29, 0, 0, 19, 21, 15,
+  0, 25, 34, 0, 39, 58, 0, 0, 33, 0,
+  0, 0, 0, 21, 2, 0, 11, 36, 0, 0,
+  0, 60, 36, 0, 0, 18, 9, 0, 23, 0,
+  0, 0, 0, 0, 0, 9, 0, 0, 107, 0,
+  27, 18, 0, 1, 0, 0, 40, 0, 0, 0,
+  10, 27, 29, 24, 0, 21, 22, 22, 24, 0,
+  0, 43, 79, 0, 6, 26, 56, 0, 0, 0,
+  0, 87, 1, 0, 41, 0, 0, 30, 0, 1,
+  0, 60, 72, 0, 24, 0, 0, 23, 0, 54,
+  0, 47, 13, 10, 23, 49, 26, 18, 0, 30,
+  0, 52, 4, 24, 54, 0, 32, 0, 10, 0,
+  1, 11, 0, 48, 0, 8, 0, 0, 39, 0,
+  18, 26, 11, 0, 0, 2, 47, 27, 0, 46,
+  24, 0, 46, 46, 0, 0, 13, 0, 0, 18,
+  0, 0, 0, 23, 0, 24, 55, 0, 15, 78,
+  0, 0, 25, 19, 40, 0, 26, 0, 5, 0,
+  17, 8, 0, 0, 0, 0, 7, 0, 0, 4,
+  0, 11, 36, 0, 55, 0, 17, 0, 0, 0,
+  0, 7, 0, 153, 0, 0, 0, 0, 0, 29,
+  38, 0, 0, 1, 3, 0, 0, 0, 24, 93,
+  13, 16, 0, 0, 0, 0, 0, 19, 0, 24,
+  31, 29, 0, 8, 0, 29, 0, 45, 0, 25,
+  0, 49, 3, 74, 23, 63, 0, 7, 0, 55,
+  0, 0, 19, 0, 43, 0, 36, 0, 0, 49,
+  0, 0, 76, 0, 0, 27, 37, 0, 74, 15,
+  23, 0, 0, 20, 11, 20, 0, 34, 35, 0,
+  40, 53, 0, 0, 16, 0, 0, 0, 0, 13,
+  0, 0, 26, 27, 0, 0, 0, 73, 26, 0,
+  0, 26, 12, 0, 22, 0, 0, 0, 6, 0,
+  0, 16, 0, 0, 114, 0, 19, 9, 0, 0,
+  0, 0, 29, 0, 0, 0, 0, 17, 0, 0,
+  0, 31, 35, 0, 13, 0, 8, 0, 56, 4,
+  16, 62, 36, 39, 10, 0, 30, 0, 0, 48,
+  4, 53, 0, 4, 0, 15, 0, 0, 72, 44,
+  0, 0, 0, 0, 0, 66, 0, 41, 0, 43,
+  20, 12, 12, 36, 0, 41, 0, 7, 95, 16,
+  0, 0, 21, 0, 0, 55, 9, 0, 0, 0,
+  0, 0, 32, 12, 11, 0, 0, 0, 0, 15,
+  10, 55, 0, 0, 0, 47, 64, 4, 32, 22,
+  15, 0, 7, 27, 13, 34, 54, 16, 0, 11,
+  39, 32, 0, 0, 0, 68, 22, 0, 0, 0,
+  0, 0, 48, 0, 0, 30, 26, 15, 0, 27,
+  0, 0, 25, 30, 24, 3, 1, 0, 121, 0,
+  65, 2, 0, 0, 7, 20, 30, 33, 0, 25,
+  20, 19, 31, 0, 0, 42, 85, 0, 9, 30,
+  51, 0, 0, 0, 0, 86, 1, 3, 48, 0,
+  0, 38, 0, 0, 0, 59, 74, 0, 25, 0,
+  0, 26, 0, 62, 0, 45, 16, 10, 25, 48,
+  31, 10, 0, 42, 0, 48, 3, 27, 52, 0,
+  29, 0, 9, 0, 0, 10, 0, 42, 0, 8,
+  0, 0, 37, 0, 14, 27, 13, 0, 0, 2,
+  45, 38, 0, 45, 25, 0, 49, 45, 0, 0,
+  20, 0, 0, 19, 0, 0, 0, 17, 0, 27,
+  57, 0, 16, 73, 0, 0, 26, 12, 40, 0,
+  28, 0, 0, 0, 14, 3, 0, 0, 0, 0,
+  11, 0, 0, 9, 2, 6, 37, 0, 65, 0,
+  15, 0, 0, 0, 0, 14, 0, 156, 0, 0,
+  5, 0, 0, 33, 46, 0, 0, 1, 2, 0,
+  0, 0, 35, 87, 15, 22, 9, 0, 0, 0,
+  0, 4, 0, 26, 27, 34, 0, 10, 0, 25,
+  0, 45, 0, 20, 0, 52, 5, 80, 36, 57,
+  0, 13, 0, 53, 0, 0, 18, 0, 38, 0,
+  42, 0, 0, 46, 0, 0, 78, 0, 0, 21,
+  42, 0, 77, 17, 26, 0, 0, 15, 17, 17,
+  0, 33, 33, 0, 40, 55, 0, 0, 30, 0,
+  0, 0, 0, 21, 0, 0, 19, 31, 0, 0,
+  3, 65, 28, 0, 0, 21, 9, 0, 22, 0,
+  0, 0, 0, 0, 0, 12, 0, 0, 106, 0,
+  25, 11, 0, 0, 0, 0, 36, 0, 0, 0,
+  0, 20, 0, 0, 0, 35, 28, 0, 25, 0,
+  6, 0, 68, 1, 9, 53, 37, 38, 8, 0,
+  43, 0, 0, 43, 7, 56, 0, 4, 0, 13,
+  10, 0, 65, 53, 0, 0, 0, 0, 0, 56,
+  0, 63, 0, 42, 23, 10, 1, 49, 0, 48,
+  0, 7, 80, 24, 0, 0, 14, 0, 0, 62,
+  18, 0, 0, 0, 0, 0, 30, 19, 15, 0,
+  0, 0, 0, 17, 1, 53, 0, 0, 0, 49,
+  63, 0, 24, 24, 20, 0, 11, 25, 0, 37,
+  36, 32, 0, 13, 32, 35, 0, 0, 0, 66,
+  17, 0, 0, 0, 0, 0, 37, 0, 0, 36,
+  37, 19, 0, 29, 0, 0, 14, 20, 42, 8,
+  3, 0, 121, 0, 63, 0, 10, 0, 2, 21,
+  34, 36, 0, 20, 23, 15, 27, 0, 0, 35,
+  85, 0, 12, 34, 49, 0, 0, 0, 0, 85,
+  1, 4, 48, 0, 0, 34, 0, 0, 0, 54,
+  82, 0, 29, 0, 0, 33, 0, 60, 0, 43,
+  14, 7, 23, 47, 31, 6, 0, 53, 0, 47,
+  6, 21, 54, 0, 28, 0, 6, 0, 3, 7,
+  0, 44, 0, 7, 0, 0, 39, 0, 13, 26,
+  14, 0, 0, 6, 45, 37, 0, 39, 28, 0,
+  49, 43, 0, 0, 21, 0, 0, 21, 1, 0,
+  0, 13, 0, 26, 58, 0, 13, 70, 1, 0,
+  22, 11, 31, 0, 26, 0, 0, 0, 14, 14,
+  0, 0, 0, 0, 7, 0, 0, 13, 6, 6,
+  31, 0, 67, 0, 13, 0, 0, 0, 0, 11,
+  0, 155, 2, 0, 5, 0, 0, 33, 42, 0,
+  0, 4, 0, 0, 0, 0, 32, 92, 22, 17,
+  9, 0, 0, 0, 0, 2, 0, 29, 24, 28,
+  0, 10, 0, 29, 0, 42, 0, 20, 0, 60,
+  3, 77, 36, 51, 0, 12, 0, 54, 0, 0,
+  17, 0, 44, 0, 43, 0, 0, 51, 0, 0,
+  85, 0, 0, 21, 43, 0, 79, 15, 29, 0,
+  0, 19, 21, 15, 0, 25, 34, 0, 39, 58,
+  0, 0, 33, 0, 0, 0, 0, 21, 2, 0,
+  11, 36, 0, 0, 0, 60, 36, 0, 0, 18,
+  9, 0, 23, 0, 0, 0, 0, 0, 0, 9,
+  0, 0, 107, 0, 27, 18, 0, 1, 0, 0,
+  40, 0, 0, 0, 0, 14, 0, 0, 0, 35,
+  30, 0, 24, 0, 0, 0, 74, 10, 3, 49,
+  34, 40, 11, 0, 46, 0, 0, 43, 6, 57,
+  0, 0, 0, 6, 17, 0, 60, 46, 0, 0,
+  0, 6, 0, 50, 0, 54, 0, 49, 22, 10,
+  0, 35, 0, 41, 0, 4, 78, 9, 0, 0,
+  19, 0, 0, 64, 27, 0, 0, 0, 0, 0,
+  28, 16, 10, 0, 0, 1, 0, 26, 0, 65,
+  0, 0, 0, 35, 53, 4, 18, 31, 20, 0,
+  14, 26, 7, 35, 30, 32, 0, 14, 17, 31,
+  0, 0, 0, 53, 24, 0, 0, 0, 0, 0,
+  40, 0, 0, 48, 34, 9, 0, 29, 0, 0,
+  32, 21, 47, 17, 0, 5, 113, 0, 63, 0,
+  10, 0,
+};
+
+unsigned char b_data[b_count] = {
+  82, 81, 82, 72, 70, 90, 88, 77, 85, 68,
+  76, 88, 77, 90, 86, 94, 88, 88, 78, 74,
+  89, 80, 75, 81, 70, 89, 81, 77, 93, 95,
+  70, 81, 109, 71, 77, 80, 80, 94, 95, 95,
+  87, 87, 77, 73, 97, 75, 91, 92, 80, 90,
+  92, 79, 162, 95, 75, 87, 99, 86, 82, 72,
+  70, 84, 85, 80, 86, 75, 79, 68, 90, 94,
+  84, 79, 81, 75, 84, 94, 91, 88, 90, 87,
+  101, 72, 84, 76, 62, 82, 80, 81, 81, 65,
+  90, 85, 83, 72, 80, 81, 85, 88, 79, 101,
+  85, 86, 81, 70, 84, 89, 79, 72, 90, 62,
+  97, 90, 70, 79, 80, 83, 78, 86, 78, 88,
+  73, 85, 71, 68, 87, 66, 65, 83, 83, 77,
+  80, 77, 68, 81, 87, 81, 88, 68, 71, 89,
+  88, 85, 88, 94, 87, 93, 75, 76, 87, 80,
+  79, 80, 73, 96, 83, 74, 87, 88, 73, 80,
+  107, 71, 80, 84, 78, 93, 93, 93, 88, 86,
+  88, 71, 96, 78, 94, 85, 78, 91, 86, 77,
+  167, 91, 77, 86, 99, 83, 85, 76, 67, 88,
+  85, 81, 83, 76, 81, 76, 89, 92, 83, 74,
+  83, 75, 86, 89, 87, 90, 92, 87, 93, 64,
+  84, 79, 66, 81, 80, 80, 82, 65, 85, 84,
+  76, 75, 81, 82, 82, 88, 83, 97, 79, 87,
+  95, 71, 90, 86, 83, 76, 89, 57, 94, 89,
+  75, 82, 84, 84, 83, 86, 85, 92, 73, 83,
+  72, 70, 89, 66, 65, 83, 83, 68, 79, 74,
+  71, 80, 90, 76, 83, 67, 75, 86, 81, 88,
+  92, 93, 86, 91, 76, 74, 81, 81, 88, 78,
+  74, 91, 82, 75, 92, 83, 74, 77, 107, 73,
+  79, 76, 76, 91, 92, 87, 88, 86, 90, 71,
+  93, 74, 86, 88, 82, 89, 90, 75, 157, 90,
+  75, 87, 94, 89, 82, 74, 70, 83, 85, 79,
+  88, 76, 79, 71, 87, 91, 87, 79, 79, 78,
+  83, 96, 90, 93, 92, 86, 101, 69, 80, 75,
+  60, 79, 83, 84, 80, 64, 85, 87, 85, 74,
+  81, 84, 84, 90, 78, 96, 86, 85, 82, 70,
+  90, 85, 80, 73, 87, 63, 90, 90, 67, 78,
+  85, 79, 87, 86, 75, 86, 72, 84, 73, 70,
+  86, 68, 67, 82, 84, 86, 80, 69, 69, 90,
+  80, 72, 88, 70, 77, 85, 82, 83, 84, 93,
+  91, 84, 77, 77, 84, 79, 78, 86, 74, 84,
+  79, 77, 86, 92, 78, 79, 105, 73, 82, 80,
+  83, 86, 91, 92, 86, 87, 80, 76, 96, 78,
+  97, 93, 78, 93, 96, 81, 169, 88, 72, 91,
+  100, 88, 79, 74, 74, 87, 81, 80, 84, 74,
+  77, 72, 83, 94, 86, 78, 84, 72, 86, 94,
+  86, 88, 82, 86, 97, 73, 82, 79, 64, 77,
+  78, 83, 79, 73, 94, 85, 82, 68, 78, 75,
+  80, 90, 85, 93, 83, 89, 94, 68, 87, 80,
+  80, 76, 93, 70, 87, 91, 75, 85, 85, 82,
+  85, 82, 84, 92, 77, 86, 70, 71, 83, 79,
+  69, 80, 83, 83, 84, 73, 64, 82, 81, 73,
+  94, 73, 75, 85, 91, 81, 88, 99, 90, 94,
+  72, 81, 88, 80, 82, 87, 77, 89, 82, 76,
+  80, 85, 82, 77, 103, 72, 82, 85, 86, 90,
+  85, 89, 90, 85, 85, 76, 94, 77, 100, 85,
+  75, 97, 92, 77, 183, 83, 76, 89, 101, 85,
+  81, 79, 70, 89, 81, 80, 79, 70, 79, 78,
+  79, 92, 83, 73, 84, 67, 86, 91, 83, 92,
+  78, 84, 90, 65, 82, 77, 68, 76, 78, 81,
+  79, 79, 95, 83, 73, 67, 81, 74, 74, 89,
+  89, 91, 74, 88, 110, 70, 90, 81, 85, 81,
+  92, 66, 82, 88, 78, 85, 88, 84, 86, 83,
+  95, 96, 77, 83, 76, 74, 86, 79, 69, 77,
+  84, 76, 85, 73, 71, 78, 84, 71, 87, 71,
+  76, 82, 81, 87, 94, 90, 89, 87, 75, 78,
+  83, 81, 89, 86, 77, 85, 83, 75, 86, 87,
+  85, 74, 102, 74, 84, 80, 82, 85, 87, 86,
+  89, 87, 81, 72, 91, 71, 92, 87, 82, 92,
+  94, 77, 162, 86, 73, 88, 93, 92, 79, 77,
+  74, 83, 81, 81, 83, 75, 83, 73, 82, 93,
+  85, 76, 81, 79, 85, 95, 88, 95, 80, 87,
+  97, 72, 79, 79, 65, 78, 85, 86, 80, 73,
+  90, 86, 84, 71, 79, 79, 80, 92, 82, 89,
+  89, 85, 93, 69, 89, 79, 83, 76, 90, 69,
+  82, 91, 72, 79, 88, 82, 87, 81, 83, 92,
+  76, 87, 73, 73, 84, 81, 72, 81, 83, 91,
+  85, 74, 76, 89, 85, 67, 84, 71, 85, 82,
+  78, 89, 91, 88, 96, 75, 81, 74, 69, 76,
+  85, 84, 74, 80, 75, 76, 91, 86, 73, 82,
+  102, 73, 81, 78, 86, 87, 92, 97, 84, 91,
+  81, 80, 96, 78, 93, 92, 81, 88, 94, 80,
+  163, 88, 68, 87, 101, 90, 76, 68, 83, 90,
+  81, 83, 83, 73, 85, 72, 81, 97, 92, 84,
+  85, 79, 84, 96, 89, 89, 84, 89, 97, 81,
+  80, 76, 63, 80, 81, 88, 81, 78, 84, 96,
+  85, 66, 75, 83, 84, 93, 84, 96, 92, 89,
+  81, 71, 82, 82, 77, 74, 91, 70, 84, 91,
+  68, 83, 81, 79, 84, 77, 74, 83, 80, 88,
+  69, 71, 82, 85, 70, 84, 85, 85, 90, 76,
+  73, 86, 81, 70, 87, 71, 84, 84, 84, 92,
+  95, 92, 98, 83, 79, 76, 78, 78, 90, 84,
+  79, 81, 80, 77, 86, 82, 76, 78, 103, 76,
+  82, 83, 92, 88, 89, 94, 84, 88, 77, 76,
+  94, 74, 95, 91, 78, 95, 93, 77, 164, 86,
+  74, 86, 101, 87, 76, 74, 83, 90, 85, 86,
+  77, 73, 89, 76, 77, 102, 83, 81, 86, 76,
+  83, 95, 88, 93, 83, 89, 90, 77, 81, 82,
+  66, 82, 80, 86, 81, 82, 87, 94, 80, 67,
+  77, 82, 77, 91, 89, 94, 92, 90, 87, 73,
+  81, 79, 78, 79, 90, 68, 81, 86, 69, 85,
+  80, 82, 85, 79, 85, 86, 79, 89, 74, 71,
+  83, 90, 72, 83, 86, 77, 91, 78, 76, 83,
+  87, 69, 83, 73, 82, 80, 78, 93, 100, 86,
+  97, 79, 77, 73, 77, 79, 89, 86, 85, 80,
+  80, 78, 89, 85, 76, 76, 103, 75, 83, 79,
+  84, 87, 90, 90, 85, 89, 71, 76, 91, 71,
+  92, 88, 83, 87, 93, 73, 159, 88, 69, 94,
+  96, 92, 73, 71, 83, 88, 81, 86, 84, 76,
+  90, 76, 80, 101, 87, 81, 80, 82, 84, 92,
+  89, 93, 84, 91, 93, 81, 76, 85, 65, 81,
+  82, 88, 83, 77, 81, 90, 85, 69, 75, 85,
+  83, 93, 83, 91, 96, 87, 83, 71, 84, 81,
+  77, 77, 91, 67, 84, 88, 68, 80, 81, 79,
+  85, 79, 76, 84, 76, 89, 72, 72, 82, 89,
+  73, 85, 78, 81, 90, 85, 58, 89, 95, 79,
+  67, 75, 82, 81, 80, 73, 85, 84, 84, 89,
+  73, 81, 73, 81, 87, 83, 81, 89, 81, 95,
+  98, 87, 108, 86, 96, 90, 82, 98, 84, 106,
+  71, 79, 99, 86, 73, 73, 80, 63, 77, 73,
+  94, 83, 73, 72, 65, 85, 73, 68, 85, 80,
+  70, 97, 100, 94, 80, 99, 79, 79, 76, 103,
+  85, 87, 92, 98, 74, 86, 89, 73, 82, 83,
+  86, 80, 69, 78, 87, 91, 81, 80, 88, 93,
+  69, 107, 81, 84, 93, 85, 71, 98, 97, 110,
+  89, 70, 78, 80, 87, 93, 89, 97, 77, 76,
+  83, 77, 83, 105, 86, 89, 94, 89, 86, 87,
+  76, 94, 87, 82, 69, 69, 73, 78, 85, 71,
+  90, 82, 77, 82, 57, 80, 92, 73, 68, 70,
+  76, 83, 83, 67, 88, 75, 86, 99, 86, 70,
+  74, 83, 88, 78, 83, 95, 81, 99, 93, 88,
+  110, 85, 92, 82, 81, 79, 79, 103, 75, 77,
+  87, 95, 78, 77, 81, 68, 74, 79, 90, 77,
+  70, 68, 68, 87, 79, 81, 82, 80, 76, 81,
+  101, 96, 73, 96, 65, 90, 77, 92, 84, 77,
+  82, 88, 77, 86, 91, 71, 76, 80, 79, 86,
+  73, 72, 84, 76, 85, 72, 88, 85, 66, 107,
+  74, 91, 98, 92, 69, 103, 100, 120, 95, 65,
+  62, 71, 85, 95, 84, 96, 76, 72, 78, 82,
+  88, 106, 82, 83, 84, 81, 76, 89, 80, 89,
+  86, 76, 71, 66, 72, 79, 93, 67, 80, 83,
+  80, 89, 65, 82, 92, 80, 70, 78, 86, 80,
+  79, 74, 85, 88, 84, 90, 75, 81, 77, 80,
+  85, 79, 86, 85, 85, 93, 92, 87, 96, 91,
+  96, 90, 89, 86, 90, 105, 76, 78, 94, 86,
+  79, 76, 85, 76, 79, 90, 96, 84, 71, 78,
+  69, 84, 77, 92, 89, 77, 77, 93, 90, 86,
+  84, 93, 92, 80, 78, 107, 85, 73, 93, 97,
+  83, 83, 90, 81, 86, 80, 76, 78, 71, 73,
+  86, 82, 86, 83, 95, 93, 73, 104, 80, 105,
+  95, 86, 93, 101, 94, 102, 87, 72, 86, 86,
+  85, 92, 88, 94, 76, 85, 85, 79, 88, 102,
+  87, 84, 76, 86, 93, 88, 81, 90, 90, 81,
+  71, 74, 72, 79, 86, 67, 79, 77, 69, 91,
+  86, 76, 86, 83, 67, 83, 89, 78, 74, 66,
+  86, 78, 63, 80, 82, 87, 88, 78, 91, 91,
+  91, 81, 93, 83, 101, 95, 90, 92, 96, 87,
+  72, 90, 103, 97, 85, 75, 104, 71, 74, 75,
+  83, 78, 81, 68, 83, 78, 68, 76, 69, 92,
+  71, 101, 89, 83, 71, 92, 78, 82, 88, 88,
+  81, 78, 82, 95, 78, 72, 114, 100, 74, 82,
+  78, 75, 93, 84, 105, 73, 78, 96, 95, 88,
+  74, 79, 92, 80, 91, 91, 72, 68, 84, 90,
+  75, 94, 87, 93, 82, 69, 82, 79, 76, 85,
+  80, 80, 86, 80, 90, 65, 71, 79, 85, 84,
+  88, 103, 83, 84, 69, 88, 90, 71, 91, 72,
+  76, 84, 82, 75, 81, 78, 71, 94, 86, 69,
+  81, 74, 69, 79, 92, 80, 70, 81, 83, 80,
+  60, 81, 86, 80, 77, 77, 82, 84, 87, 80,
+  93, 83, 97, 85, 86, 99, 95, 85, 77, 79,
+  98, 94, 71, 73, 101, 66, 83, 73, 72, 71,
+  75, 71, 79, 77, 63, 73, 72, 106, 69, 83,
+  86, 90, 63, 84, 82, 89, 87, 87, 67, 86,
+  83, 90, 84, 65, 83, 98, 80, 77, 82, 75,
+  83, 75, 94, 76, 81, 99, 88, 80, 82, 77,
+  89, 77, 78, 89, 72, 71, 79, 88, 71, 99,
+  89, 102, 79, 68, 82, 84, 75, 84, 78, 82,
+  85, 70, 88, 61, 75, 76, 79, 85, 98, 97,
+  73, 84, 72, 92, 90, 66, 102, 67, 79, 88,
+  85, 66, 78, 82, 86, 91, 87, 78, 83, 78,
+  69, 83, 90, 79, 77, 99, 86, 75, 72, 79,
+  78, 89, 73, 85, 78, 87, 85, 77, 92, 83,
+  96, 80, 89, 97, 91, 84, 87, 83, 99, 94,
+  69, 76, 99, 77, 88, 78, 85, 78, 81, 91,
+  79, 78, 67, 91, 72, 91, 72, 66, 91, 86,
+  70, 90, 75, 82, 87, 88, 87, 80, 78, 93,
+  86, 69, 71, 102, 75, 80, 83, 76, 90, 78,
+  80, 77, 77, 98, 94, 74, 87, 81, 86, 83,
+  94, 88, 73, 76, 84, 90, 74, 91, 87, 97,
+  81, 64, 82, 89, 80, 84, 79, 82, 82, 83,
+  89, 68, 80, 84, 82, 88, 93, 98, 93, 84,
+  77, 88, 89, 70, 94, 74, 77, 81, 84, 73,
+  83, 83, 85, 82, 98, 89, 75, 98, 87, 90,
+  81, 92, 89, 97, 76, 76, 75, 87, 84, 90,
+  94, 89, 94, 111, 85, 72, 100, 80, 74, 106,
+  70, 78, 95, 80, 86, 84, 94, 79, 82, 83,
+  99, 70, 76, 91, 82, 98, 94, 84, 79, 76,
+  89, 99, 84, 82, 80, 96, 106, 77, 93, 73,
+  68, 69, 79, 76, 82, 85, 88, 89, 73, 90,
+  97, 72, 97, 79, 75, 74, 89, 94, 86, 67,
+  102, 88, 102, 85, 73, 78, 85, 76, 122, 68,
+  78, 73, 80, 74, 91, 70, 66, 71, 82, 88,
+  81, 89, 83, 80, 73, 91, 91, 95, 106, 90,
+  77, 67, 93, 74, 78, 102, 101, 78, 69, 83,
+  97, 84, 89, 96, 92, 82, 73, 104, 78, 86,
+  87, 81, 95, 82, 75, 96, 86, 89, 86, 93,
+  85, 99, 75, 76, 75, 85, 81, 93, 85, 86,
+  87, 109, 86, 68, 104, 81, 67, 94, 69, 76,
+  99, 86, 98, 76, 96, 67, 82, 82, 97, 67,
+  83, 87, 75, 90, 90, 84, 81, 86, 84, 111,
+  91, 80, 75, 99, 93, 75, 89, 70, 72, 69,
+  86, 69, 84, 85, 91, 88, 71, 97, 96, 82,
+  92, 81, 74, 76, 77, 85, 94, 73, 105, 90,
+  103, 89, 73, 77, 84, 82, 127, 71, 86, 75,
+  79, 67, 86, 72, 60, 70, 75, 93, 87, 96,
+  83, 77, 71, 90, 88, 92, 106, 92, 83, 63,
+  96, 82, 85, 99, 93, 76, 63, 97, 92, 82,
+  100, 96, 94, 82, 68, 103, 79, 84, 84, 77,
+  99, 91, 76, 93, 85, 92, 81, 93, 88, 88,
+  74, 75, 79, 84, 78, 93, 74, 90, 80, 109,
+  91, 67, 101, 82, 65, 85, 71, 81, 90, 87,
+  101, 76, 93, 79, 84, 85, 96, 75, 88, 95,
+  78, 97, 91, 93, 78, 78, 86, 107, 88, 79,
+  79, 82, 96, 80, 93, 72, 67, 71, 86, 75,
+  85, 86, 83, 83, 72, 89, 85, 78, 92, 77,
+  77, 73, 84, 82, 95, 73, 100, 91, 103, 94,
+  75, 75, 77, 80, 121, 77, 74, 73, 82, 77,
+  85, 69, 69, 70, 80, 85, 84, 89, 87, 81,
+  80, 88, 88, 96, 101, 92, 85, 68, 91, 88,
+  84, 90, 96, 79, 71, 87, 82, 83, 92, 91,
+  87, 79, 77, 104, 86, 78, 84, 86, 84, 84,
+  82, 82, 93, 83, 76, 95, 99, 84, 66, 93,
+  80, 89, 84, 105, 73, 89, 74, 80, 81, 84,
+  95, 84, 95, 79, 84, 82, 83, 81, 86, 86,
+  87, 94, 115, 86, 82, 87, 91, 85, 87, 80,
+  88, 87, 75, 84, 83, 83, 83, 78, 81, 94,
+  93, 90, 86, 77, 86, 72, 87, 128, 71, 82,
+  67, 85, 77, 87, 87, 78, 88, 85, 85, 80,
+  85, 70, 75, 94, 89, 84, 86, 83, 92, 94,
+  79, 72, 86, 82, 85, 91, 82, 83, 85, 88,
+  87, 79, 87, 77, 89, 74, 89, 80, 83, 83,
+  86, 85, 83, 79, 86, 73, 90, 86, 79, 85,
+  74, 76, 85, 93, 86, 87, 83, 81, 82, 87,
+  84, 75, 84, 76, 85, 78, 86, 71, 81, 70,
+  91, 89, 85, 99, 87, 80, 68, 81, 81, 85,
+  87, 82, 79, 89, 81, 86, 80, 73, 83, 82,
+  74, 82, 75, 84, 91, 82, 80, 94, 71, 84,
+  86, 71, 70, 88, 75, 86, 79, 78, 91, 85,
+  81, 90, 88, 78, 85, 71, 80, 78, 99, 81,
+  88, 77, 83, 66, 74, 128, 71, 62, 73, 105,
+  69, 91, 89, 98, 86, 81, 84, 84, 92, 88,
+  70, 100, 89, 79, 85, 88, 85, 81, 70, 96,
+  77, 83, 79, 78, 80, 76, 86, 80, 83, 79,
+  86, 78, 91, 101, 91, 80, 70, 79, 81, 88,
+  89, 88, 90, 79, 87, 76, 82, 84, 72, 79,
+  86, 85, 75, 80, 73, 79, 100, 74, 84, 73,
+  88, 73, 91, 89, 94, 74, 80, 86, 85, 84,
+  74, 91, 78, 95, 63, 91, 80, 89, 85, 86,
+  94, 89, 88, 84, 80, 80, 92, 84, 92, 84,
+  87, 79, 88, 93, 74, 82, 77, 100, 75, 88,
+  85, 81, 75, 88, 84, 95, 88, 76, 82, 77,
+  88, 83, 86, 74, 81, 89, 90, 83, 84, 80,
+  85, 77, 86, 113, 75, 77, 68, 89, 79, 83,
+  81, 69, 85, 85, 86, 89, 82, 94, 82, 93,
+  85, 88, 86, 91, 87, 88, 98, 74, 83, 83,
+  87, 96, 87, 80, 104, 86, 85, 77, 82, 79,
+  91, 72, 86, 82, 90, 83, 91, 86, 90, 80,
+  100, 75, 92, 87, 93, 83, 81, 72, 80, 89,
+  87, 85, 86, 82, 83, 92, 85, 81, 72, 78,
+  82, 89, 74, 93, 69, 80, 88, 77, 66, 93,
+  73, 91, 65, 92, 79, 99, 79, 109, 71, 66,
+  94, 75, 72, 80, 96, 85, 103, 83, 67, 92,
+  91, 73, 86, 94, 74, 87, 75, 69, 79, 43,
+  88, 81, 77, 96, 84, 86, 73, 82, 89, 79,
+  81, 70, 78, 76, 88, 71, 85, 77, 79, 84,
+  92, 62, 79, 44, 62, 75, 87, 98, 86, 64,
+  89, 92, 87, 69, 78, 82, 81, 80, 82, 77,
+  81, 108, 68, 90, 85, 68, 81, 87, 90, 93,
+  77, 73, 95, 82, 82, 66, 74, 69, 86, 83,
+  77, 85, 86, 79, 87, 85, 69, 74, 85, 80,
+  84, 93, 71, 72, 91, 69, 60, 91, 83, 80,
+  73, 71, 72, 95, 79, 75, 98, 89, 76, 80,
+  82, 42, 93, 68, 82, 95, 99, 111, 111, 93,
+  78, 79, 87, 65, 94, 68, 69, 101, 55, 102,
+  91, 83, 71, 88, 72, 96, 107, 83, 92, 109,
+  91, 76, 87, 87, 129, 64, 92, 155, 72, 81,
+  96, 57, 96, 88, 96, 101, 81, 83, 85, 64,
+  97, 97, 103, 97, 92, 76, 96, 84, 65, 255,
+  39, 112, 73, 95, 88, 68, 73, 120, 59, 90,
+  76, 78, 102, 74, 66, 111, 96, 83, 97, 60,
+  122, 92, 30, 108, 81, 73, 82, 59, 94, 102,
+  68, 89, 84, 85, 98, 81, 70, 87, 110, 79,
+  69, 80, 79, 88, 96, 93, 106, 84, 88, 32,
+  86, 94, 60, 92, 117, 96, 55, 86, 90, 90,
+  105, 61, 93, 90, 76, 76, 92, 90, 80, 97,
+  68, 85, 82, 76, 64, 90, 66, 87, 66, 96,
+  85, 99, 81, 85, 94, 62, 94, 81, 74, 77,
+  88, 81, 104, 91, 70, 79, 93, 83, 76, 84,
+  66, 92, 71, 70, 79, 56, 79, 86, 78, 93,
+  83, 85, 80, 77, 89, 72, 82, 70, 81, 88,
+  81, 70, 84, 82, 82, 81, 90, 62, 71, 50,
+  61, 86, 91, 85, 85, 66, 87, 90, 86, 75,
+  79, 103, 83, 83, 81, 75, 76, 89, 72, 82,
+  90, 70, 74, 81, 90, 105, 82, 74, 108, 81,
+  82, 68, 78, 73, 89, 84, 80, 86, 92, 83,
+  89, 88, 77, 79, 87, 81, 91, 84, 75, 87,
+  95, 68, 67, 88, 88, 81, 82, 72, 76, 96,
+  81, 82, 84, 77, 70, 89, 97, 86, 76, 84,
+  88, 82, 73, 90, 79, 98, 69, 90, 78, 95,
+  95, 107, 75, 91, 91, 80, 83, 87, 91, 88,
+  96, 79, 86, 90, 89, 76, 72, 88, 69, 88,
+  77, 85, 83, 78, 78, 79, 82, 89, 89, 84,
+  87, 81, 88, 87, 85, 76, 86, 80, 92, 83,
+  85, 80, 77, 76, 92, 109, 91, 76, 73, 86,
+  86, 90, 82, 77, 81, 87, 91, 81, 83, 87,
+  80, 91, 84, 71, 89, 93, 83, 86, 79, 74,
+  88, 81, 88, 87, 82, 85, 91, 84, 86, 79,
+  78, 74, 78, 88, 82, 86, 94, 78, 101, 86,
+  81, 85, 90, 71, 92, 89, 84, 82, 82, 77,
+  79, 85, 86, 86, 83, 78, 80, 92, 83, 80,
+  83, 76, 86, 87, 94, 72, 78, 70, 82, 85,
+  86, 97, 89, 85, 64, 85, 76, 83, 89, 92,
+  74, 73, 81, 96, 78, 72, 87, 88, 66, 85,
+  74, 84, 88, 95, 76, 84, 83, 76, 87, 70,
+  92, 94, 74, 80, 79, 74, 91, 76, 88, 91,
+  86, 86, 83, 66, 92, 76, 93, 81, 73, 80,
+  92, 71, 80, 145, 76, 66, 72, 91, 82, 81,
+  87, 103, 69, 92, 79, 82, 92, 85, 83, 104,
+  91, 78, 90, 87, 81, 90, 62, 92, 78, 72,
+  95, 76, 89, 90, 79, 86, 82, 82, 78, 79,
+  77, 86, 87, 82, 75, 74, 90, 88, 71, 90,
+  86, 73, 84, 69, 77, 75, 79, 84, 89, 95,
+  74, 80, 74, 82, 98, 76, 81, 79, 86, 92,
+  77, 92, 95, 87, 75, 82, 86, 81, 73, 91,
+  80, 85, 68, 91, 85, 95, 92, 93, 84, 78,
+  87, 86, 81, 83, 90, 88, 92, 83, 76, 83,
+  88, 87, 71, 79, 62, 84, 96, 83, 88, 83,
+  78, 86, 82, 83, 86, 79, 87, 82, 88, 86,
+  83, 79, 88, 90, 88, 82, 82, 83, 83, 77,
+  88, 108, 82, 71, 65, 92, 87, 87, 81, 82,
+  81, 88, 88, 85, 79, 88, 85, 93, 86, 72,
+  86, 87, 89, 84, 86, 73, 83, 82, 93, 101,
+  82, 88, 94, 81, 85, 77, 92, 77, 79, 93,
+  86, 86, 98, 77, 99, 93, 84, 84, 79, 74,
+  95, 75, 75, 83, 98, 75, 84, 83, 80, 84,
+  88, 79, 82, 87, 83, 80, 101, 80, 92, 98,
+  85, 82, 69, 77, 84, 81, 77, 90, 84, 109,
+  86, 71, 97, 82, 101, 82, 89, 92, 102, 80,
+  94, 66, 97, 79, 100, 88, 89, 81, 92, 64,
+  82, 92, 79, 67, 100, 76, 88, 76, 79, 86,
+  79, 97, 83, 84, 74, 82, 102, 84, 85, 97,
+  107, 100, 92, 55, 77, 95, 78, 91, 98, 95,
+  62, 92, 72, 97, 86, 55, 98, 76, 102, 87,
+  86, 78, 96, 95, 90, 80, 91, 78, 107, 85,
+  89, 82, 99, 69, 89, 86, 49, 84, 78, 87,
+  96, 71, 90, 89, 98, 64, 66, 85, 58, 85,
+  83, 100, 95, 80, 66, 73, 85, 101, 69, 88,
+  98, 112, 89, 70, 91, 88, 96, 83, 83, 73,
+  90, 85, 112, 84, 102, 87, 79, 93, 83, 95,
+  66, 80, 80, 79, 74, 94, 81, 100, 86, 66,
+  108, 86, 113, 80, 74, 103, 77, 72, 111, 66,
+  97, 73, 110, 94, 90, 91, 99, 73, 89, 91,
+  74, 59, 107, 73, 78, 78, 93, 91, 76, 100,
+  90, 88, 72, 75, 98, 88, 85, 102, 95, 86,
+  93, 54, 80, 88, 88, 93, 99, 85, 50, 93,
+  66, 96, 90, 61, 98, 74, 98, 78, 75, 73,
+  96, 78, 82, 80, 89, 79, 123, 109, 91, 74,
+  86, 73, 82, 91, 51, 83, 82, 85, 94, 73,
+  85, 93, 77, 65, 68, 85, 54, 93, 69, 98,
+  101, 78, 70, 66, 81, 102, 73, 97, 97, 102,
+  105, 62, 88, 82, 89, 88, 78, 73, 81, 83,
+  118, 82, 71, 92, 89, 87, 73, 93, 78, 82,
+  81, 86, 73, 88, 88, 87, 92, 83, 86, 79,
+  88, 87, 80, 80, 80, 102, 91, 86, 74, 92,
+  91, 93, 83, 75, 81, 91, 81, 92, 84, 89,
+  96, 86, 83, 84, 87, 81, 84, 86, 77, 98,
+  101, 80, 88, 90, 77, 76, 86, 82, 79, 71,
+  73, 89, 84, 84, 90, 67, 67, 83, 74, 83,
+  87, 85, 95, 83, 86, 89, 90, 83, 85, 73,
+  85, 82, 82, 80, 86, 98, 84, 74, 77, 88,
+  85, 89, 82, 88, 91, 92, 81, 84, 85, 85,
+  75, 79, 91, 100, 85, 85, 107, 89, 81, 84,
+  72, 69, 92, 81, 77, 96, 98, 88, 99, 90,
+  83, 80, 81, 85, 71, 87, 94, 83, 89, 86,
+  89, 82, 71, 75, 86, 77, 67, 87, 87, 83,
+  65, 83, 73, 91, 83, 78, 85, 74, 84, 77,
+  71, 86, 77, 91, 86, 79, 92, 92, 82, 91,
+  81, 79, 88, 69, 92, 84, 89, 61, 90, 83,
+  83, 67, 76, 71, 57, 73, 82, 76, 83, 82,
+  96, 86, 91, 87, 90, 103, 86, 68, 75, 95,
+  71, 79, 100, 89, 58, 85, 72, 88, 96, 66,
+  98, 96, 95, 77, 90, 85, 86, 90, 103, 76,
+  91, 75, 100, 83, 98, 74, 93, 81, 82, 82,
+  68, 75, 78, 78, 84, 71, 82, 83, 94, 72,
+  73, 91, 74, 79, 99, 93, 79, 81, 70, 71,
+  67, 95, 82, 79, 101, 89, 79, 77, 95, 76,
+  82, 84, 73, 91, 82, 79, 94, 80, 90, 77,
+  81, 75, 82, 70, 67, 87, 80, 76, 66, 83,
+  72, 97, 86, 73, 86, 79, 79, 77, 67, 90,
+  79, 84, 99, 77, 85, 86, 94, 108, 87, 79,
+  89, 72, 90, 79, 86, 54, 91, 79, 80, 65,
+  73, 79, 52, 74, 87, 86, 84, 81, 88, 90,
+  89, 83, 79, 83, 84, 69, 83, 86, 77, 82,
+  95, 82, 50, 83, 77, 86, 94, 70, 80, 92,
+  89, 72, 86, 79, 87, 80, 92, 68, 89, 78,
+  97, 95, 101, 83, 77, 85, 82, 79, 65, 73,
+  82, 77, 74, 73, 78, 87, 77, 74, 76, 79,
+  73, 83, 92, 95, 80, 82, 69, 72, 68, 95,
+  87, 86, 109, 88, 92, 75, 91, 73, 83, 89,
+  70, 91, 79, 83, 95, 80, 72, 80, 89, 82,
+  79, 79, 84, 78, 85, 77, 72, 82, 80, 83,
+  92, 89, 77, 77, 79, 83, 86, 83, 86, 108,
+  92, 88, 75, 95, 75, 84, 82, 75, 81, 88,
+  79, 82, 85, 87, 87, 100, 80, 82, 76, 83,
+  77, 77, 79, 91, 101, 85, 84, 84, 86, 72,
+  82, 78, 78, 87, 71, 78, 84, 82, 89, 65,
+  72, 83, 91, 68, 87, 83, 77, 82, 83, 83,
+  88, 81, 85, 79, 73, 82, 89, 75, 82, 83,
+  79, 77, 68, 87, 86, 77, 90, 75, 83, 77,
+  75, 85, 81, 80, 74, 86, 82, 79, 90, 79,
+  108, 89, 70, 88, 83, 79, 87, 80, 84, 85,
+  103, 85, 89, 90, 79, 81, 82, 83, 85, 87,
+  95, 80, 82, 89, 84, 83, 76, 73, 89, 85,
+  85, 80, 89, 79, 76, 81, 84, 85, 84, 84,
+  74, 81, 83, 81, 84, 79, 85, 109, 83, 90,
+  78, 103, 88, 89, 86, 78, 80, 85, 86, 79,
+  90, 80, 87, 92, 91, 75, 82, 71, 81, 73,
+  91, 83, 93, 91, 90, 83, 79, 71, 87, 93,
+  82, 85, 70, 79, 83, 76, 93, 81, 63, 83,
+  86, 74, 87, 80, 96, 85, 91, 83, 98, 85,
+  86, 83, 84, 76, 85, 75, 81, 88, 91, 78,
+  79, 93, 78, 78, 85, 79, 77, 74, 84, 81,
+  84, 81, 90, 82, 78, 95, 90, 81, 107, 81,
+  67, 91, 87, 80, 89, 84, 87, 80, 95, 87,
+  85, 99, 88, 87, 79, 83, 78, 89, 84, 79,
+  84, 94, 84, 79, 85, 78, 85, 77, 90, 81,
+  87, 76, 78, 86, 80, 88, 92, 84, 75, 81,
+  79, 89, 84, 76, 85, 102, 89, 90, 81, 98,
+  89, 89, 87, 81, 82, 84, 86, 72, 89, 74,
+  85, 89, 87, 77, 82, 78, 78, 69, 88, 82,
+  94, 90, 88, 82, 81, 68, 84, 90, 81, 84,
+  77, 78, 83, 78, 91, 80, 69, 86, 91, 72,
+  84, 82, 75, 82, 90, 82, 100, 78, 86, 81,
+  84, 72, 88, 80, 77, 84, 91, 83, 80, 91,
+  80, 74, 81, 79, 83, 76, 77, 82, 86, 84,
+  84, 84, 81, 94, 93, 83, 111, 82, 70, 94,
+  91, 80, 93, 81, 91, 76, 95, 81, 87, 96,
+  83, 87, 84, 85, 83, 90, 83, 82, 86, 92,
+  76, 75, 85, 88, 83, 86, 91, 76, 90, 75,
+  84, 92, 87, 81, 85, 87, 76, 84, 90, 86,
+  89, 86, 85, 107, 87, 88, 79, 92, 75, 78,
+  83, 82, 84, 85, 87, 79, 83, 87, 84, 96,
+  84, 85, 90, 85, 90, 82, 82, 84, 87, 88,
+  85, 84, 77, 75, 89, 80, 83, 90, 81, 82,
+  90, 89, 86, 81, 89, 89, 87, 78, 84, 87,
+  78, 78, 95, 79, 95, 81, 83, 82, 79, 84,
+  83, 79, 83, 82, 84, 74, 80, 89, 76, 75,
+  91, 76, 89, 81, 79, 84, 85, 82, 88, 91,
+  91, 93, 84, 81, 91, 88, 78, 94, 86, 83,
+  95, 86, 84, 80, 91, 84, 88, 98, 84, 87,
+  84, 83, 81, 82, 89, 77, 77, 90, 80, 79,
+  78, 82, 112, 83, 77, 68, 81, 96, 88, 87,
+  81, 87, 83, 70, 72, 75, 67, 88, 87, 82,
+  74, 88, 94, 97, 83, 80, 86, 97, 74, 76,
+  80, 88, 71, 70, 74, 79, 86, 104, 88, 94,
+  76, 99, 79, 91, 77, 78, 64, 77, 87, 75,
+  84, 97, 86, 82, 79, 95, 69, 87, 71, 89,
+  75, 87, 100, 82, 77, 73, 84, 96, 80, 86,
+  86, 76, 70, 84, 82, 65, 76, 107, 65, 85,
+  90, 83, 95, 74, 89, 88, 90, 67, 74, 88,
+  78, 81, 79, 115, 75, 93, 89, 86, 92, 85,
+  90, 80, 85, 81, 78, 80, 94, 77, 77, 84,
+  93, 86, 97, 84, 95, 85, 78, 78, 81, 81,
+  86, 92, 84, 84, 80, 82, 77, 89, 79, 84,
+  116, 75, 88, 74, 79, 98, 82, 83, 78, 88,
+  88, 68, 72, 79, 69, 94, 77, 78, 73, 92,
+  92, 97, 87, 82, 90, 87, 78, 69, 79, 78,
+  75, 77, 82, 76, 86, 103, 88, 101, 81, 96,
+  82, 82, 76, 69, 66, 77, 93, 66, 86, 90,
+  87, 87, 83, 86, 64, 90, 71, 94, 79, 89,
+  89, 79, 70, 71, 83, 94, 81, 91, 88, 81,
+  76, 80, 79, 65, 85, 101, 65, 88, 96, 74,
+  112, 75, 82, 88, 92, 61, 79, 88, 74, 80,
+  71, 118, 71, 87, 84, 86, 88, 78, 86, 81,
+  76, 80, 78, 80, 93, 76, 90, 92, 94, 86,
+  95, 81, 73, 87, 74, 83, 75, 75, 83, 92,
+  75, 83, 79, 77, 81, 97, 84, 83, 110, 75,
+  79, 74, 83, 95, 87, 87, 79, 94, 79, 72,
+  72, 78, 72, 101, 77, 86, 87, 85, 97, 98,
+  85, 78, 85, 74, 76, 75, 80, 69, 86, 86,
+  77, 78, 94, 102, 86, 91, 85, 93, 80, 90,
+  74, 67, 65, 76, 86, 69, 82, 96, 88, 90,
+  80, 95, 72, 81, 74, 91, 76, 89, 99, 80,
+  74, 74, 89, 95, 84, 89, 92, 79, 78, 85,
+  83, 74, 79, 109, 64, 85, 90, 77, 90, 82,
+  84, 88, 85, 74, 78, 88, 82, 84, 69, 113,
+  74, 92, 88, 93, 95, 93, 85, 78, 87, 82,
+  81, 77, 91, 76, 81, 84, 91, 90, 89, 83,
+  71, 86, 77, 82, 78, 83, 80, 92, 84, 80,
+  79, 82, 79, 74, 71, 78, 101, 91, 82, 69,
+  80, 92, 94, 81, 87, 91, 92, 83, 89, 76,
+  70, 83, 85, 89, 76, 88, 102, 95, 76, 84,
+  81, 95, 75, 82, 77, 97, 73, 71, 73, 73,
+  91, 96, 87, 99, 78, 98, 83, 85, 75, 83,
+  68, 75, 94, 78, 81, 94, 84, 82, 85, 96,
+  63, 92, 75, 89, 80, 100, 95, 80, 73, 62,
+  88, 84, 78, 93, 84, 79, 68, 85, 84, 60,
+  73, 112, 68, 107, 90, 77, 105, 77, 92, 87,
+  87, 69, 71, 89, 72, 80, 85, 117, 76, 100,
+  96, 97, 80, 87, 82, 86, 75, 86, 76, 82,
+  88, 78, 80, 89, 94, 78, 84, 84, 87, 86,
+  82, 76, 78, 82, 93, 92, 82, 81, 74, 83,
+  79, 92, 74, 79, 115, 73, 90, 75, 79, 93,
+  94, 78, 88, 93, 96, 90, 88, 75, 70, 81,
+  74, 87, 71, 96, 107, 102, 76, 87, 83, 77,
+  86, 80, 75, 89, 73, 71, 72, 63, 96, 104,
+  84, 112, 79, 99, 89, 74, 76, 69, 67, 77,
+  101, 74, 83, 95, 85, 83, 85, 91, 56, 92,
+  75, 93, 81, 115, 78, 84, 74, 58, 92, 82,
+  74, 101, 81, 84, 76, 79, 81, 63, 74, 112,
+  75, 119, 102, 66, 123, 85, 74, 87, 99, 64,
+  74, 79, 67, 76, 68, 124, 73, 91, 83, 96,
+  78, 78, 77, 85, 67, 84, 73, 80, 92, 79,
+  89, 95, 95, 77, 85, 80, 66, 87, 78, 77,
+  75, 75, 99, 95, 83, 79, 70, 74, 78, 94,
+  88, 79, 97, 78, 82, 72, 80, 91, 91, 83,
+  84, 92, 87, 84, 86, 80, 75, 101, 78, 93,
+  93, 84, 108, 95, 79, 84, 80, 74, 81, 86,
+  76, 73, 90, 87, 75, 71, 99, 94, 84, 91,
+  85, 92, 83, 83, 78, 67, 66, 75, 94, 74,
+  79, 92, 84, 76, 83, 100, 66, 89, 78, 94,
+  79, 98, 93, 81, 70, 65, 90, 88, 78, 93,
+  87, 80, 82, 83, 85, 82, 76, 109, 67, 102,
+  91, 72, 102, 85, 73, 88, 82, 73, 74, 80,
+  76, 76, 71, 114, 75, 102, 82, 100, 78, 82,
+  80, 84, 74, 85, 80, 78, 85, 80, 83, 93,
+  92, 93, 81, 80, 71, 87, 82, 79, 78, 87,
+  82, 92, 86, 80, 77, 86, 77, 72, 68, 87,
+  95, 90, 74, 65, 73, 93, 90, 77, 83, 88,
+  87, 95, 90, 82, 72, 81, 82, 84, 81, 78,
+  93, 88, 84, 81, 85, 84, 78, 87, 80, 94,
+  77, 73, 74, 70, 86, 92, 85, 83, 83, 92,
+  82, 85, 80, 85, 65, 75, 92, 66, 76, 98,
+  88, 76, 87, 100, 78, 79, 86, 76, 84, 91,
+  95, 78, 77, 64, 90, 90, 78, 84, 82, 79,
+  72, 77, 88, 69, 87, 97, 70, 88, 86, 79,
+  92, 74, 97, 87, 81, 84, 73, 94, 81, 71,
+  92, 103, 79, 97, 100, 93, 87, 93, 83, 85,
+  84, 80, 82, 77, 80, 87, 82, 86, 85, 80,
+  89, 87, 83, 83, 83, 83, 79, 85, 84, 91,
+  78, 83, 83, 87, 78, 80, 75, 85, 100, 80,
+  78, 66, 70, 91, 90, 74, 84, 91, 88, 92,
+  89, 84, 67, 82, 82, 82, 84, 84, 94, 96,
+  82, 83, 87, 77, 83, 87, 75, 88, 73, 80,
+  70, 68, 88, 91, 89, 88, 80, 94, 88, 73,
+  81, 78, 65, 73, 92, 68, 74, 93, 87, 81,
+  87, 89, 74, 79, 91, 84, 85, 89, 87, 75,
+  86, 68, 89, 96, 76, 90, 79, 84, 76, 72,
+  93, 72, 84, 100, 74, 93, 88, 67, 100, 84,
+  82, 93, 85, 77, 74, 94, 78, 69, 77, 109,
+  75, 92, 86, 96, 81, 95, 79, 86, 76, 80,
+  81, 78, 82, 84, 86, 94, 87, 80, 86, 90,
+  72, 84, 82, 83, 81, 86, 82, 91, 78, 85,
+  83, 77, 74, 85, 87, 85, 97, 81, 74, 69,
+  74, 92, 88, 79, 82, 87, 85, 93, 87, 88,
+  76, 95, 85, 87, 90, 77, 97, 86, 83, 83,
+  82, 78, 82, 86, 78, 77, 80, 85, 76, 70,
+  83, 90, 89, 83, 81, 90, 86, 83, 84, 72,
+  65, 77, 90, 62, 74, 94, 85, 78, 83, 105,
+  83, 79, 87, 80, 83, 91, 87, 77, 77, 70,
+  86, 92, 74, 86, 85, 82, 84, 79, 87, 79,
+  87, 99, 70, 87, 86, 71, 89, 82, 75, 84,
+  78, 82, 74, 83, 84, 68, 75, 103, 76, 99,
+  79, 96, 86, 85, 80, 84, 84, 81, 88, 73,
+  80, 88, 83, 89, 85, 92, 86, 87, 68, 85,
+  84, 82, 88, 89, 76, 91, 80, 85, 84, 88,
+  90, 69, 70, 81, 97, 84, 64, 90, 66, 79,
+  84, 85, 67, 77, 80, 84, 77, 78, 76, 88,
+  72, 69, 74, 75, 74, 91, 88, 88, 97, 100,
+  75, 85, 70, 93, 86, 94, 93, 86, 76, 72,
+  79, 87, 72, 118, 89, 89, 72, 95, 92, 83,
+  86, 77, 88, 73, 82, 85, 71, 62, 74, 71,
+  74, 91, 80, 92, 78, 74, 82, 91, 83, 92,
+  68, 88, 96, 94, 88, 75, 93, 74, 78, 52,
+  100, 100, 89, 86, 84, 83, 77, 105, 85, 78,
+  76, 83, 77, 73, 89, 79, 92, 87, 82, 90,
+  82, 77, 98, 99, 79, 78, 101, 138, 81, 76,
+  71, 76, 75, 73, 89, 78, 81, 93, 82, 89,
+  80, 91, 78, 81, 113, 85, 76, 77, 83, 73,
+  65, 85, 102, 79, 58, 95, 69, 78, 83, 87,
+  74, 88, 85, 85, 76, 79, 73, 94, 70, 61,
+  82, 72, 68, 95, 84, 88, 92, 93, 67, 83,
+  70, 81, 95, 90, 90, 81, 76, 65, 76, 81,
+  72, 136, 83, 84, 79, 85, 80, 81, 88, 90,
+  92, 79, 76, 92, 70, 70, 89, 67, 70, 78,
+  75, 88, 86, 77, 87, 81, 79, 96, 77, 81,
+  99, 90, 95, 68, 89, 82, 78, 48, 98, 100,
+  88, 90, 68, 81, 73, 107, 95, 82, 81, 80,
+  78, 68, 87, 77, 91, 90, 80, 90, 81, 78,
+  95, 100, 80, 89, 107, 148, 85, 76, 68, 75,
+  76, 77, 74, 85, 72, 87, 80, 95, 85, 94,
+  77, 80, 117, 84, 75, 78, 91, 79, 66, 82,
+  81, 73, 67, 89, 68, 75, 83, 80, 76, 87,
+  82, 86, 80, 82, 79, 89, 77, 73, 83, 73,
+  78, 98, 89, 84, 92, 82, 79, 81, 76, 79,
+  93, 98, 91, 88, 77, 72, 79, 82, 79, 95,
+  89, 86, 74, 89, 93, 87, 85, 82, 83, 75,
+  83, 91, 75, 58, 73, 78, 79, 93, 78, 88,
+  70, 80, 85, 90, 84, 95, 75, 93, 95, 93,
+  96, 79, 97, 88, 84, 59, 84, 95, 92, 85,
+  86, 84, 72, 92, 79, 79, 77, 80, 83, 80,
+  87, 76, 89, 82, 74, 99, 80, 75, 96, 99,
+  77, 83, 96, 116, 86, 75, 69, 76, 79, 76,
+  67, 92, 81, 92, 85, 91, 86, 87, 78, 84,
+  97, 89, 82, 84, 92, 61, 65, 89, 87, 99,
+  49, 79, 86, 76, 82, 82, 73, 81, 81, 92,
+  91, 70, 82, 77, 78, 74, 76, 82, 76, 111,
+  72, 90, 96, 94, 78, 89, 68, 98, 93, 86,
+  76, 88, 68, 87, 77, 91, 81, 158, 94, 92,
+  83, 99, 70, 79, 89, 85, 94, 81, 72, 86,
+  68, 72, 85, 59, 72, 94, 74, 96, 80, 77,
+  76, 89, 80, 85, 70, 76, 83, 85, 89, 66,
+  89, 83, 65, 71, 123, 120, 84, 87, 73, 74,
+  81, 111, 94, 88, 69, 84, 81, 69, 82, 85,
+  95, 94, 83, 84, 83, 77, 92, 93, 82, 77,
+  100, 173, 62, 79, 71, 71, 76, 78, 83, 75,
+  75, 87, 89, 84, 85, 85, 65, 82, 129, 78,
+  76, 73, 82, 79, 65, 92, 94, 84, 43, 78,
+  95, 84, 79, 87, 83, 71, 93, 84, 94, 66,
+  80, 83, 74, 63, 84, 83, 76, 116, 66, 99,
+  90, 91, 81, 85, 60, 80, 92, 78, 74, 103,
+  74, 84, 81, 101, 80, 187, 95, 77, 91, 80,
+  61, 73, 93, 92, 101, 92, 71, 88, 74, 85,
+  100, 50, 59, 80, 70, 109, 73, 83, 85, 89,
+  77, 76, 64, 80, 81, 84, 96, 64, 84, 87,
+  64, 82, 129, 129, 81, 82, 65, 76, 74, 114,
+  105, 85, 70, 69, 87, 67, 71, 92, 96, 112,
+  88, 80, 74, 69, 93, 93, 89, 79, 102, 181,
+  69, 79, 80, 69, 80, 73, 84, 82, 68, 87,
+  95, 80, 81, 88, 57, 87, 150, 75, 85, 73,
+  97, 83, 76, 90, 77, 78, 57, 77, 83, 74,
+  81, 79, 73, 73, 85, 89, 86, 77, 80, 91,
+  75, 80, 97, 79, 79, 103, 81, 86, 90, 87,
+  82, 82, 72, 81, 94, 92, 78, 88, 74, 82,
+  77, 87, 83, 129, 89, 90, 86, 89, 76, 82,
+  86, 82, 87, 81, 72, 80, 73, 67, 85, 64,
+  76, 96, 69, 84, 78, 79, 78, 91, 81, 88,
+  81, 82, 90, 89, 97, 67, 98, 92, 74, 75,
+  105, 117, 85, 84, 76, 76, 79, 106, 90, 83,
+  73, 73, 84, 75, 83, 80, 94, 93, 78, 89,
+  86, 74, 88, 94, 80, 84, 97, 147, 71, 78,
+  82, 75, 80, 79, 84, 85, 89, 91, 84, 90,
+  84, 83, 69, 84, 109, 83, 77, 75, 91, 70,
+  65, 91, 94, 90, 63, 84, 79, 80, 90, 74,
+  70, 82, 77, 98, 89, 70, 84, 84, 83, 69,
+  78, 89, 83, 103, 79, 84, 94, 91, 89, 86,
+  77, 105, 90, 85, 96, 80, 74, 78, 86, 83,
+  79, 107, 87, 95, 82, 93, 88, 95, 85, 74,
+  90, 83, 78, 89, 78, 62, 86, 76, 76, 99,
+  84, 94, 79, 82, 80, 91, 74, 75, 74, 82,
+  84, 70, 84, 78, 94, 82, 77, 52, 110, 87,
+  88, 87, 82, 79, 82, 97, 79, 104, 78, 94,
+  88, 74, 91, 72, 91, 79, 89, 96, 80, 88,
+  92, 94, 85, 84, 88, 125, 70, 89, 67, 72,
+  81, 81, 79, 87, 68, 87, 91, 86, 84, 91,
+  71, 84, 98, 85, 73, 87, 92, 74, 71, 94,
+  97, 81, 60, 80, 83, 83, 86, 77, 77, 78,
+  81, 95, 90, 74, 84, 86, 74, 58, 84, 85,
+  78, 96, 79, 87, 87, 91, 90, 85, 67, 88,
+  87, 77, 90, 86, 74, 71, 92, 81, 79, 123,
+  80, 92, 90, 76, 76, 83, 87, 83, 88, 82,
+  79, 80, 77, 72, 93, 67, 71, 91, 87, 94,
+  87, 77, 88, 81, 74, 89, 64, 80, 81, 73,
+  79, 67, 89, 87, 76, 53, 113, 93, 87, 89,
+  77, 82, 79, 105, 86, 95, 74, 89, 84, 73,
+  86, 71, 92, 89, 84, 90, 79, 86, 89, 93,
+  87, 87, 85, 136, 65, 88, 75, 71, 76, 83,
+  93, 90, 74, 84, 91, 90, 86, 88, 63, 82,
+  108, 86, 77, 86, 94, 83, 86, 87, 87, 81,
+  66, 77, 80, 83, 90, 71, 71, 81, 78, 98,
+  84, 72, 84, 90, 72, 76, 91, 87, 85, 97,
+  84, 86, 86, 85, 92, 83, 78, 85, 89, 88,
+  98, 80, 78, 79, 86, 88, 82, 92, 83, 93,
+  82, 81, 89, 97, 80, 80, 80, 82, 78, 66,
+  76, 60, 84, 80, 76, 97, 81, 88, 82, 80,
+  83, 92, 83, 75, 68, 85, 86, 75, 84, 76,
+  97, 95, 74, 61, 96, 93, 89, 86, 83, 80,
+  78, 91, 82, 91, 80, 82, 89, 81, 87, 68,
+  90, 79, 80, 96, 81, 80, 89, 94, 89, 85,
+  82, 111, 69, 86, 80, 72, 79, 83, 94, 87,
+  90, 92, 89, 89, 95, 86, 72, 84, 88, 87,
+  80, 88, 86, 82, 97, 87, 81, 98, 94, 78,
+  78, 88, 81, 92, 100, 97, 87, 88, 98, 102,
+  70, 83, 88, 101, 96, 81, 86, 92, 87, 83,
+  93, 78, 78, 83, 89, 89, 68, 78, 91, 92,
+  78, 92, 83, 85, 88, 90, 80, 89, 86, 84,
+  80, 95, 56, 100, 84, 63, 83, 77, 89, 75,
+  81, 87, 97, 75, 77, 76, 90, 67, 77, 86,
+  74, 91, 84, 84, 81, 88, 79, 91, 85, 83,
+  83, 76, 87, 72, 81, 83, 92, 72, 89, 73,
+  75, 80, 78, 71, 81, 88, 76, 83, 84, 86,
+  86, 86, 64, 69, 81, 74, 81, 69, 68, 99,
+  75, 82, 74, 85, 93, 89, 92, 81, 98, 81,
+  81, 79, 80, 84, 89, 90, 83, 78, 79, 96,
+  89, 91, 85, 88, 68, 88, 92, 83, 84, 90,
+  82, 99, 117, 71, 88, 99, 103, 112, 67, 90,
+  100, 83, 79, 83, 82, 88, 100, 91, 85, 62,
+  83, 78, 82, 85, 72, 67, 90, 96, 81, 104,
+  79, 88, 93, 96, 83, 91, 85, 67, 65, 97,
+  45, 94, 97, 56, 88, 86, 90, 75, 74, 88,
+  102, 66, 75, 86, 87, 65, 82, 86, 65, 88,
+  105, 72, 80, 96, 81, 83, 78, 81, 89, 74,
+  84, 67, 85, 77, 95, 67, 85, 68, 77, 84,
+  88, 70, 70, 86, 73, 89, 85, 83, 84, 84,
+  61, 72, 86, 71, 84, 68, 72, 102, 69, 83,
+  80, 90, 104, 87, 84, 77, 94, 76, 78, 87,
+  83, 80, 87, 99, 78, 77, 90, 95, 84, 83,
+  82, 80, 79, 96, 92, 82, 74, 83, 85, 85,
+  94, 70, 92, 89, 96, 91, 75, 93, 85, 102,
+  90, 81, 82, 93, 83, 85, 86, 68, 77, 89,
+  92, 86, 84, 89, 99, 88, 82, 92, 82, 86,
+  83, 84, 81, 85, 86, 77, 84, 99, 66, 85,
+  81, 69, 81, 80, 86, 80, 84, 89, 96, 75,
+  81, 71, 88, 71, 77, 86, 77, 79, 108, 90,
+  89, 86, 80, 91, 87, 87, 85, 83, 91, 82,
+  83, 81, 85, 65, 90, 79, 81, 79, 77, 84,
+  82, 81, 81, 85, 90, 87, 84, 89, 70, 85,
+  81, 75, 78, 66, 69, 87, 74, 82, 77, 84,
+  84, 91, 77, 82, 89, 81, 83, 74, 78, 86,
+  90, 82, 91, 77, 78, 95, 88, 94, 71, 89,
+  86, 93, 81, 72, 81, 87, 91, 92, 88, 77,
+  80, 94, 115, 90, 82, 78, 94, 91, 83, 88,
+  63, 83, 75, 81, 84, 66, 99, 76, 84, 90,
+  80, 82, 91, 91, 99, 79, 72, 81, 89, 80,
+  65, 80, 71, 91, 74, 84, 91, 81, 96, 70,
+  81, 94, 79, 86, 88, 91, 83, 72, 62, 74,
+  67, 80, 81, 92, 81, 62, 91, 78, 89, 91,
+  72, 87, 89, 104, 77, 82, 86, 76, 79, 78,
+  88, 81, 93, 82, 80, 77, 91, 75, 74, 82,
+  92, 73, 84, 76, 93, 88, 56, 75, 86, 79,
+  83, 96, 86, 86, 68, 77, 77, 82, 83, 81,
+  81, 93, 85, 83, 78, 91, 86, 78, 96, 88,
+  76, 77, 87, 88, 79, 90, 87, 95, 75, 81,
+  69, 74, 96, 86, 93, 104, 110, 75, 77, 99,
+  131, 97, 83, 81, 97, 71, 74, 89, 67, 70,
+  83, 86, 76, 67, 115, 79, 75, 87, 68, 73,
+  94, 94, 82, 79, 65, 82, 98, 85, 59, 79,
+  62, 76, 57, 77, 95, 78, 109, 68, 75, 79,
+  85, 75, 73, 93, 87, 64, 53, 81, 58, 77,
+  81, 101, 72, 63, 77, 59, 98, 96, 64, 80,
+  90, 93, 76, 78, 83, 75, 83, 86, 86, 82,
+  84, 79, 74, 77, 95, 73, 60, 74, 95, 70,
+  91, 72, 76, 88, 57, 71, 90, 82, 72, 112,
+  94, 95, 70, 74, 85, 79, 91, 81, 91, 88,
+  83, 79, 69, 87, 89, 78, 86, 96, 67, 76,
+  95, 84, 81, 78, 102, 84, 92, 97, 83, 73,
+  78, 84, 90, 80, 82, 98, 84, 95, 104, 81,
+  81, 79, 84, 97, 90, 89, 87, 84, 71, 81,
+  81, 86, 99, 87, 87, 93, 78, 98, 104, 89,
+  83, 77, 79, 83, 93, 81, 72, 85, 86, 102,
+  85, 85, 88, 84, 91, 74, 81, 64, 81, 84,
+  86, 83, 82, 74, 67, 73, 69, 83, 84, 84,
+  85, 65, 85, 83, 93, 86, 71, 81, 86, 87,
+  78, 86, 90, 86, 78, 91, 85, 82, 79, 90,
+  82, 75, 84, 71, 83, 77, 81, 77, 89, 74,
+  71, 91, 65, 80, 84, 81, 81, 92, 78, 82,
+  67, 75, 88, 84, 75, 89, 91, 89, 90, 82,
+  84, 90, 83, 80, 100, 81, 85, 74, 82, 86,
+  81, 88, 79, 86, 89, 78, 69, 80, 73, 74,
+  84, 77, 74, 96, 69, 89, 106, 59, 73, 72,
+  83, 86, 74, 82, 63, 76, 75, 79, 95, 68,
+  96, 91, 80, 86, 108, 92, 100, 96, 112, 77,
+  89, 61, 86, 64, 74, 77, 88, 77, 99, 76,
+  113, 78, 84, 84, 75, 81, 66, 100, 86, 89,
+  81, 93, 93, 80, 62, 85, 82, 88, 103, 85,
+  94, 91, 89, 79, 68, 81, 96, 92, 95, 95,
+  81, 93, 73, 89, 72, 97, 92, 87, 82, 77,
+  88, 101, 85, 79, 91, 86, 91, 83, 83, 99,
+  77, 97, 78, 87, 91, 94, 87, 53, 71, 73,
+  87, 80, 75, 78, 88, 104, 66, 85, 100, 91,
+  76, 89, 78, 79, 84, 95, 82, 76, 68, 77,
+  90, 79, 86, 74, 63, 73, 67, 71, 90, 81,
+  83, 123, 74, 68, 109, 56, 66, 68, 81, 84,
+  85, 77, 72, 72, 70, 77, 104, 94, 102, 81,
+  79, 87, 91, 83, 105, 89, 107, 74, 101, 61,
+  80, 68, 77, 67, 88, 74, 96, 75, 128, 86,
+  83, 85, 69, 101, 61, 93, 92, 94, 77, 91,
+  93, 85, 56, 102, 86, 105, 105, 90, 83, 91,
+  79, 74, 71, 80, 97, 85, 98, 102, 79, 99,
+  61, 83, 73, 102, 84, 90, 78, 69, 74, 90,
+  86, 73, 89, 94, 87, 83, 85, 108, 79, 95,
+  74, 91, 92, 114, 98, 60, 71, 67, 91, 74,
+  72, 78, 97, 115, 77, 90, 103, 91, 82, 84,
+  70, 78, 83, 91, 76, 77, 78, 68, 93, 85,
+  95, 78, 70, 77, 72, 80, 81, 67, 74, 111,
+  74, 87, 99, 65, 75, 72, 86, 78, 98, 82,
+  77, 79, 79, 80, 90, 108, 91, 87, 79, 85,
+  79, 95, 98, 97, 94, 74, 89, 71, 84, 72,
+  82, 77, 90, 93, 108, 77, 105, 69, 85, 82,
+  78, 87, 73, 89, 82, 81, 80, 89, 94, 82,
+  66, 84, 89, 81, 93, 80, 80, 90, 89, 85,
+  74, 80, 91, 87, 84, 92, 84, 88, 69, 87,
+  74, 103, 79, 89, 78, 75, 85, 78, 90, 79,
+  88, 86, 93, 86, 77, 89, 78, 86, 79, 85,
+  92, 91, 79, 63, 73, 77, 87, 84, 76, 89,
+  77, 89, 99, 83, 103, 89, 93, 83, 81, 77,
+  85, 90, 85, 75, 81, 70, 93, 72, 90, 79,
+  87, 82, 84, 82, 80, 72, 83, 94, 75, 91,
+  78, 69, 63, 76, 78, 106, 97, 102, 78, 76,
+  71, 81, 96, 86, 84, 88, 92, 69, 83, 95,
+  87, 85, 96, 90, 79, 104, 81, 71, 78, 91,
+  97, 88, 84, 88, 80, 83, 82, 80, 79, 86,
+  97, 71, 89, 81, 72, 153, 81, 115, 46, 98,
+  72, 74, 102, 79, 108, 87, 80, 74, 74, 83,
+  96, 81, 87, 99, 83, 76, 93, 71, 83, 70,
+  73, 74, 88, 81, 80, 77, 93, 79, 75, 91,
+  70, 71, 86, 106, 73, 79, 82, 84, 78, 74,
+  72, 71, 70, 82, 84, 70, 73, 73, 88, 87,
+  74, 91, 90, 90, 85, 75, 80, 78, 78, 98,
+  71, 91, 86, 69, 80, 93, 88, 66, 82, 83,
+  75, 80, 85, 81, 90, 106, 76, 86, 83, 83,
+  80, 72, 116, 109, 89, 92, 80, 92, 72, 84,
+  93, 76, 88, 85, 91, 91, 84, 73, 73, 94,
+  69, 85, 82, 92, 75, 87, 79, 89, 81, 82,
+  80, 87, 73, 100, 83, 83, 79, 73, 80, 70,
+  87, 93, 72, 97, 90, 87, 74, 79, 78, 83,
+  91, 89, 64, 85, 73, 81, 83, 68, 83, 88,
+  80, 80, 87, 83, 83, 78, 87, 74, 84, 79,
+  73, 89, 77, 75, 87, 85, 69, 89, 87, 71,
+  88, 74, 80, 69, 84, 83, 92, 71, 91, 98,
+  86, 83, 94, 82, 88, 85, 92, 92, 101, 86,
+  84, 93, 84, 81, 92, 82, 77, 93, 83, 80,
+  80, 78, 76, 104, 91, 81, 92, 88, 80, 89,
+  94, 92, 90, 76, 90, 85, 92, 101, 98, 98,
+  82, 74, 77, 80, 95, 99, 87, 95, 90, 79,
+  83, 89, 97, 88, 89, 74, 86, 95, 82, 75,
+  75, 61, 100, 107, 82, 89, 79, 71, 71, 78,
+  89, 89, 79, 90, 83, 85, 72, 90, 74, 93,
+  73, 67, 93, 73, 103, 71, 77, 94, 72, 97,
+  87, 70, 81, 92, 87, 72, 68, 88, 93, 74,
+  101, 92, 76, 76, 88, 84, 88, 82, 85, 93,
+  68, 86, 72, 80, 80, 95, 91, 88, 73, 66,
+  101, 93, 87, 82, 105, 75, 108, 101, 95, 97,
+  87, 83, 109, 96, 86, 82, 87, 84, 74, 94,
+  84, 90, 87, 91, 86, 96, 95, 84, 85, 80,
+  86, 70, 80, 88, 84, 84, 80, 82, 87, 70,
+  71, 89, 75, 72, 70, 65, 67, 79, 79, 109,
+  98, 94, 81, 86, 67, 80, 90, 73, 82, 87,
+  83, 70, 66, 96, 105, 85, 103, 75, 81, 104,
+  94, 72, 89, 76, 74, 100, 87, 85, 81, 86,
+  82, 82, 87, 97, 98, 75, 95, 82, 82, 133,
+  95, 115, 47, 103, 71, 72, 89, 81, 92, 91,
+  87, 86, 72, 87, 92, 76, 73, 99, 82, 66,
+  88, 78, 85, 81, 68, 82, 83, 75, 79, 76,
+  92, 76, 68, 92, 77, 71, 72, 111, 78, 93,
+  93, 83, 71, 81, 80, 71, 73, 77, 82, 63,
+  71, 66, 78, 81, 82, 84, 93, 97, 75, 72,
+  78, 79, 81, 79, 72, 93, 85, 64, 61, 91,
+  86, 74, 85, 80, 88, 80, 83, 77, 80, 70,
+  79, 89, 80, 75, 78, 73, 104, 90, 74, 91,
+  80, 91, 71, 79, 93, 71, 77, 88, 92, 89,
+  89, 77, 84, 88, 94, 84, 79, 82, 66, 81,
+  83, 92, 78, 85, 79, 86, 79, 73, 90, 83,
+  82, 110, 81, 78, 91, 87, 75, 101, 88, 89,
+  67, 89, 73, 81, 100, 77, 100, 86, 70, 72,
+  80, 79, 91, 92, 75, 83, 80, 81, 87, 73,
+  85, 77, 79, 79, 73, 89, 79, 86, 87, 83,
+  68, 87, 81, 74, 101, 84, 79, 78, 78, 83,
+  81, 81, 89, 90, 82, 85, 79, 78, 76, 82,
+  74, 90, 77, 84, 85, 77, 83, 78, 90, 79,
+  82, 79, 80, 81, 73, 78, 100, 107, 93, 73,
+  90, 75, 79, 93, 87, 90, 84, 86, 91, 96,
+  92, 96, 94, 94, 73, 77, 79, 86, 86, 98,
+  81, 91, 82, 91, 89, 88, 96, 87, 85, 67,
+  92, 101, 70, 81, 82, 67, 81, 95, 75, 86,
+  83, 75, 71, 81, 79, 81, 86, 91, 83, 90,
+  69, 97, 83, 87, 70, 75, 81, 80, 94, 83,
+  81, 88, 81, 97, 67, 73, 68, 74, 86, 73,
+  75, 78, 88, 76, 96, 92, 80, 81, 85, 85,
+  84, 79, 86, 95, 72, 83, 74, 83, 73, 83,
+  84, 87, 84, 62, 93, 76, 78, 82, 103, 86,
+  100, 97, 91, 99, 85, 79, 98, 93, 90, 88,
+  80, 84, 81, 76, 84, 87, 87, 87, 88, 90,
+  95, 86, 89, 95, 97, 95, 84, 87, 86, 101,
+  75, 87, 80, 72, 79, 87, 82, 82, 85, 90,
+  86, 97, 84, 98, 97, 89, 97, 108, 81, 91,
+  77, 76, 93, 79, 84, 83, 77, 82, 90, 97,
+  88, 75, 79, 92, 90, 86, 87, 61, 86, 97,
+  83, 82, 91, 86, 81, 93, 84, 71, 82, 88,
+  79, 103, 88, 75, 86, 92, 66, 72, 79, 80,
+  90, 92, 68, 83, 85, 95, 84, 82, 83, 81,
+  74, 83, 87, 85, 74, 90, 90, 87, 85, 88,
+  87, 78, 78, 88, 88, 86, 81, 80, 81, 76,
+  70, 69, 89, 82, 90, 82, 93, 72, 97, 83,
+  90, 98, 80, 80, 88, 72, 76, 79, 91, 81,
+  98, 82, 82, 94, 105, 89, 91, 82, 86, 91,
+  89, 73, 68, 84, 81, 87, 86, 85, 79, 87,
+  82, 75, 82, 73, 83, 74, 76, 74, 80, 85,
+  75, 93, 80, 92, 90, 93, 83, 84, 81, 69,
+  82, 95, 82, 78, 85, 87, 88, 83, 98, 87,
+  79, 99, 98, 78, 88, 76, 76, 86, 89, 81,
+  88, 79, 87, 82, 81, 85, 87, 81, 87, 84,
+  85, 100, 90, 96, 68, 86, 77, 76, 90, 84,
+  111, 95, 82, 84, 74, 88, 90, 86, 78, 90,
+  78, 86, 82, 79, 88, 80, 79, 86, 86, 83,
+  82, 89, 101, 76, 73, 88, 79, 80, 72, 86,
+  81, 106, 88, 85, 81, 78, 86, 80, 82, 91,
+  75, 77, 77, 72, 74, 91, 74, 88, 93, 88,
+  81, 79, 88, 78, 85, 78, 82, 89, 84, 64,
+  78, 88, 86, 81, 86, 71, 73, 93, 87, 82,
+  86, 86, 86, 83, 79, 79, 83, 86, 80, 85,
+  85, 99, 82, 84, 85, 88, 74, 79, 90, 90,
+  85, 80, 83, 74, 80, 84, 79, 87, 79, 89,
+  83, 82, 80, 80, 76, 75, 92, 82, 78, 83,
+  90, 72, 85, 93, 86, 88, 92, 83, 79, 92,
+  90, 87, 84, 84, 86, 84, 90, 94, 82, 95,
+  82, 76, 78, 85, 90, 85, 90, 87, 81, 94,
+  85, 79, 83, 79, 81, 84, 90, 88, 79, 87,
+  95, 74, 73, 94, 76, 82, 91, 73, 83, 84,
+  82, 84, 90, 81, 86, 81, 76, 96, 76, 74,
+  84, 81, 83, 108, 86, 90, 85, 92, 84, 79,
+  79, 79, 84, 86, 85, 93, 87, 88, 78, 86,
+  73, 90, 76, 65, 69, 73, 79, 74, 87, 78,
+  75, 92, 75, 96, 88, 87, 103, 85, 75, 77,
+  70, 89, 61, 105, 98, 78, 90, 74, 73, 74,
+  66, 71, 81, 88, 90, 76, 59, 55, 89, 88,
+  117, 73, 82, 102, 86, 95, 80, 75, 91, 83,
+  87, 76, 73, 77, 83, 82, 95, 70, 75, 81,
+  80, 82, 76, 86, 67, 92, 72, 72, 101, 95,
+  91, 84, 71, 83, 89, 71, 81, 82, 93, 89,
+  89, 95, 88, 103, 91, 104, 100, 78, 63, 73,
+  80, 102, 78, 97, 66, 85, 92, 74, 79, 76,
+  87, 94, 79, 93, 74, 84, 113, 96, 90, 76,
+  73, 77, 89, 92, 80, 119, 100, 86, 87, 72,
+  93, 85, 86, 89, 85, 91, 68, 87, 75, 86,
+  76, 69, 70, 73, 76, 77, 86, 83, 75, 87,
+  70, 93, 83, 86, 90, 85, 80, 77, 73, 89,
+  55, 105, 100, 72, 91, 68, 73, 72, 71, 78,
+  85, 86, 85, 75, 62, 67, 94, 86, 120, 71,
+  85, 98, 85, 99, 83, 73, 90, 84, 89, 76,
+  71, 75, 94, 82, 100, 74, 79, 84, 69, 88,
+  74, 85, 72, 85, 74, 75, 97, 85, 92, 77,
+  73, 85, 82, 69, 82, 84, 94, 80, 86, 93,
+  85, 97, 89, 98, 92, 78, 75, 75, 79, 103,
+  80, 97, 70, 81, 88, 77, 77, 77, 87, 95,
+  71, 91, 69, 90, 109, 99, 92, 79, 72, 82,
+  75, 93, 88, 112, 97, 87, 72, 76, 89, 86,
+  85, 92, 85, 91, 71, 82, 69, 83, 75, 79,
+  73, 75, 77, 73, 80, 88, 77, 96, 79, 90,
+  82, 93, 79, 78, 85, 76, 75, 94, 68, 99,
+  89, 68, 87, 72, 73, 70, 78, 86, 86, 85,
+  75, 74, 66, 61, 105, 86, 110, 75, 86, 88,
+  88, 91, 88, 76, 86, 80, 83, 82, 71, 88,
+  80, 84, 97, 73, 79, 76, 85, 85, 82, 83,
+  75, 80, 85, 72, 100, 90, 91, 85, 77, 83,
+  90, 75, 81, 84, 93, 86, 86, 90, 81, 92,
+  91, 100, 96, 85, 64, 77, 86, 97, 77, 104,
+  71, 93, 97, 83, 76, 76, 90, 91, 73, 92,
+  71, 86, 104, 92, 85, 84, 76, 79, 81, 89,
+  86, 114, 94, 87, 78, 73, 89, 89, 83, 88,
+  85, 82, 75, 89, 86, 84, 81, 71, 77, 74,
+  88, 79, 90, 77, 89, 101, 77, 93, 76, 83,
+  116, 82, 75, 79, 78, 77, 56, 102, 96, 81,
+  93, 70, 81, 79, 71, 75, 71, 90, 96, 70,
+  62, 69, 118, 93, 109, 84, 72, 105, 76, 88,
+  91, 72, 87, 86, 80, 86, 66, 82, 83, 86,
+  94, 66, 72, 75, 77, 76, 83, 81, 63, 68,
+  86, 71, 91, 113, 97, 73, 74, 88, 81, 70,
+  89, 84, 93, 83, 84, 93, 89, 95, 84, 98,
+  89, 63, 72, 80, 73, 94, 91, 90, 69, 75,
+  80, 83, 77, 72, 93, 84, 78, 86, 55, 84,
+  93, 89, 89, 82, 73, 78, 75, 90, 82, 101,
+  90, 82, 74, 77, 87, 93, 89, 85, 82, 94,
+  72, 91, 91, 83, 82, 72, 78, 76, 84, 79,
+  92, 88, 85, 105, 68, 88, 71, 86, 115, 81,
+  74, 78, 75, 75, 54, 102, 93, 77, 96, 70,
+  80, 78, 74, 80, 71, 81, 88, 65, 67, 76,
+  126, 91, 112, 83, 73, 95, 73, 89, 92, 70,
+  82, 86, 77, 77, 63, 76, 87, 84, 103, 72,
+  77, 76, 68, 77, 74, 77, 68, 65, 74, 64,
+  88, 104, 99, 60, 75, 91, 80, 67, 91, 85,
+  96, 82, 81, 92, 89, 87, 80, 99, 87, 62,
+  73, 78, 73, 95, 87, 90, 74, 65, 79, 77,
+  77, 73, 102, 78, 70, 85, 58, 90, 97, 93,
+  86, 83, 74, 79, 74, 86, 86, 98, 88, 87,
+  55, 79, 80, 93, 89, 87, 85, 96, 76, 83,
+  81, 89, 78, 78, 74, 76, 85, 80, 82, 96,
+  87, 99, 81, 87, 77, 87, 92, 82, 80, 80,
+  78, 78, 66, 96, 89, 75, 89, 72, 77, 75,
+  83, 86, 72, 88, 79, 72, 70, 72, 111, 90,
+  103, 79, 76, 86, 80, 88, 91, 82, 83, 85,
+  84, 76, 71, 90, 80, 84, 95, 73, 78, 70,
+  80, 80, 85, 80, 72, 75, 77, 74, 87, 95,
+  94, 82, 79, 89, 82, 72, 88, 81, 92, 88,
+  85, 86, 90, 92, 82, 92, 88, 70, 72, 80,
+  83, 92, 90, 94, 73, 85, 82, 87, 78, 73,
+  92, 88, 71, 84, 61, 82, 97, 90, 84, 86,
+  85, 85, 91, 87, 87, 100, 82, 84, 70, 78,
+  86, 90, 89, 87, 80, 76, 84, 85, 78, 83,
+  78, 78, 80, 73, 90, 94, 92, 88, 95, 96,
+  81, 86, 81, 85, 120, 84, 75, 81, 83, 74,
+  79, 88, 88, 74, 93, 73, 76, 83, 75, 86,
+  82, 78, 92, 76, 68, 73, 121, 94, 109, 92,
+  77, 101, 72, 85, 92, 71, 90, 88, 87, 100,
+  78, 77, 83, 89, 94, 71, 71, 79, 84, 73,
+  86, 83, 67, 79, 93, 86, 92, 121, 90, 78,
+  81, 89, 82, 77, 88, 87, 101, 80, 81, 91,
+  92, 92, 85, 97, 79, 72, 70, 76, 78, 104,
+  93, 86, 79, 86, 74, 96, 78, 75, 90, 102,
+  80, 80, 52, 83, 98, 85, 88, 89, 85, 81,
+  75, 91, 89, 98, 94, 82, 74, 80, 83, 87,
+  86, 76, 78, 84, 78, 87, 79, 81, 81, 76,
+  80, 77, 91, 86, 95, 95, 98, 96, 77, 82,
+  81, 83, 120, 86, 73, 84, 84, 73, 80, 91,
+  80, 75, 96, 76, 72, 83, 74, 84, 81, 71,
+  90, 75, 64, 77, 126, 90, 107, 99, 78, 98,
+  69, 84, 94, 72, 83, 84, 80, 90, 74, 76,
+  85, 89, 103, 71, 75, 81, 77, 72, 85, 83,
+  67, 78, 83, 81, 90, 120, 94, 69, 82, 89,
+  81, 79, 88, 86, 100, 87, 80, 92, 90, 85,
+  83, 94, 83, 69, 69, 75, 73, 96, 85, 88,
+  88, 77, 73, 87, 81, 77, 101, 98, 70, 81,
+  50, 86, 99, 88, 81, 84, 88, 85, 84, 88,
+  96, 96, 91, 82, 59, 82, 80, 84, 86, 83,
+  77, 90, 79, 83, 76, 86, 74, 80, 82, 78,
+  87, 93, 87, 92, 90, 96, 88, 83, 83, 80,
+  101, 79, 81, 83, 85, 77, 83, 82, 80, 82,
+  86, 78, 79, 83, 81, 85, 81, 81, 83, 77,
+  65, 72, 108, 91, 103, 87, 79, 87, 75, 89,
+  90, 79, 87, 85, 88, 86, 80, 87, 80, 87,
+  97, 74, 82, 73, 80, 75, 89, 83, 72, 90,
+  77, 84, 88, 107, 90, 85, 83, 90, 79, 77,
+  90, 83, 94, 93, 80, 85, 94, 93, 85, 96,
+  80, 72, 72, 81, 84, 99, 89, 87, 83, 89,
+  78, 85, 76, 75, 89, 96, 78, 81, 58, 84,
+  98, 84, 84, 88, 96, 87, 98, 92, 94, 95,
+  80, 83, 74, 83, 83, 81, 86, 79, 87, 89,
+  66, 77, 75, 94, 93, 76, 85, 90, 75, 78,
+  87, 86, 86, 87, 80, 86, 65, 80, 104, 78,
+  95, 107, 69, 94, 80, 85, 89, 81, 89, 77,
+  84, 82, 80, 83, 83, 92, 97, 84, 93, 103,
+  71, 87, 116, 84, 61, 88, 82, 92, 79, 76,
+  86, 75, 78, 79, 99, 91, 86, 76, 83, 85,
+  97, 89, 89, 96, 77, 84, 72, 87, 85, 83,
+  101, 94, 82, 89, 87, 92, 79, 82, 94, 83,
+  81, 94, 79, 80, 77, 79, 93, 83, 76, 88,
+  99, 76, 82, 93, 62, 80, 84, 91, 90, 85,
+  74, 82, 87, 90, 89, 87, 69, 94, 93, 91,
+  87, 73, 80, 92, 70, 94, 89, 96, 90, 88,
+  73, 84, 85, 84, 91, 90, 86, 90, 67, 77,
+  83, 63, 83, 91, 85, 87, 87, 78, 77, 85,
+  90, 80, 86, 83, 84, 81, 103, 78, 94, 99,
+  76, 92, 83, 85, 74, 89, 91, 73, 73, 83,
+  80, 78, 86, 83, 97, 84, 82, 82, 38, 79,
+  89, 78, 72, 88, 92, 90, 79, 82, 82, 86,
+  77, 76, 81, 92, 66, 88, 92, 87, 85, 104,
+  74, 96, 81, 82, 93, 69, 68, 81, 85, 80,
+  84, 75, 90, 87, 82, 86, 88, 90, 81, 92,
+  83, 92, 76, 82, 88, 84, 80, 74, 77, 80,
+  84, 73, 81, 88, 85, 88, 79, 79, 83, 85,
+  86, 88, 82, 84, 80, 90, 91, 84, 86, 71,
+  83, 78, 79, 88, 84, 82, 87, 88, 70, 84,
+  78, 90, 92, 89, 84, 93, 83, 81, 91, 70,
+  72, 106, 81, 84, 94, 85, 72, 93, 79, 76,
+  86, 92, 100, 89, 77, 68, 89, 91, 86, 78,
+  91, 87, 81, 80, 92, 83, 64, 79, 99, 100,
+  86, 72, 95, 73, 78, 64, 40, 76, 59, 77,
+  107, 83, 88, 91, 75, 87, 82, 104, 81, 81,
+  75, 94, 68, 95, 98, 88, 84, 87, 75, 80,
+  80, 77, 119, 80, 76, 73, 71, 73, 91, 73,
+  91, 99, 97, 79, 88, 89, 89, 90, 94, 95,
+  78, 94, 86, 77, 89, 76, 61, 79, 92, 63,
+  101, 87, 89, 83, 81, 77, 86, 81, 85, 89,
+  89, 79, 84, 83, 69, 89, 79, 81, 88, 81,
+  91, 79, 73, 69, 88, 92, 76, 84, 81, 98,
+  85, 81, 80, 79, 82, 82, 80, 89, 87, 94,
+  73, 87, 90, 80, 82, 90, 81, 88, 87, 96,
+  84, 75, 81, 72, 83, 88, 79, 96, 82, 95,
+  87, 88, 91, 82, 77, 68, 72, 87, 88, 83,
+  99, 76, 87, 89, 98, 80, 114, 78, 51, 77,
+  88, 86, 78, 79, 83, 90, 72, 75, 84, 77,
+  64, 74, 78, 84, 95, 78, 75, 90, 78, 86,
+  61, 75, 76, 72, 93, 103, 71, 78, 84, 99,
+  72, 91, 93, 77, 81, 96, 83, 79, 85, 83,
+  82, 81, 79, 80, 66, 83, 82, 92, 89, 92,
+  59, 95, 88, 82, 86, 85, 82, 75, 81, 94,
+  83, 88, 108, 89, 89, 80, 83, 92, 81, 84,
+  76, 92, 90, 89, 73, 89, 76, 84, 92, 92,
+  80, 77, 109, 80, 80, 78, 81, 91, 77, 87,
+  89, 83, 71, 89, 88, 80, 89, 76, 82, 74,
+  72, 85, 80, 91, 98, 86, 75, 86, 88, 90,
+  87, 92, 78, 72, 75, 89, 88, 76, 93, 69,
+  88, 75, 71, 83, 86, 84, 84, 77, 91, 84,
+  85, 79, 85, 91, 88, 72, 81, 72, 82, 85,
+  85, 90, 91, 80, 66, 82, 94, 83, 86, 66,
+  62, 81, 76, 79, 80, 80, 81, 95, 59, 85,
+  88, 86, 80, 91, 84, 92, 76, 81, 77, 83,
+  77, 66, 67, 77, 81, 71, 88, 88, 59, 88,
+  71, 69, 89, 83, 82, 95, 85, 89, 82, 81,
+  86, 74, 79, 81, 88, 90, 86, 83, 78, 76,
+  87, 82, 82, 81, 81, 86, 89, 82, 83, 83,
+  109, 83, 85, 85, 80, 83, 87, 83, 78, 80,
+  78, 93, 91, 80, 88, 82, 75, 86, 64, 87,
+  77, 94, 102, 66, 84, 80, 94, 78, 83, 93,
+  86, 80, 88, 90, 87, 77, 88, 69, 81, 74,
+  59, 86, 64, 87, 129, 85, 84, 92, 78, 86,
+  88, 86, 95, 87, 84, 85, 113, 89, 90, 94,
+  83, 81, 68, 79, 89, 76, 122, 69, 72, 84,
+  68, 68, 100, 82, 76, 87, 81, 75, 88, 92,
+  88, 81, 88, 92, 72, 87, 89, 82, 88, 80,
+  87, 73, 81, 67, 84, 92, 90, 80, 81, 76,
+  81, 79, 101, 104, 94, 83, 80, 80, 58, 81,
+  71, 80, 88, 86, 78, 88, 84, 66, 96, 86,
+  88, 74, 98, 90, 76, 76, 80, 80, 99, 83,
+  92, 90, 79, 98, 72, 83, 104, 85, 85, 88,
+  74, 82, 96, 101, 99, 76, 68, 69, 82, 82,
+  87, 90, 81, 95, 86, 78, 89, 91, 71, 75,
+  71, 95, 94, 74, 96, 81, 84, 77, 91, 76,
+  89, 74, 67, 80, 88, 84, 79, 82, 82, 106,
+  80, 85, 78, 75, 63, 84, 95, 83, 82, 70,
+  77, 80, 81, 77, 73, 80, 74, 74, 81, 86,
+  77, 76, 77, 101, 82, 96, 93, 78, 81, 84,
+  91, 86, 90, 91, 76, 75, 77, 86, 58, 84,
+  84, 86, 112, 98, 56, 89, 85, 92, 87, 83,
+  86, 73, 78, 90, 78, 81, 94, 83, 82, 85,
+  83, 84, 80, 79, 77, 75, 82, 91, 75, 86,
+  71, 98, 89, 94, 79, 71, 115, 81, 88, 98,
+  80, 84, 79, 87, 87, 89, 88, 91, 79, 83,
+  90, 87, 83, 73, 67, 98, 72, 83, 103, 82,
+  84, 81, 93, 74, 82, 99, 80, 78, 71, 100,
+  88, 74, 91, 77, 90, 84, 115, 88, 76, 90,
+  84, 75, 86, 85, 82, 86, 87, 91, 97, 89,
+  87, 71, 99, 75, 85, 93, 86, 65, 72, 72,
+  89, 75, 78, 81, 78, 77, 76, 79, 71, 81,
+  80, 102, 77, 86, 91, 77, 94, 79, 90, 88,
+  81, 86, 76, 80, 84, 72, 81, 76, 75, 80,
+  92, 87, 56, 83, 77, 82, 82, 82, 87, 84,
+  92, 90, 78, 76, 73, 79, 76, 92, 84, 87,
+  85, 85, 81, 80, 78, 84, 87, 76, 88, 88,
+  82, 80, 82, 77, 100, 83, 82, 97, 91, 73,
+  86, 91, 72, 87, 91, 90, 85, 84, 91, 81,
+  60, 82, 80, 89, 63, 92, 105, 68, 82, 74,
+  101, 79, 80, 94, 90, 81, 82, 89, 78, 89,
+  84, 81, 80, 84, 104, 99, 69, 99, 109, 77,
+  81, 98, 82, 76, 87, 69, 99, 91, 98, 83,
+  133, 76, 74, 101, 86, 72, 73, 77, 91, 83,
+  94, 82, 84, 89, 85, 80, 77, 90, 74, 91,
+  86, 79, 92, 84, 102, 82, 82, 91, 71, 82,
+  82, 86, 87, 80, 98, 73, 73, 79, 76, 90,
+  86, 88, 78, 82, 77, 85, 99, 89, 92, 85,
+  76, 80, 59, 83, 86, 86, 90, 92, 77, 99,
+  83, 85, 93, 82, 93, 75, 104, 81, 78, 73,
+  76, 71, 84, 83, 78, 85, 69, 94, 82, 83,
+  77, 92, 97, 91, 73, 65, 84, 94, 79, 99,
+  88, 94, 74, 82, 85, 74, 81, 76, 95, 99,
+  85, 76, 91, 65, 97, 80, 76, 79, 69, 77,
+  91, 64, 94, 62, 88, 92, 80, 80, 87, 82,
+  82, 76, 85, 77, 83, 99, 74, 97, 73, 74,
+  92, 76, 83, 85, 75, 85, 79, 90, 85, 83,
+  87, 92, 93, 94, 76, 94, 72, 78, 83, 75,
+  71, 85, 83, 81, 98, 74, 81, 74, 66, 79,
+  78, 77, 81, 95, 91, 90, 83, 84, 89, 75,
+  93, 87, 101, 97, 82, 85, 82, 91, 88, 89,
+  72, 80, 87, 77, 100, 74, 90, 74, 89, 83,
+  76, 98, 94, 78, 97, 87, 84, 66, 82, 81,
+  89, 81, 74, 81, 73, 98, 82, 86, 74, 91,
+  87, 77, 80, 59, 82, 98, 81, 92, 83, 92,
+  89, 83, 83, 64, 82, 78, 98, 96, 84, 81,
+  97, 58, 106, 66, 82, 84, 77, 67, 91, 61,
+  91, 64, 82, 87, 84, 82, 77, 85, 92, 75,
+  86, 74, 87, 90, 77, 86, 75, 68, 88, 81,
+  84, 78, 81, 83, 84, 85, 84, 86, 91, 86,
+  104, 94, 80, 88, 73, 76, 92, 72, 77, 86,
+  80, 96, 92, 69, 77, 83, 75, 78, 71, 83,
+  86, 88, 90, 87, 84, 72, 93, 77, 90, 71,
+  99, 93, 80, 87, 82, 94, 87, 94, 83, 86,
+  86, 80, 110, 84, 81, 75, 87, 81, 79, 95,
+  94, 80, 89, 85, 85, 73, 86, 88, 90, 83,
+  69, 81, 69, 93, 90, 79, 75, 86, 79, 72,
+  76, 70, 81, 92, 80, 94, 86, 93, 84, 85,
+  84, 76, 79, 74, 90, 76, 92, 79, 89, 72,
+  94, 73, 74, 77, 92, 82, 89, 66, 92, 70,
+  89, 93, 80, 85, 92, 85, 77, 79, 87, 81,
+  87, 73, 65, 92, 74, 77, 83, 78, 85, 79,
+  71, 89, 79, 85, 88, 82, 78, 94, 94, 86,
+  76, 90, 73, 74, 93, 79, 71, 92, 89, 80,
+  95, 78, 80, 85, 69, 75, 83, 77, 75, 95,
+  92, 89, 82, 89, 85, 87, 86, 82, 99, 93,
+  80, 87, 81, 78, 84, 91, 89, 77, 87, 84,
+  110, 81, 87, 74, 84, 85, 79, 95, 90, 80,
+  91, 79, 79, 72, 68, 71, 81, 77, 105, 87,
+  70, 75, 59, 84, 106, 75, 93, 64, 76, 69,
+  87, 77, 90, 144, 88, 87, 86, 75, 85, 59,
+  75, 82, 104, 92, 106, 74, 90, 99, 95, 57,
+  48, 81, 69, 64, 83, 80, 91, 77, 77, 73,
+  89, 79, 69, 72, 86, 73, 66, 74, 56, 113,
+  88, 134, 61, 91, 83, 74, 75, 74, 78, 64,
+  87, 72, 88, 80, 112, 87, 77, 89, 76, 86,
+  70, 81, 79, 78, 64, 64, 77, 79, 131, 81,
+  86, 83, 65, 85, 61, 80, 79, 76, 87, 83,
+  85, 74, 88, 76, 73, 93, 98, 102, 81, 83,
+  89, 138, 89, 76, 87, 97, 82, 76, 161, 67,
+  87, 77, 96, 75, 74, 99, 69, 64, 89, 80,
+  90, 67, 70, 98, 85, 73, 111, 82, 77, 72,
+  65, 85, 114, 78, 106, 65, 80, 78, 98, 77,
+  93, 162, 80, 87, 77, 78, 85, 56, 64, 78,
+  98, 76, 120, 78, 83, 84, 83, 55, 48, 78,
+  65, 58, 86, 96, 89, 96, 83, 67, 87, 74,
+  60, 62, 92, 67, 68, 79, 49, 124, 90, 150,
+  48, 76, 76, 71, 76, 79, 67, 70, 91, 76,
+  89, 72, 99, 81, 72, 78, 87, 72, 66, 69,
+  80, 84, 78, 69, 69, 51, 169, 83, 74, 90,
+  69, 80, 57, 72, 66, 70, 70, 97, 82, 68,
+  87, 79, 59, 79, 98, 98, 78, 77, 86, 147,
+  97, 69, 90, 94, 80, 75, 168, 66, 77, 72,
+  97, 71, 73, 99, 65, 60, 99, 77, 95, 51,
+  75, 100, 94, 81, 75, 99, 66, 80, 71, 82,
+  94, 75, 85, 82, 81, 74, 82, 80, 85, 140,
+  81, 90, 78, 83, 83, 68, 85, 86, 97, 84,
+  98, 79, 96, 69, 96, 76, 75, 81, 71, 72,
+  78, 79, 90, 66, 78, 76, 89, 95, 78, 87,
+  76, 86, 63, 77, 74, 92, 81, 106, 75, 90,
+  82, 76, 75, 61, 70, 72, 88, 79, 81, 91,
+  87, 96, 91, 85, 85, 92, 80, 78, 81, 78,
+  61, 69, 83, 60, 99, 90, 75, 87, 69, 83,
+  75, 88, 85, 82, 76, 78, 88, 76, 86, 83,
+  79, 85, 96, 100, 82, 84, 87, 109, 79, 90,
+  82, 85, 84, 87, 111, 84, 99, 75, 90, 85,
+  92, 105, 73, 68, 75, 79, 83, 88, 74, 81,
+  77, 84, 64, 89, 81, 83, 87, 86, 76, 99,
+  90, 76, 78, 87, 74, 83, 85, 96, 93, 91,
+  78, 99, 96, 64, 94, 82, 93, 87, 80, 88,
+  93, 91, 86, 85, 60, 87, 91, 77, 77, 61,
+  94, 64, 77, 99, 79, 91, 86, 90, 80, 80,
+  93, 89, 86, 79, 87, 78, 95, 81, 91, 85,
+  90, 81, 86, 74, 80, 76, 81, 78, 88, 83,
+  87, 78, 71, 87, 86, 82, 78, 73, 72, 88,
+  90, 75, 91, 86, 87, 78, 81, 98, 88, 84,
+  87, 82, 98, 74, 75, 80, 84, 91, 78, 95,
+  90, 91, 87, 82, 84, 82, 69, 94, 99, 79,
+  92, 91, 109, 92, 92, 82, 90, 77, 90, 89,
+  91, 76, 85, 94, 80, 67, 73, 93, 74, 82,
+  66, 82, 82, 79, 91, 89, 80, 98, 101, 93,
+  77, 90, 76, 86, 81, 94, 93, 88, 88, 102,
+  89, 57, 94, 84, 89, 88, 75, 85, 99, 91,
+  86, 76, 67, 83, 77, 67, 79, 57, 98, 68,
+  78, 86, 77, 84, 82, 89, 83, 89, 92, 85,
+  83, 95, 89, 80, 94, 78, 92, 86, 93, 75,
+  89, 75, 91, 76, 76, 90, 97, 77, 82, 76,
+  71, 83, 87, 79, 77, 70, 78, 84, 87, 84,
+  87, 90, 83, 76, 84, 101, 90, 80, 84, 74,
+  97, 69, 79, 71, 85, 93, 88, 95, 89, 88,
+  84, 93, 83, 94, 74, 94, 89, 83, 93, 81,
+  82, 94, 93, 78, 89, 83, 94, 90, 87, 73,
+  85, 92, 80, 72, 73, 92, 73, 84, 75, 79,
+  78, 81, 91, 85, 81, 94, 93, 97, 76, 90,
+  69, 80, 82, 98, 84, 94, 88, 95, 88, 71,
+  93, 82, 84, 86, 79, 85, 86, 86, 81, 87,
+  77, 85, 72, 84, 81, 63, 90, 73, 83, 83,
+  78, 84, 92, 87, 75, 86, 86, 96, 90, 89,
+  84, 85, 89, 83, 91, 89, 92, 77, 83, 84,
+  85, 86, 81, 80, 86, 89, 83, 77, 79, 86,
+  87, 74, 77, 74, 71, 82, 89, 75, 96, 91,
+  82, 71, 77, 95, 89, 80, 82, 81, 85, 70,
+  80, 84, 83, 94, 77, 82, 95, 90, 83, 83,
+  84, 81, 72, 91, 82, 77, 95, 80, 77, 88,
+  95, 77, 92, 82, 85, 93, 89, 76, 89, 91,
+  79, 73, 97, 78, 73, 89, 91, 86, 84, 87,
+  78, 86, 98, 82, 82, 96, 64, 68, 82, 83,
+  100, 76, 85, 84, 81, 83, 91, 70, 85, 107,
+  89, 79, 86, 79, 79, 70, 82, 93, 74, 69,
+  90, 73, 81, 81, 82, 75, 91, 97, 82, 75,
+  105, 86, 111, 72, 82, 81, 95, 81, 82, 72,
+  88, 72, 92, 81, 84, 85, 90, 106, 70, 83,
+  96, 82, 75, 76, 85, 73, 84, 88, 76, 93,
+  90, 95, 106, 80, 70, 81, 72, 81, 85, 75,
+  87, 98, 73, 74, 74, 72, 78, 90, 57, 95,
+  95, 85, 89, 78, 71, 77, 88, 96, 86, 68,
+  89, 95, 74, 80, 129, 84, 78, 103, 94, 87,
+  74, 71, 117, 79, 76, 110, 93, 91, 99, 83,
+  108, 91, 72, 91, 96, 73, 88, 81, 75, 84,
+  102, 74, 85, 94, 70, 71, 90, 80, 98, 71,
+  85, 83, 75, 91, 93, 73, 81, 106, 86, 82,
+  91, 85, 75, 63, 82, 81, 71, 69, 94, 61,
+  84, 86, 84, 77, 98, 100, 81, 73, 108, 81,
+  105, 76, 88, 79, 99, 84, 91, 73, 84, 65,
+  95, 84, 83, 84, 82, 111, 69, 84, 99, 75,
+  74, 76, 79, 72, 86, 86, 72, 80, 98, 96,
+  107, 82, 68, 86, 78, 73, 72, 70, 93, 113,
+  73, 68, 68, 78, 74, 96, 57, 95, 92, 82,
+  86, 83, 70, 77, 84, 104, 79, 67, 99, 90,
+  77, 79, 132, 75, 79, 106, 81, 93, 68, 70,
+  94, 79, 75, 108, 93, 86, 103, 80, 91, 92,
+  78, 94, 89, 81, 84, 82, 79, 85, 95, 86,
+  83, 87, 64, 73, 82, 83, 101, 77, 79, 86,
+  87, 81, 85, 71, 81, 105, 86, 84, 89, 86,
+  80, 77, 82, 93, 77, 68, 88, 77, 82, 81,
+  82, 79, 88, 100, 86, 90, 102, 86, 101, 72,
+  82, 81, 91, 84, 84, 68, 94, 71, 96, 84,
+  82, 81, 93, 104, 68, 90, 96, 79, 77, 74,
+  81, 72, 90, 86, 81, 75, 99, 92, 104, 79,
+  74, 102, 74, 76, 88, 80, 84, 104, 72, 74,
+  76, 74, 79, 90, 58, 92, 83, 82, 89, 89,
+  71, 77, 86, 89, 85, 71, 87, 92, 85, 79,
+  127, 94, 72, 96, 81, 90, 73, 74, 78, 80,
+  76, 105, 91, 85, 97, 86, 94, 79, 73, 84,
+  77, 87, 88, 93, 81, 80, 96, 77, 83, 91,
+  64, 71, 91, 84, 104, 75, 87, 82, 83, 83,
+  86, 74, 89, 97, 92, 80, 88, 81, 89, 76,
+  87, 90, 78, 69, 86, 70, 94, 86, 86, 80,
+  82, 94, 84, 77, 103, 85, 113, 77, 86, 82,
+  94, 88, 88, 64, 87, 70, 86, 83, 87, 88,
+  81, 104, 69, 78, 96, 75, 82, 77, 95, 78,
+  83, 78, 74, 87, 78, 107, 101, 83, 72, 77,
+  77, 87, 83, 73, 86, 81, 78, 76, 77, 72,
+  79, 100, 61, 93, 92, 97, 85, 81, 66, 78,
+  75, 80, 83, 73, 89, 97, 86, 88, 121, 73,
+  80, 96, 87, 92, 76, 80, 101, 81, 80, 113,
+  87, 75, 99, 89, 108, 88, 76, 82, 83, 77,
+  94, 86, 76, 76, 94, 73, 85, 89, 64, 68,
+  102, 79, 102, 70, 87, 84, 77, 87, 88, 77,
+  86, 91, 94, 88, 93, 83, 82, 72, 87, 82,
+  78, 68, 100, 62, 98, 94, 87, 83, 88, 97,
+  80, 73, 107, 78, 107, 82, 94, 82, 97, 92,
+  97, 64, 83, 62, 92, 88, 88, 86, 72, 111,
+  73, 73, 102, 76, 77, 75, 90, 74, 81, 68,
+  72, 82, 74, 114, 101, 88, 73, 76, 87, 88,
+  68, 69, 92, 82, 76, 67, 63, 77, 72, 109,
+  63, 93, 87, 96, 77, 77, 69, 79, 66, 87,
+  77, 72, 88, 91, 92, 89, 122, 66, 87, 98,
+  83, 93, 68, 84, 73, 81, 73, 108, 88, 68,
+  100, 85, 87, 90, 86, 89, 78, 83, 89, 87,
+  81, 83, 92, 78, 83, 82, 62, 74, 84, 81,
+  103, 73, 79, 81, 88, 81, 82, 76, 85, 100,
+  86, 95, 89, 88, 89, 79, 85, 93, 81, 68,
+  93, 76, 88, 84, 81, 82, 83, 97, 85, 82,
+  104, 88, 102, 77, 81, 80, 90, 79, 85, 67,
+  88, 74, 90, 77, 85, 82, 83, 102, 77, 82,
+  96, 81, 74, 79, 87, 79, 87, 79, 79, 81,
+  77, 101, 98, 83, 76, 99, 78, 88, 78, 78,
+  84, 91, 78, 72, 79, 78, 75, 96, 63, 89,
+  80, 94, 86, 77, 69, 79, 76, 77, 78, 74,
+  92, 95, 95, 86, 121, 87, 75, 91, 85, 93,
+  75, 83, 69, 87, 79, 108, 89, 77, 97, 92,
+  93, 77, 66, 91, 77, 84, 84, 97, 87, 78,
+  89, 78, 85, 86, 69, 74, 84, 81, 94, 81,
+  82, 92, 78, 80, 82, 80, 93, 89, 89, 83,
+  80, 78, 92, 71, 85, 86, 86, 81, 88, 66,
+  94, 90, 76, 84, 79, 91, 90, 83, 92, 93,
+  91, 77, 87, 82, 98, 84, 91, 62, 92, 71,
+  79, 81, 91, 87, 88, 99, 70, 84, 83, 87,
+  96, 73, 97, 78, 85, 80, 77, 92, 88, 85,
+  91, 65, 78, 75, 78, 80, 87, 87, 88, 71,
+  84, 89, 82, 81, 81, 78, 67, 76, 87, 89,
+  97, 85, 77, 79, 82, 77, 88, 83, 82, 90,
+  86, 89, 110, 80, 83, 94, 83, 85, 77, 73,
+  93, 76, 85, 109, 88, 77, 95, 83, 99, 79,
+  78, 87, 76, 79, 87, 94, 90, 77, 87, 81,
+  82, 90, 69, 74, 98, 83, 93, 75, 79, 89,
+  82, 81, 80, 79, 91, 85, 92, 85, 80, 81,
+  92, 69, 82, 81, 78, 75, 93, 58, 100, 90,
+  84, 83, 80, 91, 87, 77, 87, 91, 93, 75,
+  95, 81, 97, 80, 102, 62, 92, 65, 81, 87,
+  89, 83, 76, 98, 71, 78, 82, 83, 77, 68,
+  99, 75, 79, 76, 80, 86, 85, 89, 91, 69,
+  84, 83, 83, 81, 77, 81, 94, 75, 96, 85,
+  77, 85, 73, 78, 71, 80, 82, 88, 90, 74,
+  77, 81, 76, 81, 91, 79, 80, 90, 85, 89,
+  109, 75, 85, 94, 81, 82, 70, 75, 75, 80,
+  85, 105, 89, 74, 95, 78, 87, 80, 90, 90,
+  81, 78, 87, 89, 87, 84, 84, 80, 82, 86,
+  70, 77, 79, 78, 90, 72, 72, 94, 88, 82,
+  76, 80, 88, 92, 85, 93, 81, 81, 91, 79,
+  79, 92, 83, 79, 88, 73, 94, 92, 83, 82,
+  80, 91, 89, 80, 91, 96, 88, 79, 85, 83,
+  93, 77, 87, 66, 91, 72, 82, 85, 85, 88,
+  87, 96, 77, 83, 84, 94, 72, 74, 92, 83,
+  85, 80, 81, 79, 79, 86, 91, 68, 85, 102,
+  81, 83, 82, 87, 88, 80, 84, 81, 82, 80,
+  69, 81, 66, 74, 78, 87, 98, 79, 75, 80,
+  86, 79, 84, 81, 85, 91, 91, 88, 109, 88,
+  79, 92, 81, 85, 80, 77, 66, 76, 85, 101,
+  90, 81, 93, 84, 75, 66, 87, 71, 71, 71,
+  83, 83, 94, 95, 79, 71, 82, 67, 61, 72,
+  79, 116, 75, 72, 81, 85, 90, 86, 72, 78,
+  95, 88, 110, 72, 94, 78, 87, 72, 59, 80,
+  61, 81, 90, 82, 81, 85, 76, 71, 88, 74,
+  78, 80, 97, 87, 84, 62, 77, 77, 88, 66,
+  82, 63, 73, 78, 96, 90, 87, 97, 49, 74,
+  106, 125, 76, 124, 78, 81, 110, 73, 93, 79,
+  81, 57, 79, 68, 78, 62, 88, 109, 93, 86,
+  82, 94, 53, 101, 95, 91, 85, 84, 90, 82,
+  77, 84, 96, 65, 87, 85, 100, 98, 78, 106,
+  74, 82, 75, 86, 73, 149, 86, 84, 98, 105,
+  94, 76, 105, 78, 81, 66, 72, 76, 67, 84,
+  78, 77, 70, 74, 81, 71, 71, 85, 80, 87,
+  93, 100, 75, 89, 68, 79, 63, 71, 90, 119,
+  74, 77, 80, 85, 65, 84, 69, 77, 101, 88,
+  108, 65, 86, 82, 94, 74, 65, 92, 65, 80,
+  59, 68, 83, 74, 82, 76, 89, 74, 71, 88,
+  91, 87, 81, 61, 79, 77, 91, 61, 82, 59,
+  65, 74, 98, 88, 78, 96, 54, 69, 92, 136,
+  80, 109, 75, 70, 112, 75, 95, 72, 82, 62,
+  86, 59, 83, 60, 88, 75, 89, 80, 84, 94,
+  50, 100, 91, 122, 78, 83, 107, 86, 79, 82,
+  85, 66, 91, 126, 101, 97, 88, 109, 67, 79,
+  73, 83, 76, 151, 90, 82, 91, 88, 71, 73,
+  98, 71, 70, 66, 73, 72, 64, 85, 76, 74,
+  91, 81, 96, 72, 82, 82, 67, 104, 85, 92,
+  80, 84, 85, 88, 57, 81, 94, 100, 79, 77,
+  92, 87, 69, 78, 73, 82, 98, 83, 105, 71,
+  84, 84, 112, 77, 70, 90, 72, 88, 83, 96,
+  85, 76, 75, 77, 88, 97, 80, 85, 89, 90,
+  92, 92, 79, 75, 102, 78, 92, 62, 90, 71,
+  81, 93, 83, 75, 45, 88, 81, 105, 83, 74,
+  67, 74, 127, 81, 76, 81, 75, 75, 75, 80,
+  89, 71, 91, 80, 85, 82, 89, 81, 68, 88,
+  100, 118, 82, 88, 109, 83, 71, 82, 93, 78,
+  80, 92, 93, 87, 68, 101, 76, 88, 70, 95,
+  82, 104, 89, 88, 89, 99, 76, 77, 91, 72,
+  87, 77, 90, 88, 74, 75, 90, 98, 80, 80,
+  91, 88, 86, 80, 97, 76, 78, 85, 86, 75,
+  90, 77, 82, 75, 70, 80, 76, 74, 88, 85,
+  81, 87, 80, 79, 82, 91, 91, 84, 95, 79,
+  76, 98, 73, 85, 73, 79, 92, 91, 78, 76,
+  74, 85, 77, 75, 86, 83, 82, 77, 79, 86,
+  75, 91, 78, 87, 65, 82, 81, 82, 93, 79,
+  92, 95, 87, 61, 73, 69, 82, 108, 77, 97,
+  76, 77, 97, 68, 88, 69, 90, 80, 91, 73,
+  79, 89, 99, 86, 84, 98, 77, 82, 78, 68,
+  84, 88, 72, 69, 87, 99, 86, 84, 80, 75,
+  93, 88, 94, 84, 89, 84, 98, 84, 95, 100,
+  87, 81, 88, 102, 97, 79, 93, 99, 89, 71,
+  91, 82, 81, 88, 77, 72, 79, 95, 76, 87,
+  94, 77, 103, 71, 81, 87, 84, 89, 94, 93,
+  91, 80, 74, 77, 81, 73, 73, 84, 71, 91,
+  82, 82, 82, 99, 90, 61, 105, 73, 75, 99,
+  80, 82, 70, 75, 72, 89, 79, 77, 102, 90,
+  71, 69, 86, 79, 86, 81, 83, 84, 76, 98,
+  80, 94, 58, 86, 79, 89, 94, 73, 77, 95,
+  78, 58, 65, 63, 78, 80, 95, 96, 62, 74,
+  113, 63, 90, 87, 107, 72, 94, 83, 85, 58,
+  99, 85, 83, 91, 72, 94, 70, 76, 75, 94,
+  65, 71, 95, 105, 95, 81, 72, 88, 92, 91,
+  104, 80, 81, 82, 109, 85, 99, 96, 93, 84,
+  81, 90, 72, 81, 94, 93, 71, 66, 92, 77,
+  81, 86, 67, 70, 77, 92, 77, 78, 77, 103,
+  84, 83, 77, 99, 86, 82, 68, 101, 68, 69,
+  86, 88, 78, 90, 86, 79, 68, 82, 82, 81,
+  98, 93, 88, 73, 84, 74, 83, 79, 78, 98,
+  74, 80, 67, 75, 84, 78, 83, 79, 80, 85,
+  82, 97, 82, 78, 80, 75, 69, 78, 91, 72,
+  90, 74, 75, 74, 93, 97, 93, 85, 70, 67,
+  70, 99, 82, 86, 94, 81, 94, 86, 103, 82,
+  88, 88, 100, 77, 82, 66, 79, 63, 95, 77,
+  91, 84, 73, 90, 78, 104, 78, 86, 92, 75,
+  81, 93, 82, 76, 84, 120, 98, 92, 76, 91,
+  74, 76, 86, 81, 88, 114, 84, 86, 89, 88,
+  83, 77, 86, 76, 81, 69, 78, 80, 76, 73,
+  84, 79, 80, 84, 87, 86, 88, 91, 86, 84,
+  67, 85, 88, 90, 91, 80, 90, 72, 75, 82,
+  78, 80, 90, 91, 81, 86, 87, 81, 79, 80,
+  85, 88, 77, 80, 82, 98, 80, 90, 86, 85,
+  88, 93, 81, 66, 77, 86, 83, 77, 86, 79,
+  71, 74, 85, 107, 75, 90, 75, 84, 77, 77,
+  92, 80, 79, 89, 96, 87, 86, 74, 84, 79,
+  87, 85, 81, 91, 85, 76, 87, 71, 94, 83,
+  75, 86, 96, 80, 85, 85, 83, 82, 92, 80,
+  105, 81, 87, 78, 95, 97, 82, 77, 73, 92,
+  76, 92, 87, 78, 82, 75, 75, 85, 93, 89,
+  98, 90, 87, 80, 87, 81, 77, 85, 88, 81,
+  90, 101, 91, 87, 85, 87, 92, 79, 91, 83,
+  78, 89, 91, 86, 90, 81, 87, 79, 76, 81,
+  88, 99, 101, 89, 93, 77, 78, 84, 79, 79,
+  80, 90, 82, 93, 83, 76, 78, 84, 83, 77,
+  81, 83, 86, 92, 78, 86, 90, 92, 83, 96,
+  86, 72, 93, 88, 79, 76, 83, 74, 67, 80,
+  95, 108, 75, 92, 77, 85, 73, 73, 97, 78,
+  77, 86, 88, 86, 84, 74, 79, 76, 89, 82,
+  93, 90, 86, 78, 86, 76, 93, 89, 76, 90,
+  97, 86, 90, 80, 75, 83, 87, 81, 97, 89,
+  84, 77, 94, 96, 75, 74, 80, 98, 89, 99,
+  85, 80, 76, 76, 68, 84, 85, 89, 91, 95,
+  86, 75, 87, 89, 81, 76, 85, 82, 91, 98,
+  86, 83, 85, 84, 90, 76, 87, 84, 83, 108,
+  93, 83, 86, 98, 84, 86, 77, 85, 88, 86,
+  79, 98, 78, 72, 82, 85, 79, 80, 89, 81,
+  80, 87, 86, 85, 81, 85, 77, 72, 83, 83,
+  86, 85, 85, 96, 84, 82, 79, 83, 89, 78,
+  88, 78, 79, 84, 84, 88, 81, 76, 86, 85,
+  71, 82, 85, 86, 86, 82, 77, 76, 86, 91,
+  97, 93, 74, 76, 83, 84, 95, 76, 88, 82,
+  88, 77, 98, 81, 86, 90, 90, 83, 87, 78,
+  80, 70, 80, 79, 87, 80, 90, 88, 82, 80,
+  89, 95, 90, 74, 78, 96, 94, 81, 86, 92,
+  83, 80, 67, 87, 83, 79, 97, 90, 89, 84,
+  87, 91, 80, 81, 97, 80, 86, 82, 82, 77,
+  87, 86, 81, 81, 88, 85, 82, 79, 79, 105,
+  90, 79, 81, 71, 82, 70, 71, 90, 85, 82,
+  81, 80, 87, 93, 60, 81, 86, 81, 99, 77,
+  77, 65, 83, 116, 94, 79, 84, 85, 76, 85,
+  79, 82, 78, 79, 86, 82, 86, 82, 82, 85,
+  89, 75, 83, 94, 81, 82, 82, 78, 82, 94,
+  85, 90, 65, 83, 78, 83, 87, 104, 85, 88,
+  96, 75, 78, 92, 79, 97, 75, 88, 88, 84,
+  82, 77, 85, 86, 80, 82, 69, 83, 72, 93,
+  89, 82, 79, 79, 77, 77, 80, 88, 86, 77,
+  88, 81, 103, 90, 94, 82, 82, 81, 101, 90,
+  89, 92, 75, 105, 95, 80, 78, 81, 76, 77,
+  99, 90, 94, 77, 67, 78, 85, 75, 84, 71,
+  87, 80, 70, 99, 81, 87, 83, 114, 100, 92,
+  84, 63, 88, 60, 68, 82, 87, 82, 89, 87,
+  90, 94, 55, 83, 86, 74, 87, 79, 86, 65,
+  80, 129, 97, 85, 85, 95, 78, 83, 83, 84,
+  84, 69, 84, 84, 90, 85, 87, 89, 94, 74,
+  84, 83, 81, 83, 84, 76, 79, 96, 90, 85,
+  64, 79, 77, 80, 87, 98, 86, 81, 86, 67,
+  72, 89, 74, 97, 82, 90, 81, 85, 84, 75,
+  81, 87, 80, 90, 70, 80, 78, 77, 91, 81,
+  80, 83, 76, 88, 75, 87, 86, 80, 80, 90,
+  107, 89, 89, 81, 76, 87, 97, 90, 85, 90,
+  77, 110, 100, 85, 79, 89, 77, 75, 99, 88,
+  77, 72, 58, 83, 79, 75, 84, 78, 94, 76,
+  60, 102, 83, 92, 87, 103, 84, 95, 81, 72,
+  82, 73, 72, 89, 81, 82, 80, 84, 86, 86,
+  60, 83, 80, 74, 73, 78, 84, 71, 84, 114,
+  91, 77, 86, 91, 76, 77, 76, 91, 84, 81,
+  81, 84, 81, 85, 85, 83, 89, 79, 86, 82,
+  77, 79, 82, 77, 83, 91, 85, 83, 67, 88,
+  76, 84, 90, 101, 86, 90, 96, 75, 77, 90,
+  77, 91, 93, 85, 90, 85, 83, 81, 80, 89,
+  84, 85, 71, 84, 72, 83, 89, 80, 85, 77,
+  82, 86, 80, 96, 83, 78, 76, 80, 102, 92,
+  81, 87, 82, 98, 106, 89, 85, 89, 79, 100,
+  99, 82, 78, 82, 82, 79, 95, 85, 77, 79,
+  68, 78, 78, 74, 77, 74, 89, 79, 68, 95,
+  77, 75, 85, 118, 86, 88, 76, 75, 83, 67,
+  75, 81, 84, 84, 78, 94, 88, 86, 57, 81,
+  85, 77, 98, 77, 82, 66, 75, 132, 97, 89,
+  81, 86, 79, 80, 86, 80, 79, 86, 85, 77,
+  81, 85, 77, 89, 86, 75, 79, 101, 74, 81,
+  73, 84, 79, 94, 89, 93, 62, 93, 76, 84,
+  78, 99, 84, 84, 89, 73, 83, 86, 87, 86,
+  91, 81, 77, 80, 83, 72, 83, 81, 78, 76,
+  75, 95, 66, 80, 89, 80, 76, 85, 81, 71,
+  82, 87, 86, 79, 86, 83, 110, 89, 88, 87,
+  74, 79, 101, 85, 87, 93, 80, 106, 92, 72,
+  86, 86, 83, 83, 93, 87, 85, 80, 64, 81,
+  82, 75, 88, 73, 98, 79, 59, 99, 92, 90,
+  93, 123, 95, 88, 78, 78, 100, 58, 79, 76,
+  103, 80, 84, 105, 91, 82, 53, 80, 81, 68,
+  84, 86, 88, 70, 75, 148, 97, 83, 81, 99,
+  83, 74, 91, 74, 87, 82, 88, 87, 77, 107,
+  84, 86, 92, 66, 81, 86, 73, 83, 83, 85,
+  79, 97, 91, 93, 61, 90, 66, 75, 71, 88,
+  83, 98, 68, 76, 80, 72, 85, 73, 81, 86,
+  70, 87, 79, 70, 82, 90, 74, 93, 77, 100,
+  77, 72, 89, 83, 72, 85, 80, 76, 85, 82,
+  85, 74, 69, 88, 118, 85, 91, 92, 69, 74,
+  89, 82, 77, 92, 82, 112, 100, 79, 92, 82,
+  84, 66, 91, 85, 69, 77, 57, 81, 75, 74,
+  98, 86, 111, 72, 51, 107, 79, 92, 98, 116,
+  81, 98, 76, 74, 80, 71, 74, 83, 78, 81,
+  79, 91, 86, 83, 59, 91, 78, 77, 82, 77,
+  85, 72, 78, 126, 93, 76, 82, 90, 77, 73,
+  86, 89, 85, 86, 82, 80, 79, 85, 83, 84,
+  84, 75, 79, 82, 70, 77, 77, 79, 81, 91,
+  90, 88, 66, 94, 77, 85, 83, 96, 86, 84,
+  92, 73, 82, 87, 85, 90, 89, 81, 83, 81,
+  86, 74, 81, 93, 88, 79, 75, 94, 72, 84,
+  87, 80, 86, 82, 81, 82, 79, 89, 84, 79,
+  78, 83, 107, 90, 87, 91, 75, 88, 102, 85,
+  81, 92, 81, 99, 93, 73, 84, 85, 87, 75,
+  88, 84, 89, 84, 65, 81, 74, 76, 81, 72,
+  98, 80, 61, 92, 73, 75, 86, 121, 83, 82,
+  72, 75, 81, 74, 82, 85, 81, 78, 77, 91,
+  88, 82, 58, 85, 90, 77, 89, 76, 85, 78,
+  73, 114, 92, 82, 86, 89, 80, 88, 84, 84,
+  83, 101, 84, 85, 81, 87, 78, 82, 87, 91,
+  71, 96, 72, 85, 77, 79, 86, 90, 91, 91,
+  72, 87, 88, 78, 80, 89, 81, 83, 97, 82,
+  91, 87, 94, 79, 95, 92, 85, 84, 77, 83,
+  79, 86, 80, 84, 74, 84, 66, 79, 88, 85,
+  75, 75, 77, 76, 94, 83, 82, 83, 93, 75,
+  102, 87, 84, 101, 82, 81, 100, 84, 85, 94,
+  84, 95, 84, 65, 82, 85, 78, 94, 92, 85,
+  81, 87, 73, 94, 77, 74, 80, 66, 88, 84,
+  65, 94, 73, 83, 102, 124, 85, 90, 75, 74,
+  85, 73, 82, 79, 90, 80, 78, 92, 88, 85,
+  50, 89, 83, 67, 87, 79, 85, 83, 71, 130,
+  88, 77, 83, 97, 78, 87, 85, 82, 89, 115,
+  83, 90, 79, 86, 86, 81, 87, 80, 63, 91,
+  74, 84, 79, 81, 86, 91, 86, 90, 69, 73,
+  78, 71, 74, 88, 84, 78, 88, 77, 87, 82,
+  100, 88, 84, 95, 83, 87, 75, 79, 80, 96,
+  73, 94, 76, 83, 63, 78, 88, 85, 76, 82,
+  66, 74, 93, 88, 81, 83, 89, 78, 106, 84,
+  84, 102, 73, 80, 93, 83, 77, 101, 82, 99,
+  76, 67, 82, 83, 77, 79, 90, 88, 82, 91,
+  65, 88, 74, 74, 85, 63, 95, 81, 61, 90,
+  77, 83, 92, 117, 81, 89, 75, 78, 78, 76,
+  80, 88, 81, 84, 77, 86, 89, 83, 60, 86,
+  82, 76, 83, 75, 84, 80, 71, 109, 88, 76,
+  89, 90, 79, 90, 80, 87, 86, 98, 80, 84,
+  80, 83, 90, 82, 86, 84, 71, 88, 67, 83,
+  77, 79, 85, 87, 88, 86, 78, 86, 86, 80,
+  83, 84, 83, 84, 93, 84, 87, 86, 97, 85,
+  77, 87, 88, 85, 79, 84, 83, 95, 80, 81,
+  73, 83, 72, 78, 89, 77, 92, 77, 70, 80,
+  92, 92, 83, 86, 83, 74, 98, 89, 85, 96,
+  84, 81, 101, 85, 75, 91, 84, 88, 83, 70,
+  78, 83, 78, 77, 92, 83, 98, 89, 78, 92,
+  82, 77, 80, 69, 86, 88, 70, 90, 85, 76,
+  95, 78, 81, 92, 73, 91, 73, 81, 83, 83,
+  103, 78, 96, 73, 94, 82, 79, 113, 101, 88,
+  86, 86, 82, 78, 79, 83, 81, 80, 79, 79,
+  98, 67, 65, 86, 71, 74, 70, 97, 88, 80,
+  81, 74, 86, 78, 94, 83, 84, 64, 75, 98,
+  87, 80, 89, 77, 76, 80, 81, 124, 93, 76,
+  98, 89, 95, 88, 95, 81, 83, 87, 68, 87,
+  84, 96, 79, 77, 56, 87, 105, 75, 78, 78,
+  87, 90, 87, 72, 89, 85, 76, 89, 83, 94,
+  76, 87, 78, 75, 78, 70, 89, 83, 53, 46,
+  80, 126, 82, 83, 83, 97, 95, 90, 78, 86,
+  93, 92, 92, 80, 94, 80, 65, 94, 96, 88,
+  78, 82, 60, 98, 81, 80, 82, 77, 70, 76,
+  66, 75, 62, 82, 64, 82, 87, 76, 107, 76,
+  111, 52, 111, 80, 81, 121, 86, 63, 84, 79,
+  78, 75, 86, 82, 105, 80, 68, 81, 105, 70,
+  77, 64, 81, 76, 80, 77, 76, 88, 100, 60,
+  86, 64, 78, 79, 77, 65, 75, 70, 64, 79,
+  76, 83, 73, 72, 73, 139, 91, 75, 81, 91,
+  80, 82, 108, 112, 73, 83, 81, 90, 78, 98,
+  75, 70, 60, 63, 102, 71, 66, 68, 89, 102,
+  94, 68, 80, 87, 52, 69, 89, 110, 80, 89,
+  78, 79, 80, 58, 83, 85, 53, 92, 89, 119,
+  104, 76, 92, 104, 98, 85, 75, 86, 83, 81,
+  77, 85, 69, 88, 75, 77, 99, 104, 74, 69,
+  34, 91, 92, 102, 86, 105, 81, 85, 94, 78,
+  82, 87, 99, 84, 70, 92, 72, 74, 86, 83,
+  90, 92, 82, 76, 88, 87, 84, 91, 86, 81,
+  87, 82, 79, 69, 89, 76, 88, 89, 85, 88,
+  90, 77, 76, 97, 93, 87, 97, 95, 93, 81,
+  101, 95, 82, 71, 76, 103, 108, 85, 119, 89,
+  80, 79, 94, 88, 81, 89, 91, 64, 81, 92,
+  83, 75, 92, 87, 106, 84, 84, 83, 79, 82,
+  67, 85, 103, 83, 110, 71, 85, 85, 83, 77,
+  96, 81, 101, 80, 90, 92, 76, 91, 97, 80,
+  74, 81, 80, 85, 63, 64, 82, 115, 75, 91,
+  80, 91, 84, 94, 77, 79, 98, 88, 67, 81,
+  91, 78, 70, 92, 102, 65, 87, 98, 80, 87,
+  80, 85, 91, 57, 82, 77, 85, 80, 79, 88,
+  63, 84, 99, 69, 97, 62, 96, 77, 83, 72,
+  87, 111, 89, 83, 89, 81, 69, 88, 90, 88,
+  97, 70, 74, 82, 91, 83, 88, 87, 55, 82,
+  76, 86, 81, 83, 96, 69, 84, 78, 97, 86,
+  71, 65, 77, 81, 68, 84, 84, 91, 83, 81,
+  83, 148, 81, 87, 86, 89, 85, 75, 88, 81,
+  86, 63, 95, 107, 94, 84, 81, 81, 66, 86,
+  86, 86, 58, 71, 84, 103, 97, 77, 89, 83,
+  84, 103, 84, 88, 71, 82, 95, 82, 74, 56,
+  83, 79, 54, 87, 82, 120, 75, 79, 77, 100,
+  95, 92, 86, 78, 87, 87, 80, 77, 78, 85,
+  74, 80, 77, 106, 69, 73, 59, 79, 92, 73,
+  82, 76, 79, 78, 70, 72, 67, 76, 46, 88,
+  99, 67, 99, 77, 107, 65, 93, 65, 81, 138,
+  80, 68, 83, 74, 75, 87, 92, 86, 110, 104,
+  65, 86, 86, 77, 83, 75, 79, 95, 72, 69,
+  91, 89, 81, 55, 90, 55, 77, 74, 75, 72,
+  70, 50, 40, 85, 57, 71, 81, 72, 62, 162,
+  95, 81, 78, 97, 68, 67, 92, 102, 80, 64,
+  66, 128, 86, 74, 73, 76, 78, 69, 79, 81,
+  41, 68, 77, 95, 103, 92, 79, 89, 51, 93,
+  79, 90, 84, 75, 90, 85, 75, 44, 84, 85,
+  64, 79, 94, 114, 82, 69, 75, 108, 89, 86,
+  82, 74, 77, 80, 89, 85, 66, 97, 77, 78,
+  104, 120, 52, 63, 27, 70, 100, 94, 85, 107,
+  88, 86, 88, 89, 86, 86, 100, 84, 75, 85,
+  73, 91, 85, 91, 80, 94, 83, 68, 87, 103,
+  87, 85, 75, 78, 95, 87, 88, 74, 85, 81,
+  84, 77, 89, 85, 76, 82, 80, 95, 87, 88,
+  89, 89, 91, 80, 96, 76, 73, 74, 75, 104,
+  96, 83, 120, 74, 79, 72, 93, 91, 81, 90,
+  84, 53, 81, 87, 82, 70, 90, 82, 93, 89,
+  97, 86, 77, 80, 75, 81, 72, 94, 103, 65,
+  87, 90, 79, 83, 90, 83, 101, 76, 92, 84,
+  74, 81, 90, 81, 79, 75, 93, 76, 63, 46,
+  80, 111, 70, 88, 82, 85, 81, 92, 87, 83,
+  91, 88, 75, 95, 101, 78, 76, 88, 101, 73,
+  78, 90, 76, 85, 82, 84, 94, 68, 93, 93,
+  78, 90, 82, 89, 86, 93, 86, 86, 99, 80,
+  94, 88, 81, 87, 86, 80, 97, 78, 82, 92,
+  86, 85, 77, 85, 81, 81, 93, 92, 83, 78,
+  72, 87, 72, 87, 85, 87, 89, 68, 92, 97,
+  80, 97, 89, 93, 72, 89, 80, 101, 97, 93,
+  108, 88, 79, 83, 98, 96, 73, 91, 96, 85,
+  91, 78, 91, 83, 84, 85, 85, 76, 95, 90,
+  87, 82, 84, 83, 80, 74, 90, 94, 87, 82,
+  89, 85, 89, 82, 94, 108, 86, 97, 71, 74,
+  91, 71, 79, 84, 78, 80, 59, 108, 85, 109,
+  87, 89, 91, 78, 83, 89, 86, 77, 96, 83,
+  92, 95, 80, 84, 78, 84, 87, 81, 86, 86,
+  94, 87, 90, 68, 89, 83, 82, 93, 75, 77,
+  78, 79, 90, 88, 86, 84, 103, 95, 97, 90,
+  84, 91, 86, 74, 89, 82, 88, 99, 87, 75,
+  82, 90, 90, 86, 86, 81, 82, 70, 68, 67,
+  74, 84, 84, 84, 82, 72, 85, 88, 73, 101,
+  82, 69, 68, 98, 77, 100, 93, 92, 111, 91,
+  78, 88, 94, 78, 74, 87, 91, 82, 92, 76,
+  80, 71, 77, 93, 71, 69, 87, 87, 79, 79,
+  75, 77, 75, 67, 85, 88, 95, 87, 89, 87,
+  84, 82, 105, 119, 85, 95, 77, 62, 85, 66,
+  81, 73, 94, 83, 66, 101, 78, 105, 81, 96,
+  90, 81, 78, 88, 83, 79, 90, 86, 93, 98,
+  79, 80, 71, 89, 87, 83, 82, 81, 76, 81,
+  90, 78, 88, 101, 83, 90, 83, 83, 80, 87,
+  89, 94, 86, 89, 86, 85, 89, 96, 88, 82,
+  82, 80, 83, 84, 83, 87, 82, 79, 85, 78,
+  78, 80, 87, 81, 76, 83, 87, 92, 83, 85,
+  78, 89, 89, 79, 89, 99, 84, 85, 76, 87,
+  77, 79, 80, 85, 95, 90, 100, 82, 83, 84,
+  88, 97, 81, 89, 87, 72, 91, 88, 87, 89,
+  94, 83, 78, 82, 84, 84, 88, 82, 77, 87,
+  69, 85, 98, 82, 83, 92, 88, 84, 86, 84,
+  82, 99, 79, 98, 78, 79, 96, 78, 81, 89,
+  95, 75, 70, 88, 87, 103, 86, 83, 90, 86,
+  92, 77, 89, 79, 92, 89, 76, 94, 92, 84,
+  78, 86, 86, 81, 77, 89, 89, 87, 87, 73,
+  103, 83, 91, 88, 111, 80, 73, 88, 70, 89,
+  89, 85, 92, 90, 77, 69, 85, 82, 93, 102,
+  76, 79, 76, 73, 95, 92, 69, 79, 92, 87,
+  87, 87, 86, 86, 86, 94, 74, 71, 77, 92,
+  75, 76, 97, 71, 84, 75, 75, 83, 87, 74,
+  80, 70, 70, 95, 60, 87, 77, 89, 69, 98,
+  88, 88, 106, 68, 69, 79, 82, 105, 89, 81,
+  84, 93, 86, 79, 106, 76, 76, 75, 86, 87,
+  72, 88, 82, 74, 89, 71, 91, 96, 82, 81,
+  82, 88, 82, 102, 71, 107, 93, 94, 92, 89,
+  86, 93, 95, 90, 81, 74, 83, 91, 94, 77,
+  80, 82, 95, 89, 94, 70, 84, 84, 77, 81,
+  101, 78, 73, 80, 75, 79, 88, 67, 90, 91,
+  83, 89, 100, 93, 76, 90, 78, 94, 91, 91,
+  87, 94, 76, 71, 86, 78, 90, 104, 73, 73,
+  70, 80, 90, 85, 87, 84, 95, 88, 84, 92,
+  89, 73, 90, 108, 85, 78, 81, 80, 77, 75,
+  101, 75, 90, 90, 77, 87, 79, 78, 78, 83,
+  70, 86, 80, 99, 87, 83, 82, 101, 79, 79,
+  93, 58, 66, 71, 79, 102, 75, 72, 109, 86,
+  92, 87, 103, 77, 74, 79, 83, 71, 81, 77,
+  86, 72, 82, 77, 83, 85, 80, 75, 77, 101,
+  81, 102, 80, 95, 87, 84, 78, 87, 82, 105,
+  93, 86, 84, 79, 87, 87, 99, 78, 80, 85,
+  91, 84, 89, 72, 74, 79, 81, 79, 86, 86,
+  82, 81, 73, 77, 85, 82, 80, 97, 91, 86,
+  76, 103, 81, 79, 94, 89, 79, 90, 95, 87,
+  61, 78, 80, 83, 72, 90, 84, 94, 72, 91,
+  87, 78, 107, 88, 100, 84, 88, 91, 91, 63,
+  88, 94, 83, 84, 93, 74, 86, 74, 93, 90,
+  88, 129, 97, 92, 80, 97, 79, 110, 92, 71,
+  129, 106, 104, 71, 105, 85, 71, 80, 84, 65,
+  53, 73, 65, 77, 78, 93, 91, 75, 103, 99,
+  81, 85, 94, 94, 82, 62, 91, 68, 94, 76,
+  63, 87, 88, 70, 77, 65, 92, 108, 98, 85,
+  90, 71, 66, 77, 82, 90, 89, 88, 81, 83,
+  87, 89, 90, 81, 87, 96, 79, 85, 78, 81,
+  81, 100, 101, 83, 91, 85, 95, 100, 87, 76,
+  88, 85, 75, 112, 94, 78, 85, 89, 78, 82,
+  79, 91, 78, 89, 83, 90, 81, 85, 93, 71,
+  84, 91, 87, 76, 82, 79, 79, 77, 86, 85,
+  73, 78, 81, 80, 84, 88, 75, 83, 92, 81,
+  79, 82, 77, 87, 82, 90, 92, 78, 76, 79,
+  83, 84, 84, 71, 95, 73, 78, 91, 71, 80,
+  75, 87, 72, 68, 81, 91, 90, 80, 77, 93,
+  79, 69, 94, 85, 87, 89, 85, 84, 98, 70,
+  93, 75, 80, 109, 73, 88, 80, 64, 83, 72,
+  85, 91, 87, 76, 73, 85, 92, 83, 69, 103,
+  91, 96, 102, 94, 84, 83, 83, 87, 79, 78,
+  75, 83, 68, 83, 83, 84, 90, 77, 84, 73,
+  74, 84, 85, 93, 97, 75, 69, 74, 64, 77,
+  83, 68, 91, 89, 83, 88, 94, 83, 80, 92,
+  76, 93, 93, 89, 77, 96, 88, 79, 92, 81,
+  94, 91, 72, 73, 72, 81, 84, 92, 70, 80,
+  74, 79, 87, 91, 77, 86, 88, 95, 87, 82,
+  78, 84, 86, 85, 94, 78, 83, 73, 77, 85,
+  82, 70, 95, 71, 70, 95, 71, 85, 81, 85,
+  78, 89, 80, 78, 92, 66, 68, 81, 79, 86,
+  91, 78, 84, 87, 83, 80, 103, 72, 78, 76,
+  74, 94, 81, 86, 76, 67, 96, 82, 81, 90,
+  81, 73, 70, 79, 81, 98, 76, 103, 91, 95,
+  86, 83, 78, 86, 89, 83, 77, 72, 81, 85,
+  80, 75, 83, 83, 89, 83, 78, 73, 78, 77,
+  81, 85, 83, 75, 80, 82, 63, 76, 85, 67,
+  88, 96, 87, 84, 75, 108, 84, 83, 82, 97,
+  88, 87, 85, 88, 75, 80, 86, 86, 78, 91,
+  78, 81, 71, 80, 84, 85, 91, 86, 85, 74,
+  84, 92, 80, 64, 93, 97, 85, 76, 84, 73,
+  82, 73, 84, 84, 86, 106, 91, 89, 77, 92,
+  76, 103, 82, 78, 104, 94, 95, 76, 92, 87,
+  81, 79, 84, 68, 64, 74, 67, 86, 80, 92,
+  105, 72, 96, 91, 85, 85, 91, 91, 81, 71,
+  89, 75, 82, 73, 71, 78, 93, 81, 73, 67,
+  82, 98, 90, 87, 86, 82, 78, 79, 68, 90,
+  82, 93, 87, 76, 81, 80, 86, 80, 86, 88,
+  81, 85, 75, 85, 76, 83, 99, 79, 89, 86,
+  94, 91, 88, 74, 85, 82, 77, 100, 92, 79,
+  88, 89, 76, 86, 78, 89, 79, 93, 83, 91,
+  87, 81, 89, 77, 85, 92, 81, 93, 87, 82,
+  85, 81, 84, 86, 92, 85, 86, 86, 83, 87,
+  82, 76, 96, 87, 84, 88, 77, 87, 90, 94,
+  92, 83, 80, 77, 78, 78, 82, 75, 84, 77,
+  87, 84, 75, 80, 74, 99, 75, 78, 77, 85,
+  84, 82, 82, 89, 75, 81, 88, 90, 81, 86,
+  86, 89, 99, 77, 90, 77, 79, 88, 73, 85,
+  78, 68, 82, 70, 84, 92, 86, 69, 84, 88,
+  100, 84, 71, 91, 81, 86, 104, 94, 86, 90,
+  78, 84, 91, 75, 86, 87, 80, 89, 83, 87,
+  86, 73, 82, 75, 76, 80, 91, 87, 99, 86,
+  81, 69, 74, 86, 81, 76, 89, 77, 89, 90,
+  90, 81, 81, 90, 79, 88, 94, 89, 85, 90,
+  88, 83, 97, 88, 85, 90, 76, 80, 77, 83,
+  79, 90, 82, 86, 87, 88, 88, 91, 78, 89,
+  84, 90, 88, 91, 75, 87, 91, 95, 97, 85,
+  89, 70, 75, 86, 86, 69, 93, 75, 77, 89,
+  68, 79, 77, 89, 78, 89, 83, 74, 85, 72,
+  79, 82, 76, 83, 88, 86, 77, 84, 80, 85,
+  93, 77, 83, 74, 78, 93, 75, 84, 74, 67,
+  90, 82, 78, 90, 82, 67, 75, 78, 86, 97,
+  79, 97, 87, 93, 95, 87, 85, 82, 81, 80,
+  84, 74, 85, 89, 79, 83, 83, 88, 87, 79,
+  84, 76, 83, 78, 85, 84, 84, 83, 78, 78,
+  64, 82, 81, 70, 87, 100, 85, 87, 78, 108,
+  87, 83, 75, 93, 91, 85, 90, 92, 77, 77,
+  92, 91, 76, 96, 74, 83, 72, 84, 79, 86,
+  87, 88, 88, 79, 92, 94, 82, 69, 82, 96,
+  83, 78, 75, 82, 79, 83, 93, 89, 91, 93,
+  88, 100, 84, 87, 85, 93, 81, 79, 87, 81,
+  90, 82, 93, 88, 89, 78, 81, 72, 69, 74,
+  67, 77, 87, 87, 92, 73, 88, 92, 85, 88,
+  88, 82, 80, 80, 86, 86, 75, 68, 80, 76,
+  89, 79, 78, 62, 87, 83, 87, 90, 84, 81,
+  82, 82, 80, 86, 84, 90, 89, 75, 80, 76,
+  87, 83, 86, 87, 81, 89, 80, 86, 80, 77,
+  96, 79, 88, 85, 96, 87, 88, 78, 81, 77,
+  76, 87, 77, 102, 109, 80, 84, 83, 97, 94,
+  81, 76, 77, 88, 80, 90, 77, 83, 80, 85,
+  86, 80, 88, 79, 91, 69, 87, 93, 82, 68,
+  89, 81, 82, 82, 91, 81, 82, 88, 79, 82,
+  78, 87, 74, 67, 86, 85, 80, 113, 84, 90,
+  97, 73, 79, 82, 73, 85, 70, 67, 83, 73,
+  89, 80, 76, 81, 96, 82, 89, 84, 75, 79,
+  88, 89, 86, 81, 99, 75, 72, 94, 81, 84,
+  78, 104, 77, 81, 97, 81, 89, 97, 81, 68,
+  95, 83, 78, 80, 90, 104, 77, 85, 86, 78,
+  78, 90, 85, 86, 84, 81, 93, 90, 93, 84,
+  85, 80, 95, 92, 90, 79, 83, 88, 91, 91,
+  96, 93, 84, 78, 88, 79, 70, 85, 79, 85,
+  81, 90, 100, 74, 86, 94, 106, 80, 72, 67,
+  75, 89, 94, 92, 80, 80, 85, 78, 82, 84,
+  99, 77, 84, 76, 95, 91, 78, 65, 82, 82,
+  89, 87, 96, 83, 85, 88, 82, 71, 86, 93,
+  62, 63, 93, 97, 74, 109, 90, 99, 92, 78,
+  85, 85, 72, 89, 64, 89, 85, 75, 95, 79,
+  70, 84, 96, 81, 92, 91, 69, 81, 92, 77,
+  88, 85, 83, 69, 80, 79, 84, 92, 80, 112,
+  77, 87, 98, 71, 101, 100, 82, 64, 96, 91,
+  64, 65, 80, 106, 63, 86, 83, 78, 91, 91,
+  62, 83, 76, 81, 99, 84, 98, 81, 98, 81,
+  101, 93, 83, 80, 77, 99, 93, 91, 103, 96,
+  85, 81, 97, 72, 73, 88, 82, 96, 76, 78,
+  86, 79, 85, 90, 96, 85, 80, 75, 83, 81,
+  89, 86, 83, 89, 84, 85, 88, 81, 99, 76,
+  81, 71, 87, 92, 84, 70, 79, 88, 79, 82,
+  97, 95, 87, 83, 86, 79, 90, 86, 69, 69,
+  84, 88, 78, 106, 84, 90, 98, 76, 83, 83,
+  73, 90, 68, 96, 83, 82, 88, 80, 80, 84,
+  92, 84, 90, 88, 76, 80, 92, 85, 90, 85,
+  93, 81, 76, 88, 84, 91, 81, 107, 78, 81,
+  93, 73, 99, 102, 85, 72, 97, 87, 76, 81,
+  84, 96, 78, 83, 91, 80, 90, 89, 84, 78,
+  84, 85, 90, 92, 91, 83, 83, 77, 89, 94,
+  88, 81, 78, 93, 96, 87, 96, 91, 80, 81,
+  90, 78, 65, 83, 82, 92, 73, 100, 70, 94,
+  92, 80, 82, 102, 97, 88, 73, 98, 89, 62,
+  64, 90, 80, 86, 78, 83, 71, 92, 71, 70,
+  74, 89, 103, 87, 113, 69, 59, 79, 82, 88,
+  56, 90, 107, 91, 78, 100, 97, 66, 83, 70,
+  95, 97, 75, 81, 95, 70, 59, 76, 75, 65,
+  84, 101, 89, 64, 86, 80, 88, 68, 101, 82,
+  76, 60, 87, 86, 76, 116, 102, 80, 87, 70,
+  73, 92, 63, 74, 99, 74, 88, 60, 82, 79,
+  69, 75, 85, 86, 65, 87, 87, 93, 92, 93,
+  104, 78, 91, 78, 77, 94, 102, 86, 94, 73,
+  85, 76, 69, 91, 68, 82, 73, 73, 82, 92,
+  89, 75, 72, 82, 89, 72, 77, 67, 88, 91,
+  72, 82, 78, 57, 66, 84, 75, 95, 93, 83,
+  79, 113, 103, 90, 76, 106, 92, 71, 65, 87,
+  84, 88, 81, 82, 86, 91, 82, 72, 78, 93,
+  93, 94, 106, 66, 52, 82, 85, 89, 44, 87,
+  88, 109, 77, 103, 107, 63, 75, 72, 94, 102,
+  69, 71, 88, 74, 68, 78, 75, 67, 79, 68,
+  92, 62, 91, 88, 86, 78, 104, 81, 71, 59,
+  81, 86, 76, 106, 69, 79, 98, 80, 75, 103,
+  69, 82, 73, 73, 90, 65, 71, 88, 73, 85,
+  91, 82, 52, 84, 85, 94, 89, 95, 106, 78,
+  89, 77, 64, 101, 109, 75, 87, 72, 69, 76,
+  76, 85, 66, 81, 64, 70, 87, 93, 85, 75,
+  79, 83, 91, 62, 74, 66, 84, 96, 73, 79,
+  76, 57, 76, 76, 92, 92, 88, 72, 83, 100,
+  93, 89, 80, 96, 97, 89, 69, 88, 79, 86,
+  79, 78, 92, 93, 88, 68, 80, 91, 98, 91,
+  97, 72, 62, 82, 87, 88, 57, 79, 93, 99,
+  79, 101, 98, 63, 70, 70, 90, 89, 74, 68,
+  97, 71, 63, 86, 73, 66, 79, 65, 82, 70,
+  87, 81, 83, 78, 108, 85, 79, 68, 88, 80,
+  75, 123, 69, 77, 91, 81, 75, 85, 67, 87,
+  78, 80, 84, 66, 78, 94, 77, 88, 90, 83,
+  70, 86, 85, 85, 92, 94, 98, 80, 93, 76,
+  65, 92, 102, 74, 92, 74, 79, 76, 69, 85,
+  68, 81, 69, 68, 86, 89, 93, 78, 86, 81,
+  89, 66, 81, 72, 84, 92, 68, 86, 79, 66,
+  80, 95, 71, 73, 85, 81, 89, 85, 80, 84,
+  84, 86, 91, 84, 70, 90, 78, 80, 81, 90,
+  67, 89, 82, 81, 86, 84, 93, 84, 77, 83,
+  94, 78, 79, 66, 74, 76, 95, 75, 94, 73,
+  80, 104, 82, 85, 88, 77, 98, 79, 71, 78,
+  80, 92, 80, 79, 78, 97, 68, 85, 82, 94,
+  95, 63, 83, 83, 72, 68, 86, 88, 84, 83,
+  80, 97, 75, 73, 92, 63, 78, 78, 101, 84,
+  95, 91, 80, 85, 88, 83, 79, 91, 107, 68,
+  73, 74, 87, 81, 66, 75, 88, 92, 104, 63,
+  102, 70, 93, 89, 94, 80, 74, 102, 88, 81,
+  82, 82, 77, 77, 106, 108, 81, 75, 90, 89,
+  91, 88, 77, 87, 74, 85, 85, 101, 79, 85,
+  80, 76, 86, 81, 89, 85, 81, 90, 78, 95,
+  79, 88, 73, 98, 77, 90, 85, 85, 73, 85,
+  83, 82, 78, 89, 98, 84, 71, 73, 88, 72,
+  82, 67, 71, 76, 102, 65, 79, 71, 75, 96,
+  76, 88, 99, 72, 103, 77, 74, 82, 78, 97,
+  84, 82, 86, 100, 71, 74, 83, 94, 92, 59,
+  84, 83, 83, 65, 78, 87, 77, 84, 89, 95,
+  81, 76, 95, 72, 81, 71, 113, 82, 97, 99,
+  83, 83, 83, 78, 84, 91, 116, 69, 81, 78,
+  85, 73, 75, 76, 85, 90, 88, 60, 104, 83,
+  96, 89, 96, 82, 75, 103, 86, 85, 91, 85,
+  80, 79, 106, 104, 75, 72, 81, 89, 88, 86,
+  76, 91, 79, 81, 77, 101, 79, 80, 81, 75,
+  89, 82, 86, 88, 84, 88, 84, 89, 84, 92,
+  70, 90, 75, 82, 84, 85, 83, 83, 78, 80,
+  78, 83, 96, 85, 74, 68, 100, 72, 80, 74,
+  76, 78, 102, 70, 79, 75, 74, 107, 72, 84,
+  88, 78, 100, 88, 78, 75, 79, 92, 82, 79,
+  83, 89, 71, 77, 91, 89, 89, 67, 85, 81,
+  72, 75, 75, 80, 85, 75, 84, 91, 82, 75,
+  95, 67, 80, 74, 117, 87, 91, 95, 83, 83,
+  86, 73, 90, 85, 110, 74, 75, 81, 86, 76,
+  78, 78, 86, 87, 85, 71, 97, 101, 95, 88,
+  93, 82, 71, 101, 89, 84, 96, 85, 80, 77,
+  99, 98, 63, 78, 86, 83, 87, 89, 75, 90,
+  78, 85, 81, 99, 68, 89, 88, 88, 89, 74,
+  80, 95, 111, 95, 79, 82, 97, 74, 66, 113,
+  89, 85, 75, 84, 90, 83, 101, 86, 80, 85,
+  82, 87, 91, 81, 61, 92, 101, 75, 65, 93,
+  86, 99, 89, 76, 84, 72, 93, 80, 75, 98,
+  72, 83, 92, 79, 81, 87, 90, 109, 99, 84,
+  95, 70, 87, 82, 87, 77, 84, 85, 82, 87,
+  80, 80, 106, 85, 87, 81, 101, 76, 81, 87,
+  87, 84, 82, 76, 87, 70, 99, 80, 78, 83,
+  90, 75, 72, 73, 102, 80, 83, 82, 96, 83,
+  90, 70, 87, 101, 77, 92, 96, 93, 84, 105,
+  77, 84, 70, 62, 76, 77, 93, 84, 82, 95,
+  91, 82, 72, 80, 76, 74, 95, 85, 90, 81,
+  87, 95, 64, 87, 83, 93, 99, 72, 76, 92,
+  120, 93, 82, 85, 104, 78, 72, 106, 91, 90,
+  77, 84, 101, 86, 86, 82, 82, 75, 89, 88,
+  97, 78, 57, 102, 105, 79, 63, 90, 81, 106,
+  81, 63, 73, 65, 88, 79, 65, 105, 72, 82,
+  90, 75, 84, 87, 90, 113, 87, 71, 105, 65,
+  83, 84, 88, 84, 80, 90, 67, 86, 85, 81,
+  115, 79, 81, 71, 112, 74, 72, 77, 81, 82,
+  82, 68, 87, 67, 96, 82, 80, 84, 83, 80,
+  65, 69, 99, 70, 72, 91, 98, 76, 92, 66,
+  90, 103, 67, 84, 90, 90, 75, 108, 70, 87,
+  76, 56, 73, 71, 92, 86, 91, 91, 90, 88,
+  72, 80, 80, 69, 101, 81, 84, 79, 86, 99,
+  78, 77, 88, 86, 81, 91, 80, 91, 107, 91,
+  81, 76, 97, 85, 76, 116, 87, 90, 82, 82,
+  101, 80, 73, 85, 79, 90, 87, 79, 77, 74,
+  64, 101, 107, 78, 73, 86, 88, 100, 73, 77,
+  79, 74, 82, 75, 72, 96, 71, 76, 92, 83,
+  79, 91, 91, 107, 99, 61, 101, 79, 75, 84,
+  82, 82, 87, 84, 84, 86, 91, 81, 106, 90,
+  75, 76, 104, 82, 70, 83, 79, 78, 78, 79,
+  94, 71, 93, 91, 81, 86, 78, 73, 78, 69,
+  94, 76, 78, 86, 93, 76, 88, 73, 77, 89,
+  69, 82, 92, 87, 86, 101, 74, 82, 72, 69,
+  79, 71, 95, 85, 88, 90, 96, 82, 75, 80,
+  85, 75, 107, 86, 91, 80, 94, 104, 67, 85,
+  96, 78, 94, 81, 89, 82, 77, 91, 84, 71,
+  78, 87, 67, 82, 73, 76, 77, 82, 76, 85,
+  77, 92, 82, 82, 77, 83, 95, 91, 81, 83,
+  72, 85, 82, 79, 76, 78, 87, 71, 86, 72,
+  73, 85, 79, 67, 92, 66, 81, 76, 85, 84,
+  89, 75, 86, 91, 77, 82, 93, 86, 90, 74,
+  75, 82, 79, 80, 79, 71, 96, 90, 78, 87,
+  86, 82, 90, 72, 90, 93, 100, 74, 84, 92,
+  94, 79, 80, 86, 95, 94, 84, 75, 96, 70,
+  93, 80, 85, 90, 81, 81, 92, 75, 82, 87,
+  94, 98, 65, 105, 83, 84, 76, 81, 69, 89,
+  71, 75, 88, 96, 84, 82, 83, 66, 81, 96,
+  77, 83, 84, 75, 73, 79, 63, 88, 76, 81,
+  101, 72, 93, 84, 77, 84, 92, 77, 76, 91,
+  68, 71, 71, 74, 69, 88, 77, 83, 83, 88,
+  84, 80, 80, 78, 100, 91, 83, 83, 67, 86,
+  81, 80, 80, 69, 92, 62, 87, 69, 75, 93,
+  69, 68, 92, 80, 80, 73, 98, 88, 85, 72,
+  78, 93, 76, 73, 104, 88, 92, 67, 75, 79,
+  69, 79, 76, 73, 97, 84, 89, 88, 81, 75,
+  97, 67, 89, 80, 109, 66, 79, 99, 90, 71,
+  85, 90, 85, 97, 82, 73, 87, 69, 93, 80,
+  81, 92, 81, 77, 94, 68, 74, 96, 86, 98,
+  53, 102, 81, 87, 74, 81, 67, 86, 64, 87,
+  96, 101, 74, 87, 73, 65, 78, 97, 73, 79,
+  79, 77, 63, 78, 70, 80, 76, 87, 88, 78,
+  85, 86, 86, 91, 85, 72, 77, 88, 69, 87,
+  72, 79, 79, 84, 83, 78, 89, 92, 81, 80,
+  82, 87, 92, 86, 78, 84, 86, 84, 79, 87,
+  82, 84, 76, 72, 79, 73, 76, 83, 77, 82,
+  88, 103, 85, 76, 85, 85, 87, 84, 89, 79,
+  83, 74, 87, 83, 86, 70, 81, 72, 76, 76,
+  69, 76, 106, 86, 90, 86, 93, 80, 93, 77,
+  85, 75, 91, 77, 86, 88, 96, 78, 76, 84,
+  70, 91, 83, 73, 95, 67, 88, 79, 95, 84,
+  86, 85, 87, 80, 76, 97, 98, 95, 66, 108,
+  79, 84, 76, 76, 72, 81, 80, 90, 84, 94,
+  84, 88, 77, 67, 86, 89, 86, 85, 84, 74,
+  71, 88, 95, 91, 83, 82, 80, 89, 87, 84,
+  67, 93, 76, 76, 90, 89, 74, 70, 80, 80,
+  76, 76, 80, 96, 83, 84, 79, 93, 80, 87,
+  84, 86, 97, 85, 79, 93, 93, 85, 84, 77,
+  72, 87, 84, 83, 81, 86, 98, 78, 76, 74,
+  84, 79, 89, 87, 97, 74, 87, 83, 83, 98,
+  81, 84, 82, 79, 87, 91, 79, 85, 86, 76,
+  69, 80, 89, 87, 91, 89, 90, 75, 86, 100,
+  76, 86, 84, 91, 85, 76, 84, 82, 94, 80,
+  88, 73, 90, 78, 102, 88, 76, 84, 82, 99,
+  83, 71, 89, 89, 92, 101, 85, 84, 86, 91,
+  90, 94, 76, 88, 79, 80, 86, 84, 82, 86,
+  90, 71, 89, 98, 85, 89, 75, 75, 79, 73,
+  98, 93, 77, 76, 88, 86, 89, 81, 70, 91,
+  78, 79, 96, 80, 77, 67, 82, 81, 73, 76,
+  78, 98, 92, 85, 90, 96, 76, 86, 85, 93,
+  94, 86, 73, 92, 85, 79, 82, 69, 88, 90,
+  91, 83, 78, 95, 96, 80, 81, 77, 82, 83,
+  94, 90, 94, 71, 89, 84, 82, 98, 84, 86,
+  82, 76, 87, 88, 68, 89, 90, 73, 71, 79,
+  83, 89, 89, 87, 91, 70, 91, 89, 72, 87,
+  81, 92, 88, 77, 90, 87, 87, 83, 84, 66,
+  82, 73, 99, 92, 72, 95, 80, 97, 78, 67,
+  86, 95, 89, 103, 88, 79, 87, 94, 93, 102,
+  79, 90, 73, 84, 88, 83, 88, 86, 85, 66,
+  89, 102, 84, 86, 75, 72, 78, 78, 90, 85,
+  84, 88, 80, 80, 84, 88, 71, 91, 79, 76,
+  88, 71, 70, 70, 74, 81, 75, 74, 84, 92,
+  102, 84, 88, 98, 79, 89, 84, 95, 92, 84,
+  80, 89, 78, 84, 83, 73, 88, 87, 83, 82,
+  83, 82, 96, 81, 79, 97, 88, 78, 88, 88,
+  91, 79, 88, 85, 88, 88, 87, 84, 80, 80,
+  92, 83, 72, 87, 83, 78, 78, 79, 88, 88,
+  92, 89, 88, 78, 86, 82, 72, 88, 85, 90,
+  89, 89, 83, 83, 80, 82, 87, 71, 88, 76,
+  105, 85, 81, 86, 83, 94, 86, 75, 85, 92,
+  93, 98, 82, 87, 83, 92, 86, 92, 82, 84,
+  79, 90, 89, 87, 99, 91, 89, 71, 92, 97,
+  88, 89, 79, 77, 74, 77, 78, 73, 84, 86,
+  86, 76, 91, 77, 74, 84, 79, 93, 82, 83,
+  75, 85, 79, 88, 82, 102, 79, 81, 95, 87,
+  83, 72, 101, 80, 96, 73, 81, 66, 87, 90,
+  107, 92, 73, 82, 83, 86, 72, 96, 100, 86,
+  75, 91, 86, 80, 72, 80, 140, 74, 87, 73,
+  86, 88, 74, 84, 90, 89, 69, 90, 85, 82,
+  76, 73, 81, 68, 63, 84, 76, 86, 87, 78,
+  79, 95, 89, 111, 76, 108, 93, 52, 96, 92,
+  92, 76, 87, 82, 78, 91, 87, 77, 84, 81,
+  87, 71, 81, 87, 78, 86, 85, 90, 92, 85,
+  85, 74, 82, 90, 96, 79, 85, 80, 69, 99,
+  96, 84, 87, 91, 96, 89, 80, 93, 82, 75,
+  80, 99, 85, 82, 92, 84, 74, 88, 101, 75,
+  96, 69, 80, 83, 79, 89, 81, 94, 74, 79,
+  86, 75, 74, 108, 92, 76, 79, 88, 79, 66,
+  82, 80, 100, 84, 83, 85, 80, 85, 84, 85,
+  62, 81, 97, 68, 70, 110, 87, 86, 85, 87,
+  85, 97, 75, 65, 160, 61, 84, 77, 75, 104,
+  64, 94, 82, 91, 73, 87, 95, 77, 66, 78,
+  76, 56, 62, 71, 74, 101, 75, 66, 82, 79,
+  102, 87, 67, 140, 92, 51, 83, 89, 89, 74,
+  83, 78, 77, 95, 80, 64, 77, 92, 81, 95,
+  76, 105, 90, 82, 81, 89, 96, 88, 84, 77,
+  91, 92, 92, 78, 87, 74, 66, 87, 98, 91,
+  82, 93, 98, 84, 90, 108, 57, 84, 77, 95,
+  94, 81, 75, 94, 81, 85, 83, 95, 87, 76,
+  79, 85, 83, 101, 80, 83, 73, 84, 83, 90,
+  79, 99, 95, 89, 78, 87, 77, 69, 96, 80,
+  91, 103, 77, 76, 86, 73, 82, 79, 76, 83,
+  88, 92, 77, 89, 76, 86, 87, 98, 89, 106,
+  72, 81, 127, 79, 85, 76, 88, 91, 78, 85,
+  86, 93, 70, 88, 86, 77, 69, 77, 83, 69,
+  60, 82, 88, 83, 90, 79, 89, 98, 93, 73,
+  74, 97, 96, 61, 88, 95, 90, 82, 97, 80,
+  72, 84, 86, 87, 80, 78, 83, 74, 78, 84,
+  83, 78, 80, 76, 91, 87, 84, 71, 82, 88,
+  91, 85, 85, 77, 75, 88, 81, 79, 86, 85,
+  91, 90, 95, 91, 88, 79, 77, 96, 83, 87,
+  74, 73, 79, 88, 78, 81, 88, 76, 69, 77,
+  81, 89, 74, 76, 69, 87, 80, 90, 82, 99,
+  79, 83, 89, 86, 90, 73, 95, 80, 80, 80,
+  79, 75, 88, 82, 79, 94, 73, 77, 85, 95,
+  66, 89, 92, 87, 74, 82, 89, 91, 81, 84,
+  124, 80, 85, 74, 94, 74, 75, 87, 87, 83,
+  71, 81, 84, 80, 72, 72, 89, 65, 77, 91,
+  82, 91, 84, 83, 80, 93, 80, 92, 68, 118,
+  95, 56, 95, 90, 90, 75, 81, 78, 67, 73,
+  85, 67, 85, 71, 78, 73, 91, 84, 76, 80,
+  75, 87, 89, 84, 76, 78, 74, 87, 81, 74,
+  86, 87, 72, 90, 81, 79, 72, 86, 87, 85,
+  73, 88, 87, 77, 87, 80, 76, 79, 78, 71,
+  72, 85, 83, 74, 96, 70, 77, 78, 81, 88,
+  75, 90, 77, 77, 92, 77, 77, 92, 90, 83,
+  79, 84, 85, 68, 75, 81, 79, 73, 83, 89,
+  78, 81, 78, 80, 66, 75, 94, 76, 69, 126,
+  89, 88, 80, 82, 86, 97, 82, 72, 146, 74,
+  89, 80, 87, 96, 63, 96, 85, 85, 69, 80,
+  86, 82, 63, 86, 79, 54, 84, 77, 74, 108,
+  73, 72, 85, 81, 89, 86, 59, 165, 97, 57,
+  86, 84, 90, 71, 75, 73, 71, 74, 76, 57,
+  85, 86, 75, 92, 86, 111, 87, 77, 70, 74,
+  94, 84, 64, 82, 80, 89, 69, 78, 90, 78,
+  71, 77, 83, 91, 71, 85, 92, 81, 79, 100,
+  68, 87, 85, 67, 83, 79, 72, 77, 73, 88,
+  74, 83, 87, 79, 74, 77, 84, 93, 76, 82,
+  70, 88, 80, 93, 82, 92, 90, 87, 85, 84,
+  84, 69, 93, 80, 76, 76, 75, 79, 90, 78,
+  83, 75, 69, 77, 78, 95, 71, 89, 81, 87,
+  78, 89, 90, 97, 83, 88, 114, 84, 84, 75,
+  92, 79, 78, 84, 84, 88, 72, 83, 83, 77,
+  73, 75, 88, 74, 82, 91, 83, 88, 81, 83,
+  86, 99, 83, 85, 73, 105, 96, 59, 95, 83,
+  92, 80, 92, 83, 65, 74, 85, 83, 81, 71,
+  88, 73, 87, 85, 78, 77, 72, 77, 88, 84,
+  77, 73, 70, 89, 81, 81, 86, 82, 76, 80,
+  73, 81, 86, 82, 83, 92, 88, 87, 93, 79,
+  86, 82, 77, 86, 72, 71, 80, 94, 84, 89,
+  94, 82, 78, 74, 88, 84, 84, 85, 76, 92,
+  81, 91, 83, 104, 83, 89, 88, 88, 91, 71,
+  84, 82, 97, 76, 86, 76, 84, 92, 97, 102,
+  74, 91, 94, 87, 74, 89, 94, 85, 73, 84,
+  87, 86, 81, 77, 135, 78, 80, 79, 83, 83,
+  74, 95, 93, 95, 70, 80, 81, 78, 74, 73,
+  100, 69, 73, 82, 90, 86, 87, 83, 74, 92,
+  89, 116, 73, 115, 87, 61, 95, 93, 87, 97,
+  91, 85, 79, 78, 81, 79, 88, 83, 88, 76,
+  86, 85, 82, 76, 86, 76, 80, 87, 75, 77,
+  83, 88, 73, 78, 86, 81, 69, 91, 89, 90,
+  78, 89, 90, 79, 78, 92, 83, 77, 79, 85,
+  77, 87, 73, 83, 86, 96, 89, 78, 100, 75,
+  85, 79, 92, 82, 81, 96, 82, 82, 100, 76,
+  78, 102, 93, 74, 80, 84, 84, 69, 69, 80,
+  102, 89, 96, 91, 83, 93, 93, 88, 81, 101,
+  105, 68, 79, 117, 95, 84, 81, 78, 86, 101,
+  82, 65, 152, 67, 83, 83, 75, 98, 62, 104,
+  86, 102, 70, 73, 88, 74, 67, 82, 89, 57,
+  78, 71, 75, 90, 78, 70, 76, 76, 104, 88,
+  66, 149, 90, 61, 84, 90, 84, 102, 80, 78,
+  83, 81, 72, 77, 84, 101, 87, 95, 83, 105,
+  91, 78, 89, 79, 87, 89, 65, 71, 84, 91,
+  63, 78, 97, 74, 65, 80, 89, 92, 65, 91,
+  96, 71, 81, 101, 65, 81, 70, 77, 84, 90,
+  69, 92, 88, 93, 80, 93, 90, 81, 79, 74,
+  86, 88, 76, 90, 75, 89, 82, 96, 84, 97,
+  91, 88, 90, 86, 82, 69, 86, 79, 92, 81,
+  85, 83, 91, 90, 88, 84, 73, 91, 83, 87,
+  75, 94, 84, 84, 72, 88, 91, 117, 88, 80,
+  120, 80, 82, 81, 86, 85, 76, 90, 89, 94,
+  72, 81, 80, 74, 77, 72, 88, 78, 74, 85,
+  84, 85, 82, 83, 79, 98, 84, 78, 77, 106,
+  89, 65, 96, 85, 87, 97, 96, 84, 79, 77,
+  83, 94, 86, 80, 97, 70, 85, 84, 83, 75,
+  84, 99, 80, 88, 75, 74, 78, 87, 73, 82,
+  91, 78, 72, 84, 79, 84, 86, 84, 82, 82,
+  85, 86, 90, 77, 78, 86, 75, 88, 71, 80,
+  81, 77, 89, 73, 72, 73, 98, 79, 91, 90,
+  78, 101, 70, 72, 86, 74, 97, 78, 94, 92,
+  76, 83, 88, 94, 89, 86, 94, 72, 98, 81,
+  92, 79, 83, 78, 81, 77, 83, 70, 82, 84,
+  86, 85, 72, 84, 73, 76, 73, 78, 83, 94,
+  84, 122, 89, 76, 96, 77, 89, 80, 76, 84,
+  99, 78, 73, 91, 81, 92, 106, 89, 77, 81,
+  77, 97, 85, 79, 88, 116, 83, 86, 83, 74,
+  85, 91, 87, 73, 84, 80, 88, 93, 80, 79,
+  73, 78, 100, 106, 66, 76, 85, 80, 91, 85,
+  66, 74, 80, 75, 83, 91, 79, 75, 85, 95,
+  98, 90, 77, 76, 102, 76, 94, 94, 82, 90,
+  73, 70, 84, 78, 94, 74, 70, 84, 78, 74,
+  81, 79, 64, 68, 93, 78, 100, 88, 65, 96,
+  69, 75, 91, 84, 125, 65, 84, 78, 74, 80,
+  88, 91, 87, 86, 89, 84, 106, 86, 105, 80,
+  81, 85, 82, 69, 94, 63, 88, 85, 86, 75,
+  76, 85, 71, 89, 59, 77, 78, 76, 85, 136,
+  82, 79, 104, 69, 89, 88, 89, 87, 108, 85,
+  67, 85, 81, 108, 105, 91, 76, 82, 82, 98,
+  82, 83, 96, 87, 79, 95, 86, 74, 97, 90,
+  89, 72, 79, 83, 83, 96, 82, 83, 67, 77,
+  105, 107, 70, 74, 71, 83, 91, 96, 68, 79,
+  76, 80, 100, 82, 68, 69, 81, 98, 92, 86,
+  69, 81, 94, 76, 97, 94, 92, 84, 72, 68,
+  79, 78, 97, 78, 72, 88, 83, 83, 84, 83,
+  72, 77, 95, 78, 97, 84, 77, 79, 71, 78,
+  91, 77, 104, 73, 87, 86, 73, 80, 84, 92,
+  85, 92, 90, 89, 98, 92, 96, 82, 67, 103,
+  83, 73, 103, 69, 85, 81, 93, 85, 78, 78,
+  73, 93, 74, 75, 87, 85, 82, 117, 87, 85,
+  92, 81, 86, 79, 84, 83, 98, 80, 73, 89,
+  73, 91, 101, 91, 90, 83, 77, 99, 85, 82,
+  87, 72, 80, 85, 87, 77, 82, 91, 86, 74,
+  83, 73, 87, 90, 81, 76, 72, 78, 89, 102,
+  72, 73, 80, 80, 94, 92, 71, 74, 78, 82,
+  88, 85, 68, 74, 76, 89, 90, 81, 72, 69,
+  78, 76, 92, 87, 90, 92, 80, 70, 87, 83,
+  95, 73, 75, 74, 75, 77, 84, 74, 79, 79,
+  87, 82, 75, 92, 80, 74, 82, 70, 88, 90,
+  86, 79, 84, 88, 71, 83, 91, 87, 79, 80,
+  96, 76, 94, 75, 104, 84, 94, 77, 89, 75,
+  89, 85, 93, 82, 84, 83, 78, 83, 77, 79,
+  86, 73, 81, 84, 86, 114, 85, 86, 93, 73,
+  81, 94, 72, 80, 91, 83, 73, 78, 74, 108,
+  100, 85, 86, 91, 71, 94, 101, 77, 84, 95,
+  86, 83, 80, 71, 74, 88, 93, 73, 88, 79,
+  83, 89, 76, 81, 74, 77, 94, 93, 72, 83,
+  106, 77, 87, 76, 76, 85, 85, 77, 82, 93,
+  76, 79, 75, 110, 113, 94, 72, 74, 94, 79,
+  86, 79, 81, 97, 75, 83, 78, 79, 87, 61,
+  69, 81, 85, 75, 79, 77, 76, 79, 77, 79,
+  76, 94, 66, 85, 82, 66, 94, 99, 106, 70,
+  77, 75, 73, 81, 97, 81, 78, 76, 82, 94,
+  105, 74, 102, 76, 100, 89, 89, 71, 85, 76,
+  95, 79, 80, 77, 77, 76, 82, 75, 75, 61,
+  81, 78, 86, 126, 81, 75, 100, 64, 82, 107,
+  76, 83, 102, 88, 66, 73, 72, 126, 114, 79,
+  73, 91, 71, 91, 110, 72, 90, 81, 80, 89,
+  82, 71, 85, 82, 95, 75, 81, 75, 81, 92,
+  69, 80, 70, 80, 102, 91, 74, 85, 85, 77,
+  75, 85, 81, 91, 74, 80, 91, 87, 65, 74,
+  72, 121, 124, 84, 66, 77, 81, 78, 89, 76,
+  79, 86, 61, 88, 74, 81, 80, 61, 71, 91,
+  104, 83, 82, 78, 77, 77, 83, 83, 83, 89,
+  76, 95, 81, 72, 90, 87, 95, 73, 86, 86,
+  75, 85, 93, 82, 77, 84, 93, 96, 98, 80,
+  105, 79, 79, 103, 87, 71, 86, 81, 94, 82,
+  84, 80, 80, 83, 85, 80, 82, 69, 84, 83,
+  84, 112, 87, 71, 88, 74, 81, 90, 80, 81,
+  91, 86, 69, 83, 77, 104, 101, 85, 75, 93,
+  70, 93, 109, 80, 86, 77, 78, 85, 82, 68,
+  79, 87, 87, 80, 83, 75, 83, 93, 77, 82,
+  77, 77, 92, 89, 75, 82, 77, 80, 90, 90,
+  79, 83, 84, 83, 88, 89, 74, 79, 76, 111,
+  108, 79, 78, 74, 77, 78, 91, 76, 79, 95,
+  72, 80, 78, 85, 82, 66, 81, 75, 75, 73,
+  83, 86, 84, 79, 85, 79, 74, 87, 88, 75,
+  89, 86, 79, 90, 70, 76, 80, 77, 72, 92,
+  92, 73, 77, 83, 77, 77, 82, 80, 93, 90,
+  100, 74, 98, 83, 87, 97, 94, 73, 87, 80,
+  75, 85, 84, 81, 82, 78, 82, 80, 85, 95,
+  89, 83, 87, 81, 93, 82, 74, 75, 93, 86,
+  88, 79, 71, 78, 95, 78, 93, 85, 74, 84,
+  97, 75, 81, 90, 82, 80, 78, 85, 69, 84,
+  86, 78, 80, 79, 94, 79, 77, 87, 77, 74,
+  90, 88, 75, 81, 105, 83, 85, 75, 82, 86,
+  99, 78, 79, 88, 77, 91, 80, 90, 101, 86,
+  90, 79, 80, 78, 84, 96, 78, 97, 85, 85,
+  77, 92, 89, 76, 75, 81, 88, 70, 80, 75,
+  84, 84, 83, 82, 72, 85, 71, 85, 87, 89,
+  83, 93, 72, 73, 78, 67, 73, 86, 96, 82,
+  77, 83, 73, 88, 88, 76, 88, 86, 102, 75,
+  97, 94, 85, 81, 100, 70, 80, 74, 71, 79,
+  90, 68, 87, 67, 84, 83, 82, 107, 84, 89,
+  96, 75, 96, 92, 69, 75, 103, 83, 82, 74,
+  74, 83, 102, 72, 78, 89, 68, 83, 106, 82,
+  81, 79, 80, 81, 79, 90, 65, 73, 92, 82,
+  73, 79, 89, 77, 74, 81, 79, 81, 94, 89,
+  77, 82, 92, 85, 82, 76, 83, 88, 96, 81,
+  85, 86, 72, 87, 77, 82, 116, 76, 89, 84,
+  77, 82, 86, 94, 74, 94, 80, 94, 77, 105,
+  89, 69, 77, 88, 105, 73, 81, 82, 85, 78,
+  82, 85, 78, 83, 82, 93, 86, 88, 78, 91,
+  74, 75, 88, 80, 83, 90, 96, 73, 74, 84,
+  76, 92, 87, 81, 93, 77, 92, 90, 97, 87,
+  76, 88, 95, 70, 79, 76, 76, 84, 87, 75,
+  83, 74, 82, 84, 84, 95, 87, 80, 83, 78,
+  91, 78, 74, 74, 91, 84, 87, 82, 74, 80,
+  90, 83, 67, 84, 73, 82, 108, 75, 82, 80,
+  80, 80, 78, 82, 67, 79, 87, 82, 78, 78,
+  88, 80, 76, 79, 77, 74, 86, 86, 76, 82,
+  82, 81, 86, 74, 84, 85, 95, 79, 78, 86,
+  76, 88, 81, 91, 101, 74, 85, 84, 81, 77,
+  86, 94, 80, 94, 83, 84, 81, 103, 88, 76,
+  80, 69, 101, 78, 67, 88, 85, 86, 81, 89,
+  75, 93, 87, 86, 86, 71, 88, 79, 76, 88,
+  79, 74, 86, 91, 75, 79, 83, 78, 92, 72,
+  87, 84, 81, 70, 88, 81, 93, 94, 66, 77,
+  76, 88, 80, 91, 89, 93, 84, 72, 102, 85,
+  95, 82, 86, 75, 86, 78, 69, 85, 88, 78,
+  84, 77, 79, 89, 96, 77, 86, 96, 74, 64,
+  76, 90, 76, 97, 80, 84, 86, 107, 88, 81,
+  83, 84, 85, 82, 82, 83, 88, 82, 91, 81,
+  86, 84, 94, 73, 85, 96, 69, 91, 76, 87,
+  87, 101, 83, 93, 85, 75, 86, 82, 70, 86,
+  93, 86, 87, 85, 94, 94, 84, 85, 93, 82,
+  93, 92, 68, 86, 87, 85, 87, 85, 78, 77,
+  81, 69, 65, 76, 86, 80, 77, 87, 73, 82,
+  76, 88, 85, 70, 71, 74, 57, 78, 84, 68,
+  72, 93, 67, 82, 86, 70, 97, 70, 95, 87,
+  74, 67, 69, 72, 86, 99, 80, 58, 91, 89,
+  88, 82, 90, 94, 81, 85, 111, 72, 99, 72,
+  80, 83, 81, 97, 60, 81, 95, 75, 87, 85,
+  87, 91, 82, 83, 108, 86, 64, 52, 84, 105,
+  71, 116, 75, 65, 86, 76, 97, 76, 86, 76,
+  76, 73, 73, 95, 85, 85, 99, 80, 74, 72,
+  101, 87, 61, 121, 68, 82, 92, 78, 79, 93,
+  79, 94, 92, 87, 87, 85, 75, 74, 92, 90,
+  84, 79, 104, 111, 80, 90, 89, 121, 83, 91,
+  67, 80, 76, 92, 75, 82, 77, 93, 73, 76,
+  63, 93, 87, 82, 81, 93, 79, 90, 95, 80,
+  85, 71, 78, 77, 73, 86, 74, 75, 90, 93,
+  74, 85, 86, 79, 88, 82, 78, 84, 78, 67,
+  78, 80, 93, 98, 92, 71, 90, 88, 84, 89,
+  99, 86, 83, 111, 105, 85, 96, 70, 84, 80,
+  87, 96, 68, 87, 88, 79, 87, 79, 86, 91,
+  88, 80, 95, 99, 66, 70, 87, 101, 77, 103,
+  80, 80, 85, 70, 87, 75, 84, 81, 79, 89,
+  79, 90, 90, 87, 88, 84, 83, 70, 95, 79,
+  78, 101, 73, 90, 93, 80, 89, 90, 84, 94,
+  84, 76, 93, 85, 75, 84, 81, 83, 86, 80,
+  89, 94, 83, 87, 90, 100, 78, 92, 67, 86,
+  86, 87, 80, 86, 80, 66, 108, 77, 84, 78,
+  79, 86, 88, 87, 83, 92, 97, 103, 84, 69,
+  85, 72, 81, 81, 96, 94, 80, 81, 66, 83,
+  73, 79, 93, 81, 76, 80, 86, 83, 79, 88,
+  82, 82, 76, 84, 84, 83, 77, 81, 95, 91,
+  69, 86, 88, 88, 75, 90, 82, 77, 84, 73,
+  69, 64, 82, 89, 77, 87, 81, 87, 81, 85,
+  81, 96, 70, 61, 78, 83, 88, 93, 87, 85,
+  75, 82, 79, 81, 81, 73, 85, 81, 84, 77,
+  86, 88, 77, 85, 86, 79, 93, 79, 87, 110,
+  79, 91, 72, 86, 87, 85, 85, 97, 78, 82,
+  86, 91, 74, 74, 97, 76, 86, 89, 87, 88,
+  90, 84, 91, 85, 81, 77, 78, 86, 87, 83,
+  85, 79, 78, 79, 78, 74, 108, 73, 70, 88,
+  85, 78, 85, 86, 82, 84, 80, 59, 76, 71,
+  73, 83, 97, 101, 72, 67, 65, 101, 77, 74,
+  97, 70, 72, 76, 88, 88, 72, 95, 72, 75,
+  90, 66, 91, 70, 93, 80, 126, 100, 57, 85,
+  83, 71, 71, 61, 80, 95, 76, 79, 71, 60,
+  70, 102, 81, 107, 91, 81, 72, 83, 94, 108,
+  56, 50, 79, 85, 98, 106, 78, 76, 59, 76,
+  76, 72, 89, 66, 83, 81, 79, 84, 82, 85,
+  65, 76, 93, 70, 72, 97, 84, 137, 81, 97,
+  70, 81, 79, 92, 82, 98, 78, 94, 102, 93,
+  91, 59, 91, 76, 87, 85, 83, 79, 95, 87,
+  75, 115, 72, 72, 79, 86, 86, 87, 77, 76,
+  79, 92, 80, 79, 85, 78, 77, 85, 91, 89,
+  86, 88, 103, 68, 83, 63, 77, 71, 84, 80,
+  76, 96, 76, 72, 71, 91, 77, 82, 93, 73,
+  72, 79, 86, 74, 86, 94, 74, 81, 109, 82,
+  92, 76, 96, 83, 102, 91, 67, 81, 85, 87,
+  75, 77, 80, 89, 86, 96, 72, 68, 77, 91,
+  78, 94, 87, 89, 80, 90, 83, 98, 62, 66,
+  95, 89, 91, 98, 81, 79, 74, 85, 76, 76,
+  83, 70, 86, 89, 83, 83, 86, 89, 76, 84,
+  86, 74, 88, 85, 82, 110, 84, 94, 86, 84,
+  87, 79, 84, 98, 77, 81, 98, 89, 79, 74,
+  76, 74, 87, 87, 74, 80, 85, 82, 86, 90,
+  81, 79, 79, 86, 85, 84, 84, 79, 94, 80,
+  98, 79, 83, 81, 76, 86, 82, 90, 74, 93,
+  109, 94, 82, 73, 83, 77, 87, 82, 81, 87,
+  98, 90, 75, 82, 77, 89, 78, 78, 77, 84,
+  80, 86, 76, 75, 87, 80, 83, 94, 72, 84,
+  63, 83, 83, 85, 87, 83, 76, 84, 82, 87,
+  82, 68, 83, 94, 71, 69, 78, 85, 82, 82,
+  90, 88, 88, 88, 88, 79, 79, 78, 90, 82,
+  88, 92, 96, 79, 79, 81, 83, 85, 86, 88,
+  78, 75, 92, 81, 86, 83, 90, 89, 69, 88,
+  86, 88, 84, 92, 81, 86, 88, 84, 81, 86,
+  85, 96, 79, 90, 87, 93, 83, 87, 79, 72,
+  87, 89, 92, 93, 94, 81, 94, 83, 79, 76,
+  80, 88, 91, 79, 87, 84, 86, 85, 98, 80,
+  107, 80, 67, 88, 87, 84, 77, 90, 101, 81,
+  81, 70, 81, 75, 96, 77, 78, 100, 84, 76,
+  83, 91, 79, 86, 81, 74, 77, 82, 82, 95,
+  79, 82, 91, 84, 87, 103, 82, 77, 72, 82,
+  98, 79, 81, 75, 67, 76, 86, 93, 82, 94,
+  72, 87, 66, 68, 82, 97, 91, 82, 100, 73,
+  82, 99, 87, 81, 75, 65, 89, 83, 92, 84,
+  83, 77, 67, 79, 78, 84, 96, 87, 87, 83,
+  93, 84, 86, 80, 88, 89, 72, 85, 68, 102,
+  90, 90, 85, 97, 90, 88, 78, 84, 85, 94,
+  70, 93, 96, 91, 88, 80, 74, 72, 87, 88,
+  100, 86, 87, 79, 88, 88, 73, 77, 89, 88,
+  90, 79, 93, 83, 91, 98, 99, 82, 87, 99,
+  74, 81, 80, 92, 74, 89, 103, 83, 83, 70,
+  82, 76, 94, 75, 64, 93, 83, 85, 84, 85,
+  79, 91, 72, 72, 81, 86, 79, 82, 79, 84,
+  90, 83, 90, 100, 83, 82, 75, 83, 82, 86,
+  89, 71, 71, 85, 82, 91, 82, 74, 84, 82,
+  67, 71, 79, 85, 88, 82, 91, 85, 86, 88,
+  83, 74, 78, 76, 89, 87, 87, 92, 89, 78,
+  77, 84, 83, 86, 90, 86, 83, 89, 88, 83,
+  91, 83, 91, 88, 71, 89, 84, 89, 79, 88,
+  79, 90, 95, 87, 79, 96, 82, 95, 76, 88,
+  90, 90, 79, 89, 76, 71, 82, 85, 92, 87,
+  89, 81, 96, 79, 83, 74, 76, 88, 90, 87,
+  90, 85, 84, 82, 87, 94, 77, 89, 85, 76,
+  89, 89, 77, 79, 82, 73, 70, 95, 73, 70,
+  87, 96, 78, 70, 85, 106, 63, 74, 81, 83,
+  90, 82, 81, 88, 73, 100, 98, 98, 76, 90,
+  74, 69, 87, 67, 82, 67, 86, 96, 84, 106,
+  98, 80, 83, 71, 76, 69, 73, 100, 79, 93,
+  75, 85, 84, 101, 88, 77, 77, 62, 64, 72,
+  92, 68, 111, 89, 95, 87, 83, 77, 89, 90,
+  99, 77, 85, 87, 84, 88, 78, 78, 94, 84,
+  85, 86, 80, 110, 101, 88, 73, 79, 90, 80,
+  90, 73, 75, 85, 89, 92, 87, 74, 76, 76,
+  77, 74, 84, 76, 62, 90, 77, 87, 92, 89,
+  79, 75, 68, 78, 80, 77, 78, 91, 76, 84,
+  97, 84, 68, 89, 84, 88, 80, 81, 93, 74,
+  83, 90, 101, 80, 88, 81, 92, 84, 80, 79,
+  91, 77, 88, 87, 76, 75, 73, 86, 87, 81,
+  88, 70, 87, 95, 92, 86, 71, 80, 83, 81,
+  83, 83, 66, 83, 94, 83, 75, 109, 73, 94,
+  85, 81, 87, 85, 75, 99, 66, 92, 76, 86,
+  78, 78, 79, 80, 69, 76, 68, 72, 87, 75,
+  94, 90, 81, 80, 96, 69, 84, 83, 85, 90,
+  81, 93, 95, 77, 92, 82, 89, 95, 89, 80,
+  77, 90, 85, 91, 67, 82, 93, 102, 114, 80,
+  75, 83, 81, 89, 88, 88, 82, 83, 85, 81,
+  80, 80, 81, 80, 75, 95, 89, 90, 88, 72,
+  77, 90, 92, 79, 80, 80, 85, 94, 99, 74,
+  71, 79, 77, 90, 81, 89, 78, 70, 86, 91,
+  93, 81, 93, 70, 105, 99, 84, 79, 93, 88,
+  82, 81, 74, 69, 78, 82, 68, 82, 94, 73,
+  99, 81, 104, 79, 89, 68, 75, 88, 84, 92,
+  78, 81, 93, 73, 75, 99, 71, 100, 80, 85,
+  95, 86, 88, 89, 79, 82, 78, 77, 83, 83,
+  80, 77, 77, 88, 85, 83, 77, 93, 81, 76,
+  84, 78, 89, 73, 75, 85, 79, 84, 81, 86,
+  92, 81, 88, 74, 80, 89, 88, 81, 88, 88,
+  85, 87, 80, 78, 90, 98, 105, 89, 80, 90,
+  82, 89, 82, 99, 86, 87, 70, 87, 73, 92,
+  96, 81, 78, 93, 87, 92, 83, 80, 81, 91,
+  74, 83, 85, 79, 88, 90, 76, 86, 82, 88,
+  83, 76, 79, 79, 88, 89, 79, 77, 85, 72,
+  71, 80, 71, 74, 94, 99, 71, 73, 73, 100,
+  78, 79, 85, 75, 113, 68, 77, 110, 70, 89,
+  81, 91, 90, 82, 79, 73, 87, 71, 118, 70,
+  85, 93, 79, 81, 101, 80, 86, 84, 76, 73,
+  76, 89, 95, 77, 86, 75, 97, 93, 91, 64,
+  58, 65, 74, 90, 73, 76, 101, 80, 109, 94,
+  78, 93, 92, 77, 102, 83, 82, 78, 83, 88,
+  67, 72, 88, 80, 77, 93, 82, 102, 94, 87,
+  90, 83, 95, 76, 61, 78, 77, 94, 98, 87,
+  80, 83, 83, 74, 77, 76, 86, 77, 69, 102,
+  73, 90, 79, 88, 77, 98, 72, 83, 72, 81,
+  81, 92, 75, 76, 83, 83, 67, 96, 82, 81,
+  77, 70, 95, 89, 77, 72, 100, 73, 74, 91,
+  70, 63, 73, 87, 68, 70, 73, 101, 75, 76,
+  80, 83, 107, 65, 72, 89, 69, 103, 89, 95,
+  73, 91, 78, 84, 86, 63, 83, 77, 77, 90,
+  81, 110, 88, 86, 80, 84, 88, 72, 68, 97,
+  71, 85, 84, 87, 88, 80, 76, 55, 62, 66,
+  72, 73, 99, 69, 120, 85, 92, 75, 93, 78,
+  85, 82, 103, 84, 81, 89, 89, 80, 85, 83,
+  94, 87, 83, 86, 67, 105, 85, 82, 72, 81,
+  87, 79, 95, 81, 78, 97, 90, 85, 85, 86,
+  81, 74, 73, 68, 75, 75, 62, 95, 71, 84,
+  80, 89, 76, 69, 78, 79, 79, 75, 85, 84,
+  71, 79, 97, 79, 77, 88, 85, 79, 80, 76,
+  90, 75, 87, 85, 114, 82, 86, 83, 98, 89,
+  85, 80, 75, 80, 81, 86, 85, 75, 80, 90,
+  77, 77, 98, 84, 92, 85, 94, 76, 87, 72,
+  80, 93, 84, 93, 79, 88, 85, 69, 90, 82,
+  69, 96, 76, 89, 98, 89, 75, 87, 75, 96,
+  74, 86, 83, 78, 70, 74, 63, 82, 84, 80,
+  90, 79, 68, 81, 79, 70, 90, 67, 78, 80,
+  84, 89, 87, 90, 102, 81, 100, 84, 81, 86,
+  90, 87, 76, 85, 83, 94, 69, 77, 85, 104,
+  99, 85, 82, 88, 87, 85, 82, 99, 91, 88,
+  73, 84, 75, 86, 81, 76, 81, 95, 84, 95,
+  93, 69, 77, 87, 82, 79, 89, 79, 90, 90,
+  90, 91, 88, 74, 93, 64, 97, 89, 77, 72,
+  73, 91, 86, 83, 80, 71, 78, 99, 105, 88,
+  68, 90, 88, 84, 91, 90, 84, 72, 99, 68,
+  86, 106, 96, 80, 82, 78, 81, 75, 87, 78,
+  79, 81, 147, 86, 106, 88, 76, 61, 93, 81,
+  88, 97, 82, 83, 98, 78, 103, 89, 77, 81,
+  88, 76, 98, 73, 62, 81, 75, 89, 75, 81,
+  90, 72, 102, 99, 76, 93, 80, 80, 87, 90,
+  91, 82, 83, 81, 73, 71, 83, 77, 83, 89,
+  96, 77, 91, 87, 91, 81, 92, 91, 57, 76,
+  74, 62, 84, 83, 77, 76, 91, 88, 87, 94,
+  106, 83, 83, 87, 66, 93, 85, 81, 81, 103,
+  74, 93, 80, 91, 90, 82, 85, 80, 73, 89,
+  71, 83, 79, 71, 92, 76, 85, 91, 76, 75,
+  80, 85, 70, 84, 69, 71, 85, 93, 63, 74,
+  84, 96, 80, 85, 80, 77, 107, 56, 73, 101,
+  66, 96, 95, 96, 87, 84, 68, 76, 94, 70,
+  117, 69, 73, 93, 72, 92, 104, 77, 80, 86,
+  83, 71, 78, 76, 95, 81, 89, 80, 100, 90,
+  90, 58, 60, 65, 74, 88, 97, 76, 109, 76,
+  113, 89, 87, 98, 90, 88, 99, 84, 80, 79,
+  75, 85, 66, 78, 84, 83, 79, 81, 83, 97,
+  98, 81, 87, 77, 93, 73, 72, 82, 80, 91,
+  95, 82, 88, 83, 76, 76, 78, 72, 79, 79,
+  66, 100, 68, 81, 85, 85, 72, 89, 77, 81,
+  72, 83, 84, 81, 76, 75, 86, 73, 74, 89,
+  71, 69, 87, 69, 86, 85, 81, 79, 114, 85,
+  69, 83, 85, 76, 84, 85, 64, 75, 89, 87,
+  87, 75, 84, 87, 79, 71, 76, 98, 75, 101,
+  96, 86, 95, 75, 70, 99, 99, 82, 102, 79,
+  66, 75, 81, 87, 96, 87, 73, 88, 92, 79,
+  80, 80, 85, 80, 86, 83, 93, 85, 91, 62,
+  79, 72, 78, 86, 111, 88, 86, 83, 95, 70,
+  87, 79, 84, 84, 99, 92, 82, 77, 88, 83,
+  85, 80, 92, 81, 80, 81, 78, 95, 94, 86,
+  67, 69, 88, 79, 88, 89, 82, 92, 92, 85,
+  83, 92, 81, 84, 72, 71, 74, 75, 67, 84,
+  81, 86, 93, 89, 83, 85, 83, 77, 81, 82,
+  96, 82, 77, 82, 68, 83, 79, 92, 77, 97,
+  81, 84, 68, 82, 72, 81, 93, 65, 70, 99,
+  74, 93, 81, 100, 86, 91, 89, 75, 74, 82,
+  84, 84, 98, 77, 76, 84, 84, 75, 77, 93,
+  92, 83, 91, 95, 77, 86, 95, 80, 103, 95,
+  80, 83, 85, 83, 80, 68, 76, 92, 85, 100,
+  86, 77, 82, 76, 83, 90, 83, 65, 88, 79,
+  86, 93, 86, 92, 89, 94, 93, 78, 87, 81,
+  84, 79, 90, 69, 79, 86, 80, 98, 82, 70,
+  99, 80, 84, 85, 83, 81, 78, 84, 102, 70,
+  88, 89, 90, 79, 94, 85, 85, 84, 92, 87,
+  88, 84, 84, 80, 78, 100, 87, 101, 76, 83,
+  74, 78, 84, 86, 89, 87, 72, 81, 87, 84,
+  78, 84, 67, 73, 84, 81, 80, 90, 81, 74,
+  76, 78, 67, 89, 86, 79, 68, 95, 76, 90,
+  70, 94, 92, 87, 88, 74, 68, 82, 91, 81,
+  104, 81, 72, 78, 78, 78, 77, 91, 81, 77,
+  72, 84, 75, 64, 91, 85, 116, 98, 73, 71,
+  79, 79, 71, 60, 80, 85, 88, 59, 91, 64,
+  85, 78, 80, 91, 90, 61, 91, 63, 79, 81,
+  88, 90, 82, 77, 103, 83, 83, 78, 73, 80,
+  93, 61, 81, 83, 78, 94, 74, 60, 100, 79,
+  76, 88, 81, 93, 74, 76, 113, 68, 81, 93,
+  77, 75, 88, 69, 81, 83, 85, 87, 74, 87,
+  84, 83, 86, 91, 75, 101, 85, 64, 82, 73,
+  71, 85, 96, 80, 71, 76, 90, 79, 77, 77,
+  82, 80, 92, 90, 75, 90, 85, 81, 74, 82,
+  83, 82, 92, 95, 76, 91, 74, 92, 88, 97,
+  92, 91, 91, 72, 76, 81, 83, 84, 87, 75,
+  93, 87, 80, 87, 78, 84, 90, 80, 77, 95,
+  79, 110, 88, 81, 83, 96, 87, 85, 84, 84,
+  76, 79, 78, 89, 91, 61, 76, 69, 81, 76,
+  85, 86, 82, 65, 83, 86, 85, 85, 94, 83,
+  86, 105, 83, 85, 90, 82, 89, 89, 96, 77,
+  78, 94, 84, 86, 84, 69, 98, 90, 96, 78,
+  79, 89, 79, 88, 99, 79, 95, 92, 85, 86,
+  87, 91, 95, 80, 93, 88, 87, 88, 88, 84,
+  96, 97, 89, 97, 101, 87, 88, 84, 86, 83,
+  94, 91, 80, 83, 88, 75, 84, 88, 98, 78,
+  75, 74, 84, 82, 73, 83, 85, 87, 99, 87,
+  80, 83, 76, 71, 84, 66, 72, 87, 81, 79,
+  85, 83, 81, 66, 94, 82, 84, 63, 103, 75,
+  78, 101, 98, 82, 88, 82, 72, 72, 79, 151,
+  79, 88, 92, 68, 95, 90, 75, 87, 98, 93,
+  84, 73, 75, 101, 90, 88, 73, 85, 78, 90,
+  81, 82, 69, 88, 85, 78, 96, 66, 77, 132,
+  69, 76, 83, 64, 98, 82, 51, 78, 97, 91,
+  81, 76, 85, 66, 80, 90, 102, 66, 77, 65,
+  74, 63, 79, 73, 80, 96, 87, 80, 83, 83,
+  101, 82, 83, 81, 83, 76, 71, 88, 80, 104,
+  80, 79, 121, 89, 62, 81, 89, 70, 79, 99,
+  86, 89, 94, 72, 79, 100, 103, 84, 77, 74,
+  81, 86, 79, 82, 100, 89, 101, 97, 97, 106,
+  82, 79, 100, 64, 68, 74, 84, 80, 71, 86,
+  83, 69, 96, 79, 94, 67, 113, 84, 83, 100,
+  82, 81, 97, 83, 110, 76, 73, 211, 92, 101,
+  95, 47, 98, 87, 79, 83, 100, 97, 94, 76,
+  75, 135, 84, 81, 81, 74, 72, 77, 87, 84,
+  46, 115, 86, 64, 89, 44, 68, 150, 58, 76,
+  79, 60, 97, 84, 28, 100, 105, 89, 84, 71,
+  93, 69, 68, 89, 114, 59, 77, 44, 80, 65,
+  61, 69, 80, 107, 98, 78, 70, 70, 112, 82,
+  74, 76, 77, 85, 80, 96, 86, 89, 83, 71,
+  124, 102, 63, 89, 98, 77, 70, 98, 101, 95,
+  107, 53, 86, 97, 75, 79, 84, 83, 85, 91,
+  70, 82, 83, 89, 92, 87, 67, 68, 77, 76,
+  81, 74, 78, 92, 73, 71, 78, 78, 74, 67,
+  92, 81, 72, 87, 85, 78, 79, 91, 80, 82,
+  84, 87, 65, 76, 87, 103, 79, 85, 88, 82,
+  92, 88, 73, 85, 95, 80, 85, 73, 79, 100,
+  84, 79, 76, 94, 88, 94, 80, 69, 77, 75,
+  85, 81, 93, 78, 72, 116, 80, 86, 88, 73,
+  91, 88, 61, 73, 91, 87, 85, 92, 75, 74,
+  83, 79, 86, 76, 78, 69, 72, 75, 86, 76,
+  77, 94, 89, 81, 86, 83, 93, 83, 79, 77,
+  86, 82, 65, 87, 74, 109, 80, 83, 93, 76,
+  88, 78, 77, 76, 78, 93, 77, 85, 92, 83,
+  78, 84, 71, 93, 88, 79, 85, 79, 80, 72,
+  90, 75, 78, 79, 82, 94, 73, 75, 82, 83,
+  84, 96, 90, 83, 94, 85, 84, 94, 87, 78,
+  101, 82, 74, 96, 79, 87, 80, 81, 89, 89,
+  79, 84, 93, 79, 87, 74, 80, 114, 77, 85,
+  98, 95, 86, 76, 83, 81, 81, 65, 80, 69,
+  76, 76, 83, 83, 84, 68, 90, 77, 86, 95,
+  89, 89, 78, 72, 92, 82, 86, 82, 80, 71,
+  97, 80, 80, 92, 88, 94, 76, 90, 104, 86,
+  86, 89, 101, 74, 85, 82, 91, 80, 84, 80,
+  75, 89, 93, 85, 75, 83, 94, 85, 93, 83,
+  59, 80, 89, 83, 82, 106, 81, 79, 85, 86,
+  83, 84, 83, 91, 81, 84, 92, 108, 72, 75,
+  50, 76, 77, 77, 85, 88, 76, 70, 94, 76,
+  75, 92, 60, 82, 76, 75, 84, 86, 77, 100,
+  89, 76, 98, 86, 75, 97, 89, 73, 103, 69,
+  55, 81, 71, 80, 75, 92, 79, 77, 68, 75,
+  95, 49, 89, 75, 83, 124, 69, 70, 91, 92,
+  75, 71, 82, 79, 81, 70, 81, 64, 71, 79,
+  87, 90, 80, 63, 100, 65, 88, 96, 88, 104,
+  82, 56, 102, 81, 87, 82, 65, 74, 96, 70,
+  83, 92, 74, 92, 66, 88, 106, 85, 72, 92,
+  98, 85, 84, 80, 102, 77, 78, 84, 70, 84,
+  93, 84, 67, 83, 98, 86, 91, 84, 50, 75,
+  74, 77, 77, 111, 68, 73, 107, 80, 70, 81,
+  91, 83, 74, 83, 86, 112, 71, 64, 76, 80,
+  74, 79, 80, 81, 84, 79, 90, 79, 81, 77,
+  92, 89, 73, 76, 80, 83, 84, 95, 82, 88,
+  82, 81, 79, 93, 86, 80, 87, 74, 80, 85,
+  82, 84, 93, 96, 89, 84, 87, 91, 95, 95,
+  89, 77, 77, 103, 77, 78, 92, 97, 84, 92,
+  84, 86, 78, 97, 86, 76, 79, 78, 84, 84,
+  81, 75, 76, 91, 82, 96, 88, 83, 81, 85,
+  90, 86, 82, 84, 85, 78, 91, 78, 82, 94,
+  88, 76, 83, 86, 98, 79, 85, 84, 91, 81,
+  80, 84, 85, 78, 83, 88, 91, 89, 84, 87,
+  82, 84, 96, 83, 87, 84, 67, 83, 80, 89,
+  82, 97, 75, 85, 95, 81, 86, 84, 93, 86,
+  90, 90, 94, 103, 81, 81, 82, 85, 78, 74,
+  75, 72, 76, 85, 90, 87, 81, 87, 110, 76,
+  69, 84, 79, 78, 90, 89, 72, 76, 74, 94,
+  89, 79, 92, 84, 89, 90, 81, 93, 78, 75,
+  84, 96, 88, 97, 75, 85, 98, 76, 92, 91,
+  92, 94, 73, 83, 72, 80, 85, 98, 80, 80,
+  87, 80, 79, 70, 100, 84, 98, 58, 73, 87,
+  63, 77, 68, 78, 69, 99, 118, 88, 83, 71,
+  81, 91, 83, 97, 87, 74, 83, 80, 91, 80,
+  85, 90, 86, 92, 70, 83, 76, 94, 83, 93,
+  92, 78, 87, 86, 93, 80, 97, 93, 88, 90,
+  80, 66, 72, 87, 67, 76, 83, 72, 80, 89,
+  71, 95, 74, 82, 90, 79, 71, 87, 76, 80,
+  98, 80, 84, 75, 77, 65, 80, 90, 85, 91,
+  76, 111, 92, 90, 85, 85, 56, 74, 70, 83,
+  78, 76, 88, 74, 86, 83, 77, 90, 82, 86,
+  85, 87, 91, 87, 72, 83, 77, 82, 67, 92,
+  56, 97, 55, 77, 80, 65, 68, 77, 86, 94,
+  74, 64, 89, 67, 97, 89, 79, 77, 81, 52,
+  111, 96, 88, 98, 80, 80, 90, 73, 70, 83,
+  69, 88, 75, 59, 111, 68, 110, 77, 77, 109,
+  71, 82, 71, 69, 82, 93, 78, 82, 76, 86,
+  92, 79, 82, 80, 97, 87, 74, 86, 113, 69,
+  79, 80, 59, 95, 67, 84, 88, 87, 85, 79,
+  81, 88, 68, 78, 83, 80, 98, 80, 86, 80,
+  91, 76, 86, 72, 85, 82, 91, 102, 87, 91,
+  77, 74, 94, 59, 95, 72, 100, 63, 98, 82,
+  86, 73, 75, 90, 76, 76, 89, 83, 80, 89,
+  85, 75, 89, 82, 90, 77, 90, 86, 85, 78,
+  72, 83, 87, 84, 89, 82, 74, 89, 81, 79,
+  86, 87, 79, 70, 84, 100, 81, 91, 83, 70,
+  103, 80, 73, 91, 69, 93, 68, 96, 100, 120,
+  86, 79, 75, 96, 84, 75, 91, 122, 102, 89,
+  93, 76, 83, 68, 93, 86, 89, 64, 81, 76,
+  86, 97, 91, 102, 92, 85, 107, 95, 78, 71,
+  104, 74, 78, 68, 83, 81, 77, 96, 64, 88,
+  85, 103, 87, 74, 76, 90, 96, 93, 104, 86,
+  79, 90, 90, 88, 87, 77, 106, 91, 81, 76,
+  91, 104, 91, 87, 84, 84, 84, 93, 85, 88,
+  84, 105, 65, 86, 80, 68, 85, 61, 90, 76,
+  82, 82, 123, 83, 88, 77, 87, 82, 88, 98,
+  76, 73, 73, 94, 88, 89, 87, 79, 98, 92,
+  101, 101, 80, 85, 102, 79, 98, 95, 91, 79,
+  98, 90, 100, 100, 87, 91, 88, 84, 65, 83,
+  81, 103, 85, 89, 84, 118, 67, 68, 96, 84,
+  102, 68, 79, 91, 66, 71, 86, 87, 71, 95,
+  72, 90, 67, 84, 87, 70, 90, 84, 83, 91,
+  91, 79, 95, 82, 94, 92, 85, 85, 80, 78,
+  75, 77, 91, 101, 66, 85, 93, 98, 130, 70,
+  90, 72, 90, 92, 79, 73, 69, 96, 78, 89,
+  85, 83, 70, 84, 78, 98, 58, 85, 86, 93,
+  84, 88, 78, 73, 90, 76, 89, 92, 83, 71,
+  57, 92, 72, 106, 57, 93, 85, 96, 71, 80,
+  74, 72, 68, 78, 84, 87, 83, 92, 78, 76,
+  77, 86, 79, 71, 98, 82, 112, 73, 60, 86,
+  80, 77, 90, 99, 96, 75, 64, 78, 88, 70,
+  69, 76, 87, 108, 79, 80, 73, 79, 78, 75,
+  82, 64, 97, 72, 89, 60, 86, 89, 98, 69,
+  81, 53, 61, 62, 56, 87, 77, 99, 149, 72,
+  90, 77, 87, 90, 75, 112, 84, 62, 84, 61,
+  78, 89, 74, 78, 90, 97, 47, 80, 79, 97,
+  69, 72, 116, 62, 80, 78, 76, 67, 86, 102,
+  98, 92, 86, 75, 75, 83, 65, 68, 73, 91,
+  77, 97, 68, 85, 73, 73, 73, 70, 73, 85,
+  73, 84, 83, 82, 72, 70, 79, 65, 86, 84,
+  100, 68, 83, 110, 83, 83, 84, 90, 71, 80,
+  79, 79, 77, 81, 101, 84, 98, 87, 72, 87,
+  82, 94, 84, 89, 70, 80, 81, 87, 82, 89,
+  66, 84, 71, 88, 63, 105, 79, 78, 61, 82,
+  83, 83, 79, 67, 98, 80, 88, 80, 73, 82,
+  71, 61, 112, 89, 90, 81, 74, 85, 98, 54,
+  59, 90, 86, 85, 82, 73, 49, 70, 107, 94,
+  76, 95, 71, 80, 55, 96, 86, 90, 86, 87,
+  89, 87, 89, 69, 91, 75, 98, 74, 82, 93,
+  86, 81, 78, 81, 70, 93, 66, 66, 86, 92,
+  91, 81, 96, 85, 77, 85, 88, 71, 95, 76,
+  88, 87, 62, 78, 85, 86, 95, 92, 86, 107,
+  86, 89, 78, 82, 83, 91, 63, 104, 87, 96,
+  95, 67, 86, 67, 87, 84, 89, 87, 85, 79,
+  85, 82, 78, 88, 79, 79, 80, 93, 73, 78,
+  80, 69, 81, 103, 101, 92, 88, 102, 91, 77,
+  83, 95, 75, 65, 91, 86, 90, 92, 76, 77,
+  79, 79, 74, 67, 85, 99, 91, 105, 77, 92,
+  69, 89, 84, 77, 95, 110, 88, 88, 85, 81,
+  104, 79, 81, 68, 70, 73, 81, 89, 72, 67,
+  86, 71, 72, 91, 102, 85, 86, 88, 83, 92,
+  89, 89, 88, 70, 88, 82, 99, 95, 70, 90,
+  99, 83, 110, 95, 72, 76, 86, 88, 84, 83,
+  72, 99, 81, 83, 75, 93, 69, 77, 104, 96,
+  68, 90, 81, 100, 90, 68, 79, 80, 84, 87,
+  86, 96, 83, 101, 67, 85, 78, 78, 81, 66,
+  87, 82, 72, 88, 114, 86, 71, 74, 86, 73,
+  80, 90, 76, 69, 87, 90, 89, 80, 91, 81,
+  98, 88, 101, 93, 73, 69, 98, 92, 97, 88,
+  103, 85, 98, 87, 89, 89, 69, 94, 92, 95,
+  71, 82, 74, 100, 86, 73, 86, 104, 59, 72,
+  83, 92, 95, 64, 81, 81, 71, 66, 78, 93,
+  88, 79, 98, 88, 67, 77, 97, 60, 80, 99,
+  90, 74, 91, 75, 94, 96, 90, 85, 72, 96,
+  79, 71, 68, 73, 85, 88, 63, 75, 89, 89,
+  135, 74, 90, 75, 94, 93, 96, 75, 81, 91,
+  97, 77, 82, 84, 57, 90, 81, 99, 72, 83,
+  92, 75, 72, 79, 81, 68, 88, 87, 81, 81,
+  74, 69, 67, 83, 91, 103, 72, 98, 73, 86,
+  78, 82, 59, 89, 63, 76, 79, 92, 82, 90,
+  99, 84, 78, 90, 81, 89, 89, 83, 77, 79,
+  80, 86, 83, 80, 67, 93, 94, 84, 66, 94,
+  81, 81, 54, 77, 86, 89, 86, 102, 91, 77,
+  78, 76, 76, 79, 89, 70, 100, 70, 79, 79,
+  86, 67, 96, 50, 60, 74, 73, 97, 78, 82,
+  99, 75, 91, 90, 79, 104, 71, 88, 70, 86,
+  88, 72, 71, 92, 84, 74, 94, 82, 69, 76,
+  93, 85, 82, 82, 106, 72, 83, 78, 78, 87,
+  82, 83, 92, 96, 94, 72, 84, 81, 90, 74,
+  78, 72, 72, 89, 83, 86, 82, 82, 88, 80,
+  96, 83, 88, 92, 75, 87, 78, 76, 78, 78,
+  80, 81, 93, 80, 85, 92, 81, 93, 65, 89,
+  78, 82, 74, 104, 77, 91, 77, 95, 76, 82,
+  101, 81, 76, 72, 78, 79, 99, 92, 77, 82,
+  81, 87, 84, 80, 80, 88, 86, 86, 80, 77,
+  79, 88, 108, 83, 77, 76, 103, 70, 86, 77,
+  65, 85, 81, 79, 77, 92, 83, 82, 72, 77,
+  87, 84, 80, 80, 76, 74, 81, 80, 75, 67,
+  75, 87, 87, 75, 87, 73, 83, 85, 80, 74,
+  80, 98, 76, 75, 72, 78, 87, 88, 83, 87,
+  87, 85, 89, 66, 88, 77, 93, 84, 86, 86,
+  130, 96, 97, 77, 80, 90, 87, 81, 73, 95,
+  88, 78, 82, 74, 81, 74, 80, 75, 81, 90,
+  81, 123, 79, 70, 79, 82, 74, 75, 81, 82,
+  93, 84, 82, 92, 77, 100, 65, 87, 75, 84,
+  79, 104, 77, 90, 77, 99, 75, 78, 87, 85,
+  78, 72, 77, 82, 90, 94, 76, 87, 79, 83,
+  86, 81, 79, 86, 85, 82, 78, 81, 78, 86,
+  102, 77, 75, 74, 116, 65, 84, 77, 71, 81,
+  79, 80, 79, 86, 80, 78, 72, 83, 81, 77,
+  82, 82, 76, 75, 81, 81, 77, 67, 77, 79,
+  94, 75, 87, 79, 83, 91, 80, 73, 78, 83,
+  72, 73, 76, 79, 83, 93, 81, 88, 84, 86,
+  87, 69, 88, 74, 84, 85, 85, 78, 142, 96,
+  98, 77, 77, 92, 82, 73, 68, 90, 99, 74,
+  84, 73, 78, 74, 77, 73, 81, 86, 83, 129,
+  77, 69, 78, 77, 82, 72, 81, 81, 91, 93,
+  83, 91, 82, 91, 70, 92, 82, 90, 76, 98,
+  77, 90, 79, 101, 76, 82, 76, 82, 81, 74,
+  79, 75, 93, 92, 75, 87, 80, 80, 86, 81,
+  80, 84, 87, 80, 78, 79, 79, 89, 105, 81,
+  78, 73, 101, 72, 84, 80, 68, 83, 82, 77,
+  80, 89, 82, 81, 72, 82, 84, 85, 83, 82,
+  81, 78, 77, 82, 75, 70, 80, 83, 90, 75,
+  90, 85, 79, 85, 80, 77, 79, 79, 78, 74,
+  81, 83, 84, 88, 83, 97, 85, 89, 80, 67,
+  86, 77, 78, 83, 89, 81, 124, 94, 92, 81,
+  81, 89, 83, 81, 72, 94, 85, 67, 86, 81,
+  74, 73, 83, 75, 84, 90, 78, 124, 79, 75,
+  78, 83, 74, 81, 82, 88, 84, 85, 99, 95,
+  70, 95, 66, 86, 75, 84, 83, 111, 78, 85,
+  79, 96, 74, 80, 93, 88, 85, 74, 71, 79,
+  91, 90, 77, 77, 80, 95, 75, 79, 78, 93,
+  88, 93, 82, 75, 73, 86, 96, 78, 78, 79,
+  116, 70, 84, 75, 72, 78, 78, 73, 72, 93,
+  82, 78, 75, 73, 86, 91, 81, 76, 86, 78,
+  91, 78, 74, 65, 68, 72, 87, 76, 88, 77,
+  80, 79, 75, 78, 85, 92, 71, 71, 71, 79,
+  79, 84, 84, 82, 86, 84, 87, 72, 89, 71,
+  85, 84, 82, 82, 141, 96, 92, 78, 80, 89,
+  87, 78, 79, 88, 102, 81, 76, 77, 84, 76,
+  81, 80, 82, 86, 80, 136, 78, 78, 79, 76,
+  67, 81, 79, 99, 87, 79, 105, 96, 68, 104,
+  63, 82, 73, 84, 92, 117, 78, 75, 78, 97,
+  74, 79, 78, 97, 86, 79, 69, 89, 88, 81,
+  80, 78, 78, 95, 75, 81, 74, 96, 88, 95,
+  81, 78, 77, 81, 87, 75, 79, 81, 136, 62,
+  86, 76, 86, 77, 77, 76, 69, 85, 81, 74,
+  75, 75, 82, 81, 73, 76, 89, 78, 98, 72,
+  74, 67, 64, 67, 101, 71, 90, 80, 83, 85,
+  74, 78, 82, 70, 60, 71, 73, 81, 78, 90,
+  85, 81, 82, 88, 84, 74, 91, 64, 84, 82,
+  80, 73, 166, 98, 100, 73, 77, 89, 89, 70,
+  80, 83, 124, 76, 73, 77, 75, 76, 80, 79,
+  79, 84, 87, 150, 76, 79, 78, 75, 75, 76,
+  78, 88, 85, 91, 98, 94, 73, 92, 68, 89,
+  79, 88, 81, 106, 78, 81, 78, 103, 74, 78,
+  79, 88, 83, 76, 73, 78, 84, 80, 75, 79,
+  77, 85, 82, 85, 77, 87, 87, 86, 80, 75,
+  76, 88, 97, 82, 76, 81, 115, 70, 85, 79,
+  73, 78, 77, 74, 75, 89, 84, 78, 74, 75,
+  83, 90, 87, 76, 87, 84, 91, 78, 79, 65,
+  72, 73, 95, 75, 91, 89, 83, 81, 75, 81,
+  80, 73, 72, 70, 83, 84, 76, 85, 81, 93,
+  84, 88, 79, 73, 87, 72, 77, 81, 85, 81,
+  132, 93, 92, 78, 84, 86, 88, 79, 78, 86,
+  100, 72, 76, 84, 75, 75, 81, 80, 83, 88,
+  82, 134, 78, 83, 80, 79, 81, 73, 76, 80,
+  87, 88, 96, 101, 73, 86, 69, 86, 79, 84,
+  84, 99, 77, 77, 77, 92, 79, 82, 90, 83,
+  85, 85, 76, 71, 83, 83, 78, 84, 80, 98,
+  75, 81, 78, 94, 87, 90, 80, 85, 71, 87,
+  101, 77, 77, 76, 110, 72, 90, 79, 65, 78,
+  82, 80, 75, 95, 87, 76, 71, 70, 94, 92,
+  82, 80, 90, 74, 88, 79, 78, 74, 72, 74,
+  83, 80, 95, 90, 70, 80, 75, 78, 88, 87,
+  84, 68, 74, 83, 83, 80, 77, 80, 90, 87,
+  87, 73, 89, 77, 76, 89, 86, 83, 117, 95,
+  83, 87, 86, 90, 92, 87, 83, 80, 80, 73,
+  75, 78, 81, 78, 83, 81, 82, 85, 71, 132,
+  75, 81, 74, 81, 75, 77, 76, 83, 90, 80,
+  99, 98, 73, 85, 68, 83, 75, 83, 92, 102,
+  83, 72, 77, 89, 78, 80, 83, 86, 80, 89,
+  74, 73, 81, 81, 81, 84, 82, 100, 75, 80,
+  73, 101, 87, 89, 85, 88, 77, 86, 100, 77,
+  74, 84, 118, 67, 91, 80, 69, 75, 80, 78,
+  77, 90, 86, 76, 71, 76, 92, 85, 79, 79,
+  94, 76, 97, 78, 73, 70, 72, 77, 86, 81,
+  99, 85, 67, 83, 75, 79, 83, 75, 78, 70,
+  72, 86, 81, 83, 77, 85, 90, 93, 86, 79,
+  84, 76, 78, 88, 87, 79, 119, 97, 81, 84,
+  87, 89, 91, 86, 82, 78, 86, 74, 76, 80,
+  72, 79, 82, 79, 81, 87, 79, 136, 74, 85,
+  75, 80, 82, 76, 76, 80, 87, 90, 97, 99,
+  75, 87, 69, 88, 81, 84, 83, 98, 79, 76,
+  74, 97, 75, 82, 89, 81, 77, 84, 77, 74,
+  78, 79, 81, 85, 81, 88, 80, 84, 79, 96,
+  91, 82, 82, 87, 78, 88, 104, 83, 73, 91,
+  111, 71, 90, 85, 66, 77, 83, 72, 78, 91,
+  90, 77, 71, 72, 92, 91, 88, 80, 84, 79,
+  93, 81, 77, 71, 76, 76, 88, 80, 98, 85,
+  70, 82, 76, 80, 81, 77, 82, 68, 77, 87,
+  81, 81, 77, 87, 89, 91, 80, 74, 89, 77,
+  79, 86, 87, 79, 115, 92, 82, 86, 90, 87,
+  94, 87, 81, 79, 82, 78, 80, 84, 75, 77,
+  83, 82, 87, 87, 78, 128, 75, 84, 77, 82,
+  83, 72, 90, 88, 106, 91, 74, 63, 78, 90,
+  78, 72, 82, 96, 69, 82, 85, 100, 85, 80,
+  87, 91, 100, 96, 93, 78, 81, 87, 95, 90,
+  76, 86, 63, 77, 73, 93, 79, 77, 88, 82,
+  83, 80, 84, 73, 76, 92, 89, 96, 87, 66,
+  98, 80, 105, 73, 76, 83, 72, 75, 82, 86,
+  94, 86, 88, 81, 102, 72, 81, 91, 86, 111,
+  80, 83, 91, 85, 70, 73, 73, 75, 87, 93,
+  90, 86, 84, 82, 74, 74, 84, 99, 89, 83,
+  86, 74, 78, 71, 89, 78, 87, 74, 94, 87,
+  74, 72, 84, 84, 73, 77, 88, 101, 87, 56,
+  79, 89, 92, 77, 89, 91, 102, 87, 90, 97,
+  111, 74, 93, 90, 88, 84, 90, 77, 75, 98,
+  78, 90, 133, 82, 72, 59, 77, 87, 75, 74,
+  83, 107, 77, 80, 92, 85, 85, 71, 83, 73,
+  86, 112, 100, 71, 76, 89, 103, 78, 75, 85,
+  61, 75, 84, 71, 90, 70, 94, 86, 79, 76,
+  84, 84, 87, 95, 97, 78, 76, 52, 114, 80,
+  93, 77, 60, 84, 67, 72, 87, 81, 92, 76,
+  89, 82, 89, 69, 81, 82, 80, 102, 78, 76,
+  85, 77, 73, 67, 73, 75, 100, 105, 85, 105,
+  85, 86, 63, 66, 76, 100, 88, 101, 72, 79,
+  77, 69, 81, 75, 95, 77, 90, 100, 72, 86,
+  76, 84, 72, 71, 86, 104, 93, 55, 77, 85,
+  91, 76, 86, 80, 73, 90, 84, 104, 106, 65,
+  74, 94, 84, 78, 83, 83, 80, 101, 86, 85,
+  89, 95, 77, 71, 80, 89, 75, 78, 73, 80,
+  69, 86, 92, 95, 88, 77, 82, 90, 96, 88,
+  91, 82, 83, 82, 88, 68, 79, 88, 70, 83,
+  89, 96, 84, 80, 81, 84, 81, 85, 77, 71,
+  75, 84, 92, 80, 92, 77, 92, 77, 100, 68,
+  86, 84, 74, 80, 82, 83, 95, 94, 84, 78,
+  99, 72, 75, 94, 78, 91, 101, 89, 84, 88,
+  74, 79, 78, 87, 99, 86, 90, 84, 89, 105,
+  82, 70, 83, 95, 89, 87, 87, 90, 84, 70,
+  103, 74, 85, 79, 87, 80, 78, 92, 90, 85,
+  72, 76, 83, 103, 86, 70, 85, 91, 93, 84,
+  82, 85, 81, 87, 88, 93, 79, 81, 95, 87,
+  85, 77, 88, 84, 88, 75, 84, 91, 112, 94,
+  75, 67, 71, 88, 89, 80, 93, 104, 71, 82,
+  91, 92, 96, 74, 89, 84, 102, 96, 93, 80,
+  74, 87, 104, 86, 82, 84, 50, 76, 90, 93,
+  78, 67, 101, 87, 80, 72, 82, 83, 83, 90,
+  82, 105, 75, 61, 102, 76, 95, 67, 62, 93,
+  72, 73, 84, 84, 76, 95, 79, 83, 90, 67,
+  83, 85, 89, 81, 77, 76, 102, 89, 72, 71,
+  61, 75, 83, 90, 83, 116, 95, 72, 73, 79,
+  82, 97, 100, 80, 91, 88, 83, 71, 81, 79,
+  86, 71, 80, 94, 58, 82, 74, 83, 75, 73,
+  82, 94, 85, 60, 81, 93, 92, 75, 75, 74,
+  92, 93, 83, 85, 108, 72, 86, 99, 82, 81,
+  90, 70, 85, 98, 81, 87, 155, 79, 71, 59,
+  81, 76, 99, 79, 112, 122, 78, 77, 102, 69,
+  96, 63, 82, 64, 77, 115, 102, 70, 65, 82,
+  106, 85, 81, 83, 35, 67, 102, 67, 81, 67,
+  123, 99, 76, 72, 89, 96, 99, 96, 84, 81,
+  66, 29, 121, 77, 74, 80, 34, 88, 67, 64,
+  82, 75, 67, 85, 76, 94, 70, 69, 93, 67,
+  91, 67, 74, 67, 99, 72, 70, 60, 59, 79,
+  83, 123, 76, 147, 106, 83, 69, 87, 68, 90,
+  104, 92, 84, 78, 77, 76, 56, 80, 90, 70,
+  86, 118, 54, 71, 60, 85, 66, 64, 76, 90,
+  94, 45, 95, 88, 84, 70, 72, 69, 76, 101,
+  77, 89, 101, 56, 55, 101, 78, 69, 81, 75,
+  80, 107, 84, 90, 98, 99, 79, 69, 72, 88,
+  84, 82, 76, 89, 72, 83, 91, 87, 90, 76,
+  75, 85, 93, 86, 82, 80, 75, 85, 97, 77,
+  81, 88, 57, 72, 94, 90, 82, 73, 89, 86,
+  81, 74, 82, 82, 84, 83, 76, 77, 80, 74,
+  93, 71, 91, 68, 73, 83, 71, 78, 86, 83,
+  84, 95, 81, 75, 85, 68, 88, 86, 77, 75,
+  95, 80, 89, 89, 74, 70, 69, 94, 92, 83,
+  84, 110, 97, 102, 82, 82, 76, 94, 99, 80,
+  93, 84, 82, 70, 96, 77, 89, 79, 85, 85,
+  64, 79, 81, 86, 76, 73, 79, 100, 86, 72,
+  91, 94, 95, 84, 77, 75, 91, 91, 82, 89,
+  75, 76, 83, 89, 81, 79, 88, 81, 93, 75,
+  79, 93, 79, 91, 79, 68, 77, 97, 83, 89,
+  87, 92, 67, 91, 89, 98, 85, 81, 84, 89,
+  87, 80, 86, 79, 88, 91, 91, 76, 83, 86,
+  68, 81, 89, 93, 86, 76, 85, 95, 87, 71,
+  87, 77, 70, 79, 77, 93, 77, 83, 84, 83,
+  99, 61, 78, 93, 72, 84, 86, 80, 69, 96,
+  76, 86, 110, 73, 79, 100, 95, 89, 89, 86,
+  98, 97, 74, 75, 71, 82, 83, 68, 86, 84,
+  89, 69, 81, 84, 84, 88, 95, 78, 84, 114,
+  83, 70, 91, 69, 89, 73, 73, 79, 62, 91,
+  90, 86, 90, 94, 79, 92, 83, 69, 82, 81,
+  86, 78, 80, 94, 83, 91, 91, 80, 93, 82,
+  87, 95, 89, 82, 102, 78, 84, 88, 88, 95,
+  98, 78, 75, 63, 79, 93, 87, 92, 98, 99,
+  71, 88, 100, 87, 91, 68, 79, 72, 88, 87,
+  84, 71, 81, 86, 94, 87, 88, 83, 64, 78,
+  87, 76, 87, 84, 104, 101, 88, 61, 83, 86,
+  75, 80, 68, 80, 68, 62, 95, 82, 92, 65,
+  59, 86, 60, 75, 91, 76, 62, 88, 74, 86,
+  88, 63, 81, 84, 104, 93, 73, 71, 100, 93,
+  70, 67, 69, 74, 79, 79, 84, 104, 100, 92,
+  77, 95, 79, 86, 98, 81, 76, 112, 85, 67,
+  66, 67, 90, 77, 85, 90, 55, 82, 74, 87,
+  70, 98, 77, 87, 79, 66, 90, 67, 81, 76,
+  83, 99, 79, 102, 91, 77, 81, 71, 73, 95,
+  83, 74, 95, 73, 89, 97, 86, 93, 71, 91,
+  80, 68, 78, 97, 81, 87, 72, 79, 71, 93,
+  87, 92, 83, 75, 82, 89, 99, 78, 70, 79,
+  85, 87, 84, 94, 84, 92, 74, 79, 79, 97,
+  89, 79, 83, 93, 88, 66, 76, 74, 76, 77,
+  71, 85, 78, 91, 84, 78, 97, 65, 80, 77,
+  73, 85, 87, 88, 77, 87, 83, 81, 97, 74,
+  84, 101, 90, 93, 83, 88, 85, 99, 74, 80,
+  77, 79, 79, 65, 88, 81, 93, 114, 80, 84,
+  82, 83, 93, 84, 86, 97, 79, 69, 88, 70,
+  91, 78, 91, 75, 68, 80, 92, 89, 90, 86,
+  77, 90, 86, 74, 95, 78, 82, 84, 93, 90,
+  95, 87, 89, 81, 71, 86, 87, 87, 86, 85,
+  99, 86, 86, 67, 75, 96, 79, 91, 84, 82,
+  73, 82, 80, 72, 88, 80, 78, 84, 79, 81,
+  82, 77, 85, 91, 83, 87, 78, 85, 76, 85,
+  72, 90, 81, 81, 88, 86, 71, 84, 61, 69,
+  85, 82, 75, 71, 72, 83, 78, 85, 78, 90,
+  79, 87, 73, 86, 77, 79, 83, 69, 72, 82,
+  87, 81, 82, 90, 82, 75, 77, 74, 85, 92,
+  73, 64, 83, 74, 97, 87, 85, 83, 72, 77,
+  76, 73, 81, 67, 86, 95, 78, 89, 100, 75,
+  73, 83, 93, 78, 86, 79, 73, 81, 80, 80,
+  86, 76, 82, 81, 75, 80, 74, 80, 83, 83,
+  80, 81, 75, 80, 82, 81, 71, 85, 85, 82,
+  73, 86, 84, 79, 93, 80, 90, 77, 84, 83,
+  95, 82, 75, 97, 82, 67, 74, 94, 77, 86,
+  90, 77, 86, 90, 74, 84, 71, 88, 92, 96,
+  64, 77, 74, 89, 87, 75, 94, 93, 148, 76,
+  105, 95, 79, 87, 77, 83, 98, 97, 81, 40,
+  91, 45, 65, 79, 75, 65, 104, 85, 71, 69,
+  101, 75, 69, 84, 87, 88, 68, 100, 96, 91,
+  89, 76, 105, 71, 72, 71, 93, 89, 80, 104,
+  63, 56, 99, 86, 87, 79, 80, 84, 105, 46,
+  79, 84, 72, 99, 79, 97, 88, 85, 118, 80,
+  88, 111, 85, 81, 100, 75, 88, 80, 86, 73,
+  91, 99, 85, 81, 87, 103, 81, 86, 87, 80,
+  82, 84, 82, 85, 86, 102, 79, 87, 79, 94,
+  93, 90, 96, 85, 75, 85, 101, 92, 87, 93,
+  82, 94, 76, 76, 83, 80, 74, 81, 79, 79,
+  89, 86, 80, 82, 79, 76, 83, 87, 75, 92,
+  89, 91, 84, 82, 82, 84, 105, 69, 87, 90,
+  84, 72, 79, 89, 70, 69, 81, 78, 78, 69,
+  76, 87, 81, 85, 83, 79, 75, 86, 77, 96,
+  74, 80, 90, 71, 70, 82, 92, 77, 79, 81,
+  80, 81, 73, 76, 86, 89, 80, 70, 81, 73,
+  97, 82, 86, 78, 79, 82, 83, 71, 82, 66,
+  88, 81, 79, 87, 86, 74, 86, 88, 86, 81,
+  87, 81, 80, 80, 81, 83, 71, 85, 78, 96,
+  78, 82, 74, 84, 82, 85, 80, 80, 91, 79,
+  79, 93, 76, 87, 86, 81, 79, 89, 82, 81,
+  85, 82, 88, 73, 84, 82, 85, 68, 98, 88,
+  82, 74, 85, 76, 73, 89, 77, 66, 87, 94,
+  81, 93, 85, 79, 71, 72, 82, 88, 81, 90,
+  87, 86, 86, 89, 117, 87, 89, 79, 79, 81,
+  80, 66, 84, 74, 98, 73, 83, 77, 80, 92,
+  78, 80, 82, 80, 77, 69, 90, 105, 89, 80,
+  81, 111, 73, 80, 84, 77, 80, 77, 75, 57,
+  75, 64, 74, 84, 87, 74, 92, 79, 88, 88,
+  86, 86, 71, 80, 67, 82, 76, 72, 86, 89,
+  81, 82, 98, 88, 93, 78, 77, 78, 91, 77,
+  84, 71, 86, 81, 87, 90, 80, 81, 75, 78,
+  72, 78, 72, 89, 76, 76, 87, 77, 79, 87,
+  91, 77, 72, 85, 93, 91, 86, 74, 89, 83,
+  88, 79, 86, 79, 87, 81, 89, 85, 85, 64,
+  81, 77, 73, 93, 81, 68, 94, 99, 79, 88,
+  76, 80, 81, 91, 67, 77, 77, 96, 90, 78,
+  94, 92, 159, 82, 118, 87, 69, 85, 85, 77,
+  109, 91, 95, 43, 95, 66, 73, 91, 75, 63,
+  103, 80, 63, 52, 116, 98, 82, 75, 82, 109,
+  69, 90, 102, 89, 92, 67, 88, 59, 82, 59,
+  83, 87, 92, 102, 93, 64, 83, 86, 94, 74,
+  77, 79, 89, 55, 73, 93, 71, 95, 83, 88,
+  88, 93, 119, 72, 69, 98, 92, 82, 92, 68,
+  90, 82, 93, 79, 83, 99, 82, 79, 89, 105,
+  84, 85, 81, 72, 91, 85, 71, 90, 102, 88,
+  82, 92, 101, 103, 91, 85, 86, 78, 77, 91,
+  95, 88, 78, 87, 85, 83, 81, 71, 83, 78,
+  73, 89, 78, 70, 91, 94, 82, 92, 86, 72,
+  76, 80, 82, 86, 86, 97, 83, 83, 85, 88,
+  118, 80, 90, 82, 82, 66, 78, 81, 89, 69,
+  88, 74, 86, 78, 76, 91, 83, 80, 84, 69,
+  73, 76, 94, 99, 85, 77, 88, 93, 71, 77,
+  90, 75, 78, 76, 71, 59, 71, 64, 80, 86,
+  88, 71, 98, 78, 93, 85, 88, 87, 79, 77,
+  68, 79, 78, 70, 88, 80, 77, 81, 85, 78,
+  89, 82, 79, 76, 88, 81, 80, 72, 85, 85,
+  74, 89, 77, 91, 77, 80, 70, 76, 76, 83,
+  75, 73, 92, 77, 76, 92, 87, 76, 87, 84,
+  93, 91, 77, 79, 92, 84, 87, 75, 85, 78,
+  82, 72, 87, 90, 84, 98, 84, 81, 81, 81,
+  80, 70, 91, 87, 79, 85, 75, 80, 85, 80,
+  83, 89, 85, 87, 81, 88, 84, 84, 81, 87,
+  81, 84, 88, 91, 85, 79, 83, 79, 76, 80,
+  82, 70, 78, 87, 73, 90, 79, 88, 82, 83,
+  75, 93, 76, 83, 84, 87, 80, 85, 80, 78,
+  81, 96, 74, 77, 86, 76, 67, 83, 86, 76,
+  74, 71, 83, 89, 84, 89, 74, 82, 66, 72,
+  81, 73, 90, 89, 81, 78, 96, 88, 75, 85,
+  96, 84, 89, 79, 84, 81, 84, 81, 80, 82,
+  85, 70, 80, 79, 67, 69, 79, 82, 83, 82,
+  83, 89, 86, 92, 77, 77, 93, 77, 73, 80,
+  81, 80, 91, 88, 92, 91, 79, 85, 84, 90,
+  73, 91, 86, 70, 80, 76, 88, 88, 84, 70,
+  92, 84, 78, 79, 68, 87, 94, 99, 75, 68,
+  78, 97, 87, 81, 92, 96, 137, 92, 102, 92,
+  91, 95, 95, 86, 98, 97, 78, 49, 93, 58,
+  79, 82, 79, 83, 99, 81, 77, 73, 100, 68,
+  69, 80, 89, 92, 79, 93, 97, 86, 88, 90,
+  87, 75, 82, 72, 78, 86, 97, 85, 72, 65,
+  86, 87, 89, 90, 83, 80, 85, 54, 81, 83,
+  75, 93, 75, 82, 84, 84, 100, 84, 96, 93,
+  97, 87, 89, 84, 88, 84, 92, 80, 91, 81,
+  89, 83, 90, 98, 96, 76, 91, 84, 82, 95,
+  80, 89, 80, 92, 91, 91, 82, 97, 94, 91,
+  95, 88, 83, 105, 96, 96, 78, 83, 80, 85,
+  79, 82, 77, 80, 82, 82, 83, 74, 95, 84,
+  80, 83, 77, 77, 90, 82, 78, 85, 91, 88,
+  82, 85, 79, 88, 95, 82, 83, 85, 87, 74,
+  87, 94, 88, 77, 83, 78, 87, 68, 81, 87,
+  79, 85, 80, 70, 81, 84, 78, 86, 73, 82,
+  91, 79, 78, 80, 84, 76, 79, 89, 73, 78,
+  82, 76, 77, 82, 86, 71, 94, 71, 87, 86,
+  82, 85, 77, 83, 62, 70, 80, 70, 90, 79,
+  76, 80, 80, 78, 78, 85, 91, 81, 88, 83,
+  81, 82, 87, 83, 75, 85, 82, 67, 81, 81,
+  67, 71, 80, 78, 73, 76, 85, 84, 83, 91,
+  71, 75, 85, 77, 79, 79, 75, 83, 88, 87,
+  87, 87, 81, 84, 84, 85, 78, 82, 98, 96,
+  82, 79, 79, 85, 79, 74, 87, 60, 88, 80,
+  78, 97, 79, 110, 85, 83, 83, 85, 76, 87,
+  73, 80, 93, 95, 114, 80, 72, 104, 79, 74,
+  74, 80, 74, 84, 70, 77, 86, 113, 66, 77,
+  84, 101, 80, 79, 90, 91, 92, 88, 79, 89,
+  84, 104, 93, 82, 100, 72, 87, 75, 90, 68,
+  89, 95, 85, 90, 76, 68, 75, 73, 77, 75,
+  83, 73, 85, 78, 108, 67, 69, 87, 92, 76,
+  85, 89, 113, 93, 78, 77, 85, 62, 86, 92,
+  85, 62, 79, 74, 69, 78, 89, 81, 84, 85,
+  80, 154, 84, 87, 83, 78, 77, 83, 112, 73,
+  89, 87, 86, 84, 87, 73, 81, 86, 102, 91,
+  83, 69, 82, 96, 76, 81, 101, 82, 85, 79,
+  74, 84, 80, 77, 99, 66, 93, 87, 80, 96,
+  80, 121, 84, 90, 79, 85, 82, 87, 72, 78,
+  86, 74, 118, 78, 71, 93, 77, 73, 69, 77,
+  71, 87, 75, 83, 86, 126, 71, 67, 85, 76,
+  73, 83, 90, 102, 101, 93, 77, 103, 82, 117,
+  95, 77, 96, 69, 87, 89, 77, 78, 96, 99,
+  87, 77, 85, 69, 68, 79, 81, 74, 80, 84,
+  83, 80, 112, 67, 72, 68, 94, 80, 80, 87,
+  119, 101, 74, 70, 86, 55, 76, 96, 83, 66,
+  82, 80, 64, 72, 88, 81, 86, 86, 79, 161,
+  86, 85, 89, 74, 79, 79, 112, 61, 77, 81,
+  84, 81, 85, 71, 75, 94, 109, 88, 81, 69,
+  83, 94, 80, 79, 100, 94, 76, 84, 79, 85,
+  82, 72, 87, 73, 88, 81, 78, 98, 82, 123,
+  80, 86, 87, 88, 84, 90, 82, 78, 86, 69,
+  107, 80, 75, 79, 81, 94, 83, 81, 65, 83,
+  74, 77, 84, 93, 69, 76, 80, 72, 81, 82,
+  94, 84, 89, 91, 89, 93, 84, 110, 92, 80,
+  100, 79, 88, 75, 86, 75, 103, 96, 79, 88,
+  97, 74, 80, 78, 80, 77, 86, 99, 92, 82,
+  107, 65, 75, 66, 86, 83, 81, 83, 113, 92,
+  82, 69, 86, 63, 87, 86, 90, 66, 80, 79,
+  72, 80, 81, 82, 84, 91, 82, 129, 86, 88,
+  80, 80, 81, 85, 91, 71, 82, 86, 82, 86,
+  78, 76, 75, 84, 95, 93, 79, 71, 91, 85,
+  81, 89, 72, 84, 82, 74, 85, 83, 87, 82,
+  85, 68, 87, 82, 85, 77, 77, 98, 78, 90,
+  77, 98, 78, 73, 69, 80, 79, 69, 98, 75,
+  77, 91, 82, 80, 88, 80, 81, 74, 83, 79,
+  86, 89, 72, 94, 74, 103, 82, 87, 77, 91,
+  101, 86, 86, 67, 73, 71, 90, 89, 106, 84,
+  77, 87, 72, 74, 102, 97, 82, 65, 73, 81,
+  71, 73, 73, 77, 94, 78, 70, 80, 90, 79,
+  83, 76, 74, 87, 85, 86, 105, 82, 70, 85,
+  84, 75, 87, 93, 87, 84, 80, 88, 58, 100,
+  82, 84, 85, 87, 79, 109, 83, 83, 92, 73,
+  79, 82, 92, 93, 77, 87, 78, 73, 89, 77,
+  82, 86, 90, 81, 85, 84, 95, 90, 78, 91,
+  73, 80, 86, 70, 82, 88, 91, 82, 80, 81,
+  86, 92, 85, 81, 80, 98, 84, 96, 83, 97,
+  81, 64, 76, 80, 77, 73, 88, 75, 80, 86,
+  82, 79, 89, 86, 80, 64, 96, 70, 84, 79,
+  81, 88, 75, 84, 82, 87, 83, 79, 105, 87,
+  86, 84, 83, 70, 91, 86, 112, 91, 78, 96,
+  63, 82, 108, 100, 83, 67, 77, 80, 70, 85,
+  69, 76, 93, 94, 70, 74, 88, 75, 83, 79,
+  65, 95, 80, 82, 87, 82, 70, 80, 81, 70,
+  85, 90, 88, 90, 78, 94, 62, 91, 75, 86,
+  90, 89, 77, 104, 84, 81, 82, 78, 77, 81,
+  80, 85, 85, 87, 77, 80, 84, 80, 79, 82,
+  70, 85, 86, 86, 86, 101, 78, 84, 79, 88,
+  79, 72, 79, 86, 87, 78, 95, 90, 84, 85,
+  80, 81, 78, 93, 82, 87, 85, 98, 87, 73,
+  78, 78, 76, 73, 90, 78, 78, 81, 73, 86,
+  84, 86, 78, 71, 87, 79, 77, 78, 79, 87,
+  75, 81, 87, 88, 80, 75, 94, 91, 87, 100,
+  77, 78, 89, 88, 109, 89, 81, 85, 75, 82,
+  114, 103, 77, 68, 87, 90, 75, 77, 72, 77,
+  95, 89, 71, 78, 92, 77, 85, 88, 75, 93,
+  81, 78, 95, 85, 71, 68, 85, 77, 84, 88,
+  87, 85, 79, 82, 63, 89, 80, 86, 88, 88,
+  87, 95, 88, 84, 75, 79, 81, 82, 68, 88,
+  87, 92, 83, 78, 73, 81, 79, 83, 83, 85,
+  83, 83, 89, 84, 83, 87, 57, 80, 86, 86,
+  89, 85, 91, 87, 82, 88, 78, 79, 91, 79,
+  79, 78, 85, 95, 78, 94, 81, 72, 85, 78,
+  94, 66, 78, 80, 85, 70, 73, 94, 99, 81,
+  89, 74, 87, 67, 81, 63, 86, 97, 80, 89,
+  98, 92, 70, 82, 89, 85, 88, 72, 80, 51,
+  76, 98, 100, 86, 79, 99, 74, 88, 88, 91,
+  94, 85, 73, 80, 82, 80, 74, 77, 95, 84,
+  87, 86, 73, 92, 84, 69, 64, 95, 83, 68,
+  75, 77, 77, 86, 77, 85, 94, 89, 91, 108,
+  90, 88, 69, 93, 79, 83, 89, 81, 79, 69,
+  75, 87, 89, 81, 90, 83, 72, 96, 87, 84,
+  80, 73, 93, 85, 82, 90, 87, 87, 90, 83,
+  85, 86, 76, 84, 62, 82, 85, 82, 97, 86,
+  93, 86, 67, 89, 80, 75, 92, 87, 83, 69,
+  91, 93, 84, 96, 85, 64, 93, 82, 92, 73,
+  73, 74, 85, 74, 80, 87, 100, 86, 88, 61,
+  90, 63, 83, 55, 90, 112, 85, 82, 104, 88,
+  81, 69, 88, 82, 89, 73, 93, 57, 77, 93,
+  97, 99, 81, 99, 69, 93, 84, 83, 84, 79,
+  73, 82, 87, 89, 68, 87, 101, 91, 87, 79,
+  71, 89, 89, 88, 59, 98, 86, 65, 69, 78,
+  79, 82, 77, 85, 96, 92, 88, 112, 88, 85,
+  80, 89, 74, 86, 89, 82, 85, 63, 78, 87,
+  82, 87, 90, 85, 68, 92, 91, 88, 78, 83,
+  93, 88, 83, 83, 77, 90, 93, 82, 81, 92,
+  81, 84, 61, 83, 87, 81, 86, 84, 92, 83,
+  85, 90, 76, 81, 88, 79, 78, 64, 85, 89,
+  79, 94, 87, 69, 87, 78, 92, 77, 82, 82,
+  82, 86, 72, 88, 94, 84, 87, 73, 90, 69,
+  79, 61, 89, 95, 82, 87, 106, 88, 72, 73,
+  87, 82, 88, 82, 79, 53, 81, 94, 99, 90,
+  83, 96, 78, 91, 86, 87, 85, 79, 82, 88,
+  82, 85, 63, 80, 89, 78, 85, 85, 76, 92,
+  87, 99, 64, 96, 85, 68, 72, 79, 78, 85,
+  84, 84, 97, 89, 89, 104, 79, 84, 74, 87,
+  81, 87, 89, 81, 86, 64, 77, 89, 82, 83,
+  90, 82, 65, 94, 83, 89, 83, 77, 80, 88,
+  82, 90, 80, 88, 89, 83, 83, 75, 81, 73,
+  90, 93, 88, 75, 91, 58, 95, 73, 88, 73,
+  79, 103, 71, 85, 96, 82, 73, 78, 84, 76,
+  90, 77, 81, 72, 92, 87, 98, 85, 93, 101,
+  94, 81, 89, 88, 81, 81, 81, 100, 87, 95,
+  77, 84, 99, 99, 82, 80, 81, 77, 81, 89,
+  84, 88, 75, 87, 74, 92, 95, 85, 84, 81,
+  91, 83, 71, 75, 86, 78, 80, 97, 73, 89,
+  86, 84, 68, 87, 78, 80, 86, 74, 85, 82,
+  85, 79, 75, 85, 91, 86, 67, 83, 84, 75,
+  76, 78, 76, 97, 77, 76, 80, 86, 85, 84,
+  87, 82, 85, 89, 77, 81, 87, 81, 86, 77,
+  82, 74, 89, 92, 86, 89, 84, 89, 88, 82,
+  80, 81, 97, 84, 85, 80, 85, 65, 95, 84,
+  91, 68, 79, 60, 95, 77, 87, 83, 79, 90,
+  72, 84, 99, 91, 78, 77, 82, 67, 86, 73,
+  82, 74, 89, 87, 105, 77, 90, 100, 92, 85,
+  79, 73, 89, 76, 77, 103, 79, 101, 82, 77,
+  89, 86, 73, 76, 79, 74, 76, 89, 80, 88,
+  76, 82, 76, 96, 98, 83, 83, 78, 82, 85,
+  77, 80, 83, 78, 86, 98, 67, 85, 92, 85,
+  59, 91, 73, 77, 90, 74, 87, 74, 93, 79,
+  79, 98, 85, 81, 64, 83, 92, 67, 71, 75,
+  79, 96, 85, 81, 72, 88, 88, 83, 63, 84,
+  94, 92, 83, 78, 83, 83, 91, 80, 88, 79,
+  86, 94, 86, 84, 77, 91, 83, 85, 78, 77,
+  94, 80, 86, 87, 93, 74, 92, 87, 86, 75,
+  86, 56, 92, 77, 83, 83, 80, 106, 74, 83,
+  96, 86, 84, 79, 89, 80, 79, 81, 87, 74,
+  86, 88, 91, 87, 95, 87, 92, 87, 87, 94,
+  79, 81, 81, 99, 79, 93, 86, 79, 90, 82,
+  81, 81, 82, 75, 77, 88, 88, 81, 77, 86,
+  74, 87, 95, 87, 87, 76, 94, 79, 76, 80,
+  88, 79, 84, 100, 79, 89, 97, 86, 71, 97,
+  77, 86, 86, 73, 89, 80, 83, 81, 78, 81,
+  89, 87, 70, 79, 84, 77, 74, 81, 84, 97,
+  92, 86, 85, 75, 86, 82, 79, 83, 78, 84,
+  81, 80, 83, 83, 84, 79, 85, 82, 85, 89,
+  82, 87, 77, 86, 82, 82, 83, 82, 91, 85,
+  82, 75, 73, 70, 78, 86, 94, 70, 97, 52,
+  89, 77, 77, 71, 82, 114, 73, 81, 81, 81,
+  78, 81, 87, 75, 90, 87, 82, 70, 91, 81,
+  95, 87, 101, 89, 92, 89, 78, 102, 82, 80,
+  73, 88, 83, 92, 74, 95, 98, 103, 83, 74,
+  86, 76, 80, 90, 88, 86, 78, 84, 83, 102,
+  87, 84, 82, 82, 98, 85, 75, 77, 100, 68,
+  96, 82, 77, 80, 87, 75, 76, 93, 80, 85,
+  83, 79, 79, 79, 82, 77, 69, 82, 83, 94,
+  61, 88, 77, 70, 66, 77, 90, 94, 86, 79,
+  79, 99, 88, 80, 88, 83, 86, 83, 81, 76,
+  87, 78, 80, 77, 76, 66, 79, 95, 82, 80,
+  83, 78, 80, 71, 83, 82, 90, 85, 83, 85,
+  84, 68, 83, 81, 94, 64, 89, 46, 86, 80,
+  84, 88, 86, 109, 82, 85, 82, 88, 77, 83,
+  80, 63, 81, 79, 79, 74, 93, 83, 102, 85,
+  114, 85, 91, 81, 70, 81, 88, 76, 75, 88,
+  83, 99, 77, 89, 105, 89, 74, 77, 91, 73,
+  77, 95, 83, 84, 81, 84, 79, 119, 90, 85,
+  83, 76, 77, 88, 88, 78, 98, 66, 73, 81,
+  61, 73, 97, 66, 82, 94, 66, 91, 89, 80,
+  81, 81, 85, 83, 75, 88, 76, 93, 60, 81,
+  87, 62, 53, 75, 96, 99, 88, 81, 71, 88,
+  91, 80, 76, 73, 96, 84, 88, 75, 88, 81,
+  85, 72, 76, 74, 78, 96, 97, 70, 78, 81,
+  78, 74, 87, 82, 96, 87, 78, 87, 104, 73,
+  83, 92, 92, 63, 89, 51, 85, 76, 77, 90,
+  85, 112, 74, 77, 80, 77, 80, 88, 89, 82,
+  78, 88, 86, 70, 83, 90, 88, 88, 95, 77,
+  81, 80, 76, 109, 78, 77, 79, 81, 85, 90,
+  81, 85, 95, 79, 83, 75, 85, 81, 78, 87,
+  87, 80, 82, 85, 80, 94, 91, 90, 84, 81,
+  99, 80, 86, 80, 92, 76, 72, 84, 76, 85,
+  90, 77, 79, 94, 70, 88, 86, 77, 80, 97,
+  79, 83, 78, 82, 81, 97, 62, 83, 80, 71,
+  69, 80, 91, 96, 83, 86, 83, 71, 87, 78,
+  83, 86, 82, 80, 85, 78, 80, 81, 78, 68,
+  79, 79, 98, 92, 87, 83, 78, 78, 78, 71,
+  83, 87, 87, 85, 78, 80, 86, 68, 67, 89,
+  92, 66, 105, 55, 75, 82, 78, 75, 83, 124,
+  71, 77, 71, 77, 95, 84, 82, 85, 101, 89,
+  95, 70, 91, 82, 76, 92, 98, 86, 91, 102,
+  84, 118, 80, 87, 83, 80, 84, 85, 76, 107,
+  93, 98, 92, 81, 78, 72, 85, 89, 90, 87,
+  80, 82, 98, 97, 77, 87, 88, 88, 109, 76,
+  78, 82, 94, 74, 99, 71, 104, 85, 81, 79,
+  81, 91, 86, 79, 80, 87, 80, 80, 78, 73,
+  66, 74, 91, 98, 64, 100, 78, 70, 73, 84,
+  87, 90, 92, 97, 84, 100, 83, 72, 83, 94,
+  79, 77, 74, 82, 83, 68, 67, 103, 77, 72,
+  71, 91, 85, 78, 79, 76, 88, 64, 82, 88,
+  88, 87, 77, 87, 92, 68, 61, 76, 90, 64,
+  117, 49, 68, 86, 87, 86, 86, 123, 79, 73,
+  58, 69, 88, 86, 80, 81, 89, 84, 99, 77,
+  93, 86, 64, 102, 111, 74, 87, 86, 81, 125,
+  77, 90, 84, 74, 90, 84, 74, 115, 109, 89,
+  82, 89, 78, 75, 79, 88, 88, 81, 78, 89,
+  88, 98, 75, 86, 85, 80, 96, 76, 86, 73,
+  100, 75, 82, 67, 91, 79, 84, 62, 97, 90,
+  73, 86, 80, 83, 74, 95, 68, 78, 72, 73,
+  86, 101, 53, 93, 77, 66, 60, 77, 87, 91,
+  107, 98, 83, 89, 80, 70, 95, 85, 82, 72,
+  71, 83, 79, 70, 64, 76, 77, 72, 84, 94,
+  105, 69, 83, 73, 84, 69, 87, 88, 89, 96,
+  77, 85, 93, 71, 72, 86, 92, 62, 98, 60,
+  75, 80, 84, 95, 88, 118, 78, 72, 71, 74,
+  86, 87, 93, 87, 87, 85, 95, 72, 89, 92,
+  76, 91, 93, 84, 74, 78, 79, 121, 80, 85,
+  87, 76, 98, 85, 80, 93, 85, 81, 93, 85,
+  79, 77, 84, 86, 87, 76, 75, 88, 93, 97,
+  81, 90, 89, 85, 97, 75, 81, 86, 87, 84,
+  70, 76, 97, 96, 80, 81, 80, 94, 78, 78,
+  84, 88, 69, 100, 76, 84, 97, 81, 88, 93,
+  63, 89, 82, 70, 74, 85, 86, 90, 95, 84,
+  84, 79, 84, 72, 80, 95, 86, 78, 77, 78,
+  73, 72, 69, 68, 77, 88, 102, 95, 85, 85,
+  83, 75, 89, 70, 84, 95, 88, 88, 93, 76,
+  88, 75, 77, 86, 89, 76, 83, 80, 82, 78,
+  77, 91, 91, 73, 89, 89, 70, 88, 80, 84,
+  96, 92, 74, 62, 85, 78, 94, 91, 82, 79,
+  90, 69, 87, 91, 82, 81, 98, 85, 92, 80,
+  91, 74, 85, 80, 92, 86, 63, 88, 92, 75,
+  89, 90, 88, 73, 71, 86, 80, 93, 80, 78,
+  83, 70, 88, 60, 88, 95, 67, 85, 74, 95,
+  77, 90, 69, 75, 75, 66, 88, 93, 80, 82,
+  82, 84, 66, 85, 93, 85, 62, 79, 86, 81,
+  82, 83, 90, 71, 74, 182, 87, 75, 72, 69,
+  82, 76, 95, 91, 65, 72, 82, 73, 92, 91,
+  82, 81, 74, 86, 82, 91, 86, 87, 90, 75,
+  73, 80, 97, 98, 86, 142, 100, 82, 77, 79,
+  82, 88, 89, 75, 83, 76, 84, 75, 81, 81,
+  86, 76, 85, 92, 76, 86, 87, 90, 85, 94,
+  73, 64, 87, 80, 88, 77, 81, 92, 82, 71,
+  99, 76, 80, 74, 88, 83, 81, 76, 86, 79,
+  77, 88, 91, 83, 66, 81, 80, 80, 96, 102,
+  93, 76, 74, 97, 80, 89, 80, 83, 80, 83,
+  83, 65, 85, 92, 69, 81, 75, 86, 83, 85,
+  71, 75, 72, 68, 97, 97, 84, 89, 82, 77,
+  63, 77, 84, 75, 68, 82, 90, 83, 80, 94,
+  91, 81, 83, 181, 90, 70, 67, 62, 81, 74,
+  90, 92, 65, 71, 86, 75, 92, 93, 87, 85,
+  76, 75, 74, 89, 82, 90, 86, 76, 72, 82,
+  108, 91, 87, 131, 89, 90, 75, 77, 83, 96,
+  87, 76, 86, 83, 81, 85, 84, 86, 91, 73,
+  88, 88, 72, 95, 88, 87, 80, 91, 73, 61,
+  87, 77, 83, 71, 76, 81, 93, 76, 97, 87,
+  84, 79, 85, 88, 85, 76, 93, 76, 85, 84,
+  87, 90, 71, 92, 89, 83, 87, 87, 83, 85,
+  72, 85, 88, 88, 79, 77, 83, 68, 96, 63,
+  93, 93, 68, 82, 90, 89, 77, 85, 74, 74,
+  79, 72, 99, 93, 81, 83, 88, 78, 71, 81,
+  84, 91, 64, 85, 88, 101, 82, 80, 94, 74,
+  75, 166, 86, 72, 72, 76, 81, 78, 92, 81,
+  69, 78, 86, 77, 91, 86, 83, 102, 66, 90,
+  80, 90, 88, 85, 72, 74, 73, 82, 92, 95,
+  88, 126, 88, 80, 75, 82, 80, 93, 90, 78,
+  88, 79, 82, 79, 87, 92, 86, 73, 89, 93,
+  78, 82, 84, 79, 89, 94, 78, 59, 89, 80,
+  93, 74, 86, 86, 96, 80, 68, 85, 71, 81,
+  93, 89, 79, 84, 95, 82, 78, 84, 94, 86,
+  64, 89, 99, 80, 90, 100, 86, 80, 74, 86,
+  73, 97, 74, 82, 83, 70, 85, 73, 81, 76,
+  87, 80, 88, 85, 80, 86, 72, 79, 77, 71,
+  81, 107, 80, 76, 83, 80, 75, 84, 97, 82,
+  65, 77, 84, 87, 74, 86, 94, 76, 77, 161,
+  89, 78, 69, 78, 78, 79, 87, 83, 78, 78,
+  78, 76, 86, 87, 83, 80, 63, 81, 81, 82,
+  85, 90, 84, 77, 70, 81, 97, 88, 91, 125,
+  81, 83, 75, 85, 79, 84, 91, 78, 91, 78,
+  83, 84, 85, 86, 83, 70, 86, 99, 86, 75,
+  88, 73, 86, 93, 82, 60, 89, 84, 90, 64,
+  90, 95, 91, 77, 68, 73, 64, 79, 94, 85,
+  78, 88, 91, 91, 74, 84, 97, 82, 66, 82,
+  93, 86, 96, 109, 89, 78, 75, 96, 79, 96,
+  77, 83, 84, 84, 82, 81, 82, 69, 88, 82,
+  74, 79, 80, 88, 73, 82, 71, 75, 78, 106,
+  86, 87, 78, 75, 71, 82, 84, 78, 68, 73,
+  89, 84, 76, 89, 81, 89, 86, 158, 92, 75,
+  67, 72, 82, 75, 81, 82, 82, 81, 74, 76,
+  89, 91, 88, 81, 69, 75, 75, 85, 88, 91,
+  79, 80, 70, 84, 109, 82, 92, 108, 88, 91,
+  84, 81, 79, 89, 85, 75, 88, 79, 81, 86,
+  80, 86, 86, 73, 89, 90, 76, 91, 87, 80,
+  92, 89, 77, 61, 85, 76, 87, 77, 84, 87,
+  94, 75, 89, 88, 77, 82, 95, 89, 84, 83,
+  92, 82, 82, 86, 91, 87, 73, 88, 99, 83,
+  89, 96, 85, 79, 76, 87, 78, 85, 72, 81,
+  84, 69, 91, 72, 86, 78, 82, 82, 84, 85,
+  78, 85, 76, 77, 79, 77, 82, 107, 80, 79,
+  89, 80, 79, 90, 83, 88, 65, 77, 85, 87,
+  76, 84, 91, 79, 80, 152, 84, 78, 74, 77,
+  78, 80, 86, 77, 73, 82, 78, 76, 91, 86,
+  86, 94, 71, 83, 85, 83, 89, 91, 78, 76,
+  70, 83, 93, 88, 92, 111, 87, 76, 75, 80,
+  87, 83, 91, 82, 85, 86, 82, 87, 78, 82,
+  93, 77, 97, 85, 71, 82, 84, 96, 79, 103,
+  79, 64, 99, 81, 87, 76, 90, 78, 104, 77,
+  88, 93, 87, 85, 91, 88, 94, 75, 95, 80,
+  85, 93, 91, 85, 68, 97, 93, 79, 86, 89,
+  81, 86, 74, 80, 71, 86, 66, 76, 83, 74,
+  91, 70, 86, 74, 87, 79, 95, 92, 78, 83,
+  74, 73, 81, 78, 92, 84, 85, 69, 90, 85,
+  77, 89, 96, 84, 71, 84, 79, 93, 79, 89,
+  97, 69, 70, 136, 78, 76, 82, 85, 88, 85,
+  82, 86, 80, 76, 75, 75, 85, 85, 89, 77,
+  66, 86, 73, 85, 83, 97, 85, 74, 71, 84,
+  81, 84, 91, 120, 82, 79, 76, 83, 90, 82,
+  92, 80, 81, 84, 85, 90, 74, 89, 95, 74,
+  92, 86, 75, 78, 85, 90, 81, 98, 77, 63,
+  96, 78, 87, 83, 91, 76, 96, 79, 78, 87,
+  86, 82, 91, 85, 95, 67, 92, 82, 82, 84,
+  86, 89, 67, 95, 86, 79, 86, 93, 78, 78,
+  70, 88, 74, 96, 71, 76, 87, 79, 94, 75,
+  94, 75, 83, 87, 75, 85, 76, 83, 74, 74,
+  77, 75, 89, 79, 87, 80, 88, 88, 73, 92,
+  85, 87, 67, 84, 84, 91, 76, 86, 93, 68,
+  75, 130, 76, 75, 88, 92, 92, 81, 78, 87,
+  91, 75, 74, 72, 84, 86, 86, 83, 75, 95,
+  79, 90, 86, 98, 94, 76, 73, 85, 82, 81,
+  88, 111, 86, 85, 88, 82, 86, 81, 88, 81,
+  90, 81, 83, 95, 74, 91, 90, 74, 98, 85,
+  74, 87, 89, 92, 86, 98, 81, 64, 95, 78,
+  81, 88, 88, 76, 101, 75, 90, 90, 89, 88,
+  87, 89, 91, 78, 89, 83, 83, 90, 92, 82,
+  77, 92, 91, 83, 88, 85, 79, 69, 80, 84,
+  75, 83, 68, 74, 85, 78, 86, 72, 89, 76,
+  87, 83, 72, 87, 73, 82, 75, 75, 80, 75,
+  78, 87, 86, 72, 94, 88, 83, 102, 77, 86,
+  77, 85, 83, 84, 77, 90, 87, 70, 73, 128,
+  84, 73, 81, 75, 84, 85, 83, 83, 78, 83,
+  81, 79, 92, 82, 87, 88, 78, 89, 85, 82,
+  84, 98, 90, 76, 73, 84, 84, 84, 89, 113,
+  118, 82, 96, 92, 92, 70, 80, 94, 82, 89,
+  82, 91, 79, 102, 72, 75, 88, 72, 92, 83,
+  84, 86, 83, 86, 103, 75, 88, 81, 85, 81,
+  75, 96, 79, 74, 66, 74, 96, 78, 77, 74,
+  84, 78, 82, 73, 74, 91, 98, 68, 90, 80,
+  86, 82, 88, 73, 78, 93, 73, 78, 80, 82,
+  89, 63, 91, 77, 49, 87, 94, 93, 85, 107,
+  64, 77, 78, 89, 92, 80, 83, 91, 80, 72,
+  79, 92, 94, 88, 79, 88, 79, 103, 97, 71,
+  76, 83, 62, 83, 81, 74, 90, 76, 76, 80,
+  78, 82, 82, 95, 75, 115, 99, 81, 84, 93,
+  90, 67, 84, 70, 94, 118, 106, 79, 67, 62,
+  80, 81, 67, 87, 85, 97, 73, 84, 115, 91,
+  81, 93, 90, 74, 82, 97, 75, 88, 80, 90,
+  70, 101, 72, 72, 90, 77, 81, 91, 85, 67,
+  86, 88, 82, 82, 87, 76, 94, 85, 69, 89,
+  71, 76, 72, 74, 98, 76, 81, 63, 84, 70,
+  81, 73, 76, 83, 100, 63, 84, 82, 87, 77,
+  91, 66, 78, 102, 88, 78, 79, 89, 85, 70,
+  98, 85, 63, 82, 76, 100, 71, 114, 86, 76,
+  79, 89, 100, 77, 87, 74, 99, 62, 74, 90,
+  80, 89, 78, 86, 69, 96, 94, 71, 81, 90,
+  71, 89, 85, 75, 82, 80, 81, 71, 77, 100,
+  74, 98, 72, 114, 108, 78, 85, 96, 84, 69,
+  80, 77, 101, 107, 91, 82, 61, 64, 72, 97,
+  62, 88, 83, 98, 69, 73, 119, 90, 67, 93,
+  90, 79, 83, 93, 82, 86, 85, 92, 85, 92,
+  75, 75, 82, 71, 89, 84, 91, 80, 77, 85,
+  84, 82, 87, 81, 83, 77, 68, 90, 80, 78,
+  79, 78, 90, 82, 92, 79, 87, 72, 86, 77,
+  75, 86, 94, 87, 89, 78, 86, 82, 92, 76,
+  81, 97, 79, 80, 82, 80, 88, 78, 93, 80,
+  57, 86, 73, 95, 87, 91, 96, 69, 79, 82,
+  99, 73, 86, 72, 92, 72, 85, 92, 88, 92,
+  77, 79, 69, 98, 91, 77, 79, 92, 62, 83,
+  79, 75, 90, 77, 94, 83, 79, 110, 81, 96,
+  80, 110, 99, 80, 84, 90, 70, 65, 79, 85,
+  80, 101, 77, 78, 68, 69, 81, 84, 81, 85,
+  90, 92, 72, 86, 93, 87, 84, 80, 78, 104,
+  75, 81, 87, 81, 76, 90, 94, 84, 85, 80,
+  82, 82, 77, 71, 85, 82, 75, 78, 104, 90,
+  72, 75, 83, 96, 72, 86, 85, 89, 80, 93,
+  80, 73, 81, 106, 79, 77, 77, 83, 74, 87,
+  85, 84, 80, 92, 69, 77, 90, 66, 76, 79,
+  70, 70, 83, 94, 76, 79, 76, 73, 76, 95,
+  74, 102, 79, 90, 80, 86, 87, 64, 88, 87,
+  80, 93, 71, 95, 81, 85, 85, 87, 84, 77,
+  84, 98, 77, 88, 93, 75, 74, 83, 77, 92,
+  79, 86, 93, 81, 75, 77, 74, 85, 81, 107,
+  92, 87, 79, 96, 82, 77, 89, 74, 79, 94,
+  103, 85, 84, 66, 88, 82, 80, 87, 93, 92,
+  73, 64, 78, 106, 70, 74, 73, 98, 84, 79,
+  82, 87, 72, 92, 88, 74, 86, 95, 74, 97,
+  78, 79, 86, 65, 90, 83, 90, 108, 72, 73,
+  87, 81, 81, 82, 85, 84, 86, 79, 78, 72,
+  71, 96, 73, 73, 78, 91, 61, 86, 89, 77,
+  61, 103, 68, 73, 90, 55, 76, 82, 82, 79,
+  83, 119, 72, 84, 71, 83, 82, 87, 76, 110,
+  64, 92, 71, 85, 87, 75, 99, 103, 91, 82,
+  91, 93, 83, 87, 74, 78, 88, 78, 71, 88,
+  80, 100, 94, 78, 95, 93, 72, 114, 72, 78,
+  100, 70, 71, 88, 68, 83, 92, 83, 105, 90,
+  75, 101, 81, 84, 85, 74, 82, 76, 84, 94,
+  98, 73, 80, 105, 74, 88, 102, 89, 82, 61,
+  98, 93, 83, 84, 77, 82, 79, 82, 88, 82,
+  79, 95, 94, 83, 87, 83, 74, 81, 78, 80,
+  88, 88, 97, 79, 89, 91, 75, 76, 81, 73,
+  73, 87, 85, 80, 94, 89, 77, 70, 78, 104,
+  80, 74, 87, 87, 78, 79, 85, 97, 72, 92,
+  76, 78, 88, 69, 78, 78, 76, 71, 81, 91,
+  77, 89, 80, 74, 85, 92, 80, 100, 81, 89,
+  88, 82, 87, 62, 91, 84, 81, 83, 84, 96,
+  84, 83, 84, 91, 81, 79, 73, 93, 76, 86,
+  89, 78, 75, 86, 78, 93, 81, 88, 93, 85,
+  80, 93, 74, 85, 83, 98, 99, 88, 80, 90,
+  79, 75, 89, 88, 77, 82, 85, 89, 87, 69,
+  79, 83, 82, 85, 93, 86, 74, 72, 96, 83,
+  85, 86, 82, 84, 73, 81, 89, 84, 83, 87,
+  82, 80, 87, 81, 85, 86, 77, 77, 90, 84,
+  80, 70, 95, 88, 85, 81, 79, 80, 77, 83,
+  88, 90, 85, 95, 90, 83, 84, 97, 88, 96,
+  97, 83, 81, 84, 80, 88, 85, 86, 69, 84,
+  77, 83, 75, 81, 77, 82, 83, 86, 83, 80,
+  81, 83, 84, 93, 82, 92, 84, 91, 94, 86,
+  86, 70, 78, 83, 85, 78, 71, 106, 84, 81,
+  87, 88, 86, 83, 75, 92, 80, 80, 89, 85,
+  81, 80, 81, 93, 94, 90, 94, 88, 85, 91,
+  81, 84, 76, 91, 74, 89, 85, 73, 79, 89,
+  89, 77, 80, 83, 80, 83, 95, 80, 87, 83,
+  93, 80, 94, 89, 84, 75, 85, 88, 87, 73,
+  72, 94, 75, 76, 83, 87, 85, 82, 79, 84,
+  84, 98, 83, 97, 74, 82, 92, 73, 88, 76,
+  81, 88, 86, 77, 79, 68, 79, 80, 84, 96,
+  79, 81, 95, 92, 80, 91, 86, 97, 93, 90,
+  69, 91, 85, 79, 77, 95, 72, 90, 72, 74,
+  73, 87, 88, 86, 88, 101, 82, 81, 81, 85,
+  88, 90, 86, 91, 81, 96, 89, 84, 93, 83,
+  87, 93, 86, 75, 73, 110, 86, 77, 78, 82,
+  86, 87, 72, 87, 82, 85, 88, 97, 94, 80,
+  81, 105, 84, 87, 92, 81, 80, 87, 75, 82,
+  76, 87, 76, 91, 79, 74, 86, 89, 81, 75,
+  90, 77, 85, 94, 101, 83, 78, 93, 85, 81,
+  94, 85, 86, 75, 91, 81, 87, 83, 84, 75,
+  74, 79, 90, 86, 87, 88, 85, 88, 87, 83,
+  84, 82, 77, 80, 95, 84, 81, 71, 89, 85,
+  83, 82, 76, 72, 74, 82, 87, 85, 87, 92,
+  92, 85, 86, 96, 87, 93, 91, 82, 79, 82,
+  80, 87, 81, 87, 75, 87, 75, 87, 73, 74,
+  74, 81, 85, 90, 85, 83, 84, 80, 87, 95,
+  93, 94, 91, 93, 83, 86, 91, 66, 82, 86,
+  84, 79, 71, 111, 83, 76, 87, 90, 84, 84,
+  78, 92, 77, 80, 89, 79, 82, 85, 83, 95,
+  94, 89, 88, 89, 85, 81, 79, 84, 74, 91,
+  76, 89, 86, 71, 85, 85, 89, 80, 81, 87,
+  93, 89, 97, 79, 75, 88, 97, 78, 93, 87,
+  82, 75, 88, 71, 68, 90, 86, 62, 84, 80,
+  73, 95, 79, 57, 84, 71, 77, 79, 66, 89,
+  95, 78, 96, 102, 104, 108, 106, 94, 83, 89,
+  90, 85, 88, 74, 92, 64, 46, 64, 65, 73,
+  105, 69, 74, 92, 61, 69, 87, 94, 91, 55,
+  92, 92, 79, 68, 86, 80, 104, 57, 78, 75,
+  81, 74, 118, 81, 75, 87, 44, 87, 167, 92,
+  90, 133, 15, 90, 85, 91, 86, 83, 96, 129,
+  53, 79, 77, 85, 89, 71, 78, 97, 78, 123,
+  57, 80, 85, 68, 95, 76, 83, 71, 87, 77,
+  94, 88, 60, 69, 86, 90, 93, 97, 90, 90,
+  95, 98, 85, 92, 87, 71, 65, 143, 119, 86,
+  104, 89, 96, 97, 88, 82, 102, 82, 83, 114,
+  80, 87, 86, 89, 86, 58, 80, 93, 84, 86,
+  84, 69, 73, 58, 78, 93, 81, 77, 78, 88,
+  79, 81, 78, 77, 87, 81, 83, 83, 101, 97,
+  84, 77, 74, 69, 55, 73, 103, 88, 103, 68,
+  98, 72, 79, 77, 80, 77, 83, 56, 80, 71,
+  90, 80, 90, 84, 84, 99, 79, 96, 81, 79,
+  87, 75, 109, 107, 79, 84, 83, 79, 82, 104,
+  72, 78, 98, 92, 78, 69, 83, 58, 104, 60,
+  83, 95, 79, 78, 81, 98, 63, 80, 78, 79,
+  87, 91, 86, 76, 90, 74, 85, 80, 91, 74,
+  85, 78, 82, 90, 80, 89, 79, 92, 91, 81,
+  90, 84, 80, 76, 97, 81, 57, 78, 84, 89,
+  82, 84, 86, 81, 94, 83, 75, 77, 83, 85,
+  108, 88, 83, 82, 79, 103, 89, 84, 75, 73,
+  81, 80, 73, 97, 87, 90, 85, 87, 84, 83,
+  87, 77, 78, 84, 89, 81, 90, 91, 79, 86,
+  74, 79, 62, 95, 77, 95, 81, 82, 94, 69,
+  73, 89, 85, 82, 82, 69, 75, 80, 90, 99,
+  91, 93, 75, 85, 81, 93, 82, 79, 80, 81,
+  104, 93, 100, 68, 70, 84, 75, 83, 84, 82,
+  88, 82, 78, 83, 88, 78, 92, 75, 94, 81,
+  80, 93, 84, 89, 82, 74, 92, 80, 80, 82,
+  84, 86, 79, 78, 84, 81, 84, 78, 87, 72,
+  83, 86, 81, 80, 89, 83, 79, 85, 87, 74,
+  80, 90, 88, 80, 84, 81, 78, 82, 93, 84,
+  83, 90, 89, 83, 79, 81, 90, 76, 91, 90,
+  73, 101, 77, 82, 72, 93, 81, 67, 102, 79,
+  70, 77, 75, 81, 86, 83, 86, 102, 109, 92,
+  99, 87, 71, 89, 102, 94, 78, 83, 84, 80,
+  81, 112, 82, 83, 97, 85, 86, 105, 81, 72,
+  92, 97, 81, 98, 84, 77, 84, 85, 80, 78,
+  77, 74, 72, 54, 83, 79, 93, 80, 76, 65,
+  66, 80, 104, 68, 93, 81, 92, 105, 79, 82,
+  88, 74, 81, 131, 46, 105, 78, 78, 91, 98,
+  74, 94, 88, 101, 61, 72, 96, 63, 84, 70,
+  85, 77, 79, 75, 87, 89, 73, 48, 78, 87,
+  78, 79, 87, 82, 71, 74, 84, 80, 74, 86,
+  63, 110, 103, 81, 93, 72, 91, 85, 90, 79,
+  103, 75, 80, 89, 97, 74, 46, 79, 78, 78,
+  90, 71, 75, 95, 83, 70, 88, 47, 75, 78,
+  74, 70, 77, 75, 81, 75, 79, 92, 95, 82,
+  87, 92, 84, 85, 85, 70, 82, 74, 78, 85,
+  92, 73, 123, 71, 80, 94, 88, 73, 85, 99,
+  75, 67, 82, 68, 83, 74, 99, 79, 86, 129,
+  68, 70, 79, 81, 100, 82, 89, 101, 71, 87,
+  101, 72, 93, 94, 106, 99, 80, 91, 77, 78,
+  76, 112, 96, 71, 83, 91, 84, 66, 77, 88,
+  75, 99, 72, 84, 84, 78, 87, 74, 92, 82,
+  77, 81, 107, 89, 82, 78, 87, 90, 96, 90,
+  85, 86, 94, 78, 70, 95, 79, 72, 72, 119,
+  76, 86, 88, 96, 95, 89, 90, 79, 92, 87,
+  90, 88, 83, 74, 79, 85, 82, 69, 79, 89,
+  76, 81, 83, 73, 66, 69, 78, 95, 77, 76,
+  77, 82, 70, 73, 81, 79, 78, 75, 96, 82,
+  84, 97, 89, 78, 77, 77, 76, 77, 80, 90,
+  85, 68, 97, 77, 82, 85, 87, 75, 81, 60,
+  78, 77, 91, 89, 93, 86, 79, 113, 80, 90,
+  87, 83, 86, 86, 103, 100, 89, 70, 75, 83,
+  91, 88, 96, 87, 82, 87, 82, 83, 80, 77,
+  110, 58, 88, 93, 77, 86, 82, 93, 73, 73,
+  91, 85, 79, 97, 81, 75, 83, 75, 82, 85,
+  94, 79, 94, 66, 87, 87, 88, 85, 78, 89,
+  90, 79, 80, 91, 80, 82, 82, 87, 69, 85,
+  73, 91, 84, 86, 84, 86, 79, 92, 81, 88,
+  75, 88, 108, 94, 75, 80, 76, 88, 78, 83,
+  82, 91, 88, 83, 61, 79, 75, 78, 84, 97,
+  83, 96, 87, 76, 88, 84, 78, 81, 97, 88,
+  74, 89, 80, 76, 78, 95, 83, 87, 67, 91,
+  91, 90, 84, 92, 82, 90, 87, 100, 83, 77,
+  92, 96, 79, 82, 69, 79, 87, 62, 86, 80,
+  80, 85, 91, 70, 92, 72, 80, 73, 82, 83,
+  101, 82, 82, 83, 89, 78, 75, 65, 67, 90,
+  84, 87, 72, 95, 75, 88, 83, 78, 79, 86,
+  99, 77, 84, 69, 77, 78, 82, 68, 77, 83,
+  85, 75, 76, 85, 79, 85, 84, 86, 75, 70,
+  92, 68, 78, 81, 79, 75, 72, 72, 88, 84,
+  83, 91, 90, 87, 97, 87, 72, 75, 87, 74,
+  78, 81, 78, 97, 83, 70, 77, 84, 81, 91,
+  99, 77, 80, 74, 79, 82, 81, 84, 90, 81,
+  87, 79, 83, 81, 82, 89, 84, 99, 77, 84,
+  88, 82, 74, 110, 79, 80, 85, 89, 79, 98,
+  97, 89, 79, 94, 75, 100, 88, 87, 76, 85,
+  88, 78, 75, 83, 73, 56, 83, 83, 84, 89,
+  80, 84, 97, 76, 84, 84, 87, 70, 129, 95,
+  85, 88, 77, 75, 75, 84, 72, 78, 87, 84,
+  88, 87, 79, 82, 88, 81, 71, 84, 90, 81,
+  87, 88, 84, 87, 81, 80, 92, 80, 84, 82,
+  85, 87, 74, 74, 83, 81, 69, 80, 77, 78,
+  74, 87, 77, 80, 78, 83, 90, 87, 87, 98,
+  84, 81, 92, 84, 87, 75, 84, 71, 71, 86,
+  86, 87, 82, 78, 76, 75, 83, 82, 89, 91,
+  85, 78, 73, 86, 79, 83, 86, 69, 79, 78,
+  82, 86, 91, 83, 85, 102, 91, 79, 90, 87,
+  84, 86, 82, 91, 83, 75, 79, 86, 90, 93,
+  75, 73, 82, 83, 89, 82, 78, 87, 87, 84,
+  81, 101, 77, 71, 91, 92, 88, 89, 83, 94,
+  90, 67, 79, 93, 84, 76, 94, 81, 84, 84,
+  81, 82, 72, 77, 94, 67, 85, 75, 85, 85,
+  85, 79, 86, 71, 78, 86, 83, 88, 83, 98,
+  77, 90, 83, 80, 95, 71, 85, 75, 88, 86,
+  83, 82, 82, 83, 82, 76, 75, 86, 82, 94,
+  80, 78, 79, 94, 76, 89, 84, 91, 83, 84,
+  83, 89, 86, 78, 93, 71, 93, 68, 69, 81,
+  82, 81, 73, 71, 81, 100, 89, 65, 84, 74,
+  82, 77, 56, 82, 83, 81, 77, 71, 80, 86,
+  72, 79, 103, 86, 95, 84, 85, 97, 87, 102,
+  80, 83, 78, 86, 80, 90, 89, 78, 101, 63,
+  80, 82, 106, 80, 72, 65, 75, 86, 68, 75,
+  86, 91, 69, 94, 87, 77, 87, 92, 84, 84,
+  76, 103, 96, 90, 96, 101, 74, 80, 91, 76,
+  76, 96, 86, 83, 79, 76, 68, 101, 110, 86,
+  86, 82, 72, 83, 75, 83, 90, 82, 80, 86,
+  87, 93, 93, 66, 82, 86, 79, 83, 98, 83,
+  85, 85, 71, 81, 94, 90, 66, 94, 88, 82,
+  78, 84, 85, 74, 87, 88, 75, 79, 60, 82,
+  77, 56, 81, 68, 79, 82, 80, 96, 76, 76,
+  83, 80, 86, 94, 77, 87, 72, 75, 79, 88,
+  78, 81, 88, 90, 67, 77, 70, 74, 84, 77,
+  90, 84, 88, 87, 101, 80, 77, 82, 75, 85,
+  66, 83, 80, 90, 72, 88, 91, 80, 77, 88,
+  89, 75, 84, 85, 71, 89, 82, 67, 89, 74,
+  71, 93, 86, 79, 77, 80, 68, 94, 71, 98,
+  100, 79, 67, 80, 83, 72, 88, 87, 85, 102,
+  84, 79, 80, 80, 70, 69, 86, 74, 89, 76,
+  65, 76, 91, 106, 75, 79, 88, 88, 88, 79,
+  92, 82, 71, 85, 88, 79, 89, 84, 88, 87,
+  76, 79, 84, 85, 75, 88, 97, 82, 89, 83,
+  88, 81, 100, 86, 85, 84, 65, 80, 84, 73,
+  85, 77, 83, 92, 93, 98, 82, 83, 88, 88,
+  91, 83, 89, 93, 75, 90, 80, 92, 100, 87,
+  72, 89, 74, 90, 78, 78, 91, 77, 76, 85,
+  78, 94, 99, 87, 69, 77, 96, 94, 87, 80,
+  89, 85, 78, 93, 91, 84, 79, 92, 70, 79,
+  79, 119, 86, 93, 109, 87, 80, 85, 97, 83,
+  82, 81, 84, 65, 78, 96, 76, 81, 78, 85,
+  71, 66, 101, 81, 81, 93, 90, 86, 85, 92,
+  101, 86, 91, 74, 67, 86, 80, 66, 110, 67,
+  79, 105, 80, 89, 87, 78, 75, 80, 77, 105,
+  64, 69, 91, 66, 86, 86, 87, 89, 94, 91,
+  70, 80, 88, 94, 99, 95, 93, 81, 91, 100,
+  111, 87, 102, 100, 98, 86, 98, 111, 94, 78,
+  84, 61, 71, 79, 95, 82, 67, 73, 78, 98,
+  92, 72, 91, 73, 91, 73, 49, 85, 94, 69,
+  74, 71, 78, 93, 63, 75, 118, 83, 105, 86,
+  77, 108, 88, 83, 72, 82, 74, 89, 97, 91,
+  94, 80, 92, 65, 75, 83, 105, 77, 75, 63,
+  72, 83, 65, 81, 80, 91, 78, 88, 96, 79,
+  84, 85, 70, 81, 79, 87, 83, 71, 88, 95,
+  68, 78, 86, 77, 75, 89, 80, 94, 77, 76,
+  65, 95, 100, 89, 87, 90, 76, 79, 69, 70,
+  99, 78, 67, 106, 84, 97, 91, 65, 72, 96,
+  83, 90, 91, 80, 85, 86, 73, 81, 92, 82,
+  65, 95, 83, 90, 74, 100, 88, 89, 88, 83,
+  79, 70, 59, 81, 75, 53, 75, 72, 68, 86,
+  86, 88, 82, 76, 76, 78, 81, 91, 78, 77,
+  81, 72, 90, 85, 75, 93, 108, 72, 71, 81,
+  72, 76, 73, 76, 101, 82, 82, 79, 94, 77,
+  75, 74, 69, 83, 86, 78, 88, 88, 71, 93,
+  86, 85, 72, 98, 93, 75, 81, 72, 66, 86,
+  70, 83, 82, 65, 72, 90, 88, 76, 80, 68,
+  53, 79, 71, 103, 93, 77, 83, 73, 72, 72,
+  97, 79, 83, 97, 77, 85, 77, 79, 68, 69,
+  92, 81, 92, 89, 59, 74, 82, 89, 73, 81,
+  88, 100, 84, 79, 88, 75, 74, 86, 86, 87,
+  84, 86, 85, 84, 75, 74, 73, 88, 75, 92,
+  72, 88, 81, 88, 82, 81, 101, 79, 79, 78,
+  66, 80, 78, 65, 78, 71, 71, 104, 98, 94,
+  66, 87, 100, 89, 98, 85, 92, 84, 77, 89,
+  83, 94, 114, 85, 80, 86, 74, 96, 77, 66,
+  106, 91, 79, 87, 61, 86, 108, 77, 79, 69,
+  84, 93, 83, 73, 79, 90, 71, 87, 81, 92,
+  85, 97, 65, 88, 77, 106, 88, 102, 111, 96,
+  87, 70, 101, 76, 74, 83, 90, 63, 69, 90,
+  69, 78, 84, 85, 71, 58, 119, 86, 82, 91,
+  89, 84, 83, 87, 96, 82, 104, 75, 69, 80,
+  83, 66, 106, 71, 81, 113, 80, 86, 105, 69,
+  85, 75, 81, 102, 75, 68, 93, 73, 77, 98,
+  85, 85, 100, 96, 66, 77, 96, 94, 81, 86,
+  89, 79, 79, 89, 119, 83, 102, 105, 91, 78,
+  93, 111, 88, 80, 86, 68, 79, 81, 91, 80,
+  76, 89, 83, 86, 96, 77, 86, 70, 81, 76,
+  69, 89, 83, 86, 70, 88, 74, 75, 86, 87,
+  87, 76, 90, 87, 89, 99, 81, 87, 83, 90,
+  63, 91, 90, 85, 84, 83, 88, 81, 80, 82,
+  90, 88, 78, 87, 73, 87, 83, 79, 84, 93,
+  87, 92, 93, 91, 78, 82, 93, 86, 81, 79,
+  96, 77, 91, 80, 82, 72, 81, 88, 90, 90,
+  78, 88, 78, 84, 77, 95, 78, 82, 86, 88,
+  91, 74, 84, 71, 97, 81, 86, 86, 89, 93,
+  84, 81, 72, 89, 94, 85, 84, 88, 90, 91,
+  93, 81, 83, 91, 72, 92, 83, 77, 98, 93,
+  90, 100, 104, 83, 85, 73, 73, 84, 86, 79,
+  85, 76, 60, 83, 86, 86, 86, 81, 85, 85,
+  83, 79, 84, 82, 80, 72, 80, 80, 73, 83,
+  92, 78, 67, 90, 70, 75, 84, 85, 84, 80,
+  86, 87, 90, 88, 73, 78, 82, 87, 87, 83,
+  97, 82, 80, 83, 84, 88, 78, 83, 97, 84,
+  79, 78, 70, 87, 79, 86, 86, 85, 77, 90,
+  88, 87, 83, 84, 69, 87, 72, 85, 99, 81,
+  94, 76, 72, 73, 83, 87, 87, 86, 91, 81,
+  84, 86, 68, 71, 90, 85, 84, 89, 79, 72,
+  92, 86, 82, 81, 93, 91, 83, 83, 86, 78,
+  81, 86, 90, 80, 84, 83, 81, 85, 86, 79,
+  75, 87, 69, 88, 84, 81, 96, 84, 87, 91,
+  98, 77, 90, 77, 74, 87, 82, 76, 90, 74,
+  66, 95, 92, 100, 74, 83, 93, 83, 90, 77,
+  94, 95, 71, 86, 82, 95, 88, 88, 80, 82,
+  69, 97, 83, 77, 93, 87, 77, 84, 80, 87,
+  95, 86, 82, 75, 92, 89, 87, 77, 86, 86,
+  86, 83, 86, 88, 89, 86, 80, 80, 71, 96,
+  88, 95, 109, 99, 88, 84, 87, 84, 68, 78,
+  89, 77, 77, 89, 67, 86, 83, 97, 87, 69,
+  90, 85, 87, 79, 83, 88, 90, 81, 93, 88,
+  83, 73, 91, 89, 82, 64, 97, 74, 81, 109,
+  84, 81, 106, 75, 78, 76, 87, 86, 76, 82,
+  88, 71, 85, 90, 74, 87, 95, 89, 77, 85,
+  84, 93, 96, 94, 85, 80, 84, 80, 98, 83,
+  93, 91, 85, 90, 91, 91, 85, 75, 86, 77,
+  82, 91, 91, 83, 86, 83, 84, 68, 74, 78,
+  72, 91, 82, 85, 89, 85, 81, 82, 90, 89,
+  80, 74, 78, 91, 93, 88, 84, 74, 89, 87,
+  68, 99, 85, 87, 83, 75, 85, 68, 90, 74,
+  81, 76, 96, 93, 84, 84, 101, 83, 73, 81,
+  78, 74, 89, 110, 86, 96, 79, 87, 67, 85,
+  96, 66, 84, 80, 84, 65, 87, 85, 92, 91,
+  81, 93, 80, 86, 84, 55, 93, 81, 78, 74,
+  75, 86, 86, 83, 99, 71, 95, 81, 77, 70,
+  83, 86, 87, 88, 84, 80, 78, 81, 80, 74,
+  89, 88, 110, 82, 83, 83, 93, 69, 75, 74,
+  72, 97, 92, 84, 74, 97, 89, 84, 80, 77,
+  85, 83, 75, 99, 80, 82, 77, 76, 83, 80,
+  96, 79, 92, 83, 93, 67, 71, 73, 79, 96,
+  83, 86, 92, 82, 82, 76, 79, 92, 76, 74,
+  74, 89, 81, 77, 83, 79, 89, 86, 73, 84,
+  86, 83, 80, 60, 85, 69, 85, 76, 89, 71,
+  103, 79, 91, 76, 104, 83, 68, 80, 77, 87,
+  105, 104, 90, 92, 73, 85, 63, 81, 83, 65,
+  86, 77, 81, 61, 76, 76, 95, 92, 84, 90,
+  79, 71, 86, 56, 98, 83, 82, 85, 71, 89,
+  77, 73, 99, 75, 90, 77, 78, 77, 77, 86,
+  94, 88, 84, 83, 80, 73, 76, 76, 85, 87,
+  112, 84, 88, 83, 97, 65, 76, 75, 77, 91,
+  72, 78, 70, 104, 74, 81, 62, 84, 81, 79,
+  67, 107, 81, 84, 82, 79, 84, 98, 91, 73,
+  90, 88, 76, 74, 79, 80, 72, 94, 83, 88,
+  84, 86, 86, 85, 89, 90, 83, 76, 80, 88,
+  86, 69, 80, 82, 89, 96, 86, 93, 86, 87,
+  88, 77, 83, 70, 86, 79, 80, 75, 93, 83,
+  82, 84, 90, 89, 77, 82, 82, 84, 88, 109,
+  92, 89, 77, 89, 70, 84, 99, 69, 90, 82,
+  80, 76, 82, 84, 87, 87, 82, 88, 83, 85,
+  94, 60, 91, 79, 83, 100, 82, 84, 81, 88,
+  96, 79, 97, 79, 74, 74, 77, 88, 86, 87,
+  83, 82, 88, 77, 83, 75, 90, 86, 105, 86,
+  85, 81, 97, 71, 81, 89, 77, 95, 80, 86,
+  77, 101, 71, 90, 80, 79, 81, 79, 77, 92,
+  80, 77, 84, 84, 82, 96, 88, 84, 81, 81,
+  89, 58, 69, 77, 64, 99, 81, 84, 89, 81,
+  67, 84, 87, 93, 78, 72, 89, 85, 95, 92,
+  86, 79, 83, 86, 81, 98, 86, 91, 82, 79,
+  87, 68, 86, 76, 75, 83, 99, 92, 86, 74,
+  105, 80, 79, 77, 77, 79, 88, 119, 80, 99,
+  81, 86, 64, 83, 88, 65, 83, 79, 87, 68,
+  93, 76, 106, 85, 84, 93, 77, 91, 90, 56,
+  102, 88, 86, 72, 74, 82, 85, 68, 111, 75,
+  105, 84, 67, 66, 87, 74, 85, 85, 89, 83,
+  70, 88, 83, 79, 90, 89, 108, 82, 87, 82,
+  88, 69, 85, 78, 77, 88, 99, 75, 77, 85,
+  93, 81, 92, 77, 86, 84, 80, 100, 75, 86,
+  74, 81, 82, 81, 106, 84, 80, 80, 98, 49,
+  64, 77, 75, 105, 79, 92, 95, 79, 71, 77,
+  80, 100, 74, 75, 92, 83, 98, 85, 87, 81,
+  92, 80, 85, 81, 84, 92, 79, 65, 85, 69,
+  77, 75, 86, 79, 107, 79, 96, 64, 122, 73,
+  72, 75, 70, 87, 103, 118, 78, 100, 76, 81,
+  58, 77, 78, 60, 88, 78, 83, 66, 85, 65,
+  110, 84, 87, 93, 82, 65, 90, 55, 105, 96,
+  91, 84, 72, 88, 78, 53, 125, 83, 108, 76,
+  70, 69, 83, 75, 93, 85, 84, 77, 65, 74,
+  79, 82, 86, 86, 115, 81, 106, 85, 101, 64,
+  85, 79, 78, 86, 77, 68, 72, 93, 83, 80,
+  71, 83, 78, 82, 73, 116, 74, 87, 81, 82,
+  83, 96, 83, 73, 82, 88, 81, 63, 74, 88,
+  68, 102, 81, 85, 86, 86, 80, 85, 89, 95,
+  82, 73, 88, 82, 83, 78, 85, 87, 83, 90,
+  91, 91, 86, 93, 88, 76, 87, 71, 74, 78,
+  76, 77, 96, 87, 88, 72, 98, 83, 79, 78,
+  74, 82, 85, 115, 85, 90, 80, 85, 68, 83,
+  87, 66, 95, 84, 84, 78, 89, 73, 99, 81,
+  89, 88, 83, 78, 97, 59, 98, 91, 86, 100,
+  82, 84, 80, 75, 107, 82, 101, 77, 65, 70,
+  76, 76, 84, 82, 83, 81, 77, 73, 83, 81,
+  91, 86, 108, 87, 89, 79, 91, 67, 89, 89,
+  86, 94, 82, 77, 79, 91, 74, 85, 90, 79,
+  81, 82, 83, 94, 87, 80, 80, 82, 84, 95,
+  89, 90, 79, 80, 94, 76, 74, 81, 63, 95,
+  86, 88, 83, 82, 68, 84, 89, 85, 78, 69,
+  78, 76, 80, 96, 80, 78, 78, 83, 93, 95,
+  93, 84, 86, 85, 85, 69, 84, 80, 67, 85,
+  84, 100, 79, 75, 94, 81, 81, 73, 80, 81,
+  79, 109, 86, 90, 85, 87, 68, 83, 86, 80,
+  84, 81, 86, 78, 87, 81, 95, 86, 100, 85,
+  81, 90, 87, 62, 95, 87, 83, 74, 84, 81,
+  88, 82, 98, 81, 95, 87, 68, 69, 84, 73,
+  85, 84, 85, 71, 79, 93, 86, 83, 89, 78,
+  102, 80, 81, 78, 81, 80, 91, 85, 70, 86,
+  97, 77, 82, 78, 85, 86, 88, 74, 82, 92,
+  83, 93, 83, 82, 68, 83, 86, 84, 99, 94,
+  71, 79, 105, 70, 66, 77, 75, 97, 79, 93,
+  92, 84, 70, 81, 81, 91, 80, 76, 82, 74,
+  75, 90, 80, 83, 83, 76, 91, 85, 84, 86,
+  82, 77, 83, 71, 73, 81, 73, 79, 91, 83,
+  84, 72, 109, 76, 72, 72, 74, 82, 87, 103,
+  87, 89, 82, 85, 64, 75, 79, 73, 96, 80,
+  83, 73, 87, 75, 97, 84, 102, 88, 80, 74,
+  78, 66, 96, 89, 85, 78, 84, 82, 83, 70,
+  104, 85, 100, 75, 69, 71, 80, 68, 92, 81,
+  73, 68, 64, 83, 82, 83, 83, 77, 111, 81,
+  94, 82, 89, 77, 95, 82, 66, 89, 84, 69,
+  77, 81, 80, 83, 85, 80, 78, 87, 76, 105,
+  84, 74, 82, 84, 86, 96, 85, 88, 80, 84,
+  88, 83, 76, 85, 67, 98, 85, 91, 87, 88,
+  82, 87, 89, 87, 90, 70, 79, 76, 77, 86,
+  82, 86, 77, 84, 96, 93, 91, 84, 88, 82,
+  86, 72, 72, 80, 72, 84, 86, 82, 82, 74,
+  91, 81, 80, 72, 76, 85, 80, 109, 89, 82,
+  85, 86, 72, 88, 83, 82, 98, 83, 84, 91,
+  91, 80, 92, 84, 101, 84, 83, 92, 87, 65,
+  92, 90, 88, 90, 88, 81, 85, 86, 95, 86,
+  96, 78, 67, 71, 81, 73, 87, 82, 73, 75,
+  82, 70, 87, 84, 91, 78, 103, 85, 83, 76,
+  81, 76, 94, 90, 79, 93, 83, 78, 82, 81,
+  78, 88, 83, 75, 78, 92, 82, 88, 83, 87,
+  116, 94, 88, 81, 94, 83, 87, 87, 65, 87,
+  81, 104, 76, 73, 78, 51, 93, 84, 80, 97,
+  73, 77, 90, 82, 91, 81, 96, 84, 106, 103,
+  79, 75, 71, 91, 97, 92, 77, 81, 82, 57,
+  85, 99, 63, 98, 77, 68, 74, 84, 91, 93,
+  81, 77, 80, 87, 74, 82, 101, 80, 82, 79,
+  78, 73, 88, 65, 75, 81, 88, 73, 74, 65,
+  86, 83, 75, 76, 89, 84, 89, 70, 93, 82,
+  80, 80, 74, 95, 88, 81, 95, 84, 78, 75,
+  92, 87, 84, 81, 79, 79, 79, 79, 81, 77,
+  91, 76, 82, 104, 93, 97, 85, 79, 81, 80,
+  74, 77, 91, 111, 104, 75, 86, 122, 88, 84,
+  92, 72, 93, 86, 67, 72, 73, 94, 92, 88,
+  82, 84, 99, 85, 81, 94, 67, 86, 75, 93,
+  76, 74, 74, 45, 78, 81, 96, 79, 80, 81,
+  82, 81, 85, 81, 95, 79, 106, 99, 77, 80,
+  75, 88, 90, 84, 89, 78, 88, 46, 94, 89,
+  64, 102, 73, 77, 71, 90, 93, 88, 80, 75,
+  87, 99, 84, 83, 119, 74, 77, 81, 75, 72,
+  87, 68, 65, 75, 79, 68, 104, 55, 88, 89,
+  72, 89, 83, 80, 102, 77, 96, 85, 80, 78,
+  62, 91, 91, 80, 91, 95, 73, 78, 95, 79,
+  92, 81, 74, 77, 86, 83, 74, 73, 84, 76,
+  95, 106, 101, 89, 72, 79, 73, 85, 76, 87,
+  92, 114, 94, 78, 88, 140, 82, 77, 95, 72,
+  93, 92, 63, 67, 91, 93, 71, 92, 87, 75,
+  97, 92, 83, 89, 69, 81, 95, 81, 81, 72,
+  76, 59, 95, 80, 93, 80, 90, 83, 88, 83,
+  90, 84, 91, 76, 96, 103, 82, 96, 76, 88,
+  98, 92, 99, 81, 83, 58, 80, 97, 68, 92,
+  76, 87, 73, 87, 93, 83, 82, 77, 83, 90,
+  73, 88, 104, 79, 84, 78, 85, 76, 84, 70,
+  73, 85, 83, 71, 107, 66, 89, 83, 75, 75,
+  83, 82, 98, 70, 94, 79, 78, 83, 74, 86,
+  83, 84, 86, 94, 80, 73, 88, 89, 90, 79,
+  80, 84, 85, 73, 79, 85, 93, 76, 87, 102,
+  99, 92, 87, 80, 68, 83, 74, 92, 92, 103,
+  86, 75, 88, 114, 73, 81, 99, 76, 94, 78,
+  70, 77, 71, 85, 88, 79, 89, 90, 106, 84,
+  75, 89, 86, 91, 80, 85, 84, 72, 77, 77,
+  85, 88, 94, 85, 72, 67, 84, 95, 82, 85,
+  84, 76, 97, 74, 84, 77, 78, 92, 77, 81,
+  75, 76, 81, 66, 81, 90, 81, 92, 73, 75,
+  93, 78, 81, 89, 75, 86, 79, 71, 83, 70,
+  93, 91, 79, 87, 69, 76, 86, 81, 79, 94,
+  85, 70, 73, 71, 96, 84, 89, 75, 75, 87,
+  81, 71, 87, 83, 75, 79, 81, 84, 90, 70,
+  81, 74, 99, 80, 95, 97, 73, 88, 89, 87,
+  84, 84, 76, 78, 80, 82, 84, 76, 95, 93,
+  102, 69, 82, 87, 90, 87, 88, 102, 111, 76,
+  94, 95, 85, 76, 78, 79, 78, 93, 73, 76,
+  66, 94, 75, 71, 90, 79, 112, 81, 73, 88,
+  92, 94, 81, 75, 79, 75, 79, 89, 86, 87,
+  102, 57, 73, 65, 83, 98, 70, 87, 83, 79,
+  104, 80, 83, 81, 77, 84, 66, 74, 74, 70,
+  76, 61, 100, 92, 87, 110, 76, 81, 95, 76,
+  80, 77, 64, 83, 84, 79, 88, 70, 81, 103,
+  75, 87, 69, 78, 68, 69, 76, 102, 77, 66,
+  84, 75, 93, 88, 93, 76, 70, 77, 83, 81,
+  86, 86, 82, 80, 81, 82, 89, 69, 72, 89,
+  96, 80, 83, 108, 76, 93, 87, 84, 79, 84,
+  70, 82, 71, 85, 101, 65, 103, 90, 105, 68,
+  88, 95, 90, 83, 83, 96, 99, 84, 104, 86,
+  74, 81, 81, 79, 71, 97, 74, 78, 78, 83,
+  75, 78, 85, 76, 104, 85, 81, 90, 87, 90,
+  80, 76, 84, 71, 76, 79, 88, 84, 85, 79,
+  85, 72, 86, 94, 77, 90, 81, 85, 86, 80,
+  84, 87, 79, 84, 73, 81, 80, 74, 84, 64,
+  89, 88, 82, 94, 80, 92, 92, 76, 87, 85,
+  73, 84, 80, 91, 86, 79, 97, 90, 76, 86,
+  76, 79, 89, 86, 77, 95, 81, 72, 97, 72,
+  95, 83, 88, 77, 72, 83, 89, 72, 87, 84,
+  75, 85, 79, 81, 87, 76, 81, 83, 101, 78,
+  93, 95, 81, 82, 89, 88, 78, 80, 79, 83,
+  79, 83, 87, 79, 101, 89, 98, 76, 80, 81,
+  86, 90, 86, 93, 89, 78, 93, 93, 69, 76,
+  84, 84, 79, 86, 76, 78, 85, 86, 87, 78,
+  88, 98, 94, 82, 75, 89, 82, 89, 80, 70,
+  85, 67, 64, 84, 93, 83, 82, 82, 77, 67,
+  86, 99, 85, 86, 86, 84, 77, 76, 88, 84,
+  79, 92, 86, 76, 83, 79, 74, 84, 75, 87,
+  97, 90, 90, 88, 97, 74, 74, 87, 71, 78,
+  81, 84, 76, 79, 70, 81, 89, 86, 85, 83,
+  91, 96, 86, 88, 83, 84, 91, 89, 94, 84,
+  97, 73, 66, 80, 84, 82, 78, 90, 80, 82,
+  92, 78, 83, 81, 78, 78, 82, 80, 83, 97,
+  73, 89, 95, 89, 81, 81, 85, 91, 82, 85,
+  81, 83, 96, 85, 100, 80, 91, 90, 90, 91,
+  77, 89, 99, 78, 90, 82, 84, 80, 60, 86,
+  76, 88, 84, 85, 81, 91, 90, 71, 91, 91,
+  91, 80, 71, 87, 89, 91, 92, 74, 86, 72,
+  73, 91, 93, 81, 82, 66, 80, 71, 84, 98,
+  80, 86, 78, 83, 75, 70, 99, 94, 86, 84,
+  79, 74, 74, 79, 74, 80, 79, 91, 106, 91,
+  90, 93, 97, 73, 74, 83, 64, 79, 78, 78,
+  77, 78, 58, 96, 90, 78, 80, 82, 81, 90,
+  86, 90, 81, 89, 87, 95, 84, 81, 97, 73,
+  62, 87, 74, 93, 77, 96, 84, 84, 98, 81,
+  86, 84, 74, 81, 83, 80, 73, 103, 74, 86,
+  97, 88, 84, 90, 86, 95, 76, 85, 78, 78,
+  110, 85, 103, 82, 100, 91, 83, 83, 80, 84,
+  99, 88, 94, 67, 75, 83, 67, 84, 77, 85,
+  80, 91, 88, 76, 86, 78, 87, 79, 96, 84,
+  76, 90, 82, 87, 79, 85, 87, 65, 67, 80,
+  91, 77, 78, 87, 91, 71, 79, 95, 81, 87,
+  76, 79, 79, 75, 84, 91, 87, 88, 81, 79,
+  71, 78, 79, 83, 82, 88, 96, 88, 93, 89,
+  97, 72, 78, 90, 72, 74, 82, 78, 77, 82,
+  76, 79, 89, 88, 85, 84, 94, 96, 81, 89,
+  83, 84, 90, 85, 93, 83, 92, 73, 70, 91,
+  82, 82, 78, 88, 76, 87, 90, 73, 91, 83,
+  79, 85, 81, 81, 81, 95, 80, 82, 96, 89,
+  88, 79, 83, 88, 82, 85, 80, 85, 97, 82,
+  97, 79, 94, 91, 86, 84, 85, 92, 94, 79,
+  94, 81, 75, 84, 70, 89, 78, 87, 85, 81,
+  77, 84, 87, 87, 79, 93, 81, 86, 92, 89,
+  92, 81, 83, 85, 64, 95, 86, 84, 89, 87,
+  69, 88, 83, 91, 85, 76, 85, 91, 83, 78,
+  81, 86, 86, 95, 83, 90, 90, 81, 85, 88,
+  74, 86, 68, 85, 83, 79, 86, 86, 74, 93,
+  86, 80, 89, 75, 94, 85, 83, 100, 89, 81,
+  85, 82, 76, 100, 84, 89, 89, 84, 86, 88,
+  82, 81, 91, 78, 80, 94, 78, 101, 81, 84,
+  74, 85, 90, 88, 84, 92, 80, 79, 94, 80,
+  92, 94, 93, 75, 93, 71, 77, 84, 76, 98,
+  98, 88, 88, 87, 77, 72, 64, 88, 81, 83,
+  63, 79, 82, 73, 81, 80, 84, 90, 75, 65,
+  85, 85, 77, 82, 94, 94, 88, 93, 78, 90,
+  91, 84, 83, 82, 90, 79, 83, 89, 83, 80,
+  82, 92, 67, 88, 88, 83, 70, 85, 74, 81,
+  79, 90, 81, 73, 81, 78, 83, 79, 78, 77,
+  84, 91, 81, 85, 82, 79, 86, 89, 68, 88,
+  73, 96, 96, 73, 82, 85, 64, 92, 81, 88,
+  90, 66, 91, 88, 77, 97, 93, 74, 87, 69,
+  78, 95, 93, 80, 92, 86, 83, 108, 85, 88,
+  90, 79, 75, 87, 70, 85, 79, 84, 81, 82,
+  88, 86, 89, 98, 79, 85, 99, 85, 84, 88,
+  91, 67, 92, 80, 73, 82, 79, 95, 95, 89,
+  82, 86, 62, 78, 73, 87, 79, 92, 68, 82,
+  75, 74, 81, 87, 89, 92, 71, 66, 85, 75,
+  74, 81, 96, 102, 79, 81, 78, 85, 88, 87,
+  81, 83, 76, 86, 92, 92, 89, 82, 84, 81,
+  63, 91, 86, 80, 85, 84, 67, 85, 91, 91,
+  84, 70, 85, 94, 75, 84, 84, 80, 86, 88,
+  83, 82, 89, 86, 88, 82, 78, 82, 69, 85,
+  88, 79, 87, 99, 69, 92, 84, 81, 89, 76,
+  93, 84, 78, 99, 87, 83, 87, 82, 78, 94,
+  81, 84, 90, 93, 80, 88, 85, 84, 96, 78,
+  80, 93, 81, 86, 81, 80, 79, 80, 81, 83,
+  85, 96, 77, 81, 94, 80, 90, 94, 92, 74,
+  95, 76, 78, 81, 84, 95, 100, 82, 87, 86,
+  73, 76, 61, 89, 80, 83, 66, 79, 79, 84,
+  83, 85, 89, 85, 72, 72, 88, 86, 80, 82,
+  92, 96, 85, 87, 77, 85, 102, 87, 86, 90,
+  91, 79, 74, 85, 76, 84, 82, 100, 67, 91,
+  84, 80, 64, 90, 74, 78, 78, 93, 83, 77,
+  86, 79, 106, 85, 92, 85, 80, 94, 88, 97,
+  84, 70, 82, 95, 77, 94, 100, 93, 89, 85,
+  80, 79, 80, 82, 81, 79, 90, 67, 73, 88,
+  83, 93, 89, 76, 89, 75, 69, 91, 84, 83,
+  80, 80, 77, 90, 81, 76, 92, 97, 78, 84,
+  83, 107, 80, 79, 84, 74, 89, 90, 79, 93,
+  84, 85, 89, 86, 74, 90, 92, 76, 70, 85,
+  85, 77, 75, 90, 87, 88, 81, 86, 87, 75,
+  78, 87, 80, 82, 76, 91, 70, 75, 86, 84,
+  85, 98, 80, 83, 79, 65, 68, 87, 91, 88,
+  71, 78, 73, 87, 84, 76, 80, 76, 104, 73,
+  61, 83, 73, 85, 75, 95, 69, 101, 82, 79,
+  32, 85, 97, 70, 66, 89, 70, 72, 76, 56,
+  125, 90, 105, 80, 78, 92, 88, 88, 65, 62,
+  87, 90, 92, 88, 100, 102, 112, 84, 67, 93,
+  72, 87, 83, 75, 87, 60, 60, 85, 80, 89,
+  99, 76, 86, 58, 66, 90, 77, 81, 81, 91,
+  69, 75, 75, 73, 101, 107, 72, 79, 80, 93,
+  84, 74, 97, 68, 78, 84, 78, 101, 86, 76,
+  93, 96, 64, 82, 86, 69, 64, 102, 75, 73,
+  71, 76, 79, 90, 63, 85, 97, 82, 91, 82,
+  69, 89, 87, 100, 64, 81, 79, 107, 82, 111,
+  77, 100, 80, 55, 61, 83, 80, 91, 64, 65,
+  75, 80, 84, 83, 81, 75, 90, 79, 70, 83,
+  75, 83, 87, 76, 73, 90, 84, 80, 55, 87,
+  100, 72, 83, 89, 78, 74, 84, 73, 105, 91,
+  101, 84, 78, 89, 88, 78, 80, 76, 96, 90,
+  90, 89, 79, 97, 96, 90, 81, 108, 78, 80,
+  84, 81, 88, 71, 67, 90, 77, 88, 91, 78,
+  86, 70, 67, 88, 89, 82, 80, 91, 71, 77,
+  92, 74, 99, 96, 74, 77, 83, 87, 79, 78,
+  90, 74, 78, 80, 79, 94, 79, 83, 92, 88,
+  69, 91, 84, 77, 82, 96, 82, 76, 78, 86,
+  86, 86, 77, 84, 94, 86, 75, 90, 75, 84,
+  89, 91, 72, 89, 85, 92, 88, 90, 77, 92,
+  82, 62, 69, 82, 90, 88, 72, 73, 89, 91,
+  86, 90, 82, 73, 79, 76, 79, 81, 80, 83,
+  88, 93, 72, 84, 76, 87, 90, 89, 86, 90,
+  95, 86, 82, 81, 88, 89, 74, 87, 88, 93,
+  81, 87, 78, 111, 83, 80, 85, 85, 83, 81,
+  92, 84, 95, 86, 84, 84, 83, 80, 85, 70,
+  80, 86, 73, 81, 91, 89, 82, 78, 81, 80,
+  88, 86, 74, 82, 62, 89, 78, 81, 86, 84,
+  103, 102, 88, 89, 89, 98, 73, 71, 90, 75,
+  82, 89, 81, 92, 80, 88, 81, 84, 71, 79,
+  93, 87, 65, 83, 92, 81, 79, 82, 86, 85,
+  79, 81, 81, 86, 83, 92, 87, 80, 93, 99,
+  74, 87, 74, 80, 82, 89, 85, 85, 78, 74,
+  67, 83, 91, 83, 78, 83, 83, 87, 77, 77,
+  84, 77, 87, 70, 67, 78, 78, 82, 77, 89,
+  74, 90, 69, 100, 78, 87, 102, 82, 73, 74,
+  71, 75, 91, 72, 106, 89, 103, 95, 75, 89,
+  85, 106, 71, 87, 92, 66, 101, 80, 105, 98,
+  105, 100, 72, 98, 93, 67, 82, 64, 73, 83,
+  61, 85, 92, 80, 68, 75, 72, 81, 98, 90,
+  73, 76, 60, 96, 68, 66, 86, 88, 105, 117,
+  81, 75, 91, 98, 79, 62, 96, 74, 80, 91,
+  80, 94, 83, 82, 78, 88, 78, 73, 82, 89,
+  59, 96, 91, 76, 76, 66, 81, 78, 75, 78,
+  120, 80, 88, 94, 81, 68, 122, 113, 73, 80,
+  71, 84, 85, 104, 83, 104, 77, 68, 55, 75,
+  80, 75, 80, 74, 88, 73, 77, 88, 83, 89,
+  79, 76, 75, 78, 83, 82, 88, 76, 75, 83,
+  75, 88, 92, 85, 94, 87, 67, 81, 79, 81,
+  88, 79, 74, 87, 88, 104, 79, 92, 82, 88,
+  76, 84, 90, 77, 92, 83, 81, 88, 92, 88,
+  84, 98, 87, 72, 87, 71, 77, 93, 73, 86,
+  92, 87, 76, 82, 77, 87, 95, 89, 76, 84,
+  69, 97, 75, 72, 85, 83, 104, 100, 78, 87,
+  87, 89, 73, 73, 95, 77, 80, 89, 84, 93,
+  89, 94, 78, 83, 74, 81, 87, 91, 79, 86,
+  92, 82, 82, 84, 84, 83, 78, 77, 92, 88,
+  80, 91, 86, 78, 107, 93, 77, 83, 78, 84,
+  92, 87, 82, 85, 74, 74, 72, 78, 96, 76,
+  78, 78, 94, 63, 81, 85, 83, 73, 71, 77,
+  88, 83, 91, 81, 83, 72, 85, 68, 73, 81,
+  85, 101, 81, 82, 85, 71, 95, 89, 87, 83,
+  93, 89, 78, 86, 80, 83, 72, 81, 80, 79,
+  90, 73, 85, 78, 77, 89, 92, 73, 77, 67,
+  79, 82, 69, 88, 84, 80, 85, 79, 73, 84,
+  74, 79, 99, 75, 88, 82, 92, 74, 69, 88,
+  88, 76, 73, 100, 85, 78, 84, 110, 95, 71,
+  78, 76, 81, 88, 85, 100, 103, 81, 89, 84,
+  86, 89, 74, 91, 85, 80, 84, 83, 78, 83,
+  80, 75, 87, 75, 86, 89, 84, 81, 76, 102,
+  81, 107, 83, 83, 94, 79, 77, 91, 81, 69,
+  70, 70, 88, 95, 88, 98, 98, 98, 90, 74,
+  97, 72, 68, 85, 88, 74, 72, 77, 83, 89,
+  98, 78, 81, 82, 83, 66, 76, 86, 93, 105,
+  79, 83, 83, 74, 89, 96, 84, 84, 86, 81,
+  80, 84, 73, 92, 76, 79, 76, 72, 77, 67,
+  79, 76, 80, 88, 95, 73, 70, 67, 83, 74,
+  59, 80, 79, 76, 94, 74, 79, 92, 67, 81,
+  111, 87, 90, 85, 89, 79, 61, 98, 95, 84,
+  72, 105, 94, 80, 91, 116, 94, 72, 86, 77,
+  78, 84, 80, 87, 120, 71, 78, 94, 85, 93,
+  72, 100, 92, 91, 93, 88, 78, 78, 86, 74,
+  93, 87, 89, 92, 83, 85, 77, 99, 87, 102,
+  80, 88, 97, 85, 83, 94, 65, 75, 69, 67,
+  83, 91, 77, 96, 97, 96, 98, 71, 91, 83,
+  64, 84, 83, 90, 73, 77, 93, 84, 81, 80,
+  84, 92, 86, 67, 73, 78, 81, 91, 86, 90,
+  76, 73, 76, 86, 93, 85, 95, 69, 72, 82,
+  85, 84, 79, 88, 72, 90, 81, 79, 84, 85,
+  86, 86, 86, 65, 79, 85, 76, 82, 75, 84,
+  84, 86, 88, 79, 79, 77, 77, 76, 91, 74,
+  90, 70, 87, 75, 67, 85, 93, 77, 83, 89,
+  85, 76, 85, 95, 94, 83, 85, 78, 79, 88,
+  90, 88, 93, 73, 86, 80, 88, 89, 78, 90,
+  84, 81, 84, 83, 76, 82, 86, 76, 81, 75,
+  86, 88, 87, 87, 87, 93, 82, 108, 84, 81,
+  92, 99, 73, 83, 76, 73, 75, 77, 91, 93,
+  91, 90, 90, 93, 88, 86, 97, 66, 70, 84,
+  89, 84, 79, 90, 85, 97, 105, 78, 69, 81,
+  83, 73, 90, 85, 92, 110, 76, 76, 87, 77,
+  90, 86, 81, 84, 82, 84, 68, 70, 76, 102,
+  89, 78, 78, 71, 75, 65, 88, 93, 85, 82,
+  93, 71, 86, 79, 81, 85, 70, 88, 75, 79,
+  85, 74, 82, 92, 75, 95, 98, 71, 71, 86,
+  99, 75, 60, 96, 92, 74, 87, 120, 76, 76,
+  87, 118, 99, 80, 76, 91, 77, 82, 77, 101,
+  102, 69, 97, 82, 83, 73, 76, 74, 77, 100,
+  101, 103, 85, 72, 88, 77, 93, 90, 93, 94,
+  83, 84, 75, 100, 76, 96, 75, 79, 102, 81,
+  72, 94, 82, 85, 70, 70, 82, 98, 83, 103,
+  111, 71, 110, 74, 101, 71, 77, 89, 95, 85,
+  80, 87, 81, 117, 118, 75, 74, 76, 82, 75,
+  96, 81, 105, 125, 78, 75, 85, 81, 94, 93,
+  76, 86, 72, 93, 80, 72, 63, 107, 85, 81,
+  76, 77, 82, 57, 87, 101, 77, 85, 101, 73,
+  76, 74, 92, 81, 53, 90, 69, 71, 94, 76,
+  85, 96, 67, 95, 111, 75, 64, 95, 88, 85,
+  63, 109, 91, 82, 70, 137, 77, 73, 96, 125,
+  109, 85, 77, 96, 73, 78, 71, 81, 126, 72,
+  74, 97, 83, 76, 70, 73, 84, 113, 97, 112,
+  88, 58, 88, 76, 91, 89, 107, 95, 84, 87,
+  72, 103, 80, 88, 76, 78, 112, 79, 77, 103,
+  73, 95, 71, 72, 77, 97, 72, 112, 106, 68,
+  123, 70, 92, 73, 86, 83, 81, 99, 79, 85,
+  94, 90, 89, 76, 70, 79, 79, 74, 84, 84,
+  81, 103, 86, 82, 82, 75, 78, 79, 84, 82,
+  84, 86, 64, 73, 84, 79, 83, 93, 76, 78,
+  84, 73, 86, 92, 75, 81, 89, 71, 95, 84,
+  80, 86, 75, 91, 76, 82, 90, 73, 81, 80,
+  80, 81, 89, 71, 76, 64, 93, 79, 71, 94,
+  91, 80, 72, 104, 85, 76, 88, 105, 100, 93,
+  72, 87, 77, 82, 81, 93, 87, 81, 85, 82,
+  81, 79, 82, 78, 79, 82, 87, 92, 82, 77,
+  87, 77, 91, 72, 88, 92, 81, 86, 81, 89,
+  78, 100, 84, 79, 96, 98, 70, 95, 86, 84,
+  74, 74, 92, 96, 88, 94, 99, 78, 99, 90,
+  91, 76, 68, 86, 80, 71, 83, 101, 94, 85,
+  86, 84, 69, 88, 84, 79, 85, 82, 81, 89,
+  84, 88, 67, 70, 78, 80, 96, 82, 86, 73,
+  64, 75, 89, 84, 90, 85, 75, 76, 81, 71,
+  91, 77, 81, 82, 78, 75, 88, 89, 73, 93,
+  78, 90, 80, 93, 88, 73, 78, 90, 86, 84,
+  88, 73, 83, 86, 95, 76, 71, 84, 93, 81,
+  89, 84, 85, 74, 80, 94, 85, 72, 94, 72,
+  80, 87, 87, 86, 95, 76, 88, 70, 82, 87,
+  80, 80, 72, 83, 98, 79, 82, 86, 94, 79,
+  88, 90, 90, 95, 91, 77, 69, 88, 67, 95,
+  75, 88, 90, 80, 84, 78, 73, 75, 72, 82,
+  80, 97, 90, 86, 98, 81, 97, 81, 93, 76,
+  77, 83, 82, 69, 85, 95, 90, 88, 90, 82,
+  70, 82, 87, 79, 93, 83, 88, 94, 85, 81,
+  71, 73, 81, 83, 95, 80, 80, 93, 70, 71,
+  91, 80, 84, 80, 70, 72, 89, 62, 102, 72,
+  83, 83, 90, 85, 86, 74, 78, 95, 66, 89,
+  76, 86, 91, 77, 82, 91, 80, 87, 98, 84,
+  83, 90, 79, 79, 80, 97, 85, 95, 69, 84,
+  89, 71, 77, 95, 89, 74, 94, 69, 77, 84,
+  82, 86, 103, 88, 75, 80, 82, 94, 85, 79,
+  79, 89, 100, 83, 85, 87, 83, 76, 91, 77,
+  93, 96, 90, 80, 73, 88, 73, 98, 78, 99,
+  94, 78, 81, 95, 71, 77, 72, 88, 88, 96,
+  82, 89, 99, 87, 102, 85, 84, 84, 94, 84,
+  87, 76, 83, 88, 103, 80, 85, 79, 75, 75,
+  76, 79, 81, 77, 79, 90, 81, 94, 76, 74,
+  79, 82, 92, 80, 88, 95, 72, 73, 88, 73,
+  74, 85, 81, 78, 91, 76, 86, 78, 80, 82,
+  79, 74, 95, 78, 77, 94, 83, 96, 81, 94,
+  89, 81, 80, 87, 89, 82, 87, 71, 79, 75,
+  88, 81, 86, 78, 86, 84, 66, 82, 84, 73,
+  79, 88, 86, 88, 73, 77, 80, 90, 87, 97,
+  87, 93, 73, 78, 87, 87, 82, 79, 74, 79,
+  88, 80, 80, 86, 87, 81, 89, 70, 88, 92,
+  94, 85, 80, 87, 77, 97, 83, 81, 89, 81,
+  82, 88, 82, 75, 75, 84, 95, 96, 89, 82,
+  98, 87, 89, 85, 72, 84, 82, 82, 83, 88,
+  82, 71, 89, 65, 76, 69, 90, 83, 85, 68,
+  81, 79, 81, 81, 72, 92, 90, 94, 78, 79,
+  93, 65, 81, 80, 81, 89, 83, 88, 92, 77,
+  90, 101, 86, 75, 87, 92, 83, 69, 72, 80,
+  93, 89, 83, 70, 85, 98, 94, 112, 84, 73,
+  86, 80, 68, 89, 81, 96, 82, 67, 76, 100,
+  69, 76, 97, 81, 72, 89, 87, 73, 98, 80,
+  78, 103, 84, 88, 87, 91, 78, 82, 76, 78,
+  117, 79, 98, 84, 57, 86, 83, 98, 82, 83,
+  80, 74, 87, 86, 76, 82, 73, 79, 77, 76,
+  88, 84, 81, 96, 92, 83, 94, 77, 83, 73,
+  78, 87, 78, 103, 85, 90, 77, 79, 92, 105,
+  95, 94, 74, 87, 83, 89, 82, 89, 84, 75,
+  83, 79, 73, 81, 90, 79, 82, 81, 84, 73,
+  78, 87, 57, 90, 68, 83, 95, 80, 92, 80,
+  80, 82, 71, 100, 88, 85, 76, 64, 92, 97,
+  93, 80, 78, 86, 97, 81, 79, 79, 96, 80,
+  87, 72, 84, 95, 90, 96, 84, 78, 85, 77,
+  75, 89, 90, 88, 82, 60, 67, 81, 73, 90,
+  87, 83, 79, 88, 85, 66, 90, 77, 82, 98,
+  74, 87, 88, 88, 78, 83, 78, 75, 102, 78,
+  88, 80, 65, 83, 85, 95, 72, 73, 85, 85,
+  77, 73, 65, 78, 81, 82, 73, 88, 89, 86,
+  94, 85, 86, 79, 87, 65, 80, 89, 76, 93,
+  70, 87, 79, 83, 89, 86, 84, 88, 76, 93,
+  83, 79, 84, 82, 83, 89, 83, 81, 84, 93,
+  79, 93, 78, 78, 65, 87, 90, 68, 77, 93,
+  72, 83, 69, 83, 98, 86, 90, 87, 71, 74,
+  71, 97, 86, 87, 74, 64, 94, 80, 82, 82,
+  79, 76, 94, 84, 95, 76, 98, 92, 80, 80,
+  84, 88, 88, 80, 83, 84, 82, 86, 85, 88,
+  93, 88, 85, 66, 78, 80, 69, 110, 82, 85,
+  85, 88, 91, 71, 78, 85, 92, 90, 77, 76,
+  88, 85, 90, 86, 92, 73, 106, 87, 88, 79,
+  80, 94, 100, 91, 87, 81, 78, 91, 80, 73,
+  73, 92, 95, 85, 69, 104, 94, 86, 85, 78,
+  89, 85, 80, 64, 87, 100, 82, 102, 82, 84,
+  80, 80, 86, 91, 82, 84, 66, 84, 77, 83,
+  88, 85, 92, 84, 84, 84, 90, 65, 76, 71,
+  90, 81, 85, 80, 77, 78, 86, 81, 70, 85,
+  74, 94, 79, 81, 93, 70, 107, 84, 83, 93,
+  88, 87, 80, 74, 81, 102, 96, 75, 77, 87,
+  90, 69, 79, 87, 88, 84, 85, 74, 82, 98,
+  88, 109, 89, 80, 77, 88, 62, 78, 80, 89,
+  81, 67, 66, 95, 84, 69, 99, 75, 76, 74,
+  95, 81, 96, 77, 76, 101, 79, 90, 86, 83,
+  71, 93, 81, 87, 118, 87, 93, 82, 57, 87,
+  70, 99, 80, 80, 90, 86, 75, 87, 71, 78,
+  73, 82, 84, 81, 86, 78, 82, 97, 98, 90,
+  95, 73, 72, 69, 73, 78, 76, 85, 84, 91,
+  76, 70, 92, 96, 98, 92, 72, 86, 90, 85,
+  86, 90, 89, 81, 80, 80, 72, 83, 85, 78,
+  81, 87, 80, 76, 85, 88, 59, 94, 58, 78,
+  99, 83, 91, 83, 106, 77, 70, 100, 87, 83,
+  73, 61, 82, 91, 94, 78, 82, 91, 103, 82,
+  79, 87, 87, 77, 85, 72, 85, 100, 85, 88,
+  93, 81, 83, 75, 80, 86, 86, 85, 80, 54,
+  56, 73, 82, 90, 83, 85, 74, 77, 91, 74,
+  85, 76, 83, 116, 66, 86, 81, 84, 78, 96,
+  87, 81, 112, 83, 78, 82, 67, 78, 83, 96,
+  76, 74, 88, 90, 65, 74, 64, 72, 82, 84,
+  74, 96, 90, 83, 92, 79, 94, 86, 85, 60,
+  74, 86, 80, 89, 78, 81, 75, 76, 88, 80,
+  83, 81, 71, 85, 78, 72, 77, 70, 80, 95,
+  91, 81, 81, 94, 77, 97, 78, 77, 64, 86,
+  86, 80, 77, 93, 75, 80, 65, 75, 103, 82,
+  82, 89, 94, 86, 71, 105, 85, 82, 79, 61,
+  87, 75, 78, 78, 104, 80, 107, 85, 87, 75,
+  87, 91, 75, 78, 84, 85, 80, 75, 92, 83,
+  88, 75, 99, 85, 88, 85, 86, 55, 77, 75,
+  71, 116, 71, 95, 69, 90, 99, 68, 79, 99,
+  98, 107, 71, 75, 79, 82, 94, 96, 99, 84,
+  113, 96, 79, 90, 85, 89, 110, 85, 83, 83,
+  78, 90, 75, 71, 75, 79, 100, 86, 60, 109,
+  95, 91, 84, 72, 95, 93, 78, 61, 78, 110,
+  92, 106, 86, 86, 85, 71, 82, 102, 81, 77,
+  62, 72, 77, 83, 84, 91, 89, 83, 85, 83,
+  86, 70, 84, 79, 93, 74, 87, 89, 78, 76,
+  87, 92, 93, 82, 86, 91, 84, 81, 87, 71,
+  92, 81, 87, 84, 84, 91, 79, 78, 88, 83,
+  91, 78, 86, 89, 87, 76, 80, 88, 83, 80,
+  79, 75, 82, 90, 89, 109, 86, 91, 84, 92,
+  69, 78, 76, 92, 87, 72, 75, 91, 85, 80,
+  86, 85, 82, 84, 102, 81, 91, 82, 79, 104,
+  84, 88, 89, 82, 82, 97, 87, 85, 119, 83,
+  90, 88, 65, 86, 87, 94, 78, 90, 80, 81,
+  76, 77, 70, 87, 80, 79, 73, 86, 89, 85,
+  69, 91, 88, 88, 93, 77, 84, 81, 70, 75,
+  79, 91, 85, 88, 82, 74, 86, 87, 95, 88,
+  78, 90, 84, 89, 80, 87, 87, 79, 82, 85,
+  77, 89, 85, 77, 82, 95, 81, 77, 81, 92,
+  72, 90, 74, 83, 93, 79, 96, 82, 90, 81,
+  77, 99, 83, 77, 73, 68, 92, 90, 89, 77,
+  84, 85, 98, 82, 71, 87, 82, 75, 81, 77,
+  83, 92, 86, 94, 92, 77, 82, 81, 89, 80,
+  80, 86, 85, 68, 68, 79, 82, 88, 81, 90,
+  79, 83, 96, 80, 82, 80, 81, 108, 75, 81,
+  85, 85, 81, 90, 87, 81, 107, 82, 84, 84,
+  67, 75, 91, 90, 70, 81, 82, 84, 71, 70,
+  68, 88, 91, 79, 81, 91, 83, 89, 89, 79,
+  89, 83, 86, 66, 89, 88, 78, 84, 85, 90,
+  80, 76, 89, 78, 83, 80, 80, 81, 91, 79,
+  77, 73, 83, 95, 86, 80, 86, 103, 73, 97,
+  78, 87, 68, 88, 86, 79, 76, 87, 75, 79,
+  67, 75, 99, 76, 84, 89, 78, 95, 75, 101,
+  84, 75, 77, 64, 94, 83, 80, 87, 99, 73,
+  101, 90, 68, 79, 84, 80, 83, 84, 75, 80,
+  81, 82, 103, 86, 87, 85, 96, 82, 84, 86,
+  94, 63, 76, 85, 73, 100, 72, 99, 86, 95,
+  93, 70, 80, 96, 88, 103, 76, 72, 81, 81,
+  93, 88, 94, 79, 113, 102, 91, 88, 90, 79,
+  105, 78, 85, 89, 77, 88, 73, 75, 77, 87,
+  108, 81, 71, 94, 82, 96, 97, 78, 96, 86,
+  83, 62, 86, 100, 94, 99, 89, 89, 94, 76,
+  84, 95, 86, 75, 79, 76, 86, 81, 89, 89,
+  85, 67, 80, 96, 93, 85, 76, 82, 76, 89,
+  77, 88, 70, 64, 79, 89, 79, 110, 76, 92,
+  73, 75, 96, 90, 90, 91, 72, 93, 76, 89,
+  95, 78, 80, 94, 100, 84, 88, 65, 88, 88,
+  86, 81, 85, 78, 83, 81, 103, 85, 82, 72,
+  85, 81, 80, 83, 93, 80, 104, 96, 82, 105,
+  58, 65, 95, 97, 93, 90, 76, 83, 112, 86,
+  71, 75, 74, 67, 84, 76, 81, 90, 75, 96,
+  79, 100, 98, 96, 88, 96, 93, 94, 75, 68,
+  99, 67, 84, 76, 89, 81, 76, 66, 92, 92,
+  75, 98, 77, 94, 86, 75, 93, 94, 76, 83,
+  83, 86, 86, 78, 69, 95, 88, 82, 99, 85,
+  104, 96, 78, 95, 89, 78, 86, 76, 94, 65,
+  76, 89, 81, 83, 76, 83, 64, 99, 72, 75,
+  73, 59, 71, 83, 82, 110, 66, 91, 70, 74,
+  87, 83, 106, 85, 80, 106, 76, 91, 89, 93,
+  76, 88, 78, 85, 87, 67, 92, 83, 88, 80,
+  80, 84, 84, 84, 95, 74, 82, 71, 94, 84,
+  88, 80, 90, 77, 110, 103, 83, 109, 51, 70,
+  80, 97, 89, 87, 90, 81, 93, 91, 75, 84,
+  72, 75, 91, 69, 73, 84, 70, 80, 88, 84,
+  79, 115, 82, 83, 90, 100, 82, 55, 95, 69,
+  82, 72, 89, 85, 76, 99, 96, 93, 76, 83,
+  71, 88, 80, 75, 93, 105, 66, 86, 82, 79,
+  64, 75, 72, 87, 84, 86, 93, 77, 97, 98,
+  80, 88, 84, 74, 92, 84, 89, 90, 99, 108,
+  82, 86, 79, 77, 71, 87, 86, 90, 73, 89,
+  78, 83, 92, 76, 79, 95, 88, 89, 83, 77,
+  75, 91, 80, 86, 84, 94, 89, 87, 84, 89,
+  75, 90, 83, 82, 86, 89, 81, 87, 86, 88,
+  85, 93, 94, 93, 81, 81, 83, 81, 92, 84,
+  95, 81, 78, 78, 71, 69, 77, 77, 83, 90,
+  87, 85, 77, 80, 101, 71, 85, 80, 75, 87,
+  70, 98, 88, 89, 80, 89, 84, 77, 90, 75,
+  94, 83, 88, 78, 76, 88, 90, 85, 91, 73,
+  93, 93, 69, 88, 85, 94, 88, 87, 84, 85,
+  77, 73, 80, 75, 90, 100, 89, 84, 73, 82,
+  85, 78, 103, 78, 96, 87, 87, 91, 89, 90,
+  110, 78, 103, 85, 71, 71, 65, 85, 85, 88,
+  74, 82, 79, 97, 76, 75, 78, 59, 79, 93,
+  83, 119, 94, 88, 66, 82, 78, 87, 116, 94,
+  90, 97, 76, 88, 84, 89, 91, 79, 96, 78,
+  76, 71, 86, 84, 96, 80, 70, 95, 86, 78,
+  86, 87, 85, 63, 91, 69, 83, 75, 96, 62,
+  100, 113, 93, 110, 50, 70, 84, 89, 93, 73,
+  71, 82, 102, 95, 67, 81, 68, 62, 72, 70,
+  72, 75, 77, 99, 86, 94, 89, 102, 75, 85,
+  91, 83, 85, 71, 95, 63, 82, 82, 87, 80,
+  75, 49, 95, 92, 86, 80, 79, 87, 79, 77,
+  96, 99, 72, 73, 75, 85, 82, 83, 57, 93,
+  90, 83, 97, 72, 95, 86, 85, 85, 106, 79,
+  83, 76, 78, 67, 60, 79, 78, 87, 77, 83,
+  73, 91, 76, 66, 82, 52, 65, 85, 73, 120,
+  69, 89, 68, 80, 70, 83, 123, 70, 83, 113,
+  74, 86, 97, 97, 78, 70, 92, 82, 70, 64,
+  102, 81, 89, 87, 61, 75, 83, 73, 85, 83,
+  84, 57, 91, 87, 80, 67, 92, 62, 109, 118,
+  87, 107, 37, 77, 70, 90, 94, 58, 98, 77,
+  89, 89, 70, 85, 70, 92, 81, 64, 63, 73,
+  75, 80, 86, 84, 71, 115, 61, 84, 89, 99,
+  90, 64, 101, 66, 78, 71, 89, 83, 76, 71,
+  94, 93, 85, 69, 71, 81, 70, 72, 78, 117,
+  64, 78, 59, 76, 69, 82, 66, 87, 78, 81,
+  93, 66, 92, 83, 82, 72, 86, 75, 77, 91,
+  82, 86, 79, 105, 91, 87, 78, 79, 70, 77,
+  80, 85, 79, 76, 85, 81, 78, 82, 80, 90,
+  86, 94, 84, 80, 89, 78, 76, 86, 77, 92,
+  81, 87, 74, 96, 75, 94, 81, 72, 92, 86,
+  75, 91, 84, 70, 86, 94, 91, 96, 86, 69,
+  87, 83, 85, 77, 98, 74, 85, 81, 81, 61,
+  72, 67, 77, 88, 85, 86, 85, 77, 102, 73,
+  85, 85, 69, 98, 73, 92, 79, 83, 81, 86,
+  78, 81, 86, 85, 96, 89, 89, 101, 80, 87,
+  96, 87, 82, 62, 87, 89, 83, 82, 81, 92,
+  93, 79, 88, 86, 78, 84, 70, 79, 87, 97,
+  74, 84, 88, 80, 84, 83, 100, 75, 109, 89,
+  83, 78, 90, 78, 98, 70, 96, 81, 69, 95,
+  75, 78, 78, 82, 79, 88, 83, 79, 75, 73,
+  75, 85, 95, 109, 94, 93, 107, 90, 71, 84,
+  84, 93, 94, 90, 99, 104, 77, 85, 80, 100,
+  79, 69, 79, 66, 79, 78, 88, 84, 93, 90,
+  81, 90, 86, 80, 87, 81, 85, 69, 89, 74,
+  88, 64, 87, 84, 91, 104, 96, 99, 78, 58,
+  81, 95, 78, 87, 75, 98, 89, 88, 76, 83,
+  70, 72, 80, 72, 92, 85, 82, 96, 88, 88,
+  93, 84, 82, 91, 84, 82, 94, 88, 86, 73,
+  91, 80, 89, 76, 67, 62, 94, 96, 96, 77,
+  88, 93, 85, 81, 93, 77, 83, 86, 79, 100,
+  85, 94, 69, 86, 92, 83, 96, 73, 90, 98,
+  87, 84, 100, 80, 75, 80, 73, 88, 68, 76,
+  75, 87, 81, 93, 79, 80, 73, 70, 83, 78,
+  78, 103, 81, 94, 87, 88, 67, 80, 78, 89,
+  92, 78, 88, 111, 70, 82, 89, 95, 77, 67,
+  75, 71, 86, 72, 103, 79, 92, 97, 66, 74,
+  79, 76, 96, 86, 88, 66, 86, 76, 82, 63,
+  87, 79, 96, 101, 94, 101, 68, 64, 70, 89,
+  81, 64, 81, 94, 83, 86, 73, 88, 74, 87,
+  84, 69, 86, 83, 85, 88, 88, 90, 81, 93,
+  72, 94, 85, 101, 96, 82, 101, 69, 89, 79,
+  94, 77, 69, 69, 95, 96, 88, 76, 83, 85,
+  81, 76, 80, 92, 73, 81, 71, 90, 82, 90,
+  70, 84, 77, 78, 93, 68, 89, 86, 82, 75,
+  92, 75, 69, 90, 90, 97, 81, 92, 84, 91,
+  81, 79, 75, 83, 77, 83, 83, 78, 92, 93,
+  82, 80, 80, 88, 84, 93, 87, 90, 83, 83,
+  84, 88, 74, 101, 84, 93, 83, 84, 69, 90,
+  89, 80, 88, 87, 80, 91, 86, 86, 83, 86,
+  87, 89, 85, 75, 90, 87, 82, 75, 87, 74,
+  91, 82, 83, 82, 81, 72, 73, 84, 84, 91,
+  93, 77, 92, 76, 84, 88, 72, 83, 91, 90,
+  92, 75, 80, 79, 89, 82, 89, 87, 87, 90,
+  81, 107, 91, 92, 103, 86, 91, 66, 91, 86,
+  78, 86, 89, 94, 88, 76, 92, 95, 100, 76,
+  84, 76, 84, 88, 81, 85, 94, 85, 83, 79,
+  89, 77, 105, 87, 81, 78, 82, 83, 106, 98,
+  82, 88, 97, 83, 78, 68, 78, 76, 80, 84,
+  96, 73, 91, 98, 77, 79, 77, 89, 88, 75,
+  84, 86, 100, 82, 87, 77, 86, 84, 94, 101,
+  75, 79, 80, 84, 111, 74, 91, 89, 76, 81,
+  89, 84, 76, 77, 92, 86, 83, 71, 72, 89,
+  87, 88, 87, 102, 64, 107, 98, 87, 93, 86,
+  90, 83, 81, 79, 81, 77, 86, 84, 80, 106,
+  81, 86, 85, 80, 74, 81, 94, 95, 90, 82,
+  95, 81, 88, 79, 84, 69, 103, 85, 62, 91,
+  90, 102, 74, 89, 86, 83, 94, 71, 87, 75,
+  93, 89, 87, 84, 80, 83, 87, 86, 89, 83,
+  84, 90, 91, 80, 56, 97, 85, 88, 80, 79,
+  93, 86, 103, 83, 89, 72, 103, 62, 88, 93,
+  84, 116, 73, 70, 88, 91, 70, 91, 88, 90,
+  73, 78, 87, 99, 86, 109, 87, 65, 95, 78,
+  103, 75, 94, 91, 94, 81, 81, 99, 88, 83,
+  84, 94, 106, 74, 96, 78, 68, 98, 83, 91,
+  86, 81, 80, 85, 76, 72, 98, 80, 76, 75,
+  91, 97, 68, 74, 87, 95, 83, 70, 86, 62,
+  61, 73, 59, 94, 69, 84, 95, 98, 70, 82,
+  81, 85, 80, 111, 74, 97, 74, 87, 92, 102,
+  88, 77, 87, 99, 62, 80, 84, 101, 80, 84,
+  87, 100, 82, 69, 87, 74, 84, 103, 85, 90,
+  85, 69, 76, 86, 80, 77, 86, 77, 87, 102,
+  79, 100, 63, 88, 76, 73, 73, 66, 85, 76,
+  89, 78, 92, 71, 80, 69, 65, 73, 79, 125,
+  76, 92, 96, 84, 73, 96, 71, 83, 66, 79,
+  82, 92, 78, 112, 71, 78, 95, 81, 74, 89,
+  88, 87, 83, 96, 77, 85, 99, 85, 67, 101,
+  94, 78, 77, 91, 72, 97, 77, 82, 81, 74,
+  81, 109, 81, 74, 95, 78, 85, 77, 88, 82,
+  100, 63, 96, 92, 77, 77, 81, 58, 53, 90,
+  63, 84, 79, 75, 77, 85, 84, 85, 79, 86,
+  80, 92, 74, 109, 74, 81, 83, 100, 71, 77,
+  94, 87, 76, 86, 95, 88, 86, 77, 89, 87,
+  74, 69, 92, 87, 73, 90, 84, 83, 88, 83,
+  88, 87, 87, 96, 75, 74, 91, 97, 58, 99,
+  65, 72, 74, 96, 90, 93, 92, 88, 75, 83,
+  82, 112, 97, 81, 95, 91, 102, 72, 76, 69,
+  76, 76, 79, 94, 78, 71, 86, 91, 79, 70,
+  82, 92, 95, 61, 86, 84, 102, 76, 101, 85,
+  98, 78, 91, 91, 74, 87, 62, 76, 80, 85,
+  110, 69, 93, 69, 75, 85, 69, 88, 88, 80,
+  85, 68, 83, 71, 83, 87, 84, 100, 62, 99,
+  87, 85, 97, 97, 83, 77, 79, 71, 94, 79,
+  97, 91, 54, 89, 76, 102, 78, 74, 88, 89,
+  85, 86, 86, 76, 93, 93, 85, 103, 75, 76,
+  93, 67, 73, 86, 84, 107, 68, 93, 85, 83,
+  82, 76, 73, 67, 79, 93, 89, 94, 89, 80,
+  81, 76, 85, 94, 76, 91, 96, 93, 69, 96,
+  84, 107, 80, 69, 90, 82, 88, 88, 82, 71,
+  86, 56, 108, 92, 77, 97, 71, 69, 71, 95,
+  73, 92, 64, 74, 74, 74, 88, 98, 83, 123,
+  89, 58, 111, 77, 96, 63, 91, 94, 111, 121,
+  78, 91, 88, 66, 62, 89, 103, 91, 134, 57,
+  101, 83, 62, 90, 71, 78, 72, 89, 82, 78,
+  89, 78, 75, 74, 88, 89, 76, 67, 72, 84,
+  87, 76, 79, 62, 60, 73, 71, 95, 80, 108,
+  40, 82, 79, 83, 70, 84, 91, 94, 65, 86,
+  72, 80, 78, 113, 83, 103, 78, 102, 57, 67,
+  90, 70, 80, 79, 75, 90, 85, 61, 79, 79,
+  69, 58, 90, 88, 74, 89, 72, 86, 74, 84,
+  78, 92, 90, 91, 69, 110, 92, 84, 73, 88,
+  84, 70, 79, 83, 75, 81, 89, 80, 76, 74,
+  85, 73, 83, 98, 79, 88, 91, 80, 84, 88,
+  66, 78, 69, 85, 71, 97, 87, 102, 75, 74,
+  94, 79, 80, 81, 81, 83, 103, 124, 78, 76,
+  102, 76, 64, 89, 83, 86, 91, 96, 71, 95,
+  65, 85, 78, 74, 85, 106, 86, 87, 85, 79,
+  86, 79, 85, 85, 97, 67, 93, 92, 76, 75,
+  79, 46, 55, 98, 75, 73, 81, 66, 58, 93,
+  87, 80, 79, 84, 89, 81, 55, 105, 81, 83,
+  90, 97, 78, 88, 94, 83, 76, 81, 104, 72,
+  86, 81, 82, 77, 77, 71, 96, 87, 77, 56,
+  80, 82, 88, 76, 84, 89, 88, 104, 84, 76,
+  87, 88, 43, 99, 71, 75, 76, 89, 111, 98,
+  95, 92, 81, 78, 82, 111, 90, 77, 83, 69,
+  85, 100, 79, 84, 80, 89, 87, 91, 88, 78,
+  65, 72, 79, 72, 89, 90, 85, 93, 84, 83,
+  82, 83, 89, 89, 87, 91, 86, 78, 78, 81,
+  81, 95, 84, 80, 94, 80, 100, 71, 77, 82,
+  86, 90, 64, 83, 82, 75, 87, 84, 87, 87,
+  84, 83, 76, 78, 87, 87, 89, 96, 82, 86,
+  71, 94, 73, 87, 81, 79, 86, 81, 86, 92,
+  76, 90, 87, 113, 77, 87, 81, 81, 93, 92,
+  73, 92, 77, 79, 77, 77, 97, 77, 76, 83,
+  82, 77, 87, 82, 82, 88, 74, 69, 79, 88,
+  90, 98, 98, 80, 96, 86, 82, 86, 87, 98,
+  78, 80, 102, 81, 79, 91, 83, 78, 90, 82,
+  90, 83, 84, 84, 83, 73, 60, 73, 78, 96,
+  79, 85, 80, 85, 85, 86, 64, 81, 65, 76,
+  77, 93, 83, 89, 74, 81, 83, 82, 78, 79,
+  86, 86, 95, 112, 81, 73, 92, 73, 74, 91,
+  88, 79, 84, 75, 95, 59, 69, 84, 79, 79,
+  75, 73, 82, 87, 86, 81, 90, 81, 92, 70,
+  94, 85, 89, 90, 87, 83, 90, 81, 70, 90,
+  74, 84, 72, 91, 91, 70, 90, 80, 79, 96,
+  82, 103, 83, 68, 84, 86, 81, 88, 76, 89,
+  79, 82, 83, 88, 102, 80, 77, 71, 94, 76,
+  80, 71, 84, 90, 77, 74, 80, 79, 93, 84,
+  74, 88, 89, 100, 71, 81, 96, 82, 77, 90,
+  87, 72, 80, 79, 98, 82, 92, 92, 90, 88,
+  86, 94, 84, 81, 79, 69, 96, 66, 89, 97,
+  96, 75, 89, 85, 78, 93, 82, 90, 72, 86,
+  82, 78, 71, 82, 80, 83, 79, 89, 71, 70,
+  73, 83, 78, 72, 86, 86, 78, 79, 76, 87,
+  70, 102, 71, 68, 85, 94, 88, 80, 82, 70,
+  89, 79, 78, 104, 89, 88, 92, 89, 93, 106,
+  99, 87, 83, 81, 76, 66, 85, 105, 93, 74,
+  71, 87, 79, 84, 88, 76, 85, 81, 87, 91,
+  67, 89, 96, 82, 86, 79, 96, 87, 74, 73,
+  98, 89, 81, 87, 75, 87, 92, 85, 75, 90,
+  95, 91, 84, 77, 74, 79, 93, 72, 82, 89,
+  82, 90, 78, 73, 87, 85, 78, 93, 57, 78,
+  88, 77, 94, 94, 85, 94, 93, 85, 77, 87,
+  78, 77, 84, 85, 82, 100, 90, 94, 81, 91,
+  85, 93, 79, 68, 91, 78, 84, 95, 86, 72,
+  90, 76, 100, 89, 89, 84, 82, 93, 73, 101,
+  80, 84, 87, 81, 78, 96, 86, 82, 88, 78,
+  80, 77, 85, 89, 80, 91, 88, 101, 85, 83,
+  90, 97, 74, 81, 102, 81, 78, 87, 91, 76,
+  76, 99, 85, 84, 104, 81, 82, 90, 80, 89,
+  90, 81, 96, 81, 79, 95, 76, 82, 83, 91,
+  89, 86, 93, 113, 78, 80, 81, 90, 82, 92,
+  87, 92, 85, 77, 87, 89, 90, 82, 93, 88,
+  83, 85, 84, 95, 81, 77, 89, 78, 81, 82,
+  88, 83, 86, 95, 86, 79, 90, 84, 82, 83,
+  78, 79, 80, 84, 82, 92, 84, 74, 87, 80,
+  78, 89, 81, 82, 84, 92, 87, 93, 83, 96,
+  90, 69, 91, 81, 78, 81, 77, 79, 87, 87,
+  90, 94, 85, 88, 81, 98, 88, 97, 83, 91,
+  88, 83, 92, 89, 83, 86, 75, 70, 77, 80,
+  86, 85, 82, 83, 91, 87, 88, 81, 78, 90,
+  74, 82, 94, 73, 72, 84, 95, 77, 81, 82,
+  86, 97, 86, 75, 76, 89, 79, 75, 82, 102,
+  86, 76, 81, 92, 84, 75, 87, 80, 92, 81,
+  86, 89, 75, 77, 84, 89, 72, 96, 76, 80,
+  84, 69, 82, 86, 87, 81, 96, 75, 89, 75,
+  87, 92, 82, 78, 104, 86, 81, 84, 87, 84,
+  83, 89, 78, 79, 82, 85, 79, 80, 83, 81,
+  82, 79, 87, 84, 76, 80, 79, 96, 88, 88,
+  82, 88, 84, 89, 89, 100, 83, 111, 82, 80,
+  87, 79, 81, 82, 82, 89, 85, 80, 86, 93,
+  84, 84, 87, 97, 68, 75, 78, 84, 87, 71,
+  95, 104, 81, 86, 67, 69, 81, 75, 89, 88,
+  79, 91, 84, 77, 85, 87, 86, 93, 74, 81,
+  103, 81, 77, 85, 90, 72, 75, 95, 79, 94,
+  96, 71, 83, 96, 80, 80, 84, 91, 94, 85,
+  87, 93, 84, 108, 95, 80, 87, 82, 94, 79,
+  75, 79, 90, 87, 74, 89, 82, 90, 85, 74,
+  91, 84, 86, 84, 91, 78, 87, 83, 86, 91,
+  85, 77, 93, 84, 84, 81, 90, 89, 81, 80,
+  79, 80, 79, 84, 83, 80, 73, 79, 79, 82,
+  90, 89, 79, 76, 82, 67, 81, 78, 78, 71,
+  97, 93, 72, 88, 90, 100, 61, 82, 93, 71,
+  91, 84, 78, 82, 97, 66, 80, 92, 91, 82,
+  91, 90, 150, 96, 82, 87, 83, 86, 84, 81,
+  97, 90, 79, 67, 83, 78, 92, 84, 82, 81,
+  82, 93, 85, 78, 96, 61, 73, 85, 73, 88,
+  87, 81, 83, 103, 76, 95, 97, 87, 80, 80,
+  95, 95, 88, 90, 81, 84, 83, 78, 82, 88,
+  91, 81, 91, 104, 77, 86, 86, 98, 78, 82,
+  79, 95, 77, 93, 77, 92, 72, 80, 88, 92,
+  84, 94, 93, 88, 73, 97, 91, 97, 83, 93,
+  82, 82, 70, 84, 83, 79, 95, 87, 86, 92,
+  71, 90, 77, 85, 84, 93, 74, 79, 65, 90,
+  87, 83, 92, 75, 70, 84, 79, 63, 91, 94,
+  77, 84, 89, 110, 73, 78, 86, 76, 92, 72,
+  70, 88, 91, 71, 71, 93, 92, 93, 93, 91,
+  165, 87, 90, 91, 76, 88, 88, 70, 87, 89,
+  71, 67, 77, 84, 92, 82, 90, 77, 89, 78,
+  84, 63, 90, 52, 72, 90, 60, 83, 84, 86,
+  90, 108, 85, 78, 99, 109, 78, 79, 92, 89,
+  83, 73, 70, 102, 77, 80, 81, 78, 92, 73,
+  91, 98, 75, 92, 85, 82, 75, 82, 78, 95,
+  75, 98, 66, 86, 73, 77, 77, 88, 85, 97,
+  98, 75, 74, 80, 92, 99, 80, 92, 97, 90,
+  66, 86, 85, 80, 91, 78, 83, 79, 67, 89,
+  77, 85, 89, 92, 69, 79, 64, 84, 83, 83,
+  77, 95, 88, 80, 76, 70, 89, 87, 76, 91,
+  88, 114, 65, 87, 85, 74, 87, 74, 77, 98,
+  87, 66, 73, 90, 88, 87, 94, 93, 142, 79,
+  81, 89, 78, 72, 88, 89, 90, 92, 73, 62,
+  86, 74, 91, 82, 87, 81, 80, 72, 83, 75,
+  97, 61, 70, 87, 76, 75, 86, 83, 84, 102,
+  76, 87, 95, 98, 78, 73, 97, 102, 82, 87,
+  74, 96, 82, 84, 86, 85, 92, 98, 99, 96,
+  73, 89, 87, 84, 76, 85, 80, 96, 73, 91,
+  74, 83, 69, 82, 84, 86, 83, 98, 90, 80,
+  74, 83, 89, 94, 80, 89, 85, 86, 73, 81,
+  93, 83, 90, 73, 85, 85, 70, 88, 80, 82,
+  78, 94, 69, 77, 71, 87, 85, 83, 79, 70,
+  87, 81, 93, 91, 77, 84, 79, 87, 87, 77,
+  72, 79, 85, 84, 86, 84, 90, 67, 89, 86,
+  85, 96, 82, 72, 86, 95, 75, 81, 87, 86,
+  86, 89, 75, 84, 91, 81, 75, 84, 89, 81,
+  83, 83, 79, 95, 79, 96, 78, 88, 89, 105,
+  70, 79, 105, 78, 81, 85, 95, 79, 73, 86,
+  78, 75, 89, 80, 84, 70, 86, 91, 91, 75,
+  83, 78, 78, 88, 83, 85, 77, 84, 92, 68,
+  87, 90, 79, 80, 80, 82, 91, 83, 80, 83,
+  79, 77, 90, 77, 88, 77, 81, 82, 83, 89,
+  83, 87, 75, 86, 80, 75, 72, 87, 80, 85,
+  88, 87, 75, 83, 81, 86, 82, 83, 76, 76,
+  85, 74, 87, 83, 79, 83, 91, 72, 75, 86,
+  93, 81, 68, 85, 81, 81, 82, 76, 81, 71,
+  79, 91, 89, 79, 84, 73, 85, 86, 80, 88,
+  87, 71, 88, 102, 105, 72, 90, 94, 86, 92,
+  75, 78, 83, 90, 79, 79, 88, 85, 86, 77,
+  83, 93, 78, 87, 75, 84, 84, 90, 66, 81,
+  89, 78, 73, 80, 97, 86, 88, 78, 79, 82,
+  80, 76, 85, 79, 90, 79, 81, 90, 78, 77,
+  77, 85, 91, 78, 70, 86, 88, 68, 85, 81,
+  73, 82, 82, 82, 81, 88, 72, 78, 79, 77,
+  84, 76, 86, 81, 87, 69, 86, 84, 86, 89,
+  79, 89, 95, 77, 70, 88, 72, 92, 84, 82,
+  69, 80, 79, 87, 85, 82, 86, 82, 87, 75,
+  87, 79, 86, 86, 81, 85, 92, 79, 86, 84,
+  70, 73, 79, 86, 86, 87, 81, 75, 78, 85,
+  82, 77, 90, 74, 81, 88, 80, 93, 85, 74,
+  87, 98, 74, 71, 85, 87, 84, 76, 79, 87,
+  81, 87, 87, 77, 96, 79, 84, 78, 82, 93,
+  70, 73, 74, 91, 85, 101, 69, 80, 102, 71,
+  77, 82, 94, 79, 81, 82, 75, 83, 88, 75,
+  86, 84, 86, 96, 78, 87, 79, 80, 80, 90,
+  87, 104, 72, 82, 86, 66, 88, 76, 73, 84,
+  75, 86, 80, 82, 76, 75, 77, 80, 85, 73,
+  86, 84, 84, 76, 86, 74, 84, 84, 72, 86,
+  81, 76, 75, 85, 74, 89, 82, 74, 76, 81,
+  85, 84, 87, 79, 83, 80, 81, 74, 88, 80,
+  80, 85, 87, 82, 82, 90, 99, 88, 81, 89,
+  78, 84, 94, 75, 82, 91, 86, 74, 83, 91,
+  96, 85, 88, 87, 99, 73, 83, 73, 73, 86,
+  88, 96, 90, 90, 79, 93, 81, 85, 86, 65,
+  88, 80, 83, 77, 75, 95, 62, 75, 92, 79,
+  69, 78, 88, 78, 91, 86, 78, 78, 74, 73,
+  80, 93, 92, 93, 83, 82, 75, 90, 79, 87,
+  96, 74, 83, 73, 68, 94, 88, 71, 86, 100,
+  88, 78, 73, 77, 83, 91, 102, 83, 97, 93,
+  101, 85, 74, 90, 76, 79, 88, 66, 87, 78,
+  113, 94, 86, 73, 98, 79, 95, 86, 85, 101,
+  86, 77, 73, 83, 71, 80, 86, 88, 99, 76,
+  93, 76, 85, 64, 74, 86, 83, 93, 84, 93,
+  71, 84, 91, 86, 101, 82, 85, 97, 77, 78,
+  99, 87, 83, 85, 91, 75, 90, 105, 110, 88,
+  82, 81, 91, 61, 103, 80, 70, 81, 108, 90,
+  90, 92, 76, 81, 79, 84, 84, 61, 85, 97,
+  78, 77, 86, 103, 57, 75, 103, 77, 56, 77,
+  87, 72, 88, 102, 65, 77, 74, 69, 77, 96,
+  107, 92, 85, 86, 74, 91, 85, 92, 87, 63,
+  81, 64, 66, 83, 88, 61, 82, 89, 90, 77,
+  72, 79, 90, 82, 116, 88, 86, 100, 91, 86,
+  71, 96, 64, 73, 85, 70, 88, 77, 104, 93,
+  78, 80, 101, 79, 82, 78, 94, 103, 91, 73,
+  71, 78, 66, 82, 83, 85, 82, 81, 92, 74,
+  83, 65, 82, 78, 80, 90, 76, 92, 82, 96,
+  92, 89, 99, 92, 79, 97, 78, 85, 89, 75,
+  84, 80, 85, 79, 83, 88, 93, 97, 76, 86,
+  83, 75, 91, 80, 76, 84, 91, 80, 92, 98,
+  80, 83, 84, 97, 88, 66, 88, 87, 80, 76,
+  83, 89, 66, 79, 98, 87, 70, 80, 83, 75,
+  89, 89, 80, 85, 76, 75, 77, 86, 96, 88,
+  83, 81, 76, 92, 79, 85, 92, 68, 95, 73,
+  76, 91, 95, 72, 86, 83, 97, 80, 72, 75,
+  84, 80, 101, 88, 80, 89, 99, 85, 72, 99,
+  75, 81, 85, 68, 88, 79, 82, 97, 80, 88,
+  98, 79, 93, 89, 85, 98, 82, 77, 72, 82,
+  70, 88, 74, 82, 77, 77, 96, 74, 88, 69,
+  72, 86, 81, 89, 85, 91, 100, 82, 85, 91,
+  85, 92, 81, 85, 80, 90, 86, 73, 80, 76,
+  90, 90, 82, 84, 70, 81, 73, 84, 94, 90,
+  88, 73, 74, 87, 74, 85, 85, 98, 93, 101,
+  85, 86, 80, 63, 86, 75, 75, 81, 71, 90,
+  63, 74, 97, 89, 79, 85, 92, 82, 89, 85,
+  89, 80, 83, 89, 88, 100, 73, 76, 73, 88,
+  74, 86, 68, 91, 98, 64, 82, 83, 69, 86,
+  88, 77, 86, 105, 85, 82, 80, 96, 84, 83,
+  92, 76, 93, 88, 88, 85, 84, 76, 98, 72,
+  82, 71, 79, 83, 100, 90, 84, 77, 83, 79,
+  103, 94, 87, 89, 86, 82, 80, 82, 70, 84,
+  79, 89, 83, 89, 80, 66, 85, 82, 76, 83,
+  92, 89, 71, 85, 93, 81, 92, 95, 88, 90,
+  86, 87, 80, 91, 87, 81, 84, 82, 99, 93,
+  84, 94, 70, 85, 66, 80, 93, 83, 102, 69,
+  72, 91, 87, 87, 79, 96, 101, 89, 77, 79,
+  77, 55, 82, 84, 74, 86, 73, 103, 58, 71,
+  102, 89, 65, 82, 99, 79, 83, 93, 79, 84,
+  82, 87, 88, 94, 81, 76, 70, 92, 72, 91,
+  73, 92, 96, 53, 81, 73, 72, 79, 91, 73,
+  82, 95, 80, 80, 84, 98, 92, 82, 96, 79,
+  84, 86, 85, 91, 83, 75, 89, 56, 76, 75,
+  79, 90, 104, 88, 81, 70, 81, 78, 99, 97,
+  94, 90, 88, 83, 76, 76, 71, 82, 73, 85,
+  77, 97, 73, 63, 88, 73, 76, 82, 91, 84,
+  68, 83, 97, 94, 96, 89, 87, 94, 79, 87,
+  80, 91, 86, 72, 84, 87, 85, 96, 82, 81,
+  72, 93, 68, 85, 89, 89, 91, 75, 76, 85,
+  79, 91, 86, 100, 96, 83, 83, 93, 77, 60,
+  74, 77, 74, 80, 74, 93, 62, 71, 92, 93,
+  78, 85, 91, 76, 89, 89, 87, 83, 83, 91,
+  82, 97, 78, 78, 75, 89, 77, 87, 78, 91,
+  95, 58, 84, 84, 72, 86, 95, 80, 79, 86,
+  84, 82, 82, 94, 83, 85, 95, 87, 86, 86,
+  87, 88, 83, 76, 101, 69, 75, 71, 77, 87,
+  93, 90, 82, 73, 82, 78, 94, 99, 88, 89,
+  84, 84, 73, 80, 69, 82, 75, 90, 86, 89,
+  81, 65, 91, 78, 76, 83, 88, 86, 73, 82,
+  95, 84, 84, 80, 72, 89, 71, 77, 86, 90,
+  73, 74, 86, 71, 81, 92, 79, 69, 58, 81,
+  75, 80, 89, 110, 84, 75, 95, 76, 76, 84,
+  76, 92, 82, 107, 92, 84, 79, 73, 87, 74,
+  72, 67, 85, 71, 75, 88, 75, 81, 102, 91,
+  86, 81, 93, 66, 92, 80, 91, 104, 84, 89,
+  75, 75, 76, 89, 75, 86, 64, 84, 87, 86,
+  90, 85, 89, 93, 73, 86, 80, 88, 96, 82,
+  76, 87, 81, 87, 66, 86, 92, 82, 85, 94,
+  87, 78, 103, 80, 83, 76, 72, 83, 67, 79,
+  79, 85, 78, 85, 103, 89, 67, 70, 80, 92,
+  91, 75, 66, 87, 82, 90, 76, 92, 81, 86,
+  82, 101, 69, 79, 88, 93, 67, 77, 93, 84,
+  77, 88, 68, 84, 74, 76, 82, 99, 74, 77,
+  82, 86, 93, 96, 82, 75, 57, 84, 74, 74,
+  94, 111, 83, 71, 99, 80, 94, 91, 73, 87,
+  85, 98, 95, 77, 77, 81, 79, 80, 69, 65,
+  81, 76, 74, 90, 70, 81, 96, 95, 90, 85,
+  88, 62, 91, 77, 86, 104, 93, 89, 79, 75,
+  70, 90, 74, 89, 67, 82, 94, 84, 82, 83,
+  94, 92, 77, 85, 79, 84, 91, 74, 82, 86,
+  75, 78, 60, 96, 87, 75, 85, 96, 79, 79,
+  104, 73, 79, 80, 71, 91, 85, 69, 78, 78,
+  77, 85, 115, 94, 79, 68, 76, 96, 88, 73,
+  69, 81, 70, 90, 86, 97, 72, 88, 92, 100,
+  67, 76, 90, 95, 65, 75, 94, 85, 84, 84,
+  72, 84, 71, 79, 87, 92, 74, 72, 85, 97,
+  79, 98, 82, 67, 57, 88, 84, 81, 92, 106,
+  74, 73, 97, 76, 84, 96, 75, 91, 84, 95,
+  86, 85, 77, 73, 70, 81, 76, 66, 77, 77,
+  76, 86, 64, 86, 100, 90, 87, 76, 90, 70,
+  91, 83, 94, 102, 85, 88, 74, 76, 76, 87,
+  82, 85, 69, 82, 93, 82, 86, 87, 93, 93,
+  79, 86, 76, 79, 93, 80, 78, 85, 79, 75,
+  69, 99, 93, 79, 85, 88, 83, 77, 107, 77,
+  84, 74, 71, 87, 98, 76, 82, 75, 77, 83,
+  105, 93, 71, 74, 76, 89, 89, 75, 66, 78,
+  77, 93, 99, 92, 80, 93, 101, 95, 70, 79,
+  86, 95, 67, 79, 85, 80, 77, 90, 86, 86,
+  81, 70, 94, 65, 81, 74, 87, 91, 60, 76,
+  81, 91, 107, 82, 87, 83, 90, 69, 95, 96,
+  95, 65, 92, 87, 76, 81, 80, 83, 82, 96,
+  78, 86, 82, 83, 83, 75, 99, 84, 67, 84,
+  86, 96, 80, 87, 75, 81, 87, 77, 90, 80,
+  74, 83, 81, 85, 87, 76, 90, 76, 80, 80,
+  78, 79, 83, 82, 75, 92, 82, 89, 73, 82,
+  81, 87, 102, 73, 92, 78, 82, 90, 97, 94,
+  87, 103, 98, 79, 78, 83, 72, 82, 90, 73,
+  69, 82, 82, 63, 76, 77, 75, 94, 84, 77,
+  86, 82, 79, 92, 95, 83, 48, 98, 71, 69,
+  105, 81, 121, 96, 84, 94, 89, 83, 87, 73,
+  156, 88, 91, 93, 71, 80, 102, 79, 71, 62,
+  89, 41, 76, 77, 87, 94, 59, 72, 83, 98,
+  102, 82, 99, 80, 76, 63, 94, 90, 92, 50,
+  94, 88, 70, 93, 89, 69, 79, 86, 81, 89,
+  80, 80, 83, 67, 91, 84, 65, 79, 83, 83,
+  70, 86, 78, 77, 84, 77, 92, 81, 65, 86,
+  74, 80, 91, 75, 89, 76, 67, 84, 87, 74,
+  86, 89, 81, 89, 75, 87, 68, 71, 81, 82,
+  101, 76, 96, 72, 77, 80, 95, 88, 97, 102,
+  93, 76, 68, 85, 60, 79, 75, 71, 76, 80,
+  83, 75, 76, 91, 62, 93, 96, 82, 82, 80,
+  75, 93, 88, 87, 45, 90, 80, 77, 82, 79,
+  131, 87, 89, 94, 82, 76, 96, 79, 179, 87,
+  81, 92, 81, 90, 82, 98, 74, 78, 92, 72,
+  80, 81, 84, 87, 61, 78, 83, 93, 108, 89,
+  99, 85, 79, 71, 92, 94, 93, 67, 84, 85,
+  81, 81, 83, 79, 82, 115, 82, 91, 82, 84,
+  89, 76, 82, 85, 71, 81, 88, 77, 81, 91,
+  80, 77, 84, 77, 95, 81, 77, 80, 80, 83,
+  93, 81, 88, 72, 78, 80, 79, 86, 81, 78,
+  95, 93, 89, 88, 76, 88, 83, 96, 104, 73,
+  91, 75, 86, 81, 92, 92, 106, 98, 98, 80,
+  79, 81, 73, 83, 85, 73, 72, 81, 80, 70,
+  79, 78, 81, 93, 86, 75, 85, 91, 74, 88,
+  92, 81, 49, 79, 70, 74, 85, 79, 107, 93,
+  88, 95, 94, 88, 81, 74, 140, 86, 82, 71,
+  79, 72, 88, 87, 78, 64, 92, 50, 83, 73,
+  79, 81, 70, 82, 75, 88, 101, 84, 93, 79,
+  80, 71, 94, 97, 90, 63, 99, 83, 77, 82,
+  87, 81, 88, 94, 83, 80, 84, 76, 90, 79,
+  92, 83, 78, 92, 88, 93, 80, 80, 82, 81,
+  85, 90, 92, 90, 74, 88, 85, 87, 84, 79,
+  81, 76, 89, 87, 82, 71, 94, 74, 84, 97,
+  74, 84, 79, 74, 82, 91, 90, 84, 89, 82,
+  85, 86, 92, 78, 80, 93, 97, 82, 80, 83,
+  67, 80, 81, 73, 75, 85, 75, 78, 77, 81,
+  64, 91, 96, 81, 84, 81, 75, 92, 92, 82,
+  54, 99, 69, 71, 89, 90, 113, 86, 81, 88,
+  80, 72, 92, 84, 149, 86, 86, 85, 71, 63,
+  100, 80, 71, 57, 86, 20, 79, 75, 80, 89,
+  74, 88, 73, 97, 96, 84, 96, 82, 79, 62,
+  87, 87, 86, 43, 101, 93, 65, 88, 96, 74,
+  88, 71, 84, 80, 84, 73, 94, 79, 94, 88,
+  84, 85, 81, 86, 72, 82, 82, 78, 79, 91,
+  91, 77, 67, 94, 84, 90, 87, 78, 79, 76,
+  68, 96, 84, 77, 98, 73, 69, 104, 67, 81,
+  81, 59, 86, 82, 85, 92, 93, 81, 73, 76,
+  96, 81, 93, 90, 91, 80, 66, 77, 64, 75,
+  60, 71, 82, 87, 83, 84, 77, 87, 47, 92,
+  100, 86, 85, 81, 72, 89, 89, 88, 50, 88,
+  80, 84, 78, 97, 119, 76, 83, 86, 60, 68,
+  101, 84, 162, 98, 78, 92, 86, 81, 88, 89,
+  75, 66, 88, 55, 80, 79, 81, 93, 73, 83,
+  75, 85, 99, 86, 92, 80, 82, 72, 86, 93,
+  92, 60, 88, 89, 79, 77, 87, 79, 82, 95,
+  82, 80, 83, 77, 91, 78, 89, 85, 79, 88,
+  83, 87, 80, 82, 86, 81, 80, 88, 93, 70,
+  75, 85, 86, 83, 89, 82, 81, 73, 88, 85,
+  82, 77, 95, 77, 85, 95, 80, 86, 82, 80,
+  87, 92, 92, 84, 89, 75, 84, 86, 91, 83,
+  102, 91, 94, 80, 80, 82, 70, 82, 76, 71,
+  75, 85, 82, 76, 79, 77, 73, 91, 95, 86,
+  84, 86, 74, 86, 94, 82, 56, 81, 77, 76,
+  94, 89, 105, 86, 86, 84, 82, 79, 88, 88,
+  130, 85, 82, 75, 76, 76, 83, 80, 83, 73,
+  86, 75, 82, 76, 85, 80, 69, 86, 78, 86,
+  97, 87, 93, 84, 79, 80, 100, 94, 106, 81,
+  83, 77, 78, 89, 89, 85, 82, 93, 84, 78,
+  84, 85, 90, 73, 89, 80, 77, 86, 86, 91,
+  85, 85, 91, 86, 86, 88, 90, 81, 76, 82,
+  89, 82, 85, 78, 89, 78, 90, 88, 83, 82,
+  91, 84, 95, 92, 89, 80, 83, 73, 85, 86,
+  76, 75, 85, 88, 91, 88, 87, 78, 75, 93,
+  91, 88, 80, 91, 76, 81, 87, 72, 71, 82,
+  77, 68, 81, 80, 77, 86, 90, 88, 90, 77,
+  74, 93, 88, 76, 61, 108, 76, 75, 86, 89,
+  103, 85, 81, 90, 87, 79, 89, 97, 128, 80,
+  86, 83, 85, 75, 86, 77, 83, 69, 85, 62,
+  79, 78, 83, 88, 73, 86, 76, 84, 96, 81,
+  91, 83, 85, 76, 84, 93, 108, 73, 87, 85,
+  72, 86, 98, 84, 88, 85, 84, 82, 81, 78,
+  97, 74, 91, 83, 86, 79, 74, 82, 80, 90,
+  91, 85, 87, 84, 97, 85, 67, 81, 78, 77,
+  88, 73, 94, 79, 79, 87, 77, 82, 91, 89,
+  82, 92, 82, 78, 80, 62, 85, 78, 74, 76,
+  88, 87, 89, 83, 91, 79, 87, 91, 91, 86,
+  73, 90, 70, 79, 81, 66, 77, 83, 79, 73,
+  83, 82, 71, 85, 89, 89, 84, 78, 73, 91,
+  82, 82, 57, 90, 84, 77, 86, 94, 103, 81,
+  82, 87, 83, 76, 93, 98, 129, 85, 82, 87,
+  86, 82, 88, 85, 83, 75, 85, 75, 82, 78,
+  86, 90, 69, 86, 80, 82, 96, 82, 92, 83,
+  84, 80, 84, 91, 100, 78, 78, 86, 82, 81,
+  88, 87, 76, 94, 82, 78, 81, 87, 92, 77,
+  91, 83, 81, 80, 78, 85, 89, 83, 94, 84,
+  82, 86, 94, 74, 78, 83, 86, 78, 90, 81,
+  85, 75, 85, 86, 78, 82, 92, 84, 80, 89,
+  88, 83, 86, 77, 87, 88, 79, 74, 86, 85,
+  90, 93, 84, 76, 104, 86, 90, 82, 81, 92,
+  80, 85, 84, 69, 72, 82, 91, 68, 80, 78,
+  82, 84, 91, 92, 83, 82, 75, 89, 79, 77,
+  64, 85, 83, 76, 95, 91, 99, 88, 85, 88,
+  86, 82, 89, 100, 116, 79, 87, 99, 93, 82,
+  91, 88, 80, 70, 71, 99, 73, 83, 94, 83,
+  82, 83, 82, 99, 67, 77, 70, 72, 82, 87,
+  100, 83, 77, 79, 94, 84, 84, 92, 83, 91,
+  86, 88, 83, 76, 89, 90, 80, 93, 89, 77,
+  83, 73, 91, 73, 81, 81, 82, 85, 89, 63,
+  79, 82, 87, 87, 66, 86, 94, 83, 81, 81,
+  88, 90, 81, 76, 72, 91, 69, 91, 80, 81,
+  90, 77, 84, 97, 84, 81, 76, 80, 76, 99,
+  89, 81, 82, 89, 88, 79, 66, 82, 84, 84,
+  86, 78, 75, 92, 81, 74, 72, 85, 79, 81,
+  87, 93, 87, 80, 75, 113, 69, 85, 79, 79,
+  80, 87, 75, 94, 84, 78, 70, 95, 37, 86,
+  81, 94, 69, 87, 70, 97, 107, 84, 95, 98,
+  83, 84, 75, 93, 80, 84, 83, 83, 84, 86,
+  81, 88, 93, 72, 55, 85, 62, 84, 107, 89,
+  85, 73, 92, 80, 81, 100, 74, 76, 87, 99,
+  78, 76, 94, 74, 80, 87, 108, 81, 78, 85,
+  90, 54, 77, 78, 89, 95, 80, 78, 90, 82,
+  84, 82, 73, 89, 89, 81, 85, 69, 82, 82,
+  86, 79, 68, 79, 89, 94, 67, 83, 80, 76,
+  75, 100, 80, 85, 84, 79, 98, 127, 76, 84,
+  85, 80, 87, 91, 72, 80, 73, 85, 85, 70,
+  76, 88, 55, 85, 80, 71, 83, 78, 80, 83,
+  92, 90, 88, 93, 69, 86, 86, 91, 76, 85,
+  67, 89, 92, 72, 76, 84, 65, 82, 86, 88,
+  83, 83, 48, 92, 123, 93, 73, 107, 82, 92,
+  89, 82, 95, 86, 70, 92, 80, 96, 74, 71,
+  100, 91, 64, 111, 59, 88, 107, 85, 88, 81,
+  80, 83, 75, 102, 82, 85, 88, 104, 75, 101,
+  91, 68, 105, 80, 105, 96, 69, 91, 91, 61,
+  96, 86, 89, 101, 87, 99, 100, 91, 96, 77,
+  109, 83, 79, 104, 90, 83, 75, 81, 103, 99,
+  88, 79, 88, 84, 57, 72, 84, 83, 65, 117,
+  94, 80, 85, 90, 116, 138, 88, 82, 90, 90,
+  78, 91, 105, 79, 72, 83, 82, 75, 87, 84,
+  68, 148, 89, 66, 95, 82, 107, 88, 82, 100,
+  86, 61, 75, 91, 110, 88, 92, 98, 71, 70,
+  97, 103, 82, 65, 105, 75, 87, 85, 102, 91,
+  83, 82, 84, 79, 89, 91, 81, 75, 69, 100,
+  75, 80, 88, 80, 76, 84, 78, 99, 68, 77,
+  80, 75, 82, 88, 84, 82, 84, 77, 88, 92,
+  87, 88, 81, 86, 87, 87, 83, 81, 83, 82,
+  81, 92, 95, 79, 96, 82, 80, 78, 76, 79,
+  79, 73, 86, 65, 87, 74, 86, 92, 63, 85,
+  93, 87, 89, 81, 80, 93, 75, 78, 75, 95,
+  69, 85, 86, 85, 82, 81, 89, 90, 79, 84,
+  79, 84, 66, 87, 85, 80, 86, 88, 94, 82,
+  70, 88, 83, 85, 88, 82, 82, 85, 71, 69,
+  76, 88, 80, 84, 82, 71, 88, 86, 83, 111,
+  88, 92, 80, 79, 75, 81, 84, 92, 78, 89,
+  74, 95, 37, 87, 83, 92, 72, 87, 76, 86,
+  100, 80, 91, 96, 84, 87, 67, 95, 81, 78,
+  82, 77, 77, 81, 81, 92, 92, 73, 59, 81,
+  63, 83, 86, 92, 88, 73, 88, 78, 84, 89,
+  76, 76, 91, 95, 78, 73, 80, 72, 79, 91,
+  116, 77, 98, 83, 75, 63, 73, 76, 87, 84,
+  73, 77, 87, 80, 80, 84, 67, 85, 85, 85,
+  96, 66, 77, 82, 72, 78, 65, 78, 79, 90,
+  75, 92, 70, 79, 79, 95, 83, 93, 89, 79,
+  90, 114, 73, 83, 85, 77, 90, 86, 71, 85,
+  65, 86, 82, 78, 78, 89, 49, 74, 80, 80,
+  75, 80, 79, 69, 93, 88, 101, 91, 87, 86,
+  76, 97, 68, 78, 68, 92, 80, 81, 73, 89,
+  61, 84, 83, 86, 78, 84, 45, 88, 110, 94,
+  76, 100, 84, 87, 83, 91, 91, 84, 73, 78,
+  74, 88, 73, 72, 101, 85, 69, 113, 57, 80,
+  95, 89, 90, 81, 75, 75, 79, 95, 81, 84,
+  86, 107, 68, 101, 84, 73, 108, 79, 113, 100,
+  81, 76, 75, 66, 82, 84, 82, 104, 83, 105,
+  98, 94, 90, 77, 99, 85, 84, 106, 107, 79,
+  90, 85, 87, 103, 83, 82, 96, 81, 54, 86,
+  79, 79, 71, 115, 101, 81, 87, 86, 107, 127,
+  83, 80, 87, 88, 78, 83, 92, 82, 71, 80,
+  80, 81, 87, 85, 59, 129, 94, 78, 87, 82,
+  97, 73, 90, 103, 108, 58, 90, 94, 96, 97,
+  82, 96, 70, 78, 87, 99, 82, 71, 101, 77,
+  88, 86, 102, 84, 89, 78, 78, 84, 90, 91,
+  79, 77, 69, 94, 72, 72, 89, 77, 75, 87,
+  71, 95, 68, 74, 85, 73, 80, 88, 85, 79,
+  85, 73, 98, 83, 91, 93, 80, 86, 95, 82,
+  84, 80, 86, 87, 83, 94, 81, 77, 92, 79,
+  82, 75, 79, 78, 77, 65, 92, 60, 85, 77,
+  85, 86, 65, 91, 90, 84, 79, 87, 76, 91,
+  72, 81, 76, 83, 80, 89, 83, 81, 81, 87,
+  96, 94, 76, 77, 74, 79, 73, 93, 89, 82,
+  92, 81, 94, 86, 76, 88, 87, 86, 86, 85,
+  80, 80, 77, 66, 76, 90, 83, 86, 84, 79,
+  89, 88, 78, 106, 89, 89, 80, 84, 78, 85,
+  78, 91, 81, 90, 69, 89, 42, 88, 82, 83,
+  77, 79, 79, 78, 94, 81, 91, 96, 79, 84,
+  70, 92, 75, 77, 81, 79, 81, 82, 75, 94,
+  77, 72, 67, 84, 69, 85, 78, 84, 84, 73,
+  85, 72, 83, 94, 69, 75, 89, 89, 80, 71,
+  85, 80, 81, 89, 93, 74, 97, 80, 73, 66,
+  79, 77, 78, 81, 79, 67, 83, 80, 78, 79,
+  71, 88, 84, 84, 80, 79, 80, 88, 70, 78,
+  66, 81, 77, 90, 79, 90, 70, 80, 83, 88,
+  80, 86, 85, 75, 80, 105, 78, 83, 87, 74,
+  83, 86, 68, 86, 73, 88, 80, 83, 73, 91,
+  61, 68, 75, 89, 78, 80, 82, 78, 88, 87,
+  85, 100, 87, 80, 77, 87, 77, 80, 68, 90,
+  80, 85, 64, 92, 51, 87, 74, 79, 75, 73,
+  57, 90, 89, 92, 82, 84, 81, 87, 82, 91,
+  75, 88, 79, 72, 76, 87, 74, 81, 89, 74,
+  76, 94, 68, 78, 91, 89, 90, 80, 90, 63,
+  83, 90, 77, 79, 83, 100, 73, 84, 89, 80,
+  85, 79, 96, 89, 81, 82, 74, 69, 84, 77,
+  76, 89, 79, 92, 84, 88, 83, 74, 98, 86,
+  91, 95, 89, 77, 82, 81, 82, 88, 81, 80,
+  88, 79, 70, 98, 74, 83, 74, 103, 95, 82,
+  86, 81, 97, 116, 73, 84, 89, 83, 73, 89,
+  84, 86, 79, 85, 82, 85, 80, 93, 72, 88,
+  84, 79, 81, 80, 93, 73, 97, 93, 108, 73,
+  87, 82, 86, 89, 80, 86, 69, 88, 81, 85,
+  76, 84, 87, 80, 79, 85, 87, 72, 77, 77,
+  85, 87, 93, 80, 102, 75, 77, 95, 76, 100,
+  74, 86, 115, 70, 76, 114, 79, 88, 90, 75,
+  70, 98, 101, 91, 85, 69, 94, 86, 86, 74,
+  73, 74, 76, 73, 77, 80, 90, 97, 73, 91,
+  88, 116, 83, 69, 93, 81, 64, 106, 83, 66,
+  89, 90, 88, 78, 95, 85, 73, 96, 72, 75,
+  70, 78, 81, 71, 94, 78, 92, 85, 77, 82,
+  82, 92, 96, 92, 74, 74, 88, 68, 87, 78,
+  93, 71, 74, 77, 93, 71, 80, 88, 99, 80,
+  77, 78, 82, 91, 77, 70, 93, 74, 79, 78,
+  85, 71, 77, 86, 97, 86, 77, 81, 112, 96,
+  79, 89, 84, 75, 90, 85, 72, 86, 83, 70,
+  90, 70, 75, 93, 85, 87, 76, 88, 82, 88,
+  96, 76, 97, 70, 77, 99, 74, 102, 77, 87,
+  113, 73, 73, 110, 75, 93, 89, 76, 68, 99,
+  99, 87, 83, 69, 84, 79, 85, 78, 68, 78,
+  75, 74, 79, 84, 92, 96, 76, 95, 95, 122,
+  88, 67, 91, 80, 65, 105, 79, 62, 81, 89,
+  93, 82, 92, 91, 74, 92, 76, 78, 75, 74,
+  81, 73, 93, 82, 95, 85, 80, 84, 80, 87,
+  93, 89, 76, 79, 91, 69, 86, 75, 86, 71,
+  76, 82, 89, 69, 82, 88, 89, 83, 76, 80,
+  87, 91, 80, 74, 90, 74, 78, 78, 87, 74,
+  77, 89, 94, 90, 72, 74, 107, 95, 80, 93,
+  86, 77, 83, 88, 76, 85, 63, 68, 71, 74,
+  71, 90, 93, 88, 79, 92, 78, 84, 91, 74,
+  96, 72, 80, 89, 80, 95, 76, 91, 106, 76,
+  80, 106, 80, 86, 84, 78, 73, 97, 92, 86,
+  88, 70, 89, 77, 83, 75, 75, 76, 81, 70,
+  78, 78, 90, 97, 73, 84, 95, 110, 83, 71,
+  91, 82, 64, 98, 84, 71, 78, 91, 91, 83,
+  97, 92, 78, 92, 71, 74, 75, 80, 83, 71,
+  93, 76, 94, 87, 85, 80, 79, 91, 95, 92,
+  73, 84, 94, 69, 86, 80, 95, 80, 71, 83,
+  85, 75, 78, 93, 92, 84, 76, 79, 85, 86,
+  86, 73, 84, 80, 79, 73, 82, 72, 76, 86,
+  99, 83, 88, 82, 101, 98, 76, 96, 80, 74,
+  83, 86, 75, 87, 66, 71, 88, 73, 75, 92,
+  82, 88, 77, 75, 88, 88, 92, 83, 101, 77,
+  78, 90, 84, 102, 79, 91, 114, 76, 80, 116,
+  82, 88, 93, 75, 78, 89, 95, 84, 72, 73,
+  81, 75, 84, 79, 67, 79, 73, 77, 85, 79,
+  93, 95, 71, 88, 92, 124, 95, 64, 90, 84,
+  73, 112, 82, 68, 80, 93, 87, 80, 91, 81,
+  69, 88, 73, 78, 74, 80, 79, 75, 83, 74,
+  92, 84, 80, 84, 89, 88, 89, 90, 78, 79,
+  79, 71, 84, 89, 86, 69, 80, 85, 97, 67,
+  79, 67, 97, 79, 69, 81, 84, 96, 77, 78,
+  95, 79, 75, 82, 94, 73, 81, 77, 98, 90,
+  73, 74, 108, 92, 86, 90, 84, 79, 87, 87,
+  69, 82, 68, 73, 77, 82, 79, 90, 85, 87,
+  79, 78, 83, 93, 97, 80, 96, 73, 75, 96,
+  83, 102, 80, 93, 107, 76, 74, 109, 79, 89,
+  90, 76, 73, 89, 94, 74, 73, 75, 70, 78,
+  82, 83, 64, 86, 76, 80, 87, 82, 94, 94,
+  75, 90, 95, 126, 99, 60, 91, 83, 77, 113,
+  76, 72, 73, 92, 94, 81, 89, 85, 72, 83,
+  76, 82, 80, 77, 80, 76, 80, 78, 96, 88,
+  84, 87, 86, 80, 83, 86, 79, 82, 84, 71,
+  85, 82, 78, 67, 78, 90, 94, 68, 83, 61,
+  89, 79, 73, 83, 90, 94, 79, 80, 91, 80,
+  75, 86, 95, 76, 84, 79, 98, 94, 69, 67,
+  102, 92, 89, 95, 85, 83, 86, 88, 73, 85,
+  50, 72, 59, 89, 76, 91, 91, 90, 79, 83,
+  80, 89, 87, 78, 96, 75, 78, 87, 88, 98,
+  78, 94, 105, 83, 82, 109, 78, 87, 85, 78,
+  77, 89, 91, 79, 72, 75, 76, 75, 84, 79,
+  70, 81, 76, 78, 84, 80, 91, 93, 73, 85,
+  95, 117, 92, 66, 90, 85, 74, 103, 85, 73,
+  74, 95, 87, 80, 93, 88, 74, 86, 75, 80,
+  79, 83, 80, 77, 86, 76, 94, 81, 85, 83,
+  82, 86, 85, 88, 78, 83, 81, 75, 85, 93,
+  84, 80, 77, 90, 89, 72, 78, 75, 90, 80,
+  71, 81, 85, 92, 82, 80, 84, 84, 75, 80,
+  92, 75, 81, 78, 99, 86, 80, 76, 97, 94,
+  84, 93, 82, 81, 83, 86, 75, 84, 57, 76,
+  82, 84, 77, 90, 83, 87, 77, 78, 85, 87,
+  91, 84, 106, 76, 81, 79, 81, 106, 76, 93,
+  111, 78, 85, 119, 82, 86, 94, 73, 78, 79,
+  91, 87, 75, 74, 85, 78, 85, 82, 74, 77,
+  68, 76, 86, 81, 89, 87, 75, 82, 88, 119,
+  96, 67, 94, 84, 73, 101, 75, 74, 75, 96,
+  85, 81, 93, 81, 80, 76, 78, 72, 76, 81,
+  82, 76, 82, 74, 83, 86, 84, 76, 87, 83,
+  85, 90, 79, 75, 84, 67, 89, 80, 80, 71,
+  80, 88, 99, 72, 82, 75, 95, 91, 74, 73,
+  80, 93, 80, 79, 99, 83, 81, 82, 88, 72,
+  87, 80, 100, 89, 88, 78, 101, 88, 82, 85,
+  86, 85, 83, 86, 68, 80, 72, 72, 82, 77,
+  78, 85, 85, 84, 78, 81, 84, 90, 94, 80,
+  103, 76, 77, 86, 81, 106, 74, 89, 110, 77,
+  83, 115, 79, 89, 87, 72, 72, 78, 91, 85,
+  75, 77, 74, 78, 85, 82, 75, 82, 73, 79,
+  90, 82, 88, 84, 79, 84, 88, 117, 101, 61,
+  96, 81, 78, 102, 70, 71, 71, 94, 88, 82,
+  91, 82, 81, 76, 80, 78, 79, 81, 80, 76,
+  84, 81, 84, 88, 82, 79, 87, 75, 83, 89,
+  78, 79, 92, 67, 89, 71, 75, 69, 79, 90,
+  93, 74, 83, 73, 93, 89, 76, 81, 84, 94,
+  84, 81, 92, 84, 83, 87, 90, 76, 89, 80,
+  101, 91, 92, 73, 97, 90, 85, 91, 84, 88,
+  78, 88, 71, 82, 59, 75, 75, 80, 76, 88,
+  88, 86, 76, 79, 87, 88, 84, 76, 100, 76,
+  82, 77, 84, 102, 75, 90, 105, 86, 87, 115,
+  76, 87, 85, 77, 79, 81, 93, 82, 74, 78,
+  80, 72, 86, 81, 77, 79, 72, 79, 87, 80,
+  89, 84, 80, 81, 92, 112, 94, 66, 96, 82,
+  73, 98, 79, 76, 71, 97, 86, 82, 95, 87,
+  83, 78, 78, 79, 80, 84, 82, 77, 88, 76,
+  87, 89, 84, 76, 83, 81, 82, 87, 78, 85,
+  88, 70, 88, 84, 82, 82, 77, 90, 86, 79,
+  80, 82, 93, 87, 75, 73, 79, 94, 82, 79,
+  85, 91, 84, 81, 89, 74, 84, 78, 100, 85,
+  92, 77, 95, 89, 80, 91, 84, 85, 77, 84,
+  72, 84, 65, 74, 85, 79, 79, 85, 82, 86,
+  72, 72, 75, 89, 87, 81, 80, 92, 90, 84,
+  84, 155, 112, 92, 70, 79, 62, 60, 91, 74,
+  89, 94, 82, 77, 76, 76, 73, 89, 92, 89,
+  107, 88, 68, 96, 98, 89, 73, 90, 94, 76,
+  90, 73, 54, 76, 65, 73, 79, 73, 84, 75,
+  86, 91, 86, 87, 81, 96, 73, 60, 97, 93,
+  90, 92, 81, 105, 90, 49, 97, 88, 93, 111,
+  69, 84, 75, 80, 74, 74, 107, 69, 73, 82,
+  86, 118, 64, 75, 73, 93, 83, 98, 61, 95,
+  82, 90, 79, 70, 78, 75, 104, 104, 82, 77,
+  91, 67, 77, 70, 82, 74, 81, 82, 86, 85,
+  96, 62, 81, 88, 88, 94, 67, 77, 93, 66,
+  110, 106, 73, 88, 85, 92, 74, 81, 75, 81,
+  71, 82, 90, 62, 79, 86, 87, 85, 86, 144,
+  105, 87, 76, 86, 74, 68, 88, 80, 54, 87,
+  68, 75, 79, 78, 76, 89, 93, 87, 109, 107,
+  71, 92, 97, 90, 86, 89, 91, 78, 93, 87,
+  89, 77, 71, 69, 84, 74, 74, 76, 92, 93,
+  84, 90, 80, 87, 74, 65, 101, 94, 89, 88,
+  80, 99, 83, 64, 89, 84, 87, 100, 81, 83,
+  70, 81, 80, 73, 101, 80, 81, 77, 90, 108,
+  73, 70, 76, 90, 72, 95, 72, 97, 81, 102,
+  87, 72, 81, 72, 107, 109, 67, 74, 97, 98,
+  81, 71, 76, 73, 75, 84, 84, 85, 100, 68,
+  82, 78, 92, 77, 64, 79, 94, 64, 86, 97,
+  72, 89, 84, 85, 81, 83, 72, 85, 75, 91,
+  95, 81, 85, 78, 72, 91, 79, 81, 64, 89,
+  70, 89, 75, 80, 91, 82, 92, 65, 84, 94,
+  87, 90, 79, 87, 94, 78, 70, 92, 70, 82,
+  90, 85, 75, 87, 79, 80, 82, 80, 75, 81,
+  78, 86, 82, 107, 89, 81, 92, 81, 82, 83,
+  87, 84, 75, 79, 79, 75, 84, 103, 71, 73,
+  96, 70, 83, 85, 94, 86, 84, 86, 103, 86,
+  88, 100, 79, 83, 92, 86, 89, 81, 93, 78,
+  76, 74, 91, 90, 83, 94, 87, 92, 88, 78,
+  110, 84, 91, 81, 78, 90, 83, 83, 80, 75,
+  89, 74, 67, 75, 80, 62, 90, 78, 81, 79,
+  78, 94, 95, 87, 68, 82, 91, 71, 80, 81,
+  91, 89, 80, 80, 84, 80, 60, 76, 87, 77,
+  85, 118, 101, 79, 75, 185, 114, 87, 76, 69,
+  76, 71, 91, 76, 103, 100, 75, 73, 76, 81,
+  72, 81, 98, 77, 114, 84, 74, 105, 98, 85,
+  85, 92, 97, 78, 79, 86, 68, 83, 76, 84,
+  73, 78, 82, 77, 86, 90, 96, 89, 81, 108,
+  75, 45, 102, 79, 75, 84, 90, 98, 76, 50,
+  85, 86, 89, 83, 75, 78, 74, 80, 84, 64,
+  96, 74, 72, 89, 89, 124, 77, 67, 80, 89,
+  81, 97, 61, 80, 73, 76, 72, 64, 75, 78,
+  90, 105, 93, 68, 79, 76, 86, 69, 83, 97,
+  91, 91, 86, 104, 102, 71, 82, 82, 93, 77,
+  61, 78, 89, 70, 94, 102, 78, 95, 80, 84,
+  73, 89, 84, 89, 82, 72, 88, 60, 83, 101,
+  99, 80, 75, 161, 110, 109, 83, 78, 83, 80,
+  85, 80, 55, 84, 70, 70, 82, 81, 72, 83,
+  93, 94, 104, 97, 76, 91, 89, 84, 95, 89,
+  93, 79, 86, 83, 110, 85, 78, 76, 85, 65,
+  72, 80, 87, 85, 95, 95, 77, 87, 76, 54,
+  95, 80, 77, 82, 87, 93, 75, 60, 95, 80,
+  77, 91, 69, 81, 67, 76, 85, 63, 90, 80,
+  61, 80, 94, 110, 84, 84, 76, 99, 69, 92,
+  69, 89, 75, 75, 76, 65, 64, 77, 87, 109,
+  73, 64, 89, 74, 86, 72, 77, 95, 88, 85,
+  84, 101, 97, 75, 83, 76, 98, 69, 78, 79,
+  96, 71, 77, 94, 75, 93, 81, 82, 79, 88,
+  75, 99, 72, 84, 89, 75, 90, 84, 78, 84,
+  82, 99, 69, 100, 81, 83, 78, 80, 80, 79,
+  88, 72, 83, 93, 86, 87, 74, 80, 95, 81,
+  64, 84, 71, 84, 89, 87, 77, 86, 76, 86,
+  86, 84, 88, 80, 84, 85, 78, 107, 90, 83,
+  93, 81, 89, 85, 75, 80, 78, 73, 76, 73,
+  77, 102, 83, 76, 85, 74, 87, 78, 88, 82,
+  80, 89, 99, 82, 87, 88, 75, 82, 79, 91,
+  96, 83, 90, 85, 73, 86, 87, 86, 80, 90,
+  77, 82, 84, 75, 92, 84, 80, 87, 75, 84,
+  82, 72, 80, 74, 87, 79, 74, 80, 78, 74,
+  86, 79, 80, 85, 84, 77, 105, 87, 62, 83,
+  85, 69, 78, 79, 89, 90, 70, 80, 76, 75,
+  67, 79, 85, 77, 84, 103, 86, 83, 88, 124,
+  97, 79, 64, 75, 79, 79, 98, 82, 100, 90,
+  71, 82, 81, 94, 86, 83, 86, 73, 107, 88,
+  80, 96, 86, 90, 86, 88, 83, 83, 73, 80,
+  76, 72, 81, 78, 70, 91, 87, 77, 85, 92,
+  93, 78, 87, 90, 79, 51, 100, 83, 72, 86,
+  87, 101, 83, 63, 85, 94, 85, 77, 84, 77,
+  101, 90, 82, 78, 76, 69, 88, 87, 80, 104,
+  80, 82, 82, 84, 82, 89, 68, 80, 76, 83,
+  87, 80, 81, 77, 91, 87, 78, 89, 87, 90,
+  89, 71, 85, 89, 80, 98, 84, 85, 96, 81,
+  75, 87, 87, 83, 60, 79, 81, 86, 86, 87,
+  78, 90, 91, 86, 80, 87, 76, 90, 79, 77,
+  83, 61, 80, 89, 82, 80, 84, 108, 97, 97,
+  71, 79, 86, 84, 89, 81, 65, 81, 75, 79,
+  84, 91, 86, 86, 80, 95, 98, 91, 82, 86,
+  79, 84, 95, 87, 92, 82, 80, 79, 101, 76,
+  81, 75, 80, 66, 82, 79, 87, 89, 90, 83,
+  82, 75, 81, 61, 95, 87, 78, 85, 83, 100,
+  82, 70, 95, 93, 79, 89, 66, 80, 94, 83,
+  84, 75, 78, 85, 77, 82, 85, 96, 86, 91,
+  83, 97, 72, 86, 73, 84, 79, 75, 87, 77,
+  73, 78, 86, 92, 85, 84, 91, 84, 88, 74,
+  82, 96, 81, 91, 84, 88, 87, 81, 78, 77,
+  94, 84, 93, 81, 89, 87, 86, 92, 71, 89,
+  89, 87, 83, 88, 77, 97, 71, 88, 80, 82,
+  89, 80, 71, 85, 83, 69, 78, 90, 68, 80,
+  77, 85, 89, 78, 84, 76, 90, 90, 80, 90,
+  85, 84, 84, 81, 81, 83, 72, 86, 86, 81,
+  78, 81, 83, 81, 87, 85, 81, 82, 84, 79,
+  83, 98, 89, 75, 91, 92, 90, 78, 87, 80,
+  86, 76, 78, 79, 83, 85, 84, 80, 87, 79,
+  85, 81, 90, 79, 90, 83, 109, 80, 81, 94,
+  72, 88, 81, 86, 89, 71, 91, 79, 80, 89,
+  88, 82, 85, 89, 85, 89, 91, 81, 95, 80,
+  84, 80, 85, 90, 80, 87, 87, 76, 83, 80,
+  74, 90, 87, 79, 83, 78, 80, 86, 88, 84,
+  109, 85, 72, 88, 91, 78, 75, 81, 92, 92,
+  75, 82, 73, 91, 85, 74, 79, 79, 66, 82,
+  96, 86, 83, 96, 81, 91, 66, 87, 67, 63,
+  79, 95, 85, 82, 92, 84, 83, 68, 96, 92,
+  93, 72, 92, 85, 78, 81, 74, 84, 120, 75,
+  98, 79, 79, 82, 76, 75, 80, 88, 82, 72,
+  70, 76, 65, 82, 77, 77, 88, 101, 80, 74,
+  87, 75, 95, 82, 85, 81, 67, 74, 102, 100,
+  87, 108, 80, 80, 81, 83, 75, 82, 74, 79,
+  70, 64, 86, 92, 73, 88, 79, 86, 75, 112,
+  71, 95, 89, 102, 79, 74, 93, 59, 80, 83,
+  77, 100, 88, 86, 101, 76, 88, 97, 63, 96,
+  82, 86, 85, 77, 77, 90, 87, 104, 76, 77,
+  80, 92, 96, 84, 80, 89, 80, 82, 86, 87,
+  95, 83, 82, 80, 82, 82, 72, 77, 93, 82,
+  86, 95, 76, 107, 72, 92, 69, 68, 90, 86,
+  81, 80, 91, 81, 78, 74, 98, 93, 96, 71,
+  97, 88, 76, 88, 81, 78, 120, 74, 86, 81,
+  75, 92, 77, 80, 81, 81, 91, 60, 59, 69,
+  71, 99, 81, 72, 93, 92, 84, 76, 84, 68,
+  90, 77, 97, 87, 66, 81, 86, 84, 89, 103,
+  92, 76, 70, 75, 74, 80, 70, 73, 71, 68,
+  86, 89, 63, 81, 76, 84, 82, 100, 63, 94,
+  88, 112, 85, 79, 99, 66, 89, 91, 78, 80,
+  74, 79, 105, 78, 90, 87, 65, 91, 83, 88,
+  86, 66, 69, 84, 98, 84, 84, 68, 65, 93,
+  100, 74, 80, 80, 85, 83, 89, 75, 78, 69,
+  70, 80, 83, 80, 72, 79, 92, 85, 83, 93,
+  83, 100, 73, 81, 67, 69, 81, 88, 83, 78,
+  87, 86, 82, 72, 100, 95, 85, 69, 101, 80,
+  82, 92, 87, 83, 121, 82, 72, 82, 75, 85,
+  78, 78, 79, 87, 84, 77, 66, 77, 65, 88,
+  79, 78, 89, 71, 82, 72, 88, 73, 93, 78,
+  88, 81, 69, 78, 93, 101, 93, 111, 78, 79,
+  78, 76, 76, 78, 81, 75, 76, 65, 86, 89,
+  74, 89, 80, 80, 86, 99, 70, 104, 84, 112,
+  80, 75, 94, 68, 79, 83, 87, 94, 81, 97,
+  103, 80, 98, 95, 65, 94, 85, 89, 86, 73,
+  77, 86, 97, 98, 83, 78, 74, 93, 95, 85,
+  84, 84, 83, 85, 91, 89, 74, 94, 83, 65,
+  90, 94, 85, 77, 80, 80, 82, 93, 72, 123,
+  81, 71, 72, 66, 79, 86, 82, 85, 100, 82,
+  87, 75, 87, 82, 95, 76, 102, 88, 90, 71,
+  69, 103, 106, 90, 82, 79, 84, 88, 90, 71,
+  82, 74, 81, 72, 87, 84, 75, 80, 82, 82,
+  84, 87, 77, 62, 84, 85, 100, 85, 92, 75,
+  95, 78, 80, 111, 77, 86, 64, 103, 64, 76,
+  82, 87, 77, 71, 77, 78, 81, 80, 78, 69,
+  70, 86, 87, 99, 71, 106, 76, 75, 93, 104,
+  78, 74, 78, 98, 97, 83, 74, 90, 95, 74,
+  91, 93, 79, 79, 84, 81, 80, 72, 67, 94,
+  99, 105, 64, 98, 70, 94, 98, 90, 91, 77,
+  72, 74, 84, 88, 90, 85, 56, 71, 84, 82,
+  88, 77, 75, 73, 87, 93, 78, 97, 88, 79,
+  79, 79, 95, 72, 80, 73, 89, 82, 93, 80,
+  82, 81, 89, 72, 111, 106, 85, 68, 75, 74,
+  84, 101, 85, 79, 74, 88, 83, 76, 81, 81,
+  83, 61, 78, 85, 75, 84, 81, 84, 81, 84,
+  86, 65, 82, 99, 114, 74, 91, 87, 80, 76,
+  88, 117, 77, 70, 66, 88, 62, 78, 73, 82,
+  72, 69, 79, 83, 83, 71, 75, 77, 57, 75,
+  91, 69, 67, 121, 72, 75, 96, 129, 71, 80,
+  77, 124, 93, 73, 67, 72, 87, 76, 85, 100,
+  78, 67, 70, 82, 73, 74, 72, 89, 84, 92,
+  69, 105, 55, 94, 106, 79, 86, 76, 66, 74,
+  96, 84, 81, 73, 55, 77, 89, 90, 86, 75,
+  81, 78, 86, 88, 81, 76, 84, 74, 72, 80,
+  85, 81, 88, 78, 100, 82, 95, 77, 84, 82,
+  85, 74, 101, 96, 86, 83, 85, 89, 104, 97,
+  96, 81, 80, 85, 87, 75, 82, 81, 84, 83,
+  81, 89, 70, 86, 82, 88, 79, 93, 76, 64,
+  83, 80, 97, 74, 86, 77, 86, 79, 84, 118,
+  73, 87, 87, 97, 62, 75, 74, 86, 79, 74,
+  81, 79, 86, 74, 79, 97, 74, 73, 91, 90,
+  74, 110, 75, 85, 89, 101, 85, 80, 80, 94,
+  89, 84, 73, 80, 91, 79, 89, 95, 78, 75,
+  74, 81, 79, 74, 72, 86, 85, 111, 83, 99,
+  69, 85, 91, 84, 94, 78, 72, 78, 92, 84,
+  78, 98, 90, 80, 100, 96, 87, 86, 79, 81,
+  87, 77, 71, 86, 86, 76, 77, 75, 81, 90,
+  79, 83, 90, 90, 84, 78, 81, 81, 89, 79,
+  98, 86, 101, 79, 82, 106, 80, 84, 92, 80,
+  87, 77, 84, 82, 83, 85, 85, 76, 87, 91,
+  78, 85, 78, 91, 96, 97, 81, 70, 84, 90,
+  96, 103, 76, 81, 96, 80, 79, 99, 82, 77,
+  79, 87, 81, 77, 92, 80, 72, 86, 82, 83,
+  90, 73, 99, 74, 77, 74, 83, 84, 90, 100,
+  92, 78, 89, 107, 88, 78, 85, 88, 98, 80,
+  76, 93, 84, 87, 81, 92, 90, 87, 86, 79,
+  82, 76, 78, 85, 86, 90, 84, 91, 72, 89,
+  89, 77, 80, 84, 69, 86, 77, 88, 80, 84,
+  70, 90, 89, 98, 91, 89, 72, 70, 89, 74,
+  83, 84, 101, 85, 87, 86, 78, 81, 79, 79,
+  96, 80, 85, 80, 80, 74, 84, 77, 106, 83,
+  94, 74, 74, 77, 73, 67, 85, 70, 80, 81,
+  86, 88, 75, 91, 82, 77, 87, 86, 78, 90,
+  75, 89, 93, 83, 83, 72, 80, 110, 107, 88,
+  77, 87, 96, 84, 87, 105, 84, 79, 75, 74,
+  72, 84, 84, 72, 71, 88, 78, 89, 90, 73,
+  99, 77, 71, 71, 87, 66, 89, 99, 81, 85,
+  82, 127, 82, 84, 82, 105, 82, 73, 73, 86,
+  74, 89, 77, 101, 98, 81, 70, 67, 83, 78,
+  84, 88, 90, 86, 96, 90, 64, 88, 84, 73,
+  67, 89, 57, 87, 79, 81, 75, 79, 73, 93,
+  96, 90, 87, 81, 80, 79, 92, 77, 80, 95,
+  95, 81, 75, 79, 80, 86, 86, 77, 100, 85,
+  90, 76, 81, 80, 83, 89, 93, 90, 93, 80,
+  82, 84, 78, 85, 81, 73, 91, 78, 79, 77,
+  83, 91, 86, 95, 86, 92, 81, 87, 79, 95,
+  94, 78, 76, 69, 79, 90, 97, 89, 80, 81,
+  94, 80, 95, 101, 84, 76, 86, 89, 73, 76,
+  86, 86, 80, 80, 77, 85, 97, 77, 94, 91,
+  75, 74, 81, 80, 93, 102, 85, 80, 87, 108,
+  93, 81, 87, 86, 86, 76, 78, 74, 83, 90,
+  87, 100, 87, 87, 79, 76, 87, 75, 83, 83,
+  93, 96, 98, 90, 78, 82, 79, 74, 82, 86,
+  66, 86, 82, 87, 76, 91, 98, 75, 73, 83,
+  115, 93, 78, 85, 85, 72, 94, 75, 96, 89,
+  90, 86, 89, 82, 76, 87, 82, 83, 83, 75,
+  76, 82, 91, 81, 90, 76, 82, 68, 83, 86,
+  91, 80, 84, 90, 73, 87, 80, 100, 82, 94,
+  84, 81, 80, 95, 97, 96, 90, 87, 74, 97,
+  77, 93, 90, 89, 73, 84, 81, 91, 92, 78,
+  74, 73, 84, 84, 87, 74, 78, 78, 81, 82,
+  98, 74, 83, 99, 99, 83, 74, 69, 84, 78,
+  80, 66, 94, 89, 83, 71, 74, 66, 78, 84,
+  82, 87, 83, 97, 105, 81, 84, 76, 78, 84,
+  76, 91, 84, 74, 78, 87, 89, 80, 80, 80,
+  74, 84, 85, 96, 106, 77, 75, 88, 111, 78,
+  78, 87, 77, 81, 100, 80, 81, 79, 115, 84,
+  76, 80, 79, 81, 113, 81, 97, 91, 95, 87,
+  85, 78, 86, 91, 80, 82, 85, 69, 72, 79,
+  81, 76, 97, 82, 83, 73, 78, 71, 91, 78,
+  85, 96, 71, 86, 81, 111, 82, 103, 82, 73,
+  77, 91, 94, 105, 90, 85, 72, 91, 68, 91,
+  90, 90, 75, 79, 80, 99, 86, 80, 73, 76,
+  82, 80, 88, 71, 71, 77, 84, 72, 99, 75,
+  86, 98, 96, 81, 75, 80, 83, 77, 85, 58,
+  96, 101, 75, 74, 72, 70, 79, 90, 79, 91,
+  86, 93, 104, 75, 79, 76, 77, 83, 72, 95,
+  88, 69, 84, 87, 88, 88, 91, 81, 74, 81,
+  87, 92, 88, 80, 71, 90, 113, 80, 79, 92,
+  79, 71, 87, 78, 79, 76, 111, 85, 79, 85,
+  81, 69, 85, 75, 94, 86, 92, 87, 93, 68,
+  86, 90, 81, 83, 76, 75, 76, 82, 89, 78,
+  91, 82, 77, 83, 89, 73, 90, 81, 77, 94,
+  72, 89, 77, 97, 78, 99, 84, 73, 77, 94,
+  97, 90, 87, 85, 71, 81, 77, 92, 89, 86,
+  75, 83, 81, 91, 90, 80, 76, 75, 80, 81,
+  83, 77, 74, 80, 78, 87, 97, 89, 87, 97,
+  98, 85, 75, 94, 85, 81, 83, 75, 96, 98,
+  84, 79, 77, 71, 88, 85, 85, 87, 84, 94,
+  108, 81, 83, 72, 81, 83, 74, 93, 86, 74,
+  84, 88, 87, 83, 89, 82, 91, 81, 82, 88,
+  73, 78, 81, 86, 105, 76, 81, 92, 79, 89,
+  102, 75, 81, 88, 118, 94, 76, 80, 79, 72,
+  93, 78, 97, 82, 100, 87, 90, 82, 81, 82,
+  86, 79, 86, 76, 73, 75, 85, 71, 100, 75,
+  77, 71, 84, 87, 86, 77, 80, 88, 72, 86,
+  78, 110, 83, 91, 88, 84, 79, 83, 100, 100,
+  83, 85, 74, 102, 76, 99, 90, 87, 73, 84,
+  79, 87, 91, 75, 74, 77, 85, 80, 86, 70,
+  79, 79, 81, 72, 97, 72, 75, 108, 93, 87,
+  69, 69, 93, 80, 82, 61, 99, 71, 77, 74,
+  77, 76, 76, 90, 84, 94, 83, 86, 90, 86,
+  83, 74, 82, 84, 78, 89, 81, 78, 87, 92,
+  85, 75, 89, 78, 72, 87, 83, 85, 89, 79,
+  69, 87, 108, 85, 78, 86, 80, 83, 97, 81,
+  86, 81, 120, 85, 76, 71, 75, 83, 124, 84,
+  101, 81, 108, 88, 83, 78, 85, 85, 78, 76,
+  91, 70, 67, 73, 73, 72, 108, 78, 78, 76,
+  79, 70, 85, 73, 86, 96, 72, 96, 82, 122,
+  87, 95, 93, 74, 78, 80, 100, 109, 83, 84,
+  75, 104, 67, 100, 85, 87, 72, 82, 77, 104,
+  83, 83, 74, 82, 82, 77, 90, 67, 72, 78,
+  87, 62, 100, 72, 74, 107, 88, 84, 73, 76,
+  97, 84, 81, 53, 102, 76, 67, 71, 74, 80,
+  72, 102, 81, 102, 90, 83, 83, 80, 75, 73,
+  81, 86, 74, 91, 89, 74, 92, 96, 86, 83,
+  97, 79, 75, 85, 91, 80, 68, 86, 64, 93,
+  111, 83, 78, 94, 74, 75, 87, 79, 86, 81,
+  112, 87, 77, 81, 77, 67, 88, 82, 94, 84,
+  95, 87, 92, 70, 79, 82, 86, 79, 79, 77,
+  72, 78, 79, 75, 93, 77, 72, 80, 85, 74,
+  82, 81, 78, 91, 72, 85, 84, 105, 81, 94,
+  88, 76, 76, 82, 102, 89, 84, 84, 68, 96,
+  76, 100, 88, 84, 75, 83, 78, 88, 90, 75,
+  80, 80, 79, 77, 88, 72, 76, 84, 81, 80,
+  94, 89, 74, 102, 96, 89, 71, 94, 89, 82,
+  79, 70, 97, 89, 78, 79, 82, 80, 85, 89,
+  89, 93, 80, 81, 98, 76, 82, 70, 84, 81,
+  81, 88, 83, 80, 82, 93, 87, 88, 87, 80,
+  95, 85, 83, 81, 62, 79, 80, 86, 104, 81,
+  82, 87, 80, 92, 95, 82, 82, 89, 110, 100,
+  84, 83, 79, 77, 91, 72, 91, 81, 100, 88,
+  92, 77, 85, 81, 87, 70, 83, 81, 76, 78,
+  90, 75, 86, 77, 76, 64, 87, 88, 94, 80,
+  79, 92, 72, 86, 72, 102, 76, 96, 78, 87,
+  75, 90, 94, 91, 84, 81, 71, 83, 69, 90,
+  94, 78, 73, 87, 81, 86, 90, 78, 82, 81,
+  81, 80, 85, 76, 86, 90, 74, 87, 95, 75,
+  75, 100, 85, 79, 67, 72, 88, 81, 84, 75,
+  88, 63, 90, 88, 79, 79, 82, 86, 90, 88,
+  72, 90, 100, 96, 87, 72, 80, 76, 80, 88,
+  77, 80, 85, 82, 83, 84, 86, 86, 75, 85,
+  84, 82, 83, 76, 86, 85, 99, 87, 83, 84,
+  79, 88, 91, 84, 85, 80, 113, 98, 85, 77,
+  77, 87, 117, 84, 94, 82, 103, 87, 87, 74,
+  82, 80, 80, 68, 82, 76, 74, 79, 79, 77,
+  83, 83, 82, 71, 85, 74, 97, 77, 82, 94,
+  77, 86, 80, 108, 79, 97, 82, 72, 75, 90,
+  93, 89, 86, 82, 69, 86, 68, 88, 90, 78,
+  70, 84, 84, 94, 82, 74, 87, 86, 78, 75,
+  82, 72, 81, 87, 77, 78, 95, 77, 78, 97,
+  83, 77, 67, 84, 90, 86, 85, 64, 86, 70,
+  83, 82, 74, 83, 77, 90, 86, 92, 83, 89,
+  98, 87, 84, 73, 82, 81, 81, 91, 83, 78,
+  85, 86, 87, 82, 86, 86, 79, 85, 96, 78,
+  68, 82, 81, 90, 99, 83, 84, 91, 73, 74,
+  85, 79, 86, 80, 106, 93, 82, 83, 77, 70,
+  93, 88, 89, 82, 92, 88, 94, 66, 73, 83,
+  92, 73, 79, 80, 76, 81, 87, 72, 78, 79,
+  75, 74, 86, 75, 90, 82, 76, 90, 75, 88,
+  88, 98, 77, 93, 80, 77, 74, 90, 95, 85,
+  85, 82, 70, 90, 72, 89, 92, 76, 74, 90,
+  81, 90, 88, 76, 91, 85, 77, 82, 87, 77,
+  79, 91, 76, 89, 90, 91, 73, 97, 87, 81,
+  72, 95, 85, 83, 86, 79, 82, 77, 87, 82,
+  82, 81, 82, 86, 90, 88, 77, 86, 105, 80,
+  85, 73, 82, 76, 84, 87, 80, 82, 78, 86,
+  86, 84, 79, 90, 94, 83, 86, 81, 61, 78,
+  85, 84, 97, 82, 81, 89, 85, 89, 97, 87,
+  96, 99, 79, 86, 92, 84, 97, 76, 92, 80,
+  82, 82, 95, 87, 82, 99, 91, 92, 89, 94,
+  86, 68, 79, 85, 59, 77, 78, 71, 88, 69,
+  88, 89, 90, 82, 89, 79, 88, 78, 86, 79,
+  81, 88, 85, 81, 68, 81, 86, 98, 82, 78,
+  111, 88, 77, 75, 85, 88, 62, 82, 72, 85,
+  82, 69, 84, 84, 85, 79, 82, 75, 110, 79,
+  90, 77, 90, 99, 69, 74, 85, 93, 76, 81,
+  79, 92, 75, 72, 93, 65, 86, 78, 78, 105,
+  86, 73, 78, 87, 87, 91, 71, 78, 80, 101,
+  81, 82, 99, 87, 85, 86, 83, 70, 84, 87,
+  98, 97, 97, 81, 88, 76, 90, 84, 88, 76,
+  100, 77, 92, 101, 80, 92, 96, 81, 104, 93,
+  82, 86, 116, 79, 93, 75, 105, 88, 89, 83,
+  97, 90, 82, 86, 101, 122, 82, 101, 81, 63,
+  90, 85, 89, 77, 81, 65, 92, 69, 87, 80,
+  97, 87, 93, 91, 90, 73, 90, 82, 76, 109,
+  102, 84, 49, 87, 90, 123, 86, 77, 112, 97,
+  74, 79, 95, 83, 67, 74, 74, 84, 74, 76,
+  83, 74, 86, 73, 88, 59, 122, 77, 79, 61,
+  95, 87, 76, 71, 94, 96, 87, 89, 64, 88,
+  79, 63, 113, 69, 77, 75, 64, 96, 82, 71,
+  60, 88, 87, 96, 71, 86, 78, 101, 87, 79,
+  107, 82, 86, 100, 93, 69, 84, 81, 98, 93,
+  95, 82, 103, 83, 96, 86, 80, 72, 97, 72,
+  92, 126, 77, 100, 81, 90, 98, 94, 79, 85,
+  102, 83, 98, 72, 89, 83, 89, 89, 97, 91,
+  80, 93, 87, 102, 91, 99, 80, 67, 82, 86,
+  84, 74, 81, 69, 90, 86, 89, 77, 100, 86,
+  84, 87, 88, 78, 95, 80, 79, 101, 94, 99,
+  61, 83, 87, 109, 86, 76, 114, 89, 77, 82,
+  89, 84, 67, 77, 74, 85, 80, 75, 78, 84,
+  87, 67, 94, 64, 116, 79, 92, 74, 93, 72,
+  84, 70, 94, 97, 84, 101, 72, 92, 90, 65,
+  111, 68, 82, 81, 69, 103, 94, 74, 68, 88,
+  87, 94, 69, 101, 83, 99, 86, 80, 99, 88,
+  84, 92, 92, 69, 85, 76, 94, 83, 98, 83,
+  89, 79, 77, 87, 87, 76, 97, 79, 83, 104,
+  90, 79, 85, 86, 85, 97, 65, 90, 82, 83,
+  88, 77, 84, 83, 91, 74, 94, 79, 80, 92,
+  82, 79, 88, 79, 78, 83, 75, 80, 53, 74,
+  81, 86, 82, 75, 87, 94, 74, 83, 74, 69,
+  89, 83, 93, 80, 78, 73, 72, 92, 77, 73,
+  89, 83, 78, 83, 85, 88, 72, 79, 69, 83,
+  71, 87, 73, 82, 76, 74, 86, 106, 85, 66,
+  77, 84, 89, 86, 92, 84, 83, 92, 69, 75,
+  79, 90, 76, 77, 94, 82, 81, 84, 84, 61,
+  86, 85, 89, 101, 83, 84, 87, 88, 80, 77,
+  59, 93, 84, 94, 78, 86, 82, 83, 71, 76,
+  79, 75, 81, 86, 73, 86, 83, 86, 88, 73,
+  80, 86, 92, 83, 88, 81, 85, 77, 101, 82,
+  84, 78, 88, 86, 67, 93, 84, 76, 93, 78,
+  97, 83, 92, 66, 96, 81, 82, 76, 83, 94,
+  84, 80, 72, 83, 88, 75, 79, 86, 84, 83,
+  82, 65, 91, 87, 78, 87, 86, 64, 93, 87,
+  82, 76, 76, 75, 76, 84, 69, 69, 91, 82,
+  75, 81, 79, 94, 74, 84, 75, 80, 65, 84,
+  78, 91, 59, 80, 91, 92, 77, 61, 74, 88,
+  96, 89, 86, 70, 86, 82, 68, 72, 83, 94,
+  81, 94, 94, 81, 78, 77, 82, 62, 78, 80,
+  92, 116, 77, 79, 78, 86, 82, 74, 46, 87,
+  86, 92, 75, 87, 81, 86, 75, 85, 81, 72,
+  88, 74, 82, 92, 82, 82, 97, 71, 82, 85,
+  94, 82, 79, 81, 85, 88, 91, 90, 81, 86,
+  84, 86, 67, 87, 83, 81, 95, 73, 90, 78,
+  90, 78, 92, 83, 83, 82, 84, 82, 96, 80,
+  74, 78, 79, 78, 75, 80, 82, 82, 88, 78,
+  88, 86, 81, 86, 86, 72, 90, 79, 84, 80,
+  78, 79, 74, 91, 74, 77, 91, 92, 77, 79,
+  88, 86, 74, 82, 75, 83, 71, 87, 78, 83,
+  72, 82, 93, 96, 83, 71, 79, 83, 91, 92,
+  86, 83, 85, 79, 63, 73, 82, 92, 82, 105,
+  90, 90, 78, 80, 90, 65, 88, 84, 85, 105,
+  84, 79, 80, 86, 79, 82, 57, 88, 83, 92,
+  77, 83, 79, 88, 68, 80, 81, 70, 83, 77,
+  84, 86, 95, 84, 90, 76, 76, 86, 90, 82,
+  82, 85, 81, 82, 100, 70, 82, 79, 83, 88,
+  73, 83, 77, 81, 83, 86, 87, 78, 96, 84,
+  93, 85, 76, 91, 84, 68, 78, 72, 75, 92,
+  87, 85, 76, 92, 88, 90, 81, 83, 91, 89,
+  86, 86, 69, 74, 86, 79, 106, 80, 93, 63,
+  75, 95, 86, 73, 78, 61, 67, 92, 67, 80,
+  80, 83, 67, 82, 82, 99, 79, 98, 78, 78,
+  89, 114, 95, 79, 82, 82, 88, 88, 94, 87,
+  72, 83, 82, 85, 72, 78, 73, 89, 105, 77,
+  79, 98, 70, 71, 89, 101, 92, 87, 77, 80,
+  89, 87, 86, 80, 66, 92, 78, 91, 82, 83,
+  87, 95, 80, 72, 92, 77, 84, 81, 80, 67,
+  78, 96, 89, 84, 76, 82, 87, 84, 76, 92,
+  89, 57, 99, 75, 80, 79, 73, 86, 70, 85,
+  73, 72, 79, 95, 81, 78, 93, 77, 99, 85,
+  73, 91, 90, 57, 86, 66, 77, 109, 83, 77,
+  112, 94, 88, 86, 75, 77, 90, 96, 83, 81,
+  74, 69, 89, 74, 98, 80, 89, 53, 63, 85,
+  100, 64, 74, 49, 64, 96, 55, 82, 82, 78,
+  57, 79, 81, 102, 95, 88, 76, 73, 95, 117,
+  91, 78, 86, 88, 83, 90, 98, 76, 66, 82,
+  94, 83, 70, 87, 66, 91, 125, 81, 85, 104,
+  59, 66, 81, 98, 96, 92, 83, 85, 91, 83,
+  74, 67, 55, 81, 81, 90, 80, 80, 79, 96,
+  73, 68, 90, 78, 94, 79, 83, 70, 85, 97,
+  78, 82, 77, 81, 84, 84, 64, 100, 86, 49,
+  106, 82, 90, 82, 82, 82, 78, 86, 77, 80,
+  89, 86, 88, 71, 92, 85, 99, 88, 82, 88,
+  99, 66, 94, 73, 77, 93, 84, 85, 102, 87,
+  89, 86, 79, 73, 97, 92, 85, 85, 88, 78,
+  89, 83, 89, 80, 97, 64, 68, 83, 87, 71,
+  81, 66, 66, 87, 69, 82, 80, 79, 66, 82,
+  81, 97, 84, 92, 77, 85, 95, 113, 93, 86,
+  84, 80, 90, 94, 98, 86, 76, 84, 81, 89,
+  68, 81, 71, 85, 113, 83, 77, 99, 70, 71,
+  90, 98, 92, 93, 85, 80, 90, 86, 80, 81,
+  66, 77, 83, 90, 87, 85, 86, 97, 75, 71,
+  88, 81, 88, 77, 87, 78, 98, 98, 90, 83,
+  84, 81, 81, 85, 70, 95, 91, 58, 85, 78,
+  98, 70, 68, 84, 94, 78, 100, 47, 78, 98,
+  93, 98, 63, 69, 84, 86, 69, 95, 87, 87,
+  79, 104, 89, 77, 87, 57, 92, 74, 79, 87,
+  72, 85, 70, 115, 94, 75, 85, 75, 83, 87,
+  91, 67, 81, 91, 88, 79, 64, 93, 85, 89,
+  98, 67, 96, 87, 82, 89, 73, 72, 86, 79,
+  79, 87, 73, 71, 81, 80, 87, 124, 79, 79,
+  76, 74, 85, 72, 89, 76, 75, 72, 81, 77,
+  74, 86, 76, 94, 81, 101, 82, 89, 78, 82,
+  63, 84, 114, 82, 101, 103, 98, 90, 78, 75,
+  78, 72, 113, 84, 82, 79, 75, 89, 89, 80,
+  63, 104, 90, 86, 76, 90, 90, 100, 94, 76,
+  83, 90, 86, 93, 89, 90, 84, 91, 86, 63,
+  60, 78, 85, 74, 105, 30, 71, 101, 92, 87,
+  67, 63, 85, 85, 55, 93, 82, 91, 76, 99,
+  83, 78, 84, 47, 99, 73, 76, 90, 74, 79,
+  71, 82, 96, 71, 84, 80, 86, 84, 87, 67,
+  74, 91, 94, 76, 65, 93, 84, 93, 94, 70,
+  95, 98, 71, 92, 64, 67, 78, 76, 80, 74,
+  76, 71, 82, 76, 81, 116, 107, 78, 67, 69,
+  89, 64, 89, 77, 79, 74, 82, 81, 65, 89,
+  69, 80, 87, 97, 84, 83, 64, 84, 60, 81,
+  111, 81, 110, 105, 77, 95, 75, 77, 64, 69,
+  125, 77, 77, 63, 75, 87, 94, 82, 60, 85,
+  94, 76, 80, 94, 88, 99, 97, 78, 74, 82,
+  88, 97, 83, 88, 83, 86, 83, 88, 86, 83,
+  92, 96, 93, 72, 83, 85, 74, 83, 67, 76,
+  80, 78, 91, 98, 89, 87, 74, 96, 86, 87,
+  90, 89, 75, 71, 87, 87, 68, 101, 71, 72,
+  89, 74, 90, 81, 79, 85, 80, 78, 88, 83,
+  89, 93, 69, 87, 94, 77, 88, 74, 88, 86,
+  81, 91, 81, 78, 90, 91, 80, 77, 68, 77,
+  70, 91, 88, 95, 78, 83, 82, 79, 90, 84,
+  88, 84, 78, 78, 81, 82, 87, 91, 87, 86,
+  107, 106, 81, 79, 85, 79, 70, 84, 126, 86,
+  96, 99, 85, 84, 79, 82, 102, 75, 91, 84,
+  79, 85, 70, 90, 92, 80, 73, 81, 78, 87,
+  93, 89, 91, 94, 89, 81, 85, 99, 84, 89,
+  93, 86, 85, 65, 89, 61, 70, 92, 99, 60,
+  94, 26, 69, 74, 94, 95, 70, 69, 84, 87,
+  43, 85, 104, 87, 88, 99, 89, 77, 91, 33,
+  111, 80, 92, 94, 79, 78, 96, 106, 90, 110,
+  86, 78, 76, 92, 88, 74, 73, 84, 104, 81,
+  75, 80, 85, 86, 104, 70, 89, 101, 69, 78,
+  69, 82, 74, 88, 90, 83, 86, 70, 87, 70,
+  84, 86, 95, 76, 79, 92, 82, 67, 93, 79,
+  79, 79, 90, 78, 64, 79, 71, 95, 76, 87,
+  96, 76, 63, 76, 65, 92, 78, 85, 105, 98,
+  93, 95, 65, 84, 60, 64, 109, 75, 86, 78,
+  73, 92, 97, 89, 61, 92, 83, 74, 69, 101,
+  101, 83, 102, 66, 96, 68, 81, 99, 83, 91,
+  84, 102, 78, 51, 69, 66, 96, 53, 100, 5,
+  61, 78, 112, 94, 73, 66, 87, 91, 28, 87,
+  80, 93, 72, 97, 77, 79, 86, 24, 114, 85,
+  93, 103, 89, 67, 89, 72, 92, 120, 91, 87,
+  76, 96, 100, 75, 66, 79, 110, 75, 77, 78,
+  84, 86, 102, 73, 74, 91, 62, 83, 60, 74,
+  74, 86, 89, 88, 62, 75, 94, 72, 90, 74,
+  84, 75, 71, 88, 91, 51, 92, 75, 77, 84,
+  90, 82, 61, 88, 74, 94, 74, 80, 102, 81,
+  58, 71, 57, 97, 62, 85, 108, 104, 101, 91,
+  65, 75, 40, 64, 102, 63, 76, 62, 76, 91,
+  103, 96, 59, 72, 89, 67, 73, 108, 116, 73,
+  87, 66, 88, 61, 81, 97, 76, 95, 84, 96,
+  79, 79, 81, 91, 87, 73, 89, 48, 77, 73,
+  73, 92, 69, 77, 76, 78, 69, 94, 83, 87,
+  89, 94, 80, 87, 98, 61, 91, 83, 79, 90,
+  69, 92, 79, 63, 96, 93, 85, 83, 78, 86,
+  93, 75, 86, 75, 82, 98, 82, 81, 91, 85,
+  83, 74, 97, 86, 77, 85, 77, 85, 82, 91,
+  87, 78, 87, 77, 75, 76, 76, 81, 101, 83,
+  85, 92, 88, 85, 84, 86, 76, 80, 86, 80,
+  72, 95, 79, 92, 98, 99, 97, 74, 78, 91,
+  75, 82, 109, 89, 103, 94, 84, 84, 78, 81,
+  89, 68, 94, 75, 87, 83, 77, 86, 92, 80,
+  69, 76, 82, 79, 110, 89, 73, 89, 80, 78,
+  82, 87, 81, 95, 81, 88, 89, 68, 70, 78,
+  86, 82, 94, 73, 91, 68, 75, 85, 79, 87,
+  64, 80, 82, 77, 91, 90, 88, 85, 79, 81,
+  93, 82, 93, 63, 86, 84, 84, 78, 71, 90,
+  97, 107, 87, 97, 83, 83, 84, 81, 85, 82,
+  79, 78, 94, 81, 75, 88, 80, 75, 97, 83,
+  90, 92, 70, 75, 72, 80, 80, 93, 93, 86,
+  95, 78, 75, 93, 82, 77, 92, 84, 98, 90,
+  76, 90, 93, 87, 95, 76, 88, 80, 88, 98,
+  84, 84, 77, 98, 82, 81, 83, 88, 74, 81,
+  88, 83, 86, 93, 78, 93, 77, 93, 96, 73,
+  67, 90, 86, 89, 83, 86, 82, 88, 78, 100,
+  88, 77, 78, 104, 91, 88, 82, 73, 99, 84,
+  84, 98, 83, 83, 89, 84, 73, 72, 82, 71,
+  89, 65, 91, 56, 74, 84, 86, 90, 65, 81,
+  83, 74, 85, 93, 74, 92, 83, 74, 83, 82,
+  90, 52, 89, 100, 78, 78, 75, 80, 84, 93,
+  87, 96, 88, 84, 92, 80, 78, 79, 75, 69,
+  87, 77, 79, 91, 80, 87, 96, 82, 87, 82,
+  68, 82, 69, 81, 82, 97, 99, 82, 92, 88,
+  75, 90, 79, 85, 82, 88, 95, 88, 73, 80,
+  94, 85, 90, 73, 89, 79, 76, 100, 92, 88,
+  84, 102, 78, 67, 68, 79, 74, 72, 82, 82,
+  89, 95, 79, 87, 77, 93, 86, 70, 57, 86,
+  78, 79, 74, 81, 80, 89, 69, 89, 97, 72,
+  105, 102, 89, 83, 82, 75, 92, 81, 82, 91,
+  73, 86, 88, 88, 70, 87, 91, 87, 89, 86,
+  88, 75, 79, 88, 81, 95, 61, 83, 75, 76,
+  88, 90, 88, 78, 83, 86, 86, 80, 97, 80,
+  76, 91, 86, 80, 69, 88, 77, 82, 87, 94,
+  89, 84, 84, 80, 89, 83, 88, 79, 88, 92,
+  82, 85, 89, 77, 88, 85, 90, 78, 81, 77,
+  75, 77, 80, 86, 91, 81, 88, 81, 70, 90,
+  76, 70, 85, 86, 92, 87, 82, 89, 88, 81,
+  80, 77, 83, 84, 91, 93, 76, 85, 93, 90,
+  86, 77, 95, 90, 78, 79, 96, 81, 91, 90,
+  89, 73, 76, 81, 102, 77, 72, 86, 87, 90,
+  84, 88, 85, 85, 86, 85, 84, 82, 104, 101,
+  85, 90, 87, 83, 83, 95, 80, 95, 83, 85,
+  75, 82, 95, 72, 71, 84, 79, 77, 70, 81,
+  76, 93, 77, 83, 82, 68, 73, 79, 78, 85,
+  90, 72, 86, 81, 73, 99, 71, 79, 105, 92,
+  93, 95, 77, 85, 66, 84, 94, 72, 78, 75,
+  55, 72, 84, 82, 93, 57, 82, 89, 96, 69,
+  78, 71, 84, 85, 67, 86, 79, 83, 87, 71,
+  125, 92, 88, 86, 92, 80, 77, 88, 76, 78,
+  75, 93, 84, 81, 75, 81, 88, 86, 96, 95,
+  80, 97, 81, 104, 87, 95, 92, 100, 81, 92,
+  77, 79, 92, 86, 79, 100, 87, 83, 87, 82,
+  62, 90, 92, 92, 80, 91, 77, 80, 92, 74,
+  89, 74, 76, 78, 88, 93, 92, 97, 87, 92,
+  86, 77, 70, 88, 77, 84, 82, 59, 71, 74,
+  81, 66, 70, 76, 82, 74, 61, 71, 75, 99,
+  80, 84, 84, 70, 68, 80, 71, 89, 82, 62,
+  87, 76, 74, 109, 62, 69, 106, 85, 103, 83,
+  70, 92, 79, 84, 104, 59, 79, 75, 58, 69,
+  95, 88, 100, 57, 79, 77, 94, 66, 83, 66,
+  79, 88, 53, 87, 78, 81, 95, 71, 122, 87,
+  95, 84, 83, 83, 76, 92, 81, 63, 81, 99,
+  81, 82, 78, 81, 81, 93, 108, 90, 81, 107,
+  71, 87, 101, 95, 92, 101, 80, 92, 77, 86,
+  93, 83, 75, 111, 77, 82, 80, 74, 54, 85,
+  84, 94, 76, 95, 74, 82, 87, 68, 100, 72,
+  73, 85, 93, 101, 72, 88, 81, 96, 86, 72,
+  65, 79, 74, 85, 89, 52, 79, 64, 75, 80,
+  78, 82, 80, 81, 76, 82, 77, 90, 83, 84,
+  85, 72, 76, 77, 79, 81, 82, 68, 89, 83,
+  78, 95, 77, 81, 98, 79, 85, 83, 80, 71,
+  84, 95, 87, 73, 78, 76, 64, 76, 84, 89,
+  100, 69, 89, 89, 88, 75, 83, 79, 86, 80,
+  69, 80, 82, 79, 94, 72, 111, 85, 85, 84,
+  91, 80, 78, 85, 79, 73, 91, 97, 87, 79,
+  77, 84, 95, 97, 98, 92, 81, 91, 80, 79,
+  79, 87, 85, 92, 88, 92, 79, 95, 96, 87,
+  89, 96, 89, 83, 78, 89, 64, 87, 92, 91,
+  79, 90, 79, 84, 91, 79, 85, 78, 79, 92,
+  90, 89, 78, 96, 91, 86, 91, 74, 78, 92,
+  77, 83, 83, 69, 78, 82, 84, 73, 88, 83,
+  100, 73, 79, 82, 84, 88, 79, 107, 93, 70,
+  67, 81, 90, 79, 99, 81, 77, 88, 74, 82,
+  80, 84, 91, 84, 90, 83, 88, 89, 68, 78,
+  75, 70, 60, 70, 81, 79, 79, 90, 92, 64,
+  88, 82, 78, 68, 83, 82, 77, 86, 66, 73,
+  76, 71, 85, 82, 111, 94, 78, 84, 78, 82,
+  77, 87, 76, 60, 72, 87, 79, 73, 86, 87,
+  84, 90, 78, 92, 70, 87, 85, 83, 79, 92,
+  86, 93, 84, 86, 84, 75, 76, 82, 73, 96,
+  78, 87, 87, 87, 59, 89, 90, 83, 87, 80,
+  88, 81, 105, 71, 87, 84, 79, 86, 85, 91,
+  94, 86, 98, 84, 89, 80, 76, 84, 80, 91,
+  80, 79, 80, 85, 73, 80, 81, 78, 99, 72,
+  92, 88, 83, 91, 87, 77, 94, 77, 65, 89,
+  92, 77, 84, 72, 83, 98, 79, 70, 90, 90,
+  84, 77, 84, 88, 86, 88, 69, 72, 82, 72,
+  80, 64, 81, 85, 93, 89, 96, 72, 96, 83,
+  71, 69, 86, 75, 82, 85, 64, 88, 78, 71,
+  85, 80, 118, 87, 76, 87, 69, 86, 77, 83,
+  75, 58, 73, 90, 81, 78, 84, 89, 87, 89,
+  74, 86, 71, 86, 87, 80, 64, 92, 81, 89,
+  85, 94, 87, 76, 74, 79, 69, 88, 74, 92,
+  84, 90, 57, 83, 97, 86, 106, 79, 89, 79,
+  106, 76, 81, 75, 89, 84, 76, 88, 93, 82,
+  96, 86, 94, 72, 72, 89, 72, 85, 88, 82,
+  80, 81, 73, 77, 84, 78, 93, 76, 81, 82,
+  81, 83, 80, 63, 91, 73, 71, 76, 85, 80,
+  76, 79, 83, 91, 86, 85, 79, 87, 85, 86,
+  78, 89, 86, 84, 76, 93, 78, 69, 103, 72,
+  86, 77, 94, 94, 94, 66, 91, 93, 79, 74,
+  85, 78, 80, 85, 73, 98, 78, 74, 87, 80,
+  96, 88, 73, 80, 81, 78, 81, 89, 76, 64,
+  91, 86, 82, 74, 81, 89, 83, 83, 87, 88,
+  74, 88, 82, 78, 79, 92, 86, 89, 85, 86,
+  86, 78, 79, 85, 77, 93, 77, 86, 76, 85,
+  62, 88, 86, 81, 87, 84, 85, 83, 99, 79,
+  84, 84, 83, 87, 69, 84, 92, 85, 94, 85,
+  81, 77, 83, 87, 82, 86, 79, 82, 94, 87,
+  90, 91, 98, 94, 91, 75, 90, 84, 84, 74,
+  88, 86, 85, 79, 70, 84, 97, 84, 86, 102,
+  81, 97, 86, 74, 107, 90, 87, 87, 70, 89,
+  102, 83, 89, 94, 78, 81, 67, 82, 95, 87,
+  70, 91, 91, 89, 98, 77, 57, 90, 72, 95,
+  80, 83, 93, 81, 77, 73, 93, 80, 88, 94,
+  72, 82, 83, 80, 77, 83, 74, 80, 95, 74,
+  85, 67, 91, 81, 73, 86, 74, 82, 79, 71,
+  97, 82, 75, 85, 81, 77, 89, 85, 82, 80,
+  72, 76, 90, 79, 84, 78, 97, 92, 74, 90,
+  86, 75, 97, 84, 96, 83, 113, 95, 80, 92,
+  88, 86, 74, 80, 98, 74, 93, 82, 95, 87,
+  92, 85, 91, 92, 81, 93, 99, 94, 92, 104,
+  84, 87, 86, 77, 103, 96, 83, 72, 100, 78,
+  94, 84, 73, 86, 99, 82, 73, 110, 85, 104,
+  93, 62, 119, 104, 76, 89, 62, 95, 109, 76,
+  96, 82, 87, 94, 77, 82, 94, 95, 80, 86,
+  85, 94, 103, 85, 49, 100, 76, 96, 86, 80,
+  93, 80, 74, 68, 96, 78, 83, 88, 71, 87,
+  79, 87, 74, 78, 70, 81, 84, 71, 94, 72,
+  86, 77, 77, 75, 69, 79, 82, 72, 101, 91,
+  58, 86, 76, 67, 83, 90, 76, 81, 70, 74,
+  86, 71, 89, 82, 97, 92, 73, 73, 87, 75,
+  108, 88, 99, 76, 109, 103, 79, 91, 93, 77,
+  77, 80, 104, 72, 92, 82, 88, 85, 92, 85,
+  89, 83, 79, 98, 91, 102, 85, 90, 84, 87,
+  91, 82, 91, 89, 83, 78, 88, 76, 83, 81,
+  75, 81, 95, 82, 73, 99, 88, 95, 96, 79,
+  100, 87, 78, 88, 69, 94, 101, 90, 88, 86,
+  80, 81, 91, 79, 100, 85, 84, 91, 83, 84,
+  95, 87, 70, 91, 74, 97, 84, 84, 93, 82,
+  79, 79, 89, 82, 86, 87, 75, 79, 85, 83,
+  82, 84, 77, 82, 88, 80, 84, 68, 84, 87,
+  74, 75, 74, 83, 84, 73, 92, 89, 79, 93,
+  91, 74, 88, 89, 81, 85, 74, 80, 91, 80,
+  81, 78, 87, 88, 74, 83, 85, 76, 94, 85,
+  89, 82, 103, 90, 80, 86, 89, 81, 76, 86,
+  105, 76, 92, 83, 79, 86, 91, 87, 92, 92,
+  80, 85, 93, 84, 73, 92, 86, 71, 83, 81,
+  80, 90, 79, 71, 75, 95, 80, 105, 92, 73,
+  79, 92, 67, 73, 77, 91, 81, 82, 74, 79,
+  87, 86, 100, 74, 84, 88, 104, 72, 82, 83,
+  81, 80, 81, 80, 86, 96, 72, 108, 115, 82,
+  89, 82, 75, 69, 87, 96, 80, 99, 91, 94,
+  98, 82, 93, 114, 97, 90, 74, 69, 101, 76,
+  136, 74, 80, 57, 68, 84, 75, 82, 80, 69,
+  86, 79, 97, 88, 86, 73, 94, 95, 81, 78,
+  94, 74, 67, 86, 82, 84, 70, 66, 79, 86,
+  98, 75, 73, 83, 89, 81, 99, 91, 84, 83,
+  97, 76, 70, 81, 85, 74, 86, 88, 83, 77,
+  79, 85, 88, 80, 91, 85, 92, 97, 79, 85,
+  88, 88, 51, 82, 75, 70, 86, 82, 85, 88,
+  87, 76, 95, 102, 86, 74, 83, 81, 82, 76,
+  93, 81, 81, 95, 72, 87, 70, 82, 87, 79,
+  89, 79, 77, 92, 103, 73, 84, 87, 72, 79,
+  73, 91, 89, 89, 75, 89, 71, 98, 91, 87,
+  83, 78, 85, 91, 70, 100, 96, 75, 83, 86,
+  88, 93, 89, 90, 65, 73, 83, 85, 107, 72,
+  70, 77, 74, 82, 75, 79, 87, 70, 77, 82,
+  85, 86, 89, 65, 92, 77, 77, 77, 77, 86,
+  63, 83, 78, 96, 64, 73, 86, 81, 104, 81,
+  71, 92, 86, 82, 91, 83, 88, 89, 95, 79,
+  68, 80, 87, 78, 73, 71, 64, 86, 90, 90,
+  74, 79, 77, 91, 81, 88, 88, 90, 83, 88,
+  66, 80, 71, 99, 84, 80, 84, 89, 96, 78,
+  93, 87, 85, 71, 80, 103, 84, 81, 100, 75,
+  83, 93, 76, 90, 79, 89, 89, 81, 86, 87,
+  76, 83, 94, 81, 85, 81, 78, 81, 76, 89,
+  84, 79, 84, 80, 63, 88, 92, 86, 86, 87,
+  87, 90, 73, 88, 84, 81, 73, 79, 86, 79,
+  90, 79, 87, 91, 81, 85, 83, 82, 84, 85,
+  90, 82, 80, 76, 85, 86, 83, 101, 83, 82,
+  81, 81, 81, 74, 76, 87, 81, 94, 72, 85,
+  77, 93, 85, 84, 88, 92, 84, 91, 84, 99,
+  85, 83, 77, 85, 78, 85, 86, 89, 79, 80,
+  93, 88, 77, 79, 66, 82, 85, 100, 83, 83,
+  77, 88, 82, 85, 98, 89, 89, 80, 78, 75,
+  75, 57, 82, 80, 81, 101, 70, 87, 65, 96,
+  73, 91, 78, 70, 66, 95, 79, 102, 105, 83,
+  89, 64, 79, 76, 89, 65, 64, 72, 92, 75,
+  89, 77, 82, 84, 86, 77, 100, 76, 95, 80,
+  100, 111, 97, 93, 92, 87, 81, 60, 85, 73,
+  111, 86, 120, 64, 158, 69, 74, 147, 106, 76,
+  86, 78, 85, 101, 104, 78, 73, 56, 101, 67,
+  65, 118, 80, 60, 81, 77, 78, 72, 104, 85,
+  75, 76, 81, 78, 74, 82, 73, 93, 94, 76,
+  78, 55, 70, 86, 95, 116, 73, 78, 92, 84,
+  98, 99, 93, 76, 82, 85, 59, 73, 85, 80,
+  78, 101, 77, 86, 76, 92, 70, 65, 87, 87,
+  86, 73, 75, 83, 101, 85, 67, 87, 74, 58,
+  79, 83, 89, 88, 83, 80, 100, 100, 76, 77,
+  78, 82, 79, 77, 112, 96, 104, 82, 75, 83,
+  71, 80, 91, 77, 71, 87, 78, 97, 85, 81,
+  88, 83, 88, 87, 81, 96, 72, 92, 85, 83,
+  68, 127, 87, 91, 83, 97, 87, 87, 86, 84,
+  91, 64, 103, 77, 68, 86, 92, 66, 73, 72,
+  72, 89, 83, 85, 89, 81, 76, 76, 57, 87,
+  84, 57, 63, 84, 80, 77, 94, 79, 96, 73,
+  87, 87, 67, 86, 62, 75, 84, 82, 77, 74,
+  89, 83, 83, 94, 73, 82, 81, 82, 79, 77,
+  93, 86, 91, 80, 76, 78, 79, 91, 84, 83,
+  77, 90, 79, 84, 79, 75, 89, 88, 86, 71,
+  74, 82, 93, 93, 78, 91, 71, 90, 87, 81,
+  82, 85, 90, 82, 105, 78, 92, 73, 84, 106,
+  89, 88, 101, 80, 87, 89, 78, 96, 75, 85,
+  96, 82, 99, 96, 81, 91, 93, 87, 85, 88,
+  84, 83, 71, 93, 83, 87, 84, 74, 75, 93,
+  88, 89, 90, 95, 91, 98, 73, 81, 73, 80,
+  60, 83, 85, 72, 79, 71, 79, 89, 90, 79,
+  78, 73, 82, 83, 79, 83, 81, 63, 82, 94,
+  74, 95, 87, 85, 80, 80, 90, 88, 81, 91,
+  80, 92, 69, 68, 67, 82, 79, 90, 93, 94,
+  70, 81, 81, 91, 86, 84, 79, 69, 88, 92,
+  90, 91, 93, 80, 91, 89, 76, 79, 74, 88,
+  87, 87, 87, 90, 77, 89, 84, 80, 97, 89,
+  100, 92, 79, 77, 76, 60, 72, 88, 86, 92,
+  82, 89, 79, 90, 64, 87, 75, 90, 84, 90,
+  74, 97, 112, 76, 84, 79, 76, 77, 83, 75,
+  84, 86, 77, 73, 87, 94, 82, 85, 90, 78,
+  83, 79, 94, 99, 83, 69, 93, 96, 86, 82,
+  82, 80, 85, 79, 92, 81, 95, 83, 113, 90,
+  75, 104, 112, 85, 76, 68, 76, 99, 78, 99,
+  60, 64, 97, 79, 73, 96, 92, 55, 80, 71,
+  84, 74, 93, 92, 84, 84, 83, 88, 89, 88,
+  81, 90, 98, 80, 90, 79, 81, 78, 81, 84,
+  88, 78, 98, 85, 80, 79, 100, 80, 114, 93,
+  77, 87, 81, 86, 94, 81, 90, 84, 82, 96,
+  74, 82, 100, 83, 87, 72, 82, 79, 98, 81,
+  86, 90, 74, 71, 79, 80, 92, 84, 82, 71,
+  101, 79, 81, 79, 76, 89, 79, 73, 81, 90,
+  102, 84, 88, 89, 74, 82, 83, 84, 92, 98,
+  64, 92, 85, 91, 94, 88, 87, 85, 78, 92,
+  79, 97, 72, 71, 94, 103, 82, 87, 86, 94,
+  90, 87, 80, 60, 74, 83, 84, 96, 77, 81,
+  90, 72, 79, 64, 82, 77, 81, 82, 90, 83,
+  83, 84, 69, 74, 83, 69, 69, 81, 86, 78,
+  83, 79, 91, 87, 87, 89, 81, 85, 55, 78,
+  80, 88, 74, 88, 87, 78, 61, 79, 77, 68,
+  86, 80, 81, 69, 88, 84, 100, 91, 97, 85,
+  81, 89, 95, 81, 78, 87, 81, 80, 90, 81,
+  98, 87, 91, 70, 81, 78, 90, 82, 84, 92,
+  67, 79, 87, 74, 79, 85, 87, 74, 91, 68,
+  97, 69, 83, 103, 88, 86, 84, 89, 95, 96,
+  82, 84, 77, 84, 82, 84, 97, 99, 81, 95,
+  89, 85, 94, 88, 88, 78, 83, 89, 82, 86,
+  74, 73, 91, 92, 84, 86, 90, 89, 88, 90,
+  75, 71, 75, 90, 75, 84, 92, 86, 79, 80,
+  90, 88, 92, 75, 81, 78, 76, 80, 89, 78,
+  81, 68, 81, 87, 77, 95, 90, 80, 74, 79,
+  79, 95, 79, 88, 81, 85, 67, 76, 76, 82,
+  71, 93, 84, 92, 65, 83, 78, 87, 82, 82,
+  89, 80, 83, 89, 69, 96, 93, 87, 90, 82,
+  82, 88, 88, 91, 88, 85, 88, 87, 73, 92,
+  78, 79, 95, 87, 83, 72, 104, 86, 75, 86,
+  73, 81, 80, 78, 89, 84, 70, 74, 76, 82,
+  85, 77, 82, 76, 85, 81, 100, 90, 61, 72,
+  87, 75, 76, 82, 90, 80, 85, 74, 79, 106,
+  97, 75, 83, 77, 88, 74, 76, 70, 97, 75,
+  89, 60, 89, 78, 87, 80, 81, 79, 90, 89,
+  79, 69, 74, 122, 77, 77, 82, 83, 88, 86,
+  94, 102, 79, 90, 83, 105, 83, 88, 78, 83,
+  77, 97, 80, 77, 82, 82, 81, 75, 67, 98,
+  78, 90, 89, 105, 82, 94, 86, 132, 82, 90,
+  86, 92, 96, 92, 74, 78, 80, 71, 93, 94,
+  95, 68, 87, 75, 90, 90, 75, 83, 78, 101,
+  84, 96, 80, 85, 92, 66, 71, 94, 78, 79,
+  69, 87, 84, 71, 75, 77, 72, 83, 72, 77,
+  69, 66, 84, 73, 68, 76, 69, 79, 86, 71,
+  73, 45, 78, 83, 83, 94, 69, 74, 85, 63,
+  103, 74, 95, 87, 83, 75, 80, 74, 76, 68,
+  80, 70, 77, 70, 91, 65, 95, 81, 90, 77,
+  85, 71, 69, 92, 78, 82, 85, 82, 71, 68,
+  74, 116, 83, 82, 69, 106, 77, 85, 90, 102,
+  73, 87, 93, 96, 72, 94, 70, 75, 72, 61,
+  82, 78, 81, 71, 84, 83, 72, 85, 75, 89,
+  77, 106, 65, 96, 94, 139, 85, 95, 97, 92,
+  81, 89, 66, 106, 71, 71, 104, 94, 95, 55,
+  91, 76, 91, 106, 66, 75, 90, 113, 74, 104,
+  85, 80, 97, 59, 64, 86, 75, 83, 62, 77,
+  79, 85, 82, 90, 80, 100, 76, 87, 87, 90,
+  85, 95, 70, 87, 77, 83, 85, 79, 81, 65,
+  81, 78, 88, 86, 84, 74, 85, 83, 77, 93,
+  80, 90, 88, 97, 90, 89, 91, 83, 78, 86,
+  84, 81, 93, 84, 98, 79, 91, 107, 86, 85,
+  87, 94, 89, 78, 80, 76, 84, 73, 79, 103,
+  81, 83, 87, 65, 87, 88, 72, 94, 81, 69,
+  83, 92, 83, 74, 73, 84, 84, 71, 80, 76,
+  91, 82, 79, 95, 78, 90, 92, 85, 96, 100,
+  89, 101, 86, 108, 102, 81, 72, 86, 81, 90,
+  78, 75, 82, 78, 87, 93, 88, 79, 72, 80,
+  94, 79, 77, 89, 82, 92, 94, 87, 88, 74,
+  85, 72, 81, 89, 86, 76, 73, 95, 80, 62,
+  94, 74, 75, 83, 71, 83, 80, 60, 83, 87,
+  75, 82, 74, 93, 94, 83, 85, 73, 84, 58,
+  106, 96, 61, 75, 85, 67, 106, 78, 84, 80,
+  83, 79, 71, 119, 84, 80, 78, 79, 80, 73,
+  79, 64, 78, 91, 89, 77, 82, 61, 83, 75,
+  73, 84, 86, 86, 79, 53, 68, 147, 89, 95,
+  84, 73, 90, 64, 78, 100, 99, 100, 104, 96,
+  98, 82, 73, 77, 64, 79, 76, 89, 80, 76,
+  82, 102, 73, 88, 72, 91, 83, 101, 72, 77,
+  73, 131, 88, 84, 89, 88, 92, 80, 53, 90,
+  77, 83, 94, 83, 91, 51, 90, 77, 93, 89,
+  59, 90, 80, 78, 65, 109, 87, 72, 86, 51,
+  70, 83, 86, 78, 76, 77, 65, 69, 81, 62,
+  64, 78, 67, 77, 66, 42, 80, 83, 67, 80,
+  70, 91, 104, 71, 73, 44, 78, 53, 79, 90,
+  62, 83, 78, 55, 124, 79, 83, 78, 75, 73,
+  68, 84, 65, 93, 81, 63, 70, 67, 82, 60,
+  72, 76, 81, 70, 80, 50, 83, 74, 66, 88,
+  68, 85, 69, 54, 59, 176, 101, 86, 68, 86,
+  77, 59, 74, 109, 97, 77, 81, 109, 89, 82,
+  75, 73, 43, 74, 73, 94, 80, 88, 78, 106,
+  86, 92, 70, 88, 77, 94, 64, 78, 61, 137,
+  76, 86, 97, 88, 77, 75, 45, 87, 60, 85,
+  105, 74, 92, 41, 87, 72, 102, 87, 45, 72,
+  80, 80, 82, 125, 91, 67, 102, 39, 62, 75,
+  90, 81, 86, 65, 79, 89, 90, 88, 86, 100,
+  75, 83, 85, 78, 78, 97, 70, 85, 81, 91,
+  93, 83, 82, 69, 79, 77, 73, 91, 79, 70,
+  82, 77, 98, 97, 76, 86, 88, 92, 81, 80,
+  82, 80, 79, 89, 86, 88, 86, 81, 85, 96,
+  90, 83, 97, 81, 83, 88, 83, 76, 88, 88,
+  85, 60, 73, 102, 92, 92, 95, 65, 80, 73,
+  68, 96, 82, 91, 75, 84, 93, 80, 76, 83,
+  85, 83, 70, 75, 87, 66, 79, 95, 80, 85,
+  99, 104, 86, 93, 80, 102, 82, 105, 115, 80,
+  81, 85, 85, 80, 65, 75, 79, 82, 84, 90,
+  83, 73, 82, 87, 100, 88, 73, 83, 74, 89,
+  114, 93, 84, 79, 95, 65, 84, 85, 82, 86,
+  75, 90, 90, 76, 84, 91, 78, 76, 70, 82,
+  80, 74, 76, 81, 83, 92, 77, 91, 95, 91,
+  91, 85, 86, 75, 85, 112, 76, 72, 103, 81,
+  81, 73, 94, 86, 78, 81, 93, 104, 88, 81,
+  86, 83, 89, 76, 78, 74, 69, 91, 93, 82,
+  89, 77, 78, 76, 78, 79, 84, 85, 74, 73,
+  83, 115, 81, 100, 94, 85, 93, 69, 74, 81,
+  89, 113, 92, 80, 107, 87, 78, 76, 84, 93,
+  86, 75, 81, 79, 98, 91, 76, 86, 75, 104,
+  83, 86, 75, 76, 83, 121, 84, 67, 85, 84,
+  92, 79, 58, 87, 95, 78, 76, 80, 92, 70,
+  79, 92, 83, 92, 75, 86, 84, 97, 70, 80,
+  90, 93, 84, 67, 70, 90, 83, 74, 77, 93,
+  82, 76, 85, 84, 69, 76, 70, 79, 72, 62,
+  80, 75, 70, 93, 87, 95, 101, 82, 87, 62,
+  79, 71, 75, 103, 73, 74, 101, 70, 101, 95,
+  87, 71, 75, 71, 80, 87, 78, 96, 94, 71,
+  83, 73, 82, 73, 65, 77, 80, 80, 89, 71,
+  83, 80, 72, 81, 77, 84, 68, 75, 75, 138,
+  89, 91, 78, 93, 94, 70, 67, 82, 91, 89,
+  87, 91, 100, 83, 75, 72, 72, 80, 83, 78,
+  81, 88, 100, 97, 88, 96, 75, 108, 69, 80,
+  62, 71, 75, 119, 78, 64, 95, 91, 81, 77,
+  58, 90, 88, 77, 69, 78, 97, 52, 68, 87,
+  87, 87, 63, 77, 80, 79, 90, 90, 82, 90,
+  91, 57, 61, 89, 80, 78, 83, 85, 83, 88,
+  81, 92, 87, 93, 79, 85, 83, 85, 76, 89,
+  78, 83, 75, 88, 95, 87, 87, 76, 81, 73,
+  71, 105, 83, 73, 96, 92, 77, 103, 83, 80,
+  84, 95, 75, 81, 90, 79, 87, 92, 94, 89,
+  86, 89, 76, 100, 100, 88, 92, 79, 79, 83,
+  87, 80, 93, 87, 79, 75, 86, 91, 85, 97,
+  100, 63, 79, 74, 69, 86, 85, 103, 85, 77,
+  91, 83, 86, 82, 95, 77, 76, 70, 89, 74,
+  95, 85, 78, 80, 93, 103, 88, 82, 87, 87,
+  90, 99, 104, 74, 79, 79, 100, 78, 66, 102,
+  88, 77, 76, 83, 76, 90, 83, 96, 91, 90,
+  85, 77, 91, 95, 92, 81, 89, 88, 85, 75,
+  89, 86, 87, 86, 76, 93, 85, 82, 99, 89,
+  84, 80, 80, 94, 92, 70, 85, 88, 98, 76,
+  74, 83, 99, 97, 97, 89, 47, 74, 96, 95,
+  100, 69, 81, 84, 88, 90, 75, 87, 99, 75,
+  84, 87, 71, 81, 91, 86, 69, 82, 97, 84,
+  82, 83, 105, 70, 76, 93, 90, 97, 83, 84,
+  96, 89, 89, 94, 90, 81, 78, 82, 73, 77,
+  69, 98, 95, 82, 89, 93, 91, 80, 95, 67,
+  84, 80, 82, 95, 60, 91, 87, 84, 90, 99,
+  79, 87, 78, 88, 91, 76, 94, 77, 93, 84,
+  92, 71, 94, 96, 80, 99, 78, 88, 75, 97,
+  84, 103, 81, 79, 71, 84, 74, 86, 85, 85,
+  73, 85, 82, 98, 93, 77, 89, 88, 84, 83,
+  97, 79, 85, 81, 75, 83, 113, 95, 93, 81,
+  80, 79, 84, 84, 78, 79, 74, 101, 74, 80,
+  69, 70, 75, 92, 76, 70, 99, 101, 86, 82,
+  79, 81, 109, 106, 78, 89, 72, 84, 77, 102,
+  79, 87, 86, 73, 80, 66, 66, 71, 88, 89,
+  90, 73, 103, 68, 81, 70, 79, 72, 76, 69,
+  85, 85, 80, 78, 86, 98, 89, 73, 55, 74,
+  93, 79, 80, 90, 82, 99, 92, 77, 85, 72,
+  87, 94, 69, 83, 80, 92, 81, 101, 91, 100,
+  83, 95, 79, 82, 74, 79, 99, 83, 92, 77,
+  90, 84, 66, 69, 68, 66, 77, 96, 79, 87,
+  78, 78, 73, 68, 102, 78, 67, 84, 80, 82,
+  108, 90, 73, 79, 81, 81, 73, 79, 77, 94,
+  73, 74, 77, 66, 97, 85, 86, 84, 80, 75,
+  83, 84, 78, 81, 91, 100, 71, 74, 68, 77,
+  82, 89, 90, 68, 79, 98, 73, 80, 92, 85,
+  83, 95, 82, 90, 80, 75, 86, 98, 93, 84,
+  88, 78, 85, 70, 73, 76, 100, 84, 75, 76,
+  96, 77, 83, 78, 82, 72, 77, 80, 85, 87,
+  80, 85, 97, 91, 102, 67, 69, 76, 87, 79,
+  74, 83, 86, 92, 96, 88, 78, 71, 90, 103,
+  88, 83, 84, 98, 82, 92, 88, 92, 91, 83,
+  81, 89, 84, 96, 99, 81, 85, 82, 91, 89,
+  76, 70, 75, 73, 91, 89, 84, 92, 84, 81,
+  85, 80, 101, 78, 76, 88, 87, 91, 86, 89,
+  74, 95, 104, 81, 77, 84, 82, 107, 76, 85,
+  78, 79, 109, 95, 88, 74, 70, 80, 82, 83,
+  77, 73, 87, 97, 72, 81, 91, 75, 78, 89,
+  81, 66, 100, 91, 95, 81, 75, 83, 118, 101,
+  78, 95, 72, 84, 71, 94, 88, 85, 95, 95,
+  84, 73, 61, 74, 75, 79, 88, 83, 105, 73,
+  75, 68, 76, 72, 73, 81, 80, 88, 78, 78,
+  89, 90, 84, 66, 53, 77, 96, 86, 91, 83,
+  68, 85, 96, 74, 85, 74, 86, 85, 74, 85,
+  79, 87, 77, 99, 91, 98, 85, 100, 75, 66,
+  76, 74, 97, 84, 93, 71, 89, 91, 78, 76,
+  70, 79, 81, 93, 85, 96, 76, 82, 66, 66,
+  79, 80, 68, 91, 75, 88, 93, 96, 78, 72,
+  94, 79, 71, 81, 82, 92, 76, 69, 70, 64,
+  105, 85, 90, 75, 78, 66, 82, 90, 78, 76,
+  75, 107, 80, 76, 77, 67, 73, 85, 116, 70,
+  88, 93, 78, 82, 79, 83, 108, 97, 85, 89,
+  67, 78, 66, 85, 85, 80, 86, 76, 97, 68,
+  48, 70, 79, 82, 78, 80, 92, 78, 74, 74,
+  75, 66, 62, 76, 71, 81, 77, 84, 98, 79,
+  88, 66, 45, 67, 92, 74, 75, 70, 65, 89,
+  87, 87, 84, 76, 96, 88, 79, 82, 80, 91,
+  82, 85, 85, 96, 89, 99, 76, 80, 64, 70,
+  90, 79, 82, 78, 89, 88, 75, 67, 66, 65,
+  90, 85, 87, 84, 83, 87, 74, 64, 94, 76,
+  65, 80, 81, 72, 93, 83, 69, 86, 94, 75,
+  74, 77, 75, 95, 78, 75, 79, 68, 85, 77,
+  85, 83, 85, 72, 92, 77, 87, 78, 94, 88,
+  92, 73, 85, 91, 93, 83, 106, 82, 79, 92,
+  71, 69, 88, 86, 92, 86, 96, 95, 94, 67,
+  84, 79, 93, 81, 91, 82, 92, 77, 79, 84,
+  96, 81, 79, 80, 78, 91, 81, 96, 86, 82,
+  85, 95, 89, 87, 86, 93, 92, 82, 96, 71,
+  71, 90, 76, 84, 69, 77, 84, 79, 89, 91,
+  82, 78, 92, 90, 87, 82, 89, 85, 81, 77,
+  85, 79, 85, 85, 85, 90, 84, 74, 85, 79,
+  77, 78, 91, 99, 85, 80, 77, 89, 95, 78,
+  82, 91, 90, 89, 85, 89, 88, 84, 88, 87,
+  72, 86, 76, 85, 82, 94, 107, 88, 89, 84,
+  88, 92, 88, 97, 80, 80, 96, 87, 85, 95,
+  78, 74, 73, 86, 80, 79, 90, 98, 66, 78,
+  86, 73, 85, 87, 119, 70, 88, 91, 83, 83,
+  79, 83, 93, 88, 88, 101, 76, 87, 68, 104,
+  86, 80, 96, 100, 93, 65, 55, 73, 72, 79,
+  85, 89, 103, 75, 80, 76, 74, 69, 73, 86,
+  75, 88, 77, 81, 98, 92, 93, 65, 72, 72,
+  90, 83, 97, 73, 82, 86, 93, 83, 84, 73,
+  80, 101, 73, 87, 80, 86, 78, 88, 93, 101,
+  91, 96, 87, 70, 76, 77, 95, 80, 87, 73,
+  88, 87, 82, 73, 65, 89, 85, 93, 85, 86,
+  81, 86, 82, 67, 79, 79, 65, 91, 73, 83,
+  90, 84, 73, 73, 109, 76, 76, 78, 82, 94,
+  79, 77, 82, 69, 80, 86, 80, 88, 89, 70,
+  87, 81, 82, 89, 84, 94, 83, 82, 82, 88,
+  92, 73, 129, 77, 77, 90, 74, 75, 84, 82,
+  99, 89, 92, 93, 91, 76, 79, 80, 87, 85,
+  92, 76, 90, 75, 51, 79, 79, 84, 81, 84,
+  79, 87, 85, 98, 80, 80, 78, 89, 83, 86,
+  82, 89, 90, 74, 89, 73, 67, 80, 84, 76,
+  82, 74, 85, 83, 89, 96, 83, 76, 92, 88,
+  78, 86, 89, 91, 90, 82, 81, 89, 84, 88,
+  92, 81, 76, 75, 93, 84, 80, 81, 91, 92,
+  95, 82, 69, 87, 88, 85, 78, 94, 76, 89,
+  79, 84, 91, 86, 76, 84, 77, 79, 85, 86,
+  77, 87, 102, 84, 84, 84, 82, 87, 89, 88,
+  86, 76, 81, 78, 76, 86, 91, 79, 81, 75,
+  85, 85, 93, 90, 92, 73, 81, 103, 87, 84,
+  113, 89, 79, 90, 72, 72, 94, 84, 81, 99,
+  95, 93, 105, 77, 92, 81, 90, 91, 91, 76,
+  85, 86, 78, 92, 93, 80, 86, 91, 76, 89,
+  80, 107, 96, 88, 96, 90, 101, 90, 86, 88,
+  78, 86, 89, 79, 72, 97, 71, 93, 76, 83,
+  95, 79, 88, 91, 88, 83, 75, 87, 79, 73,
+  100, 86, 80, 75, 87, 82, 74, 75, 86, 79,
+  89, 69, 82, 77, 78, 88, 84, 85, 87, 90,
+  78, 102, 87, 81, 79, 101, 82, 88, 76, 96,
+  94, 90, 89, 92, 82, 89, 85, 88, 85, 96,
+  100, 90, 81, 82, 103, 77, 91, 92, 101, 95,
+  81, 80, 83, 87, 66, 93, 96, 109, 75, 78,
+  95, 87, 80, 85, 106, 83, 66, 65, 91, 103,
+  80, 66, 83, 80, 97, 81, 81, 81, 93, 80,
+  72, 91, 100, 89, 91, 76, 93, 90, 73, 71,
+  81, 86, 77, 70, 86, 80, 66, 79, 90, 75,
+  91, 75, 70, 85, 75, 92, 89, 105, 104, 80,
+  73, 90, 90, 94, 80, 91, 73, 97, 81, 90,
+  96, 86, 83, 57, 88, 88, 79, 90, 84, 85,
+  104, 93, 88, 93, 77, 104, 90, 96, 105, 86,
+  89, 86, 83, 90, 93, 88, 89, 73, 88, 79,
+  97, 87, 80, 73, 95, 95, 79, 74, 86, 81,
+  57, 69, 79, 108, 80, 90, 98, 83, 96, 101,
+  78, 93, 90, 82, 72, 72, 90, 95, 80, 82,
+  82, 76, 70, 86, 90, 107, 74, 83, 91, 90,
+  77, 76, 91, 78, 66, 71, 78, 89, 76, 62,
+  102, 86, 90, 80, 91, 91, 87, 70, 73, 73,
+  91, 94, 93, 76, 80, 91, 78, 66, 85, 88,
+  74, 78, 84, 89, 61, 81, 85, 80, 90, 72,
+  71, 86, 65, 80, 89, 101, 109, 65, 69, 84,
+  75, 97, 71, 96, 73, 91, 92, 96, 97, 78,
+  92, 57, 87, 78, 88, 86, 82, 83, 105, 84,
+  91, 92, 74, 103, 77, 89, 98, 85, 97, 81,
+  86, 94, 90, 80, 86, 71, 84, 101, 89, 89,
+  69, 71, 98, 94, 72, 74, 96, 81, 49, 87,
+  76, 104, 79, 101, 98, 80, 93, 94, 78, 77,
+  99, 76, 72, 64, 91, 78, 90, 92, 82, 86,
+  76, 105, 88, 92, 81, 80, 73, 84, 81, 89,
+  83, 82, 75, 86, 79, 93, 94, 76, 101, 84,
+  90, 90, 82, 96, 79, 94, 84, 79, 81, 95,
+  95, 82, 69, 78, 98, 74, 85, 83, 85, 90,
+  85, 99, 87, 79, 83, 76, 83, 84, 92, 85,
+  91, 84, 78, 84, 94, 70, 77, 67, 75, 90,
+  84, 82, 94, 68, 84, 84, 96, 84, 91, 67,
+  87, 86, 77, 95, 83, 84, 82, 73, 75, 80,
+  66, 66, 84, 87, 96, 97, 106, 86, 94, 83,
+  109, 82, 88, 76, 71, 83, 96, 84, 91, 86,
+  66, 92, 82, 79, 88, 85, 73, 83, 75, 82,
+  89, 89, 77, 79, 96, 83, 94, 101, 90, 78,
+  78, 89, 82, 82, 76, 81, 75, 94, 81, 73,
+  86, 101, 75, 84, 76, 88, 78, 83, 91, 77,
+  69, 76, 84, 86, 72, 66, 95, 81, 82, 81,
+  94, 80, 100, 85, 71, 99, 109, 83, 89, 52,
+  76, 75, 106, 54, 85, 87, 58, 78, 80, 76,
+  64, 83, 92, 79, 88, 73, 90, 94, 72, 90,
+  97, 97, 98, 69, 86, 90, 98, 90, 75, 96,
+  73, 64, 96, 91, 90, 77, 84, 67, 81, 76,
+  78, 80, 90, 87, 83, 89, 90, 83, 87, 92,
+  87, 105, 99, 98, 113, 86, 83, 95, 90, 85,
+  81, 71, 74, 72, 90, 83, 80, 72, 92, 88,
+  77, 76, 90, 82, 56, 66, 80, 107, 60, 94,
+  83, 83, 83, 80, 77, 97, 89, 74, 71, 64,
+  71, 87, 86, 81, 73, 76, 88, 69, 77, 97,
+  75, 92, 79, 90, 78, 79, 81, 75, 65, 85,
+  82, 76, 97, 64, 101, 82, 73, 81, 108, 98,
+  109, 78, 70, 84, 92, 90, 91, 44, 83, 67,
+  131, 57, 80, 89, 57, 75, 75, 97, 58, 82,
+  92, 85, 91, 69, 83, 85, 61, 71, 100, 89,
+  103, 59, 78, 86, 75, 93, 73, 106, 74, 66,
+  78, 100, 79, 76, 95, 62, 83, 69, 73, 74,
+  86, 84, 82, 80, 91, 94, 72, 98, 74, 95,
+  85, 86, 116, 86, 69, 104, 86, 84, 93, 61,
+  76, 81, 82, 82, 64, 64, 95, 88, 77, 70,
+  102, 80, 51, 91, 81, 110, 85, 99, 81, 82,
+  84, 78, 78, 77, 93, 68, 69, 63, 82, 75,
+  88, 94, 84, 82, 80, 91, 81, 92, 82, 80,
+  75, 88, 71, 84, 80, 81, 85, 93, 83, 76,
+  101, 81, 89, 80, 77, 92, 101, 88, 79, 104,
+  85, 82, 78, 93, 92, 75, 72, 70, 107, 69,
+  74, 86, 73, 100, 75, 95, 82, 81, 77, 75,
+  88, 86, 97, 80, 87, 82, 72, 74, 88, 72,
+  91, 70, 68, 88, 75, 77, 90, 61, 81, 77,
+  86, 83, 88, 78, 75, 77, 73, 87, 84, 75,
+  79, 81, 70, 78, 65, 73, 74, 89, 100, 83,
+  99, 90, 97, 82, 99, 79, 99, 74, 72, 79,
+  96, 80, 100, 78, 73, 87, 85, 76, 93, 76,
+  74, 93, 83, 87, 108, 88, 72, 83, 90, 75,
+  103, 87, 93, 74, 80, 85, 95, 81, 88, 84,
+  88, 71, 82, 72, 89, 82, 83, 91, 78, 85,
+  65, 78, 84, 78, 99, 86, 84, 89, 86, 81,
+  98, 63, 109, 91, 89, 84, 80, 112, 94, 102,
+  80, 86, 84, 72, 71, 70, 109, 61, 89, 83,
+  79, 108, 75, 77, 94, 82, 86, 89, 91, 81,
+  99, 73, 94, 88, 77, 80, 94, 69, 91, 78,
+  78, 89, 71, 83, 84, 75, 86, 87, 101, 78,
+  75, 81, 93, 65, 76, 78, 95, 85, 83, 87,
+  79, 77, 80, 67, 76, 93, 102, 83, 103, 92,
+  81, 78, 100, 87, 72, 77, 70, 73, 95, 78,
+  123, 93, 74, 79, 102, 74, 86, 83, 76, 70,
+  77, 79, 71, 95, 75, 100, 82, 77, 82, 100,
+  92, 82, 79, 90, 86, 76, 74, 86, 89, 73,
+  84, 71, 85, 85, 80, 91, 80, 81, 70, 74,
+  76, 83, 93, 91, 94, 87, 84, 87, 89, 64,
+  107, 89, 101, 86, 83, 105, 93, 88, 80, 75,
+  81, 63, 86, 59, 127, 58, 79, 84, 88, 111,
+  65, 78, 91, 83, 87, 86, 92, 83, 103, 86,
+  94, 77, 73, 74, 95, 74, 88, 84, 65, 89,
+  77, 83, 81, 81, 76, 85, 96, 80, 80, 83,
+  91, 67, 80, 70, 90, 82, 82, 74, 74, 89,
+  70, 71, 67, 90, 97, 76, 96, 94, 79, 79,
+  95, 88, 96, 76, 73, 75, 91, 76, 136, 79,
+  67, 80, 110, 71, 96, 77, 79, 78, 81, 79,
+  82, 101, 77, 94, 86, 79, 85, 88, 94, 84,
+  75, 94, 86, 76, 68, 94, 90, 96, 83, 85,
+  81, 74, 84, 83, 80, 83, 68, 82, 83, 83,
+  108, 86, 89, 81, 74, 88, 87, 84, 95, 69,
+  83, 76, 73, 107, 102, 84, 79, 83, 85, 80,
+  80, 69, 92, 73, 77, 88, 84, 98, 73, 77,
+  83, 80, 85, 82, 93, 101, 97, 77, 95, 91,
+  62, 75, 82, 75, 90, 68, 70, 91, 78, 74,
+  87, 72, 78, 79, 95, 80, 80, 85, 78, 75,
+  83, 83, 94, 84, 89, 75, 75, 82, 77, 62,
+  78, 83, 81, 78, 86, 91, 89, 77, 88, 80,
+  100, 73, 66, 80, 91, 76, 106, 92, 78, 85,
+  88, 91, 82, 70, 89, 87, 92, 79, 86, 90,
+  84, 93, 95, 80, 95, 95, 91, 78, 86, 97,
+  101, 95, 91, 80, 72, 78, 82, 95, 93, 84,
+  77, 94, 85, 97, 67, 70, 70, 56, 81, 82,
+  69, 117, 93, 76, 81, 91, 103, 80, 100, 89,
+  81, 84, 76, 81, 91, 86, 108, 86, 74, 69,
+  96, 80, 68, 75, 85, 74, 81, 86, 87, 79,
+  85, 92, 92, 81, 98, 100, 74, 90, 99, 83,
+  88, 83, 113, 73, 60, 84, 79, 77, 59, 136,
+  80, 101, 75, 95, 82, 80, 79, 87, 66, 74,
+  83, 72, 84, 80, 75, 80, 74, 114, 85, 90,
+  86, 81, 90, 90, 99, 78, 85, 81, 89, 81,
+  98, 81, 87, 88, 82, 65, 87, 79, 111, 72,
+  84, 60, 85, 77, 116, 101, 99, 85, 106, 77,
+  70, 72, 97, 93, 89, 85, 72, 84, 102, 79,
+  93, 87, 63, 86, 72, 91, 104, 90, 75, 98,
+  100, 89, 65, 68, 77, 64, 103, 70, 58, 102,
+  83, 77, 84, 83, 104, 85, 98, 85, 69, 84,
+  80, 89, 89, 75, 116, 88, 79, 76, 98, 81,
+  60, 78, 78, 70, 98, 87, 79, 81, 86, 93,
+  90, 82, 119, 111, 77, 85, 94, 83, 91, 84,
+  112, 77, 62, 94, 74, 80, 58, 151, 113, 100,
+  72, 91, 77, 85, 77, 81, 59, 78, 77, 62,
+  83, 81, 77, 76, 77, 120, 86, 88, 78, 95,
+  96, 80, 98, 76, 95, 77, 89, 90, 101, 110,
+  94, 91, 86, 60, 88, 87, 117, 73, 81, 63,
+  78, 82, 121, 104, 97, 82, 118, 70, 77, 72,
+  101, 91, 97, 85, 74, 80, 89, 69, 78, 79,
+  81, 90, 82, 103, 93, 84, 77, 95, 83, 77,
+  73, 72, 72, 63, 78, 74, 68, 95, 79, 74,
+  85, 96, 98, 88, 88, 80, 83, 86, 85, 86,
+  81, 81, 105, 97, 86, 70, 92, 79, 80, 77,
+  88, 74, 83, 83, 85, 79, 86, 78, 84, 86,
+  93, 87, 75, 89, 98, 83, 82, 83, 109, 75,
+  59, 83, 74, 82, 70, 109, 103, 93, 79, 94,
+  76, 80, 80, 85, 72, 76, 84, 81, 81, 85,
+  76, 77, 79, 96, 83, 95, 89, 79, 90, 86,
+  97, 79, 88, 79, 83, 82, 94, 97, 84, 88,
+  83, 74, 81, 78, 108, 81, 81, 73, 88, 79,
+  110, 89, 77, 83, 96, 84, 88, 76, 98, 93,
+  90, 88, 73, 82, 98, 95, 98, 80, 84, 86,
+  87, 86, 79, 89, 75, 94, 92, 85, 85, 81,
+  78, 84, 86, 85, 63, 93, 106, 85, 91, 98,
+  76, 74, 86, 96, 93, 86, 81, 81, 82, 87,
+  79, 83, 79, 78, 80, 77, 82, 78, 81, 84,
+  94, 87, 85, 75, 76, 91, 91, 80, 90, 84,
+  82, 82, 65, 88, 84, 74, 80, 73, 82, 78,
+  80, 90, 78, 111, 75, 91, 73, 83, 88, 73,
+  70, 73, 65, 72, 89, 78, 93, 86, 87, 82,
+  78, 92, 89, 96, 77, 87, 68, 93, 86, 81,
+  88, 76, 87, 84, 77, 69, 85, 82, 88, 71,
+  85, 89, 92, 78, 74, 90, 79, 76, 97, 79,
+  103, 85, 84, 79, 92, 72, 83, 92, 73, 74,
+  95, 88, 87, 97, 85, 91, 81, 82, 83, 91,
+  77, 87, 76, 92, 110, 78, 77, 87, 86, 90,
+  94, 91, 73, 70, 80, 94, 98, 87, 80, 72,
+  78, 84, 96, 91, 86, 82, 87, 72, 79, 94,
+  75, 80, 74, 73, 72, 93, 79, 97, 106, 76,
+  80, 70, 82, 66, 85, 78, 74, 93, 79, 79,
+  52, 89, 82, 81, 76, 80, 62, 72, 74, 110,
+  80, 73, 78, 78, 75, 80, 98, 69, 72, 74,
+  61, 78, 85, 85, 94, 76, 92, 80, 79, 73,
+  89, 118, 82, 86, 55, 97, 74, 77, 89, 68,
+  102, 80, 63, 76, 80, 83, 92, 61, 84, 97,
+  98, 71, 73, 91, 77, 78, 88, 70, 75, 84,
+  87, 73, 86, 70, 73, 92, 72, 79, 99, 81,
+  95, 86, 85, 82, 85, 105, 89, 95, 80, 89,
+  75, 94, 79, 80, 91, 77, 80, 82, 85, 84,
+  83, 95, 82, 81, 91, 100, 84, 79, 77, 80,
+  91, 81, 83, 80, 90, 83, 82, 87, 79, 78,
+  81, 81, 72, 78, 87, 80, 85, 74, 82, 77,
+  76, 81, 85, 84, 95, 97, 80, 80, 72, 79,
+  82, 79, 88, 76, 82, 82, 78, 87, 78, 95,
+  112, 88, 76, 87, 83, 79, 79, 86, 74, 75,
+  92, 82, 95, 88, 84, 80, 81, 89, 87, 87,
+  74, 89, 76, 89, 97, 89, 91, 75, 89, 88,
+  82, 91, 86, 87, 88, 74, 86, 88, 90, 85,
+  76, 86, 86, 82, 85, 75, 80, 89, 82, 84,
+  82, 76, 81, 89, 72, 78, 89, 88, 85, 77,
+  85, 86, 85, 88, 78, 87, 74, 94, 77, 95,
+  99, 76, 89, 73, 75, 89, 76, 77, 76, 81,
+  97, 75, 88, 93, 71, 82, 81, 87, 83, 84,
+  96, 88, 86, 89, 72, 80, 85, 85, 80, 80,
+  90, 90, 79, 89, 84, 87, 82, 79, 81, 81,
+  79, 88, 80, 83, 75, 78, 79, 79, 75, 76,
+  74, 73, 87, 86, 83, 83, 82, 73, 84, 87,
+  82, 77, 83, 68, 87, 79, 87, 80, 90, 83,
+  94, 84, 77, 72, 82, 81, 89, 102, 75, 90,
+  83, 82, 83, 83, 84, 75, 76, 91, 76, 82,
+  85, 89, 78, 75, 84, 89, 80, 87, 76, 96,
+  86, 84, 80, 80, 82, 88, 79, 90, 92, 80,
+  79, 80, 71, 87, 95, 87, 75, 87, 81, 90,
+  88, 86, 87, 83, 72, 84, 78, 88, 110, 91,
+  94, 83, 80, 96, 67, 87, 87, 77, 88, 78,
+  87, 92, 63, 73, 79, 90, 83, 81, 91, 88,
+  82, 73, 78, 86, 82, 97, 82, 83, 88, 103,
+  77, 92, 81, 79, 84, 72, 87, 84, 73, 86,
+  66, 80, 68, 80, 74, 81, 67, 81, 74, 81,
+  75, 87, 79, 89, 92, 70, 74, 76, 80, 81,
+  93, 58, 90, 82, 85, 85, 91, 99, 94, 71,
+  85, 77, 84, 73, 91, 93, 66, 88, 80, 85,
+  72, 90, 81, 65, 88, 88, 65, 75, 79, 90,
+  74, 76, 78, 91, 65, 80, 80, 94, 85, 83,
+  83, 78, 72, 90, 72, 91, 84, 78, 64, 79,
+  65, 90, 96, 81, 89, 97, 80, 88, 82, 97,
+  84, 89, 74, 95, 79, 90, 90, 89, 87, 70,
+  74, 81, 76, 84, 87, 91, 84, 75, 82, 98,
+  82, 84, 77, 89, 81, 79, 94, 75, 87, 79,
+  74, 84, 80, 81, 81, 79, 76, 84, 87, 86,
+  73, 74, 83, 81, 83, 86, 82, 88, 82, 74,
+  76, 79, 79, 74, 79, 77, 81, 72, 83, 85,
+  80, 81, 84, 79, 87, 87, 83, 85, 87, 78,
+  89, 89, 82, 82, 94, 83, 98, 89, 75, 73,
+  78, 85, 89, 91, 76, 83, 84, 79, 86, 84,
+  86, 74, 90, 89, 82, 81, 88, 92, 79, 79,
+  87, 83, 80, 90, 77, 88, 88, 82, 86, 80,
+  89, 86, 80, 91, 86, 82, 83, 85, 72, 89,
+  90, 89, 72, 81, 79, 80, 92, 89, 73, 91,
+  90, 87, 80, 90, 68, 85, 58, 95, 90, 78,
+  94, 96, 79, 73, 89, 83, 94, 96, 91, 86,
+  88, 85, 84, 85, 77, 83, 80, 114, 82, 86,
+  88, 79, 78, 82, 66, 94, 97, 81, 84, 74,
+  78, 89, 81, 90, 76, 86, 87, 92, 93, 83,
+  97, 89, 85, 88, 82, 65, 63, 82, 72, 112,
+  89, 86, 104, 82, 88, 79, 75, 95, 88, 73,
+  87, 86, 85, 87, 95, 97, 87, 86, 60, 89,
+  88, 79, 112, 76, 82, 88, 98, 83, 83, 84,
+  86, 80, 87, 99, 89, 88, 65, 86, 101, 89,
+  72, 78, 76, 86, 82, 120, 79, 94, 59, 83,
+  80, 84, 74, 80, 71, 100, 81, 76, 87, 82,
+  80, 85, 94, 67, 85, 86, 86, 63, 79, 43,
+  62, 87, 104, 78, 78, 96, 86, 84, 54, 82,
+  82, 79, 86, 117, 82, 77, 85, 67, 110, 96,
+  73, 89, 72, 76, 88, 92, 77, 100, 87, 91,
+  75, 92, 95, 87, 84, 88, 89, 93, 75, 89,
+  67, 89, 86, 84, 80, 92, 78, 64, 86, 89,
+  73, 72, 76, 98, 67, 90, 87, 76, 84, 83,
+  98, 87, 75, 77, 83, 65, 79, 80, 79, 84,
+  84, 84, 53, 86, 76, 87, 66, 87, 81, 96,
+  67, 76, 59, 94, 73, 94, 99, 80, 98, 80,
+  76, 77, 77, 86, 137, 70, 77, 85, 82, 90,
+  91, 101, 75, 86, 80, 99, 81, 101, 81, 74,
+  80, 91, 82, 59, 76, 87, 81, 86, 79, 90,
+  83, 79, 92, 77, 93, 74, 79, 52, 72, 83,
+  82, 78, 70, 93, 88, 89, 67, 91, 85, 84,
+  80, 97, 89, 82, 86, 73, 88, 96, 80, 84,
+  75, 77, 89, 78, 91, 87, 71, 81, 80, 83,
+  83, 81, 83, 82, 88, 91, 71, 88, 73, 84,
+  88, 93, 85, 80, 84, 76, 90, 87, 80, 79,
+  89, 91, 90, 82, 85, 86, 82, 83, 87, 88,
+  88, 80, 84, 78, 77, 83, 84, 84, 83, 79,
+  70, 89, 83, 93, 91, 84, 89, 97, 69, 94,
+  69, 99, 102, 95, 92, 81, 84, 85, 91, 89,
+  85, 88, 92, 84, 86, 84, 80, 89, 90, 107,
+  83, 72, 91, 90, 99, 97, 75, 83, 82, 88,
+  77, 89, 79, 88, 95, 78, 80, 74, 96, 82,
+  91, 81, 81, 99, 91, 90, 80, 94, 68, 94,
+  61, 91, 85, 79, 101, 93, 74, 81, 97, 76,
+  86, 94, 82, 84, 87, 89, 84, 81, 80, 87,
+  70, 112, 93, 48, 84, 76, 87, 72, 67, 85,
+  104, 85, 75, 73, 83, 83, 75, 92, 72, 86,
+  91, 82, 91, 85, 94, 88, 84, 85, 89, 66,
+  68, 76, 66, 104, 87, 101, 72, 79, 88, 88,
+  77, 102, 90, 62, 75, 83, 83, 77, 95, 100,
+  81, 93, 63, 91, 80, 73, 106, 76, 91, 83,
+  105, 83, 84, 92, 77, 79, 93, 97, 93, 90,
+  68, 84, 101, 86, 83, 75, 80, 76, 88, 133,
+  82, 89, 74, 76, 76, 83, 82, 85, 70, 102,
+  84, 82, 81, 79, 84, 80, 102, 70, 83, 81,
+  89, 66, 79, 43, 62, 83, 108, 88, 88, 90,
+  87, 77, 54, 79, 86, 83, 78, 114, 82, 81,
+  75, 63, 110, 96, 78, 92, 77, 79, 80, 94,
+  66, 102, 75, 91, 74, 94, 97, 80, 84, 86,
+  86, 98, 78, 84, 70, 92, 84, 87, 75, 79,
+  73, 69, 81, 83, 76, 73, 76, 93, 64, 92,
+  87, 70, 86, 67, 85, 81, 68, 86, 77, 70,
+  75, 75, 69, 88, 87, 83, 55, 87, 73, 95,
+  65, 83, 79, 83, 64, 68, 56, 92, 64, 85,
+  99, 87, 80, 80, 65, 83, 77, 86, 108, 76,
+  77, 83, 70, 95, 96, 91, 71, 89, 80, 82,
+  86, 98, 75, 72, 80, 97, 89, 52, 75, 83,
+  73, 87, 86, 84, 79, 81, 86, 71, 99, 73,
+  83, 56, 75, 85, 83, 82, 78, 88, 85, 84,
+  69, 91, 83, 91, 81, 91, 94, 87, 76, 73,
+  90, 85, 77, 79, 82, 78, 94, 84, 78, 77,
+  82, 79, 78, 84, 88, 77, 83, 75, 90, 74,
+  69, 87, 70, 88, 86, 97, 83, 87, 78, 80,
+  89, 86, 82, 81, 93, 90, 81, 91, 84, 90,
+  87, 74, 87, 85, 84, 87, 79, 81, 79, 95,
+  84, 84, 87, 78, 74, 87, 89, 95, 90, 88,
+  94, 85, 69, 83, 69, 90, 88, 87, 91, 83,
+  83, 86, 77, 93, 87, 86, 73, 83, 82, 79,
+  68, 97, 92, 97, 80, 73, 84, 86, 96, 102,
+  74, 79, 71, 93, 83, 81, 77, 87, 88, 83,
+  91, 81, 104, 85, 84, 75, 82, 92, 86, 89,
+  77, 92, 74, 94, 77, 92, 82, 82, 89, 92,
+  71, 79, 102, 89, 94, 86, 85, 85, 76, 89,
+  82, 81, 84, 77, 68, 89, 98, 73, 90, 79,
+  84, 84, 84, 85, 86, 90, 96, 84, 84, 81,
+  78, 92, 79, 86, 91, 99, 85, 88, 91, 77,
+  83, 73, 84, 70, 77, 79, 76, 81, 83, 98,
+  64, 76, 84, 87, 86, 90, 91, 66, 89, 77,
+  80, 83, 86, 90, 85, 82, 68, 87, 90, 81,
+  86, 73, 82, 85, 94, 78, 92, 89, 78, 77,
+  89, 94, 98, 90, 94, 83, 85, 85, 91, 85,
+  89, 83, 87, 109, 87, 91, 86, 85, 91, 88,
+  86, 87, 78, 85, 73, 99, 84, 91, 83, 84,
+  97, 86, 77, 79, 90, 69, 75, 56, 65, 83,
+  93, 81, 93, 83, 84, 80, 67, 84, 87, 79,
+  86, 111, 89, 82, 82, 65, 95, 93, 78, 88,
+  76, 83, 83, 84, 79, 120, 75, 90, 84, 90,
+  94, 83, 81, 84, 89, 94, 74, 88, 78, 88,
+  84, 87, 82, 82, 78, 78, 84, 78, 77, 75,
+  84, 97, 80, 89, 91, 71, 84, 78, 82, 78,
+  78, 87, 80, 78, 79, 73, 80, 82, 85, 89,
+  61, 91, 77, 83, 71, 85, 82, 84, 74, 69,
+  65, 89, 77, 85, 98, 83, 76, 84, 77, 93,
+  82, 85, 82, 81, 79, 89, 68, 99, 86, 98,
+  79, 80, 83, 81, 84, 94, 80, 82, 83, 90,
+  82, 62, 72, 91, 89, 95, 87, 87, 78, 91,
+  83, 81, 96, 77, 86, 70, 75, 90, 83, 79,
+  80, 86, 82, 81, 79, 94, 84, 79, 84, 100,
+  90, 88, 83, 78, 79, 84, 80, 81, 79, 83,
+  92, 82, 82, 90, 81, 83, 81, 79, 85, 82,
+  83, 89, 83, 73, 65, 93, 78, 89, 85, 94,
+  89, 81, 85, 87, 85, 78, 81, 78, 94, 87,
+  92, 82, 82, 85, 83, 90, 78, 84, 92, 87,
+  82, 90, 83, 95, 89, 80, 87, 81, 77, 86,
+  87, 81, 93, 85, 96, 91, 86, 76, 77, 89,
+  92, 84, 88, 76, 83, 89, 85, 95, 85, 84,
+  80, 83, 80, 87, 76, 96, 81, 97, 85, 79,
+  87, 84, 92, 93, 81, 88, 79, 90, 74, 86,
+  71, 93, 100, 87, 76, 99, 86, 72, 87, 85,
+  79, 92, 91, 82, 90, 78, 81, 88, 72, 84,
+  80, 79, 78, 84, 67, 69, 90, 99, 66, 99,
+  81, 81, 87, 79, 91, 66, 81, 70, 93, 90,
+  86, 86, 67, 84, 77, 78, 87, 80, 78, 85,
+  77, 83, 74, 88, 72, 85, 88, 79, 76, 80,
+  72, 102, 90, 92, 89, 92, 88, 74, 86, 88,
+  87, 86, 74, 95, 94, 77, 99, 72, 95, 90,
+  81, 86, 104, 91, 74, 89, 87, 87, 83, 74,
+  86, 91, 91, 89, 101, 79, 95, 85, 86, 103,
+  76, 78, 90, 102, 97, 91, 83, 93, 114, 71,
+  98, 79, 75, 72, 83, 73, 94, 70, 84, 84,
+  69, 82, 88, 100, 78, 93, 87, 86, 89, 94,
+  80, 94, 122, 99, 80, 84, 81, 61, 75, 86,
+  83, 82, 74, 89, 77, 79, 74, 84, 78, 75,
+  89, 102, 81, 88, 113, 87, 74, 90, 79, 86,
+  94, 75, 86, 87, 81, 81, 75, 88, 72, 85,
+  86, 77, 79, 71, 82, 89, 87, 82, 72, 83,
+  74, 85, 77, 85, 81, 80, 90, 98, 86, 70,
+  94, 76, 88, 74, 92, 67, 61, 79, 73, 98,
+  80, 77, 105, 81, 86, 73, 87, 90, 92, 77,
+  85, 82, 79, 84, 77, 79, 81, 78, 92, 84,
+  80, 76, 79, 85, 92, 69, 82, 86, 86, 74,
+  93, 69, 84, 85, 72, 86, 90, 89, 94, 85,
+  61, 77, 76, 77, 96, 83, 72, 93, 64, 72,
+  71, 87, 78, 79, 66, 88, 89, 95, 102, 82,
+  130, 85, 86, 96, 86, 92, 76, 80, 90, 84,
+  83, 73, 92, 87, 83, 93, 79, 79, 92, 97,
+  99, 94, 91, 79, 98, 82, 87, 92, 94, 87,
+  82, 116, 92, 84, 76, 86, 80, 78, 80, 75,
+  87, 81, 66, 79, 83, 85, 90, 89, 81, 82,
+  75, 91, 88, 98, 92, 91, 88, 70, 77, 79,
+  89, 78, 92, 98, 76, 93, 69, 94, 97, 76,
+  84, 89, 80, 75, 91, 81, 102, 73, 72, 83,
+  81, 81, 89, 77, 87, 83, 91, 82, 77, 85,
+  71, 107, 82, 76, 64, 77, 89, 80, 102, 74,
+  90, 73, 68, 79, 62, 87, 74, 81, 89, 80,
+  82, 80, 88, 90, 76, 99, 82, 69, 73, 77,
+  87, 69, 86, 84, 87, 98, 94, 91, 71, 100,
+  91, 76, 87, 95, 71, 85, 96, 93, 85, 79,
+  74, 77, 73, 99, 81, 80, 80, 87, 72, 73,
+  75, 100, 75, 99, 75, 90, 84, 77, 94, 67,
+  79, 83, 78, 95, 83, 113, 76, 81, 94, 78,
+  73, 84, 65, 83, 89, 74, 76, 90, 77, 75,
+  90, 71, 81, 80, 75, 97, 98, 93, 93, 88,
+  85, 67, 72, 86, 91, 87, 66, 84, 87, 74,
+  91, 72, 96, 96, 83, 86, 86, 84, 81, 84,
+  80, 85, 87, 83, 83, 88, 91, 97, 93, 92,
+  102, 79, 81, 109, 71, 75, 84, 102, 94, 91,
+  87, 90, 96, 73, 93, 89, 80, 83, 68, 77,
+  95, 68, 72, 73, 73, 89, 99, 88, 77, 94,
+  81, 86, 86, 83, 81, 92, 119, 94, 95, 78,
+  83, 59, 75, 84, 77, 88, 73, 90, 69, 84,
+  78, 91, 76, 82, 92, 105, 89, 91, 130, 85,
+  73, 91, 75, 90, 98, 83, 94, 81, 72, 78,
+  62, 89, 78, 85, 77, 72, 92, 73, 64, 93,
+  99, 83, 74, 84, 76, 79, 71, 82, 83, 78,
+  95, 74, 88, 66, 97, 74, 82, 71, 89, 66,
+  55, 85, 66, 88, 75, 75, 86, 80, 81, 79,
+  88, 92, 85, 74, 74, 87, 85, 86, 77, 81,
+  85, 82, 94, 90, 69, 79, 73, 72, 93, 79,
+  76, 96, 84, 87, 85, 71, 79, 71, 76, 83,
+  77, 84, 87, 87, 63, 76, 89, 87, 92, 80,
+  78, 83, 71, 81, 77, 85, 82, 74, 62, 88,
+  85, 82, 113, 78, 136, 79, 78, 91, 88, 97,
+  77, 80, 83, 80, 85, 69, 103, 88, 85, 90,
+  86, 84, 96, 88, 104, 91, 77, 74, 88, 87,
+  84, 93, 94, 86, 84, 118, 92, 83, 85, 85,
+  83, 60, 78, 70, 77, 76, 72, 80, 104, 89,
+  79, 76, 87, 83, 75, 93, 89, 105, 99, 85,
+  73, 71, 70, 79, 83, 77, 93, 96, 74, 97,
+  69, 91, 90, 61, 85, 90, 76, 81, 84, 78,
+  89, 78, 72, 92, 86, 75, 99, 76, 92, 85,
+  94, 83, 77, 81, 72, 79, 78, 83, 70, 81,
+  87, 93, 87, 77, 77, 69, 66, 79, 58, 91,
+  82, 78, 82, 75, 99, 90, 80, 91, 77, 101,
+  80, 72, 70, 80, 85, 70, 86, 73, 84, 86,
+  93, 87, 87, 90, 95, 84, 88, 81, 69, 88,
+  94, 81, 82, 84, 72, 84, 77, 92, 80, 82,
+  75, 87, 85, 81, 89, 90, 82, 82, 82, 86,
+  78, 79, 85, 78, 81, 82, 75, 98, 83, 109,
+  94, 82, 96, 79, 72, 86, 76, 79, 100, 80,
+  90, 73, 86, 76, 81, 80, 77, 81, 87, 99,
+  97, 79, 84, 87, 85, 69, 80, 88, 87, 82,
+  73, 88, 89, 68, 92, 67, 96, 79, 89, 87,
+  85, 83, 86, 86, 83, 87, 84, 86, 89, 81,
+  89, 88, 89, 81, 96, 79, 84, 99, 84, 80,
+  85, 96, 89, 97, 76, 91, 81, 84, 82, 81,
+  87, 75, 69, 83, 92, 68, 78, 83, 75, 81,
+  82, 88, 79, 83, 73, 87, 78, 94, 81, 88,
+  110, 88, 82, 83, 81, 66, 79, 90, 81, 91,
+  85, 86, 83, 81, 78, 87, 76, 83, 93, 92,
+  86, 88, 102, 84, 82, 82, 81, 94, 92, 86,
+  86, 87, 87, 78, 66, 83, 91, 80, 76, 77,
+  88, 82, 71, 92, 96, 85, 87, 89, 86, 73,
+  81, 87, 83, 88, 86, 76, 87, 76, 89, 86,
+  79, 73, 86, 75, 69, 83, 73, 88, 75, 69,
+  76, 80, 83, 76, 92, 91, 90, 74, 84, 89,
+  89, 90, 85, 82, 87, 80, 83, 87, 83, 75,
+  73, 69, 85, 78, 71, 90, 92, 89, 80, 81,
+  88, 81, 74, 85, 68, 91, 90, 84, 79, 77,
+  96, 87, 87, 74, 88, 98, 69, 78, 85, 88,
+  82, 72, 73, 87, 87, 89, 96, 85, 96, 78,
+  67, 89, 83, 87, 81, 87, 85, 92, 89, 72,
+  98, 82, 84, 93, 79, 86, 87, 89, 93, 78,
+  90, 85, 80, 83, 91, 95, 87, 89, 74, 101,
+  92, 85, 80, 81, 99, 64, 72, 75, 81, 86,
+  76, 74, 96, 82, 82, 89, 83, 85, 76, 95,
+  91, 107, 87, 80, 70, 76, 68, 99, 79, 85,
+  97, 97, 85, 91, 81, 97, 79, 69, 83, 98,
+  87, 79, 87, 87, 90, 82, 83, 88, 89, 77,
+  95, 80, 86, 82, 85, 79, 84, 80, 64, 75,
+  78, 81, 70, 88, 87, 84, 87, 88, 78, 81,
+  79, 79, 69, 92, 89, 82, 75, 77, 99, 80,
+  82, 90, 92, 109, 79, 77, 85, 90, 90, 73,
+  84, 79, 83, 85, 91, 88, 74, 81, 89, 96,
+  89, 76, 87, 70, 80, 86, 77, 88, 72, 86,
+  84, 79, 88, 77, 102, 76, 61, 84, 73, 82,
+  74, 80, 95, 89, 100, 106, 89, 87, 92, 88,
+  97, 78, 80, 81, 85, 89, 87, 82, 74, 91,
+  72, 82, 78, 98, 89, 98, 89, 84, 71, 76,
+  70, 80, 66, 86, 87, 76, 75, 97, 104, 76,
+  97, 83, 94, 83, 78, 99, 81, 81, 78, 72,
+  69, 100, 68, 89, 101, 97, 81, 84, 73, 88,
+  93, 94, 82, 91, 81, 90, 100, 87, 72, 78,
+  96, 91, 55, 87, 73, 72, 80, 79, 82, 107,
+  97, 76, 88, 76, 85, 79, 84, 83, 73, 93,
+  94, 92, 92, 79, 87, 65, 73, 78, 90, 82,
+  86, 64, 83, 82, 71, 86, 88, 91, 92, 83,
+  79, 74, 90, 94, 71, 86, 72, 88, 84, 66,
+  81, 81, 107, 78, 61, 81, 83, 81, 74, 87,
+  105, 95, 88, 105, 88, 80, 83, 86, 105, 96,
+  80, 79, 88, 86, 86, 84, 70, 89, 71, 72,
+  72, 93, 81, 98, 85, 90, 69, 77, 80, 90,
+  68, 80, 87, 73, 69, 91, 97, 74, 103, 92,
+  88, 75, 72, 106, 95, 77, 77, 75, 70, 95,
+  69, 97, 105, 96, 72, 80, 77, 90, 89, 90,
+  82, 92, 71, 76, 110, 79, 70, 78, 92, 83,
+  52, 86, 79, 81, 79, 85, 88, 99, 100, 77,
+  94, 82, 84, 82, 76, 84, 76, 83, 91, 90,
+  90, 79, 89, 61, 90, 79, 92, 85, 94, 59,
+  88, 89, 79, 81, 84, 94, 85, 81, 93, 79,
+  83, 87, 74, 92, 74, 91, 88, 77, 84, 80,
+  100, 83, 72, 77, 82, 81, 76, 80, 93, 92,
+  94, 92, 90, 77, 91, 84, 95, 110, 87, 81,
+  82, 90, 86, 84, 70, 90, 73, 79, 73, 86,
+  88, 98, 86, 79, 74, 77, 77, 86, 71, 88,
+  89, 73, 75, 93, 98, 83, 90, 84, 95, 78,
+  79, 93, 94, 84, 75, 81, 69, 100, 71, 94,
+  102, 91, 81, 84, 74, 83, 89, 92, 92, 81,
+  79, 80, 102, 83, 78, 79, 79, 90, 59, 89,
+  85, 82, 81, 93, 79, 109, 96, 76, 91, 73,
+  79, 81, 72, 81, 74, 79, 82, 90, 83, 77,
+  87, 66, 96, 78, 92, 84, 89, 65, 79, 76,
+  73, 87, 77, 90, 86, 88, 77, 70, 97, 86,
+  87, 83, 84, 78, 84, 73, 94, 89, 116, 71,
+  58, 82, 75, 90, 77, 72, 88, 102, 88, 103,
+  80, 86, 85, 82, 83, 83, 80, 69, 86, 81,
+  80, 87, 78, 86, 74, 77, 70, 97, 79, 102,
+  85, 88, 63, 75, 77, 79, 72, 91, 72, 77,
+  87, 92, 90, 74, 88, 92, 95, 81, 78, 90,
+  87, 78, 85, 78, 68, 102, 81, 85, 87, 95,
+  77, 84, 79, 79, 81, 81, 84, 91, 82, 106,
+  102, 93, 61, 83, 102, 86, 49, 84, 70, 80,
+  90, 74, 79, 99, 93, 80, 85, 84, 77, 98,
+  84, 79, 88, 88, 83, 84, 91, 81, 76, 68,
+  89, 81, 81, 102, 87, 69, 86, 101, 75, 101,
+  73, 85, 84, 79, 64, 85, 110, 85, 104, 81,
+  81, 76, 79, 73, 95, 93, 137, 65, 63, 75,
+  84, 107, 72, 76, 89, 112, 102, 87, 80, 86,
+  84, 77, 91, 81, 80, 74, 76, 80, 75, 82,
+  63, 77, 72, 83, 69, 83, 73, 126, 82, 81,
+  57, 74, 97, 77, 84, 77, 74, 67, 83, 90,
+  82, 68, 62, 88, 96, 66, 70, 84, 71, 60,
+  100, 89, 72, 115, 88, 88, 86, 99, 73, 76,
+  93, 96, 72, 77, 73, 82, 77, 117, 130, 83,
+  59, 75, 98, 71, 66, 78, 81, 89, 98, 85,
+  82, 95, 85, 80, 97, 84, 76, 118, 70, 74,
+  103, 76, 77, 82, 78, 78, 72, 64, 116, 83,
+  78, 115, 102, 65, 90, 126, 74, 85, 91, 92,
+  87, 83, 86, 76, 91, 88, 84, 84, 79, 89,
+  88, 69, 89, 84, 108, 87, 78, 81, 94, 86,
+  69, 71, 94, 97, 84, 76, 85, 73, 87, 83,
+  90, 113, 79, 72, 80, 76, 83, 84, 65, 85,
+  74, 72, 66, 78, 81, 102, 84, 80, 68, 75,
+  74, 88, 76, 86, 79, 73, 82, 90, 90, 74,
+  81, 86, 91, 76, 80, 90, 87, 79, 75, 86,
+  71, 96, 77, 96, 91, 92, 76, 81, 80, 89,
+  83, 82, 82, 79, 79, 97, 102, 85, 62, 82,
+  84, 86, 50, 82, 86, 85, 90, 95, 76, 102,
+  91, 77, 91, 83, 75, 89, 77, 77, 88, 83,
+  81, 83, 72, 78, 76, 65, 97, 80, 84, 96,
+  90, 74, 85, 91, 80, 89, 79, 88, 92, 90,
+  89, 73, 87, 79, 82, 80, 86, 79, 86, 69,
+  89, 87, 97, 80, 67, 78, 76, 89, 78, 73,
+  76, 92, 82, 88, 81, 88, 89, 84, 77, 83,
+  77, 83, 88, 84, 78, 87, 89, 84, 80, 77,
+  69, 95, 80, 99, 86, 92, 70, 79, 64, 89,
+  78, 97, 75, 77, 85, 87, 88, 80, 95, 87,
+  95, 83, 85, 78, 87, 79, 80, 85, 69, 96,
+  85, 89, 83, 91, 85, 84, 74, 77, 84, 86,
+  89, 76, 89, 104, 97, 111, 69, 85, 107, 88,
+  60, 83, 71, 79, 81, 78, 69, 104, 86, 79,
+  82, 81, 83, 91, 85, 79, 89, 84, 81, 88,
+  85, 85, 82, 87, 97, 77, 70, 97, 78, 76,
+  87, 85, 86, 93, 87, 85, 94, 82, 83, 81,
+  94, 78, 98, 77, 83, 82, 88, 77, 89, 87,
+  112, 75, 74, 75, 87, 92, 72, 68, 70, 94,
+  92, 80, 84, 85, 88, 79, 83, 86, 79, 85,
+  81, 84, 79, 80, 77, 80, 76, 77, 67, 88,
+  74, 114, 83, 86, 66, 75, 74, 85, 80, 89,
+  78, 72, 83, 84, 82, 77, 77, 86, 96, 76,
+  78, 83, 76, 67, 87, 98, 69, 94, 90, 89,
+  79, 95, 79, 81, 86, 88, 79, 78, 76, 75,
+  82, 115, 100, 107, 66, 84, 108, 78, 69, 82,
+  79, 81, 92, 86, 70, 98, 74, 81, 87, 82,
+  78, 99, 80, 79, 93, 75, 84, 91, 75, 84,
+  83, 82, 105, 84, 70, 106, 76, 76, 85, 106,
+  81, 83, 96, 94, 96, 78, 96, 75, 86, 81,
+  80, 80, 80, 90, 95, 68, 89, 83, 99, 86,
+  90, 77, 102, 85, 69, 72, 82, 84, 86, 78,
+  86, 74, 93, 83, 82, 111, 79, 83, 82, 86,
+  78, 85, 71, 83, 78, 77, 63, 80, 80, 102,
+  87, 85, 74, 77, 64, 78, 76, 90, 79, 74,
+  87, 82, 89, 81, 89, 83, 89, 76, 87, 86,
+  80, 78, 73, 94, 69, 91, 84, 95, 84, 87,
+  84, 83, 83, 85, 87, 83, 85, 71, 87, 98,
+  94, 91, 72, 84, 90, 88, 62, 82, 83, 78,
+  87, 87, 67, 106, 90, 75, 89, 77, 81, 88,
+  85, 75, 83, 84, 84, 89, 77, 81, 80, 84,
+  89, 78, 72, 90, 80, 86, 87, 80, 85, 93,
+  77, 90, 83, 80, 82, 91, 78, 85, 83, 69,
+  88, 85, 74, 71, 75, 95, 91, 75, 85, 78,
+  94, 70, 93, 82, 91, 96, 94, 81, 94, 80,
+  88, 77, 83, 73, 86, 90, 89, 85, 84, 66,
+  101, 79, 64, 91, 93, 83, 75, 94, 86, 92,
+  85, 90, 92, 83, 84, 86, 82, 96, 96, 82,
+  103, 88, 99, 67, 82, 89, 72, 103, 76, 83,
+  87, 97, 88, 80, 83, 76, 102, 76, 90, 80,
+  68, 97, 67, 72, 107, 93, 84, 79, 76, 75,
+  83, 83, 92, 93, 91, 66, 82, 73, 84, 71,
+  82, 83, 77, 83, 87, 90, 100, 72, 84, 95,
+  73, 85, 93, 77, 98, 94, 87, 97, 84, 80,
+  88, 84, 101, 104, 85, 79, 81, 89, 75, 84,
+  98, 68, 77, 90, 83, 82, 86, 60, 72, 83,
+  70, 71, 74, 74, 82, 76, 93, 83, 73, 73,
+  83, 73, 78, 93, 88, 88, 87, 81, 77, 76,
+  83, 78, 92, 85, 78, 91, 83, 67, 89, 73,
+  67, 86, 108, 70, 84, 92, 78, 84, 79, 98,
+  91, 89, 95, 94, 77, 89, 99, 116, 108, 109,
+  78, 80, 77, 93, 91, 88, 71, 84, 76, 93,
+  98, 82, 82, 76, 104, 73, 83, 75, 68, 89,
+  70, 70, 83, 98, 82, 75, 83, 78, 87, 81,
+  83, 99, 89, 63, 81, 90, 85, 87, 78, 83,
+  80, 82, 83, 92, 96, 63, 84, 88, 72, 88,
+  92, 69, 79, 93, 79, 90, 90, 76, 84, 86,
+  100, 102, 85, 87, 83, 82, 87, 87, 84, 89,
+  82, 88, 75, 87, 78, 71, 79, 89, 79, 70,
+  74, 100, 88, 77, 100, 70, 82, 73, 81, 82,
+  93, 96, 89, 88, 95, 86, 87, 74, 86, 86,
+  90, 88, 75, 84, 83, 68, 83, 75, 70, 89,
+  91, 68, 75, 94, 90, 85, 82, 83, 100, 93,
+  84, 84, 85, 96, 96, 73, 96, 88, 100, 65,
+  73, 87, 74, 94, 91, 82, 84, 98, 94, 79,
+  81, 89, 91, 74, 95, 81, 71, 86, 67, 71,
+  82, 87, 86, 78, 81, 85, 88, 84, 90, 90,
+  90, 63, 84, 74, 82, 93, 81, 82, 80, 80,
+  86, 86, 95, 75, 86, 92, 73, 106, 82, 69,
+  67, 93, 85, 89, 93, 81, 91, 83, 97, 99,
+  87, 78, 74, 99, 73, 95, 96, 75, 82, 84,
+  79, 75, 94, 73, 94, 95, 77, 76, 84, 87,
+  95, 77, 92, 74, 75, 77, 97, 76, 78, 102,
+  96, 79, 101, 78, 85, 72, 84, 67, 72, 82,
+  110, 89, 65, 67, 95, 74, 70, 98, 90, 83,
+  69, 86, 89, 84, 83, 105, 62, 81, 70, 78,
+  70, 88, 96, 99, 95, 90, 72, 70, 98, 95,
+  94, 70, 65, 77, 89, 97, 89, 67, 80, 80,
+  99, 92, 72, 97, 72, 96, 85, 79, 107, 94,
+  97, 83, 70, 79, 68, 93, 71, 104, 90, 76,
+  85, 88, 77, 62, 77, 82, 89, 73, 79, 86,
+  91, 61, 87, 100, 71, 76, 78, 69, 83, 100,
+  82, 91, 104, 77, 60, 83, 86, 83, 85, 90,
+  70, 91, 69, 82, 109, 60, 67, 84, 80, 69,
+  105, 65, 82, 99, 64, 67, 80, 58, 76, 71,
+  94, 90, 62, 82, 89, 57, 62, 93, 85, 83,
+  93, 83, 68, 78, 84, 69, 85, 74, 103, 98,
+  73, 71, 83, 60, 78, 93, 96, 84, 80, 88,
+  81, 83, 72, 111, 63, 83, 87, 78, 74, 83,
+  103, 137, 99, 134, 55, 98, 90, 104, 121, 58,
+  61, 78, 75, 91, 96, 74, 79, 83, 99, 95,
+  59, 84, 74, 85, 85, 80, 71, 99, 83, 77,
+  82, 78, 82, 91, 65, 102, 86, 74, 87, 119,
+  79, 77, 77, 81, 92, 78, 70, 85, 85, 45,
+  84, 93, 73, 70, 75, 62, 66, 103, 78, 86,
+  102, 73, 43, 88, 81, 78, 80, 100, 75, 94,
+  85, 91, 102, 74, 83, 90, 75, 78, 86, 72,
+  85, 100, 82, 77, 87, 95, 88, 81, 97, 72,
+  82, 82, 86, 79, 80, 101, 91, 86, 97, 93,
+  88, 73, 85, 83, 72, 80, 91, 88, 70, 66,
+  89, 76, 77, 100, 84, 77, 70, 88, 91, 83,
+  80, 94, 67, 87, 69, 80, 74, 87, 100, 87,
+  88, 91, 78, 67, 86, 92, 94, 65, 75, 74,
+  89, 94, 97, 68, 77, 86, 93, 90, 79, 93,
+  72, 89, 83, 83, 78, 89, 94, 81, 75, 83,
+  73, 90, 69, 98, 90, 75, 88, 83, 81, 88,
+  77, 82, 88, 73, 81, 87, 83, 68, 83, 102,
+  70, 99, 75, 63, 58, 99, 79, 88, 101, 83,
+  74, 78, 86, 79, 87, 86, 71, 90, 80, 101,
+  68, 86, 78, 82, 88, 82, 93, 98, 84, 85,
+  79, 83, 84, 99, 86, 85, 95, 85, 83, 68,
+  95, 75, 78, 97, 88, 76, 89, 74, 85, 81,
+  76, 72, 79, 89, 99, 89, 76, 70, 92, 77,
+  70, 84, 74, 83, 74, 94, 92, 86, 93, 97,
+  71, 80, 75, 79, 83, 83, 87, 102, 86, 82,
+  93, 72, 90, 89, 100, 83, 76, 81, 84, 103,
+  82, 77, 77, 83, 89, 90, 72, 85, 75, 92,
+  91, 85, 105, 94, 90, 87, 83, 107, 81, 89,
+  88, 95, 80, 78, 85, 86, 88, 78, 81, 80,
+  92, 87, 86, 89, 83, 79, 87, 82, 74, 81,
+  81, 78, 81, 96, 81, 87, 90, 82, 69, 82,
+  85, 96, 79, 88, 68, 81, 77, 93, 68, 85,
+  68, 83, 87, 79, 96, 90, 69, 87, 60, 73,
+  80, 77, 76, 82, 98, 101, 80, 69, 87, 60,
+  71, 90, 79, 76, 86, 81, 74, 82, 72, 78,
+  87, 81, 87, 93, 76, 74, 87, 70, 76, 85,
+  81, 84, 79, 92, 85, 82, 91, 97, 84, 80,
+  93, 82, 80, 83, 90, 124, 92, 106, 72, 84,
+  72, 86, 114, 79, 76, 83, 75, 99, 84, 80,
+  77, 84, 81, 91, 63, 71, 81, 81, 92, 87,
+  73, 97, 85, 85, 96, 98, 89, 83, 82, 87,
+  76, 80, 78, 106, 87, 83, 84, 80, 92, 88,
+  80, 88, 82, 71, 84, 77, 76, 74, 76, 68,
+  82, 98, 81, 87, 88, 79, 65, 86, 84, 90,
+  77, 91, 72, 79, 98, 97, 73, 86, 79, 86,
+  80, 84, 84, 92, 85, 94, 84, 83, 88, 105,
+  78, 86, 92, 79, 87, 75, 87, 78, 78, 97,
+  82, 84, 88, 90, 88, 80, 78, 88, 79, 86,
+  84, 92, 78, 72, 93, 77, 77, 85, 68, 80,
+  77, 96, 93, 80, 92, 89, 78, 84, 70, 81,
+  86, 78, 86, 88, 85, 84, 95, 71, 78, 84,
+  92, 83, 78, 81, 83, 97, 86, 77, 75, 79,
+  86, 88, 76, 83, 77, 91, 85, 91, 79, 88,
+  89, 89, 85, 101, 86, 83, 78, 90, 81, 78,
+  89, 82, 92, 90, 78, 82, 94, 89, 88, 89,
+  79, 85, 86, 82, 68, 97, 80, 77, 67, 97,
+  81, 86, 94, 86, 82, 78, 87, 91, 82, 86,
+  97, 91, 86, 83, 92, 73, 77, 74, 82, 87,
+  76, 80, 121, 69, 70, 79, 84, 91, 86, 92,
+  69, 99, 68, 81, 86, 80, 105, 85, 100, 83,
+  75, 73, 78, 91, 80, 92, 102, 84, 86, 106,
+  88, 86, 99, 85, 103, 81, 83, 91, 88, 90,
+  75, 81, 85, 74, 75, 87, 76, 62, 102, 81,
+  77, 79, 96, 88, 67, 84, 88, 91, 72, 85,
+  102, 90, 80, 78, 74, 92, 82, 104, 73, 70,
+  84, 68, 92, 104, 84, 82, 91, 82, 82, 93,
+  74, 78, 86, 88, 98, 65, 86, 85, 95, 94,
+  71, 72, 79, 82, 93, 60, 77, 84, 71, 76,
+  93, 71, 81, 87, 79, 84, 89, 86, 95, 73,
+  80, 72, 77, 82, 82, 72, 77, 77, 77, 77,
+  84, 85, 94, 77, 72, 84, 74, 95, 87, 77,
+  68, 76, 68, 85, 71, 78, 79, 94, 89, 96,
+  68, 81, 78, 75, 102, 86, 98, 90, 66, 77,
+  87, 109, 81, 116, 100, 96, 82, 81, 106, 71,
+  75, 73, 130, 86, 83, 90, 108, 78, 61, 57,
+  77, 77, 68, 64, 105, 64, 124, 86, 80, 146,
+  113, 72, 71, 83, 93, 112, 79, 79, 71, 90,
+  100, 70, 74, 119, 86, 90, 57, 58, 81, 61,
+  85, 95, 74, 82, 94, 94, 58, 89, 87, 92,
+  96, 89, 122, 65, 82, 99, 81, 108, 76, 81,
+  94, 84, 85, 62, 80, 74, 68, 62, 73, 68,
+  92, 92, 74, 79, 96, 89, 95, 70, 79, 63,
+  71, 99, 73, 76, 63, 67, 91, 75, 101, 81,
+  85, 79, 82, 80, 81, 84, 79, 80, 113, 87,
+  68, 77, 87, 85, 83, 86, 98, 89, 75, 81,
+  77, 78, 99, 86, 92, 87, 83, 89, 77, 93,
+  86, 101, 105, 86, 84, 102, 77, 85, 78, 89,
+  96, 86, 86, 103, 86, 86, 81, 89, 82, 73,
+  73, 69, 79, 76, 108, 85, 76, 79, 94, 83,
+  77, 82, 83, 91, 79, 91, 82, 86, 82, 79,
+  79, 89, 84, 88, 69, 71, 88, 80, 87, 86,
+  83, 81, 89, 83, 84, 87, 81, 76, 85, 84,
+  85, 73, 87, 83, 86, 89, 76, 79, 78, 82,
+  91, 66, 78, 82, 72, 78, 93, 71, 84, 92,
+  83, 82, 74, 79, 93, 71, 96, 76, 80, 80,
+  87, 75, 72, 75, 97, 88, 52, 77, 74, 83,
+  78, 73, 67, 88, 87, 70, 109, 74, 70, 83,
+  78, 94, 83, 83, 70, 84, 73, 87, 77, 79,
+  103, 92, 89, 95, 79, 75, 70, 71, 97, 83,
+  99, 84, 91, 79, 93, 87, 80, 94, 85, 76,
+  97, 84, 79, 79, 93, 76, 90, 78, 80, 112,
+  70, 92, 75, 85, 90, 70, 84, 81, 70, 74,
+  90, 85, 77, 73, 100, 89, 71, 78, 86, 68,
+  78, 85, 86, 75, 87, 96, 82, 75, 86, 75,
+  80, 74, 90, 88, 62, 71, 82, 89, 82, 69,
+  95, 85, 118, 70, 67, 86, 69, 84, 98, 75,
+  74, 84, 94, 88, 85, 75, 74, 74, 98, 89,
+  74, 88, 91, 68, 81, 72, 65, 88, 80, 80,
+  88, 107, 100, 81, 85, 71, 71, 68, 76, 82,
+  66, 86, 89, 76, 84, 83, 62, 85, 68, 93,
+  85, 76, 71, 82, 68, 79, 76, 77, 114, 88,
+  86, 91, 83, 87, 67, 75, 91, 79, 106, 77,
+  79, 68, 102, 84, 71, 87, 91, 71, 114, 78,
+  84, 69, 92, 81, 84, 78, 81, 98, 79, 94,
+  82, 92, 87, 76, 104, 71, 72, 69, 86, 79,
+  72, 83, 83, 86, 74, 72, 85, 65, 76, 78,
+  91, 65, 81, 102, 81, 74, 86, 76, 72, 77,
+  104, 92, 67, 75, 84, 83, 100, 65, 98, 93,
+  82, 67, 75, 76, 67, 82, 92, 80, 70, 81,
+  98, 79, 98, 70, 76, 73, 102, 87, 74, 82,
+  82, 64, 87, 70, 74, 89, 76, 87, 74, 105,
+  88, 82, 113, 76, 76, 76, 81, 75, 72, 86,
+  82, 73, 100, 91, 71, 83, 79, 95, 81, 83,
+  77, 82, 80, 87, 80, 79, 94, 89, 86, 92,
+  93, 95, 68, 71, 91, 79, 95, 87, 73, 80,
+  89, 90, 76, 92, 83, 82, 109, 92, 79, 80,
+  93, 87, 88, 78, 78, 74, 65, 97, 81, 85,
+  88, 68, 81, 83, 75, 71, 92, 86, 76, 76,
+  70, 85, 73, 79, 87, 70, 80, 73, 83, 75,
+  89, 100, 79, 80, 87, 78, 72, 76, 93, 89,
+  61, 60, 81, 89, 83, 75, 98, 83, 67, 73,
+  73, 77, 69, 83, 98, 81, 68, 80, 93, 89,
+  107, 77, 79, 79, 99, 90, 68, 89, 87, 64,
+  89, 71, 72, 87, 85, 80, 86, 99, 71, 85,
+  67, 95, 86, 94, 67, 74, 88, 88, 79, 78,
+  90, 85, 81, 84, 86, 96, 83, 75, 93, 89,
+  78, 84, 84, 86, 82, 87, 91, 98, 85, 85,
+  78, 79, 82, 90, 92, 87, 76, 83, 91, 91,
+  80, 97, 80, 87, 74, 81, 76, 89, 85, 87,
+  90, 90, 92, 90, 74, 83, 80, 78, 85, 95,
+  78, 74, 95, 90, 88, 84, 93, 70, 88, 95,
+  78, 85, 87, 74, 78, 85, 75, 84, 86, 94,
+  84, 83, 83, 84, 82, 84, 80, 85, 81, 91,
+  83, 89, 90, 85, 84, 79, 99, 93, 76, 100,
+  76, 86, 86, 79, 81, 93, 76, 89, 77, 97,
+  85, 85, 90, 81, 79, 92, 80, 87, 91, 83,
+  79, 89, 91, 80, 91, 102, 71, 87, 78, 94,
+  82, 75, 71, 80, 91, 80, 82, 85, 96, 88,
+  85, 83, 88, 100, 87, 72, 84, 87, 79, 83,
+  93, 88, 85, 86, 87, 84, 94, 96, 82, 78,
+  81, 79, 84, 85, 88, 75, 86, 100, 84, 98,
+  79, 75, 87, 86, 77, 83, 85, 86, 89, 89,
+  87, 87, 76, 90, 81, 83, 82, 88, 77, 74,
+  82, 91, 103, 85, 96, 70, 74, 87, 75, 84,
+  88, 68, 79, 88, 78, 81, 87, 98, 85, 79,
+  85, 85, 78, 79, 89, 88, 83, 83, 84, 89,
+  86, 82, 83, 87, 92, 85, 71, 97, 68, 85,
+  88, 92, 84, 90, 84, 93, 76, 96, 86, 79,
+  91, 91, 78, 91, 85, 80, 88, 87, 87, 90,
+  94, 82, 96, 110, 68, 86, 95, 93, 88, 74,
+  70, 76, 90, 87, 74, 79, 91, 81, 82, 85,
+  90, 97, 82, 78, 80, 91, 90, 84, 91, 84,
+  79, 85, 85, 83, 83, 93, 79, 79, 89, 77,
+  88, 86, 83, 84, 94, 90, 93, 94, 82, 82,
+  85, 89, 77, 87, 84, 79, 87, 88, 84, 76,
+  72, 84, 86, 80, 85, 90, 76, 81, 92, 88,
+  92, 91, 90, 84, 78, 94, 83, 84, 85, 76,
+  80, 84, 76, 85, 83, 94, 79, 88, 87, 84,
+  79, 86, 78, 87, 77, 74, 85, 88, 86, 89,
+  79, 79, 74, 91, 76, 76, 77, 86, 87, 82,
+  81, 90, 75, 90, 72, 98, 85, 81, 95, 85,
+  93, 94, 79, 86, 86, 85, 80, 90, 95, 81,
+  90, 96, 70, 94, 87, 90, 82, 85, 85, 76,
+  72, 92, 74, 75, 80, 115, 69, 68, 71, 98,
+  83, 90, 87, 86, 90, 80, 86, 78, 87, 100,
+  116, 93, 73, 97, 75, 86, 74, 97, 87, 64,
+  94, 69, 87, 61, 79, 69, 70, 80, 83, 86,
+  83, 73, 88, 86, 73, 75, 72, 73, 65, 82,
+  83, 97, 82, 78, 96, 84, 103, 63, 91, 78,
+  82, 122, 73, 78, 104, 71, 77, 72, 74, 76,
+  119, 61, 82, 106, 76, 94, 82, 95, 80, 104,
+  79, 92, 82, 85, 69, 76, 93, 73, 82, 70,
+  72, 76, 78, 79, 94, 110, 125, 81, 79, 86,
+  94, 72, 78, 70, 84, 95, 81, 114, 105, 91,
+  83, 90, 89, 73, 78, 75, 85, 70, 84, 89,
+  75, 95, 78, 82, 92, 77, 85, 74, 77, 85,
+  71, 84, 84, 99, 81, 70, 72, 88, 67, 86,
+  87, 75, 78, 80, 87, 80, 80, 107, 93, 98,
+  73, 92, 75, 81, 83, 77, 93, 71, 95, 80,
+  72, 65, 85, 72, 73, 79, 75, 75, 80, 72,
+  91, 90, 75, 78, 66, 74, 54, 85, 90, 94,
+  75, 73, 99, 71, 95, 66, 95, 68, 79, 89,
+  83, 75, 92, 68, 82, 63, 70, 89, 126, 69,
+  84, 111, 67, 90, 75, 87, 87, 99, 85, 95,
+  81, 89, 68, 79, 76, 76, 81, 78, 80, 78,
+  78, 89, 88, 107, 137, 77, 75, 90, 93, 81,
+  87, 64, 89, 79, 74, 103, 84, 93, 73, 84,
+  101, 77, 84, 69, 90, 79, 79, 88, 81, 73,
+  76, 78, 84, 82, 87, 74, 71, 83, 71, 83,
+  77, 89, 80, 68, 71, 90, 81, 90, 83, 79,
+  70, 81, 79, 82, 89, 93, 95, 91, 77, 86,
+  78, 80, 82, 85, 104, 65, 87, 78, 84, 70,
+  80, 72, 74, 91, 85, 81, 83, 73, 91, 79,
+  77, 80, 75, 76, 68, 86, 84, 94, 81, 85,
+  96, 92, 114, 71, 89, 74, 85, 96, 100, 75,
+  104, 67, 81, 69, 74, 93, 120, 69, 84, 102,
+  75, 88, 83, 81, 100, 95, 79, 94, 81, 98,
+  74, 77, 91, 78, 89, 79, 78, 78, 78, 104,
+  92, 106, 122, 76, 79, 88, 93, 78, 88, 74,
+  87, 79, 79, 100, 75, 90, 81, 88, 95, 77,
+  80, 71, 85, 78, 85, 84, 82, 86, 80, 92,
+  86, 90, 87, 67, 83, 78, 78, 73, 86, 103,
+  86, 71, 80, 81, 82, 72, 86, 79, 75, 89,
+  83, 87, 76, 94, 88, 88, 85, 88, 82, 85,
+  83, 89, 83, 76, 89, 77, 77, 68, 73, 77,
+  82, 83, 84, 87, 84, 74, 95, 79, 73, 80,
+  68, 93, 64, 92, 71, 94, 83, 83, 81, 99,
+  96, 86, 78, 67, 79, 77, 79, 82, 79, 87,
+  81, 71, 80, 77, 97, 81, 84, 96, 73, 83,
+  82, 80, 77, 89, 86, 90, 75, 70, 75, 75,
+  73, 84, 87, 94, 79, 78, 74, 75, 76, 99,
+  106, 84, 84, 80, 92, 83, 95, 82, 100, 80,
+  66, 88, 93, 95, 83, 99, 103, 86, 70, 77,
+  80, 96, 83, 92, 98, 83, 74, 82, 86, 74,
+  83, 72, 82, 69, 80, 86, 96, 88, 96, 71,
+  88, 85, 80, 73, 79, 80, 78, 85, 77, 81,
+  75, 92, 78, 87, 89, 97, 93, 82, 97, 70,
+  87, 73, 94, 82, 76, 77, 79, 85, 94, 84,
+  79, 87, 86, 72, 96, 83, 73, 78, 68, 85,
+  74, 90, 79, 92, 81, 85, 80, 93, 75, 99,
+  83, 75, 81, 73, 74, 77, 75, 86, 80, 68,
+  77, 93, 81, 91, 84, 88, 77, 87, 83, 77,
+  73, 83, 73, 96, 72, 69, 79, 80, 68, 86,
+  82, 108, 80, 89, 76, 86, 75, 96, 77, 91,
+  83, 79, 87, 90, 94, 79, 104, 71, 74, 85,
+  81, 102, 73, 90, 100, 88, 72, 79, 75, 95,
+  77, 100, 90, 80, 79, 88, 84, 81, 82, 67,
+  80, 76, 73, 81, 84, 81, 90, 68, 79, 80,
+  81, 80, 79, 80, 77, 85, 78, 80, 79, 88,
+  77, 81, 86, 104, 91, 82, 95, 84, 87, 78,
+  91, 76, 80, 78, 88, 86, 87, 83, 88, 98,
+  83, 71, 92, 81, 78, 80, 72, 78, 73, 88,
+  77, 84, 82, 88, 85, 105, 100, 88, 77, 69,
+  88, 77, 89, 80, 83, 84, 82, 73, 77, 89,
+  94, 84, 88, 92, 81, 80, 87, 73, 77, 83,
+  89, 87, 79, 75, 76, 79, 78, 87, 86, 92,
+  79, 79, 71, 82, 77, 94, 98, 77, 82, 80,
+  88, 86, 101, 85, 100, 79, 80, 82, 81, 98,
+  83, 91, 92, 84, 75, 78, 82, 94, 89, 89,
+  85, 82, 78, 95, 84, 99, 84, 75, 82, 80,
+  80, 77, 89, 87, 84, 68, 87, 84, 86, 79,
+  84, 82, 73, 86, 79, 87, 88, 87, 83, 90,
+  92, 85, 86, 90, 89, 90, 84, 81, 85, 77,
+  83, 94, 76, 85, 89, 86, 93, 87, 80, 81,
+  99, 82, 83, 83, 86, 94, 68, 87, 70, 89,
+  93, 86, 80, 100, 95, 92, 79, 75, 82, 77,
+  95, 98, 84, 88, 85, 81, 85, 81, 87, 90,
+  88, 78, 80, 85, 89, 84, 80, 84, 87, 76,
+  74, 79, 79, 74, 81, 84, 82, 89, 94, 80,
+  75, 83, 76, 98, 83, 83, 89, 86, 83, 91,
+  94, 90, 93, 76, 79, 83, 93, 89, 81, 93,
+  90, 87, 72, 75, 81, 97, 91, 91, 95, 80,
+  82, 90, 78, 84, 82, 80, 80, 75, 84, 90,
+  100, 85, 82, 63, 94, 92, 89, 87, 81, 85,
+  82, 79, 79, 82, 94, 81, 76, 88, 96, 93,
+  92, 86, 97, 81, 90, 75, 83, 64, 85, 102,
+  83, 97, 94, 86, 91, 87, 83, 76, 89, 79,
+  88, 79, 92, 88, 82, 82, 75, 84, 94, 88,
+  82, 95, 79, 98, 79, 83, 83, 80, 82, 92,
+  82, 87, 92, 83, 75, 93, 80, 87, 87, 68,
+  88, 85, 96, 81, 80, 82, 75, 81, 79, 76,
+  79, 76, 79, 83, 76, 85, 90, 82, 80, 84,
+  77, 96, 59, 85, 90, 87, 76, 95, 90, 86,
+  95, 76, 86, 84, 90, 92, 75, 93, 86, 82,
+  77, 79, 80, 90, 87, 95, 86, 83, 86, 92,
+  83, 84, 79, 77, 81, 80, 81, 81, 86, 83,
+  81, 67, 88, 86, 87, 87, 78, 82, 87, 82,
+  80, 81, 90, 85, 76, 77, 90, 94, 92, 84,
+  98, 87, 84, 85, 80, 71, 87, 97, 83, 92,
+  87, 85, 93, 88, 82, 76, 92, 81, 90, 82,
+  94, 82, 79, 84, 77, 87, 90, 94, 84, 103,
+  95, 89, 79, 77, 85, 79, 85, 93, 89, 84,
+  87, 93, 80, 94, 87, 87, 91, 73, 90, 79,
+  94, 84, 81, 85, 87, 79, 81, 76, 82, 77,
+  84, 85, 80, 80, 82, 80, 76, 82, 75, 95,
+  85, 81, 84, 86, 82, 93, 92, 93, 92, 83,
+  84, 85, 90, 88, 82, 95, 84, 90, 78, 76,
+  89, 94, 96, 90, 89, 78, 85, 82, 103, 97,
+  91, 81, 81, 71, 79, 72, 71, 76, 86, 81,
+  85, 77, 78, 81, 82, 65, 65, 74, 87, 93,
+  82, 74, 87, 90, 81, 86, 91, 83, 69, 80,
+  83, 87, 83, 80, 84, 100, 86, 92, 84, 80,
+  97, 98, 94, 91, 86, 85, 80, 89, 74, 79,
+  100, 83, 87, 95, 77, 87, 85, 78, 85, 90,
+  74, 83, 88, 70, 72, 84, 90, 77, 85, 83,
+  87, 61, 84, 102, 86, 89, 85, 86, 93, 81,
+  81, 73, 91, 81, 75, 78, 74, 97, 85, 92,
+  79, 95, 90, 84, 82, 72, 84, 82, 83, 84,
+  93, 84, 89, 86, 84, 91, 86, 87, 86, 84,
+  82, 83, 90, 85, 70, 90, 90, 95, 79, 82,
+  90, 78, 77, 86, 93, 81, 75, 79, 80, 84,
+  94, 79, 74, 77, 74, 74, 74, 79, 73, 77,
+  84, 88, 92, 86, 95, 82, 78, 101, 85, 82,
+  97, 72, 78, 90, 81, 65, 72, 85, 76, 93,
+  85, 86, 72, 89, 84, 85, 82, 83, 84, 90,
+  85, 88, 88, 92, 86, 74, 83, 67, 112, 80,
+  100, 89, 80, 72, 82, 79, 80, 72, 85, 82,
+  79, 83, 67, 78, 103, 82, 81, 90, 80, 65,
+  73, 94, 79, 86, 87, 102, 78, 72, 86, 81,
+  83, 87, 86, 72, 78, 86, 83, 80, 76, 83,
+  86, 84, 73, 72, 84, 77, 85, 78, 92, 88,
+  75, 94, 85, 77, 88, 87, 62, 83, 93, 75,
+  86, 90, 82, 87, 90, 89, 84, 80, 90, 78,
+  99, 83, 101, 90, 81, 82, 72, 79, 90, 78,
+  79, 80, 98, 82, 74, 87, 70, 83, 89, 89,
+  95, 105, 98, 80, 82, 81, 97, 83, 83, 80,
+  90, 82, 82, 91, 88, 87, 90, 93, 88, 87,
+  83, 90, 79, 80, 91, 76, 77, 96, 79, 83,
+  75, 100, 78, 76, 73, 70, 86, 79, 96, 93,
+  92, 74, 84, 87, 75, 76, 69, 85, 84, 104,
+  67, 93, 93, 86, 76, 83, 77, 86, 77, 78,
+  78, 86, 89, 90, 82, 73, 94, 94, 72, 79,
+  82, 88, 80, 85, 79, 74, 87, 90, 95, 73,
+  90, 78, 79, 79, 75, 71, 80, 89, 75, 88,
+  87, 74, 77, 80, 73, 77, 89, 81, 80, 79,
+  87, 73, 85, 86, 88, 87, 93, 74, 84, 76,
+  73, 78, 99, 97, 96, 85, 79, 71, 82, 78,
+  78, 86, 80, 80, 83, 86, 81, 78, 83, 76,
+  79, 84, 80, 86, 79, 75, 88, 90, 80, 83,
+  95, 85, 66, 87, 62, 79, 78, 73, 73, 93,
+  90, 90, 88, 88, 90, 106, 90, 97, 88, 88,
+  79, 82, 78, 64, 88, 79, 89, 96, 81, 81,
+  82, 60, 70, 90, 69, 74, 88, 68, 73, 88,
+  86, 82, 86, 86, 86, 75, 69, 108, 88, 86,
+  85, 84, 84, 80, 83, 69, 87, 82, 85, 71,
+  73, 85, 82, 91, 77, 95, 88, 81, 77, 67,
+  80, 81, 86, 79, 88, 84, 88, 89, 87, 89,
+  86, 91, 62, 89, 90, 83, 85, 88, 76, 91,
+  93, 95, 80, 77, 89, 88, 89, 80, 82, 83,
+  72, 87, 75, 77, 84, 84, 75, 78, 80, 95,
+  74, 70, 73, 89, 82, 91, 90, 88, 127, 80,
+  77, 89, 86, 83, 92, 65, 68, 89, 84, 69,
+  101, 98, 75, 78, 74, 72, 60, 103, 90, 85,
+  77, 86, 78, 86, 78, 97, 77, 83, 82, 67,
+  81, 50, 96, 67, 99, 95, 83, 65, 76, 63,
+  71, 77, 93, 82, 79, 85, 73, 92, 87, 90,
+  84, 83, 93, 114, 62, 96, 78, 72, 81, 105,
+  74, 72, 99, 92, 65, 88, 83, 63, 76, 83,
+  99, 79, 74, 78, 81, 78, 76, 63, 88, 77,
+  82, 70, 83, 87, 76, 99, 78, 76, 82, 98,
+  45, 104, 105, 76, 80, 81, 85, 100, 89, 78,
+  77, 71, 89, 95, 121, 72, 84, 107, 81, 73,
+  73, 72, 88, 81, 87, 79, 100, 109, 74, 81,
+  63, 77, 96, 85, 99, 85, 98, 84, 91, 74,
+  100, 83, 79, 80, 102, 90, 88, 106, 111, 73,
+  114, 92, 80, 60, 84, 104, 84, 83, 81, 79,
+  91, 78, 79, 79, 69, 88, 76, 75, 77, 78,
+  72, 77, 92, 99, 89, 78, 84, 92, 83, 76,
+  86, 95, 89, 97, 71, 91, 73, 97, 78, 75,
+  94, 109, 92, 67, 77, 86, 83, 69, 89, 87,
+  96, 108, 83, 76, 81, 90, 85, 92, 87, 81,
+  91, 74, 91, 71, 96, 81, 86, 80, 93, 81,
+  75, 101, 94, 84, 84, 83, 75, 77, 95, 104,
+  79, 91, 85, 75, 94, 66, 82, 79, 85, 88,
+  96, 84, 89, 71, 59, 78, 101, 106, 94, 87,
+  81, 71, 86, 75, 71, 76, 84, 79, 82, 96,
+  86, 75, 79, 73, 74, 75, 77, 83, 86, 75,
+  87, 86, 83, 88, 98, 95, 73, 89, 77, 87,
+  83, 74, 81, 103, 94, 93, 88, 84, 90, 108,
+  94, 86, 87, 87, 77, 85, 79, 80, 91, 84,
+  86, 96, 86, 76, 80, 67, 76, 95, 82, 70,
+  92, 69, 92, 98, 83, 77, 83, 83, 96, 91,
+  60, 113, 89, 87, 90, 79, 86, 74, 89, 66,
+  86, 82, 88, 90, 67, 88, 87, 91, 89, 103,
+  88, 87, 81, 77, 80, 82, 82, 75, 85, 86,
+  88, 87, 78, 88, 83, 91, 62, 89, 82, 93,
+  93, 81, 69, 93, 87, 88, 76, 70, 91, 90,
+  91, 86, 52, 85, 80, 86, 86, 83, 79, 84,
+  79, 84, 75, 81, 76, 75, 73, 92, 90, 78,
+  75, 78, 86, 71, 76, 90, 92, 85, 92, 58,
+  71, 92, 96, 78, 120, 94, 95, 88, 73, 77,
+  75, 100, 100, 89, 79, 94, 87, 77, 86, 99,
+  80, 81, 85, 74, 83, 70, 98, 75, 98, 91,
+  89, 72, 80, 73, 70, 82, 81, 82, 80, 67,
+  103, 86, 88, 91, 85, 90, 85, 111, 82, 92,
+  82, 77, 85, 84, 80, 66, 96, 83, 75, 87,
+  93, 80, 75, 87, 109, 76, 78, 83, 79, 87,
+  79, 75, 93, 76, 76, 69, 78, 94, 79, 96,
+  68, 80, 83, 87, 56, 93, 61, 79, 87, 82,
+  70, 95, 90, 80, 82, 66, 87, 105, 102, 75,
+  61, 101, 93, 74, 79, 77, 75, 80, 76, 88,
+  81, 87, 64, 79, 62, 71, 87, 81, 94, 76,
+  93, 81, 86, 76, 106, 88, 87, 73, 88, 90,
+  87, 106, 85, 76, 87, 91, 83, 70, 88, 84,
+  80, 82, 75, 95, 90, 78, 92, 85, 78, 85,
+  85, 79, 77, 96, 80, 77, 91, 77, 101, 98,
+  89, 87, 85, 79, 84, 93, 90, 83, 91, 67,
+  86, 101, 78, 81, 90, 96, 113, 66, 80, 88,
+  76, 70, 77, 86, 92, 103, 86, 78, 92, 100,
+  84, 90, 98, 82, 82, 72, 76, 81, 79, 91,
+  84, 79, 93, 98, 79, 99, 90, 83, 77, 86,
+  80, 77, 91, 104, 70, 76, 79, 95, 84, 73,
+  82, 80, 90, 92, 82, 81, 94, 87, 75, 72,
+  93, 66, 81, 93, 81, 81, 79, 92, 88, 83,
+  77, 82, 85, 73, 86, 86, 79, 89, 73, 69,
+  89, 91, 94, 63, 86, 82, 93, 67, 91, 92,
+  74, 69, 88, 74, 88, 92, 77, 63, 91, 97,
+  96, 83, 95, 88, 95, 96, 75, 80, 84, 80,
+  83, 86, 90, 76, 94, 93, 71, 82, 103, 52,
+  81, 80, 83, 100, 74, 71, 87, 65, 107, 62,
+  82, 73, 75, 85, 71, 81, 95, 93, 101, 96,
+  90, 142, 70, 69, 94, 89, 91, 78, 83, 98,
+  90, 83, 92, 75, 98, 86, 80, 71, 91, 87,
+  66, 70, 92, 92, 73, 87, 83, 81, 58, 134,
+  88, 105, 82, 88, 99, 97, 83, 80, 76, 89,
+  78, 55, 76, 96, 88, 83, 81, 87, 71, 69,
+  86, 76, 83, 83, 75, 93, 68, 80, 72, 85,
+  67, 87, 92, 88, 85, 96, 102, 65, 79, 80,
+  91, 86, 104, 80, 88, 76, 73, 90, 64, 74,
+  75, 66, 89, 69, 83, 54, 78, 92, 80, 80,
+  81, 94, 83, 90, 82, 82, 77, 71, 84, 84,
+  81, 72, 97, 77, 91, 80, 99, 63, 74, 80,
+  83, 98, 63, 76, 77, 71, 97, 80, 77, 87,
+  101, 88, 65, 70, 91, 80, 84, 94, 88, 117,
+  73, 92, 79, 79, 85, 90, 97, 84, 81, 94,
+  94, 71, 91, 80, 80, 69, 119, 87, 104, 65,
+  86, 90, 61, 84, 76, 82, 70, 102, 81, 95,
+  94, 100, 80, 94, 74, 83, 74, 78, 84, 46,
+  76, 82, 99, 81, 83, 94, 86, 81, 84, 77,
+  89, 67, 74, 90, 89, 76, 69, 83, 74, 88,
+  104, 85, 90, 96, 91, 74, 93, 84, 87, 91,
+  87, 74, 96, 92, 74, 97, 72, 82, 85, 75,
+  84, 75, 82, 62, 74, 87, 83, 84, 89, 86,
+  78, 74, 89, 87, 72, 81, 89, 81, 71, 77,
+  83, 75, 94, 83, 98, 78, 75, 86, 83, 92,
+  73, 82, 80, 73, 85, 76, 78, 80, 94, 89,
+  65, 77, 88, 76, 82, 91, 94, 103, 78, 94,
+  77, 84, 69, 99, 96, 84, 78, 83, 98, 85,
+  93, 90, 88, 81, 108, 90, 118, 77, 78, 95,
+  84, 88, 76, 92, 87, 84, 94, 87, 86, 87,
+  83, 91, 86, 80, 85, 81, 94, 59, 84, 81,
+  85, 88, 83, 72, 83, 65, 80, 78, 79, 78,
+  78, 91, 74, 83, 78, 81, 82, 73, 88, 89,
+  75, 91, 72, 71, 87, 84, 84, 77, 92, 82,
+  87, 83, 82, 88, 68, 69, 82, 74, 86, 88,
+  78, 72, 80, 89, 80, 82, 88, 88, 96, 91,
+  77, 81, 84, 79, 84, 79, 82, 77, 91, 87,
+  73, 88, 100, 55, 76, 84, 76, 100, 82, 91,
+  82, 78, 92, 71, 83, 84, 84, 97, 72, 81,
+  89, 87, 88, 93, 86, 105, 72, 80, 86, 88,
+  92, 75, 86, 91, 88, 77, 93, 79, 92, 86,
+  80, 70, 87, 89, 93, 79, 94, 90, 71, 86,
+  74, 83, 74, 143, 85, 93, 88, 88, 87, 96,
+  78, 86, 81, 86, 80, 68, 80, 89, 85, 83,
+  84, 94, 67, 74, 86, 60, 92, 61, 75, 89,
+  73, 75, 80, 86, 71, 86, 91, 87, 95, 92,
+  99, 71, 80, 77, 84, 109, 105, 83, 83, 94,
+  63, 84, 72, 74, 80, 90, 82, 69, 75, 75,
+  70, 83, 80, 88, 77, 95, 81, 81, 86, 78,
+  74, 76, 87, 75, 70, 80, 81, 85, 78, 82,
+  86, 68, 86, 86, 73, 91, 76, 88, 80, 79,
+  77, 83, 85, 90, 105, 95, 72, 82, 84, 81,
+  71, 86, 79, 77, 69, 100, 74, 71, 75, 79,
+  92, 89, 70, 87, 82, 89, 84, 78, 78, 65,
+  111, 90, 135, 85, 89, 89, 75, 82, 81, 84,
+  84, 97, 77, 79, 86, 102, 68, 91, 78, 91,
+  82, 76, 89, 64, 76, 81, 96, 85, 74, 101,
+  79, 81, 87, 68, 90, 44, 82, 81, 92, 74,
+  78, 85, 80, 88, 98, 81, 94, 92, 82, 75,
+  88, 84, 90, 103, 88, 82, 79, 103, 83, 83,
+  86, 76, 87, 97, 82, 72, 73, 86, 80, 82,
+  89, 82, 84, 82, 74, 80, 97, 75, 74, 90,
+  96, 79, 63, 92, 73, 80, 80, 91, 89, 84,
+  84, 96, 81, 83, 77, 84, 81, 75, 72, 76,
+  83, 80, 87, 91, 79, 89, 87, 84, 76, 90,
+  87, 80, 76, 86, 79, 79, 73, 76, 83, 84,
+  68, 81, 83, 101, 90, 89, 80, 78, 89, 90,
+  116, 93, 84, 94, 89, 95, 89, 90, 95, 75,
+  85, 82, 77, 95, 79, 95, 75, 84, 103, 81,
+  102, 77, 74, 90, 83, 97, 83, 73, 88, 75,
+  78, 76, 84, 69, 83, 83, 75, 78, 74, 75,
+  83, 71, 96, 83, 79, 89, 69, 74, 98, 85,
+  85, 73, 82, 78, 90, 93, 80, 94, 75, 68,
+  83, 75, 87, 87, 86, 72, 85, 84, 84, 84,
+  90, 87, 92, 85, 85, 83, 75, 87, 79, 88,
+  85, 85, 90, 88, 76, 88, 98, 71, 84, 83,
+  83, 89, 79, 82, 87, 79, 91, 77, 83, 84,
+  82, 104, 70, 85, 87, 82, 94, 99, 83, 98,
+  73, 78, 87, 90, 91, 75, 86, 90, 83, 69,
+  95, 82, 91, 88, 84, 74, 83, 89, 88, 80,
+  89, 88, 89, 91, 82, 86, 81, 126, 80, 89,
+  88, 83, 94, 91, 80, 87, 86, 93, 79, 83,
+  91, 84, 82, 92, 82, 91, 73, 83, 81, 65,
+  87, 53, 83, 86, 80, 75, 69, 82, 71, 80,
+  95, 85, 97, 89, 94, 74, 93, 83, 91, 89,
+  95, 77, 88, 94, 76, 92, 73, 71, 84, 86,
+  75, 78, 85, 77, 74, 83, 85, 92, 84, 92,
+  81, 81, 87, 83, 70, 87, 86, 80, 83, 78,
+  85, 88, 72, 86, 91, 77, 90, 87, 78, 86,
+  82, 76, 90, 81, 85, 83, 84, 95, 83, 89,
+  79, 91, 85, 81, 81, 93, 79, 88, 75, 91,
+  72, 83, 83, 77, 86, 84, 71, 78, 85, 81,
+  84, 86, 83, 78, 82, 87, 100, 84, 86, 88,
+  85, 95, 94, 89, 90, 88, 75, 84, 83, 85,
+  80, 91, 81, 94, 90, 84, 91, 90, 82, 77,
+  86, 86, 72, 94, 80, 87, 79, 74, 80, 49,
+  92, 81, 97, 79, 65, 83, 71, 87, 104, 83,
+  96, 85, 98, 70, 87, 86, 97, 81, 78, 78,
+  86, 95, 87, 92, 80, 69, 86, 84, 77, 78,
+  85, 90, 79, 88, 97, 83, 86, 86, 70, 84,
+  89, 78, 68, 94, 88, 82, 72, 82, 69, 85,
+  77, 84, 94, 86, 91, 95, 82, 87, 84, 76,
+  94, 90, 82, 81, 84, 85, 71, 85, 84, 96,
+  83, 85, 88, 95, 89, 94, 82, 86, 76, 80,
+  81, 76, 80, 84, 72, 80, 83, 84, 87, 93,
+  82, 80, 84, 88, 87, 80, 84, 88, 75, 98,
+  99, 90, 97, 82, 81, 84, 85, 82, 94, 94,
+  74, 85, 92, 84, 101, 91, 88, 82, 88, 62,
+  99, 91, 87, 85, 81, 76, 63, 78, 87, 90,
+  90, 74, 65, 86, 76, 72, 75, 90, 79, 97,
+  93, 94, 89, 107, 86, 88, 93, 104, 89, 85,
+  98, 96, 89, 87, 89, 86, 67, 90, 80, 71,
+  86, 90, 72, 77, 78, 99, 77, 81, 74, 92,
+  81, 89, 92, 82, 82, 78, 82, 75, 83, 86,
+  77, 67, 83, 88, 80, 102, 88, 79, 75, 90,
+  85, 91, 72, 77, 71, 80, 89, 72, 74, 94,
+  75, 82, 67, 78, 92, 82, 104, 94, 77, 89,
+  82, 85, 74, 88, 77, 90, 78, 70, 80, 95,
+  86, 86, 99, 92, 82, 84, 71, 76, 80, 84,
+  80, 86, 97, 86, 96, 94, 75, 95, 96, 80,
+  88, 87, 97, 93, 80, 90, 77, 83, 87, 98,
+  97, 81, 85, 68, 60, 74, 78, 81, 75, 81,
+  68, 71, 76, 76, 76, 93, 93, 81, 89, 91,
+  102, 107, 88, 97, 106, 100, 76, 95, 109, 83,
+  98, 79, 86, 98, 73, 81, 70, 70, 87, 95,
+  70, 77, 77, 93, 62, 73, 78, 69, 84, 96,
+  82, 81, 77, 72, 70, 78, 89, 88, 77, 70,
+  66, 80, 86, 90, 90, 77, 76, 78, 76, 89,
+  77, 64, 67, 85, 84, 79, 66, 100, 80, 87,
+  74, 80, 91, 94, 106, 91, 81, 84, 73, 94,
+  65, 108, 70, 84, 89, 71, 74, 74, 74, 85,
+  91, 84, 89, 86, 74, 74, 79, 85, 83, 91,
+  79, 78, 76, 104, 74, 92, 83, 78, 79, 81,
+  81, 84, 95, 97, 86, 97, 79, 87, 84, 91,
+  81, 79, 60, 79, 82, 88, 91, 69, 65, 93,
+  79, 77, 76, 95, 87, 95, 84, 86, 78, 106,
+  90, 90, 82, 91, 88, 90, 100, 80, 100, 78,
+  88, 87, 70, 91, 77, 68, 83, 84, 79, 79,
+  76, 82, 72, 80, 80, 79, 74, 96, 97, 98,
+  81, 79, 78, 75, 87, 86, 84, 59, 80, 91,
+  87, 97, 88, 83, 97, 91, 87, 90, 76, 74,
+  74, 91, 91, 83, 72, 92, 77, 88, 64, 85,
+  88, 91, 101, 99, 79, 85, 85, 86, 74, 88,
+  80, 91, 88, 68, 80, 65, 86, 84, 94, 94,
+  85, 90, 76, 80, 81, 82, 85, 94, 84, 97,
+  74, 91, 82, 93, 80, 81, 82, 92, 98, 92,
+  78, 91, 85, 63, 78, 99, 102, 82, 77, 66,
+  71, 82, 80, 94, 97, 77, 69, 113, 83, 94,
+  86, 91, 93, 84, 94, 106, 89, 100, 90, 97,
+  114, 98, 91, 82, 98, 101, 78, 82, 74, 94,
+  70, 86, 81, 82, 89, 98, 71, 87, 83, 105,
+  78, 85, 61, 84, 82, 98, 83, 88, 84, 66,
+  78, 81, 85, 75, 73, 61, 80, 77, 92, 97,
+  86, 68, 88, 80, 86, 82, 78, 68, 67, 70,
+  81, 71, 72, 107, 85, 81, 71, 79, 94, 89,
+  86, 93, 74, 93, 71, 86, 64, 77, 78, 72,
+  87, 71, 70, 86, 75, 80, 97, 87, 80, 95,
+  67, 81, 78, 95, 79, 87, 82, 79, 88, 89,
+  76, 77, 89, 77, 102, 75, 84, 87, 85, 85,
+  71, 86, 80, 117, 126, 75, 71, 55, 64, 79,
+  70, 85, 75, 78, 78, 98, 79, 100, 78, 103,
+  100, 69, 81, 94, 108, 112, 82, 107, 119, 92,
+  75, 87, 100, 89, 92, 69, 70, 90, 72, 84,
+  69, 79, 99, 107, 70, 76, 77, 80, 58, 84,
+  68, 58, 73, 112, 70, 73, 69, 57, 69, 86,
+  94, 71, 71, 61, 73, 65, 95, 91, 91, 66,
+  63, 68, 81, 80, 89, 48, 57, 80, 87, 72,
+  66, 123, 90, 82, 82, 85, 94, 98, 87, 92,
+  78, 80, 59, 95, 51, 95, 74, 67, 91, 62,
+  67, 75, 64, 80, 94, 77, 85, 95, 64, 73,
+  81, 94, 81, 96, 69, 69, 64, 95, 68, 81,
+  83, 71, 89, 71, 63, 81, 105, 84, 84, 100,
+  87, 93, 101, 89, 75, 67, 68, 82, 76, 95,
+  88, 70, 66, 111, 85, 96, 87, 93, 89, 93,
+  80, 93, 91, 97, 95, 98, 103, 80, 91, 81,
+  97, 78, 88, 70, 74, 89, 72, 86, 78, 80,
+  91, 92, 72, 82, 79, 71, 70, 83, 67, 78,
+  73, 101, 87, 82, 83, 70, 77, 82, 86, 81,
+  78, 57, 79, 78, 86, 98, 90, 75, 74, 83,
+  85, 83, 85, 64, 74, 94, 83, 76, 71, 106,
+  93, 89, 66, 84, 86, 96, 87, 91, 79, 86,
+  74, 84, 65, 77, 82, 81, 88, 72, 72, 72,
+  73, 80, 96, 88, 86, 95, 73, 82, 81, 92,
+  86, 95, 88, 87, 76, 87, 83, 83, 86, 78,
+  87, 80, 86, 85, 86, 84, 88, 60, 72, 91,
+  82, 86, 78, 72, 74, 84, 84, 84, 93, 71,
+  57, 122, 80, 81, 83, 87, 78, 83, 90, 107,
+  77, 87, 99, 85, 90, 83, 98, 82, 87, 95,
+  72, 102, 95, 87, 78, 90, 80, 72, 73, 81,
+  68, 79, 94, 104, 102, 92, 69, 81, 81, 93,
+  96, 102, 96, 84, 87, 88, 77, 91, 92, 80,
+  81, 93, 101, 91, 77, 87, 98, 85, 91, 77,
+  67, 75, 89, 80, 79, 69, 68, 85, 83, 91,
+  75, 85, 95, 84, 87, 92, 68, 115, 74, 72,
+  73, 65, 73, 69, 79, 85, 63, 113, 99, 80,
+  98, 96, 69, 86, 63, 84, 70, 89, 86, 83,
+  94, 89, 79, 88, 93, 84, 83, 74, 99, 77,
+  92, 87, 72, 82, 70, 82, 81, 110, 97, 79,
+  66, 58, 80, 84, 76, 77, 80, 74, 59, 135,
+  85, 87, 81, 97, 78, 68, 87, 107, 89, 87,
+  98, 93, 109, 85, 97, 80, 92, 89, 74, 84,
+  82, 82, 67, 83, 79, 65, 80, 91, 68, 77,
+  93, 88, 87, 88, 71, 68, 78, 98, 81, 85,
+  81, 71, 82, 83, 78, 96, 82, 81, 71, 80,
+  98, 87, 83, 77, 75, 74, 84, 80, 74, 57,
+  81, 93, 73, 68, 63, 88, 88, 87, 77, 99,
+  88, 88, 91, 93, 72, 112, 65, 74, 55, 66,
+  73, 67, 84, 78, 61, 91, 77, 79, 110, 88,
+  72, 87, 60, 84, 71, 90, 81, 90, 97, 86,
+  73, 86, 80, 84, 83, 68, 93, 65, 86, 83,
+  80, 77, 94, 95, 87, 88, 83, 82, 72, 71,
+  68, 85, 84, 84, 87, 73, 57, 119, 89, 78,
+  85, 86, 74, 98, 94, 99, 83, 82, 102, 83,
+  80, 75, 102, 77, 89, 84, 72, 87, 84, 83,
+  66, 93, 77, 71, 79, 77, 70, 67, 88, 77,
+  96, 88, 71, 91, 73, 96, 96, 77, 91, 85,
+  84, 84, 81, 100, 94, 73, 82, 92, 91, 90,
+  83, 91, 71, 85, 87, 80, 74, 70, 88, 104,
+  80, 70, 71, 81, 88, 92, 72, 96, 79, 89,
+  90, 84, 71, 105, 73, 71, 71, 60, 75, 77,
+  81, 87, 63, 93, 94, 79, 103, 91, 75, 84,
+  70, 83, 71, 90, 87, 93, 110, 98, 94, 86,
+  93, 89, 85, 75, 91, 79, 91, 83, 73, 82,
+  101, 78, 92, 80, 82, 94, 96, 88, 87, 85,
+  72, 89, 81, 94, 81, 86, 87, 71, 68, 76,
+  76, 89, 81, 96, 79, 89, 73, 72, 91, 104,
+  80, 83, 81, 88, 88, 93, 95, 79, 73, 89,
+  89, 85, 87, 76, 87, 82, 82, 91, 75, 85,
+  78, 103, 76, 76, 86, 83, 74, 86, 80, 83,
+  77, 84, 73, 82, 84, 98, 87, 72, 84, 80,
+  80, 80, 77, 80, 82, 88, 80, 82, 88, 90,
+  67, 85, 80, 83, 84, 83, 79, 87, 94, 87,
+  92, 83, 80, 72, 86, 87, 87, 67, 92, 77,
+  72, 83, 77, 89, 85, 87, 87, 84, 80, 79,
+  84, 90, 86, 81, 93, 76, 96, 85, 91, 83,
+  75, 87, 86, 84, 83, 68, 88, 94, 84, 89,
+  86, 81, 70, 89, 104, 95, 89, 81, 66, 87,
+  63, 80, 92, 92, 85, 77, 53, 91, 78, 70,
+  87, 101, 85, 105, 74, 69, 89, 101, 72, 82,
+  80, 80, 92, 91, 92, 77, 74, 82, 89, 78,
+  81, 73, 89, 75, 78, 81, 94, 79, 76, 91,
+  82, 76, 89, 93, 89, 84, 74, 78, 70, 87,
+  75, 72, 97, 85, 92, 78, 74, 82, 92, 81,
+  83, 79, 89, 90, 68, 80, 90, 99, 69, 87,
+  71, 83, 77, 84, 79, 80, 98, 91, 101, 76,
+  72, 78, 89, 86, 88, 59, 82, 85, 66, 82,
+  80, 84, 88, 85, 86, 88, 87, 80, 79, 91,
+  94, 77, 84, 73, 86, 78, 78, 90, 71, 86,
+  81, 98, 82, 68, 86, 97, 102, 89, 91, 79,
+  85, 81, 90, 88, 87, 89, 70, 95, 86, 82,
+  79, 85, 87, 73, 74, 85, 84, 91, 79, 91,
+  91, 84, 79, 73, 85, 91, 76, 80, 82, 85,
+  86, 82, 92, 82, 87, 89, 83, 77, 80, 76,
+  89, 80, 80, 84, 76, 86, 78, 91, 75, 75,
+  87, 98, 71, 92, 76, 80, 76, 82, 81, 85,
+  83, 93, 92, 74, 79, 83, 90, 85, 85, 80,
+  83, 83, 79, 92, 86, 88, 69, 86, 76, 82,
+  83, 85, 77, 89, 90, 84, 91, 77, 79, 75,
+  77, 84, 85, 69, 80, 77, 74, 79, 76, 85,
+  88, 88, 92, 84, 81, 75, 79, 88, 87, 72,
+  79, 83, 84, 84, 92, 83, 74, 88, 82, 78,
+  88, 67, 85, 89, 81, 82, 81, 84, 74, 101,
+  112, 94, 86, 79, 70, 84, 81, 73, 87, 99,
+  82, 88, 47, 80, 81, 87, 80, 96, 77, 92,
+  70, 70, 98, 106, 81, 75, 77, 82, 77, 94,
+  90, 78, 73, 90, 87, 76, 80, 73, 89, 80,
+  78, 101, 83, 87, 78, 83, 87, 74, 84, 73,
+  83, 93, 73, 88, 79, 80, 78, 81, 83, 91,
+  92, 78, 87, 88, 87, 68, 83, 73, 83, 95,
+  64, 71, 93, 81, 67, 79, 76, 86, 89, 81,
+  77, 77, 88, 90, 106, 91, 69, 76, 90, 85,
+  90, 60, 91, 81, 66, 81, 90, 87, 90, 86,
+  83, 96, 76, 77, 86, 88, 99, 78, 90, 75,
+  100, 75, 87, 95, 83, 83, 83, 103, 81, 80,
+  85, 95, 73, 103, 83, 100, 60, 88, 124, 111,
+  93, 78, 63, 80, 64, 62, 96, 121, 82, 96,
+  35, 98, 78, 63, 82, 114, 86, 111, 76, 72,
+  97, 84, 79, 79, 85, 77, 86, 88, 84, 79,
+  65, 85, 77, 70, 79, 67, 85, 72, 77, 82,
+  103, 86, 74, 63, 100, 73, 82, 74, 99, 88,
+  62, 87, 76, 75, 72, 70, 83, 66, 106, 80,
+  83, 79, 80, 68, 93, 76, 97, 109, 54, 87,
+  90, 95, 74, 82, 72, 81, 80, 82, 77, 66,
+  97, 92, 149, 78, 64, 87, 100, 83, 96, 47,
+  83, 90, 56, 76, 94, 79, 93, 77, 88, 102,
+  91, 82, 83, 84, 117, 74, 78, 67, 84, 71,
+  81, 94, 79, 80, 88, 131, 82, 80, 84, 96,
+  85, 87, 91, 81, 82, 79, 101, 97, 87, 84,
+  72, 89, 79, 79, 85, 95, 85, 85, 59, 89,
+  80, 93, 85, 89, 87, 83, 79, 72, 86, 77,
+  76, 76, 75, 84, 92, 84, 90, 82, 78, 85,
+  82, 72, 81, 75, 88, 75, 77, 81, 78, 84,
+  75, 87, 78, 74, 83, 85, 78, 95, 72, 81,
+  79, 86, 86, 86, 88, 89, 98, 80, 83, 91,
+  92, 74, 94, 75, 89, 86, 68, 105, 100, 80,
+  69, 80, 70, 81, 91, 84, 78, 90, 90, 84,
+  93, 84, 74, 76, 82, 85, 86, 63, 78, 80,
+  74, 75, 86, 84, 88, 85, 92, 94, 80, 71,
+  84, 88, 94, 73, 86, 86, 87, 77, 90, 86,
+  73, 86, 75, 91, 83, 78, 84, 88, 87, 89,
+  87, 86, 80, 96, 105, 80, 87, 82, 72, 95,
+  86, 74, 94, 107, 88, 78, 63, 81, 87, 85,
+  81, 93, 82, 88, 73, 74, 90, 93, 89, 77,
+  75, 81, 73, 101, 85, 84, 92, 90, 82, 82,
+  77, 79, 91, 77, 77, 96, 78, 88, 75, 86,
+  85, 74, 83, 89, 73, 88, 82, 79, 75, 75,
+  86, 75, 82, 92, 97, 76, 80, 93, 99, 82,
+  77, 80, 80, 88, 76, 78, 79, 75, 73, 78,
+  71, 86, 89, 87, 75, 81, 95, 91, 95, 101,
+  68, 79, 85, 84, 89, 69, 90, 80, 73, 87,
+  80, 90, 87, 87, 84, 89, 87, 71, 90, 81,
+  92, 81, 85, 84, 87, 84, 92, 87, 79, 84,
+  82, 95, 77, 78, 81, 90, 78, 95, 100, 99,
+  73, 97, 106, 93, 96, 81, 65, 93, 71, 81,
+  101, 111, 89, 85, 51, 91, 81, 71, 90, 100,
+  83, 99, 74, 76, 88, 75, 82, 76, 73, 82,
+  77, 88, 80, 81, 74, 92, 66, 77, 84, 77,
+  87, 79, 76, 92, 87, 83, 73, 86, 87, 72,
+  84, 82, 84, 83, 72, 71, 73, 70, 81, 64,
+  85, 81, 103, 73, 84, 99, 89, 78, 80, 84,
+  87, 95, 64, 95, 72, 86, 73, 79, 70, 84,
+  80, 82, 82, 75, 98, 91, 110, 103, 64, 79,
+  99, 82, 87, 60, 84, 88, 73, 82, 78, 83,
+  82, 83, 87, 94, 86, 77, 87, 78, 102, 80,
+  81, 76, 87, 79, 84, 84, 83, 78, 80, 119,
+  75, 74, 77, 88, 88, 90, 91, 87, 87, 78,
+  98, 92, 89, 85, 75, 96, 81, 94, 92, 101,
+  90, 76, 75, 86, 84, 89, 84, 85, 85, 80,
+  77, 77, 87, 72, 88, 77, 77, 88, 86, 86,
+  88, 86, 78, 85, 78, 83, 92, 75, 87, 80,
+  75, 86, 75, 86, 74, 92, 77, 74, 77, 79,
+  69, 91, 78, 77, 80, 82, 91, 81, 85, 86,
+  92, 81, 83, 90, 90, 80, 88, 79, 86, 83,
+  78, 102, 88, 77, 73, 81, 68, 75, 92, 78,
+  86, 92, 94, 82, 88, 95, 74, 80, 88, 86,
+  88, 73, 85, 76, 74, 86, 81, 87, 81, 82,
+  88, 86, 89, 70, 87, 82, 90, 76, 85, 88,
+  88, 86, 95, 84, 81, 88, 79, 88, 79, 75,
+  80, 90, 90, 88, 95, 76, 90, 80, 82, 96,
+  92, 76, 82, 88, 88, 92, 82, 73, 100, 87,
+  90, 81, 64, 79, 86, 91, 89, 89, 75, 85,
+  92, 68, 72, 104, 86, 83, 104, 91, 80, 85,
+  78, 100, 77, 79, 98, 85, 75, 88, 88, 82,
+  86, 82, 75, 83, 79, 100, 93, 75, 85, 66,
+  80, 82, 81, 89, 85, 45, 74, 73, 83, 76,
+  80, 73, 93, 80, 95, 83, 97, 73, 76, 92,
+  74, 100, 85, 90, 75, 91, 79, 71, 86, 77,
+  92, 112, 78, 69, 68, 86, 92, 80, 85, 81,
+  77, 82, 72, 82, 87, 76, 98, 90, 76, 85,
+  78, 91, 83, 80, 93, 90, 67, 88, 71, 84,
+  66, 80, 78, 83, 93, 97, 83, 91, 95, 91,
+  81, 80, 85, 82, 74, 98, 97, 77, 93, 81,
+  73, 75, 80, 80, 73, 76, 75, 67, 75, 82,
+  72, 88, 84, 77, 96, 82, 92, 89, 130, 68,
+  81, 87, 80, 96, 143, 87, 99, 83, 70, 68,
+  110, 78, 113, 81, 80, 98, 77, 81, 85, 77,
+  62, 76, 85, 74, 97, 94, 81, 62, 88, 83,
+  87, 85, 89, 64, 64, 57, 58, 102, 73, 72,
+  115, 89, 84, 79, 82, 85, 84, 119, 79, 68,
+  73, 73, 80, 89, 92, 71, 101, 98, 83, 106,
+  82, 99, 89, 80, 111, 72, 88, 72, 77, 85,
+  73, 72, 101, 77, 88, 77, 86, 93, 84, 58,
+  90, 86, 67, 88, 65, 96, 74, 93, 81, 84,
+  78, 67, 92, 80, 76, 74, 74, 80, 77, 74,
+  89, 92, 74, 83, 88, 79, 107, 79, 75, 80,
+  86, 83, 76, 92, 80, 65, 72, 82, 93, 77,
+  76, 72, 91, 79, 95, 85, 106, 90, 107, 81,
+  84, 96, 82, 82, 90, 96, 79, 76, 103, 81,
+  97, 92, 70, 86, 85, 96, 73, 80, 75, 78,
+  79, 77, 73, 74, 73, 81, 99, 92, 78, 79,
+  76, 84, 70, 71, 69, 112, 77, 92, 66, 84,
+  86, 68, 74, 98, 97, 101, 85, 67, 73, 83,
+  95, 88, 109, 94, 98, 99, 89, 107, 90, 99,
+  104, 87, 94, 82, 79, 82, 77, 93, 87, 76,
+  93, 80, 88, 83, 102, 102, 83, 56, 104, 78,
+  60, 88, 92, 100, 90, 100, 96, 96, 82, 70,
+  90, 83, 74, 75, 76, 70, 84, 75, 79, 74,
+  91, 74, 77, 89, 89, 71, 94, 86, 79, 88,
+  95, 72, 95, 98, 95, 75, 87, 86, 85, 92,
+  71, 88, 70, 77, 85, 71, 80, 89, 92, 87,
+  71, 82, 75, 81, 78, 93, 69, 85, 81, 91,
+  97, 79, 80, 92, 78, 87, 84, 95, 78, 104,
+  82, 74, 89, 88, 78, 88, 85, 87, 77, 73,
+  83, 104, 79, 90, 84, 73, 76, 90, 80, 76,
+  96, 79, 85, 78, 67, 102, 94, 96, 79, 76,
+  91, 67, 82, 78, 90, 108, 76, 69, 79, 87,
+  74, 94, 73, 97, 79, 81, 78, 101, 87, 78,
+  83, 89, 87, 90, 72, 101, 80, 81, 99, 84,
+  79, 86, 81, 90, 84, 78, 73, 92, 72, 94,
+  85, 84, 96, 88, 79, 85, 61, 77, 93, 65,
+  85, 86, 79, 76, 84, 78, 72, 91, 87, 74,
+  82, 92, 100, 76, 69, 72, 68, 88, 79, 95,
+  90, 88, 105, 60, 78, 99, 96, 88, 112, 76,
+  88, 76, 70, 68, 74, 60, 110, 84, 89, 101,
+  72, 83, 83, 86, 70, 89, 81, 95, 93, 80,
+  84, 75, 71, 78, 91, 95, 91, 74, 65, 66,
+  65, 86, 73, 71, 100, 70, 88, 88, 93, 78,
+  71, 83, 88, 72, 90, 83, 83, 72, 82, 69,
+  80, 79, 87, 111, 87, 81, 64, 92, 98, 81,
+  90, 82, 83, 80, 66, 94, 88, 77, 93, 75,
+  70, 88, 90, 84, 84, 83, 91, 84, 65, 77,
+  58, 79, 77, 79, 76, 80, 95, 84, 82, 85,
+  90, 97, 81, 81, 70, 80, 91, 71, 81, 76,
+  87, 85, 80, 73, 78, 76, 70, 77, 79, 74,
+  80, 88, 80, 78, 77, 85, 79, 80, 85, 91,
+  81, 69, 86, 83, 73, 91, 88, 83, 82, 83,
+  88, 75, 106, 61, 86, 79, 78, 91, 72, 76,
+  92, 82, 59, 88, 79, 82, 84, 91, 83, 80,
+  78, 73, 89, 82, 90, 88, 76, 70, 69, 92,
+  76, 94, 82, 79, 96, 85, 82, 86, 79, 89,
+  98, 62, 85, 75, 85, 75, 86, 88, 82, 83,
+  77, 101, 78, 92, 85, 87, 98, 78, 83, 73,
+  74, 83, 76, 81, 95, 77, 95, 92, 71, 91,
+  95, 71, 88, 75, 82, 86, 79, 96, 81, 81,
+  77, 92, 80, 69, 90, 84, 81, 83, 79, 81,
+  83, 75, 95, 87, 84, 86, 74, 84, 91, 82,
+  89, 85, 85, 73, 87, 82, 91, 96, 80, 91,
+  96, 82, 97, 96, 75, 82, 82, 74, 72, 92,
+  85, 79, 90, 97, 87, 87, 87, 74, 79, 82,
+  88, 99, 65, 89, 95, 81, 87, 85, 77, 78,
+  84, 92, 79, 91, 80, 82, 88, 100, 84, 90,
+  84, 92, 81, 99, 99, 112, 78, 82, 80, 90,
+  78, 101, 80, 72, 98, 82, 93, 83, 81, 86,
+  89, 99, 82, 75, 95, 78, 90, 81, 90, 89,
+  71, 81, 101, 88, 87, 90, 66, 87, 90, 82,
+  91, 97, 84, 84, 82, 82, 85, 89, 65, 102,
+  81, 81, 100, 86, 88, 88, 90, 89, 88, 83,
+  77, 82, 64, 87, 84, 78, 92, 92, 79, 79,
+  83, 81, 96, 68, 72, 90, 85, 78, 88, 83,
+  80, 89, 86, 76, 85, 98, 98, 82, 77, 77,
+  80, 90, 70, 91, 83, 80, 82, 78, 78, 89,
+  100, 89, 89, 73, 80, 82, 73, 87, 70, 71,
+  76, 81, 99, 90, 76, 91, 79, 89, 93, 96,
+  73, 104, 81, 82, 80, 93, 80, 83, 79, 94,
+  80, 91, 85, 99, 76, 76, 75, 75, 83, 77,
+  79, 74, 90, 85, 79, 69, 81, 88, 91, 98,
+  80, 72, 86, 77, 87, 77, 98, 99, 78, 84,
+  80, 93, 83, 88, 79, 90, 90, 86, 79, 96,
+  78, 83, 90, 76, 77, 89, 73, 106, 87, 85,
+  99, 84, 80, 70, 69, 82, 86, 79, 81, 85,
+  73, 89, 86, 83, 97, 96, 88, 89, 90, 78,
+  93, 70, 77, 83, 79, 82, 82, 79, 81, 82,
+  78, 70, 84, 86, 94, 82, 67, 82, 88, 90,
+  73, 89, 75, 77, 78, 70, 84, 87, 84, 87,
+  93, 87, 83, 83, 83, 76, 84, 66, 74, 75,
+  96, 88, 77, 79, 86, 83, 81, 90, 75, 96,
+  82, 89, 86, 91, 75, 84, 84, 86, 91, 100,
+  90, 84, 79, 89, 76, 87, 88, 72, 89, 77,
+  87, 85, 78, 71, 95, 81, 90, 90, 82, 83,
+  84, 85, 82, 77, 94, 90, 74, 83, 78, 94,
+  95, 83, 76, 81, 83, 84, 80, 90, 82, 82,
+  89, 87, 80, 89, 80, 98, 87, 84, 96, 86,
+  77, 80, 88, 82, 87, 86, 81, 82, 74, 89,
+  85, 84, 90, 87, 69, 79, 76, 88, 81, 94,
+  87, 97, 112, 83, 79, 118, 92, 68, 75, 100,
+  83, 86, 85, 74, 105, 88, 92, 75, 83, 75,
+  80, 85, 92, 89, 85, 80, 104, 72, 76, 89,
+  92, 73, 109, 83, 75, 80, 74, 76, 70, 93,
+  104, 87, 86, 68, 81, 74, 88, 102, 66, 105,
+  86, 83, 85, 80, 75, 79, 82, 67, 89, 93,
+  79, 91, 85, 73, 88, 101, 98, 95, 87, 79,
+  89, 78, 79, 82, 89, 67, 72, 85, 77, 68,
+  99, 98, 68, 82, 89, 83, 81, 80, 88, 92,
+  70, 79, 94, 91, 82, 79, 87, 93, 92, 75,
+  78, 90, 88, 89, 88, 87, 82, 94, 84, 78,
+  85, 86, 82, 100, 76, 75, 78, 88, 85, 99,
+  79, 92, 58, 80, 88, 76, 87, 73, 76, 90,
+  124, 77, 87, 117, 85, 97, 77, 80, 79, 74,
+  85, 66, 90, 81, 76, 79, 80, 71, 80, 82,
+  104, 71, 83, 88, 82, 76, 77, 88, 85, 55,
+  89, 74, 52, 88, 103, 66, 72, 73, 93, 81,
+  76, 60, 93, 84, 86, 118, 61, 75, 95, 75,
+  87, 85, 74, 92, 78, 68, 73, 114, 82, 85,
+  89, 60, 76, 81, 102, 89, 84, 77, 78, 88,
+  79, 97, 87, 62, 71, 94, 77, 57, 87, 119,
+  62, 68, 93, 80, 69, 73, 84, 96, 68, 76,
+  90, 119, 79, 89, 102, 93, 79, 83, 66, 91,
+  89, 89, 98, 68, 70, 92, 100, 63, 73, 81,
+  73, 96, 86, 70, 63, 82, 74, 84, 83, 113,
+  74, 89, 101, 83, 83, 88, 87, 99, 100, 85,
+  79, 116, 85, 106, 78, 95, 80, 88, 85, 79,
+  74, 86, 91, 75, 79, 79, 87, 86, 87, 74,
+  97, 92, 100, 85, 88, 84, 86, 71, 74, 82,
+  75, 84, 103, 78, 73, 95, 96, 79, 80, 70,
+  75, 83, 88, 88, 79, 62, 83, 77, 84, 79,
+  79, 82, 86, 69, 89, 89, 78, 87, 89, 77,
+  88, 109, 91, 100, 89, 74, 80, 91, 97, 81,
+  91, 70, 68, 84, 76, 73, 91, 98, 77, 80,
+  90, 83, 88, 81, 82, 84, 75, 83, 93, 89,
+  79, 95, 89, 93, 94, 77, 81, 86, 86, 91,
+  90, 90, 83, 98, 95, 78, 77, 90, 85, 90,
+  85, 77, 86, 87, 83, 92, 79, 95, 77, 78,
+  70, 77, 78, 82, 78, 82, 116, 86, 94, 128,
+  83, 113, 71, 78, 70, 65, 91, 73, 92, 89,
+  92, 85, 77, 73, 83, 82, 94, 80, 84, 83,
+  87, 84, 86, 76, 83, 75, 75, 72, 79, 79,
+  85, 72, 81, 98, 92, 82, 81, 58, 91, 83,
+  83, 110, 67, 80, 84, 83, 81, 85, 87, 87,
+  84, 69, 71, 92, 85, 80, 96, 62, 70, 99,
+  80, 85, 84, 75, 83, 82, 67, 90, 81, 81,
+  76, 77, 74, 84, 88, 115, 69, 98, 94, 81,
+  75, 68, 90, 90, 71, 79, 89, 107, 81, 78,
+  91, 97, 78, 60, 73, 86, 79, 78, 90, 76,
+  69, 83, 93, 77, 83, 84, 79, 95, 68, 73,
+  71, 80, 78, 87, 80, 98, 68, 74, 79, 67,
+  84, 74, 72, 73, 119, 86, 105, 132, 79, 122,
+  67, 54, 64, 50, 86, 66, 84, 79, 73, 82,
+  80, 61, 77, 75, 107, 75, 78, 92, 64, 86,
+  77, 85, 86, 73, 128, 64, 82, 107, 90, 62,
+  78, 56, 88, 81, 84, 50, 116, 90, 75, 141,
+  70, 118, 83, 86, 96, 82, 82, 87, 93, 76,
+  49, 147, 97, 75, 82, 42, 80, 104, 71, 72,
+  83, 72, 79, 82, 52, 121, 79, 84, 59, 66,
+  74, 97, 73, 147, 68, 69, 81, 67, 78, 58,
+  81, 101, 69, 68, 89, 139, 70, 86, 118, 96,
+  54, 48, 58, 95, 64, 75, 92, 63, 61, 73,
+  100, 80, 75, 84, 85, 96, 75, 68, 49, 77,
+  67, 69, 86, 115, 70, 82, 91, 80, 79, 90,
+  81, 93, 105, 87, 89, 119, 78, 75, 73, 81,
+  72, 76, 89, 81, 81, 72, 85, 79, 78, 78,
+  87, 84, 86, 85, 82, 98, 93, 81, 82, 80,
+  85, 78, 101, 72, 81, 73, 88, 81, 83, 99,
+  86, 79, 82, 62, 81, 69, 85, 95, 77, 92,
+  81, 86, 82, 88, 82, 77, 90, 67, 78, 84,
+  79, 87, 89, 71, 84, 108, 88, 91, 86, 77,
+  74, 77, 69, 80, 82, 80, 70, 76, 75, 91,
+  81, 95, 66, 95, 98, 74, 82, 70, 85, 83,
+  77, 82, 89, 96, 82, 89, 89, 96, 75, 61,
+  78, 85, 71, 83, 81, 83, 73, 86, 68, 67,
+  81, 86, 79, 90, 90, 73, 83, 85, 84, 89,
+  78, 94, 78, 75, 81, 94, 78, 105, 96, 77,
+  82, 88, 89, 86, 94, 95, 78, 89, 66, 92,
+  88, 80, 87, 90, 101, 93, 84, 90, 91, 82,
+  87, 91, 89, 83, 96, 78, 81, 89, 88, 83,
+  80, 89, 91, 77, 71, 85, 85, 105, 78, 87,
+  91, 85, 77, 79, 91, 92, 76, 89, 75, 89,
+  86, 83, 83, 78, 78, 79, 93, 83, 78, 85,
+  85, 74, 95, 83, 77, 78, 88, 79, 79, 75,
+  85, 75, 83, 71, 73, 77, 95, 90, 101, 89,
+  77, 101, 90, 92, 84, 83, 108, 77, 72, 78,
+  94, 81, 93, 87, 82, 89, 92, 71, 94, 86,
+  71, 93, 97, 90, 78, 84, 91, 86, 85, 89,
+  88, 87, 84, 79, 87, 94, 87, 84, 77, 87,
+  63, 80, 96, 103, 79, 99, 92, 79, 94, 86,
+  82, 84, 84, 78, 82, 82, 62, 102, 91, 84,
+  77, 72, 92, 104, 87, 89, 99, 86, 90, 74,
+  75, 95, 100, 73, 80, 85, 76, 84, 78, 78,
+  79, 66, 79, 74, 82, 105, 76, 84, 84, 89,
+  78, 67, 101, 96, 73, 73, 80, 78, 76, 85,
+  88, 65, 77, 70, 88, 77, 84, 87, 85, 74,
+  79, 64, 85, 76, 90, 78, 70, 81, 75, 72,
+  88, 69, 74, 90, 78, 92, 97, 75, 75, 120,
+  97, 98, 71, 82, 107, 73, 74, 70, 81, 81,
+  95, 74, 72, 89, 79, 67, 92, 82, 75, 98,
+  92, 79, 80, 92, 84, 76, 82, 81, 74, 80,
+  99, 78, 77, 99, 80, 78, 79, 96, 77, 85,
+  100, 86, 78, 99, 97, 81, 77, 90, 90, 88,
+  93, 84, 81, 88, 71, 96, 89, 88, 73, 95,
+  101, 91, 80, 92, 92, 86, 83, 78, 92, 93,
+  97, 85, 97, 84, 88, 80, 87, 86, 94, 76,
+  90, 84, 82, 100, 75, 77, 94, 85, 71, 87,
+  85, 91, 80, 82, 79, 85, 86, 80, 83, 80,
+  81, 79, 90, 82, 70, 87, 90, 83, 85, 87,
+  80, 82, 84, 81, 80, 87, 82, 68, 82, 75,
+  75, 82, 94, 93, 88, 81, 81, 95, 82, 90,
+  90, 82, 92, 81, 75, 80, 81, 86, 88, 83,
+  82, 89, 91, 73, 97, 83, 74, 88, 93, 90,
+  77, 89, 89, 96, 87, 90, 92, 88, 81, 81,
+  86, 95, 88, 84, 81, 87, 99, 84, 89, 85,
+  84, 87, 81, 97, 74, 97, 78, 83, 90, 90,
+  86, 85, 88, 78, 77, 78, 78, 86, 85, 77,
+  94, 96, 84, 92, 97, 84, 82, 72, 87, 84,
+  82, 99, 86, 63, 80, 81, 81, 79, 83, 85,
+  89, 75, 98, 75, 79, 83, 83, 83, 91, 76,
+  88, 86, 85, 82, 82, 89, 81, 82, 90, 58,
+  76, 83, 87, 85, 90, 89, 81, 79, 80, 98,
+  83, 69, 86, 78, 85, 80, 84, 91, 94, 91,
+  92, 81, 58, 87, 79, 75, 87, 80, 88, 84,
+  86, 86, 82, 81, 87, 76, 91, 90, 87, 84,
+  66, 81, 78, 91, 92, 75, 86, 89, 73, 132,
+  89, 93, 87, 84, 93, 88, 86, 88, 72, 98,
+  79, 78, 65, 85, 95, 81, 81, 89, 85, 91,
+  74, 92, 73, 100, 85, 90, 87, 86, 79, 76,
+  81, 77, 83, 88, 81, 87, 81, 86, 104, 89,
+  88, 80, 101, 80, 87, 75, 85, 86, 85, 99,
+  76, 101, 78, 77, 82, 76, 69, 89, 87, 85,
+  86, 66, 84, 86, 83, 90, 86, 82, 97, 86,
+  92, 73, 90, 86, 86, 78, 89, 50, 58, 81,
+  74, 86, 82, 91, 85, 88, 81, 91, 77, 89,
+  86, 84, 86, 84, 83, 84, 100, 86, 82, 76,
+  65, 90, 77, 78, 91, 81, 99, 84, 82, 87,
+  86, 82, 77, 77, 86, 86, 79, 86, 76, 80,
+  76, 89, 72, 77, 78, 86, 87, 129, 83, 90,
+  87, 81, 81, 86, 86, 83, 80, 88, 86, 83,
+  88, 83, 84, 70, 92, 89, 91, 91, 65, 87,
+  79, 81, 87, 83, 86, 83, 72, 83, 71, 82,
+  77, 95, 88, 85, 94, 95, 97, 82, 82, 63,
+  87, 78, 98, 87, 89, 86, 94, 102, 79, 129,
+  78, 70, 89, 71, 78, 90, 91, 87, 80, 69,
+  88, 79, 84, 94, 82, 95, 97, 87, 89, 83,
+  88, 88, 84, 78, 91, 65, 71, 87, 75, 92,
+  82, 103, 67, 84, 92, 87, 83, 86, 84, 86,
+  93, 78, 84, 81, 105, 89, 78, 91, 52, 82,
+  73, 81, 94, 84, 94, 94, 74, 92, 96, 81,
+  79, 89, 80, 74, 74, 94, 134, 87, 84, 83,
+  72, 78, 82, 90, 105, 158, 89, 89, 81, 76,
+  79, 93, 96, 76, 81, 76, 80, 96, 101, 84,
+  93, 90, 79, 75, 84, 88, 81, 95, 73, 93,
+  77, 80, 96, 85, 87, 89, 91, 77, 65, 72,
+  85, 81, 82, 84, 92, 98, 77, 94, 83, 87,
+  90, 77, 82, 87, 82, 85, 85, 62, 77, 82,
+  83, 80, 88, 85, 89, 79, 97, 83, 81, 81,
+  78, 81, 92, 72, 78, 91, 84, 83, 78, 95,
+  82, 80, 83, 67, 74, 84, 89, 86, 90, 79,
+  80, 76, 74, 100, 81, 61, 86, 76, 80, 88,
+  87, 91, 87, 85, 95, 86, 61, 81, 79, 84,
+  94, 80, 82, 84, 77, 89, 83, 83, 84, 81,
+  86, 91, 89, 83, 59, 85, 76, 92, 96, 78,
+  86, 87, 68, 111, 81, 92, 78, 87, 97, 90,
+  89, 84, 70, 95, 82, 65, 64, 85, 92, 87,
+  76, 84, 81, 88, 82, 89, 73, 96, 83, 88,
+  87, 86, 81, 80, 85, 75, 85, 84, 81, 86,
+  72, 81, 100, 89, 78, 85, 83, 81, 87, 77,
+  82, 85, 76, 91, 81, 78, 80, 78, 80, 77,
+  76, 93, 86, 79, 88, 74, 83, 84, 81, 85,
+  86, 77, 92, 93, 96, 76, 92, 85, 81, 74,
+  87, 55, 57, 81, 75, 81, 86, 87, 82, 83,
+  77, 92, 75, 79, 88, 81, 79, 87, 88, 85,
+  99, 79, 89, 76, 71, 84, 75, 72, 92, 80,
+  94, 86, 78, 86, 85, 81, 75, 79, 80, 88,
+  76, 84, 63, 79, 80, 92, 80, 83, 76, 83,
+  78, 116, 76, 89, 84, 77, 81, 88, 84, 81,
+  81, 82, 87, 71, 81, 85, 77, 70, 80, 94,
+  86, 97, 70, 88, 79, 92, 81, 80, 82, 89,
+  75, 86, 77, 75, 83, 90, 84, 85, 83, 92,
+  92, 79, 89, 77, 66, 78, 96, 82, 79, 89,
+  89, 94, 78, 119, 81, 73, 86, 72, 68, 90,
+  82, 80, 90, 71, 90, 77, 81, 84, 79, 85,
+  98, 87, 98, 81, 90, 81, 79, 79, 98, 69,
+  68, 84, 76, 87, 90, 97, 75, 79, 96, 87,
+  83, 86, 86, 84, 92, 80, 82, 81, 100, 81,
+  78, 85, 57, 84, 72, 70, 92, 83, 94, 97,
+  80, 85, 89, 79, 78, 90, 75, 84, 77, 93,
+  118, 81, 84, 84, 76, 83, 76, 95, 99, 144,
+  87, 89, 75, 75, 87, 90, 88, 81, 82, 75,
+  79, 88, 95, 84, 89, 91, 77, 78, 79, 89,
+  81, 98, 75, 107, 75, 86, 91, 87, 87, 85,
+  91, 80, 63, 68, 88, 86, 85, 91, 86, 94,
+  82, 93, 91, 79, 86, 76, 79, 87, 83, 93,
+  90, 71, 76, 85, 83, 82, 89, 80, 82, 82,
+  92, 83, 81, 81, 80, 78, 97, 75, 81, 93,
+  90, 82, 83, 94, 86, 86, 93, 73, 85, 85,
+  88, 91, 87, 86, 84, 75, 76, 89, 82, 69,
+  87, 80, 86, 83, 85, 91, 88, 94, 90, 72,
+  57, 82, 80, 91, 98, 82, 93, 80, 86, 85,
+  86, 75, 81, 79, 90, 93, 105, 85, 60, 85,
+  85, 90, 89, 76, 81, 90, 75, 115, 79, 99,
+  79, 99, 102, 90, 90, 79, 66, 99, 75, 69,
+  66, 79, 95, 88, 75, 82, 81, 87, 85, 91,
+  78, 98, 85, 86, 89, 85, 85, 80, 87, 75,
+  79, 72, 88, 85, 70, 82, 93, 90, 75, 87,
+  100, 78, 85, 81, 81, 85, 76, 89, 89, 70,
+  79, 82, 85, 76, 89, 87, 81, 80, 84, 82,
+  84, 85, 82, 85, 86, 78, 87, 93, 96, 77,
+  90, 84, 81, 81, 89, 62, 62, 80, 82, 86,
+  88, 85, 79, 79, 74, 86, 75, 76, 88, 75,
+  81, 86, 88, 84, 101, 84, 89, 69, 70, 82,
+  75, 78, 93, 85, 95, 85, 78, 86, 87, 79,
+  72, 78, 85, 94, 82, 84, 60, 84, 82, 89,
+  88, 82, 77, 83, 78, 105, 81, 92, 84, 81,
+  86, 88, 86, 77, 75, 89, 83, 78, 74, 80,
+  76, 76, 72, 95, 87, 89, 79, 90, 81, 91,
+  83, 79, 84, 89, 76, 84, 80, 77, 76, 81,
+  87, 83, 83, 85, 91, 85, 81, 82, 91, 73,
+  92, 81, 79, 83, 82, 90, 85, 101, 89, 80,
+  86, 69, 81, 85, 75, 82, 87, 76, 92, 78,
+  79, 85, 81, 83, 92, 86, 99, 82, 92, 85,
+  76, 81, 91, 68, 70, 83, 79, 86, 90, 86,
+  88, 82, 85, 84, 81, 86, 82, 75, 90, 77,
+  83, 81, 97, 89, 81, 81, 56, 83, 71, 76,
+  93, 83, 99, 92, 83, 86, 90, 78, 80, 89,
+  82, 89, 79, 86, 98, 81, 81, 84, 87, 87,
+  80, 88, 95, 130, 91, 90, 79, 75, 91, 90,
+  93, 84, 86, 80, 81, 95, 85, 82, 87, 92,
+  93, 64, 79, 102, 84, 89, 88, 67, 85, 79,
+  79, 85, 80, 97, 94, 68, 82, 73, 75, 79,
+  69, 92, 72, 91, 75, 75, 91, 78, 94, 65,
+  91, 84, 73, 92, 77, 89, 82, 90, 104, 68,
+  74, 89, 87, 78, 78, 77, 88, 94, 70, 84,
+  88, 69, 96, 86, 79, 87, 96, 97, 95, 92,
+  84, 95, 86, 86, 93, 70, 80, 84, 100, 82,
+  94, 51, 81, 91, 82, 88, 69, 78, 85, 81,
+  88, 83, 87, 81, 86, 84, 85, 81, 100, 103,
+  93, 92, 71, 87, 92, 89, 81, 107, 69, 79,
+  79, 84, 79, 66, 85, 95, 78, 75, 80, 72,
+  81, 96, 84, 93, 85, 86, 103, 70, 87, 78,
+  92, 81, 85, 77, 79, 85, 85, 98, 94, 62,
+  79, 73, 87, 91, 88, 70, 85, 82, 88, 81,
+  73, 99, 88, 63, 77, 74, 72, 83, 76, 104,
+  73, 88, 80, 72, 90, 71, 104, 55, 87, 85,
+  67, 83, 78, 103, 82, 95, 115, 51, 67, 85,
+  82, 79, 83, 78, 84, 96, 72, 77, 88, 59,
+  83, 86, 86, 87, 113, 93, 95, 94, 92, 93,
+  59, 86, 102, 67, 60, 83, 80, 75, 102, 52,
+  77, 97, 77, 83, 66, 68, 83, 82, 75, 84,
+  86, 78, 84, 80, 87, 92, 89, 109, 99, 96,
+  66, 90, 87, 83, 84, 98, 56, 73, 78, 83,
+  64, 52, 81, 92, 78, 81, 84, 68, 84, 93,
+  86, 85, 86, 87, 109, 63, 84, 78, 87, 92,
+  79, 76, 72, 87, 85, 91, 94, 70, 80, 82,
+  81, 91, 85, 73, 83, 78, 81, 83, 80, 94,
+  90, 72, 87, 73, 75, 82, 94, 93, 86, 86,
+  83, 77, 89, 71, 95, 64, 87, 84, 80, 80,
+  83, 91, 85, 92, 106, 64, 72, 87, 78, 79,
+  85, 84, 88, 92, 72, 89, 87, 68, 92, 79,
+  83, 87, 98, 89, 96, 97, 84, 88, 87, 88,
+  100, 69, 80, 92, 95, 84, 93, 53, 79, 88,
+  81, 89, 65, 79, 85, 80, 78, 96, 84, 82,
+  89, 89, 89, 89, 93, 95, 96, 86, 77, 90,
+  88, 88, 76, 95, 69, 75, 85, 82, 69, 63,
+  80, 91, 75, 78, 86, 74, 83, 88, 92, 89,
+  99, 82, 100, 75, 78, 87, 87, 79, 84, 77,
+  79, 85, 95, 87, 83, 85, 80, 83, 70, 83,
+  90, 80, 82, 82, 66, 81, 75, 86, 73, 63,
+  89, 82, 76, 87, 107, 89, 75, 79, 84, 80,
+  87, 83, 85, 83, 76, 75, 84, 99, 72, 96,
+  81, 71, 106, 68, 90, 88, 92, 72, 80, 85,
+  89, 75, 86, 81, 90, 72, 95, 91, 82, 92,
+  84, 81, 94, 88, 98, 76, 74, 76, 83, 85,
+  73, 77, 98, 80, 78, 72, 82, 82, 89, 86,
+  75, 65, 94, 84, 80, 78, 87, 82, 87, 91,
+  74, 67, 80, 96, 90, 79, 80, 84, 92, 82,
+  78, 87, 78, 82, 79, 88, 71, 70, 80, 97,
+  93, 73, 81, 73, 74, 81, 93, 84, 85, 76,
+  89, 78, 87, 75, 72, 81, 82, 82, 99, 79,
+  103, 81, 88, 86, 77, 76, 69, 85, 95, 80,
+  83, 92, 63, 87, 78, 85, 68, 60, 94, 83,
+  90, 92, 89, 84, 72, 74, 89, 76, 113, 67,
+  94, 93, 69, 78, 77, 84, 81, 108, 80, 53,
+  134, 63, 84, 90, 102, 72, 80, 82, 83, 67,
+  100, 84, 89, 72, 102, 98, 93, 89, 90, 79,
+  93, 84, 110, 87, 57, 76, 84, 88, 56, 89,
+  90, 75, 77, 88, 74, 84, 101, 81, 72, 53,
+  95, 94, 69, 81, 93, 85, 84, 94, 72, 70,
+  73, 106, 95, 86, 80, 95, 100, 81, 72, 74,
+  78, 90, 71, 89, 53, 51, 76, 101, 94, 66,
+  96, 73, 71, 81, 100, 82, 85, 75, 89, 72,
+  79, 74, 66, 82, 78, 85, 93, 71, 94, 78,
+  79, 82, 81, 104, 72, 84, 87, 85, 86, 81,
+  73, 85, 75, 88, 69, 64, 97, 77, 91, 80,
+  80, 91, 78, 78, 91, 81, 91, 72, 89, 95,
+  74, 84, 82, 85, 84, 94, 77, 71, 108, 72,
+  69, 87, 93, 74, 82, 87, 87, 74, 88, 83,
+  93, 77, 93, 77, 86, 90, 86, 83, 96, 89,
+  98, 75, 68, 76, 78, 83, 70, 78, 87, 83,
+  80, 69, 79, 87, 95, 82, 75, 71, 94, 85,
+  81, 97, 81, 81, 78, 92, 79, 79, 78, 100,
+  94, 77, 85, 86, 91, 81, 78, 82, 77, 90,
+  84, 86, 66, 70, 78, 95, 100, 74, 97, 72,
+  81, 87, 86, 83, 86, 75, 85, 75, 72, 81,
+  73, 82, 85, 80, 94, 79, 86, 89, 82, 88,
+  82, 74, 69, 90, 82, 89, 91, 77, 89, 89,
+  83, 78, 70, 81, 91, 86, 85, 86, 101, 94,
+  79, 80, 89, 89, 77, 85, 84, 90, 83, 76,
+  91, 105, 82, 80, 82, 76, 93, 78, 89, 88,
+  87, 88, 71, 89, 90, 74, 85, 89, 92, 92,
+  85, 89, 72, 86, 72, 81, 92, 84, 82, 75,
+  87, 78, 80, 83, 88, 64, 95, 90, 94, 79,
+  94, 71, 81, 91, 80, 86, 94, 86, 93, 87,
+  84, 87, 91, 90, 74, 73, 70, 81, 80, 83,
+  77, 81, 79, 86, 82, 81, 75, 92, 90, 90,
+  83, 96, 90, 90, 78, 85, 91, 87, 91, 75,
+  80, 90, 83, 70, 68, 91, 90, 77, 86, 80,
+  76, 73, 95, 94, 93, 87, 87, 99, 89, 69,
+  67, 89, 90, 83, 97, 82, 98, 88, 88, 76,
+  73, 92, 99, 83, 101, 83, 67, 89, 85, 79,
+  93, 86, 101, 84, 85, 105, 92, 74, 87, 90,
+  84, 79, 89, 70, 90, 75, 96, 94, 93, 99,
+  70, 88, 90, 75, 96, 89, 94, 106, 86, 88,
+  67, 88, 58, 83, 89, 79, 83, 91, 80, 77,
+  87, 89, 80, 59, 87, 83, 89, 85, 86, 64,
+  94, 83, 87, 82, 97, 88, 98, 91, 89, 90,
+  89, 89, 76, 77, 69, 78, 68, 89, 72, 82,
+  85, 90, 82, 74, 72, 85, 84, 93, 90, 98,
+  95, 91, 93, 86, 113, 89, 95, 78, 76, 89,
+  88, 67, 60, 90, 83, 80, 90, 77, 80, 72,
+  91, 94, 86, 87, 79, 86, 87, 97, 69, 83,
+  82, 89, 89, 75, 90, 80, 82, 83, 70, 84,
+  95, 81, 93, 85, 72, 91, 84, 80, 88, 86,
+  80, 85, 80, 95, 84, 85, 87, 87, 78, 78,
+  91, 80, 97, 78, 79, 87, 87, 85, 71, 89,
+  92, 76, 85, 85, 97, 96, 82, 77, 73, 85,
+  75, 81, 91, 86, 86, 76, 87, 81, 82, 81,
+  82, 69, 91, 87, 94, 75, 91, 76, 84, 86,
+  86, 86, 93, 83, 99, 104, 81, 88, 84, 88,
+  79, 79, 70, 86, 79, 81, 82, 79, 80, 82,
+  88, 83, 74, 84, 95, 90, 86, 95, 89, 91,
+  81, 88, 96, 77, 95, 88, 81, 89, 101, 71,
+  69, 90, 72, 79, 83, 82, 80, 70, 93, 93,
+  84, 87, 86, 88, 77, 92, 79, 93, 86, 80,
+  70, 83, 86, 74, 70, 99, 87, 79, 80, 89,
+  89, 75, 68, 81, 79, 78, 85, 85, 97, 84,
+  81, 80, 84, 93, 82, 78, 87, 83, 92, 89,
+  86, 79, 82, 84, 79, 92, 84, 80, 74, 74,
+  76, 84, 87, 79, 79, 97, 85, 91, 92, 82,
+  86, 69, 83, 86, 79, 85, 78, 69, 84, 86,
+  123, 68, 84, 79, 84, 85, 71, 72, 83, 86,
+  74, 87, 78, 72, 74, 79, 88, 83, 85, 75,
+  84, 92, 80, 79, 89, 81, 83, 88, 78, 79,
+  79, 99, 84, 79, 83, 96, 77, 80, 87, 85,
+  83, 92, 76, 87, 76, 60, 72, 85, 92, 92,
+  79, 83, 80, 82, 93, 86, 85, 76, 103, 83,
+  119, 101, 74, 106, 89, 96, 87, 84, 78, 77,
+  94, 82, 64, 98, 85, 83, 87, 81, 95, 82,
+  88, 76, 81, 89, 88, 88, 78, 103, 84, 77,
+  80, 103, 132, 90, 114, 84, 87, 68, 97, 80,
+  92, 78, 95, 92, 65, 90, 77, 66, 83, 72,
+  87, 73, 76, 74, 70, 77, 84, 86, 80, 71,
+  67, 71, 81, 90, 73, 82, 82, 83, 98, 73,
+  86, 82, 81, 81, 77, 96, 75, 96, 74, 84,
+  79, 80, 75, 88, 92, 95, 72, 66, 73, 81,
+  80, 83, 99, 88, 87, 86, 79, 79, 89, 60,
+  80, 83, 78, 89, 89, 79, 76, 81, 96, 88,
+  74, 93, 65, 61, 109, 95, 87, 88, 83, 89,
+  79, 87, 74, 84, 87, 94, 86, 76, 92, 85,
+  77, 74, 85, 93, 84, 77, 71, 89, 83, 89,
+  69, 83, 79, 76, 83, 80, 82, 75, 94, 86,
+  83, 77, 89, 83, 87, 55, 82, 79, 78, 92,
+  81, 78, 82, 79, 79, 86, 76, 79, 88, 92,
+  76, 85, 86, 69, 78, 75, 84, 93, 88, 81,
+  76, 68, 85, 91, 86, 89, 86, 77, 90, 94,
+  81, 87, 99, 70, 83, 102, 80, 70, 73, 83,
+  80, 80, 76, 78, 91, 85, 81, 92, 81, 83,
+  79, 83, 79, 89, 94, 76, 80, 79, 75, 75,
+  86, 85, 84, 81, 88, 80, 72, 73, 89, 78,
+  86, 99, 74, 86, 86, 84, 93, 85, 72, 91,
+  93, 78, 106, 85, 91, 97, 85, 81, 86, 84,
+  99, 86, 85, 78, 95, 83, 71, 87, 80, 84,
+  75, 75, 90, 82, 82, 76, 91, 69, 62, 87,
+  78, 77, 92, 88, 93, 84, 73, 79, 80, 76,
+  92, 88, 89, 60, 88, 75, 76, 87, 145, 81,
+  93, 80, 87, 77, 84, 78, 86, 85, 72, 102,
+  95, 76, 70, 88, 70, 69, 88, 80, 99, 105,
+  75, 93, 98, 82, 93, 89, 74, 75, 72, 86,
+  77, 82, 91, 78, 122, 65, 94, 82, 93, 76,
+  84, 91, 76, 73, 73, 73, 75, 65, 75, 83,
+  83, 95, 84, 94, 97, 94, 82, 78, 105, 77,
+  80, 79, 111, 80, 83, 87, 91, 76, 87, 92,
+  68, 81, 81, 91, 80, 99, 76, 79, 51, 81,
+  74, 81, 88, 92, 81, 93, 83, 81, 103, 80,
+  82, 76, 105, 88, 132, 93, 67, 84, 76, 78,
+  86, 92, 95, 61, 79, 85, 57, 82, 82, 78,
+  95, 97, 85, 67, 74, 75, 82, 73, 106, 94,
+  67, 132, 93, 84, 76, 97, 193, 76, 170, 92,
+  79, 58, 118, 73, 84, 73, 71, 94, 95, 82,
+  75, 81, 79, 53, 83, 74, 99, 60, 66, 78,
+  87, 80, 92, 94, 74, 77, 71, 94, 64, 78,
+  98, 82, 69, 66, 100, 85, 82, 79, 95, 86,
+  81, 73, 70, 60, 67, 83, 76, 100, 71, 99,
+  59, 81, 80, 96, 81, 78, 105, 79, 81, 80,
+  92, 75, 92, 59, 92, 79, 76, 99, 67, 83,
+  75, 91, 100, 100, 76, 70, 64, 74, 81, 86,
+  86, 102, 81, 101, 72, 84, 86, 81, 80, 96,
+  86, 84, 113, 86, 79, 82, 75, 77, 88, 83,
+  76, 85, 76, 92, 61, 82, 78, 76, 90, 87,
+  81, 80, 91, 86, 87, 74, 91, 88, 80, 85,
+  93, 88, 72, 79, 76, 85, 66, 80, 78, 83,
+  79, 78, 82, 90, 67, 82, 97, 88, 77, 86,
+  85, 84, 91, 83, 86, 64, 77, 97, 91, 80,
+  93, 89, 87, 86, 75, 88, 83, 69, 83, 93,
+  71, 70, 81, 84, 84, 77, 80, 58, 77, 72,
+  83, 84, 76, 103, 76, 92, 70, 87, 93, 94,
+  91, 76, 78, 76, 84, 84, 83, 76, 85, 85,
+  81, 94, 95, 74, 95, 100, 70, 85, 79, 86,
+  102, 85, 79, 79, 98, 83, 108, 79, 86, 95,
+  80, 87, 82, 85, 108, 83, 82, 67, 83, 66,
+  63, 86, 98, 83, 87, 76, 89, 74, 90, 92,
+  93, 72, 84, 82, 76, 86, 84, 90, 94, 74,
+  67, 79, 89, 95, 86, 78, 85, 80, 94, 75,
+  99, 88, 105, 68, 95, 83, 74, 83, 79, 77,
+  90, 94, 86, 96, 85, 90, 81, 91, 71, 75,
+  95, 98, 94, 77, 84, 76, 97, 82, 90, 95,
+  87, 87, 81, 84, 88, 99, 80, 80, 76, 75,
+  85, 83, 97, 83, 83, 62, 74, 83, 76, 78,
+  83, 63, 79, 78, 84, 75, 81, 101, 93, 91,
+  86, 105, 92, 90, 85, 83, 96, 86, 73, 80,
+  88, 77, 91, 77, 69, 80, 72, 83, 76, 87,
+  83, 77, 61, 85, 80, 87, 70, 81, 77, 99,
+  90, 77, 95, 91, 80, 78, 83, 83, 79, 82,
+  88, 55, 90, 75, 81, 81, 97, 86, 88, 70,
+  80, 81, 71, 90, 86, 94, 84, 58, 69, 85,
+  97, 91, 96, 80, 78, 96, 94, 81, 98, 72,
+  102, 51, 107, 82, 76, 78, 84, 79, 86, 78,
+  81, 96, 95, 65, 85, 98, 75, 56, 97, 89,
+  94, 66, 82, 76, 98, 77, 93, 96, 98, 101,
+  61, 89, 83, 86, 74, 93, 35, 72, 86, 86,
+  92, 89, 85, 59, 88, 74, 74, 78, 84, 68,
+  71, 83, 67, 69, 83, 106, 89, 90, 89, 100,
+  80, 81, 83, 81, 91, 86, 71, 74, 86, 78,
+  89, 86, 69, 84, 69, 85, 80, 86, 80, 69,
+  82, 94, 51, 92, 70, 88, 73, 93, 90, 73,
+  88, 94, 74, 87, 79, 86, 96, 83, 89, 75,
+  83, 76, 84, 80, 81, 91, 83, 77, 85, 84,
+  78, 84, 86, 92, 86, 73, 90, 84, 99, 88,
+  83, 79, 85, 87, 92, 78, 91, 72, 96, 88,
+  75, 84, 89, 90, 74, 77, 91, 94, 87, 89,
+  83, 68, 80, 88, 84, 82, 92, 98, 89, 73,
+  85, 84, 95, 80, 88, 90, 83, 86, 83, 85,
+  86, 92, 75, 80, 67, 80, 79, 83, 93, 80,
+  81, 88, 68, 87, 84, 79, 88, 82, 77, 85,
+  75, 76, 85, 104, 88, 79, 83, 98, 83, 88,
+  90, 77, 83, 92, 73, 78, 87, 78, 101, 83,
+  77, 79, 76, 81, 80, 83, 87, 87, 74, 90,
+  79, 81, 67, 80, 73, 97, 86, 76, 94, 94,
+  82, 73, 93, 74, 96, 83, 91, 92, 87, 81,
+  90, 92, 73, 79, 79, 96, 82, 98, 78, 85,
+  77, 83, 83, 97, 91, 89, 90, 81, 108, 76,
+  88, 71, 71, 95, 69, 74, 77, 96, 52, 81,
+  72, 86, 87, 95, 84, 83, 95, 80, 79, 75,
+  92, 84, 72, 79, 94, 92, 86, 77, 85, 75,
+  96, 72, 87, 63, 86, 92, 74, 86, 77, 83,
+  86, 94, 81, 80, 73, 109, 84, 92, 77, 114,
+  73, 77, 79, 76, 72, 79, 87, 80, 85, 85,
+  89, 79, 90, 76, 93, 70, 78, 67, 95, 87,
+  78, 73, 81, 53, 87, 76, 97, 98, 89, 94,
+  88, 73, 76, 79, 73, 75, 77, 86, 87, 100,
+  68, 77, 91, 85, 91, 75, 94, 92, 67, 84,
+  111, 77, 76, 87, 86, 74, 86, 75, 78, 86,
+  58, 94, 84, 91, 88, 77, 83, 82, 69, 78,
+  86, 108, 75, 87, 103, 65, 101, 73, 103, 86,
+  68, 105, 86, 76, 81, 79, 59, 50, 81, 71,
+  83, 98, 74, 92, 117, 76, 85, 102, 63, 93,
+  94, 70, 85, 81, 80, 86, 69, 83, 113, 64,
+  117, 55, 95, 102, 83, 88, 81, 127, 85, 107,
+  77, 83, 67, 96, 64, 83, 82, 88, 81, 69,
+  85, 76, 97, 86, 75, 80, 86, 93, 66, 74,
+  88, 91, 108, 61, 77, 57, 84, 123, 78, 92,
+  101, 108, 71, 81, 83, 110, 127, 86, 79, 68,
+  66, 89, 53, 89, 80, 103, 75, 110, 65, 61,
+  88, 74, 78, 66, 86, 84, 48, 93, 88, 92,
+  81, 85, 86, 77, 87, 84, 94, 90, 76, 84,
+  78, 61, 84, 94, 77, 84, 81, 82, 81, 93,
+  90, 85, 83, 85, 99, 81, 88, 83, 79, 98,
+  62, 87, 71, 79, 74, 84, 77, 83, 83, 88,
+  81, 88, 94, 83, 84, 104, 91, 80, 82, 74,
+  90, 97, 86, 87, 78, 79, 90, 82, 90, 60,
+  78, 93, 79, 86, 55, 92, 88, 75, 99, 80,
+  78, 87, 78, 89, 81, 76, 89, 81, 83, 83,
+  63, 84, 84, 71, 83, 82, 86, 75, 89, 99,
+  94, 77, 88, 70, 93, 85, 88, 72, 73, 92,
+  83, 81, 96, 82, 86, 90, 86, 69, 77, 73,
+  75, 96, 68, 81, 88, 97, 69, 72, 81, 86,
+  99, 79, 88, 85, 71, 79, 90, 78, 85, 89,
+  87, 93, 92, 82, 81, 84, 79, 76, 87, 78,
+  81, 87, 73, 77, 70, 87, 76, 95, 81, 82,
+  98, 90, 97, 71, 97, 65, 78, 92, 75, 84,
+  115, 102, 55, 82, 86, 85, 93, 84, 90, 93,
+  100, 90, 96, 81, 93, 76, 75, 75, 86, 86,
+  90, 97, 79, 77, 79, 72, 81, 75, 87, 87,
+  69, 78, 56, 75, 80, 68, 109, 73, 84, 90,
+  92, 81, 76, 116, 79, 81, 73, 80, 79, 88,
+  89, 81, 92, 86, 82, 87, 83, 87, 95, 84,
+  79, 71, 87, 82, 70, 74, 69, 57, 88, 83,
+  100, 94, 79, 85, 91, 63, 85, 80, 69, 83,
+  68, 80, 66, 99, 75, 71, 84, 73, 92, 75,
+  85, 79, 69, 85, 102, 73, 78, 92, 76, 72,
+  104, 80, 67, 83, 81, 86, 86, 87, 79, 79,
+  67, 76, 60, 81, 85, 105, 74, 83, 97, 69,
+  97, 64, 93, 122, 72, 95, 88, 76, 135, 82,
+  83, 78, 83, 59, 128, 98, 86, 98, 126, 87,
+  76, 105, 75, 67, 90, 61, 76, 71, 89, 82,
+  68, 84, 99, 59, 76, 73, 107, 103, 81, 84,
+  55, 93, 72, 71, 85, 91, 99, 80, 75, 78,
+  81, 83, 72, 79, 76, 82, 96, 94, 75, 86,
+  83, 77, 67, 95, 76, 89, 127, 85, 67, 67,
+  74, 112, 82, 86, 80, 65, 76, 86, 86, 100,
+  83, 84, 84, 53, 98, 77, 53, 85, 83, 79,
+  74, 115, 72, 74, 92, 55, 79, 76, 79, 65,
+  59, 89, 82, 82, 96, 89, 84, 81, 91, 81,
+  84, 84, 79, 83, 83, 87, 82, 83, 72, 75,
+  73, 88, 74, 90, 97, 81, 76, 90, 90, 72,
+  89, 107, 86, 95, 76, 83, 83, 80, 77, 81,
+  76, 82, 91, 84, 75, 97, 90, 92, 84, 115,
+  97, 75, 76, 83, 85, 90, 86, 70, 78, 82,
+  76, 78, 84, 61, 84, 79, 73, 78, 63, 75,
+  87, 61, 85, 78, 81, 82, 81, 85, 74, 67,
+  72, 83, 77, 85, 84, 96, 91, 82, 83, 82,
+  84, 84, 80, 71, 96, 86, 79, 72, 87, 81,
+  103, 73, 67, 65, 85, 83, 100, 87, 78, 83,
+  83, 65, 110, 76, 74, 96, 72, 71, 103, 94,
+  71, 73, 85, 76, 100, 71, 84, 74, 75, 82,
+  67, 73, 75, 92, 86, 82, 84, 78, 93, 85,
+  91, 76, 90, 78, 86, 83, 70, 82, 96, 90,
+  82, 81, 95, 95, 80, 94, 80, 77, 83, 74,
+  88, 89, 83, 82, 89, 86, 79, 91, 83, 83,
+  83, 73, 61, 92, 83, 82, 85, 89, 89, 81,
+  82, 83, 82, 108, 86, 82, 93, 89, 75, 89,
+  85, 83, 85, 83, 85, 85, 85, 76, 80, 71,
+  90, 72, 91, 77, 85, 81, 86, 82, 87, 78,
+  79, 94, 78, 88, 95, 79, 93, 79, 85, 95,
+  75, 90, 80, 97, 86, 78, 82, 73, 77, 80,
+  71, 91, 98, 79, 96, 89, 78, 83, 80, 80,
+  89, 77, 86, 93, 78, 81, 63, 85, 91, 75,
+  85, 95, 81, 88, 74, 77, 84, 104, 76, 76,
+  77, 98, 87, 63, 85, 83, 91, 79, 101, 72,
+  91, 86, 83, 83, 70, 91, 102, 97, 73, 77,
+  77, 87, 81, 92, 88, 76, 78, 96, 83, 90,
+  83, 74, 94, 77, 86, 91, 86, 78, 103, 70,
+  72, 85, 83, 83, 72, 67, 91, 79, 82, 84,
+  87, 105, 80, 91, 90, 92, 69, 82, 80, 76,
+  99, 88, 80, 80, 89, 77, 74, 67, 75, 72,
+  96, 74, 79, 72, 82, 68, 91, 65, 80, 99,
+  81, 84, 100, 83, 91, 76, 92, 93, 73, 93,
+  88, 100, 83, 71, 90, 79, 84, 77, 66, 85,
+  99, 79, 106, 95, 64, 87, 90, 72, 105, 68,
+  83, 88, 98, 94, 68, 81, 80, 81, 85, 94,
+  94, 80, 75, 81, 84, 101, 67, 78, 84, 89,
+  80, 88, 82, 79, 96, 84, 92, 74, 89, 86,
+  88, 81, 72, 82, 100, 93, 64, 83, 83, 93,
+  79, 91, 82, 75, 80, 93, 90, 95, 88, 75,
+  81, 82, 86, 86, 79, 80, 85, 73, 76, 90,
+  79, 83, 74, 79, 90, 80, 83, 92, 83, 108,
+  85, 72, 93, 90, 69, 94, 85, 80, 84, 81,
+  83, 89, 87, 73, 82, 76, 63, 68, 90, 70,
+  86, 82, 87, 81, 78, 74, 81, 86, 88, 80,
+  98, 79, 92, 79, 84, 86, 71, 81, 80, 98,
+  79, 77, 80, 76, 94, 81, 77, 77, 99, 80,
+  101, 95, 82, 82, 79, 85, 101, 82, 86, 93,
+  82, 85, 85, 84, 90, 75, 98, 95, 74, 87,
+  76, 79, 85, 102, 78, 78, 75, 79, 78, 72,
+  78, 92, 92, 97, 93, 83, 89, 84, 75, 83,
+  105, 95, 95, 90, 99, 85, 79, 86, 83, 80,
+  89, 103, 95, 86, 99, 71, 76, 83, 84, 84,
+  83, 76, 92, 78, 86, 73, 88, 75, 84, 89,
+  84, 93, 82, 56, 96, 89, 93, 55, 74, 87,
+  89, 81, 79, 82, 94, 79, 87, 77, 70, 67,
+  80, 88, 92, 81, 78, 95, 88, 93, 80, 90,
+  76, 84, 84, 68, 90, 76, 74, 90, 95, 78,
+  93, 85, 76, 92, 90, 78, 60, 71, 93, 83,
+  89, 79, 88, 91, 81, 69, 67, 73, 70, 74,
+  85, 84, 99, 98, 90, 83, 91, 81, 76, 96,
+  90, 90, 82, 79, 109, 106, 60, 70, 82, 94,
+  90, 89, 71, 80, 76, 70, 78, 67, 66, 92,
+  90, 88, 92, 96, 96, 87, 77, 80, 122, 93,
+  81, 92, 90, 65, 68, 94, 78, 73, 96, 100,
+  97, 77, 107, 67, 61, 88, 80, 77, 87, 74,
+  91, 70, 82, 73, 97, 65, 96, 80, 81, 77,
+  80, 48, 99, 83, 79, 48, 69, 87, 98, 79,
+  75, 93, 94, 63, 87, 89, 52, 65, 77, 84,
+  87, 78, 70, 89, 82, 102, 84, 89, 82, 84,
+  89, 68, 80, 81, 64, 95, 90, 84, 80, 80,
+  69, 96, 91, 90, 66, 75, 92, 83, 90, 81,
+  76, 81, 80, 81, 66, 77, 70, 75, 89, 91,
+  106, 122, 89, 83, 91, 84, 81, 86, 70, 86,
+  76, 73, 98, 126, 40, 78, 68, 95, 85, 90,
+  72, 84, 88, 79, 78, 84, 82, 87, 91, 94,
+  83, 81, 81, 84, 81, 86, 101, 92, 94, 81,
+  90, 83, 75, 89, 85, 82, 89, 94, 90, 77,
+  92, 87, 78, 80, 89, 90, 84, 75, 87, 77,
+  91, 76, 99, 79, 92, 85, 85, 84, 84, 68,
+  96, 97, 92, 63, 87, 78, 84, 82, 80, 76,
+  92, 85, 85, 73, 77, 72, 79, 85, 91, 77,
+  93, 96, 87, 95, 82, 93, 76, 85, 95, 68,
+  100, 75, 84, 94, 94, 81, 82, 80, 82, 95,
+  87, 84, 63, 73, 90, 85, 93, 84, 79, 98,
+  86, 87, 66, 73, 71, 72, 78, 92, 99, 92,
+  87, 80, 90, 99, 77, 89, 69, 90, 82, 83,
+  93, 94, 72, 69, 80, 92, 88, 90, 84, 81,
+  77, 82, 86, 73, 84, 110, 100, 94, 88, 95,
+  97, 80, 79, 70, 120, 96, 89, 84, 90, 82,
+  81, 94, 82, 79, 90, 99, 97, 90, 95, 70,
+  65, 84, 100, 83, 87, 75, 86, 84, 83, 68,
+  84, 66, 84, 97, 103, 91, 75, 48, 100, 84,
+  93, 55, 70, 86, 85, 79, 82, 83, 85, 86,
+  75, 79, 64, 66, 79, 88, 89, 67, 84, 85,
+  82, 80, 86, 68, 68, 91, 71, 61, 82, 86,
+  74, 86, 85, 91, 95, 75, 89, 82, 93, 78,
+  58, 64, 89, 78, 77, 75, 110, 76, 82, 82,
+  72, 73, 66, 73, 94, 78, 101, 121, 88, 80,
+  91, 74, 84, 79, 88, 87, 73, 56, 94, 110,
+  46, 81, 75, 83, 93, 94, 91, 75, 85, 73,
+  88, 71, 72, 115, 91, 80, 81, 110, 114, 91,
+  75, 61, 143, 92, 78, 91, 81, 78, 73, 104,
+  70, 69, 98, 91, 98, 94, 109, 68, 37, 92,
+  93, 76, 98, 80, 96, 77, 78, 69, 88, 52,
+  91, 82, 110, 69, 75, 28, 106, 76, 74, 44,
+  71, 95, 103, 75, 71, 94, 93, 71, 71, 96,
+  51, 63, 76, 83, 77, 78, 76, 78, 71, 76,
+  89, 60, 74, 86, 70, 56, 64, 89, 60, 92,
+  80, 108, 78, 72, 77, 88, 91, 82, 55, 62,
+  92, 79, 70, 77, 86, 62, 81, 80, 68, 79,
+  61, 74, 94, 85, 107, 156, 83, 83, 99, 76,
+  86, 71, 74, 83, 68, 49, 91, 141, 0, 91,
+  59, 79, 88, 97, 73, 89, 96, 84, 82, 89,
+  87, 97, 95, 93, 85, 85, 91, 86, 83, 77,
+  104, 93, 86, 82, 88, 88, 76, 98, 89, 80,
+  87, 91, 93, 97, 84, 83, 69, 80, 94, 88,
+  88, 75, 92, 80, 87, 71, 88, 71, 87, 91,
+  104, 81, 79, 61, 98, 87, 98, 63, 79, 87,
+  86, 83, 78, 75, 91, 90, 71, 76, 67, 73,
+  88, 85, 82, 72, 79, 89, 84, 79, 89, 74,
+  70, 84, 72, 65, 96, 82, 84, 101, 83, 94,
+  76, 75, 90, 90, 89, 81, 58, 67, 78, 81,
+  80, 82, 82, 85, 86, 72, 68, 73, 66, 73,
+  91, 85, 100, 107, 76, 79, 89, 98, 79, 81,
+  78, 87, 76, 65, 84, 94, 60, 80, 79, 80,
+  87, 90, 69, 79, 81, 94, 79, 75, 86, 91,
+  101, 102, 86, 86, 87, 79, 86, 82, 93, 78,
+  89, 83, 88, 80, 75, 73, 86, 87, 78, 94,
+  84, 79, 77, 82, 91, 78, 99, 82, 85, 88,
+  77, 99, 98, 70, 95, 86, 86, 103, 80, 108,
+  75, 88, 85, 93, 91, 70, 73, 82, 73, 75,
+  87, 78, 84, 101, 83, 75, 88, 69, 84, 94,
+  84, 79, 95, 82, 98, 86, 80, 76, 75, 83,
+  87, 72, 93, 83, 90, 77, 90, 94, 92, 76,
+  80, 82, 94, 97, 56, 69, 85, 92, 83, 76,
+  104, 100, 82, 96, 86, 67, 79, 94, 83, 78,
+  79, 66, 80, 85, 90, 79, 82, 99, 83, 86,
+  74, 75, 88, 82, 74, 75, 109, 80, 97, 87,
+  79, 81, 88, 92, 82, 70, 86, 89, 106, 97,
+  78, 94, 102, 84, 87, 78, 99, 79, 90, 80,
+  84, 81, 73, 79, 85, 84, 86, 92, 86, 88,
+  79, 80, 89, 81, 90, 77, 92, 84, 85, 107,
+  89, 63, 84, 77, 90, 95, 100, 86, 70, 89,
+  89, 89, 93, 62, 71, 79, 79, 70, 84, 80,
+  88, 86, 83, 78, 69, 66, 90, 89, 74, 86,
+  80, 76, 90, 87, 80, 72, 77, 85, 87, 70,
+  88, 83, 97, 91, 87, 105, 84, 71, 85, 85,
+  104, 89, 56, 65, 76, 91, 74, 74, 90, 85,
+  84, 89, 79, 68, 65, 90, 90, 81, 76, 89,
+  75, 82, 88, 80, 83, 94, 80, 80, 75, 73,
+  88, 92, 59, 76, 106, 75, 89, 96, 65, 88,
+  96, 91, 77, 85, 87, 85, 97, 103, 85, 78,
+  85, 82, 89, 92, 84, 83, 85, 83, 96, 86,
+  83, 79, 94, 85, 74, 89, 84, 94, 71, 86,
+  94, 74, 90, 87, 88, 87, 85, 97, 99, 70,
+  82, 86, 88, 96, 81, 88, 78, 95, 82, 88,
+  93, 73, 74, 78, 75, 80, 85, 74, 88, 99,
+  78, 73, 85, 74, 96, 90, 79, 91, 82, 82,
+  97, 86, 86, 74, 78, 83, 78, 71, 101, 82,
+  98, 106, 88, 100, 80, 78, 81, 87, 91, 84,
+  58, 71, 73, 93, 82, 80, 87, 102, 83, 75,
+  79, 68, 81, 94, 87, 85, 76, 64, 76, 86,
+  91, 93, 85, 102, 91, 88, 76, 84, 80, 79,
+  83, 73, 109, 81, 93, 86, 78, 83, 76, 81,
+  84, 86, 69, 80, 84, 96, 84, 98, 85, 89,
+  82, 83, 82, 97, 70, 73, 88, 72, 85, 88,
+  85, 80, 93, 72, 97, 87, 98, 68, 65, 83,
+  84, 81, 84, 83, 89, 86, 80, 81, 77, 84,
+  96, 74, 82, 100, 76, 100, 84, 77, 87, 92,
+  91, 89, 77, 71, 86, 84, 88, 83, 73, 84,
+  84, 79, 93, 79, 77, 98, 79, 93, 88, 77,
+  88, 82, 74, 89, 84, 86, 79, 83, 101, 88,
+  87, 99, 94, 86, 89, 78, 88, 80, 68, 97,
+  86, 72, 78, 87, 84, 86, 92, 93, 83, 86,
+  82, 75, 93, 81, 78, 50, 92, 72, 86, 90,
+  78, 87, 84, 76, 88, 91, 90, 72, 74, 69,
+  84, 103, 76, 83, 82, 84, 76, 80, 87, 75,
+  68, 78, 88, 94, 83, 92, 92, 88, 88, 75,
+  85, 92, 67, 71, 84, 67, 77, 90, 94, 83,
+  91, 65, 86, 82, 95, 64, 61, 78, 86, 76,
+  85, 83, 89, 84, 83, 82, 85, 83, 100, 69,
+  87, 98, 77, 97, 83, 81, 86, 87, 92, 82,
+  76, 72, 82, 87, 89, 84, 72, 89, 75, 82,
+  94, 87, 80, 92, 77, 96, 86, 69, 92, 74,
+  71, 88, 85, 90, 80, 81, 104, 87, 92, 102,
+  91, 81, 87, 77, 86, 74, 64, 95, 81, 72,
+  76, 86, 84, 89, 85, 97, 81, 84, 81, 77,
+  96, 81, 75, 38, 95, 70, 86, 93, 76, 87,
+  79, 74, 88, 89, 89, 64, 64, 68, 87, 105,
+  79, 84, 81, 85, 82, 74, 85, 82, 78, 81,
+  80, 93, 86, 95, 79, 84, 84, 83, 85, 94,
+  72, 78, 71, 72, 102, 90, 93, 82, 95, 75,
+  78, 82, 95, 61, 65, 73, 89, 81, 81, 77,
+  85, 81, 82, 78, 92, 82, 90, 75, 80, 89,
+  81, 92, 83, 85, 90, 86, 88, 79, 78, 77,
+  92, 87, 84, 80, 75, 85, 91, 80, 101, 81,
+  72, 89, 82, 91, 89, 82, 86, 83, 78, 99,
+  94, 84, 80, 80, 92, 84, 87, 89, 89, 87,
+  85, 77, 83, 88, 76, 91, 83, 76, 76, 90,
+  71, 83, 87, 97, 82, 87, 85, 73, 97, 83,
+  81, 59, 95, 76, 83, 97, 84, 83, 82, 74,
+  88, 92, 88, 75, 73, 69, 85, 103, 74, 83,
+  70, 85, 77, 79, 87, 90, 84, 78, 82, 85,
+  91, 95, 86, 88, 96, 82, 88, 83, 55, 74,
+  89, 67, 85, 93, 84, 82, 92, 60, 105, 86,
+  102, 60, 65, 74, 87, 73, 82, 75, 87, 97,
+  97, 79, 73, 88, 86, 76, 75, 90, 80, 99,
+  85, 81, 89, 76, 91, 93, 79, 77, 86, 88,
+  89, 85, 78, 84, 83, 77, 98, 76, 78, 88,
+  85, 85, 89, 74, 84, 75, 76, 88, 85, 85,
+  83, 78, 99, 81, 86, 89, 95, 89, 101, 85,
+  79, 107, 79, 90, 77, 75, 68, 86, 80, 76,
+  83, 86, 75, 88, 74, 58, 98, 86, 78, 60,
+  93, 79, 79, 89, 78, 73, 82, 67, 88, 91,
+  87, 72, 59, 79, 80, 103, 70, 83, 71, 87,
+  82, 77, 87, 73, 83, 81, 85, 82, 95, 92,
+  92, 89, 97, 77, 93, 75, 53, 69, 85, 62,
+  81, 97, 93, 81, 90, 52, 103, 88, 100, 55,
+  65, 73, 88, 71, 81, 76, 87, 93, 99, 70,
+  80, 85, 84, 75, 76, 90, 84, 96, 85, 85,
+  90, 65, 86, 80, 80, 73, 78, 92, 89, 89,
+  80, 87, 66, 73, 105, 82, 80, 77, 74, 82,
+  93, 70, 87, 63, 76, 91, 84, 89, 80, 75,
+  101, 85, 86, 96, 88, 87, 97, 84, 81, 99,
+  65, 86, 69, 76, 64, 88, 76, 82, 70, 88,
+  72, 88, 75, 59, 98, 86, 72, 55, 96, 76,
+  82, 95, 80, 77, 81, 59, 87, 92, 83, 70,
+  53, 83, 81, 105, 74, 84, 72, 92, 89, 73,
+  86, 81, 87, 82, 80, 89, 91, 93, 82, 85,
+  92, 79, 90, 79, 60, 75, 76, 72, 107, 92,
+  94, 80, 91, 65, 100, 82, 101, 55, 63, 71,
+  85, 77, 79, 72, 85, 95, 104, 76, 85, 89,
+  75, 81, 75, 87, 83, 94, 83, 88, 92, 71,
+  87, 78, 82, 82, 90, 93, 88, 81, 84, 83,
+  83, 74, 106, 76, 76, 86, 82, 82, 89, 89,
+  85, 79, 79, 97, 89, 84, 80, 77, 89, 83,
+  84, 81, 81, 94, 99, 89, 77, 117, 86, 84,
+  75, 80, 65, 89, 68, 75, 82, 83, 74, 89,
+  80, 61, 97, 87, 80, 74, 91, 83, 78, 102,
+  90, 68, 83, 71, 93, 94, 80, 80, 67, 79,
+  83, 99, 71, 86, 80, 83, 85, 72, 94, 99,
+  80, 74, 71, 84, 84, 93, 80, 91, 89, 98,
+  88, 84, 66, 80, 89, 84, 110, 87, 84, 83,
+  84, 73, 85, 83, 103, 86, 69, 74, 85, 73,
+  86, 67, 78, 106, 96, 62, 76, 89, 70, 81,
+  80, 80, 79, 104, 75, 84, 95, 73, 104, 85,
+  81, 85, 89, 88, 89, 75, 97, 75, 75, 81,
+  99, 78, 78, 90, 92, 92, 77, 91, 80, 84,
+  89, 84, 76, 80, 91, 79, 80, 91, 83, 76,
+  91, 91, 92, 85, 78, 125, 90, 84, 79, 78,
+  72, 83, 75, 68, 79, 86, 78, 90, 92, 63,
+  94, 86, 87, 85, 85, 76, 75, 86, 82, 68,
+  81, 80, 92, 92, 80, 83, 79, 79, 90, 91,
+  72, 84, 79, 84, 89, 66, 86, 90, 82, 76,
+  77, 86, 86, 92, 78, 90, 88, 97, 87, 74,
+  64, 78, 90, 84, 118, 87, 82, 81, 78, 67,
+  84, 83, 102, 82, 73, 73, 81, 77, 90, 71,
+  75, 105, 102, 58, 83, 87, 69, 79, 77, 81,
+  82, 106, 78, 88, 99, 67, 100, 88, 84, 83,
+  88, 94, 89, 74, 102, 82, 71, 75, 98, 86,
+  72, 91, 86, 93, 80, 103, 78, 88, 94, 89,
+  76, 83, 90, 74, 72, 85, 80, 73, 85, 99,
+  91, 80, 81, 135, 93, 81, 74, 80, 68, 84,
+  74, 76, 82, 92, 74, 89, 102, 65, 89, 89,
+  85, 92, 83, 73, 71, 87, 88, 66, 86, 86,
+  101, 99, 75, 86, 75, 81, 95, 92, 73, 83,
+  89, 85, 82, 70, 88, 97, 88, 78, 75, 90,
+  85, 92, 76, 90, 87, 98, 87, 79, 72, 81,
+  88, 92, 121, 88, 82, 85, 86, 74, 93, 78,
+  98, 92, 72, 74, 81, 85, 90, 70, 82, 104,
+  102, 64, 88, 92, 69, 87, 79, 82, 81, 101,
+  82, 86, 98, 73, 106, 88, 84, 96, 93, 92,
+  87, 75, 102, 76, 72, 78, 92, 81, 74, 82,
+  90, 91, 79, 109, 80, 95, 89, 94, 80, 81,
+  91, 79, 69, 75, 81, 69, 81, 96, 92, 86,
+  76, 135, 102, 77, 77, 85, 70, 90, 77, 71,
+  80, 93, 80, 88, 101, 65, 87, 88, 94, 100,
+  87, 78, 71, 90, 85, 58, 84, 90, 98, 99,
+  83, 87, 87, 86, 94, 84, 72, 90, 86, 77,
+  80, 67, 87, 93, 91, 77, 67, 60, 93, 85,
+  86, 89, 74, 82, 87, 99, 84, 89, 88, 103,
+  86, 76, 89, 88, 79, 115, 92, 85, 84, 83,
+  81, 88, 81, 73, 86, 83, 79, 88, 76, 79,
+  90, 86, 82, 76, 88, 79, 80, 87, 87, 83,
+  61, 75, 87, 83, 73, 93, 81, 83, 88, 85,
+  80, 78, 90, 77, 75, 89, 89, 83, 72, 81,
+  89, 84, 84, 74, 74, 70, 85, 90, 81, 78,
+  76, 91, 94, 71, 79, 89, 85, 88, 83, 84,
+  71, 88, 80, 93, 77, 80, 90, 99, 80, 84,
+  84, 79, 88, 87, 79, 93, 86, 100, 87, 85,
+  105, 82, 95, 76, 83, 155, 93, 87, 96, 95,
+  81, 93, 97, 78, 88, 86, 84, 84, 73, 71,
+  86, 75, 94, 76, 72, 54, 99, 84, 89, 79,
+  74, 79, 91, 91, 72, 90, 92, 95, 82, 94,
+  92, 86, 82, 109, 89, 85, 85, 85, 86, 81,
+  82, 73, 82, 89, 81, 83, 77, 79, 90, 83,
+  84, 79, 95, 70, 83, 83, 92, 78, 61, 78,
+  89, 82, 75, 90, 82, 81, 90, 84, 81, 77,
+  75, 81, 78, 88, 94, 80, 72, 79, 82, 80,
+  92, 70, 71, 77, 83, 91, 82, 85, 79, 76,
+  82, 71, 74, 85, 89, 93, 84, 87, 63, 89,
+  74, 103, 77, 77, 93, 101, 78, 83, 72, 81,
+  77, 88, 76, 92, 94, 108, 88, 80, 109, 75,
+  93, 75, 71, 160, 80, 85, 92, 93, 77, 91,
+  91, 78, 71, 88, 87, 94, 79, 72, 84, 79,
+  89, 76, 71, 68, 88, 84, 81, 83, 77, 85,
+  89, 93, 85, 90, 87, 97, 93, 78, 88, 92,
+  85, 113, 93, 80, 82, 83, 82, 77, 87, 91,
+  86, 89, 85, 88, 78, 83, 87, 87, 85, 79,
+  86, 78, 80, 86, 92, 81, 62, 78, 87, 90,
+  78, 92, 83, 81, 80, 82, 79, 68, 101, 72,
+  79, 88, 84, 84, 97, 78, 88, 83, 88, 77,
+  75, 86, 85, 91, 86, 75, 73, 82, 93, 74,
+  82, 85, 86, 89, 81, 87, 69, 86, 83, 95,
+  78, 82, 85, 97, 82, 84, 85, 78, 85, 92,
+  76, 93, 84, 93, 89, 83, 99, 80, 89, 73,
+  74, 135, 88, 88, 83, 94, 85, 91, 91, 72,
+  90, 87, 83, 79, 74, 79, 79, 90, 91, 82,
+  73, 62, 95, 85, 83, 88, 78, 77, 85, 87,
+  68, 89, 91, 92, 89, 79, 90, 83, 79, 109,
+  86, 81, 81, 84, 85, 87, 77, 75, 87, 82,
+  84, 85, 87, 79, 86, 80, 81, 78, 93, 84,
+  83, 90, 92, 79, 65, 72, 87, 80, 78, 86,
+  84, 82, 95, 89, 86, 79, 78, 79, 82, 86,
+  87, 71, 72, 81, 82, 88, 85, 69, 80, 76,
+  80, 94, 81, 80, 78, 87, 79, 75, 81, 85,
+  80, 85, 84, 84, 75, 88, 79, 92, 74, 76,
+  85, 99, 84, 87, 70, 80, 68, 78, 86, 89,
+  90, 97, 83, 83, 116, 81, 82, 79, 78, 156,
+  78, 87, 99, 95, 82, 92, 97, 76, 73, 86,
+  85, 83, 72, 85, 74, 77, 94, 81, 81, 60,
+  100, 82, 89, 83, 78, 72, 91, 86, 58, 87,
+  93, 92, 82, 93, 95, 77, 76, 100, 81, 83,
+  84, 93, 90, 84, 79, 76, 88, 80, 85, 77,
+  87, 84, 90, 79, 85, 83, 98, 78, 85, 88,
+  95, 81, 64, 70, 89, 78, 81, 82, 88, 76,
+  100, 88, 87, 78, 66, 88, 86, 87, 95, 69,
+  68, 81, 78, 83, 89, 63, 80, 86, 75, 96,
+  79, 85, 81, 80, 73, 80, 77, 84, 80, 91,
+  84, 83, 68, 89, 77, 98, 74, 75, 91, 99,
+  86, 81, 62, 81, 62, 80, 92, 89, 89, 101,
+  84, 82, 120, 79, 81, 81, 70, 162, 67, 85,
+  89, 94, 75, 87, 84, 71, 59, 86, 88, 96,
+  80, 82, 82, 84, 88, 79, 76, 68, 89, 84,
+  81, 82, 75, 81, 87, 85, 72, 82, 83, 91,
+  95, 81, 90, 87, 82, 111, 85, 78, 84, 87,
+  84, 80, 79, 85, 86, 93, 84, 83, 87, 82,
+  86, 86, 84, 81, 91, 83, 84, 86, 91, 84,
+  62, 75, 85, 84, 80, 87, 86, 78, 90, 85,
+  81, 72, 79, 76, 84, 85, 87, 75, 83, 79,
+  80, 87, 88, 76, 78, 90, 83, 93, 86, 74,
+  75, 88, 83, 80, 78, 84, 79, 87, 81, 86,
+  72, 88, 80, 85, 77, 78, 87, 96, 84, 75,
+  71, 78, 68, 82, 83, 90, 94, 90, 87, 82,
+  109, 82, 82, 80, 78, 136, 80, 85, 89, 93,
+  82, 94, 91, 74, 80, 89, 84, 81, 79, 81,
+  77, 91, 88, 78, 77, 75, 83, 89, 85, 88,
+  70, 78, 90, 86, 84, 87, 88, 96, 85, 71,
+  90, 83, 75, 116, 88, 77, 80, 85, 82, 82,
+  72, 74, 82, 90, 88, 88, 89, 81, 79, 83,
+  78, 82, 90, 86, 79, 89, 89, 76, 68, 70,
+  87, 83, 76, 83, 85, 86, 92, 89, 87, 82,
+  89, 74, 85, 83, 83, 79, 79, 81, 91, 83,
+  80, 70, 74, 78, 77, 87, 85, 82, 75, 90,
+  83, 73, 78, 85, 87, 84, 83, 87, 79, 85,
+  83, 81, 74, 78, 81, 99, 81, 90, 78, 77,
+  65, 79, 83, 93, 90, 89, 81, 88, 100, 84,
+  82, 77, 80, 139, 81, 83, 89, 88, 83, 94,
+  105, 81, 93, 87, 82, 85, 78, 87, 76, 77,
+  92, 80, 81, 73, 87, 85, 95, 84, 70, 77,
+  97, 85, 77, 86, 89, 93, 83, 76, 94, 78,
+  71, 111, 83, 81, 86, 86, 81, 80, 75, 78,
+  86, 81, 90, 80, 91, 86, 84, 86, 79, 83,
+  92, 81, 84, 87, 87, 77, 62, 72, 88, 81,
+  76, 81, 93, 83, 94, 90, 89, 84, 73, 80,
+  85, 83, 91, 77, 70, 81, 89, 82, 83, 63,
+  74, 82, 80, 88, 82, 88, 77, 83, 81, 80,
+  78, 86, 88, 82, 79, 90, 82, 92, 79, 89,
+  73, 75, 89, 99, 79, 77, 72, 77, 63, 78,
+  85, 91, 83, 89, 80, 88, 104, 82, 81, 80,
+  74, 142, 77, 81, 86, 89, 80, 90, 97, 75,
+  85, 86, 88, 95, 84, 84, 80, 84, 85, 79,
+  80, 80, 83, 88, 83, 85, 70, 80, 89, 81,
+  86, 80, 78, 92, 92, 75, 85, 87, 75, 112,
+  86, 75, 84, 81, 76, 77, 74, 83, 85, 97,
+  85, 88, 89, 82, 82, 89, 83, 83, 88, 82,
+  79, 84, 89, 85, 63, 74, 85, 81, 74, 84,
+  87, 83, 91, 81, 82, 73, 86, 73, 84, 80,
+  83, 77, 82, 81, 84, 83, 80, 73, 76, 83,
+  83, 90, 86, 79, 74, 82, 83, 77, 82, 83,
+  87, 88, 80, 88, 74, 89, 83, 76, 78, 81,
+  83, 95, 78, 75, 74, 76, 66, 78, 82, 90,
+  89, 85, 82, 87, 95, 83, 83, 82, 83, 123,
+  82, 84, 94, 88, 78, 94, 97, 81, 97, 88,
+  91, 91, 92, 80, 82, 70, 78, 66, 93, 86,
+  77, 93, 120, 103, 77, 83, 73, 65, 85, 95,
+  98, 64, 82, 95, 85, 85, 85, 87, 103, 83,
+  102, 100, 67, 76, 103, 103, 81, 82, 87, 88,
+  83, 92, 89, 90, 86, 111, 86, 92, 70, 83,
+  94, 89, 97, 73, 82, 71, 63, 64, 89, 89,
+  86, 72, 82, 90, 78, 66, 67, 74, 71, 76,
+  108, 93, 73, 81, 91, 64, 80, 108, 78, 84,
+  86, 87, 104, 78, 87, 86, 84, 91, 92, 79,
+  71, 86, 87, 103, 75, 86, 81, 93, 74, 61,
+  87, 93, 90, 84, 83, 84, 70, 91, 79, 85,
+  95, 91, 74, 98, 85, 102, 73, 88, 81, 75,
+  90, 87, 82, 74, 83, 80, 89, 92, 69, 57,
+  92, 86, 69, 104, 77, 97, 84, 95, 77, 72,
+  61, 92, 66, 84, 77, 67, 90, 83, 62, 76,
+  105, 100, 67, 92, 80, 81, 111, 89, 77, 81,
+  66, 79, 71, 110, 74, 90, 65, 82, 90, 72,
+  66, 68, 85, 96, 90, 106, 96, 70, 78, 86,
+  78, 72, 89, 75, 115, 72, 71, 87, 85, 88,
+  93, 58, 76, 72, 52, 80, 92, 88, 54, 81,
+  92, 86, 79, 94, 62, 96, 74, 70, 93, 81,
+  87, 90, 64, 80, 84, 99, 70, 81, 95, 90,
+  77, 85, 114, 75, 81, 78, 79, 77, 80, 88,
+  91, 84, 93, 84, 101, 70, 75, 64, 88, 94,
+  77, 91, 66, 97, 123, 82, 82, 75, 81, 84,
+  91, 92, 83, 91, 79, 77, 80, 63, 89, 72,
+  79, 76, 75, 92, 91, 75, 89, 75, 68, 79,
+  83, 89, 89, 90, 93, 81, 37, 72, 91, 81,
+  82, 97, 82, 79, 68, 87, 77, 82, 91, 95,
+  70, 98, 89, 85, 93, 94, 90, 64, 87, 83,
+  91, 78, 97, 91, 100, 89, 70, 85, 73, 93,
+  82, 98, 118, 88, 87, 80, 76, 99, 81, 72,
+  73, 106, 87, 89, 103, 75, 77, 72, 111, 87,
+  80, 93, 71, 75, 87, 83, 95, 93, 84, 73,
+  94, 86, 83, 70, 86, 89, 115, 86, 85, 92,
+  100, 77, 73, 88, 90, 99, 86, 83, 83, 91,
+  98, 81, 98, 85, 81, 78, 74, 68, 84, 77,
+  78, 91, 74, 83, 88, 76, 88, 81, 87, 98,
+  84, 91, 79, 81, 79, 87, 91, 78, 85, 66,
+  77, 65, 93, 86, 82, 87, 114, 106, 73, 83,
+  73, 65, 84, 97, 94, 62, 83, 96, 80, 87,
+  79, 89, 80, 81, 88, 88, 71, 74, 98, 100,
+  72, 80, 83, 90, 85, 77, 90, 84, 83, 107,
+  80, 80, 75, 94, 89, 83, 91, 75, 80, 75,
+  71, 67, 87, 90, 83, 66, 72, 86, 73, 68,
+  76, 74, 75, 84, 78, 89, 70, 82, 88, 68,
+  76, 110, 71, 84, 89, 83, 109, 85, 83, 90,
+  80, 91, 75, 73, 81, 79, 94, 98, 66, 85,
+  87, 91, 90, 64, 86, 70, 85, 84, 86, 89,
+  84, 83, 78, 84, 79, 87, 72, 96, 73, 85,
+  92, 83, 67, 72, 76, 87, 77, 71, 84, 79,
+  79, 91, 60, 63, 69, 86, 70, 94, 72, 94,
+  91, 91, 80, 75, 60, 77, 62, 81, 79, 74,
+  85, 87, 71, 74, 85, 99, 59, 90, 75, 78,
+  103, 78, 76, 75, 57, 81, 55, 103, 67, 93,
+  69, 74, 82, 70, 62, 65, 88, 90, 82, 83,
+  88, 70, 88, 82, 82, 75, 84, 71, 131, 70,
+  76, 94, 88, 75, 93, 67, 62, 82, 59, 79,
+  88, 79, 65, 74, 93, 90, 82, 98, 63, 97,
+  70, 63, 91, 75, 84, 82, 72, 81, 86, 92,
+  69, 86, 91, 94, 71, 80, 118, 75, 89, 78,
+  93, 79, 77, 75, 90, 86, 99, 94, 110, 78,
+  79, 65, 75, 94, 79, 82, 61, 74, 127, 80,
+  82, 78, 78, 83, 79, 92, 74, 90, 78, 77,
+  84, 83, 87, 69, 91, 66, 87, 84, 89, 67,
+  79, 84, 85, 85, 86, 80, 89, 87, 90, 80,
+  57, 76, 77, 79, 85, 98, 84, 76, 79, 71,
+  88, 88, 91, 88, 72, 93, 88, 85, 91, 91,
+  77, 73, 90, 95, 83, 80, 93, 72, 93, 84,
+  75, 85, 77, 85, 75, 95, 113, 86, 85, 85,
+  79, 90, 86, 78, 72, 108, 79, 74, 93, 75,
+  88, 81, 96, 95, 85, 78, 81, 75, 95, 78,
+  87, 90, 93, 74, 100, 88, 81, 71, 101, 97,
+  98, 81, 83, 93, 85, 82, 79, 87, 96, 93,
+  86, 79, 81, 93, 91, 81, 100, 88, 94, 82,
+  85, 71, 80, 68, 90, 90, 52, 79, 91, 87,
+  86, 83, 89, 87, 77, 92, 79, 93, 74, 103,
+  100, 81, 89, 82, 84, 67, 82, 87, 80, 88,
+  104, 110, 62, 74, 73, 64, 81, 94, 100, 75,
+  88, 94, 78, 75, 85, 93, 95, 95, 84, 88,
+  73, 71, 91, 99, 89, 83, 83, 89, 97, 78,
+  91, 84, 80, 108, 67, 80, 81, 91, 96, 86,
+  91, 73, 82, 78, 76, 64, 80, 83, 92, 70,
+  77, 87, 78, 66, 79, 77, 82, 81, 74, 84,
+  75, 81, 89, 70, 78, 107, 73, 87, 87, 90,
+  105, 94, 80, 94, 80, 87, 79, 81, 87, 73,
+  91, 86, 67, 84, 91, 86, 105, 77, 84, 75,
+  90, 81, 88, 92, 88, 84, 82, 81, 69, 91,
+  76, 96, 84, 71, 97, 80, 75, 75, 80, 80,
+  71, 75, 89, 76, 83, 87, 71, 68, 63, 83,
+  74, 106, 79, 97, 90, 87, 74, 73, 53, 80,
+  65, 83, 76, 74, 83, 76, 99, 79, 79, 89,
+  64, 93, 77, 77, 103, 92, 78, 86, 68, 82,
+  53, 102, 82, 91, 74, 73, 85, 73, 61, 72,
+  84, 100, 77, 89, 92, 65, 95, 80, 89, 73,
+  83, 75, 125, 77, 72, 93, 93, 71, 97, 64,
+  66, 78, 72, 81, 89, 72, 92, 78, 99, 93,
+  83, 99, 69, 94, 77, 66, 97, 87, 85, 81,
+  80, 82, 97, 85, 71, 86, 86, 97, 77, 81,
+  117, 81, 90, 84, 103, 78, 82, 78, 87, 87,
+  95, 80, 108, 79, 83, 69, 72, 88, 79, 78,
+  73, 76, 110, 84, 89, 85, 83, 83, 78, 93,
+  76, 94, 84, 80, 86, 81, 82, 73, 94, 87,
+  94, 84, 81, 71, 72, 78, 76, 84, 94, 81,
+  79, 90, 83, 77, 90, 80, 81, 81, 86, 98,
+  81, 73, 59, 91, 81, 87, 90, 83, 70, 83,
+  85, 80, 86, 87, 73, 83, 85, 97, 85, 87,
+  90, 80, 97, 78, 80, 91, 73, 83, 78, 82,
+  105, 90, 80, 73, 77, 87, 84, 74, 71, 104,
+  77, 76, 81, 83, 86, 84, 95, 97, 89, 89,
+  85, 78, 93, 77, 94, 93, 84, 86, 98, 81,
+  93, 74, 91, 77, 89, 82, 91, 89, 86, 89,
+  85, 92, 94, 83, 91, 80, 81, 95, 80, 70,
+  103, 88, 98, 78, 98, 69, 78, 71, 91, 99,
+  74, 82, 93, 93, 85, 81, 77, 91, 70, 97,
+  79, 88, 85, 88, 104, 85, 79, 83, 80, 84,
+  90, 82, 79, 87, 73, 87, 82, 82, 81, 83,
+  83, 95, 77, 77, 89, 81, 95, 78, 76, 79,
+  86, 85, 86, 85, 76, 80, 76, 93, 99, 92,
+  87, 78, 92, 78, 87, 78, 77, 72, 92, 82,
+  78, 81, 85, 78, 94, 92, 91, 79, 83, 78,
+  79, 84, 86, 80, 78, 80, 86, 81, 86, 84,
+  83, 85, 82, 84, 74, 67, 83, 78, 84, 75,
+  83, 83, 75, 88, 76, 79, 90, 79, 88, 82,
+  84, 86, 80, 77, 69, 81, 90, 81, 75, 88,
+  71, 80, 84, 85, 83, 83, 83, 83, 79, 87,
+  79, 86, 92, 79, 88, 85, 88, 79, 85, 86,
+  83, 78, 90, 87, 80, 86, 87, 92, 86, 76,
+  74, 93, 91, 82, 78, 87, 97, 77, 99, 80,
+  79, 78, 78, 78, 85, 88, 83, 76, 89, 86,
+  98, 80, 87, 90, 75, 88, 79, 78, 80, 81,
+  71, 65, 84, 77, 79, 84, 78, 85, 78, 114,
+  82, 81, 86, 82, 82, 92, 85, 80, 69, 93,
+  82, 92, 106, 89, 91, 85, 87, 74, 88, 89,
+  75, 86, 67, 83, 86, 83, 90, 79, 88, 72,
+  88, 83, 88, 92, 84, 92, 75, 82, 71, 91,
+  82, 93, 82, 83, 81, 71, 85, 73, 86, 83,
+  89, 76, 82, 81, 72, 85, 74, 91, 76, 82,
+  76, 79, 75, 80, 84, 77, 89, 87, 80, 85,
+  99, 82, 81, 88, 78, 66, 89, 79, 76, 79,
+  78, 80, 90, 80, 102, 93, 77, 80, 84, 84,
+  77, 83, 81, 86, 80, 81, 86, 80, 77, 85,
+  72, 79, 81, 86, 83, 83, 81, 80, 85, 79,
+  78, 79, 81, 77, 75, 79, 87, 76, 81, 81,
+  75, 93, 82, 80, 91, 86, 84, 81, 85, 77,
+  78, 74, 76, 71, 83, 70, 76, 82, 83, 73,
+  91, 90, 90, 93, 85, 79, 80, 87, 85, 84,
+  74, 81, 86, 81, 83, 84, 83, 87, 88, 83,
+  66, 70, 84, 79, 82, 86, 88, 77, 74, 88,
+  79, 85, 87, 79, 81, 86, 83, 88, 87, 78,
+  69, 76, 93, 77, 77, 89, 95, 76, 85, 82,
+  80, 80, 86, 82, 82, 86, 86, 82, 83, 82,
+  90, 90, 81, 80, 72, 83, 80, 76, 69, 87,
+  81, 87, 82, 92, 83, 78, 77, 95, 93, 83,
+  86, 75, 89, 82, 97, 77, 77, 83, 74, 82,
+  82, 84, 84, 88, 92, 83, 77, 69, 89, 83,
+  90, 95, 84, 79, 102, 78, 76, 75, 80, 73,
+  72, 87, 84, 84, 80, 100, 79, 77, 96, 83,
+  79, 74, 80, 80, 79, 81, 82, 92, 99, 93,
+  106, 78, 85, 83, 85, 75, 86, 74, 87, 77,
+  96, 85, 88, 75, 81, 93, 80, 86, 88, 81,
+  78, 80, 79, 71, 94, 81, 86, 77, 83, 73,
+  84, 75, 83, 77, 106, 82, 80, 90, 81, 86,
+  80, 88, 80, 92, 75, 84, 83, 82, 80, 85,
+  85, 88, 80, 86, 75, 80, 89, 81, 84, 76,
+  94, 61, 80, 81, 73, 93, 84, 80, 76, 87,
+  86, 77, 81, 79, 72, 87, 82, 82, 85, 82,
+  113, 88, 111, 78, 84, 80, 77, 76, 84, 93,
+  90, 90, 120, 80, 105, 76, 81, 93, 78, 101,
+  98, 82, 212, 84, 68, 70, 107, 83, 70, 78,
+  77, 85, 71, 141, 79, 75, 96, 89, 87, 106,
+  77, 79, 81, 102, 80, 101, 109, 96, 120, 78,
+  95, 92, 98, 86, 80, 82, 84, 72, 87, 94,
+  95, 75, 87, 79, 87, 101, 115, 99, 80, 113,
+  82, 79, 97, 83, 95, 83, 92, 74, 87, 73,
+  80, 76, 120, 84, 96, 83, 105, 87, 84, 95,
+  90, 96, 82, 86, 80, 69, 76, 85, 87, 93,
+  96, 91, 80, 85, 95, 87, 80, 81, 85, 55,
+  89, 77, 68, 98, 77, 88, 83, 81, 88, 77,
+  83, 96, 73, 74, 70, 78, 86, 83, 87, 77,
+  93, 75, 76, 76, 70, 73, 83, 85, 82, 87,
+  94, 68, 91, 72, 70, 79, 81, 90, 83, 78,
+  109, 77, 73, 74, 81, 81, 76, 69, 79, 81,
+  79, 101, 77, 76, 83, 79, 75, 73, 71, 66,
+  80, 83, 81, 88, 96, 91, 105, 79, 88, 90,
+  85, 74, 84, 76, 84, 71, 92, 86, 87, 74,
+  77, 96, 85, 89, 85, 82, 78, 88, 78, 75,
+  95, 76, 89, 77, 80, 77, 82, 81, 72, 84,
+  106, 84, 84, 82, 84, 80, 80, 83, 82, 90,
+  89, 80, 88, 62, 75, 82, 83, 87, 81, 85,
+  81, 77, 80, 81, 84, 81, 88, 64, 74, 79,
+  68, 94, 70, 84, 80, 86, 82, 77, 80, 82,
+  89, 93, 86, 83, 81, 76, 79, 78, 77, 79,
+  82, 83, 82, 80, 82, 81, 87, 86, 75, 95,
+  74, 79, 87, 78, 84, 80, 73, 82, 83, 81,
+  80, 78, 75, 79, 75, 99, 85, 82, 89, 78,
+  78, 78, 97, 76, 88, 67, 79, 93, 79, 83,
+  76, 77, 79, 86, 81, 86, 78, 74, 75, 82,
+  83, 76, 77, 77, 93, 75, 82, 91, 82, 87,
+  90, 88, 86, 73, 90, 81, 81, 73, 85, 84,
+  75, 80, 70, 73, 86, 88, 85, 82, 81, 77,
+  79, 83, 70, 87, 87, 88, 77, 86, 74, 70,
+  81, 96, 85, 88, 89, 87, 84, 82, 79, 75,
+  87, 78, 86, 84, 74, 85, 81, 84, 78, 86,
+  78, 84, 73, 89, 85, 80, 87, 82, 77, 80,
+  87, 81, 79, 83, 93, 70, 94, 78, 83, 76,
+  78, 75, 86, 88, 87, 81, 91, 84, 95, 88,
+  83, 84, 69, 83, 77, 81, 105, 77, 61, 66,
+  88, 80, 69, 85, 78, 79, 78, 113, 72, 77,
+  82, 86, 79, 83, 77, 86, 71, 93, 69, 93,
+  86, 85, 90, 79, 84, 81, 79, 86, 75, 81,
+  68, 77, 90, 77, 84, 79, 85, 86, 95, 95,
+  95, 88, 82, 98, 75, 82, 77, 87, 79, 82,
+  81, 77, 79, 85, 82, 77, 93, 80, 82, 73,
+  82, 83, 76, 91, 81, 89, 72, 82, 83, 83,
+  73, 84, 83, 83, 91, 86, 73, 78, 91, 79,
+  78, 82, 73, 70, 83, 80, 73, 85, 69, 80,
+  76, 80, 96, 71, 79, 87, 84, 77, 81, 83,
+  83, 82, 81, 73, 76, 76, 78, 78, 72, 84,
+  83, 84, 81, 90, 78, 81, 92, 79, 72, 74,
+  76, 76, 74, 80, 105, 78, 77, 77, 78, 87,
+  78, 79, 79, 80, 77, 86, 74, 74, 76, 74,
+  82, 67, 73, 70, 79, 80, 75, 75, 79, 86,
+  79, 74, 80, 83, 69, 83, 82, 80, 76, 76,
+  91, 76, 88, 88, 77, 97, 83, 90, 76, 77,
+  81, 83, 80, 85, 79, 77, 76, 78, 72, 89,
+  83, 93, 79, 87, 85, 78, 82, 74, 70, 82,
+  89, 85, 82, 87, 82, 71, 84, 80, 82, 85,
+  92, 87, 83, 82, 80, 72, 83, 80, 87, 84,
+  79, 88, 83, 82, 74, 89, 64, 86, 71, 87,
+  81, 80, 85, 84, 85, 82, 62, 81, 91, 80,
+  85, 83, 72, 85, 90, 70, 71, 97, 78, 73,
+  89, 89, 84, 80, 88, 81, 82, 82, 80, 79,
+  81, 83, 99, 94, 98, 88, 76, 74, 84, 91,
+  95, 77, 92, 69, 98, 119, 78, 80, 100, 75,
+  72, 91, 109, 87, 99, 91, 85, 95, 66, 104,
+  84, 87, 88, 74, 89, 89, 115, 100, 87, 80,
+  77, 78, 78, 72, 75, 86, 79, 80, 84, 85,
+  93, 71, 91, 87, 95, 82, 102, 89, 84, 58,
+  85, 84, 95, 77, 69, 77, 76, 74, 66, 74,
+  87, 71, 83, 102, 74, 79, 74, 91, 80, 74,
+  79, 79, 102, 74, 90, 101, 77, 79, 92, 92,
+  88, 87, 73, 86, 113, 81, 79, 82, 66, 86,
+  77, 82, 97, 84, 69, 81, 89, 73, 86, 82,
+  69, 90, 92, 72, 79, 105, 83, 75, 96, 85,
+  84, 77, 73, 81, 74, 84, 87, 86, 82, 82,
+  97, 84, 93, 100, 76, 74, 86, 74, 100, 70,
+  102, 70, 97, 131, 91, 83, 104, 72, 68, 85,
+  111, 84, 99, 100, 88, 99, 74, 96, 86, 86,
+  79, 77, 89, 82, 117, 110, 82, 90, 76, 77,
+  74, 71, 84, 93, 67, 75, 83, 84, 96, 80,
+  89, 99, 96, 84, 106, 78, 88, 59, 73, 84,
+  100, 82, 69, 73, 72, 79, 66, 70, 90, 84,
+  74, 106, 70, 75, 82, 93, 83, 71, 84, 79,
+  114, 81, 99, 95, 79, 76, 98, 90, 75, 87,
+  73, 78, 98, 73, 88, 88, 76, 74, 78, 82,
+  82, 78, 76, 83, 92, 76, 78, 75, 76, 83,
+  92, 77, 68, 88, 75, 81, 86, 85, 85, 85,
+  82, 83, 82, 80, 85, 88, 81, 78, 93, 77,
+  87, 97, 81, 73, 87, 82, 89, 79, 81, 72,
+  99, 105, 97, 79, 96, 84, 79, 93, 96, 88,
+  90, 89, 77, 98, 70, 72, 85, 83, 95, 77,
+  87, 97, 107, 94, 94, 78, 74, 83, 81, 75,
+  85, 86, 92, 76, 89, 90, 94, 97, 97, 82,
+  90, 82, 100, 85, 91, 70, 81, 86, 87, 87,
+  67, 85, 80, 82, 77, 75, 81, 74, 84, 101,
+  77, 75, 74, 89, 79, 78, 82, 80, 93, 78,
+  88, 96, 81, 91, 96, 95, 74, 89, 82, 90,
+  93, 83, 77, 84, 74, 82, 79, 81, 112, 85,
+  79, 88, 85, 77, 82, 86, 74, 82, 88, 73,
+  79, 111, 88, 74, 94, 77, 88, 76, 67, 88,
+  77, 86, 89, 79, 87, 88, 89, 72, 86, 98,
+  78, 90, 88, 76, 76, 89, 70, 81, 87, 108,
+  71, 84, 77, 78, 82, 90, 98, 89, 98, 97,
+  76, 75, 70, 70, 78, 90, 82, 78, 91, 81,
+  110, 96, 82, 79, 84, 68, 109, 75, 65, 85,
+  79, 75, 90, 83, 91, 74, 83, 79, 89, 92,
+  94, 78, 83, 87, 78, 86, 96, 68, 75, 73,
+  69, 79, 75, 67, 83, 81, 80, 80, 82, 80,
+  75, 84, 84, 102, 93, 79, 84, 83, 87, 91,
+  77, 69, 86, 98, 89, 85, 72, 73, 89, 79,
+  81, 88, 81, 77, 68, 84, 100, 85, 77, 91,
+  73, 74, 82, 87, 75, 85, 84, 78, 75, 88,
+  90, 75, 100, 78, 91, 74, 74, 76, 70, 85,
+  91, 76, 92, 89, 87, 72, 66, 97, 80, 87,
+  81, 72, 78, 92, 94, 75, 89, 89, 58, 87,
+  70, 81, 83, 85, 98, 89, 95, 84, 80, 72,
+  71, 91, 76, 87, 71, 89, 103, 81, 104, 89,
+  77, 76, 90, 78, 128, 79, 75, 82, 73, 78,
+  92, 82, 91, 71, 74, 71, 90, 87, 91, 85,
+  77, 91, 70, 81, 82, 66, 73, 75, 68, 76,
+  74, 61, 80, 90, 80, 74, 85, 87, 79, 88,
+  78, 106, 101, 78, 72, 83, 66, 91, 77, 72,
+  70, 93, 85, 83, 71, 64, 80, 73, 78, 92,
+  81, 70, 69, 76, 98, 91, 73, 89, 87, 85,
+  81, 81, 76, 84, 93, 79, 86, 78, 76, 78,
+  90, 75, 88, 80, 78, 85, 80, 84, 86, 84,
+  82, 89, 90, 77, 77, 109, 78, 81, 90, 82,
+  79, 89, 103, 81, 89, 105, 80, 81, 95, 78,
+  75, 84, 96, 88, 97, 83, 78, 83, 77, 107,
+  77, 89, 83, 78, 90, 85, 103, 107, 86, 85,
+  79, 75, 95, 81, 93, 85, 77, 73, 81, 83,
+  96, 90, 88, 88, 88, 89, 101, 83, 91, 88,
+  75, 84, 87, 73, 72, 68, 69, 83, 74, 69,
+  88, 84, 79, 92, 83, 85, 78, 86, 85, 98,
+  86, 84, 89, 87, 72, 88, 84, 81, 71, 93,
+  75, 84, 79, 76, 82, 82, 83, 87, 86, 77,
+  77, 87, 84, 93, 89, 85, 88, 96, 73, 68,
+  83, 89, 73, 83, 79, 87, 89, 74, 89, 85,
+  83, 81, 80, 80, 81, 89, 95, 91, 84, 92,
+  89, 84, 85, 87, 83, 83, 89, 89, 71, 86,
+  84, 91, 82, 92, 90, 95, 81, 95, 78, 89,
+  74, 91, 86, 83, 78, 71, 84, 79, 90, 73,
+  94, 78, 85, 92, 87, 81, 84, 75, 86, 84,
+  86, 90, 78, 64, 85, 70, 87, 98, 85, 92,
+  80, 82, 84, 93, 75, 88, 89, 87, 87, 94,
+  79, 94, 88, 76, 92, 85, 89, 89, 77, 80,
+  84, 77, 87, 80, 76, 81, 95, 69, 92, 82,
+  72, 84, 80, 85, 83, 75, 68, 89, 108, 88,
+  91, 82, 91, 94, 88, 77, 94, 80, 78, 71,
+  70, 97, 81, 82, 74, 98, 83, 70, 80, 90,
+  66, 85, 72, 84, 87, 77, 80, 92, 85, 85,
+  96, 82, 95, 85, 86, 92, 84, 92, 87, 82,
+  79, 74, 82, 85, 94, 89, 80, 80, 74, 82,
+  97, 87, 81, 95, 76, 105, 74, 92, 73, 98,
+  77, 80, 77, 64, 86, 78, 96, 65, 110, 83,
+  83, 100, 86, 69, 95, 70, 83, 95, 86, 93,
+  83, 68, 89, 71, 92, 107, 84, 86, 87, 72,
+  82, 90, 68, 88, 84, 79, 88, 88, 70, 97,
+  88, 83, 104, 84, 90, 94, 72, 74, 97, 69,
+  97, 77, 74, 82, 96, 71, 97, 79, 60, 83,
+  72, 89, 83, 91, 72, 92, 95, 86, 92, 89,
+  89, 93, 85, 80, 96, 77, 79, 69, 90, 99,
+  77, 87, 88, 86, 78, 71, 87, 93, 80, 84,
+  94, 91, 77, 77, 88, 79, 85, 84, 84, 86,
+  99, 87, 79, 87, 86, 96, 86, 77, 80, 92,
+  77, 80, 93, 90, 73, 84, 87, 92, 82, 101,
+  77, 89, 88, 88, 68, 91, 83, 96, 85, 84,
+  78, 80, 80, 84, 78, 73, 88, 76, 92, 89,
+  85, 89, 86, 74, 82, 78, 96, 92, 90, 74,
+  80, 70, 85, 97, 91, 87, 91, 91, 86, 92,
+  84, 84, 95, 87, 86, 88, 81, 86, 81, 78,
+  85, 88, 84, 85, 87, 84, 88, 87, 85, 81,
+  76, 82, 95, 76, 87, 81, 75, 82, 74, 93,
+  84, 89, 72, 84, 84, 89, 91, 84, 88, 85,
+  80, 80, 95, 76, 80, 78, 85, 83, 89, 87,
+  93, 88, 90, 77, 95, 84, 75, 85, 91, 81,
+  94, 82, 86, 83, 73, 79, 85, 81, 69, 72,
+  92, 88, 85, 78, 80, 87, 82, 77, 86, 84,
+  77, 81, 91, 85, 81, 89, 102, 88, 91, 101,
+  84, 88, 75, 91, 84, 79, 90, 94, 85, 92,
+  77, 93, 90, 86, 81, 84, 82, 80, 77, 76,
+  107, 94, 69, 85, 83, 79, 68, 75, 77, 68,
+  91, 82, 91, 74, 82, 92, 78, 92, 77, 78,
+  104, 81, 88, 80, 85, 85, 60, 69, 77, 97,
+  84, 91, 88, 99, 100, 88, 87, 74, 86, 86,
+  86, 81, 84, 95, 87, 74, 80, 78, 86, 79,
+  100, 68, 93, 84, 82, 86, 73, 87, 85, 87,
+  81, 77, 84, 75, 81, 90, 83, 85, 87, 68,
+  93, 80, 88, 82, 81, 78, 93, 86, 87, 77,
+  81, 89, 83, 81, 93, 76, 64, 76, 90, 93,
+  88, 81, 73, 93, 80, 75, 102, 78, 75, 62,
+  78, 71, 78, 94, 91, 66, 87, 94, 74, 82,
+  70, 70, 87, 103, 80, 102, 88, 82, 86, 86,
+  83, 91, 79, 75, 83, 68, 85, 80, 89, 101,
+  94, 88, 73, 90, 40, 61, 83, 80, 79, 82,
+  83, 53, 81, 83, 78, 93, 82, 74, 93, 87,
+  82, 74, 93, 85, 70, 70, 73, 96, 72, 88,
+  83, 92, 89, 91, 74, 71, 80, 78, 85, 85,
+  89, 96, 84, 85, 84, 81, 85, 77, 103, 77,
+  77, 79, 76, 90, 84, 92, 99, 95, 92, 81,
+  81, 88, 79, 90, 84, 80, 90, 62, 90, 84,
+  85, 80, 77, 81, 92, 81, 82, 77, 79, 89,
+  82, 84, 92, 76, 74, 72, 91, 91, 85, 82,
+  83, 84, 79, 78, 93, 77, 93, 76, 76, 75,
+  79, 93, 90, 64, 95, 97, 74, 86, 65, 60,
+  80, 96, 83, 91, 83, 86, 84, 95, 86, 87,
+  85, 76, 88, 72, 86, 82, 91, 101, 92, 92,
+  73, 77, 73, 61, 86, 73, 82, 68, 79, 77,
+  79, 84, 80, 87, 83, 75, 90, 85, 78, 69,
+  85, 87, 74, 77, 68, 95, 79, 85, 79, 92,
+  83, 89, 73, 80, 76, 76, 89, 86, 98, 91,
+  85, 84, 81, 81, 85, 86, 88, 76, 60, 76,
+  75, 92, 77, 93, 88, 92, 92, 76, 85, 87,
+  80, 78, 89, 80, 85, 80, 97, 92, 86, 81,
+  82, 70, 81, 83, 81, 92, 80, 89, 83, 79,
+  83, 77, 89, 72, 86, 103, 85, 76, 80, 92,
+  85, 79, 86, 71, 65, 79, 85, 78, 78, 102,
+  93, 80, 75, 98, 88, 87, 80, 84, 84, 88,
+  90, 94, 86, 83, 86, 71, 92, 86, 82, 84,
+  79, 67, 79, 51, 74, 94, 82, 69, 85, 73,
+  72, 76, 91, 70, 86, 86, 80, 79, 66, 96,
+  87, 97, 78, 91, 89, 80, 76, 71, 95, 83,
+  81, 70, 72, 87, 75, 85, 80, 86, 90, 80,
+  66, 45, 78, 83, 79, 62, 89, 95, 90, 94,
+  99, 74, 90, 76, 79, 71, 101, 76, 82, 89,
+  79, 87, 87, 93, 89, 79, 85, 95, 94, 73,
+  68, 74, 71, 60, 72, 83, 78, 88, 81, 62,
+  77, 83, 68, 79, 78, 77, 83, 70, 86, 94,
+  94, 100, 87, 81, 92, 82, 74, 87, 83, 82,
+  100, 68, 75, 72, 75, 72, 91, 70, 77, 67,
+  65, 77, 74, 87, 83, 72, 88, 104, 76, 83,
+  83, 75, 93, 49, 73, 84, 86, 81, 112, 82,
+  94, 104, 41, 92, 154, 87, 83, 129, 34, 76,
+  100, 95, 67, 80, 96, 95, 68, 68, 83, 81,
+  81, 92, 76, 89, 71, 113, 73, 76, 80, 90,
+  83, 78, 71, 65, 81, 73, 69, 78, 64, 85,
+  91, 82, 83, 81, 89, 92, 83, 109, 84, 96,
+  79, 70, 66, 118, 108, 77, 97, 91, 95, 101,
+  85, 80, 84, 94, 83, 118, 93, 92, 61, 77,
+  80, 67, 69, 94, 82, 85, 79, 68, 68, 64,
+  64, 88, 80, 71, 79, 76, 80, 85, 65, 87,
+  81, 77, 90, 86, 75, 78, 75, 85, 90, 81,
+  73, 76, 93, 73, 86, 75, 76, 60, 85, 78,
+  72, 101, 84, 102, 83, 87, 86, 79, 86, 81,
+  96, 77, 80, 86, 94, 73, 113, 90, 103, 109,
+  63, 88, 110, 97, 88, 103, 84, 65, 102, 96,
+  77, 77, 82, 79, 93, 57, 86, 78, 80, 72,
+  73, 76, 72, 102, 83, 75, 84, 120, 80, 76,
+  94, 59, 81, 73, 77, 77, 74, 140, 87, 84,
+  85, 78, 85, 92, 82, 96, 71, 110, 78, 74,
+  57, 96, 60, 71, 91, 85, 75, 83, 85, 79,
+  84, 87, 77, 102, 85, 81, 86, 83, 76, 82,
+  80, 91, 88, 80, 76, 77, 73, 85, 70, 93,
+  81, 87, 78, 96, 74, 85, 98, 63, 85, 91,
+  82, 85, 87, 80, 81, 85, 86, 74, 82, 95,
+  101, 90, 85, 89, 89, 78, 73, 93, 89, 77,
+  84, 78, 83, 73, 86, 96, 78, 85, 80, 86,
+  96, 86, 83, 82, 86, 81, 88, 50, 78, 86,
+  78, 70, 79, 87, 75, 69, 88, 73, 91, 82,
+  82, 90, 66, 96, 82, 83, 67, 97, 77, 77,
+  82, 84, 94, 89, 87, 93, 69, 76, 94, 80,
+  81, 81, 82, 81, 77, 60, 83, 83, 80, 65,
+  80, 90, 87, 85, 83, 82, 96, 78, 73, 83,
+  89, 70, 74, 86, 74, 81, 93, 89, 85, 81,
+  87, 92, 103, 69, 92, 86, 70, 93, 69, 71,
+  86, 85, 76, 79, 84, 96, 69, 81, 74, 70,
+  75, 91, 90, 85, 99, 85, 101, 77, 75, 85,
+  89, 88, 95, 86, 84, 94, 103, 108, 86, 85,
+  100, 62, 76, 71, 79, 74, 84, 93, 84, 94,
+  82, 67, 92, 93, 76, 81, 74, 76, 58, 77,
+  81, 93, 102, 88, 87, 93, 79, 73, 89, 87,
+  92, 80, 90, 107, 79, 85, 80, 83, 90, 118,
+  72, 78, 79, 71, 75, 112, 83, 88, 89, 107,
+  82, 87, 89, 76, 89, 77, 91, 72, 77, 71,
+  72, 87, 85, 77, 86, 85, 92, 74, 83, 95,
+  81, 79, 79, 94, 76, 87, 69, 103, 88, 91,
+  85, 91, 91, 73, 74, 73, 88, 97, 84, 81,
+  103, 80, 65, 82, 82, 91, 73, 74, 84, 81,
+  76, 84, 79, 84, 68, 82, 74, 64, 81, 89,
+  95, 76, 79, 75, 88, 83, 80, 88, 94, 83,
+  94, 84, 85, 99, 72, 106, 88, 82, 98, 64,
+  71, 63, 89, 73, 77, 101, 82, 111, 83, 55,
+  91, 81, 80, 80, 79, 97, 55, 79, 85, 87,
+  105, 97, 93, 88, 81, 72, 74, 91, 102, 79,
+  112, 107, 80, 90, 86, 90, 82, 97, 94, 69,
+  81, 78, 79, 86, 87, 87, 90, 108, 81, 85,
+  93, 98, 86, 92, 100, 73, 76, 76, 92, 84,
+  82, 102, 88, 90, 99, 69, 85, 94, 82, 74,
+  72, 102, 77, 88, 69, 98, 86, 94, 81, 94,
+  89, 65, 77, 72, 90, 96, 85, 83, 81, 94,
+  88, 81, 92, 83, 75, 78, 83, 78, 88, 88,
+  96, 78, 80, 81, 88, 85, 90, 83, 80, 79,
+  86, 82, 91, 76, 76, 80, 81, 87, 99, 83,
+  83, 81, 102, 82, 87, 68, 94, 88, 76, 93,
+  82, 88, 77, 79, 90, 82, 82, 87, 86, 90,
+  85, 85, 87, 83, 83, 75, 92, 84, 91, 94,
+  92, 82, 91, 96, 87, 70, 96, 86, 83, 87,
+  81, 78, 80, 78, 92, 89, 81, 95, 84, 92,
+  84, 91, 67, 82, 88, 93, 88, 71, 81, 82,
+  81, 84, 83, 70, 97, 86, 72, 89, 78, 87,
+  85, 89, 83, 84, 85, 90, 83, 86, 85, 85,
+  85, 70, 78, 73, 80, 83, 81, 85, 90, 99,
+  68, 73, 101, 93, 88, 93, 79, 96, 84, 74,
+  106, 79, 77, 68, 81, 75, 93, 83, 93, 79,
+  86, 80, 90, 75, 83, 78, 86, 82, 80, 84,
+  84, 79, 75, 82, 99, 92, 105, 79, 85, 86,
+  102, 82, 80, 58, 92, 94, 75, 83, 84, 77,
+  92, 88, 95, 87, 88, 87, 80, 85, 81, 88,
+  79, 79, 81, 67, 93, 91, 98, 110, 84, 94,
+  69, 98, 89, 70, 109, 71, 76, 85, 81, 82,
+  86, 82, 89, 94, 76, 89, 81, 77, 88, 82,
+  72, 90, 75, 92, 74, 79, 70, 78, 87, 88,
+  70, 74, 83, 87, 80, 88, 73, 84, 82, 92,
+  78, 82, 84, 90, 85, 85, 88, 88, 83, 73,
+  72, 71, 77, 88, 80, 82, 90, 98, 64, 75,
+  90, 90, 89, 94, 81, 90, 82, 81, 101, 95,
+  76, 71, 84, 78, 92, 84, 95, 85, 79, 86,
+  93, 85, 91, 78, 91, 74, 85, 82, 72, 71,
+  77, 87, 84, 93, 99, 78, 82, 87, 91, 91,
+  83, 61, 77, 90, 77, 82, 80, 81, 79, 82,
+  86, 87, 88, 87, 84, 86, 80, 85, 87, 90,
+  81, 72, 81, 88, 94, 93, 83, 94, 94, 88,
+  79, 73, 106, 76, 80, 79, 79, 85, 85, 79,
+  88, 98, 82, 82, 87, 85, 83, 75, 73, 90,
+  70, 82, 80, 78, 75, 91, 85, 84, 80, 71,
+  91, 88, 97, 79, 74, 87, 78, 91, 82, 84,
+  79, 94, 87, 88, 86, 90, 86, 92, 76, 72,
+  73, 78, 80, 79, 84, 98, 73, 73, 86, 91,
+  90, 93, 89, 98, 92, 89, 83, 83, 81, 80,
+  80, 83, 84, 94, 92, 86, 75, 83, 90, 81,
+  87, 83, 82, 73, 78, 86, 93, 79, 84, 86,
+  85, 84, 91, 80, 81, 87, 92, 76, 96, 88,
+  91, 79, 88, 84, 79, 81, 75, 83, 84, 89,
+  81, 85, 81, 84, 82, 82, 81, 89, 72, 81,
+  81, 87, 95, 81, 79, 84, 99, 85, 97, 74,
+  101, 85, 80, 83, 74, 89, 83, 74, 85, 85,
+  76, 94, 86, 100, 81, 93, 77, 93, 82, 91,
+  96, 69, 72, 89, 78, 94, 85, 73, 90, 85,
+  68, 90, 69, 93, 89, 97, 82, 92, 81, 83,
+  77, 81, 88, 77, 82, 73, 78, 77, 69, 98,
+  86, 75, 80, 84, 77, 71, 85, 89, 92, 86,
+  86, 91, 102, 94, 88, 76, 78, 73, 76, 84,
+  86, 90, 80, 80, 85, 95, 87, 72, 84, 84,
+  82, 74, 74, 88, 94, 79, 86, 86, 105, 86,
+  82, 69, 77, 93, 86, 78, 86, 93, 90, 76,
+  87, 63, 75, 71, 80, 91, 90, 82, 96, 82,
+  74, 74, 80, 85, 72, 79, 69, 73, 74, 91,
+  98, 100, 68, 94, 83, 73, 102, 84, 126, 72,
+  74, 73, 73, 98, 91, 79, 79, 88, 71, 71,
+  86, 89, 95, 90, 86, 101, 70, 90, 77, 72,
+  63, 88, 82, 88, 71, 66, 73, 86, 76, 80,
+  61, 78, 92, 99, 80, 96, 83, 82, 76, 79,
+  89, 83, 81, 70, 71, 72, 76, 103, 75, 73,
+  78, 72, 77, 73, 67, 90, 78, 79, 85, 82,
+  86, 96, 85, 84, 78, 70, 83, 90, 87, 86,
+  89, 84, 77, 87, 93, 81, 92, 87, 81, 68,
+  80, 89, 84, 73, 88, 91, 90, 89, 82, 71,
+  77, 90, 80, 95, 83, 101, 84, 81, 92, 73,
+  74, 78, 75, 84, 75, 87, 91, 83, 77, 78,
+  80, 81, 82, 91, 71, 76, 72, 90, 98, 84,
+  69, 94, 104, 72, 93, 85, 121, 91, 77, 73,
+  76, 99, 85, 75, 87, 92, 80, 74, 90, 95,
+  87, 76, 81, 94, 72, 86, 75, 74, 69, 103,
+  85, 89, 79, 70, 83, 85, 96, 76, 62, 77,
+  87, 98, 83, 100, 81, 82, 78, 84, 88, 84,
+  81, 86, 77, 82, 75, 95, 82, 78, 74, 78,
+  84, 71, 69, 94, 87, 81, 80, 97, 99, 86,
+  80, 81, 81, 75, 78, 92, 78, 95, 96, 93,
+  61, 88, 92, 83, 92, 90, 94, 74, 79, 82,
+  96, 74, 92, 94, 80, 84, 82, 87, 83, 93,
+  83, 78, 88, 100, 80, 85, 99, 83, 89, 81,
+  70, 82, 66, 82, 94, 89, 73, 87, 88, 76,
+  90, 74, 78, 78, 84, 75, 104, 83, 80, 80,
+  103, 80, 81, 90, 89, 90, 79, 77, 84, 93,
+  73, 82, 74, 85, 88, 81, 82, 89, 81, 93,
+  83, 88, 85, 90, 74, 85, 82, 80, 86, 85,
+  85, 81, 94, 76, 75, 95, 59, 89, 88, 100,
+  78, 103, 86, 90, 85, 83, 95, 81, 77, 88,
+  75, 84, 80, 93, 80, 83, 77, 77, 85, 69,
+  88, 96, 89, 77, 61, 83, 89, 88, 66, 76,
+  86, 72, 74, 99, 74, 97, 69, 74, 71, 92,
+  87, 89, 86, 105, 99, 75, 87, 72, 90, 70,
+  98, 91, 105, 79, 80, 71, 76, 101, 71, 86,
+  87, 102, 72, 66, 112, 75, 85, 71, 75, 84,
+  67, 73, 117, 78, 69, 68, 87, 73, 84, 68,
+  99, 68, 82, 84, 105, 103, 80, 88, 99, 69,
+  83, 119, 105, 93, 79, 81, 91, 99, 78, 98,
+  77, 80, 86, 60, 78, 84, 87, 86, 84, 91,
+  83, 85, 50, 78, 83, 80, 81, 78, 92, 74,
+  78, 76, 82, 85, 50, 76, 93, 104, 76, 109,
+  95, 83, 77, 84, 83, 88, 85, 80, 77, 86,
+  93, 87, 71, 95, 76, 73, 83, 77, 68, 101,
+  79, 71, 74, 75, 69, 86, 70, 78, 86, 69,
+  80, 96, 80, 89, 84, 78, 63, 89, 93, 91,
+  95, 98, 93, 72, 70, 80, 77, 70, 93, 94,
+  93, 89, 83, 77, 81, 94, 79, 94, 81, 102,
+  78, 71, 107, 74, 84, 81, 83, 82, 63, 85,
+  98, 83, 72, 73, 85, 77, 90, 82, 100, 79,
+  84, 80, 98, 86, 78, 87, 99, 76, 73, 106,
+  107, 96, 94, 74, 90, 98, 72, 95, 74, 80,
+  98, 66, 83, 95, 85, 72, 77, 91, 87, 88,
+  58, 88, 90, 90, 81, 80, 90, 77, 83, 77,
+  92, 86, 55, 75, 82, 101, 77, 96, 96, 83,
+  82, 90, 83, 90, 82, 93, 74, 86, 83, 79,
+  71, 93, 81, 74, 86, 74, 77, 104, 88, 79,
+  87, 75, 100, 99, 82, 90, 79, 81, 79, 95,
+  84, 85, 87, 81, 89, 89, 84, 93, 84, 82,
+  83, 78, 97, 76, 77, 93, 76, 80, 99, 91,
+  89, 77, 88, 69, 91, 104, 81, 103, 87, 89,
+  82, 78, 73, 87, 85, 83, 72, 75, 73, 81,
+  82, 81, 88, 77, 76, 87, 77, 80, 93, 80,
+  91, 75, 83, 84, 105, 78, 84, 75, 79, 105,
+  85, 83, 70, 97, 73, 80, 83, 73, 92, 75,
+  86, 82, 78, 93, 85, 63, 142, 83, 80, 89,
+  81, 92, 83, 89, 88, 79, 83, 91, 87, 77,
+  89, 78, 76, 85, 69, 74, 73, 85, 82, 77,
+  78, 89, 82, 73, 87, 91, 87, 90, 84, 88,
+  82, 86, 77, 86, 83, 166, 76, 80, 92, 76,
+  86, 81, 94, 80, 80, 78, 73, 76, 83, 77,
+  94, 91, 88, 82, 87, 87, 72, 92, 75, 80,
+  80, 69, 80, 95, 68, 70, 101, 92, 103, 87,
+  83, 68, 93, 74, 81, 78, 85, 88, 80, 86,
+  84, 87, 88, 81, 80, 85, 63, 77, 85, 91,
+  84, 73, 77, 82, 77, 79, 98, 72, 82, 81,
+  84, 85, 88, 80, 73, 79, 74, 82, 99, 87,
+  73, 84, 82, 78, 81, 84, 95, 85, 81, 83,
+  75, 85, 89, 57, 92, 76, 89, 83, 83, 84,
+  74, 96, 79, 88, 77, 95, 82, 85, 69, 79,
+  56, 88, 76, 78, 68, 86, 78, 80, 87, 78,
+  73, 104, 83, 92, 80, 105, 80, 87, 78, 81,
+  69, 78, 81, 153, 67, 86, 84, 72, 91, 89,
+  90, 80, 79, 81, 78, 100, 86, 86, 80, 86,
+  94, 86, 87, 87, 89, 94, 78, 82, 83, 80,
+  79, 90, 83, 82, 87, 88, 90, 87, 86, 72,
+  87, 63, 88, 95, 73, 93, 87, 79, 85, 84,
+  77, 82, 81, 89, 73, 80, 82, 81, 92, 78,
+  77, 71, 76, 80, 97, 76, 86, 86, 81, 84,
+  105, 77, 78, 79, 77, 86, 94, 81, 82, 86,
+  81, 81, 81, 95, 100, 76, 85, 84, 69, 83,
+  84, 74, 67, 86, 88, 90, 81, 98, 87, 86,
+  95, 82, 82, 93, 78, 72, 81, 87, 80, 84,
+  72, 81, 79, 78, 77, 80, 88, 89, 82, 142,
+  85, 82, 90, 87, 86, 86, 82, 86, 84, 95,
+  86, 146, 82, 79, 89, 84, 84, 89, 86, 87,
+  81, 74, 72, 72, 90, 81, 84, 90, 83, 80,
+  81, 90, 73, 72, 87, 87, 91, 75, 79, 88,
+  71, 70, 108, 93, 102, 80, 91, 66, 97, 103,
+  78, 89, 86, 86, 82, 78, 74, 91, 85, 81,
+  82, 82, 69, 85, 88, 89, 85, 80, 85, 86,
+  70, 80, 90, 86, 95, 80, 85, 84, 80, 76,
+  78, 86, 80, 83, 83, 82, 67, 89, 81, 73,
+  74, 64, 92, 83, 86, 88, 83, 88, 84, 98,
+  138, 77, 80, 77, 87, 84, 81, 84, 69, 83,
+  83, 95, 91, 80, 79, 85, 64, 89, 73, 84,
+  76, 90, 82, 85, 78, 87, 74, 51, 89, 90,
+  80, 103, 81, 82, 85, 75, 67, 73, 75, 97,
+  63, 92, 89, 84, 74, 75, 97, 80, 85, 72,
+  62, 70, 90, 74, 95, 81, 77, 74, 87, 87,
+  66, 81, 80, 89, 82, 75, 84, 89, 63, 66,
+  123, 92, 121, 98, 85, 71, 99, 68, 87, 88,
+  88, 87, 78, 83, 81, 94, 97, 78, 87, 92,
+  63, 79, 88, 80, 81, 75, 80, 81, 71, 73,
+  86, 87, 99, 83, 75, 93, 60, 80, 78, 101,
+  82, 68, 80, 90, 71, 81, 90, 75, 81, 88,
+  84, 104, 80, 87, 77, 87, 83, 103, 69, 75,
+  79, 72, 87, 78, 57, 96, 64, 96, 77, 111,
+  91, 95, 75, 83, 61, 92, 81, 92, 70, 89,
+  85, 88, 78, 79, 78, 70, 80, 85, 81, 131,
+  83, 78, 77, 77, 48, 79, 69, 63, 68, 106,
+  85, 77, 83, 82, 86, 79, 80, 74, 75, 77,
+  84, 83, 77, 78, 90, 80, 82, 88, 80, 86,
+  79, 85, 85, 76, 81, 88, 79, 71, 94, 79,
+  93, 96, 88, 67, 91, 59, 87, 81, 87, 86,
+  85, 76, 92, 88, 81, 80, 90, 90, 69, 85,
+  85, 84, 88, 74, 88, 87, 72, 78, 90, 81,
+  88, 88, 84, 83, 92, 75, 73, 92, 79, 78,
+  93, 78, 82, 82, 84, 77, 79, 97, 95, 80,
+  85, 89, 74, 85, 87, 109, 64, 85, 81, 83,
+  82, 87, 90, 79, 80, 83, 83, 96, 85, 74,
+  77, 85, 70, 86, 74, 85, 80, 83, 77, 86,
+  85, 88, 75, 127, 83, 84, 95, 96, 81, 81,
+  79, 74, 73, 77, 79, 85, 68, 83, 94, 80,
+  77, 93, 87, 94, 79, 73, 76, 93, 87, 84,
+  79, 88, 87, 82, 79, 92, 87, 74, 84, 84,
+  99, 78, 82, 86, 91, 77, 90, 86, 88, 88,
+  88, 69, 99, 118, 78, 78, 78, 88, 78, 76,
+  79, 91, 80, 84, 79, 86, 81, 82, 90, 82,
+  89, 79, 84, 90, 70, 79, 84, 84, 93, 81,
+  89, 79, 97, 75, 79, 81, 78, 82, 94, 81,
+  79, 81, 83, 83, 73, 64, 92, 79, 86, 85,
+  83, 89, 83, 137, 155, 78, 83, 85, 82, 100,
+  102, 84, 83, 83, 92, 88, 89, 76, 80, 101,
+  84, 85, 100, 85, 85, 98, 76, 92, 70, 92,
+  89, 58, 88, 86, 83, 90, 91, 85, 92, 77,
+  72, 78, 74, 74, 85, 84, 97, 78, 82, 93,
+  86, 89, 79, 69, 72, 79, 83, 81, 89, 84,
+  83, 81, 81, 90, 81, 78, 80, 92, 99, 79,
+  86, 77, 84, 69, 94, 86, 84, 100, 87, 73,
+  91, 82, 84, 70, 78, 86, 75, 79, 79, 96,
+  79, 88, 84, 89, 69, 81, 87, 84, 85, 78,
+  83, 86, 66, 70, 85, 79, 93, 80, 83, 78,
+  85, 75, 83, 84, 78, 76, 85, 80, 79, 73,
+  87, 77, 75, 80, 85, 90, 85, 86, 83, 93,
+  81, 158, 111, 76, 85, 86, 79, 89, 93, 84,
+  77, 86, 93, 90, 88, 80, 78, 87, 65, 83,
+  82, 86, 81, 93, 76, 89, 73, 84, 81, 92,
+  88, 91, 97, 104, 84, 84, 84, 74, 63, 72,
+  73, 52, 72, 86, 91, 82, 82, 84, 87, 90,
+  78, 75, 79, 98, 82, 82, 79, 80, 89, 82,
+  80, 93, 92, 80, 80, 86, 94, 78, 85, 88,
+  95, 81, 76, 82, 84, 99, 88, 74, 88, 69,
+  84, 69, 81, 87, 80, 75, 87, 90, 77, 84,
+  87, 92, 77, 83, 88, 83, 92, 77, 85, 87,
+  68, 77, 85, 82, 89, 84, 89, 78, 98, 74,
+  82, 86, 77, 86, 86, 80, 84, 81, 89, 86,
+  73, 90, 92, 80, 87, 86, 77, 92, 83, 152,
+  84, 87, 89, 89, 79, 94, 105, 84, 86, 82,
+  94, 87, 85, 77, 78, 90, 87, 83, 100, 83,
+  85, 93, 76, 91, 80, 90, 86, 130, 89, 84,
+  107, 89, 94, 84, 83, 78, 76, 78, 81, 66,
+  86, 81, 78, 80, 73, 91, 80, 79, 67, 95,
+  84, 82, 77, 99, 87, 72, 68, 87, 74, 71,
+  84, 91, 87, 70, 77, 88, 79, 68, 101, 84,
+  111, 91, 79, 83, 77, 82, 70, 90, 111, 86,
+  73, 72, 88, 88, 82, 62, 78, 70, 93, 86,
+  83, 64, 141, 72, 85, 88, 83, 70, 94, 91,
+  116, 75, 82, 69, 126, 76, 74, 77, 91, 79,
+  74, 77, 70, 115, 87, 84, 74, 67, 73, 89,
+  101, 94, 86, 92, 73, 81, 77, 80, 85, 85,
+  95, 80, 72, 99, 92, 68, 90, 69, 97, 84,
+  90, 91, 88, 72, 92, 91, 88, 79, 71, 90,
+  91, 77, 74, 75, 71, 85, 115, 102, 74, 80,
+  76, 87, 94, 95, 69, 74, 72, 90, 85, 83,
+  74, 86, 69, 95, 79, 85, 72, 95, 92, 86,
+  74, 100, 84, 66, 76, 95, 79, 77, 83, 90,
+  84, 71, 83, 84, 81, 74, 97, 88, 73, 76,
+  65, 86, 76, 86, 57, 89, 88, 87, 72, 74,
+  78, 80, 86, 68, 83, 69, 93, 77, 77, 64,
+  132, 74, 90, 89, 79, 61, 99, 89, 100, 81,
+  85, 68, 125, 78, 80, 74, 87, 77, 77, 65,
+  72, 105, 88, 86, 78, 71, 71, 86, 94, 93,
+  90, 88, 74, 85, 76, 82, 83, 78, 84, 85,
+  75, 92, 82, 71, 90, 77, 91, 88, 87, 86,
+  86, 66, 94, 90, 85, 66, 75, 86, 93, 79,
+  74, 75, 72, 82, 105, 82, 76, 79, 77, 81,
+  78, 92, 74, 78, 74, 84, 85, 67, 76, 84,
+  74, 93, 80, 78, 64, 90, 89, 85, 77, 103,
+  85, 76, 70, 84, 69, 74, 81, 91, 80, 68,
+  78, 89, 76, 69, 107, 86, 96, 77, 81, 87,
+  77, 84, 71, 91, 118, 85, 73, 71, 88, 87,
+  84, 63, 78, 69, 92, 76, 86, 66, 139, 79,
+  87, 85, 86, 65, 95, 93, 110, 77, 83, 74,
+  123, 75, 79, 74, 90, 76, 78, 84, 67, 111,
+  90, 81, 80, 70, 80, 91, 109, 88, 88, 94,
+  75, 96, 79, 81, 82, 77, 92, 86, 75, 94,
+  89, 70, 89, 68, 96, 87, 91, 88, 85, 73,
+  92, 91, 90, 79, 70, 90, 99, 75, 74, 77,
+  72, 86, 108, 91, 74, 84, 76, 90, 78, 94,
+  73, 73, 72, 91, 83, 83, 82, 79, 73, 87,
+  81, 82, 79, 83, 82, 81, 85, 85, 95, 84,
+  79, 78, 72, 88, 89, 84, 86, 75, 76, 94,
+  82, 89, 85, 84, 95, 82, 81, 81, 89, 77,
+  74, 79, 80, 82, 88, 80, 87, 76, 87, 71,
+  76, 87, 76, 80, 85, 83, 106, 75, 98, 87,
+  89, 86, 88, 78, 92, 77, 86, 71, 102, 79,
+  79, 90, 86, 83, 76, 74, 78, 93, 90, 69,
+  85, 84, 71, 87, 86, 76, 85, 65, 83, 77,
+  79, 82, 83, 84, 68, 88, 83, 78, 80, 87,
+  82, 78, 83, 85, 89, 82, 76, 77, 89, 88,
+  81, 78, 91, 88, 95, 84, 62, 83, 87, 85,
+  81, 91, 87, 84, 79, 80, 87, 87, 84, 84,
+  85, 89, 82, 92, 81, 87, 75, 87, 79, 82,
+  85, 83, 81, 86, 83, 81, 90, 89, 87, 85,
+  80, 89, 90, 82, 85, 79, 77, 87, 78, 95,
+  81, 83, 70, 77, 83, 87, 87, 76, 70, 79,
+  80, 86, 84, 84, 85, 77, 85, 73, 76, 80,
+  76, 80, 84, 83, 99, 82, 99, 86, 90, 83,
+  91, 79, 88, 79, 80, 71, 103, 82, 80, 93,
+  80, 81, 81, 68, 77, 88, 90, 70, 86, 83,
+  72, 74, 84, 77, 84, 68, 85, 84, 82, 81,
+  81, 75, 59, 85, 84, 75, 76, 90, 80, 85,
+  79, 86, 87, 81, 70, 77, 91, 88, 80, 71,
+  86, 83, 93, 80, 70, 85, 90, 79, 78, 81,
+  74, 85, 81, 76, 74, 86, 86, 86, 88, 83,
+  80, 87, 83, 92, 84, 86, 82, 85, 76, 79,
+  85, 83, 85, 87, 93, 89, 79, 80, 72, 88,
+  90, 83, 84, 75, 77, 92, 72, 87, 86, 81,
+  90, 77, 90, 85, 88, 77, 72, 84, 88, 84,
+  80, 79, 85, 81, 82, 73, 74, 82, 76, 83,
+  89, 80, 106, 84, 94, 85, 93, 84, 87, 76,
+  96, 71, 82, 75, 102, 74, 78, 91, 83, 78,
+  83, 76, 77, 90, 87, 68, 86, 82, 78, 76,
+  88, 75, 82, 65, 82, 86, 81, 81, 83, 77,
+  71, 85, 84, 71, 82, 85, 81, 76, 83, 85,
+  89, 83, 73, 92, 87, 90, 81, 82, 91, 85,
+  93, 80, 70, 86, 87, 83, 83, 82, 79, 86,
+  81, 84, 77, 87, 82, 82, 87, 90, 80, 90,
+  83, 82, 76, 90, 87, 85, 82, 74, 78, 82,
+  85, 68, 91, 87, 89, 81, 82, 91, 92, 85,
+  82, 88, 85, 88, 85, 98, 90, 83, 86, 84,
+  85, 82, 100, 84, 85, 79, 80, 79, 84, 88,
+  81, 86, 90, 89, 85, 98, 76, 83, 86, 98,
+  68, 88, 93, 91, 91, 95, 87, 78, 76, 77,
+  88, 77, 85, 75, 82, 90, 88, 87, 84, 82,
+  92, 88, 83, 87, 82, 92, 83, 89, 81, 80,
+  87, 70, 88, 89, 86, 83, 81, 77, 91, 88,
+  73, 82, 80, 96, 84, 85, 80, 84, 86, 84,
+  92, 89, 87, 83, 78, 78, 93, 81, 97, 92,
+  74, 99, 94, 87, 99, 82, 95, 84, 85, 87,
+  88, 84, 83, 88, 91, 80, 88, 92, 85, 85,
+  86, 88, 81, 94, 84, 74, 69, 82, 81, 66,
+  82, 94, 91, 84, 88, 88, 89, 88, 83, 89,
+  91, 79, 80, 100, 88, 79, 74, 83, 86, 83,
+  92, 79, 84, 85, 84, 84, 85, 84, 83, 85,
+  84, 88, 80, 88, 73, 89, 89, 92, 67, 88,
+  84, 87, 88, 94, 89, 81, 77, 79, 84, 79,
+  85, 76, 86, 92, 85, 90, 85, 86, 91, 88,
+  79, 86, 81, 89, 83, 80, 78, 82, 84, 77,
+  88, 90, 87, 86, 85, 77, 86, 79, 74, 80,
+  78, 98, 82, 87, 81, 84, 82, 77, 90, 88,
+  88, 82, 81, 76, 86, 79, 87, 86, 83, 98,
+  92, 80, 98, 86, 87, 85, 82, 86, 86, 86,
+  78, 86, 89, 81, 87, 92, 86, 93, 94, 90,
+  85, 92, 82, 70, 78, 83, 83, 69, 85, 93,
+  88, 81, 80, 89, 91, 88, 86, 87, 90, 85,
+  81, 92, 90, 83, 80, 82, 82, 82, 100, 74,
+  83, 90, 81, 82, 83, 85, 82, 87, 79, 90,
+  88, 96, 76, 88, 90, 94, 69, 89, 88, 87,
+  90, 91, 88, 79, 78, 76, 87, 78, 80, 73,
+  88, 90, 88, 90, 86, 90, 82, 83, 84, 87,
+  84, 94, 86, 74, 79, 80, 87, 67, 88, 85,
+  85, 83, 86, 78, 92, 86, 76, 72, 82, 94,
+  82, 83, 82, 84, 86, 84, 93, 88, 83, 85,
+  84, 83, 98, 79, 93, 90, 81, 99, 89, 77,
+  97, 85, 89, 83, 84, 90, 92, 85, 81, 86,
+  93, 85, 87, 92, 80, 86, 90, 83, 90, 88,
+  76, 76, 68, 76, 79, 75, 101, 80, 83, 92,
+  76, 70, 81, 71, 72, 84, 97, 81, 81, 74,
+  79, 78, 102, 77, 82, 94, 78, 90, 70, 81,
+  83, 84, 94, 82, 79, 76, 83, 85, 81, 76,
+  84, 89, 81, 75, 83, 107, 81, 77, 74, 104,
+  90, 73, 91, 83, 88, 75, 82, 71, 83, 63,
+  85, 97, 92, 90, 91, 71, 88, 81, 79, 90,
+  87, 86, 87, 78, 74, 79, 73, 92, 83, 81,
+  85, 82, 73, 80, 77, 84, 78, 80, 83, 71,
+  83, 77, 90, 84, 76, 92, 82, 83, 93, 81,
+  96, 96, 89, 66, 86, 88, 81, 100, 79, 86,
+  75, 86, 91, 91, 70, 86, 74, 85, 84, 72,
+  89, 78, 78, 84, 128, 88, 113, 82, 76, 76,
+  64, 86, 77, 64, 121, 86, 85, 76, 69, 36,
+  88, 61, 75, 106, 78, 70, 80, 70, 64, 84,
+  94, 78, 84, 82, 68, 98, 79, 97, 88, 87,
+  95, 114, 77, 74, 73, 84, 77, 63, 82, 100,
+  80, 85, 77, 129, 79, 91, 44, 97, 44, 72,
+  98, 77, 91, 71, 74, 67, 82, 79, 85, 85,
+  80, 76, 118, 72, 63, 77, 81, 69, 89, 109,
+  86, 67, 87, 70, 64, 81, 96, 77, 97, 117,
+  98, 76, 63, 89, 79, 68, 73, 73, 86, 71,
+  85, 82, 78, 89, 77, 84, 85, 74, 91, 105,
+  77, 53, 105, 82, 68, 101, 91, 81, 91, 80,
+  84, 87, 77, 87, 76, 75, 103, 71, 72, 80,
+  79, 76, 106, 81, 90, 90, 81, 75, 71, 78,
+  75, 78, 87, 94, 79, 94, 84, 73, 84, 66,
+  90, 82, 83, 87, 77, 74, 82, 74, 87, 75,
+  95, 90, 73, 78, 66, 85, 88, 81, 82, 79,
+  76, 78, 76, 82, 87, 89, 83, 85, 85, 71,
+  85, 89, 87, 78, 79, 64, 94, 75, 80, 90,
+  98, 77, 81, 77, 83, 65, 93, 110, 84, 87,
+  86, 78, 97, 83, 84, 90, 89, 90, 81, 80,
+  68, 76, 76, 70, 78, 74, 104, 82, 71, 83,
+  80, 93, 83, 82, 81, 75, 88, 76, 91, 88,
+  70, 95, 91, 81, 92, 82, 78, 88, 87, 75,
+  91, 96, 79, 83, 87, 83, 88, 84, 87, 91,
+  85, 85, 79, 86, 78, 78, 87, 80, 79, 86,
+  100, 89, 91, 95, 72, 77, 74, 81, 84, 77,
+  99, 93, 81, 80, 71, 70, 81, 72, 80, 89,
+  94, 85, 95, 74, 82, 82, 101, 96, 85, 94,
+  78, 83, 89, 82, 102, 92, 79, 70, 89, 76,
+  80, 77, 80, 94, 91, 87, 82, 76, 79, 98,
+  89, 74, 76, 83, 86, 74, 91, 92, 91, 83,
+  71, 73, 89, 60, 82, 106, 81, 79, 87, 73,
+  91, 83, 83, 92, 90, 85, 73, 76, 71, 75,
+  70, 92, 83, 81, 81, 80, 67, 89, 78, 69,
+  82, 91, 82, 71, 91, 80, 82, 76, 81, 74,
+  80, 82, 78, 86, 86, 95, 89, 75, 93, 92,
+  81, 101, 89, 75, 83, 93, 97, 86, 74, 86,
+  82, 89, 82, 76, 91, 76, 78, 83, 118, 85,
+  113, 92, 77, 76, 65, 88, 76, 65, 124, 88,
+  88, 69, 66, 43, 77, 63, 84, 107, 82, 71,
+  80, 71, 66, 87, 96, 81, 81, 77, 74, 99,
+  97, 97, 95, 88, 98, 114, 93, 75, 83, 78,
+  85, 74, 89, 101, 82, 88, 75, 115, 79, 91,
+  51, 106, 42, 75, 99, 79, 79, 80, 67, 66,
+  86, 75, 77, 90, 73, 61, 112, 68, 70, 84,
+  86, 76, 83, 102, 75, 66, 86, 72, 65, 79,
+  90, 70, 91, 106, 97, 71, 69, 77, 87, 75,
+  67, 72, 91, 76, 89, 73, 81, 82, 71, 83,
+  87, 72, 80, 107, 80, 57, 108, 80, 73, 97,
+  89, 64, 92, 82, 84, 81, 81, 86, 80, 74,
+  101, 72, 75, 73, 87, 85, 86, 87, 88, 93,
+  78, 76, 80, 85, 81, 80, 100, 80, 81, 84,
+  78, 77, 83, 69, 87, 76, 92, 85, 79, 73,
+  85, 79, 90, 82, 86, 88, 74, 83, 88, 88,
+  113, 87, 97, 65, 84, 83, 84, 78, 85, 95,
+  82, 89, 88, 72, 77, 75, 88, 79, 84, 81,
+  94, 75, 86, 93, 90, 90, 73, 78, 83, 68,
+  76, 104, 79, 76, 100, 78, 102, 83, 87, 85,
+  91, 85, 80, 82, 71, 76, 76, 75, 77, 70,
+  101, 76, 70, 85, 80, 81, 85, 92, 85, 75,
+  92, 80, 100, 77, 78, 92, 87, 80, 79, 77,
+  71, 89, 87, 82, 81, 88, 82, 87, 80, 67,
+  97, 88, 92, 87, 85, 88, 89, 87, 79, 76,
+  90, 79, 83, 89, 99, 87, 79, 99, 79, 75,
+  71, 75, 84, 68, 92, 91, 77, 72, 72, 64,
+  81, 82, 85, 84, 92, 80, 89, 72, 89, 81,
+  93, 93, 91, 88, 93, 82, 90, 90, 115, 91,
+  69, 78, 90, 71, 72, 76, 77, 91, 101, 90,
+  84, 67, 83, 99, 86, 76, 80, 66, 90, 79,
+  85, 86, 94, 82, 79, 61, 91, 61, 88, 89,
+  82, 80, 95, 74, 85, 84, 82, 88, 78, 91,
+  69, 78, 71, 88, 70, 84, 81, 84, 80, 84,
+  80, 87, 91, 76, 86, 86, 88, 74, 97, 75,
+  78, 75, 76, 80, 79, 81, 79, 79, 89, 87,
+  87, 74, 96, 85, 78, 90, 88, 79, 83, 90,
+  92, 87, 80, 83, 80, 80, 92, 82, 83, 86,
+  87, 88, 105, 89, 84, 102, 78, 74, 71, 85,
+  83, 54, 108, 69, 84, 72, 71, 54, 85, 71,
+  86, 90, 86, 78, 82, 73, 78, 92, 83, 84,
+  84, 82, 82, 91, 117, 100, 117, 89, 83, 98,
+  85, 75, 84, 73, 78, 86, 102, 111, 93, 76,
+  76, 85, 83, 88, 74, 84, 64, 76, 86, 85,
+  91, 87, 69, 51, 76, 72, 88, 79, 84, 68,
+  103, 71, 80, 82, 78, 72, 75, 115, 56, 71,
+  80, 71, 77, 86, 78, 74, 83, 98, 70, 82,
+  79, 79, 93, 82, 78, 67, 98, 77, 84, 75,
+  70, 79, 73, 83, 80, 80, 82, 88, 92, 71,
+  97, 73, 74, 86, 66, 77, 103, 89, 89, 84,
+  88, 90, 80, 72, 98, 77, 77, 99, 89, 85,
+  79, 87, 74, 89, 84, 78, 76, 82, 82, 76,
+  99, 75, 81, 75, 73, 74, 84, 75, 82, 74,
+  94, 84, 79, 76, 85, 81, 83, 72, 86, 85,
+  87, 88, 89, 92, 121, 87, 93, 75, 90, 76,
+  92, 78, 76, 88, 93, 94, 87, 69, 86, 88,
+  83, 80, 87, 88, 95, 84, 85, 83, 91, 86,
+  85, 68, 88, 64, 85, 90, 85, 87, 91, 75,
+  89, 83, 83, 80, 79, 85, 83, 77, 75, 94,
+  76, 78, 76, 76, 90, 82, 84, 80, 87, 85,
+  85, 88, 84, 76, 94, 77, 98, 73, 73, 84,
+  86, 78, 74, 74, 71, 88, 82, 76, 79, 80,
+  82, 82, 83, 78, 104, 86, 89, 84, 84, 85,
+  85, 80, 94, 80, 84, 87, 80, 106, 84, 93,
+  76, 75, 75, 87, 80, 78, 74, 78, 91, 80,
+  64, 97, 80, 83, 84, 101, 75, 66, 79, 76,
+  72, 64, 90, 77, 107, 98, 92, 79, 87, 83,
+  76, 95, 95, 87, 114, 80, 79, 92, 83, 87,
+  76, 75, 88, 92, 81, 76, 94, 86, 86, 79,
+  77, 110, 87, 92, 97, 83, 74, 85, 97, 81,
+  82, 73, 93, 73, 71, 94, 108, 82, 83, 89,
+  67, 79, 74, 73, 99, 75, 84, 86, 81, 95,
+  88, 80, 89, 89, 86, 81, 89, 94, 80, 74,
+  89, 84, 83, 78, 86, 88, 95, 91, 87, 78,
+  85, 90, 80, 85, 77, 72, 77, 80, 76, 77,
+  84, 90, 49, 90, 87, 92, 83, 94, 81, 73,
+  84, 95, 74, 79, 81, 111, 68, 91, 74, 90,
+  77, 85, 76, 85, 79, 83, 95, 58, 66, 93,
+  73, 84, 78, 87, 74, 79, 88, 84, 80, 77,
+  88, 86, 79, 107, 85, 79, 84, 85, 87, 100,
+  83, 85, 115, 81, 84, 99, 81, 81, 89, 78,
+  84, 97, 85, 75, 90, 82, 87, 84, 77, 101,
+  94, 72, 85, 84, 76, 86, 81, 74, 68, 83,
+  87, 76, 69, 77, 117, 83, 84, 80, 80, 86,
+  75, 94, 90, 89, 82, 86, 83, 84, 85, 71,
+  83, 90, 61, 78, 88, 82, 85, 71, 92, 80,
+  85, 88, 88, 90, 86, 99, 84, 77, 85, 86,
+  83, 83, 84, 73, 76, 76, 80, 79, 67, 91,
+  60, 83, 90, 86, 90, 89, 81, 80, 81, 87,
+  76, 92, 79, 104, 72, 87, 83, 83, 86, 94,
+  82, 77, 78, 78, 89, 64, 78, 88, 85, 88,
+  86, 78, 82, 96, 93, 85, 83, 91, 79, 89,
+  88, 99, 84, 80, 84, 88, 79, 82, 66, 82,
+  98, 93, 87, 91, 86, 81, 91, 85, 89, 82,
+  80, 88, 91, 86, 90, 88, 81, 82, 87, 69,
+  73, 82, 93, 76, 78, 65, 78, 78, 93, 83,
+  90, 83, 93, 79, 84, 80, 91, 83, 86, 81,
+  95, 94, 91, 80, 80, 81, 86, 70, 86, 80,
+  69, 76, 79, 86, 83, 77, 82, 76, 82, 97,
+  88, 86, 75, 100, 76, 78, 86, 85, 81, 83,
+  86, 79, 78, 84, 88, 90, 63, 92, 86, 85,
+  91, 83, 99, 91, 83, 79, 86, 91, 77, 92,
+  79, 95, 85, 86, 71, 66, 80, 83, 85, 74,
+  71, 91, 78, 100, 58, 82, 75, 77, 90, 88,
+  79, 70, 78, 72, 72, 73, 98, 79, 82, 76,
+  88, 77, 81, 79, 49, 78, 74, 82, 83, 79,
+  72, 88, 75, 80, 74, 78, 90, 82, 84, 78,
+  96, 85, 87, 82, 73, 102, 86, 93, 84, 80,
+  73, 88, 109, 87, 87, 70, 100, 86, 80, 92,
+  73, 83, 78, 82, 71, 77, 85, 54, 104, 72,
+  82, 89, 73, 90, 87, 85, 88, 90, 102, 86,
+  86, 95, 77, 80, 82, 86, 81, 79, 80, 83,
+  89, 102, 89, 78, 87, 87, 83, 85, 92, 79,
+  82, 72, 76, 78, 89, 108, 66, 94, 90, 98,
+  93, 86, 81, 77, 80, 94, 76, 72, 86, 110,
+  96, 91, 79, 68, 81, 82, 79, 86, 87, 78,
+  85, 78, 63, 89, 78, 77, 82, 80, 82, 74,
+  80, 82, 82, 75, 85, 83, 64, 126, 89, 71,
+  83, 78, 78, 86, 114, 96, 111, 77, 100, 100,
+  62, 73, 80, 76, 88, 101, 87, 70, 88, 74,
+  81, 87, 83, 98, 87, 79, 72, 82, 77, 89,
+  78, 89, 57, 94, 82, 70, 73, 80, 62, 74,
+  79, 79, 78, 77, 87, 64, 87, 83, 76, 78,
+  77, 80, 93, 92, 72, 97, 71, 71, 77, 80,
+  88, 80, 87, 82, 90, 84, 93, 84, 90, 102,
+  89, 78, 77, 87, 73, 83, 87, 78, 88, 81,
+  77, 67, 74, 90, 57, 89, 96, 92, 99, 79,
+  82, 77, 78, 83, 82, 86, 85, 109, 119, 93,
+  93, 106, 84, 89, 83, 85, 90, 72, 89, 75,
+  82, 88, 92, 87, 86, 81, 87, 98, 102, 85,
+  91, 91, 71, 89, 83, 148, 91, 82, 86, 80,
+  94, 96, 96, 82, 98, 83, 96, 94, 70, 77,
+  91, 90, 92, 123, 81, 85, 81, 74, 81, 86,
+  94, 54, 81, 74, 67, 81, 91, 77, 63, 58,
+  56, 85, 75, 76, 80, 69, 70, 82, 81, 81,
+  93, 83, 92, 64, 61, 91, 83, 68, 84, 101,
+  91, 87, 77, 89, 56, 74, 81, 66, 86, 83,
+  82, 77, 87, 93, 83, 77, 84, 87, 78, 80,
+  81, 77, 75, 80, 80, 84, 98, 90, 82, 79,
+  53, 76, 78, 90, 92, 81, 93, 92, 86, 79,
+  79, 78, 82, 100, 86, 87, 92, 92, 72, 90,
+  80, 81, 89, 75, 66, 84, 84, 97, 71, 75,
+  80, 79, 94, 81, 78, 88, 79, 76, 82, 89,
+  86, 89, 90, 75, 87, 79, 72, 82, 70, 90,
+  58, 91, 72, 88, 73, 82, 76, 82, 81, 82,
+  82, 91, 87, 79, 93, 91, 82, 80, 78, 86,
+  87, 83, 83, 86, 85, 82, 94, 86, 94, 74,
+  86, 94, 78, 77, 78, 83, 82, 83, 79, 78,
+  86, 82, 84, 78, 87, 84, 73, 95, 87, 85,
+  93, 90, 100, 92, 82, 91, 80, 82, 90, 77,
+  83, 76, 76, 73, 87, 90, 86, 73, 94, 84,
+  89, 88, 88, 80, 93, 68, 82, 84, 81, 101,
+  101, 88, 84, 88, 92, 91, 84, 89, 76, 94,
+  79, 71, 85, 75, 77, 92, 81, 69, 76, 80,
+  80, 82, 83, 73, 86, 95, 86, 82, 85, 82,
+  84, 79, 87, 81, 63, 84, 85, 87, 88, 79,
+  75, 84, 79, 66, 83, 80, 78, 69, 83, 92,
+  79, 84, 83, 80, 69, 82, 80, 82, 83, 65,
+  87, 82, 84, 84, 86, 85, 87, 92, 80, 86,
+  77, 86, 85, 92, 90, 97, 77, 86, 93, 85,
+  79, 89, 63, 73, 87, 84, 80, 76, 89, 72,
+  96, 79, 84, 79, 76, 68, 96, 87, 78, 86,
+  89, 81, 71, 95, 81, 87, 84, 81, 84, 87,
+  86, 79, 79, 78, 81, 74, 91, 94, 73, 88,
+  77, 84, 96, 83, 81, 66, 82, 104, 72, 88,
+  87, 83, 104, 80, 79, 85, 84, 91, 78, 80,
+  83, 83, 102, 94, 88, 63, 82, 91, 85, 87,
+  93, 74, 83, 90, 95, 101, 92, 88, 90, 82,
+  93, 87, 79, 90, 88, 92, 84, 86, 81, 142,
+  82, 70, 99, 80, 96, 69, 122, 95, 83, 84,
+  95, 77, 66, 82, 89, 90, 89, 88, 82, 89,
+  76, 77, 83, 88, 103, 57, 88, 91, 75, 83,
+  91, 84, 77, 87, 70, 87, 78, 84, 77, 94,
+  39, 75, 91, 86, 93, 89, 88, 68, 76, 82,
+  88, 66, 86, 82, 98, 89, 64, 74, 77, 82,
+  72, 88, 85, 87, 81, 85, 85, 93, 82, 85,
+  87, 73, 75, 78, 89, 93, 72, 86, 68, 93,
+  103, 92, 87, 68, 81, 83, 63, 91, 93, 83,
+  88, 86, 76, 85, 85, 83, 78, 101, 91, 123,
+  66, 92, 87, 82, 81, 84, 81, 82, 82, 74,
+  88, 76, 70, 62, 75, 84, 85, 84, 74, 85,
+  82, 89, 79, 81, 102, 88, 98, 90, 95, 102,
+  67, 89, 76, 81, 113, 84, 80, 93, 86, 72,
+  102, 67, 89, 80, 90, 99, 68, 79, 76, 88,
+  87, 81, 71, 83, 64, 70, 68, 88, 101, 82,
+  89, 84, 75, 72, 69, 91, 78, 100, 78, 89,
+  81, 82, 90, 68, 86, 68, 109, 79, 80, 93,
+  85, 93, 88, 86, 96, 88, 74, 105, 77, 98,
+  92, 82, 87, 76, 92, 86, 88, 75, 87, 76,
+  94, 85, 81, 82, 83, 74, 91, 81, 95, 70,
+  85, 100, 89, 90, 72, 85, 78, 100, 88, 81,
+  83, 78, 89, 91, 79, 89, 81, 101, 39, 90,
+  90, 90, 67, 85, 95, 87, 75, 72, 75, 47,
+  65, 75, 77, 81, 82, 83, 70, 77, 75, 90,
+  84, 75, 101, 94, 125, 65, 69, 95, 53, 97,
+  81, 80, 112, 78, 82, 82, 81, 78, 104, 69,
+  84, 97, 89, 91, 72, 75, 70, 92, 88, 69,
+  89, 96, 64, 60, 74, 85, 85, 74, 85, 71,
+  49, 54, 45, 81, 83, 95, 117, 92, 76, 77,
+  96, 70, 89, 88, 117, 72, 80, 79, 95, 81,
+  98, 75, 87, 96, 61, 83, 72, 115, 79, 69,
+  107, 71, 85, 75, 97, 77, 80, 130, 94, 85,
+  83, 69, 79, 85, 76, 73, 78, 57, 77, 95,
+  82, 88, 72, 74, 73, 83, 65, 73, 77, 76,
+  90, 82, 82, 69, 75, 78, 44, 75, 73, 102,
+  73, 103, 76, 90, 79, 65, 61, 64, 75, 80,
+  91, 97, 90, 91, 83, 74, 71, 94, 81, 89,
+  87, 85, 110, 55, 68, 83, 87, 90, 64, 76,
+  74, 84, 56, 84, 80, 84, 85, 77, 86, 102,
+  76, 70, 88, 83, 85, 80, 84, 73, 109, 67,
+  101, 73, 85, 70, 72, 85, 85, 72, 31, 72,
+  73, 74, 95, 76, 98, 74, 109, 89, 81, 98,
+  75, 89, 74, 86, 82, 88, 95, 84, 94, 73,
+  91, 89, 69, 74, 112, 94, 74, 88, 120, 74,
+  89, 80, 83, 80, 58, 140, 81, 90, 76, 69,
+  75, 81, 70, 81, 78, 69, 84, 78, 72, 95,
+  60, 83, 89, 77, 75, 83, 90, 86, 95, 76,
+  82, 86, 90, 94, 73, 85, 84, 78, 86, 77,
+  71, 74, 87, 82, 78, 87, 93, 75, 87, 90,
+  89, 90, 79, 80, 84, 85, 77, 76, 91, 82,
+  79, 93, 101, 100, 94, 84, 98, 73, 91, 88,
+  88, 77, 83, 74, 92, 80, 83, 75, 93, 75,
+  71, 75, 71, 85, 89, 89, 79, 86, 63, 84,
+  78, 85, 99, 86, 90, 86, 83, 91, 87, 87,
+  77, 84, 78, 78, 77, 95, 84, 71, 80, 94,
+  93, 76, 91, 83, 79, 82, 84, 87, 97, 86,
+  97, 91, 88, 75, 97, 87, 72, 81, 87, 94,
+  84, 80, 74, 64, 82, 80, 75, 99, 92, 89,
+  74, 84, 84, 94, 84, 84, 86, 93, 74, 95,
+  82, 100, 80, 88, 67, 74, 79, 82, 79, 109,
+  84, 114, 79, 95, 98, 75, 86, 68, 93, 78,
+  84, 82, 84, 85, 94, 83, 82, 78, 93, 79,
+  72, 62, 92, 91, 90, 82, 79, 101, 87, 85,
+  103, 98, 80, 90, 90, 68, 95, 94, 84, 78,
+  94, 82, 102, 67, 73, 75, 105, 89, 67, 83,
+  76, 87, 85, 82, 77, 72, 45, 81, 73, 99,
+  91, 63, 83, 78, 79, 70, 75, 85, 72, 83,
+  64, 99, 65, 88, 88, 65, 95, 82, 96, 75,
+  86, 92, 86, 88, 89, 97, 86, 86, 81, 87,
+  78, 79, 97, 95, 63, 81, 90, 93, 103, 68,
+  76, 68, 89, 80, 78, 78, 94, 96, 84, 79,
+  90, 87, 74, 90, 94, 89, 75, 91, 84, 88,
+  85, 81, 82, 76, 78, 83, 87, 87, 77, 106,
+  62, 88, 72, 122, 71, 76, 88, 94, 74, 64,
+  65, 70, 70, 71, 87, 76, 85, 99, 78, 75,
+  103, 95, 84, 83, 86, 88, 101, 84, 78, 96,
+  69, 83, 67, 101, 101, 78, 84, 75, 85, 91,
+  90, 69, 77, 96, 88, 136, 87, 76, 74, 67,
+  85, 66, 100, 64, 75, 64, 73, 79, 85, 78,
+  91, 67, 49, 64, 59, 84, 91, 79, 98, 101,
+  81, 83, 89, 82, 79, 81, 89, 78, 79, 87,
+  101, 95, 94, 88, 96, 100, 71, 72, 86, 79,
+  77, 77, 92, 63, 86, 78, 92, 69, 72, 136,
+  92, 89, 74, 72, 79, 82, 77, 63, 72, 83,
+  69, 95, 76, 97, 84, 84, 80, 68, 73, 70,
+  84, 71, 87, 72, 85, 81, 86, 91, 85, 85,
+  80, 81, 77, 82, 74, 91, 81, 100, 83, 85,
+  82, 78, 94, 77, 78, 95, 78, 82, 92, 80,
+  76, 74, 101, 76, 79, 94, 89, 86, 93, 78,
+  85, 80, 81, 79, 98, 77, 79, 85, 90, 93,
+  83, 77, 87, 74, 85, 81, 78, 94, 94, 89,
+  85, 88, 83, 82, 94, 88, 85, 93, 86, 89,
+  79, 96, 90, 93, 84, 87, 80, 77, 76, 90,
+  92, 72, 79, 77, 76, 73, 97, 89, 94, 93,
+  79, 83, 87, 87, 90, 86, 95, 70, 93, 77,
+  72, 82, 81, 80, 88, 85, 73, 84, 77, 84,
+  88, 94, 92, 79, 91, 80, 80, 88, 80, 85,
+  83, 84, 85, 87, 89, 92, 73, 94, 69, 74,
+  97, 82, 87, 84, 85, 94, 98, 89, 91, 83,
+  82, 74, 82, 85, 75, 95, 96, 94, 83, 76,
+  88, 73, 77, 82, 81, 83, 95, 85, 70, 74,
+  88, 91, 81, 82, 86, 83, 92, 84, 85, 78,
+  84, 85, 88, 83, 86, 85, 91, 72, 75, 71,
+  86, 78, 91, 84, 80, 93, 89, 82, 81, 76,
+  70, 84, 83, 82, 83, 86, 81, 77, 86, 89,
+  92, 81, 78, 93, 87, 90, 73, 81, 83, 68,
+  84, 89, 74, 81, 89, 82, 91, 96, 80, 93,
+  85, 90, 77, 93, 91, 76, 94, 85, 71, 82,
+  84, 79, 90, 90, 74, 70, 80, 83, 82, 87,
+  85, 85, 95, 73, 85, 89, 79, 82, 94, 84,
+  90, 85, 88, 88, 80, 89, 79, 77, 94, 86,
+  85, 79, 76, 105, 87, 88, 88, 94, 80, 79,
+  90, 89, 80, 82, 76, 91, 62, 69, 80, 76,
+  84, 83, 96, 89, 108, 93, 77, 82, 79, 89,
+  86, 86, 82, 84, 76, 78, 69, 90, 88, 90,
+  83, 85, 101, 84, 98, 72, 82, 88, 87, 116,
+  90, 78, 87, 72, 81, 72, 88, 70, 76, 77,
+  77, 77, 84, 76, 94, 70, 66, 84, 87, 82,
+  94, 78, 83, 98, 77, 80, 87, 76, 86, 94,
+  72, 83, 86, 85, 93, 95, 85, 92, 91, 97,
+  79, 90, 88, 77, 85, 81, 84, 75, 84, 78,
+  99, 84, 75, 77, 86, 87, 73, 77, 80, 85,
+  93, 66, 77, 86, 78, 83, 82, 88, 104, 84,
+  85, 78, 81, 76, 86, 78, 91, 83, 86, 80,
+  104, 107, 89, 83, 44, 92, 83, 84, 83, 83,
+  84, 98, 86, 96, 86, 78, 86, 106, 90, 95,
+  81, 77, 89, 85, 82, 89, 93, 87, 90, 85,
+  82, 89, 83, 76, 73, 78, 90, 87, 68, 75,
+  81, 68, 83, 76, 93, 82, 77, 73, 68, 80,
+  85, 88, 96, 90, 94, 76, 84, 88, 80, 77,
+  89, 63, 112, 88, 90, 85, 84, 88, 81, 76,
+  74, 84, 81, 84, 81, 88, 64, 72, 89, 76,
+  89, 115, 80, 85, 82, 89, 78, 83, 100, 94,
+  73, 90, 84, 83, 84, 83, 89, 95, 81, 88,
+  74, 86, 86, 76, 82, 75, 81, 67, 88, 92,
+  81, 75, 76, 80, 90, 80, 80, 83, 62, 81,
+  80, 81, 83, 76, 81, 82, 88, 78, 99, 102,
+  63, 79, 65, 88, 80, 84, 81, 85, 86, 95,
+  92, 53, 85, 82, 86, 93, 89, 88, 84, 70,
+  76, 97, 88, 81, 92, 86, 88, 83, 82, 89,
+  85, 80, 82, 83, 86, 79, 114, 76, 77, 76,
+  72, 80, 93, 84, 87, 65, 74, 76, 78, 89,
+  88, 87, 92, 83, 79, 78, 87, 85, 82, 71,
+  106, 71, 61, 86, 78, 84, 83, 80, 81, 80,
+  76, 79, 81, 84, 75, 80, 92, 78, 76, 104,
+  76, 86, 81, 78, 75, 93, 85, 91, 71, 87,
+  85, 90, 81, 87, 85, 89, 71, 90, 71, 102,
+  85, 81, 83, 75, 82, 75, 89, 87, 80, 75,
+  78, 76, 76, 87, 69, 87, 73, 84, 82, 87,
+  77, 76, 82, 85, 89, 101, 81, 94, 86, 78,
+  138, 93, 71, 87, 76, 85, 92, 76, 80, 82,
+  70, 91, 82, 73, 86, 70, 76, 87, 82, 101,
+  79, 76, 70, 84, 77, 93, 93, 86, 79, 91,
+  101, 104, 86, 78, 92, 92, 78, 83, 78, 79,
+  100, 88, 100, 90, 98, 76, 78, 89, 72, 92,
+  87, 67, 80, 82, 91, 83, 86, 97, 88, 70,
+  61, 94, 67, 74, 100, 72, 68, 74, 79, 80,
+  95, 82, 87, 98, 92, 83, 76, 83, 83, 95,
+  91, 80, 73, 120, 72, 85, 66, 88, 93, 90,
+  88, 87, 90, 67, 72, 88, 75, 94, 78, 82,
+  81, 65, 77, 86, 86, 76, 95, 86, 77, 80,
+  69, 85, 91, 92, 87, 79, 87, 93, 67, 84,
+  83, 89, 80, 110, 92, 90, 87, 88, 40, 94,
+  98, 76, 85, 81, 83, 81, 78, 66, 98, 85,
+  99, 111, 75, 86, 75, 75, 84, 92, 82, 88,
+  93, 81, 97, 85, 91, 88, 99, 72, 79, 81,
+  86, 88, 63, 71, 76, 78, 77, 77, 86, 85,
+  82, 78, 65, 79, 77, 79, 96, 87, 95, 68,
+  79, 77, 82, 108, 86, 72, 79, 88, 85, 86,
+  77, 115, 84, 84, 86, 85, 75, 88, 85, 95,
+  81, 89, 80, 76, 93, 68, 83, 74, 84, 86,
+  84, 75, 71, 89, 94, 90, 85, 89, 81, 78,
+  82, 102, 90, 86, 69, 108, 86, 77, 93, 85,
+  97, 76, 77, 93, 84, 87, 73, 87, 77, 88,
+  87, 89, 78, 81, 83, 84, 77, 82, 76, 81,
+  86, 79, 87, 86, 68, 83, 76, 83, 84, 76,
+  85, 85, 85, 89, 83, 61, 87, 87, 95, 91,
+  74, 84, 79, 75, 73, 98, 77, 79, 92, 81,
+  93, 83, 82, 91, 89, 78, 62, 86, 75, 86,
+  93, 70, 73, 86, 68, 81, 87, 82, 88, 78,
+  78, 79, 78, 80, 98, 85, 88, 74, 84, 73,
+  83, 105, 87, 77, 75, 70, 61, 81, 76, 95,
+  85, 78, 73, 84, 71, 86, 86, 88, 86, 77,
+  73, 83, 82, 71, 82, 86, 84, 76, 80, 83,
+  72, 89, 85, 83, 80, 100, 76, 81, 81, 93,
+  79, 91, 72, 113, 84, 81, 93, 77, 96, 84,
+  84, 92, 81, 85, 76, 85, 79, 79, 71, 86,
+  78, 80, 82, 82, 83, 82, 79, 80, 84, 91,
+  71, 86, 81, 75, 156, 89, 66, 84, 80, 79,
+  94, 79, 82, 91, 67, 90, 84, 69, 70, 74,
+  74, 99, 83, 93, 80, 67, 70, 77, 89, 80,
+  85, 87, 79, 99, 83, 111, 83, 85, 97, 111,
+  81, 89, 85, 85, 101, 80, 103, 81, 110, 79,
+  81, 91, 74, 94, 76, 81, 85, 79, 85, 84,
+  81, 90, 81, 65, 58, 85, 69, 66, 97, 67,
+  76, 76, 73, 84, 99, 81, 91, 95, 79, 87,
+  82, 74, 88, 96, 91, 85, 74, 106, 77, 75,
+  70, 78, 82, 85, 81, 84, 84, 62, 76, 89,
+  78, 79, 78, 83, 80, 66, 80, 91, 79, 80,
+  85, 97, 81, 88, 72, 75, 93, 83, 78, 74,
+  83, 83, 69, 87, 91, 86, 74, 95, 79, 91,
+  86, 92, 54, 82, 98, 85, 86, 84, 77, 86,
+  72, 61, 100, 100, 96, 95, 71, 77, 82, 74,
+  80, 81, 76, 92, 89, 78, 87, 89, 84, 88,
+  101, 84, 81, 88, 98, 85, 76, 79, 84, 79,
+  77, 89, 79, 89, 71, 79, 67, 78, 69, 87,
+  84, 90, 89, 77, 83, 89, 86, 93, 73, 73,
+  86, 87, 93, 83, 68, 106, 77, 88, 101, 81,
+  88, 86, 86, 100, 89, 74, 88, 70, 88, 87,
+  86, 73, 80, 81, 89, 73, 87, 83, 86, 83,
+  91, 90, 86, 86, 86, 88, 90, 84, 84, 102,
+  90, 78, 98, 90, 91, 84, 70, 76, 87, 87,
+  83, 89, 94, 74, 72, 99, 95, 91, 82, 83,
+  75, 88, 77, 92, 78, 67, 74, 90, 86, 86,
+  88, 79, 86, 76, 80, 80, 83, 87, 75, 97,
+  84, 93, 88, 78, 68, 87, 84, 85, 73, 85,
+  69, 81, 83, 76, 84, 104, 79, 88, 91, 83,
+  65, 89, 95, 82, 79, 81, 89, 83, 66, 93,
+  84, 85, 72, 68, 87, 79, 78, 94, 83, 88,
+  80, 71, 83, 83, 83, 97, 78, 79, 85, 68,
+  72, 79, 82, 85, 80, 87, 82, 81, 77, 92,
+  88, 81, 86, 72, 74, 83, 81, 87, 83, 81,
+  84, 89, 81, 82, 85, 79, 72, 77, 81, 92,
+  76, 88, 81, 78, 86, 88, 84, 90, 83, 80,
+  92, 84, 84, 89, 81, 78, 90, 87, 84, 88,
+  93, 74, 72, 84, 80, 89, 83, 84, 79, 85,
+  82, 90, 79, 80, 69, 94, 89, 81, 143, 91,
+  66, 82, 81, 79, 89, 73, 76, 105, 60, 86,
+  75, 64, 72, 74, 74, 105, 90, 89, 78, 72,
+  73, 76, 77, 84, 80, 87, 80, 92, 85, 105,
+  96, 81, 91, 108, 91, 85, 83, 88, 98, 84,
+  86, 79, 111, 87, 79, 88, 68, 93, 79, 77,
+  81, 75, 88, 83, 82, 85, 85, 71, 67, 74,
+  78, 63, 88, 87, 93, 74, 74, 92, 95, 77,
+  86, 99, 73, 91, 80, 75, 90, 91, 85, 100,
+  77, 105, 80, 68, 68, 83, 87, 81, 83, 81,
+  90, 64, 83, 89, 89, 75, 80, 81, 88, 74,
+  75, 85, 83, 73, 91, 104, 89, 91, 70, 79,
+  91, 81, 83, 87, 91, 81, 71, 86, 93, 94,
+  77, 95, 80, 85, 75, 77, 79, 74, 81, 78,
+  71, 85, 76, 79, 81, 83, 73, 78, 79, 81,
+  76, 86, 91, 74, 67, 82, 77, 86, 84, 88,
+  84, 82, 84, 76, 83, 81, 80, 71, 86, 78,
+  78, 81, 78, 71, 81, 83, 84, 82, 64, 69,
+  87, 80, 88, 94, 76, 82, 79, 89, 76, 76,
+  88, 82, 72, 74, 93, 67, 88, 76, 86, 81,
+  81, 88, 69, 80, 91, 85, 74, 85, 75, 83,
+  85, 93, 78, 84, 76, 87, 73, 79, 81, 70,
+  89, 82, 88, 90, 83, 84, 80, 85, 80, 81,
+  81, 88, 87, 72, 78, 81, 77, 85, 78, 78,
+  85, 76, 80, 72, 77, 83, 85, 86, 78, 82,
+  75, 91, 86, 85, 96, 77, 92, 77, 80, 83,
+  80, 90, 89, 78, 81, 67, 81, 73, 73, 89,
+  75, 82, 91, 85, 76, 78, 77, 77, 75, 79,
+  84, 70, 70, 86, 87, 86, 83, 85, 103, 80,
+  92, 81, 80, 75, 78, 70, 87, 76, 84, 78,
+  79, 63, 83, 86, 77, 82, 70, 69, 84, 84,
+  82, 106, 85, 81, 85, 93, 75, 78, 87, 79,
+  80, 75, 89, 75, 80, 76, 80, 77, 77, 88,
+  81, 70, 79, 84, 77, 78, 71, 77, 89, 81,
+  79, 79, 81, 78, 74, 78, 74, 81, 91, 83,
+  85, 89, 87, 83, 80, 74, 81, 82, 80, 88,
+  86, 81, 72, 78, 75, 82, 73, 81, 86, 75,
+  76, 72, 76, 74, 82, 79, 69, 78, 79, 83,
+  81, 84, 99, 74, 93, 72, 80, 79, 80, 88,
+  80, 77, 76, 71, 85, 87, 71, 86, 76, 83,
+  75, 80, 76, 79, 77, 80, 77, 86, 84, 71,
+  74, 81, 86, 88, 88, 86, 79, 84, 86, 83,
+  81, 76, 75, 88, 93, 82, 75, 80, 81, 71,
+  83, 81, 83, 83, 72, 83, 88, 77, 89, 84,
+  74, 84, 83, 83, 78, 77, 84, 81, 77, 75,
+  90, 65, 88, 76, 83, 83, 80, 86, 76, 79,
+  93, 82, 79, 84, 77, 75, 89, 90, 82, 85,
+  73, 75, 77, 77, 86, 67, 87, 82, 88, 88,
+  83, 85, 82, 86, 83, 80, 74, 85, 83, 90,
+  79, 83, 81, 82, 80, 77, 82, 74, 79, 75,
+  80, 81, 83, 81, 73, 81, 77, 87, 85, 87,
+  90, 76, 85, 75, 84, 82, 99, 101, 105, 90,
+  92, 109, 55, 68, 80, 89, 84, 88, 124, 93,
+  74, 81, 87, 79, 87, 95, 90, 107, 103, 86,
+  85, 67, 77, 96, 172, 84, 87, 101, 90, 98,
+  96, 93, 74, 92, 88, 90, 84, 73, 91, 86,
+  88, 106, 72, 91, 70, 94, 77, 103, 71, 79,
+  73, 78, 67, 57, 95, 90, 84, 89, 79, 42,
+  78, 68, 81, 92, 77, 71, 99, 73, 91, 84,
+  84, 81, 77, 105, 66, 84, 72, 90, 86, 119,
+  66, 89, 95, 102, 59, 83, 90, 76, 84, 85,
+  96, 88, 81, 77, 88, 81, 108, 84, 85, 76,
+  91, 75, 105, 80, 91, 77, 76, 77, 74, 105,
+  65, 96, 96, 89, 77, 71, 79, 85, 94, 70,
+  92, 83, 91, 87, 100, 95, 100, 88, 92, 105,
+  59, 59, 77, 91, 80, 90, 139, 91, 79, 70,
+  79, 73, 77, 89, 88, 100, 109, 86, 92, 72,
+  76, 89, 173, 84, 96, 93, 80, 93, 94, 93,
+  79, 82, 92, 85, 86, 70, 90, 89, 81, 99,
+  71, 97, 68, 94, 74, 119, 80, 72, 74, 90,
+  70, 55, 92, 93, 85, 88, 75, 55, 77, 71,
+  74, 92, 72, 71, 110, 66, 75, 79, 85, 76,
+  74, 106, 73, 75, 68, 83, 87, 96, 71, 86,
+  94, 108, 63, 79, 74, 81, 92, 90, 92, 77,
+  79, 77, 87, 81, 106, 91, 81, 72, 88, 75,
+  91, 81, 84, 72, 74, 78, 66, 97, 66, 85,
+  99, 85, 83, 71, 86, 81, 89, 66, 93, 81,
+  86, 83, 98, 92, 86, 90, 84, 94, 68, 81,
+  80, 92, 86, 86, 111, 81, 78, 80, 81, 80,
+  89, 87, 89, 99, 101, 85, 92, 75, 76, 96,
+  139, 87, 87, 94, 91, 89, 79, 105, 75, 91,
+  84, 88, 80, 75, 85, 82, 85, 103, 77, 102,
+  75, 95, 76, 100, 70, 80, 80, 76, 68, 64,
+  89, 91, 85, 84, 80, 46, 80, 76, 81, 92,
+  81, 64, 97, 74, 92, 79, 89, 85, 78, 95,
+  70, 83, 81, 93, 80, 77, 72, 83, 100, 87,
+  63, 79, 85, 81, 83, 90, 96, 88, 85, 76,
+  84, 79, 96, 93, 85, 77, 93, 75, 100, 75,
+  86, 77, 74, 78, 76, 97, 62, 89, 105, 89,
+  81, 71, 95, 83, 94, 71, 89, 82, 92, 86,
+  83, 79, 84, 87, 74, 82, 80, 81, 78, 80,
+  82, 77, 91, 91, 77, 86, 87, 79, 85, 81,
+  83, 82, 75, 81, 76, 83, 82, 87, 121, 72,
+  90, 88, 79, 89, 85, 69, 75, 79, 74, 98,
+  89, 77, 79, 76, 75, 77, 77, 68, 78, 80,
+  89, 100, 80, 81, 85, 81, 76, 80, 81, 79,
+  80, 72, 84, 70, 80, 77, 85, 71, 82, 86,
+  76, 72, 88, 85, 76, 81, 77, 85, 78, 84,
+  78, 89, 82, 89, 80, 83, 77, 87, 91, 84,
+  85, 94, 81, 82, 87, 74, 84, 81, 82, 91,
+  94, 78, 82, 77, 77, 87, 69, 87, 82, 79,
+  82, 75, 78, 82, 91, 83, 80, 75, 81, 75,
+  80, 81, 88, 81, 75, 87, 83, 81, 86, 85,
+  87, 88, 75, 68, 78, 75, 82, 82, 81, 78,
+  95, 84, 81, 81, 83, 74, 77, 80, 80, 72,
+  84, 84, 78, 85, 81, 83, 132, 78, 92, 91,
+  80, 78, 85, 64, 75, 72, 81, 87, 93, 69,
+  84, 76, 77, 80, 72, 70, 74, 81, 92, 108,
+  86, 79, 91, 93, 79, 79, 79, 78, 80, 74,
+  77, 77, 72, 73, 80, 72, 76, 82, 81, 61,
+  82, 82, 78, 81, 75, 79, 82, 77, 75, 85,
+  84, 81, 83, 83, 71, 91, 86, 85, 84, 94,
+  87, 87, 84, 65, 85, 83, 81, 92, 92, 84,
+  76, 73, 72, 87, 62, 86, 83, 76, 85, 74,
+  74, 72, 84, 78, 71, 75, 85, 73, 79, 78,
+  90, 80, 77, 89, 80, 76, 82, 86, 85, 92,
+  74, 68, 84, 88, 81, 84, 81, 77, 83, 74,
+  78, 85, 84, 78, 83, 85, 80, 75, 90, 81,
+  80, 84, 83, 89, 113, 81, 87, 89, 82, 80,
+  72, 80, 82, 80, 80, 96, 87, 74, 80, 78,
+  76, 81, 80, 84, 78, 80, 89, 93, 78, 82,
+  86, 87, 78, 81, 78, 78, 79, 70, 80, 65,
+  88, 75, 82, 72, 78, 83, 77, 70, 93, 84,
+  84, 80, 79, 78, 80, 81, 83, 91, 83, 79,
+  81, 81, 78, 77, 87, 79, 82, 94, 80, 81,
+  86, 74, 82, 79, 82, 88, 91, 87, 81, 79,
+  75, 85, 74, 86, 78, 75, 81, 76, 78, 78,
+  85, 77, 78, 75, 81, 75, 83, 80, 81, 82,
+  75, 91, 83, 75, 78, 86, 85, 96, 76, 76,
+  75, 76, 96, 82, 67, 80, 84, 73, 87, 73,
+  81, 81, 61, 85, 98, 85, 87, 88, 86, 106,
+  89, 70, 104, 91, 78, 79, 98, 80, 75, 97,
+  88, 79, 85, 87, 108, 81, 99, 90, 71, 98,
+  100, 96, 82, 101, 93, 89, 82, 88, 72, 86,
+  91, 74, 83, 80, 80, 83, 86, 73, 88, 68,
+  85, 91, 87, 92, 84, 81, 83, 79, 90, 75,
+  79, 88, 85, 87, 80, 78, 75, 70, 85, 86,
+  90, 81, 87, 87, 102, 79, 66, 68, 85, 80,
+  82, 84, 83, 77, 82, 82, 67, 61, 83, 73,
+  93, 88, 92, 72, 99, 80, 84, 83, 78, 96,
+  77, 68, 78, 109, 105, 86, 92, 63, 96, 77,
+  77, 91, 82, 89, 85, 97, 86, 74, 71, 72,
+  111, 72, 53, 80, 89, 79, 88, 67, 76, 79,
+  38, 83, 107, 93, 68, 90, 79, 105, 102, 64,
+  102, 84, 71, 83, 106, 83, 83, 80, 89, 74,
+  81, 84, 102, 77, 105, 85, 70, 109, 110, 76,
+  75, 109, 87, 94, 95, 83, 74, 89, 90, 78,
+  79, 77, 79, 92, 90, 74, 82, 68, 86, 81,
+  89, 91, 91, 70, 82, 84, 82, 61, 80, 76,
+  93, 88, 85, 74, 85, 85, 77, 87, 89, 71,
+  87, 98, 96, 76, 53, 57, 78, 70, 52, 84,
+  86, 74, 85, 82, 62, 57, 82, 77, 95, 93,
+  98, 82, 100, 85, 71, 82, 84, 95, 77, 62,
+  83, 116, 102, 88, 89, 61, 104, 85, 65, 101,
+  80, 79, 84, 90, 77, 89, 78, 77, 89, 83,
+  73, 78, 80, 83, 87, 74, 79, 81, 68, 86,
+  95, 84, 72, 86, 83, 102, 90, 68, 96, 80,
+  76, 79, 90, 94, 80, 80, 83, 79, 78, 88,
+  98, 81, 93, 85, 79, 89, 88, 86, 84, 95,
+  89, 84, 80, 87, 75, 79, 91, 74, 80, 83,
+  79, 84, 84, 71, 90, 71, 89, 89, 84, 86,
+  91, 83, 76, 81, 83, 76, 78, 91, 89, 87,
+  74, 80, 83, 101, 87, 80, 87, 82, 87, 94,
+  101, 80, 71, 68, 85, 80, 87, 85, 87, 80,
+  83, 90, 71, 62, 85, 71, 95, 89, 96, 70,
+  93, 90, 85, 88, 78, 89, 81, 73, 79, 105,
+  79, 85, 87, 65, 94, 82, 82, 88, 78, 83,
+  79, 87, 83, 90, 73, 77, 119, 76, 67, 85,
+  85, 81, 86, 73, 92, 86, 47, 83, 104, 89,
+  87, 87, 79, 97, 85, 66, 100, 87, 72, 74,
+  107, 72, 76, 104, 87, 72, 85, 86, 88, 83,
+  104, 88, 78, 103, 103, 111, 83, 106, 87, 85,
+  84, 88, 73, 87, 95, 74, 82, 79, 77, 89,
+  80, 70, 83, 74, 84, 93, 92, 74, 86, 80,
+  84, 81, 82, 75, 88, 99, 75, 88, 87, 73,
+  76, 66, 84, 90, 88, 81, 84, 78, 97, 90,
+  58, 62, 88, 77, 72, 84, 83, 82, 88, 95,
+  69, 62, 80, 88, 87, 82, 84, 73, 90, 79,
+  83, 82, 80, 92, 80, 71, 82, 103, 102, 83,
+  89, 61, 95, 82, 67, 99, 80, 90, 83, 88,
+  89, 78, 68, 83, 148, 63, 56, 86, 92, 77,
+  84, 73, 94, 90, 22, 77, 111, 93, 72, 87,
+  72, 96, 98, 59, 110, 80, 64, 75, 122, 70,
+  81, 84, 82, 72, 83, 85, 78, 74, 110, 81,
+  81, 119, 118, 82, 74, 119, 84, 82, 106, 86,
+  75, 87, 97, 77, 77, 71, 69, 97, 81, 72,
+  64, 73, 95, 79, 96, 72, 80, 64, 92, 87,
+  70, 61, 89, 87, 81, 91, 97, 71, 93, 92,
+  75, 88, 87, 63, 86, 87, 96, 85, 41, 48,
+  75, 66, 41, 79, 88, 76, 82, 85, 61, 57,
+  76, 94, 92, 86, 82, 83, 90, 80, 68, 83,
+  87, 93, 84, 66, 88, 105, 93, 84, 89, 59,
+  98, 83, 52, 110, 85, 81, 86, 82, 85, 88,
+  74, 78, 104, 79, 73, 82, 78, 81, 85, 74,
+  89, 87, 57, 88, 94, 88, 84, 85, 81, 98,
+  83, 68, 92, 79, 77, 76, 97, 90, 83, 85,
+  88, 76, 82, 84, 85, 81, 95, 84, 86, 89,
+  90, 87, 85, 96, 82, 84, 83, 85, 73, 79,
+  90, 75, 84, 84, 80, 88, 80, 69, 86, 78,
+  100, 89, 84, 79, 87, 87, 75, 87, 77, 71,
+  84, 100, 78, 86, 82, 77, 83, 115, 86, 86,
+  84, 84, 83, 86, 94, 80, 67, 68, 83, 80,
+  80, 86, 82, 80, 87, 80, 73, 65, 84, 81,
+  91, 83, 86, 69, 87, 86, 84, 89, 85, 89,
+  88, 77, 79, 100, 70, 86, 85, 66, 89, 83,
+  74, 90, 81, 83, 74, 89, 80, 80, 85, 75,
+  99, 86, 74, 76, 81, 95, 79, 80, 97, 83,
+  69, 82, 91, 78, 78, 77, 83, 93, 80, 72,
+  91, 84, 83, 76, 89, 73, 70, 90, 89, 74,
+  84, 87, 91, 79, 95, 82, 85, 86, 89, 100,
+  93, 97, 85, 90, 71, 78, 71, 89, 87, 83,
+  86, 83, 81, 83, 88, 76, 85, 75, 89, 102,
+  90, 81, 86, 88, 84, 90, 76, 76, 87, 89,
+  85, 85, 73, 92, 72, 67, 95, 88, 86, 89,
+  86, 76, 83, 103, 77, 78, 92, 85, 96, 89,
+  76, 82, 84, 85, 78, 68, 80, 84, 82, 72,
+  78, 61, 88, 82, 95, 86, 87, 83, 80, 82,
+  77, 97, 82, 81, 92, 69, 91, 79, 78, 79,
+  87, 87, 83, 86, 85, 75, 78, 75, 107, 80,
+  67, 80, 86, 89, 74, 77, 96, 83, 52, 87,
+  91, 87, 76, 75, 78, 91, 86, 65, 95, 83,
+  74, 79, 95, 73, 73, 88, 88, 76, 89, 82,
+  84, 70, 92, 78, 83, 80, 93, 83, 89, 106,
+  81, 90, 80, 76, 73, 91, 91, 81, 87, 81,
+  75, 90, 87, 80, 78, 73, 101, 103, 92, 96,
+  74, 82, 90, 88, 69, 69, 83, 89, 87, 82,
+  75, 93, 74, 87, 94, 84, 87, 82, 86, 74,
+  80, 99, 67, 70, 87, 76, 80, 83, 76, 83,
+  86, 92, 75, 63, 82, 95, 78, 80, 81, 62,
+  85, 84, 85, 90, 97, 88, 81, 76, 79, 94,
+  75, 82, 89, 66, 94, 78, 73, 86, 87, 83,
+  90, 84, 80, 77, 87, 78, 93, 89, 75, 75,
+  79, 84, 79, 83, 92, 84, 72, 84, 86, 79,
+  82, 79, 91, 92, 78, 73, 84, 81, 86, 82,
+  88, 80, 79, 86, 93, 77, 86, 87, 87, 78,
+  89, 77, 83, 81, 87, 82, 93, 95, 82, 89,
+  75, 78, 75, 83, 85, 80, 87, 85, 81, 82,
+  84, 77, 86, 76, 97, 96, 85, 86, 80, 94,
+  80, 94, 73, 76, 85, 101, 86, 83, 70, 91,
+  77, 92, 92, 86, 84, 87, 86, 81, 85, 83,
+  82, 77, 83, 84, 97, 88, 72, 86, 84, 83,
+  80, 70, 89, 78, 85, 69, 81, 60, 89, 85,
+  93, 91, 86, 84, 81, 85, 79, 96, 71, 80,
+  86, 70, 87, 77, 82, 76, 78, 86, 89, 93,
+  77, 75, 85, 89, 75, 71, 90, 76, 103, 70,
+  76, 82, 86, 78, 86, 82, 92, 92, 90, 79,
+  83, 74, 98, 71, 101, 85, 90, 93, 72, 87,
+  79, 89, 83, 91, 85, 80, 81, 72, 89, 74,
+  72, 67, 94, 95, 83, 71, 85, 92, 66, 96,
+  79, 90, 73, 90, 79, 86, 87, 93, 87, 79,
+  84, 76, 91, 91, 82, 87, 84, 93, 92, 79,
+  77, 70, 77, 78, 84, 80, 80, 84, 67, 88,
+  67, 79, 79, 82, 83, 89, 76, 81, 65, 97,
+  80, 77, 85, 72, 90, 71, 74, 88, 96, 85,
+  89, 88, 85, 91, 91, 80, 93, 88, 156, 81,
+  100, 81, 90, 69, 81, 100, 94, 90, 87, 108,
+  92, 84, 90, 78, 80, 88, 86, 93, 80, 74,
+  85, 79, 77, 56, 85, 80, 114, 79, 81, 81,
+  91, 81, 82, 78, 98, 88, 81, 78, 87, 69,
+  95, 63, 102, 87, 96, 101, 73, 87, 82, 81,
+  88, 89, 78, 86, 84, 73, 95, 77, 71, 63,
+  95, 80, 80, 67, 83, 93, 67, 99, 74, 90,
+  75, 92, 82, 86, 83, 85, 83, 78, 72, 70,
+  87, 81, 78, 81, 85, 94, 86, 80, 79, 64,
+  74, 83, 88, 79, 85, 79, 69, 81, 64, 77,
+  79, 75, 83, 97, 72, 82, 68, 89, 78, 81,
+  86, 69, 96, 71, 64, 82, 84, 84, 91, 86,
+  79, 90, 91, 84, 96, 88, 156, 82, 100, 79,
+  79, 69, 78, 103, 87, 97, 84, 111, 89, 80,
+  92, 69, 77, 90, 86, 92, 78, 82, 87, 88,
+  75, 73, 91, 80, 103, 84, 76, 82, 84, 78,
+  82, 77, 87, 89, 83, 80, 84, 75, 95, 72,
+  95, 78, 90, 95, 72, 87, 80, 96, 85, 92,
+  68, 80, 84, 77, 93, 76, 78, 74, 93, 78,
+  80, 72, 81, 93, 66, 94, 80, 92, 72, 88,
+  80, 86, 93, 96, 86, 80, 79, 77, 92, 87,
+  79, 81, 94, 93, 93, 79, 81, 75, 75, 96,
+  88, 83, 83, 87, 71, 91, 71, 73, 81, 78,
+  87, 93, 78, 87, 65, 95, 88, 82, 86, 78,
+  82, 73, 71, 88, 95, 85, 88, 89, 77, 95,
+  92, 79, 92, 91, 145, 86, 96, 76, 88, 70,
+  81, 97, 82, 85, 86, 104, 89, 84, 91, 79,
+  80, 81, 92, 86, 80, 83, 80, 90, 71, 58,
+  92, 76, 102, 76, 85, 80, 92, 78, 88, 79,
+  96, 87, 81, 76, 85, 81, 86, 71, 95, 84,
+  93, 92, 76, 93, 83, 82, 78, 86, 73, 84,
+  82, 77, 87, 72, 78, 65, 99, 97, 81, 64,
+  88, 84, 71, 96, 79, 92, 77, 93, 79, 90,
+  79, 83, 81, 79, 79, 75, 94, 81, 91, 78,
+  87, 86, 86, 83, 78, 73, 78, 74, 78, 94,
+  77, 89, 68, 78, 64, 77, 81, 79, 77, 86,
+  79, 79, 75, 92, 74, 80, 77, 73, 91, 74,
+  65, 92, 71, 87, 84, 93, 89, 83, 77, 89,
+  90, 82, 153, 76, 89, 78, 79, 78, 87, 89,
+  94, 94, 88, 107, 91, 81, 88, 76, 85, 85,
+  83, 66, 86, 78, 75, 79, 70, 40, 90, 77,
+  96, 73, 87, 72, 99, 83, 87, 79, 96, 85,
+  79, 73, 84, 78, 78, 64, 96, 85, 91, 98,
+  76, 89, 83, 74, 85, 87, 73, 83, 86, 78,
+  95, 75, 80, 60, 91, 75, 82, 55, 86, 81,
+  72, 103, 79, 89, 84, 90, 84, 89, 73, 82,
+  82, 79, 73, 74, 93, 79, 85, 80, 82, 89,
+  83, 85, 76, 67, 75, 80, 81, 98, 79, 87,
+  68, 77, 63, 80, 76, 77, 77, 90, 75, 77,
+  78, 82, 69, 88, 77, 69, 95, 77, 61, 85,
+  53, 86, 85, 92, 79, 82, 72, 94, 89, 89,
+  141, 74, 94, 77, 74, 79, 86, 89, 84, 99,
+  77, 99, 84, 76, 99, 69, 78, 93, 89, 89,
+  81, 83, 84, 83, 71, 62, 94, 79, 93, 75,
+  84, 83, 87, 75, 85, 78, 85, 83, 84, 79,
+  84, 78, 85, 72, 88, 79, 87, 94, 78, 90,
+  79, 87, 79, 87, 75, 82, 84, 81, 96, 75,
+  82, 70, 94, 75, 79, 66, 82, 83, 69, 91,
+  79, 87, 76, 91, 82, 88, 78, 85, 83, 76,
+  76, 74, 93, 80, 92, 78, 86, 85, 84, 81,
+  79, 77, 76, 98, 82, 91, 81, 92, 76, 88,
+  67, 76, 75, 78, 81, 91, 82, 78, 71, 94,
+  77, 84, 78, 79, 88, 78, 66, 84, 69, 86,
+  84, 91, 82, 87, 81, 88, 88, 85, 135, 85,
+  89, 78, 90, 77, 86, 89, 86, 89, 86, 104,
+  86, 80, 91, 79, 81, 83, 91, 120, 85, 83,
+  74, 100, 75, 75, 88, 83, 100, 86, 77, 82,
+  85, 73, 83, 85, 91, 87, 84, 84, 84, 81,
+  91, 80, 91, 81, 85, 85, 74, 106, 78, 86,
+  80, 87, 71, 88, 87, 80, 86, 72, 79, 81,
+  95, 100, 76, 75, 82, 87, 75, 90, 78, 92,
+  72, 90, 84, 86, 77, 76, 86, 78, 87, 79,
+  93, 86, 92, 90, 93, 87, 89, 83, 78, 76,
+  83, 76, 84, 89, 82, 82, 65, 84, 70, 93,
+  82, 82, 85, 93, 78, 90, 76, 94, 98, 77,
+  72, 76, 82, 70, 71, 93, 82, 86, 86, 88,
+  86, 81, 79, 87, 81, 77, 155, 85, 89, 82,
+  77, 80, 84, 88, 88, 88, 85, 119, 93, 93,
+  88, 81, 87, 88, 89, 104, 90, 77, 72, 93,
+  78, 62, 94, 83, 100, 77, 81, 80, 95, 75,
+  89, 84, 91, 83, 82, 82, 82, 79, 85, 80,
+  93, 81, 85, 92, 78, 99, 74, 80, 83, 93,
+  76, 88, 85, 81, 91, 75, 81, 75, 85, 81,
+  76, 73, 83, 84, 74, 92, 78, 86, 74, 90,
+  83, 86, 71, 74, 86, 79, 74, 71, 97, 86,
+  86, 90, 82, 90, 82, 86, 76, 74, 80, 84,
+  87, 93, 81, 81, 68, 83, 68, 97, 80, 82,
+  83, 95, 83, 86, 79, 88, 88, 78, 79, 73,
+  88, 74, 67, 87, 63, 83, 83, 83, 80, 81,
+  77, 91, 78, 83, 148, 79, 87, 82, 75, 81,
+  83, 87, 86, 92, 85, 112, 89, 87, 93, 81,
+  80, 88, 97, 119, 84, 83, 76, 93, 76, 77,
+  93, 86, 96, 73, 77, 82, 81, 71, 84, 84,
+  82, 85, 84, 86, 79, 78, 86, 80, 86, 79,
+  82, 91, 77, 94, 74, 94, 80, 90, 84, 86,
+  88, 81, 92, 73, 81, 81, 90, 76, 77, 77,
+  79, 88, 72, 86, 81, 87, 75, 91, 88, 84,
+  74, 79, 87, 80, 84, 76, 90, 87, 89, 92,
+  87, 86, 90, 82, 77, 80, 84, 98, 86, 86,
+  83, 84, 73, 90, 72, 92, 77, 83, 83, 94,
+  80, 86, 71, 96, 89, 76, 75, 76, 84, 74,
+  74, 84, 77, 83, 85, 87, 82, 83, 82, 86,
+  80, 81, 136, 87, 88, 87, 92, 79, 81, 91,
+  87, 89, 87, 117, 86, 92, 89, 85, 76, 76,
+  92, 83, 83, 99, 101, 79, 84, 48, 87, 83,
+  93, 80, 87, 89, 88, 82, 93, 86, 91, 87,
+  78, 92, 82, 83, 77, 82, 91, 77, 79, 76,
+  83, 92, 92, 90, 87, 97, 75, 87, 81, 75,
+  89, 85, 81, 86, 76, 103, 63, 92, 83, 91,
+  73, 80, 75, 86, 65, 95, 68, 105, 90, 79,
+  81, 89, 93, 89, 83, 81, 90, 92, 89, 80,
+  88, 85, 75, 70, 85, 85, 80, 82, 75, 96,
+  79, 85, 85, 77, 75, 76, 89, 81, 82, 85,
+  74, 90, 73, 89, 78, 92, 81, 89, 78, 77,
+  80, 90, 102, 79, 74, 83, 78, 76, 79, 81,
+  99, 91, 93, 78, 87, 109, 75, 74, 78, 83,
+  87, 78, 82, 78, 72, 105, 81, 80, 87, 75,
+  92, 81, 107, 85, 85, 48, 98, 81, 91, 73,
+  93, 81, 94, 84, 85, 87, 83, 82, 86, 99,
+  85, 79, 72, 74, 84, 82, 75, 77, 95, 81,
+  96, 72, 91, 75, 76, 85, 87, 81, 90, 84,
+  91, 81, 81, 90, 69, 95, 87, 95, 70, 87,
+  77, 81, 70, 97, 74, 101, 84, 84, 77, 91,
+  94, 98, 87, 84, 90, 91, 79, 83, 91, 79,
+  75, 72, 85, 86, 78, 93, 78, 88, 81, 75,
+  86, 85, 76, 76, 90, 80, 79, 75, 75, 85,
+  77, 89, 83, 95, 80, 101, 82, 85, 73, 86,
+  93, 81, 83, 90, 95, 82, 83, 84, 97, 70,
+  95, 86, 89, 111, 71, 81, 87, 85, 85, 79,
+  87, 77, 60, 102, 86, 72, 90, 79, 84, 95,
+  94, 83, 79, 60, 96, 83, 80, 74, 78, 80,
+  93, 92, 92, 82, 85, 81, 80, 86, 95, 75,
+  71, 55, 76, 86, 83, 77, 90, 85, 87, 76,
+  92, 77, 83, 80, 83, 96, 90, 81, 87, 87,
+  83, 92, 73, 88, 85, 90, 68, 90, 75, 81,
+  70, 98, 73, 93, 89, 87, 78, 99, 104, 107,
+  85, 86, 91, 87, 81, 86, 86, 76, 76, 77,
+  86, 82, 72, 84, 73, 83, 83, 75, 89, 88,
+  77, 76, 86, 80, 81, 90, 82, 87, 89, 87,
+  83, 89, 81, 94, 90, 78, 81, 86, 95, 77,
+  77, 89, 87, 79, 82, 85, 92, 74, 93, 81,
+  99, 95, 76, 85, 93, 85, 79, 82, 85, 81,
+  82, 93, 76, 79, 87, 109, 80, 93, 81, 75,
+  93, 70, 67, 85, 67, 92, 76, 102, 67, 76,
+  92, 88, 85, 84, 76, 98, 78, 84, 98, 93,
+  109, 69, 94, 71, 62, 103, 78, 95, 77, 150,
+  80, 69, 92, 58, 86, 84, 71, 97, 73, 98,
+  75, 79, 77, 77, 82, 70, 89, 96, 70, 88,
+  73, 74, 108, 81, 86, 83, 78, 75, 86, 86,
+  80, 86, 99, 72, 87, 100, 73, 75, 87, 76,
+  71, 54, 88, 86, 59, 82, 77, 85, 74, 95,
+  79, 87, 75, 110, 71, 91, 83, 85, 74, 77,
+  82, 64, 62, 87, 86, 86, 77, 86, 80, 80,
+  64, 77, 77, 92, 99, 113, 82, 78, 81, 97,
+  93, 71, 66, 79, 74, 82, 84, 87, 94, 89,
+  75, 84, 85, 105, 88, 78, 93, 85, 91, 61,
+  75, 79, 81, 79, 85, 107, 80, 71, 80, 80,
+  83, 82, 84, 109, 77, 93, 84, 93, 95, 71,
+  84, 70, 78, 92, 83, 80, 69, 145, 75, 82,
+  94, 63, 78, 84, 73, 91, 74, 92, 80, 89,
+  83, 85, 86, 75, 81, 88, 70, 94, 73, 85,
+  91, 77, 79, 83, 83, 82, 93, 75, 85, 83,
+  82, 73, 93, 91, 74, 72, 83, 82, 71, 75,
+  88, 88, 61, 79, 75, 92, 74, 87, 87, 83,
+  81, 88, 71, 93, 68, 88, 73, 79, 81, 83,
+  67, 80, 78, 82, 84, 91, 82, 83, 69, 91,
+  81, 80, 102, 78, 84, 76, 90, 101, 86, 75,
+  74, 82, 88, 79, 92, 77, 73, 94, 88, 84,
+  89, 91, 88, 82, 95, 87, 85, 60, 85, 82,
+  77, 82, 75, 94, 88, 79, 87, 77, 82, 80,
+  81, 94, 87, 84, 80, 67, 79, 76, 86, 77,
+  88, 88, 84, 78, 80, 102, 86, 87, 94, 77,
+  82, 80, 83, 93, 79, 82, 81, 86, 85, 91,
+  80, 80, 80, 87, 73, 100, 75, 88, 88, 88,
+  84, 89, 91, 99, 90, 80, 92, 86, 84, 78,
+  89, 80, 79, 76, 87, 81, 76, 81, 81, 82,
+  67, 75, 79, 96, 78, 85, 93, 75, 83, 89,
+  81, 95, 80, 90, 77, 83, 80, 92, 77, 80,
+  84, 81, 96, 85, 83, 87, 77, 83, 84, 82,
+  92, 76, 88, 82, 96, 90, 89, 84, 90, 83,
+  85, 79, 94, 82, 93, 88, 106, 78, 82, 98,
+  79, 71, 78, 69, 87, 80, 71, 108, 71, 99,
+  68, 76, 77, 84, 125, 92, 86, 89, 78, 67,
+  92, 80, 102, 79, 105, 64, 114, 88, 77, 108,
+  74, 81, 86, 88, 91, 60, 82, 57, 105, 89,
+  94, 89, 84, 92, 74, 78, 87, 80, 83, 80,
+  94, 88, 91, 77, 88, 74, 105, 66, 94, 89,
+  58, 81, 66, 99, 69, 79, 83, 87, 81, 96,
+  74, 79, 96, 81, 79, 61, 96, 83, 92, 80,
+  87, 70, 76, 101, 87, 89, 79, 90, 85, 97,
+  92, 80, 83, 83, 74, 53, 63, 66, 86, 87,
+  46, 72, 94, 84, 91, 79, 83, 94, 75, 115,
+  86, 104, 85, 64, 91, 88, 81, 84, 65, 77,
+  79, 114, 98, 89, 84, 76, 76, 111, 73, 97,
+  77, 68, 84, 78, 69, 94, 64, 89, 73, 92,
+  74, 71, 104, 92, 95, 80, 75, 79, 79, 85,
+  96, 83, 93, 70, 99, 74, 66, 100, 83, 83,
+  88, 106, 87, 72, 83, 65, 87, 82, 81, 89,
+  77, 93, 80, 82, 83, 77, 83, 74, 85, 87,
+  93, 75, 88, 67, 95, 70, 91, 72, 63, 78,
+  71, 93, 67, 74, 94, 86, 85, 89, 69, 83,
+  94, 80, 76, 69, 92, 75, 79, 83, 79, 71,
+  72, 95, 84, 92, 73, 90, 81, 92, 86, 79,
+  82, 76, 70, 68, 70, 79, 88, 83, 49, 72,
+  84, 84, 76, 77, 79, 88, 81, 101, 82, 90,
+  88, 72, 83, 92, 82, 84, 67, 79, 76, 103,
+  94, 85, 95, 75, 82, 101, 80, 89, 90, 81,
+  78, 70, 78, 85, 80, 88, 68, 93, 82, 76,
+  98, 84, 87, 83, 79, 82, 80, 87, 89, 74,
+  78, 76, 91, 77, 80, 95, 78, 85, 87, 80,
+  78, 97, 84, 76, 87, 79, 89, 90, 83, 93,
+  80, 85, 83, 91, 83, 76, 84, 89, 88, 80,
+  85, 78, 95, 78, 88, 69, 76, 82, 77, 86,
+  85, 84, 93, 87, 86, 84, 72, 79, 87, 75,
+  79, 79, 86, 72, 81, 76, 82, 76, 76, 83,
+  90, 81, 83, 85, 84, 91, 85, 80, 85, 76,
+  72, 85, 78, 96, 91, 79, 67, 84, 84, 84,
+  83, 81, 83, 84, 86, 90, 81, 87, 83, 81,
+  93, 96, 98, 81, 86, 87, 86, 95, 84, 86,
+  88, 79, 97, 79, 58, 102, 79, 88, 94, 85,
+  72, 81, 77, 89, 55, 71, 85, 103, 85, 96,
+  78, 76, 122, 82, 82, 77, 89, 99, 98, 72,
+  76, 83, 77, 78, 84, 92, 76, 79, 70, 77,
+  70, 101, 87, 62, 92, 83, 83, 109, 80, 80,
+  93, 68, 80, 69, 90, 65, 95, 68, 79, 76,
+  80, 88, 72, 75, 62, 82, 79, 98, 81, 87,
+  63, 101, 72, 84, 84, 85, 94, 102, 69, 95,
+  79, 86, 84, 99, 80, 80, 86, 93, 72, 79,
+  94, 73, 79, 73, 94, 98, 79, 68, 83, 69,
+  74, 84, 89, 104, 86, 82, 63, 70, 79, 78,
+  92, 73, 87, 102, 77, 130, 102, 88, 75, 88,
+  75, 71, 84, 66, 81, 88, 86, 84, 101, 75,
+  112, 94, 90, 96, 86, 89, 89, 80, 78, 75,
+  101, 96, 73, 88, 85, 90, 95, 84, 91, 78,
+  97, 80, 87, 90, 82, 94, 84, 107, 90, 89,
+  85, 88, 80, 86, 86, 81, 81, 84, 79, 91,
+  88, 78, 81, 72, 90, 102, 77, 78, 83, 92,
+  87, 79, 77, 74, 76, 83, 82, 83, 72, 71,
+  79, 83, 79, 79, 66, 82, 84, 106, 62, 84,
+  80, 88, 78, 89, 77, 79, 76, 90, 86, 89,
+  83, 87, 88, 81, 96, 98, 82, 79, 82, 76,
+  82, 82, 89, 88, 77, 75, 82, 75, 88, 67,
+  80, 98, 84, 72, 75, 85, 79, 81, 94, 70,
+  86, 80, 95, 92, 94, 89, 79, 77, 101, 73,
+  98, 87, 97, 90, 90, 82, 96, 65, 91, 78,
+  98, 80, 81, 96, 78, 77, 85, 76, 89, 84,
+  95, 83, 84, 82, 79, 74, 96, 83, 84, 79,
+  82, 81, 82, 71, 71, 102, 94, 84, 88, 89,
+  96, 83, 92, 79, 93, 89, 86, 81, 83, 84,
+  84, 77, 90, 80, 78, 76, 74, 105, 86, 86,
+  72, 75, 77, 95, 93, 78, 79, 89, 86, 88,
+  81, 93, 88, 83, 88, 88, 81, 78, 91, 83,
+  83, 77, 78, 88, 87, 82, 90, 86, 85, 78,
+  86, 84, 86, 75, 102, 79, 75, 88, 83, 90,
+  99, 84, 78, 84, 77, 87, 86, 72, 77, 89,
+  82, 84, 81, 87, 78, 86, 89, 76, 85, 85,
+  84, 86, 84, 84, 76, 87, 105, 94, 81, 86,
+  98, 90, 87, 94, 83, 72, 63, 76, 65, 102,
+  78, 86, 79, 86, 72, 82, 71, 66, 64, 68,
+  81, 105, 82, 100, 75, 68, 108, 81, 89, 81,
+  91, 98, 116, 53, 70, 72, 80, 85, 151, 106,
+  92, 77, 61, 75, 69, 104, 92, 61, 78, 107,
+  74, 78, 83, 76, 77, 59, 81, 73, 82, 68,
+  100, 53, 79, 71, 73, 104, 69, 71, 66, 78,
+  54, 92, 92, 64, 99, 92, 83, 80, 91, 88,
+  90, 143, 87, 98, 78, 76, 95, 87, 84, 74,
+  94, 105, 54, 89, 93, 77, 80, 77, 113, 93,
+  81, 69, 90, 71, 60, 55, 88, 105, 75, 73,
+  59, 63, 81, 81, 79, 79, 84, 113, 63, 117,
+  54, 81, 62, 78, 58, 67, 81, 67, 71, 70,
+  78, 83, 91, 68, 53, 103, 78, 96, 81, 85,
+  87, 88, 71, 81, 76, 86, 76, 82, 87, 91,
+  90, 83, 90, 60, 76, 85, 90, 82, 93, 104,
+  99, 58, 84, 75, 82, 113, 87, 76, 80, 90,
+  58, 66, 83, 91, 94, 75, 77, 83, 83, 72,
+  77, 69, 78, 64, 88, 77, 77, 106, 78, 69,
+  69, 87, 83, 84, 76, 75, 81, 69, 69, 97,
+  106, 85, 96, 82, 74, 92, 80, 91, 87, 95,
+  94, 87, 81, 83, 80, 57, 88, 89, 100, 105,
+  77, 74, 86, 108, 84, 82, 103, 93, 83, 75,
+  84, 70, 73, 98, 85, 99, 91, 92, 77, 76,
+  79, 77, 79, 82, 85, 79, 89, 110, 61, 93,
+  80, 74, 85, 64, 90, 85, 84, 79, 88, 70,
+  93, 74, 67, 83, 94, 70, 86, 97, 88, 75,
+  82, 83, 76, 91, 93, 91, 87, 81, 92, 74,
+  85, 77, 83, 86, 74, 80, 89, 85, 82, 73,
+  90, 82, 86, 92, 79, 72, 76, 85, 71, 84,
+  80, 81, 93, 82, 78, 76, 91, 84, 77, 77,
+  79, 84, 84, 85, 79, 85, 80, 93, 85, 81,
+  83, 91, 90, 74, 79, 83, 89, 81, 95, 86,
+  86, 78, 86, 90, 86, 78, 87, 73, 89, 80,
+  91, 82, 87, 73, 84, 90, 85, 76, 115, 79,
+  80, 98, 84, 90, 88, 81, 82, 84, 84, 83,
+  79, 99, 75, 88, 96, 92, 90, 86, 91, 89,
+  91, 74, 78, 82, 87, 93, 73, 88, 83, 88,
+  97, 84, 92, 83, 91, 86, 89, 93, 84, 101,
+  92, 79, 93, 86, 96, 93, 79, 81, 87, 78,
+  69, 80, 70, 78, 85, 104, 89, 96, 77, 63,
+  87, 77, 83, 88, 87, 87, 99, 106, 87, 90,
+  97, 80, 87, 75, 77, 90, 75, 82, 82, 84,
+  80, 88, 77, 95, 88, 88, 81, 75, 90, 89,
+  87, 88, 90, 80, 92, 86, 96, 68, 74, 77,
+  87, 77, 79, 80, 67, 77, 79, 84, 60, 75,
+  96, 76, 93, 95, 85, 67, 100, 85, 96, 93,
+  85, 88, 85, 83, 88, 90, 98, 96, 99, 73,
+  81, 81, 95, 84, 85, 79, 94, 83, 65, 76,
+  83, 100, 74, 70, 65, 87, 91, 87, 85, 73,
+  83, 92, 84, 96, 56, 74, 76, 78, 68, 75,
+  99, 83, 91, 80, 83, 84, 91, 85, 75, 82,
+  80, 100, 82, 90, 85, 92, 73, 84, 66, 87,
+  64, 71, 84, 92, 85, 98, 81, 82, 91, 77,
+  82, 82, 93, 96, 92, 90, 86, 82, 86, 96,
+  82, 93, 86, 81, 66, 75, 84, 84, 84, 78,
+  78, 89, 83, 119, 86, 69, 81, 86, 85, 79,
+  82, 88, 86, 76, 76, 77, 88, 96, 81, 76,
+  80, 81, 55, 89, 80, 76, 84, 86, 87, 83,
+  82, 96, 84, 70, 102, 88, 88, 84, 81, 78,
+  84, 85, 92, 95, 77, 82, 97, 85, 79, 73,
+  97, 87, 86, 72, 82, 79, 68, 103, 88, 98,
+  83, 84, 72, 76, 90, 82, 85, 74, 84, 89,
+  77, 89, 76, 81, 78, 78, 79, 68, 93, 78,
+  87, 84, 84, 72, 84, 74, 72, 81, 89, 82,
+  82, 94, 92, 87, 83, 82, 84, 93, 76, 81,
+  81, 81, 86, 85, 85, 90, 89, 78, 80, 86,
+  86, 91, 78, 76, 87, 75, 79, 94, 91, 93,
+  83, 85, 75, 90, 87, 85, 93, 77, 93, 82,
+  84, 100, 86, 73, 86, 89, 79, 83, 78, 79,
+  83, 81, 81, 86, 84, 92, 80, 76, 79, 91,
+  77, 94, 80, 82, 91, 82, 82, 85, 80, 76,
+  89, 82, 83, 85, 91, 79, 87, 85, 80, 88,
+  94, 78, 86, 81, 89, 88, 84, 79, 92, 89,
+  84, 80, 83, 81, 77, 96, 80, 94, 89, 91,
+  86, 79, 93, 85, 88, 74, 78, 83, 82, 85,
+  89, 87, 86, 80, 91, 79, 87, 82, 88, 87,
+  86, 87, 89, 76, 77, 88, 86, 88, 99, 74,
+  70, 67, 89, 78, 87, 81, 83, 84, 88, 85,
+  65, 87, 89, 88, 88, 92, 95, 71, 83, 61,
+  85, 83, 88, 88, 85, 80, 99, 76, 94, 81,
+  82, 76, 72, 83, 77, 79, 101, 62, 87, 75,
+  66, 92, 83, 87, 84, 103, 91, 91, 66, 91,
+  85, 94, 96, 91, 76, 82, 82, 89, 89, 88,
+  74, 88, 65, 85, 98, 95, 81, 74, 78, 100,
+  80, 101, 83, 85, 98, 92, 83, 94, 84, 92,
+  98, 79, 85, 81, 77, 102, 80, 88, 93, 88,
+  74, 107, 84, 87, 92, 86, 89, 85, 70, 86,
+  81, 77, 79, 88, 84, 87, 92, 69, 68, 103,
+  72, 81, 85, 84, 77, 77, 75, 78, 82, 89,
+  76, 94, 90, 83, 94, 75, 97, 67, 71, 60,
+  74, 90, 99, 87, 82, 101, 82, 73, 61, 92,
+  100, 70, 86, 110, 86, 80, 89, 68, 92, 83,
+  96, 71, 75, 74, 89, 78, 85, 100, 94, 93,
+  79, 73, 73, 95, 88, 92, 81, 72, 79, 86,
+  80, 93, 82, 82, 81, 79, 60, 81, 93, 93,
+  87, 74, 76, 74, 79, 69, 79, 79, 65, 78,
+  78, 83, 76, 99, 89, 60, 76, 98, 82, 88,
+  83, 87, 85, 95, 71, 90, 86, 73, 96, 88,
+  71, 78, 77, 98, 69, 89, 87, 85, 92, 80,
+  77, 74, 74, 86, 103, 77, 54, 78, 67, 91,
+  100, 85, 73, 85, 83, 98, 69, 92, 74, 81,
+  84, 89, 77, 65, 83, 81, 82, 92, 80, 79,
+  101, 97, 92, 83, 78, 89, 86, 83, 83, 93,
+  77, 93, 64, 102, 89, 72, 105, 99, 65, 89,
+  80, 94, 80, 75, 100, 91, 86, 90, 97, 81,
+  76, 86, 70, 83, 92, 94, 90, 79, 85, 66,
+  77, 90, 79, 96, 87, 92, 90, 78, 82, 74,
+  77, 82, 100, 87, 85, 82, 69, 87, 92, 83,
+  96, 70, 63, 74, 69, 99, 83, 75, 80, 85,
+  86, 97, 84, 78, 84, 101, 79, 76, 84, 72,
+  77, 88, 68, 92, 99, 81, 85, 77, 82, 92,
+  76, 77, 103, 84, 90, 81, 92, 71, 84, 79,
+  89, 86, 88, 77, 71, 87, 67, 80, 93, 103,
+  86, 85, 88, 100, 101, 91, 84, 75, 79, 94,
+  78, 88, 88, 88, 88, 84, 73, 91, 76, 94,
+  85, 94, 100, 65, 69, 61, 75, 83, 88, 88,
+  86, 105, 86, 76, 56, 85, 109, 81, 87, 102,
+  78, 73, 90, 68, 95, 83, 93, 78, 79, 91,
+  91, 78, 75, 83, 82, 85, 78, 79, 76, 86,
+  87, 77, 78, 85, 80, 92, 84, 91, 91, 90,
+  85, 73, 66, 83, 93, 91, 89, 89, 77, 85,
+  74, 75, 91, 86, 71, 67, 74, 74, 93, 95,
+  80, 65, 82, 93, 79, 94, 86, 91, 90, 86,
+  77, 97, 87, 87, 98, 76, 75, 74, 90, 101,
+  64, 82, 85, 88, 84, 90, 75, 91, 77, 85,
+  95, 86, 64, 78, 74, 91, 82, 92, 83, 80,
+  84, 75, 62, 94, 77, 87, 82, 100, 82, 74,
+  82, 85, 83, 89, 72, 98, 86, 86, 80, 71,
+  79, 68, 68, 77, 67, 93, 94, 94, 74, 95,
+  78, 68, 73, 88, 112, 75, 103, 95, 63, 76,
+  93, 73, 115, 80, 105, 57, 59, 78, 81, 82,
+  76, 109, 88, 88, 91, 70, 71, 93, 79, 103,
+  67, 89, 91, 84, 74, 96, 83, 71, 88, 74,
+  73, 68, 98, 69, 87, 72, 84, 60, 60, 64,
+  69, 82, 65, 84, 74, 77, 64, 104, 83, 65,
+  83, 108, 73, 78, 85, 78, 74, 81, 63, 94,
+  92, 85, 78, 72, 64, 68, 77, 92, 72, 90,
+  84, 83, 107, 55, 70, 61, 73, 85, 88, 68,
+  67, 71, 52, 86, 103, 92, 76, 86, 82, 97,
+  98, 81, 77, 82, 67, 107, 65, 74, 84, 83,
+  93, 85, 86, 71, 74, 99, 83, 79, 69, 91,
+  89, 91, 86, 82, 71, 90, 56, 80, 85, 82,
+  121, 95, 69, 90, 82, 76, 76, 77, 93, 100,
+  101, 88, 87, 96, 86, 83, 61, 79, 87, 85,
+  80, 65, 90, 65, 78, 85, 84, 99, 89, 90,
+  88, 69, 86, 78, 79, 88, 118, 88, 111, 65,
+  82, 85, 89, 88, 96, 55, 51, 81, 59, 111,
+  80, 72, 82, 70, 85, 91, 85, 96, 86, 101,
+  75, 75, 82, 67, 74, 73, 63, 82, 106, 92,
+  69, 75, 96, 84, 73, 73, 123, 96, 92, 84,
+  99, 72, 77, 83, 95, 85, 71, 80, 88, 90,
+  84, 72, 81, 96, 95, 79, 75, 89, 106, 80,
+  93, 69, 77, 88, 76, 102, 93, 82, 102, 76,
+  77, 91, 79, 101, 78, 86, 88, 70, 71, 71,
+  74, 80, 94, 97, 75, 86, 82, 78, 80, 84,
+  106, 89, 78, 96, 75, 75, 100, 77, 83, 84,
+  90, 80, 73, 95, 95, 80, 82, 92, 79, 90,
+  80, 73, 83, 83, 77, 87, 80, 70, 83, 83,
+  90, 88, 86, 89, 94, 85, 80, 82, 97, 79,
+  86, 89, 86, 91, 85, 73, 77, 81, 74, 81,
+  87, 77, 91, 91, 78, 73, 85, 106, 82, 81,
+  82, 85, 92, 87, 81, 89, 86, 89, 89, 85,
+  88, 71, 85, 93, 73, 81, 85, 90, 87, 86,
+  71, 94, 88, 83, 84, 92, 65, 88, 84, 82,
+  76, 99, 79, 81, 94, 87, 78, 87, 78, 87,
+  75, 101, 73, 74, 92, 89, 90, 82, 81, 99,
+  75, 92, 72, 82, 82, 78, 75, 84, 74, 93,
+  96, 92, 66, 72, 72, 79, 97, 89, 102, 88,
+  80, 91, 68, 76, 95, 87, 103, 87, 95, 77,
+  68, 80, 76, 80, 78, 108, 90, 81, 101, 70,
+  76, 87, 78, 98, 71, 71, 86, 83, 83, 93,
+  83, 84, 102, 90, 96, 70, 97, 73, 90, 74,
+  86, 82, 70, 77, 72, 87, 72, 82, 84, 68,
+  69, 100, 82, 80, 79, 100, 83, 69, 83, 86,
+  85, 90, 71, 86, 91, 91, 76, 76, 85, 72,
+  84, 86, 93, 94, 94, 84, 116, 69, 73, 78,
+  88, 84, 70, 75, 84, 87, 81, 80, 80, 96,
+  79, 79, 83, 86, 107, 82, 85, 85, 62, 92,
+  62, 77, 84, 83, 99, 88, 77, 90, 67, 87,
+  76, 104, 82, 93, 86, 91, 83, 80, 80, 95,
+  59, 84, 74, 88, 105, 86, 71, 85, 70, 91,
+  78, 97, 83, 110, 72, 86, 83, 102, 91, 87,
+  64, 79, 87, 82, 71, 72, 88, 72, 79, 90,
+  89, 93, 104, 81, 83, 73, 95, 75, 77, 88,
+  103, 86, 103, 81, 85, 90, 83, 79, 91, 62,
+  64, 99, 74, 98, 83, 69, 93, 69, 82, 89,
+  96, 92, 70, 85, 81, 82, 89, 90, 79, 82,
+  82, 85, 92, 85, 86, 84, 87, 82, 82, 74,
+  109, 90, 87, 85, 107, 83, 78, 94, 89, 87,
+  66, 78, 91, 92, 88, 85, 77, 82, 85, 77,
+  75, 92, 83, 85, 95, 74, 79, 74, 79, 99,
+  91, 77, 89, 89, 93, 88, 83, 88, 85, 87,
+  84, 93, 88, 86, 89, 87, 72, 85, 77, 90,
+  74, 74, 87, 81, 87, 84, 84, 89, 81, 78,
+  85, 89, 87, 93, 84, 89, 80, 92, 78, 84,
+  88, 90, 92, 77, 87, 81, 79, 87, 79, 92,
+  79, 89, 93, 76, 86, 84, 80, 75, 93, 83,
+  81, 86, 88, 83, 83, 77, 94, 77, 81, 73,
+  84, 73, 78, 80, 107, 95, 90, 105, 81, 90,
+  82, 88, 77, 76, 93, 95, 93, 84, 75, 87,
+  91, 100, 91, 66, 80, 87, 92, 85, 92, 77,
+  84, 86, 74, 86, 74, 82, 88, 92, 82, 88,
+  74, 94, 78, 85, 90, 81, 76, 83, 93, 97,
+  97, 82, 80, 79, 84, 85, 85, 81, 77, 88,
+  86, 84, 79, 91, 78, 82, 81, 77, 101, 97,
+  91, 79, 93, 89, 79, 83, 88, 102, 87, 86,
+  92, 82, 89, 76, 82, 88, 89, 90, 80, 84,
+  79, 89, 86, 87, 91, 80, 74, 80, 69, 81,
+  82, 81, 87, 71, 77, 91, 74, 89, 85, 80,
+  80, 84, 86, 85, 81, 80, 83, 36, 89, 91,
+  88, 87, 76, 83, 92, 84, 79, 87, 84, 85,
+  80, 79, 96, 83, 93, 95, 87, 87, 82, 75,
+  80, 84, 88, 84, 94, 80, 84, 84, 88, 71,
+  88, 75, 79, 68, 86, 92, 74, 87, 84, 85,
+  87, 79, 65, 76, 84, 88, 79, 87, 84, 86,
+  80, 84, 90, 90, 83, 84, 99, 85, 83, 83,
+  86, 82, 87, 88, 83, 81, 78, 87, 83, 81,
+  87, 81, 83, 76, 82, 86, 104, 88, 74, 80,
+  87, 83, 79, 76, 91, 96, 83, 97, 81, 86,
+  86, 89, 84, 86, 92, 90, 76, 80, 75, 87,
+  82, 87, 94, 77, 81, 88, 80, 83, 90, 83,
+  85, 76, 78, 92, 78, 81, 92, 88, 81, 92,
+  82, 92, 76, 85, 85, 52, 90, 97, 86, 82,
+  77, 84, 88, 82, 93, 100, 86, 90, 86, 95,
+  108, 86, 86, 87, 91, 73, 80, 83, 86, 86,
+  88, 79, 87, 90, 88, 80, 86, 76, 82, 73,
+  77, 74, 87, 82, 81, 99, 85, 75, 93, 83,
+  76, 88, 83, 86, 85, 90, 97, 81, 72, 82,
+  88, 99, 81, 81, 98, 88, 81, 87, 89, 82,
+  83, 90, 77, 73, 87, 85, 82, 81, 88, 76,
+  68, 83, 91, 78, 68, 80, 91, 84, 73, 87,
+  64, 66, 76, 70, 69, 74, 76, 90, 83, 83,
+  86, 99, 94, 77, 92, 86, 112, 82, 74, 92,
+  71, 85, 71, 79, 98, 83, 91, 87, 79, 88,
+  87, 82, 85, 109, 84, 91, 91, 70, 84, 89,
+  89, 73, 100, 166, 82, 63, 88, 80, 96, 82,
+  87, 67, 66, 62, 68, 86, 86, 103, 80, 89,
+  80, 81, 89, 82, 79, 94, 83, 78, 80, 87,
+  89, 83, 64, 84, 91, 108, 73, 81, 79, 91,
+  90, 74, 106, 79, 80, 87, 79, 87, 86, 88,
+  89, 95, 97, 84, 71, 92, 79, 80, 80, 69,
+  76, 94, 79, 100, 76, 80, 77, 78, 81, 79,
+  74, 72, 85, 83, 88, 80, 74, 80, 59, 86,
+  81, 83, 70, 85, 96, 87, 80, 76, 67, 65,
+  76, 74, 80, 65, 79, 85, 79, 69, 81, 90,
+  85, 75, 94, 88, 110, 83, 75, 85, 69, 90,
+  70, 75, 96, 86, 94, 75, 87, 88, 89, 84,
+  80, 100, 77, 85, 93, 64, 84, 87, 85, 69,
+  95, 171, 74, 65, 85, 79, 86, 76, 84, 67,
+  64, 62, 72, 72, 85, 97, 112, 77, 88, 89,
+  83, 81, 85, 90, 86, 79, 77, 89, 91, 80,
+  73, 85, 89, 110, 77, 69, 73, 96, 86, 77,
+  102, 74, 83, 85, 79, 85, 78, 101, 90, 92,
+  81, 82, 65, 92, 75, 76, 79, 73, 75, 87,
+  67, 89, 69, 76, 79, 80, 80, 83, 75, 74,
+  76, 81, 82, 77, 82, 83, 73, 87, 87, 75,
+  84, 91, 97, 88, 85, 80, 84, 70, 83, 100,
+  91, 73, 86, 81, 84, 89, 83, 89, 81, 82,
+  85, 86, 83, 85, 83, 87, 82, 85, 65, 80,
+  85, 89, 87, 96, 87, 83, 87, 84, 76, 85,
+  78, 91, 88, 80, 79, 94, 85, 78, 83, 82,
+  80, 83, 88, 89, 77, 83, 83, 73, 77, 82,
+  82, 77, 79, 82, 78, 82, 94, 96, 84, 81,
+  83, 77, 80, 83, 83, 78, 95, 87, 81, 88,
+  88, 85, 76, 70, 77, 75, 83, 87, 83, 83,
+  87, 89, 83, 80, 72, 84, 87, 88, 82, 70,
+  79, 79, 70, 83, 83, 77, 80, 83, 70, 85,
+  79, 78, 85, 80, 76, 91, 91, 81, 80, 83,
+  85, 84, 79, 77, 79, 80, 89, 75, 86, 82,
+  89, 84, 85, 91, 83, 74, 84, 84, 76, 98,
+  85, 84, 92, 87, 86, 88, 96, 87, 73, 80,
+  77, 81, 90, 91, 90, 78, 71, 86, 75, 88,
+  78, 94, 81, 74, 77, 82, 84, 95, 90, 85,
+  79, 92, 86, 94, 88, 85, 88, 60, 77, 84,
+  83, 88, 90, 93, 92, 93, 81, 82, 93, 93,
+  83, 82, 62, 80, 83, 84, 74, 85, 77, 81,
+  59, 79, 93, 78, 89, 90, 79, 86, 93, 69,
+  73, 88, 95, 80, 84, 94, 87, 89, 76, 94,
+  81, 79, 76, 56, 83, 91, 84, 81, 83, 87,
+  73, 79, 80, 86, 80, 82, 97, 85, 83, 88,
+  88, 68, 89, 84, 89, 79, 91, 85, 83, 80,
+  73, 87, 70, 80, 84, 73, 74, 82, 92, 90,
+  79, 91, 69, 86, 78, 71, 74, 76, 88, 88,
+  84, 74, 92, 94, 96, 87, 82, 85, 94, 82,
+  82, 96, 77, 73, 84, 86, 79, 85, 84, 79,
+  79, 78, 76, 78, 83, 94, 80, 78, 85, 78,
+  92, 83, 88, 84, 94, 105, 79, 80, 90, 79,
+  93, 87, 89, 84, 70, 66, 79, 94, 91, 86,
+  64, 77, 89, 76, 81, 90, 84, 83, 73, 79,
+  83, 91, 90, 91, 75, 83, 88, 95, 81, 89,
+  97, 80, 91, 85, 92, 82, 81, 92, 80, 82,
+  79, 72, 90, 93, 88, 82, 75, 86, 91, 79,
+  83, 82, 83, 83, 86, 88, 75, 82, 75, 73,
+  82, 84, 82, 79, 84, 86, 87, 76, 79, 79,
+  74, 80, 83, 89, 66, 86, 87, 91, 78, 91,
+  71, 83, 66, 72, 75, 64, 80, 94, 82, 73,
+  99, 90, 85, 78, 93, 88, 90, 96, 78, 93,
+  73, 82, 81, 92, 104, 83, 97, 84, 80, 82,
+  85, 76, 79, 89, 71, 95, 101, 75, 87, 76,
+  82, 84, 85, 139, 80, 71, 88, 76, 86, 84,
+  86, 74, 81, 65, 75, 79, 89, 100, 80, 84,
+  88, 76, 79, 88, 84, 91, 93, 82, 77, 92,
+  94, 98, 72, 91, 87, 109, 83, 75, 87, 87,
+  87, 80, 97, 78, 88, 86, 72, 88, 86, 88,
+  91, 93, 93, 79, 74, 80, 86, 75, 84, 75,
+  78, 89, 77, 94, 85, 75, 69, 84, 83, 86,
+  81, 74, 78, 89, 87, 89, 76, 74, 89, 89,
+  79, 80, 70, 76, 72, 76, 69, 93, 79, 101,
+  69, 83, 81, 68, 84, 81, 83, 101, 95, 81,
+  82, 94, 80, 78, 100, 86, 122, 98, 82, 93,
+  90, 85, 86, 82, 95, 84, 80, 89, 74, 93,
+  74, 68, 80, 81, 88, 83, 87, 73, 78, 87,
+  80, 87, 80, 78, 83, 73, 81, 87, 88, 83,
+  90, 70, 83, 98, 89, 86, 79, 84, 64, 98,
+  80, 84, 70, 89, 89, 70, 82, 76, 60, 100,
+  95, 84, 90, 98, 74, 81, 72, 78, 94, 77,
+  86, 81, 81, 101, 97, 68, 81, 91, 72, 75,
+  82, 83, 87, 80, 72, 95, 82, 91, 89, 79,
+  73, 83, 81, 84, 98, 93, 75, 141, 76, 88,
+  73, 89, 94, 77, 87, 73, 82, 82, 85, 88,
+  75, 78, 75, 75, 61, 97, 81, 92, 72, 85,
+  89, 71, 84, 84, 82, 101, 84, 77, 82, 100,
+  73, 75, 107, 90, 134, 94, 80, 86, 89, 83,
+  86, 76, 92, 89, 80, 91, 83, 98, 77, 71,
+  84, 77, 78, 82, 94, 81, 80, 91, 78, 82,
+  78, 81, 86, 66, 77, 79, 91, 79, 83, 75,
+  84, 94, 89, 76, 81, 79, 64, 96, 80, 81,
+  69, 91, 91, 74, 85, 80, 61, 78, 93, 77,
+  87, 95, 75, 83, 69, 83, 86, 79, 75, 85,
+  80, 106, 86, 68, 79, 90, 72, 75, 83, 83,
+  88, 80, 73, 90, 86, 88, 89, 84, 73, 81,
+  77, 80, 95, 90, 82, 137, 77, 82, 71, 84,
+  98, 73, 82, 77, 88, 89, 82, 87, 69, 81,
+  72, 76, 75, 85, 83, 86, 71, 84, 80, 80,
+  86, 91, 78, 86, 83, 84, 77, 92, 79, 78,
+  97, 87, 117, 97, 82, 79, 82, 95, 94, 83,
+  85, 86, 87, 86, 88, 88, 73, 82, 88, 90,
+  87, 85, 91, 75, 79, 91, 84, 85, 76, 76,
+  78, 75, 83, 80, 92, 78, 84, 75, 82, 95,
+  89, 85, 89, 83, 76, 93, 85, 89, 72, 83,
+  97, 73, 81, 78, 61, 72, 97, 78, 85, 95,
+  76, 81, 77, 99, 94, 78, 85, 81, 83, 97,
+  91, 70, 80, 99, 76, 76, 81, 82, 79, 86,
+  75, 98, 84, 92, 85, 88, 79, 83, 83, 84,
+  92, 87, 94, 131, 77, 86, 74, 85, 93, 70,
+  89, 86, 77, 81, 81, 82, 77, 73, 73, 78,
+  75, 91, 81, 89, 82, 83, 82, 73, 80, 81,
+  87, 96, 85, 87, 85, 81, 81, 78, 91, 80,
+  114, 90, 85, 97, 95, 82, 91, 83, 88, 84,
+  85, 90, 72, 93, 77, 80, 92, 84, 80, 89,
+  91, 79, 86, 82, 83, 84, 83, 80, 79, 74,
+  87, 79, 91, 79, 83, 69, 86, 87, 79, 74,
+  82, 92, 67, 89, 89, 81, 62, 90, 86, 74,
+  87, 79, 62, 84, 96, 80, 87, 100, 83, 91,
+  73, 76, 89, 68, 79, 84, 81, 101, 98, 71,
+  78, 84, 76, 75, 93, 81, 86, 75, 85, 103,
+  84, 81, 89, 80, 78, 75, 80, 85, 102, 83,
+  80, 112, 82, 87, 73, 87, 100, 78, 98, 89,
+  81, 76, 82, 89, 78, 75, 76, 83, 71, 93,
+  89, 84, 84, 84, 88, 73, 83, 86, 77, 96,
+  88, 87, 87, 77, 77, 79, 97, 89, 115, 84,
+  85, 88, 94, 76, 91, 84, 89, 85, 89, 94,
+  80, 99, 83, 80, 95, 78, 73, 88, 94, 83,
+  88, 84, 90, 83, 83, 82, 85, 65, 85, 76,
+  91, 76, 74, 75, 90, 79, 76, 70, 79, 87,
+  67, 83, 88, 79, 65, 89, 79, 78, 89, 76,
+  65, 76, 89, 76, 76, 93, 84, 96, 71, 74,
+  86, 65, 72, 83, 80, 101, 89, 77, 79, 86,
+  87, 75, 89, 87, 86, 79, 85, 96, 81, 76,
+  93, 76, 72, 69, 79, 79, 94, 81, 84, 98,
+  80, 87, 70, 79, 105, 80, 87, 86, 86, 84,
+  84, 89, 75, 78, 75, 79, 79, 86, 87, 84,
+  80, 83, 76, 77, 82, 84, 74, 83, 83, 92,
+  86, 78, 79, 80, 87, 82, 104, 90, 87, 82,
+  81, 92, 86, 81, 90, 81, 87, 87, 90, 91,
+  79, 87, 90, 85, 80, 88, 93, 77, 85, 88,
+  85, 85, 81, 75, 78, 72, 86, 82, 92, 76,
+  75, 75, 86, 90, 75, 68, 87, 90, 73, 86,
+  85, 86, 66, 80, 84, 77, 86, 79, 62, 74,
+  91, 83, 82, 91, 81, 89, 76, 84, 92, 71,
+  79, 87, 82, 91, 87, 76, 74, 95, 78, 77,
+  89, 82, 81, 82, 83, 100, 84, 81, 86, 84,
+  79, 76, 83, 85, 91, 85, 91, 105, 75, 84,
+  73, 86, 98, 73, 86, 86, 72, 84, 83, 94,
+  72, 73, 68, 77, 86, 82, 85, 83, 86, 89,
+  75, 75, 82, 79, 80, 92, 88, 94, 91, 77,
+  82, 80, 86, 81, 97, 95, 84, 99, 94, 90,
+  91, 84, 92, 89, 94, 81, 75, 83, 82, 72,
+  88, 86, 84, 83, 87, 77, 85, 82, 86, 84,
+  75, 83, 73, 81, 92, 84, 85, 83, 83, 74,
+  85, 90, 79, 75, 94, 87, 76, 81, 90, 79,
+  69, 86, 90, 74, 85, 84, 61, 83, 88, 87,
+  87, 100, 81, 84, 79, 81, 97, 77, 86, 93,
+  86, 97, 94, 79, 78, 85, 83, 77, 89, 76,
+  80, 78, 85, 100, 89, 77, 82, 76, 81, 81,
+  82, 87, 96, 85, 78, 113, 79, 94, 79, 96,
+  97, 77, 83, 92, 82, 83, 83, 90, 73, 76,
+  72, 82, 86, 82, 88, 88, 83, 87, 75, 77,
+  86, 84, 77, 87, 90, 98, 87, 76, 88, 81,
+  89, 89, 89, 91, 93, 85, 92, 81, 90, 85,
+  86, 86, 94, 80, 78, 85, 84, 76, 88, 81,
+  82, 86, 84, 79, 88, 82, 90, 85, 77, 83,
+  78, 73, 86, 87, 89, 81, 75, 74, 90, 83,
+  77, 78, 83, 84, 78, 76, 92, 79, 69, 83,
+  87, 76, 87, 82, 66, 77, 81, 86, 79, 92,
+  85, 86, 80, 76, 99, 77, 86, 93, 88, 91,
+  89, 80, 83, 84, 86, 77, 81, 78, 80, 81,
+  81, 101, 87, 72, 88, 75, 78, 76, 88, 84,
+  89, 88, 85, 101, 80, 93, 79, 92, 101, 81,
+  86, 86, 86, 83, 84, 91, 74, 78, 67, 79,
+  88, 81, 91, 93, 80, 86, 70, 79, 86, 86,
+  73, 89, 94, 98, 81, 74, 80, 84, 82, 81,
+  92, 95, 88, 83, 82, 92, 85, 80, 87, 84,
+  92, 79, 77, 83, 81, 71, 88, 85, 80, 83,
+  88, 78, 85, 86, 81, 82, 77, 81, 75, 84,
+  92, 88, 88, 81, 75, 77, 85, 89, 76, 70,
+  79, 89, 80, 80, 92, 83, 72, 81, 84, 79,
+  87, 84, 63, 77, 89, 94, 77, 91, 84, 80,
+  80, 80, 93, 77, 83, 92, 88, 91, 86, 79,
+  73, 89, 89, 79, 84, 84, 78, 84, 86, 97,
+  87, 76, 82, 80, 84, 86, 90, 85, 91, 86,
+  91, 102, 76, 89, 82, 92, 96, 81, 94, 70,
+  93, 84, 76, 93, 75, 86, 85, 83, 74, 86,
+  77, 90, 72, 83, 82, 82, 96, 92, 84, 84,
+  82, 79, 82, 85, 81, 94, 97, 73, 101, 105,
+  95, 96, 87, 96, 86, 74, 93, 70, 92, 67,
+  80, 88, 91, 81, 76, 75, 87, 76, 91, 75,
+  84, 87, 103, 93, 91, 70, 84, 76, 97, 84,
+  95, 84, 83, 88, 81, 87, 80, 83, 75, 83,
+  86, 88, 83, 80, 86, 74, 76, 83, 86, 77,
+  86, 97, 73, 81, 85, 82, 91, 86, 91, 90,
+  93, 69, 73, 112, 93, 85, 84, 72, 69, 76,
+  92, 84, 83, 78, 76, 91, 79, 81, 89, 99,
+  91, 98, 90, 96, 84, 83, 80, 91, 79, 96,
+  71, 86, 86, 88, 102, 75, 80, 80, 79, 72,
+  83, 101, 76, 85, 79, 81, 70, 83, 83, 91,
+  79, 80, 87, 76, 70, 84, 76, 81, 66, 83,
+  71, 97, 73, 80, 91, 83, 97, 89, 74, 88,
+  84, 89, 90, 88, 83, 74, 79, 65, 91, 88,
+  93, 74, 68, 73, 92, 93, 84, 80, 86, 72,
+  96, 89, 70, 76, 94, 84, 94, 79, 88, 73,
+  76, 78, 77, 75, 65, 78, 88, 88, 82, 83,
+  77, 66, 84, 76, 78, 77, 85, 78, 71, 81,
+  78, 72, 82, 84, 90, 87, 80, 88, 97, 76,
+  65, 109, 91, 87, 74, 64, 71, 89, 91, 90,
+  89, 68, 65, 81, 68, 93, 81, 89, 88, 97,
+  84, 86, 76, 91, 74, 91, 81, 111, 76, 85,
+  78, 83, 90, 75, 81, 76, 77, 69, 82, 86,
+  78, 92, 80, 86, 78, 81, 99, 84, 79, 83,
+  91, 79, 60, 84, 82, 77, 79, 92, 84, 88,
+  78, 75, 78, 91, 95, 76, 77, 79, 87, 78,
+  91, 89, 84, 77, 83, 70, 92, 83, 96, 75,
+  79, 96, 89, 99, 76, 76, 87, 70, 93, 88,
+  60, 86, 93, 93, 92, 80, 80, 83, 92, 82,
+  92, 79, 56, 82, 86, 92, 100, 82, 85, 65,
+  79, 86, 71, 86, 79, 78, 78, 85, 80, 76,
+  81, 92, 96, 84, 74, 79, 94, 92, 83, 94,
+  83, 97, 71, 88, 79, 82, 94, 94, 91, 68,
+  67, 81, 76, 84, 88, 75, 88, 95, 88, 89,
+  96, 98, 82, 88, 91, 104, 90, 78, 78, 90,
+  74, 84, 88, 74, 89, 87, 77, 92, 76, 85,
+  88, 86, 86, 79, 78, 84, 71, 74, 81, 92,
+  114, 84, 73, 82, 78, 73, 98, 78, 83, 98,
+  104, 69, 83, 104, 110, 91, 91, 94, 83, 70,
+  83, 65, 97, 76, 98, 79, 89, 93, 92, 81,
+  78, 79, 91, 82, 82, 107, 114, 84, 97, 57,
+  85, 82, 89, 93, 101, 71, 68, 101, 75, 86,
+  78, 69, 82, 73, 81, 75, 86, 76, 75, 76,
+  77, 86, 84, 84, 93, 96, 74, 83, 84, 80,
+  86, 80, 90, 82, 81, 72, 81, 102, 89, 80,
+  81, 89, 69, 73, 86, 83, 69, 77, 85, 87,
+  88, 66, 89, 94, 93, 85, 88, 95, 79, 77,
+  79, 74, 79, 71, 83, 73, 101, 85, 104, 83,
+  79, 80, 77, 78, 89, 104, 68, 80, 81, 83,
+  72, 84, 76, 94, 77, 75, 90, 83, 93, 84,
+  70, 90, 59, 74, 87, 87, 75, 86, 113, 69,
+  96, 101, 86, 95, 87, 94, 77, 86, 81, 64,
+  106, 72, 110, 91, 93, 85, 71, 73, 91, 82,
+  86, 83, 82, 87, 104, 88, 84, 67, 89, 69,
+  93, 89, 97, 70, 54, 77, 75, 83, 69, 67,
+  87, 72, 67, 83, 75, 71, 76, 76, 80, 79,
+  86, 88, 73, 81, 81, 80, 75, 80, 82, 80,
+  89, 88, 96, 76, 70, 123, 97, 84, 70, 63,
+  71, 87, 85, 86, 76, 63, 78, 85, 73, 81,
+  80, 105, 92, 86, 84, 80, 72, 87, 75, 87,
+  70, 92, 70, 79, 90, 80, 107, 72, 75, 81,
+  77, 72, 85, 94, 71, 80, 82, 82, 70, 82,
+  96, 87, 84, 87, 93, 75, 66, 80, 79, 88,
+  78, 88, 91, 92, 72, 80, 93, 86, 92, 88,
+  77, 85, 84, 87, 79, 93, 88, 84, 101, 69,
+  102, 88, 83, 81, 80, 81, 93, 98, 73, 81,
+  88, 73, 91, 86, 68, 88, 96, 79, 91, 87,
+  91, 70, 77, 81, 90, 81, 63, 75, 79, 78,
+  85, 75, 78, 64, 79, 77, 82, 80, 84, 84,
+  71, 88, 84, 83, 76, 86, 91, 83, 77, 79,
+  108, 85, 71, 110, 80, 91, 73, 72, 78, 87,
+  84, 91, 86, 73, 76, 82, 70, 96, 81, 87,
+  85, 88, 86, 89, 97, 94, 80, 97, 82, 111,
+  87, 82, 86, 87, 87, 76, 77, 84, 86, 92,
+  73, 71, 92, 84, 78, 92, 87, 68, 86, 78,
+  70, 87, 67, 90, 101, 79, 79, 89, 86, 93,
+  91, 83, 97, 96, 79, 64, 77, 92, 106, 89,
+  81, 90, 83, 75, 83, 69, 91, 82, 86, 73,
+  96, 98, 101, 87, 79, 93, 87, 90, 84, 100,
+  98, 81, 85, 76, 80, 98, 83, 86, 93, 79,
+  73, 111, 81, 86, 78, 73, 86, 84, 85, 75,
+  93, 72, 77, 81, 91, 85, 92, 85, 95, 91,
+  78, 84, 93, 77, 96, 81, 70, 76, 78, 80,
+  75, 79, 77, 77, 78, 91, 76, 81, 91, 78,
+  69, 82, 91, 86, 81, 73, 95, 77, 86, 76,
+  90, 97, 88, 73, 82, 86, 82, 71, 84, 78,
+  102, 82, 88, 95, 76, 77, 83, 90, 77, 93,
+  77, 81, 79, 86, 86, 82, 76, 85, 66, 79,
+  78, 89, 104, 82, 79, 97, 63, 82, 86, 76,
+  94, 88, 99, 64, 87, 110, 102, 94, 93, 91,
+  70, 89, 83, 62, 106, 71, 89, 89, 97, 96,
+  80, 79, 85, 82, 86, 88, 79, 100, 102, 78,
+  94, 71, 76, 80, 84, 91, 92, 80, 66, 92,
+  78, 85, 76, 78, 89, 66, 74, 83, 79, 71,
+  76, 81, 83, 85, 85, 87, 87, 86, 75, 85,
+  75, 81, 80, 78, 94, 79, 80, 81, 77, 102,
+  96, 79, 77, 82, 78, 80, 89, 79, 65, 76,
+  85, 89, 82, 69, 90, 103, 94, 81, 95, 88,
+  84, 74, 73, 88, 75, 71, 75, 78, 97, 78,
+  103, 85, 86, 74, 81, 88, 74, 103, 76, 75,
+  81, 84, 76, 80, 93, 90, 75, 84, 82, 80,
+  80, 79, 87, 93, 73, 94, 85, 87, 86, 85,
+  94, 90, 91, 104, 86, 93, 83, 91, 75, 99,
+  91, 83, 113, 75, 81, 89, 87, 85, 86, 88,
+  91, 88, 79, 84, 84, 85, 96, 80, 90, 87,
+  81, 79, 87, 83, 91, 76, 76, 89, 84, 80,
+  80, 89, 76, 72, 85, 80, 81, 73, 85, 72,
+  77, 85, 86, 88, 75, 88, 82, 93, 67, 84,
+  87, 75, 92, 76, 100, 85, 77, 98, 88, 88,
+  83, 81, 81, 82, 93, 81, 84, 81, 75, 91,
+  77, 86, 88, 92, 88, 87, 92, 88, 105, 84,
+  80, 87, 88, 86, 81, 81, 90, 82, 97, 80,
+  99, 83, 74, 79, 89, 88, 69, 86, 91, 80,
+  81, 80, 92, 82, 68, 81, 87, 89, 86, 75,
+  83, 91, 73, 83, 85, 74, 85, 87, 84, 101,
+  88, 92, 72, 80, 79, 91, 73, 84, 92, 81,
+  85, 76, 90, 77, 84, 83, 78, 79, 80, 81,
+  93, 88, 86, 79, 80, 84, 83, 93, 89, 91,
+  90, 80, 96, 88, 87, 87, 98, 93, 75, 87,
+  97, 90, 98, 91, 71, 79, 78, 95, 79, 87,
+  88, 93, 74, 78, 74, 85, 84, 92, 92, 76,
+  82, 100, 74, 85, 88, 91, 91, 87, 71, 82,
+  73, 84, 80, 87, 86, 76, 83, 84, 80, 73,
+  79, 65, 80, 82, 84, 84, 77, 79, 79, 81,
+  103, 79, 84, 88, 92, 94, 95, 89, 83, 86,
+  53, 79, 85, 72, 88, 83, 92, 84, 72, 80,
+  88, 66, 80, 80, 89, 94, 82, 74, 85, 87,
+  72, 85, 88, 90, 88, 83, 80, 78, 88, 79,
+  84, 93, 76, 83, 79, 79, 82, 89, 84, 76,
+  83, 96, 76, 89, 94, 68, 76, 85, 75, 90,
+  95, 80, 88, 88, 99, 86, 87, 79, 83, 74,
+  80, 76, 82, 87, 84, 88, 87, 80, 96, 73,
+  86, 84, 86, 80, 88, 94, 88, 74, 88, 80,
+  85, 67, 79, 65, 79, 77, 88, 82, 75, 91,
+  74, 84, 80, 80, 86, 73, 70, 85, 64, 79,
+  81, 87, 86, 79, 84, 96, 82, 80, 81, 72,
+  89, 82, 67, 78, 73, 76, 81, 89, 95, 82,
+  89, 90, 94, 81, 90, 91, 88, 95, 83, 86,
+  90, 73, 96, 78, 92, 87, 76, 85, 76, 69,
+  93, 82, 92, 93, 84, 81, 81, 83, 74, 78,
+  93, 97, 85, 84, 75, 94, 89, 80, 85, 97,
+  86, 83, 95, 90, 75, 71, 95, 76, 75, 108,
+  78, 91, 97, 74, 81, 83, 70, 98, 88, 87,
+  97, 97, 103, 95, 83, 85, 84, 77, 81, 81,
+  97, 77, 80, 88, 95, 91, 95, 73, 83, 74,
+  93, 82, 97, 86, 99, 75, 92, 80, 80, 81,
+  96, 77, 87, 78, 87, 80, 72, 73, 79, 84,
+  78, 94, 85, 82, 74, 82, 79, 78, 87, 91,
+  90, 84, 86, 98, 86, 79, 82, 80, 90, 80,
+  74, 78, 83, 87, 86, 88, 83, 87, 88, 90,
+  96, 77, 83, 80, 112, 86, 69, 84, 94, 92,
+  67, 71, 76, 83, 85, 86, 81, 114, 59, 77,
+  78, 63, 75, 88, 76, 73, 70, 85, 85, 64,
+  89, 89, 102, 133, 78, 103, 71, 81, 86, 90,
+  129, 82, 116, 57, 94, 85, 77, 61, 94, 64,
+  75, 96, 90, 59, 111, 59, 71, 80, 69, 94,
+  80, 72, 81, 103, 88, 89, 101, 92, 68, 88,
+  93, 103, 95, 93, 68, 96, 96, 85, 66, 76,
+  87, 79, 88, 95, 78, 102, 70, 91, 63, 103,
+  84, 114, 73, 79, 78, 105, 93, 83, 98, 87,
+  92, 95, 85, 92, 81, 124, 81, 93, 89, 85,
+  71, 84, 88, 69, 67, 64, 67, 82, 79, 101,
+  48, 89, 84, 87, 111, 70, 63, 77, 68, 94,
+  91, 92, 95, 93, 63, 78, 77, 125, 89, 80,
+  71, 91, 74, 79, 85, 79, 66, 79, 78, 87,
+  80, 80, 78, 89, 70, 97, 74, 78, 93, 88,
+  88, 108, 84, 89, 87, 86, 80, 87, 105, 69,
+  94, 88, 80, 105, 77, 79, 83, 73, 82, 127,
+  83, 94, 76, 76, 80, 75, 90, 65, 96, 63,
+  78, 94, 88, 78, 66, 68, 47, 87, 78, 93,
+  81, 64, 70, 86, 86, 80, 84, 86, 92, 69,
+  69, 87, 78, 73, 92, 93, 66, 71, 80, 91,
+  60, 80, 81, 81, 86, 74, 88, 69, 90, 73,
+  80, 88, 56, 126, 81, 93, 78, 71, 70, 89,
+  83, 90, 79, 70, 86, 89, 46, 80, 53, 83,
+  83, 85, 107, 89, 88, 84, 73, 75, 85, 124,
+  77, 93, 87, 75, 79, 88, 104, 82, 89, 93,
+  76, 82, 68, 70, 85, 84, 85, 103, 89, 73,
+  80, 99, 72, 83, 84, 95, 89, 88, 77, 79,
+  91, 73, 93, 88, 82, 83, 59, 81, 83, 85,
+  82, 80, 84, 106, 84, 95, 89, 87, 77, 87,
+  69, 103, 90, 81, 102, 83, 92, 88, 78, 89,
+  85, 77, 64, 66, 76, 81, 77, 83, 94, 71,
+  97, 76, 82, 82, 99, 87, 81, 80, 81, 83,
+  92, 78, 91, 80, 86, 73, 85, 79, 88, 79,
+  95, 69, 76, 72, 72, 89, 80, 77, 80, 80,
+  70, 77, 82, 95, 86, 71, 80, 99, 83, 85,
+  85, 87, 93, 83, 56, 69, 73, 85, 82, 90,
+  87, 77, 95, 92, 97, 78, 78, 90, 104, 83,
+  76, 84, 91, 91, 76, 75, 70, 82, 83, 87,
+  88, 118, 62, 80, 75, 72, 80, 79, 74, 88,
+  74, 83, 72, 78, 90, 93, 90, 107, 88, 97,
+  85, 85, 72, 89, 89, 78, 77, 73, 91, 81,
+  85, 74, 80, 77, 74, 99, 90, 73, 100, 87,
+  86, 81, 67, 79, 80, 75, 80, 88, 90, 93,
+  101, 80, 71, 86, 65, 82, 100, 84, 63, 84,
+  90, 83, 65, 77, 87, 83, 85, 81, 83, 92,
+  76, 85, 79, 92, 85, 106, 93, 100, 89, 92,
+  82, 74, 91, 83, 85, 86, 89, 84, 74, 91,
+  78, 93, 82, 83, 92, 86, 81, 83, 80, 73,
+  78, 85, 89, 92, 82, 74, 81, 85, 109, 81,
+  80, 83, 85, 84, 90, 83, 93, 84, 94, 89,
+  73, 83, 90, 83, 84, 89, 80, 84, 88, 97,
+  71, 90, 79, 89, 81, 80, 78, 95, 76, 85,
+  67, 85, 90, 87, 82, 111, 87, 86, 86, 81,
+  71, 68, 104, 83, 66, 88, 85, 89, 76, 97,
+  81, 78, 87, 86, 79, 84, 80, 92, 85, 76,
+  86, 58, 93, 73, 79, 91, 78, 74, 78, 73,
+  63, 90, 71, 81, 85, 80, 42, 73, 83, 85,
+  82, 82, 85, 73, 69, 81, 83, 75, 83, 88,
+  83, 79, 71, 82, 81, 83, 80, 93, 76, 73,
+  81, 77, 87, 66, 79, 82, 72, 69, 79, 91,
+  68, 73, 78, 99, 73, 86, 89, 79, 85, 89,
+  80, 79, 84, 78, 83, 77, 97, 86, 90, 88,
+  88, 70, 87, 97, 83, 92, 97, 84, 81, 82,
+  92, 84, 93, 91, 79, 81, 75, 83, 89, 89,
+  87, 101, 85, 80, 77, 94, 80, 72, 79, 93,
+  82, 87, 74, 92, 89, 77, 90, 90, 79, 84,
+  75, 92, 78, 79, 85, 74, 82, 110, 85, 90,
+  86, 82, 80, 74, 68, 100, 77, 85, 96, 70,
+  95, 94, 85, 90, 79, 84, 66, 72, 91, 78,
+  87, 82, 93, 96, 70, 72, 73, 83, 100, 82,
+  87, 77, 63, 87, 91, 74, 81, 84, 90, 81,
+  77, 80, 82, 81, 84, 98, 76, 77, 78, 92,
+  85, 74, 85, 80, 84, 72, 82, 92, 85, 78,
+  78, 92, 80, 84, 84, 86, 91, 85, 82, 82,
+  84, 88, 85, 74, 77, 86, 88, 91, 99, 78,
+  85, 82, 106, 67, 100, 116, 72, 120, 81, 79,
+  90, 88, 76, 97, 87, 78, 70, 92, 93, 98,
+  121, 109, 77, 122, 71, 69, 83, 73, 81, 116,
+  107, 107, 103, 149, 74, 83, 74, 99, 89, 106,
+  84, 73, 76, 79, 97, 95, 79, 107, 95, 81,
+  87, 83, 84, 88, 81, 75, 101, 90, 87, 93,
+  90, 88, 89, 67, 82, 71, 70, 75, 83, 98,
+  72, 90, 87, 103, 73, 106, 76, 101, 90, 77,
+  91, 69, 75, 82, 71, 64, 86, 76, 79, 110,
+  83, 83, 87, 107, 100, 68, 89, 84, 95, 81,
+  64, 52, 89, 85, 95, 85, 85, 103, 79, 89,
+  74, 111, 79, 96, 64, 80, 93, 78, 84, 106,
+  77, 80, 98, 119, 89, 94, 83, 71, 82, 71,
+  77, 62, 100, 95, 75, 115, 96, 82, 77, 83,
+  72, 83, 97, 81, 79, 84, 73, 83, 80, 84,
+  66, 84, 65, 83, 83, 82, 72, 87, 94, 108,
+  83, 114, 71, 81, 79, 106, 83, 101, 79, 87,
+  74, 76, 98, 82, 82, 93, 87, 90, 76, 98,
+  80, 95, 91, 71, 80, 84, 71, 84, 99, 86,
+  83, 75, 74, 54, 83, 69, 86, 85, 68, 92,
+  76, 100, 80, 87, 75, 94, 84, 72, 89, 90,
+  86, 81, 77, 78, 74, 81, 97, 94, 84, 83,
+  89, 89, 92, 89, 85, 87, 88, 83, 65, 74,
+  80, 81, 83, 82, 84, 96, 78, 75, 73, 86,
+  79, 85, 67, 95, 81, 89, 93, 87, 86, 91,
+  109, 102, 88, 86, 89, 80, 83, 77, 77, 62,
+  84, 79, 83, 91, 95, 84, 79, 73, 87, 82,
+  90, 82, 85, 88, 81, 93, 71, 78, 70, 69,
+  69, 87, 86, 79, 75, 70, 85, 100, 81, 78,
+  79, 80, 87, 91, 85, 93, 87, 83, 76, 88,
+  95, 80, 95, 79, 92, 91, 79, 99, 86, 96,
+  80, 87, 85, 81, 73, 79, 94, 89, 84, 88,
+  76, 64, 84, 88, 89, 80, 80, 90, 83, 87,
+  93, 63, 77, 79, 78, 69, 84, 91, 86, 84,
+  89, 80, 88, 81, 94, 78, 87, 80, 96, 77,
+  75, 91, 79, 93, 89, 89, 66, 95, 83, 81,
+  74, 87, 79, 87, 78, 80, 82, 57, 90, 83,
+  77, 84, 87, 89, 85, 83, 77, 94, 98, 86,
+  74, 77, 86, 90, 82, 83, 93, 80, 105, 106,
+  73, 115, 84, 73, 82, 92, 70, 94, 86, 76,
+  74, 82, 77, 89, 97, 98, 69, 102, 77, 77,
+  84, 76, 85, 102, 83, 103, 80, 128, 72, 79,
+  71, 99, 81, 97, 92, 79, 75, 66, 87, 93,
+  74, 96, 100, 81, 79, 90, 74, 80, 92, 68,
+  82, 83, 83, 90, 87, 85, 88, 70, 73, 77,
+  86, 74, 84, 89, 70, 91, 75, 94, 70, 100,
+  86, 94, 81, 76, 113, 69, 88, 86, 66, 69,
+  80, 92, 82, 101, 82, 85, 86, 91, 89, 76,
+  84, 81, 90, 77, 81, 61, 91, 79, 90, 79,
+  82, 98, 84, 87, 82, 105, 74, 90, 71, 82,
+  78, 86, 83, 100, 78, 78, 101, 101, 91, 92,
+  87, 85, 84, 71, 77, 73, 89, 83, 81, 92,
+  93, 78, 80, 84, 74, 86, 97, 84, 88, 80,
+  72, 76, 59, 76, 63, 81, 66, 85, 87, 85,
+  80, 76, 80, 97, 79, 86, 75, 80, 74, 97,
+  78, 91, 87, 90, 71, 71, 86, 84, 78, 86,
+  99, 91, 78, 98, 84, 83, 95, 66, 71, 80,
+  74, 85, 96, 86, 80, 81, 72, 65, 77, 72,
+  93, 82, 70, 80, 79, 91, 87, 88, 85, 79,
+  79, 73, 92, 94, 93, 89, 77, 76, 74, 88,
+  100, 82, 86, 79, 84, 84, 80, 91, 84, 79,
+  82, 82, 74, 85, 76, 76, 81, 82, 83, 81,
+  83, 81, 79, 80, 75, 81, 78, 86, 81, 93,
+  78, 83, 85, 86, 111, 84, 78, 86, 88, 92,
+  86, 82, 80, 72, 76, 78, 87, 71, 90, 81,
+  86, 75, 94, 86, 93, 89, 89, 81, 85, 88,
+  62, 80, 74, 73, 71, 88, 93, 80, 85, 65,
+  78, 95, 81, 64, 83, 78, 87, 88, 76, 82,
+  94, 79, 70, 89, 84, 85, 97, 81, 92, 93,
+  81, 98, 87, 87, 79, 89, 84, 85, 84, 83,
+  87, 92, 82, 92, 72, 81, 82, 96, 96, 85,
+  85, 86, 81, 82, 100, 66, 82, 70, 78, 71,
+  75, 89, 90, 88, 93, 73, 93, 82, 91, 76,
+  86, 77, 96, 74, 72, 95, 79, 81, 86, 86,
+  79, 101, 77, 82, 76, 87, 77, 81, 88, 85,
+  92, 56, 85, 82, 84, 80, 91, 86, 85, 83,
+  76, 88, 96, 77, 65, 76, 81, 93, 83, 84,
+  94, 81, 83, 92, 76, 113, 82, 77, 87, 80,
+  80, 94, 86, 90, 79, 80, 73, 88, 89, 84,
+  68, 86, 84, 86, 79, 82, 83, 89, 95, 102,
+  77, 113, 76, 78, 72, 89, 90, 88, 93, 96,
+  84, 69, 82, 92, 80, 87, 91, 86, 77, 88,
+  85, 85, 90, 71, 90, 95, 81, 87, 80, 79,
+  84, 77, 75, 82, 85, 77, 95, 83, 72, 87,
+  68, 86, 77, 92, 88, 85, 79, 74, 96, 75,
+  93, 83, 73, 71, 80, 89, 88, 86, 83, 88,
+  85, 95, 78, 82, 77, 80, 96, 82, 81, 76,
+  89, 80, 81, 85, 82, 79, 79, 88, 89, 80,
+  72, 81, 76, 83, 75, 92, 83, 91, 77, 68,
+  103, 83, 85, 86, 90, 98, 84, 81, 82, 72,
+  72, 86, 83, 88, 89, 78, 89, 77, 87, 85,
+  93, 91, 90, 81, 75, 87, 66, 78, 64, 81,
+  70, 83, 84, 83, 79, 72, 84, 92, 82, 85,
+  78, 80, 78, 85, 79, 85, 86, 94, 79, 76,
+  87, 93, 80, 79, 90, 89, 80, 91, 90, 90,
+  84, 78, 83, 87, 77, 86, 88, 87, 85, 84,
+  75, 76, 90, 85, 96, 80, 75, 83, 81, 86,
+  87, 75, 84, 72, 77, 73, 74, 91, 92, 90,
+  84, 71, 84, 82, 95, 73, 84, 80, 90, 88,
+  74, 90, 77, 78, 86, 88, 77, 94, 78, 83,
+  81, 85, 80, 74, 81, 83, 88, 65, 75, 79,
+  82, 81, 86, 88, 76, 87, 83, 76, 106, 76,
+  65, 83, 83, 93, 87, 91, 80, 75, 73, 84,
+  86, 80, 82, 83, 87, 74, 95, 87, 87, 91,
+  82, 84, 78, 95, 71, 81, 75, 74, 79, 81,
+  94, 69, 86, 69, 78, 95, 83, 72, 82, 77,
+  84, 85, 80, 82, 93, 79, 81, 91, 82, 88,
+  94, 83, 95, 97, 80, 92, 86, 91, 71, 97,
+  86, 87, 83, 84, 83, 86, 87, 91, 81, 86,
+  87, 96, 89, 82, 82, 84, 78, 83, 97, 56,
+  81, 69, 79, 69, 70, 80, 87, 90, 95, 70,
+  93, 75, 90, 73, 82, 77, 98, 76, 71, 89,
+  76, 78, 89, 85, 81, 101, 82, 92, 82, 85,
+  79, 77, 81, 86, 99, 57, 78, 78, 81, 80,
+  91, 91, 94, 78, 76, 85, 98, 74, 70, 72,
+  78, 91, 87, 90, 79, 86, 84, 83, 71, 91,
+  92, 66, 83, 65, 70, 72, 87, 85, 80, 68,
+  79, 86, 70, 85, 84, 89, 86, 102, 71, 82,
+  82, 87, 89, 86, 91, 81, 87, 74, 71, 80,
+  73, 113, 85, 83, 80, 69, 92, 87, 71, 77,
+  76, 83, 87, 83, 83, 96, 92, 96, 91, 75,
+  79, 87, 85, 84, 104, 83, 86, 76, 71, 81,
+  89, 91, 80, 71, 66, 83, 79, 86, 69, 80,
+  77, 79, 80, 66, 93, 80, 83, 86, 90, 81,
+  75, 86, 99, 86, 66, 73, 85, 102, 71, 100,
+  90, 83, 82, 81, 70, 82, 81, 79, 104, 88,
+  70, 91, 78, 72, 79, 76, 83, 95, 93, 92,
+  105, 98, 70, 97, 96, 78, 77, 67, 89, 71,
+  77, 119, 76, 97, 72, 86, 73, 67, 84, 73,
+  81, 63, 74, 71, 91, 85, 81, 70, 85, 92,
+  62, 102, 90, 84, 72, 95, 70, 83, 85, 86,
+  94, 66, 86, 85, 88, 73, 76, 62, 75, 125,
+  87, 81, 85, 69, 84, 90, 75, 74, 85, 72,
+  88, 81, 82, 90, 100, 98, 87, 86, 74, 95,
+  86, 91, 102, 77, 92, 84, 57, 88, 93, 93,
+  79, 61, 80, 78, 76, 86, 68, 73, 80, 70,
+  85, 63, 94, 80, 88, 79, 86, 70, 82, 79,
+  116, 81, 69, 82, 78, 107, 63, 96, 91, 94,
+  82, 77, 73, 87, 87, 84, 96, 94, 73, 91,
+  70, 73, 75, 76, 83, 77, 89, 84, 78, 93,
+  61, 96, 90, 76, 74, 68, 88, 78, 73, 128,
+  74, 100, 70, 73, 78, 88, 91, 74, 83, 66,
+  70, 85, 92, 79, 84, 76, 81, 82, 72, 99,
+  89, 86, 87, 103, 67, 87, 88, 83, 79, 61,
+  87, 84, 85, 72, 85, 79, 84, 108, 82, 79,
+  80, 65, 81, 86, 81, 81, 81, 84, 95, 80,
+  78, 83, 89, 98, 93, 84, 78, 90, 88, 83,
+  97, 83, 82, 74, 82, 82, 87, 87, 83, 65,
+  107, 85, 95, 82, 74, 77, 80, 85, 85, 71,
+  97, 75, 82, 84, 82, 74, 94, 85, 93, 91,
+  68, 81, 86, 103, 82, 103, 94, 76, 80, 81,
+  73, 89, 84, 81, 101, 87, 74, 90, 84, 75,
+  78, 77, 86, 75, 71, 87, 70, 99, 78, 96,
+  89, 85, 78, 72, 88, 77, 77, 106, 89, 88,
+  76, 103, 83, 95, 83, 71, 85, 79, 66, 79,
+  82, 85, 76, 77, 89, 82, 87, 70, 94, 89,
+  74, 98, 85, 85, 85, 86, 87, 74, 98, 77,
+  77, 83, 61, 81, 73, 127, 89, 84, 89, 73,
+  82, 84, 70, 83, 74, 83, 79, 76, 100, 82,
+  86, 95, 97, 83, 82, 82, 89, 90, 106, 67,
+  69, 70, 60, 92, 83, 89, 88, 55, 75, 90,
+  77, 93, 71, 85, 91, 117, 68, 68, 89, 89,
+  94, 73, 93, 81, 85, 85, 89, 79, 65, 76,
+  85, 114, 70, 88, 86, 88, 91, 79, 66, 84,
+  69, 81, 75, 110, 91, 80, 78, 65, 75, 77,
+  79, 89, 79, 95, 101, 86, 76, 80, 83, 63,
+  85, 64, 85, 80, 81, 95, 87, 94, 73, 106,
+  81, 76, 76, 79, 75, 71, 66, 81, 79, 87,
+  72, 69, 91, 93, 85, 78, 85, 85, 76, 85,
+  91, 89, 80, 76, 91, 66, 100, 86, 74, 87,
+  66, 69, 72, 104, 88, 74, 91, 65, 84, 87,
+  75, 83, 76, 88, 75, 64, 102, 80, 83, 97,
+  99, 88, 93, 81, 105, 85, 110, 76, 82, 78,
+  59, 98, 80, 98, 88, 56, 64, 80, 77, 81,
+  58, 83, 93, 98, 71, 55, 86, 86, 100, 80,
+  96, 79, 88, 78, 81, 68, 67, 76, 79, 117,
+  70, 92, 82, 107, 79, 74, 68, 96, 67, 86,
+  64, 126, 106, 75, 63, 61, 70, 72, 78, 91,
+  78, 100, 84, 77, 69, 81, 82, 66, 75, 64,
+  77, 86, 70, 100, 85, 95, 81, 95, 82, 86,
+  77, 73, 87, 80, 68, 83, 88, 80, 81, 82,
+  89, 82, 90, 78, 77, 91, 88, 98, 82, 81,
+  87, 89, 81, 61, 93, 87, 78, 84, 80, 83,
+  74, 122, 82, 84, 90, 70, 90, 84, 75, 77,
+  83, 103, 85, 76, 89, 80, 89, 93, 92, 86,
+  81, 84, 91, 85, 99, 75, 68, 67, 77, 89,
+  81, 83, 92, 53, 85, 89, 82, 88, 69, 77,
+  88, 83, 76, 71, 92, 86, 91, 90, 87, 85,
+  84, 80, 88, 86, 65, 71, 84, 118, 68, 91,
+  87, 84, 77, 72, 70, 83, 74, 84, 80, 103,
+  89, 84, 76, 72, 74, 81, 83, 94, 73, 83,
+  79, 90, 87, 83, 86, 73, 84, 65, 83, 85,
+  80, 94, 88, 100, 74, 93, 84, 93, 75, 82,
+  81, 92, 69, 88, 78, 81, 72, 79, 93, 71,
+  92, 71, 90, 97, 66, 79, 87, 79, 102, 86,
+  88, 78, 95, 72, 76, 83, 75, 95, 95, 101,
+  93, 90, 92, 70, 68, 87, 78, 82, 84, 88,
+  76, 80, 93, 82, 88, 94, 86, 89, 89, 66,
+  82, 76, 90, 67, 84, 75, 64, 80, 84, 93,
+  106, 78, 97, 93, 94, 81, 69, 90, 95, 108,
+  79, 67, 89, 88, 105, 79, 95, 85, 103, 76,
+  72, 88, 79, 89, 94, 91, 79, 72, 83, 76,
+  87, 72, 75, 93, 83, 80, 58, 94, 98, 80,
+  87, 78, 74, 95, 97, 81, 86, 85, 93, 81,
+  93, 75, 89, 75, 94, 79, 101, 82, 73, 75,
+  82, 91, 81, 94, 80, 89, 69, 86, 70, 82,
+  71, 92, 72, 90, 65, 66, 85, 81, 90, 71,
+  81, 85, 80, 68, 95, 79, 97, 76, 98, 87,
+  106, 77, 79, 89, 79, 86, 95, 64, 77, 72,
+  96, 61, 79, 96, 90, 88, 86, 97, 76, 73,
+  84, 75, 80, 94, 89, 83, 95, 68, 103, 73,
+  94, 77, 97, 79, 73, 86, 83, 109, 103, 77,
+  76, 89, 90, 74, 58, 90, 93, 102, 78, 57,
+  91, 86, 115, 87, 101, 90, 96, 77, 59, 79,
+  82, 87, 95, 85, 85, 78, 72, 88, 80, 69,
+  80, 93, 74, 81, 55, 102, 120, 78, 77, 75,
+  76, 92, 94, 104, 90, 95, 102, 70, 88, 80,
+  95, 74, 83, 89, 98, 83, 67, 74, 93, 87,
+  95, 95, 83, 70, 71, 77, 84, 87, 71, 86,
+  84, 91, 83, 78, 99, 72, 93, 71, 64, 97,
+  87, 82, 88, 79, 96, 88, 82, 81, 95, 83,
+  81, 85, 79, 86, 88, 97, 74, 91, 86, 74,
+  87, 90, 76, 80, 93, 98, 80, 83, 84, 76,
+  89, 90, 88, 81, 81, 74, 86, 77, 93, 78,
+  87, 75, 75, 76, 88, 88, 104, 80, 78, 91,
+  85, 84, 65, 85, 93, 82, 80, 70, 92, 87,
+  98, 94, 93, 99, 75, 75, 71, 82, 78, 77,
+  88, 96, 81, 78, 86, 81, 72, 60, 72, 79,
+  85, 81, 66, 97, 90, 82, 81, 85, 80, 94,
+  97, 118, 83, 88, 100, 88, 94, 81, 95, 81,
+  93, 78, 100, 82, 79, 80, 82, 96, 88, 69,
+  87, 76, 87, 74, 68, 72, 72, 87, 88, 82,
+  85, 75, 90, 79, 72, 81, 71, 83, 87, 96,
+  59, 92, 82, 71, 80, 83, 89, 81, 79, 73,
+  92, 72, 79, 83, 85, 93, 76, 84, 75, 73,
+  89, 73, 80, 92, 83, 92, 81, 94, 84, 79,
+  83, 88, 80, 80, 83, 82, 83, 90, 81, 60,
+  81, 70, 82, 80, 80, 84, 79, 91, 86, 78,
+  97, 66, 77, 90, 108, 95, 86, 76, 84, 79,
+  87, 70, 89, 94, 84, 91, 88, 69, 78, 98,
+  79, 81, 89, 89, 100, 85, 84, 84, 77, 89,
+  88, 76, 81, 84, 91, 71, 88, 82, 74, 94,
+  83, 86, 83, 91, 75, 86, 71, 80, 70, 84,
+  88, 100, 85, 89, 79, 114, 81, 87, 81, 75,
+  94, 79, 74, 82, 69, 90, 92, 81, 79, 78,
+  76, 75, 74, 87, 74, 76, 105, 100, 63, 88,
+  87, 77, 106, 83, 80, 81, 69, 81, 103, 88,
+  87, 87, 76, 91, 72, 69, 67, 76, 75, 88,
+  86, 79, 76, 85, 86, 89, 97, 67, 82, 97,
+  73, 74, 99, 80, 78, 76, 80, 56, 67, 47,
+  69, 71, 72, 86, 114, 95, 77, 86, 97, 77,
+  77, 108, 120, 84, 82, 80, 78, 83, 72, 69,
+  104, 97, 84, 97, 77, 82, 89, 99, 106, 74,
+  85, 85, 114, 68, 83, 76, 70, 91, 90, 91,
+  84, 76, 85, 85, 80, 94, 68, 99, 81, 85,
+  70, 84, 78, 79, 72, 92, 78, 83, 93, 94,
+  84, 82, 95, 99, 82, 111, 83, 74, 82, 85,
+  87, 88, 86, 99, 82, 94, 67, 78, 85, 81,
+  123, 90, 95, 110, 112, 83, 68, 75, 97, 97,
+  124, 87, 83, 110, 72, 91, 75, 82, 81, 94,
+  78, 76, 74, 61, 74, 101, 70, 100, 86, 71,
+  73, 75, 89, 86, 96, 71, 107, 87, 96, 74,
+  91, 85, 80, 75, 83, 59, 59, 54, 66, 90,
+  83, 82, 122, 86, 79, 95, 80, 92, 80, 115,
+  119, 70, 78, 81, 71, 90, 75, 80, 95, 102,
+  70, 103, 67, 81, 86, 77, 126, 71, 88, 80,
+  114, 60, 92, 79, 82, 95, 89, 102, 90, 76,
+  84, 95, 80, 112, 66, 90, 86, 77, 77, 85,
+  82, 70, 85, 96, 77, 94, 94, 82, 79, 74,
+  86, 71, 89, 78, 80, 82, 83, 73, 79, 71,
+  85, 87, 88, 89, 88, 77, 89, 87, 74, 83,
+  83, 89, 74, 86, 75, 83, 84, 68, 79, 85,
+  96, 82, 90, 74, 90, 72, 82, 81, 87, 76,
+  76, 97, 82, 83, 96, 67, 79, 90, 87, 97,
+  87, 90, 82, 93, 89, 80, 89, 85, 76, 92,
+  88, 92, 79, 86, 87, 96, 86, 89, 92, 81,
+  79, 91, 86, 74, 83, 70, 84, 84, 71, 88,
+  89, 83, 96, 88, 95, 76, 83, 81, 82, 80,
+  91, 65, 77, 88, 78, 84, 87, 89, 87, 99,
+  85, 94, 84, 85, 76, 78, 81, 92, 94, 59,
+  98, 79, 82, 92, 88, 86, 85, 96, 76, 85,
+  71, 80, 60, 86, 81, 80, 85, 100, 81, 95,
+  76, 78, 82, 80, 91, 71, 83, 70, 76, 90,
+  87, 87, 90, 77, 83, 78, 67, 77, 78, 78,
+  73, 95, 72, 95, 77, 67, 86, 82, 88, 82,
+  88, 83, 96, 72, 83, 85, 72, 89, 69, 71,
+  77, 81, 84, 77, 82, 78, 86, 92, 91, 87,
+  90, 81, 73, 82, 79, 81, 86, 89, 85, 82,
+  76, 76, 67, 76, 86, 82, 85, 77, 82, 88,
+  79, 82, 96, 73, 79, 88, 95, 91, 90, 86,
+  87, 78, 82, 74, 93, 82, 88, 92, 81, 76,
+  84, 102, 86, 86, 86, 91, 100, 90, 82, 83,
+  79, 90, 85, 75, 80, 90, 86, 67, 85, 81,
+  81, 96, 86, 87, 70, 98, 76, 83, 75, 75,
+  68, 81, 80, 91, 87, 92, 85, 104, 77, 94,
+  79, 69, 89, 71, 79, 86, 74, 94, 87, 91,
+  76, 75, 75, 77, 87, 77, 77, 91, 100, 91,
+  70, 87, 94, 85, 91, 86, 86, 90, 72, 87,
+  88, 77, 85, 85, 73, 85, 71, 57, 72, 83,
+  68, 78, 90, 71, 81, 90, 80, 85, 96, 72,
+  77, 81, 79, 80, 84, 85, 86, 82, 77, 76,
+  75, 66, 82, 80, 76, 82, 112, 80, 73, 94,
+  92, 81, 78, 111, 132, 64, 90, 84, 73, 76,
+  78, 83, 82, 90, 83, 89, 73, 79, 89, 91,
+  109, 83, 86, 76, 104, 64, 82, 71, 91, 91,
+  89, 83, 79, 82, 90, 80, 83, 92, 75, 94,
+  90, 72, 79, 90, 80, 77, 81, 85, 76, 84,
+  85, 90, 84, 77, 85, 76, 90, 84, 82, 77,
+  79, 79, 83, 81, 87, 90, 83, 81, 75, 82,
+  74, 98, 79, 88, 78, 85, 89, 83, 77, 67,
+  95, 79, 82, 87, 92, 79, 92, 76, 89, 74,
+  83, 84, 89, 74, 91, 92, 90, 82, 90, 72,
+  87, 83, 82, 96, 92, 88, 82, 94, 94, 79,
+  93, 87, 78, 93, 88, 90, 82, 89, 95, 95,
+  85, 87, 85, 89, 74, 89, 86, 72, 86, 73,
+  81, 89, 83, 74, 85, 87, 98, 96, 91, 80,
+  78, 81, 83, 88, 102, 70, 80, 80, 77, 85,
+  83, 80, 84, 93, 97, 95, 85, 83, 81, 81,
+  83, 88, 101, 65, 92, 84, 81, 95, 87, 82,
+  91, 89, 77, 90, 77, 76, 67, 79, 86, 80,
+  90, 95, 88, 86, 81, 84, 85, 80, 88, 73,
+  88, 73, 85, 91, 92, 89, 93, 78, 82, 94,
+  73, 85, 74, 84, 77, 87, 77, 77, 79, 72,
+  77, 89, 92, 82, 91, 85, 91, 71, 82, 84,
+  82, 86, 82, 92, 93, 84, 86, 72, 85, 78,
+  80, 97, 97, 92, 87, 88, 85, 82, 85, 87,
+  81, 91, 90, 83, 77, 90, 77, 93, 85, 81,
+  90, 83, 78, 91, 81, 71, 87, 68, 81, 78,
+  83, 90, 88, 84, 96, 83, 89, 75, 88, 81,
+  84, 90, 88, 75, 80, 91, 78, 85, 86, 94,
+  87, 98, 87, 94, 82, 90, 78, 79, 78, 93,
+  95, 67, 84, 82, 79, 96, 85, 84, 77, 99,
+  80, 82, 78, 74, 65, 75, 78, 86, 89, 96,
+  79, 100, 79, 89, 80, 74, 90, 70, 88, 76,
+  82, 97, 86, 92, 87, 72, 78, 90, 82, 76,
+  70, 78, 107, 85, 73, 86, 78, 80, 80, 78,
+  86, 85, 77, 83, 89, 76, 84, 79, 75, 91,
+  78, 67, 83, 86, 71, 85, 88, 76, 82, 92,
+  89, 83, 87, 81, 81, 82, 80, 95, 79, 86,
+  93, 91, 73, 82, 90, 74, 92, 80, 85, 79,
+  104, 79, 76, 85, 90, 71, 77, 102, 111, 77,
+  91, 85, 84, 85, 79, 80, 82, 84, 88, 89,
+  78, 75, 86, 93, 91, 83, 88, 89, 93, 80,
+  82, 83, 87, 93, 76, 85, 75, 90, 89, 75,
+  82, 86, 76, 96, 83, 81, 78, 91, 74, 74,
+  81, 76, 72, 80, 79, 95, 86, 90, 71, 82,
+  76, 72, 90, 103, 69, 97, 70, 83, 70, 96,
+  76, 84, 89, 66, 95, 91, 89, 75, 93, 74,
+  67, 90, 71, 104, 72, 83, 98, 93, 82, 79,
+  75, 91, 88, 84, 86, 80, 90, 96, 73, 87,
+  65, 77, 96, 81, 69, 79, 75, 83, 83, 92,
+  92, 95, 86, 81, 81, 90, 82, 81, 86, 80,
+  69, 85, 105, 79, 90, 81, 69, 84, 77, 76,
+  91, 81, 83, 76, 75, 78, 92, 91, 83, 79,
+  80, 89, 85, 80, 81, 106, 99, 73, 75, 78,
+  60, 80, 93, 82, 91, 89, 76, 76, 85, 81,
+  76, 86, 92, 94, 101, 76, 88, 102, 98, 81,
+  78, 87, 73, 79, 88, 82, 76, 87, 84, 88,
+  96, 73, 76, 85, 74, 91, 74, 85, 75, 67,
+  89, 88, 73, 106, 69, 80, 65, 93, 76, 85,
+  84, 66, 92, 89, 84, 78, 76, 73, 79, 92,
+  72, 104, 77, 85, 95, 91, 83, 73, 78, 81,
+  91, 84, 85, 82, 93, 92, 71, 87, 90, 72,
+  108, 81, 63, 83, 79, 85, 86, 85, 85, 97,
+  79, 83, 79, 85, 78, 81, 84, 82, 72, 79,
+  97, 80, 87, 79, 66, 82, 78, 76, 93, 85,
+  82, 77, 73, 88, 96, 93, 81, 86, 77, 79,
+  83, 85, 81, 108, 103, 69, 75, 76, 60, 81,
+  92, 81, 96, 92, 69, 75, 84, 74, 77, 86,
+  89, 87, 103, 77, 92, 108, 113, 80, 84, 84,
+  66, 75, 74, 83, 76, 91, 83, 92, 77, 73,
+  70, 87, 75, 98, 76, 99, 80, 71, 89, 78,
+  77, 95, 76, 81, 68, 92, 75, 88, 91, 65,
+  91, 87, 86, 88, 63, 75, 90, 93, 82, 97,
+  73, 82, 91, 85, 79, 74, 80, 76, 86, 81,
+  85, 81, 89, 90, 72, 81, 98, 80, 90, 82,
+  71, 85, 74, 87, 81, 83, 83, 95, 90, 86,
+  81, 92, 82, 79, 82, 89, 73, 87, 111, 77,
+  92, 80, 71, 83, 91, 79, 99, 80, 90, 80,
+  76, 91, 96, 93, 83, 79, 75, 75, 86, 84,
+  82, 106, 94, 70, 80, 77, 62, 79, 96, 84,
+  88, 86, 73, 81, 81, 76, 78, 84, 90, 94,
+  98, 78, 89, 96, 97, 79, 74, 79, 68, 81,
+  78, 77, 79, 89, 88, 82, 87, 74, 78, 83,
+  78, 90, 69, 85, 72, 79, 91, 96, 71, 99,
+  64, 76, 74, 96, 81, 95, 89, 80, 103, 84,
+  84, 76, 86, 75, 66, 93, 72, 93, 77, 82,
+  98, 92, 86, 75, 70, 96, 86, 84, 90, 82,
+  92, 103, 77, 83, 54, 77, 95, 84, 76, 80,
+  77, 84, 80, 86, 100, 92, 79, 83, 79, 87,
+  75, 82, 91, 77, 70, 95, 92, 82, 104, 73,
+  79, 78, 77, 74, 82, 71, 85, 73, 78, 80,
+  89, 85, 85, 78, 76, 82, 90, 87, 87, 101,
+  99, 78, 69, 87, 67, 79, 90, 74, 92, 93,
+  83, 76, 84, 78, 79, 89, 99, 79, 89, 76,
+  81, 103, 91, 76, 81, 87, 76, 74, 86, 79,
+  77, 78, 87, 95, 84, 74, 66, 90, 73, 94,
+  73, 91, 77, 78, 93, 82, 72, 113, 61, 72,
+  69, 96, 86, 91, 82, 77, 101, 82, 81, 75,
+  63, 74, 74, 94, 77, 96, 82, 84, 101, 85,
+  93, 72, 67, 90, 93, 82, 89, 82, 98, 113,
+  72, 86, 68, 71, 97, 81, 76, 84, 83, 86,
+  84, 81, 92, 93, 72, 81, 77, 81, 72, 90,
+  90, 77, 66, 92, 84, 90, 104, 71, 76, 75,
+  74, 76, 81, 70, 89, 72, 76, 89, 92, 87,
+  79, 90, 74, 77, 97, 90, 89, 104, 107, 74,
+  64, 81, 68, 79, 87, 72, 100, 98, 75, 72,
+  84, 79, 79, 90, 98, 73, 86, 74, 87, 107,
+  103, 76, 87, 91, 72, 69, 73, 81, 76, 72,
+  87, 100, 63, 72, 56, 92, 72, 99, 72, 103,
+  85, 80, 91, 72, 72, 97, 69, 77, 71, 93,
+  77, 87, 89, 82, 96, 82, 81, 86, 60, 76,
+  88, 96, 85, 95, 79, 81, 89, 75, 87, 72,
+  73, 82, 90, 79, 90, 83, 95, 94, 79, 81,
+  91, 80, 87, 85, 82, 85, 76, 84, 79, 80,
+  88, 90, 83, 78, 81, 89, 79, 78, 88, 88,
+  72, 96, 95, 79, 97, 74, 76, 80, 86, 72,
+  87, 71, 88, 78, 77, 90, 94, 86, 84, 79,
+  76, 75, 91, 86, 87, 100, 95, 77, 72, 83,
+  69, 79, 92, 78, 89, 89, 73, 82, 81, 79,
+  82, 87, 92, 79, 85, 77, 82, 93, 94, 76,
+  80, 88, 75, 75, 79, 75, 78, 80, 92, 86,
+  78, 76, 71, 86, 77, 90, 70, 87, 74, 83,
+  85, 98, 72, 99, 73, 78, 76, 90, 80, 98,
+  96, 88, 113, 92, 84, 76, 81, 78, 68, 95,
+  77, 89, 81, 84, 92, 85, 81, 75, 65, 91,
+  80, 85, 89, 90, 93, 102, 85, 83, 68, 85,
+  83, 83, 83, 83, 73, 87, 82, 88, 97, 96,
+  89, 91, 81, 84, 82, 82, 83, 81, 77, 90,
+  94, 74, 102, 71, 91, 85, 88, 81, 83, 69,
+  87, 73, 79, 80, 81, 80, 91, 77, 79, 83,
+  92, 88, 89, 91, 94, 87, 75, 99, 64, 80,
+  80, 74, 88, 80, 88, 84, 85, 78, 79, 90,
+  92, 75, 90, 80, 83, 96, 87, 77, 81, 90,
+  73, 70, 86, 73, 77, 74, 81, 86, 101, 71,
+  70, 78, 73, 90, 70, 89, 85, 84, 88, 83,
+  70, 104, 69, 78, 72, 87, 82, 96, 92, 86,
+  109, 87, 80, 73, 71, 77, 78, 101, 81, 86,
+  86, 89, 85, 78, 86, 72, 65, 85, 87, 78,
+  90, 93, 101, 106, 84, 89, 65, 80, 80, 79,
+  87, 83, 79, 86, 82, 83, 92, 90, 82, 84,
+  77, 77, 78, 84, 85, 82, 72, 92, 84, 76,
+  106, 68, 92, 86, 79, 80, 84, 68, 93, 72,
+  78, 87, 80, 87, 82, 83, 79, 78, 96, 90,
+  91, 92, 98, 85, 72, 92, 64, 84, 75, 73,
+  91, 84, 76, 87, 84, 78, 81, 90, 94, 68,
+  85, 76, 83, 98, 89, 78, 89, 89, 73, 67,
+  79, 76, 78, 67, 85, 83, 85, 71, 63, 77,
+  72, 91, 71, 95, 97, 84, 82, 70, 75, 98,
+  74, 81, 77, 90, 75, 90, 97, 89, 105, 89,
+  83, 83, 78, 80, 95, 97, 84, 93, 85, 86,
+  81, 70, 86, 70, 68, 78, 85, 72, 85, 91,
+  98, 96, 91, 86, 75, 85, 79, 82, 89, 85,
+  74, 87, 79, 85, 91, 87, 92, 77, 81, 84,
+  85, 81, 84, 89, 78, 96, 96, 75, 102, 71,
+  85, 94, 83, 77, 88, 75, 88, 75, 80, 93,
+  85, 83, 91, 77, 79, 81, 93, 87, 91, 91,
+  93, 82, 75, 88, 66, 81, 82, 79, 84, 81,
+  71, 88, 83, 74, 81, 88, 87, 72, 88, 79,
+  83, 88, 92, 78, 84, 88, 80, 75, 87, 71,
+  79, 81, 93, 79, 92, 72, 74, 78, 74, 87,
+  78, 78, 94, 93, 75, 82, 107, 67, 73, 93,
+  85, 67, 79, 96, 81, 87, 81, 83, 81, 87,
+  72, 94, 80, 78, 92, 75, 90, 95, 95, 94,
+  93, 77, 91, 88, 82, 93, 90, 88, 84, 87,
+  89, 80, 81, 85, 93, 88, 86, 88, 68, 73,
+  76, 93, 104, 71, 98, 84, 90, 83, 87, 93,
+  77, 78, 84, 78, 95, 84, 80, 80, 79, 92,
+  72, 84, 74, 78, 87, 80, 70, 99, 92, 88,
+  98, 68, 94, 73, 85, 93, 88, 80, 88, 102,
+  61, 86, 69, 86, 78, 92, 86, 82, 80, 100,
+  74, 88, 86, 70, 78, 79, 107, 74, 87, 64,
+  77, 94, 84, 94, 81, 85, 88, 87, 98, 68,
+  128, 77, 91, 87, 56, 76, 82, 81, 74, 89,
+  82, 101, 51, 85, 118, 60, 65, 94, 81, 60,
+  82, 77, 79, 97, 85, 99, 78, 89, 82, 70,
+  79, 76, 93, 77, 102, 95, 107, 97, 92, 74,
+  96, 84, 88, 79, 85, 96, 78, 81, 83, 82,
+  82, 83, 86, 97, 87, 90, 57, 64, 75, 73,
+  129, 70, 85, 83, 87, 78, 83, 92, 85, 74,
+  82, 82, 93, 82, 84, 74, 78, 84, 82, 72,
+  62, 70, 81, 70, 70, 88, 92, 81, 106, 61,
+  100, 84, 86, 82, 95, 65, 97, 102, 67, 80,
+  68, 81, 67, 91, 87, 72, 87, 81, 60, 80,
+  96, 70, 63, 82, 116, 70, 92, 69, 79, 101,
+  82, 89, 83, 85, 86, 85, 94, 65, 94, 68,
+  92, 83, 44, 83, 81, 75, 78, 90, 72, 95,
+  80, 89, 97, 73, 73, 89, 83, 72, 85, 75,
+  80, 86, 89, 77, 80, 78, 80, 95, 93, 77,
+  83, 79, 89, 94, 85, 88, 92, 82, 84, 95,
+  94, 82, 97, 90, 85, 90, 83, 81, 75, 89,
+  92, 94, 74, 90, 70, 79, 78, 89, 90, 72,
+  94, 89, 81, 84, 93, 93, 82, 80, 92, 69,
+  93, 82, 91, 88, 82, 82, 87, 84, 68, 78,
+  78, 83, 74, 78, 102, 92, 98, 77, 97, 113,
+  77, 87, 95, 81, 97, 107, 64, 88, 66, 88,
+  94, 88, 82, 90, 78, 101, 77, 81, 84, 69,
+  84, 80, 97, 75, 92, 71, 83, 89, 86, 90,
+  82, 88, 88, 86, 98, 81, 73, 87, 88, 78,
+  68, 89, 84, 88, 88, 75, 86, 87, 76, 86,
+  107, 74, 78, 89, 86, 74, 85, 77, 80, 96,
+  99, 97, 73, 85, 75, 89, 82, 76, 78, 69,
+  93, 94, 101, 88, 94, 82, 89, 82, 78, 92,
+  78, 84, 85, 89, 80, 75, 83, 86, 77, 89,
+  90, 87, 67, 77, 76, 79, 104, 76, 91, 90,
+  87, 77, 88, 101, 69, 73, 80, 77, 88, 71,
+  88, 86, 79, 70, 85, 74, 94, 83, 89, 67,
+  74, 92, 87, 89, 99, 66, 88, 68, 86, 86,
+  84, 86, 87, 81, 64, 84, 74, 85, 67, 82,
+  82, 77, 96, 83, 61, 78, 78, 70, 81, 74,
+  104, 82, 79, 82, 74, 98, 82, 92, 76, 79,
+  94, 87, 91, 64, 119, 85, 102, 81, 53, 83,
+  79, 82, 81, 87, 81, 93, 52, 81, 120, 67,
+  65, 95, 80, 67, 82, 69, 81, 109, 105, 117,
+  68, 89, 79, 67, 77, 78, 88, 67, 105, 96,
+  111, 86, 93, 76, 89, 77, 77, 75, 67, 79,
+  70, 76, 86, 75, 87, 84, 70, 97, 92, 82,
+  57, 68, 71, 62, 121, 76, 74, 79, 83, 70,
+  79, 98, 79, 69, 75, 82, 80, 67, 94, 84,
+  85, 62, 75, 64, 84, 81, 86, 58, 73, 87,
+  90, 78, 104, 55, 95, 75, 90, 76, 92, 72,
+  90, 74, 73, 84, 74, 88, 54, 82, 80, 71,
+  88, 70, 47, 75, 87, 71, 80, 71, 111, 80,
+  78, 80, 73, 105, 81, 88, 77, 76, 80, 82,
+  88, 62, 72, 80, 87, 80, 37, 89, 82, 77,
+  83, 98, 75, 88, 83, 90, 93, 73, 77, 84,
+  83, 80, 89, 84, 77, 95, 98, 85, 74, 73,
+  81, 96, 89, 78, 89, 74, 92, 98, 95, 79,
+  92, 84, 84, 86, 85, 85, 79, 83, 81, 87,
+  81, 77, 86, 87, 77, 92, 80, 86, 73, 77,
+  75, 86, 87, 77, 84, 76, 85, 82, 91, 97,
+  74, 73, 80, 71, 87, 76, 99, 89, 86, 66,
+  80, 78, 84, 82, 81, 74, 76, 85, 94, 89,
+  98, 76, 93, 111, 79, 80, 90, 91, 93, 93,
+  67, 81, 75, 88, 83, 79, 80, 86, 76, 88,
+  68, 78, 76, 69, 87, 73, 96, 82, 82, 83,
+  78, 92, 82, 87, 80, 82, 91, 84, 91, 73,
+  63, 92, 91, 76, 65, 87, 83, 85, 101, 76,
+  74, 84, 92, 85, 89, 83, 82, 82, 91, 84,
+  83, 88, 79, 90, 99, 80, 72, 87, 84, 88,
+  83, 81, 75, 71, 89, 86, 82, 88, 90, 86,
+  68, 80, 81, 92, 80, 79, 91, 89, 80, 73,
+  76, 94, 77, 83, 78, 95, 74, 93, 77, 85,
+  76, 86, 98, 87, 78, 90, 95, 89, 58, 85,
+  88, 86, 90, 77, 88, 91, 82, 82, 88, 89,
+  109, 89, 92, 76, 83, 82, 80, 91, 91, 99,
+  83, 75, 86, 85, 78, 105, 94, 73, 63, 92,
+  84, 87, 74, 88, 81, 89, 83, 95, 58, 95,
+  73, 67, 90, 85, 84, 83, 76, 78, 82, 82,
+  88, 92, 82, 86, 90, 94, 90, 73, 104, 100,
+  94, 83, 74, 87, 75, 84, 99, 87, 73, 88,
+  81, 79, 97, 82, 81, 85, 92, 81, 82, 86,
+  87, 97, 104, 86, 73, 85, 76, 84, 83, 83,
+  89, 70, 90, 86, 96, 85, 82, 83, 65, 77,
+  79, 83, 77, 79, 83, 90, 87, 69, 81, 96,
+  71, 89, 80, 79, 66, 90, 74, 85, 83, 83,
+  97, 81, 75, 94, 91, 83, 63, 88, 88, 90,
+  85, 79, 92, 92, 81, 87, 81, 87, 100, 91,
+  92, 73, 82, 86, 83, 84, 94, 88, 83, 91,
+  87, 78, 80, 101, 100, 71, 68, 90, 80, 84,
+  66, 87, 78, 87, 78, 89, 54, 95, 78, 66,
+  93, 80, 85, 84, 78, 76, 86, 84, 88, 79,
+  82, 82, 90, 89, 89, 75, 79, 97, 86, 89,
+  73, 90, 79, 84, 94, 97, 70, 87, 92, 87,
+  86, 81, 83, 80, 88, 84, 83, 88, 76, 88,
+  95, 75, 71, 79, 72, 87, 87, 83, 97, 73,
+  88, 91, 76, 84, 84, 87, 73, 84, 85, 88,
+  83, 85, 88, 83, 80, 73, 88, 92, 75, 86,
+  73, 78, 81, 88, 82, 87, 71, 83, 96, 72,
+  80, 96, 94, 83, 62, 86, 87, 85, 86, 82,
+  100, 90, 84, 84, 82, 89, 99, 88, 87, 81,
+  80, 95, 87, 92, 91, 101, 84, 107, 82, 81,
+  84, 106, 94, 79, 66, 83, 82, 87, 81, 83,
+  77, 91, 76, 96, 64, 90, 72, 67, 88, 86,
+  84, 85, 83, 72, 85, 80, 87, 81, 88, 88,
+  100, 88, 87, 79, 67, 97, 84, 82, 83, 88,
+  77, 82, 89, 76, 65, 88, 71, 85, 75, 85,
+  75, 92, 84, 77, 96, 91, 68, 75, 73, 87,
+  81, 78, 90, 81, 88, 97, 74, 82, 88, 80,
+  100, 104, 88, 83, 85, 102, 76, 79, 93, 83,
+  81, 93, 84, 70, 84, 75, 81, 85, 95, 93,
+  91, 78, 75, 73, 74, 87, 76, 98, 91, 82,
+  80, 100, 96, 89, 80, 76, 80, 79, 76, 96,
+  84, 95, 92, 80, 95, 90, 85, 81, 81, 70,
+  85, 81, 66, 73, 84, 121, 78, 82, 84, 88,
+  82, 88, 80, 73, 97, 86, 77, 82, 81, 74,
+  89, 85, 90, 84, 92, 80, 86, 85, 95, 96,
+  96, 81, 71, 78, 83, 79, 70, 71, 89, 80,
+  95, 96, 68, 93, 84, 90, 98, 87, 83, 73,
+  92, 80, 82, 89, 32, 78, 65, 79, 68, 84,
+  89, 98, 142, 74, 67, 65, 101, 87, 75, 78,
+  76, 66, 92, 77, 82, 86, 75, 73, 118, 76,
+  89, 84, 68, 78, 67, 80, 81, 79, 68, 105,
+  73, 65, 85, 118, 86, 57, 84, 76, 77, 70,
+  83, 70, 61, 90, 58, 87, 82, 83, 68, 98,
+  70, 64, 72, 88, 84, 79, 71, 103, 81, 93,
+  105, 77, 59, 80, 106, 62, 69, 93, 82, 78,
+  60, 95, 71, 90, 121, 73, 79, 101, 84, 77,
+  67, 72, 82, 70, 63, 95, 87, 68, 82, 73,
+  79, 93, 97, 82, 87, 82, 101, 121, 96, 64,
+  121, 64, 79, 79, 97, 64, 87, 64, 90, 76,
+  83, 92, 72, 71, 133, 76, 77, 62, 92, 81,
+  88, 87, 84, 82, 75, 80, 77, 91, 82, 79,
+  72, 72, 72, 77, 83, 79, 83, 84, 81, 85,
+  75, 97, 96, 83, 88, 79, 90, 72, 97, 88,
+  84, 67, 89, 97, 91, 88, 86, 91, 83, 80,
+  85, 77, 86, 94, 97, 72, 94, 81, 80, 89,
+  82, 79, 87, 71, 89, 79, 84, 100, 98, 88,
+  77, 64, 76, 73, 77, 95, 85, 88, 74, 81,
+  104, 88, 99, 87, 80, 100, 90, 81, 70, 63,
+  82, 57, 78, 88, 81, 84, 81, 76, 85, 86,
+  103, 89, 93, 81, 79, 78, 87, 96, 88, 88,
+  93, 82, 84, 94, 88, 95, 92, 82, 94, 81,
+  77, 75, 100, 86, 89, 90, 95, 90, 117, 91,
+  85, 91, 86, 87, 90, 79, 93, 66, 65, 87,
+  68, 87, 78, 83, 82, 90, 87, 78, 72, 93,
+  76, 80, 81, 89, 84, 64, 98, 86, 95, 93,
+  72, 75, 88, 80, 95, 100, 85, 82, 90, 97,
+  78, 73, 89, 82, 79, 92, 86, 69, 87, 81,
+  80, 91, 94, 107, 85, 78, 82, 85, 77, 83,
+  77, 76, 97, 71, 87, 87, 95, 90, 83, 64,
+  83, 72, 76, 80, 89, 90, 80, 68, 92, 93,
+  78, 81, 87, 70, 74, 84, 75, 70, 88, 128,
+  71, 76, 87, 84, 79, 86, 75, 81, 90, 80,
+  79, 81, 83, 76, 84, 85, 86, 89, 85, 83,
+  85, 86, 94, 98, 74, 81, 87, 81, 84, 88,
+  82, 77, 78, 83, 90, 96, 72, 91, 86, 88,
+  84, 83, 82, 74, 92, 81, 82, 92, 28, 77,
+  66, 73, 76, 86, 94, 98, 146, 76, 81, 80,
+  114, 80, 79, 70, 75, 67, 86, 77, 87, 80,
+  72, 73, 111, 70, 102, 86, 70, 86, 64, 71,
+  76, 85, 71, 105, 80, 77, 87, 134, 87, 59,
+  86, 81, 69, 66, 88, 65, 72, 94, 51, 96,
+  88, 83, 70, 84, 74, 63, 64, 93, 60, 84,
+  74, 81, 91, 79, 91, 65, 56, 77, 100, 59,
+  80, 102, 64, 91, 70, 94, 77, 70, 124, 82,
+  74, 98, 78, 77, 58, 68, 79, 66, 57, 91,
+  91, 84, 78, 76, 68, 81, 92, 84, 79, 82,
+  99, 125, 76, 66, 121, 59, 78, 77, 87, 68,
+  79, 66, 94, 73, 87, 91, 69, 74, 134, 71,
+  77, 62, 84, 82, 79, 88, 86, 88, 77, 84,
+  86, 94, 85, 81, 64, 79, 73, 80, 87, 82,
+  81, 78, 86, 88, 77, 94, 95, 78, 98, 84,
+  86, 79, 73, 91, 91, 44, 88, 101, 88, 85,
+  89, 92, 92, 76, 95, 74, 94, 103, 95, 70,
+  87, 83, 85, 90, 80, 77, 98, 80, 95, 69,
+  93, 85, 92, 94, 77, 56, 76, 68, 71, 86,
+  80, 94, 78, 71, 109, 93, 95, 92, 92, 114,
+  78, 83, 77, 53, 84, 62, 62, 86, 82, 70,
+  74, 77, 78, 87, 101, 85, 91, 77, 80, 77,
+  81, 92, 91, 78, 81, 86, 83, 96, 87, 91,
+  72, 88, 82, 88, 81, 84, 69, 90, 94, 89,
+  90, 98, 120, 90, 81, 91, 74, 87, 84, 82,
+  99, 70, 84, 82, 77, 87, 78, 79, 73, 90,
+  93, 82, 78, 92, 71, 94, 90, 89, 90, 78,
+  92, 77, 82, 95, 81, 77, 86, 79, 83, 82,
+  97, 88, 90, 103, 78, 86, 86, 87, 79, 91,
+  96, 72, 85, 77, 78, 87, 92, 91, 86, 82,
+  85, 84, 78, 83, 83, 68, 96, 83, 86, 95,
+  93, 89, 91, 74, 78, 77, 77, 88, 89, 91,
+  70, 70, 85, 85, 83, 83, 81, 68, 78, 83,
+  74, 70, 88, 121, 87, 83, 83, 85, 91, 83,
+  83, 88, 84, 87, 85, 82, 82, 76, 82, 87,
+  82, 91, 92, 84, 88, 89, 105, 95, 80, 84,
+  104, 82, 86, 90, 95, 79, 61, 89, 88, 90,
+  75, 84, 84, 87, 86, 91, 85, 76, 85, 72,
+  84, 89, 46, 81, 70, 67, 67, 95, 99, 102,
+  119, 82, 81, 89, 101, 79, 73, 75, 73, 70,
+  92, 93, 83, 71, 80, 75, 98, 71, 76, 82,
+  76, 101, 66, 79, 86, 91, 69, 101, 105, 66,
+  85, 100, 75, 74, 82, 81, 72, 77, 84, 79,
+  66, 86, 69, 86, 87, 82, 86, 91, 93, 77,
+  74, 93, 78, 89, 75, 90, 93, 92, 98, 67,
+  59, 71, 92, 68, 83, 97, 68, 83, 66, 83,
+  75, 86, 91, 94, 79, 95, 87, 82, 57, 82,
+  84, 81, 80, 82, 89, 81, 86, 81, 78, 83,
+  88, 84, 81, 90, 93, 105, 74, 81, 104, 62,
+  78, 78, 73, 76, 86, 80, 89, 82, 95, 83,
+  71, 76, 109, 82, 77, 72, 92, 80, 72, 86,
+  94, 77, 82, 82, 74, 91, 94, 81, 77, 91,
+  69, 91, 93, 86, 86, 85, 86, 74, 77, 93,
+  89, 82, 92, 83, 75, 77, 82, 90, 90, 62,
+  78, 99, 93, 81, 86, 85, 103, 73, 88, 78,
+  86, 94, 88, 73, 90, 81, 82, 80, 79, 82,
+  92, 107, 93, 89, 86, 98, 87, 88, 92, 69,
+  73, 73, 73, 100, 85, 88, 83, 73, 97, 87,
+  97, 90, 84, 100, 79, 83, 80, 55, 82, 60,
+  90, 89, 91, 73, 80, 74, 83, 93, 90, 88,
+  99, 76, 79, 72, 87, 84, 84, 83, 90, 84,
+  83, 90, 96, 89, 83, 83, 83, 92, 86, 77,
+  74, 83, 96, 89, 89, 88, 106, 87, 85, 91,
+  82, 86, 86, 81, 72, 84, 89, 91, 79, 82,
+  86, 74, 88, 90, 84, 82, 79, 89, 71, 77,
+  71, 73, 91, 85, 104, 92, 80, 85, 83, 99,
+  67, 84, 89, 87, 87, 76, 78, 100, 78, 85,
+  91, 91, 84, 76, 95, 80, 85, 76, 76, 76,
+  77, 76, 90, 86, 75, 95, 69, 78, 77, 90,
+  82, 83, 80, 82, 93, 83, 82, 84, 90, 74,
+  79, 80, 93, 105, 80, 84, 76, 81, 81, 82,
+  78, 93, 88, 83, 75, 88, 81, 69, 85, 95,
+  86, 87, 87, 94, 69, 81, 88, 80, 87, 89,
+  85, 81, 78, 84, 82, 76, 81, 59, 87, 79,
+  92, 79, 90, 86, 75, 66, 88, 89, 86, 79,
+  77, 68, 81, 106, 90, 75, 86, 86, 93, 78,
+  84, 80, 69, 89, 76, 88, 67, 78, 80, 74,
+  95, 92, 85, 96, 93, 85, 78, 78, 70, 84,
+  89, 85, 90, 88, 75, 80, 93, 98, 72, 95,
+  95, 93, 88, 81, 89, 101, 79, 79, 98, 92,
+  80, 73, 93, 76, 94, 76, 71, 74, 82, 80,
+  81, 85, 71, 97, 72, 78, 82, 90, 83, 75,
+  84, 85, 100, 78, 89, 87, 87, 73, 84, 80,
+  82, 110, 89, 77, 69, 84, 86, 75, 84, 81,
+  91, 80, 84, 77, 74, 67, 84, 91, 83, 89,
+  86, 92, 56, 81, 75, 77, 87, 79, 94, 76,
+  70, 83, 85, 92, 88, 55, 95, 84, 95, 83,
+  96, 89, 80, 70, 89, 84, 87, 86, 70, 61,
+  85, 105, 90, 80, 91, 86, 99, 74, 84, 85,
+  72, 85, 81, 86, 86, 85, 81, 77, 86, 88,
+  83, 78, 77, 90, 76, 78, 74, 78, 87, 86,
+  85, 92, 81, 82, 93, 104, 69, 87, 81, 87,
+  91, 81, 80, 110, 70, 84, 95, 88, 79, 80,
+  92, 83, 94, 81, 80, 75, 77, 88, 94, 83,
+  80, 86, 67, 79, 78, 81, 79, 81, 84, 83,
+  92, 87, 87, 83, 85, 73, 81, 84, 89, 91,
+  89, 82, 77, 82, 85, 87, 71, 81, 96, 84,
+  73, 83, 81, 69, 85, 91, 92, 86, 88, 92,
+  72, 78, 87, 78, 101, 86, 81, 83, 71, 88,
+  83, 86, 78, 59, 86, 79, 85, 81, 87, 90,
+  81, 68, 87, 90, 89, 79, 82, 69, 81, 102,
+  81, 79, 81, 80, 95, 74, 85, 81, 68, 75,
+  86, 83, 67, 82, 93, 86, 101, 79, 94, 94,
+  86, 78, 80, 89, 74, 93, 84, 81, 126, 105,
+  76, 70, 84, 99, 63, 78, 107, 82, 93, 77,
+  98, 77, 89, 96, 83, 81, 75, 73, 85, 88,
+  77, 71, 71, 92, 82, 84, 80, 106, 64, 90,
+  73, 83, 87, 82, 76, 67, 80, 92, 79, 88,
+  83, 67, 95, 69, 82, 80, 86, 91, 87, 87,
+  84, 76, 81, 75, 95, 100, 68, 79, 99, 61,
+  76, 69, 78, 85, 83, 75, 82, 82, 63, 83,
+  77, 79, 58, 78, 89, 73, 98, 70, 80, 84,
+  86, 56, 95, 83, 97, 82, 86, 97, 73, 78,
+  81, 83, 95, 84, 84, 67, 93, 91, 91, 84,
+  98, 92, 94, 88, 77, 97, 58, 100, 79, 78,
+  47, 75, 98, 91, 99, 82, 101, 122, 96, 69,
+  86, 97, 83, 113, 82, 82, 97, 91, 70, 68,
+  99, 95, 75, 84, 112, 100, 104, 77, 121, 71,
+  94, 74, 84, 94, 72, 71, 80, 90, 103, 63,
+  66, 98, 94, 83, 72, 110, 56, 71, 86, 89,
+  92, 81, 78, 53, 85, 101, 87, 83, 83, 77,
+  76, 67, 96, 85, 74, 84, 72, 78, 74, 70,
+  95, 62, 114, 86, 69, 77, 114, 43, 70, 76,
+  77, 83, 80, 68, 78, 94, 52, 76, 66, 78,
+  51, 63, 97, 67, 89, 60, 76, 91, 98, 57,
+  102, 76, 102, 84, 98, 105, 73, 92, 88, 83,
+  88, 94, 75, 64, 115, 86, 82, 97, 96, 100,
+  90, 88, 81, 107, 69, 92, 95, 81, 78, 80,
+  87, 84, 101, 78, 92, 94, 81, 78, 81, 90,
+  76, 94, 81, 79, 77, 102, 86, 69, 94, 103,
+  69, 80, 98, 87, 87, 85, 96, 88, 76, 79,
+  84, 80, 74, 77, 81, 89, 114, 76, 74, 90,
+  84, 93, 86, 94, 69, 79, 70, 87, 84, 85,
+  74, 71, 86, 85, 81, 95, 88, 71, 92, 72,
+  90, 79, 77, 77, 95, 87, 79, 75, 85, 81,
+  80, 81, 76, 83, 97, 64, 79, 83, 83, 81,
+  83, 83, 88, 88, 69, 79, 78, 79, 78, 76,
+  86, 80, 73, 76, 86, 87, 86, 56, 91, 83,
+  89, 84, 89, 97, 75, 81, 83, 88, 90, 82,
+  94, 71, 95, 91, 58, 87, 87, 88, 96, 82,
+  78, 92, 77, 73, 81, 96, 75, 89, 92, 82,
+  87, 78, 90, 88, 90, 73, 67, 100, 89, 96,
+  86, 80, 103, 92, 67, 69, 90, 89, 76, 76,
+  84, 76, 91, 80, 92, 85, 89, 93, 85, 81,
+  80, 80, 80, 91, 77, 73, 78, 83, 92, 92,
+  89, 98, 61, 84, 72, 88, 84, 86, 76, 74,
+  85, 92, 84, 86, 87, 74, 103, 74, 88, 85,
+  90, 85, 101, 81, 97, 69, 72, 69, 85, 96,
+  80, 85, 96, 64, 85, 73, 78, 79, 85, 69,
+  89, 83, 66, 100, 90, 81, 71, 83, 81, 73,
+  109, 78, 87, 88, 81, 57, 89, 90, 93, 79,
+  81, 104, 71, 73, 85, 79, 95, 83, 76, 75,
+  88, 77, 87, 87, 93, 93, 96, 92, 79, 91,
+  71, 92, 93, 91, 64, 76, 93, 89, 85, 78,
+  94, 109, 95, 75, 70, 108, 101, 113, 90, 80,
+  77, 89, 74, 61, 95, 89, 80, 77, 88, 87,
+  89, 75, 99, 72, 93, 77, 87, 89, 74, 81,
+  83, 83, 86, 71, 76, 84, 113, 81, 80, 94,
+  53, 83, 76, 94, 87, 86, 76, 64, 82, 97,
+  86, 84, 83, 79, 96, 71, 102, 92, 85, 89,
+  81, 67, 87, 65, 88, 51, 93, 81, 83, 82,
+  107, 54, 83, 80, 82, 76, 82, 71, 87, 79,
+  57, 96, 77, 87, 57, 74, 84, 65, 93, 73,
+  88, 86, 93, 60, 90, 82, 90, 82, 83, 102,
+  71, 82, 91, 81, 95, 83, 81, 68, 112, 75,
+  75, 89, 83, 99, 92, 88, 88, 96, 79, 95,
+  103, 92, 82, 72, 91, 81, 85, 78, 88, 87,
+  86, 89, 72, 100, 88, 94, 85, 81, 79, 90,
+  93, 70, 91, 92, 78, 77, 74, 87, 89, 82,
+  97, 81, 78, 83, 83, 81, 73, 79, 81, 92,
+  99, 77, 80, 80, 94, 86, 94, 93, 64, 88,
+  71, 92, 75, 80, 73, 80, 86, 83, 85, 88,
+  87, 77, 100, 79, 98, 83, 83, 83, 77, 79,
+  88, 69, 82, 71, 78, 86, 80, 85, 95, 66,
+  85, 84, 81, 72, 80, 84, 89, 85, 69, 85,
+  91, 82, 82, 79, 79, 80, 76, 78, 90, 76,
+  80, 57, 87, 91, 89, 82, 86, 96, 73, 72,
+  87, 89, 92, 85, 101, 76, 87, 83, 67, 86,
+  86, 90, 94, 89, 80, 90, 77, 84, 73, 95,
+  89, 92, 79, 91, 70, 83, 84, 72, 91, 83,
+  82, 110, 108, 107, 96, 93, 86, 89, 88, 80,
+  83, 83, 79, 94, 88, 85, 78, 88, 96, 86,
+  82, 82, 74, 88, 86, 95, 79, 76, 86, 89,
+  61, 88, 93, 86, 83, 87, 84, 82, 80, 81,
+  88, 87, 73, 92, 75, 79, 83, 65, 74, 72,
+  100, 66, 84, 87, 94, 80, 80, 74, 100, 92,
+  73, 84, 73, 79, 83, 68, 96, 85, 75, 85,
+  86, 77, 104, 73, 78, 75, 87, 82, 82, 88,
+  98, 80, 85, 92, 97, 77, 87, 97, 86, 81,
+  85, 87, 86, 93, 82, 90, 71, 87, 101, 93,
+  85, 82, 87, 80, 81, 83, 78, 90, 91, 84,
+  90, 92, 81, 88, 76, 84, 87, 94, 94, 74,
+  80, 91, 84, 79, 88, 66, 98, 78, 79, 109,
+  102, 99, 98, 98, 90, 85, 77, 81, 87, 85,
+  82, 97, 95, 84, 76, 106, 106, 86, 81, 77,
+  65, 95, 86, 90, 76, 72, 84, 86, 57, 96,
+  102, 74, 76, 85, 82, 81, 86, 83, 90, 79,
+  73, 77, 72, 82, 87, 74, 71, 67, 90, 70,
+  90, 81, 97, 76, 81, 63, 109, 85, 78, 87,
+  71, 86, 81, 64, 96, 80, 78, 89, 84, 77,
+  92, 70, 76, 76, 90, 72, 67, 90, 96, 84,
+  87, 85, 93, 82, 89, 90, 82, 82, 79, 93,
+  88, 92, 86, 82, 64, 76, 94, 94, 79, 75,
+  88, 77, 78, 80, 94, 84, 88, 82, 84, 82,
+  85, 94, 81, 82, 94, 89, 86, 85, 76, 94,
+  77, 83, 88, 74, 91, 85, 80, 102, 97, 104,
+  90, 97, 84, 89, 93, 77, 87, 82, 83, 92,
+  79, 77, 78, 96, 95, 83, 85, 76, 71, 89,
+  85, 93, 87, 83, 85, 89, 68, 94, 96, 73,
+  85, 87, 81, 72, 82, 81, 92, 83, 71, 91,
+  80, 79, 82, 77, 80, 79, 103, 70, 92, 87,
+  89, 88, 87, 84, 98, 93, 79, 80, 73, 88,
+  84, 70, 94, 85, 81, 87, 82, 88, 88, 78,
+  80, 68, 84, 75, 85, 84, 90, 81, 83, 96,
+  78, 76, 81, 93, 82, 82, 87, 89, 86, 87,
+  81, 91, 76, 87, 95, 102, 86, 86, 82, 82,
+  83, 78, 88, 90, 87, 80, 93, 89, 82, 87,
+  67, 73, 84, 71, 85, 78, 77, 80, 88, 80,
+  82, 81, 72, 83, 78, 93, 80, 78, 84, 79,
+  82, 91, 78, 100, 79, 70, 85, 80, 88, 81,
+  81, 95, 93, 77, 83, 92, 91, 67, 100, 62,
+  76, 103, 81, 72, 73, 75, 78, 84, 99, 68,
+  110, 83, 83, 76, 86, 106, 77, 85, 85, 81,
+  89, 90, 81, 86, 66, 76, 99, 86, 94, 66,
+  80, 108, 80, 79, 68, 77, 84, 81, 55, 86,
+  81, 83, 77, 77, 86, 58, 89, 84, 70, 78,
+  90, 66, 87, 78, 79, 91, 78, 77, 98, 115,
+  74, 99, 96, 89, 92, 76, 67, 87, 81, 79,
+  72, 85, 88, 87, 108, 83, 75, 82, 84, 97,
+  88, 91, 83, 73, 81, 75, 96, 86, 58, 74,
+  74, 59, 78, 72, 79, 74, 84, 78, 87, 80,
+  66, 106, 75, 77, 70, 66, 79, 77, 85, 94,
+  78, 102, 81, 66, 77, 77, 95, 84, 89, 100,
+  84, 73, 85, 91, 96, 54, 101, 60, 74, 148,
+  83, 66, 73, 65, 74, 88, 99, 61, 121, 82,
+  82, 81, 84, 104, 75, 74, 102, 81, 83, 96,
+  85, 74, 47, 101, 100, 88, 84, 41, 82, 113,
+  72, 62, 68, 82, 92, 83, 46, 108, 76, 77,
+  72, 71, 96, 53, 82, 83, 71, 72, 82, 48,
+  92, 79, 67, 99, 75, 73, 105, 133, 66, 95,
+  104, 90, 83, 87, 66, 90, 68, 74, 83, 71,
+  83, 88, 122, 86, 72, 85, 91, 93, 87, 90,
+  70, 76, 77, 55, 98, 94, 76, 81, 80, 76,
+  86, 83, 74, 85, 85, 84, 86, 79, 74, 97,
+  76, 88, 77, 81, 81, 82, 78, 89, 89, 93,
+  83, 72, 90, 79, 76, 76, 86, 96, 98, 81,
+  84, 82, 84, 68, 77, 71, 79, 96, 77, 76,
+  77, 81, 78, 84, 95, 74, 97, 78, 84, 74,
+  87, 82, 70, 89, 85, 82, 86, 86, 91, 85,
+  75, 71, 89, 86, 91, 83, 83, 111, 81, 83,
+  76, 75, 81, 82, 67, 80, 85, 82, 84, 79,
+  83, 74, 88, 88, 73, 77, 94, 62, 92, 78,
+  90, 88, 80, 84, 85, 100, 71, 89, 93, 89,
+  97, 78, 73, 85, 82, 82, 87, 87, 85, 93,
+  101, 84, 77, 86, 86, 89, 83, 85, 88, 74,
+  88, 76, 88, 85, 78, 75, 74, 87, 83, 85,
+  81, 101, 81, 80, 86, 84, 79, 113, 81, 78,
+  80, 95, 95, 85, 95, 94, 96, 86, 78, 85,
+  93, 82, 97, 87, 76, 96, 89, 80, 86, 94,
+  76, 87, 85, 72, 98, 119, 78, 91, 88, 90,
+  74, 95, 84, 71, 117, 83, 81, 85, 80, 77,
+  77, 84, 95, 80, 87, 77, 94, 68, 75, 82,
+  90, 67, 81, 65, 86, 94, 95, 87, 71, 67,
+  77, 81, 63, 82, 87, 91, 85, 71, 88, 79,
+  106, 80, 79, 88, 82, 85, 86, 77, 83, 90,
+  81, 79, 92, 95, 75, 89, 85, 85, 64, 67,
+  80, 97, 88, 85, 80, 84, 87, 97, 103, 85,
+  89, 79, 91, 100, 72, 97, 90, 77, 85, 73,
+  94, 89, 75, 82, 75, 87, 82, 75, 81, 101,
+  86, 80, 84, 87, 80, 93, 79, 81, 74, 95,
+  89, 85, 89, 81, 83, 82, 83, 83, 97, 84,
+  102, 87, 71, 110, 88, 74, 82, 85, 77, 87,
+  95, 64, 101, 112, 95, 90, 96, 85, 70, 80,
+  77, 66, 122, 69, 85, 88, 78, 90, 72, 72,
+  85, 77, 88, 77, 104, 60, 61, 82, 100, 55,
+  70, 64, 80, 78, 102, 88, 67, 68, 75, 84,
+  59, 82, 87, 89, 79, 79, 78, 92, 96, 70,
+  80, 89, 85, 79, 70, 77, 82, 102, 83, 72,
+  83, 98, 78, 81, 87, 85, 48, 54, 80, 103,
+  83, 77, 85, 73, 85, 96, 92, 68, 90, 75,
+  85, 107, 77, 94, 80, 77, 78, 64, 94, 85,
+  81, 80, 85, 84, 85, 99, 79, 97, 84, 83,
+  90, 81, 82, 75, 81, 80, 77, 93, 93, 87,
+  65, 92, 86, 88, 85, 88, 101, 81, 84, 81,
+  76, 105, 90, 75, 84, 82, 82, 84, 104, 78,
+  91, 110, 92, 92, 86, 86, 77, 80, 87, 76,
+  102, 77, 80, 81, 86, 96, 80, 91, 97, 78,
+  86, 80, 87, 71, 80, 85, 91, 74, 76, 80,
+  83, 99, 94, 90, 74, 69, 77, 87, 66, 76,
+  88, 90, 86, 91, 89, 97, 98, 79, 80, 83,
+  77, 74, 97, 77, 87, 82, 85, 84, 84, 91,
+  74, 84, 85, 87, 71, 77, 85, 93, 84, 91,
+  82, 88, 84, 101, 82, 92, 92, 84, 94, 96,
+  77, 97, 87, 75, 90, 76, 93, 90, 87, 89,
+  97, 76, 90, 74, 90, 83, 91, 77, 90, 83,
+  87, 82, 89, 89, 95, 80, 93, 85, 56, 87,
+  97, 99, 89, 72, 80, 81, 84, 88, 88, 95,
+  94, 92, 86, 87, 86, 79, 80, 86, 86, 86,
+  81, 96, 63, 92, 100, 86, 91, 85, 78, 86,
+  90, 77, 91, 81, 89, 101, 91, 80, 92, 90,
+  96, 91, 85, 71, 84, 92, 87, 98, 83, 88,
+  66, 79, 77, 85, 79, 83, 88, 83, 90, 82,
+  74, 81, 96, 80, 79, 92, 91, 111, 66, 93,
+  91, 77, 90, 83, 71, 88, 74, 74, 76, 82,
+  86, 63, 89, 94, 77, 80, 73, 73, 68, 79,
+  82, 82, 81, 94, 84, 90, 81, 73, 104, 90,
+  84, 82, 94, 79, 88, 70, 80, 90, 84, 79,
+  90, 85, 86, 83, 86, 76, 91, 83, 87, 85,
+  86, 90, 90, 74, 88, 85, 73, 85, 80, 92,
+  86, 68, 79, 81, 83, 91, 88, 93, 90, 91,
+  82, 81, 91, 79, 78, 85, 91, 89, 65, 90,
+  63, 84, 87, 85, 90, 84, 77, 84, 88, 79,
+  84, 86, 86, 94, 89, 85, 99, 89, 93, 90,
+  77, 70, 86, 92, 85, 91, 84, 86, 59, 75,
+  79, 86, 82, 82, 85, 82, 85, 86, 79, 84,
+  97, 78, 82, 92, 86, 108, 67, 92, 86, 77,
+  92, 80, 76, 87, 85, 82, 75, 87, 88, 70,
+  89, 87, 75, 83, 74, 72, 67, 77, 81, 78,
+  79, 89, 82, 89, 79, 72, 93, 83, 88, 82,
+  88, 81, 88, 71, 80, 86, 79, 83, 92, 100,
+  85, 92, 93, 80, 96, 83, 83, 85, 86, 76,
+  93, 88, 93, 79, 82, 88, 77, 92, 82, 74,
+  83, 88, 79, 83, 79, 93, 88, 88, 78, 80,
+  90, 81, 78, 94, 91, 86, 68, 85, 69, 90,
+  89, 73, 88, 94, 81, 78, 77, 80, 92, 81,
+  85, 94, 85, 80, 85, 88, 89, 83, 76, 84,
+  83, 92, 84, 92, 85, 83, 74, 77, 83, 88,
+  81, 88, 82, 86, 85, 88, 80, 91, 92, 79,
+  86, 90, 85, 99, 76, 93, 83, 81, 89, 84,
+  76, 89, 92, 71, 77, 85, 87, 72, 84, 75,
+  77, 84, 83, 81, 77, 82, 84, 83, 79, 84,
+  84, 91, 78, 66, 77, 88, 85, 89, 91, 79,
+  89, 81, 79, 83, 95, 76, 87, 70, 87, 98,
+  88, 68, 83, 81, 85, 77, 97, 72, 88, 67,
+  69, 84, 68, 79, 75, 97, 80, 79, 84, 80,
+  93, 101, 100, 81, 94, 84, 107, 95, 72, 105,
+  90, 64, 68, 88, 140, 83, 76, 124, 71, 94,
+  82, 75, 99, 77, 92, 86, 66, 88, 94, 71,
+  84, 87, 78, 73, 72, 89, 75, 73, 80, 81,
+  80, 64, 73, 74, 80, 115, 76, 79, 86, 100,
+  90, 84, 99, 82, 76, 71, 81, 88, 81, 69,
+  86, 110, 49, 83, 67, 87, 74, 86, 71, 80,
+  55, 80, 81, 81, 73, 69, 92, 114, 84, 68,
+  63, 76, 86, 85, 90, 89, 75, 96, 80, 81,
+  81, 123, 115, 95, 60, 77, 80, 84, 100, 80,
+  79, 89, 70, 73, 85, 75, 84, 85, 82, 68,
+  82, 82, 84, 84, 91, 76, 79, 55, 63, 83,
+  105, 78, 77, 88, 66, 72, 83, 75, 92, 109,
+  100, 76, 85, 92, 101, 78, 74, 99, 83, 65,
+  69, 89, 85, 77, 82, 109, 59, 94, 84, 73,
+  94, 78, 92, 78, 64, 90, 89, 78, 84, 91,
+  91, 72, 76, 84, 69, 70, 82, 77, 78, 67,
+  80, 79, 69, 107, 74, 86, 93, 90, 91, 87,
+  93, 82, 78, 95, 83, 87, 83, 75, 84, 111,
+  49, 82, 73, 86, 79, 82, 76, 81, 67, 85,
+  80, 73, 73, 75, 90, 107, 78, 69, 61, 75,
+  89, 85, 83, 83, 76, 92, 83, 83, 77, 124,
+  90, 92, 65, 75, 75, 86, 98, 79, 85, 86,
+  73, 83, 85, 106, 80, 90, 92, 79, 91, 87,
+  84, 90, 91, 68, 89, 81, 85, 88, 97, 83,
+  84, 91, 77, 78, 83, 83, 90, 102, 79, 93,
+  90, 95, 85, 78, 85, 88, 76, 84, 82, 88,
+  58, 86, 71, 90, 85, 73, 90, 93, 89, 79,
+  85, 87, 86, 90, 85, 92, 81, 84, 82, 79,
+  85, 71, 75, 80, 77, 93, 88, 88, 90, 91,
+  70, 78, 88, 92, 84, 88, 80, 86, 92, 85,
+  81, 104, 95, 80, 92, 93, 88, 94, 71, 85,
+  82, 79, 88, 81, 82, 85, 93, 71, 79, 75,
+  84, 72, 87, 84, 82, 81, 84, 83, 87, 88,
+  85, 84, 76, 89, 91, 91, 80, 66, 68, 84,
+  81, 83, 95, 85, 85, 85, 84, 78, 82, 93,
+  92, 68, 88, 108, 85, 69, 88, 83, 90, 85,
+  95, 73, 86, 91, 94, 80, 92, 77, 80, 94,
+  77, 96, 85, 84, 90, 93, 85, 75, 108, 89,
+  88, 90, 87, 96, 87, 73, 65, 84, 123, 87,
+  91, 121, 65, 99, 71, 86, 79, 86, 93, 98,
+  92, 89, 88, 65, 68, 74, 74, 65, 71, 91,
+  80, 74, 75, 86, 72, 66, 76, 67, 106, 120,
+  82, 77, 79, 93, 79, 74, 112, 88, 91, 65,
+  92, 93, 90, 72, 89, 76, 56, 77, 58, 94,
+  82, 100, 77, 89, 56, 79, 82, 92, 73, 70,
+  66, 98, 92, 82, 57, 74, 98, 84, 90, 91,
+  80, 93, 78, 80, 75, 105, 104, 74, 55, 78,
+  95, 89, 84, 95, 82, 86, 60, 84, 89, 68,
+  88, 100, 74, 69, 88, 83, 87, 85, 90, 74,
+  81, 79, 91, 79, 107, 84, 81, 86, 67, 91,
+  86, 77, 93, 96, 89, 67, 102, 86, 90, 80,
+  83, 97, 86, 72, 65, 83, 92, 78, 95, 106,
+  56, 88, 74, 80, 74, 85, 89, 91, 84, 80,
+  81, 71, 69, 80, 80, 61, 76, 87, 73, 77,
+  77, 80, 72, 74, 72, 70, 94, 120, 80, 80,
+  85, 86, 84, 72, 105, 86, 94, 101, 89, 92,
+  78, 78, 88, 77, 59, 79, 61, 91, 79, 89,
+  82, 90, 66, 81, 84, 78, 74, 74, 66, 93,
+  88, 80, 63, 76, 107, 85, 86, 88, 82, 93,
+  88, 80, 76, 112, 79, 80, 61, 81, 88, 88,
+  86, 93, 82, 90, 68, 91, 85, 107, 78, 85,
+  88, 80, 91, 82, 89, 91, 86, 82, 82, 86,
+  89, 80, 79, 87, 89, 92, 77, 77, 78, 88,
+  82, 91, 75, 87, 96, 96, 85, 77, 90, 89,
+  73, 92, 84, 88, 64, 82, 77, 86, 82, 72,
+  87, 97, 80, 85, 82, 84, 92, 74, 82, 87,
+  78, 83, 81, 76, 82, 78, 81, 84, 82, 90,
+  82, 94, 80, 85, 82, 92, 89, 92, 84, 87,
+  79, 81, 97, 84, 83, 108, 90, 88, 84, 87,
+  88, 86, 73, 85, 80, 82, 88, 82, 86, 91,
+  88, 77, 85, 78, 81, 75, 91, 88, 76, 84,
+  75, 81, 84, 87, 92, 88, 85, 92, 93, 94,
+  82, 68, 68, 76, 78, 87, 99, 87, 76, 90,
+  78, 79, 77, 92, 88, 82, 82, 80, 98, 87,
+  77, 84, 71, 88, 78, 84, 78, 89, 93, 75,
+  93, 88, 73, 83, 89, 90, 86, 85, 79, 79,
+  97, 81, 85, 73, 84, 85, 97, 82, 79, 94,
+  99, 79, 85, 80, 78, 96, 79, 93, 85, 76,
+  72, 107, 114, 87, 106, 70, 90, 79, 93, 80,
+  80, 86, 90, 75, 83, 89, 98, 82, 85, 88,
+  81, 70, 93, 82, 87, 93, 83, 83, 80, 65,
+  95, 88, 95, 85, 72, 100, 75, 79, 79, 82,
+  85, 85, 86, 75, 89, 77, 80, 80, 88, 92,
+  70, 71, 84, 88, 81, 78, 73, 78, 88, 84,
+  89, 77, 81, 87, 83, 90, 84, 85, 80, 90,
+  85, 87, 83, 81, 86, 71, 84, 91, 89, 81,
+  91, 93, 73, 70, 76, 85, 89, 85, 68, 87,
+  89, 95, 82, 77, 79, 93, 82, 72, 86, 86,
+  73, 88, 86, 72, 90, 79, 82, 81, 90, 83,
+  89, 68, 94, 79, 90, 80, 78, 74, 95, 71,
+  84, 66, 73, 90, 80, 72, 81, 84, 75, 103,
+  99, 80, 88, 85, 83, 85, 84, 79, 85, 77,
+  101, 94, 80, 82, 112, 82, 72, 75, 73, 81,
+  93, 94, 84, 83, 82, 61, 79, 57, 81, 94,
+  91, 88, 66, 94, 75, 86, 94, 82, 80, 84,
+  85, 82, 85, 68, 80, 83, 88, 82, 75, 70,
+  82, 89, 77, 74, 88, 74, 95, 84, 95, 88,
+  82, 85, 81, 99, 79, 84, 75, 93, 83, 84,
+  80, 80, 71, 86, 86, 91, 90, 91, 78, 94,
+  73, 87, 72, 88, 91, 86, 67, 91, 88, 90,
+  74, 77, 76, 88, 77, 76, 80, 83, 73, 86,
+  87, 76, 84, 80, 85, 81, 78, 89, 88, 79,
+  101, 73, 84, 84, 88, 72, 95, 70, 92, 69,
+  72, 100, 82, 81, 87, 84, 81, 90, 94, 87,
+  88, 98, 85, 89, 80, 79, 89, 86, 98, 92,
+  87, 79, 103, 84, 78, 73, 99, 84, 94, 97,
+  88, 85, 81, 66, 87, 62, 83, 105, 89, 89,
+  62, 91, 82, 84, 91, 79, 85, 78, 85, 79,
+  91, 68, 80, 83, 86, 83, 80, 80, 86, 87,
+  79, 76, 89, 66, 96, 81, 77, 93, 81, 87,
+  79, 93, 75, 81, 74, 92, 77, 82, 79, 82,
+  81, 86, 79, 82, 90, 69, 85, 74, 79, 83,
+  76, 79, 84, 84, 76, 87, 78, 95, 77, 91,
+  82, 96, 86, 74, 97, 91, 100, 92, 92, 81,
+  104, 81, 86, 78, 80, 77, 101, 67, 73, 78,
+  85, 78, 87, 98, 84, 90, 85, 64, 87, 95,
+  92, 99, 80, 86, 61, 96, 102, 79, 92, 50,
+  82, 44, 92, 96, 80, 89, 80, 46, 69, 85,
+  100, 66, 93, 85, 76, 86, 90, 84, 87, 86,
+  89, 99, 76, 80, 73, 70, 113, 109, 56, 82,
+  84, 77, 77, 89, 84, 73, 95, 83, 82, 73,
+  83, 72, 90, 90, 66, 67, 80, 98, 86, 83,
+  79, 76, 81, 97, 93, 79, 85, 94, 51, 99,
+  95, 82, 77, 85, 89, 85, 74, 67, 72, 88,
+  84, 120, 90, 70, 75, 70, 100, 77, 72, 85,
+  46, 94, 104, 80, 98, 81, 84, 80, 91, 85,
+  86, 121, 85, 77, 97, 90, 94, 87, 77, 79,
+  96, 81, 77, 74, 76, 96, 78, 64, 79, 74,
+  72, 62, 81, 82, 79, 61, 97, 79, 82, 63,
+  95, 43, 77, 71, 68, 75, 63, 81, 95, 78,
+  74, 118, 80, 82, 90, 91, 68, 83, 105, 77,
+  77, 73, 66, 99, 80, 84, 96, 91, 67, 82,
+  76, 73, 57, 79, 80, 101, 99, 77, 80, 94,
+  60, 78, 71, 83, 86, 106, 100, 94, 91, 68,
+  78, 92, 65, 65, 94, 99, 95, 76, 102, 117,
+  92, 78, 73, 79, 92, 76, 95, 86, 88, 83,
+  74, 76, 73, 104, 52, 76, 72, 93, 102, 76,
+  85, 109, 76, 68, 105, 89, 74, 84, 52, 92,
+  107, 81, 85, 76, 86, 80, 80, 79, 82, 139,
+  75, 81, 84, 80, 87, 83, 67, 76, 97, 75,
+  71, 77, 73, 87, 79, 72, 70, 74, 79, 60,
+  81, 79, 91, 78, 90, 84, 80, 78, 89, 47,
+  96, 70, 67, 81, 71, 99, 96, 113, 72, 97,
+  82, 81, 86, 101, 95, 80, 90, 72, 76, 69,
+  91, 93, 85, 86, 104, 94, 66, 61, 91, 75,
+  63, 105, 75, 92, 102, 80, 79, 83, 85, 78,
+  72, 87, 85, 87, 87, 85, 90, 80, 83, 89,
+  71, 103, 89, 94, 92, 78, 95, 105, 91, 73,
+  61, 86, 84, 84, 105, 71, 75, 76, 80, 76,
+  71, 91, 51, 73, 88, 88, 92, 68, 87, 73,
+  74, 78, 92, 83, 74, 88, 87, 81, 80, 79,
+  83, 74, 69, 99, 84, 85, 80, 70, 92, 94,
+  81, 84, 80, 88, 103, 77, 79, 74, 73, 80,
+  93, 79, 97, 79, 98, 72, 91, 101, 83, 91,
+  91, 67, 87, 81, 92, 102, 78, 73, 69, 96,
+  97, 91, 91, 88, 86, 49, 95, 92, 68, 89,
+  77, 52, 80, 87, 86, 75, 94, 83, 90, 85,
+  94, 91, 89, 85, 87, 108, 81, 89, 73, 72,
+  105, 96, 53, 79, 89, 77, 79, 87, 82, 85,
+  95, 84, 83, 76, 86, 74, 97, 86, 75, 83,
+  78, 93, 82, 80, 74, 73, 81, 81, 85, 77,
+  84, 98, 55, 85, 84, 82, 84, 87, 79, 84,
+  80, 71, 81, 85, 86, 100, 84, 68, 71, 73,
+  96, 71, 73, 91, 61, 84, 98, 75, 103, 70,
+  86, 95, 97, 78, 83, 97, 76, 84, 88, 79,
+  77, 96, 85, 80, 84, 71, 56, 78, 82, 108,
+  90, 67, 86, 83, 82, 76, 86, 87, 89, 69,
+  87, 76, 81, 72, 80, 52, 79, 73, 68, 89,
+  68, 93, 99, 83, 85, 108, 79, 76, 82, 89,
+  84, 87, 82, 78, 96, 86, 87, 86, 90, 79,
+  84, 86, 73, 76, 91, 87, 63, 85, 80, 93,
+  88, 89, 83, 90, 78, 88, 76, 90, 85, 98,
+  111, 98, 86, 77, 89, 87, 83, 76, 91, 92,
+  79, 77, 95, 92, 81, 80, 76, 75, 84, 79,
+  95, 72, 74, 80, 85, 86, 71, 100, 58, 83,
+  89, 78, 97, 69, 83, 94, 104, 68, 99, 88,
+  74, 84, 59, 85, 98, 72, 95, 87, 91, 83,
+  85, 78, 76, 107, 84, 92, 95, 81, 81, 89,
+  75, 78, 80, 86, 65, 82, 78, 91, 81, 88,
+  72, 86, 85, 75, 83, 86, 81, 79, 85, 77,
+  84, 76, 77, 56, 90, 85, 71, 91, 70, 90,
+  94, 103, 80, 84, 81, 72, 78, 99, 96, 88,
+  88, 73, 88, 90, 82, 88, 87, 84, 90, 93,
+  80, 72, 81, 91, 69, 96, 73, 97, 88, 98,
+  81, 87, 91, 82, 80, 87, 84, 83, 92, 86,
+  85, 87, 82, 82, 85, 83, 91, 89, 79, 83,
+  93, 81, 83, 78, 81, 76, 79, 83, 94, 75,
+  90, 76, 91, 85, 76, 87, 61, 75, 101, 75,
+  89, 70, 92, 84, 76, 78, 74, 82, 110, 88,
+  76, 69, 81, 65, 79, 95, 71, 91, 89, 105,
+  58, 84, 92, 97, 81, 91, 87, 71, 83, 77,
+  90, 76, 98, 83, 79, 82, 73, 86, 80, 71,
+  87, 85, 75, 87, 113, 70, 92, 79, 81, 88,
+  74, 88, 105, 79, 77, 75, 79, 89, 84, 95,
+  79, 106, 90, 84, 81, 70, 80, 79, 84, 92,
+  70, 72, 83, 77, 91, 76, 90, 87, 82, 84,
+  65, 65, 82, 88, 79, 96, 98, 81, 81, 85,
+  92, 97, 80, 77, 78, 84, 74, 74, 84, 90,
+  92, 73, 75, 86, 105, 81, 91, 88, 81, 87,
+  84, 97, 89, 87, 77, 83, 102, 76, 104, 104,
+  81, 74, 86, 80, 70, 90, 75, 80, 89, 70,
+  88, 85, 69, 77, 73, 73, 104, 82, 76, 70,
+  79, 68, 79, 87, 72, 91, 92, 107, 62, 90,
+  97, 87, 80, 88, 89, 70, 79, 76, 96, 76,
+  96, 78, 81, 73, 83, 86, 85, 68, 88, 77,
+  81, 90, 101, 77, 94, 76, 74, 83, 68, 96,
+  94, 69, 88, 77, 77, 86, 78, 85, 87, 113,
+  98, 75, 75, 69, 68, 73, 91, 100, 66, 64,
+  76, 80, 86, 70, 85, 81, 83, 81, 67, 59,
+  83, 84, 79, 89, 99, 72, 84, 84, 92, 109,
+  79, 80, 78, 75, 74, 79, 79, 97, 91, 68,
+  77, 85, 102, 82, 78, 88, 86, 91, 80, 100,
+  86, 84, 78, 84, 99, 77, 82, 109, 86, 71,
+  80, 86, 67, 92, 72, 80, 91, 76, 89, 84,
+  83, 81, 75, 85, 103, 88, 83, 72, 87, 69,
+  75, 85, 77, 92, 88, 99, 63, 91, 97, 95,
+  82, 92, 90, 75, 83, 79, 84, 72, 87, 85,
+  75, 69, 90, 110, 86, 74, 85, 82, 77, 86,
+  91, 76, 95, 89, 81, 88, 77, 88, 100, 81,
+  77, 81, 85, 90, 85, 99, 83, 96, 88, 83,
+  80, 75, 92, 76, 97, 91, 71, 67, 101, 86,
+  98, 73, 84, 90, 87, 81, 66, 69, 85, 90,
+  83, 94, 93, 76, 77, 85, 92, 97, 83, 82,
+  74, 86, 86, 81, 86, 93, 83, 82, 84, 85,
+  100, 79, 88, 93, 77, 88, 89, 98, 88, 88,
+  80, 83, 100, 78, 88, 96, 82, 78, 82, 81,
+  75, 90, 80, 87, 88, 76, 90, 77, 70, 84,
+  76, 87, 111, 90, 75, 74, 79, 71, 81, 82,
+  67, 98, 85, 100, 65, 90, 98, 94, 81, 92,
+  87, 60, 86, 79, 88, 74, 101, 92, 85, 86,
+  68, 81, 84, 87, 90, 78, 82, 87, 105, 73,
+  91, 85, 72, 91, 78, 81, 115, 66, 75, 83,
+  74, 95, 78, 95, 76, 96, 88, 85, 80, 70,
+  65, 73, 84, 75, 76, 55, 94, 80, 81, 75,
+  87, 82, 88, 92, 66, 68, 74, 102, 78, 71,
+  90, 74, 79, 80, 87, 85, 80, 71, 83, 84,
+  75, 84, 92, 88, 83, 68, 69, 91, 101, 84,
+  118, 92, 82, 86, 90, 92, 91, 85, 69, 90,
+  91, 80, 93, 95, 71, 70, 80, 70, 72, 79,
+  77, 85, 80, 67, 89, 82, 73, 85, 75, 77,
+  104, 78, 73, 75, 75, 73, 82, 91, 65, 97,
+  90, 105, 69, 92, 103, 89, 82, 89, 82, 54,
+  85, 80, 91, 71, 94, 95, 90, 79, 69, 74,
+  84, 82, 87, 72, 86, 89, 107, 79, 94, 89,
+  64, 83, 74, 82, 105, 73, 79, 82, 74, 88,
+  75, 84, 77, 94, 92, 80, 81, 72, 59, 75,
+  85, 68, 72, 62, 80, 83, 70, 76, 82, 74,
+  94, 79, 63, 61, 71, 104, 78, 70, 87, 70,
+  79, 78, 86, 89, 78, 80, 80, 76, 70, 87,
+  87, 91, 78, 63, 73, 86, 103, 87, 120, 88,
+  81, 87, 93, 91, 94, 84, 65, 83, 92, 78,
+  81, 96, 66, 68, 79, 71, 59, 80, 76, 88,
+  82, 71, 86, 89, 86, 79, 74, 89, 102, 84,
+  73, 73, 82, 77, 78, 89, 69, 94, 90, 97,
+  67, 97, 92, 96, 82, 88, 84, 65, 86, 77,
+  85, 72, 90, 99, 83, 78, 83, 96, 87, 88,
+  84, 77, 81, 84, 96, 76, 91, 92, 66, 90,
+  78, 81, 106, 80, 74, 87, 78, 84, 82, 97,
+  81, 90, 87, 84, 83, 74, 77, 74, 90, 73,
+  80, 67, 85, 85, 88, 70, 85, 84, 88, 80,
+  61, 69, 77, 100, 80, 83, 88, 80, 82, 80,
+  85, 87, 81, 77, 80, 87, 76, 83, 94, 92,
+  81, 71, 75, 80, 97, 81, 109, 95, 77, 85,
+  90, 95, 92, 86, 73, 81, 97, 83, 93, 89,
+  75, 76, 80, 77, 76, 81, 78, 91, 80, 69,
+  92, 77, 79, 87, 77, 88, 93, 103, 75, 74,
+  84, 75, 79, 88, 75, 102, 86, 87, 76, 93,
+  92, 99, 82, 85, 92, 75, 96, 78, 81, 83,
+  93, 88, 88, 94, 83, 83, 90, 95, 87, 91,
+  89, 89, 84, 76, 78, 92, 84, 91, 79, 85,
+  104, 73, 75, 91, 83, 93, 82, 97, 81, 89,
+  84, 82, 80, 79, 86, 71, 99, 76, 91, 85,
+  96, 77, 94, 72, 91, 82, 79, 86, 75, 72,
+  77, 90, 89, 83, 90, 76, 86, 89, 87, 81,
+  78, 82, 85, 97, 81, 70, 102, 82, 95, 75,
+  84, 89, 91, 83, 96, 92, 83, 87, 79, 92,
+  89, 88, 88, 94, 93, 81, 90, 93, 85, 74,
+  83, 71, 94, 84, 89, 100, 75, 74, 91, 77,
+  77, 89, 76, 81, 89, 93, 75, 74, 85, 76,
+  79, 98, 74, 98, 87, 85, 81, 90, 86, 93,
+  82, 81, 92, 72, 97, 75, 85, 82, 88, 102,
+  93, 88, 84, 79, 83, 91, 89, 84, 82, 89,
+  87, 77, 79, 89, 81, 81, 81, 83, 98, 78,
+  73, 93, 82, 95, 83, 89, 83, 83, 81, 84,
+  78, 75, 81, 70, 103, 68, 92, 84, 88, 75,
+  84, 70, 94, 79, 86, 78, 72, 69, 76, 91,
+  93, 83, 91, 73, 81, 86, 87, 82, 75, 84,
+  85, 91, 79, 76, 108, 80, 87, 70, 80, 88,
+  92, 84, 98, 104, 83, 88, 85, 98, 89, 83,
+  86, 88, 94, 88, 90, 88, 77, 74, 81, 76,
+  87, 81, 90, 105, 72, 74, 83, 82, 88, 83,
+  76, 90, 88, 94, 78, 76, 87, 80, 78, 86,
+  74, 98, 89, 83, 77, 98, 78, 99, 86, 83,
+  91, 77, 98, 75, 78, 85, 86, 98, 88, 85,
+  89, 90, 85, 92, 85, 87, 85, 85, 88, 80,
+  78, 90, 86, 90, 80, 84, 99, 77, 72, 94,
+  79, 88, 85, 99, 87, 86, 83, 84, 82, 79,
+  88, 75, 108, 75, 90, 85, 86, 81, 91, 68,
+  96, 83, 81, 85, 70, 73, 79, 86, 93, 89,
+  88, 82, 79, 86, 84, 84, 79, 86, 82, 98,
+  79, 72, 105, 80, 82, 77, 89, 73, 91, 80,
+  97, 94, 86, 91, 88, 95, 79, 86, 88, 89,
+  96, 89, 99, 88, 84, 77, 82, 75, 90, 85,
+  92, 104, 78, 81, 92, 100, 91, 85, 70, 73,
+  90, 78, 86, 92, 102, 106, 88, 74, 93, 68,
+  80, 87, 85, 98, 92, 82, 87, 82, 89, 86,
+  82, 88, 81, 94, 104, 80, 92, 86, 89, 70,
+  90, 80, 98, 81, 94, 85, 94, 91, 85, 73,
+  80, 74, 74, 88, 86, 92, 93, 80, 85, 91,
+  66, 84, 76, 90, 89, 69, 93, 72, 78, 86,
+  83, 93, 76, 95, 68, 92, 84, 89, 84, 78,
+  89, 74, 81, 82, 85, 87, 76, 71, 94, 84,
+  84, 93, 93, 97, 70, 80, 92, 76, 65, 98,
+  99, 92, 67, 75, 91, 87, 84, 83, 85, 93,
+  79, 105, 72, 98, 81, 84, 97, 79, 92, 94,
+  77, 87, 78, 91, 101, 85, 65, 89, 80, 87,
+  91, 94, 86, 107, 95, 87, 81, 75, 79, 75,
+  88, 85, 86, 82, 74, 74, 71, 80, 87, 79,
+  80, 100, 70, 85, 77, 89, 95, 95, 76, 82,
+  91, 85, 84, 83, 84, 73, 87, 85, 74, 81,
+  111, 78, 85, 87, 92, 85, 86, 103, 97, 89,
+  90, 84, 80, 81, 89, 82, 85, 87, 68, 72,
+  80, 89, 77, 115, 82, 70, 73, 70, 78, 76,
+  85, 80, 99, 94, 75, 81, 85, 71, 91, 82,
+  83, 89, 80, 79, 88, 81, 86, 89, 84, 77,
+  90, 79, 65, 83, 84, 88, 63, 88, 93, 81,
+  58, 80, 77, 97, 90, 83, 91, 81, 68, 83,
+  83, 77, 80, 88, 79, 83, 75, 79, 86, 79,
+  72, 78, 86, 72, 85, 79, 82, 87, 87, 81,
+  91, 85, 107, 87, 83, 102, 72, 77, 81, 85,
+  73, 65, 85, 85, 50, 96, 94, 75, 78, 91,
+  89, 100, 85, 96, 81, 78, 72, 82, 84, 99,
+  83, 87, 77, 82, 85, 86, 78, 89, 90, 80,
+  81, 81, 67, 84, 84, 108, 102, 92, 95, 86,
+  80, 79, 84, 73, 85, 86, 99, 75, 81, 92,
+  70, 128, 85, 81, 74, 68, 62, 69, 113, 77,
+  69, 84, 82, 79, 78, 91, 84, 77, 74, 82,
+  82, 77, 83, 95, 76, 88, 82, 67, 78, 74,
+  87, 93, 99, 81, 87, 80, 84, 73, 76, 77,
+  80, 73, 80, 89, 89, 78, 70, 70, 78, 86,
+  83, 92, 68, 80, 73, 84, 90, 85, 78, 79,
+  88, 84, 88, 79, 96, 88, 79, 78, 88, 98,
+  88, 89, 69, 77, 95, 76, 75, 88, 103, 119,
+  110, 76, 95, 78, 93, 95, 92, 100, 85, 79,
+  75, 78, 85, 90, 74, 90, 87, 85, 114, 73,
+  104, 90, 99, 72, 77, 83, 98, 88, 81, 84,
+  101, 100, 81, 79, 81, 67, 62, 97, 84, 89,
+  89, 96, 85, 83, 63, 91, 73, 94, 81, 69,
+  85, 71, 72, 89, 88, 97, 82, 80, 77, 79,
+  77, 88, 82, 64, 68, 92, 74, 77, 93, 88,
+  82, 75, 101, 80, 87, 97, 93, 86, 72, 73,
+  72, 73, 66, 93, 93, 95, 80, 76, 79, 88,
+  83, 82, 85, 84, 80, 109, 74, 103, 91, 100,
+  95, 77, 87, 85, 72, 88, 92, 71, 91, 101,
+  66, 87, 83, 86, 97, 92, 82, 101, 101, 94,
+  84, 70, 78, 71, 96, 83, 87, 85, 91, 92,
+  69, 93, 82, 75, 78, 99, 59, 85, 75, 90,
+  87, 89, 70, 90, 97, 75, 75, 77, 81, 75,
+  90, 84, 71, 78, 90, 88, 75, 80, 104, 78,
+  80, 104, 93, 72, 87, 99, 78, 74, 87, 87,
+  74, 79, 73, 70, 85, 90, 78, 123, 78, 61,
+  68, 66, 83, 72, 98, 72, 90, 90, 70, 87,
+  82, 68, 86, 111, 75, 86, 85, 76, 98, 90,
+  81, 91, 83, 79, 82, 74, 57, 82, 81, 81,
+  55, 81, 89, 79, 68, 86, 69, 75, 85, 82,
+  81, 76, 76, 77, 85, 80, 79, 91, 66, 91,
+  68, 84, 110, 77, 73, 76, 85, 78, 90, 79,
+  84, 86, 71, 88, 87, 78, 77, 81, 73, 90,
+  66, 74, 86, 85, 69, 72, 85, 94, 57, 87,
+  75, 66, 79, 86, 101, 106, 74, 97, 74, 73,
+  77, 77, 93, 82, 75, 84, 68, 87, 69, 82,
+  81, 89, 82, 78, 88, 73, 56, 76, 89, 106,
+  79, 76, 96, 90, 79, 72, 86, 74, 82, 87,
+  106, 71, 100, 85, 79, 138, 99, 76, 57, 76,
+  64, 76, 107, 87, 73, 77, 92, 92, 78, 96,
+  84, 93, 82, 73, 78, 68, 82, 91, 71, 85,
+  88, 68, 72, 76, 79, 104, 99, 75, 93, 69,
+  86, 75, 95, 87, 82, 70, 88, 92, 84, 98,
+  79, 65, 78, 79, 79, 91, 66, 86, 75, 92,
+  98, 82, 69, 83, 83, 78, 84, 77, 93, 90,
+  69, 81, 81, 100, 87, 104, 67, 76, 90, 65,
+  79, 90, 97, 106, 112, 87, 81, 95, 94, 91,
+  92, 91, 83, 75, 79, 80, 69, 88, 79, 88,
+  84, 86, 94, 80, 88, 85, 90, 78, 90, 82,
+  90, 94, 89, 82, 82, 96, 77, 73, 82, 66,
+  71, 89, 78, 79, 93, 92, 81, 72, 69, 88,
+  83, 95, 83, 83, 79, 73, 81, 84, 92, 92,
+  97, 76, 82, 82, 87, 79, 82, 71, 76, 81,
+  75, 84, 86, 91, 80, 74, 86, 76, 90, 88,
+  95, 91, 66, 94, 86, 80, 70, 81, 90, 87,
+  95, 79, 83, 95, 81, 81, 88, 85, 81, 100,
+  71, 99, 81, 94, 87, 86, 96, 84, 68, 90,
+  96, 65, 89, 85, 68, 88, 89, 79, 101, 84,
+  84, 105, 94, 92, 78, 67, 81, 74, 83, 87,
+  80, 76, 92, 113, 62, 88, 76, 73, 77, 86,
+  73, 94, 99, 94, 70, 81, 79, 88, 96, 86,
+  73, 77, 68, 76, 68, 84, 89, 77, 75, 87,
+  93, 85, 87, 76, 76, 92, 79, 87, 104, 97,
+  77, 77, 89, 79, 72, 76, 82, 72, 91, 79,
+  86, 128, 87, 64, 68, 66, 85, 74, 105, 81,
+  79, 95, 87, 93, 82, 79, 89, 87, 70, 88,
+  81, 72, 92, 92, 75, 88, 82, 80, 83, 75,
+  61, 84, 96, 74, 66, 76, 86, 73, 74, 82,
+  77, 77, 87, 83, 77, 83, 71, 76, 86, 78,
+  74, 88, 68, 96, 83, 86, 127, 84, 75, 79,
+  84, 69, 88, 81, 87, 80, 72, 84, 94, 76,
+  60, 77, 70, 96, 75, 84, 79, 84, 68, 79,
+  84, 83, 61, 80, 70, 77, 83, 81, 119, 94,
+  67, 91, 72, 81, 81, 80, 84, 72, 81, 90,
+  64, 98, 48, 83, 83, 83, 75, 76, 81, 76,
+  59, 81, 91, 96, 67, 85, 97, 89, 87, 74,
+  87, 82, 90, 94, 98, 77, 89, 86, 83, 109,
+  108, 76, 65, 81, 68, 83, 95, 76, 100, 83,
+  95, 97, 79, 103, 79, 77, 91, 85, 80, 71,
+  80, 83, 72, 77, 88, 74, 79, 77, 87, 103,
+  100, 79, 100, 68, 87, 77, 86, 79, 82, 87,
+  91, 91, 89, 80, 86, 70, 95, 83, 78, 86,
+  71, 84, 69, 77, 81, 80, 66, 86, 86, 79,
+  91, 85, 96, 89, 76, 78, 86, 89, 68, 89,
+  89, 106, 93, 92, 84, 82, 80, 90, 87, 86,
+  79, 82, 83, 98, 82, 79, 86, 85, 82, 74,
+  72, 90, 82, 88, 85, 92, 84, 75, 99, 80,
+  112, 104, 77, 91, 94, 81, 75, 79, 79, 78,
+  78, 83, 88, 88, 91, 90, 67, 91, 79, 82,
+  80, 89, 75, 86, 80, 92, 78, 83, 78, 79,
+  76, 80, 87, 86, 87, 79, 101, 103, 104, 77,
+  87, 92, 79, 103, 86, 66, 76, 85, 92, 77,
+  85, 85, 86, 88, 81, 69, 83, 89, 87, 103,
+  81, 84, 89, 86, 80, 89, 63, 76, 80, 88,
+  81, 77, 80, 84, 70, 86, 84, 75, 89, 89,
+  79, 91, 94, 86, 89, 82, 87, 80, 84, 93,
+  74, 81, 88, 83, 81, 95, 66, 91, 70, 95,
+  90, 100, 97, 86, 74, 84, 73, 74, 85, 82,
+  88, 106, 81, 74, 90, 79, 95, 84, 79, 82,
+  93, 94, 75, 103, 79, 94, 91, 59, 106, 89,
+  73, 105, 71, 63, 77, 74, 85, 74, 74, 108,
+  84, 95, 87, 88, 64, 80, 86, 62, 96, 65,
+  90, 68, 80, 102, 82, 84, 78, 76, 81, 72,
+  93, 91, 77, 78, 77, 96, 118, 85, 90, 93,
+  87, 95, 79, 58, 65, 70, 93, 104, 55, 75,
+  85, 55, 64, 87, 88, 77, 89, 119, 87, 77,
+  89, 90, 79, 92, 62, 95, 82, 86, 94, 89,
+  87, 82, 78, 94, 86, 81, 89, 90, 66, 89,
+  94, 93, 97, 88, 96, 82, 94, 94, 61, 80,
+  93, 86, 85, 87, 90, 89, 87, 89, 92, 90,
+  83, 79, 79, 93, 81, 102, 82, 83, 81, 93,
+  83, 77, 77, 89, 98, 76, 81, 88, 83, 86,
+  79, 102, 88, 83, 98, 87, 99, 96, 83, 87,
+  85, 75, 76, 81, 85, 80, 74, 83, 84, 102,
+  91, 88, 64, 98, 78, 79, 85, 82, 72, 87,
+  82, 87, 79, 83, 76, 81, 84, 79, 90, 85,
+  87, 70, 76, 103, 103, 84, 85, 87, 76, 90,
+  86, 73, 77, 92, 95, 92, 88, 87, 86, 91,
+  85, 73, 87, 81, 86, 94, 84, 83, 89, 86,
+  80, 93, 62, 92, 82, 88, 80, 80, 79, 86,
+  73, 83, 102, 78, 85, 87, 91, 81, 91, 87,
+  86, 82, 74, 76, 80, 87, 75, 79, 84, 82,
+  88, 85, 58, 87, 92, 88, 61, 88, 103, 78,
+  81, 108, 86, 88, 74, 73, 81, 75, 80, 77,
+  75, 72, 68, 72, 77, 76, 81, 82, 94, 86,
+  72, 81, 90, 100, 93, 82, 79, 93, 117, 74,
+  78, 71, 90, 97, 80, 77, 84, 91, 78, 80,
+  89, 93, 78, 94, 67, 132, 82, 100, 90, 70,
+  76, 72, 92, 67, 70, 72, 88, 74, 78, 73,
+  97, 92, 90, 74, 79, 81, 77, 69, 83, 73,
+  71, 121, 84, 92, 88, 85, 85, 104, 88, 78,
+  68, 93, 81, 77, 88, 73, 89, 88, 73, 83,
+  73, 71, 80, 87, 65, 73, 77, 90, 72, 89,
+  82, 75, 77, 81, 106, 77, 70, 80, 71, 77,
+  75, 66, 70, 86, 86, 83, 86, 79, 85, 81,
+  86, 76, 103, 75, 57, 85, 108, 73, 85, 105,
+  82, 124, 74, 70, 90, 59, 83, 83, 76, 85,
+  75, 70, 71, 67, 75, 78, 103, 80, 82, 73,
+  69, 86, 85, 79, 70, 91, 112, 68, 82, 75,
+  80, 105, 86, 59, 82, 76, 72, 70, 94, 116,
+  72, 86, 65, 115, 78, 102, 89, 72, 68, 67,
+  92, 71, 62, 78, 85, 71, 78, 66, 91, 85,
+  79, 72, 85, 66, 73, 76, 80, 69, 68, 122,
+  84, 85, 100, 82, 72, 121, 106, 71, 67, 84,
+  84, 63, 79, 67, 84, 89, 76, 88, 66, 67,
+  83, 84, 63, 80, 69, 103, 74, 90, 103, 75,
+  70, 76, 124, 67, 74, 75, 71, 71, 83, 67,
+  62, 87, 89, 80, 81, 78, 82, 84, 103, 89,
+  88, 76, 65, 93, 100, 78, 78, 111, 74, 116,
+  78, 75, 82, 72, 81, 83, 88, 76, 88, 79,
+  72, 78, 87, 83, 87, 83, 87, 80, 90, 79,
+  94, 87, 88, 92, 79, 71, 88, 75, 76, 90,
+  79, 86, 77, 79, 78, 84, 75, 91, 83, 87,
+  79, 76, 83, 93, 86, 70, 78, 75, 84, 71,
+  74, 71, 93, 73, 79, 76, 72, 91, 101, 84,
+  86, 81, 79, 92, 75, 78, 71, 114, 90, 74,
+  81, 87, 78, 98, 85, 77, 77, 80, 86, 83,
+  82, 73, 91, 89, 86, 88, 70, 69, 85, 87,
+  71, 74, 76, 89, 74, 93, 100, 83, 74, 87,
+  107, 77, 84, 79, 76, 84, 91, 69, 79, 86,
+  78, 86, 84, 81, 86, 87, 81, 89, 79, 89,
+  76, 81, 95, 82, 84, 101, 78, 115, 78, 80,
+  83, 82, 86, 77, 80, 79, 70, 79, 81, 69,
+  82, 89, 91, 77, 86, 87, 89, 100, 74, 77,
+  71, 94, 86, 79, 81, 77, 103, 93, 84, 99,
+  84, 92, 79, 87, 97, 99, 88, 83, 70, 59,
+  88, 92, 87, 72, 87, 87, 88, 73, 85, 72,
+  92, 82, 85, 80, 71, 83, 86, 78, 89, 83,
+  78, 66, 74, 84, 69, 99, 87, 90, 83, 97,
+  90, 101, 81, 111, 72, 105, 83, 70, 90, 72,
+  88, 87, 77, 86, 76, 75, 83, 88, 89, 73,
+  83, 84, 62, 95, 98, 85, 79, 92, 112, 79,
+  70, 88, 73, 88, 79, 68, 74, 78, 83, 93,
+  86, 75, 87, 84, 86, 80, 98, 78, 78, 79,
+  95, 81, 88, 93, 94, 115, 78, 68, 86, 65,
+  78, 86, 89, 82, 76, 78, 71, 67, 78, 80,
+  96, 67, 86, 78, 79, 112, 71, 88, 64, 85,
+  120, 90, 87, 75, 90, 105, 101, 71, 83, 76,
+  77, 78, 104, 107, 80, 82, 58, 99, 86, 100,
+  84, 65, 74, 79, 83, 80, 77, 77, 88, 79,
+  98, 70, 93, 75, 80, 74, 91, 76, 74, 79,
+  74, 89, 69, 96, 79, 74, 99, 109, 86, 121,
+  83, 92, 69, 98, 76, 58, 76, 71, 82, 92,
+  75, 87, 73, 66, 85, 85, 79, 74, 78, 91,
+  61, 91, 97, 76, 76, 84, 88, 70, 78, 82,
+  63, 85, 86, 61, 60, 83, 95, 86, 77, 72,
+  84, 88, 80, 93, 76, 76, 77, 85, 95, 87,
+  83, 101, 84, 81, 86, 83, 83, 85, 87, 91,
+  100, 69, 97, 78, 79, 75, 85, 92, 81, 71,
+  87, 90, 93, 83, 78, 86, 80, 94, 104, 77,
+  88, 74, 84, 89, 85, 97, 78, 73, 83, 92,
+  85, 78, 90, 84, 77, 117, 92, 92, 82, 78,
+  84, 90, 95, 75, 80, 72, 93, 91, 82, 89,
+  87, 90, 96, 79, 96, 82, 81, 90, 81, 82,
+  69, 94, 86, 78, 80, 97, 90, 85, 68, 103,
+  80, 92, 82, 79, 75, 73, 90, 89, 91, 85,
+  75, 80, 87, 89, 92, 73, 86, 84, 64, 93,
+  78, 91, 81, 88, 75, 83, 86, 85, 83, 84,
+  101, 71, 84, 81, 79, 94, 92, 82, 89, 60,
+  91, 101, 83, 98, 78, 99, 82, 84, 82, 76,
+  89, 88, 76, 100, 83, 86, 80, 82, 89, 88,
+  79, 81, 86, 81, 80, 79, 93, 74, 76, 84,
+  77, 89, 94, 86, 89, 89, 81, 76, 93, 79,
+  90, 85, 91, 88, 76, 79, 75, 86, 93, 94,
+  93, 87, 81, 87, 89, 95, 83, 80, 87, 84,
+  96, 96, 95, 75, 83, 86, 89, 73, 60, 75,
+  113, 84, 83, 72, 82, 92, 94, 68, 90, 84,
+  82, 71, 88, 76, 94, 77, 96, 75, 84, 103,
+  85, 70, 108, 78, 81, 83, 82, 70, 86, 52,
+  79, 88, 81, 80, 84, 86, 78, 91, 88, 83,
+  78, 90, 98, 74, 106, 77, 80, 77, 86, 91,
+  92, 82, 96, 84, 82, 81, 94, 108, 46, 82,
+  77, 71, 79, 91, 65, 93, 85, 84, 84, 100,
+  75, 77, 72, 86, 87, 79, 81, 67, 60, 107,
+  85, 81, 95, 90, 93, 56, 74, 81, 100, 86,
+  65, 50, 65, 73, 78, 53, 76, 88, 86, 68,
+  85, 82, 85, 97, 81, 90, 89, 57, 91, 77,
+  102, 78, 84, 85, 92, 73, 116, 80, 104, 98,
+  53, 84, 145, 82, 95, 122, 42, 66, 102, 105,
+  81, 75, 84, 81, 89, 60, 82, 82, 90, 69,
+  71, 86, 78, 106, 75, 77, 89, 123, 98, 70,
+  91, 67, 88, 78, 78, 83, 77, 153, 88, 86,
+  93, 102, 97, 82, 99, 101, 73, 87, 78, 70,
+  83, 99, 59, 82, 99, 79, 87, 99, 95, 79,
+  88, 86, 85, 119, 86, 109, 69, 88, 79, 108,
+  85, 102, 83, 91, 80, 86, 79, 67, 86, 89,
+  77, 91, 90, 88, 80, 79, 73, 92, 87, 95,
+  92, 83, 80, 67, 74, 84, 91, 102, 77, 83,
+  64, 77, 82, 86, 86, 94, 99, 87, 90, 93,
+  87, 108, 88, 96, 94, 78, 85, 90, 101, 85,
+  100, 84, 90, 80, 102, 79, 74, 63, 59, 87,
+  77, 83, 94, 66, 90, 83, 100, 83, 97, 77,
+  90, 83, 71, 88, 83, 87, 91, 82, 81, 75,
+  88, 84, 87, 75, 77, 81, 91, 82, 88, 76,
+  80, 80, 82, 84, 63, 123, 88, 88, 89, 78,
+  89, 89, 91, 94, 83, 73, 85, 90, 59, 67,
+  43, 77, 96, 79, 76, 100, 88, 89, 98, 73,
+  91, 108, 87, 78, 104, 92, 78, 74, 83, 77,
+  77, 87, 81, 79, 83, 123, 79, 87, 78, 67,
+  74, 82, 81, 81, 70, 77, 79, 75, 97, 87,
+  91, 74, 85, 80, 75, 75, 81, 79, 85, 82,
+  77, 76, 89, 92, 84, 85, 80, 74, 80, 79,
+  84, 69, 87, 92, 90, 85, 77, 72, 79, 91,
+  84, 71, 90, 92, 100, 90, 85, 78, 66, 63,
+  105, 91, 45, 80, 90, 81, 80, 75, 66, 73,
+  102, 64, 87, 92, 79, 71, 83, 87, 84, 83,
+  97, 89, 91, 103, 83, 67, 95, 84, 86, 86,
+  81, 75, 92, 80, 84, 91, 91, 81, 83, 85,
+  79, 73, 87, 80, 76, 79, 102, 70, 81, 86,
+  79, 86, 75, 79, 81, 73, 90, 95, 82, 82,
+  113, 101, 85, 79, 85, 113, 82, 69, 59, 93,
+  86, 86, 99, 129, 67, 67, 81, 72, 85, 84,
+  81, 90, 80, 97, 84, 72, 91, 91, 87, 61,
+  79, 89, 86, 95, 74, 97, 66, 75, 84, 51,
+  74, 100, 81, 78, 89, 87, 75, 135, 84, 55,
+  72, 63, 82, 79, 74, 59, 67, 65, 85, 68,
+  109, 99, 87, 72, 70, 87, 109, 67, 117, 92,
+  59, 83, 82, 86, 83, 69, 67, 93, 68, 83,
+  82, 77, 89, 88, 80, 91, 87, 123, 52, 79,
+  78, 87, 91, 74, 88, 90, 81, 84, 83, 80,
+  70, 137, 90, 88, 86, 88, 105, 81, 79, 69,
+  77, 87, 69, 86, 71, 89, 80, 97, 91, 74,
+  73, 81, 75, 71, 96, 83, 88, 99, 89, 73,
+  90, 89, 68, 107, 78, 98, 83, 81, 83, 77,
+  86, 83, 79, 86, 85, 89, 84, 74, 82, 85,
+  81, 77, 78, 79, 89, 82, 86, 72, 73, 77,
+  86, 98, 90, 96, 81, 97, 97, 87, 100, 93,
+  85, 97, 88, 80, 82, 85, 88, 78, 94, 86,
+  80, 86, 76, 84, 86, 74, 80, 84, 77, 88,
+  86, 61, 74, 87, 77, 66, 95, 67, 98, 84,
+  95, 85, 86, 76, 77, 87, 73, 91, 82, 84,
+  83, 89, 78, 84, 97, 89, 76, 73, 88, 93,
+  84, 68, 93, 81, 78, 86, 82, 76, 68, 57,
+  82, 86, 61, 79, 76, 86, 67, 81, 80, 71,
+  78, 92, 70, 71, 92, 79, 80, 69, 81, 80,
+  92, 77, 90, 74, 85, 89, 82, 70, 99, 83,
+  89, 84, 89, 74, 73, 79, 74, 89, 85, 107,
+  79, 87, 84, 85, 81, 80, 84, 80, 84, 79,
+  86, 74, 100, 84, 92, 74, 90, 82, 86, 80,
+  81, 97, 78, 88, 88, 74, 81, 100, 94, 98,
+  67, 82, 80, 77, 94, 73, 80, 98, 88, 80,
+  65, 85, 78, 71, 86, 77, 96, 89, 73, 81,
+  89, 69, 79, 77, 96, 83, 68, 76, 84, 80,
+  86, 81, 71, 90, 88, 74, 89, 80, 88, 84,
+  88, 83, 92, 86, 72, 90, 96, 87, 85, 84,
+  77, 89, 82, 87, 88, 72, 85, 73, 82, 90,
+  88, 74, 86, 78, 75, 74, 85, 72, 82, 94,
+  85, 82, 94, 83, 84, 92, 76, 86, 85, 74,
+  88, 91, 86, 79, 85, 75, 91, 82, 91, 87,
+  83, 75, 77, 82, 79, 84, 94, 87, 75, 77,
+  88, 82, 87, 77, 90, 99, 86, 70, 77, 70,
+  86, 85, 84, 67, 68, 86, 80, 90, 104, 99,
+  85, 82, 92, 81, 93, 96, 91, 95, 79, 89,
+  74, 81, 89, 76, 88, 95, 82, 79, 59, 71,
+  68, 60, 84, 77, 84, 92, 80, 77, 89, 82,
+  72, 76, 102, 73, 87, 87, 86, 85, 76, 84,
+  74, 95, 84, 84, 89, 78, 86, 90, 74, 82,
+  94, 95, 60, 81, 85, 83, 86, 79, 88, 90,
+  81, 83, 84, 74, 81, 66, 81, 86, 73, 74,
+  81, 82, 69, 73, 80, 75, 76, 94, 82, 68,
+  114, 76, 83, 86, 84, 88, 82, 76, 96, 82,
+  84, 81, 81, 66, 82, 94, 88, 70, 79, 96,
+  80, 75, 80, 84, 79, 87, 73, 87, 88, 83,
+  86, 79, 81, 82, 80, 77, 79, 84, 94, 77,
+  83, 74, 83, 81, 84, 89, 77, 86, 90, 94,
+  100, 80, 91, 97, 83, 98, 72, 80, 90, 64,
+  86, 76, 96, 91, 84, 87, 72, 81, 87, 80,
+  82, 80, 86, 80, 90, 75, 80, 88, 87, 74,
+  95, 87, 101, 67, 85, 88, 83, 82, 82, 75,
+  97, 86, 87, 81, 83, 82, 78, 81, 87, 84,
+  78, 88, 84, 97, 88, 77, 86, 80, 85, 83,
+  86, 82, 76, 77, 82, 85, 84, 83, 78, 84,
+  78, 82, 80, 69, 86, 80, 93, 83, 99, 78,
+  81, 83, 83, 79, 96, 82, 85, 85, 81, 83,
+  88, 83, 81, 85, 83, 85, 79, 78, 79, 82,
+  81, 78, 85, 88, 81, 88, 89, 79, 83, 89,
+  85, 87, 84, 96, 88, 84, 83, 86, 82, 89,
+  85, 80, 86, 85, 87, 89, 82, 86, 87, 81,
+  79, 90, 87, 91, 91, 86, 91, 85, 78, 81,
+  82, 82, 79, 87, 77, 83, 80, 91, 85, 95,
+  78, 88, 91, 85, 86, 77, 82, 86, 80, 91,
+  85, 79, 75, 76, 82, 82, 88, 83, 77, 86,
+  90, 84, 87, 89, 77, 78, 93, 82, 85, 82,
+  81, 83, 78, 90, 82, 78, 75, 87, 85, 82,
+  85, 84, 89, 84, 87, 75, 81, 85, 80, 85,
+  86, 84, 88, 87, 85, 83, 86, 75, 87, 83,
+  95, 86, 80, 74, 87, 82, 82, 80, 85, 84,
+  86, 81, 80, 85, 75, 73, 79, 80, 79, 76,
+  83, 86, 84, 86, 89, 77, 81, 88, 83, 88,
+  86, 94, 85, 80, 83, 85, 72, 87, 79, 79,
+  89, 80, 87, 83, 85, 81, 86, 76, 78, 90,
+  80, 89, 86, 84, 92, 83, 80, 79, 82, 79,
+  77, 84, 76, 83, 80, 85, 83, 91, 79, 89,
+  89, 82, 87, 76, 80, 86, 80, 90, 83, 79,
+  75, 72, 84, 80, 91, 84, 79, 87, 85, 83,
+  84, 84, 75, 76, 90, 83, 80, 87, 79, 81,
+  76, 84, 81, 74, 74, 88, 84, 79, 86, 85,
+  88, 81, 86, 77, 83, 83, 76, 85, 83, 87,
+  82, 90, 80, 83, 82, 73, 87, 80, 89, 86,
+  77, 77, 86, 78, 83, 82, 87, 85, 89, 83,
+  82, 83, 81, 77, 80, 85, 84, 78, 85, 87,
+  83, 91, 89, 84, 84, 95, 90, 83, 87, 92,
+  85, 81, 88, 86, 82, 82, 87, 86, 89, 85,
+  85, 90, 80, 82, 83, 84, 83, 87, 88, 92,
+  91, 84, 87, 83, 78, 82, 80, 80, 78, 86,
+  78, 89, 81, 87, 90, 90, 82, 89, 91, 88,
+  87, 80, 78, 87, 79, 90, 86, 80, 80, 75,
+  88, 86, 85, 92, 82, 83, 90, 81, 88, 82,
+  76, 77, 89, 83, 82, 89, 81, 86, 84, 90,
+  82, 83, 81, 87, 85, 76, 86, 84, 86, 80,
+  88, 78, 86, 86, 81, 87, 84, 87, 84, 95,
+  81, 80, 84, 76, 83, 82, 91, 86, 82, 78,
+  91, 79, 81, 80, 85, 77, 79, 85, 80, 87,
+  77, 83, 80, 79, 84, 80, 80, 84, 84, 82,
+  84, 82, 84, 84, 82, 79, 79, 99, 91, 93,
+  82, 89, 81, 91, 90, 85, 89, 82, 89, 87,
+  85, 78, 85, 83, 79, 99, 91, 86, 92, 77,
+  87, 82, 82, 84, 90, 81, 84, 86, 83, 84,
+  84, 86, 84, 88, 84, 88, 92, 89, 83, 79,
+  84, 86, 80, 90, 77, 77, 75, 74, 80, 85,
+  93, 82, 72, 94, 87, 73, 85, 86, 80, 82,
+  85, 83, 88, 84, 82, 84, 81, 93, 77, 77,
+  84, 90, 83, 94, 76, 82, 88, 87, 86, 81,
+  79, 81, 81, 81, 87, 84, 88, 85, 87, 85,
+  84, 78, 88, 86, 91, 80, 72, 82, 82, 87,
+  79, 77, 81, 78, 77, 79, 75, 82, 77, 79,
+  78, 80, 85, 82, 75, 84, 87, 81, 81, 79,
+  81, 81, 82, 81, 85, 101, 83, 90, 79, 89,
+  65, 87, 83, 82, 92, 76, 85, 80, 89, 77,
+  85, 78, 82, 101, 79, 85, 90, 72, 85, 83,
+  86, 85, 85, 81, 81, 83, 87, 83, 87, 83,
+  87, 84, 83, 92, 91, 91, 79, 84, 80, 88,
+  84, 85, 79, 81, 76, 72, 83, 90, 96, 81,
+  75, 96, 83, 75, 81, 79, 82, 80, 81, 86,
+  85, 87, 83, 79, 81, 88, 73, 72, 80, 92,
+  88, 100, 75, 83, 92, 84, 87, 84, 79, 77,
+  77, 79, 86, 83, 84, 81, 84, 88, 78, 82,
+  92, 85, 80, 73, 71, 85, 84, 80, 78, 81,
+  88, 82, 79, 86, 82, 82, 75, 80, 79, 84,
+  87, 81, 83, 87, 83, 83, 86, 86, 85, 92,
+  89, 75, 90, 92, 82, 89, 87, 88, 80, 81,
+  93, 88, 92, 83, 87, 85, 85, 79, 83, 77,
+  82, 87, 87, 89, 86, 78, 80, 84, 80, 82,
+  85, 78, 82, 82, 82, 88, 81, 85, 90, 91,
+  85, 83, 90, 86, 84, 76, 77, 86, 81, 88,
+  82, 78, 80, 76, 86, 86, 91, 93, 80, 86,
+  86, 78, 85, 78, 79, 85, 86, 83, 84, 89,
+  81, 85, 85, 91, 82, 79, 89, 88, 87, 84,
+  79, 83, 85, 83, 88, 81, 84, 82, 86, 83,
+  88, 86, 88, 87, 83, 78, 79, 81, 84, 83,
+  84, 86, 74, 80, 84, 86, 80, 79, 87, 78,
+  85, 94, 84, 75, 97, 87, 81, 84, 89, 80,
+  89, 89, 70, 91, 91, 91, 87, 88, 94, 84,
+  79, 82, 84, 83, 86, 90, 171, 80, 94, 90,
+  86, 94, 86, 81, 85, 96, 81, 115, 93, 77,
+  90, 87, 82, 75, 77, 83, 80, 86, 79, 94,
+  83, 96, 77, 81, 79, 95, 80, 102, 82, 82,
+  91, 94, 81, 86, 96, 80, 76, 84, 76, 80,
+  81, 82, 78, 81, 91, 83, 92, 67, 89, 72,
+  86, 83, 78, 89, 86, 86, 96, 80, 81, 94,
+  82, 87, 90, 85, 85, 88, 79, 85, 87, 80,
+  81, 88, 80, 79, 86, 91, 86, 81, 81, 82,
+  85, 85, 86, 78, 84, 83, 83, 81, 84, 92,
+  68, 78, 78, 82, 90, 80, 86, 78, 83, 87,
+  79, 76, 97, 85, 80, 83, 90, 81, 85, 82,
+  70, 83, 90, 91, 86, 85, 92, 84, 80, 79,
+  81, 82, 86, 90, 181, 85, 85, 88, 87, 83,
+  75, 78, 92, 96, 86, 118, 100, 76, 89, 87,
+  83, 76, 73, 80, 84, 84, 75, 90, 80, 93,
+  84, 80, 82, 93, 81, 94, 86, 86, 93, 100,
+  80, 91, 93, 79, 76, 90, 82, 80, 79, 87,
+  78, 86, 91, 81, 89, 66, 84, 72, 84, 77,
+  81, 88, 79, 90, 94, 78, 84, 94, 82, 82,
+  86, 83, 87, 87, 80, 94, 92, 82, 84, 85,
+  76, 79, 85, 89, 79, 77, 78, 81, 80, 77,
+  79, 84, 82, 87, 85, 82, 80, 83, 65, 77,
+  78, 77, 87, 82, 86, 83, 89, 93, 86, 79,
+  94, 87, 81, 85, 89, 81, 92, 80, 70, 89,
+  90, 96, 88, 96, 90, 76, 81, 78, 85, 79,
+  90, 88, 167, 89, 91, 95, 87, 86, 75, 81,
+  82, 100, 89, 112, 90, 68, 91, 89, 77, 79,
+  78, 80, 78, 84, 74, 84, 80, 92, 80, 89,
+  83, 94, 87, 101, 80, 76, 87, 91, 83, 86,
+  85, 79, 75, 87, 86, 77, 83, 81, 83, 87,
+  89, 87, 93, 64, 85, 75, 85, 81, 76, 92,
+  84, 85, 90, 82, 80, 90, 84, 84, 87, 81,
+  86, 85, 87, 79, 87, 76, 80, 86, 79, 84,
+  91, 90, 85, 88, 79, 83, 84, 81, 82, 78,
+  79, 84, 82, 79, 92, 99, 72, 80, 81, 86,
+  90, 79, 79, 102, 74, 94, 70, 71, 77, 94,
+  100, 92, 72, 78, 99, 72, 66, 79, 81, 80,
+  81, 83, 68, 92, 90, 85, 79, 91, 106, 94,
+  111, 88, 60, 81, 71, 83, 60, 91, 112, 82,
+  96, 80, 91, 69, 106, 70, 72, 89, 71, 94,
+  91, 83, 82, 87, 89, 74, 100, 96, 95, 60,
+  79, 81, 86, 85, 53, 90, 62, 68, 94, 90,
+  83, 113, 89, 77, 116, 66, 82, 98, 84, 78,
+  82, 77, 85, 77, 91, 90, 83, 78, 94, 71,
+  69, 85, 81, 99, 73, 98, 112, 82, 88, 78,
+  77, 112, 94, 91, 95, 92, 70, 80, 64, 79,
+  82, 66, 77, 41, 79, 92, 106, 91, 80, 75,
+  79, 91, 78, 86, 83, 89, 78, 73, 85, 61,
+  78, 78, 82, 94, 71, 80, 66, 99, 100, 96,
+  73, 72, 81, 85, 65, 72, 76, 66, 71, 82,
+  89, 95, 93, 82, 75, 76, 111, 93, 112, 81,
+  48, 81, 59, 82, 61, 96, 110, 86, 82, 72,
+  95, 63, 69, 62, 72, 97, 78, 78, 97, 75,
+  91, 96, 83, 64, 108, 88, 98, 55, 77, 78,
+  77, 96, 49, 81, 66, 66, 77, 74, 77, 114,
+  123, 75, 113, 71, 85, 101, 88, 94, 74, 73,
+  80, 71, 92, 99, 76, 86, 90, 73, 67, 69,
+  81, 94, 76, 84, 130, 79, 87, 76, 62, 118,
+  96, 84, 87, 93, 64, 76, 66, 76, 67, 68,
+  80, 38, 74, 87, 120, 83, 91, 79, 68, 83,
+  74, 83, 72, 87, 74, 72, 76, 58, 74, 74,
+  78, 88, 81, 79, 70, 94, 91, 94, 78, 79,
+  90, 89, 67, 78, 88, 73, 82, 79, 109, 84,
+  81, 96, 88, 84, 102, 90, 91, 78, 79, 73,
+  80, 81, 61, 88, 85, 87, 76, 83, 84, 74,
+  55, 74, 82, 86, 85, 72, 90, 85, 87, 86,
+  90, 73, 97, 76, 99, 66, 84, 81, 76, 85,
+  73, 92, 64, 75, 94, 87, 82, 108, 65, 66,
+  122, 68, 83, 103, 90, 80, 64, 84, 83, 79,
+  91, 99, 83, 84, 91, 68, 82, 79, 86, 81,
+  83, 94, 115, 86, 87, 82, 65, 108, 84, 86,
+  93, 96, 81, 79, 68, 75, 79, 78, 87, 47,
+  75, 91, 106, 97, 83, 82, 81, 84, 84, 81,
+  87, 84, 83, 81, 90, 59, 71, 82, 78, 77,
+  61, 91, 88, 74, 90, 79, 79, 64, 90, 108,
+  83, 72, 85, 81, 69, 82, 92, 88, 83, 82,
+  84, 94, 91, 91, 96, 107, 109, 74, 72, 75,
+  78, 75, 94, 79, 77, 72, 81, 85, 91, 89,
+  68, 68, 81, 90, 79, 87, 82, 102, 80, 80,
+  87, 86, 74, 87, 66, 103, 97, 78, 55, 89,
+  87, 63, 99, 89, 79, 98, 60, 82, 77, 90,
+  91, 66, 83, 73, 93, 75, 86, 90, 76, 81,
+  84, 88, 89, 90, 87, 84, 68, 78, 72, 96,
+  70, 88, 97, 92, 80, 65, 90, 72, 95, 78,
+  84, 75, 79, 94, 84, 76, 85, 70, 84, 77,
+  91, 80, 87, 79, 82, 124, 108, 94, 87, 80,
+  76, 85, 81, 86, 66, 91, 64, 78, 66, 72,
+  85, 75, 108, 74, 78, 62, 95, 74, 80, 76,
+  85, 81, 65, 90, 95, 72, 84, 84, 86, 100,
+  100, 97, 97, 84, 107, 68, 64, 68, 90, 74,
+  99, 76, 77, 85, 74, 68, 103, 94, 55, 82,
+  87, 71, 70, 82, 89, 96, 79, 72, 77, 94,
+  70, 87, 58, 110, 82, 66, 54, 87, 65, 42,
+  93, 86, 76, 71, 102, 71, 75, 88, 93, 60,
+  81, 83, 118, 67, 84, 92, 81, 83, 86, 86,
+  81, 80, 107, 80, 71, 89, 75, 94, 73, 92,
+  89, 88, 62, 55, 91, 68, 87, 76, 84, 63,
+  78, 99, 98, 78, 94, 64, 78, 79, 92, 64,
+  69, 73, 68, 115, 96, 95, 88, 78, 75, 90,
+  77, 87, 68, 84, 62, 77, 77, 79, 72, 79,
+  104, 88, 80, 65, 73, 61, 82, 75, 81, 71,
+  73, 85, 81, 81, 85, 90, 92, 92, 86, 85,
+  92, 66, 110, 78, 68, 74, 84, 85, 102, 76,
+  81, 73, 79, 91, 77, 80, 77, 93, 93, 81,
+  88, 79, 81, 90, 81, 72, 100, 90, 82, 74,
+  75, 95, 88, 85, 65, 83, 72, 59, 85, 82,
+  89, 93, 117, 74, 90, 75, 98, 78, 91, 91,
+  109, 70, 81, 85, 82, 89, 81, 81, 82, 82,
+  87, 82, 65, 82, 77, 88, 103, 85, 89, 84,
+  63, 85, 91, 89, 97, 80, 81, 74, 78, 88,
+  93, 70, 85, 60, 78, 82, 85, 82, 73, 81,
+  74, 107, 82, 88, 85, 80, 81, 81, 84, 79,
+  94, 66, 73, 88, 70, 101, 92, 78, 70, 83,
+  78, 83, 82, 82, 87, 82, 92, 92, 81, 88,
+  88, 87, 82, 69, 71, 95, 76, 84, 91, 105,
+  118, 84, 96, 90, 92, 88, 83, 89, 88, 71,
+  78, 86, 85, 96, 83, 70, 93, 99, 79, 85,
+  89, 81, 87, 100, 91, 86, 73, 96, 94, 74,
+  93, 89, 77, 84, 97, 88, 91, 84, 89, 64,
+  93, 87, 75, 99, 94, 72, 73, 95, 83, 86,
+  82, 76, 78, 91, 83, 84, 87, 94, 78, 83,
+  77, 77, 88, 84, 70, 87, 97, 93, 102, 76,
+  78, 90, 88, 82, 93, 85, 90, 97, 65, 81,
+  82, 96, 94, 74, 69, 77, 72, 90, 88, 96,
+  88, 78, 86, 84, 88, 78, 82, 85, 94, 79,
+  77, 88, 65, 82, 90, 72, 72, 81, 76, 84,
+  92, 86, 95, 80, 97, 99, 84, 98, 86, 88,
+  83, 67, 75, 88, 72, 83, 84, 89, 128, 84,
+  108, 94, 93, 82, 88, 91, 84, 72, 78, 101,
+  96, 101, 83, 59, 101, 87, 66, 89, 91, 81,
+  83, 102, 80, 79, 78, 95, 93, 76, 85, 79,
+  78, 84, 79, 83, 101, 89, 91, 69, 71, 84,
+  69, 92, 92, 68, 70, 101, 77, 87, 82, 68,
+  72, 86, 98, 85, 78, 86, 80, 82, 76, 77,
+  93, 89, 63, 91, 93, 94, 89, 69, 71, 65,
+  85, 78, 85, 91, 84, 101, 65, 84, 83, 99,
+  89, 76, 80, 86, 68, 95, 100, 79, 78, 82,
+  78, 87, 78, 77, 86, 91, 80, 96, 86, 87,
+  80, 83, 76, 79, 88, 85, 80, 80, 77, 82,
+  83, 85, 89, 83, 84, 89, 79, 92, 94, 75,
+  82, 96, 71, 81, 86, 80, 118, 83, 86, 84,
+  90, 98, 83, 90, 81, 81, 85, 82, 89, 84,
+  84, 81, 104, 104, 81, 83, 88, 85, 83, 86,
+  86, 65, 75, 91, 86, 79, 82, 95, 80, 77,
+  98, 72, 93, 83, 95, 75, 100, 87, 80, 89,
+  87, 77, 83, 95, 93, 76, 79, 77, 81, 95,
+  78, 90, 75, 87, 84, 85, 71, 82, 90, 87,
+  80, 86, 90, 88, 71, 79, 85, 71, 87, 79,
+  91, 83, 85, 91, 83, 78, 79, 87, 83, 82,
+  87, 87, 106, 88, 83, 95, 87, 83, 85, 86,
+  78, 78, 85, 84, 73, 82, 74, 77, 78, 87,
+  78, 98, 80, 83, 80, 74, 67, 77, 76, 90,
+  85, 85, 77, 90, 102, 89, 84, 77, 75, 86,
+  104, 78, 92, 79, 83, 84, 100, 84, 90, 94,
+  83, 82, 95, 75, 93, 65, 78, 92, 77, 86,
+  84, 83, 91, 76, 99, 79, 87, 78, 87, 80,
+  92, 91, 78, 80, 80, 86, 81, 85, 99, 74,
+  91, 84, 56, 80, 91, 97, 82, 101, 77, 67,
+  68, 90, 88, 68, 83, 83, 75, 93, 76, 85,
+  96, 75, 86, 93, 105, 81, 98, 82, 97, 118,
+  75, 77, 101, 68, 80, 81, 87, 92, 93, 76,
+  79, 81, 62, 81, 84, 89, 87, 81, 81, 88,
+  76, 97, 82, 80, 86, 92, 84, 85, 81, 93,
+  98, 84, 68, 85, 84, 72, 86, 69, 71, 94,
+  84, 80, 101, 77, 63, 86, 76, 83, 80, 72,
+  78, 74, 88, 84, 76, 79, 78, 76, 79, 74,
+  87, 85, 87, 94, 104, 82, 81, 104, 78, 74,
+  74, 75, 100, 68, 100, 95, 78, 90, 84, 91,
+  84, 87, 96, 85, 88, 86, 86, 76, 82, 78,
+  83, 82, 73, 87, 75, 82, 96, 69, 95, 81,
+  48, 82, 88, 101, 85, 97, 78, 66, 64, 92,
+  87, 75, 84, 76, 69, 96, 73, 77, 84, 88,
+  74, 82, 91, 73, 99, 74, 89, 123, 73, 73,
+  84, 76, 79, 98, 91, 92, 79, 79, 73, 83,
+  60, 79, 88, 85, 80, 84, 82, 92, 97, 90,
+  76, 85, 88, 91, 86, 77, 82, 87, 98, 83,
+  68, 70, 89, 84, 94, 85, 82, 102, 81, 83,
+  78, 75, 63, 86, 70, 87, 85, 94, 81, 83,
+  71, 78, 90, 80, 85, 88, 96, 84, 89, 90,
+  92, 89, 98, 87, 76, 91, 86, 83, 87, 81,
+  96, 71, 103, 92, 79, 90, 79, 88, 90, 75,
+  89, 77, 78, 86, 88, 88, 87, 93, 80, 82,
+  77, 92, 74, 76, 94, 80, 85, 73, 65, 90,
+  85, 86, 75, 94, 80, 75, 68, 75, 91, 68,
+  93, 89, 74, 87, 85, 88, 86, 69, 91, 80,
+  93, 75, 100, 76, 95, 94, 83, 81, 78, 69,
+  77, 82, 85, 92, 101, 81, 87, 83, 71, 83,
+  76, 79, 84, 91, 88, 80, 87, 94, 88, 77,
+  87, 91, 89, 90, 83, 91, 90, 90, 40, 86,
+  77, 85, 75, 69, 65, 72, 92, 82, 108, 65,
+  56, 94, 73, 90, 82, 75, 74, 80, 100, 90,
+  59, 74, 70, 79, 85, 82, 100, 79, 78, 94,
+  100, 72, 92, 81, 73, 83, 105, 70, 87, 72,
+  74, 92, 55, 81, 79, 92, 83, 80, 90, 97,
+  84, 99, 72, 84, 99, 78, 88, 65, 68, 126,
+  82, 86, 63, 123, 87, 75, 94, 65, 69, 58,
+  93, 99, 68, 64, 54, 80, 97, 68, 81, 86,
+  69, 111, 76, 81, 91, 85, 85, 96, 107, 81,
+  79, 62, 100, 128, 74, 60, 94, 74, 85, 82,
+  86, 87, 81, 66, 90, 90, 71, 70, 76, 77,
+  73, 68, 75, 94, 70, 75, 69, 84, 84, 100,
+  80, 78, 88, 84, 101, 95, 32, 84, 90, 70,
+  103, 32, 67, 62, 85, 78, 142, 73, 79, 102,
+  66, 77, 76, 54, 70, 70, 82, 99, 43, 69,
+  77, 70, 58, 73, 102, 92, 98, 104, 87, 70,
+  84, 110, 68, 81, 125, 82, 103, 74, 93, 97,
+  52, 61, 85, 105, 74, 87, 87, 117, 81, 118,
+  63, 94, 73, 70, 115, 56, 61, 136, 70, 100,
+  40, 170, 86, 72, 92, 45, 82, 62, 80, 96,
+  74, 54, 41, 100, 104, 78, 81, 74, 55, 95,
+  87, 85, 63, 117, 74, 75, 83, 75, 92, 56,
+  72, 155, 67, 51, 101, 86, 76, 98, 95, 86,
+  63, 65, 73, 95, 53, 70, 81, 80, 60, 65,
+  85, 106, 92, 78, 88, 89, 88, 101, 77, 68,
+  93, 73, 109, 93, 56, 60, 85, 93, 81, 69,
+  69, 96, 84, 84, 95, 61, 50, 82, 66, 97,
+  84, 99, 81, 84, 75, 73, 80, 84, 81, 86,
+  100, 91, 83, 81, 79, 105, 103, 74, 82, 88,
+  75, 89, 75, 75, 82, 70, 89, 87, 66, 95,
+  82, 84, 90, 78, 86, 73, 87, 90, 85, 69,
+  97, 80, 83, 87, 73, 116, 87, 52, 77, 93,
+  77, 81, 91, 89, 75, 65, 91, 99, 79, 70,
+  51, 77, 87, 73, 90, 92, 75, 92, 77, 82,
+  80, 55, 87, 95, 96, 81, 69, 69, 108, 95,
+  83, 66, 75, 72, 83, 93, 85, 87, 95, 76,
+  91, 82, 79, 77, 60, 70, 80, 94, 71, 77,
+  85, 74, 68, 74, 99, 90, 96, 91, 90, 81,
+  90, 104, 61, 81, 80, 91, 79, 77, 78, 79,
+  79, 90, 92, 81, 60, 100, 77, 87, 89, 94,
+  71, 85, 91, 94, 75, 94, 88, 83, 100, 87,
+  87, 75, 87, 80, 103, 72, 95, 85, 73, 87,
+  69, 76, 81, 75, 83, 85, 66, 87, 89, 97,
+  84, 78, 93, 85, 88, 79, 79, 79, 105, 81,
+  79, 71, 80, 96, 67, 88, 82, 92, 77, 94,
+  104, 80, 78, 66, 88, 92, 86, 72, 69, 85,
+  106, 64, 82, 94, 75, 113, 102, 76, 102, 86,
+  96, 108, 97, 83, 86, 65, 104, 91, 82, 69,
+  99, 71, 79, 85, 87, 90, 87, 74, 92, 84,
+  82, 71, 67, 78, 76, 82, 80, 91, 69, 85,
+  75, 72, 93, 90, 85, 81, 79, 89, 91, 87,
+  52, 83, 89, 84, 86, 54, 80, 72, 79, 84,
+  115, 87, 62, 88, 72, 75, 80, 74, 68, 80,
+  75, 84, 60, 92, 89, 71, 84, 80, 84, 92,
+  85, 92, 103, 71, 94, 104, 69, 78, 110, 70,
+  104, 84, 85, 82, 64, 59, 97, 99, 79, 88,
+  93, 89, 83, 87, 82, 85, 95, 75, 86, 66,
+  77, 100, 54, 91, 65, 119, 75, 92, 109, 68,
+  77, 74, 87, 86, 88, 66, 66, 87, 105, 71,
+  83, 85, 65, 107, 98, 89, 79, 105, 83, 93,
+  97, 83, 91, 61, 88, 108, 75, 66, 97, 82,
+  82, 84, 87, 88, 71, 78, 75, 85, 69, 70,
+  60, 83, 62, 79, 84, 84, 92, 83, 85, 80,
+  101, 89, 78, 72, 84, 84, 93, 92, 67, 73,
+  89, 86, 79, 88, 86, 88, 79, 88, 82, 77,
+  64, 86, 79, 89, 86, 110, 72, 83, 79, 79,
+  79, 99, 92, 87, 106, 87, 78, 82, 92, 83,
+  99, 76, 91, 88, 81, 86, 95, 76, 83, 83,
+  89, 89, 70, 81, 88, 91, 88, 74, 96, 86,
+  87, 79, 79, 80, 102, 89, 87, 84, 81, 91,
+  68, 71, 85, 87, 66, 91, 94, 96, 73, 77,
+  82, 96, 91, 72, 67, 72, 92, 73, 90, 99,
+  76, 91, 101, 78, 86, 65, 96, 97, 87, 86,
+  86, 67, 92, 80, 84, 80, 88, 68, 76, 95,
+  86, 90, 90, 84, 91, 81, 80, 87, 68, 71,
+  80, 95, 80, 93, 82, 90, 87, 74, 98, 89,
+  82, 85, 79, 83, 86, 91, 90, 84, 87, 82,
+  82, 89, 82, 73, 86, 100, 79, 89, 95, 91,
+  84, 80, 71, 93, 63, 84, 89, 79, 91, 85,
+  92, 78, 93, 74, 94, 92, 80, 82, 78, 92,
+  94, 84, 85, 81, 84, 91, 80, 87, 95, 79,
+  77, 91, 89, 82, 89, 91, 85, 96, 95, 63,
+  87, 85, 77, 73, 68, 87, 83, 83, 76, 82,
+  78, 88, 82, 82, 81, 95, 80, 79, 84, 87,
+  92, 80, 83, 81, 88, 73, 85, 82, 70, 73,
+  80, 101, 93, 91, 88, 68, 74, 81, 87, 89,
+  81, 82, 77, 86, 75, 56, 87, 81, 81, 72,
+  93, 87, 96, 85, 82, 101, 93, 86, 75, 85,
+  90, 78, 88, 91, 83, 71, 78, 91, 58, 74,
+  93, 100, 69, 90, 92, 86, 80, 78, 83, 87,
+  84, 68, 75, 105, 78, 87, 96, 86, 84, 79,
+  68, 89, 59, 87, 96, 73, 93, 88, 81, 77,
+  90, 78, 84, 92, 77, 83, 77, 92, 95, 81,
+  93, 85, 86, 95, 83, 87, 89, 81, 82, 92,
+  87, 77, 84, 89, 88, 92, 95, 64, 88, 88,
+  74, 71, 64, 86, 89, 87, 79, 84, 73, 90,
+  76, 80, 84, 90, 81, 76, 80, 84, 97, 75,
+  86, 84, 89, 74, 86, 80, 63, 73, 76, 101,
+  90, 85, 89, 65, 63, 83, 85, 84, 82, 82,
+  70, 87, 82, 60, 85, 86, 79, 75, 88, 81,
+  92, 88, 82, 104, 92, 84, 69, 85, 84, 80,
+  88, 92, 83, 69, 74, 91, 51, 75, 94, 96,
+  69, 93, 85, 86, 78, 77, 86, 86, 83, 77,
+  82, 95, 82, 91, 92, 82, 83, 87, 75, 89,
+  64, 84, 94, 77, 91, 87, 82, 79, 94, 75,
+  85, 90, 81, 81, 78, 87, 96, 80, 92, 82,
+  91, 100, 84, 82, 86, 79, 79, 91, 85, 80,
+  88, 88, 87, 89, 93, 65, 86, 94, 73, 75,
+  69, 89, 89, 84, 77, 80, 77, 84, 81, 84,
+  89, 84, 88, 76, 83, 87, 96, 81, 87, 90,
+  93, 76, 84, 82, 71, 84, 76, 100, 90, 86,
+  90, 75, 70, 89, 84, 87, 79, 78, 75, 86,
+  91, 66, 90, 84, 80, 75, 90, 84, 90, 87,
+  85, 98, 91, 84, 73, 92, 82, 76, 85, 86,
+  84, 73, 71, 90, 58, 79, 87, 95, 72, 91,
+  95, 76, 92, 82, 81, 81, 70, 85, 103, 91,
+  81, 85, 93, 83, 78, 90, 88, 83, 73, 79,
+  77, 76, 77, 81, 94, 77, 90, 72, 96, 80,
+  78, 84, 75, 85, 82, 76, 96, 65, 91, 78,
+  62, 75, 83, 79, 67, 94, 98, 86, 86, 93,
+  88, 93, 90, 72, 84, 83, 76, 79, 72, 94,
+  88, 75, 62, 85, 72, 80, 87, 80, 93, 81,
+  79, 78, 85, 87, 87, 71, 81, 80, 85, 75,
+  95, 77, 92, 78, 79, 100, 96, 90, 86, 73,
+  73, 88, 67, 83, 86, 77, 65, 85, 78, 64,
+  86, 86, 85, 74, 97, 108, 83, 79, 59, 93,
+  79, 87, 83, 88, 85, 83, 84, 81, 86, 70,
+  80, 95, 65, 73, 86, 98, 68, 84, 100, 76,
+  87, 85, 80, 81, 68, 86, 97, 89, 82, 83,
+  93, 85, 76, 94, 85, 75, 76, 84, 80, 71,
+  80, 84, 84, 73, 88, 73, 81, 82, 75, 86,
+  84, 82, 81, 80, 95, 63, 87, 73, 57, 75,
+  78, 76, 70, 96, 99, 84, 85, 92, 85, 89,
+  88, 71, 86, 80, 76, 73, 68, 97, 89, 80,
+  65, 88, 67, 80, 83, 81, 99, 78, 75, 77,
+  85, 82, 93, 67, 81, 87, 83, 75, 94, 73,
+  96, 86, 73, 95, 92, 84, 81, 70, 68, 85,
+  62, 81, 84, 74, 64, 82, 85, 68, 90, 87,
+  88, 76, 98, 108, 80, 84, 56, 91, 75, 83,
+  85, 88, 80, 85, 86, 80, 85, 67, 72, 88,
+  64, 77, 82, 96, 67, 91, 91, 81, 89, 84,
+  80, 80, 72, 89, 97, 87, 83, 87, 89, 91,
+  76, 93, 86, 79, 83, 81, 86, 79, 82, 84,
+  83, 79, 92, 73, 85, 83, 82, 82, 78, 79,
+  87, 83, 101, 68, 88, 83, 66, 72, 79, 80,
+  68, 90, 92, 80, 88, 89, 90, 94, 87, 74,
+  87, 85, 78, 78, 74, 95, 88, 79, 62, 83,
+  73, 78, 86, 84, 99, 85, 83, 76, 81, 83,
+  92, 77, 84, 89, 85, 75, 94, 80, 95, 96,
+  76, 92, 91, 85, 86, 76, 72, 87, 66, 83,
+  82, 77, 69, 83, 88, 70, 89, 86, 83, 76,
+  100, 107, 84, 82, 64, 85, 79, 87, 84, 94,
+  86, 84, 82, 78, 86, 72, 72, 91, 72, 74,
+  82, 93, 73, 87, 77, 83, 99, 81, 88, 90,
+  77, 93, 110, 77, 95, 93, 86, 84, 74, 85,
+  100, 81, 94, 86, 80, 72, 66, 78, 91, 84,
+  87, 74, 84, 81, 88, 83, 73, 76, 71, 79,
+  93, 72, 94, 70, 78, 63, 93, 82, 65, 90,
+  85, 88, 106, 83, 97, 94, 78, 100, 95, 87,
+  87, 82, 98, 85, 87, 84, 69, 87, 80, 71,
+  98, 95, 101, 85, 71, 91, 76, 80, 94, 75,
+  79, 88, 96, 68, 94, 88, 111, 100, 86, 97,
+  94, 92, 86, 82, 85, 92, 64, 90, 87, 88,
+  87, 86, 87, 103, 86, 68, 82, 83, 130, 112,
+  74, 82, 60, 58, 74, 80, 116, 98, 95, 78,
+  79, 68, 80, 81, 83, 87, 82, 71, 78, 99,
+  94, 69, 76, 83, 87, 85, 88, 83, 77, 93,
+  103, 80, 98, 92, 83, 89, 69, 80, 98, 76,
+  102, 96, 83, 70, 74, 81, 87, 82, 79, 73,
+  60, 77, 87, 81, 75, 79, 75, 82, 93, 76,
+  90, 65, 82, 68, 87, 80, 71, 87, 78, 97,
+  106, 79, 93, 94, 75, 104, 96, 91, 92, 76,
+  97, 90, 82, 90, 68, 92, 80, 73, 94, 102,
+  105, 80, 72, 94, 74, 70, 109, 78, 76, 93,
+  96, 68, 89, 82, 105, 98, 92, 92, 97, 91,
+  82, 80, 84, 90, 61, 96, 89, 87, 89, 81,
+  90, 119, 88, 68, 90, 87, 138, 115, 69, 89,
+  61, 55, 71, 82, 130, 93, 92, 76, 72, 68,
+  84, 78, 79, 76, 79, 80, 75, 99, 104, 71,
+  80, 83, 82, 87, 90, 72, 81, 100, 112, 79,
+  100, 89, 85, 92, 74, 86, 102, 77, 102, 86,
+  91, 73, 79, 81, 87, 88, 86, 76, 75, 75,
+  89, 78, 77, 74, 85, 85, 94, 73, 83, 72,
+  83, 65, 83, 85, 69, 86, 84, 98, 103, 84,
+  97, 94, 77, 101, 95, 88, 86, 83, 92, 85,
+  86, 84, 67, 88, 81, 70, 103, 93, 99, 84,
+  83, 88, 73, 77, 98, 78, 79, 95, 101, 71,
+  92, 89, 108, 93, 86, 90, 98, 92, 85, 81,
+  91, 90, 63, 89, 84, 92, 89, 86, 88, 108,
+  90, 72, 77, 84, 132, 105, 76, 85, 66, 54,
+  74, 82, 115, 90, 91, 80, 73, 71, 84, 78,
+  80, 84, 90, 70, 77, 96, 93, 78, 85, 75,
+  78, 86, 139, 84, 71, 79, 73, 81, 78, 91,
+  74, 106, 77, 77, 76, 77, 85, 80, 82, 87,
+  100, 73, 88, 75, 88, 86, 94, 94, 77, 91,
+  77, 95, 88, 85, 81, 85, 89, 77, 83, 82,
+  86, 89, 76, 83, 78, 85, 79, 84, 80, 77,
+  78, 77, 87, 95, 70, 75, 91, 74, 83, 79,
+  94, 69, 91, 76, 88, 78, 86, 99, 67, 85,
+  93, 91, 76, 74, 80, 88, 72, 76, 80, 89,
+  80, 83, 57, 79, 86, 91, 74, 95, 76, 76,
+  88, 81, 93, 78, 90, 92, 79, 81, 82, 78,
+  82, 82, 83, 77, 81, 103, 80, 74, 85, 78,
+  75, 76, 96, 86, 91, 91, 84, 82, 89, 92,
+  79, 72, 97, 82, 85, 88, 83, 79, 66, 86,
+  164, 75, 66, 81, 68, 77, 82, 107, 84, 103,
+  78, 79, 77, 76, 87, 82, 84, 81, 80, 75,
+  87, 74, 90, 84, 89, 91, 84, 99, 81, 98,
+  95, 93, 86, 76, 99, 82, 84, 79, 82, 107,
+  86, 78, 86, 73, 72, 85, 79, 86, 78, 83,
+  77, 93, 66, 80, 103, 70, 88, 71, 101, 72,
+  87, 76, 89, 77, 88, 94, 77, 84, 91, 87,
+  80, 65, 85, 83, 83, 78, 82, 93, 78, 79,
+  54, 82, 86, 91, 84, 104, 73, 85, 94, 80,
+  89, 83, 94, 100, 79, 78, 88, 90, 80, 83,
+  84, 80, 75, 108, 85, 82, 82, 78, 73, 81,
+  105, 76, 75, 87, 78, 85, 95, 99, 74, 71,
+  106, 80, 83, 89, 83, 86, 77, 85, 116, 91,
+  74, 82, 78, 78, 83, 89, 83, 88, 74, 80,
+  80, 81, 87, 78, 86, 82, 78, 76, 81, 76,
+  88, 84, 92, 82, 78, 91, 77, 78, 95, 95,
+  82, 86, 89, 80, 86, 84, 80, 85, 83, 85,
+  79, 91, 80, 85, 82, 78, 82, 77, 85, 86,
+  77, 71, 88, 80, 85, 81, 88, 74, 81, 80,
+  73, 78, 81, 89, 94, 89, 99, 90, 79, 78,
+  82, 89, 79, 76, 80, 85, 86, 79, 63, 76,
+  78, 84, 76, 95, 79, 89, 86, 81, 89, 80,
+  87, 91, 81, 83, 80, 95, 79, 84, 82, 76,
+  80, 93, 79, 77, 77, 74, 73, 88, 92, 83,
+  86, 89, 83, 81, 95, 88, 83, 77, 90, 82,
+  85, 86, 79, 79, 74, 80, 172, 87, 63, 81,
+  80, 74, 75, 93, 85, 100, 78, 76, 87, 70,
+  82, 75, 81, 87, 83, 78, 86, 74, 73, 76,
+  98, 90, 75, 88, 78, 107, 81, 81, 73, 82,
+  98, 82, 85, 81, 87, 99, 86, 84, 86, 85,
+  72, 79, 84, 84, 81, 82, 77, 96, 64, 79,
+  103, 69, 74, 73, 88, 67, 85, 81, 81, 76,
+  91, 76, 69, 72, 83, 87, 75, 71, 77, 92,
+  75, 75, 91, 83, 76, 82, 56, 80, 85, 95,
+  76, 89, 71, 79, 98, 74, 94, 81, 84, 100,
+  82, 88, 90, 86, 80, 78, 82, 80, 85, 103,
+  73, 79, 80, 83, 70, 82, 112, 65, 79, 87,
+  80, 83, 90, 80, 72, 65, 102, 80, 84, 75,
+  71, 82, 72, 76, 199, 74, 55, 83, 77, 73,
+  81, 106, 101, 108, 81, 78, 89, 71, 84, 83,
+  86, 88, 78, 81, 85, 70, 72, 77, 95, 89,
+  86, 93, 77, 109, 81, 90, 80, 80, 118, 89,
+  87, 85, 81, 122, 100, 74, 91, 72, 71, 74,
+  79, 90, 80, 87, 69, 97, 69, 83, 112, 63,
+  75, 66, 91, 71, 69, 86, 85, 71, 93, 75,
+  61, 67, 83, 84, 80, 63, 80, 92, 77, 84,
+  93, 86, 74, 80, 55, 86, 83, 93, 83, 93,
+  68, 80, 103, 75, 85, 85, 82, 115, 82, 84,
+  89, 80, 82, 80, 80, 78, 78, 105, 75, 86,
+  80, 81, 68, 81, 117, 60, 65, 81, 81, 83,
+  90, 88, 65, 72, 112, 78, 83, 75, 81, 84,
+  81, 83, 135, 87, 67, 80, 81, 74, 83, 87,
+  86, 90, 76, 77, 84, 74, 80, 80, 82, 84,
+  85, 81, 78, 75, 77, 73, 93, 82, 77, 85,
+  76, 81, 86, 97, 72, 86, 100, 81, 88, 81,
+  74, 88, 88, 79, 86, 84, 74, 86, 82, 85,
+  84, 87, 77, 89, 80, 78, 94, 78, 80, 77,
+  87, 73, 80, 83, 76, 74, 83, 83, 79, 80,
+  92, 86, 78, 76, 82, 94, 76, 79, 89, 80,
+  79, 82, 63, 85, 80, 96, 73, 87, 75, 82,
+  96, 82, 80, 83, 84, 96, 77, 85, 86, 87,
+  81, 82, 82, 82, 85, 91, 72, 78, 76, 81,
+  70, 86, 103, 74, 85, 85, 81, 82, 88, 79,
+  79, 72, 88, 85, 83, 74, 76, 82, 76, 83,
+  129, 84, 72, 82, 75, 75, 84, 90, 82, 89,
+  76, 76, 91, 82, 83, 73, 83, 76, 85, 82,
+  81, 80, 90, 79, 84, 77, 84, 83, 82, 105,
+  83, 80, 93, 85, 92, 75, 81, 82, 88, 78,
+  84, 93, 83, 85, 83, 81, 80, 91, 82, 82,
+  87, 89, 74, 67, 97, 80, 77, 87, 83, 76,
+  86, 78, 86, 85, 87, 85, 93, 81, 85, 85,
+  77, 81, 80, 92, 85, 74, 81, 93, 79, 78,
+  63, 85, 86, 93, 76, 88, 84, 83, 101, 82,
+  97, 85, 83, 87, 77, 82, 76, 93, 78, 78,
+  81, 86, 81, 93, 79, 74, 85, 76, 75, 84,
+  94, 89, 73, 83, 79, 85, 84, 83, 81, 72,
+  92, 80, 86, 90, 72, 85, 80, 86, 139, 75,
+  70, 80, 73, 73, 86, 99, 90, 94, 81, 81,
+  95, 81, 86, 85, 85, 73, 84, 80, 80, 80,
+  88, 77, 82, 90, 82, 91, 80, 102, 73, 84,
+  108, 89, 103, 79, 81, 80, 88, 90, 93, 82,
+  84, 74, 80, 78, 74, 91, 80, 84, 82, 89,
+  76, 72, 97, 80, 77, 80, 89, 78, 84, 75,
+  91, 80, 88, 93, 74, 76, 86, 81, 78, 72,
+  82, 84, 91, 74, 82, 99, 75, 79, 57, 89,
+  85, 87, 84, 84, 82, 86, 103, 84, 92, 86,
+  83, 94, 79, 76, 84, 87, 77, 79, 78, 82,
+  75, 94, 77, 80, 83, 74, 74, 83, 108, 79,
+  70, 80, 82, 86, 93, 85, 77, 74, 95, 84,
+  84, 91, 78, 81, 92, 88, 101, 89, 77, 77,
+  76, 75, 88, 86, 84, 96, 75, 80, 89, 83,
+  86, 79, 81, 74, 86, 86, 78, 80, 89, 76,
+  84, 87, 83, 87, 81, 81, 76, 94, 96, 84,
+  96, 76, 82, 83, 80, 72, 85, 88, 85, 87,
+  80, 86, 81, 92, 84, 83, 90, 84, 89, 66,
+  87, 88, 84, 80, 80, 78, 75, 78, 81, 84,
+  83, 85, 79, 86, 90, 86, 78, 85, 85, 88,
+  75, 73, 78, 92, 82, 82, 68, 93, 81, 91,
+  77, 86, 86, 79, 96, 86, 79, 85, 83, 85,
+  83, 81, 72, 89, 77, 80, 84, 87, 79, 86,
+  81, 74, 87, 76, 78, 86, 84, 88, 91, 83,
+  83, 86, 91, 82, 86, 78, 82, 86, 89, 90,
+  97, 89, 68, 94, 98, 81, 70, 98, 74, 89,
+  102, 91, 100, 77, 76, 82, 84, 87, 99, 75,
+  83, 83, 83, 78, 72, 87, 88, 105, 97, 77,
+  91, 102, 68, 94, 73, 96, 94, 100, 88, 80,
+  90, 82, 74, 80, 78, 65, 72, 84, 81, 71,
+  72, 85, 71, 83, 92, 96, 74, 80, 77, 105,
+  79, 84, 80, 97, 78, 72, 70, 82, 70, 91,
+  95, 76, 76, 96, 71, 85, 89, 100, 94, 90,
+  84, 89, 62, 82, 85, 75, 87, 89, 79, 75,
+  81, 89, 79, 88, 98, 80, 96, 81, 74, 70,
+  73, 77, 86, 93, 86, 103, 71, 96, 68, 78,
+  78, 67, 81, 90, 87, 88, 79, 76, 82, 89,
+  98, 74, 82, 86, 81, 96, 98, 86, 93, 88,
+  81, 91, 92, 85, 74, 95, 70, 87, 107, 90,
+  106, 84, 82, 79, 91, 91, 107, 79, 73, 80,
+  90, 77, 74, 84, 82, 101, 82, 74, 98, 108,
+  69, 93, 68, 89, 86, 96, 83, 78, 90, 79,
+  84, 81, 77, 70, 70, 80, 77, 72, 73, 94,
+  72, 85, 87, 78, 73, 81, 66, 120, 80, 81,
+  81, 101, 68, 64, 72, 88, 66, 84, 75, 69,
+  68, 100, 72, 85, 93, 91, 87, 91, 81, 89,
+  66, 84, 87, 79, 88, 89, 67, 77, 77, 90,
+  76, 86, 93, 82, 95, 85, 68, 71, 77, 84,
+  84, 93, 79, 90, 75, 96, 72, 80, 84, 73,
+  80, 91, 87, 78, 76, 73, 83, 84, 90, 75,
+  80, 88, 80, 98, 97, 85, 86, 80, 86, 91,
+  91, 90, 72, 93, 72, 92, 97, 90, 95, 92,
+  71, 83, 81, 82, 94, 79, 69, 88, 90, 81,
+  73, 87, 85, 101, 94, 78, 96, 113, 75, 91,
+  73, 101, 107, 99, 85, 81, 90, 81, 85, 81,
+  79, 69, 76, 87, 82, 69, 71, 100, 77, 79,
+  87, 71, 83, 80, 73, 98, 80, 87, 90, 91,
+  78, 76, 64, 78, 79, 94, 68, 73, 79, 89,
+  75, 90, 83, 89, 90, 89, 84, 88, 72, 87,
+  88, 77, 85, 88, 81, 77, 80, 84, 75, 84,
+  92, 80, 94, 82, 75, 80, 78, 77, 87, 90,
+  81, 100, 71, 92, 68, 78, 82, 70, 80, 93,
+  90, 85, 81, 78, 86, 90, 88, 76, 82, 82,
+  83, 94, 97, 86, 83, 88, 89, 86, 81, 84,
+  72, 87, 86, 84, 81, 99, 87, 85, 71, 74,
+  79, 70, 70, 73, 79, 88, 86, 81, 83, 83,
+  84, 87, 101, 85, 82, 90, 79, 78, 79, 88,
+  98, 83, 84, 75, 69, 80, 86, 82, 70, 79,
+  75, 83, 89, 79, 80, 88, 86, 78, 104, 91,
+  91, 82, 111, 84, 69, 78, 61, 79, 72, 77,
+  62, 76, 92, 80, 86, 77, 78, 75, 72, 85,
+  76, 104, 98, 85, 84, 92, 70, 75, 82, 94,
+  85, 82, 81, 82, 83, 81, 108, 78, 91, 76,
+  90, 65, 89, 67, 85, 70, 69, 92, 80, 136,
+  76, 89, 80, 81, 81, 53, 68, 85, 106, 102,
+  64, 87, 78, 87, 82, 88, 90, 65, 91, 99,
+  81, 71, 77, 86, 96, 81, 78, 88, 74, 85,
+  85, 83, 79, 90, 92, 93, 75, 72, 77, 70,
+  67, 76, 81, 90, 86, 79, 79, 85, 85, 85,
+  86, 87, 90, 96, 81, 84, 74, 75, 94, 81,
+  84, 76, 73, 89, 85, 85, 72, 71, 78, 86,
+  87, 79, 80, 109, 87, 76, 98, 106, 90, 81,
+  106, 89, 68, 75, 59, 78, 81, 74, 63, 78,
+  89, 77, 96, 75, 71, 77, 73, 85, 80, 87,
+  103, 86, 80, 91, 75, 75, 82, 103, 81, 86,
+  86, 78, 86, 79, 106, 78, 83, 79, 86, 69,
+  89, 69, 90, 73, 65, 93, 87, 138, 71, 90,
+  82, 78, 85, 60, 68, 80, 106, 91, 73, 84,
+  82, 95, 79, 88, 90, 60, 90, 98, 79, 69,
+  78, 85, 81, 86, 83, 86, 73, 80, 84, 88,
+  81, 88, 89, 87, 73, 72, 77, 71, 70, 75,
+  84, 81, 88, 88, 78, 88, 84, 88, 91, 85,
+  88, 93, 75, 84, 70, 84, 106, 84, 76, 75,
+  70, 84, 81, 80, 73, 67, 83, 101, 89, 79,
+  81, 84, 89, 80, 96, 90, 97, 81, 104, 83,
+  72, 83, 68, 80, 70, 74, 69, 77, 83, 80,
+  76, 76, 80, 75, 77, 88, 76, 81, 97, 85,
+  87, 87, 74, 87, 85, 99, 79, 79, 80, 82,
+  81, 79, 100, 80, 88, 80, 88, 72, 89, 71,
+  81, 72, 75, 90, 81, 127, 73, 83, 87, 77,
+  72, 60, 71, 87, 83, 91, 85, 89, 83, 84,
+  80, 83, 93, 71, 90, 90, 80, 79, 76, 86,
+  94, 82, 79, 90, 75, 76, 86, 85, 73, 80,
+  91, 92, 83, 81, 83, 85, 55, 75, 96, 88,
+  80, 89, 86, 91, 83, 82, 89, 84, 95, 76,
+  97, 79, 91, 88, 87, 80, 82, 83, 73, 78,
+  97, 87, 83, 88, 88, 87, 88, 92, 75, 94,
+  88, 82, 107, 70, 91, 72, 100, 87, 78, 101,
+  84, 75, 86, 76, 90, 84, 90, 81, 77, 76,
+  91, 77, 75, 85, 67, 88, 78, 79, 86, 79,
+  89, 82, 82, 82, 81, 72, 77, 90, 84, 89,
+  106, 85, 80, 88, 75, 74, 96, 79, 75, 85,
+  79, 92, 81, 106, 90, 87, 84, 76, 76, 79,
+  76, 85, 85, 87, 80, 92, 92, 91, 80, 80,
+  97, 67, 93, 86, 78, 86, 73, 87, 85, 81,
+  80, 78, 74, 77, 89, 88, 77, 75, 99, 88,
+  84, 85, 86, 86, 53, 76, 104, 82, 84, 90,
+  86, 91, 82, 81, 89, 87, 98, 73, 98, 76,
+  87, 78, 84, 87, 93, 80, 75, 80, 100, 91,
+  83, 94, 87, 86, 84, 91, 74, 90, 91, 82,
+  104, 81, 95, 70, 97, 90, 79, 102, 86, 77,
+  79, 77, 91, 88, 83, 81, 83, 72, 90, 80,
+  71, 79, 71, 81, 73, 81, 82, 77, 92, 87,
+  81, 86, 79, 73, 72, 89, 85, 86, 96, 86,
+  79, 86, 75, 77, 100, 81, 75, 81, 80, 94,
+  76, 93, 84, 87, 88, 73, 75, 82, 79, 76,
+  83, 86, 84, 90, 95, 96, 77, 81, 101, 67,
+  91, 83, 80, 86, 84, 84, 82, 84, 80, 72,
+  77, 71, 87, 87, 77, 81, 95, 82, 81, 82,
+  77, 84, 63, 77, 98, 82, 95, 89, 81, 89,
+  82, 82, 88, 89, 89, 71, 96, 79, 86, 85,
+  89, 80, 91, 81, 75, 77, 89, 90, 86, 84,
+  92, 90, 87, 90, 79, 81, 88, 87, 100, 84,
+  88, 78, 98, 86, 78, 94, 85, 77, 87, 82,
+  91, 82, 80, 86, 87, 80, 88, 76, 75, 82,
+  71, 85, 74, 77, 89, 78, 91, 93, 85, 86,
+  80, 73, 80, 84, 87, 81, 106, 86, 79, 92,
+  77, 77, 100, 75, 82, 74, 84, 89, 77, 100,
+  90, 83, 83, 74, 76, 78, 74, 80, 81, 85,
+  98, 89, 88, 83, 78, 82, 96, 72, 92, 83,
+  76, 87, 93, 83, 77, 95, 81, 91, 86, 78,
+  73, 105, 94, 85, 82, 81, 80, 80, 91, 90,
+  74, 76, 80, 78, 84, 72, 85, 80, 88, 84,
+  93, 88, 78, 90, 96, 79, 72, 85, 72, 70,
+  82, 78, 82, 94, 73, 88, 78, 80, 68, 85,
+  78, 97, 77, 80, 80, 82, 95, 79, 77, 89,
+  78, 80, 84, 89, 79, 89, 84, 81, 67, 73,
+  89, 82, 79, 94, 82, 79, 80, 106, 83, 81,
+  90, 86, 69, 82, 87, 85, 83, 100, 91, 99,
+  84, 85, 79, 85, 110, 83, 71, 81, 92, 84,
+  74, 78, 75, 74, 73, 77, 84, 84, 86, 86,
+  89, 102, 85, 88, 82, 80, 78, 78, 91, 81,
+  71, 81, 96, 80, 86, 74, 87, 99, 82, 91,
+  85, 85, 78, 88, 78, 90, 83, 82, 74, 115,
+  89, 80, 82, 81, 71, 80, 95, 83, 76, 78,
+  74, 76, 86, 75, 85, 74, 90, 86, 89, 83,
+  76, 87, 94, 81, 79, 84, 76, 72, 79, 83,
+  78, 94, 73, 86, 74, 70, 70, 87, 75, 99,
+  78, 79, 73, 79, 101, 79, 77, 86, 86, 86,
+  78, 88, 80, 86, 84, 75, 67, 83, 95, 77,
+  79, 95, 84, 77, 81, 107, 84, 84, 92, 87,
+  67, 78, 86, 90, 85, 100, 86, 105, 85, 89,
+  77, 90, 115, 79, 73, 71, 92, 78, 76, 79,
+  79, 81, 77, 76, 82, 87, 91, 88, 83, 100,
+  89, 88, 84, 87, 75, 81, 81, 83, 76, 76,
+  88, 81, 86, 74, 98, 95, 84, 96, 91, 85,
+  80, 92, 82, 82, 83, 81, 75, 100, 94, 83,
+  81, 78, 80, 79, 92, 91, 76, 79, 74, 81,
+  93, 75, 89, 81, 90, 87, 91, 80, 81, 93,
+  96, 87, 81, 76, 77, 75, 77, 79, 81, 94,
+  81, 92, 73, 80, 72, 87, 81, 93, 73, 76,
+  84, 83, 97, 74, 80, 84, 79, 84, 86, 87,
+  81, 89, 90, 79, 66, 77, 88, 81, 88, 89,
+  84, 79, 80, 99, 80, 90, 95, 86, 64, 87,
+  87, 93, 82, 94, 85, 93, 85, 90, 81, 83,
+  106, 88, 74, 81, 90, 85, 79, 79, 77, 85,
+  74, 78, 81, 84, 85, 86, 90, 101, 89, 89,
+  87, 93, 78, 77, 79, 84, 72, 82, 80, 85,
+  83, 77, 88, 92, 81, 87, 88, 80, 80, 83,
+  82, 86, 85, 81, 78, 119, 95, 85, 79, 80,
+  73, 80, 93, 92, 69, 83, 71, 87, 77, 75,
+  87, 76, 85, 84, 87, 84, 75, 85, 91, 77,
+  81, 88, 76, 78, 84, 69, 85, 100, 77, 83,
+  80, 81, 69, 82, 77, 105, 73, 78, 76, 85,
+  101, 85, 78, 97, 92, 78, 83, 88, 80, 89,
+  80, 85, 70, 84, 82, 81, 81, 101, 79, 85,
+  76, 114, 75, 86, 81, 80, 75, 76, 87, 91,
+  91, 85, 89, 96, 81, 79, 71, 90, 109, 77,
+  79, 81, 83, 87, 77, 81, 77, 74, 86, 75,
+  81, 94, 87, 84, 88, 108, 76, 84, 83, 82,
+  86, 79, 85, 77, 79, 80, 93, 82, 88, 81,
+  98, 78, 94, 88, 85, 79, 77, 73, 77, 82,
+  84, 85, 84, 140, 98, 86, 76, 82, 64, 77,
+  90, 77, 70, 86, 70, 99, 81, 82, 85, 69,
+  85, 86, 81, 83, 72, 80, 86, 83, 83, 93,
+  83, 82, 84, 69, 95, 114, 65, 76, 80, 70,
+  61, 84, 76, 126, 73, 83, 68, 80, 117, 85,
+  80, 99, 113, 87, 78, 90, 83, 91, 82, 85,
+  65, 98, 78, 80, 73, 125, 79, 79, 75, 127,
+  78, 84, 77, 83, 71, 71, 80, 92, 97, 79,
+  81, 109, 84, 80, 70, 86, 128, 66, 81, 75,
+  85, 82, 77, 83, 80, 86, 101, 76, 82, 102,
+  88, 86, 86, 109, 83, 78, 85, 85, 85, 88,
+  76, 77, 87, 78, 83, 90, 86, 84, 111, 74,
+  98, 101, 92, 84, 81, 82, 85, 75, 81, 84,
+  78, 111, 97, 83, 79, 81, 75, 78, 90, 95,
+  72, 83, 78, 86, 90, 79, 86, 77, 84, 88,
+  83, 86, 80, 87, 95, 85, 77, 85, 77, 78,
+  81, 69, 87, 98, 71, 87, 78, 82, 67, 90,
+  80, 100, 70, 78, 83, 83, 105, 81, 79, 94,
+  84, 80, 83, 84, 81, 88, 85, 86, 68, 83,
+  84, 82, 80, 98, 79, 84, 81, 105, 76, 89,
+  84, 82, 70, 81, 87, 97, 89, 82, 87, 93,
+  83, 85, 78, 86, 101, 83, 79, 85, 81, 90,
+  87, 83, 80, 87, 85, 78, 81, 90, 84, 85,
+  87, 102, 82, 84, 86, 94, 87, 81, 80, 79,
+  78, 80, 80, 83, 83, 79, 103, 76, 91, 84,
+  85, 81, 78, 84, 76, 91, 87, 84, 77, 103,
+  94, 82, 83, 83, 80, 76, 88, 96, 64, 79,
+  74, 76, 79, 74, 84, 80, 92, 84, 92, 83,
+  78, 90, 91, 72, 80, 89, 77, 79, 81, 76,
+  83, 99, 76, 82, 82, 79, 77, 94, 77, 102,
+  79, 73, 83, 86, 88, 84, 80, 83, 84, 75,
+  86, 93, 84, 86, 83, 89, 72, 78, 79, 84,
+  83, 96, 78, 97, 79, 103, 78, 85, 74, 86,
+  72, 83, 91, 80, 89, 84, 89, 87, 78, 83,
+  73, 99, 108, 82, 78, 87, 83, 90, 80, 79,
+  77, 81, 78, 76, 74, 85, 78, 83, 84, 99,
+  72, 93, 87, 81, 83, 84, 81, 84, 76, 74,
+  92, 81, 91, 79, 82, 81, 87, 87, 81, 78,
+  85, 79, 73, 80, 88, 86, 85, 112, 97, 85,
+  83, 79, 71, 76, 82, 89, 64, 80, 74, 83,
+  84, 79, 80, 76, 93, 84, 85, 82, 71, 87,
+  94, 73, 83, 86, 78, 82, 82, 74, 88, 98,
+  75, 81, 86, 72, 70, 86, 74, 110, 76, 74,
+  78, 84, 106, 85, 81, 83, 90, 76, 82, 100,
+  88, 87, 89, 91, 69, 76, 76, 90, 79, 103,
+  82, 94, 74, 106, 80, 86, 72, 87, 71, 75,
+  86, 85, 89, 80, 79, 93, 81, 81, 72, 90,
+  113, 74, 80, 87, 86, 86, 76, 84, 83, 80,
+  83, 78, 74, 83, 74, 84, 84, 96, 78, 89,
+  87, 82, 84, 85, 80, 80, 78, 78, 85, 79,
+  88, 82, 96, 81, 95, 93, 91, 80, 83, 84,
+  76, 74, 87, 85, 77, 97, 94, 81, 83, 80,
+  85, 74, 83, 99, 67, 82, 72, 77, 93, 75,
+  85, 80, 88, 88, 88, 82, 77, 91, 92, 82,
+  76, 81, 78, 79, 83, 76, 79, 92, 75, 84,
+  81, 76, 77, 85, 80, 99, 75, 69, 85, 85,
+  92, 83, 80, 83, 76, 80, 88, 93, 84, 87,
+  85, 93, 73, 78, 78, 85, 78, 96, 80, 95,
+  81, 95, 77, 95, 77, 87, 67, 86, 87, 98,
+  89, 88, 82, 88, 79, 84, 76, 92, 102, 88,
+  83, 91, 81, 93, 87, 81, 78, 81, 79, 81,
+  76, 83, 80, 84, 86, 96, 74, 91, 87, 90,
+  86, 85, 85, 87, 74, 74, 83, 83, 84, 75,
+  86, 82, 85, 87, 90, 89, 84, 101, 71, 72,
+  94, 76, 73, 92, 89, 81, 77, 61, 85, 79,
+  85, 82, 105, 89, 54, 86, 96, 99, 94, 86,
+  99, 97, 99, 82, 100, 93, 83, 78, 74, 93,
+  88, 77, 86, 79, 80, 77, 72, 89, 70, 90,
+  119, 87, 68, 88, 89, 83, 92, 93, 92, 77,
+  88, 91, 95, 72, 78, 74, 105, 81, 84, 61,
+  93, 74, 88, 99, 75, 93, 82, 69, 96, 86,
+  80, 76, 83, 78, 103, 85, 65, 69, 78, 81,
+  83, 80, 88, 72, 76, 79, 72, 90, 78, 68,
+  91, 78, 71, 74, 85, 75, 101, 67, 104, 71,
+  93, 76, 88, 89, 82, 84, 92, 85, 84, 75,
+  91, 69, 75, 67, 109, 89, 73, 75, 84, 86,
+  97, 100, 92, 85, 69, 102, 69, 72, 96, 75,
+  62, 83, 81, 63, 82, 77, 88, 75, 82, 76,
+  102, 83, 49, 74, 69, 112, 82, 83, 120, 95,
+  96, 81, 101, 96, 84, 80, 71, 78, 88, 79,
+  68, 70, 76, 86, 51, 78, 61, 91, 146, 78,
+  76, 82, 88, 81, 98, 90, 97, 84, 94, 92,
+  97, 66, 88, 72, 109, 94, 80, 64, 99, 67,
+  98, 105, 76, 87, 70, 62, 110, 85, 73, 76,
+  96, 77, 98, 69, 70, 82, 77, 75, 78, 65,
+  94, 76, 82, 72, 73, 101, 74, 64, 102, 77,
+  102, 79, 87, 76, 93, 71, 118, 82, 98, 78,
+  87, 84, 71, 92, 94, 76, 82, 71, 79, 73,
+  83, 55, 94, 78, 69, 76, 83, 85, 95, 95,
+  80, 88, 69, 100, 78, 95, 95, 77, 70, 96,
+  89, 82, 74, 90, 85, 77, 82, 76, 101, 77,
+  76, 83, 72, 102, 71, 92, 103, 98, 89, 78,
+  98, 91, 81, 94, 77, 82, 90, 77, 57, 79,
+  80, 78, 64, 83, 72, 83, 102, 71, 66, 88,
+  86, 76, 91, 96, 93, 86, 85, 94, 91, 72,
+  88, 77, 110, 86, 83, 68, 93, 80, 86, 85,
+  90, 84, 78, 76, 100, 90, 80, 86, 96, 79,
+  103, 85, 77, 99, 81, 79, 93, 75, 90, 84,
+  82, 75, 69, 92, 94, 75, 92, 80, 92, 78,
+  95, 81, 91, 66, 103, 71, 91, 74, 90, 84,
+  74, 88, 90, 94, 67, 73, 77, 77, 78, 72,
+  71, 87, 73, 78, 86, 81, 98, 98, 103, 79,
+  101, 93, 64, 76, 92, 79, 71, 85, 84, 88,
+  100, 84, 85, 67, 88, 75, 74, 79, 60, 98,
+  74, 97, 96, 92, 86, 86, 87, 84, 93, 96,
+  95, 85, 78, 85, 81, 86, 72, 78, 76, 85,
+  104, 85, 93, 101, 85, 88, 74, 86, 76, 84,
+  94, 80, 86, 61, 79, 82, 84, 86, 68, 83,
+  85, 73, 85, 70, 108, 77, 91, 88, 74, 90,
+  78, 79, 79, 85, 81, 95, 78, 85, 90, 88,
+  75, 70, 84, 81, 81, 78, 77, 71, 82, 72,
+  72, 112, 70, 79, 79, 91, 62, 81, 77, 78,
+  90, 70, 94, 98, 80, 88, 81, 82, 76, 70,
+  91, 79, 73, 88, 96, 87, 87, 65, 93, 81,
+  66, 86, 89, 81, 101, 85, 89, 98, 67, 85,
+  59, 71, 100, 76, 64, 72, 76, 70, 83, 70,
+  87, 69, 78, 63, 67, 82, 81, 78, 66, 110,
+  86, 101, 83, 83, 77, 77, 90, 92, 96, 79,
+  72, 69, 73, 102, 74, 68, 75, 91, 79, 76,
+  101, 97, 81, 91, 78, 80, 81, 64, 93, 81,
+  85, 68, 85, 77, 97, 97, 73, 81, 83, 79,
+  79, 64, 126, 88, 93, 81, 62, 84, 71, 80,
+  85, 93, 82, 88, 87, 82, 82, 82, 73, 78,
+  86, 83, 74, 70, 69, 75, 79, 76, 92, 137,
+  67, 83, 82, 91, 94, 91, 78, 98, 82, 76,
+  97, 104, 87, 92, 74, 78, 64, 73, 88, 71,
+  62, 95, 70, 110, 94, 62, 84, 71, 60, 90,
+  86, 77, 104, 87, 97, 101, 72, 96, 65, 86,
+  94, 79, 69, 85, 82, 91, 90, 73, 86, 71,
+  81, 67, 72, 76, 100, 91, 80, 97, 71, 92,
+  94, 82, 83, 79, 93, 96, 93, 87, 79, 81,
+  85, 87, 84, 79, 76, 87, 62, 86, 101, 96,
+  79, 95, 75, 91, 77, 78, 94, 84, 88, 89,
+  78, 86, 87, 83, 77, 80, 86, 78, 83, 75,
+  93, 83, 92, 79, 99, 89, 71, 83, 85, 84,
+  82, 86, 86, 81, 94, 88, 85, 88, 84, 80,
+  84, 75, 76, 74, 83, 73, 75, 107, 77, 81,
+  81, 90, 106, 79, 81, 93, 87, 69, 94, 96,
+  80, 82, 82, 77, 67, 74, 88, 86, 60, 78,
+  73, 86, 83, 66, 71, 81, 70, 86, 89, 74,
+  96, 87, 92, 79, 86, 92, 92, 70, 85, 88,
+  85, 86, 83, 94, 98, 82, 75, 63, 76, 71,
+  78, 82, 90, 91, 82, 89, 85, 87, 85, 76,
+  83, 88, 77, 84, 89, 83, 88, 86, 90, 78,
+  80, 86, 66, 97, 89, 93, 89, 92, 75, 93,
+  80, 97, 73, 86, 83, 81, 82, 83, 77, 90,
+  87, 89, 68, 89, 81, 74, 85, 83, 98, 89,
+  85, 86, 86, 86, 87, 86, 78, 92, 87, 96,
+  89, 86, 88, 91, 86, 79, 82, 83, 87, 90,
+  79, 86, 83, 76, 78, 96, 78, 94, 73, 81,
+  79, 83, 78, 91, 78, 68, 72, 98, 81, 90,
+  88, 78, 83, 86, 82, 77, 78, 79, 92, 91,
+  86, 89, 79, 83, 74, 85, 102, 85, 96, 73,
+  92, 84, 78, 88, 91, 83, 81, 88, 82, 79,
+  76, 80, 84, 82, 74, 63, 72, 73, 78, 83,
+  105, 80, 81, 79, 84, 97, 78, 72, 80, 82,
+  81, 88, 95, 82, 71, 79, 79, 78, 82, 81,
+  69, 92, 96, 94, 96, 80, 66, 90, 76, 91,
+  73, 77, 74, 81, 81, 78, 78, 86, 90, 87,
+  76, 85, 87, 69, 83, 75, 94, 92, 83, 87,
+  81, 79, 79, 93, 63, 87, 91, 93, 82, 80,
+  80, 84, 92, 85, 85, 89, 77, 90, 82, 85,
+  84, 81, 80, 102, 83, 101, 74, 79, 78, 79,
+  78, 103, 79, 73, 62, 92, 88, 94, 83, 69,
+  85, 95, 80, 79, 79, 88, 82, 102, 87, 99,
+  80, 76, 75, 91, 97, 83, 99, 71, 90, 91,
+  79, 88, 89, 89, 86, 86, 84, 85, 84, 94,
+  95, 77, 78, 68, 72, 70, 79, 79, 99, 93,
+  76, 82, 82, 84, 87, 75, 76, 93, 80, 90,
+  88, 83, 88, 86, 86, 84, 80, 86, 67, 92,
+  82, 93, 93, 83, 74, 88, 82, 101, 72, 85,
+  79, 83, 77, 74, 81, 91, 87, 90, 73, 94,
+  86, 73, 85, 85, 86, 91, 86, 87, 86, 89,
+  83, 90, 72, 90, 86, 91, 88, 83, 87, 91,
+  87, 91, 83, 87, 77, 89, 82, 82, 88, 78,
+  78, 96, 79, 87, 76, 86, 90, 80, 79, 91,
+  80, 68, 76, 98, 88, 88, 84, 77, 82, 86,
+  82, 87, 83, 78, 88, 91, 90, 94, 82, 85,
+  75, 86, 99, 79, 94, 74, 89, 76, 84, 79,
+  74, 89, 94, 82, 88, 74, 88, 83, 86, 73,
+  78, 74, 106, 99, 88, 74, 88, 84, 89, 76,
+  82, 92, 81, 69, 87, 77, 81, 81, 101, 82,
+  85, 94, 91, 72, 90, 72, 75, 104, 83, 80,
+  89, 81, 71, 90, 91, 93, 90, 81, 74, 92,
+  69, 83, 90, 85, 82, 84, 81, 92, 79, 88,
+  92, 97, 90, 73, 86, 76, 81, 86, 98, 80,
+  70, 95, 85, 85, 69, 92, 92, 89, 81, 72,
+  95, 90, 94, 70, 85, 59, 76, 90, 81, 81,
+  84, 95, 83, 76, 80, 85, 81, 88, 79, 85,
+  78, 73, 90, 87, 69, 79, 86, 77, 83, 72,
+  86, 83, 79, 78, 77, 80, 75, 76, 80, 85,
+  71, 84, 91, 87, 91, 78, 84, 78, 87, 71,
+  96, 74, 82, 76, 86, 85, 95, 84, 72, 72,
+  110, 93, 80, 76, 88, 87, 76, 89, 86, 90,
+  81, 65, 85, 83, 83, 86, 96, 87, 91, 86,
+  92, 68, 90, 79, 78, 113, 88, 77, 97, 88,
+  76, 87, 97, 96, 86, 90, 70, 91, 72, 88,
+  89, 84, 80, 89, 81, 98, 81, 90, 74, 108,
+  89, 80, 95, 77, 81, 91, 96, 63, 71, 87,
+  93, 83, 70, 98, 89, 88, 84, 78, 100, 96,
+  78, 69, 86, 69, 74, 75, 78, 87, 82, 96,
+  88, 73, 85, 91, 69, 88, 78, 87, 82, 76,
+  90, 88, 77, 73, 89, 78, 87, 79, 89, 83,
+  80, 90, 81, 88, 70, 77, 66, 84, 70, 88,
+  91, 92, 86, 80, 84, 83, 74, 81, 93, 76,
+  85, 77, 82, 86, 81, 84, 79, 77, 105, 99,
+  84, 77, 85, 88, 92, 77, 84, 94, 79, 76,
+  83, 77, 80, 87, 99, 83, 85, 88, 85, 82,
+  83, 76, 78, 100, 85, 83, 89, 79, 75, 83,
+  90, 88, 87, 80, 71, 94, 73, 81, 88, 85,
+  84, 84, 85, 91, 84, 93, 95, 95, 86, 77,
+  86, 76, 81, 88, 95, 73, 73, 88, 86, 86,
+  64, 86, 91, 92, 81, 88, 93, 99, 72, 71,
+  87, 65, 80, 79, 75, 87, 83, 93, 84, 79,
+  82, 82, 84, 85, 81, 86, 80, 75, 93, 88,
+  71, 74, 82, 78, 81, 85, 85, 89, 81, 81,
+  77, 82, 69, 78, 79, 84, 68, 79, 89, 91,
+  82, 83, 76, 78, 81, 92, 92, 93, 89, 68,
+  91, 87, 84, 84, 90, 65, 102, 88, 89, 71,
+  83, 81, 75, 70, 75, 88, 78, 77, 87, 83,
+  91, 76, 99, 75, 85, 92, 77, 93, 86, 89,
+  85, 74, 81, 81, 82, 89, 62, 82, 91, 91,
+  93, 84, 71, 83, 68, 88, 89, 85, 77, 83,
+  83, 89, 79, 87, 92, 89, 89, 76, 81, 77,
+  85, 80, 99, 86, 70, 101, 79, 82, 81, 91,
+  80, 85, 73, 69, 81, 92, 91, 69, 86, 80,
+  79, 117, 78, 89, 88, 94, 76, 91, 79, 89,
+  78, 89, 77, 82, 75, 83, 85, 78, 76, 86,
+  82, 74, 87, 69, 73, 81, 75, 83, 88, 76,
+  90, 77, 80, 98, 71, 79, 90, 82, 86, 88,
+  79, 74, 82, 67, 98, 92, 83, 62, 95, 86,
+  103, 90, 78, 62, 112, 71, 81, 74, 82, 84,
+  67, 79, 82, 92, 72, 72, 82, 88, 99, 86,
+  100, 81, 84, 76, 82, 96, 102, 91, 92, 68,
+  83, 74, 85, 97, 64, 85, 103, 94, 94, 94,
+  72, 77, 66, 88, 93, 83, 77, 92, 83, 93,
+  82, 86, 57, 94, 93, 82, 82, 66, 75, 85,
+  94, 72, 69, 91, 81, 87, 78, 103, 76, 87,
+  77, 78, 83, 109, 73, 63, 83, 85, 76, 80,
+  70, 108, 76, 96, 79, 95, 77, 102, 48, 78,
+  72, 81, 76, 84, 87, 75, 77, 78, 91, 71,
+  91, 69, 76, 86, 73, 90, 94, 80, 82, 79,
+  76, 100, 68, 78, 94, 87, 76, 89, 94, 89,
+  80, 74, 91, 85, 92, 72, 86, 83, 84, 87,
+  90, 68, 95, 88, 88, 82, 84, 86, 94, 72,
+  84, 89, 79, 81, 77, 86, 86, 83, 94, 76,
+  78, 82, 72, 107, 93, 86, 89, 75, 82, 85,
+  83, 84, 70, 81, 90, 92, 90, 86, 75, 85,
+  72, 85, 83, 85, 77, 82, 87, 88, 84, 90,
+  105, 85, 88, 79, 76, 94, 76, 82, 94, 84,
+  73, 88, 81, 84, 74, 85, 84, 86, 74, 98,
+  80, 109, 71, 75, 87, 84, 83, 95, 73, 89,
+  86, 96, 75, 91, 72, 86, 83, 77, 75, 83,
+  73, 85, 89, 80, 73, 81, 81, 71, 82, 83,
+  79, 86, 83, 80, 86, 80, 78, 79, 78, 93,
+  72, 78, 93, 87, 75, 83, 86, 102, 90, 101,
+  86, 89, 96, 78, 84, 91, 78, 93, 80, 97,
+  86, 88, 94, 94, 84, 91, 72, 64, 75, 80,
+  80, 92, 95, 82, 91, 84, 82, 71, 70, 100,
+  73, 102, 72, 82, 91, 69, 77, 94, 65, 77,
+  74, 76, 72, 85, 88, 75, 72, 74, 74, 83,
+  77, 81, 89, 84, 77, 73, 97, 71, 122, 63,
+  99, 88, 74, 115, 111, 77, 92, 110, 76, 92,
+  75, 85, 97, 75, 85, 76, 76, 81, 81, 93,
+  93, 100, 78, 86, 84, 147, 76, 87, 83, 79,
+  82, 78, 69, 70, 98, 93, 90, 83, 80, 99,
+  78, 93, 75, 84, 80, 68, 76, 86, 92, 85,
+  86, 79, 82, 76, 80, 69, 100, 98, 78, 73,
+  80, 75, 69, 81, 97, 97, 77, 88, 80, 102,
+  95, 83, 86, 91, 77, 92, 76, 87, 88, 84,
+  91, 91, 80, 83, 92, 60, 79, 82, 72, 97,
+  72, 81, 91, 86, 89, 77, 70, 86, 79, 114,
+  87, 80, 91, 69, 77, 85, 57, 73, 75, 79,
+  73, 89, 89, 78, 74, 69, 74, 83, 81, 76,
+  87, 91, 84, 70, 101, 59, 96, 57, 84, 82,
+  67, 112, 92, 77, 94, 113, 72, 94, 74, 91,
+  91, 82, 81, 74, 72, 99, 69, 105, 92, 98,
+  72, 92, 83, 136, 65, 94, 77, 71, 85, 79,
+  72, 77, 96, 88, 81, 83, 69, 95, 84, 86,
+  74, 86, 79, 65, 77, 82, 84, 87, 89, 78,
+  90, 72, 86, 70, 102, 102, 78, 75, 85, 75,
+  77, 76, 91, 98, 87, 69, 84, 91, 93, 82,
+  83, 93, 77, 90, 86, 92, 79, 88, 100, 92,
+  84, 96, 109, 64, 81, 81, 84, 91, 84, 82,
+  86, 83, 87, 76, 66, 85, 74, 100, 96, 81,
+  89, 72, 80, 95, 70, 75, 73, 78, 75, 89,
+  85, 76, 76, 78, 76, 83, 74, 82, 87, 88,
+  80, 79, 101, 74, 114, 67, 83, 85, 73, 121,
+  77, 75, 88, 113, 74, 89, 81, 85, 83, 76,
+  88, 76, 80, 102, 81, 101, 92, 104, 76, 83,
+  82, 132, 75, 82, 82, 83, 80, 78, 77, 65,
+  95, 82, 91, 85, 82, 98, 80, 95, 80, 81,
+  77, 66, 71, 83, 82, 88, 88, 75, 81, 77,
+  78, 76, 95, 92, 81, 83, 83, 79, 100, 62,
+  85, 49, 84, 68, 74, 66, 71, 55, 79, 87,
+  72, 91, 96, 81, 72, 71, 82, 86, 79, 82,
+  91, 76, 66, 65, 71, 83, 82, 82, 59, 88,
+  84, 75, 94, 105, 88, 132, 94, 72, 70, 62,
+  81, 62, 92, 71, 83, 82, 53, 67, 99, 79,
+  71, 77, 76, 83, 54, 70, 86, 129, 91, 68,
+  100, 87, 78, 87, 81, 88, 77, 73, 80, 111,
+  92, 94, 77, 93, 77, 92, 81, 67, 86, 74,
+  80, 92, 106, 74, 67, 119, 66, 92, 80, 85,
+  88, 72, 87, 72, 79, 71, 79, 97, 86, 84,
+  160, 92, 119, 75, 83, 86, 78, 84, 88, 85,
+  62, 86, 91, 96, 77, 111, 141, 77, 78, 66,
+  71, 63, 103, 73, 144, 57, 93, 92, 73, 58,
+  87, 86, 76, 64, 70, 39, 74, 88, 68, 100,
+  95, 81, 76, 71, 75, 79, 73, 83, 65, 80,
+  74, 73, 73, 84, 99, 95, 64, 82, 84, 73,
+  83, 105, 83, 123, 87, 76, 66, 70, 81, 65,
+  92, 82, 80, 92, 59, 68, 93, 74, 76, 80,
+  75, 86, 57, 69, 83, 109, 93, 73, 98, 85,
+  69, 90, 74, 83, 76, 70, 82, 105, 86, 90,
+  76, 88, 85, 75, 78, 69, 89, 70, 80, 81,
+  103, 74, 77, 110, 64, 86, 77, 94, 92, 72,
+  85, 69, 86, 77, 81, 90, 77, 91, 145, 91,
+  116, 77, 89, 84, 71, 84, 83, 89, 65, 66,
+  88, 95, 86, 106, 132, 77, 94, 65, 72, 67,
+  92, 78, 130, 62, 81, 93, 89, 68, 87, 89,
+  85, 96, 73, 70, 100, 85, 85, 88, 78, 90,
+  79, 69, 93, 94, 79, 84, 71, 85, 89, 78,
+  84, 82, 88, 88, 96, 91, 82, 93, 76, 93,
+  86, 87, 81, 86, 92, 80, 80, 86, 85, 96,
+  92, 82, 97, 79, 86, 86, 81, 87, 95, 87,
+  91, 81, 88, 87, 78, 86, 93, 61, 79, 78,
+  72, 84, 88, 86, 87, 86, 78, 89, 83, 87,
+  92, 76, 75, 76, 85, 84, 97, 79, 80, 72,
+  105, 77, 77, 93, 101, 95, 93, 87, 83, 88,
+  85, 75, 96, 89, 76, 78, 74, 87, 71, 91,
+  78, 86, 79, 88, 86, 78, 98, 67, 88, 88,
+  88, 72, 77, 88, 99, 88, 80, 79, 86, 84,
+  72, 89, 86, 72, 76, 66, 78, 67, 81, 74,
+  77, 65, 86, 89, 72, 81, 89, 89, 66, 74,
+  81, 88, 82, 80, 85, 93, 79, 75, 91, 83,
+  88, 95, 79, 93, 79, 90, 95, 93, 80, 119,
+  85, 76, 64, 69, 84, 69, 82, 88, 81, 81,
+  78, 74, 94, 80, 84, 84, 82, 84, 76, 76,
+  86, 97, 76, 78, 89, 88, 69, 88, 69, 71,
+  84, 72, 85, 99, 95, 80, 80, 90, 86, 89,
+  90, 61, 80, 87, 94, 85, 91, 69, 73, 101,
+  83, 96, 89, 65, 83, 81, 95, 75, 79, 73,
+  71, 79, 66, 78, 119, 88, 99, 90, 83, 77,
+  68, 89, 82, 87, 74, 97, 82, 103, 78, 82,
+  95, 83, 79, 65, 71, 65, 90, 91, 106, 70,
+  85, 84, 73, 68, 79, 80, 82, 75, 76, 55,
+  82, 92, 71, 87, 89, 88, 67, 76, 75, 82,
+  76, 82, 72, 95, 74, 77, 92, 80, 95, 104,
+  86, 86, 76, 83, 85, 89, 78, 108, 85, 80,
+  68, 71, 82, 69, 79, 82, 76, 90, 85, 74,
+  90, 80, 87, 86, 80, 81, 77, 77, 82, 87,
+  83, 81, 89, 86, 68, 91, 73, 70, 82, 76,
+  74, 96, 88, 80, 78, 88, 89, 77, 84, 64,
+  84, 83, 92, 75, 93, 73, 82, 99, 83, 90,
+  83, 72, 85, 84, 89, 75, 85, 76, 87, 76,
+  67, 78, 108, 85, 91, 86, 88, 77, 62, 89,
+  80, 85, 75, 75, 88, 99, 87, 79, 93, 88,
+  90, 67, 74, 70, 85, 98, 94, 74, 77, 81,
+  87, 71, 80, 82, 89, 98, 80, 79, 97, 84,
+  88, 84, 82, 94, 82, 78, 87, 88, 79, 89,
+  73, 89, 90, 83, 85, 83, 88, 85, 98, 90,
+  82, 93, 82, 87, 83, 81, 83, 89, 84, 79,
+  87, 91, 84, 90, 83, 85, 92, 81, 85, 91,
+  86, 89, 91, 80, 88, 84, 86, 84, 75, 87,
+  87, 62, 77, 83, 80, 86, 86, 84, 80, 79,
+  77, 83, 83, 80, 89, 76, 71, 79, 84, 86,
+  93, 81, 76, 71, 103, 81, 84, 90, 97, 82,
+  83, 93, 83, 84, 83, 80, 97, 86, 78, 87,
+  77, 82, 59, 90, 84, 85, 72, 86, 92, 81,
+  97, 65, 91, 89, 82, 66, 71, 86, 90, 78,
+  83, 81, 88, 85, 68, 87, 83, 84, 85, 72,
+  83, 87, 82, 92, 87, 84, 88, 90, 95, 86,
+  80, 84, 76, 74, 98, 90, 86, 91, 89, 99,
+  90, 87, 92, 70, 83, 88, 96, 102, 85, 103,
+  90, 74, 83, 84, 81, 76, 88, 67, 87, 92,
+  82, 89, 85, 88, 95, 82, 91, 86, 90, 90,
+  98, 89, 91, 84, 91, 87, 72, 88, 73, 79,
+  80, 83, 81, 90, 84, 84, 88, 72, 83, 75,
+  82, 81, 86, 82, 77, 74, 80, 91, 110, 81,
+  82, 67, 67, 81, 77, 104, 90, 68, 85, 95,
+  92, 88, 80, 84, 84, 83, 78, 81, 68, 81,
+  54, 93, 93, 78, 81, 91, 84, 85, 94, 83,
+  86, 96, 83, 59, 66, 82, 86, 80, 77, 70,
+  86, 101, 61, 96, 86, 87, 85, 72, 81, 89,
+  85, 95, 85, 86, 85, 92, 91, 85, 83, 81,
+  72, 78, 92, 87, 85, 86, 85, 98, 87, 88,
+  94, 70, 85, 91, 96, 96, 87, 97, 90, 75,
+  83, 81, 84, 77, 86, 67, 86, 90, 81, 85,
+  82, 86, 96, 83, 90, 88, 91, 88, 93, 90,
+  88, 85, 85, 85, 74, 88, 74, 78, 83, 84,
+  84, 86, 83, 83, 81, 73, 79, 76, 80, 77,
+  85, 81, 76, 75, 83, 89, 112, 81, 81, 69,
+  63, 81, 82, 102, 89, 75, 86, 96, 93, 86,
+  81, 83, 95, 84, 82, 78, 71, 81, 51, 90,
+  93, 79, 82, 90, 83, 82, 92, 80, 85, 93,
+  80, 60, 67, 85, 82, 82, 81, 76, 85, 111,
+  61, 92, 81, 81, 83, 69, 77, 89, 82, 88,
+  88, 89, 80, 83, 88, 81, 79, 87, 82, 83,
+  99, 84, 86, 86, 83, 87, 94, 89, 85, 81,
+  78, 88, 87, 96, 87, 97, 86, 91, 89, 87,
+  85, 84, 87, 77, 91, 97, 84, 86, 82, 86,
+  88, 84, 86, 84, 83, 87, 87, 80, 82, 94,
+  83, 89, 71, 92, 76, 77, 84, 84, 87, 95,
+  80, 84, 82, 71, 78, 75, 89, 69, 84, 78,
+  73, 81, 79, 83, 96, 78, 78, 60, 74, 86,
+  76, 100, 78, 79, 87, 90, 92, 90, 78, 82,
+  102, 87, 88, 85, 82, 78, 68, 88, 90, 86,
+  77, 87, 93, 85, 82, 72, 89, 86, 80, 66,
+  74, 82, 89, 82, 77, 66, 85, 90, 75, 90,
+  91, 80, 88, 91, 86, 85, 78, 79, 72, 90,
+  78, 83, 92, 81, 92, 81, 70, 98, 76, 80,
+  84, 70, 72, 83, 86, 108, 79, 83, 108, 85,
+  87, 80, 72, 108, 65, 83, 79, 81, 72, 94,
+  77, 80, 81, 88, 98, 60, 79, 87, 87, 73,
+  76, 75, 74, 95, 60, 80, 81, 82, 64, 91,
+  104, 85, 92, 104, 81, 101, 85, 85, 81, 77,
+  70, 69, 77, 80, 82, 72, 80, 78, 92, 95,
+  78, 102, 88, 78, 91, 85, 87, 109, 77, 101,
+  86, 81, 80, 61, 96, 86, 89, 98, 81, 88,
+  75, 76, 87, 81, 78, 83, 75, 94, 68, 83,
+  83, 87, 85, 80, 70, 69, 86, 92, 66, 90,
+  102, 84, 75, 90, 69, 89, 78, 67, 86, 90,
+  79, 82, 81, 78, 81, 74, 76, 86, 80, 89,
+  84, 72, 92, 78, 72, 94, 71, 79, 89, 71,
+  76, 86, 89, 106, 78, 81, 91, 79, 81, 83,
+  78, 90, 67, 88, 73, 78, 82, 93, 76, 79,
+  86, 96, 103, 67, 82, 76, 81, 77, 69, 69,
+  75, 91, 64, 73, 85, 77, 69, 83, 103, 86,
+  90, 96, 78, 100, 85, 86, 82, 71, 72, 67,
+  85, 82, 86, 69, 85, 83, 89, 91, 81, 97,
+  88, 78, 84, 81, 86, 97, 74, 105, 80, 77,
+  83, 59, 81, 86, 88, 102, 78, 83, 73, 76,
+  81, 83, 80, 83, 75, 94, 67, 85, 83, 90,
+  82, 84, 64, 67, 81, 87, 62, 87, 99, 81,
+  71, 88, 63, 89, 80, 68, 81, 88, 85, 84,
+  72, 77, 74, 81, 71, 87, 83, 84, 94, 81,
+  87, 91, 79, 99, 79, 93, 83, 79, 85, 89,
+  86, 104, 85, 85, 98, 71, 87, 90, 75, 88,
+  76, 88, 79, 81, 90, 96, 86, 75, 86, 93,
+  92, 69, 83, 78, 83, 83, 75, 77, 72, 84,
+  70, 78, 80, 85, 70, 97, 105, 79, 89, 99,
+  92, 95, 83, 88, 87, 89, 83, 71, 81, 82,
+  89, 73, 80, 91, 90, 96, 76, 91, 83, 81,
+  78, 80, 80, 93, 77, 99, 84, 81, 76, 66,
+  88, 84, 92, 101, 78, 92, 75, 82, 92, 80,
+  85, 85, 75, 93, 67, 84, 85, 88, 84, 86,
+  73, 73, 88, 90, 72, 87, 96, 92, 80, 92,
+  73, 87, 80, 71, 80, 75, 75, 87, 90, 85,
+  75, 75, 72, 88, 83, 79, 79, 80, 82, 88,
+  81, 90, 76, 86, 88, 74, 72, 87, 86, 89,
+  95, 83, 87, 83, 84, 85, 77, 105, 65, 82,
+  85, 86, 75, 83, 86, 74, 79, 87, 76, 77,
+  85, 82, 81, 79, 75, 67, 81, 88, 72, 100,
+  86, 85, 78, 91, 104, 78, 86, 87, 80, 88,
+  76, 86, 84, 82, 89, 76, 68, 69, 77, 76,
+  75, 75, 82, 81, 69, 89, 80, 80, 79, 87,
+  85, 85, 81, 101, 77, 74, 76, 72, 93, 78,
+  92, 90, 87, 86, 67, 85, 86, 80, 86, 82,
+  76, 86, 67, 84, 79, 94, 83, 80, 81, 74,
+  80, 93, 74, 79, 101, 84, 80, 84, 70, 93,
+  82, 70, 80, 83, 84, 81, 78, 83, 77, 72,
+  75, 89, 85, 86, 79, 83, 77, 89, 86, 89,
+  78, 91, 88, 83, 84, 92, 88, 81, 90, 82,
+  64, 75, 85, 89, 82, 94, 70, 87, 76, 86,
+  80, 79, 83, 74, 91, 94, 73, 84, 79, 77,
+  75, 83, 72, 75, 83, 87, 76, 84, 88, 84,
+  84, 83, 105, 83, 83, 83, 83, 85, 71, 89,
+  85, 83, 77, 73, 76, 69, 81, 76, 81, 84,
+  75, 77, 78, 80, 84, 72, 74, 88, 82, 80,
+  76, 97, 73, 70, 75, 68, 86, 72, 90, 88,
+  78, 86, 60, 77, 83, 81, 83, 85, 78, 82,
+  71, 82, 77, 93, 81, 80, 81, 79, 83, 90,
+  78, 81, 98, 83, 87, 82, 74, 90, 84, 74,
+  81, 81, 86, 84, 75, 82, 74, 72, 74, 87,
+  86, 86, 88, 93, 74, 91, 84, 91, 86, 93,
+  82, 91, 84, 95, 88, 86, 98, 86, 75, 73,
+  86, 98, 79, 93, 76, 74, 86, 85, 86, 83,
+  83, 73, 90, 92, 68, 89, 85, 85, 74, 89,
+  79, 87, 81, 88, 86, 76, 84, 85, 89, 91,
+  105, 79, 84, 91, 85, 83, 72, 85, 87, 94,
+  78, 76, 68, 70, 83, 78, 87, 95, 83, 83,
+  73, 81, 84, 76, 74, 89, 78, 80, 83, 94,
+  82, 73, 78, 70, 88, 73, 91, 87, 78, 95,
+  67, 77, 90, 81, 86, 92, 74, 81, 78, 87,
+  79, 92, 81, 84, 93, 87, 90, 90, 84, 80,
+  97, 90, 84, 87, 83, 87, 86, 83, 79, 86,
+  88, 88, 94, 84, 68, 68, 80, 82, 87, 80,
+  83, 95, 69, 90, 75, 82, 82, 96, 89, 91,
+  90, 100, 87, 77, 99, 78, 90, 81, 83, 96,
+  87, 104, 79, 99, 77, 89, 89, 71, 92, 83,
+  82, 87, 72, 96, 99, 88, 74, 93, 93, 85,
+  91, 88, 95, 92, 86, 83, 106, 91, 113, 78,
+  81, 80, 75, 81, 75, 82, 82, 95, 85, 89,
+  69, 70, 73, 82, 86, 92, 75, 78, 83, 79,
+  79, 82, 68, 97, 88, 68, 100, 98, 89, 77,
+  91, 74, 97, 75, 89, 90, 94, 86, 71, 85,
+  87, 82, 90, 81, 87, 73, 84, 96, 81, 95,
+  73, 84, 91, 95, 96, 92, 88, 77, 103, 86,
+  82, 87, 83, 91, 81, 92, 78, 89, 98, 83,
+  81, 93, 75, 66, 88, 82, 87, 84, 84, 94,
+  65, 87, 80, 83, 84, 100, 92, 102, 89, 100,
+  85, 75, 100, 78, 64, 81, 78, 101, 91, 94,
+  82, 93, 73, 89, 88, 65, 85, 83, 92, 96,
+  69, 111, 95, 91, 66, 96, 94, 94, 95, 83,
+  103, 97, 86, 86, 111, 86, 110, 80, 77, 80,
+  90, 83, 71, 80, 86, 96, 95, 84, 70, 69,
+  76, 80, 90, 96, 77, 77, 90, 75, 78, 82,
+  60, 101, 88, 68, 96, 87, 92, 77, 96, 68,
+  95, 68, 83, 87, 91, 88, 80, 88, 84, 83,
+  92, 79, 87, 72, 85, 97, 79, 93, 69, 87,
+  88, 91, 96, 91, 97, 83, 105, 90, 81, 82,
+  94, 90, 82, 98, 80, 88, 88, 89, 85, 95,
+  73, 62, 86, 77, 86, 84, 86, 93, 65, 92,
+  71, 81, 80, 101, 86, 107, 82, 104, 80, 72,
+  103, 83, 78, 82, 77, 101, 97, 99, 77, 81,
+  83, 89, 88, 71, 92, 84, 87, 87, 69, 111,
+  104, 99, 69, 103, 99, 88, 95, 86, 110, 97,
+  83, 84, 114, 91, 108, 83, 82, 89, 82, 87,
+  66, 79, 86, 85, 96, 87, 70, 71, 79, 85,
+  98, 96, 87, 80, 88, 77, 77, 87, 56, 106,
+  86, 61, 95, 89, 97, 83, 100, 70, 105, 70,
+  85, 83, 93, 90, 80, 93, 93, 82, 91, 83,
+  84, 68, 89, 98, 72, 95, 77, 91, 87, 94,
+  92, 89, 95, 84, 101, 88, 89, 87, 95, 86,
+  86, 103, 79, 86, 84, 72, 84, 87, 96, 72,
+  103, 75, 80, 85, 89, 94, 72, 88, 72, 78,
+  71, 78, 88, 89, 111, 70, 89, 89, 69, 68,
+  86, 86, 93, 88, 89, 80, 72, 104, 90, 72,
+  86, 72, 103, 78, 92, 85, 80, 94, 85, 90,
+  82, 90, 79, 74, 78, 85, 90, 88, 88, 73,
+  85, 82, 84, 85, 74, 74, 86, 71, 81, 89,
+  78, 88, 74, 82, 84, 74, 88, 81, 103, 92,
+  80, 66, 88, 87, 77, 75, 95, 85, 81, 82,
+  77, 91, 70, 85, 83, 84, 85, 113, 100, 90,
+  90, 79, 66, 77, 83, 80, 104, 77, 80, 88,
+  98, 66, 73, 79, 78, 91, 75, 94, 75, 79,
+  85, 106, 87, 71, 87, 91, 77, 86, 77, 80,
+  71, 90, 75, 51, 84, 85, 95, 66, 108, 70,
+  81, 85, 96, 86, 65, 89, 69, 90, 64, 76,
+  93, 91, 98, 61, 87, 73, 59, 48, 92, 85,
+  79, 109, 104, 81, 78, 76, 93, 68, 88, 67,
+  112, 64, 92, 81, 84, 109, 93, 84, 76, 91,
+  68, 84, 82, 93, 84, 82, 81, 75, 76, 92,
+  88, 89, 82, 73, 79, 69, 91, 90, 70, 90,
+  76, 71, 77, 74, 95, 68, 129, 90, 77, 65,
+  93, 83, 64, 73, 93, 71, 83, 88, 81, 96,
+  53, 95, 80, 84, 73, 115, 102, 81, 82, 87,
+  64, 87, 63, 82, 126, 63, 89, 83, 105, 56,
+  81, 75, 74, 84, 83, 94, 75, 95, 106, 104,
+  88, 61, 86, 90, 86, 90, 73, 88, 83, 86,
+  69, 63, 85, 102, 94, 69, 95, 76, 83, 85,
+  85, 84, 76, 88, 72, 81, 70, 76, 85, 87,
+  84, 71, 95, 84, 70, 67, 82, 82, 86, 107,
+  93, 96, 77, 75, 91, 71, 89, 74, 104, 74,
+  82, 82, 82, 102, 89, 92, 79, 90, 77, 72,
+  80, 89, 90, 70, 84, 74, 80, 85, 84, 88,
+  75, 75, 84, 68, 76, 87, 76, 78, 80, 81,
+  82, 74, 93, 82, 101, 90, 78, 70, 92, 85,
+  71, 90, 95, 81, 82, 88, 80, 98, 61, 98,
+  88, 85, 99, 111, 96, 88, 82, 77, 73, 82,
+  79, 80, 104, 77, 77, 84, 93, 72, 81, 78,
+  75, 89, 82, 95, 76, 85, 94, 102, 71, 71,
+  85, 91, 85, 86, 79, 82, 70, 82, 83, 69,
+  85, 83, 92, 71, 96, 67, 84, 74, 80, 90,
+  73, 88, 69, 80, 62, 85, 99, 86, 110, 76,
+  85, 88, 75, 52, 97, 85, 74, 83, 88, 75,
+  74, 109, 87, 89, 85, 64, 99, 78, 68, 81,
+  80, 101, 83, 88, 84, 77, 89, 82, 80, 93,
+  79, 92, 80, 78, 75, 100, 80, 82, 77, 71,
+  81, 64, 85, 88, 87, 73, 86, 80, 90, 74,
+  89, 84, 96, 90, 89, 80, 94, 85, 69, 76,
+  87, 81, 77, 84, 86, 87, 59, 73, 75, 78,
+  74, 96, 96, 96, 90, 86, 70, 92, 77, 80,
+  100, 93, 88, 77, 94, 66, 84, 84, 79, 86,
+  89, 80, 75, 86, 87, 106, 100, 62, 105, 86,
+  85, 83, 84, 87, 77, 95, 81, 53, 94, 78,
+  96, 68, 79, 67, 84, 68, 97, 93, 62, 97,
+  70, 77, 48, 84, 85, 102, 80, 73, 80, 83,
+  70, 36, 101, 91, 66, 117, 115, 83, 76, 78,
+  84, 97, 96, 63, 75, 79, 74, 72, 79, 101,
+  93, 94, 80, 75, 86, 80, 86, 113, 70, 87,
+  73, 87, 70, 114, 81, 84, 74, 73, 66, 66,
+  91, 80, 98, 68, 73, 75, 84, 64, 93, 70,
+  98, 91, 78, 99, 105, 93, 66, 78, 85, 74,
+  70, 90, 89, 85, 49, 66, 69, 84, 54, 81,
+  105, 88, 84, 95, 54, 87, 56, 88, 118, 89,
+  84, 68, 117, 50, 101, 74, 80, 70, 93, 75,
+  71, 104, 100, 93, 99, 48, 106, 85, 105, 76,
+  83, 109, 70, 100, 79, 62, 88, 102, 89, 65,
+  89, 72, 82, 73, 80, 88, 77, 87, 69, 79,
+  57, 83, 68, 91, 81, 74, 93, 86, 76, 52,
+  89, 83, 71, 111, 97, 87, 78, 71, 85, 88,
+  87, 65, 92, 81, 89, 75, 80, 102, 84, 82,
+  85, 75, 89, 79, 82, 96, 80, 81, 79, 82,
+  72, 100, 80, 90, 79, 74, 86, 64, 87, 87,
+  84, 73, 73, 86, 92, 74, 92, 83, 90, 93,
+  82, 87, 97, 89, 70, 99, 87, 85, 80, 92,
+  92, 90, 56, 82, 76, 78, 82, 91, 94, 92,
+  77, 80, 71, 81, 74, 84, 99, 96, 84, 75,
+  89, 69, 94, 85, 82, 80, 92, 83, 90, 88,
+  92, 99, 74, 65, 98, 88, 89, 82, 85, 91,
+  69, 77, 84, 85, 82, 83, 89, 68, 99, 73,
+  84, 75, 87, 93, 75, 87, 61, 81, 71, 85,
+  89, 88, 93, 79, 94, 88, 88, 67, 89, 89,
+  76, 80, 89, 77, 77, 105, 77, 93, 79, 73,
+  92, 90, 76, 81, 78, 95, 78, 84, 87, 77,
+  77, 83, 79, 96, 91, 83, 80, 76, 74, 93,
+  78, 82, 79, 81, 95, 68, 84, 92, 90, 84,
+  87, 89, 94, 78, 86, 96, 88, 87, 92, 82,
+  95, 80, 82, 85, 83, 90, 87, 90, 90, 83,
+  60, 77, 86, 74, 81, 89, 83, 100, 76, 85,
+  81, 97, 84, 79, 86, 94, 78, 84, 78, 82,
+  88, 82, 90, 86, 84, 82, 73, 74, 89, 87,
+  90, 79, 101, 88, 84, 74, 92, 90, 65, 86,
+  78, 74, 79, 81, 82, 68, 87, 71, 87, 70,
+  96, 89, 76, 96, 65, 80, 57, 81, 79, 94,
+  84, 80, 85, 86, 92, 46, 92, 87, 66, 98,
+  104, 77, 71, 93, 70, 103, 88, 74, 71, 92,
+  73, 71, 76, 96, 76, 91, 83, 80, 76, 82,
+  81, 109, 81, 84, 71, 82, 69, 98, 78, 81,
+  76, 75, 100, 66, 90, 83, 103, 87, 86, 85,
+  100, 78, 85, 88, 83, 92, 86, 95, 102, 79,
+  77, 88, 82, 90, 81, 94, 86, 76, 43, 80,
+  78, 71, 66, 74, 86, 102, 73, 91, 75, 100,
+  72, 82, 90, 97, 69, 68, 71, 76, 91, 77,
+  88, 80, 85, 79, 80, 72, 87, 81, 88, 72,
+  99, 86, 92, 62, 92, 100, 70, 92, 73, 77,
+  83, 88, 90, 67, 93, 72, 80, 79, 90, 82,
+  79, 87, 64, 81, 66, 82, 77, 85, 87, 81,
+  91, 87, 92, 62, 85, 86, 75, 95, 99, 85,
+  81, 78, 75, 95, 98, 73, 85, 93, 87, 77,
+  76, 93, 73, 80, 90, 76, 78, 84, 77, 102,
+  90, 86, 77, 82, 72, 93, 81, 81, 85, 82,
+  101, 68, 79, 89, 91, 91, 75, 96, 96, 82,
+  88, 93, 82, 92, 87, 85, 96, 80, 83, 92,
+  84, 98, 86, 96, 90, 78, 54, 83, 83, 75,
+  83, 82, 85, 99, 87, 84, 80, 86, 86, 81,
+  89, 95, 75, 81, 77, 79, 90, 81, 92, 85,
+  86, 87, 95, 73, 90, 86, 82, 83, 96, 90,
+  82, 71, 97, 92, 99, 85, 81, 83, 84, 88,
+  107, 96, 78, 79, 66, 88, 85, 88, 83, 85,
+  93, 90, 92, 80, 70, 82, 99, 91, 85, 85,
+  80, 65, 95, 85, 81, 84, 101, 83, 84, 87,
+  89, 77, 83, 84, 93, 78, 92, 84, 94, 94,
+  87, 80, 90, 84, 78, 90, 81, 76, 74, 81,
+  89, 88, 74, 84, 79, 83, 77, 94, 92, 81,
+  84, 78, 85, 75, 73, 75, 89, 94, 68, 93,
+  94, 73, 84, 86, 84, 87, 80, 75, 89, 84,
+  81, 77, 90, 81, 60, 81, 86, 102, 82, 86,
+  76, 87, 77, 64, 68, 85, 82, 81, 69, 86,
+  87, 90, 65, 110, 87, 86, 92, 74, 79, 74,
+  73, 82, 99, 79, 60, 95, 57, 93, 83, 85,
+  104, 90, 100, 79, 78, 79, 92, 80, 101, 103,
+  82, 76, 64, 86, 96, 86, 85, 91, 101, 89,
+  89, 79, 89, 82, 83, 91, 84, 87, 82, 64,
+  79, 86, 80, 85, 103, 77, 83, 79, 83, 79,
+  88, 89, 84, 64, 91, 82, 80, 98, 90, 70,
+  88, 88, 82, 89, 80, 84, 71, 84, 82, 91,
+  63, 84, 73, 78, 75, 88, 74, 80, 81, 74,
+  82, 61, 69, 68, 94, 89, 69, 86, 88, 78,
+  88, 95, 84, 88, 83, 71, 80, 83, 80, 63,
+  93, 85, 69, 70, 71, 105, 72, 79, 73, 86,
+  81, 67, 59, 71, 80, 79, 66, 73, 81, 90,
+  69, 107, 81, 83, 91, 76, 76, 63, 74, 80,
+  93, 76, 77, 96, 63, 91, 86, 86, 109, 90,
+  97, 77, 73, 80, 89, 96, 105, 92, 77, 79,
+  66, 86, 87, 85, 86, 84, 90, 86, 98, 84,
+  95, 82, 82, 90, 77, 86, 83, 62, 81, 89,
+  84, 79, 99, 80, 90, 88, 85, 76, 90, 85,
+  92, 73, 71, 86, 92, 91, 89, 65, 93, 83,
+  80, 87, 84, 84, 76, 87, 96, 87, 74, 82,
+  76, 80, 74, 96, 90, 79, 85, 86, 84, 81,
+  78, 73, 88, 94, 70, 88, 91, 89, 87, 84,
+  87, 85, 85, 67, 89, 83, 74, 77, 90, 76,
+  66, 83, 84, 99, 83, 82, 76, 86, 83, 71,
+  64, 77, 78, 80, 69, 88, 88, 87, 67, 105,
+  77, 84, 89, 83, 77, 78, 86, 79, 93, 79,
+  79, 93, 63, 92, 83, 87, 105, 90, 75, 92,
+  76, 96, 86, 72, 84, 97, 91, 81, 67, 86,
+  77, 71, 73, 102, 81, 82, 89, 84, 70, 84,
+  78, 90, 83, 78, 88, 81, 87, 81, 73, 88,
+  90, 75, 70, 85, 87, 75, 102, 84, 78, 73,
+  80, 78, 72, 81, 84, 88, 87, 81, 75, 86,
+  75, 76, 78, 87, 81, 82, 94, 82, 84, 83,
+  71, 79, 95, 71, 93, 93, 93, 85, 77, 82,
+  91, 101, 74, 88, 79, 80, 77, 76, 84, 83,
+  94, 95, 84, 82, 81, 84, 85, 88, 76, 89,
+  76, 98, 86, 75, 76, 80, 80, 94, 64, 89,
+  100, 82, 78, 121, 75, 83, 64, 83, 75, 70,
+  77, 75, 90, 95, 76, 76, 86, 84, 81, 75,
+  85, 90, 87, 78, 91, 91, 75, 86, 83, 101,
+  89, 69, 70, 97, 111, 85, 74, 89, 78, 82,
+  74, 99, 84, 80, 97, 79, 83, 87, 65, 90,
+  81, 71, 87, 96, 97, 79, 70, 93, 92, 76,
+  73, 80, 80, 81, 86, 72, 66, 63, 77, 82,
+  59, 83, 78, 84, 79, 83, 73, 94, 81, 76,
+  82, 84, 79, 74, 83, 79, 87, 81, 64, 84,
+  80, 61, 97, 95, 100, 85, 73, 66, 101, 104,
+  74, 83, 73, 87, 84, 63, 82, 83, 104, 96,
+  86, 84, 75, 88, 79, 80, 92, 82, 61, 93,
+  91, 67, 86, 78, 76, 116, 64, 93, 109, 78,
+  68, 137, 72, 90, 68, 70, 67, 67, 74, 75,
+  93, 90, 77, 75, 75, 88, 84, 65, 93, 85,
+  85, 74, 91, 97, 77, 77, 74, 93, 90, 79,
+  84, 99, 97, 81, 69, 86, 78, 100, 78, 102,
+  81, 81, 90, 82, 84, 86, 71, 91, 74, 81,
+  91, 84, 82, 77, 80, 87, 97, 82, 83, 91,
+  82, 80, 71, 83, 75, 77, 72, 81, 70, 83,
+  86, 83, 89, 86, 76, 91, 83, 79, 82, 77,
+  84, 79, 93, 79, 81, 84, 71, 78, 87, 71,
+  87, 97, 97, 89, 68, 78, 91, 99, 77, 81,
+  74, 84, 85, 73, 86, 82, 91, 84, 91, 83,
+  75, 83, 85, 82, 79, 80, 78, 97, 86, 78,
+  77, 81, 84, 98, 64, 94, 96, 81, 82, 122,
+  75, 85, 69, 81, 69, 69, 75, 86, 85, 98,
+  80, 75, 83, 86, 86, 73, 91, 89, 86, 76,
+  94, 97, 62, 97, 95, 83, 77, 89, 77, 83,
+  98, 81, 81, 91, 84, 84, 66, 92, 84, 79,
+  94, 97, 80, 92, 75, 79, 69, 71, 90, 87,
+  81, 80, 88, 85, 71, 72, 72, 98, 79, 75,
+  95, 79, 78, 73, 78, 84, 69, 67, 83, 93,
+  87, 76, 88, 93, 75, 76, 72, 83, 78, 82,
+  107, 80, 88, 89, 89, 69, 93, 72, 83, 99,
+  91, 85, 70, 100, 81, 92, 85, 82, 87, 93,
+  75, 82, 83, 87, 95, 114, 98, 71, 88, 101,
+  80, 93, 89, 75, 79, 88, 81, 86, 76, 81,
+  86, 97, 80, 79, 100, 89, 86, 94, 80, 95,
+  81, 69, 75, 66, 67, 89, 100, 103, 82, 88,
+  74, 91, 82, 84, 99, 80, 98, 83, 83, 89,
+  44, 89, 86, 80, 81, 85, 67, 79, 103, 86,
+  95, 92, 83, 97, 65, 85, 81, 83, 87, 103,
+  77, 99, 75, 79, 66, 75, 90, 100, 99, 83,
+  93, 81, 72, 78, 82, 88, 84, 79, 97, 67,
+  86, 83, 78, 87, 61, 63, 83, 102, 79, 74,
+  88, 101, 77, 68, 72, 100, 70, 77, 116, 85,
+  93, 90, 78, 79, 97, 80, 86, 110, 100, 78,
+  86, 101, 77, 94, 88, 73, 89, 95, 88, 68,
+  76, 88, 91, 101, 115, 72, 83, 114, 72, 84,
+  97, 82, 90, 82, 82, 85, 75, 85, 90, 112,
+  82, 92, 111, 90, 90, 114, 77, 103, 82, 64,
+  73, 73, 65, 87, 104, 118, 81, 89, 71, 90,
+  86, 77, 97, 79, 92, 81, 85, 97, 67, 77,
+  72, 87, 82, 76, 79, 93, 101, 83, 87, 89,
+  85, 92, 75, 88, 81, 84, 88, 95, 79, 83,
+  84, 76, 66, 81, 92, 89, 80, 77, 92, 81,
+  75, 74, 76, 99, 80, 81, 76, 76, 76, 81,
+  80, 85, 67, 65, 87, 100, 91, 79, 89, 81,
+  83, 77, 77, 88, 76, 82, 111, 80, 82, 82,
+  89, 65, 92, 76, 78, 101, 94, 75, 94, 100,
+  87, 95, 87, 85, 85, 87, 83, 82, 82, 84,
+  87, 92, 96, 74, 87, 94, 80, 90, 89, 78,
+  83, 86, 91, 90, 75, 85, 87, 93, 77, 98,
+  99, 88, 89, 98, 78, 94, 81, 71, 72, 66,
+  71, 93, 89, 101, 80, 88, 78, 82, 93, 78,
+  104, 83, 96, 79, 85, 89, 94, 73, 98, 94,
+  70, 75, 88, 73, 77, 74, 83, 82, 96, 81,
+  81, 85, 77, 68, 91, 85, 90, 87, 86, 86,
+  91, 63, 100, 84, 92, 73, 107, 99, 78, 93,
+  85, 70, 90, 89, 73, 79, 75, 107, 68, 95,
+  81, 81, 91, 83, 73, 82, 75, 94, 83, 74,
+  76, 101, 70, 72, 84, 95, 84, 86, 77, 74,
+  79, 74, 102, 75, 85, 72, 68, 87, 83, 105,
+  77, 63, 82, 70, 84, 75, 92, 96, 97, 86,
+  110, 76, 85, 78, 91, 80, 73, 80, 85, 88,
+  66, 83, 91, 75, 88, 74, 72, 91, 79, 83,
+  92, 85, 77, 88, 86, 77, 94, 79, 67, 83,
+  90, 90, 72, 90, 94, 75, 87, 90, 86, 72,
+  78, 73, 85, 103, 75, 82, 87, 93, 76, 60,
+  85, 77, 76, 77, 80, 76, 86, 97, 89, 91,
+  71, 70, 80, 84, 72, 68, 70, 91, 91, 67,
+  106, 84, 102, 69, 109, 95, 79, 92, 76, 61,
+  98, 101, 99, 76, 81, 95, 78, 95, 81, 70,
+  94, 67, 70, 76, 81, 87, 79, 76, 69, 92,
+  57, 76, 88, 99, 87, 103, 90, 77, 71, 78,
+  103, 69, 92, 79, 77, 89, 81, 109, 76, 67,
+  81, 65, 93, 62, 99, 95, 86, 79, 101, 91,
+  75, 79, 95, 75, 80, 78, 94, 88, 71, 86,
+  87, 80, 101, 57, 70, 87, 86, 83, 93, 86,
+  85, 94, 87, 71, 88, 86, 65, 71, 89, 104,
+  63, 88, 91, 71, 89, 89, 81, 74, 78, 80,
+  83, 91, 88, 87, 77, 95, 76, 86, 87, 79,
+  80, 76, 83, 81, 103, 84, 83, 80, 77, 71,
+  89, 86, 66, 76, 76, 83, 93, 66, 105, 85,
+  83, 76, 98, 94, 75, 84, 82, 79, 90, 93,
+  89, 85, 78, 100, 87, 91, 85, 81, 82, 88,
+  68, 85, 77, 85, 83, 84, 79, 75, 64, 77,
+  87, 95, 84, 91, 83, 69, 78, 74, 95, 79,
+  79, 89, 85, 91, 85, 109, 79, 65, 79, 85,
+  73, 71, 92, 84, 94, 77, 103, 89, 77, 75,
+  91, 77, 75, 74, 86, 85, 74, 82, 86, 76,
+  101, 74, 74, 87, 82, 84, 93, 90, 84, 91,
+  90, 80, 70, 75, 70, 83, 95, 87, 69, 90,
+  91, 79, 93, 89, 81, 79, 76, 70, 86, 98,
+  64, 81, 103, 82, 88, 63, 71, 69, 93, 87,
+  78, 100, 95, 107, 68, 72, 78, 68, 78, 81,
+  92, 89, 79, 80, 79, 70, 99, 75, 105, 83,
+  87, 93, 76, 81, 78, 91, 76, 95, 69, 79,
+  87, 78, 73, 81, 85, 98, 68, 75, 92, 81,
+  83, 91, 88, 77, 76, 69, 68, 63, 93, 76,
+  74, 100, 82, 86, 74, 103, 81, 94, 75, 100,
+  56, 71, 84, 87, 71, 90, 75, 84, 91, 76,
+  87, 75, 80, 78, 91, 82, 84, 88, 74, 92,
+  86, 81, 80, 78, 80, 88, 77, 74, 78, 84,
+  78, 73, 86, 82, 92, 81, 80, 83, 73, 76,
+  104, 59, 69, 93, 98, 113, 107, 82, 94, 66,
+  92, 95, 77, 85, 92, 93, 75, 83, 36, 90,
+  72, 85, 86, 71, 60, 78, 98, 97, 68, 92,
+  42, 86, 72, 74, 68, 75, 91, 90, 67, 57,
+  87, 91, 71, 80, 107, 72, 107, 66, 67, 86,
+  73, 81, 73, 78, 62, 84, 71, 57, 86, 55,
+  63, 70, 90, 100, 76, 57, 107, 70, 94, 66,
+  84, 81, 94, 80, 81, 57, 88, 78, 69, 118,
+  99, 56, 92, 83, 72, 91, 67, 130, 78, 63,
+  100, 67, 89, 116, 76, 66, 104, 64, 86, 78,
+  69, 87, 65, 74, 93, 94, 56, 80, 112, 95,
+  64, 72, 117, 75, 85, 71, 76, 75, 75, 112,
+  95, 79, 116, 81, 110, 81, 80, 60, 89, 61,
+  92, 94, 82, 95, 110, 68, 64, 56, 90, 87,
+  71, 114, 100, 102, 70, 59, 69, 94, 58, 78,
+  82, 78, 77, 75, 93, 86, 82, 99, 109, 70,
+  73, 73, 75, 66, 83, 82, 68, 73, 79, 81,
+  78, 77, 101, 82, 101, 78, 81, 90, 80, 88,
+  87, 95, 78, 100, 114, 80, 96, 80, 93, 86,
+  79, 84, 61, 87, 88, 82, 81, 86, 90, 82,
+  88, 95, 78, 71, 92, 78, 75, 106, 83, 86,
+  77, 111, 69, 90, 72, 102, 102, 78, 86, 82,
+  71, 87, 77, 70, 106, 73, 93, 77, 75, 88,
+  96, 86, 89, 81, 77, 96, 97, 84, 82, 80,
+  80, 79, 82, 76, 103, 84, 77, 108, 88, 82,
+  95, 83, 91, 86, 81, 80, 78, 60, 76, 84,
+  83, 85, 72, 81, 92, 70, 88, 95, 75, 90,
+  91, 87, 75, 79, 73, 95, 101, 72, 86, 83,
+  89, 85, 89, 75, 76, 86, 87, 78, 92, 77,
+  80, 81, 76, 84, 63, 83, 80, 73, 86, 86,
+  75, 78, 83, 91, 77, 87, 99, 78, 75, 100,
+  87, 90, 96, 85, 81, 80, 76, 91, 94, 99,
+  72, 75, 88, 87, 83, 86, 83, 79, 80, 98,
+  85, 79, 96, 78, 79, 90, 86, 103, 73, 110,
+  77, 90, 78, 88, 97, 68, 92, 75, 73, 95,
+  80, 88, 83, 95, 88, 83, 87, 84, 94, 78,
+  83, 79, 87, 112, 85, 78, 79, 93, 104, 81,
+  76, 93, 100, 76, 89, 61, 82, 89, 84, 93,
+  74, 86, 84, 101, 84, 84, 89, 87, 82, 78,
+  115, 81, 93, 80, 85, 89, 81, 88, 80, 83,
+  81, 95, 68, 106, 92, 74, 98, 96, 79, 99,
+  97, 72, 80, 75, 62, 84, 80, 85, 72, 76,
+  91, 80, 62, 64, 86, 78, 86, 103, 62, 82,
+  74, 56, 88, 90, 81, 86, 66, 94, 79, 73,
+  75, 72, 72, 71, 57, 86, 106, 105, 85, 79,
+  106, 80, 94, 82, 81, 84, 78, 83, 113, 81,
+  95, 79, 70, 89, 95, 73, 72, 95, 67, 89,
+  74, 73, 92, 60, 88, 75, 83, 114, 77, 81,
+  61, 105, 86, 91, 97, 85, 89, 75, 92, 82,
+  86, 114, 96, 84, 70, 90, 118, 70, 79, 86,
+  85, 83, 83, 69, 99, 86, 83, 72, 95, 78,
+  85, 97, 80, 75, 113, 91, 77, 73, 95, 67,
+  74, 70, 93, 75, 87, 121, 94, 78, 75, 87,
+  80, 87, 97, 74, 90, 85, 92, 85, 85, 74,
+  81, 86, 90, 90, 92, 71, 73, 79, 78, 88,
+  78, 81, 84, 79, 82, 85, 76, 80, 75, 67,
+  80, 86, 99, 92, 95, 100, 85, 86, 69, 81,
+  82, 83, 66, 95, 92, 105, 74, 94, 91, 92,
+  77, 90, 82, 79, 82, 78, 84, 75, 94, 74,
+  77, 89, 84, 104, 78, 105, 74, 87, 82, 94,
+  108, 72, 87, 79, 69, 85, 83, 78, 82, 96,
+  91, 83, 76, 92, 99, 77, 90, 81, 84, 108,
+  85, 78, 81, 91, 93, 83, 77, 90, 91, 78,
+  89, 87, 83, 89, 83, 87, 79, 80, 80, 91,
+  90, 82, 87, 89, 92, 70, 70, 80, 91, 76,
+  96, 88, 93, 90, 77, 81, 79, 94, 85, 73,
+  87, 92, 96, 84, 89, 86, 72, 92, 91, 64,
+  61, 93, 89, 74, 85, 88, 96, 87, 82, 68,
+  91, 81, 106, 107, 82, 86, 93, 76, 77, 92,
+  93, 76, 70, 79, 80, 79, 83, 100, 83, 73,
+  75, 66, 93, 72, 69, 73, 94, 78, 71, 74,
+  67, 73, 78, 70, 83, 90, 74, 88, 84, 71,
+  93, 79, 95, 87, 81, 96, 77, 90, 76, 77,
+  86, 85, 82, 87, 94, 79, 101, 98, 69, 101,
+  97, 96, 64, 86, 97, 68, 80, 89, 90, 90,
+  97, 113, 78, 89, 75, 110, 80, 89, 88, 63,
+  81, 88, 91, 77, 76, 68, 77, 104, 82, 85,
+  95, 91, 71, 75, 89, 84, 60, 65, 97, 98,
+  95, 84, 62, 89, 90, 82, 82, 82, 75, 89,
+  99, 78, 85, 75, 75, 93, 96, 75, 67, 91,
+  92, 72, 89, 86, 97, 82, 83, 68, 87, 87,
+  100, 104, 75, 86, 88, 74, 79, 91, 90, 80,
+  65, 75, 79, 77, 81, 97, 85, 77, 73, 73,
+  99, 73, 69, 78, 89, 80, 66, 73, 75, 74,
+  80, 73, 78, 90, 76, 77, 92, 74, 88, 82,
+  85, 84, 75, 95, 79, 84, 78, 83, 82, 80,
+  84, 81, 99, 65, 102, 99, 71, 101, 95, 81,
+  68, 86, 94, 68, 80, 96, 83, 91, 99, 108,
+  75, 91, 81, 115, 79, 87, 80, 65, 76, 90,
+  92, 77, 74, 67, 75, 105, 82, 86, 92, 89,
+  73, 81, 73, 84, 59, 70, 89, 102, 89, 80,
+  68, 83, 91, 78, 83, 84, 78, 92, 94, 84,
+  85, 81, 75, 92, 93, 67, 70, 87, 87, 76,
+  88, 85, 94, 88, 79, 71, 91, 84, 91, 97,
+  80, 88, 90, 77, 76, 95, 97, 78, 78, 90,
+  84, 81, 81, 96, 85, 76, 77, 76, 92, 76,
+  70, 90, 93, 79, 73, 76, 71, 74, 78, 76,
+  87, 83, 76, 82, 79, 71, 92, 79, 98, 85,
+  78, 99, 80, 85, 88, 74, 85, 82, 87, 86,
+  96, 71, 99, 92, 70, 98, 96, 91, 68, 84,
+  94, 74, 79, 94, 91, 103, 94, 112, 81, 90,
+  75, 105, 79, 92, 88, 78, 79, 88, 91, 78,
+  83, 72, 75, 101, 82, 87, 96, 94, 68, 76,
+  79, 84, 61, 68, 86, 94, 91, 84, 63, 87,
+  92, 80, 87, 72, 85, 88, 103, 88, 93, 92,
+  76, 90, 85, 69, 64, 91, 93, 83, 87, 87,
+  93, 91, 83, 67, 86, 84, 104, 103, 83, 86,
+  89, 73, 83, 91, 92, 82, 79, 83, 78, 79,
+  77, 92, 84, 82, 78, 75, 100, 69, 74, 76,
+  90, 77, 77, 71, 70, 77, 81, 73, 77, 92,
+  78, 85, 84, 76, 84, 86, 90, 91, 79, 77,
+  79, 81, 82, 80, 87, 81, 85, 86, 90, 83,
+  89, 107, 67, 93, 95, 80, 68, 82, 89, 74,
+  81, 81, 81, 82, 99, 112, 78, 100, 81, 109,
+  88, 81, 77, 63, 81, 90, 86, 70, 80, 72,
+  71, 95, 81, 82, 93, 87, 66, 83, 85, 86,
+  66, 66, 89, 98, 95, 84, 65, 91, 97, 77,
+  89, 77, 77, 85, 102, 78, 93, 79, 79, 90,
+  89, 78, 65, 89, 99, 80, 92, 88, 94, 81,
+  84, 68, 81, 91, 106, 93, 78, 84, 84, 78,
+  82, 89, 86, 81, 76, 74, 80, 77, 82, 89,
+  86, 90, 77, 79, 102, 73, 81, 80, 83, 79,
+  77, 73, 77, 76, 84, 74, 75, 93, 82, 76,
+  88, 79, 80, 94, 82, 94, 77, 73, 81, 80,
+  77, 81, 85, 78, 89, 77, 94, 69, 89, 109,
+  68, 96, 93, 75, 72, 80, 87, 74, 82, 83,
+  71, 80, 96, 103, 72, 99, 88, 112, 86, 75,
+  74, 63, 77, 91, 85, 72, 77, 73, 63, 97,
+  81, 83, 88, 83, 72, 86, 74, 89, 68, 71,
+  74, 100, 84, 75, 70, 89, 97, 75, 81, 86,
+  84, 88, 99, 83, 89, 86, 80, 88, 90, 70,
+  66, 86, 88, 88, 88, 86, 92, 87, 81, 70,
+  88, 87, 99, 95, 79, 85, 86, 81, 84, 92,
+  96, 83, 78, 87, 80, 80, 84, 90, 84, 85,
+  76, 81, 96, 75, 78, 94, 88, 79, 80, 77,
+  73, 78, 81, 72, 81, 89, 83, 81, 80, 75,
+  84, 86, 94, 90, 81, 81, 79, 81, 84, 74,
+  86, 80, 85, 89, 90, 72, 90, 103, 70, 93,
+  97, 89, 71, 81, 92, 76, 83, 91, 85, 85,
+  94, 110, 78, 97, 82, 103, 81, 84, 84, 69,
+  79, 89, 84, 71, 80, 73, 70, 94, 82, 84,
+  94, 88, 66, 80, 82, 86, 68, 71, 77, 95,
+  95, 85, 63, 90, 96, 78, 89, 70, 82, 81,
+  91, 90, 96, 103, 80, 85, 81, 74, 66, 85,
+  88, 85, 85, 82, 86, 87, 80, 72, 83, 77,
+  99, 100, 95, 86, 89, 79, 79, 87, 99, 85,
+  84, 87, 79, 81, 74, 87, 81, 88, 76, 79,
+  93, 70, 80, 76, 89, 75, 72, 77, 67, 74,
+  85, 76, 82, 78, 82, 82, 78, 74, 84, 74,
+  100, 92, 79, 80, 80, 94, 93, 80, 83, 84,
+  88, 85, 88, 77, 92, 99, 66, 86, 95, 83,
+  65, 80, 87, 81, 87, 83, 85, 82, 92, 117,
+  79, 96, 71, 106, 86, 84, 91, 69, 82, 90,
+  83, 73, 78, 75, 79, 97, 81, 80, 94, 84,
+  70, 83, 83, 95, 71, 68, 87, 95, 98, 81,
+  59, 92, 88, 84, 90, 76, 79, 78, 90, 73,
+  99, 92, 83, 86, 86, 82, 65, 83, 92, 85,
+  86, 81, 91, 83, 79, 71, 79, 83, 103, 92,
+  91, 85, 85, 87, 75, 88, 98, 79, 82, 76,
+  80, 82, 77, 86, 81, 89, 76, 80, 92, 71,
+  83, 77, 87, 79, 74, 78, 73, 76, 84, 78,
+  81, 82, 83, 82, 77, 76, 81, 77, 88, 92,
+  81, 84, 85, 90, 78, 80, 83, 83, 94, 86,
+  89, 68, 92, 102, 71, 90, 96, 79, 69, 78,
+  87, 79, 86, 84, 81, 82, 95, 114, 71, 97,
+  79, 105, 88, 80, 89, 68, 80, 90, 83, 73,
+  77, 75, 79, 98, 80, 81, 89, 81, 75, 81,
+  74, 98, 74, 71, 77, 95, 97, 73, 66, 93,
+  87, 81, 83, 83, 86, 81, 92, 79, 92, 93,
+  84, 85, 84, 77, 66, 85, 84, 84, 84, 80,
+  86, 89, 80, 73, 90, 82, 99, 89, 88, 83,
+  86, 86, 76, 91, 98, 83, 77, 88, 81, 82,
+  85, 83, 81, 83, 77, 83, 93, 76, 83, 90,
+  86, 77, 74, 87, 70, 76, 88, 74, 84, 76,
+  88, 78, 77, 73, 85, 80, 107, 91, 80, 79,
+  79, 96, 84, 74, 82, 82, 89, 86, 89, 73,
+  89, 92, 71, 87, 97, 89, 70, 81, 88, 88,
+  86, 87, 86, 84, 89, 113, 79, 92, 76, 101,
+  85, 85, 95, 72, 80, 88, 84, 76, 79, 78,
+  79, 92, 79, 81, 92, 86, 69, 82, 87, 95,
+  73, 73, 80, 90, 97, 81, 57, 91, 89, 80,
+  73, 104, 73, 88, 71, 84, 87, 87, 84, 86,
+  74, 76, 79, 71, 87, 74, 79, 83, 88, 86,
+  97, 82, 91, 92, 103, 79, 88, 85, 98, 112,
+  74, 85, 83, 79, 78, 84, 89, 88, 148, 90,
+  84, 93, 67, 91, 86, 83, 87, 76, 84, 76,
+  86, 76, 90, 77, 75, 114, 76, 78, 83, 86,
+  85, 75, 96, 83, 66, 76, 84, 83, 76, 83,
+  81, 103, 78, 83, 91, 75, 86, 89, 79, 78,
+  83, 81, 85, 99, 78, 94, 84, 98, 84, 90,
+  87, 70, 73, 79, 80, 80, 90, 78, 73, 89,
+  80, 71, 96, 94, 87, 85, 85, 88, 88, 77,
+  80, 79, 76, 84, 79, 99, 77, 85, 85, 91,
+  81, 87, 84, 74, 80, 91, 89, 88, 66, 89,
+  63, 79, 90, 74, 74, 86, 82, 83, 77, 75,
+  71, 63, 75, 72, 87, 70, 76, 76, 92, 77,
+  84, 89, 101, 69, 81, 81, 120, 106, 78, 79,
+  81, 74, 68, 100, 84, 78, 156, 89, 87, 78,
+  79, 92, 98, 93, 83, 79, 86, 73, 82, 78,
+  84, 77, 67, 104, 76, 80, 94, 81, 84, 82,
+  90, 100, 50, 79, 79, 82, 81, 83, 116, 92,
+  86, 92, 86, 80, 77, 83, 88, 75, 77, 74,
+  85, 80, 85, 97, 82, 110, 73, 81, 75, 88,
+  81, 81, 82, 73, 87, 80, 78, 95, 83, 82,
+  90, 95, 88, 77, 71, 87, 82, 73, 77, 81,
+  70, 77, 72, 92, 72, 85, 76, 87, 88, 95,
+  81, 72, 77, 83, 84, 91, 68, 87, 79, 96,
+  68, 78, 87, 95, 87, 89, 75, 75, 77, 68,
+  86, 91, 83, 93, 84, 82, 90, 74, 92, 88,
+  97, 78, 83, 90, 61, 84, 82, 84, 89, 70,
+  77, 94, 57, 85, 93, 87, 96, 72, 77, 90,
+  85, 93, 90, 77, 71, 89, 84, 90, 83, 78,
+  91, 74, 81, 96, 90, 87, 83, 71, 83, 68,
+  91, 65, 85, 86, 78, 98, 70, 79, 109, 88,
+  83, 75, 77, 77, 81, 73, 102, 76, 76, 89,
+  77, 96, 88, 67, 77, 82, 81, 87, 84, 78,
+  82, 74, 89, 79, 70, 80, 85, 83, 76, 96,
+  83, 89, 85, 87, 78, 73, 71, 93, 81, 92,
+  79, 78, 87, 84, 81, 81, 88, 83, 100, 92,
+  96, 82, 83, 78, 84, 102, 76, 95, 54, 88,
+  95, 89, 95, 81, 78, 77, 87, 70, 93, 81,
+  85, 89, 86, 92, 100, 88, 106, 97, 100, 83,
+  89, 87, 90, 93, 76, 86, 81, 78, 89, 78,
+  80, 80, 98, 84, 82, 78, 68, 84, 78, 91,
+  85, 80, 75, 85, 79, 86, 88, 73, 95, 95,
+  77, 89, 85, 90, 81, 72, 89, 73, 81, 72,
+  82, 78, 79, 83, 85, 78, 84, 87, 92, 75,
+  84, 90, 77, 78, 96, 72, 81, 98, 75, 89,
+  76, 78, 87, 94, 91, 77, 80, 81, 87, 78,
+  82, 70, 75, 86, 82, 67, 80, 88, 80, 87,
+  88, 85, 83, 89, 73, 80, 89, 90, 71, 73,
+  80, 81, 83, 82, 80, 76, 94, 92, 81, 87,
+  77, 78, 76, 105, 61, 83, 75, 78, 78, 77,
+  88, 82, 78, 75, 71, 58, 79, 68, 87, 70,
+  75, 80, 91, 76, 91, 89, 100, 74, 84, 83,
+  119, 97, 76, 84, 77, 73, 73, 92, 84, 79,
+  149, 83, 86, 73, 75, 83, 87, 92, 85, 71,
+  85, 74, 81, 81, 87, 78, 76, 99, 67, 79,
+  83, 83, 85, 85, 91, 93, 57, 73, 74, 72,
+  85, 67, 108, 88, 78, 89, 86, 75, 85, 87,
+  90, 75, 74, 74, 82, 90, 78, 93, 75, 105,
+  73, 84, 78, 79, 84, 80, 83, 79, 87, 81,
+  74, 83, 75, 75, 90, 91, 79, 72, 69, 75,
+  74, 75, 77, 78, 71, 80, 65, 82, 61, 86,
+  76, 84, 87, 85, 84, 67, 69, 83, 80, 80,
+  78, 87, 57, 83, 80, 75, 77, 82, 80, 82,
+  76, 76, 75, 67, 74, 75, 89, 83, 84, 79,
+  91, 74, 86, 85, 97, 77, 84, 81, 104, 88,
+  90, 93, 82, 70, 75, 105, 90, 82, 135, 87,
+  98, 79, 84, 83, 92, 93, 90, 75, 91, 80,
+  72, 83, 85, 78, 81, 75, 72, 82, 85, 84,
+  91, 93, 93, 96, 62, 72, 72, 93, 92, 84,
+  92, 90, 93, 92, 86, 80, 76, 81, 96, 76,
+  82, 80, 80, 79, 85, 89, 78, 98, 63, 72,
+  79, 92, 86, 78, 88, 73, 87, 87, 78, 80,
+  78, 79, 82, 95, 86, 73, 70, 77, 79, 67,
+  81, 94, 74, 83, 71, 94, 72, 90, 77, 89,
+  93, 93, 85, 71, 78, 86, 86, 81, 98, 96,
+  84, 81, 59, 89, 95, 83, 80, 85, 78, 86,
+  93, 82, 83, 83, 85, 85, 88, 102, 99, 89,
+  106, 88, 96, 89, 82, 88, 80, 94, 86, 86,
+  83, 83, 89, 85, 96, 88, 109, 88, 91, 83,
+  73, 91, 83, 87, 80, 82, 75, 87, 86, 88,
+  79, 77, 103, 101, 86, 103, 93, 88, 83, 79,
+  95, 81, 87, 92, 78, 85, 73, 92, 102, 95,
+  80, 80, 86, 82, 80, 89, 75, 82, 100, 78,
+  76, 90, 92, 90, 74, 85, 85, 82, 81, 75,
+  82, 73, 85, 87, 78, 75, 75, 90, 77, 79,
+  83, 94, 87, 94, 85, 92, 86, 92, 79, 82,
+  88, 84, 75, 91, 87, 89, 92, 93, 80, 89,
+  87, 92, 91, 91, 83, 78, 86, 106, 83, 91,
+  59, 96, 90, 81, 88, 84, 81, 81, 74, 81,
+  85, 83, 89, 88, 83, 95, 93, 71, 103, 95,
+  91, 80, 89, 84, 85, 85, 85, 87, 87, 75,
+  83, 88, 87, 82, 91, 76, 85, 79, 76, 77,
+  81, 94, 84, 77, 80, 90, 93, 80, 85, 76,
+  89, 75, 75, 95, 79, 90, 87, 83, 93, 79,
+  88, 67, 81, 80, 80, 84, 87, 96, 85, 83,
+  86, 81, 86, 92, 84, 77, 90, 78, 83, 97,
+  78, 91, 82, 83, 89, 90, 90, 76, 82, 80,
+  89, 79, 87, 81, 74, 79, 80, 82, 83, 95,
+  87, 87, 86, 73, 80, 82, 79, 85, 81, 89,
+  74, 87, 80, 88, 79, 84, 90, 83, 91, 78,
+  80, 93, 75, 77, 79, 90, 68, 92, 74, 86,
+  82, 74, 80, 85, 83, 75, 86, 79, 73, 71,
+  89, 79, 84, 90, 85, 65, 98, 93, 93, 76,
+  92, 84, 86, 85, 98, 85, 81, 78, 70, 99,
+  89, 90, 120, 86, 92, 84, 76, 73, 77, 88,
+  96, 83, 93, 77, 81, 79, 83, 78, 73, 63,
+  74, 85, 80, 97, 93, 91, 92, 100, 79, 63,
+  80, 87, 95, 86, 93, 107, 80, 86, 87, 79,
+  79, 86, 87, 76, 80, 78, 85, 92, 94, 90,
+  80, 95, 78, 86, 82, 85, 86, 86, 83, 75,
+  90, 86, 77, 82, 72, 69, 86, 96, 87, 81,
+  71, 74, 81, 62, 83, 86, 77, 85, 78, 98,
+  84, 90, 85, 82, 99, 94, 81, 67, 75, 97,
+  79, 82, 107, 92, 78, 92, 85, 88, 78, 84,
+  75, 79, 68, 81, 86, 97, 97, 90, 90, 86,
+  76, 69, 76, 83, 101, 83, 87, 78, 88, 90,
+  90, 88, 83, 80, 75, 108, 89, 83, 85, 88,
+  83, 80, 85, 76, 98, 79, 80, 75, 88, 88,
+  85, 82, 89, 77, 78, 82, 83, 87, 76, 88,
+  82, 81, 81, 85, 83, 82, 87, 88, 84, 78,
+  102, 80, 95, 91, 84, 79, 83, 80, 79, 82,
+  86, 78, 86, 89, 82, 76, 73, 80, 83, 86,
+  89, 72, 65, 85, 82, 99, 80, 74, 90, 84,
+  91, 76, 76, 85, 81, 102, 77, 79, 78, 88,
+  82, 75, 73, 92, 78, 86, 71, 77, 82, 86,
+  86, 88, 74, 75, 94, 83, 88, 88, 87, 73,
+  131, 94, 88, 90, 99, 94, 76, 75, 67, 75,
+  72, 79, 93, 83, 97, 82, 86, 85, 73, 70,
+  81, 85, 88, 84, 110, 79, 94, 82, 91, 85,
+  94, 89, 80, 88, 90, 83, 78, 92, 95, 81,
+  84, 82, 82, 91, 96, 84, 87, 80, 78, 75,
+  83, 79, 78, 85, 86, 79, 66, 85, 82, 78,
+  83, 72, 87, 82, 74, 86, 100, 77, 89, 74,
+  79, 99, 77, 76, 85, 74, 69, 97, 69, 80,
+  84, 92, 95, 71, 75, 88, 79, 91, 83, 76,
+  52, 73, 74, 115, 71, 75, 86, 94, 88, 77,
+  69, 86, 78, 103, 82, 72, 72, 90, 104, 76,
+  85, 93, 77, 80, 78, 87, 84, 96, 90, 81,
+  79, 68, 104, 75, 91, 92, 88, 74, 88, 73,
+  98, 86, 80, 99, 78, 88, 90, 88, 70, 93,
+  69, 84, 92, 89, 90, 79, 75, 83, 95, 78,
+  82, 83, 91, 75, 88, 89, 87, 91, 81, 78,
+  77, 82, 87, 98, 81, 89, 81, 84, 82, 76,
+  73, 89, 78, 78, 83, 79, 92, 80, 88, 82,
+  78, 74, 82, 86, 86, 88, 91, 82, 76, 90,
+  80, 72, 91, 86, 86, 81, 92, 71, 79, 78,
+  86, 75, 82, 85, 85, 89, 72, 73, 83, 95,
+  80, 73, 80, 91, 85, 82, 90, 76, 75, 87,
+  86, 88, 89, 78, 84, 81, 89, 83, 83, 65,
+  82, 98, 81, 79, 83, 85, 80, 85, 87, 81,
+  84, 86, 80, 82, 99, 76, 81, 89, 89, 84,
+  95, 93, 80, 87, 87, 77, 119, 84, 84, 69,
+  97, 74, 72, 87, 69, 81, 73, 78, 75, 108,
+  81, 76, 81, 79, 77, 83, 75, 78, 91, 87,
+  78, 80, 87, 88, 105, 94, 93, 84, 76, 127,
+  91, 83, 112, 84, 72, 74, 84, 76, 99, 86,
+  63, 68, 73, 86, 91, 78, 85, 76, 83, 81,
+  64, 87, 87, 82, 84, 80, 88, 81, 81, 80,
+  90, 81, 80, 90, 99, 67, 107, 83, 79, 75,
+  75, 77, 82, 75, 113, 73, 84, 73, 77, 83,
+  104, 80, 90, 95, 78, 72, 73, 84, 79, 89,
+  91, 74, 75, 78, 81, 83, 81, 100, 94, 99,
+  78, 91, 76, 90, 68, 88, 71, 105, 71, 87,
+  89, 71, 65, 93, 84, 99, 69, 67, 82, 71,
+  83, 90, 78, 70, 148, 82, 97, 82, 119, 78,
+  67, 81, 58, 81, 74, 70, 89, 84, 90, 74,
+  85, 80, 84, 92, 80, 88, 70, 82, 112, 77,
+  84, 75, 103, 105, 101, 92, 81, 125, 85, 93,
+  95, 98, 118, 71, 86, 69, 73, 99, 69, 61,
+  76, 68, 83, 73, 80, 76, 82, 85, 56, 88,
+  75, 86, 75, 93, 101, 72, 80, 84, 69, 81,
+  92, 96, 108, 70, 74, 88, 76, 74, 72, 73,
+  80, 90, 84, 74, 82, 67, 91, 78, 125, 101,
+  79, 106, 72, 68, 67, 75, 63, 110, 76, 80,
+  71, 83, 82, 69, 67, 73, 97, 98, 71, 104,
+  76, 91, 76, 81, 76, 117, 68, 83, 100, 80,
+  84, 100, 84, 86, 68, 61, 81, 64, 86, 99,
+  76, 60, 94, 72, 82, 70, 79, 102, 74, 87,
+  89, 85, 79, 86, 71, 77, 75, 74, 82, 75,
+  77, 86, 97, 82, 73, 87, 87, 73, 87, 87,
+  96, 102, 80, 83, 72, 86, 81, 99, 97, 81,
+  98, 75, 82, 81, 66, 83, 68, 71, 71, 71,
+  86, 89, 89, 82, 84, 74, 75, 88, 92, 81,
+  96, 75, 85, 78, 77, 63, 82, 82, 87, 87,
+  89, 82, 68, 82, 86, 79, 70, 83, 93, 96,
+  79, 75, 78, 80, 75, 76, 87, 87, 83, 94,
+  84, 77, 76, 83, 84, 82, 85, 73, 75, 74,
+  89, 85, 87, 59, 90, 96, 90, 87, 83, 82,
+  71, 98, 78, 87, 84, 87, 89, 92, 102, 76,
+  86, 103, 99, 78, 82, 87, 81, 87, 81, 87,
+  84, 84, 82, 54, 77, 82, 81, 84, 84, 87,
+  80, 90, 78, 94, 73, 71, 68, 78, 82, 73,
+  88, 91, 74, 95, 70, 80, 93, 89, 92, 81,
+  82, 85, 98, 99, 99, 79, 105, 76, 73, 78,
+  83, 67, 94, 78, 64, 90, 71, 61, 86, 108,
+  81, 89, 87, 82, 80, 81, 89, 74, 90, 71,
+  84, 85, 71, 78, 85, 83, 74, 79, 85, 81,
+  92, 68, 93, 80, 73, 93, 88, 85, 116, 68,
+  79, 84, 86, 85, 84, 76, 87, 89, 90, 103,
+  93, 75, 81, 67, 93, 77, 89, 71, 70, 101,
+  90, 81, 85, 93, 91, 67, 80, 95, 100, 102,
+  80, 95, 92, 79, 80, 82, 72, 74, 89, 105,
+  77, 85, 83, 86, 86, 89, 73, 107, 89, 76,
+  79, 60, 79, 74, 76, 84, 75, 84, 78, 86,
+  66, 87, 78, 69, 68, 78, 75, 83, 87, 96,
+  80, 90, 72, 75, 94, 77, 89, 109, 76, 78,
+  85, 102, 91, 80, 107, 71, 92, 72, 90, 62,
+  79, 80, 61, 83, 70, 67, 79, 106, 78, 86,
+  85, 78, 71, 80, 92, 70, 93, 77, 89, 87,
+  79, 83, 83, 81, 74, 87, 79, 94, 81, 68,
+  95, 79, 71, 91, 93, 72, 106, 61, 79, 80,
+  80, 82, 86, 91, 84, 92, 86, 88, 83, 76,
+  84, 67, 94, 71, 84, 71, 74, 87, 85, 76,
+  88, 93, 95, 77, 84, 90, 78, 103, 76, 100,
+  95, 85, 92, 83, 86, 72, 82, 109, 98, 85,
+  74, 84, 77, 98, 74, 105, 83, 84, 77, 63,
+  77, 77, 85, 79, 98, 82, 82, 93, 86, 84,
+  72, 75, 67, 79, 81, 72, 92, 86, 83, 101,
+  75, 82, 88, 92, 84, 111, 80, 85, 98, 89,
+  77, 85, 102, 79, 94, 84, 75, 72, 86, 87,
+  70, 94, 75, 83, 82, 103, 80, 95, 88, 82,
+  86, 86, 89, 75, 88, 80, 82, 79, 68, 68,
+  85, 83, 79, 74, 79, 89, 76, 76, 89, 81,
+  72, 83, 90, 74, 76, 72, 79, 92, 85, 75,
+  88, 85, 75, 86, 98, 91, 90, 78, 76, 76,
+  78, 81, 87, 73, 96, 107, 82, 72, 85, 92,
+  98, 69, 84, 88, 97, 99, 89, 81, 96, 78,
+  75, 79, 84, 67, 93, 93, 118, 84, 91, 93,
+  87, 85, 79, 108, 89, 84, 79, 78, 90, 75,
+  73, 82, 86, 79, 78, 91, 80, 85, 73, 83,
+  75, 84, 76, 99, 84, 73, 100, 87, 77, 89,
+  68, 82, 88, 69, 74, 68, 75, 82, 89, 96,
+  82, 76, 77, 102, 84, 91, 81, 93, 93, 80,
+  84, 87, 79, 81, 80, 98, 87, 67, 88, 74,
+  82, 84, 97, 80, 82, 90, 94, 67, 74, 71,
+  75, 81, 102, 77, 78, 84, 87, 67, 91, 86,
+  79, 95, 88, 96, 95, 93, 87, 78, 84, 86,
+  80, 81, 104, 79, 94, 81, 70, 80, 88, 86,
+  82, 81, 95, 90, 76, 77, 67, 82, 79, 104,
+  76, 78, 84, 76, 78, 80, 76, 92, 76, 83,
+  82, 74, 73, 84, 87, 71, 92, 84, 96, 89,
+  80, 85, 94, 78, 80, 90, 82, 77, 63, 77,
+  94, 85, 73, 77, 82, 92, 103, 69, 87, 92,
+  96, 90, 89, 83, 131, 71, 72, 77, 83, 94,
+  87, 82, 100, 91, 63, 78, 98, 85, 90, 84,
+  82, 70, 64, 91, 77, 67, 84, 76, 81, 83,
+  93, 92, 73, 80, 77, 72, 79, 72, 67, 67,
+  89, 100, 104, 103, 85, 90, 64, 68, 85, 89,
+  91, 90, 72, 100, 67, 89, 80, 79, 187, 105,
+  86, 73, 78, 82, 67, 78, 77, 89, 77, 94,
+  65, 79, 79, 108, 84, 96, 79, 95, 113, 60,
+  86, 56, 81, 109, 93, 84, 107, 68, 97, 69,
+  89, 88, 92, 99, 79, 80, 76, 87, 77, 99,
+  100, 87, 85, 142, 84, 77, 68, 91, 82, 67,
+  93, 87, 87, 85, 80, 115, 67, 70, 85, 75,
+  73, 82, 89, 80, 87, 76, 88, 90, 98, 92,
+  77, 80, 80, 79, 91, 77, 78, 88, 86, 105,
+  92, 105, 67, 79, 80, 83, 89, 81, 84, 78,
+  74, 85, 88, 70, 86, 83, 89, 88, 90, 87,
+  75, 86, 80, 72, 85, 70, 63, 71, 81, 91,
+  103, 94, 86, 89, 67, 60, 67, 83, 86, 83,
+  77, 93, 67, 83, 81, 85, 139, 82, 86, 78,
+  82, 87, 78, 83, 79, 90, 81, 89, 74, 79,
+  91, 112, 83, 90, 87, 91, 107, 66, 81, 71,
+  82, 111, 83, 80, 94, 75, 87, 74, 84, 84,
+  90, 91, 78, 83, 80, 78, 73, 91, 93, 81,
+  79, 114, 89, 79, 80, 92, 83, 65, 88, 87,
+  83, 73, 89, 76, 84, 84, 81, 82, 83, 81,
+  84, 84, 76, 86, 74, 85, 78, 90, 78, 80,
+  77, 93, 83, 94, 72, 81, 85, 71, 79, 72,
+  81, 87, 94, 92, 74, 82, 75, 105, 85, 90,
+  94, 96, 84, 84, 81, 88, 81, 82, 84, 107,
+  86, 72, 84, 69, 83, 87, 96, 80, 76, 85,
+  90, 69, 78, 78, 74, 74, 92, 78, 80, 70,
+  91, 80, 91, 85, 73, 93, 84, 94, 93, 91,
+  95, 76, 84, 80, 83, 80, 104, 87, 100, 79,
+  71, 83, 89, 85, 80, 90, 88, 97, 76, 85,
+  71, 84, 75, 91, 75, 83, 90, 79, 83, 87,
+  83, 90, 72, 82, 78, 79, 81, 81, 74, 72,
+  91, 85, 93, 77, 80, 88, 89, 74, 79, 87,
+  83, 73, 73, 89, 84, 89, 71, 71, 69, 81,
+  97, 74, 76, 78, 82, 95, 81, 81, 97, 81,
+  79, 86, 92, 88, 88, 91, 77, 91, 80, 90,
+  122, 98, 88, 100, 76, 76, 68, 81, 78, 72,
+  61, 89, 86, 77, 101, 96, 73, 86, 81, 70,
+  72, 70, 75, 74, 87, 97, 84, 100, 81, 82,
+  69, 73, 66, 90, 104, 79, 84, 94, 97, 83,
+  88, 91, 132, 106, 105, 73, 78, 79, 81, 81,
+  84, 88, 88, 95, 67, 79, 86, 81, 82, 88,
+  95, 80, 85, 70, 87, 74, 77, 89, 90, 87,
+  87, 98, 83, 76, 80, 76, 72, 99, 78, 84,
+  74, 83, 73, 90, 83, 102, 72, 105, 75, 77,
+  71, 78, 73, 74, 86, 83, 92, 82, 76, 95,
+  73, 81, 81, 80, 74, 72, 73, 75, 89, 76,
+  76, 80, 86, 98, 88, 80, 85, 83, 83, 87,
+  85, 88, 89, 127, 74, 102, 80, 83, 83, 89,
+  83, 95, 85, 82, 75, 80, 80, 72, 71, 84,
+  81, 87, 100, 92, 75, 82, 80, 71, 78, 75,
+  69, 78, 77, 95, 80, 96, 88, 88, 78, 69,
+  65, 89, 97, 88, 69, 94, 92, 85, 84, 96,
+  122, 80, 88, 80, 79, 84, 83, 93, 84, 101,
+  83, 91, 69, 75, 95, 79, 81, 83, 88, 80,
+  91, 76, 82, 81, 81, 89, 84, 84, 82, 99,
+  83, 78, 77, 72, 74, 95, 76, 77, 78, 83,
+  90, 85, 84, 97, 83, 95, 78, 79, 79, 84,
+  75, 71, 85, 86, 82, 78, 84, 93, 86, 75,
+  81, 84, 82, 78, 90, 85, 81, 84, 74, 81,
+  87, 85, 81, 88, 69, 84, 97, 81, 82, 83,
+  79, 80, 78, 79, 83, 83, 76, 80, 81, 84,
+  83, 89, 85, 88, 90, 100, 96, 86, 79, 86,
+  82, 76, 83, 100, 81, 79, 80, 80, 85, 92,
+  88, 84, 85, 82, 87, 84, 87, 90, 85, 80,
+  82, 84, 81, 62, 80, 79, 86, 77, 80, 85,
+  83, 93, 88, 92, 93, 83, 90, 81, 77, 78,
+  90, 85, 95, 80, 72, 87, 84, 82, 95, 97,
+  83, 100, 84, 90, 78, 85, 82, 82, 75, 88,
+  89, 73, 94, 86, 84, 79, 85, 87, 87, 83,
+  90, 75, 81, 78, 79, 82, 88, 81, 88, 89,
+  89, 81, 75, 77, 87, 76, 90, 75, 79, 85,
+  75, 71, 82, 84, 80, 85, 67, 81, 84, 83,
+  84, 84, 73, 91, 89, 92, 84, 84, 81, 75,
+  77, 83, 93, 80, 72, 81, 79, 72, 87, 94,
+  81, 86, 89, 92, 93, 93, 80, 84, 85, 84,
+  82, 100, 84, 72, 84, 80, 90, 93, 90, 78,
+  80, 83, 87, 79, 77, 90, 82, 78, 75, 93,
+  76, 60, 90, 90, 82, 89, 76, 79, 88, 83,
+  91, 92, 93, 77, 89, 77, 81, 81, 83, 90,
+  101, 82, 78, 79, 81, 82, 84, 94, 82, 103,
+  77, 87, 74, 84, 75, 84, 73, 88, 86, 72,
+  80, 91, 82, 78, 81, 82, 74, 80, 82, 79,
+  85, 73, 83, 80, 96, 90, 77, 85, 93, 89,
+  75, 78, 83, 64, 87, 74, 83, 83, 76, 71,
+  80, 82, 74, 86, 65, 82, 85, 87, 87, 85,
+  92, 89, 79, 94, 81, 88, 83, 71, 75, 88,
+  91, 79, 78, 78, 78, 78, 86, 94, 80, 86,
+  89, 90, 100, 89, 77, 91, 82, 81, 79, 95,
+  82, 76, 86, 76, 84, 93, 84, 78, 82, 81,
+  87, 84, 83, 89, 77, 77, 79, 91, 74, 61,
+  90, 87, 82, 90, 81, 82, 82, 87, 89, 92,
+  93, 73, 88, 76, 74, 77, 79, 90, 102, 84,
+  74, 81, 83, 83, 90, 91, 82, 103, 78, 85,
+  77, 84, 77, 84, 77, 86, 90, 66, 81, 88,
+  82, 78, 82, 80, 79, 79, 81, 82, 87, 72,
+  84, 83, 94, 88, 81, 85, 94, 68, 98, 66,
+  82, 81, 78, 73, 82, 83, 70, 84, 86, 80,
+  68, 79, 78, 82, 71, 81, 78, 75, 102, 82,
+  83, 92, 80, 63, 97, 102, 81, 69, 74, 91,
+  96, 77, 79, 84, 91, 84, 82, 77, 89, 72,
+  91, 88, 93, 79, 87, 73, 85, 84, 77, 78,
+  77, 81, 86, 84, 86, 95, 70, 79, 79, 80,
+  100, 90, 88, 96, 82, 99, 73, 102, 96, 97,
+  82, 86, 77, 77, 76, 73, 84, 79, 84, 111,
+  72, 71, 93, 86, 87, 79, 87, 82, 67, 82,
+  84, 74, 85, 94, 90, 88, 91, 93, 72, 98,
+  95, 85, 77, 99, 93, 71, 71, 71, 65, 96,
+  100, 99, 109, 67, 73, 80, 72, 71, 91, 71,
+  88, 107, 81, 80, 97, 79, 85, 67, 85, 71,
+  77, 74, 86, 73, 59, 86, 92, 78, 77, 77,
+  85, 82, 60, 98, 86, 74, 82, 82, 84, 87,
+  91, 51, 101, 106, 75, 77, 75, 81, 103, 69,
+  87, 79, 83, 88, 86, 82, 84, 70, 88, 75,
+  84, 71, 106, 67, 85, 85, 75, 79, 75, 84,
+  88, 81, 91, 86, 62, 75, 81, 85, 88, 88,
+  87, 86, 81, 106, 86, 117, 103, 94, 95, 75,
+  74, 84, 85, 81, 81, 77, 70, 85, 72, 71,
+  83, 92, 91, 85, 98, 93, 64, 84, 86, 80,
+  89, 93, 88, 83, 91, 89, 71, 104, 104, 82,
+  75, 108, 96, 71, 79, 68, 72, 88, 90, 79,
+  75, 62, 63, 81, 69, 71, 82, 83, 84, 104,
+  68, 74, 92, 83, 80, 61, 81, 89, 80, 75,
+  92, 86, 67, 87, 87, 84, 76, 78, 78, 81,
+  80, 105, 90, 74, 73, 80, 83, 93, 92, 66,
+  92, 79, 85, 83, 73, 68, 94, 79, 88, 86,
+  83, 86, 85, 76, 75, 69, 94, 87, 91, 87,
+  84, 74, 84, 86, 78, 81, 79, 85, 86, 89,
+  83, 89, 72, 86, 79, 81, 99, 89, 86, 89,
+  79, 85, 95, 104, 123, 89, 97, 86, 79, 95,
+  86, 77, 83, 83, 79, 81, 75, 73, 92, 87,
+  84, 82, 87, 95, 72, 82, 75, 79, 83, 97,
+  96, 86, 88, 100, 74, 100, 86, 86, 78, 93,
+  92, 74, 81, 73, 67, 102, 85, 95, 82, 74,
+  81, 75, 78, 76, 92, 78, 88, 99, 86, 80,
+  82, 75, 82, 88, 89, 90, 87, 66, 81, 70,
+  71, 78, 87, 81, 78, 86, 73, 88, 69, 85,
+  88, 77, 92, 82, 81, 93, 66, 50, 107, 101,
+  98, 76, 73, 109, 96, 78, 79, 96, 82, 84,
+  84, 87, 97, 81, 97, 85, 93, 95, 93, 75,
+  81, 87, 76, 73, 76, 85, 86, 90, 85, 107,
+  87, 78, 82, 92, 98, 90, 85, 93, 93, 89,
+  91, 78, 75, 91, 76, 74, 77, 71, 78, 73,
+  81, 72, 78, 85, 74, 78, 91, 82, 86, 70,
+  96, 76, 63, 82, 99, 78, 96, 94, 81, 90,
+  77, 97, 81, 100, 99, 76, 80, 111, 81, 57,
+  76, 81, 71, 93, 82, 82, 103, 63, 64, 91,
+  79, 64, 80, 66, 85, 95, 70, 78, 79, 97,
+  82, 92, 94, 71, 92, 66, 86, 54, 49, 80,
+  95, 75, 95, 86, 81, 87, 56, 90, 90, 78,
+  74, 83, 76, 102, 68, 40, 112, 89, 109, 91,
+  79, 91, 92, 67, 83, 110, 88, 93, 76, 102,
+  101, 83, 100, 66, 90, 76, 114, 66, 84, 81,
+  86, 76, 69, 83, 86, 84, 89, 100, 73, 68,
+  79, 102, 73, 92, 102, 98, 90, 83, 73, 91,
+  73, 95, 83, 60, 77, 76, 70, 83, 79, 76,
+  73, 60, 74, 89, 77, 85, 92, 76, 121, 63,
+  54, 82, 86, 85, 100, 89, 84, 87, 63, 76,
+  88, 106, 111, 73, 78, 121, 86, 60, 89, 81,
+  79, 76, 72, 68, 69, 58, 54, 91, 71, 67,
+  68, 75, 70, 91, 67, 78, 86, 89, 92, 74,
+  82, 95, 87, 69, 84, 69, 66, 78, 81, 81,
+  83, 85, 75, 85, 77, 115, 83, 82, 77, 75,
+  74, 88, 77, 51, 93, 73, 95, 85, 69, 74,
+  98, 79, 88, 87, 83, 84, 83, 82, 88, 75,
+  92, 75, 93, 86, 85, 74, 80, 83, 73, 73,
+  77, 79, 89, 95, 84, 96, 82, 82, 82, 83,
+  100, 85, 82, 88, 85, 93, 94, 81, 103, 86,
+  88, 70, 80, 101, 81, 75, 82, 73, 76, 74,
+  78, 89, 89, 93, 85, 74, 89, 79, 65, 78,
+  88, 69, 95, 98, 85, 85, 80, 86, 80, 102,
+  88, 79, 81, 104, 84, 62, 88, 85, 71, 93,
+  79, 83, 98, 69, 67, 90, 78, 68, 78, 72,
+  81, 96, 71, 81, 74, 78, 74, 83, 75, 93,
+  76, 74, 78, 78, 83, 90, 86, 75, 70, 78,
+  74, 82, 87, 86, 94, 75, 93, 83, 76, 93,
+  90, 65, 87, 84, 94, 79, 79, 110, 93, 85,
+  90, 98, 80, 96, 83, 77, 89, 73, 90, 94,
+  95, 89, 83, 82, 83, 90, 78, 76, 78, 92,
+  92, 84, 84, 100, 96, 76, 88, 77, 96, 86,
+  79, 83, 91, 94, 102, 79, 77, 83, 76, 88,
+  86, 77, 92, 68, 78, 77, 82, 100, 73, 87,
+  105, 72, 97, 78, 84, 83, 72, 80, 104, 76,
+  90, 83, 81, 102, 96, 103, 78, 104, 94, 76,
+  87, 93, 74, 69, 79, 84, 78, 86, 77, 87,
+  81, 72, 79, 91, 91, 68, 79, 60, 97, 80,
+  78, 85, 75, 81, 87, 97, 84, 79, 72, 69,
+  81, 60, 71, 88, 92, 79, 82, 88, 83, 86,
+  78, 102, 88, 81, 83, 78, 72, 98, 86, 52,
+  84, 83, 100, 92, 78, 103, 84, 76, 86, 110,
+  80, 94, 91, 80, 102, 77, 89, 72, 90, 77,
+  94, 78, 81, 89, 81, 75, 78, 84, 86, 77,
+  93, 99, 92, 67, 91, 83, 82, 86, 91, 94,
+  89, 102, 78, 85, 72, 89, 77, 83, 83, 78,
+  84, 69, 75, 75, 76, 76, 76, 108, 92, 79,
+  94, 73, 86, 79, 72, 81, 104, 86, 93, 79,
+  81, 98, 84, 85, 74, 109, 89, 75, 86, 102,
+  61, 66, 82, 87, 73, 85, 80, 83, 76, 68,
+  67, 90, 85, 71, 70, 64, 88, 78, 73, 82,
+  75, 83, 92, 74, 78, 96, 79, 71, 82, 77,
+  79, 87, 89, 81, 76, 82, 78, 81, 85, 105,
+  81, 81, 84, 79, 73, 95, 91, 65, 75, 74,
+  94, 88, 78, 81, 88, 85, 87, 92, 80, 98,
+  86, 78, 93, 75, 88, 78, 91, 85, 82, 78,
+  82, 92, 75, 77, 76, 73, 91, 87, 85, 94,
+  87, 79, 86, 73, 94, 83, 87, 87, 85, 98,
+  77, 80, 96, 81, 85, 85, 84, 98, 91, 69,
+  80, 80, 80, 83, 78, 103, 84, 79, 96, 76,
+  83, 77, 73, 83, 93, 75, 90, 87, 85, 95,
+  92, 77, 81, 107, 89, 77, 87, 92, 78, 72,
+  86, 86, 77, 102, 88, 87, 113, 75, 82, 89,
+  98, 73, 80, 70, 97, 79, 81, 88, 75, 72,
+  81, 86, 82, 98, 64, 95, 91, 96, 67, 81,
+  57, 89, 67, 82, 80, 78, 80, 100, 71, 77,
+  97, 83, 78, 77, 101, 85, 101, 74, 82, 90,
+  78, 91, 109, 84, 92, 100, 77, 82, 82, 74,
+  39, 81, 77, 85, 95, 77, 96, 80, 77, 71,
+  76, 77, 93, 92, 103, 65, 91, 82, 75, 83,
+  84, 58, 65, 73, 71, 88, 85, 85, 108, 80,
+  99, 96, 86, 86, 71, 103, 80, 81, 84, 69,
+  86, 94, 77, 79, 85, 92, 73, 84, 99, 87,
+  75, 84, 120, 76, 77, 76, 76, 88, 81, 101,
+  91, 96, 90, 91, 100, 88, 73, 76, 80, 84,
+  83, 86, 81, 98, 70, 83, 91, 59, 77, 81,
+  84, 87, 94, 102, 80, 77, 87, 86, 69, 82,
+  84, 84, 78, 72, 94, 86, 72, 93, 117, 88,
+  79, 93, 77, 64, 87, 84, 60, 65, 86, 93,
+  96, 70, 105, 90, 107, 85, 100, 81, 61, 99,
+  83, 77, 79, 104, 93, 92, 88, 78, 110, 92,
+  81, 98, 80, 93, 78, 73, 79, 93, 83, 77,
+  81, 90, 64, 69, 79, 92, 92, 76, 81, 69,
+  58, 61, 69, 76, 84, 85, 105, 85, 72, 103,
+  73, 62, 78, 93, 89, 76, 88, 79, 98, 77,
+  78, 82, 93, 93, 77, 79, 67, 81, 79, 88,
+  79, 76, 87, 86, 110, 65, 82, 90, 87, 90,
+  92, 85, 88, 76, 81, 81, 80, 97, 70, 84,
+  85, 108, 69, 81, 82, 64, 86, 86, 76, 66,
+  83, 93, 82, 80, 81, 93, 61, 91, 84, 84,
+  93, 59, 87, 73, 81, 83, 89, 92, 92, 87,
+  75, 78, 81, 81, 81, 82, 86, 82, 93, 82,
+  91, 75, 70, 103, 100, 85, 81, 79, 92, 81,
+  92, 89, 81, 78, 86, 93, 98, 88, 90, 84,
+  76, 92, 66, 79, 85, 83, 92, 102, 83, 87,
+  73, 85, 86, 91, 84, 88, 74, 81, 78, 71,
+  94, 85, 62, 74, 70, 89, 82, 104, 76, 74,
+  82, 71, 83, 101, 92, 87, 93, 70, 94, 86,
+  85, 84, 88, 90, 68, 76, 80, 97, 72, 91,
+  92, 88, 105, 81, 78, 83, 92, 82, 86, 99,
+  62, 86, 82, 88, 80, 98, 83, 80, 101, 83,
+  75, 86, 76, 85, 94, 82, 82, 83, 80, 78,
+  96, 88, 65, 86, 76, 75, 91, 72, 67, 97,
+  90, 86, 77, 74, 59, 74, 64, 88, 84, 84,
+  83, 84, 89, 81, 77, 82, 84, 97, 68, 79,
+  88, 73, 88, 104, 86, 75, 68, 77, 80, 82,
+  79, 90, 69, 77, 16, 79, 92, 88, 99, 64,
+  105, 86, 88, 72, 84, 85, 80, 60, 118, 72,
+  92, 90, 79, 79, 93, 68, 52, 91, 78, 88,
+  89, 81, 60, 71, 95, 88, 91, 103, 77, 70,
+  81, 90, 86, 84, 82, 93, 86, 81, 73, 79,
+  83, 110, 118, 61, 71, 90, 113, 80, 74, 81,
+  69, 93, 82, 68, 85, 97, 94, 81, 90, 93,
+  82, 83, 80, 70, 99, 83, 75, 79, 79, 85,
+  91, 77, 82, 86, 82, 107, 98, 90, 82, 83,
+  75, 90, 77, 79, 73, 103, 59, 86, 82, 99,
+  67, 86, 67, 71, 69, 74, 76, 80, 74, 109,
+  68, 75, 78, 91, 76, 73, 108, 81, 124, 65,
+  73, 90, 65, 79, 94, 95, 77, 87, 80, 76,
+  79, 65, 79, 66, 82, 95, 73, 86, 85, 76,
+  77, 72, 87, 70, 104, 94, 95, 53, 80, 74,
+  91, 86, 80, 59, 55, 65, 50, 94, 74, 102,
+  142, 69, 86, 87, 84, 80, 72, 92, 79, 63,
+  78, 67, 82, 98, 60, 80, 91, 105, 49, 71,
+  98, 87, 68, 72, 127, 72, 84, 74, 71, 71,
+  84, 116, 89, 92, 90, 89, 106, 74, 72, 64,
+  77, 102, 80, 100, 70, 88, 60, 74, 73, 57,
+  77, 86, 67, 74, 83, 87, 69, 72, 78, 91,
+  64, 91, 87, 76, 80, 66, 90, 87, 80, 91,
+  118, 82, 81, 85, 75, 72, 83, 80, 81, 68,
+  86, 94, 91, 83, 106, 88, 88, 95, 103, 83,
+  66, 91, 79, 80, 84, 90, 87, 91, 84, 81,
+  113, 91, 81, 100, 66, 87, 77, 82, 86, 102,
+  96, 89, 82, 101, 66, 72, 84, 83, 83, 84,
+  70, 94, 71, 71, 84, 84, 72, 77, 69, 89,
+  79, 102, 71, 74, 76, 78, 80, 92, 91, 83,
+  100, 87, 83, 88, 90, 88, 78, 80, 67, 75,
+  86, 103, 66, 90, 92, 85, 99, 67, 81, 85,
+  82, 86, 86, 77, 65, 75, 73, 88, 87, 89,
+  73, 81, 86, 96, 83, 79, 75, 78, 90, 92,
+  83, 70, 85, 81, 87, 77, 79, 79, 88, 68,
+  99, 83, 98, 98, 85, 75, 73, 81, 74, 71,
+  81, 93, 77, 93, 67, 71, 91, 82, 84, 81,
+  91, 88, 63, 69, 71, 83, 81, 89, 100, 74,
+  67, 83, 78, 89, 99, 100, 70, 89, 70, 103,
+  91, 87, 95, 78, 108, 82, 94, 92, 75, 80,
+  67, 89, 103, 101, 89, 84, 72, 77, 92, 74,
+  74, 115, 85, 68, 91, 91, 79, 81, 84, 90,
+  83, 75, 87, 69, 88, 97, 103, 94, 81, 82,
+  99, 86, 78, 81, 104, 116, 73, 80, 79, 82,
+  98, 92, 72, 93, 77, 87, 94, 65, 70, 107,
+  88, 74, 87, 94, 87, 86, 91, 81, 79, 81,
+  82, 89, 88, 85, 101, 91, 71, 84, 76, 96,
+  81, 95, 77, 101, 75, 90, 104, 67, 71, 82,
+  73, 99, 87, 96, 76, 93, 55, 80, 67, 76,
+  77, 84, 81, 99, 73, 92, 84, 92, 89, 84,
+  86, 82, 88, 54, 79, 105, 81, 67, 75, 92,
+  77, 86, 66, 68, 80, 72, 65, 69, 82, 82,
+  84, 80, 88, 77, 103, 82, 97, 74, 94, 63,
+  119, 74, 98, 88, 95, 78, 94, 78, 68, 84,
+  66, 83, 77, 84, 92, 68, 96, 87, 91, 98,
+  72, 82, 73, 66, 89, 86, 81, 102, 81, 88,
+  78, 95, 79, 96, 107, 73, 75, 80, 119, 72,
+  80, 78, 57, 86, 90, 76, 86, 94, 93, 79,
+  110, 91, 78, 74, 80, 85, 83, 96, 82, 76,
+  81, 76, 92, 75, 74, 86, 77, 94, 82, 91,
+  82, 90, 80, 80, 77, 79, 87, 74, 78, 75,
+  82, 96, 78, 93, 123, 76, 63, 66, 70, 72,
+  86, 91, 85, 86, 83, 90, 86, 82, 97, 87,
+  80, 86, 93, 88, 72, 91, 88, 91, 92, 88,
+  90, 92, 87, 76, 101, 88, 79, 104, 65, 103,
+  83, 82, 89, 100, 96, 78, 89, 80, 79, 66,
+  92, 81, 94, 84, 83, 98, 69, 78, 70, 80,
+  80, 85, 104, 81, 89, 93, 73, 82, 77, 77,
+  80, 77, 91, 81, 93, 94, 80, 83, 88, 99,
+  72, 79, 89, 79, 86, 99, 83, 91, 88, 78,
+  73, 74, 82, 94, 84, 88, 80, 85, 80, 85,
+  71, 84, 87, 83, 70, 75, 84, 81, 91, 78,
+  82, 77, 90, 87, 83, 74, 85, 82, 84, 84,
+  70, 77, 81, 86, 62, 97, 86, 76, 91, 101,
+  80, 88, 89, 87, 73, 80, 77, 75, 87, 86,
+  78, 84, 85, 91, 87, 93, 83, 88, 98, 99,
+  76, 86, 73, 89, 75, 95, 94, 89, 81, 64,
+  97, 76, 84, 75, 75, 83, 81, 108, 75, 80,
+  73, 86, 94, 84, 92, 83, 90, 80, 79, 93,
+  89, 105, 85, 84, 94, 72, 76, 78, 77, 86,
+  86, 82, 82, 80, 84, 76, 91, 80, 88, 84,
+  86, 81, 92, 73, 73, 93, 81, 108, 84, 95,
+  79, 80, 77, 87, 104, 89, 80, 73, 100, 102,
+  93, 104, 89, 85, 85, 93, 90, 90, 83, 79,
+  74, 88, 77, 86, 77, 85, 73, 78, 83, 90,
+  79, 82, 103, 96, 71, 90, 83, 82, 69, 91,
+  72, 77, 48, 93, 91, 68, 82, 85, 80, 102,
+  112, 65, 81, 75, 80, 93, 80, 85, 89, 74,
+  91, 85, 91, 97, 80, 64, 102, 98, 88, 82,
+  90, 79, 98, 82, 88, 93, 71, 81, 85, 96,
+  90, 86, 66, 80, 71, 106, 55, 95, 69, 83,
+  99, 87, 80, 72, 79, 71, 81, 93, 90, 76,
+  72, 108, 85, 76, 96, 88, 59, 68, 79, 80,
+  76, 85, 87, 68, 88, 102, 74, 93, 92, 86,
+  101, 76, 87, 88, 82, 97, 82, 88, 53, 67,
+  75, 89, 75, 96, 81, 70, 74, 95, 76, 84,
+  76, 86, 73, 89, 87, 88, 74, 76, 93, 86,
+  69, 83, 82, 96, 73, 77, 89, 99, 83, 85,
+  89, 85, 65, 88, 87, 100, 73, 83, 93, 90,
+  65, 73, 85, 80, 91, 95, 73, 88, 84, 83,
+  69, 87, 81, 71, 82, 81, 80, 87, 95, 91,
+  93, 87, 90, 87, 90, 82, 83, 87, 76, 79,
+  90, 78, 87, 87, 81, 71, 87, 80, 73, 80,
+  74, 85, 92, 74, 85, 79, 69, 79, 85, 77,
+  85, 86, 76, 80, 80, 91, 88, 102, 93, 80,
+  86, 67, 86, 81, 83, 80, 78, 79, 74, 75,
+  90, 84, 95, 91, 84, 78, 82, 78, 103, 86,
+  75, 97, 79, 102, 85, 84, 74, 77, 80, 91,
+  113, 85, 75, 81, 78, 98, 90, 76, 91, 85,
+  85, 93, 87, 93, 83, 76, 89, 85, 80, 74,
+  84, 107, 98, 77, 90, 89, 77, 82, 90, 95,
+  69, 97, 80, 83, 89, 68, 87, 75, 63, 88,
+  82, 82, 86, 93, 77, 83, 80, 76, 69, 76,
+  76, 78, 83, 86, 83, 97, 95, 92, 79, 87,
+  83, 82, 100, 95, 74, 86, 74, 92, 69, 104,
+  84, 89, 82, 61, 100, 67, 80, 75, 87, 76,
+  74, 113, 78, 80, 75, 96, 79, 76, 93, 81,
+  89, 75, 79, 92, 80, 102, 80, 80, 83, 70,
+  84, 77, 73, 81, 85, 80, 91, 86, 86, 80,
+  86, 77, 78, 74, 79, 78, 80, 68, 73, 92,
+  83, 103, 78, 84, 73, 80, 77, 77, 101, 82,
+  83, 77, 84, 94, 90, 105, 90, 82, 94, 103,
+  92, 90, 74, 72, 80, 92, 75, 80, 79, 79,
+  81, 78, 72, 82, 88, 80, 100, 87, 70, 91,
+  70, 81, 91, 95, 81, 73, 47, 81, 96, 77,
+  81, 76, 78, 93, 138, 64, 87, 77, 86, 91,
+  78, 84, 91, 97, 73, 94, 82, 89, 78, 62,
+  101, 88, 97, 87, 94, 85, 89, 80, 72, 92,
+  80, 74, 80, 112, 97, 92, 77, 60, 67, 99,
+  50, 88, 72, 83, 94, 81, 76, 76, 74, 67,
+  75, 89, 79, 70, 65, 123, 57, 80, 93, 80,
+  63, 59, 72, 75, 71, 94, 84, 65, 83, 106,
+  62, 85, 93, 79, 107, 65, 92, 91, 75, 76,
+  91, 80, 54, 51, 69, 81, 60, 88, 83, 73,
+  75, 81, 51, 76, 70, 82, 79, 96, 87, 87,
+  77, 68, 109, 92, 69, 73, 81, 80, 72, 88,
+  98, 80, 75, 86, 90, 77, 63, 80, 77, 108,
+  83, 82, 87, 82, 76, 91, 74, 81, 91, 90,
+  71, 80, 73, 83, 63, 84, 83, 73, 84, 80,
+  77, 108, 79, 92, 80, 83, 88, 87, 93, 81,
+  63, 86, 74, 88, 89, 84, 79, 87, 72, 67,
+  101, 67, 81, 77, 89, 77, 78, 63, 88, 82,
+  72, 86, 70, 74, 89, 85, 81, 77, 84, 88,
+  79, 107, 87, 73, 86, 63, 89, 82, 78, 77,
+  88, 77, 84, 83, 89, 88, 87, 104, 79, 72,
+  75, 74, 95, 96, 72, 95, 79, 101, 73, 81,
+  73, 87, 82, 85, 120, 85, 80, 84, 68, 96,
+  99, 81, 92, 84, 94, 100, 88, 93, 74, 65,
+  83, 94, 78, 82, 77, 97, 108, 74, 75, 91,
+  62, 83, 80, 92, 70, 94, 71, 75, 99, 73,
+  96, 83, 69, 83, 87, 87, 97, 86, 79, 87,
+  92, 79, 76, 80, 82, 74, 86, 87, 78, 96,
+  94, 93, 85, 82, 83, 81, 89, 82, 91, 87,
+  78, 91, 74, 98, 75, 91, 78, 68, 88, 84,
+  85, 73, 84, 75, 86, 103, 76, 87, 74, 92,
+  84, 67, 95, 83, 85, 74, 82, 96, 80, 95,
+  86, 96, 85, 68, 89, 82, 73, 85, 91, 83,
+  105, 91, 88, 89, 88, 78, 84, 79, 76, 76,
+  87, 77, 80, 85, 83, 105, 85, 82, 76, 94,
+  77, 82, 90, 89, 85, 86, 81, 88, 87, 108,
+  93, 82, 98, 97, 97, 95, 79, 78, 97, 85,
+  84, 77, 88, 78, 71, 82, 83, 83, 97, 79,
+  98, 90, 76, 94, 74, 84, 86, 98, 93, 82,
+  55, 78, 90, 82, 97, 75, 76, 93, 135, 72,
+  88, 83, 89, 89, 75, 75, 87, 100, 81, 97,
+  76, 75, 73, 59, 90, 91, 80, 89, 88, 83,
+  86, 87, 76, 95, 84, 78, 87, 92, 84, 92,
+  70, 58, 76, 89, 46, 95, 72, 94, 94, 67,
+  82, 87, 70, 65, 79, 91, 77, 74, 75, 131,
+  84, 76, 92, 82, 71, 80, 100, 77, 91, 94,
+  83, 65, 86, 94, 72, 80, 87, 75, 97, 81,
+  88, 92, 77, 87, 90, 73, 55, 78, 72, 78,
+  61, 89, 75, 79, 87, 78, 71, 95, 72, 78,
+  82, 108, 86, 87, 66, 76, 104, 93, 69, 75,
+  88, 78, 84, 87, 104, 75, 75, 82, 94, 73,
+  66, 88, 78, 91, 96, 96, 67, 83, 77, 88,
+  87, 86, 96, 87, 70, 84, 93, 90, 72, 86,
+  88, 73, 88, 79, 86, 98, 82, 92, 78, 83,
+  85, 88, 81, 82, 81, 88, 81, 79, 83, 81,
+  75, 90, 92, 72, 89, 83, 72, 75, 85, 66,
+  78, 58, 86, 86, 75, 88, 78, 71, 93, 90,
+  80, 77, 79, 94, 84, 92, 94, 85, 81, 65,
+  91, 83, 77, 86, 92, 81, 90, 91, 90, 88,
+  82, 93, 74, 79, 74, 78, 96, 96, 81, 91,
+  75, 91, 78, 82, 75, 97, 80, 85, 100, 92,
+  82, 88, 89, 83, 90, 94, 92, 83, 99, 98,
+  92, 96, 87, 73, 84, 91, 85, 83, 72, 85,
+  106, 80, 85, 92, 65, 82, 84, 93, 71, 96,
+  72, 85, 88, 72, 95, 80, 78, 72, 79, 76,
+  86, 91, 97, 76, 86, 95, 80, 78, 78, 79,
+  79, 82, 76, 93, 77, 79, 99, 88, 96, 85,
+  87, 82, 80, 93, 84, 101, 81, 73, 81, 89,
+  80, 86, 94, 84, 99, 84, 95, 81, 88, 81,
+  86, 80, 97, 83, 82, 62, 71, 72, 86, 84,
+  89, 81, 68, 91, 92, 77, 84, 66, 84, 91,
+  95, 82, 91, 87, 96, 73, 96, 85, 92, 84,
+  76, 85, 74, 85, 93, 97, 83, 85, 92, 87,
+  78, 91, 86, 81, 82, 81, 76, 66, 82, 91,
+  83, 93, 91, 85, 87, 79, 82, 97, 78, 86,
+  84, 77, 79, 87, 99, 78, 94, 79, 91, 84,
+  89, 67, 90, 72, 85, 82, 90, 85, 81, 69,
+  89, 76, 83, 83, 92, 77, 76, 71, 81, 85,
+  89, 79, 93, 92, 78, 73, 80, 82, 76, 90,
+  87, 100, 77, 79, 98, 90, 92, 83, 88, 81,
+  79, 82, 66, 106, 79, 81, 82, 73, 90, 91,
+  95, 92, 83, 97, 101, 62, 81, 76, 84, 92,
+  99, 87, 81, 60, 63, 91, 79, 89, 96, 89,
+  66, 73, 92, 78, 83, 68, 89, 108, 97, 86,
+  84, 102, 89, 79, 105, 73, 88, 83, 82, 78,
+  77, 88, 92, 95, 86, 90, 85, 99, 85, 85,
+  78, 81, 76, 70, 69, 66, 76, 98, 83, 83,
+  92, 103, 94, 78, 67, 108, 84, 89, 81, 86,
+  83, 81, 107, 80, 90, 77, 76, 80, 78, 69,
+  86, 75, 80, 93, 85, 79, 75, 66, 87, 82,
+  83, 87, 80, 77, 73, 79, 89, 91, 96, 82,
+  88, 77, 79, 79, 82, 82, 81, 85, 96, 94,
+  80, 84, 89, 85, 93, 88, 86, 80, 83, 85,
+  74, 89, 75, 97, 84, 83, 91, 89, 94, 86,
+  67, 86, 95, 77, 87, 79, 86, 80, 97, 86,
+  82, 68, 71, 90, 85, 84, 88, 82, 72, 81,
+  88, 79, 77, 72, 81, 94, 99, 83, 86, 89,
+  97, 75, 96, 82, 93, 73, 84, 82, 74, 86,
+  92, 88, 84, 84, 78, 86, 79, 89, 87, 86,
+  81, 77, 73, 67, 80, 93, 87, 92, 89, 98,
+  89, 78, 83, 94, 77, 82, 82, 78, 78, 85,
+  101, 88, 76, 82, 87, 80, 84, 70, 92, 75,
+  87, 84, 89, 82, 88, 67, 91, 71, 89, 77,
+  92, 75, 88, 79, 74, 92, 98, 76, 89, 83,
+  82, 78, 79, 77, 75, 90, 80, 94, 71, 78,
+  101, 85, 76, 89, 90, 86, 91, 90, 73, 127,
+  74, 71, 73, 74, 87, 77, 96, 87, 123, 92,
+  106, 80, 80, 80, 80, 76, 89, 81, 80, 64,
+  65, 82, 87, 90, 88, 90, 75, 83, 91, 73,
+  76, 70, 79, 97, 82, 81, 90, 83, 85, 75,
+  88, 91, 82, 84, 77, 84, 77, 90, 84, 96,
+  83, 82, 88, 95, 74, 89, 72, 87, 84, 73,
+  71, 70, 78, 95, 69, 87, 78, 82, 87, 81,
+  85, 93, 79, 88, 81, 80, 80, 94, 111, 82,
+  88, 74, 84, 75, 84, 72, 78, 79, 77, 89,
+  86, 77, 87, 58, 91, 77, 74, 80, 101, 70,
+  90, 73, 69, 85, 93, 76, 90, 92, 76, 79,
+  80, 74, 68, 109, 100, 97, 74, 84, 97, 89,
+  70, 81, 91, 84, 88, 70, 60, 132, 93, 83,
+  77, 66, 92, 87, 121, 101, 100, 108, 123, 58,
+  80, 72, 86, 95, 85, 85, 79, 59, 54, 92,
+  84, 98, 95, 99, 67, 62, 97, 80, 73, 77,
+  83, 117, 83, 70, 78, 98, 77, 77, 98, 72,
+  73, 88, 83, 79, 82, 97, 81, 78, 87, 85,
+  85, 98, 79, 78, 67, 82, 76, 56, 64, 64,
+  69, 95, 74, 77, 86, 88, 88, 82, 73, 95,
+  85, 91, 69, 84, 87, 84, 113, 80, 90, 59,
+  71, 68, 70, 80, 82, 70, 70, 106, 76, 74,
+  74, 60, 90, 89, 84, 83, 92, 69, 88, 80,
+  75, 92, 98, 79, 92, 87, 79, 79, 82, 78,
+  76, 102, 118, 92, 87, 86, 88, 88, 77, 86,
+  89, 79, 91, 74, 68, 99, 76, 100, 75, 75,
+  95, 83, 101, 88, 74, 92, 111, 73, 76, 76,
+  80, 79, 86, 88, 78, 68, 66, 82, 85, 90,
+  84, 88, 75, 75, 91, 78, 74, 76, 81, 99,
+  85, 76, 85, 85, 86, 77, 91, 85, 87, 80,
+  80, 86, 77, 92, 86, 76, 86, 83, 81, 89,
+  73, 86, 71, 75, 82, 74, 71, 71, 77, 96,
+  85, 85, 77, 93, 85, 81, 81, 89, 80, 82,
+  77, 78, 90, 91, 110, 85, 81, 69, 92, 76,
+  79, 79, 94, 80, 77, 87, 83, 84, 88, 63,
+  84, 76, 78, 84, 71, 82, 88, 86, 85, 85,
+  102, 77, 88, 64, 77, 89, 78, 80, 92, 85,
+  78, 83, 75, 80, 84, 81, 88, 86, 84, 78,
+  81, 93, 90, 108, 80, 79, 84, 85, 81, 72,
+  98, 72, 109, 80, 95, 90, 84, 86, 71, 69,
+  90, 75, 78, 75, 77, 85, 88, 82, 81, 87,
+  78, 87, 85, 84, 77, 68, 75, 80, 76, 78,
+  82, 84, 89, 77, 89, 89, 88, 94, 92, 84,
+  76, 89, 88, 88, 79, 87, 89, 83, 81, 83,
+  75, 86, 85, 83, 78, 75, 86, 92, 72, 96,
+  82, 82, 88, 79, 96, 85, 81, 83, 83, 75,
+  94, 85, 100, 84, 85, 86, 77, 77, 82, 72,
+  81, 78, 84, 80, 85, 87, 92, 77, 81, 80,
+  77, 79, 75, 75, 90, 77, 81, 86, 100, 80,
+  86, 84, 74, 93, 77, 87, 90, 93, 96, 76,
+  84, 79, 82, 83, 87, 85, 90, 80, 77, 83,
+  81, 103, 85, 81, 82, 87, 81, 74, 119, 67,
+  100, 93, 103, 80, 77, 81, 69, 71, 92, 79,
+  74, 76, 70, 90, 91, 86, 83, 85, 70, 73,
+  98, 73, 75, 68, 80, 83, 76, 76, 80, 86,
+  85, 78, 91, 75, 81, 85, 90, 82, 79, 102,
+  80, 84, 85, 90, 88, 78, 90, 87, 70, 88,
+  90, 75, 73, 76, 76, 95, 73, 87, 83, 71,
+  79, 77, 98, 74, 81, 85, 80, 77, 101, 77,
+  101, 82, 88, 75, 75, 79, 77, 80, 94, 71,
+  76, 78, 79, 92, 93, 81, 84, 86, 82, 84,
+  73, 78, 89, 85, 83, 88, 102, 77, 90, 87,
+  74, 87, 77, 83, 95, 91, 101, 81, 91, 82,
+  77, 86, 90, 86, 82, 83, 84, 81, 88, 94,
+  79, 87, 83, 85, 82, 75, 103, 72, 76, 80,
+  100, 81, 76, 88, 73, 69, 88, 82, 78, 80,
+  76, 80, 88, 83, 79, 82, 77, 81, 89, 80,
+  79, 72, 79, 79, 78, 82, 76, 86, 90, 75,
+  92, 85, 88, 80, 84, 84, 76, 86, 86, 84,
+  84, 90, 85, 79, 79, 80, 74, 75, 87, 85,
+  77, 77, 85, 93, 84, 90, 82, 73, 89, 77,
+  96, 86, 84, 80, 83, 77, 105, 84, 100, 83,
+  88, 82, 90, 80, 83, 79, 93, 80, 81, 82,
+  81, 96, 91, 83, 84, 84, 88, 81, 83, 77,
+  74, 95, 93, 72, 86, 90, 110, 87, 58, 104,
+  75, 82, 83, 99, 70, 99, 98, 102, 66, 85,
+  102, 70, 85, 81, 83, 74, 109, 79, 86, 84,
+  86, 97, 82, 95, 83, 59, 87, 75, 79, 106,
+  81, 86, 87, 93, 84, 119, 88, 77, 113, 90,
+  85, 85, 98, 81, 78, 79, 85, 58, 66, 99,
+  82, 87, 77, 62, 94, 70, 109, 86, 68, 83,
+  85, 95, 71, 74, 107, 85, 95, 101, 69, 90,
+  85, 64, 115, 67, 96, 100, 71, 75, 94, 65,
+  67, 78, 93, 104, 71, 76, 81, 71, 84, 84,
+  82, 100, 77, 106, 80, 57, 90, 76, 81, 90,
+  79, 72, 87, 94, 63, 94, 100, 94, 116, 92,
+  78, 128, 89, 72, 86, 83, 84, 73, 70, 81,
+  85, 86, 82, 101, 83, 73, 64, 85, 76, 101,
+  89, 106, 70, 92, 117, 82, 78, 72, 105, 83,
+  91, 84, 94, 93, 111, 77, 80, 89, 69, 100,
+  107, 73, 84, 69, 76, 72, 87, 81, 75, 76,
+  84, 84, 85, 76, 80, 80, 88, 83, 95, 80,
+  85, 82, 84, 86, 93, 69, 55, 89, 112, 103,
+  78, 78, 88, 81, 93, 89, 74, 80, 88, 109,
+  67, 61, 85, 85, 87, 124, 81, 88, 80, 77,
+  75, 74, 96, 91, 88, 76, 86, 78, 81, 73,
+  85, 82, 75, 71, 83, 81, 83, 83, 83, 90,
+  73, 107, 74, 81, 95, 80, 73, 86, 83, 78,
+  88, 80, 74, 86, 89, 87, 78, 89, 83, 92,
+  90, 74, 99, 84, 83, 87, 69, 75, 84, 86,
+  79, 92, 86, 76, 71, 84, 76, 96, 84, 90,
+  88, 83, 89, 75, 86, 73, 88, 83, 83, 87,
+  95, 94, 91, 73, 78, 93, 73, 90, 105, 74,
+  85, 74, 71, 74, 91, 76, 79, 88, 87, 81,
+  80, 73, 80, 85, 77, 91, 84, 78, 76, 90,
+  87, 94, 95, 71, 70, 82, 89, 105, 81, 85,
+  85, 87, 84, 86, 86, 76, 92, 89, 78, 71,
+  70, 80, 79, 109, 93, 79, 91, 84, 71, 79,
+  84, 102, 94, 79, 83, 89, 88, 88, 82, 69,
+  84, 86, 89, 84, 84, 93, 82, 77, 70, 92,
+  82, 111, 86, 80, 76, 83, 80, 81, 86, 75,
+  83, 78, 76, 84, 66, 89, 78, 72, 84, 72,
+  84, 83, 84, 68, 68, 89, 79, 79, 87, 88,
+  93, 79, 59, 81, 82, 102, 85, 107, 68, 85,
+  110, 86, 77, 67, 101, 76, 94, 83, 87, 81,
+  106, 81, 77, 82, 80, 97, 95, 75, 89, 71,
+  79, 74, 83, 90, 77, 79, 83, 83, 71, 88,
+  82, 75, 87, 85, 95, 77, 88, 80, 83, 86,
+  105, 65, 56, 82, 107, 112, 81, 100, 79, 71,
+  96, 98, 70, 88, 85, 105, 72, 77, 88, 71,
+  89, 115, 74, 84, 88, 79, 69, 79, 91, 103,
+  84, 75, 91, 81, 84, 75, 86, 87, 87, 85,
+  87, 83, 70, 86, 86, 87, 64, 96, 70, 99,
+  92, 79, 90, 86, 84, 79, 85, 83, 76, 84,
+  83, 81, 84, 86, 83, 89, 86, 75, 87, 82,
+  89, 77, 82, 76, 72, 91, 79, 97, 74, 66,
+  86, 78, 89, 101, 83, 98, 90, 78, 100, 72,
+  93, 78, 78, 83, 95, 88, 101, 92, 78, 78,
+  69, 79, 60, 90, 119, 70, 86, 75, 65, 92,
+  96, 77, 75, 71, 83, 68, 81, 68, 74, 91,
+  71, 76, 85, 84, 70, 88, 81, 82, 101, 73,
+  60, 75, 92, 103, 88, 90, 75, 81, 70, 84,
+  84, 72, 91, 98, 68, 84, 81, 86, 77, 95,
+  98, 84, 81, 95, 61, 71, 73, 70, 78, 84,
+  70, 101, 90, 90, 80, 67, 67, 69, 90, 90,
+  80, 89, 76, 72, 66, 77, 85, 111, 85, 77,
+  81, 70, 77, 78, 81, 78, 86, 70, 67, 72,
+  66, 88, 84, 56, 94, 76, 88, 82, 91, 80,
+  80, 77, 79, 90, 86, 86, 91, 80, 91, 84,
+  86, 81, 83, 73, 96, 79, 66, 76, 89, 72,
+  80, 84, 92, 93, 93, 82, 78, 79, 81, 79,
+  64, 75, 98, 79, 83, 86, 76, 83, 88, 78,
+  86, 82, 87, 72, 82, 76, 79, 97, 62, 87,
+  75, 88, 76, 86, 85, 91, 91, 79, 78, 82,
+  77, 73, 92, 79, 82, 87, 73, 85, 89, 75,
+  90, 89, 86, 95, 73, 82, 82, 79, 92, 78,
+  87, 95, 70, 80, 78, 88, 87, 83, 72, 87,
+  87, 104, 81, 82, 83, 88, 91, 89, 85, 91,
+  82, 72, 82, 81, 91, 101, 80, 76, 79, 77,
+  82, 77, 85, 88, 98, 72, 79, 76, 68, 89,
+  77, 70, 95, 79, 88, 75, 86, 73, 79, 84,
+  79, 84, 89, 83, 92, 86, 71, 74, 89, 100,
+  86, 95, 72, 81, 98, 83, 94, 75, 87, 88,
+  86, 85, 90, 90, 91, 92, 72, 76, 78, 85,
+  99, 79, 88, 79, 81, 77, 83, 87, 84, 81,
+  80, 81, 78, 82, 75, 83, 86, 86, 92, 87,
+  88, 84, 80, 74, 99, 81, 65, 87, 93, 83,
+  88, 83, 83, 82, 80, 88, 76, 82, 86, 104,
+  71, 87, 80, 76, 80, 107, 82, 86, 89, 83,
+  73, 81, 84, 81, 93, 85, 84, 88, 94, 86,
+  85, 78, 83, 79, 87, 86, 84, 86, 89, 81,
+  75, 83, 73, 91, 84, 81, 91, 86, 72, 81,
+  88, 78, 87, 73, 77, 73, 78, 94, 81, 82,
+  89, 81, 84, 72, 84, 76, 82, 77, 71, 89,
+  86, 94, 81, 81, 92, 80, 90, 93, 78, 83,
+  93, 77, 93, 79, 98, 77, 78, 90, 92, 92,
+  93, 86, 77, 91, 76, 75, 76, 82, 97, 78,
+  92, 81, 76, 83, 84, 82, 85, 76, 83, 76,
+  89, 73, 75, 93, 70, 78, 79, 94, 81, 86,
+  82, 81, 93, 78, 84, 83, 87, 73, 98, 74,
+  84, 92, 74, 81, 84, 77, 86, 91, 68, 92,
+  80, 89, 79, 92, 86, 89, 81, 97, 74, 69,
+  78, 76, 88, 90, 75, 91, 89, 93, 74, 78,
+  79, 74, 87, 88, 82, 86, 91, 74, 80, 80,
+  86, 83, 79, 81, 81, 75, 74, 81, 86, 85,
+  98, 73, 79, 72, 68, 92, 74, 71, 80, 79,
+  84, 79, 82, 74, 76, 79, 73, 97, 87, 95,
+  100, 82, 91, 78, 79, 88, 81, 73, 92, 82,
+  87, 87, 98, 76, 85, 91, 86, 92, 84, 84,
+  81, 96, 79, 82, 84, 81, 93, 85, 87, 84,
+  85, 79, 79, 80, 84, 88, 82, 80, 83, 94,
+  82, 94, 73, 82, 76, 88, 91, 85, 86, 88,
+  91, 78, 92, 90, 91, 74, 97, 84, 91, 93,
+  83, 82, 91, 78, 86, 85, 75, 88, 77, 84,
+  84, 98, 81, 75, 84, 91, 84, 77, 86, 83,
+  96, 89, 81, 76, 83, 89, 76, 93, 86, 89,
+  95, 84, 79, 87, 89, 80, 79, 78, 82, 77,
+  79, 85, 79, 76, 96, 86, 89, 90, 94, 80,
+  91, 73, 81, 87, 77, 84, 80, 98, 87, 75,
+  95, 89, 91, 104, 89, 69, 72, 84, 88, 92,
+  75, 88, 88, 83, 97, 72, 82, 82, 73, 75,
+  82, 87, 82, 82, 73, 65, 78, 85, 101, 97,
+  70, 85, 76, 89, 53, 107, 89, 62, 82, 86,
+  91, 104, 74, 92, 101, 87, 89, 91, 67, 83,
+  67, 93, 92, 95, 85, 66, 75, 74, 77, 77,
+  71, 115, 92, 79, 95, 76, 97, 66, 87, 88,
+  74, 91, 75, 73, 93, 102, 82, 102, 91, 79,
+  94, 83, 82, 74, 88, 96, 79, 93, 85, 90,
+  91, 88, 57, 80, 86, 107, 90, 75, 76, 101,
+  91, 86, 92, 86, 80, 97, 98, 71, 94, 76,
+  83, 109, 81, 82, 93, 93, 70, 84, 91, 86,
+  91, 89, 81, 90, 63, 92, 82, 94, 72, 99,
+  78, 117, 89, 92, 85, 81, 60, 73, 65, 87,
+  82, 73, 109, 106, 81, 77, 95, 84, 71, 93,
+  91, 93, 90, 69, 61, 96, 85, 90, 72, 106,
+  62, 111, 70, 78, 89, 51, 77, 70, 89, 89,
+  57, 84, 91, 70, 102, 70, 78, 83, 81, 87,
+  112, 89, 78, 84, 84, 78, 82, 71, 71, 86,
+  79, 88, 82, 73, 95, 71, 107, 74, 78, 109,
+  63, 79, 63, 87, 82, 98, 77, 93, 83, 96,
+  79, 84, 73, 82, 112, 80, 68, 87, 109, 79,
+  64, 71, 80, 89, 70, 49, 98, 99, 76, 86,
+  103, 77, 65, 77, 80, 69, 104, 90, 64, 88,
+  92, 81, 85, 71, 74, 80, 89, 103, 93, 78,
+  79, 73, 79, 72, 95, 79, 74, 94, 80, 88,
+  91, 91, 75, 89, 126, 86, 60, 79, 75, 78,
+  93, 87, 90, 78, 79, 93, 78, 80, 102, 91,
+  77, 101, 84, 95, 83, 93, 80, 82, 70, 99,
+  82, 81, 92, 66, 82, 85, 86, 87, 74, 99,
+  70, 92, 79, 96, 80, 76, 90, 83, 86, 84,
+  91, 78, 109, 66, 76, 102, 62, 79, 95, 82,
+  74, 112, 82, 88, 89, 77, 67, 81, 74, 77,
+  71, 69, 84, 99, 79, 84, 80, 81, 87, 93,
+  72, 83, 94, 86, 82, 90, 92, 79, 81, 81,
+  92, 76, 83, 70, 80, 99, 87, 89, 73, 80,
+  67, 85, 93, 81, 73, 79, 81, 109, 89, 83,
+  87, 83, 88, 89, 88, 77, 93, 81, 79, 85,
+  83, 90, 66, 93, 89, 74, 73, 109, 89, 89,
+  83, 77, 75, 72, 57, 88, 83, 78, 101, 103,
+  58, 80, 77, 85, 74, 87, 100, 89, 97, 74,
+  68, 87, 75, 77, 72, 90, 93, 92, 76, 84,
+  85, 63, 82, 69, 95, 89, 77, 75, 91, 72,
+  83, 67, 81, 74, 88, 107, 100, 71, 85, 74,
+  92, 74, 82, 56, 49, 86, 79, 94, 82, 97,
+  101, 72, 95, 79, 86, 102, 72, 70, 91, 70,
+  85, 81, 77, 91, 81, 84, 84, 81, 75, 91,
+  87, 86, 71, 89, 107, 69, 73, 75, 93, 81,
+  84, 72, 93, 96, 95, 82, 84, 80, 75, 75,
+  83, 70, 86, 88, 90, 101, 79, 81, 79, 86,
+  83, 84, 82, 98, 87, 78, 79, 75, 86, 72,
+  123, 95, 69, 91, 55, 98, 80, 102, 80, 75,
+  65, 80, 55, 80, 81, 73, 96, 111, 70, 83,
+  98, 81, 71, 72, 113, 93, 118, 77, 62, 93,
+  62, 74, 66, 98, 90, 81, 68, 63, 96, 56,
+  67, 56, 90, 66, 84, 86, 78, 64, 81, 68,
+  80, 65, 97, 78, 100, 61, 76, 80, 106, 79,
+  72, 59, 62, 63, 60, 86, 74, 117, 61, 79,
+  93, 78, 86, 87, 76, 73, 81, 54, 84, 72,
+  72, 106, 73, 98, 83, 101, 55, 73, 87, 78,
+  63, 76, 113, 59, 80, 77, 69, 54, 86, 53,
+  107, 93, 89, 89, 94, 72, 63, 58, 91, 73,
+  70, 86, 92, 81, 99, 69, 58, 81, 82, 84,
+  70, 89, 78, 85, 72, 62, 84, 65, 101, 77,
+  84, 77, 82, 70, 87, 79, 77, 80, 134, 79,
+  69, 81, 84, 71, 85, 90, 94, 69, 70, 99,
+  92, 82, 100, 89, 94, 97, 106, 90, 69, 82,
+  105, 86, 80, 82, 79, 90, 86, 85, 87, 91,
+  81, 88, 106, 104, 67, 87, 80, 94, 90, 73,
+  87, 73, 78, 79, 96, 78, 101, 79, 75, 88,
+  57, 69, 80, 87, 74, 84, 69, 86, 75, 76,
+  85, 63, 79, 73, 95, 69, 91, 91, 91, 88,
+  85, 69, 89, 79, 91, 91, 77, 72, 84, 100,
+  80, 85, 92, 93, 78, 66, 82, 88, 79, 91,
+  106, 67, 72, 88, 77, 82, 106, 80, 58, 78,
+  105, 98, 62, 80, 82, 82, 83, 92, 75, 70,
+  97, 81, 93, 89, 74, 95, 78, 74, 110, 82,
+  75, 76, 93, 78, 84, 78, 86, 88, 57, 76,
+  83, 84, 74, 100, 65, 79, 87, 89, 96, 93,
+  88, 82, 79, 83, 104, 94, 78, 66, 84, 82,
+  106, 87, 86, 80, 82, 81, 85, 85, 86, 80,
+  105, 79, 83, 78, 83, 83, 89, 81, 101, 100,
+  84, 68, 85, 73, 96, 86, 79, 75, 66, 75,
+  87, 88, 86, 79, 76, 88, 85, 95, 100, 85,
+  85, 79, 82, 66, 101, 79, 84, 85, 86, 85,
+  82, 83, 83, 79, 72, 79, 83, 98, 95, 79,
+  98, 90, 111, 71, 82, 71, 80, 94, 89, 66,
+  85, 92, 104, 72, 73, 77, 64, 81, 95, 92,
+  82, 92, 92, 92, 100, 87, 78, 85, 75, 89,
+  83, 83, 81, 80, 98, 72, 100, 84, 85, 64,
+  85, 68, 81, 83, 106, 75, 74, 70, 86, 77,
+  80, 85, 90, 81, 80, 91, 101, 89, 84, 85,
+  93, 77, 122, 94, 78, 79, 89, 80, 93, 86,
+  87, 80, 82, 81, 80, 90, 74, 85, 115, 93,
+  69, 74, 84, 90, 95, 79, 89, 90, 78, 71,
+  87, 78, 102, 91, 79, 83, 74, 66, 95, 88,
+  87, 62, 60, 82, 80, 92, 96, 65, 85, 69,
+  91, 64, 101, 85, 88, 83, 87, 73, 77, 85,
+  81, 77, 68, 75, 88, 106, 82, 84, 102, 101,
+  91, 68, 76, 61, 76, 89, 91, 74, 92, 95,
+  97, 79, 91, 86, 62, 76, 88, 83, 75, 91,
+  87, 88, 90, 86, 80, 74, 78, 97, 85, 92,
+  75, 82, 84, 92, 90, 84, 89, 66, 82, 71,
+  81, 84, 104, 79, 75, 74, 90, 78, 70, 92,
+  92, 89, 97, 92, 91, 81, 78, 78, 75, 84,
+  104, 85, 94, 81, 103, 81, 78, 95, 104, 75,
+  81, 85, 88, 93, 81, 81, 96, 104, 74, 88,
+  91, 94, 98, 95, 84, 84, 76, 80, 98, 77,
+  89, 98, 78, 80, 83, 77, 100, 89, 84, 70,
+  67, 83, 78, 86, 87, 61, 82, 83, 85, 83,
+  98, 101, 92, 79, 80, 67, 82, 84, 82, 85,
+  82, 67, 94, 96, 71, 92, 97, 88, 77, 95,
+  71, 80, 79, 84, 80, 60, 76, 93, 85, 81,
+  86, 88, 74, 87, 103, 96, 86, 101, 80, 90,
+  74, 78, 73, 77, 82, 87, 90, 99, 83, 76,
+  85, 83, 82, 94, 93, 71, 88, 72, 83, 81,
+  101, 84, 89, 74, 79, 92, 73, 79, 74, 89,
+  66, 93, 97, 79, 82, 76, 102, 100, 102, 89,
+  73, 87, 85, 79, 92, 72, 115, 86, 73, 118,
+  89, 77, 72, 74, 99, 90, 72, 76, 91, 79,
+  85, 76, 71, 95, 92, 94, 103, 88, 80, 87,
+  83, 113, 68, 81, 66, 75, 100, 95, 106, 103,
+  76, 89, 86, 76, 86, 63, 85, 78, 81, 87,
+  84, 88, 92, 64, 81, 85, 89, 74, 82, 79,
+  87, 72, 86, 84, 75, 91, 87, 56, 84, 84,
+  85, 84, 89, 102, 69, 92, 85, 89, 72, 97,
+  85, 74, 79, 77, 73, 81, 100, 81, 90, 80,
+  73, 64, 90, 82, 93, 75, 73, 87, 85, 72,
+  91, 69, 97, 65, 78, 76, 82, 88, 107, 107,
+  98, 65, 81, 78, 63, 73, 79, 107, 74, 106,
+  83, 85, 81, 72, 97, 88, 115, 95, 69, 81,
+  97, 80, 93, 68, 86, 100, 59, 155, 84, 85,
+  67, 70, 92, 78, 73, 80, 75, 97, 93, 75,
+  70, 77, 88, 87, 111, 80, 83, 85, 78, 125,
+  59, 83, 64, 70, 113, 75, 90, 111, 71, 77,
+  96, 69, 91, 83, 91, 83, 82, 85, 89, 68,
+  100, 59, 70, 80, 91, 76, 82, 66, 92, 79,
+  78, 90, 70, 93, 101, 63, 77, 83, 84, 86,
+  88, 100, 59, 90, 91, 91, 95, 96, 82, 75,
+  86, 75, 75, 82, 100, 86, 85, 83, 80, 59,
+  97, 70, 94, 82, 94, 83, 87, 86, 84, 79,
+  83, 81, 86, 80, 80, 71, 72, 105, 78, 75,
+  79, 91, 84, 82, 95, 88, 91, 82, 77, 78,
+  87, 90, 87, 77, 94, 87, 83, 71, 90, 92,
+  90, 77, 72, 81, 85, 99, 77, 70, 81, 84,
+  90, 73, 74, 72, 96, 78, 80, 83, 77, 75,
+  89, 82, 96, 99, 84, 78, 94, 79, 73, 71,
+  64, 86, 97, 87, 77, 88, 84, 89, 96, 86,
+  78, 96, 96, 75, 83, 81, 84, 76, 82, 68,
+  84, 83, 89, 80, 92, 83, 96, 76, 100, 88,
+  90, 87, 84, 69, 91, 105, 81, 83, 88, 97,
+  74, 90, 87, 86, 93, 90, 87, 90, 85, 74,
+  97, 90, 90, 81, 96, 71, 77, 71, 92, 82,
+  103, 83, 74, 78, 84, 84, 78, 96, 91, 83,
+  92, 74, 90, 75, 93, 100, 93, 77, 79, 81,
+  75, 68, 80, 96, 60, 99, 86, 79, 93, 80,
+  94, 78, 104, 84, 74, 99, 96, 75, 75, 79,
+  70, 80, 98, 117, 103, 75, 80, 84, 97, 89,
+  82, 79, 100, 90, 81, 76, 80, 90, 78, 94,
+  96, 87, 90, 90, 89, 106, 84, 74, 76, 73,
+  93, 85, 91, 107, 74, 104, 81, 71, 92, 74,
+  78, 83, 94, 88, 86, 71, 84, 84, 80, 81,
+  92, 66, 88, 98, 95, 80, 72, 83, 73, 94,
+  73, 71, 93, 100, 78, 89, 86, 78, 73, 88,
+  81, 79, 87, 84, 76, 76, 89, 91, 65, 85,
+  105, 89, 78, 80, 79, 65, 81, 74, 83, 78,
+  62, 81, 80, 79, 82, 70, 90, 78, 88, 71,
+  90, 76, 103, 88, 98, 85, 77, 76, 66, 69,
+  95, 88, 85, 103, 73, 75, 85, 74, 90, 81,
+  93, 89, 70, 85, 85, 73, 70, 83, 98, 85,
+  108, 125, 89, 85, 85, 77, 85, 76, 81, 90,
+  91, 106, 78, 73, 78, 95, 67, 90, 104, 81,
+  95, 85, 83, 102, 71, 80, 80, 68, 86, 80,
+  89, 112, 70, 110, 78, 65, 100, 83, 70, 90,
+  96, 81, 82, 70, 82, 95, 72, 76, 91, 58,
+  82, 83, 97, 81, 63, 93, 69, 96, 86, 75,
+  87, 99, 73, 94, 75, 70, 65, 86, 75, 79,
+  92, 87, 72, 71, 91, 86, 91, 83, 112, 97,
+  69, 86, 71, 59, 83, 69, 78, 80, 80, 84,
+  83, 85, 82, 80, 82, 81, 88, 77, 85, 73,
+  87, 88, 87, 77, 82, 84, 88, 81, 91, 82,
+  94, 92, 79, 80, 92, 91, 84, 93, 91, 86,
+  83, 78, 87, 92, 78, 79, 100, 77, 93, 97,
+  77, 71, 87, 84, 91, 84, 78, 76, 104, 72,
+  77, 82, 79, 93, 84, 88, 96, 100, 90, 75,
+  93, 83, 76, 72, 67, 88, 95, 84, 82, 96,
+  77, 96, 94, 75, 85, 84, 74, 80, 90, 83,
+  88, 77, 84, 87, 80, 76, 85, 76, 97, 74,
+  90, 81, 76, 74, 84, 91, 98, 73, 96, 103,
+  85, 89, 87, 87, 80, 85, 86, 80, 88, 83,
+  85, 78, 84, 87, 103, 87, 84, 88, 80, 84,
+  85, 74, 83, 76, 89, 82, 87, 79, 84, 90,
+  82, 82, 81, 86, 80, 85, 81, 93, 89, 92,
+  78, 73, 73, 89, 90, 85, 102, 97, 91, 76,
+  84, 83, 96, 99, 94, 71, 82, 83, 95, 86,
+  82, 84, 82, 80, 72, 81, 98, 89, 83, 73,
+  85, 100, 68, 86, 85, 84, 78, 73, 79, 84,
+  80, 76, 89, 69, 82, 85, 93, 73, 83, 86,
+  81, 74, 62, 99, 86, 84, 77, 86, 83, 92,
+  88, 85, 83, 80, 82, 79, 91, 78, 87, 80,
+  82, 89, 94, 87, 74, 74, 90, 80, 92, 85,
+  91, 68, 87, 86, 77, 71, 93, 76, 92, 87,
+  98, 89, 87, 87, 89, 73, 81, 75, 87, 83,
+  78, 75, 81, 88, 84, 81, 80, 76, 80, 76,
+  77, 79, 93, 72, 86, 81, 72, 89, 87, 87,
+  68, 82, 82, 85, 82, 92, 94, 80, 80, 71,
+  72, 86, 92, 84, 90, 97, 90, 73, 78, 79,
+  101, 98, 87, 77, 70, 92, 96, 81, 81, 89,
+  85, 76, 81, 83, 97, 81, 95, 76, 84, 103,
+  69, 69, 77, 94, 80, 81, 80, 84, 88, 76,
+  81, 67, 80, 92, 101, 78, 76, 83, 80, 74,
+  60, 103, 85, 91, 86, 87, 83, 89, 84, 78,
+  83, 80, 82, 82, 89, 74, 88, 82, 73, 92,
+  88, 85, 67, 81, 93, 81, 82, 86, 88, 72,
+  87, 89, 70, 75, 94, 84, 85, 90, 100, 88,
+  88, 86, 97, 72, 76, 83, 80, 80, 81, 63,
+  98, 80, 84, 84, 79, 82, 74, 71, 82, 77,
+  95, 75, 81, 85, 73, 89, 84, 86, 76, 83,
+  79, 86, 82, 83, 98, 85, 85, 80, 76, 88,
+  89, 88, 80, 84, 83, 80, 84, 84, 90, 104,
+  86, 85, 82, 89, 93, 77, 80, 94, 77, 77,
+  104, 77, 102, 94, 96, 76, 86, 93, 70, 75,
+  80, 80, 81, 72, 79, 89, 86, 90, 91, 74,
+  84, 83, 87, 74, 81, 84, 78, 72, 61, 93,
+  91, 86, 84, 85, 82, 88, 90, 78, 79, 81,
+  83, 79, 84, 76, 86, 85, 85, 88, 93, 75,
+  78, 80, 86, 86, 94, 85, 78, 66, 92, 86,
+  82, 78, 97, 85, 87, 86, 96, 87, 87, 84,
+  86, 73, 77, 79, 89, 85, 78, 80, 88, 91,
+  88, 86, 80, 82, 83, 80, 77, 77, 92, 75,
+  71, 77, 81, 80, 94, 85, 83, 79, 77, 89,
+  82, 82, 126, 84, 83, 82, 83, 97, 86, 77,
+  90, 98, 88, 78, 99, 79, 89, 98, 105, 101,
+  79, 79, 56, 73, 75, 79, 89, 73, 97, 87,
+  81, 72, 98, 78, 78, 61, 83, 99, 76, 97,
+  78, 101, 83, 89, 75, 82, 66, 78, 82, 80,
+  88, 67, 82, 121, 92, 76, 80, 72, 69, 99,
+  92, 87, 82, 78, 82, 66, 95, 73, 96, 86,
+  82, 66, 87, 76, 90, 82, 92, 78, 71, 78,
+  58, 76, 71, 84, 84, 76, 85, 79, 91, 84,
+  102, 73, 94, 79, 72, 66, 70, 93, 89, 78,
+  87, 99, 84, 86, 86, 80, 67, 77, 87, 100,
+  100, 99, 76, 98, 77, 77, 86, 86, 72, 73,
+  79, 79, 93, 76, 81, 76, 80, 93, 82, 88,
+  106, 104, 78, 80, 85, 83, 85, 79, 78, 94,
+  72, 85, 97, 82, 83, 97, 92, 76, 93, 88,
+  65, 72, 86, 87, 88, 79, 61, 98, 85, 94,
+  102, 92, 84, 82, 90, 76, 73, 97, 80, 104,
+  81, 84, 82, 59, 69, 80, 86, 79, 84, 79,
+  92, 111, 74, 78, 70, 87, 76, 74, 88, 79,
+  80, 78, 94, 78, 95, 104, 92, 81, 88, 77,
+  94, 72, 88, 76, 82, 73, 82, 82, 60, 85,
+  75, 85, 85, 78, 90, 89, 71, 89, 95, 96,
+  94, 80, 77, 73, 63, 91, 93, 80, 106, 100,
+  81, 80, 96, 86, 74, 85, 90, 86, 76, 86,
+  79, 91, 85, 73, 79, 86, 75, 59, 97, 82,
+  80, 84, 76, 76, 87, 85, 78, 86, 68, 100,
+  77, 88, 92, 79, 80, 93, 81, 65, 80, 84,
+  89, 85, 80, 82, 93, 84, 80, 78, 80, 81,
+  78, 90, 82, 85, 74, 77, 73, 73, 84, 85,
+  83, 103, 97, 90, 80, 80, 85, 72, 80, 84,
+  83, 83, 96, 97, 99, 89, 76, 91, 101, 75,
+  80, 77, 75, 95, 88, 70, 68, 62, 92, 74,
+  90, 99, 83, 85, 82, 80, 94, 91, 86, 79,
+  79, 81, 97, 79, 86, 86, 86, 90, 93, 91,
+  97, 77, 75, 88, 80, 86, 98, 84, 87, 80,
+  98, 81, 86, 85, 81, 82, 87, 78, 71, 79,
+  89, 79, 89, 82, 74, 79, 85, 82, 84, 82,
+  82, 83, 74, 76, 108, 88, 95, 92, 88, 92,
+  84, 81, 76, 83, 84, 81, 118, 101, 97, 77,
+  84, 73, 96, 66, 81, 97, 76, 91, 97, 79,
+  90, 100, 97, 87, 102, 70, 64, 86, 90, 69,
+  75, 81, 91, 82, 78, 105, 85, 80, 63, 51,
+  95, 123, 85, 89, 85, 117, 90, 84, 76, 102,
+  65, 88, 68, 81, 86, 62, 77, 134, 84, 68,
+  80, 66, 93, 74, 82, 115, 59, 94, 76, 70,
+  99, 63, 81, 98, 96, 72, 114, 66, 101, 87,
+  83, 71, 94, 61, 62, 70, 72, 88, 64, 75,
+  98, 88, 100, 92, 79, 75, 94, 76, 81, 85,
+  79, 87, 100, 85, 95, 80, 89, 71, 100, 85,
+  57, 90, 99, 83, 96, 85, 92, 118, 83, 73,
+  86, 94, 78, 79, 86, 83, 85, 77, 83, 77,
+  74, 88, 80, 91, 97, 74, 80, 79, 89, 80,
+  95, 78, 69, 70, 82, 85, 104, 82, 86, 99,
+  83, 84, 80, 88, 69, 64, 73, 87, 79, 80,
+  90, 93, 85, 82, 92, 96, 77, 80, 89, 75,
+  79, 89, 89, 99, 81, 78, 84, 95, 63, 80,
+  77, 85, 80, 72, 84, 86, 86, 61, 77, 77,
+  89, 76, 95, 103, 69, 86, 85, 78, 96, 116,
+  84, 87, 91, 81, 109, 83, 86, 85, 75, 69,
+  83, 76, 67, 66, 76, 91, 63, 78, 94, 96,
+  85, 95, 86, 86, 87, 82, 78, 78, 67, 84,
+  96, 78, 89, 86, 87, 83, 85, 83, 94, 87,
+  88, 80, 62, 78, 75, 99, 86, 75, 81, 79,
+  70, 59, 75, 77, 80, 100, 79, 77, 80, 86,
+  74, 94, 60, 85, 69, 86, 86, 94, 86, 99,
+  87, 59, 78, 80, 87, 88, 79, 83, 81, 85,
+  71, 78, 76, 85, 69, 90, 83, 88, 67, 72,
+  86, 63, 87, 83, 90, 104, 92, 87, 83, 75,
+  92, 63, 78, 83, 88, 78, 97, 88, 103, 88,
+  76, 88, 106, 69, 97, 75, 73, 102, 83, 82,
+  75, 69, 95, 68, 82, 106, 82, 94, 78, 77,
+  86, 89, 80, 86, 73, 76, 105, 78, 77, 89,
+  78, 83, 89, 90, 93, 83, 73, 95, 87, 91,
+  99, 86, 78, 82, 95, 80, 86, 79, 70, 80,
+  79, 75, 73, 94, 83, 84, 85, 84, 77, 85,
+  83, 81, 79, 81, 77, 87, 76, 72, 92, 79,
+  93, 90, 97, 91, 83, 75, 65, 83, 81, 87,
+  88, 80, 83, 80, 83, 80, 90, 80, 86, 100,
+  77, 88, 84, 84, 81, 92, 96, 77, 79, 80,
+  67, 90, 83, 84, 82, 80, 60, 87, 88, 77,
+  76, 71, 81, 83, 75, 120, 84, 91, 76, 83,
+  86, 77, 76, 76, 76, 74, 76, 78, 93, 106,
+  94, 112, 91, 66, 88, 88, 87, 91, 77, 80,
+  86, 91, 65, 78, 95, 73, 88, 93, 87, 66,
+  98, 87, 97, 85, 86, 76, 62, 71, 64, 76,
+  73, 94, 76, 89, 86, 91, 85, 102, 75, 85,
+  91, 77, 96, 84, 82, 85, 75, 75, 80, 90,
+  77, 87, 82, 82, 66, 90, 81, 93, 86, 83,
+  85, 98, 85, 82, 88, 84, 87, 94, 75, 86,
+  84, 80, 83, 74, 70, 82, 81, 91, 99, 60,
+  76, 77, 89, 79, 86, 85, 78, 86, 77, 85,
+  100, 82, 76, 89, 84, 87, 75, 92, 73, 71,
+  71, 94, 79, 90, 123, 88, 95, 85, 70, 85,
+  81, 87, 75, 66, 80, 93, 75, 89, 84, 78,
+  78, 92, 77, 81, 85, 85, 89, 95, 88, 101,
+  83, 78, 89, 87, 93, 84, 86, 80, 83, 89,
+  69, 85, 98, 114, 79, 94, 88, 76, 104, 76,
+  88, 89, 78, 74, 68, 74, 64, 81, 73, 98,
+  71, 82, 86, 99, 94, 98, 80, 72, 85, 81,
+  86, 94, 75, 81, 89, 85, 75, 87, 80, 77,
+  77, 85, 102, 89, 88, 86, 71, 82, 79, 95,
+  83, 79, 87, 85, 78, 74, 62, 84, 74, 102,
+  81, 77, 83, 80, 73, 89, 79, 89, 71, 89,
+  91, 90, 82, 89, 92, 69, 73, 82, 92, 82,
+  80, 79, 91, 81, 84, 78, 77, 81, 71, 88,
+  78, 89, 102, 71, 87, 82, 85, 84, 78, 89,
+  87, 78, 86, 81, 88, 78, 80, 83, 78, 98,
+  95, 93, 94, 83, 77, 78, 103, 76, 87, 79,
+  77, 88, 77, 83, 96, 77, 82, 77, 72, 102,
+  87, 98, 83, 81, 82, 90, 91, 74, 73, 78,
+  97, 80, 91, 92, 77, 86, 81, 86, 86, 75,
+  84, 97, 93, 87, 99, 71, 83, 81, 86, 87,
+  80, 81, 87, 88, 92, 74, 81, 80, 86, 91,
+  85, 82, 83, 83, 95, 79, 88, 91, 71, 83,
+  75, 81, 74, 70, 115, 96, 64, 93, 90, 76,
+  87, 91, 77, 84, 94, 84, 56, 81, 72, 84,
+  85, 102, 110, 95, 100, 82, 78, 73, 89, 79,
+  127, 122, 102, 91, 81, 84, 80, 92, 104, 97,
+  91, 67, 115, 76, 75, 100, 69, 112, 94, 118,
+  77, 88, 75, 99, 88, 79, 110, 87, 89, 73,
+  106, 82, 72, 76, 80, 64, 69, 54, 74, 93,
+  70, 89, 94, 86, 85, 93, 65, 80, 85, 80,
+  94, 64, 86, 71, 96, 101, 74, 92, 92, 91,
+  74, 88, 86, 80, 96, 89, 89, 77, 80, 64,
+  103, 81, 91, 91, 99, 85, 89, 86, 91, 80,
+  80, 68, 81, 94, 74, 93, 80, 90, 103, 92,
+  89, 95, 77, 72, 98, 74, 89, 85, 77, 92,
+  72, 68, 104, 87, 90, 95, 88, 86, 73, 86,
+  78, 80, 89, 96, 72, 75, 85, 88, 88, 88,
+  111, 69, 100, 80, 92, 90, 75, 85, 106, 122,
+  82, 79, 81, 77, 79, 88, 82, 84, 91, 82,
+  83, 79, 68, 79, 78, 92, 79, 102, 84, 84,
+  83, 84, 80, 90, 90, 70, 86, 75, 79, 86,
+  77, 77, 87, 42, 72, 62, 80, 72, 71, 78,
+  75, 84, 85, 89, 77, 68, 75, 84, 76, 98,
+  86, 84, 87, 99, 76, 80, 97, 85, 83, 88,
+  73, 65, 71, 97, 75, 84, 86, 75, 89, 79,
+  73, 73, 84, 85, 81, 74, 84, 77, 84, 79,
+  95, 83, 87, 93, 70, 73, 106, 85, 74, 81,
+  89, 82, 97, 82, 76, 90, 86, 85, 83, 68,
+  81, 83, 99, 69, 81, 91, 77, 76, 84, 83,
+  93, 94, 86, 65, 94, 91, 87, 75, 97, 75,
+  87, 79, 94, 86, 69, 83, 95, 96, 74, 78,
+  82, 74, 76, 76, 61, 78, 102, 103, 67, 88,
+  72, 79, 78, 74, 78, 80, 89, 86, 89, 90,
+  81, 96, 63, 81, 80, 80, 72, 86, 87, 81,
+  85, 57, 79, 91, 93, 80, 78, 75, 72, 87,
+  77, 76, 91, 70, 80, 80, 78, 107, 82, 91,
+  81, 85, 89, 70, 97, 87, 83, 88, 78, 62,
+  71, 92, 72, 90, 90, 98, 93, 84, 76, 66,
+  74, 84, 83, 82, 84, 81, 74, 88, 83, 82,
+  92, 92, 73, 80, 91, 88, 75, 72, 88, 89,
+  70, 85, 67, 97, 85, 81, 77, 72, 100, 90,
+  82, 83, 89, 86, 79, 91, 83, 82, 84, 88,
+  65, 74, 78, 85, 88, 85, 109, 90, 97, 78,
+  88, 86, 84, 88, 99, 116, 87, 84, 77, 76,
+  67, 79, 72, 79, 96, 70, 88, 53, 73, 81,
+  76, 89, 83, 86, 84, 86, 69, 85, 80, 85,
+  90, 89, 82, 86, 84, 90, 83, 85, 93, 83,
+  69, 65, 76, 80, 62, 89, 71, 75, 91, 93,
+  68, 72, 75, 80, 92, 67, 91, 76, 85, 100,
+  71, 92, 85, 86, 78, 83, 85, 69, 76, 90,
+  74, 87, 81, 68, 75, 84, 79, 78, 91, 75,
+  77, 84, 79, 88, 106, 74, 83, 85, 84, 82,
+  78, 82, 113, 82, 85, 96, 93, 84, 96, 80,
+  83, 88, 83, 78, 77, 78, 88, 82, 90, 68,
+  87, 91, 86, 86, 90, 89, 83, 92, 89, 76,
+  93, 89, 92, 78, 98, 81, 77, 77, 98, 83,
+  75, 88, 88, 94, 81, 80, 88, 75, 80, 83,
+  63, 81, 108, 90, 72, 74, 67, 76, 92, 73,
+  80, 71, 86, 85, 94, 84, 75, 95, 82, 86,
+  83, 99, 79, 87, 82, 92, 93, 71, 67, 93,
+  86, 71, 72, 77, 70, 85, 83, 79, 84, 71,
+  81, 87, 64, 98, 90, 92, 80, 87, 93, 89,
+  84, 80, 90, 80, 78, 62, 75, 95, 71, 93,
+  83, 91, 74, 88, 77, 63, 88, 79, 79, 83,
+  81, 94, 88, 83, 94, 84, 93, 79, 78, 78,
+  81, 86, 84, 82, 90, 93, 69, 84, 67, 88,
+  89, 76, 84, 81, 80, 85, 79, 84, 78, 90,
+  92, 81, 91, 85, 93, 84, 92, 74, 91, 95,
+  77, 75, 84, 89, 86, 80, 94, 76, 76, 83,
+  77, 82, 78, 85, 82, 78, 87, 85, 75, 86,
+  99, 89, 74, 101, 84, 81, 84, 77, 88, 82,
+  87, 91, 91, 85, 85, 88, 76, 84, 84, 100,
+  80, 75, 89, 92, 84, 89, 91, 110, 95, 70,
+  80, 84, 79, 89, 78, 82, 88, 79, 89, 88,
+  65, 95, 86, 88, 76, 84, 95, 80, 82, 88,
+  81, 77, 78, 77, 85, 80, 78, 89, 80, 97,
+  84, 89, 90, 80, 80, 82, 80, 89, 84, 89,
+  64, 90, 75, 88, 94, 85, 82, 91, 80, 87,
+  86, 83, 79, 88, 61, 80, 70, 81, 89, 88,
+  78, 71, 94, 88, 82, 96, 81, 85, 76, 84,
+  89, 87, 83, 86, 81, 74, 79, 100, 86, 79,
+  101, 79, 83, 83, 100, 83, 82, 87, 97, 102,
+  90, 83, 78, 77, 71, 82, 62, 81, 103, 82,
+  76, 58, 69, 76, 86, 83, 92, 66, 88, 82,
+  89, 85, 78, 90, 73, 94, 74, 94, 81, 93,
+  86, 84, 88, 92, 83, 83, 91, 74, 63, 76,
+  85, 80, 87, 84, 76, 69, 77, 83, 72, 80,
+  89, 92, 79, 96, 75, 89, 87, 82, 90, 85,
+  76, 73, 77, 96, 72, 91, 79, 82, 66, 83,
+  81, 71, 87, 77, 85, 84, 74, 88, 92, 89,
+  97, 89, 88, 81, 77, 80, 108, 82, 83, 86,
+  94, 88, 71, 83, 72, 89, 84, 73, 84, 75,
+  84, 87, 82, 74, 81, 85, 86, 84, 89, 94,
+  84, 84, 95, 76, 88, 96, 82, 77, 82, 79,
+  80, 79, 100, 79, 84, 85, 81, 99, 85, 82,
+  88, 77, 91, 79, 76, 83, 102, 91, 76, 93,
+  77, 80, 99, 70, 87, 67, 92, 80, 92, 82,
+  84, 90, 81, 89, 85, 99, 81, 84, 82, 96,
+  88, 87, 80, 106, 87, 78, 71, 86, 74, 94,
+  81, 76, 87, 77, 90, 83, 60, 91, 84, 91,
+  74, 85, 92, 86, 79, 84, 88, 80, 77, 76,
+  88, 98, 78, 92, 84, 96, 73, 90, 86, 71,
+  84, 84, 84, 85, 83, 89, 81, 90, 91, 89,
+  93, 77, 83, 83, 71, 90, 85, 86, 85, 90,
+  54, 84, 66, 83, 85, 82, 87, 83, 79, 91,
+  76, 87, 76, 83, 93, 85, 86, 86, 96, 78,
+  88, 76, 85, 99, 76, 78, 81, 84, 92, 83,
+  99, 75, 92, 82, 69, 92, 86, 87, 86, 82,
+  95, 80, 85, 77, 86, 81, 81, 111, 91, 83,
+  85, 74, 100, 82, 86, 86, 84, 76, 93, 82,
+  86, 89, 87, 100, 82, 82, 84, 96, 96, 97,
+  97, 102, 83, 82, 73, 93, 84, 98, 80, 83,
+  91, 84, 92, 86, 77, 77, 80, 87, 79, 90,
+  92, 74, 80, 86, 85, 80, 86, 92, 97, 89,
+  89, 85, 76, 86, 82, 84, 92, 90, 80, 83,
+  83, 84, 86, 93, 77, 87, 76, 93, 88, 85,
+  84, 84, 79, 85, 90, 87, 76, 85, 68, 77,
+  81, 75, 85, 92, 107, 78, 97, 92, 71, 103,
+  76, 79, 69, 90, 76, 88, 86, 74, 73, 85,
+  85, 85, 93, 76, 86, 70, 106, 87, 94, 77,
+  83, 85, 93, 95, 87, 86, 80, 73, 90, 88,
+  91, 77, 66, 82, 79, 89, 70, 88, 81, 86,
+  81, 84, 77, 78, 99, 90, 91, 79, 89, 99,
+  82, 90, 60, 81, 73, 73, 87, 79, 95, 61,
+  83, 89, 86, 66, 85, 85, 68, 77, 76, 80,
+  86, 107, 96, 96, 81, 96, 76, 72, 72, 76,
+  94, 81, 107, 69, 67, 80, 84, 72, 87, 78,
+  83, 83, 89, 80, 86, 91, 75, 86, 97, 95,
+  72, 83, 83, 79, 81, 74, 92, 79, 109, 103,
+  87, 92, 85, 79, 108, 68, 84, 91, 81, 100,
+  91, 83, 123, 94, 102, 92, 73, 83, 74, 81,
+  72, 83, 76, 95, 106, 88, 76, 84, 82, 72,
+  89, 67, 80, 82, 81, 84, 83, 77, 85, 83,
+  92, 91, 92, 98, 79, 81, 90, 79, 94, 77,
+  83, 76, 74, 85, 82, 92, 80, 73, 85, 93,
+  76, 73, 93, 108, 93, 90, 83, 114, 77, 84,
+  49, 84, 76, 67, 89, 78, 87, 60, 89, 74,
+  89, 61, 99, 87, 54, 80, 79, 72, 84, 88,
+  101, 97, 79, 110, 88, 82, 73, 86, 79, 83,
+  125, 73, 68, 80, 79, 67, 71, 75, 91, 74,
+  90, 82, 83, 82, 74, 85, 98, 95, 78, 88,
+  98, 76, 89, 70, 91, 75, 112, 96, 80, 101,
+  93, 85, 98, 70, 81, 89, 80, 92, 86, 95,
+  97, 97, 88, 93, 74, 104, 77, 80, 64, 89,
+  81, 84, 86, 86, 71, 86, 83, 85, 99, 80,
+  76, 74, 97, 86, 85, 78, 84, 83, 94, 87,
+  84, 99, 77, 84, 90, 82, 92, 73, 73, 81,
+  84, 83, 82, 91, 82, 75, 80, 106, 77, 81,
+  101, 81, 90, 87, 95, 92, 89, 88, 66, 82,
+  78, 81, 88, 85, 100, 62, 90, 85, 73, 73,
+  95, 88, 69, 78, 88, 82, 83, 80, 96, 90,
+  83, 96, 80, 90, 78, 80, 86, 81, 103, 83,
+  70, 84, 85, 75, 83, 78, 87, 81, 84, 72,
+  87, 80, 77, 83, 97, 90, 80, 85, 84, 79,
+  68, 80, 90, 94, 102, 91, 83, 92, 89, 92,
+  88, 74, 79, 94, 86, 90, 91, 84, 96, 77,
+  99, 84, 87, 95, 69, 77, 88, 87, 78, 89,
+  83, 82, 74, 75, 74, 72, 75, 77, 93, 76,
+  81, 85, 88, 85, 83, 81, 97, 78, 79, 92,
+  87, 86, 85, 95, 75, 85, 57, 78, 74, 88,
+  91, 78, 88, 100, 69, 89, 88, 84, 93, 82,
+  87, 93, 83, 67, 79, 78, 64, 81, 71, 96,
+  68, 79, 82, 86, 85, 98, 86, 49, 88, 90,
+  77, 81, 63, 88, 79, 83, 77, 91, 80, 78,
+  80, 75, 73, 92, 88, 77, 96, 74, 75, 76,
+  86, 81, 90, 90, 78, 90, 76, 97, 73, 100,
+  77, 86, 78, 111, 74, 83, 82, 67, 83, 75,
+  76, 85, 112, 91, 70, 92, 79, 101, 84, 79,
+  80, 80, 83, 89, 81, 86, 90, 79, 89, 78,
+  96, 75, 66, 77, 90, 84, 84, 92, 73, 68,
+  73, 75, 70, 66, 62, 75, 96, 80, 78, 90,
+  80, 82, 91, 78, 100, 83, 68, 86, 83, 87,
+  81, 94, 73, 89, 71, 67, 76, 75, 93, 70,
+  100, 102, 59, 88, 89, 74, 85, 56, 89, 98,
+  64, 100, 86, 70, 61, 81, 70, 105, 63, 81,
+  67, 91, 95, 97, 85, 43, 90, 91, 80, 78,
+  57, 80, 83, 83, 80, 94, 81, 78, 82, 85,
+  76, 100, 81, 77, 72, 77, 74, 73, 80, 72,
+  74, 87, 79, 95, 91, 107, 72, 87, 79, 88,
+  78, 128, 83, 73, 87, 64, 67, 68, 73, 80,
+  108, 100, 85, 99, 76, 119, 80, 82, 71, 79,
+  78, 83, 84, 89, 94, 79, 84, 87, 86, 81,
+  73, 75, 84, 87, 86, 84, 92, 68, 72, 80,
+  76, 74, 77, 82, 92, 75, 97, 87, 79, 84,
+  85, 80, 97, 88, 74, 86, 86, 81, 85, 88,
+  73, 85, 90, 77, 75, 80, 89, 83, 94, 83,
+  64, 88, 88, 84, 96, 69, 87, 96, 82, 118,
+  89, 82, 66, 85, 71, 86, 69, 85, 81, 91,
+  93, 101, 82, 75, 84, 97, 77, 80, 67, 86,
+  80, 84, 78, 84, 83, 79, 82, 83, 77, 92,
+  84, 83, 92, 83, 73, 76, 84, 76, 73, 83,
+  79, 91, 102, 91, 82, 72, 78, 84, 83, 108,
+  88, 78, 87, 65, 59, 78, 79, 83, 91, 94,
+  93, 88, 77, 103, 81, 85, 73, 88, 87, 86,
+  81, 83, 93, 76, 98, 86, 96, 86, 74, 76,
+  83, 85, 76, 86, 88, 85, 63, 86, 80, 85,
+  90, 83, 86, 86, 84, 79, 90, 87, 83, 81,
+  89, 70, 78, 91, 97, 96, 73, 83, 88, 78,
+  74, 91, 78, 90, 82, 83, 86, 98, 81, 88,
+  78, 89, 68, 71, 87, 82, 96, 76, 83, 62,
+  79, 80, 82, 89, 87, 71, 87, 85, 90, 99,
+  76, 83, 98, 81, 86, 86, 76, 88, 69, 66,
+  73, 89, 74, 77, 83, 87, 86, 91, 86, 95,
+  80, 79, 81, 79, 96, 86, 91, 85, 77, 92,
+  80, 82, 89, 94, 79, 81, 68, 94, 97, 95,
+  82, 89, 86, 91, 76, 98, 83, 74, 87, 88,
+  90, 81, 84, 90, 92, 80, 88, 75, 77, 78,
+  92, 78, 95, 77, 105, 71, 75, 77, 89, 87,
+  81, 85, 82, 81, 65, 86, 81, 86, 82, 84,
+  92, 96, 79, 76, 86, 91, 77, 83, 86, 69,
+  74, 84, 98, 100, 78, 91, 92, 86, 82, 83,
+  79, 82, 86, 73, 100, 98, 67, 77, 69, 89,
+  62, 57, 87, 84, 79, 78, 83, 66, 74, 87,
+  84, 93, 87, 80, 76, 91, 88, 98, 72, 81,
+  90, 81, 92, 81, 73, 85, 75, 70, 66, 92,
+  75, 69, 83, 89, 83, 90, 85, 87, 65, 78,
+  77, 77, 89, 92, 85, 83, 81, 100, 82, 81,
+  86, 80, 82, 82, 66, 96, 98, 86, 81, 83,
+  78, 90, 70, 87, 82, 63, 96, 92, 95, 87,
+  84, 93, 97, 81, 80, 73, 86, 73, 90, 77,
+  95, 87, 91, 78, 78, 72, 88, 87, 83, 81,
+  88, 87, 67, 86, 80, 86, 87, 84, 85, 89,
+  95, 83, 84, 87, 82, 82, 86, 76, 75, 87,
+  93, 91, 80, 91, 87, 83, 90, 88, 82, 85,
+  79, 78, 85, 95, 74, 76, 77, 88, 65, 73,
+  85, 86, 94, 86, 88, 68, 81, 82, 82, 85,
+  83, 78, 85, 83, 87, 98, 74, 98, 90, 87,
+  83, 85, 77, 90, 75, 76, 69, 85, 75, 76,
+  87, 82, 82, 91, 93, 92, 76, 78, 81, 84,
+  98, 87, 78, 86, 81, 92, 93, 80, 93, 84,
+  79, 80, 73, 97, 99, 84, 77, 85, 75, 93,
+  77, 81, 80, 79, 100, 84, 88, 79, 91, 97,
+  90, 88, 88, 80, 79, 76, 87, 80, 118, 91,
+  82, 87, 75, 71, 101, 89, 86, 81, 97, 76,
+  61, 79, 86, 76, 84, 88, 101, 88, 86, 86,
+  93, 86, 92, 88, 94, 97, 93, 93, 89, 81,
+  99, 104, 97, 94, 88, 70, 93, 84, 106, 73,
+  60, 95, 94, 90, 92, 94, 82, 69, 94, 91,
+  65, 88, 109, 70, 124, 85, 66, 125, 74, 76,
+  74, 76, 83, 91, 91, 60, 93, 101, 86, 81,
+  87, 100, 80, 87, 73, 68, 83, 55, 88, 87,
+  78, 79, 91, 76, 87, 92, 82, 82, 95, 94,
+  78, 94, 80, 78, 95, 83, 75, 84, 89, 88,
+  85, 81, 91, 80, 74, 83, 76, 67, 81, 93,
+  97, 97, 74, 86, 82, 91, 74, 83, 94, 78,
+  91, 89, 71, 76, 78, 76, 113, 97, 75, 84,
+  73, 65, 102, 92, 92, 79, 103, 84, 62, 78,
+  85, 75, 82, 78, 107, 85, 87, 83, 91, 82,
+  86, 91, 85, 94, 92, 89, 85, 86, 98, 102,
+  84, 108, 87, 66, 102, 79, 105, 75, 54, 105,
+  81, 95, 89, 92, 79, 79, 90, 89, 60, 91,
+  100, 68, 129, 89, 67, 128, 72, 78, 87, 78,
+  84, 91, 95, 69, 87, 98, 82, 79, 84, 100,
+  89, 89, 64, 70, 77, 55, 86, 96, 75, 82,
+  93, 86, 79, 88, 85, 93, 93, 95, 77, 93,
+  79, 84, 111, 87, 78, 88, 91, 91, 84, 87,
+  90, 78, 69, 77, 82, 69, 80, 97, 95, 101,
+  94, 95, 86, 85, 75, 84, 91, 72, 89, 89,
+  71, 74, 87, 73, 94, 94, 84, 80, 72, 69,
+  100, 89, 91, 76, 91, 83, 58, 84, 91, 76,
+  84, 81, 98, 88, 85, 81, 84, 84, 88, 87,
+  91, 101, 93, 85, 89, 80, 98, 91, 87, 85,
+  82, 76, 93, 81, 103, 77, 66, 95, 80, 84,
+  94, 90, 87, 82, 93, 86, 67, 93, 105, 72,
+  117, 87, 65, 102, 82, 70, 78, 79, 81, 92,
+  89, 67, 79, 96, 88, 86, 84, 98, 81, 90,
+  65, 70, 80, 57, 95, 87, 75, 80, 94, 73,
+  82, 97, 82, 81, 94, 94, 83, 86, 79, 83,
+  106, 78, 79, 79, 89, 87, 83, 84, 88, 80,
+  70, 83, 80, 76, 83, 94, 91, 103, 84, 83,
+  78, 91, 72, 87, 93, 81, 88, 92, 77, 81,
+  87, 73, 77, 72, 81, 73, 101, 86, 84, 84,
+  90, 85, 77, 87, 65, 74, 72, 84, 75, 76,
+  110, 79, 85, 74, 86, 114, 84, 80, 92, 100,
+  82, 95, 87, 71, 84, 80, 108, 83, 78, 57,
+  95, 74, 112, 87, 78, 77, 72, 74, 94, 76,
+  93, 74, 90, 85, 74, 89, 110, 79, 98, 78,
+  81, 90, 95, 75, 63, 79, 77, 81, 73, 71,
+  69, 77, 99, 102, 75, 94, 76, 85, 93, 69,
+  85, 71, 86, 69, 85, 72, 82, 70, 89, 77,
+  79, 77, 83, 85, 74, 69, 84, 87, 78, 86,
+  78, 79, 92, 86, 79, 71, 82, 96, 97, 81,
+  72, 65, 75, 71, 99, 87, 70, 84, 83, 100,
+  75, 74, 89, 92, 81, 74, 69, 92, 81, 70,
+  75, 77, 77, 72, 102, 80, 84, 84, 91, 86,
+  75, 87, 66, 71, 78, 84, 71, 74, 119, 76,
+  82, 66, 89, 105, 81, 82, 88, 106, 82, 95,
+  91, 73, 81, 76, 107, 82, 82, 56, 97, 74,
+  110, 91, 68, 86, 65, 76, 93, 76, 94, 87,
+  87, 85, 75, 90, 110, 76, 101, 77, 76, 94,
+  108, 72, 69, 79, 70, 86, 73, 76, 64, 77,
+  97, 92, 75, 95, 76, 80, 93, 73, 82, 75,
+  89, 73, 83, 77, 74, 74, 83, 78, 84, 79,
+  78, 85, 73, 67, 81, 87, 83, 90, 84, 73,
+  87, 88, 77, 71, 82, 94, 94, 77, 79, 61,
+  74, 77, 104, 96, 73, 86, 79, 93, 74, 77,
+  88, 88, 84, 76, 62, 91, 90, 71, 72, 76,
+  82, 74, 96, 75, 90, 86, 86, 78, 75, 76,
+  66, 79, 75, 86, 74, 75, 103, 80, 81, 75,
+  83, 106, 78, 78, 88, 104, 87, 97, 92, 70,
+  87, 79, 97, 81, 87, 69, 91, 78, 97, 90,
+  81, 85, 70, 80, 93, 75, 93, 81, 91, 84,
+  75, 82, 102, 77, 91, 83, 76, 79, 92, 75,
+  70, 83, 76, 80, 77, 77, 62, 82, 93, 98,
+  80, 94, 76, 80, 77, 74, 83, 71, 90, 75,
+  82, 78, 70, 77, 82, 79, 82, 78, 85, 90,
+  73, 67, 85, 85, 85, 85, 86, 70, 91, 84,
+  86, 77, 88, 90, 91, 83, 85, 69, 80, 84,
+  91, 91, 64, 85, 81, 95, 76, 77, 84, 91,
+  81, 81, 76, 90, 101, 67, 63, 80, 96, 96,
+  89, 91, 77, 77, 83, 83, 90, 86, 88, 87,
+  67, 109, 84, 79, 83, 84, 74, 80, 87, 111,
+  84, 76, 78, 97, 83, 89, 91, 74, 85, 77,
+  79, 84, 86, 85, 91, 72, 86, 88, 95, 62,
+  77, 77, 85, 78, 93, 82, 84, 79, 84, 83,
+  88, 97, 63, 79, 95, 75, 80, 91, 77, 96,
+  74, 81, 74, 75, 89, 73, 99, 104, 87, 89,
+  70, 81, 94, 77, 89, 66, 84, 72, 95, 71,
+  86, 84, 84, 77, 64, 91, 69, 83, 80, 71,
+  96, 97, 79, 84, 82, 92, 92, 86, 81, 79,
+  82, 92, 78, 105, 108, 86, 90, 73, 75, 82,
+  62, 79, 85, 78, 78, 84, 77, 93, 83, 80,
+  94, 87, 96, 76, 76, 77, 97, 80, 90, 90,
+  77, 78, 81, 83, 83, 88, 93, 82, 71, 110,
+  85, 82, 78, 79, 83, 82, 87, 106, 79, 76,
+  77, 99, 83, 93, 93, 72, 86, 64, 77, 82,
+  91, 84, 86, 77, 86, 87, 91, 64, 76, 75,
+  88, 76, 101, 91, 81, 82, 85, 82, 92, 89,
+  63, 76, 93, 75, 80, 91, 78, 95, 79, 78,
+  78, 80, 76, 73, 96, 93, 88, 89, 73, 78,
+  91, 85, 85, 76, 87, 74, 94, 75, 76, 91,
+  86, 81, 67, 82, 67, 88, 76, 70, 93, 95,
+  77, 88, 82, 78, 92, 87, 75, 82, 83, 88,
+  82, 101, 113, 80, 87, 77, 80, 90, 59, 79,
+  83, 73, 78, 83, 79, 92, 87, 83, 94, 89,
+  96, 79, 86, 78, 91, 76, 80, 83, 78, 80,
+  82, 82, 87, 72, 91, 84, 67, 101, 80, 85,
+  74, 88, 94, 79, 86, 101, 78, 77, 70, 97,
+  82, 94, 88, 68, 91, 71, 79, 84, 93, 84,
+  95, 73, 85, 89, 100, 69, 79, 82, 85, 74,
+  87, 85, 80, 79, 85, 81, 88, 88, 64, 80,
+  87, 76, 78, 93, 84, 94, 76, 80, 74, 88,
+  66, 79, 95, 99, 91, 87, 72, 82, 85, 79,
+  85, 72, 84, 85, 87, 78, 70, 90, 80, 78,
+  64, 82, 74, 88, 77, 68, 93, 92, 75, 84,
+  86, 71, 94, 85, 85, 80, 87, 90, 75, 100,
+  105, 83, 89, 83, 83, 86, 68, 83, 88, 79,
+  83, 81, 70, 94, 84, 84, 95, 86, 74, 86,
+  78, 79, 73, 82, 124, 115, 55, 90, 89, 85,
+  82, 78, 71, 90, 93, 66, 77, 92, 72, 93,
+  92, 65, 78, 73, 80, 88, 87, 83, 75, 75,
+  98, 72, 79, 92, 75, 86, 88, 80, 75, 78,
+  75, 82, 77, 110, 79, 75, 76, 83, 77, 81,
+  105, 88, 90, 81, 83, 72, 98, 80, 85, 79,
+  83, 86, 84, 81, 76, 69, 75, 83, 82, 76,
+  89, 77, 87, 98, 142, 81, 84, 90, 133, 74,
+  81, 87, 73, 86, 78, 81, 99, 69, 84, 86,
+  75, 88, 84, 86, 73, 95, 74, 89, 116, 72,
+  85, 115, 83, 90, 101, 81, 76, 74, 73, 76,
+  70, 80, 79, 73, 81, 77, 94, 73, 86, 81,
+  66, 86, 83, 79, 79, 86, 77, 80, 84, 82,
+  74, 78, 120, 101, 52, 84, 87, 89, 91, 87,
+  78, 92, 93, 68, 76, 86, 79, 99, 79, 67,
+  75, 73, 75, 81, 81, 82, 81, 75, 85, 75,
+  81, 80, 78, 85, 80, 81, 79, 78, 80, 76,
+  76, 112, 87, 81, 76, 84, 71, 75, 99, 86,
+  84, 80, 74, 69, 93, 83, 91, 82, 84, 84,
+  78, 76, 76, 75, 81, 76, 78, 78, 86, 72,
+  92, 89, 139, 80, 87, 92, 120, 69, 90, 91,
+  73, 89, 84, 71, 96, 83, 78, 88, 72, 100,
+  93, 85, 67, 100, 77, 86, 107, 76, 86, 112,
+  75, 88, 99, 78, 74, 68, 81, 74, 72, 84,
+  83, 78, 75, 76, 102, 76, 80, 80, 73, 91,
+  82, 79, 76, 92, 73, 75, 83, 82, 73, 87,
+  123, 101, 58, 87, 84, 83, 82, 88, 76, 88,
+  95, 64, 76, 87, 78, 91, 83, 71, 70, 77,
+  82, 87, 80, 81, 79, 72, 98, 77, 88, 81,
+  77, 87, 75, 80, 74, 85, 73, 85, 77, 111,
+  75, 80, 75, 82, 79, 78, 105, 85, 91, 77,
+  90, 70, 96, 73, 87, 76, 83, 83, 82, 78,
+  78, 74, 79, 77, 78, 72, 87, 77, 91, 101,
+  140, 89, 89, 89, 130, 75, 87, 88, 74, 84,
+  84, 87, 96, 73, 84, 87, 78, 93, 91, 86,
+  71, 96, 71, 85, 113, 78, 85, 102, 82, 92,
+  101, 82, 77, 78, 80, 75, 75, 79, 81, 72,
+  78, 79, 92, 68, 85, 80, 67, 84, 82, 80,
+  78, 87, 86, 87, 83, 79, 81, 84, 108, 110,
+  59, 87, 89, 84, 78, 88, 79, 90, 92, 64,
+  85, 90, 80, 90, 92, 66, 83, 69, 80, 87,
+  83, 76, 85, 73, 89, 83, 82, 90, 80, 80,
+  81, 76, 70, 71, 86, 79, 81, 109, 82, 77,
+  70, 79, 80, 78, 101, 87, 79, 76, 78, 76,
+  92, 82, 93, 73, 84, 80, 86, 77, 80, 74,
+  74, 77, 78, 82, 79, 75, 80, 94, 135, 86,
+  85, 93, 119, 80, 79, 84, 72, 79, 79, 79,
+  96, 86, 90, 86, 76, 89, 91, 89, 79, 104,
+  82, 88, 103, 74, 89, 108, 85, 87, 102, 78,
+  82, 77, 79, 70, 70, 85, 82, 79, 80, 74,
+  97, 72, 91, 82, 65, 90, 83, 87, 79, 95,
+  95, 83, 83, 88, 81, 80, 109, 99, 58, 86,
+  92, 92, 95, 91, 86, 97, 93, 67, 89, 87,
+  87, 98, 72, 67, 84, 67, 73, 84, 75, 83,
+  89, 76, 81, 82, 82, 81, 81, 81, 91, 78,
+  73, 80, 89, 77, 80, 107, 91, 82, 75, 83,
+  76, 76, 94, 84, 74, 86, 71, 76, 84, 87,
+  96, 72, 84, 90, 77, 81, 79, 83, 77, 72,
+  80, 91, 72, 76, 85, 85, 133, 78, 83, 96,
+  107, 77, 85, 86, 75, 82, 81, 71, 96, 87,
+  87, 80, 73, 108, 97, 85, 83, 112, 87, 84,
+  87, 79, 98, 104, 88, 93, 100, 78, 84, 72,
+  88, 68, 77, 85, 82, 83, 76, 75, 110, 77,
+  79, 82, 73, 98, 84, 90, 84, 103, 78, 79,
+  83, 85, 79, 93, 104, 91, 62, 83, 87, 80,
+  80, 85, 80, 91, 92, 66, 85, 87, 83, 82,
+  85, 73, 75, 73, 80, 86, 79, 83, 81, 71,
+  88, 80, 78, 84, 75, 78, 85, 76, 72, 71,
+  76, 83, 80, 109, 81, 81, 71, 78, 82, 73,
+  101, 85, 80, 86, 86, 76, 93, 73, 91, 73,
+  83, 77, 85, 74, 83, 76, 75, 77, 77, 74,
+  77, 80, 83, 97, 128, 85, 87, 86, 116, 76,
+  80, 92, 72, 78, 85, 88, 95, 92, 92, 85,
+  79, 89, 91, 88, 77, 97, 76, 85, 109, 81,
+  88, 92, 86, 87, 102, 80, 78, 80, 75, 70,
+  73, 82, 77, 74, 82, 73, 91, 70, 91, 78,
+  68, 88, 82, 87, 80, 93, 81, 90, 84, 77,
+  87, 82, 106, 105, 52, 87, 88, 79, 79, 95,
+  86, 90, 94, 59, 75, 84, 75, 94, 78, 69,
+  80, 74, 81, 85, 87, 76, 80, 69, 94, 83,
+  76, 86, 75, 70, 70, 80, 71, 81, 79, 88,
+  82, 113, 77, 83, 69, 77, 86, 92, 111, 88,
+  87, 72, 78, 78, 93, 73, 98, 74, 78, 88,
+  89, 90, 82, 68, 72, 84, 79, 72, 75, 74,
+  82, 99, 138, 78, 88, 91, 124, 72, 77, 84,
+  71, 72, 74, 84, 90, 84, 89, 95, 77, 85,
+  88, 100, 79, 101, 78, 91, 105, 79, 87, 114,
+  89, 85, 98, 77, 81, 84, 84, 73, 78, 86,
+  85, 76, 79, 76, 90, 75, 90, 83, 62, 91,
+  79, 83, 76, 87, 83, 81, 80, 85, 86, 73,
+  99, 105, 54, 85, 92, 92, 85, 84, 86, 92,
+  90, 63, 79, 81, 81, 92, 76, 66, 78, 69,
+  83, 85, 85, 86, 74, 70, 90, 82, 74, 80,
+  76, 70, 85, 77, 77, 72, 76, 82, 80, 118,
+  80, 82, 75, 77, 83, 83, 102, 87, 85, 83,
+  82, 77, 85, 76, 100, 77, 78, 84, 87, 86,
+  82, 71, 69, 89, 79, 75, 76, 83, 82, 98,
+  126, 78, 85, 87, 110, 70, 75, 98, 70, 74,
+  77, 80, 87, 86, 98, 94, 74, 91, 95, 94,
+  82, 101, 79, 91, 109, 79, 90, 112, 87, 90,
+  100, 77, 84, 83, 84, 73, 78, 84, 82, 74,
+  85, 74, 93, 80, 87, 85, 66, 95, 77, 89,
+  78, 92, 74, 77, 77, 79, 84, 77, 108, 91,
+  57, 85, 89, 77, 86, 83, 87, 90, 91, 64,
+  76, 81, 82, 86, 91, 75, 79, 77, 78, 83,
+  87, 81, 79, 68, 90, 80, 75, 80, 73, 74,
+  98, 79, 76, 83, 67, 89, 82, 108, 77, 76,
+  72, 74, 88, 83, 111, 88, 88, 96, 83, 81,
+  95, 73, 96, 76, 77, 86, 87, 92, 81, 69,
+  74, 91, 85, 72, 71, 78, 80, 99, 139, 83,
+  81, 88, 121, 71, 77, 92, 75, 74, 78, 93,
+  93, 91, 90, 89, 77, 86, 82, 98, 75, 98,
+  77, 90, 108, 74, 87, 99, 90, 85, 97, 76,
+  78, 85, 74, 72, 75, 73, 80, 74, 82, 76,
+  89, 78, 93, 82, 66, 87, 79, 86, 78, 85,
+  80, 83, 88, 82, 76, 89, 99, 81, 82, 92,
+  80, 84, 86, 75, 81, 87, 84, 96, 95, 92,
+  79, 97, 87, 81, 86, 93, 82, 81, 87, 77,
+  96, 76, 89, 80, 93, 74, 68, 82, 77, 92,
+  91, 72, 81, 104, 75, 86, 90, 82, 75, 90,
+  66, 115, 96, 77, 94, 55, 92, 89, 73, 93,
+  93, 74, 72, 68, 85, 78, 81, 88, 95, 92,
+  65, 69, 82, 88, 102, 83, 89, 98, 98, 76,
+  98, 77, 73, 84, 96, 73, 83, 82, 86, 78,
+  79, 64, 78, 74, 80, 85, 81, 80, 84, 75,
+  72, 77, 87, 87, 88, 82, 75, 102, 92, 88,
+  92, 86, 90, 82, 78, 85, 92, 80, 83, 91,
+  87, 98, 82, 85, 103, 90, 85, 95, 84, 71,
+  88, 75, 86, 79, 80, 82, 73, 88, 77, 84,
+  93, 113, 59, 87, 87, 77, 79, 81, 73, 101,
+  76, 99, 90, 76, 95, 80, 90, 76, 96, 81,
+  79, 76, 88, 88, 71, 69, 72, 95, 80, 104,
+  81, 76, 85, 82, 90, 79, 87, 78, 88, 91,
+  93, 76, 72, 51, 94, 63, 81, 79, 87, 85,
+  82, 72, 51, 79, 113, 77, 85, 73, 38, 78,
+  83, 89, 81, 78, 81, 124, 89, 91, 80, 83,
+  87, 89, 76, 75, 85, 78, 66, 86, 80, 67,
+  83, 81, 79, 78, 90, 85, 84, 98, 65, 87,
+  82, 80, 85, 82, 66, 86, 101, 72, 98, 70,
+  82, 92, 83, 94, 90, 86, 88, 81, 84, 83,
+  85, 79, 73, 89, 84, 103, 92, 74, 90, 83,
+  87, 74, 68, 84, 80, 84, 74, 81, 83, 126,
+  54, 95, 90, 71, 79, 77, 80, 91, 81, 87,
+  84, 62, 87, 84, 96, 84, 89, 92, 82, 82,
+  94, 89, 88, 80, 91, 68, 84, 85, 87, 75,
+  88, 82, 83, 95, 91, 65, 113, 90, 85, 80,
+  62, 80, 90, 75, 97, 80, 72, 94, 103, 74,
+  69, 80, 100, 82, 78, 80, 48, 73, 93, 93,
+  67, 86, 64, 117, 98, 90, 79, 94, 76, 92,
+  68, 94, 84, 84, 67, 80, 83, 92, 85, 83,
+  102, 85, 89, 92, 88, 98, 88, 104, 88, 79,
+  87, 88, 79, 82, 89, 69, 88, 73, 72, 99,
+  96, 96, 92, 94, 81, 77, 85, 75, 83, 74,
+  71, 95, 84, 81, 76, 81, 74, 82, 75, 87,
+  100, 82, 86, 95, 88, 82, 96, 60, 85, 92,
+  82, 98, 92, 89, 81, 96, 84, 80, 77, 85,
+  79, 85, 89, 77, 95, 71, 98, 85, 100, 80,
+  65, 80, 81, 85, 81, 75, 87, 99, 80, 90,
+  85, 83, 76, 89, 66, 102, 86, 80, 93, 67,
+  87, 89, 74, 95, 90, 78, 59, 69, 72, 81,
+  84, 87, 94, 64, 95, 80, 79, 90, 105, 86,
+  85, 114, 84, 74, 93, 75, 85, 78, 89, 72,
+  85, 86, 79, 79, 82, 73, 79, 71, 82, 80,
+  87, 79, 89, 80, 76, 76, 80, 88, 86, 79,
+  76, 95, 85, 93, 91, 96, 85, 75, 53, 74,
+  78, 82, 82, 84, 70, 93, 90, 90, 100, 81,
+  85, 102, 102, 69, 54, 80, 78, 72, 86, 82,
+  74, 93, 93, 79, 97, 80, 56, 84, 78, 76,
+  83, 72, 67, 104, 72, 90, 85, 79, 90, 85,
+  87, 83, 84, 80, 87, 80, 123, 90, 100, 78,
+  101, 80, 91, 104, 87, 73, 95, 70, 79, 65,
+  84, 78, 87, 75, 80, 84, 85, 65, 87, 64,
+  72, 83, 84, 92, 79, 79, 36, 94, 93, 83,
+  83, 63, 64, 85, 91, 76, 84, 78, 83, 153,
+  89, 88, 73, 74, 92, 80, 73, 75, 79, 93,
+  64, 96, 78, 76, 87, 74, 92, 78, 90, 86,
+  80, 98, 70, 82, 81, 84, 72, 75, 65, 82,
+  92, 76, 81, 80, 78, 80, 67, 83, 79, 86,
+  92, 85, 64, 81, 80, 84, 69, 74, 81, 114,
+  104, 67, 68, 86, 82, 75, 74, 80, 76, 85,
+  74, 83, 79, 100, 48, 75, 78, 64, 80, 65,
+  72, 78, 80, 86, 84, 72, 90, 85, 89, 93,
+  78, 100, 80, 81, 88, 83, 94, 83, 112, 61,
+  94, 85, 79, 68, 94, 75, 81, 81, 89, 66,
+  110, 64, 78, 86, 78, 94, 82, 75, 83, 72,
+  78, 103, 111, 85, 65, 86, 92, 84, 84, 84,
+  68, 79, 97, 75, 69, 79, 83, 113, 105, 91,
+  72, 88, 74, 77, 62, 93, 71, 103, 84, 94,
+  81, 93, 87, 73, 99, 78, 86, 93, 73, 95,
+  84, 105, 83, 84, 83, 87, 79, 82, 95, 77,
+  86, 75, 73, 94, 95, 101, 80, 84, 87, 90,
+  85, 69, 73, 80, 72, 88, 76, 81, 77, 77,
+  82, 91, 79, 78, 94, 79, 86, 90, 84, 80,
+  87, 61, 101, 94, 82, 93, 85, 93, 86, 76,
+  78, 80, 75, 88, 81, 79, 80, 82, 83, 84,
+  93, 83, 95, 75, 83, 85, 69, 80, 86, 73,
+  71, 98, 81, 85, 85, 71, 81, 82, 74, 91,
+  74, 86, 89, 89, 96, 100, 91, 92, 85, 84,
+  82, 80, 103, 77, 89, 87, 83, 93, 102, 84,
+  79, 86, 99, 83, 89, 104, 90, 81, 91, 78,
+  75, 82, 89, 79, 85, 85, 85, 82, 71, 88,
+  89, 87, 88, 87, 83, 84, 86, 83, 88, 92,
+  82, 87, 100, 85, 82, 91, 79, 94, 89, 96,
+  80, 68, 71, 80, 66, 89, 83, 81, 64, 92,
+  78, 86, 100, 86, 86, 85, 83, 80, 68, 91,
+  72, 62, 93, 82, 84, 86, 85, 73, 95, 64,
+  86, 95, 80, 90, 87, 88, 80, 72, 68, 86,
+  71, 94, 95, 77, 79, 88, 79, 88, 90, 73,
+  84, 68, 87, 88, 92, 89, 84, 83, 71, 94,
+  80, 74, 84, 72, 84, 86, 88, 91, 88, 83,
+  81, 98, 90, 87, 87, 82, 84, 76, 89, 89,
+  66, 82, 85, 83, 78, 86, 89, 80, 85, 84,
+  91, 76, 88, 91, 96, 77, 88, 78, 81, 77,
+  93, 84, 78, 77, 95, 98, 70, 91, 79, 81,
+  75, 79, 87, 80, 89, 77, 78, 91, 75, 86,
+  79, 81, 77, 92, 76, 87, 84, 85, 83, 73,
+  78, 73, 57, 85, 87, 78, 65, 89, 80, 86,
+  90, 83, 82, 91, 90, 81, 91, 89, 71, 83,
+  85, 79, 77, 84, 79, 79, 89, 79, 73, 81,
+  79, 87, 86, 87, 84, 79, 97, 87, 74, 94,
+  93, 84, 83, 90, 89, 98, 84, 72, 84, 91,
+  82, 96, 97, 78, 89, 83, 69, 83, 84, 72,
+  90, 89, 87, 83, 95, 85, 91, 83, 79, 99,
+  85, 84, 91, 84, 85, 88, 95, 86, 75, 80,
+  79, 87, 80, 83, 83, 81, 90, 80, 88, 74,
+  95, 100, 94, 78, 89, 85, 77, 93, 86, 88,
+  72, 93, 96, 101, 80, 82, 77, 78, 83, 74,
+  90, 76, 85, 64, 77, 86, 80, 84, 82, 80,
+  95, 87, 84, 95, 88, 77, 84, 91, 90, 90,
+  73, 82, 90, 81, 77, 92, 83, 87, 93, 90,
+  83, 83, 66, 69, 70, 93, 79, 62, 72, 101,
+  96, 76, 83, 84, 73, 89, 77, 89, 84, 76,
+  87, 93, 90, 97, 79, 83, 86, 78, 84, 79,
+  61, 97, 86, 84, 80, 74, 80, 91, 81, 90,
+  77, 70, 94, 82, 75, 92, 58, 82, 94, 130,
+  87, 76, 88, 89, 76, 84, 90, 79, 86, 82,
+  100, 98, 71, 80, 85, 77, 81, 79, 89, 104,
+  92, 77, 84, 78, 85, 76, 86, 73, 68, 82,
+  88, 84, 86, 85, 82, 56, 88, 81, 85, 93,
+  75, 83, 95, 74, 76, 85, 87, 84, 89, 79,
+  97, 90, 79, 79, 86, 81, 76, 82, 79, 88,
+  78, 70, 82, 81, 92, 87, 81, 80, 96, 83,
+  89, 81, 107, 76, 115, 72, 77, 79, 90, 81,
+  90, 70, 72, 83, 89, 67, 76, 83, 80, 87,
+  78, 86, 79, 87, 83, 83, 81, 91, 87, 76,
+  85, 83, 89, 82, 80, 82, 90, 71, 70, 83,
+  87, 70, 80, 86, 78, 89, 82, 77, 78, 75,
+  81, 84, 68, 84, 77, 84, 97, 105, 81, 74,
+  87, 88, 81, 69, 81, 81, 91, 82, 73, 97,
+  78, 68, 82, 76, 77, 87, 80, 88, 85, 78,
+  81, 84, 84, 93, 80, 77, 80, 79, 83, 91,
+  88, 78, 69, 64, 80, 82, 85, 78, 84, 81,
+  63, 78, 76, 88, 83, 82, 79, 79, 99, 66,
+  70, 81, 77, 77, 75, 79, 89, 82, 81, 102,
+  84, 79, 77, 88, 73, 72, 92, 92, 87, 69,
+  107, 92, 70, 81, 81, 84, 81, 83, 98, 80,
+  81, 83, 91, 87, 83, 71, 77, 92, 72, 80,
+  89, 86, 85, 87, 79, 94, 74, 76, 75, 68,
+  88, 86, 93, 81, 85, 75, 80, 84, 88, 84,
+  82, 95, 78, 88, 82, 81, 85, 78, 85, 93,
+  73, 87, 92, 84, 99, 91, 87, 75, 81, 82,
+  86, 63, 81, 83, 90, 84, 72, 91, 81, 76,
+  84, 90, 85, 88, 81, 84, 83, 88, 86, 84,
+  86, 94, 87, 84, 88, 83, 78, 87, 83, 82,
+  65, 74, 87, 83, 82, 76, 88, 66, 62, 95,
+  84, 89, 89, 84, 82, 84, 100, 81, 72, 89,
+  74, 83, 85, 89, 86, 85, 73, 109, 74, 79,
+  81, 86, 79, 86, 78, 92, 89, 76, 89, 96,
+  49, 87, 86, 90, 79, 84, 59, 75, 65, 93,
+  87, 48, 73, 97, 96, 76, 93, 81, 73, 96,
+  74, 83, 73, 71, 98, 102, 109, 105, 95, 79,
+  79, 75, 89, 84, 89, 97, 84, 82, 85, 76,
+  74, 97, 89, 95, 82, 75, 97, 85, 58, 101,
+  64, 87, 78, 156, 90, 79, 86, 110, 81, 99,
+  91, 94, 78, 81, 103, 89, 69, 88, 81, 71,
+  101, 80, 91, 121, 98, 81, 105, 88, 69, 86,
+  91, 74, 66, 83, 92, 79, 86, 80, 89, 56,
+  94, 77, 92, 106, 74, 76, 100, 81, 75, 83,
+  89, 80, 93, 79, 117, 121, 82, 84, 94, 85,
+  105, 99, 79, 89, 83, 50, 87, 91, 103, 88,
+  94, 91, 103, 74, 89, 85, 110, 61, 124, 73,
+  80, 75, 107, 88, 87, 71, 67, 83, 92, 58,
+  78, 90, 71, 83, 80, 78, 82, 91, 79, 84,
+  77, 97, 95, 79, 100, 76, 92, 79, 69, 88,
+  88, 69, 91, 80, 88, 65, 80, 85, 77, 91,
+  87, 73, 68, 80, 75, 85, 63, 81, 80, 91,
+  84, 126, 78, 75, 91, 87, 83, 76, 85, 86,
+  80, 82, 68, 92, 79, 66, 77, 62, 77, 86,
+  78, 95, 88, 74, 89, 87, 90, 97, 84, 77,
+  75, 81, 82, 94, 90, 77, 69, 60, 76, 79,
+  101, 81, 90, 81, 73, 83, 69, 91, 91, 77,
+  78, 79, 106, 68, 67, 91, 76, 81, 85, 82,
+  93, 75, 79, 95, 88, 80, 82, 91, 76, 74,
+  92, 88, 83, 60, 112, 86, 74, 81, 80, 80,
+  84, 84, 91, 77, 80, 76, 90, 79, 84, 74,
+  71, 92, 70, 76, 89, 88, 79, 85, 76, 100,
+  75, 74, 83, 70, 93, 83, 84, 87, 87, 72,
+  78, 85, 91, 70, 90, 89, 83, 87, 85, 80,
+  77, 82, 80, 85, 72, 80, 93, 89, 93, 95,
+  82, 77, 82, 83, 82, 66, 92, 89, 85, 88,
+  67, 87, 88, 80, 83, 77, 82, 92, 77, 80,
+  84, 93, 91, 79, 90, 87, 85, 83, 86, 79,
+  81, 86, 84, 84, 62, 70, 85, 80, 85, 76,
+  98, 79, 70, 91, 73, 88, 88, 84, 81, 88,
+  98, 72, 71, 87, 77, 86, 86, 84, 89, 81,
+  74, 109, 81, 77, 83, 87, 84, 78, 82, 85,
+  85, 74, 91, 98, 42, 87, 86, 84, 77, 83,
+  60, 79, 66, 98, 85, 47, 75, 96, 87, 80,
+  94, 85, 75, 88, 76, 81, 73, 76, 94, 92,
+  107, 97, 87, 76, 80, 82, 97, 80, 97, 96,
+  90, 77, 84, 68, 68, 92, 87, 98, 87, 71,
+  102, 85, 60, 97, 73, 88, 72, 150, 97, 81,
+  82, 104, 74, 104, 86, 85, 83, 80, 108, 85,
+  81, 89, 97, 72, 86, 75, 88, 111, 86, 83,
+  95, 96, 64, 92, 84, 84, 70, 79, 89, 82,
+  84, 83, 88, 59, 88, 89, 88, 103, 74, 82,
+  96, 87, 77, 83, 85, 81, 88, 86, 101, 116,
+  97, 79, 88, 84, 93, 89, 88, 93, 97, 55,
+  95, 90, 105, 87, 91, 91, 99, 74, 82, 93,
+  119, 65, 114, 75, 79, 82, 103, 82, 84, 75,
+  65, 82, 89, 62, 77, 90, 68, 88, 83, 78,
+  83, 85, 78, 85, 73, 96, 86, 80, 103, 80,
+  94, 81, 73, 85, 84, 70, 99, 93, 90, 63,
+  72, 79, 71, 90, 86, 74, 79, 85, 87, 91,
+  59, 82, 93, 86, 71, 128, 81, 79, 79, 89,
+  82, 82, 87, 77, 84, 82, 75, 83, 82, 72,
+  83, 71, 75, 86, 76, 95, 80, 78, 94, 98,
+  89, 95, 80, 88, 83, 80, 76, 91, 89, 77,
+  69, 62, 77, 88, 94, 76, 89, 80, 71, 84,
+  73, 89, 94, 80, 78, 82, 93, 74, 77, 84,
+  81, 80, 84, 79, 92, 78, 76, 97, 91, 78,
+  83, 90, 79, 80, 90, 86, 81, 78, 106, 86,
+  63, 84, 78, 78, 83, 81, 91, 81, 74, 76,
+  90, 75, 79, 76, 65, 91, 69, 70, 91, 90,
+  80, 89, 72, 99, 71, 77, 92, 72, 96, 83,
+  84, 86, 84, 70, 84, 94, 93, 71, 87, 84,
+  81, 86, 86, 79, 81, 84, 86, 91, 77, 82,
+  101, 85, 78, 103, 78, 78, 76, 82, 84, 69,
+  86, 81, 90, 84, 68, 87, 92, 80, 83, 79,
+  76, 90, 75, 82, 79, 92, 77, 84, 92, 84,
+  84, 91, 93, 78, 74, 91, 85, 80, 59, 71,
+  86, 86, 86, 67, 99, 79, 77, 84, 77, 91,
+  87, 88, 80, 84, 87, 66, 76, 87, 84, 87,
+  83, 72, 92, 82, 73, 106, 83, 75, 78, 91,
+  79, 80, 87, 84, 83, 86, 93, 93, 36, 87,
+  85, 83, 77, 82, 70, 83, 90, 80, 97, 81,
+  84, 84, 75, 70, 75, 77, 78, 81, 78, 83,
+  72, 75, 73, 84, 104, 79, 62, 71, 79, 89,
+  81, 76, 97, 71, 108, 76, 75, 73, 67, 72,
+  75, 78, 87, 83, 82, 75, 68, 90, 89, 93,
+  96, 70, 79, 87, 86, 87, 88, 95, 79, 79,
+  70, 82, 93, 92, 98, 69, 93, 90, 93, 84,
+  75, 78, 75, 69, 56, 70, 82, 106, 81, 63,
+  84, 78, 89, 83, 95, 97, 85, 87, 90, 105,
+  78, 84, 99, 82, 74, 83, 79, 75, 62, 93,
+  77, 85, 74, 85, 86, 70, 80, 69, 95, 73,
+  99, 83, 81, 96, 83, 97, 72, 83, 90, 97,
+  84, 95, 90, 102, 96, 84, 86, 74, 90, 84,
+  79, 85, 70, 91, 63, 81, 96, 71, 84, 87,
+  71, 74, 76, 67, 84, 85, 81, 85, 72, 74,
+  73, 81, 74, 79, 71, 75, 76, 89, 77, 79,
+  97, 70, 101, 75, 74, 84, 68, 78, 73, 82,
+  87, 79, 88, 75, 104, 85, 88, 95, 93, 81,
+  84, 85, 90, 85, 86, 94, 82, 89, 73, 82,
+  95, 96, 100, 76, 96, 89, 94, 86, 70, 77,
+  74, 68, 81, 71, 85, 106, 84, 67, 84, 70,
+  95, 83, 89, 92, 82, 75, 85, 96, 83, 83,
+  95, 85, 76, 102, 77, 77, 69, 93, 77, 85,
+  74, 84, 90, 89, 85, 72, 103, 74, 101, 81,
+  83, 94, 73, 102, 74, 79, 84, 90, 74, 97,
+  94, 96, 81, 86, 85, 80, 88, 81, 80, 83,
+  78, 87, 55, 86, 89, 69, 80, 86, 83, 75,
+  79, 80, 89, 88, 83, 76, 72, 80, 73, 78,
+  71, 75, 86, 74, 83, 85, 81, 72, 95, 70,
+  80, 73, 76, 87, 68, 90, 79, 86, 83, 78,
+  79, 77, 104, 83, 90, 78, 92, 95, 73, 81,
+  88, 81, 85, 89, 76, 85, 80, 83, 84, 90,
+  91, 72, 91, 85, 87, 83, 69, 78, 81, 72,
+  82, 69, 91, 80, 88, 69, 73, 79, 90, 83,
+  83, 94, 90, 77, 92, 92, 102, 76, 96, 90,
+  84, 88, 73, 78, 82, 91, 74, 86, 74, 93,
+  84, 86, 78, 76, 74, 79, 88, 82, 87, 82,
+  76, 82, 71, 86, 85, 92, 80, 89, 82, 85,
+  78, 78, 83, 79, 86, 75, 75, 90, 89, 84,
+  75, 88, 85, 78, 74, 91, 82, 82, 82, 89,
+  76, 76, 78, 81, 88, 80, 94, 82, 124, 97,
+  86, 65, 79, 90, 81, 95, 82, 84, 95, 83,
+  85, 80, 86, 82, 78, 87, 84, 75, 92, 80,
+  84, 93, 86, 112, 82, 73, 89, 87, 83, 84,
+  90, 98, 108, 77, 95, 74, 90, 91, 69, 72,
+  90, 92, 86, 82, 71, 101, 77, 71, 64, 79,
+  79, 97, 84, 93, 99, 90, 66, 82, 86, 85,
+  86, 76, 80, 77, 75, 82, 79, 69, 87, 76,
+  82, 79, 71, 87, 108, 92, 84, 80, 87, 64,
+  111, 65, 106, 79, 87, 86, 88, 88, 67, 88,
+  82, 79, 82, 87, 104, 101, 88, 88, 78, 103,
+  83, 98, 88, 78, 96, 77, 93, 91, 77, 92,
+  83, 91, 71, 96, 83, 91, 77, 83, 77, 80,
+  84, 85, 92, 76, 100, 82, 96, 99, 76, 65,
+  79, 85, 84, 100, 75, 93, 96, 102, 86, 80,
+  80, 92, 82, 92, 79, 69, 90, 78, 115, 89,
+  81, 119, 80, 68, 94, 86, 85, 79, 87, 97,
+  116, 81, 97, 78, 86, 90, 77, 82, 94, 85,
+  86, 78, 68, 104, 71, 71, 77, 86, 79, 101,
+  84, 103, 108, 77, 68, 83, 82, 81, 88, 75,
+  76, 74, 71, 82, 74, 71, 90, 84, 80, 78,
+  74, 88, 114, 92, 68, 83, 87, 89, 122, 66,
+  113, 80, 91, 85, 87, 80, 66, 96, 85, 69,
+  83, 86, 81, 102, 92, 86, 68, 107, 83, 105,
+  90, 72, 96, 76, 76, 91, 82, 86, 86, 74,
+  84, 86, 82, 73, 85, 97, 92, 81, 83, 83,
+  75, 85, 78, 76, 83, 88, 87, 68, 86, 80,
+  74, 80, 93, 92, 83, 81, 81, 82, 72, 100,
+  77, 88, 83, 82, 93, 82, 115, 88, 80, 100,
+  87, 93, 79, 91, 92, 86, 91, 87, 87, 82,
+  83, 75, 82, 85, 78, 77, 88, 87, 94, 84,
+  72, 86, 76, 69, 91, 83, 83, 86, 88, 76,
+  72, 76, 76, 82, 85, 91, 83, 85, 86, 76,
+  98, 74, 85, 81, 82, 82, 85, 75, 70, 85,
+  83, 87, 74, 81, 88, 78, 82, 71, 87, 78,
+  86, 80, 80, 93, 68, 76, 75, 84, 84, 89,
+  88, 99, 90, 80, 70, 89, 87, 83, 87, 76,
+  78, 76, 87, 75, 81, 91, 85, 75, 74, 81,
+  80, 67, 77, 86, 78, 82, 75, 73, 90, 81,
+  87, 79, 103, 86, 85, 77, 74, 101, 88, 80,
+  80, 86, 82, 91, 78, 83, 72, 86, 83, 94,
+  84, 82, 73, 88, 90, 94, 96, 100, 88, 81,
+  91, 77, 78, 82, 93, 86, 102, 86, 97, 70,
+  98, 86, 79, 70, 89, 95, 84, 79, 86, 87,
+  82, 76, 82, 73, 67, 89, 85, 83, 75, 82,
+  87, 89, 79, 92, 86, 77, 83, 78, 77, 85,
+  83, 74, 83, 77, 87, 85, 69, 85, 109, 100,
+  97, 80, 78, 72, 95, 62, 71, 89, 86, 81,
+  85, 100, 78, 83, 76, 83, 80, 85, 95, 91,
+  83, 90, 75, 89, 86, 102, 87, 77, 89, 82,
+  99, 84, 96, 96, 85, 85, 72, 88, 83, 75,
+  78, 82, 73, 84, 81, 79, 98, 78, 96, 87,
+  94, 87, 79, 75, 71, 92, 92, 86, 72, 89,
+  80, 106, 82, 79, 76, 90, 83, 103, 83, 71,
+  70, 83, 101, 90, 94, 102, 89, 72, 93, 74,
+  82, 76, 90, 84, 103, 80, 97, 76, 90, 85,
+  80, 75, 93, 83, 81, 80, 80, 93, 86, 73,
+  75, 76, 71, 88, 84, 91, 83, 82, 80, 91,
+  77, 90, 85, 79, 79, 80, 73, 90, 80, 74,
+  85, 74, 83, 81, 78, 86, 113, 99, 79, 82,
+  78, 83, 105, 61, 72, 102, 94, 82, 87, 90,
+  79, 88, 78, 74, 84, 90, 77, 91, 76, 92,
+  74, 90, 83, 108, 91, 76, 91, 80, 77, 85,
+  98, 88, 92, 69, 83, 83, 86, 69, 85, 93,
+  90, 86, 76, 79, 81, 79, 78, 80, 86, 89,
+  85, 74, 75, 84, 82, 79, 91, 81, 86, 83,
+  77, 76, 80, 92, 83, 96, 81, 93, 86, 86,
+  103, 88, 83, 96, 96, 88, 82, 86, 86, 85,
+  88, 77, 78, 80, 88, 76, 85, 91, 82, 76,
+  88, 98, 95, 79, 80, 80, 84, 75, 89, 82,
+  78, 89, 83, 81, 69, 84, 77, 81, 74, 96,
+  81, 83, 88, 77, 89, 81, 85, 81, 80, 87,
+  91, 84, 71, 84, 84, 93, 83, 79, 84, 84,
+  82, 64, 80, 75, 84, 87, 87, 95, 83, 82,
+  75, 81, 91, 83, 80, 94, 92, 85, 79, 93,
+  86, 87, 85, 83, 79, 82, 86, 85, 81, 71,
+  74, 77, 82, 82, 91, 85, 80, 78, 89, 86,
+  79, 83, 74, 83, 83, 92, 77, 90, 90, 82,
+  94, 82, 81, 124, 92, 85, 84, 86, 93, 90,
+  79, 91, 78, 82, 90, 82, 99, 84, 84, 90,
+  82, 92, 95, 95, 74, 85, 85, 82, 79, 89,
+  87, 79, 77, 81, 80, 85, 85, 84, 89, 78,
+  87, 70, 79, 97, 83, 88, 75, 88, 79, 77,
+  79, 77, 81, 82, 75, 79, 88, 80, 79, 80,
+  85, 86, 79, 80, 88, 64, 73, 75, 91, 88,
+  86, 69, 78, 91, 86, 82, 75, 77, 74, 77,
+  89, 85, 75, 80, 82, 74, 85, 93, 80, 90,
+  90, 85, 81, 87, 99, 68, 81, 80, 91, 83,
+  90, 60, 80, 108, 86, 88, 76, 70, 75, 83,
+  83, 83, 103, 102, 80, 82, 93, 89, 80, 82,
+  74, 86, 78, 92, 82, 97, 78, 80, 83, 79,
+  82, 141, 86, 82, 79, 90, 100, 87, 84, 86,
+  77, 93, 87, 80, 96, 84, 92, 80, 79, 100,
+  94, 79, 70, 94, 85, 80, 77, 89, 97, 88,
+  73, 82, 71, 81, 86, 87, 87, 84, 84, 78,
+  80, 91, 73, 90, 75, 82, 80, 81, 76, 72,
+  84, 86, 79, 76, 92, 74, 78, 74, 76, 79,
+  72, 76, 89, 65, 74, 83, 91, 87, 78, 66,
+  75, 92, 88, 84, 80, 73, 84, 78, 115, 77,
+  72, 84, 83, 77, 78, 94, 88, 73, 90, 84,
+  71, 101, 109, 73, 83, 73, 96, 82, 99, 61,
+  88, 114, 85, 84, 78, 72, 81, 90, 85, 85,
+  85, 81, 80, 74, 88, 89, 80, 83, 79, 79,
+  81, 92, 87, 89, 72, 83, 82, 85, 80, 114,
+  91, 83, 88, 83, 91, 92, 83, 97, 84, 84,
+  81, 81, 93, 85, 79, 86, 83, 94, 91, 79,
+  79, 78, 87, 79, 81, 89, 86, 89, 83, 79,
+  81, 87, 83, 82, 88, 79, 86, 70, 82, 94,
+  82, 86, 82, 85, 81, 80, 83, 77, 78, 87,
+  83, 82, 82, 79, 84, 82, 84, 82, 98, 77,
+  86, 72, 77, 86, 94, 88, 83, 75, 84, 88,
+  91, 87, 75, 77, 74, 76, 86, 80, 75, 82,
+  82, 74, 82, 91, 80, 73, 82, 86, 79, 88,
+  97, 70, 81, 85, 86, 87, 93, 66, 79, 97,
+  86, 84, 80, 78, 78, 77, 73, 77, 106, 96,
+  74, 73, 81, 86, 68, 91, 73, 78, 73, 91,
+  81, 94, 90, 81, 87, 79, 84, 136, 84, 75,
+  76, 78, 86, 78, 79, 88, 73, 107, 95, 82,
+  82, 94, 75, 85, 91, 97, 93, 94, 66, 85,
+  84, 82, 83, 87, 87, 86, 72, 88, 90, 72,
+  77, 87, 80, 78, 89, 80, 78, 89, 91, 78,
+  88, 82, 87, 75, 72, 74, 90, 85, 72, 74,
+  95, 78, 79, 72, 85, 80, 81, 79, 97, 68,
+  78, 72, 77, 84, 84, 74, 67, 90, 84, 87,
+  84, 79, 73, 77, 101, 92, 76, 74, 86, 71,
+  94, 88, 75, 99, 85, 87, 80, 95, 98, 70,
+  84, 86, 102, 79, 95, 63, 92, 106, 92, 91,
+  87, 89, 74, 81, 69, 80, 127, 121, 73, 73,
+  93, 91, 71, 94, 71, 79, 68, 91, 81, 105,
+  75, 83, 72, 72, 89, 160, 79, 77, 63, 95,
+  100, 72, 74, 80, 71, 126, 99, 82, 70, 97,
+  84, 74, 87, 94, 92, 77, 64, 102, 87, 87,
+  80, 87, 98, 89, 71, 91, 73, 61, 72, 86,
+  79, 86, 80, 95, 73, 78, 84, 83, 78, 77,
+  92, 75, 66, 73, 107, 77, 71, 70, 100, 69,
+  82, 83, 74, 82, 74, 73, 103, 67, 79, 69,
+  74, 76, 73, 69, 66, 92, 86, 91, 93, 75,
+  86, 78, 130, 93, 77, 76, 94, 72, 85, 83,
+  85, 76, 86, 83, 79, 113, 104, 74, 81, 81,
+  107, 79, 106, 59, 95, 115, 77, 89, 81, 73,
+  84, 96, 77, 83, 94, 86, 77, 68, 80, 91,
+  71, 92, 81, 80, 73, 91, 80, 94, 73, 84,
+  77, 85, 83, 124, 85, 85, 79, 83, 85, 88,
+  76, 95, 74, 99, 88, 81, 81, 86, 82, 82,
+  86, 85, 92, 78, 75, 77, 84, 76, 86, 87,
+  88, 82, 79, 86, 86, 81, 80, 88, 79, 74,
+  90, 77, 83, 88, 88, 83, 82, 82, 85, 80,
+  80, 79, 83, 77, 78, 75, 88, 80, 83, 91,
+  83, 86, 100, 76, 91, 72, 82, 76, 82, 88,
+  73, 79, 72, 88, 87, 87, 82, 83, 74, 75,
+  96, 87, 77, 77, 82, 71, 82, 86, 75, 73,
+  81, 83, 90, 93, 95, 76, 73, 87, 98, 85,
+  97, 70, 88, 95, 82, 85, 82, 72, 77, 80,
+  77, 72, 93, 92, 70, 81, 79, 87, 74, 86,
+  70, 74, 84, 87, 82, 87, 80, 77, 92, 85,
+  86, 113, 91, 78, 69, 72, 81, 86, 96, 76,
+  81, 106, 89, 84, 84, 82, 85, 85, 88, 93,
+  83, 80, 69, 75, 90, 75, 86, 82, 80, 83,
+  82, 70, 92, 80, 88, 87, 81, 82, 86, 79,
+  72, 95, 89, 78, 86, 81, 89, 68, 72, 86,
+  85, 90, 79, 70, 96, 85, 80, 71, 87, 84,
+  80, 76, 91, 78, 75, 68, 75, 89, 87, 73,
+  71, 90, 75, 92, 75, 76, 77, 76, 81, 97,
+  81, 75, 81, 71, 89, 76, 62, 103, 86, 94,
+  84, 81, 89, 75, 80, 84, 96, 83, 83, 88,
+  96, 85, 81, 90, 85, 74, 70, 84, 75, 76,
+  100, 104, 69, 85, 85, 91, 73, 86, 66, 74,
+  77, 89, 81, 87, 79, 81, 81, 80, 86, 127,
+  84, 89, 63, 82, 86, 79, 84, 77, 82, 123,
+  90, 83, 80, 77, 82, 81, 83, 88, 77, 76,
+  72, 86, 91, 77, 81, 86, 87, 87, 81, 69,
+  83, 74, 84, 80, 79, 86, 101, 86, 71, 87,
+  92, 87, 75, 80, 101, 65, 73, 86, 88, 79,
+  83, 66, 100, 84, 76, 77, 84, 86, 81, 73,
+  91, 72, 75, 66, 76, 86, 81, 68, 72, 89,
+  78, 94, 80, 78, 84, 75, 97, 113, 77, 78,
+  83, 70, 81, 71, 69, 84, 84, 91, 88, 88,
+  90, 78, 76, 82, 100, 78, 91, 86, 100, 86,
+  79, 87, 76, 73, 80, 90, 80, 80, 90, 84,
+  72, 75, 81, 92, 79, 86, 75, 76, 84, 86,
+  84, 86, 87, 82, 82, 90, 82, 111, 93, 102,
+  77, 77, 82, 86, 86, 88, 83, 102, 88, 87,
+  86, 80, 85, 84, 87, 83, 81, 80, 77, 72,
+  88, 73, 87, 85, 87, 84, 87, 72, 91, 82,
+  87, 84, 79, 79, 88, 81, 74, 90, 86, 80,
+  77, 79, 87, 73, 79, 87, 81, 78, 76, 72,
+  90, 83, 81, 82, 84, 84, 99, 69, 86, 82,
+  79, 70, 82, 90, 81, 76, 79, 88, 86, 93,
+  78, 82, 77, 75, 79, 84, 83, 76, 79, 73,
+  84, 76, 65, 78, 78, 79, 86, 77, 87, 78,
+  78, 82, 92, 85, 84, 92, 93, 85, 94, 83,
+  83, 84, 87, 72, 84, 71, 74, 53, 75, 90,
+  81, 99, 70, 77, 86, 94, 72, 85, 98, 97,
+  107, 71, 91, 87, 88, 72, 95, 88, 89, 97,
+  94, 81, 91, 100, 87, 97, 82, 72, 78, 82,
+  88, 83, 79, 97, 92, 87, 80, 84, 94, 75,
+  74, 86, 96, 92, 79, 73, 78, 81, 82, 81,
+  84, 86, 83, 70, 78, 93, 87, 84, 89, 68,
+  78, 94, 75, 81, 81, 93, 92, 86, 83, 82,
+  87, 83, 76, 82, 72, 81, 88, 83, 65, 76,
+  99, 93, 69, 86, 96, 79, 104, 76, 91, 88,
+  95, 76, 82, 97, 88, 85, 72, 103, 72, 85,
+  68, 100, 83, 73, 81, 86, 59, 81, 89, 71,
+  75, 68, 96, 87, 92, 82, 101, 95, 83, 91,
+  98, 82, 87, 67, 77, 46, 81, 76, 86, 91,
+  70, 83, 92, 89, 74, 92, 90, 113, 89, 81,
+  94, 73, 90, 69, 102, 88, 84, 121, 102, 71,
+  89, 83, 91, 125, 89, 78, 80, 73, 94, 90,
+  73, 113, 110, 87, 85, 81, 83, 77, 79, 93,
+  87, 85, 78, 74, 73, 74, 83, 80, 81, 91,
+  70, 70, 85, 85, 90, 80, 85, 61, 62, 91,
+  80, 72, 98, 97, 84, 92, 84, 84, 89, 79,
+  70, 79, 72, 82, 84, 79, 57, 84, 86, 101,
+  53, 86, 111, 89, 98, 77, 83, 83, 111, 73,
+  99, 93, 82, 80, 75, 95, 78, 91, 63, 72,
+  85, 68, 87, 86, 44, 77, 90, 70, 72, 59,
+  98, 82, 94, 89, 90, 87, 79, 83, 90, 93,
+  87, 76, 73, 61, 79, 90, 86, 84, 74, 73,
+  84, 94, 76, 91, 84, 90, 75, 69, 93, 90,
+  82, 72, 88, 95, 92, 108, 91, 87, 87, 86,
+  89, 94, 90, 73, 77, 82, 90, 77, 81, 96,
+  88, 87, 76, 86, 93, 78, 77, 86, 85, 85,
+  73, 75, 76, 80, 86, 76, 92, 79, 78, 76,
+  77, 97, 75, 81, 84, 72, 89, 86, 75, 91,
+  73, 83, 82, 85, 86, 87, 80, 93, 85, 79,
+  97, 87, 91, 83, 70, 96, 96, 93, 80, 86,
+  90, 77, 82, 74, 88, 81, 89, 77, 74, 98,
+  81, 83, 74, 104, 83, 80, 76, 78, 79, 79,
+  94, 84, 63, 84, 83, 75, 81, 76, 94, 97,
+  89, 78, 91, 83, 71, 79, 88, 75, 88, 88,
+  82, 74, 77, 90, 73, 104, 75, 87, 88, 94,
+  69, 83, 89, 94, 88, 75, 82, 86, 82, 81,
+  96, 84, 84, 97, 85, 86, 88, 98, 88, 101,
+  80, 72, 79, 75, 79, 81, 69, 89, 89, 78,
+  87, 88, 92, 75, 80, 79, 91, 93, 83, 76,
+  87, 85, 78, 76, 81, 86, 84, 76, 72, 87,
+  95, 83, 90, 72, 92, 83, 80, 82, 91, 89,
+  91, 82, 86, 73, 83, 82, 82, 77, 73, 86,
+  94, 81, 80, 70, 95, 96, 82, 91, 96, 82,
+  100, 77, 86, 90, 96, 80, 71, 97, 91, 84,
+  74, 97, 76, 88, 70, 104, 81, 79, 78, 100,
+  66, 78, 85, 82, 74, 76, 94, 77, 70, 78,
+  98, 87, 77, 92, 97, 78, 92, 83, 80, 73,
+  81, 81, 72, 90, 76, 88, 91, 96, 70, 89,
+  78, 109, 82, 77, 85, 71, 83, 77, 98, 92,
+  80, 116, 85, 82, 93, 87, 91, 139, 94, 70,
+  84, 63, 81, 87, 58, 93, 108, 73, 97, 83,
+  81, 82, 87, 79, 86, 85, 87, 76, 84, 81,
+  84, 80, 80, 91, 75, 74, 77, 87, 109, 80,
+  84, 65, 82, 75, 83, 76, 99, 87, 89, 76,
+  89, 72, 88, 86, 79, 77, 72, 90, 93, 77,
+  71, 67, 82, 106, 73, 93, 98, 90, 94, 74,
+  72, 79, 106, 76, 67, 111, 86, 79, 73, 90,
+  73, 101, 65, 75, 82, 78, 84, 100, 58, 78,
+  88, 77, 73, 68, 95, 76, 71, 76, 83, 80,
+  79, 81, 87, 78, 90, 85, 83, 80, 80, 89,
+  78, 81, 79, 83, 83, 91, 72, 83, 76, 92,
+  72, 73, 83, 88, 79, 81, 89, 89, 82, 96,
+  85, 84, 87, 87, 85, 105, 90, 74, 81, 77,
+  87, 79, 72, 88, 90, 86, 81, 86, 91, 81,
+  82, 79, 86, 82, 77, 74, 88, 83, 80, 71,
+  84, 78, 77, 81, 79, 95, 84, 82, 77, 77,
+  94, 81, 78, 85, 81, 80, 73, 82, 89, 83,
+  76, 93, 85, 78, 98, 93, 96, 82, 86, 84,
+  95, 94, 82, 95, 93, 81, 84, 78, 86, 74,
+  91, 78, 66, 95, 89, 83, 73, 97, 86, 79,
+  74, 77, 83, 85, 92, 100, 74, 80, 83, 87,
+  76, 77, 94, 88, 74, 77, 87, 82, 62, 80,
+  79, 78, 79, 89, 85, 91, 73, 85, 73, 98,
+  84, 81, 83, 84, 70, 81, 86, 87, 72, 71,
+  81, 97, 70, 78, 79, 80, 88, 88, 81, 93,
+  84, 81, 96, 96, 87, 78, 80, 70, 88, 76,
+  77, 72, 95, 87, 91, 88, 92, 67, 80, 80,
+  91, 86, 85, 85, 90, 86, 75, 79, 89, 98,
+  79, 89, 79, 87, 88, 84, 84, 71, 99, 79,
+  75, 79, 77, 83, 88, 83, 83, 79, 87, 88,
+  94, 66, 76, 92, 93, 89, 101, 72, 90, 94,
+  93, 87, 94, 86, 89, 81, 86, 89, 91, 84,
+  65, 80, 84, 94, 89, 87, 82, 81, 68, 85,
+  78, 92, 73, 99, 85, 77, 87, 90, 74, 84,
+  91, 96, 72, 94, 87, 88, 72, 88, 85, 72,
+  90, 86, 80, 84, 76, 80, 73, 94, 81, 79,
+  85, 88, 75, 88, 82, 89, 77, 74, 86, 89,
+  67, 73, 95, 87, 89, 89, 82, 86, 80, 78,
+  90, 103, 94, 80, 82, 64, 80, 84, 66, 68,
+  111, 73, 95, 91, 85, 82, 88, 74, 85, 79,
+  89, 88, 98, 84, 80, 83, 92, 93, 72, 86,
+  82, 86, 102, 78, 77, 65, 95, 78, 76, 81,
+  79, 80, 91, 72, 84, 81, 84, 87, 98, 68,
+  73, 100, 97, 87, 95, 68, 95, 101, 93, 92,
+  91, 86, 89, 72, 77, 80, 84, 81, 45, 82,
+  90, 92, 86, 94, 77, 90, 64, 81, 81, 98,
+  80, 103, 82, 74, 94, 85, 80, 78, 94, 100,
+  67, 91, 88, 84, 75, 81, 76, 74, 78, 89,
+  81, 92, 75, 83, 77, 90, 85, 77, 82, 83,
+  65, 86, 83, 91, 84, 72, 81, 92, 70, 81,
+  75, 87, 85, 85, 81, 79, 84, 88, 89, 98,
+  90, 80, 82, 72, 85, 80, 82, 75, 91, 86,
+  88, 86, 89, 76, 80, 80, 86, 74, 84, 86,
+  90, 83, 78, 79, 87, 87, 79, 90, 86, 93,
+  83, 88, 67, 76, 93, 80, 74, 80, 75, 85,
+  76, 84, 82, 84, 83, 85, 96, 68, 77, 93,
+  90, 89, 103, 74, 94, 90, 88, 90, 94, 81,
+  88, 82, 88, 78, 92, 83, 68, 86, 78, 91,
+  85, 82, 90, 80, 71, 81, 84, 93, 88, 99,
+  88, 80, 97, 87, 72, 84, 90, 93, 76, 93,
+  96, 69, 80, 88, 89, 84, 81, 87, 80, 84,
+  89, 84, 80, 74, 85, 69, 79, 77, 80, 90,
+  91, 82, 81, 83, 92, 77, 87, 82, 91, 81,
+  81, 77, 71, 91, 76, 87, 76, 86, 93, 80,
+  78, 95, 88, 91, 89, 93, 85, 80, 80, 79,
+  97, 86, 82, 80, 87, 221, 79, 86, 83, 84,
+  87, 78, 78, 85, 88, 84, 79, 94, 83, 75,
+  92, 84, 79, 81, 90, 78, 75, 103, 92, 87,
+  77, 87, 85, 80, 86, 87, 87, 92, 75, 80,
+  74, 85, 78, 85, 94, 87, 82, 84, 105, 85,
+  78, 81, 83, 94, 93, 88, 83, 90, 95, 86,
+  79, 81, 92, 83, 69, 97, 89, 87, 84, 82,
+  87, 87, 82, 80, 88, 85, 86, 88, 83, 79,
+  84, 88, 86, 73, 82, 90, 89, 87, 83, 93,
+  77, 75, 82, 85, 78, 80, 86, 92, 87, 76,
+  78, 82, 83, 74, 101, 81, 87, 82, 75, 83,
+  73, 82, 79, 80, 86, 84, 67, 76, 85, 86,
+  86, 93, 86, 85, 86, 81, 75, 77, 99, 82,
+  82, 79, 83, 159, 79, 88, 82, 84, 82, 74,
+  87, 74, 87, 78, 72, 83, 73, 84, 69, 76,
+  92, 86, 89, 82, 76, 84, 90, 85, 84, 92,
+  86, 92, 75, 86, 85, 81, 82, 81, 75, 95,
+  78, 79, 89, 78, 83, 83, 85, 79, 85, 82,
+  78, 91, 90, 82, 88, 90, 91, 87, 78, 79,
+  90, 85, 80, 74, 79, 85, 75, 84, 86, 82,
+  82, 81, 79, 83, 81, 85, 87, 82, 97, 81,
+  89, 74, 80, 81, 85, 83, 87, 88, 85, 78,
+  86, 89, 80, 87, 90, 99, 88, 81, 82, 81,
+  81, 80, 93, 78, 92, 88, 84, 84, 77, 86,
+  79, 86, 87, 89, 70, 88, 93, 83, 87, 91,
+  85, 78, 88, 89, 74, 88, 88, 76, 82, 80,
+  77, 87, 82, 87, 83, 84, 88, 87, 88, 90,
+  85, 72, 83, 87, 80, 98, 72, 85, 85, 93,
+  90, 84, 79, 86, 82, 77, 88, 83, 84, 95,
+  93, 88, 91, 88, 79, 77, 74, 90, 85, 81,
+  90, 78, 84, 89, 72, 71, 80, 86, 79, 92,
+  85, 87, 85, 85, 85, 86, 89, 85, 82, 82,
+  94, 77, 82, 88, 87, 81, 79, 86, 81, 82,
+  84, 86, 84, 90, 87, 74, 80, 91, 84, 79,
+  85, 84, 81, 85, 91, 84, 80, 76, 89, 81,
+  84, 82, 85, 89, 89, 80, 76, 84, 86, 81,
+  85, 83, 88, 81, 75, 81, 84, 86, 88, 89,
+  78, 86, 83, 86, 78, 77, 83, 85, 85, 94,
+  74, 84, 79, 94, 93, 82, 86, 84, 85, 115,
+  79, 81, 86, 92, 85, 84, 83, 84, 84, 83,
+  78, 92, 85, 70, 80, 79, 83, 81, 82, 84,
+  77, 82, 86, 87, 82, 77, 87, 84, 82, 87,
+  87, 81, 76, 92, 79, 80, 86, 92, 87, 81,
+  83, 84, 91, 82, 80, 89, 83, 90, 79, 83,
+  90, 84, 83, 82, 81, 81, 86, 87, 70, 77,
+  82, 83, 82, 81, 88, 90, 88, 87, 87, 84,
+  82, 84, 88, 83, 90, 89, 83, 72, 80, 81,
+  84, 87, 84, 87, 78, 87, 82, 84, 79, 76,
+  85, 90, 81, 74, 80, 89, 81, 74, 94, 83,
+  83, 86, 81, 89, 85, 78, 88, 83, 86, 89,
+  73, 80, 83, 87, 86, 86, 83, 85, 88, 90,
+  82, 89, 96, 79, 88, 83, 85, 110, 81, 85,
+  87, 80, 80, 76, 85, 78, 81, 81, 78, 80,
+  81, 71, 53, 77, 83, 83, 85, 79, 85, 77,
+  83, 84, 86, 81, 83, 91, 83, 83, 79, 81,
+  86, 91, 72, 79, 79, 82, 77, 78, 86, 79,
+  88, 78, 78, 92, 87, 89, 83, 80, 91, 87,
+  92, 81, 84, 78, 90, 79, 79, 73, 72, 82,
+  80, 89, 85, 85, 80, 84, 81, 82, 82, 88,
+  89, 82, 90, 84, 91, 79, 77, 75, 78, 82,
+  90, 83, 79, 82, 83, 78, 74, 75, 87, 97,
+  86, 82, 79, 86, 83, 77, 92, 79, 91, 87,
+  93, 88, 82, 89, 89, 90, 85, 93, 73, 91,
+  90, 91, 87, 85, 83, 76, 98, 98, 88, 90,
+  94, 76, 86, 81, 78, 77, 83, 86, 84, 79,
+  85, 89, 82, 89, 75, 80, 82, 90, 86, 80,
+  51, 88, 78, 86, 91, 78, 85, 85, 83, 81,
+  86, 85, 85, 89, 93, 85, 85, 94, 81, 79,
+  74, 73, 85, 79, 83, 83, 85, 86, 83, 76,
+  73, 87, 89, 92, 88, 81, 91, 82, 92, 82,
+  92, 86, 85, 74, 87, 83, 80, 84, 87, 92,
+  81, 85, 77, 79, 85, 85, 83, 95, 94, 84,
+  79, 82, 84, 86, 84, 75, 75, 88, 90, 81,
+  90, 92, 82, 75, 78, 79, 84, 89, 81, 83,
+  75, 85, 84, 77, 81, 85, 86, 91, 81, 82,
+  83, 85, 98, 84, 86, 87, 97, 82, 80, 94,
+  76, 83, 85, 82, 83, 86, 78, 99, 91, 81,
+  82, 83, 88, 83, 79, 78, 84, 84, 83, 79,
+  83, 82, 85, 96, 80, 82, 82, 80, 94, 84,
+  72, 81, 84, 81, 79, 78, 76, 92, 80, 76,
+  82, 83, 88, 88, 81, 84, 88, 86, 73, 77,
+  83, 85, 85, 76, 84, 78, 86, 81, 85, 88,
+  87, 90, 84, 84, 88, 84, 82, 81, 79, 80,
+  82, 80, 93, 77, 78, 82, 87, 84, 84, 88,
+  77, 88, 86, 81, 81, 93, 87, 92, 98, 87,
+  88, 76, 83, 75, 82, 87, 87, 78, 83, 101,
+  80, 77, 78, 78, 91, 90, 77, 76, 86, 88,
+  83, 80, 85, 85, 84, 93, 83, 85, 85, 77,
+  96, 79, 82, 86, 85, 84, 82, 87, 81, 82,
+  82, 87, 85, 86, 82, 98, 87, 78, 84, 85,
+  87, 76, 77, 78, 86, 79, 81, 86, 82, 77,
+  82, 88, 84, 74, 78, 78, 66, 75, 78, 86,
+  83, 80, 83, 76, 78, 90, 83, 72, 83, 84,
+  88, 87, 79, 83, 90, 87, 72, 81, 84, 89,
+  80, 83, 87, 78, 79, 81, 79, 88, 84, 86,
+  81, 75, 87, 82, 85, 81, 89, 79, 84, 78,
+  90, 73, 70, 82, 83, 86, 84, 88, 78, 88,
+  86, 82, 84, 91, 84, 86, 98, 90, 91, 83,
+  84, 73, 78, 84, 87, 75, 78, 88, 84, 76,
+  74, 81, 89, 94, 83, 86, 90, 87, 85, 82,
+  86, 83, 91, 84, 83, 84, 89, 83, 85, 90,
+  71, 87, 78, 94, 85, 76, 85, 84, 83, 82,
+  86, 88, 89, 101, 84, 78, 85, 81, 81, 62,
+  83, 75, 82, 80, 85, 93, 78, 76, 86, 81,
+  85, 84, 80, 79, 62, 81, 80, 89, 87, 84,
+  83, 81, 80, 84, 82, 73, 86, 88, 87, 89,
+  90, 83, 77, 83, 81, 75, 89, 87, 85, 91,
+  86, 81, 80, 79, 77, 89, 80, 89, 81, 74,
+  96, 78, 85, 77, 92, 85, 83, 81, 75, 77,
+  80, 82, 83, 85, 85, 88, 77, 83, 89, 86,
+  82, 91, 88, 68, 98, 87, 79, 76, 91, 83,
+  68, 85, 78, 81, 100, 90, 80, 92, 85, 81,
+  78, 94, 80, 93, 85, 85, 90, 87, 70, 84,
+  88, 99, 99, 84, 79, 85, 92, 80, 69, 82,
+  92, 83, 77, 73, 95, 98, 91, 87, 92, 94,
+  80, 83, 95, 78, 85, 85, 73, 81, 79, 80,
+  81, 98, 80, 81, 96, 74, 82, 76, 84, 81,
+  79, 94, 95, 82, 88, 82, 89, 72, 81, 95,
+  87, 87, 83, 72, 97, 82, 79, 79, 88, 86,
+  73, 102, 82, 86, 79, 75, 76, 101, 86, 85,
+  83, 87, 80, 76, 102, 73, 89, 77, 79, 94,
+  86, 62, 85, 89, 81, 81, 79, 73, 96, 88,
+  85, 83, 93, 70, 65, 82, 95, 97, 84, 75,
+  80, 84, 77, 82, 81, 75, 94, 75, 56, 84,
+  88, 87, 105, 96, 78, 86, 87, 78, 85, 115,
+  89, 88, 80, 76, 82, 77, 56, 78, 98, 99,
+  94, 87, 60, 97, 84, 76, 61, 74, 93, 75,
+  74, 63, 89, 122, 105, 71, 81, 82, 66, 60,
+  102, 61, 75, 81, 54, 86, 76, 81, 72, 112,
+  92, 76, 100, 81, 75, 76, 80, 88, 75, 78,
+  88, 81, 79, 80, 98, 59, 77, 86, 93, 83,
+  83, 93, 89, 84, 97, 78, 82, 91, 69, 104,
+  81, 92, 79, 70, 81, 137, 87, 86, 84, 81,
+  70, 90, 96, 71, 81, 69, 84, 115, 84, 68,
+  87, 77, 76, 79, 77, 60, 81, 94, 92, 79,
+  92, 70, 40, 76, 90, 96, 86, 61, 85, 98,
+  90, 89, 72, 84, 86, 85, 69, 85, 78, 86,
+  95, 87, 80, 90, 88, 77, 80, 88, 86, 96,
+  70, 81, 79, 88, 78, 81, 84, 96, 93, 83,
+  77, 76, 95, 78, 75, 78, 86, 82, 75, 74,
+  79, 92, 94, 84, 86, 87, 76, 83, 94, 84,
+  81, 89, 77, 80, 81, 80, 80, 97, 86, 84,
+  92, 69, 82, 80, 73, 78, 79, 86, 91, 89,
+  86, 82, 89, 73, 84, 87, 93, 90, 82, 68,
+  96, 84, 78, 81, 83, 83, 71, 97, 83, 96,
+  87, 77, 87, 96, 88, 84, 94, 88, 82, 90,
+  97, 71, 89, 78, 73, 89, 84, 70, 94, 90,
+  83, 92, 71, 74, 98, 87, 88, 83, 91, 74,
+  68, 81, 90, 94, 83, 83, 103, 70, 81, 83,
+  78, 79, 91, 78, 66, 86, 95, 88, 91, 76,
+  74, 98, 82, 74, 87, 86, 84, 88, 86, 92,
+  83, 88, 79, 88, 91, 94, 94, 76, 88, 94,
+  96, 89, 75, 69, 99, 70, 65, 76, 94, 80,
+  91, 96, 81, 102, 74, 76, 100, 75, 86, 91,
+  74, 98, 69, 76, 86, 98, 85, 84, 81, 79,
+  72, 77, 77, 78, 73, 73, 112, 87, 82, 79,
+  85, 76, 80, 89, 87, 85, 84, 77, 95, 83,
+  83, 84, 87, 89, 75, 92, 76, 71, 81, 72,
+  80, 98, 85, 83, 82, 94, 72, 85, 95, 76,
+  91, 89, 80, 79, 82, 73, 85, 85, 77, 86,
+  71, 71, 77, 80, 73, 80, 88, 75, 72, 77,
+  88, 84, 89, 76, 96, 87, 77, 82, 77, 69,
+  93, 70, 55, 93, 120, 90, 103, 93, 71, 109,
+  88, 75, 105, 106, 97, 77, 69, 88, 69, 72,
+  70, 85, 101, 101, 93, 80, 70, 104, 92, 81,
+  66, 75, 91, 50, 60, 66, 105, 96, 105, 81,
+  66, 81, 59, 51, 115, 63, 71, 84, 45, 88,
+  69, 79, 65, 140, 94, 73, 73, 93, 56, 75,
+  72, 94, 65, 60, 80, 85, 74, 84, 85, 65,
+  77, 90, 95, 83, 86, 99, 87, 85, 104, 93,
+  80, 96, 70, 99, 79, 72, 73, 60, 84, 122,
+  80, 84, 74, 91, 73, 78, 96, 79, 84, 74,
+  82, 105, 76, 73, 95, 70, 65, 79, 80, 60,
+  73, 77, 71, 83, 95, 77, 36, 66, 81, 84,
+  96, 68, 96, 98, 99, 85, 74, 91, 90, 78,
+  67, 88, 89, 92, 87, 99, 74, 89, 83, 70,
+  90, 82, 85, 101, 70, 87, 72, 90, 83, 84,
+  88, 97, 95, 86, 84, 82, 95, 87, 80, 72,
+  82, 71, 56, 74, 82, 84, 96, 88, 77, 81,
+  77, 76, 98, 92, 80, 94, 76, 66, 72, 74,
+  79, 93, 89, 84, 79, 69, 73, 76, 76, 80,
+  78, 78, 75, 93, 78, 78, 85, 78, 86, 91,
+  84, 85, 84, 73, 95, 88, 82, 87, 83, 86,
+  74, 89, 78, 77, 80, 70, 82, 95, 87, 81,
+  89, 95, 74, 71, 94, 78, 86, 91, 76, 78,
+  77, 77, 97, 84, 79, 92, 83, 79, 106, 79,
+  76, 86, 90, 79, 74, 80, 83, 83, 90, 84,
+  96, 74, 82, 85, 73, 84, 79, 86, 84, 81,
+  84, 95, 83, 87, 64, 105, 82, 77, 95, 82,
+  87, 93, 82, 101, 78, 89, 94, 84, 77, 92,
+  84, 78, 87, 78, 100, 92, 87, 78, 97, 79,
+  75, 73, 73, 72, 76, 100, 86, 91, 79, 98,
+  89, 84, 96, 95, 99, 94, 74, 80, 108, 81,
+  86, 89, 80, 87, 81, 78, 75, 77, 75, 89,
+  93, 88, 83, 76, 85, 81, 86, 87, 87, 60,
+  80, 65, 96, 74, 66, 98, 84, 80, 91, 89,
+  77, 80, 91, 82, 85, 72, 82, 75, 92, 96,
+  78, 93, 87, 73, 103, 98, 75, 69, 77, 89,
+  92, 86, 90, 84, 76, 92, 69, 75, 77, 72,
+  98, 83, 89, 83, 83, 82, 86, 88, 94, 79,
+  76, 87, 65, 70, 79, 79, 82, 86, 102, 97,
+  86, 95, 72, 106, 81, 83, 104, 77, 83, 85,
+  70, 100, 76, 75, 98, 84, 90, 95, 84, 86,
+  100, 78, 104, 74, 84, 82, 91, 65, 69, 62,
+  89, 72, 76, 100, 75, 81, 67, 97, 91, 95,
+  92, 92, 87, 93, 69, 85, 94, 94, 89, 81,
+  63, 93, 73, 73, 72, 81, 65, 82, 87, 78,
+  80, 77, 82, 75, 88, 75, 94, 50, 82, 67,
+  97, 87, 70, 98, 80, 83, 95, 102, 72, 75,
+  86, 79, 84, 73, 92, 76, 80, 96, 82, 79,
+  82, 76, 106, 110, 76, 75, 77, 90, 107, 82,
+  86, 79, 80, 94, 73, 70, 66, 77, 96, 84,
+  81, 79, 72, 86, 86, 103, 88, 83, 87, 82,
+  77, 82, 81, 80, 81, 86, 82, 95, 81, 96,
+  68, 103, 80, 75, 91, 77, 72, 94, 80, 101,
+  81, 91, 92, 82, 76, 93, 89, 87, 89, 87,
+  99, 77, 87, 75, 78, 81, 71, 72, 91, 79,
+  76, 97, 86, 89, 79, 99, 88, 88, 95, 96,
+  96, 80, 75, 82, 96, 82, 91, 89, 77, 79,
+  81, 76, 79, 80, 71, 89, 70, 86, 79, 72,
+  86, 84, 85, 80, 90, 58, 85, 64, 89, 97,
+  67, 93, 85, 82, 90, 93, 76, 75, 89, 85,
+  90, 76, 79, 74, 85, 93, 80, 70, 89, 74,
+  108, 97, 74, 74, 82, 94, 92, 84, 91, 85,
+  83, 98, 94, 77, 80, 76, 84, 83, 93, 86,
+  85, 86, 91, 89, 81, 79, 81, 76, 72, 78,
+  79, 86, 89, 76, 87, 83, 76, 84, 75, 81,
+  73, 86, 89, 80, 89, 74, 88, 79, 80, 79,
+  92, 86, 101, 79, 91, 82, 99, 76, 79, 95,
+  82, 79, 82, 73, 91, 83, 78, 87, 80, 93,
+  71, 87, 84, 84, 82, 87, 68, 92, 97, 80,
+  78, 84, 76, 76, 75, 83, 79, 85, 92, 89,
+  81, 84, 84, 85, 85, 78, 73, 73, 89, 84,
+  101, 84, 82, 87, 76, 78, 86, 77, 85, 80,
+  81, 76, 82, 85, 95, 77, 78, 86, 77, 85,
+  87, 88, 85, 96, 94, 80, 84, 73, 91, 75,
+  75, 86, 80, 71, 79, 92, 90, 81, 89, 89,
+  85, 81, 86, 88, 89, 87, 81, 76, 91, 83,
+  88, 94, 80, 80, 83, 80, 74, 78, 74, 90,
+  98, 71, 94, 76, 75, 83, 75, 81, 73, 82,
+  102, 86, 79, 76, 80, 75, 87, 73, 94, 85,
+  93, 79, 82, 93, 111, 79, 77, 83, 85, 72,
+  83, 74, 86, 84, 76, 85, 71, 90, 72, 86,
+  86, 93, 92, 87, 68, 98, 107, 85, 88, 76,
+  68, 72, 80, 95, 82, 90, 91, 89, 79, 80,
+  81, 90, 82, 76, 76, 73, 85, 99, 114, 83,
+  82, 91, 80, 75, 89, 80, 82, 83, 88, 76,
+  78, 77, 106, 82, 80, 78, 82, 81, 104, 86,
+  79, 95, 96, 86, 86, 73, 84, 72, 79, 86,
+  81, 77, 72, 99, 93, 86, 86, 91, 85, 77,
+  81, 93, 81, 88, 84, 77, 99, 83, 85, 98,
+  83, 78, 82, 72, 72, 85, 78, 86, 85, 75,
+  83, 82, 78, 83, 74, 80, 79, 87, 87, 82,
+  81, 76, 76, 78, 85, 79, 93, 84, 99, 83,
+  90, 91, 97, 84, 78, 81, 85, 79, 80, 73,
+  87, 80, 88, 85, 77, 91, 73, 86, 82, 80,
+  84, 88, 70, 92, 97, 86, 79, 85, 74, 80,
+  79, 83, 82, 82, 97, 90, 80, 87, 83, 86,
+  89, 73, 78, 71, 86, 77, 96, 81, 80, 84,
+  77, 74, 88, 86, 83, 81, 82, 76, 84, 86,
+  93, 80, 80, 88, 73, 84, 81, 86, 80, 90,
+  91, 85, 84, 78, 88, 75, 74, 90, 78, 73,
+  79, 90, 92, 82, 80, 92, 82, 81, 86, 90,
+  78, 82, 80, 77, 86, 82, 85, 91, 79, 80,
+  82, 79, 77, 77, 74, 84, 98, 73, 101, 82,
+  74, 85, 78, 76, 73, 81, 97, 80, 86, 82,
+  86, 79, 85, 75, 81, 90, 84, 78, 74, 86,
+  108, 71, 82, 98, 76, 84, 79, 66, 77, 87,
+  78, 82, 73, 95, 73, 85, 84, 85, 88, 87,
+  67, 101, 104, 87, 84, 77, 76, 73, 74, 96,
+  76, 81, 89, 84, 74, 84, 94, 78, 85, 74,
+  79, 77, 92, 90, 112, 91, 80, 81, 82, 75,
+  88, 73, 89, 82, 79, 78, 78, 71, 98, 80,
+  80, 78, 85, 90, 105, 90, 90, 96, 92, 76,
+  82, 75, 83, 82, 80, 79, 78, 76, 80, 92,
+  93, 81, 80, 87, 87, 76, 80, 99, 91, 91,
+  81, 76, 92, 81, 88, 100, 77, 77, 90, 83,
+  79, 85, 72, 88, 120, 71, 109, 72, 75, 83,
+  84, 72, 70, 78, 118, 81, 82, 84, 82, 78,
+  88, 70, 86, 99, 81, 81, 62, 103, 126, 70,
+  82, 85, 77, 79, 83, 68, 70, 86, 76, 76,
+  72, 100, 71, 86, 81, 101, 101, 101, 61, 108,
+  123, 85, 83, 75, 69, 67, 69, 114, 73, 90,
+  88, 93, 68, 75, 94, 78, 80, 69, 89, 84,
+  83, 106, 135, 82, 79, 85, 81, 74, 91, 87,
+  90, 83, 85, 79, 79, 67, 106, 79, 80, 67,
+  99, 89, 127, 90, 83, 105, 96, 81, 85, 77,
+  73, 83, 83, 76, 78, 82, 79, 92, 99, 84,
+  79, 90, 88, 73, 76, 101, 81, 92, 78, 70,
+  100, 80, 87, 112, 78, 76, 87, 75, 79, 85,
+  72, 89, 97, 72, 96, 84, 76, 79, 78, 76,
+  79, 85, 97, 83, 84, 76, 76, 82, 85, 75,
+  80, 89, 81, 87, 80, 97, 103, 82, 79, 82,
+  82, 80, 84, 69, 76, 82, 83, 83, 75, 94,
+  80, 88, 84, 82, 88, 86, 68, 101, 102, 82,
+  80, 82, 72, 80, 76, 93, 76, 80, 86, 84,
+  77, 85, 90, 79, 93, 73, 80, 81, 90, 87,
+  103, 73, 77, 80, 80, 77, 92, 98, 91, 81,
+  81, 80, 80, 80, 101, 78, 84, 81, 79, 87,
+  97, 88, 79, 94, 92, 82, 85, 79, 78, 80,
+  78, 82, 79, 77, 84, 88, 98, 81, 78, 85,
+  85, 76, 79, 94, 76, 88, 81, 78, 90, 82,
+  86, 95, 78, 87, 83, 74, 71, 77, 80, 88,
+  89, 72, 88, 93, 81, 85, 77, 75, 76, 84,
+  83, 81, 81, 83, 78, 78, 87, 78, 84, 84,
+  90, 77, 74, 86, 100, 77, 78, 98, 83, 87,
+  74, 75, 79, 85, 78, 83, 77, 93, 80, 91,
+  87, 72, 87, 88, 72, 101, 96, 85, 83, 74,
+  79, 74, 78, 84, 83, 81, 87, 85, 76, 88,
+  88, 80, 83, 80, 71, 80, 93, 80, 97, 83,
+  83, 84, 83, 85, 94, 80, 89, 84, 77, 75,
+  79, 75, 91, 80, 80, 82, 85, 90, 84, 86,
+  93, 98, 90, 76, 80, 78, 83, 79, 75, 80,
+  75, 75, 83, 92, 90, 82, 85, 90, 78, 79,
+  82, 92, 90, 85, 82, 78, 83, 80, 87, 85,
+  81, 84, 91, 78, 75, 79, 76, 91, 97, 72,
+  92, 85, 84, 80, 80, 69, 72, 84, 95, 82,
+  82, 81, 78, 75, 88, 75, 91, 91, 85, 78,
+  70, 98, 113, 74, 76, 88, 82, 86, 81, 75,
+  70, 85, 83, 84, 79, 93, 82, 90, 84, 81,
+  92, 90, 70, 102, 103, 82, 81, 72, 66, 74,
+  73, 88, 79, 88, 90, 89, 73, 84, 89, 84,
+  85, 76, 71, 87, 89, 89, 105, 87, 81, 84,
+  81, 87, 95, 93, 90, 84, 81, 73, 76, 76,
+  103, 80, 80, 77, 89, 87, 92, 88, 89, 100,
+  96, 76, 79, 77, 75, 85, 80, 81, 78, 77,
+  81, 91, 94, 82, 84, 88, 84, 75, 76, 89,
+  81, 88, 82, 74, 92, 79, 87, 91, 77, 80,
+  84, 72, 75, 74, 79, 92, 90, 73, 83, 93,
+  82, 75, 76, 77, 79, 85, 87, 76, 84, 77,
+  73, 78, 90, 78, 82, 84, 88, 81, 83, 94,
+  91, 83, 78, 83, 85, 82, 82, 78, 77, 83,
+  82, 83, 77, 92, 87, 87, 87, 70, 85, 82,
+  71, 98, 96, 82, 76, 78, 75, 76, 80, 87,
+  82, 80, 79, 86, 82, 87, 85, 83, 88, 81,
+  69, 81, 93, 80, 97, 86, 82, 84, 77, 87,
+  94, 95, 93, 82, 82, 79, 83, 85, 92, 82,
+  84, 87, 83, 89, 78, 87, 85, 101, 91, 76,
+  83, 79, 81, 79, 75, 84, 79, 73, 83, 87,
+  91, 78, 87, 93, 79, 80, 82, 89, 83, 87,
+  83, 80, 83, 80, 86, 81, 87, 76, 82, 89,
+  80, 75, 102, 87, 106, 81, 77, 94, 67, 91,
+  117, 78, 76, 84, 74, 72, 78, 69, 73, 80,
+  91, 70, 92, 88, 94, 62, 85, 74, 80, 88,
+  75, 83, 72, 85, 96, 88, 70, 130, 77, 94,
+  101, 75, 81, 86, 67, 101, 83, 76, 91, 94,
+  78, 82, 84, 63, 80, 88, 67, 77, 81, 105,
+  93, 104, 79, 89, 73, 97, 75, 86, 79, 67,
+  93, 86, 112, 82, 73, 76, 93, 89, 93, 78,
+  91, 84, 75, 79, 82, 75, 91, 81, 86, 76,
+  70, 86, 74, 96, 79, 77, 98, 67, 90, 74,
+  85, 86, 86, 90, 77, 88, 86, 93, 88, 92,
+  74, 80, 95, 76, 76, 64, 95, 83, 67, 82,
+  72, 78, 88, 77, 95, 83, 80, 87, 85, 79,
+  94, 83, 91, 82, 82, 90, 69, 91, 111, 82,
+  76, 89, 75, 79, 73, 78, 70, 81, 86, 76,
+  91, 90, 80, 69, 83, 74, 83, 85, 77, 82,
+  74, 85, 95, 91, 78, 114, 75, 92, 107, 74,
+  79, 85, 77, 108, 79, 79, 83, 90, 82, 79,
+  73, 72, 82, 96, 75, 79, 81, 94, 89, 106,
+  80, 96, 77, 104, 74, 95, 81, 66, 95, 77,
+  110, 73, 80, 71, 94, 81, 92, 74, 90, 75,
+  82, 73, 78, 87, 81, 86, 88, 88, 75, 85,
+  72, 108, 83, 73, 102, 79, 86, 80, 86, 88,
+  78, 85, 78, 87, 85, 100, 89, 84, 73, 75,
+  82, 78, 76, 59, 80, 84, 54, 79, 76, 82,
+  85, 85, 85, 89, 75, 88, 86, 85, 94, 87,
+  99, 82, 78, 99, 68, 97, 111, 79, 75, 81,
+  79, 72, 79, 74, 69, 79, 82, 73, 91, 86,
+  92, 71, 82, 73, 82, 86, 74, 104, 73, 82,
+  90, 88, 73, 122, 83, 93, 101, 75, 81, 88,
+  70, 100, 83, 77, 88, 95, 76, 84, 92, 62,
+  86, 85, 76, 76, 86, 102, 92, 101, 78, 90,
+  74, 91, 84, 83, 83, 70, 95, 85, 109, 75,
+  79, 74, 93, 84, 94, 85, 89, 78, 95, 75,
+  76, 89, 93, 84, 86, 76, 74, 83, 76, 95,
+  86, 81, 100, 76, 90, 74, 82, 83, 88, 89,
+  75, 86, 90, 89, 91, 81, 69, 77, 78, 79,
+  76, 69, 67, 81, 70, 82, 72, 78, 88, 79,
+  100, 79, 76, 88, 72, 84, 102, 92, 100, 86,
+  76, 85, 75, 100, 112, 74, 84, 87, 83, 76,
+  76, 59, 83, 80, 89, 71, 84, 89, 74, 63,
+  81, 70, 82, 88, 99, 86, 73, 84, 80, 78,
+  73, 127, 92, 90, 97, 78, 82, 90, 72, 97,
+  87, 80, 77, 95, 85, 79, 81, 66, 76, 93,
+  61, 80, 76, 93, 85, 106, 85, 76, 78, 87,
+  80, 92, 76, 79, 90, 82, 105, 90, 76, 77,
+  91, 87, 82, 78, 86, 81, 75, 80, 85, 64,
+  85, 70, 83, 82, 80, 95, 73, 96, 83, 70,
+  84, 72, 82, 73, 81, 83, 85, 92, 72, 87,
+  90, 96, 89, 86, 68, 88, 94, 78, 71, 72,
+  86, 88, 64, 77, 74, 76, 91, 90, 122, 85,
+  80, 90, 77, 84, 104, 86, 95, 95, 86, 79,
+  82, 84, 118, 87, 92, 83, 86, 84, 80, 70,
+  70, 88, 93, 86, 82, 94, 62, 79, 83, 83,
+  87, 92, 96, 76, 75, 95, 93, 89, 81, 152,
+  80, 91, 111, 82, 83, 93, 85, 117, 77, 94,
+  76, 92, 102, 80, 79, 83, 75, 111, 74, 76,
+  70, 120, 80, 126, 96, 92, 86, 89, 76, 118,
+  69, 75, 99, 79, 114, 75, 76, 78, 94, 83,
+  85, 66, 95, 82, 72, 75, 90, 71, 80, 66,
+  81, 106, 77, 105, 75, 112, 90, 69, 87, 82,
+  79, 78, 87, 88, 82, 85, 83, 89, 100, 101,
+  92, 71, 64, 85, 79, 85, 74, 71, 64, 99,
+  52, 69, 87, 76, 92, 115, 90, 86, 87, 87,
+  76, 99, 95, 89, 95, 87, 74, 85, 70, 80,
+  106, 83, 85, 86, 86, 74, 89, 57, 74, 76,
+  81, 74, 78, 86, 72, 89, 79, 80, 84, 81,
+  80, 100, 79, 85, 100, 84, 76, 115, 77, 89,
+  94, 80, 84, 96, 74, 95, 90, 82, 75, 94,
+  85, 81, 83, 65, 81, 89, 68, 77, 76, 87,
+  83, 102, 86, 80, 78, 84, 84, 86, 80, 77,
+  97, 84, 103, 83, 80, 78, 91, 86, 83, 93,
+  83, 80, 86, 76, 83, 80, 84, 73, 83, 83,
+  77, 91, 74, 95, 83, 74, 82, 77, 86, 74,
+  80, 81, 85, 88, 74, 84, 101, 92, 91, 76,
+  66, 88, 81, 80, 71, 72, 57, 89, 65, 80,
+  74, 79, 90, 92, 99, 85, 73, 86, 80, 81,
+  100, 99, 99, 85, 76, 95, 75, 98, 113, 77,
+  86, 83, 86, 78, 86, 73, 74, 77, 82, 69,
+  92, 87, 84, 69, 82, 70, 83, 90, 89, 86,
+  77, 84, 86, 77, 87, 135, 90, 99, 92, 79,
+  87, 94, 73, 89, 90, 81, 83, 94, 78, 88,
+  87, 65, 81, 88, 64, 82, 75, 98, 92, 111,
+  86, 72, 76, 88, 85, 83, 80, 83, 90, 83,
+  99, 82, 86, 72, 96, 78, 82, 71, 94, 76,
+  76, 79, 75, 76, 93, 75, 84, 84, 82, 93,
+  69, 92, 87, 75, 90, 73, 93, 71, 79, 79,
+  89, 106, 77, 83, 85, 94, 92, 83, 77, 82,
+  84, 79, 74, 79, 79, 84, 66, 81, 77, 88,
+  84, 81, 108, 81, 80, 83, 82, 83, 100, 95,
+  89, 80, 76, 90, 76, 83, 109, 86, 90, 86,
+  90, 84, 88, 82, 71, 77, 78, 66, 94, 90,
+  74, 86, 80, 79, 92, 86, 91, 79, 80, 84,
+  89, 80, 93, 122, 86, 96, 91, 84, 93, 86,
+  77, 91, 89, 86, 77, 91, 86, 81, 80, 74,
+  78, 90, 77, 85, 73, 90, 81, 109, 97, 77,
+  79, 97, 75, 80, 79, 84, 90, 75, 92, 78,
+  95, 66, 98, 76, 84, 71, 89, 80, 76, 73,
+  80, 75, 90, 75, 79, 90, 80, 92, 67, 99,
+  87, 73, 91, 70, 81, 77, 72, 86, 82, 104,
+  81, 84, 90, 105, 91, 75, 81, 78, 82, 80,
+  72, 79, 69, 83, 57, 72, 81, 90, 77, 96,
+  96, 86, 91, 82, 81, 88, 99, 94, 97, 85,
+  76, 93, 72, 82, 110, 85, 87, 82, 90, 77,
+  87, 72, 73, 77, 81, 72, 87, 85, 82, 88,
+  82, 78, 83, 89, 78, 98, 80, 86, 98, 80,
+  89, 130, 79, 95, 96, 80, 86, 86, 75, 87,
+  89, 81, 79, 92, 77, 82, 85, 69, 80, 83,
+  75, 79, 72, 99, 84, 110, 93, 74, 77, 86,
+  81, 83, 80, 83, 87, 84, 97, 80, 84, 74,
+  96, 85, 85, 89, 95, 79, 81, 77, 78, 83,
+  89, 67, 87, 86, 80, 90, 73, 91, 81, 78,
+  86, 72, 93, 71, 79, 80, 86, 100, 80, 84,
+  92, 93, 94, 75, 77, 87, 84, 82, 77, 79,
+  56, 81, 69, 79, 80, 95, 86, 82, 83, 88,
+  87, 95, 81, 84, 81, 76, 79, 60, 86, 89,
+  71, 78, 79, 90, 76, 83, 84, 97, 92, 88,
+  80, 77, 87, 83, 88, 91, 92, 86, 80, 83,
+  75, 83, 86, 63, 80, 97, 80, 78, 80, 76,
+  89, 83, 75, 90, 84, 96, 77, 77, 78, 89,
+  75, 88, 94, 83, 74, 84, 82, 79, 93, 78,
+  78, 81, 96, 77, 69, 78, 92, 93, 86, 82,
+  89, 85, 90, 71, 81, 100, 77, 90, 83, 77,
+  83, 79, 85, 86, 81, 81, 90, 76, 89, 77,
+  89, 86, 75, 87, 72, 82, 89, 100, 79, 71,
+  74, 81, 80, 85, 70, 79, 81, 90, 80, 85,
+  105, 117, 85, 77, 86, 76, 92, 88, 83, 90,
+  71, 78, 89, 105, 98, 86, 85, 93, 88, 112,
+  79, 90, 83, 72, 82, 60, 93, 93, 87, 79,
+  83, 99, 79, 88, 87, 99, 93, 91, 76, 74,
+  88, 79, 94, 113, 98, 86, 79, 58, 80, 90,
+  91, 82, 78, 96, 80, 72, 83, 82, 95, 89,
+  73, 80, 87, 82, 64, 83, 78, 88, 76, 79,
+  89, 88, 74, 85, 87, 90, 106, 70, 79, 79,
+  72, 78, 78, 86, 84, 90, 81, 85, 69, 84,
+  84, 74, 90, 82, 82, 89, 86, 75, 89, 69,
+  89, 79, 88, 92, 94, 73, 80, 73, 78, 85,
+  65, 96, 73, 91, 89, 89, 79, 79, 104, 82,
+  68, 87, 75, 83, 75, 91, 76, 94, 104, 82,
+  79, 91, 81, 77, 92, 82, 81, 89, 72, 83,
+  93, 90, 107, 93, 80, 79, 91, 105, 84, 99,
+  83, 82, 77, 70, 90, 91, 80, 79, 82, 92,
+  83, 83, 76, 89, 88, 81, 85, 84, 86, 86,
+  84, 91, 79, 91, 85, 67, 80, 91, 87, 125,
+  82, 93, 81, 72, 78, 78, 92, 89, 80, 93,
+  83, 78, 81, 79, 80, 82, 76, 80, 88, 89,
+  80, 83, 87, 82, 94, 70, 82, 77, 82, 78,
+  82, 84, 93, 93, 91, 77, 81, 88, 73, 79,
+  89, 71, 87, 88, 81, 80, 84, 82, 80, 78,
+  116, 79, 90, 77, 88, 80, 91, 90, 80, 91,
+  77, 83, 79, 91, 81, 81, 82, 81, 87, 83,
+  70, 85, 78, 86, 74, 91, 99, 74, 83, 81,
+  88, 78, 95, 88, 73, 91, 72, 75, 87, 114,
+  91, 83, 82, 86, 91, 96, 77, 85, 82, 79,
+  76, 74, 86, 87, 65, 80, 79, 90, 73, 69,
+  92, 93, 95, 91, 75, 75, 85, 90, 87, 94,
+  99, 82, 79, 91, 80, 81, 80, 52, 83, 74,
+  82, 73, 93, 72, 85, 82, 71, 88, 90, 95,
+  75, 78, 80, 82, 81, 80, 88, 83, 79, 86,
+  95, 78, 83, 87, 70, 73, 92, 76, 78, 81,
+  79, 76, 92, 81, 91, 80, 87, 76, 83, 108,
+  74, 92, 84, 77, 84, 74, 84, 73, 79, 91,
+  88, 78, 91, 79, 101, 90, 80, 84, 80, 83,
+  89, 91, 77, 76, 80, 79, 88, 84, 78, 84,
+  87, 86, 81, 92, 87, 126, 85, 89, 78, 80,
+  96, 77, 81, 84, 80, 91, 85, 112, 89, 84,
+  89, 88, 92, 115, 75, 81, 85, 77, 80, 76,
+  96, 97, 79, 84, 78, 94, 74, 70, 118, 88,
+  88, 100, 77, 69, 83, 90, 90, 118, 111, 87,
+  78, 60, 79, 84, 87, 76, 77, 66, 80, 73,
+  100, 70, 93, 89, 71, 78, 95, 87, 55, 85,
+  83, 81, 78, 71, 87, 93, 75, 83, 98, 85,
+  86, 71, 65, 75, 73, 76, 80, 83, 74, 62,
+  85, 84, 78, 79, 82, 77, 86, 85, 81, 90,
+  85, 78, 91, 71, 92, 64, 89, 97, 94, 76,
+  80, 82, 91, 92, 64, 89, 74, 90, 94, 82,
+  77, 72, 114, 80, 70, 79, 82, 92, 83, 82,
+  79, 90, 81, 84, 89, 93, 80, 69, 100, 72,
+  81, 75, 72, 99, 86, 96, 99, 89, 82, 81,
+  83, 104, 81, 90, 83, 81, 77, 86, 92, 89,
+  79, 90, 81, 94, 76, 75, 94, 81, 81, 85,
+  98, 82, 88, 92, 83, 95, 89, 92, 81, 68,
+  84, 88, 86, 131, 85, 70, 81, 73, 85, 71,
+  87, 86, 77, 86, 89, 79, 77, 84, 78, 84,
+  85, 76, 84, 86, 79, 81, 98, 83, 86, 67,
+  69, 72, 69, 75, 89, 83, 83, 82, 79, 72,
+  80, 80, 74, 81, 88, 70, 78, 87, 81, 79,
+  84, 86, 80, 66, 118, 79, 85, 78, 89, 75,
+  100, 94, 76, 83, 83, 82, 79, 83, 77, 79,
+  92, 78, 90, 82, 76, 92, 84, 84, 76, 90,
+  82, 73, 88, 89, 94, 76, 96, 81, 74, 83,
+  84, 88, 81, 118, 86, 85, 88, 91, 91, 90,
+  80, 80, 74, 77, 87, 80, 74, 91, 74, 90,
+  74, 80, 79, 68, 88, 87, 90, 85, 83, 78,
+  91, 91, 86, 67, 67, 79, 76, 103, 86, 95,
+  62, 59, 98, 65, 81, 77, 83, 60, 97, 77,
+  81, 82, 90, 102, 85, 80, 82, 84, 88, 74,
+  83, 79, 83, 81, 90, 81, 78, 86, 78, 80,
+  79, 79, 83, 80, 76, 80, 80, 76, 96, 85,
+  82, 72, 86, 97, 71, 84, 75, 85, 97, 82,
+  90, 59, 67, 80, 82, 79, 92, 79, 106, 93,
+  91, 85, 90, 80, 88, 86, 72, 79, 77, 71,
+  105, 87, 77, 76, 101, 79, 82, 82, 71, 121,
+  89, 95, 75, 91, 87, 77, 85, 82, 90, 95,
+  73, 173, 79, 74, 90, 87, 87, 98, 77, 84,
+  80, 71, 86, 89, 79, 99, 81, 89, 75, 81,
+  73, 73, 97, 80, 90, 92, 82, 76, 88, 94,
+  85, 79, 74, 77, 79, 87, 86, 93, 67, 83,
+  88, 61, 81, 75, 87, 51, 94, 85, 81, 82,
+  88, 93, 74, 82, 83, 87, 88, 68, 85, 87,
+  81, 79, 99, 88, 81, 81, 68, 84, 75, 78,
+  81, 91, 77, 81, 84, 73, 96, 83, 78, 78,
+  82, 84, 78, 79, 74, 90, 96, 77, 95, 54,
+  82, 87, 79, 79, 85, 85, 113, 99, 91, 91,
+  87, 82, 96, 84, 75, 76, 78, 72, 104, 92,
+  76, 80, 103, 77, 82, 84, 64, 86, 92, 100,
+  77, 92, 91, 76, 82, 86, 85, 92, 76, 194,
+  85, 77, 92, 82, 76, 92, 78, 90, 74, 80,
+  86, 89, 76, 92, 81, 88, 76, 82, 82, 71,
+  85, 74, 86, 88, 89, 83, 90, 91, 78, 65,
+  57, 83, 82, 84, 89, 91, 80, 121, 91, 67,
+  87, 72, 81, 60, 89, 78, 86, 85, 91, 84,
+  88, 87, 84, 86, 92, 75, 76, 85, 82, 80,
+  97, 84, 81, 75, 78, 80, 68, 78, 87, 84,
+  80, 83, 76, 73, 87, 82, 72, 75, 91, 80,
+  74, 80, 74, 82, 93, 74, 89, 52, 106, 73,
+  76, 83, 89, 81, 103, 96, 91, 81, 90, 79,
+  90, 83, 70, 74, 85, 69, 106, 90, 74, 79,
+  94, 81, 78, 80, 72, 71, 91, 107, 81, 92,
+  87, 81, 80, 84, 95, 93, 70, 184, 79, 81,
+  87, 73, 92, 82, 91, 104, 75, 78, 81, 81,
+  80, 94, 77, 103, 80, 81, 77, 88, 77, 86,
+  106, 77, 60, 87, 79, 103, 87, 93, 87, 103,
+  83, 69, 78, 84, 89, 74, 86, 88, 76, 72,
+  88, 73, 71, 80, 82, 80, 71, 87, 80, 102,
+  67, 95, 81, 86, 83, 84, 74, 70, 83, 92,
+  94, 83, 79, 78, 86, 90, 87, 94, 82, 90,
+  75, 86, 93, 87, 77, 80, 84, 86, 75, 84,
+  91, 82, 87, 94, 96, 87, 90, 88, 92, 91,
+  76, 79, 77, 91, 65, 77, 81, 87, 114, 87,
+  80, 85, 96, 82, 86, 78, 77, 86, 89, 77,
+  78, 81, 90, 84, 93, 88, 80, 77, 80, 95,
+  80, 95, 79, 84, 92, 85, 88, 94, 105, 74,
+  72, 75, 82, 76, 85, 86, 73, 69, 86, 128,
+  90, 87, 76, 83, 81, 112, 92, 86, 99, 78,
+  68, 73, 90, 108, 87, 91, 89, 93, 99, 63,
+  76, 72, 89, 64, 86, 75, 81, 82, 75, 84,
+  92, 94, 92, 81, 76, 81, 59, 81, 75, 89,
+  90, 82, 91, 86, 82, 59, 87, 97, 101, 63,
+  86, 93, 69, 89, 85, 89, 66, 86, 63, 68,
+  75, 86, 74, 75, 83, 74, 79, 82, 83, 83,
+  94, 80, 114, 75, 86, 89, 92, 104, 85, 82,
+  66, 91, 66, 82, 73, 95, 86, 75, 77, 84,
+  96, 87, 61, 76, 84, 93, 79, 85, 76, 89,
+  93, 79, 90, 84, 72, 81, 86, 79, 88, 100,
+  74, 88, 70, 83, 108, 85, 100, 76, 78, 81,
+  87, 52, 74, 88, 76, 77, 88, 120, 84, 65,
+  76, 86, 73, 105, 84, 85, 69, 76, 87, 82,
+  101, 113, 90, 93, 87, 78, 93, 72, 76, 69,
+  106, 85, 86, 83, 87, 79, 76, 83, 107, 83,
+  88, 83, 87, 81, 65, 93, 71, 90, 82, 90,
+  84, 86, 77, 64, 98, 90, 96, 68, 83, 87,
+  82, 83, 88, 92, 71, 82, 87, 77, 90, 88,
+  81, 81, 87, 83, 94, 83, 92, 78, 94, 81,
+  100, 71, 86, 90, 89, 100, 79, 85, 70, 97,
+  70, 81, 79, 92, 62, 74, 78, 81, 98, 80,
+  73, 78, 76, 89, 84, 82, 74, 86, 90, 92,
+  95, 88, 71, 73, 78, 93, 76, 98, 84, 83,
+  79, 82, 99, 92, 90, 75, 89, 80, 95, 99,
+  82, 75, 85, 77, 87, 86, 78, 92, 83, 79,
+  82, 98, 75, 84, 108, 82, 57, 87, 75, 95,
+  75, 88, 93, 91, 87, 73, 86, 89, 82, 77,
+  80, 91, 88, 79, 92, 75, 62, 84, 80, 86,
+  79, 87, 84, 100, 66, 93, 79, 87, 80, 82,
+  80, 68, 89, 87, 86, 83, 80, 67, 84, 85,
+  79, 90, 77, 75, 82, 91, 84, 87, 82, 78,
+  73, 85, 77, 85, 90, 67, 87, 85, 97, 83,
+  89, 87, 91, 87, 78, 82, 87, 93, 66, 82,
+  76, 89, 122, 83, 77, 90, 86, 83, 87, 84,
+  75, 89, 89, 84, 77, 91, 88, 82, 85, 81,
+  76, 85, 80, 87, 81, 89, 74, 87, 89, 83,
+  80, 88, 104, 76, 74, 61, 73, 74, 90, 91,
+  80, 61, 98, 129, 102, 81, 70, 74, 107, 124,
+  107, 86, 94, 77, 69, 69, 85, 101, 81, 80,
+  86, 80, 111, 66, 79, 73, 77, 60, 80, 68,
+  85, 84, 77, 108, 85, 101, 92, 88, 76, 75,
+  56, 78, 64, 79, 88, 83, 99, 82, 96, 53,
+  92, 102, 96, 64, 79, 102, 72, 86, 74, 93,
+  57, 69, 60, 74, 66, 79, 77, 75, 76, 71,
+  77, 88, 70, 70, 104, 74, 119, 77, 86, 90,
+  80, 90, 83, 74, 73, 95, 61, 84, 74, 100,
+  93, 71, 71, 78, 83, 92, 63, 81, 78, 97,
+  77, 86, 79, 101, 91, 81, 82, 76, 67, 91,
+  93, 76, 81, 102, 66, 92, 61, 76, 118, 81,
+  94, 75, 90, 71, 87, 58, 78, 85, 81, 70,
+  97, 111, 92, 77, 71, 84, 92, 115, 91, 87,
+  63, 73, 89, 79, 98, 102, 82, 87, 91, 77,
+  97, 78, 77, 68, 88, 78, 77, 82, 86, 84,
+  82, 94, 115, 95, 87, 89, 89, 76, 65, 90,
+  64, 84, 83, 91, 88, 83, 88, 63, 101, 90,
+  92, 69, 80, 86, 78, 79, 85, 99, 62, 68,
+  79, 80, 75, 80, 86, 80, 81, 80, 84, 83,
+  86, 64, 97, 87, 102, 76, 83, 91, 82, 91,
+  81, 74, 76, 96, 66, 84, 77, 95, 72, 72,
+  70, 72, 87, 85, 73, 82, 69, 92, 78, 84,
+  69, 98, 89, 94, 85, 81, 68, 85, 85, 85,
+  68, 98, 72, 87, 73, 74, 102, 85, 88, 76,
+  75, 86, 88, 99, 81, 71, 72, 86, 91, 82,
+  78, 89, 79, 90, 96, 98, 94, 79, 95, 84,
+  64, 88, 78, 86, 77, 89, 86, 77, 94, 79,
+  83, 98, 76, 82, 78, 93, 96, 77, 83, 75,
+  63, 79, 75, 74, 89, 93, 89, 97, 76, 85,
+  77, 84, 79, 71, 79, 81, 87, 85, 86, 81,
+  88, 71, 89, 81, 80, 85, 82, 82, 85, 87,
+  91, 82, 77, 86, 76, 84, 86, 92, 78, 88,
+  88, 79, 90, 82, 80, 86, 92, 85, 81, 87,
+  85, 98, 78, 78, 89, 85, 99, 88, 78, 95,
+  86, 84, 93, 84, 74, 81, 83, 81, 80, 94,
+  80, 88, 86, 88, 77, 84, 84, 92, 89, 87,
+  81, 87, 92, 84, 83, 78, 95, 79, 79, 77,
+  63, 74, 87, 83, 68, 74, 96, 115, 91, 86,
+  70, 87, 118, 120, 107, 82, 87, 73, 73, 74,
+  83, 91, 80, 89, 84, 72, 98, 77, 86, 81,
+  66, 68, 84, 68, 88, 78, 80, 87, 77, 96,
+  84, 76, 84, 74, 59, 79, 78, 83, 78, 79,
+  92, 83, 80, 69, 91, 92, 92, 64, 86, 94,
+  84, 84, 82, 88, 70, 87, 72, 73, 77, 75,
+  80, 79, 78, 77, 95, 86, 61, 96, 92, 78,
+  98, 78, 82, 91, 91, 84, 83, 91, 75, 99,
+  82, 83, 92, 92, 88, 83, 78, 87, 85, 93,
+  94, 84, 80, 90, 73, 87, 76, 101, 85, 84,
+  82, 83, 66, 90, 94, 82, 85, 91, 67, 94,
+  71, 79, 110, 77, 85, 77, 87, 81, 77, 62,
+  80, 76, 65, 79, 94, 100, 84, 97, 72, 95,
+  106, 108, 98, 80, 63, 73, 92, 82, 90, 92,
+  81, 92, 82, 77, 97, 81, 82, 78, 75, 81,
+  80, 82, 83, 77, 88, 81, 106, 88, 81, 74,
+  91, 74, 73, 86, 77, 89, 76, 86, 86, 83,
+  80, 80, 97, 86, 94, 76, 86, 88, 89, 83,
+  91, 93, 68, 82, 72, 78, 80, 78, 85, 82,
+  81, 82, 94, 86, 73, 85, 86, 82, 91, 82,
+  84, 86, 91, 89, 82, 84, 83, 98, 80, 87,
+  92, 92, 82, 83, 76, 85, 85, 86, 94, 88,
+  72, 87, 74, 83, 70, 99, 86, 84, 84, 87,
+  70, 86, 92, 88, 79, 91, 74, 90, 77, 81,
+  97, 79, 71, 78, 90, 82, 76, 72, 76, 91,
+  77, 84, 65, 135, 75, 119, 72, 90, 85, 93,
+  82, 120, 91, 70, 103, 85, 70, 73, 89, 89,
+  94, 73, 69, 85, 90, 94, 91, 78, 95, 74,
+  101, 75, 82, 82, 76, 103, 94, 84, 84, 91,
+  82, 74, 93, 72, 80, 80, 84, 92, 87, 87,
+  85, 101, 83, 90, 101, 72, 74, 74, 75, 99,
+  84, 85, 85, 77, 78, 76, 80, 75, 74, 92,
+  80, 82, 84, 95, 86, 105, 75, 75, 89, 82,
+  81, 76, 93, 84, 85, 83, 82, 81, 65, 82,
+  76, 84, 99, 79, 79, 79, 92, 85, 88, 90,
+  72, 83, 89, 92, 81, 96, 72, 82, 77, 82,
+  75, 80, 95, 76, 81, 86, 61, 90, 82, 94,
+  81, 97, 83, 96, 67, 90, 81, 78, 84, 82,
+  72, 99, 102, 99, 90, 91, 75, 87, 88, 95,
+  85, 75, 86, 90, 81, 67, 82, 90, 85, 80,
+  68, 81, 79, 84, 85, 67, 97, 73, 95, 91,
+  82, 88, 80, 88, 85, 87, 78, 100, 75, 84,
+  92, 100, 87, 89, 93, 91, 66, 90, 81, 90,
+  84, 70, 86, 79, 84, 80, 70, 79, 78, 93,
+  85, 91, 74, 76, 77, 83, 78, 73, 80, 100,
+  94, 91, 89, 80, 78, 73, 98, 76, 87, 76,
+  73, 83, 80, 92, 70, 69, 79, 82, 79, 81,
+  84, 74, 84, 76, 83, 79, 88, 83, 88, 87,
+  80, 80, 86, 94, 78, 85, 84, 87, 87, 77,
+  91, 75, 98, 81, 80, 80, 81, 89, 80, 89,
+  75, 88, 63, 74, 80, 78, 88, 74, 70, 71,
+  90, 69, 97, 81, 81, 81, 90, 73, 87, 84,
+  92, 87, 83, 77, 80, 81, 83, 92, 91, 80,
+  70, 83, 93, 73, 103, 75, 92, 92, 85, 87,
+  73, 69, 70, 81, 84, 90, 77, 77, 78, 100,
+  83, 98, 94, 90, 68, 100, 75, 84, 86, 79,
+  74, 76, 92, 96, 93, 87, 89, 85, 83, 106,
+  81, 81, 79, 78, 80, 75, 88, 110, 92, 73,
+  78, 73, 84, 84, 88, 78, 98, 82, 58, 81,
+  78, 101, 73, 72, 77, 77, 84, 89, 79, 82,
+  92, 77, 81, 83, 80, 92, 80, 88, 90, 81,
+  87, 86, 82, 83, 88, 88, 89, 99, 92, 96,
+  82, 89, 89, 80, 92, 87, 61, 69, 75, 76,
+  81, 69, 78, 91, 60, 92, 68, 128, 67, 161,
+  68, 79, 97, 100, 77, 123, 88, 61, 94, 79,
+  74, 77, 90, 95, 99, 59, 68, 87, 91, 86,
+  104, 79, 103, 66, 82, 76, 70, 82, 102, 118,
+  78, 78, 76, 94, 76, 71, 109, 66, 72, 79,
+  86, 83, 107, 67, 91, 95, 74, 85, 98, 56,
+  74, 73, 63, 105, 93, 79, 79, 72, 78, 71,
+  94, 74, 74, 95, 78, 89, 72, 87, 84, 105,
+  76, 66, 87, 77, 68, 80, 87, 86, 83, 78,
+  76, 93, 75, 77, 81, 83, 87, 100, 86, 83,
+  85, 86, 90, 88, 62, 80, 83, 108, 87, 107,
+  66, 77, 66, 81, 73, 85, 84, 72, 64, 87,
+  60, 79, 81, 84, 90, 87, 76, 104, 99, 88,
+  77, 75, 72, 88, 72, 88, 99, 160, 86, 81,
+  91, 84, 89, 93, 83, 77, 70, 89, 91, 79,
+  84, 96, 92, 75, 74, 83, 90, 92, 82, 59,
+  98, 79, 65, 83, 83, 95, 100, 106, 76, 87,
+  83, 113, 83, 73, 93, 84, 88, 87, 90, 79,
+  75, 84, 75, 83, 88, 82, 78, 71, 65, 71,
+  75, 77, 98, 76, 78, 86, 68, 78, 87, 80,
+  76, 68, 76, 100, 89, 74, 103, 67, 93, 76,
+  94, 72, 75, 69, 69, 92, 85, 106, 80, 89,
+  82, 84, 77, 78, 74, 89, 85, 78, 81, 89,
+  89, 79, 84, 80, 80, 112, 84, 87, 81, 78,
+  70, 92, 80, 79, 83, 66, 103, 78, 76, 75,
+  75, 80, 83, 91, 77, 95, 90, 62, 78, 84,
+  87, 74, 76, 73, 82, 80, 94, 93, 83, 76,
+  87, 79, 80, 87, 88, 88, 94, 83, 83, 86,
+  89, 81, 88, 84, 79, 89, 94, 75, 86, 83,
+  87, 81, 87, 75, 85, 76, 72, 79, 78, 84,
+  84, 79, 77, 90, 91, 89, 95, 89, 73, 104,
+  71, 76, 96, 88, 70, 80, 82, 81, 97, 85,
+  97, 83, 80, 89, 81, 85, 79, 83, 82, 77,
+  88, 94, 95, 58, 87, 72, 91, 89, 83, 81,
+  85, 89, 69, 90, 85, 104, 76, 77, 79, 77,
+  80, 87, 78, 81, 87, 76, 81, 93, 75, 84,
+  76, 82, 89, 98, 86, 79, 86, 82, 78, 92,
+  76, 94, 73, 87, 99, 87, 88, 87, 85, 80,
+  71, 75, 71, 70, 61, 70, 86, 110, 74, 87,
+  74, 116, 70, 124, 64, 89, 91, 94, 78, 102,
+  78, 78, 87, 90, 69, 74, 88, 91, 92, 61,
+  76, 87, 88, 85, 106, 92, 108, 82, 87, 87,
+  83, 82, 100, 89, 55, 74, 80, 90, 77, 88,
+  97, 79, 82, 76, 83, 82, 101, 73, 95, 95,
+  69, 76, 93, 65, 65, 83, 62, 86, 78, 72,
+  69, 75, 97, 72, 95, 89, 75, 102, 105, 76,
+  81, 84, 83, 102, 85, 69, 82, 88, 86, 83,
+  112, 77, 87, 71, 75, 84, 74, 65, 79, 84,
+  86, 83, 88, 83, 84, 71, 90, 99, 76, 98,
+  91, 78, 83, 107, 76, 88, 82, 86, 85, 81,
+  69, 79, 76, 93, 73, 81, 82, 94, 81, 75,
+  70, 89, 94, 87, 84, 92, 64, 90, 75, 90,
+  85, 146, 70, 74, 95, 90, 83, 101, 77, 84,
+  75, 85, 79, 69, 79, 92, 89, 73, 83, 82,
+  81, 98, 94, 76, 102, 84, 64, 82, 94, 80,
+  93, 99, 64, 90, 75, 109, 81, 77, 78, 81,
+  86, 82, 82, 66, 103, 83, 80, 83, 85, 99,
+  86, 89, 78, 71, 75, 90, 80, 71, 77, 67,
+  93, 81, 88, 82, 80, 72, 104, 79, 83, 68,
+  92, 80, 88, 84, 85, 74, 68, 72, 79, 76,
+  80, 96, 87, 84, 81, 77, 68, 79, 68, 91,
+  78, 78, 73, 88, 93, 95, 72, 87, 80, 123,
+  79, 87, 96, 74, 77, 92, 78, 84, 74, 71,
+  88, 84, 79, 85, 79, 81, 84, 84, 83, 90,
+  86, 77, 79, 89, 76, 78, 80, 77, 97, 98,
+  79, 79, 84, 82, 86, 90, 78, 94, 96, 85,
+  89, 75, 79, 82, 78, 82, 85, 88, 78, 87,
+  88, 84, 95, 80, 90, 90, 93, 79, 85, 80,
+  67, 90, 74, 98, 80, 81, 75, 97, 88, 84,
+  88, 74, 94, 85, 78, 78, 88, 92, 84, 83,
+  86, 83, 86, 86, 83, 84, 82, 81, 97, 85,
+  80, 87, 84, 76, 89, 84, 82, 62, 90, 82,
+  83, 84, 83, 87, 75, 91, 75, 87, 79, 102,
+  80, 74, 83, 79, 71, 85, 73, 86, 81, 76,
+  78, 90, 80, 93, 72, 80, 90, 102, 77, 83,
+  99, 82, 89, 92, 73, 92, 78, 80, 91, 82,
+  87, 95, 79, 85, 83, 73, 89, 107, 80, 78,
+  98, 55, 65, 69, 79, 89, 83, 81, 101, 84,
+  98, 94, 88, 79, 83, 85, 81, 83, 93, 89,
+  81, 72, 97, 92, 87, 91, 76, 90, 85, 76,
+  84, 89, 89, 87, 76, 76, 92, 72, 70, 67,
+  102, 86, 105, 77, 92, 82, 82, 75, 85, 90,
+  82, 81, 79, 78, 87, 91, 77, 78, 80, 71,
+  83, 79, 88, 86, 79, 83, 84, 73, 85, 84,
+  76, 79, 85, 86, 75, 83, 67, 89, 83, 81,
+  85, 93, 84, 95, 71, 77, 89, 104, 70, 109,
+  99, 69, 87, 85, 77, 83, 78, 107, 94, 79,
+  88, 92, 89, 64, 84, 69, 70, 101, 97, 79,
+  103, 95, 81, 81, 91, 79, 78, 100, 79, 84,
+  77, 79, 76, 95, 83, 117, 76, 67, 110, 57,
+  69, 63, 75, 84, 81, 80, 113, 87, 100, 94,
+  86, 83, 93, 79, 73, 89, 90, 93, 80, 69,
+  102, 89, 87, 86, 77, 78, 87, 80, 86, 88,
+  84, 83, 76, 75, 95, 75, 73, 70, 104, 81,
+  116, 73, 97, 70, 93, 77, 81, 89, 72, 81,
+  72, 77, 91, 90, 75, 78, 70, 75, 91, 78,
+  89, 78, 81, 74, 81, 73, 94, 69, 72, 82,
+  88, 83, 80, 90, 68, 75, 78, 81, 90, 95,
+  85, 102, 70, 74, 71, 100, 69, 109, 89, 75,
+  99, 85, 78, 86, 74, 109, 90, 73, 90, 95,
+  92, 62, 88, 67, 76, 85, 83, 81, 83, 86,
+  77, 82, 89, 79, 73, 111, 71, 84, 78, 75,
+  82, 97, 86, 99, 82, 77, 93, 62, 65, 73,
+  81, 94, 82, 90, 100, 88, 98, 90, 93, 91,
+  81, 84, 80, 78, 84, 88, 85, 72, 90, 84,
+  80, 86, 78, 73, 87, 93, 89, 86, 84, 85,
+  77, 73, 80, 77, 76, 69, 97, 75, 97, 81,
+  88, 83, 78, 81, 86, 91, 85, 83, 76, 75,
+  92, 91, 78, 74, 76, 72, 81, 76, 89, 81,
+  102, 84, 87, 74, 88, 88, 78, 88, 88, 87,
+  75, 82, 70, 78, 84, 82, 97, 93, 85, 97,
+  71, 81, 93, 99, 73, 101, 103, 78, 93, 89,
+  77, 84, 72, 106, 89, 84, 83, 88, 86, 67,
+  86, 71, 72, 83, 84, 78, 79, 89, 87, 85,
+  86, 80, 74, 93, 81, 84, 82, 79, 74, 72,
+  79, 106, 83, 83, 98, 65, 69, 69, 79, 84,
+  84, 81, 102, 94, 104, 91, 90, 77, 93, 78,
+  78, 78, 92, 90, 74, 70, 104, 88, 84, 94,
+  76, 94, 73, 83, 88, 89, 93, 86, 81, 76,
+  91, 74, 77, 73, 91, 89, 99, 80, 84, 74,
+  87, 80, 80, 88, 79, 77, 80, 81, 82, 98,
+  78, 79, 70, 72, 90, 79, 88, 71, 85, 76,
+  84, 74, 68, 82, 77, 79, 82, 90, 76, 75,
+  73, 80, 87, 83, 87, 103, 76, 102, 77, 91,
+  93, 102, 69, 109, 98, 68, 76, 87, 71, 82,
+  73, 101, 82, 69, 89, 88, 82, 66, 92, 77,
+  64, 98, 84, 80, 88, 92, 79, 72, 87, 81,
+  73, 102, 79, 88, 80, 79, 71, 82, 77, 115,
+  79, 71, 104, 66, 73, 62, 73, 79, 80, 86,
+  111, 96, 103, 90, 88, 80, 97, 77, 74, 82,
+  82, 92, 71, 66, 106, 82, 80, 81, 78, 81,
+  77, 83, 87, 85, 85, 81, 80, 75, 101, 73,
+  79, 74, 90, 82, 108, 75, 88, 68, 92, 82,
+  76, 83, 74, 76, 75, 79, 89, 102, 78, 80,
+  69, 78, 94, 79, 96, 69, 78, 65, 81, 68,
+  69, 62, 74, 84, 87, 85, 77, 81, 75, 75,
+  79, 82, 86, 108, 77, 107, 74, 83, 78, 95,
+  68, 108, 88, 75, 89, 89, 73, 78, 68, 102,
+  78, 64, 91, 86, 79, 63, 97, 74, 63, 86,
+  77, 81, 78, 83, 71, 76, 88, 80, 60, 111,
+  68, 85, 77, 77, 79, 90, 84, 97, 88, 79,
+  97, 71, 67, 75, 81, 92, 81, 93, 94, 93,
+  100, 91, 93, 90, 85, 83, 87, 74, 76, 86,
+  78, 70, 95, 76, 82, 85, 80, 74, 80, 93,
+  86, 90, 82, 81, 81, 75, 89, 82, 81, 77,
+  82, 75, 95, 82, 81, 80, 77, 82, 83, 84,
+  84, 79, 82, 78, 83, 97, 84, 75, 65, 72,
+  83, 80, 97, 74, 86, 77, 81, 76, 78, 85,
+  82, 91, 85, 83, 73, 75, 78, 80, 86, 82,
+  91, 100, 77, 96, 76, 82, 94, 96, 73, 98,
+  99, 77, 92, 90, 73, 79, 71, 100, 80, 76,
+  87, 85, 85, 68, 93, 80, 71, 85, 86, 81,
+  81, 91, 84, 75, 87, 82, 71, 97, 81, 86,
+  81, 78, 81, 77, 80, 98, 85, 87, 81, 72,
+  68, 79, 80, 90, 82, 84, 96, 94, 98, 78,
+  90, 77, 97, 89, 76, 70, 87, 82, 86, 73,
+  86, 79, 85, 102, 83, 98, 63, 91, 89, 95,
+  93, 85, 87, 80, 94, 80, 88, 78, 83, 86,
+  83, 89, 82, 83, 77, 81, 87, 89, 90, 82,
+  92, 80, 80, 90, 86, 75, 75, 74, 90, 79,
+  84, 77, 91, 82, 85, 86, 64, 85, 90, 82,
+  79, 86, 79, 77, 77, 84, 83, 84, 88, 92,
+  85, 103, 78, 101, 102, 88, 75, 105, 107, 73,
+  75, 90, 73, 84, 76, 99, 88, 80, 90, 84,
+  83, 77, 86, 77, 72, 91, 86, 79, 81, 96,
+  89, 70, 85, 79, 71, 97, 89, 95, 83, 85,
+  79, 76, 80, 99, 82, 71, 81, 71, 71, 77,
+  81, 88, 80, 85, 90, 95, 98, 75, 92, 75,
+  96, 87, 80, 71, 76, 75, 84, 70, 86, 78,
+  88, 93, 85, 86, 66, 85, 93, 91, 88, 80,
+  88, 81, 94, 78, 85, 77, 75, 81, 90, 87,
+  84, 80, 79, 81, 81, 86, 93, 81, 90, 82,
+  79, 100, 90, 82, 68, 77, 86, 80, 86, 76,
+  81, 75, 83, 81, 57, 75, 91, 82, 85, 84,
+  79, 80, 77, 81, 83, 81, 82, 95, 84, 100,
+  75, 95, 101, 80, 71, 102, 104, 76, 84, 90,
+  73, 83, 71, 98, 83, 78, 90, 81, 78, 74,
+  85, 76, 70, 86, 88, 83, 78, 90, 85, 72,
+  85, 82, 64, 100, 88, 90, 78, 86, 88, 83,
+  87, 92, 89, 78, 81, 76, 66, 83, 81, 96,
+  78, 88, 89, 92, 96, 82, 90, 84, 88, 92,
+  87, 69, 76, 78, 89, 73, 77, 71, 88, 95,
+  88, 84, 75, 90, 86, 96, 88, 80, 84, 76,
+  90, 83, 89, 84, 76, 82, 85, 87, 79, 87,
+  71, 80, 87, 81, 94, 82, 92, 81, 78, 89,
+  91, 72, 76, 73, 84, 78, 87, 82, 82, 83,
+  83, 86, 70, 86, 89, 88, 84, 82, 74, 78,
+  81, 92, 82, 85, 85, 89, 82, 93, 78, 89,
+  102, 89, 76, 92, 105, 78, 89, 85, 78, 83,
+  77, 98, 85, 83, 91, 82, 84, 78, 84, 82,
+  78, 91, 89, 81, 89, 97, 88, 70, 88, 83,
+  72, 97, 88, 93, 85, 87, 64, 84, 89, 68,
+  79, 95, 77, 80, 73, 78, 70, 94, 85, 96,
+  78, 77, 86, 91, 67, 74, 83, 87, 90, 78,
+  91, 93, 65, 83, 103, 88, 93, 71, 70, 74,
+  82, 97, 84, 78, 89, 88, 79, 66, 70, 68,
+  80, 93, 87, 86, 69, 77, 91, 75, 96, 75,
+  70, 89, 78, 80, 77, 101, 82, 75, 88, 80,
+  112, 69, 95, 87, 86, 109, 85, 67, 91, 79,
+  85, 101, 77, 78, 103, 78, 79, 90, 69, 93,
+  70, 73, 108, 100, 81, 137, 82, 80, 71, 80,
+  80, 89, 85, 76, 100, 97, 78, 84, 72, 77,
+  87, 72, 78, 81, 100, 72, 77, 78, 65, 73,
+  88, 81, 97, 82, 83, 87, 127, 80, 107, 88,
+  65, 118, 87, 84, 66, 94, 79, 63, 93, 74,
+  85, 76, 64, 67, 66, 93, 86, 87, 86, 79,
+  99, 87, 60, 74, 78, 70, 76, 89, 97, 93,
+  62, 77, 100, 88, 97, 77, 77, 65, 99, 70,
+  82, 67, 85, 91, 76, 69, 84, 61, 93, 97,
+  86, 81, 77, 67, 88, 67, 91, 72, 66, 79,
+  79, 81, 59, 93, 87, 88, 92, 85, 87, 62,
+  94, 93, 93, 95, 81, 66, 88, 70, 92, 94,
+  80, 76, 106, 89, 75, 92, 83, 88, 75, 76,
+  76, 83, 81, 150, 86, 81, 64, 91, 74, 90,
+  93, 77, 90, 113, 63, 76, 63, 81, 79, 68,
+  72, 74, 107, 61, 89, 83, 69, 86, 82, 73,
+  65, 89, 79, 81, 113, 69, 96, 89, 47, 122,
+  93, 87, 69, 98, 90, 73, 74, 84, 73, 73,
+  79, 79, 68, 95, 73, 80, 82, 84, 87, 87,
+  77, 82, 74, 94, 87, 77, 82, 90, 72, 88,
+  104, 74, 89, 85, 82, 72, 88, 71, 87, 76,
+  78, 87, 77, 67, 87, 76, 76, 90, 94, 81,
+  65, 86, 81, 81, 89, 78, 77, 78, 75, 85,
+  82, 91, 82, 79, 90, 84, 117, 68, 86, 81,
+  87, 102, 101, 67, 84, 78, 88, 95, 74, 88,
+  102, 75, 83, 90, 71, 96, 77, 76, 69, 108,
+  85, 129, 78, 92, 79, 75, 93, 85, 88, 76,
+  83, 93, 88, 89, 79, 80, 83, 76, 95, 81,
+  92, 86, 83, 74, 67, 119, 92, 79, 75, 78,
+  80, 91, 93, 83, 101, 87, 75, 102, 83, 90,
+  77, 72, 82, 77, 86, 96, 88, 94, 67, 74,
+  79, 83, 81, 94, 91, 82, 102, 90, 72, 77,
+  85, 90, 92, 87, 89, 95, 71, 83, 90, 87,
+  99, 77, 74, 82, 83, 101, 77, 77, 87, 87,
+  78, 89, 75, 79, 87, 81, 86, 89, 81, 66,
+  94, 70, 96, 68, 74, 88, 81, 77, 71, 93,
+  85, 77, 76, 92, 98, 74, 96, 77, 94, 76,
+  85, 88, 103, 79, 77, 107, 73, 79, 83, 91,
+  82, 86, 79, 82, 83, 97, 108, 80, 82, 115,
+  85, 87, 79, 78, 77, 90, 85, 79, 95, 95,
+  61, 87, 75, 76, 71, 71, 80, 83, 97, 63,
+  82, 84, 67, 61, 76, 69, 89, 91, 83, 78,
+  112, 69, 99, 88, 58, 92, 85, 78, 85, 78,
+  73, 73, 105, 76, 102, 90, 54, 65, 77, 82,
+  93, 91, 97, 83, 124, 78, 69, 79, 79, 80,
+  76, 102, 100, 94, 69, 78, 87, 85, 105, 91,
+  78, 74, 89, 75, 71, 67, 95, 98, 73, 110,
+  80, 72, 98, 90, 86, 87, 89, 55, 91, 69,
+  90, 63, 67, 76, 82, 83, 59, 79, 91, 84,
+  74, 105, 79, 73, 107, 72, 107, 74, 75, 85,
+  104, 74, 76, 93, 76, 84, 74, 107, 77, 89,
+  99, 79, 93, 111, 71, 64, 83, 106, 80, 77,
+  75, 102, 66, 90, 93, 80, 85, 109, 45, 76,
+  71, 78, 57, 74, 69, 75, 96, 51, 88, 89,
+  75, 71, 76, 67, 67, 104, 82, 76, 90, 63,
+  91, 85, 35, 87, 89, 79, 75, 92, 80, 79,
+  83, 89, 86, 82, 74, 73, 76, 80, 74, 80,
+  88, 88, 99, 89, 80, 88, 81, 91, 89, 82,
+  87, 88, 77, 87, 88, 76, 94, 91, 84, 75,
+  85, 79, 71, 81, 82, 85, 79, 83, 90, 83,
+  87, 88, 94, 84, 80, 71, 88, 78, 85, 70,
+  75, 76, 80, 80, 77, 85, 84, 80, 78, 90,
+  102, 75, 92, 76, 86, 80, 87, 79, 97, 81,
+  85, 96, 69, 98, 77, 85, 81, 86, 79, 97,
+  84, 101, 65, 87, 86, 116, 83, 83, 84, 82,
+  85, 87, 84, 77, 85, 86, 76, 80, 76, 78,
+  66, 72, 92, 79, 93, 72, 82, 79, 71, 112,
+  83, 73, 79, 83, 79, 81, 82, 72, 92, 89,
+  64, 85, 87, 82, 79, 75, 87, 80, 72, 97,
+  86, 87, 79, 86, 77, 90, 88, 89, 94, 86,
+  95, 85, 82, 84, 82, 101, 86, 76, 81, 93,
+  83, 91, 90, 91, 87, 78, 81, 86, 79, 104,
+  76, 80, 80, 86, 78, 91, 86, 83, 77, 65,
+  86, 89, 75, 75, 82, 79, 94, 76, 79, 88,
+  78, 87, 85, 83, 87, 71, 81, 83, 118, 74,
+  88, 73, 86, 87, 84, 88, 95, 79, 80, 91,
+  78, 83, 96, 77, 89, 77, 78, 83, 79, 91,
+  105, 87, 88, 99, 80, 94, 90, 75, 77, 89,
+  79, 72, 93, 74, 85, 85, 86, 80, 82, 75,
+  85, 93, 88, 73, 85, 78, 66, 69, 89, 76,
+  93, 82, 82, 90, 97, 73, 95, 84, 70, 78,
+  84, 82, 78, 74, 82, 80, 81, 79, 93, 82,
+  67, 79, 74, 88, 90, 83, 99, 81, 109, 78,
+  78, 82, 88, 94, 80, 79, 87, 91, 81, 84,
+  86, 94, 81, 91, 85, 77, 83, 81, 71, 79,
+  86, 95, 79, 101, 87, 81, 83, 77, 84, 83,
+  81, 65, 77, 78, 95, 74, 76, 81, 78, 92,
+  80, 69, 90, 81, 85, 83, 109, 70, 90, 70,
+  95, 94, 82, 82, 98, 78, 80, 80, 79, 88,
+  93, 85, 88, 72, 87, 89, 83, 103, 80, 77,
+  83, 94, 74, 93, 87, 82, 69, 91, 84, 73,
+  86, 85, 81, 85, 78, 82, 73, 84, 81, 83,
+  79, 70, 85, 85, 67, 76, 88, 74, 79, 88,
+  83, 86, 80, 69, 79, 81, 56, 75, 85, 77,
+  76, 83, 79, 83, 72, 83, 89, 78, 79, 84,
+  77, 85, 80, 82, 97, 85, 92, 80, 85, 88,
+  89, 102, 88, 73, 79, 89, 86, 92, 88, 84,
+  81, 88, 86, 82, 81, 82, 75, 85, 81, 90,
+  80, 89, 86, 84, 82, 76, 85, 82, 76, 76,
+  82, 84, 88, 79, 77, 79, 76, 91, 88, 82,
+  86, 78, 83, 82, 113, 77, 83, 75, 83, 81,
+  93, 85, 93, 83, 85, 87, 75, 102, 84, 78,
+  90, 80, 79, 100, 79, 94, 76, 88, 88, 98,
+  81, 87, 93, 79, 85, 91, 80, 75, 88, 72,
+  89, 86, 87, 83, 76, 75, 91, 87, 85, 74,
+  85, 72, 71, 103, 90, 78, 82, 76, 78, 90,
+  79, 78, 86, 84, 75, 78, 84, 81, 103, 88,
+  84, 81, 75, 92, 80, 81, 90, 81, 72, 73,
+  76, 71, 72, 84, 70, 92, 82, 103, 80, 92,
+  77, 76, 77, 93, 86, 80, 92, 94, 73, 70,
+  84, 82, 82, 79, 87, 97, 105, 83, 76, 57,
+  86, 75, 93, 91, 96, 63, 99, 78, 89, 71,
+  72, 86, 80, 81, 87, 100, 68, 95, 71, 93,
+  104, 80, 77, 108, 88, 82, 89, 78, 85, 71,
+  107, 68, 80, 94, 81, 68, 95, 83, 80, 88,
+  78, 89, 60, 92, 85, 80, 81, 88, 93, 89,
+  81, 89, 103, 64, 80, 81, 86, 92, 97, 76,
+  79, 83, 85, 103, 88, 86, 74, 76, 62, 87,
+  61, 96, 70, 76, 73, 100, 81, 75, 76, 85,
+  80, 75, 74, 87, 73, 71, 138, 83, 85, 77,
+  84, 68, 71, 88, 82, 83, 84, 79, 124, 88,
+  71, 80, 74, 74, 79, 85, 80, 126, 66, 89,
+  82, 79, 74, 84, 85, 85, 92, 74, 80, 91,
+  77, 94, 75, 71, 98, 105, 75, 61, 89, 77,
+  110, 74, 98, 90, 102, 99, 74, 99, 80, 79,
+  80, 70, 56, 98, 80, 74, 89, 62, 96, 116,
+  68, 111, 85, 63, 77, 71, 86, 87, 72, 80,
+  91, 74, 79, 88, 83, 79, 70, 62, 83, 74,
+  47, 86, 81, 99, 76, 77, 71, 76, 75, 91,
+  71, 56, 95, 78, 83, 84, 90, 82, 106, 83,
+  83, 107, 72, 81, 86, 83, 85, 84, 84, 84,
+  70, 78, 79, 95, 89, 73, 77, 105, 74, 108,
+  71, 83, 77, 91, 81, 79, 91, 83, 78, 75,
+  82, 81, 87, 81, 71, 70, 64, 95, 70, 85,
+  76, 89, 83, 104, 93, 91, 92, 79, 82, 95,
+  83, 80, 87, 93, 81, 81, 75, 81, 85, 86,
+  83, 99, 71, 84, 80, 68, 78, 85, 82, 100,
+  87, 77, 101, 78, 82, 69, 73, 86, 79, 76,
+  93, 93, 78, 96, 76, 94, 88, 80, 85, 99,
+  79, 80, 94, 81, 63, 69, 103, 66, 90, 91,
+  81, 71, 98, 75, 84, 92, 84, 84, 72, 86,
+  96, 79, 78, 86, 96, 89, 87, 84, 99, 62,
+  86, 83, 83, 95, 97, 83, 77, 84, 87, 94,
+  85, 81, 77, 72, 82, 92, 68, 88, 82, 77,
+  89, 93, 83, 76, 73, 84, 87, 77, 76, 92,
+  75, 80, 103, 89, 86, 81, 72, 89, 78, 81,
+  89, 78, 67, 76, 48, 91, 74, 83, 73, 88,
+  75, 101, 86, 81, 79, 76, 76, 92, 72, 73,
+  90, 81, 78, 65, 81, 87, 74, 76, 71, 85,
+  71, 73, 74, 53, 89, 75, 103, 98, 85, 70,
+  94, 76, 91, 65, 76, 84, 81, 70, 91, 96,
+  67, 100, 70, 88, 110, 64, 84, 90, 93, 89,
+  85, 83, 65, 59, 105, 74, 80, 101, 81, 63,
+  91, 78, 75, 87, 72, 89, 60, 87, 91, 83,
+  72, 88, 89, 98, 80, 82, 102, 62, 80, 93,
+  72, 88, 90, 79, 75, 82, 85, 94, 99, 83,
+  74, 75, 75, 88, 62, 103, 61, 75, 71, 88,
+  71, 76, 83, 81, 78, 80, 64, 92, 68, 65,
+  168, 86, 96, 99, 87, 71, 69, 95, 91, 83,
+  76, 83, 141, 106, 74, 86, 78, 57, 73, 81,
+  79, 141, 64, 96, 80, 74, 64, 81, 90, 88,
+  99, 86, 93, 96, 80, 93, 73, 93, 130, 100,
+  64, 59, 89, 82, 106, 68, 92, 90, 105, 91,
+  74, 133, 84, 84, 88, 92, 57, 112, 78, 70,
+  65, 61, 93, 124, 66, 132, 73, 57, 84, 50,
+  99, 78, 53, 83, 84, 71, 80, 88, 77, 88,
+  68, 67, 98, 68, 47, 88, 76, 117, 86, 69,
+  69, 65, 75, 86, 68, 55, 108, 86, 92, 87,
+  74, 57, 114, 83, 72, 117, 87, 83, 89, 80,
+  99, 79, 90, 79, 64, 73, 88, 89, 82, 64,
+  73, 93, 74, 123, 65, 72, 66, 94, 80, 71,
+  79, 84, 79, 81, 82, 81, 92, 77, 66, 74,
+  48, 86, 74, 88, 77, 93, 80, 101, 96, 70,
+  92, 79, 79, 98, 78, 72, 85, 83, 72, 83,
+  76, 86, 72, 84, 75, 90, 85, 75, 82, 61,
+  84, 79, 95, 108, 75, 66, 93, 78, 88, 59,
+  75, 84, 82, 73, 95, 90, 78, 103, 80, 95,
+  98, 64, 83, 86, 86, 94, 87, 86, 64, 62,
+  101, 77, 84, 98, 78, 77, 90, 69, 79, 89,
+  79, 89, 69, 88, 98, 77, 66, 92, 85, 104,
+  81, 80, 98, 62, 83, 90, 79, 87, 92, 86,
+  70, 84, 86, 92, 90, 77, 74, 75, 75, 95,
+  64, 95, 62, 78, 94, 85, 78, 80, 68, 81,
+  83, 76, 66, 94, 72, 71, 103, 77, 88, 91,
+  87, 89, 83, 77, 82, 79, 73, 78, 86, 98,
+  71, 76, 74, 95, 90, 90, 94, 108, 78, 78,
+  85, 88, 84, 80, 85, 82, 95, 78, 82, 89,
+  80, 73, 76, 83, 79, 88, 82, 69, 93, 75,
+  81, 87, 86, 77, 91, 78, 93, 79, 74, 90,
+  83, 86, 78, 93, 67, 100, 86, 86, 97, 87,
+  78, 100, 94, 96, 85, 91, 75, 65, 102, 82,
+  82, 97, 90, 70, 93, 81, 76, 92, 79, 92,
+  69, 78, 86, 90, 78, 87, 85, 88, 81, 81,
+  90, 79, 88, 76, 82, 92, 81, 78, 82, 80,
+  89, 71, 107, 88, 89, 72, 97, 87, 76, 97,
+  74, 85, 69, 85, 94, 90, 86, 93, 79, 87,
+  65, 97, 76, 81, 97, 84, 78, 100, 84, 71,
+  75, 88, 75, 75, 82, 90, 90, 74, 83, 78,
+  79, 72, 84, 87, 85, 105, 73, 82, 79, 81,
+  82, 72, 80, 89, 71, 88, 89, 77, 78, 93,
+  74, 86, 85, 86, 77, 64, 85, 72, 86, 81,
+  77, 82, 90, 87, 88, 79, 80, 84, 84, 67,
+  57, 80, 67, 99, 81, 87, 97, 99, 81, 95,
+  83, 96, 78, 77, 83, 73, 91, 82, 85, 75,
+  89, 84, 92, 79, 72, 84, 73, 79, 53, 86,
+  92, 96, 67, 83, 71, 82, 70, 96, 86, 84,
+  90, 89, 77, 85, 79, 70, 89, 84, 77, 88,
+  92, 77, 80, 75, 92, 82, 74, 92, 70, 72,
+  88, 76, 80, 78, 79, 95, 73, 100, 60, 94,
+  72, 83, 88, 79, 82, 88, 87, 78, 88, 74,
+  89, 78, 72, 80, 82, 91, 73, 83, 79, 100,
+  95, 94, 95, 91, 80, 79, 77, 93, 91, 80,
+  80, 83, 85, 90, 83, 76, 77, 84, 80, 84,
+  104, 94, 83, 72, 98, 80, 80, 94, 74, 82,
+  87, 81, 91, 82, 73, 88, 87, 77, 86, 95,
+  77, 99, 86, 83, 89, 78, 78, 97, 79, 97,
+  83, 86, 88, 66, 95, 83, 85, 96, 86, 78,
+  84, 72, 79, 94, 87, 80, 70, 79, 94, 83,
+  77, 86, 82, 106, 80, 80, 89, 74, 88, 80,
+  93, 92, 79, 94, 81, 81, 89, 75, 100, 83,
+  86, 72, 95, 89, 77, 87, 74, 79, 75, 80,
+  92, 91, 72, 90, 81, 86, 66, 90, 81, 79,
+  83, 80, 103, 69, 73, 87, 86, 73, 72, 87,
+  84, 78, 83, 48, 57, 82, 87, 103, 85, 78,
+  77, 74, 95, 84, 81, 106, 83, 88, 92, 88,
+  96, 87, 74, 88, 87, 79, 86, 80, 82, 78,
+  72, 74, 83, 78, 76, 73, 88, 85, 78, 75,
+  72, 86, 65, 73, 87, 83, 102, 74, 74, 98,
+  76, 79, 94, 70, 96, 69, 76, 102, 72, 118,
+  87, 86, 98, 96, 75, 82, 76, 87, 82, 68,
+  81, 79, 91, 118, 80, 84, 89, 85, 73, 85,
+  85, 87, 84, 86, 82, 82, 77, 56, 100, 83,
+  93, 85, 104, 93, 77, 87, 81, 80, 81, 72,
+  81, 92, 77, 86, 121, 71, 119, 88, 104, 76,
+  65, 72, 96, 85, 82, 80, 89, 69, 69, 84,
+  90, 72, 82, 83, 86, 67, 64, 87, 88, 66,
+  87, 69, 57, 77, 86, 116, 94, 91, 86, 58,
+  85, 85, 95, 122, 84, 98, 94, 95, 100, 79,
+  70, 74, 88, 69, 82, 77, 60, 73, 63, 76,
+  86, 83, 74, 62, 90, 78, 81, 69, 68, 82,
+  65, 80, 83, 91, 90, 68, 79, 104, 72, 78,
+  88, 62, 96, 61, 73, 102, 61, 114, 99, 90,
+  90, 81, 88, 80, 69, 75, 84, 82, 78, 78,
+  80, 85, 96, 76, 76, 79, 71, 100, 85, 89,
+  82, 96, 70, 97, 94, 55, 96, 82, 73, 83,
+  108, 97, 90, 92, 74, 80, 90, 70, 87, 96,
+  80, 73, 109, 60, 84, 89, 104, 83, 70, 72,
+  89, 85, 85, 82, 83, 63, 79, 80, 86, 74,
+  78, 92, 84, 75, 76, 91, 89, 81, 83, 82,
+  55, 86, 90, 100, 91, 91, 89, 76, 79, 86,
+  86, 101, 92, 90, 87, 80, 94, 79, 75, 65,
+  96, 108, 95, 82, 52, 74, 71, 74, 80, 82,
+  79, 72, 91, 84, 79, 77, 76, 81, 70, 75,
+  90, 99, 106, 76, 75, 94, 76, 85, 92, 69,
+  97, 68, 92, 105, 67, 97, 109, 89, 104, 89,
+  90, 86, 79, 86, 84, 70, 85, 83, 85, 79,
+  85, 81, 84, 85, 75, 90, 86, 105, 83, 91,
+  89, 84, 81, 59, 80, 87, 94, 90, 99, 93,
+  81, 99, 81, 84, 80, 76, 84, 93, 77, 87,
+  97, 68, 84, 87, 105, 81, 78, 69, 89, 87,
+  81, 82, 89, 71, 76, 78, 97, 83, 70, 96,
+  96, 73, 68, 76, 83, 73, 79, 73, 81, 89,
+  84, 101, 91, 71, 85, 79, 87, 87, 91, 112,
+  83, 91, 97, 90, 102, 80, 71, 103, 80, 69,
+  79, 80, 67, 87, 79, 71, 78, 75, 81, 62,
+  90, 87, 79, 61, 63, 80, 64, 84, 82, 80,
+  91, 95, 72, 108, 92, 78, 79, 89, 108, 74,
+  87, 92, 86, 90, 97, 77, 80, 84, 75, 80,
+  74, 78, 91, 78, 72, 88, 79, 87, 84, 71,
+  99, 80, 73, 78, 85, 83, 80, 91, 79, 81,
+  87, 69, 99, 93, 73, 90, 102, 93, 95, 82,
+  82, 78, 79, 74, 93, 85, 77, 89, 85, 67,
+  99, 90, 104, 86, 84, 76, 99, 80, 94, 77,
+  88, 56, 70, 100, 82, 92, 87, 71, 93, 71,
+  75, 66, 87, 63, 87, 64, 81, 85, 87, 89,
+  97, 57, 88, 63, 75, 100, 120, 136, 79, 100,
+  98, 90, 121, 84, 73, 87, 80, 59, 78, 94,
+  66, 92, 86, 84, 83, 61, 79, 64, 100, 77,
+  87, 60, 60, 71, 69, 104, 74, 71, 73, 94,
+  82, 92, 104, 78, 75, 90, 73, 67, 105, 88,
+  86, 77, 69, 93, 74, 86, 79, 80, 79, 70,
+  86, 98, 68, 91, 84, 53, 90, 81, 75, 73,
+  75, 90, 78, 76, 86, 100, 68, 99, 102, 78,
+  110, 91, 68, 76, 103, 97, 98, 77, 77, 73,
+  75, 76, 93, 77, 81, 68, 66, 72, 63, 98,
+  101, 92, 86, 82, 101, 83, 95, 75, 79, 58,
+  69, 105, 100, 84, 71, 89, 94, 68, 71, 77,
+  85, 75, 82, 68, 76, 93, 89, 98, 91, 84,
+  85, 82, 88, 87, 100, 107, 84, 91, 89, 75,
+  100, 82, 68, 72, 87, 96, 85, 86, 68, 83,
+  81, 74, 81, 83, 86, 57, 95, 80, 78, 65,
+  71, 76, 65, 88, 81, 85, 91, 92, 78, 97,
+  88, 75, 81, 82, 103, 72, 97, 94, 79, 92,
+  102, 82, 82, 84, 92, 80, 79, 82, 94, 79,
+  73, 88, 81, 72, 86, 83, 85, 83, 72, 86,
+  85, 79, 80, 91, 78, 85, 86, 78, 90, 90,
+  74, 84, 92, 93, 88, 87, 84, 78, 81, 75,
+  95, 79, 74, 88, 78, 68, 90, 89, 101, 90,
+  78, 77, 87, 78, 91, 81, 86, 57, 86, 79,
+  92, 83, 69, 88, 82, 76, 74, 83, 86, 86,
+  79, 88, 80, 87, 79, 86, 91, 84, 91, 91,
+  97, 90, 87, 96, 88, 85, 91, 84, 92, 90,
+  77, 110, 76, 90, 82, 78, 59, 84, 84, 74,
+  84, 67, 73, 59, 90, 80, 77, 76, 69, 76,
+  71, 85, 84, 88, 93, 90, 85, 91, 91, 80,
+  89, 84, 110, 79, 90, 76, 90, 85, 107, 87,
+  78, 81, 72, 78, 83, 87, 92, 81, 66, 72,
+  81, 89, 75, 80, 94, 77, 95, 89, 75, 77,
+  90, 101, 89, 83, 70, 75, 92, 85, 92, 90,
+  89, 86, 88, 70, 88, 78, 76, 84, 84, 79,
+  69, 86, 75, 72, 88, 89, 91, 90, 90, 75,
+  93, 81, 90, 87, 92, 82, 83, 80, 90, 93,
+  84, 78, 77, 75, 76, 83, 84, 77, 78, 72,
+  82, 81, 84, 88, 95, 81, 91, 77, 86, 89,
+  99, 94, 82, 92, 85, 87, 95, 93, 74, 98,
+  75, 78, 79, 84, 64, 81, 93, 71, 88, 60,
+  70, 68, 89, 82, 81, 75, 65, 76, 68, 95,
+  80, 81, 83, 84, 86, 76, 99, 86, 92, 73,
+  91, 69, 89, 77, 89, 103, 86, 91, 75, 87,
+  72, 75, 93, 78, 95, 100, 58, 62, 79, 70,
+  75, 87, 79, 86, 89, 98, 72, 87, 99, 101,
+  85, 91, 76, 84, 95, 82, 92, 89, 87, 87,
+  84, 69, 85, 75, 64, 80, 82, 90, 71, 77,
+  80, 76, 78, 91, 88, 97, 91, 79, 87, 75,
+  88, 95, 89, 76, 90, 97, 91, 89, 69, 100,
+  79, 72, 78, 88, 90, 89, 81, 61, 76, 86,
+  83, 84, 91, 87, 84, 94, 83, 92, 94, 87,
+  85, 87, 81, 80, 89, 95, 72, 92, 80, 100,
+  82, 83, 85, 81, 82, 77, 80, 72, 79, 68,
+  89, 84, 81, 79, 69, 89, 66, 83, 82, 77,
+  93, 87, 89, 88, 93, 80, 91, 79, 100, 74,
+  86, 76, 90, 95, 92, 90, 79, 81, 76, 80,
+  89, 81, 91, 86, 64, 71, 82, 76, 74, 85,
+  82, 89, 94, 91, 76, 79, 92, 98, 88, 76,
+  72, 81, 93, 83, 88, 82, 86, 86, 87, 75,
+  84, 77, 75, 84, 86, 77, 67, 90, 85, 78,
+  100, 86, 89, 96, 94, 78, 85, 78, 84, 96,
+  89, 80, 83, 81, 89, 86, 90, 88, 83, 86,
+  76, 87, 88, 82, 86, 82, 78, 91, 100, 88,
+  75, 77, 89, 81, 92, 83, 85, 83, 79, 81,
+  87, 82, 84, 79, 89, 83, 88, 92, 89, 78,
+  68, 76, 78, 113, 78, 88, 96, 95, 79, 88,
+  86, 75, 87, 80, 88, 83, 68, 83, 84, 77,
+  82, 98, 67, 77, 84, 93, 99, 95, 82, 89,
+  94, 84, 87, 92, 87, 78, 83, 88, 84, 91,
+  80, 91, 89, 87, 75, 81, 77, 89, 93, 75,
+  91, 76, 71, 82, 86, 88, 83, 83, 85, 77,
+  85, 82, 82, 93, 85, 76, 93, 84, 86, 88,
+  83, 89, 78, 78, 87, 79, 93, 92, 80, 81,
+  81, 75, 71, 79, 84, 81, 77, 89, 95, 88,
+  96, 80, 85, 81, 102, 96, 92, 86, 66, 84,
+  94, 74, 93, 85, 82, 87, 99, 85, 86, 76,
+  82, 76, 85, 84, 94, 88, 72, 83, 79, 91,
+  76, 80, 87, 82, 97, 78, 96, 60, 78, 79,
+  84, 108, 87, 80, 114, 96, 74, 96, 92, 73,
+  83, 77, 78, 84, 75, 88, 73, 78, 74, 95,
+  60, 78, 84, 91, 93, 94, 80, 91, 93, 77,
+  87, 106, 87, 81, 82, 88, 71, 91, 84, 115,
+  90, 84, 92, 80, 72, 92, 85, 76, 92, 76,
+  69, 85, 73, 96, 80, 90, 90, 77, 82, 97,
+  80, 77, 79, 75, 90, 82, 87, 77, 89, 83,
+  79, 82, 86, 79, 90, 85, 82, 84, 76, 72,
+  79, 71, 86, 82, 75, 94, 91, 98, 84, 83,
+  79, 82, 81, 94, 85, 89, 77, 85, 88, 84,
+  83, 75, 77, 86, 96, 89, 82, 80, 78, 81,
+  84, 80, 90, 80, 79, 81, 80, 81, 83, 89,
+  88, 87, 83, 82, 87, 76, 80, 79, 72, 109,
+  88, 85, 102, 89, 81, 89, 83, 74, 89, 80,
+  80, 82, 71, 89, 91, 82, 78, 96, 71, 82,
+  84, 94, 96, 95, 81, 91, 90, 83, 85, 93,
+  87, 80, 85, 89, 86, 93, 76, 96, 89, 86,
+  77, 86, 80, 97, 80, 75, 94, 75, 69, 81,
+  77, 90, 85, 84, 86, 80, 86, 81, 82, 81,
+  82, 75, 97, 90, 89, 87, 82, 86, 76, 77,
+  88, 90, 84, 97, 88, 77, 82, 73, 75, 82,
+  82, 85, 79, 87, 100, 86, 80, 76, 77, 80,
+  85, 82, 82, 88, 82, 78, 97, 82, 93, 80,
+  77, 85, 107, 90, 83, 79, 93, 73, 85, 78,
+  83, 86, 82, 77, 87, 72, 85, 77, 88, 90,
+  94, 87, 75, 84, 68, 73, 75, 96, 74, 96,
+  93, 92, 68, 92, 98, 77, 82, 82, 81, 82,
+  79, 90, 83, 75, 89, 102, 76, 75, 72, 92,
+  96, 93, 79, 86, 107, 84, 93, 87, 85, 76,
+  78, 90, 75, 86, 73, 86, 87, 79, 76, 76,
+  82, 102, 94, 74, 82, 75, 87, 79, 84, 94,
+  83, 90, 87, 88, 95, 90, 74, 93, 80, 76,
+  88, 90, 75, 88, 83, 84, 72, 75, 86, 80,
+  75, 93, 78, 98, 90, 71, 69, 81, 88, 84,
+  85, 76, 90, 75, 88, 85, 84, 77, 99, 84,
+  89, 87, 70, 74, 109, 81, 104, 77, 75, 99,
+  116, 83, 102, 79, 82, 67, 78, 83, 98, 100,
+  81, 81, 81, 89, 82, 91, 93, 86, 98, 70,
+  89, 88, 76, 76, 69, 85, 80, 86, 108, 93,
+  55, 86, 102, 75, 81, 74, 84, 86, 82, 76,
+  77, 73, 73, 113, 77, 68, 71, 95, 83, 78,
+  84, 84, 107, 77, 75, 95, 95, 70, 71, 97,
+  61, 78, 65, 110, 88, 85, 97, 78, 72, 118,
+  78, 74, 86, 78, 99, 72, 68, 109, 75, 88,
+  96, 89, 73, 100, 67, 71, 72, 76, 83, 85,
+  72, 79, 89, 79, 80, 80, 89, 70, 74, 79,
+  73, 107, 89, 67, 81, 76, 102, 83, 90, 78,
+  92, 85, 77, 83, 106, 80, 77, 86, 83, 87,
+  81, 74, 93, 78, 84, 75, 78, 82, 98, 91,
+  87, 87, 74, 76, 76, 77, 98, 78, 78, 77,
+  82, 86, 85, 100, 86, 85, 84, 76, 81, 92,
+  88, 72, 70, 91, 86, 91, 93, 88, 74, 88,
+  99, 76, 89, 86, 78, 81, 83, 78, 88, 76,
+  84, 94, 80, 83, 70, 90, 91, 90, 83, 83,
+  97, 89, 78, 89, 90, 77, 77, 90, 77, 87,
+  64, 90, 87, 78, 78, 92, 87, 113, 77, 79,
+  86, 69, 87, 77, 79, 91, 79, 89, 86, 90,
+  77, 88, 75, 74, 75, 75, 79, 99, 74, 88,
+  80, 82, 81, 75, 85, 87, 81, 97, 81, 95,
+  90, 72, 70, 84, 85, 86, 88, 80, 93, 78,
+  71, 73, 68, 80, 80, 77, 85, 80, 97, 88,
+  89, 82, 80, 71, 66, 91, 91, 79, 79, 86,
+  83, 86, 75, 64, 75, 79, 85, 89, 86, 72,
+  84, 82, 88, 83, 96, 91, 91, 81, 72, 64,
+  76, 70, 77, 91, 76, 80, 96, 72, 96, 81,
+  75, 75, 79, 81, 85, 83, 87, 83, 110, 91,
+  76, 81, 86, 84, 89, 86, 66, 87, 104, 81,
+  93, 66, 90, 76, 82, 79, 91, 79, 109, 60,
+  87, 66, 72, 79, 89, 105, 94, 78, 91, 69,
+  92, 81, 91, 76, 86, 80, 81, 78, 113, 79,
+  88, 85, 98, 77, 86, 80, 76, 99, 72, 85,
+  69, 83, 70, 81, 85, 101, 72, 86, 89, 89,
+  69, 94, 84, 81, 86, 73, 83, 75, 67, 70,
+  89, 81, 79, 70, 84, 79, 92, 89, 94, 84,
+  78, 77, 69, 94, 88, 79, 90, 87, 74, 76,
+  72, 66, 84, 75, 87, 82, 89, 87, 84, 92,
+  88, 81, 87, 76, 91, 105, 78, 56, 68, 61,
+  69, 80, 69, 77, 97, 65, 106, 77, 74, 74,
+  84, 87, 87, 84, 84, 72, 99, 94, 86, 79,
+  83, 82, 81, 71, 70, 84, 115, 92, 81, 67,
+  100, 71, 83, 82, 95, 66, 104, 55, 87, 71,
+  74, 84, 82, 121, 90, 84, 90, 72, 92, 77,
+  87, 84, 89, 73, 93, 79, 92, 80, 79, 77,
+  95, 78, 79, 103, 72, 88, 72, 83, 73, 88,
+  75, 74, 95, 95, 68, 97, 92, 87, 73, 95,
+  84, 78, 84, 77, 82, 72, 64, 74, 105, 80,
+  77, 69, 85, 79, 94, 85, 86, 78, 79, 77,
+  68, 90, 83, 81, 76, 87, 79, 88, 79, 69,
+  90, 75, 83, 86, 83, 105, 89, 90, 90, 81,
+  82, 81, 92, 85, 82, 67, 76, 71, 79, 88,
+  75, 81, 108, 84, 103, 81, 82, 84, 81, 75,
+  84, 70, 82, 81, 112, 86, 75, 87, 81, 79,
+  84, 88, 69, 83, 95, 86, 70, 68, 92, 80,
+  81, 79, 90, 71, 89, 61, 85, 72, 72, 95,
+  89, 110, 88, 87, 92, 69, 92, 76, 96, 76,
+  81, 82, 78, 77, 82, 76, 90, 75, 95, 78,
+  86, 89, 73, 95, 73, 83, 82, 77, 74, 81,
+  94, 103, 80, 85, 92, 90, 69, 96, 85, 81,
+  90, 82, 83, 76, 86, 86, 81, 65, 85, 76,
+  78, 70, 87, 51, 86, 82, 77, 84, 82, 85,
+  69, 83, 83, 76, 91, 93, 88, 80, 84, 84,
+  84, 70, 81, 80, 86, 75, 85, 74, 88, 76,
+  80, 73, 88, 80, 82, 67, 88, 71, 87, 89,
+  77, 88, 88, 75, 83, 91, 71, 67, 102, 84,
+  79, 69, 97, 94, 85, 68, 120, 79, 81, 76,
+  76, 91, 87, 79, 81, 74, 82, 96, 82, 84,
+  81, 81, 73, 70, 86, 87, 90, 91, 97, 140,
+  77, 96, 88, 79, 88, 98, 92, 83, 81, 83,
+  90, 83, 89, 80, 92, 86, 148, 78, 69, 75,
+  78, 85, 80, 82, 79, 80, 94, 81, 83, 88,
+  95, 74, 91, 89, 81, 84, 74, 73, 87, 53,
+  77, 78, 82, 85, 82, 73, 85, 85, 78, 70,
+  85, 49, 91, 86, 76, 86, 86, 85, 69, 86,
+  75, 81, 91, 92, 74, 77, 85, 85, 84, 77,
+  90, 76, 88, 69, 87, 79, 94, 99, 84, 75,
+  86, 72, 78, 69, 86, 75, 91, 85, 77, 78,
+  85, 72, 88, 87, 73, 66, 100, 88, 77, 66,
+  94, 96, 91, 67, 125, 75, 71, 75, 72, 92,
+  85, 78, 88, 73, 75, 93, 78, 83, 87, 70,
+  81, 69, 88, 85, 85, 86, 99, 130, 82, 97,
+  86, 75, 82, 96, 90, 84, 76, 87, 88, 89,
+  77, 76, 88, 94, 158, 81, 69, 77, 81, 88,
+  79, 77, 78, 79, 94, 68, 85, 87, 82, 70,
+  83, 91, 84, 81, 73, 73, 87, 47, 71, 78,
+  83, 80, 79, 74, 86, 95, 83, 78, 92, 58,
+  83, 82, 84, 78, 83, 85, 76, 83, 85, 78,
+  88, 80, 77, 93, 92, 87, 84, 62, 83, 81,
+  88, 71, 93, 77, 91, 115, 75, 81, 80, 76,
+  79, 71, 79, 77, 94, 96, 93, 83, 99, 82,
+  83, 86, 72, 74, 100, 84, 92, 75, 89, 86,
+  78, 74, 110, 77, 71, 79, 91, 90, 89, 82,
+  76, 72, 86, 83, 78, 82, 79, 67, 83, 75,
+  87, 79, 95, 93, 96, 114, 110, 79, 83, 83,
+  91, 88, 92, 87, 76, 89, 88, 78, 72, 96,
+  88, 89, 113, 75, 85, 77, 68, 89, 81, 87,
+  76, 76, 84, 65, 87, 90, 85, 84, 93, 91,
+  89, 89, 91, 68, 86, 70, 85, 88, 88, 77,
+  94, 65, 93, 74, 70, 75, 77, 29, 105, 88,
+  79, 95, 92, 86, 82, 81, 84, 89, 97, 105,
+  81, 77, 78, 90, 79, 90, 95, 83, 85, 80,
+  70, 79, 89, 60, 92, 79, 88, 81, 85, 75,
+  83, 69, 84, 87, 88, 92, 74, 73, 84, 74,
+  76, 70, 87, 81, 71, 71, 94, 111, 87, 70,
+  100, 82, 82, 67, 73, 85, 80, 76, 90, 76,
+  69, 78, 84, 82, 95, 97, 81, 80, 84, 92,
+  75, 70, 99, 82, 67, 107, 85, 68, 69, 80,
+  86, 86, 86, 82, 83, 97, 98, 70, 74, 80,
+  182, 81, 51, 83, 84, 86, 74, 81, 82, 80,
+  91, 104, 77, 87, 89, 52, 78, 88, 88, 86,
+  68, 85, 87, 63, 62, 82, 81, 82, 87, 75,
+  89, 79, 69, 74, 75, 26, 115, 90, 78, 93,
+  97, 87, 88, 86, 86, 87, 82, 111, 70, 78,
+  81, 92, 80, 97, 109, 87, 85, 65, 71, 82,
+  94, 102, 95, 78, 94, 79, 82, 86, 94, 67,
+  87, 81, 85, 77, 66, 76, 88, 73, 78, 66,
+  79, 80, 70, 67, 98, 110, 93, 68, 98, 79,
+  64, 73, 81, 82, 75, 70, 84, 76, 62, 74,
+  72, 82, 101, 79, 84, 82, 86, 91, 74, 74,
+  99, 66, 77, 99, 82, 65, 66, 79, 81, 83,
+  79, 83, 81, 99, 85, 64, 71, 92, 221, 84,
+  51, 81, 91, 84, 70, 77, 81, 82, 95, 70,
+  79, 84, 82, 45, 69, 89, 77, 76, 67, 83,
+  83, 57, 51, 80, 85, 77, 82, 77, 91, 95,
+  76, 82, 88, 52, 90, 85, 92, 85, 87, 95,
+  82, 81, 76, 76, 80, 75, 80, 95, 96, 87,
+  74, 80, 96, 78, 88, 77, 80, 84, 92, 126,
+  89, 86, 85, 85, 84, 72, 87, 77, 92, 100,
+  96, 80, 92, 77, 89, 89, 73, 71, 97, 83,
+  88, 70, 91, 89, 79, 67, 93, 74, 74, 75,
+  89, 85, 95, 83, 81, 68, 74, 83, 71, 86,
+  78, 69, 90, 80, 87, 90, 85, 95, 90, 79,
+  123, 81, 86, 80, 80, 88, 88, 89, 73, 85,
+  82, 83, 75, 93, 79, 95, 98, 78, 79, 88,
+  73, 89, 76, 82, 80, 81, 84, 62, 86, 88,
+  96, 76, 90, 92, 90, 81, 85, 69, 90, 91,
+  75, 83, 90, 82, 85, 61, 90, 78, 76, 86,
+  69, 50, 83, 89, 77, 93, 83, 78, 73, 80,
+  81, 83, 90, 94, 79, 79, 80, 93, 90, 88,
+  79, 80, 82, 96, 85, 85, 81, 69, 94, 78,
+  82, 83, 87, 79, 87, 71, 87, 93, 97, 95,
+  76, 79, 82, 74, 72, 73, 94, 82, 84, 78,
+  89, 96, 84, 79, 90, 83, 83, 74, 86, 90,
+  92, 86, 91, 79, 83, 72, 85, 86, 89, 86,
+  83, 81, 82, 90, 82, 75, 101, 74, 67, 102,
+  82, 84, 83, 79, 91, 93, 93, 85, 76, 83,
+  93, 81, 85, 88, 116, 77, 70, 88, 74, 88,
+  94, 86, 84, 92, 82, 104, 80, 87, 81, 70,
+  90, 87, 87, 85, 75, 81, 91, 108, 71, 83,
+  92, 83, 88, 69, 91, 80, 78, 84, 70, 48,
+  89, 89, 82, 88, 85, 86, 74, 84, 79, 77,
+  86, 95, 76, 80, 81, 92, 90, 95, 92, 93,
+  80, 85, 84, 82, 81, 89, 89, 80, 92, 80,
+  84, 78, 90, 72, 84, 91, 91, 80, 72, 79,
+  80, 83, 76, 70, 93, 83, 87, 74, 89, 100,
+  86, 75, 85, 81, 77, 77, 93, 86, 92, 90,
+  86, 77, 78, 74, 78, 85, 89, 78, 85, 81,
+  83, 92, 80, 81, 97, 72, 74, 95, 81, 80,
+  77, 74, 94, 95, 85, 86, 75, 81, 93, 78,
+  82, 77, 118, 79, 77, 88, 74, 87, 88, 88,
+  84, 87, 80, 76, 86, 86, 88, 66, 87, 88,
+  84, 82, 72, 76, 87, 121, 70, 83, 83, 76,
+  80, 69, 85, 94, 78, 86, 85, 66, 75, 81,
+  90, 86, 87, 84, 79, 76, 81, 74, 84, 78,
+  83, 94, 86, 93, 80, 79, 82, 78, 85, 89,
+  87, 84, 88, 119, 87, 84, 89, 88, 88, 77,
+  90, 81, 92, 93, 97, 81, 90, 83, 85, 88,
+  69, 77, 91, 81, 96, 78, 86, 81, 80, 73,
+  85, 70, 72, 84, 97, 88, 97, 90, 80, 73,
+  82, 81, 74, 90, 90, 69, 85, 82, 83, 84,
+  79, 86, 88, 72, 106, 83, 83, 90, 88, 81,
+  90, 92, 84, 83, 78, 78, 84, 88, 83, 88,
+  99, 75, 79, 87, 67, 90, 90, 85, 85, 86,
+  82, 71, 91, 96, 86, 80, 91, 85, 95, 83,
+  92, 78, 90, 110, 84, 84, 88, 77, 93, 84,
+  86, 92, 70, 96, 77, 88, 93, 86, 88, 83,
+  75, 68, 77, 85, 76, 103, 76, 80, 93, 75,
+  67, 73, 64, 85, 83, 94, 84, 81, 84, 79,
+  83, 90, 70, 79, 91, 73, 73, 78, 70, 82,
+  82, 80, 85, 86, 74, 71, 92, 95, 86, 79,
+  70, 93, 91, 77, 95, 91, 76, 91, 84, 83,
+  91, 67, 83, 85, 84, 67, 85, 87, 83, 85,
+  75, 76, 83, 89, 82, 54, 70, 115, 76, 92,
+  81, 92, 75, 97, 121, 76, 79, 100, 85, 77,
+  95, 85, 84, 90, 89, 72, 89, 77, 89, 81,
+  82, 76, 77, 91, 90, 70, 77, 82, 71, 91,
+  85, 109, 95, 87, 66, 72, 92, 96, 73, 79,
+  87, 89, 85, 86, 79, 85, 97, 81, 93, 87,
+  72, 98, 82, 88, 93, 86, 87, 91, 82, 68,
+  75, 82, 75, 102, 72, 80, 86, 83, 71, 76,
+  67, 85, 90, 89, 81, 80, 79, 80, 80, 84,
+  72, 81, 89, 73, 77, 83, 72, 91, 87, 75,
+  89, 77, 68, 72, 91, 104, 89, 84, 72, 100,
+  88, 80, 99, 89, 75, 89, 87, 90, 92, 76,
+  81, 74, 75, 61, 85, 83, 80, 84, 78, 74,
+  84, 77, 88, 59, 72, 115, 79, 90, 79, 87,
+  80, 91, 130, 87, 77, 95, 81, 75, 89, 85,
+  82, 94, 86, 76, 86, 83, 92, 82, 79, 78,
+  76, 98, 98, 72, 85, 80, 69, 79, 86, 96,
+  75, 84, 64, 76, 79, 90, 75, 78, 88, 87,
+  85, 88, 83, 82, 85, 83, 87, 97, 75, 93,
+  78, 86, 81, 86, 88, 93, 77, 71, 78, 88,
+  78, 97, 72, 80, 90, 77, 77, 83, 69, 86,
+  85, 87, 93, 89, 86, 81, 88, 96, 88, 76,
+  78, 78, 71, 79, 77, 70, 77, 83, 83, 95,
+  81, 75, 87, 84, 86, 79, 81, 77, 90, 76,
+  87, 89, 81, 95, 76, 75, 84, 64, 90, 87,
+  83, 75, 90, 92, 85, 81, 80, 76, 83, 82,
+  88, 61, 72, 106, 80, 95, 83, 83, 92, 89,
+  100, 86, 80, 100, 92, 80, 93, 83, 87, 90,
+  81, 80, 86, 97, 85, 84, 81, 82, 69, 87,
+  95, 73, 81, 91, 76, 80, 82, 95, 80, 89,
+  72, 73, 74, 94, 73, 80, 83, 91, 87, 86,
+  74, 81, 96, 75, 83, 90, 57, 87, 67, 82,
+  89, 95, 83, 106, 87, 71, 77, 64, 71, 105,
+  79, 77, 85, 86, 68, 67, 61, 79, 91, 89,
+  82, 82, 75, 87, 89, 86, 80, 83, 82, 75,
+  86, 61, 69, 90, 75, 86, 80, 94, 65, 70,
+  99, 103, 85, 91, 65, 97, 77, 95, 104, 79,
+  76, 74, 89, 82, 83, 58, 87, 72, 77, 52,
+  82, 86, 70, 76, 77, 74, 80, 87, 81, 76,
+  71, 151, 79, 70, 84, 89, 77, 97, 151, 68,
+  66, 84, 89, 72, 98, 85, 89, 84, 75, 69,
+  74, 77, 88, 81, 90, 81, 74, 85, 85, 66,
+  89, 71, 66, 85, 96, 113, 77, 85, 59, 83,
+  91, 104, 79, 68, 96, 83, 82, 89, 73, 89,
+  93, 72, 88, 81, 62, 91, 75, 83, 90, 91,
+  87, 102, 93, 74, 77, 68, 72, 106, 71, 79,
+  80, 91, 71, 69, 69, 81, 94, 78, 75, 74,
+  74, 85, 76, 82, 75, 82, 99, 76, 83, 67,
+  77, 97, 74, 78, 79, 80, 61, 69, 95, 104,
+  90, 95, 64, 123, 78, 95, 99, 73, 72, 73,
+  83, 85, 76, 66, 91, 65, 75, 58, 93, 79,
+  73, 78, 77, 67, 81, 80, 87, 81, 72, 150,
+  83, 73, 84, 84, 78, 91, 155, 68, 69, 78,
+  82, 69, 84, 84, 87, 83, 74, 75, 72, 78,
+  92, 82, 86, 82, 74, 86, 95, 66, 94, 71,
+  68, 73, 94, 99, 74, 82, 56, 86, 76, 96,
+  81, 67, 97, 81, 78, 93, 75, 90, 78, 80,
+  78, 99, 67, 88, 72, 83, 85, 94, 83, 85,
+  85, 75, 77, 74, 71, 102, 71, 71, 89, 85,
+  81, 78, 70, 81, 87, 88, 86, 87, 81, 90,
+  90, 95, 96, 79, 84, 73, 89, 65, 81, 73,
+  75, 86, 76, 100, 74, 75, 92, 79, 85, 87,
+  79, 95, 82, 89, 96, 77, 83, 84, 82, 74,
+  77, 60, 95, 78, 80, 78, 82, 94, 79, 75,
+  80, 70, 87, 89, 88, 83, 73, 127, 80, 88,
+  88, 87, 89, 88, 107, 79, 70, 75, 94, 82,
+  88, 86, 88, 86, 75, 74, 73, 91, 83, 86,
+  85, 80, 73, 79, 86, 69, 87, 78, 74, 78,
+  87, 102, 85, 84, 68, 85, 72, 99, 74, 72,
+  89, 85, 81, 90, 90, 81, 85, 85, 85, 88,
+  74, 87, 88, 85, 87, 81, 85, 87, 77, 73,
+  86, 85, 76, 85, 87, 78, 75, 91, 76, 72,
+  84, 84, 83, 87, 82, 82, 85, 91, 86, 83,
+  83, 97, 69, 77, 97, 76, 79, 73, 82, 98,
+  84, 94, 80, 70, 88, 79, 98, 85, 91, 77,
+  105, 87, 80, 81, 88, 95, 95, 90, 82, 73,
+  94, 90, 88, 75, 86, 86, 88, 77, 84, 88,
+  76, 80, 78, 62, 76, 79, 91, 70, 76, 85,
+  77, 76, 99, 89, 87, 90, 95, 86, 106, 79,
+  88, 86, 83, 83, 81, 88, 94, 84, 86, 90,
+  73, 75, 92, 82, 73, 92, 79, 89, 87, 96,
+  92, 92, 81, 87, 87, 84, 74, 82, 81, 92,
+  89, 79, 93, 89, 78, 81, 82, 80, 69, 87,
+  93, 85, 90, 78, 85, 78, 81, 74, 87, 87,
+  79, 92, 82, 79, 75, 94, 83, 73, 86, 86,
+  78, 81, 73, 84, 83, 91, 78, 81, 84, 95,
+  79, 71, 91, 74, 79, 74, 83, 93, 83, 88,
+  78, 71, 85, 74, 102, 85, 89, 85, 109, 83,
+  83, 81, 88, 99, 94, 92, 76, 76, 99, 95,
+  86, 79, 80, 82, 92, 76, 86, 82, 79, 77,
+  76, 66, 77, 74, 92, 79, 79, 82, 79, 69,
+  86, 90, 87, 80, 91, 87, 95, 79, 87, 88,
+  80, 89, 82, 91, 97, 85, 83, 93, 77, 71,
+  98, 82, 71, 91, 80, 83, 87, 94, 87, 90,
+  79, 83, 79, 82, 76, 82, 83, 93, 89, 84,
+  90, 87, 81, 81, 88, 87, 78, 82, 88, 87,
+  87, 86, 91, 72, 73, 79, 86, 90, 80, 86,
+  81, 79, 87, 86, 85, 75, 82, 85, 83, 90,
+  83, 83, 86, 94, 88, 86, 95, 91, 79, 82,
+  97, 71, 84, 72, 79, 93, 83, 91, 85, 76,
+  85, 78, 93, 85, 93, 78, 92, 84, 79, 74,
+  89, 97, 89, 82, 81, 74, 93, 89, 85, 92,
+  78, 88, 88, 79, 82, 77, 79, 92, 85, 65,
+  86, 80, 90, 86, 77, 87, 84, 80, 84, 83,
+  86, 70, 100, 86, 88, 79, 86, 84, 78, 79,
+  84, 83, 90, 87, 85, 81, 81, 74, 90, 80,
+  74, 96, 83, 80, 90, 85, 97, 94, 83, 88,
+  76, 84, 71, 80, 85, 91, 90, 80, 85, 87,
+  85, 78, 79, 91, 80, 97, 82, 58, 90, 94,
+  78, 86, 68, 85, 74, 87, 88, 85, 92, 88,
+  78, 79, 88, 79, 84, 67, 78, 73, 94, 85,
+  84, 87, 77, 91, 83, 75, 94, 73, 90, 59,
+  82, 96, 84, 90, 84, 88, 78, 89, 80, 83,
+  78, 91, 89, 86, 85, 87, 97, 89, 94, 80,
+  81, 86, 77, 83, 86, 95, 81, 77, 92, 83,
+  92, 87, 90, 81, 85, 89, 62, 75, 85, 85,
+  95, 86, 81, 107, 95, 86, 76, 90, 98, 95,
+  107, 89, 84, 96, 98, 81, 91, 96, 92, 79,
+  84, 88, 103, 78, 75, 85, 76, 82, 89, 90,
+  96, 65, 87, 83, 84, 83, 76, 83, 76, 75,
+  78, 92, 85, 61, 86, 83, 88, 91, 80, 77,
+  82, 83, 76, 103, 84, 84, 83, 89, 73, 88,
+  75, 82, 77, 78, 83, 83, 78, 91, 72, 71,
+  91, 91, 87, 73, 86, 81, 93, 80, 83, 89,
+  85, 86, 82, 75, 83, 78, 74, 56, 83, 93,
+  85, 76, 87, 84, 84, 96, 81, 83, 87, 82,
+  85, 88, 95, 86, 89, 90, 94, 81, 81, 76,
+  74, 88, 77, 91, 76, 84, 80, 86, 87, 78,
+  81, 81, 85, 80, 71, 86, 85, 89, 89, 83,
+  80, 102, 95, 85, 83, 88, 102, 83, 94, 89,
+  76, 90, 93, 81, 76, 80, 85, 71, 84, 86,
+  85, 72, 81, 88, 62, 80, 86, 83, 79, 62,
+  88, 90, 96, 84, 81, 85, 86, 83, 71, 96,
+  80, 63, 80, 83, 102, 84, 87, 82, 85, 78,
+  77, 107, 88, 101, 77, 84, 89, 88, 87, 79,
+  89, 71, 83, 82, 88, 82, 81, 67, 101, 96,
+  91, 83, 75, 91, 90, 69, 87, 82, 85, 90,
+  92, 71, 87, 81, 80, 71, 83, 93, 91, 76,
+  95, 80, 95, 92, 73, 83, 84, 80, 85, 88,
+  98, 82, 85, 89, 87, 86, 83, 79, 90, 92,
+  85, 92, 80, 94, 89, 79, 88, 86, 83, 64,
+  79, 87, 79, 78, 84, 84, 96, 79, 90, 87,
+  124, 80, 84, 90, 94, 81, 78, 89, 81, 85,
+  95, 79, 92, 75, 96, 79, 100, 83, 65, 84,
+  84, 96, 81, 77, 93, 83, 68, 53, 88, 96,
+  87, 80, 105, 92, 98, 84, 65, 103, 74, 77,
+  75, 85, 83, 94, 91, 80, 78, 86, 83, 71,
+  85, 41, 69, 87, 80, 95, 77, 89, 71, 92,
+  66, 92, 86, 95, 78, 94, 79, 70, 93, 83,
+  101, 75, 70, 96, 77, 76, 70, 91, 94, 124,
+  98, 72, 86, 76, 89, 85, 88, 86, 84, 94,
+  79, 74, 84, 80, 75, 84, 80, 87, 63, 80,
+  85, 71, 78, 79, 90, 83, 70, 92, 75, 73,
+  77, 84, 86, 74, 83, 84, 88, 64, 94, 93,
+  66, 79, 84, 84, 62, 71, 67, 69, 97, 87,
+  79, 78, 62, 89, 95, 97, 75, 89, 91, 85,
+  93, 85, 70, 85, 80, 90, 148, 85, 83, 79,
+  88, 82, 92, 92, 90, 78, 81, 80, 67, 106,
+  63, 80, 76, 73, 77, 60, 93, 77, 73, 91,
+  80, 85, 78, 76, 76, 96, 72, 74, 77, 72,
+  67, 84, 69, 92, 75, 88, 76, 83, 80, 90,
+  72, 97, 65, 78, 91, 75, 86, 75, 110, 77,
+  81, 103, 70, 88, 77, 86, 85, 95, 83, 79,
+  83, 75, 81, 92, 80, 81, 81, 90, 87, 82,
+  82, 84, 84, 75, 83, 82, 82, 73, 89, 76,
+  85, 82, 87, 55, 59, 85, 63, 87, 79, 91,
+  68, 81, 86, 86, 78, 85, 96, 87, 65, 86,
+  86, 84, 64, 77, 70, 66, 124, 92, 72, 82,
+  85, 93, 94, 102, 94, 90, 90, 79, 68, 75,
+  74, 81, 84, 86, 118, 78, 93, 85, 65, 71,
+  86, 90, 84, 60, 73, 86, 95, 99, 63, 84,
+  73, 78, 62, 76, 83, 68, 80, 79, 104, 76,
+  80, 76, 87, 64, 78, 100, 81, 95, 79, 84,
+  92, 91, 84, 84, 91, 63, 93, 83, 84, 79,
+  74, 66, 102, 101, 85, 74, 92, 81, 94, 79,
+  87, 90, 80, 88, 95, 59, 83, 91, 88, 76,
+  75, 97, 82, 77, 93, 88, 94, 89, 79, 86,
+  91, 79, 88, 86, 95, 79, 93, 93, 82, 80,
+  83, 55, 69, 85, 75, 96, 91, 86, 74, 80,
+  83, 88, 78, 70, 77, 80, 67, 84, 92, 95,
+  104, 75, 94, 75, 165, 78, 79, 86, 106, 88,
+  86, 89, 79, 87, 88, 75, 86, 78, 87, 86,
+  80, 82, 49, 79, 94, 96, 76, 81, 93, 76,
+  70, 51, 78, 98, 80, 75, 95, 90, 93, 81,
+  78, 106, 81, 85, 71, 82, 84, 96, 89, 92,
+  82, 83, 72, 65, 87, 40, 75, 82, 78, 102,
+  75, 88, 73, 78, 75, 93, 86, 88, 86, 93,
+  86, 74, 102, 88, 84, 81, 80, 87, 87, 78,
+  67, 93, 83, 135, 80, 72, 89, 85, 82, 81,
+  75, 89, 84, 91, 73, 80, 81, 89, 73, 89,
+  77, 90, 70, 81, 75, 83, 62, 83, 101, 90,
+  79, 91, 74, 80, 87, 79, 78, 83, 93, 79,
+  93, 75, 89, 88, 87, 80, 87, 81, 72, 77,
+  78, 70, 109, 84, 80, 70, 64, 81, 90, 103,
+  65, 68, 91, 79, 97, 90, 75, 88, 68, 89,
+  110, 90, 88, 78, 77, 96, 86, 96, 80, 94,
+  81, 98, 82, 98, 90, 91, 81, 84, 95, 64,
+  97, 102, 82, 85, 81, 93, 76, 86, 77, 87,
+  70, 70, 87, 68, 72, 91, 74, 83, 74, 89,
+  79, 75, 85, 86, 81, 87, 76, 80, 100, 73,
+  98, 88, 98, 77, 81, 102, 80, 89, 72, 85,
+  84, 109, 91, 77, 84, 76, 78, 88, 73, 85,
+  84, 83, 86, 80, 83, 93, 81, 81, 78, 79,
+  85, 74, 86, 76, 68, 78, 96, 68, 69, 88,
+  66, 86, 87, 86, 75, 79, 90, 88, 87, 89,
+  88, 91, 75, 86, 87, 83, 74, 79, 75, 69,
+  115, 83, 74, 77, 87, 84, 90, 100, 83, 70,
+  99, 76, 75, 82, 80, 86, 81, 84, 107, 85,
+  92, 85, 77, 81, 83, 90, 79, 68, 83, 92,
+  92, 86, 80, 91, 79, 79, 75, 76, 89, 94,
+  85, 80, 97, 75, 81, 79, 87, 69, 73, 91,
+  82, 94, 81, 85, 87, 95, 83, 88, 87, 60,
+  84, 84, 90, 82, 80, 69, 102, 92, 89, 78,
+  81, 77, 95, 87, 91, 97, 80, 91, 91, 66,
+  86, 88, 91, 74, 74, 97, 76, 84, 88, 93,
+  91, 90, 77, 91, 84, 81, 86, 80, 90, 81,
+  96, 91, 75, 78, 88, 61, 84, 89, 74, 99,
+  93, 91, 71, 84, 81, 88, 80, 73, 84, 79,
+  68, 78, 87, 89, 98, 76, 92, 73, 144, 72,
+  78, 87, 104, 84, 89, 89, 78, 76, 100, 76,
+  86, 79, 86, 92, 93, 85, 71, 87, 87, 89,
+  85, 78, 93, 82, 80, 59, 86, 98, 78, 74,
+  102, 86, 94, 82, 67, 115, 79, 90, 78, 82,
+  71, 99, 86, 93, 100, 83, 89, 90, 89, 86,
+  71, 64, 58, 89, 87, 91, 85, 105, 97, 112,
+  82, 67, 102, 94, 73, 97, 92, 91, 80, 75,
+  90, 88, 93, 76, 95, 86, 93, 92, 58, 81,
+  89, 74, 88, 97, 74, 104, 82, 73, 86, 81,
+  89, 87, 65, 91, 93, 89, 84, 113, 82, 82,
+  76, 86, 74, 66, 111, 73, 69, 72, 82, 90,
+  87, 65, 94, 77, 98, 84, 83, 80, 91, 85,
+  97, 93, 85, 96, 86, 84, 95, 71, 92, 88,
+  78, 90, 83, 95, 91, 88, 97, 80, 84, 99,
+  80, 88, 75, 83, 99, 84, 90, 74, 85, 78,
+  82, 83, 91, 99, 89, 79, 70, 79, 90, 76,
+  67, 86, 89, 97, 84, 83, 84, 85, 100, 91,
+  79, 76, 74, 69, 78, 84, 75, 80, 80, 86,
+  83, 70, 73, 71, 76, 79, 74, 84, 84, 102,
+  79, 77, 75, 69, 88, 78, 95, 80, 83, 68,
+  93, 91, 82, 84, 80, 84, 89, 81, 83, 78,
+  93, 83, 73, 86, 85, 86, 72, 83, 89, 78,
+  83, 81, 77, 91, 71, 91, 59, 87, 88, 108,
+  75, 114, 71, 73, 68, 84, 66, 73, 98, 105,
+  76, 78, 76, 73, 78, 72, 82, 81, 79, 77,
+  76, 89, 82, 86, 86, 89, 78, 86, 85, 82,
+  85, 88, 82, 89, 77, 75, 91, 84, 82, 92,
+  89, 86, 77, 90, 80, 87, 77, 76, 89, 85,
+  77, 81, 62, 90, 60, 94, 98, 83, 76, 90,
+  78, 71, 80, 86, 84, 74, 112, 86, 90, 81,
+  74, 66, 83, 85, 71, 83, 84, 91, 74, 83,
+  75, 71, 82, 77, 86, 81, 88, 103, 76, 83,
+  87, 72, 87, 79, 93, 95, 95, 97, 87, 83,
+  86, 106, 79, 94, 73, 90, 93, 77, 93, 81,
+  73, 85, 96, 82, 76, 82, 82, 74, 83, 74,
+  75, 87, 78, 86, 69, 72, 82, 107, 76, 118,
+  81, 67, 80, 95, 65, 80, 73, 103, 79, 80,
+  85, 74, 76, 100, 96, 74, 76, 75, 90, 79,
+  84, 99, 78, 95, 82, 87, 75, 79, 86, 88,
+  86, 89, 79, 83, 95, 81, 81, 81, 93, 86,
+  74, 87, 66, 82, 80, 74, 102, 96, 79, 85,
+  85, 97, 91, 91, 96, 79, 73, 88, 74, 73,
+  79, 95, 86, 78, 67, 110, 87, 96, 92, 76,
+  84, 87, 90, 87, 75, 72, 60, 78, 85, 94,
+  84, 104, 107, 124, 80, 63, 96, 95, 85, 100,
+  91, 94, 77, 73, 92, 87, 85, 66, 78, 78,
+  91, 89, 70, 79, 83, 76, 81, 91, 72, 104,
+  87, 74, 90, 80, 91, 88, 72, 82, 94, 78,
+  97, 98, 92, 88, 80, 72, 84, 48, 94, 62,
+  74, 83, 73, 102, 75, 64, 92, 80, 98, 93,
+  72, 71, 85, 85, 88, 101, 89, 97, 81, 79,
+  91, 67, 109, 93, 85, 90, 79, 96, 85, 79,
+  97, 71, 85, 93, 76, 82, 80, 86, 98, 83,
+  102, 81, 99, 83, 82, 75, 102, 100, 80, 79,
+  82, 73, 84, 91, 71, 78, 89, 109, 81, 76,
+  83, 91, 97, 91, 86, 70, 81, 62, 65, 75,
+  76, 85, 88, 91, 85, 86, 73, 71, 83, 63,
+  69, 76, 78, 119, 61, 69, 71, 65, 62, 78,
+  112, 79, 88, 65, 90, 97, 69, 80, 84, 78,
+  68, 92, 67, 74, 96, 86, 75, 70, 83, 104,
+  70, 85, 76, 96, 76, 84, 74, 63, 83, 76,
+  70, 73, 79, 121, 82, 115, 42, 97, 70, 74,
+  79, 65, 78, 78, 72, 84, 70, 69, 69, 60,
+  87, 81, 68, 71, 71, 91, 90, 79, 77, 104,
+  65, 80, 79, 76, 77, 75, 76, 93, 75, 70,
+  78, 84, 76, 77, 94, 88, 78, 81, 88, 91,
+  71, 77, 94, 82, 68, 72, 74, 73, 63, 88,
+  89, 88, 73, 87, 71, 61, 83, 76, 83, 77,
+  103, 84, 87, 81, 78, 54, 79, 78, 75, 88,
+  90, 86, 86, 73, 80, 74, 91, 64, 76, 81,
+  93, 103, 55, 78, 77, 73, 65, 84, 109, 101,
+  94, 92, 86, 78, 77, 108, 84, 93, 96, 95,
+  78, 68, 83, 84, 77, 74, 93, 82, 74, 88,
+  75, 83, 82, 72, 72, 77, 88, 84, 76, 69,
+  72, 113, 80, 133, 61, 99, 78, 87, 79, 65,
+  82, 73, 74, 97, 88, 69, 69, 118, 99, 69,
+  67, 72, 84, 73, 81, 96, 58, 106, 73, 82,
+  80, 87, 85, 76, 87, 97, 73, 75, 95, 87,
+  73, 71, 96, 85, 74, 78, 81, 83, 69, 79,
+  93, 95, 76, 67, 76, 80, 103, 85, 89, 85,
+  75, 82, 76, 68, 79, 90, 86, 80, 77, 106,
+  102, 89, 92, 82, 88, 78, 87, 88, 82, 72,
+  63, 84, 88, 96, 87, 103, 94, 111, 79, 71,
+  96, 95, 91, 94, 88, 84, 73, 79, 90, 85,
+  87, 65, 89, 70, 98, 88, 85, 89, 77, 94,
+  91, 89, 80, 96, 81, 83, 83, 74, 91, 92,
+  77, 87, 98, 90, 82, 95, 89, 77, 82, 75,
+  80, 63, 89, 78, 86, 77, 79, 110, 79, 68,
+  85, 87, 96, 85, 87, 81, 78, 83, 89, 95,
+  95, 104, 90, 77, 87, 70, 97, 89, 86, 94,
+  79, 84, 83, 79, 96, 79, 87, 88, 80, 91,
+  82, 92, 89, 87, 99, 83, 101, 82, 97, 77,
+  94, 97, 80, 90, 81, 76, 94, 89, 70, 82,
+  82, 94, 80, 84, 86, 86, 95, 81, 96, 80,
+  83, 69, 77, 76, 67, 85, 92, 86, 84, 91,
+  73, 75, 85, 65, 72, 78, 82, 116, 60, 80,
+  73, 67, 78, 76, 91, 74, 103, 69, 88, 94,
+  86, 65, 98, 80, 59, 84, 81, 87, 92, 80,
+  77, 60, 81, 93, 78, 84, 78, 98, 77, 74,
+  82, 74, 77, 77, 72, 81, 85, 111, 83, 129,
+  52, 83, 76, 87, 92, 76, 76, 82, 78, 87,
+  76, 71, 83, 72, 97, 74, 72, 85, 79, 94,
+  94, 86, 77, 99, 82, 78, 77, 79, 85, 81,
+  75, 87, 77, 76, 85, 87, 76, 70, 91, 90,
+  84, 81, 86, 88, 78, 78, 97, 88, 72, 77,
+  99, 79, 47, 89, 97, 86, 76, 84, 73, 63,
+  85, 87, 84, 84, 95, 89, 97, 92, 76, 70,
+  85, 76, 70, 87, 91, 90, 84, 62, 78, 79,
+  92, 79, 84, 91, 100, 98, 73, 88, 78, 76,
+  86, 86, 89, 103, 89, 86, 87, 72, 74, 89,
+  91, 92, 94, 89, 91, 82, 74, 81, 80, 77,
+  88, 82, 72, 85, 85, 90, 82, 67, 93, 79,
+  80, 84, 77, 82, 85, 91, 77, 121, 71, 85,
+  82, 96, 89, 81, 84, 86, 83, 97, 90, 72,
+  85, 102, 85, 67, 72, 87, 83, 88, 86, 100,
+  70, 88, 85, 82, 79, 102, 86, 80, 86, 89,
+  80, 72, 101, 86, 70, 84, 94, 88, 87, 86,
+  87, 86, 71, 82, 85, 94, 83, 76, 79, 85,
+  88, 78, 94, 84, 77, 84, 76, 71, 83, 100,
+  87, 88, 92, 86, 110, 77, 79, 92, 76, 83,
+  65, 93, 97, 103, 80, 97, 73, 98, 81, 73,
+  92, 105, 105, 90, 78, 87, 71, 79, 95, 87,
+  90, 79, 114, 77, 79, 71, 79, 95, 87, 81,
+  98, 77, 86, 80, 74, 95, 95, 95, 81, 67,
+  72, 82, 81, 73, 79, 80, 88, 86, 82, 79,
+  93, 84, 78, 71, 75, 76, 67, 81, 81, 91,
+  88, 72, 89, 84, 67, 98, 85, 79, 88, 89,
+  82, 76, 88, 79, 89, 86, 74, 96, 86, 80,
+  74, 98, 88, 90, 87, 80, 75, 83, 74, 79,
+  91, 90, 83, 89, 81, 72, 81, 89, 81, 76,
+  67, 75, 74, 94, 81, 85, 84, 90, 62, 73,
+  87, 74, 88, 77, 65, 98, 80, 93, 96, 87,
+  112, 73, 91, 75, 90, 97, 66, 74, 55, 85,
+  91, 112, 86, 99, 62, 99, 88, 88, 103, 97,
+  77, 95, 99, 73, 87, 67, 86, 83, 95, 72,
+  144, 98, 77, 84, 86, 73, 89, 83, 106, 76,
+  93, 76, 98, 116, 105, 114, 76, 69, 69, 73,
+  91, 64, 66, 81, 78, 91, 99, 78, 84, 76,
+  92, 59, 83, 83, 62, 75, 73, 100, 87, 64,
+  89, 77, 42, 108, 78, 81, 106, 74, 73, 71,
+  89, 83, 81, 77, 69, 88, 88, 70, 71, 91,
+  77, 104, 85, 78, 73, 81, 87, 87, 78, 60,
+  79, 71, 73, 67, 71, 89, 73, 69, 66, 80,
+  83, 112, 77, 83, 82, 88, 76, 66, 81, 64,
+  85, 90, 52, 88, 71, 93, 122, 79, 85, 73,
+  71, 84, 79, 65, 87, 83, 73, 94, 91, 89,
+  88, 88, 76, 96, 78, 71, 86, 93, 73, 86,
+  82, 90, 86, 86, 87, 84, 84, 81, 99, 79,
+  81, 85, 80, 80, 89, 89, 84, 79, 75, 76,
+  102, 88, 91, 91, 81, 94, 68, 86, 85, 80,
+  82, 84, 73, 76, 77, 85, 96, 90, 84, 67,
+  81, 70, 72, 87, 84, 94, 92, 81, 89, 79,
+  67, 78, 80, 86, 86, 72, 79, 79, 90, 78,
+  81, 82, 78, 81, 87, 86, 78, 101, 90, 100,
+  87, 78, 96, 85, 71, 71, 88, 91, 90, 81,
+  82, 80, 85, 90, 74, 80, 73, 76, 87, 85,
+  77, 87, 85, 97, 95, 81, 88, 84, 83, 79,
+  75, 94, 80, 89, 90, 90, 94, 93, 90, 77,
+  86, 83, 79, 90, 58, 85, 97, 118, 83, 93,
+  67, 88, 92, 91, 96, 111, 115, 79, 87, 91,
+  77, 71, 100, 89, 94, 71, 95, 75, 89, 73,
+  89, 99, 84, 84, 92, 79, 94, 98, 69, 110,
+  84, 85, 78, 64, 84, 78, 82, 77, 84, 89,
+  88, 86, 90, 65, 89, 78, 69, 75, 80, 73,
+  66, 76, 68, 95, 81, 73, 79, 82, 68, 102,
+  102, 79, 94, 93, 82, 81, 78, 90, 83, 67,
+  83, 90, 88, 73, 67, 86, 80, 78, 89, 80,
+  50, 83, 86, 78, 120, 72, 68, 97, 84, 70,
+  82, 87, 79, 82, 79, 90, 77, 101, 78, 88,
+  83, 91, 62, 73, 81, 71, 84, 77, 65, 89,
+  69, 85, 103, 75, 114, 68, 75, 84, 86, 94,
+  57, 91, 46, 74, 91, 137, 85, 99, 59, 65,
+  111, 111, 118, 77, 72, 86, 92, 71, 113, 56,
+  109, 84, 104, 89, 106, 107, 94, 74, 91, 63,
+  77, 72, 94, 76, 77, 94, 93, 128, 86, 121,
+  84, 74, 80, 68, 93, 73, 67, 95, 100, 90,
+  118, 64, 75, 75, 67, 83, 81, 85, 84, 71,
+  66, 95, 78, 78, 80, 75, 46, 102, 95, 77,
+  121, 75, 72, 77, 75, 93, 89, 82, 77, 79,
+  90, 59, 62, 82, 69, 71, 80, 81, 29, 84,
+  108, 102, 95, 46, 58, 75, 82, 65, 72, 95,
+  88, 70, 79, 91, 85, 131, 79, 82, 86, 85,
+  85, 55, 83, 64, 71, 91, 47, 74, 56, 81,
+  133, 63, 80, 69, 72, 92, 84, 74, 82, 86,
+  67, 91, 93, 110, 97, 90, 69, 87, 86, 92,
+  91, 88, 70, 81, 79, 91, 113, 73, 91, 86,
+  86, 97, 89, 89, 85, 97, 78, 73, 79, 91,
+  82, 82, 90, 92, 116, 100, 85, 90, 92, 97,
+  84, 81, 85, 81, 88, 92, 77, 79, 86, 70,
+  93, 78, 77, 77, 83, 63, 72, 81, 86, 93,
+  74, 78, 75, 79, 59, 92, 94, 87, 92, 76,
+  70, 82, 89, 89, 79, 93, 83, 82, 88, 85,
+  75, 91, 82, 94, 88, 78, 81, 87, 86, 69,
+  78, 73, 78, 76, 82, 76, 86, 86, 75, 88,
+  80, 89, 86, 91, 83, 88, 89, 96, 95, 80,
+  83, 76, 65, 79, 72, 90, 73, 82, 97, 79,
+  87, 87, 79, 82, 93, 90, 85, 98, 69, 94,
+  93, 94, 93, 79, 71, 92, 100, 83, 85, 92,
+  82, 88, 62, 92, 82, 86, 91, 87, 80, 71,
+  81, 74, 87, 80, 84, 92, 82, 85, 86, 88,
+  90, 86, 79, 93, 70, 81, 89, 65, 84, 76,
+  79, 90, 82, 97, 90, 93, 80, 76, 95, 85,
+  79, 89, 92, 75, 79, 84, 81, 88, 80, 86,
+  80, 74, 84, 92, 93, 94, 87, 84, 83, 79,
+  83, 76, 88, 85, 87, 87, 85, 88, 77, 72,
+  95, 82, 90, 86, 63, 72, 75, 72, 112, 82,
+  79, 98, 87, 79, 76, 76, 77, 95, 90, 89,
+  69, 80, 77, 88, 93, 98, 85, 85, 88, 87,
+  96, 82, 75, 101, 78, 82, 86, 74, 91, 84,
+  73, 82, 94, 74, 75, 99, 64, 94, 95, 98,
+  91, 89, 69, 95, 107, 91, 87, 91, 70, 77,
+  79, 84, 99, 73, 92, 88, 89, 90, 80, 77,
+  89, 81, 84, 77, 85, 72, 87, 86, 87, 76,
+  73, 106, 68, 82, 99, 70, 79, 78, 76, 83,
+  82, 95, 84, 86, 81, 74, 84, 100, 74, 85,
+  99, 81, 89, 81, 75, 91, 78, 78, 75, 79,
+  70, 87, 103, 93, 84, 79, 88, 71, 86, 81,
+  82, 84, 88, 82, 86, 90, 77, 66, 87, 73,
+  82, 82, 56, 73, 84, 83, 93, 67, 75, 94,
+  89, 71, 80, 81, 84, 90, 87, 91, 76, 82,
+  77, 81, 102, 92, 91, 81, 88, 88, 80, 71,
+  70, 103, 70, 78, 104, 70, 82, 80, 77, 86,
+  86, 56, 86, 94, 71, 93, 93, 92, 94, 85,
+  76, 89, 93, 83, 85, 80, 86, 87, 90, 87,
+  106, 86, 87, 86, 76, 85, 82, 82, 86, 90,
+  78, 78, 82, 86, 82, 88, 84, 80, 86, 88,
+  71, 82, 100, 93, 81, 77, 79, 85, 81, 92,
+  91, 80, 79, 77, 96, 82, 81, 88, 91, 64,
+  94, 89, 90, 86, 75, 82, 75, 67, 84, 90,
+  97, 97, 85, 77, 77, 83, 88, 80, 85, 91,
+  86, 83, 90, 93, 82, 81, 98, 87, 88, 86,
+  81, 79, 78, 74, 80, 84, 84, 89, 82, 81,
+  75, 82, 77, 95, 87, 84, 85, 77, 79, 86,
+  99, 93, 89, 84, 88, 90, 71, 84, 75, 92,
+  82, 83, 88, 78, 74, 72, 110, 81, 81, 81,
+  85, 91, 82, 83, 76, 72, 89, 98, 74, 92,
+  85, 92, 85, 86, 83, 83, 85, 103, 82, 74,
+  84, 77, 84, 68, 73, 85, 91, 74, 58, 79,
+  79, 79, 78, 92, 79, 89, 85, 84, 81, 87,
+  84, 83, 95, 78, 83, 105, 99, 81, 70, 83,
+  80, 84, 83, 83, 89, 81, 96, 105, 88, 88,
+  111, 74, 84, 88, 81, 90, 78, 91, 82, 91,
+  77, 78, 88, 88, 79, 81, 86, 74, 78, 90,
+  92, 98, 87, 78, 82, 94, 79, 89, 85, 84,
+  82, 74, 87, 81, 74, 76, 73, 84, 88, 81,
+  81, 74, 81, 76, 90, 79, 75, 89, 101, 89,
+  90, 87, 80, 92, 93, 91, 82, 81, 87, 90,
+  73, 87, 78, 93, 89, 84, 92, 72, 78, 81,
+  80, 87, 74, 80, 93, 98, 74, 79, 91, 91,
+  86, 90, 84, 75, 76, 103, 81, 70, 83, 77,
+  104, 67, 60, 88, 87, 85, 52, 65, 79, 68,
+  92, 70, 76, 89, 78, 86, 86, 84, 90, 62,
+  84, 57, 96, 97, 97, 78, 59, 108, 86, 84,
+  89, 81, 88, 71, 114, 100, 90, 90, 104, 63,
+  84, 79, 98, 91, 74, 84, 79, 83, 75, 59,
+  107, 75, 77, 93, 77, 71, 78, 86, 87, 95,
+  94, 75, 83, 97, 77, 77, 94, 90, 89, 69,
+  91, 81, 71, 84, 78, 84, 89, 83, 113, 84,
+  85, 65, 79, 67, 68, 87, 106, 86, 89, 76,
+  66, 90, 87, 95, 81, 82, 80, 86, 79, 73,
+  68, 94, 75, 77, 75, 79, 84, 84, 83, 87,
+  74, 80, 93, 76, 72, 87, 84, 92, 89, 81,
+  89, 78, 76, 103, 90, 78, 90, 83, 80, 68,
+  69, 86, 92, 83, 68, 86, 87, 80, 100, 88,
+  79, 92, 85, 85, 85, 84, 83, 81, 97, 82,
+  83, 95, 101, 82, 80, 103, 78, 77, 82, 85,
+  90, 85, 89, 89, 77, 93, 98, 82, 91, 86,
+  95, 89, 89, 87, 81, 89, 83, 75, 105, 90,
+  85, 75, 84, 83, 71, 81, 91, 93, 78, 76,
+  81, 98, 81, 94, 81, 85, 85, 77, 88, 86,
+  72, 94, 75, 82, 89, 79, 79, 77, 84, 83,
+  76, 73, 80, 92, 65, 88, 82, 93, 81, 95,
+  87, 90, 86, 85, 86, 89, 76, 99, 83, 67,
+  86, 73, 101, 89, 89, 87, 63, 81, 97, 73,
+  88, 79, 74, 85, 95, 77, 82, 92, 92, 93,
+  83, 98, 80, 71, 90, 77, 102, 72, 65, 68,
+  95, 82, 111, 87, 62, 83, 76, 84, 86, 90,
+  83, 71, 91, 89, 88, 86, 86, 69, 78, 78,
+  80, 81, 60, 82, 82, 83, 78, 99, 73, 95,
+  83, 111, 75, 106, 80, 71, 93, 80, 89, 85,
+  80, 87, 91, 92, 79, 132, 87, 82, 63, 77,
+  92, 69, 74, 79, 90, 104, 75, 77, 79, 86,
+  88, 78, 95, 78, 96, 79, 85, 73, 68, 69,
+  73, 88, 94, 94, 88, 79, 74, 77, 77, 82,
+  78, 85, 81, 88, 100, 86, 75, 80, 86, 104,
+  69, 85, 70, 83, 84, 85, 84, 102, 76, 76,
+  111, 88, 82, 86, 50, 97, 111, 85, 76, 71,
+  90, 76, 119, 71, 89, 123, 79, 73, 85, 95,
+  86, 62, 83, 77, 119, 108, 61, 66, 85, 98,
+  100, 76, 80, 84, 73, 43, 85, 95, 69, 64,
+  119, 68, 84, 84, 84, 34, 87, 50, 59, 79,
+  43, 85, 105, 80, 88, 110, 75, 83, 86, 117,
+  72, 97, 79, 73, 82, 80, 75, 79, 81, 73,
+  94, 90, 95, 91, 84, 74, 46, 85, 74, 70,
+  76, 83, 82, 106, 31, 74, 72, 87, 94, 71,
+  112, 89, 101, 82, 79, 78, 74, 93, 88, 93,
+  101, 88, 126, 99, 70, 63, 69, 76, 79, 82,
+  107, 82, 86, 80, 69, 79, 88, 120, 59, 101,
+  48, 80, 95, 64, 80, 103, 101, 74, 78, 92,
+  86, 80, 65, 81, 83, 81, 90, 78, 81, 80,
+  91, 80, 80, 87, 84, 92, 83, 97, 87, 69,
+  92, 82, 101, 105, 65, 80, 92, 76, 84, 102,
+  89, 85, 95, 89, 87, 87, 89, 65, 91, 88,
+  86, 123, 93, 76, 69, 87, 78, 84, 80, 72,
+  72, 59, 79, 96, 84, 91, 75, 87, 68, 105,
+  71, 72, 88, 80, 88, 91, 87, 87, 85, 91,
+  80, 66, 84, 85, 69, 69, 92, 97, 65, 81,
+  87, 101, 69, 67, 82, 93, 94, 83, 78, 73,
+  97, 72, 86, 79, 72, 92, 72, 89, 90, 85,
+  86, 82, 64, 85, 88, 77, 81, 92, 60, 83,
+  87, 90, 77, 82, 96, 96, 72, 85, 58, 86,
+  84, 94, 75, 76, 84, 88, 83, 79, 90, 89,
+  85, 86, 77, 72, 85, 70, 80, 90, 74, 93,
+  83, 86, 87, 75, 82, 95, 74, 83, 94, 81,
+  76, 87, 70, 78, 103, 73, 95, 84, 76, 92,
+  87, 96, 83, 78, 98, 83, 76, 89, 99, 87,
+  82, 78, 90, 98, 94, 84, 80, 97, 82, 87,
+  71, 78, 83, 75, 100, 92, 78, 82, 83, 78,
+  85, 82, 101, 85, 94, 84, 97, 86, 80, 81,
+  99, 74, 83, 94, 91, 77, 84, 81, 87, 97,
+  94, 94, 79, 102, 85, 74, 87, 67, 88, 75,
+  92, 65, 71, 88, 77, 82, 83, 80, 75, 69,
+  81, 77, 84, 86, 81, 84, 81, 82, 63, 92,
+  83, 84, 77, 87, 83, 83, 81, 86, 80, 84,
+  77, 75, 94, 82, 77, 80, 90, 91, 83, 89,
+  85, 70, 77, 89, 89, 89, 80, 90, 81, 88,
+  86, 69, 83, 93, 75, 72, 96, 80, 91, 101,
+  67, 75, 107, 80, 90, 72, 82, 96, 81, 82,
+  90, 77, 84, 74, 78, 86, 100, 68, 83, 64,
+  91, 105, 89, 81, 68, 99, 83, 86, 83, 74,
+  76, 60, 113, 87, 73, 88, 82, 66, 85, 82,
+  98, 87, 93, 74, 89, 77, 87, 67, 100, 63,
+  75, 104, 85, 78, 86, 88, 81, 99, 105, 106,
+  81, 93, 88, 64, 95, 64, 93, 76, 87, 69,
+  73, 75, 76, 83, 83, 87, 87, 78, 82, 70,
+  91, 76, 74, 76, 108, 91, 70, 88, 76, 88,
+  90, 93, 80, 87, 65, 90, 81, 84, 69, 71,
+  110, 85, 80, 77, 88, 87, 84, 85, 77, 68,
+  86, 91, 85, 87, 75, 90, 75, 84, 87, 84,
+  84, 100, 83, 82, 91, 83, 72, 99, 74, 76,
+  97, 67, 81, 83, 87, 89, 69, 99, 83, 78,
+  89, 79, 77, 90, 96, 80, 89, 79, 81, 108,
+  97, 87, 83, 67, 72, 75, 68, 84, 85, 78,
+  89, 78, 76, 84, 82, 78, 84, 90, 70, 90,
+  89, 83, 92, 89, 76, 73, 83, 75, 85, 76,
+  94, 92, 86, 84, 79, 90, 85, 92, 83, 91,
+  87, 81, 73, 72, 86, 73, 82, 71, 75, 65,
+  77, 81, 81, 80, 75, 81, 82, 81, 104, 83,
+  82, 79, 89, 89, 80, 97, 83, 79, 90, 81,
+  82, 85, 77, 89, 79, 86, 77, 76, 95, 85,
+  85, 86, 77, 83, 81, 87, 87, 63, 92, 100,
+  72, 83, 83, 78, 87, 87, 100, 76, 98, 90,
+  83, 78, 79, 82, 94, 93, 100, 78, 70, 79,
+  74, 91, 89, 84, 75, 84, 79, 81, 83, 80,
+  81, 83, 82, 75, 83, 87, 78, 65, 76, 85,
+  90, 87, 77, 75, 75, 89, 91, 89, 85, 80,
+  88, 78, 100, 85, 79, 97, 78, 85, 83, 97,
+  85, 70, 69, 85, 70, 78, 82, 91, 73, 95,
+  73, 87, 83, 94, 83, 94, 79, 72, 72, 93,
+  73, 81, 91, 97, 93, 83, 83, 77, 85, 81,
+  88, 93, 98, 89, 85, 71, 74, 83, 78, 81,
+  77, 96, 105, 92, 73, 104, 93, 92, 81, 93,
+  86, 80, 79, 85, 88, 76, 81, 77, 82, 81,
+  77, 70, 78, 74, 79, 76, 105, 80, 80, 68,
+  97, 100, 102, 72, 106, 76, 81, 79, 83, 87,
+  84, 81, 96, 73, 129, 83, 68, 80, 81, 74,
+  89, 80, 78, 83, 63, 84, 104, 91, 75, 91,
+  83, 65, 68, 76, 78, 81, 78, 87, 89, 82,
+  77, 70, 63, 88, 107, 69, 81, 90, 85, 68,
+  90, 98, 61, 102, 87, 68, 70, 98, 76, 60,
+  64, 82, 82, 77, 82, 101, 79, 76, 80, 82,
+  83, 104, 84, 93, 77, 84, 67, 100, 76, 85,
+  93, 110, 78, 76, 70, 92, 78, 79, 83, 82,
+  114, 91, 85, 72, 88, 81, 76, 78, 79, 86,
+  69, 92, 79, 112, 87, 110, 80, 92, 82, 77,
+  92, 75, 80, 92, 81, 86, 86, 90, 72, 85,
+  81, 88, 82, 66, 77, 61, 77, 91, 92, 80,
+  83, 89, 92, 80, 76, 86, 87, 78, 80, 84,
+  83, 74, 99, 81, 78, 84, 96, 84, 95, 87,
+  76, 78, 78, 83, 94, 78, 82, 100, 93, 95,
+  82, 88, 80, 85, 73, 84, 87, 77, 77, 76,
+  75, 85, 87, 86, 85, 78, 91, 77, 77, 89,
+  83, 82, 96, 83, 92, 90, 88, 77, 71, 84,
+  89, 84, 80, 86, 76, 85, 76, 72, 91, 91,
+  83, 94, 78, 100, 76, 98, 93, 83, 97, 98,
+  70, 83, 78, 97, 87, 78, 84, 89, 89, 87,
+  82, 68, 83, 80, 76, 87, 82, 92, 78, 92,
+  74, 98, 85, 90, 82, 96, 82, 76, 81, 85,
+  80, 79, 93, 93, 105, 96, 78, 68, 87, 82,
+  71, 74, 74, 70, 72, 86, 82, 71, 75, 85,
+  93, 73, 80, 94, 80, 74, 82, 78, 103, 69,
+  112, 90, 75, 107, 99, 105, 76, 98, 77, 87,
+  80, 96, 68, 86, 63, 87, 111, 98, 77, 83,
+  79, 79, 73, 87, 82, 98, 81, 70, 91, 94,
+  76, 101, 91, 77, 96, 68, 80, 90, 84, 83,
+  98, 98, 77, 86, 85, 62, 70, 105, 77, 74,
+  86, 74, 86, 79, 77, 81, 95, 90, 85, 87,
+  71, 90, 84, 85, 65, 70, 97, 85, 95, 81,
+  71, 84, 83, 78, 91, 75, 102, 92, 79, 70,
+  82, 84, 73, 90, 82, 95, 70, 95, 80, 74,
+  83, 71, 75, 92, 83, 81, 72, 69, 72, 80,
+  95, 107, 118, 83, 86, 55, 87, 75, 57, 83,
+  109, 77, 94, 74, 97, 84, 78, 76, 82, 69,
+  76, 85, 88, 70, 73, 86, 109, 82, 147, 85,
+  85, 95, 78, 76, 68, 96, 87, 92, 69, 112,
+  84, 110, 56, 76, 138, 83, 40, 84, 91, 86,
+  67, 97, 67, 96, 70, 70, 92, 113, 84, 74,
+  74, 97, 73, 68, 89, 121, 68, 72, 71, 89,
+  60, 74, 88, 51, 82, 89, 61, 66, 87, 78,
+  91, 86, 90, 89, 89, 85, 84, 82, 76, 77,
+  80, 87, 53, 68, 96, 106, 108, 67, 58, 90,
+  75, 77, 97, 71, 129, 98, 76, 72, 88, 105,
+  77, 89, 82, 93, 64, 108, 124, 67, 86, 83,
+  62, 105, 82, 76, 84, 60, 82, 91, 101, 92,
+  100, 84, 72, 69, 87, 82, 73, 77, 78, 86,
+  73, 86, 85, 68, 76, 91, 80, 75, 91, 92,
+  77, 71, 77, 77, 91, 104, 106, 77, 80, 86,
+  81, 93, 80, 100, 70, 79, 87, 94, 92, 82,
+  68, 87, 108, 109, 77, 84, 78, 88, 72, 84,
+  77, 94, 81, 74, 83, 85, 76, 108, 97, 79,
+  91, 71, 88, 89, 81, 81, 79, 96, 78, 84,
+  80, 65, 70, 89, 66, 81, 86, 72, 79, 99,
+  79, 93, 91, 87, 85, 85, 74, 80, 85, 79,
+  73, 69, 103, 90, 85, 80, 76, 75, 85, 76,
+  83, 76, 90, 85, 82, 72, 81, 88, 76, 93,
+  91, 96, 109, 91, 77, 79, 83, 71, 75, 89,
+  85, 76, 71, 74, 81, 80, 85, 88, 76, 85,
+  80, 84, 82, 93, 69, 88, 83, 72, 72, 104,
+  81, 69, 92, 82, 81, 74, 83, 86, 82, 78,
+  87, 81, 84, 64, 77, 97, 74, 92, 80, 95,
+  98, 79, 76, 82, 91, 86, 92, 72, 71, 98,
+  75, 77, 95, 100, 72, 79, 76, 85, 75, 80,
+  85, 76, 83, 83, 69, 93, 114, 85, 86, 84,
+  80, 76, 84, 80, 88, 83, 106, 86, 66, 92,
+  75, 75, 109, 90, 77, 85, 88, 87, 80, 75,
+  84, 85, 80, 90, 90, 87, 78, 77, 78, 78,
+  90, 75, 63, 98, 91, 86, 91, 80, 79, 71,
+  71, 81, 84, 84, 82, 71, 84, 87, 94, 81,
+  63, 86, 82, 94, 84, 74, 78, 86, 88, 95,
+  75, 78, 86, 74, 82, 97, 76, 73, 86, 66,
+  82, 87, 61, 87, 89, 84, 79, 110, 78, 63,
+  74, 75, 78, 71, 83, 88, 76, 71, 91, 77,
+  90, 86, 69, 98, 73, 81, 77, 75, 104, 78,
+  78, 81, 105, 83, 73, 70, 67, 89, 82, 61,
+  97, 98, 82, 83, 68, 80, 71, 86, 78, 85,
+  99, 84, 55, 94, 121, 91, 87, 79, 90, 82,
+  80, 93, 86, 89, 104, 90, 69, 91, 67, 67,
+  96, 83, 78, 93, 68, 82, 77, 89, 84, 80,
+  83, 91, 81, 85, 89, 78, 75, 79, 83, 84,
+  85, 96, 87, 89, 85, 75, 100, 73, 72, 82,
+  75, 82, 75, 73, 76, 85, 101, 70, 79, 94,
+  87, 85, 88, 69, 70, 85, 95, 100, 59, 68,
+  84, 74, 83, 83, 72, 73, 80, 83, 79, 92,
+  74, 89, 85, 89, 69, 100, 84, 67, 91, 86,
+  99, 74, 87, 81, 73, 73, 86, 79, 76, 89,
+  72, 94, 77, 70, 68, 80, 93, 82, 82, 78,
+  95, 84, 74, 74, 70, 90, 69, 81, 95, 100,
+  74, 78, 75, 83, 78, 89, 83, 83, 84, 77,
+  68, 94, 115, 86, 89, 90, 89, 74, 84, 73,
+  74, 80, 105, 90, 69, 94, 73, 70, 96, 88,
+  78, 81, 77, 81, 82, 85, 85, 88, 82, 89,
+  94, 79, 78, 77, 86, 78, 90, 84, 87, 88,
+  94, 80, 91, 80, 83, 76, 68, 83, 86, 88,
+  83, 81, 88, 84, 93, 80, 109, 82, 76, 104,
+  102, 79, 78, 85, 88, 89, 77, 86, 87, 101,
+  75, 81, 97, 79, 75, 100, 81, 91, 74, 77,
+  77, 75, 73, 93, 92, 100, 94, 102, 77, 89,
+  89, 73, 93, 100, 86, 80, 84, 79, 75, 88,
+  86, 65, 71, 79, 82, 72, 101, 98, 90, 72,
+  68, 89, 78, 75, 78, 78, 85, 77, 77, 95,
+  89, 102, 104, 97, 109, 93, 84, 76, 78, 60,
+  85, 69, 68, 94, 99, 72, 98, 80, 69, 71,
+  102, 91, 81, 79, 65, 57, 77, 93, 95, 90,
+  86, 94, 85, 79, 79, 59, 103, 77, 90, 84,
+  77, 74, 93, 78, 83, 79, 86, 88, 54, 59,
+  88, 82, 84, 73, 85, 80, 86, 92, 75, 77,
+  92, 77, 70, 82, 85, 73, 78, 99, 81, 88,
+  95, 100, 97, 84, 86, 106, 86, 81, 94, 87,
+  88, 83, 75, 87, 88, 88, 83, 74, 91, 92,
+  63, 86, 83, 86, 74, 102, 86, 93, 97, 78,
+  86, 67, 88, 85, 88, 83, 77, 91, 88, 82,
+  75, 90, 84, 83, 89, 88, 86, 72, 71, 81,
+  75, 81, 86, 78, 80, 80, 74, 97, 91, 79,
+  86, 77, 89, 69, 80, 82, 99, 68, 86, 80,
+  64, 77, 90, 76, 85, 113, 70, 80, 100, 79,
+  79, 79, 83, 76, 74, 71, 90, 75, 68, 90,
+  82, 83, 85, 84, 59, 72, 95, 87, 82, 61,
+  90, 72, 89, 73, 81, 73, 76, 73, 95, 90,
+  84, 76, 85, 81, 68, 74, 78, 76, 76, 82,
+  84, 107, 102, 72, 79, 84, 92, 81, 81, 79,
+  94, 85, 81, 71, 94, 75, 90, 89, 90, 68,
+  73, 80, 90, 87, 87, 78, 104, 93, 70, 85,
+  90, 83, 77, 85, 97, 85, 77, 83, 83, 68,
+  82, 84, 84, 76, 98, 98, 89, 91, 80, 84,
+  86, 90, 77, 89, 80, 81, 73, 84, 78, 80,
+  87, 70, 81, 75, 71, 102, 94, 81, 79, 79,
+  81, 80, 84, 85, 104, 80, 76, 98, 78, 84,
+  80, 83, 79, 87, 77, 76, 88, 86, 82, 77,
+  79, 85, 99, 76, 83, 84, 75, 74, 81, 87,
+  88, 81, 78, 78, 97, 90, 95, 79, 92, 86,
+  93, 85, 82, 77, 89, 87, 94, 89, 87, 78,
+  75, 84, 75, 86, 91, 73, 74, 88, 89, 95,
+  88, 84, 79, 83, 98, 87, 87, 79, 93, 82,
+  83, 83, 81, 95, 87, 77, 81, 93, 67, 91,
+  76, 93, 77, 75, 68, 89, 70, 83, 84, 96,
+  86, 120, 69, 87, 99, 87, 100, 86, 101, 87,
+  95, 66, 67, 86, 104, 70, 113, 97, 84, 77,
+  82, 84, 80, 85, 69, 72, 74, 85, 83, 83,
+  78, 79, 81, 75, 88, 90, 97, 69, 98, 54,
+  78, 77, 80, 63, 88, 49, 60, 70, 96, 83,
+  89, 87, 65, 107, 89, 98, 85, 73, 68, 120,
+  68, 95, 84, 71, 96, 120, 74, 78, 84, 79,
+  81, 80, 114, 70, 79, 72, 93, 69, 88, 78,
+  74, 83, 64, 62, 97, 90, 84, 78, 87, 71,
+  92, 76, 80, 82, 75, 85, 44, 123, 85, 83,
+  73, 79, 82, 86, 100, 80, 80, 74, 80, 118,
+  75, 71, 75, 92, 88, 95, 86, 72, 78, 77,
+  87, 83, 100, 111, 76, 71, 77, 77, 71, 91,
+  84, 68, 65, 86, 95, 71, 83, 79, 90, 73,
+  100, 90, 87, 105, 113, 88, 97, 83, 72, 73,
+  100, 95, 97, 76, 59, 80, 107, 90, 71, 78,
+  91, 79, 86, 73, 71, 86, 61, 63, 84, 110,
+  90, 66, 82, 92, 67, 71, 78, 102, 82, 83,
+  67, 112, 59, 84, 90, 59, 84, 113, 85, 76,
+  82, 81, 78, 77, 95, 88, 95, 101, 63, 73,
+  87, 86, 107, 84, 77, 98, 84, 72, 88, 60,
+  86, 98, 100, 94, 85, 73, 93, 88, 78, 64,
+  80, 92, 55, 83, 91, 140, 67, 99, 103, 70,
+  95, 78, 79, 60, 87, 76, 85, 66, 82, 83,
+  83, 95, 84, 75, 81, 77, 86, 78, 89, 92,
+  85, 86, 83, 80, 89, 79, 80, 83, 81, 70,
+  77, 86, 82, 70, 81, 79, 82, 89, 101, 97,
+  92, 91, 84, 82, 82, 88, 76, 67, 94, 80,
+  86, 86, 67, 78, 97, 94, 72, 77, 87, 80,
+  94, 78, 74, 90, 68, 89, 89, 93, 95, 85,
+  80, 95, 92, 78, 83, 92, 81, 74, 75, 85,
+  74, 93, 83, 66, 75, 85, 86, 77, 83, 89,
+  86, 77, 80, 92, 83, 84, 98, 74, 91, 87,
+  108, 91, 79, 96, 83, 85, 80, 78, 86, 101,
+  96, 89, 75, 80, 87, 88, 85, 77, 86, 86,
+  63, 83, 101, 97, 76, 94, 87, 87, 95, 80,
+  87, 78, 86, 78, 81, 85, 82, 91, 84, 83,
+  92, 85, 77, 96, 79, 90, 81, 85, 75, 92,
+  68, 86, 79, 101, 84, 93, 78, 94, 78, 88,
+  93, 94, 93, 87, 94, 63, 72, 92, 104, 75,
+  113, 89, 75, 87, 78, 89, 95, 83, 92, 80,
+  94, 94, 82, 78, 83, 74, 76, 92, 87, 98,
+  101, 79, 92, 71, 74, 76, 78, 76, 89, 65,
+  68, 83, 73, 86, 83, 79, 78, 91, 91, 90,
+  82, 77, 73, 96, 83, 90, 90, 78, 95, 88,
+  81, 77, 82, 73, 87, 87, 98, 74, 83, 76,
+  97, 78, 82, 78, 63, 92, 77, 75, 99, 87,
+  76, 74, 73, 83, 92, 73, 83, 81, 78, 75,
+  69, 111, 55, 86, 88, 81, 74, 84, 95, 86,
+  88, 82, 78, 99, 75, 74, 66, 90, 93, 72,
+  86, 82, 80, 82, 80, 93, 100, 84, 68, 78,
+  72, 79, 72, 84, 80, 78, 65, 91, 92, 76,
+  99, 84, 89, 79, 81, 92, 97, 98, 98, 75,
+  78, 87, 78, 79, 101, 80, 95, 79, 70, 95,
+  89, 78, 83, 78, 80, 84, 86, 83, 87, 102,
+  71, 76, 80, 86, 84, 78, 89, 89, 78, 82,
+  70, 82, 87, 83, 80, 87, 84, 83, 81, 70,
+  77, 82, 98, 77, 82, 87, 82, 68, 77, 88,
+  82, 91, 81, 77, 99, 83, 108, 86, 81, 87,
+  85, 73, 76, 83, 82, 91, 95, 89, 81, 83,
+  73, 89, 93, 64, 83, 88, 71, 76, 96, 105,
+  62, 93, 95, 92, 86, 77, 83, 76, 90, 84,
+  79, 72, 81, 75, 73, 87, 85, 76, 83, 80,
+  83, 86, 86, 96, 92, 75, 76, 77, 82, 76,
+  74, 87, 81, 73, 88, 83, 81, 76, 92, 82,
+  85, 94, 80, 92, 93, 87, 90, 73, 70, 78,
+  84, 72, 89, 73, 88, 91, 79, 89, 74, 73,
+  82, 73, 83, 81, 93, 85, 84, 105, 85, 86,
+  85, 86, 81, 84, 80, 83, 95, 80, 78, 81,
+  90, 76, 81, 80, 86, 82, 80, 78, 75, 79,
+  84, 79, 82, 89, 82, 79, 75, 90, 82, 83,
+  94, 87, 106, 82, 101, 81, 82, 82, 81, 81,
+  77, 83, 79, 87, 89, 88, 85, 87, 80, 81,
+  104, 76, 83, 83, 75, 82, 100, 72, 106, 88,
+  81, 105, 94, 86, 87, 86, 84, 86, 81, 81,
+  93, 64, 63, 81, 96, 86, 83, 93, 81, 83,
+  94, 79, 70, 85, 89, 89, 96, 82, 90, 79,
+  44, 75, 60, 94, 71, 83, 79, 88, 87, 80,
+  87, 80, 82, 105, 84, 89, 76, 78, 75, 78,
+  76, 60, 93, 77, 75, 77, 89, 100, 81, 85,
+  88, 77, 83, 90, 71, 85, 75, 91, 73, 84,
+  100, 80, 71, 89, 68, 84, 80, 77, 103, 55,
+  91, 67, 90, 86, 77, 72, 90, 77, 102, 84,
+  83, 91, 90, 78, 82, 87, 89, 85, 93, 84,
+  77, 101, 76, 83, 86, 78, 91, 102, 83, 84,
+  72, 86, 80, 85, 84, 88, 72, 77, 73, 88,
+  83, 88, 85, 86, 78, 74, 90, 83, 74, 72,
+  76, 91, 74, 83, 68, 88, 91, 89, 90, 72,
+  80, 78, 73, 87, 81, 76, 84, 89, 88, 88,
+  84, 82, 97, 79, 83, 95, 81, 80, 67, 86,
+  72, 94, 75, 83, 80, 88, 78, 71, 87, 83,
+  87, 94, 89, 83, 88, 84, 82, 79, 79, 94,
+  88, 86, 89, 75, 76, 94, 88, 91, 83, 78,
+  82, 82, 81, 85, 89, 82, 83, 77, 94, 81,
+  76, 106, 76, 116, 79, 84, 86, 75, 75, 84,
+  88, 85, 79, 75, 93, 85, 91, 96, 85, 84,
+  81, 74, 89, 77, 73, 85, 90, 82, 72, 90,
+  87, 77, 78, 88, 82, 90, 80, 90, 84, 85,
+  80, 87, 86, 85, 76, 86, 75, 86, 96, 86,
+  92, 85, 79, 90, 80, 86, 83, 82, 72, 88,
+  61, 82, 78, 80, 94, 94, 88, 74, 103, 84,
+  72, 98, 80, 69, 82, 91, 73, 82, 93, 74,
+  92, 83, 70, 101, 74, 80, 84, 80, 92, 93,
+  86, 87, 81, 86, 76, 77, 84, 86, 83, 97,
+  93, 81, 92, 82, 90, 75, 85, 100, 87, 90,
+  92, 81, 81, 99, 88, 95, 78, 83, 88, 77,
+  79, 82, 95, 79, 78, 80, 91, 81, 83, 100,
+  100, 95, 72, 88, 80, 95, 76, 87, 84, 87,
+  78, 87, 93, 88, 84, 84, 83, 82, 84, 82,
+  85, 69, 75, 93, 89, 81, 80, 97, 93, 73,
+  85, 89, 68, 73, 88, 87, 92, 80, 75, 84,
+  86, 78, 88, 90, 78, 93, 100, 92, 88, 84,
+  79, 92, 96, 92, 92, 87, 80, 89, 68, 79,
+  89, 85, 82, 89, 83, 73, 61, 85, 102, 75,
+  81, 92, 78, 81, 88, 78, 68, 87, 80, 98,
+  101, 76, 82, 83, 66, 85, 64, 96, 75, 71,
+  90, 86, 108, 80, 85, 86, 85, 104, 84, 85,
+  80, 76, 83, 70, 73, 51, 87, 88, 67, 103,
+  97, 98, 84, 78, 76, 93, 90, 89, 94, 89,
+  68, 85, 87, 84, 97, 76, 83, 80, 57, 55,
+  83, 79, 114, 63, 119, 61, 80, 92, 85, 78,
+  80, 79, 116, 65, 84, 92, 90, 79, 83, 86,
+  95, 86, 80, 86, 83, 107, 71, 79, 82, 67,
+  82, 86, 110, 87, 74, 102, 87, 84, 83, 81,
+  78, 76, 77, 73, 73, 91, 72, 88, 82, 79,
+  79, 85, 80, 70, 77, 88, 102, 83, 81, 92,
+  86, 76, 86, 72, 67, 86, 91, 72, 82, 95,
+  76, 89, 94, 82, 79, 89, 96, 86, 99, 86,
+  92, 79, 75, 84, 62, 93, 71, 85, 81, 89,
+  90, 67, 87, 82, 87, 94, 80, 86, 80, 84,
+  72, 79, 79, 74, 87, 80, 88, 79, 74, 95,
+  88, 83, 87, 84, 81, 91, 89, 71, 78, 87,
+  80, 77, 92, 81, 88, 80, 64, 89, 81, 83,
+  96, 71, 87, 70, 85, 89, 79, 72, 82, 81,
+  94, 93, 86, 86, 81, 75, 91, 75, 88, 85,
+  79, 92, 73, 89, 74, 92, 86, 86, 92, 94,
+  90, 84, 77, 98, 84, 85, 77, 71, 75, 78,
+  76, 81, 84, 81, 87, 89, 81, 85, 74, 84,
+  78, 72, 74, 89, 78, 90, 75, 77, 97, 88,
+  90, 65, 83, 79, 82, 78, 86, 87, 73, 86,
+  84, 80, 87, 87, 95, 74, 79, 93, 83, 74,
+  85, 82, 80, 96, 73, 89, 83, 87, 75, 75,
+  86, 79, 86, 94, 90, 77, 82, 82, 82, 82,
+  81, 100, 84, 83, 100, 78, 75, 95, 88, 90,
+  84, 84, 82, 88, 80, 77, 84, 86, 75, 75,
+  88, 89, 86, 96, 82, 103, 77, 86, 83, 78,
+  74, 81, 88, 82, 79, 78, 85, 75, 81, 99,
+  82, 84, 80, 78, 96, 62, 84, 86, 79, 85,
+  76, 98, 81, 86, 79, 88, 81, 95, 90, 90,
+  82, 92, 78, 87, 84, 72, 80, 85, 81, 86,
+  89, 88, 86, 85, 85, 87, 80, 89, 87, 78,
+  74, 86, 62, 87, 81, 75, 88, 89, 75, 79,
+  66, 83, 88, 76, 80, 78, 100, 79, 74, 87,
+  83, 89, 68, 96, 101, 76, 77, 91, 94, 93,
+  94, 91, 77, 69, 98, 71, 122, 73, 91, 85,
+  85, 101, 86, 83, 97, 88, 88, 68, 75, 60,
+  88, 99, 69, 122, 94, 110, 74, 86, 83, 103,
+  94, 78, 104, 106, 87, 67, 126, 93, 92, 72,
+  80, 58, 67, 47, 79, 97, 101, 80, 110, 80,
+  80, 92, 78, 85, 89, 85, 108, 70, 84, 84,
+  94, 83, 78, 96, 96, 84, 81, 84, 99, 101,
+  88, 76, 89, 75, 74, 84, 136, 93, 85, 87,
+  92, 84, 97, 93, 83, 87, 79, 68, 73, 86,
+  65, 94, 86, 97, 87, 105, 86, 78, 81, 88,
+  106, 70, 95, 88, 86, 75, 70, 74, 55, 84,
+  96, 75, 78, 88, 83, 80, 91, 86, 86, 85,
+  75, 91, 99, 84, 87, 88, 87, 79, 82, 89,
+  73, 78, 90, 82, 87, 62, 84, 84, 84, 95,
+  71, 94, 93, 78, 89, 80, 74, 71, 92, 82,
+  76, 90, 79, 104, 79, 79, 81, 86, 84, 96,
+  88, 89, 80, 73, 98, 87, 95, 72, 86, 47,
+  69, 61, 81, 80, 88, 77, 118, 77, 82, 92,
+  78, 77, 79, 84, 109, 91, 90, 82, 83, 75,
+  83, 87, 93, 86, 86, 85, 85, 92, 77, 79,
+  75, 80, 91, 83, 108, 81, 74, 102, 87, 81,
+  80, 81, 77, 81, 74, 69, 74, 77, 69, 100,
+  80, 91, 86, 85, 76, 74, 84, 86, 100, 75,
+  81, 86, 85, 78, 76, 62, 63, 84, 91, 68,
+  86, 93, 79, 82, 92, 87, 88, 91, 82, 87,
+  93, 91, 93, 81, 81, 79, 74, 97, 69, 83,
+  89, 86, 82, 58, 82, 84, 85, 95, 82, 79,
+  94, 82, 73, 100, 77, 83, 90, 76, 85, 75,
+  74, 94, 82, 87, 81, 83, 80, 103, 75, 81,
+  82, 79, 84, 82, 92, 83, 89, 66, 77, 84,
+  83, 80, 92, 84, 89, 74, 86, 86, 74, 74,
+  77, 73, 102, 97, 87, 81, 80, 74, 85, 76,
+  95, 85, 77, 89, 80, 106, 71, 83, 78, 88,
+  96, 94, 102, 84, 77, 96, 84, 83, 81, 65,
+  78, 84, 72, 77, 78, 78, 80, 97, 78, 86,
+  71, 88, 79, 72, 75, 89, 77, 85, 85, 83,
+  89, 83, 68, 51, 93, 76, 52, 75, 76, 76,
+  96, 80, 57, 101, 93, 76, 82, 66, 82, 71,
+  74, 90, 83, 91, 90, 81, 92, 85, 104, 94,
+  96, 95, 90, 76, 101, 88, 94, 98, 61, 78,
+  74, 67, 77, 85, 85, 52, 71, 53, 91, 77,
+  95, 108, 61, 66, 78, 82, 59, 71, 79, 66,
+  78, 99, 120, 98, 84, 94, 87, 47, 127, 166,
+  82, 74, 74, 123, 73, 79, 67, 75, 127, 80,
+  98, 85, 75, 68, 85, 114, 80, 92, 81, 93,
+  67, 75, 84, 94, 84, 100, 84, 62, 71, 103,
+  83, 83, 55, 85, 114, 86, 77, 70, 87, 60,
+  87, 82, 86, 84, 73, 89, 71, 89, 68, 74,
+  86, 72, 87, 133, 78, 74, 35, 84, 74, 114,
+  71, 66, 68, 82, 68, 72, 81, 77, 88, 85,
+  66, 96, 90, 68, 85, 72, 91, 77, 67, 85,
+  86, 82, 79, 85, 87, 86, 95, 91, 107, 96,
+  86, 85, 95, 88, 81, 101, 70, 80, 80, 66,
+  87, 94, 88, 60, 80, 69, 92, 96, 92, 97,
+  69, 57, 83, 83, 64, 73, 72, 73, 74, 94,
+  112, 90, 82, 87, 90, 52, 96, 153, 91, 71,
+  86, 121, 72, 79, 73, 73, 121, 66, 101, 79,
+  79, 68, 84, 95, 77, 88, 82, 91, 66, 73,
+  81, 104, 86, 99, 92, 71, 79, 102, 93, 73,
+  58, 113, 106, 91, 76, 73, 88, 68, 85, 69,
+  83, 85, 72, 86, 75, 89, 72, 74, 86, 67,
+  93, 105, 83, 73, 43, 84, 79, 95, 79, 89,
+  77, 80, 89, 105, 93, 87, 90, 83, 83, 81,
+  86, 77, 74, 86, 89, 100, 93, 83, 91, 76,
+  78, 91, 76, 88, 72, 91, 85, 81, 84, 79,
+  79, 78, 80, 96, 80, 78, 78, 81, 71, 86,
+  89, 97, 83, 86, 82, 68, 86, 82, 83, 92,
+  95, 86, 95, 83, 89, 71, 81, 70, 84, 85,
+  80, 64, 96, 75, 79, 72, 91, 78, 93, 77,
+  91, 80, 80, 88, 76, 83, 90, 106, 101, 86,
+  83, 85, 79, 74, 95, 76, 104, 74, 90, 83,
+  86, 85, 101, 92, 93, 71, 84, 85, 65, 74,
+  72, 82, 82, 80, 83, 86, 85, 95, 80, 76,
+  85, 83, 70, 83, 94, 86, 83, 83, 96, 86,
+  88, 94, 91, 87, 96, 82, 89, 64, 75, 82,
+  82, 75, 94, 86, 88, 84, 76, 80, 96, 77,
+  83, 72, 67, 77, 82, 83, 86, 105, 68, 91,
+  88, 77, 106, 88, 89, 81, 90, 85, 92, 94,
+  111, 90, 74, 81, 73, 81, 92, 84, 95, 72,
+  85, 72, 82, 67, 84, 82, 75, 86, 88, 88,
+  80, 81, 62, 78, 72, 79, 87, 94, 91, 95,
+  91, 62, 77, 110, 71, 70, 84, 110, 86, 77,
+  76, 77, 95, 80, 79, 76, 79, 72, 90, 84,
+  66, 86, 88, 82, 81, 88, 84, 79, 86, 74,
+  84, 73, 69, 94, 79, 86, 53, 84, 88, 80,
+  84, 72, 89, 81, 91, 70, 82, 79, 75, 86,
+  73, 80, 75, 75, 80, 84, 76, 82, 91, 75,
+  65, 83, 68, 79, 91, 79, 70, 85, 88, 67,
+  95, 83, 82, 87, 82, 78, 101, 74, 87, 79,
+  69, 85, 79, 80, 90, 103, 79, 92, 81, 78,
+  93, 87, 93, 109, 90, 84, 89, 79, 73, 87,
+  77, 79, 94, 85, 94, 85, 85, 79, 89, 76,
+  87, 75, 84, 77, 76, 82, 88, 88, 85, 70,
+  64, 83, 75, 74, 82, 82, 91, 84, 85, 71,
+  68, 89, 67, 78, 84, 103, 85, 78, 77, 73,
+  87, 71, 71, 71, 81, 78, 91, 90, 64, 93,
+  76, 82, 86, 86, 77, 74, 90, 75, 79, 74,
+  79, 88, 83, 82, 55, 72, 83, 85, 81, 74,
+  86, 88, 84, 66, 83, 83, 80, 80, 84, 89,
+  97, 75, 83, 81, 89, 66, 90, 75, 66, 85,
+  75, 74, 86, 88, 81, 76, 87, 88, 88, 87,
+  93, 81, 93, 76, 90, 78, 82, 80, 81, 91,
+  90, 85, 90, 84, 84, 84, 73, 87, 69, 84,
+  83, 85, 85, 81, 82, 77, 79, 90, 81, 93,
+  95, 81, 75, 81, 87, 97, 83, 80, 78, 76,
+  88, 78, 82, 86, 91, 93, 95, 91, 90, 78,
+  81, 81, 76, 79, 79, 72, 92, 80, 80, 72,
+  85, 78, 93, 80, 86, 81, 85, 84, 73, 82,
+  76, 94, 96, 97, 80, 81, 79, 82, 88, 77,
+  102, 84, 85, 72, 79, 82, 89, 92, 89, 75,
+  75, 85, 72, 66, 72, 80, 91, 79, 81, 95,
+  90, 86, 75, 81, 87, 78, 82, 84, 93, 85,
+  82, 78, 86, 79, 88, 88, 96, 84, 87, 77,
+  94, 88, 89, 75, 111, 91, 92, 86, 86, 83,
+  90, 78, 93, 78, 75, 83, 76, 84, 93, 101,
+  87, 104, 74, 93, 77, 78, 77, 87, 85, 70,
+  90, 89, 88, 93, 76, 73, 79, 90, 74, 93,
+  91, 68, 71, 100, 86, 89, 79, 82, 77, 71,
+  91, 110, 90, 93, 88, 94, 84, 92, 94, 69,
+  74, 80, 68, 85, 99, 90, 84, 82, 77, 83,
+  89, 58, 93, 79, 79, 88, 70, 73, 88, 78,
+  96, 95, 65, 76, 80, 91, 88, 70, 80, 90,
+  87, 83, 89, 78, 84, 80, 84, 78, 86, 88,
+  76, 97, 68, 76, 92, 100, 91, 90, 90, 89,
+  77, 75, 82, 89, 94, 78, 84, 84, 82, 84,
+  83, 81, 84, 90, 119, 92, 81, 71, 89, 96,
+  85, 75, 105, 75, 92, 86, 85, 85, 92, 78,
+  99, 83, 86, 86, 77, 88, 92, 96, 72, 103,
+  80, 92, 84, 78, 82, 85, 81, 90, 88, 92,
+  86, 80, 73, 78, 85, 87, 93, 98, 92, 73,
+  80, 95, 83, 84, 88, 68, 72, 77, 90, 105,
+  90, 91, 88, 81, 88, 91, 96, 77, 73, 83,
+  70, 86, 93, 98, 82, 77, 82, 90, 88, 63,
+  95, 75, 81, 84, 74, 81, 76, 72, 95, 96,
+  77, 92, 79, 94, 78, 69, 84, 91, 83, 79,
+  88, 82, 77, 79, 88, 77, 82, 87, 79, 95,
+  70, 79, 86, 93, 84, 88, 89, 90, 80, 76,
+  85, 84, 100, 82, 103, 84, 89, 83, 83, 82,
+  79, 88, 111, 93, 85, 77, 88, 92, 92, 78,
+  86, 83, 83, 87, 82, 89, 91, 76, 88, 87,
+  85, 82, 83, 84, 85, 90, 82, 80, 87, 91,
+  81, 86, 72, 80, 79, 92, 82, 88, 83, 77,
+  82, 79, 86, 89, 99, 74, 87, 76, 84, 96,
+  88, 88, 78, 76, 76, 75, 89, 90, 88, 85,
+  89, 93, 96, 92, 83, 87, 81, 79, 74, 85,
+  96, 85, 81, 84, 82, 86, 87, 71, 83, 81,
+  88, 85, 75, 82, 81, 90, 94, 101, 77, 79,
+  81, 91, 85, 72, 91, 96, 86, 79, 87, 85,
+  81, 92, 93, 80, 74, 78, 88, 82, 78, 76,
+  90, 80, 82, 82, 85, 91, 80, 77, 87, 81,
+  90, 83, 100, 90, 83, 84, 90, 77, 68, 98,
+  104, 85, 82, 84, 85, 89, 77, 84, 79, 95,
+  97, 78, 79, 81, 84, 78, 93, 86, 76, 96,
+  76, 100, 101, 94, 83, 102, 79, 74, 83, 102,
+  71, 80, 92, 78, 79, 86, 84, 84, 75, 81,
+  77, 94, 97, 92, 85, 79, 91, 83, 62, 94,
+  83, 83, 85, 83, 81, 80, 80, 77, 95, 76,
+  86, 74, 86, 88, 96, 82, 81, 84, 73, 82,
+  96, 83, 75, 85, 84, 91, 85, 68, 87, 93,
+  87, 76, 74, 86, 85, 83, 87, 80, 86, 100,
+  85, 72, 76, 80, 108, 97, 90, 92, 82, 86,
+  88, 73, 89, 89, 84, 71, 90, 80, 83, 86,
+  87, 86, 77, 85, 84, 79, 91, 90, 68, 99,
+  72, 86, 96, 91, 75, 78, 97, 73, 82, 81,
+  98, 77, 58, 92, 74, 79, 74, 79, 81, 83,
+  93, 81, 78, 82, 87, 74, 65, 97, 76, 99,
+  92, 96, 93, 81, 88, 76, 77, 89, 78, 80,
+  85, 69, 69, 86, 74, 87, 71, 82, 69, 100,
+  75, 74, 105, 61, 78, 87, 72, 94, 70, 72,
+  77, 82, 79, 81, 81, 68, 88, 63, 79, 60,
+  92, 89, 105, 79, 86, 75, 74, 62, 84, 82,
+  70, 105, 74, 73, 100, 74, 82, 95, 84, 84,
+  77, 62, 82, 88, 75, 90, 74, 98, 91, 66,
+  69, 80, 109, 114, 95, 82, 104, 74, 84, 80,
+  72, 90, 103, 87, 72, 83, 65, 83, 72, 86,
+  68, 91, 79, 76, 88, 92, 67, 86, 77, 75,
+  78, 84, 85, 76, 83, 66, 83, 85, 96, 70,
+  85, 82, 86, 78, 78, 77, 95, 84, 78, 85,
+  83, 78, 88, 91, 84, 96, 77, 98, 96, 101,
+  97, 97, 96, 77, 83, 103, 77, 80, 82, 72,
+  88, 85, 84, 93, 76, 85, 83, 99, 80, 92,
+  90, 85, 76, 85, 59, 93, 81, 80, 87, 82,
+  74, 84, 78, 73, 94, 73, 80, 73, 87, 85,
+  89, 77, 78, 84, 66, 86, 88, 79, 86, 75,
+  79, 83, 89, 74, 88, 90, 88, 81, 91, 86,
+  80, 83, 91, 83, 83, 92, 92, 81, 84, 79,
+  112, 86, 91, 90, 84, 84, 91, 79, 91, 94,
+  84, 84, 90, 80, 78, 82, 77, 84, 76, 83,
+  91, 79, 90, 84, 76, 90, 80, 83, 96, 88,
+  82, 75, 94, 74, 83, 83, 99, 84, 99, 78,
+  82, 87, 74, 80, 72, 73, 75, 83, 80, 70,
+  75, 77, 79, 92, 77, 83, 85, 100, 78, 96,
+  105, 78, 84, 80, 81, 84, 94, 71, 90, 87,
+  78, 67, 87, 80, 90, 80, 108, 66, 88, 81,
+  80, 84, 89, 88, 88, 71, 80, 79, 91, 91,
+  90, 67, 84, 102, 82, 85, 95, 79, 88, 83,
+  93, 73, 71, 61, 87, 76, 76, 81, 87, 94,
+  86, 92, 85, 70, 98, 95, 67, 81, 90, 69,
+  79, 88, 62, 87, 80, 86, 89, 77, 80, 93,
+  86, 75, 92, 80, 87, 78, 83, 74, 90, 70,
+  97, 82, 78, 83, 87, 80, 76, 83, 71, 93,
+  85, 87, 84, 103, 76, 76, 62, 89, 94, 80,
+  72, 83, 82, 77, 75, 81, 157, 85, 90, 92,
+  68, 72, 74, 69, 87, 85, 80, 82, 127, 115,
+  79, 76, 88, 62, 94, 76, 70, 135, 78, 74,
+  81, 67, 88, 89, 95, 77, 111, 97, 83, 71,
+  93, 68, 106, 60, 123, 68, 68, 106, 82, 93,
+  113, 51, 96, 81, 67, 83, 97, 141, 89, 69,
+  96, 124, 58, 101, 113, 61, 98, 57, 103, 88,
+  42, 107, 76, 65, 66, 58, 88, 88, 47, 88,
+  82, 52, 105, 84, 72, 86, 93, 77, 78, 75,
+  60, 64, 71, 102, 139, 67, 58, 76, 89, 60,
+  69, 71, 105, 90, 89, 82, 86, 102, 113, 84,
+  79, 77, 71, 85, 92, 84, 96, 81, 98, 76,
+  109, 112, 62, 74, 64, 77, 97, 75, 72, 95,
+  101, 60, 75, 100, 87, 74, 82, 88, 79, 105,
+  71, 78, 81, 85, 76, 72, 68, 101, 78, 94,
+  82, 82, 80, 94, 82, 89, 89, 81, 75, 83,
+  84, 82, 87, 80, 95, 91, 76, 90, 80, 85,
+  99, 81, 70, 73, 93, 88, 81, 87, 86, 87,
+  84, 96, 85, 78, 88, 81, 93, 68, 92, 77,
+  75, 82, 90, 78, 85, 89, 95, 71, 64, 58,
+  73, 73, 84, 66, 75, 88, 83, 94, 86, 73,
+  88, 69, 85, 83, 88, 71, 84, 104, 65, 75,
+  91, 81, 91, 84, 81, 102, 91, 75, 89, 82,
+  90, 80, 81, 78, 89, 105, 92, 83, 78, 73,
+  78, 83, 77, 89, 83, 96, 85, 89, 87, 87,
+  86, 79, 67, 87, 79, 76, 80, 81, 83, 78,
+  81, 83, 88, 89, 81, 88, 70, 85, 80, 79,
+  82, 85, 76, 76, 74, 87, 82, 89, 82, 84,
+  85, 98, 69, 98, 85, 80, 83, 87, 98, 90,
+  91, 81, 92, 87, 73, 78, 101, 82, 74, 95,
+  73, 76, 92, 98, 84, 80, 75, 92, 88, 76,
+  81, 79, 108, 83, 90, 73, 77, 53, 83, 77,
+  87, 86, 74, 100, 91, 78, 83, 68, 82, 82,
+  91, 67, 78, 97, 93, 90, 87, 76, 95, 90,
+  86, 81, 87, 74, 84, 81, 70, 87, 89, 91,
+  84, 80, 89, 90, 82, 69, 93, 79, 73, 67,
+  70, 83, 85, 79, 88, 82, 86, 101, 91, 84,
+  67, 77, 85, 85, 76, 96, 87, 103, 71, 75,
+  78, 84, 83, 80, 86, 78, 84, 85, 75, 71,
+  111, 91, 84, 99, 63, 73, 77, 80, 99, 84,
+  84, 87, 120, 101, 81, 81, 98, 72, 87, 84,
+  73, 105, 78, 81, 73, 72, 112, 90, 88, 97,
+  75, 90, 87, 75, 97, 81, 81, 86, 106, 70,
+  92, 105, 76, 77, 83, 66, 82, 79, 76, 86,
+  114, 96, 95, 70, 69, 91, 67, 73, 90, 74,
+  66, 88, 98, 86, 72, 94, 83, 58, 93, 61,
+  84, 91, 83, 91, 69, 58, 88, 86, 83, 89,
+  91, 79, 83, 83, 74, 90, 84, 91, 97, 59,
+  66, 86, 86, 55, 85, 82, 80, 73, 76, 92,
+  85, 83, 93, 81, 66, 101, 80, 88, 61, 72,
+  80, 56, 75, 84, 76, 99, 86, 71, 70, 80,
+  79, 78, 89, 88, 90, 79, 63, 76, 79, 79,
+  67, 88, 77, 88, 84, 81, 92, 90, 76, 82,
+  82, 87, 78, 98, 84, 90, 88, 93, 89, 85,
+  89, 80, 74, 91, 96, 92, 86, 102, 85, 84,
+  73, 87, 85, 91, 82, 94, 87, 79, 94, 90,
+  78, 84, 78, 81, 80, 87, 86, 82, 99, 82,
+  97, 76, 86, 92, 83, 81, 84, 86, 76, 99,
+  98, 76, 74, 76, 86, 83, 88, 74, 72, 99,
+  94, 96, 80, 82, 85, 66, 85, 76, 87, 75,
+  84, 103, 76, 86, 90, 78, 78, 82, 90, 92,
+  85, 68, 87, 80, 80, 69, 93, 81, 85, 93,
+  94, 82, 86, 99, 79, 83, 64, 78, 66, 89,
+  78, 89, 71, 86, 104, 79, 76, 87, 84, 84,
+  92, 79, 80, 88, 83, 70, 86, 79, 81, 71,
+  83, 89, 98, 92, 78, 85, 86, 87, 88, 71,
+  78, 75, 79, 79, 74, 90, 78, 98, 91, 76,
+  74, 99, 89, 83, 91, 87, 90, 84, 82, 84,
+  78, 88, 92, 87, 78, 83, 85, 70, 92, 76,
+  83, 79, 81, 83, 81, 78, 101, 83, 83, 81,
+  80, 74, 101, 83, 78, 108, 91, 81, 77, 78,
+  92, 84, 83, 79, 71, 85, 83, 82, 89, 76,
+  71, 80, 85, 84, 88, 87, 87, 124, 81, 81,
+  79, 81, 81, 90, 79, 80, 83, 80, 76, 71,
+  81, 75, 80, 92, 82, 81, 102, 88, 75, 79,
+  84, 78, 100, 93, 82, 84, 76, 69, 81, 87,
+  84, 73, 90, 75, 80, 83, 95, 84, 78, 77,
+  79, 86, 78, 78, 82, 83, 71, 75, 86, 80,
+  94, 83, 78, 84, 88, 93, 82, 76, 75, 75,
+  80, 80, 79, 86, 81, 92, 85, 76, 76, 93,
+  87, 85, 87, 88, 87, 86, 79, 83, 79, 88,
+  89, 83, 73, 82, 86, 69, 84, 77, 84, 79,
+  84, 80, 83, 76, 98, 76, 79, 82, 79, 76,
+  103, 84, 72, 103, 90, 87, 80, 75, 91, 82,
+  83, 81, 73, 87, 80, 80, 88, 73, 74, 78,
+  87, 82, 92, 84, 88, 125, 81, 81, 83, 76,
+  82, 89, 82, 83, 83, 83, 73, 68, 84, 76,
+  79, 91, 80, 81, 103, 83, 76, 82, 85, 76,
+  102, 94, 86, 84, 76, 67, 85, 83, 81, 72,
+  81, 76, 80, 82, 84, 82, 73, 77, 77, 83,
+  76, 76, 92, 89, 78, 77, 91, 83, 91, 84,
+  82, 87, 86, 83, 88, 79, 80, 81, 79, 83,
+  75, 89, 86, 97, 89, 79, 75, 102, 91, 84,
+  83, 85, 89, 87, 82, 85, 85, 91, 87, 87,
+  76, 79, 85, 71, 79, 72, 80, 78, 83, 85,
+  85, 79, 101, 83, 81, 83, 83, 81, 99, 91,
+  83, 100, 92, 84, 77, 76, 93, 85, 87, 78,
+  76, 86, 89, 85, 86, 79, 75, 80, 86, 86,
+  90, 88, 89, 102, 79, 88, 85, 82, 89, 98,
+  80, 85, 83, 90, 81, 76, 84, 75, 84, 88,
+  77, 79, 101, 82, 79, 79, 85, 83, 99, 94,
+  85, 88, 77, 75, 80, 83, 87, 77, 79, 80,
+  84, 86, 81, 84, 78, 81, 74, 84, 80, 82,
+  81, 84, 80, 74, 67, 90, 115, 94, 65, 87,
+  88, 84, 88, 75, 84, 81, 87, 74, 84, 89,
+  74, 88, 87, 69, 85, 96, 84, 88, 95, 95,
+  88, 84, 88, 88, 82, 80, 91, 88, 81, 75,
+  78, 75, 87, 88, 85, 84, 86, 89, 76, 73,
+  100, 71, 78, 80, 69, 75, 91, 76, 71, 121,
+  89, 78, 86, 79, 82, 79, 79, 78, 81, 77,
+  88, 75, 103, 80, 74, 77, 80, 80, 91, 101,
+  82, 171, 84, 71, 87, 78, 81, 88, 70, 70,
+  83, 83, 76, 67, 84, 87, 79, 85, 88, 91,
+  84, 91, 72, 83, 82, 77, 90, 85, 74, 78,
+  85, 70, 95, 87, 67, 63, 85, 84, 83, 82,
+  90, 74, 85, 70, 78, 81, 78, 73, 75, 87,
+  74, 78, 69, 79, 116, 83, 62, 86, 90, 87,
+  81, 79, 81, 85, 90, 75, 86, 86, 78, 84,
+  81, 70, 93, 90, 83, 91, 97, 92, 89, 84,
+  89, 85, 86, 80, 84, 86, 77, 70, 78, 75,
+  80, 85, 87, 82, 94, 84, 80, 71, 100, 67,
+  77, 79, 65, 75, 91, 73, 64, 127, 86, 80,
+  88, 73, 79, 77, 81, 81, 85, 75, 79, 75,
+  99, 76, 80, 78, 81, 85, 92, 96, 82, 180,
+  90, 75, 95, 76, 82, 84, 75, 73, 88, 77,
+  71, 67, 83, 89, 77, 83, 88, 91, 84, 74,
+  72, 86, 81, 72, 92, 86, 82, 75, 84, 66,
+  103, 80, 65, 64, 75, 87, 83, 82, 79, 75,
+  83, 70, 75, 78, 75, 72, 89, 89, 85, 79,
+  75, 86, 105, 83, 67, 89, 85, 81, 87, 82,
+  85, 87, 88, 77, 87, 84, 84, 92, 91, 77,
+  84, 96, 86, 88, 86, 85, 90, 85, 89, 82,
+  99, 86, 85, 87, 75, 73, 83, 77, 76, 80,
+  86, 83, 88, 80, 80, 75, 103, 76, 76, 79,
+  75, 80, 89, 84, 79, 106, 87, 81, 88, 75,
+  83, 82, 84, 75, 83, 85, 82, 78, 96, 80,
+  75, 76, 81, 92, 92, 100, 86, 142, 83, 84,
+  91, 83, 89, 90, 75, 79, 85, 81, 81, 69,
+  84, 86, 84, 82, 84, 89, 85, 69, 75, 82,
+  85, 83, 91, 87, 77, 84, 85, 75, 93, 81,
+  76, 75, 79, 85, 84, 87, 79, 77, 82, 74,
+  75, 80, 80, 79, 82, 77, 81, 82, 74, 90,
+  109, 96, 70, 89, 89, 78, 93, 72, 82, 83,
+  89, 72, 87, 88, 75, 90, 88, 76, 84, 91,
+  92, 89, 91, 92, 86, 77, 85, 87, 80, 79,
+  85, 90, 78, 80, 83, 74, 83, 84, 84, 88,
+  80, 87, 73, 75, 95, 74, 73, 80, 72, 76,
+  82, 79, 85, 107, 80, 78, 85, 78, 87, 84,
+  78, 73, 76, 84, 93, 80, 105, 85, 73, 77,
+  77, 82, 79, 98, 76, 139, 83, 74, 84, 81,
+  81, 91, 74, 71, 74, 89, 80, 70, 91, 83,
+  78, 82, 75, 90, 82, 94, 69, 84, 87, 83,
+  93, 76, 73, 83, 92, 76, 87, 89, 68, 68,
+  85, 84, 80, 78, 83, 79, 83, 74, 78, 89,
+  78, 80, 73, 80, 75, 83, 75, 82, 108, 90,
+  67, 89, 93, 81, 84, 79, 84, 88, 93, 72,
+  87, 83, 80, 86, 83, 76, 87, 85, 89, 92,
+  94, 85, 87, 78, 87, 87, 84, 77, 77, 92,
+  74, 76, 83, 72, 77, 86, 84, 86, 82, 85,
+  74, 74, 97, 72, 68, 80, 66, 78, 83, 76,
+  78, 109, 74, 78, 84, 74, 86, 79, 83, 74,
+  84, 84, 83, 79, 103, 84, 77, 81, 77, 85,
+  74, 96, 75, 150, 86, 78, 87, 81, 80, 87,
+  80, 72, 80, 85, 74, 73, 94, 87, 74, 82,
+  77, 91, 81, 81, 69, 85, 86, 81, 96, 77,
+  74, 79, 93, 70, 94, 81, 64, 75, 80, 84,
+  78, 74, 74, 80, 83, 74, 76, 86, 76, 77,
+  92, 85, 86, 84, 78, 89, 101, 87, 72, 90,
+  85, 79, 91, 85, 83, 87, 90, 71, 87, 84,
+  86, 96, 91, 80, 77, 89, 90, 87, 83, 78,
+  91, 81, 87, 83, 96, 88, 83, 91, 75, 78,
+  87, 75, 78, 80, 85, 86, 80, 83, 78, 77,
+  99, 80, 70, 81, 78, 81, 83, 87, 90, 96,
+  80, 81, 88, 76, 89, 87, 81, 75, 80, 91,
+  82, 79, 94, 83, 71, 78, 79, 88, 82, 98,
+  79, 119, 84, 83, 86, 87, 87, 91, 76, 76,
+  75, 80, 84, 72, 91, 81, 82, 80, 78, 87,
+  83, 73, 74, 82, 88, 88, 92, 80, 76, 83,
+  95, 80, 83, 81, 80, 82, 86, 85, 81, 83,
+  81, 82, 81, 75, 76, 90, 80, 85, 79, 83,
+  99, 85, 77, 94, 79, 72, 84, 100, 83, 80,
+  79, 72, 89, 92, 79, 96, 67, 82, 76, 85,
+  85, 97, 81, 77, 80, 78, 87, 91, 85, 92,
+  75, 86, 95, 94, 95, 88, 81, 93, 74, 91,
+  78, 76, 84, 69, 86, 67, 64, 84, 82, 78,
+  101, 76, 83, 83, 87, 86, 62, 97, 88, 96,
+  78, 83, 94, 83, 80, 82, 86, 92, 80, 93,
+  88, 93, 85, 87, 95, 97, 78, 86, 91, 84,
+  76, 85, 66, 90, 85, 69, 86, 76, 80, 84,
+  104, 90, 81, 77, 86, 75, 80, 78, 78, 97,
+  85, 87, 87, 91, 78, 85, 69, 109, 76, 93,
+  78, 88, 86, 91, 77, 68, 91, 85, 85, 85,
+  67, 81, 77, 98, 84, 79, 87, 79, 89, 89,
+  80, 85, 87, 70, 79, 108, 79, 78, 90, 76,
+  92, 81, 84, 103, 66, 72, 82, 78, 77, 93,
+  84, 81, 78, 71, 102, 89, 93, 83, 68, 91,
+  96, 82, 89, 81, 76, 95, 72, 96, 79, 83,
+  81, 74, 103, 77, 62, 83, 78, 79, 109, 68,
+  83, 84, 87, 81, 63, 94, 91, 96, 75, 94,
+  83, 79, 80, 84, 87, 90, 87, 93, 82, 90,
+  88, 83, 90, 87, 83, 84, 87, 84, 79, 78,
+  70, 78, 86, 76, 74, 89, 69, 80, 95, 97,
+  83, 84, 79, 73, 91, 65, 73, 89, 81, 85,
+  75, 86, 84, 82, 66, 102, 73, 95, 85, 88,
+  80, 92, 83, 73, 94, 75, 83, 86, 67, 85,
+  81, 105, 81, 72, 76, 75, 80, 90, 84, 88,
+  82, 72, 91, 100, 87, 77, 84, 79, 83, 91,
+  82, 97, 72, 77, 78, 83, 88, 96, 79, 75,
+  74, 83, 85, 91, 90, 82, 73, 95, 96, 79,
+  96, 93, 72, 90, 79, 93, 78, 78, 87, 76,
+  89, 94, 64, 81, 84, 80, 102, 82, 81, 86,
+  89, 82, 63, 98, 84, 93, 79, 85, 92, 82,
+  80, 86, 87, 88, 81, 93, 89, 85, 87, 93,
+  100, 88, 84, 85, 87, 83, 71, 76, 68, 80,
+  86, 77, 85, 76, 77, 94, 100, 96, 95, 79,
+  87, 75, 80, 76, 82, 92, 82, 85, 86, 91,
+  76, 88, 68, 97, 74, 92, 78, 93, 81, 88,
+  90, 69, 90, 81, 80, 85, 70, 82, 81, 93,
+  83, 82, 86, 79, 89, 73, 80, 94, 88, 76,
+  81, 96, 83, 77, 81, 76, 91, 90, 82, 91,
+  52, 82, 72, 79, 80, 97, 79, 85, 75, 69,
+  103, 88, 94, 94, 68, 91, 90, 98, 91, 73,
+  80, 83, 77, 88, 91, 77, 82, 71, 79, 72,
+  66, 73, 79, 80, 100, 70, 88, 80, 92, 86,
+  71, 105, 87, 92, 85, 79, 89, 71, 81, 82,
+  72, 89, 86, 93, 93, 95, 84, 89, 79, 83,
+  77, 81, 88, 83, 73, 88, 74, 90, 91, 74,
+  80, 77, 75, 84, 108, 95, 74, 83, 81, 79,
+  73, 63, 68, 98, 83, 93, 70, 86, 79, 86,
+  85, 115, 80, 84, 84, 81, 85, 88, 75, 67,
+  97, 80, 83, 82, 68, 93, 74, 88, 84, 69,
+  93, 79, 68, 75, 79, 74, 95, 73, 83, 108,
+  83, 77, 92, 75, 104, 91, 93, 96, 48, 70,
+  83, 69, 82, 92, 88, 87, 70, 66, 112, 91,
+  101, 78, 71, 91, 94, 82, 79, 63, 75, 93,
+  72, 86, 80, 76, 79, 68, 98, 72, 60, 84,
+  75, 73, 104, 64, 85, 73, 90, 88, 72, 110,
+  86, 88, 82, 93, 75, 71, 86, 96, 68, 78,
+  72, 99, 98, 96, 84, 94, 78, 81, 75, 81,
+  95, 81, 69, 84, 71, 84, 84, 78, 73, 95,
+  67, 75, 98, 91, 78, 87, 73, 78, 93, 47,
+  66, 85, 77, 91, 55, 80, 90, 80, 84, 134,
+  79, 89, 93, 85, 68, 92, 79, 68, 107, 70,
+  84, 82, 76, 109, 81, 89, 83, 69, 88, 76,
+  76, 79, 82, 75, 87, 73, 86, 96, 84, 75,
+  80, 86, 90, 92, 85, 89, 57, 80, 90, 79,
+  94, 92, 77, 80, 71, 74, 99, 97, 91, 82,
+  67, 88, 93, 86, 85, 78, 80, 85, 81, 86,
+  69, 78, 81, 73, 82, 85, 67, 71, 83, 80,
+  95, 74, 83, 83, 93, 83, 74, 103, 80, 92,
+  92, 79, 97, 76, 84, 92, 75, 88, 86, 92,
+  94, 82, 85, 89, 86, 92, 82, 81, 81, 78,
+  74, 80, 77, 86, 83, 80, 80, 81, 72, 81,
+  93, 95, 88, 86, 81, 80, 86, 63, 74, 88,
+  81, 90, 68, 91, 77, 89, 82, 104, 80, 89,
+  84, 99, 78, 90, 98, 67, 96, 77, 80, 81,
+  66, 86, 81, 87, 84, 72, 81, 84, 78, 70,
+  95, 91, 81, 74, 83, 89, 85, 78, 87, 81,
+  83, 83, 76, 90, 70, 86, 75, 85, 80, 102,
+  84, 83, 84, 73, 84, 89, 84, 95, 73, 90,
+  92, 93, 91, 70, 76, 91, 91, 79, 100, 83,
+  80, 80, 82, 76, 70, 82, 74, 82, 100, 79,
+  84, 86, 95, 80, 67, 93, 87, 99, 92, 84,
+  90, 78, 86, 81, 69, 84, 86, 87, 100, 102,
+  88, 83, 86, 85, 93, 74, 89, 83, 80, 88,
+  70, 88, 88, 76, 94, 78, 76, 91, 97, 94,
+  71, 89, 90, 73, 72, 66, 74, 98, 91, 90,
+  81, 80, 83, 93, 96, 112, 86, 93, 78, 78,
+  76, 89, 81, 67, 91, 92, 81, 82, 67, 88,
+  78, 91, 86, 82, 95, 79, 70, 67, 86, 75,
+  81, 69, 82, 100, 83, 74, 91, 78, 92, 85,
+  76, 90, 57, 79, 82, 77, 82, 97, 83, 84,
+  76, 69, 94, 95, 89, 89, 74, 93, 85, 84,
+  83, 57, 77, 94, 101, 76, 94, 80, 86, 72,
+  84, 79, 70, 87, 72, 78, 101, 71, 79, 83,
+  89, 82, 70, 99, 83, 88, 97, 95, 82, 77,
+  86, 85, 62, 82, 79, 94, 100, 107, 85, 86,
+  85, 83, 85, 70, 99, 76, 72, 85, 72, 88,
+  84, 82, 84, 86, 70, 80, 104, 89, 74, 90,
+  82, 75, 82, 52, 71, 98, 89, 89, 74, 79,
+  85, 84, 88, 123, 93, 94, 82, 83, 74, 87,
+  91, 72, 93, 83, 82, 82, 67, 100, 81, 90,
+  82, 75, 88, 76, 70, 74, 89, 82, 78, 71,
+  87, 91, 85, 78, 86, 80, 81, 84, 72, 86,
+  74, 86, 89, 85, 95, 99, 77, 74, 75, 75,
+  79, 104, 88, 97, 73, 84, 84, 84, 83, 69,
+  86, 92, 101, 77, 70, 80, 79, 79, 83, 89,
+  70, 83, 79, 91, 94, 83, 79, 78, 90, 81,
+  73, 88, 79, 98, 96, 85, 94, 82, 89, 87,
+  68, 84, 78, 86, 93, 93, 87, 87, 89, 87,
+  89, 70, 88, 78, 80, 77, 74, 89, 79, 85,
+  96, 81, 76, 78, 94, 86, 84, 82, 89, 72,
+  81, 66, 74, 98, 90, 87, 77, 85, 76, 94,
+  91, 107, 92, 88, 78, 91, 85, 90, 101, 65,
+  89, 87, 91, 84, 66, 83, 85, 90, 86, 82,
+  84, 82, 84, 79, 93, 86, 91, 77, 72, 83,
+  74, 104, 81, 92, 88, 94, 89, 75, 80, 86,
+  92, 74, 78, 85, 95, 73, 102, 75, 105, 86,
+  95, 69, 77, 95, 85, 99, 82, 69, 92, 87,
+  82, 76, 78, 88, 78, 97, 78, 80, 86, 79,
+  78, 75, 91, 76, 95, 94, 77, 77, 76, 91,
+  89, 90, 105, 75, 73, 67, 85, 83, 87, 75,
+  93, 81, 83, 92, 86, 67, 82, 83, 89, 74,
+  93, 90, 97, 76, 75, 112, 88, 75, 83, 87,
+  78, 84, 79, 97, 76, 74, 85, 82, 74, 84,
+  57, 92, 75, 72, 86, 72, 84, 80, 84, 68,
+  86, 94, 72, 81, 89, 94, 73, 90, 79, 76,
+  99, 77, 74, 68, 77, 77, 77, 89, 72, 83,
+  59, 81, 98, 77, 86, 68, 66, 76, 72, 88,
+  76, 103, 88, 95, 83, 84, 74, 76, 86, 71,
+  70, 82, 98, 80, 87, 67, 101, 92, 96, 68,
+  82, 98, 90, 76, 81, 68, 78, 92, 82, 73,
+  88, 89, 84, 86, 75, 87, 83, 84, 83, 82,
+  95, 95, 91, 86, 77, 74, 84, 92, 93, 93,
+  96, 81, 69, 74, 86, 87, 90, 68, 74, 65,
+  82, 81, 88, 76, 79, 82, 89, 78, 91, 94,
+  95, 68, 85, 110, 92, 69, 90, 94, 81, 85,
+  74, 103, 72, 84, 86, 94, 76, 87, 61, 82,
+  63, 74, 87, 71, 80, 75, 88, 75, 91, 89,
+  70, 80, 82, 78, 75, 87, 72, 83, 99, 75,
+  67, 58, 78, 67, 74, 93, 75, 84, 71, 95,
+  87, 80, 83, 70, 77, 79, 76, 94, 77, 101,
+  86, 88, 92, 85, 78, 80, 80, 83, 74, 74,
+  99, 84, 89, 73, 93, 94, 96, 76, 90, 91,
+  88, 74, 86, 82, 75, 86, 86, 90, 79, 96,
+  85, 81, 74, 100, 78, 84, 84, 84, 98, 98,
+  98, 82, 78, 75, 92, 79, 90, 90, 93, 76,
+  81, 82, 91, 87, 92, 83, 77, 72, 81, 76,
+  91, 74, 86, 76, 75, 82, 95, 92, 91, 76,
+  86, 107, 96, 80, 82, 91, 83, 88, 77, 104,
+  75, 89, 94, 94, 87, 97, 67, 82, 70, 77,
+  90, 78, 83, 81, 87, 72, 88, 89, 71, 74,
+  89, 79, 88, 84, 77, 76, 98, 78, 73, 63,
+  81, 63, 77, 92, 87, 85, 87, 84, 84, 86,
+  69, 86, 83, 94, 80, 97, 81, 69, 67, 89,
+  90, 77, 92, 97, 85, 80, 81, 85, 74, 67,
+  107, 95, 100, 78, 98, 74, 73, 88, 80, 100,
+  79, 71, 83, 77, 87, 69, 71, 73, 71, 90,
+  76, 85, 97, 79, 79, 73, 81, 72, 97, 88,
+  81, 76, 77, 87, 77, 88, 94, 76, 78, 67,
+  89, 85, 75, 93, 77, 78, 84, 99, 93, 83,
+  89, 78, 84, 68, 83, 77, 81, 81, 69, 92,
+  85, 80, 69, 74, 79, 92, 76, 88, 82, 73,
+  88, 76, 74, 84, 62, 122, 86, 79, 94, 85,
+  87, 91, 78, 74, 70, 81, 94, 86, 104, 96,
+  83, 96, 91, 63, 86, 84, 67, 91, 83, 92,
+  80, 85, 80, 86, 62, 76, 92, 79, 65, 73,
+  62, 82, 76, 85, 84, 78, 80, 95, 81, 78,
+  82, 81, 87, 66, 66, 86, 83, 65, 109, 78,
+  104, 76, 104, 71, 72, 88, 82, 92, 73, 61,
+  79, 80, 82, 64, 98, 76, 71, 107, 71, 86,
+  93, 80, 81, 74, 87, 74, 85, 96, 77, 71,
+  77, 87, 74, 92, 87, 75, 75, 60, 98, 81,
+  74, 67, 89, 68, 81, 104, 83, 73, 82, 85,
+  91, 75, 87, 87, 99, 75, 72, 95, 90, 64,
+  76, 82, 67, 89, 67, 105, 75, 74, 75, 80,
+  69, 81, 56, 110, 73, 77, 92, 79, 79, 78,
+  74, 75, 80, 89, 85, 82, 89, 88, 73, 87,
+  80, 73, 85, 86, 64, 71, 79, 91, 75, 87,
+  74, 86, 64, 89, 82, 74, 72, 69, 70, 83,
+  79, 86, 86, 91, 79, 100, 80, 83, 89, 83,
+  88, 76, 80, 91, 97, 72, 109, 76, 90, 85,
+  102, 73, 86, 93, 83, 88, 70, 69, 77, 82,
+  79, 76, 91, 84, 76, 90, 72, 89, 91, 86,
+  87, 77, 99, 80, 81, 86, 78, 73, 77, 85,
+  78, 89, 84, 74, 79, 65, 116, 79, 75, 78,
+  71, 72, 79, 89, 83, 75, 85, 90, 86, 81,
+  94, 91, 105, 89, 81, 93, 95, 71, 77, 90,
+  75, 82, 74, 107, 71, 79, 80, 80, 70, 87,
+  60, 80, 66, 79, 91, 75, 77, 82, 80, 79,
+  79, 93, 80, 85, 91, 87, 93, 82, 74, 72,
+  78, 82, 63, 62, 82, 85, 76, 89, 85, 88,
+  92, 79, 64, 87, 77, 90, 93, 77, 91, 90,
+  90, 61, 60, 70, 83, 86, 110, 97, 75, 97,
+  96, 82, 72, 83, 86, 106, 79, 78, 83, 86,
+  83, 79, 88, 106, 83, 84, 82, 87, 99, 72,
+  74, 86, 78, 87, 79, 77, 92, 81, 96, 84,
+  79, 78, 94, 77, 90, 94, 80, 84, 64, 72,
+  93, 85, 87, 98, 75, 94, 85, 97, 71, 92,
+  91, 87, 96, 102, 73, 77, 81, 79, 71, 86,
+  64, 94, 92, 95, 90, 97, 84, 75, 98, 79,
+  92, 74, 86, 79, 86, 90, 76, 80, 86, 92,
+  76, 85, 92, 93, 102, 105, 92, 103, 75, 76,
+  101, 79, 86, 91, 111, 94, 83, 76, 90, 87,
+  83, 99, 112, 73, 79, 89, 91, 95, 89, 74,
+  74, 87, 72, 88, 82, 82, 92, 87, 86, 74,
+  67, 77, 86, 84, 104, 93, 83, 101, 92, 80,
+  66, 67, 90, 100, 95, 83, 92, 98, 78, 80,
+  84, 121, 76, 84, 71, 82, 98, 60, 94, 82,
+  78, 93, 73, 87, 84, 75, 91, 79, 82, 82,
+  88, 83, 94, 91, 74, 76, 67, 83, 87, 87,
+  83, 95, 76, 92, 75, 78, 87, 88, 92, 100,
+  84, 99, 79, 87, 82, 69, 76, 80, 75, 91,
+  88, 103, 86, 89, 77, 74, 86, 71, 83, 83,
+  86, 90, 85, 93, 66, 79, 73, 111, 95, 78,
+  95, 85, 102, 94, 78, 93, 82, 83, 101, 78,
+  83, 94, 103, 95, 92, 91, 89, 92, 77, 94,
+  103, 74, 91, 83, 92, 97, 76, 84, 77, 83,
+  77, 76, 75, 81, 88, 79, 97, 78, 71, 81,
+  78, 78, 102, 90, 86, 96, 88, 92, 83, 71,
+  97, 85, 85, 89, 91, 91, 83, 89, 83, 114,
+  70, 82, 80, 91, 84, 66, 94, 81, 72, 95,
+  73, 89, 90, 83, 92, 80, 95, 81, 81, 90,
+  99, 83, 73, 79, 74, 84, 88, 88, 86, 92,
+  91, 82, 78, 79, 89, 92, 93, 97, 77, 94,
+  83, 85, 85, 74, 85, 80, 89, 103, 90, 99,
+  88, 86, 81, 86, 79, 74, 79, 99, 81, 87,
+  79, 88, 67, 82, 70, 100, 77, 77, 92, 89,
+  83, 92, 76, 96, 77, 93, 87, 86, 80, 91,
+  102, 86, 88, 87, 84, 92, 76, 73, 97, 80,
+  89, 76, 69, 101, 71, 96, 91, 77, 77, 75,
+  94, 84, 92, 86, 76, 96, 81, 100, 77, 85,
+  107, 86, 81, 81, 96, 91, 85, 75, 86, 87,
+  85, 77, 86, 101, 92, 90, 77, 80, 83, 88,
+  84, 64, 95, 74, 88, 94, 86, 95, 84, 83,
+  74, 80, 82, 80, 84, 102, 95, 87, 90, 75,
+  80, 92, 94, 94, 89, 83, 76, 79, 75, 86,
+  81, 90, 83, 72, 87, 90, 73, 95, 102, 74,
+  92, 82, 93, 90, 84, 97, 72, 83, 100, 74,
+  74, 89, 78, 100, 85, 72, 82, 87, 97, 75,
+  80, 91, 76, 99, 86, 84, 107, 73, 99, 84,
+  92, 84, 74, 90, 98, 69, 90, 106, 75, 88,
+  78, 107, 83, 96, 87, 87, 80, 97, 87, 87,
+  70, 93, 71, 87, 79, 85, 81, 80, 79, 84,
+  83, 95, 88, 75, 81, 91, 76, 74, 83, 79,
+  70, 89, 72, 85, 86, 85, 73, 78, 90, 86,
+  81, 99, 76, 106, 75, 91, 82, 80, 81, 93,
+  80, 87, 91, 92, 85, 73, 89, 95, 84, 85,
+  81, 86, 84, 84, 79, 96, 83, 79, 86, 89,
+  88, 86, 81, 79, 72, 85, 71, 84, 77, 79,
+  83, 83, 74, 75, 78, 82, 84, 73, 85, 86,
+  89, 89, 73, 94, 87, 77, 97, 84, 76, 85,
+  80, 86, 88, 78, 78, 87, 89, 80, 79, 76,
+  75, 97, 76, 88, 81, 80, 79, 87, 68, 77,
+  76, 82, 77, 83, 77, 78, 64, 87, 84, 81,
+  74, 86, 78, 83, 78, 82, 79, 71, 89, 83,
+  74, 82, 84, 80, 78, 88, 73, 84, 79, 92,
+  97, 84, 83, 74, 83, 71, 70, 72, 83, 81,
+  75, 83, 82, 95, 70, 82, 89, 96, 88, 83,
+  75, 92, 87, 96, 91, 77, 77, 95, 71, 95,
+  72, 85, 91, 77, 83, 92, 84, 91, 73, 84,
+  88, 73, 82, 86, 81, 96, 88, 78, 83, 77,
+  82, 81, 84, 88, 85, 87, 81, 88, 76, 85,
+  92, 76, 89, 75, 78, 87, 78, 100, 82, 85,
+  82, 94, 92, 74, 92, 91, 85, 85, 88, 85,
+  83, 87, 84, 75, 79, 89, 82, 78, 83, 84,
+  80, 88, 75, 83, 68, 89, 68, 82, 78, 81,
+  73, 79, 81, 78, 81, 85, 86, 71, 84, 77,
+  77, 86, 77, 87, 80, 78, 77, 100, 78, 111,
+  96, 85, 71, 84, 113, 105, 96, 80, 76, 92,
+  85, 98, 90, 94, 119, 87, 75, 92, 87, 84,
+  88, 68, 97, 101, 94, 87, 71, 107, 103, 74,
+  88, 84, 84, 124, 94, 54, 71, 85, 94, 91,
+  81, 106, 93, 70, 79, 81, 76, 90, 85, 102,
+  103, 83, 97, 59, 75, 80, 73, 92, 82, 77,
+  74, 75, 71, 82, 96, 93, 78, 71, 107, 86,
+  81, 94, 121, 80, 82, 83, 89, 87, 99, 114,
+  64, 76, 98, 78, 74, 81, 87, 79, 76, 82,
+  92, 83, 111, 77, 88, 84, 79, 74, 103, 85,
+  105, 89, 99, 86, 88, 84, 82, 96, 103, 66,
+  82, 95, 86, 97, 76, 99, 83, 96, 87, 99,
+  76, 78, 92, 83, 74, 88, 103, 85, 81, 94,
+  80, 80, 80, 92, 81, 88, 87, 86, 81, 82,
+  79, 80, 79, 81, 67, 93, 75, 82, 88, 86,
+  75, 77, 95, 93, 79, 102, 78, 98, 68, 87,
+  81, 84, 84, 92, 76, 88, 94, 95, 76, 83,
+  83, 85, 89, 87, 77, 99, 83, 81, 77, 82,
+  80, 69, 93, 89, 81, 79, 77, 60, 73, 76,
+  80, 80, 82, 84, 72, 89, 75, 79, 79, 84,
+  89, 75, 72, 91, 87, 87, 79, 120, 85, 77,
+  107, 92, 73, 83, 77, 74, 88, 87, 69, 89,
+  82, 84, 69, 69, 76, 75, 81, 89, 76, 83,
+  83, 87, 71, 76, 86, 80, 74, 86, 80, 73,
+  83, 90, 81, 78, 79, 86, 76, 89, 85, 77,
+  80, 66, 86, 81, 83, 76, 83, 78, 84, 76,
+  71, 87, 77, 85, 96, 80, 84, 72, 81, 69,
+  65, 77, 86, 74, 82, 86, 86, 101, 69, 79,
+  91, 88, 94, 80, 77, 100, 83, 93, 85, 67,
+  81, 101, 79, 95, 79, 90, 93, 78, 74, 89,
+  88, 94, 73, 84, 90, 73, 81, 81, 79, 95,
+  94, 82, 95, 78, 81, 75, 77, 84, 91, 87,
+  79, 78, 75, 93, 84, 79, 84, 81, 75, 87,
+  74, 106, 86, 80, 87, 94, 91, 75, 99, 91,
+  87, 89, 88, 77, 88, 86, 79, 87, 70, 95,
+  77, 77, 77, 80, 77, 91, 71, 74, 75, 91,
+  75, 87, 88, 80, 66, 77, 83, 74, 84, 86,
+  88, 74, 82, 85, 79, 88, 87, 84, 80, 77,
+  88, 92, 81, 95, 86, 70, 81, 84, 84, 76,
+  88, 69, 72, 93, 74, 83, 79, 82, 93, 85,
+  74, 80, 89, 81, 76, 85, 90, 87, 85, 91,
+  86, 95, 91, 88, 75, 88, 89, 89, 100, 71,
+  73, 73, 83, 85, 72, 82, 94, 74, 94, 76,
+  73, 88, 83, 93, 88, 92, 98, 81, 73, 83,
+  75, 85, 93, 79, 80, 74, 77, 85, 99, 95,
+  73, 73, 102, 86, 89, 83, 78, 72, 105, 79,
+  88, 97, 84, 112, 92, 87, 98, 83, 89, 78,
+  88, 78, 95, 83, 84, 84, 93, 81, 90, 76,
+  81, 87, 77, 83, 72, 89, 83, 84, 85, 92,
+  88, 90, 79, 67, 99, 92, 81, 84, 73, 83,
+  81, 89, 82, 84, 77, 106, 82, 75, 85, 86,
+  90, 75, 77, 75, 81, 79, 74, 81, 79, 83,
+  87, 75, 77, 75, 78, 73, 67, 75, 79, 82,
+  78, 84, 82, 93, 77, 80, 86, 86, 97, 87,
+  77, 97, 70, 77, 82, 72, 85, 95, 83, 84,
+  79, 92, 80, 77, 81, 84, 91, 89, 77, 91,
+  87, 76, 79, 84, 79, 84, 90, 95, 94, 76,
+  81, 78, 77, 82, 90, 86, 89, 83, 71, 84,
+  77, 86, 85, 78, 76, 79, 78, 91, 88, 90,
+  77, 97, 90, 85, 85, 92, 90, 81, 80, 79,
+  98, 88, 69, 88, 79, 93, 70, 70, 76, 81,
+  75, 87, 76, 81, 85, 89, 80, 86, 87, 85,
+  67, 80, 88, 79, 70, 88, 84, 79, 83, 88,
+  76, 83, 85, 91, 80, 78, 86, 81, 75, 80,
+  79, 76, 74, 82, 78, 95, 80, 84, 91, 75,
+  85, 75, 81, 71, 70, 78, 89, 82, 84, 91,
+  82, 94, 78, 87, 82, 80, 91, 81, 82, 96,
+  82, 87, 83, 80, 79, 95, 87, 97, 76, 87,
+  87, 77, 72, 97, 84, 93, 75, 82, 93, 80,
+  89, 84, 82, 92, 92, 88, 102, 83, 79, 84,
+  86, 88, 91, 83, 87, 85, 77, 87, 90, 84,
+  86, 80, 81, 92, 69, 102, 87, 81, 84, 87,
+  83, 81, 80, 88, 93, 89, 90, 83, 85, 87,
+  88, 81, 83, 93, 80, 81, 84, 84, 86, 88,
+  81, 79, 80, 91, 84, 87, 88, 85, 73, 79,
+  85, 75, 81, 90, 89, 80, 82, 82, 84, 86,
+  80, 75, 88, 87, 95, 74, 84, 94, 87, 89,
+  84, 80, 74, 82, 84, 79, 96, 82, 78, 73,
+  85, 83, 83, 72, 83, 81, 72, 86, 97, 86,
+  73, 102, 87, 84, 79, 80, 94, 91, 96, 85,
+  82, 68, 80, 76, 82, 77, 71, 75, 89, 80,
+  74, 86, 73, 92, 73, 89, 79, 84, 87, 85,
+  75, 84, 90, 96, 71, 77, 88, 72, 77, 80,
+  88, 91, 81, 88, 71, 91, 88, 80, 80, 89,
+  87, 86, 82, 85, 73, 70, 99, 103, 79, 81,
+  80, 79, 75, 89, 100, 79, 94, 86, 66, 89,
+  84, 81, 79, 93, 83, 79, 94, 77, 91, 97,
+  90, 82, 76, 82, 76, 85, 79, 89, 72, 91,
+  77, 113, 105, 85, 84, 81, 81, 75, 82, 82,
+  82, 82, 85, 84, 77, 88, 89, 77, 78, 71,
+  71, 80, 72, 77, 93, 82, 83, 73, 85, 81,
+  67, 67, 72, 72, 77, 97, 87, 85, 70, 104,
+  87, 89, 74, 76, 93, 83, 87, 70, 74, 91,
+  81, 68, 75, 76, 73, 78, 86, 73, 61, 91,
+  66, 97, 66, 92, 69, 79, 83, 75, 68, 79,
+  82, 112, 76, 83, 75, 93, 77, 76, 96, 104,
+  85, 101, 74, 98, 80, 81, 92, 85, 83, 81,
+  88, 75, 71, 66, 94, 84, 89, 88, 76, 91,
+  72, 96, 85, 83, 95, 93, 67, 96, 86, 78,
+  81, 98, 91, 104, 95, 76, 115, 91, 82, 80,
+  78, 84, 74, 95, 71, 75, 76, 106, 66, 128,
+  134, 84, 84, 86, 70, 61, 85, 81, 98, 78,
+  95, 93, 78, 90, 86, 77, 78, 85, 76, 86,
+  82, 79, 80, 83, 74, 74, 87, 81, 79, 69,
+  76, 81, 83, 83, 88, 87, 74, 104, 86, 94,
+  81, 80, 98, 82, 83, 74, 72, 73, 78, 73,
+  82, 78, 77, 79, 83, 77, 71, 99, 73, 88,
+  75, 91, 77, 81, 86, 77, 78, 81, 81, 93,
+  73, 84, 87, 73, 75, 79, 75, 99, 86, 79,
+  74, 92, 91, 78, 96, 93, 86, 95, 80, 82,
+  75, 72, 97, 70, 81, 85, 95, 83, 74, 86,
+  98, 80, 92, 88, 84, 89, 83, 83, 84, 92,
+  87, 88, 94, 74, 90, 96, 88, 78, 76, 81,
+  79, 84, 80, 79, 81, 88, 75, 111, 109, 80,
+  84, 78, 79, 78, 83, 73, 86, 83, 89, 74,
+  84, 93, 81, 91, 86, 76, 71, 80, 83, 89,
+  83, 72, 84, 80, 86, 92, 82, 80, 79, 68,
+  79, 86, 95, 84, 73, 101, 88, 76, 84, 81,
+  87, 89, 103, 91, 86, 85, 79, 73, 99, 79,
+  90, 76, 89, 83, 78, 85, 79, 90, 75, 86,
+  77, 87, 80, 90, 81, 88, 93, 95, 80, 77,
+  89, 74, 89, 78, 78, 91, 79, 100, 77, 97,
+  80, 78, 83, 87, 93, 83, 80, 80, 70, 72,
+  91, 99, 74, 85, 77, 78, 74, 86, 89, 76,
+  94, 84, 72, 95, 87, 80, 66, 89, 80, 78,
+  86, 81, 94, 85, 85, 84, 76, 79, 78, 81,
+  75, 100, 83, 79, 62, 125, 98, 83, 76, 79,
+  79, 67, 82, 79, 84, 77, 77, 78, 75, 79,
+  75, 91, 82, 69, 69, 75, 75, 94, 75, 74,
+  90, 89, 90, 86, 67, 78, 78, 55, 90, 90,
+  76, 83, 68, 104, 86, 90, 80, 69, 79, 87,
+  92, 75, 71, 126, 75, 66, 103, 78, 84, 75,
+  91, 77, 67, 88, 79, 95, 70, 88, 67, 83,
+  66, 81, 78, 87, 91, 120, 79, 78, 73, 85,
+  87, 68, 71, 109, 76, 90, 72, 118, 71, 70,
+  101, 92, 94, 79, 82, 76, 67, 74, 80, 80,
+  88, 94, 83, 84, 74, 95, 79, 77, 101, 84,
+  67, 109, 88, 76, 75, 85, 81, 77, 78, 81,
+  119, 84, 76, 82, 73, 86, 83, 84, 73, 81,
+  87, 91, 65, 149, 119, 81, 76, 87, 68, 56,
+  83, 78, 93, 73, 91, 83, 81, 88, 80, 79,
+  81, 78, 74, 79, 82, 91, 73, 85, 81, 79,
+  89, 91, 77, 74, 94, 73, 89, 84, 81, 85,
+  74, 102, 86, 101, 85, 73, 86, 83, 86, 70,
+  81, 92, 77, 71, 104, 84, 80, 79, 86, 83,
+  75, 90, 78, 88, 77, 93, 73, 86, 82, 81,
+  81, 85, 88, 93, 81, 80, 87, 72, 90, 79,
+  73, 96, 79, 91, 75, 99, 87, 77, 100, 91,
+  93, 96, 76, 86, 71, 72, 91, 69, 78, 92,
+  105, 79, 75, 83, 85, 78, 95, 83, 86, 96,
+  86, 82, 85, 90, 83, 73, 85, 77, 88, 89,
+  82, 77, 75, 81, 88, 81, 77, 76, 86, 89,
+  79, 122, 103, 81, 81, 77, 75, 72, 83, 76,
+  87, 81, 89, 73, 76, 84, 78, 81, 88, 83,
+  75, 90, 80, 88, 81, 80, 80, 81, 82, 83,
+  92, 70, 84, 81, 80, 90, 96, 83, 80, 94,
+  87, 76, 83, 86, 83, 89, 98, 76, 77, 91,
+  94, 73, 93, 78, 86, 81, 88, 83, 97, 81,
+  79, 83, 80, 82, 75, 92, 76, 91, 84, 84,
+  88, 83, 85, 84, 95, 78, 83, 77, 79, 81,
+  79, 99, 77, 79, 95, 81, 85, 81, 100, 83,
+  81, 75, 74, 89, 89, 83, 76, 88, 77, 83,
+  80, 72, 89, 75, 94, 81, 76, 90, 82, 82,
+  72, 90, 73, 76, 81, 80, 82, 88, 81, 86,
+  81, 78, 79, 81, 79, 96, 81, 90, 73, 109,
+  97, 89, 73, 76, 80, 70, 81, 82, 86, 90,
+  81, 75, 74, 82, 74, 83, 90, 75, 74, 92,
+  78, 87, 72, 85, 81, 89, 78, 78, 81, 73,
+  87, 64, 88, 90, 78, 78, 80, 101, 86, 93,
+  80, 76, 83, 85, 97, 71, 70, 110, 84, 68,
+  101, 77, 89, 78, 95, 83, 90, 81, 83, 86,
+  82, 83, 72, 89, 71, 84, 85, 82, 89, 90,
+  79, 81, 89, 83, 87, 71, 69, 78, 74, 87,
+  76, 94, 90, 78, 88, 87, 96, 80, 78, 72,
+  73, 94, 84, 76, 77, 88, 81, 82, 81, 77,
+  88, 72, 103, 75, 74, 90, 87, 85, 76, 91,
+  75, 78, 82, 82, 87, 84, 76, 89, 79, 79,
+  86, 80, 78, 80, 87, 87, 72, 128, 100, 91,
+  76, 74, 72, 72, 82, 79, 86, 88, 87, 81,
+  79, 84, 84, 73, 87, 80, 78, 88, 81, 88,
+  73, 95, 79, 84, 83, 84, 89, 73, 93, 74,
+  84, 88, 82, 82, 83, 97, 84, 99, 85, 83,
+  86, 81, 86, 74, 80, 92, 79, 74, 96, 79,
+  85, 83, 86, 92, 92, 85, 80, 83, 82, 85,
+  75, 91, 79, 79, 79, 84, 81, 84, 87, 86,
+  91, 76, 85, 78, 78, 83, 77, 82, 78, 80,
+  95, 81, 90, 80, 98, 82, 71, 78, 74, 87,
+  91, 72, 77, 90, 97, 77, 79, 73, 88, 78,
+  94, 80, 86, 91, 81, 84, 86, 95, 76, 86,
+  82, 80, 77, 85, 80, 87, 82, 80, 90, 82,
+  79, 77, 85, 88, 71, 108, 97, 89, 75, 75,
+  78, 73, 82, 81, 88, 93, 76, 85, 86, 75,
+  68, 82, 72, 80, 68, 83, 79, 76, 68, 85,
+  62, 94, 89, 83, 98, 109, 62, 68, 99, 101,
+  74, 94, 78, 69, 105, 78, 84, 81, 68, 76,
+  80, 95, 74, 92, 74, 77, 93, 78, 67, 72,
+  92, 97, 90, 78, 97, 81, 71, 78, 76, 77,
+  103, 55, 127, 74, 74, 87, 80, 94, 100, 59,
+  69, 72, 80, 79, 90, 85, 95, 81, 103, 82,
+  89, 99, 72, 90, 71, 79, 86, 92, 93, 97,
+  73, 94, 76, 81, 93, 87, 109, 69, 84, 94,
+  105, 78, 89, 80, 77, 94, 85, 55, 82, 93,
+  88, 79, 96, 69, 84, 74, 85, 83, 75, 92,
+  75, 86, 79, 80, 82, 80, 63, 84, 84, 75,
+  102, 88, 81, 74, 83, 63, 101, 85, 85, 98,
+  69, 77, 83, 97, 75, 78, 99, 83, 68, 82,
+  66, 71, 83, 98, 84, 77, 95, 94, 90, 90,
+  83, 81, 123, 98, 72, 82, 49, 82, 90, 86,
+  82, 77, 75, 81, 89, 81, 89, 60, 87, 129,
+  71, 109, 93, 88, 77, 92, 88, 68, 84, 88,
+  69, 57, 66, 92, 93, 90, 85, 57, 58, 62,
+  72, 73, 81, 91, 87, 97, 79, 80, 78, 68,
+  78, 104, 79, 74, 78, 70, 101, 94, 72, 90,
+  100, 111, 55, 88, 72, 79, 85, 98, 87, 73,
+  87, 74, 91, 71, 86, 59, 94, 84, 83, 75,
+  84, 80, 73, 75, 88, 96, 68, 91, 64, 92,
+  106, 79, 67, 70, 82, 83, 82, 78, 76, 84,
+  77, 81, 88, 69, 71, 92, 78, 77, 81, 79,
+  83, 90, 91, 101, 101, 85, 91, 86, 81, 73,
+  87, 87, 101, 77, 76, 88, 91, 90, 89, 79,
+  78, 101, 93, 84, 84, 88, 93, 74, 88, 85,
+  77, 88, 89, 79, 84, 79, 81, 97, 76, 81,
+  71, 87, 90, 103, 89, 85, 78, 113, 62, 81,
+  87, 89, 96, 83, 84, 75, 79, 87, 89, 88,
+  67, 85, 86, 82, 77, 85, 76, 68, 84, 80,
+  85, 87, 91, 99, 80, 86, 95, 85, 99, 90,
+  96, 94, 74, 89, 96, 92, 68, 91, 101, 89,
+  98, 82, 94, 79, 92, 80, 86, 84, 62, 101,
+  93, 82, 85, 95, 80, 88, 97, 84, 76, 87,
+  84, 77, 89, 89, 74, 85, 86, 81, 85, 81,
+  68, 94, 85, 78, 69, 63, 83, 83, 79, 80,
+  80, 79, 73, 97, 65, 84, 87, 73, 94, 106,
+  57, 71, 78, 98, 78, 98, 72, 67, 97, 69,
+  82, 86, 59, 76, 62, 83, 77, 87, 78, 70,
+  96, 74, 74, 74, 93, 87, 90, 93, 91, 74,
+  75, 75, 85, 76, 102, 65, 128, 66, 75, 92,
+  83, 93, 103, 71, 64, 78, 73, 80, 101, 97,
+  69, 69, 113, 91, 94, 87, 83, 72, 72, 71,
+  83, 84, 85, 89, 76, 95, 69, 81, 92, 79,
+  94, 66, 89, 89, 93, 79, 88, 86, 75, 86,
+  85, 57, 85, 98, 94, 95, 100, 77, 86, 73,
+  85, 82, 74, 87, 74, 77, 71, 81, 88, 88,
+  64, 83, 83, 79, 88, 91, 82, 73, 76, 75,
+  89, 84, 90, 94, 72, 71, 87, 90, 79, 81,
+  97, 82, 68, 84, 74, 64, 77, 96, 83, 60,
+  76, 90, 96, 95, 69, 82, 99, 86, 75, 74,
+  41, 89, 83, 87, 82, 65, 75, 86, 92, 74,
+  88, 58, 85, 121, 77, 133, 91, 88, 73, 85,
+  89, 72, 81, 69, 64, 58, 63, 96, 94, 84,
+  85, 64, 62, 62, 66, 68, 98, 76, 88, 84,
+  83, 86, 86, 55, 78, 89, 73, 75, 78, 63,
+  101, 88, 68, 94, 99, 105, 54, 80, 58, 81,
+  83, 96, 67, 76, 84, 81, 70, 66, 80, 67,
+  91, 86, 78, 82, 85, 83, 67, 74, 95, 96,
+  63, 86, 70, 69, 83, 74, 60, 68, 78, 87,
+  84, 77, 73, 86, 70, 80, 85, 73, 84, 89,
+  70, 76, 86, 85, 88, 85, 92, 105, 80, 86,
+  98, 82, 88, 82, 88, 88, 99, 75, 78, 83,
+  89, 90, 75, 82, 61, 96, 93, 86, 92, 86,
+  84, 78, 83, 78, 77, 79, 81, 73, 84, 80,
+  83, 98, 84, 85, 77, 87, 84, 95, 87, 95,
+  76, 119, 64, 83, 80, 79, 90, 89, 78, 69,
+  77, 89, 91, 87, 83, 80, 76, 68, 86, 87,
+  82, 72, 82, 72, 79, 90, 94, 96, 81, 81,
+  97, 88, 92, 95, 92, 78, 85, 84, 92, 88,
+  69, 85, 90, 97, 80, 90, 88, 87, 86, 80,
+  75, 91, 65, 97, 86, 86, 94, 97, 81, 85,
+  97, 78, 72, 85, 78, 69, 74, 94, 71, 85,
+  82, 80, 80, 81, 73, 107, 91, 80, 67, 74,
+  84, 88, 77, 80, 76, 72, 69, 95, 56, 81,
+  74, 72, 95, 102, 61, 83, 103, 97, 81, 99,
+  78, 74, 88, 61, 75, 87, 69, 77, 69, 95,
+  87, 82, 84, 73, 87, 74, 83, 76, 89, 96,
+  83, 89, 97, 71, 74, 72, 87, 78, 98, 71,
+  128, 68, 73, 87, 86, 98, 96, 67, 74, 77,
+  75, 84, 90, 96, 65, 76, 114, 91, 97, 97,
+  75, 94, 80, 71, 89, 85, 88, 92, 76, 91,
+  76, 80, 81, 83, 100, 71, 90, 79, 103, 76,
+  90, 77, 67, 83, 90, 61, 89, 92, 97, 79,
+  118, 76, 95, 75, 87, 77, 77, 100, 65, 82,
+  88, 76, 89, 96, 73, 83, 80, 81, 93, 92,
+  84, 72, 76, 79, 77, 92, 85, 102, 70, 75,
+  86, 90, 76, 81, 99, 86, 59, 82, 67, 73,
+  83, 90, 95, 74, 87, 91, 102, 86, 79, 89,
+  113, 58, 84, 84, 48, 98, 97, 90, 96, 78,
+  89, 87, 98, 81, 92, 62, 76, 124, 74, 116,
+  94, 81, 82, 84, 87, 67, 81, 80, 74, 54,
+  73, 89, 97, 94, 88, 57, 76, 57, 71, 76,
+  98, 78, 95, 87, 92, 86, 84, 66, 77, 106,
+  79, 77, 74, 76, 101, 92, 72, 95, 102, 107,
+  59, 80, 75, 86, 85, 91, 78, 77, 85, 77,
+  58, 77, 77, 70, 95, 82, 84, 83, 86, 88,
+  78, 66, 93, 95, 70, 93, 67, 85, 80, 82,
+  72, 73, 90, 80, 88, 77, 81, 90, 82, 78,
+  83, 65, 78, 97, 71, 74, 88, 85, 95, 86,
+  85, 101, 88, 77, 80, 84, 81, 89, 89, 85,
+  104, 78, 83, 90, 92, 81, 80, 90, 81, 80,
+  99, 85, 84, 99, 90, 78, 87, 85, 82, 96,
+  86, 81, 88, 85, 77, 98, 82, 87, 86, 89,
+  78, 94, 91, 88, 69, 122, 64, 76, 79, 83,
+  90, 86, 82, 68, 83, 85, 96, 81, 89, 81,
+  83, 76, 85, 84, 78, 68, 75, 80, 92, 90,
+  84, 107, 87, 85, 91, 94, 94, 101, 98, 85,
+  83, 94, 98, 93, 63, 85, 82, 93, 73, 93,
+  84, 81, 87, 75, 88, 86, 64, 93, 86, 91,
+  97, 87, 85, 92, 91, 79, 77, 91, 81, 65,
+  86, 90, 80, 82, 90, 81, 85, 81, 80, 78,
+  90, 105, 69, 86, 81, 71, 95, 91, 88, 82,
+  87, 79, 84, 82, 71, 73, 104, 69, 94, 82,
+  114, 94, 83, 74, 69, 89, 91, 81, 89, 97,
+  92, 79, 74, 91, 74, 86, 79, 82, 105, 77,
+  85, 89, 75, 78, 103, 82, 78, 87, 96, 73,
+  81, 108, 91, 87, 84, 91, 87, 83, 77, 95,
+  71, 82, 80, 80, 85, 101, 78, 83, 88, 87,
+  64, 86, 76, 84, 87, 101, 80, 77, 85, 79,
+  73, 75, 83, 84, 83, 74, 70, 89, 74, 97,
+  99, 86, 75, 83, 82, 93, 91, 63, 70, 79,
+  92, 81, 89, 91, 87, 79, 85, 79, 84, 90,
+  85, 86, 87, 93, 94, 81, 89, 87, 94, 73,
+  75, 83, 96, 86, 84, 84, 68, 90, 80, 106,
+  72, 96, 74, 62, 94, 89, 86, 77, 85, 79,
+  76, 73, 74, 78, 102, 77, 90, 83, 103, 88,
+  88, 75, 74, 87, 96, 78, 97, 95, 92, 81,
+  83, 73, 83, 97, 84, 81, 110, 75, 93, 94,
+  74, 77, 103, 86, 87, 87, 95, 81, 89, 127,
+  87, 86, 75, 87, 83, 75, 88, 100, 67, 89,
+  68, 82, 89, 94, 75, 82, 82, 87, 55, 90,
+  78, 82, 78, 87, 77, 74, 84, 85, 75, 74,
+  85, 87, 83, 76, 63, 89, 69, 107, 88, 83,
+  63, 76, 65, 90, 99, 60, 70, 84, 90, 78,
+  77, 84, 76, 72, 90, 75, 96, 91, 85, 80,
+  94, 89, 75, 74, 87, 93, 81, 73, 83, 79,
+  108, 85, 76, 78, 82, 98, 88, 87, 71, 107,
+  83, 71, 96, 93, 86, 81, 80, 73, 79, 90,
+  78, 70, 101, 71, 81, 80, 89, 89, 85, 78,
+  69, 85, 86, 78, 87, 96, 88, 80, 80, 82,
+  77, 89, 76, 87, 96, 78, 86, 83, 81, 88,
+  90, 98, 80, 84, 92, 70, 85, 103, 91, 82,
+  86, 91, 85, 80, 78, 92, 74, 80, 81, 85,
+  76, 93, 73, 74, 94, 87, 70, 85, 75, 91,
+  83, 78, 78, 77, 79, 80, 87, 89, 74, 85,
+  84, 74, 75, 98, 75, 107, 102, 86, 84, 81,
+  80, 88, 104, 63, 69, 85, 96, 85, 84, 83,
+  83, 78, 87, 83, 97, 85, 88, 91, 82, 86,
+  81, 85, 90, 91, 79, 76, 65, 87, 87, 85,
+  86, 80, 69, 70, 77, 122, 82, 73, 84, 71,
+  105, 93, 76, 84, 86, 100, 80, 89, 72, 71,
+  83, 74, 93, 74, 119, 94, 81, 75, 98, 74,
+  99, 79, 85, 83, 91, 74, 85, 95, 80, 73,
+  77, 72, 94, 94, 81, 105, 79, 89, 100, 96,
+  93, 84, 92, 78, 79, 116, 83, 100, 87, 80,
+  81, 95, 75, 97, 74, 75, 79, 65, 84, 113,
+  104, 76, 107, 88, 75, 83, 67, 70, 98, 92,
+  85, 85, 97, 86, 92, 70, 81, 81, 86, 74,
+  70, 78, 60, 89, 75, 89, 64, 75, 63, 88,
+  90, 73, 70, 93, 87, 74, 85, 98, 89, 72,
+  83, 52, 88, 86, 84, 92, 81, 91, 71, 68,
+  76, 82, 91, 63, 90, 71, 91, 86, 78, 75,
+  68, 91, 97, 156, 86, 75, 76, 50, 114, 85,
+  73, 77, 83, 85, 84, 99, 69, 67, 74, 74,
+  94, 82, 83, 83, 98, 81, 122, 66, 111, 83,
+  81, 107, 102, 75, 87, 74, 82, 73, 87, 73,
+  82, 84, 93, 102, 72, 85, 111, 93, 102, 90,
+  99, 93, 99, 150, 82, 89, 67, 81, 66, 85,
+  83, 104, 76, 92, 73, 67, 90, 90, 103, 76,
+  79, 81, 62, 83, 67, 47, 96, 90, 79, 79,
+  105, 105, 106, 82, 77, 91, 92, 71, 70, 76,
+  47, 94, 56, 94, 46, 63, 36, 86, 98, 65,
+  74, 86, 73, 69, 78, 79, 86, 62, 99, 48,
+  106, 71, 83, 87, 82, 87, 76, 55, 58, 87,
+  84, 62, 117, 60, 110, 92, 51, 70, 77, 89,
+  97, 101, 76, 104, 82, 65, 96, 93, 76, 88,
+  74, 78, 77, 92, 82, 73, 87, 78, 79, 76,
+  73, 87, 91, 75, 94, 70, 95, 86, 82, 97,
+  84, 78, 84, 68, 80, 78, 82, 78, 92, 90,
+  84, 100, 80, 88, 89, 88, 90, 83, 89, 81,
+  80, 107, 78, 80, 88, 84, 80, 88, 73, 97,
+  77, 69, 84, 72, 82, 107, 88, 79, 78, 87,
+  71, 88, 69, 75, 88, 85, 73, 80, 88, 88,
+  108, 97, 74, 91, 89, 79, 75, 83, 63, 99,
+  77, 93, 71, 68, 63, 88, 99, 64, 69, 78,
+  87, 76, 83, 95, 83, 72, 85, 63, 103, 91,
+  88, 92, 83, 95, 98, 69, 76, 86, 72, 67,
+  75, 76, 82, 88, 85, 74, 76, 76, 81, 97,
+  88, 77, 73, 83, 99, 97, 71, 71, 83, 95,
+  81, 99, 69, 63, 76, 89, 83, 76, 107, 102,
+  82, 76, 106, 67, 81, 84, 72, 77, 74, 68,
+  89, 101, 88, 70, 75, 73, 78, 84, 74, 84,
+  68, 85, 81, 89, 100, 79, 81, 67, 82, 103,
+  76, 101, 103, 77, 84, 91, 68, 95, 83, 85,
+  75, 65, 82, 100, 90, 79, 98, 87, 106, 90,
+  68, 91, 97, 91, 113, 80, 82, 75, 104, 81,
+  87, 81, 81, 83, 72, 81, 67, 82, 81, 82,
+  72, 72, 68, 75, 71, 78, 67, 93, 91, 81,
+  86, 106, 73, 75, 64, 69, 81, 92, 82, 91,
+  80, 80, 74, 85, 83, 89, 93, 71, 86, 64,
+  74, 85, 99, 74, 79, 83, 90, 118, 94, 79,
+  57, 62, 103, 91, 67, 67, 83, 89, 88, 103,
+  74, 61, 72, 92, 85, 74, 79, 96, 92, 72,
+  117, 60, 99, 98, 76, 93, 87, 70, 86, 82,
+  80, 50, 82, 68, 66, 72, 77, 96, 61, 85,
+  76, 98, 98, 80, 82, 78, 97, 112, 69, 85,
+  90, 75, 80, 91, 73, 106, 83, 96, 79, 64,
+  85, 99, 102, 82, 89, 85, 97, 84, 51, 68,
+  100, 90, 106, 76, 85, 78, 132, 88, 94, 87,
+  86, 79, 78, 73, 56, 88, 61, 89, 59, 61,
+  53, 78, 76, 75, 62, 88, 86, 81, 90, 110,
+  73, 72, 60, 60, 86, 87, 77, 87, 98, 83,
+  92, 74, 65, 96, 80, 70, 97, 49, 75, 84,
+  82, 73, 81, 84, 75, 89, 86, 99, 71, 77,
+  93, 94, 76, 73, 76, 80, 79, 94, 82, 68,
+  80, 78, 78, 77, 72, 94, 87, 70, 99, 66,
+  79, 101, 73, 86, 69, 74, 86, 75, 85, 67,
+  82, 77, 78, 82, 79, 90, 67, 84, 76, 91,
+  92, 75, 81, 81, 83, 96, 79, 71, 97, 80,
+  89, 87, 68, 90, 86, 78, 77, 71, 78, 98,
+  90, 84, 78, 86, 95, 92, 61, 96, 90, 81,
+  97, 73, 77, 81, 104, 94, 81, 84, 82, 92,
+  77, 86, 69, 85, 88, 81, 75, 68, 69, 80,
+  91, 64, 70, 72, 91, 80, 89, 100, 76, 79,
+  63, 77, 92, 90, 85, 87, 91, 90, 103, 87,
+  84, 89, 81, 73, 76, 74, 73, 82, 101, 80,
+  81, 77, 79, 83, 76, 85, 75, 94, 81, 90,
+  68, 86, 88, 106, 71, 83, 84, 72, 85, 87,
+  87, 98, 90, 87, 79, 71, 85, 89, 95, 80,
+  84, 72, 84, 74, 79, 85, 67, 85, 93, 74,
+  90, 76, 89, 81, 86, 84, 78, 75, 88, 95,
+  98, 81, 95, 89, 79, 80, 64, 73, 80, 75,
+  92, 91, 85, 80, 62, 79, 123, 90, 84, 59,
+  79, 76, 99, 92, 78, 78, 75, 89, 82, 80,
+  82, 92, 88, 88, 73, 91, 98, 80, 86, 80,
+  79, 89, 95, 78, 93, 80, 68, 76, 87, 86,
+  78, 81, 92, 75, 89, 84, 79, 87, 81, 98,
+  70, 99, 75, 89, 84, 81, 81, 90, 77, 85,
+  83, 79, 96, 88, 81, 90, 80, 87, 77, 79,
+  83, 92, 102, 79, 69, 93, 78, 90, 75, 81,
+  83, 98, 68, 85, 93, 78, 93, 93, 86, 95,
+  85, 78, 91, 65, 80, 97, 94, 85, 81, 85,
+  95, 68, 77, 74, 57, 87, 121, 67, 96, 70,
+  94, 97, 92, 86, 87, 75, 86, 90, 100, 74,
+  89, 94, 71, 89, 64, 79, 74, 69, 95, 100,
+  85, 79, 55, 71, 122, 97, 98, 66, 67, 70,
+  100, 94, 77, 70, 68, 78, 82, 77, 80, 88,
+  92, 92, 73, 87, 84, 91, 77, 77, 76, 98,
+  89, 84, 90, 92, 75, 76, 88, 74, 83, 85,
+  91, 75, 81, 79, 74, 79, 80, 91, 64, 135,
+  78, 82, 84, 74, 77, 93, 77, 86, 85, 77,
+  94, 87, 80, 91, 83, 84, 72, 87, 81, 85,
+  74, 88, 76, 103, 86, 89, 67, 91, 95, 84,
+  68, 88, 81, 72, 84, 83, 78, 94, 86, 89,
+  71, 71, 85, 83, 93, 90, 77, 82, 86, 77,
+  84, 86, 71, 87, 116, 78, 85, 76, 85, 85,
+  89, 82, 80, 87, 89, 94, 97, 82, 99, 91,
+  83, 91, 77, 66, 79, 82, 92, 91, 79, 81,
+  70, 80, 101, 91, 79, 72, 78, 79, 97, 81,
+  76, 75, 75, 73, 77, 85, 80, 88, 84, 83,
+  75, 85, 86, 88, 84, 78, 81, 87, 92, 74,
+  93, 80, 67, 74, 79, 81, 80, 88, 91, 76,
+  90, 80, 89, 85, 79, 96, 66, 97, 73, 98,
+  78, 83, 82, 86, 78, 84, 88, 78, 96, 88,
+  83, 90, 77, 88, 80, 62, 73, 74, 106, 76,
+  71, 85, 73, 93, 85, 80, 71, 78, 66, 74,
+  90, 85, 90, 103, 95, 95, 105, 75, 84, 66,
+  83, 97, 105, 99, 78, 86, 92, 70, 84, 95,
+  67, 78, 141, 69, 89, 65, 95, 101, 93, 73,
+  75, 71, 87, 85, 92, 67, 73, 88, 68, 85,
+  86, 74, 73, 68, 74, 107, 81, 81, 67, 72,
+  92, 93, 93, 69, 73, 63, 95, 92, 77, 81,
+  82, 85, 109, 72, 66, 77, 83, 103, 78, 77,
+  91, 105, 64, 88, 90, 77, 85, 59, 94, 95,
+  81, 79, 78, 87, 93, 81, 87, 82, 86, 88,
+  72, 81, 84, 85, 77, 135, 69, 84, 89, 83,
+  80, 87, 58, 78, 84, 72, 72, 78, 69, 88,
+  83, 84, 78, 62, 65, 76, 137, 76, 77, 81,
+  67, 98, 90, 70, 60, 108, 73, 71, 93, 85,
+  87, 112, 102, 99, 72, 67, 81, 64, 75, 98,
+  101, 109, 82, 85, 86, 70, 83, 89, 47, 70,
+  136, 72, 90, 54, 97, 117, 101, 75, 77, 71,
+  89, 76, 86, 64, 70, 93, 60, 77, 90, 83,
+  65, 57, 78, 128, 75, 77, 69, 70, 68, 95,
+  118, 64, 66, 58, 92, 77, 90, 74, 72, 75,
+  105, 67, 67, 74, 83, 88, 90, 70, 75, 104,
+  57, 85, 87, 77, 70, 61, 94, 105, 82, 87,
+  78, 76, 74, 80, 92, 81, 90, 95, 64, 72,
+  81, 74, 80, 173, 80, 77, 87, 68, 71, 86,
+  59, 78, 90, 68, 61, 77, 74, 87, 90, 75,
+  81, 68, 70, 81, 86, 93, 77, 92, 80, 89,
+  88, 78, 79, 125, 67, 75, 89, 77, 90, 88,
+  90, 97, 75, 77, 64, 70, 89, 92, 99, 109,
+  79, 94, 92, 74, 84, 92, 69, 82, 102, 73,
+  79, 69, 92, 88, 88, 75, 82, 84, 87, 92,
+  88, 72, 79, 85, 79, 74, 93, 73, 74, 81,
+  83, 97, 81, 74, 74, 79, 76, 87, 92, 77,
+  70, 77, 92, 83, 86, 84, 78, 80, 89, 76,
+  70, 76, 79, 82, 78, 76, 83, 99, 73, 84,
+  91, 99, 85, 61, 94, 89, 79, 77, 76, 83,
+  95, 98, 85, 79, 87, 85, 83, 76, 84, 89,
+  81, 114, 72, 93, 88, 90, 78, 81, 70, 76,
+  96, 77, 81, 83, 75, 88, 83, 92, 81, 83,
+  83, 75, 64, 103, 86, 89, 88, 84, 78, 93,
+  91, 60, 76, 96, 75, 101, 82, 81, 83, 78,
+  97, 83, 83, 81, 89, 88, 85, 94, 89, 91,
+  91, 72, 76, 89, 83, 79, 104, 82, 81, 76,
+  84, 87, 77, 77, 87, 78, 80, 88, 100, 89,
+  84, 90, 81, 93, 82, 75, 80, 93, 87, 76,
+  89, 86, 93, 83, 82, 77, 80, 75, 78, 80,
+  98, 81, 77, 84, 83, 87, 92, 83, 84, 95,
+  84, 92, 85, 84, 95, 74, 98, 84, 84, 82,
+  83, 74, 93, 71, 80, 81, 88, 87, 90, 80,
+  84, 74, 84, 91, 78, 85, 81, 94, 87, 74,
+  74, 85, 93, 98, 81, 85, 82, 75, 92, 79,
+  100, 84, 80, 92, 78, 85, 82, 84, 77, 73,
+  66, 83, 93, 93, 83, 86, 77, 94, 90, 78,
+  78, 95, 68, 97, 75, 77, 88, 75, 83, 82,
+  80, 81, 98, 92, 77, 94, 92, 92, 97, 71,
+  88, 77, 81, 71, 75, 83, 77, 75, 90, 80,
+  69, 83, 90, 77, 96, 94, 93, 89, 89, 91,
+  78, 86, 83, 76, 84, 85, 89, 74, 90, 86,
+  77, 84, 76, 59, 84, 66, 73, 91, 95, 80,
+  84, 90, 78, 84, 103, 79, 89, 95, 83, 82,
+  85, 85, 85, 66, 99, 91, 91, 79, 89, 79,
+  80, 63, 85, 80, 95, 80, 91, 69, 89, 70,
+  89, 90, 76, 82, 82, 102, 93, 69, 87, 87,
+  95, 101, 67, 89, 86, 83, 94, 80, 103, 92,
+  84, 93, 83, 88, 84, 79, 85, 76, 70, 96,
+  88, 92, 89, 81, 78, 85, 89, 98, 83, 91,
+  77, 90, 82, 81, 81, 85, 94, 82, 76, 84,
+  86, 83, 78, 84, 91, 87, 86, 78, 90, 87,
+  82, 78, 67, 80, 78, 75, 81, 83, 77, 80,
+  93, 84, 80, 84, 94, 96, 87, 89, 84, 77,
+  83, 79, 76, 93, 88, 75, 85, 88, 101, 84,
+  83, 79, 79, 76, 87, 81, 96, 82, 85, 83,
+  79, 90, 93, 82, 90, 88, 80, 81, 89, 86,
+  84, 73, 97, 83, 83, 90, 83, 83, 92, 72,
+  82, 81, 85, 83, 92, 79, 83, 71, 83, 95,
+  80, 88, 77, 95, 88, 77, 77, 96, 97, 88,
+  74, 82, 88, 75, 84, 82, 95, 88, 82, 87,
+  83, 85, 95, 86, 84, 93, 86, 92, 72, 104,
+  99, 85, 83, 76, 100, 64, 64, 106, 88, 92,
+  80, 78, 84, 84, 96, 88, 71, 66, 84, 90,
+  90, 85, 81, 85, 100, 73, 84, 91, 80, 87,
+  104, 77, 90, 80, 84, 89, 86, 90, 79, 87,
+  82, 95, 80, 94, 85, 88, 104, 82, 92, 90,
+  92, 81, 77, 78, 85, 83, 83, 83, 92, 76,
+  93, 79, 105, 82, 111, 111, 70, 89, 87, 80,
+  85, 68, 102, 75, 82, 86, 92, 72, 80, 86,
+  90, 74, 84, 115, 89, 80, 96, 67, 93, 75,
+  77, 90, 97, 73, 86, 85, 76, 72, 78, 85,
+  73, 99, 88, 90, 84, 83, 83, 68, 78, 75,
+  92, 79, 68, 78, 79, 112, 91, 85, 82, 87,
+  93, 78, 93, 102, 95, 97, 69, 112, 105, 87,
+  81, 76, 93, 79, 70, 106, 84, 97, 85, 76,
+  89, 92, 99, 89, 71, 63, 100, 95, 87, 82,
+  74, 80, 98, 66, 89, 87, 73, 89, 75, 69,
+  98, 71, 87, 86, 90, 100, 80, 79, 75, 93,
+  86, 98, 85, 81, 109, 68, 93, 86, 92, 84,
+  77, 78, 85, 77, 101, 70, 92, 69, 92, 87,
+  84, 74, 129, 111, 72, 84, 87, 88, 79, 57,
+  97, 77, 86, 87, 78, 78, 83, 74, 82, 77,
+  89, 116, 89, 80, 107, 63, 86, 73, 72, 81,
+  93, 75, 84, 88, 76, 71, 77, 86, 74, 101,
+  90, 93, 93, 85, 77, 58, 97, 76, 83, 77,
+  77, 75, 81, 123, 86, 95, 83, 86, 98, 73,
+  102, 95, 90, 86, 79, 95, 92, 87, 87, 81,
+  96, 108, 68, 101, 82, 88, 88, 82, 86, 92,
+  85, 92, 71, 72, 85, 86, 81, 82, 83, 81,
+  102, 71, 85, 91, 76, 83, 69, 79, 90, 82,
+  83, 85, 80, 88, 77, 83, 80, 97, 75, 108,
+  88, 87, 112, 74, 90, 85, 94, 85, 75, 79,
+  84, 81, 85, 85, 89, 80, 94, 79, 75, 78,
+  115, 102, 77, 90, 85, 89, 80, 76, 106, 69,
+  84, 74, 88, 79, 74, 80, 94, 74, 83, 107,
+  93, 86, 95, 70, 89, 77, 80, 90, 86, 72,
+  90, 82, 77, 73, 79, 83, 74, 99, 98, 85,
+  86, 86, 92, 71, 101, 80, 92, 79, 81, 78,
+  81, 116, 91, 93, 90, 91, 90, 82, 85, 74,
+  75, 70, 72, 70, 71, 75, 79, 82, 90, 67,
+  76, 77, 84, 82, 66, 92, 76, 59, 85, 80,
+  91, 76, 70, 76, 104, 84, 93, 86, 79, 95,
+  74, 90, 104, 80, 97, 82, 80, 84, 80, 81,
+  83, 71, 86, 89, 83, 74, 80, 67, 81, 93,
+  70, 96, 82, 84, 82, 92, 99, 75, 98, 90,
+  89, 73, 98, 77, 90, 78, 86, 98, 76, 91,
+  86, 60, 82, 77, 95, 81, 78, 107, 73, 100,
+  101, 71, 77, 88, 66, 76, 66, 90, 72, 81,
+  81, 71, 86, 96, 84, 77, 81, 87, 87, 92,
+  89, 67, 78, 81, 89, 72, 86, 81, 59, 82,
+  83, 98, 78, 92, 85, 75, 73, 84, 71, 69,
+  69, 87, 68, 73, 94, 80, 78, 64, 83, 65,
+  73, 69, 64, 71, 78, 84, 86, 84, 80, 77,
+  83, 84, 63, 89, 81, 55, 66, 74, 87, 82,
+  75, 68, 105, 79, 104, 82, 72, 92, 84, 79,
+  104, 80, 75, 77, 81, 80, 90, 84, 92, 68,
+  83, 83, 85, 67, 79, 63, 81, 90, 63, 81,
+  80, 83, 76, 89, 95, 78, 99, 88, 74, 66,
+  91, 72, 100, 71, 71, 95, 72, 83, 97, 51,
+  77, 89, 103, 74, 79, 110, 67, 77, 116, 69,
+  78, 82, 48, 80, 66, 89, 65, 82, 79, 72,
+  82, 94, 90, 64, 68, 81, 81, 94, 102, 60,
+  74, 83, 95, 66, 96, 82, 57, 78, 86, 87,
+  64, 94, 82, 74, 75, 76, 74, 56, 73, 94,
+  69, 67, 88, 74, 87, 78, 77, 89, 67, 71,
+  77, 79, 85, 82, 83, 100, 72, 80, 81, 84,
+  75, 96, 81, 64, 66, 81, 76, 74, 80, 77,
+  92, 76, 89, 83, 84, 77, 75, 84, 87, 76,
+  59, 77, 77, 87, 84, 82, 80, 76, 79, 92,
+  78, 77, 79, 81, 81, 91, 84, 80, 86, 81,
+  85, 88, 93, 73, 100, 81, 90, 79, 87, 77,
+  98, 78, 75, 94, 87, 90, 93, 64, 88, 94,
+  94, 85, 81, 97, 76, 69, 96, 71, 79, 82,
+  75, 75, 72, 106, 73, 81, 90, 70, 82, 92,
+  88, 77, 78, 99, 90, 88, 85, 68, 79, 76,
+  86, 79, 87, 83, 67, 85, 93, 90, 76, 92,
+  88, 68, 82, 87, 78, 79, 75, 89, 72, 80,
+  88, 88, 85, 87, 92, 80, 78, 71, 75, 81,
+  82, 87, 94, 92, 82, 75, 85, 77, 79, 83,
+  85, 66, 84, 92, 82, 80, 84, 87, 92, 87,
+  98, 83, 85, 104, 91, 84, 81, 100, 57, 83,
+  89, 91, 87, 82, 86, 83, 84, 90, 85, 83,
+  90, 78, 84, 92, 74, 78, 83, 77, 86, 86,
+  95, 93, 91, 84, 98, 75, 85, 72, 87, 78,
+  86, 92, 80, 81, 84, 72, 80, 87, 86, 89,
+  78, 87, 78, 83, 83, 84, 78, 78, 81, 74,
+  78, 83, 87, 89, 84, 79, 92, 88, 85, 90,
+  87, 93, 88, 90, 82, 80, 88, 83, 87, 76,
+  75, 86, 71, 90, 79, 80, 75, 102, 87, 89,
+  83, 87, 79, 72, 65, 93, 70, 79, 93, 78,
+  80, 80, 95, 75, 80, 70, 68, 77, 82, 86,
+  99, 78, 83, 79, 89, 82, 81, 81, 86, 54,
+  75, 93, 84, 83, 82, 79, 101, 85, 106, 90,
+  80, 106, 86, 76, 87, 99, 86, 85, 94, 96,
+  85, 82, 83, 74, 83, 86, 94, 82, 87, 68,
+  85, 85, 68, 79, 80, 75, 84, 84, 104, 94,
+  89, 84, 85, 73, 100, 66, 91, 90, 74, 99,
+  74, 80, 81, 64, 80, 99, 81, 93, 78, 79,
+  76, 81, 88, 91, 81, 86, 72, 73, 71, 77,
+  85, 97, 75, 83, 92, 86, 90, 87, 78, 75,
+  87, 91, 83, 77, 85, 87, 85, 77, 75, 82,
+  68, 84, 75, 90, 82, 103, 86, 97, 86, 83,
+  83, 62, 62, 92, 64, 78, 85, 79, 92, 92,
+  84, 100, 72, 67, 78, 80, 85, 83, 92, 67,
+  76, 79, 88, 82, 83, 88, 89, 59, 80, 96,
+  82, 77, 82, 87, 88, 92, 89, 89, 83, 89,
+  84, 84, 80, 97, 100, 83, 91, 92, 78, 87,
+  87, 78, 83, 88, 84, 91, 87, 80, 83, 89,
+  80, 93, 83, 76, 89, 83, 93, 80, 86, 80,
+  88, 82, 85, 74, 86, 87, 81, 99, 84, 82,
+  78, 76, 85, 97, 86, 93, 78, 90, 74, 78,
+  85, 86, 85, 83, 85, 75, 73, 78, 89, 86,
+  81, 79, 90, 86, 90, 84, 87, 69, 88, 86,
+  76, 80, 86, 81, 87, 83, 77, 85, 78, 84,
+  77, 87, 97, 102, 85, 84, 86, 87, 82, 83,
+  71, 92, 71, 85, 55, 88, 86, 106, 87, 67,
+  88, 84, 82, 77, 96, 90, 79, 95, 79, 73,
+  67, 72, 107, 98, 83, 97, 75, 82, 90, 83,
+  101, 72, 113, 93, 89, 78, 92, 74, 79, 88,
+  74, 120, 91, 75, 113, 67, 92, 93, 61, 95,
+  63, 105, 94, 75, 90, 106, 77, 103, 96, 92,
+  89, 85, 108, 76, 76, 100, 128, 75, 90, 76,
+  82, 91, 70, 77, 98, 90, 61, 71, 85, 82,
+  71, 84, 114, 75, 84, 91, 101, 82, 83, 87,
+  98, 97, 80, 115, 93, 78, 55, 75, 78, 91,
+  92, 85, 63, 123, 81, 81, 86, 87, 77, 71,
+  99, 96, 122, 60, 122, 86, 94, 96, 87, 87,
+  85, 77, 89, 89, 100, 74, 109, 70, 83, 76,
+  93, 77, 61, 79, 77, 109, 86, 64, 82, 79,
+  78, 84, 92, 90, 72, 93, 81, 77, 71, 72,
+  101, 93, 93, 85, 74, 77, 86, 87, 98, 70,
+  70, 95, 85, 76, 81, 77, 82, 75, 74, 112,
+  91, 78, 99, 64, 86, 88, 64, 86, 56, 95,
+  87, 78, 80, 102, 74, 100, 90, 92, 85, 79,
+  94, 81, 76, 89, 128, 70, 95, 77, 79, 90,
+  73, 79, 92, 98, 61, 77, 86, 80, 74, 85,
+  106, 79, 80, 85, 95, 79, 75, 90, 97, 91,
+  68, 111, 80, 82, 58, 74, 79, 82, 87, 88,
+  74, 109, 85, 77, 85, 83, 74, 68, 91, 91,
+  122, 64, 120, 87, 85, 91, 84, 82, 84, 78,
+  90, 87, 110, 80, 102, 74, 81, 80, 90, 72,
+  66, 76, 73, 100, 83, 73, 86, 83, 83, 80,
+  87, 88, 77, 85, 81, 78, 74, 79, 97, 87,
+  89, 83, 77, 85, 84, 80, 99, 72, 101, 89,
+  80, 75, 83, 81, 77, 73, 74, 103, 87, 81,
+  101, 67, 83, 91, 67, 93, 61, 91, 88, 77,
+  84, 98, 79, 87, 95, 83, 88, 82, 98, 80,
+  77, 90, 120, 74, 83, 76, 82, 86, 77, 79,
+  90, 91, 64, 74, 97, 80, 79, 92, 96, 79,
+  79, 90, 87, 80, 79, 89, 96, 89, 81, 102,
+  86, 79, 61, 74, 82, 80, 83, 85, 94, 101,
+  83, 79, 82, 83, 78, 72, 96, 90, 110, 74,
+  104, 82, 85, 86, 77, 85, 93, 76, 89, 88,
+  104, 77, 92, 69, 85, 80, 85, 74, 82, 80,
+  83, 99, 78, 77, 86, 89, 77, 85, 86, 82,
+  90, 89, 87, 76, 72, 94, 93, 84, 78, 82,
+  80, 91, 88, 91, 94, 67, 98, 91, 90, 69,
+  81, 73, 79, 81, 82, 90, 82, 80, 87, 69,
+  84, 79, 93, 90, 64, 84, 83, 85, 83, 93,
+  81, 69, 93, 74, 86, 91, 67, 87, 86, 82,
+  112, 83, 76, 85, 73, 81, 64, 92, 80, 83,
+  75, 81, 81, 85, 83, 79, 90, 82, 92, 84,
+  74, 73, 79, 86, 90, 82, 81, 101, 68, 82,
+  58, 81, 85, 81, 76, 89, 53, 75, 87, 81,
+  84, 82, 70, 56, 98, 83, 105, 90, 118, 81,
+  79, 85, 84, 73, 82, 79, 82, 83, 109, 93,
+  60, 82, 82, 87, 74, 80, 90, 74, 75, 97,
+  75, 77, 86, 87, 75, 92, 83, 87, 87, 81,
+  90, 82, 78, 89, 84, 81, 88, 76, 84, 93,
+  77, 94, 99, 67, 79, 87, 83, 64, 79, 76,
+  78, 69, 82, 87, 81, 81, 81, 73, 75, 77,
+  98, 92, 52, 78, 81, 85, 78, 87, 77, 67,
+  86, 84, 85, 86, 66, 88, 86, 78, 101, 85,
+  73, 86, 68, 80, 66, 95, 79, 85, 78, 81,
+  81, 82, 87, 76, 86, 87, 88, 84, 75, 74,
+  82, 87, 86, 80, 75, 107, 56, 85, 54, 83,
+  89, 79, 74, 94, 65, 68, 85, 79, 85, 80,
+  75, 60, 90, 79, 109, 97, 110, 79, 77, 88,
+  79, 71, 74, 81, 80, 83, 96, 103, 56, 84,
+  79, 86, 73, 81, 87, 76, 70, 93, 78, 82,
+  87, 86, 77, 86, 79, 82, 87, 77, 83, 83,
+  76, 91, 84, 80, 88, 78, 84, 94, 75, 83,
+  95, 71, 93, 85, 85, 67, 83, 81, 86, 77,
+  82, 88, 81, 83, 83, 73, 79, 83, 89, 91,
+  58, 82, 81, 81, 79, 88, 81, 66, 86, 86,
+  87, 92, 69, 88, 87, 82, 102, 84, 75, 84,
+  69, 80, 75, 91, 82, 82, 75, 81, 93, 83,
+  84, 80, 89, 83, 85, 88, 74, 80, 83, 85,
+  82, 83, 85, 96, 67, 82, 59, 80, 90, 75,
+  78, 87, 82, 72, 89, 86, 86, 81, 74, 64,
+  98, 82, 100, 95, 97, 77, 78, 85, 74, 72,
+  82, 81, 81, 87, 83, 96, 58, 79, 83, 85,
+  73, 78, 87, 85, 85, 87, 82, 97, 83, 83,
+  86, 86, 73, 82, 96, 83, 88, 79, 61, 101,
+  75, 92, 70, 76, 87, 107, 90, 81, 92, 71,
+  85, 88, 80, 77, 90, 90, 89, 83, 81, 83,
+  75, 90, 69, 84, 85, 80, 94, 90, 75, 83,
+  91, 83, 87, 86, 92, 56, 92, 78, 89, 91,
+  59, 85, 87, 96, 81, 93, 76, 94, 73, 79,
+  73, 87, 86, 86, 87, 82, 87, 91, 91, 82,
+  84, 81, 82, 84, 69, 82, 85, 90, 90, 78,
+  83, 97, 68, 79, 70, 84, 87, 83, 79, 90,
+  67, 68, 79, 88, 82, 85, 70, 77, 90, 84,
+  91, 105, 105, 78, 78, 89, 83, 82, 80, 85,
+  82, 86, 90, 92, 43, 83, 90, 96, 68, 80,
+  90, 83, 80, 88, 87, 102, 80, 79, 83, 92,
+  72, 87, 95, 81, 88, 87, 66, 92, 68, 93,
+  80, 75, 100, 107, 82, 79, 85, 70, 80, 87,
+  77, 73, 83, 90, 87, 80, 85, 86, 78, 93,
+  70, 85, 74, 83, 93, 89, 73, 78, 89, 84,
+  80, 83, 88, 61, 92, 83, 88, 88, 61, 85,
+  91, 90, 77, 94, 77, 95, 74, 78, 80, 90,
+  85, 85, 88, 81, 92, 85, 94, 81, 79, 82,
+  79, 85, 66, 74, 93, 92, 90, 88, 78, 87,
+  57, 84, 67, 86, 91, 79, 85, 90, 82, 68,
+  76, 93, 84, 82, 76, 76, 84, 83, 83, 109,
+  94, 79, 79, 89, 81, 88, 81, 87, 81, 86,
+  77, 96, 41, 86, 93, 93, 74, 84, 92, 79,
+  80, 90, 83, 93, 83, 78, 83, 83, 69, 86,
+  93, 76, 82, 85, 61, 93, 75, 86, 84, 76,
+  92, 105, 81, 79, 88, 71, 81, 88, 82, 73,
+  88, 90, 88, 81, 81, 83, 80, 91, 74, 86,
+  75, 82, 91, 85, 73, 82, 87, 80, 84, 85,
+  89, 61, 92, 88, 92, 91, 60, 84, 87, 92,
+  82, 91, 74, 92, 64, 77, 78, 85, 79, 83,
+  83, 82, 93, 91, 88, 80, 80, 78, 77, 86,
+  71, 74, 91, 90, 84, 85, 85, 91, 72, 82,
+  69, 82, 88, 76, 83, 87, 91, 75, 81, 90,
+  86, 83, 72, 75, 89, 84, 87, 101, 92, 76,
+  74, 86, 80, 79, 90, 85, 83, 85, 83, 87,
+  53, 87, 93, 90, 69, 77, 88, 84, 86, 87,
+  74, 85, 73, 81, 78, 91, 88, 85, 79, 70,
+  82, 82, 77, 104, 86, 81, 86, 73, 87, 86,
+  95, 83, 73, 78, 92, 99, 101, 84, 82, 84,
+  90, 78, 87, 81, 83, 83, 79, 83, 77, 81,
+  74, 71, 90, 84, 79, 88, 70, 86, 88, 80,
+  86, 71, 70, 78, 65, 85, 89, 85, 88, 84,
+  76, 87, 84, 85, 88, 95, 70, 82, 75, 93,
+  80, 76, 84, 85, 93, 85, 84, 72, 72, 90,
+  93, 73, 92, 96, 74, 78, 78, 74, 70, 71,
+  75, 81, 86, 84, 70, 68, 76, 79, 87, 78,
+  87, 94, 80, 89, 72, 95, 80, 86, 99, 72,
+  86, 79, 81, 90, 90, 105, 92, 88, 80, 90,
+  81, 89, 91, 80, 80, 86, 72, 86, 79, 73,
+  77, 85, 79, 87, 87, 82, 76, 72, 80, 83,
+  77, 96, 86, 83, 80, 82, 79, 81, 84, 87,
+  75, 78, 87, 95, 103, 88, 83, 79, 91, 75,
+  92, 79, 72, 79, 76, 83, 88, 87, 76, 71,
+  93, 82, 76, 86, 79, 86, 90, 86, 81, 77,
+  72, 77, 64, 89, 97, 92, 88, 88, 71, 87,
+  82, 87, 93, 79, 74, 77, 73, 92, 85, 78,
+  85, 89, 104, 85, 88, 72, 76, 81, 93, 73,
+  78, 93, 77, 80, 76, 78, 74, 69, 81, 77,
+  90, 90, 81, 72, 74, 81, 84, 80, 86, 92,
+  85, 89, 78, 92, 78, 89, 95, 77, 81, 76,
+  71, 89, 92, 108, 90, 90, 83, 89, 82, 86,
+  93, 82, 85, 83, 66, 86, 79, 81, 74, 88,
+  83, 91, 88, 83, 75, 81, 82, 85, 85, 105,
+  85, 83, 78, 84, 87, 84, 69, 82, 78, 81,
+  87, 88, 91, 87, 85, 84, 99, 76, 92, 80,
+  69, 81, 79, 85, 95, 84, 76, 74, 90, 87,
+  73, 89, 74, 86, 88, 78, 92, 83, 68, 76,
+  69, 86, 90, 83, 87, 83, 85, 88, 75, 88,
+  92, 82, 88, 85, 79, 90, 93, 77, 82, 93,
+  102, 89, 87, 70, 77, 72, 89, 71, 77, 95,
+  77, 84, 77, 87, 73, 75, 90, 82, 84, 88,
+  84, 73, 81, 88, 88, 79, 83, 91, 81, 89,
+  69, 97, 77, 90, 95, 95, 77, 76, 70, 88,
+  87, 103, 83, 84, 85, 92, 78, 80, 92, 81,
+  80, 85, 95, 104, 74, 88, 79, 71, 97, 82,
+  74, 80, 90, 68, 72, 108, 81, 82, 76, 77,
+  88, 71, 79, 89, 98, 83, 80, 68, 89, 86,
+  95, 78, 80, 86, 85, 74, 79, 90, 92, 82,
+  79, 90, 70, 96, 72, 91, 101, 82, 84, 77,
+  77, 86, 86, 91, 77, 83, 77, 85, 77, 100,
+  77, 81, 70, 80, 71, 76, 94, 86, 91, 60,
+  77, 77, 69, 75, 78, 76, 88, 101, 85, 89,
+  81, 86, 84, 77, 97, 91, 87, 71, 90, 73,
+  59, 78, 69, 78, 59, 71, 88, 70, 73, 82,
+  61, 84, 86, 70, 87, 111, 83, 83, 70, 75,
+  83, 73, 87, 66, 97, 83, 81, 87, 95, 103,
+  90, 83, 80, 91, 91, 88, 79, 81, 66, 88,
+  83, 94, 79, 79, 78, 76, 99, 77, 73, 79,
+  67, 82, 70, 108, 78, 75, 68, 79, 75, 95,
+  77, 91, 78, 81, 88, 67, 81, 79, 84, 75,
+  74, 88, 72, 67, 84, 93, 81, 83, 88, 85,
+  71, 85, 72, 81, 100, 87, 80, 73, 85, 101,
+  92, 92, 73, 90, 90, 84, 79, 103, 83, 106,
+  73, 90, 71, 85, 95, 93, 105, 58, 85, 68,
+  68, 69, 77, 83, 83, 83, 94, 91, 80, 89,
+  91, 75, 92, 101, 71, 61, 90, 69, 66, 82,
+  70, 72, 66, 63, 85, 78, 84, 104, 63, 94,
+  82, 74, 88, 126, 87, 75, 68, 67, 75, 76,
+  81, 64, 98, 80, 83, 91, 98, 105, 78, 81,
+  80, 85, 84, 83, 72, 88, 75, 102, 74, 101,
+  79, 83, 79, 75, 95, 83, 74, 80, 93, 92,
+  73, 110, 89, 85, 77, 78, 71, 76, 90, 91,
+  73, 85, 84, 73, 85, 84, 91, 88, 80, 93,
+  89, 68, 81, 89, 70, 88, 79, 90, 92, 98,
+  71, 81, 98, 98, 75, 80, 81, 86, 88, 89,
+  75, 83, 77, 91, 78, 98, 77, 78, 71, 81,
+  77, 77, 84, 85, 92, 61, 84, 74, 73, 73,
+  84, 74, 80, 85, 93, 91, 88, 83, 84, 76,
+  98, 94, 79, 70, 90, 78, 62, 80, 68, 80,
+  62, 68, 84, 75, 97, 71, 67, 96, 85, 72,
+  82, 105, 86, 81, 70, 80, 78, 81, 87, 89,
+  91, 72, 78, 88, 96, 102, 73, 82, 78, 90,
+  89, 80, 79, 82, 84, 93, 101, 100, 77, 93,
+  75, 79, 104, 80, 69, 82, 104, 82, 72, 94,
+  82, 64, 74, 82, 90, 91, 87, 77, 87, 80,
+  92, 73, 87, 81, 82, 79, 75, 74, 91, 91,
+  81, 89, 83, 85, 85, 100, 96, 90, 84, 91,
+  82, 88, 86, 82, 100, 84, 91, 99, 80, 73,
+  87, 78, 97, 98, 77, 81, 77, 73, 76, 71,
+  74, 93, 84, 71, 68, 79, 86, 84, 73, 97,
+  98, 108, 74, 90, 73, 89, 98, 79, 89, 93,
+  83, 69, 85, 77, 60, 91, 87, 77, 69, 67,
+  84, 75, 67, 102, 77, 86, 86, 68, 80, 111,
+  88, 79, 70, 81, 80, 69, 83, 75, 96, 90,
+  91, 86, 92, 127, 88, 87, 88, 80, 93, 79,
+  71, 88, 68, 80, 69, 77, 75, 95, 73, 77,
+  100, 79, 68, 79, 64, 82, 74, 79, 74, 60,
+  64, 79, 102, 120, 93, 79, 78, 76, 106, 74,
+  78, 75, 75, 72, 72, 77, 79, 84, 82, 93,
+  85, 76, 97, 95, 87, 71, 101, 99, 76, 90,
+  77, 79, 104, 92, 91, 91, 84, 86, 102, 69,
+  115, 106, 82, 112, 79, 81, 79, 80, 72, 108,
+  87, 72, 87, 75, 102, 89, 67, 117, 100, 92,
+  76, 87, 67, 81, 99, 85, 76, 94, 69, 64,
+  73, 74, 73, 99, 83, 76, 74, 58, 77, 91,
+  69, 135, 88, 100, 91, 72, 87, 140, 98, 68,
+  70, 73, 68, 71, 83, 72, 85, 102, 99, 93,
+  97, 149, 89, 83, 84, 73, 83, 73, 73, 99,
+  85, 81, 78, 93, 77, 83, 74, 75, 105, 82,
+  71, 76, 102, 76, 72, 99, 84, 63, 73, 76,
+  90, 78, 92, 82, 76, 80, 92, 75, 82, 90,
+  84, 91, 76, 95, 89, 78, 84, 90, 79, 89,
+  85, 89, 87, 90, 85, 90, 80, 98, 88, 85,
+  101, 79, 91, 94, 79, 96, 82, 84, 101, 99,
+  75, 80, 77, 70, 81, 73, 75, 90, 85, 71,
+  96, 78, 88, 85, 64, 93, 95, 83, 90, 89,
+  77, 89, 93, 94, 89, 93, 81, 71, 84, 80,
+  64, 92, 85, 79, 65, 65, 83, 77, 87, 87,
+  78, 94, 86, 70, 83, 104, 91, 77, 72, 82,
+  76, 70, 83, 96, 79, 86, 79, 88, 90, 121,
+  81, 90, 90, 79, 92, 75, 70, 87, 90, 88,
+  71, 70, 83, 78, 105, 82, 80, 69, 79, 84,
+  81, 90, 90, 87, 91, 100, 81, 90, 88, 85,
+  75, 93, 80, 85, 84, 73, 78, 76, 91, 87,
+  97, 77, 82, 79, 85, 82, 78, 80, 91, 68,
+  92, 84, 82, 85, 84, 93, 95, 85, 81, 82,
+  76, 92, 78, 90, 95, 91, 78, 86, 83, 92,
+  93, 73, 77, 91, 91, 88, 81, 85, 81, 80,
+  94, 84, 91, 78, 77, 77, 90, 91, 88, 88,
+  79, 74, 96, 77, 91, 77, 79, 85, 82, 81,
+  84, 90, 82, 96, 88, 83, 84, 82, 74, 90,
+  88, 84, 89, 90, 80, 89, 76, 78, 92, 99,
+  83, 89, 88, 100, 78, 89, 83, 86, 86, 88,
+  76, 82, 82, 86, 91, 86, 78, 92, 85, 87,
+  74, 83, 94, 84, 94, 77, 81, 75, 74, 101,
+  86, 94, 76, 69, 92, 90, 89, 88, 66, 101,
+  87, 85, 83, 78, 77, 69, 86, 86, 78, 79,
+  76, 82, 83, 86, 74, 65, 85, 51, 76, 83,
+  76, 89, 93, 87, 96, 72, 91, 91, 85, 74,
+  94, 83, 100, 80, 92, 85, 85, 92, 93, 76,
+  65, 63, 85, 76, 80, 79, 73, 79, 102, 83,
+  84, 82, 72, 75, 85, 70, 89, 85, 81, 70,
+  81, 83, 84, 94, 85, 84, 84, 84, 82, 88,
+  92, 69, 85, 80, 77, 83, 75, 78, 78, 83,
+  80, 89, 79, 87, 80, 71, 82, 86, 80, 90,
+  75, 99, 87, 83, 85, 86, 83, 85, 85, 82,
+  85, 83, 82, 78, 84, 81, 94, 87, 75, 95,
+  85, 84, 94, 88, 80, 73, 80, 112, 70, 87,
+  71, 62, 90, 87, 72, 88, 87, 101, 87, 82,
+  95, 84, 82, 80, 81, 92, 68, 76, 88, 99,
+  102, 89, 82, 75, 84, 63, 80, 85, 78, 96,
+  83, 102, 88, 70, 99, 96, 89, 68, 106, 85,
+  93, 70, 98, 84, 85, 80, 88, 70, 67, 65,
+  78, 73, 83, 79, 94, 95, 96, 94, 77, 80,
+  74, 80, 82, 78, 90, 87, 83, 87, 73, 90,
+  88, 102, 90, 80, 88, 91, 87, 80, 99, 70,
+  88, 76, 86, 92, 85, 93, 86, 82, 80, 91,
+  78, 87, 76, 70, 89, 75, 75, 96, 80, 96,
+  85, 85, 78, 94, 81, 82, 76, 79, 95, 91,
+  84, 83, 88, 88, 80, 87, 73, 79, 76, 79,
+  92, 82, 75, 85, 85, 112, 85, 95, 93, 87,
+  91, 85, 90, 85, 86, 100, 84, 86, 81, 82,
+  89, 74, 77, 87, 76, 68, 71, 76, 84, 86,
+  79, 92, 83, 68, 80, 81, 76, 91, 84, 90,
+  89, 77, 74, 89, 90, 72, 86, 66, 89, 67,
+  85, 81, 83, 78, 88, 54, 66, 61, 94, 81,
+  73, 100, 62, 78, 92, 81, 81, 85, 73, 79,
+  72, 85, 91, 86, 89, 75, 78, 85, 95, 88,
+  83, 87, 86, 78, 80, 93, 95, 77, 82, 81,
+  75, 84, 75, 71, 80, 81, 84, 75, 83, 87,
+  74, 71, 87, 76, 81, 95, 83, 103, 88, 84,
+  77, 95, 88, 86, 84, 80, 89, 79, 87, 85,
+  76, 69, 124, 86, 73, 94, 64, 76, 95, 88,
+  68, 77, 80, 143, 77, 75, 79, 73, 88, 83,
+  83, 92, 114, 99, 88, 76, 92, 79, 146, 82,
+  77, 86, 54, 69, 68, 79, 97, 78, 68, 74,
+  91, 61, 64, 80, 81, 93, 94, 96, 80, 73,
+  74, 109, 94, 58, 97, 46, 92, 53, 89, 75,
+  94, 84, 85, 51, 46, 52, 80, 71, 79, 111,
+  41, 74, 85, 88, 82, 72, 74, 80, 79, 69,
+  84, 83, 86, 88, 70, 91, 90, 116, 80, 82,
+  73, 72, 84, 75, 91, 63, 79, 73, 64, 75,
+  79, 60, 76, 81, 75, 86, 90, 87, 81, 69,
+  93, 67, 72, 91, 97, 96, 120, 74, 71, 92,
+  76, 86, 68, 72, 91, 83, 78, 87, 77, 64,
+  92, 78, 81, 87, 76, 81, 88, 88, 77, 76,
+  91, 101, 90, 74, 78, 83, 87, 85, 84, 80,
+  102, 92, 103, 99, 82, 78, 114, 86, 79, 93,
+  67, 73, 93, 88, 112, 83, 80, 78, 85, 71,
+  78, 84, 89, 100, 84, 89, 75, 79, 87, 93,
+  95, 74, 99, 66, 88, 64, 88, 88, 93, 88,
+  89, 59, 62, 63, 81, 87, 79, 82, 74, 88,
+  85, 92, 91, 82, 72, 78, 84, 88, 87, 88,
+  86, 93, 72, 83, 91, 88, 75, 99, 87, 74,
+  86, 87, 92, 81, 94, 90, 78, 78, 82, 72,
+  87, 81, 87, 88, 72, 91, 79, 70, 88, 67,
+  81, 88, 93, 80, 79, 84, 69, 83, 83, 81,
+  75, 79, 101, 87, 89, 93, 87, 86, 70, 81,
+  82, 94, 74, 83, 96, 94, 77, 75, 81, 112,
+  65, 79, 89, 65, 89, 85, 75, 94, 82, 93,
+  77, 84, 88, 90, 88, 77, 79, 89, 58, 66,
+  88, 91, 94, 85, 90, 91, 82, 71, 82, 77,
+  75, 83, 79, 93, 93, 69, 87, 85, 87, 70,
+  99, 80, 86, 67, 101, 84, 87, 86, 94, 67,
+  74, 67, 83, 81, 82, 93, 93, 83, 92, 84,
+  82, 87, 74, 108, 91, 75, 92, 79, 93, 80,
+  75, 93, 88, 108, 84, 79, 92, 81, 87, 81,
+  100, 71, 79, 79, 85, 93, 86, 88, 97, 82,
+  87, 75, 79, 103, 90, 69, 72, 78, 83, 94,
+  88, 100, 96, 80, 80, 93, 85, 92, 81, 78,
+  94, 85, 86, 89, 74, 76, 85, 81, 74, 97,
+  82, 82, 95, 89, 79, 74, 78, 96, 82, 76,
+  85, 79, 94, 82, 82, 79, 85, 91, 87, 95,
+  81, 80, 102, 70, 89, 82, 67, 86, 81, 86,
+  84, 88, 76, 75, 92, 62, 68, 75, 81, 88,
+  91, 89, 86, 76, 98, 81, 94, 76, 96, 72,
+  89, 78, 88, 92, 90, 90, 91, 79, 67, 60,
+  82, 91, 86, 76, 71, 73, 95, 91, 90, 87,
+  83, 86, 95, 67, 95, 85, 89, 79, 78, 89,
+  85, 90, 89, 86, 96, 78, 90, 86, 99, 71,
+  87, 88, 77, 87, 82, 84, 86, 80, 84, 87,
+  77, 102, 87, 73, 77, 86, 77, 80, 90, 81,
+  87, 78, 77, 79, 79, 84, 77, 81, 88, 91,
+  85, 86, 85, 82, 68, 78, 81, 81, 95, 89,
+  75, 85, 82, 82, 80, 70, 98, 85, 86, 96,
+  79, 90, 86, 78, 89, 78, 81, 96, 80, 73,
+  61, 67, 89, 86, 96, 86, 97, 87, 81, 84,
+  83, 77, 78, 66, 83, 84, 82, 89, 81, 86,
+  88, 84, 86, 78, 87, 88, 87, 81, 81, 93,
+  73, 81, 86, 93, 86, 82, 84, 83, 90, 81,
+  90, 83, 86, 80, 79, 93, 90, 77, 82, 90,
+  92, 79, 99, 86, 83, 76, 85, 85, 80, 74,
+  78, 86, 96, 76, 93, 92, 80, 80, 94, 90,
+  81, 79, 74, 93, 84, 85, 73, 85, 63, 96,
+  62, 70, 84, 88, 75, 83, 98, 77, 56, 88,
+  73, 76, 72, 82, 69, 79, 78, 91, 80, 90,
+  95, 94, 79, 93, 88, 81, 85, 89, 73, 82,
+  84, 85, 79, 81, 81, 77, 82, 84, 116, 76,
+  90, 83, 77, 89, 83, 86, 75, 119, 96, 76,
+  72, 84, 81, 81, 85, 78, 81, 80, 82, 84,
+  88, 79, 82, 88, 92, 93, 82, 79, 88, 77,
+  82, 71, 77, 81, 80, 81, 80, 75, 83, 81,
+  74, 73, 90, 82, 89, 86, 84, 75, 88, 73,
+  79, 77, 83, 68, 85, 72, 84, 79, 80, 82,
+  84, 75, 78, 88, 81, 79, 82, 78, 90, 82,
+  71, 88, 87, 85, 82, 93, 115, 75, 78, 99,
+  77, 84, 84, 77, 76, 81, 73, 84, 84, 85,
+  84, 92, 88, 81, 88, 87, 86, 97, 81, 80,
+  68, 89, 81, 105, 75, 82, 94, 72, 93, 85,
+  80, 95, 87, 82, 76, 99, 75, 104, 90, 87,
+  83, 84, 78, 75, 86, 75, 139, 80, 85, 84,
+  82, 94, 84, 79, 76, 130, 77, 77, 67, 75,
+  87, 84, 80, 88, 76, 77, 82, 75, 89, 78,
+  83, 83, 97, 96, 78, 81, 91, 78, 84, 67,
+  74, 83, 74, 84, 83, 74, 81, 83, 73, 76,
+  94, 79, 90, 84, 78, 71, 82, 73, 79, 78,
+  90, 69, 80, 78, 91, 81, 78, 89, 82, 73,
+  81, 84, 79, 78, 81, 81, 86, 77, 76, 88,
+  87, 80, 82, 93, 133, 76, 80, 102, 76, 81,
+  115, 79, 74, 76, 76, 89, 79, 83, 83, 91,
+  101, 85, 88, 85, 89, 105, 88, 84, 75, 85,
+  77, 121, 76, 79, 99, 78, 92, 83, 84, 85,
+  88, 77, 86, 90, 73, 80, 86, 84, 82, 82,
+  81, 77, 83, 83, 112, 81, 87, 82, 83, 90,
+  90, 86, 79, 114, 93, 82, 69, 78, 83, 82,
+  84, 88, 79, 78, 79, 82, 84, 76, 86, 87,
+  95, 87, 78, 79, 91, 80, 76, 72, 78, 76,
+  79, 87, 84, 75, 81, 81, 73, 73, 89, 82,
+  92, 87, 84, 75, 90, 82, 84, 79, 82, 75,
+  84, 72, 83, 80, 76, 80, 85, 74, 75, 79,
+  79, 80, 76, 78, 89, 81, 71, 80, 91, 88,
+  72, 93, 109, 72, 86, 93, 78, 77, 82, 78,
+  75, 82, 75, 83, 84, 86, 81, 90, 93, 81,
+  85, 87, 82, 94, 80, 78, 80, 88, 79, 103,
+  77, 85, 93, 71, 91, 91, 77, 100, 89, 73,
+  83, 83, 72, 95, 92, 82, 75, 80, 79, 80,
+  85, 86, 127, 79, 92, 86, 85, 90, 84, 82,
+  73, 126, 79, 77, 70, 85, 88, 85, 75, 76,
+  85, 77, 82, 77, 86, 72, 81, 83, 86, 90,
+  82, 79, 88, 77, 78, 73, 76, 81, 75, 76,
+  83, 71, 86, 79, 74, 72, 88, 78, 94, 87,
+  84, 76, 89, 74, 83, 70, 78, 70, 87, 78,
+  83, 76, 87, 79, 81, 75, 78, 86, 84, 78,
+  80, 77, 85, 78, 67, 84, 80, 79, 87, 90,
+  119, 79, 83, 90, 87, 84, 101, 77, 71, 80,
+  74, 85, 87, 86, 79, 88, 86, 81, 86, 92,
+  89, 100, 85, 87, 79, 91, 85, 116, 72, 82,
+  93, 78, 99, 84, 83, 116, 94, 78, 72, 96,
+  78, 134, 101, 89, 81, 82, 79, 76, 90, 75,
+  172, 82, 88, 95, 81, 96, 89, 76, 76, 147,
+  59, 78, 68, 80, 100, 93, 72, 94, 91, 76,
+  85, 67, 82, 75, 79, 74, 88, 89, 77, 74,
+  88, 81, 76, 67, 75, 86, 74, 79, 93, 70,
+  84, 83, 76, 70, 93, 86, 86, 86, 78, 76,
+  86, 73, 74, 72, 85, 69, 82, 97, 97, 80,
+  78, 82, 78, 75, 92, 81, 88, 69, 80, 85,
+  81, 79, 78, 79, 76, 74, 101, 83, 150, 80,
+  79, 95, 88, 79, 152, 79, 71, 86, 78, 89,
+  91, 86, 76, 81, 105, 80, 87, 88, 84, 115,
+  93, 90, 86, 93, 84, 141, 76, 76, 105, 89,
+  86, 80, 91, 94, 89, 83, 84, 86, 73, 95,
+  94, 84, 79, 84, 79, 80, 85, 90, 126, 80,
+  90, 84, 80, 90, 91, 83, 76, 122, 78, 78,
+  73, 84, 91, 88, 82, 95, 81, 75, 78, 75,
+  84, 72, 89, 83, 88, 91, 81, 72, 89, 82,
+  71, 71, 78, 80, 74, 82, 85, 72, 79, 83,
+  77, 76, 89, 81, 94, 86, 85, 78, 89, 80,
+  82, 73, 77, 77, 83, 77, 83, 77, 79, 77,
+  81, 72, 79, 82, 83, 78, 81, 76, 84, 79,
+  69, 82, 81, 80, 75, 92, 113, 76, 86, 88,
+  88, 82, 94, 79, 71, 78, 76, 81, 86, 88,
+  79, 90, 92, 79, 83, 94, 77, 94, 84, 87,
+  84, 91, 81, 111, 76, 87, 95, 77, 88, 90,
+  81, 89, 85, 77, 90, 71, 76, 79, 89, 81,
+  81, 77, 78, 79, 87, 90, 107, 77, 83, 82,
+  80, 96, 90, 80, 75, 116, 98, 82, 75, 89,
+  81, 85, 77, 81, 84, 77, 87, 75, 86, 86,
+  81, 84, 89, 86, 86, 81, 82, 80, 83, 76,
+  82, 75, 75, 79, 82, 74, 89, 83, 76, 77,
+  85, 81, 91, 85, 78, 75, 88, 79, 82, 77,
+  71, 77, 89, 78, 76, 74, 88, 87, 80, 82,
+  73, 78, 88, 79, 77, 78, 85, 77, 67, 82,
+  87, 87, 84, 85, 110, 80, 89, 96, 81, 85,
+  74, 74, 72, 77, 73, 83, 73, 86, 82, 96,
+  81, 84, 83, 94, 82, 94, 85, 80, 82, 90,
+  81, 85, 75, 94, 82, 72, 89, 86, 91, 96,
+  93, 77, 83, 74, 80, 91, 85, 80, 78, 81,
+  88, 79, 88, 88, 115, 79, 85, 84, 80, 101,
+  93, 79, 76, 118, 78, 78, 68, 86, 84, 91,
+  76, 86, 83, 78, 88, 71, 84, 84, 82, 81,
+  86, 89, 86, 83, 87, 81, 81, 72, 82, 79,
+  71, 78, 87, 74, 88, 84, 73, 75, 87, 77,
+  94, 84, 78, 72, 94, 87, 80, 71, 73, 82,
+  93, 83, 80, 79, 85, 89, 80, 81, 74, 76,
+  87, 73, 83, 78, 84, 77, 69, 81, 86, 80,
+  91, 82, 116, 77, 90, 95, 86, 78, 92, 75,
+  72, 84, 75, 84, 74, 87, 84, 95, 88, 85,
+  83, 94, 79, 94, 83, 79, 84, 91, 81, 96,
+  79, 103, 86, 74, 86, 85, 88, 83, 86, 74,
+  92, 74, 76, 81, 90, 84, 80, 82, 80, 79,
+  85, 89, 107, 79, 84, 85, 80, 94, 89, 81,
+  74, 111, 94, 74, 81, 83, 80, 89, 82, 81,
+  83, 76, 79, 77, 86, 88, 82, 83, 91, 88,
+  83, 83, 81, 81, 81, 77, 79, 72, 75, 77,
+  85, 75, 87, 86, 79, 79, 87, 81, 91, 87,
+  79, 76, 90, 82, 81, 78, 74, 82, 86, 80,
+  78, 81, 83, 86, 81, 83, 71, 75, 89, 81,
+  82, 76, 86, 74, 65, 81, 88, 87, 80, 88,
+  110, 81, 90, 94, 83, 79, 72, 74, 73, 76,
+  75, 81, 73, 90, 87, 95, 83, 80, 85, 97,
+  74, 92, 85, 77, 85, 90, 77, 87, 79, 100,
+  86, 72, 89, 77, 78, 93, 66, 85, 95, 85,
+  69, 75, 88, 76, 69, 74, 89, 85, 77, 85,
+  84, 92, 82, 76, 81, 80, 76, 90, 90, 75,
+  90, 102, 88, 85, 84, 77, 80, 70, 72, 80,
+  73, 78, 76, 89, 83, 99, 76, 85, 84, 89,
+  93, 105, 71, 82, 90, 99, 84, 83, 71, 105,
+  73, 80, 85, 81, 72, 81, 89, 109, 100, 74,
+  82, 86, 81, 91, 80, 80, 88, 101, 95, 79,
+  71, 98, 108, 61, 77, 84, 92, 76, 81, 68,
+  100, 70, 91, 86, 79, 73, 92, 83, 85, 80,
+  78, 77, 94, 87, 79, 85, 87, 76, 80, 113,
+  75, 69, 86, 68, 75, 85, 85, 94, 95, 80,
+  87, 73, 56, 78, 71, 77, 113, 87, 74, 95,
+  85, 81, 76, 87, 63, 80, 98, 90, 72, 75,
+  93, 78, 72, 71, 90, 88, 82, 81, 88, 99,
+  80, 74, 82, 82, 80, 97, 90, 78, 81, 87,
+  85, 85, 85, 76, 85, 84, 74, 84, 74, 92,
+  78, 92, 85, 100, 81, 79, 83, 83, 91, 111,
+  65, 79, 93, 102, 89, 80, 75, 98, 76, 80,
+  78, 84, 67, 82, 82, 106, 95, 82, 77, 84,
+  79, 92, 85, 81, 91, 108, 96, 85, 77, 103,
+  106, 57, 75, 83, 102, 77, 84, 65, 103, 74,
+  92, 84, 82, 76, 87, 84, 91, 81, 83, 79,
+  99, 96, 86, 81, 89, 72, 81, 114, 82, 69,
+  85, 68, 79, 84, 88, 89, 85, 79, 88, 76,
+  60, 74, 74, 79, 123, 92, 73, 97, 89, 77,
+  77, 88, 68, 82, 94, 92, 66, 77, 86, 77,
+  72, 72, 91, 82, 78, 82, 82, 103, 81, 80,
+  87, 82, 75, 88, 96, 75, 82, 82, 87, 81,
+  86, 75, 94, 83, 72, 81, 78, 78, 79, 87,
+  89, 91, 79, 80, 80, 83, 91, 103, 72, 77,
+  92, 98, 82, 83, 70, 104, 77, 77, 85, 82,
+  71, 84, 92, 102, 96, 76, 81, 87, 79, 90,
+  82, 82, 86, 91, 91, 92, 79, 95, 106, 64,
+  80, 80, 92, 74, 82, 73, 96, 70, 91, 82,
+  80, 74, 81, 81, 84, 81, 87, 81, 93, 103,
+  79, 85, 86, 76, 82, 109, 81, 73, 83, 70,
+  76, 80, 84, 86, 84, 78, 87, 77, 65, 76,
+  69, 79, 107, 88, 77, 97, 96, 80, 75, 86,
+  75, 90, 95, 81, 77, 75, 91, 82, 79, 74,
+  87, 82, 74, 84, 80, 99, 75, 81, 76, 82,
+  80, 86, 84, 70, 77, 88, 84, 76, 84, 83,
+  87, 72, 73, 84, 77, 76, 81, 82, 85, 97,
+  81, 87, 75, 95, 95, 98, 69, 82, 97, 98,
+  88, 82, 78, 106, 73, 95, 94, 75, 76, 86,
+  88, 109, 84, 76, 89, 87, 84, 97, 75, 68,
+  85, 103, 91, 83, 67, 92, 106, 65, 79, 85,
+  92, 78, 80, 64, 85, 75, 87, 80, 81, 79,
+  97, 84, 79, 88, 73, 82, 95, 84, 79, 86,
+  84, 83, 82, 114, 80, 70, 83, 68, 76, 89,
+  86, 87, 96, 78, 85, 80, 59, 80, 81, 75,
+  122, 80, 77, 85, 95, 82, 79, 79, 71, 82,
+  101, 88, 83, 72, 97, 83, 78, 76, 93, 92,
+  78, 86, 78, 108, 81, 80, 78, 88, 82, 95,
+  81, 72, 71, 75, 81, 82, 80, 80, 89, 86,
+  76, 90, 73, 91, 86, 86, 84, 100, 84, 82,
+  74, 88, 100, 107, 66, 86, 100, 103, 97, 77,
+  82, 100, 77, 105, 89, 77, 72, 88, 81, 106,
+  84, 85, 85, 86, 81, 100, 79, 71, 90, 106,
+  93, 83, 68, 95, 103, 67, 75, 79, 101, 81,
+  86, 59, 88, 75, 87, 79, 82, 83, 95, 87,
+  86, 85, 76, 83, 92, 92, 83, 84, 89, 80,
+  81, 115, 82, 70, 84, 68, 82, 87, 85, 84,
+  80, 77, 85, 81, 60, 78, 84, 76, 130, 84,
+  74, 84, 96, 77, 82, 83, 81, 88, 93, 92,
+  76, 77, 87, 83, 75, 77, 89, 80, 78, 83,
+  76, 111, 84, 87, 83, 85, 79, 88, 90, 71,
+  72, 80, 83, 80, 81, 76, 93, 83, 75, 83,
+  74, 80, 81, 80, 83, 91, 80, 82, 74, 92,
+  94, 96, 70, 84, 100, 101, 87, 81, 75, 108,
+  74, 86, 94, 77, 76, 89, 89, 105, 86, 74,
+  86, 89, 82, 91, 80, 70, 87, 92, 89, 95,
+  74, 93, 107, 71, 82, 75, 92, 76, 84, 72,
+  85, 70, 85, 80, 80, 80, 83, 84, 80, 91,
+  80, 81, 91, 98, 79, 86, 86, 80, 79, 108,
+  81, 73, 80, 71, 79, 79, 86, 80, 82, 76,
+  86, 81, 66, 78, 82, 75, 117, 80, 79, 83,
+  96, 79, 83, 88, 64, 88, 87, 77, 71, 80,
+  85, 89, 79, 73, 87, 81, 72, 77, 86, 92,
+  74, 75, 79, 86, 76, 82, 81, 73, 84, 87,
+  83, 78, 92, 84, 94, 71, 78, 82, 87, 66,
+  78, 89, 90, 94, 84, 87, 72, 96, 86, 109,
+  71, 89, 95, 95, 87, 85, 75, 96, 80, 89,
+  99, 76, 77, 84, 88, 105, 80, 74, 89, 91,
+  85, 100, 75, 73, 78, 100, 90, 87, 78, 93,
+  107, 70, 77, 78, 86, 79, 79, 72, 88, 79,
+  88, 83, 85, 73, 95, 85, 78, 90, 75, 77,
+  104, 81, 76, 87, 85, 83, 81, 105, 77, 76,
+  87, 72, 74, 86, 80, 85, 83, 77, 80, 85,
+  68, 74, 71, 77, 110, 80, 77, 90, 95, 81,
+  90, 84, 65, 85, 92, 82, 74, 75, 89, 89,
+  78, 78, 86, 89, 74, 75, 86, 102, 84, 75,
+  83, 87, 76, 89, 80, 74, 79, 79, 87, 82,
+  87, 86, 84, 81, 80, 87, 78, 80, 76, 98,
+  87, 99, 87, 83, 73, 93, 89, 109, 70, 93,
+  95, 98, 93, 82, 82, 91, 81, 88, 97, 77,
+  77, 85, 86, 109, 79, 75, 86, 93, 81, 100,
+  81, 77, 80, 95, 89, 88, 77, 99, 104, 73,
+  73, 78, 92, 84, 82, 65, 94, 80, 86, 84,
+  83, 74, 94, 88, 81, 87, 78, 78, 101, 81,
+  81, 86, 85, 78, 76, 107, 76, 74, 90, 71,
+  79, 84, 81, 80, 80, 77, 82, 84, 69, 75,
+  70, 77, 118, 79, 78, 84, 95, 79, 89, 88,
+  70, 86, 87, 85, 70, 79, 82, 85, 75, 79,
+  83, 74, 71, 79, 84, 104, 85, 75, 83, 89,
+  72, 86, 86, 73, 82, 86, 89, 81, 89, 77,
+  94, 79, 82, 81, 74, 70, 75, 89, 80, 91,
+  83, 83, 76, 90, 88, 106, 72, 86, 96, 94,
+  82, 86, 76, 98, 77, 82, 100, 78, 77, 86,
+  87, 105, 81, 73, 85, 94, 85, 96, 82, 73,
+  80, 94, 89, 89, 82, 94, 108, 74, 78, 79,
+  86, 80, 85, 79, 91, 76, 90, 82, 84, 73,
+  83, 86, 80, 91, 78, 75, 97, 87, 75, 87,
+  86, 81, 78, 102, 79, 76, 85, 74, 78, 77,
+  81, 84, 84, 77, 81, 86, 74, 77, 73, 77,
+  110, 80, 76, 87, 77, 76, 84, 67, 64, 80,
+  78, 96, 76, 88, 92, 75, 84, 95, 63, 80,
+  84, 94, 77, 91, 92, 86, 97, 87, 74, 81,
+  83, 92, 94, 76, 93, 74, 84, 83, 78, 95,
+  88, 79, 80, 68, 88, 72, 82, 77, 96, 75,
+  63, 86, 86, 86, 82, 94, 78, 79, 89, 88,
+  83, 82, 85, 89, 68, 78, 84, 87, 63, 83,
+  91, 86, 80, 99, 87, 73, 92, 89, 74, 84,
+  73, 77, 72, 77, 85, 84, 78, 83, 75, 90,
+  86, 89, 69, 91, 91, 90, 76, 92, 104, 86,
+  84, 74, 87, 104, 89, 79, 83, 80, 74, 71,
+  77, 80, 77, 82, 94, 95, 95, 78, 77, 77,
+  89, 74, 79, 91, 87, 82, 80, 95, 82, 90,
+  94, 83, 83, 81, 87, 67, 62, 89, 75, 96,
+  79, 87, 90, 71, 84, 88, 65, 72, 92, 97,
+  83, 84, 85, 72, 92, 87, 92, 75, 84, 97,
+  104, 79, 98, 81, 84, 80, 83, 83, 96, 83,
+  89, 68, 90, 78, 87, 76, 94, 78, 73, 86,
+  79, 85, 82, 97, 78, 83, 98, 86, 77, 78,
+  74, 87, 70, 71, 77, 79, 57, 80, 87, 78,
+  72, 102, 88, 72, 78, 88, 78, 75, 77, 86,
+  67, 77, 92, 83, 80, 84, 76, 92, 84, 93,
+  76, 87, 75, 106, 71, 88, 103, 79, 98, 75,
+  82, 103, 91, 77, 79, 77, 75, 65, 83, 70,
+  84, 83, 94, 97, 97, 82, 80, 78, 90, 73,
+  84, 89, 80, 81, 80, 87, 74, 91, 100, 82,
+  76, 80, 86, 64, 68, 97, 76, 96, 76, 90,
+  88, 78, 82, 77, 64, 84, 87, 83, 72, 87,
+  89, 86, 81, 87, 82, 82, 82, 90, 80, 76,
+  93, 89, 81, 93, 77, 83, 93, 77, 90, 70,
+  91, 73, 88, 76, 95, 83, 69, 80, 84, 84,
+  74, 89, 75, 83, 87, 78, 81, 84, 85, 88,
+  75, 85, 81, 84, 71, 88, 85, 90, 78, 85,
+  85, 74, 94, 87, 75, 86, 79, 87, 70, 82,
+  87, 83, 88, 89, 74, 85, 82, 86, 77, 94,
+  88, 103, 78, 96, 109, 90, 76, 77, 73, 105,
+  85, 72, 85, 78, 76, 73, 74, 82, 78, 83,
+  100, 93, 95, 89, 83, 85, 85, 77, 81, 95,
+  78, 84, 77, 93, 78, 89, 91, 82, 100, 85,
+  88, 76, 78, 78, 85, 89, 72, 86, 92, 73,
+  89, 104, 69, 72, 92, 100, 89, 92, 74, 82,
+  113, 84, 88, 84, 81, 91, 107, 87, 88, 90,
+  79, 83, 77, 98, 103, 84, 77, 73, 91, 73,
+  75, 77, 69, 83, 98, 85, 88, 81, 84, 89,
+  75, 84, 85, 83, 73, 82, 76, 89, 78, 75,
+  99, 77, 67, 67, 92, 84, 101, 101, 77, 75,
+  80, 84, 82, 75, 78, 87, 80, 80, 89, 85,
+  75, 85, 79, 98, 91, 89, 73, 73, 72, 83,
+  81, 90, 86, 66, 92, 75, 104, 85, 87, 87,
+  85, 77, 86, 59, 88, 86, 84, 79, 72, 80,
+  90, 88, 84, 81, 103, 81, 92, 80, 84, 68,
+  93, 87, 87, 81, 92, 75, 110, 91, 85, 81,
+  84, 81, 87, 90, 70, 79, 91, 62, 94, 94,
+  72, 65, 98, 99, 97, 87, 77, 70, 85, 86,
+  106, 79, 78, 88, 119, 89, 89, 117, 84, 84,
+  80, 88, 106, 93, 85, 80, 88, 69, 71, 82,
+  62, 85, 123, 85, 83, 79, 89, 95, 74, 94,
+  75, 77, 60, 78, 59, 92, 86, 72, 96, 78,
+  63, 63, 97, 90, 103, 82, 85, 68, 67, 75,
+  105, 64, 85, 90, 75, 78, 98, 85, 75, 84,
+  87, 101, 94, 87, 80, 67, 66, 87, 74, 94,
+  73, 65, 96, 77, 100, 82, 75, 95, 83, 77,
+  97, 46, 101, 78, 88, 76, 76, 76, 88, 91,
+  78, 73, 88, 80, 99, 69, 79, 61, 89, 82,
+  78, 81, 102, 71, 90, 90, 79, 72, 82, 110,
+  83, 91, 74, 87, 90, 79, 86, 73, 66, 75,
+  96, 93, 87, 89, 87, 82, 73, 86, 88, 82,
+  83, 91, 95, 76, 87, 104, 79, 90, 77, 82,
+  105, 82, 85, 76, 94, 75, 73, 79, 76, 90,
+  93, 85, 87, 80, 76, 87, 75, 87, 89, 84,
+  74, 81, 73, 83, 77, 73, 98, 77, 71, 74,
+  84, 85, 89, 83, 95, 72, 86, 87, 94, 81,
+  81, 94, 75, 82, 91, 83, 83, 84, 80, 91,
+  92, 86, 82, 75, 79, 104, 81, 89, 103, 71,
+  89, 80, 75, 88, 90, 88, 84, 76, 82, 69,
+  85, 86, 83, 84, 83, 81, 91, 95, 88, 85,
+  79, 81, 88, 80, 79, 70, 85, 87, 85, 81,
+  92, 74, 83, 84, 92, 82, 91, 84, 85, 97,
+  64, 85, 91, 70, 77, 85, 78, 75, 96, 83,
+  77, 86, 71, 83, 80, 79, 102, 85, 82, 83,
+  86, 77, 80, 94, 84, 96, 97, 97, 80, 82,
+  80, 81, 99, 71, 87, 82, 68, 82, 107, 76,
+  89, 78, 86, 81, 73, 92, 80, 78, 69, 86,
+  88, 82, 80, 84, 89, 78, 88, 78, 97, 91,
+  110, 76, 75, 79, 87, 86, 71, 83, 83, 101,
+  89, 88, 89, 84, 86, 90, 83, 92, 83, 88,
+  78, 74, 77, 81, 97, 90, 69, 82, 80, 84,
+  92, 91, 80, 89, 85, 80, 88, 83, 86, 96,
+  75, 77, 70, 83, 84, 92, 79, 83, 86, 87,
+  87, 90, 79, 72, 89, 82, 96, 78, 83, 75,
+  82, 86, 77, 87, 95, 74, 87, 95, 53, 72,
+  82, 62, 79, 88, 83, 69, 96, 82, 78, 84,
+  81, 75, 77, 78, 104, 80, 74, 74, 95, 90,
+  82, 106, 88, 96, 85, 85, 88, 89, 86, 79,
+  102, 70, 75, 93, 64, 77, 114, 87, 87, 70,
+  89, 74, 67, 98, 57, 72, 56, 82, 82, 83,
+  84, 81, 90, 84, 75, 80, 100, 95, 117, 61,
+  74, 64, 80, 79, 84, 70, 83, 93, 88, 84,
+  91, 83, 82, 83, 90, 102, 88, 85, 72, 65,
+  75, 84, 97, 85, 58, 81, 76, 85, 110, 96,
+  76, 76, 81, 79, 94, 85, 99, 95, 67, 74,
+  71, 80, 78, 84, 78, 76, 77, 89, 95, 86,
+  80, 61, 79, 83, 90, 77, 85, 73, 84, 90,
+  69, 84, 86, 88, 84, 92, 65, 83, 92, 78,
+  80, 77, 75, 71, 100, 78, 78, 90, 92, 76,
+  82, 82, 82, 83, 81, 80, 80, 96, 80, 97,
+  86, 85, 84, 88, 81, 82, 81, 80, 100, 74,
+  70, 85, 71, 84, 91, 108, 86, 80, 84, 80,
+  72, 92, 83, 83, 69, 85, 88, 76, 80, 73,
+  92, 78, 82, 82, 89, 92, 109, 76, 82, 73,
+  90, 85, 86, 84, 81, 87, 82, 87, 87, 87,
+  83, 81, 77, 94, 94, 89, 81, 74, 83, 85,
+  97, 91, 75, 88, 80, 85, 102, 88, 84, 80,
+  81, 77, 84, 88, 87, 92, 72, 80, 74, 77,
+  82, 86, 86, 86, 82, 82, 83, 89, 92, 71,
+  90, 79, 92, 80, 85, 78, 82, 78, 100, 87,
+  84, 72, 80, 78, 82, 90, 104, 83, 84, 97,
+  73, 82, 76, 86, 77, 84, 70, 88, 82, 83,
+  75, 75, 90, 74, 90, 75, 94, 89, 91, 88,
+  85, 85, 73, 83, 80, 79, 75, 80, 67, 87,
+  91, 79, 74, 76, 70, 90, 84, 103, 86, 72,
+  84, 71, 73, 69, 98, 79, 89, 81, 73, 83,
+  89, 116, 86, 83, 102, 86, 81, 78, 87, 80,
+  93, 86, 99, 99, 86, 82, 88, 83, 85, 91,
+  92, 87, 90, 85, 80, 81, 87, 85, 75, 80,
+  84, 107, 72, 64, 97, 87, 77, 84, 82, 95,
+  78, 85, 71, 89, 72, 90, 86, 80, 81, 79,
+  87, 119, 83, 84, 77, 78, 73, 107, 82, 77,
+  79, 89, 99, 86, 79, 81, 87, 87, 86, 78,
+  80, 75, 89, 98, 110, 77, 79, 91, 77, 82,
+  74, 96, 82, 78, 70, 77, 82, 74, 74, 69,
+  88, 79, 84, 75, 88, 97, 90, 75, 80, 77,
+  77, 76, 100, 71, 78, 84, 70, 83, 98, 73,
+  61, 77, 69, 88, 96, 88, 86, 72, 85, 85,
+  63, 75, 97, 72, 90, 89, 75, 74, 81, 138,
+  89, 72, 87, 72, 84, 77, 86, 75, 80, 86,
+  109, 80, 92, 84, 86, 84, 72, 82, 84, 79,
+  77, 78, 80, 82, 86, 93, 79, 80, 79, 118,
+  77, 68, 92, 85, 80, 104, 93, 95, 76, 84,
+  73, 87, 77, 88, 80, 78, 76, 82, 87, 123,
+  74, 86, 73, 81, 79, 111, 75, 77, 78, 82,
+  102, 86, 83, 84, 86, 88, 90, 84, 82, 83,
+  83, 85, 101, 78, 87, 75, 76, 82, 74, 86,
+  77, 87, 68, 78, 75, 83, 87, 77, 89, 76,
+  86, 90, 87, 92, 91, 91, 81, 91, 77, 88,
+  99, 80, 77, 78, 75, 91, 91, 83, 79, 98,
+  76, 86, 84, 90, 87, 73, 86, 83, 74, 75,
+  94, 81, 87, 75, 74, 83, 86, 107, 79, 83,
+  96, 84, 99, 83, 85, 83, 95, 86, 90, 76,
+  87, 76, 95, 82, 79, 89, 88, 85, 75, 81,
+  81, 83, 86, 89, 80, 82, 84, 100, 76, 69,
+  92, 85, 78, 100, 79, 99, 78, 88, 70, 89,
+  76, 91, 82, 79, 86, 92, 78, 101, 81, 83,
+  76, 76, 80, 100, 87, 84, 85, 88, 96, 80,
+  75, 83, 84, 93, 82, 67, 77, 72, 82, 89,
+  103, 81, 87, 93, 81, 81, 83, 82, 72, 83,
+  76, 81, 76, 78, 81, 80, 77, 75, 93, 77,
+  85, 85, 93, 89, 88, 90, 68, 78, 94, 87,
+  86, 76, 69, 86, 77, 76, 69, 78, 76, 89,
+  82, 91, 84, 76, 81, 80, 80, 73, 96, 70,
+  78, 95, 74, 84, 75, 131, 79, 74, 106, 73,
+  94, 65, 86, 85, 95, 89, 96, 92, 98, 89,
+  86, 88, 80, 84, 86, 81, 87, 86, 71, 76,
+  85, 80, 83, 86, 80, 123, 77, 73, 98, 74,
+  75, 83, 78, 92, 76, 78, 73, 86, 65, 87,
+  77, 76, 80, 82, 70, 112, 80, 84, 67, 85,
+  73, 114, 81, 80, 71, 82, 102, 78, 78, 81,
+  81, 105, 83, 75, 69, 71, 99, 109, 105, 73,
+  66, 91, 100, 81, 96, 88, 75, 75, 72, 69,
+  81, 67, 88, 69, 83, 82, 87, 87, 60, 105,
+  97, 70, 84, 81, 65, 84, 93, 73, 76, 72,
+  67, 77, 79, 77, 58, 73, 75, 85, 83, 65,
+  89, 81, 75, 70, 77, 80, 81, 60, 76, 124,
+  80, 76, 70, 139, 72, 52, 115, 71, 76, 61,
+  110, 77, 85, 96, 129, 82, 93, 106, 81, 87,
+  69, 83, 68, 70, 79, 74, 65, 82, 85, 79,
+  76, 99, 89, 132, 87, 86, 86, 63, 75, 86,
+  98, 91, 82, 85, 68, 77, 67, 80, 70, 73,
+  76, 83, 69, 101, 87, 85, 49, 88, 80, 116,
+  75, 83, 69, 74, 113, 65, 79, 81, 90, 87,
+  86, 77, 76, 76, 77, 85, 101, 83, 90, 91,
+  79, 82, 84, 83, 72, 81, 71, 88, 68, 75,
+  93, 79, 81, 77, 92, 93, 93, 96, 94, 101,
+  83, 89, 74, 82, 95, 86, 90, 76, 79, 87,
+  78, 73, 74, 96, 77, 88, 81, 94, 84, 72,
+  84, 72, 78, 78, 97, 75, 83, 88, 81, 88,
+  74, 121, 78, 80, 103, 78, 84, 69, 82, 85,
+  92, 86, 83, 79, 92, 82, 91, 88, 77, 87,
+  89, 85, 82, 86, 75, 80, 79, 85, 87, 82,
+  80, 113, 77, 76, 88, 73, 79, 81, 79, 96,
+  75, 82, 72, 87, 68, 88, 88, 78, 81, 87,
+  79, 95, 90, 88, 73, 82, 80, 109, 81, 82,
+  80, 82, 96, 75, 83, 85, 77, 88, 87, 86,
+  80, 75, 73, 88, 92, 82, 87, 89, 74, 76,
+  85, 87, 79, 90, 79, 77, 79, 78, 86, 75,
+  90, 85, 88, 75, 86, 87, 97, 89, 95, 90,
+  78, 74, 88, 89, 99, 75, 93, 86, 79, 77,
+  80, 78, 77, 87, 86, 93, 78, 79, 87, 81,
+  88, 77, 79, 82, 78, 78, 87, 74, 91, 91,
+  76, 92, 101, 89, 99, 85, 83, 89, 89, 94,
+  89, 88, 99, 82, 88, 93, 88, 92, 85, 84,
+  94, 81, 73, 84, 84, 78, 84, 89, 79, 116,
+  80, 88, 88, 81, 83, 92, 78, 96, 85, 78,
+  76, 85, 80, 84, 74, 82, 78, 79, 79, 101,
+  75, 92, 84, 89, 82, 105, 82, 74, 74, 90,
+  100, 86, 78, 77, 84, 81, 86, 86, 80, 74,
+  81, 92, 94, 74, 72, 96, 83, 71, 92, 86,
+  80, 82, 78, 63, 85, 77, 90, 74, 87, 85,
+  83, 86, 89, 89, 95, 77, 91, 74, 79, 67,
+  92, 84, 96, 86, 80, 77, 67, 70, 77, 73,
+  82, 84, 84, 88, 84, 79, 81, 86, 80, 83,
+  87, 73, 76, 75, 91, 57, 86, 95, 71, 73,
+  109, 84, 85, 89, 92, 82, 90, 93, 95, 81,
+  103, 90, 84, 92, 76, 89, 86, 81, 87, 84,
+  77, 78, 82, 77, 93, 94, 77, 120, 86, 92,
+  95, 67, 80, 83, 79, 96, 79, 80, 70, 80,
+  74, 79, 78, 75, 77, 83, 85, 97, 82, 93,
+  75, 93, 87, 108, 76, 74, 75, 88, 105, 78,
+  81, 78, 85, 82, 91, 86, 76, 77, 75, 88,
+  86, 87, 82, 90, 79, 74, 84, 88, 75, 88,
+  87, 82, 87, 77, 90, 71, 89, 82, 80, 88,
+  94, 88, 94, 97, 80, 80, 82, 74, 79, 89,
+  101, 77, 79, 88, 79, 79, 81, 94, 76, 88,
+  84, 96, 80, 77, 86, 70, 85, 76, 82, 84,
+  81, 75, 88, 74, 95, 86, 82, 92, 99, 88,
+  72, 83, 84, 85, 93, 89, 88, 80, 93, 84,
+  91, 89, 83, 89, 85, 89, 86, 82, 77, 83,
+  82, 79, 85, 89, 80, 113, 80, 88, 90, 79,
+  86, 86, 83, 98, 79, 80, 78, 82, 78, 81,
+  95, 81, 81, 91, 83, 90, 98, 94, 84, 87,
+  92, 96, 79, 78, 78, 88, 99, 83, 69, 87,
+  76, 97, 104, 94, 86, 80, 93, 82, 95, 76,
+  82, 81, 84, 91, 75, 67, 86, 86, 82, 83,
+  73, 93, 85, 82, 103, 84, 86, 88, 90, 71,
+  77, 97, 127, 84, 93, 101, 88, 74, 118, 84,
+  81, 96, 85, 84, 87, 91, 80, 74, 71, 71,
+  88, 87, 93, 94, 59, 78, 73, 73, 90, 75,
+  62, 86, 86, 85, 59, 74, 84, 89, 103, 81,
+  87, 97, 84, 65, 77, 89, 92, 73, 85, 89,
+  81, 77, 104, 94, 87, 91, 90, 72, 87, 84,
+  91, 81, 86, 107, 76, 87, 89, 76, 83, 79,
+  85, 92, 87, 86, 90, 87, 91, 77, 91, 106,
+  92, 88, 81, 84, 69, 88, 92, 78, 82, 74,
+  83, 73, 82, 90, 98, 79, 72, 84, 103, 94,
+  99, 92, 79, 74, 87, 92, 92, 75, 73, 71,
+  83, 75, 76, 68, 83, 92, 77, 80, 95, 92,
+  83, 76, 96, 86, 96, 109, 95, 71, 76, 79,
+  89, 83, 91, 105, 92, 68, 138, 81, 75, 88,
+  94, 90, 85, 101, 86, 72, 77, 82, 81, 89,
+  91, 72, 53, 72, 63, 73, 90, 74, 58, 83,
+  76, 83, 69, 86, 82, 84, 90, 92, 79, 103,
+  84, 65, 81, 82, 82, 76, 82, 90, 72, 85,
+  90, 99, 81, 97, 82, 72, 81, 75, 87, 77,
+  84, 105, 80, 88, 92, 73, 76, 77, 87, 93,
+  87, 88, 88, 85, 85, 72, 106, 103, 84, 83,
+  94, 94, 96, 84, 91, 73, 73, 72, 73, 73,
+  81, 87, 105, 79, 82, 73, 99, 84, 81, 83,
+  78, 96, 86, 91, 90, 83, 77, 76, 73, 74,
+  82, 71, 84, 89, 58, 71, 91, 81, 80, 82,
+  84, 80, 82, 89, 78, 81, 85, 81, 82, 92,
+  81, 83, 83, 83, 112, 77, 80, 82, 84, 96,
+  93, 80, 93, 82, 77, 73, 90, 96, 89, 95,
+  79, 72, 69, 82, 92, 78, 77, 69, 76, 82,
+  81, 81, 84, 76, 94, 87, 82, 97, 82, 80,
+  77, 73, 80, 95, 86, 91, 70, 82, 79, 90,
+  92, 81, 96, 84, 81, 73, 80, 75, 91, 88,
+  74, 84, 102, 75, 65, 78, 87, 86, 83, 92,
+  86, 81, 91, 88, 86, 81, 92, 89, 78, 85,
+  99, 83, 79, 80, 78, 78, 92, 90, 92, 91,
+  88, 89, 71, 71, 69, 94, 84, 66, 87, 84,
+  74, 100, 96, 82, 74, 76, 77, 66, 73, 76,
+  85, 87, 75, 78, 80, 97, 82, 83, 126, 84,
+  106, 90, 70, 68, 102, 79, 145, 89, 96, 98,
+  83, 67, 151, 74, 89, 75, 103, 98, 80, 87,
+  96, 100, 62, 59, 86, 94, 110, 84, 58, 66,
+  61, 71, 95, 93, 82, 95, 71, 80, 69, 101,
+  69, 90, 84, 77, 103, 104, 78, 70, 71, 80,
+  93, 67, 80, 81, 79, 87, 83, 87, 82, 94,
+  73, 87, 103, 86, 77, 87, 104, 88, 70, 77,
+  73, 82, 73, 76, 90, 85, 85, 83, 74, 87,
+  92, 62, 95, 111, 90, 79, 77, 91, 67, 74,
+  74, 64, 65, 63, 88, 74, 77, 78, 89, 98,
+  71, 77, 80, 90, 76, 70, 83, 81, 65, 101,
+  90, 79, 68, 78, 76, 63, 70, 82, 86, 88,
+  72, 68, 92, 92, 70, 83, 112, 85, 104, 135,
+  73, 70, 109, 61, 90, 86, 83, 94, 92, 56,
+  131, 73, 76, 71, 101, 94, 76, 104, 104, 97,
+  60, 58, 85, 96, 101, 66, 72, 62, 59, 76,
+  97, 93, 90, 86, 57, 81, 76, 95, 63, 88,
+  61, 82, 99, 99, 75, 80, 72, 67, 74, 69,
+  75, 84, 76, 98, 72, 90, 76, 92, 68, 84,
+  109, 66, 68, 84, 88, 83, 75, 77, 87, 80,
+  73, 61, 86, 84, 82, 81, 70, 89, 86, 66,
+  99, 100, 89, 69, 78, 91, 99, 72, 72, 71,
+  83, 70, 81, 72, 74, 81, 90, 108, 80, 89,
+  80, 78, 83, 83, 86, 95, 88, 92, 93, 86,
+  89, 77, 78, 73, 79, 89, 87, 79, 68, 86,
+  71, 80, 80, 90, 83, 79, 92, 73, 75, 80,
+  93, 73, 81, 88, 72, 74, 81, 93, 92, 71,
+  85, 85, 90, 88, 81, 76, 88, 93, 74, 84,
+  90, 96, 95, 93, 90, 70, 77, 88, 88, 80,
+  90, 71, 75, 94, 86, 84, 80, 78, 83, 84,
+  85, 94, 84, 85, 73, 76, 63, 97, 86, 90,
+  79, 81, 87, 84, 91, 78, 89, 92, 94, 75,
+  68, 82, 84, 83, 69, 80, 99, 80, 73, 71,
+  82, 78, 82, 86, 90, 87, 75, 91, 77, 85,
+  88, 80, 70, 82, 86, 79, 80, 74, 92, 83,
+  96, 90, 94, 84, 83, 92, 82, 72, 81, 87,
+  87, 82, 73, 88, 99, 91, 89, 85, 106, 71,
+  77, 76, 83, 87, 75, 84, 70, 90, 82, 88,
+  91, 91, 84, 76, 84, 81, 74, 89, 103, 75,
+  77, 89, 102, 75, 73, 88, 92, 71, 74, 86,
+  82, 96, 86, 87, 87, 110, 61, 84, 86, 101,
+  90, 82, 90, 78, 90, 80, 80, 78, 94, 92,
+  84, 91, 77, 86, 83, 80, 84, 68, 97, 82,
+  73, 82, 71, 74, 81, 86, 83, 82, 82, 79,
+  85, 86, 85, 71, 85, 119, 87, 79, 71, 89,
+  109, 78, 56, 80, 89, 80, 83, 77, 82, 75,
+  69, 90, 75, 77, 68, 97, 67, 83, 88, 80,
+  93, 82, 81, 78, 73, 67, 77, 86, 93, 78,
+  95, 85, 80, 93, 79, 85, 82, 84, 85, 74,
+  73, 91, 97, 89, 89, 82, 105, 78, 79, 70,
+  77, 93, 78, 80, 75, 87, 76, 88, 88, 93,
+  84, 79, 86, 80, 79, 86, 108, 66, 62, 83,
+  84, 74, 84, 81, 75, 65, 72, 87, 79, 91,
+  83, 71, 86, 110, 71, 90, 87, 101, 85, 75,
+  96, 82, 92, 83, 82, 72, 89, 86, 81, 94,
+  84, 78, 79, 81, 74, 73, 88, 85, 70, 82,
+  73, 79, 65, 86, 81, 84, 89, 86, 87, 90,
+  73, 70, 94, 118, 84, 77, 73, 86, 88, 82,
+  69, 79, 100, 76, 80, 70, 83, 76, 69, 89,
+  75, 79, 69, 98, 62, 80, 88, 80, 96, 82,
+  78, 79, 80, 75, 99, 90, 94, 82, 96, 91,
+  73, 95, 83, 101, 89, 80, 83, 99, 82, 93,
+  104, 91, 85, 81, 105, 85, 94, 77, 85, 91,
+  72, 86, 75, 92, 76, 82, 84, 78, 79, 74,
+  72, 67, 81, 81, 93, 81, 84, 103, 83, 82,
+  81, 87, 90, 75, 90, 94, 88, 82, 83, 71,
+  88, 96, 84, 103, 85, 89, 81, 79, 93, 84,
+  92, 83, 81, 76, 83, 85, 88, 97, 78, 82,
+  87, 87, 86, 88, 78, 86, 78, 75, 86, 94,
+  62, 99, 88, 87, 73, 71, 95, 91, 83, 76,
+  90, 98, 72, 88, 84, 84, 86, 94, 68, 86,
+  98, 68, 83, 76, 84, 77, 76, 86, 85, 77,
+  75, 98, 64, 92, 83, 85, 86, 85, 80, 81,
+  89, 75, 91, 91, 78, 83, 90, 96, 78, 84,
+  101, 76, 66, 92, 95, 94, 85, 80, 89, 67,
+  101, 83, 85, 84, 90, 96, 84, 88, 86, 73,
+  85, 92, 99, 80, 84, 83, 77, 77, 84, 93,
+  97, 86, 103, 84, 110, 77, 69, 82, 86, 73,
+  87, 93, 82, 100, 88, 74, 105, 94, 69, 87,
+  92, 92, 93, 91, 93, 91, 83, 97, 78, 89,
+  80, 84, 78, 70, 83, 90, 86, 80, 90, 79,
+  86, 74, 71, 94, 84, 63, 86, 100, 84, 66,
+  96, 90, 80, 85, 102, 75, 85, 89, 100, 89,
+  72, 84, 80, 85, 79, 93, 97, 99, 88, 71,
+  82, 89, 82, 83, 85, 85, 96, 92, 82, 89,
+  77, 86, 84, 88, 82, 85, 74, 82, 75, 82,
+  92, 89, 71, 87, 92, 73, 85, 105, 89, 89,
+  74, 86, 96, 95, 86, 75, 84, 76, 100, 87,
+  78, 78, 96, 102, 82, 85, 91, 85, 77, 79,
+  83, 81, 88, 89, 72, 81, 81, 86, 95, 83,
+  109, 77, 95, 75, 67, 73, 87, 66, 80, 95,
+  85, 101, 90, 74, 112, 90, 66, 92, 92, 94,
+  87, 95, 90, 92, 82, 100, 74, 94, 78, 83,
+  81, 72, 80, 89, 87, 87, 80, 70, 74, 76,
+  67, 95, 85, 66, 78, 83, 81, 71, 97, 94,
+  82, 84, 100, 76, 84, 86, 111, 90, 72, 79,
+  74, 84, 70, 92, 92, 108, 83, 71, 82, 87,
+  81, 83, 85, 80, 96, 95, 89, 90, 78, 89,
+  87, 82, 75, 93, 70, 80, 76, 82, 93, 83,
+  81, 87, 91, 74, 90, 111, 99, 85, 101, 85,
+  97, 107, 81, 75, 87, 75, 90, 85, 82, 75,
+  76, 105, 85, 78, 87, 86, 72, 94, 81, 87,
+  89, 82, 87, 73, 74, 101, 94, 85, 84, 77,
+  95, 79, 82, 82, 86, 68, 88, 84, 91, 89,
+  88, 78, 102, 88, 73, 80, 85, 80, 92, 84,
+  93, 95, 83, 92, 75, 98, 81, 87, 77, 78,
+  83, 84, 86, 78, 91, 78, 78, 88, 72, 91,
+  84, 66, 90, 83, 83, 64, 92, 92, 94, 96,
+  88, 88, 88, 82, 90, 86, 66, 80, 93, 87,
+  84, 83, 97, 84, 85, 73, 83, 76, 81, 85,
+  86, 87, 89, 90, 83, 85, 92, 89, 82, 86,
+  82, 87, 87, 87, 77, 83, 89, 84, 75, 84,
+  85, 79, 89, 93, 75, 76, 86, 100, 76, 74,
+  73, 69, 92, 81, 73, 77, 69, 90, 67, 120,
+  74, 72, 79, 77, 94, 71, 80, 98, 72, 62,
+  130, 80, 110, 78, 74, 88, 69, 70, 96, 74,
+  81, 85, 81, 69, 94, 81, 73, 69, 69, 94,
+  96, 86, 109, 80, 87, 84, 96, 82, 83, 99,
+  85, 75, 84, 93, 93, 87, 72, 86, 78, 73,
+  103, 98, 89, 80, 80, 86, 96, 97, 64, 79,
+  97, 62, 97, 60, 89, 93, 91, 77, 78, 99,
+  83, 78, 93, 80, 57, 100, 84, 74, 79, 77,
+  89, 70, 84, 96, 72, 104, 74, 84, 87, 77,
+  65, 75, 64, 66, 92, 59, 68, 84, 99, 99,
+  54, 85, 71, 77, 91, 79, 85, 70, 78, 85,
+  68, 83, 74, 72, 88, 96, 69, 65, 69, 75,
+  81, 89, 70, 82, 60, 105, 74, 100, 74, 65,
+  74, 78, 76, 64, 82, 100, 72, 65, 138, 82,
+  108, 86, 68, 89, 63, 70, 74, 72, 74, 87,
+  77, 67, 87, 75, 76, 64, 65, 85, 94, 78,
+  98, 83, 86, 84, 91, 73, 74, 94, 76, 67,
+  86, 89, 97, 72, 69, 77, 75, 76, 118, 87,
+  78, 81, 71, 92, 84, 101, 65, 74, 98, 70,
+  91, 68, 88, 99, 93, 86, 65, 106, 82, 75,
+  87, 80, 57, 92, 78, 77, 69, 76, 83, 80,
+  86, 90, 70, 85, 73, 84, 77, 78, 64, 71,
+  64, 63, 97, 56, 66, 85, 113, 107, 84, 87,
+  63, 73, 85, 79, 75, 68, 77, 90, 55, 87,
+  74, 66, 72, 84, 72, 84, 69, 75, 83, 90,
+  76, 70, 67, 95, 61, 99, 73, 76, 84, 84,
+  75, 65, 88, 95, 81, 63, 122, 78, 108, 106,
+  70, 90, 59, 66, 88, 81, 100, 89, 86, 63,
+  91, 83, 82, 66, 73, 87, 85, 77, 109, 75,
+  78, 87, 95, 72, 89, 83, 86, 69, 87, 86,
+  94, 87, 70, 76, 64, 77, 109, 86, 89, 91,
+  69, 90, 105, 95, 72, 87, 101, 88, 97, 62,
+  85, 85, 82, 92, 65, 97, 85, 83, 78, 84,
+  68, 91, 89, 77, 87, 73, 93, 70, 98, 88,
+  75, 70, 78, 88, 85, 81, 70, 76, 72, 69,
+  93, 64, 76, 86, 103, 100, 106, 96, 72, 75,
+  81, 77, 72, 77, 77, 84, 69, 82, 76, 102,
+  77, 67, 85, 80, 73, 74, 80, 83, 66, 103,
+  81, 102, 57, 63, 78, 72, 95, 88, 91, 74,
+  93, 76, 72, 95, 104, 79, 93, 87, 79, 84,
+  65, 79, 79, 94, 74, 80, 92, 75, 82, 76,
+  85, 79, 105, 92, 67, 87, 109, 68, 90, 80,
+  87, 76, 87, 72, 101, 64, 87, 83, 96, 79,
+  100, 84, 74, 80, 79, 111, 77, 97, 69, 79,
+  95, 95, 75, 105, 81, 72, 90, 60, 89, 68,
+  78, 96, 76, 78, 87, 79, 71, 93, 93, 81,
+  99, 85, 86, 77, 94, 77, 71, 87, 80, 86,
+  87, 94, 83, 84, 86, 83, 95, 85, 88, 55,
+  78, 91, 93, 82, 99, 85, 85, 88, 87, 79,
+  72, 79, 93, 85, 78, 71, 87, 86, 62, 62,
+  88, 90, 74, 76, 77, 82, 72, 109, 77, 87,
+  66, 66, 81, 74, 99, 88, 81, 84, 90, 72,
+  72, 93, 89, 80, 88, 76, 83, 88, 63, 84,
+  78, 100, 73, 79, 89, 75, 83, 76, 80, 80,
+  100, 94, 63, 85, 97, 70, 94, 80, 87, 82,
+  84, 87, 102, 63, 94, 80, 91, 77, 97, 80,
+  64, 92, 77, 116, 79, 75, 76, 82, 96, 87,
+  84, 100, 83, 89, 77, 63, 89, 66, 77, 90,
+  80, 73, 89, 83, 63, 92, 90, 78, 95, 85,
+  92, 78, 95, 87, 79, 85, 77, 69, 91, 96,
+  77, 82, 86, 83, 90, 83, 80, 59, 81, 93,
+  73, 75, 102, 88, 91, 74, 81, 85, 74, 81,
+  92, 84, 72, 73, 76, 84, 62, 63, 91, 93,
+  77, 79, 80, 83, 78, 92, 90, 79, 66, 64,
+  81, 85, 96, 90, 89, 73, 81, 72, 80, 98,
+  82, 85, 83, 78, 83, 87, 77, 82, 84, 90,
+  75, 80, 81, 84, 79, 77, 84, 89, 104, 97,
+  61, 80, 103, 76, 89, 87, 88, 82, 81, 93,
+  100, 71, 89, 81, 86, 72, 95, 85, 74, 87,
+  84, 103, 78, 86, 90, 81, 98, 94, 82, 105,
+  75, 89, 88, 67, 89, 70, 82, 77, 87, 74,
+  84, 85, 74, 102, 96, 87, 99, 88, 103, 77,
+  95, 85, 86, 88, 86, 83, 84, 95, 80, 86,
+  78, 87, 92, 92, 81, 63, 83, 84, 70, 73,
+  80, 86, 87, 73, 88, 78, 80, 85, 101, 80,
+  82, 74, 79, 79, 80, 94, 74, 88, 88, 86,
+  83, 80, 78, 86, 85, 103, 71, 91, 79, 89,
+  77, 69, 78, 101, 74, 73, 95, 82, 98, 81,
+  87, 81, 82, 87, 84, 79, 85, 70, 90, 82,
+  98, 79, 74, 82, 91, 92, 96, 94, 82, 77,
+  75, 88, 82, 85, 96, 68, 92, 79, 75, 65,
+  86, 77, 95, 76, 88, 97, 77, 90, 88, 78,
+  70, 94, 76, 75, 85, 89, 84, 81, 84, 73,
+  96, 53, 87, 94, 91, 81, 70, 84, 95, 84,
+  83, 93, 82, 101, 89, 73, 99, 72, 80, 87,
+  82, 97, 83, 93, 92, 89, 85, 83, 85, 92,
+  89, 89, 81, 91, 84, 78, 89, 71, 85, 87,
+  95, 91, 86, 84, 72, 80, 81, 82, 86, 83,
+  74, 84, 79, 92, 63, 74, 87, 83, 81, 84,
+  74, 87, 82, 88, 73, 91, 77, 85, 79, 74,
+  85, 99, 79, 74, 91, 88, 89, 81, 81, 90,
+  82, 82, 86, 75, 80, 73, 94, 85, 93, 71,
+  83, 85, 78, 86, 87, 90, 84, 66, 78, 100,
+  83, 76, 97, 71, 92, 82, 87, 70, 85, 79,
+  92, 88, 86, 95, 73, 90, 87, 84, 74, 87,
+  77, 79, 88, 82, 88, 85, 82, 71, 98, 50,
+  90, 94, 84, 75, 73, 82, 77, 85, 81, 95,
+  90, 91, 95, 71, 98, 72, 78, 73, 80, 94,
+  80, 75, 87, 87, 81, 80, 84, 86, 79, 91,
+  80, 92, 85, 78, 86, 71, 82, 87, 93, 96,
+  85, 92, 71, 84, 83, 77, 83, 78, 87, 94,
+  77, 97, 84, 76, 85, 83, 82, 79, 78, 88,
+  86, 87, 74, 87, 78, 89, 81, 78, 87, 99,
+  95, 71, 96, 87, 97, 82, 86, 89, 80, 83,
+  82, 68, 78, 82, 87, 78, 100, 80, 76, 80,
+  72, 92, 99, 92, 84, 70, 76, 91, 80, 78,
+  92, 75, 89, 85, 76, 64, 86, 74, 98, 74,
+  88, 103, 80, 86, 96, 83, 76, 98, 82, 79,
+  88, 84, 93, 77, 93, 79, 95, 59, 88, 91,
+  90, 74, 71, 87, 77, 86, 79, 93, 83, 101,
+  88, 74, 91, 72, 81, 88, 81, 96, 81, 83,
+  90, 90, 85, 83, 89, 90, 89, 86, 75, 92,
+  86, 97, 81, 80, 74, 89, 91, 95, 89, 87,
+  72, 80, 84, 80, 87, 82, 101, 77, 65, 91,
+  101, 74, 85, 72, 77, 74, 108, 67, 84, 102,
+  76, 92, 104, 72, 84, 61, 87, 104, 63, 77,
+  101, 76, 86, 86, 105, 99, 84, 86, 82, 74,
+  87, 48, 82, 80, 116, 75, 83, 87, 78, 83,
+  106, 94, 93, 68, 77, 79, 67, 69, 84, 71,
+  80, 83, 68, 108, 66, 72, 83, 92, 76, 128,
+  68, 114, 87, 69, 99, 85, 66, 65, 84, 87,
+  82, 71, 81, 55, 96, 86, 64, 92, 86, 67,
+  76, 79, 82, 76, 46, 82, 60, 83, 81, 83,
+  80, 84, 84, 134, 83, 83, 74, 94, 91, 90,
+  80, 97, 83, 79, 91, 82, 75, 107, 78, 58,
+  113, 84, 77, 92, 84, 84, 95, 87, 62, 69,
+  85, 79, 101, 82, 92, 81, 73, 86, 88, 60,
+  85, 72, 86, 75, 106, 74, 80, 88, 81, 88,
+  99, 74, 85, 62, 87, 106, 62, 79, 87, 78,
+  83, 87, 93, 95, 85, 84, 83, 62, 78, 48,
+  81, 81, 104, 71, 82, 99, 81, 85, 99, 93,
+  85, 53, 78, 87, 68, 72, 88, 77, 90, 77,
+  84, 117, 64, 63, 80, 104, 73, 144, 68, 130,
+  84, 66, 100, 80, 62, 69, 88, 87, 84, 72,
+  83, 60, 94, 83, 72, 96, 83, 61, 80, 76,
+  55, 71, 50, 85, 71, 79, 81, 80, 69, 87,
+  83, 119, 82, 84, 72, 91, 87, 86, 81, 89,
+  78, 78, 84, 80, 83, 106, 77, 54, 108, 78,
+  71, 88, 86, 90, 79, 92, 63, 71, 87, 72,
+  102, 74, 102, 94, 88, 92, 102, 61, 84, 75,
+  79, 72, 102, 71, 85, 95, 79, 94, 103, 71,
+  82, 70, 78, 106, 79, 73, 93, 80, 83, 84,
+  106, 96, 82, 93, 83, 65, 94, 68, 86, 82,
+  107, 81, 85, 80, 78, 85, 105, 94, 87, 54,
+  78, 81, 66, 69, 82, 75, 78, 78, 72, 100,
+  69, 72, 85, 89, 78, 125, 70, 106, 85, 75,
+  101, 81, 69, 67, 87, 82, 95, 66, 86, 73,
+  99, 84, 64, 92, 87, 72, 77, 83, 62, 72,
+  47, 86, 63, 79, 79, 86, 77, 83, 83, 129,
+  88, 87, 77, 104, 89, 91, 83, 89, 82, 80,
+  89, 81, 80, 106, 80, 83, 102, 80, 68, 93,
+  81, 84, 78, 93, 63, 69, 79, 77, 105, 84,
+  84, 76, 70, 93, 90, 77, 84, 90, 83, 75,
+  81, 80, 77, 88, 79, 98, 95, 84, 81, 72,
+  94, 94, 75, 78, 97, 80, 91, 83, 81, 111,
+  88, 85, 89, 70, 71, 63, 94, 91, 119, 94,
+  86, 77, 74, 90, 89, 97, 95, 82, 79, 87,
+  78, 86, 81, 74, 79, 91, 75, 77, 88, 79,
+  78, 78, 95, 87, 74, 85, 81, 78, 93, 85,
+  82, 68, 98, 85, 80, 80, 78, 63, 106, 67,
+  73, 89, 85, 78, 82, 81, 89, 78, 78, 85,
+  86, 95, 85, 83, 82, 72, 80, 89, 83, 91,
+  70, 78, 85, 85, 78, 87, 82, 86, 75, 85,
+  71, 95, 86, 74, 85, 80, 82, 85, 91, 96,
+  88, 88, 83, 73, 90, 99, 91, 81, 83, 83,
+  83, 92, 80, 75, 84, 89, 91, 78, 80, 83,
+  75, 92, 76, 97, 90, 85, 83, 73, 83, 89,
+  76, 81, 87, 79, 95, 82, 72, 88, 89, 88,
+  96, 66, 69, 66, 85, 87, 98, 87, 85, 76,
+  86, 87, 80, 91, 85, 68, 81, 96, 82, 88,
+  84, 77, 86, 78, 82, 84, 82, 76, 80, 86,
+  94, 82, 70, 83, 88, 82, 91, 89, 70, 67,
+  95, 87, 84, 82, 77, 76, 107, 62, 82, 90,
+  87, 76, 85, 85, 75, 81, 74, 80, 91, 93,
+  84, 76, 74, 71, 81, 79, 78, 94, 70, 90,
+  84, 82, 82, 84, 83, 84, 77, 83, 71, 93,
+  85, 75, 86, 76, 75, 81, 87, 95, 77, 86,
+  89, 76, 96, 97, 89, 75, 86, 89, 94, 94,
+  91, 75, 80, 90, 90, 77, 78, 81, 77, 98,
+  77, 98, 96, 79, 79, 81, 74, 94, 79, 81,
+  85, 78, 93, 82, 76, 80, 89, 91, 90, 65,
+  94, 77, 89, 90, 94, 92, 89, 79, 88, 87,
+  82, 95, 94, 60, 78, 87, 80, 94, 82, 74,
+  80, 73, 77, 73, 90, 79, 79, 80, 95, 89,
+  79, 79, 80, 75, 94, 89, 70, 71, 92, 81,
+  90, 76, 79, 89, 118, 70, 73, 86, 92, 75,
+  83, 90, 74, 78, 82, 88, 86, 86, 87, 83,
+  72, 66, 77, 88, 82, 93, 74, 89, 84, 87,
+  81, 86, 84, 86, 80, 88, 72, 92, 85, 89,
+  86, 76, 72, 86, 91, 94, 77, 87, 82, 73,
+  88, 97, 90, 81, 68, 77, 95, 89, 74, 73,
+  83, 75, 84, 91, 88, 68, 91, 107, 63, 81,
+  72, 83, 78, 83, 96, 93, 78, 91, 74, 90,
+  76, 91, 94, 85, 95, 87, 74, 69, 72, 85,
+  94, 86, 99, 77, 75, 68, 84, 84, 86, 81,
+  67, 88, 96, 86, 75, 79, 92, 77, 80, 81,
+  72, 85, 85, 79, 87, 86, 78, 87, 88, 78,
+  98, 73, 81, 91, 70, 72, 97, 95, 78, 87,
+  80, 79, 97, 71, 78, 77, 79, 85, 76, 100,
+  87, 85, 79, 91, 92, 72, 74, 85, 84, 89,
+  83, 70, 80, 96, 87, 71, 80, 70, 82, 90,
+  87, 81, 76, 68, 74, 84, 81, 90, 70, 82,
+  80, 82, 87, 105, 93, 75, 85, 84, 89, 89,
+  79, 79, 70, 72, 71, 80, 91, 65, 82, 74,
+  82, 92, 88, 74, 88, 101, 71, 84, 72, 80,
+  73, 68, 92, 92, 72, 89, 76, 90, 74, 93,
+  91, 79, 93, 81, 65, 78, 75, 80, 92, 84,
+  109, 79, 72, 67, 97, 91, 97, 81, 62, 83,
+  90, 84, 87, 91, 92, 80, 64, 74, 70, 83,
+  86, 89, 86, 76, 78, 90, 87, 77, 85, 69,
+  76, 89, 81, 62, 93, 116, 72, 85, 93, 93,
+  110, 62, 82, 79, 74, 78, 66, 91, 89, 91,
+  79, 92, 94, 91, 82, 89, 83, 93, 83, 75,
+  63, 97, 83, 92, 82, 67, 82, 90, 103, 84,
+  71, 71, 87, 88, 82, 94, 76, 84, 70, 82,
+  86, 123, 88, 73, 86, 83, 82, 93, 83, 76,
+  74, 88, 69, 86, 76, 71, 80, 75, 78, 85,
+  87, 74, 86, 84, 64, 80, 80, 86, 81, 70,
+  91, 91, 72, 92, 86, 93, 78, 90, 88, 76,
+  96, 89, 75, 89, 77, 79, 93, 90, 91, 83,
+  73, 77, 94, 79, 87, 91, 70, 82, 94, 83,
+  77, 90, 88, 76, 81, 72, 71, 81, 86, 83,
+  88, 83, 74, 82, 84, 81, 82, 74, 92, 81,
+  97, 64, 98, 85, 78, 95, 73, 90, 106, 73,
+  79, 79, 81, 76, 78, 80, 93, 80, 83, 88,
+  91, 91, 74, 90, 101, 87, 84, 72, 81, 99,
+  78, 88, 78, 71, 81, 90, 84, 83, 75, 70,
+  84, 83, 81, 93, 79, 83, 77, 81, 86, 87,
+  83, 82, 87, 84, 89, 89, 81, 82, 88, 80,
+  78, 71, 110, 88, 83, 93, 82, 86, 101, 75,
+  66, 92, 76, 70, 82, 79, 85, 87, 106, 88,
+  85, 81, 64, 79, 55, 86, 88, 76, 139, 78,
+  73, 85, 101, 111, 76, 74, 91, 68, 73, 102,
+  66, 100, 78, 71, 94, 106, 74, 67, 103, 95,
+  93, 74, 65, 81, 94, 87, 95, 93, 77, 84,
+  80, 65, 83, 73, 70, 77, 81, 64, 75, 92,
+  55, 80, 93, 73, 104, 117, 75, 68, 84, 74,
+  74, 74, 76, 88, 84, 89, 101, 81, 75, 74,
+  84, 75, 71, 80, 97, 80, 88, 67, 73, 70,
+  73, 74, 89, 79, 115, 74, 88, 92, 84, 92,
+  76, 84, 72, 68, 79, 82, 94, 82, 91, 100,
+  80, 90, 74, 87, 92, 95, 85, 71, 63, 65,
+  140, 98, 68, 105, 82, 90, 100, 84, 77, 103,
+  90, 69, 94, 81, 91, 67, 80, 100, 79, 67,
+  75, 69, 60, 92, 81, 92, 170, 82, 56, 99,
+  94, 98, 76, 73, 110, 65, 68, 121, 92, 108,
+  77, 60, 100, 96, 63, 62, 125, 90, 91, 75,
+  56, 91, 102, 84, 88, 95, 74, 71, 69, 82,
+  69, 79, 53, 72, 69, 66, 71, 82, 46, 82,
+  93, 69, 155, 109, 79, 59, 80, 78, 78, 88,
+  76, 92, 76, 90, 90, 79, 82, 73, 87, 78,
+  66, 73, 113, 97, 68, 54, 76, 72, 85, 77,
+  86, 74, 129, 73, 92, 109, 97, 113, 88, 83,
+  69, 64, 69, 76, 116, 83, 85, 144, 74, 106,
+  56, 84, 108, 97, 84, 85, 74, 72, 103, 106,
+  79, 87, 76, 80, 96, 78, 75, 82, 72, 74,
+  82, 84, 85, 74, 79, 94, 76, 89, 93, 80,
+  60, 85, 81, 95, 125, 92, 78, 99, 78, 98,
+  83, 70, 85, 73, 78, 98, 110, 92, 81, 79,
+  101, 100, 76, 68, 98, 89, 92, 79, 66, 89,
+  84, 83, 89, 87, 87, 93, 85, 59, 78, 75,
+  69, 73, 79, 70, 93, 89, 57, 75, 92, 80,
+  80, 99, 86, 72, 88, 77, 83, 103, 79, 84,
+  85, 85, 96, 80, 80, 77, 86, 80, 77, 77,
+  95, 79, 67, 78, 73, 75, 75, 74, 82, 79,
+  99, 84, 83, 90, 83, 86, 79, 88, 65, 74,
+  87, 80, 93, 79, 77, 88, 82, 88, 80, 83,
+  88, 95, 86, 78, 70, 82, 89, 89, 88, 85,
+  81, 88, 92, 79, 71, 81, 70, 88, 88, 78,
+  91, 80, 78, 71, 70, 91, 89, 80, 77, 81,
+  92, 74, 93, 82, 77, 96, 114, 96, 77, 89,
+  83, 88, 95, 90, 72, 94, 64, 83, 112, 93,
+  87, 82, 90, 95, 78, 77, 76, 60, 91, 81,
+  98, 81, 80, 100, 100, 77, 95, 72, 75, 82,
+  91, 80, 82, 90, 78, 74, 102, 86, 82, 86,
+  73, 66, 78, 88, 88, 76, 78, 82, 85, 96,
+  90, 82, 76, 97, 88, 79, 78, 79, 89, 83,
+  95, 86, 72, 94, 73, 79, 93, 72, 105, 72,
+  82, 71, 82, 89, 69, 90, 75, 80, 61, 81,
+  89, 75, 74, 79, 77, 89, 83, 88, 79, 78,
+  90, 70, 74, 82, 106, 75, 81, 95, 78, 92,
+  91, 84, 70, 99, 79, 76, 91, 79, 83, 71,
+  64, 84, 80, 88, 95, 76, 83, 86, 85, 104,
+  88, 85, 74, 99, 91, 91, 91, 88, 102, 93,
+  98, 78, 65, 100, 58, 76, 133, 75, 82, 74,
+  93, 91, 74, 79, 77, 76, 97, 83, 103, 77,
+  75, 96, 100, 84, 95, 77, 86, 85, 92, 92,
+  76, 85, 70, 74, 116, 79, 90, 88, 83, 53,
+  75, 100, 82, 90, 81, 95, 81, 93, 85, 66,
+  76, 84, 87, 79, 73, 71, 89, 90, 99, 82,
+  73, 72, 78, 81, 85, 72, 106, 74, 79, 86,
+  79, 100, 80, 85, 68, 81, 75, 68, 95, 71,
+  74, 80, 71, 98, 73, 86, 82, 83, 78, 77,
+  80, 82, 79, 75, 88, 82, 82, 87, 89, 81,
+  82, 86, 68, 92, 88, 86, 87, 73, 79, 80,
+  82, 96, 97, 77, 71, 80, 85, 104, 93, 85,
+  84, 91, 85, 82, 79, 81, 86, 85, 99, 85,
+  81, 89, 70, 85, 101, 80, 89, 81, 85, 81,
+  78, 76, 77, 100, 84, 82, 94, 82, 86, 102,
+  98, 72, 85, 79, 87, 79, 82, 85, 70, 87,
+  79, 77, 99, 92, 78, 89, 71, 66, 80, 89,
+  84, 91, 76, 93, 88, 89, 87, 81, 81, 76,
+  91, 83, 74, 77, 87, 88, 86, 88, 75, 69,
+  72, 79, 91, 76, 93, 84, 82, 76, 82, 90,
+  74, 79, 59, 89, 105, 84, 92, 78, 77, 78,
+  79, 92, 84, 87, 82, 83, 69, 76, 89, 84,
+  76, 79, 71, 83, 101, 82, 72, 73, 83, 83,
+  101, 86, 73, 81, 86, 85, 80, 68, 99, 67,
+  79, 70, 78, 83, 102, 85, 85, 90, 74, 80,
+  88, 85, 74, 76, 81, 72, 76, 87, 79, 82,
+  54, 75, 79, 75, 69, 96, 66, 85, 73, 100,
+  76, 88, 82, 78, 88, 112, 83, 101, 80, 85,
+  95, 81, 68, 92, 82, 85, 84, 79, 80, 75,
+  79, 91, 121, 77, 82, 89, 87, 90, 79, 80,
+  84, 80, 77, 84, 75, 90, 92, 91, 78, 90,
+  92, 113, 83, 94, 87, 69, 95, 77, 101, 83,
+  88, 84, 75, 88, 88, 104, 88, 84, 84, 85,
+  89, 75, 88, 89, 82, 96, 94, 163, 86, 82,
+  88, 79, 79, 80, 69, 78, 87, 81, 82, 88,
+  76, 77, 97, 81, 73, 71, 84, 75, 102, 91,
+  70, 84, 83, 86, 82, 75, 91, 76, 80, 74,
+  82, 85, 90, 83, 85, 94, 79, 78, 87, 78,
+  70, 77, 74, 78, 78, 87, 80, 88, 61, 87,
+  80, 72, 68, 102, 64, 84, 76, 101, 78, 83,
+  78, 89, 92, 94, 84, 102, 79, 94, 93, 84,
+  74, 93, 82, 84, 78, 75, 80, 80, 81, 90,
+  103, 72, 88, 89, 94, 92, 84, 77, 82, 71,
+  78, 74, 72, 100, 91, 93, 80, 88, 83, 105,
+  80, 103, 87, 75, 93, 73, 95, 83, 87, 82,
+  73, 84, 88, 106, 88, 92, 83, 85, 95, 73,
+  77, 91, 83, 95, 80, 132, 82, 79, 88, 79,
+  78, 82, 77, 83, 87, 78, 78, 91, 72, 80,
+  96, 82, 73, 73, 87, 76, 99, 86, 75, 75,
+  86, 83, 81, 75, 81, 71, 83, 69, 79, 80,
+  97, 78, 85, 92, 72, 81, 92, 97, 78, 75,
+  83, 76, 81, 88, 82, 83, 62, 80, 77, 75,
+  71, 96, 67, 86, 73, 92, 74, 83, 82, 75,
+  89, 103, 83, 96, 81, 83, 100, 80, 77, 91,
+  85, 86, 90, 78, 81, 74, 81, 85, 106, 76,
+  85, 90, 85, 91, 85, 88, 84, 76, 87, 83,
+  75, 98, 92, 96, 78, 92, 91, 104, 79, 93,
+  78, 77, 93, 84, 96, 82, 84, 84, 78, 88,
+  88, 99, 93, 85, 84, 83, 85, 77, 79, 89,
+  80, 94, 69, 144, 83, 82, 80, 80, 86, 85,
+  70, 82, 81, 85, 71, 83, 83, 98, 97, 78,
+  76, 74, 83, 74, 104, 87, 73, 84, 85, 81,
+  80, 62, 90, 73, 74, 76, 78, 83, 92, 77,
+  79, 87, 80, 86, 67, 81, 68, 79, 70, 77,
+  81, 94, 84, 84, 56, 80, 80, 76, 70, 93,
+  71, 75, 77, 107, 85, 85, 81, 84, 90, 102,
+  79, 97, 80, 88, 89, 92, 79, 82, 80, 83,
+  91, 81, 84, 75, 84, 96, 104, 69, 84, 107,
+  87, 78, 76, 70, 85, 79, 81, 78, 76, 77,
+  85, 79, 84, 95, 86, 118, 85, 105, 86, 78,
+  88, 81, 93, 83, 80, 87, 82, 82, 75, 94,
+  83, 86, 82, 81, 85, 76, 80, 83, 81, 100,
+  82, 147, 87, 83, 92, 81, 80, 81, 72, 77,
+  84, 81, 78, 82, 89, 89, 89, 76, 79, 75,
+  81, 74, 105, 86, 71, 87, 83, 80, 85, 70,
+  84, 85, 76, 82, 80, 81, 78, 73, 77, 91,
+  80, 78, 68, 73, 63, 78, 74, 84, 82, 103,
+  84, 90, 63, 92, 78, 72, 74, 96, 64, 78,
+  79, 105, 86, 82, 80, 100, 90, 82, 81, 98,
+  78, 106, 91, 96, 86, 82, 83, 85, 77, 82,
+  81, 79, 82, 93, 84, 69, 87, 112, 94, 83,
+  87, 67, 88, 76, 76, 72, 76, 83, 84, 77,
+  84, 96, 78, 114, 78, 119, 91, 84, 86, 64,
+  82, 82, 76, 88, 76, 79, 72, 97, 86, 93,
+  79, 81, 92, 69, 79, 83, 80, 100, 64, 119,
+  83, 80, 93, 78, 77, 85, 77, 87, 90, 82,
+  76, 85, 81, 89, 92, 80, 79, 73, 83, 76,
+  103, 89, 74, 80, 85, 79, 82, 70, 85, 75,
+  78, 72, 79, 80, 89, 74, 79, 89, 77, 78,
+  80, 90, 72, 77, 79, 77, 83, 90, 82, 82,
+  64, 83, 77, 72, 72, 91, 73, 83, 77, 97,
+  83, 75, 81, 78, 89, 96, 80, 89, 80, 84,
+  97, 86, 87, 85, 84, 85, 76, 77, 82, 75,
+  87, 92, 96, 80, 83, 101, 84, 78, 82, 80,
+  86, 81, 80, 81, 77, 89, 89, 85, 81, 95,
+  85, 108, 83, 100, 82, 79, 92, 78, 91, 81,
+  76, 86, 85, 83, 77, 92, 91, 87, 84, 82,
+  84, 76, 84, 82, 80, 97, 61, 134, 85, 82,
+  85, 81, 82, 84, 80, 84, 78, 88, 80, 89,
+  83, 102, 100, 84, 78, 79, 83, 76, 104, 84,
+  74, 74, 91, 81, 83, 79, 81, 72, 77, 67,
+  83, 80, 94, 78, 79, 90, 81, 91, 69, 82,
+  79, 96, 71, 70, 87, 90, 85, 83, 61, 77,
+  83, 77, 69, 98, 72, 85, 75, 96, 85, 88,
+  78, 78, 93, 113, 75, 93, 81, 86, 96, 87,
+  86, 83, 85, 90, 97, 79, 89, 76, 86, 96,
+  114, 75, 82, 78, 88, 77, 80, 79, 79, 82,
+  82, 85, 85, 68, 80, 83, 80, 102, 90, 109,
+  87, 84, 83, 75, 93, 96, 95, 80, 78, 84,
+  93, 88, 77, 85, 76, 84, 78, 83, 82, 85,
+  84, 88, 88, 93, 79, 141, 91, 87, 86, 90,
+  85, 86, 78, 81, 84, 85, 87, 87, 89, 97,
+  92, 79, 77, 79, 81, 77, 103, 86, 72, 80,
+  87, 80, 90, 83, 81, 79, 79, 72, 82, 76,
+  79, 72, 81, 91, 77, 83, 66, 77, 74, 90,
+  77, 77, 89, 93, 84, 86, 63, 89, 79, 76,
+  74, 96, 69, 87, 77, 96, 84, 84, 77, 87,
+  94, 94, 78, 94, 81, 92, 88, 87, 91, 80,
+  87, 87, 81, 75, 85, 78, 86, 93, 92, 77,
+  83, 86, 93, 83, 84, 77, 81, 84, 79, 80,
+  81, 74, 76, 77, 79, 100, 81, 105, 82, 93,
+  84, 78, 85, 80, 89, 79, 74, 83, 85, 84,
+  75, 85, 78, 87, 78, 81, 83, 80, 83, 85,
+  85, 92, 70, 120, 88, 85, 88, 86, 83, 85,
+  84, 86, 98, 87, 84, 84, 81, 92, 96, 83,
+  83, 77, 81, 82, 98, 90, 76, 71, 91, 82,
+  82, 82, 83, 76, 81, 65, 81, 74, 91, 74,
+  81, 92, 79, 81, 80, 90, 81, 92, 81, 74,
+  94, 93, 81, 83, 68, 83, 80, 76, 74, 98,
+  75, 93, 76, 90, 84, 78, 79, 74, 94, 103,
+  76, 88, 82, 83, 96, 86, 93, 83, 86, 90,
+  78, 79, 87, 74, 86, 95, 108, 85, 79, 82,
+  87, 77, 84, 84, 81, 89, 78, 82, 82, 79,
+  82, 74, 78, 101, 86, 103, 85, 81, 79, 76,
+  94, 84, 91, 77, 78, 84, 92, 87, 76, 84,
+  85, 84, 80, 82, 82, 85, 88, 87, 86, 91,
+  68, 130, 88, 84, 86, 88, 84, 88, 90, 70,
+  93, 96, 85, 82, 90, 78, 94, 76, 66, 87,
+  71, 88, 104, 71, 94, 76, 92, 77, 82, 85,
+  96, 85, 104, 76, 72, 82, 95, 94, 69, 78,
+  85, 94, 86, 77, 76, 73, 84, 96, 91, 81,
+  90, 86, 50, 78, 131, 91, 75, 91, 94, 78,
+  95, 79, 98, 80, 96, 83, 77, 97, 78, 74,
+  70, 82, 76, 81, 84, 72, 112, 64, 70, 92,
+  88, 73, 112, 74, 83, 66, 63, 85, 64, 87,
+  79, 71, 99, 82, 81, 96, 91, 76, 88, 72,
+  85, 78, 77, 81, 82, 87, 119, 66, 84, 86,
+  78, 85, 89, 89, 91, 87, 84, 86, 68, 82,
+  89, 89, 83, 74, 103, 84, 82, 67, 88, 83,
+  76, 87, 94, 94, 69, 80, 87, 84, 89, 90,
+  83, 86, 94, 74, 96, 76, 62, 84, 79, 85,
+  112, 66, 96, 69, 93, 69, 97, 89, 87, 87,
+  105, 75, 79, 83, 99, 84, 68, 78, 90, 91,
+  91, 80, 75, 81, 92, 95, 85, 79, 84, 86,
+  55, 83, 135, 77, 72, 95, 91, 79, 92, 76,
+  96, 86, 98, 79, 79, 97, 82, 79, 70, 79,
+  68, 81, 78, 76, 105, 62, 84, 86, 83, 73,
+  109, 69, 82, 79, 68, 83, 63, 85, 86, 85,
+  97, 83, 81, 91, 91, 82, 85, 72, 81, 78,
+  70, 80, 79, 87, 112, 69, 81, 81, 75, 84,
+  86, 95, 91, 90, 89, 87, 62, 85, 87, 84,
+  75, 81, 89, 85, 83, 63, 71, 82, 71, 87,
+  93, 94, 69, 84, 88, 92, 88, 87, 88, 98,
+  91, 78, 83, 80, 74, 83, 83, 84, 101, 76,
+  93, 76, 94, 81, 102, 84, 92, 86, 97, 72,
+  77, 83, 87, 81, 69, 84, 86, 95, 95, 85,
+  79, 74, 89, 91, 94, 79, 78, 79, 59, 77,
+  112, 65, 77, 93, 93, 76, 93, 81, 96, 86,
+  85, 90, 75, 90, 85, 80, 78, 73, 81, 84,
+  86, 77, 105, 68, 96, 99, 86, 80, 105, 77,
+  80, 83, 75, 89, 68, 78, 81, 89, 95, 87,
+  83, 94, 89, 87, 88, 78, 84, 80, 80, 86,
+  84, 85, 101, 78, 84, 84, 75, 84, 87, 96,
+  86, 92, 90, 85, 61, 80, 86, 79, 82, 88,
+  77, 87, 88, 72, 64, 79, 80, 87, 93, 95,
+  72, 82, 90, 67, 83, 99, 84, 95, 86, 84,
+  94, 87, 72, 88, 75, 86, 89, 70, 90, 78,
+  83, 74, 72, 81, 87, 83, 94, 73, 65, 90,
+  96, 82, 64, 77, 83, 93, 82, 81, 71, 81,
+  81, 88, 91, 83, 74, 80, 59, 82, 124, 95,
+  77, 91, 95, 79, 81, 88, 82, 82, 88, 84,
+  85, 93, 77, 64, 70, 90, 80, 88, 87, 66,
+  114, 65, 74, 82, 87, 64, 104, 71, 79, 70,
+  62, 85, 70, 92, 89, 76, 94, 84, 83, 88,
+  90, 79, 87, 82, 85, 79, 83, 73, 84, 88,
+  117, 78, 85, 82, 70, 81, 91, 78, 86, 86,
+  86, 84, 70, 81, 87, 88, 80, 76, 95, 84,
+  77, 67, 92, 86, 74, 84, 90, 86, 73, 85,
+  88, 79, 88, 88, 82, 93, 87, 86, 92, 86,
+  70, 85, 76, 81, 94, 61, 91, 70, 81, 72,
+  80, 90, 87, 82, 104, 72, 66, 89, 96, 75,
+  64, 79, 83, 86, 84, 82, 73, 84, 84, 85,
+  88, 85, 73, 79, 62, 82, 128, 83, 75, 96,
+  92, 80, 77, 85, 83, 86, 88, 83, 90, 93,
+  81, 71, 69, 88, 76, 90, 88, 71, 111, 65,
+  83, 76, 84, 64, 104, 65, 79, 80, 64, 82,
+  71, 90, 93, 86, 93, 88, 80, 85, 88, 77,
+  82, 73, 83, 80, 74, 71, 83, 87, 97, 80,
+  82, 79, 70, 80, 89, 85, 84, 86, 84, 82,
+  64, 85, 87, 85, 73, 83, 85, 83, 80, 66,
+  78, 87, 63, 88, 85, 87, 76, 88, 91, 89,
+  97, 86, 84, 96, 89, 85, 80, 91, 75, 87,
+  79, 82, 85, 69, 86, 80, 89, 82, 87, 87,
+  100, 83, 97, 73, 73, 88, 87, 79, 69, 84,
+  85, 86, 88, 85, 78, 81, 81, 79, 96, 81,
+  74, 75, 65, 80, 104, 73, 79, 91, 90, 80,
+  87, 87, 89, 90, 83, 91, 85, 87, 83, 77,
+  76, 82, 85, 92, 90, 71, 103, 76, 90, 89,
+  89, 72, 99, 73, 81, 81, 70, 87, 74, 83,
+  85, 89, 91, 85, 82, 88, 86, 87, 87, 83,
+  84, 78, 83, 80, 84, 90, 83, 86, 87, 73,
+  74, 82, 91, 88, 79, 89, 88, 80, 67, 84,
+  88, 84, 82, 89, 82, 87, 82, 74, 74, 84,
+  77, 84, 90, 88, 73, 84, 90, 74, 72, 100,
+  79, 111, 77, 85, 84, 94, 69, 89, 75, 88,
+  84, 80, 105, 99, 86, 80, 66, 73, 83, 80,
+  96, 78, 72, 94, 98, 82, 66, 77, 74, 90,
+  77, 76, 86, 85, 86, 90, 99, 59, 68, 81,
+  62, 87, 126, 93, 81, 90, 86, 74, 85, 90,
+  87, 80, 77, 83, 91, 90, 87, 68, 76, 92,
+  85, 79, 93, 68, 114, 79, 76, 75, 96, 66,
+  103, 74, 68, 69, 73, 82, 72, 100, 89, 85,
+  90, 86, 86, 91, 85, 88, 88, 111, 75, 80,
+  97, 75, 76, 99, 114, 81, 83, 82, 67, 77,
+  86, 69, 79, 89, 87, 84, 71, 80, 91, 82,
+  77, 74, 82, 83, 77, 70, 87, 91, 97, 70,
+  90, 90, 74, 81, 88, 80, 83, 92, 79, 90,
+  75, 91, 85, 97, 72, 88, 80, 86, 83, 74,
+  108, 95, 84, 80, 65, 83, 96, 78, 113, 81,
+  68, 96, 97, 71, 71, 76, 76, 81, 76, 80,
+  86, 86, 90, 90, 97, 62, 69, 79, 65, 80,
+  138, 81, 80, 95, 85, 77, 81, 85, 86, 75,
+  78, 83, 100, 92, 85, 70, 75, 95, 79, 83,
+  101, 75, 115, 77, 76, 77, 93, 66, 107, 70,
+  67, 83, 69, 81, 71, 98, 90, 85, 89, 93,
+  78, 90, 81, 81, 88, 96, 81, 86, 80, 72,
+  74, 98, 93, 81, 81, 78, 64, 77, 83, 74,
+  79, 89, 84, 85, 70, 83, 92, 79, 72, 81,
+  80, 82, 85, 69, 84, 95, 94, 78, 87, 89,
+  77, 89, 95, 85, 98, 90, 82, 84, 80, 92,
+  76, 95, 76, 85, 77, 81, 79, 77, 104, 97,
+  87, 86, 74, 80, 109, 84, 109, 79, 75, 90,
+  89, 74, 75, 84, 76, 75, 86, 81, 88, 87,
+  88, 83, 101, 65, 77, 77, 69, 83, 114, 71,
+  79, 88, 88, 77, 87, 87, 94, 81, 77, 87,
+  92, 84, 87, 78, 80, 88, 83, 85, 96, 67,
+  101, 87, 79, 79, 99, 73, 97, 75, 78, 88,
+  73, 82, 75, 91, 85, 85, 82, 88, 77, 86,
+  86, 87, 85, 96, 76, 79, 86, 81, 81, 98,
+  72, 84, 84, 74, 68, 80, 83, 71, 74, 90,
+  86, 75, 74, 83, 92, 82, 84, 85, 86, 86,
+  77, 77, 85, 89, 86, 73, 86, 91, 73, 84,
+  86, 71, 124, 94, 71, 98, 88, 79, 83, 92,
+  73, 70, 82, 91, 77, 80, 76, 99, 80, 86,
+  95, 81, 109, 87, 93, 75, 98, 93, 90, 99,
+  81, 82, 93, 70, 79, 90, 90, 86, 83, 77,
+  90, 72, 72, 65, 79, 87, 88, 76, 89, 87,
+  75, 85, 96, 81, 89, 80, 90, 68, 85, 84,
+  87, 93, 81, 70, 89, 79, 93, 90, 68, 89,
+  72, 86, 95, 85, 84, 85, 88, 92, 69, 69,
+  78, 83, 79, 96, 75, 89, 87, 91, 79, 79,
+  97, 74, 88, 72, 91, 82, 72, 73, 62, 84,
+  88, 77, 82, 83, 81, 93, 75, 92, 77, 90,
+  87, 78, 83, 80, 68, 92, 92, 90, 74, 90,
+  101, 84, 78, 77, 82, 92, 80, 83, 100, 70,
+  108, 83, 85, 79, 86, 74, 87, 79, 81, 80,
+  88, 77, 86, 74, 92, 92, 86, 80, 94, 75,
+  94, 86, 99, 75, 81, 87, 93, 106, 101, 81,
+  85, 70, 73, 77, 83, 78, 100, 74, 80, 93,
+  58, 76, 88, 73, 86, 74, 79, 83, 85, 76,
+  88, 88, 87, 83, 81, 86, 85, 78, 86, 80,
+  80, 89, 71, 92, 93, 79, 67, 86, 71, 90,
+  82, 83, 85, 78, 98, 90, 62, 97, 77, 93,
+  82, 97, 89, 84, 71, 86, 75, 76, 83, 67,
+  78, 79, 73, 90, 83, 107, 65, 78, 79, 83,
+  81, 84, 83, 105, 70, 85, 78, 85, 92, 83,
+  87, 74, 86, 95, 73, 86, 79, 82, 93, 93,
+  83, 77, 83, 84, 88, 88, 83, 83, 127, 87,
+  90, 74, 81, 74, 92, 75, 90, 76, 76, 65,
+  93, 86, 85, 81, 82, 82, 84, 71, 90, 89,
+  104, 76, 75, 81, 88, 111, 103, 75, 82, 66,
+  71, 89, 68, 84, 99, 75, 92, 76, 57, 77,
+  85, 76, 106, 72, 82, 83, 76, 69, 78, 88,
+  83, 77, 76, 110, 80, 83, 89, 87, 77, 107,
+  88, 86, 97, 77, 75, 71, 82, 88, 79, 92,
+  93, 80, 97, 82, 66, 84, 79, 93, 83, 93,
+  98, 99, 63, 88, 72, 76, 80, 72, 83, 84,
+  78, 89, 89, 114, 62, 76, 83, 75, 82, 83,
+  94, 91, 71, 78, 80, 78, 91, 82, 83, 76,
+  88, 86, 86, 83, 92, 75, 95, 91, 81, 79,
+  80, 89, 91, 82, 95, 67, 105, 83, 76, 87,
+  84, 73, 78, 83, 89, 75, 92, 83, 85, 62,
+  86, 92, 89, 70, 85, 81, 95, 94, 101, 77,
+  85, 88, 91, 114, 104, 76, 85, 68, 71, 74,
+  94, 77, 96, 74, 83, 97, 60, 71, 93, 75,
+  91, 71, 80, 82, 71, 75, 90, 91, 89, 88,
+  78, 94, 77, 81, 94, 88, 74, 97, 68, 98,
+  103, 84, 69, 73, 64, 86, 84, 88, 81, 72,
+  90, 77, 65, 90, 78, 91, 79, 88, 88, 80,
+  72, 89, 78, 74, 83, 70, 85, 84, 80, 84,
+  83, 108, 64, 75, 81, 78, 88, 81, 84, 94,
+  76, 89, 75, 90, 87, 84, 89, 64, 87, 95,
+  81, 88, 82, 81, 94, 88, 75, 75, 77, 86,
+  90, 89, 93, 74, 123, 90, 94, 66, 82, 70,
+  85, 81, 90, 76, 96, 83, 90, 80, 90, 78,
+  80, 77, 87, 77, 78, 94, 102, 79, 77, 84,
+  89, 115, 106, 83, 84, 69, 65, 76, 76, 88,
+  95, 76, 88, 89, 57, 84, 94, 79, 98, 72,
+  76, 79, 73, 76, 86, 96, 78, 78, 70, 99,
+  81, 80, 89, 82, 78, 97, 62, 95, 103, 68,
+  79, 74, 66, 84, 76, 88, 82, 73, 97, 87,
+  64, 95, 85, 95, 87, 89, 99, 94, 64, 85,
+  75, 70, 77, 70, 76, 85, 70, 91, 86, 105,
+  64, 75, 75, 78, 89, 82, 87, 86, 78, 83,
+  75, 79, 87, 79, 85, 64, 91, 102, 81, 87,
+  89, 76, 90, 89, 82, 75, 81, 84, 87, 86,
+  75, 83, 126, 87, 86, 67, 76, 73, 92, 85,
+  80, 75, 77, 89, 74, 96, 79, 72, 79, 85,
+  93, 75, 80, 95, 91, 72, 83, 77, 87, 114,
+  89, 78, 83, 65, 72, 87, 74, 93, 81, 69,
+  91, 53, 68, 77, 68, 89, 103, 70, 90, 80,
+  68, 87, 82, 88, 89, 76, 84, 95, 90, 80,
+  87, 100, 92, 81, 83, 69, 97, 77, 77, 77,
+  78, 69, 97, 90, 86, 82, 85, 84, 84, 67,
+  89, 87, 83, 86, 88, 104, 76, 86, 84, 71,
+  79, 82, 81, 75, 91, 78, 84, 72, 65, 81,
+  88, 82, 82, 81, 91, 88, 81, 80, 76, 76,
+  76, 81, 81, 79, 88, 88, 103, 80, 84, 90,
+  102, 81, 79, 75, 82, 97, 82, 82, 87, 67,
+  119, 92, 78, 86, 81, 68, 74, 74, 84, 77,
+  105, 75, 84, 72, 85, 83, 84, 77, 99, 75,
+  84, 94, 97, 75, 81, 84, 93, 115, 99, 91,
+  80, 76, 64, 81, 83, 89, 93, 89, 94, 97,
+  51, 74, 91, 69, 92, 77, 91, 76, 69, 64,
+  79, 92, 76, 74, 77, 95, 81, 83, 93, 78,
+  81, 84, 69, 87, 98, 86, 85, 80, 72, 99,
+  73, 88, 77, 75, 89, 87, 63, 109, 78, 85,
+  86, 87, 96, 91, 69, 79, 84, 75, 81, 70,
+  88, 96, 70, 86, 91, 99, 76, 85, 69, 78,
+  88, 79, 91, 84, 78, 80, 63, 76, 76, 73,
+  82, 64, 89, 86, 67, 95, 92, 72, 91, 84,
+  74, 77, 86, 89, 83, 82, 74, 77, 122, 87,
+  80, 94, 80, 70, 84, 80, 76, 76, 88, 96,
+  74, 92, 78, 81, 80, 85, 110, 82, 86, 89,
+  81, 69, 82, 78, 95, 115, 80, 88, 83, 70,
+  74, 91, 82, 88, 79, 75, 92, 62, 57, 74,
+  82, 84, 91, 74, 92, 75, 70, 84, 80, 83,
+  89, 68, 82, 83, 93, 79, 85, 83, 95, 51,
+  72, 67, 81, 80, 77, 82, 74, 82, 90, 90,
+  75, 87, 88, 97, 70, 87, 84, 82, 79, 90,
+  80, 93, 86, 83, 91, 71, 85, 78, 82, 74,
+  92, 78, 85, 66, 67, 80, 81, 69, 80, 80,
+  82, 85, 82, 81, 70, 76, 75, 77, 77, 78,
+  82, 89, 101, 81, 80, 86, 98, 83, 83, 75,
+  83, 91, 75, 77, 65, 79, 101, 80, 86, 78,
+  85, 81, 87, 93, 76, 87, 71, 102, 77, 89,
+  74, 86, 96, 93, 127, 82, 78, 85, 78, 81,
+  91, 76, 95, 104, 87, 83, 87, 77, 75, 76,
+  77, 84, 76, 67, 84, 57, 68, 91, 82, 96,
+  90, 74, 101, 82, 75, 102, 85, 83, 92, 70,
+  109, 82, 106, 84, 81, 82, 96, 66, 79, 69,
+  77, 97, 71, 69, 78, 74, 100, 100, 79, 105,
+  86, 82, 81, 76, 91, 84, 83, 87, 75, 90,
+  94, 90, 93, 77, 95, 83, 84, 76, 94, 75,
+  80, 64, 66, 88, 91, 86, 87, 80, 83, 83,
+  90, 92, 83, 89, 82, 79, 94, 81, 78, 80,
+  97, 81, 89, 99, 96, 87, 85, 96, 92, 92,
+  82, 80, 81, 88, 79, 82, 65, 78, 77, 85,
+  83, 98, 81, 90, 76, 77, 76, 81, 81, 97,
+  83, 97, 82, 76, 109, 98, 88, 81, 94, 84,
+  89, 86, 82, 82, 98, 93, 99, 87, 86, 88,
+  79, 78, 80, 90, 70, 77, 96, 74, 85, 77,
+  83, 79, 76, 96, 93, 78, 96, 76, 86, 67,
+  101, 92, 89, 81, 80, 65, 74, 86, 79, 77,
+  73, 91, 77, 88, 77, 85, 81, 96, 94, 91,
+  89, 80, 82, 72, 76, 110, 73, 82, 97, 81,
+  91, 84, 90, 75, 90, 74, 84, 77, 85, 89,
+  84, 95, 67, 85, 85, 91, 85, 89, 91, 93,
+  100, 108, 87, 69, 88, 85, 70, 93, 80, 83,
+  86, 88, 70, 93, 91, 90, 76, 82, 79, 98,
+  93, 76, 81, 74, 109, 65, 71, 76, 74, 92,
+  92, 83, 87, 87, 80, 69, 79, 78, 77, 99,
+  84, 83, 95, 82, 88, 73, 72, 83, 89, 86,
+  76, 86, 78, 92, 88, 85, 90, 77, 81, 82,
+  82, 86, 78, 82, 94, 67, 76, 74, 94, 65,
+  93, 75, 77, 90, 68, 82, 84, 87, 75, 84,
+  93, 89, 90, 73, 77, 84, 77, 79, 95, 87,
+  83, 96, 79, 75, 83, 85, 73, 86, 97, 95,
+  74, 89, 76, 115, 101, 76, 96, 87, 71, 84,
+  83, 74, 72, 91, 80, 103, 93, 89, 93, 99,
+  71, 89, 78, 91, 89, 84, 81, 95, 106, 79,
+  88, 77, 80, 83, 92, 84, 60, 99, 80, 76,
+  71, 69, 75, 77, 86, 77, 88, 62, 96, 80,
+  90, 86, 111, 78, 71, 81, 66, 89, 95, 79,
+  89, 78, 80, 73, 79, 67, 69, 102, 87, 88,
+  76, 68, 90, 78, 65, 80, 88, 87, 79, 97,
+  72, 94, 89, 96, 84, 70, 72, 84, 82, 77,
+  97, 78, 94, 68, 64, 90, 101, 64, 86, 65,
+  71, 101, 54, 76, 70, 107, 66, 83, 99, 96,
+  93, 90, 87, 93, 73, 85, 101, 76, 91, 110,
+  77, 74, 87, 74, 67, 98, 108, 104, 74, 101,
+  72, 93, 111, 81, 99, 91, 80, 79, 70, 79,
+  67, 95, 84, 115, 92, 96, 93, 84, 75, 90,
+  79, 93, 92, 73, 84, 87, 103, 65, 94, 84,
+  76, 92, 102, 86, 75, 104, 77, 82, 84, 74,
+  70, 72, 96, 77, 87, 53, 79, 84, 85, 87,
+  58, 81, 82, 84, 92, 96, 79, 87, 77, 75,
+  72, 94, 81, 103, 87, 88, 80, 78, 91, 94,
+  82, 74, 105, 84, 93, 90, 81, 76, 99, 85,
+  103, 82, 89, 90, 70, 78, 80, 92, 72, 76,
+  82, 84, 95, 78, 72, 92, 73, 97, 94, 75,
+  102, 74, 92, 68, 107, 89, 87, 75, 72, 60,
+  66, 78, 70, 71, 72, 89, 76, 81, 89, 91,
+  81, 93, 97, 81, 89, 74, 85, 70, 87, 96,
+  70, 80, 95, 73, 87, 85, 89, 89, 89, 73,
+  84, 59, 71, 79, 81, 94, 78, 83, 90, 88,
+  81, 84, 78, 88, 92, 111, 85, 81, 93, 85,
+  72, 85, 74, 68, 81, 89, 67, 101, 99, 94,
+  80, 76, 81, 105, 89, 75, 74, 78, 87, 69,
+  73, 81, 80, 91, 84, 88, 83, 91, 83, 71,
+  82, 85, 83, 90, 83, 86, 96, 94, 83, 65,
+  89, 84, 92, 77, 67, 87, 90, 97, 94, 89,
+  74, 83, 76, 79, 83, 86, 74, 76, 80, 68,
+  80, 77, 83, 75, 91, 81, 81, 78, 76, 79,
+  90, 76, 83, 88, 95, 91, 79, 70, 71, 80,
+  72, 76, 93, 87, 75, 81, 83, 81, 77, 83,
+  87, 84, 93, 86, 71, 82, 81, 108, 89, 79,
+  93, 85, 70, 85, 88, 75, 80, 82, 83, 77,
+  83, 85, 89, 101, 70, 94, 81, 91, 75, 88,
+  83, 93, 92, 92, 79, 94, 85, 86, 81, 81,
+  62, 85, 77, 77, 72, 79, 80, 77, 71, 69,
+  88, 75, 95, 85, 85, 87, 100, 81, 77, 83,
+  72, 88, 88, 82, 88, 83, 82, 73, 89, 70,
+  73, 94, 89, 86, 84, 84, 86, 75, 83, 85,
+  94, 88, 69, 97, 79, 88, 90, 97, 66, 78,
+  82, 78, 85, 77, 86, 80, 86, 70, 69, 92,
+  93, 65, 98, 61, 75, 89, 62, 84, 76, 102,
+  72, 80, 96, 101, 81, 83, 82, 89, 79, 82,
+  108, 85, 85, 90, 77, 76, 81, 72, 82, 93,
+  97, 100, 72, 96, 73, 86, 107, 91, 89, 97,
+  78, 82, 75, 71, 75, 88, 80, 94, 86, 98,
+  87, 84, 76, 94, 79, 92, 74, 83, 91, 91,
+  91, 78, 86, 98, 78, 88, 91, 81, 80, 95,
+  74, 80, 83, 76, 71, 69, 78, 72, 85, 64,
+  84, 85, 90, 93, 69, 84, 84, 82, 96, 88,
+  70, 83, 82, 73, 72, 104, 70, 101, 78, 85,
+  81, 82, 93, 91, 87, 85, 94, 75, 85, 85,
+  86, 78, 86, 85, 84, 80, 81, 92, 75, 87,
+  83, 78, 76, 89, 79, 89, 92, 77, 71, 95,
+  65, 108, 95, 82, 107, 83, 89, 84, 102, 86,
+  90, 77, 80, 70, 83, 73, 75, 80, 69, 99,
+  79, 74, 71, 86, 83, 81, 92, 79, 89, 71,
+  104, 72, 88, 89, 80, 88, 93, 67, 94, 92,
+  81, 90, 79, 71, 85, 68, 70, 82, 78, 86,
+  72, 85, 88, 78, 90, 73, 70, 78, 86, 94,
+  93, 68, 88, 82, 77, 90, 84, 67, 80, 88,
+  58, 95, 95, 89, 97, 85, 73, 87, 90, 87,
+  83, 87, 74, 73, 76, 83, 97, 90, 74, 92,
+  80, 77, 81, 81, 68, 95, 80, 82, 82, 89,
+  101, 91, 91, 77, 97, 83, 82, 78, 76, 83,
+  98, 81, 92, 90, 79, 88, 79, 80, 87, 76,
+  75, 80, 73, 81, 81, 73, 77, 101, 77, 100,
+  91, 78, 98, 81, 84, 80, 92, 89, 92, 82,
+  82, 83, 83, 81, 80, 82, 71, 94, 71, 77,
+  80, 91, 79, 82, 92, 86, 87, 67, 89, 74,
+  90, 104, 85, 84, 91, 81, 84, 88, 88, 85,
+  81, 73, 79, 66, 83, 82, 80, 92, 78, 81,
+  82, 82, 86, 76, 80, 83, 85, 92, 85, 78,
+  83, 84, 74, 89, 75, 71, 81, 84, 72, 89,
+  92, 80, 85, 82, 79, 88, 92, 83, 94, 92,
+  80, 82, 79, 80, 89, 89, 78, 92, 85, 84,
+  85, 77, 71, 85, 73, 82, 87, 88, 98, 88,
+  91, 84, 96, 84, 88, 92, 76, 89, 86, 87,
+  83, 92, 71, 89, 83, 82, 89, 81, 83, 77,
+  77, 80, 75, 92, 85, 89, 92, 90, 87, 83,
+  90, 80, 74, 90, 87, 88, 93, 95, 84, 84,
+  85, 91, 80, 87, 83, 81, 86, 89, 78, 83,
+  81, 84, 94, 83, 82, 77, 87, 83, 84, 90,
+  96, 91, 92, 88, 92, 85, 87, 81, 78, 78,
+  78, 78, 89, 92, 77, 86, 76, 85, 79, 85,
+  78, 84, 89, 86, 86, 86, 92, 85, 78, 88,
+  81, 81, 91, 80, 81, 85, 85, 82, 86, 72,
+  80, 83, 78, 73,
+};
+
+unsigned char expected_c_data[c_count] = {
+  166, 113, 100, 112, 92, 110, 111, 106, 135, 122,
+  107, 118, 103, 122, 139, 115, 133, 93, 102, 103,
+  108, 107, 92, 93, 105, 111, 148, 115, 108, 121,
+  123, 102, 136, 137, 101, 137, 113, 99, 115, 128,
+  151, 105, 119, 99, 98, 98, 102, 89, 78, 99,
+  125, 118, 124, 145, 126, 107, 118, 130, 141, 105,
+  121, 108, 121, 123, 150, 158, 121, 90, 101, 115,
+  110, 115, 104, 124, 99, 117, 197, 111, 122, 111,
+  118, 117, 81, 116, 107, 107, 159, 131, 90, 119,
+  122, 111, 102, 112, 115, 132, 107, 91, 114, 149,
+  138, 106, 146, 104, 114, 99, 141, 97, 98, 88,
+  137, 107, 93, 124, 100, 82, 116, 94, 100, 102,
+  132, 120, 123, 129, 108, 129, 95, 113, 121, 129,
+  105, 108, 107, 141, 109, 77, 117, 102, 101, 131,
+  92, 118, 111, 122, 97, 115, 147, 119, 112, 113,
+  125, 120, 110, 111, 77, 109, 106, 103, 101, 109,
+  92, 102, 155, 91, 88, 105, 122, 105, 112, 102,
+  119, 94, 111, 103, 82, 123, 85, 105, 79, 141,
+  124, 121, 116, 110, 134, 99, 117, 72, 86, 108,
+  118, 103, 169, 122, 140, 102, 80, 105, 97, 94,
+  144, 158, 97, 127, 112, 138, 131, 104, 120, 82,
+  84, 93, 109, 106, 70, 89, 94, 112, 130, 124,
+  119, 117, 109, 97, 110, 131, 89, 116, 97, 119,
+  129, 96, 156, 78, 121, 118, 89, 89, 101, 102,
+  28, 108, 145, 125, 115, 132, 116, 108, 144, 127,
+  120, 121, 130, 116, 116, 136, 147, 152, 113, 84,
+  89, 114, 126, 104, 122, 117, 98, 82, 149, 104,
+  139, 91, 109, 124, 91, 115, 129, 134, 203, 144,
+  86, 102, 119, 112, 97, 99, 120, 127, 103, 76,
+  116, 155, 156, 113, 170, 96, 123, 99, 155, 125,
+  84, 85, 139, 119, 90, 140, 82, 87, 113, 99,
+  91, 104, 148, 145, 115, 121, 97, 131, 72, 120,
+  125, 131, 144, 68, 112, 164, 111, 84, 124, 92,
+  82, 146, 104, 112, 132, 135, 90, 121, 151, 134,
+  105, 113, 122, 125, 104, 118, 106, 98, 88, 102,
+  111, 108, 138, 116, 147, 79, 122, 112, 112, 144,
+  91, 71, 113, 119, 89, 102, 95, 122, 71, 102,
+  77, 149, 123, 108, 125, 89, 145, 100, 129, 85,
+  76, 110, 105, 126, 156, 112, 139, 104, 63, 95,
+  85, 106, 124, 166, 79, 121, 129, 132, 122, 102,
+  105, 93, 83, 82, 119, 101, 86, 131, 78, 103,
+  118, 127, 132, 103, 110, 94, 99, 109, 100, 130,
+  77, 146, 158, 88, 132, 95, 117, 108, 72, 120,
+  115, 121, 34, 129, 158, 115, 118, 98, 111, 122,
+  134, 99, 101, 121, 114, 125, 112, 125, 124, 110,
+  103, 96, 98, 127, 113, 105, 122, 110, 103, 85,
+  140, 119, 128, 110, 125, 114, 116, 85, 145, 135,
+  197, 142, 78, 86, 101, 132, 104, 109, 148, 129,
+  110, 93, 112, 126, 139, 114, 165, 100, 132, 102,
+  140, 165, 61, 131, 104, 120, 86, 143, 81, 105,
+  101, 124, 73, 107, 144, 156, 121, 120, 72, 129,
+  80, 122, 113, 123, 146, 55, 103, 148, 117, 142,
+  110, 101, 62, 162, 100, 100, 152, 144, 104, 114,
+  131, 146, 105, 118, 87, 105, 92, 107, 114, 88,
+  72, 112, 108, 135, 134, 142, 114, 97, 134, 101,
+  122, 158, 76, 81, 121, 140, 77, 102, 125, 105,
+  70, 94, 100, 141, 105, 103, 151, 93, 136, 112,
+  108, 94, 71, 113, 116, 132, 152, 97, 107, 107,
+  75, 113, 77, 134, 110, 128, 71, 110, 110, 95,
+  104, 79, 96, 97, 86, 93, 116, 134, 90, 131,
+  66, 90, 112, 111, 134, 97, 131, 130, 116, 91,
+  98, 140, 66, 127, 151, 119, 125, 104, 119, 72,
+  77, 109, 107, 116, 33, 128, 145, 129, 104, 109,
+  114, 121, 124, 94, 91, 146, 100, 113, 108, 130,
+  105, 89, 92, 98, 87, 98, 96, 97, 118, 120,
+  105, 132, 147, 141, 106, 119, 122, 116, 116, 79,
+  104, 115, 188, 130, 69, 97, 116, 117, 114, 111,
+  152, 127, 121, 100, 118, 115, 120, 116, 145, 89,
+  130, 115, 110, 138, 75, 134, 109, 90, 94, 145,
+  89, 115, 97, 137, 65, 111, 125, 134, 125, 145,
+  67, 115, 95, 116, 92, 126, 98, 79, 107, 134,
+  122, 128, 101, 118, 60, 161, 79, 106, 134, 128,
+  108, 99, 102, 122, 84, 116, 73, 121, 98, 95,
+  70, 74, 56, 98, 79, 147, 126, 127, 101, 110,
+  144, 114, 135, 112, 80, 95, 130, 165, 90, 126,
+  98, 99, 65, 98, 134, 138, 91, 114, 153, 104,
+  127, 116, 97, 89, 78, 112, 109, 111, 173, 110,
+  152, 106, 115, 154, 75, 128, 109, 91, 95, 114,
+  131, 101, 114, 90, 94, 104, 92, 112, 117, 101,
+  94, 99, 80, 114, 119, 95, 134, 109, 153, 139,
+  126, 111, 113, 130, 90, 105, 127, 122, 137, 103,
+  128, 59, 102, 109, 96, 121, 42, 128, 135, 138,
+  88, 142, 122, 118, 121, 110, 112, 143, 106, 112,
+  112, 117, 136, 120, 111, 123, 83, 88, 116, 97,
+  132, 131, 111, 108, 157, 130, 86, 106, 118, 121,
+  116, 108, 106, 96, 177, 130, 74, 93, 107, 114,
+  113, 121, 111, 137, 124, 85, 121, 135, 137, 131,
+  140, 91, 124, 106, 109, 100, 98, 103, 114, 109,
+  120, 133, 110, 113, 97, 137, 84, 121, 119, 129,
+  117, 135, 84, 117, 103, 119, 118, 97, 105, 100,
+  94, 114, 119, 118, 104, 117, 76, 155, 86, 134,
+  119, 124, 107, 106, 111, 104, 102, 114, 102, 112,
+  112, 118, 86, 102, 80, 97, 93, 115, 101, 100,
+  99, 107, 117, 129, 137, 107, 96, 123, 116, 134,
+  97, 104, 99, 111, 74, 97, 114, 133, 97, 131,
+  143, 103, 127, 106, 106, 81, 100, 118, 106, 100,
+  182, 115, 96, 110, 101, 149, 74, 123, 131, 88,
+  100, 112, 128, 98, 131, 95, 101, 105, 92, 124,
+  104, 84, 91, 128, 83, 97, 118, 93, 135, 105,
+  144, 109, 145, 118, 106, 126, 95, 108, 112, 126,
+  125, 98, 126, 59, 124, 111, 102, 129, 45, 119,
+  131, 115, 77, 141, 129, 126, 104, 125, 107, 122,
+  117, 105, 119, 117, 143, 133, 125, 106, 89, 93,
+  134, 103, 133, 120, 106, 108, 169, 124, 79, 105,
+  108, 128, 77, 106, 107, 100, 153, 134, 74, 79,
+  108, 135, 106, 118, 96, 125, 113, 72, 108, 133,
+  155, 112, 160, 89, 131, 77, 118, 110, 89, 89,
+  114, 120, 107, 126, 99, 114, 90, 120, 84, 120,
+  123, 124, 113, 126, 96, 120, 101, 125, 99, 104,
+  96, 98, 98, 113, 106, 119, 103, 104, 100, 149,
+  98, 131, 126, 125, 112, 108, 127, 103, 113, 115,
+  117, 97, 104, 116, 70, 91, 84, 97, 88, 103,
+  84, 127, 110, 91, 99, 126, 140, 84, 104, 113,
+  103, 100, 91, 90, 93, 125, 70, 93, 95, 115,
+  105, 128, 139, 109, 137, 98, 99, 75, 97, 111,
+  109, 105, 166, 123, 106, 112, 93, 132, 82, 102,
+  132, 90, 97, 117, 124, 111, 128, 101, 104, 94,
+  96, 130, 93, 74, 89, 128, 86, 100, 124, 86,
+  132, 113, 129, 105, 140, 128, 108, 109, 99, 105,
+  104, 120, 123, 89, 119, 52, 134, 110, 96, 133,
+  52, 106, 129, 114, 80, 128, 124, 121, 101, 112,
+  102, 119, 126, 96, 112, 120, 143, 134, 125, 107,
+  94, 99, 138, 104, 129, 110, 105, 110, 173, 110,
+  104, 92, 105, 123, 79, 100, 108, 111, 150, 139,
+  77, 80, 131, 132, 103, 105, 101, 110, 107, 70,
+  107, 127, 155, 107, 171, 97, 125, 77, 128, 113,
+  90, 85, 108, 121, 124, 126, 87, 113, 89, 97,
+  91, 119, 114, 131, 122, 115, 103, 127, 89, 117,
+  92, 89, 89, 84, 98, 108, 100, 98, 114, 87,
+  108, 137, 113, 136, 128, 137, 114, 105, 124, 125,
+  117, 119, 115, 125, 89, 108, 84, 93, 98, 95,
+  83, 101, 99, 137, 106, 85, 109, 134, 138, 104,
+  112, 92, 95, 110, 88, 81, 108, 134, 57, 80,
+  86, 119, 116, 115, 145, 101, 140, 97, 93, 78,
+  97, 119, 101, 110, 149, 117, 103, 118, 103, 125,
+  85, 99, 116, 95, 84, 118, 125, 124, 111, 99,
+  109, 94, 90, 124, 90, 66, 82, 123, 86, 105,
+  126, 78, 114, 109, 126, 97, 119, 148, 104, 89,
+  101, 105, 103, 115, 118, 81, 109, 56, 125, 107,
+  84, 123, 62, 102, 122, 103, 83, 111, 105, 106,
+  100, 93, 112, 118, 135, 97, 110, 116, 143, 147,
+  125, 103, 91, 94, 138, 99, 123, 111, 110, 111,
+  165, 108, 117, 89, 99, 120, 67, 101, 105, 106,
+  134, 137, 87, 79, 119, 114, 102, 96, 103, 114,
+  102, 71, 107, 143, 154, 91, 167, 104, 103, 90,
+  126, 102, 89, 80, 114, 131, 118, 128, 77, 107,
+  99, 87, 98, 110, 104, 125, 130, 118, 106, 125,
+  73, 119, 96, 91, 86, 72, 88, 107, 94, 102,
+  121, 77, 109, 114, 114, 138, 128, 142, 113, 102,
+  108, 133, 112, 113, 121, 117, 77, 106, 83, 107,
+  108, 88, 85, 96, 102, 119, 97, 76, 100, 135,
+  132, 101, 111, 80, 89, 117, 83, 69, 98, 124,
+  48, 67, 85, 123, 122, 109, 149, 90, 136, 93,
+  102, 79, 96, 140, 96, 114, 137, 110, 105, 122,
+  109, 118, 85, 106, 101, 100, 82, 112, 120, 128,
+  105, 96, 110, 97, 89, 110, 86, 69, 74, 110,
+  90, 114, 126, 71, 99, 104, 121, 87, 101, 164,
+  99, 76, 104, 104, 101, 104, 118, 84, 102, 64,
+  112, 96, 68, 118, 68, 98, 111, 106, 84, 101,
+  93, 99, 103, 90, 124, 120, 140, 95, 104, 111,
+  146, 155, 117, 94, 87, 90, 128, 97, 116, 114,
+  117, 96, 161, 106, 117, 88, 92, 115, 58, 103,
+  102, 96, 120, 125, 88, 74, 113, 96, 97, 90,
+  101, 110, 96, 67, 105, 156, 149, 90, 152, 98,
+  78, 95, 122, 86, 95, 71, 121, 133, 111, 129,
+  68, 97, 109, 78, 108, 99, 97, 113, 138, 112,
+  110, 119, 67, 115, 92, 97, 86, 72, 89, 112,
+  86, 102, 123, 69, 107, 98, 114, 122, 118, 145,
+  113, 99, 100, 126, 104, 110, 118, 103, 68, 104,
+  81, 121, 109, 78, 93, 87, 111, 100, 95, 74,
+  100, 126, 128, 100, 113, 81, 94, 121, 84, 71,
+  82, 119, 47, 63, 80, 122, 129, 107, 147, 80,
+  137, 84, 106, 77, 102, 153, 95, 118, 128, 106,
+  111, 123, 113, 118, 81, 114, 96, 105, 88, 110,
+  121, 125, 108, 94, 108, 94, 87, 105, 85, 74,
+  76, 95, 93, 120, 123, 76, 101, 104, 115, 78,
+  87, 163, 96, 73, 106, 111, 93, 93, 128, 87,
+  108, 75, 107, 90, 63, 118, 69, 89, 115, 112,
+  83, 98, 86, 95, 109, 94, 131, 124, 146, 102,
+  96, 109, 148, 153, 113, 99, 82, 85, 115, 93,
+  118, 112, 117, 84, 155, 108, 110, 102, 87, 110,
+  58, 114, 106, 82, 113, 109, 87, 77, 108, 86,
+  95, 95, 107, 107, 93, 65, 99, 166, 147, 90,
+  150, 95, 63, 87, 121, 80, 97, 69, 123, 134,
+  109, 125, 63, 87, 118, 73, 118, 88, 98, 111,
+  134, 102, 114, 121, 66, 111, 82, 106, 92, 76,
+  92, 118, 86, 109, 130, 65, 106, 94, 113, 109,
+  118, 153, 108, 99, 100, 114, 111, 108, 127, 95,
+  66, 105, 82, 134, 115, 73, 106, 82, 119, 97,
+  101, 72, 99, 116, 123, 102, 115, 85, 107, 121,
+  95, 78, 79, 108, 50, 68, 78, 118, 142, 103,
+  141, 79, 131, 74, 112, 83, 104, 153, 96, 120,
+  133, 107, 111, 127, 113, 120, 87, 117, 100, 123,
+  97, 115, 119, 118, 121, 94, 100, 91, 93, 104,
+  81, 75, 79, 90, 92, 125, 120, 87, 114, 104,
+  115, 77, 85, 158, 99, 85, 109, 123, 89, 93,
+  136, 99, 123, 89, 104, 105, 69, 124, 72, 91,
+  126, 100, 90, 87, 87, 97, 121, 97, 131, 120,
+  145, 109, 98, 107, 154, 149, 116, 95, 80, 85,
+  107, 99, 130, 115, 114, 82, 151, 111, 110, 119,
+  89, 106, 54, 116, 116, 91, 110, 98, 85, 84,
+  107, 85, 96, 102, 113, 112, 100, 68, 99, 162,
+  158, 91, 152, 95, 75, 95, 124, 95, 89, 71,
+  123, 134, 98, 126, 56, 83, 124, 87, 128, 86,
+  103, 111, 129, 92, 115, 126, 75, 107, 80, 107,
+  108, 85, 94, 120, 91, 121, 134, 70, 105, 101,
+  112, 106, 121, 162, 101, 99, 105, 100, 118, 107,
+  128, 97, 73, 111, 73, 141, 120, 75, 110, 90,
+  130, 110, 113, 86, 107, 106, 123, 94, 121, 102,
+  114, 124, 108, 85, 86, 99, 61, 83, 91, 109,
+  142, 104, 135, 82, 124, 70, 115, 95, 107, 145,
+  105, 126, 135, 106, 124, 124, 114, 119, 87, 123,
+  99, 122, 110, 114, 121, 113, 119, 90, 99, 88,
+  96, 103, 75, 91, 91, 88, 91, 126, 116, 92,
+  121, 107, 122, 83, 98, 147, 99, 90, 108, 121,
+  90, 96, 141, 104, 133, 87, 105, 102, 65, 124,
+  71, 102, 122, 93, 99, 85, 95, 99, 119, 97,
+  126, 132, 132, 106, 94, 108, 151, 151, 117, 88,
+  82, 77, 90, 102, 121, 119, 115, 87, 154, 113,
+  112, 135, 94, 104, 67, 113, 114, 100, 114, 100,
+  80, 97, 108, 94, 104, 104, 107, 108, 106, 67,
+  105, 145, 158, 100, 136, 98, 90, 87, 124, 113,
+  99, 68, 130, 119, 97, 131, 55, 81, 128, 103,
+  135, 90, 107, 115, 127, 89, 114, 126, 87, 105,
+  80, 96, 108, 96, 91, 98, 104, 130, 134, 70,
+  102, 103, 106, 97, 114, 164, 97, 97, 97, 93,
+  126, 107, 110, 97, 85, 113, 76, 148, 116, 69,
+  103, 98, 136, 98, 105, 101, 110, 100, 123, 92,
+  124, 117, 112, 123, 124, 82, 93, 95, 69, 95,
+  112, 102, 134, 110, 135, 81, 118, 73, 126, 87,
+  111, 133, 113, 122, 138, 107, 123, 122, 117, 119,
+  97, 126, 93, 104, 115, 110, 118, 110, 121, 88,
+  102, 85, 93, 110, 74, 84, 94, 98, 92, 119,
+  120, 86, 124, 103, 126, 87, 111, 142, 100, 85,
+  112, 111, 91, 104, 143, 104, 133, 89, 105, 92,
+  70, 127, 71, 107, 115, 102, 98, 93, 99, 95,
+  113, 104, 127, 138, 127, 106, 90, 110, 156, 152,
+  119, 84, 90, 71, 91, 100, 122, 123, 118, 92,
+  151, 114, 109, 128, 99, 102, 67, 119, 101, 100,
+  115, 104, 87, 103, 106, 106, 98, 108, 105, 106,
+  105, 74, 108, 139, 154, 101, 145, 94, 81, 86,
+  123, 95, 98, 68, 133, 111, 101, 130, 57, 81,
+  122, 101, 137, 94, 109, 113, 129, 84, 106, 120,
+  93, 110, 88, 88, 107, 93, 85, 94, 106, 128,
+  126, 68, 99, 100, 111, 100, 108, 155, 99, 92,
+  95, 94, 121, 109, 129, 96, 91, 114, 78, 157,
+  121, 70, 99, 95, 130, 102, 103, 109, 102, 112,
+  122, 85, 118, 120, 109, 118, 120, 89, 91, 93,
+  71, 96, 120, 101, 131, 115, 136, 84, 116, 75,
+  128, 100, 115, 132, 106, 116, 137, 109, 118, 127,
+  120, 130, 105, 109, 97, 107, 123, 111, 115, 117,
+  133, 98, 97, 84, 91, 118, 76, 68, 86, 103,
+  94, 118, 125, 78, 124, 102, 130, 79, 115, 145,
+  97, 77, 117, 108, 95, 100, 142, 96, 129, 92,
+  108, 114, 71, 128, 72, 107, 113, 101, 94, 90,
+  98, 94, 109, 102, 126, 131, 134, 108, 86, 106,
+  167, 157, 124, 89, 92, 72, 102, 91, 135, 125,
+  116, 88, 148, 105, 99, 109, 98, 108, 56, 111,
+  99, 103, 120, 104, 99, 106, 107, 98, 80, 112,
+  106, 112, 107, 82, 102, 157, 149, 105, 167, 91,
+  75, 93, 124, 90, 95, 62, 126, 127, 103, 123,
+  62, 86, 113, 87, 139, 96, 109, 115, 127, 85,
+  102, 112, 94, 106, 101, 88, 105, 89, 84, 102,
+  93, 123, 115, 64, 102, 100, 116, 100, 116, 143,
+  101, 94, 106, 96, 111, 107, 138, 95, 90, 116,
+  73, 160, 129, 81, 99, 90, 115, 113, 109, 102,
+  96, 123, 126, 83, 113, 108, 106, 122, 106, 77,
+  80, 97, 68, 81, 105, 102, 129, 121, 139, 80,
+  113, 66, 118, 115, 116, 134, 104, 115, 142, 111,
+  110, 120, 118, 148, 88, 94, 104, 119, 129, 109,
+  124, 130, 130, 110, 89, 85, 93, 116, 86, 73,
+  87, 95, 96, 128, 128, 74, 120, 103, 132, 76,
+  109, 152, 87, 77, 116, 122, 97, 97, 139, 94,
+  123, 87, 114, 120, 64, 123, 65, 100, 117, 95,
+  84, 86, 99, 101, 113, 101, 124, 124, 134, 97,
+  85, 101, 180, 169, 122, 101, 86, 77, 107, 93,
+  127, 128, 113, 77, 152, 99, 92, 97, 87, 118,
+  58, 104, 108, 98, 130, 114, 99, 98, 103, 88,
+  72, 111, 102, 114, 109, 78, 106, 167, 143, 112,
+  170, 89, 79, 75, 125, 103, 99, 61, 125, 141,
+  102, 124, 69, 96, 105, 86, 129, 96, 108, 128,
+  127, 97, 97, 109, 83, 110, 114, 90, 99, 92,
+  81, 105, 88, 120, 103, 67, 104, 104, 111, 94,
+  117, 145, 100, 103, 122, 96, 104, 102, 118, 92,
+  86, 113, 68, 147, 118, 78, 112, 94, 100, 99,
+  103, 84, 93, 121, 128, 92, 117, 92, 100, 118,
+  92, 68, 83, 103, 64, 63, 96, 106, 118, 134,
+  142, 73, 116, 63, 102, 95, 115, 135, 100, 112,
+  158, 115, 94, 110, 107, 154, 75, 91, 118, 123,
+  115, 107, 132, 126, 124, 117, 90, 91, 87, 112,
+  107, 88, 87, 87, 89, 118, 132, 81, 125, 106,
+  132, 78, 89, 147, 93, 94, 100, 138, 91, 94,
+  132, 94, 121, 69, 117, 115, 66, 120, 58, 98,
+  132, 102, 69, 88, 99, 108, 110, 107, 122, 115,
+  129, 95, 99, 101, 172, 168, 119, 114, 78, 86,
+  120, 98, 120, 139, 111, 70, 157, 114, 90, 99,
+  86, 124, 73, 105, 128, 108, 149, 130, 87, 71,
+  99, 86, 82, 114, 109, 110, 104, 80, 114, 164,
+  147, 116, 185, 83, 87, 72, 127, 117, 87, 72,
+  123, 146, 92, 123, 78, 105, 104, 98, 112, 98,
+  108, 133, 116, 123, 89, 132, 67, 125, 111, 121,
+  99, 94, 79, 120, 92, 110, 103, 84, 104, 122,
+  118, 110, 127, 144, 99, 111, 127, 94, 101, 107,
+  113, 92, 85, 103, 64, 119, 99, 79, 123, 108,
+  116, 99, 113, 79, 109, 111, 129, 97, 120, 92,
+  104, 121, 82, 70, 91, 106, 58, 68, 94, 112,
+  113, 141, 140, 80, 130, 69, 92, 78, 98, 133,
+  86, 121, 164, 110, 117, 105, 86, 140, 72, 96,
+  121, 124, 100, 110, 136, 102, 120, 111, 102, 111,
+  94, 106, 117, 116, 85, 111, 78, 107, 131, 97,
+  124, 99, 134, 103, 87, 124, 115, 133, 81, 137,
+  107, 88, 129, 92, 126, 69, 112, 117, 92, 128,
+  56, 113, 141, 113, 73, 90, 111, 117, 120, 122,
+  111, 112, 103, 105, 121, 113, 139, 131, 110, 119,
+  84, 96, 119, 107, 129, 145, 110, 80, 153, 130,
+  108, 120, 103, 120, 105, 93, 138, 119, 189, 134,
+  75, 68, 113, 116, 106, 121, 120, 110, 112, 88,
+  123, 144, 149, 125, 178, 83, 117, 84, 120, 156,
+  82, 95, 111, 140, 94, 130, 86, 110, 99, 119,
+  96, 106, 118, 126, 111, 134, 79, 173, 78, 128,
+  96, 144, 120, 98, 94, 129, 113, 111, 107, 107,
+  86, 150, 127, 124, 128, 127, 103, 103, 120, 100,
+  102, 119, 107, 111, 92, 100, 82, 95, 82, 96,
+  107, 119, 149, 131, 115, 87, 138, 100, 133, 108,
+  106, 116, 129, 133, 92, 94, 94, 109, 59, 91,
+  95, 120, 98, 129, 144, 93, 133, 89, 86, 78,
+  89, 124, 75, 136, 160, 117, 148, 102, 64, 120,
+  73, 141, 124, 109, 98, 117, 129, 79, 114, 110,
+  117, 122, 106, 102, 107, 143, 94, 138, 76, 99,
+  128, 106, 126, 105, 122, 146, 140, 107, 114, 159,
+  78, 125, 131, 99, 128, 90, 130, 73, 96, 111,
+  116, 142, 49, 135, 130, 128, 102, 113, 131, 129,
+  116, 139, 93, 135, 98, 113, 122, 127, 109, 94,
+  108, 114, 102, 110, 89, 110, 134, 130, 106, 111,
+  155, 132, 98, 133, 133, 118, 113, 84, 119, 114,
+  208, 130, 70, 99, 143, 141, 121, 112, 115, 110,
+  115, 105, 113, 114, 142, 131, 159, 92, 144, 78,
+  119, 153, 88, 104, 115, 112, 109, 138, 90, 111,
+  92, 128, 86, 112, 128, 136, 116, 126, 79, 169,
+  106, 122, 89, 132, 119, 91, 118, 124, 130, 129,
+  98, 119, 78, 180, 121, 117, 110, 112, 106, 90,
+  119, 115, 102, 118, 99, 124, 98, 110, 90, 77,
+  82, 96, 91, 125, 125, 165, 121, 101, 134, 109,
+  132, 123, 101, 117, 141, 114, 103, 108, 110, 113,
+  71, 114, 125, 113, 90, 116, 157, 107, 114, 109,
+  90, 95, 83, 104, 81, 128, 163, 137, 107, 104,
+  60, 118, 92, 138, 122, 92, 106, 132, 114, 98,
+  119, 104, 114, 102, 108, 106, 101, 118, 94, 157,
+  87, 100, 127, 109, 139, 104, 114, 158, 157, 122,
+  118, 145, 91, 113, 131, 126, 140, 89, 124, 77,
+  94, 117, 122, 148, 36, 137, 138, 140, 113, 129,
+  124, 129, 118, 121, 84, 109, 117, 116, 111, 128,
+  135, 105, 124, 105, 111, 120, 112, 122, 134, 117,
+  101, 109, 152, 118, 77, 110, 135, 114, 107, 90,
+  99, 115, 189, 136, 81, 119, 154, 131, 135, 110,
+  121, 121, 112, 119, 103, 117, 153, 111, 179, 100,
+  149, 73, 142, 112, 74, 87, 104, 106, 91, 130,
+  86, 114, 82, 113, 96, 113, 135, 162, 119, 113,
+  85, 144, 105, 118, 101, 109, 120, 76, 116, 123,
+  120, 123, 91, 110, 83, 188, 116, 137, 117, 122,
+  112, 101, 147, 133, 111, 118, 109, 138, 97, 119,
+  70, 81, 114, 89, 89, 120, 73, 176, 134, 99,
+  115, 148, 121, 129, 106, 94, 126, 111, 91, 118,
+  132, 123, 73, 97, 113, 101, 94, 117, 154, 117,
+  115, 105, 89, 106, 92, 103, 86, 102, 176, 145,
+  119, 100, 77, 131, 83, 97, 125, 108, 112, 126,
+  123, 128, 135, 100, 107, 74, 88, 113, 101, 87,
+  92, 112, 93, 88, 132, 98, 135, 110, 123, 123,
+  117, 138, 104, 103, 104, 120, 101, 123, 156, 80,
+  118, 73, 101, 116, 95, 127, 32, 129, 142, 120,
+  92, 105, 104, 112, 124, 87, 99, 102, 123, 113,
+  112, 122, 155, 152, 121, 98, 94, 96, 131, 106,
+  128, 120, 96, 102, 150, 101, 83, 92, 109, 128,
+  93, 88, 109, 113, 162, 138, 91, 117, 139, 98,
+  106, 106, 119, 129, 102, 103, 110, 152, 159, 104,
+  206, 101, 144, 96, 152, 98, 69, 67, 111, 127,
+  93, 121, 79, 106, 103, 105, 102, 115, 127, 160,
+  105, 114, 95, 132, 84, 116, 120, 89, 110, 74,
+  95, 109, 102, 104, 98, 98, 94, 176, 117, 138,
+  132, 134, 107, 116, 150, 123, 122, 108, 110, 122,
+  89, 118, 69, 100, 122, 86, 89, 113, 85, 133,
+  136, 83, 108, 156, 125, 113, 108, 85, 97, 129,
+  95, 71, 108, 113, 60, 88, 96, 100, 104, 138,
+  133, 93, 142, 95, 105, 105, 97, 109, 81, 110,
+  186, 132, 126, 94, 85, 137, 73, 86, 117, 123,
+  96, 120, 139, 138, 134, 101, 100, 84, 87, 102,
+  110, 76, 80, 94, 85, 92, 144, 92, 114, 107,
+  130, 105, 108, 154, 100, 101, 105, 127, 106, 93,
+  153, 85, 107, 82, 91, 119, 92, 106, 35, 129,
+  144, 104, 88, 90, 98, 109, 126, 87, 129, 91,
+  106, 109, 142, 119, 151, 175, 126, 104, 92, 90,
+  122, 85, 123, 131, 100, 79, 159, 108, 124, 97,
+  95, 130, 95, 78, 140, 122, 172, 138, 94, 82,
+  114, 110, 102, 111, 106, 110, 96, 80, 129, 171,
+  155, 115, 192, 95, 126, 101, 139, 118, 68, 73,
+  118, 160, 96, 113, 82, 109, 117, 112, 101, 113,
+  127, 130, 104, 147, 86, 151, 78, 122, 126, 114,
+  128, 80, 82, 107, 101, 113, 107, 106, 92, 149,
+  137, 129, 135, 131, 102, 103, 134, 108, 106, 102,
+  92, 97, 86, 113, 73, 104, 105, 87, 101, 101,
+  105, 94, 124, 77, 113, 115, 140, 98, 103, 112,
+  100, 121, 95, 53, 77, 109, 56, 94, 83, 117,
+  97, 145, 129, 76, 143, 92, 106, 87, 102, 122,
+  82, 139, 156, 126, 85, 91, 56, 117, 72, 105,
+  102, 123, 79, 127, 115, 127, 116, 81, 103, 100,
+  61, 81, 113, 139, 68, 121, 63, 93, 154, 101,
+  93, 89, 116, 122, 116, 124, 89, 118, 89, 129,
+  126, 92, 128, 99, 105, 104, 78, 84, 88, 93,
+  29, 114, 145, 117, 73, 90, 107, 90, 109, 143,
+  122, 99, 97, 116, 162, 149, 113, 145, 120, 99,
+  92, 109, 109, 83, 122, 117, 99, 102, 160, 145,
+  128, 95, 94, 118, 115, 61, 120, 133, 216, 131,
+  80, 82, 136, 132, 131, 112, 123, 87, 92, 94,
+  116, 138, 129, 96, 142, 84, 119, 91, 118, 139,
+  68, 100, 110, 131, 82, 118, 86, 126, 116, 114,
+  85, 111, 132, 107, 115, 174, 61, 184, 86, 133,
+  92, 180, 106, 78, 92, 129, 114, 86, 101, 107,
+  83, 124, 142, 95, 134, 126, 107, 83, 118, 121,
+  90, 107, 78, 106, 79, 84, 70, 78, 78, 98,
+  96, 118, 136, 106, 123, 70, 126, 93, 138, 116,
+  81, 103, 119, 109, 77, 90, 73, 111, 35, 102,
+  107, 130, 98, 122, 120, 97, 130, 86, 119, 78,
+  80, 107, 69, 162, 122, 131, 171, 101, 58, 121,
+  84, 123, 104, 119, 90, 147, 118, 156, 123, 93,
+  111, 110, 70, 65, 128, 142, 92, 104, 64, 124,
+  157, 93, 105, 91, 94, 154, 121, 108, 72, 140,
+  94, 153, 166, 97, 134, 114, 115, 109, 58, 93,
+  100, 124, 35, 136, 140, 143, 98, 110, 118, 103,
+  121, 151, 100, 113, 100, 120, 107, 148, 96, 99,
+  113, 102, 93, 152, 88, 111, 120, 107, 104, 88,
+  159, 128, 119, 85, 125, 114, 149, 66, 121, 134,
+  254, 131, 79, 100, 134, 140, 122, 111, 154, 99,
+  95, 98, 100, 97, 112, 138, 125, 95, 129, 104,
+  115, 146, 98, 117, 98, 99, 115, 117, 124, 134,
+  110, 115, 84, 116, 129, 136, 122, 131, 46, 179,
+  136, 120, 116, 116, 169, 82, 112, 114, 124, 114,
+  109, 109, 72, 131, 154, 106, 136, 152, 124, 66,
+  127, 141, 116, 119, 73, 116, 80, 87, 147, 78,
+  82, 123, 100, 126, 149, 128, 121, 108, 121, 129,
+  151, 221, 69, 95, 125, 135, 63, 104, 125, 125,
+  51, 113, 118, 123, 108, 117, 140, 111, 126, 98,
+  117, 103, 71, 97, 62, 139, 130, 114, 125, 106,
+  66, 125, 92, 153, 121, 110, 74, 142, 109, 158,
+  113, 85, 116, 96, 95, 70, 116, 130, 55, 181,
+  75, 129, 146, 94, 127, 87, 103, 156, 142, 106,
+  65, 145, 90, 145, 190, 118, 138, 118, 116, 97,
+  66, 107, 83, 139, 20, 127, 118, 125, 94, 110,
+  118, 95, 117, 102, 109, 127, 108, 109, 95, 118,
+  114, 105, 107, 80, 101, 147, 76, 127, 116, 112,
+  105, 94, 176, 89, 92, 93, 127, 109, 138, 73,
+  99, 104, 255, 135, 85, 106, 104, 139, 134, 103,
+  167, 127, 104, 85, 107, 93, 123, 122, 121, 94,
+  133, 84, 122, 142, 113, 97, 108, 91, 111, 123,
+  126, 127, 117, 110, 97, 110, 122, 126, 125, 122,
+  58, 151, 101, 108, 120, 106, 146, 88, 90, 93,
+  116, 160, 105, 106, 85, 121, 118, 106, 143, 151,
+  113, 80, 129, 129, 99, 108, 76, 73, 98, 92,
+  116, 72, 80, 121, 89, 136, 97, 112, 121, 111,
+  95, 133, 147, 212, 68, 88, 123, 140, 80, 78,
+  112, 130, 51, 107, 132, 112, 93, 123, 124, 104,
+  107, 89, 122, 76, 76, 93, 92, 89, 170, 113,
+  106, 101, 76, 144, 118, 139, 135, 107, 80, 134,
+  94, 161, 126, 69, 139, 70, 77, 94, 94, 139,
+  82, 135, 80, 126, 141, 99, 143, 109, 147, 128,
+  145, 132, 79, 132, 89, 126, 146, 128, 150, 113,
+  116, 107, 69, 100, 73, 119, 22, 128, 102, 108,
+  108, 114, 106, 94, 110, 78, 152, 108, 103, 92,
+  116, 112, 163, 183, 111, 90, 91, 95, 111, 104,
+  114, 126, 105, 118, 196, 94, 84, 103, 102, 124,
+  95, 77, 86, 111, 226, 160, 72, 140, 123, 134,
+  129, 94, 133, 136, 117, 79, 98, 120, 155, 106,
+  155, 95, 132, 86, 121, 104, 89, 65, 112, 96,
+  84, 131, 112, 111, 119, 97, 137, 114, 126, 121,
+  134, 133, 66, 140, 84, 114, 133, 115, 130, 86,
+  78, 90, 106, 103, 89, 105, 91, 119, 100, 94,
+  124, 152, 105, 104, 141, 126, 93, 96, 103, 90,
+  112, 102, 73, 98, 127, 88, 86, 127, 69, 79,
+  117, 119, 91, 121, 132, 107, 96, 96, 120, 104,
+  110, 75, 89, 117, 37, 94, 129, 123, 87, 133,
+  100, 93, 112, 88, 111, 51, 92, 94, 127, 97,
+  173, 118, 116, 97, 84, 152, 150, 88, 133, 132,
+  92, 125, 97, 160, 124, 73, 134, 64, 77, 100,
+  89, 75, 92, 103, 72, 138, 144, 87, 150, 120,
+  124, 95, 103, 143, 76, 101, 94, 148, 107, 108,
+  145, 102, 123, 100, 81, 110, 80, 103, 31, 142,
+  95, 97, 121, 115, 82, 89, 103, 115, 162, 119,
+  115, 91, 116, 114, 156, 185, 113, 106, 94, 82,
+  120, 91, 119, 121, 112, 102, 187, 91, 110, 107,
+  105, 127, 86, 88, 87, 124, 198, 164, 66, 117,
+  107, 143, 103, 89, 101, 102, 105, 86, 97, 133,
+  138, 119, 160, 95, 120, 101, 124, 112, 113, 82,
+  111, 103, 118, 143, 109, 122, 121, 72, 166, 112,
+  133, 132, 175, 126, 69, 115, 95, 122, 152, 116,
+  128, 64, 76, 106, 95, 103, 107, 102, 93, 110,
+  116, 92, 123, 171, 122, 109, 139, 143, 79, 103,
+  119, 111, 103, 110, 86, 110, 154, 81, 106, 111,
+  107, 78, 119, 111, 90, 117, 123, 114, 100, 81,
+  94, 102, 107, 71, 102, 112, 34, 77, 120, 166,
+  101, 124, 102, 98, 122, 120, 98, 66, 98, 113,
+  118, 139, 139, 116, 101, 102, 59, 116, 135, 75,
+  117, 149, 83, 123, 112, 129, 115, 79, 134, 97,
+  76, 88, 97, 71, 83, 91, 53, 120, 166, 87,
+  104, 103, 102, 82, 74, 122, 76, 105, 98, 163,
+  130, 117, 136, 91, 117, 85, 85, 119, 105, 101,
+  43, 133, 94, 112, 128, 115, 73, 80, 127, 136,
+  131, 109, 103, 93, 110, 127, 113, 123, 108, 101,
+  81, 98, 113, 90, 117, 98, 106, 103, 167, 111,
+  134, 120, 110, 121, 101, 100, 123, 97, 212, 132,
+  73, 103, 100, 135, 102, 84, 122, 81, 97, 109,
+  107, 111, 110, 110, 131, 103, 108, 105, 112, 115,
+  116, 111, 129, 100, 119, 144, 107, 151, 115, 84,
+  117, 117, 134, 124, 193, 140, 64, 108, 114, 134,
+  121, 141, 126, 52, 106, 149, 92, 109, 115, 112,
+  70, 112, 104, 123, 138, 173, 137, 107, 113, 149,
+  81, 109, 107, 119, 72, 95, 107, 86, 114, 104,
+  120, 137, 132, 111, 116, 88, 114, 101, 114, 135,
+  68, 67, 109, 158, 108, 87, 84, 126, 42, 78,
+  125, 192, 111, 103, 120, 97, 107, 136, 79, 83,
+  93, 106, 119, 150, 115, 107, 102, 111, 81, 98,
+  106, 98, 103, 110, 90, 122, 123, 111, 109, 77,
+  126, 118, 90, 89, 115, 123, 98, 137, 75, 122,
+  200, 95, 99, 107, 105, 113, 79, 115, 93, 131,
+  104, 143, 147, 124, 149, 103, 118, 88, 95, 111,
+  115, 104, 63, 118, 112, 128, 114, 121, 96, 89,
+  137, 115, 131, 104, 101, 107, 102, 132, 114, 108,
+  122, 112, 89, 111, 96, 104, 109, 92, 112, 116,
+  187, 133, 120, 128, 132, 97, 125, 107, 117, 112,
+  209, 118, 97, 118, 108, 117, 142, 107, 129, 118,
+  124, 122, 114, 110, 110, 109, 126, 109, 112, 102,
+  106, 117, 106, 156, 137, 103, 111, 128, 107, 158,
+  119, 109, 97, 123, 109, 117, 172, 151, 80, 118,
+  121, 126, 105, 144, 121, 84, 112, 153, 104, 110,
+  119, 122, 83, 113, 87, 144, 126, 144, 145, 102,
+  95, 134, 92, 122, 108, 136, 85, 99, 113, 102,
+  93, 120, 123, 159, 135, 115, 114, 94, 129, 114,
+  118, 139, 76, 100, 132, 176, 111, 120, 90, 124,
+  67, 95, 125, 191, 110, 98, 138, 97, 107, 124,
+  90, 88, 92, 108, 107, 137, 179, 106, 81, 132,
+  89, 106, 155, 112, 133, 138, 123, 120, 142, 132,
+  145, 144, 109, 114, 124, 111, 78, 122, 140, 100,
+  112, 122, 173, 141, 129, 115, 92, 95, 143, 117,
+  84, 104, 101, 69, 112, 97, 128, 109, 119, 98,
+  94, 92, 106, 103, 119, 104, 111, 100, 116, 142,
+  114, 108, 140, 130, 120, 118, 153, 120, 138, 137,
+  145, 128, 128, 97, 133, 122, 114, 94, 131, 105,
+  108, 116, 132, 129, 142, 130, 104, 98, 68, 118,
+  114, 110, 114, 123, 92, 116, 133, 107, 119, 96,
+  105, 123, 120, 115, 137, 156, 163, 104, 126, 135,
+  92, 104, 159, 112, 134, 118, 133, 116, 92, 141,
+  97, 85, 104, 109, 92, 102, 156, 127, 127, 97,
+  111, 123, 86, 99, 113, 120, 107, 83, 123, 170,
+  103, 76, 120, 93, 72, 146, 86, 78, 95, 136,
+  102, 118, 143, 132, 106, 120, 121, 140, 117, 138,
+  72, 110, 128, 113, 103, 111, 89, 110, 149, 97,
+  118, 114, 117, 140, 92, 78, 130, 78, 107, 125,
+  86, 120, 143, 81, 105, 142, 132, 119, 160, 113,
+  107, 104, 147, 109, 75, 112, 121, 83, 188, 102,
+  160, 126, 89, 102, 160, 109, 139, 151, 114, 139,
+  143, 159, 121, 144, 99, 114, 113, 91, 93, 104,
+  169, 82, 105, 139, 125, 152, 130, 124, 93, 116,
+  110, 105, 77, 95, 85, 85, 128, 74, 126, 87,
+  116, 124, 81, 66, 121, 137, 98, 135, 111, 90,
+  108, 134, 101, 133, 173, 129, 105, 148, 139, 151,
+  90, 148, 141, 118, 118, 108, 122, 102, 105, 85,
+  144, 97, 117, 87, 65, 151, 113, 116, 80, 108,
+  83, 133, 118, 144, 117, 152, 103, 114, 128, 100,
+  108, 66, 109, 133, 129, 122, 138, 155, 193, 108,
+  140, 137, 110, 127, 157, 143, 109, 166, 144, 125,
+  100, 161, 81, 96, 103, 160, 94, 104, 152, 160,
+  117, 84, 102, 113, 77, 125, 117, 111, 152, 54,
+  135, 138, 111, 113, 124, 112, 56, 175, 106, 71,
+  112, 156, 114, 105, 126, 153, 118, 118, 122, 169,
+  113, 171, 120, 113, 124, 106, 114, 106, 145, 114,
+  131, 92, 152, 134, 92, 154, 74, 52, 128, 116,
+  90, 147, 107, 96, 141, 97, 118, 139, 131, 107,
+  177, 88, 102, 114, 168, 115, 78, 118, 123, 103,
+  175, 97, 122, 148, 77, 97, 140, 119, 115, 133,
+  90, 135, 150, 154, 118, 149, 103, 114, 121, 81,
+  115, 70, 146, 114, 76, 138, 76, 128, 125, 109,
+  121, 96, 95, 84, 109, 106, 66, 119, 148, 88,
+  92, 113, 109, 140, 62, 115, 127, 157, 124, 169,
+  118, 95, 118, 104, 93, 172, 138, 111, 94, 133,
+  120, 157, 89, 120, 130, 93, 122, 102, 137, 105,
+  94, 116, 117, 87, 121, 96, 69, 148, 56, 127,
+  100, 93, 117, 96, 147, 151, 79, 163, 102, 97,
+  86, 129, 92, 83, 122, 135, 135, 130, 136, 109,
+  172, 116, 133, 134, 137, 128, 128, 190, 90, 169,
+  110, 142, 90, 142, 90, 99, 95, 184, 87, 106,
+  129, 176, 109, 88, 63, 108, 84, 129, 116, 91,
+  160, 60, 129, 98, 118, 197, 113, 135, 65, 178,
+  117, 68, 128, 162, 138, 95, 115, 157, 108, 113,
+  77, 108, 103, 151, 100, 98, 109, 105, 93, 114,
+  132, 122, 106, 103, 126, 120, 129, 122, 72, 80,
+  118, 138, 82, 137, 130, 90, 128, 95, 114, 117,
+  100, 108, 146, 103, 105, 104, 141, 98, 83, 130,
+  114, 108, 168, 82, 110, 147, 86, 114, 109, 151,
+  100, 104, 86, 119, 123, 103, 103, 107, 106, 104,
+  129, 101, 111, 116, 133, 128, 51, 107, 65, 109,
+  135, 90, 148, 128, 120, 59, 116, 112, 65, 100,
+  143, 106, 81, 122, 116, 80, 81, 94, 100, 152,
+  105, 150, 116, 118, 93, 120, 96, 147, 122, 95,
+  87, 159, 118, 130, 96, 127, 103, 77, 101, 109,
+  113, 82, 71, 105, 96, 88, 112, 160, 77, 120,
+  63, 132, 94, 87, 125, 80, 104, 99, 77, 142,
+  78, 95, 122, 104, 92, 92, 137, 119, 153, 120,
+  111, 86, 131, 128, 107, 116, 142, 106, 97, 146,
+  97, 145, 118, 105, 102, 135, 90, 92, 98, 171,
+  78, 111, 111, 154, 114, 107, 58, 102, 78, 101,
+  82, 116, 104, 91, 117, 98, 126, 154, 124, 123,
+  88, 177, 91, 63, 123, 146, 128, 86, 100, 120,
+  91, 102, 57, 114, 102, 121, 61, 70, 82, 79,
+  49, 131, 109, 114, 104, 95, 134, 105, 153, 108,
+  84, 86, 119, 163, 100, 148, 98, 104, 104, 101,
+  151, 106, 89, 127, 102, 107, 102, 80, 118, 92,
+  87, 125, 103, 91, 198, 97, 135, 117, 135, 157,
+  109, 167, 101, 93, 93, 129, 129, 100, 100, 109,
+  99, 100, 129, 114, 109, 96, 131, 82, 61, 121,
+  79, 130, 154, 101, 157, 144, 121, 88, 134, 109,
+  93, 72, 116, 93, 104, 126, 139, 48, 118, 94,
+  94, 155, 101, 131, 122, 143, 64, 130, 102, 116,
+  125, 112, 111, 145, 111, 137, 113, 113, 140, 113,
+  107, 140, 100, 89, 87, 88, 111, 93, 129, 113,
+  97, 119, 91, 113, 94, 91, 109, 101, 84, 74,
+  80, 147, 74, 97, 116, 93, 96, 105, 95, 134,
+  143, 119, 134, 114, 147, 132, 114, 126, 133, 103,
+  111, 82, 90, 129, 118, 97, 110, 129, 105, 81,
+  93, 168, 101, 114, 116, 141, 112, 105, 78, 106,
+  89, 90, 114, 99, 116, 110, 94, 78, 142, 122,
+  132, 125, 98, 173, 95, 103, 120, 139, 104, 98,
+  116, 101, 116, 97, 102, 116, 120, 154, 65, 110,
+  110, 71, 72, 107, 77, 74, 106, 92, 99, 120,
+  137, 100, 95, 114, 118, 122, 100, 120, 106, 107,
+  97, 105, 126, 97, 92, 160, 93, 103, 96, 69,
+  124, 87, 112, 132, 98, 77, 206, 93, 88, 112,
+  129, 159, 114, 158, 131, 104, 88, 122, 128, 95,
+  116, 118, 95, 112, 125, 125, 91, 71, 114, 99,
+  72, 102, 75, 138, 148, 97, 138, 118, 136, 98,
+  119, 93, 93, 72, 97, 110, 94, 122, 138, 50,
+  151, 92, 96, 171, 108, 119, 110, 126, 44, 113,
+  109, 113, 112, 130, 102, 128, 116, 122, 120, 118,
+  155, 122, 125, 117, 101, 82, 111, 88, 117, 81,
+  130, 101, 99, 114, 93, 102, 84, 104, 52, 109,
+  91, 96, 75, 161, 83, 78, 97, 115, 91, 99,
+  74, 122, 111, 105, 133, 123, 177, 113, 137, 131,
+  139, 93, 130, 93, 97, 102, 119, 110, 103, 123,
+  88, 81, 81, 151, 87, 101, 123, 137, 114, 92,
+  97, 109, 75, 98, 91, 85, 104, 97, 107, 88,
+  118, 120, 130, 109, 119, 161, 104, 102, 124, 141,
+  111, 106, 124, 97, 130, 99, 122, 106, 117, 156,
+  46, 100, 105, 71, 65, 85, 69, 102, 111, 73,
+  102, 116, 130, 84, 102, 104, 108, 86, 84, 102,
+  95, 121, 111, 103, 107, 86, 101, 149, 100, 103,
+  109, 68, 120, 83, 111, 131, 89, 88, 179, 97,
+  98, 124, 114, 140, 122, 132, 138, 105, 87, 120,
+  137, 112, 109, 127, 94, 125, 128, 133, 82, 64,
+  107, 107, 86, 113, 88, 132, 137, 104, 119, 97,
+  133, 108, 119, 72, 87, 74, 87, 99, 106, 115,
+  126, 47, 159, 94, 95, 175, 126, 101, 95, 113,
+  50, 96, 104, 123, 110, 104, 99, 130, 122, 122,
+  110, 122, 155, 119, 132, 123, 105, 81, 116, 89,
+  118, 82, 132, 110, 96, 114, 114, 92, 84, 103,
+  46, 98, 106, 110, 81, 167, 98, 79, 122, 111,
+  97, 87, 73, 98, 106, 96, 123, 127, 186, 101,
+  146, 149, 125, 104, 140, 96, 103, 104, 110, 122,
+  121, 119, 86, 79, 76, 139, 95, 90, 103, 140,
+  116, 80, 110, 123, 69, 91, 79, 77, 99, 82,
+  108, 79, 99, 106, 148, 103, 124, 139, 126, 100,
+  121, 152, 119, 105, 113, 116, 129, 107, 128, 144,
+  103, 148, 66, 110, 111, 78, 71, 83, 88, 113,
+  103, 72, 117, 105, 119, 91, 112, 86, 108, 93,
+  79, 88, 110, 125, 120, 97, 95, 92, 113, 121,
+  124, 96, 107, 74, 114, 92, 109, 140, 95, 87,
+  156, 87, 89, 124, 129, 128, 133, 124, 131, 107,
+  90, 117, 129, 128, 107, 116, 89, 126, 111, 123,
+  72, 55, 99, 117, 88, 128, 96, 129, 119, 105,
+  114, 101, 110, 132, 113, 63, 84, 80, 90, 91,
+  113, 106, 112, 53, 140, 97, 84, 155, 142, 99,
+  80, 100, 65, 88, 85, 122, 101, 79, 124, 143,
+  131, 131, 119, 116, 156, 138, 124, 127, 102, 83,
+  106, 81, 120, 95, 140, 118, 94, 124, 139, 102,
+  82, 106, 37, 95, 106, 111, 79, 160, 113, 89,
+  118, 96, 113, 79, 76, 102, 103, 102, 109, 153,
+  184, 81, 141, 161, 99, 125, 135, 94, 116, 110,
+  112, 132, 109, 114, 78, 76, 94, 141, 116, 76,
+  94, 120, 122, 75, 112, 127, 68, 86, 87, 79,
+  89, 75, 102, 86, 88, 109, 150, 99, 109, 108,
+  127, 105, 117, 156, 111, 108, 89, 121, 115, 103,
+  137, 143, 96, 147, 67, 129, 119, 78, 79, 86,
+  101, 85, 98, 74, 113, 109, 100, 88, 118, 75,
+  100, 95, 78, 76, 105, 108, 128, 85, 103, 97,
+  121, 113, 137, 90, 102, 81, 121, 95, 104, 157,
+  101, 95, 140, 80, 108, 120, 132, 125, 138, 125,
+  118, 118, 105, 110, 122, 133, 109, 108, 94, 122,
+  108, 103, 59, 57, 104, 104, 89, 141, 109, 122,
+  93, 107, 109, 109, 95, 141, 102, 64, 93, 84,
+  103, 84, 118, 104, 112, 68, 120, 89, 75, 136,
+  155, 103, 63, 92, 81, 95, 76, 124, 102, 84,
+  147, 154, 123, 136, 101, 111, 152, 141, 108, 121,
+  102, 88, 90, 67, 120, 105, 143, 102, 88, 124,
+  145, 120, 81, 111, 38, 105, 108, 96, 78, 138,
+  111, 103, 112, 93, 112, 70, 76, 114, 99, 108,
+  107, 165, 167, 96, 126, 154, 76, 135, 124, 83,
+  135, 120, 119, 136, 111, 112, 77, 69, 116, 149,
+  139, 62, 94, 94, 137, 60, 116, 112, 87, 80,
+  95, 77, 87, 79, 115, 87, 90, 110, 146, 98,
+  89, 90, 116, 99, 106, 160, 101, 102, 72, 110,
+  106, 103, 135, 136, 92, 149, 83, 154, 123, 71,
+  86, 84, 114, 63, 104, 87, 118, 106, 87, 101,
+  116, 82, 103, 94, 86, 80, 89, 99, 134, 86,
+  101, 102, 131, 114, 140, 87, 91, 92, 123, 91,
+  106, 153, 117, 104, 131, 79, 106, 111, 123, 118,
+  131, 126, 111, 120, 111, 109, 115, 122, 109, 108,
+  110, 109, 101, 93, 53, 59, 110, 95, 88, 135,
+  107, 121, 84, 103, 101, 111, 82, 134, 91, 70,
+  96, 93, 106, 80, 116, 102, 124, 91, 117, 87,
+  72, 125, 151, 103, 60, 92, 74, 97, 70, 125,
+  106, 98, 153, 149, 112, 143, 88, 109, 140, 135,
+  110, 114, 102, 89, 86, 53, 123, 108, 135, 90,
+  92, 130, 139, 136, 77, 110, 39, 109, 109, 89,
+  68, 115, 100, 127, 103, 91, 103, 76, 78, 118,
+  107, 102, 100, 156, 158, 103, 125, 142, 68, 113,
+  120, 90, 130, 133, 119, 121, 99, 109, 72, 69,
+  132, 149, 150, 57, 107, 80, 139, 66, 117, 112,
+  92, 91, 86, 91, 95, 79, 123, 93, 101, 122,
+  137, 100, 75, 85, 115, 95, 104, 177, 94, 102,
+  57, 101, 108, 110, 135, 122, 85, 139, 88, 157,
+  125, 68, 90, 86, 115, 64, 112, 96, 109, 102,
+  80, 97, 108, 91, 113, 92, 102, 81, 82, 90,
+  117, 99, 101, 102, 148, 122, 133, 96, 84, 109,
+  127, 88, 107, 133, 138, 105, 129, 91, 118, 116,
+  115, 111, 121, 110, 106, 116, 120, 113, 107, 110,
+  124, 107, 130, 98, 103, 86, 52, 48, 115, 94,
+  77, 126, 101, 118, 88, 93, 95, 115, 74, 132,
+  80, 84, 95, 104, 99, 82, 115, 99, 139, 112,
+  123, 97, 80, 123, 146, 109, 64, 92, 74, 92,
+  73, 119, 110, 105, 146, 125, 109, 135, 85, 102,
+  132, 125, 120, 105, 94, 110, 98, 58, 137, 111,
+  125, 88, 93, 128, 139, 142, 76, 104, 28, 107,
+  116, 106, 55, 103, 88, 138, 104, 98, 111, 76,
+  84, 108, 121, 100, 97, 137, 166, 101, 127, 136,
+  83, 108, 132, 111, 135, 135, 116, 106, 88, 110,
+  61, 83, 133, 158, 152, 77, 116, 76, 143, 79,
+  113, 119, 96, 93, 84, 88, 121, 80, 119, 104,
+  113, 131, 125, 103, 73, 90, 125, 96, 106, 187,
+  90, 99, 54, 95, 119, 113, 125, 117, 84, 138,
+  79, 150, 123, 63, 82, 93, 121, 87, 117, 111,
+  113, 106, 94, 99, 96, 110, 121, 106, 117, 86,
+  87, 93, 109, 112, 103, 106, 145, 123, 122, 100,
+  93, 132, 121, 89, 110, 119, 148, 123, 123, 101,
+  126, 107, 107, 113, 95, 107, 94, 120, 130, 109,
+  112, 106, 115, 104, 148, 97, 106, 76, 58, 60,
+  113, 92, 65, 121, 93, 119, 85, 87, 87, 119,
+  86, 120, 72, 94, 91, 104, 101, 83, 116, 80,
+  142, 108, 132, 88, 74, 117, 133, 112, 66, 94,
+  70, 103, 80, 109, 106, 102, 133, 131, 105, 129,
+  87, 101, 117, 119, 119, 108, 89, 129, 91, 56,
+  128, 114, 124, 98, 96, 129, 151, 154, 87, 92,
+  42, 105, 113, 100, 47, 103, 84, 153, 108, 115,
+  129, 76, 82, 104, 122, 99, 102, 109, 153, 106,
+  104, 141, 103, 100, 131, 121, 136, 124, 123, 98,
+  84, 114, 60, 88, 132, 173, 147, 93, 122, 74,
+  154, 107, 100, 121, 97, 79, 87, 84, 111, 84,
+  106, 105, 138, 135, 120, 107, 80, 85, 119, 88,
+  102, 181, 84, 90, 44, 95, 124, 108, 102, 107,
+  89, 127, 76, 143, 111, 54, 75, 104, 126, 77,
+  109, 97, 108, 105, 104, 95, 84, 119, 124, 114,
+  128, 79, 88, 89, 110, 118, 122, 112, 134, 125,
+  113, 91, 98, 149, 131, 71, 113, 108, 141, 126,
+  128, 113, 136, 104, 99, 106, 82, 139, 80, 116,
+  139, 103, 112, 103, 119, 96, 148, 101, 99, 85,
+  55, 84, 107, 97, 58, 110, 99, 124, 92, 71,
+  82, 125, 110, 114, 69, 86, 89, 92, 115, 92,
+  112, 73, 138, 106, 134, 82, 69, 124, 112, 105,
+  67, 107, 68, 104, 80, 101, 108, 95, 127, 143,
+  102, 119, 76, 98, 108, 118, 117, 114, 100, 138,
+  95, 52, 133, 119, 131, 98, 90, 127, 148, 145,
+  91, 85, 43, 111, 87, 94, 47, 106, 94, 158,
+  115, 112, 156, 79, 82, 110, 115, 92, 110, 104,
+  145, 108, 108, 141, 95, 88, 126, 92, 139, 121,
+  127, 85, 96, 114, 59, 94, 124, 165, 150, 97,
+  129, 74, 158, 117, 90, 111, 97, 88, 90, 90,
+  114, 78, 105, 100, 147, 126, 120, 105, 86, 81,
+  116, 87, 104, 166, 82, 75, 37, 100, 114, 104,
+  123, 101, 93, 124, 84, 147, 105, 55, 74, 94,
+  120, 77, 92, 103, 110, 106, 108, 101, 72, 120,
+  133, 103, 121, 85, 78, 94, 114, 118, 135, 96,
+  126, 131, 108, 82, 95, 151, 135, 67, 120, 109,
+  118, 114, 140, 119, 128, 116, 101, 108, 106, 143,
+  82, 106, 149, 105, 111, 108, 137, 104, 138, 98,
+  87, 97, 48, 85, 111, 118, 61, 107, 110, 134,
+  113, 68, 87, 118, 124, 114, 69, 73, 91, 81,
+  110, 93, 106, 81, 139, 115, 131, 111, 70, 135,
+  103, 109, 76, 101, 67, 86, 83, 92, 107, 84,
+  125, 139, 101, 114, 65, 90, 112, 125, 116, 114,
+  109, 118, 89, 44, 141, 126, 132, 89, 85, 122,
+  128, 131, 90, 93, 33, 112, 80, 104, 59, 113,
+  107, 157, 119, 97, 155, 90, 88, 113, 125, 92,
+  101, 125, 150, 119, 131, 138, 81, 89, 124, 78,
+  135, 113, 129, 73, 101, 105, 67, 93, 120, 143,
+  162, 96, 141, 83, 157, 94, 88, 108, 100, 79,
+  103, 76, 124, 72, 88, 85, 142, 136, 107, 92,
+  84, 85, 111, 80, 108, 163, 86, 73, 50, 103,
+  96, 103, 144, 97, 93, 137, 83, 158, 114, 66,
+  72, 84, 96, 87, 92, 119, 102, 118, 133, 109,
+  70, 105, 138, 95, 107, 71, 68, 92, 109, 109,
+  142, 85, 124, 142, 103, 78, 91, 134, 126, 86,
+  124, 107, 97, 112, 157, 108, 117, 110, 109, 128,
+  124, 127, 94, 104, 145, 112, 100, 123, 130, 128,
+  119, 80, 88, 105, 59, 82, 119, 101, 75, 122,
+  113, 147, 133, 82, 106, 103, 121, 124, 78, 67,
+  98, 84, 97, 100, 111, 96, 132, 108, 129, 111,
+  66, 136, 107, 107, 80, 99, 61, 75, 75, 92,
+  114, 94, 129, 136, 93, 111, 68, 89, 152, 149,
+  115, 116, 103, 81, 64, 46, 120, 128, 135, 81,
+  96, 123, 120, 127, 78, 112, 31, 128, 87, 110,
+  78, 128, 103, 149, 108, 96, 111, 88, 84, 121,
+  134, 100, 102, 146, 154, 126, 149, 128, 75, 91,
+  116, 79, 111, 119, 130, 73, 93, 107, 72, 80,
+  114, 140, 175, 88, 141, 105, 150, 83, 84, 107,
+  105, 72, 124, 66, 118, 75, 80, 71, 124, 134,
+  84, 93, 84, 98, 107, 69, 108, 171, 90, 82,
+  82, 98, 89, 91, 131, 98, 96, 150, 62, 168,
+  135, 60, 79, 90, 84, 63, 109, 113, 94, 130,
+  127, 89, 84, 84, 133, 92, 98, 72, 68, 86,
+  100, 97, 138, 92, 124, 161, 102, 75, 93, 110,
+  110, 92, 125, 108, 73, 105, 185, 93, 99, 106,
+  113, 153, 129, 99, 116, 111, 124, 115, 95, 129,
+  122, 153, 103, 65, 100, 113, 78, 74, 117, 68,
+  77, 124, 110, 147, 160, 95, 129, 87, 86, 123,
+  95, 65, 93, 101, 74, 99, 110, 116, 128, 80,
+  125, 87, 59, 139, 108, 97, 96, 105, 47, 82,
+  69, 103, 114, 124, 141, 130, 108, 115, 89, 95,
+  196, 161, 127, 115, 99, 62, 73, 56, 106, 127,
+  135, 61, 92, 120, 103, 119, 64, 114, 42, 144,
+  101, 134, 88, 150, 90, 121, 80, 91, 62, 88,
+  76, 133, 120, 113, 126, 157, 169, 126, 179, 116,
+  74, 90, 122, 99, 88, 116, 131, 93, 80, 124,
+  74, 69, 116, 138, 164, 71, 136, 130, 135, 86,
+  79, 106, 87, 93, 127, 79, 117, 85, 101, 94,
+  91, 108, 80, 100, 91, 126, 118, 82, 123, 178,
+  90, 99, 110, 91, 97, 93, 126, 101, 104, 139,
+  36, 154, 146, 55, 82, 98, 107, 60, 122, 101,
+  108, 126, 100, 82, 105, 83, 118, 105, 92, 86,
+  88, 95, 92, 87, 127, 99, 127, 169, 110, 79,
+  100, 79, 114, 86, 114, 122, 70, 103, 197, 89,
+  112, 124, 101, 153, 122, 72, 120, 111, 104, 122,
+  115, 110, 109, 156, 114, 81, 118, 120, 103, 67,
+  117, 80, 68, 107, 95, 133, 169, 89, 145, 77,
+  59, 104, 129, 82, 84, 106, 59, 91, 103, 121,
+  134, 69, 116, 88, 65, 163, 109, 105, 119, 106,
+  40, 82, 86, 123, 126, 148, 129, 114, 123, 118,
+  98, 108, 177, 131, 141, 120, 106, 74, 108, 82,
+  119, 115, 135, 66, 82, 118, 85, 123, 69, 97,
+  79, 146, 140, 149, 92, 158, 80, 76, 69, 95,
+  69, 97, 72, 123, 124, 107, 157, 144, 181, 126,
+  178, 100, 93, 96, 122, 158, 78, 106, 122, 125,
+  78, 145, 73, 73, 106, 138, 134, 75, 124, 144,
+  114, 95, 71, 140, 68, 124, 98, 114, 141, 97,
+  124, 107, 90, 105, 97, 105, 105, 172, 126, 98,
+  130, 166, 102, 98, 123, 98, 116, 104, 108, 113,
+  99, 120, 53, 110, 133, 59, 74, 105, 146, 99,
+  119, 94, 137, 113, 108, 100, 101, 104, 115, 128,
+  96, 110, 96, 111, 89, 98, 107, 99, 116, 152,
+  116, 87, 112, 50, 126, 88, 107, 145, 75, 118,
+  192, 100, 149, 144, 62, 134, 117, 140, 112, 107,
+  104, 122, 131, 73, 108, 149, 130, 126, 139, 118,
+  112, 105, 122, 119, 58, 87, 73, 121, 153, 87,
+  127, 93, 121, 78, 132, 98, 85, 91, 87, 95,
+  87, 116, 139, 72, 105, 95, 81, 188, 105, 127,
+  120, 116, 59, 98, 111, 141, 129, 168, 89, 139,
+  127, 110, 94, 127, 123, 84, 133, 119, 129, 86,
+  97, 100, 137, 100, 122, 107, 69, 122, 77, 131,
+  98, 84, 99, 139, 144, 118, 88, 146, 72, 65,
+  97, 108, 103, 95, 77, 124, 133, 108, 151, 103,
+  183, 127, 142, 96, 128, 78, 117, 169, 93, 114,
+  128, 126, 88, 162, 74, 80, 95, 150, 101, 95,
+  115, 150, 114, 101, 68, 163, 78, 136, 67, 142,
+  133, 87, 136, 112, 126, 136, 110, 119, 117, 217,
+  112, 83, 117, 136, 122, 83, 127, 122, 113, 111,
+  95, 117, 89, 124, 56, 69, 106, 67, 57, 116,
+  140, 157, 128, 88, 128, 101, 129, 104, 91, 108,
+  135, 117, 99, 135, 94, 117, 103, 115, 127, 85,
+  105, 127, 126, 104, 113, 56, 125, 106, 95, 135,
+  78, 116, 199, 107, 120, 160, 50, 126, 135, 184,
+  97, 105, 98, 130, 123, 89, 105, 134, 123, 144,
+  147, 109, 101, 118, 134, 124, 68, 91, 78, 125,
+  131, 81, 98, 124, 167, 91, 125, 99, 78, 77,
+  107, 119, 93, 108, 121, 90, 99, 107, 94, 194,
+  102, 132, 103, 134, 80, 96, 111, 136, 142, 129,
+  70, 109, 116, 111, 93, 119, 118, 79, 146, 114,
+  141, 99, 104, 99, 140, 97, 113, 119, 65, 132,
+  96, 116, 110, 83, 91, 122, 117, 106, 85, 157,
+  86, 93, 127, 111, 128, 86, 91, 132, 135, 121,
+  123, 101, 191, 106, 141, 121, 139, 66, 117, 122,
+  105, 123, 119, 112, 95, 147, 71, 93, 79, 138,
+  98, 98, 115, 168, 122, 94, 62, 149, 89, 119,
+  71, 142, 139, 56, 117, 99, 116, 141, 120, 125,
+  108, 233, 100, 92, 104, 126, 132, 101, 120, 142,
+  115, 118, 106, 154, 88, 146, 53, 64, 122, 68,
+  55, 102, 84, 175, 118, 91, 105, 108, 126, 118,
+  88, 90, 142, 102, 77, 166, 115, 116, 120, 114,
+  121, 77, 96, 126, 145, 110, 113, 90, 102, 106,
+  97, 123, 80, 85, 216, 108, 102, 133, 78, 133,
+  138, 141, 113, 109, 101, 124, 104, 124, 113, 118,
+  108, 110, 127, 104, 84, 105, 125, 120, 81, 85,
+  94, 144, 127, 91, 96, 113, 121, 111, 97, 54,
+  79, 75, 89, 99, 110, 101, 106, 72, 111, 102,
+  70, 157, 93, 110, 83, 130, 58, 71, 82, 106,
+  133, 66, 93, 105, 119, 114, 107, 111, 149, 123,
+  128, 112, 120, 89, 109, 59, 136, 97, 112, 118,
+  76, 133, 120, 102, 87, 102, 73, 119, 92, 105,
+  92, 166, 99, 119, 119, 76, 129, 74, 105, 125,
+  135, 128, 110, 147, 194, 92, 166, 122, 116, 95,
+  124, 96, 112, 121, 116, 94, 100, 140, 73, 92,
+  96, 125, 102, 85, 123, 151, 119, 89, 74, 127,
+  73, 101, 90, 97, 114, 55, 97, 96, 98, 121,
+  122, 107, 93, 204, 102, 95, 109, 136, 114, 118,
+  111, 137, 115, 115, 115, 155, 91, 150, 52, 95,
+  141, 64, 62, 90, 80, 103, 105, 72, 102, 139,
+  107, 106, 90, 65, 106, 110, 76, 112, 120, 81,
+  107, 100, 119, 88, 114, 155, 142, 88, 112, 88,
+  113, 104, 100, 120, 68, 86, 231, 95, 136, 102,
+  105, 152, 134, 98, 118, 122, 107, 126, 122, 152,
+  129, 137, 95, 90, 121, 105, 83, 53, 132, 78,
+  77, 111, 110, 143, 128, 106, 120, 101, 82, 139,
+  104, 54, 97, 92, 78, 78, 118, 101, 102, 77,
+  103, 102, 75, 130, 107, 114, 93, 102, 60, 80,
+  82, 117, 129, 74, 136, 106, 105, 127, 114, 108,
+  169, 160, 128, 117, 115, 88, 109, 56, 137, 105,
+  129, 82, 86, 120, 113, 110, 71, 115, 58, 119,
+  139, 114, 92, 176, 106, 103, 89, 92, 94, 83,
+  83, 119, 115, 123, 164, 185, 191, 116, 175, 118,
+  87, 111, 131, 111, 116, 121, 119, 120, 106, 143,
+  88, 88, 115, 129, 100, 85, 124, 126, 104, 85,
+  77, 126, 75, 102, 127, 51, 142, 69, 111, 94,
+  95, 122, 100, 96, 87, 172, 131, 96, 114, 147,
+  100, 99, 107, 120, 119, 114, 108, 105, 101, 160,
+  61, 123, 139, 68, 77, 75, 93, 44, 117, 87,
+  118, 136, 111, 103, 97, 86, 77, 105, 90, 72,
+  106, 83, 104, 93, 102, 108, 113, 165, 144, 81,
+  102, 73, 121, 117, 116, 142, 74, 110, 191, 80,
+  82, 117, 73, 128, 119, 84, 112, 110, 86, 130,
+  113, 140, 105, 132, 86, 106, 94, 103, 83, 68,
+  111, 116, 59, 104, 124, 127, 108, 85, 136, 109,
+  90, 128, 134, 81, 85, 100, 89, 76, 82, 117,
+  102, 111, 87, 73, 83, 123, 122, 118, 105, 80,
+  45, 87, 95, 148, 116, 171, 143, 99, 115, 137,
+  136, 143, 132, 156, 158, 99, 124, 83, 132, 89,
+  131, 93, 118, 93, 89, 136, 75, 124, 63, 101,
+  84, 108, 150, 146, 95, 166, 100, 80, 95, 106,
+  102, 87, 74, 102, 100, 112, 192, 150, 167, 97,
+  148, 94, 94, 99, 114, 144, 96, 116, 112, 163,
+  78, 148, 83, 111, 113, 130, 87, 89, 116, 103,
+  97, 116, 56, 156, 52, 138, 98, 145, 108, 77,
+  121, 108, 86, 96, 91, 115, 96, 127, 134, 66,
+  123, 141, 113, 73, 98, 129, 94, 109, 84, 93,
+  82, 108, 44, 76, 105, 74, 79, 83, 119, 68,
+  116, 73, 131, 91, 110, 91, 89, 95, 81, 104,
+  85, 105, 83, 96, 100, 97, 99, 114, 111, 130,
+  124, 102, 105, 64, 131, 113, 98, 139, 82, 151,
+  140, 87, 115, 165, 45, 118, 125, 119, 102, 81,
+  88, 158, 90, 162, 100, 132, 90, 130, 97, 82,
+  97, 137, 121, 93, 48, 127, 126, 116, 93, 85,
+  107, 122, 104, 102, 109, 109, 92, 120, 120, 90,
+  72, 139, 108, 135, 52, 71, 100, 153, 146, 138,
+  99, 114, 69, 103, 98, 163, 146, 205, 102, 112,
+  112, 139, 103, 158, 95, 102, 135, 98, 123, 105,
+  107, 120, 125, 77, 114, 105, 74, 169, 53, 119,
+  86, 86, 151, 125, 152, 146, 108, 154, 101, 93,
+  135, 111, 125, 98, 107, 94, 120, 121, 139, 84,
+  134, 132, 107, 97, 135, 108, 103, 142, 102, 124,
+  108, 140, 79, 140, 113, 145, 110, 135, 99, 101,
+  98, 124, 108, 104, 30, 179, 122, 142, 95, 161,
+  135, 92, 150, 81, 126, 98, 114, 146, 106, 124,
+  142, 61, 100, 162, 161, 58, 108, 152, 109, 124,
+  66, 125, 69, 89, 125, 55, 105, 90, 95, 105,
+  146, 126, 109, 96, 121, 101, 124, 127, 69, 89,
+  105, 133, 73, 143, 108, 115, 106, 122, 122, 90,
+  103, 107, 120, 124, 102, 78, 122, 117, 87, 118,
+  68, 152, 132, 84, 194, 173, 53, 126, 146, 148,
+  120, 73, 100, 161, 115, 200, 97, 148, 84, 137,
+  131, 72, 80, 94, 146, 130, 56, 158, 112, 102,
+  126, 78, 75, 145, 121, 101, 96, 115, 116, 127,
+  165, 118, 85, 128, 111, 137, 53, 108, 90, 189,
+  137, 154, 72, 112, 88, 95, 94, 146, 138, 126,
+  105, 121, 147, 120, 63, 106, 92, 89, 155, 110,
+  144, 154, 89, 136, 132, 72, 117, 106, 95, 104,
+  67, 113, 118, 77, 165, 125, 169, 114, 105, 148,
+  99, 83, 84, 126, 116, 92, 138, 122, 136, 97,
+  119, 65, 129, 144, 92, 122, 150, 94, 115, 155,
+  127, 103, 113, 158, 108, 133, 126, 140, 119, 121,
+  127, 105, 96, 137, 119, 51, 44, 179, 135, 92,
+  135, 82, 169, 82, 116, 54, 135, 189, 124, 125,
+  119, 137, 141, 47, 113, 186, 152, 89, 136, 150,
+  130, 107, 61, 87, 71, 111, 170, 68, 126, 110,
+  103, 97, 80, 126, 119, 109, 96, 95, 121, 241,
+  57, 89, 116, 119, 79, 98, 136, 123, 136, 119,
+  103, 69, 99, 118, 112, 122, 73, 100, 121, 118,
+  99, 101, 87, 79, 149, 80, 73, 126, 50, 110,
+  165, 164, 126, 138, 75, 119, 100, 162, 112, 110,
+  125, 130, 79, 87, 60, 105, 124, 161, 51, 117,
+  99, 114, 123, 75, 77, 115, 128, 107, 76, 117,
+  84, 115, 139, 114, 84, 108, 102, 151, 58, 90,
+  82, 148, 120, 137, 39, 81, 74, 92, 76, 105,
+  126, 76, 125, 102, 137, 97, 96, 99, 98, 138,
+  134, 94, 126, 151, 126, 91, 127, 78, 122, 148,
+  109, 99, 85, 122, 97, 102, 90, 87, 108, 91,
+  88, 151, 68, 112, 102, 131, 114, 61, 128, 141,
+  163, 104, 125, 76, 153, 77, 93, 125, 128, 94,
+  127, 114, 114, 107, 112, 128, 61, 123, 90, 115,
+  114, 105, 119, 103, 111, 88, 141, 83, 32, 140,
+  88, 79, 118, 124, 130, 56, 101, 114, 122, 152,
+  116, 107, 120, 104, 113, 28, 113, 168, 116, 115,
+  121, 145, 83, 92, 74, 81, 85, 123, 50, 77,
+  135, 83, 71, 114, 46, 76, 109, 82, 84, 62,
+  97, 132, 60, 79, 134, 102, 108, 93, 89, 114,
+  139, 107, 121, 108, 84, 130, 88, 106, 73, 111,
+  121, 82, 97, 77, 124, 68, 162, 78, 121, 105,
+  64, 116, 152, 113, 119, 151, 93, 105, 105, 124,
+  107, 96, 116, 157, 79, 99, 59, 75, 118, 99,
+  46, 132, 131, 100, 108, 83, 74, 103, 83, 117,
+  82, 111, 72, 121, 119, 113, 85, 97, 117, 142,
+  75, 83, 108, 131, 129, 146, 33, 105, 91, 114,
+  65, 96, 133, 122, 118, 109, 120, 108, 101, 114,
+  90, 118, 98, 143, 118, 124, 123, 76, 119, 104,
+  136, 118, 85, 102, 87, 90, 105, 106, 97, 96,
+  69, 99, 100, 142, 56, 127, 114, 128, 100, 63,
+  75, 109, 145, 112, 132, 108, 122, 105, 100, 145,
+  100, 119, 110, 74, 147, 125, 103, 117, 104, 106,
+  85, 141, 117, 85, 124, 108, 111, 95, 159, 90,
+  44, 102, 98, 93, 115, 98, 130, 53, 148, 166,
+  106, 102, 128, 118, 112, 98, 119, 43, 99, 165,
+  127, 112, 81, 148, 62, 116, 106, 114, 70, 138,
+  95, 94, 117, 74, 86, 118, 102, 64, 100, 93,
+  125, 80, 82, 145, 61, 77, 111, 133, 118, 107,
+  67, 120, 138, 106, 128, 176, 89, 112, 105, 85,
+  95, 137, 90, 85, 103, 78, 113, 117, 147, 86,
+  111, 141, 68, 106, 111, 105, 114, 119, 104, 115,
+  143, 101, 104, 106, 107, 185, 93, 112, 104, 42,
+  113, 91, 42, 140, 165, 84, 79, 82, 125, 100,
+  73, 104, 130, 126, 79, 123, 139, 127, 97, 96,
+  123, 107, 80, 108, 151, 142, 143, 161, 68, 104,
+  111, 146, 77, 139, 142, 134, 113, 117, 118, 143,
+  86, 120, 89, 100, 125, 139, 95, 100, 113, 99,
+  118, 113, 135, 116, 86, 107, 66, 84, 116, 104,
+  118, 111, 105, 96, 123, 119, 87, 103, 102, 109,
+  92, 85, 90, 94, 151, 120, 153, 124, 118, 113,
+  116, 149, 98, 127, 90, 85, 134, 126, 120, 159,
+  104, 98, 102, 163, 110, 117, 84, 119, 85, 101,
+  110, 111, 55, 81, 88, 123, 105, 86, 122, 81,
+  163, 158, 94, 109, 145, 147, 110, 102, 115, 90,
+  98, 145, 138, 108, 64, 127, 80, 119, 122, 120,
+  54, 123, 95, 110, 79, 91, 113, 124, 126, 101,
+  109, 102, 139, 68, 80, 122, 62, 99, 90, 163,
+  119, 112, 50, 123, 133, 122, 110, 173, 94, 96,
+  117, 88, 85, 116, 89, 106, 97, 90, 120, 118,
+  127, 93, 100, 154, 93, 115, 104, 117, 121, 98,
+  107, 119, 164, 112, 105, 90, 118, 166, 107, 116,
+  127, 90, 123, 112, 74, 149, 182, 91, 94, 98,
+  160, 108, 73, 105, 155, 149, 87, 124, 146, 107,
+  129, 115, 134, 101, 83, 105, 142, 121, 130, 168,
+  114, 95, 116, 147, 105, 169, 137, 119, 131, 122,
+  114, 155, 99, 117, 118, 126, 152, 112, 107, 92,
+  89, 135, 98, 115, 132, 135, 171, 115, 96, 113,
+  140, 88, 131, 107, 143, 117, 138, 123, 108, 114,
+  112, 109, 111, 126, 117, 97, 188, 126, 121, 132,
+  139, 107, 140, 141, 124, 113, 103, 134, 112, 162,
+  131, 162, 106, 102, 115, 139, 118, 141, 74, 129,
+  71, 117, 102, 126, 81, 111, 88, 124, 115, 124,
+  126, 115, 134, 116, 111, 119, 169, 146, 117, 105,
+  110, 106, 100, 129, 140, 106, 76, 113, 93, 145,
+  120, 123, 91, 115, 96, 141, 76, 108, 119, 119,
+  135, 100, 123, 124, 127, 70, 96, 114, 87, 137,
+  93, 149, 120, 131, 80, 101, 118, 117, 113, 148,
+  99, 100, 135, 106, 90, 103, 100, 112, 97, 107,
+  147, 119, 153, 107, 84, 134, 90, 93, 145, 106,
+  102, 158, 113, 129, 145, 137, 140, 128, 89, 128,
+  117, 118, 70, 129, 130, 82, 103, 127, 167, 146,
+  152, 100, 100, 81, 135, 96, 67, 110, 86, 91,
+  111, 92, 124, 133, 128, 99, 79, 110, 119, 102,
+  101, 126, 118, 93, 111, 138, 110, 114, 138, 121,
+  102, 135, 127, 119, 114, 128, 117, 104, 103, 101,
+  122, 118, 121, 86, 136, 98, 111, 108, 120, 155,
+  153, 157, 107, 98, 89, 105, 118, 111, 115, 119,
+  93, 113, 138, 107, 107, 97, 106, 115, 112, 123,
+  108, 126, 155, 108, 128, 139, 107, 104, 140, 154,
+  115, 123, 135, 110, 90, 135, 97, 116, 99, 138,
+  93, 110, 152, 148, 143, 107, 99, 110, 107, 133,
+  106, 120, 109, 78, 109, 138, 109, 95, 117, 115,
+  66, 145, 102, 82, 97, 148, 131, 114, 125, 141,
+  103, 116, 87, 155, 123, 141, 93, 105, 132, 114,
+  111, 103, 95, 121, 147, 111, 127, 106, 109, 146,
+  88, 74, 129, 81, 101, 124, 112, 125, 132, 65,
+  143, 138, 124, 104, 174, 127, 100, 114, 144, 103,
+  70, 124, 140, 104, 168, 105, 141, 122, 87, 76,
+  142, 109, 99, 107, 98, 142, 122, 142, 128, 130,
+  89, 125, 101, 100, 105, 121, 107, 92, 83, 131,
+  92, 144, 154, 107, 102, 120, 115, 84, 67, 108,
+  68, 108, 137, 91, 119, 100, 118, 108, 70, 76,
+  115, 131, 76, 139, 115, 129, 111, 126, 99, 127,
+  146, 104, 79, 157, 103, 132, 72, 111, 113, 93,
+  94, 102, 106, 100, 92, 87, 145, 88, 126, 98,
+  68, 190, 117, 140, 89, 104, 90, 123, 101, 143,
+  116, 134, 97, 108, 130, 95, 111, 60, 116, 153,
+  122, 136, 102, 117, 182, 89, 140, 142, 143, 127,
+  129, 142, 87, 210, 146, 96, 90, 148, 80, 119,
+  94, 187, 100, 117, 147, 160, 127, 120, 91, 106,
+  106, 131, 96, 125, 139, 60, 103, 96, 115, 123,
+  102, 137, 52, 165, 100, 97, 115, 147, 130, 93,
+  109, 150, 102, 108, 99, 173, 122, 162, 105, 92,
+  130, 98, 101, 109, 136, 110, 142, 96, 134, 163,
+  100, 122, 66, 52, 128, 126, 87, 141, 115, 115,
+  114, 73, 151, 120, 121, 93, 176, 106, 95, 120,
+  156, 98, 73, 135, 114, 115, 166, 94, 122, 125,
+  96, 90, 135, 112, 90, 101, 91, 128, 110, 148,
+  122, 130, 103, 112, 112, 79, 105, 75, 106, 110,
+  59, 133, 35, 118, 148, 98, 110, 106, 95, 79,
+  93, 106, 59, 129, 129, 99, 95, 111, 99, 137,
+  68, 105, 95, 157, 109, 145, 116, 134, 106, 92,
+  89, 135, 115, 92, 77, 112, 97, 116, 99, 91,
+  104, 91, 99, 106, 126, 115, 90, 89, 121, 86,
+  127, 92, 82, 151, 58, 131, 100, 95, 120, 88,
+  123, 147, 82, 148, 98, 102, 83, 124, 105, 70,
+  110, 155, 117, 123, 107, 88, 161, 126, 128, 134,
+  154, 113, 111, 176, 90, 145, 109, 115, 81, 115,
+  82, 104, 91, 162, 103, 95, 131, 160, 120, 88,
+  56, 98, 98, 110, 114, 79, 167, 73, 102, 86,
+  124, 171, 92, 127, 66, 156, 98, 103, 118, 146,
+  123, 88, 114, 139, 96, 99, 63, 110, 110, 149,
+  94, 90, 132, 93, 78, 109, 113, 99, 103, 102,
+  104, 142, 131, 119, 70, 79, 118, 132, 72, 116,
+  131, 101, 106, 77, 115, 95, 98, 111, 130, 100,
+  100, 104, 121, 91, 78, 139, 97, 113, 166, 78,
+  109, 109, 91, 94, 113, 149, 83, 94, 79, 106,
+  81, 89, 94, 95, 108, 108, 126, 87, 91, 118,
+  114, 124, 41, 87, 35, 103, 141, 86, 118, 113,
+  123, 62, 89, 107, 61, 107, 125, 111, 75, 101,
+  98, 76, 91, 72, 67, 156, 101, 120, 101, 125,
+  85, 103, 89, 107, 107, 85, 76, 126, 99, 78,
+  110, 109, 74, 75, 80, 111, 107, 87, 62, 79,
+  87, 88, 110, 147, 87, 118, 80, 130, 91, 83,
+  127, 78, 83, 82, 84, 132, 67, 96, 116, 105,
+  90, 76, 117, 117, 120, 117, 78, 64, 119, 127,
+  103, 105, 142, 76, 81, 145, 88, 122, 121, 83,
+  88, 110, 67, 97, 96, 137, 95, 96, 114, 140,
+  123, 95, 55, 101, 85, 102, 78, 109, 94, 90,
+  93, 97, 129, 146, 91, 115, 96, 157, 79, 86,
+  112, 131, 111, 77, 96, 107, 86, 94, 39, 97,
+  92, 110, 71, 62, 98, 73, 43, 118, 86, 104,
+  94, 84, 114, 111, 130, 101, 85, 79, 111, 140,
+  88, 123, 98, 89, 83, 87, 156, 87, 87, 129,
+  94, 97, 91, 86, 78, 83, 88, 121, 91, 98,
+  189, 93, 115, 86, 134, 121, 118, 169, 85, 82,
+  82, 116, 84, 87, 95, 90, 98, 100, 124, 110,
+  92, 98, 105, 89, 51, 84, 58, 117, 158, 96,
+  125, 115, 122, 88, 113, 101, 82, 76, 96, 102,
+  97, 105, 123, 42, 119, 73, 68, 154, 100, 109,
+  104, 151, 66, 107, 94, 99, 115, 98, 91, 101,
+  100, 92, 119, 99, 111, 112, 86, 119, 98, 97,
+  98, 80, 94, 90, 124, 107, 106, 120, 102, 109,
+  83, 84, 96, 95, 53, 78, 78, 142, 64, 98,
+  123, 84, 92, 88, 81, 136, 121, 125, 105, 93,
+  146, 118, 125, 112, 133, 85, 103, 68, 81, 113,
+  116, 75, 87, 111, 76, 88, 84, 135, 110, 106,
+  109, 144, 117, 89, 74, 101, 94, 97, 104, 91,
+  110, 101, 83, 89, 133, 103, 107, 113, 105, 149,
+  92, 119, 114, 126, 95, 94, 105, 92, 111, 95,
+  94, 107, 109, 140, 57, 98, 117, 70, 55, 94,
+  62, 73, 90, 84, 92, 121, 112, 92, 98, 109,
+  110, 111, 88, 105, 110, 89, 80, 89, 125, 86,
+  85, 154, 91, 92, 91, 86, 86, 78, 110, 126,
+  79, 86, 184, 86, 84, 89, 138, 137, 115, 151,
+  118, 101, 83, 118, 96, 86, 111, 93, 92, 107,
+  120, 117, 87, 77, 98, 94, 59, 92, 60, 124,
+  154, 100, 119, 105, 121, 94, 96, 77, 89, 76,
+  84, 106, 94, 99, 131, 39, 157, 76, 73, 168,
+  120, 114, 97, 134, 54, 94, 93, 98, 107, 108,
+  79, 100, 104, 90, 119, 104, 143, 119, 99, 108,
+  95, 87, 108, 87, 109, 86, 131, 87, 100, 110,
+  101, 97, 78, 95, 45, 94, 57, 104, 69, 158,
+  78, 87, 102, 99, 91, 86, 72, 120, 89, 123,
+  105, 117, 178, 101, 141, 127, 145, 89, 131, 82,
+  92, 100, 120, 90, 91, 109, 75, 77, 70, 124,
+  99, 97, 115, 152, 112, 78, 107, 104, 85, 97,
+  91, 74, 106, 89, 99, 91, 107, 97, 113, 98,
+  122, 131, 104, 115, 123, 128, 108, 102, 111, 81,
+  127, 87, 121, 108, 118, 161, 50, 97, 113, 68,
+  53, 73, 60, 96, 96, 73, 92, 120, 111, 85,
+  107, 98, 105, 88, 73, 84, 107, 110, 87, 83,
+  110, 80, 87, 132, 101, 95, 107, 86, 102, 83,
+  119, 138, 82, 109, 152, 91, 87, 101, 130, 131,
+  112, 123, 124, 102, 89, 117, 112, 111, 107, 109,
+  94, 111, 117, 119, 86, 64, 91, 101, 73, 120,
+  74, 119, 147, 107, 109, 85, 109, 101, 99, 52,
+  90, 87, 65, 95, 111, 99, 122, 39, 159, 83,
+  74, 166, 128, 108, 91, 121, 57, 83, 80, 99,
+  101, 82, 89, 107, 107, 95, 109, 107, 148, 119,
+  112, 114, 91, 82, 104, 82, 121, 90, 139, 86,
+  104, 106, 117, 92, 74, 100, 34, 83, 84, 122,
+  72, 155, 95, 81, 108, 100, 96, 88, 68, 84,
+  70, 106, 106, 132, 178, 94, 140, 146, 130, 102,
+  135, 94, 102, 99, 115, 93, 105, 105, 86, 71,
+  66, 114, 112, 83, 104, 145, 111, 74, 125, 107,
+  84, 93, 73, 65, 105, 75, 90, 75, 87, 95,
+  126, 92, 118, 109, 128, 109, 121, 141, 120, 106,
+  102, 90, 126, 91, 124, 129, 111, 161, 48, 103,
+  121, 74, 71, 72, 85, 108, 97, 83, 98, 104,
+  101, 82, 111, 89, 101, 91, 71, 59, 111, 119,
+  91, 78, 91, 80, 98, 94, 111, 92, 100, 89,
+  105, 95, 117, 156, 95, 103, 121, 83, 85, 103,
+  124, 113, 124, 114, 119, 106, 94, 98, 115, 128,
+  122, 102, 97, 111, 99, 99, 75, 60, 87, 114,
+  70, 126, 77, 114, 131, 103, 97, 94, 90, 113,
+  84, 56, 77, 106, 69, 90, 115, 102, 116, 51,
+  129, 97, 75, 124, 133, 105, 89, 109, 75, 84,
+  66, 89, 95, 72, 127, 114, 110, 109, 141, 113,
+  133, 128, 109, 126, 89, 95, 92, 62, 139, 98,
+  143, 99, 96, 105, 167, 112, 74, 103, 43, 73,
+  97, 111, 69, 137, 98, 92, 102, 116, 98, 98,
+  71, 81, 66, 101, 90, 147, 156, 83, 123, 154,
+  112, 120, 134, 116, 129, 120, 113, 95, 105, 97,
+  82, 75, 88, 112, 129, 74, 111, 116, 126, 82,
+  117, 114, 93, 97, 75, 77, 103, 74, 86, 89,
+  73, 100, 125, 95, 98, 77, 139, 121, 111, 149,
+  115, 112, 88, 90, 105, 94, 121, 125, 107, 148,
+  62, 112, 121, 80, 88, 87, 110, 96, 94, 85,
+  94, 109, 91, 96, 109, 88, 108, 97, 78, 60,
+  97, 115, 102, 74, 90, 105, 110, 72, 122, 93,
+  88, 111, 102, 107, 103, 161, 109, 119, 103, 88,
+  94, 100, 109, 97, 129, 105, 106, 117, 107, 83,
+  106, 118, 126, 104, 110, 118, 96, 85, 66, 55,
+  88, 106, 66, 108, 98, 103, 89, 104, 86, 115,
+  88, 111, 67, 80, 86, 108, 93, 101, 115, 102,
+  125, 72, 113, 99, 87, 85, 138, 103, 66, 99,
+  83, 106, 76, 85, 90, 95, 135, 117, 104, 119,
+  124, 113, 95, 99, 83, 122, 95, 122, 88, 54,
+  143, 98, 134, 104, 75, 104, 166, 127, 81, 105,
+  58, 89, 93, 72, 75, 103, 87, 100, 104, 130,
+  100, 99, 67, 88, 76, 103, 94, 136, 118, 106,
+  92, 144, 93, 140, 126, 104, 151, 140, 113, 90,
+  110, 100, 85, 76, 108, 114, 119, 79, 111, 76,
+  138, 100, 113, 104, 123, 97, 78, 81, 93, 86,
+  121, 107, 85, 113, 108, 93, 92, 56, 116, 120,
+  107, 143, 107, 100, 69, 82, 92, 105, 115, 123,
+  92, 124, 88, 113, 101, 90, 96, 108, 107, 91,
+  110, 92, 115, 117, 92, 115, 93, 102, 109, 97,
+  91, 66, 82, 121, 123, 91, 92, 140, 119, 67,
+  130, 94, 81, 138, 93, 99, 93, 134, 130, 116,
+  97, 97, 97, 93, 101, 92, 104, 102, 97, 102,
+  119, 79, 114, 94, 124, 115, 127, 125, 95, 84,
+  70, 53, 90, 99, 62, 90, 94, 91, 66, 92,
+  87, 117, 92, 99, 68, 100, 95, 103, 107, 104,
+  103, 83, 135, 104, 115, 99, 107, 76, 140, 101,
+  51, 105, 75, 127, 82, 102, 88, 110, 121, 96,
+  102, 117, 110, 112, 73, 88, 92, 108, 99, 142,
+  104, 51, 131, 98, 119, 97, 76, 106, 117, 115,
+  79, 109, 45, 97, 95, 72, 63, 81, 76, 119,
+  102, 119, 101, 101, 63, 110, 99, 99, 95, 109,
+  109, 93, 90, 142, 85, 119, 120, 91, 150, 134,
+  110, 97, 91, 106, 86, 91, 113, 121, 102, 90,
+  117, 55, 126, 138, 106, 95, 124, 100, 72, 89,
+  86, 98, 140, 137, 98, 103, 91, 88, 99, 58,
+  99, 123, 103, 143, 100, 98, 49, 78, 96, 118,
+  116, 112, 77, 96, 89, 105, 84, 94, 92, 118,
+  86, 98, 110, 81, 115, 116, 96, 114, 82, 116,
+  105, 98, 104, 75, 80, 122, 132, 106, 85, 145,
+  123, 86, 134, 104, 86, 142, 94, 83, 89, 102,
+  127, 94, 97, 109, 109, 101, 100, 97, 68, 95,
+  91, 92, 127, 79, 126, 86, 117, 113, 128, 128,
+  108, 88, 86, 43, 81, 97, 55, 86, 86, 76,
+  67, 75, 92, 118, 85, 95, 77, 118, 96, 102,
+  91, 92, 90, 59, 139, 119, 136, 100, 127, 92,
+  132, 103, 51, 115, 67, 133, 93, 125, 94, 105,
+  107, 78, 107, 106, 100, 108, 64, 80, 103, 93,
+  92, 159, 114, 66, 125, 107, 104, 90, 81, 101,
+  93, 89, 82, 122, 44, 85, 94, 81, 50, 80,
+  72, 113, 111, 115, 97, 90, 63, 102, 109, 92,
+  94, 84, 120, 77, 108, 130, 96, 102, 115, 92,
+  147, 121, 109, 111, 88, 112, 84, 112, 98, 129,
+  88, 111, 111, 60, 121, 152, 95, 84, 116, 93,
+  77, 79, 102, 99, 135, 154, 107, 100, 87, 88,
+  111, 68, 100, 123, 99, 137, 98, 102, 35, 78,
+  109, 126, 104, 114, 65, 93, 86, 100, 72, 83,
+  81, 108, 87, 119, 95, 81, 116, 110, 109, 109,
+  75, 130, 96, 106, 97, 79, 96, 119, 132, 115,
+  73, 137, 109, 99, 132, 95, 104, 144, 87, 75,
+  95, 78, 118, 96, 98, 115, 105, 89, 90, 120,
+  37, 95, 81, 93, 135, 77, 145, 99, 113, 105,
+  120, 123, 102, 90, 99, 35, 74, 114, 42, 86,
+  83, 79, 69, 69, 109, 123, 91, 87, 93, 121,
+  95, 100, 85, 84, 84, 42, 127, 106, 146, 103,
+  144, 97, 116, 110, 76, 110, 45, 130, 103, 149,
+  90, 100, 97, 84, 121, 108, 104, 115, 60, 93,
+  105, 98, 90, 174, 111, 77, 116, 110, 102, 100,
+  86, 108, 101, 87, 89, 131, 48, 83, 110, 68,
+  35, 87, 77, 107, 112, 123, 96, 88, 65, 97,
+  100, 98, 95, 63, 110, 86, 126, 115, 104, 96,
+  111, 90, 114, 111, 112, 137, 82, 111, 90, 122,
+  82, 143, 76, 122, 108, 72, 121, 172, 79, 91,
+  90, 98, 97, 78, 96, 97, 117, 158, 114, 106,
+  79, 94, 120, 68, 98, 116, 105, 127, 99, 99,
+  35, 90, 122, 120, 95, 100, 62, 88, 63, 100,
+  64, 86, 74, 108, 90, 119, 99, 72, 117, 103,
+  121, 92, 72, 128, 85, 105, 85, 68, 105, 111,
+  126, 112, 76, 124, 98, 117, 122, 90, 117, 133,
+  95, 69, 98, 66, 104, 104, 107, 119, 119, 73,
+  83, 123, 20, 107, 67, 84, 132, 76, 158, 119,
+  111, 104, 120, 112, 84, 95, 98, 56, 66, 100,
+  34, 81, 92, 98, 74, 61, 118, 133, 112, 87,
+  102, 119, 98, 93, 101, 73, 82, 39, 115, 101,
+  141, 119, 145, 99, 103, 115, 90, 112, 45, 98,
+  102, 158, 91, 88, 102, 95, 109, 100, 91, 111,
+  52, 113, 109, 108, 103, 178, 113, 73, 110, 110,
+  104, 101, 96, 115, 114, 94, 91, 129, 51, 84,
+  125, 83, 36, 94, 83, 105, 123, 109, 130, 85,
+  81, 102, 97, 98, 100, 55, 99, 83, 137, 105,
+  101, 88, 98, 91, 85, 109, 112, 138, 86, 109,
+  88, 125, 80, 151, 88, 119, 104, 78, 121, 191,
+  61, 103, 73, 101, 113, 102, 95, 86, 95, 125,
+  116, 88, 75, 94, 119, 63, 91, 115, 119, 121,
+  100, 90, 25, 113, 121, 112, 96, 94, 63, 79,
+  69, 107, 66, 91, 82, 92, 91, 110, 99, 84,
+  117, 103, 131, 87, 71, 126, 84, 98, 83, 64,
+  106, 103, 122, 108, 88, 97, 92, 130, 114, 84,
+  112, 123, 101, 56, 100, 75, 88, 100, 116, 113,
+  119, 74, 70, 112, 28, 124, 52, 70, 124, 78,
+  152, 118, 95, 100, 116, 110, 59, 86, 78, 91,
+  70, 104, 27, 83, 107, 111, 84, 49, 97, 132,
+  122, 87, 87, 106, 89, 87, 110, 76, 72, 42,
+  116, 116, 129, 130, 122, 107, 92, 118, 84, 112,
+  56, 60, 98, 122, 89, 74, 101, 95, 90, 83,
+  65, 102, 43, 110, 108, 109, 114, 173, 96, 50,
+  104, 114, 100, 89, 94, 107, 107, 95, 91, 109,
+  73, 85, 105, 92, 57, 94, 83, 113, 119, 94,
+  173, 81, 107, 108, 98, 95, 101, 62, 96, 86,
+  124, 106, 89, 77, 88, 100, 99, 115, 117, 116,
+  93, 92, 80, 127, 93, 129, 105, 109, 108, 80,
+  127, 186, 54, 110, 72, 89, 110, 122, 100, 64,
+  71, 84, 127, 99, 76, 83, 106, 64, 73, 116,
+  122, 129, 100, 91, 15, 124, 101, 104, 102, 86,
+  63, 78, 91, 115, 69, 89, 94, 78, 85, 105,
+  82, 94, 100, 108, 131, 116, 58, 108, 109, 89,
+  87, 49, 89, 89, 108, 101, 100, 84, 90, 128,
+  106, 75, 95, 129, 93, 52, 97, 79, 61, 93,
+  133, 108, 98, 77, 69, 107, 67, 141, 48, 85,
+  120, 79, 127, 109, 105, 102, 131, 115, 50, 83,
+  59, 119, 66, 126, 33, 83, 113, 109, 100, 48,
+  79, 112, 121, 91, 68, 97, 82, 84, 98, 86,
+  75, 49, 118, 121, 117, 107, 94, 111, 88, 114,
+  52, 116, 74, 39, 79, 79, 97, 71, 94, 84,
+  86, 70, 54, 88, 61, 102, 87, 87, 107, 154,
+  73, 38, 90, 125, 101, 81, 97, 90, 96, 110,
+  81, 90, 74, 107, 72, 89, 82, 90, 66, 124,
+  109, 88, 189, 67, 108, 112, 109, 89, 90, 70,
+  111, 102, 108, 104, 76, 70, 79, 88, 122, 122,
+  120, 82, 85, 79, 76, 111, 102, 104, 127, 103,
+  125, 79, 135, 142, 49, 112, 93, 80, 110, 109,
+  113, 51, 71, 78, 120, 109, 80, 72, 93, 69,
+  57, 96, 109, 141, 109, 82, 27, 115, 71, 101,
+  101, 95, 66, 90, 75, 123, 88, 85, 89, 84,
+  78, 93, 83, 102, 87, 111, 123, 121, 45, 90,
+  131, 83, 99, 49, 74, 84, 104, 95, 105, 74,
+  93, 132, 99, 69, 81, 127, 76, 59, 95, 72,
+  36, 82, 161, 98, 96, 78, 83, 121, 119, 137,
+  69, 108, 113, 96, 85, 113, 129, 115, 136, 100,
+  58, 87, 44, 131, 77, 113, 43, 93, 107, 116,
+  145, 70, 88, 97, 105, 100, 62, 86, 78, 84,
+  72, 83, 92, 79, 127, 91, 106, 72, 66, 118,
+  97, 114, 40, 119, 71, 36, 62, 60, 105, 85,
+  104, 95, 93, 74, 66, 82, 115, 108, 69, 88,
+  94, 112, 69, 48, 90, 134, 117, 60, 94, 89,
+  104, 127, 74, 82, 61, 143, 54, 113, 90, 116,
+  51, 145, 108, 81, 160, 66, 89, 126, 113, 94,
+  80, 84, 145, 113, 133, 99, 74, 47, 88, 87,
+  122, 110, 121, 65, 76, 87, 73, 88, 111, 104,
+  163, 94, 137, 109, 149, 99, 60, 109, 103, 82,
+  104, 86, 122, 54, 82, 91, 103, 93, 70, 71,
+  90, 98, 62, 94, 106, 166, 112, 86, 57, 98,
+  64, 100, 96, 102, 81, 113, 61, 142, 124, 70,
+  67, 96, 83, 69, 97, 121, 92, 120, 113, 106,
+  61, 88, 125, 90, 109, 59, 83, 81, 97, 84,
+  123, 76, 106, 139, 96, 75, 83, 114, 72, 74,
+  99, 81, 54, 85, 190, 83, 111, 83, 102, 141,
+  138, 92, 91, 113, 92, 122, 71, 117, 101, 117,
+  125, 76, 78, 94, 50, 106, 112, 63, 56, 98,
+  93, 129, 191, 90, 121, 89, 68, 100, 81, 92,
+  74, 83, 46, 89, 95, 111, 127, 67, 96, 67,
+  54, 148, 97, 122, 67, 108, 56, 56, 66, 74,
+  114, 118, 119, 106, 93, 82, 78, 85, 146, 119,
+  95, 102, 99, 74, 91, 57, 103, 126, 132, 62,
+  98, 113, 94, 135, 73, 75, 67, 143, 73, 141,
+  82, 153, 46, 142, 88, 80, 90, 72, 55, 131,
+  120, 106, 95, 101, 166, 114, 161, 93, 88, 43,
+  99, 130, 94, 102, 115, 82, 71, 124, 72, 83,
+  108, 123, 186, 74, 128, 148, 144, 82, 62, 108,
+  101, 102, 92, 75, 130, 68, 93, 81, 96, 90,
+  66, 83, 88, 155, 90, 114, 117, 180, 101, 90,
+  93, 97, 93, 98, 90, 109, 92, 116, 61, 135,
+  155, 53, 60, 99, 119, 63, 90, 123, 101, 126,
+  92, 94, 82, 102, 112, 116, 110, 79, 107, 78,
+  76, 72, 146, 95, 107, 142, 103, 78, 83, 96,
+  105, 78, 109, 119, 73, 105, 204, 74, 137, 103,
+  88, 145, 123, 94, 102, 101, 78, 135, 94, 91,
+  84, 121, 110, 87, 113, 102, 77, 82, 115, 78,
+  56, 96, 60, 132, 192, 92, 125, 87, 90, 86,
+  87, 96, 77, 90, 64, 93, 86, 119, 129, 56,
+  98, 82, 51, 187, 96, 126, 88, 129, 48, 75,
+  83, 103, 107, 152, 99, 144, 106, 76, 106, 98,
+  126, 94, 101, 118, 103, 70, 95, 78, 134, 105,
+  131, 85, 96, 118, 91, 129, 86, 68, 76, 125,
+  85, 124, 78, 161, 46, 89, 61, 82, 76, 74,
+  47, 119, 124, 96, 103, 91, 175, 118, 143, 94,
+  128, 60, 96, 153, 92, 105, 119, 94, 76, 155,
+  72, 79, 104, 128, 158, 83, 106, 157, 121, 81,
+  66, 129, 79, 125, 75, 96, 141, 78, 103, 96,
+  118, 126, 73, 99, 100, 207, 112, 114, 109, 158,
+  107, 83, 115, 114, 111, 91, 93, 101, 85, 118,
+  61, 85, 133, 48, 61, 98, 144, 106, 89, 102,
+  107, 123, 92, 103, 92, 97, 113, 125, 98, 104,
+  111, 84, 82, 72, 149, 111, 98, 140, 103, 93,
+  91, 93, 122, 92, 109, 145, 65, 109, 207, 73,
+  127, 129, 75, 143, 129, 151, 90, 110, 83, 130,
+  118, 95, 90, 122, 113, 123, 123, 97, 91, 104,
+  115, 87, 54, 98, 53, 143, 154, 84, 102, 108,
+  134, 81, 85, 115, 71, 98, 92, 91, 88, 111,
+  121, 78, 95, 103, 66, 188, 100, 121, 87, 135,
+  58, 65, 104, 118, 116, 119, 74, 118, 84, 74,
+  119, 101, 104, 69, 106, 117, 112, 96, 95, 90,
+  137, 105, 113, 103, 81, 124, 135, 125, 97, 74,
+  73, 104, 96, 100, 76, 156, 62, 74, 102, 92,
+  117, 72, 73, 98, 113, 102, 104, 94, 178, 111,
+  125, 118, 145, 77, 98, 132, 103, 118, 122, 101,
+  86, 159, 74, 82, 84, 129, 120, 89, 104, 153,
+  116, 79, 56, 146, 79, 113, 71, 120, 155, 71,
+  99, 88, 125, 144, 94, 110, 93, 227, 113, 112,
+  98, 132, 101, 83, 112, 130, 108, 98, 100, 130,
+  82, 129, 70, 70, 125, 67, 67, 101, 106, 129,
+  95, 89, 106, 114, 110, 116, 83, 79, 125, 106,
+  75, 146, 114, 91, 105, 75, 134, 99, 84, 132,
+  125, 102, 93, 98, 124, 89, 96, 146, 66, 92,
+  204, 72, 107, 117, 84, 127, 143, 140, 93, 119,
+  91, 114, 91, 111, 96, 97, 102, 135, 101, 89,
+  60, 119, 103, 117, 59, 98, 92, 167, 136, 87,
+  88, 113, 119, 87, 76, 92, 68, 89, 97, 85,
+  97, 96, 104, 71, 103, 95, 60, 149, 92, 96,
+  65, 104, 53, 55, 98, 103, 103, 71, 86, 120,
+  96, 72, 107, 97, 108, 80, 97, 121, 111, 111,
+  105, 63, 130, 101, 108, 118, 68, 124, 162, 135,
+  86, 83, 72, 104, 93, 96, 85, 156, 67, 97,
+  120, 68, 143, 54, 85, 92, 113, 115, 91, 117,
+  166, 79, 122, 129, 131, 89, 96, 113, 101, 128,
+  122, 95, 88, 155, 77, 78, 82, 129, 109, 65,
+  118, 129, 123, 77, 63, 140, 93, 103, 77, 111,
+  119, 69, 102, 96, 112, 138, 110, 98, 78, 202,
+  101, 102, 97, 127, 87, 96, 95, 132, 104, 98,
+  94, 140, 87, 134, 70, 81, 132, 78, 76, 92,
+  77, 87, 98, 63, 117, 122, 94, 121, 76, 52,
+  114, 92, 66, 118, 123, 82, 114, 71, 144, 89,
+  96, 133, 142, 90, 78, 109, 120, 81, 82, 137,
+  73, 86, 210, 71, 114, 92, 97, 119, 149, 116,
+  98, 113, 100, 117, 86, 132, 115, 111, 85, 110,
+  101, 88, 46, 96, 96, 100, 60, 119, 95, 173,
+  150, 98, 102, 106, 76, 108, 72, 83, 72, 88,
+  87, 99, 116, 100, 101, 73, 103, 87, 66, 132,
+  101, 92, 64, 109, 62, 78, 93, 103, 112, 70,
+  106, 130, 93, 82, 83, 93, 138, 104, 77, 121,
+  109, 106, 103, 53, 142, 108, 122, 86, 75, 122,
+  115, 136, 75, 101, 58, 118, 98, 94, 80, 161,
+  79, 107, 99, 80, 118, 56, 75, 123, 97, 126,
+  119, 142, 170, 96, 135, 126, 116, 105, 102, 96,
+  112, 133, 121, 82, 83, 157, 85, 82, 88, 134,
+  109, 62, 124, 119, 121, 68, 78, 112, 105, 106,
+  100, 55, 132, 77, 123, 97, 111, 128, 77, 84,
+  72, 179, 99, 101, 85, 137, 83, 99, 101, 107,
+  96, 101, 96, 102, 102, 154, 77, 109, 126, 66,
+  77, 77, 77, 47, 108, 83, 120, 155, 92, 110,
+  80, 58, 93, 100, 81, 82, 124, 86, 111, 61,
+  135, 104, 98, 138, 149, 81, 86, 118, 122, 85,
+  95, 148, 77, 85, 200, 64, 105, 90, 92, 117,
+  126, 72, 105, 98, 92, 121, 96, 139, 110, 120,
+  74, 104, 87, 96, 66, 49, 92, 87, 54, 111,
+  96, 136, 143, 97, 138, 102, 67, 130, 105, 84,
+  83, 107, 69, 92, 113, 105, 96, 85, 97, 77,
+  62, 139, 118, 101, 78, 93, 55, 87, 81, 120,
+  106, 105, 134, 106, 90, 90, 111, 100, 147, 155,
+  112, 108, 108, 90, 120, 62, 141, 104, 127, 70,
+  102, 117, 84, 126, 66, 95, 47, 107, 122, 126,
+  77, 165, 87, 82, 73, 82, 95, 62, 58, 126,
+  77, 101, 149, 142, 172, 92, 148, 117, 112, 122,
+  96, 119, 98, 106, 119, 118, 58, 153, 75, 85,
+  99, 135, 118, 59, 111, 106, 113, 90, 73, 125,
+  75, 113, 115, 69, 132, 78, 119, 82, 79, 104,
+  63, 100, 81, 148, 106, 94, 96, 133, 94, 80,
+  93, 106, 94, 88, 87, 86, 95, 131, 47, 102,
+  120, 49, 69, 67, 86, 57, 104, 95, 117, 134,
+  98, 90, 97, 88, 75, 102, 84, 76, 99, 96,
+  113, 54, 106, 105, 101, 134, 127, 80, 103, 100,
+  124, 84, 105, 161, 87, 113, 159, 67, 75, 115,
+  57, 113, 125, 88, 98, 81, 73, 134, 56, 148,
+  99, 92, 87, 109, 78, 84, 81, 115, 78, 122,
+  35, 96, 88, 119, 115, 81, 131, 89, 90, 115,
+  96, 97, 92, 121, 83, 93, 87, 118, 87, 97,
+  75, 42, 57, 141, 127, 100, 71, 99, 53, 77,
+  77, 108, 97, 169, 124, 104, 72, 77, 128, 122,
+  105, 146, 110, 100, 101, 70, 110, 78, 138, 76,
+  111, 90, 103, 129, 77, 119, 60, 81, 94, 119,
+  99, 137, 98, 143, 84, 76, 114, 95, 139, 61,
+  84, 97, 84, 105, 109, 95, 136, 101, 104, 94,
+  132, 105, 86, 128, 83, 92, 118, 106, 63, 145,
+  74, 110, 121, 118, 136, 71, 85, 80, 128, 124,
+  58, 138, 73, 127, 91, 170, 98, 89, 114, 67,
+  89, 62, 86, 137, 98, 127, 102, 77, 90, 136,
+  124, 61, 99, 132, 94, 100, 66, 110, 71, 72,
+  59, 76, 123, 52, 72, 98, 122, 90, 99, 84,
+  108, 96, 93, 82, 90, 80, 86, 109, 79, 113,
+  67, 98, 86, 60, 108, 94, 97, 121, 96, 105,
+  104, 86, 109, 73, 92, 143, 95, 151, 125, 98,
+  151, 137, 49, 121, 165, 110, 101, 97, 79, 143,
+  58, 197, 96, 126, 98, 121, 100, 68, 66, 106,
+  115, 62, 37, 128, 81, 108, 125, 87, 80, 92,
+  83, 121, 53, 105, 124, 148, 102, 133, 94, 119,
+  95, 141, 49, 88, 88, 149, 136, 119, 48, 112,
+  87, 83, 77, 108, 114, 142, 111, 103, 65, 76,
+  66, 99, 61, 106, 102, 113, 116, 112, 106, 96,
+  133, 73, 100, 83, 105, 126, 68, 126, 105, 86,
+  146, 144, 141, 123, 108, 129, 74, 87, 93, 110,
+  122, 69, 104, 100, 87, 107, 86, 57, 93, 132,
+  93, 94, 147, 102, 88, 136, 84, 72, 106, 109,
+  94, 137, 109, 141, 123, 97, 169, 86, 78, 112,
+  151, 59, 50, 145, 167, 119, 134, 99, 142, 72,
+  121, 50, 129, 122, 83, 139, 89, 135, 124, 68,
+  91, 174, 151, 80, 129, 160, 118, 124, 48, 107,
+  44, 83, 173, 101, 163, 90, 116, 76, 98, 94,
+  105, 120, 85, 91, 90, 167, 70, 87, 91, 96,
+  73, 78, 114, 107, 95, 67, 103, 97, 101, 127,
+  104, 123, 86, 112, 75, 100, 95, 101, 116, 108,
+  102, 93, 79, 117, 47, 94, 149, 101, 91, 129,
+  59, 88, 71, 150, 102, 109, 89, 128, 48, 74,
+  53, 68, 107, 125, 36, 80, 96, 77, 90, 65,
+  82, 85, 95, 99, 48, 113, 103, 142, 120, 151,
+  64, 108, 77, 146, 43, 86, 86, 111, 131, 112,
+  17, 85, 83, 108, 66, 91, 112, 86, 80, 79,
+  119, 60, 79, 103, 46, 109, 92, 76, 121, 130,
+  133, 89, 96, 70, 100, 132, 87, 100, 74, 115,
+  96, 98, 104, 96, 95, 98, 92, 98, 54, 96,
+  69, 103, 90, 59, 112, 136, 148, 99, 91, 49,
+  83, 61, 79, 90, 109, 91, 82, 114, 109, 86,
+  101, 108, 49, 111, 85, 155, 116, 67, 110, 96,
+  86, 83, 148, 76, 28, 113, 129, 94, 111, 96,
+  103, 51, 131, 146, 95, 137, 90, 96, 97, 97,
+  95, 55, 110, 152, 136, 111, 88, 153, 84, 96,
+  35, 67, 46, 69, 61, 78, 124, 104, 87, 99,
+  62, 83, 87, 80, 95, 69, 80, 145, 58, 78,
+  95, 138, 99, 90, 95, 100, 139, 82, 103, 140,
+  93, 119, 95, 118, 82, 118, 71, 89, 83, 62,
+  106, 85, 117, 100, 97, 107, 90, 104, 107, 113,
+  96, 119, 75, 80, 108, 107, 90, 71, 95, 140,
+  72, 86, 93, 83, 95, 90, 36, 115, 113, 61,
+  80, 67, 104, 87, 76, 102, 86, 147, 70, 122,
+  116, 114, 83, 98, 99, 136, 71, 65, 117, 117,
+  142, 124, 45, 112, 99, 133, 67, 111, 141, 94,
+  85, 86, 104, 101, 84, 100, 66, 97, 85, 115,
+  98, 112, 101, 87, 81, 119, 125, 107, 75, 99,
+  67, 69, 119, 93, 141, 100, 52, 102, 107, 90,
+  61, 111, 111, 96, 85, 87, 89, 134, 175, 99,
+  105, 102, 92, 104, 88, 130, 95, 114, 78, 41,
+  130, 107, 107, 138, 71, 94, 82, 149, 112, 71,
+  99, 110, 76, 92, 122, 91, 50, 74, 89, 82,
+  103, 100, 113, 85, 142, 152, 88, 81, 135, 112,
+  117, 83, 76, 75, 96, 109, 119, 106, 57, 110,
+  61, 109, 102, 112, 55, 106, 84, 120, 76, 99,
+  97, 131, 106, 76, 75, 84, 112, 75, 88, 123,
+  68, 100, 94, 183, 122, 117, 52, 106, 128, 103,
+  97, 153, 74, 105, 105, 86, 91, 104, 79, 73,
+  91, 58, 124, 107, 131, 106, 128, 127, 135, 134,
+  117, 117, 121, 107, 106, 104, 150, 110, 112, 100,
+  94, 133, 101, 101, 135, 59, 105, 84, 40, 159,
+  128, 86, 103, 83, 146, 87, 76, 97, 141, 141,
+  82, 122, 106, 74, 100, 112, 125, 125, 95, 115,
+  118, 156, 143, 149, 106, 96, 102, 138, 86, 138,
+  122, 92, 103, 107, 118, 135, 99, 83, 110, 122,
+  113, 109, 97, 110, 90, 106, 101, 157, 140, 72,
+  103, 104, 76, 85, 133, 97, 129, 120, 92, 116,
+  122, 103, 92, 99, 96, 92, 93, 118, 104, 111,
+  152, 122, 138, 143, 129, 140, 114, 123, 118, 128,
+  105, 83, 130, 113, 137, 152, 66, 92, 121, 124,
+  108, 99, 102, 115, 80, 108, 88, 100, 75, 63,
+  76, 94, 123, 69, 143, 127, 119, 97, 111, 111,
+  153, 136, 122, 93, 94, 107, 96, 100, 103, 111,
+  83, 75, 97, 115, 151, 139, 88, 140, 71, 162,
+  89, 97, 124, 103, 122, 88, 103, 117, 110, 57,
+  108, 106, 89, 137, 80, 143, 116, 85, 77, 84,
+  110, 129, 101, 117, 81, 116, 94, 89, 68, 79,
+  102, 111, 100, 96, 155, 105, 125, 111, 94, 132,
+  140, 140, 124, 112, 129, 120, 120, 117, 142, 112,
+  114, 98, 106, 120, 112, 100, 142, 108, 152, 94,
+  67, 158, 166, 114, 112, 106, 149, 96, 81, 95,
+  129, 152, 97, 130, 119, 92, 127, 125, 137, 112,
+  105, 113, 106, 132, 131, 150, 126, 85, 112, 135,
+  130, 119, 132, 116, 108, 126, 107, 124, 103, 115,
+  133, 128, 128, 109, 115, 116, 72, 120, 101, 147,
+  133, 120, 176, 120, 121, 148, 133, 92, 122, 97,
+  123, 109, 141, 126, 108, 110, 94, 141, 105, 142,
+  116, 93, 140, 131, 123, 140, 148, 127, 107, 129,
+  125, 103, 126, 166, 130, 141, 148, 109, 89, 99,
+  121, 106, 114, 122, 107, 119, 88, 119, 108, 121,
+  92, 115, 102, 116, 127, 116, 120, 134, 112, 88,
+  140, 129, 141, 127, 120, 111, 109, 109, 109, 111,
+  109, 106, 99, 79, 110, 138, 120, 110, 124, 141,
+  80, 153, 95, 105, 122, 105, 134, 90, 122, 129,
+  102, 72, 119, 101, 98, 149, 96, 114, 113, 118,
+  104, 71, 103, 120, 138, 138, 78, 117, 110, 103,
+  77, 101, 111, 111, 103, 111, 165, 115, 141, 110,
+  84, 149, 93, 96, 118, 107, 90, 151, 104, 150,
+  129, 122, 136, 128, 95, 150, 112, 127, 92, 126,
+  132, 75, 82, 121, 176, 127, 132, 101, 122, 68,
+  133, 93, 79, 125, 90, 106, 130, 109, 121, 145,
+  131, 104, 77, 114, 113, 108, 117, 137, 111, 101,
+  110, 144, 114, 106, 137, 126, 98, 143, 101, 119,
+  101, 127, 108, 95, 94, 117, 120, 106, 122, 107,
+  120, 98, 121, 119, 134, 159, 119, 155, 119, 88,
+  101, 109, 106, 108, 129, 137, 96, 121, 121, 120,
+  103, 104, 99, 124, 102, 135, 101, 101, 141, 94,
+  123, 158, 124, 103, 120, 170, 117, 148, 140, 97,
+  100, 112, 99, 126, 113, 157, 102, 119, 129, 162,
+  141, 115, 94, 101, 123, 141, 110, 126, 103, 89,
+  101, 124, 122, 93, 109, 137, 90, 158, 112, 88,
+  109, 153, 163, 108, 114, 146, 104, 113, 61, 143,
+  126, 146, 103, 89, 122, 106, 111, 104, 107, 127,
+  149, 109, 114, 101, 115, 134, 93, 85, 127, 86,
+  108, 112, 109, 134, 107, 70, 154, 157, 99, 101,
+  139, 138, 110, 115, 139, 97, 77, 137, 129, 108,
+  165, 104, 133, 135, 89, 89, 113, 135, 89, 89,
+  94, 156, 128, 127, 129, 132, 96, 149, 101, 121,
+  125, 123, 110, 80, 61, 124, 85, 111, 147, 101,
+  130, 126, 124, 79, 92, 119, 75, 117, 165, 99,
+  114, 109, 121, 98, 71, 79, 105, 146, 69, 136,
+  121, 191, 102, 132, 95, 123, 134, 115, 76, 145,
+  97, 124, 86, 113, 112, 94, 99, 117, 102, 95,
+  97, 105, 135, 85, 133, 102, 74, 175, 79, 123,
+  98, 94, 98, 116, 99, 129, 127, 144, 96, 109,
+  107, 103, 101, 70, 115, 156, 117, 135, 98, 90,
+  169, 92, 147, 160, 168, 113, 110, 118, 91, 220,
+  150, 99, 100, 116, 90, 128, 107, 183, 101, 125,
+  128, 165, 109, 125, 84, 105, 101, 129, 96, 117,
+  146, 75, 101, 107, 117, 99, 108, 141, 80, 177,
+  100, 110, 124, 147, 153, 91, 119, 152, 103, 109,
+  99, 160, 123, 157, 97, 73, 117, 89, 84, 112,
+  135, 121, 131, 90, 124, 157, 130, 125, 77, 63,
+  124, 145, 93, 141, 109, 130, 92, 78, 134, 122,
+  100, 95, 133, 120, 112, 106, 151, 94, 82, 145,
+  87, 114, 164, 95, 117, 120, 96, 102, 124, 121,
+  94, 96, 95, 126, 118, 141, 119, 134, 106, 122,
+  110, 90, 106, 88, 113, 110, 52, 122, 38, 107,
+  156, 96, 117, 114, 99, 75, 98, 112, 60, 137,
+  131, 91, 93, 110, 107, 126, 74, 117, 87, 173,
+  96, 132, 124, 156, 85, 80, 84, 126, 108, 93,
+  77, 98, 89, 104, 111, 92, 100, 90, 99, 114,
+  120, 115, 101, 82, 122, 88, 132, 77, 80, 142,
+  59, 111, 103, 93, 135, 79, 124, 131, 93, 152,
+  98, 101, 90, 116, 108, 80, 112, 135, 111, 113,
+  107, 79, 156, 138, 144, 134, 162, 107, 108, 167,
+  84, 120, 114, 122, 82, 93, 86, 108, 98, 144,
+  103, 100, 120, 154, 117, 79, 54, 95, 94, 102,
+  114, 91, 175, 83, 92, 93, 117, 155, 97, 121,
+  75, 163, 100, 110, 119, 148, 126, 87, 117, 141,
+  94, 102, 59, 114, 100, 146, 101, 87, 129, 90,
+  72, 114, 106, 105, 89, 106, 99, 141, 143, 126,
+  84, 75, 107, 137, 66, 101, 125, 102, 94, 84,
+  106, 95, 94, 118, 119, 99, 105, 85, 107, 93,
+  80, 136, 80, 104, 166, 69, 96, 106, 81, 93,
+  115, 144, 81, 91, 82, 89, 79, 79, 87, 92,
+  112, 116, 119, 90, 93, 120, 115, 125, 33, 77,
+  33, 92, 142, 82, 128, 98, 122, 59, 92, 112,
+  62, 111, 114, 112, 71, 96, 97, 65, 91, 66,
+  61, 156, 101, 104, 93, 120, 72, 95, 87, 103,
+  95, 89, 75, 110, 102, 56, 118, 117, 72, 75,
+  77, 105, 102, 84, 63, 83, 81, 84, 102, 149,
+  89, 116, 70, 118, 93, 88, 127, 81, 85, 70,
+  94, 135, 64, 93, 106, 103, 87, 79, 106, 109,
+  117, 106, 81, 55, 119, 114, 108, 100, 137, 78,
+  72, 143, 88, 117, 123, 85, 66, 100, 62, 99,
+  103, 128, 93, 88, 106, 127, 119, 89, 45, 96,
+  85, 103, 72, 104, 90, 96, 103, 103, 121, 143,
+  84, 113, 104, 154, 77, 92, 107, 128, 108, 76,
+  90, 109, 82, 95, 33, 92, 78, 95, 63, 65,
+  92, 75, 38, 123, 71, 102, 89, 81, 111, 112,
+  125, 96, 93, 74, 92, 133, 81, 113, 92, 80,
+  93, 91, 149, 88, 83, 132, 95, 88, 89, 66,
+  56, 77, 89, 112, 71, 82, 183, 87, 119, 89,
+  131, 110, 121, 161, 80, 83, 87, 96, 90, 82,
+  107, 79, 99, 111, 123, 114, 97, 100, 109, 85,
+  42, 78, 62, 99, 161, 91, 136, 105, 124, 92,
+  117, 93, 85, 76, 85, 99, 103, 104, 123, 36,
+  116, 70, 61, 154, 105, 99, 95, 152, 67, 98,
+  86, 99, 110, 94, 89, 92, 106, 72, 122, 107,
+  114, 109, 86, 110, 102, 93, 103, 80, 96, 93,
+  117, 104, 105, 115, 99, 100, 89, 94, 91, 98,
+  64, 87, 86, 147, 72, 89, 121, 69, 94, 85,
+  73, 135, 121, 118, 103, 88, 154, 114, 135, 115,
+  124, 91, 98, 58, 89, 110, 118, 87, 67, 106,
+  66, 87, 92, 132, 119, 93, 93, 136, 118, 77,
+  69, 90, 93, 94, 106, 88, 118, 103, 92, 85,
+  115, 94, 118, 112, 116, 140, 86, 126, 110, 118,
+  94, 98, 97, 94, 104, 102, 101, 114, 102, 127,
+  52, 119, 115, 80, 47, 89, 60, 76, 85, 94,
+  100, 118, 120, 93, 109, 112, 100, 108, 77, 107,
+  108, 82, 97, 88, 116, 84, 79, 155, 97, 80,
+  88, 71, 75, 74, 111, 125, 72, 78, 167, 87,
+  77, 93, 142, 132, 120, 145, 113, 105, 87, 107,
+  95, 86, 113, 77, 97, 112, 118, 109, 95, 87,
+  101, 95, 52, 104, 65, 124, 161, 99, 123, 87,
+  118, 94, 86, 68, 90, 75, 78, 94, 101, 108,
+  136, 43, 151, 76, 62, 168, 121, 112, 85, 136,
+  58, 87, 80, 92, 109, 89, 85, 101, 102, 69,
+  130, 104, 162, 120, 97, 107, 100, 83, 101, 71,
+  115, 98, 132, 78, 104, 108, 105, 101, 85, 105,
+  49, 93, 67, 118, 82, 165, 94, 82, 101, 86,
+  102, 86, 77, 114, 87, 126, 102, 119, 186, 101,
+  143, 128, 133, 83, 121, 88, 97, 102, 122, 99,
+  71, 110, 72, 73, 75, 126, 121, 83, 105, 142,
+  125, 76, 103, 100, 93, 89, 97, 94, 116, 87,
+  97, 73, 104, 94, 126, 101, 123, 112, 97, 118,
+  118, 116, 107, 105, 102, 78, 113, 82, 126, 123,
+  123, 152, 50, 122, 120, 77, 46, 66, 66, 90,
+  87, 92, 92, 115, 108, 83, 113, 104, 107, 87,
+  61, 88, 118, 95, 96, 72, 116, 78, 77, 129,
+  104, 84, 105, 74, 99, 77, 123, 146, 102, 110,
+  133, 91, 95, 101, 133, 129, 119, 117, 122, 111,
+  92, 111, 107, 121, 105, 99, 102, 109, 111, 100,
+  90, 79, 102, 90, 68, 135, 71, 118, 147, 109,
+  117, 78, 98, 90, 82, 55, 90, 88, 62, 103,
+  108, 109, 128, 50, 143, 86, 70, 156, 127, 115,
+  83, 124, 63, 92, 70, 95, 106, 68, 104, 109,
+  100, 84, 109, 102, 154, 132, 102, 113, 93, 86,
+  88, 57, 136, 106, 141, 79, 110, 107, 123, 106,
+  85, 116, 43, 91, 90, 135, 85, 161, 104, 89,
+  92, 109, 90, 90, 77, 82, 64, 112, 108, 139,
+  171, 95, 132, 131, 129, 100, 120, 109, 117, 109,
+  114, 91, 92, 110, 96, 73, 73, 119, 134, 76,
+  101, 129, 130, 72, 107, 94, 111, 97, 88, 71,
+  117, 71, 84, 66, 92, 95, 127, 94, 106, 91,
+  125, 113, 112, 129, 116, 109, 101, 84, 121, 85,
+  121, 131, 119, 153, 46, 115, 129, 71, 67, 65,
+  102, 89, 92, 108, 92, 108, 88, 87, 103, 97,
+  97, 91, 64, 69, 117, 103, 92, 77, 99, 92,
+  90, 92, 105, 86, 96, 81, 103, 82, 114, 152,
+  109, 111, 100, 83, 95, 103, 113, 108, 133, 98,
+  117, 123, 90, 91, 110, 133, 124, 98, 91, 110,
+  106, 89, 81, 61, 89, 109, 66, 129, 67, 103,
+  120, 103, 106, 85, 79, 92, 59, 61, 77, 111,
+  74, 106, 98, 116, 125, 58, 109, 105, 92, 110,
+  121, 126, 79, 111, 81, 115, 59, 102, 107, 88,
+  133, 126, 101, 109, 128, 111, 107, 116, 103, 116,
+  97, 101, 90, 46, 162, 101, 142, 97, 90, 98,
+  151, 116, 92, 124, 67, 86, 94, 111, 104, 138,
+  97, 96, 81, 143, 79, 107, 70, 84, 74, 90,
+  109, 148, 130, 91, 109, 132, 119, 115, 118, 126,
+  154, 121, 118, 92, 107, 106, 99, 93, 98, 108,
+  121, 78, 104, 99, 147, 71, 98, 92, 121, 114,
+  88, 73, 115, 77, 110, 96, 89, 117, 120, 102,
+  85, 59, 152, 129, 98, 146, 119, 124, 84, 88,
+  100, 94, 104, 111, 102, 140, 83, 94, 111, 78,
+  86, 84, 131, 88, 91, 107, 98, 113, 80, 111,
+  90, 100, 87, 103, 75, 70, 91, 104, 103, 86,
+  103, 130, 101, 70, 116, 91, 83, 104, 93, 102,
+  94, 143, 113, 128, 93, 92, 108, 105, 104, 85,
+  103, 105, 107, 113, 111, 82, 128, 111, 135, 98,
+  81, 114, 116, 98, 94, 59, 108, 103, 66, 99,
+  95, 92, 93, 100, 118, 135, 92, 92, 58, 94,
+  99, 113, 117, 118, 104, 115, 135, 67, 103, 105,
+  128, 71, 112, 113, 89, 103, 82, 145, 67, 121,
+  97, 114, 134, 122, 112, 129, 113, 110, 76, 93,
+  106, 134, 99, 114, 95, 68, 165, 98, 126, 121,
+  61, 116, 123, 102, 103, 129, 78, 84, 87, 73,
+  106, 99, 89, 95, 110, 130, 87, 127, 63, 101,
+  98, 89, 112, 145, 96, 98, 85, 133, 102, 129,
+  119, 92, 143, 137, 118, 89, 107, 116, 102, 113,
+  109, 102, 98, 105, 106, 75, 121, 116, 105, 95,
+  137, 124, 84, 89, 88, 108, 152, 109, 80, 119,
+  105, 104, 86, 57, 128, 126, 96, 124, 123, 117,
+  79, 86, 110, 105, 108, 107, 82, 120, 109, 92,
+  73, 100, 91, 127, 92, 109, 110, 95, 125, 120,
+  99, 116, 88, 112, 87, 109, 87, 80, 66, 132,
+  120, 103, 100, 138, 105, 60, 129, 103, 89, 98,
+  88, 97, 84, 112, 131, 140, 105, 114, 84, 109,
+  123, 103, 93, 107, 106, 94, 128, 83, 147, 94,
+  140, 113, 79, 117, 119, 120, 104, 54, 116, 102,
+  62, 104, 88, 90, 95, 94, 141, 140, 119, 91,
+  84, 105, 118, 103, 113, 108, 108, 113, 142, 84,
+  118, 114, 153, 78, 108, 114, 112, 111, 77, 156,
+  89, 164, 89, 121, 123, 114, 134, 138, 107, 108,
+  79, 91, 112, 122, 98, 128, 108, 87, 151, 110,
+  112, 116, 62, 129, 79, 77, 118, 144, 60, 103,
+  94, 88, 89, 92, 86, 85, 136, 103, 103, 135,
+  69, 129, 126, 96, 117, 132, 105, 86, 102, 132,
+  107, 118, 128, 75, 124, 95, 114, 125, 84, 124,
+  110, 122, 100, 106, 88, 128, 110, 83, 104, 133,
+  109, 80, 115, 106, 102, 94, 74, 131, 135, 126,
+  88, 88, 109, 103, 105, 63, 93, 127, 94, 105,
+  111, 120, 97, 82, 121, 120, 125, 123, 77, 113,
+  71, 110, 71, 107, 98, 131, 68, 117, 126, 89,
+  125, 120, 114, 103, 101, 132, 86, 107, 72, 84,
+  82, 125, 135, 113, 91, 122, 100, 87, 124, 105,
+  93, 78, 101, 99, 86, 99, 108, 120, 114, 119,
+  108, 116, 141, 137, 83, 120, 112, 92, 143, 95,
+  148, 105, 137, 122, 88, 117, 131, 129, 117, 72,
+  127, 95, 63, 124, 79, 105, 111, 80, 143, 101,
+  123, 89, 108, 109, 125, 103, 84, 86, 108, 105,
+  142, 81, 143, 117, 149, 107, 109, 117, 121, 110,
+  71, 134, 111, 179, 101, 115, 104, 124, 128, 128,
+  98, 110, 107, 94, 116, 115, 92, 127, 97, 103,
+  134, 127, 103, 101, 74, 117, 74, 72, 133, 155,
+  63, 108, 98, 95, 79, 106, 90, 85, 138, 101,
+  104, 127, 76, 140, 114, 88, 120, 115, 132, 80,
+  128, 133, 124, 92, 138, 82, 121, 86, 116, 145,
+  97, 135, 122, 116, 82, 113, 94, 126, 112, 119,
+  100, 117, 104, 77, 107, 89, 116, 98, 88, 139,
+  106, 113, 94, 88, 105, 105, 119, 83, 76, 128,
+  100, 101, 105, 121, 108, 79, 144, 134, 130, 146,
+  84, 131, 73, 135, 85, 104, 99, 120, 80, 122,
+  106, 94, 119, 107, 120, 101, 110, 135, 89, 100,
+  58, 86, 116, 106, 127, 126, 87, 104, 91, 109,
+  116, 92, 98, 63, 98, 104, 99, 92, 99, 109,
+  125, 121, 93, 109, 139, 166, 89, 124, 113, 82,
+  141, 102, 153, 136, 129, 113, 92, 111, 118, 138,
+  114, 72, 127, 106, 58, 136, 75, 131, 124, 76,
+  155, 91, 123, 89, 132, 103, 122, 111, 68, 86,
+  110, 113, 129, 71, 154, 125, 144, 125, 102, 117,
+  124, 99, 52, 104, 115, 187, 96, 118, 96, 135,
+  126, 124, 105, 117, 133, 114, 121, 104, 93, 120,
+  72, 115, 120, 123, 106, 104, 93, 112, 79, 76,
+  129, 156, 57, 103, 111, 94, 82, 131, 94, 87,
+  119, 111, 95, 123, 71, 133, 104, 95, 123, 98,
+  142, 86, 149, 116, 128, 84, 139, 93, 101, 99,
+  114, 146, 98, 128, 127, 108, 69, 115, 103, 98,
+  104, 145, 99, 109, 88, 78, 87, 96, 130, 90,
+  82, 130, 86, 88, 94, 104, 92, 100, 127, 91,
+  83, 125, 108, 107, 105, 115, 119, 90, 148, 132,
+  144, 141, 96, 138, 43, 145, 103, 95, 95, 129,
+  81, 125, 95, 111, 112, 100, 122, 83, 119, 130,
+  83, 96, 58, 81, 148, 90, 109, 127, 93, 96,
+  87, 139, 100, 93, 101, 53, 90, 102, 107, 90,
+  88, 106, 128, 126, 103, 98, 135, 165, 102, 96,
+  109, 74, 122, 104, 153, 164, 137, 122, 110, 101,
+  99, 141, 118, 58, 113, 99, 49, 145, 61, 139,
+  110, 81, 166, 103, 127, 90, 143, 92, 120, 108,
+  67, 75, 109, 104, 108, 76, 142, 151, 143, 111,
+  107, 117, 116, 102, 62, 69, 109, 201, 93, 117,
+  104, 149, 110, 126, 97, 108, 130, 144, 129, 99,
+  104, 122, 66, 113, 111, 115, 113, 108, 108, 101,
+  110, 74, 129, 152, 42, 101, 138, 118, 83, 150,
+  95, 91, 112, 109, 86, 108, 80, 126, 116, 104,
+  121, 88, 135, 84, 154, 115, 121, 98, 125, 114,
+  106, 111, 109, 138, 96, 122, 124, 107, 74, 124,
+  107, 74, 101, 150, 106, 116, 60, 85, 74, 104,
+  153, 79, 92, 111, 77, 70, 78, 86, 82, 97,
+  122, 80, 101, 129, 114, 104, 102, 117, 109, 125,
+  146, 125, 137, 147, 102, 142, 40, 148, 117, 89,
+  92, 121, 93, 108, 106, 123, 99, 107, 126, 71,
+  123, 116, 67, 108, 62, 79, 158, 70, 96, 132,
+  99, 95, 92, 155, 89, 99, 101, 65, 90, 92,
+  110, 88, 76, 108, 122, 124, 101, 88, 119, 148,
+  99, 74, 88, 68, 100, 92, 141, 166, 131, 127,
+  119, 91, 77, 117, 118, 50, 79, 95, 38, 151,
+  63, 131, 85, 70, 143, 121, 111, 85, 133, 92,
+  105, 103, 86, 58, 95, 81, 102, 108, 124, 155,
+  124, 96, 102, 128, 106, 96, 81, 60, 93, 213,
+  106, 113, 128, 155, 85, 123, 85, 94, 93, 145,
+  140, 100, 124, 134, 67, 91, 94, 118, 107, 108,
+  106, 102, 134, 69, 136, 132, 73, 103, 146, 113,
+  94, 152, 95, 93, 104, 107, 99, 94, 108, 134,
+  114, 95, 136, 87, 113, 91, 138, 117, 102, 95,
+  98, 130, 114, 109, 114, 134, 105, 109, 119, 105,
+  88, 121, 100, 80, 99, 124, 115, 136, 45, 105,
+  57, 109, 169, 108, 96, 79, 65, 62, 75, 84,
+  80, 106, 106, 58, 83, 129, 126, 109, 104, 138,
+  82, 156, 122, 118, 111, 124, 94, 125, 64, 152,
+  99, 93, 107, 99, 114, 84, 111, 116, 98, 101,
+  120, 89, 97, 97, 57, 113, 65, 54, 126, 54,
+  97, 144, 87, 105, 92, 150, 87, 102, 102, 88,
+  90, 84, 99, 85, 64, 110, 121, 105, 114, 81,
+  93, 121, 64, 83, 53, 67, 105, 75, 139, 139,
+  105, 128, 119, 103, 48, 86, 95, 77, 75, 103,
+  31, 115, 89, 110, 69, 47, 108, 98, 89, 77,
+  109, 108, 88, 100, 104, 59, 81, 57, 98, 130,
+  99, 129, 110, 106, 93, 124, 85, 89, 75, 52,
+  87, 166, 110, 108, 112, 124, 88, 103, 71, 95,
+  49, 120, 144, 101, 132, 157, 79, 58, 77, 114,
+  90, 92, 90, 100, 116, 83, 127, 103, 106, 108,
+  132, 88, 105, 121, 82, 98, 94, 100, 130, 81,
+  131, 135, 99, 82, 139, 70, 94, 105, 110, 111,
+  77, 77, 67, 119, 110, 88, 116, 125, 102, 97,
+  106, 115, 92, 101, 81, 102, 97, 85, 111, 142,
+  27, 124, 62, 105, 153, 143, 106, 57, 69, 78,
+  92, 95, 77, 88, 86, 60, 48, 106, 126, 109,
+  109, 141, 49, 158, 98, 114, 85, 104, 69, 94,
+  93, 138, 69, 100, 125, 92, 113, 87, 87, 102,
+  106, 98, 104, 118, 64, 93, 85, 107, 65, 46,
+  83, 58, 115, 136, 81, 101, 83, 135, 94, 75,
+  89, 104, 92, 63, 86, 61, 41, 99, 131, 91,
+  101, 70, 67, 96, 57, 117, 36, 84, 118, 68,
+  132, 106, 96, 128, 115, 125, 36, 72, 66, 116,
+  74, 146, 19, 76, 107, 88, 92, 39, 78, 70,
+  115, 83, 83, 114, 77, 89, 102, 68, 86, 51,
+  105, 113, 84, 98, 94, 115, 98, 125, 47, 92,
+  85, 22, 88, 107, 108, 80, 82, 89, 90, 69,
+  54, 87, 46, 83, 104, 88, 123, 163, 88, 43,
+  73, 114, 91, 66, 76, 82, 101, 112, 111, 85,
+  115, 130, 107, 91, 101, 101, 57, 115, 103, 98,
+  153, 69, 120, 127, 109, 75, 109, 53, 104, 121,
+  105, 97, 56, 49, 56, 119, 107, 105, 114, 101,
+  85, 82, 76, 114, 100, 92, 89, 108, 107, 81,
+  124, 120, 25, 122, 90, 94, 125, 130, 126, 45,
+  66, 79, 109, 123, 67, 81, 81, 81, 36, 96,
+  105, 120, 118, 125, 33, 129, 67, 111, 60, 102,
+  57, 88, 95, 121, 64, 104, 103, 82, 93, 93,
+  80, 109, 102, 111, 95, 131, 49, 96, 115, 89,
+  82, 56, 84, 75, 136, 121, 75, 85, 74, 115,
+  100, 60, 77, 122, 73, 53, 89, 52, 34, 70,
+  154, 73, 95, 61, 68, 93, 88, 112, 43, 106,
+  87, 94, 76, 90, 105, 101, 139, 117, 37, 75,
+  52, 136, 77, 140, 22, 65, 88, 89, 147, 57,
+  89, 71, 105, 91, 79, 111, 71, 62, 83, 81,
+  90, 76, 113, 90, 70, 72, 79, 126, 100, 118,
+  32, 104, 73, 28, 83, 66, 100, 80, 87, 89,
+  83, 56, 61, 80, 70, 84, 69, 92, 112, 128,
+  103, 59, 88, 117, 112, 87, 95, 91, 79, 140,
+  98, 80, 87, 144, 56, 122, 86, 130, 35, 143,
+  114, 88, 141, 58, 82, 144, 130, 87, 79, 49,
+  131, 94, 125, 97, 65, 28, 66, 131, 94, 123,
+  111, 72, 65, 96, 57, 97, 112, 108, 137, 94,
+  112, 110, 143, 108, 25, 103, 110, 91, 89, 105,
+  118, 52, 72, 79, 116, 103, 61, 96, 94, 119,
+  53, 118, 110, 153, 112, 98, 39, 121, 62, 104,
+  57, 116, 69, 96, 75, 105, 107, 83, 55, 98,
+  98, 74, 81, 117, 85, 124, 86, 93, 60, 103,
+  121, 87, 102, 59, 96, 77, 117, 92, 113, 85,
+  85, 111, 88, 75, 94, 123, 78, 64, 103, 75,
+  59, 68, 186, 64, 133, 78, 79, 114, 102, 108,
+  81, 105, 72, 124, 64, 90, 77, 88, 134, 92,
+  72, 86, 66, 121, 104, 58, 42, 84, 53, 115,
+  188, 88, 104, 83, 84, 87, 82, 112, 72, 70,
+  77, 76, 107, 93, 121, 68, 75, 67, 75, 163,
+  95, 121, 64, 152, 61, 70, 79, 79, 106, 132,
+  105, 117, 85, 55, 95, 103, 101, 98, 86, 117,
+  99, 93, 99, 68, 109, 115, 125, 90, 104, 119,
+  70, 134, 87, 73, 73, 124, 50, 121, 73, 172,
+  36, 143, 87, 79, 93, 54, 51, 130, 127, 97,
+  79, 64, 156, 101, 139, 105, 116, 45, 77, 107,
+  83, 90, 113, 79, 60, 128, 63, 77, 113, 121,
+  182, 83, 111, 146, 133, 95, 48, 104, 98, 107,
+  78, 89, 141, 67, 99, 90, 126, 87, 72, 108,
+  105, 177, 98, 119, 119, 168, 103, 74, 83, 131,
+  95, 90, 80, 113, 74, 116, 84, 86, 132, 54,
+  50, 87, 119, 82, 85, 102, 89, 130, 77, 85,
+  82, 96, 129, 110, 96, 100, 98, 85, 92, 75,
+  129, 100, 91, 120, 89, 84, 104, 107, 116, 85,
+  118, 118, 55, 98, 183, 62, 128, 104, 83, 123,
+  118, 130, 95, 123, 70, 135, 111, 110, 76, 98,
+  110, 103, 88, 100, 93, 82, 93, 72, 55, 95,
+  46, 140, 184, 85, 98, 110, 97, 74, 91, 117,
+  65, 104, 81, 69, 109, 97, 123, 78, 79, 99,
+  79, 184, 88, 116, 97, 149, 46, 72, 81, 108,
+  114, 117, 82, 122, 94, 67, 127, 118, 103, 80,
+  106, 114, 107, 100, 105, 82, 136, 97, 125, 82,
+  84, 126, 138, 127, 87, 76, 86, 97, 84, 103,
+  67, 163, 57, 94, 85, 93, 86, 67, 60, 94,
+  109, 96, 94, 82, 179, 123, 149, 122, 149, 93,
+  96, 108, 78, 99, 113, 111, 69, 145, 72, 80,
+  95, 130, 148, 81, 112, 160, 122, 80, 63, 140,
+  71, 126, 78, 94, 177, 68, 115, 104, 131, 133,
+  91, 114, 97, 203, 146, 113, 119, 161, 102, 85,
+  110, 145, 112, 92, 103, 117, 81, 128, 88, 75,
+  136, 69, 65, 89, 119, 119, 97, 83, 111, 125,
+  84, 113, 82, 68, 130, 104, 73, 136, 107, 93,
+  101, 60, 110, 98, 89, 114, 117, 98, 95, 106,
+  152, 95, 107, 141, 54, 102, 157, 55, 126, 114,
+  72, 98, 123, 124, 93, 141, 76, 120, 114, 109,
+  97, 99, 92, 126, 88, 109, 88, 98, 74, 101,
+  59, 95, 92, 161, 156, 80, 94, 135, 110, 68,
+  84, 125, 67, 104, 105, 85, 95, 89, 113, 75,
+  81, 109, 94, 152, 90, 111, 96, 91, 62, 62,
+  83, 112, 93, 76, 78, 146, 104, 77, 101, 106,
+  87, 59, 97, 113, 112, 105, 111, 82, 135, 88,
+  126, 104, 45, 140, 174, 165, 91, 86, 79, 98,
+  111, 108, 80, 141, 57, 83, 108, 92, 121, 56,
+  85, 97, 100, 122, 89, 91, 162, 73, 133, 128,
+  144, 114, 96, 137, 66, 142, 121, 128, 75, 157,
+  74, 80, 81, 158, 113, 72, 120, 137, 137, 98,
+  67, 156, 89, 121, 70, 117, 134, 69, 130, 105,
+  112, 155, 96, 126, 67, 191, 127, 88, 133, 151,
+  103, 92, 96, 151, 113, 94, 85, 121, 82, 134,
+  79, 78, 134, 90, 71, 107, 92, 126, 109, 68,
+  128, 117, 95, 117, 71, 39, 131, 88, 76, 107,
+  103, 113, 119, 56, 151, 86, 101, 92, 163, 99,
+  103, 109, 155, 87, 80, 125, 82, 93, 162, 52,
+  101, 103, 71, 82, 133, 139, 85, 97, 78, 114,
+  92, 114, 109, 86, 90, 112, 96, 99, 57, 127,
+  76, 127, 50, 118, 101, 152, 162, 85, 97, 120,
+  111, 77, 67, 113, 61, 84, 122, 107, 102, 93,
+  108, 78, 86, 84, 83, 135, 92, 106, 70, 122,
+  80, 76, 84, 101, 106, 80, 93, 163, 95, 68,
+  67, 99, 102, 56, 67, 110, 107, 97, 99, 67,
+  136, 100, 129, 97, 57, 132, 105, 162, 88, 94,
+  77, 126, 94, 91, 91, 141, 59, 105, 93, 86,
+  147, 43, 89, 145, 84, 120, 87, 88, 152, 84,
+  117, 124, 140, 103, 86, 101, 91, 155, 125, 102,
+  88, 153, 71, 79, 89, 154, 133, 66, 126, 125,
+  151, 82, 79, 119, 104, 100, 69, 111, 127, 78,
+  128, 81, 112, 136, 81, 112, 59, 173, 77, 82,
+  103, 152, 96, 95, 96, 125, 85, 93, 85, 118,
+  95, 148, 85, 84, 137, 79, 59, 98, 84, 96,
+  103, 78, 128, 143, 102, 131, 69, 37, 131, 103,
+  92, 102, 99, 112, 109, 48, 159, 76, 103, 92,
+  159, 83, 110, 108, 144, 73, 76, 125, 96, 63,
+  185, 69, 118, 95, 91, 110, 138, 101, 105, 80,
+  93, 132, 85, 151, 117, 102, 113, 77, 82, 92,
+  77, 78, 89, 85, 47, 128, 97, 131, 172, 100,
+  131, 101, 82, 113, 80, 95, 93, 100, 82, 104,
+  128, 103, 101, 86, 83, 86, 56, 142, 93, 96,
+  66, 122, 66, 82, 65, 83, 101, 69, 148, 130,
+  76, 69, 100, 85, 160, 139, 87, 118, 109, 89,
+  107, 54, 140, 107, 136, 71, 106, 112, 74, 130,
+  78, 102, 44, 120, 101, 127, 99, 163, 69, 105,
+  68, 93, 118, 47, 69, 148, 63, 92, 116, 108,
+  173, 99, 135, 123, 135, 109, 84, 107, 99, 117,
+  120, 92, 79, 142, 77, 75, 112, 137, 174, 56,
+  115, 111, 145, 74, 79, 100, 108, 93, 111, 55,
+  155, 78, 106, 54, 102, 106, 62, 106, 71, 163,
+  101, 99, 91, 155, 92, 89, 119, 123, 93, 75,
+  94, 107, 108, 157, 59, 118, 174, 43, 55, 84,
+  77, 56, 105, 94, 92, 164, 110, 95, 96, 67,
+  95, 97, 101, 70, 101, 102, 89, 33, 112, 88,
+  105, 127, 115, 81, 107, 85, 133, 62, 99, 143,
+  102, 81, 159, 82, 94, 86, 62, 118, 139, 78,
+  109, 109, 72, 121, 72, 157, 104, 89, 135, 83,
+  68, 86, 76, 56, 84, 92, 36, 106, 81, 95,
+  143, 84, 135, 101, 81, 113, 88, 84, 107, 112,
+  80, 105, 96, 97, 85, 96, 73, 56, 34, 119,
+  79, 79, 63, 87, 53, 81, 70, 85, 78, 135,
+  167, 118, 69, 51, 134, 109, 124, 166, 117, 115,
+  111, 79, 102, 62, 132, 78, 120, 86, 115, 85,
+  97, 106, 68, 94, 59, 107, 91, 135, 108, 144,
+  56, 75, 75, 104, 98, 39, 75, 97, 75, 70,
+  121, 97, 137, 103, 108, 107, 120, 92, 80, 127,
+  95, 82, 121, 107, 101, 131, 71, 97, 140, 106,
+  171, 61, 98, 80, 157, 91, 72, 113, 78, 122,
+  112, 114, 121, 75, 95, 89, 77, 76, 69, 100,
+  101, 126, 122, 80, 98, 153, 96, 79, 120, 144,
+  78, 76, 64, 88, 79, 103, 50, 103, 159, 37,
+  50, 85, 105, 42, 107, 79, 99, 106, 90, 100,
+  102, 66, 68, 96, 97, 82, 59, 89, 71, 36,
+  87, 125, 116, 132, 76, 100, 108, 71, 103, 62,
+  100, 131, 108, 135, 110, 110, 90, 113, 25, 96,
+  150, 92, 99, 134, 51, 118, 54, 152, 84, 93,
+  135, 129, 73, 81, 79, 73, 70, 83, 33, 99,
+  93, 69, 99, 73, 80, 109, 57, 118, 57, 98,
+  105, 142, 95, 127, 99, 100, 87, 132, 45, 77,
+  80, 110, 92, 78, 40, 94, 81, 102, 66, 88,
+  116, 166, 120, 104, 65, 68, 85, 109, 59, 107,
+  92, 94, 110, 98, 111, 91, 119, 72, 107, 89,
+  86, 100, 76, 109, 92, 92, 117, 138, 87, 111,
+  122, 119, 54, 75, 96, 99, 110, 62, 97, 84,
+  102, 78, 108, 68, 86, 96, 91, 99, 126, 90,
+  68, 123, 104, 74, 104, 95, 89, 123, 88, 160,
+  128, 89, 137, 83, 83, 91, 176, 77, 46, 114,
+  140, 158, 112, 137, 124, 64, 136, 128, 73, 86,
+  78, 122, 102, 114, 112, 70, 86, 152, 143, 86,
+  106, 165, 80, 112, 42, 96, 41, 80, 120, 92,
+  135, 77, 87, 94, 121, 73, 102, 83, 108, 85,
+  85, 116, 74, 75, 70, 129, 89, 94, 72, 107,
+  91, 65, 101, 154, 103, 118, 97, 117, 97, 112,
+  58, 81, 98, 82, 135, 143, 80, 107, 99, 139,
+  49, 78, 108, 84, 87, 95, 62, 79, 83, 115,
+  102, 88, 119, 146, 50, 85, 76, 55, 86, 97,
+  38, 77, 110, 46, 64, 60, 91, 83, 83, 89,
+  77, 122, 106, 125, 121, 168, 92, 94, 82, 130,
+  51, 91, 90, 107, 110, 85, 38, 99, 92, 153,
+  78, 108, 128, 99, 82, 82, 120, 83, 79, 110,
+  52, 101, 92, 77, 110, 95, 140, 110, 84, 86,
+  102, 117, 64, 96, 48, 88, 106, 85, 118, 145,
+  76, 92, 102, 85, 72, 83, 89, 83, 91, 83,
+  117, 131, 177, 74, 89, 79, 73, 80, 86, 104,
+  112, 103, 57, 84, 138, 83, 104, 125, 56, 94,
+  88, 181, 115, 70, 82, 103, 77, 84, 131, 88,
+  35, 92, 140, 133, 100, 94, 99, 84, 148, 174,
+  67, 84, 122, 97, 120, 97, 81, 77, 90, 114,
+  143, 99, 81, 132, 80, 98, 52, 91, 45, 63,
+  69, 92, 86, 101, 79, 125, 100, 89, 89, 68,
+  136, 78, 108, 121, 69, 96, 70, 176, 115, 113,
+  56, 105, 141, 100, 90, 157, 88, 105, 96, 110,
+  109, 111, 57, 84, 86, 49, 109, 117, 91, 117,
+  115, 125, 132, 128, 107, 119, 117, 83, 97, 84,
+  115, 111, 106, 72, 110, 125, 87, 91, 120, 71,
+  99, 89, 45, 146, 96, 55, 89, 72, 116, 72,
+  95, 86, 126, 149, 94, 113, 105, 78, 108, 97,
+  112, 126, 91, 88, 100, 140, 126, 119, 89, 95,
+  94, 163, 93, 144, 148, 89, 98, 105, 119, 129,
+  93, 93, 96, 109, 101, 103, 102, 104, 87, 104,
+  82, 138, 130, 82, 82, 97, 58, 81, 143, 80,
+  143, 126, 67, 112, 103, 89, 89, 98, 108, 88,
+  88, 118, 122, 157, 198, 89, 105, 135, 102, 139,
+  100, 125, 112, 114, 83, 56, 152, 110, 122, 159,
+  74, 86, 117, 137, 114, 78, 97, 109, 84, 105,
+  92, 83, 70, 61, 88, 73, 130, 87, 141, 128,
+  112, 114, 101, 89, 173, 113, 136, 81, 83, 99,
+  87, 83, 111, 101, 87, 70, 77, 107, 133, 139,
+  83, 118, 61, 155, 84, 97, 113, 125, 113, 71,
+  83, 103, 130, 54, 123, 112, 90, 134, 83, 169,
+  125, 101, 57, 86, 128, 117, 86, 112, 71, 119,
+  93, 91, 88, 78, 96, 99, 106, 65, 157, 117,
+  112, 128, 160, 111, 164, 157, 120, 109, 147, 115,
+  136, 113, 132, 120, 130, 108, 124, 97, 90, 94,
+  132, 62, 127, 65, 38, 176, 109, 110, 127, 89,
+  121, 86, 88, 82, 126, 154, 108, 126, 104, 54,
+  108, 100, 134, 124, 112, 132, 97, 164, 117, 142,
+  128, 74, 103, 136, 135, 123, 115, 94, 93, 111,
+  105, 126, 107, 68, 123, 127, 125, 106, 111, 134,
+  95, 110, 99, 181, 140, 61, 108, 123, 107, 119,
+  144, 97, 118, 110, 101, 109, 119, 110, 97, 116,
+  110, 130, 94, 121, 133, 100, 121, 122, 123, 150,
+  124, 164, 108, 118, 125, 94, 128, 137, 148, 136,
+  151, 110, 74, 92, 145, 109, 100, 79, 125, 102,
+  123, 114, 89, 98, 83, 76, 126, 95, 146, 80,
+  164, 147, 84, 54, 155, 136, 138, 127, 108, 99,
+  118, 110, 107, 92, 84, 107, 127, 58, 110, 112,
+  150, 141, 113, 153, 69, 161, 111, 97, 132, 91,
+  104, 83, 110, 140, 91, 54, 117, 106, 94, 135,
+  93, 102, 117, 68, 92, 85, 98, 127, 102, 94,
+  79, 131, 75, 89, 62, 109, 107, 112, 113, 89,
+  213, 120, 106, 122, 71, 107, 130, 125, 98, 96,
+  131, 132, 117, 115, 104, 102, 117, 96, 123, 88,
+  88, 83, 137, 99, 115, 112, 63, 134, 175, 130,
+  109, 89, 95, 92, 78, 80, 98, 163, 105, 121,
+  132, 138, 120, 100, 129, 92, 124, 106, 88, 130,
+  92, 112, 137, 109, 90, 144, 161, 90, 131, 139,
+  94, 115, 107, 87, 102, 117, 107, 106, 127, 115,
+  111, 162, 85, 119, 97, 149, 116, 146, 179, 131,
+  153, 147, 126, 74, 124, 94, 121, 90, 155, 119,
+  98, 120, 85, 166, 108, 126, 126, 78, 100, 111,
+  119, 126, 122, 120, 91, 110, 122, 87, 124, 158,
+  122, 142, 148, 75, 78, 99, 120, 104, 106, 88,
+  114, 98, 117, 108, 123, 151, 91, 120, 118, 123,
+  125, 119, 93, 132, 99, 120, 174, 126, 115, 113,
+  108, 101, 104, 112, 121, 111, 95, 97, 114, 86,
+  95, 121, 101, 108, 115, 119, 67, 118, 95, 105,
+  121, 121, 121, 89, 126, 105, 88, 86, 113, 105,
+  84, 110, 112, 102, 105, 118, 102, 88, 87, 108,
+  129, 175, 80, 122, 90, 93, 120, 133, 103, 89,
+  96, 93, 138, 123, 145, 108, 88, 155, 99, 100,
+  94, 117, 93, 112, 93, 153, 108, 104, 121, 132,
+  111, 152, 118, 127, 120, 127, 126, 90, 74, 105,
+  164, 100, 105, 100, 123, 68, 136, 98, 103, 136,
+  91, 95, 144, 114, 114, 121, 115, 104, 89, 98,
+  97, 116, 145, 122, 92, 115, 101, 145, 107, 101,
+  135, 135, 106, 126, 106, 107, 115, 124, 113, 106,
+  103, 126, 118, 99, 128, 119, 117, 103, 121, 132,
+  149, 149, 92, 132, 113, 79, 96, 104, 83, 102,
+  128, 135, 97, 122, 116, 117, 109, 108, 97, 119,
+  101, 132, 112, 100, 131, 81, 117, 145, 135, 98,
+  106, 146, 122, 138, 131, 98, 98, 93, 99, 113,
+  124, 146, 111, 126, 99, 137, 112, 127, 90, 103,
+  105, 124, 108, 137, 91, 105, 92, 135, 132, 80,
+  114, 133, 125, 150, 110, 97, 112, 133, 162, 101,
+  99, 127, 103, 104, 58, 128, 118, 131, 84, 73,
+  107, 95, 99, 104, 103, 121, 145, 87, 100, 106,
+  119, 111, 94, 105, 123, 94, 113, 108, 83, 134,
+  95, 91, 126, 158, 86, 105, 115, 135, 130, 101,
+  125, 88, 81, 129, 104, 105, 176, 105, 128, 139,
+  98, 105, 111, 164, 99, 95, 88, 156, 110, 124,
+  101, 120, 112, 146, 106, 119, 135, 130, 113, 68,
+  55, 110, 57, 90, 134, 102, 123, 112, 120, 77,
+  115, 122, 66, 114, 159, 80, 112, 99, 109, 108,
+  84, 70, 92, 167, 85, 129, 107, 197, 77, 121,
+  82, 124, 136, 127, 86, 116, 99, 117, 107, 111,
+  120, 109, 107, 109, 99, 90, 103, 104, 126, 92,
+  133, 91, 95, 155, 75, 95, 92, 95, 103, 107,
+  84, 118, 117, 153, 94, 108, 111, 103, 97, 82,
+  109, 130, 122, 127, 102, 92, 163, 113, 151, 134,
+  170, 96, 100, 102, 86, 172, 137, 103, 93, 94,
+  93, 112, 113, 152, 104, 114, 109, 157, 87, 110,
+  77, 110, 80, 110, 95, 113, 157, 82, 105, 115,
+  133, 73, 136, 121, 118, 173, 98, 105, 121, 138,
+  149, 94, 116, 135, 110, 105, 109, 157, 116, 141,
+  82, 67, 117, 74, 71, 94, 132, 117, 122, 86,
+  115, 129, 122, 121, 81, 81, 116, 139, 87, 147,
+  104, 120, 76, 104, 100, 101, 87, 108, 106, 119,
+  124, 88, 141, 88, 87, 136, 83, 113, 164, 97,
+  133, 118, 100, 114, 131, 125, 105, 103, 86, 131,
+  108, 139, 111, 127, 110, 114, 118, 88, 109, 83,
+  114, 101, 55, 112, 36, 110, 156, 97, 108, 103,
+  98, 66, 99, 110, 60, 136, 126, 84, 91, 104,
+  110, 124, 82, 129, 78, 193, 89, 132, 116, 135,
+  69, 65, 79, 128, 111, 88, 81, 95, 85, 98,
+  117, 91, 107, 86, 103, 108, 116, 108, 100, 89,
+  114, 90, 132, 70, 82, 126, 80, 95, 98, 92,
+  134, 70, 116, 124, 102, 157, 98, 93, 91, 109,
+  100, 83, 112, 109, 111, 109, 114, 79, 159, 137,
+  161, 122, 160, 101, 107, 170, 75, 110, 115, 113,
+  84, 93, 91, 105, 104, 133, 102, 93, 114, 154,
+  109, 71, 58, 101, 81, 103, 111, 85, 173, 80,
+  98, 85, 121, 155, 110, 111, 82, 174, 111, 98,
+  124, 153, 126, 93, 123, 139, 106, 105, 61, 110,
+  100, 137, 96, 88, 133, 84, 64, 102, 102, 107,
+  81, 105, 102, 118, 130, 132, 86, 71, 91, 125,
+  68, 87, 132, 94, 85, 94, 105, 84, 86, 130,
+  112, 100, 102, 68, 98, 93, 87, 127, 77, 107,
+  163, 68, 78, 103, 86, 97, 119, 139, 84, 82,
+  78, 89, 71, 76, 81, 81, 111, 105, 119, 86,
+  93, 121, 114, 137, 34, 68, 30, 100, 147, 82,
+  126, 83, 120, 52, 87, 107, 66, 107, 110, 113,
+  68, 94, 101, 64, 94, 65, 60, 157, 84, 96,
+  90, 114, 62, 85, 85, 99, 89, 83, 80, 108,
+  104, 52, 118, 116, 80, 72, 84, 96, 96, 76,
+  67, 88, 62, 76, 97, 150, 88, 107, 57, 111,
+  85, 78, 126, 77, 76, 71, 96, 131, 59, 89,
+  104, 97, 92, 79, 108, 100, 122, 94, 86, 58,
+  116, 100, 107, 101, 138, 69, 72, 140, 85, 118,
+  121, 76, 61, 107, 63, 96, 105, 117, 85, 89,
+  109, 122, 112, 87, 46, 93, 80, 104, 64, 103,
+  81, 98, 103, 104, 120, 142, 84, 104, 94, 160,
+  73, 86, 103, 129, 103, 77, 101, 109, 88, 94,
+  30, 91, 78, 85, 50, 67, 98, 72, 39, 121,
+  62, 95, 83, 71, 109, 108, 119, 95, 92, 66,
+  80, 133, 87, 107, 96, 73, 87, 88, 150, 80,
+  80, 136, 82, 86, 83, 58, 57, 70, 93, 108,
+  67, 84, 178, 89, 125, 86, 145, 121, 128, 151,
+  86, 86, 88, 102, 85, 90, 117, 72, 104, 100,
+  131, 111, 96, 105, 111, 79, 40, 93, 66, 107,
+  165, 97, 134, 91, 119, 95, 109, 85, 95, 75,
+  80, 92, 109, 113, 130, 47, 115, 69, 54, 148,
+  96, 89, 93, 143, 69, 83, 84, 97, 110, 90,
+  108, 99, 95, 72, 125, 105, 132, 111, 82, 116,
+  99, 82, 100, 79, 81, 102, 118, 99, 107, 107,
+  104, 97, 92, 84, 89, 91, 62, 88, 97, 145,
+  74, 93, 122, 65, 105, 86, 72, 123, 117, 107,
+  103, 101, 143, 123, 133, 126, 115, 89, 99, 54,
+  104, 113, 115, 75, 75, 111, 74, 84, 101, 115,
+  132, 95, 100, 126, 117, 75, 77, 88, 99, 97,
+  112, 90, 125, 110, 88, 71, 114, 89, 132, 108,
+  106, 145, 90, 120, 108, 116, 88, 96, 108, 94,
+  104, 105, 109, 121, 109, 130, 52, 136, 129, 79,
+  55, 86, 68, 58, 79, 101, 92, 105, 120, 94,
+  117, 107, 95, 106, 85, 101, 114, 76, 90, 85,
+  119, 80, 79, 156, 84, 73, 76, 68, 75, 72,
+  115, 126, 80, 83, 162, 88, 84, 97, 142, 133,
+  137, 132, 118, 105, 91, 108, 93, 99, 112, 77,
+  107, 112, 112, 95, 91, 84, 104, 89, 43, 123,
+  68, 131, 154, 103, 116, 92, 112, 96, 79, 72,
+  93, 79, 80, 93, 102, 120, 139, 63, 137, 82,
+  56, 146, 115, 107, 86, 123, 61, 83, 79, 82,
+  109, 90, 120, 105, 88, 68, 150, 100, 171, 131,
+  100, 122, 104, 78, 89, 59, 107, 120, 135, 76,
+  111, 104, 142, 108, 87, 94, 57, 80, 74, 121,
+  89, 167, 94, 84, 98, 93, 106, 91, 82, 107,
+  75, 121, 101, 125, 172, 115, 131, 134, 121, 83,
+  113, 104, 110, 109, 115, 93, 73, 113, 82, 69,
+  89, 105, 143, 87, 123, 117, 131, 88, 100, 107,
+  107, 89, 105, 117, 134, 90, 84, 65, 105, 89,
+  133, 101, 114, 112, 103, 113, 117, 115, 103, 104,
+  106, 82, 99, 80, 129, 122, 128, 147, 57, 125,
+  124, 77, 55, 61, 79, 72, 89, 98, 81, 93,
+  109, 97, 112, 99, 115, 87, 64, 85, 117, 98,
+  84, 75, 115, 87, 77, 122, 87, 83, 86, 93,
+  89, 72, 121, 148, 115, 114, 125, 83, 85, 104,
+  118, 113, 151, 100, 121, 118, 89, 96, 87, 124,
+  101, 95, 113, 118, 94, 74, 82, 88, 93, 92,
+  54, 126, 75, 127, 122, 105, 92, 84, 75, 81,
+  60, 78, 73, 88, 84, 110, 91, 116, 126, 71,
+  120, 92, 65, 129, 120, 118, 76, 126, 58, 95,
+  75, 77, 121, 83, 121, 112, 83, 79, 129, 106,
+  121, 117, 92, 111, 104, 100, 78, 42, 129, 129,
+  137, 85, 113, 108, 163, 121, 92, 100, 67, 84,
+  85, 132, 92, 159, 90, 104, 88, 133, 95, 90,
+  82, 79, 67, 107, 104, 129, 144, 95, 107, 124,
+  126, 109, 112, 135, 140, 121, 106, 80, 86, 117,
+  102, 75, 87, 97, 134, 79, 119, 93, 152, 73,
+  89, 92, 128, 94, 92, 88, 127, 77, 94, 86,
+  107, 94, 124, 92, 93, 79, 117, 112, 105, 128,
+  110, 103, 102, 87, 98, 95, 102, 129, 110, 134,
+  66, 97, 108, 81, 72, 66, 126, 68, 78, 100,
+  93, 109, 82, 117, 77, 87, 118, 103, 62, 88,
+  100, 100, 81, 89, 111, 126, 83, 87, 91, 82,
+  83, 126, 88, 76, 98, 142, 114, 118, 101, 79,
+  132, 103, 107, 94, 127, 102, 113, 127, 98, 90,
+  92, 122, 123, 95, 97, 124, 104, 68, 85, 83,
+  115, 90, 58, 126, 76, 109, 97, 98, 102, 87,
+  81, 81, 57, 93, 78, 104, 126, 136, 85, 107,
+  123, 60, 96, 103, 87, 105, 125, 130, 71, 122,
+  74, 134, 77, 89, 130, 102, 119, 133, 88, 103,
+  98, 108, 88, 96, 82, 148, 98, 108, 87, 56,
+  155, 119, 137, 118, 90, 100, 123, 118, 101, 104,
+  102, 111, 85, 86, 97, 128, 92, 118, 76, 133,
+  75, 106, 66, 96, 88, 94, 111, 146, 104, 111,
+  89, 140, 117, 118, 110, 111, 165, 133, 118, 84,
+  103, 115, 102, 102, 101, 97, 120, 90, 106, 86,
+  141, 80, 91, 87, 135, 112, 94, 68, 115, 92,
+  141, 107, 118, 123, 122, 102, 92, 69, 129, 127,
+  100, 132, 117, 100, 80, 82, 105, 101, 89, 110,
+  89, 131, 130, 76, 86, 96, 92, 95, 126, 81,
+  82, 87, 110, 120, 92, 143, 67, 93, 99, 119,
+  80, 100, 64, 106, 95, 100, 116, 158, 92, 69,
+  109, 84, 87, 133, 85, 81, 89, 136, 116, 129,
+  113, 96, 81, 108, 119, 97, 94, 135, 117, 108,
+  98, 96, 126, 108, 132, 95, 83, 112, 129, 93,
+  105, 71, 104, 92, 65, 115, 88, 93, 103, 105,
+  147, 103, 103, 93, 75, 103, 95, 107, 133, 117,
+  90, 109, 131, 68, 106, 99, 120, 90, 110, 130,
+  104, 112, 75, 164, 74, 128, 109, 113, 120, 111,
+  116, 122, 99, 101, 96, 112, 103, 138, 90, 90,
+  93, 94, 155, 115, 127, 126, 84, 116, 67, 95,
+  103, 113, 82, 103, 83, 70, 81, 113, 91, 92,
+  88, 96, 78, 127, 55, 116, 117, 91, 127, 151,
+  103, 86, 99, 137, 113, 99, 121, 71, 127, 131,
+  120, 104, 75, 124, 105, 104, 98, 100, 104, 116,
+  105, 79, 100, 107, 112, 82, 106, 110, 100, 79,
+  87, 125, 135, 102, 107, 132, 120, 104, 102, 58,
+  106, 125, 93, 108, 118, 103, 84, 72, 113, 111,
+  115, 98, 91, 121, 97, 85, 73, 103, 99, 119,
+  63, 96, 98, 81, 100, 114, 130, 91, 93, 120,
+  83, 104, 86, 101, 61, 126, 92, 99, 102, 135,
+  84, 69, 100, 102, 91, 87, 90, 77, 87, 132,
+  116, 129, 125, 115, 90, 120, 141, 129, 97, 127,
+  134, 102, 97, 111, 142, 106, 144, 116, 84, 96,
+  143, 118, 108, 74, 109, 85, 57, 142, 82, 99,
+  125, 101, 167, 111, 114, 106, 93, 94, 109, 111,
+  108, 94, 90, 123, 140, 72, 135, 107, 120, 104,
+  107, 138, 125, 122, 77, 135, 87, 142, 95, 111,
+  103, 108, 130, 129, 102, 92, 123, 121, 121, 124,
+  86, 89, 85, 117, 161, 130, 123, 95, 92, 108,
+  78, 81, 115, 135, 45, 103, 95, 109, 70, 125,
+  90, 74, 121, 88, 100, 131, 78, 119, 123, 103,
+  127, 156, 134, 88, 124, 133, 128, 93, 149, 68,
+  119, 112, 119, 113, 79, 132, 112, 99, 85, 94,
+  103, 123, 115, 115, 100, 101, 119, 82, 91, 102,
+  115, 98, 93, 137, 92, 95, 95, 84, 122, 92,
+  111, 66, 91, 127, 95, 97, 107, 125, 113, 63,
+  133, 115, 142, 130, 108, 143, 65, 105, 94, 93,
+  100, 111, 75, 103, 110, 95, 99, 112, 140, 98,
+  113, 130, 93, 98, 65, 88, 100, 124, 78, 102,
+  105, 112, 82, 91, 88, 102, 85, 73, 93, 87,
+  97, 134, 112, 136, 123, 112, 106, 127, 149, 155,
+  113, 119, 138, 103, 107, 121, 139, 116, 130, 132,
+  99, 91, 150, 124, 107, 82, 115, 91, 59, 143,
+  80, 121, 137, 89, 150, 82, 116, 100, 104, 88,
+  112, 115, 90, 87, 99, 126, 143, 63, 162, 122,
+  101, 123, 109, 133, 119, 114, 70, 100, 98, 125,
+  110, 111, 88, 117, 112, 111, 89, 102, 145, 119,
+  126, 123, 80, 81, 66, 110, 142, 139, 113, 89,
+  100, 111, 110, 97, 114, 137, 58, 108, 114, 112,
+  78, 141, 89, 83, 116, 109, 101, 126, 82, 127,
+  100, 106, 132, 143, 159, 93, 137, 128, 127, 86,
+  158, 97, 120, 121, 121, 103, 100, 144, 116, 89,
+  72, 99, 116, 110, 122, 144, 116, 105, 108, 92,
+  105, 106, 123, 118, 100, 134, 69, 75, 109, 96,
+  121, 92, 116, 83, 74, 133, 112, 110, 108, 125,
+  123, 63, 147, 118, 147, 147, 124, 158, 56, 116,
+  113, 90, 100, 112, 92, 112, 107, 108, 87, 102,
+  146, 87, 110, 120, 107, 98, 64, 79, 122, 115,
+  70, 114, 109, 100, 77, 107, 90, 107, 85, 84,
+  94, 96, 106, 128, 108, 132, 124, 112, 96, 121,
+  134, 159, 128, 108, 131, 88, 108, 116, 124, 127,
+  115, 131, 121, 96, 131, 118, 90, 72, 111, 89,
+  52, 129, 72, 136, 131, 78, 132, 69, 111, 86,
+  116, 84, 103, 115, 77, 95, 94, 118, 139, 59,
+  174, 123, 90, 137, 106, 127, 106, 121, 57, 78,
+  100, 122, 115, 130, 80, 118, 93, 98, 94, 105,
+  133, 119, 126, 108, 71, 88, 43, 97, 117, 126,
+  108, 96, 114, 120, 122, 95, 103, 122, 51, 97,
+  115, 108, 77, 160, 88, 91, 96, 128, 90, 111,
+  66, 109, 100, 102, 136, 116, 162, 99, 135, 120,
+  119, 85, 158, 111, 132, 139, 117, 78, 90, 138,
+  115, 82, 69, 97, 115, 86, 128, 153, 130, 110,
+  88, 88, 105, 102, 118, 110, 102, 109, 68, 79,
+  113, 108, 116, 88, 115, 86, 77, 132, 120, 123,
+  107, 117, 117, 79, 143, 114, 154, 133, 123, 150,
+  34, 106, 108, 80, 98, 131, 92, 122, 98, 124,
+  81, 99, 130, 89, 99, 100, 122, 105, 76, 77,
+  123, 108, 73, 126, 111, 105, 80, 124, 79, 113,
+  87, 112, 81, 98, 112, 120, 87, 131, 110, 116,
+  94, 117, 132, 142, 118, 79, 119, 87, 109, 121,
+  113, 134, 117, 142, 122, 115, 121, 120, 84, 62,
+  107, 89, 40, 131, 75, 124, 105, 77, 116, 61,
+  110, 76, 107, 82, 99, 111, 76, 103, 99, 100,
+  119, 64, 169, 136, 96, 134, 96, 118, 93, 150,
+  61, 85, 100, 123, 104, 130, 65, 128, 99, 98,
+  106, 104, 114, 105, 129, 132, 76, 110, 48, 99,
+  116, 109, 110, 108, 113, 110, 116, 80, 97, 120,
+  48, 104, 118, 123, 83, 162, 94, 93, 90, 134,
+  84, 90, 62, 95, 107, 98, 137, 99, 135, 99,
+  108, 147, 111, 92, 147, 104, 171, 144, 110, 73,
+  92, 120, 120, 92, 74, 86, 96, 68, 126, 144,
+  127, 110, 72, 78, 98, 99, 118, 79, 98, 98,
+  91, 106, 114, 87, 106, 84, 115, 68, 101, 138,
+  114, 112, 102, 114, 107, 113, 132, 108, 139, 143,
+  112, 148, 44, 93, 93, 81, 105, 144, 108, 116,
+  90, 121, 89, 98, 119, 105, 96, 67, 113, 125,
+  76, 78, 128, 106, 78, 133, 102, 135, 78, 128,
+  79, 102, 82, 136, 80, 94, 112, 113, 71, 133,
+  107, 118, 115, 107, 131, 139, 86, 72, 105, 87,
+  112, 115, 128, 152, 125, 156, 102, 130, 110, 111,
+  90, 50, 122, 89, 32, 160, 91, 117, 83, 74,
+  117, 90, 113, 82, 99, 75, 101, 108, 96, 85,
+  96, 80, 104, 80, 144, 139, 96, 115, 93, 113,
+  106, 138, 74, 101, 106, 152, 104, 119, 92, 157,
+  108, 114, 107, 107, 95, 98, 135, 174, 94, 138,
+  57, 92, 124, 112, 112, 115, 104, 110, 121, 67,
+  106, 115, 64, 114, 143, 98, 89, 155, 101, 88,
+  93, 128, 85, 80, 73, 121, 94, 96, 152, 111,
+  93, 104, 97, 164, 90, 91, 125, 103, 189, 134,
+  114, 101, 123, 107, 125, 111, 90, 91, 89, 74,
+  127, 131, 120, 122, 59, 84, 85, 112, 131, 61,
+  90, 84, 85, 100, 97, 72, 77, 96, 104, 52,
+  103, 133, 101, 106, 102, 116, 98, 148, 119, 109,
+  115, 144, 97, 147, 75, 99, 77, 88, 126, 132,
+  109, 88, 89, 102, 99, 90, 122, 132, 88, 44,
+  87, 121, 62, 71, 114, 97, 87, 143, 97, 151,
+  85, 127, 94, 87, 76, 130, 86, 96, 102, 110,
+  71, 125, 112, 126, 98, 99, 113, 138, 55, 81,
+  74, 63, 100, 94, 147, 164, 109, 155, 97, 113,
+  69, 93, 107, 48, 100, 85, 27, 147, 104, 112,
+  65, 71, 137, 108, 79, 93, 112, 84, 97, 111,
+  112, 63, 87, 68, 95, 113, 102, 137, 113, 102,
+  86, 116, 133, 102, 62, 88, 95, 194, 106, 114,
+  127, 148, 109, 129, 92, 106, 71, 120, 144, 146,
+  115, 147, 76, 87, 109, 107, 108, 96, 89, 131,
+  112, 65, 116, 109, 89, 113, 160, 83, 96, 139,
+  99, 66, 89, 106, 101, 89, 96, 150, 88, 97,
+  161, 97, 78, 95, 110, 137, 77, 86, 99, 96,
+  126, 107, 110, 132, 105, 103, 119, 119, 96, 113,
+  70, 94, 110, 115, 111, 153, 32, 100, 65, 129,
+  151, 94, 89, 72, 71, 89, 84, 84, 49, 103,
+  81, 43, 75, 112, 111, 104, 103, 115, 87, 163,
+  98, 108, 92, 108, 71, 114, 73, 122, 71, 86,
+  137, 108, 99, 73, 89, 87, 98, 97, 113, 103,
+  82, 63, 73, 115, 42, 54, 92, 81, 93, 140,
+  86, 131, 84, 134, 99, 72, 82, 107, 101, 80,
+  88, 100, 53, 122, 122, 119, 102, 92, 80, 112,
+  35, 89, 41, 44, 106, 72, 177, 147, 104, 149,
+  107, 105, 45, 73, 103, 74, 73, 119, 18, 105,
+  110, 80, 63, 47, 116, 73, 79, 86, 110, 99,
+  88, 106, 124, 80, 76, 52, 91, 110, 77, 126,
+  107, 102, 73, 119, 116, 80, 69, 47, 92, 187,
+  102, 100, 120, 113, 102, 109, 72, 102, 46, 114,
+  142, 102, 136, 153, 89, 71, 76, 98, 92, 77,
+  74, 116, 80, 76, 124, 94, 129, 108, 161, 100,
+  102, 110, 73, 70, 83, 98, 124, 89, 122, 141,
+  109, 79, 139, 71, 77, 115, 106, 109, 65, 74,
+  70, 129, 86, 120, 105, 140, 96, 91, 90, 116,
+  99, 112, 63, 105, 92, 98, 110, 149, 20, 116,
+  68, 132, 146, 132, 114, 62, 67, 67, 92, 124,
+  51, 87, 73, 61, 56, 99, 118, 104, 110, 106,
+  59, 155, 80, 105, 53, 73, 50, 93, 84, 133,
+  51, 90, 115, 83, 104, 84, 73, 88, 104, 109,
+  114, 108, 75, 89, 98, 99, 57, 51, 88, 92,
+  109, 126, 66, 106, 68, 133, 107, 53, 92, 97,
+  79, 50, 83, 72, 28, 105, 130, 102, 96, 70,
+  57, 80, 29, 105, 28, 72, 105, 76, 156, 95,
+  103, 128, 127, 114, 44, 77, 81, 109, 71, 177,
+  5, 56, 95, 44, 89, 34, 80, 63, 123, 86,
+  97, 109, 77, 67, 118, 92, 75, 43, 92, 99,
+  66, 83, 87, 109, 72, 102, 62, 75, 81, 22,
+  90, 113, 83, 83, 94, 93, 105, 60, 73, 96,
+  37, 84, 103, 90, 147, 154, 94, 66, 71, 101,
+  85, 107, 78, 76, 66, 101, 101, 87, 124, 112,
+  101, 98, 93, 103, 40, 100, 110, 92, 135, 65,
+  122, 121, 122, 71, 107, 41, 92, 90, 95, 99,
+  51, 41, 56, 153, 92, 126, 108, 102, 81, 84,
+  55, 100, 110, 98, 83, 108, 98, 87, 120, 125,
+  11, 114, 87, 106, 103, 140, 119, 54, 57, 71,
+  99, 124, 65, 73, 93, 94, 43, 110, 118, 116,
+  107, 92, 27, 148, 61, 101, 37, 91, 39, 91,
+  74, 102, 63, 95, 63, 77, 97, 95, 55, 80,
+  82, 121, 127, 112, 68, 90, 131, 81, 83, 62,
+  91, 96, 116, 113, 84, 90, 67, 116, 86, 62,
+  100, 106, 62, 42, 95, 53, 32, 66, 149, 92,
+  79, 71, 65, 93, 69, 128, 61, 109, 80, 105,
+  77, 84, 74, 83, 148, 108, 53, 75, 85, 154,
+  86, 107, 22, 52, 63, 67, 139, 73, 84, 62,
+  108, 83, 78, 115, 67, 43, 88, 72, 102, 61,
+  110, 89, 59, 51, 85, 138, 80, 95, 48, 132,
+  73, 46, 87, 69, 104, 111, 92, 89, 84, 43,
+  92, 118, 74, 88, 61, 89, 116, 123, 90, 69,
+  81, 112, 105, 100, 98, 97, 60, 111, 82, 89,
+  87, 120, 44, 102, 85, 138, 32, 143, 110, 86,
+  110, 44, 98, 111, 125, 95, 76, 44, 130, 70,
+  121, 101, 81, 29, 64, 82, 89, 88, 108, 69,
+  40, 98, 57, 83, 120, 108, 148, 92, 115, 114,
+  139, 95, 29, 93, 87, 97, 79, 125, 128, 59,
+  72, 97, 117, 66, 70, 92, 104, 131, 52, 106,
+  116, 147, 104, 74, 52, 149, 65, 98, 73, 110,
+  54, 92, 62, 81, 104, 76, 47, 80, 111, 87,
+  68, 87, 63, 129, 103, 78, 70, 82, 129, 91,
+  90, 100, 87, 76, 91, 93, 116, 94, 76, 115,
+  72, 70, 99, 85, 98, 62, 115, 69, 43, 69,
+  154, 82, 136, 86, 90, 126, 109, 113, 97, 133,
+  85, 147, 102, 132, 76, 81, 112, 96, 75, 103,
+  103, 105, 101, 66, 48, 94, 58, 107, 206, 90,
+  97, 82, 79, 69, 90, 104, 68, 97, 76, 66,
+  123, 96, 131, 92, 62, 91, 87, 188, 76, 120,
+  92, 155, 50, 62, 69, 91, 133, 107, 91, 111,
+  85, 71, 104, 132, 125, 93, 90, 116, 111, 94,
+  98, 73, 127, 107, 135, 64, 84, 116, 95, 100,
+  81, 85, 105, 117, 57, 118, 96, 164, 59, 130,
+  66, 104, 77, 57, 67, 105, 110, 102, 71, 72,
+  170, 137, 178, 126, 132, 93, 94, 86, 84, 100,
+  109, 109, 64, 109, 77, 92, 111, 114, 199, 83,
+  115, 172, 128, 72, 64, 120, 78, 123, 96, 79,
+  201, 72, 114, 81, 122, 102, 93, 109, 101, 186,
+  144, 106, 125, 191, 122, 86, 100, 157, 105, 94,
+  119, 112, 78, 125, 116, 91, 162, 80, 66, 80,
+  132, 118, 88, 112, 96, 129, 86, 124, 85, 63,
+  124, 88, 94, 117, 108, 105, 86, 65, 100, 95,
+  87, 108, 100, 81, 96, 76, 160, 104, 119, 122,
+  70, 103, 136, 79, 123, 115, 77, 115, 122, 105,
+  98, 141, 89, 149, 135, 127, 116, 100, 97, 107,
+  95, 136, 120, 66, 97, 90, 52, 106, 95, 119,
+  196, 94, 116, 132, 90, 62, 88, 118, 77, 130,
+  101, 83, 96, 111, 129, 87, 67, 126, 91, 171,
+  89, 128, 102, 90, 75, 53, 60, 108, 95, 83,
+  86, 152, 96, 78, 104, 108, 124, 71, 95, 125,
+  109, 71, 96, 108, 143, 100, 148, 92, 39, 133,
+  143, 152, 91, 74, 88, 101, 92, 120, 102, 140,
+  58, 94, 66, 109, 100, 62, 78, 91, 90, 136,
+  71, 73, 165, 92, 164, 137, 150, 134, 96, 169,
+  83, 166, 120, 109, 73, 121, 92, 94, 105, 154,
+  181, 80, 114, 157, 126, 101, 73, 161, 92, 132,
+  84, 87, 152, 86, 135, 71, 103, 153, 86, 130,
+  77, 190, 158, 81, 142, 192, 145, 86, 104, 163,
+  113, 93, 98, 99, 90, 135, 78, 80, 167, 93,
+  56, 114, 105, 154, 120, 122, 115, 124, 125, 119,
+  81, 48, 115, 85, 120, 84, 97, 147, 88, 51,
+  144, 86, 98, 89, 136, 107, 104, 64, 177, 103,
+  92, 134, 107, 115, 145, 75, 115, 115, 59, 89,
+  131, 151, 83, 81, 85, 133, 121, 104, 122, 88,
+  108, 116, 95, 123, 80, 119, 92, 99, 39, 111,
+  103, 109, 169, 94, 102, 155, 130, 67, 75, 121,
+  75, 99, 143, 115, 93, 99, 116, 87, 69, 98,
+  80, 138, 99, 120, 60, 136, 103, 56, 81, 92,
+  100, 97, 106, 169, 72, 55, 83, 101, 105, 45,
+  84, 116, 108, 78, 98, 96, 133, 104, 139, 107,
+  44, 132, 101, 173, 93, 70, 96, 126, 98, 97,
+  111, 130, 45, 98, 96, 111, 147, 42, 96, 125,
+  79, 128, 72, 52, 142, 88, 112, 124, 155, 97,
+  78, 147, 89, 142, 131, 97, 111, 117, 83, 83,
+  123, 148, 186, 94, 97, 125, 142, 96, 86, 153,
+  111, 99, 64, 142, 118, 92, 112, 54, 99, 111,
+  82, 121, 85, 176, 85, 63, 118, 175, 136, 84,
+  86, 142, 80, 88, 76, 125, 87, 130, 94, 71,
+  142, 86, 42, 108, 92, 137, 121, 120, 119, 120,
+  139, 132, 71, 50, 127, 106, 139, 104, 77, 163,
+  94, 57, 163, 71, 102, 79, 133, 101, 103, 78,
+  149, 88, 77, 118, 109, 85, 157, 72, 98, 97,
+  72, 102, 156, 136, 93, 73, 79, 120, 75, 139,
+  113, 97, 137, 91, 63, 90, 63, 105, 90, 108,
+  34, 108, 102, 122, 165, 93, 78, 97, 106, 97,
+  64, 101, 76, 85, 112, 107, 117, 85, 107, 112,
+  56, 94, 57, 122, 82, 95, 34, 149, 79, 64,
+  63, 69, 99, 76, 154, 121, 70, 40, 99, 95,
+  134, 109, 95, 109, 114, 109, 129, 49, 127, 118,
+  126, 93, 96, 110, 97, 136, 71, 82, 65, 121,
+  83, 113, 100, 150, 36, 137, 101, 117, 138, 37,
+  78, 131, 81, 81, 87, 62, 158, 98, 109, 115,
+  146, 74, 68, 118, 105, 91, 108, 77, 90, 105,
+  82, 89, 137, 102, 194, 79, 105, 91, 147, 70,
+  65, 99, 118, 76, 84, 84, 152, 62, 87, 90,
+  106, 92, 75, 84, 82, 150, 95, 89, 97, 187,
+  102, 96, 101, 150, 66, 90, 77, 135, 85, 126,
+  79, 100, 161, 63, 49, 92, 74, 65, 91, 94,
+  69, 143, 94, 115, 77, 51, 106, 98, 126, 84,
+  91, 115, 88, 60, 102, 99, 104, 108, 100, 91,
+  99, 103, 111, 74, 90, 106, 89, 74, 140, 69,
+  112, 62, 61, 111, 149, 82, 109, 128, 63, 104,
+  51, 147, 103, 90, 119, 100, 50, 73, 46, 62,
+  83, 88, 34, 102, 103, 94, 138, 91, 72, 88,
+  57, 110, 57, 92, 87, 104, 104, 113, 87, 74,
+  100, 115, 57, 70, 54, 109, 79, 83, 30, 107,
+  57, 77, 59, 78, 94, 120, 176, 122, 87, 61,
+  116, 113, 110, 121, 96, 119, 118, 109, 117, 55,
+  113, 101, 116, 103, 106, 82, 96, 102, 75, 93,
+  79, 93, 64, 114, 115, 130, 30, 133, 87, 99,
+  93, 38, 81, 100, 107, 63, 101, 80, 120, 93,
+  97, 116, 114, 83, 67, 111, 120, 88, 108, 93,
+  102, 91, 74, 115, 155, 79, 164, 67, 103, 76,
+  153, 59, 59, 92, 92, 89, 105, 77, 126, 48,
+  121, 150, 80, 94, 63, 63, 89, 117, 109, 84,
+  96, 185, 93, 88, 88, 164, 72, 94, 56, 93,
+  58, 94, 79, 99, 129, 58, 65, 90, 104, 26,
+  73, 81, 99, 113, 57, 142, 76, 46, 71, 118,
+  110, 87, 68, 78, 90, 73, 97, 155, 112, 122,
+  91, 90, 103, 118, 76, 84, 97, 91, 96, 121,
+  109, 82, 98, 95, 48, 111, 106, 87, 103, 122,
+  73, 102, 89, 122, 79, 77, 92, 146, 68, 76,
+  81, 50, 95, 81, 38, 109, 124, 51, 82, 82,
+  89, 120, 48, 106, 77, 125, 77, 117, 122, 128,
+  83, 81, 97, 112, 50, 70, 100, 122, 96, 101,
+  51, 94, 95, 136, 71, 107, 135, 147, 128, 108,
+  107, 102, 93, 105, 72, 92, 95, 122, 103, 82,
+  98, 97, 88, 108, 111, 117, 73, 87, 56, 82,
+  103, 92, 117, 107, 41, 85, 117, 99, 48, 113,
+  101, 87, 74, 81, 92, 99, 148, 73, 118, 97,
+  83, 87, 95, 122, 97, 99, 49, 97, 149, 95,
+  99, 126, 99, 85, 88, 159, 132, 79, 108, 97,
+  82, 83, 129, 78, 45, 83, 99, 133, 101, 98,
+  116, 72, 148, 163, 66, 93, 94, 94, 109, 108,
+  91, 89, 76, 142, 128, 93, 69, 141, 76, 107,
+  66, 102, 34, 71, 103, 96, 78, 92, 102, 124,
+  119, 63, 59, 84, 132, 90, 83, 136, 68, 73,
+  62, 168, 111, 131, 37, 91, 107, 94, 106, 173,
+  85, 101, 102, 92, 90, 121, 52, 92, 95, 76,
+  122, 142, 92, 106, 94, 135, 105, 120, 89, 104,
+  104, 75, 85, 87, 128, 109, 100, 76, 89, 142,
+  82, 85, 106, 53, 85, 93, 47, 117, 124, 44,
+  76, 73, 118, 93, 78, 86, 114, 137, 82, 109,
+  111, 100, 92, 86, 108, 111, 77, 99, 106, 150,
+  103, 123, 98, 95, 82, 170, 81, 135, 123, 103,
+  108, 104, 141, 141, 102, 95, 84, 104, 117, 94,
+  102, 75, 118, 112, 83, 123, 117, 94, 77, 100,
+  44, 72, 124, 85, 131, 130, 69, 100, 98, 89,
+  86, 91, 107, 76, 83, 119, 113, 104, 194, 82,
+  110, 127, 93, 105, 108, 111, 121, 110, 63, 74,
+  154, 86, 107, 169, 72, 83, 121, 160, 121, 85,
+  87, 104, 78, 96, 96, 93, 63, 59, 75, 125,
+  113, 78, 112, 117, 112, 132, 93, 92, 167, 109,
+  127, 84, 80, 107, 65, 100, 122, 104, 79, 84,
+  80, 100, 104, 121, 64, 81, 52, 130, 72, 96,
+  123, 126, 117, 78, 60, 89, 136, 72, 133, 112,
+  78, 120, 63, 159, 113, 106, 45, 79, 120, 116,
+  104, 126, 71, 107, 88, 93, 88, 80, 81, 100,
+  97, 73, 127, 129, 97, 126, 175, 114, 163, 160,
+  108, 120, 140, 85, 124, 101, 126, 119, 117, 95,
+  109, 112, 86, 87, 123, 72, 135, 70, 46, 160,
+  89, 93, 116, 88, 120, 68, 114, 76, 129, 148,
+  105, 115, 102, 58, 98, 100, 133, 122, 110, 124,
+  96, 172, 110, 139, 130, 88, 85, 135, 124, 123,
+  122, 91, 101, 114, 116, 146, 97, 83, 111, 112,
+  117, 105, 114, 112, 90, 98, 95, 158, 140, 65,
+  102, 117, 78, 102, 153, 101, 131, 120, 91, 108,
+  83, 96, 93, 102, 111, 123, 83, 133, 129, 118,
+  167, 112, 94, 142, 106, 168, 110, 116, 131, 81,
+  102, 111, 151, 120, 126, 127, 92, 88, 144, 130,
+  115, 79, 119, 104, 120, 117, 92, 85, 79, 68,
+  109, 88, 140, 81, 152, 140, 73, 58, 151, 132,
+  154, 119, 124, 88, 92, 114, 91, 94, 95, 102,
+  120, 56, 106, 110, 149, 128, 101, 127, 66, 165,
+  95, 94, 129, 105, 102, 82, 77, 132, 107, 63,
+  137, 114, 84, 136, 91, 105, 113, 83, 83, 65,
+  103, 127, 113, 85, 77, 132, 77, 87, 64, 99,
+  101, 117, 116, 73, 200, 127, 100, 139, 105, 100,
+  124, 149, 96, 104, 147, 123, 114, 114, 103, 109,
+  114, 122, 118, 78, 65, 84, 121, 48, 111, 80,
+  38, 143, 122, 129, 121, 82, 82, 75, 107, 79,
+  107, 147, 105, 99, 102, 95, 82, 87, 129, 117,
+  119, 136, 97, 169, 79, 116, 136, 90, 91, 138,
+  163, 100, 108, 123, 77, 95, 106, 101, 113, 105,
+  87, 97, 125, 90, 123, 166, 108, 109, 99, 161,
+  126, 89, 119, 145, 121, 102, 123, 101, 128, 92,
+  87, 81, 116, 109, 85, 116, 94, 178, 85, 113,
+  124, 69, 94, 106, 120, 110, 112, 140, 104, 93,
+  120, 59, 119, 149, 127, 115, 143, 79, 83, 98,
+  140, 125, 88, 49, 109, 93, 154, 115, 96, 130,
+  69, 75, 134, 112, 108, 80, 129, 127, 78, 91,
+  183, 162, 93, 107, 98, 94, 117, 115, 118, 112,
+  82, 103, 136, 90, 87, 111, 112, 108, 98, 112,
+  52, 106, 90, 101, 126, 97, 84, 107, 86, 117,
+  71, 70, 103, 100, 70, 90, 98, 73, 102, 71,
+  99, 88, 82, 133, 101, 146, 84, 126, 74, 81,
+  92, 136, 92, 101, 109, 63, 178, 113, 99, 118,
+  94, 100, 93, 122, 68, 103, 127, 121, 112, 116,
+  116, 119, 94, 81, 106, 85, 69, 84, 140, 86,
+  109, 107, 74, 126, 206, 117, 105, 82, 92, 103,
+  70, 92, 125, 146, 103, 93, 147, 144, 115, 89,
+  117, 68, 115, 103, 105, 134, 70, 110, 144, 127,
+  94, 149, 148, 113, 140, 129, 110, 102, 127, 87,
+  99, 149, 92, 103, 145, 106, 104, 180, 86, 115,
+  90, 122, 106, 174, 182, 120, 145, 109, 120, 63,
+  142, 85, 113, 80, 164, 122, 88, 121, 78, 154,
+  108, 113, 137, 58, 102, 92, 116, 108, 101, 101,
+  121, 94, 123, 97, 108, 128, 104, 143, 136, 102,
+  91, 97, 121, 119, 88, 65, 92, 97, 111, 137,
+  112, 175, 77, 118, 98, 136, 121, 101, 84, 104,
+  113, 132, 130, 110, 131, 89, 109, 112, 97, 129,
+  149, 137, 109, 94, 115, 131, 94, 119, 86, 114,
+  87, 79, 83, 96, 80, 118, 132, 138, 124, 121,
+  115, 93, 105, 85, 96, 146, 70, 70, 116, 106,
+  93, 126, 116, 114, 88, 122, 99, 203, 102, 112,
+  120, 88, 144, 128, 90, 100, 87, 71, 104, 118,
+  153, 106, 97, 143, 109, 121, 98, 125, 114, 90,
+  112, 135, 107, 99, 124, 140, 117, 143, 128, 120,
+  135, 127, 127, 104, 80, 96, 140, 90, 101, 107,
+  137, 76, 135, 108, 126, 154, 104, 79, 132, 103,
+  118, 103, 109, 95, 106, 82, 91, 117, 152, 105,
+  87, 121, 92, 140, 107, 117, 130, 146, 113, 112,
+  117, 98, 124, 121, 129, 132, 109, 120, 122, 107,
+  119, 119, 118, 115, 121, 131, 141, 133, 87, 117,
+  115, 80, 82, 106, 88, 112, 116, 129, 97, 116,
+  121, 106, 108, 107, 103, 120, 102, 120, 129, 110,
+  135, 91, 114, 135, 135, 105, 105, 119, 120, 115,
+  134, 115, 84, 94, 104, 91, 119, 138, 111, 122,
+  93, 115, 98, 118, 92, 115, 89, 109, 126, 130,
+  96, 126, 95, 137, 130, 76, 124, 124, 136, 147,
+  103, 107, 108, 108, 134, 106, 108, 101, 108, 95,
+  76, 109, 113, 124, 61, 81, 101, 93, 90, 102,
+  90, 104, 144, 80, 101, 101, 119, 94, 109, 123,
+  123, 96, 116, 112, 69, 123, 115, 106, 104, 126,
+  87, 124, 106, 119, 129, 84, 111, 83, 84, 111,
+  94, 102, 180, 107, 118, 130, 96, 116, 125, 160,
+  124, 113, 98, 138, 91, 120, 100, 110, 119, 132,
+  113, 106, 125, 140, 123, 73, 59, 92, 34, 95,
+  128, 99, 108, 99, 123, 71, 114, 130, 66, 104,
+  132, 70, 111, 92, 105, 122, 104, 59, 75, 174,
+  102, 111, 92, 167, 58, 105, 88, 124, 140, 144,
+  85, 104, 94, 109, 118, 114, 119, 117, 105, 96,
+  105, 98, 94, 98, 117, 104, 129, 88, 103, 139,
+  95, 87, 97, 97, 100, 97, 78, 126, 104, 154,
+  92, 105, 129, 107, 98, 85, 102, 122, 119, 114,
+  108, 100, 156, 131, 142, 125, 159, 84, 102, 108,
+  87, 135, 136, 92, 71, 96, 90, 92, 111, 123,
+  105, 101, 108, 151, 95, 86, 75, 117, 70, 109,
+  102, 132, 155, 85, 111, 120, 130, 65, 147, 107,
+  125, 175, 100, 93, 115, 125, 130, 99, 120, 120,
+  116, 95, 114, 148, 114, 135, 83, 65, 114, 71,
+  62, 84, 138, 110, 117, 87, 120, 99, 99, 118,
+  91, 86, 112, 113, 86, 148, 94, 108, 88, 113,
+  93, 83, 87, 124, 94, 110, 114, 86, 119, 89,
+  89, 112, 91, 116, 158, 98, 160, 119, 96, 109,
+  145, 123, 116, 114, 87, 133, 99, 138, 115, 122,
+  108, 117, 126, 86, 106, 71, 121, 94, 62, 105,
+  32, 118, 152, 99, 92, 108, 99, 63, 97, 117,
+  67, 127, 125, 83, 94, 104, 112, 124, 87, 138,
+  72, 206, 99, 132, 102, 117, 65, 64, 85, 130,
+  119, 87, 78, 102, 85, 90, 111, 99, 101, 79,
+  109, 113, 116, 115, 91, 99, 104, 95, 130, 76,
+  85, 117, 94, 97, 108, 83, 125, 67, 111, 124,
+  107, 162, 96, 89, 93, 107, 93, 76, 108, 106,
+  106, 105, 118, 76, 158, 131, 165, 127, 157, 102,
+  106, 176, 73, 110, 118, 98, 82, 99, 92, 107,
+  104, 132, 104, 89, 111, 162, 112, 63, 65, 103,
+  83, 111, 117, 74, 176, 76, 110, 79, 130, 167,
+  109, 109, 82, 193, 126, 89, 129, 154, 125, 93,
+  132, 148, 122, 104, 59, 111, 99, 143, 106, 85,
+  131, 83, 64, 94, 105, 110, 87, 109, 117, 97,
+  115, 146, 89, 67, 94, 110, 74, 77, 141, 90,
+  91, 95, 112, 78, 83, 134, 110, 103, 89, 78,
+  90, 97, 96, 112, 83, 110, 159, 68, 73, 107,
+  80, 87, 121, 138, 93, 79, 64, 91, 64, 70,
+  75, 73, 109, 116, 116, 87, 83, 111, 114, 142,
+  40, 66, 25, 108, 147, 81, 105, 87, 117, 53,
+  88, 119, 63, 103, 113, 112, 66, 94, 99, 73,
+  91, 76, 61, 164, 84, 104, 88, 114, 56, 80,
+  88, 96, 88, 79, 81, 106, 103, 54, 110, 115,
+  68, 68, 92, 95, 93, 87, 72, 87, 55, 78,
+  97, 152, 92, 105, 64, 112, 86, 72, 120, 72,
+  74, 76, 84, 134, 55, 85, 103, 102, 89, 74,
+  109, 98, 119, 88, 88, 56, 121, 84, 107, 109,
+  152, 66, 72, 143, 76, 112, 123, 80, 62, 106,
+  62, 100, 100, 113, 82, 92, 105, 126, 107, 86,
+  48, 92, 78, 101, 60, 101, 88, 94, 95, 100,
+  124, 150, 84, 103, 96, 169, 81, 85, 107, 129,
+  102, 79, 106, 118, 98, 95, 27, 92, 79, 86,
+  53, 52, 96, 71, 37, 116, 59, 100, 86, 66,
+  108, 99, 120, 108, 89, 65, 89, 133, 87, 107,
+  98, 70, 88, 89, 150, 79, 77, 130, 76, 93,
+  76, 75, 57, 74, 103, 99, 71, 91, 175, 84,
+  131, 87, 137, 115, 132, 143, 101, 88, 83, 108,
+  74, 91, 108, 75, 114, 111, 135, 111, 88, 106,
+  109, 82, 48, 106, 70, 115, 167, 100, 108, 82,
+  109, 109, 110, 106, 88, 77, 83, 101, 121, 121,
+  129, 73, 104, 74, 54, 148, 97, 92, 93, 144,
+  66, 78, 86, 95, 110, 81, 121, 93, 92, 77,
+  125, 106, 127, 118, 84, 134, 98, 103, 109, 72,
+  83, 116, 124, 106, 102, 108, 118, 100, 92, 78,
+  89, 89, 64, 95, 91, 148, 73, 95, 121, 76,
+  112, 82, 72, 109, 108, 97, 110, 103, 145, 129,
+  126, 136, 129, 100, 103, 47, 99, 110, 115, 80,
+  84, 112, 77, 88, 96, 100, 131, 92, 103, 118,
+  117, 78, 78, 92, 101, 97, 114, 95, 144, 108,
+  83, 79, 120, 90, 139, 113, 107, 154, 113, 113,
+  105, 110, 83, 96, 119, 101, 98, 112, 106, 117,
+  106, 136, 64, 125, 125, 77, 62, 91, 77, 54,
+  88, 98, 90, 99, 108, 100, 120, 102, 105, 110,
+  89, 94, 111, 85, 94, 91, 116, 86, 79, 145,
+  80, 73, 67, 90, 70, 79, 117, 118, 82, 89,
+  152, 74, 89, 97, 119, 122, 143, 119, 122, 119,
+  91, 104, 83, 107, 109, 95, 112, 124, 108, 92,
+  86, 90, 95, 88, 49, 119, 74, 131, 145, 100,
+  101, 91, 97, 108, 78, 98, 79, 85, 82, 104,
+  103, 130, 132, 90, 108, 83, 66, 123, 114, 106,
+  89, 117, 63, 93, 86, 83, 105, 100, 132, 87,
+  90, 81, 171, 118, 142, 142, 98, 134, 106, 101,
+  99, 56, 110, 129, 133, 78, 96, 103, 153, 110,
+  84, 85, 67, 75, 75, 124, 91, 154, 83, 94,
+  97, 118, 99, 93, 89, 94, 66, 108, 106, 118,
+  150, 124, 115, 143, 128, 103, 109, 115, 106, 101,
+  110, 95, 67, 111, 79, 78, 98, 85, 123, 86,
+  142, 91, 132, 104, 82, 109, 102, 99, 106, 127,
+  149, 94, 98, 98, 104, 84, 130, 103, 113, 107,
+  133, 107, 109, 115, 98, 106, 114, 94, 83, 96,
+  108, 109, 110, 131, 64, 106, 109, 80, 65, 73,
+  92, 68, 98, 94, 85, 87, 90, 112, 112, 94,
+  113, 93, 73, 82, 95, 110, 99, 86, 107, 110,
+  84, 118, 82, 82, 80, 113, 81, 89, 110, 134,
+  107, 112, 111, 55, 114, 101, 79, 89, 140, 93,
+  110, 132, 87, 87, 93, 112, 108, 89, 96, 132,
+  86, 67, 91, 86, 78, 95, 59, 93, 87, 122,
+  109, 87, 87, 104, 67, 84, 54, 107, 68, 88,
+  126, 112, 85, 118, 119, 84, 87, 92, 90, 110,
+  117, 116, 81, 126, 64, 103, 87, 77, 127, 116,
+  116, 99, 87, 91, 136, 134, 70, 87, 91, 120,
+  107, 129, 81, 53, 135, 114, 126, 94, 84, 100,
+  180, 117, 91, 82, 100, 74, 87, 121, 106, 128,
+  79, 108, 106, 143, 91, 96, 97, 85, 75, 103,
+  93, 109, 103, 101, 93, 117, 116, 143, 102, 132,
+  125, 138, 99, 92, 86, 116, 89, 89, 104, 78,
+  96, 83, 128, 71, 145, 87, 68, 94, 114, 99,
+  86, 107, 129, 86, 128, 114, 101, 98, 119, 91,
+  86, 84, 130, 103, 111, 133, 110, 93, 91, 104,
+  92, 109, 69, 125, 77, 100, 115, 68, 77, 106,
+  78, 89, 137, 87, 89, 85, 124, 98, 83, 173,
+  65, 77, 126, 111, 67, 102, 69, 125, 110, 98,
+  117, 143, 92, 87, 110, 74, 86, 134, 71, 111,
+  74, 119, 108, 127, 101, 62, 107, 91, 100, 82,
+  122, 128, 101, 112, 86, 83, 97, 112, 130, 83,
+  91, 114, 99, 80, 114, 109, 82, 90, 68, 105,
+  77, 115, 99, 85, 116, 117, 109, 74, 70, 122,
+  90, 81, 172, 126, 84, 108, 121, 67, 82, 97,
+  108, 95, 125, 124, 90, 134, 83, 130, 89, 116,
+  132, 88, 105, 116, 91, 104, 95, 106, 81, 94,
+  82, 134, 91, 108, 73, 72, 140, 110, 132, 121,
+  71, 123, 120, 116, 103, 87, 120, 98, 75, 80,
+  100, 99, 83, 128, 102, 106, 98, 113, 93, 124,
+  117, 109, 96, 130, 97, 111, 94, 111, 104, 140,
+  100, 94, 115, 150, 109, 106, 76, 123, 96, 92,
+  99, 102, 94, 100, 111, 72, 121, 111, 83, 93,
+  122, 92, 98, 87, 93, 113, 143, 102, 121, 125,
+  123, 106, 87, 77, 95, 114, 123, 119, 116, 80,
+  83, 77, 97, 103, 83, 123, 78, 108, 124, 82,
+  81, 130, 85, 129, 82, 85, 98, 70, 123, 122,
+  120, 125, 68, 95, 120, 116, 88, 119, 45, 112,
+  105, 102, 117, 140, 95, 81, 133, 81, 97, 106,
+  82, 95, 68, 113, 116, 110, 130, 84, 93, 86,
+  149, 123, 136, 141, 113, 97, 85, 96, 112, 113,
+  127, 94, 98, 88, 125, 101, 110, 90, 101, 88,
+  75, 142, 74, 100, 120, 101, 144, 106, 117, 93,
+  100, 101, 93, 97, 114, 90, 94, 109, 130, 83,
+  112, 97, 96, 117, 128, 138, 102, 123, 70, 133,
+  73, 129, 109, 97, 114, 91, 116, 115, 108, 85,
+  124, 140, 103, 108, 84, 97, 86, 88, 131, 116,
+  140, 97, 104, 118, 81, 89, 99, 103, 68, 90,
+  71, 91, 82, 128, 92, 106, 97, 92, 98, 115,
+  67, 133, 136, 106, 119, 154, 140, 91, 118, 115,
+  108, 104, 127, 74, 123, 106, 117, 107, 55, 131,
+  108, 75, 87, 100, 105, 107, 121, 93, 114, 92,
+  111, 77, 95, 83, 118, 65, 101, 130, 104, 92,
+  111, 112, 128, 93, 96, 66, 86, 112, 106, 109,
+  101, 104, 90, 60, 114, 97, 132, 124, 112, 140,
+  71, 103, 106, 103, 90, 116, 37, 81, 96, 88,
+  102, 117, 131, 96, 109, 121, 108, 88, 79, 102,
+  84, 98, 95, 103, 100, 110, 87, 94, 117, 97,
+  87, 82, 98, 95, 86, 135, 110, 97, 140, 101,
+  84, 106, 156, 136, 146, 124, 133, 110, 91, 118,
+  111, 110, 128, 106, 102, 89, 131, 111, 100, 84,
+  116, 88, 58, 163, 84, 113, 138, 96, 126, 86,
+  98, 104, 96, 91, 93, 110, 80, 75, 92, 120,
+  141, 71, 151, 108, 78, 143, 124, 140, 95, 106,
+  74, 107, 79, 110, 98, 103, 90, 98, 115, 103,
+  101, 78, 132, 133, 116, 111, 77, 98, 82, 103,
+  136, 140, 128, 88, 114, 107, 104, 94, 115, 121,
+  42, 82, 83, 109, 74, 147, 87, 83, 114, 111,
+  95, 104, 79, 104, 113, 113, 117, 161, 169, 91,
+  125, 135, 120, 101, 146, 98, 133, 112, 116, 93,
+  86, 137, 103, 77, 75, 91, 119, 88, 125, 126,
+  120, 82, 113, 85, 103, 96, 114, 89, 108, 117,
+  74, 77, 106, 98, 125, 95, 109, 80, 88, 129,
+  109, 106, 97, 119, 111, 63, 122, 105, 143, 142,
+  126, 167, 57, 102, 119, 83, 91, 104, 81, 95,
+  99, 113, 99, 113, 126, 99, 118, 119, 106, 93,
+  66, 75, 115, 96, 82, 94, 118, 108, 79, 103,
+  95, 99, 76, 100, 89, 99, 104, 144, 124, 120,
+  134, 103, 89, 119, 136, 129, 140, 95, 122, 114,
+  112, 119, 111, 111, 125, 111, 113, 105, 127, 103,
+  90, 70, 109, 85, 53, 138, 89, 113, 126, 84,
+  116, 79, 90, 97, 96, 92, 93, 112, 78, 88,
+  85, 116, 146, 62, 158, 112, 84, 144, 118, 144,
+  88, 106, 73, 101, 99, 96, 110, 115, 80, 102,
+  102, 100, 92, 101, 90, 115, 109, 109, 72, 110,
+  64, 92, 119, 139, 109, 100, 115, 110, 113, 100,
+  120, 118, 67, 91, 106, 101, 80, 143, 75, 88,
+  93, 142, 87, 100, 84, 94, 83, 106, 132, 128,
+  158, 89, 112, 143, 115, 97, 147, 117, 149, 131,
+  120, 84, 106, 137, 101, 87, 74, 89, 118, 87,
+  126, 132, 132, 104, 86, 80, 120, 111, 116, 85,
+  101, 108, 76, 82, 121, 111, 118, 94, 105, 83,
+  79, 141, 112, 121, 99, 115, 100, 84, 128, 113,
+  124, 137, 116, 147, 54, 98, 106, 83, 97, 108,
+  91, 100, 100, 124, 93, 104, 117, 109, 92, 105,
+  106, 104, 77, 59, 111, 103, 92, 102, 127, 131,
+  80, 115, 87, 106, 77, 132, 77, 102, 100, 125,
+  108, 115, 129, 94, 94, 117, 116, 119, 103, 82,
+  99, 100, 115, 109, 107, 110, 116, 100, 114, 118,
+  114, 95, 86, 67, 116, 84, 46, 110, 98, 101,
+  105, 68, 109, 74, 102, 87, 94, 88, 98, 101,
+  82, 105, 77, 101, 141, 53, 151, 98, 89, 145,
+  111, 135, 85, 144, 68, 100, 103, 89, 112, 138,
+  67, 94, 103, 101, 101, 112, 63, 94, 98, 118,
+  65, 123, 62, 89, 102, 118, 98, 104, 108, 113,
+  107, 81, 106, 116, 81, 88, 95, 84, 81, 125,
+  75, 97, 85, 140, 90, 93, 77, 84, 88, 87,
+  130, 103, 126, 76, 100, 152, 102, 91, 135, 96,
+  160, 135, 118, 77, 97, 127, 97, 100, 74, 88,
+  100, 96, 121, 126, 128, 122, 60, 70, 116, 104,
+  103, 85, 85, 91, 92, 100, 122, 112, 113, 91,
+  105, 82, 88, 141, 124, 128, 102, 102, 82, 106,
+  133, 113, 111, 116, 91, 113, 50, 80, 87, 81,
+  103, 123, 94, 112, 86, 109, 102, 106, 109, 111,
+  71, 88, 108, 119, 83, 76, 88, 101, 106, 103,
+  115, 145, 85, 124, 88, 91, 89, 137, 64, 98,
+  98, 110, 78, 127, 116, 92, 94, 122, 129, 127,
+  79, 92, 87, 104, 114, 113, 115, 125, 102, 105,
+  101, 124, 123, 107, 96, 68, 123, 91, 47, 123,
+  97, 88, 102, 68, 110, 63, 121, 84, 98, 84,
+  102, 94, 85, 107, 77, 100, 128, 55, 142, 106,
+  101, 151, 104, 132, 103, 160, 68, 108, 100, 110,
+  102, 126, 68, 105, 109, 103, 102, 113, 68, 91,
+  106, 155, 66, 125, 64, 96, 98, 103, 101, 104,
+  104, 120, 104, 56, 98, 123, 101, 94, 89, 96,
+  86, 124, 86, 94, 101, 118, 93, 92, 79, 82,
+  100, 82, 134, 99, 103, 90, 96, 140, 95, 88,
+  122, 75, 153, 120, 114, 103, 103, 118, 111, 104,
+  70, 72, 92, 95, 102, 129, 117, 124, 53, 53,
+  92, 95, 104, 70, 82, 97, 89, 98, 116, 103,
+  124, 95, 111, 71, 92, 150, 125, 118, 103, 98,
+  88, 127, 133, 110, 109, 137, 81, 102, 57, 73,
+  90, 90, 123, 131, 97, 114, 91, 94, 103, 104,
+  103, 119, 78, 61, 102, 126, 67, 85, 101, 107,
+  103, 108, 91, 147, 89, 116, 104, 89, 90, 113,
+  66, 96, 100, 117, 70, 127, 113, 92, 84, 124,
+  149, 147, 80, 113, 93, 107, 102, 117, 109, 148,
+  106, 129, 79, 119, 122, 116, 101, 73, 110, 86,
+  40, 158, 97, 112, 100, 73, 129, 57, 125, 92,
+  102, 74, 101, 102, 84, 99, 86, 108, 117, 69,
+  133, 124, 109, 141, 107, 127, 123, 137, 63, 105,
+  105, 152, 95, 102, 92, 139, 101, 115, 102, 109,
+  93, 100, 112, 175, 74, 114, 63, 97, 111, 106,
+  108, 109, 104, 138, 113, 65, 97, 133, 103, 118,
+  107, 94, 98, 146, 102, 78, 105, 107, 84, 91,
+  76, 115, 91, 101, 149, 117, 96, 100, 110, 127,
+  94, 85, 117, 84, 147, 125, 115, 124, 111, 116,
+  126, 104, 78, 84, 85, 92, 101, 142, 109, 118,
+  52, 54, 71, 106, 110, 64, 77, 99, 60, 80,
+  115, 97, 97, 113, 100, 52, 87, 140, 119, 111,
+  108, 101, 99, 135, 119, 114, 117, 143, 88, 122,
+  68, 88, 89, 90, 148, 127, 89, 90, 99, 88,
+  97, 101, 100, 100, 98, 36, 86, 110, 53, 73,
+  113, 93, 81, 117, 91, 143, 90, 117, 118, 89,
+  85, 86, 73, 107, 103, 138, 66, 106, 118, 95,
+  84, 109, 155, 168, 92, 110, 92, 94, 87, 116,
+  116, 173, 105, 145, 66, 108, 95, 117, 100, 69,
+  112, 82, 38, 172, 102, 134, 95, 82, 161, 81,
+  95, 108, 117, 68, 108, 116, 90, 71, 94, 111,
+  104, 93, 108, 132, 110, 122, 116, 115, 124, 116,
+  55, 85, 102, 191, 89, 103, 116, 143, 104, 124,
+  108, 101, 125, 135, 126, 144, 98, 112, 63, 104,
+  120, 103, 126, 103, 104, 142, 113, 79, 95, 134,
+  71, 123, 134, 111, 101, 173, 117, 72, 89, 103,
+  87, 90, 62, 145, 90, 113, 164, 120, 111, 99,
+  135, 120, 92, 94, 116, 89, 127, 132, 110, 132,
+  84, 111, 126, 105, 92, 111, 75, 80, 104, 148,
+  99, 115, 43, 70, 55, 114, 140, 62, 87, 90,
+  62, 76, 100, 76, 63, 118, 86, 41, 92, 111,
+  108, 104, 99, 105, 99, 145, 103, 108, 122, 125,
+  94, 145, 50, 129, 101, 77, 144, 107, 89, 61,
+  84, 92, 94, 95, 93, 74, 120, 38, 68, 105,
+  50, 54, 125, 62, 73, 126, 89, 126, 87, 137,
+  124, 80, 78, 72, 74, 108, 109, 147, 47, 108,
+  124, 103, 103, 88, 131, 157, 98, 73, 77, 59,
+  88, 97, 154, 182, 102, 158, 82, 101, 82, 93,
+  90, 58, 116, 91, 34, 154, 102, 129, 85, 86,
+  148, 98, 70, 112, 124, 73, 115, 117, 103, 60,
+  84, 92, 99, 109, 92, 138, 102, 105, 102, 113,
+  122, 79, 61, 53, 97, 221, 86, 116, 147, 137,
+  95, 125, 92, 95, 109, 144, 133, 106, 135, 119,
+  76, 94, 98, 93, 116, 90, 99, 123, 87, 78,
+  116, 116, 101, 109, 182, 125, 105, 162, 107, 58,
+  77, 99, 98, 93, 73, 128, 104, 100, 162, 99,
+  106, 131, 140, 123, 86, 91, 101, 132, 99, 99,
+  110, 157, 86, 103, 104, 106, 106, 129, 67, 73,
+  96, 136, 104, 111, 30, 111, 51, 124, 160, 89,
+  114, 82, 68, 53, 90, 108, 52, 102, 78, 51,
+  101, 93, 110, 105, 90, 97, 93, 162, 87, 114,
+  81, 83, 82, 140, 71, 162, 99, 74, 126, 86,
+  102, 52, 66, 97, 97, 92, 105, 81, 121, 58,
+  62, 110, 53, 45, 122, 46, 85, 125, 87, 101,
+  88, 145, 126, 57, 81, 64, 67, 91, 104, 124,
+  44, 119, 117, 100, 94, 83, 80, 107, 74, 73,
+  47, 44, 99, 85, 173, 136, 92, 149, 101, 104,
+  63, 73, 86, 63, 109, 160, 15, 92, 100, 90,
+  79, 59, 95, 96, 96, 102, 129, 99, 100, 79,
+  113, 68, 62, 57, 92, 108, 72, 97, 85, 108,
+  83, 84, 100, 58, 66, 44, 88, 174, 81, 123,
+  132, 111, 106, 84, 93, 109, 56, 107, 131, 98,
+  174, 143, 80, 79, 80, 89, 85, 103, 86, 97,
+  80, 79, 119, 90, 141, 86, 145, 102, 108, 129,
+  68, 57, 92, 93, 112, 83, 122, 113, 104, 85,
+  139, 54, 91, 115, 103, 120, 72, 58, 75, 162,
+  91, 93, 106, 154, 86, 92, 70, 101, 107, 106,
+  67, 84, 79, 101, 106, 114, 11, 131, 51, 110,
+  126, 138, 119, 67, 60, 61, 94, 151, 60, 75,
+  88, 81, 90, 104, 116, 108, 91, 78, 64, 175,
+  72, 113, 39, 65, 45, 97, 81, 128, 71, 83,
+  96, 68, 106, 74, 54, 72, 95, 93, 117, 125,
+  97, 65, 88, 93, 59, 71, 107, 67, 109, 118,
+  84, 99, 85, 129, 114, 49, 92, 61, 48, 66,
+  93, 90, 27, 97, 117, 88, 67, 89, 53, 88,
+  65, 130, 40, 78, 90, 100, 111, 87, 68, 99,
+  136, 111, 60, 69, 89, 128, 92, 177, 8, 47,
+  84, 60, 109, 60, 61, 72, 127, 83, 102, 115,
+  73, 53, 111, 60, 82, 40, 104, 105, 56, 34,
+  66, 125, 94, 82, 53, 97, 74, 33, 78, 90,
+  104, 107, 84, 79, 114, 47, 111, 129, 50, 78,
+  92, 89, 155, 156, 78, 83, 69, 83, 85, 105,
+  86, 63, 77, 89, 91, 81, 124, 111, 50, 83,
+  103, 118, 37, 100, 109, 88, 138, 47, 146, 111,
+  110, 81, 100, 38, 101, 72, 104, 114, 71, 33,
+  62, 98, 110, 94, 109, 98, 58, 90, 53, 89,
+  113, 77, 92, 88, 99, 97, 121, 97, 16, 100,
+  70, 88, 84, 152, 122, 57, 59, 100, 98, 95,
+  78, 75, 106, 104, 47, 96, 112, 131, 109, 71,
+  55, 167, 61, 103, 53, 103, 39, 68, 60, 68,
+  82, 88, 60, 70, 114, 96, 54, 75, 88, 102,
+  99, 133, 67, 60, 126, 82, 77, 115, 98, 76,
+  100, 112, 92, 87, 72, 108, 79, 60, 86, 66,
+  64, 58, 99, 68, 32, 60, 126, 86, 103, 94,
+  72, 122, 128, 131, 76, 106, 79, 147, 75, 134,
+  67, 74, 162, 97, 60, 94, 92, 140, 97, 89,
+  26, 86, 76, 90, 192, 93, 75, 62, 92, 75,
+  98, 112, 67, 100, 87, 53, 116, 76, 141, 110,
+  44, 81, 62, 163, 105, 131, 56, 122, 75, 27,
+  78, 81, 145, 88, 90, 79, 68, 60, 101, 121,
+  110, 89, 84, 107, 116, 123, 106, 79, 103, 104,
+  123, 71, 90, 91, 83, 99, 85, 85, 126, 133,
+  37, 114, 112, 159, 52, 160, 83, 111, 126, 58,
+  117, 107, 120, 95, 75, 58, 154, 120, 188, 119,
+  106, 72, 83, 87, 85, 92, 110, 85, 66, 99,
+  81, 93, 121, 81, 197, 85, 94, 162, 129, 69,
+  45, 96, 95, 94, 96, 105, 184, 66, 81, 70,
+  134, 96, 106, 106, 114, 150, 109, 94, 123, 215,
+  145, 80, 89, 167, 84, 113, 111, 120, 67, 99,
+  128, 86, 168, 89, 73, 90, 130, 97, 73, 134,
+  84, 105, 82, 115, 77, 70, 118, 72, 121, 109,
+  110, 82, 71, 90, 89, 88, 80, 102, 88, 73,
+  73, 67, 114, 85, 113, 99, 86, 86, 128, 107,
+  110, 117, 60, 123, 149, 92, 90, 111, 73, 161,
+  95, 132, 97, 97, 173, 99, 76, 125, 106, 61,
+  93, 101, 31, 106, 82, 83, 197, 99, 99, 90,
+  73, 75, 103, 110, 73, 158, 93, 92, 92, 95,
+  140, 97, 48, 147, 59, 152, 110, 151, 61, 91,
+  82, 50, 72, 81, 112, 100, 94, 112, 103, 52,
+  98, 98, 126, 86, 111, 127, 99, 103, 117, 115,
+  133, 108, 151, 93, 58, 97, 109, 139, 88, 69,
+  98, 98, 67, 124, 101, 154, 47, 136, 49, 128,
+  106, 70, 78, 73, 105, 114, 81, 59, 153, 103,
+  177, 117, 142, 107, 87, 171, 95, 117, 111, 75,
+  77, 110, 110, 102, 119, 104, 216, 82, 80, 159,
+  127, 98, 58, 132, 123, 115, 86, 79, 157, 91,
+  116, 83, 126, 149, 85, 107, 124, 170, 172, 89,
+  135, 227, 163, 88, 103, 156, 95, 113, 87, 98,
+  87, 111, 107, 72, 176, 88, 72, 119, 108, 131,
+  105, 151, 101, 99, 102, 115, 78, 76, 108, 90,
+  151, 76, 109, 127, 60, 71, 96, 118, 87, 83,
+  91, 106, 92, 89, 132, 81, 100, 121, 109, 111,
+  117, 140, 120, 119, 43, 96, 117, 126, 75, 86,
+  56, 128, 136, 93, 112, 115, 196, 136, 69, 114,
+  99, 66, 77, 85, 21, 87, 75, 53, 128, 87,
+  84, 144, 105, 76, 84, 129, 75, 116, 122, 110,
+  92, 66, 114, 91, 52, 127, 85, 101, 101, 129,
+  33, 147, 103, 78, 96, 77, 101, 134, 91, 118,
+  86, 44, 95, 108, 82, 59, 111, 108, 112, 122,
+  98, 105, 113, 104, 137, 112, 54, 88, 140, 143,
+  89, 70, 88, 95, 110, 85, 91, 121, 36, 112,
+  87, 146, 109, 64, 82, 81, 98, 113, 100, 28,
+  121, 81, 105, 112, 147, 88, 69, 152, 102, 90,
+  120, 76, 90, 101, 104, 87, 131, 123, 169, 108,
+  77, 109, 134, 123, 64, 156, 103, 113, 61, 107,
+  116, 95, 108, 106, 106, 87, 69, 83, 141, 147,
+  122, 76, 114, 172, 148, 97, 67, 138, 70, 109,
+  56, 107, 67, 94, 89, 67, 108, 96, 56, 113,
+  97, 133, 111, 118, 104, 92, 123, 124, 62, 90,
+  114, 116, 158, 82, 83, 146, 92, 87, 100, 134,
+  92, 75, 94, 102, 107, 115, 120, 60, 84, 90,
+  104, 92, 107, 112, 111, 104, 56, 76, 108, 131,
+  66, 90, 49, 97, 119, 110, 114, 120, 150, 145,
+  46, 77, 73, 89, 48, 125, 23, 85, 107, 69,
+  88, 61, 43, 94, 108, 106, 64, 116, 73, 94,
+  138, 96, 118, 43, 94, 129, 46, 115, 111, 80,
+  78, 99, 15, 172, 92, 89, 84, 84, 109, 114,
+  112, 82, 92, 45, 85, 125, 78, 64, 105, 101,
+  128, 176, 119, 52, 110, 101, 113, 90, 69, 70,
+  146, 102, 84, 85, 89, 119, 106, 82, 86, 112,
+  36, 137, 124, 138, 135, 52, 91, 133, 99, 81,
+  92, 36, 122, 81, 87, 121, 129, 70, 70, 113,
+  108, 87, 97, 102, 77, 74, 78, 104, 125, 102,
+  123, 117, 91, 80, 142, 120, 47, 112, 72, 86,
+  74, 110, 142, 36, 111, 146, 79, 70, 92, 59,
+  118, 122, 81, 89, 110, 170, 122, 113, 49, 158,
+  66, 117, 44, 135, 56, 90, 94, 84, 84, 102,
+  82, 101, 83, 99, 78, 62, 85, 105, 89, 164,
+  55, 66, 117, 102, 116, 78, 94, 138, 148, 104,
+  49, 163, 97, 86, 118, 100, 119, 147, 92, 66,
+  87, 73, 85, 70, 107, 69, 113, 64, 47, 81,
+  94, 106, 80, 126, 50, 74, 77, 119, 98, 92,
+  114, 134, 40, 51, 54, 95, 74, 135, 27, 63,
+  96, 87, 88, 75, 56, 85, 70, 105, 53, 122,
+  85, 108, 151, 108, 90, 50, 95, 131, 51, 76,
+  123, 86, 106, 97, 20, 126, 88, 90, 65, 88,
+  110, 106, 126, 94, 90, 76, 103, 115, 64, 75,
+  67, 113, 119, 145, 101, 53, 84, 102, 101, 104,
+  81, 87, 87, 97, 99, 90, 112, 103, 54, 91,
+  96, 94, 38, 171, 134, 99, 112, 59, 117, 144,
+  141, 93, 65, 52, 91, 73, 84, 113, 95, 88,
+  54, 94, 93, 128, 98, 98, 65, 63, 67, 116,
+  140, 82, 97, 100, 101, 69, 124, 95, 37, 88,
+  76, 72, 85, 106, 113, 31, 138, 169, 79, 92,
+  83, 73, 86, 100, 62, 88, 111, 159, 119, 80,
+  38, 166, 77, 118, 44, 124, 37, 66, 97, 88,
+  70, 105, 84, 122, 89, 61, 65, 65, 109, 115,
+  70, 144, 44, 57, 99, 136, 105, 106, 78, 89,
+  154, 123, 74, 172, 97, 101, 120, 92, 109, 147,
+  57, 91, 91, 60, 94, 93, 119, 63, 88, 91,
+  93, 116, 100, 123, 100, 95, 67, 91, 71, 117,
+  90, 64, 85, 117, 78, 72, 87, 91, 98, 92,
+  34, 122, 107, 83, 93, 94, 114, 112, 66, 104,
+  109, 139, 78, 103, 126, 93, 99, 90, 105, 114,
+  68, 69, 130, 132, 142, 127, 79, 111, 107, 147,
+  73, 126, 136, 104, 120, 92, 107, 126, 110, 97,
+  91, 101, 86, 126, 99, 93, 97, 92, 81, 134,
+  126, 117, 78, 115, 46, 87, 134, 86, 151, 100,
+  21, 104, 103, 90, 64, 150, 138, 81, 96, 104,
+  114, 144, 185, 114, 99, 114, 92, 105, 114, 112,
+  77, 130, 59, 63, 114, 91, 100, 126, 68, 75,
+  97, 128, 134, 80, 109, 115, 81, 86, 90, 102,
+  55, 72, 72, 75, 105, 84, 113, 94, 128, 138,
+  104, 97, 118, 114, 105, 87, 90, 107, 90, 119,
+  117, 87, 63, 102, 72, 111, 107, 125, 60, 86,
+  79, 122, 72, 103, 110, 135, 98, 71, 78, 108,
+  145, 102, 94, 114, 63, 104, 88, 167, 122, 142,
+  47, 77, 123, 136, 87, 152, 76, 112, 110, 100,
+  105, 100, 68, 112, 101, 84, 112, 114, 114, 98,
+  173, 107, 161, 161, 117, 118, 128, 79, 116, 114,
+  108, 122, 112, 82, 93, 100, 105, 91, 117, 56,
+  143, 68, 42, 163, 109, 95, 122, 99, 140, 105,
+  81, 97, 147, 136, 106, 117, 103, 42, 94, 102,
+  130, 118, 102, 110, 102, 183, 139, 155, 128, 87,
+  84, 141, 95, 127, 111, 106, 113, 111, 119, 150,
+  113, 76, 117, 129, 122, 106, 107, 101, 98, 113,
+  99, 155, 148, 63, 94, 122, 78, 93, 159, 93,
+  141, 104, 60, 124, 101, 111, 95, 113, 111, 99,
+  89, 127, 110, 130, 166, 131, 108, 150, 119, 146,
+  133, 117, 109, 111, 97, 92, 135, 98, 119, 123,
+  71, 87, 144, 126, 131, 87, 128, 103, 108, 111,
+  89, 92, 79, 57, 83, 88, 143, 68, 142, 141,
+  90, 61, 137, 123, 146, 122, 103, 83, 105, 116,
+  101, 106, 87, 105, 105, 59, 114, 102, 156, 129,
+  100, 139, 59, 158, 102, 92, 129, 102, 97, 81,
+  94, 137, 119, 83, 110, 123, 82, 135, 89, 111,
+  118, 73, 82, 69, 105, 145, 105, 91, 75, 134,
+  88, 99, 63, 85, 106, 139, 116, 95, 170, 124,
+  109, 124, 101, 102, 137, 151, 103, 117, 139, 110,
+  107, 115, 89, 100, 110, 106, 120, 84, 78, 87,
+  120, 58, 122, 95, 32, 132, 88, 124, 119, 89,
+  96, 81, 115, 70, 115, 133, 115, 105, 108, 78,
+  67, 94, 138, 108, 125, 138, 89, 181, 97, 124,
+  128, 99, 88, 121, 133, 91, 102, 125, 79, 103,
+  99, 107, 114, 95, 85, 94, 109, 88, 125, 141,
+  87, 104, 94, 152, 134, 83, 105, 144, 116, 106,
+  144, 94, 132, 87, 63, 94, 98, 107, 80, 103,
+  99, 156, 95, 122, 110, 95, 116, 116, 104, 116,
+  107, 146, 103, 100, 118, 62, 108, 136, 117, 111,
+  128, 66, 76, 96, 135, 116, 105, 62, 117, 91,
+  143, 106, 108, 112, 68, 78, 126, 107, 115, 91,
+  110, 131, 80, 77, 188, 166, 92, 111, 102, 84,
+  98, 113, 118, 109, 81, 92, 132, 83, 94, 107,
+  117, 108, 88, 114, 49, 122, 92, 90, 112, 100,
+  81, 102, 87, 119, 80, 80, 116, 91, 64, 106,
+  93, 76, 102, 68, 98, 68, 85, 140, 111, 118,
+  79, 138, 68, 84, 78, 117, 95, 109, 107, 64,
+  174, 121, 97, 128, 126, 107, 80, 134, 75, 122,
+  123, 128, 106, 117, 98, 117, 99, 114, 103, 86,
+  56, 85, 116, 39, 102, 85, 41, 128, 131, 115,
+  105, 73, 77, 96, 123, 88, 128, 113, 111, 74,
+  116, 122, 74, 77, 121, 91, 109, 123, 98, 173,
+  84, 118, 133, 125, 99, 139, 152, 103, 120, 121,
+  83, 95, 108, 89, 113, 143, 70, 87, 117, 90,
+  121, 165, 108, 107, 98, 122, 112, 116, 116, 122,
+  134, 75, 107, 88, 140, 83, 77, 70, 133, 124,
+  81, 108, 94, 160, 92, 92, 110, 73, 99, 81,
+  128, 95, 110, 124, 107, 85, 111, 65, 107, 124,
+  115, 92, 140, 87, 96, 99, 123, 127, 81, 56,
+  87, 82, 140, 133, 113, 146, 50, 75, 117, 123,
+  97, 60, 106, 93, 96, 118, 146, 131, 99, 93,
+  92, 106, 100, 128, 126, 134, 89, 98, 138, 140,
+  94, 104, 77, 112, 64, 87, 52, 87, 79, 110,
+  114, 103, 92, 122, 91, 95, 110, 67, 91, 135,
+  54, 48, 109, 73, 78, 94, 108, 103, 95, 151,
+  80, 173, 94, 114, 93, 76, 111, 134, 81, 95,
+  101, 53, 124, 100, 111, 114, 94, 121, 78, 129,
+  81, 118, 113, 116, 101, 130, 125, 150, 80, 65,
+  115, 92, 65, 95, 136, 86, 116, 101, 81, 148,
+  202, 120, 96, 96, 107, 111, 66, 122, 153, 116,
+  103, 93, 137, 125, 126, 104, 116, 52, 94, 104,
+  109, 137, 97, 131, 144, 108, 105, 132, 127, 140,
+  147, 97, 137, 118, 101, 122, 102, 146, 105, 123,
+  137, 114, 101, 140, 83, 104, 98, 107, 106, 169,
+  192, 128, 143, 106, 116, 68, 148, 83, 101, 89,
+  162, 152, 91, 106, 97, 121, 116, 107, 135, 78,
+  125, 95, 117, 116, 115, 100, 144, 104, 110, 107,
+  101, 122, 96, 135, 135, 118, 101, 100, 126, 109,
+  92, 93, 93, 96, 86, 158, 114, 166, 65, 113,
+  91, 141, 127, 105, 90, 78, 98, 107, 104, 117,
+  168, 114, 98, 123, 99, 161, 148, 165, 128, 100,
+  122, 169, 96, 125, 85, 126, 80, 87, 89, 112,
+  87, 119, 150, 137, 118, 113, 117, 113, 110, 73,
+  82, 130, 77, 64, 117, 108, 82, 126, 126, 105,
+  95, 138, 95, 195, 112, 116, 141, 84, 127, 123,
+  95, 107, 95, 87, 116, 112, 163, 107, 110, 119,
+  115, 139, 110, 113, 133, 95, 130, 123, 108, 104,
+  140, 141, 114, 122, 127, 114, 141, 123, 133, 101,
+  86, 98, 124, 109, 128, 109, 138, 79, 127, 122,
+  121, 158, 116, 75, 106, 112, 130, 107, 117, 97,
+  118, 77, 80, 115, 125, 93, 108, 121, 92, 140,
+  119, 109, 130, 151, 110, 96, 127, 92, 129, 124,
+  145, 147, 107, 116, 121, 119, 113, 115, 121, 130,
+  121, 117, 142, 128, 84, 117, 118, 92, 75, 122,
+  102, 123, 114, 122, 93, 114, 114, 112, 106, 108,
+  103, 121, 92, 110, 133, 124, 144, 112, 122, 121,
+  129, 101, 124, 111, 116, 106, 138, 110, 76, 102,
+  106, 83, 109, 118, 114, 111, 113, 117, 91, 106,
+  98, 121, 91, 99, 138, 118, 119, 137, 108, 139,
+  124, 74, 127, 112, 124, 151, 93, 116, 109, 99,
+  106, 114, 145, 85, 121, 94, 93, 100, 118, 121,
+  53, 98, 113, 96, 94, 101, 84, 96, 150, 91,
+  95, 100, 123, 100, 118, 129, 120, 98, 118, 105,
+  75, 117, 117, 110, 95, 109, 90, 144, 103, 105,
+  122, 83, 104, 85, 85, 101, 102, 108, 181, 102,
+  118, 108, 86, 123, 122, 131, 138, 128, 103, 117,
+  83, 117, 114, 111, 111, 116, 112, 96, 120, 137,
+  125, 86, 66, 79, 31, 109, 137, 90, 92, 83,
+  131, 75, 92, 129, 72, 97, 110, 83, 112, 86,
+  106, 134, 120, 50, 61, 167, 95, 93, 99, 132,
+  59, 98, 101, 112, 147, 157, 75, 96, 98, 94,
+  120, 128, 112, 110, 102, 100, 110, 103, 92, 102,
+  111, 115, 117, 98, 100, 132, 98, 95, 98, 95,
+  99, 101, 81, 133, 105, 143, 84, 102, 127, 121,
+  94, 82, 99, 118, 104, 98, 106, 109, 144, 131,
+  138, 117, 145, 76, 113, 127, 90, 118, 139, 88,
+  65, 103, 80, 84, 106, 100, 107, 91, 121, 153,
+  97, 78, 75, 122, 62, 118, 105, 138, 151, 83,
+  110, 124, 121, 67, 135, 102, 118, 180, 104, 80,
+  117, 123, 111, 98, 133, 116, 123, 87, 108, 140,
+  108, 116, 86, 62, 117, 78, 65, 94, 147, 115,
+  114, 81, 121, 92, 97, 120, 94, 83, 110, 100,
+  88, 148, 88, 99, 96, 108, 93, 82, 91, 135,
+  88, 97, 106, 88, 104, 95, 85, 95, 92, 124,
+  153, 98, 169, 121, 86, 102, 143, 122, 116, 117,
+  86, 129, 93, 139, 118, 126, 105, 118, 131, 86,
+  116, 70, 123, 92, 66, 101, 32, 118, 150, 96,
+  84, 108, 104, 70, 95, 125, 71, 126, 128, 82,
+  98, 102, 108, 130, 86, 140, 74, 201, 109, 128,
+  101, 109, 74, 73, 96, 125, 130, 93, 70, 102,
+  84, 89, 102, 109, 92, 75, 110, 121, 117, 124,
+  83, 112, 95, 99, 125, 84, 86, 120, 89, 106,
+  113, 80, 126, 69, 101, 123, 106, 158, 90, 95,
+  101, 115, 96, 73, 112, 108, 100, 100, 117, 76,
+  151, 123, 161, 128, 153, 106, 110, 175, 75, 109,
+  118, 94, 82, 105, 92, 109, 101, 126, 115, 92,
+  107, 171, 110, 67, 67, 103, 86, 121, 124, 80,
+  181, 75, 115, 71, 136, 174, 103, 118, 86, 204,
+  133, 80, 135, 155, 126, 88, 136, 160, 128, 102,
+  59, 113, 93, 136, 118, 81, 131, 88, 75, 101,
+  114, 115, 94, 107, 114, 95, 117, 146, 91, 69,
+  104, 106, 79, 79, 139, 92, 92, 92, 110, 76,
+  82, 130, 107, 110, 79, 91, 86, 105, 100, 103,
+  91, 113, 159, 73, 78, 111, 72, 85, 111, 143,
+  92, 86, 60, 99, 62, 68, 78, 74, 106, 113,
+  111, 89, 99, 101, 112, 135, 40, 64, 25, 101,
+  138, 78, 103, 92, 113, 60, 95, 125, 63, 108,
+  115, 119, 70, 89, 90, 83, 90, 86, 63, 166,
+  91, 109, 94, 119, 64, 91, 91, 91, 94, 77,
+  72, 101, 101, 62, 106, 122, 59, 68, 91, 98,
+  94, 93, 72, 94, 58, 82, 97, 151, 91, 109,
+  61, 110, 90, 82, 117, 71, 72, 77, 81, 134,
+  52, 83, 99, 112, 80, 69, 112, 100, 111, 92,
+  92, 57, 125, 71, 109, 106, 156, 74, 81, 134,
+  70, 108, 125, 85, 67, 101, 60, 99, 97, 117,
+  87, 93, 99, 136, 101, 88, 48, 87, 80, 107,
+  65, 93, 96, 90, 98, 97, 128, 151, 82, 108,
+  107, 180, 95, 82, 118, 128, 107, 80, 109, 127,
+  107, 91, 28, 84, 74, 85, 59, 44, 96, 75,
+  41, 116, 56, 107, 94, 61, 107, 95, 127, 105,
+  92, 68, 95, 135, 85, 109, 88, 75, 82, 96,
+  136, 87, 74, 124, 73, 98, 81, 83, 64, 80,
+  106, 93, 71, 89, 179, 94, 133, 91, 121, 120,
+  118, 137, 103, 99, 84, 117, 84, 93, 113, 74,
+  105, 109, 129, 114, 110, 99, 109, 83, 55, 110,
+  80, 103, 163, 95, 113, 89, 99, 130, 121, 115,
+  82, 80, 81, 117, 129, 118, 120, 96, 99, 81,
+  54, 150, 90, 103, 106, 143, 70, 85, 80, 96,
+  110, 74, 117, 81, 101, 89, 131, 113, 120, 130,
+  92, 141, 101, 111, 114, 76, 98, 127, 127, 110,
+  97, 113, 103, 87, 92, 96, 93, 87, 75, 106,
+  93, 145, 71, 87, 108, 80, 106, 81, 70, 99,
+  107, 92, 124, 113, 154, 123, 130, 126, 130, 114,
+  113, 44, 87, 106, 115, 100, 82, 106, 77, 89,
+  93, 104, 125, 89, 98, 123, 99, 84, 76, 93,
+  98, 100, 123, 85, 159, 102, 97, 88, 115, 83,
+  136, 119, 114, 164, 131, 108, 110, 106, 85, 105,
+  132, 106, 100, 106, 100, 103, 96, 137, 59, 116,
+  119, 79, 71, 93, 81, 61, 100, 99, 94, 98,
+  110, 96, 128, 106, 100, 113, 91, 80, 94, 98,
+  96, 98, 97, 91, 74, 146, 82, 70, 80, 89,
+  74, 91, 112, 112, 87, 93, 151, 84, 89, 97,
+  99, 122, 132, 103, 113, 138, 86, 109, 89, 105,
+  121, 97, 84, 115, 103, 98, 99, 97, 103, 90,
+  52, 108, 83, 114, 143, 92, 114, 85, 98, 117,
+  81, 104, 71, 87, 81, 107, 98, 128, 111, 112,
+  94, 79, 72, 112, 102, 119, 103, 100, 68, 98,
+  90, 95, 106, 121, 115, 70, 98, 95, 171, 142,
+  124, 149, 93, 134, 115, 103, 112, 72, 117, 124,
+  131, 92, 74, 109, 121, 92, 80, 102, 87, 87,
+  79, 134, 95, 133, 75, 87, 97, 127, 99, 96,
+  88, 87, 71, 105, 122, 123, 149, 126, 115, 132,
+  120, 104, 117, 128, 101, 97, 112, 107, 67, 106,
+  69, 99, 102, 94, 99, 84, 142, 90, 115, 106,
+  64, 102, 93, 111, 108, 129, 149, 92, 115, 123,
+  95, 64, 130, 110, 107, 105, 142, 98, 108, 114,
+  95, 114, 123, 98, 78, 98, 86, 109, 94, 119,
+  63, 95, 103, 79, 74, 85, 114, 75, 104, 89,
+  97, 92, 94, 111, 119, 90, 102, 97, 79, 85,
+  76, 103, 109, 89, 107, 112, 81, 124, 86, 80,
+  89, 101, 87, 108, 97, 124, 100, 122, 108, 76,
+  142, 106, 55, 88, 115, 111, 111, 143, 77, 108,
+  111, 114, 113, 83, 74, 109, 100, 71, 105, 90,
+  105, 81, 62, 74, 89, 107, 121, 96, 106, 108,
+  77, 87, 53, 122, 80, 101, 152, 101, 89, 124,
+  115, 94, 76, 99, 115, 108, 107, 125, 104, 116,
+  86, 104, 98, 105, 141, 143, 104, 100, 89, 106,
+  122, 148, 52, 78, 83, 116, 112, 125, 78, 98,
+  132, 97, 120, 116, 68, 97, 119, 103, 95, 82,
+  131, 77, 86, 114, 113, 110, 80, 94, 112, 140,
+  73, 112, 111, 92, 83, 100, 98, 93, 89, 105,
+  94, 119, 117, 130, 99, 125, 105, 153, 112, 88,
+  99, 120, 91, 110, 115, 91, 83, 97, 125, 89,
+  118, 72, 71, 89, 115, 127, 98, 113, 133, 95,
+  135, 111, 99, 107, 116, 107, 72, 100, 136, 100,
+  116, 146, 120, 84, 97, 119, 102, 120, 60, 123,
+  59, 84, 159, 76, 71, 123, 87, 109, 136, 112,
+  94, 98, 132, 94, 120, 181, 74, 87, 109, 106,
+  81, 114, 76, 121, 108, 93, 137, 129, 95, 93,
+  113, 74, 80, 105, 81, 131, 69, 112, 105, 140,
+  99, 74, 93, 92, 95, 98, 115, 156, 106, 100,
+  85, 104, 111, 114, 163, 87, 80, 92, 97, 95,
+  109, 127, 110, 99, 69, 119, 77, 114, 126, 91,
+  135, 141, 129, 76, 79, 124, 104, 88, 194, 103,
+  83, 127, 133, 85, 82, 108, 110, 95, 112, 115,
+  107, 139, 91, 99, 95, 140, 124, 83, 99, 105,
+  107, 112, 103, 104, 104, 105, 101, 122, 96, 111,
+  83, 112, 140, 91, 133, 119, 64, 126, 88, 111,
+  101, 81, 116, 73, 79, 91, 101, 88, 83, 117,
+  114, 97, 100, 126, 134, 121, 139, 112, 102, 105,
+  105, 106, 88, 119, 122, 136, 106, 98, 109, 160,
+  115, 86, 63, 123, 113, 109, 106, 113, 90, 120,
+  119, 86, 102, 119, 83, 98, 117, 100, 102, 103,
+  95, 134, 122, 93, 98, 125, 118, 106, 70, 92,
+  110, 114, 133, 130, 120, 88, 113, 83, 93, 111,
+  86, 115, 86, 107, 102, 94, 92, 140, 84, 149,
+  55, 100, 112, 92, 124, 116, 159, 121, 90, 103,
+  114, 114, 100, 132, 62, 123, 100, 92, 126, 115,
+  101, 95, 122, 102, 81, 77, 101, 104, 66, 104,
+  108, 115, 130, 90, 99, 82, 153, 152, 141, 130,
+  118, 100, 103, 109, 109, 117, 131, 100, 97, 91,
+  107, 109, 95, 120, 124, 77, 75, 159, 89, 103,
+  143, 103, 129, 118, 115, 87, 86, 103, 102, 99,
+  113, 72, 97, 122, 146, 91, 122, 98, 79, 131,
+  126, 123, 88, 125, 70, 101, 85, 122, 113, 95,
+  115, 99, 108, 104, 110, 78, 131, 132, 113, 118,
+  82, 108, 110, 95, 134, 122, 137, 85, 99, 131,
+  85, 93, 101, 105, 71, 70, 71, 101, 95, 130,
+  91, 118, 127, 108, 107, 111, 93, 125, 139, 103,
+  115, 140, 132, 108, 98, 126, 122, 114, 127, 84,
+  162, 119, 116, 81, 76, 122, 130, 85, 89, 95,
+  125, 105, 126, 104, 112, 99, 107, 68, 120, 87,
+  127, 81, 102, 145, 91, 78, 104, 93, 121, 100,
+  82, 86, 103, 108, 110, 116, 99, 108, 102, 66,
+  105, 97, 126, 148, 125, 140, 67, 109, 123, 97,
+  102, 116, 45, 75, 107, 122, 102, 128, 135, 106,
+  115, 120, 102, 94, 90, 103, 96, 116, 110, 98,
+  108, 108, 91, 115, 117, 100, 78, 90, 104, 105,
+  82, 128, 105, 104, 130, 94, 80, 112, 154, 138,
+  143, 93, 118, 112, 90, 108, 101, 111, 118, 106,
+  107, 109, 111, 104, 96, 72, 110, 93, 54, 157,
+  92, 104, 130, 87, 101, 84, 97, 86, 80, 96,
+  87, 113, 82, 79, 72, 113, 145, 82, 151, 110,
+  75, 156, 129, 134, 80, 105, 74, 115, 98, 99,
+  97, 124, 83, 105, 105, 89, 108, 92, 100, 110,
+  120, 128, 83, 122, 100, 97, 124, 140, 122, 99,
+  108, 121, 103, 87, 121, 116, 69, 68, 70, 93,
+  91, 137, 86, 100, 103, 144, 94, 98, 79, 98,
+  104, 99, 112, 136, 140, 103, 86, 147, 114, 103,
+  131, 118, 175, 120, 119, 83, 106, 124, 113, 94,
+  76, 75, 120, 82, 122, 116, 121, 106, 89, 67,
+  117, 102, 110, 78, 98, 116, 89, 84, 113, 110,
+  115, 105, 103, 80, 106, 132, 109, 115, 97, 111,
+  98, 87, 106, 101, 119, 145, 117, 143, 62, 90,
+  110, 87, 110, 110, 89, 102, 96, 116, 98, 128,
+  107, 113, 104, 97, 92, 102, 75, 76, 107, 99,
+  109, 92, 109, 135, 84, 112, 111, 110, 83, 125,
+  88, 100, 91, 133, 113, 115, 112, 96, 96, 124,
+  128, 108, 107, 88, 93, 106, 99, 108, 100, 114,
+  106, 104, 99, 113, 113, 96, 107, 63, 115, 89,
+  49, 125, 103, 96, 107, 72, 105, 88, 99, 89,
+  92, 97, 94, 101, 88, 93, 65, 97, 132, 66,
+  142, 98, 96, 164, 123, 125, 90, 118, 76, 120,
+  105, 97, 107, 125, 76, 111, 110, 101, 109, 115,
+  49, 90, 113, 130, 80, 145, 83, 90, 106, 120,
+  115, 110, 107, 123, 111, 73, 119, 114, 101, 83,
+  71, 81, 95, 127, 88, 98, 96, 149, 90, 97,
+  90, 91, 85, 89, 126, 105, 119, 88, 84, 152,
+  106, 92, 131, 97, 165, 116, 123, 89, 115, 127,
+  103, 113, 73, 72, 103, 90, 106, 120, 121, 129,
+  65, 56, 106, 105, 99, 65, 74, 100, 100, 105,
+  117, 111, 112, 110, 107, 72, 87, 135, 116, 123,
+  100, 102, 79, 120, 121, 109, 104, 140, 86, 114,
+  73, 85, 86, 91, 121, 128, 96, 119, 84, 93,
+  101, 121, 104, 124, 82, 71, 83, 111, 72, 70,
+  98, 95, 112, 103, 112, 154, 89, 114, 117, 109,
+  91, 127, 76, 91, 101, 109, 95, 107, 110, 92,
+  87, 118, 130, 124, 98, 110, 78, 104, 104, 103,
+  104, 137, 104, 92, 92, 110, 114, 101, 115, 71,
+  115, 98, 52, 117, 98, 91, 106, 64, 118, 80,
+  122, 88, 102, 84, 109, 87, 88, 97, 70, 97,
+  120, 54, 126, 98, 98, 166, 120, 121, 101, 140,
+  74, 115, 99, 130, 103, 117, 85, 108, 120, 109,
+  110, 123, 64, 99, 101, 123, 75, 137, 81, 89,
+  98, 96, 117, 106, 103, 131, 109, 56, 108, 115,
+  113, 90, 67, 77, 92, 121, 96, 97, 104, 118,
+  94, 94, 91, 93, 100, 84, 125, 104, 113, 97,
+  105, 131, 97, 90, 125, 72, 151, 110, 119, 117,
+  102, 134, 106, 111, 67, 80, 92, 100, 87, 124,
+  114, 129, 50, 46, 86, 103, 109, 64, 68, 97,
+  101, 103, 112, 105, 127, 111, 110, 67, 88, 134,
+  123, 124, 104, 91, 81, 132, 124, 111, 104, 135,
+  75, 89, 56, 99, 91, 94, 125, 124, 92, 111,
+  84, 86, 106, 113, 113, 109, 83, 59, 72, 113,
+  66, 94, 98, 85, 113, 107, 95, 138, 92, 126,
+  127, 98, 97, 97, 77, 92, 107, 122, 79, 113,
+  109, 95, 92, 121, 147, 158, 111, 123, 85, 121,
+  100, 109, 110, 167, 105, 95, 93, 104, 127, 116,
+  105, 81, 122, 93, 58, 145, 89, 102, 117, 75,
+  129, 71, 130, 95, 97, 66, 115, 97, 82, 88,
+  82, 114, 122, 45, 119, 118, 87, 164, 124, 128,
+  117, 114, 76, 105, 93, 144, 95, 101, 98, 139,
+  116, 121, 102, 111, 90, 118, 95, 134, 79, 107,
+  75, 93, 102, 96, 121, 99, 106, 137, 125, 63,
+  103, 118, 109, 96, 78, 97, 91, 144, 108, 95,
+  123, 97, 95, 100, 92, 101, 109, 99, 124, 125,
+  116, 113, 122, 119, 100, 78, 127, 87, 149, 110,
+  122, 130, 111, 139, 125, 101, 66, 79, 103, 98,
+  82, 143, 125, 106, 53, 51, 74, 94, 123, 62,
+  75, 98, 74, 73, 102, 111, 142, 115, 97, 62,
+  99, 137, 126, 128, 110, 96, 98, 140, 129, 112,
+  106, 143, 91, 101, 58, 115, 114, 100, 137, 114,
+  91, 87, 98, 98, 100, 106, 110, 112, 96, 46,
+  73, 105, 54, 88, 122, 82, 98, 110, 102, 122,
+  96, 129, 131, 104, 87, 79, 85, 105, 120, 150,
+  89, 117, 113, 79, 83, 120, 155, 168, 107, 116,
+  94, 114, 84, 112, 100, 166, 103, 113, 82, 105,
+  116, 126, 91, 79, 112, 88, 52, 163, 90, 129,
+  119, 83, 128, 63, 114, 101, 97, 55, 111, 102,
+  83, 89, 91, 123, 123, 39, 135, 118, 71, 153,
+  130, 120, 112, 104, 62, 87, 100, 136, 93, 101,
+  100, 163, 103, 116, 102, 100, 118, 119, 102, 151,
+  77, 94, 67, 92, 112, 97, 119, 99, 104, 137,
+  142, 86, 90, 117, 91, 110, 95, 94, 99, 168,
+  117, 76, 107, 94, 86, 88, 88, 120, 99, 116,
+  130, 140, 121, 99, 119, 112, 96, 81, 128, 96,
+  154, 136, 125, 119, 120, 140, 127, 88, 74, 88,
+  104, 87, 87, 146, 115, 94, 66, 71, 63, 99,
+  112, 68, 74, 100, 53, 71, 98, 108, 121, 112,
+  84, 53, 85, 127, 124, 122, 111, 101, 99, 131,
+  127, 102, 113, 128, 106, 125, 67, 105, 111, 90,
+  148, 112, 88, 73, 102, 93, 94, 112, 95, 107,
+  112, 32, 83, 102, 53, 79, 132, 91, 78, 109,
+  107, 132, 92, 123, 131, 110, 82, 83, 97, 111,
+  125, 180, 77, 108, 112, 64, 74, 107, 160, 163,
+  111, 107, 106, 103, 83, 107, 92, 162, 98, 144,
+  71, 110, 100, 129, 83, 79, 97, 79, 50, 154,
+  99, 155, 121, 89, 127, 61, 101, 109, 108, 63,
+  114, 112, 80, 84, 109, 126, 114, 65, 149, 117,
+  76, 141, 147, 105, 98, 114, 55, 74, 100, 139,
+  96, 101, 89, 151, 93, 105, 108, 94, 149, 125,
+  124, 141, 82, 104, 74, 91, 117, 91, 124, 91,
+  101, 144, 141, 103, 79, 120, 51, 126, 116, 112,
+  97, 185, 130, 74, 91, 100, 83, 75, 67, 128,
+  95, 126, 141, 147, 140, 104, 129, 110, 92, 118,
+  127, 85, 144, 150, 117, 113, 100, 132, 119, 77,
+  76, 108, 90, 71, 92, 147, 95, 90, 75, 80,
+  61, 101, 122, 56, 96, 101, 69, 79, 103, 80,
+  93, 105, 81, 51, 92, 104, 115, 104, 99, 101,
+  99, 122, 117, 88, 124, 126, 118, 150, 56, 117,
+  116, 78, 143, 107, 87, 63, 105, 97, 95, 115,
+  83, 83, 127, 27, 85, 102, 62, 74, 140, 86,
+  87, 112, 94, 126, 81, 129, 140, 103, 76, 84,
+  101, 111, 130, 195, 62, 101, 106, 64, 90, 88,
+  147, 150, 119, 74, 101, 96, 85, 96, 88, 161,
+  109, 167, 78, 112, 100, 119, 77, 78, 89, 80,
+  44, 152, 99, 166, 124, 92, 116, 75, 102, 117,
+  113, 65, 120, 124, 84, 92, 96, 116, 110, 88,
+  136, 119, 80, 113, 144, 94, 95, 101, 64, 71,
+  97, 166, 81, 107, 112, 158, 86, 106, 105, 97,
+  146, 132, 135, 134, 105, 114, 76, 92, 111, 93,
+  123, 90, 96, 134, 116, 105, 98, 110, 62, 134,
+  156, 131, 103, 183, 128, 76, 79, 101, 86, 72,
+  40, 133, 88, 125, 158, 137, 137, 135, 137, 120,
+  88, 108, 118, 115, 134, 139, 117, 123, 104, 122,
+  104, 75, 94, 131, 90, 53, 96, 144, 98, 100,
+  68, 95, 60, 96, 141, 56, 106, 92, 90, 85,
+  100, 72, 72, 109, 83, 50, 113, 94, 114, 96,
+  87, 103, 102, 141, 104, 96, 99, 115, 117, 164,
+  57, 145, 131, 70, 127, 107, 106, 50, 111, 100,
+  95, 99, 70, 78, 132, 26, 74, 101, 64, 56,
+  144, 68, 95, 114, 99, 110, 95, 131, 148, 93,
+  79, 79, 90, 108, 129, 185, 63, 100, 108, 70,
+  91, 84, 105, 124, 121, 55, 79, 52, 72, 87,
+  110, 151, 112, 169, 97, 106, 90, 96, 82, 74,
+  101, 119, 29, 129, 90, 130, 109, 83, 107, 97,
+  87, 123, 125, 98, 102, 114, 93, 76, 72, 97,
+  105, 109, 93, 86, 89, 106, 142, 89, 97, 87,
+  76, 78, 93, 202, 85, 143, 139, 135, 99, 105,
+  112, 117, 100, 126, 138, 120, 149, 125, 76, 104,
+  97, 93, 104, 93, 90, 125, 86, 100, 124, 84,
+  115, 130, 169, 127, 112, 167, 93, 69, 74, 98,
+  102, 77, 72, 141, 84, 107, 160, 92, 129, 129,
+  131, 121, 85, 81, 97, 145, 105, 114, 109, 159,
+  85, 113, 89, 76, 99, 125, 82, 59, 71, 118,
+  97, 94, 37, 132, 51, 105, 140, 107, 122, 84,
+  92, 92, 80, 97, 57, 104, 86, 63, 121, 113,
+  99, 107, 91, 87, 93, 171, 94, 121, 63, 95,
+  78, 121, 93, 142, 114, 84, 116, 91, 112, 60,
+  87, 107, 97, 92, 80, 104, 118, 57, 65, 97,
+  62, 86, 139, 51, 105, 126, 86, 111, 109, 123,
+  149, 73, 84, 70, 74, 98, 100, 153, 44, 103,
+  105, 79, 95, 102, 56, 102, 96, 112, 50, 27,
+  82, 94, 131, 104, 66, 143, 136, 111, 70, 88,
+  91, 95, 106, 165, 11, 79, 81, 69, 103, 68,
+  62, 94, 111, 100, 117, 113, 87, 88, 118, 62,
+  77, 54, 116, 121, 59, 54, 76, 107, 139, 106,
+  47, 82, 92, 55, 83, 156, 108, 127, 101, 87,
+  118, 66, 120, 130, 65, 84, 144, 101, 170, 150,
+  98, 113, 72, 76, 81, 102, 76, 70, 77, 88,
+  105, 74, 154, 132, 108, 88, 115, 133, 50, 80,
+  101, 99, 133, 69, 138, 111, 95, 84, 126, 57,
+  107, 106, 114, 111, 80, 74, 63, 134, 113, 91,
+  109, 144, 86, 103, 72, 82, 102, 69, 83, 70,
+  55, 104, 92, 77, 26, 130, 74, 101, 96, 143,
+  127, 62, 80, 104, 72, 122, 75, 75, 111, 94,
+  100, 92, 99, 132, 124, 78, 75, 169, 85, 124,
+  57, 108, 44, 69, 106, 85, 94, 98, 82, 66,
+  128, 111, 81, 105, 106, 96, 94, 164, 82, 73,
+  85, 88, 80, 121, 122, 84, 120, 126, 52, 101,
+  95, 99, 126, 64, 73, 70, 73, 84, 83, 104,
+  35, 77, 109, 114, 81, 114, 43, 105, 131, 145,
+  48, 62, 66, 112, 85, 102, 69, 104, 210, 108,
+  36, 104, 94, 104, 73, 140, 8, 66, 85, 51,
+  117, 72, 33, 70, 102, 88, 98, 93, 75, 96,
+  104, 68, 105, 44, 145, 114, 36, 90, 49, 110,
+  140, 143, 0, 82, 92, 40, 79, 109, 132, 93,
+  89, 72, 96, 60, 103, 116, 75, 82, 119, 81,
+  128, 175, 172, 108, 74, 84, 93, 94, 89, 43,
+  79, 82, 88, 79, 123, 127, 53, 84, 98, 130,
+  44, 143, 113, 113, 136, 71, 139, 104, 126, 67,
+  102, 55, 127, 72, 151, 114, 89, 83, 65, 97,
+  102, 79, 117, 84, 76, 95, 82, 75, 117, 58,
+  121, 88, 49, 123, 116, 65, 21, 94, 115, 104,
+  95, 123, 146, 46, 80, 115, 90, 121, 85, 75,
+  139, 113, 118, 87, 128, 198, 171, 102, 78, 166,
+  72, 135, 86, 110, 48, 69, 103, 69, 124, 102,
+  55, 96, 122, 112, 95, 127, 92, 93, 74, 125,
+  77, 81, 89, 80, 126, 98, 105, 107, 116, 117,
+  38, 109, 97, 95, 97, 82, 96, 88, 113, 72,
+  79, 75, 87, 55, 108, 138, 110, 120, 47, 106,
+  131, 87, 54, 88, 59, 125, 77, 105, 90, 99,
+  222, 112, 40, 94, 95, 53, 56, 104, 18, 78,
+  88, 35, 104, 72, 47, 57, 48, 99, 98, 100,
+  64, 127, 93, 96, 99, 44, 134, 101, 34, 154,
+  70, 103, 115, 148, 2, 107, 77, 86, 93, 101,
+  115, 124, 93, 73, 122, 61, 69, 95, 80, 88,
+  116, 94, 88, 180, 181, 126, 93, 95, 104, 82,
+  74, 32, 66, 81, 80, 95, 97, 109, 68, 99,
+  96, 136, 39, 153, 87, 122, 99, 69, 93, 91,
+  141, 59, 99, 57, 119, 74, 136, 127, 111, 89,
+  68, 113, 127, 61, 109, 80, 76, 89, 106, 87,
+  113, 63, 130, 107, 50, 127, 120, 83, 27, 85,
+  131, 96, 95, 72, 140, 75, 129, 155, 90, 102,
+  82, 55, 173, 132, 138, 105, 136, 202, 169, 113,
+  80, 143, 69, 131, 75, 100, 56, 67, 104, 51,
+  100, 96, 67, 129, 102, 106, 94, 115, 101, 78,
+  70, 135, 82, 78, 80, 136, 141, 77, 97, 133,
+  118, 102, 29, 160, 88, 84, 82, 82, 150, 108,
+  120, 51, 74, 66, 107, 84, 90, 151, 114, 123,
+  62, 101, 59, 97, 56, 108, 71, 115, 124, 116,
+  84, 106, 150, 145, 58, 77, 112, 55, 62, 98,
+  17, 99, 110, 28, 63, 69, 75, 69, 69, 110,
+  100, 121, 74, 101, 109, 94, 104, 43, 92, 97,
+  59, 140, 112, 80, 91, 106, 56, 149, 84, 138,
+  117, 120, 108, 149, 92, 109, 164, 86, 98, 130,
+  63, 71, 107, 102, 110, 191, 107, 109, 106, 79,
+  104, 97, 54, 51, 112, 74, 96, 109, 109, 115,
+  112, 67, 96, 102, 55, 107, 74, 138, 88, 70,
+  86, 102, 127, 74, 116, 53, 94, 61, 85, 127,
+  127, 103, 71, 91, 144, 85, 112, 109, 82, 97,
+  119, 109, 113, 101, 86, 113, 63, 110, 105, 133,
+  50, 91, 82, 115, 91, 70, 102, 93, 146, 172,
+  94, 48, 103, 45, 174, 124, 95, 91, 108, 135,
+  123, 121, 64, 127, 68, 111, 58, 115, 51, 72,
+  90, 50, 52, 105, 115, 124, 101, 105, 80, 78,
+  111, 63, 91, 161, 80, 84, 91, 134, 110, 86,
+  86, 117, 131, 112, 60, 181, 82, 79, 94, 68,
+  122, 117, 123, 55, 60, 55, 105, 98, 80, 131,
+  135, 117, 82, 107, 60, 92, 49, 120, 78, 114,
+  181, 162, 100, 134, 70, 149, 64, 60, 106, 66,
+  107, 72, 29, 137, 139, 41, 60, 91, 98, 92,
+  93, 127, 101, 115, 117, 110, 139, 89, 111, 53,
+  93, 132, 60, 140, 167, 68, 98, 116, 93, 135,
+  108, 105, 121, 178, 112, 121, 124, 107, 130, 119,
+  89, 140, 80, 76, 91, 120, 132, 190, 66, 79,
+  114, 73, 95, 74, 59, 95, 109, 67, 119, 116,
+  114, 132, 170, 79, 94, 94, 65, 81, 89, 132,
+  104, 77, 121, 152, 99, 104, 112, 57, 95, 79,
+  110, 121, 115, 115, 74, 118, 101, 156, 95, 151,
+  89, 92, 121, 127, 107, 135, 71, 133, 74, 127,
+  102, 133, 58, 80, 73, 144, 129, 89, 134, 51,
+  112, 117, 81, 85, 112, 72, 123, 122, 55, 86,
+  112, 141, 131, 112, 58, 160, 103, 111, 43, 136,
+  49, 101, 115, 103, 69, 122, 158, 95, 92, 93,
+  79, 97, 108, 66, 119, 192, 81, 89, 93, 93,
+  81, 75, 136, 110, 155, 115, 60, 163, 99, 87,
+  157, 84, 102, 107, 95, 113, 70, 76, 104, 89,
+  90, 94, 83, 102, 54, 87, 67, 95, 61, 116,
+  62, 84, 134, 134, 96, 97, 69, 114, 68, 47,
+  75, 93, 102, 143, 22, 76, 80, 63, 73, 94,
+  99, 90, 87, 90, 68, 107, 111, 121, 160, 129,
+  91, 67, 92, 108, 60, 100, 152, 73, 110, 109,
+  93, 93, 112, 87, 88, 144, 102, 95, 120, 104,
+  112, 109, 95, 112, 60, 72, 81, 84, 128, 135,
+  74, 71, 75, 85, 94, 123, 66, 120, 44, 89,
+  120, 106, 123, 106, 124, 102, 92, 78, 63, 108,
+  120, 89, 98, 86, 158, 172, 145, 123, 74, 53,
+  73, 61, 98, 90, 84, 95, 58, 125, 77, 159,
+  99, 123, 60, 90, 83, 131, 119, 99, 53, 127,
+  88, 87, 107, 112, 44, 71, 90, 118, 97, 143,
+  99, 43, 104, 135, 83, 135, 101, 92, 76, 97,
+  44, 90, 126, 124, 142, 72, 37, 157, 98, 114,
+  47, 116, 49, 70, 75, 85, 67, 123, 102, 111,
+  98, 107, 72, 97, 105, 100, 127, 128, 56, 87,
+  113, 156, 81, 122, 109, 79, 126, 111, 91, 145,
+  100, 98, 141, 100, 108, 113, 71, 121, 84, 80,
+  100, 78, 118, 91, 111, 103, 111, 115, 100, 128,
+  97, 72, 85, 91, 86, 119, 127, 67, 93, 93,
+  98, 74, 85, 114, 105, 110, 34, 128, 79, 79,
+  113, 98, 126, 108, 86, 94, 103, 130, 101, 100,
+  114, 87, 115, 97, 109, 97, 85, 67, 115, 121,
+  134, 122, 106, 110, 107, 126, 96, 133, 136, 80,
+  119, 80, 115, 110, 106, 83, 92, 115, 97, 93,
+  105, 111, 104, 91, 82, 131, 132, 108, 81, 119,
+  43, 93, 134, 90, 139, 100, 67, 120, 97, 85,
+  70, 131, 161, 80, 102, 103, 141, 166, 205, 117,
+  94, 112, 110, 125, 112, 103, 80, 120, 81, 64,
+  103, 108, 111, 111, 57, 96, 94, 122, 136, 85,
+  107, 124, 94, 90, 104, 92, 59, 71, 84, 77,
+  111, 105, 142, 102, 90, 103, 111, 99, 129, 120,
+  88, 83, 85, 118, 97, 95, 100, 88, 77, 87,
+  79, 104, 124, 122, 86, 111, 57, 135, 94, 93,
+  82, 112, 96, 79, 93, 120, 131, 103, 126, 105,
+  72, 138, 126, 169, 121, 132, 72, 86, 105, 115,
+  93, 106, 81, 126, 95, 98, 99, 99, 79, 94,
+  109, 96, 131, 105, 125, 111, 134, 98, 144, 148,
+  125, 110, 129, 91, 120, 120, 77, 108, 124, 107,
+  117, 83, 104, 89, 107, 76, 108, 67, 35, 147,
+  94, 120, 135, 109, 118, 102, 104, 91, 107, 141,
+  125, 102, 91, 66, 93, 103, 143, 110, 117, 115,
+  85, 165, 125, 130, 121, 106, 97, 131, 119, 105,
+  109, 116, 102, 91, 103, 99, 126, 80, 103, 128,
+  99, 102, 111, 137, 98, 111, 97, 161, 145, 61,
+  96, 148, 96, 106, 146, 99, 128, 91, 53, 115,
+  107, 117, 79, 126, 129, 135, 104, 111, 103, 133,
+  141, 129, 101, 130, 131, 159, 122, 113, 101, 97,
+  115, 98, 128, 105, 125, 71, 68, 97, 125, 118,
+  126, 79, 140, 97, 139, 97, 111, 94, 78, 77,
+  123, 90, 136, 88, 141, 137, 88, 71, 178, 131,
+  104, 124, 93, 78, 99, 121, 110, 102, 74, 100,
+  124, 74, 98, 99, 141, 112, 108, 141, 60, 149,
+  107, 83, 105, 97, 71, 85, 103, 135, 83, 100,
+  113, 90, 75, 129, 114, 83, 124, 51, 89, 80,
+  94, 126, 108, 107, 75, 155, 79, 88, 75, 114,
+  83, 102, 116, 94, 166, 122, 114, 113, 103, 105,
+  91, 127, 84, 117, 119, 120, 108, 105, 78, 95,
+  96, 111, 103, 90, 71, 77, 100, 42, 103, 96,
+  29, 106, 98, 101, 103, 78, 75, 93, 130, 68,
+  100, 115, 111, 83, 109, 113, 53, 76, 129, 90,
+  122, 113, 83, 166, 89, 119, 118, 125, 93, 139,
+  134, 89, 101, 133, 81, 86, 113, 74, 123, 128,
+  52, 82, 101, 82, 124, 151, 91, 107, 85, 127,
+  113, 119, 100, 121, 128, 87, 113, 76, 135, 82,
+  62, 75, 105, 102, 59, 114, 91, 151, 91, 97,
+  93, 86, 106, 82, 103, 97, 93, 129, 86, 93,
+  104, 52, 95, 120, 116, 93, 126, 69, 73, 95,
+  110, 118, 94, 48, 94, 83, 147, 106, 122, 125,
+  48, 80, 126, 125, 96, 79, 89, 103, 104, 115,
+  152, 127, 85, 86, 93, 90, 87, 120, 111, 122,
+  84, 85, 123, 123, 92, 99, 74, 104, 57, 80,
+  41, 94, 81, 97, 91, 102, 77, 116, 86, 94,
+  106, 70, 101, 120, 48, 67, 100, 73, 86, 88,
+  92, 88, 94, 134, 91, 142, 88, 130, 84, 75,
+  95, 132, 65, 90, 90, 51, 132, 112, 119, 116,
+  124, 120, 59, 123, 66, 122, 95, 127, 102, 119,
+  115, 136, 98, 100, 102, 98, 61, 81, 109, 42,
+  107, 75, 50, 126, 144, 97, 83, 80, 85, 107,
+  123, 111, 128, 83, 110, 67, 123, 127, 88, 77,
+  110, 70, 90, 110, 98, 153, 97, 116, 132, 109,
+  99, 135, 136, 118, 128, 84, 126, 108, 91, 112,
+  96, 143, 66, 103, 113, 122, 114, 125, 106, 90,
+  102, 107, 100, 126, 118, 117, 132, 69, 84, 78,
+  150, 87, 69, 62, 141, 131, 71, 100, 104, 121,
+  94, 80, 100, 89, 119, 68, 124, 100, 100, 116,
+  104, 98, 104, 73, 85, 99, 110, 100, 142, 107,
+  118, 92, 113, 116, 88, 79, 79, 97, 103, 135,
+  116, 146, 42, 76, 107, 139, 104, 69, 91, 64,
+  73, 96, 106, 120, 128, 100, 83, 123, 96, 147,
+  120, 152, 102, 93, 126, 168, 87, 100, 57, 123,
+  44, 82, 74, 101, 72, 117, 122, 101, 92, 90,
+  96, 87, 114, 59, 99, 130, 57, 29, 110, 78,
+  69, 107, 92, 105, 91, 151, 71, 183, 103, 119,
+  110, 60, 115, 130, 74, 84, 90, 64, 121, 94,
+  138, 110, 87, 123, 83, 127, 85, 114, 98, 114,
+  97, 133, 121, 157, 90, 68, 118, 100, 73, 98,
+  126, 93, 109, 107, 85, 140, 182, 112, 90, 102,
+  117, 121, 62, 146, 141, 98, 93, 104, 132, 115,
+  136, 109, 105, 41, 78, 97, 100, 120, 111, 124,
+  138, 91, 93, 117, 110, 145, 134, 81, 160, 123,
+  96, 133, 114, 129, 121, 152, 129, 131, 103, 116,
+  96, 89, 107, 103, 108, 149, 196, 137, 141, 112,
+  90, 79, 127, 79, 99, 99, 152, 163, 88, 99,
+  99, 86, 120, 91, 120, 102, 137, 96, 115, 131,
+  133, 92, 141, 117, 106, 117, 96, 110, 93, 129,
+  137, 128, 100, 90, 112, 101, 114, 119, 85, 109,
+  79, 148, 113, 168, 65, 117, 87, 144, 126, 109,
+  96, 69, 90, 109, 87, 117, 169, 130, 94, 119,
+  115, 176, 137, 168, 131, 102, 111, 174, 92, 119,
+  80, 110, 84, 107, 69, 113, 89, 111, 144, 117,
+  110, 69, 123, 108, 111, 86, 90, 94, 88, 66,
+  117, 109, 78, 116, 110, 105, 82, 140, 87, 170,
+  118, 131, 141, 81, 137, 120, 103, 83, 101, 110,
+  108, 114, 163, 107, 108, 113, 108, 135, 120, 111,
+  141, 102, 118, 117, 106, 108, 142, 137, 115, 111,
+  132, 111, 128, 119, 133, 95, 90, 94, 119, 124,
+  139, 107, 134, 84, 116, 126, 106, 148, 108, 71,
+  94, 115, 132, 111, 127, 96, 118, 79, 79, 118,
+  112, 97, 116, 111, 89, 143, 126, 108, 136, 155,
+  108, 83, 125, 93, 128, 135, 144, 147, 107, 101,
+  121, 116, 115, 104, 125, 135, 121, 106, 150, 137,
+  83, 121, 113, 94, 78, 122, 102, 128, 113, 123,
+  93, 120, 115, 134, 110, 111, 100, 123, 87, 112,
+  133, 128, 155, 114, 135, 120, 126, 90, 136, 116,
+  111, 97, 138, 98, 72, 107, 103, 95, 106, 107,
+  109, 113, 127, 123, 92, 106, 101, 121, 91, 106,
+  130, 113, 128, 129, 110, 139, 115, 74, 126, 109,
+  106, 155, 81, 120, 109, 106, 104, 116, 148, 85,
+  127, 102, 102, 102, 126, 116, 56, 105, 113, 99,
+  95, 97, 82, 103, 142, 103, 87, 104, 121, 108,
+  116, 127, 117, 97, 119, 97, 80, 106, 111, 110,
+  98, 110, 90, 146, 112, 106, 126, 101, 103, 85,
+  89, 97, 110, 108, 176, 100, 129, 99, 76, 116,
+  120, 111, 142, 124, 95, 107, 85, 119, 115, 117,
+  111, 109, 116, 94, 115, 127, 122, 99, 75, 67,
+  29, 113, 142, 86, 92, 80, 132, 81, 82, 111,
+  74, 96, 105, 93, 114, 78, 109, 133, 121, 54,
+  64, 166, 88, 97, 102, 121, 64, 97, 103, 114,
+  146, 159, 70, 91, 104, 90, 118, 142, 106, 107,
+  106, 97, 111, 99, 98, 95, 114, 113, 113, 111,
+  97, 134, 92, 97, 94, 95, 101, 101, 91, 138,
+  105, 135, 84, 111, 131, 137, 97, 81, 98, 110,
+  100, 97, 102, 113, 147, 120, 145, 117, 139, 85,
+  121, 142, 90, 109, 140, 91, 67, 109, 72, 95,
+  106, 98, 104, 100, 128, 156, 99, 82, 77, 127,
+  55, 127, 99, 128, 144, 66, 112, 122, 109, 76,
+  126, 100, 103, 185, 108, 76, 126, 128, 112, 93,
+  127, 123, 129, 90, 106, 138, 105, 105, 84, 64,
+  116, 87, 69, 103, 149, 131, 110, 81, 119, 99,
+  95, 126, 93, 76, 107, 102, 87, 140, 81, 89,
+  100, 106, 98, 86, 98, 133, 102, 97, 108, 97,
+  100, 95, 87, 92, 90, 129, 146, 97, 165, 123,
+  78, 97, 140, 126, 107, 111, 85, 122, 91, 144,
+  120, 131, 108, 116, 137, 87, 127, 75, 118, 100,
+  71, 93, 31, 111, 145, 94, 88, 104, 110, 78,
+  100, 112, 73, 126, 129, 80, 103, 94, 104, 130,
+  80, 140, 78, 191, 118, 129, 102, 110, 88, 76,
+  92, 128, 129, 94, 67, 97, 87, 93, 101, 112,
+  89, 81, 112, 122, 116, 121, 84, 111, 95, 94,
+  124, 85, 86, 123, 87, 107, 112, 82, 125, 68,
+  100, 124, 101, 147, 91, 101, 109, 116, 102, 76,
+  120, 106, 103, 103, 114, 81, 146, 115, 159, 126,
+  138, 111, 112, 171, 77, 109, 113, 99, 80, 104,
+  88, 112, 102, 122, 117, 97, 105, 175, 114, 74,
+  67, 107, 78, 122, 124, 86, 173, 63, 118, 75,
+  127, 174, 103, 121, 82, 202, 130, 76, 143, 155,
+  132, 88, 128, 169, 126, 101, 60, 113, 88, 126,
+  112, 88, 131, 98, 79, 112, 118, 125, 94, 105,
+  105, 103, 118, 138, 92, 64, 104, 113, 79, 82,
+  132, 90, 98, 91, 107, 75, 91, 128, 117, 117,
+  81, 91, 81, 109, 100, 102, 96, 115, 159, 70,
+  81, 115, 69, 88, 106, 155, 87, 90, 61, 97,
+  57, 75, 80, 77, 103, 104, 117, 88, 110, 104,
+  105, 135, 41, 60, 29, 92, 125, 75, 110, 92,
+  114, 66, 98, 107, 60, 105, 118, 117, 68, 80,
+  83, 83, 89, 83, 57, 163, 96, 104, 91, 117,
+  73, 95, 87, 93, 101, 73, 73, 99, 106, 65,
+  108, 124, 64, 73, 90, 99, 94, 84, 76, 94,
+  64, 80, 100, 146, 90, 110, 61, 104, 92, 84,
+  116, 67, 62, 73, 86, 129, 54, 88, 105, 109,
+  83, 68, 120, 108, 114, 93, 92, 70, 119, 75,
+  106, 100, 134, 69, 82, 124, 80, 104, 119, 85,
+  76, 101, 55, 99, 102, 105, 92, 94, 100, 136,
+  106, 89, 49, 86, 69, 105, 66, 93, 95, 78,
+  102, 104, 116, 142, 81, 104, 101, 177, 86, 79,
+  120, 123, 111, 82, 102, 130, 101, 88, 38, 89,
+  69, 82, 59, 52, 95, 79, 40, 121, 58, 103,
+  82, 58, 103, 103, 123, 100, 93, 58, 88, 144,
+  83, 113, 77, 74, 79, 93, 130, 92, 78, 127,
+  83, 96, 92, 77, 63, 79, 107, 91, 71, 83,
+  183, 91, 132, 92, 125, 132, 109, 134, 101, 114,
+  82, 115, 85, 108, 109, 71, 96, 94, 125, 106,
+  121, 96, 115, 75, 55, 107, 82, 98, 155, 96,
+  132, 96, 90, 134, 121, 101, 77, 77, 80, 104,
+  125, 110, 114, 106, 95, 84, 46, 151, 89, 107,
+  107, 127, 71, 84, 73, 104, 112, 68, 126, 74,
+  106, 96, 134, 112, 125, 145, 96, 133, 108, 99,
+  114, 72, 105, 128, 131, 98, 102, 119, 91, 80,
+  89, 105, 96, 80, 66, 119, 97, 152, 75, 93,
+  108, 76, 98, 80, 75, 96, 117, 93, 123, 125,
+  152, 131, 132, 113, 107, 105, 110, 53, 93, 96,
+  112, 99, 76, 105, 80, 98, 99, 105, 122, 95,
+  95, 128, 98, 89, 65, 89, 85, 105, 135, 76,
+  163, 91, 96, 81, 102, 81, 135, 121, 105, 158,
+  130, 106, 113, 107, 82, 109, 124, 106, 94, 99,
+  103, 105, 92, 134, 56, 132, 118, 76, 77, 86,
+  81, 47, 79, 103, 85, 102, 105, 91, 129, 104,
+  83, 114, 92, 72, 91, 86, 90, 95, 101, 96,
+  72, 160, 91, 63, 88, 82, 72, 89, 112, 110,
+  94, 95, 155, 81, 90, 89, 92, 132, 119, 83,
+  108, 134, 75, 108, 90, 113, 116, 96, 71, 100,
+  108, 88, 111, 96, 110, 88, 50, 110, 85, 104,
+  142, 89, 121, 87, 101, 110, 84, 96, 67, 90,
+  84, 96, 90, 116, 103, 123, 90, 76, 54, 121,
+  99, 128, 108, 91, 73, 94, 91, 103, 108, 131,
+  111, 76, 100, 90, 176, 148, 119, 150, 85, 141,
+  121, 90, 115, 82, 121, 122, 134, 100, 75, 116,
+  112, 86, 81, 108, 107, 85, 77, 129, 99, 136,
+  82, 81, 95, 124, 99, 91, 85, 76, 79, 105,
+  127, 124, 142, 139, 115, 119, 99, 96, 111, 142,
+  107, 105, 118, 99, 70, 102, 69, 115, 109, 97,
+  101, 95, 124, 98, 109, 102, 44, 94, 77, 118,
+  115, 130, 140, 86, 102, 118, 98, 75, 118, 121,
+  105, 99, 141, 93, 114, 114, 93, 109, 111, 99,
+  75, 87, 77, 100, 90, 111, 67, 95, 100, 72,
+  71, 77, 129, 65, 89, 90, 100, 95, 99, 112,
+  117, 81, 86, 95, 83, 90, 80, 80, 97, 80,
+  127, 116, 74, 131, 93, 72, 96, 94, 84, 106,
+  92, 121, 99, 132, 111, 84, 155, 114, 45, 90,
+  105, 117, 119, 129, 60, 124, 98, 127, 94, 88,
+  72, 97, 113, 63, 112, 94, 109, 79, 58, 83,
+  76, 100, 134, 99, 97, 115, 89, 82, 70, 137,
+  71, 121, 161, 92, 95, 111, 112, 112, 71, 107,
+  105, 133, 114, 132, 119, 122, 97, 100, 97, 116,
+  140, 151, 96, 101, 99, 98, 124, 143, 56, 80,
+  93, 125, 109, 131, 77, 115, 133, 97, 122, 133,
+  79, 97, 105, 100, 96, 90, 142, 74, 86, 96,
+  108, 125, 93, 83, 103, 136, 76, 112, 115, 96,
+  79, 102, 103, 76, 99, 117, 113, 114, 121, 108,
+  98, 127, 97, 136, 120, 96, 96, 114, 89, 122,
+  110, 109, 102, 115, 109, 107, 113, 65, 59, 85,
+  99, 123, 106, 113, 138, 90, 122, 107, 121, 126,
+  95, 125, 83, 101, 130, 97, 129, 151, 121, 77,
+  94, 128, 106, 113, 71, 115, 58, 77, 179, 73,
+  82, 113, 84, 111, 133, 128, 80, 99, 124, 104,
+  131, 165, 75, 87, 112, 103, 79, 121, 94, 86,
+  90, 80, 145, 128, 91, 88, 112, 76, 81, 91,
+  77, 119, 77, 108, 105, 135, 95, 78, 93, 106,
+  85, 102, 120, 168, 125, 105, 68, 120, 90, 126,
+  131, 90, 88, 87, 99, 90, 93, 134, 104, 126,
+  69, 121, 71, 108, 139, 93, 120, 128, 129, 77,
+  97, 149, 90, 117, 183, 94, 85, 118, 129, 106,
+  82, 117, 104, 120, 118, 120, 112, 134, 86, 89,
+  91, 145, 113, 82, 99, 87, 124, 95, 105, 96,
+  118, 119, 124, 107, 98, 138, 97, 116, 132, 85,
+  133, 125, 81, 111, 85, 115, 91, 89, 107, 56,
+  85, 111, 88, 115, 88, 109, 117, 108, 102, 118,
+  145, 106, 149, 104, 103, 72, 124, 110, 103, 111,
+  163, 123, 113, 119, 93, 124, 118, 107, 60, 118,
+  110, 123, 99, 132, 107, 127, 105, 98, 113, 105,
+  72, 96, 90, 94, 103, 93, 112, 129, 117, 101,
+  114, 136, 109, 117, 87, 89, 118, 114, 134, 136,
+  115, 93, 121, 98, 91, 110, 73, 102, 95, 98,
+  90, 83, 102, 110, 82, 155, 51, 121, 85, 80,
+  116, 118, 142, 117, 99, 109, 125, 120, 95, 135,
+  92, 103, 100, 90, 116, 111, 99, 91, 114, 112,
+  78, 82, 98, 81, 75, 97, 88, 124, 111, 90,
+  103, 91, 148, 149, 129, 129, 124, 124, 90, 117,
+  75, 119, 109, 104, 109, 90, 98, 110, 87, 145,
+  111, 96, 70, 148, 92, 100, 136, 99, 113, 96,
+  123, 81, 84, 127, 103, 111, 119, 78, 88, 115,
+  150, 92, 121, 99, 82, 139, 135, 119, 83, 133,
+  75, 101, 93, 108, 107, 113, 112, 115, 111, 101,
+  115, 79, 119, 124, 102, 107, 84, 128, 114, 92,
+  133, 115, 136, 105, 100, 126, 86, 100, 98, 112,
+  86, 61, 59, 119, 94, 133, 87, 130, 141, 123,
+  106, 108, 114, 108, 136, 100, 102, 113, 117, 119,
+  86, 117, 162, 114, 121, 90, 156, 125, 123, 75,
+  88, 126, 139, 98, 92, 102, 128, 110, 116, 99,
+  127, 97, 97, 65, 112, 90, 115, 89, 86, 152,
+  104, 94, 118, 86, 114, 118, 86, 80, 107, 107,
+  109, 110, 100, 104, 115, 85, 99, 105, 100, 151,
+  126, 128, 72, 86, 112, 80, 105, 135, 71, 97,
+  90, 105, 94, 146, 106, 103, 111, 107, 101, 120,
+  103, 111, 97, 110, 116, 101, 110, 119, 96, 110,
+  113, 112, 88, 100, 92, 86, 92, 111, 89, 120,
+  110, 85, 93, 116, 167, 144, 111, 95, 101, 121,
+  88, 109, 84, 117, 100, 111, 98, 115, 101, 110,
+  107, 79, 105, 99, 63, 147, 97, 86, 114, 81,
+  104, 75, 116, 78, 88, 95, 101, 106, 91, 94,
+  73, 104, 133, 80, 141, 108, 85, 166, 130, 116,
+  89, 136, 66, 128, 94, 97, 101, 140, 86, 121,
+  112, 100, 116, 103, 96, 100, 115, 134, 86, 136,
+  107, 89, 117, 121, 127, 105, 99, 124, 90, 72,
+  115, 108, 106, 75, 55, 91, 100, 127, 92, 108,
+  102, 130, 89, 102, 80, 103, 101, 91, 114, 135,
+  113, 110, 73, 135, 119, 109, 116, 90, 177, 105,
+  123, 92, 113, 122, 137, 108, 77, 70, 110, 97,
+  108, 111, 120, 94, 88, 51, 106, 102, 104, 58,
+  75, 120, 109, 111, 111, 103, 114, 113, 95, 74,
+  102, 125, 111, 112, 104, 105, 95, 105, 111, 100,
+  104, 158, 103, 125, 81, 71, 98, 92, 125, 120,
+  96, 115, 82, 87, 105, 143, 91, 123, 101, 67,
+  81, 119, 76, 96, 94, 104, 127, 98, 92, 148,
+  98, 108, 125, 117, 101, 106, 94, 104, 95, 131,
+  84, 108, 99, 90, 83, 128, 158, 140, 101, 124,
+  89, 117, 91, 108, 96, 147, 97, 106, 88, 111,
+  107, 117, 125, 71, 107, 101, 61, 143, 95, 88,
+  108, 80, 122, 73, 118, 88, 106, 84, 106, 105,
+  81, 75, 81, 102, 118, 59, 139, 99, 97, 178,
+  129, 111, 107, 114, 71, 122, 87, 131, 106, 116,
+  91, 135, 113, 110, 119, 112, 89, 102, 115, 133,
+  82, 123, 84, 94, 101, 99, 126, 105, 110, 142,
+  106, 76, 113, 107, 112, 82, 60, 87, 105, 132,
+  112, 87, 107, 117, 95, 96, 87, 98, 88, 91,
+  127, 126, 115, 99, 95, 123, 107, 97, 121, 80,
+  161, 105, 125, 117, 107, 130, 139, 105, 67, 83,
+  106, 96, 89, 128, 110, 104, 79, 47, 78, 102,
+  106, 53, 61, 107, 94, 93, 100, 117, 125, 125,
+  99, 65, 87, 123, 115, 123, 111, 100, 86, 126,
+  125, 104, 108, 152, 86, 104, 72, 96, 98, 98,
+  144, 127, 92, 113, 84, 77, 105, 120, 100, 103,
+  99, 51, 68, 103, 64, 78, 104, 90, 121, 106,
+  91, 135, 101, 115, 141, 122, 90, 70, 93, 107,
+  109, 144, 88, 101, 106, 82, 95, 122, 162, 164,
+  118, 134, 91, 119, 96, 102, 100, 179, 104, 105,
+  83, 106, 112, 122, 101, 86, 122, 96, 67, 151,
+  86, 110, 120, 88, 133, 79, 130, 90, 111, 74,
+  114, 108, 84, 67, 91, 117, 115, 53, 132, 115,
+  86, 166, 140, 117, 102, 102, 83, 102, 90, 148,
+  99, 102, 92, 154, 103, 116, 123, 110, 119, 118,
+  106, 132, 89, 97, 77, 85, 98, 86, 126, 97,
+  111, 143, 134, 109, 105, 110, 104, 84, 75, 90,
+  99, 143, 122, 94, 125, 107, 106, 89, 91, 97,
+  96, 111, 123, 130, 114, 125, 116, 105, 101, 95,
+  123, 98, 154, 119, 122, 125, 117, 137, 145, 97,
+  71, 90, 121, 88, 86, 140, 117, 89, 71, 57,
+  78, 103, 125, 68, 74, 108, 82, 67, 96, 117,
+  144, 122, 89, 64, 102, 121, 119, 126, 112, 91,
+  96, 125, 118, 108, 113, 155, 97, 106, 70, 127,
+  120, 99, 144, 116, 101, 94, 91, 99, 116, 108,
+  93, 92, 114, 48, 69, 101, 63, 98, 135, 81,
+  115, 110, 102, 116, 102, 130, 148, 116, 71, 74,
+  95, 111, 117, 167, 99, 108, 109, 71, 90, 114,
+  156, 181, 120, 108, 94, 123, 92, 103, 76, 193,
+  96, 108, 79, 99, 110, 116, 70, 96, 130, 100,
+  68, 159, 98, 132, 123, 100, 120, 83, 128, 104,
+  93, 64, 119, 109, 97, 74, 88, 135, 115, 51,
+  132, 130, 74, 146, 153, 115, 96, 83, 85, 88,
+  96, 119, 95, 93, 97, 172, 84, 113, 117, 105,
+  127, 119, 93, 162, 94, 82, 87, 75, 104, 93,
+  124, 102, 109, 145, 152, 139, 90, 106, 91, 97,
+  80, 94, 100, 163, 131, 109, 128, 108, 105, 81,
+  82, 104, 100, 130, 114, 133, 107, 124, 118, 100,
+  97, 83, 119, 112, 157, 129, 126, 110, 125, 142,
+  136, 94, 80, 92, 138, 76, 96, 136, 129, 78,
+  68, 77, 84, 98, 127, 70, 73, 98, 65, 58,
+  115, 121, 136, 117, 72, 57, 114, 124, 119, 136,
+  108, 94, 93, 128, 115, 112, 101, 149, 113, 120,
+  84, 126, 135, 93, 151, 108, 101, 67, 93, 108,
+  107, 115, 76, 97, 116, 35, 74, 102, 60, 103,
+  156, 74, 98, 101, 129, 127, 100, 132, 134, 112,
+  62, 93, 97, 104, 127, 186, 97, 102, 109, 62,
+  91, 105, 149, 174, 97, 107, 92, 118, 84, 103,
+  66, 187, 79, 108, 79, 95, 90, 113, 65, 97,
+  116, 81, 66, 159, 102, 133, 132, 105, 115, 77,
+  97, 112, 84, 60, 119, 107, 106, 81, 90, 142,
+  118, 33, 140, 114, 67, 130, 151, 108, 93, 109,
+  72, 89, 98, 99, 106, 104, 103, 172, 76, 103,
+  107, 104, 150, 123, 93, 179, 87, 85, 85, 80,
+  106, 91, 119, 101, 113, 136, 137, 147, 80, 97,
+  84, 108, 87, 99, 98, 171, 134, 110, 103, 99,
+  95, 73, 77, 121, 100, 121, 114, 131, 111, 100,
+  119, 96, 91, 95, 113, 93, 151, 142, 128, 104,
+  126, 146, 121, 86, 85, 99, 150, 71, 102, 133,
+  125, 82, 82, 92, 76, 107, 121, 64, 76, 101,
+  74, 69, 120, 114, 113, 106, 64, 48, 106, 126,
+  117, 135, 106, 93, 85, 122, 123, 103, 94, 120,
+  118, 120, 104, 109, 134, 80, 152, 108, 95, 53,
+  100, 105, 106, 123, 66, 103, 120, 36, 86, 107,
+  67, 100, 159, 95, 86, 87, 121, 131, 100, 123,
+  128, 113, 77, 95, 119, 97, 137, 208, 83, 109,
+  102, 68, 78, 106, 155, 159, 105, 112, 99, 117,
+  92, 94, 82, 179, 102, 121, 84, 103, 83, 128,
+  71, 94, 100, 78, 63, 146, 107, 125, 146, 105,
+  124, 72, 92, 116, 87, 64, 119, 112, 93, 79,
+  96, 146, 126, 46, 151, 117, 69, 117, 149, 110,
+  92, 120, 73, 82, 96, 96, 109, 112, 92, 161,
+  78, 103, 96, 100, 170, 129, 100, 162, 84, 92,
+  91, 84, 111, 95, 120, 87, 99, 126, 131, 149,
+  80, 94, 58, 117, 107, 130, 84, 162, 130, 104,
+  92, 94, 97, 77, 77, 110, 100, 123, 111, 139,
+  126, 106, 129, 98, 85, 125, 116, 100, 146, 148,
+  119, 108, 118, 148, 115, 76, 79, 104, 149, 70,
+  109, 137, 124, 80, 98, 96, 75, 117, 120, 64,
+  98, 109, 94, 71, 107, 95, 100, 94, 55, 49,
+  112, 114, 114, 121, 104, 92, 99, 112, 127, 95,
+  106, 120, 133, 130, 91, 111, 145, 80, 139, 104,
+  98, 73, 125, 125, 106, 139, 71, 95, 126, 42,
+  102, 112, 81, 82, 161, 111, 89, 71, 115, 116,
+  96, 121, 140, 122, 77, 84, 131, 104, 134, 218,
+  87, 122, 91, 79, 90, 105, 150, 137, 108, 93,
+  98, 112, 102, 91, 92, 159, 136, 165, 96, 112,
+  86, 140, 72, 90, 91, 70, 59, 146, 100, 113,
+  153, 97, 116, 71, 119, 122, 97, 70, 125, 121,
+  90, 107, 97, 137, 138, 65, 153, 108, 67, 99,
+  145, 102, 88, 110, 88, 88, 95, 100, 89, 115,
+  95, 181, 95, 101, 97, 102, 168, 126, 120, 160,
+  96, 95, 83, 91, 115, 106, 119, 99, 83, 114,
+  114, 140, 86, 101, 64, 131, 124, 138, 84, 154,
+  120, 93, 94, 96, 85, 77, 66, 110, 89, 126,
+  133, 137, 136, 117, 123, 103, 84, 121, 116, 121,
+  151, 161, 120, 110, 133, 151, 101, 73, 85, 117,
+  140, 72, 109, 143, 126, 87, 96, 86, 84, 108,
+  119, 58, 93, 105, 90, 97, 91, 75, 76, 87,
+  70, 55, 113, 107, 119, 107, 103, 93, 107, 121,
+  123, 95, 104, 127, 136, 157, 81, 124, 158, 86,
+  120, 116, 113, 77, 138, 116, 102, 135, 83, 87,
+  128, 39, 100, 109, 90, 81, 161, 114, 95, 78,
+  131, 118, 107, 114, 144, 125, 79, 82, 125, 107,
+  128, 205, 85, 95, 97, 87, 81, 115, 124, 132,
+  130, 73, 95, 74, 91, 83, 100, 148, 133, 181,
+  125, 124, 85, 131, 81, 83, 79, 79, 48, 149,
+  88, 89, 132, 90, 123, 73, 114, 129, 113, 89,
+  98, 127, 71, 94, 96, 126, 132, 85, 108, 84,
+  81, 96, 156, 99, 82, 116, 82, 106, 102, 164,
+  91, 147, 118, 154, 111, 108, 114, 117, 146, 130,
+  139, 123, 121, 120, 82, 116, 111, 105, 116, 87,
+  91, 119, 89, 111, 95, 93, 86, 151, 160, 143,
+  84, 164, 102, 87, 85, 107, 89, 82, 55, 130,
+  89, 103, 169, 116, 159, 108, 119, 116, 88, 119,
+  110, 123, 154, 132, 113, 133, 100, 139, 110, 66,
+  93, 128, 108, 61, 95, 122, 121, 95, 63, 100,
+  88, 114, 127, 81, 111, 107, 104, 121, 70, 71,
+  60, 95, 92, 58, 121, 134, 90, 109, 112, 100,
+  102, 138, 108, 126, 100, 131, 120, 126, 72, 117,
+  130, 93, 106, 115, 124, 70, 135, 134, 100, 123,
+  100, 85, 121, 61, 79, 114, 79, 105, 149, 95,
+  113, 106, 98, 133, 121, 118, 144, 109, 78, 92,
+  110, 109, 99, 181, 68, 89, 91, 119, 98, 152,
+  85, 109, 128, 91, 83, 38, 87, 80, 121, 129,
+  109, 170, 162, 135, 88, 116, 93, 69, 77, 113,
+  34, 122, 69, 44, 100, 76, 79, 90, 102, 109,
+  98, 92, 91, 96, 82, 82, 111, 88, 138, 126,
+  76, 75, 94, 93, 144, 113, 40, 101, 86, 114,
+  101, 195, 120, 151, 116, 123, 132, 100, 104, 127,
+  89, 106, 170, 99, 156, 131, 110, 127, 85, 93,
+  88, 93, 71, 88, 72, 80, 103, 93, 122, 156,
+  149, 109, 91, 134, 78, 85, 100, 102, 100, 83,
+  95, 121, 101, 68, 161, 97, 134, 112, 93, 120,
+  86, 97, 84, 130, 159, 79, 115, 150, 95, 137,
+  108, 74, 90, 96, 86, 66, 70, 110, 112, 75,
+  40, 129, 116, 132, 116, 123, 120, 89, 116, 126,
+  56, 90, 68, 79, 118, 85, 123, 114, 76, 118,
+  128, 107, 99, 144, 101, 140, 82, 128, 75, 86,
+  108, 106, 96, 106, 86, 93, 164, 99, 128, 133,
+  105, 105, 110, 131, 102, 85, 65, 110, 83, 123,
+  110, 107, 145, 128, 63, 122, 121, 102, 136, 90,
+  83, 85, 97, 91, 75, 124, 79, 97, 79, 141,
+  114, 163, 67, 102, 98, 113, 59, 57, 92, 80,
+  126, 114, 101, 136, 161, 137, 58, 93, 82, 56,
+  84, 141, 24, 94, 96, 21, 64, 55, 30, 80,
+  110, 87, 63, 78, 85, 75, 102, 76, 120, 48,
+  132, 113, 47, 101, 82, 86, 123, 114, 3, 82,
+  71, 124, 91, 153, 133, 120, 107, 119, 187, 104,
+  79, 119, 68, 91, 161, 90, 141, 169, 175, 103,
+  72, 79, 74, 107, 72, 51, 57, 57, 87, 97,
+  99, 131, 81, 63, 71, 90, 68, 101, 112, 97,
+  99, 81, 121, 136, 143, 34, 129, 88, 99, 56,
+  85, 127, 86, 70, 65, 95, 196, 62, 119, 131,
+  96, 119, 102, 103, 102, 59, 64, 125, 65, 104,
+  105, 64, 18, 93, 132, 117, 104, 112, 124, 59,
+  111, 159, 61, 100, 84, 53, 149, 95, 106, 88,
+  83, 143, 155, 131, 94, 150, 95, 140, 75, 102,
+  52, 59, 97, 76, 64, 115, 84, 104, 147, 90,
+  75, 80, 97, 94, 99, 166, 88, 69, 73, 98,
+  96, 99, 78, 123, 183, 137, 63, 127, 123, 90,
+  101, 70, 141, 93, 116, 58, 64, 53, 106, 69,
+  82, 136, 105, 142, 87, 100, 84, 104, 68, 99,
+  94, 105, 123, 140, 91, 102, 120, 136, 61, 66,
+  92, 59, 89, 114, 28, 130, 119, 39, 59, 70,
+  50, 59, 75, 115, 68, 91, 67, 94, 107, 66,
+  125, 49, 117, 97, 45, 141, 107, 104, 112, 120,
+  38, 82, 68, 133, 92, 158, 125, 116, 123, 134,
+  194, 130, 60, 98, 81, 96, 116, 105, 86, 182,
+  158, 85, 96, 79, 88, 74, 78, 61, 62, 63,
+  96, 114, 99, 120, 75, 64, 72, 103, 74, 118,
+  99, 106, 104, 66, 99, 134, 170, 43, 113, 99,
+  100, 61, 93, 119, 101, 96, 64, 87, 190, 67,
+  111, 163, 93, 113, 114, 124, 99, 69, 75, 147,
+  52, 109, 108, 73, 33, 60, 101, 75, 116, 69,
+  144, 67, 111, 141, 85, 95, 132, 66, 163, 111,
+  90, 101, 78, 146, 138, 128, 102, 147, 82, 132,
+  78, 103, 59, 81, 97, 71, 65, 100, 130, 118,
+  108, 73, 57, 65, 84, 77, 98, 174, 95, 52,
+  85, 120, 83, 80, 80, 116, 170, 153, 70, 156,
+  105, 78, 87, 50, 167, 96, 137, 52, 62, 32,
+  121, 93, 72, 103, 116, 128, 104, 122, 84, 107,
+  78, 137, 100, 126, 122, 196, 92, 109, 82, 117,
+  82, 66, 110, 78, 127, 85, 31, 194, 110, 87,
+  82, 88, 122, 45, 75, 138, 124, 104, 86, 112,
+  126, 89, 113, 93, 97, 113, 59, 133, 126, 99,
+  128, 120, 112, 84, 78, 118, 106, 186, 97, 114,
+  143, 172, 157, 158, 86, 121, 117, 121, 99, 126,
+  101, 142, 100, 106, 129, 80, 102, 95, 82, 112,
+  113, 92, 130, 130, 112, 143, 129, 99, 82, 123,
+  104, 86, 80, 112, 102, 79, 96, 144, 130, 88,
+  130, 96, 106, 81, 95, 111, 122, 141, 87, 104,
+  131, 130, 110, 168, 85, 124, 144, 113, 103, 119,
+  89, 109, 54, 131, 100, 118, 52, 67, 59, 105,
+  139, 71, 117, 92, 99, 85, 110, 94, 147, 113,
+  135, 106, 95, 90, 89, 130, 102, 112, 109, 146,
+  92, 113, 89, 136, 79, 118, 100, 95, 101, 102,
+  174, 107, 107, 70, 97, 95, 97, 44, 94, 147,
+  105, 52, 106, 100, 61, 94, 103, 88, 120, 150,
+  96, 148, 110, 83, 94, 68, 126, 92, 135, 92,
+  55, 78, 141, 120, 73, 93, 107, 137, 94, 119,
+  129, 88, 77, 136, 88, 136, 118, 211, 129, 145,
+  72, 115, 97, 84, 112, 90, 121, 73, 37, 215,
+  114, 95, 103, 115, 146, 78, 87, 142, 128, 96,
+  124, 149, 137, 118, 110, 129, 116, 139, 54, 131,
+  106, 78, 139, 107, 125, 89, 114, 90, 113, 211,
+  100, 123, 151, 170, 103, 163, 79, 121, 139, 123,
+  77, 106, 130, 124, 63, 117, 133, 79, 113, 99,
+  76, 154, 96, 113, 139, 120, 121, 152, 174, 140,
+  94, 126, 110, 73, 91, 109, 114, 89, 111, 171,
+  97, 122, 135, 79, 114, 94, 110, 106, 125, 142,
+  104, 157, 108, 207, 94, 109, 91, 123, 158, 117,
+  104, 155, 99, 95, 68, 145, 126, 123, 61, 74,
+  99, 170, 153, 92, 113, 79, 106, 75, 97, 128,
+  112, 155, 92, 96, 86, 68, 100, 144, 129, 103,
+  113, 162, 100, 126, 65, 137, 93, 141, 88, 125,
+  135, 98, 151, 95, 124, 70, 125, 140, 96, 61,
+  120, 105, 105, 68, 100, 118, 67, 83, 158, 97,
+  83, 122, 94, 139, 123, 97, 132, 112, 111, 110,
+  103, 114, 68, 134, 143, 112, 85, 81, 89, 154,
+  65, 96, 109, 75, 76, 91, 74, 92, 110, 146,
+  96, 110, 98, 100, 81, 85, 70, 80, 107, 108,
+  31, 116, 63, 61, 89, 99, 120, 88, 71, 96,
+  94, 102, 111, 134, 146, 162, 82, 115, 100, 107,
+  67, 95, 90, 77, 122, 79, 99, 95, 104, 122,
+  99, 154, 106, 113, 131, 122, 102, 105, 92, 110,
+  81, 96, 100, 68, 136, 91, 84, 112, 75, 96,
+  93, 156, 80, 123, 24, 111, 110, 106, 134, 126,
+  141, 120, 96, 103, 87, 78, 105, 71, 86, 104,
+  148, 166, 155, 110, 87, 60, 92, 94, 84, 91,
+  93, 81, 70, 146, 124, 138, 108, 98, 78, 113,
+  110, 126, 120, 107, 64, 88, 83, 100, 124, 90,
+  37, 80, 105, 138, 97, 137, 96, 79, 109, 140,
+  77, 120, 109, 104, 97, 78, 63, 88, 110, 121,
+  134, 85, 63, 145, 78, 124, 68, 100, 80, 81,
+  68, 88, 104, 104, 80, 107, 127, 108, 85, 117,
+  103, 93, 142, 116, 70, 95, 96, 193, 77, 121,
+  125, 90, 79, 99, 105, 132, 116, 106, 107, 108,
+  111, 103, 74, 104, 87, 131, 118, 90, 109, 107,
+  125, 126, 104, 118, 112, 120, 109, 67, 95, 97,
+  116, 115, 118, 86, 105, 105, 95, 86, 86, 101,
+  114, 103, 39, 132, 91, 73, 121, 95, 116, 102,
+  95, 94, 103, 138, 109, 93, 117, 89, 112, 102,
+  123, 86, 95, 84, 87, 128, 105, 97, 111, 117,
+  92, 147, 121, 115, 145, 95, 118, 86, 113, 96,
+  108, 93, 87, 110, 112, 87, 127, 124, 108, 102,
+  84, 131, 123, 104, 94, 109, 49, 92, 129, 92,
+  144, 102, 84, 110, 108, 91, 81, 106, 133, 104,
+  97, 104, 147, 154, 211, 103, 102, 99, 115, 139,
+  107, 112, 98, 90, 91, 69, 128, 105, 119, 111,
+  94, 108, 101, 130, 133, 87, 116, 98, 108, 86,
+  116, 70, 57, 81, 97, 90, 112, 117, 163, 115,
+  90, 96, 127, 115, 136, 102, 109, 85, 95, 127,
+  94, 95, 87, 94, 93, 96, 73, 114, 119, 98,
+  93, 110, 63, 156, 101, 90, 72, 101, 99, 90,
+  73, 113, 112, 94, 153, 120, 75, 145, 117, 161,
+  114, 115, 90, 91, 97, 98, 97, 101, 90, 138,
+  84, 83, 88, 91, 80, 85, 110, 108, 152, 105,
+  115, 121, 98, 97, 99, 126, 116, 109, 126, 97,
+  119, 111, 99, 95, 129, 112, 110, 95, 82, 84,
+  98, 75, 107, 95, 28, 119, 107, 102, 124, 94,
+  96, 101, 130, 85, 95, 133, 118, 82, 94, 86,
+  74, 88, 143, 92, 117, 116, 85, 154, 91, 119,
+  121, 116, 100, 132, 121, 81, 115, 135, 89, 79,
+  117, 87, 128, 116, 76, 106, 95, 86, 119, 155,
+  107, 105, 93, 141, 124, 86, 88, 118, 100, 85,
+  127, 94, 131, 85, 59, 92, 115, 101, 65, 132,
+  121, 144, 101, 97, 102, 105, 136, 106, 94, 102,
+  120, 151, 108, 105, 105, 72, 110, 106, 133, 100,
+  124, 90, 72, 102, 103, 123, 110, 64, 118, 91,
+  152, 99, 118, 93, 58, 79, 125, 107, 111, 90,
+  124, 113, 99, 113, 154, 119, 97, 98, 96, 82,
+  81, 132, 105, 111, 78, 92, 132, 109, 89, 103,
+  105, 99, 85, 109, 46, 131, 94, 90, 89, 102,
+  64, 111, 92, 107, 92, 105, 131, 113, 59, 102,
+  105, 79, 109, 71, 92, 87, 107, 108, 105, 126,
+  82, 145, 88, 80, 80, 106, 65, 94, 105, 69,
+  151, 115, 119, 105, 105, 110, 60, 113, 74, 111,
+  101, 119, 100, 104, 95, 107, 92, 97, 94, 103,
+  73, 76, 94, 49, 100, 91, 40, 108, 112, 89,
+  85, 75, 77, 98, 147, 86, 109, 97, 109, 70,
+  112, 124, 62, 71, 116, 76, 101, 94, 97, 150,
+  88, 117, 122, 114, 99, 137, 126, 108, 113, 101,
+  108, 92, 95, 97, 105, 139, 48, 80, 98, 100,
+  114, 134, 96, 104, 81, 104, 102, 131, 97, 109,
+  122, 65, 95, 77, 153, 96, 51, 65, 123, 106,
+  55, 114, 103, 131, 86, 84, 94, 91, 121, 68,
+  92, 92, 84, 119, 94, 99, 105, 51, 81, 106,
+  116, 91, 116, 96, 103, 87, 101, 118, 88, 57,
+  82, 95, 124, 112, 117, 120, 42, 73, 112, 127,
+  89, 67, 80, 77, 81, 106, 111, 110, 117, 90,
+  86, 106, 86, 138, 112, 135, 91, 81, 121, 155,
+  83, 100, 59, 121, 41, 75, 66, 101, 72, 107,
+  99, 112, 81, 106, 87, 78, 116, 69, 99, 129,
+  56, 40, 97, 82, 74, 112, 77, 96, 101, 131,
+  83, 166, 99, 121, 109, 62, 98, 118, 46, 89,
+  82, 51, 117, 95, 149, 101, 109, 115, 70, 123,
+  79, 116, 85, 122, 80, 117, 105, 142, 95, 90,
+  106, 103, 78, 86, 104, 44, 92, 78, 57, 125,
+  132, 99, 86, 86, 99, 111, 109, 139, 129, 69,
+  98, 75, 126, 119, 103, 79, 100, 58, 75, 106,
+  98, 131, 105, 105, 129, 90, 75, 118, 112, 139,
+  122, 57, 168, 118, 77, 140, 94, 126, 89, 133,
+  105, 134, 104, 104, 106, 77, 102, 98, 108, 142,
+  123, 125, 129, 64, 69, 83, 128, 93, 70, 72,
+  134, 153, 74, 92, 105, 69, 93, 70, 92, 120,
+  136, 79, 110, 125, 116, 98, 130, 110, 107, 91,
+  83, 73, 80, 109, 130, 129, 114, 83, 102, 97,
+  102, 103, 76, 106, 85, 126, 98, 136, 50, 85,
+  83, 120, 109, 67, 88, 54, 55, 89, 78, 120,
+  143, 117, 85, 117, 104, 158, 121, 156, 103, 97,
+  104, 171, 81, 96, 73, 114, 45, 110, 72, 116,
+  82, 117, 113, 92, 81, 48, 103, 69, 98, 63,
+  92, 94, 76, 30, 91, 84, 64, 96, 69, 96,
+  75, 149, 70, 162, 115, 131, 121, 59, 128, 94,
+  75, 90, 96, 89, 102, 86, 162, 103, 93, 106,
+  100, 133, 96, 115, 99, 102, 92, 126, 115, 146,
+  90, 77, 113, 105, 94, 101, 106, 92, 98, 106,
+  92, 129, 155, 105, 102, 108, 129, 127, 47, 157,
+  132, 95, 89, 111, 127, 85, 137, 108, 100, 38,
+  80, 90, 103, 109, 108, 112, 119, 93, 80, 101,
+  95, 150, 129, 86, 167, 114, 100, 127, 124, 113,
+  139, 170, 129, 126, 105, 109, 97, 85, 97, 100,
+  115, 122, 192, 124, 130, 104, 70, 102, 103, 78,
+  106, 112, 140, 174, 94, 91, 102, 66, 119, 81,
+  112, 105, 145, 98, 113, 141, 150, 99, 150, 120,
+  101, 120, 104, 109, 93, 111, 129, 140, 101, 79,
+  96, 91, 127, 128, 83, 117, 81, 133, 93, 130,
+  74, 131, 74, 119, 126, 109, 115, 75, 111, 117,
+  76, 108, 162, 116, 105, 115, 127, 160, 128, 159,
+  117, 108, 100, 157, 96, 105, 85, 93, 88, 132,
+  65, 118, 95, 98, 115, 94, 109, 38, 116, 95,
+  123, 96, 94, 90, 102, 74, 100, 118, 86, 102,
+  103, 107, 83, 137, 79, 131, 110, 148, 143, 75,
+  135, 92, 99, 81, 118, 124, 105, 122, 155, 104,
+  109, 112, 103, 132, 122, 113, 136, 107, 113, 124,
+  104, 110, 130, 128, 111, 115, 132, 106, 122, 121,
+  141, 87, 89, 96, 119, 124, 135, 109, 138, 87,
+  114, 118, 105, 149, 102, 69, 90, 112, 138, 107,
+  135, 92, 119, 81, 83, 129, 119, 104, 107, 114,
+  79, 141, 130, 105, 139, 159, 106, 83, 115, 97,
+  131, 140, 136, 139, 98, 99, 121, 118, 109, 106,
+  123, 129, 125, 101, 160, 134, 81, 119, 108, 95,
+  79, 120, 104, 123, 110, 127, 97, 118, 112, 147,
+  109, 110, 102, 121, 83, 118, 138, 120, 159, 103,
+  139, 129, 133, 89, 137, 115, 118, 104, 139, 90,
+  66, 109, 103, 101, 109, 125, 108, 111, 121, 122,
+  97, 104, 101, 115, 86, 109, 119, 111, 123, 120,
+  111, 130, 122, 73, 125, 113, 106, 159, 73, 120,
+  111, 110, 111, 115, 130, 92, 131, 110, 109, 110,
+  129, 116, 55, 100, 112, 94, 98, 93, 82, 112,
+  137, 103, 88, 111, 119, 114, 113, 125, 114, 94,
+  119, 98, 83, 97, 112, 103, 101, 111, 87, 142,
+  113, 109, 126, 106, 106, 81, 97, 103, 107, 101,
+  165, 99, 135, 101, 76, 112, 122, 112, 135, 125,
+  91, 118, 90, 126, 109, 114, 106, 116, 123, 95,
+  114, 126, 133, 99, 80, 69, 29, 110, 143, 89,
+  98, 81, 133, 75, 83, 103, 80, 98, 104, 102,
+  123, 78, 119, 128, 123, 68, 69, 174, 89, 109,
+  100, 132, 63, 99, 107, 115, 147, 157, 66, 94,
+  102, 91, 122, 144, 106, 100, 106, 106, 109, 96,
+  101, 93, 120, 106, 119, 111, 99, 131, 83, 93,
+  90, 99, 99, 105, 100, 139, 104, 133, 90, 110,
+  122, 143, 99, 82, 98, 109, 95, 102, 106, 107,
+  150, 118, 151, 131, 146, 90, 123, 139, 95, 119,
+  141, 92, 69, 110, 75, 105, 111, 116, 106, 100,
+  116, 157, 99, 76, 81, 125, 56, 133, 96, 118,
+  141, 58, 121, 115, 117, 83, 128, 107, 103, 190,
+  109, 76, 130, 135, 125, 92, 114, 129, 133, 101,
+  111, 142, 109, 106, 86, 70, 122, 92, 74, 105,
+  149, 142, 106, 86, 120, 105, 96, 129, 91, 76,
+  101, 104, 90, 134, 85, 83, 104, 96, 98, 90,
+  100, 130, 109, 102, 109, 99, 102, 93, 99, 102,
+  88, 133, 138, 98, 157, 128, 80, 95, 137, 128,
+  97, 110, 88, 120, 97, 150, 123, 134, 106, 122,
+  139, 91, 123, 80, 125, 104, 74, 92, 35, 106,
+  144, 99, 95, 103, 116, 75, 95, 100, 79, 129,
+  125, 83, 108, 95, 108, 127, 83, 141, 80, 185,
+  118, 131, 105, 113, 94, 75, 88, 131, 126, 92,
+  67, 98, 91, 93, 107, 107, 91, 83, 112, 127,
+  112, 115, 85, 104, 101, 89, 126, 85, 81, 124,
+  87, 104, 109, 84, 122, 66, 103, 126, 97, 140,
+  96, 99, 109, 114, 106, 79, 121, 106, 107, 104,
+  115, 82, 143, 113, 159, 132, 134, 112, 109, 170,
+  85, 114, 114, 102, 76, 101, 86, 118, 105, 129,
+  115, 99, 102, 172, 113, 74, 69, 107, 80, 122,
+  119, 85, 162, 56, 118, 82, 121, 172, 107, 120,
+  77, 194, 126, 75, 141, 156, 139, 89, 119, 170,
+  124, 104, 59, 112, 89, 125, 103, 97, 135, 105,
+  78, 121, 114, 130, 89, 106, 107, 103, 121, 137,
+  90, 61, 99, 117, 79, 85, 131, 84, 103, 87,
+  108, 78, 96, 128, 126, 119, 84, 86, 80, 104,
+  106, 112, 97, 119, 155, 65, 83, 116, 75, 89,
+  110, 150, 83, 83, 69, 93, 64, 81, 89, 83,
+  105, 110, 119, 86, 100, 109, 113, 138, 41, 62,
+  32, 93, 123, 79, 115, 91, 121, 58, 93, 103,
+  64, 105, 121, 113, 73, 79, 82, 84, 92, 80,
+  59, 159, 100, 99, 89, 114, 76, 91, 86, 102,
+  100, 73, 80, 102, 101, 62, 108, 117, 69, 76,
+  89, 108, 91, 81, 75, 88, 63, 81, 104, 147,
+  86, 113, 70, 104, 94, 80, 113, 70, 66, 71,
+  88, 127, 59, 85, 110, 101, 89, 67, 122, 113,
+  124, 94, 88, 75, 112, 85, 106, 109, 122, 69,
+  74, 121, 87, 107, 119, 85, 75, 99, 57, 102,
+  108, 110, 92, 96, 101, 127, 111, 82, 52, 91,
+  67, 94, 67, 99, 97, 77, 95, 105, 109, 139,
+  84, 102, 91, 167, 76, 75, 112, 118, 108, 78,
+  94, 127, 95, 86, 46, 95, 69, 89, 62, 62,
+  96, 81, 39, 127, 60, 99, 78, 61, 109, 107,
+  122, 103, 89, 52, 88, 149, 83, 121, 76, 72,
+  87, 89, 134, 90, 80, 129, 92, 93, 96, 72,
+  59, 73, 110, 96, 64, 81, 182, 79, 121, 87,
+  136, 132, 123, 124, 98, 108, 82, 110, 71, 112,
+  105, 74, 95, 90, 120, 94, 112, 96, 114, 82,
+  50, 105, 77, 106, 148, 101, 139, 96, 93, 118,
+  113, 101, 81, 81, 86, 91, 123, 106, 107, 111,
+  95, 83, 54, 153, 101, 100, 99, 125, 62, 80,
+  70, 109, 113, 71, 138, 77, 94, 95, 139, 106,
+  126, 153, 99, 132, 112, 97, 105, 66, 84, 127,
+  133, 94, 107, 126, 93, 83, 91, 98, 98, 80,
+  60, 128, 102, 160, 83, 96, 115, 68, 104, 73,
+  75, 107, 124, 97, 121, 126, 146, 135, 129, 123,
+  98, 101, 95, 60, 94, 102, 110, 92, 61, 102,
+  84, 98, 106, 114, 121, 88, 96, 119, 106, 84,
+  61, 87, 85, 100, 142, 75, 166, 92, 91, 79,
+  104, 87, 134, 125, 92, 143, 126, 105, 106, 104,
+  74, 102, 108, 107, 90, 92, 108, 116, 96, 142,
+  54, 140, 118, 71, 74, 82, 82, 30, 71, 103,
+  82, 108, 97, 84, 124, 101, 80, 116, 87, 68,
+  89, 79, 91, 92, 107, 95, 68, 171, 87, 61,
+  87, 79, 73, 73, 120, 112, 86, 98, 162, 62,
+  97, 79, 95, 138, 124, 98, 110, 116, 76, 101,
+  73, 120, 105, 98, 76, 91, 116, 80, 109, 107,
+  107, 96, 45, 115, 79, 107, 134, 90, 124, 90,
+  98, 95, 77, 100, 69, 95, 99, 90, 90, 106,
+  97, 123, 93, 70, 52, 130, 121, 122, 92, 105,
+  64, 95, 88, 103, 114, 128, 124, 97, 92, 83,
+  191, 149, 122, 152, 96, 148, 127, 83, 111, 88,
+  99, 124, 135, 99, 80, 116, 108, 95, 84, 94,
+  124, 78, 75, 128, 111, 149, 90, 85, 94, 118,
+  103, 81, 82, 73, 79, 100, 133, 119, 129, 146,
+  107, 126, 96, 101, 94, 139, 106, 103, 120, 99,
+  74, 101, 74, 107, 116, 101, 111, 86, 116, 104,
+  114, 87, 37, 101, 77, 126, 120, 135, 140, 89,
+  105, 116, 107, 85, 102, 126, 106, 93, 149, 90,
+  109, 112, 91, 99, 100, 105, 73, 81, 78, 97,
+  91, 116, 78, 103, 101, 69, 63, 71, 130, 44,
+  78, 94, 110, 97, 88, 111, 117, 76, 74, 88,
+  84, 95, 85, 75, 94, 77, 139, 123, 73, 138,
+  90, 65, 90, 84, 83, 86, 94, 112, 94, 137,
+  113, 73, 133, 115, 46, 106, 137, 141, 126, 99,
+  73, 118, 89, 151, 88, 101, 83, 97, 123, 77,
+  121, 112, 104, 90, 58, 95, 68, 95, 131, 99,
+  103, 127, 93, 80, 83, 134, 60, 134, 160, 85,
+  98, 103, 105, 119, 73, 107, 102, 138, 151, 134,
+  103, 134, 99, 100, 93, 116, 140, 154, 96, 113,
+  92, 92, 131, 147, 81, 91, 106, 120, 108, 120,
+  87, 125, 117, 95, 120, 132, 90, 97, 109, 108,
+  100, 86, 148, 66, 97, 86, 121, 149, 104, 87,
+  114, 137, 90, 106, 120, 87, 77, 109, 109, 67,
+  107, 131, 126, 105, 117, 122, 97, 119, 93, 114,
+  116, 109, 98, 116, 96, 111, 103, 113, 111, 116,
+  92, 131, 126, 57, 50, 104, 89, 124, 121, 126,
+  140, 85, 132, 105, 118, 134, 85, 128, 100, 81,
+  135, 93, 138, 158, 136, 83, 98, 135, 96, 112,
+  87, 107, 69, 83, 157, 93, 103, 110, 81, 106,
+  117, 125, 86, 127, 131, 111, 120, 149, 80, 78,
+  102, 96, 80, 138, 122, 79, 94, 78, 146, 130,
+  95, 89, 121, 87, 82, 76, 71, 119, 85, 93,
+  95, 120, 91, 78, 111, 115, 84, 111, 161, 143,
+  138, 103, 81, 114, 97, 153, 110, 108, 98, 93,
+  116, 105, 115, 125, 102, 132, 75, 117, 74, 92,
+  136, 97, 116, 125, 118, 78, 114, 144, 86, 138,
+  162, 99, 87, 106, 125, 109, 85, 125, 103, 132,
+  149, 138, 93, 128, 109, 94, 83, 135, 116, 96,
+  82, 98, 120, 89, 100, 101, 135, 119, 130, 92,
+  96, 144, 103, 122, 119, 78, 129, 119, 84, 97,
+  92, 109, 92, 96, 103, 60, 110, 130, 105, 139,
+  101, 105, 122, 120, 102, 102, 143, 100, 153, 115,
+  107, 60, 146, 117, 122, 102, 161, 138, 125, 132,
+  91, 114, 112, 136, 76, 124, 113, 118, 83, 139,
+  109, 119, 88, 129, 135, 84, 68, 100, 83, 87,
+  124, 81, 127, 114, 147, 109, 103, 142, 115, 117,
+  107, 78, 125, 114, 150, 146, 133, 103, 130, 109,
+  91, 107, 72, 100, 106, 98, 74, 105, 117, 107,
+  81, 151, 67, 132, 85, 109, 123, 127, 113, 129,
+  106, 98, 117, 140, 97, 138, 131, 109, 128, 92,
+  104, 117, 98, 91, 144, 120, 87, 79, 93, 93,
+  84, 89, 82, 112, 90, 87, 103, 104, 147, 134,
+  134, 130, 128, 144, 87, 105, 78, 127, 109, 101,
+  106, 98, 110, 116, 103, 147, 103, 127, 70, 132,
+  87, 91, 129, 83, 105, 75, 136, 72, 89, 119,
+  107, 113, 118, 96, 79, 100, 135, 81, 124, 86,
+  78, 141, 142, 107, 76, 135, 88, 119, 75, 88,
+  100, 122, 96, 141, 123, 93, 120, 93, 131, 105,
+  106, 107, 89, 130, 116, 99, 123, 100, 128, 117,
+  91, 106, 77, 90, 99, 102, 94, 81, 60, 135,
+  108, 125, 98, 120, 137, 107, 105, 94, 119, 123,
+  138, 112, 99, 109, 122, 119, 79, 118, 167, 110,
+  124, 95, 151, 123, 128, 104, 104, 131, 131, 100,
+  87, 105, 119, 101, 103, 108, 137, 83, 97, 61,
+  86, 83, 107, 76, 81, 141, 130, 123, 106, 85,
+  127, 114, 99, 65, 107, 107, 113, 102, 106, 105,
+  126, 95, 97, 100, 90, 151, 125, 117, 63, 86,
+  105, 84, 90, 152, 93, 111, 90, 91, 109, 143,
+  91, 111, 106, 83, 100, 154, 96, 128, 98, 118,
+  135, 96, 106, 126, 96, 105, 123, 116, 109, 78,
+  93, 83, 102, 103, 99, 116, 102, 93, 100, 116,
+  189, 162, 113, 131, 101, 144, 86, 106, 86, 154,
+  97, 105, 92, 111, 107, 116, 116, 99, 110, 97,
+  74, 162, 91, 90, 123, 84, 114, 68, 122, 84,
+  91, 87, 115, 111, 88, 79, 82, 113, 115, 77,
+  139, 96, 76, 175, 130, 100, 100, 132, 60, 129,
+  69, 101, 111, 115, 103, 145, 113, 100, 107, 102,
+  134, 106, 104, 135, 86, 110, 93, 86, 117, 117,
+  129, 95, 103, 126, 90, 89, 116, 98, 118, 88,
+  59, 101, 112, 138, 108, 100, 118, 97, 95, 96,
+  86, 127, 98, 108, 112, 147, 117, 117, 85, 122,
+  123, 100, 110, 77, 161, 103, 128, 114, 114, 124,
+  160, 99, 78, 83, 131, 92, 101, 124, 127, 76,
+  97, 45, 92, 95, 114, 64, 74, 122, 97, 93,
+  103, 101, 135, 110, 84, 70, 91, 116, 108, 114,
+  106, 104, 107, 99, 120, 95, 99, 173, 112, 124,
+  80, 95, 119, 94, 135, 119, 94, 101, 88, 96,
+  114, 120, 95, 109, 107, 59, 90, 117, 64, 107,
+  113, 105, 123, 96, 95, 126, 99, 115, 128, 112,
+  102, 61, 105, 109, 104, 146, 106, 117, 92, 92,
+  95, 116, 182, 174, 113, 134, 101, 139, 83, 102,
+  102, 185, 90, 111, 96, 110, 106, 124, 107, 77,
+  119, 89, 72, 170, 82, 105, 126, 92, 127, 69,
+  107, 98, 101, 72, 117, 136, 76, 71, 89, 125,
+  112, 68, 144, 104, 74, 175, 128, 108, 107, 100,
+  68, 102, 68, 118, 109, 96, 104, 156, 103, 111,
+  109, 98, 150, 122, 116, 132, 88, 82, 71, 80,
+  111, 100, 139, 86, 114, 145, 133, 124, 114, 99,
+  104, 83, 85, 97, 103, 152, 129, 89, 100, 112,
+  91, 95, 84, 105, 84, 119, 124, 150, 120, 109,
+  109, 105, 109, 93, 113, 99, 150, 120, 130, 113,
+  105, 132, 169, 94, 72, 98, 146, 76, 108, 136,
+  126, 77, 93, 64, 89, 104, 122, 63, 69, 111,
+  74, 67, 92, 140, 136, 119, 70, 62, 107, 111,
+  115, 133, 117, 103, 101, 104, 127, 98, 111, 145,
+  111, 126, 73, 115, 136, 94, 155, 109, 89, 94,
+  94, 102, 97, 101, 92, 85, 114, 55, 92, 98,
+  63, 86, 130, 92, 108, 98, 101, 111, 101, 117,
+  138, 120, 71, 67, 105, 112, 119, 180, 118, 124,
+  89, 82, 87, 106, 152, 164, 112, 119, 103, 128,
+  84, 82, 96, 178, 94, 116, 114, 126, 96, 122,
+  78, 85, 106, 101, 69, 149, 81, 125, 120, 91,
+  112, 90, 114, 94, 103, 78, 107, 138, 85, 77,
+  92, 131, 115, 56, 141, 122, 78, 137, 132, 109,
+  90, 95, 84, 91, 75, 113, 102, 102, 89, 151,
+  81, 108, 124, 101, 144, 111, 118, 131, 95, 82,
+  82, 67, 107, 92, 133, 92, 98, 149, 179, 164,
+  105, 96, 93, 81, 96, 81, 90, 141, 125, 97,
+  118, 129, 104, 94, 78, 78, 92, 129, 122, 135,
+  105, 124, 108, 93, 96, 103, 113, 113, 144, 128,
+  119, 101, 118, 128, 153, 91, 76, 102, 144, 62,
+  124, 122, 141, 89, 93, 91, 93, 120, 117, 85,
+  79, 111, 84, 80, 92, 134, 130, 116, 62, 50,
+  133, 109, 113, 128, 119, 100, 94, 98, 102, 113,
+  114, 141, 108, 119, 83, 115, 131, 90, 141, 116,
+  103, 96, 108, 103, 113, 106, 73, 73, 123, 58,
+  101, 110, 79, 92, 131, 109, 116, 108, 100, 123,
+  106, 112, 145, 117, 57, 97, 100, 99, 112, 185,
+  106, 122, 90, 73, 92, 98, 121, 136, 108, 109,
+  98, 110, 91, 65, 65, 155, 110, 110, 122, 130,
+  72, 113, 62, 106, 91, 114, 62, 119, 97, 126,
+  102, 85, 99, 113, 131, 108, 100, 90, 109, 125,
+  111, 90, 95, 127, 114, 66, 137, 123, 91, 97,
+  138, 105, 71, 95, 96, 97, 94, 101, 96, 106,
+  94, 146, 80, 101, 128, 115, 131, 102, 115, 144,
+  94, 99, 105, 82, 106, 85, 121, 122, 85, 139,
+  165, 182, 97, 84, 81, 98, 88, 84, 81, 133,
+  119, 129, 150, 114, 129, 86, 62, 95, 101, 130,
+  109, 115, 98, 112, 101, 79, 97, 101, 103, 104,
+  129, 143, 112, 95, 108, 131, 121, 93, 81, 113,
+  130, 72, 131, 99, 139, 103, 83, 105, 98, 115,
+  114, 99, 75, 99, 95, 112, 94, 104, 104, 105,
+  64, 44, 122, 114, 112, 121, 120, 94, 76, 98,
+  95, 125, 99, 161, 105, 109, 99, 100, 120, 91,
+  120, 127, 99, 90, 125, 91, 131, 121, 64, 72,
+  118, 57, 115, 109, 89, 100, 133, 120, 125, 117,
+  110, 129, 106, 103, 142, 121, 76, 123, 100, 84,
+  107, 181, 81, 100, 90, 85, 99, 85, 120, 136,
+  113, 121, 89, 117, 100, 67, 65, 164, 105, 97,
+  136, 125, 52, 104, 57, 126, 83, 108, 67, 123,
+  91, 114, 111, 93, 100, 94, 108, 125, 90, 89,
+  106, 114, 119, 78, 102, 131, 112, 75, 123, 105,
+  96, 79, 135, 110, 60, 104, 97, 105, 96, 99,
+  101, 100, 107, 138, 83, 103, 104, 109, 147, 115,
+  102, 138, 102, 113, 115, 88, 97, 86, 114, 109,
+  96, 117, 125, 184, 94, 82, 83, 120, 94, 104,
+  67, 139, 116, 157, 147, 99, 131, 81, 62, 123,
+  115, 122, 97, 96, 110, 99, 101, 73, 97, 108,
+  102, 89, 125, 135, 106, 111, 103, 130, 108, 82,
+  85, 116, 134, 79, 138, 101, 154, 92, 83, 99,
+  101, 107, 133, 75, 81, 95, 103, 121, 105, 95,
+  92, 90, 64, 40, 99, 115, 111, 133, 119, 94,
+  75, 99, 95, 128, 83, 155, 113, 106, 119, 112,
+  140, 94, 114, 127, 96, 68, 120, 105, 127, 127,
+  66, 91, 114, 71, 119, 104, 89, 99, 167, 114,
+  126, 99, 116, 105, 110, 103, 145, 126, 93, 138,
+  120, 73, 117, 176, 92, 102, 92, 104, 90, 90,
+  135, 146, 135, 99, 88, 123, 116, 79, 84, 170,
+  114, 100, 132, 127, 67, 117, 50, 127, 82, 105,
+  74, 127, 99, 100, 128, 103, 107, 74, 91, 129,
+  80, 87, 100, 117, 100, 81, 93, 143, 117, 56,
+  127, 111, 89, 80, 121, 121, 65, 104, 92, 105,
+  95, 84, 105, 121, 101, 133, 82, 108, 74, 103,
+  151, 122, 85, 128, 99, 106, 115, 84, 98, 91,
+  111, 88, 83, 116, 120, 176, 86, 90, 68, 121,
+  112, 133, 56, 140, 105, 160, 133, 111, 118, 88,
+  62, 110, 124, 124, 82, 92, 120, 105, 108, 88,
+  92, 108, 107, 103, 129, 119, 98, 103, 112, 137,
+  113, 89, 89, 114, 135, 84, 146, 113, 181, 90,
+  86, 98, 112, 116, 134, 72, 89, 104, 108, 113,
+  98, 95, 98, 76, 61, 42, 105, 119, 112, 139,
+  122, 106, 91, 100, 105, 127, 81, 139, 132, 114,
+  98, 108, 145, 91, 116, 118, 100, 77, 121, 132,
+  103, 139, 77, 99, 106, 70, 122, 117, 97, 70,
+  170, 117, 119, 77, 147, 100, 104, 110, 149, 128,
+  90, 139, 113, 74, 117, 176, 97, 127, 88, 119,
+  93, 114, 137, 129, 132, 103, 88, 104, 117, 89,
+  80, 158, 131, 133, 123, 122, 86, 120, 50, 103,
+  72, 106, 69, 118, 92, 82, 144, 92, 98, 83,
+  105, 124, 86, 88, 105, 107, 104, 92, 88, 142,
+  132, 43, 135, 107, 72, 85, 120, 115, 71, 133,
+  87, 106, 90, 74, 105, 139, 92, 158, 107, 109,
+  89, 114, 135, 112, 98, 131, 99, 106, 97, 79,
+  101, 97, 114, 101, 80, 115, 104, 157, 91, 91,
+  78, 111, 91, 136, 47, 125, 99, 131, 125, 97,
+  91, 90, 67, 121, 111, 117, 106, 93, 119, 96,
+  94, 114, 82, 105, 109, 113, 137, 141, 105, 91,
+  119, 137, 108, 89, 98, 106, 132, 91, 145, 132,
+  190, 87, 83, 96, 118, 113, 120, 85, 85, 103,
+  95, 123, 88, 85, 67, 75, 72, 45, 93, 151,
+  115, 125, 122, 110, 97, 108, 108, 116, 87, 147,
+  132, 130, 74, 96, 130, 95, 111, 128, 119, 92,
+  113, 125, 100, 153, 88, 96, 102, 58, 129, 119,
+  98, 102, 145, 124, 119, 73, 168, 120, 112, 105,
+  132, 129, 82, 136, 99, 90, 107, 175, 80, 114,
+  84, 125, 98, 137, 144, 147, 119, 105, 101, 93,
+  140, 96, 98, 165, 121, 150, 122, 122, 100, 99,
+  61, 84, 100, 62, 61, 152, 96, 82, 139, 94,
+  112, 70, 103, 125, 95, 96, 101, 105, 81, 86,
+  104, 146, 139, 62, 110, 99, 82, 103, 122, 110,
+  85, 163, 85, 140, 99, 113, 119, 150, 96, 135,
+  139, 122, 114, 125, 137, 111, 121, 132, 107, 134,
+  87, 91, 111, 90, 111, 84, 93, 106, 68, 116,
+  91, 106, 92, 122, 113, 123, 49, 128, 108, 113,
+  113, 96, 78, 94, 69, 116, 104, 89, 155, 102,
+  133, 98, 78, 155, 98, 111, 129, 97, 200, 127,
+  107, 98, 97, 127, 135, 100, 105, 110, 102, 93,
+  138, 140, 158, 79, 67, 68, 124, 112, 126, 68,
+  109, 118, 101, 132, 100, 81, 65, 82, 92, 52,
+  92, 182, 97, 119, 119, 126, 126, 116, 119, 126,
+  103, 164, 128, 123, 70, 96, 102, 101, 130, 130,
+  132, 81, 109, 133, 116, 145, 86, 126, 102, 57,
+  105, 125, 90, 128, 138, 120, 137, 82, 141, 150,
+  114, 110, 112, 109, 78, 124, 96, 107, 94, 167,
+  86, 99, 76, 127, 117, 161, 123, 141, 102, 89,
+  114, 90, 146, 100, 113, 166, 132, 154, 105, 135,
+  110, 81, 78, 78, 126, 70, 49, 168, 111, 81,
+  116, 83, 101, 75, 119, 112, 83, 102, 100, 100,
+  81, 97, 114, 130, 146, 97, 93, 106, 97, 118,
+  113, 107, 94, 129, 79, 167, 112, 166, 130, 141,
+  116, 153, 169, 149, 120, 125, 124, 101, 130, 142,
+  125, 136, 96, 96, 120, 91, 100, 85, 87, 100,
+  62, 98, 113, 109, 113, 147, 119, 84, 71, 113,
+  118, 104, 95, 98, 80, 85, 84, 118, 109, 78,
+  159, 116, 127, 108, 79, 162, 109, 83, 124, 102,
+  213, 104, 115, 131, 89, 140, 149, 122, 101, 115,
+  101, 95, 113, 122, 124, 64, 59, 75, 128, 121,
+  136, 88, 128, 114, 93, 121, 111, 100, 90, 106,
+  112, 72, 98, 150, 80, 109, 113, 122, 138, 119,
+  120, 130, 107, 151, 104, 113, 105, 102, 87, 109,
+  153, 122, 161, 79, 106, 125, 110, 106, 97, 149,
+  102, 60, 86, 116, 78, 118, 113, 100, 141, 110,
+  134, 155, 117, 103, 94, 80, 72, 115, 107, 104,
+  82, 134, 119, 101, 73, 119, 113, 154, 111, 124,
+  103, 98, 117, 106, 129, 99, 104, 170, 120, 131,
+  71, 113, 87, 63, 78, 70, 148, 104, 30, 164,
+  121, 96, 89, 86, 95, 79, 127, 101, 69, 103,
+  96, 95, 102, 92, 113, 109, 135, 99, 74, 125,
+  123, 119, 113, 119, 96, 81, 75, 165, 109, 178,
+  125, 116, 136, 173, 186, 159, 93, 112, 107, 105,
+  121, 118, 126, 123, 117, 81, 121, 95, 89, 101,
+  86, 117, 80, 105, 122, 123, 104, 146, 106, 71,
+  85, 112, 119, 95, 91, 111, 86, 75, 100, 135,
+  129, 91, 134, 118, 101, 86, 102, 129, 122, 82,
+  99, 103, 195, 90, 120, 164, 79, 157, 138, 147,
+  108, 103, 107, 129, 97, 103, 118, 66, 44, 73,
+  115, 106, 140, 88, 140, 87, 68, 90, 131, 124,
+  110, 127, 117, 75, 81, 105, 75, 118, 114, 116,
+  130, 141, 106, 130, 114, 129, 83, 97, 118, 92,
+  99, 103, 166, 107, 135, 72, 79, 104, 102, 89,
+  106, 162, 92, 51, 92, 85, 71, 103, 99, 72,
+  135, 138, 146, 152, 115, 87, 79, 53, 104, 105,
+  123, 99, 73, 82, 134, 93, 82, 97, 130, 124,
+  119, 121, 133, 105, 125, 135, 104, 121, 90, 192,
+  114, 109, 74, 95, 98, 60, 93, 74, 175, 86,
+  26, 192, 122, 117, 99, 116, 111, 60, 88, 123,
+  77, 102, 91, 114, 115, 100, 112, 115, 128, 96,
+  76, 149, 114, 125, 133, 136, 98, 68, 85, 123,
+  109, 167, 111, 96, 148, 181, 133, 166, 55, 90,
+  116, 129, 89, 121, 101, 107, 106, 72, 139, 97,
+  105, 95, 95, 132, 99, 124, 133, 122, 93, 150,
+  120, 106, 88, 143, 123, 106, 70, 129, 98, 63,
+  93, 135, 136, 118, 117, 121, 119, 93, 120, 120,
+  132, 124, 88, 118, 156, 126, 117, 150, 77, 171,
+  142, 143, 116, 117, 125, 115, 82, 107, 133, 82,
+  58, 67, 92, 95, 144, 76, 152, 77, 62, 34,
+  144, 159, 144, 149, 99, 90, 105, 100, 94, 135,
+  110, 103, 131, 157, 104, 134, 115, 111, 89, 118,
+  120, 96, 128, 100, 172, 80, 96, 58, 95, 112,
+  82, 68, 100, 148, 95, 43, 116, 84, 69, 91,
+  103, 63, 100, 148, 152, 148, 114, 83, 84, 57,
+  113, 114, 142, 109, 75, 77, 150, 115, 76, 82,
+  90, 131, 116, 109, 160, 108, 125, 153, 82, 144,
+  71, 203, 127, 130, 82, 96, 132, 88, 90, 95,
+  125, 86, 38, 216, 96, 125, 118, 124, 127, 49,
+  61, 148, 98, 107, 89, 137, 132, 125, 105, 148,
+  122, 130, 85, 135, 90, 113, 141, 113, 92, 89,
+  108, 93, 107, 151, 105, 110, 146, 178, 103, 156,
+  68, 100, 138, 145, 93, 114, 105, 99, 114, 111,
+  149, 95, 116, 113, 87, 150, 108, 148, 124, 118,
+  81, 161, 137, 152, 92, 158, 134, 106, 64, 115,
+  102, 61, 87, 138, 102, 128, 129, 109, 128, 76,
+  99, 121, 135, 144, 108, 137, 123, 163, 109, 102,
+  66, 159, 144, 120, 115, 135, 125, 76, 87, 115,
+  133, 118, 77, 89, 83, 118, 141, 88, 111, 87,
+  99, 72, 123, 148, 125, 160, 84, 73, 122, 82,
+  114, 142, 108, 109, 134, 151, 90, 126, 92, 105,
+  108, 149, 86, 92, 155, 88, 154, 78, 115, 65,
+  128, 123, 76, 58, 94, 95, 103, 44, 131, 112,
+  77, 93, 116, 98, 78, 133, 138, 131, 114, 90,
+  93, 108, 107, 120, 130, 99, 76, 125, 157, 140,
+  71, 76, 101, 139, 89, 101, 149, 79, 101, 138,
+  93, 134, 92, 171, 140, 164, 91, 132, 126, 103,
+  76, 104, 96, 78, 57, 183, 100, 83, 113, 106,
+  117, 87, 77, 130, 88, 113, 97, 149, 143, 145,
+  98, 163, 128, 148, 73, 98, 50, 98, 142, 86,
+  71, 101, 123, 127, 112, 132, 119, 126, 119, 137,
+  94, 126, 89, 113, 127, 131, 91, 104, 112, 94,
+  98, 124, 124, 93, 102, 126, 68, 139, 78, 152,
+  100, 94, 113, 146, 132, 150, 98, 130, 112, 104,
+  96, 115, 98, 68, 94, 158, 101, 106, 124, 84,
+  117, 107, 74, 120, 131, 121, 108, 162, 148, 181,
+  96, 71, 81, 121, 140, 127, 112, 137, 98, 89,
+  98, 114, 126, 114, 65, 100, 126, 141, 123, 106,
+  103, 104, 139, 126, 80, 90, 100, 131, 92, 75,
+  76, 62, 95, 134, 131, 113, 130, 133, 83, 133,
+  54, 118, 105, 124, 88, 98, 134, 78, 116, 105,
+  146, 51, 115, 120, 98, 83, 111, 100, 96, 61,
+  107, 159, 98, 104, 135, 138, 108, 110, 111, 139,
+  112, 100, 108, 115, 116, 133, 92, 82, 73, 147,
+  153, 118, 78, 84, 111, 150, 80, 104, 114, 76,
+  99, 81, 99, 96, 113, 117, 103, 122, 90, 139,
+  93, 98, 63, 86, 96, 93, 53, 107, 91, 62,
+  95, 89, 102, 103, 89, 95, 91, 128, 98, 121,
+  150, 141, 95, 137, 112, 112, 84, 72, 68, 117,
+  134, 70, 75, 103, 88, 171, 112, 108, 116, 119,
+  113, 117, 119, 99, 117, 116, 80, 95, 113, 84,
+  131, 99, 114, 121, 79, 112, 95, 139, 81, 114,
+  52, 128, 98, 82, 151, 121, 99, 102, 102, 101,
+  97, 101, 114, 97, 83, 102, 117, 151, 151, 94,
+  93, 78, 94, 124, 63, 107, 109, 80, 78, 115,
+  151, 102, 110, 109, 87, 109, 112, 132, 123, 105,
+  73, 99, 102, 83, 127, 86, 47, 88, 125, 111,
+  101, 116, 103, 124, 112, 159, 87, 85, 120, 93,
+  120, 75, 63, 88, 83, 109, 121, 99, 87, 110,
+  72, 129, 86, 114, 88, 77, 84, 109, 92, 96,
+  89, 126, 141, 95, 74, 108, 122, 94, 128, 117,
+  72, 99, 90, 177, 93, 128, 103, 118, 125, 106,
+  121, 124, 99, 112, 90, 99, 104, 103, 76, 86,
+  85, 137, 136, 90, 93, 116, 133, 131, 93, 127,
+  122, 124, 126, 68, 111, 102, 118, 99, 114, 101,
+  106, 124, 84, 91, 90, 81, 120, 87, 39, 113,
+  108, 80, 118, 93, 97, 94, 116, 93, 122, 149,
+  107, 82, 129, 82, 98, 107, 141, 88, 97, 106,
+  82, 159, 115, 106, 106, 121, 90, 152, 136, 99,
+  134, 111, 96, 84, 114, 99, 120, 113, 71, 99,
+  115, 83, 134, 145, 103, 107, 81, 131, 119, 87,
+  100, 112, 81, 94, 126, 83, 153, 96, 70, 99,
+  105, 95, 87, 118, 119, 133, 94, 107, 136, 125,
+  188, 105, 101, 93, 119, 152, 104, 116, 107, 73,
+  97, 73, 138, 96, 115, 114, 100, 106, 115, 137,
+  120, 91, 105, 91, 124, 87, 122, 78, 52, 78,
+  118, 92, 115, 100, 161, 125, 103, 101, 149, 123,
+  137, 92, 117, 85, 83, 135, 101, 105, 83, 95,
+  115, 106, 80, 125, 118, 105, 78, 88, 77, 155,
+  85, 97, 91, 108, 85, 107, 62, 123, 113, 101,
+  143, 131, 67, 123, 106, 112, 109, 99, 96, 80,
+  120, 110, 110, 101, 85, 137, 90, 76, 74, 98,
+  77, 104, 101, 97, 167, 91, 104, 119, 91, 104,
+  67, 121, 105, 110, 126, 107, 103, 109, 103, 93,
+  104, 100, 91, 105, 73, 81, 96, 59, 119, 111,
+  29, 107, 119, 92, 107, 84, 68, 92, 143, 85,
+  108, 120, 108, 73, 101, 107, 63, 82, 141, 76,
+  104, 122, 90, 164, 90, 126, 124, 115, 91, 136,
+  127, 86, 117, 116, 92, 89, 111, 94, 119, 132,
+  57, 79, 96, 90, 118, 151, 104, 99, 97, 121,
+  109, 111, 92, 109, 115, 74, 113, 82, 149, 91,
+  57, 73, 116, 106, 65, 129, 101, 145, 95, 98,
+  103, 91, 135, 95, 87, 90, 106, 138, 105, 110,
+  114, 55, 93, 115, 138, 96, 113, 99, 97, 94,
+  106, 134, 95, 61, 88, 91, 132, 107, 120, 106,
+  41, 63, 115, 119, 89, 75, 100, 88, 90, 111,
+  140, 131, 118, 93, 100, 94, 85, 155, 114, 132,
+  85, 87, 123, 142, 88, 111, 81, 109, 58, 81,
+  48, 109, 77, 101, 99, 103, 71, 122, 75, 102,
+  108, 92, 123, 136, 51, 66, 96, 76, 88, 96,
+  101, 77, 108, 123, 104, 145, 83, 122, 103, 70,
+  80, 118, 52, 110, 91, 53, 136, 100, 134, 105,
+  101, 108, 57, 117, 77, 115, 100, 117, 82, 116,
+  104, 114, 93, 93, 91, 111, 85, 84, 97, 60,
+  101, 81, 49, 117, 113, 95, 87, 77, 84, 103,
+  139, 110, 125, 85, 99, 71, 115, 136, 83, 76,
+  113, 60, 86, 98, 98, 141, 95, 110, 130, 99,
+  81, 121, 120, 121, 113, 70, 139, 112, 79, 124,
+  94, 130, 67, 95, 95, 123, 100, 110, 98, 87,
+  97, 97, 105, 156, 99, 120, 120, 65, 84, 75,
+  143, 107, 63, 60, 120, 129, 59, 109, 105, 95,
+  85, 80, 91, 106, 132, 81, 88, 107, 104, 98,
+  118, 114, 124, 67, 72, 87, 94, 100, 113, 118,
+  121, 74, 98, 112, 94, 84, 78, 110, 101, 116,
+  98, 119, 49, 78, 89, 122, 86, 64, 74, 60,
+  55, 87, 94, 124, 140, 113, 90, 118, 91, 164,
+  120, 146, 100, 86, 108, 164, 85, 103, 71, 121,
+  37, 93, 71, 107, 73, 116, 111, 103, 71, 81,
+  97, 70, 104, 70, 103, 111, 69, 35, 92, 87,
+  70, 110, 74, 86, 85, 146, 93, 165, 106, 118,
+  119, 61, 112, 99, 53, 104, 84, 65, 96, 77,
+  179, 98, 103, 109, 85, 126, 90, 122, 99, 123,
+  79, 121, 99, 131, 106, 93, 89, 114, 96, 105,
+  88, 71, 91, 96, 62, 107, 113, 104, 106, 90,
+  109, 104, 92, 157, 123, 65, 89, 88, 119, 104,
+  120, 92, 95, 54, 81, 99, 90, 123, 108, 83,
+  113, 89, 59, 86, 93, 142, 114, 58, 166, 111,
+  95, 127, 110, 103, 117, 150, 95, 127, 105, 95,
+  106, 68, 115, 94, 119, 136, 116, 137, 130, 74,
+  55, 101, 78, 103, 87, 87, 108, 162, 72, 89,
+  106, 33, 99, 61, 81, 134, 147, 91, 99, 142,
+  143, 85, 147, 123, 117, 97, 90, 62, 79, 122,
+  128, 132, 105, 72, 81, 84, 113, 117, 70, 108,
+  92, 117, 78, 111, 66, 95, 69, 106, 105, 62,
+  95, 53, 74, 101, 59, 105, 154, 112, 93, 124,
+  99, 158, 122, 149, 94, 109, 88, 153, 92, 88,
+  91, 108, 54, 134, 52, 114, 88, 112, 98, 78,
+  74, 36, 112, 74, 104, 82, 92, 84, 93, 46,
+  86, 94, 68, 94, 74, 91, 83, 147, 78, 117,
+  116, 154, 126, 67, 124, 84, 83, 96, 107, 112,
+  96, 86, 175, 96, 98, 98, 106, 130, 100, 111,
+  110, 104, 97, 122, 115, 130, 94, 83, 101, 114,
+  110, 106, 88, 99, 113, 100, 90, 114, 134, 111,
+  119, 109, 120, 131, 42, 152, 111, 98, 88, 116,
+  105, 74, 141, 111, 102, 40, 107, 84, 91, 122,
+  104, 105, 102, 91, 73, 90, 90, 132, 129, 97,
+  146, 112, 101, 105, 130, 100, 142, 161, 124, 120,
+  106, 106, 92, 80, 101, 103, 120, 94, 179, 130,
+  123, 112, 70, 108, 85, 78, 110, 119, 122, 174,
+  93, 86, 108, 74, 114, 84, 105, 95, 143, 99,
+  105, 145, 158, 109, 149, 121, 104, 118, 106, 120,
+  92, 106, 129, 127, 99, 78, 79, 87, 126, 127,
+  87, 103, 86, 126, 91, 94, 93, 135, 76, 112,
+  115, 115, 126, 85, 125, 112, 81, 105, 145, 97,
+  113, 129, 127, 130, 117, 149, 113, 110, 91, 135,
+  112, 96, 86, 94, 93, 145, 78, 118, 99, 88,
+  90, 90, 112, 45, 112, 107, 136, 99, 97, 101,
+  107, 89, 88, 124, 98, 99, 111, 104, 97, 127,
+  92, 108, 102, 161, 146, 76, 114, 89, 97, 94,
+  126, 132, 114, 132, 150, 101, 103, 112, 99, 131,
+  117, 117, 125, 106, 111, 127, 103, 108, 114, 123,
+  115, 113, 133, 104, 135, 132, 139, 98, 85, 97,
+  116, 116, 132, 112, 134, 95, 120, 111, 115, 143,
+  97, 67, 95, 110, 138, 100, 133, 88, 119, 79,
+  82, 142, 125, 104, 108, 124, 79, 132, 121, 105,
+  137, 156, 96, 84, 108, 94, 144, 144, 133, 130,
+  97, 104, 124, 116, 93, 103, 120, 117, 125, 98,
+  160, 131, 86, 114, 108, 98, 88, 104, 93, 119,
+  112, 125, 95, 116, 114, 146, 110, 105, 102, 113,
+  83, 119, 142, 112, 157, 106, 135, 123, 134, 90,
+  137, 113, 123, 119, 132, 89, 71, 113, 104, 96,
+  106, 123, 110, 106, 119, 129, 105, 109, 94, 112,
+  85, 111, 112, 118, 124, 111, 108, 127, 127, 76,
+  126, 116, 109, 161, 72, 118, 113, 115, 114, 109,
+  123, 98, 125, 111, 109, 118, 123, 111, 53, 87,
+  112, 92, 98, 90, 88, 121, 128, 95, 91, 116,
+  119, 116, 109, 115, 118, 93, 113, 103, 87, 97,
+  113, 101, 98, 114, 92, 140, 116, 110, 121, 101,
+  108, 82, 100, 112, 94, 95, 162, 97, 142, 107,
+  78, 117, 124, 117, 123, 127, 93, 126, 89, 131,
+  105, 109, 112, 112, 129, 100, 120, 129, 136, 93,
+  79, 71, 31, 106, 147, 96, 102, 89, 132, 71,
+  89, 104, 85, 99, 102, 109, 128, 80, 124, 119,
+  122, 78, 72, 183, 91, 117, 106, 132, 66, 98,
+  101, 118, 147, 152, 65, 95, 96, 89, 133, 149,
+  111, 97, 103, 116, 108, 93, 100, 93, 120, 97,
+  122, 110, 100, 131, 82, 90, 87, 108, 100, 106,
+  97, 139, 105, 133, 91, 107, 119, 138, 97, 83,
+  103, 95, 96, 106, 107, 100, 148, 121, 159, 125,
+  151, 91, 124, 138, 89, 119, 134, 91, 75, 109,
+  80, 101, 112, 120, 111, 100, 110, 161, 101, 80,
+  78, 121, 63, 139, 98, 108, 143, 59, 121, 116,
+  123, 85, 134, 112, 106, 195, 113, 79, 132, 145,
+  134, 92, 114, 134, 136, 106, 113, 151, 107, 102,
+  81, 71, 134, 98, 75, 109, 148, 146, 109, 90,
+  125, 108, 98, 128, 90, 72, 99, 105, 93, 129,
+  96, 83, 102, 96, 93, 93, 106, 132, 113, 110,
+  107, 87, 104, 96, 104, 115, 83, 131, 137, 99,
+  151, 128, 82, 96, 138, 123, 89, 110, 85, 122,
+  97, 155, 119, 132, 106, 117, 138, 92, 118, 81,
+  123, 104, 74, 93, 33, 103, 148, 105, 98, 96,
+  115, 69, 92, 100, 83, 135, 118, 87, 108, 100,
+  111, 126, 86, 145, 80, 183, 110, 134, 109, 108,
+  90, 73, 86, 133, 121, 93, 71, 97, 90, 90,
+  114, 106, 94, 84, 110, 128, 108, 111, 87, 99,
+  98, 88, 128, 87, 81, 121, 84, 103, 103, 91,
+  124, 61, 108, 129, 96, 140, 95, 98, 108, 111,
+  102, 82, 120, 99, 109, 106, 116, 77, 139, 114,
+  166, 126, 140, 105, 109, 176, 82, 111, 113, 108,
+  75, 98, 90, 117, 109, 134, 118, 103, 102, 168,
+  110, 78, 69, 104, 84, 122, 117, 84, 156, 61,
+  115, 85, 122, 169, 110, 120, 79, 188, 126, 77,
+  140, 162, 145, 91, 116, 171, 125, 105, 58, 111,
+  91, 119, 96, 100, 143, 109, 77, 124, 106, 129,
+  89, 104, 109, 101, 127, 136, 87, 62, 92, 121,
+  81, 81, 137, 81, 95, 83, 105, 81, 100, 132,
+  126, 122, 86, 75, 79, 97, 111, 123, 92, 120,
+  152, 67, 81, 114, 78, 88, 112, 142, 83, 76,
+  70, 90, 74, 84, 86, 83, 104, 110, 113, 85,
+  95, 116, 114, 135, 38, 66, 34, 91, 126, 85,
+  115, 86, 121, 52, 88, 111, 66, 110, 116, 115,
+  73, 84, 84, 89, 96, 84, 62, 156, 93, 103,
+  91, 118, 74, 89, 86, 101, 97, 73, 84, 100,
+  99, 58, 112, 113, 72, 74, 89, 106, 92, 82,
+  71, 87, 58, 87, 105, 150, 86, 114, 69, 107,
+  94, 81, 119, 69, 78, 70, 92, 131, 57, 86,
+  112, 98, 89, 71, 123, 104, 127, 98, 84, 70,
+  110, 88, 113, 106, 126, 66, 69, 123, 86, 111,
+  121, 90, 67, 91, 61, 105, 113, 115, 94, 95,
+  105, 121, 107, 81, 58, 93, 69, 91, 64, 106,
+  95, 82, 94, 105, 111, 137, 85, 103, 90, 159,
+  75, 75, 111, 119, 107, 77, 91, 126, 94, 85,
+  50, 96, 71, 90, 60, 65, 98, 81, 37, 125,
+  57, 103, 81, 69, 113, 106, 129, 107, 84, 57,
+  91, 154, 86, 118, 85, 69, 84, 89, 140, 86,
+  80, 130, 94, 92, 87, 65, 57, 73, 111, 100,
+  60, 82,
+};
+
+
+extern "C" JNIEXPORT void JNICALL
+Java_android_renderscript_cts_BNNMTest_getData(JNIEnv * env,
+                                                                      jclass,
+                                                                      jbyteArray a,
+                                                                      jbyteArray b,
+                                                                      jbyteArray c
+                                                                      )
+{
+    jbyte * a_byte = (jbyte *) env->GetPrimitiveArrayCritical(a, 0);
+    jbyte * b_byte = (jbyte *) env->GetPrimitiveArrayCritical(b, 0);
+    jbyte * c_byte = (jbyte *) env->GetPrimitiveArrayCritical(c, 0);
+
+    memcpy(a_byte, a_data, a_count);
+    memcpy(b_byte, b_data, b_count);
+    memcpy(c_byte, expected_c_data, c_count);
+
+
+    env->ReleasePrimitiveArrayCritical(c, c_byte, 0);
+    env->ReleasePrimitiveArrayCritical(b, b_byte, 0);
+    env->ReleasePrimitiveArrayCritical(a, a_byte, 0);
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopyPaddedTest.java b/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopyPaddedTest.java
new file mode 100644
index 0000000..c74dbc0
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopyPaddedTest.java
@@ -0,0 +1,1117 @@
+/*
+ * Copyright (C) 2015 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.renderscript.cts;
+
+import android.renderscript.Allocation;
+import android.renderscript.Element;
+import android.renderscript.Type;
+import java.util.Random;
+
+public class AllocationCopyPaddedTest extends RSBaseCompute {
+    public void test_AllocationPadded_Byte3_1D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);;
+        int arr_len = width * 3;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_1D_Padded_Byte Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Byte3_2D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int arr_len = width * height * 3;
+        
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_2D_AllocationCopyTo_Padded_Byte Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Byte3_3D() {
+        Random random = new Random(0x172d8ab9);
+        int w = random.nextInt(32);
+        int h = random.nextInt(32);
+        int d = random.nextInt(32);
+        int arr_len = w * d * h * 3;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8_3(mRS));
+        typeBuilder.setX(w).setY(h).setZ(d);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_3D_Padded_Byte Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Short3_1D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_1D_Padded_Short Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Short3_2D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int arr_len = width * height * 3;
+        
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_2D_Padded_Short Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Short3_3D() {
+        Random random = new Random(0x172d8ab9);
+        int w = random.nextInt(32);
+        int h = random.nextInt(32);
+        int d = random.nextInt(32);
+        int arr_len = w * d * h * 3;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16_3(mRS));
+        typeBuilder.setX(w).setY(h).setZ(d);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_3D_Padded_Short Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Int3_1D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_1D_Padded_Int Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Int3_2D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int arr_len = width * height * 3;
+        
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_2D_Padded_Int Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Int3_3D() {
+        Random random = new Random(0x172d8ab9);
+        int w = random.nextInt(32);
+        int h = random.nextInt(32);
+        int d = random.nextInt(32);
+        int arr_len = w * d * h * 3;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32_3(mRS));
+        typeBuilder.setX(w).setY(h).setZ(d);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_3D_Padded_Int Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Float3_1D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_1D_Padded_Float Failed, output array does not match input",
+                   result);
+    }
+    public void test_AllocationPadded_Float3_2D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int arr_len = width * height * 3;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_2D_Padded_Float Failed, output array does not match input",
+                   result);
+    }
+    public void test_AllocationPadded_Float3_3D() {
+        Random random = new Random(0x172d8ab9);
+        int w = random.nextInt(32);
+        int h = random.nextInt(32);
+        int d = random.nextInt(32);
+        int arr_len = w * d * h * 3;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32_3(mRS));
+        typeBuilder.setX(w).setY(h).setZ(d);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_3D_Padded_Float Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Double3_1D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        double[] inArray = new double[arr_len];
+        double[] outArray = new double[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (double)random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F64_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_1D_Padded_Double Failed, output array does not match input",
+                   result);
+    }
+    public void test_AllocationPadded_Double3_2D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int arr_len = width * height * 3;
+
+        double[] inArray = new double[arr_len];
+        double[] outArray = new double[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (double)random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F64_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_2D_Padded_Double Failed, output array does not match input",
+                   result);
+    }
+    public void test_AllocationPadded_Double3_3D() {
+        Random random = new Random(0x172d8ab9);
+        int w = random.nextInt(32);
+        int h = random.nextInt(32);
+        int d = random.nextInt(32);
+        int arr_len = w * d * h * 3;
+
+        double[] inArray = new double[arr_len];
+        double[] outArray = new double[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (double)random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F64_3(mRS));
+        typeBuilder.setX(w).setY(h).setZ(d);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_3D_Padded_Double Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Long3_1D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_1D_Padded_Long Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Long3_2D() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int arr_len = width * height * 3;
+        
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_2D_Padded_Long Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_Long3_3D() {
+        Random random = new Random(0x172d8ab9);
+        int w = random.nextInt(32);
+        int h = random.nextInt(32);
+        int d = random.nextInt(32);
+        int arr_len = w * d * h * 3;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64_3(mRS));
+        typeBuilder.setX(w).setY(h).setZ(d);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copyFrom(inArray);
+        alloc.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopyTo_3D_Padded_Long Failed, output array does not match input",
+                   result);
+    }
+
+
+    public void test_AllocationPadded_copy1DRangeTo_Byte3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeTo_Padded_Byte Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy1DRangeTo_Short3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+        
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeTo_Padded_Short Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy1DRangeTo_Int3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeTo_Padded_Int Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy1DRangeTo_Float3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0f) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeTo_Padded_Float Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy1DRangeTo_Long3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeTo_Padded_Long Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy2DRangeTo_Byte3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount * 3;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy2DRangeTo_Padded_Byte Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy2DRangeTo_Short3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount * 3;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+        
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy2DRangeTo_Padded_Short Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy2DRangeTo_Int3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount * 3;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy2DRangeTo_Padded_Int Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy2DRangeTo_Float3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount * 3;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy2DRangeTo_Padded_Float Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy2DRangeTo_Long3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount * 3;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64_3(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy2DRangeTo_Padded_Long Failed, output array does not match input",
+                   result);
+    }
+
+
+    public void test_AllocationPadded_copy1DRangeToUnchecked_Byte3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeToUnchecked_Padded_Byte Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy1DRangeToUnchecked_Short3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+        
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeToUnchecked_Padded_Short Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy1DRangeToUnchecked_Int3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeToUnchecked_1D_Padded_Int Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy1DRangeToUnchecked_Float3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0f) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeToUnchecked_Padded_Float Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationPadded_copy1DRangeToUnchecked_Long3() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width * 3;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64_3(mRS));
+        typeBuilder.setX(width);
+        Allocation alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.setAutoPadding(true);
+        int offset = random.nextInt(width);
+        int count = width - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count * 3; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count * 3; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_copy1DRangeToUnchecked_Padded_Long Failed, output array does not match input",
+                   result);
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopyToTest.java b/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopyToTest.java
new file mode 100644
index 0000000..f6bef0a
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopyToTest.java
@@ -0,0 +1,797 @@
+/*
+ * Copyright (C) 2015 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.renderscript.cts;
+
+import android.renderscript.Allocation;
+import android.renderscript.Element;
+import android.renderscript.Type;
+import java.util.Random;
+
+public class AllocationCopyToTest extends RSBaseCompute {
+    private Allocation alloc;
+
+    public void test_Allocationcopy1DRangeTo_Byte() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeTo_Byte failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy1DRangeTo_Short() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeTo_Short failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy1DRangeTo_Int() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeTo_Int failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy1DRangeTo_Float() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0f) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeTo_Float failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy1DRangeTo_Long() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeTo(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeTo_Long failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy2DRangeTo_Byte() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8(mRS));
+        typeBuilder.setX(width).setY(height);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy2DRangeTo_Byte failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy2DRangeTo_Short() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16(mRS));
+        typeBuilder.setX(width).setY(height);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy2DRangeTo_Short failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy2DRangeTo_Int() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32(mRS));
+        typeBuilder.setX(width).setY(height);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy2DRangeTo_Int failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy2DRangeTo_Float() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32(mRS));
+        typeBuilder.setX(width).setY(height);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy2DRangeTo_Float failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy2DRangeTo_Long() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int arr_len = xcount * ycount;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64(mRS));
+        typeBuilder.setX(width).setY(height);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy2DRangeFrom(xoff, yoff, xcount, ycount, inArray);
+        alloc.copy2DRangeTo(xoff, yoff, xcount, ycount, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy2DRangeTo_Long failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy3DRangeTo_Byte() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(64);
+        int height = random.nextInt(64);
+        int depth = random.nextInt(64);
+
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int zoff = random.nextInt(height);
+
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int zcount = depth - zoff;
+        int arr_len = xcount * ycount * zcount;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8(mRS));
+        typeBuilder.setX(width).setY(height).setZ(depth);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy3DRangeFrom(xoff, yoff, zoff, xcount, ycount, zcount, (Object)inArray);
+        alloc.copy3DRangeTo(xoff, yoff, zoff, xcount, ycount, zcount, (Object)outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                android.util.Log.v("Allocation CopyTo Test", "Failed: " + i + " " + inArray[i] + " " + outArray[i]);
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy3DRangeTo_Byte failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy3DRangeTo_Short() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(64);
+        int height = random.nextInt(64);
+        int depth = random.nextInt(64);
+
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int zoff = random.nextInt(height);
+
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int zcount = depth - zoff;
+        int arr_len = xcount * ycount * zcount;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16(mRS));
+        typeBuilder.setX(width).setY(height).setZ(depth);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy3DRangeFrom(xoff, yoff, zoff, xcount, ycount, zcount, (Object)inArray);
+        alloc.copy3DRangeTo(xoff, yoff, zoff, xcount, ycount, zcount, (Object)outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                android.util.Log.v("Allocation CopyTo Test", "Failed: " + i + " " + inArray[i] + " " + outArray[i]);
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy3DRangeTo_Short failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy3DRangeTo_Int() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(64);
+        int height = random.nextInt(64);
+        int depth = random.nextInt(64);
+
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int zoff = random.nextInt(height);
+
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int zcount = depth - zoff;
+        int arr_len = xcount * ycount * zcount;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32(mRS));
+        typeBuilder.setX(width).setY(height).setZ(depth);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy3DRangeFrom(xoff, yoff, zoff, xcount, ycount, zcount, (Object)inArray);
+        alloc.copy3DRangeTo(xoff, yoff, zoff, xcount, ycount, zcount, (Object)outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                android.util.Log.v("Allocation CopyTo Test", "Failed: " + i + " " + inArray[i] + " " + outArray[i]);
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy3DRangeTo_Int failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy3DRangeTo_Float() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(64);
+        int height = random.nextInt(64);
+        int depth = random.nextInt(64);
+
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int zoff = random.nextInt(height);
+
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int zcount = depth - zoff;
+        int arr_len = xcount * ycount * zcount;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32(mRS));
+        typeBuilder.setX(width).setY(height).setZ(depth);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy3DRangeFrom(xoff, yoff, zoff, xcount, ycount, zcount, (Object)inArray);
+        alloc.copy3DRangeTo(xoff, yoff, zoff, xcount, ycount, zcount, (Object)outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                android.util.Log.v("Allocation CopyTo Test", "Failed: " + i + " " + inArray[i] + " " + outArray[i]);
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy3DRangeTo_Float failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy3DRangeTo_Long() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(64);
+        int height = random.nextInt(64);
+        int depth = random.nextInt(64);
+
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int zoff = random.nextInt(height);
+
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int zcount = depth - zoff;
+        int arr_len = xcount * ycount * zcount;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64(mRS));
+        typeBuilder.setX(width).setY(height).setZ(depth);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        alloc.copy3DRangeFrom(xoff, yoff, zoff, xcount, ycount, zcount, (Object)inArray);
+        alloc.copy3DRangeTo(xoff, yoff, zoff, xcount, ycount, zcount, (Object)outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                android.util.Log.v("Allocation CopyTo Test", "Failed: " + i + " " + inArray[i] + " " + outArray[i]);
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy3DRangeTo_Long failed, output array does not match input",
+                   result);
+    }
+
+    public void test_AllocationCopy3DRangeFrom_Alloc() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(64);
+        int height = random.nextInt(64);
+        int depth = random.nextInt(64);
+
+        int xoff = random.nextInt(width);
+        int yoff = random.nextInt(height);
+        int zoff = random.nextInt(height);
+
+        int xcount = width - xoff;
+        int ycount = height - yoff;
+        int zcount = depth - zoff;
+        int arr_len = xcount * ycount * zcount;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64(mRS));
+        typeBuilder.setX(width).setY(height).setZ(depth);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation allocRef = Allocation.createTyped(mRS, typeBuilder.create());
+
+        allocRef.copy3DRangeFrom(xoff, yoff, zoff, xcount, ycount, zcount, (Object)inArray);
+        alloc.copy3DRangeFrom(xoff, yoff, zoff, xcount, ycount, zcount, allocRef, xoff, yoff, zoff);
+        alloc.copy3DRangeTo(xoff, yoff, zoff, xcount, ycount, zcount, (Object)outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                android.util.Log.v("Allocation Copy3DRangeFrom (alloc) Test", "Failed: " + i + " " + inArray[i] + " " + outArray[i]);
+                break;
+            }
+        }
+        assertTrue("test_AllocationCopy3DRangeFrom_Alloc failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy1DRangeToUnchecked_Byte() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeToUnchecked_Byte failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy1DRangeToUnchecked_Short() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeToUnchecked_Short failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy1DRangeToUnchecked_Int() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeToUnchecked_Int Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy1DRangeToUnchecked_Float() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0f) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeToUnchecked_Float Failed, output array does not match input",
+                   result);
+    }
+
+    public void test_Allocationcopy1DRangeToUnchecked_Long() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64(mRS));
+        typeBuilder.setX(width);
+        alloc = Allocation.createTyped(mRS, typeBuilder.create());
+        int offset = random.nextInt(arr_len);
+        int count = arr_len - offset;
+        alloc.copy1DRangeFrom(offset, count, inArray);
+        alloc.copy1DRangeToUnchecked(offset, count, outArray);
+
+        boolean result = true;
+        for (int i = 0; i < count; i++) {
+            if (inArray[i] != outArray[i]) {
+                result = false;
+                break;
+            }
+        }
+        for (int i = count; i < arr_len; i++) {
+            if (outArray[i] != 0) {
+                result = false;
+                break;
+            }
+        }
+        assertTrue("test_Allocationcopy1DRangeToUnchecked_Long Failed, output array does not match input",
+                   result);
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/BLASData.java b/tests/tests/renderscript/src/android/renderscript/cts/BLASData.java
new file mode 100644
index 0000000..def0352
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/BLASData.java
@@ -0,0 +1,1382 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+/* Don't edit this file alone!
+ * The array names need to match the data generated by blas_gen.py. */
+
+package android.renderscript.cts;
+
+import android.content.res.AssetManager;
+import android.content.Context;
+import java.io.InputStream;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.IOException;
+
+import android.test.AndroidTestCase;
+
+public class BLASData extends AndroidTestCase {
+    private BufferedReader mBufReader;
+
+    int dM;
+    int dN;
+    int dK;
+
+    int KL;
+    int KU;
+
+    float[] L2_sGEMV_A_mn;
+    float[] L2_sGEMV_x_n1;
+    float[] L2_sGEMV_x_n2;
+    float[] L2_sGEMV_y_m1;
+    float[] L2_sGEMV_y_m2;
+    float[] L2_sGEMV_o_N;
+    float[] L2_sGEMV_o_N2;
+    float[] L2_sGEMV_o_T;
+    float[] L2_sGEMV_o_H;
+
+    double[] L2_dGEMV_A_mn;
+    double[] L2_dGEMV_x_n1;
+    double[] L2_dGEMV_x_n2;
+    double[] L2_dGEMV_y_m1;
+    double[] L2_dGEMV_y_m2;
+    double[] L2_dGEMV_o_N;
+    double[] L2_dGEMV_o_N2;
+    double[] L2_dGEMV_o_T;
+    double[] L2_dGEMV_o_H;
+
+    float[] L2_cGEMV_A_mn;
+    float[] L2_cGEMV_x_n1;
+    float[] L2_cGEMV_x_n2;
+    float[] L2_cGEMV_y_m1;
+    float[] L2_cGEMV_y_m2;
+    float[] L2_cGEMV_o_N;
+    float[] L2_cGEMV_o_N2;
+    float[] L2_cGEMV_o_T;
+    float[] L2_cGEMV_o_H;
+
+    double[] L2_zGEMV_A_mn;
+    double[] L2_zGEMV_x_n1;
+    double[] L2_zGEMV_x_n2;
+    double[] L2_zGEMV_y_m1;
+    double[] L2_zGEMV_y_m2;
+    double[] L2_zGEMV_o_N;
+    double[] L2_zGEMV_o_N2;
+    double[] L2_zGEMV_o_T;
+    double[] L2_zGEMV_o_H;
+
+    float[] L2_sGBMV_A_mn;
+    float[] L2_sGBMV_x_n1;
+    float[] L2_sGBMV_x_n2;
+    float[] L2_sGBMV_y_m1;
+    float[] L2_sGBMV_y_m2;
+    float[] L2_sGBMV_o_N;
+    float[] L2_sGBMV_o_N2;
+    float[] L2_sGBMV_o_T;
+    float[] L2_sGBMV_o_H;
+
+    double[] L2_dGBMV_A_mn;
+    double[] L2_dGBMV_x_n1;
+    double[] L2_dGBMV_x_n2;
+    double[] L2_dGBMV_y_m1;
+    double[] L2_dGBMV_y_m2;
+    double[] L2_dGBMV_o_N;
+    double[] L2_dGBMV_o_N2;
+    double[] L2_dGBMV_o_T;
+    double[] L2_dGBMV_o_H;
+
+    float[] L2_cGBMV_A_mn;
+    float[] L2_cGBMV_x_n1;
+    float[] L2_cGBMV_x_n2;
+    float[] L2_cGBMV_y_m1;
+    float[] L2_cGBMV_y_m2;
+    float[] L2_cGBMV_o_N;
+    float[] L2_cGBMV_o_N2;
+    float[] L2_cGBMV_o_T;
+    float[] L2_cGBMV_o_H;
+
+    double[] L2_zGBMV_A_mn;
+    double[] L2_zGBMV_x_n1;
+    double[] L2_zGBMV_x_n2;
+    double[] L2_zGBMV_y_m1;
+    double[] L2_zGBMV_y_m2;
+    double[] L2_zGBMV_o_N;
+    double[] L2_zGBMV_o_N2;
+    double[] L2_zGBMV_o_T;
+    double[] L2_zGBMV_o_H;
+
+    float[] L2_cHEMV_A_nn;
+    float[] L2_cHEMV_A_nn_pu;
+    float[] L2_cHEMV_x_n1;
+    float[] L2_cHEMV_x_n2;
+    float[] L2_cHEMV_y_n1;
+    float[] L2_cHEMV_y_n2;
+    float[] L2_cHEMV_o_N;
+    float[] L2_cHEMV_o_N2;
+
+    double[] L2_zHEMV_A_nn;
+    double[] L2_zHEMV_A_nn_pu;
+    double[] L2_zHEMV_x_n1;
+    double[] L2_zHEMV_x_n2;
+    double[] L2_zHEMV_y_n1;
+    double[] L2_zHEMV_y_n2;
+    double[] L2_zHEMV_o_N;
+    double[] L2_zHEMV_o_N2;
+
+    float[] L2_cHBMV_A_nn;
+    float[] L2_cHBMV_x_n1;
+    float[] L2_cHBMV_x_n2;
+    float[] L2_cHBMV_y_n1;
+    float[] L2_cHBMV_y_n2;
+    float[] L2_cHBMV_o_N;
+    float[] L2_cHBMV_o_N2;
+
+    double[] L2_zHBMV_A_nn;
+    double[] L2_zHBMV_x_n1;
+    double[] L2_zHBMV_x_n2;
+    double[] L2_zHBMV_y_n1;
+    double[] L2_zHBMV_y_n2;
+    double[] L2_zHBMV_o_N;
+    double[] L2_zHBMV_o_N2;
+
+    float[] L2_sSYMV_A_nn;
+    float[] L2_sSYMV_A_nn_pu;
+    float[] L2_sSYMV_x_n1;
+    float[] L2_sSYMV_x_n2;
+    float[] L2_sSYMV_y_n1;
+    float[] L2_sSYMV_y_n2;
+    float[] L2_sSYMV_o_N;
+    float[] L2_sSYMV_o_N2;
+
+    double[] L2_dSYMV_A_nn;
+    double[] L2_dSYMV_A_nn_pu;
+    double[] L2_dSYMV_x_n1;
+    double[] L2_dSYMV_x_n2;
+    double[] L2_dSYMV_y_n1;
+    double[] L2_dSYMV_y_n2;
+    double[] L2_dSYMV_o_N;
+    double[] L2_dSYMV_o_N2;
+
+    float[] L2_sSBMV_A_nn;
+    float[] L2_sSBMV_x_n1;
+    float[] L2_sSBMV_x_n2;
+    float[] L2_sSBMV_y_n1;
+    float[] L2_sSBMV_y_n2;
+    float[] L2_sSBMV_o_N;
+    float[] L2_sSBMV_o_N2;
+
+    double[] L2_dSBMV_A_nn;
+    double[] L2_dSBMV_x_n1;
+    double[] L2_dSBMV_x_n2;
+    double[] L2_dSBMV_y_n1;
+    double[] L2_dSBMV_y_n2;
+    double[] L2_dSBMV_o_N;
+    double[] L2_dSBMV_o_N2;
+
+    float[] L2_sTRMV_A_nn;
+    float[] L2_sTRMV_A_nn_pu;
+    float[] L2_sTRMV_x_n1;
+    float[] L2_sTRMV_x_n2;
+    float[] L2_sTRMV_o_UN;
+    float[] L2_sTRMV_o_UN2;
+    float[] L2_sTRMV_o_UT;
+    float[] L2_sTRMV_o_UH;
+
+    double[] L2_dTRMV_A_nn;
+    double[] L2_dTRMV_A_nn_pu;
+    double[] L2_dTRMV_x_n1;
+    double[] L2_dTRMV_x_n2;
+    double[] L2_dTRMV_o_UN;
+    double[] L2_dTRMV_o_UN2;
+    double[] L2_dTRMV_o_UT;
+    double[] L2_dTRMV_o_UH;
+
+    float[] L2_cTRMV_A_nn;
+    float[] L2_cTRMV_A_nn_pu;
+    float[] L2_cTRMV_x_n1;
+    float[] L2_cTRMV_x_n2;
+    float[] L2_cTRMV_o_UN;
+    float[] L2_cTRMV_o_UN2;
+    float[] L2_cTRMV_o_UT;
+    float[] L2_cTRMV_o_UH;
+
+    double[] L2_zTRMV_A_nn;
+    double[] L2_zTRMV_A_nn_pu;
+    double[] L2_zTRMV_x_n1;
+    double[] L2_zTRMV_x_n2;
+    double[] L2_zTRMV_o_UN;
+    double[] L2_zTRMV_o_UN2;
+    double[] L2_zTRMV_o_UT;
+    double[] L2_zTRMV_o_UH;
+
+    float[] L2_sTBMV_A_nn;
+    float[] L2_sTBMV_x_n1;
+    float[] L2_sTBMV_x_n2;
+    float[] L2_sTBMV_o_UN;
+    float[] L2_sTBMV_o_UN2;
+    float[] L2_sTBMV_o_UT;
+    float[] L2_sTBMV_o_UH;
+
+    double[] L2_dTBMV_A_nn;
+    double[] L2_dTBMV_x_n1;
+    double[] L2_dTBMV_x_n2;
+    double[] L2_dTBMV_o_UN;
+    double[] L2_dTBMV_o_UN2;
+    double[] L2_dTBMV_o_UT;
+    double[] L2_dTBMV_o_UH;
+
+    float[] L2_cTBMV_A_nn;
+    float[] L2_cTBMV_x_n1;
+    float[] L2_cTBMV_x_n2;
+    float[] L2_cTBMV_o_UN;
+    float[] L2_cTBMV_o_UN2;
+    float[] L2_cTBMV_o_UT;
+    float[] L2_cTBMV_o_UH;
+
+    double[] L2_zTBMV_A_nn;
+    double[] L2_zTBMV_x_n1;
+    double[] L2_zTBMV_x_n2;
+    double[] L2_zTBMV_o_UN;
+    double[] L2_zTBMV_o_UN2;
+    double[] L2_zTBMV_o_UT;
+    double[] L2_zTBMV_o_UH;
+
+    float[] L2_sTRSV_A_nn;
+    float[] L2_sTRSV_A_nn_pu;
+    float[] L2_sTRSV_x_n1;
+    float[] L2_sTRSV_x_n2;
+    float[] L2_sTRSV_o_UN;
+    float[] L2_sTRSV_o_UN2;
+    float[] L2_sTRSV_o_UT;
+    float[] L2_sTRSV_o_UH;
+
+    double[] L2_dTRSV_A_nn;
+    double[] L2_dTRSV_A_nn_pu;
+    double[] L2_dTRSV_x_n1;
+    double[] L2_dTRSV_x_n2;
+    double[] L2_dTRSV_o_UN;
+    double[] L2_dTRSV_o_UN2;
+    double[] L2_dTRSV_o_UT;
+    double[] L2_dTRSV_o_UH;
+
+    float[] L2_cTRSV_A_nn;
+    float[] L2_cTRSV_A_nn_pu;
+    float[] L2_cTRSV_x_n1;
+    float[] L2_cTRSV_x_n2;
+    float[] L2_cTRSV_o_UN;
+    float[] L2_cTRSV_o_UN2;
+    float[] L2_cTRSV_o_UT;
+    float[] L2_cTRSV_o_UH;
+
+    double[] L2_zTRSV_A_nn;
+    double[] L2_zTRSV_A_nn_pu;
+    double[] L2_zTRSV_x_n1;
+    double[] L2_zTRSV_x_n2;
+    double[] L2_zTRSV_o_UN;
+    double[] L2_zTRSV_o_UN2;
+    double[] L2_zTRSV_o_UT;
+    double[] L2_zTRSV_o_UH;
+
+    float[] L2_sTBSV_A_nn;
+    float[] L2_sTBSV_x_n1;
+    float[] L2_sTBSV_x_n2;
+    float[] L2_sTBSV_o_UN;
+    float[] L2_sTBSV_o_UN2;
+    float[] L2_sTBSV_o_UT;
+    float[] L2_sTBSV_o_UH;
+
+    double[] L2_dTBSV_A_nn;
+    double[] L2_dTBSV_x_n1;
+    double[] L2_dTBSV_x_n2;
+    double[] L2_dTBSV_o_UN;
+    double[] L2_dTBSV_o_UN2;
+    double[] L2_dTBSV_o_UT;
+    double[] L2_dTBSV_o_UH;
+
+    float[] L2_cTBSV_A_nn;
+    float[] L2_cTBSV_x_n1;
+    float[] L2_cTBSV_x_n2;
+    float[] L2_cTBSV_o_UN;
+    float[] L2_cTBSV_o_UN2;
+    float[] L2_cTBSV_o_UT;
+    float[] L2_cTBSV_o_UH;
+
+    double[] L2_zTBSV_A_nn;
+    double[] L2_zTBSV_x_n1;
+    double[] L2_zTBSV_x_n2;
+    double[] L2_zTBSV_o_UN;
+    double[] L2_zTBSV_o_UN2;
+    double[] L2_zTBSV_o_UT;
+    double[] L2_zTBSV_o_UH;
+
+    float[] L2_sGER_A_mn;
+    float[] L2_sGER_x_m1;
+    float[] L2_sGER_x_m2;
+    float[] L2_sGER_y_n1;
+    float[] L2_sGER_y_n2;
+    float[] L2_sGER_o_N;
+
+    double[] L2_dGER_A_mn;
+    double[] L2_dGER_x_m1;
+    double[] L2_dGER_x_m2;
+    double[] L2_dGER_y_n1;
+    double[] L2_dGER_y_n2;
+    double[] L2_dGER_o_N;
+
+    float[] L2_cGERU_A_mn;
+    float[] L2_cGERU_x_m1;
+    float[] L2_cGERU_x_m2;
+    float[] L2_cGERU_y_n1;
+    float[] L2_cGERU_y_n2;
+    float[] L2_cGERU_o_N;
+
+    double[] L2_zGERU_A_mn;
+    double[] L2_zGERU_x_m1;
+    double[] L2_zGERU_x_m2;
+    double[] L2_zGERU_y_n1;
+    double[] L2_zGERU_y_n2;
+    double[] L2_zGERU_o_N;
+
+    float[] L2_cGERC_A_mn;
+    float[] L2_cGERC_x_m1;
+    float[] L2_cGERC_x_m2;
+    float[] L2_cGERC_y_n1;
+    float[] L2_cGERC_y_n2;
+    float[] L2_cGERC_o_N;
+
+    double[] L2_zGERC_A_mn;
+    double[] L2_zGERC_x_m1;
+    double[] L2_zGERC_x_m2;
+    double[] L2_zGERC_y_n1;
+    double[] L2_zGERC_y_n2;
+    double[] L2_zGERC_o_N;
+
+    float[] L2_cHER_A_nn;
+    float[] L2_cHER_A_nn_pu;
+    float[] L2_cHER_x_n1;
+    float[] L2_cHER_x_n2;
+    float[] L2_cHER_o_N;
+    float[] L2_cHER_o_N_pu;
+
+    double[] L2_zHER_A_nn;
+    double[] L2_zHER_A_nn_pu;
+    double[] L2_zHER_x_n1;
+    double[] L2_zHER_x_n2;
+    double[] L2_zHER_o_N;
+    double[] L2_zHER_o_N_pu;
+
+    float[] L2_cHER2_A_nn;
+    float[] L2_cHER2_A_nn_pu;
+    float[] L2_cHER2_x_n1;
+    float[] L2_cHER2_x_n2;
+    float[] L2_cHER2_y_n1;
+    float[] L2_cHER2_y_n2;
+    float[] L2_cHER2_o_N;
+    float[] L2_cHER2_o_N_pu;
+
+    double[] L2_zHER2_A_nn;
+    double[] L2_zHER2_A_nn_pu;
+    double[] L2_zHER2_x_n1;
+    double[] L2_zHER2_x_n2;
+    double[] L2_zHER2_y_n1;
+    double[] L2_zHER2_y_n2;
+    double[] L2_zHER2_o_N;
+    double[] L2_zHER2_o_N_pu;
+
+    float[] L2_sSYR_A_nn;
+    float[] L2_sSYR_A_nn_pu;
+    float[] L2_sSYR_x_n1;
+    float[] L2_sSYR_x_n2;
+    float[] L2_sSYR_o_N;
+    float[] L2_sSYR_o_N_pu;
+
+    double[] L2_dSYR_A_nn;
+    double[] L2_dSYR_A_nn_pu;
+    double[] L2_dSYR_x_n1;
+    double[] L2_dSYR_x_n2;
+    double[] L2_dSYR_o_N;
+    double[] L2_dSYR_o_N_pu;
+
+    float[] L2_sSYR2_A_nn;
+    float[] L2_sSYR2_A_nn_pu;
+    float[] L2_sSYR2_x_n1;
+    float[] L2_sSYR2_x_n2;
+    float[] L2_sSYR2_y_n1;
+    float[] L2_sSYR2_y_n2;
+    float[] L2_sSYR2_o_N;
+    float[] L2_sSYR2_o_N_pu;
+
+    double[] L2_dSYR2_A_nn;
+    double[] L2_dSYR2_A_nn_pu;
+    double[] L2_dSYR2_x_n1;
+    double[] L2_dSYR2_x_n2;
+    double[] L2_dSYR2_y_n1;
+    double[] L2_dSYR2_y_n2;
+    double[] L2_dSYR2_o_N;
+    double[] L2_dSYR2_o_N_pu;
+
+    float[] L3_sGEMM_A_mk;
+    float[] L3_sGEMM_B_kn;
+    float[] L3_sGEMM_C_mn;
+    float[] L3_sGEMM_o_NN;
+    float[] L3_sGEMM_A_km;
+    float[] L3_sGEMM_B_nk;
+    float[] L3_sGEMM_o_TT;
+    float[] L3_sGEMM_o_HH;
+
+    double[] L3_dGEMM_A_mk;
+    double[] L3_dGEMM_B_kn;
+    double[] L3_dGEMM_C_mn;
+    double[] L3_dGEMM_o_NN;
+    double[] L3_dGEMM_A_km;
+    double[] L3_dGEMM_B_nk;
+    double[] L3_dGEMM_o_TT;
+    double[] L3_dGEMM_o_HH;
+    float[] L3_cGEMM_A_mk;
+    float[] L3_cGEMM_B_kn;
+    float[] L3_cGEMM_C_mn;
+    float[] L3_cGEMM_o_NN;
+    float[] L3_cGEMM_A_km;
+    float[] L3_cGEMM_B_nk;
+    float[] L3_cGEMM_o_TT;
+    float[] L3_cGEMM_o_HH;
+
+    double[] L3_zGEMM_A_mk;
+    double[] L3_zGEMM_B_kn;
+    double[] L3_zGEMM_C_mn;
+    double[] L3_zGEMM_o_NN;
+    double[] L3_zGEMM_A_km;
+    double[] L3_zGEMM_B_nk;
+    double[] L3_zGEMM_o_TT;
+    double[] L3_zGEMM_o_HH;
+
+    float[] L3_sSYMM_A_mm;
+    float[] L3_sSYMM_B_mn;
+    float[] L3_sSYMM_C_mn;
+    float[] L3_sSYMM_o_L;
+    float[] L3_sSYMM_A_nn;
+    float[] L3_sSYMM_o_R;
+
+    double[] L3_dSYMM_A_mm;
+    double[] L3_dSYMM_B_mn;
+    double[] L3_dSYMM_C_mn;
+    double[] L3_dSYMM_o_L;
+    double[] L3_dSYMM_A_nn;
+    double[] L3_dSYMM_o_R;
+
+    float[] L3_cSYMM_A_mm;
+    float[] L3_cSYMM_B_mn;
+    float[] L3_cSYMM_C_mn;
+    float[] L3_cSYMM_o_L;
+    float[] L3_cSYMM_A_nn;
+    float[] L3_cSYMM_o_R;
+
+    double[] L3_zSYMM_A_mm;
+    double[] L3_zSYMM_B_mn;
+    double[] L3_zSYMM_C_mn;
+    double[] L3_zSYMM_o_L;
+    double[] L3_zSYMM_A_nn;
+    double[] L3_zSYMM_o_R;
+
+    float[] L3_cHEMM_A_mm;
+    float[] L3_cHEMM_B_mn;
+    float[] L3_cHEMM_C_mn;
+    float[] L3_cHEMM_o_L;
+    float[] L3_cHEMM_A_nn;
+    float[] L3_cHEMM_o_R;
+
+    double[] L3_zHEMM_A_mm;
+    double[] L3_zHEMM_B_mn;
+    double[] L3_zHEMM_C_mn;
+    double[] L3_zHEMM_o_L;
+    double[] L3_zHEMM_A_nn;
+    double[] L3_zHEMM_o_R;
+
+    float[] L3_sSYRK_A_nk;
+    float[] L3_sSYRK_C_nn;
+    float[] L3_sSYRK_o_N;
+    float[] L3_sSYRK_A_kn;
+    float[] L3_sSYRK_o_T;
+
+    double[] L3_dSYRK_A_nk;
+    double[] L3_dSYRK_C_nn;
+    double[] L3_dSYRK_o_N;
+    double[] L3_dSYRK_A_kn;
+    double[] L3_dSYRK_o_T;
+
+    float[] L3_cSYRK_A_nk;
+    float[] L3_cSYRK_C_nn;
+    float[] L3_cSYRK_o_N;
+    float[] L3_cSYRK_A_kn;
+    float[] L3_cSYRK_o_T;
+
+    double[] L3_zSYRK_A_nk;
+    double[] L3_zSYRK_C_nn;
+    double[] L3_zSYRK_o_N;
+    double[] L3_zSYRK_A_kn;
+    double[] L3_zSYRK_o_T;
+
+    float[] L3_cHERK_A_nk;
+    float[] L3_cHERK_C_nn;
+    float[] L3_cHERK_o_N;
+    float[] L3_cHERK_A_kn;
+    float[] L3_cHERK_o_H;
+
+    double[] L3_zHERK_A_nk;
+    double[] L3_zHERK_C_nn;
+    double[] L3_zHERK_o_N;
+    double[] L3_zHERK_A_kn;
+    double[] L3_zHERK_o_H;
+
+    float[] L3_sSYR2K_A_nk;
+    float[] L3_sSYR2K_B_nk;
+    float[] L3_sSYR2K_C_nn;
+    float[] L3_sSYR2K_o_N;
+    float[] L3_sSYR2K_A_kn;
+    float[] L3_sSYR2K_B_kn;
+    float[] L3_sSYR2K_o_T;
+
+    double[] L3_dSYR2K_A_nk;
+    double[] L3_dSYR2K_B_nk;
+    double[] L3_dSYR2K_C_nn;
+    double[] L3_dSYR2K_o_N;
+    double[] L3_dSYR2K_A_kn;
+    double[] L3_dSYR2K_B_kn;
+    double[] L3_dSYR2K_o_T;
+
+    float[] L3_cSYR2K_A_nk;
+    float[] L3_cSYR2K_B_nk;
+    float[] L3_cSYR2K_C_nn;
+    float[] L3_cSYR2K_o_N;
+    float[] L3_cSYR2K_A_kn;
+    float[] L3_cSYR2K_B_kn;
+    float[] L3_cSYR2K_o_T;
+
+    double[] L3_zSYR2K_A_nk;
+    double[] L3_zSYR2K_B_nk;
+    double[] L3_zSYR2K_C_nn;
+    double[] L3_zSYR2K_o_N;
+    double[] L3_zSYR2K_A_kn;
+    double[] L3_zSYR2K_B_kn;
+    double[] L3_zSYR2K_o_T;
+
+    float[] L3_cHER2K_A_nk;
+    float[] L3_cHER2K_B_nk;
+    float[] L3_cHER2K_C_nn;
+    float[] L3_cHER2K_o_N;
+    float[] L3_cHER2K_A_kn;
+    float[] L3_cHER2K_B_kn;
+    float[] L3_cHER2K_o_H;
+
+    double[] L3_zHER2K_A_nk;
+    double[] L3_zHER2K_B_nk;
+    double[] L3_zHER2K_C_nn;
+    double[] L3_zHER2K_o_N;
+    double[] L3_zHER2K_A_kn;
+    double[] L3_zHER2K_B_kn;
+    double[] L3_zHER2K_o_H;
+
+    float[] L3_sTRMM_A_mm;
+    float[] L3_sTRMM_B_mn;
+    float[] L3_sTRMM_o_LUN;
+    float[] L3_sTRMM_A_nn;
+    float[] L3_sTRMM_o_RLT;
+
+    double[] L3_dTRMM_A_mm;
+    double[] L3_dTRMM_B_mn;
+    double[] L3_dTRMM_o_LUN;
+    double[] L3_dTRMM_A_nn;
+    double[] L3_dTRMM_o_RLT;
+
+    float[] L3_cTRMM_A_mm;
+    float[] L3_cTRMM_B_mn;
+    float[] L3_cTRMM_o_LUN;
+    float[] L3_cTRMM_A_nn;
+    float[] L3_cTRMM_o_RLT;
+
+    double[] L3_zTRMM_A_mm;
+    double[] L3_zTRMM_B_mn;
+    double[] L3_zTRMM_o_LUN;
+    double[] L3_zTRMM_A_nn;
+    double[] L3_zTRMM_o_RLT;
+
+    float[] L3_sTRSM_A_mm;
+    float[] L3_sTRSM_B_mn;
+    float[] L3_sTRSM_o_LUN;
+    float[] L3_sTRSM_A_nn;
+    float[] L3_sTRSM_o_RLT;
+
+    double[] L3_dTRSM_A_mm;
+    double[] L3_dTRSM_B_mn;
+    double[] L3_dTRSM_o_LUN;
+    double[] L3_dTRSM_A_nn;
+    double[] L3_dTRSM_o_RLT;
+
+    float[] L3_cTRSM_A_mm;
+    float[] L3_cTRSM_B_mn;
+    float[] L3_cTRSM_o_LUN;
+    float[] L3_cTRSM_A_nn;
+    float[] L3_cTRSM_o_RLT;
+
+    double[] L3_zTRSM_A_mm;
+    double[] L3_zTRSM_B_mn;
+    double[] L3_zTRSM_o_LUN;
+    double[] L3_zTRSM_A_nn;
+    double[] L3_zTRSM_o_RLT;
+
+    //load dimensions of matrixes
+    private void loadMNK() throws Exception {
+        String data = "";
+        int skipLine = 3;
+
+        for (int i = 0; i < skipLine; i++) {
+            data = mBufReader.readLine();
+        }
+        data = mBufReader.readLine();
+
+        String[] results = data.split(" ");
+        dM = Integer.parseInt(results[0]);
+        dN = Integer.parseInt(results[1]);
+        dK = Integer.parseInt(results[2]);
+        KL = Integer.parseInt(results[3]);
+        KU = Integer.parseInt(results[4]);
+    }
+
+    private float[] loadFloatArray() throws Exception {
+        String data = "";
+        int skipLine = 2;
+
+        for (int i = 0; i < skipLine; i++) {
+            data = mBufReader.readLine();
+        }
+        data = mBufReader.readLine();
+        String[] results = data.split(", ");
+
+        float[] floatArr = new float[results.length];
+        for (int i = 0; i < floatArr.length; i++) {
+            floatArr[i] = Float.parseFloat(results[i]);
+        }
+
+        return floatArr;
+    }
+
+    private double[] loadDoubleArray() throws Exception {
+        String data = "";
+        int skipLine = 2;
+
+        for (int i = 0; i < skipLine; i++) {
+            data = mBufReader.readLine();
+        }
+        data = mBufReader.readLine();
+        String[] results = data.split(", ");
+
+        double[] doubleArr = new double[results.length];
+        for (int i = 0; i < doubleArr.length; i++) {
+            doubleArr[i] = Double.parseDouble(results[i]);
+        }
+        return doubleArr;
+    }
+
+    //load data for L2 BLAS
+    private void loadGEMVData() throws Exception {
+        L2_sGEMV_A_mn = loadFloatArray();
+        L2_sGEMV_x_n1 = loadFloatArray();
+        L2_sGEMV_x_n2 = loadFloatArray();
+        L2_sGEMV_y_m1 = loadFloatArray();
+        L2_sGEMV_y_m2 = loadFloatArray();
+        L2_sGEMV_o_N = loadFloatArray();
+        L2_sGEMV_o_N2 = loadFloatArray();
+        L2_sGEMV_o_T = loadFloatArray();
+        L2_sGEMV_o_H = loadFloatArray();
+
+        L2_dGEMV_A_mn = loadDoubleArray();
+        L2_dGEMV_x_n1 = loadDoubleArray();
+        L2_dGEMV_x_n2 = loadDoubleArray();
+        L2_dGEMV_y_m1 = loadDoubleArray();
+        L2_dGEMV_y_m2 = loadDoubleArray();
+        L2_dGEMV_o_N = loadDoubleArray();
+        L2_dGEMV_o_N2 = loadDoubleArray();
+        L2_dGEMV_o_T = loadDoubleArray();
+        L2_dGEMV_o_H = loadDoubleArray();
+
+        L2_cGEMV_A_mn = loadFloatArray();
+        L2_cGEMV_x_n1 = loadFloatArray();
+        L2_cGEMV_x_n2 = loadFloatArray();
+        L2_cGEMV_y_m1 = loadFloatArray();
+        L2_cGEMV_y_m2 = loadFloatArray();
+        L2_cGEMV_o_N = loadFloatArray();
+        L2_cGEMV_o_N2 = loadFloatArray();
+        L2_cGEMV_o_T = loadFloatArray();
+        L2_cGEMV_o_H = loadFloatArray();
+
+        L2_zGEMV_A_mn = loadDoubleArray();
+        L2_zGEMV_x_n1 = loadDoubleArray();
+        L2_zGEMV_x_n2 = loadDoubleArray();
+        L2_zGEMV_y_m1 = loadDoubleArray();
+        L2_zGEMV_y_m2 = loadDoubleArray();
+        L2_zGEMV_o_N = loadDoubleArray();
+        L2_zGEMV_o_N2 = loadDoubleArray();
+        L2_zGEMV_o_T = loadDoubleArray();
+        L2_zGEMV_o_H = loadDoubleArray();
+
+    }
+
+    private void loadGBMVData() throws Exception {
+        L2_sGBMV_A_mn = loadFloatArray();
+        L2_sGBMV_x_n1 = loadFloatArray();
+        L2_sGBMV_x_n2 = loadFloatArray();
+        L2_sGBMV_y_m1 = loadFloatArray();
+        L2_sGBMV_y_m2 = loadFloatArray();
+        L2_sGBMV_o_N = loadFloatArray();
+        L2_sGBMV_o_N2 = loadFloatArray();
+        L2_sGBMV_o_T = loadFloatArray();
+        L2_sGBMV_o_H = loadFloatArray();
+
+        L2_dGBMV_A_mn = loadDoubleArray();
+        L2_dGBMV_x_n1 = loadDoubleArray();
+        L2_dGBMV_x_n2 = loadDoubleArray();
+        L2_dGBMV_y_m1 = loadDoubleArray();
+        L2_dGBMV_y_m2 = loadDoubleArray();
+        L2_dGBMV_o_N = loadDoubleArray();
+        L2_dGBMV_o_N2 = loadDoubleArray();
+        L2_dGBMV_o_T = loadDoubleArray();
+        L2_dGBMV_o_H = loadDoubleArray();
+
+        L2_cGBMV_A_mn = loadFloatArray();
+        L2_cGBMV_x_n1 = loadFloatArray();
+        L2_cGBMV_x_n2 = loadFloatArray();
+        L2_cGBMV_y_m1 = loadFloatArray();
+        L2_cGBMV_y_m2 = loadFloatArray();
+        L2_cGBMV_o_N = loadFloatArray();
+        L2_cGBMV_o_N2 = loadFloatArray();
+        L2_cGBMV_o_T = loadFloatArray();
+        L2_cGBMV_o_H = loadFloatArray();
+
+        L2_zGBMV_A_mn = loadDoubleArray();
+        L2_zGBMV_x_n1 = loadDoubleArray();
+        L2_zGBMV_x_n2 = loadDoubleArray();
+        L2_zGBMV_y_m1 = loadDoubleArray();
+        L2_zGBMV_y_m2 = loadDoubleArray();
+        L2_zGBMV_o_N = loadDoubleArray();
+        L2_zGBMV_o_N2 = loadDoubleArray();
+        L2_zGBMV_o_T = loadDoubleArray();
+        L2_zGBMV_o_H = loadDoubleArray();
+    }
+
+    private void loadHEMVData() throws Exception {
+        L2_cHEMV_A_nn = loadFloatArray();
+        L2_cHEMV_A_nn_pu = loadFloatArray();
+        L2_cHEMV_x_n1 = loadFloatArray();
+        L2_cHEMV_x_n2 = loadFloatArray();
+        L2_cHEMV_y_n1 = loadFloatArray();
+        L2_cHEMV_y_n2 = loadFloatArray();
+        L2_cHEMV_o_N = loadFloatArray();
+        L2_cHEMV_o_N2 = loadFloatArray();
+
+        L2_zHEMV_A_nn = loadDoubleArray();
+        L2_zHEMV_A_nn_pu = loadDoubleArray();
+        L2_zHEMV_x_n1 = loadDoubleArray();
+        L2_zHEMV_x_n2 = loadDoubleArray();
+        L2_zHEMV_y_n1 = loadDoubleArray();
+        L2_zHEMV_y_n2 = loadDoubleArray();
+        L2_zHEMV_o_N = loadDoubleArray();
+        L2_zHEMV_o_N2 = loadDoubleArray();
+    }
+
+    private void loadHBMVData() throws Exception {
+        L2_cHBMV_A_nn = loadFloatArray();
+        L2_cHBMV_x_n1 = loadFloatArray();
+        L2_cHBMV_x_n2 = loadFloatArray();
+        L2_cHBMV_y_n1 = loadFloatArray();
+        L2_cHBMV_y_n2 = loadFloatArray();
+        L2_cHBMV_o_N = loadFloatArray();
+        L2_cHBMV_o_N2 = loadFloatArray();
+
+        L2_zHBMV_A_nn = loadDoubleArray();
+        L2_zHBMV_x_n1 = loadDoubleArray();
+        L2_zHBMV_x_n2 = loadDoubleArray();
+        L2_zHBMV_y_n1 = loadDoubleArray();
+        L2_zHBMV_y_n2 = loadDoubleArray();
+        L2_zHBMV_o_N = loadDoubleArray();
+        L2_zHBMV_o_N2 = loadDoubleArray();
+    }
+
+    private void loadSYMVData() throws Exception {
+        L2_sSYMV_A_nn = loadFloatArray();
+        L2_sSYMV_A_nn_pu = loadFloatArray();
+        L2_sSYMV_x_n1 = loadFloatArray();
+        L2_sSYMV_x_n2 = loadFloatArray();
+        L2_sSYMV_y_n1 = loadFloatArray();
+        L2_sSYMV_y_n2 = loadFloatArray();
+        L2_sSYMV_o_N = loadFloatArray();
+        L2_sSYMV_o_N2 = loadFloatArray();
+
+        L2_dSYMV_A_nn = loadDoubleArray();
+        L2_dSYMV_A_nn_pu = loadDoubleArray();
+        L2_dSYMV_x_n1 = loadDoubleArray();
+        L2_dSYMV_x_n2 = loadDoubleArray();
+        L2_dSYMV_y_n1 = loadDoubleArray();
+        L2_dSYMV_y_n2 = loadDoubleArray();
+        L2_dSYMV_o_N = loadDoubleArray();
+        L2_dSYMV_o_N2 = loadDoubleArray();
+    }
+
+    private void loadSBMVData() throws Exception {
+        L2_sSBMV_A_nn = loadFloatArray();
+        L2_sSBMV_x_n1 = loadFloatArray();
+        L2_sSBMV_x_n2 = loadFloatArray();
+        L2_sSBMV_y_n1 = loadFloatArray();
+        L2_sSBMV_y_n2 = loadFloatArray();
+        L2_sSBMV_o_N = loadFloatArray();
+        L2_sSBMV_o_N2 = loadFloatArray();
+
+        L2_dSBMV_A_nn = loadDoubleArray();
+        L2_dSBMV_x_n1 = loadDoubleArray();
+        L2_dSBMV_x_n2 = loadDoubleArray();
+        L2_dSBMV_y_n1 = loadDoubleArray();
+        L2_dSBMV_y_n2 = loadDoubleArray();
+        L2_dSBMV_o_N = loadDoubleArray();
+        L2_dSBMV_o_N2 = loadDoubleArray();
+    }
+
+    private void loadTRMVData() throws Exception {
+        L2_sTRMV_A_nn = loadFloatArray();
+        L2_sTRMV_A_nn_pu = loadFloatArray();
+        L2_sTRMV_x_n1 = loadFloatArray();
+        L2_sTRMV_x_n2 = loadFloatArray();
+        L2_sTRMV_o_UN = loadFloatArray();
+        L2_sTRMV_o_UN2 = loadFloatArray();
+        L2_sTRMV_o_UT = loadFloatArray();
+        L2_sTRMV_o_UH = loadFloatArray();
+
+        L2_dTRMV_A_nn = loadDoubleArray();
+        L2_dTRMV_A_nn_pu = loadDoubleArray();
+        L2_dTRMV_x_n1 = loadDoubleArray();
+        L2_dTRMV_x_n2 = loadDoubleArray();
+        L2_dTRMV_o_UN = loadDoubleArray();
+        L2_dTRMV_o_UN2 = loadDoubleArray();
+        L2_dTRMV_o_UT = loadDoubleArray();
+        L2_dTRMV_o_UH = loadDoubleArray();
+
+        L2_cTRMV_A_nn = loadFloatArray();
+        L2_cTRMV_A_nn_pu = loadFloatArray();
+        L2_cTRMV_x_n1 = loadFloatArray();
+        L2_cTRMV_x_n2 = loadFloatArray();
+        L2_cTRMV_o_UN = loadFloatArray();
+        L2_cTRMV_o_UN2 = loadFloatArray();
+        L2_cTRMV_o_UT = loadFloatArray();
+        L2_cTRMV_o_UH = loadFloatArray();
+
+        L2_zTRMV_A_nn = loadDoubleArray();
+        L2_zTRMV_A_nn_pu = loadDoubleArray();
+        L2_zTRMV_x_n1 = loadDoubleArray();
+        L2_zTRMV_x_n2 = loadDoubleArray();
+        L2_zTRMV_o_UN = loadDoubleArray();
+        L2_zTRMV_o_UN2 = loadDoubleArray();
+        L2_zTRMV_o_UT = loadDoubleArray();
+        L2_zTRMV_o_UH = loadDoubleArray();
+    }
+
+    private void loadTBMVData() throws Exception {
+        L2_sTBMV_A_nn = loadFloatArray();
+        L2_sTBMV_x_n1 = loadFloatArray();
+        L2_sTBMV_x_n2 = loadFloatArray();
+        L2_sTBMV_o_UN = loadFloatArray();
+        L2_sTBMV_o_UN2 = loadFloatArray();
+        L2_sTBMV_o_UT = loadFloatArray();
+        L2_sTBMV_o_UH = loadFloatArray();
+
+        L2_dTBMV_A_nn = loadDoubleArray();
+        L2_dTBMV_x_n1 = loadDoubleArray();
+        L2_dTBMV_x_n2 = loadDoubleArray();
+        L2_dTBMV_o_UN = loadDoubleArray();
+        L2_dTBMV_o_UN2 = loadDoubleArray();
+        L2_dTBMV_o_UT = loadDoubleArray();
+        L2_dTBMV_o_UH = loadDoubleArray();
+
+        L2_cTBMV_A_nn = loadFloatArray();
+        L2_cTBMV_x_n1 = loadFloatArray();
+        L2_cTBMV_x_n2 = loadFloatArray();
+        L2_cTBMV_o_UN = loadFloatArray();
+        L2_cTBMV_o_UN2 = loadFloatArray();
+        L2_cTBMV_o_UT = loadFloatArray();
+        L2_cTBMV_o_UH = loadFloatArray();
+
+        L2_zTBMV_A_nn = loadDoubleArray();
+        L2_zTBMV_x_n1 = loadDoubleArray();
+        L2_zTBMV_x_n2 = loadDoubleArray();
+        L2_zTBMV_o_UN = loadDoubleArray();
+        L2_zTBMV_o_UN2 = loadDoubleArray();
+        L2_zTBMV_o_UT = loadDoubleArray();
+        L2_zTBMV_o_UH = loadDoubleArray();
+    }
+
+    private void loadTRSVData() throws Exception {
+        L2_sTRSV_A_nn = loadFloatArray();
+        L2_sTRSV_A_nn_pu = loadFloatArray();
+        L2_sTRSV_x_n1 = loadFloatArray();
+        L2_sTRSV_x_n2 = loadFloatArray();
+        L2_sTRSV_o_UN = loadFloatArray();
+        L2_sTRSV_o_UN2 = loadFloatArray();
+        L2_sTRSV_o_UT = loadFloatArray();
+        L2_sTRSV_o_UH = loadFloatArray();
+
+        L2_dTRSV_A_nn = loadDoubleArray();
+        L2_dTRSV_A_nn_pu = loadDoubleArray();
+        L2_dTRSV_x_n1 = loadDoubleArray();
+        L2_dTRSV_x_n2 = loadDoubleArray();
+        L2_dTRSV_o_UN = loadDoubleArray();
+        L2_dTRSV_o_UN2 = loadDoubleArray();
+        L2_dTRSV_o_UT = loadDoubleArray();
+        L2_dTRSV_o_UH = loadDoubleArray();
+
+        L2_cTRSV_A_nn = loadFloatArray();
+        L2_cTRSV_A_nn_pu = loadFloatArray();
+        L2_cTRSV_x_n1 = loadFloatArray();
+        L2_cTRSV_x_n2 = loadFloatArray();
+        L2_cTRSV_o_UN = loadFloatArray();
+        L2_cTRSV_o_UN2 = loadFloatArray();
+        L2_cTRSV_o_UT = loadFloatArray();
+        L2_cTRSV_o_UH = loadFloatArray();
+
+        L2_zTRSV_A_nn = loadDoubleArray();
+        L2_zTRSV_A_nn_pu = loadDoubleArray();
+        L2_zTRSV_x_n1 = loadDoubleArray();
+        L2_zTRSV_x_n2 = loadDoubleArray();
+        L2_zTRSV_o_UN = loadDoubleArray();
+        L2_zTRSV_o_UN2 = loadDoubleArray();
+        L2_zTRSV_o_UT = loadDoubleArray();
+        L2_zTRSV_o_UH = loadDoubleArray();
+    }
+
+    private void loadTBSVData() throws Exception {
+        L2_sTBSV_A_nn = loadFloatArray();
+        L2_sTBSV_x_n1 = loadFloatArray();
+        L2_sTBSV_x_n2 = loadFloatArray();
+        L2_sTBSV_o_UN = loadFloatArray();
+        L2_sTBSV_o_UN2 = loadFloatArray();
+        L2_sTBSV_o_UT = loadFloatArray();
+        L2_sTBSV_o_UH = loadFloatArray();
+
+        L2_dTBSV_A_nn = loadDoubleArray();
+        L2_dTBSV_x_n1 = loadDoubleArray();
+        L2_dTBSV_x_n2 = loadDoubleArray();
+        L2_dTBSV_o_UN = loadDoubleArray();
+        L2_dTBSV_o_UN2 = loadDoubleArray();
+        L2_dTBSV_o_UT = loadDoubleArray();
+        L2_dTBSV_o_UH = loadDoubleArray();
+
+        L2_cTBSV_A_nn = loadFloatArray();
+        L2_cTBSV_x_n1 = loadFloatArray();
+        L2_cTBSV_x_n2 = loadFloatArray();
+        L2_cTBSV_o_UN = loadFloatArray();
+        L2_cTBSV_o_UN2 = loadFloatArray();
+        L2_cTBSV_o_UT = loadFloatArray();
+        L2_cTBSV_o_UH = loadFloatArray();
+
+        L2_zTBSV_A_nn = loadDoubleArray();
+        L2_zTBSV_x_n1 = loadDoubleArray();
+        L2_zTBSV_x_n2 = loadDoubleArray();
+        L2_zTBSV_o_UN = loadDoubleArray();
+        L2_zTBSV_o_UN2 = loadDoubleArray();
+        L2_zTBSV_o_UT = loadDoubleArray();
+        L2_zTBSV_o_UH = loadDoubleArray();
+    }
+
+    private void loadGERData() throws Exception {
+        L2_sGER_A_mn = loadFloatArray();
+        L2_sGER_x_m1 = loadFloatArray();
+        L2_sGER_x_m2 = loadFloatArray();
+        L2_sGER_y_n1 = loadFloatArray();
+        L2_sGER_y_n2 = loadFloatArray();
+        L2_sGER_o_N = loadFloatArray();
+
+        L2_dGER_A_mn = loadDoubleArray();
+        L2_dGER_x_m1 = loadDoubleArray();
+        L2_dGER_x_m2 = loadDoubleArray();
+        L2_dGER_y_n1 = loadDoubleArray();
+        L2_dGER_y_n2 = loadDoubleArray();
+        L2_dGER_o_N = loadDoubleArray();
+    }
+
+    private void loadGERUData() throws Exception {
+        L2_cGERU_A_mn = loadFloatArray();
+        L2_cGERU_x_m1 = loadFloatArray();
+        L2_cGERU_x_m2 = loadFloatArray();
+        L2_cGERU_y_n1 = loadFloatArray();
+        L2_cGERU_y_n2 = loadFloatArray();
+        L2_cGERU_o_N = loadFloatArray();
+
+        L2_zGERU_A_mn = loadDoubleArray();
+        L2_zGERU_x_m1 = loadDoubleArray();
+        L2_zGERU_x_m2 = loadDoubleArray();
+        L2_zGERU_y_n1 = loadDoubleArray();
+        L2_zGERU_y_n2 = loadDoubleArray();
+        L2_zGERU_o_N = loadDoubleArray();
+    }
+
+    private void loadGERCData() throws Exception {
+        L2_cGERC_A_mn = loadFloatArray();
+        L2_cGERC_x_m1 = loadFloatArray();
+        L2_cGERC_x_m2 = loadFloatArray();
+        L2_cGERC_y_n1 = loadFloatArray();
+        L2_cGERC_y_n2 = loadFloatArray();
+        L2_cGERC_o_N = loadFloatArray();
+
+        L2_zGERC_A_mn = loadDoubleArray();
+        L2_zGERC_x_m1 = loadDoubleArray();
+        L2_zGERC_x_m2 = loadDoubleArray();
+        L2_zGERC_y_n1 = loadDoubleArray();
+        L2_zGERC_y_n2 = loadDoubleArray();
+        L2_zGERC_o_N = loadDoubleArray();
+    }
+
+    private void loadHERData() throws Exception {
+        L2_cHER_A_nn = loadFloatArray();
+        L2_cHER_A_nn_pu = loadFloatArray();
+        L2_cHER_x_n1 = loadFloatArray();
+        L2_cHER_x_n2 = loadFloatArray();
+        L2_cHER_o_N = loadFloatArray();
+        L2_cHER_o_N_pu = loadFloatArray();
+
+        L2_zHER_A_nn = loadDoubleArray();
+        L2_zHER_A_nn_pu = loadDoubleArray();
+        L2_zHER_x_n1 = loadDoubleArray();
+        L2_zHER_x_n2 = loadDoubleArray();
+        L2_zHER_o_N = loadDoubleArray();
+        L2_zHER_o_N_pu = loadDoubleArray();
+    }
+
+    private void loadHER2Data() throws Exception {
+        L2_cHER2_A_nn = loadFloatArray();
+        L2_cHER2_A_nn_pu = loadFloatArray();
+        L2_cHER2_x_n1 = loadFloatArray();
+        L2_cHER2_x_n2 = loadFloatArray();
+        L2_cHER2_y_n1 = loadFloatArray();
+        L2_cHER2_y_n2 = loadFloatArray();
+        L2_cHER2_o_N = loadFloatArray();
+        L2_cHER2_o_N_pu = loadFloatArray();
+
+        L2_zHER2_A_nn = loadDoubleArray();
+        L2_zHER2_A_nn_pu = loadDoubleArray();
+        L2_zHER2_x_n1 = loadDoubleArray();
+        L2_zHER2_x_n2 = loadDoubleArray();
+        L2_zHER2_y_n1 = loadDoubleArray();
+        L2_zHER2_y_n2 = loadDoubleArray();
+        L2_zHER2_o_N = loadDoubleArray();
+        L2_zHER2_o_N_pu = loadDoubleArray();
+    }
+
+    private void loadSYRData() throws Exception {
+        L2_sSYR_A_nn = loadFloatArray();
+        L2_sSYR_A_nn_pu = loadFloatArray();
+        L2_sSYR_x_n1 = loadFloatArray();
+        L2_sSYR_x_n2 = loadFloatArray();
+        L2_sSYR_o_N = loadFloatArray();
+        L2_sSYR_o_N_pu = loadFloatArray();
+
+        L2_dSYR_A_nn = loadDoubleArray();
+        L2_dSYR_A_nn_pu = loadDoubleArray();
+        L2_dSYR_x_n1 = loadDoubleArray();
+        L2_dSYR_x_n2 = loadDoubleArray();
+        L2_dSYR_o_N = loadDoubleArray();
+        L2_dSYR_o_N_pu = loadDoubleArray();
+    }
+
+    private void loadSYR2Data() throws Exception {
+        L2_sSYR2_A_nn = loadFloatArray();
+        L2_sSYR2_A_nn_pu = loadFloatArray();
+        L2_sSYR2_x_n1 = loadFloatArray();
+        L2_sSYR2_x_n2 = loadFloatArray();
+        L2_sSYR2_y_n1 = loadFloatArray();
+        L2_sSYR2_y_n2 = loadFloatArray();
+        L2_sSYR2_o_N = loadFloatArray();
+        L2_sSYR2_o_N_pu = loadFloatArray();
+
+        L2_dSYR2_A_nn = loadDoubleArray();
+        L2_dSYR2_A_nn_pu = loadDoubleArray();
+        L2_dSYR2_x_n1 = loadDoubleArray();
+        L2_dSYR2_x_n2 = loadDoubleArray();
+        L2_dSYR2_y_n1 = loadDoubleArray();
+        L2_dSYR2_y_n2 = loadDoubleArray();
+        L2_dSYR2_o_N = loadDoubleArray();
+        L2_dSYR2_o_N_pu = loadDoubleArray();
+    }
+
+    //load data for L3 BLAS
+    private void loadGEMMData() throws Exception {
+        L3_sGEMM_A_mk = loadFloatArray();
+        L3_sGEMM_B_kn = loadFloatArray();
+        L3_sGEMM_C_mn = loadFloatArray();
+        L3_sGEMM_o_NN = loadFloatArray();
+        L3_sGEMM_A_km = loadFloatArray();
+        L3_sGEMM_B_nk = loadFloatArray();
+        L3_sGEMM_o_TT = loadFloatArray();
+        L3_sGEMM_o_HH = loadFloatArray();
+
+        L3_dGEMM_A_mk = loadDoubleArray();
+        L3_dGEMM_B_kn = loadDoubleArray();
+        L3_dGEMM_C_mn = loadDoubleArray();
+        L3_dGEMM_o_NN = loadDoubleArray();
+        L3_dGEMM_A_km = loadDoubleArray();
+        L3_dGEMM_B_nk = loadDoubleArray();
+        L3_dGEMM_o_TT = loadDoubleArray();
+        L3_dGEMM_o_HH = loadDoubleArray();
+
+        L3_cGEMM_A_mk = loadFloatArray();
+        L3_cGEMM_B_kn = loadFloatArray();
+        L3_cGEMM_C_mn = loadFloatArray();
+        L3_cGEMM_o_NN = loadFloatArray();
+        L3_cGEMM_A_km = loadFloatArray();
+        L3_cGEMM_B_nk = loadFloatArray();
+        L3_cGEMM_o_TT = loadFloatArray();
+        L3_cGEMM_o_HH = loadFloatArray();
+
+        L3_zGEMM_A_mk = loadDoubleArray();
+        L3_zGEMM_B_kn = loadDoubleArray();
+        L3_zGEMM_C_mn = loadDoubleArray();
+        L3_zGEMM_o_NN = loadDoubleArray();
+        L3_zGEMM_A_km = loadDoubleArray();
+        L3_zGEMM_B_nk = loadDoubleArray();
+        L3_zGEMM_o_TT = loadDoubleArray();
+        L3_zGEMM_o_HH = loadDoubleArray();
+    }
+
+    private void loadSYMMData() throws Exception {
+        L3_sSYMM_A_mm = loadFloatArray();
+        L3_sSYMM_B_mn = loadFloatArray();
+        L3_sSYMM_C_mn = loadFloatArray();
+        L3_sSYMM_o_L = loadFloatArray();
+        L3_sSYMM_A_nn = loadFloatArray();
+        L3_sSYMM_o_R = loadFloatArray();
+
+        L3_dSYMM_A_mm = loadDoubleArray();
+        L3_dSYMM_B_mn = loadDoubleArray();
+        L3_dSYMM_C_mn = loadDoubleArray();
+        L3_dSYMM_o_L = loadDoubleArray();
+        L3_dSYMM_A_nn = loadDoubleArray();
+        L3_dSYMM_o_R = loadDoubleArray();
+
+        L3_cSYMM_A_mm = loadFloatArray();
+        L3_cSYMM_B_mn = loadFloatArray();
+        L3_cSYMM_C_mn = loadFloatArray();
+        L3_cSYMM_o_L = loadFloatArray();
+        L3_cSYMM_A_nn = loadFloatArray();
+        L3_cSYMM_o_R = loadFloatArray();
+
+        L3_zSYMM_A_mm = loadDoubleArray();
+        L3_zSYMM_B_mn = loadDoubleArray();
+        L3_zSYMM_C_mn = loadDoubleArray();
+        L3_zSYMM_o_L = loadDoubleArray();
+        L3_zSYMM_A_nn = loadDoubleArray();
+        L3_zSYMM_o_R = loadDoubleArray();
+    }
+
+    private void loadHEMMData() throws Exception {
+        L3_cHEMM_A_mm = loadFloatArray();
+        L3_cHEMM_B_mn = loadFloatArray();
+        L3_cHEMM_C_mn = loadFloatArray();
+        L3_cHEMM_o_L = loadFloatArray();
+        L3_cHEMM_A_nn = loadFloatArray();
+        L3_cHEMM_o_R = loadFloatArray();
+
+        L3_zHEMM_A_mm = loadDoubleArray();
+        L3_zHEMM_B_mn = loadDoubleArray();
+        L3_zHEMM_C_mn = loadDoubleArray();
+        L3_zHEMM_o_L = loadDoubleArray();
+        L3_zHEMM_A_nn = loadDoubleArray();
+        L3_zHEMM_o_R = loadDoubleArray();
+    }
+
+    private void loadSYRKData() throws Exception {
+        L3_sSYRK_A_nk = loadFloatArray();
+        L3_sSYRK_C_nn = loadFloatArray();
+        L3_sSYRK_o_N = loadFloatArray();
+        L3_sSYRK_A_kn = loadFloatArray();
+        L3_sSYRK_o_T = loadFloatArray();
+
+        L3_dSYRK_A_nk = loadDoubleArray();
+        L3_dSYRK_C_nn = loadDoubleArray();
+        L3_dSYRK_o_N = loadDoubleArray();
+        L3_dSYRK_A_kn = loadDoubleArray();
+        L3_dSYRK_o_T = loadDoubleArray();
+
+        L3_cSYRK_A_nk = loadFloatArray();
+        L3_cSYRK_C_nn = loadFloatArray();
+        L3_cSYRK_o_N = loadFloatArray();
+        L3_cSYRK_A_kn = loadFloatArray();
+        L3_cSYRK_o_T = loadFloatArray();
+
+        L3_zSYRK_A_nk = loadDoubleArray();
+        L3_zSYRK_C_nn = loadDoubleArray();
+        L3_zSYRK_o_N = loadDoubleArray();
+        L3_zSYRK_A_kn = loadDoubleArray();
+        L3_zSYRK_o_T = loadDoubleArray();
+    }
+
+    private void loadHERKData() throws Exception {
+        L3_cHERK_A_nk = loadFloatArray();
+        L3_cHERK_C_nn = loadFloatArray();
+        L3_cHERK_o_N = loadFloatArray();
+        L3_cHERK_A_kn = loadFloatArray();
+        L3_cHERK_o_H = loadFloatArray();
+
+        L3_zHERK_A_nk = loadDoubleArray();
+        L3_zHERK_C_nn = loadDoubleArray();
+        L3_zHERK_o_N = loadDoubleArray();
+        L3_zHERK_A_kn = loadDoubleArray();
+        L3_zHERK_o_H = loadDoubleArray();
+    }
+
+    private void loadSYR2KData() throws Exception {
+        L3_sSYR2K_A_nk = loadFloatArray();
+        L3_sSYR2K_B_nk = loadFloatArray();
+        L3_sSYR2K_C_nn = loadFloatArray();
+        L3_sSYR2K_o_N = loadFloatArray();
+        L3_sSYR2K_A_kn = loadFloatArray();
+        L3_sSYR2K_B_kn = loadFloatArray();
+        L3_sSYR2K_o_T = loadFloatArray();
+
+        L3_dSYR2K_A_nk = loadDoubleArray();
+        L3_dSYR2K_B_nk = loadDoubleArray();
+        L3_dSYR2K_C_nn = loadDoubleArray();
+        L3_dSYR2K_o_N = loadDoubleArray();
+        L3_dSYR2K_A_kn = loadDoubleArray();
+        L3_dSYR2K_B_kn = loadDoubleArray();
+        L3_dSYR2K_o_T = loadDoubleArray();
+
+        L3_cSYR2K_A_nk = loadFloatArray();
+        L3_cSYR2K_B_nk = loadFloatArray();
+        L3_cSYR2K_C_nn = loadFloatArray();
+        L3_cSYR2K_o_N = loadFloatArray();
+        L3_cSYR2K_A_kn = loadFloatArray();
+        L3_cSYR2K_B_kn = loadFloatArray();
+        L3_cSYR2K_o_T = loadFloatArray();
+
+        L3_zSYR2K_A_nk = loadDoubleArray();
+        L3_zSYR2K_B_nk = loadDoubleArray();
+        L3_zSYR2K_C_nn = loadDoubleArray();
+        L3_zSYR2K_o_N = loadDoubleArray();
+        L3_zSYR2K_A_kn = loadDoubleArray();
+        L3_zSYR2K_B_kn = loadDoubleArray();
+        L3_zSYR2K_o_T = loadDoubleArray();
+    }
+
+    private void loadHER2KData() throws Exception {
+        L3_cHER2K_A_nk = loadFloatArray();
+        L3_cHER2K_B_nk = loadFloatArray();
+        L3_cHER2K_C_nn = loadFloatArray();
+        L3_cHER2K_o_N = loadFloatArray();
+        L3_cHER2K_A_kn = loadFloatArray();
+        L3_cHER2K_B_kn = loadFloatArray();
+        L3_cHER2K_o_H = loadFloatArray();
+
+        L3_zHER2K_A_nk = loadDoubleArray();
+        L3_zHER2K_B_nk = loadDoubleArray();
+        L3_zHER2K_C_nn = loadDoubleArray();
+        L3_zHER2K_o_N = loadDoubleArray();
+        L3_zHER2K_A_kn = loadDoubleArray();
+        L3_zHER2K_B_kn = loadDoubleArray();
+        L3_zHER2K_o_H = loadDoubleArray();
+    }
+
+    private void loadTRMMData() throws Exception {
+        L3_sTRMM_A_mm = loadFloatArray();
+        L3_sTRMM_B_mn = loadFloatArray();
+        L3_sTRMM_o_LUN = loadFloatArray();
+        L3_sTRMM_A_nn = loadFloatArray();
+        L3_sTRMM_o_RLT = loadFloatArray();
+
+        L3_dTRMM_A_mm = loadDoubleArray();
+        L3_dTRMM_B_mn = loadDoubleArray();
+        L3_dTRMM_o_LUN = loadDoubleArray();
+        L3_dTRMM_A_nn = loadDoubleArray();
+        L3_dTRMM_o_RLT = loadDoubleArray();
+
+        L3_cTRMM_A_mm = loadFloatArray();
+        L3_cTRMM_B_mn = loadFloatArray();
+        L3_cTRMM_o_LUN = loadFloatArray();
+        L3_cTRMM_A_nn = loadFloatArray();
+        L3_cTRMM_o_RLT = loadFloatArray();
+
+        L3_zTRMM_A_mm = loadDoubleArray();
+        L3_zTRMM_B_mn = loadDoubleArray();
+        L3_zTRMM_o_LUN = loadDoubleArray();
+        L3_zTRMM_A_nn = loadDoubleArray();
+        L3_zTRMM_o_RLT = loadDoubleArray();
+    }
+
+    private void loadTRSMData() throws Exception {
+        L3_sTRSM_A_mm = loadFloatArray();
+        L3_sTRSM_B_mn = loadFloatArray();
+        L3_sTRSM_o_LUN = loadFloatArray();
+        L3_sTRSM_A_nn = loadFloatArray();
+        L3_sTRSM_o_RLT = loadFloatArray();
+
+        L3_dTRSM_A_mm = loadDoubleArray();
+        L3_dTRSM_B_mn = loadDoubleArray();
+        L3_dTRSM_o_LUN = loadDoubleArray();
+        L3_dTRSM_A_nn = loadDoubleArray();
+        L3_dTRSM_o_RLT = loadDoubleArray();
+
+        L3_cTRSM_A_mm = loadFloatArray();
+        L3_cTRSM_B_mn = loadFloatArray();
+        L3_cTRSM_o_LUN = loadFloatArray();
+        L3_cTRSM_A_nn = loadFloatArray();
+        L3_cTRSM_o_RLT = loadFloatArray();
+
+        L3_zTRSM_A_mm = loadDoubleArray();
+        L3_zTRSM_B_mn = loadDoubleArray();
+        L3_zTRSM_o_LUN = loadDoubleArray();
+        L3_zTRSM_A_nn = loadDoubleArray();
+        L3_zTRSM_o_RLT = loadDoubleArray();
+    }
+
+    void loadData(Context ctx) throws Exception {
+        InputStream is = ctx.getAssets().open("BLASData.txt");
+        mBufReader = new BufferedReader(new InputStreamReader(is));
+
+        //Load data sequentially
+        loadMNK();
+        loadGEMVData();
+        loadGBMVData();
+        loadHEMVData();
+        loadHBMVData();
+        loadSYMVData();
+        loadSBMVData();
+        loadTRMVData();
+        loadTBMVData();
+        loadTRSVData();
+        loadTBSVData();
+        loadGERData();
+        loadGERUData();
+        loadGERCData();
+        loadHERData();
+        loadHER2Data();
+        loadSYRData();
+        loadSYR2Data();
+        loadGEMMData();
+        loadSYMMData();
+        loadHEMMData();
+        loadSYRKData();
+        loadHERKData();
+        loadSYR2KData();
+        loadHER2KData();
+        loadTRMMData();
+        loadTRSMData();
+    }
+
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/BNNMTest.java b/tests/tests/renderscript/src/android/renderscript/cts/BNNMTest.java
new file mode 100644
index 0000000..1822f6a
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/BNNMTest.java
@@ -0,0 +1,500 @@
+/*
+ * Copyright (C) 2015 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.renderscript.cts;
+
+import android.renderscript.*;
+import android.util.Log;
+import java.util.Random;
+import java.lang.Math;
+
+public class BNNMTest extends RSBaseCompute {
+
+    static {
+        System.loadLibrary("bnnmdata_jni");
+    }
+
+    native void getData(byte[] a, byte[] b, byte[] c);
+
+    // In Java, the eight-bit 'byte' type is signed, but the API for the 8-bit
+    // matrix multiplication deals with unsigned bytes. This is a convenience
+    // function that converts arrays of unsigned ints to their equivalent
+    // representations as signed bytes. For example, the bit pattern 0xff is 255
+    // as an unsigned value, but -127 as a Java signed byte. So if you pass in an
+    // array of int[] {255} into this function, you'll get back byte[] {-127}.
+    private byte[] unsignedToSignedByte(int[] input) {
+        byte[] output = new byte[input.length];
+        for (int i = 0; i < input.length; ++i) {
+            output[i] = (byte)(input[i]);
+        }
+        return output;
+    }
+
+    private void addByteNoise(byte[] data, int count, float frequency, int maxDelta) {
+        Random rand = new Random();
+        for (int n = 0; n < count; ++n) {
+            if (rand.nextFloat() < frequency) {
+                final int originalValue = data[n];
+                final float direction = rand.nextFloat();
+                int delta = (int)(Math.ceil(rand.nextFloat() * maxDelta));
+                if (direction < 0.5f) {
+                    delta = -delta;
+                }
+                int newValue = (originalValue + delta);
+                if (newValue < -127) {
+                    newValue = -127;
+                }
+                if (newValue > 127) {
+                    newValue = 127;
+                }
+                data[n] = (byte)(newValue);
+            }
+        }
+    }
+
+    private boolean testWithTolerance(byte[] c_byte, byte[] c_byte_output) {
+
+        // The testing procedure here is a bit complex, but the aim is to mimic the
+        // requirements we've empirically found running deep neural networks in real
+        // applications. We want to open the door to vendors using approximations that
+        // produce slightly different results for optimization's sake, but keep the
+        // precision loss within small enough bounds that we don't lose accuracy in
+        // the final result.
+        // After experimentation, we've found that we can tolerate around 5% of the
+        // output bytes being different by 1. Any larger differences are not tolerable
+        // and we can't get good results if the frequency of small differences is
+        // higher than 5%. This test tries to measure those properties on an example
+        // set of parameters that were captured from a real application.
+        // For example, if you uncommented this function that adds random noise to the
+        // results at a 3% specified frequency, the test should fail:
+        // AddByteNoise(c_byte_output, c_count, 0.03f, 1);
+
+        final boolean areSizesDifferent = (c_byte.length != c_byte_output.length);
+        final int c_count = Math.min(c_byte.length, c_byte_output.length);
+
+        int howManyDifferent = 0;
+        boolean areAnyTooDifferent = false;
+        for (int i = 0; i < c_count; i++) {
+            byte expectedValue = c_byte[i];
+            byte actualValue = c_byte_output[i];
+            int delta = (expectedValue - actualValue);
+            // First make sure that the difference is no more than one.
+            if ((delta < -1) || (delta > 1)) {
+                areAnyTooDifferent = true;
+            }
+            // If there is a difference, increment the counter to track it.
+            if (delta != 0) {
+                // Don't spam the logs if too many are different.
+                if (howManyDifferent < 50) {
+                    android.util.Log.e("BNNM", "Mismatch at " + i +
+                                       ": expected " + (expectedValue & 0xff) +
+                                       ", got " + (actualValue & 0xff));
+                }
+                ++howManyDifferent;
+            }
+        }
+        // We want no more than 2% of the values to show any differences, so work out
+        // what that means in absolute numbers.
+        final int percentThreshold = 2;
+        final int differenceThreshold = Math.max((percentThreshold * c_count) / 100, 1);
+        final boolean areTooManyDifferent = (howManyDifferent >= differenceThreshold);
+
+        if (areAnyTooDifferent) {
+            android.util.Log.e("BNNM", "Some outputs were too different.");
+        }
+
+        if (areTooManyDifferent) {
+            android.util.Log.e("BNNM", "There were too many small differences." +
+                               " We can tolerate " + percentThreshold + "% (" +
+                               differenceThreshold + "), but there were " + howManyDifferent);
+        }
+
+        return !(areAnyTooDifferent || areTooManyDifferent);
+    }
+
+
+    private byte[] runBNNM(int m, int n, int k, byte[] a_byte, int a_offset, byte[] b_byte,
+                           int b_offset, int c_offset, int c_mult_int) {
+        Allocation A, B, C;
+        Type.Builder builder = new Type.Builder(mRS, Element.U8(mRS));
+        Type a_type = builder.setX(k).setY(m).create();
+        Type b_type = builder.setX(k).setY(n).create();
+        Type c_type = builder.setX(n).setY(m).create();
+
+        A = Allocation.createTyped(mRS, a_type);
+        B = Allocation.createTyped(mRS, b_type);
+        C = Allocation.createTyped(mRS, c_type);
+
+        A.copyFrom(a_byte);
+        B.copyFrom(b_byte);
+        // C doesn't matter, is output only
+
+        ScriptIntrinsicBLAS blas = ScriptIntrinsicBLAS.create(mRS);
+        blas.BNNM(A, a_offset, B, b_offset, C, c_offset, c_mult_int);
+
+        int c_count = (m * n);
+        byte[] c_byte_output = new byte[c_count];
+        C.copyTo(c_byte_output);
+        return c_byte_output;
+    }
+
+
+
+    // This test multiplies a couple of small 8-bit matrices, and compares the
+    // results with hand-calculated expectations.
+    public void testSmallMatrices() {
+        // The A matrix is:
+        // |   1 |   4 |
+        // |   2 |   5 |
+        // |   3 |   6 |
+        byte[] a_data = unsignedToSignedByte(new int[] {
+                1, 2, 3,
+                4, 5, 6,
+            });
+        final int a_rows = 3;
+        final int a_cols = 2;
+        final int a_offset = 0;
+        // The B matrix is:
+        // |  -1 |  -2 |  -3 |  -4 |
+        // |  -5 |  -6 |  -7 |  -8 |
+        // |  -9 | -10 | -11 | -12 |
+        byte[] b_data = unsignedToSignedByte(new int[] {
+                11, 7, 3,
+                10, 6, 2,
+                9, 5, 1,
+                8, 4, 0,
+            });
+        final int b_cols = 4;
+        final int b_offset = 12;
+        // EightBitGemm implements C = B.transposed() * A,
+        // so we expect to get these results:
+        // 1*-1 + 2*-5 + 3*-9 + 128 = 90
+        // 1*-2 + 2*-6 + 3*-10 + 128 = 84
+        // 1*-3 + 2*-7 + 3*-11 + 128 = 78
+        // 1*-4 + 2*-8 + 3*-12 + 128 = 72
+        // 4*-1 + 5*-5 + 6*-9 + 128 = 45
+        // 4*-2 + 5*-6 + 6*-10 + 128 = 30
+        // 4*-3 + 5*-7 + 6*-11 + 128 = 15
+        // 4*-4 + 5*-8 + 6*-12 + 128 = 0
+        // | 90 |  45 |
+        // | 84 |  30 |
+        // | 78 | 15 |
+        // | 72 | 0 |
+        final int c_offset = 128;
+        final int c_shift = 21;
+        final int c_mult_int = (1 << c_shift);
+        byte[] expected_data = unsignedToSignedByte(new int[] {
+                90, 84, 78, 72,
+                45, 30, 15, 0,
+            });
+
+        final int m = a_cols;
+        final int n = b_cols;
+        final int k = a_rows;
+
+        byte[] c_byte_output = runBNNM(m, n, k, a_data, a_offset, b_data, b_offset,
+                                       c_offset, c_mult_int);
+        assertTrue(testWithTolerance(expected_data, c_byte_output));
+    }
+
+
+    // This test multiplies two medium-sized 8-bit matrices, and compares the
+    // results with the expected values. The data itself is fairly arbitrary.
+    public void testMediumMatrices1() {
+        byte[] a_data = unsignedToSignedByte(new int[] {
+                1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+                12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
+                23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
+                0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+                23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+            });
+        final int a_rows = 11;
+        final int a_cols = 5;
+        final int a_offset = 0;
+        byte[] b_data = unsignedToSignedByte(new int[] {
+                0, 2, 4, 6, 8, 10, 1, 3, 5, 7, 9, 11,
+                10, 12, 14, 16, 18, 20, 11, 13, 15, 17, 19, 21,
+                20, 22, 24, 26, 28, 30, 21, 23, 25, 27, 29, 31,
+                30, 32, 34, 36, 38, 40, 31, 33, 35, 37, 39, 41,
+                40, 42, 44, 46, 48, 50, 41, 43, 45, 47, 49, 51,
+                50, 52, 54, 56, 58, 60, 51, 53, 55, 57, 59, 61,
+                60, 62, 64, 66, 68, 70, 61, 63, 65, 67, 69, 71,
+            });
+        final int b_cols = 7;
+        final int b_offset = 10;
+        final int c_offset = 16384;
+        final int c_shift = 21;
+        final int c_mult_int = (1 << (c_shift - 7));
+        byte[] expected_data = unsignedToSignedByte(new int[] {
+                126, 131, 135, 140, 146, 151, 155,
+                121, 135, 148, 162, 176, 190, 202,
+                116, 139, 161, 184, 206, 229, 249,
+                128, 128, 129, 129, 129, 130, 130,
+                118, 136, 155, 173, 191, 210, 226,
+            });
+
+        final int m = a_cols;
+        final int n = b_cols;
+        final int k = a_rows;
+
+        byte[] c_byte_output = runBNNM(m, n, k, a_data, a_offset, b_data, b_offset,
+                                       c_offset, c_mult_int);
+        assertTrue(testWithTolerance(expected_data, c_byte_output));
+    }
+
+    // This test multiplies another two medium 8-bit matrices, and compares the
+    // results with the expected values. The data here is arbitrary.
+    public void testMediumMatrices2() {
+        byte[] a_data = unsignedToSignedByte(new int[] {
+                1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
+                23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,
+                1, 23, 2, 22, 3, 21, 4, 20, 5, 19, 6, 18, 7, 17, 8, 16, 9, 15, 10, 14, 11, 13, 12,
+                23, 1, 22, 2, 21, 3, 20, 4, 19, 5, 18, 6, 17, 7, 16, 8, 15, 9, 14, 10, 13, 11, 12,
+                1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+                3, 1, 4, 1, 5, 8, 2, 3, 1, 14, 11, 15, 18, 12, 13, 11, 14, 11, 15, 18, 12, 13, 11,
+                8, 0, 5, 8, 1, 3, 7, 5, 7, 13, 10, 23, 13, 11, 17, 23, 12, 19, 17, 13, 14, 10, 19,
+            });
+        final int a_rows = 23;
+        final int a_cols = 7;
+        final int a_offset = 13;
+        byte[] b_data = unsignedToSignedByte(new int[] {
+                0, 2, 4, 6, 8, 10, 1, 3, 5, 7, 9, 11, 0, 2, 4, 6, 8, 10, 1, 3, 5, 7, 9,
+                0, 20, 40, 60, 80, 10, 11, 13, 15, 17, 19, 21, 10, 12, 14, 6, 8, 10, 1, 3, 5, 7, 9,
+                1, 21, 41, 61, 81, 11, 12, 14, 16, 18, 20, 22, 11, 13, 15, 7, 9, 11, 2, 4, 6, 8, 9,
+                0, 19, 39, 59, 79, 9, 10, 12, 14, 16, 18, 20, 9, 11, 13, 5, 7, 9, 0, 2, 4, 6, 8,
+                2, 22, 42, 62, 82, 12, 13, 15, 17, 19, 21, 23, 12, 14, 16, 8, 9, 12, 3, 5, 7, 9, 9,
+                0, 18, 38, 58, 78, 8, 9, 11, 13, 15, 17, 19, 8, 10, 12, 4, 6, 8, 0, 1, 3, 5, 7,
+                3, 23, 43, 63, 83, 13, 14, 16, 18, 20, 22, 24, 13, 15, 17, 9, 9, 13, 4, 6, 8, 9, 9,
+                0, 17, 37, 57, 77, 7, 8, 10, 12, 14, 16, 18, 7, 9, 11, 3, 5, 7, 0, 0, 2, 4, 6,
+                10, 20, 30, 40, 50, 1, 2, 3, 4, 5, 11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 1, 2, 3,
+            });
+        final int b_cols = 9;
+        final int b_offset = 23;
+        final int c_offset = 2121;
+        final int c_shift = 21;
+        final int c_mult_int = 132359;
+        byte[] expected_data = unsignedToSignedByte(new int[] {
+                167, 53, 51, 54, 49, 55, 46,
+                56, 116, 153, 232, 232, 234, 231,
+                236, 232, 237, 174, 168, 131, 130,
+                132, 129, 133, 128, 133, 134, 151,
+                154, 152, 156, 151, 158, 150, 160,
+                156, 255, 113, 106, 120, 98, 127,
+                91, 134, 178, 231, 102, 97, 107,
+                92, 111, 87, 116, 164, 187, 76,
+                73, 78, 70, 81, 67, 83, 139,
+            });
+
+        final int m = a_cols;
+        final int n = b_cols;
+        final int k = a_rows;
+
+        byte[] c_byte_output = runBNNM(m, n, k, a_data, a_offset, b_data, b_offset,
+                                       c_offset, c_mult_int);
+        assertTrue(testWithTolerance(expected_data, c_byte_output));
+    }
+
+
+    // This test takes a large set of real data captured from a convolutional
+    // neural network solving a computer vision problem, and runs it through the
+    // eight-bit matrix multiply. We test the results to make sure they're close
+    // enough to be usable.
+    public void testRealData() {
+
+        int m = 256;
+        int n = 192;
+        int k = 1152;
+        int a_offset = 0;
+        int b_offset = 84;
+        int c_mult_int = 3401;
+        int c_offset = 74980;
+
+        int a_count = (m * k);
+        int b_count = (n * k);
+        int c_count = (m * n);
+
+        byte[] a_byte = new byte[a_count];
+        byte[] b_byte = new byte[b_count];
+        byte[] c_byte = new byte[c_count];
+
+        getData(a_byte, b_byte, c_byte);
+
+        byte[] c_byte_output = runBNNM(m, n, k, a_byte, a_offset, b_byte, b_offset,
+                                       c_offset, c_mult_int);
+
+        assertTrue(testWithTolerance(c_byte, c_byte_output));
+
+    }
+
+    // This test multiplies matrices where the results are expected to fall
+    // slightly outside the 0 to 255 valid output range. This test ensures the
+    // values get clamped to that range, rather than wrapping around.
+    public void testClamping() {
+        // The A matrix is:
+        // |   1 |   4 |
+        // |   2 |   5 |
+        // |   3 |   6 |
+        byte[] a_data = unsignedToSignedByte(new int[] {
+                1, 2, 3,
+                4, 5, 6,
+            });
+        final int a_rows = 3;
+        final int a_cols = 2;
+        final int a_offset = 0;
+        // The B matrix is:
+        // |  -1 |  -2 |  -3 |  -4 |
+        // |  -5 |  -6 |  -7 |  -8 |
+        // |  99 | -40 | -11 | -15 |
+        byte[] b_data = unsignedToSignedByte(new int[] {
+                126, 122, 226,
+                125, 121, 87,
+                124, 120, 116,
+                123, 119, 112,
+            });
+        final int b_cols = 4;
+        final int b_offset = 127;
+        // EightBitGemm implements C = B.transposed() * A,
+        // so we expect to get these results:
+        // 1*-1 + 2*-5 + 3* 99 + 128 = 414 (clamped to 255)
+        // 1*-2 + 2*-6 + 3*-40 + 128 = -6 (clamped to 0)
+        // 1*-3 + 2*-7 + 3*-11 + 128 = 78
+        // 1*-4 + 2*-8 + 3*-15 + 128 = 63
+        // 4*-1 + 5*-5 + 6* 99 + 128 = 693 (clamped to 255)
+        // 4*-2 + 5*-6 + 6*-40 + 128 = -150 (clamped to 0)
+        // 4*-3 + 5*-7 + 6*-11 + 128 = 15
+        // 4*-4 + 5*-8 + 6*-15 + 128 = -18 (clamped to 0)
+        // | 255 | 255 |
+        // |   0 |   0 |
+        // |  78 |  15 |
+        // |  63 |   0 |
+        final int c_offset = 128;
+        final int c_shift = 21;
+        final int c_mult_int = (1 << c_shift);
+        byte[] expected_data = unsignedToSignedByte(new int[] {
+              255, 0, 78, 63,
+              255, 0, 15, 0,
+            });
+
+        final int m = a_cols;
+        final int n = b_cols;
+        final int k = a_rows;
+
+        byte[] c_byte_output = runBNNM(m, n, k, a_data, a_offset, b_data, b_offset,
+                                       c_offset, c_mult_int);
+        assertTrue(testWithTolerance(expected_data, c_byte_output));
+    }
+
+    // This tests the exception handling for a_offset and b_offset.
+    public void testExceptionHandling() {
+        // The A matrix is:
+        // |   1 |   4 |
+        // |   2 |   5 |
+        // |   3 |   6 |
+        byte[] a_data = unsignedToSignedByte(new int[] {
+                1, 2, 3,
+                4, 5, 6,
+            });
+        final int a_rows = 3;
+        final int a_cols = 2;
+        // The B matrix is:
+        // |  -1 |  -2 |  -3 |  -4 |
+        // |  -5 |  -6 |  -7 |  -8 |
+        // |  -9 | -10 | -11 | -12 |
+        byte[] b_data = unsignedToSignedByte(new int[] {
+                11, 7, 3,
+                10, 6, 2,
+                9, 5, 1,
+                8, 4, 0,
+            });
+        final int b_cols = 4;
+        // EightBitGemm implements C = B.transposed() * A,
+        // so we expect to get these results:
+        // 1*-1 + 2*-5 + 3*-9 + 128 = 90
+        // 1*-2 + 2*-6 + 3*-10 + 128 = 84
+        // 1*-3 + 2*-7 + 3*-11 + 128 = 78
+        // 1*-4 + 2*-8 + 3*-12 + 128 = 72
+        // 4*-1 + 5*-5 + 6*-9 + 128 = 45
+        // 4*-2 + 5*-6 + 6*-10 + 128 = 30
+        // 4*-3 + 5*-7 + 6*-11 + 128 = 15
+        // 4*-4 + 5*-8 + 6*-12 + 128 = 0
+        // | 90 |  45 |
+        // | 84 |  30 |
+        // | 78 | 15 |
+        // | 72 | 0 |
+        final int c_offset = 128;
+        final int c_shift = 21;
+        final int c_mult_int = (1 << c_shift);
+        byte[] expected_data = unsignedToSignedByte(new int[] {
+                90, 84, 78, 72,
+                45, 30, 15, 0,
+            });
+
+        final int m = a_cols;
+        final int n = b_cols;
+        final int k = a_rows;
+
+        Allocation A, B, C;
+        Type.Builder builder = new Type.Builder(mRS, Element.U8(mRS));
+        Type a_type = builder.setX(k).setY(m).create();
+        Type b_type = builder.setX(k).setY(n).create();
+        Type c_type = builder.setX(n).setY(m).create();
+
+        A = Allocation.createTyped(mRS, a_type);
+        B = Allocation.createTyped(mRS, b_type);
+        C = Allocation.createTyped(mRS, c_type);
+
+        A.copyFrom(a_data);
+        B.copyFrom(b_data);
+        // C doesn't matter, is output only
+
+        ScriptIntrinsicBLAS blas = ScriptIntrinsicBLAS.create(mRS);
+        try {
+            int a_offset = 0;
+            int b_offset = 12;
+            blas.BNNM(A, a_offset, B, b_offset, C, c_offset, c_mult_int);
+        } catch (RSRuntimeException e) {
+            fail("should NOT throw RSRuntimeException for valid offsets");
+        }
+        try {
+            int a_offset = -23;
+            int b_offset = 12;
+            blas.BNNM(A, a_offset, B, b_offset, C, c_offset, c_mult_int);
+            fail("should throw RSRuntimeException for invalid offsets: a_offset < 0");
+        } catch (RSRuntimeException e) {
+        }
+        try {
+            int a_offset = 888;
+            int b_offset = 12;
+            blas.BNNM(A, a_offset, B, b_offset, C, c_offset, c_mult_int);
+            fail("should throw RSRuntimeException for invalid offsets: a_offset > 255");
+        } catch (RSRuntimeException e) {
+        }
+        try {
+            int a_offset = 0;
+            int b_offset = -1;
+            blas.BNNM(A, a_offset, B, b_offset, C, c_offset, c_mult_int);
+            fail("should throw RSRuntimeException for invalid offsets: b_offset < 0");
+        } catch (RSRuntimeException e) {
+        }
+        try {
+            int a_offset = 0;
+            int b_offset = 256;
+            blas.BNNM(A, a_offset, B, b_offset, C, c_offset, c_mult_int);
+            fail("should throw RSRuntimeException for invalid offsets: b_offset > 255");
+        } catch (RSRuntimeException e) {
+        }
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/DebugContext.java b/tests/tests/renderscript/src/android/renderscript/cts/DebugContext.java
index 50a3560..5c71155 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/DebugContext.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/DebugContext.java
@@ -58,43 +58,37 @@
      * Test whether we are detect out-of-bounds allocation accesses
      * from an invokable.
      */
-    // TODO Temporarily disable the test.
-    public void dontTestDebugContextI() {
+    public void testDebugContextI() {
         setupDebugContext();
         Soob.invoke_write_i(7, 1);  // Write to invalid location.
-        for (int i = 0; i < 100; i++) {
-            Soob.invoke_write_i(9, 0);
-            mRS.finish();
-        }
 
         // Flush messages through the pipeline.
-        Soob.invoke_send_msg();
+        mRS.sendMessage(RS_MSG_TEST_FLUSH, null);
         waitForMessage();
 
         Soob.destroy();
         assertTrue(mRanErrorHandler);
-        checkForErrors();
+
+        // The context is dead at this point so make sure it's not reused
+        RenderScript.releaseAllContexts();
     }
 
     /**
      * Test whether we are detect out-of-bounds allocation accesses
      * from a kernel.
      */
-    // TODO Temporarily disable the test.
-    public void dontTestDebugContextK() {
+    public void testDebugContextK() {
         setupDebugContext();
         Soob.forEach_write_k(AUnused);  // Write to invalid location.
-        for (int i = 0; i < 100; i++) {
-            Soob.invoke_write_i(9, 0);
-            mRS.finish();
-        }
 
         // Flush messages through the pipeline.
-        Soob.invoke_send_msg();
+        mRS.sendMessage(RS_MSG_TEST_FLUSH, null);
         waitForMessage();
 
         Soob.destroy();
         assertTrue(mRanErrorHandler);
-        checkForErrors();
+
+        // The context is dead at this point so make sure it's not reused
+        RenderScript.releaseAllContexts();
     }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/DoubleTest.java b/tests/tests/renderscript/src/android/renderscript/cts/DoubleTest.java
new file mode 100644
index 0000000..2de6afd
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/DoubleTest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2015 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.renderscript.cts;
+
+import android.renderscript.Allocation;
+import android.renderscript.Element;
+import android.renderscript.RenderScript;
+
+public class DoubleTest extends RSBaseCompute {
+
+    public void testDoubleGlobal() {
+        RenderScript rs = RenderScript.create(getContext());
+        ScriptC_doubleglobal dc = new ScriptC_doubleglobal(rs);
+        dc.invoke_func_setup();
+        int big = 1024 * 1024;
+        Allocation out = Allocation.createSized(rs, Element.F32(rs), big);
+
+        dc.forEach_times2pi(out);
+        float[] data = new float[big];
+        out.copyTo(data);
+
+        Target t = new Target(true);
+        t.setPrecision(1, 1, false);
+        double pi = 3.14159265359;
+        Target.Floaty pi2 = t.new32((float) (pi * 2));
+        for (int x = 0; x < data.length; x++) {
+            float v = data[x];
+            Target.Floaty expected = t.multiply(pi2, t.new32(x));
+            if (!expected.couldBe(v)) {
+                StringBuilder message = new StringBuilder();
+                message.append("X: ");
+                appendVariableToMessage(message, x);
+                message.append("\n");
+                message.append("Expected output: ");
+                appendVariableToMessage(message, expected);
+                message.append("\n");
+                message.append("Actual   output: ");
+                appendVariableToMessage(message, v);
+
+                message.append("\n");
+                assertTrue("Incorrect output for testDoubleGlobal " + message.toString(), false);
+            }
+        }
+    }
+}
+
+
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java
index 131b3fd4..9fa9c15 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java
@@ -183,6 +183,13 @@
         // A_8 is in U8
         Element[] BOOLEAN = { Element.BOOLEAN(mRS) };
         Element[] ELEMENT = { Element.ELEMENT(mRS) };
+        Element[] F16 = { Element.F16(mRS) };
+        Element[] F16_2 = { Element.F16_2(mRS),
+            Element.createVector(mRS, Element.DataType.FLOAT_16, 2) };
+        Element[] F16_3 = { Element.F16_3(mRS),
+            Element.createVector(mRS, Element.DataType.FLOAT_16, 3) };
+        Element[] F16_4 = { Element.F16_4(mRS),
+            Element.createVector(mRS, Element.DataType.FLOAT_16, 4) };
         Element[] F32 = { Element.F32(mRS) };
         Element[] F32_2 = { Element.F32_2(mRS),
             Element.createVector(mRS, Element.DataType.FLOAT_32, 2) };
@@ -236,8 +243,10 @@
             Element.createPixel(mRS, Element.DataType.UNSIGNED_8,
                                 Element.DataKind.PIXEL_RGBA) };
 
-        Element[][] ElementArrs = { ALLOCATION, BOOLEAN, ELEMENT, F32, F32_2,
-                                    F32_3, F32_4, F64, I16, I32, I64, I8,
+        Element[][] ElementArrs = { ALLOCATION, BOOLEAN, ELEMENT,
+                                    F16, F16_2, F16_3, F16_4,
+                                    F32, F32_2, F32_3, F32_4,
+                                    F64, I16, I32, I64, I8,
                                     MATRIX_2X2, MATRIX_3X3, MATRIX_4X4, MESH,
                                     PROGRAM_FRAGMENT, PROGRAM_RASTER,
                                     PROGRAM_STORE, PROGRAM_VERTEX, RGBA_4444,
@@ -272,6 +281,10 @@
             eb.add(Element.RGB_565(mRS), "RGB_565", arraySize);
             eb.add(Element.RGB_888(mRS), "RGB_888", arraySize);
             eb.add(Element.RGBA_8888(mRS), "RGBA_8888", arraySize);
+            eb.add(Element.F16(mRS), "F16", arraySize);
+            eb.add(Element.F16_2(mRS), "F16_2", arraySize);
+            eb.add(Element.F16_3(mRS), "F16_3", arraySize);
+            eb.add(Element.F16_4(mRS), "F16_4", arraySize);
             eb.add(Element.F32(mRS), "F32", arraySize);
             eb.add(Element.F32_2(mRS), "F32_2", arraySize);
             eb.add(Element.F32_3(mRS), "F32_3", arraySize);
@@ -338,6 +351,10 @@
         assertFalse(Element.RGB_565(mRS).isComplex());
         assertFalse(Element.RGB_888(mRS).isComplex());
         assertFalse(Element.RGBA_8888(mRS).isComplex());
+        assertFalse(Element.F16(mRS).isComplex());
+        assertFalse(Element.F16_2(mRS).isComplex());
+        assertFalse(Element.F16_3(mRS).isComplex());
+        assertFalse(Element.F16_4(mRS).isComplex());
         assertFalse(Element.F32(mRS).isComplex());
         assertFalse(Element.F32_2(mRS).isComplex());
         assertFalse(Element.F32_3(mRS).isComplex());
@@ -416,6 +433,7 @@
         // Uncomment when NONE is no longer hidden.
         //assertEquals(DataType.NONE, DataType.valueOf("NONE"));
 
+        assertEquals(DataType.FLOAT_16, DataType.valueOf("FLOAT_16"));
         assertEquals(DataType.FLOAT_32, DataType.valueOf("FLOAT_32"));
         assertEquals(DataType.FLOAT_64, DataType.valueOf("FLOAT_64"));
         assertEquals(DataType.SIGNED_8, DataType.valueOf("SIGNED_8"));
@@ -452,6 +470,7 @@
 
         for (DataType dt : DataType.values()) {
             switch (dt) {
+            case FLOAT_16:
             case FLOAT_32:
             case FLOAT_64:
             case SIGNED_8:
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/Float16ArithmeticTest.java b/tests/tests/renderscript/src/android/renderscript/cts/Float16ArithmeticTest.java
new file mode 100644
index 0000000..8f6d4a1
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/Float16ArithmeticTest.java
@@ -0,0 +1,261 @@
+/*
+ * Copyright (C) 2015 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.renderscript.cts;
+
+import java.util.Random;
+import java.lang.Math;
+import java.lang.Float;
+import java.lang.Integer;
+import java.lang.Short;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.renderscript.Allocation;
+import android.renderscript.Element;
+import android.renderscript.RenderScript;
+import android.renderscript.RSRuntimeException;
+import android.renderscript.Script;
+import android.renderscript.Type;
+import android.util.Log;
+
+public class Float16ArithmeticTest extends RSBaseCompute {
+    private int numInputs = Float16TestData.input.length;
+
+    // Allocations to hold float16 input and output
+    private Allocation mInput;
+    private Allocation mF16Matrix;
+    private Allocation mU16Matrix;
+
+    // A numInputs * numInputs length 1-D array with data copied from
+    // mU16Matrix
+    private short[] output = new short[numInputs * numInputs];
+
+    // 16-bit masks for extracting sign, exponent and mantissa bits
+    private static short SIGN_MASK     = (short) 0x8000;
+    private static short EXPONENT_MASK = (short) 0x7C00;
+    private static short MANTISSA_MASK = (short) 0x03FF;
+
+    // NaN has all exponent bits set to 1 and a non-zero mantissa
+    private boolean isFloat16NaN(short val) {
+        return (val & EXPONENT_MASK) == EXPONENT_MASK &&
+               (val & MANTISSA_MASK) != 0;
+    }
+
+    // Infinity has all exponent bits set to 1 and zeroes in mantissa
+    private boolean isFloat16Infinite(short val) {
+        return (val & EXPONENT_MASK) == EXPONENT_MASK &&
+               (val & MANTISSA_MASK) == 0;
+    }
+
+    // Subnormal numbers have exponent bits set to 0 and a non-zero mantissa
+    private boolean isFloat16SubNormal(short val) {
+        return (val & EXPONENT_MASK) == 0 && (val & MANTISSA_MASK) != 0;
+    }
+
+    // Zero has all but the sign bit set to zero
+    private boolean isFloat16Zero(short val) {
+        return (val & ~SIGN_MASK) == 0;
+    }
+
+    // Negativity test checks the sign bit
+    private boolean isFloat16Negative(short val) {
+        return (val & SIGN_MASK) != 0;
+    }
+
+    // Check if this is a finite, non-zero FP16 value
+    private boolean isFloat16FiniteNonZero(short val) {
+        return !isFloat16NaN(val) && !isFloat16Infinite(val) && !isFloat16Zero(val);
+    }
+
+    // Convert FP16 value to float
+    private float convertFloat16ToFloat(short val) {
+        // Extract sign, exponent and mantissa
+        int sign = val & SIGN_MASK;
+        int exponent = (val & EXPONENT_MASK) >> 10;
+        int mantissa = val & MANTISSA_MASK;
+
+        // 0.<mantissa> = <mantissa> * 2^-10
+        float mantissaAsFloat = Math.scalb(mantissa, -10);
+
+        float result;
+        if (isFloat16Zero(val))
+            result = 0.0f;
+        else if (isFloat16Infinite(val))
+            result = java.lang.Float.POSITIVE_INFINITY;
+        else if (isFloat16NaN(val))
+            result = java.lang.Float.NaN;
+        else if (isFloat16SubNormal(val)) {
+            // value is 2^-14 * mantissaAsFloat
+            result = Math.scalb(1, -14) * mantissaAsFloat;
+        }
+        else {
+            // value is 2^(exponent - 15) * 1.<mantissa>
+            result = Math.scalb(1, exponent - 15) * (1 + mantissaAsFloat);
+        }
+
+        if (sign != 0)
+            result = -result;
+        return result;
+    }
+
+    // Create input, intermediate, and output allocations.  Copy input data to
+    // the input allocation
+    private void setupTest() {
+        Element f16 = Element.F16(mRS);
+        Element u16 = Element.U16(mRS);
+        Type f16Matrix = Type.createXY(mRS, f16, numInputs, numInputs);
+        Type u16Matrix = Type.createXY(mRS, u16, numInputs, numInputs);
+
+        mInput = Allocation.createSized(mRS, f16, numInputs);
+        mF16Matrix = Allocation.createTyped(mRS, f16Matrix);
+        mU16Matrix = Allocation.createTyped(mRS, u16Matrix);
+
+        mInput.copyFromUnchecked(Float16TestData.input);
+    }
+
+    // Check the output of performing 'operation' on inputs x and y against the
+    // reference output in refValues.  For special cases like Infinity, NaN and
+    // zero, use exact comparison.  Otherwise, check if the output is within
+    // the bounds in 'refValues' by converting all values to float.
+    private boolean checkFloat16Output(int x, int y, short[][][] refValues,
+                                       String operation)
+    {
+        // Find the input, output and reference values based on the indices
+        short in1 = Float16TestData.input[x];
+        short in2 = Float16TestData.input[y];
+        short out = output[x + y * numInputs];
+        short lb = refValues[x][y][0];
+        short ub = refValues[x][y][1];
+
+        // Do exact match if the reference value is a special case (Nan, zero
+        // infinity or their negative equivalents).
+        if (isFloat16Infinite(lb))
+            return lb == out;
+        // NaN can have any non-zero mantissa.  Do not use equality check
+        if (isFloat16NaN(lb))
+            return isFloat16NaN(out);
+        // If reference output is zero, test for exact equivalence if at least
+        // one of the input values is a special-case FP16 value.
+        if (isFloat16Zero(lb)) {
+            if (!isFloat16FiniteNonZero(in1) || !isFloat16FiniteNonZero(in2))
+                return lb == out;
+        }
+
+        float floatLB = convertFloat16ToFloat(lb);
+        float floatUB = convertFloat16ToFloat(ub);
+        float floatOut = convertFloat16ToFloat(out);
+
+        if (floatOut < floatLB || floatOut > floatUB) {
+            StringBuilder message = new StringBuilder();
+            message.append("Incorrect output for float16 " + operation + ":");
+            message.append("\nInput 1: " + Short.toString(in1));
+            message.append("\nInput 2: " + Short.toString(in2));
+            message.append("\nExpected output between: " + Short.toString(lb) +
+                           " and " + Short.toString(ub));
+            message.append("\nActual   output: " + Short.toString(out));
+            message.append("\nExpected output (in float) between: " +
+                           Float.toString(floatLB) + " and " + Float.toString(floatUB));
+            message.append("\nActual   output: " + Float.toString(floatOut));
+            assertTrue(message.toString(), false);
+        }
+        return true;
+    }
+
+    private boolean checkFloat16Add(int x, int y) {
+        return checkFloat16Output(x, y, Float16TestData.ReferenceOutputForAdd,
+                                  "addition");
+    }
+
+    public void testFloat16Add() {
+        setupTest();
+        ScriptC_float16_arithmetic script = new ScriptC_float16_arithmetic(mRS);
+
+        script.set_gInput(mInput);
+        script.forEach_add(mF16Matrix);
+        script.forEach_bitcast(mF16Matrix, mU16Matrix);
+        mU16Matrix.copyTo(output);
+
+        for (int x = 0; x < numInputs; x ++) {
+            for (int y = 0; y < numInputs; y ++) {
+                checkFloat16Add(x, y);
+            }
+        }
+    }
+
+    private boolean checkFloat16Sub(int x, int y) {
+        return checkFloat16Output(x, y, Float16TestData.ReferenceOutputForSub,
+                                  "subtraction");
+    }
+
+    public void testFloat16Sub() {
+        setupTest();
+        ScriptC_float16_arithmetic script = new ScriptC_float16_arithmetic(mRS);
+
+        script.set_gInput(mInput);
+        script.forEach_sub(mF16Matrix);
+        script.forEach_bitcast(mF16Matrix, mU16Matrix);
+        mU16Matrix.copyTo(output);
+
+        for (int x = 0; x < numInputs; x ++) {
+            for (int y = 0; y < numInputs; y ++) {
+                checkFloat16Sub(x, y);
+            }
+        }
+    }
+
+    private boolean checkFloat16Mul(int x, int y) {
+        return checkFloat16Output(x, y, Float16TestData.ReferenceOutputForMul,
+                                  "multiplication");
+    }
+
+    public void testFloat16Mul() {
+        setupTest();
+        ScriptC_float16_arithmetic script = new ScriptC_float16_arithmetic(mRS);
+
+        script.set_gInput(mInput);
+        script.forEach_mul(mF16Matrix);
+        script.forEach_bitcast(mF16Matrix, mU16Matrix);
+        mU16Matrix.copyTo(output);
+
+        for (int x = 0; x < numInputs; x ++) {
+            for (int y = 0; y < numInputs; y ++) {
+                checkFloat16Mul(x, y);
+            }
+        }
+    }
+
+    private boolean checkFloat16Div(int x, int y) {
+        return checkFloat16Output(x, y, Float16TestData.ReferenceOutputForDiv,
+                                  "division");
+    }
+
+    public void testFloat16Div() {
+        setupTest();
+        ScriptC_float16_arithmetic script = new ScriptC_float16_arithmetic(mRS);
+
+        script.set_gInput(mInput);
+        script.forEach_div(mF16Matrix);
+        script.forEach_bitcast(mF16Matrix, mU16Matrix);
+        mU16Matrix.copyTo(output);
+
+        for (int x = 0; x < numInputs; x ++) {
+            for (int y = 0; y < numInputs; y ++) {
+                checkFloat16Div(x, y);
+            }
+        }
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/Float16TestData.java b/tests/tests/renderscript/src/android/renderscript/cts/Float16TestData.java
new file mode 100644
index 0000000..f4cef49
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/Float16TestData.java
@@ -0,0 +1,2037 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+/* Don't edit this file!  It is auto-generated by float16_gen.sh */
+
+package android.renderscript.cts;
+
+public class Float16TestData {
+  static short[] input = {
+      (short) 0x3c00, // one
+      (short) 0x4000, // two
+      (short) 0x0001, // smallest subnormal
+      (short) 0x03ff, // largest subnormal
+      (short) 0x0400, // smallest normal
+      (short) 0x7bff, // largest normal
+      (short) 0x3880, // 0.562500
+      (short) 0x3e80, // 1.625000
+      (short) 0x5140, // 42.000000
+      (short) 0x5ac0, // 216.000000
+      (short) 0x6c75, // 4564.000000
+      (short) 0x7b53, // 60000.000000
+      (short) 0xbc00, // negative one
+      (short) 0xc000, // negative two
+      (short) 0x8001, // negative (smallest subnormal)
+      (short) 0x83ff, // negative (largest subnormal)
+      (short) 0x8400, // negative (smallest normal)
+      (short) 0xfbff, // negative (largest normal)
+      (short) 0xb880, // -0.562500
+      (short) 0xbe80, // -1.625000
+      (short) 0xd140, // -42.000000
+      (short) 0xdac0, // -216.000000
+      (short) 0xec75, // -4564.000000
+      (short) 0xfb53, // -60000.000000
+      (short) 0x0000, // zero
+      (short) 0x7c00, // infinity
+      (short) 0x8000, // negative zero
+      (short) 0xfc00, // negative infinity
+      (short) 0x7c01, // nan
+  };
+
+  static short[][][] ReferenceOutputForAdd = {
+      {
+          {(short) 0x3ffe, (short) 0x4001}, {(short) 0x41ff, (short) 0x4201},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3bfe, (short) 0x3c01},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x3e3f, (short) 0x3e41}, {(short) 0x413f, (short) 0x4141},
+          {(short) 0x515f, (short) 0x5161}, {(short) 0x5ac7, (short) 0x5ac9},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xbc01, (short) 0xbbfe},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3bfe, (short) 0x3c01},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0x36ff, (short) 0x3701}, {(short) 0xb901, (short) 0xb8ff},
+          {(short) 0xd121, (short) 0xd11f}, {(short) 0xdab9, (short) 0xdab7},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x41ff, (short) 0x4201}, {(short) 0x43fe, (short) 0x4401},
+          {(short) 0x3ffe, (short) 0x4001}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x3ffe, (short) 0x4001}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x411f, (short) 0x4121}, {(short) 0x433f, (short) 0x4341},
+          {(short) 0x517f, (short) 0x5181}, {(short) 0x5acf, (short) 0x5ad1},
+          {(short) 0x6c75, (short) 0x6c77}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x3ffe, (short) 0x4001}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x3ffe, (short) 0x4001}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0x3dbf, (short) 0x3dc1}, {(short) 0x35ff, (short) 0x3601},
+          {(short) 0xd101, (short) 0xd0ff}, {(short) 0xdab1, (short) 0xdaaf},
+          {(short) 0xec75, (short) 0xec73}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x3ffe, (short) 0x4001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x3ffe, (short) 0x4001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x0000, (short) 0x0003}, {(short) 0x0000, (short) 0x0401},
+          {(short) 0x0400, (short) 0x0402}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x83ff, (short) 0x8000},
+          {(short) 0x8400, (short) 0x8000}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x0000, (short) 0x0002}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x0000, (short) 0x0002}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x0000, (short) 0x0401}, {(short) 0x07fd, (short) 0x07ff},
+          {(short) 0x07fe, (short) 0x0800}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0x0000, (short) 0x03ff}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8002, (short) 0x0000}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x0000, (short) 0x0400}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x0000, (short) 0x0400}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x0400, (short) 0x0402}, {(short) 0x07fe, (short) 0x0800},
+          {(short) 0x07fe, (short) 0x0801}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0x0000, (short) 0x0400}, {(short) 0x0000, (short) 0x0002},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x0000, (short) 0x0401}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x0000, (short) 0x0401}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x7bfd, (short) 0x7bff}, {(short) 0x7bf7, (short) 0x7bf9},
+          {(short) 0x7b6f, (short) 0x7b71}, {(short) 0x6d5f, (short) 0x6d61},
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x3e3f, (short) 0x3e41}, {(short) 0x411f, (short) 0x4121},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x387f, (short) 0x3881},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x3c7f, (short) 0x3c81}, {(short) 0x405f, (short) 0x4061},
+          {(short) 0x5151, (short) 0x5153}, {(short) 0x5ac3, (short) 0x5ac5},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0xb701, (short) 0xb6ff}, {(short) 0xbdc1, (short) 0xbdbf},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x387f, (short) 0x3881},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xbc41, (short) 0xbc3f},
+          {(short) 0xd12f, (short) 0xd12d}, {(short) 0xdabd, (short) 0xdabb},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x413f, (short) 0x4141}, {(short) 0x433f, (short) 0x4341},
+          {(short) 0x3e7f, (short) 0x3e81}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x3e7f, (short) 0x3e81}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x405f, (short) 0x4061}, {(short) 0x427f, (short) 0x4281},
+          {(short) 0x5173, (short) 0x5175}, {(short) 0x5acc, (short) 0x5ace},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x38ff, (short) 0x3901}, {(short) 0xb601, (short) 0xb5ff},
+          {(short) 0x3e7f, (short) 0x3e81}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x3e7f, (short) 0x3e81}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0x3c3f, (short) 0x3c41}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0xd10d, (short) 0xd10b}, {(short) 0xdab4, (short) 0xdab2},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x3e7f, (short) 0x3e81}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x3e7f, (short) 0x3e81}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x515f, (short) 0x5161}, {(short) 0x517f, (short) 0x5181},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x513f, (short) 0x5141},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x5151, (short) 0x5153}, {(short) 0x5173, (short) 0x5175},
+          {(short) 0x553f, (short) 0x5541}, {(short) 0x5c07, (short) 0x5c09},
+          {(short) 0x6c7f, (short) 0x6c81}, {(short) 0x7b53, (short) 0x7b55},
+          {(short) 0x511f, (short) 0x5121}, {(short) 0x50ff, (short) 0x5101},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x513f, (short) 0x5141},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0xfbff, (short) 0xfbfd},
+          {(short) 0x512d, (short) 0x512f}, {(short) 0x510b, (short) 0x510d},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xd971, (short) 0xd96f},
+          {(short) 0xec6b, (short) 0xec69}, {(short) 0xfb53, (short) 0xfb51},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x5ac7, (short) 0x5ac9}, {(short) 0x5acf, (short) 0x5ad1},
+          {(short) 0x5abf, (short) 0x5ac1}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x5abf, (short) 0x5ac1}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x5ac3, (short) 0x5ac5}, {(short) 0x5acc, (short) 0x5ace},
+          {(short) 0x5c07, (short) 0x5c09}, {(short) 0x5ebf, (short) 0x5ec1},
+          {(short) 0x6caa, (short) 0x6cac}, {(short) 0x7b59, (short) 0x7b5b},
+          {(short) 0x5ab7, (short) 0x5ab9}, {(short) 0x5aaf, (short) 0x5ab1},
+          {(short) 0x5abf, (short) 0x5ac1}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x5abf, (short) 0x5ac1}, {(short) 0xfbf9, (short) 0xfbf7},
+          {(short) 0x5abb, (short) 0x5abd}, {(short) 0x5ab2, (short) 0x5ab4},
+          {(short) 0x596f, (short) 0x5971}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0xec40, (short) 0xec3e}, {(short) 0xfb4d, (short) 0xfb4b},
+          {(short) 0x5abf, (short) 0x5ac1}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x5abf, (short) 0x5ac1}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x6c75, (short) 0x6c77},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x6c74, (short) 0x6c76},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x6c74, (short) 0x6c76},
+          {(short) 0x6c7f, (short) 0x6c81}, {(short) 0x6caa, (short) 0x6cac},
+          {(short) 0x7074, (short) 0x7076}, {(short) 0x7be1, (short) 0x7be3},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x6c73, (short) 0x6c75},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x6c74, (short) 0x6c76},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0xfb71, (short) 0xfb6f},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x6c74, (short) 0x6c76},
+          {(short) 0x6c69, (short) 0x6c6b}, {(short) 0x6c3e, (short) 0x6c40},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfac5, (short) 0xfac3},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x7b53, (short) 0x7b55}, {(short) 0x7b59, (short) 0x7b5b},
+          {(short) 0x7be1, (short) 0x7be3}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0xed61, (short) 0xed5f},
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x7b51, (short) 0x7b53}, {(short) 0x7b4b, (short) 0x7b4d},
+          {(short) 0x7ac3, (short) 0x7ac5}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x3bfe, (short) 0x3c01},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xbc01, (short) 0xbbfe},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0xb701, (short) 0xb6ff}, {(short) 0x38ff, (short) 0x3901},
+          {(short) 0x511f, (short) 0x5121}, {(short) 0x5ab7, (short) 0x5ab9},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0xc001, (short) 0xbffe}, {(short) 0xc201, (short) 0xc1ff},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xbc01, (short) 0xbbfe},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xbe41, (short) 0xbe3f}, {(short) 0xc141, (short) 0xc13f},
+          {(short) 0xd161, (short) 0xd15f}, {(short) 0xdac9, (short) 0xdac7},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0xc001, (short) 0xbffe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0xc001, (short) 0xbffe}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0xbdc1, (short) 0xbdbf}, {(short) 0xb601, (short) 0xb5ff},
+          {(short) 0x50ff, (short) 0x5101}, {(short) 0x5aaf, (short) 0x5ab1},
+          {(short) 0x6c73, (short) 0x6c75}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0xc201, (short) 0xc1ff}, {(short) 0xc401, (short) 0xc3fe},
+          {(short) 0xc001, (short) 0xbffe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0xc001, (short) 0xbffe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xc121, (short) 0xc11f}, {(short) 0xc341, (short) 0xc33f},
+          {(short) 0xd181, (short) 0xd17f}, {(short) 0xdad1, (short) 0xdacf},
+          {(short) 0xec77, (short) 0xec75}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0xc001, (short) 0xbffe}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xc001, (short) 0xbffe}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x0000, (short) 0x03ff},
+          {(short) 0x0000, (short) 0x0400}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0x8003, (short) 0x8000}, {(short) 0x8401, (short) 0x8000},
+          {(short) 0x8402, (short) 0x8400}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x8002, (short) 0x0000}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8002, (short) 0x0000}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x83ff, (short) 0x8000}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x0000, (short) 0x0002}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0x8401, (short) 0x8000}, {(short) 0x87ff, (short) 0x87fd},
+          {(short) 0x8800, (short) 0x87fe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x8400, (short) 0x8000}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8400, (short) 0x8000}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x8400, (short) 0x8000}, {(short) 0x8002, (short) 0x0000},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0x8402, (short) 0x8400}, {(short) 0x8800, (short) 0x87fe},
+          {(short) 0x8801, (short) 0x87fe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x8401, (short) 0x8000}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8401, (short) 0x8000}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xfbff, (short) 0xfbfd}, {(short) 0xfbf9, (short) 0xfbf7},
+          {(short) 0xfb71, (short) 0xfb6f}, {(short) 0xed61, (short) 0xed5f},
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x36ff, (short) 0x3701}, {(short) 0x3dbf, (short) 0x3dc1},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xb881, (short) 0xb87f},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x3c3f, (short) 0x3c41},
+          {(short) 0x512d, (short) 0x512f}, {(short) 0x5abb, (short) 0x5abd},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0xbe41, (short) 0xbe3f}, {(short) 0xc121, (short) 0xc11f},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xb881, (short) 0xb87f},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xbc81, (short) 0xbc7f}, {(short) 0xc061, (short) 0xc05f},
+          {(short) 0xd153, (short) 0xd151}, {(short) 0xdac5, (short) 0xdac3},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xb901, (short) 0xb8ff}, {(short) 0x35ff, (short) 0x3601},
+          {(short) 0xbe81, (short) 0xbe7f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xbe81, (short) 0xbe7f}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0xbc41, (short) 0xbc3f}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x510b, (short) 0x510d}, {(short) 0x5ab2, (short) 0x5ab4},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0xc141, (short) 0xc13f}, {(short) 0xc341, (short) 0xc33f},
+          {(short) 0xbe81, (short) 0xbe7f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xbe81, (short) 0xbe7f}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xc061, (short) 0xc05f}, {(short) 0xc281, (short) 0xc27f},
+          {(short) 0xd175, (short) 0xd173}, {(short) 0xdace, (short) 0xdacc},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0xbe81, (short) 0xbe7f}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xbe81, (short) 0xbe7f}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xd121, (short) 0xd11f}, {(short) 0xd101, (short) 0xd0ff},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xd141, (short) 0xd13f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0x7bfd, (short) 0x7bff},
+          {(short) 0xd12f, (short) 0xd12d}, {(short) 0xd10d, (short) 0xd10b},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x596f, (short) 0x5971},
+          {(short) 0x6c69, (short) 0x6c6b}, {(short) 0x7b51, (short) 0x7b53},
+          {(short) 0xd161, (short) 0xd15f}, {(short) 0xd181, (short) 0xd17f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xd141, (short) 0xd13f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xd153, (short) 0xd151}, {(short) 0xd175, (short) 0xd173},
+          {(short) 0xd541, (short) 0xd53f}, {(short) 0xdc09, (short) 0xdc07},
+          {(short) 0xec81, (short) 0xec7f}, {(short) 0xfb55, (short) 0xfb53},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xdab9, (short) 0xdab7}, {(short) 0xdab1, (short) 0xdaaf},
+          {(short) 0xdac1, (short) 0xdabf}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xdac1, (short) 0xdabf}, {(short) 0x7bf7, (short) 0x7bf9},
+          {(short) 0xdabd, (short) 0xdabb}, {(short) 0xdab4, (short) 0xdab2},
+          {(short) 0xd971, (short) 0xd96f}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x6c3e, (short) 0x6c40}, {(short) 0x7b4b, (short) 0x7b4d},
+          {(short) 0xdac9, (short) 0xdac7}, {(short) 0xdad1, (short) 0xdacf},
+          {(short) 0xdac1, (short) 0xdabf}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xdac1, (short) 0xdabf}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xdac5, (short) 0xdac3}, {(short) 0xdace, (short) 0xdacc},
+          {(short) 0xdc09, (short) 0xdc07}, {(short) 0xdec1, (short) 0xdebf},
+          {(short) 0xecac, (short) 0xecaa}, {(short) 0xfb5b, (short) 0xfb59},
+          {(short) 0xdac1, (short) 0xdabf}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xdac1, (short) 0xdabf}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xec75, (short) 0xec73},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xec76, (short) 0xec74},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0x7b6f, (short) 0x7b71},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xec76, (short) 0xec74},
+          {(short) 0xec6b, (short) 0xec69}, {(short) 0xec40, (short) 0xec3e},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7ac3, (short) 0x7ac5},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xec77, (short) 0xec75},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xec76, (short) 0xec74},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xec76, (short) 0xec74},
+          {(short) 0xec81, (short) 0xec7f}, {(short) 0xecac, (short) 0xecaa},
+          {(short) 0xf076, (short) 0xf074}, {(short) 0xfbe3, (short) 0xfbe1},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0x6d5f, (short) 0x6d61},
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0xfb53, (short) 0xfb51}, {(short) 0xfb4d, (short) 0xfb4b},
+          {(short) 0xfac5, (short) 0xfac3}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0xfb55, (short) 0xfb53}, {(short) 0xfb5b, (short) 0xfb59},
+          {(short) 0xfbe3, (short) 0xfbe1}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x0000, (short) 0x0002}, {(short) 0x0000, (short) 0x0400},
+          {(short) 0x0000, (short) 0x0401}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0x8002, (short) 0x0000}, {(short) 0x8400, (short) 0x8000},
+          {(short) 0x8401, (short) 0x8000}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0xfe00, (short) 0xfe00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x0000, (short) 0x0002}, {(short) 0x0000, (short) 0x0400},
+          {(short) 0x0000, (short) 0x0401}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0x8002, (short) 0x0000}, {(short) 0x8400, (short) 0x8000},
+          {(short) 0x8401, (short) 0x8000}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfe00, (short) 0xfe00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+  };
+
+  static short[][][] ReferenceOutputForSub = {
+      {
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xbc01, (short) 0xbbfe},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3bfe, (short) 0x3c01},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0x36ff, (short) 0x3701}, {(short) 0xb901, (short) 0xb8ff},
+          {(short) 0xd121, (short) 0xd11f}, {(short) 0xdab9, (short) 0xdab7},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x3ffe, (short) 0x4001}, {(short) 0x41ff, (short) 0x4201},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3bfe, (short) 0x3c01},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x3e3f, (short) 0x3e41}, {(short) 0x413f, (short) 0x4141},
+          {(short) 0x515f, (short) 0x5161}, {(short) 0x5ac7, (short) 0x5ac9},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x3ffe, (short) 0x4001}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x3ffe, (short) 0x4001}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0x3dbf, (short) 0x3dc1}, {(short) 0x35ff, (short) 0x3601},
+          {(short) 0xd101, (short) 0xd0ff}, {(short) 0xdab1, (short) 0xdaaf},
+          {(short) 0xec75, (short) 0xec73}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x41ff, (short) 0x4201}, {(short) 0x43fe, (short) 0x4401},
+          {(short) 0x3ffe, (short) 0x4001}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x3ffe, (short) 0x4001}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x411f, (short) 0x4121}, {(short) 0x433f, (short) 0x4341},
+          {(short) 0x517f, (short) 0x5181}, {(short) 0x5acf, (short) 0x5ad1},
+          {(short) 0x6c75, (short) 0x6c77}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x3ffe, (short) 0x4001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x3ffe, (short) 0x4001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x83ff, (short) 0x8000},
+          {(short) 0x8400, (short) 0x8000}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x0000, (short) 0x0003}, {(short) 0x0000, (short) 0x0401},
+          {(short) 0x0400, (short) 0x0402}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x0000, (short) 0x0002}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x0000, (short) 0x0002}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0x0000, (short) 0x03ff}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8002, (short) 0x0000}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x0000, (short) 0x0401}, {(short) 0x07fd, (short) 0x07ff},
+          {(short) 0x07fe, (short) 0x0800}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x0000, (short) 0x0400}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x0000, (short) 0x0400}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0x0000, (short) 0x0400}, {(short) 0x0000, (short) 0x0002},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x0400, (short) 0x0402}, {(short) 0x07fe, (short) 0x0800},
+          {(short) 0x07fe, (short) 0x0801}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x0000, (short) 0x0401}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x0000, (short) 0x0401}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x7bfd, (short) 0x7bff}, {(short) 0x7bf7, (short) 0x7bf9},
+          {(short) 0x7b6f, (short) 0x7b71}, {(short) 0x6d5f, (short) 0x6d61},
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xb701, (short) 0xb6ff}, {(short) 0xbdc1, (short) 0xbdbf},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x387f, (short) 0x3881},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xbc41, (short) 0xbc3f},
+          {(short) 0xd12f, (short) 0xd12d}, {(short) 0xdabd, (short) 0xdabb},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x3e3f, (short) 0x3e41}, {(short) 0x411f, (short) 0x4121},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x387f, (short) 0x3881},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x3c7f, (short) 0x3c81}, {(short) 0x405f, (short) 0x4061},
+          {(short) 0x5151, (short) 0x5153}, {(short) 0x5ac3, (short) 0x5ac5},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x38ff, (short) 0x3901}, {(short) 0xb601, (short) 0xb5ff},
+          {(short) 0x3e7f, (short) 0x3e81}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x3e7f, (short) 0x3e81}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0x3c3f, (short) 0x3c41}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0xd10d, (short) 0xd10b}, {(short) 0xdab4, (short) 0xdab2},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x413f, (short) 0x4141}, {(short) 0x433f, (short) 0x4341},
+          {(short) 0x3e7f, (short) 0x3e81}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x3e7f, (short) 0x3e81}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x405f, (short) 0x4061}, {(short) 0x427f, (short) 0x4281},
+          {(short) 0x5173, (short) 0x5175}, {(short) 0x5acc, (short) 0x5ace},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x3e7f, (short) 0x3e81}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x3e7f, (short) 0x3e81}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x511f, (short) 0x5121}, {(short) 0x50ff, (short) 0x5101},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x513f, (short) 0x5141},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0xfbff, (short) 0xfbfd},
+          {(short) 0x512d, (short) 0x512f}, {(short) 0x510b, (short) 0x510d},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xd971, (short) 0xd96f},
+          {(short) 0xec6b, (short) 0xec69}, {(short) 0xfb53, (short) 0xfb51},
+          {(short) 0x515f, (short) 0x5161}, {(short) 0x517f, (short) 0x5181},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x513f, (short) 0x5141},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x5151, (short) 0x5153}, {(short) 0x5173, (short) 0x5175},
+          {(short) 0x553f, (short) 0x5541}, {(short) 0x5c07, (short) 0x5c09},
+          {(short) 0x6c7f, (short) 0x6c81}, {(short) 0x7b53, (short) 0x7b55},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x5ab7, (short) 0x5ab9}, {(short) 0x5aaf, (short) 0x5ab1},
+          {(short) 0x5abf, (short) 0x5ac1}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x5abf, (short) 0x5ac1}, {(short) 0xfbf9, (short) 0xfbf7},
+          {(short) 0x5abb, (short) 0x5abd}, {(short) 0x5ab2, (short) 0x5ab4},
+          {(short) 0x596f, (short) 0x5971}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0xec40, (short) 0xec3e}, {(short) 0xfb4d, (short) 0xfb4b},
+          {(short) 0x5ac7, (short) 0x5ac9}, {(short) 0x5acf, (short) 0x5ad1},
+          {(short) 0x5abf, (short) 0x5ac1}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x5abf, (short) 0x5ac1}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x5ac3, (short) 0x5ac5}, {(short) 0x5acc, (short) 0x5ace},
+          {(short) 0x5c07, (short) 0x5c09}, {(short) 0x5ebf, (short) 0x5ec1},
+          {(short) 0x6caa, (short) 0x6cac}, {(short) 0x7b59, (short) 0x7b5b},
+          {(short) 0x5abf, (short) 0x5ac1}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x5abf, (short) 0x5ac1}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x6c73, (short) 0x6c75},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x6c74, (short) 0x6c76},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0xfb71, (short) 0xfb6f},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x6c74, (short) 0x6c76},
+          {(short) 0x6c69, (short) 0x6c6b}, {(short) 0x6c3e, (short) 0x6c40},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfac5, (short) 0xfac3},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x6c75, (short) 0x6c77},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x6c74, (short) 0x6c76},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x6c74, (short) 0x6c76},
+          {(short) 0x6c7f, (short) 0x6c81}, {(short) 0x6caa, (short) 0x6cac},
+          {(short) 0x7074, (short) 0x7076}, {(short) 0x7be1, (short) 0x7be3},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0xed61, (short) 0xed5f},
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x7b51, (short) 0x7b53}, {(short) 0x7b4b, (short) 0x7b4d},
+          {(short) 0x7ac3, (short) 0x7ac5}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x7b53, (short) 0x7b55}, {(short) 0x7b59, (short) 0x7b5b},
+          {(short) 0x7be1, (short) 0x7be3}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xc001, (short) 0xbffe}, {(short) 0xc201, (short) 0xc1ff},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xbc01, (short) 0xbbfe},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xbe41, (short) 0xbe3f}, {(short) 0xc141, (short) 0xc13f},
+          {(short) 0xd161, (short) 0xd15f}, {(short) 0xdac9, (short) 0xdac7},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x3bfe, (short) 0x3c01},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xbc01, (short) 0xbbfe},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0xb701, (short) 0xb6ff}, {(short) 0x38ff, (short) 0x3901},
+          {(short) 0x511f, (short) 0x5121}, {(short) 0x5ab7, (short) 0x5ab9},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xc201, (short) 0xc1ff}, {(short) 0xc401, (short) 0xc3fe},
+          {(short) 0xc001, (short) 0xbffe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0xc001, (short) 0xbffe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xc121, (short) 0xc11f}, {(short) 0xc341, (short) 0xc33f},
+          {(short) 0xd181, (short) 0xd17f}, {(short) 0xdad1, (short) 0xdacf},
+          {(short) 0xec77, (short) 0xec75}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0xc001, (short) 0xbffe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0xc001, (short) 0xbffe}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0xbdc1, (short) 0xbdbf}, {(short) 0xb601, (short) 0xb5ff},
+          {(short) 0x50ff, (short) 0x5101}, {(short) 0x5aaf, (short) 0x5ab1},
+          {(short) 0x6c73, (short) 0x6c75}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0xc001, (short) 0xbffe}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xc001, (short) 0xbffe}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0x8003, (short) 0x8000}, {(short) 0x8401, (short) 0x8000},
+          {(short) 0x8402, (short) 0x8400}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x0000, (short) 0x03ff},
+          {(short) 0x0000, (short) 0x0400}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x8002, (short) 0x0000}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8002, (short) 0x0000}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0x8401, (short) 0x8000}, {(short) 0x87ff, (short) 0x87fd},
+          {(short) 0x8800, (short) 0x87fe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x83ff, (short) 0x8000}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x0000, (short) 0x0002}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x8400, (short) 0x8000}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8400, (short) 0x8000}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0x8402, (short) 0x8400}, {(short) 0x8800, (short) 0x87fe},
+          {(short) 0x8801, (short) 0x87fe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x8400, (short) 0x8000}, {(short) 0x8002, (short) 0x0000},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x8401, (short) 0x8000}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8401, (short) 0x8000}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xfbff, (short) 0xfbfd}, {(short) 0xfbf9, (short) 0xfbf7},
+          {(short) 0xfb71, (short) 0xfb6f}, {(short) 0xed61, (short) 0xed5f},
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xbe41, (short) 0xbe3f}, {(short) 0xc121, (short) 0xc11f},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xb881, (short) 0xb87f},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xbc81, (short) 0xbc7f}, {(short) 0xc061, (short) 0xc05f},
+          {(short) 0xd153, (short) 0xd151}, {(short) 0xdac5, (short) 0xdac3},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x36ff, (short) 0x3701}, {(short) 0x3dbf, (short) 0x3dc1},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xb881, (short) 0xb87f},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x3c3f, (short) 0x3c41},
+          {(short) 0x512d, (short) 0x512f}, {(short) 0x5abb, (short) 0x5abd},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xc141, (short) 0xc13f}, {(short) 0xc341, (short) 0xc33f},
+          {(short) 0xbe81, (short) 0xbe7f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xbe81, (short) 0xbe7f}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xc061, (short) 0xc05f}, {(short) 0xc281, (short) 0xc27f},
+          {(short) 0xd175, (short) 0xd173}, {(short) 0xdace, (short) 0xdacc},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0xb901, (short) 0xb8ff}, {(short) 0x35ff, (short) 0x3601},
+          {(short) 0xbe81, (short) 0xbe7f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xbe81, (short) 0xbe7f}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0xbc41, (short) 0xbc3f}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x510b, (short) 0x510d}, {(short) 0x5ab2, (short) 0x5ab4},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0xbe81, (short) 0xbe7f}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xbe81, (short) 0xbe7f}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xd161, (short) 0xd15f}, {(short) 0xd181, (short) 0xd17f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xd141, (short) 0xd13f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xd153, (short) 0xd151}, {(short) 0xd175, (short) 0xd173},
+          {(short) 0xd541, (short) 0xd53f}, {(short) 0xdc09, (short) 0xdc07},
+          {(short) 0xec81, (short) 0xec7f}, {(short) 0xfb55, (short) 0xfb53},
+          {(short) 0xd121, (short) 0xd11f}, {(short) 0xd101, (short) 0xd0ff},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xd141, (short) 0xd13f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0x7bfd, (short) 0x7bff},
+          {(short) 0xd12f, (short) 0xd12d}, {(short) 0xd10d, (short) 0xd10b},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x596f, (short) 0x5971},
+          {(short) 0x6c69, (short) 0x6c6b}, {(short) 0x7b51, (short) 0x7b53},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xdac9, (short) 0xdac7}, {(short) 0xdad1, (short) 0xdacf},
+          {(short) 0xdac1, (short) 0xdabf}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xdac1, (short) 0xdabf}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xdac5, (short) 0xdac3}, {(short) 0xdace, (short) 0xdacc},
+          {(short) 0xdc09, (short) 0xdc07}, {(short) 0xdec1, (short) 0xdebf},
+          {(short) 0xecac, (short) 0xecaa}, {(short) 0xfb5b, (short) 0xfb59},
+          {(short) 0xdab9, (short) 0xdab7}, {(short) 0xdab1, (short) 0xdaaf},
+          {(short) 0xdac1, (short) 0xdabf}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xdac1, (short) 0xdabf}, {(short) 0x7bf7, (short) 0x7bf9},
+          {(short) 0xdabd, (short) 0xdabb}, {(short) 0xdab4, (short) 0xdab2},
+          {(short) 0xd971, (short) 0xd96f}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x6c3e, (short) 0x6c40}, {(short) 0x7b4b, (short) 0x7b4d},
+          {(short) 0xdac1, (short) 0xdabf}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xdac1, (short) 0xdabf}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xec77, (short) 0xec75},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xec76, (short) 0xec74},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xec76, (short) 0xec74},
+          {(short) 0xec81, (short) 0xec7f}, {(short) 0xecac, (short) 0xecaa},
+          {(short) 0xf076, (short) 0xf074}, {(short) 0xfbe3, (short) 0xfbe1},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xec75, (short) 0xec73},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xec76, (short) 0xec74},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0x7b6f, (short) 0x7b71},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xec76, (short) 0xec74},
+          {(short) 0xec6b, (short) 0xec69}, {(short) 0xec40, (short) 0xec3e},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7ac3, (short) 0x7ac5},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0xfb55, (short) 0xfb53}, {(short) 0xfb5b, (short) 0xfb59},
+          {(short) 0xfbe3, (short) 0xfbe1}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0x6d5f, (short) 0x6d61},
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0xfb53, (short) 0xfb51}, {(short) 0xfb4d, (short) 0xfb4b},
+          {(short) 0xfac5, (short) 0xfac3}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0x8002, (short) 0x0000}, {(short) 0x8400, (short) 0x8000},
+          {(short) 0x8401, (short) 0x8000}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x0000, (short) 0x0002}, {(short) 0x0000, (short) 0x0400},
+          {(short) 0x0000, (short) 0x0401}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0xfe00, (short) 0xfe00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0x8002, (short) 0x0000}, {(short) 0x8400, (short) 0x8000},
+          {(short) 0x8401, (short) 0x8000}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x0000, (short) 0x0002}, {(short) 0x0000, (short) 0x0400},
+          {(short) 0x0000, (short) 0x0401}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfe00, (short) 0xfe00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+  };
+
+  static short[][][] ReferenceOutputForMul = {
+      {
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x0000, (short) 0x0002}, {(short) 0x0000, (short) 0x0400},
+          {(short) 0x0000, (short) 0x0401}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0x8002, (short) 0x0000}, {(short) 0x8400, (short) 0x8000},
+          {(short) 0x8401, (short) 0x8000}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x3ffe, (short) 0x4001}, {(short) 0x43fe, (short) 0x4401},
+          {(short) 0x0000, (short) 0x0003}, {(short) 0x07fd, (short) 0x07ff},
+          {(short) 0x07fe, (short) 0x0801}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x3c7f, (short) 0x3c81}, {(short) 0x427f, (short) 0x4281},
+          {(short) 0x553f, (short) 0x5541}, {(short) 0x5ebf, (short) 0x5ec1},
+          {(short) 0x7074, (short) 0x7076}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xc001, (short) 0xbffe}, {(short) 0xc401, (short) 0xc3fe},
+          {(short) 0x8003, (short) 0x8000}, {(short) 0x87ff, (short) 0x87fd},
+          {(short) 0x8801, (short) 0x87fe}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xbc81, (short) 0xbc7f}, {(short) 0xc281, (short) 0xc27f},
+          {(short) 0xd541, (short) 0xd53f}, {(short) 0xdec1, (short) 0xdebf},
+          {(short) 0xf076, (short) 0xf074}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x0000, (short) 0x0002}, {(short) 0x0000, (short) 0x0003},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x1bfe, (short) 0x1c00},
+          {(short) 0x0000, (short) 0x0002}, {(short) 0x0000, (short) 0x0003},
+          {(short) 0x0000, (short) 0x002b}, {(short) 0x0000, (short) 0x00d9},
+          {(short) 0x0c74, (short) 0x0c76}, {(short) 0x1b52, (short) 0x1b54},
+          {(short) 0x8002, (short) 0x0000}, {(short) 0x8003, (short) 0x8000},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x9c00, (short) 0x9bfe},
+          {(short) 0x8002, (short) 0x0000}, {(short) 0x8003, (short) 0x8000},
+          {(short) 0x802b, (short) 0x8000}, {(short) 0x80d9, (short) 0x8000},
+          {(short) 0x8c76, (short) 0x8c74}, {(short) 0x9b54, (short) 0x9b52},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x0000, (short) 0x0400}, {(short) 0x07fd, (short) 0x07ff},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x43fc, (short) 0x43fe},
+          {(short) 0x0000, (short) 0x0240}, {(short) 0x067d, (short) 0x067f},
+          {(short) 0x193e, (short) 0x1940}, {(short) 0x22bd, (short) 0x22bf},
+          {(short) 0x3473, (short) 0x3475}, {(short) 0x4350, (short) 0x4352},
+          {(short) 0x8400, (short) 0x8000}, {(short) 0x87ff, (short) 0x87fd},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xc3fe, (short) 0xc3fc},
+          {(short) 0x8240, (short) 0x8000}, {(short) 0x867f, (short) 0x867d},
+          {(short) 0x9940, (short) 0x993e}, {(short) 0xa2bf, (short) 0xa2bd},
+          {(short) 0xb475, (short) 0xb473}, {(short) 0xc352, (short) 0xc350},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x0000, (short) 0x0401}, {(short) 0x07fe, (short) 0x0801},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x43fe, (short) 0x4400},
+          {(short) 0x0000, (short) 0x0241}, {(short) 0x067f, (short) 0x0681},
+          {(short) 0x193f, (short) 0x1941}, {(short) 0x22bf, (short) 0x22c1},
+          {(short) 0x3474, (short) 0x3476}, {(short) 0x4352, (short) 0x4354},
+          {(short) 0x8401, (short) 0x8000}, {(short) 0x8801, (short) 0x87fe},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xc400, (short) 0xc3fe},
+          {(short) 0x8241, (short) 0x8000}, {(short) 0x8681, (short) 0x867f},
+          {(short) 0x9941, (short) 0x993f}, {(short) 0xa2c1, (short) 0xa2bf},
+          {(short) 0xb476, (short) 0xb474}, {(short) 0xc354, (short) 0xc352},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x1bfe, (short) 0x1c00}, {(short) 0x43fc, (short) 0x43fe},
+          {(short) 0x43fe, (short) 0x4400}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x787e, (short) 0x7880}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x9c00, (short) 0x9bfe}, {(short) 0xc3fe, (short) 0xc3fc},
+          {(short) 0xc400, (short) 0xc3fe}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xf880, (short) 0xf87e}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3c7f, (short) 0x3c81},
+          {(short) 0x0000, (short) 0x0002}, {(short) 0x0000, (short) 0x0240},
+          {(short) 0x0000, (short) 0x0241}, {(short) 0x787e, (short) 0x7880},
+          {(short) 0x350f, (short) 0x3511}, {(short) 0x3b4f, (short) 0x3b51},
+          {(short) 0x4de7, (short) 0x4de9}, {(short) 0x5797, (short) 0x5799},
+          {(short) 0x6903, (short) 0x6905}, {(short) 0x781e, (short) 0x7820},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbc81, (short) 0xbc7f},
+          {(short) 0x8002, (short) 0x0000}, {(short) 0x8240, (short) 0x8000},
+          {(short) 0x8241, (short) 0x8000}, {(short) 0xf880, (short) 0xf87e},
+          {(short) 0xb511, (short) 0xb50f}, {(short) 0xbb51, (short) 0xbb4f},
+          {(short) 0xcde9, (short) 0xcde7}, {(short) 0xd799, (short) 0xd797},
+          {(short) 0xe905, (short) 0xe903}, {(short) 0xf820, (short) 0xf81e},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x3e7f, (short) 0x3e81}, {(short) 0x427f, (short) 0x4281},
+          {(short) 0x0000, (short) 0x0003}, {(short) 0x067d, (short) 0x067f},
+          {(short) 0x067f, (short) 0x0681}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x3b4f, (short) 0x3b51}, {(short) 0x4147, (short) 0x4149},
+          {(short) 0x5443, (short) 0x5445}, {(short) 0x5d7b, (short) 0x5d7d},
+          {(short) 0x6f3d, (short) 0x6f3f}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xbe81, (short) 0xbe7f}, {(short) 0xc281, (short) 0xc27f},
+          {(short) 0x8003, (short) 0x8000}, {(short) 0x867f, (short) 0x867d},
+          {(short) 0x8681, (short) 0x867f}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xbb51, (short) 0xbb4f}, {(short) 0xc149, (short) 0xc147},
+          {(short) 0xd445, (short) 0xd443}, {(short) 0xdd7d, (short) 0xdd7b},
+          {(short) 0xef3f, (short) 0xef3d}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x553f, (short) 0x5541},
+          {(short) 0x0000, (short) 0x002b}, {(short) 0x193e, (short) 0x1940},
+          {(short) 0x193f, (short) 0x1941}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x4de7, (short) 0x4de9}, {(short) 0x5443, (short) 0x5445},
+          {(short) 0x66e3, (short) 0x66e5}, {(short) 0x706d, (short) 0x706f},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xd541, (short) 0xd53f},
+          {(short) 0x802b, (short) 0x8000}, {(short) 0x9940, (short) 0x993e},
+          {(short) 0x9941, (short) 0x993f}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xcde9, (short) 0xcde7}, {(short) 0xd445, (short) 0xd443},
+          {(short) 0xe6e5, (short) 0xe6e3}, {(short) 0xf06f, (short) 0xf06d},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x5abf, (short) 0x5ac1}, {(short) 0x5ebf, (short) 0x5ec1},
+          {(short) 0x0000, (short) 0x00d9}, {(short) 0x22bd, (short) 0x22bf},
+          {(short) 0x22bf, (short) 0x22c1}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x5797, (short) 0x5799}, {(short) 0x5d7b, (short) 0x5d7d},
+          {(short) 0x706d, (short) 0x706f}, {(short) 0x79b1, (short) 0x79b3},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xdac1, (short) 0xdabf}, {(short) 0xdec1, (short) 0xdebf},
+          {(short) 0x80d9, (short) 0x8000}, {(short) 0xa2bf, (short) 0xa2bd},
+          {(short) 0xa2c1, (short) 0xa2bf}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xd799, (short) 0xd797}, {(short) 0xdd7d, (short) 0xdd7b},
+          {(short) 0xf06f, (short) 0xf06d}, {(short) 0xf9b3, (short) 0xf9b1},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7074, (short) 0x7076},
+          {(short) 0x0c74, (short) 0x0c76}, {(short) 0x3473, (short) 0x3475},
+          {(short) 0x3474, (short) 0x3476}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x6903, (short) 0x6905}, {(short) 0x6f3d, (short) 0x6f3f},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xf076, (short) 0xf074},
+          {(short) 0x8c76, (short) 0x8c74}, {(short) 0xb475, (short) 0xb473},
+          {(short) 0xb476, (short) 0xb474}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xe905, (short) 0xe903}, {(short) 0xef3f, (short) 0xef3d},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x1b52, (short) 0x1b54}, {(short) 0x4350, (short) 0x4352},
+          {(short) 0x4352, (short) 0x4354}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x781e, (short) 0x7820}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x9b54, (short) 0x9b52}, {(short) 0xc352, (short) 0xc350},
+          {(short) 0xc354, (short) 0xc352}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xf820, (short) 0xf81e}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xbc01, (short) 0xbbfe}, {(short) 0xc001, (short) 0xbffe},
+          {(short) 0x8002, (short) 0x0000}, {(short) 0x8400, (short) 0x8000},
+          {(short) 0x8401, (short) 0x8000}, {(short) 0xfc00, (short) 0xfbfe},
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbe81, (short) 0xbe7f},
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xdac1, (short) 0xdabf},
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xfb54, (short) 0xfb52},
+          {(short) 0x3bfe, (short) 0x3c01}, {(short) 0x3ffe, (short) 0x4001},
+          {(short) 0x0000, (short) 0x0002}, {(short) 0x0000, (short) 0x0400},
+          {(short) 0x0000, (short) 0x0401}, {(short) 0x7bfe, (short) 0x7c00},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3e7f, (short) 0x3e81},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x5abf, (short) 0x5ac1},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7b52, (short) 0x7b54},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xc001, (short) 0xbffe}, {(short) 0xc401, (short) 0xc3fe},
+          {(short) 0x8003, (short) 0x8000}, {(short) 0x87ff, (short) 0x87fd},
+          {(short) 0x8801, (short) 0x87fe}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xbc81, (short) 0xbc7f}, {(short) 0xc281, (short) 0xc27f},
+          {(short) 0xd541, (short) 0xd53f}, {(short) 0xdec1, (short) 0xdebf},
+          {(short) 0xf076, (short) 0xf074}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x3ffe, (short) 0x4001}, {(short) 0x43fe, (short) 0x4401},
+          {(short) 0x0000, (short) 0x0003}, {(short) 0x07fd, (short) 0x07ff},
+          {(short) 0x07fe, (short) 0x0801}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x3c7f, (short) 0x3c81}, {(short) 0x427f, (short) 0x4281},
+          {(short) 0x553f, (short) 0x5541}, {(short) 0x5ebf, (short) 0x5ec1},
+          {(short) 0x7074, (short) 0x7076}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x8002, (short) 0x0000}, {(short) 0x8003, (short) 0x8000},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x9c00, (short) 0x9bfe},
+          {(short) 0x8002, (short) 0x0000}, {(short) 0x8003, (short) 0x8000},
+          {(short) 0x802b, (short) 0x8000}, {(short) 0x80d9, (short) 0x8000},
+          {(short) 0x8c76, (short) 0x8c74}, {(short) 0x9b54, (short) 0x9b52},
+          {(short) 0x0000, (short) 0x0002}, {(short) 0x0000, (short) 0x0003},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x1bfe, (short) 0x1c00},
+          {(short) 0x0000, (short) 0x0002}, {(short) 0x0000, (short) 0x0003},
+          {(short) 0x0000, (short) 0x002b}, {(short) 0x0000, (short) 0x00d9},
+          {(short) 0x0c74, (short) 0x0c76}, {(short) 0x1b52, (short) 0x1b54},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x8400, (short) 0x8000}, {(short) 0x87ff, (short) 0x87fd},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xc3fe, (short) 0xc3fc},
+          {(short) 0x8240, (short) 0x8000}, {(short) 0x867f, (short) 0x867d},
+          {(short) 0x9940, (short) 0x993e}, {(short) 0xa2bf, (short) 0xa2bd},
+          {(short) 0xb475, (short) 0xb473}, {(short) 0xc352, (short) 0xc350},
+          {(short) 0x0000, (short) 0x0400}, {(short) 0x07fd, (short) 0x07ff},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x43fc, (short) 0x43fe},
+          {(short) 0x0000, (short) 0x0240}, {(short) 0x067d, (short) 0x067f},
+          {(short) 0x193e, (short) 0x1940}, {(short) 0x22bd, (short) 0x22bf},
+          {(short) 0x3473, (short) 0x3475}, {(short) 0x4350, (short) 0x4352},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x8401, (short) 0x8000}, {(short) 0x8801, (short) 0x87fe},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xc400, (short) 0xc3fe},
+          {(short) 0x8241, (short) 0x8000}, {(short) 0x8681, (short) 0x867f},
+          {(short) 0x9941, (short) 0x993f}, {(short) 0xa2c1, (short) 0xa2bf},
+          {(short) 0xb476, (short) 0xb474}, {(short) 0xc354, (short) 0xc352},
+          {(short) 0x0000, (short) 0x0401}, {(short) 0x07fe, (short) 0x0801},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x43fe, (short) 0x4400},
+          {(short) 0x0000, (short) 0x0241}, {(short) 0x067f, (short) 0x0681},
+          {(short) 0x193f, (short) 0x1941}, {(short) 0x22bf, (short) 0x22c1},
+          {(short) 0x3474, (short) 0x3476}, {(short) 0x4352, (short) 0x4354},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xfc00, (short) 0xfbfe}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x9c00, (short) 0x9bfe}, {(short) 0xc3fe, (short) 0xc3fc},
+          {(short) 0xc400, (short) 0xc3fe}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xf880, (short) 0xf87e}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7bfe, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x1bfe, (short) 0x1c00}, {(short) 0x43fc, (short) 0x43fe},
+          {(short) 0x43fe, (short) 0x4400}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x787e, (short) 0x7880}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xb881, (short) 0xb87f}, {(short) 0xbc81, (short) 0xbc7f},
+          {(short) 0x8002, (short) 0x0000}, {(short) 0x8240, (short) 0x8000},
+          {(short) 0x8241, (short) 0x8000}, {(short) 0xf880, (short) 0xf87e},
+          {(short) 0xb511, (short) 0xb50f}, {(short) 0xbb51, (short) 0xbb4f},
+          {(short) 0xcde9, (short) 0xcde7}, {(short) 0xd799, (short) 0xd797},
+          {(short) 0xe905, (short) 0xe903}, {(short) 0xf820, (short) 0xf81e},
+          {(short) 0x387f, (short) 0x3881}, {(short) 0x3c7f, (short) 0x3c81},
+          {(short) 0x0000, (short) 0x0002}, {(short) 0x0000, (short) 0x0240},
+          {(short) 0x0000, (short) 0x0241}, {(short) 0x787e, (short) 0x7880},
+          {(short) 0x350f, (short) 0x3511}, {(short) 0x3b4f, (short) 0x3b51},
+          {(short) 0x4de7, (short) 0x4de9}, {(short) 0x5797, (short) 0x5799},
+          {(short) 0x6903, (short) 0x6905}, {(short) 0x781e, (short) 0x7820},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xbe81, (short) 0xbe7f}, {(short) 0xc281, (short) 0xc27f},
+          {(short) 0x8003, (short) 0x8000}, {(short) 0x867f, (short) 0x867d},
+          {(short) 0x8681, (short) 0x867f}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xbb51, (short) 0xbb4f}, {(short) 0xc149, (short) 0xc147},
+          {(short) 0xd445, (short) 0xd443}, {(short) 0xdd7d, (short) 0xdd7b},
+          {(short) 0xef3f, (short) 0xef3d}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x3e7f, (short) 0x3e81}, {(short) 0x427f, (short) 0x4281},
+          {(short) 0x0000, (short) 0x0003}, {(short) 0x067d, (short) 0x067f},
+          {(short) 0x067f, (short) 0x0681}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x3b4f, (short) 0x3b51}, {(short) 0x4147, (short) 0x4149},
+          {(short) 0x5443, (short) 0x5445}, {(short) 0x5d7b, (short) 0x5d7d},
+          {(short) 0x6f3d, (short) 0x6f3f}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xd141, (short) 0xd13f}, {(short) 0xd541, (short) 0xd53f},
+          {(short) 0x802b, (short) 0x8000}, {(short) 0x9940, (short) 0x993e},
+          {(short) 0x9941, (short) 0x993f}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xcde9, (short) 0xcde7}, {(short) 0xd445, (short) 0xd443},
+          {(short) 0xe6e5, (short) 0xe6e3}, {(short) 0xf06f, (short) 0xf06d},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x513f, (short) 0x5141}, {(short) 0x553f, (short) 0x5541},
+          {(short) 0x0000, (short) 0x002b}, {(short) 0x193e, (short) 0x1940},
+          {(short) 0x193f, (short) 0x1941}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x4de7, (short) 0x4de9}, {(short) 0x5443, (short) 0x5445},
+          {(short) 0x66e3, (short) 0x66e5}, {(short) 0x706d, (short) 0x706f},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xdac1, (short) 0xdabf}, {(short) 0xdec1, (short) 0xdebf},
+          {(short) 0x80d9, (short) 0x8000}, {(short) 0xa2bf, (short) 0xa2bd},
+          {(short) 0xa2c1, (short) 0xa2bf}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xd799, (short) 0xd797}, {(short) 0xdd7d, (short) 0xdd7b},
+          {(short) 0xf06f, (short) 0xf06d}, {(short) 0xf9b3, (short) 0xf9b1},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x5abf, (short) 0x5ac1}, {(short) 0x5ebf, (short) 0x5ec1},
+          {(short) 0x0000, (short) 0x00d9}, {(short) 0x22bd, (short) 0x22bf},
+          {(short) 0x22bf, (short) 0x22c1}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x5797, (short) 0x5799}, {(short) 0x5d7b, (short) 0x5d7d},
+          {(short) 0x706d, (short) 0x706f}, {(short) 0x79b1, (short) 0x79b3},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xec76, (short) 0xec74}, {(short) 0xf076, (short) 0xf074},
+          {(short) 0x8c76, (short) 0x8c74}, {(short) 0xb475, (short) 0xb473},
+          {(short) 0xb476, (short) 0xb474}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xe905, (short) 0xe903}, {(short) 0xef3f, (short) 0xef3d},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x6c74, (short) 0x6c76}, {(short) 0x7074, (short) 0x7076},
+          {(short) 0x0c74, (short) 0x0c76}, {(short) 0x3473, (short) 0x3475},
+          {(short) 0x3474, (short) 0x3476}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x6903, (short) 0x6905}, {(short) 0x6f3d, (short) 0x6f3f},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xfb54, (short) 0xfb52}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x9b54, (short) 0x9b52}, {(short) 0xc352, (short) 0xc350},
+          {(short) 0xc354, (short) 0xc352}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xf820, (short) 0xf81e}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7b52, (short) 0x7b54}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x1b52, (short) 0x1b54}, {(short) 0x4350, (short) 0x4352},
+          {(short) 0x4352, (short) 0x4354}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x781e, (short) 0x7820}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfe00, (short) 0xfe00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfe00, (short) 0xfe00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfe00, (short) 0xfe00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xfe00, (short) 0xfe00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0x8001, (short) 0x0001},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfe00, (short) 0xfe00},
+          {(short) 0x8001, (short) 0x0001}, {(short) 0xfe00, (short) 0xfe00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xfe00, (short) 0xfe00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfe00, (short) 0xfe00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+  };
+
+  static short[][][] ReferenceOutputForDiv = {
+      {
+          {(short) 0x3bfa, (short) 0x3c03}, {(short) 0x37fa, (short) 0x3803},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x73fc, (short) 0x7404},
+          {(short) 0x73fa, (short) 0x7403}, {(short) 0x0000, (short) 0x0103},
+          {(short) 0x3f19, (short) 0x3f1f}, {(short) 0x38e9, (short) 0x38ef},
+          {(short) 0x2615, (short) 0x261b}, {(short) 0x1cbb, (short) 0x1cc1},
+          {(short) 0x0b2b, (short) 0x0b31}, {(short) 0x0000, (short) 0x011b},
+          {(short) 0xbc03, (short) 0xbbfa}, {(short) 0xb803, (short) 0xb7fa},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xf404, (short) 0xf3fc},
+          {(short) 0xf403, (short) 0xf3fa}, {(short) 0x8103, (short) 0x8000},
+          {(short) 0xbf1f, (short) 0xbf19}, {(short) 0xb8ef, (short) 0xb8e9},
+          {(short) 0xa61b, (short) 0xa615}, {(short) 0x9cc1, (short) 0x9cbb},
+          {(short) 0x8b31, (short) 0x8b2b}, {(short) 0x811b, (short) 0x8000},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x3ffa, (short) 0x4003}, {(short) 0x3bfa, (short) 0x3c03},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x77fc, (short) 0x7804},
+          {(short) 0x77fa, (short) 0x7803}, {(short) 0x0000, (short) 0x0203},
+          {(short) 0x4319, (short) 0x431f}, {(short) 0x3ce9, (short) 0x3cef},
+          {(short) 0x2a15, (short) 0x2a1b}, {(short) 0x20bb, (short) 0x20c1},
+          {(short) 0x0f2b, (short) 0x0f31}, {(short) 0x0000, (short) 0x0232},
+          {(short) 0xc003, (short) 0xbffa}, {(short) 0xbc03, (short) 0xbbfa},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xf804, (short) 0xf7fc},
+          {(short) 0xf803, (short) 0xf7fa}, {(short) 0x8203, (short) 0x8000},
+          {(short) 0xc31f, (short) 0xc319}, {(short) 0xbcef, (short) 0xbce9},
+          {(short) 0xaa1b, (short) 0xaa15}, {(short) 0xa0c1, (short) 0xa0bb},
+          {(short) 0x8f31, (short) 0x8f2b}, {(short) 0x8232, (short) 0x8000},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x8002, (short) 0x0004}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x3bfa, (short) 0x3c03}, {(short) 0x13fc, (short) 0x1404},
+          {(short) 0x13fa, (short) 0x1403}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8001, (short) 0x0005}, {(short) 0x8002, (short) 0x0004},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8004, (short) 0x0002}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xbc03, (short) 0xbbfa}, {(short) 0x9404, (short) 0x93fc},
+          {(short) 0x9403, (short) 0x93fa}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8005, (short) 0x0001}, {(short) 0x8004, (short) 0x0002},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x0000, (short) 0x0402}, {(short) 0x0000, (short) 0x0203},
+          {(short) 0x63fb, (short) 0x6400}, {(short) 0x3bfa, (short) 0x3c03},
+          {(short) 0x3bfb, (short) 0x3c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x0718, (short) 0x071e}, {(short) 0x0000, (short) 0x0279},
+          {(short) 0x0000, (short) 0x001b}, {(short) 0x0000, (short) 0x0008},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8402, (short) 0x8000}, {(short) 0x8203, (short) 0x8000},
+          {(short) 0xe400, (short) 0xe3fb}, {(short) 0xbc03, (short) 0xbbfa},
+          {(short) 0xbc00, (short) 0xbbfb}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x871e, (short) 0x8718}, {(short) 0x8279, (short) 0x8000},
+          {(short) 0x801b, (short) 0x8000}, {(short) 0x8008, (short) 0x8000},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x0000, (short) 0x0403}, {(short) 0x0000, (short) 0x0203},
+          {(short) 0x63fa, (short) 0x6403}, {(short) 0x3bfc, (short) 0x3c04},
+          {(short) 0x3bfa, (short) 0x3c03}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x0719, (short) 0x071f}, {(short) 0x0000, (short) 0x0279},
+          {(short) 0x0000, (short) 0x001b}, {(short) 0x0000, (short) 0x0008},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8403, (short) 0x8000}, {(short) 0x8203, (short) 0x8000},
+          {(short) 0xe403, (short) 0xe3fa}, {(short) 0xbc04, (short) 0xbbfc},
+          {(short) 0xbc03, (short) 0xbbfa}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x871f, (short) 0x8719}, {(short) 0x8279, (short) 0x8000},
+          {(short) 0x801b, (short) 0x8000}, {(short) 0x8008, (short) 0x8000},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x7bfc, (short) 0x7c00}, {(short) 0x77fc, (short) 0x7801},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x3bfa, (short) 0x3c03},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x78e9, (short) 0x78ef},
+          {(short) 0x6615, (short) 0x661b}, {(short) 0x5cba, (short) 0x5cc0},
+          {(short) 0x4b2a, (short) 0x4b30}, {(short) 0x3c5b, (short) 0x3c61},
+          {(short) 0xfc00, (short) 0xfbfc}, {(short) 0xf801, (short) 0xf7fc},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xbc03, (short) 0xbbfa},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xf8ef, (short) 0xf8e9},
+          {(short) 0xe61b, (short) 0xe615}, {(short) 0xdcc0, (short) 0xdcba},
+          {(short) 0xcb30, (short) 0xcb2a}, {(short) 0xbc61, (short) 0xbc5b},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x387d, (short) 0x3883}, {(short) 0x347d, (short) 0x3483},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x707e, (short) 0x7084},
+          {(short) 0x707d, (short) 0x7083}, {(short) 0x0000, (short) 0x0093},
+          {(short) 0x3bfa, (short) 0x3c03}, {(short) 0x3587, (short) 0x358d},
+          {(short) 0x22d8, (short) 0x22de}, {(short) 0x1952, (short) 0x1958},
+          {(short) 0x0807, (short) 0x080d}, {(short) 0x0000, (short) 0x00a0},
+          {(short) 0xb883, (short) 0xb87d}, {(short) 0xb483, (short) 0xb47d},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xf084, (short) 0xf07e},
+          {(short) 0xf083, (short) 0xf07d}, {(short) 0x8093, (short) 0x8000},
+          {(short) 0xbc03, (short) 0xbbfa}, {(short) 0xb58d, (short) 0xb587},
+          {(short) 0xa2de, (short) 0xa2d8}, {(short) 0x9958, (short) 0x9952},
+          {(short) 0x880d, (short) 0x8807}, {(short) 0x80a0, (short) 0x8000},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x3e7d, (short) 0x3e83}, {(short) 0x3a7d, (short) 0x3a83},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x767f, (short) 0x7685},
+          {(short) 0x767d, (short) 0x7683}, {(short) 0x0000, (short) 0x01a3},
+          {(short) 0x41c4, (short) 0x41ca}, {(short) 0x3bfa, (short) 0x3c03},
+          {(short) 0x28f1, (short) 0x28f7}, {(short) 0x1fb1, (short) 0x1fb7},
+          {(short) 0x0dd2, (short) 0x0dd8}, {(short) 0x0000, (short) 0x01c9},
+          {(short) 0xbe83, (short) 0xbe7d}, {(short) 0xba83, (short) 0xba7d},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xf685, (short) 0xf67f},
+          {(short) 0xf683, (short) 0xf67d}, {(short) 0x81a3, (short) 0x8000},
+          {(short) 0xc1ca, (short) 0xc1c4}, {(short) 0xbc03, (short) 0xbbfa},
+          {(short) 0xa8f7, (short) 0xa8f1}, {(short) 0x9fb7, (short) 0x9fb1},
+          {(short) 0x8dd8, (short) 0x8dd2}, {(short) 0x81c9, (short) 0x8000},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x513d, (short) 0x5143}, {(short) 0x4d3d, (short) 0x4d43},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x113e, (short) 0x1144},
+          {(short) 0x54a8, (short) 0x54ae}, {(short) 0x4e73, (short) 0x4e79},
+          {(short) 0x3bfa, (short) 0x3c03}, {(short) 0x3236, (short) 0x323c},
+          {(short) 0x20b3, (short) 0x20b9}, {(short) 0x11b9, (short) 0x11bf},
+          {(short) 0xd143, (short) 0xd13d}, {(short) 0xcd43, (short) 0xcd3d},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x9144, (short) 0x913e},
+          {(short) 0xd4ae, (short) 0xd4a8}, {(short) 0xce79, (short) 0xce73},
+          {(short) 0xbc03, (short) 0xbbfa}, {(short) 0xb23c, (short) 0xb236},
+          {(short) 0xa0b9, (short) 0xa0b3}, {(short) 0x91bf, (short) 0x91b9},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x5abd, (short) 0x5ac3}, {(short) 0x56bd, (short) 0x56c3},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x1abe, (short) 0x1ac4},
+          {(short) 0x5dfd, (short) 0x5e03}, {(short) 0x5824, (short) 0x582a},
+          {(short) 0x4522, (short) 0x4528}, {(short) 0x3bfa, (short) 0x3c03},
+          {(short) 0x2a0c, (short) 0x2a12}, {(short) 0x1b5c, (short) 0x1b62},
+          {(short) 0xdac3, (short) 0xdabd}, {(short) 0xd6c3, (short) 0xd6bd},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x9ac4, (short) 0x9abe},
+          {(short) 0xde03, (short) 0xddfd}, {(short) 0xd82a, (short) 0xd824},
+          {(short) 0xc528, (short) 0xc522}, {(short) 0xbc03, (short) 0xbbfa},
+          {(short) 0xaa12, (short) 0xaa0c}, {(short) 0x9b62, (short) 0x9b5c},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x6c72, (short) 0x6c78}, {(short) 0x6872, (short) 0x6878},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x2c73, (short) 0x2c79},
+          {(short) 0x6fe9, (short) 0x6fef}, {(short) 0x6979, (short) 0x697f},
+          {(short) 0x56c8, (short) 0x56ce}, {(short) 0x4d45, (short) 0x4d4b},
+          {(short) 0x3bfa, (short) 0x3c03}, {(short) 0x2cdb, (short) 0x2ce1},
+          {(short) 0xec78, (short) 0xec72}, {(short) 0xe878, (short) 0xe872},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xac79, (short) 0xac73},
+          {(short) 0xefef, (short) 0xefe9}, {(short) 0xe97f, (short) 0xe979},
+          {(short) 0xd6ce, (short) 0xd6c8}, {(short) 0xcd4b, (short) 0xcd45},
+          {(short) 0xbc03, (short) 0xbbfa}, {(short) 0xace1, (short) 0xacdb},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x7b50, (short) 0x7b56}, {(short) 0x7750, (short) 0x7756},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x3b51, (short) 0x3b57},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x787f, (short) 0x7885},
+          {(short) 0x6592, (short) 0x6598}, {(short) 0x5c54, (short) 0x5c5a},
+          {(short) 0x4a90, (short) 0x4a96}, {(short) 0x3bfa, (short) 0x3c03},
+          {(short) 0xfb56, (short) 0xfb50}, {(short) 0xf756, (short) 0xf750},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xbb57, (short) 0xbb51},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xf885, (short) 0xf87f},
+          {(short) 0xe598, (short) 0xe592}, {(short) 0xdc5a, (short) 0xdc54},
+          {(short) 0xca96, (short) 0xca90}, {(short) 0xbc03, (short) 0xbbfa},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xbc03, (short) 0xbbfa}, {(short) 0xb803, (short) 0xb7fa},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xf404, (short) 0xf3fc},
+          {(short) 0xf403, (short) 0xf3fa}, {(short) 0x8103, (short) 0x8000},
+          {(short) 0xbf1f, (short) 0xbf19}, {(short) 0xb8ef, (short) 0xb8e9},
+          {(short) 0xa61b, (short) 0xa615}, {(short) 0x9cc1, (short) 0x9cbb},
+          {(short) 0x8b31, (short) 0x8b2b}, {(short) 0x811b, (short) 0x8000},
+          {(short) 0x3bfa, (short) 0x3c03}, {(short) 0x37fa, (short) 0x3803},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x73fc, (short) 0x7404},
+          {(short) 0x73fa, (short) 0x7403}, {(short) 0x0000, (short) 0x0103},
+          {(short) 0x3f19, (short) 0x3f1f}, {(short) 0x38e9, (short) 0x38ef},
+          {(short) 0x2615, (short) 0x261b}, {(short) 0x1cbb, (short) 0x1cc1},
+          {(short) 0x0b2b, (short) 0x0b31}, {(short) 0x0000, (short) 0x011b},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xc003, (short) 0xbffa}, {(short) 0xbc03, (short) 0xbbfa},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xf804, (short) 0xf7fc},
+          {(short) 0xf803, (short) 0xf7fa}, {(short) 0x8203, (short) 0x8000},
+          {(short) 0xc31f, (short) 0xc319}, {(short) 0xbcef, (short) 0xbce9},
+          {(short) 0xaa1b, (short) 0xaa15}, {(short) 0xa0c1, (short) 0xa0bb},
+          {(short) 0x8f31, (short) 0x8f2b}, {(short) 0x8232, (short) 0x8000},
+          {(short) 0x3ffa, (short) 0x4003}, {(short) 0x3bfa, (short) 0x3c03},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x77fc, (short) 0x7804},
+          {(short) 0x77fa, (short) 0x7803}, {(short) 0x0000, (short) 0x0203},
+          {(short) 0x4319, (short) 0x431f}, {(short) 0x3ce9, (short) 0x3cef},
+          {(short) 0x2a15, (short) 0x2a1b}, {(short) 0x20bb, (short) 0x20c1},
+          {(short) 0x0f2b, (short) 0x0f31}, {(short) 0x0000, (short) 0x0232},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x8004, (short) 0x0002}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xbc03, (short) 0xbbfa}, {(short) 0x9404, (short) 0x93fc},
+          {(short) 0x9403, (short) 0x93fa}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8005, (short) 0x0001}, {(short) 0x8004, (short) 0x0002},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8002, (short) 0x0004}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x3bfa, (short) 0x3c03}, {(short) 0x13fc, (short) 0x1404},
+          {(short) 0x13fa, (short) 0x1403}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8001, (short) 0x0005}, {(short) 0x8002, (short) 0x0004},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x8402, (short) 0x8000}, {(short) 0x8203, (short) 0x8000},
+          {(short) 0xe400, (short) 0xe3fb}, {(short) 0xbc03, (short) 0xbbfa},
+          {(short) 0xbc00, (short) 0xbbfb}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x871e, (short) 0x8718}, {(short) 0x8279, (short) 0x8000},
+          {(short) 0x801b, (short) 0x8000}, {(short) 0x8008, (short) 0x8000},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x0000, (short) 0x0402}, {(short) 0x0000, (short) 0x0203},
+          {(short) 0x63fb, (short) 0x6400}, {(short) 0x3bfa, (short) 0x3c03},
+          {(short) 0x3bfb, (short) 0x3c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x0718, (short) 0x071e}, {(short) 0x0000, (short) 0x0279},
+          {(short) 0x0000, (short) 0x001b}, {(short) 0x0000, (short) 0x0008},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x8403, (short) 0x8000}, {(short) 0x8203, (short) 0x8000},
+          {(short) 0xe403, (short) 0xe3fa}, {(short) 0xbc04, (short) 0xbbfc},
+          {(short) 0xbc03, (short) 0xbbfa}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x871f, (short) 0x8719}, {(short) 0x8279, (short) 0x8000},
+          {(short) 0x801b, (short) 0x8000}, {(short) 0x8008, (short) 0x8000},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x0000, (short) 0x0403}, {(short) 0x0000, (short) 0x0203},
+          {(short) 0x63fa, (short) 0x6403}, {(short) 0x3bfc, (short) 0x3c04},
+          {(short) 0x3bfa, (short) 0x3c03}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x0719, (short) 0x071f}, {(short) 0x0000, (short) 0x0279},
+          {(short) 0x0000, (short) 0x001b}, {(short) 0x0000, (short) 0x0008},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xfc00, (short) 0xfbfc}, {(short) 0xf801, (short) 0xf7fc},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xbc03, (short) 0xbbfa},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xf8ef, (short) 0xf8e9},
+          {(short) 0xe61b, (short) 0xe615}, {(short) 0xdcc0, (short) 0xdcba},
+          {(short) 0xcb30, (short) 0xcb2a}, {(short) 0xbc61, (short) 0xbc5b},
+          {(short) 0x7bfc, (short) 0x7c00}, {(short) 0x77fc, (short) 0x7801},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x3bfa, (short) 0x3c03},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x78e9, (short) 0x78ef},
+          {(short) 0x6615, (short) 0x661b}, {(short) 0x5cba, (short) 0x5cc0},
+          {(short) 0x4b2a, (short) 0x4b30}, {(short) 0x3c5b, (short) 0x3c61},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xb883, (short) 0xb87d}, {(short) 0xb483, (short) 0xb47d},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xf084, (short) 0xf07e},
+          {(short) 0xf083, (short) 0xf07d}, {(short) 0x8093, (short) 0x8000},
+          {(short) 0xbc03, (short) 0xbbfa}, {(short) 0xb58d, (short) 0xb587},
+          {(short) 0xa2de, (short) 0xa2d8}, {(short) 0x9958, (short) 0x9952},
+          {(short) 0x880d, (short) 0x8807}, {(short) 0x80a0, (short) 0x8000},
+          {(short) 0x387d, (short) 0x3883}, {(short) 0x347d, (short) 0x3483},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x707e, (short) 0x7084},
+          {(short) 0x707d, (short) 0x7083}, {(short) 0x0000, (short) 0x0093},
+          {(short) 0x3bfa, (short) 0x3c03}, {(short) 0x3587, (short) 0x358d},
+          {(short) 0x22d8, (short) 0x22de}, {(short) 0x1952, (short) 0x1958},
+          {(short) 0x0807, (short) 0x080d}, {(short) 0x0000, (short) 0x00a0},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xbe83, (short) 0xbe7d}, {(short) 0xba83, (short) 0xba7d},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xf685, (short) 0xf67f},
+          {(short) 0xf683, (short) 0xf67d}, {(short) 0x81a3, (short) 0x8000},
+          {(short) 0xc1ca, (short) 0xc1c4}, {(short) 0xbc03, (short) 0xbbfa},
+          {(short) 0xa8f7, (short) 0xa8f1}, {(short) 0x9fb7, (short) 0x9fb1},
+          {(short) 0x8dd8, (short) 0x8dd2}, {(short) 0x81c9, (short) 0x8000},
+          {(short) 0x3e7d, (short) 0x3e83}, {(short) 0x3a7d, (short) 0x3a83},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x767f, (short) 0x7685},
+          {(short) 0x767d, (short) 0x7683}, {(short) 0x0000, (short) 0x01a3},
+          {(short) 0x41c4, (short) 0x41ca}, {(short) 0x3bfa, (short) 0x3c03},
+          {(short) 0x28f1, (short) 0x28f7}, {(short) 0x1fb1, (short) 0x1fb7},
+          {(short) 0x0dd2, (short) 0x0dd8}, {(short) 0x0000, (short) 0x01c9},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xd143, (short) 0xd13d}, {(short) 0xcd43, (short) 0xcd3d},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x9144, (short) 0x913e},
+          {(short) 0xd4ae, (short) 0xd4a8}, {(short) 0xce79, (short) 0xce73},
+          {(short) 0xbc03, (short) 0xbbfa}, {(short) 0xb23c, (short) 0xb236},
+          {(short) 0xa0b9, (short) 0xa0b3}, {(short) 0x91bf, (short) 0x91b9},
+          {(short) 0x513d, (short) 0x5143}, {(short) 0x4d3d, (short) 0x4d43},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x113e, (short) 0x1144},
+          {(short) 0x54a8, (short) 0x54ae}, {(short) 0x4e73, (short) 0x4e79},
+          {(short) 0x3bfa, (short) 0x3c03}, {(short) 0x3236, (short) 0x323c},
+          {(short) 0x20b3, (short) 0x20b9}, {(short) 0x11b9, (short) 0x11bf},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xdac3, (short) 0xdabd}, {(short) 0xd6c3, (short) 0xd6bd},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x9ac4, (short) 0x9abe},
+          {(short) 0xde03, (short) 0xddfd}, {(short) 0xd82a, (short) 0xd824},
+          {(short) 0xc528, (short) 0xc522}, {(short) 0xbc03, (short) 0xbbfa},
+          {(short) 0xaa12, (short) 0xaa0c}, {(short) 0x9b62, (short) 0x9b5c},
+          {(short) 0x5abd, (short) 0x5ac3}, {(short) 0x56bd, (short) 0x56c3},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x1abe, (short) 0x1ac4},
+          {(short) 0x5dfd, (short) 0x5e03}, {(short) 0x5824, (short) 0x582a},
+          {(short) 0x4522, (short) 0x4528}, {(short) 0x3bfa, (short) 0x3c03},
+          {(short) 0x2a0c, (short) 0x2a12}, {(short) 0x1b5c, (short) 0x1b62},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xec78, (short) 0xec72}, {(short) 0xe878, (short) 0xe872},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xac79, (short) 0xac73},
+          {(short) 0xefef, (short) 0xefe9}, {(short) 0xe97f, (short) 0xe979},
+          {(short) 0xd6ce, (short) 0xd6c8}, {(short) 0xcd4b, (short) 0xcd45},
+          {(short) 0xbc03, (short) 0xbbfa}, {(short) 0xace1, (short) 0xacdb},
+          {(short) 0x6c72, (short) 0x6c78}, {(short) 0x6872, (short) 0x6878},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x2c73, (short) 0x2c79},
+          {(short) 0x6fe9, (short) 0x6fef}, {(short) 0x6979, (short) 0x697f},
+          {(short) 0x56c8, (short) 0x56ce}, {(short) 0x4d45, (short) 0x4d4b},
+          {(short) 0x3bfa, (short) 0x3c03}, {(short) 0x2cdb, (short) 0x2ce1},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xfb56, (short) 0xfb50}, {(short) 0xf756, (short) 0xf750},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xbb57, (short) 0xbb51},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xf885, (short) 0xf87f},
+          {(short) 0xe598, (short) 0xe592}, {(short) 0xdc5a, (short) 0xdc54},
+          {(short) 0xca96, (short) 0xca90}, {(short) 0xbc03, (short) 0xbbfa},
+          {(short) 0x7b50, (short) 0x7b56}, {(short) 0x7750, (short) 0x7756},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x3b51, (short) 0x3b57},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x787f, (short) 0x7885},
+          {(short) 0x6592, (short) 0x6598}, {(short) 0x5c54, (short) 0x5c5a},
+          {(short) 0x4a90, (short) 0x4a96}, {(short) 0x3bfa, (short) 0x3c03},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xfe00, (short) 0xfe00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xfe00, (short) 0xfe00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0xfe00, (short) 0xfe00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfe00, (short) 0xfe00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x8003, (short) 0x0003}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xfe00, (short) 0xfe00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0xfe00, (short) 0xfe00}, {(short) 0x8003, (short) 0x0003},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfc00, (short) 0xfc00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0x7c00, (short) 0x7c00},
+          {(short) 0xfc00, (short) 0xfc00}, {(short) 0xfe00, (short) 0xfe00},
+          {(short) 0x7c00, (short) 0x7c00}, {(short) 0xfe00, (short) 0xfe00},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+      {
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01}, {(short) 0x7e01, (short) 0x7e01},
+          {(short) 0x7e01, (short) 0x7e01},
+      },
+  };
+}
\ No newline at end of file
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java
index b90633e..38831f4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java
@@ -475,8 +475,8 @@
         s.invoke_verify_foo();
         s.invoke_foreach_test();
         mRS.finish();
-        checkForErrors();
         waitForMessage();
+        checkForErrors();
     }
 
     public void testNoRoot() {
@@ -494,7 +494,7 @@
         s.invoke_verify_foo();
         s.invoke_noroot_test();
         mRS.finish();
-        checkForErrors();
         waitForMessage();
+        checkForErrors();
     }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/Intrinsic3DLut.java b/tests/tests/renderscript/src/android/renderscript/cts/Intrinsic3DLut.java
index 87a03ad..4ec84ad 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/Intrinsic3DLut.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/Intrinsic3DLut.java
@@ -136,5 +136,12 @@
         checkError();
     }
 
+    public void test_ID() {
+        ScriptIntrinsic3DLUT s = ScriptIntrinsic3DLUT.create(mRS, Element.U8_4(mRS));
+        Script.KernelID kid = s.getKernelID();
+        if (kid == null) {
+            throw new IllegalStateException("kid must be valid");
+        }
+    }
 
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBLAS.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBLAS.java
new file mode 100644
index 0000000..17f546b
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBLAS.java
@@ -0,0 +1,6831 @@
+/*
+ * Copyright (C) 2015 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.renderscript.cts;
+
+import android.renderscript.*;
+import android.util.Log;
+import java.util.ArrayList;
+
+public class IntrinsicBLAS extends IntrinsicBase {
+    private ScriptIntrinsicBLAS mBLAS;
+    private BLASData mBLASData;
+    private boolean mInitialized = false;
+
+    private ArrayList<Allocation> mMatrixS;
+    private final float alphaS = 1.0f;
+    private final float betaS = 1.0f;
+
+    private ArrayList<Allocation> mMatrixD;
+    private final double alphaD = 1.0;
+    private final double betaD = 1.0;
+
+    private ArrayList<Allocation> mMatrixC;
+    private final Float2 alphaC = new Float2(1.0f, 0.0f);
+    private final Float2 betaC = new Float2(1.0f, 0.0f);
+
+    private ArrayList<Allocation> mMatrixZ;
+    private final Double2 alphaZ = new Double2(1.0, 0.0);
+    private final Double2 betaZ = new Double2(1.0, 0.0);
+
+    private int[] mTranspose = {ScriptIntrinsicBLAS.NO_TRANSPOSE,
+                                ScriptIntrinsicBLAS.TRANSPOSE,
+                                ScriptIntrinsicBLAS.CONJ_TRANSPOSE,
+                                0};
+
+    private int[] mUplo = {ScriptIntrinsicBLAS.UPPER,
+                           ScriptIntrinsicBLAS.LOWER,
+                           0};
+
+    private int[] mDiag = {ScriptIntrinsicBLAS.NON_UNIT,
+                           ScriptIntrinsicBLAS.UNIT,
+                           0};
+
+    private int[] mSide = {ScriptIntrinsicBLAS.LEFT,
+                           ScriptIntrinsicBLAS.RIGHT,
+                           0};
+
+    private int[] mInc = {0, 1, 2};
+    private int[] mK = {-1, 0, 1};
+    private int[] mDim = {1, 2, 3, 256};
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        // Now populate the test Matrixes and Vectors.
+        if (!mInitialized) {
+            mBLASData = new BLASData();
+            mBLASData.loadData(mCtx);
+            mBLAS = ScriptIntrinsicBLAS.create(mRS);
+            mMatrixS = new ArrayList<Allocation>();
+            mMatrixD = new ArrayList<Allocation>();
+            mMatrixC = new ArrayList<Allocation>();
+            mMatrixZ = new ArrayList<Allocation>();
+            for (int x : mDim) {
+                for (int y : mDim) {
+                    mMatrixS.add(Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), x, y)));
+                    mMatrixD.add(Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), x, y)));
+                    mMatrixC.add(Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), x, y)));
+                    mMatrixZ.add(Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), x, y)));
+                }
+            }
+            // Also need Allocation with mismatch Element.
+            Allocation misAlloc = Allocation.createTyped(mRS, Type.createXY(mRS, Element.U8(mRS), 1, 1));
+            mMatrixS.add(misAlloc);
+            mMatrixD.add(misAlloc);
+            mMatrixC.add(misAlloc);
+            mMatrixZ.add(misAlloc);
+            mInitialized = true;
+        }
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    // Calculate the square of the L2 norm of a matrix.
+    private double calcL2Norm(float[] input) {
+        double l2Norm = 0;
+        for (int i = 0; i < input.length; ++i) {
+            l2Norm += input[i] * input[i];
+        }
+        return l2Norm;
+    }
+
+    private double calcL2Norm(double[] input) {
+        double l2Norm = 0;
+        for (int i = 0; i < input.length; ++i) {
+            l2Norm += input[i] * input[i];
+        }
+        return l2Norm;
+    }
+
+    // Routine to verify if matrix are equivalent.
+    private void verifyMatrix(Allocation ref, Allocation out) {
+        verifyMatrix(ref, out, false);
+    }
+
+    // Use L2 norm of a matrix as the scale to determine whether two matrices are equivalent:
+    // if the absolute square error of any elements is smaller than the average L2 Norm
+    // per element times an allowed error range (1e-6), then the two matrices are considered equivalent.
+    // Criterion: (a[i,j] - a'[i,j])^2 < epsilon * ||A||/(M*N)
+    // M, N: the dimensions of the matrix; epsilon: allowed relative error.
+    private void verifyMatrix(Allocation ref, Allocation out, boolean isUpperMatrix) {
+        double l2Norm;
+        int size;
+        Element e = ref.getType().getElement();
+        if (e.isCompatible(Element.F32(mRS)) || e.isCompatible(Element.F32_2(mRS))) {
+            size = out.getBytesSize() / 4;
+            float[] outArr = new float[size];
+            float[] refArr = new float[size];
+            out.copyTo(outArr);
+            ref.copyTo(refArr);
+
+            double l2NormOut = calcL2Norm(outArr);
+            double l2NormRef = calcL2Norm(refArr);
+            l2Norm = (l2NormOut < l2NormRef ? l2NormOut : l2NormRef) / size;
+        } else {
+            size = out.getBytesSize() / 8;
+            double[] outArr = new double[size];
+            double[] refArr = new double[size];
+            out.copyTo(outArr);
+            ref.copyTo(refArr);
+
+            double l2NormOut = calcL2Norm(outArr);
+            double l2NormRef = calcL2Norm(refArr);
+            l2Norm = (l2NormOut < l2NormRef ? l2NormOut : l2NormRef) / size;
+        }
+        mVerify.invoke_verifyMatrix(ref, out, l2Norm, isUpperMatrix);
+    }
+
+
+    private boolean validateSide(int Side) {
+        if (Side != ScriptIntrinsicBLAS.LEFT && Side != ScriptIntrinsicBLAS.RIGHT) {
+            return false;
+        }
+        return true;
+    }
+
+    private boolean validateTranspose(int Trans) {
+        if (Trans != ScriptIntrinsicBLAS.NO_TRANSPOSE &&
+            Trans != ScriptIntrinsicBLAS.TRANSPOSE &&
+            Trans != ScriptIntrinsicBLAS.CONJ_TRANSPOSE) {
+            return false;
+        }
+        return true;
+    }
+
+    private boolean validateConjTranspose(int Trans) {
+        if (Trans != ScriptIntrinsicBLAS.NO_TRANSPOSE &&
+            Trans != ScriptIntrinsicBLAS.CONJ_TRANSPOSE) {
+            return false;
+        }
+        return true;
+    }
+
+    private boolean validateDiag(int Diag) {
+        if (Diag != ScriptIntrinsicBLAS.NON_UNIT &&
+            Diag != ScriptIntrinsicBLAS.UNIT) {
+            return false;
+        }
+        return true;
+    }
+
+    private boolean validateUplo(int Uplo) {
+        if (Uplo != ScriptIntrinsicBLAS.UPPER &&
+            Uplo != ScriptIntrinsicBLAS.LOWER) {
+            return false;
+        }
+        return true;
+    }
+
+    private boolean validateVecInput(Allocation X) {
+        if (X.getType().getY() > 2) {
+            // For testing vector, need a mismatch Y for complete test coverage.
+            return false;
+        }
+        return true;
+    }
+
+    private boolean validateGEMV(Element e, int TransA, Allocation A, Allocation X, int incX, Allocation Y, int incY) {
+        if (!validateTranspose(TransA)) {
+            return false;
+        }
+        int M = A.getType().getY();
+        int N = A.getType().getX();
+        if (!A.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e) ||
+            !Y.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
+            return false;
+        }
+
+        if (incX <= 0 || incY <= 0) {
+            return false;
+        }
+        int expectedXDim = -1, expectedYDim = -1;
+        if (TransA == ScriptIntrinsicBLAS.NO_TRANSPOSE) {
+            expectedXDim = 1 + (N - 1) * incX;
+            expectedYDim = 1 + (M - 1) * incY;
+        } else {
+            expectedXDim = 1 + (M - 1) * incX;
+            expectedYDim = 1 + (N - 1) * incY;
+        }
+        if (X.getType().getX() != expectedXDim ||
+            Y.getType().getX() != expectedYDim) {
+            return false;
+        }
+        return true;
+    }
+
+    private void xGEMV_API_test(int trans, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateGEMV(elemA, trans, matA, vecX, incX, vecY, incY)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SGEMV(trans, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DGEMV(trans, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CGEMV(trans, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZGEMV(trans, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SGEMV(trans, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            fail("should throw RSRuntimeException for SGEMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DGEMV(trans, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            fail("should throw RSRuntimeException for DGEMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.CGEMV(trans, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            fail("should throw RSRuntimeException for CGEMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZGEMV(trans, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            fail("should throw RSRuntimeException for ZGEMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xGEMV_API(ArrayList<Allocation> mMatrix) {
+        for (int trans : mTranspose) {
+            for (int incX : mInc) {
+                xGEMV_API_test(trans, incX, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_SGEMV_API() {
+        L2_xGEMV_API(mMatrixS);
+    }
+
+    public void test_L2_DGEMV_API() {
+        L2_xGEMV_API(mMatrixD);
+    }
+
+    public void test_L2_CGEMV_API() {
+        L2_xGEMV_API(mMatrixC);
+    }
+
+    public void test_L2_ZGEMV_API() {
+        L2_xGEMV_API(mMatrixZ);
+    }
+
+    public void test_L2_SGEMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        Allocation vectorYS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dM, 1));
+        matrixAS.copyFrom(mBLASData.L2_sGEMV_A_mn);
+        vectorXS.copyFrom(mBLASData.L2_sGEMV_x_n1);
+        vectorYS.copyFrom(mBLASData.L2_sGEMV_y_m1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.SGEMV(trans, alphaS, matrixAS, vectorXS, incX, betaS, vectorYS, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dM, 1));
+        vectorYRef.copyFrom(mBLASData.L2_sGEMV_o_N);
+        verifyMatrix(vectorYRef, vectorYS);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector Y, since it was overwritten by BLAS.
+        vectorYS.copyFrom(mBLASData.L2_sGEMV_y_m1);
+        // After Transpose matrixA, vectorX and vectorY are exchanged to match the dim of A.T
+        mBLAS.SGEMV(trans, alphaS, matrixAS, vectorYS, incY, betaS, vectorXS, incX);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        vectorYRef.copyFrom(mBLASData.L2_sGEMV_o_T);
+        verifyMatrix(vectorYRef, vectorXS);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXS.copyFrom(mBLASData.L2_sGEMV_x_n1);
+        mBLAS.SGEMV(trans, alphaS, matrixAS, vectorYS, incY, betaS, vectorXS, incX);
+        vectorYRef.copyFrom(mBLASData.L2_sGEMV_o_H);
+        verifyMatrix(vectorYRef, vectorXS);
+
+        // Test for incX = 2 & incY = 3;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dM - 1) * incY;
+        vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorYS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimY, 1));
+        vectorXS.copyFrom(mBLASData.L2_sGEMV_x_n2);
+        vectorYS.copyFrom(mBLASData.L2_sGEMV_y_m2);
+
+        mBLAS.SGEMV(trans, alphaS, matrixAS, vectorXS, incX, betaS, vectorYS, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_sGEMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYS);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_DGEMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        Allocation vectorYD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dM, 1));
+        matrixAD.copyFrom(mBLASData.L2_dGEMV_A_mn);
+        vectorXD.copyFrom(mBLASData.L2_dGEMV_x_n1);
+        vectorYD.copyFrom(mBLASData.L2_dGEMV_y_m1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.DGEMV(trans, alphaD, matrixAD, vectorXD, incX, betaD, vectorYD, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dM, 1));
+        vectorYRef.copyFrom(mBLASData.L2_dGEMV_o_N);
+        verifyMatrix(vectorYRef, vectorYD);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector Y, since it was overwritten by BLAS.
+        vectorYD.copyFrom(mBLASData.L2_dGEMV_y_m1);
+        // After Transpose matrixA, vectorX and vectorY are exchanged to match the dim of A.T
+        mBLAS.DGEMV(trans, alphaD, matrixAD, vectorYD, incY, betaD, vectorXD, incX);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        vectorYRef.copyFrom(mBLASData.L2_dGEMV_o_T);
+        verifyMatrix(vectorYRef, vectorXD);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXD.copyFrom(mBLASData.L2_dGEMV_x_n1);
+        mBLAS.DGEMV(trans, alphaD, matrixAD, vectorYD, incY, betaD, vectorXD, incX);
+        vectorYRef.copyFrom(mBLASData.L2_dGEMV_o_H);
+        verifyMatrix(vectorYRef, vectorXD);
+
+        // Test for incX = 2 & incY = 3;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dM - 1) * incY;
+        vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorYD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimY, 1));
+        vectorXD.copyFrom(mBLASData.L2_dGEMV_x_n2);
+        vectorYD.copyFrom(mBLASData.L2_dGEMV_y_m2);
+
+        mBLAS.DGEMV(trans, alphaD, matrixAD, vectorXD, incX, betaD, vectorYD, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_dGEMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYD);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_CGEMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        Allocation vectorYC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dM, 1));
+        matrixAC.copyFrom(mBLASData.L2_cGEMV_A_mn);
+        vectorXC.copyFrom(mBLASData.L2_cGEMV_x_n1);
+        vectorYC.copyFrom(mBLASData.L2_cGEMV_y_m1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.CGEMV(trans, alphaC, matrixAC, vectorXC, incX, betaC, vectorYC, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dM, 1));
+        vectorYRef.copyFrom(mBLASData.L2_cGEMV_o_N);
+        verifyMatrix(vectorYRef, vectorYC);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector Y, since it was overwritten by BLAS.
+        vectorYC.copyFrom(mBLASData.L2_cGEMV_y_m1);
+        // After Transpose matrixA, vectorX and vectorY are exchanged to match the dim of A.T
+        mBLAS.CGEMV(trans, alphaC, matrixAC, vectorYC, incY, betaC, vectorXC, incX);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        vectorYRef.copyFrom(mBLASData.L2_cGEMV_o_T);
+        verifyMatrix(vectorYRef, vectorXC);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXC.copyFrom(mBLASData.L2_cGEMV_x_n1);
+        mBLAS.CGEMV(trans, alphaC, matrixAC, vectorYC, incY, betaC, vectorXC, incX);
+        vectorYRef.copyFrom(mBLASData.L2_cGEMV_o_H);
+        verifyMatrix(vectorYRef, vectorXC);
+
+        // Test for incX = 2 & incY = 3;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dM - 1) * incY;
+        vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorYC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimY, 1));
+        vectorXC.copyFrom(mBLASData.L2_cGEMV_x_n2);
+        vectorYC.copyFrom(mBLASData.L2_cGEMV_y_m2);
+
+        mBLAS.CGEMV(trans, alphaC, matrixAC, vectorXC, incX, betaC, vectorYC, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_cGEMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYC);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_ZGEMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        Allocation vectorYZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dM, 1));
+        matrixAZ.copyFrom(mBLASData.L2_zGEMV_A_mn);
+        vectorXZ.copyFrom(mBLASData.L2_zGEMV_x_n1);
+        vectorYZ.copyFrom(mBLASData.L2_zGEMV_y_m1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.ZGEMV(trans, alphaZ, matrixAZ, vectorXZ, incX, betaZ, vectorYZ, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dM, 1));
+        vectorYRef.copyFrom(mBLASData.L2_zGEMV_o_N);
+        verifyMatrix(vectorYRef, vectorYZ);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector Y, since it was overwritten by BLAS.
+        vectorYZ.copyFrom(mBLASData.L2_zGEMV_y_m1);
+        // After Transpose matrixA, vectorX and vectorY are exchanged to match the dim of A.T
+        mBLAS.ZGEMV(trans, alphaZ, matrixAZ, vectorYZ, incY, betaZ, vectorXZ, incX);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        vectorYRef.copyFrom(mBLASData.L2_zGEMV_o_T);
+        verifyMatrix(vectorYRef, vectorXZ);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXZ.copyFrom(mBLASData.L2_zGEMV_x_n1);
+        mBLAS.ZGEMV(trans, alphaZ, matrixAZ, vectorYZ, incY, betaZ, vectorXZ, incX);
+        vectorYRef.copyFrom(mBLASData.L2_zGEMV_o_H);
+        verifyMatrix(vectorYRef, vectorXZ);
+
+        // Test for incX = 2 & incY = 3;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dM - 1) * incY;
+        vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorYZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimY, 1));
+        vectorXZ.copyFrom(mBLASData.L2_zGEMV_x_n2);
+        vectorYZ.copyFrom(mBLASData.L2_zGEMV_y_m2);
+
+        mBLAS.ZGEMV(trans, alphaZ, matrixAZ, vectorXZ, incX, betaZ, vectorYZ, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_zGEMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYZ);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+
+    private void xGBMV_API_test(int trans, int KL, int KU, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateGEMV(elemA, trans, matA, vecX, incX, vecY, incY) && KU >= 0 && KL >= 0) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SGBMV(trans, KL, KU, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DGBMV(trans, KL, KU, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CGBMV(trans, KL, KU, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZGBMV(trans, KL, KU, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SGBMV(trans, KL, KU, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            fail("should throw RSRuntimeException for SGBMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DGBMV(trans, KL, KU, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            fail("should throw RSRuntimeException for DGBMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.CGBMV(trans, KL, KU, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            fail("should throw RSRuntimeException for CGBMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZGBMV(trans, KL, KU, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            fail("should throw RSRuntimeException for ZGBMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xGBMV_API(ArrayList<Allocation> mMatrix) {
+        for (int trans : mTranspose) {
+            for (int incX : mInc) {
+                for (int K : mK) {
+                    xGBMV_API_test(trans, K, K, incX, incX, mMatrix);
+                }
+            }
+        }
+    }
+
+    public void test_L2_SGBMV_API() {
+        L2_xGBMV_API(mMatrixS);
+    }
+
+    public void test_L2_DGBMV_API() {
+        L2_xGBMV_API(mMatrixD);
+    }
+
+    public void test_L2_CGBMV_API() {
+        L2_xGBMV_API(mMatrixC);
+    }
+
+    public void test_L2_ZGBMV_API() {
+        L2_xGBMV_API(mMatrixZ);
+    }
+
+    public void test_L2_SGBMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        Allocation vectorYS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dM, 1));
+        matrixAS.copy2DRangeFrom(0, 0, mBLASData.KL + mBLASData.KU + 1, mBLASData.dM, mBLASData.L2_sGBMV_A_mn);
+        vectorXS.copyFrom(mBLASData.L2_sGBMV_x_n1);
+        vectorYS.copyFrom(mBLASData.L2_sGBMV_y_m1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.SGBMV(trans, mBLASData.KL, mBLASData.KU, alphaS, matrixAS, vectorXS, incX, betaS, vectorYS, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dM, 1));
+        vectorYRef.copyFrom(mBLASData.L2_sGBMV_o_N);
+        verifyMatrix(vectorYRef, vectorYS);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector Y, since it was overwritten by BLAS.
+        vectorYS.copyFrom(mBLASData.L2_sGBMV_y_m1);
+        // After Transpose matrixA, vectorX and vectorY are exchanged to match the dim of A.T
+        mBLAS.SGBMV(trans, mBLASData.KL, mBLASData.KU, alphaS, matrixAS, vectorYS, incY, betaS, vectorXS, incX);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        vectorYRef.copyFrom(mBLASData.L2_sGBMV_o_T);
+        verifyMatrix(vectorYRef, vectorXS);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXS.copyFrom(mBLASData.L2_sGBMV_x_n1);
+        mBLAS.SGBMV(trans, mBLASData.KL, mBLASData.KU, alphaS, matrixAS, vectorYS, incY, betaS, vectorXS, incX);
+        vectorYRef.copyFrom(mBLASData.L2_sGBMV_o_H);
+        verifyMatrix(vectorYRef, vectorXS);
+
+        // Test for incX = 2 & incY = 3;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dM - 1) * incY;
+        vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorYS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimY, 1));
+        vectorXS.copyFrom(mBLASData.L2_sGBMV_x_n2);
+        vectorYS.copyFrom(mBLASData.L2_sGBMV_y_m2);
+
+        mBLAS.SGBMV(trans, mBLASData.KL, mBLASData.KU, alphaS, matrixAS, vectorXS, incX, betaS, vectorYS, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_sGBMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYS);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_DGBMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        Allocation vectorYD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dM, 1));
+        matrixAD.copy2DRangeFrom(0, 0, mBLASData.KL + mBLASData.KU + 1, mBLASData.dM, mBLASData.L2_dGBMV_A_mn);
+        vectorXD.copyFrom(mBLASData.L2_dGBMV_x_n1);
+        vectorYD.copyFrom(mBLASData.L2_dGBMV_y_m1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.DGBMV(trans, mBLASData.KL, mBLASData.KU, alphaD, matrixAD, vectorXD, incX, betaD, vectorYD, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dM, 1));
+        vectorYRef.copyFrom(mBLASData.L2_dGBMV_o_N);
+        verifyMatrix(vectorYRef, vectorYD);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector Y, since it was overwritten by BLAS.
+        vectorYD.copyFrom(mBLASData.L2_dGBMV_y_m1);
+        // After Transpose matrixA, vectorX and vectorY are exchanged to match the dim of A.T
+        mBLAS.DGBMV(trans, mBLASData.KL, mBLASData.KU, alphaD, matrixAD, vectorYD, incY, betaD, vectorXD, incX);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        vectorYRef.copyFrom(mBLASData.L2_dGBMV_o_T);
+        verifyMatrix(vectorYRef, vectorXD);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXD.copyFrom(mBLASData.L2_dGBMV_x_n1);
+        mBLAS.DGBMV(trans, mBLASData.KL, mBLASData.KU, alphaD, matrixAD, vectorYD, incY, betaD, vectorXD, incX);
+        vectorYRef.copyFrom(mBLASData.L2_dGBMV_o_H);
+        verifyMatrix(vectorYRef, vectorXD);
+
+        // Test for incX = 2 & incY = 3;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dM - 1) * incY;
+        vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorYD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimY, 1));
+        vectorXD.copyFrom(mBLASData.L2_dGBMV_x_n2);
+        vectorYD.copyFrom(mBLASData.L2_dGBMV_y_m2);
+
+        mBLAS.DGBMV(trans, mBLASData.KL, mBLASData.KU, alphaD, matrixAD, vectorXD, incX, betaD, vectorYD, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_dGBMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYD);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_CGBMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        Allocation vectorYC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dM, 1));
+        matrixAC.copy2DRangeFrom(0, 0, mBLASData.KL + mBLASData.KU + 1, mBLASData.dM, mBLASData.L2_cGBMV_A_mn);
+        vectorXC.copyFrom(mBLASData.L2_cGBMV_x_n1);
+        vectorYC.copyFrom(mBLASData.L2_cGBMV_y_m1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.CGBMV(trans, mBLASData.KL, mBLASData.KU, alphaC, matrixAC, vectorXC, incX, betaC, vectorYC, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dM, 1));
+        vectorYRef.copyFrom(mBLASData.L2_cGBMV_o_N);
+        verifyMatrix(vectorYRef, vectorYC);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector Y, since it was overwritten by BLAS.
+        vectorYC.copyFrom(mBLASData.L2_cGBMV_y_m1);
+        // After Transpose matrixA, vectorX and vectorY are exchanged to match the dim of A.T
+        mBLAS.CGBMV(trans, mBLASData.KL, mBLASData.KU, alphaC, matrixAC, vectorYC, incY, betaC, vectorXC, incX);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        vectorYRef.copyFrom(mBLASData.L2_cGBMV_o_T);
+        verifyMatrix(vectorYRef, vectorXC);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXC.copyFrom(mBLASData.L2_cGBMV_x_n1);
+        mBLAS.CGBMV(trans, mBLASData.KL, mBLASData.KU, alphaC, matrixAC, vectorYC, incY, betaC, vectorXC, incX);
+        vectorYRef.copyFrom(mBLASData.L2_cGBMV_o_H);
+        verifyMatrix(vectorYRef, vectorXC);
+
+        // Test for incX = 2 & incY = 3;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dM - 1) * incY;
+        vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorYC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimY, 1));
+        vectorXC.copyFrom(mBLASData.L2_cGBMV_x_n2);
+        vectorYC.copyFrom(mBLASData.L2_cGBMV_y_m2);
+
+        mBLAS.CGBMV(trans, mBLASData.KL, mBLASData.KU, alphaC, matrixAC, vectorXC, incX, betaC, vectorYC, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_cGBMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYC);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_ZGBMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        Allocation vectorYZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dM, 1));
+        matrixAZ.copy2DRangeFrom(0, 0, mBLASData.KL + mBLASData.KU + 1, mBLASData.dM, mBLASData.L2_zGBMV_A_mn);
+        vectorXZ.copyFrom(mBLASData.L2_zGBMV_x_n1);
+        vectorYZ.copyFrom(mBLASData.L2_zGBMV_y_m1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.ZGBMV(trans, mBLASData.KL, mBLASData.KU, alphaZ, matrixAZ, vectorXZ, incX, betaZ, vectorYZ, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dM, 1));
+        vectorYRef.copyFrom(mBLASData.L2_zGBMV_o_N);
+        verifyMatrix(vectorYRef, vectorYZ);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector Y, since it was overwritten by BLAS.
+        vectorYZ.copyFrom(mBLASData.L2_zGBMV_y_m1);
+        // After Transpose matrixA, vectorX and vectorY are exchanged to match the dim of A.T
+        mBLAS.ZGBMV(trans, mBLASData.KL, mBLASData.KU, alphaZ, matrixAZ, vectorYZ, incY, betaZ, vectorXZ, incX);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        vectorYRef.copyFrom(mBLASData.L2_zGBMV_o_T);
+        verifyMatrix(vectorYRef, vectorXZ);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXZ.copyFrom(mBLASData.L2_zGBMV_x_n1);
+        mBLAS.ZGBMV(trans, mBLASData.KL, mBLASData.KU, alphaZ, matrixAZ, vectorYZ, incX, betaZ, vectorXZ, incY);
+        vectorYRef.copyFrom(mBLASData.L2_zGBMV_o_H);
+        verifyMatrix(vectorYRef, vectorXZ);
+
+        // Test for incX = 2 & incY = 3;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dM - 1) * incY;
+        vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorYZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimY, 1));
+        vectorXZ.copyFrom(mBLASData.L2_zGBMV_x_n2);
+        vectorYZ.copyFrom(mBLASData.L2_zGBMV_y_m2);
+
+        mBLAS.ZGBMV(trans, mBLASData.KL, mBLASData.KU, alphaZ, matrixAZ, vectorXZ, incX, betaZ, vectorYZ, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_zGBMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYZ);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private void xHEMV_API_test(int Uplo, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSYR2(elemA, Uplo, vecX, incX, vecY, incY, matA)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CHEMV(Uplo, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZHEMV(Uplo, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.CHEMV(Uplo, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            fail("should throw RSRuntimeException for CHEMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZHEMV(Uplo, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            fail("should throw RSRuntimeException for ZHEMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xHEMV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xHEMV_API_test(Uplo, incX, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_CHEMV_API() {
+        L2_xHEMV_API(mMatrixC);
+    }
+
+    public void test_L2_ZHEMV_API() {
+        L2_xHEMV_API(mMatrixZ);
+    }
+
+    public void test_L2_CHEMV_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        Allocation vectorYC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        matrixAC.copyFrom(mBLASData.L2_cHEMV_A_nn);
+        vectorXC.copyFrom(mBLASData.L2_cHEMV_x_n1);
+        vectorYC.copyFrom(mBLASData.L2_cHEMV_y_n1);
+
+        // Test for the default case:
+        mBLAS.CHEMV(uplo, alphaC, matrixAC, vectorXC, incX, betaC, vectorYC, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        vectorYRef.copyFrom(mBLASData.L2_cHEMV_o_N);
+        verifyMatrix(vectorYRef, vectorYC);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dN - 1) * incY;
+        vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorYC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimY, 1));
+        vectorXC.copyFrom(mBLASData.L2_cHEMV_x_n2);
+        vectorYC.copyFrom(mBLASData.L2_cHEMV_y_n2);
+
+        mBLAS.CHEMV(uplo, alphaC, matrixAC, vectorXC, incX, betaC, vectorYC, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_cHEMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYC);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_ZHEMV_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        Allocation vectorYZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        matrixAZ.copyFrom(mBLASData.L2_zHEMV_A_nn);
+        vectorXZ.copyFrom(mBLASData.L2_zHEMV_x_n1);
+        vectorYZ.copyFrom(mBLASData.L2_zHEMV_y_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.ZHEMV(uplo, alphaZ, matrixAZ, vectorXZ, incX, betaZ, vectorYZ, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        vectorYRef.copyFrom(mBLASData.L2_zHEMV_o_N);
+        verifyMatrix(vectorYRef, vectorYZ);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dN - 1) * incY;
+        vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorYZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimY, 1));
+        vectorXZ.copyFrom(mBLASData.L2_zHEMV_x_n2);
+        vectorYZ.copyFrom(mBLASData.L2_zHEMV_y_n2);
+
+        mBLAS.ZHEMV(uplo, alphaZ, matrixAZ, vectorXZ, incX, betaZ, vectorYZ, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_zHEMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYZ);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+
+    private void xHBMV_API_test(int Uplo, int K, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSYR2(elemA, Uplo, vecX, incX, vecY, incY, matA) && K >= 0) {
+                        try {
+                            if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CHBMV(Uplo, K, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZHBMV(Uplo, K, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.CHBMV(Uplo, K, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            fail("should throw RSRuntimeException for CHBMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZHBMV(Uplo, K, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            fail("should throw RSRuntimeException for ZHBMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xHBMV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int K : mK) {
+                for (int incX : mInc) {
+                        xHBMV_API_test(Uplo, K, incX, incX, mMatrix);
+                }
+            }
+        }
+    }
+
+    public void test_L2_CHBMV_API() {
+        L2_xHBMV_API(mMatrixC);
+    }
+
+    public void test_L2_ZHBMV_API() {
+        L2_xHBMV_API(mMatrixZ);
+    }
+
+    public void test_L2_CHBMV_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        Allocation vectorYC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        matrixAC.copy2DRangeFrom(0, 0, mBLASData.KL + 1, mBLASData.dN, mBLASData.L2_cHBMV_A_nn);
+        vectorXC.copyFrom(mBLASData.L2_cHBMV_x_n1);
+        vectorYC.copyFrom(mBLASData.L2_cHBMV_y_n1);
+
+        // Test for the default case:
+        mBLAS.CHBMV(uplo, mBLASData.KL, alphaC, matrixAC, vectorXC, incX, betaC, vectorYC, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        vectorYRef.copyFrom(mBLASData.L2_cHBMV_o_N);
+        verifyMatrix(vectorYRef, vectorYC);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dN - 1) * incY;
+        vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorYC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimY, 1));
+        vectorXC.copyFrom(mBLASData.L2_cHBMV_x_n2);
+        vectorYC.copyFrom(mBLASData.L2_cHBMV_y_n2);
+
+        mBLAS.CHBMV(uplo, mBLASData.KL, alphaC, matrixAC, vectorXC, incX, betaC, vectorYC, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_cHBMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYC);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_ZHBMV_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        Allocation vectorYZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        matrixAZ.copy2DRangeFrom(0, 0, mBLASData.KL + 1, mBLASData.dN, mBLASData.L2_zHBMV_A_nn);
+        vectorXZ.copyFrom(mBLASData.L2_zHBMV_x_n1);
+        vectorYZ.copyFrom(mBLASData.L2_zHBMV_y_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.ZHBMV(uplo, mBLASData.KL, alphaZ, matrixAZ, vectorXZ, incX, betaZ, vectorYZ, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        vectorYRef.copyFrom(mBLASData.L2_zHBMV_o_N);
+        verifyMatrix(vectorYRef, vectorYZ);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dN - 1) * incY;
+        vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorYZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimY, 1));
+        vectorXZ.copyFrom(mBLASData.L2_zHBMV_x_n2);
+        vectorYZ.copyFrom(mBLASData.L2_zHBMV_y_n2);
+
+        mBLAS.ZHBMV(uplo, mBLASData.KL, alphaZ, matrixAZ, vectorXZ, incX, betaZ, vectorYZ, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_zHBMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYZ);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private void xHPMV_API_test(int Uplo, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSPR2(elemA, Uplo, vecX, incX, vecY, incY, matA)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CHPMV(Uplo, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZHPMV(Uplo, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.CHPMV(Uplo, alphaC, matA, vecX, incX, betaC, vecY, incY);
+                            fail("should throw RSRuntimeException for CHPMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZHPMV(Uplo, alphaZ, matA, vecX, incX, betaZ, vecY, incY);
+                            fail("should throw RSRuntimeException for ZHPMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xHPMV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xHPMV_API_test(Uplo, incX, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_CHPMV_API() {
+        L2_xHPMV_API(mMatrixC);
+    }
+
+    public void test_L2_ZHPMV_API() {
+        L2_xHPMV_API(mMatrixZ);
+    }
+
+    public void test_L2_CHPMV_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), N, 1));
+        Allocation vectorYC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), N, 1));
+        matrixAC.copyFrom(mBLASData.L2_cHEMV_A_nn_pu);
+        vectorXC.copyFrom(mBLASData.L2_cHEMV_x_n1);
+        vectorYC.copyFrom(mBLASData.L2_cHEMV_y_n1);
+
+        // Test for the default case:
+        mBLAS.CHPMV(uplo, alphaC, matrixAC, vectorXC, incX, betaC, vectorYC, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), N, 1));
+        vectorYRef.copyFrom(mBLASData.L2_cHEMV_o_N);
+        verifyMatrix(vectorYRef, vectorYC);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (N - 1) * incX;
+        int dimY = 1 + (N - 1) * incY;
+        vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorYC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimY, 1));
+        vectorXC.copyFrom(mBLASData.L2_cHEMV_x_n2);
+        vectorYC.copyFrom(mBLASData.L2_cHEMV_y_n2);
+
+        mBLAS.CHPMV(uplo, alphaC, matrixAC, vectorXC, incX, betaC, vectorYC, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_cHEMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYC);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_ZHPMV_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), N, 1));
+        Allocation vectorYZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), N, 1));
+        matrixAZ.copyFrom(mBLASData.L2_zHEMV_A_nn_pu);
+        vectorXZ.copyFrom(mBLASData.L2_zHEMV_x_n1);
+        vectorYZ.copyFrom(mBLASData.L2_zHEMV_y_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.ZHPMV(uplo, alphaZ, matrixAZ, vectorXZ, incX, betaZ, vectorYZ, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), N, 1));
+        vectorYRef.copyFrom(mBLASData.L2_zHEMV_o_N);
+        verifyMatrix(vectorYRef, vectorYZ);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (N - 1) * incX;
+        int dimY = 1 + (N - 1) * incY;
+        vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorYZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimY, 1));
+        vectorXZ.copyFrom(mBLASData.L2_zHEMV_x_n2);
+        vectorYZ.copyFrom(mBLASData.L2_zHEMV_y_n2);
+
+        mBLAS.ZHPMV(uplo, alphaZ, matrixAZ, vectorXZ, incX, betaZ, vectorYZ, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_zHEMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYZ);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private boolean validateSYMV(Element e, int Uplo, Allocation A, Allocation X, int incX, Allocation Y, int incY) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        int N = A.getType().getY();
+        if (A.getType().getX() != N) {
+            return false;
+        }
+        if (!A.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e) ||
+            !Y.getType().getElement().isCompatible(e) ) {
+            return false;
+        }
+        if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
+            return false;
+        }
+
+        if (incX <= 0 || incY <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (N - 1) * incX;
+        if (X.getType().getX() != expectedXDim) {
+            return false;
+        }
+        int expectedYDim = 1 + (N - 1) * incY;
+        if (Y.getType().getX() != expectedYDim) {
+            return false;
+        }
+        return true;
+    }
+
+    private void xSYMV_API_test(int Uplo, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSYMV(elemA, Uplo, matA, vecX, incX, vecY, incY)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SSYMV(Uplo, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DSYMV(Uplo, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SSYMV(Uplo, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            fail("should throw RSRuntimeException for SSYMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DSYMV(Uplo, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            fail("should throw RSRuntimeException for DSYMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xSYMV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xSYMV_API_test(Uplo, incX, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_SSYMV_API() {
+        L2_xSYMV_API(mMatrixS);
+    }
+
+    public void test_L2_DSYMV_API() {
+        L2_xSYMV_API(mMatrixD);
+    }
+
+    public void test_L2_SSYMV_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        Allocation vectorYS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        matrixAS.copyFrom(mBLASData.L2_sSYMV_A_nn);
+        vectorXS.copyFrom(mBLASData.L2_sSYMV_x_n1);
+        vectorYS.copyFrom(mBLASData.L2_sSYMV_y_n1);
+
+        // Test for the default case:
+        mBLAS.SSYMV(uplo, alphaS, matrixAS, vectorXS, incX, betaS, vectorYS, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        vectorYRef.copyFrom(mBLASData.L2_sSYMV_o_N);
+        verifyMatrix(vectorYRef, vectorYS);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dN - 1) * incY;
+        vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorYS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimY, 1));
+        vectorXS.copyFrom(mBLASData.L2_sSYMV_x_n2);
+        vectorYS.copyFrom(mBLASData.L2_sSYMV_y_n2);
+
+        mBLAS.SSYMV(uplo, alphaS, matrixAS, vectorXS, incX, betaS, vectorYS, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_sSYMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYS);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_DSYMV_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        Allocation vectorYD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        matrixAD.copyFrom(mBLASData.L2_dSYMV_A_nn);
+        vectorXD.copyFrom(mBLASData.L2_dSYMV_x_n1);
+        vectorYD.copyFrom(mBLASData.L2_dSYMV_y_n1);
+
+        // Test for the default case:
+        mBLAS.DSYMV(uplo, alphaD, matrixAD, vectorXD, incX, betaD, vectorYD, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        vectorYRef.copyFrom(mBLASData.L2_dSYMV_o_N);
+        verifyMatrix(vectorYRef, vectorYD);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dN - 1) * incY;
+        vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorYD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimY, 1));
+        vectorXD.copyFrom(mBLASData.L2_dSYMV_x_n2);
+        vectorYD.copyFrom(mBLASData.L2_dSYMV_y_n2);
+
+        mBLAS.DSYMV(uplo, alphaD, matrixAD, vectorXD, incX, betaD, vectorYD, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_dSYMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYD);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+
+    private void xSBMV_API_test(int Uplo, int K, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSYMV(elemA, Uplo, matA, vecX, incX, vecY, incY) && K >= 0) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SSBMV(Uplo, K, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DSBMV(Uplo, K, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SSBMV(Uplo, K, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            fail("should throw RSRuntimeException for SSBMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DSBMV(Uplo, K, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            fail("should throw RSRuntimeException for DSBMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xSBMV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int K : mK) {
+                for (int incX : mInc) {
+                    xSBMV_API_test(Uplo, K, incX, incX, mMatrix);
+                }
+            }
+        }
+    }
+
+    public void test_L2_SSBMV_API() {
+        L2_xSBMV_API(mMatrixS);
+    }
+
+    public void test_L2_DSBMV_API() {
+        L2_xSBMV_API(mMatrixD);
+    }
+
+    public void test_L2_SSBMV_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        Allocation vectorYS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        matrixAS.copy2DRangeFrom(0, 0, mBLASData.KL + 1, mBLASData.dN, mBLASData.L2_sSBMV_A_nn);
+        vectorXS.copyFrom(mBLASData.L2_sSBMV_x_n1);
+        vectorYS.copyFrom(mBLASData.L2_sSBMV_y_n1);
+
+        // Test for the default case:
+        mBLAS.SSBMV(uplo, mBLASData.KL, alphaS, matrixAS, vectorXS, incX, betaS, vectorYS, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        vectorYRef.copyFrom(mBLASData.L2_sSBMV_o_N);
+        verifyMatrix(vectorYRef, vectorYS);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dN - 1) * incY;
+        vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorYS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimY, 1));
+        vectorXS.copyFrom(mBLASData.L2_sSBMV_x_n2);
+        vectorYS.copyFrom(mBLASData.L2_sSBMV_y_n2);
+
+        mBLAS.SSBMV(uplo, mBLASData.KL, alphaS, matrixAS, vectorXS, incX, betaS, vectorYS, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_sSBMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYS);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_DSBMV_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        Allocation vectorYD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        matrixAD.copy2DRangeFrom(0, 0, mBLASData.KL + 1, mBLASData.dN, mBLASData.L2_dSBMV_A_nn);
+        vectorXD.copyFrom(mBLASData.L2_dSBMV_x_n1);
+        vectorYD.copyFrom(mBLASData.L2_dSBMV_y_n1);
+
+        // Test for the default case:
+        mBLAS.DSBMV(uplo, mBLASData.KL, alphaD, matrixAD, vectorXD, incX, betaD, vectorYD, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        vectorYRef.copyFrom(mBLASData.L2_dSBMV_o_N);
+        verifyMatrix(vectorYRef, vectorYD);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dN - 1) * incY;
+        vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorYD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimY, 1));
+        vectorXD.copyFrom(mBLASData.L2_dSBMV_x_n2);
+        vectorYD.copyFrom(mBLASData.L2_dSBMV_y_n2);
+
+        mBLAS.DSBMV(uplo, mBLASData.KL, alphaD, matrixAD, vectorXD, incX, betaD, vectorYD, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_dSBMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYD);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private boolean validateSPMV(Element e, int Uplo, Allocation Ap, Allocation X, int incX, Allocation Y, int incY) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!Ap.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e) ||
+            !Y.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
+            return false;
+        }
+
+        if (Ap.getType().getY() > 1) {
+            return false;
+        }
+
+        int N = (int)Math.sqrt((double)Ap.getType().getX() * 2);
+        if (Ap.getType().getX() != ((N * (N+1)) / 2)) {
+            return false;
+        }
+        if (incX <= 0 || incY <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (N - 1) * incX;
+        if (X.getType().getX() != expectedXDim) {
+            return false;
+        }
+        int expectedYDim = 1 + (N - 1) * incY;
+        if (Y.getType().getX() != expectedYDim) {
+            return false;
+        }
+
+        return true;
+    }
+
+    private void xSPMV_API_test(int Uplo, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSPMV(elemA, Uplo, matA, vecX, incX, vecY, incY)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SSPMV(Uplo, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DSPMV(Uplo, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SSPMV(Uplo, alphaS, matA, vecX, incX, betaS, vecY, incY);
+                            fail("should throw RSRuntimeException for SSPMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DSPMV(Uplo, alphaD, matA, vecX, incX, betaD, vecY, incY);
+                            fail("should throw RSRuntimeException for DSPMV");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xSPMV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xSPMV_API_test(Uplo, incX, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_SSPMV_API() {
+        L2_xSPMV_API(mMatrixS);
+    }
+
+    public void test_L2_DSPMV_API() {
+        L2_xSPMV_API(mMatrixD);
+    }
+
+    public void test_L2_SSPMV_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), N, 1));
+        Allocation vectorYS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), N, 1));
+        matrixAS.copyFrom(mBLASData.L2_sSYMV_A_nn_pu);
+        vectorXS.copyFrom(mBLASData.L2_sSYMV_x_n1);
+        vectorYS.copyFrom(mBLASData.L2_sSYMV_y_n1);
+
+        // Test for the default case:
+        mBLAS.SSPMV(uplo, alphaS, matrixAS, vectorXS, incX, betaS, vectorYS, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), N, 1));
+        vectorYRef.copyFrom(mBLASData.L2_sSYMV_o_N);
+        verifyMatrix(vectorYRef, vectorYS);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (N - 1) * incX;
+        int dimY = 1 + (N - 1) * incY;
+        vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorYS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimY, 1));
+        vectorXS.copyFrom(mBLASData.L2_sSYMV_x_n2);
+        vectorYS.copyFrom(mBLASData.L2_sSYMV_y_n2);
+
+        mBLAS.SSPMV(uplo, alphaS, matrixAS, vectorXS, incX, betaS, vectorYS, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_sSYMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYS);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_DSPMV_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), N, 1));
+        Allocation vectorYD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), N, 1));
+        matrixAD.copyFrom(mBLASData.L2_dSYMV_A_nn_pu);
+        vectorXD.copyFrom(mBLASData.L2_dSYMV_x_n1);
+        vectorYD.copyFrom(mBLASData.L2_dSYMV_y_n1);
+
+        // Test for the default case:
+        mBLAS.DSPMV(uplo, alphaD, matrixAD, vectorXD, incX, betaD, vectorYD, incY);
+        Allocation vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), N, 1));
+        vectorYRef.copyFrom(mBLASData.L2_dSYMV_o_N);
+        verifyMatrix(vectorYRef, vectorYD);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (N - 1) * incX;
+        int dimY = 1 + (N - 1) * incY;
+        vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorYD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimY, 1));
+        vectorXD.copyFrom(mBLASData.L2_dSYMV_x_n2);
+        vectorYD.copyFrom(mBLASData.L2_dSYMV_y_n2);
+
+        mBLAS.DSPMV(uplo, alphaD, matrixAD, vectorXD, incX, betaD, vectorYD, incY);
+        vectorYRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimY, 1));
+        vectorYRef.copyFrom(mBLASData.L2_dSYMV_o_N2);
+        verifyMatrix(vectorYRef, vectorYD);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+
+    private boolean validateTRMV(Element e, int Uplo, int TransA, int Diag, Allocation A, Allocation X, int incX) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!validateTranspose(TransA)) {
+            return false;
+        }
+        if (!validateDiag(Diag)) {
+            return false;
+        }
+        int N = A.getType().getY();
+        if (A.getType().getX() != N) {
+            return false;
+        }
+        if (!A.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        if (X.getType().getY() > 1) {
+            return false;
+        }
+
+        if (incX <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (N - 1) * incX;
+        if (X.getType().getX() != expectedXDim) {
+            return false;
+        }
+        return true;
+    }
+
+    private void xTRMV_API_test(int Uplo, int TransA, int Diag, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                Element elemA = matA.getType().getElement();
+                if (validateTRMV(elemA, Uplo, TransA, Diag, matA, vecX, incX)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.STRMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DTRMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CTRMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZTRMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.STRMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for STRMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DTRMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for DTRMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.CTRMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for CTRMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZTRMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for ZTRMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xTRMV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int TransA : mTranspose) {
+                for (int Diag : mDiag) {
+                    for (int incX : mInc) {
+                        xTRMV_API_test(Uplo, TransA, Diag, incX, mMatrix);
+                    }
+                }
+            }
+        }
+    }
+
+    public void test_L2_STRMV_API() {
+        L2_xTRMV_API(mMatrixS);
+    }
+
+    public void test_L2_DTRMV_API() {
+        L2_xTRMV_API(mMatrixD);
+    }
+
+    public void test_L2_CTRMV_API() {
+        L2_xTRMV_API(mMatrixC);
+    }
+
+    public void test_L2_ZTRMV_API() {
+        L2_xTRMV_API(mMatrixZ);
+    }
+
+    public void test_L2_STRMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        matrixAS.copyFrom(mBLASData.L2_sTRMV_A_nn);
+        vectorXS.copyFrom(mBLASData.L2_sTRMV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.STRMV(uplo, trans, diag, matrixAS, vectorXS, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        vectorXRef.copyFrom(mBLASData.L2_sTRMV_o_UN);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXS.copyFrom(mBLASData.L2_sTRMV_x_n1);
+        mBLAS.STRMV(uplo, trans, diag, matrixAS, vectorXS, incX);
+        vectorXRef.copyFrom(mBLASData.L2_sTRMV_o_UT);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXS.copyFrom(mBLASData.L2_sTRMV_x_n1);
+        mBLAS.STRMV(uplo, trans, diag, matrixAS, vectorXS, incX);
+        vectorXRef.copyFrom(mBLASData.L2_sTRMV_o_UH);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorXS.copyFrom(mBLASData.L2_sTRMV_x_n2);
+
+        mBLAS.STRMV(uplo, trans, diag, matrixAS, vectorXS, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_sTRMV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_DTRMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        matrixAD.copyFrom(mBLASData.L2_dTRMV_A_nn);
+        vectorXD.copyFrom(mBLASData.L2_dTRMV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.DTRMV(uplo, trans, diag, matrixAD, vectorXD, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        vectorXRef.copyFrom(mBLASData.L2_dTRMV_o_UN);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXD.copyFrom(mBLASData.L2_dTRMV_x_n1);
+        mBLAS.DTRMV(uplo, trans, diag, matrixAD, vectorXD, incX);
+        vectorXRef.copyFrom(mBLASData.L2_dTRMV_o_UT);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXD.copyFrom(mBLASData.L2_dTRMV_x_n1);
+        mBLAS.DTRMV(uplo, trans, diag, matrixAD, vectorXD, incX);
+        vectorXRef.copyFrom(mBLASData.L2_dTRMV_o_UH);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorXD.copyFrom(mBLASData.L2_dTRMV_x_n2);
+
+        mBLAS.DTRMV(uplo, trans, diag, matrixAD, vectorXD, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_dTRMV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_CTRMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        matrixAC.copyFrom(mBLASData.L2_cTRMV_A_nn);
+        vectorXC.copyFrom(mBLASData.L2_cTRMV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.CTRMV(uplo, trans, diag, matrixAC, vectorXC, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        vectorXRef.copyFrom(mBLASData.L2_cTRMV_o_UN);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXC.copyFrom(mBLASData.L2_cTRMV_x_n1);
+        mBLAS.CTRMV(uplo, trans, diag, matrixAC, vectorXC, incX);
+        vectorXRef.copyFrom(mBLASData.L2_cTRMV_o_UT);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXC.copyFrom(mBLASData.L2_cTRMV_x_n1);
+        mBLAS.CTRMV(uplo, trans, diag, matrixAC, vectorXC, incX);
+        vectorXRef.copyFrom(mBLASData.L2_cTRMV_o_UH);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorXC.copyFrom(mBLASData.L2_cTRMV_x_n2);
+
+        mBLAS.CTRMV(uplo, trans, diag, matrixAC, vectorXC, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_cTRMV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_ZTRMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        matrixAZ.copyFrom(mBLASData.L2_zTRMV_A_nn);
+        vectorXZ.copyFrom(mBLASData.L2_zTRMV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.ZTRMV(uplo, trans, diag, matrixAZ, vectorXZ, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        vectorXRef.copyFrom(mBLASData.L2_zTRMV_o_UN);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXZ.copyFrom(mBLASData.L2_zTRMV_x_n1);
+        mBLAS.ZTRMV(uplo, trans, diag, matrixAZ, vectorXZ, incX);
+        vectorXRef.copyFrom(mBLASData.L2_zTRMV_o_UT);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXZ.copyFrom(mBLASData.L2_zTRMV_x_n1);
+        mBLAS.ZTRMV(uplo, trans, diag, matrixAZ, vectorXZ, incX);
+        vectorXRef.copyFrom(mBLASData.L2_zTRMV_o_UH);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorXZ.copyFrom(mBLASData.L2_zTRMV_x_n2);
+
+        mBLAS.ZTRMV(uplo, trans, diag, matrixAZ, vectorXZ, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_zTRMV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+
+    private void xTBMV_API_test(int Uplo, int TransA, int Diag, int K, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                Element elemA = matA.getType().getElement();
+                if (validateTRMV(elemA, Uplo, TransA, Diag, matA, vecX, incX) && K >= 0) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.STBMV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DTBMV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CTBMV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZTBMV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.STBMV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for STBMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DTBMV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for DTBMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.CTBMV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for CTBMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZTBMV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for ZTBMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xTBMV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int TransA : mTranspose) {
+                for (int Diag : mDiag) {
+                    for (int K : mK) {
+                        for (int incX : mInc) {
+                            xTBMV_API_test(Uplo, TransA, Diag, K, incX, mMatrix);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void test_L2_STBMV_API() {
+        L2_xTBMV_API(mMatrixS);
+    }
+
+    public void test_L2_DTBMV_API() {
+        L2_xTBMV_API(mMatrixD);
+    }
+
+    public void test_L2_CTBMV_API() {
+        L2_xTBMV_API(mMatrixC);
+    }
+
+    public void test_L2_ZTBMV_API() {
+        L2_xTBMV_API(mMatrixZ);
+    }
+
+    public void test_L2_STBMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        matrixAS.copy2DRangeFrom(0, 0, mBLASData.KL + 1, mBLASData.dN, mBLASData.L2_sTBMV_A_nn);
+        vectorXS.copyFrom(mBLASData.L2_sTBMV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.STBMV(uplo, trans, diag, mBLASData.KL, matrixAS, vectorXS, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        vectorXRef.copyFrom(mBLASData.L2_sTBMV_o_UN);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXS.copyFrom(mBLASData.L2_sTBMV_x_n1);
+        mBLAS.STBMV(uplo, trans, diag, mBLASData.KL, matrixAS, vectorXS, incX);
+        vectorXRef.copyFrom(mBLASData.L2_sTBMV_o_UT);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXS.copyFrom(mBLASData.L2_sTBMV_x_n1);
+        mBLAS.STBMV(uplo, trans, diag, mBLASData.KL, matrixAS, vectorXS, incX);
+        vectorXRef.copyFrom(mBLASData.L2_sTBMV_o_UH);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorXS.copyFrom(mBLASData.L2_sTBMV_x_n2);
+
+        mBLAS.STBMV(uplo, trans, diag, mBLASData.KL, matrixAS, vectorXS, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_sTBMV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_DTBMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        matrixAD.copy2DRangeFrom(0, 0, mBLASData.KL + 1, mBLASData.dN, mBLASData.L2_dTBMV_A_nn);
+        vectorXD.copyFrom(mBLASData.L2_dTBMV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.DTBMV(uplo, trans, diag, mBLASData.KL, matrixAD, vectorXD, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        vectorXRef.copyFrom(mBLASData.L2_dTBMV_o_UN);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXD.copyFrom(mBLASData.L2_dTBMV_x_n1);
+        mBLAS.DTBMV(uplo, trans, diag, mBLASData.KL, matrixAD, vectorXD, incX);
+        vectorXRef.copyFrom(mBLASData.L2_dTBMV_o_UT);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXD.copyFrom(mBLASData.L2_dTBMV_x_n1);
+        mBLAS.DTBMV(uplo, trans, diag, mBLASData.KL, matrixAD, vectorXD, incX);
+        vectorXRef.copyFrom(mBLASData.L2_dTBMV_o_UH);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorXD.copyFrom(mBLASData.L2_dTBMV_x_n2);
+
+        mBLAS.DTBMV(uplo, trans, diag, mBLASData.KL, matrixAD, vectorXD, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_dTBMV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_CTBMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        matrixAC.copy2DRangeFrom(0, 0, mBLASData.KL + 1, mBLASData.dN, mBLASData.L2_cTBMV_A_nn);
+        vectorXC.copyFrom(mBLASData.L2_cTBMV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.CTBMV(uplo, trans, diag, mBLASData.KL, matrixAC, vectorXC, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        vectorXRef.copyFrom(mBLASData.L2_cTBMV_o_UN);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXC.copyFrom(mBLASData.L2_cTBMV_x_n1);
+        mBLAS.CTBMV(uplo, trans, diag, mBLASData.KL, matrixAC, vectorXC, incX);
+        vectorXRef.copyFrom(mBLASData.L2_cTBMV_o_UT);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXC.copyFrom(mBLASData.L2_cTBMV_x_n1);
+        mBLAS.CTBMV(uplo, trans, diag, mBLASData.KL, matrixAC, vectorXC, incX);
+        vectorXRef.copyFrom(mBLASData.L2_cTBMV_o_UH);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorXC.copyFrom(mBLASData.L2_cTBMV_x_n2);
+
+        mBLAS.CTBMV(uplo, trans, diag, mBLASData.KL, matrixAC, vectorXC, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_cTBMV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_ZTBMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        matrixAZ.copy2DRangeFrom(0, 0, mBLASData.KL + 1, mBLASData.dN, mBLASData.L2_zTBMV_A_nn);
+        vectorXZ.copyFrom(mBLASData.L2_zTBMV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.ZTBMV(uplo, trans, diag, mBLASData.KL, matrixAZ, vectorXZ, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        vectorXRef.copyFrom(mBLASData.L2_zTBMV_o_UN);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXZ.copyFrom(mBLASData.L2_zTBMV_x_n1);
+        mBLAS.ZTBMV(uplo, trans, diag, mBLASData.KL, matrixAZ, vectorXZ, incX);
+        vectorXRef.copyFrom(mBLASData.L2_zTBMV_o_UT);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXZ.copyFrom(mBLASData.L2_zTBMV_x_n1);
+        mBLAS.ZTBMV(uplo, trans, diag, mBLASData.KL, matrixAZ, vectorXZ, incX);
+        vectorXRef.copyFrom(mBLASData.L2_zTBMV_o_UH);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorXZ.copyFrom(mBLASData.L2_zTBMV_x_n2);
+
+        mBLAS.ZTBMV(uplo, trans, diag, mBLASData.KL, matrixAZ, vectorXZ, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_zTBMV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private boolean validateTPMV(Element e, int Uplo, int TransA, int Diag, Allocation Ap, Allocation X, int incX) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!validateTranspose(TransA)) {
+            return false;
+        }
+        if (!validateDiag(Diag)) {
+            return false;
+        }
+        if (!Ap.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        if (X.getType().getY() > 1) {
+            return false;
+        }
+
+        if (Ap.getType().getY() > 1) {
+            return false;
+        }
+
+        int N = (int)Math.sqrt((double)Ap.getType().getX() * 2);
+        if (Ap.getType().getX() != ((N * (N+1)) / 2)) {
+            return false;
+        }
+        if (incX <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (N - 1) * incX;
+        if (X.getType().getX() != expectedXDim) {
+            return false;
+        }
+
+        return true;
+    }
+
+    private void xTPMV_API_test(int Uplo, int TransA, int Diag, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                Element elemA = matA.getType().getElement();
+                if (validateTPMV(elemA, Uplo, TransA, Diag, matA, vecX, incX)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.STPMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DTPMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CTPMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZTPMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.STPMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for STPMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DTPMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for DTPMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.CTPMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for CTPMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZTPMV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for ZTPMV");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xTPMV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int TransA : mTranspose) {
+                for (int Diag : mDiag) {
+                    for (int incX : mInc) {
+                        xTPMV_API_test(Uplo, TransA, Diag, incX, mMatrix);
+                    }
+                }
+            }
+        }
+    }
+
+    public void test_L2_STPMV_API() {
+        L2_xTPMV_API(mMatrixS);
+    }
+
+    public void test_L2_DTPMV_API() {
+        L2_xTPMV_API(mMatrixD);
+    }
+
+    public void test_L2_CTPMV_API() {
+        L2_xTPMV_API(mMatrixC);
+    }
+
+    public void test_L2_ZTPMV_API() {
+        L2_xTPMV_API(mMatrixZ);
+    }
+
+    public void test_L2_STPMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), N, 1));
+        matrixAS.copyFrom(mBLASData.L2_sTRMV_A_nn_pu);
+        vectorXS.copyFrom(mBLASData.L2_sTRMV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.STPMV(uplo, trans, diag, matrixAS, vectorXS, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), N, 1));
+        vectorXRef.copyFrom(mBLASData.L2_sTRMV_o_UN);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXS.copyFrom(mBLASData.L2_sTRMV_x_n1);
+        mBLAS.STPMV(uplo, trans, diag, matrixAS, vectorXS, incX);
+        vectorXRef.copyFrom(mBLASData.L2_sTRMV_o_UT);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXS.copyFrom(mBLASData.L2_sTRMV_x_n1);
+        mBLAS.STPMV(uplo, trans, diag, matrixAS, vectorXS, incX);
+        vectorXRef.copyFrom(mBLASData.L2_sTRMV_o_UH);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (N - 1) * incX;
+        vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorXS.copyFrom(mBLASData.L2_sTRMV_x_n2);
+
+        mBLAS.STPMV(uplo, trans, diag, matrixAS, vectorXS, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_sTRMV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_DTPMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), N, 1));
+        matrixAD.copyFrom(mBLASData.L2_dTRMV_A_nn_pu);
+        vectorXD.copyFrom(mBLASData.L2_dTRMV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.DTPMV(uplo, trans, diag, matrixAD, vectorXD, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), N, 1));
+        vectorXRef.copyFrom(mBLASData.L2_dTRMV_o_UN);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXD.copyFrom(mBLASData.L2_dTRMV_x_n1);
+        mBLAS.DTPMV(uplo, trans, diag, matrixAD, vectorXD, incX);
+        vectorXRef.copyFrom(mBLASData.L2_dTRMV_o_UT);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXD.copyFrom(mBLASData.L2_dTRMV_x_n1);
+        mBLAS.DTPMV(uplo, trans, diag, matrixAD, vectorXD, incX);
+        vectorXRef.copyFrom(mBLASData.L2_dTRMV_o_UH);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (N - 1) * incX;
+        vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorXD.copyFrom(mBLASData.L2_dTRMV_x_n2);
+
+        mBLAS.DTPMV(uplo, trans, diag, matrixAD, vectorXD, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_dTRMV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_CTPMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), N, 1));
+        matrixAC.copyFrom(mBLASData.L2_cTRMV_A_nn_pu);
+        vectorXC.copyFrom(mBLASData.L2_cTRMV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.CTPMV(uplo, trans, diag, matrixAC, vectorXC, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), N, 1));
+        vectorXRef.copyFrom(mBLASData.L2_cTRMV_o_UN);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXC.copyFrom(mBLASData.L2_cTRMV_x_n1);
+        mBLAS.CTPMV(uplo, trans, diag, matrixAC, vectorXC, incX);
+        vectorXRef.copyFrom(mBLASData.L2_cTRMV_o_UT);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXC.copyFrom(mBLASData.L2_cTRMV_x_n1);
+        mBLAS.CTPMV(uplo, trans, diag, matrixAC, vectorXC, incX);
+        vectorXRef.copyFrom(mBLASData.L2_cTRMV_o_UH);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (N - 1) * incX;
+        vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorXC.copyFrom(mBLASData.L2_cTRMV_x_n2);
+
+        mBLAS.CTPMV(uplo, trans, diag, matrixAC, vectorXC, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_cTRMV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_ZTPMV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), N, 1));
+        matrixAZ.copyFrom(mBLASData.L2_zTRMV_A_nn_pu);
+        vectorXZ.copyFrom(mBLASData.L2_zTRMV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.ZTPMV(uplo, trans, diag, matrixAZ, vectorXZ, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), N, 1));
+        vectorXRef.copyFrom(mBLASData.L2_zTRMV_o_UN);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXZ.copyFrom(mBLASData.L2_zTRMV_x_n1);
+        mBLAS.ZTPMV(uplo, trans, diag, matrixAZ, vectorXZ, incX);
+        vectorXRef.copyFrom(mBLASData.L2_zTRMV_o_UT);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXZ.copyFrom(mBLASData.L2_zTRMV_x_n1);
+        mBLAS.ZTPMV(uplo, trans, diag, matrixAZ, vectorXZ, incX);
+        vectorXRef.copyFrom(mBLASData.L2_zTRMV_o_UH);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (N - 1) * incX;
+        vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorXZ.copyFrom(mBLASData.L2_zTRMV_x_n2);
+
+        mBLAS.ZTPMV(uplo, trans, diag, matrixAZ, vectorXZ, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_zTRMV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private void xTRSV_API_test(int Uplo, int TransA, int Diag, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                Element elemA = matA.getType().getElement();
+                if (validateTRMV(elemA, Uplo, TransA, Diag, matA, vecX, incX)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.STRSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DTRSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CTRSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZTRSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.STRSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for STRSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DTRSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for DTRSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.CTRSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for CTRSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZTRSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for ZTRSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xTRSV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int TransA : mTranspose) {
+                for (int Diag : mDiag) {
+                    for (int incX : mInc) {
+                        xTRSV_API_test(Uplo, TransA, Diag, incX, mMatrix);
+                    }
+                }
+            }
+        }
+    }
+
+    public void test_L2_STRSV_API() {
+        L2_xTRSV_API(mMatrixS);
+    }
+
+    public void test_L2_DTRSV_API() {
+        L2_xTRSV_API(mMatrixD);
+    }
+
+    public void test_L2_CTRSV_API() {
+        L2_xTRSV_API(mMatrixC);
+    }
+
+    public void test_L2_ZTRSV_API() {
+        L2_xTRSV_API(mMatrixZ);
+    }
+
+    public void test_L2_STRSV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        matrixAS.copyFrom(mBLASData.L2_sTRSV_A_nn);
+        vectorXS.copyFrom(mBLASData.L2_sTRSV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.STRSV(uplo, trans, diag, matrixAS, vectorXS, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        vectorXRef.copyFrom(mBLASData.L2_sTRSV_o_UN);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXS.copyFrom(mBLASData.L2_sTRSV_x_n1);
+        mBLAS.STRSV(uplo, trans, diag, matrixAS, vectorXS, incX);
+        vectorXRef.copyFrom(mBLASData.L2_sTRSV_o_UT);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXS.copyFrom(mBLASData.L2_sTRSV_x_n1);
+        mBLAS.STRSV(uplo, trans, diag, matrixAS, vectorXS, incX);
+        vectorXRef.copyFrom(mBLASData.L2_sTRSV_o_UH);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorXS.copyFrom(mBLASData.L2_sTRSV_x_n2);
+
+        mBLAS.STRSV(uplo, trans, diag, matrixAS, vectorXS, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_sTRSV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_DTRSV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        matrixAD.copyFrom(mBLASData.L2_dTRSV_A_nn);
+        vectorXD.copyFrom(mBLASData.L2_dTRSV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.DTRSV(uplo, trans, diag, matrixAD, vectorXD, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        vectorXRef.copyFrom(mBLASData.L2_dTRSV_o_UN);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXD.copyFrom(mBLASData.L2_dTRSV_x_n1);
+        mBLAS.DTRSV(uplo, trans, diag, matrixAD, vectorXD, incX);
+        vectorXRef.copyFrom(mBLASData.L2_dTRSV_o_UT);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXD.copyFrom(mBLASData.L2_dTRSV_x_n1);
+        mBLAS.DTRSV(uplo, trans, diag, matrixAD, vectorXD, incX);
+        vectorXRef.copyFrom(mBLASData.L2_dTRSV_o_UH);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorXD.copyFrom(mBLASData.L2_dTRSV_x_n2);
+
+        mBLAS.DTRSV(uplo, trans, diag, matrixAD, vectorXD, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_dTRSV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_CTRSV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        matrixAC.copyFrom(mBLASData.L2_cTRSV_A_nn);
+        vectorXC.copyFrom(mBLASData.L2_cTRSV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.CTRSV(uplo, trans, diag, matrixAC, vectorXC, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        vectorXRef.copyFrom(mBLASData.L2_cTRSV_o_UN);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXC.copyFrom(mBLASData.L2_cTRSV_x_n1);
+        mBLAS.CTRSV(uplo, trans, diag, matrixAC, vectorXC, incX);
+        vectorXRef.copyFrom(mBLASData.L2_cTRSV_o_UT);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXC.copyFrom(mBLASData.L2_cTRSV_x_n1);
+        mBLAS.CTRSV(uplo, trans, diag, matrixAC, vectorXC, incX);
+        vectorXRef.copyFrom(mBLASData.L2_cTRSV_o_UH);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorXC.copyFrom(mBLASData.L2_cTRSV_x_n2);
+
+        mBLAS.CTRSV(uplo, trans, diag, matrixAC, vectorXC, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_cTRSV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_ZTRSV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        matrixAZ.copyFrom(mBLASData.L2_zTRSV_A_nn);
+        vectorXZ.copyFrom(mBLASData.L2_zTRSV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.ZTRSV(uplo, trans, diag, matrixAZ, vectorXZ, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        vectorXRef.copyFrom(mBLASData.L2_zTRSV_o_UN);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXZ.copyFrom(mBLASData.L2_zTRSV_x_n1);
+        mBLAS.ZTRSV(uplo, trans, diag, matrixAZ, vectorXZ, incX);
+        vectorXRef.copyFrom(mBLASData.L2_zTRSV_o_UT);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXZ.copyFrom(mBLASData.L2_zTRSV_x_n1);
+        mBLAS.ZTRSV(uplo, trans, diag, matrixAZ, vectorXZ, incX);
+        vectorXRef.copyFrom(mBLASData.L2_zTRSV_o_UH);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorXZ.copyFrom(mBLASData.L2_zTRSV_x_n2);
+
+        mBLAS.ZTRSV(uplo, trans, diag, matrixAZ, vectorXZ, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_zTRSV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private void xTBSV_API_test(int Uplo, int TransA, int Diag, int K, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                Element elemA = matA.getType().getElement();
+                if (validateTRMV(elemA, Uplo, TransA, Diag, matA, vecX, incX) && K >= 0) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.STBSV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DTBSV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CTBSV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZTBSV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.STBSV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for STBSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DTBSV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for DTBSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.CTBSV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for CTBSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZTBSV(Uplo, TransA, Diag, K, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for ZTBSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xTBSV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int TransA : mTranspose) {
+                for (int Diag : mDiag) {
+                    for (int K : mK) {
+                        for (int incX : mInc) {
+                            xTBSV_API_test(Uplo, TransA, Diag, K, incX, mMatrix);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void test_L2_STBSV_API() {
+        L2_xTBSV_API(mMatrixS);
+    }
+
+    public void test_L2_DTBSV_API() {
+        L2_xTBSV_API(mMatrixD);
+    }
+
+    public void test_L2_CTBSV_API() {
+        L2_xTBSV_API(mMatrixC);
+    }
+
+    public void test_L2_ZTBSV_API() {
+        L2_xTBSV_API(mMatrixZ);
+    }
+
+    public void test_L2_STBSV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        matrixAS.copy2DRangeFrom(0, 0, mBLASData.KL + 1, mBLASData.dN, mBLASData.L2_sTBSV_A_nn);
+        vectorXS.copyFrom(mBLASData.L2_sTBSV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.STBSV(uplo, trans, diag, mBLASData.KL, matrixAS, vectorXS, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        vectorXRef.copyFrom(mBLASData.L2_sTBSV_o_UN);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXS.copyFrom(mBLASData.L2_sTBSV_x_n1);
+        mBLAS.STBSV(uplo, trans, diag, mBLASData.KL, matrixAS, vectorXS, incX);
+        vectorXRef.copyFrom(mBLASData.L2_sTBSV_o_UT);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXS.copyFrom(mBLASData.L2_sTBSV_x_n1);
+        mBLAS.STBSV(uplo, trans, diag, mBLASData.KL, matrixAS, vectorXS, incX);
+        vectorXRef.copyFrom(mBLASData.L2_sTBSV_o_UH);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorXS.copyFrom(mBLASData.L2_sTBSV_x_n2);
+
+        mBLAS.STBSV(uplo, trans, diag, mBLASData.KL, matrixAS, vectorXS, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_sTBSV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_DTBSV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        matrixAD.copy2DRangeFrom(0, 0, mBLASData.KL + 1, mBLASData.dN, mBLASData.L2_dTBSV_A_nn);
+        vectorXD.copyFrom(mBLASData.L2_dTBSV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.DTBSV(uplo, trans, diag, mBLASData.KL, matrixAD, vectorXD, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        vectorXRef.copyFrom(mBLASData.L2_dTBSV_o_UN);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXD.copyFrom(mBLASData.L2_dTBSV_x_n1);
+        mBLAS.DTBSV(uplo, trans, diag, mBLASData.KL, matrixAD, vectorXD, incX);
+        vectorXRef.copyFrom(mBLASData.L2_dTBSV_o_UT);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXD.copyFrom(mBLASData.L2_dTBSV_x_n1);
+        mBLAS.DTBSV(uplo, trans, diag, mBLASData.KL, matrixAD, vectorXD, incX);
+        vectorXRef.copyFrom(mBLASData.L2_dTBSV_o_UH);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorXD.copyFrom(mBLASData.L2_dTBSV_x_n2);
+
+        mBLAS.DTBSV(uplo, trans, diag, mBLASData.KL, matrixAD, vectorXD, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_dTBSV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_CTBSV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        matrixAC.copy2DRangeFrom(0, 0, mBLASData.KL + 1, mBLASData.dN, mBLASData.L2_cTBSV_A_nn);
+        vectorXC.copyFrom(mBLASData.L2_cTBSV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.CTBSV(uplo, trans, diag, mBLASData.KL, matrixAC, vectorXC, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        vectorXRef.copyFrom(mBLASData.L2_cTBSV_o_UN);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXC.copyFrom(mBLASData.L2_cTBSV_x_n1);
+        mBLAS.CTBSV(uplo, trans, diag, mBLASData.KL, matrixAC, vectorXC, incX);
+        vectorXRef.copyFrom(mBLASData.L2_cTBSV_o_UT);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXC.copyFrom(mBLASData.L2_cTBSV_x_n1);
+        mBLAS.CTBSV(uplo, trans, diag, mBLASData.KL, matrixAC, vectorXC, incX);
+        vectorXRef.copyFrom(mBLASData.L2_cTBSV_o_UH);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorXC.copyFrom(mBLASData.L2_cTBSV_x_n2);
+
+        mBLAS.CTBSV(uplo, trans, diag, mBLASData.KL, matrixAC, vectorXC, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_cTBSV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_ZTBSV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        matrixAZ.copy2DRangeFrom(0, 0, mBLASData.KL + 1, mBLASData.dN, mBLASData.L2_zTBSV_A_nn);
+        vectorXZ.copyFrom(mBLASData.L2_zTBSV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.ZTBSV(uplo, trans, diag, mBLASData.KL, matrixAZ, vectorXZ, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        vectorXRef.copyFrom(mBLASData.L2_zTBSV_o_UN);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXZ.copyFrom(mBLASData.L2_zTBSV_x_n1);
+        mBLAS.ZTBSV(uplo, trans, diag, mBLASData.KL, matrixAZ, vectorXZ, incX);
+        vectorXRef.copyFrom(mBLASData.L2_zTBSV_o_UT);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXZ.copyFrom(mBLASData.L2_zTBSV_x_n1);
+        mBLAS.ZTBSV(uplo, trans, diag, mBLASData.KL, matrixAZ, vectorXZ, incX);
+        vectorXRef.copyFrom(mBLASData.L2_zTBSV_o_UH);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorXZ.copyFrom(mBLASData.L2_zTBSV_x_n2);
+
+        mBLAS.ZTBSV(uplo, trans, diag, mBLASData.KL, matrixAZ, vectorXZ, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_zTBSV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private void xTPSV_API_test(int Uplo, int TransA, int Diag, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                Element elemA = matA.getType().getElement();
+                if (validateTPMV(elemA, Uplo, TransA, Diag, matA, vecX, incX)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.STPSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DTPSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CTPSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZTPSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.STPSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for STPSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DTPSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for DTPSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.CTPSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for CTPSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZTPSV(Uplo, TransA, Diag, matA, vecX, incX);
+                        fail("should throw RSRuntimeException for ZTPSV");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xTPSV_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int TransA : mTranspose) {
+                for (int Diag : mDiag) {
+                    for (int incX : mInc) {
+                        xTPSV_API_test(Uplo, TransA, Diag, incX, mMatrix);
+                    }
+                }
+            }
+        }
+    }
+
+    public void test_L2_STPSV_API() {
+        L2_xTPSV_API(mMatrixS);
+    }
+
+    public void test_L2_DTPSV_API() {
+        L2_xTPSV_API(mMatrixD);
+    }
+
+    public void test_L2_CTPSV_API() {
+        L2_xTPSV_API(mMatrixC);
+    }
+
+    public void test_L2_ZTPSV_API() {
+        L2_xTPSV_API(mMatrixZ);
+    }
+
+    public void test_L2_STPSV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), N, 1));
+        matrixAS.copyFrom(mBLASData.L2_sTRSV_A_nn_pu);
+        vectorXS.copyFrom(mBLASData.L2_sTRSV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.STPSV(uplo, trans, diag, matrixAS, vectorXS, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), N, 1));
+        vectorXRef.copyFrom(mBLASData.L2_sTRSV_o_UN);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXS.copyFrom(mBLASData.L2_sTRSV_x_n1);
+        mBLAS.STPSV(uplo, trans, diag, matrixAS, vectorXS, incX);
+        vectorXRef.copyFrom(mBLASData.L2_sTRSV_o_UT);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXS.copyFrom(mBLASData.L2_sTRSV_x_n1);
+        mBLAS.STPSV(uplo, trans, diag, matrixAS, vectorXS, incX);
+        vectorXRef.copyFrom(mBLASData.L2_sTRSV_o_UH);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (N - 1) * incX;
+        vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorXS.copyFrom(mBLASData.L2_sTRSV_x_n2);
+
+        mBLAS.STPSV(uplo, trans, diag, matrixAS, vectorXS, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_sTRSV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXS);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_DTPSV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), N, 1));
+        matrixAD.copyFrom(mBLASData.L2_dTRSV_A_nn_pu);
+        vectorXD.copyFrom(mBLASData.L2_dTRSV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.DTPSV(uplo, trans, diag, matrixAD, vectorXD, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), N, 1));
+        vectorXRef.copyFrom(mBLASData.L2_dTRSV_o_UN);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXD.copyFrom(mBLASData.L2_dTRSV_x_n1);
+        mBLAS.DTPSV(uplo, trans, diag, matrixAD, vectorXD, incX);
+        vectorXRef.copyFrom(mBLASData.L2_dTRSV_o_UT);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXD.copyFrom(mBLASData.L2_dTRSV_x_n1);
+        mBLAS.DTPSV(uplo, trans, diag, matrixAD, vectorXD, incX);
+        vectorXRef.copyFrom(mBLASData.L2_dTRSV_o_UH);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (N - 1) * incX;
+        vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorXD.copyFrom(mBLASData.L2_dTRSV_x_n2);
+
+        mBLAS.DTPSV(uplo, trans, diag, matrixAD, vectorXD, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_dTRSV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXD);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_CTPSV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), N, 1));
+        matrixAC.copyFrom(mBLASData.L2_cTRSV_A_nn_pu);
+        vectorXC.copyFrom(mBLASData.L2_cTRSV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.CTPSV(uplo, trans, diag, matrixAC, vectorXC, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), N, 1));
+        vectorXRef.copyFrom(mBLASData.L2_cTRSV_o_UN);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXC.copyFrom(mBLASData.L2_cTRSV_x_n1);
+        mBLAS.CTPSV(uplo, trans, diag, matrixAC, vectorXC, incX);
+        vectorXRef.copyFrom(mBLASData.L2_cTRSV_o_UT);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXC.copyFrom(mBLASData.L2_cTRSV_x_n1);
+        mBLAS.CTPSV(uplo, trans, diag, matrixAC, vectorXC, incX);
+        vectorXRef.copyFrom(mBLASData.L2_cTRSV_o_UH);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (N - 1) * incX;
+        vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorXC.copyFrom(mBLASData.L2_cTRSV_x_n2);
+
+        mBLAS.CTPSV(uplo, trans, diag, matrixAC, vectorXC, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_cTRSV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXC);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_ZTPSV_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+        int incX = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), N, 1));
+        matrixAZ.copyFrom(mBLASData.L2_zTRSV_A_nn_pu);
+        vectorXZ.copyFrom(mBLASData.L2_zTRSV_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.ZTPSV(uplo, trans, diag, matrixAZ, vectorXZ, incX);
+        Allocation vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), N, 1));
+        vectorXRef.copyFrom(mBLASData.L2_zTRSV_o_UN);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload vector X, since it was overwritten by BLAS.
+        vectorXZ.copyFrom(mBLASData.L2_zTRSV_x_n1);
+        mBLAS.ZTPSV(uplo, trans, diag, matrixAZ, vectorXZ, incX);
+        vectorXRef.copyFrom(mBLASData.L2_zTRSV_o_UT);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        vectorXZ.copyFrom(mBLASData.L2_zTRSV_x_n1);
+        mBLAS.ZTPSV(uplo, trans, diag, matrixAZ, vectorXZ, incX);
+        vectorXRef.copyFrom(mBLASData.L2_zTRSV_o_UH);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        // Test for incX = 2;
+        trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        incX = 2;
+        int dimX = 1 + (N - 1) * incX;
+        vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorXZ.copyFrom(mBLASData.L2_zTRSV_x_n2);
+
+        mBLAS.ZTPSV(uplo, trans, diag, matrixAZ, vectorXZ, incX);
+        vectorXRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorXRef.copyFrom(mBLASData.L2_zTRSV_o_UN2);
+        verifyMatrix(vectorXRef, vectorXZ);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private boolean validateGER(Element e, Allocation X, int incX, Allocation Y, int incY, Allocation A) {
+        if (!A.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e) ||
+            !Y.getType().getElement().isCompatible(e) ) {
+            return false;
+        }
+
+        if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
+            return false;
+        }
+
+        int M = A.getType().getY();
+        int N = A.getType().getX();
+
+        if (N < 1 || M < 1) {
+            return false;
+        }
+        if (incX <= 0 || incY <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (M - 1) * incX;
+        if (X.getType().getX() != expectedXDim) {
+            return false;
+        }
+        int expectedYDim = 1 + (N - 1) * incY;
+        if (Y.getType().getX() != expectedYDim) {
+            return false;
+        }
+        return true;
+    }
+
+
+    private void xGER_API_test(int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateGER(elemA, vecX, incX, vecY, incY, matA)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SGER(alphaS, vecX, incX, vecY, incY, matA);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DGER(alphaD, vecX, incX, vecY, incY, matA);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SGER(alphaS, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for SGER");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DGER(alphaD, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for DGER");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private void L2_xGER_API(ArrayList<Allocation> mMatrix) {
+        for (int incX : mInc) {
+            for (int incY : mInc) {
+                xGERU_API_test(incX, incY, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_SGER_API() {
+        L2_xGER_API(mMatrixS);
+    }
+
+    public void test_L2_DGER_API() {
+        L2_xGER_API(mMatrixD);
+    }
+
+    public void test_L2_SGER_Correctness() {
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dM, 1));
+        Allocation vectorYS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        matrixAS.copyFrom(mBLASData.L2_sGER_A_mn);
+        vectorXS.copyFrom(mBLASData.L2_sGER_x_m1);
+        vectorYS.copyFrom(mBLASData.L2_sGER_y_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.SGER(alphaS, vectorXS, incX, vectorYS, incY, matrixAS);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dM));
+        matrixARef.copyFrom(mBLASData.L2_sGER_o_N);
+        verifyMatrix(matrixARef, matrixAS);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dM - 1) * incX;
+        int dimY = 1 + (mBLASData.dN - 1) * incY;
+        vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorYS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimY, 1));
+        vectorXS.copyFrom(mBLASData.L2_sGER_x_m2);
+        vectorYS.copyFrom(mBLASData.L2_sGER_y_n2);
+        matrixAS.copyFrom(mBLASData.L2_sGER_A_mn);
+
+        mBLAS.SGER(alphaS, vectorXS, incX, vectorYS, incY, matrixAS);
+        verifyMatrix(matrixARef, matrixAS);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_DGER_Correctness() {
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dM, 1));
+        Allocation vectorYD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        matrixAD.copyFrom(mBLASData.L2_dGER_A_mn);
+        vectorXD.copyFrom(mBLASData.L2_dGER_x_m1);
+        vectorYD.copyFrom(mBLASData.L2_dGER_y_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.DGER(alphaD, vectorXD, incX, vectorYD, incY, matrixAD);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dM));
+        matrixARef.copyFrom(mBLASData.L2_dGER_o_N);
+        verifyMatrix(matrixARef, matrixAD);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dM - 1) * incX;
+        int dimY = 1 + (mBLASData.dN - 1) * incY;
+        vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorYD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimY, 1));
+        vectorXD.copyFrom(mBLASData.L2_dGER_x_m2);
+        vectorYD.copyFrom(mBLASData.L2_dGER_y_n2);
+        matrixAD.copyFrom(mBLASData.L2_dGER_A_mn);
+
+        mBLAS.DGER(alphaD, vectorXD, incX, vectorYD, incY, matrixAD);
+        verifyMatrix(matrixARef, matrixAD);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private boolean validateGERU(Element e, Allocation X, int incX, Allocation Y, int incY, Allocation A) {
+        if (!A.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e) ||
+            !Y.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
+            return false;
+        }
+
+        int M = A.getType().getY();
+        int N = A.getType().getX();
+        if (incX <= 0 || incY <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (M - 1) * incX;
+        if (X.getType().getX() != expectedXDim) {
+            return false;
+        }
+        int expectedYDim = 1 + (N - 1) * incY;
+        if (Y.getType().getX() != expectedYDim) {
+            return false;
+        }
+        return true;
+    }
+
+    private void xGERU_API_test(int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateGERU(elemA, vecX, incX, vecY, incY, matA)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CGERU(alphaC, vecX, incX, vecY, incY, matA);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZGERU(alphaZ, vecX, incX, vecY, incY, matA);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.CGERU(alphaC, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for CGERU");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZGERU(alphaZ, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for ZGERU");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private void L2_xGERU_API(ArrayList<Allocation> mMatrix) {
+        for (int incX : mInc) {
+            for (int incY : mInc) {
+                xGERU_API_test(incX, incY, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_CGERU_API() {
+        L2_xGERU_API(mMatrixC);
+    }
+
+    public void test_L2_ZGERU_API() {
+        L2_xGERU_API(mMatrixZ);
+    }
+
+    public void test_L2_CGERU_Correctness() {
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dM, 1));
+        Allocation vectorYC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        matrixAC.copyFrom(mBLASData.L2_cGERU_A_mn);
+        vectorXC.copyFrom(mBLASData.L2_cGERU_x_m1);
+        vectorYC.copyFrom(mBLASData.L2_cGERU_y_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.CGERU(alphaC, vectorXC, incX, vectorYC, incY, matrixAC);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixARef.copyFrom(mBLASData.L2_cGERU_o_N);
+        verifyMatrix(matrixARef, matrixAC);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dM - 1) * incX;
+        int dimY = 1 + (mBLASData.dN - 1) * incY;
+        vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorYC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimY, 1));
+        vectorXC.copyFrom(mBLASData.L2_cGERU_x_m2);
+        vectorYC.copyFrom(mBLASData.L2_cGERU_y_n2);
+        matrixAC.copyFrom(mBLASData.L2_cGERU_A_mn);
+
+        mBLAS.CGERU(alphaC, vectorXC, incX, vectorYC, incY, matrixAC);
+        verifyMatrix(matrixARef, matrixAC);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_ZGERU_Correctness() {
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dM, 1));
+        Allocation vectorYZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        matrixAZ.copyFrom(mBLASData.L2_zGERU_A_mn);
+        vectorXZ.copyFrom(mBLASData.L2_zGERU_x_m1);
+        vectorYZ.copyFrom(mBLASData.L2_zGERU_y_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.ZGERU(alphaZ, vectorXZ, incX, vectorYZ, incY, matrixAZ);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixARef.copyFrom(mBLASData.L2_zGERU_o_N);
+        verifyMatrix(matrixARef, matrixAZ);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dM - 1) * incX;
+        int dimY = 1 + (mBLASData.dN - 1) * incY;
+        vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorYZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimY, 1));
+        vectorXZ.copyFrom(mBLASData.L2_zGERU_x_m2);
+        vectorYZ.copyFrom(mBLASData.L2_zGERU_y_n2);
+        matrixAZ.copyFrom(mBLASData.L2_zGERU_A_mn);
+
+        mBLAS.ZGERU(alphaZ, vectorXZ, incX, vectorYZ, incY, matrixAZ);
+        verifyMatrix(matrixARef, matrixAZ);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+
+    private void xGERC_API_test(int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateGERU(elemA, vecX, incX, vecY, incY, matA)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CGERC(alphaC, vecX, incX, vecY, incY, matA);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZGERC(alphaZ, vecX, incX, vecY, incY, matA);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.CGERC(alphaC, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for CGERC");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZGERC(alphaZ, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for ZGERC");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private void L2_xGERC_API(ArrayList<Allocation> mMatrix) {
+        for (int incX : mInc) {
+            for (int incY : mInc) {
+                xGERC_API_test(incX, incY, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_CGERC_API() {
+        L2_xGERC_API(mMatrixC);
+    }
+
+    public void test_L2_ZGERC_API() {
+        L2_xGERC_API(mMatrixZ);
+    }
+
+    public void test_L2_CGERC_Correctness() {
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dM, 1));
+        Allocation vectorYC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        matrixAC.copyFrom(mBLASData.L2_cGERC_A_mn);
+        vectorXC.copyFrom(mBLASData.L2_cGERC_x_m1);
+        vectorYC.copyFrom(mBLASData.L2_cGERC_y_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.CGERC(alphaC, vectorXC, incX, vectorYC, incY, matrixAC);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixARef.copyFrom(mBLASData.L2_cGERC_o_N);
+        verifyMatrix(matrixARef, matrixAC);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dM - 1) * incX;
+        int dimY = 1 + (mBLASData.dN - 1) * incY;
+        vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorYC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimY, 1));
+        vectorXC.copyFrom(mBLASData.L2_cGERC_x_m2);
+        vectorYC.copyFrom(mBLASData.L2_cGERC_y_n2);
+        matrixAC.copyFrom(mBLASData.L2_cGERC_A_mn);
+
+        mBLAS.CGERC(alphaC, vectorXC, incX, vectorYC, incY, matrixAC);
+        verifyMatrix(matrixARef, matrixAC);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_ZGERC_Correctness() {
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dM, 1));
+        Allocation vectorYZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        matrixAZ.copyFrom(mBLASData.L2_zGERC_A_mn);
+        vectorXZ.copyFrom(mBLASData.L2_zGERC_x_m1);
+        vectorYZ.copyFrom(mBLASData.L2_zGERC_y_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.ZGERC(alphaZ, vectorXZ, incX, vectorYZ, incY, matrixAZ);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixARef.copyFrom(mBLASData.L2_zGERC_o_N);
+        verifyMatrix(matrixARef, matrixAZ);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dM - 1) * incX;
+        int dimY = 1 + (mBLASData.dN - 1) * incY;
+        vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorYZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimY, 1));
+        vectorXZ.copyFrom(mBLASData.L2_zGERC_x_m2);
+        vectorYZ.copyFrom(mBLASData.L2_zGERC_y_n2);
+        matrixAZ.copyFrom(mBLASData.L2_zGERC_A_mn);
+
+        mBLAS.ZGERC(alphaZ, vectorXZ, incX, vectorYZ, incY, matrixAZ);
+        verifyMatrix(matrixARef, matrixAZ);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private void xHER_API_test(int Uplo, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                Element elemA = matA.getType().getElement();
+                if (validateSYR(elemA, Uplo, vecX, incX, matA)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CHER(Uplo, alphaS, vecX, incX, matA);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZHER(Uplo, alphaD, vecX, incX, matA);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.CHER(Uplo, alphaS, vecX, incX, matA);
+                        fail("should throw RSRuntimeException for CHER");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZHER(Uplo, alphaD, vecX, incX, matA);
+                        fail("should throw RSRuntimeException for ZHER");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xHER_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xHER_API_test(Uplo, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_CHER_API() {
+        L2_xHER_API(mMatrixC);
+    }
+
+    public void test_L2_ZHER_API() {
+        L2_xHER_API(mMatrixZ);
+    }
+
+    public void test_L2_CHER_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        matrixAC.copyFrom(mBLASData.L2_cHER_A_nn);
+        vectorXC.copyFrom(mBLASData.L2_cHER_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.CHER(uplo, alphaS, vectorXC, incX, matrixAC);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixARef.copyFrom(mBLASData.L2_cHER_o_N);
+        verifyMatrix(matrixARef, matrixAC, true);
+
+        // Test for incX = 2;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorXC.copyFrom(mBLASData.L2_cHER_x_n2);
+        matrixAC.copyFrom(mBLASData.L2_cHER_A_nn);
+
+        mBLAS.CHER(uplo, alphaS, vectorXC, incX, matrixAC);
+        verifyMatrix(matrixARef, matrixAC, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_ZHER_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        matrixAZ.copyFrom(mBLASData.L2_zHER_A_nn);
+        vectorXZ.copyFrom(mBLASData.L2_zHER_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.ZHER(uplo, alphaD, vectorXZ, incX, matrixAZ);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixARef.copyFrom(mBLASData.L2_zHER_o_N);
+        verifyMatrix(matrixARef, matrixAZ, true);
+
+        // Test for incX = 2;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorXZ.copyFrom(mBLASData.L2_zHER_x_n2);
+        matrixAZ.copyFrom(mBLASData.L2_zHER_A_nn);
+
+        mBLAS.ZHER(uplo, alphaD, vectorXZ, incX, matrixAZ);
+        verifyMatrix(matrixARef, matrixAZ, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private void xHPR_API_test(int Uplo, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                Element elemA = matA.getType().getElement();
+                if (validateSPR(elemA, Uplo, vecX, incX, matA)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CHPR(Uplo, alphaS, vecX, incX, matA);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZHPR(Uplo, alphaD, vecX, incX, matA);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.CHPR(Uplo, alphaS, vecX, incX, matA);
+                        fail("should throw RSRuntimeException for CHPR");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZHPR(Uplo, alphaD, vecX, incX, matA);
+                        fail("should throw RSRuntimeException for ZHPR");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xHPR_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xHPR_API_test(Uplo, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_CHPR_API() {
+        L2_xHPR_API(mMatrixC);
+    }
+
+    public void test_L2_ZHPR_API() {
+        L2_xHPR_API(mMatrixZ);
+    }
+
+    public void test_L2_CHPR_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), N, 1));
+        matrixAC.copyFrom(mBLASData.L2_cHER_A_nn_pu);
+        vectorXC.copyFrom(mBLASData.L2_cHER_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.CHPR(uplo, alphaS, vectorXC, incX, matrixAC);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), N * (N+1) / 2, 1));
+        matrixARef.copyFrom(mBLASData.L2_cHER_o_N_pu);
+        verifyMatrix(matrixARef, matrixAC, true);
+
+        // Test for incX = 2;
+        incX = 2;
+        int dimX = 1 + (N - 1) * incX;
+        vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorXC.copyFrom(mBLASData.L2_cHER_x_n2);
+        matrixAC.copyFrom(mBLASData.L2_cHER_A_nn_pu);
+
+        mBLAS.CHPR(uplo, alphaS, vectorXC, incX, matrixAC);
+        verifyMatrix(matrixARef, matrixAC, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_ZHPR_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), N, 1));
+        matrixAZ.copyFrom(mBLASData.L2_zHER_A_nn_pu);
+        vectorXZ.copyFrom(mBLASData.L2_zHER_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.ZHPR(uplo, alphaD, vectorXZ, incX, matrixAZ);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), N * (N+1) / 2, 1));
+        matrixARef.copyFrom(mBLASData.L2_zHER_o_N_pu);
+        verifyMatrix(matrixARef, matrixAZ, true);
+
+        // Test for incX = 2;
+        incX = 2;
+        int dimX = 1 + (N - 1) * incX;
+        vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorXZ.copyFrom(mBLASData.L2_zHER_x_n2);
+        matrixAZ.copyFrom(mBLASData.L2_zHER_A_nn_pu);
+
+        mBLAS.ZHPR(uplo, alphaD, vectorXZ, incX, matrixAZ);
+        verifyMatrix(matrixARef, matrixAZ, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private void xHER2_API_test(int Uplo, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSYR2(elemA, Uplo, vecX, incX, vecY, incY, matA)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CHER2(Uplo, alphaC, vecX, incX, vecY, incY, matA);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZHER2(Uplo, alphaZ, vecX, incX, vecY, incY, matA);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.CHER2(Uplo, alphaC, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for CHER2");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZHER2(Uplo, alphaZ, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for ZHER2");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xHER2_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xHER2_API_test(Uplo, incX, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_CHER2_API() {
+        L2_xHER2_API(mMatrixC);
+    }
+
+    public void test_L2_ZHER2_API() {
+        L2_xHER2_API(mMatrixZ);
+    }
+
+    public void test_L2_CHER2_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        Allocation vectorYC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, 1));
+        matrixAC.copyFrom(mBLASData.L2_cHER2_A_nn);
+        vectorXC.copyFrom(mBLASData.L2_cHER2_x_n1);
+        vectorYC.copyFrom(mBLASData.L2_cHER2_y_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.CHER2(uplo, alphaC, vectorXC, incX, vectorYC, incY, matrixAC);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixARef.copyFrom(mBLASData.L2_cHER2_o_N);
+        verifyMatrix(matrixARef, matrixAC, true);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dN - 1) * incY;
+        vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorYC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimY, 1));
+        vectorXC.copyFrom(mBLASData.L2_cHER2_x_n2);
+        vectorYC.copyFrom(mBLASData.L2_cHER2_y_n2);
+        matrixAC.copyFrom(mBLASData.L2_cHER2_A_nn);
+
+        mBLAS.CHER2(uplo, alphaC, vectorXC, incX, vectorYC, incY, matrixAC);
+        verifyMatrix(matrixARef, matrixAC, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_ZHER2_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        Allocation vectorYZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, 1));
+        matrixAZ.copyFrom(mBLASData.L2_zHER2_A_nn);
+        vectorXZ.copyFrom(mBLASData.L2_zHER2_x_n1);
+        vectorYZ.copyFrom(mBLASData.L2_zHER2_y_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.ZHER2(uplo, alphaZ, vectorXZ, incX, vectorYZ, incY, matrixAZ);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixARef.copyFrom(mBLASData.L2_zHER2_o_N);
+        verifyMatrix(matrixARef, matrixAZ, true);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dN - 1) * incY;
+        vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorYZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimY, 1));
+        vectorXZ.copyFrom(mBLASData.L2_zHER2_x_n2);
+        vectorYZ.copyFrom(mBLASData.L2_zHER2_y_n2);
+        matrixAZ.copyFrom(mBLASData.L2_zHER2_A_nn);
+
+        mBLAS.ZHER2(uplo, alphaZ, vectorXZ, incX, vectorYZ, incY, matrixAZ);
+        verifyMatrix(matrixARef, matrixAZ, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+
+    private void xHPR2_API_test(int Uplo, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSPR2(elemA, Uplo, vecX, incX, vecY, incY, matA)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CHPR2(Uplo, alphaC, vecX, incX, vecY, incY, matA);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZHPR2(Uplo, alphaZ, vecX, incX, vecY, incY, matA);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.CHPR2(Uplo, alphaC, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for CHPR2");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZHPR2(Uplo, alphaZ, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for ZHPR2");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xHPR2_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xHPR2_API_test(Uplo, incX, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_CHPR2_API() {
+        L2_xHPR2_API(mMatrixC);
+    }
+
+    public void test_L2_ZHPR2_API() {
+        L2_xHPR2_API(mMatrixZ);
+    }
+
+    public void test_L2_CHPR2_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), N, 1));
+        Allocation vectorYC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), N, 1));
+        matrixAC.copyFrom(mBLASData.L2_cHER2_A_nn_pu);
+        vectorXC.copyFrom(mBLASData.L2_cHER2_x_n1);
+        vectorYC.copyFrom(mBLASData.L2_cHER2_y_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.CHPR2(uplo, alphaC, vectorXC, incX, vectorYC, incY, matrixAC);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), N * (N+1) / 2, 1));
+        matrixARef.copyFrom(mBLASData.L2_cHER2_o_N_pu);
+        verifyMatrix(matrixARef, matrixAC, true);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (N - 1) * incX;
+        int dimY = 1 + (N - 1) * incY;
+        vectorXC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimX, 1));
+        vectorYC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), dimY, 1));
+        vectorXC.copyFrom(mBLASData.L2_cHER2_x_n2);
+        vectorYC.copyFrom(mBLASData.L2_cHER2_y_n2);
+        matrixAC.copyFrom(mBLASData.L2_cHER2_A_nn_pu);
+
+        mBLAS.CHPR2(uplo, alphaC, vectorXC, incX, vectorYC, incY, matrixAC);
+        verifyMatrix(matrixARef, matrixAC, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_ZHPR2_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), N, 1));
+        Allocation vectorYZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), N, 1));
+        matrixAZ.copyFrom(mBLASData.L2_zHER2_A_nn_pu);
+        vectorXZ.copyFrom(mBLASData.L2_zHER2_x_n1);
+        vectorYZ.copyFrom(mBLASData.L2_zHER2_y_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.ZHPR2(uplo, alphaZ, vectorXZ, incX, vectorYZ, incY, matrixAZ);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), N * (N+1) / 2, 1));
+        matrixARef.copyFrom(mBLASData.L2_zHER2_o_N_pu);
+        verifyMatrix(matrixARef, matrixAZ, true);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (N - 1) * incX;
+        int dimY = 1 + (N - 1) * incY;
+        vectorXZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimX, 1));
+        vectorYZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), dimY, 1));
+        vectorXZ.copyFrom(mBLASData.L2_zHER2_x_n2);
+        vectorYZ.copyFrom(mBLASData.L2_zHER2_y_n2);
+        matrixAZ.copyFrom(mBLASData.L2_zHER2_A_nn_pu);
+
+        mBLAS.ZHPR2(uplo, alphaZ, vectorXZ, incX, vectorYZ, incY, matrixAZ);
+        verifyMatrix(matrixARef, matrixAZ, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+
+    private boolean validateSYR(Element e, int Uplo, Allocation X, int incX, Allocation A) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!A.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+
+        int N = A.getType().getX();
+
+        if (X.getType().getY() > 1) {
+            return false;
+        }
+        if (N != A.getType().getY()) {
+            return false;
+        }
+        if (incX <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (N - 1) * incX;
+        if (X.getType().getX() != expectedXDim) {
+            return false;
+        }
+        return true;
+    }
+
+    private void xSYR_API_test(int Uplo, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                Element elemA = matA.getType().getElement();
+                if (validateSYR(elemA, Uplo, vecX, incX, matA)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.SSYR(Uplo, alphaS, vecX, incX, matA);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DSYR(Uplo, alphaD, vecX, incX, matA);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.SSYR(Uplo, alphaS, vecX, incX, matA);
+                        fail("should throw RSRuntimeException for SSYR");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DSYR(Uplo, alphaD, vecX, incX, matA);
+                        fail("should throw RSRuntimeException for DSYR");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xSYR_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xSYR_API_test(Uplo, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_SSYR_API() {
+        L2_xSYR_API(mMatrixS);
+    }
+
+    public void test_L2_DSYR_API() {
+        L2_xSYR_API(mMatrixD);
+    }
+
+    public void test_L2_SSYR_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        matrixAS.copyFrom(mBLASData.L2_sSYR_A_nn);
+        vectorXS.copyFrom(mBLASData.L2_sSYR_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.SSYR(uplo, alphaS, vectorXS, incX, matrixAS);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dN));
+        matrixARef.copyFrom(mBLASData.L2_sSYR_o_N);
+        verifyMatrix(matrixARef, matrixAS, true);
+
+        // Test for incX = 2;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorXS.copyFrom(mBLASData.L2_sSYR_x_n2);
+        matrixAS.copyFrom(mBLASData.L2_sSYR_A_nn);
+
+        mBLAS.SSYR(uplo, alphaS, vectorXS, incX, matrixAS);
+        verifyMatrix(matrixARef, matrixAS, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_DSYR_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+
+        // Populate input allocations
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        matrixAD.copyFrom(mBLASData.L2_dSYR_A_nn);
+        vectorXD.copyFrom(mBLASData.L2_dSYR_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.DSYR(uplo, alphaD, vectorXD, incX, matrixAD);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dN));
+        matrixARef.copyFrom(mBLASData.L2_dSYR_o_N);
+        verifyMatrix(matrixARef, matrixAD, true);
+
+        // Test for incX = 2;
+        incX = 2;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorXD.copyFrom(mBLASData.L2_dSYR_x_n2);
+        matrixAD.copyFrom(mBLASData.L2_dSYR_A_nn);
+
+        mBLAS.DSYR(uplo, alphaD, vectorXD, incX, matrixAD);
+        verifyMatrix(matrixARef, matrixAD, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private boolean validateSPR(Element e, int Uplo, Allocation X, int incX, Allocation Ap) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!Ap.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        if (X.getType().getY() > 1) {
+            return false;
+        }
+
+        if (Ap.getType().getY() > 1) {
+            return false;
+        }
+
+        int N = (int)Math.sqrt((double)Ap.getType().getX() * 2);
+        if (Ap.getType().getX() != ((N * (N+1)) / 2)) {
+            return false;
+        }
+        if (incX <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (N - 1) * incX;
+        if (X.getType().getX() != expectedXDim) {
+            return false;
+        }
+
+        return true;
+    }
+
+    private void xSPR_API_test(int Uplo, int incX, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                Element elemA = matA.getType().getElement();
+                if (validateSPR(elemA, Uplo, vecX, incX, matA)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.SSPR(Uplo, alphaS, vecX, incX, matA);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DSPR(Uplo, alphaD, vecX, incX, matA);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.SSPR(Uplo, alphaS, vecX, incX, matA);
+                        fail("should throw RSRuntimeException for SSPR");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DSPR(Uplo, alphaD, vecX, incX, matA);
+                        fail("should throw RSRuntimeException for DSPR");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xSPR_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xSPR_API_test(Uplo, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_SSPR_API() {
+        L2_xSPR_API(mMatrixS);
+    }
+
+    public void test_L2_DSPR_API() {
+        L2_xSPR_API(mMatrixD);
+    }
+
+    public void test_L2_SSPR_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), N, 1));
+        matrixAS.copyFrom(mBLASData.L2_sSYR_A_nn_pu);
+        vectorXS.copyFrom(mBLASData.L2_sSYR_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.SSPR(uplo, alphaS, vectorXS, incX, matrixAS);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), N * (N+1) / 2, 1));
+        matrixARef.copyFrom(mBLASData.L2_sSYR_o_N_pu);
+        verifyMatrix(matrixARef, matrixAS, true);
+
+        // Test for incX = 2;
+        incX = 2;
+        int dimX = 1 + (N - 1) * incX;
+        vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorXS.copyFrom(mBLASData.L2_sSYR_x_n2);
+        matrixAS.copyFrom(mBLASData.L2_sSYR_A_nn_pu);
+
+        mBLAS.SSPR(uplo, alphaS, vectorXS, incX, matrixAS);
+        verifyMatrix(matrixARef, matrixAS, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_DSPR_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), N, 1));
+        matrixAD.copyFrom(mBLASData.L2_dSYR_A_nn_pu);
+        vectorXD.copyFrom(mBLASData.L2_dSYR_x_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.DSPR(uplo, alphaD, vectorXD, incX, matrixAD);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), N * (N+1) / 2, 1));
+        matrixARef.copyFrom(mBLASData.L2_dSYR_o_N_pu);
+        verifyMatrix(matrixARef, matrixAD, true);
+
+        // Test for incX = 2;
+        incX = 2;
+        int dimX = 1 + (N - 1) * incX;
+        vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorXD.copyFrom(mBLASData.L2_dSYR_x_n2);
+        matrixAD.copyFrom(mBLASData.L2_dSYR_A_nn_pu);
+
+        mBLAS.DSPR(uplo, alphaD, vectorXD, incX, matrixAD);
+        verifyMatrix(matrixARef, matrixAD, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private boolean validateSYR2(Element e, int Uplo, Allocation X, int incX, Allocation Y, int incY, Allocation A) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!A.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e) ||
+            !Y.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+
+        if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
+            return false;
+        }
+
+        int N = A.getType().getX();
+
+        if (N != A.getType().getY()) {
+            return false;
+        }
+        if (incX <= 0 || incY <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (N - 1) * incX;
+        int expectedYDim = 1 + (N - 1) * incY;
+        if (X.getType().getX() != expectedXDim || Y.getType().getX() != expectedYDim) {
+            return false;
+        }
+        return true;
+    }
+
+    private void xSYR2_API_test(int Uplo, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSYR2(elemA, Uplo, vecX, incX, vecY, incY, matA)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SSYR2(Uplo, alphaS, vecX, incX, vecY, incY, matA);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DSYR2(Uplo, alphaD, vecX, incX, vecY, incY, matA);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SSYR2(Uplo, alphaS, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for SSYR2");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DSYR2(Uplo, alphaD, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for DSYR2");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xSYR2_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xSYR2_API_test(Uplo, incX, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_SSYR2_API() {
+        L2_xSYR2_API(mMatrixS);
+    }
+
+    public void test_L2_DSYR2_API() {
+        L2_xSYR2_API(mMatrixD);
+    }
+
+    public void test_L2_SSYR2_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        Allocation vectorYS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, 1));
+        matrixAS.copyFrom(mBLASData.L2_sSYR2_A_nn);
+        vectorXS.copyFrom(mBLASData.L2_sSYR2_x_n1);
+        vectorYS.copyFrom(mBLASData.L2_sSYR2_y_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.SSYR2(uplo, alphaS, vectorXS, incX, vectorYS, incY, matrixAS);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dN));
+        matrixARef.copyFrom(mBLASData.L2_sSYR2_o_N);
+        verifyMatrix(matrixARef, matrixAS, true);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dN - 1) * incY;
+        vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorYS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimY, 1));
+        vectorXS.copyFrom(mBLASData.L2_sSYR2_x_n2);
+        vectorYS.copyFrom(mBLASData.L2_sSYR2_y_n2);
+        matrixAS.copyFrom(mBLASData.L2_sSYR2_A_nn);
+
+        mBLAS.SSYR2(uplo, alphaS, vectorXS, incX, vectorYS, incY, matrixAS);
+        verifyMatrix(matrixARef, matrixAS, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_DSYR2_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dN));
+        Allocation vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        Allocation vectorYD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, 1));
+        matrixAD.copyFrom(mBLASData.L2_dSYR2_A_nn);
+        vectorXD.copyFrom(mBLASData.L2_dSYR2_x_n1);
+        vectorYD.copyFrom(mBLASData.L2_dSYR2_y_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.DSYR2(uplo, alphaD, vectorXD, incX, vectorYD, incY, matrixAD);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dN));
+        matrixARef.copyFrom(mBLASData.L2_dSYR2_o_N);
+        verifyMatrix(matrixARef, matrixAD, true);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (mBLASData.dN - 1) * incX;
+        int dimY = 1 + (mBLASData.dN - 1) * incY;
+        vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorYD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimY, 1));
+        vectorXD.copyFrom(mBLASData.L2_dSYR2_x_n2);
+        vectorYD.copyFrom(mBLASData.L2_dSYR2_y_n2);
+        matrixAD.copyFrom(mBLASData.L2_dSYR2_A_nn);
+
+        mBLAS.DSYR2(uplo, alphaD, vectorXD, incX, vectorYD, incY, matrixAD);
+        verifyMatrix(matrixARef, matrixAD, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private boolean validateSPR2(Element e, int Uplo, Allocation X, int incX, Allocation Y, int incY, Allocation Ap) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!Ap.getType().getElement().isCompatible(e) ||
+            !X.getType().getElement().isCompatible(e) ||
+            !Y.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        if (X.getType().getY() > 1 || Y.getType().getY() > 1) {
+            return false;
+        }
+
+        if (Ap.getType().getY() > 1) {
+            return false;
+        }
+
+        int N = (int)Math.sqrt((double)Ap.getType().getX() * 2);
+        if (Ap.getType().getX() != ((N * (N+1)) / 2)) {
+            return false;
+        }
+        if (incX <= 0 || incY <= 0) {
+            return false;
+        }
+        int expectedXDim = 1 + (N - 1) * incX;
+        int expectedYDim = 1 + (N - 1) * incY;
+        if (X.getType().getX() != expectedXDim || Y.getType().getX() != expectedYDim) {
+            return false;
+        }
+
+        return true;
+    }
+
+    private void xSPR2_API_test(int Uplo, int incX, int incY, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation vecX : mMatrix) {
+                if (!validateVecInput(vecX)) {
+                    continue;
+                }
+                for (Allocation vecY : mMatrix) {
+                    if (!validateVecInput(vecY)) {
+                        continue;
+                    }
+                    Element elemA = matA.getType().getElement();
+                    if (validateSPR2(elemA, Uplo, vecX, incX, vecY, incY, matA)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SSPR2(Uplo, alphaS, vecX, incX, vecY, incY, matA);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DSPR2(Uplo, alphaD, vecX, incX, vecY, incY, matA);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SSPR2(Uplo, alphaS, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for SSPR2");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DSPR2(Uplo, alphaD, vecX, incX, vecY, incY, matA);
+                            fail("should throw RSRuntimeException for DSPR2");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L2_xSPR2_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int incX : mInc) {
+                xSPR2_API_test(Uplo, incX, incX, mMatrix);
+            }
+        }
+    }
+
+    public void test_L2_SSPR2_API() {
+        L2_xSPR2_API(mMatrixS);
+    }
+
+    public void test_L2_DSPR2_API() {
+        L2_xSPR2_API(mMatrixD);
+    }
+
+    public void test_L2_SSPR2_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), N, 1));
+        Allocation vectorYS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), N, 1));
+        matrixAS.copyFrom(mBLASData.L2_sSYR2_A_nn_pu);
+        vectorXS.copyFrom(mBLASData.L2_sSYR2_x_n1);
+        vectorYS.copyFrom(mBLASData.L2_sSYR2_y_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.SSPR2(uplo, alphaS, vectorXS, incX, vectorYS, incY, matrixAS);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), N * (N+1) / 2, 1));
+        matrixARef.copyFrom(mBLASData.L2_sSYR2_o_N_pu);
+        verifyMatrix(matrixARef, matrixAS, true);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (N - 1) * incX;
+        int dimY = 1 + (N - 1) * incY;
+        vectorXS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimX, 1));
+        vectorYS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), dimY, 1));
+        vectorXS.copyFrom(mBLASData.L2_sSYR2_x_n2);
+        vectorYS.copyFrom(mBLASData.L2_sSYR2_y_n2);
+        matrixAS.copyFrom(mBLASData.L2_sSYR2_A_nn_pu);
+
+        mBLAS.SSPR2(uplo, alphaS, vectorXS, incX, vectorYS, incY, matrixAS);
+        verifyMatrix(matrixARef, matrixAS, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L2_DSPR2_Correctness() {
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int incX = 1;
+        int incY = 1;
+
+        // Populate input allocations
+        int N = mBLASData.dN;
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), N * (N+1) / 2, 1));
+        Allocation vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), N, 1));
+        Allocation vectorYD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), N, 1));
+        matrixAD.copyFrom(mBLASData.L2_dSYR2_A_nn_pu);
+        vectorXD.copyFrom(mBLASData.L2_dSYR2_x_n1);
+        vectorYD.copyFrom(mBLASData.L2_dSYR2_y_n1);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.DSPR2(uplo, alphaD, vectorXD, incX, vectorYD, incY, matrixAD);
+        Allocation matrixARef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), N * (N+1) / 2, 1));
+        matrixARef.copyFrom(mBLASData.L2_dSYR2_o_N_pu);
+        verifyMatrix(matrixARef, matrixAD, true);
+
+        // Test for incX = 2 & incY = 3;
+        incX = 2;
+        incY = 3;
+        int dimX = 1 + (N - 1) * incX;
+        int dimY = 1 + (N - 1) * incY;
+        vectorXD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimX, 1));
+        vectorYD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), dimY, 1));
+        vectorXD.copyFrom(mBLASData.L2_dSYR2_x_n2);
+        vectorYD.copyFrom(mBLASData.L2_dSYR2_y_n2);
+        matrixAD.copyFrom(mBLASData.L2_dSYR2_A_nn_pu);
+
+        mBLAS.DSPR2(uplo, alphaD, vectorXD, incX, vectorYD, incY, matrixAD);
+        verifyMatrix(matrixARef, matrixAD, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+
+    private boolean validateL3(Element e, int TransA, int TransB, int Side, Allocation A, Allocation B, Allocation C) {
+        int aM = -1, aN = -1, bM = -1, bN = -1, cM = -1, cN = -1;
+        if ((A != null && !A.getType().getElement().isCompatible(e)) ||
+            (B != null && !B.getType().getElement().isCompatible(e)) ||
+            (C != null && !C.getType().getElement().isCompatible(e))) {
+            return false;
+        }
+        if (C == null) {
+            //since matrix C is used to store the result, it cannot be null.
+            return false;
+        }
+        cM = C.getType().getY();
+        cN = C.getType().getX();
+
+        if (Side == ScriptIntrinsicBLAS.RIGHT) {
+            if ((A == null && B != null) || (A != null && B == null)) {
+                return false;
+            }
+            if (B != null) {
+                bM = A.getType().getY();
+                bN = A.getType().getX();
+            }
+            if (A != null) {
+                aM = B.getType().getY();
+                aN = B.getType().getX();
+            }
+        } else {
+            if (A != null) {
+                if (TransA == ScriptIntrinsicBLAS.TRANSPOSE ||
+                    TransA == ScriptIntrinsicBLAS.CONJ_TRANSPOSE ) {
+                    aN = A.getType().getY();
+                    aM = A.getType().getX();
+                } else {
+                    aM = A.getType().getY();
+                    aN = A.getType().getX();
+                }
+            }
+            if (B != null) {
+                if (TransB == ScriptIntrinsicBLAS.TRANSPOSE ||
+                    TransB == ScriptIntrinsicBLAS.CONJ_TRANSPOSE ) {
+                    bN = B.getType().getY();
+                    bM = B.getType().getX();
+                } else {
+                    bM = B.getType().getY();
+                    bN = B.getType().getX();
+                }
+            }
+        }
+        if (A != null && B != null && C != null) {
+            if (aN != bM || aM != cM || bN != cN) {
+                return false;
+            }
+        } else if (A != null && C != null) {
+            // A and C only, for SYRK
+            if (cM != cN) {
+                return false;
+            }
+            if (aM != cM) {
+                return false;
+            }
+        } else if (A != null && B != null) {
+            // A and B only
+            if (aN != bM) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private boolean validateL3_xGEMM(Element e, int TransA, int TransB, Allocation A, Allocation B, Allocation C) {
+        boolean result = true;
+        result &= validateTranspose(TransA);
+        result &= validateTranspose(TransB);
+        result &= validateL3(e, TransA, TransB, 0, A, B, C);
+
+        return result;
+    }
+
+    private void xGEMM_API_test(int transA, int transB, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation matB : mMatrix) {
+                for (Allocation matC : mMatrix) {
+                    Element elemA = matA.getType().getElement();
+                    if (validateL3_xGEMM(elemA, transA, transB, matA, matB, matC)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SGEMM(transA, transB, alphaS, matA, matB, betaS, matC);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DGEMM(transA, transB, alphaD, matA, matB, betaD, matC);
+                            } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CGEMM(transA, transB, alphaC, matA, matB, betaC, matC);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZGEMM(transA, transB, alphaZ, matA, matB, betaZ, matC);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SGEMM(transA, transB, alphaS, matA, matB, betaS, matC);
+                            fail("should throw RSRuntimeException for SGEMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DGEMM(transA, transB, alphaD, matA, matB, betaD, matC);
+                            fail("should throw RSRuntimeException for DGEMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.CGEMM(transA, transB, alphaC, matA, matB, betaC, matC);
+                            fail("should throw RSRuntimeException for CGEMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZGEMM(transA, transB, alphaZ, matA, matB, betaZ, matC);
+                            fail("should throw RSRuntimeException for ZGEMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private void L3_xGEMM_API(ArrayList<Allocation> mMatrix) {
+        for (int transA : mTranspose) {
+            for (int transB : mTranspose) {
+                xGEMM_API_test(transA, transB, mMatrix);
+            }
+        }
+    }
+
+    public void test_L3_SGEMM_API() {
+        L3_xGEMM_API(mMatrixS);
+    }
+
+    public void test_L3_DGEMM_API() {
+        L3_xGEMM_API(mMatrixD);
+    }
+
+    public void test_L3_CGEMM_API() {
+        L3_xGEMM_API(mMatrixC);
+    }
+
+    public void test_L3_ZGEMM_API() {
+        L3_xGEMM_API(mMatrixZ);
+    }
+
+
+    public void test_L3_SGEMM_Correctness() {
+        int transA = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int transB = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+
+        // Populate input allocations
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dK, mBLASData.dM));
+        Allocation matrixBS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dK));
+        Allocation matrixCS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dM));
+        matrixAS.copyFrom(mBLASData.L3_sGEMM_A_mk);
+        matrixBS.copyFrom(mBLASData.L3_sGEMM_B_kn);
+        matrixCS.copyFrom(mBLASData.L3_sGEMM_C_mn);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.SGEMM(transA, transB, alphaS, matrixAS, matrixBS, betaS, matrixCS);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dM));
+        matrixCRef.copyFrom(mBLASData.L3_sGEMM_o_NN);
+        verifyMatrix(matrixCRef, matrixCS);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dM, mBLASData.dK));
+        matrixBS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dK, mBLASData.dN));
+        matrixAS.copyFrom(mBLASData.L3_sGEMM_A_km);
+        matrixBS.copyFrom(mBLASData.L3_sGEMM_B_nk);
+
+        transA = ScriptIntrinsicBLAS.TRANSPOSE;
+        transB = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCS.copyFrom(mBLASData.L3_sGEMM_C_mn);
+        mBLAS.SGEMM(transA, transB, alphaS, matrixAS, matrixBS, betaS, matrixCS);
+        matrixCRef.copyFrom(mBLASData.L3_sGEMM_o_TT);
+        verifyMatrix(matrixCRef, matrixCS);
+
+        transA = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        transB = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        matrixCS.copyFrom(mBLASData.L3_sGEMM_C_mn);
+        mBLAS.SGEMM(transA, transB, alphaS, matrixAS, matrixBS, betaS, matrixCS);
+        matrixCRef.copyFrom(mBLASData.L3_sGEMM_o_HH);
+        verifyMatrix(matrixCRef, matrixCS);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_DGEMM_Correctness() {
+        int transA = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int transB = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+
+        // Populate input allocations
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dK, mBLASData.dM));
+        Allocation matrixBD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dK));
+        Allocation matrixCD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dM));
+        matrixAD.copyFrom(mBLASData.L3_dGEMM_A_mk);
+        matrixBD.copyFrom(mBLASData.L3_dGEMM_B_kn);
+        matrixCD.copyFrom(mBLASData.L3_dGEMM_C_mn);
+        // Test for the default case: NO_TRANS
+        mBLAS.DGEMM(transA, transB, alphaD, matrixAD, matrixBD, betaD, matrixCD);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dM));
+        matrixCRef.copyFrom(mBLASData.L3_dGEMM_o_NN);
+        verifyMatrix(matrixCRef, matrixCD);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dM, mBLASData.dK));
+        matrixBD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dK, mBLASData.dN));
+        matrixAD.copyFrom(mBLASData.L3_dGEMM_A_km);
+        matrixBD.copyFrom(mBLASData.L3_dGEMM_B_nk);
+
+        transA = ScriptIntrinsicBLAS.TRANSPOSE;
+        transB = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCD.copyFrom(mBLASData.L3_dGEMM_C_mn);
+        mBLAS.DGEMM(transA, transB, alphaD, matrixAD, matrixBD, betaD, matrixCD);
+        matrixCRef.copyFrom(mBLASData.L3_dGEMM_o_TT);
+        verifyMatrix(matrixCRef, matrixCD);
+
+        transA = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        transB = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        matrixCD.copyFrom(mBLASData.L3_dGEMM_C_mn);
+        mBLAS.DGEMM(transA, transB, alphaD, matrixAD, matrixBD, betaD, matrixCD);
+        matrixCRef.copyFrom(mBLASData.L3_dGEMM_o_HH);
+        verifyMatrix(matrixCRef, matrixCD);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_CGEMM_Correctness() {
+        int transA = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int transB = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dK, mBLASData.dM));
+        Allocation matrixBC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dK));
+        Allocation matrixCC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixAC.copyFrom(mBLASData.L3_cGEMM_A_mk);
+        matrixBC.copyFrom(mBLASData.L3_cGEMM_B_kn);
+        matrixCC.copyFrom(mBLASData.L3_cGEMM_C_mn);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.CGEMM(transA, transB, alphaC, matrixAC, matrixBC, betaC, matrixCC);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixCRef.copyFrom(mBLASData.L3_cGEMM_o_NN);
+        verifyMatrix(matrixCRef, matrixCC);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dM, mBLASData.dK));
+        matrixBC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dK, mBLASData.dN));
+        matrixAC.copyFrom(mBLASData.L3_cGEMM_A_km);
+        matrixBC.copyFrom(mBLASData.L3_cGEMM_B_nk);
+
+        transA = ScriptIntrinsicBLAS.TRANSPOSE;
+        transB = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCC.copyFrom(mBLASData.L3_cGEMM_C_mn);
+        mBLAS.CGEMM(transA, transB, alphaC, matrixAC, matrixBC, betaC, matrixCC);
+        matrixCRef.copyFrom(mBLASData.L3_cGEMM_o_TT);
+        verifyMatrix(matrixCRef, matrixCC);
+
+        transA = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        transB = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        matrixCC.copyFrom(mBLASData.L3_cGEMM_C_mn);
+        mBLAS.CGEMM(transA, transB, alphaC, matrixAC, matrixBC, betaC, matrixCC);
+        matrixCRef.copyFrom(mBLASData.L3_cGEMM_o_HH);
+        verifyMatrix(matrixCRef, matrixCC);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_ZGEMM_Correctness() {
+        int transA = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int transB = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dK, mBLASData.dM));
+        Allocation matrixBZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dK));
+        Allocation matrixCZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixAZ.copyFrom(mBLASData.L3_zGEMM_A_mk);
+        matrixBZ.copyFrom(mBLASData.L3_zGEMM_B_kn);
+        matrixCZ.copyFrom(mBLASData.L3_zGEMM_C_mn);
+
+        // Test for the default case: NO_TRANS
+        mBLAS.ZGEMM(transA, transB, alphaZ, matrixAZ, matrixBZ, betaZ, matrixCZ);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixCRef.copyFrom(mBLASData.L3_zGEMM_o_NN);
+        verifyMatrix(matrixCRef, matrixCZ);
+
+        // Test for trans cases: TRANSPOSE, CONJ_TRANSPOSE
+        matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dM, mBLASData.dK));
+        matrixBZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dK, mBLASData.dN));
+        matrixAZ.copyFrom(mBLASData.L3_zGEMM_A_km);
+        matrixBZ.copyFrom(mBLASData.L3_zGEMM_B_nk);
+
+        transA = ScriptIntrinsicBLAS.TRANSPOSE;
+        transB = ScriptIntrinsicBLAS.TRANSPOSE;
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCZ.copyFrom(mBLASData.L3_zGEMM_C_mn);
+        mBLAS.ZGEMM(transA, transB, alphaZ, matrixAZ, matrixBZ, betaZ, matrixCZ);
+        matrixCRef.copyFrom(mBLASData.L3_zGEMM_o_TT);
+        verifyMatrix(matrixCRef, matrixCZ);
+
+        transA = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        transB = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        matrixCZ.copyFrom(mBLASData.L3_zGEMM_C_mn);
+        mBLAS.ZGEMM(transA, transB, alphaZ, matrixAZ, matrixBZ, betaZ, matrixCZ);
+        matrixCRef.copyFrom(mBLASData.L3_zGEMM_o_HH);
+        verifyMatrix(matrixCRef, matrixCZ);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+
+    private boolean validateL3_xSYMM(Element e, int Side, int Uplo, Allocation A, Allocation B, Allocation C) {
+        boolean result = true;
+        result &= validateSide(Side);
+        result &= validateUplo(Uplo);
+        result &= validateL3(e, 0, 0, Side, A, B, C);
+        result &= (A.getType().getX() == A.getType().getY());
+        return result;
+    }
+
+    private void xSYMM_API_test(int Side, int Uplo, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation matB : mMatrix) {
+                for (Allocation matC : mMatrix) {
+                    Element elemA = matA.getType().getElement();
+                    if (validateL3_xSYMM(elemA, Side, Uplo, matA, matB, matC)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SSYMM(Side, Uplo, alphaS, matA, matB, betaS, matC);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DSYMM(Side, Uplo, alphaD, matA, matB, betaD, matC);
+                            } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CSYMM(Side, Uplo, alphaC, matA, matB, betaC, matC);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZSYMM(Side, Uplo, alphaZ, matA, matB, betaZ, matC);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SSYMM(Side, Uplo, alphaS, matA, matB, betaS, matC);
+                            fail("should throw RSRuntimeException for SSYMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DSYMM(Side, Uplo, alphaD, matA, matB, betaD, matC);
+                            fail("should throw RSRuntimeException for DSYMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.CSYMM(Side, Uplo, alphaC, matA, matB, betaC, matC);
+                            fail("should throw RSRuntimeException for CSYMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZSYMM(Side, Uplo, alphaZ, matA, matB, betaZ, matC);
+                            fail("should throw RSRuntimeException for ZSYMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private void L3_xSYMM_API(ArrayList<Allocation> mMatrix) {
+        for (int Side : mSide) {
+            for (int Uplo : mUplo) {
+                xSYMM_API_test(Side, Uplo, mMatrix);
+            }
+        }
+    }
+
+    public void test_L3_SSYMM_API() {
+        L3_xSYMM_API(mMatrixS);
+    }
+
+    public void test_L3_DSYMM_API() {
+        L3_xSYMM_API(mMatrixD);
+    }
+
+    public void test_L3_CSYMM_API() {
+        L3_xSYMM_API(mMatrixC);
+    }
+
+    public void test_L3_ZSYMM_API() {
+        L3_xSYMM_API(mMatrixZ);
+    }
+
+
+    public void test_L3_SSYMM_Correctness() {
+        int side = ScriptIntrinsicBLAS.LEFT;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+
+        // Populate input allocations
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dM, mBLASData.dM));
+        Allocation matrixBS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation matrixCS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dM));
+        matrixAS.copyFrom(mBLASData.L3_sSYMM_A_mm);
+        matrixBS.copyFrom(mBLASData.L3_sSYMM_B_mn);
+        matrixCS.copyFrom(mBLASData.L3_sSYMM_C_mn);
+
+        // Default case: SIDE = LEFT
+        mBLAS.SSYMM(side, uplo, alphaS, matrixAS, matrixBS, betaS, matrixCS);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dM));
+        matrixCRef.copyFrom(mBLASData.L3_sSYMM_o_L);
+        verifyMatrix(matrixCRef, matrixCS);
+
+        // SIDE = RIGHT
+        side = ScriptIntrinsicBLAS.RIGHT;
+        matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAS.copyFrom(mBLASData.L3_sSYMM_A_nn);
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCS.copyFrom(mBLASData.L3_sSYMM_C_mn);
+        mBLAS.SSYMM(side, uplo, alphaS, matrixAS, matrixBS, betaS, matrixCS);
+        matrixCRef.copyFrom(mBLASData.L3_sSYMM_o_R);
+        verifyMatrix(matrixCRef, matrixCS);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_DSYMM_Correctness() {
+        int side = ScriptIntrinsicBLAS.LEFT;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+
+        // Populate input allocations
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dM, mBLASData.dM));
+        Allocation matrixBD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation matrixCD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dM));
+        matrixAD.copyFrom(mBLASData.L3_dSYMM_A_mm);
+        matrixBD.copyFrom(mBLASData.L3_dSYMM_B_mn);
+        matrixCD.copyFrom(mBLASData.L3_dSYMM_C_mn);
+
+        // Default case: SIDE = LEFT
+        mBLAS.DSYMM(side, uplo, alphaD, matrixAD, matrixBD, betaD, matrixCD);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dM));
+        matrixCRef.copyFrom(mBLASData.L3_dSYMM_o_L);
+        verifyMatrix(matrixCRef, matrixCD);
+
+        // SIDE = RIGHT
+        side = ScriptIntrinsicBLAS.RIGHT;
+        matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAD.copyFrom(mBLASData.L3_dSYMM_A_nn);
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCD.copyFrom(mBLASData.L3_dSYMM_C_mn);
+        mBLAS.DSYMM(side, uplo, alphaD, matrixAD, matrixBD, betaD, matrixCD);
+        matrixCRef.copyFrom(mBLASData.L3_dSYMM_o_R);
+        verifyMatrix(matrixCRef, matrixCD);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_CSYMM_Correctness() {
+        int side = ScriptIntrinsicBLAS.LEFT;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dM, mBLASData.dM));
+        Allocation matrixBC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation matrixCC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixAC.copyFrom(mBLASData.L3_cSYMM_A_mm);
+        matrixBC.copyFrom(mBLASData.L3_cSYMM_B_mn);
+        matrixCC.copyFrom(mBLASData.L3_cSYMM_C_mn);
+
+        // Default case: SIDE = LEFT
+        mBLAS.CSYMM(side, uplo, alphaC, matrixAC, matrixBC, betaC, matrixCC);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixCRef.copyFrom(mBLASData.L3_cSYMM_o_L);
+        verifyMatrix(matrixCRef, matrixCC);
+
+        // SIDE = RIGHT
+        side = ScriptIntrinsicBLAS.RIGHT;
+        matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAC.copyFrom(mBLASData.L3_cSYMM_A_nn);
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCC.copyFrom(mBLASData.L3_cSYMM_C_mn);
+        mBLAS.CSYMM(side, uplo, alphaC, matrixAC, matrixBC, betaC, matrixCC);
+        matrixCRef.copyFrom(mBLASData.L3_cSYMM_o_R);
+        verifyMatrix(matrixCRef, matrixCC);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_ZSYMM_Correctness() {
+        int side = ScriptIntrinsicBLAS.LEFT;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dM, mBLASData.dM));
+        Allocation matrixBZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation matrixCZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixAZ.copyFrom(mBLASData.L3_zSYMM_A_mm);
+        matrixBZ.copyFrom(mBLASData.L3_zSYMM_B_mn);
+        matrixCZ.copyFrom(mBLASData.L3_zSYMM_C_mn);
+
+        // Default case: SIDE = LEFT
+        mBLAS.ZSYMM(side, uplo, alphaZ, matrixAZ, matrixBZ, betaZ, matrixCZ);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixCRef.copyFrom(mBLASData.L3_zSYMM_o_L);
+        verifyMatrix(matrixCRef, matrixCZ);
+
+        // SIDE = RIGHT
+        side = ScriptIntrinsicBLAS.RIGHT;
+        matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAZ.copyFrom(mBLASData.L3_zSYMM_A_nn);
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCZ.copyFrom(mBLASData.L3_zSYMM_C_mn);
+        mBLAS.ZSYMM(side, uplo, alphaZ, matrixAZ, matrixBZ, betaZ, matrixCZ);
+        matrixCRef.copyFrom(mBLASData.L3_zSYMM_o_R);
+        verifyMatrix(matrixCRef, matrixCZ);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private boolean validateHEMM(Element e, int Side, int Uplo, Allocation A, Allocation B, Allocation C) {
+        if (!validateSide(Side)) {
+            return false;
+        }
+
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+
+        if (!A.getType().getElement().isCompatible(e) ||
+            !B.getType().getElement().isCompatible(e) ||
+            !C.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+
+        // A must be square; can potentially be relaxed similar to TRSM
+        int adim = A.getType().getX();
+        if (adim != A.getType().getY()) {
+            return false;
+        }
+        if ((Side == ScriptIntrinsicBLAS.LEFT && adim != B.getType().getY()) ||
+            (Side == ScriptIntrinsicBLAS.RIGHT && adim != B.getType().getX())) {
+            return false;
+        }
+        if (B.getType().getX() != C.getType().getX() ||
+            B.getType().getY() != C.getType().getY()) {
+            return false;
+        }
+
+        return true;
+    }
+
+    private void xHEMM_API_test(int Side, int Uplo, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation matB : mMatrix) {
+                for (Allocation matC : mMatrix) {
+                    Element elemA = matA.getType().getElement();
+                    if (validateHEMM(elemA, Side, Uplo, matA, matB, matC)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CHEMM(Side, Uplo, alphaC, matA, matB, betaC, matC);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZHEMM(Side, Uplo, alphaZ, matA, matB, betaZ, matC);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.CHEMM(Side, Uplo, alphaC, matA, matB, betaC, matC);
+                            fail("should throw RSRuntimeException for CHEMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZHEMM(Side, Uplo, alphaZ, matA, matB, betaZ, matC);
+                            fail("should throw RSRuntimeException for ZHEMM");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L3_xHEMM_API(ArrayList<Allocation> mMatrix) {
+        for (int Side : mSide) {
+            for (int Uplo : mUplo) {
+                xHEMM_API_test(Side, Uplo, mMatrix);
+            }
+        }
+    }
+
+    public void test_L3_CHEMM_API() {
+        L3_xHEMM_API(mMatrixC);
+    }
+
+    public void test_L3_ZHEMM_API() {
+        L3_xHEMM_API(mMatrixZ);
+    }
+
+    public void test_L3_CHEMM_Correctness() {
+        int side = ScriptIntrinsicBLAS.LEFT;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dM, mBLASData.dM));
+        Allocation matrixBC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation matrixCC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixAC.copyFrom(mBLASData.L3_cHEMM_A_mm);
+        matrixBC.copyFrom(mBLASData.L3_cHEMM_B_mn);
+        matrixCC.copyFrom(mBLASData.L3_cHEMM_C_mn);
+
+        // Default case: SIDE = LEFT
+        mBLAS.CHEMM(side, uplo, alphaC, matrixAC, matrixBC, betaC, matrixCC);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixCRef.copyFrom(mBLASData.L3_cHEMM_o_L);
+        verifyMatrix(matrixCRef, matrixCC);
+
+        // SIDE = RIGHT
+        side = ScriptIntrinsicBLAS.RIGHT;
+        matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAC.copyFrom(mBLASData.L3_cHEMM_A_nn);
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCC.copyFrom(mBLASData.L3_cHEMM_C_mn);
+        mBLAS.CHEMM(side, uplo, alphaC, matrixAC, matrixBC, betaC, matrixCC);
+        matrixCRef.copyFrom(mBLASData.L3_cHEMM_o_R);
+        verifyMatrix(matrixCRef, matrixCC);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_ZHEMM_Correctness() {
+        int side = ScriptIntrinsicBLAS.LEFT;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dM, mBLASData.dM));
+        Allocation matrixBZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dM));
+        Allocation matrixCZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixAZ.copyFrom(mBLASData.L3_zHEMM_A_mm);
+        matrixBZ.copyFrom(mBLASData.L3_zHEMM_B_mn);
+        matrixCZ.copyFrom(mBLASData.L3_zHEMM_C_mn);
+
+        // Default case: SIDE = LEFT
+        mBLAS.ZHEMM(side, uplo, alphaZ, matrixAZ, matrixBZ, betaZ, matrixCZ);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixCRef.copyFrom(mBLASData.L3_zHEMM_o_L);
+        verifyMatrix(matrixCRef, matrixCZ);
+
+        // SIDE = RIGHT
+        side = ScriptIntrinsicBLAS.RIGHT;
+        matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAZ.copyFrom(mBLASData.L3_zHEMM_A_nn);
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCZ.copyFrom(mBLASData.L3_zHEMM_C_mn);
+        mBLAS.ZHEMM(side, uplo, alphaZ, matrixAZ, matrixBZ, betaZ, matrixCZ);
+        matrixCRef.copyFrom(mBLASData.L3_zHEMM_o_R);
+        verifyMatrix(matrixCRef, matrixCZ);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+
+    private boolean validateL3_xSYRK(Element e, int Uplo, int Trans, Allocation A, Allocation C) {
+        boolean result = true;
+        result &= validateTranspose(Trans);
+        result &= validateUplo(Uplo);
+        result &= validateL3(e, Trans, 0, 0, A, null, C);
+
+        return result;
+    }
+
+    private void xSYRK_API_test(int Uplo, int Trans, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation matC : mMatrix) {
+                Element elemA = matA.getType().getElement();
+                if (validateL3_xSYRK(elemA, Uplo, Trans, matA, matC)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.SSYRK(Uplo, Trans, alphaS, matA, betaS, matC);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DSYRK(Uplo, Trans, alphaD, matA, betaD, matC);
+                        } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CSYRK(Uplo, Trans, alphaC, matA, betaC, matC);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZSYRK(Uplo, Trans, alphaZ, matA, betaZ, matC);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.SSYRK(Uplo, Trans, alphaS, matA, betaS, matC);
+                        fail("should throw RSRuntimeException for SSYRK");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DSYRK(Uplo, Trans, alphaD, matA, betaD, matC);
+                        fail("should throw RSRuntimeException for DSYRK");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.CSYRK(Uplo, Trans, alphaC, matA, betaC, matC);
+                        fail("should throw RSRuntimeException for CSYRK");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZSYRK(Uplo, Trans, alphaZ, matA, betaZ, matC);
+                        fail("should throw RSRuntimeException for ZSYRK");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L3_xSYRK_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int Trans : mTranspose) {
+                xSYRK_API_test(Uplo, Trans, mMatrix);
+            }
+        }
+    }
+
+    public void test_L3_SSYRK_API() {
+        L3_xSYRK_API(mMatrixS);
+    }
+
+    public void test_L3_DSYRK_API() {
+        L3_xSYRK_API(mMatrixD);
+    }
+
+    public void test_L3_CSYRK_API() {
+        L3_xSYRK_API(mMatrixC);
+    }
+
+    public void test_L3_ZSYRK_API() {
+        L3_xSYRK_API(mMatrixZ);
+    }
+
+
+    public void test_L3_SSYRK_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+
+        // Populate input allocations
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dK, mBLASData.dN));
+        Allocation matrixCS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAS.copyFrom(mBLASData.L3_sSYRK_A_nk);
+        matrixCS.copyFrom(mBLASData.L3_sSYRK_C_nn);
+
+        // Default case: NO_TRANSPOSE
+        mBLAS.SSYRK(uplo, trans, alphaS, matrixAS, betaS, matrixCS);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dN));
+        matrixCRef.copyFrom(mBLASData.L3_sSYRK_o_N);
+        verifyMatrix(matrixCRef, matrixCS, true);
+
+        // Case: TRANSPOSE
+        matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dK));
+        matrixAS.copyFrom(mBLASData.L3_sSYRK_A_kn);
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCS.copyFrom(mBLASData.L3_sSYRK_C_nn);
+
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        mBLAS.SSYRK(uplo, trans, alphaS, matrixAS, betaS, matrixCS);
+        matrixCRef.copyFrom(mBLASData.L3_sSYRK_o_T);
+        verifyMatrix(matrixCRef, matrixCS, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_DSYRK_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+
+        // Populate input allocations
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dK, mBLASData.dN));
+        Allocation matrixCD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAD.copyFrom(mBLASData.L3_dSYRK_A_nk);
+        matrixCD.copyFrom(mBLASData.L3_dSYRK_C_nn);
+
+        // Default case: NO_TRANSPOSE
+        mBLAS.DSYRK(uplo, trans, alphaD, matrixAD, betaD, matrixCD);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dN));
+        matrixCRef.copyFrom(mBLASData.L3_dSYRK_o_N);
+        verifyMatrix(matrixCRef, matrixCD, true);
+
+        // Case: TRANSPOSE
+        matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dK));
+        matrixAD.copyFrom(mBLASData.L3_dSYRK_A_kn);
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCD.copyFrom(mBLASData.L3_dSYRK_C_nn);
+
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        mBLAS.DSYRK(uplo, trans, alphaD, matrixAD, betaD, matrixCD);
+        matrixCRef.copyFrom(mBLASData.L3_dSYRK_o_T);
+        verifyMatrix(matrixCRef, matrixCD, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_CSYRK_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dK, mBLASData.dN));
+        Allocation matrixCC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAC.copyFrom(mBLASData.L3_cSYRK_A_nk);
+        matrixCC.copyFrom(mBLASData.L3_cSYRK_C_nn);
+
+        // Default case: NO_TRANSPOSE
+        mBLAS.CSYRK(uplo, trans, alphaC, matrixAC, betaC, matrixCC);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixCRef.copyFrom(mBLASData.L3_cSYRK_o_N);
+        verifyMatrix(matrixCRef, matrixCC, true);
+
+        // Case: TRANSPOSE
+        matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dK));
+        matrixAC.copyFrom(mBLASData.L3_cSYRK_A_kn);
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCC.copyFrom(mBLASData.L3_cSYRK_C_nn);
+
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        mBLAS.CSYRK(uplo, trans, alphaC, matrixAC, betaC, matrixCC);
+        matrixCRef.copyFrom(mBLASData.L3_cSYRK_o_T);
+        verifyMatrix(matrixCRef, matrixCC, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_ZSYRK_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dK, mBLASData.dN));
+        Allocation matrixCZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAZ.copyFrom(mBLASData.L3_zSYRK_A_nk);
+        matrixCZ.copyFrom(mBLASData.L3_zSYRK_C_nn);
+
+        // Default case: NO_TRANSPOSE
+        mBLAS.ZSYRK(uplo, trans, alphaZ, matrixAZ, betaZ, matrixCZ);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixCRef.copyFrom(mBLASData.L3_zSYRK_o_N);
+        verifyMatrix(matrixCRef, matrixCZ, true);
+
+        // Case: TRANSPOSE
+        matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dK));
+        matrixAZ.copyFrom(mBLASData.L3_zSYRK_A_kn);
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCZ.copyFrom(mBLASData.L3_zSYRK_C_nn);
+
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        mBLAS.ZSYRK(uplo, trans, alphaZ, matrixAZ, betaZ, matrixCZ);
+        matrixCRef.copyFrom(mBLASData.L3_zSYRK_o_T);
+        verifyMatrix(matrixCRef, matrixCZ, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private boolean validateHERK(Element e, int Uplo, int Trans, Allocation A, Allocation C) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!A.getType().getElement().isCompatible(e) ||
+            !C.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        if (!validateConjTranspose(Trans)) {
+            return false;
+        }
+        int cdim = C.getType().getX();
+        if (cdim != C.getType().getY()) {
+            return false;
+        }
+        if (Trans == ScriptIntrinsicBLAS.NO_TRANSPOSE) {
+            if (cdim != A.getType().getY()) {
+                return false;
+            }
+        } else {
+            if (cdim != A.getType().getX()) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private void xHERK_API_test(int Uplo, int Trans, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation matC : mMatrix) {
+                Element elemA = matA.getType().getElement();
+                if (validateHERK(elemA, Uplo, Trans, matA, matC)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CHERK(Uplo, Trans, alphaS, matA, betaS, matC);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZHERK(Uplo, Trans, alphaD, matA, betaD, matC);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.CHERK(Uplo, Trans, alphaS, matA, betaS, matC);
+                        fail("should throw RSRuntimeException for CHERK");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZHERK(Uplo, Trans, alphaD, matA, betaD, matC);
+                        fail("should throw RSRuntimeException for ZHERK");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L3_xHERK_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int Trans : mTranspose) {
+                xHERK_API_test(Uplo, Trans, mMatrix);
+            }
+        }
+    }
+
+    public void test_L3_CHERK_API() {
+        L3_xHERK_API(mMatrixC);
+    }
+
+    public void test_L3_ZHERK_API() {
+        L3_xHERK_API(mMatrixZ);
+    }
+
+    public void test_L3_CHERK_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dK, mBLASData.dN));
+        Allocation matrixCC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAC.copyFrom(mBLASData.L3_cHERK_A_nk);
+        matrixCC.copyFrom(mBLASData.L3_cHERK_C_nn);
+
+        // Default case: NO_TRANSPOSE
+        mBLAS.CHERK(uplo, trans, alphaS, matrixAC, betaS, matrixCC);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixCRef.copyFrom(mBLASData.L3_cHERK_o_N);
+        verifyMatrix(matrixCRef, matrixCC, true);
+
+        // Case: TRANSPOSE
+        matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dK));
+        matrixAC.copyFrom(mBLASData.L3_cHERK_A_kn);
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCC.copyFrom(mBLASData.L3_cHERK_C_nn);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        mBLAS.CHERK(uplo, trans, alphaS, matrixAC, betaS, matrixCC);
+        matrixCRef.copyFrom(mBLASData.L3_cHERK_o_H);
+        verifyMatrix(matrixCRef, matrixCC, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_ZHERK_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dK, mBLASData.dN));
+        Allocation matrixCZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAZ.copyFrom(mBLASData.L3_zHERK_A_nk);
+        matrixCZ.copyFrom(mBLASData.L3_zHERK_C_nn);
+
+        // Default case: NO_TRANSPOSE
+        mBLAS.ZHERK(uplo, trans, alphaD, matrixAZ, betaD, matrixCZ);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixCRef.copyFrom(mBLASData.L3_zHERK_o_N);
+        verifyMatrix(matrixCRef, matrixCZ, true);
+
+        // Case: TRANSPOSE
+        matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dK));
+        matrixAZ.copyFrom(mBLASData.L3_zHERK_A_kn);
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCZ.copyFrom(mBLASData.L3_zHERK_C_nn);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        mBLAS.ZHERK(uplo, trans, alphaD, matrixAZ, betaD, matrixCZ);
+        matrixCRef.copyFrom(mBLASData.L3_zHERK_o_H);
+        verifyMatrix(matrixCRef, matrixCZ, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private boolean validateSYR2K(Element e, int Uplo, int Trans, Allocation A, Allocation B, Allocation C) {
+        if (!validateTranspose(Trans)) {
+            return false;
+        }
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+
+        if (!A.getType().getElement().isCompatible(e) ||
+            !B.getType().getElement().isCompatible(e) ||
+            !C.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        int Cdim = -1;
+        // A is n x k if no transpose, k x n if transpose
+        // C is n x n
+        if (Trans == ScriptIntrinsicBLAS.TRANSPOSE) {
+            // check columns versus C
+            Cdim = A.getType().getX();
+        } else {
+            // check rows versus C
+            Cdim = A.getType().getY();
+        }
+        if (C.getType().getX() != Cdim || C.getType().getY() != Cdim) {
+            return false;
+        }
+        // A dims == B dims
+        if (A.getType().getX() != B.getType().getX() || A.getType().getY() != B.getType().getY()) {
+            return false;
+        }
+        return true;
+    }
+
+    private void xSYR2K_API_test(int Uplo, int Trans, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation matB : mMatrix) {
+                for (Allocation matC : mMatrix) {
+                    Element elemA = matA.getType().getElement();
+                    if (validateSYR2K(elemA, Uplo, Trans, matA, matB, matC)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32(mRS))) {
+                                mBLAS.SSYR2K(Uplo, Trans, alphaS, matA, matB, betaS, matC);
+                            } else if (elemA.isCompatible(Element.F64(mRS))) {
+                                mBLAS.DSYR2K(Uplo, Trans, alphaD, matA, matB, betaD, matC);
+                            } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CSYR2K(Uplo, Trans, alphaC, matA, matB, betaC, matC);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZSYR2K(Uplo, Trans, alphaZ, matA, matB, betaZ, matC);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.SSYR2K(Uplo, Trans, alphaS, matA, matB, betaS, matC);
+                            fail("should throw RSRuntimeException for SSYR2K");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.DSYR2K(Uplo, Trans, alphaD, matA, matB, betaD, matC);
+                            fail("should throw RSRuntimeException for DSYR2K");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.CSYR2K(Uplo, Trans, alphaC, matA, matB, betaC, matC);
+                            fail("should throw RSRuntimeException for CSYR2K");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZSYR2K(Uplo, Trans, alphaZ, matA, matB, betaZ, matC);
+                            fail("should throw RSRuntimeException for ZSYR2K");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L3_xSYR2K_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int Trans : mTranspose) {
+                xSYR2K_API_test(Uplo, Trans, mMatrix);
+            }
+        }
+    }
+
+    public void test_L3_SSYR2K_API() {
+        L3_xSYR2K_API(mMatrixS);
+    }
+
+    public void test_L3_DSYR2K_API() {
+        L3_xSYR2K_API(mMatrixD);
+    }
+
+    public void test_L3_CSYR2K_API() {
+        L3_xSYR2K_API(mMatrixC);
+    }
+
+    public void test_L3_ZSYR2K_API() {
+        L3_xSYR2K_API(mMatrixZ);
+    }
+
+
+    public void test_L3_SSYR2K_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+
+        // Populate input allocations
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dK, mBLASData.dN));
+        Allocation matrixBS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dK, mBLASData.dN));
+        Allocation matrixCS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAS.copyFrom(mBLASData.L3_sSYR2K_A_nk);
+        matrixBS.copyFrom(mBLASData.L3_sSYR2K_B_nk);
+        matrixCS.copyFrom(mBLASData.L3_sSYR2K_C_nn);
+
+        // Default case: NO_TRANSPOSE
+        mBLAS.SSYR2K(uplo, trans, alphaS, matrixAS, matrixBS, betaS, matrixCS);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dN));
+        matrixCRef.copyFrom(mBLASData.L3_sSYR2K_o_N);
+        verifyMatrix(matrixCRef, matrixCS, true);
+
+        // Case: TRANSPOSE
+        matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dK));
+        matrixBS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dK));
+        matrixAS.copyFrom(mBLASData.L3_sSYR2K_A_kn);
+        matrixBS.copyFrom(mBLASData.L3_sSYR2K_B_kn);
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCS.copyFrom(mBLASData.L3_sSYR2K_C_nn);
+
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        mBLAS.SSYR2K(uplo, trans, alphaS, matrixAS, matrixBS, betaS, matrixCS);
+        matrixCRef.copyFrom(mBLASData.L3_sSYR2K_o_T);
+        verifyMatrix(matrixCRef, matrixCS, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_DSYR2K_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+
+        // Populate input allocations
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dK, mBLASData.dN));
+        Allocation matrixBD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dK, mBLASData.dN));
+        Allocation matrixCD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAD.copyFrom(mBLASData.L3_dSYR2K_A_nk);
+        matrixBD.copyFrom(mBLASData.L3_dSYR2K_B_nk);
+        matrixCD.copyFrom(mBLASData.L3_dSYR2K_C_nn);
+
+        // Default case: NO_TRANSPOSE
+        mBLAS.DSYR2K(uplo, trans, alphaD, matrixAD, matrixBD, betaD, matrixCD);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dN));
+        matrixCRef.copyFrom(mBLASData.L3_dSYR2K_o_N);
+        verifyMatrix(matrixCRef, matrixCD, true);
+
+        // Case: TRANSPOSE
+        matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dK));
+        matrixBD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dK));
+        matrixAD.copyFrom(mBLASData.L3_dSYR2K_A_kn);
+        matrixBD.copyFrom(mBLASData.L3_dSYR2K_B_kn);
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCD.copyFrom(mBLASData.L3_dSYR2K_C_nn);
+
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        mBLAS.DSYR2K(uplo, trans, alphaD, matrixAD, matrixBD, betaD, matrixCD);
+        matrixCRef.copyFrom(mBLASData.L3_dSYR2K_o_T);
+        verifyMatrix(matrixCRef, matrixCD, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_CSYR2K_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dK, mBLASData.dN));
+        Allocation matrixBC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dK, mBLASData.dN));
+        Allocation matrixCC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAC.copyFrom(mBLASData.L3_cSYR2K_A_nk);
+        matrixBC.copyFrom(mBLASData.L3_cSYR2K_B_nk);
+        matrixCC.copyFrom(mBLASData.L3_cSYR2K_C_nn);
+
+        // Default case: NO_TRANSPOSE
+        mBLAS.CSYR2K(uplo, trans, alphaC, matrixAC, matrixBC, betaC, matrixCC);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixCRef.copyFrom(mBLASData.L3_cSYR2K_o_N);
+        verifyMatrix(matrixCRef, matrixCC, true);
+
+        // Case: TRANSPOSE
+        matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dK));
+        matrixBC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dK));
+        matrixAC.copyFrom(mBLASData.L3_cSYR2K_A_kn);
+        matrixBC.copyFrom(mBLASData.L3_cSYR2K_B_kn);
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCC.copyFrom(mBLASData.L3_cSYR2K_C_nn);
+
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        mBLAS.CSYR2K(uplo, trans, alphaC, matrixAC, matrixBC, betaC, matrixCC);
+        matrixCRef.copyFrom(mBLASData.L3_cSYR2K_o_T);
+        verifyMatrix(matrixCRef, matrixCC, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_ZSYR2K_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dK, mBLASData.dN));
+        Allocation matrixBZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dK, mBLASData.dN));
+        Allocation matrixCZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAZ.copyFrom(mBLASData.L3_zSYR2K_A_nk);
+        matrixBZ.copyFrom(mBLASData.L3_zSYR2K_B_nk);
+        matrixCZ.copyFrom(mBLASData.L3_zSYR2K_C_nn);
+
+        // Default case: NO_TRANSPOSE
+        mBLAS.ZSYR2K(uplo, trans, alphaZ, matrixAZ, matrixBZ, betaZ, matrixCZ);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixCRef.copyFrom(mBLASData.L3_zSYR2K_o_N);
+        verifyMatrix(matrixCRef, matrixCZ, true);
+
+        // Case: TRANSPOSE
+        matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dK));
+        matrixBZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dK));
+        matrixAZ.copyFrom(mBLASData.L3_zSYR2K_A_kn);
+        matrixBZ.copyFrom(mBLASData.L3_zSYR2K_B_kn);
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCZ.copyFrom(mBLASData.L3_zSYR2K_C_nn);
+
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        mBLAS.ZSYR2K(uplo, trans, alphaZ, matrixAZ, matrixBZ, betaZ, matrixCZ);
+        matrixCRef.copyFrom(mBLASData.L3_zSYR2K_o_T);
+        verifyMatrix(matrixCRef, matrixCZ, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private boolean validateHER2K(Element e, int Uplo, int Trans, Allocation A, Allocation B, Allocation C) {
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!A.getType().getElement().isCompatible(e) ||
+            !B.getType().getElement().isCompatible(e) ||
+            !C.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        if (!validateConjTranspose(Trans)) {
+            return false;
+        }
+        int cdim = C.getType().getX();
+        if (cdim != C.getType().getY()) {
+            return false;
+        }
+        if (Trans == ScriptIntrinsicBLAS.NO_TRANSPOSE) {
+            if (A.getType().getY() != cdim) {
+                return false;
+            }
+        } else {
+            if (A.getType().getX() != cdim) {
+                return false;
+            }
+        }
+        if (A.getType().getX() != B.getType().getX() || A.getType().getY() != B.getType().getY()) {
+            return false;
+        }
+        return true;
+    }
+
+    private void xHER2K_API_test(int Uplo, int Trans, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation matB : mMatrix) {
+                for (Allocation matC : mMatrix) {
+                    Element elemA = matA.getType().getElement();
+                    if (validateHER2K(elemA, Uplo, Trans, matA, matB, matC)) {
+                        try {
+                            if (elemA.isCompatible(Element.F32_2(mRS))) {
+                                mBLAS.CHER2K(Uplo, Trans, alphaC, matA, matB, betaS, matC);
+                            } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                                mBLAS.ZHER2K(Uplo, Trans, alphaZ, matA, matB, betaD, matC);
+                            }
+                        } catch (RSRuntimeException e) {
+                            fail("should NOT throw RSRuntimeException");
+                        }
+                    } else {
+                        try {
+                            mBLAS.CHER2K(Uplo, Trans, alphaC, matA, matB, betaS, matC);
+                            fail("should throw RSRuntimeException for CHER2K");
+                        } catch (RSRuntimeException e) {
+                        }
+                        try {
+                            mBLAS.ZHER2K(Uplo, Trans, alphaZ, matA, matB, betaD, matC);
+                            fail("should throw RSRuntimeException for ZHER2K");
+                        } catch (RSRuntimeException e) {
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void L3_xHER2K_API(ArrayList<Allocation> mMatrix) {
+        for (int Uplo : mUplo) {
+            for (int Trans : mTranspose) {
+                xHER2K_API_test(Uplo, Trans, mMatrix);
+            }
+        }
+    }
+
+    public void test_L3_CHER2K_API() {
+        L3_xHER2K_API(mMatrixC);
+    }
+
+    public void test_L3_ZHER2K_API() {
+        L3_xHER2K_API(mMatrixZ);
+    }
+
+    public void test_L3_CHER2K_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dK, mBLASData.dN));
+        Allocation matrixBC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dK, mBLASData.dN));
+        Allocation matrixCC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAC.copyFrom(mBLASData.L3_cHER2K_A_nk);
+        matrixBC.copyFrom(mBLASData.L3_cHER2K_B_nk);
+        matrixCC.copyFrom(mBLASData.L3_cHER2K_C_nn);
+
+        // Default case: NO_TRANSPOSE
+        mBLAS.CHER2K(uplo, trans, alphaC, matrixAC, matrixBC, betaS, matrixCC);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixCRef.copyFrom(mBLASData.L3_cHER2K_o_N);
+        verifyMatrix(matrixCRef, matrixCC, true);
+
+        // Case: TRANSPOSE
+        matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dK));
+        matrixBC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dK));
+        matrixAC.copyFrom(mBLASData.L3_cHER2K_A_kn);
+        matrixBC.copyFrom(mBLASData.L3_cHER2K_B_kn);
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCC.copyFrom(mBLASData.L3_cHER2K_C_nn);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        mBLAS.CHER2K(uplo, trans, alphaC, matrixAC, matrixBC, betaS, matrixCC);
+        matrixCRef.copyFrom(mBLASData.L3_cHER2K_o_H);
+        verifyMatrix(matrixCRef, matrixCC, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_ZHER2K_Correctness() {
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dK, mBLASData.dN));
+        Allocation matrixBZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dK, mBLASData.dN));
+        Allocation matrixCZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAZ.copyFrom(mBLASData.L3_zHER2K_A_nk);
+        matrixBZ.copyFrom(mBLASData.L3_zHER2K_B_nk);
+        matrixCZ.copyFrom(mBLASData.L3_zHER2K_C_nn);
+
+        // Default case: NO_TRANSPOSE
+        mBLAS.ZHER2K(uplo, trans, alphaZ, matrixAZ, matrixBZ, betaD, matrixCZ);
+        Allocation matrixCRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixCRef.copyFrom(mBLASData.L3_zHER2K_o_N);
+        verifyMatrix(matrixCRef, matrixCZ, true);
+
+        // Case: TRANSPOSE
+        matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dK));
+        matrixBZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dK));
+        matrixAZ.copyFrom(mBLASData.L3_zHER2K_A_kn);
+        matrixBZ.copyFrom(mBLASData.L3_zHER2K_B_kn);
+        // Reload matrix C, since it was overwritten by BLAS.
+        matrixCZ.copyFrom(mBLASData.L3_zHER2K_C_nn);
+
+        trans = ScriptIntrinsicBLAS.CONJ_TRANSPOSE;
+        mBLAS.ZHER2K(uplo, trans, alphaZ, matrixAZ, matrixBZ, betaD, matrixCZ);
+        matrixCRef.copyFrom(mBLASData.L3_zHER2K_o_H);
+        verifyMatrix(matrixCRef, matrixCZ, true);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private boolean validateTRMM(Element e, int Side, int Uplo, int TransA, int Diag, Allocation A, Allocation B) {
+        if (!validateSide(Side)) {
+            return false;
+        }
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!validateTranspose(TransA)) {
+            return false;
+        }
+        if (!validateDiag(Diag)) {
+            return false;
+        }
+        int aM = -1, aN = -1, bM = -1, bN = -1;
+        if (!A.getType().getElement().isCompatible(e) ||
+            !B.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+
+        aM = A.getType().getY();
+        aN = A.getType().getX();
+        if (aM != aN) {
+            return false;
+        }
+
+        bM = B.getType().getY();
+        bN = B.getType().getX();
+        if (Side == ScriptIntrinsicBLAS.LEFT) {
+            if (aN != bM) {
+                return false;
+            }
+        } else {
+            if (bN != aM) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private void xTRMM_API_test(int Side, int Uplo, int TransA, int Diag, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation matB : mMatrix) {
+                Element elemA = matA.getType().getElement();
+                if (validateTRMM(elemA, Side, Uplo, TransA, Diag, matA, matB)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.STRMM(Side, Uplo, TransA, Diag, alphaS, matA, matB);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DTRMM(Side, Uplo, TransA, Diag, alphaD, matA, matB);
+                        } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CTRMM(Side, Uplo, TransA, Diag, alphaC, matA, matB);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZTRMM(Side, Uplo, TransA, Diag, alphaZ, matA, matB);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.STRMM(Side, Uplo, TransA, Diag, alphaS, matA, matB);
+                        fail("should throw RSRuntimeException for STRMM");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DTRMM(Side, Uplo, TransA, Diag, alphaD, matA, matB);
+                        fail("should throw RSRuntimeException for DTRMM");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.CTRMM(Side, Uplo, TransA, Diag, alphaC, matA, matB);
+                        fail("should throw RSRuntimeException for CTRMM");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZTRMM(Side, Uplo, TransA, Diag, alphaZ, matA, matB);
+                        fail("should throw RSRuntimeException for ZTRMM");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L3_xTRMM_API(ArrayList<Allocation> mMatrix) {
+        for (int Side : mSide) {
+            for (int Uplo : mUplo) {
+                for (int TransA : mTranspose) {
+                    for (int Diag : mDiag) {
+                        xTRMM_API_test(Side, Uplo, TransA, Diag, mMatrix);
+                    }
+                }
+            }
+        }
+    }
+
+    public void test_L3_STRMM_API() {
+        L3_xTRMM_API(mMatrixS);
+    }
+
+    public void test_L3_DTRMM_API() {
+        L3_xTRMM_API(mMatrixD);
+    }
+
+    public void test_L3_CTRMM_API() {
+        L3_xTRMM_API(mMatrixC);
+    }
+
+    public void test_L3_ZTRMM_API() {
+        L3_xTRMM_API(mMatrixZ);
+    }
+
+
+    public void test_L3_STRMM_Correctness() {
+        int side = ScriptIntrinsicBLAS.LEFT;
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+
+        // Populate input allocations
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dM, mBLASData.dM));
+        Allocation matrixBS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dM));
+        matrixAS.copyFrom(mBLASData.L3_sTRMM_A_mm);
+        matrixBS.copyFrom(mBLASData.L3_sTRMM_B_mn);
+
+        // Default case: LEFT, UPPER, NO_TRANSPOSE
+        mBLAS.STRMM(side, uplo, trans, diag, alphaS, matrixAS, matrixBS);
+        Allocation matrixBRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dM));
+        matrixBRef.copyFrom(mBLASData.L3_sTRMM_o_LUN);
+        verifyMatrix(matrixBRef, matrixBS);
+
+        // Case: RIGHT, LOWER, TRANSPOSE
+        matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAS.copyFrom(mBLASData.L3_sTRMM_A_nn);
+        // Reload matrix B, since it was overwritten by BLAS.
+        matrixBS.copyFrom(mBLASData.L3_sTRMM_B_mn);
+
+        side = ScriptIntrinsicBLAS.RIGHT;
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        uplo = ScriptIntrinsicBLAS.LOWER;
+        mBLAS.STRMM(side, uplo, trans, diag, alphaS, matrixAS, matrixBS);
+        matrixBRef.copyFrom(mBLASData.L3_sTRMM_o_RLT);
+        verifyMatrix(matrixBRef, matrixBS);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_DTRMM_Correctness() {
+        int side = ScriptIntrinsicBLAS.LEFT;
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+
+        // Populate input allocations
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dM, mBLASData.dM));
+        Allocation matrixBD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dM));
+        matrixAD.copyFrom(mBLASData.L3_dTRMM_A_mm);
+        matrixBD.copyFrom(mBLASData.L3_dTRMM_B_mn);
+
+        // Default case: LEFT, UPPER, NO_TRANSPOSE
+        mBLAS.DTRMM(side, uplo, trans, diag, alphaD, matrixAD, matrixBD);
+        Allocation matrixBRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dM));
+        matrixBRef.copyFrom(mBLASData.L3_dTRMM_o_LUN);
+        verifyMatrix(matrixBRef, matrixBD);
+
+        // Case: RIGHT, LOWER, TRANSPOSE
+        matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAD.copyFrom(mBLASData.L3_dTRMM_A_nn);
+        // Reload matrix B, since it was overwritten by BLAS.
+        matrixBD.copyFrom(mBLASData.L3_dTRMM_B_mn);
+
+        side = ScriptIntrinsicBLAS.RIGHT;
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        uplo = ScriptIntrinsicBLAS.LOWER;
+        mBLAS.DTRMM(side, uplo, trans, diag, alphaD, matrixAD, matrixBD);
+        matrixBRef.copyFrom(mBLASData.L3_dTRMM_o_RLT);
+        verifyMatrix(matrixBRef, matrixBD);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_CTRMM_Correctness() {
+        int side = ScriptIntrinsicBLAS.LEFT;
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dM, mBLASData.dM));
+        Allocation matrixBC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixAC.copyFrom(mBLASData.L3_cTRMM_A_mm);
+        matrixBC.copyFrom(mBLASData.L3_cTRMM_B_mn);
+
+        // Default case: LEFT, UPPER, NO_TRANSPOSE
+        mBLAS.CTRMM(side, uplo, trans, diag, alphaC, matrixAC, matrixBC);
+        Allocation matrixBRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixBRef.copyFrom(mBLASData.L3_cTRMM_o_LUN);
+        verifyMatrix(matrixBRef, matrixBC);
+
+        // Case: RIGHT, LOWER, TRANSPOSE
+        matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAC.copyFrom(mBLASData.L3_cTRMM_A_nn);
+        // Reload matrix B, since it was overwritten by BLAS.
+        matrixBC.copyFrom(mBLASData.L3_cTRMM_B_mn);
+
+        side = ScriptIntrinsicBLAS.RIGHT;
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        uplo = ScriptIntrinsicBLAS.LOWER;
+        mBLAS.CTRMM(side, uplo, trans, diag, alphaC, matrixAC, matrixBC);
+        matrixBRef.copyFrom(mBLASData.L3_cTRMM_o_RLT);
+        verifyMatrix(matrixBRef, matrixBC);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_ZTRMM_Correctness() {
+        int side = ScriptIntrinsicBLAS.LEFT;
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dM, mBLASData.dM));
+        Allocation matrixBZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixAZ.copyFrom(mBLASData.L3_zTRMM_A_mm);
+        matrixBZ.copyFrom(mBLASData.L3_zTRMM_B_mn);
+
+        // Default case: LEFT, UPPER, NO_TRANSPOSE
+        mBLAS.ZTRMM(side, uplo, trans, diag, alphaZ, matrixAZ, matrixBZ);
+        Allocation matrixBRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixBRef.copyFrom(mBLASData.L3_zTRMM_o_LUN);
+        verifyMatrix(matrixBRef, matrixBZ);
+
+        // Case: RIGHT, LOWER, TRANSPOSE
+        matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAZ.copyFrom(mBLASData.L3_zTRMM_A_nn);
+        // Reload matrix B, since it was overwritten by BLAS.
+        matrixBZ.copyFrom(mBLASData.L3_zTRMM_B_mn);
+
+        side = ScriptIntrinsicBLAS.RIGHT;
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        uplo = ScriptIntrinsicBLAS.LOWER;
+        mBLAS.ZTRMM(side, uplo, trans, diag, alphaZ, matrixAZ, matrixBZ);
+        matrixBRef.copyFrom(mBLASData.L3_zTRMM_o_RLT);
+        verifyMatrix(matrixBRef, matrixBZ);
+
+        mRS.finish();
+        checkError();
+    }
+
+
+    private boolean validateTRSM(Element e, int Side, int Uplo, int TransA, int Diag, Allocation A, Allocation B) {
+        int adim = -1, bM = -1, bN = -1;
+        if (!validateSide(Side)) {
+            return false;
+        }
+        if (!validateTranspose(TransA)) {
+            return false;
+        }
+        if (!validateUplo(Uplo)) {
+            return false;
+        }
+        if (!validateDiag(Diag)) {
+            return false;
+        }
+        if (!A.getType().getElement().isCompatible(e) ||
+            !B.getType().getElement().isCompatible(e)) {
+            return false;
+        }
+        adim = A.getType().getX();
+        if (adim != A.getType().getY()) {
+            // this may be unnecessary, the restriction could potentially be relaxed
+            // A needs to contain at least that symmetric matrix but could theoretically be larger
+            // for now we assume adapters are sufficient, will reevaluate in the future
+            return false;
+        }
+        bM = B.getType().getY();
+        bN = B.getType().getX();
+        if (Side == ScriptIntrinsicBLAS.LEFT) {
+            // A is M*M
+            if (adim != bM) {
+                return false;
+            }
+        } else {
+            // A is N*N
+            if (adim != bN) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private void xTRSM_API_test(int Side, int Uplo, int TransA, int Diag, ArrayList<Allocation> mMatrix) {
+        for (Allocation matA : mMatrix) {
+            for (Allocation matB : mMatrix) {
+                Element elemA = matA.getType().getElement();
+                if (validateTRSM(elemA, Side, Uplo, TransA, Diag, matA, matB)) {
+                    try {
+                        if (elemA.isCompatible(Element.F32(mRS))) {
+                            mBLAS.STRSM(Side, Uplo, TransA, Diag, alphaS, matA, matB);
+                        } else if (elemA.isCompatible(Element.F64(mRS))) {
+                            mBLAS.DTRSM(Side, Uplo, TransA, Diag, alphaD, matA, matB);
+                        } else if (elemA.isCompatible(Element.F32_2(mRS))) {
+                            mBLAS.CTRSM(Side, Uplo, TransA, Diag, alphaC, matA, matB);
+                        } else if (elemA.isCompatible(Element.F64_2(mRS))) {
+                            mBLAS.ZTRSM(Side, Uplo, TransA, Diag, alphaZ, matA, matB);
+                        }
+                    } catch (RSRuntimeException e) {
+                        fail("should NOT throw RSRuntimeException");
+                    }
+                } else {
+                    try {
+                        mBLAS.STRSM(Side, Uplo, TransA, Diag, alphaS, matA, matB);
+                        fail("should throw RSRuntimeException for STRSM");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.DTRSM(Side, Uplo, TransA, Diag, alphaD, matA, matB);
+                        fail("should throw RSRuntimeException for DTRSM");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.CTRSM(Side, Uplo, TransA, Diag, alphaC, matA, matB);
+                        fail("should throw RSRuntimeException for CTRSM");
+                    } catch (RSRuntimeException e) {
+                    }
+                    try {
+                        mBLAS.ZTRSM(Side, Uplo, TransA, Diag, alphaZ, matA, matB);
+                        fail("should throw RSRuntimeException for ZTRSM");
+                    } catch (RSRuntimeException e) {
+                    }
+                }
+            }
+        }
+    }
+
+    public void L3_xTRSM_API(ArrayList<Allocation> mMatrix) {
+        for (int Side : mSide) {
+            for (int Uplo : mUplo) {
+                for (int TransA : mTranspose) {
+                    for (int Diag : mDiag) {
+                        xTRSM_API_test(Side, Uplo, TransA, Diag, mMatrix);
+                    }
+                }
+            }
+        }
+    }
+
+    public void test_L3_STRSM_API() {
+        L3_xTRSM_API(mMatrixS);
+    }
+
+    public void test_L3_DTRSM_API() {
+        L3_xTRSM_API(mMatrixD);
+    }
+
+    public void test_L3_CTRSM_API() {
+        L3_xTRSM_API(mMatrixC);
+    }
+
+    public void test_L3_ZTRSM_API() {
+        L3_xTRSM_API(mMatrixZ);
+    }
+
+    public void test_L3_STRSM_Correctness() {
+        int side = ScriptIntrinsicBLAS.LEFT;
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+
+        // Populate input allocations
+        Allocation matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dM, mBLASData.dM));
+        Allocation matrixBS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dM));
+        matrixAS.copyFrom(mBLASData.L3_sTRSM_A_mm);
+        matrixBS.copyFrom(mBLASData.L3_sTRSM_B_mn);
+
+        // Default case: LEFT, UPPER, NO_TRANSPOSE
+        mBLAS.STRSM(side, uplo, trans, diag, alphaS, matrixAS, matrixBS);
+        Allocation matrixBRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dM));
+        matrixBRef.copyFrom(mBLASData.L3_sTRSM_o_LUN);
+        verifyMatrix(matrixBRef, matrixBS);
+
+        // Case: RIGHT, LOWER, TRANSPOSE
+        matrixAS = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAS.copyFrom(mBLASData.L3_sTRSM_A_nn);
+        // Reload matrix B, since it was overwritten by BLAS.
+        matrixBS.copyFrom(mBLASData.L3_sTRSM_B_mn);
+
+        side = ScriptIntrinsicBLAS.RIGHT;
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        uplo = ScriptIntrinsicBLAS.LOWER;
+        mBLAS.STRSM(side, uplo, trans, diag, alphaS, matrixAS, matrixBS);
+        matrixBRef.copyFrom(mBLASData.L3_sTRSM_o_RLT);
+        verifyMatrix(matrixBRef, matrixBS);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_DTRSM_Correctness() {
+        int side = ScriptIntrinsicBLAS.LEFT;
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+
+        // Populate input allocations
+        Allocation matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dM, mBLASData.dM));
+        Allocation matrixBD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dM));
+        matrixAD.copyFrom(mBLASData.L3_dTRSM_A_mm);
+        matrixBD.copyFrom(mBLASData.L3_dTRSM_B_mn);
+
+        // Default case: LEFT, UPPER, NO_TRANSPOSE
+        mBLAS.DTRSM(side, uplo, trans, diag, alphaD, matrixAD, matrixBD);
+        Allocation matrixBRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dM));
+        matrixBRef.copyFrom(mBLASData.L3_dTRSM_o_LUN);
+        verifyMatrix(matrixBRef, matrixBD);
+
+        // Case: RIGHT, LOWER, TRANSPOSE
+        matrixAD = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAD.copyFrom(mBLASData.L3_dTRSM_A_nn);
+        // Reload matrix B, since it was overwritten by BLAS.
+        matrixBD.copyFrom(mBLASData.L3_dTRSM_B_mn);
+
+        side = ScriptIntrinsicBLAS.RIGHT;
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        uplo = ScriptIntrinsicBLAS.LOWER;
+        mBLAS.DTRSM(side, uplo, trans, diag, alphaD, matrixAD, matrixBD);
+        matrixBRef.copyFrom(mBLASData.L3_dTRSM_o_RLT);
+        verifyMatrix(matrixBRef, matrixBD);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_CTRSM_Correctness() {
+        int side = ScriptIntrinsicBLAS.LEFT;
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+
+        // Populate input allocations
+        Allocation matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dM, mBLASData.dM));
+        Allocation matrixBC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixAC.copyFrom(mBLASData.L3_cTRSM_A_mm);
+        matrixBC.copyFrom(mBLASData.L3_cTRSM_B_mn);
+
+        // Default case: LEFT, UPPER, NO_TRANSPOSE
+        mBLAS.CTRSM(side, uplo, trans, diag, alphaC, matrixAC, matrixBC);
+        Allocation matrixBRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixBRef.copyFrom(mBLASData.L3_cTRSM_o_LUN);
+        verifyMatrix(matrixBRef, matrixBC);
+
+        // Case: RIGHT, LOWER, TRANSPOSE
+        matrixAC = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F32_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAC.copyFrom(mBLASData.L3_cTRSM_A_nn);
+        // Reload matrix B, since it was overwritten by BLAS.
+        matrixBC.copyFrom(mBLASData.L3_cTRSM_B_mn);
+
+        side = ScriptIntrinsicBLAS.RIGHT;
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        uplo = ScriptIntrinsicBLAS.LOWER;
+        mBLAS.CTRSM(side, uplo, trans, diag, alphaC, matrixAC, matrixBC);
+        matrixBRef.copyFrom(mBLASData.L3_cTRSM_o_RLT);
+        verifyMatrix(matrixBRef, matrixBC);
+
+        mRS.finish();
+        checkError();
+    }
+
+    public void test_L3_ZTRSM_Correctness() {
+        int side = ScriptIntrinsicBLAS.LEFT;
+        int trans = ScriptIntrinsicBLAS.NO_TRANSPOSE;
+        int uplo = ScriptIntrinsicBLAS.UPPER;
+        int diag = ScriptIntrinsicBLAS.NON_UNIT;
+
+        // Populate input allocations
+        Allocation matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dM, mBLASData.dM));
+        Allocation matrixBZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixAZ.copyFrom(mBLASData.L3_zTRSM_A_mm);
+        matrixBZ.copyFrom(mBLASData.L3_zTRSM_B_mn);
+
+        // Default case: LEFT, UPPER, NO_TRANSPOSE
+        mBLAS.ZTRSM(side, uplo, trans, diag, alphaZ, matrixAZ, matrixBZ);
+        Allocation matrixBRef = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dM));
+        matrixBRef.copyFrom(mBLASData.L3_zTRSM_o_LUN);
+        verifyMatrix(matrixBRef, matrixBZ);
+
+        // Case: RIGHT, LOWER, TRANSPOSE
+        matrixAZ = Allocation.createTyped(mRS, Type.createXY(mRS, Element.F64_2(mRS), mBLASData.dN, mBLASData.dN));
+        matrixAZ.copyFrom(mBLASData.L3_zTRSM_A_nn);
+        // Reload matrix B, since it was overwritten by BLAS.
+        matrixBZ.copyFrom(mBLASData.L3_zTRSM_B_mn);
+
+        side = ScriptIntrinsicBLAS.RIGHT;
+        trans = ScriptIntrinsicBLAS.TRANSPOSE;
+        uplo = ScriptIntrinsicBLAS.LOWER;
+        mBLAS.ZTRSM(side, uplo, trans, diag, alphaZ, matrixAZ, matrixBZ);
+        matrixBRef.copyFrom(mBLASData.L3_zTRSM_o_RLT);
+        verifyMatrix(matrixBRef, matrixBZ);
+
+        mRS.finish();
+        checkError();
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBlur.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBlur.java
index 076dcd4..4e99391 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBlur.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBlur.java
@@ -141,5 +141,17 @@
         checkError();
     }
 
+    public void test_ID() {
+        ScriptIntrinsicBlur s = ScriptIntrinsicBlur.create(mRS, Element.U8_4(mRS));
+        Script.KernelID kid = s.getKernelID();
+        if (kid == null) {
+            throw new IllegalStateException("kid must be valid");
+        }
+
+        Script.FieldID fid = s.getFieldID_Input();
+        if (fid == null) {
+            throw new IllegalStateException("fid must be valid");
+        }
+    }
 
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve3x3.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve3x3.java
index 8faeb22..8a2bc27 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve3x3.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve3x3.java
@@ -247,4 +247,17 @@
         checkError();
     }
 
+    public void test_ID() {
+        ScriptIntrinsicConvolve3x3 s = ScriptIntrinsicConvolve3x3.create(mRS, Element.U8_4(mRS));
+        Script.KernelID kid = s.getKernelID();
+        if (kid == null) {
+            throw new IllegalStateException("kid must be valid");
+        }
+
+        Script.FieldID fid = s.getFieldID_Input();
+        if (fid == null) {
+            throw new IllegalStateException("fid must be valid");
+        }
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve5x5.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve5x5.java
index 0753c62..410aebd 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve5x5.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve5x5.java
@@ -184,4 +184,17 @@
         checkError();
     }
 
+    public void test_ID() {
+        ScriptIntrinsicConvolve5x5 s = ScriptIntrinsicConvolve5x5.create(mRS, Element.U8_4(mRS));
+        Script.KernelID kid = s.getKernelID();
+        if (kid == null) {
+            throw new IllegalStateException("kid must be valid");
+        }
+
+        Script.FieldID fid = s.getFieldID_Input();
+        if (fid == null) {
+            throw new IllegalStateException("fid must be valid");
+        }
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicLut.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicLut.java
index 1567639..3309bb0 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicLut.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicLut.java
@@ -83,5 +83,12 @@
     }
 
 
+    public void test_ID() {
+        ScriptIntrinsicLUT s = ScriptIntrinsicLUT.create(mRS, Element.U8_4(mRS));
+        Script.KernelID kid = s.getKernelID();
+        if (kid == null) {
+            throw new IllegalStateException("kid must be valid");
+        }
+    }
 
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicResize.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicResize.java
index 24e56d7..c8b3640 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicResize.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicResize.java
@@ -24,7 +24,7 @@
     static final int inX = 307;
     static final int inY = 157;
 
-    private void testReszie(int w, int h, Element.DataType dt, int vecSize, float scaleX, float scaleY) {
+    private void testResize(int w, int h, Element.DataType dt, int vecSize, float scaleX, float scaleY) {
 
         Element e = makeElement(dt, vecSize);
 
@@ -98,343 +98,343 @@
 
 
     public void test_U8_4_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 4, 1.f, 1.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 1.f, 1.f);
         checkError();
     }
     public void test_U8_3_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 3, 1.f, 1.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 1.f, 1.f);
         checkError();
     }
     public void test_U8_2_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 2, 1.f, 1.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 1.f, 1.f);
         checkError();
     }
     public void test_U8_1_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 1, 1.f, 1.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 1.f, 1.f);
         checkError();
     }
 
     public void test_U8_4_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 4, 2.f, 2.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 2.f, 2.f);
         checkError();
     }
     public void test_U8_3_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 3, 2.f, 2.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 2.f, 2.f);
         checkError();
     }
     public void test_U8_2_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 2, 2.f, 2.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 2.f, 2.f);
         checkError();
     }
     public void test_U8_1_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 1, 2.f, 2.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 2.f, 2.f);
         checkError();
     }
 
     public void test_U8_4_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 4, 0.5f, 2.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 0.5f, 2.f);
         checkError();
     }
     public void test_U8_3_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 3, 0.5f, 2.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 0.5f, 2.f);
         checkError();
     }
     public void test_U8_2_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 2, 0.5f, 2.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 0.5f, 2.f);
         checkError();
     }
     public void test_U8_1_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 1, 0.5f, 2.f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 0.5f, 2.f);
         checkError();
     }
 
     public void test_U8_4_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 4, 2.f, 0.5f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 2.f, 0.5f);
         checkError();
     }
     public void test_U8_3_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 3, 2.f, 0.5f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 2.f, 0.5f);
         checkError();
     }
     public void test_U8_2_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 2, 2.f, 0.5f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 2.f, 0.5f);
         checkError();
     }
     public void test_U8_1_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 1, 2.f, 0.5f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 2.f, 0.5f);
         checkError();
     }
 
     public void test_U8_4_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 4, 0.5f, 0.5f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 0.5f, 0.5f);
         checkError();
     }
     public void test_U8_3_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 3, 0.5f, 0.5f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 0.5f, 0.5f);
         checkError();
     }
     public void test_U8_2_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 2, 0.5f, 0.5f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 0.5f, 0.5f);
         checkError();
     }
     public void test_U8_1_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.UNSIGNED_8, 1, 0.5f, 0.5f);
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 0.5f, 0.5f);
         checkError();
     }
 
     public void test_U8_4_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 4, 1.f, 1.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 1.f, 1.f);
         checkError();
     }
     public void test_U8_3_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 3, 1.f, 1.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 1.f, 1.f);
         checkError();
     }
     public void test_U8_2_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 2, 1.f, 1.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 1.f, 1.f);
         checkError();
     }
     public void test_U8_1_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 1, 1.f, 1.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 1.f, 1.f);
         checkError();
     }
 
     public void test_U8_4_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 4, 2.f, 2.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 2.f, 2.f);
         checkError();
     }
     public void test_U8_3_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 3, 2.f, 2.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 2.f, 2.f);
         checkError();
     }
     public void test_U8_2_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 2, 2.f, 2.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 2.f, 2.f);
         checkError();
     }
     public void test_U8_1_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 1, 2.f, 2.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 2.f, 2.f);
         checkError();
     }
 
     public void test_U8_4_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 4, 0.5f, 2.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 0.5f, 2.f);
         checkError();
     }
     public void test_U8_3_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 3, 0.5f, 2.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 0.5f, 2.f);
         checkError();
     }
     public void test_U8_2_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 2, 0.5f, 2.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 0.5f, 2.f);
         checkError();
     }
     public void test_U8_1_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 1, 0.5f, 2.f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 0.5f, 2.f);
         checkError();
     }
 
     public void test_U8_4_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 4, 2.f, 0.5f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 2.f, 0.5f);
         checkError();
     }
     public void test_U8_3_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 3, 2.f, 0.5f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 2.f, 0.5f);
         checkError();
     }
     public void test_U8_2_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 2, 2.f, 0.5f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 2.f, 0.5f);
         checkError();
     }
     public void test_U8_1_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 1, 2.f, 0.5f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 2.f, 0.5f);
         checkError();
     }
 
     public void test_U8_4_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 4, 0.5f, 0.5f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 0.5f, 0.5f);
         checkError();
     }
     public void test_U8_3_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 3, 0.5f, 0.5f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 0.5f, 0.5f);
         checkError();
     }
     public void test_U8_2_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 2, 0.5f, 0.5f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 0.5f, 0.5f);
         checkError();
     }
     public void test_U8_1_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.UNSIGNED_8, 1, 0.5f, 0.5f);
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 0.5f, 0.5f);
         checkError();
     }
 
 
     public void test_F32_4_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 4, 1.f, 1.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 1.f, 1.f);
         checkError();
     }
     public void test_F32_3_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 3, 1.f, 1.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 1.f, 1.f);
         checkError();
     }
     public void test_F32_2_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 2, 1.f, 1.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 1.f, 1.f);
         checkError();
     }
     public void test_F32_1_SCALE10_10_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 1, 1.f, 1.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 1.f, 1.f);
         checkError();
     }
 
     public void test_F32_4_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 4, 2.f, 2.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 2.f, 2.f);
         checkError();
     }
     public void test_F32_3_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 3, 2.f, 2.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 2.f, 2.f);
         checkError();
     }
     public void test_F32_2_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 2, 2.f, 2.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 2.f, 2.f);
         checkError();
     }
     public void test_F32_1_SCALE20_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 1, 2.f, 2.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 2.f, 2.f);
         checkError();
     }
 
     public void test_F32_4_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 4, 0.5f, 2.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 0.5f, 2.f);
         checkError();
     }
     public void test_F32_3_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 3, 0.5f, 2.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 0.5f, 2.f);
         checkError();
     }
     public void test_F32_2_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 2, 0.5f, 2.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 0.5f, 2.f);
         checkError();
     }
     public void test_F32_1_SCALE05_20_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 1, 0.5f, 2.f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 0.5f, 2.f);
         checkError();
     }
 
     public void test_F32_4_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 4, 2.f, 0.5f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 2.f, 0.5f);
         checkError();
     }
     public void test_F32_3_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 3, 2.f, 0.5f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 2.f, 0.5f);
         checkError();
     }
     public void test_F32_2_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 2, 2.f, 0.5f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 2.f, 0.5f);
         checkError();
     }
     public void test_F32_1_SCALE20_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 1, 2.f, 0.5f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 2.f, 0.5f);
         checkError();
     }
 
     public void test_F32_4_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 4, 0.5f, 0.5f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 0.5f, 0.5f);
         checkError();
     }
     public void test_F32_3_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 3, 0.5f, 0.5f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 0.5f, 0.5f);
         checkError();
     }
     public void test_F32_2_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 2, 0.5f, 0.5f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 0.5f, 0.5f);
         checkError();
     }
     public void test_F32_1_SCALE05_05_inSqure() {
-        testReszie(inX, inX, Element.DataType.FLOAT_32, 1, 0.5f, 0.5f);
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 0.5f, 0.5f);
         checkError();
     }
 
     public void test_F32_4_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 4, 1.f, 1.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 1.f, 1.f);
         checkError();
     }
     public void test_F32_3_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 3, 1.f, 1.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 1.f, 1.f);
         checkError();
     }
     public void test_F32_2_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 2, 1.f, 1.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 1.f, 1.f);
         checkError();
     }
     public void test_F32_1_SCALE10_10_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 1, 1.f, 1.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 1.f, 1.f);
         checkError();
     }
 
     public void test_F32_4_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 4, 2.f, 2.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 2.f, 2.f);
         checkError();
     }
     public void test_F32_3_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 3, 2.f, 2.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 2.f, 2.f);
         checkError();
     }
     public void test_F32_2_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 2, 2.f, 2.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 2.f, 2.f);
         checkError();
     }
     public void test_F32_1_SCALE20_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 1, 2.f, 2.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 2.f, 2.f);
         checkError();
     }
 
     public void test_F32_4_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 4, 0.5f, 2.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 0.5f, 2.f);
         checkError();
     }
     public void test_F32_3_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 3, 0.5f, 2.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 0.5f, 2.f);
         checkError();
     }
     public void test_F32_2_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 2, 0.5f, 2.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 0.5f, 2.f);
         checkError();
     }
     public void test_F32_1_SCALE05_20_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 1, 0.5f, 2.f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 0.5f, 2.f);
         checkError();
     }
 
     public void test_F32_4_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 4, 2.f, 0.5f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 2.f, 0.5f);
         checkError();
     }
     public void test_F32_3_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 3, 2.f, 0.5f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 2.f, 0.5f);
         checkError();
     }
     public void test_F32_2_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 2, 2.f, 0.5f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 2.f, 0.5f);
         checkError();
     }
     public void test_F32_1_SCALE20_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 1, 2.f, 0.5f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 2.f, 0.5f);
         checkError();
     }
 
     public void test_F32_4_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 4, 0.5f, 0.5f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 0.5f, 0.5f);
         checkError();
     }
     public void test_F32_3_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 3, 0.5f, 0.5f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 0.5f, 0.5f);
         checkError();
     }
     public void test_F32_2_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 2, 0.5f, 0.5f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 0.5f, 0.5f);
         checkError();
     }
     public void test_F32_1_SCALE05_05_inRectangle() {
-        testReszie(inX, inY, Element.DataType.FLOAT_32, 1, 0.5f, 0.5f);
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 0.5f, 0.5f);
         checkError();
     }
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/KernelInputTest.java b/tests/tests/renderscript/src/android/renderscript/cts/KernelInputTest.java
new file mode 100644
index 0000000..ecb1b6d
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/KernelInputTest.java
@@ -0,0 +1,619 @@
+/*
+ * Copyright (C) 2015 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.renderscript.cts;
+
+import android.renderscript.Allocation;
+
+import android.renderscript.Byte2;
+import android.renderscript.Byte3;
+import android.renderscript.Byte4;
+
+import android.renderscript.Double2;
+import android.renderscript.Double3;
+import android.renderscript.Double4;
+
+import android.renderscript.Element;
+
+import android.renderscript.Float2;
+import android.renderscript.Float3;
+import android.renderscript.Float4;
+
+import android.renderscript.Int2;
+import android.renderscript.Int3;
+import android.renderscript.Int4;
+
+import android.renderscript.Long2;
+import android.renderscript.Long3;
+import android.renderscript.Long4;
+
+import android.renderscript.Short2;
+import android.renderscript.Short3;
+import android.renderscript.Short4;
+
+import android.renderscript.Element;
+
+/*
+ * This checks that modifications to input arguments done by a kernel
+ * are never reflected back to the input Allocation.
+ *
+ * The test works by launching forEach kernels that take different
+ * types of inputs. Each forEach kernel modifies its input in some way.
+ * After running the forEach kernel, the input Allocation is checked
+ * that it remains unmodified.
+ */
+public class KernelInputTest extends RSBaseCompute {
+
+    void checkForErrorsInScript(ScriptC_kernel_input script) {
+        mRS.finish();
+        script.invoke_checkError();
+        waitForMessage();
+        checkForErrors();
+    }
+
+    public void testInputNotModified_char() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.I8(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.I8(mRS), 1);
+
+        script.set_initial_value_char((byte) 6);
+        ain.copyFrom(new byte[]{ (byte) 6 });
+        script.forEach_clear_input_char(ain, tmp);
+        script.invoke_verify_input_char(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_char2() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.I8_2(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.I8_2(mRS), 1);
+
+        script.set_initial_value_char2(new Byte2((byte) 127, (byte) 3));
+        ain.copyFrom(new byte[]{ (byte) 127, (byte) 3 });
+        script.forEach_clear_input_char2(ain, tmp);
+        script.invoke_verify_input_char2(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_char3() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.I8_3(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.I8_3(mRS), 1);
+
+        script.set_initial_value_char3(new Byte3((byte) 127, (byte) 3, (byte) 4));
+        ain.copyFrom(new byte[]{ (byte) 127, (byte) 3, (byte) 4, 0 });
+        script.forEach_clear_input_char3(ain, tmp);
+        script.invoke_verify_input_char3(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_char4() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.I8_4(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.I8_4(mRS), 1);
+
+        script.set_initial_value_char4(new Byte4((byte) 127, (byte) 3, (byte) 4, (byte) 7));
+        ain.copyFrom(new byte[]{ (byte) 127, (byte) 3, (byte) 4, (byte) 7 });
+        script.forEach_clear_input_char4(ain, tmp);
+        script.invoke_verify_input_char4(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_double() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.F64(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.F64(mRS), 1);
+
+        script.set_initial_value_double((double) 6);
+        ain.copyFrom(new double[]{ (double) 6 });
+        script.forEach_clear_input_double(ain, tmp);
+        script.invoke_verify_input_double(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_double2() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.F64_2(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.F64_2(mRS), 1);
+
+        script.set_initial_value_double2(new Double2((double) 127, (double) 3));
+        ain.copyFrom(new double[]{ (double) 127, (double) 3 });
+        script.forEach_clear_input_double2(ain, tmp);
+        script.invoke_verify_input_double2(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_double3() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.F64_3(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.F64_3(mRS), 1);
+
+        script.set_initial_value_double3(new Double3((double) 127, (double) 3, (double) 4));
+        ain.copyFrom(new double[]{ (double) 127, (double) 3, (double) 4, 0 });
+        script.forEach_clear_input_double3(ain, tmp);
+        script.invoke_verify_input_double3(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_double4() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.F64_4(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.F64_4(mRS), 1);
+
+        script.set_initial_value_double4(new Double4((double) 127, (double) 3, (double) 4, (double) 7));
+        ain.copyFrom(new double[]{ (double) 127, (double) 3, (double) 4, (double) 7 });
+        script.forEach_clear_input_double4(ain, tmp);
+        script.invoke_verify_input_double4(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_float() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.F32(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.F32(mRS), 1);
+
+        script.set_initial_value_float((float) 6);
+        ain.copyFrom(new float[]{ (float) 6 });
+        script.forEach_clear_input_float(ain, tmp);
+        script.invoke_verify_input_float(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_float2() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.F32_2(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.F32_2(mRS), 1);
+
+        script.set_initial_value_float2(new Float2((float) 127, (float) 3));
+        ain.copyFrom(new float[]{ (float) 127, (float) 3 });
+        script.forEach_clear_input_float2(ain, tmp);
+        script.invoke_verify_input_float2(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_float3() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.F32_3(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.F32_3(mRS), 1);
+
+        script.set_initial_value_float3(new Float3((float) 127, (float) 3, (float) 4));
+        ain.copyFrom(new float[]{ (float) 127, (float) 3, (float) 4, 0 });
+        script.forEach_clear_input_float3(ain, tmp);
+        script.invoke_verify_input_float3(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_float4() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.F32_4(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.F32_4(mRS), 1);
+
+        script.set_initial_value_float4(new Float4((float) 127, (float) 3, (float) 4, (float) 7));
+        ain.copyFrom(new float[]{ (float) 127, (float) 3, (float) 4, (float) 7 });
+        script.forEach_clear_input_float4(ain, tmp);
+        script.invoke_verify_input_float4(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_int() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.I32(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.I32(mRS), 1);
+
+        script.set_initial_value_int(6);
+        ain.copyFrom(new int[]{ 6 });
+        script.forEach_clear_input_int(ain, tmp);
+        script.invoke_verify_input_int(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_int2() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.I32_2(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.I32_2(mRS), 1);
+
+        script.set_initial_value_int2(new Int2(127, 3));
+        ain.copyFrom(new int[]{ 127, 3 });
+        script.forEach_clear_input_int2(ain, tmp);
+        script.invoke_verify_input_int2(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_int3() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.I32_3(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.I32_3(mRS), 1);
+
+        script.set_initial_value_int3(new Int3(127, 3, 4));
+        ain.copyFrom(new int[]{ 127, 3, 4, 0 });
+        script.forEach_clear_input_int3(ain, tmp);
+        script.invoke_verify_input_int3(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_int4() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.I32_4(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.I32_4(mRS), 1);
+
+        script.set_initial_value_int4(new Int4(127, 3, 4, 7));
+        ain.copyFrom(new int[]{ 127, 3, 4, 7 });
+        script.forEach_clear_input_int4(ain, tmp);
+        script.invoke_verify_input_int4(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_long() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.I64(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.I64(mRS), 1);
+
+        script.set_initial_value_long((long) 6);
+        ain.copyFrom(new long[]{ (long) 6 });
+        script.forEach_clear_input_long(ain, tmp);
+        script.invoke_verify_input_long(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_long2() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.I64_2(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.I64_2(mRS), 1);
+
+        script.set_initial_value_long2(new Long2((long) 127, (long) 3));
+        ain.copyFrom(new long[]{ (long) 127, (long) 3 });
+        script.forEach_clear_input_long2(ain, tmp);
+        script.invoke_verify_input_long2(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_long3() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.I64_3(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.I64_3(mRS), 1);
+
+        script.set_initial_value_long3(new Long3((long) 127, (long) 3, (long) 4));
+        ain.copyFrom(new long[]{ (long) 127, (long) 3, (long) 4, 0 });
+        script.forEach_clear_input_long3(ain, tmp);
+        script.invoke_verify_input_long3(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_long4() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.I64_4(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.I64_4(mRS), 1);
+
+        script.set_initial_value_long4(new Long4((long) 127, (long) 3, (long) 4, (long) 7));
+        ain.copyFrom(new long[]{ (long) 127, (long) 3, (long) 4, (long) 7 });
+        script.forEach_clear_input_long4(ain, tmp);
+        script.invoke_verify_input_long4(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_short() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.I16(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.I16(mRS), 1);
+
+        script.set_initial_value_short((short) 6);
+        ain.copyFrom(new short[]{ (short) 6 });
+        script.forEach_clear_input_short(ain, tmp);
+        script.invoke_verify_input_short(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_short2() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.I16_2(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.I16_2(mRS), 1);
+
+        script.set_initial_value_short2(new Short2((short) 127, (short) 3));
+        ain.copyFrom(new short[]{ (short) 127, (short) 3 });
+        script.forEach_clear_input_short2(ain, tmp);
+        script.invoke_verify_input_short2(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_short3() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.I16_3(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.I16_3(mRS), 1);
+
+        script.set_initial_value_short3(new Short3((short) 127, (short) 3, (short) 4));
+        ain.copyFrom(new short[]{ (short) 127, (short) 3, (short) 4, 0 });
+        script.forEach_clear_input_short3(ain, tmp);
+        script.invoke_verify_input_short3(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_short4() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.I16_4(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.I16_4(mRS), 1);
+
+        script.set_initial_value_short4(new Short4((short) 127, (short) 3, (short) 4, (short) 7));
+        ain.copyFrom(new short[]{ (short) 127, (short) 3, (short) 4, (short) 7 });
+        script.forEach_clear_input_short4(ain, tmp);
+        script.invoke_verify_input_short4(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_uchar() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.U8(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.U8(mRS), 1);
+
+        script.set_initial_value_uchar((short) 6);
+        ain.copyFrom(new byte[]{ (byte) 6 });
+        script.forEach_clear_input_uchar(ain, tmp);
+        script.invoke_verify_input_uchar(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_uchar2() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.U8_2(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.U8_2(mRS), 1);
+
+        script.set_initial_value_uchar2(new Short2((short) 127, (short) 3));
+        ain.copyFrom(new byte[]{ (byte) 127, (byte) 3 });
+        script.forEach_clear_input_uchar2(ain, tmp);
+        script.invoke_verify_input_uchar2(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_uchar3() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.U8_3(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.U8_3(mRS), 1);
+
+        script.set_initial_value_uchar3(new Short3((short) 127, (short) 3, (short) 4));
+        ain.copyFrom(new byte[]{ (byte) 127, (byte) 3, (byte) 4, 0 });
+        script.forEach_clear_input_uchar3(ain, tmp);
+        script.invoke_verify_input_uchar3(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_uchar4() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.U8_4(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.U8_4(mRS), 1);
+
+        script.set_initial_value_uchar4(new Short4((short) 127, (short) 3, (short) 4, (short) 7));
+        ain.copyFrom(new byte[]{ (byte) 127, (byte) 3, (byte) 4, (byte) 7 });
+        script.forEach_clear_input_uchar4(ain, tmp);
+        script.invoke_verify_input_uchar4(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_uint() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.U32(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.U32(mRS), 1);
+
+        script.set_initial_value_uint((long) 6);
+        ain.copyFrom(new int[]{ 6 });
+        script.forEach_clear_input_uint(ain, tmp);
+        script.invoke_verify_input_uint(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_uint2() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.U32_2(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.U32_2(mRS), 1);
+
+        script.set_initial_value_uint2(new Long2((long) 127, (long) 3));
+        ain.copyFrom(new int[]{ 127, 3 });
+        script.forEach_clear_input_uint2(ain, tmp);
+        script.invoke_verify_input_uint2(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_uint3() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.U32_3(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.U32_3(mRS), 1);
+
+        script.set_initial_value_uint3(new Long3((long) 127, (long) 3, (long) 4));
+        ain.copyFrom(new int[]{ 127, 3, 4, 0 });
+        script.forEach_clear_input_uint3(ain, tmp);
+        script.invoke_verify_input_uint3(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_uint4() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.U32_4(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.U32_4(mRS), 1);
+
+        script.set_initial_value_uint4(new Long4((long) 127, (long) 3, (long) 4, (long) 7));
+        ain.copyFrom(new int[]{ 127, 3, 4, 7 });
+        script.forEach_clear_input_uint4(ain, tmp);
+        script.invoke_verify_input_uint4(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_ulong() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.U64(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.U64(mRS), 1);
+
+        script.set_initial_value_ulong((long) 6);
+        ain.copyFrom(new long[]{ (long) 6 });
+        script.forEach_clear_input_ulong(ain, tmp);
+        script.invoke_verify_input_ulong(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_ulong2() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.U64_2(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.U64_2(mRS), 1);
+
+        script.set_initial_value_ulong2(new Long2((long) 127, (long) 3));
+        ain.copyFrom(new long[]{ (long) 127, (long) 3 });
+        script.forEach_clear_input_ulong2(ain, tmp);
+        script.invoke_verify_input_ulong2(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_ulong3() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.U64_3(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.U64_3(mRS), 1);
+
+        script.set_initial_value_ulong3(new Long3((long) 127, (long) 3, (long) 4));
+        ain.copyFrom(new long[]{ (long) 127, (long) 3, (long) 4, 0 });
+        script.forEach_clear_input_ulong3(ain, tmp);
+        script.invoke_verify_input_ulong3(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_ulong4() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.U64_4(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.U64_4(mRS), 1);
+
+        script.set_initial_value_ulong4(new Long4((long) 127, (long) 3, (long) 4, (long) 7));
+        ain.copyFrom(new long[]{ (long) 127, (long) 3, (long) 4, (long) 7 });
+        script.forEach_clear_input_ulong4(ain, tmp);
+        script.invoke_verify_input_ulong4(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_ushort() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.U16(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.U16(mRS), 1);
+
+        script.set_initial_value_ushort(6);
+        ain.copyFrom(new short[]{ (short) 6 });
+        script.forEach_clear_input_ushort(ain, tmp);
+        script.invoke_verify_input_ushort(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_ushort2() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.U16_2(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.U16_2(mRS), 1);
+
+        script.set_initial_value_ushort2(new Int2(127, 3));
+        ain.copyFrom(new short[]{ (short) 127, (short) 3 });
+        script.forEach_clear_input_ushort2(ain, tmp);
+        script.invoke_verify_input_ushort2(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_ushort3() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.U16_3(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.U16_3(mRS), 1);
+
+        script.set_initial_value_ushort3(new Int3(127, 3, 4));
+        ain.copyFrom(new short[]{ (short) 127, (short) 3, (short) 4, 0 });
+        script.forEach_clear_input_ushort3(ain, tmp);
+        script.invoke_verify_input_ushort3(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputNotModified_ushort4() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+        Allocation ain = Allocation.createSized(mRS, Element.U16_4(mRS), 1);
+        Allocation tmp = Allocation.createSized(mRS, Element.U16_4(mRS), 1);
+
+        script.set_initial_value_ushort4(new Int4(127, 3, 4, 7));
+        ain.copyFrom(new short[]{ (short) 127, (short) 3, (short) 4, (short) 7 });
+        script.forEach_clear_input_ushort4(ain, tmp);
+        script.invoke_verify_input_ushort4(ain);
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputsNotModified_small() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+
+        Allocation tmp = Allocation.createSized(mRS, ScriptField_small.createElement(mRS), 1);
+        ScriptField_small item = new ScriptField_small(mRS, 1);
+
+        item.set_x(0, new int[]{6}, true);
+        script.set_initial_value_small(item.get(0));
+        script.forEach_clear_input_small(item.getAllocation(), tmp);
+        script.invoke_verify_input_small(item.getAllocation());
+
+        checkForErrorsInScript(script);
+    }
+
+    public void testInputsNotModified_big() {
+        ScriptC_kernel_input script = new ScriptC_kernel_input(mRS);
+
+        Allocation tmp = Allocation.createSized(mRS, ScriptField_big.createElement(mRS), 1);
+        ScriptField_big item = new ScriptField_big(mRS, 1);
+
+        for (int i = 0; i < 100; i++) {
+            int[] input = new int[100];
+
+            input[i] = 6;
+            item.set_x(0, input, true);
+            script.set_initial_value_big(item.get(0));
+            script.forEach_clear_input_big(item.getAllocation(), tmp);
+            script.invoke_verify_input_big(item.getAllocation());
+       }
+
+      checkForErrorsInScript(script);
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/KernelTest.java b/tests/tests/renderscript/src/android/renderscript/cts/KernelTest.java
index 64368b6..90d4fe9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/KernelTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/KernelTest.java
@@ -475,8 +475,8 @@
         s.invoke_verify_foo();
         s.invoke_foreach_test();
         mRS.finish();
-        checkForErrors();
         waitForMessage();
+        checkForErrors();
     }
 
     public void testNoRoot() {
@@ -494,7 +494,7 @@
         s.invoke_verify_foo();
         s.invoke_noroot_test();
         mRS.finish();
-        checkForErrors();
         waitForMessage();
+        checkForErrors();
     }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/LaunchClip.java b/tests/tests/renderscript/src/android/renderscript/cts/LaunchClip.java
new file mode 100644
index 0000000..b87b705
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/LaunchClip.java
@@ -0,0 +1,297 @@
+/*
+ * Copyright (C) 2015 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.renderscript.cts;
+
+import android.renderscript.*;
+
+
+
+public class LaunchClip extends RSBaseCompute {
+    Allocation mAPassFail;
+    Allocation mAin;
+    Allocation mAout;
+    ScriptC_launchclip mScript;
+
+    int[] mIn;
+    int[] mOut;
+    int[] mPassFail;
+
+    int mDimX = 0;
+    int mDimY = 0;
+    int mDimZ = 0;
+    boolean mHasFaces = false;
+    boolean mHasLods = false;
+    int mDimA0 = 0;
+    int mDimA1 = 0;
+    int mDimA2 = 0;
+    int mDimA3 = 0;
+    int mCellCount = 0;
+
+    void setup(boolean makeIn, boolean makeOut, int x, int y, int z, boolean face, boolean lods,
+               int a0, int a1, int a2, int a3) {
+
+        mDimX = x;
+        mDimY = y;
+        mDimZ = z;
+        mHasFaces = face;
+        mHasLods = lods;
+        mDimA0 = a0;
+        mDimA1 = a1;
+        mDimA2 = a2;
+        mDimA3 = a3;
+
+        mScript = new ScriptC_launchclip(mRS);
+        mScript.set_dimX(mDimX);
+        mScript.set_dimY(mDimY);
+        mScript.set_dimZ(mDimZ);
+        mScript.set_hasFaces(mHasFaces);
+        mScript.set_hasLod(mHasLods);
+        mScript.set_dimA0(mDimA0);
+        mScript.set_dimA1(mDimA1);
+        mScript.set_dimA2(mDimA2);
+        mScript.set_dimA3(mDimA3);
+
+        Type.Builder tb = new Type.Builder(mRS, Element.I32(mRS));
+        tb.setX(mDimX);
+        if (mDimY > 0) tb.setY(mDimY);
+        if (mDimZ > 0) tb.setZ(mDimZ);
+        if (mHasFaces) tb.setFaces(true);
+        if (mHasLods) tb.setMipmaps(true);
+        //if (mDimA0 != 0) tb.setArray(0, mDimA0);
+        //if (mDimA1 != 0) tb.setArray(1, mDimA1);
+        //if (mDimA2 != 0) tb.setArray(2, mDimA2);
+        //if (mDimA3 != 0) tb.setArray(3, mDimA3);
+        Type t = tb.create();
+
+        if (makeIn) {
+            mIn = new int[t.getCount()];
+            mAin = Allocation.createTyped(mRS, t);
+            mScript.forEach_zero(mAin);
+        }
+        if (makeOut) {
+            mOut = new int[t.getCount()];
+            mAout = Allocation.createTyped(mRS, t);
+            mScript.forEach_zero(mAout);
+        }
+
+        mPassFail = new int[1];
+        mAPassFail = Allocation.createSized(mRS, Element.U32(mRS), 1);
+        mAPassFail.copyFrom(mPassFail);
+        mScript.set_passfail(mAPassFail);
+    }
+
+    private void verifyCell(int x, int y, int z, int[] a, Script.LaunchOptions sc) {
+        int expected = 0x80000000;
+        boolean inRange = true;
+
+        if (mDimX != 0) {
+            if (x >= sc.getXStart() && x < sc.getXEnd()) {
+                expected |= x;
+            } else {
+                inRange = false;
+            }
+        }
+
+        if (mDimY != 0) {
+            if (y >= sc.getYStart() && y < sc.getYEnd()) {
+                expected |= y << 8;
+            } else {
+                inRange = false;
+            }
+        }
+
+        if (mDimZ != 0) {
+            if (z >= sc.getZStart() && z < sc.getZEnd()) {
+                expected |= z << 16;
+            } else {
+                inRange = false;
+            }
+        }
+
+        if (!inRange) {
+            expected = 0;
+        }
+
+        int val = a[x + y * mDimX + z * mDimX * mDimY];
+        if (val != expected) {
+            String s = new String("verify error @ " + x + ", " + y + ", " + z +
+                                  ", expected " + expected + ", got " + val);
+            ///android.util.Log.e("rs", s);
+            throw new IllegalStateException(s);
+        }
+    }
+
+    void verifyRange(Script.LaunchOptions sc, int[] a) {
+        int itY = (mDimY > 0) ? mDimY : 1;
+        int itZ = (mDimZ > 0) ? mDimZ : 1;
+
+        for (int x = 0; x < mDimX; x++) {
+            for (int y = 0; y < itY; y++) {
+                for (int z = 0; z < itZ; z++) {
+                    verifyCell(x, y, z, a, sc);
+                }
+            }
+        }
+    }
+
+    AllocationAdapter makeAdapter(Allocation base, int ax, int ay, int az, int ox, int oy, int oz) {
+        Type.Builder tb = new Type.Builder(mRS, base.getType().getElement());
+        tb.setX(ax);
+        if (ay > 0) {
+            tb.setY(ay);
+        }
+        if (az > 0) {
+            tb.setZ(az);
+        }
+        Type t = tb.create();
+
+        AllocationAdapter a = AllocationAdapter.createTyped(mRS, base, t);
+        a.setX(ox);
+        if (base.getType().getY() > 0) {
+            a.setY(oy);
+        }
+        if (base.getType().getZ() > 0) {
+            a.setZ(oz);
+        }
+
+        mScript.set_biasX(ox);
+        mScript.set_biasY(oy);
+        mScript.set_biasZ(oz);
+        return a;
+    }
+
+    public void testWrite1D() {
+        setup(false, true, 256, 0, 0, false, false, 0, 0, 0, 0);
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(9, 77);
+
+        mScript.forEach_write1d(mAout, sc);
+        mAout.copyTo(mOut);
+
+        verifyRange(sc, mOut);
+    }
+
+    public void testWrite1DAdapter1D() {
+        setup(false, true, 256, 0, 0, false, false, 0, 0, 0, 0);
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(9, 77);
+
+        AllocationAdapter a = makeAdapter(mAout, 68, 0, 0,  9, 0, 0);
+        mScript.forEach_write1d(a);
+        mAout.copyTo(mOut);
+
+        verifyRange(sc, mOut);
+    }
+
+
+    public void testWrite2D() {
+        setup(false, true, 256, 256, 0, false, false, 0, 0, 0, 0);
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(9, 77);
+        sc.setY(17, 177);
+
+        mScript.forEach_write2d(mAout, sc);
+        mAout.copyTo(mOut);
+
+        verifyRange(sc, mOut);
+    }
+
+    public void testWrite2DAdapter1D() {
+        setup(false, true, 256, 256, 0, false, false, 0, 0, 0, 0);
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(9, 77);
+        sc.setY(17, 18);
+
+        AllocationAdapter a = makeAdapter(mAout, 68, 0, 0,  9, 17, 0);
+        mScript.forEach_write1d(a);
+        mAout.copyTo(mOut);
+
+        verifyRange(sc, mOut);
+    }
+
+    public void testWrite2DAdapter2D() {
+        setup(false, true, 256, 256, 0, false, false, 0, 0, 0, 0);
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(9, 77);
+        sc.setY(17, 177);
+
+        AllocationAdapter a = makeAdapter(mAout, 68, 160, 0,  9, 17, 0);
+        mScript.forEach_write2d(a);
+        mAout.copyTo(mOut);
+
+        verifyRange(sc, mOut);
+    }
+
+    public void testWrite3D() {
+        setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0);
+
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(9, 37);
+        sc.setY(17, 27);
+        sc.setZ(7, 21);
+        mScript.forEach_write3d(mAout, sc);
+        mAout.copyTo(mOut);
+
+        verifyRange(sc, mOut);
+    }
+
+    public void testWrite3DAdapter1D() {
+        setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0);
+
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(9, 37);
+        sc.setY(17, 18);
+        sc.setZ(7, 8);
+
+        AllocationAdapter a = makeAdapter(mAout, 28, 0, 0,  9, 17, 7);
+        mScript.forEach_write1d(a);
+        mAout.copyTo(mOut);
+
+        verifyRange(sc, mOut);
+    }
+
+    public void testWrite3DAdapter2D() {
+        setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0);
+
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(9, 37);
+        sc.setY(17, 27);
+        sc.setZ(7, 8);
+
+        AllocationAdapter a = makeAdapter(mAout, 28, 10, 0,  9, 17, 7);
+        mScript.forEach_write2d(a);
+        mAout.copyTo(mOut);
+
+        verifyRange(sc, mOut);
+    }
+
+    public void testWrite3DAdapter3D() {
+        setup(false, true, 64, 64, 64, false, false, 0, 0, 0, 0);
+
+        Script.LaunchOptions sc = new Script.LaunchOptions();
+        sc.setX(9, 37);
+        sc.setY(17, 27);
+        sc.setZ(7, 21);
+
+        AllocationAdapter a = makeAdapter(mAout, 28, 10, 14,  9, 17, 7);
+        mScript.forEach_write3d(a);
+        mAout.copyTo(mOut);
+
+        verifyRange(sc, mOut);
+    }
+
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java b/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java
index ebf15dc..2ca4f13 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java
@@ -34,10 +34,13 @@
     Resources mRes;
 
     private int result;
-    private boolean msgHandled;
+    // msgHandled is used to synchronize between waitForMessage() and the
+    // RSMessageHandler thread.
+    private volatile boolean msgHandled;
 
-    private static final int RS_MSG_TEST_PASSED = 100;
-    private static final int RS_MSG_TEST_FAILED = 101;
+    protected static final int RS_MSG_TEST_PASSED = 100;
+    protected static final int RS_MSG_TEST_FAILED = 101;
+    protected static final int RS_MSG_TEST_FLUSH = 102;
 
     RSMessageHandler mRsMessage = new RSMessageHandler() {
         public void run() {
@@ -47,6 +50,8 @@
                     case RS_MSG_TEST_FAILED:
                         result = mID;
                         break;
+                    case RS_MSG_TEST_FLUSH:
+                        break;
                     default:
                         fail("Got unexpected RS message");
                         return;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RSBaseCompute.java b/tests/tests/renderscript/src/android/renderscript/cts/RSBaseCompute.java
index 413b2d4..0ba8248 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RSBaseCompute.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RSBaseCompute.java
@@ -39,10 +39,6 @@
 
     @Override
     protected void tearDown() throws Exception {
-        if (mRS != null) {
-            mRS.destroy();
-            mRS = null;
-        }
         super.tearDown();
     }
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/SampleTest.java b/tests/tests/renderscript/src/android/renderscript/cts/SampleTest.java
index bc69b0e..a468b9f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/SampleTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/SampleTest.java
@@ -92,8 +92,8 @@
     public void testNearest() {
         mScript.invoke_test_RGBA(mAlloc_RGBA_1D, mAlloc_RGBA_2D);
         mRS.finish();
-        checkForErrors();
         waitForMessage();
+        checkForErrors();
     }
 }
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java
index d44c305..a52d308 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java
@@ -34,6 +34,8 @@
 
 public class ScriptGroupTest extends RSBaseCompute {
 
+    private static final String TAG = "ScriptGroupTest";
+    private static final int ARRAY_SIZE = 256;
     static int bDimX = 48;
     static int bDimY = 8;
 
@@ -309,4 +311,242 @@
 
         checkForErrors();
     }
+
+    /**
+     * Tests that kernel-to-kernel dependency via input/output is handled correctly
+     */
+    public void testBuilder2PointWiseKernelToKernelDependency() {
+        ScriptC_increment s_inc = new ScriptC_increment(mRS);
+        ScriptC_double s_double = new ScriptC_double(mRS);
+        mRS.setMessageHandler(mRsMessage);
+
+        int[] array = new int[ARRAY_SIZE * 4];
+
+        for (int i = 0; i < ARRAY_SIZE * 4; i++) {
+            array[i] = i;
+        }
+
+        Allocation input = Allocation.createSized(mRS, Element.I32_4(mRS), ARRAY_SIZE);
+        input.copyFrom(array);
+
+        ScriptGroup.Builder2 builder = new ScriptGroup.Builder2(mRS);
+
+        ScriptGroup.Input unbound = builder.addInput();
+
+        Type connectType = Type.createX(mRS, Element.I32_4(mRS), ARRAY_SIZE);
+
+        ScriptGroup.Closure c0 =
+                builder.addKernel(s_inc.getKernelID_increment(),
+                                  connectType,
+                                  unbound);
+
+        ScriptGroup.Closure c1 =
+                builder.addKernel(s_double.getKernelID_doubleKernel(),
+                                  connectType,
+                                  c0.getReturn());
+
+        ScriptGroup group = builder.create("IncAndDbl", c1.getReturn());
+
+        int[] a = new int[ARRAY_SIZE * 4];
+        ((Allocation)group.execute(input)[0]).copyTo(a);
+
+        mRS.finish();
+
+        boolean failed = false;
+        for (int i = 0; i < ARRAY_SIZE * 4; i++) {
+            if (a[i] != (i+1) * 2) {
+                Log.e(TAG, "a["+i+"]="+a[i]+", should be "+ ((i+1) * 2));
+                failed = true;
+            }
+        }
+
+        assertTrue(!failed);
+    }
+
+    /**
+     * Tests that kernel-to-kernel dependency via global allocations is handled correctly
+     */
+    public void testBuilder2GatherScatterAcrossKernelsViaGlobals() {
+        ScriptC_reduction s = new ScriptC_reduction(mRS);
+
+        int[] array = new int[ARRAY_SIZE * 4];
+
+        for (int i = 0; i < ARRAY_SIZE; i++) {
+            array[i*4] = i * 7;
+            array[i*4 + 1] = i * 7;
+            array[i*4 + 2] = i * 7;
+            array[i*4 + 3] = i * 7;
+        }
+
+        Allocation input = Allocation.createSized(mRS, Element.I32_4(mRS), ARRAY_SIZE);
+        input.copyFrom(array);
+
+        ScriptGroup.Builder2 builder = new ScriptGroup.Builder2(mRS);
+
+        ScriptGroup.Input unbound = builder.addInput();
+
+        ScriptGroup.Closure c = null;
+        ScriptGroup.Binding b2 = new ScriptGroup.Binding(s.getFieldID_a(), unbound);
+        for (int stride = ARRAY_SIZE / 2; stride >= 1; stride >>= 1) {
+            ScriptGroup.Binding b1 = new ScriptGroup.Binding(s.getFieldID_reduction_stride(),
+                                                             stride);
+            c = builder.addKernel(s.getKernelID_add(),
+                                  Type.createX(mRS, Element.I32_4(mRS), stride),
+                                  b1, b2);
+            b2 = new ScriptGroup.Binding(s.getFieldID_a(), c.getReturn());
+        }
+
+        if (c == null) {
+            return;
+        }
+
+        ScriptGroup group = builder.create("Summation", c.getReturn());
+
+        int[] a = new int[4];
+        ((Allocation)group.execute(input)[0]).copyTo(a);
+
+        mRS.finish();
+
+        boolean failed = false;
+        for (int i = 0; i < 4; i++) {
+            if (failed == false && a[i] != ARRAY_SIZE * (ARRAY_SIZE - 1) * 7 / 2) {
+                Log.e(TAG,
+                      "a["+i+"]="+a[i]+", should be "+ (ARRAY_SIZE * (ARRAY_SIZE - 1) * 7 / 2));
+                failed = true;
+            }
+        }
+
+        assertTrue(!failed);
+    }
+
+    /**
+     * Tests that the kernel output to a global can be used as a future
+     */
+    public void testBuilder2KernelOutputToGlobal() {
+        ScriptC_reduction s = new ScriptC_reduction(mRS);
+
+        int[] array = new int[ARRAY_SIZE * 4];
+
+        for (int i = 0; i < ARRAY_SIZE; i++) {
+            array[i*4] = i;
+            array[i*4 + 1] = i;
+            array[i*4 + 2] = i;
+            array[i*4 + 3] = i;
+        }
+
+        Allocation input = Allocation.createSized(mRS, Element.I32_4(mRS), ARRAY_SIZE);
+        input.copyFrom(array);
+        Allocation input1 = Allocation.createSized(mRS, Element.I32_4(mRS), ARRAY_SIZE);
+
+        ScriptGroup.Builder2 builder = new ScriptGroup.Builder2(mRS);
+
+        ScriptGroup.Input unbound = builder.addInput();
+
+        ScriptGroup.Closure c = null;
+        ScriptGroup.Binding b2 = new ScriptGroup.Binding(s.getFieldID_a(), unbound);
+        for (int stride = ARRAY_SIZE / 2; stride >= 1; stride >>= 1) {
+            ScriptGroup.Binding b1 = new ScriptGroup.Binding(s.getFieldID_reduction_stride(),
+                                                             stride);
+            c = builder.addKernel(s.getKernelID_add2(),
+                                  Type.createX(mRS, Element.I32_4(mRS), stride),
+                                  b1, b2);
+            b2 = new ScriptGroup.Binding(s.getFieldID_a(),
+                                         c.getGlobal(s.getFieldID_a()));
+        }
+
+        if (c == null) {
+            return;
+        }
+
+        ScriptGroup group = builder.create("SummationGlobal", c.getGlobal(s.getFieldID_a()));
+
+        int[] a = new int[4 * ARRAY_SIZE];
+        ((Allocation)group.execute(input, input1)[0]).copyTo(a);
+
+        mRS.finish();
+
+        boolean failed = false;
+        for (int i = 0; i < 4; i++) {
+            if (failed == false && a[i] != ARRAY_SIZE * (ARRAY_SIZE - 1) / 2) {
+                Log.e(TAG,
+                      "a["+i+"]="+a[i]+", should be "+ (ARRAY_SIZE * (ARRAY_SIZE - 1) / 2));
+                failed = true;
+            }
+        }
+
+        assertTrue(!failed);
+    }
+
+    /**
+     * Tests that invoke-to-kernel dependency is handled correctly
+     */
+    public void testBuilder2InvokeToKernelDependency() {
+        ScriptC_matrix s = new ScriptC_matrix(mRS);
+
+        float[] array = new float[ARRAY_SIZE * 4];
+
+        for (int i = 0; i < ARRAY_SIZE; i++) {
+            array[i * 4] = i * 4 * 7;
+            array[i * 4 + 1] = (i * 4 + 1) * 7;
+            array[i * 4 + 2] = (i * 4 + 2) * 7;
+            array[i * 4 + 3] = (i * 4 + 3) * 7;
+        }
+
+        Allocation input = Allocation.createSized(mRS, Element.F32_4(mRS), ARRAY_SIZE);
+        input.copyFrom(array);
+
+        ScriptGroup.Builder2 builder = new ScriptGroup.Builder2(mRS);
+
+        ScriptGroup.Input unbound = builder.addInput();
+
+        Matrix4f mat = new Matrix4f();
+
+        mat.set(0, 0, 0.0f);
+        mat.set(0, 1, 0.0f);
+        mat.set(0, 2, 0.0f);
+        mat.set(0, 3, 1.0f);
+
+        mat.set(1, 0, 1.0f);
+        mat.set(1, 1, 0.0f);
+        mat.set(1, 2, 0.0f);
+        mat.set(1, 3, 0.0f);
+
+        mat.set(2, 0, 0.0f);
+        mat.set(2, 1, 1.0f);
+        mat.set(2, 2, 0.0f);
+        mat.set(2, 3, 0.0f);
+
+        mat.set(3, 0, 0.0f);
+        mat.set(3, 1, 0.0f);
+        mat.set(3, 2, 1.0f);
+        mat.set(3, 3, 0.0f);
+
+        ScriptGroup.Closure c1 =
+                builder.addInvoke(s.getInvokeID_setMatrix(), mat);
+
+        ScriptGroup.Closure c2 =
+                builder.addKernel(s.getKernelID_multiply(),
+                                  Type.createX(mRS, Element.F32_4(mRS), ARRAY_SIZE),
+                                  unbound);
+
+        ScriptGroup group = builder.create("Multiply", c2.getReturn());
+
+        float[] a = new float[ARRAY_SIZE * 4];
+        ((Allocation)group.execute(input)[0]).copyTo(a);
+
+        mRS.finish();
+
+        boolean failed = false;
+        for (int i = 0; i < ARRAY_SIZE; i++) {
+            for (int j = 0; j < 4; j++) {
+                float expected = (i*4+((j+1)%4))*7;
+                if (failed == false && a[i * 4 + j] != expected) {
+                    Log.e(TAG, "a["+i+"]="+a[i]+", should be "+ expected);
+                    failed = true;
+                }
+            }
+        }
+
+        assertTrue(!failed);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestCtxDim.java b/tests/tests/renderscript/src/android/renderscript/cts/TestCtxDim.java
new file mode 100644
index 0000000..4a2af00
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCtxDim.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2015 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.renderscript.cts;
+
+import android.renderscript.*;
+
+public class TestCtxDim extends RSBaseCompute {
+
+    public void test() {
+        ScriptC_TestCtxDim script = new ScriptC_TestCtxDim(mRS);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32(mRS));
+        int X = 2;
+        script.set_gDimX(X);
+        typeBuilder.setX(X);
+        int Y = 5;
+        script.set_gDimY(Y);
+        typeBuilder.setY(Y);
+        int Z = 11;
+        script.set_gDimZ(Z);
+        typeBuilder.setZ(Z);
+
+        Allocation A = Allocation.createTyped(mRS, typeBuilder.create());
+
+        script.forEach_check_kernel(A);
+        script.invoke_check_result();
+        mRS.finish();
+        waitForMessage();
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestCtxDim.rs b/tests/tests/renderscript/src/android/renderscript/cts/TestCtxDim.rs
new file mode 100644
index 0000000..3530f1c
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCtxDim.rs
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+#include "shared.rsh"
+
+int gDimX, gDimY, gDimZ;
+static bool failed = false;
+
+void __attribute__((kernel)) check_kernel(int32_t in /* dummy */, rs_kernel_context context) {
+    uint32_t dimX = rsGetDimX(context);
+    _RS_ASSERT(gDimX == dimX);
+    uint32_t dimY = rsGetDimY(context);
+    _RS_ASSERT(gDimY == dimY);
+    uint32_t dimZ = rsGetDimZ(context);
+    _RS_ASSERT(gDimZ == dimZ);
+}
+
+void check_result() {
+    if (failed) {
+        rsSendToClientBlocking(RS_MSG_TEST_FAILED);
+    }
+    else {
+        rsSendToClientBlocking(RS_MSG_TEST_PASSED);
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ThunkerCreateTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ThunkerCreateTest.java
new file mode 100644
index 0000000..735519c
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ThunkerCreateTest.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2015 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.renderscript.cts;
+
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+import android.content.Context;
+import android.renderscript.RSRuntimeException;
+
+public class ThunkerCreateTest extends RSBase {
+
+    public void testCreateReflection() {
+        int sdkVersion = mCtx.getApplicationInfo().targetSdkVersion;
+
+        try {
+            Class<?> javaRS = Class.forName("android.renderscript.RenderScript");
+            Class[] signature = {Context.class, Integer.TYPE};
+            Object[] args = {mCtx, new Integer(sdkVersion)};
+            Method create = javaRS.getDeclaredMethod("create", signature);
+
+            assertTrue (create.invoke(null, args) != null);
+        }
+        catch (Exception e) {
+            throw new RSRuntimeException("Failure to create platform RenderScript context");
+        }
+
+    }
+}
+
+
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TypeTest.java b/tests/tests/renderscript/src/android/renderscript/cts/TypeTest.java
index 13d4977..abb532d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TypeTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TypeTest.java
@@ -143,6 +143,14 @@
         assertTrue(t.getY() == 4);
     }
 
+    public void testGetYuv() {
+        Type.Builder b = new Type.Builder(mRS, Element.F32(mRS));
+        b.setX(64).setY(64);
+        b.setYuvFormat(android.graphics.ImageFormat.YV12);
+        Type t = b.create();
+        assertTrue(t.getYuv() == android.graphics.ImageFormat.YV12);
+    }
+
     public void testGetZ() {
         Type.Builder b = new Type.Builder(mRS, Element.F32(mRS));
         b.setX(3).setY(4);
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/YuvTest.java b/tests/tests/renderscript/src/android/renderscript/cts/YuvTest.java
index 5cdfe95..e162d1d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/YuvTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/YuvTest.java
@@ -97,11 +97,11 @@
         Allocation ta = Allocation.createSized(mRS, Element.U8(mRS), tmp.length);
         ta.copyFrom(tmp);
 
-
         ScriptIntrinsicYuvToRGB syuv = ScriptIntrinsicYuvToRGB.create(mRS, Element.U8(mRS));
         syuv.setInput(ta);
         syuv.forEach(aout);
-
+        
+        mVerify.set_gAllowedIntError(2); // this will allow for less strict implementation
         ScriptC_yuv script = new ScriptC_yuv(mRS);
         script.invoke_makeRef(ay, au, av, aref);
 
@@ -141,7 +141,8 @@
         }
         ta.copyFrom(tmp);
         script.invoke_makeRef(ay, au, av, aref);
-
+        
+        mVerify.set_gAllowedIntError(2); // this will allow for less strict implementation
         syuv.setInput(ta);
         syuv.forEach(aout);
         mVerify.invoke_verify(aref, aout, ay);
@@ -186,6 +187,7 @@
         }
         ta.copyFrom(tmp);
         script.invoke_makeRef(ay, au, av, aref);
+        mVerify.set_gAllowedIntError(2); // this will allow for less strict implementation
 
         syuv.setInput(ta);
         syuv.forEach(aout);
@@ -236,6 +238,7 @@
         mVerify.invoke_verify(aref, aout, ay);
 
         mRS.finish();
+        mVerify.set_gAllowedFloatError(0.01f); // this will allow for less strict implementation
         mVerify.invoke_checkError();
         waitForMessage();
         checkForErrors();
@@ -266,11 +269,13 @@
             tmp[i++] = bv[j];
             tmp[i++] = bu[j];
         }
+
         ta.copyFrom(tmp);
         script.invoke_makeRef_f4(ay, au, av, aref);
 
         script.set_mInput(ta);
         script.forEach_cvt_f4(aout);
+        mVerify.set_gAllowedFloatError(0.01f); // this will allow for less strict implementation
         mVerify.invoke_verify(aref, aout, ay);
 
         mRS.finish();
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/double.rs b/tests/tests/renderscript/src/android/renderscript/cts/double.rs
new file mode 100644
index 0000000..86ced05
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/double.rs
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+int4 __attribute__((kernel)) doubleKernel(int4 in)
+{
+  return in * 2;
+}
\ No newline at end of file
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/doubleglobal.rs b/tests/tests/renderscript/src/android/renderscript/cts/doubleglobal.rs
new file mode 100644
index 0000000..9a8cb69
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/doubleglobal.rs
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+// This test the case where a kernel does not use a double but there is a global variable of type
+// double present in the file see bug:23213925
+
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+#pragma rs_fp_relaxed
+
+float pi2;
+double pi = 3.14159265359;
+
+void func_setup() {
+  pi2 = pi * 2;
+}
+
+float RS_KERNEL times2pi(uint32_t x) {
+  return pi2 * x;
+}
\ No newline at end of file
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/float16_arithmetic.rs b/tests/tests/renderscript/src/android/renderscript/cts/float16_arithmetic.rs
new file mode 100644
index 0000000..9bd90fd
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/float16_arithmetic.rs
@@ -0,0 +1,38 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+rs_allocation gInput;
+
+half RS_KERNEL add(int x, int y) {
+    half a = rsGetElementAt_half(gInput, x);
+    half b = rsGetElementAt_half(gInput, y);
+    return a + b;
+}
+
+half RS_KERNEL sub(int x, int y) {
+    half a = rsGetElementAt_half(gInput, x);
+    half b = rsGetElementAt_half(gInput, y);
+    return a - b;
+}
+
+half RS_KERNEL mul(int x, int y) {
+    half a = rsGetElementAt_half(gInput, x);
+    half b = rsGetElementAt_half(gInput, y);
+    return a * b;
+}
+
+half RS_KERNEL div(int x, int y) {
+    half a = rsGetElementAt_half(gInput, x);
+    half b = rsGetElementAt_half(gInput, y);
+    return a / b;
+}
+
+union Bit16Type {
+    half h;
+    unsigned short s;
+};
+
+unsigned short __attribute__((kernel)) bitcast(half h) {
+    union Bit16Type u = {h};
+    return u.s;
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/float16_gen.c b/tests/tests/renderscript/src/android/renderscript/cts/float16_gen.c
new file mode 100644
index 0000000..fed0563
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/float16_gen.c
@@ -0,0 +1,281 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+
+// This utility generates a Java file containing data used in the CTS test for
+// FP16 arithmetic.  The Java file containes a class with the following fields:
+//     * A 1D array of length 'n' containing various constants used in the test
+//     * Four n x n x 2 arrays, each containing the reference output for
+//     pair-wise addition, subtraction, multiplication and division.  The
+//     reference output is a range accounting for tolerable error.  The
+//     acceptable error is 3 x ULP for division and 1 x ULP for other
+//     operations.
+
+typedef __fp16 half;
+
+// Macros for names of the package, class and fields in the generated java file
+#define PACKAGE_NAME "android.renderscript.cts"
+#define CLASS_NAME "Float16TestData"
+#define INPUT_ARRAY "input"
+#define OUTPUT_ARRAY_ADD "ReferenceOutputForAdd"
+#define OUTPUT_ARRAY_SUB "ReferenceOutputForSub"
+#define OUTPUT_ARRAY_MUL "ReferenceOutputForMul"
+#define OUTPUT_ARRAY_DIV "ReferenceOutputForDiv"
+
+// Structure to hold an FP16 constant and its human-readable description, to be
+// added as a comment, in the generated Java file
+typedef struct {
+  unsigned short value;
+  const char* description;
+} FP16Constant;
+
+FP16Constant input[] = {
+    { 0b0011110000000000, "one" },
+    { 0b0100000000000000, "two" },
+    { 0b0000000000000001, "smallest subnormal" },
+    { 0b0000001111111111, "largest subnormal" },
+    { 0b0000010000000000, "smallest normal" },
+    { 0b0111101111111111, "largest normal" },
+    { 0x3880, "0.562500" },
+    { 0x3e80, "1.625000" },
+    { 0x5140, "42.000000" },
+    { 0x5ac0, "216.000000" },
+    { 0x6c75, "4564.000000" },
+    { 0x7b53, "60000.000000" },
+    { 0b1011110000000000, "negative one" },
+    { 0b1100000000000000, "negative two" },
+    { 0b1000000000000001, "negative (smallest subnormal)" },
+    { 0b1000001111111111, "negative (largest subnormal)" },
+    { 0b1000010000000000, "negative (smallest normal)" },
+    { 0b1111101111111111, "negative (largest normal)" },
+    { 0xb880, "-0.562500" },
+    { 0xbe80, "-1.625000" },
+    { 0xd140, "-42.000000" },
+    { 0xdac0, "-216.000000" },
+    { 0xec75, "-4564.000000" },
+    { 0xfb53, "-60000.000000" },
+    { 0b0000000000000000, "zero" },
+    { 0b0111110000000000, "infinity" },
+    { 0b1000000000000000, "negative zero" },
+    { 0b1111110000000000, "negative infinity" },
+    { 0b0111110000000001, "nan" },
+};
+
+const int numInputs = sizeof(input) / sizeof(FP16Constant);
+
+// 16-bit masks for extracting sign, exponent and mantissa bits
+static unsigned short SIGN_MASK     = 0x8000;
+static unsigned short EXPONENT_MASK = 0x7C00;
+static unsigned short MANTISSA_MASK = 0x03FF;
+
+// NaN has all exponent bits set to 1 and a non-zero mantissa
+int isFloat16NaN(unsigned short val) {
+  return (val & EXPONENT_MASK) == EXPONENT_MASK &&
+         (val & MANTISSA_MASK) != 0;
+}
+
+// Infinity has all exponent bits set to 1 and zeroes in mantissa
+int isFloat16Infinite(unsigned short val) {
+  return (val & EXPONENT_MASK) == EXPONENT_MASK &&
+         (val & MANTISSA_MASK) == 0;
+}
+
+// Subnormal numbers have exponent bits set to 0 and a non-zero mantissa
+int isFloat16SubNormal(unsigned short val) {
+    return (val & EXPONENT_MASK) == 0 && (val & MANTISSA_MASK) != 0;
+}
+
+// Negativity test checks the sign bit
+int isFloat16Negative(unsigned short val) {
+    return (val & SIGN_MASK) != 0;
+}
+
+// Interpret a short as a FP16 value and convert to float
+float half2float(unsigned short s) {
+  half h = *(half *) &s;
+  return (float) h;
+}
+
+// Return the short value representing a float value in FP16
+unsigned short float2half(float f) {
+  half h = (half) f;
+  return *(unsigned short *) &h;
+}
+
+// Compute ULP for 'value' and store value +/- tolerance * ULP in bounds sarray
+void getErrorBar(unsigned short value, int tolerance, unsigned short bounds[2]) {
+  // Validate 'tolerance' parameter
+  if (tolerance != 1 && tolerance != 3) {
+    fprintf(stderr, "Allowed ULP error should either be 1 or 3, and not %d\n",
+            tolerance);
+    exit(0);
+  }
+
+  half hValue = *(half *) &value;
+  half ulp;
+
+  // For Infinity and NaN, bounds are equal to 'value'
+  if (isFloat16Infinite(value) || isFloat16NaN(value)) {
+    bounds[0] = value;
+    bounds[1] = value;
+    return;
+  }
+
+  // Compute ULP
+  if (isFloat16SubNormal(value)) {
+    // 1 ulp for a subnormal number is the smallest possible subnormal
+    unsigned short ulpInShort = 0b0000000000000001;
+    ulp = *(half *) &ulpInShort;
+  }
+  else {
+    // 1 ulp for a non-subnormal number is (b - a) where
+    //   - a has same exponent as 'value', zeroes for sign and mantissa
+    //   - b has same exponent and sign as 'a', and has '1' in the mantissa
+    // (b - a) gives the ULP by getting rid of the implied '1' at the front of
+    // the mantissa
+    unsigned short a = (value & EXPONENT_MASK);
+    unsigned short b = (a | 1);
+    half hA = *(half *) &a;
+    half hB = *(half *) &b;
+    ulp = hB - hA;
+  }
+
+  // Compute error bar based on error tolerance
+  half lb = hValue - tolerance * ulp;
+  half ub = hValue + tolerance * ulp;
+  if (lb > ub) {
+    fprintf(stderr, "Warning! inconsistency in bounds\n");
+    fprintf(stderr, "Value: %f, ulp: %f\n", (float) hValue, (float) ulp);
+    fprintf(stderr, "lb: %f ub: %f\n", (float) lb, (float) ub);
+    fprintf(stderr, "lb: %x ub: %x\n", *(unsigned short *) &lb, *(unsigned short *) &ub);
+  }
+
+  // Set the bounds
+  bounds[0] = *(unsigned short *) &lb;
+  bounds[1] = *(unsigned short *) &ub;
+
+  // RS allows flush-to-zero for sub-normal results in relaxed precision.
+  // Flush lower bound of a positive sub-normal result to zero.
+  if (!isFloat16Negative(bounds[0]) && isFloat16SubNormal(bounds[0]))
+    bounds[0] = 0x0;
+  // Flush upper bound of a negative sub-normal result to negative zero.
+  if (isFloat16Negative(bounds[1]) && isFloat16SubNormal(bounds[1]))
+    bounds[1] = 0x0 | SIGN_MASK;
+
+}
+
+// Utilities that take 'unsigned short' representations of two fp16 values and
+// return the result of an arithmetic operation as an 'unsigned short'.
+typedef unsigned short operation_t(unsigned short, unsigned short);
+
+unsigned short add(unsigned short a, unsigned short b) {
+  float op1 = half2float(a);
+  float op2 = half2float(b);
+  return float2half(op1 + op2);
+}
+
+unsigned short subtract(unsigned short a, unsigned short b) {
+  float op1 = half2float(a);
+  float op2 = half2float(b);
+  return float2half(op1 - op2);
+}
+
+unsigned short multiply(unsigned short a, unsigned short b) {
+  float op1 = half2float(a);
+  float op2 = half2float(b);
+  return float2half(op1 * op2);
+}
+
+unsigned short divide(unsigned short a, unsigned short b) {
+  float op1 = half2float(a);
+  float op2 = half2float(b);
+  return float2half(op1 / op2);
+}
+
+// Print Java code that initializes the input array (along with the description
+// of the constant as a comment)
+void printInput() {
+  printf("static short[] %s = {\n", INPUT_ARRAY);
+
+  for (int x = 0; x < numInputs; x ++)
+    printf("(short) 0x%04x, // %s\n", input[x].value, input[x].description);
+
+  printf("};\n\n");
+}
+
+// Print Java code that initializes the output array with the acceptable bounds
+// on the output.  For each pair of inputs, bounds are calculated on the result
+// from applying 'operation' on the pair.
+void printReferenceOutput(const char *fieldName, operation_t operation,
+                          int tolerance) {
+  unsigned short result;
+  unsigned short resultBounds[2];
+
+  printf("static short[][][] %s = {\n", fieldName);
+
+  for (int x = 0; x < numInputs; x ++) {
+    printf("{");
+    for (int y = 0; y < numInputs; y ++) {
+      // Apply 'operation' and compute error bounds for the result.
+      result = operation(input[x].value, input[y].value);
+      getErrorBar(result, tolerance, resultBounds);
+
+      printf("{ (short) 0x%04x, (short) 0x%04x},", resultBounds[0],
+                                                   resultBounds[1]);
+    }
+    printf("},\n");
+  }
+
+  printf("};\n\n");
+}
+
+const char *preamble = "/*\n"
+" * Copyright (C) 2015 The Android Open Source Project\n"
+" *\n"
+" * Licensed under the Apache License, Version 2.0 (the \"License\");\n"
+" * you may not use this file except in compliance with the License.\n"
+" * You may obtain a copy of the License at\n"
+" *\n"
+" *      http://www.apache.org/licenses/LICENSE-2.0\n"
+" *\n"
+" * Unless required by applicable law or agreed to in writing, software\n"
+" * distributed under the License is distributed on an \"AS IS\" BASIS,\n"
+" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"
+" * See the License for the specific language governing permissions and\n"
+" * limitations under the License.\n"
+" */\n"
+"\n"
+"/* Don't edit this file!  It is auto-generated by float16_gen.sh */\n\n"
+"package "PACKAGE_NAME";\n\n"
+"public class "CLASS_NAME" {\n";
+
+int main() {
+  // Print a preamble with copyright and class declaration, followed by the
+  // input FP16 array, and reference outputs for pair-wise arithmetic
+  // operations.
+  printf("%s", preamble);
+  printInput();
+
+  printReferenceOutput(OUTPUT_ARRAY_ADD, add, 1);
+  printReferenceOutput(OUTPUT_ARRAY_SUB, subtract, 1);
+  printReferenceOutput(OUTPUT_ARRAY_MUL, multiply, 1);
+  printReferenceOutput(OUTPUT_ARRAY_DIV, divide, 3);
+
+  printf("}");
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/float16_gen.sh b/tests/tests/renderscript/src/android/renderscript/cts/float16_gen.sh
new file mode 100644
index 0000000..8ddea46
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/float16_gen.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+#
+# Copyright (C) 2014 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.
+#
+
+LIBDIR=$ANDROID_HOST_OUT/lib64
+CLANG=$ANDROID_BUILD_TOP/prebuilts/clang/linux-x86/host/3.6/bin/clang
+
+TMPDIR=`mktemp -d /tmp/float16_gen.XXXXXXXX`
+TMPFILE=$TMPDIR/tmp.java
+OUTFILE=$TMPDIR/Float16TestData.java
+EXECUTABLE=$TMPDIR/float16_gen
+
+$CLANG -Wl,-rpath=$LIBDIR -L $LIBDIR -lcompiler_rt -m64 float16_gen.c -o $EXECUTABLE
+$EXECUTABLE > $TMPFILE
+clang-format -style='{ColumnLimit: 80}' $TMPFILE > $OUTFILE
+cp $OUTFILE .
+
+rm -rf $TMPDIR
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAbs.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAbs.java
index 91fe3c8..78bdfe8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAbs.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAbs.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestAbs extends RSBaseCompute {
 
     private ScriptC_TestAbs script;
@@ -40,7 +42,7 @@
     }
 
     private void checkAbsCharUchar() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x79257810f7393ea6l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0xf7393ea6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 1), INPUTSIZE);
             script.forEach_testAbsCharUchar(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsAbsCharUchar(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -75,28 +81,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAbsCharUchar" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAbsCharUchar" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAbsChar2Uchar2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xff611dd40e5e407cl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xe5e407cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
             script.forEach_testAbsChar2Uchar2(inV, out);
@@ -115,9 +129,13 @@
 
     private void verifyResultsAbsChar2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -131,28 +149,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAbsChar2Uchar2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAbsChar2Uchar2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAbsChar3Uchar3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xff62e6ef0479615al, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x479615al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
             script.forEach_testAbsChar3Uchar3(inV, out);
@@ -171,9 +197,13 @@
 
     private void verifyResultsAbsChar3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -187,28 +217,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAbsChar3Uchar3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAbsChar3Uchar3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAbsChar4Uchar4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xff64b009fa948238l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xfa948238l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
             script.forEach_testAbsChar4Uchar4(inV, out);
@@ -227,9 +265,13 @@
 
     private void verifyResultsAbsChar4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -243,24 +285,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAbsChar4Uchar4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAbsChar4Uchar4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsShortUshort {
@@ -269,7 +319,7 @@
     }
 
     private void checkAbsShortUshort() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0xfab837da064819cl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0xa064819cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 1), INPUTSIZE);
             script.forEach_testAbsShortUshort(inV, out);
@@ -288,9 +338,13 @@
 
     private void verifyResultsAbsShortUshort(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -304,28 +358,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAbsShortUshort" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAbsShortUshort" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAbsShort2Ushort2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x231450e16856b93el, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x6856b93el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
             script.forEach_testAbsShort2Ushort2(inV, out);
@@ -344,9 +406,13 @@
 
     private void verifyResultsAbsShort2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -360,28 +426,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAbsShort2Ushort2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAbsShort2Ushort2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAbsShort3Ushort3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x23611868beb24a6al, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0xbeb24a6al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
             script.forEach_testAbsShort3Ushort3(inV, out);
@@ -400,9 +474,13 @@
 
     private void verifyResultsAbsShort3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -416,28 +494,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAbsShort3Ushort3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAbsShort3Ushort3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAbsShort4Ushort4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x23addff0150ddb96l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x150ddb96l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
             script.forEach_testAbsShort4Ushort4(inV, out);
@@ -456,9 +542,13 @@
 
     private void verifyResultsAbsShort4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -472,24 +562,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAbsShort4Ushort4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAbsShort4Ushort4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsIntUint {
@@ -498,7 +596,7 @@
     }
 
     private void checkAbsIntUint() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x6adb1880ac5b83e6l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xac5b83e6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 1), INPUTSIZE);
             script.forEach_testAbsIntUint(inV, out);
@@ -517,9 +615,13 @@
 
     private void verifyResultsAbsIntUint(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -533,28 +635,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAbsIntUint" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAbsIntUint" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAbsInt2Uint2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xc8728053938616fal, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x938616fal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
             script.forEach_testAbsInt2Uint2(inV, out);
@@ -573,9 +683,13 @@
 
     private void verifyResultsAbsInt2Uint2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -589,28 +703,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAbsInt2Uint2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAbsInt2Uint2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAbsInt3Uint3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xc8728af4f28ddbeel, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xf28ddbeel, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
             script.forEach_testAbsInt3Uint3(inV, out);
@@ -629,9 +751,13 @@
 
     private void verifyResultsAbsInt3Uint3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -645,28 +771,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAbsInt3Uint3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAbsInt3Uint3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAbsInt4Uint4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xc87295965195a0e2l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x5195a0e2l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
             script.forEach_testAbsInt4Uint4(inV, out);
@@ -685,9 +819,13 @@
 
     private void verifyResultsAbsInt4Uint4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -701,24 +839,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAbsInt4Uint4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAbsInt4Uint4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testAbs() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcos.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcos.java
index e94111f..8ea35f7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcos.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestAcos extends RSBaseCompute {
 
     private ScriptC_TestAcos script;
@@ -40,7 +42,7 @@
     }
 
     private void checkAcosFloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf6e893f6d1cc3bdfl, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd1cc3bdfl, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testAcosFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsAcosFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAcosFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAcosFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAcosFloat2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x55af66f81096ae8bl, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x1096ae8bl, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testAcosFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsAcosFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAcosFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAcosFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAcosFloat3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x55b1301306b1cf69l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6b1cf69l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testAcosFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsAcosFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAcosFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAcosFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAcosFloat4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x55b2f92dfcccf047l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xfcccf047l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testAcosFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsAcosFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAcosFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAcosFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testAcos() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcosh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcosh.java
index a6b4df3..6a4e844 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcosh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcosh.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestAcosh extends RSBaseCompute {
 
     private ScriptC_TestAcosh script;
@@ -40,7 +42,7 @@
     }
 
     private void checkAcoshFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x777ec00cf303663l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xcf303663l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testAcoshFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsAcoshFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAcoshFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAcoshFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAcoshFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xf102471f37b311efl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x37b311efl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testAcoshFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsAcoshFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAcoshFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAcoshFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAcoshFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf104103a2dce32cdl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x2dce32cdl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testAcoshFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsAcoshFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAcoshFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAcoshFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAcoshFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf105d95523e953abl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x23e953abl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testAcoshFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsAcoshFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAcoshFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAcoshFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testAcosh() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcospi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcospi.java
index a61a0cb..877f06b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcospi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAcospi.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestAcospi extends RSBaseCompute {
 
     private ScriptC_TestAcospi script;
@@ -40,7 +42,7 @@
     }
 
     private void checkAcospiFloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9fbdc3b5d1e084b2l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd1e084b2l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testAcospiFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsAcospiFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAcospiFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAcospiFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAcospiFloat2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc175417fa318aa86l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xa318aa86l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testAcospiFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsAcospiFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAcospiFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAcospiFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAcospiFloat3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc1770a9a9933cb64l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x9933cb64l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testAcospiFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsAcospiFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAcospiFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAcospiFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAcospiFloat4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc178d3b58f4eec42l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8f4eec42l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testAcospiFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsAcospiFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAcospiFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAcospiFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testAcospi() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsin.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsin.java
index c79a480..4f354fe 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsin.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestAsin extends RSBaseCompute {
 
     private ScriptC_TestAsin script;
@@ -40,7 +42,7 @@
     }
 
     private void checkAsinFloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x80b5674ff98b5a12l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf98b5a12l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testAsinFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsAsinFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAsinFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAsinFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAsinFloat2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x9e11e5e823f7cce6l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x23f7cce6l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testAsinFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsAsinFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAsinFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAsinFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAsinFloat3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x9e13af031a12edc4l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1a12edc4l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testAsinFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsAsinFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAsinFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAsinFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAsinFloat4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x9e15781e102e0ea2l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x102e0ea2l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testAsinFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsAsinFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAsinFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAsinFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testAsin() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsinh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsinh.java
index f646da0..c22e658 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsinh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsinh.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestAsinh extends RSBaseCompute {
 
     private ScriptC_TestAsinh script;
@@ -40,7 +42,7 @@
     }
 
     private void checkAsinhFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2cdf6bfa7c4a48f4l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7c4a48f4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testAsinhFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsAsinhFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAsinhFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAsinhFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAsinhFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x198d997279032b38l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x79032b38l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testAsinhFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsAsinhFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAsinhFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAsinhFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAsinhFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x198f628d6f1e4c16l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6f1e4c16l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testAsinhFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsAsinhFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAsinhFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAsinhFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAsinhFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x19912ba865396cf4l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x65396cf4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testAsinhFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsAsinhFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAsinhFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAsinhFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testAsinh() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsinpi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsinpi.java
index e2cebbf..5cd7a0e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsinpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAsinpi.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestAsinpi extends RSBaseCompute {
 
     private ScriptC_TestAsinpi script;
@@ -40,7 +42,7 @@
     }
 
     private void checkAsinpiFloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe82042a5e541a30dl, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe541a30dl, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testAsinpiFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsAsinpiFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAsinpiFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAsinpiFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAsinpiFloat2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x90dc157b9b8ce9c9l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x9b8ce9c9l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testAsinpiFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsAsinpiFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAsinpiFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAsinpiFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAsinpiFloat3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x90ddde9691a80aa7l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x91a80aa7l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testAsinpiFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsAsinpiFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAsinpiFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAsinpiFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAsinpiFloat4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x90dfa7b187c32b85l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x87c32b85l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testAsinpiFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsAsinpiFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAsinpiFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAsinpiFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testAsinpi() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan.java
index f7e6642..331227a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestAtan extends RSBaseCompute {
 
     private ScriptC_TestAtan script;
@@ -40,7 +42,7 @@
     }
 
     private void checkAtanFloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2a9ae39592004c8dl, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x92004c8dl, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testAtanFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsAtanFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtanFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtanFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAtanFloat2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb890789248a32749l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x48a32749l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testAtanFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsAtanFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtanFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtanFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAtanFloat3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xb89241ad3ebe4827l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3ebe4827l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testAtanFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsAtanFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtanFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtanFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAtanFloat4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb8940ac834d96905l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x34d96905l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testAtanFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsAtanFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtanFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtanFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testAtan() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan2.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan2.java
index b817e34..b8894cd 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan2.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestAtan2 extends RSBaseCompute {
 
     private ScriptC_TestAtan2 script;
@@ -41,8 +43,8 @@
     }
 
     private void checkAtan2FloatFloatFloat() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x717c0d8e261d332l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x37738e957bd90d5bl, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe261d332l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7bd90d5bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -63,11 +65,16 @@
 
     private void verifyResultsAtan2FloatFloatFloat(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtan2FloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtan2FloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAtan2Float2Float2Float2() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8658ecfeefb30700l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x552b6d6bab583839l, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xefb30700l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xab583839l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -129,11 +144,16 @@
 
     private void verifyResultsAtan2Float2Float2Float2(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtan2Float2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtan2Float2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAtan2Float3Float3Float3() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x61e79638927ef301l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1e8faeb47e33cb72l, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x927ef301l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x7e33cb72l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -195,11 +223,16 @@
 
     private void verifyResultsAtan2Float3Float3Float3(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtan2Float3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtan2Float3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAtan2Float4Float4Float4() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3d763f72354adf02l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe7f3effd510f5eabl, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x354adf02l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x510f5eabl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -261,11 +302,16 @@
 
     private void verifyResultsAtan2Float4Float4Float4(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,27 +327,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtan2Float4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtan2Float4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testAtan2() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan2pi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan2pi.java
index a1cb7e7..f22b020 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan2pi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtan2pi.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestAtan2pi extends RSBaseCompute {
 
     private ScriptC_TestAtan2pi script;
@@ -41,8 +43,8 @@
     }
 
     private void checkAtan2piFloatFloatFloat() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3276ace81dcb793l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc4961da25a748df4l, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x81dcb793l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x5a748df4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -63,11 +65,16 @@
 
     private void verifyResultsAtan2piFloatFloatFloat(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtan2piFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtan2piFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAtan2piFloat2Float2Float2() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3b26f42853d1a0b3l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x393d275fcc5c5614l, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x53d1a0b3l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xcc5c5614l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -129,11 +144,16 @@
 
     private void verifyResultsAtan2piFloat2Float2Float2(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtan2piFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtan2piFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAtan2piFloat3Float3Float3() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x16b59d61f69d8cb4l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x2a168a89f37e94dl, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf69d8cb4l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x9f37e94dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -195,11 +223,16 @@
 
     private void verifyResultsAtan2piFloat3Float3Float3(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtan2piFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtan2piFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAtan2piFloat4Float4Float4() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf244469b996978b5l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xcc05a9f172137c86l, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x996978b5l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x72137c86l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -261,11 +302,16 @@
 
     private void verifyResultsAtan2piFloat4Float4Float4(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,27 +327,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtan2piFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtan2piFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testAtan2pi() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtanh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtanh.java
index fb4867c..f292c1a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtanh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtanh.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestAtanh extends RSBaseCompute {
 
     private ScriptC_TestAtanh script;
@@ -40,7 +42,7 @@
     }
 
     private void checkAtanhFloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb66b4bab17ef039dl, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x17ef039dl, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testAtanhFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsAtanhFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtanhFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtanhFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAtanhFloat2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8cd03c06a1cb59d9l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xa1cb59d9l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testAtanhFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsAtanhFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtanhFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtanhFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAtanhFloat3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8cd2052197e67ab7l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x97e67ab7l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testAtanhFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsAtanhFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtanhFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtanhFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAtanhFloat4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8cd3ce3c8e019b95l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8e019b95l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testAtanhFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsAtanhFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtanhFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtanhFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testAtanh() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtanpi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtanpi.java
index 12c3faf..ed33df6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtanpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestAtanpi.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestAtanpi extends RSBaseCompute {
 
     private ScriptC_TestAtanpi script;
@@ -40,7 +42,7 @@
     }
 
     private void checkAtanpiFloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x29ed55009ecfd70l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9ecfd70l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testAtanpiFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsAtanpiFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtanpiFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtanpiFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAtanpiFloat2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xed0d645e752cbed4l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x752cbed4l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testAtanpiFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsAtanpiFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtanpiFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtanpiFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAtanpiFloat3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xed0f2d796b47dfb2l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6b47dfb2l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testAtanpiFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsAtanpiFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtanpiFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtanpiFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkAtanpiFloat4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xed10f69461630090l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x61630090l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testAtanpiFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsAtanpiFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkAtanpiFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkAtanpiFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testAtanpi() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCbrt.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCbrt.java
index d9028c8..206b9bb 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCbrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCbrt.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestCbrt extends RSBaseCompute {
 
     private ScriptC_TestCbrt script;
@@ -40,7 +42,7 @@
     }
 
     private void checkCbrtFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x21721d33845561d4l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x845561d4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testCbrtFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsCbrtFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCbrtFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCbrtFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkCbrtFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x910f9e5d9129d518l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x9129d518l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testCbrtFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsCbrtFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCbrtFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCbrtFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkCbrtFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x911167788744f5f6l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8744f5f6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testCbrtFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsCbrtFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCbrtFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCbrtFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkCbrtFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x911330937d6016d4l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x7d6016d4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testCbrtFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsCbrtFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCbrtFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCbrtFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testCbrt() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCeil.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCeil.java
index 4edd811..ea77e11 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCeil.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCeil.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestCeil extends RSBaseCompute {
 
     private ScriptC_TestCeil script;
@@ -40,7 +42,7 @@
     }
 
     private void checkCeilFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf12a662b492bf934l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x492bf934l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testCeilFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsCeilFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCeilFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCeilFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkCeilFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdb16a3ea43152978l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x43152978l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testCeilFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsCeilFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCeilFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCeilFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkCeilFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdb186d0539304a56l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x39304a56l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testCeilFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsCeilFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCeilFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCeilFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkCeilFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xdb1a36202f4b6b34l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x2f4b6b34l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testCeilFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsCeilFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCeilFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCeilFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testCeil() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestClamp.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestClamp.java
index 7ac17a9..8b0160c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestClamp.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestClamp.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestClamp extends RSBaseCompute {
 
     private ScriptC_TestClamp script;
@@ -42,9 +44,9 @@
     }
 
     private void checkClampFloatFloatFloatFloat() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7e886d7cc83c447dl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xdcebf6f230234027l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xdcebf6e6c180322dl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc83c447dl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x30234027l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc180322dl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
@@ -68,13 +70,19 @@
 
     private void verifyResultsClampFloatFloatFloatFloat(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         float[] arrayInValue = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInValue, (float) 42);
         inValue.copyTo(arrayInValue);
         float[] arrayInMinValue = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (float) 42);
         inMinValue.copyTo(arrayInMinValue);
         float[] arrayInMaxValue = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (float) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -91,36 +99,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampFloatFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampFloatFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampFloat2Float2Float2Float2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xa0d28bf142b07a5l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb4e5c5f6ea8fc01fl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb4e5c5eb7becb225l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x142b07a5l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xea8fc01fl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x7becb225l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
@@ -144,13 +160,19 @@
 
     private void verifyResultsClampFloat2Float2Float2Float2(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         float[] arrayInValue = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (float) 42);
         inValue.copyTo(arrayInValue);
         float[] arrayInMinValue = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInMinValue, (float) 42);
         inMinValue.copyTo(arrayInMinValue);
         float[] arrayInMaxValue = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInMaxValue, (float) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -167,36 +189,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampFloat2Float2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampFloat2Float2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampFloat3Float3Float3Float3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd3716a4730ad7481l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc0d239a53946aa73l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc0d23999caa39c79l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x30ad7481l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3946aa73l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xcaa39c79l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
@@ -220,13 +250,19 @@
 
     private void verifyResultsClampFloat3Float3Float3Float3(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         float[] arrayInValue = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (float) 42);
         inValue.copyTo(arrayInValue);
         float[] arrayInMinValue = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInMinValue, (float) 42);
         inMinValue.copyTo(arrayInMinValue);
         float[] arrayInMaxValue = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInMaxValue, (float) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -243,36 +279,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampFloat3Float3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampFloat3Float3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampFloat4Float4Float4Float4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x9cd5abcf4d2fe15dl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xccbead5387fd94c7l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xccbead48195a86cdl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4d2fe15dl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x87fd94c7l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x195a86cdl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
@@ -296,13 +340,19 @@
 
     private void verifyResultsClampFloat4Float4Float4Float4(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         float[] arrayInValue = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (float) 42);
         inValue.copyTo(arrayInValue);
         float[] arrayInMinValue = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInMinValue, (float) 42);
         inMinValue.copyTo(arrayInMinValue);
         float[] arrayInMaxValue = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInMaxValue, (float) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -319,36 +369,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampFloat4Float4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampFloat4Float4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampFloat2FloatFloatFloat2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x71623fb3f1fca1a1l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x148e792e1a6253d3l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x148e7922abbf45d9l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xf1fca1a1l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x1a6253d3l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xabbf45d9l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
@@ -372,13 +430,19 @@
 
     private void verifyResultsClampFloat2FloatFloatFloat2(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         float[] arrayInValue = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (float) 42);
         inValue.copyTo(arrayInValue);
         float[] arrayInMinValue = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (float) 42);
         inMinValue.copyTo(arrayInMinValue);
         float[] arrayInMaxValue = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (float) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -395,36 +459,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampFloat2FloatFloatFloat2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampFloat2FloatFloatFloat2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampFloat3FloatFloatFloat3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc06893ff6ab8cf27l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x1f4444b84d90bbc5l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x1f4444acdeedadcbl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6ab8cf27l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4d90bbc5l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xdeedadcbl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
@@ -448,13 +520,19 @@
 
     private void verifyResultsClampFloat3FloatFloatFloat3(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         float[] arrayInValue = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (float) 42);
         inValue.copyTo(arrayInValue);
         float[] arrayInMinValue = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (float) 42);
         inMinValue.copyTo(arrayInMinValue);
         float[] arrayInMaxValue = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (float) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -471,36 +549,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampFloat3FloatFloatFloat3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampFloat3FloatFloatFloat3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampFloat4FloatFloatFloat4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf6ee84ae374fcadl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x29fa104280bf23b7l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x29fa1037121c15bdl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe374fcadl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x80bf23b7l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x121c15bdl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
@@ -524,13 +610,19 @@
 
     private void verifyResultsClampFloat4FloatFloatFloat4(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         float[] arrayInValue = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (float) 42);
         inValue.copyTo(arrayInValue);
         float[] arrayInMinValue = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (float) 42);
         inMinValue.copyTo(arrayInMinValue);
         float[] arrayInMaxValue = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (float) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -547,30 +639,38 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampFloat4FloatFloatFloat4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampFloat4FloatFloatFloat4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsCharCharCharChar {
@@ -581,9 +681,9 @@
     }
 
     private void checkClampCharCharCharChar() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0xaec8640bb673cf75l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x6379f7c3c505c8fl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x6379f70cdad4e95l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0xb673cf75l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x3c505c8fl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0xcdad4e95l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 1), INPUTSIZE);
@@ -607,13 +707,19 @@
 
     private void verifyResultsClampCharCharCharChar(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayInMinValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (byte) 42);
         inMinValue.copyTo(arrayInMinValue);
         byte[] arrayInMaxValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (byte) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         byte[] arrayOut = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -629,36 +735,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampCharCharCharChar" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampCharCharCharChar" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampChar2Char2Char2Char2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xa209cfe6c3feb45dl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xed63d0ab3442bdc7l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xed63d09fc59fafcdl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xc3feb45dl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x3442bdc7l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xc59fafcdl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
@@ -682,13 +796,19 @@
 
     private void verifyResultsClampChar2Char2Char2Char2(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayInMinValue = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInMinValue, (byte) 42);
         inMinValue.copyTo(arrayInMinValue);
         byte[] arrayInMaxValue = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInMaxValue, (byte) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -704,36 +824,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampChar2Char2Char2Char2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampChar2Char2Char2Char2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampChar3Char3Char3Char3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xfab6edb7b9d3b0a5l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x7ae6f958470ecb1fl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x7ae6f94cd86bbd25l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xb9d3b0a5l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x470ecb1fl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xd86bbd25l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
@@ -757,13 +885,19 @@
 
     private void verifyResultsClampChar3Char3Char3Char3(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayInMinValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInMinValue, (byte) 42);
         inMinValue.copyTo(arrayInMinValue);
         byte[] arrayInMaxValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInMaxValue, (byte) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -779,36 +913,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampChar3Char3Char3Char3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampChar3Char3Char3Char3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampChar4Char4Char4Char4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x53640b88afa8acedl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x86a220559dad877l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x86a21f9eb37ca7dl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xafa8acedl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x59dad877l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xeb37ca7dl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
@@ -832,13 +974,19 @@
 
     private void verifyResultsClampChar4Char4Char4Char4(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayInMinValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInMinValue, (byte) 42);
         inMinValue.copyTo(arrayInMinValue);
         byte[] arrayInMaxValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInMaxValue, (byte) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -854,30 +1002,38 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampChar4Char4Char4Char4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampChar4Char4Char4Char4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUcharUcharUcharUchar {
@@ -888,9 +1044,9 @@
     }
 
     private void checkClampUcharUcharUcharUchar() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x680c818a4447655l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0xae40bae375336f2fl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0xae40bad806906135l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0xa4447655l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x75336f2fl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x6906135l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 1), INPUTSIZE);
@@ -914,13 +1070,19 @@
 
     private void verifyResultsClampUcharUcharUcharUchar(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayInMinValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (byte) 42);
         inMinValue.copyTo(arrayInMinValue);
         byte[] arrayInMaxValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (byte) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         byte[] arrayOut = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -936,36 +1098,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUcharUcharUcharUchar" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUcharUcharUcharUchar" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUchar2Uchar2Uchar2Uchar2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0xd69df43245dae301l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x82681747662c1df3l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x8268173bf7890ff9l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x45dae301l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x662c1df3l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0xf7890ff9l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
@@ -989,13 +1159,19 @@
 
     private void verifyResultsClampUchar2Uchar2Uchar2Uchar2(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayInMinValue = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInMinValue, (byte) 42);
         inMinValue.copyTo(arrayInMinValue);
         byte[] arrayInMaxValue = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInMaxValue, (byte) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -1011,36 +1187,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUchar2Uchar2Uchar2Uchar2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUchar2Uchar2Uchar2Uchar2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUchar3Uchar3Uchar3Uchar3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0xa00235ba625d4fddl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x8e548af5b4e30847l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x8e548aea463ffa4dl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x625d4fddl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0xb4e30847l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x463ffa4dl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
@@ -1064,13 +1248,19 @@
 
     private void verifyResultsClampUchar3Uchar3Uchar3Uchar3(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayInMinValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInMinValue, (byte) 42);
         inMinValue.copyTo(arrayInMinValue);
         byte[] arrayInMaxValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInMaxValue, (byte) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -1086,36 +1276,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUchar3Uchar3Uchar3Uchar3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUchar3Uchar3Uchar3Uchar3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUchar4Uchar4Uchar4Uchar4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x696677427edfbcb9l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x9a40fea40399f29bl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x9a40fe9894f6e4a1l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7edfbcb9l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x399f29bl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x94f6e4a1l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
@@ -1139,13 +1337,19 @@
 
     private void verifyResultsClampUchar4Uchar4Uchar4Uchar4(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayInMinValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInMinValue, (byte) 42);
         inMinValue.copyTo(arrayInMinValue);
         byte[] arrayInMaxValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInMaxValue, (byte) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -1161,30 +1365,38 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUchar4Uchar4Uchar4Uchar4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUchar4Uchar4Uchar4Uchar4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsShortShortShortShort {
@@ -1195,9 +1407,9 @@
     }
 
     private void checkClampShortShortShortShort() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x8035c0627fc993ddl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0xb5d4bd1fb4661447l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0xb5d4bd1445c3064dl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x7fc993ddl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0xb4661447l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x45c3064dl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 1), INPUTSIZE);
@@ -1221,13 +1433,19 @@
 
     private void verifyResultsClampShortShortShortShort(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayInMinValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (short) 42);
         inMinValue.copyTo(arrayInMinValue);
         short[] arrayInMaxValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (short) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         short[] arrayOut = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -1243,36 +1461,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampShortShortShortShort" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampShortShortShortShort" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampShort2Short2Short2Short2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x7eab8e9b984e0915l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x7b334b992e67336fl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x7b334b8dbfc42575l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x984e0915l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x2e67336fl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0xbfc42575l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
@@ -1296,13 +1522,19 @@
 
     private void verifyResultsClampShort2Short2Short2Short2(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayInMinValue = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInMinValue, (short) 42);
         inMinValue.copyTo(arrayInMinValue);
         short[] arrayInMaxValue = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInMaxValue, (short) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -1318,36 +1550,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampShort2Short2Short2Short2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampShort2Short2Short2Short2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampShort3Short3Short3Short3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x480fd023b4d075f1l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x871fbf477d1e1dc3l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x871fbf3c0e7b0fc9l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0xb4d075f1l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x7d1e1dc3l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0xe7b0fc9l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
@@ -1371,13 +1611,19 @@
 
     private void verifyResultsClampShort3Short3Short3Short3(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayInMinValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInMinValue, (short) 42);
         inMinValue.copyTo(arrayInMinValue);
         short[] arrayInMaxValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInMaxValue, (short) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -1393,36 +1639,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampShort3Short3Short3Short3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampShort3Short3Short3Short3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampShort4Short4Short4Short4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x117411abd152e2cdl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x930c32f5cbd50817l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x930c32ea5d31fa1dl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xd152e2cdl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xcbd50817l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x5d31fa1dl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
@@ -1446,13 +1700,19 @@
 
     private void verifyResultsClampShort4Short4Short4Short4(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayInMinValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInMinValue, (short) 42);
         inMinValue.copyTo(arrayInMinValue);
         short[] arrayInMaxValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInMaxValue, (short) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -1468,30 +1728,38 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampShort4Short4Short4Short4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampShort4Short4Short4Short4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUshortUshortUshortUshort {
@@ -1502,9 +1770,9 @@
     }
 
     private void checkClampUshortUshortUshortUshort() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xf5881eeff74c4341l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xd2a0571394d3e2b3l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xd2a057082630d4b9l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xf74c4341l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0x94d3e2b3l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0x2630d4b9l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 1), INPUTSIZE);
@@ -1528,13 +1796,19 @@
 
     private void verifyResultsClampUshortUshortUshortUshort(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayInMinValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (short) 42);
         inMinValue.copyTo(arrayInMinValue);
         short[] arrayInMaxValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (short) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         short[] arrayOut = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -1550,36 +1824,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUshortUshortUshortUshort" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUshortUshortUshortUshort" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUshort2Ushort2Ushort2Ushort2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x6441dbe2fc36b705l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x52161e934fa3b43fl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x52161e87e100a645l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xfc36b705l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x4fa3b43fl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xe100a645l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
@@ -1603,13 +1885,19 @@
 
     private void verifyResultsClampUshort2Ushort2Ushort2Ushort2(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayInMinValue = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInMinValue, (short) 42);
         inMinValue.copyTo(arrayInMinValue);
         short[] arrayInMaxValue = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInMaxValue, (short) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -1625,36 +1913,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUshort2Ushort2Ushort2Ushort2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUshort2Ushort2Ushort2Ushort2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUshort3Ushort3Ushort3Ushort3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x6b244d61fc64ee3dl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x7b8d14b8610b3967l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x7b8d14acf2682b6dl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xfc64ee3dl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x610b3967l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xf2682b6dl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
@@ -1678,13 +1974,19 @@
 
     private void verifyResultsClampUshort3Ushort3Ushort3Ushort3(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayInMinValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInMinValue, (short) 42);
         inMinValue.copyTo(arrayInMinValue);
         short[] arrayInMaxValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInMaxValue, (short) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -1700,36 +2002,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUshort3Ushort3Ushort3Ushort3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUshort3Ushort3Ushort3Ushort3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUshort4Ushort4Ushort4Ushort4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x7206bee0fc932575l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xa5040add7272be8fl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xa5040ad203cfb095l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xfc932575l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x7272be8fl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x3cfb095l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
@@ -1753,13 +2063,19 @@
 
     private void verifyResultsClampUshort4Ushort4Ushort4Ushort4(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayInMinValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInMinValue, (short) 42);
         inMinValue.copyTo(arrayInMinValue);
         short[] arrayInMaxValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInMaxValue, (short) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -1775,30 +2091,38 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUshort4Ushort4Ushort4Ushort4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUshort4Ushort4Ushort4Ushort4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsIntIntIntInt {
@@ -1809,9 +2133,9 @@
     }
 
     private void checkClampIntIntIntInt() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xfeb3aa11be6164c5l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xd11c228c7c8bf97fl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xd11c22810de8eb85l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xbe6164c5l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x7c8bf97fl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xde8eb85l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
@@ -1835,13 +2159,19 @@
 
     private void verifyResultsClampIntIntIntInt(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayInMinValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (int) 42);
         inMinValue.copyTo(arrayInMinValue);
         int[] arrayInMaxValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (int) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         int[] arrayOut = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -1857,36 +2187,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampIntIntIntInt" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampIntIntIntInt" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampInt2Int2Int2Int2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x56252903bd307c01l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x770112109398f8f3l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x7701120524f5eaf9l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xbd307c01l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x9398f8f3l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x24f5eaf9l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
@@ -1910,13 +2248,19 @@
 
     private void verifyResultsClampInt2Int2Int2Int2(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayInMinValue = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInMinValue, (int) 42);
         inMinValue.copyTo(arrayInMinValue);
         int[] arrayInMaxValue = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInMaxValue, (int) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -1932,36 +2276,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampInt2Int2Int2Int2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampInt2Int2Int2Int2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampInt3Int3Int3Int3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x966882045600d2edl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xeb73e6749c7caa77l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xeb73e6692dd99c7dl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x5600d2edl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x9c7caa77l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x2dd99c7dl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
@@ -1985,13 +2337,19 @@
 
     private void verifyResultsClampInt3Int3Int3Int3(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayInMinValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInMinValue, (int) 42);
         inMinValue.copyTo(arrayInMinValue);
         int[] arrayInMaxValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInMaxValue, (int) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -2007,36 +2365,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampInt3Int3Int3Int3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampInt3Int3Int3Int3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampInt4Int4Int4Int4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xd6abdb04eed129d9l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x5fe6bad8a5605bfbl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x5fe6bacd36bd4e01l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xeed129d9l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xa5605bfbl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x36bd4e01l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
@@ -2060,13 +2426,19 @@
 
     private void verifyResultsClampInt4Int4Int4Int4(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayInMinValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInMinValue, (int) 42);
         inMinValue.copyTo(arrayInMinValue);
         int[] arrayInMaxValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInMaxValue, (int) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -2082,30 +2454,38 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampInt4Int4Int4Int4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampInt4Int4Int4Int4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUintUintUintUint {
@@ -2116,9 +2496,9 @@
     }
 
     private void checkClampUintUintUintUint() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xd8df32b2efc89475l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xcf8ec8eece8b7b8fl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xcf8ec8e35fe86d95l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xefc89475l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xce8b7b8fl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0x5fe86d95l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 1), INPUTSIZE);
@@ -2142,13 +2522,19 @@
 
     private void verifyResultsClampUintUintUintUint(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayInMinValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (int) 42);
         inMinValue.copyTo(arrayInMinValue);
         int[] arrayInMaxValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (int) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         int[] arrayOut = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -2164,36 +2550,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUintUintUintUint" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUintUintUintUint" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUint2Uint2Uint2Uint2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xaf28d478873ae5dl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x5bbd21aa2a4bc7l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x5bbd163b873dcdl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x8873ae5dl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xaa2a4bc7l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x3b873dcdl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
@@ -2217,13 +2611,19 @@
 
     private void verifyResultsClampUint2Uint2Uint2Uint2(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayInMinValue = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInMinValue, (int) 42);
         inMinValue.copyTo(arrayInMinValue);
         int[] arrayInMaxValue = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInMaxValue, (int) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -2239,36 +2639,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUint2Uint2Uint2Uint2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUint2Uint2Uint2Uint2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUint3Uint3Uint3Uint3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x639fab187e48aaa5l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x8ddee5cebcf6591fl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x8ddee5c34e534b25l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x7e48aaa5l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xbcf6591fl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x4e534b25l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
@@ -2292,13 +2700,19 @@
 
     private void verifyResultsClampUint3Uint3Uint3Uint3(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayInMinValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInMinValue, (int) 42);
         inMinValue.copyTo(arrayInMinValue);
         int[] arrayInMaxValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInMaxValue, (int) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -2314,36 +2728,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUint3Uint3Uint3Uint3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUint3Uint3Uint3Uint3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUint4Uint4Uint4Uint4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xbc4cc8e9741da6edl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x1b620e7bcfc26677l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x1b620e70611f587dl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x741da6edl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xcfc26677l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x611f587dl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
@@ -2367,13 +2789,19 @@
 
     private void verifyResultsClampUint4Uint4Uint4Uint4(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayInMinValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInMinValue, (int) 42);
         inMinValue.copyTo(arrayInMinValue);
         int[] arrayInMaxValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInMaxValue, (int) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -2389,30 +2817,38 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUint4Uint4Uint4Uint4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUint4Uint4Uint4Uint4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsLongLongLongLong {
@@ -2423,9 +2859,9 @@
     }
 
     private void checkClampLongLongLongLong() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x63fd360531c9c41dl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x9d04d1824ef4907l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x9d04d0cb64c3b0dl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x31c9c41dl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x24ef4907l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0xb64c3b0dl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 1), INPUTSIZE);
@@ -2449,13 +2885,19 @@
 
     private void verifyResultsClampLongLongLongLong(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         long[] arrayInValue = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInValue, (long) 42);
         inValue.copyTo(arrayInValue);
         long[] arrayInMinValue = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (long) 42);
         inMinValue.copyTo(arrayInMinValue);
         long[] arrayInMaxValue = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (long) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         long[] arrayOut = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -2471,36 +2913,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampLongLongLongLong" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampLongLongLongLong" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampLong2Long2Long2Long2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xccbae869c2b0f12dl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xe4c3844f4a3f8937l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xe4c38443db9c7b3dl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xc2b0f12dl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x4a3f8937l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xdb9c7b3dl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
@@ -2524,13 +2974,19 @@
 
     private void verifyResultsClampLong2Long2Long2Long2(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         long[] arrayInValue = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (long) 42);
         inValue.copyTo(arrayInValue);
         long[] arrayInMinValue = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInMinValue, (long) 42);
         inMinValue.copyTo(arrayInMinValue);
         long[] arrayInMaxValue = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInMaxValue, (long) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -2546,36 +3002,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampLong2Long2Long2Long2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampLong2Long2Long2Long2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampLong3Long3Long3Long3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x2568063ab885ed75l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x7246acfc5d0b968fl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x7246acf0ee688895l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xb885ed75l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x5d0b968fl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xee688895l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
@@ -2599,13 +3063,19 @@
 
     private void verifyResultsClampLong3Long3Long3Long3(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         long[] arrayInValue = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (long) 42);
         inValue.copyTo(arrayInValue);
         long[] arrayInMinValue = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInMinValue, (long) 42);
         inMinValue.copyTo(arrayInMinValue);
         long[] arrayInMaxValue = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInMaxValue, (long) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -2621,36 +3091,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampLong3Long3Long3Long3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampLong3Long3Long3Long3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampLong4Long4Long4Long4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x7e15240bae5ae9bdl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xffc9d5a96fd7a3e7l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xffc9d59e013495edl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xae5ae9bdl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x6fd7a3e7l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x13495edl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
@@ -2674,13 +3152,19 @@
 
     private void verifyResultsClampLong4Long4Long4Long4(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         long[] arrayInValue = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (long) 42);
         inValue.copyTo(arrayInValue);
         long[] arrayInMinValue = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInMinValue, (long) 42);
         inMinValue.copyTo(arrayInMinValue);
         long[] arrayInMaxValue = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInMaxValue, (long) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -2696,30 +3180,38 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampLong4Long4Long4Long4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampLong4Long4Long4Long4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUlongUlongUlongUlong {
@@ -2730,9 +3222,9 @@
     }
 
     private void checkClampUlongUlongUlongUlong() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x2b378139749bf4c5l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x75ac5050a8ca97fl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x75ac4f99be99b85l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x749bf4c5l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0xa8ca97fl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x9be99b85l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 1), INPUTSIZE);
@@ -2756,13 +3248,19 @@
 
     private void verifyResultsClampUlongUlongUlongUlong(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         long[] arrayInValue = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInValue, (long) 42);
         inValue.copyTo(arrayInValue);
         long[] arrayInMinValue = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (long) 42);
         inMinValue.copyTo(arrayInMinValue);
         long[] arrayInMaxValue = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (long) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         long[] arrayOut = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -2778,36 +3276,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUlongUlongUlongUlong" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUlongUlongUlongUlong" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUlong2Ulong2Ulong2Ulong2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0xa8c7fb17a09bb299l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x14e3c8dffe45623bl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x14e3c8d48fa25441l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0xa09bb299l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0xfe45623bl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x8fa25441l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
@@ -2831,13 +3337,19 @@
 
     private void verifyResultsClampUlong2Ulong2Ulong2Ulong2(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         long[] arrayInValue = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (long) 42);
         inValue.copyTo(arrayInValue);
         long[] arrayInMinValue = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInMinValue, (long) 42);
         inMinValue.copyTo(arrayInMinValue);
         long[] arrayInMaxValue = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInMaxValue, (long) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -2853,36 +3365,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUlong2Ulong2Ulong2Ulong2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUlong2Ulong2Ulong2Ulong2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUlong3Ulong3Ulong3Ulong3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x722c3c9fbd1e1f75l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x20d03c8e4cfc4c8fl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x20d03c82de593e95l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0xbd1e1f75l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x4cfc4c8fl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0xde593e95l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
@@ -2906,13 +3426,19 @@
 
     private void verifyResultsClampUlong3Ulong3Ulong3Ulong3(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         long[] arrayInValue = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (long) 42);
         inValue.copyTo(arrayInValue);
         long[] arrayInMinValue = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInMinValue, (long) 42);
         inMinValue.copyTo(arrayInMinValue);
         long[] arrayInMaxValue = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInMaxValue, (long) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -2928,36 +3454,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUlong3Ulong3Ulong3Ulong3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUlong3Ulong3Ulong3Ulong3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUlong4Ulong4Ulong4Ulong4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x3b907e27d9a08c51l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x2cbcb03c9bb336e3l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x2cbcb0312d1028e9l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0xd9a08c51l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x9bb336e3l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x2d1028e9l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
@@ -2981,13 +3515,19 @@
 
     private void verifyResultsClampUlong4Ulong4Ulong4Ulong4(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         long[] arrayInValue = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (long) 42);
         inValue.copyTo(arrayInValue);
         long[] arrayInMinValue = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInMinValue, (long) 42);
         inMinValue.copyTo(arrayInMinValue);
         long[] arrayInMaxValue = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInMaxValue, (long) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -3003,36 +3543,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUlong4Ulong4Ulong4Ulong4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUlong4Ulong4Ulong4Ulong4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampChar2CharCharChar2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xd6884bbb7c57a5d1l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x3bf8830cc3b7db63l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x3bf883015514cd69l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x7c57a5d1l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0xc3b7db63l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x5514cd69l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
@@ -3056,13 +3604,19 @@
 
     private void verifyResultsClampChar2CharCharChar2(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayInMinValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (byte) 42);
         inMinValue.copyTo(arrayInMinValue);
         byte[] arrayInMaxValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (byte) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -3078,36 +3632,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampChar2CharCharChar2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampChar2CharCharChar2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampChar3CharCharChar3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x4aa68c1b65a26ee5l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x8b4b9ea0492789dfl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x8b4b9e94da847be5l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x65a26ee5l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x492789dfl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0xda847be5l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
@@ -3131,13 +3693,19 @@
 
     private void verifyResultsClampChar3CharCharChar3(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayInMinValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (byte) 42);
         inMinValue.copyTo(arrayInMinValue);
         byte[] arrayInMaxValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (byte) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -3153,36 +3721,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampChar3CharCharChar3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampChar3CharCharChar3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampChar4CharCharChar4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xbec4cc7b4eed37f9l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0xda9eba33ce97385bl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0xda9eba285ff42a61l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x4eed37f9l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0xce97385bl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x5ff42a61l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
@@ -3206,13 +3782,19 @@
 
     private void verifyResultsClampChar4CharCharChar4(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayInMinValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (byte) 42);
         inMinValue.copyTo(arrayInMinValue);
         byte[] arrayInMaxValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (byte) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -3228,36 +3810,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampChar4CharCharChar4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampChar4CharCharChar4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUchar2UcharUcharUchar2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0xafd4a680f02e0d63l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x78bbbcb3e9402039l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x78bbbca87a9d123fl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0xf02e0d63l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0xe9402039l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x7a9d123fl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
@@ -3281,13 +3871,19 @@
 
     private void verifyResultsClampUchar2UcharUcharUchar2(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayInMinValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (byte) 42);
         inMinValue.copyTo(arrayInMinValue);
         byte[] arrayInMaxValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (byte) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -3303,36 +3899,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUchar2UcharUcharUchar2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUchar2UcharUcharUchar2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUchar3UcharUcharUchar3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0xfedafacc68ea3ae9l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x8371883e1c6e882bl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x83718832adcb7a31l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x68ea3ae9l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x1c6e882bl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0xadcb7a31l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
@@ -3356,13 +3960,19 @@
 
     private void verifyResultsClampUchar3UcharUcharUchar3(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayInMinValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (byte) 42);
         inMinValue.copyTo(arrayInMinValue);
         byte[] arrayInMaxValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (byte) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -3378,36 +3988,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUchar3UcharUcharUchar3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUchar3UcharUcharUchar3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUchar4UcharUcharUchar4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x4de14f17e1a6686fl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x8e2753c84f9cf01dl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x8e2753bce0f9e223l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0xe1a6686fl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x4f9cf01dl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0xe0f9e223l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
@@ -3431,13 +4049,19 @@
 
     private void verifyResultsClampUchar4UcharUcharUchar4(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayInMinValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (byte) 42);
         inMinValue.copyTo(arrayInMinValue);
         byte[] arrayInMaxValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (byte) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -3453,36 +4077,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUchar4UcharUcharUchar4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUchar4UcharUcharUchar4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampShort2ShortShortShort2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x89e3627eae2d6a9l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x886d6d2ccaca776bl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x886d6d215c276971l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0xeae2d6a9l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0xcaca776bl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x5c276971l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
@@ -3506,13 +4138,19 @@
 
     private void verifyResultsClampShort2ShortShortShort2(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayInMinValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (short) 42);
         inMinValue.copyTo(arrayInMinValue);
         short[] arrayInMaxValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (short) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -3528,36 +4166,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampShort2ShortShortShort2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampShort2ShortShortShort2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampShort3ShortShortShort3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x57a48a73639f042fl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x932338b6fdf8df5dl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x932338ab8f55d163l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x639f042fl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0xfdf8df5dl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x8f55d163l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
@@ -3581,13 +4227,19 @@
 
     private void verifyResultsClampShort3ShortShortShort3(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayInMinValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (short) 42);
         inMinValue.copyTo(arrayInMinValue);
         short[] arrayInMaxValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (short) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -3603,36 +4255,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampShort3ShortShortShort3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampShort3ShortShortShort3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampShort4ShortShortShort4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xa6aadebedc5b31b5l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x9dd904413127474fl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x9dd90435c2843955l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xdc5b31b5l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x3127474fl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0xc2843955l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
@@ -3656,13 +4316,19 @@
 
     private void verifyResultsClampShort4ShortShortShort4(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayInMinValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (short) 42);
         inMinValue.copyTo(arrayInMinValue);
         short[] arrayInMaxValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (short) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -3678,36 +4344,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampShort4ShortShortShort4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampShort4ShortShortShort4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUshort2UshortUshortUshort2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x2ece6d045621ef07l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xd88bd79cc7874965l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xd88bd79158e43b6bl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x5621ef07l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xc7874965l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0x58e43b6bl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
@@ -3731,13 +4405,19 @@
 
     private void verifyResultsClampUshort2UshortUshortUshort2(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayInMinValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (short) 42);
         inMinValue.copyTo(arrayInMinValue);
         short[] arrayInMaxValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (short) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -3753,36 +4433,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUshort2UshortUshortUshort2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUshort2UshortUshortUshort2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUshort3UshortUshortUshort3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x393771467c9cd603l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xfe016431b3cf1419l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xfe016426452c061fl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x7c9cd603l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xb3cf1419l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0x452c061fl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
@@ -3806,13 +4494,19 @@
 
     private void verifyResultsClampUshort3UshortUshortUshort3(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayInMinValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (short) 42);
         inMinValue.copyTo(arrayInMinValue);
         short[] arrayInMaxValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (short) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -3828,36 +4522,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUshort3UshortUshortUshort3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUshort3UshortUshortUshort3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUshort4UshortUshortUshort4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x43a07588a317bcffl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0x2376f0c6a016decdl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0x2376f0bb3173d0d3l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xa317bcffl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xa016decdl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0x3173d0d3l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
@@ -3881,13 +4583,19 @@
 
     private void verifyResultsClampUshort4UshortUshortUshort4(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayInMinValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (short) 42);
         inMinValue.copyTo(arrayInMinValue);
         short[] arrayInMaxValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (short) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -3903,36 +4611,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUshort4UshortUshortUshort4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUshort4UshortUshortUshort4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampInt2IntIntInt2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xbb55c0997906d1dbl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x69776e80fba24121l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x69776e758cff3327l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x7906d1dbl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xfba24121l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x8cff3327l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
@@ -3956,13 +4672,19 @@
 
     private void verifyResultsClampInt2IntIntInt2(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayInMinValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (int) 42);
         inMinValue.copyTo(arrayInMinValue);
         int[] arrayInMaxValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (int) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -3978,36 +4700,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampInt2IntIntInt2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampInt2IntIntInt2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampInt3IntIntInt3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x3af8924ab5370be9l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xdde27628f1a08b2bl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xdde2761d82fd7d31l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xb5370be9l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xf1a08b2bl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x82fd7d31l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
@@ -4031,13 +4761,19 @@
 
     private void verifyResultsClampInt3IntIntInt3(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayInMinValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (int) 42);
         inMinValue.copyTo(arrayInMinValue);
         int[] arrayInMaxValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (int) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -4053,36 +4789,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampInt3IntIntInt3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampInt3IntIntInt3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampInt4IntIntInt4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xba9b63fbf16745f7l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x524d7dd0e79ed535l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x524d7dc578fbc73bl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xf16745f7l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xe79ed535l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x78fbc73bl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
@@ -4106,13 +4850,19 @@
 
     private void verifyResultsClampInt4IntIntInt4(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayInMinValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (int) 42);
         inMinValue.copyTo(arrayInMinValue);
         int[] arrayInMaxValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (int) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -4128,36 +4878,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampInt4IntIntInt4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampInt4IntIntInt4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUint2UintUintUint2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x4fd098dd770d5a51l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0x6de3f327c2a180e3l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0x6de3f31c53fe72e9l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x770d5a51l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xc2a180e3l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0x53fe72e9l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
@@ -4181,13 +4939,19 @@
 
     private void verifyResultsClampUint2UintUintUint2(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayInMinValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (int) 42);
         inMinValue.copyTo(arrayInMinValue);
         int[] arrayInMaxValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (int) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -4203,36 +4967,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUint2UintUintUint2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUint2UintUintUint2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUint3UintUintUint3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xc3eed93d60582365l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xbd370ebb48112f5fl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xbd370eafd96e2165l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x60582365l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0x48112f5fl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xd96e2165l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
@@ -4256,13 +5028,19 @@
 
     private void verifyResultsClampUint3UintUintUint3(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayInMinValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (int) 42);
         inMinValue.copyTo(arrayInMinValue);
         int[] arrayInMaxValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (int) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -4278,36 +5056,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUint3UintUintUint3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUint3UintUintUint3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUint4UintUintUint4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x380d199d49a2ec79l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xc8a2a4ecd80dddbl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xc8a2a435eddcfe1l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x49a2ec79l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xcd80dddbl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0x5eddcfe1l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
@@ -4331,13 +5117,19 @@
 
     private void verifyResultsClampUint4UintUintUint4(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayInMinValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (int) 42);
         inMinValue.copyTo(arrayInMinValue);
         int[] arrayInMaxValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (int) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -4353,36 +5145,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUint4UintUintUint4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUint4UintUintUint4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampLong2LongLongLong2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x19353a9f7c535bb5l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0xee8dc7f38f83654fl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0xee8dc7e820e05755l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x7c535bb5l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x8f83654fl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x20e05755l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
@@ -4406,13 +5206,19 @@
 
     private void verifyResultsClampLong2LongLongLong2(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         long[] arrayInValue = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (long) 42);
         inValue.copyTo(arrayInValue);
         long[] arrayInMinValue = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (long) 42);
         inMinValue.copyTo(arrayInMinValue);
         long[] arrayInMaxValue = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (long) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -4428,36 +5234,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampLong2LongLongLong2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampLong2LongLongLong2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampLong3LongLongLong3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x8d537aff659e24c9l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x3de0e38714f313cbl, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x3de0e37ba65005d1l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x659e24c9l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x14f313cbl, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0xa65005d1l, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
@@ -4481,13 +5295,19 @@
 
     private void verifyResultsClampLong3LongLongLong3(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         long[] arrayInValue = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (long) 42);
         inValue.copyTo(arrayInValue);
         long[] arrayInMinValue = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (long) 42);
         inMinValue.copyTo(arrayInMinValue);
         long[] arrayInMaxValue = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (long) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -4503,36 +5323,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampLong3LongLongLong3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampLong3LongLongLong3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampLong4LongLongLong4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x171bb5f4ee8edddl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x8d33ff1a9a62c247l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x8d33ff0f2bbfb44dl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x4ee8edddl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x9a62c247l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x2bbfb44dl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
@@ -4556,13 +5384,19 @@
 
     private void verifyResultsClampLong4LongLongLong4(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         long[] arrayInValue = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (long) 42);
         inValue.copyTo(arrayInValue);
         long[] arrayInMinValue = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (long) 42);
         inMinValue.copyTo(arrayInMinValue);
         long[] arrayInMaxValue = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (long) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -4578,36 +5412,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampLong4LongLongLong4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampLong4LongLongLong4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUlong2UlongUlongUlong2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0xf275dabaa7fa1bf7l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0xf08a9e698d13b735l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0xf08a9e5e1e70a93bl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0xa7fa1bf7l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x8d13b735l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x1e70a93bl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
@@ -4631,13 +5473,19 @@
 
     private void verifyResultsClampUlong2UlongUlongUlong2(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         long[] arrayInValue = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (long) 42);
         inValue.copyTo(arrayInValue);
         long[] arrayInMinValue = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (long) 42);
         inMinValue.copyTo(arrayInMinValue);
         long[] arrayInMaxValue = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (long) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -4653,36 +5501,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUlong2UlongUlongUlong2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUlong2UlongUlongUlong2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUlong3UlongUlongUlong3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x417c2f0620b6497dl, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0xfb4069f3c0421f27l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0xfb4069e8519f112dl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x20b6497dl, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0xc0421f27l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x519f112dl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
@@ -4706,13 +5562,19 @@
 
     private void verifyResultsClampUlong3UlongUlongUlong3(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         long[] arrayInValue = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (long) 42);
         inValue.copyTo(arrayInValue);
         long[] arrayInMinValue = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (long) 42);
         inMinValue.copyTo(arrayInMinValue);
         long[] arrayInMaxValue = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (long) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -4728,36 +5590,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUlong3UlongUlongUlong3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUlong3UlongUlongUlong3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClampUlong4UlongUlongUlong4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x9082835199727703l, false);
-        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x5f6357df3708719l, false);
-        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x5f6357284cd791fl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x99727703l, false);
+        Allocation inMinValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0xf3708719l, false);
+        Allocation inMaxValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x84cd791fl, false);
         enforceOrdering(inMinValue, inMaxValue);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
@@ -4781,13 +5651,19 @@
 
     private void verifyResultsClampUlong4UlongUlongUlong4(Allocation inValue, Allocation inMinValue, Allocation inMaxValue, Allocation out, boolean relaxed) {
         long[] arrayInValue = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (long) 42);
         inValue.copyTo(arrayInValue);
         long[] arrayInMinValue = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInMinValue, (long) 42);
         inMinValue.copyTo(arrayInMinValue);
         long[] arrayInMaxValue = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInMaxValue, (long) 42);
         inMaxValue.copyTo(arrayInMaxValue);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -4803,30 +5679,38 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Input inMinValue: ");
-                    appendVariableToMessage(message, args.inMinValue);
-                    message.append("\n");
-                    message.append("Input inMaxValue: ");
-                    appendVariableToMessage(message, args.inMaxValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Input inMinValue: ");
+                        appendVariableToMessage(message, args.inMinValue);
+                        message.append("\n");
+                        message.append("Input inMaxValue: ");
+                        appendVariableToMessage(message, args.inMaxValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClampUlong4UlongUlongUlong4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClampUlong4UlongUlongUlong4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testClamp() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestClz.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestClz.java
index d9e7022..d2fe5df 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestClz.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestClz.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestClz extends RSBaseCompute {
 
     private ScriptC_TestClz script;
@@ -40,7 +42,7 @@
     }
 
     private void checkClzCharChar() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0xf6f3a15e2f7765afl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x2f7765afl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 1), INPUTSIZE);
             script.forEach_testClzCharChar(inValue, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsClzCharChar(Allocation inValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayOut = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -75,28 +81,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzCharChar" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzCharChar" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClzChar2Char2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xf718b99dcaca5e93l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xcaca5e93l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
             script.forEach_testClzChar2Char2(inValue, out);
@@ -115,9 +129,13 @@
 
     private void verifyResultsClzChar2Char2(Allocation inValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -131,28 +149,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzChar2Char2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzChar2Char2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClzChar3Char3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x21a5da5bc7099347l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xc7099347l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
             script.forEach_testClzChar3Char3(inValue, out);
@@ -171,9 +197,13 @@
 
     private void verifyResultsClzChar3Char3(Allocation inValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -187,28 +217,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzChar3Char3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzChar3Char3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClzChar4Char4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x4c32fb19c348c7fbl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xc348c7fbl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
             script.forEach_testClzChar4Char4(inValue, out);
@@ -227,9 +265,13 @@
 
     private void verifyResultsClzChar4Char4(Allocation inValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -243,24 +285,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzChar4Char4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzChar4Char4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUcharUchar {
@@ -269,7 +319,7 @@
     }
 
     private void checkClzUcharUchar() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0xd2e451b48b84f57fl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x8b84f57fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 1), INPUTSIZE);
             script.forEach_testClzUcharUchar(inValue, out);
@@ -288,9 +338,13 @@
 
     private void verifyResultsClzUcharUchar(Allocation inValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayOut = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -304,28 +358,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzUcharUchar" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzUcharUchar" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClzUchar2Uchar2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x792e2970f47ebc85l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0xf47ebc85l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
             script.forEach_testClzUchar2Uchar2(inValue, out);
@@ -344,9 +406,13 @@
 
     private void verifyResultsClzUchar2Uchar2(Allocation inValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -360,28 +426,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzUchar2Uchar2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzUchar2Uchar2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClzUchar3Uchar3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x9ee29ef83dbce203l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x3dbce203l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
             script.forEach_testClzUchar3Uchar3(inValue, out);
@@ -400,9 +474,13 @@
 
     private void verifyResultsClzUchar3Uchar3(Allocation inValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -416,28 +494,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzUchar3Uchar3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzUchar3Uchar3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClzUchar4Uchar4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0xc497147f86fb0781l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x86fb0781l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
             script.forEach_testClzUchar4Uchar4(inValue, out);
@@ -456,9 +542,13 @@
 
     private void verifyResultsClzUchar4Uchar4(Allocation inValue, Allocation out, boolean relaxed) {
         byte[] arrayInValue = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (byte) 42);
         inValue.copyTo(arrayInValue);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -472,24 +562,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzUchar4Uchar4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzUchar4Uchar4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsShortShort {
@@ -498,7 +596,7 @@
     }
 
     private void checkClzShortShort() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x3290aea900d8ad53l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0xd8ad53l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 1), INPUTSIZE);
             script.forEach_testClzShortShort(inValue, out);
@@ -517,9 +615,13 @@
 
     private void verifyResultsClzShortShort(Allocation inValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayOut = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -533,28 +635,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzShortShort" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzShortShort" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClzShort2Short2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x81f69d4442dd6ebfl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x42dd6ebfl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
             script.forEach_testClzShort2Short2(inValue, out);
@@ -573,9 +683,13 @@
 
     private void verifyResultsClzShort2Short2(Allocation inValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -589,28 +703,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzShort2Short2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzShort2Short2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClzShort3Short3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0xa7ab12cb8c1b943dl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x8c1b943dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
             script.forEach_testClzShort3Short3(inValue, out);
@@ -629,9 +751,13 @@
 
     private void verifyResultsClzShort3Short3(Allocation inValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -645,28 +771,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzShort3Short3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzShort3Short3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClzShort4Short4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xcd5f8852d559b9bbl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xd559b9bbl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
             script.forEach_testClzShort4Short4(inValue, out);
@@ -685,9 +819,13 @@
 
     private void verifyResultsClzShort4Short4(Allocation inValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -701,24 +839,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzShort4Short4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzShort4Short4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUshortUshort {
@@ -727,7 +873,7 @@
     }
 
     private void checkClzUshortUshort() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0x97bdeee92c0103a5l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0x2c0103a5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 1), INPUTSIZE);
             script.forEach_testClzUshortUshort(inValue, out);
@@ -746,9 +892,13 @@
 
     private void verifyResultsClzUshortUshort(Allocation inValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayOut = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -762,28 +912,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzUshortUshort" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzUshortUshort" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClzUshort2Ushort2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x5ea7a024b2913837l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xb2913837l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
             script.forEach_testClzUshort2Ushort2(inValue, out);
@@ -802,9 +960,13 @@
 
     private void verifyResultsClzUshort2Ushort2(Allocation inValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -818,28 +980,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzUshort2Ushort2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzUshort2Ushort2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClzUshort3Ushort3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xb3f7537beaa1cfa3l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xeaa1cfa3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
             script.forEach_testClzUshort3Ushort3(inValue, out);
@@ -858,9 +1028,13 @@
 
     private void verifyResultsClzUshort3Ushort3(Allocation inValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -874,28 +1048,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzUshort3Ushort3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzUshort3Ushort3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClzUshort4Ushort4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x94706d322b2670fl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x22b2670fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
             script.forEach_testClzUshort4Ushort4(inValue, out);
@@ -914,9 +1096,13 @@
 
     private void verifyResultsClzUshort4Ushort4(Allocation inValue, Allocation out, boolean relaxed) {
         short[] arrayInValue = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (short) 42);
         inValue.copyTo(arrayInValue);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -930,24 +1116,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzUshort4Ushort4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzUshort4Ushort4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsIntInt {
@@ -956,7 +1150,7 @@
     }
 
     private void checkClzIntInt() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xb13809da3142eb97l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x3142eb97l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
             script.forEach_testClzIntInt(inValue, out);
@@ -975,9 +1169,13 @@
 
     private void verifyResultsClzIntInt(Allocation inValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayOut = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -991,28 +1189,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzIntInt" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzIntInt" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClzInt2Int2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xc9fd2c1a27fe3ad5l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x27fe3ad5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             script.forEach_testClzInt2Int2(inValue, out);
@@ -1031,9 +1237,13 @@
 
     private void verifyResultsClzInt2Int2(Allocation inValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -1047,28 +1257,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzInt2Int2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzInt2Int2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClzInt3Int3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xd6e2b014f2d24c2bl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xf2d24c2bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             script.forEach_testClzInt3Int3(inValue, out);
@@ -1087,9 +1305,13 @@
 
     private void verifyResultsClzInt3Int3(Allocation inValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -1103,28 +1325,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzInt3Int3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzInt3Int3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClzInt4Int4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xe3c8340fbda65d81l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xbda65d81l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             script.forEach_testClzInt4Int4(inValue, out);
@@ -1143,9 +1373,13 @@
 
     private void verifyResultsClzInt4Int4(Allocation inValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -1159,24 +1393,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzInt4Int4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzInt4Int4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUintUint {
@@ -1185,7 +1427,7 @@
     }
 
     private void checkClzUintUint() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0x64a0b78a75ac502fl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0x75ac502fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 1), INPUTSIZE);
             script.forEach_testClzUintUint(inValue, out);
@@ -1204,9 +1446,13 @@
 
     private void verifyResultsClzUintUint(Allocation inValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayOut = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -1220,28 +1466,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzUintUint" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzUintUint" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClzUint2Uint2() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xf809b50329344f93l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x29344f93l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
             script.forEach_testClzUint2Uint2(inValue, out);
@@ -1260,9 +1514,13 @@
 
     private void verifyResultsClzUint2Uint2(Allocation inValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -1276,28 +1534,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzUint2Uint2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzUint2Uint2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClzUint3Uint3() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x2296d5c125738447l, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x25738447l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
             script.forEach_testClzUint3Uint3(inValue, out);
@@ -1316,9 +1582,13 @@
 
     private void verifyResultsClzUint3Uint3(Allocation inValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -1332,28 +1602,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzUint3Uint3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzUint3Uint3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkClzUint4Uint4() {
-        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x4d23f67f21b2b8fbl, false);
+        Allocation inValue = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x21b2b8fbl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
             script.forEach_testClzUint4Uint4(inValue, out);
@@ -1372,9 +1650,13 @@
 
     private void verifyResultsClzUint4Uint4(Allocation inValue, Allocation out, boolean relaxed) {
         int[] arrayInValue = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInValue, (int) 42);
         inValue.copyTo(arrayInValue);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -1388,24 +1670,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inValue: ");
-                    appendVariableToMessage(message, args.inValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inValue: ");
+                        appendVariableToMessage(message, args.inValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkClzUint4Uint4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkClzUint4Uint4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testClz() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestConvert.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestConvert.java
index 8d09dd4..0db6576 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestConvert.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestConvert.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestConvert extends RSBaseCompute {
 
     private ScriptC_TestConvert script;
@@ -40,7 +42,7 @@
     }
 
     private void checkConvertFloat2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xfb5215c44e1f6ac6l, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4e1f6ac6l, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testConvertFloat2Float2Float2(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsConvertFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xfb53dedf443a8ba4l, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x443a8ba4l, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testConvertFloat3Float3Float3(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsConvertFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xfb55a7fa3a55ac82l, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3a55ac82l, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testConvertFloat4Float4Float4(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsConvertFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -190,24 +220,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsCharFloat {
@@ -216,7 +254,7 @@
     }
 
     private void checkConvertChar2Float2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x5861e2161f489286l, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x1f489286l, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testConvertFloat2Char2Float2(inV, out);
@@ -235,9 +273,13 @@
 
     private void verifyResultsConvertChar2Float2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -252,28 +294,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar3Float3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x5863ab311563b364l, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x1563b364l, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testConvertFloat3Char3Float3(inV, out);
@@ -292,9 +342,13 @@
 
     private void verifyResultsConvertChar3Float3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -309,28 +363,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar4Float4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x5865744c0b7ed442l, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xb7ed442l, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testConvertFloat4Char4Float4(inV, out);
@@ -349,9 +411,13 @@
 
     private void verifyResultsConvertChar4Float4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -366,24 +432,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUcharFloat {
@@ -392,7 +466,7 @@
     }
 
     private void checkConvertUchar2Float2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x7d30021dbb20ac31l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0xbb20ac31l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testConvertFloat2Uchar2Float2(inV, out);
@@ -411,9 +485,13 @@
 
     private void verifyResultsConvertUchar2Float2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -428,28 +506,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar3Float3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x7d31cb38b13bcd0fl, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0xb13bcd0fl, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testConvertFloat3Uchar3Float3(inV, out);
@@ -468,9 +554,13 @@
 
     private void verifyResultsConvertUchar3Float3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -485,28 +575,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar4Float4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7d339453a756ededl, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0xa756ededl, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testConvertFloat4Uchar4Float4(inV, out);
@@ -525,9 +623,13 @@
 
     private void verifyResultsConvertUchar4Float4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -542,24 +644,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsShortFloat {
@@ -568,7 +678,7 @@
     }
 
     private void checkConvertShort2Float2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x94ca184eff219172l, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0xff219172l, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testConvertFloat2Short2Float2(inV, out);
@@ -587,9 +697,13 @@
 
     private void verifyResultsConvertShort2Float2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -604,28 +718,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort3Float3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x94cbe169f53cb250l, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0xf53cb250l, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testConvertFloat3Short3Float3(inV, out);
@@ -644,9 +766,13 @@
 
     private void verifyResultsConvertShort3Float3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -661,28 +787,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort4Float4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x94cdaa84eb57d32el, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xeb57d32el, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testConvertFloat4Short4Float4(inV, out);
@@ -701,9 +835,13 @@
 
     private void verifyResultsConvertShort4Float4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -718,24 +856,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUshortFloat {
@@ -744,7 +890,7 @@
     }
 
     private void checkConvertUshort2Float2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xc36979962c6de12bl, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x2c6de12bl, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testConvertFloat2Ushort2Float2(inV, out);
@@ -763,9 +909,13 @@
 
     private void verifyResultsConvertUshort2Float2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -780,28 +930,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort3Float3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xc36b42b122890209l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x22890209l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testConvertFloat3Ushort3Float3(inV, out);
@@ -820,9 +978,13 @@
 
     private void verifyResultsConvertUshort3Float3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -837,28 +999,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort4Float4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xc36d0bcc18a422e7l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x18a422e7l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testConvertFloat4Ushort4Float4(inV, out);
@@ -877,9 +1047,13 @@
 
     private void verifyResultsConvertUshort4Float4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -894,24 +1068,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsIntFloat {
@@ -920,7 +1102,7 @@
     }
 
     private void checkConvertInt2Float2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x2a52c7eb7402bfc5l, true, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x7402bfc5l, true, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testConvertFloat2Int2Float2(inV, out);
@@ -939,9 +1121,13 @@
 
     private void verifyResultsConvertInt2Float2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -956,28 +1142,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt3Float3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x2a5491066a1de0a3l, true, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x6a1de0a3l, true, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testConvertFloat3Int3Float3(inV, out);
@@ -996,9 +1190,13 @@
 
     private void verifyResultsConvertInt3Float3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -1013,28 +1211,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt4Float4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x2a565a2160390181l, true, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x60390181l, true, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testConvertFloat4Int4Float4(inV, out);
@@ -1053,9 +1259,13 @@
 
     private void verifyResultsConvertInt4Float4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -1070,24 +1280,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUintFloat {
@@ -1096,7 +1314,7 @@
     }
 
     private void checkConvertUint2Float2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xd1e081390684cc46l, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x684cc46l, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testConvertFloat2Uint2Float2(inV, out);
@@ -1115,9 +1333,13 @@
 
     private void verifyResultsConvertUint2Float2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -1132,28 +1354,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint3Float3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xd1e24a53fc9fed24l, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xfc9fed24l, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testConvertFloat3Uint3Float3(inV, out);
@@ -1172,9 +1402,13 @@
 
     private void verifyResultsConvertUint3Float3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -1189,28 +1423,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint4Float4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xd1e4136ef2bb0e02l, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xf2bb0e02l, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testConvertFloat4Uint4Float4(inV, out);
@@ -1229,9 +1471,13 @@
 
     private void verifyResultsConvertUint4Float4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -1246,24 +1492,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatChar {
@@ -1272,7 +1526,7 @@
     }
 
     private void checkConvertFloat2Char2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x239cb25829789662l, -1.2800000000000000000e+02, 1.2700000000000000000e+02);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x29789662l, -1.2800000000000000000e+02, 1.2700000000000000000e+02);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertChar2Float2Char2(inV, out);
@@ -1291,9 +1545,13 @@
 
     private void verifyResultsConvertFloat2Char2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -1307,28 +1565,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat2Char2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat2Char2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat3Char3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x239cbcf988805b56l, -1.2800000000000000000e+02, 1.2700000000000000000e+02);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x88805b56l, -1.2800000000000000000e+02, 1.2700000000000000000e+02);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertChar3Float3Char3(inV, out);
@@ -1347,9 +1613,13 @@
 
     private void verifyResultsConvertFloat3Char3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -1363,28 +1633,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat3Char3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat3Char3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat4Char4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x239cc79ae788204al, -1.2800000000000000000e+02, 1.2700000000000000000e+02);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe788204al, -1.2800000000000000000e+02, 1.2700000000000000000e+02);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertChar4Float4Char4(inV, out);
@@ -1403,9 +1681,13 @@
 
     private void verifyResultsConvertFloat4Char4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -1419,24 +1701,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat4Char4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat4Char4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsCharChar {
@@ -1445,7 +1735,7 @@
     }
 
     private void checkConvertChar2Char2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xd8618777d5086da2l, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xd5086da2l, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertChar2Char2Char2(inV, out);
@@ -1464,9 +1754,13 @@
 
     private void verifyResultsConvertChar2Char2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -1480,28 +1774,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar2Char2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar2Char2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar3Char3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xd861921934103296l, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x34103296l, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertChar3Char3Char3(inV, out);
@@ -1520,9 +1822,13 @@
 
     private void verifyResultsConvertChar3Char3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -1536,28 +1842,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar3Char3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar3Char3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar4Char4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xd8619cba9317f78al, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x9317f78al, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertChar4Char4Char4(inV, out);
@@ -1576,9 +1890,13 @@
 
     private void verifyResultsConvertChar4Char4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -1592,24 +1910,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar4Char4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar4Char4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUcharChar {
@@ -1618,7 +1944,7 @@
     }
 
     private void checkConvertUchar2Char2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x7fef40c5678a7a23l, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x678a7a23l, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertChar2Uchar2Char2(inV, out);
@@ -1637,9 +1963,13 @@
 
     private void verifyResultsConvertUchar2Char2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -1653,28 +1983,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar2Char2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar2Char2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar3Char3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x7fef4b66c6923f17l, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0xc6923f17l, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertChar3Uchar3Char3(inV, out);
@@ -1693,9 +2031,13 @@
 
     private void verifyResultsConvertUchar3Char3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -1709,28 +2051,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar3Char3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar3Char3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar4Char4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7fef5608259a040bl, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x259a040bl, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertChar4Uchar4Char4(inV, out);
@@ -1749,9 +2099,13 @@
 
     private void verifyResultsConvertUchar4Char4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -1765,24 +2119,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar4Char4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar4Char4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsShortChar {
@@ -1791,7 +2153,7 @@
     }
 
     private void checkConvertShort2Char2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x68ab650215c60866l, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x15c60866l, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertChar2Short2Char2(inV, out);
@@ -1810,9 +2172,13 @@
 
     private void verifyResultsConvertShort2Char2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -1826,28 +2192,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort2Char2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort2Char2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort3Char3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x68ab6fa374cdcd5al, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x74cdcd5al, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertChar3Short3Char3(inV, out);
@@ -1866,9 +2240,13 @@
 
     private void verifyResultsConvertShort3Char3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -1882,28 +2260,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort3Char3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort3Char3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort4Char4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x68ab7a44d3d5924el, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xd3d5924el, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertChar4Short4Char4(inV, out);
@@ -1922,9 +2308,13 @@
 
     private void verifyResultsConvertShort4Char4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -1938,24 +2328,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort4Char4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort4Char4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUshortChar {
@@ -1964,7 +2362,7 @@
     }
 
     private void checkConvertUshort2Char2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x8d798509b19e2211l, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xb19e2211l, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertChar2Ushort2Char2(inV, out);
@@ -1983,9 +2381,13 @@
 
     private void verifyResultsConvertUshort2Char2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -1999,28 +2401,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort2Char2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort2Char2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort3Char3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x8d798fab10a5e705l, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x10a5e705l, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertChar3Ushort3Char3(inV, out);
@@ -2039,9 +2449,13 @@
 
     private void verifyResultsConvertUshort3Char3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -2055,28 +2469,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort3Char3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort3Char3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort4Char4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x8d799a4c6fadabf9l, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x6fadabf9l, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertChar4Ushort4Char4(inV, out);
@@ -2095,9 +2517,13 @@
 
     private void verifyResultsConvertUshort4Char4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -2111,24 +2537,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort4Char4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort4Char4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsIntChar {
@@ -2137,7 +2571,7 @@
     }
 
     private void checkConvertInt2Char2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xd74f5147364256dfl, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x364256dfl, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertChar2Int2Char2(inV, out);
@@ -2156,9 +2590,13 @@
 
     private void verifyResultsConvertInt2Char2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -2172,28 +2610,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt2Char2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt2Char2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt3Char3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xd74f5be8954a1bd3l, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x954a1bd3l, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertChar3Int3Char3(inV, out);
@@ -2212,9 +2658,13 @@
 
     private void verifyResultsConvertInt3Char3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -2228,28 +2678,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt3Char3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt3Char3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt4Char4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xd74f6689f451e0c7l, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xf451e0c7l, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertChar4Int4Char4(inV, out);
@@ -2268,9 +2726,13 @@
 
     private void verifyResultsConvertInt4Char4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -2284,24 +2746,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt4Char4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt4Char4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUintChar {
@@ -2310,7 +2780,7 @@
     }
 
     private void checkConvertUint2Char2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xe71d083133b67ae2l, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x33b67ae2l, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertChar2Uint2Char2(inV, out);
@@ -2329,9 +2799,13 @@
 
     private void verifyResultsConvertUint2Char2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -2345,28 +2819,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint2Char2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint2Char2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint3Char3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xe71d12d292be3fd6l, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x92be3fd6l, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertChar3Uint3Char3(inV, out);
@@ -2385,9 +2867,13 @@
 
     private void verifyResultsConvertUint3Char3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -2401,28 +2887,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint3Char3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint3Char3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint4Char4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xe71d1d73f1c604cal, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xf1c604cal, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertChar4Uint4Char4(inV, out);
@@ -2441,9 +2935,13 @@
 
     private void verifyResultsConvertUint4Char4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -2457,24 +2955,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint4Char4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint4Char4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatUchar {
@@ -2483,7 +2989,7 @@
     }
 
     private void checkConvertFloat2Uchar2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xfb52b2f4fac15b79l, 0.0000000000000000000e+00, 2.5500000000000000000e+02);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xfac15b79l, 0.0000000000000000000e+00, 2.5500000000000000000e+02);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertUchar2Float2Uchar2(inV, out);
@@ -2502,9 +3008,13 @@
 
     private void verifyResultsConvertFloat2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -2518,28 +3028,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat2Uchar2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat2Uchar2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat3Uchar3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xfb547c0ff0dc7c57l, 0.0000000000000000000e+00, 2.5500000000000000000e+02);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf0dc7c57l, 0.0000000000000000000e+00, 2.5500000000000000000e+02);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertUchar3Float3Uchar3(inV, out);
@@ -2558,9 +3076,13 @@
 
     private void verifyResultsConvertFloat3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -2574,28 +3096,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat3Uchar3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat3Uchar3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat4Uchar4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xfb56452ae6f79d35l, 0.0000000000000000000e+00, 2.5500000000000000000e+02);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe6f79d35l, 0.0000000000000000000e+00, 2.5500000000000000000e+02);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertUchar4Float4Uchar4(inV, out);
@@ -2614,9 +3144,13 @@
 
     private void verifyResultsConvertFloat4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -2630,24 +3164,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat4Uchar4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat4Uchar4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsCharUchar {
@@ -2656,7 +3198,7 @@
     }
 
     private void checkConvertChar2Uchar2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x58627f46cbea8339l, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xcbea8339l, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertUchar2Char2Uchar2(inV, out);
@@ -2675,9 +3217,13 @@
 
     private void verifyResultsConvertChar2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -2691,28 +3237,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar2Uchar2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar2Uchar2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar3Uchar3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x58644861c205a417l, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xc205a417l, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertUchar3Char3Uchar3(inV, out);
@@ -2731,9 +3285,13 @@
 
     private void verifyResultsConvertChar3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -2747,28 +3305,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar3Uchar3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar3Uchar3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar4Uchar4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x5866117cb820c4f5l, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xb820c4f5l, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertUchar4Char4Uchar4(inV, out);
@@ -2787,9 +3353,13 @@
 
     private void verifyResultsConvertChar4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -2803,24 +3373,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar4Uchar4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar4Uchar4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUcharUchar {
@@ -2829,7 +3407,7 @@
     }
 
     private void checkConvertUchar2Uchar2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x7d309f4e67c29ce4l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x67c29ce4l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertUchar2Uchar2Uchar2(inV, out);
@@ -2848,9 +3426,13 @@
 
     private void verifyResultsConvertUchar2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -2864,28 +3446,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar2Uchar2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar2Uchar2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar3Uchar3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x7d3268695dddbdc2l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x5dddbdc2l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertUchar3Uchar3Uchar3(inV, out);
@@ -2904,9 +3494,13 @@
 
     private void verifyResultsConvertUchar3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -2920,28 +3514,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar3Uchar3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar3Uchar3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar4Uchar4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7d34318453f8dea0l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x53f8dea0l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertUchar4Uchar4Uchar4(inV, out);
@@ -2960,9 +3562,13 @@
 
     private void verifyResultsConvertUchar4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -2976,24 +3582,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar4Uchar4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar4Uchar4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsShortUchar {
@@ -3002,7 +3616,7 @@
     }
 
     private void checkConvertShort2Uchar2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x94cab57fabc38225l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0xabc38225l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertUchar2Short2Uchar2(inV, out);
@@ -3021,9 +3635,13 @@
 
     private void verifyResultsConvertShort2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -3037,28 +3655,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort2Uchar2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort2Uchar2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort3Uchar3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x94cc7e9aa1dea303l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0xa1dea303l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertUchar3Short3Uchar3(inV, out);
@@ -3077,9 +3703,13 @@
 
     private void verifyResultsConvertShort3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -3093,28 +3723,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort3Uchar3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort3Uchar3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort4Uchar4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x94ce47b597f9c3e1l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x97f9c3e1l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertUchar4Short4Uchar4(inV, out);
@@ -3133,9 +3771,13 @@
 
     private void verifyResultsConvertShort4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -3149,24 +3791,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort4Uchar4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort4Uchar4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUshortUchar {
@@ -3175,7 +3825,7 @@
     }
 
     private void checkConvertUshort2Uchar2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xc36a16c6d90fd1del, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xd90fd1del, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertUchar2Ushort2Uchar2(inV, out);
@@ -3194,9 +3844,13 @@
 
     private void verifyResultsConvertUshort2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -3210,28 +3864,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort2Uchar2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort2Uchar2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort3Uchar3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xc36bdfe1cf2af2bcl, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xcf2af2bcl, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertUchar3Ushort3Uchar3(inV, out);
@@ -3250,9 +3912,13 @@
 
     private void verifyResultsConvertUshort3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -3266,28 +3932,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort3Uchar3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort3Uchar3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort4Uchar4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xc36da8fcc546139al, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xc546139al, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertUchar4Ushort4Uchar4(inV, out);
@@ -3306,9 +3980,13 @@
 
     private void verifyResultsConvertUshort4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -3322,24 +4000,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort4Uchar4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort4Uchar4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsIntUchar {
@@ -3348,7 +4034,7 @@
     }
 
     private void checkConvertInt2Uchar2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x2a53651c20a4b078l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x20a4b078l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertUchar2Int2Uchar2(inV, out);
@@ -3367,9 +4053,13 @@
 
     private void verifyResultsConvertInt2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -3383,28 +4073,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt2Uchar2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt2Uchar2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt3Uchar3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x2a552e3716bfd156l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x16bfd156l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertUchar3Int3Uchar3(inV, out);
@@ -3423,9 +4121,13 @@
 
     private void verifyResultsConvertInt3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -3439,28 +4141,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt3Uchar3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt3Uchar3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt4Uchar4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x2a56f7520cdaf234l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xcdaf234l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertUchar4Int4Uchar4(inV, out);
@@ -3479,9 +4189,13 @@
 
     private void verifyResultsConvertInt4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -3495,24 +4209,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt4Uchar4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt4Uchar4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUintUchar {
@@ -3521,7 +4243,7 @@
     }
 
     private void checkConvertUint2Uchar2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xd1e11e69b326bcf9l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xb326bcf9l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertUchar2Uint2Uchar2(inV, out);
@@ -3540,9 +4262,13 @@
 
     private void verifyResultsConvertUint2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -3556,28 +4282,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint2Uchar2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint2Uchar2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint3Uchar3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xd1e2e784a941ddd7l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xa941ddd7l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertUchar3Uint3Uchar3(inV, out);
@@ -3596,9 +4330,13 @@
 
     private void verifyResultsConvertUint3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -3612,28 +4350,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint3Uchar3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint3Uchar3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint4Uchar4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xd1e4b09f9f5cfeb5l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x9f5cfeb5l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertUchar4Uint4Uchar4(inV, out);
@@ -3652,9 +4398,13 @@
 
     private void verifyResultsConvertUint4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -3668,24 +4418,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint4Uchar4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint4Uchar4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatShort {
@@ -3694,7 +4452,7 @@
     }
 
     private void checkConvertFloat2Short2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xfb529ef98fcf2692l, -3.2768000000000000000e+04, 3.2767000000000000000e+04);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8fcf2692l, -3.2768000000000000000e+04, 3.2767000000000000000e+04);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertShort2Float2Short2(inV, out);
@@ -3713,9 +4471,13 @@
 
     private void verifyResultsConvertFloat2Short2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -3729,28 +4491,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat2Short2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat2Short2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat3Short3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xfb54681485ea4770l, -3.2768000000000000000e+04, 3.2767000000000000000e+04);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x85ea4770l, -3.2768000000000000000e+04, 3.2767000000000000000e+04);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertShort3Float3Short3(inV, out);
@@ -3769,9 +4539,13 @@
 
     private void verifyResultsConvertFloat3Short3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -3785,28 +4559,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat3Short3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat3Short3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat4Short4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xfb56312f7c05684el, -3.2768000000000000000e+04, 3.2767000000000000000e+04);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x7c05684el, -3.2768000000000000000e+04, 3.2767000000000000000e+04);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertShort4Float4Short4(inV, out);
@@ -3825,9 +4607,13 @@
 
     private void verifyResultsConvertFloat4Short4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -3841,24 +4627,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat4Short4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat4Short4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsCharShort {
@@ -3867,7 +4661,7 @@
     }
 
     private void checkConvertChar2Short2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x58626b4b60f84e52l, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x60f84e52l, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertShort2Char2Short2(inV, out);
@@ -3886,9 +4680,13 @@
 
     private void verifyResultsConvertChar2Short2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -3902,28 +4700,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar2Short2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar2Short2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar3Short3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x5864346657136f30l, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x57136f30l, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertShort3Char3Short3(inV, out);
@@ -3942,9 +4748,13 @@
 
     private void verifyResultsConvertChar3Short3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -3958,28 +4768,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar3Short3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar3Short3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar4Short4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x5865fd814d2e900el, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x4d2e900el, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertShort4Char4Short4(inV, out);
@@ -3998,9 +4816,13 @@
 
     private void verifyResultsConvertChar4Short4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -4014,24 +4836,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar4Short4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar4Short4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUcharShort {
@@ -4040,7 +4870,7 @@
     }
 
     private void checkConvertUchar2Short2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x7d308b52fcd067fdl, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0xfcd067fdl, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertShort2Uchar2Short2(inV, out);
@@ -4059,9 +4889,13 @@
 
     private void verifyResultsConvertUchar2Short2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -4075,28 +4909,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar2Short2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar2Short2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar3Short3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x7d32546df2eb88dbl, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0xf2eb88dbl, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertShort3Uchar3Short3(inV, out);
@@ -4115,9 +4957,13 @@
 
     private void verifyResultsConvertUchar3Short3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -4131,28 +4977,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar3Short3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar3Short3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar4Short4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7d341d88e906a9b9l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0xe906a9b9l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertShort4Uchar4Short4(inV, out);
@@ -4171,9 +5025,13 @@
 
     private void verifyResultsConvertUchar4Short4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -4187,24 +5045,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar4Short4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar4Short4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsShortShort {
@@ -4213,7 +5079,7 @@
     }
 
     private void checkConvertShort2Short2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x94caa18440d14d3el, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x40d14d3el, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertShort2Short2Short2(inV, out);
@@ -4232,9 +5098,13 @@
 
     private void verifyResultsConvertShort2Short2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -4248,28 +5118,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort2Short2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort2Short2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort3Short3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x94cc6a9f36ec6e1cl, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x36ec6e1cl, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertShort3Short3Short3(inV, out);
@@ -4288,9 +5166,13 @@
 
     private void verifyResultsConvertShort3Short3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -4304,28 +5186,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort3Short3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort3Short3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort4Short4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x94ce33ba2d078efal, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x2d078efal, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertShort4Short4Short4(inV, out);
@@ -4344,9 +5234,13 @@
 
     private void verifyResultsConvertShort4Short4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -4360,24 +5254,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort4Short4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort4Short4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUshortShort {
@@ -4386,7 +5288,7 @@
     }
 
     private void checkConvertUshort2Short2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xc36a02cb6e1d9cf7l, false, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x6e1d9cf7l, false, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertShort2Ushort2Short2(inV, out);
@@ -4405,9 +5307,13 @@
 
     private void verifyResultsConvertUshort2Short2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -4421,28 +5327,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort2Short2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort2Short2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort3Short3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xc36bcbe66438bdd5l, false, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x6438bdd5l, false, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertShort3Ushort3Short3(inV, out);
@@ -4461,9 +5375,13 @@
 
     private void verifyResultsConvertUshort3Short3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -4477,28 +5395,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort3Short3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort3Short3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort4Short4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xc36d95015a53deb3l, false, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x5a53deb3l, false, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertShort4Ushort4Short4(inV, out);
@@ -4517,9 +5443,13 @@
 
     private void verifyResultsConvertUshort4Short4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -4533,24 +5463,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort4Short4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort4Short4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsIntShort {
@@ -4559,7 +5497,7 @@
     }
 
     private void checkConvertInt2Short2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x2a535120b5b27b91l, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xb5b27b91l, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertShort2Int2Short2(inV, out);
@@ -4578,9 +5516,13 @@
 
     private void verifyResultsConvertInt2Short2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -4594,28 +5536,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt2Short2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt2Short2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt3Short3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x2a551a3babcd9c6fl, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xabcd9c6fl, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertShort3Int3Short3(inV, out);
@@ -4634,9 +5584,13 @@
 
     private void verifyResultsConvertInt3Short3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -4650,28 +5604,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt3Short3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt3Short3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt4Short4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x2a56e356a1e8bd4dl, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xa1e8bd4dl, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertShort4Int4Short4(inV, out);
@@ -4690,9 +5652,13 @@
 
     private void verifyResultsConvertInt4Short4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -4706,24 +5672,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt4Short4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt4Short4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUintShort {
@@ -4732,7 +5706,7 @@
     }
 
     private void checkConvertUint2Short2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xd1e10a6e48348812l, false, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x48348812l, false, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertShort2Uint2Short2(inV, out);
@@ -4751,9 +5725,13 @@
 
     private void verifyResultsConvertUint2Short2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -4767,28 +5745,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint2Short2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint2Short2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint3Short3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xd1e2d3893e4fa8f0l, false, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x3e4fa8f0l, false, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertShort3Uint3Short3(inV, out);
@@ -4807,9 +5793,13 @@
 
     private void verifyResultsConvertUint3Short3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -4823,28 +5813,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint3Short3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint3Short3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint4Short4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xd1e49ca4346ac9cel, false, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x346ac9cel, false, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertShort4Uint4Short4(inV, out);
@@ -4863,9 +5861,13 @@
 
     private void verifyResultsConvertUint4Short4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -4879,24 +5881,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint4Short4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint4Short4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatUshort {
@@ -4905,7 +5915,7 @@
     }
 
     private void checkConvertFloat2Ushort2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x36e4b950b708416fl, 0.0000000000000000000e+00, 6.5535000000000000000e+04);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb708416fl, 0.0000000000000000000e+00, 6.5535000000000000000e+04);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertUshort2Float2Ushort2(inV, out);
@@ -4924,9 +5934,13 @@
 
     private void verifyResultsConvertFloat2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -4940,28 +5954,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat2Ushort2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat2Ushort2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat3Ushort3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x373180d80d63d29bl, 0.0000000000000000000e+00, 6.5535000000000000000e+04);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd63d29bl, 0.0000000000000000000e+00, 6.5535000000000000000e+04);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertUshort3Float3Ushort3(inV, out);
@@ -4980,9 +6002,13 @@
 
     private void verifyResultsConvertFloat3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -4996,28 +6022,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat3Ushort3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat3Ushort3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat4Ushort4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x377e485f63bf63c7l, 0.0000000000000000000e+00, 6.5535000000000000000e+04);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x63bf63c7l, 0.0000000000000000000e+00, 6.5535000000000000000e+04);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertUshort4Float4Ushort4(inV, out);
@@ -5036,9 +6070,13 @@
 
     private void verifyResultsConvertFloat4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -5052,24 +6090,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat4Ushort4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat4Ushort4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsCharUshort {
@@ -5078,7 +6124,7 @@
     }
 
     private void checkConvertChar2Ushort2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xd88c0b0ed8f1eeafl, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xd8f1eeafl, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertUshort2Char2Ushort2(inV, out);
@@ -5097,9 +6143,13 @@
 
     private void verifyResultsConvertChar2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -5113,28 +6163,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar2Ushort2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar2Ushort2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar3Ushort3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xd8d8d2962f4d7fdbl, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x2f4d7fdbl, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertUshort3Char3Ushort3(inV, out);
@@ -5153,9 +6211,13 @@
 
     private void verifyResultsConvertChar3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -5169,28 +6231,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar3Ushort3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar3Ushort3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar4Ushort4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xd9259a1d85a91107l, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x85a91107l, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertUshort4Char4Ushort4(inV, out);
@@ -5209,9 +6279,13 @@
 
     private void verifyResultsConvertChar4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -5225,24 +6299,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar4Ushort4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar4Ushort4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUcharUshort {
@@ -5251,7 +6333,7 @@
     }
 
     private void checkConvertUchar2Ushort2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x72b6c56063e3e68l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x63e3e68l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertUshort2Uchar2Ushort2(inV, out);
@@ -5270,9 +6352,13 @@
 
     private void verifyResultsConvertUchar2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -5286,28 +6372,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar2Ushort2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar2Ushort2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar3Ushort3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x77833dd5c99cf94l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x5c99cf94l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertUshort3Uchar3Ushort3(inV, out);
@@ -5326,9 +6420,13 @@
 
     private void verifyResultsConvertUchar3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -5342,28 +6440,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar3Ushort3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar3Ushort3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar4Ushort4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7c4fb64b2f560c0l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0xb2f560c0l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertUshort4Uchar4Ushort4(inV, out);
@@ -5382,9 +6488,13 @@
 
     private void verifyResultsConvertUchar4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -5398,24 +6508,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar4Ushort4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar4Ushort4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsShortUshort {
@@ -5424,7 +6542,7 @@
     }
 
     private void checkConvertShort2Ushort2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0xfe0d269c7264c053l, false, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x7264c053l, false, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertUshort2Short2Ushort2(inV, out);
@@ -5443,9 +6561,13 @@
 
     private void verifyResultsConvertShort2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -5459,28 +6581,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort2Ushort2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort2Ushort2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort3Ushort3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0xfe59ee23c8c0517fl, false, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0xc8c0517fl, false, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertUshort3Short3Ushort3(inV, out);
@@ -5499,9 +6629,13 @@
 
     private void verifyResultsConvertShort3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -5515,28 +6649,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort3Ushort3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort3Ushort3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort4Ushort4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xfea6b5ab1f1be2abl, false, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x1f1be2abl, false, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertUshort4Short4Ushort4(inV, out);
@@ -5555,9 +6697,13 @@
 
     private void verifyResultsConvertShort4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -5571,24 +6717,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort4Ushort4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort4Ushort4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUshortUshort {
@@ -5597,7 +6751,7 @@
     }
 
     private void checkConvertUshort2Ushort2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xd2d27d910e362466l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xe362466l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertUshort2Ushort2Ushort2(inV, out);
@@ -5616,9 +6770,13 @@
 
     private void verifyResultsConvertUshort2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -5632,28 +6790,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort2Ushort2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort2Ushort2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort3Ushort3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xd31f45186491b592l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x6491b592l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertUshort3Ushort3Ushort3(inV, out);
@@ -5672,9 +6838,13 @@
 
     private void verifyResultsConvertUshort3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -5688,28 +6858,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort3Ushort3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort3Ushort3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort4Ushort4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xd36c0c9fbaed46bel, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xbaed46bel, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertUshort4Ushort4Ushort4(inV, out);
@@ -5728,9 +6906,13 @@
 
     private void verifyResultsConvertUshort4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -5744,24 +6926,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort4Ushort4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort4Ushort4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsIntUshort {
@@ -5770,7 +6960,7 @@
     }
 
     private void checkConvertInt2Ushort2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x1c02a5e414378844l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x14378844l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertUshort2Int2Ushort2(inV, out);
@@ -5789,9 +6979,13 @@
 
     private void verifyResultsConvertInt2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -5805,28 +6999,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt2Ushort2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt2Ushort2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt3Ushort3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x1c4f6d6b6a931970l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x6a931970l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertUshort3Int3Ushort3(inV, out);
@@ -5845,9 +7047,13 @@
 
     private void verifyResultsConvertInt3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -5861,28 +7067,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt3Ushort3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt3Ushort3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt4Ushort4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x1c9c34f2c0eeaa9cl, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xc0eeaa9cl, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertUshort4Int4Ushort4(inV, out);
@@ -5901,9 +7115,13 @@
 
     private void verifyResultsConvertInt4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -5917,24 +7135,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt4Ushort4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt4Ushort4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUintUshort {
@@ -5943,7 +7169,7 @@
     }
 
     private void checkConvertUint2Ushort2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x40d0c5ebb00fa1efl, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xb00fa1efl, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertUshort2Uint2Ushort2(inV, out);
@@ -5962,9 +7188,13 @@
 
     private void verifyResultsConvertUint2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -5978,28 +7208,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint2Ushort2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint2Ushort2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint3Ushort3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x411d8d73066b331bl, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x66b331bl, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertUshort3Uint3Ushort3(inV, out);
@@ -6018,9 +7256,13 @@
 
     private void verifyResultsConvertUint3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -6034,28 +7276,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint3Ushort3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint3Ushort3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint4Ushort4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x416a54fa5cc6c447l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x5cc6c447l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertUshort4Uint4Ushort4(inV, out);
@@ -6074,9 +7324,13 @@
 
     private void verifyResultsConvertUint4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -6090,24 +7344,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint4Ushort4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint4Ushort4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatInt {
@@ -6116,7 +7378,7 @@
     }
 
     private void checkConvertFloat2Int2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8fb63fb7c069dd5dl, -2.1474835210000000000e+09, 2.1474835200000000000e+09);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc069dd5dl, -2.1474835210000000000e+09, 2.1474835200000000000e+09);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertInt2Float2Int2(inV, out);
@@ -6135,9 +7397,13 @@
 
     private void verifyResultsConvertFloat2Int2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -6151,28 +7417,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat2Int2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat2Int2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat3Int3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8fb63ff70a11ed93l, -2.1474835210000000000e+09, 2.1474835200000000000e+09);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xa11ed93l, -2.1474835210000000000e+09, 2.1474835200000000000e+09);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertInt3Float3Int3(inV, out);
@@ -6191,9 +7465,13 @@
 
     private void verifyResultsConvertFloat3Int3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -6207,28 +7485,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat3Int3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat3Int3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat4Int4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8fb6403653b9fdc9l, -2.1474835210000000000e+09, 2.1474835200000000000e+09);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x53b9fdc9l, -2.1474835210000000000e+09, 2.1474835200000000000e+09);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertInt4Float4Int4(inV, out);
@@ -6247,9 +7533,13 @@
 
     private void verifyResultsConvertFloat4Int4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -6263,24 +7553,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat4Int4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat4Int4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsCharInt {
@@ -6289,7 +7587,7 @@
     }
 
     private void checkConvertChar2Int2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x880244ac94c6831dl, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x94c6831dl, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertInt2Char2Int2(inV, out);
@@ -6308,9 +7606,13 @@
 
     private void verifyResultsConvertChar2Int2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -6324,28 +7626,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar2Int2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar2Int2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar3Int3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x880244ebde6e9353l, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xde6e9353l, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertInt3Char3Int3(inV, out);
@@ -6364,9 +7674,13 @@
 
     private void verifyResultsConvertChar3Int3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -6380,28 +7694,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar3Int3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar3Int3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar4Int4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x8802452b2816a389l, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x2816a389l, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertInt4Char4Int4(inV, out);
@@ -6420,9 +7742,13 @@
 
     private void verifyResultsConvertChar4Int4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -6436,24 +7762,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar4Int4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar4Int4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUcharInt {
@@ -6462,7 +7796,7 @@
     }
 
     private void checkConvertUchar2Int2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x97cffb96923aa720l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x923aa720l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertInt2Uchar2Int2(inV, out);
@@ -6481,9 +7815,13 @@
 
     private void verifyResultsConvertUchar2Int2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -6497,28 +7835,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar2Int2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar2Int2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar3Int3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x97cffbd5dbe2b756l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0xdbe2b756l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertInt3Uchar3Int3(inV, out);
@@ -6537,9 +7883,13 @@
 
     private void verifyResultsConvertUchar3Int3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -6553,28 +7903,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar3Int3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar3Int3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar4Int4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x97cffc15258ac78cl, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x258ac78cl, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertInt4Uchar4Int4(inV, out);
@@ -6593,9 +7951,13 @@
 
     private void verifyResultsConvertUchar4Int4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -6609,24 +7971,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar4Int4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar4Int4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsShortInt {
@@ -6635,7 +8005,7 @@
     }
 
     private void checkConvertShort2Int2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x85693203252a2d69l, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x252a2d69l, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertInt2Short2Int2(inV, out);
@@ -6654,9 +8024,13 @@
 
     private void verifyResultsConvertShort2Int2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -6670,28 +8044,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort2Int2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort2Int2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort3Int3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x856932426ed23d9fl, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x6ed23d9fl, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertInt3Short3Int3(inV, out);
@@ -6710,9 +8092,13 @@
 
     private void verifyResultsConvertShort3Int3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -6726,28 +8112,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort3Int3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort3Int3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort4Int4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x85693281b87a4dd5l, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xb87a4dd5l, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertInt4Short4Int4(inV, out);
@@ -6766,9 +8160,13 @@
 
     private void verifyResultsConvertShort4Int4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -6782,24 +8180,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort4Int4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort4Int4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUshortInt {
@@ -6808,7 +8214,7 @@
     }
 
     private void checkConvertUshort2Int2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x2cf6eb50b7ac39eal, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xb7ac39eal, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertInt2Ushort2Int2(inV, out);
@@ -6827,9 +8233,13 @@
 
     private void verifyResultsConvertUshort2Int2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -6843,28 +8253,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort2Int2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort2Int2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort3Int3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x2cf6eb9001544a20l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x1544a20l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertInt3Ushort3Int3(inV, out);
@@ -6883,9 +8301,13 @@
 
     private void verifyResultsConvertUshort3Int3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -6899,28 +8321,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort3Int3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort3Int3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort4Int4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x2cf6ebcf4afc5a56l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x4afc5a56l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertInt4Ushort4Int4(inV, out);
@@ -6939,9 +8369,13 @@
 
     private void verifyResultsConvertUshort4Int4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -6955,24 +8389,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort4Int4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort4Int4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsIntInt {
@@ -6981,7 +8423,7 @@
     }
 
     private void checkConvertInt2Int2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x501d84049a42354l, true, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x49a42354l, true, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertInt2Int2Int2(inV, out);
@@ -7000,9 +8442,13 @@
 
     private void verifyResultsConvertInt2Int2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -7016,28 +8462,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt2Int2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt2Int2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt3Int3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x501d87f934c338al, true, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x934c338al, true, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertInt3Int3Int3(inV, out);
@@ -7056,9 +8510,13 @@
 
     private void verifyResultsConvertInt3Int3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -7072,28 +8530,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt3Int3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt3Int3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt4Int4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x501d8bedcf443c0l, true, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xdcf443c0l, true, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertInt4Int4Int4(inV, out);
@@ -7112,9 +8578,13 @@
 
     private void verifyResultsConvertInt4Int4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -7128,24 +8598,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt4Int4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt4Int4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUintInt {
@@ -7154,7 +8632,7 @@
     }
 
     private void checkConvertUint2Int2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x70899b043daccaddl, false, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x3daccaddl, false, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertInt2Uint2Int2(inV, out);
@@ -7173,9 +8651,13 @@
 
     private void verifyResultsConvertUint2Int2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -7189,28 +8671,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint2Int2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint2Int2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint3Int3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x70899b438754db13l, false, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x8754db13l, false, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertInt3Uint3Int3(inV, out);
@@ -7229,9 +8719,13 @@
 
     private void verifyResultsConvertUint3Int3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -7245,28 +8739,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint3Int3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint3Int3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint4Int4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x70899b82d0fceb49l, false, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xd0fceb49l, false, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertInt4Uint4Int4(inV, out);
@@ -7285,9 +8787,13 @@
 
     private void verifyResultsConvertUint4Int4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -7301,24 +8807,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint4Int4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint4Int4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatUint {
@@ -7327,7 +8841,7 @@
     }
 
     private void checkConvertFloat2Uint2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x239cb6cd424dca22l, 0.0000000000000000000e+00, 4.2949670400000000000e+09);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x424dca22l, 0.0000000000000000000e+00, 4.2949670400000000000e+09);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertUint2Float2Uint2(inV, out);
@@ -7346,9 +8860,13 @@
 
     private void verifyResultsConvertFloat2Uint2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -7362,28 +8880,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat2Uint2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat2Uint2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat3Uint3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x239cc16ea1558f16l, 0.0000000000000000000e+00, 4.2949670400000000000e+09);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xa1558f16l, 0.0000000000000000000e+00, 4.2949670400000000000e+09);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertUint3Float3Uint3(inV, out);
@@ -7402,9 +8928,13 @@
 
     private void verifyResultsConvertFloat3Uint3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -7418,28 +8948,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat3Uint3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat3Uint3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat4Uint4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x239ccc10005d540al, 0.0000000000000000000e+00, 4.2949670400000000000e+09);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x5d540al, 0.0000000000000000000e+00, 4.2949670400000000000e+09);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertUint4Float4Uint4(inV, out);
@@ -7458,9 +8996,13 @@
 
     private void verifyResultsConvertFloat4Uint4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -7474,24 +9016,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat4Uint4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat4Uint4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsCharUint {
@@ -7500,7 +9050,7 @@
     }
 
     private void checkConvertChar2Uint2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xd8618beceddda162l, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xeddda162l, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertUint2Char2Uint2(inV, out);
@@ -7519,9 +9069,13 @@
 
     private void verifyResultsConvertChar2Uint2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -7535,28 +9089,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar2Uint2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar2Uint2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar3Uint3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xd861968e4ce56656l, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x4ce56656l, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertUint3Char3Uint3(inV, out);
@@ -7575,9 +9137,13 @@
 
     private void verifyResultsConvertChar3Uint3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -7591,28 +9157,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar3Uint3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar3Uint3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar4Uint4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xd861a12fabed2b4al, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xabed2b4al, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertUint4Char4Uint4(inV, out);
@@ -7631,9 +9205,13 @@
 
     private void verifyResultsConvertChar4Uint4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -7647,24 +9225,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar4Uint4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar4Uint4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUcharUint {
@@ -7673,7 +9259,7 @@
     }
 
     private void checkConvertUchar2Uint2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x7fef453a805fade3l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x805fade3l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertUint2Uchar2Uint2(inV, out);
@@ -7692,9 +9278,13 @@
 
     private void verifyResultsConvertUchar2Uint2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -7708,28 +9298,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar2Uint2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar2Uint2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar3Uint3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x7fef4fdbdf6772d7l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0xdf6772d7l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertUint3Uchar3Uint3(inV, out);
@@ -7748,9 +9346,13 @@
 
     private void verifyResultsConvertUchar3Uint3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -7764,28 +9366,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar3Uint3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar3Uint3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar4Uint4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7fef5a7d3e6f37cbl, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x3e6f37cbl, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertUint4Uchar4Uint4(inV, out);
@@ -7804,9 +9414,13 @@
 
     private void verifyResultsConvertUchar4Uint4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -7820,24 +9434,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar4Uint4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar4Uint4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsShortUint {
@@ -7846,7 +9468,7 @@
     }
 
     private void checkConvertShort2Uint2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x68ab69772e9b3c26l, false, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x2e9b3c26l, false, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertUint2Short2Uint2(inV, out);
@@ -7865,9 +9487,13 @@
 
     private void verifyResultsConvertShort2Uint2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -7881,28 +9507,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort2Uint2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort2Uint2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort3Uint3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x68ab74188da3011al, false, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x8da3011al, false, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertUint3Short3Uint3(inV, out);
@@ -7921,9 +9555,13 @@
 
     private void verifyResultsConvertShort3Uint3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -7937,28 +9575,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort3Uint3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort3Uint3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort4Uint4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x68ab7eb9ecaac60el, false, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xecaac60el, false, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertUint4Short4Uint4(inV, out);
@@ -7977,9 +9623,13 @@
 
     private void verifyResultsConvertShort4Uint4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -7993,24 +9643,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort4Uint4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort4Uint4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUshortUint {
@@ -8019,7 +9677,7 @@
     }
 
     private void checkConvertUshort2Uint2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x8d79897eca7355d1l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xca7355d1l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertUint2Ushort2Uint2(inV, out);
@@ -8038,9 +9696,13 @@
 
     private void verifyResultsConvertUshort2Uint2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -8054,28 +9716,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort2Uint2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort2Uint2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort3Uint3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x8d799420297b1ac5l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x297b1ac5l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertUint3Ushort3Uint3(inV, out);
@@ -8094,9 +9764,13 @@
 
     private void verifyResultsConvertUshort3Uint3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -8110,28 +9784,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort3Uint3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort3Uint3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort4Uint4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x8d799ec18882dfb9l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x8882dfb9l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertUint4Ushort4Uint4(inV, out);
@@ -8150,9 +9832,13 @@
 
     private void verifyResultsConvertUshort4Uint4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -8166,24 +9852,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort4Uint4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort4Uint4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsIntUint {
@@ -8192,7 +9886,7 @@
     }
 
     private void checkConvertInt2Uint2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xd74f55bc4f178a9fl, false, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x4f178a9fl, false, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertUint2Int2Uint2(inV, out);
@@ -8211,9 +9905,13 @@
 
     private void verifyResultsConvertInt2Uint2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -8227,28 +9925,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt2Uint2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt2Uint2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt3Uint3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xd74f605dae1f4f93l, false, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xae1f4f93l, false, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertUint3Int3Uint3(inV, out);
@@ -8267,9 +9973,13 @@
 
     private void verifyResultsConvertInt3Uint3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -8283,28 +9993,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt3Uint3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt3Uint3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt4Uint4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xd74f6aff0d271487l, false, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xd271487l, false, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertUint4Int4Uint4(inV, out);
@@ -8323,9 +10041,13 @@
 
     private void verifyResultsConvertInt4Uint4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -8339,24 +10061,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt4Uint4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt4Uint4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUintUint {
@@ -8365,7 +10095,7 @@
     }
 
     private void checkConvertUint2Uint2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xe71d0ca64c8baea2l, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x4c8baea2l, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertUint2Uint2Uint2(inV, out);
@@ -8384,9 +10114,13 @@
 
     private void verifyResultsConvertUint2Uint2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -8400,28 +10134,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint2Uint2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint2Uint2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint3Uint3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xe71d1747ab937396l, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xab937396l, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertUint3Uint3Uint3(inV, out);
@@ -8440,9 +10182,13 @@
 
     private void verifyResultsConvertUint3Uint3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -8456,28 +10202,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint3Uint3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint3Uint3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint4Uint4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xe71d21e90a9b388al, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xa9b388al, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertUint4Uint4Uint4(inV, out);
@@ -8496,9 +10250,13 @@
 
     private void verifyResultsConvertUint4Uint4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -8512,24 +10270,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint4Uint4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint4Uint4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsDoubleDouble {
@@ -8538,7 +10304,7 @@
     }
 
     private void checkConvertDouble2Double2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0x345b4a823902786el, -8.5390423905960001625e+307, 8.5390423905960001625e+307);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0x3902786el, -8.5390423905960001625e+307, 8.5390423905960001625e+307);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
             script.forEach_testConvertDouble2Double2Double2(inV, out);
@@ -8557,9 +10323,13 @@
 
     private void verifyResultsConvertDouble2Double2(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -8574,28 +10344,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble2Double2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble2Double2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble3Double3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0x34a812098f5e099al, -8.5390423905960001625e+307, 8.5390423905960001625e+307);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0x8f5e099al, -8.5390423905960001625e+307, 8.5390423905960001625e+307);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
             script.forEach_testConvertDouble3Double3Double3(inV, out);
@@ -8614,9 +10392,13 @@
 
     private void verifyResultsConvertDouble3Double3(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -8631,28 +10413,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble3Double3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble3Double3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble4Double4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0x34f4d990e5b99ac6l, -8.5390423905960001625e+307, 8.5390423905960001625e+307);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0xe5b99ac6l, -8.5390423905960001625e+307, 8.5390423905960001625e+307);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
             script.forEach_testConvertDouble4Double4Double4(inV, out);
@@ -8671,9 +10461,13 @@
 
     private void verifyResultsConvertDouble4Double4(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -8688,24 +10482,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble4Double4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble4Double4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsLongDouble {
@@ -8714,7 +10516,7 @@
     }
 
     private void checkConvertLong2Double2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x7b7807124c70299bl, true, 63);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x4c70299bl, true, 63);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
             script.forEach_testConvertDouble2Long2Double2(inV, out);
@@ -8733,9 +10535,13 @@
 
     private void verifyResultsConvertLong2Double2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -8750,28 +10556,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong2Double2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong2Double2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong3Double3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x7bc4ce99a2cbbac7l, true, 63);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xa2cbbac7l, true, 63);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
             script.forEach_testConvertDouble3Long3Double3(inV, out);
@@ -8790,9 +10604,13 @@
 
     private void verifyResultsConvertLong3Double3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -8807,28 +10625,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong3Double3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong3Double3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong4Double4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x7c119620f9274bf3l, true, 63);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xf9274bf3l, true, 63);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
             script.forEach_testConvertDouble4Long4Double4(inV, out);
@@ -8847,9 +10673,13 @@
 
     private void verifyResultsConvertLong4Double4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -8864,24 +10694,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong4Double4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong4Double4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUlongDouble {
@@ -8890,7 +10728,7 @@
     }
 
     private void checkConvertUlong2Double2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0xaa17685979bc7954l, false, 64);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x79bc7954l, false, 64);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
             script.forEach_testConvertDouble2Ulong2Double2(inV, out);
@@ -8909,9 +10747,13 @@
 
     private void verifyResultsConvertUlong2Double2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -8926,28 +10768,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong2Double2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong2Double2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong3Double3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0xaa642fe0d0180a80l, false, 64);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0xd0180a80l, false, 64);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
             script.forEach_testConvertDouble3Ulong3Double3(inV, out);
@@ -8966,9 +10816,13 @@
 
     private void verifyResultsConvertUlong3Double3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -8983,28 +10837,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong3Double3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong3Double3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong4Double4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0xaab0f76826739bacl, false, 64);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x26739bacl, false, 64);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
             script.forEach_testConvertDouble4Ulong4Double4(inV, out);
@@ -9023,9 +10885,13 @@
 
     private void verifyResultsConvertUlong4Double4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -9040,24 +10906,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong4Double4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong4Double4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsDoubleLong {
@@ -9066,7 +10940,7 @@
     }
 
     private void checkConvertDouble2Long2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0xcbf84dc0430cbe95l, -9.2233720368547747840e+18, 9.2233720368547747840e+18);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0x430cbe95l, -4.2949662730000000000e+09, 4.2949662720000000000e+09);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertLong2Double2Long2(inV, out);
@@ -9085,9 +10959,13 @@
 
     private void verifyResultsConvertDouble2Long2(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -9101,28 +10979,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble2Long2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble2Long2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble3Long3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0xcbf85861a2148389l, -9.2233720368547747840e+18, 9.2233720368547747840e+18);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0xa2148389l, -4.2949662730000000000e+09, 4.2949662720000000000e+09);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertLong3Double3Long3(inV, out);
@@ -9141,9 +11027,13 @@
 
     private void verifyResultsConvertDouble3Long3(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -9157,28 +11047,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble3Long3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble3Long3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble4Long4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0xcbf86303011c487dl, -9.2233720368547747840e+18, 9.2233720368547747840e+18);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0x11c487dl, -4.2949662730000000000e+09, 4.2949662720000000000e+09);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertLong4Double4Long4(inV, out);
@@ -9197,9 +11095,13 @@
 
     private void verifyResultsConvertDouble4Long4(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -9213,24 +11115,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble4Long4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble4Long4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsLongLong {
@@ -9239,7 +11149,7 @@
     }
 
     private void checkConvertLong2Long2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xb570c607c81d242al, true, 63);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xc81d242al, true, 63);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertLong2Long2Long2(inV, out);
@@ -9258,9 +11168,13 @@
 
     private void verifyResultsConvertLong2Long2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -9274,28 +11188,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong2Long2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong2Long2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong3Long3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xb570d0a92724e91el, true, 63);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x2724e91el, true, 63);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertLong3Long3Long3(inV, out);
@@ -9314,9 +11236,13 @@
 
     private void verifyResultsConvertLong3Long3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -9330,28 +11256,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong3Long3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong3Long3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong4Long4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xb570db4a862cae12l, true, 63);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x862cae12l, true, 63);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertLong4Long4Long4(inV, out);
@@ -9370,9 +11304,13 @@
 
     private void verifyResultsConvertLong4Long4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -9386,24 +11324,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong4Long4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong4Long4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUlongLong {
@@ -9412,7 +11358,7 @@
     }
 
     private void checkConvertUlong2Long2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x5cfe7f555a9f30abl, false, 63);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x5a9f30abl, false, 63);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertLong2Ulong2Long2(inV, out);
@@ -9431,9 +11377,13 @@
 
     private void verifyResultsConvertUlong2Long2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -9447,28 +11397,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong2Long2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong2Long2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong3Long3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x5cfe89f6b9a6f59fl, false, 63);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0xb9a6f59fl, false, 63);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertLong3Ulong3Long3(inV, out);
@@ -9487,9 +11445,13 @@
 
     private void verifyResultsConvertUlong3Long3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -9503,28 +11465,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong3Long3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong3Long3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong4Long4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x5cfe949818aeba93l, false, 63);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x18aeba93l, false, 63);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertLong4Ulong4Long4(inV, out);
@@ -9543,9 +11513,13 @@
 
     private void verifyResultsConvertUlong4Long4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -9559,24 +11533,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong4Long4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong4Long4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsDoubleUlong {
@@ -9585,7 +11567,7 @@
     }
 
     private void checkConvertDouble2Ulong2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0x42b56e3b7e12ff5el, 0.0000000000000000000e+00, 1.8446744073709549568e+19);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0x7e12ff5el, 0.0000000000000000000e+00, 4.2949652480000000000e+09);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertUlong2Double2Ulong2(inV, out);
@@ -9604,9 +11586,13 @@
 
     private void verifyResultsConvertDouble2Ulong2(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -9620,28 +11606,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble2Ulong2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble2Ulong2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble3Ulong3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0x42b73756742e203cl, 0.0000000000000000000e+00, 1.8446744073709549568e+19);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0x742e203cl, 0.0000000000000000000e+00, 4.2949652480000000000e+09);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertUlong3Double3Ulong3(inV, out);
@@ -9660,9 +11654,13 @@
 
     private void verifyResultsConvertDouble3Ulong3(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -9676,28 +11674,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble3Ulong3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble3Ulong3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble4Ulong4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0x42b900716a49411al, 0.0000000000000000000e+00, 1.8446744073709549568e+19);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0x6a49411al, 0.0000000000000000000e+00, 4.2949652480000000000e+09);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertUlong4Double4Ulong4(inV, out);
@@ -9716,9 +11722,13 @@
 
     private void verifyResultsConvertDouble4Ulong4(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -9732,24 +11742,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble4Ulong4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble4Ulong4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsLongUlong {
@@ -9758,7 +11776,7 @@
     }
 
     private void checkConvertLong2Ulong2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x79f1a23ed7d40f65l, false, 63);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xd7d40f65l, false, 63);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertUlong2Long2Ulong2(inV, out);
@@ -9777,9 +11795,13 @@
 
     private void verifyResultsConvertLong2Ulong2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -9793,28 +11815,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong2Ulong2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong2Ulong2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong3Ulong3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x79f36b59cdef3043l, false, 63);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xcdef3043l, false, 63);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertUlong3Long3Ulong3(inV, out);
@@ -9833,9 +11863,13 @@
 
     private void verifyResultsConvertLong3Ulong3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -9849,28 +11883,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong3Ulong3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong3Ulong3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong4Ulong4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x79f53474c40a5121l, false, 63);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xc40a5121l, false, 63);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertUlong4Long4Ulong4(inV, out);
@@ -9889,9 +11931,13 @@
 
     private void verifyResultsConvertLong4Ulong4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -9905,24 +11951,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong4Ulong4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong4Ulong4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUlongUlong {
@@ -9931,7 +11985,7 @@
     }
 
     private void checkConvertUlong2Ulong2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x9ebfc24673ac2910l, false, 64);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x73ac2910l, false, 64);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertUlong2Ulong2Ulong2(inV, out);
@@ -9950,9 +12004,13 @@
 
     private void verifyResultsConvertUlong2Ulong2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -9966,28 +12024,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong2Ulong2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong2Ulong2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong3Ulong3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x9ec18b6169c749eel, false, 64);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x69c749eel, false, 64);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertUlong3Ulong3Ulong3(inV, out);
@@ -10006,9 +12072,13 @@
 
     private void verifyResultsConvertUlong3Ulong3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -10022,28 +12092,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong3Ulong3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong3Ulong3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong4Ulong4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x9ec3547c5fe26accl, false, 64);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x5fe26accl, false, 64);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertUlong4Ulong4Ulong4(inV, out);
@@ -10062,9 +12140,13 @@
 
     private void verifyResultsConvertUlong4Ulong4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -10078,24 +12160,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong4Ulong4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong4Ulong4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsDoubleFloat {
@@ -10104,7 +12194,7 @@
     }
 
     private void checkConvertDouble2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0x42b4cec67d6d9a2dl, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0x7d6d9a2dl, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testConvertFloat2Double2Float2(inV, out);
@@ -10123,9 +12213,13 @@
 
     private void verifyResultsConvertDouble2Float2(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -10140,28 +12234,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0x42b697e17388bb0bl, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0x7388bb0bl, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testConvertFloat3Double3Float3(inV, out);
@@ -10180,9 +12282,13 @@
 
     private void verifyResultsConvertDouble3Float3(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -10197,28 +12303,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0x42b860fc69a3dbe9l, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0x69a3dbe9l, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testConvertFloat4Double4Float4(inV, out);
@@ -10237,9 +12351,13 @@
 
     private void verifyResultsConvertDouble4Float4(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -10254,24 +12372,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsLongFloat {
@@ -10280,7 +12406,7 @@
     }
 
     private void checkConvertLong2Float2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x79f102c9d72eaa34l, true, 63);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xd72eaa34l, true, 63);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testConvertFloat2Long2Float2(inV, out);
@@ -10299,9 +12425,13 @@
 
     private void verifyResultsConvertLong2Float2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -10316,28 +12446,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong3Float3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x79f2cbe4cd49cb12l, true, 63);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xcd49cb12l, true, 63);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testConvertFloat3Long3Float3(inV, out);
@@ -10356,9 +12494,13 @@
 
     private void verifyResultsConvertLong3Float3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -10373,28 +12515,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong4Float4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x79f494ffc364ebf0l, true, 63);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xc364ebf0l, true, 63);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testConvertFloat4Long4Float4(inV, out);
@@ -10413,9 +12563,13 @@
 
     private void verifyResultsConvertLong4Float4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -10430,24 +12584,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUlongFloat {
@@ -10456,7 +12618,7 @@
     }
 
     private void checkConvertUlong2Float2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x9ebf22d17306c3dfl, false, 64);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x7306c3dfl, false, 64);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testConvertFloat2Ulong2Float2(inV, out);
@@ -10475,9 +12637,13 @@
 
     private void verifyResultsConvertUlong2Float2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -10492,28 +12658,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong3Float3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x9ec0ebec6921e4bdl, false, 64);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x6921e4bdl, false, 64);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testConvertFloat3Ulong3Float3(inV, out);
@@ -10532,9 +12706,13 @@
 
     private void verifyResultsConvertUlong3Float3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -10549,28 +12727,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong4Float4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x9ec2b5075f3d059bl, false, 64);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x5f3d059bl, false, 64);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testConvertFloat4Ulong4Float4(inV, out);
@@ -10589,9 +12775,13 @@
 
     private void verifyResultsConvertUlong4Float4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -10606,24 +12796,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsDoubleChar {
@@ -10632,7 +12830,7 @@
     }
 
     private void checkConvertDouble2Char2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0xcbf84b7bef094a17l, -1.2800000000000000000e+02, 1.2700000000000000000e+02);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0xef094a17l, -1.2800000000000000000e+02, 1.2700000000000000000e+02);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertChar2Double2Char2(inV, out);
@@ -10651,9 +12849,13 @@
 
     private void verifyResultsConvertDouble2Char2(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -10667,28 +12869,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble2Char2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble2Char2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble3Char3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0xcbf8561d4e110f0bl, -1.2800000000000000000e+02, 1.2700000000000000000e+02);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0x4e110f0bl, -1.2800000000000000000e+02, 1.2700000000000000000e+02);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertChar3Double3Char3(inV, out);
@@ -10707,9 +12917,13 @@
 
     private void verifyResultsConvertDouble3Char3(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -10723,28 +12937,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble3Char3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble3Char3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble4Char4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0xcbf860bead18d3ffl, -1.2800000000000000000e+02, 1.2700000000000000000e+02);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0xad18d3ffl, -1.2800000000000000000e+02, 1.2700000000000000000e+02);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertChar4Double4Char4(inV, out);
@@ -10763,9 +12985,13 @@
 
     private void verifyResultsConvertDouble4Char4(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -10779,24 +13005,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble4Char4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble4Char4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsLongChar {
@@ -10805,7 +13039,7 @@
     }
 
     private void checkConvertLong2Char2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xb570c3c37419afacl, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x7419afacl, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertChar2Long2Char2(inV, out);
@@ -10824,9 +13058,13 @@
 
     private void verifyResultsConvertLong2Char2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -10840,28 +13078,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong2Char2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong2Char2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong3Char3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xb570ce64d32174a0l, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xd32174a0l, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertChar3Long3Char3(inV, out);
@@ -10880,9 +13126,13 @@
 
     private void verifyResultsConvertLong3Char3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -10896,28 +13146,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong3Char3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong3Char3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong4Char4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xb570d90632293994l, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x32293994l, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertChar4Long4Char4(inV, out);
@@ -10936,9 +13194,13 @@
 
     private void verifyResultsConvertLong4Char4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -10952,24 +13214,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong4Char4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong4Char4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUlongChar {
@@ -10978,7 +13248,7 @@
     }
 
     private void checkConvertUlong2Char2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x5cfe7d11069bbc2dl, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x69bbc2dl, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertChar2Ulong2Char2(inV, out);
@@ -10997,9 +13267,13 @@
 
     private void verifyResultsConvertUlong2Char2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -11013,28 +13287,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong2Char2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong2Char2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong3Char3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x5cfe87b265a38121l, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x65a38121l, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertChar3Ulong3Char3(inV, out);
@@ -11053,9 +13335,13 @@
 
     private void verifyResultsConvertUlong3Char3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -11069,28 +13355,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong3Char3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong3Char3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong4Char4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x5cfe9253c4ab4615l, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0xc4ab4615l, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertChar4Ulong4Char4(inV, out);
@@ -11109,9 +13403,13 @@
 
     private void verifyResultsConvertUlong4Char4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -11125,24 +13423,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong4Char4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong4Char4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsDoubleUchar {
@@ -11151,7 +13457,7 @@
     }
 
     private void checkConvertDouble2Uchar2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0x42b56bf72a0f8ae0l, 0.0000000000000000000e+00, 2.5500000000000000000e+02);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0x2a0f8ae0l, 0.0000000000000000000e+00, 2.5500000000000000000e+02);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertUchar2Double2Uchar2(inV, out);
@@ -11170,9 +13476,13 @@
 
     private void verifyResultsConvertDouble2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -11186,28 +13496,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble2Uchar2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble2Uchar2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble3Uchar3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0x42b73512202aabbel, 0.0000000000000000000e+00, 2.5500000000000000000e+02);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0x202aabbel, 0.0000000000000000000e+00, 2.5500000000000000000e+02);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertUchar3Double3Uchar3(inV, out);
@@ -11226,9 +13544,13 @@
 
     private void verifyResultsConvertDouble3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -11242,28 +13564,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble3Uchar3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble3Uchar3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble4Uchar4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0x42b8fe2d1645cc9cl, 0.0000000000000000000e+00, 2.5500000000000000000e+02);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0x1645cc9cl, 0.0000000000000000000e+00, 2.5500000000000000000e+02);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertUchar4Double4Uchar4(inV, out);
@@ -11282,9 +13612,13 @@
 
     private void verifyResultsConvertDouble4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -11298,24 +13632,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble4Uchar4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble4Uchar4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsLongUchar {
@@ -11324,7 +13666,7 @@
     }
 
     private void checkConvertLong2Uchar2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x79f19ffa83d09ae7l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x83d09ae7l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertUchar2Long2Uchar2(inV, out);
@@ -11343,9 +13685,13 @@
 
     private void verifyResultsConvertLong2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -11359,28 +13705,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong2Uchar2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong2Uchar2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong3Uchar3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x79f3691579ebbbc5l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x79ebbbc5l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertUchar3Long3Uchar3(inV, out);
@@ -11399,9 +13753,13 @@
 
     private void verifyResultsConvertLong3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -11415,28 +13773,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong3Uchar3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong3Uchar3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong4Uchar4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x79f532307006dca3l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x7006dca3l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertUchar4Long4Uchar4(inV, out);
@@ -11455,9 +13821,13 @@
 
     private void verifyResultsConvertLong4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -11471,24 +13841,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong4Uchar4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong4Uchar4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUlongUchar {
@@ -11497,7 +13875,7 @@
     }
 
     private void checkConvertUlong2Uchar2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x9ebfc0021fa8b492l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x1fa8b492l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
             script.forEach_testConvertUchar2Ulong2Uchar2(inV, out);
@@ -11516,9 +13894,13 @@
 
     private void verifyResultsConvertUlong2Uchar2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -11532,28 +13914,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong2Uchar2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong2Uchar2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong3Uchar3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x9ec1891d15c3d570l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x15c3d570l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
             script.forEach_testConvertUchar3Ulong3Uchar3(inV, out);
@@ -11572,9 +13962,13 @@
 
     private void verifyResultsConvertUlong3Uchar3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -11588,28 +13982,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong3Uchar3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong3Uchar3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong4Uchar4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x9ec352380bdef64el, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0xbdef64el, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
             script.forEach_testConvertUchar4Ulong4Uchar4(inV, out);
@@ -11628,9 +14030,13 @@
 
     private void verifyResultsConvertUlong4Uchar4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -11644,24 +14050,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong4Uchar4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong4Uchar4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsDoubleShort {
@@ -11670,7 +14084,7 @@
     }
 
     private void checkConvertDouble2Short2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0x42b557fbbf1d55f9l, -3.2768000000000000000e+04, 3.2767000000000000000e+04);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0xbf1d55f9l, -3.2768000000000000000e+04, 3.2767000000000000000e+04);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertShort2Double2Short2(inV, out);
@@ -11689,9 +14103,13 @@
 
     private void verifyResultsConvertDouble2Short2(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -11705,28 +14123,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble2Short2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble2Short2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble3Short3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0x42b72116b53876d7l, -3.2768000000000000000e+04, 3.2767000000000000000e+04);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0xb53876d7l, -3.2768000000000000000e+04, 3.2767000000000000000e+04);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertShort3Double3Short3(inV, out);
@@ -11745,9 +14171,13 @@
 
     private void verifyResultsConvertDouble3Short3(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -11761,28 +14191,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble3Short3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble3Short3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble4Short4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0x42b8ea31ab5397b5l, -3.2768000000000000000e+04, 3.2767000000000000000e+04);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0xab5397b5l, -3.2768000000000000000e+04, 3.2767000000000000000e+04);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertShort4Double4Short4(inV, out);
@@ -11801,9 +14239,13 @@
 
     private void verifyResultsConvertDouble4Short4(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -11817,24 +14259,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble4Short4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble4Short4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsLongShort {
@@ -11843,7 +14293,7 @@
     }
 
     private void checkConvertLong2Short2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x79f18bff18de6600l, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x18de6600l, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertShort2Long2Short2(inV, out);
@@ -11862,9 +14312,13 @@
 
     private void verifyResultsConvertLong2Short2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -11878,28 +14332,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong2Short2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong2Short2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong3Short3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x79f3551a0ef986del, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xef986del, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertShort3Long3Short3(inV, out);
@@ -11918,9 +14380,13 @@
 
     private void verifyResultsConvertLong3Short3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -11934,28 +14400,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong3Short3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong3Short3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong4Short4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x79f51e350514a7bcl, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x514a7bcl, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertShort4Long4Short4(inV, out);
@@ -11974,9 +14448,13 @@
 
     private void verifyResultsConvertLong4Short4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -11990,24 +14468,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong4Short4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong4Short4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUlongShort {
@@ -12016,7 +14502,7 @@
     }
 
     private void checkConvertUlong2Short2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x9ebfac06b4b67fabl, false, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0xb4b67fabl, false, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertShort2Ulong2Short2(inV, out);
@@ -12035,9 +14521,13 @@
 
     private void verifyResultsConvertUlong2Short2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -12051,28 +14541,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong2Short2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong2Short2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong3Short3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x9ec17521aad1a089l, false, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0xaad1a089l, false, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertShort3Ulong3Short3(inV, out);
@@ -12091,9 +14589,13 @@
 
     private void verifyResultsConvertUlong3Short3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -12107,28 +14609,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong3Short3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong3Short3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong4Short4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x9ec33e3ca0ecc167l, false, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0xa0ecc167l, false, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertShort4Ulong4Short4(inV, out);
@@ -12147,9 +14657,13 @@
 
     private void verifyResultsConvertUlong4Short4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -12163,24 +14677,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong4Short4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong4Short4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsDoubleUshort {
@@ -12189,7 +14711,7 @@
     }
 
     private void checkConvertDouble2Ushort2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0x3479ccaea92a37bcl, 0.0000000000000000000e+00, 6.5535000000000000000e+04);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0xa92a37bcl, 0.0000000000000000000e+00, 6.5535000000000000000e+04);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertUshort2Double2Ushort2(inV, out);
@@ -12208,9 +14730,13 @@
 
     private void verifyResultsConvertDouble2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -12224,28 +14750,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble2Ushort2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble2Ushort2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble3Ushort3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0x34c69435ff85c8e8l, 0.0000000000000000000e+00, 6.5535000000000000000e+04);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0xff85c8e8l, 0.0000000000000000000e+00, 6.5535000000000000000e+04);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertUshort3Double3Ushort3(inV, out);
@@ -12264,9 +14798,13 @@
 
     private void verifyResultsConvertDouble3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -12280,28 +14818,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble3Ushort3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble3Ushort3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble4Ushort4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0x35135bbd55e15a14l, 0.0000000000000000000e+00, 6.5535000000000000000e+04);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0x55e15a14l, 0.0000000000000000000e+00, 6.5535000000000000000e+04);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertUshort4Double4Ushort4(inV, out);
@@ -12320,9 +14866,13 @@
 
     private void verifyResultsConvertDouble4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -12336,24 +14886,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble4Ushort4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble4Ushort4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsLongUshort {
@@ -12362,7 +14920,7 @@
     }
 
     private void checkConvertLong2Ushort2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x7b96893ebc97e8e9l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xbc97e8e9l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertUshort2Long2Ushort2(inV, out);
@@ -12381,9 +14939,13 @@
 
     private void verifyResultsConvertLong2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -12397,28 +14959,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong2Ushort2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong2Ushort2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong3Ushort3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x7be350c612f37a15l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x12f37a15l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertUshort3Long3Ushort3(inV, out);
@@ -12437,9 +15007,13 @@
 
     private void verifyResultsConvertLong3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -12453,28 +15027,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong3Ushort3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong3Ushort3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong4Ushort4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x7c30184d694f0b41l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x694f0b41l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertUshort4Long4Ushort4(inV, out);
@@ -12493,9 +15075,13 @@
 
     private void verifyResultsConvertLong4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -12509,24 +15095,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong4Ushort4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong4Ushort4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUlongUshort {
@@ -12535,7 +15129,7 @@
     }
 
     private void checkConvertUlong2Ushort2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0xaa35ea85e9e438a2l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0xe9e438a2l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
             script.forEach_testConvertUshort2Ulong2Ushort2(inV, out);
@@ -12554,9 +15148,13 @@
 
     private void verifyResultsConvertUlong2Ushort2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -12570,28 +15168,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong2Ushort2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong2Ushort2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong3Ushort3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0xaa82b20d403fc9cel, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x403fc9cel, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
             script.forEach_testConvertUshort3Ulong3Ushort3(inV, out);
@@ -12610,9 +15216,13 @@
 
     private void verifyResultsConvertUlong3Ushort3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -12626,28 +15236,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong3Ushort3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong3Ushort3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong4Ushort4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0xaacf7994969b5afal, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x969b5afal, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
             script.forEach_testConvertUshort4Ulong4Ushort4(inV, out);
@@ -12666,9 +15284,13 @@
 
     private void verifyResultsConvertUlong4Ushort4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -12682,24 +15304,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong4Ushort4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong4Ushort4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsDoubleInt {
@@ -12708,7 +15338,7 @@
     }
 
     private void checkConvertDouble2Int2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0xa57cd81dcaf628fcl, -2.1474836480000000000e+09, 2.1474836470000000000e+09);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0xcaf628fcl, -2.1474836480000000000e+09, 2.1474836470000000000e+09);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertInt2Double2Int2(inV, out);
@@ -12727,9 +15357,13 @@
 
     private void verifyResultsConvertDouble2Int2(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -12743,28 +15377,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble2Int2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble2Int2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble3Int3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0xa57cd85d149e3932l, -2.1474836480000000000e+09, 2.1474836470000000000e+09);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0x149e3932l, -2.1474836480000000000e+09, 2.1474836470000000000e+09);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertInt3Double3Int3(inV, out);
@@ -12783,9 +15425,13 @@
 
     private void verifyResultsConvertDouble3Int3(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -12799,28 +15445,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble3Int3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble3Int3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble4Int4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0xa57cd89c5e464968l, -2.1474836480000000000e+09, 2.1474836470000000000e+09);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0x5e464968l, -2.1474836480000000000e+09, 2.1474836470000000000e+09);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertInt4Double4Int4(inV, out);
@@ -12839,9 +15493,13 @@
 
     private void verifyResultsConvertDouble4Int4(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -12855,24 +15513,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble4Int4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble4Int4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsLongInt {
@@ -12881,7 +15547,7 @@
     }
 
     private void checkConvertLong2Int2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xfe441c66e5deba3bl, true, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xe5deba3bl, true, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertInt2Long2Int2(inV, out);
@@ -12900,9 +15566,13 @@
 
     private void verifyResultsConvertLong2Int2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -12916,28 +15586,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong2Int2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong2Int2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong3Int3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xfe441ca62f86ca71l, true, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x2f86ca71l, true, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertInt3Long3Int3(inV, out);
@@ -12956,9 +15634,13 @@
 
     private void verifyResultsConvertLong3Int3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -12972,28 +15654,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong3Int3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong3Int3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong4Int4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xfe441ce5792edaa7l, true, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x792edaa7l, true, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertInt4Long4Int4(inV, out);
@@ -13012,9 +15702,13 @@
 
     private void verifyResultsConvertLong4Int4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -13028,24 +15722,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong4Int4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong4Int4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUlongInt {
@@ -13054,7 +15756,7 @@
     }
 
     private void checkConvertUlong2Int2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0xe11d350e352de3el, false, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0xe352de3el, false, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertInt2Ulong2Int2(inV, out);
@@ -13073,9 +15775,13 @@
 
     private void verifyResultsConvertUlong2Int2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -13089,28 +15795,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong2Int2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong2Int2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong3Int3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0xe11d3902cfaee74l, false, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x2cfaee74l, false, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertInt3Ulong3Int3(inV, out);
@@ -13129,9 +15843,13 @@
 
     private void verifyResultsConvertUlong3Int3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -13145,28 +15863,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong3Int3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong3Int3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong4Int4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0xe11d3cf76a2feaal, false, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x76a2feaal, false, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertInt4Ulong4Int4(inV, out);
@@ -13185,9 +15911,13 @@
 
     private void verifyResultsConvertUlong4Int4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -13201,24 +15931,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong4Int4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong4Int4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsDoubleUint {
@@ -13227,7 +15965,7 @@
     }
 
     private void checkConvertDouble2Uint2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0xcbf84ff107de7dd7l, 0.0000000000000000000e+00, 4.2949672950000000000e+09);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 2, 0x7de7dd7l, 0.0000000000000000000e+00, 4.2949672950000000000e+09);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertUint2Double2Uint2(inV, out);
@@ -13246,9 +15984,13 @@
 
     private void verifyResultsConvertDouble2Uint2(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -13262,28 +16004,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble2Uint2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble2Uint2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble3Uint3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0xcbf85a9266e642cbl, 0.0000000000000000000e+00, 4.2949672950000000000e+09);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 3, 0x66e642cbl, 0.0000000000000000000e+00, 4.2949672950000000000e+09);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertUint3Double3Uint3(inV, out);
@@ -13302,9 +16052,13 @@
 
     private void verifyResultsConvertDouble3Uint3(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -13318,28 +16072,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble3Uint3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble3Uint3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertDouble4Uint4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0xcbf86533c5ee07bfl, 0.0000000000000000000e+00, 4.2949672950000000000e+09);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_64, 4, 0xc5ee07bfl, 0.0000000000000000000e+00, 4.2949672950000000000e+09);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertUint4Double4Uint4(inV, out);
@@ -13358,9 +16120,13 @@
 
     private void verifyResultsConvertDouble4Uint4(Allocation inV, Allocation out, boolean relaxed) {
         double[] arrayInV = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (double) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -13374,24 +16140,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertDouble4Uint4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertDouble4Uint4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsLongUint {
@@ -13400,7 +16174,7 @@
     }
 
     private void checkConvertLong2Uint2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xb570c8388ceee36cl, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x8ceee36cl, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertUint2Long2Uint2(inV, out);
@@ -13419,9 +16193,13 @@
 
     private void verifyResultsConvertLong2Uint2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -13435,28 +16213,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong2Uint2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong2Uint2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong3Uint3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xb570d2d9ebf6a860l, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xebf6a860l, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertUint3Long3Uint3(inV, out);
@@ -13475,9 +16261,13 @@
 
     private void verifyResultsConvertLong3Uint3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -13491,28 +16281,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong3Uint3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong3Uint3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertLong4Uint4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xb570dd7b4afe6d54l, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x4afe6d54l, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertUint4Long4Uint4(inV, out);
@@ -13531,9 +16329,13 @@
 
     private void verifyResultsConvertLong4Uint4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -13547,24 +16349,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertLong4Uint4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertLong4Uint4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUlongUint {
@@ -13573,7 +16383,7 @@
     }
 
     private void checkConvertUlong2Uint2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x5cfe81861f70efedl, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x1f70efedl, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
             script.forEach_testConvertUint2Ulong2Uint2(inV, out);
@@ -13592,9 +16402,13 @@
 
     private void verifyResultsConvertUlong2Uint2(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -13608,28 +16422,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong2Uint2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong2Uint2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong3Uint3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x5cfe8c277e78b4e1l, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x7e78b4e1l, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
             script.forEach_testConvertUint3Ulong3Uint3(inV, out);
@@ -13648,9 +16470,13 @@
 
     private void verifyResultsConvertUlong3Uint3(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -13664,28 +16490,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong3Uint3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong3Uint3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUlong4Uint4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x5cfe96c8dd8079d5l, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0xdd8079d5l, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
             script.forEach_testConvertUint4Ulong4Uint4(inV, out);
@@ -13704,9 +16538,13 @@
 
     private void verifyResultsConvertUlong4Uint4(Allocation inV, Allocation out, boolean relaxed) {
         long[] arrayInV = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (long) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -13720,24 +16558,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUlong4Uint4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUlong4Uint4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatDouble {
@@ -13746,7 +16592,7 @@
     }
 
     private void checkConvertFloat2Double2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x36c6372446e08221l, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x46e08221l, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
             script.forEach_testConvertDouble2Float2Double2(inV, out);
@@ -13765,9 +16611,13 @@
 
     private void verifyResultsConvertFloat2Double2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -13782,28 +16632,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat2Double2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat2Double2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat3Double3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3712feab9d3c134dl, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x9d3c134dl, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
             script.forEach_testConvertDouble3Float3Double3(inV, out);
@@ -13822,9 +16680,13 @@
 
     private void verifyResultsConvertFloat3Double3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -13839,28 +16701,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat3Double3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat3Double3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat4Double4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x375fc632f397a479l, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf397a479l, -1.6163412428744576259e+38, 1.6163412428744576259e+38);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
             script.forEach_testConvertDouble4Float4Double4(inV, out);
@@ -13879,9 +16749,13 @@
 
     private void verifyResultsConvertFloat4Double4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -13896,24 +16770,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat4Double4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat4Double4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsCharDouble {
@@ -13922,7 +16804,7 @@
     }
 
     private void checkConvertChar2Double2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xd86d88e268ca2f61l, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x68ca2f61l, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
             script.forEach_testConvertDouble2Char2Double2(inV, out);
@@ -13941,9 +16823,13 @@
 
     private void verifyResultsConvertChar2Double2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -13958,28 +16844,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar2Double2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar2Double2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar3Double3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xd8ba5069bf25c08dl, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xbf25c08dl, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
             script.forEach_testConvertDouble3Char3Double3(inV, out);
@@ -13998,9 +16892,13 @@
 
     private void verifyResultsConvertChar3Double3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -14015,28 +16913,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar3Double3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar3Double3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar4Double4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xd90717f1158151b9l, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x158151b9l, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
             script.forEach_testConvertDouble4Char4Double4(inV, out);
@@ -14055,9 +16961,13 @@
 
     private void verifyResultsConvertChar4Double4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -14072,24 +16982,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar4Double4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar4Double4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUcharDouble {
@@ -14098,7 +17016,7 @@
     }
 
     private void checkConvertUchar2Double2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x70cea2996167f1al, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x96167f1al, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
             script.forEach_testConvertDouble2Uchar2Double2(inV, out);
@@ -14117,9 +17035,13 @@
 
     private void verifyResultsConvertUchar2Double2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -14134,28 +17056,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar2Double2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar2Double2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar3Double3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x759b1b0ec721046l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0xec721046l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
             script.forEach_testConvertDouble3Uchar3Double3(inV, out);
@@ -14174,9 +17104,13 @@
 
     private void verifyResultsConvertUchar3Double3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -14191,28 +17125,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar3Double3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar3Double3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar4Double4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7a6793842cda172l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x42cda172l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
             script.forEach_testConvertDouble4Uchar4Double4(inV, out);
@@ -14231,9 +17173,13 @@
 
     private void verifyResultsConvertUchar4Double4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -14248,24 +17194,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar4Double4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar4Double4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsShortDouble {
@@ -14274,7 +17228,7 @@
     }
 
     private void checkConvertShort2Double2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0xfdeea470023d0105l, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x23d0105l, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
             script.forEach_testConvertDouble2Short2Double2(inV, out);
@@ -14293,9 +17247,13 @@
 
     private void verifyResultsConvertShort2Double2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -14310,28 +17268,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort2Double2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort2Double2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort3Double3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0xfe3b6bf758989231l, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x58989231l, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
             script.forEach_testConvertDouble3Short3Double3(inV, out);
@@ -14350,9 +17316,13 @@
 
     private void verifyResultsConvertShort3Double3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -14367,28 +17337,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort3Double3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort3Double3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort4Double4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xfe88337eaef4235dl, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xaef4235dl, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
             script.forEach_testConvertDouble4Short4Double4(inV, out);
@@ -14407,9 +17385,13 @@
 
     private void verifyResultsConvertShort4Double4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -14424,24 +17406,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort4Double4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort4Double4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUshortDouble {
@@ -14450,7 +17440,7 @@
     }
 
     private void checkConvertUshort2Double2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xd2b3fb649e0e6518l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x9e0e6518l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
             script.forEach_testConvertDouble2Ushort2Double2(inV, out);
@@ -14469,9 +17459,13 @@
 
     private void verifyResultsConvertUshort2Double2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -14486,28 +17480,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort2Double2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort2Double2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort3Double3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xd300c2ebf469f644l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xf469f644l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
             script.forEach_testConvertDouble3Ushort3Double3(inV, out);
@@ -14526,9 +17528,13 @@
 
     private void verifyResultsConvertUshort3Double3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -14543,28 +17549,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort3Double3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort3Double3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort4Double4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xd34d8a734ac58770l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x4ac58770l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
             script.forEach_testConvertDouble4Ushort4Double4(inV, out);
@@ -14583,9 +17597,13 @@
 
     private void verifyResultsConvertUshort4Double4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -14600,24 +17618,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort4Double4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort4Double4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsIntDouble {
@@ -14626,7 +17652,7 @@
     }
 
     private void checkConvertInt2Double2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x1be423b7a40fc8f6l, true, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xa40fc8f6l, true, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
             script.forEach_testConvertDouble2Int2Double2(inV, out);
@@ -14645,9 +17671,13 @@
 
     private void verifyResultsConvertInt2Double2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -14662,28 +17692,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt2Double2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt2Double2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt3Double3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x1c30eb3efa6b5a22l, true, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xfa6b5a22l, true, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
             script.forEach_testConvertDouble3Int3Double3(inV, out);
@@ -14702,9 +17740,13 @@
 
     private void verifyResultsConvertInt3Double3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -14719,28 +17761,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt3Double3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt3Double3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt4Double4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x1c7db2c650c6eb4el, true, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x50c6eb4el, true, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
             script.forEach_testConvertDouble4Int4Double4(inV, out);
@@ -14759,9 +17809,13 @@
 
     private void verifyResultsConvertInt4Double4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -14776,24 +17830,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt4Double4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt4Double4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUintDouble {
@@ -14802,7 +17864,7 @@
     }
 
     private void checkConvertUint2Double2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x40b243bf3fe7e2a1l, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x3fe7e2a1l, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 2), INPUTSIZE);
             script.forEach_testConvertDouble2Uint2Double2(inV, out);
@@ -14821,9 +17883,13 @@
 
     private void verifyResultsConvertUint2Double2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -14838,28 +17904,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint2Double2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint2Double2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint3Double3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x40ff0b46964373cdl, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x964373cdl, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 3), INPUTSIZE);
             script.forEach_testConvertDouble3Uint3Double3(inV, out);
@@ -14878,9 +17952,13 @@
 
     private void verifyResultsConvertUint3Double3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -14895,28 +17973,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint3Double3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint3Double3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint4Double4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x414bd2cdec9f04f9l, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xec9f04f9l, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_64, 4), INPUTSIZE);
             script.forEach_testConvertDouble4Uint4Double4(inV, out);
@@ -14935,9 +18021,13 @@
 
     private void verifyResultsConvertUint4Double4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         double[] arrayOut = new double[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (double) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -14952,24 +18042,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint4Double4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint4Double4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatLong {
@@ -14978,7 +18076,7 @@
     }
 
     private void checkConvertFloat2Long2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x239cb49c7d7c0ae0l, -9.2233714870989619200e+18, 9.2233714870989619200e+18);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x7d7c0ae0l, -1.0000000000000000000e+00, 0.0000000000000000000e+00);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertLong2Float2Long2(inV, out);
@@ -14997,9 +18095,13 @@
 
     private void verifyResultsConvertFloat2Long2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -15013,28 +18115,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat2Long2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat2Long2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat3Long3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x239cbf3ddc83cfd4l, -9.2233714870989619200e+18, 9.2233714870989619200e+18);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdc83cfd4l, -1.0000000000000000000e+00, 0.0000000000000000000e+00);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertLong3Float3Long3(inV, out);
@@ -15053,9 +18163,13 @@
 
     private void verifyResultsConvertFloat3Long3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -15069,28 +18183,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat3Long3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat3Long3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat4Long4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x239cc9df3b8b94c8l, -9.2233714870989619200e+18, 9.2233714870989619200e+18);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3b8b94c8l, -1.0000000000000000000e+00, 0.0000000000000000000e+00);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertLong4Float4Long4(inV, out);
@@ -15109,9 +18231,13 @@
 
     private void verifyResultsConvertFloat4Long4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -15125,24 +18251,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat4Long4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat4Long4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsCharLong {
@@ -15151,7 +18285,7 @@
     }
 
     private void checkConvertChar2Long2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xd86189bc290be220l, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x290be220l, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertLong2Char2Long2(inV, out);
@@ -15170,9 +18304,13 @@
 
     private void verifyResultsConvertChar2Long2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -15186,28 +18324,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar2Long2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar2Long2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar3Long3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xd861945d8813a714l, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x8813a714l, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertLong3Char3Long3(inV, out);
@@ -15226,9 +18372,13 @@
 
     private void verifyResultsConvertChar3Long3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -15242,28 +18392,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar3Long3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar3Long3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar4Long4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xd8619efee71b6c08l, true, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xe71b6c08l, true, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertLong4Char4Long4(inV, out);
@@ -15282,9 +18440,13 @@
 
     private void verifyResultsConvertChar4Long4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -15298,24 +18460,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar4Long4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar4Long4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUcharLong {
@@ -15324,7 +18494,7 @@
     }
 
     private void checkConvertUchar2Long2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x7fef4309bb8deea1l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0xbb8deea1l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertLong2Uchar2Long2(inV, out);
@@ -15343,9 +18513,13 @@
 
     private void verifyResultsConvertUchar2Long2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -15359,28 +18533,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar2Long2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar2Long2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar3Long3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x7fef4dab1a95b395l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x1a95b395l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertLong3Uchar3Long3(inV, out);
@@ -15399,9 +18581,13 @@
 
     private void verifyResultsConvertUchar3Long3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -15415,28 +18601,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar3Long3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar3Long3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar4Long4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7fef584c799d7889l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x799d7889l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertLong4Uchar4Long4(inV, out);
@@ -15455,9 +18649,13 @@
 
     private void verifyResultsConvertUchar4Long4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -15471,24 +18669,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar4Long4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar4Long4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsShortLong {
@@ -15497,7 +18703,7 @@
     }
 
     private void checkConvertShort2Long2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x68ab674669c97ce4l, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x69c97ce4l, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertLong2Short2Long2(inV, out);
@@ -15516,9 +18722,13 @@
 
     private void verifyResultsConvertShort2Long2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -15532,28 +18742,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort2Long2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort2Long2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort3Long3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x68ab71e7c8d141d8l, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0xc8d141d8l, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertLong3Short3Long3(inV, out);
@@ -15572,9 +18790,13 @@
 
     private void verifyResultsConvertShort3Long3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -15588,28 +18810,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort3Long3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort3Long3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort4Long4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x68ab7c8927d906ccl, true, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x27d906ccl, true, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertLong4Short4Long4(inV, out);
@@ -15628,9 +18858,13 @@
 
     private void verifyResultsConvertShort4Long4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -15644,24 +18878,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort4Long4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort4Long4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUshortLong {
@@ -15670,7 +18912,7 @@
     }
 
     private void checkConvertUshort2Long2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x8d79874e05a1968fl, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x5a1968fl, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertLong2Ushort2Long2(inV, out);
@@ -15689,9 +18931,13 @@
 
     private void verifyResultsConvertUshort2Long2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -15705,28 +18951,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort2Long2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort2Long2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort3Long3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x8d7991ef64a95b83l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x64a95b83l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertLong3Ushort3Long3(inV, out);
@@ -15745,9 +18999,13 @@
 
     private void verifyResultsConvertUshort3Long3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -15761,28 +19019,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort3Long3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort3Long3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort4Long4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x8d799c90c3b12077l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xc3b12077l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertLong4Ushort4Long4(inV, out);
@@ -15801,9 +19067,13 @@
 
     private void verifyResultsConvertUshort4Long4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -15817,24 +19087,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort4Long4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort4Long4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsIntLong {
@@ -15843,7 +19121,7 @@
     }
 
     private void checkConvertInt2Long2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xd74f538b8a45cb5dl, true, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x8a45cb5dl, true, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertLong2Int2Long2(inV, out);
@@ -15862,9 +19140,13 @@
 
     private void verifyResultsConvertInt2Long2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -15878,28 +19160,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt2Long2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt2Long2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt3Long3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xd74f5e2ce94d9051l, true, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xe94d9051l, true, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertLong3Int3Long3(inV, out);
@@ -15918,9 +19208,13 @@
 
     private void verifyResultsConvertInt3Long3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -15934,28 +19228,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt3Long3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt3Long3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt4Long4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xd74f68ce48555545l, true, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x48555545l, true, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertLong4Int4Long4(inV, out);
@@ -15974,9 +19276,13 @@
 
     private void verifyResultsConvertInt4Long4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -15990,24 +19296,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt4Long4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt4Long4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUintLong {
@@ -16016,7 +19330,7 @@
     }
 
     private void checkConvertUint2Long2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xe71d0a7587b9ef60l, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x87b9ef60l, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertLong2Uint2Long2(inV, out);
@@ -16035,9 +19349,13 @@
 
     private void verifyResultsConvertUint2Long2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -16051,28 +19369,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint2Long2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint2Long2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint3Long3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xe71d1516e6c1b454l, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xe6c1b454l, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertLong3Uint3Long3(inV, out);
@@ -16091,9 +19417,13 @@
 
     private void verifyResultsConvertUint3Long3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -16107,28 +19437,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint3Long3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint3Long3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint4Long4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xe71d1fb845c97948l, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x45c97948l, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertLong4Uint4Long4(inV, out);
@@ -16147,9 +19485,13 @@
 
     private void verifyResultsConvertUint4Long4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -16163,24 +19505,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint4Long4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint4Long4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatUlong {
@@ -16189,7 +19539,7 @@
     }
 
     private void checkConvertFloat2Ulong2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xfb52b5394ec4cff7l, 0.0000000000000000000e+00, 1.8446742974197923840e+19);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4ec4cff7l, 0.0000000000000000000e+00, 0.0000000000000000000e+00);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertUlong2Float2Ulong2(inV, out);
@@ -16208,9 +19558,13 @@
 
     private void verifyResultsConvertFloat2Ulong2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -16224,28 +19578,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat2Ulong2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat2Ulong2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat3Ulong3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xfb547e5444dff0d5l, 0.0000000000000000000e+00, 1.8446742974197923840e+19);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x44dff0d5l, 0.0000000000000000000e+00, 0.0000000000000000000e+00);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertUlong3Float3Ulong3(inV, out);
@@ -16264,9 +19626,13 @@
 
     private void verifyResultsConvertFloat3Ulong3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -16280,28 +19646,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat3Ulong3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat3Ulong3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertFloat4Ulong4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xfb56476f3afb11b3l, 0.0000000000000000000e+00, 1.8446742974197923840e+19);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3afb11b3l, 0.0000000000000000000e+00, 0.0000000000000000000e+00);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertUlong4Float4Ulong4(inV, out);
@@ -16320,9 +19694,13 @@
 
     private void verifyResultsConvertFloat4Ulong4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -16336,24 +19714,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertFloat4Ulong4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertFloat4Ulong4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsCharUlong {
@@ -16362,7 +19748,7 @@
     }
 
     private void checkConvertChar2Ulong2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x5862818b1fedf7b7l, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x1fedf7b7l, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertUlong2Char2Ulong2(inV, out);
@@ -16381,9 +19767,13 @@
 
     private void verifyResultsConvertChar2Ulong2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -16397,28 +19787,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar2Ulong2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar2Ulong2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar3Ulong3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x58644aa616091895l, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x16091895l, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertUlong3Char3Ulong3(inV, out);
@@ -16437,9 +19835,13 @@
 
     private void verifyResultsConvertChar3Ulong3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -16453,28 +19855,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar3Ulong3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar3Ulong3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertChar4Ulong4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x586613c10c243973l, false, 7);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xc243973l, false, 7);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertUlong4Char4Ulong4(inV, out);
@@ -16493,9 +19903,13 @@
 
     private void verifyResultsConvertChar4Ulong4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -16509,24 +19923,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertChar4Ulong4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertChar4Ulong4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUcharUlong {
@@ -16535,7 +19957,7 @@
     }
 
     private void checkConvertUchar2Ulong2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x7d30a192bbc61162l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0xbbc61162l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertUlong2Uchar2Ulong2(inV, out);
@@ -16554,9 +19976,13 @@
 
     private void verifyResultsConvertUchar2Ulong2(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -16570,28 +19996,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar2Ulong2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar2Ulong2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar3Ulong3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x7d326aadb1e13240l, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0xb1e13240l, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertUlong3Uchar3Ulong3(inV, out);
@@ -16610,9 +20044,13 @@
 
     private void verifyResultsConvertUchar3Ulong3(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -16626,28 +20064,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar3Ulong3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar3Ulong3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUchar4Ulong4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7d3433c8a7fc531el, false, 8);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0xa7fc531el, false, 8);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertUlong4Uchar4Ulong4(inV, out);
@@ -16666,9 +20112,13 @@
 
     private void verifyResultsConvertUchar4Ulong4(Allocation inV, Allocation out, boolean relaxed) {
         byte[] arrayInV = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (byte) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -16682,24 +20132,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUchar4Ulong4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUchar4Ulong4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsShortUlong {
@@ -16708,7 +20166,7 @@
     }
 
     private void checkConvertShort2Ulong2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x94cab7c3ffc6f6a3l, false, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 2, 0xffc6f6a3l, false, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertUlong2Short2Ulong2(inV, out);
@@ -16727,9 +20185,13 @@
 
     private void verifyResultsConvertShort2Ulong2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -16743,28 +20205,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort2Ulong2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort2Ulong2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort3Ulong3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x94cc80def5e21781l, false, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 3, 0xf5e21781l, false, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertUlong3Short3Ulong3(inV, out);
@@ -16783,9 +20253,13 @@
 
     private void verifyResultsConvertShort3Ulong3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -16799,28 +20273,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort3Ulong3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort3Ulong3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertShort4Ulong4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x94ce49f9ebfd385fl, false, 15);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xebfd385fl, false, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertUlong4Short4Ulong4(inV, out);
@@ -16839,9 +20321,13 @@
 
     private void verifyResultsConvertShort4Ulong4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -16855,24 +20341,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertShort4Ulong4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertShort4Ulong4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUshortUlong {
@@ -16881,7 +20375,7 @@
     }
 
     private void checkConvertUshort2Ulong2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xc36a190b2d13465cl, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x2d13465cl, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertUlong2Ushort2Ulong2(inV, out);
@@ -16900,9 +20394,13 @@
 
     private void verifyResultsConvertUshort2Ulong2(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -16916,28 +20414,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort2Ulong2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort2Ulong2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort3Ulong3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xc36be226232e673al, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x232e673al, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertUlong3Ushort3Ulong3(inV, out);
@@ -16956,9 +20462,13 @@
 
     private void verifyResultsConvertUshort3Ulong3(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -16972,28 +20482,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort3Ulong3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort3Ulong3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUshort4Ulong4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xc36dab4119498818l, false, 16);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x19498818l, false, 16);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertUlong4Ushort4Ulong4(inV, out);
@@ -17012,9 +20530,13 @@
 
     private void verifyResultsConvertUshort4Ulong4(Allocation inV, Allocation out, boolean relaxed) {
         short[] arrayInV = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (short) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -17028,24 +20550,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUshort4Ulong4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUshort4Ulong4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsIntUlong {
@@ -17054,7 +20584,7 @@
     }
 
     private void checkConvertInt2Ulong2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x2a53676074a824f6l, false, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x74a824f6l, false, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertUlong2Int2Ulong2(inV, out);
@@ -17073,9 +20603,13 @@
 
     private void verifyResultsConvertInt2Ulong2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -17089,28 +20623,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt2Ulong2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt2Ulong2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt3Ulong3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x2a55307b6ac345d4l, false, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x6ac345d4l, false, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertUlong3Int3Ulong3(inV, out);
@@ -17129,9 +20671,13 @@
 
     private void verifyResultsConvertInt3Ulong3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -17145,28 +20691,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt3Ulong3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt3Ulong3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertInt4Ulong4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x2a56f99660de66b2l, false, 31);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x60de66b2l, false, 31);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertUlong4Int4Ulong4(inV, out);
@@ -17185,9 +20739,13 @@
 
     private void verifyResultsConvertInt4Ulong4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -17201,24 +20759,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertInt4Ulong4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertInt4Ulong4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUintUlong {
@@ -17227,7 +20793,7 @@
     }
 
     private void checkConvertUint2Ulong2() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xd1e120ae072a3177l, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x72a3177l, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
             script.forEach_testConvertUlong2Uint2Ulong2(inV, out);
@@ -17246,9 +20812,13 @@
 
     private void verifyResultsConvertUint2Ulong2(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -17262,28 +20832,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint2Ulong2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint2Ulong2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint3Ulong3() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xd1e2e9c8fd455255l, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xfd455255l, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
             script.forEach_testConvertUlong3Uint3Ulong3(inV, out);
@@ -17302,9 +20880,13 @@
 
     private void verifyResultsConvertUint3Ulong3(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -17318,28 +20900,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint3Ulong3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint3Ulong3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkConvertUint4Ulong4() {
-        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xd1e4b2e3f3607333l, false, 32);
+        Allocation inV = createRandomIntegerAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xf3607333l, false, 32);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
             script.forEach_testConvertUlong4Uint4Ulong4(inV, out);
@@ -17358,9 +20948,13 @@
 
     private void verifyResultsConvertUint4Ulong4(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -17374,24 +20968,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkConvertUint4Ulong4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkConvertUint4Ulong4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testConvert() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCopysign.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCopysign.java
index 739b280e..24b71ec 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCopysign.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCopysign.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestCopysign extends RSBaseCompute {
 
     private ScriptC_TestCopysign script;
@@ -41,8 +43,8 @@
     }
 
     private void checkCopysignFloatFloatFloat() {
-        Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4218ae4ccf086614l, false);
-        Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd95dacad9d8d3ef5l, false);
+        Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xcf086614l, false);
+        Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9d8d3ef5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInSignValue(inSignValue);
@@ -63,11 +65,16 @@
 
     private void verifyResultsCopysignFloatFloatFloat(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed) {
         float[] arrayInMagnitudeValue = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInMagnitudeValue, (float) 42);
         inMagnitudeValue.copyTo(arrayInMagnitudeValue);
         float[] arrayInSignValue = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInSignValue, (float) 42);
         inSignValue.copyTo(arrayInSignValue);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMagnitudeValue: ");
-                    appendVariableToMessage(message, args.inMagnitudeValue);
-                    message.append("\n");
-                    message.append("Input inSignValue: ");
-                    appendVariableToMessage(message, args.inSignValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inMagnitudeValue: ");
+                        appendVariableToMessage(message, args.inMagnitudeValue);
+                        message.append("\n");
+                        message.append("Input inSignValue: ");
+                        appendVariableToMessage(message, args.inSignValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCopysignFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCopysignFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkCopysignFloat2Float2Float2() {
-        Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8efe093722e9f786l, false);
-        Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb33b4a8420cec72bl, false);
+        Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x22e9f786l, false);
+        Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x20cec72bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInSignValue(inSignValue);
@@ -129,11 +144,16 @@
 
     private void verifyResultsCopysignFloat2Float2Float2(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed) {
         float[] arrayInMagnitudeValue = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInMagnitudeValue, (float) 42);
         inMagnitudeValue.copyTo(arrayInMagnitudeValue);
         float[] arrayInSignValue = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInSignValue, (float) 42);
         inSignValue.copyTo(arrayInSignValue);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMagnitudeValue: ");
-                    appendVariableToMessage(message, args.inMagnitudeValue);
-                    message.append("\n");
-                    message.append("Input inSignValue: ");
-                    appendVariableToMessage(message, args.inSignValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inMagnitudeValue: ");
+                        appendVariableToMessage(message, args.inMagnitudeValue);
+                        message.append("\n");
+                        message.append("Input inSignValue: ");
+                        appendVariableToMessage(message, args.inSignValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCopysignFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCopysignFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkCopysignFloat3Float3Float3() {
-        Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x9a9db55e1b468741l, false);
-        Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8ec9f3bdc39ab32cl, false);
+        Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1b468741l, false);
+        Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc39ab32cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInSignValue(inSignValue);
@@ -195,11 +223,16 @@
 
     private void verifyResultsCopysignFloat3Float3Float3(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed) {
         float[] arrayInMagnitudeValue = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInMagnitudeValue, (float) 42);
         inMagnitudeValue.copyTo(arrayInMagnitudeValue);
         float[] arrayInSignValue = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInSignValue, (float) 42);
         inSignValue.copyTo(arrayInSignValue);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMagnitudeValue: ");
-                    appendVariableToMessage(message, args.inMagnitudeValue);
-                    message.append("\n");
-                    message.append("Input inSignValue: ");
-                    appendVariableToMessage(message, args.inSignValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inMagnitudeValue: ");
+                        appendVariableToMessage(message, args.inMagnitudeValue);
+                        message.append("\n");
+                        message.append("Input inSignValue: ");
+                        appendVariableToMessage(message, args.inSignValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCopysignFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCopysignFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkCopysignFloat4Float4Float4() {
-        Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xa63d618513a316fcl, false);
-        Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6a589cf766669f2dl, false);
+        Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x13a316fcl, false);
+        Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x66669f2dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInSignValue(inSignValue);
@@ -261,11 +302,16 @@
 
     private void verifyResultsCopysignFloat4Float4Float4(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed) {
         float[] arrayInMagnitudeValue = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInMagnitudeValue, (float) 42);
         inMagnitudeValue.copyTo(arrayInMagnitudeValue);
         float[] arrayInSignValue = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInSignValue, (float) 42);
         inSignValue.copyTo(arrayInSignValue);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,27 +327,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMagnitudeValue: ");
-                    appendVariableToMessage(message, args.inMagnitudeValue);
-                    message.append("\n");
-                    message.append("Input inSignValue: ");
-                    appendVariableToMessage(message, args.inSignValue);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inMagnitudeValue: ");
+                        appendVariableToMessage(message, args.inMagnitudeValue);
+                        message.append("\n");
+                        message.append("Input inSignValue: ");
+                        appendVariableToMessage(message, args.inSignValue);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCopysignFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCopysignFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testCopysign() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCos.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCos.java
index 4a184e2..9c321da 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCos.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestCos extends RSBaseCompute {
 
     private ScriptC_TestCos script;
@@ -40,7 +42,7 @@
     }
 
     private void checkCosFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe70ae86bb80fef6l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xbb80fef6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testCosFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsCosFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCosFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCosFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkCosFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4bb740670b2bbfaal, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb2bbfaal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testCosFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsCosFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCosFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCosFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkCosFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x4bb909820146e088l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x146e088l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testCosFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsCosFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCosFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCosFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkCosFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4bbad29cf7620166l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf7620166l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testCosFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsCosFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCosFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCosFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testCos() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCosh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCosh.java
index c2ea5af..f089c5f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCosh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCosh.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestCosh extends RSBaseCompute {
 
     private ScriptC_TestCosh script;
@@ -40,7 +42,7 @@
     }
 
     private void checkCoshFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xfb54622d108cfb40l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x108cfb40l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testCoshFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsCoshFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCoshFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCoshFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkCoshFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4453ccc34ebcf224l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4ebcf224l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testCoshFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsCoshFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCoshFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCoshFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkCoshFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x445595de44d81302l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x44d81302l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testCoshFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsCoshFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCoshFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCoshFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkCoshFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x44575ef93af333e0l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3af333e0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testCoshFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsCoshFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCoshFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCoshFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testCosh() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCospi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCospi.java
index 546f69d..11325c5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCospi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCospi.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestCospi extends RSBaseCompute {
 
     private ScriptC_TestCospi script;
@@ -40,7 +42,7 @@
     }
 
     private void checkCospiFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x95c59d24cc7595d1l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xcc7595d1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testCospiFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsCospiFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCospiFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCospiFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkCospiFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc026b40f81c1536dl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x81c1536dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testCospiFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsCospiFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCospiFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCospiFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkCospiFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc0287d2a77dc744bl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x77dc744bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testCospiFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsCospiFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCospiFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCospiFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkCospiFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc02a46456df79529l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6df79529l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testCospiFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsCospiFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkCospiFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkCospiFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testCospi() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCross.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCross.java
index e1a86d6..61d0021 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCross.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestCross.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestCross extends RSBaseCompute {
 
     private ScriptC_TestCross script;
@@ -41,8 +43,8 @@
     }
 
     private void checkCrossFloat3Float3Float3() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3505ebf7382f1ad4l, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe9d27bf3de024b21l, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x382f1ad4l, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xde024b21l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -63,11 +65,16 @@
 
     private void verifyResultsCrossFloat3Float3Float3(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloatN args = new ArgumentsFloatNFloatNFloatN();
             // Create the appropriate sized arrays in args
@@ -92,37 +99,43 @@
                 }
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inLeftVector: ");
-                    appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
-                    message.append("\n");
-                }
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inRightVector: ");
-                    appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
-                    message.append("\n");
-                }
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out[j]);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out[j].couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Input inLeftVector: ");
+                        appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
+                        message.append("\n");
                     }
-                    message.append("\n");
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Input inRightVector: ");
+                        appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out[j]);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out[j].couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                    }
+                    message.append("Errors at");
                 }
-                assertTrue("Incorrect output for checkCrossFloat3Float3Float3" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkCrossFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkCrossFloat4Float4Float4() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x15fc58a5906fbeffl, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb336bd3cb0ddde5al, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x906fbeffl, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb0ddde5al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -143,11 +156,16 @@
 
     private void verifyResultsCrossFloat4Float4Float4(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloatN args = new ArgumentsFloatNFloatNFloatN();
             // Create the appropriate sized arrays in args
@@ -172,32 +190,38 @@
                 }
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inLeftVector: ");
-                    appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
-                    message.append("\n");
-                }
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inRightVector: ");
-                    appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
-                    message.append("\n");
-                }
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out[j]);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out[j].couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Input inLeftVector: ");
+                        appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
+                        message.append("\n");
                     }
-                    message.append("\n");
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Input inRightVector: ");
+                        appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out[j]);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out[j].couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                    }
+                    message.append("Errors at");
                 }
-                assertTrue("Incorrect output for checkCrossFloat4Float4Float4" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkCrossFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testCross() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDegrees.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDegrees.java
index 7957795..03eee53 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDegrees.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDegrees.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestDegrees extends RSBaseCompute {
 
     private ScriptC_TestDegrees script;
@@ -40,7 +42,7 @@
     }
 
     private void checkDegreesFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x606ed077c5dde30al, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc5dde30al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testDegreesFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsDegreesFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkDegreesFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkDegreesFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkDegreesFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x803a665ae417141el, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xe417141el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testDegreesFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsDegreesFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkDegreesFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkDegreesFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkDegreesFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x803c2f75da3234fcl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xda3234fcl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testDegreesFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsDegreesFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkDegreesFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkDegreesFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkDegreesFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x803df890d04d55dal, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd04d55dal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testDegreesFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsDegreesFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkDegreesFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkDegreesFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testDegrees() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDistance.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDistance.java
index 5d8dde9..6051525 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDistance.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDistance.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestDistance extends RSBaseCompute {
 
     private ScriptC_TestDistance script;
@@ -41,8 +43,8 @@
     }
 
     private void checkDistanceFloatFloatFloat() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa481527082ced52al, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa38cb25366d69793l, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x82ced52al, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x66d69793l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -63,11 +65,16 @@
 
     private void verifyResultsDistanceFloatFloatFloat(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
             // Create the appropriate sized arrays in args
@@ -83,26 +90,32 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                message.append("Input inLeftVector: ");
-                appendVariableToMessage(message, arrayInLeftVector[i]);
-                message.append("\n");
-                message.append("Input inRightVector: ");
-                appendVariableToMessage(message, arrayInRightVector[i]);
-                message.append("\n");
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    message.append("Input inLeftVector: ");
+                    appendVariableToMessage(message, arrayInLeftVector[i]);
+                    message.append("\n");
+                    message.append("Input inRightVector: ");
+                    appendVariableToMessage(message, arrayInRightVector[i]);
+                    message.append("\n");
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
+                    message.append("\n");
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
+                    message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("\n");
-                assertTrue("Incorrect output for checkDistanceFloatFloatFloat" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkDistanceFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatNFloatNFloat {
@@ -112,8 +125,8 @@
     }
 
     private void checkDistanceFloat2Float2Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xbf71d23b554dab2el, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x29f22964c2248a3fl, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x554dab2el, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc2248a3fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -134,11 +147,16 @@
 
     private void verifyResultsDistanceFloat2Float2Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -160,35 +178,41 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inLeftVector: ");
-                    appendVariableToMessage(message, arrayInLeftVector[i * 2 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 2 ; j++) {
+                        message.append("Input inLeftVector: ");
+                        appendVariableToMessage(message, arrayInLeftVector[i * 2 + j]);
+                        message.append("\n");
+                    }
+                    for (int j = 0; j < 2 ; j++) {
+                        message.append("Input inRightVector: ");
+                        appendVariableToMessage(message, arrayInRightVector[i * 2 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
-                }
-                for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inRightVector: ");
-                    appendVariableToMessage(message, arrayInRightVector[i * 2 + j]);
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
                     message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkDistanceFloat2Float2Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkDistanceFloat2Float2Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkDistanceFloat3Float3Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8e1af7b976ec5f7cl, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe05b759467ccd359l, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x76ec5f7cl, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x67ccd359l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -209,11 +233,16 @@
 
     private void verifyResultsDistanceFloat3Float3Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -235,35 +264,41 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inLeftVector: ");
-                    appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Input inLeftVector: ");
+                        appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Input inRightVector: ");
+                        appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
-                }
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inRightVector: ");
-                    appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
                     message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkDistanceFloat3Float3Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkDistanceFloat3Float3Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkDistanceFloat4Float4Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x5cc41d37988b13cal, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x96c4c1c40d751c73l, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x988b13cal, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd751c73l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -284,11 +319,16 @@
 
     private void verifyResultsDistanceFloat4Float4Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -310,30 +350,36 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inLeftVector: ");
-                    appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Input inLeftVector: ");
+                        appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Input inRightVector: ");
+                        appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
-                }
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inRightVector: ");
-                    appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
                     message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkDistanceFloat4Float4Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkDistanceFloat4Float4Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testDistance() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDot.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDot.java
index ff0cd13..3898003 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDot.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestDot.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestDot extends RSBaseCompute {
 
     private ScriptC_TestDot script;
@@ -41,8 +43,8 @@
     }
 
     private void checkDotFloatFloatFloat() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x38fe5ebdf7ff2d3el, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x948dc35615f562efl, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf7ff2d3el, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x15f562efl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -63,11 +65,16 @@
 
     private void verifyResultsDotFloatFloatFloat(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
             // Create the appropriate sized arrays in args
@@ -83,26 +90,32 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                message.append("Input inLeftVector: ");
-                appendVariableToMessage(message, arrayInLeftVector[i]);
-                message.append("\n");
-                message.append("Input inRightVector: ");
-                appendVariableToMessage(message, arrayInRightVector[i]);
-                message.append("\n");
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    message.append("Input inLeftVector: ");
+                    appendVariableToMessage(message, arrayInLeftVector[i]);
+                    message.append("\n");
+                    message.append("Input inRightVector: ");
+                    appendVariableToMessage(message, arrayInRightVector[i]);
+                    message.append("\n");
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
+                    message.append("\n");
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
+                    message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("\n");
-                assertTrue("Incorrect output for checkDotFloatFloatFloat" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkDotFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatNFloatNFloat {
@@ -112,8 +125,8 @@
     }
 
     private void checkDotFloat2Float2Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3a9fadaebf79d3a2l, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdaa605c7978f55bbl, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xbf79d3a2l, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x978f55bbl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -134,11 +147,16 @@
 
     private void verifyResultsDotFloat2Float2Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -160,35 +178,41 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inLeftVector: ");
-                    appendVariableToMessage(message, arrayInLeftVector[i * 2 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 2 ; j++) {
+                        message.append("Input inLeftVector: ");
+                        appendVariableToMessage(message, arrayInLeftVector[i * 2 + j]);
+                        message.append("\n");
+                    }
+                    for (int j = 0; j < 2 ; j++) {
+                        message.append("Input inRightVector: ");
+                        appendVariableToMessage(message, arrayInRightVector[i * 2 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
-                }
-                for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inRightVector: ");
-                    appendVariableToMessage(message, arrayInRightVector[i * 2 + j]);
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
                     message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkDotFloat2Float2Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkDotFloat2Float2Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkDotFloat3Float3Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x948d32ce11887f0l, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x910f51f73d379ed5l, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe11887f0l, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3d379ed5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -209,11 +233,16 @@
 
     private void verifyResultsDotFloat3Float3Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -235,35 +264,41 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inLeftVector: ");
-                    appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Input inLeftVector: ");
+                        appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Input inRightVector: ");
+                        appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
-                }
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inRightVector: ");
-                    appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
                     message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkDotFloat3Float3Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkDotFloat3Float3Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkDotFloat4Float4Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd7f1f8ab02b73c3el, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x47789e26e2dfe7efl, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x2b73c3el, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe2dfe7efl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -284,11 +319,16 @@
 
     private void verifyResultsDotFloat4Float4Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -310,30 +350,36 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inLeftVector: ");
-                    appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Input inLeftVector: ");
+                        appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Input inRightVector: ");
+                        appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
-                }
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inRightVector: ");
-                    appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
                     message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkDotFloat4Float4Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkDotFloat4Float4Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testDot() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestErf.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestErf.java
index 5313413..bc3a073 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestErf.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestErf.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestErf extends RSBaseCompute {
 
     private ScriptC_TestErf script;
@@ -40,7 +42,7 @@
     }
 
     private void checkErfFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xccfbfd30a3951fb8l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa3951fb8l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testErfFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsErfFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkErfFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkErfFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkErfFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x87e26994448c58dcl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x448c58dcl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testErfFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsErfFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkErfFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkErfFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkErfFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x87e432af3aa779bal, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3aa779bal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testErfFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsErfFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkErfFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkErfFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkErfFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x87e5fbca30c29a98l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x30c29a98l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testErfFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsErfFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkErfFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkErfFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testErf() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestErfc.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestErfc.java
index 0a9d670..856bcf4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestErfc.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestErfc.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestErfc extends RSBaseCompute {
 
     private ScriptC_TestErfc script;
@@ -40,7 +42,7 @@
     }
 
     private void checkErfcFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x40344e4f0dfa008fl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xdfa008fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testErfcFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsErfcFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkErfcFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkErfcFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkErfcFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb9a44e42b72849bbl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb72849bbl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testErfcFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsErfcFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkErfcFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkErfcFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkErfcFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xb9a6175dad436a99l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xad436a99l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testErfcFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsErfcFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkErfcFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkErfcFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkErfcFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb9a7e078a35e8b77l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xa35e8b77l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testErfcFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsErfcFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkErfcFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkErfcFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testErfc() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp.java
index 2f03d77..8e73056 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestExp extends RSBaseCompute {
 
     private ScriptC_TestExp script;
@@ -40,7 +42,7 @@
     }
 
     private void checkExpFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x45e6c49035f888fcl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x35f888fcl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testExpFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsExpFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkExpFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkExpFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkExpFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdf9c6adc948fa500l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x948fa500l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testExpFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsExpFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkExpFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkExpFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkExpFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdf9e33f78aaac5del, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8aaac5del, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testExpFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsExpFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkExpFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkExpFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkExpFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xdf9ffd1280c5e6bcl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x80c5e6bcl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testExpFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsExpFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkExpFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkExpFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testExp() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp10.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp10.java
index 11668c7..fd01beb 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp10.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp10.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestExp10 extends RSBaseCompute {
 
     private ScriptC_TestExp10 script;
@@ -40,7 +42,7 @@
     }
 
     private void checkExp10FloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc5df97aec123e2edl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc123e2edl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testExp10FloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsExp10FloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkExp10FloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkExp10FloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkExp10Float2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2bc94277c0ac42a9l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc0ac42a9l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testExp10Float2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsExp10Float2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkExp10Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkExp10Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkExp10Float3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x2bcb0b92b6c76387l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xb6c76387l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testExp10Float3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsExp10Float3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkExp10Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkExp10Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkExp10Float4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x2bccd4adace28465l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xace28465l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testExp10Float4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsExp10Float4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkExp10Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkExp10Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testExp10() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp2.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp2.java
index d5696ec..8d1c698 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExp2.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestExp2 extends RSBaseCompute {
 
     private ScriptC_TestExp2 script;
@@ -40,7 +42,7 @@
     }
 
     private void checkExp2FloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x58195894b8b72a10l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb8b72a10l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testExp2FloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsExp2FloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkExp2FloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkExp2FloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkExp2Float2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4eeb7f70e7690e74l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xe7690e74l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testExp2Float2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsExp2Float2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkExp2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkExp2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkExp2Float3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x4eed488bdd842f52l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdd842f52l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testExp2Float3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsExp2Float3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkExp2Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkExp2Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkExp2Float4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4eef11a6d39f5030l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd39f5030l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testExp2Float4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsExp2Float4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkExp2Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkExp2Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testExp2() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExpm1.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExpm1.java
index 93596f7..6a1609f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExpm1.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestExpm1.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestExpm1 extends RSBaseCompute {
 
     private ScriptC_TestExpm1 script;
@@ -40,7 +42,7 @@
     }
 
     private void checkExpm1FloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xea420692a183a9e4l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa183a9e4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testExpm1FloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsExpm1FloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkExpm1FloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkExpm1FloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkExpm1Float2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xf6bc2e57547050a8l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x547050a8l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testExpm1Float2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsExpm1Float2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkExpm1Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkExpm1Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkExpm1Float3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf6bdf7724a8b7186l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x4a8b7186l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testExpm1Float3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsExpm1Float3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkExpm1Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkExpm1Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkExpm1Float4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf6bfc08d40a69264l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x40a69264l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testExpm1Float4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsExpm1Float4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkExpm1Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkExpm1Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testExpm1() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFabs.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFabs.java
index 38c5321..9303e7e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFabs.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFabs.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestFabs extends RSBaseCompute {
 
     private ScriptC_TestFabs script;
@@ -40,7 +42,7 @@
     }
 
     private void checkFabsFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd84cf8f27f929ae9l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7f929ae9l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testFabsFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsFabsFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFabsFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFabsFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFabsFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x43ccc4c22e5b1dc5l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2e5b1dc5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testFabsFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsFabsFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFabsFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFabsFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFabsFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x43ce8ddd24763ea3l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x24763ea3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testFabsFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsFabsFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFabsFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFabsFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFabsFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x43d056f81a915f81l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x1a915f81l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testFabsFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsFabsFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFabsFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFabsFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testFabs() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastDistance.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastDistance.java
index a1181ba..e10d5df 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastDistance.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastDistance.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestFastDistance extends RSBaseCompute {
 
     private ScriptC_TestFastDistance script;
@@ -41,8 +43,8 @@
     }
 
     private void checkFastDistanceFloatFloatFloat() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xeb32e5abb9b28b1al, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x83606d459f1626e3l, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb9b28b1al, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9f1626e3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -63,11 +65,16 @@
 
     private void verifyResultsFastDistanceFloatFloatFloat(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
             // Create the appropriate sized arrays in args
@@ -83,26 +90,32 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                message.append("Input inLeftVector: ");
-                appendVariableToMessage(message, arrayInLeftVector[i]);
-                message.append("\n");
-                message.append("Input inRightVector: ");
-                appendVariableToMessage(message, arrayInRightVector[i]);
-                message.append("\n");
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    message.append("Input inLeftVector: ");
+                    appendVariableToMessage(message, arrayInLeftVector[i]);
+                    message.append("\n");
+                    message.append("Input inRightVector: ");
+                    appendVariableToMessage(message, arrayInRightVector[i]);
+                    message.append("\n");
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
+                    message.append("\n");
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
+                    message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("\n");
-                assertTrue("Incorrect output for checkFastDistanceFloatFloatFloat" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkFastDistanceFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatNFloatNFloat {
@@ -112,8 +125,8 @@
     }
 
     private void checkFastDistanceFloat2Float2Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x580238eac7fabd9el, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xca3368dd0536a30fl, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc7fabd9el, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x536a30fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -134,11 +147,16 @@
 
     private void verifyResultsFastDistanceFloat2Float2Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -160,35 +178,41 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inLeftVector: ");
-                    appendVariableToMessage(message, arrayInLeftVector[i * 2 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 2 ; j++) {
+                        message.append("Input inLeftVector: ");
+                        appendVariableToMessage(message, arrayInLeftVector[i * 2 + j]);
+                        message.append("\n");
+                    }
+                    for (int j = 0; j < 2 ; j++) {
+                        message.append("Input inRightVector: ");
+                        appendVariableToMessage(message, arrayInRightVector[i * 2 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
-                }
-                for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inRightVector: ");
-                    appendVariableToMessage(message, arrayInRightVector[i * 2 + j]);
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
                     message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkFastDistanceFloat2Float2Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkFastDistanceFloat2Float2Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFastDistanceFloat3Float3Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x26ab5e68e99971ecl, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x809cb50caadeec29l, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe99971ecl, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xaadeec29l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -209,11 +233,16 @@
 
     private void verifyResultsFastDistanceFloat3Float3Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -235,35 +264,41 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inLeftVector: ");
-                    appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Input inLeftVector: ");
+                        appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Input inRightVector: ");
+                        appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
-                }
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inRightVector: ");
-                    appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
                     message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkFastDistanceFloat3Float3Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkFastDistanceFloat3Float3Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFastDistanceFloat4Float4Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf55483e70b38263al, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3706013c50873543l, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb38263al, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x50873543l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -284,11 +319,16 @@
 
     private void verifyResultsFastDistanceFloat4Float4Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -310,30 +350,36 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inLeftVector: ");
-                    appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Input inLeftVector: ");
+                        appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Input inRightVector: ");
+                        appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
-                }
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inRightVector: ");
-                    appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
                     message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkFastDistanceFloat4Float4Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkFastDistanceFloat4Float4Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testFastDistance() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastLength.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastLength.java
index 26c800b..b47adc9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastLength.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastLength.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestFastLength extends RSBaseCompute {
 
     private ScriptC_TestFastLength script;
@@ -40,7 +42,7 @@
     }
 
     private void checkFastLengthFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xebac65aea2660e8fl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa2660e8fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testFastLengthFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsFastLengthFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatFloat args = new ArgumentsFloatFloat();
             // Create the appropriate sized arrays in args
@@ -76,23 +82,29 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                message.append("Input inV: ");
-                appendVariableToMessage(message, arrayInV[i]);
-                message.append("\n");
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    message.append("Input inV: ");
+                    appendVariableToMessage(message, arrayInV[i]);
+                    message.append("\n");
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
+                    message.append("\n");
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
+                    message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("\n");
-                assertTrue("Incorrect output for checkFastLengthFloatFloat" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkFastLengthFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatNFloat {
@@ -101,7 +113,7 @@
     }
 
     private void checkFastLengthFloat2Float() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x95f43650f85e6cadl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xf85e6cadl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testFastLengthFloat2Float(inV, out);
@@ -120,9 +132,13 @@
 
     private void verifyResultsFastLengthFloat2Float(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloat args = new ArgumentsFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -140,29 +156,35 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, arrayInV[i * 2 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 2 ; j++) {
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, arrayInV[i * 2 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
+                    message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkFastLengthFloat2Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkFastLengthFloat2Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFastLengthFloat3Float() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x95f440f25764fb0el, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x5764fb0el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testFastLengthFloat3Float(inV, out);
@@ -181,9 +203,13 @@
 
     private void verifyResultsFastLengthFloat3Float(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloat args = new ArgumentsFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -201,29 +227,35 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, arrayInV[i * 4 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, arrayInV[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
+                    message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkFastLengthFloat3Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkFastLengthFloat3Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFastLengthFloat4Float() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x95f44b93b66b896fl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb66b896fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testFastLengthFloat4Float(inV, out);
@@ -242,9 +274,13 @@
 
     private void verifyResultsFastLengthFloat4Float(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloat args = new ArgumentsFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -262,25 +298,31 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, arrayInV[i * 4 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, arrayInV[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
+                    message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkFastLengthFloat4Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkFastLengthFloat4Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testFastLength() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastNormalize.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastNormalize.java
index 211a6e6..2c3ac1a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastNormalize.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFastNormalize.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestFastNormalize extends RSBaseCompute {
 
     private ScriptC_TestFastNormalize script;
@@ -40,7 +42,7 @@
     }
 
     private void checkFastNormalizeFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xdcfb9adc9f8882ecl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9f8882ecl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testFastNormalizeFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsFastNormalizeFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatFloat args = new ArgumentsFloatFloat();
             // Create the appropriate sized arrays in args
@@ -76,23 +82,29 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                message.append("Input inV: ");
-                appendVariableToMessage(message, arrayInV[i]);
-                message.append("\n");
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    message.append("Input inV: ");
+                    appendVariableToMessage(message, arrayInV[i]);
+                    message.append("\n");
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
+                    message.append("\n");
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
+                    message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("\n");
-                assertTrue("Incorrect output for checkFastNormalizeFloatFloat" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkFastNormalizeFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatNFloatN {
@@ -101,7 +113,7 @@
     }
 
     private void checkFastNormalizeFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x151c38c30573db70l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x573db70l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testFastNormalizeFloat2Float2(inV, out);
@@ -120,9 +132,13 @@
 
     private void verifyResultsFastNormalizeFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatN args = new ArgumentsFloatNFloatN();
             // Create the appropriate sized arrays in args
@@ -143,31 +159,37 @@
                 }
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, arrayInV[i * 2 + j]);
-                    message.append("\n");
-                }
-                for (int j = 0; j < 2 ; j++) {
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out[j]);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out[j].couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 2 ; j++) {
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, arrayInV[i * 2 + j]);
+                        message.append("\n");
                     }
-                    message.append("\n");
+                    for (int j = 0; j < 2 ; j++) {
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out[j]);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out[j].couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                    }
+                    message.append("Errors at");
                 }
-                assertTrue("Incorrect output for checkFastNormalizeFloat2Float2" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkFastNormalizeFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFastNormalizeFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x151e01ddfb8efc4el, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xfb8efc4el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testFastNormalizeFloat3Float3(inV, out);
@@ -186,9 +208,13 @@
 
     private void verifyResultsFastNormalizeFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatN args = new ArgumentsFloatNFloatN();
             // Create the appropriate sized arrays in args
@@ -209,31 +235,37 @@
                 }
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, arrayInV[i * 4 + j]);
-                    message.append("\n");
-                }
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out[j]);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out[j].couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, arrayInV[i * 4 + j]);
+                        message.append("\n");
                     }
-                    message.append("\n");
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out[j]);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out[j].couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                    }
+                    message.append("Errors at");
                 }
-                assertTrue("Incorrect output for checkFastNormalizeFloat3Float3" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkFastNormalizeFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFastNormalizeFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x151fcaf8f1aa1d2cl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf1aa1d2cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testFastNormalizeFloat4Float4(inV, out);
@@ -252,9 +284,13 @@
 
     private void verifyResultsFastNormalizeFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatN args = new ArgumentsFloatNFloatN();
             // Create the appropriate sized arrays in args
@@ -275,27 +311,33 @@
                 }
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, arrayInV[i * 4 + j]);
-                    message.append("\n");
-                }
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out[j]);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out[j].couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, arrayInV[i * 4 + j]);
+                        message.append("\n");
                     }
-                    message.append("\n");
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out[j]);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out[j].couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                    }
+                    message.append("Errors at");
                 }
-                assertTrue("Incorrect output for checkFastNormalizeFloat4Float4" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkFastNormalizeFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testFastNormalize() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFdim.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFdim.java
index 7d053fa..c817296 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFdim.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFdim.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestFdim extends RSBaseCompute {
 
     private ScriptC_TestFdim script;
@@ -41,8 +43,8 @@
     }
 
     private void checkFdimFloatFloatFloat() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf5dd38fbc3a47366l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf5dd38fbc3a47367l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc3a47366l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc3a47367l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -63,11 +65,16 @@
 
     private void verifyResultsFdimFloatFloatFloat(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFdimFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFdimFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFdimFloat2Float2Float2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xca6a96c16f167f4cl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xca6a96c16f167f4dl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x6f167f4cl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x6f167f4dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -129,11 +144,16 @@
 
     private void verifyResultsFdimFloat2Float2Float2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFdimFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFdimFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFdimFloat3Float3Float3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1ecf74e170f480edl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1ecf74e170f480eel, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x70f480edl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x70f480eel, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -195,11 +223,16 @@
 
     private void verifyResultsFdimFloat3Float3Float3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFdimFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFdimFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFdimFloat4Float4Float4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x7334530172d2828el, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x7334530172d2828fl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x72d2828el, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x72d2828fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -261,11 +302,16 @@
 
     private void verifyResultsFdimFloat4Float4Float4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,27 +327,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFdimFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFdimFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testFdim() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFloor.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFloor.java
index 3b17241..0ebc227 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFloor.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFloor.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestFloor extends RSBaseCompute {
 
     private ScriptC_TestFloor script;
@@ -40,7 +42,7 @@
     }
 
     private void checkFloorFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3b3c924b95badeadl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x95badeadl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testFloorFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsFloorFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFloorFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFloorFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFloorFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd8575933372c9069l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x372c9069l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testFloorFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsFloorFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFloorFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFloorFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFloorFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd859224e2d47b147l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x2d47b147l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testFloorFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsFloorFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFloorFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFloorFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFloorFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd85aeb692362d225l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x2362d225l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testFloorFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsFloorFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFloorFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFloorFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testFloor() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFma.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFma.java
index 24923a3..f5f30b3 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFma.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFma.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestFma extends RSBaseCompute {
 
     private ScriptC_TestFma script;
@@ -42,9 +44,9 @@
     }
 
     private void checkFmaFloatFloatFloatFloat() {
-        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x716293a685c419bel, false);
-        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x716293a685c419bfl, false);
-        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4a235a109d441b0el, false);
+        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x85c419bel, false);
+        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x85c419bfl, false);
+        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9d441b0el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInMultiplicand2(inMultiplicand2);
@@ -67,13 +69,19 @@
 
     private void verifyResultsFmaFloatFloatFloatFloat(Allocation inMultiplicand1, Allocation inMultiplicand2, Allocation inOffset, Allocation out, boolean relaxed) {
         float[] arrayInMultiplicand1 = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInMultiplicand1, (float) 42);
         inMultiplicand1.copyTo(arrayInMultiplicand1);
         float[] arrayInMultiplicand2 = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInMultiplicand2, (float) 42);
         inMultiplicand2.copyTo(arrayInMultiplicand2);
         float[] arrayInOffset = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInOffset, (float) 42);
         inOffset.copyTo(arrayInOffset);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -90,36 +98,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMultiplicand1: ");
-                    appendVariableToMessage(message, args.inMultiplicand1);
-                    message.append("\n");
-                    message.append("Input inMultiplicand2: ");
-                    appendVariableToMessage(message, args.inMultiplicand2);
-                    message.append("\n");
-                    message.append("Input inOffset: ");
-                    appendVariableToMessage(message, args.inOffset);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inMultiplicand1: ");
+                        appendVariableToMessage(message, args.inMultiplicand1);
+                        message.append("\n");
+                        message.append("Input inMultiplicand2: ");
+                        appendVariableToMessage(message, args.inMultiplicand2);
+                        message.append("\n");
+                        message.append("Input inOffset: ");
+                        appendVariableToMessage(message, args.inOffset);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFmaFloatFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFmaFloatFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFmaFloat2Float2Float2Float2() {
-        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x1bb42af9dda15056l, false);
-        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x1bb42af9dda15057l, false);
-        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x667fbd778aeda396l, false);
+        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdda15056l, false);
+        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdda15057l, false);
+        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8aeda396l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInMultiplicand2(inMultiplicand2);
@@ -142,13 +158,19 @@
 
     private void verifyResultsFmaFloat2Float2Float2Float2(Allocation inMultiplicand1, Allocation inMultiplicand2, Allocation inOffset, Allocation out, boolean relaxed) {
         float[] arrayInMultiplicand1 = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInMultiplicand1, (float) 42);
         inMultiplicand1.copyTo(arrayInMultiplicand1);
         float[] arrayInMultiplicand2 = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInMultiplicand2, (float) 42);
         inMultiplicand2.copyTo(arrayInMultiplicand2);
         float[] arrayInOffset = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInOffset, (float) 42);
         inOffset.copyTo(arrayInOffset);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -165,36 +187,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMultiplicand1: ");
-                    appendVariableToMessage(message, args.inMultiplicand1);
-                    message.append("\n");
-                    message.append("Input inMultiplicand2: ");
-                    appendVariableToMessage(message, args.inMultiplicand2);
-                    message.append("\n");
-                    message.append("Input inOffset: ");
-                    appendVariableToMessage(message, args.inOffset);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inMultiplicand1: ");
+                        appendVariableToMessage(message, args.inMultiplicand1);
+                        message.append("\n");
+                        message.append("Input inMultiplicand2: ");
+                        appendVariableToMessage(message, args.inMultiplicand2);
+                        message.append("\n");
+                        message.append("Input inOffset: ");
+                        appendVariableToMessage(message, args.inOffset);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFmaFloat2Float2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFmaFloat2Float2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFmaFloat3Float3Float3Float3() {
-        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x19169f2d349697b2l, false);
-        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x19169f2d349697b3l, false);
-        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3a56bf5454d5ec8al, false);
+        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x349697b2l, false);
+        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x349697b3l, false);
+        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x54d5ec8al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInMultiplicand2(inMultiplicand2);
@@ -217,13 +247,19 @@
 
     private void verifyResultsFmaFloat3Float3Float3Float3(Allocation inMultiplicand1, Allocation inMultiplicand2, Allocation inOffset, Allocation out, boolean relaxed) {
         float[] arrayInMultiplicand1 = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInMultiplicand1, (float) 42);
         inMultiplicand1.copyTo(arrayInMultiplicand1);
         float[] arrayInMultiplicand2 = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInMultiplicand2, (float) 42);
         inMultiplicand2.copyTo(arrayInMultiplicand2);
         float[] arrayInOffset = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInOffset, (float) 42);
         inOffset.copyTo(arrayInOffset);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -240,36 +276,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMultiplicand1: ");
-                    appendVariableToMessage(message, args.inMultiplicand1);
-                    message.append("\n");
-                    message.append("Input inMultiplicand2: ");
-                    appendVariableToMessage(message, args.inMultiplicand2);
-                    message.append("\n");
-                    message.append("Input inOffset: ");
-                    appendVariableToMessage(message, args.inOffset);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inMultiplicand1: ");
+                        appendVariableToMessage(message, args.inMultiplicand1);
+                        message.append("\n");
+                        message.append("Input inMultiplicand2: ");
+                        appendVariableToMessage(message, args.inMultiplicand2);
+                        message.append("\n");
+                        message.append("Input inOffset: ");
+                        appendVariableToMessage(message, args.inOffset);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFmaFloat3Float3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFmaFloat3Float3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFmaFloat4Float4Float4Float4() {
-        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x167913608b8bdf0el, false);
-        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x167913608b8bdf0fl, false);
-        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe2dc1311ebe357el, false);
+        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8b8bdf0el, false);
+        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8b8bdf0fl, false);
+        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x1ebe357el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInMultiplicand2(inMultiplicand2);
@@ -292,13 +336,19 @@
 
     private void verifyResultsFmaFloat4Float4Float4Float4(Allocation inMultiplicand1, Allocation inMultiplicand2, Allocation inOffset, Allocation out, boolean relaxed) {
         float[] arrayInMultiplicand1 = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInMultiplicand1, (float) 42);
         inMultiplicand1.copyTo(arrayInMultiplicand1);
         float[] arrayInMultiplicand2 = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInMultiplicand2, (float) 42);
         inMultiplicand2.copyTo(arrayInMultiplicand2);
         float[] arrayInOffset = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInOffset, (float) 42);
         inOffset.copyTo(arrayInOffset);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -315,30 +365,38 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMultiplicand1: ");
-                    appendVariableToMessage(message, args.inMultiplicand1);
-                    message.append("\n");
-                    message.append("Input inMultiplicand2: ");
-                    appendVariableToMessage(message, args.inMultiplicand2);
-                    message.append("\n");
-                    message.append("Input inOffset: ");
-                    appendVariableToMessage(message, args.inOffset);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inMultiplicand1: ");
+                        appendVariableToMessage(message, args.inMultiplicand1);
+                        message.append("\n");
+                        message.append("Input inMultiplicand2: ");
+                        appendVariableToMessage(message, args.inMultiplicand2);
+                        message.append("\n");
+                        message.append("Input inOffset: ");
+                        appendVariableToMessage(message, args.inOffset);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFmaFloat4Float4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFmaFloat4Float4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testFma() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmax.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmax.java
index 046b564..56ea3d9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmax.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmax.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestFmax extends RSBaseCompute {
 
     private ScriptC_TestFmax script;
@@ -41,8 +43,8 @@
     }
 
     private void checkFmaxFloatFloatFloat() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe6ec75a46e6fdd7al, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe6ec75a46e6fdd7bl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x6e6fdd7al, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x6e6fdd7bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -63,11 +65,16 @@
 
     private void verifyResultsFmaxFloatFloatFloat(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFmaxFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFmaxFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFmaxFloat2Float2Float2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xa99eaa6dd458a0c8l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xa99eaa6dd458a0c9l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd458a0c8l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd458a0c9l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -129,11 +144,16 @@
 
     private void verifyResultsFmaxFloat2Float2Float2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFmaxFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFmaxFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFmaxFloat3Float3Float3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xfe03888dd636a269l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xfe03888dd636a26al, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd636a269l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd636a26al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -195,11 +223,16 @@
 
     private void verifyResultsFmaxFloat3Float3Float3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFmaxFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFmaxFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFmaxFloat4Float4Float4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x526866add814a40al, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x526866add814a40bl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd814a40al, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd814a40bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -261,11 +302,16 @@
 
     private void verifyResultsFmaxFloat4Float4Float4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,32 +327,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFmaxFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFmaxFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFmaxFloat2FloatFloat2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xce5ddc06dc631102l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xce5ddc06dc631103l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdc631102l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xdc631103l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -327,11 +381,16 @@
 
     private void verifyResultsFmaxFloat2FloatFloat2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -347,32 +406,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFmaxFloat2FloatFloat2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFmaxFloat2FloatFloat2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFmaxFloat3FloatFloat3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x23ad8f1ecace055el, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x23ad8f1ecace055fl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xcace055el, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xcace055fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -393,11 +460,16 @@
 
     private void verifyResultsFmaxFloat3FloatFloat3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -413,32 +485,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFmaxFloat3FloatFloat3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFmaxFloat3FloatFloat3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFmaxFloat4FloatFloat4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x78fd4236b938f9bal, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x78fd4236b938f9bbl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb938f9bal, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb938f9bbl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -459,11 +539,16 @@
 
     private void verifyResultsFmaxFloat4FloatFloat4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -479,27 +564,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFmaxFloat4FloatFloat4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFmaxFloat4FloatFloat4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testFmax() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmin.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmin.java
index 2b05df4..c96daa4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmin.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestFmin extends RSBaseCompute {
 
     private ScriptC_TestFmin script;
@@ -41,8 +43,8 @@
     }
 
     private void checkFminFloatFloatFloat() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7b46a8451d7b1058l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7b46a8451d7b1059l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x1d7b1058l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x1d7b1059l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -63,11 +65,16 @@
 
     private void verifyResultsFminFloatFloatFloat(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFminFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFminFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFminFloat2Float2Float2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x12b850a9e75faa42l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x12b850a9e75faa43l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xe75faa42l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xe75faa43l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -129,11 +144,16 @@
 
     private void verifyResultsFminFloat2Float2Float2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFminFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFminFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFminFloat3Float3Float3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x671d2ec9e93dabe3l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x671d2ec9e93dabe4l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe93dabe3l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe93dabe4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -195,11 +223,16 @@
 
     private void verifyResultsFminFloat3Float3Float3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFminFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFminFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFminFloat4Float4Float4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbb820ce9eb1bad84l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbb820ce9eb1bad85l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xeb1bad84l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xeb1bad85l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -261,11 +302,16 @@
 
     private void verifyResultsFminFloat4Float4Float4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,32 +327,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFminFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFminFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFminFloat2FloatFloat2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4dd5869724457670l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4dd5869724457671l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x24457670l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x24457671l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -327,11 +381,16 @@
 
     private void verifyResultsFminFloat2FloatFloat2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -347,32 +406,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFminFloat2FloatFloat2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFminFloat2FloatFloat2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFminFloat3FloatFloat3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xa32539af12b06accl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa32539af12b06acdl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x12b06accl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x12b06acdl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -393,11 +460,16 @@
 
     private void verifyResultsFminFloat3FloatFloat3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -413,32 +485,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFminFloat3FloatFloat3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFminFloat3FloatFloat3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFminFloat4FloatFloat4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf874ecc7011b5f28l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf874ecc7011b5f29l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x11b5f28l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x11b5f29l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -459,11 +539,16 @@
 
     private void verifyResultsFminFloat4FloatFloat4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -479,27 +564,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFminFloat4FloatFloat4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFminFloat4FloatFloat4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testFmin() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmod.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmod.java
index 72beaa4..442cad9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmod.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFmod.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestFmod extends RSBaseCompute {
 
     private ScriptC_TestFmod script;
@@ -41,8 +43,8 @@
     }
 
     private void checkFmodFloatFloatFloat() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xed70b65ddcc790e8l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xeff8dc0a04b044e1l, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xdcc790e8l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4b044e1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -63,11 +65,16 @@
 
     private void verifyResultsFmodFloatFloatFloat(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFmodFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFmodFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFmodFloat2Float2Float2() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x84bcef91ebd95a82l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb582050adc295e2bl, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xebd95a82l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdc295e2bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -129,11 +144,16 @@
 
     private void verifyResultsFmodFloat2Float2Float2(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFmodFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFmodFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFmodFloat3Float3Float3() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x604b98cb8ea54683l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x7ee64653af04f164l, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8ea54683l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xaf04f164l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -195,11 +223,16 @@
 
     private void verifyResultsFmodFloat3Float3Float3(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFmodFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFmodFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFmodFloat4Float4Float4() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3bda420531713284l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x484a879c81e0849dl, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x31713284l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x81e0849dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -261,11 +302,16 @@
 
     private void verifyResultsFmodFloat4Float4Float4(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,27 +327,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFmodFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFmodFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testFmod() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFract.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFract.java
index ce7a671..11ad1be 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFract.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFract.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestFract extends RSBaseCompute {
 
     private ScriptC_TestFract script;
@@ -41,7 +43,7 @@
     }
 
     private void checkFractFloatFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x57d8e6573c675d27l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3c675d27l, false);
         try {
             Allocation outFloor = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
@@ -64,11 +66,16 @@
 
     private void verifyResultsFractFloatFloatFloat(Allocation inV, Allocation outFloor, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOutFloor = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOutFloor, (float) 42);
         outFloor.copyTo(arrayOutFloor);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -86,37 +93,45 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outFloor: ");
-                    appendVariableToMessage(message, args.outFloor);
-                    message.append("\n");
-                    message.append("Actual   output outFloor: ");
-                    appendVariableToMessage(message, arrayOutFloor[i * 1 + j]);
-                    if (!args.outFloor.couldBe(arrayOutFloor[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outFloor: ");
+                        appendVariableToMessage(message, args.outFloor);
+                        message.append("\n");
+                        message.append("Actual   output outFloor: ");
+                        appendVariableToMessage(message, arrayOutFloor[i * 1 + j]);
+                        if (!args.outFloor.couldBe(arrayOutFloor[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFractFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFractFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFractFloat2Float2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd1dbe683cdf8f525l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xcdf8f525l, false);
         try {
             Allocation outFloor = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
@@ -139,11 +154,16 @@
 
     private void verifyResultsFractFloat2Float2Float2(Allocation inV, Allocation outFloor, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOutFloor = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOutFloor, (float) 42);
         outFloor.copyTo(arrayOutFloor);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -161,37 +181,45 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outFloor: ");
-                    appendVariableToMessage(message, args.outFloor);
-                    message.append("\n");
-                    message.append("Actual   output outFloor: ");
-                    appendVariableToMessage(message, arrayOutFloor[i * 2 + j]);
-                    if (!args.outFloor.couldBe(arrayOutFloor[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outFloor: ");
+                        appendVariableToMessage(message, args.outFloor);
+                        message.append("\n");
+                        message.append("Actual   output outFloor: ");
+                        appendVariableToMessage(message, arrayOutFloor[i * 2 + j]);
+                        if (!args.outFloor.couldBe(arrayOutFloor[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFractFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFractFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFractFloat3Float3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x2640c4a3cfd6f6c6l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xcfd6f6c6l, false);
         try {
             Allocation outFloor = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
@@ -214,11 +242,16 @@
 
     private void verifyResultsFractFloat3Float3Float3(Allocation inV, Allocation outFloor, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOutFloor = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOutFloor, (float) 42);
         outFloor.copyTo(arrayOutFloor);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -236,37 +269,45 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outFloor: ");
-                    appendVariableToMessage(message, args.outFloor);
-                    message.append("\n");
-                    message.append("Actual   output outFloor: ");
-                    appendVariableToMessage(message, arrayOutFloor[i * 4 + j]);
-                    if (!args.outFloor.couldBe(arrayOutFloor[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outFloor: ");
+                        appendVariableToMessage(message, args.outFloor);
+                        message.append("\n");
+                        message.append("Actual   output outFloor: ");
+                        appendVariableToMessage(message, arrayOutFloor[i * 4 + j]);
+                        if (!args.outFloor.couldBe(arrayOutFloor[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFractFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFractFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFractFloat4Float4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x7aa5a2c3d1b4f867l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd1b4f867l, false);
         try {
             Allocation outFloor = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
@@ -289,11 +330,16 @@
 
     private void verifyResultsFractFloat4Float4Float4(Allocation inV, Allocation outFloor, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOutFloor = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOutFloor, (float) 42);
         outFloor.copyTo(arrayOutFloor);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -311,33 +357,41 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outFloor: ");
-                    appendVariableToMessage(message, args.outFloor);
-                    message.append("\n");
-                    message.append("Actual   output outFloor: ");
-                    appendVariableToMessage(message, arrayOutFloor[i * 4 + j]);
-                    if (!args.outFloor.couldBe(arrayOutFloor[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outFloor: ");
+                        appendVariableToMessage(message, args.outFloor);
+                        message.append("\n");
+                        message.append("Actual   output outFloor: ");
+                        appendVariableToMessage(message, arrayOutFloor[i * 4 + j]);
+                        if (!args.outFloor.couldBe(arrayOutFloor[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFractFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFractFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatFloat {
@@ -346,7 +400,7 @@
     }
 
     private void checkFractFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf559208b9db2cad3l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9db2cad3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testFractFloatFloat(inV, out);
@@ -365,9 +419,13 @@
 
     private void verifyResultsFractFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -382,28 +440,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFractFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFractFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFractFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x1096c5acc4d52edfl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc4d52edfl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testFractFloat2Float2(inV, out);
@@ -422,9 +488,13 @@
 
     private void verifyResultsFractFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -439,28 +509,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFractFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFractFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFractFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x10988ec7baf04fbdl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xbaf04fbdl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testFractFloat3Float3(inV, out);
@@ -479,9 +557,13 @@
 
     private void verifyResultsFractFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -496,28 +578,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFractFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFractFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFractFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x109a57e2b10b709bl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb10b709bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testFractFloat4Float4(inV, out);
@@ -536,9 +626,13 @@
 
     private void verifyResultsFractFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -553,24 +647,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFractFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFractFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testFract() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFrexp.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFrexp.java
index 6d47860..72de03e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFrexp.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestFrexp.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestFrexp extends RSBaseCompute {
 
     private ScriptC_TestFrexp script;
@@ -41,7 +43,7 @@
     }
 
     private void checkFrexpFloatIntFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x57ae9fe07384e56dl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7384e56dl, false);
         try {
             Allocation outExponent = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
@@ -64,11 +66,16 @@
 
     private void verifyResultsFrexpFloatIntFloat(Allocation inV, Allocation outExponent, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayOutExponent = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayOutExponent, (int) 42);
         outExponent.copyTo(arrayOutExponent);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -86,37 +93,45 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outExponent: ");
-                    appendVariableToMessage(message, args.outExponent);
-                    message.append("\n");
-                    message.append("Actual   output outExponent: ");
-                    appendVariableToMessage(message, arrayOutExponent[i * 1 + j]);
-                    if (args.outExponent != arrayOutExponent[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outExponent: ");
+                        appendVariableToMessage(message, args.outExponent);
+                        message.append("\n");
+                        message.append("Actual   output outExponent: ");
+                        appendVariableToMessage(message, arrayOutExponent[i * 1 + j]);
+                        if (args.outExponent != arrayOutExponent[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFrexpFloatIntFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFrexpFloatIntFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFrexpFloat2Int2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x544e0a688fe7701l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x88fe7701l, false);
         try {
             Allocation outExponent = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
@@ -139,11 +154,16 @@
 
     private void verifyResultsFrexpFloat2Int2Float2(Allocation inV, Allocation outExponent, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayOutExponent = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOutExponent, (int) 42);
         outExponent.copyTo(arrayOutExponent);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -161,37 +181,45 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outExponent: ");
-                    appendVariableToMessage(message, args.outExponent);
-                    message.append("\n");
-                    message.append("Actual   output outExponent: ");
-                    appendVariableToMessage(message, arrayOutExponent[i * 2 + j]);
-                    if (args.outExponent != arrayOutExponent[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outExponent: ");
+                        appendVariableToMessage(message, args.outExponent);
+                        message.append("\n");
+                        message.append("Actual   output outExponent: ");
+                        appendVariableToMessage(message, arrayOutExponent[i * 2 + j]);
+                        if (args.outExponent != arrayOutExponent[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFrexpFloat2Int2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFrexpFloat2Int2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFrexpFloat3Int3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x2afb1f097eb0e3bal, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x7eb0e3bal, false);
         try {
             Allocation outExponent = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
@@ -214,11 +242,16 @@
 
     private void verifyResultsFrexpFloat3Int3Float3(Allocation inV, Allocation outExponent, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayOutExponent = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOutExponent, (int) 42);
         outExponent.copyTo(arrayOutExponent);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -236,37 +269,45 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outExponent: ");
-                    appendVariableToMessage(message, args.outExponent);
-                    message.append("\n");
-                    message.append("Actual   output outExponent: ");
-                    appendVariableToMessage(message, arrayOutExponent[i * 4 + j]);
-                    if (args.outExponent != arrayOutExponent[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outExponent: ");
+                        appendVariableToMessage(message, args.outExponent);
+                        message.append("\n");
+                        message.append("Actual   output outExponent: ");
+                        appendVariableToMessage(message, arrayOutExponent[i * 4 + j]);
+                        if (args.outExponent != arrayOutExponent[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFrexpFloat3Int3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFrexpFloat3Int3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkFrexpFloat4Int4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x50b15d6c74635073l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x74635073l, false);
         try {
             Allocation outExponent = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
@@ -289,11 +330,16 @@
 
     private void verifyResultsFrexpFloat4Int4Float4(Allocation inV, Allocation outExponent, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayOutExponent = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOutExponent, (int) 42);
         outExponent.copyTo(arrayOutExponent);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -311,33 +357,41 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outExponent: ");
-                    appendVariableToMessage(message, args.outExponent);
-                    message.append("\n");
-                    message.append("Actual   output outExponent: ");
-                    appendVariableToMessage(message, arrayOutExponent[i * 4 + j]);
-                    if (args.outExponent != arrayOutExponent[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outExponent: ");
+                        appendVariableToMessage(message, args.outExponent);
+                        message.append("\n");
+                        message.append("Actual   output outExponent: ");
+                        appendVariableToMessage(message, arrayOutExponent[i * 4 + j]);
+                        if (args.outExponent != arrayOutExponent[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkFrexpFloat4Int4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkFrexpFloat4Int4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testFrexp() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfRecip.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfRecip.java
index 854d432..4793b6d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfRecip.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfRecip.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestHalfRecip extends RSBaseCompute {
 
     private ScriptC_TestHalfRecip script;
@@ -40,7 +42,7 @@
     }
 
     private void checkHalfRecipFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x854e263130d5b3dl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x130d5b3dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testHalfRecipFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsHalfRecipFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkHalfRecipFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkHalfRecipFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkHalfRecipFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2cf1d2db5ff23c79l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x5ff23c79l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testHalfRecipFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsHalfRecipFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkHalfRecipFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkHalfRecipFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkHalfRecipFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x2cf39bf6560d5d57l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x560d5d57l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testHalfRecipFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsHalfRecipFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkHalfRecipFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkHalfRecipFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkHalfRecipFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x2cf565114c287e35l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4c287e35l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testHalfRecipFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsHalfRecipFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkHalfRecipFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkHalfRecipFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testHalfRecip() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfRsqrt.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfRsqrt.java
index 68746e7..efe890a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfRsqrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfRsqrt.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestHalfRsqrt extends RSBaseCompute {
 
     private ScriptC_TestHalfRsqrt script;
@@ -40,7 +42,7 @@
     }
 
     private void checkHalfRsqrtFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xad5e977ec00f0bf2l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc00f0bf2l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testHalfRsqrtFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsHalfRsqrtFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkHalfRsqrtFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkHalfRsqrtFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkHalfRsqrtFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x300ee7bff12787c6l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xf12787c6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testHalfRsqrtFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsHalfRsqrtFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkHalfRsqrtFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkHalfRsqrtFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkHalfRsqrtFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3010b0dae742a8a4l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe742a8a4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testHalfRsqrtFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsHalfRsqrtFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkHalfRsqrtFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkHalfRsqrtFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkHalfRsqrtFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x301279f5dd5dc982l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xdd5dc982l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testHalfRsqrtFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsHalfRsqrtFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkHalfRsqrtFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkHalfRsqrtFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testHalfRsqrt() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfSqrt.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfSqrt.java
index a924937..9cf3ff2 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfSqrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHalfSqrt.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestHalfSqrt extends RSBaseCompute {
 
     private ScriptC_TestHalfSqrt script;
@@ -40,7 +42,7 @@
     }
 
     private void checkHalfSqrtFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x8be766c7a15db5fal, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa15db5fal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testHalfSqrtFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsHalfSqrtFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkHalfSqrtFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkHalfSqrtFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkHalfSqrtFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x7a300d2342519b8el, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x42519b8el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testHalfSqrtFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsHalfSqrtFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkHalfSqrtFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkHalfSqrtFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkHalfSqrtFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x7a31d63e386cbc6cl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x386cbc6cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testHalfSqrtFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsHalfSqrtFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkHalfSqrtFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkHalfSqrtFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkHalfSqrtFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x7a339f592e87dd4al, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x2e87dd4al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testHalfSqrtFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsHalfSqrtFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkHalfSqrtFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkHalfSqrtFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testHalfSqrt() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHypot.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHypot.java
index d2231b2..8f2e5dd 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHypot.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestHypot.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestHypot extends RSBaseCompute {
 
     private ScriptC_TestHypot script;
@@ -41,8 +43,8 @@
     }
 
     private void checkHypotFloatFloatFloat() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7deb65e7738c74c4l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7deb65e7738c74c5l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x738c74c4l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x738c74c5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -63,11 +65,16 @@
 
     private void verifyResultsHypotFloatFloatFloat(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkHypotFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkHypotFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkHypotFloat2Float2Float2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x14f3c91a62f71c46l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x14f3c91a62f71c47l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x62f71c46l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x62f71c47l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -129,11 +144,16 @@
 
     private void verifyResultsHypotFloat2Float2Float2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkHypotFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkHypotFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkHypotFloat3Float3Float3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6958a73a64d51de7l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6958a73a64d51de8l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x64d51de7l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x64d51de8l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -195,11 +223,16 @@
 
     private void verifyResultsHypotFloat3Float3Float3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkHypotFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkHypotFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkHypotFloat4Float4Float4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbdbd855a66b31f88l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbdbd855a66b31f89l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x66b31f88l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x66b31f89l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -261,11 +302,16 @@
 
     private void verifyResultsHypotFloat4Float4Float4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,27 +327,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkHypotFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkHypotFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testHypot() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestIlogb.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestIlogb.java
index dddddf5..8a24f7a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestIlogb.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestIlogb.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestIlogb extends RSBaseCompute {
 
     private ScriptC_TestIlogb script;
@@ -40,7 +42,7 @@
     }
 
     private void checkIlogbFloatInt() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x6103ca4b5664967bl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x5664967bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
             script.forEach_testIlogbFloatInt(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsIlogbFloatInt(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -73,23 +79,31 @@
                 String errorMessage = CoreMathVerifier.verifyIlogb(args);
                 boolean valid = errorMessage == null;
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append(errorMessage);
-                    assertTrue("Incorrect output for checkIlogbFloatInt" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append(errorMessage);
+                        message.append("Errors at");
+                    }
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkIlogbFloatInt" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkIlogbFloat2Int2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb460143cb6f32a61l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb6f32a61l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             script.forEach_testIlogbFloat2Int2(inV, out);
@@ -108,9 +122,13 @@
 
     private void verifyResultsIlogbFloat2Int2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -122,23 +140,31 @@
                 String errorMessage = CoreMathVerifier.verifyIlogb(args);
                 boolean valid = errorMessage == null;
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append(errorMessage);
-                    assertTrue("Incorrect output for checkIlogbFloat2Int2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append(errorMessage);
+                        message.append("Errors at");
+                    }
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkIlogbFloat2Int2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkIlogbFloat3Int3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xb460147c009b3a97l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x9b3a97l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             script.forEach_testIlogbFloat3Int3(inV, out);
@@ -157,9 +183,13 @@
 
     private void verifyResultsIlogbFloat3Int3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -171,23 +201,31 @@
                 String errorMessage = CoreMathVerifier.verifyIlogb(args);
                 boolean valid = errorMessage == null;
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append(errorMessage);
-                    assertTrue("Incorrect output for checkIlogbFloat3Int3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append(errorMessage);
+                        message.append("Errors at");
+                    }
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkIlogbFloat3Int3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkIlogbFloat4Int4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb46014bb4a434acdl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4a434acdl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             script.forEach_testIlogbFloat4Int4(inV, out);
@@ -206,9 +244,13 @@
 
     private void verifyResultsIlogbFloat4Int4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -220,19 +262,27 @@
                 String errorMessage = CoreMathVerifier.verifyIlogb(args);
                 boolean valid = errorMessage == null;
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append(errorMessage);
-                    assertTrue("Incorrect output for checkIlogbFloat4Int4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append(errorMessage);
+                        message.append("Errors at");
+                    }
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkIlogbFloat4Int4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testIlogb() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLdexp.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLdexp.java
index 5f85aeb..6dc48ed 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLdexp.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLdexp.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestLdexp extends RSBaseCompute {
 
     private ScriptC_TestLdexp script;
@@ -41,8 +43,8 @@
     }
 
     private void checkLdexpFloatIntFloat() {
-        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xdffd225490f0e26fl, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xdffd207c2e4133c4l, false);
+        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x90f0e26fl, false);
+        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x2e4133c4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -63,11 +65,16 @@
 
     private void verifyResultsLdexpFloatIntFloat(Allocation inMantissa, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInMantissa = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInMantissa, (float) 42);
         inMantissa.copyTo(arrayInMantissa);
         int[] arrayInExponent = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInExponent, (int) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMantissa: ");
-                    appendVariableToMessage(message, args.inMantissa);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inMantissa: ");
+                        appendVariableToMessage(message, args.inMantissa);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLdexpFloatIntFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLdexpFloatIntFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLdexpFloat2Int2Float2() {
-        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x7d0b1a44fe92893l, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x7d0afcbed3979e8l, false);
+        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4fe92893l, false);
+        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xed3979e8l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -129,11 +144,16 @@
 
     private void verifyResultsLdexpFloat2Int2Float2(Allocation inMantissa, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInMantissa = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInMantissa, (float) 42);
         inMantissa.copyTo(arrayInMantissa);
         int[] arrayInExponent = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInExponent, (int) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMantissa: ");
-                    appendVariableToMessage(message, args.inMantissa);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inMantissa: ");
+                        appendVariableToMessage(message, args.inMantissa);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLdexpFloat2Int2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLdexpFloat2Int2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLdexpFloat3Int3Float3() {
-        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xa8e041253fa3335el, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xa8e03f4cdcf384b3l, false);
+        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3fa3335el, false);
+        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xdcf384b3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -195,11 +223,16 @@
 
     private void verifyResultsLdexpFloat3Int3Float3(Allocation inMantissa, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInMantissa = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInMantissa, (float) 42);
         inMantissa.copyTo(arrayInMantissa);
         int[] arrayInExponent = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInExponent, (int) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMantissa: ");
-                    appendVariableToMessage(message, args.inMantissa);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inMantissa: ");
+                        appendVariableToMessage(message, args.inMantissa);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLdexpFloat3Int3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLdexpFloat3Int3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLdexpFloat4Int4Float4() {
-        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x49efd0a62f5d3e29l, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x49efcecdccad8f7el, false);
+        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x2f5d3e29l, false);
+        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xccad8f7el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -261,11 +302,16 @@
 
     private void verifyResultsLdexpFloat4Int4Float4(Allocation inMantissa, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInMantissa = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInMantissa, (float) 42);
         inMantissa.copyTo(arrayInMantissa);
         int[] arrayInExponent = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInExponent, (int) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,32 +327,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMantissa: ");
-                    appendVariableToMessage(message, args.inMantissa);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inMantissa: ");
+                        appendVariableToMessage(message, args.inMantissa);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLdexpFloat4Int4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLdexpFloat4Int4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLdexpFloat2IntFloat2() {
-        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x6a72b89838bd38d1l, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x6a72b6bfd60d8a26l, false);
+        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x38bd38d1l, false);
+        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xd60d8a26l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -327,11 +381,16 @@
 
     private void verifyResultsLdexpFloat2IntFloat2(Allocation inMantissa, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInMantissa = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInMantissa, (float) 42);
         inMantissa.copyTo(arrayInMantissa);
         int[] arrayInExponent = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInExponent, (int) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -347,32 +406,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMantissa: ");
-                    appendVariableToMessage(message, args.inMantissa);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inMantissa: ");
+                        appendVariableToMessage(message, args.inMantissa);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLdexpFloat2IntFloat2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLdexpFloat2IntFloat2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLdexpFloat3IntFloat3() {
-        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x49ba40205150f83dl, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x49ba3e47eea14992l, false);
+        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x5150f83dl, false);
+        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xeea14992l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -393,11 +460,16 @@
 
     private void verifyResultsLdexpFloat3IntFloat3(Allocation inMantissa, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInMantissa = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInMantissa, (float) 42);
         inMantissa.copyTo(arrayInMantissa);
         int[] arrayInExponent = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInExponent, (int) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -413,32 +485,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMantissa: ");
-                    appendVariableToMessage(message, args.inMantissa);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inMantissa: ");
+                        appendVariableToMessage(message, args.inMantissa);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLdexpFloat3IntFloat3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLdexpFloat3IntFloat3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLdexpFloat4IntFloat4() {
-        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x2901c7a869e4b7a9l, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x2901c5d0073508fel, false);
+        Allocation inMantissa = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x69e4b7a9l, false);
+        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x73508fel, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -459,11 +539,16 @@
 
     private void verifyResultsLdexpFloat4IntFloat4(Allocation inMantissa, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInMantissa = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInMantissa, (float) 42);
         inMantissa.copyTo(arrayInMantissa);
         int[] arrayInExponent = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInExponent, (int) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -479,27 +564,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMantissa: ");
-                    appendVariableToMessage(message, args.inMantissa);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inMantissa: ");
+                        appendVariableToMessage(message, args.inMantissa);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLdexpFloat4IntFloat4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLdexpFloat4IntFloat4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testLdexp() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLength.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLength.java
index 3aa7964..1e91f42 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLength.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLength.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestLength extends RSBaseCompute {
 
     private ScriptC_TestLength script;
@@ -40,7 +42,7 @@
     }
 
     private void checkLengthFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x8119352509f7cc9fl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9f7cc9fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testLengthFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsLengthFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatFloat args = new ArgumentsFloatFloat();
             // Create the appropriate sized arrays in args
@@ -76,23 +82,29 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                message.append("Input inV: ");
-                appendVariableToMessage(message, arrayInV[i]);
-                message.append("\n");
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    message.append("Input inV: ");
+                    appendVariableToMessage(message, arrayInV[i]);
+                    message.append("\n");
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
+                    message.append("\n");
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
+                    message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("\n");
-                assertTrue("Incorrect output for checkLengthFloatFloat" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkLengthFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatNFloat {
@@ -101,7 +113,7 @@
     }
 
     private void checkLengthFloat2Float() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xaf3b0f345dd9595dl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x5dd9595dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testLengthFloat2Float(inV, out);
@@ -120,9 +132,13 @@
 
     private void verifyResultsLengthFloat2Float(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloat args = new ArgumentsFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -140,29 +156,35 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, arrayInV[i * 2 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 2 ; j++) {
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, arrayInV[i * 2 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
+                    message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkLengthFloat2Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkLengthFloat2Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLengthFloat3Float() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xaf3b19d5bcdfe7bel, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xbcdfe7bel, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testLengthFloat3Float(inV, out);
@@ -181,9 +203,13 @@
 
     private void verifyResultsLengthFloat3Float(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloat args = new ArgumentsFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -201,29 +227,35 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, arrayInV[i * 4 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, arrayInV[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
+                    message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkLengthFloat3Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkLengthFloat3Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLengthFloat4Float() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xaf3b24771be6761fl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x1be6761fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testLengthFloat4Float(inV, out);
@@ -242,9 +274,13 @@
 
     private void verifyResultsLengthFloat4Float(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloat args = new ArgumentsFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -262,25 +298,31 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, arrayInV[i * 4 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, arrayInV[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
+                    message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkLengthFloat4Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkLengthFloat4Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testLength() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLgamma.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLgamma.java
index a9bf973..073be67 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLgamma.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLgamma.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestLgamma extends RSBaseCompute {
 
     private ScriptC_TestLgamma script;
@@ -40,7 +42,7 @@
     }
 
     private void checkLgammaFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd9395583050bc4bel, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x50bc4bel, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testLgammaFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsLgammaFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLgammaFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLgammaFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLgammaFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xeef55496367a4132l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x367a4132l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testLgammaFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsLgammaFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLgammaFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLgammaFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLgammaFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xeef71db12c956210l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x2c956210l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testLgammaFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsLgammaFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLgammaFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLgammaFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLgammaFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xeef8e6cc22b082eel, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x22b082eel, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testLgammaFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsLgammaFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLgammaFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLgammaFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatIntFloat {
@@ -274,7 +324,7 @@
     }
 
     private void checkLgammaFloatIntFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2a62d992979c4bb7l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x979c4bb7l, false);
         try {
             Allocation outSignOfGamma = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
@@ -297,11 +347,16 @@
 
     private void verifyResultsLgammaFloatIntFloat(Allocation inV, Allocation outSignOfGamma, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayOutSignOfGamma = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayOutSignOfGamma, (int) 42);
         outSignOfGamma.copyTo(arrayOutSignOfGamma);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -315,26 +370,34 @@
                 String errorMessage = CoreMathVerifier.verifyLgamma(args, target);
                 boolean valid = errorMessage == null;
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Output outSignOfGamma: ");
-                    appendVariableToMessage(message, args.outSignOfGamma);
-                    message.append("\n");
-                    message.append("Output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append(errorMessage);
-                    assertTrue("Incorrect output for checkLgammaFloatIntFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Output outSignOfGamma: ");
+                        appendVariableToMessage(message, args.outSignOfGamma);
+                        message.append("\n");
+                        message.append("Output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append(errorMessage);
+                        message.append("Errors at");
+                    }
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLgammaFloatIntFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLgammaFloat2Int2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x409fb9a5984bcf7fl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x984bcf7fl, false);
         try {
             Allocation outSignOfGamma = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
@@ -357,11 +420,16 @@
 
     private void verifyResultsLgammaFloat2Int2Float2(Allocation inV, Allocation outSignOfGamma, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayOutSignOfGamma = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOutSignOfGamma, (int) 42);
         outSignOfGamma.copyTo(arrayOutSignOfGamma);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -375,26 +443,34 @@
                 String errorMessage = CoreMathVerifier.verifyLgamma(args, target);
                 boolean valid = errorMessage == null;
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Output outSignOfGamma: ");
-                    appendVariableToMessage(message, args.outSignOfGamma);
-                    message.append("\n");
-                    message.append("Output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append(errorMessage);
-                    assertTrue("Incorrect output for checkLgammaFloat2Int2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Output outSignOfGamma: ");
+                        appendVariableToMessage(message, args.outSignOfGamma);
+                        message.append("\n");
+                        message.append("Output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append(errorMessage);
+                        message.append("Errors at");
+                    }
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLgammaFloat2Int2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLgammaFloat3Int3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6655f8088dfe3c38l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8dfe3c38l, false);
         try {
             Allocation outSignOfGamma = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
@@ -417,11 +493,16 @@
 
     private void verifyResultsLgammaFloat3Int3Float3(Allocation inV, Allocation outSignOfGamma, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayOutSignOfGamma = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOutSignOfGamma, (int) 42);
         outSignOfGamma.copyTo(arrayOutSignOfGamma);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -435,26 +516,34 @@
                 String errorMessage = CoreMathVerifier.verifyLgamma(args, target);
                 boolean valid = errorMessage == null;
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Output outSignOfGamma: ");
-                    appendVariableToMessage(message, args.outSignOfGamma);
-                    message.append("\n");
-                    message.append("Output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append(errorMessage);
-                    assertTrue("Incorrect output for checkLgammaFloat3Int3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Output outSignOfGamma: ");
+                        appendVariableToMessage(message, args.outSignOfGamma);
+                        message.append("\n");
+                        message.append("Output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append(errorMessage);
+                        message.append("Errors at");
+                    }
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLgammaFloat3Int3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLgammaFloat4Int4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8c0c366b83b0a8f1l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x83b0a8f1l, false);
         try {
             Allocation outSignOfGamma = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
@@ -477,11 +566,16 @@
 
     private void verifyResultsLgammaFloat4Int4Float4(Allocation inV, Allocation outSignOfGamma, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayOutSignOfGamma = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOutSignOfGamma, (int) 42);
         outSignOfGamma.copyTo(arrayOutSignOfGamma);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -495,22 +589,30 @@
                 String errorMessage = CoreMathVerifier.verifyLgamma(args, target);
                 boolean valid = errorMessage == null;
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Output outSignOfGamma: ");
-                    appendVariableToMessage(message, args.outSignOfGamma);
-                    message.append("\n");
-                    message.append("Output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append(errorMessage);
-                    assertTrue("Incorrect output for checkLgammaFloat4Int4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Output outSignOfGamma: ");
+                        appendVariableToMessage(message, args.outSignOfGamma);
+                        message.append("\n");
+                        message.append("Output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append(errorMessage);
+                        message.append("Errors at");
+                    }
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLgammaFloat4Int4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testLgamma() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog.java
index 59d612d..2cd529e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestLog extends RSBaseCompute {
 
     private ScriptC_TestLog script;
@@ -40,7 +42,7 @@
     }
 
     private void checkLogFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4176ec542a43578dl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2a43578dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testLogFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsLogFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLogFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLogFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLogFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd3cba12c04dd9a49l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4dd9a49l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testLogFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsLogFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLogFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLogFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLogFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd3cd6a46faf8bb27l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xfaf8bb27l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testLogFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsLogFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLogFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLogFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLogFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd3cf3361f113dc05l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf113dc05l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testLogFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsLogFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLogFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLogFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testLog() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog10.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog10.java
index 1271640..de534f0 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog10.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog10.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestLog10 extends RSBaseCompute {
 
     private ScriptC_TestLog10 script;
@@ -40,7 +42,7 @@
     }
 
     private void checkLog10FloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xba0ecdfe3171d836l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3171d836l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testLog10FloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsLog10FloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLog10FloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLog10FloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLog10Float2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd4c88639e3bcdeeal, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xe3bcdeeal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testLog10Float2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsLog10Float2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLog10Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLog10Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLog10Float3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd4ca4f54d9d7ffc8l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd9d7ffc8l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testLog10Float3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsLog10Float3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLog10Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLog10Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLog10Float4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd4cc186fcff320a6l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xcff320a6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testLog10Float4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsLog10Float4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLog10Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLog10Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testLog10() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog1p.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog1p.java
index 4cb23ba..3bc188a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog1p.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog1p.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestLog1p extends RSBaseCompute {
 
     private ScriptC_TestLog1p script;
@@ -40,7 +42,7 @@
     }
 
     private void checkLog1pFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x272c1ffe1744cef6l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x1744cef6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testLog1pFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsLog1pFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLog1pFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLog1pFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLog1pFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xed8dc77cd4750faal, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd4750faal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testLog1pFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsLog1pFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLog1pFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLog1pFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLog1pFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xed8f9097ca903088l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xca903088l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testLog1pFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsLog1pFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLog1pFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLog1pFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLog1pFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xed9159b2c0ab5166l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc0ab5166l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testLog1pFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsLog1pFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLog1pFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLog1pFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testLog1p() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog2.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog2.java
index 25676bf..ea4b352 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLog2.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestLog2 extends RSBaseCompute {
 
     private ScriptC_TestLog2 script;
@@ -40,7 +42,7 @@
     }
 
     private void checkLog2FloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9950067ec147dc6bl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc147dc6bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testLog2FloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsLog2FloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLog2FloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLog2FloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLog2Float2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x52d99ec8c48141b7l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc48141b7l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testLog2Float2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsLog2Float2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLog2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLog2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLog2Float3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x52db67e3ba9c6295l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xba9c6295l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testLog2Float3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsLog2Float3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLog2Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLog2Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLog2Float4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x52dd30feb0b78373l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb0b78373l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testLog2Float4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsLog2Float4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLog2Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLog2Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testLog2() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLogb.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLogb.java
index 67bd1c3..b351a39 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLogb.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestLogb.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestLogb extends RSBaseCompute {
 
     private ScriptC_TestLogb script;
@@ -40,7 +42,7 @@
     }
 
     private void checkLogbFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xab2603feada6157bl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xada6157bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testLogbFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsLogbFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLogbFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLogbFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLogbFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x256d8fbaf90b6647l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xf90b6647l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testLogbFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsLogbFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLogbFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLogbFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLogbFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x256f58d5ef268725l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xef268725l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testLogbFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsLogbFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLogbFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLogbFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkLogbFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x257121f0e541a803l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe541a803l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testLogbFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsLogbFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkLogbFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkLogbFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testLogb() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMad.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMad.java
index 4cbbf73..05060fb 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMad.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMad.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestMad extends RSBaseCompute {
 
     private ScriptC_TestMad script;
@@ -42,9 +44,9 @@
     }
 
     private void checkMadFloatFloatFloatFloat() {
-        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2a4461e340b4de48l, false);
-        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2a4461e340b4de49l, false);
-        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xcea3b86dc50ce0fcl, false);
+        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x40b4de48l, false);
+        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x40b4de49l, false);
+        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc50ce0fcl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInMultiplicand2(inMultiplicand2);
@@ -67,13 +69,19 @@
 
     private void verifyResultsMadFloatFloatFloatFloat(Allocation inMultiplicand1, Allocation inMultiplicand2, Allocation inOffset, Allocation out, boolean relaxed) {
         float[] arrayInMultiplicand1 = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInMultiplicand1, (float) 42);
         inMultiplicand1.copyTo(arrayInMultiplicand1);
         float[] arrayInMultiplicand2 = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInMultiplicand2, (float) 42);
         inMultiplicand2.copyTo(arrayInMultiplicand2);
         float[] arrayInOffset = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInOffset, (float) 42);
         inOffset.copyTo(arrayInOffset);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -90,36 +98,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMultiplicand1: ");
-                    appendVariableToMessage(message, args.inMultiplicand1);
-                    message.append("\n");
-                    message.append("Input inMultiplicand2: ");
-                    appendVariableToMessage(message, args.inMultiplicand2);
-                    message.append("\n");
-                    message.append("Input inOffset: ");
-                    appendVariableToMessage(message, args.inOffset);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inMultiplicand1: ");
+                        appendVariableToMessage(message, args.inMultiplicand1);
+                        message.append("\n");
+                        message.append("Input inMultiplicand2: ");
+                        appendVariableToMessage(message, args.inMultiplicand2);
+                        message.append("\n");
+                        message.append("Input inOffset: ");
+                        appendVariableToMessage(message, args.inOffset);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMadFloatFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMadFloatFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMadFloat2Float2Float2Float2() {
-        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdfffb28a8a5fd7c0l, false);
-        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdfffb28a8a5fd7c1l, false);
-        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3da8592f318f8924l, false);
+        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8a5fd7c0l, false);
+        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8a5fd7c1l, false);
+        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x318f8924l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInMultiplicand2(inMultiplicand2);
@@ -142,13 +158,19 @@
 
     private void verifyResultsMadFloat2Float2Float2Float2(Allocation inMultiplicand1, Allocation inMultiplicand2, Allocation inOffset, Allocation out, boolean relaxed) {
         float[] arrayInMultiplicand1 = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInMultiplicand1, (float) 42);
         inMultiplicand1.copyTo(arrayInMultiplicand1);
         float[] arrayInMultiplicand2 = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInMultiplicand2, (float) 42);
         inMultiplicand2.copyTo(arrayInMultiplicand2);
         float[] arrayInOffset = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInOffset, (float) 42);
         inOffset.copyTo(arrayInOffset);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -165,36 +187,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMultiplicand1: ");
-                    appendVariableToMessage(message, args.inMultiplicand1);
-                    message.append("\n");
-                    message.append("Input inMultiplicand2: ");
-                    appendVariableToMessage(message, args.inMultiplicand2);
-                    message.append("\n");
-                    message.append("Input inOffset: ");
-                    appendVariableToMessage(message, args.inOffset);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inMultiplicand1: ");
+                        appendVariableToMessage(message, args.inMultiplicand1);
+                        message.append("\n");
+                        message.append("Input inMultiplicand2: ");
+                        appendVariableToMessage(message, args.inMultiplicand2);
+                        message.append("\n");
+                        message.append("Input inOffset: ");
+                        appendVariableToMessage(message, args.inOffset);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMadFloat2Float2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMadFloat2Float2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMadFloat3Float3Float3Float3() {
-        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdd6226bde1551f1cl, false);
-        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdd6226bde1551f1dl, false);
-        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x117f5b0bfb77d218l, false);
+        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe1551f1cl, false);
+        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe1551f1dl, false);
+        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xfb77d218l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInMultiplicand2(inMultiplicand2);
@@ -217,13 +247,19 @@
 
     private void verifyResultsMadFloat3Float3Float3Float3(Allocation inMultiplicand1, Allocation inMultiplicand2, Allocation inOffset, Allocation out, boolean relaxed) {
         float[] arrayInMultiplicand1 = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInMultiplicand1, (float) 42);
         inMultiplicand1.copyTo(arrayInMultiplicand1);
         float[] arrayInMultiplicand2 = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInMultiplicand2, (float) 42);
         inMultiplicand2.copyTo(arrayInMultiplicand2);
         float[] arrayInOffset = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInOffset, (float) 42);
         inOffset.copyTo(arrayInOffset);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -240,36 +276,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMultiplicand1: ");
-                    appendVariableToMessage(message, args.inMultiplicand1);
-                    message.append("\n");
-                    message.append("Input inMultiplicand2: ");
-                    appendVariableToMessage(message, args.inMultiplicand2);
-                    message.append("\n");
-                    message.append("Input inOffset: ");
-                    appendVariableToMessage(message, args.inOffset);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inMultiplicand1: ");
+                        appendVariableToMessage(message, args.inMultiplicand1);
+                        message.append("\n");
+                        message.append("Input inMultiplicand2: ");
+                        appendVariableToMessage(message, args.inMultiplicand2);
+                        message.append("\n");
+                        message.append("Input inOffset: ");
+                        appendVariableToMessage(message, args.inOffset);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMadFloat3Float3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMadFloat3Float3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMadFloat4Float4Float4Float4() {
-        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xdac49af1384a6678l, false);
-        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xdac49af1384a6679l, false);
-        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe5565ce8c5601b0cl, false);
+        Allocation inMultiplicand1 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x384a6678l, false);
+        Allocation inMultiplicand2 = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x384a6679l, false);
+        Allocation inOffset = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc5601b0cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInMultiplicand2(inMultiplicand2);
@@ -292,13 +336,19 @@
 
     private void verifyResultsMadFloat4Float4Float4Float4(Allocation inMultiplicand1, Allocation inMultiplicand2, Allocation inOffset, Allocation out, boolean relaxed) {
         float[] arrayInMultiplicand1 = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInMultiplicand1, (float) 42);
         inMultiplicand1.copyTo(arrayInMultiplicand1);
         float[] arrayInMultiplicand2 = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInMultiplicand2, (float) 42);
         inMultiplicand2.copyTo(arrayInMultiplicand2);
         float[] arrayInOffset = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInOffset, (float) 42);
         inOffset.copyTo(arrayInOffset);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -315,30 +365,38 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inMultiplicand1: ");
-                    appendVariableToMessage(message, args.inMultiplicand1);
-                    message.append("\n");
-                    message.append("Input inMultiplicand2: ");
-                    appendVariableToMessage(message, args.inMultiplicand2);
-                    message.append("\n");
-                    message.append("Input inOffset: ");
-                    appendVariableToMessage(message, args.inOffset);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inMultiplicand1: ");
+                        appendVariableToMessage(message, args.inMultiplicand1);
+                        message.append("\n");
+                        message.append("Input inMultiplicand2: ");
+                        appendVariableToMessage(message, args.inMultiplicand2);
+                        message.append("\n");
+                        message.append("Input inOffset: ");
+                        appendVariableToMessage(message, args.inOffset);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMadFloat4Float4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMadFloat4Float4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testMad() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMax.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMax.java
index 042f0ae..961dafa 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMax.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMax.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestMax extends RSBaseCompute {
 
     private ScriptC_TestMax script;
@@ -41,8 +43,8 @@
     }
 
     private void checkMaxFloatFloatFloat() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2952d868c2162460l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2952d868c2162461l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc2162460l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc2162461l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -63,11 +65,16 @@
 
     private void verifyResultsMaxFloatFloatFloat(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxFloat2Float2Float2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc6031e7536addadal, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc6031e7536addadbl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x36addadal, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x36addadbl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -129,8 +144,245 @@
 
     private void verifyResultsMaxFloat2Float2Float2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (float) 42);
+        inB.copyTo(arrayInB);
+        float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
+        out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
+        for (int i = 0; i < INPUTSIZE; i++) {
+            for (int j = 0; j < 2 ; j++) {
+                // Extract the inputs.
+                ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
+                args.inA = arrayInA[i * 2 + j];
+                args.inB = arrayInB[i * 2 + j];
+                // Figure out what the outputs should have been.
+                Target target = new Target(relaxed);
+                CoreMathVerifier.computeMax(args, target);
+                // Validate the outputs.
+                boolean valid = true;
+                if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                    valid = false;
+                }
+                if (!valid) {
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
+                    }
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
+                }
+            }
+        }
+        assertFalse("Incorrect output for checkMaxFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
+    }
+
+    private void checkMaxFloat3Float3Float3() {
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x388bdc7bl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x388bdc7cl, false);
+        try {
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
+            script.set_gAllocInB(inB);
+            script.forEach_testMaxFloat3Float3Float3(inA, out);
+            verifyResultsMaxFloat3Float3Float3(inA, inB, out, false);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat3Float3Float3: " + e.toString());
+        }
+        try {
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
+            scriptRelaxed.set_gAllocInB(inB);
+            scriptRelaxed.forEach_testMaxFloat3Float3Float3(inA, out);
+            verifyResultsMaxFloat3Float3Float3(inA, inB, out, true);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat3Float3Float3: " + e.toString());
+        }
+    }
+
+    private void verifyResultsMaxFloat3Float3Float3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
+        float[] arrayInA = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (float) 42);
+        inA.copyTo(arrayInA);
+        float[] arrayInB = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (float) 42);
+        inB.copyTo(arrayInB);
+        float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
+        out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
+        for (int i = 0; i < INPUTSIZE; i++) {
+            for (int j = 0; j < 3 ; j++) {
+                // Extract the inputs.
+                ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
+                args.inA = arrayInA[i * 4 + j];
+                args.inB = arrayInB[i * 4 + j];
+                // Figure out what the outputs should have been.
+                Target target = new Target(relaxed);
+                CoreMathVerifier.computeMax(args, target);
+                // Validate the outputs.
+                boolean valid = true;
+                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    valid = false;
+                }
+                if (!valid) {
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
+                    }
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
+                }
+            }
+        }
+        assertFalse("Incorrect output for checkMaxFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
+    }
+
+    private void checkMaxFloat4Float4Float4() {
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3a69de1cl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3a69de1dl, false);
+        try {
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
+            script.set_gAllocInB(inB);
+            script.forEach_testMaxFloat4Float4Float4(inA, out);
+            verifyResultsMaxFloat4Float4Float4(inA, inB, out, false);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat4Float4Float4: " + e.toString());
+        }
+        try {
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
+            scriptRelaxed.set_gAllocInB(inB);
+            scriptRelaxed.forEach_testMaxFloat4Float4Float4(inA, out);
+            verifyResultsMaxFloat4Float4Float4(inA, inB, out, true);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat4Float4Float4: " + e.toString());
+        }
+    }
+
+    private void verifyResultsMaxFloat4Float4Float4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
+        float[] arrayInA = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (float) 42);
+        inA.copyTo(arrayInA);
+        float[] arrayInB = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (float) 42);
+        inB.copyTo(arrayInB);
+        float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
+        out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
+        for (int i = 0; i < INPUTSIZE; i++) {
+            for (int j = 0; j < 4 ; j++) {
+                // Extract the inputs.
+                ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
+                args.inA = arrayInA[i * 4 + j];
+                args.inB = arrayInB[i * 4 + j];
+                // Figure out what the outputs should have been.
+                Target target = new Target(relaxed);
+                CoreMathVerifier.computeMax(args, target);
+                // Validate the outputs.
+                boolean valid = true;
+                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    valid = false;
+                }
+                if (!valid) {
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
+                    }
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
+                }
+            }
+        }
+        assertFalse("Incorrect output for checkMaxFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
+    }
+
+    private void checkMaxFloat2FloatFloat2() {
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8592438l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x8592439l, false);
+        try {
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
+            script.set_gAllocInB(inB);
+            script.forEach_testMaxFloat2FloatFloat2(inA, out);
+            verifyResultsMaxFloat2FloatFloat2(inA, inB, out, false);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat2FloatFloat2: " + e.toString());
+        }
+        try {
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
+            scriptRelaxed.set_gAllocInB(inB);
+            scriptRelaxed.forEach_testMaxFloat2FloatFloat2(inA, out);
+            verifyResultsMaxFloat2FloatFloat2(inA, inB, out, true);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat2FloatFloat2: " + e.toString());
+        }
+    }
+
+    private void verifyResultsMaxFloat2FloatFloat2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
+        float[] arrayInA = new float[INPUTSIZE * 2];
+        inA.copyTo(arrayInA);
+        float[] arrayInB = new float[INPUTSIZE * 1];
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
@@ -139,7 +391,7 @@
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
                 args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inB = arrayInB[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMax(args, target);
@@ -165,38 +417,38 @@
                         message.append(" FAIL");
                     }
                     message.append("\n");
-                    assertTrue("Incorrect output for checkMaxFloat2Float2Float2" +
+                    assertTrue("Incorrect output for checkMaxFloat2FloatFloat2" +
                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
                 }
             }
         }
     }
 
-    private void checkMaxFloat3Float3Float3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1a67fc95388bdc7bl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1a67fc95388bdc7cl, false);
+    private void checkMaxFloat3FloatFloat3() {
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf6c41894l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf6c41895l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
-            script.forEach_testMaxFloat3Float3Float3(inA, out);
-            verifyResultsMaxFloat3Float3Float3(inA, inB, out, false);
+            script.forEach_testMaxFloat3FloatFloat3(inA, out);
+            verifyResultsMaxFloat3FloatFloat3(inA, inB, out, false);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat3Float3Float3: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat3FloatFloat3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxFloat3Float3Float3(inA, out);
-            verifyResultsMaxFloat3Float3Float3(inA, inB, out, true);
+            scriptRelaxed.forEach_testMaxFloat3FloatFloat3(inA, out);
+            verifyResultsMaxFloat3FloatFloat3(inA, inB, out, true);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat3Float3Float3: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat3FloatFloat3: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxFloat3Float3Float3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
+    private void verifyResultsMaxFloat3FloatFloat3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
         inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 4];
+        float[] arrayInB = new float[INPUTSIZE * 1];
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
@@ -205,7 +457,7 @@
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
                 args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inB = arrayInB[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMax(args, target);
@@ -231,38 +483,38 @@
                         message.append(" FAIL");
                     }
                     message.append("\n");
-                    assertTrue("Incorrect output for checkMaxFloat3Float3Float3" +
+                    assertTrue("Incorrect output for checkMaxFloat3FloatFloat3" +
                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
                 }
             }
         }
     }
 
-    private void checkMaxFloat4Float4Float4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6eccdab53a69de1cl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6eccdab53a69de1dl, false);
+    private void checkMaxFloat4FloatFloat4() {
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe52f0cf0l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe52f0cf1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
-            script.forEach_testMaxFloat4Float4Float4(inA, out);
-            verifyResultsMaxFloat4Float4Float4(inA, inB, out, false);
+            script.forEach_testMaxFloat4FloatFloat4(inA, out);
+            verifyResultsMaxFloat4FloatFloat4(inA, inB, out, false);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat4Float4Float4: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat4FloatFloat4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMaxFloat4Float4Float4(inA, out);
-            verifyResultsMaxFloat4Float4Float4(inA, inB, out, true);
+            scriptRelaxed.forEach_testMaxFloat4FloatFloat4(inA, out);
+            verifyResultsMaxFloat4FloatFloat4(inA, inB, out, true);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat4Float4Float4: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMaxFloat4FloatFloat4: " + e.toString());
         }
     }
 
-    private void verifyResultsMaxFloat4Float4Float4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
+    private void verifyResultsMaxFloat4FloatFloat4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
         inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 4];
+        float[] arrayInB = new float[INPUTSIZE * 1];
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
@@ -271,7 +523,7 @@
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
                 args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inB = arrayInB[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMax(args, target);
@@ -297,7 +549,7 @@
                         message.append(" FAIL");
                     }
                     message.append("\n");
-                    assertTrue("Incorrect output for checkMaxFloat4Float4Float4" +
+                    assertTrue("Incorrect output for checkMaxFloat4FloatFloat4" +
                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
                 }
             }
@@ -311,8 +563,8 @@
     }
 
     private void checkMaxCharCharChar() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x5f77cf3cb6405876l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x5f77cf3cb6405877l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0xb6405876l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0xb6405877l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -333,11 +585,16 @@
 
     private void verifyResultsMaxCharCharChar(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         byte[] arrayInA = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (byte) 42);
         inA.copyTo(arrayInA);
         byte[] arrayInB = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (byte) 42);
         inB.copyTo(arrayInB);
         byte[] arrayOut = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -352,32 +609,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxCharCharChar" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxCharCharChar" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxChar2Char2Char2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x94dd090a19e42804l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x94dd090a19e42805l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x19e42804l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x19e42805l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -398,11 +663,16 @@
 
     private void verifyResultsMaxChar2Char2Char2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         byte[] arrayInA = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (byte) 42);
         inA.copyTo(arrayInA);
         byte[] arrayInB = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (byte) 42);
         inB.copyTo(arrayInB);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -417,32 +687,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxChar2Char2Char2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxChar2Char2Char2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxChar3Char3Char3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xba9188f3788338d3l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0xba9188f3788338d4l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x788338d3l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x788338d4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -463,11 +741,16 @@
 
     private void verifyResultsMaxChar3Char3Char3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         byte[] arrayInA = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (byte) 42);
         inA.copyTo(arrayInA);
         byte[] arrayInB = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (byte) 42);
         inB.copyTo(arrayInB);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -482,32 +765,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxChar3Char3Char3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxChar3Char3Char3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxChar4Char4Char4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xe04608dcd72249a2l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xe04608dcd72249a3l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xd72249a2l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0xd72249a3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -528,11 +819,16 @@
 
     private void verifyResultsMaxChar4Char4Char4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         byte[] arrayInA = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (byte) 42);
         inA.copyTo(arrayInA);
         byte[] arrayInB = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (byte) 42);
         inB.copyTo(arrayInB);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -547,27 +843,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxChar4Char4Char4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxChar4Char4Char4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUcharUcharUchar {
@@ -577,8 +881,8 @@
     }
 
     private void checkMaxUcharUcharUchar() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x800f9948853a162dl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x800f9948853a162el, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x853a162dl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x853a162el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -599,11 +903,16 @@
 
     private void verifyResultsMaxUcharUcharUchar(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         byte[] arrayInA = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (byte) 42);
         inA.copyTo(arrayInA);
         byte[] arrayInB = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (byte) 42);
         inB.copyTo(arrayInB);
         byte[] arrayOut = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -618,32 +927,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxUcharUcharUchar" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxUcharUcharUchar" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxUchar2Uchar2Uchar2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0xd31d5735b7e9a9dbl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0xd31d5735b7e9a9dcl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0xb7e9a9dbl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0xb7e9a9dcl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -664,11 +981,16 @@
 
     private void verifyResultsMaxUchar2Uchar2Uchar2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         byte[] arrayInA = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (byte) 42);
         inA.copyTo(arrayInA);
         byte[] arrayInB = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (byte) 42);
         inB.copyTo(arrayInB);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -683,32 +1005,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxUchar2Uchar2Uchar2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxUchar2Uchar2Uchar2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxUchar3Uchar3Uchar3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x27823555b9c7ab7cl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x27823555b9c7ab7dl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0xb9c7ab7cl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0xb9c7ab7dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -729,11 +1059,16 @@
 
     private void verifyResultsMaxUchar3Uchar3Uchar3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         byte[] arrayInA = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (byte) 42);
         inA.copyTo(arrayInA);
         byte[] arrayInB = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (byte) 42);
         inB.copyTo(arrayInB);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -748,32 +1083,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxUchar3Uchar3Uchar3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxUchar3Uchar3Uchar3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxUchar4Uchar4Uchar4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7be71375bba5ad1dl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0x7be71375bba5ad1el, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0xbba5ad1dl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0xbba5ad1el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -794,11 +1137,16 @@
 
     private void verifyResultsMaxUchar4Uchar4Uchar4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         byte[] arrayInA = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (byte) 42);
         inA.copyTo(arrayInA);
         byte[] arrayInB = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (byte) 42);
         inB.copyTo(arrayInB);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -813,27 +1161,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxUchar4Uchar4Uchar4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxUchar4Uchar4Uchar4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsShortShortShort {
@@ -843,8 +1199,8 @@
     }
 
     private void checkMaxShortShortShort() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x920335e143b57294l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x920335e143b57295l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x43b57294l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x43b57295l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -865,11 +1221,16 @@
 
     private void verifyResultsMaxShortShortShort(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         short[] arrayInA = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (short) 42);
         inA.copyTo(arrayInA);
         short[] arrayInB = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (short) 42);
         inB.copyTo(arrayInB);
         short[] arrayOut = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -884,32 +1245,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxShortShortShort" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxShortShortShort" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxShort2Short2Short2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x42e9d46b56ecb9del, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x42e9d46b56ecb9dfl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x56ecb9del, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x56ecb9dfl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -930,11 +1299,16 @@
 
     private void verifyResultsMaxShort2Short2Short2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         short[] arrayInA = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (short) 42);
         inA.copyTo(arrayInA);
         short[] arrayInB = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (short) 42);
         inB.copyTo(arrayInB);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -949,32 +1323,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxShort2Short2Short2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxShort2Short2Short2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxShort3Short3Short3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x974eb28b58cabb7fl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x974eb28b58cabb80l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x58cabb7fl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x58cabb80l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -995,11 +1377,16 @@
 
     private void verifyResultsMaxShort3Short3Short3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         short[] arrayInA = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (short) 42);
         inA.copyTo(arrayInA);
         short[] arrayInB = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (short) 42);
         inB.copyTo(arrayInB);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -1014,32 +1401,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxShort3Short3Short3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxShort3Short3Short3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxShort4Short4Short4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xebb390ab5aa8bd20l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0xebb390ab5aa8bd21l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x5aa8bd20l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x5aa8bd21l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1060,11 +1455,16 @@
 
     private void verifyResultsMaxShort4Short4Short4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         short[] arrayInA = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (short) 42);
         inA.copyTo(arrayInA);
         short[] arrayInB = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (short) 42);
         inB.copyTo(arrayInB);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -1079,27 +1479,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxShort4Short4Short4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxShort4Short4Short4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUshortUshortUshort {
@@ -1109,8 +1517,8 @@
     }
 
     private void checkMaxUshortUshortUshort() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0x8f869c73b947704bl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0x8f869c73b947704cl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xb947704bl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xb947704cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1131,11 +1539,16 @@
 
     private void verifyResultsMaxUshortUshortUshort(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         short[] arrayInA = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (short) 42);
         inA.copyTo(arrayInA);
         short[] arrayInB = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (short) 42);
         inB.copyTo(arrayInB);
         short[] arrayOut = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -1150,32 +1563,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxUshortUshortUshort" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxUshortUshortUshort" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxUshort2Ushort2Ushort2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xbe3c50e6150b1f95l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0xbe3c50e6150b1f96l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x150b1f95l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x150b1f96l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1196,11 +1617,16 @@
 
     private void verifyResultsMaxUshort2Ushort2Ushort2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         short[] arrayInA = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (short) 42);
         inA.copyTo(arrayInA);
         short[] arrayInB = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (short) 42);
         inB.copyTo(arrayInB);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -1215,32 +1641,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxUshort2Ushort2Ushort2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxUshort2Ushort2Ushort2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxUshort3Ushort3Ushort3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x3e2be9df5df0112cl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x3e2be9df5df0112dl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x5df0112cl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0x5df0112dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1261,11 +1695,16 @@
 
     private void verifyResultsMaxUshort3Ushort3Ushort3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         short[] arrayInA = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (short) 42);
         inA.copyTo(arrayInA);
         short[] arrayInB = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (short) 42);
         inB.copyTo(arrayInB);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -1280,32 +1719,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxUshort3Ushort3Ushort3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxUshort3Ushort3Ushort3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxUshort4Ushort4Ushort4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xbe1b82d8a6d502c3l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xbe1b82d8a6d502c4l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xa6d502c3l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0xa6d502c4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1326,11 +1773,16 @@
 
     private void verifyResultsMaxUshort4Ushort4Ushort4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         short[] arrayInA = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (short) 42);
         inA.copyTo(arrayInA);
         short[] arrayInB = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (short) 42);
         inB.copyTo(arrayInB);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -1345,27 +1797,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxUshort4Ushort4Ushort4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxUshort4Ushort4Ushort4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsIntIntInt {
@@ -1375,8 +1835,8 @@
     }
 
     private void checkMaxIntIntInt() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x773d0d60e43d0fa9l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x773d0d60e43d0faal, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xe43d0fa9l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xe43d0faal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1397,11 +1857,16 @@
 
     private void verifyResultsMaxIntIntInt(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         int[] arrayInA = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (int) 42);
         inA.copyTo(arrayInA);
         int[] arrayInB = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (int) 42);
         inB.copyTo(arrayInB);
         int[] arrayOut = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -1416,32 +1881,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxIntIntInt" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxIntIntInt" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxInt2Int2Int2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x32815a01bb9dccd7l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x32815a01bb9dccd8l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xbb9dccd7l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xbb9dccd8l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1462,11 +1935,16 @@
 
     private void verifyResultsMaxInt2Int2Int2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         int[] arrayInA = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (int) 42);
         inA.copyTo(arrayInA);
         int[] arrayInB = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (int) 42);
         inB.copyTo(arrayInB);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -1481,32 +1959,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxInt2Int2Int2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxInt2Int2Int2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxInt3Int3Int3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x3f66ddfc867314c0l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x3f66ddfc867314c1l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x867314c0l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x867314c1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1527,11 +2013,16 @@
 
     private void verifyResultsMaxInt3Int3Int3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         int[] arrayInA = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (int) 42);
         inA.copyTo(arrayInA);
         int[] arrayInB = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (int) 42);
         inB.copyTo(arrayInB);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -1546,32 +2037,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxInt3Int3Int3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxInt3Int3Int3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxInt4Int4Int4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x4c4c61f751485ca9l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x4c4c61f751485caal, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x51485ca9l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x51485caal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1592,11 +2091,16 @@
 
     private void verifyResultsMaxInt4Int4Int4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         int[] arrayInA = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (int) 42);
         inA.copyTo(arrayInA);
         int[] arrayInB = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (int) 42);
         inB.copyTo(arrayInB);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -1611,27 +2115,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxInt4Int4Int4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxInt4Int4Int4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUintUintUint {
@@ -1641,8 +2153,8 @@
     }
 
     private void checkMaxUintUintUint() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xcd24e58385f73e36l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xcd24e58385f73e37l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0x85f73e36l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0x85f73e37l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1663,11 +2175,16 @@
 
     private void verifyResultsMaxUintUintUint(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         int[] arrayInA = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (int) 42);
         inA.copyTo(arrayInA);
         int[] arrayInB = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (int) 42);
         inB.copyTo(arrayInB);
         int[] arrayOut = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -1682,32 +2199,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxUintUintUint" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxUintUintUint" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxUint2Uint2Uint2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xbd5747860e84d6c4l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xbd5747860e84d6c5l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xe84d6c4l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xe84d6c5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1728,11 +2253,16 @@
 
     private void verifyResultsMaxUint2Uint2Uint2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         int[] arrayInA = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (int) 42);
         inA.copyTo(arrayInA);
         int[] arrayInB = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (int) 42);
         inB.copyTo(arrayInB);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -1747,32 +2277,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxUint2Uint2Uint2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxUint2Uint2Uint2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxUint3Uint3Uint3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xe30bc76f6d23e793l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0xe30bc76f6d23e794l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x6d23e793l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x6d23e794l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1793,11 +2331,16 @@
 
     private void verifyResultsMaxUint3Uint3Uint3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         int[] arrayInA = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (int) 42);
         inA.copyTo(arrayInA);
         int[] arrayInB = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (int) 42);
         inB.copyTo(arrayInB);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -1812,32 +2355,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxUint3Uint3Uint3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxUint3Uint3Uint3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxUint4Uint4Uint4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x8c04758cbc2f862l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x8c04758cbc2f863l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xcbc2f862l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0xcbc2f863l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1858,11 +2409,16 @@
 
     private void verifyResultsMaxUint4Uint4Uint4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         int[] arrayInA = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (int) 42);
         inA.copyTo(arrayInA);
         int[] arrayInB = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (int) 42);
         inB.copyTo(arrayInB);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -1877,27 +2433,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxUint4Uint4Uint4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxUint4Uint4Uint4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsLongLongLong {
@@ -1907,8 +2471,8 @@
     }
 
     private void checkMaxLongLongLong() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x542587285eceb84l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x542587285eceb85l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x85eceb84l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x85eceb85l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1929,11 +2493,16 @@
 
     private void verifyResultsMaxLongLongLong(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         long[] arrayInA = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (long) 42);
         inA.copyTo(arrayInA);
         long[] arrayInB = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (long) 42);
         inB.copyTo(arrayInB);
         long[] arrayOut = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -1948,32 +2517,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxLongLongLong" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxLongLongLong" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxLong2Long2Long2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xc5c0bac4c249c9dal, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xc5c0bac4c249c9dbl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xc249c9dal, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0xc249c9dbl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1994,11 +2571,16 @@
 
     private void verifyResultsMaxLong2Long2Long2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         long[] arrayInA = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (long) 42);
         inA.copyTo(arrayInA);
         long[] arrayInB = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (long) 42);
         inB.copyTo(arrayInB);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -2013,32 +2595,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxLong2Long2Long2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxLong2Long2Long2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxLong3Long3Long3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xeb753aae20e8daa9l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xeb753aae20e8daaal, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x20e8daa9l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x20e8daaal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -2059,11 +2649,16 @@
 
     private void verifyResultsMaxLong3Long3Long3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         long[] arrayInA = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (long) 42);
         inA.copyTo(arrayInA);
         long[] arrayInB = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (long) 42);
         inB.copyTo(arrayInB);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -2078,32 +2673,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxLong3Long3Long3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxLong3Long3Long3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxLong4Long4Long4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x1129ba977f87eb78l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x1129ba977f87eb79l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x7f87eb78l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x7f87eb79l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -2124,11 +2727,16 @@
 
     private void verifyResultsMaxLong4Long4Long4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         long[] arrayInA = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (long) 42);
         inA.copyTo(arrayInA);
         long[] arrayInB = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (long) 42);
         inB.copyTo(arrayInB);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -2143,27 +2751,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxLong4Long4Long4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxLong4Long4Long4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUlongUlongUlong {
@@ -2173,8 +2789,8 @@
     }
 
     private void checkMaxUlongUlongUlong() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x8d1ad8f38f18baafl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x8d1ad8f38f18bab0l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x8f18baafl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x8f18bab0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -2195,11 +2811,16 @@
 
     private void verifyResultsMaxUlongUlongUlong(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         long[] arrayInA = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (long) 42);
         inA.copyTo(arrayInA);
         long[] arrayInB = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (long) 42);
         inB.copyTo(arrayInB);
         long[] arrayOut = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -2214,32 +2835,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxUlongUlongUlong" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxUlongUlongUlong" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxUlong2Ulong2Ulong2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x6e2049a55946bc65l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x6e2049a55946bc66l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x5946bc65l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x5946bc66l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -2260,11 +2889,16 @@
 
     private void verifyResultsMaxUlong2Ulong2Ulong2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         long[] arrayInA = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (long) 42);
         inA.copyTo(arrayInA);
         long[] arrayInB = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (long) 42);
         inB.copyTo(arrayInB);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -2279,32 +2913,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxUlong2Ulong2Ulong2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxUlong2Ulong2Ulong2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxUlong3Ulong3Ulong3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0xc28527c55b24be06l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0xc28527c55b24be07l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x5b24be06l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x5b24be07l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -2325,11 +2967,16 @@
 
     private void verifyResultsMaxUlong3Ulong3Ulong3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         long[] arrayInA = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (long) 42);
         inA.copyTo(arrayInA);
         long[] arrayInB = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (long) 42);
         inB.copyTo(arrayInB);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -2344,32 +2991,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxUlong3Ulong3Ulong3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxUlong3Ulong3Ulong3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMaxUlong4Ulong4Ulong4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x16ea05e55d02bfa7l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x16ea05e55d02bfa8l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x5d02bfa7l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x5d02bfa8l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -2390,11 +3045,16 @@
 
     private void verifyResultsMaxUlong4Ulong4Ulong4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         long[] arrayInA = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (long) 42);
         inA.copyTo(arrayInA);
         long[] arrayInB = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (long) 42);
         inB.copyTo(arrayInB);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -2409,27 +3069,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMaxUlong4Ulong4Ulong4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMaxUlong4Ulong4Ulong4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testMax() {
@@ -2437,6 +3105,9 @@
         checkMaxFloat2Float2Float2();
         checkMaxFloat3Float3Float3();
         checkMaxFloat4Float4Float4();
+        checkMaxFloat2FloatFloat2();
+        checkMaxFloat3FloatFloat3();
+        checkMaxFloat4FloatFloat4();
         checkMaxCharCharChar();
         checkMaxChar2Char2Char2();
         checkMaxChar3Char3Char3();
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMax.rs b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMax.rs
index b582b0d..a9ca895 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMax.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMax.rs
@@ -41,6 +41,21 @@
     return max(inA, inB);
 }
 
+float2 __attribute__((kernel)) testMaxFloat2FloatFloat2(float2 inA, unsigned int x) {
+    float inB = rsGetElementAt_float(gAllocInB, x);
+    return max(inA, inB);
+}
+
+float3 __attribute__((kernel)) testMaxFloat3FloatFloat3(float3 inA, unsigned int x) {
+    float inB = rsGetElementAt_float(gAllocInB, x);
+    return max(inA, inB);
+}
+
+float4 __attribute__((kernel)) testMaxFloat4FloatFloat4(float4 inA, unsigned int x) {
+    float inB = rsGetElementAt_float(gAllocInB, x);
+    return max(inA, inB);
+}
+
 char __attribute__((kernel)) testMaxCharCharChar(char inA, unsigned int x) {
     char inB = rsGetElementAt_char(gAllocInB, x);
     return max(inA, inB);
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMin.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMin.java
index be77bac..f71fac8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMin.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestMin extends RSBaseCompute {
 
     private ScriptC_TestMin script;
@@ -41,8 +43,8 @@
     }
 
     private void checkMinFloatFloatFloat() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xbdad0b097121573el, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xbdad0b097121573fl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7121573el, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7121573fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -63,11 +65,16 @@
 
     private void verifyResultsMinFloatFloatFloat(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinFloat2Float2Float2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2f1cc4b149b4e454l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2f1cc4b149b4e455l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x49b4e454l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x49b4e455l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -129,8 +144,245 @@
 
     private void verifyResultsMinFloat2Float2Float2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (float) 42);
+        inB.copyTo(arrayInB);
+        float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
+        out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
+        for (int i = 0; i < INPUTSIZE; i++) {
+            for (int j = 0; j < 2 ; j++) {
+                // Extract the inputs.
+                ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
+                args.inA = arrayInA[i * 2 + j];
+                args.inB = arrayInB[i * 2 + j];
+                // Figure out what the outputs should have been.
+                Target target = new Target(relaxed);
+                CoreMathVerifier.computeMin(args, target);
+                // Validate the outputs.
+                boolean valid = true;
+                if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                    valid = false;
+                }
+                if (!valid) {
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
+                    }
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
+                }
+            }
+        }
+        assertFalse("Incorrect output for checkMinFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
+    }
+
+    private void checkMinFloat3Float3Float3() {
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x4b92e5f5l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x4b92e5f6l, false);
+        try {
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
+            script.set_gAllocInB(inB);
+            script.forEach_testMinFloat3Float3Float3(inA, out);
+            verifyResultsMinFloat3Float3Float3(inA, inB, out, false);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat3Float3Float3: " + e.toString());
+        }
+        try {
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
+            scriptRelaxed.set_gAllocInB(inB);
+            scriptRelaxed.forEach_testMinFloat3Float3Float3(inA, out);
+            verifyResultsMinFloat3Float3Float3(inA, inB, out, true);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat3Float3Float3: " + e.toString());
+        }
+    }
+
+    private void verifyResultsMinFloat3Float3Float3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
+        float[] arrayInA = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (float) 42);
+        inA.copyTo(arrayInA);
+        float[] arrayInB = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (float) 42);
+        inB.copyTo(arrayInB);
+        float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
+        out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
+        for (int i = 0; i < INPUTSIZE; i++) {
+            for (int j = 0; j < 3 ; j++) {
+                // Extract the inputs.
+                ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
+                args.inA = arrayInA[i * 4 + j];
+                args.inB = arrayInB[i * 4 + j];
+                // Figure out what the outputs should have been.
+                Target target = new Target(relaxed);
+                CoreMathVerifier.computeMin(args, target);
+                // Validate the outputs.
+                boolean valid = true;
+                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    valid = false;
+                }
+                if (!valid) {
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
+                    }
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
+                }
+            }
+        }
+        assertFalse("Incorrect output for checkMinFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
+    }
+
+    private void checkMinFloat4Float4Float4() {
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4d70e796l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4d70e797l, false);
+        try {
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
+            script.set_gAllocInB(inB);
+            script.forEach_testMinFloat4Float4Float4(inA, out);
+            verifyResultsMinFloat4Float4Float4(inA, inB, out, false);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat4Float4Float4: " + e.toString());
+        }
+        try {
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
+            scriptRelaxed.set_gAllocInB(inB);
+            scriptRelaxed.forEach_testMinFloat4Float4Float4(inA, out);
+            verifyResultsMinFloat4Float4Float4(inA, inB, out, true);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat4Float4Float4: " + e.toString());
+        }
+    }
+
+    private void verifyResultsMinFloat4Float4Float4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
+        float[] arrayInA = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (float) 42);
+        inA.copyTo(arrayInA);
+        float[] arrayInB = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (float) 42);
+        inB.copyTo(arrayInB);
+        float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
+        out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
+        for (int i = 0; i < INPUTSIZE; i++) {
+            for (int j = 0; j < 4 ; j++) {
+                // Extract the inputs.
+                ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
+                args.inA = arrayInA[i * 4 + j];
+                args.inB = arrayInB[i * 4 + j];
+                // Figure out what the outputs should have been.
+                Target target = new Target(relaxed);
+                CoreMathVerifier.computeMin(args, target);
+                // Validate the outputs.
+                boolean valid = true;
+                if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                    valid = false;
+                }
+                if (!valid) {
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
+                    }
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
+                }
+            }
+        }
+        assertFalse("Incorrect output for checkMinFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
+    }
+
+    private void checkMinFloat2FloatFloat2() {
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x503b89a6l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x503b89a7l, false);
+        try {
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
+            script.set_gAllocInB(inB);
+            script.forEach_testMinFloat2FloatFloat2(inA, out);
+            verifyResultsMinFloat2FloatFloat2(inA, inB, out, false);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat2FloatFloat2: " + e.toString());
+        }
+        try {
+            Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
+            scriptRelaxed.set_gAllocInB(inB);
+            scriptRelaxed.forEach_testMinFloat2FloatFloat2(inA, out);
+            verifyResultsMinFloat2FloatFloat2(inA, inB, out, true);
+        } catch (Exception e) {
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat2FloatFloat2: " + e.toString());
+        }
+    }
+
+    private void verifyResultsMinFloat2FloatFloat2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
+        float[] arrayInA = new float[INPUTSIZE * 2];
+        inA.copyTo(arrayInA);
+        float[] arrayInB = new float[INPUTSIZE * 1];
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 2];
         out.copyTo(arrayOut);
@@ -139,7 +391,7 @@
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
                 args.inA = arrayInA[i * 2 + j];
-                args.inB = arrayInB[i * 2 + j];
+                args.inB = arrayInB[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMin(args, target);
@@ -165,38 +417,38 @@
                         message.append(" FAIL");
                     }
                     message.append("\n");
-                    assertTrue("Incorrect output for checkMinFloat2Float2Float2" +
+                    assertTrue("Incorrect output for checkMinFloat2FloatFloat2" +
                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
                 }
             }
         }
     }
 
-    private void checkMinFloat3Float3Float3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8381a2d14b92e5f5l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8381a2d14b92e5f6l, false);
+    private void checkMinFloat3FloatFloat3() {
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3ea67e02l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3ea67e03l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
-            script.forEach_testMinFloat3Float3Float3(inA, out);
-            verifyResultsMinFloat3Float3Float3(inA, inB, out, false);
+            script.forEach_testMinFloat3FloatFloat3(inA, out);
+            verifyResultsMinFloat3FloatFloat3(inA, inB, out, false);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat3Float3Float3: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat3FloatFloat3: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinFloat3Float3Float3(inA, out);
-            verifyResultsMinFloat3Float3Float3(inA, inB, out, true);
+            scriptRelaxed.forEach_testMinFloat3FloatFloat3(inA, out);
+            verifyResultsMinFloat3FloatFloat3(inA, inB, out, true);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat3Float3Float3: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat3FloatFloat3: " + e.toString());
         }
     }
 
-    private void verifyResultsMinFloat3Float3Float3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
+    private void verifyResultsMinFloat3FloatFloat3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
         inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 4];
+        float[] arrayInB = new float[INPUTSIZE * 1];
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
@@ -205,7 +457,7 @@
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
                 args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inB = arrayInB[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMin(args, target);
@@ -231,38 +483,38 @@
                         message.append(" FAIL");
                     }
                     message.append("\n");
-                    assertTrue("Incorrect output for checkMinFloat3Float3Float3" +
+                    assertTrue("Incorrect output for checkMinFloat3FloatFloat3" +
                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
                 }
             }
         }
     }
 
-    private void checkMinFloat4Float4Float4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd7e680f14d70e796l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd7e680f14d70e797l, false);
+    private void checkMinFloat4FloatFloat4() {
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x2d11725el, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2d11725fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
-            script.forEach_testMinFloat4Float4Float4(inA, out);
-            verifyResultsMinFloat4Float4Float4(inA, inB, out, false);
+            script.forEach_testMinFloat4FloatFloat4(inA, out);
+            verifyResultsMinFloat4FloatFloat4(inA, inB, out, false);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat4Float4Float4: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat4FloatFloat4: " + e.toString());
         }
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             scriptRelaxed.set_gAllocInB(inB);
-            scriptRelaxed.forEach_testMinFloat4Float4Float4(inA, out);
-            verifyResultsMinFloat4Float4Float4(inA, inB, out, true);
+            scriptRelaxed.forEach_testMinFloat4FloatFloat4(inA, out);
+            verifyResultsMinFloat4FloatFloat4(inA, inB, out, true);
         } catch (Exception e) {
-            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat4Float4Float4: " + e.toString());
+            throw new RSRuntimeException("RenderScript. Can't invoke forEach_testMinFloat4FloatFloat4: " + e.toString());
         }
     }
 
-    private void verifyResultsMinFloat4Float4Float4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
+    private void verifyResultsMinFloat4FloatFloat4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
         inA.copyTo(arrayInA);
-        float[] arrayInB = new float[INPUTSIZE * 4];
+        float[] arrayInB = new float[INPUTSIZE * 1];
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 4];
         out.copyTo(arrayOut);
@@ -271,7 +523,7 @@
                 // Extract the inputs.
                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
                 args.inA = arrayInA[i * 4 + j];
-                args.inB = arrayInB[i * 4 + j];
+                args.inB = arrayInB[i];
                 // Figure out what the outputs should have been.
                 Target target = new Target(relaxed);
                 CoreMathVerifier.computeMin(args, target);
@@ -297,7 +549,7 @@
                         message.append(" FAIL");
                     }
                     message.append("\n");
-                    assertTrue("Incorrect output for checkMinFloat4Float4Float4" +
+                    assertTrue("Incorrect output for checkMinFloat4FloatFloat4" +
                             (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
                 }
             }
@@ -311,8 +563,8 @@
     }
 
     private void checkMinCharCharChar() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x78bd3bd20e8196e0l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0x78bd3bd20e8196e1l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0xe8196e0l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 1, 0xe8196e1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -333,11 +585,16 @@
 
     private void verifyResultsMinCharCharChar(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         byte[] arrayInA = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (byte) 42);
         inA.copyTo(arrayInA);
         byte[] arrayInB = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (byte) 42);
         inB.copyTo(arrayInB);
         byte[] arrayOut = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -352,32 +609,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinCharCharChar" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinCharCharChar" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinChar2Char2Char2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x29373baac8ef5ae2l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0x29373baac8ef5ae3l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xc8ef5ae2l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 2, 0xc8ef5ae3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -398,11 +663,16 @@
 
     private void verifyResultsMinChar2Char2Char2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         byte[] arrayInA = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (byte) 42);
         inA.copyTo(arrayInA);
         byte[] arrayInB = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (byte) 42);
         inB.copyTo(arrayInB);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -417,32 +687,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinChar2Char2Char2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinChar2Char2Char2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinChar3Char3Char3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x4eebbb94278e6bb1l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x4eebbb94278e6bb2l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x278e6bb1l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 3, 0x278e6bb2l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -463,11 +741,16 @@
 
     private void verifyResultsMinChar3Char3Char3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         byte[] arrayInA = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (byte) 42);
         inA.copyTo(arrayInA);
         byte[] arrayInB = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (byte) 42);
         inB.copyTo(arrayInB);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -482,32 +765,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinChar3Char3Char3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinChar3Char3Char3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinChar4Char4Char4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x74a03b7d862d7c80l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x74a03b7d862d7c81l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x862d7c80l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_8, 4, 0x862d7c81l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_8, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -528,11 +819,16 @@
 
     private void verifyResultsMinChar4Char4Char4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         byte[] arrayInA = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (byte) 42);
         inA.copyTo(arrayInA);
         byte[] arrayInB = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (byte) 42);
         inB.copyTo(arrayInB);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -547,27 +843,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinChar4Char4Char4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinChar4Char4Char4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUcharUcharUchar {
@@ -577,8 +881,8 @@
     }
 
     private void checkMinUcharUcharUchar() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x1469cbe93445490bl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x1469cbe93445490cl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x3445490bl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 1, 0x3445490cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -599,11 +903,16 @@
 
     private void verifyResultsMinUcharUcharUchar(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         byte[] arrayInA = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (byte) 42);
         inA.copyTo(arrayInA);
         byte[] arrayInB = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (byte) 42);
         inB.copyTo(arrayInB);
         byte[] arrayOut = new byte[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -618,32 +927,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinUcharUcharUchar" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinUcharUcharUchar" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinUchar2Uchar2Uchar2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x3c36fd71caf0b355l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0x3c36fd71caf0b356l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0xcaf0b355l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 2, 0xcaf0b356l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -664,11 +981,16 @@
 
     private void verifyResultsMinUchar2Uchar2Uchar2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         byte[] arrayInA = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (byte) 42);
         inA.copyTo(arrayInA);
         byte[] arrayInB = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (byte) 42);
         inB.copyTo(arrayInB);
         byte[] arrayOut = new byte[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -683,32 +1005,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinUchar2Uchar2Uchar2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinUchar2Uchar2Uchar2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinUchar3Uchar3Uchar3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x909bdb91ccceb4f6l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0x909bdb91ccceb4f7l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0xccceb4f6l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 3, 0xccceb4f7l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -729,11 +1059,16 @@
 
     private void verifyResultsMinUchar3Uchar3Uchar3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         byte[] arrayInA = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (byte) 42);
         inA.copyTo(arrayInA);
         byte[] arrayInB = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (byte) 42);
         inB.copyTo(arrayInB);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -748,32 +1083,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinUchar3Uchar3Uchar3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinUchar3Uchar3Uchar3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinUchar4Uchar4Uchar4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0xe500b9b1ceacb697l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0xe500b9b1ceacb698l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0xceacb697l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_8, 4, 0xceacb698l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_8, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -794,11 +1137,16 @@
 
     private void verifyResultsMinUchar4Uchar4Uchar4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         byte[] arrayInA = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (byte) 42);
         inA.copyTo(arrayInA);
         byte[] arrayInB = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (byte) 42);
         inB.copyTo(arrayInB);
         byte[] arrayOut = new byte[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (byte) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -813,27 +1161,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinUchar4Uchar4Uchar4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinUchar4Uchar4Uchar4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsShortShortShort {
@@ -843,8 +1199,8 @@
     }
 
     private void checkMinShortShortShort() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x265d6881f2c0a572l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0x265d6881f2c0a573l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0xf2c0a572l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 1, 0xf2c0a573l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -865,11 +1221,16 @@
 
     private void verifyResultsMinShortShortShort(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         short[] arrayInA = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (short) 42);
         inA.copyTo(arrayInA);
         short[] arrayInB = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (short) 42);
         inB.copyTo(arrayInB);
         short[] arrayOut = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -884,32 +1245,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinShortShortShort" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinShortShortShort" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinShort2Short2Short2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0xac037aa769f3c358l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0xac037aa769f3c359l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x69f3c358l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 2, 0x69f3c359l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -930,11 +1299,16 @@
 
     private void verifyResultsMinShort2Short2Short2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         short[] arrayInA = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (short) 42);
         inA.copyTo(arrayInA);
         short[] arrayInB = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (short) 42);
         inB.copyTo(arrayInB);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -949,32 +1323,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinShort2Short2Short2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinShort2Short2Short2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinShort3Short3Short3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x6858c76bd1c4f9l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x6858c76bd1c4fal, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x6bd1c4f9l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 3, 0x6bd1c4fal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -995,11 +1377,16 @@
 
     private void verifyResultsMinShort3Short3Short3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         short[] arrayInA = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (short) 42);
         inA.copyTo(arrayInA);
         short[] arrayInB = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (short) 42);
         inB.copyTo(arrayInB);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -1014,32 +1401,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinShort3Short3Short3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinShort3Short3Short3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinShort4Short4Short4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x54cd36e76dafc69al, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x54cd36e76dafc69bl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x6dafc69al, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_16, 4, 0x6dafc69bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_16, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1060,11 +1455,16 @@
 
     private void verifyResultsMinShort4Short4Short4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         short[] arrayInA = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (short) 42);
         inA.copyTo(arrayInA);
         short[] arrayInB = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (short) 42);
         inB.copyTo(arrayInB);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -1079,27 +1479,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinShort4Short4Short4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinShort4Short4Short4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUshortUshortUshort {
@@ -1109,8 +1517,8 @@
     }
 
     private void checkMinUshortUshortUshort() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xf8a042afcc4e79c5l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xf8a042afcc4e79c6l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xcc4e79c5l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 1, 0xcc4e79c6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1131,11 +1539,16 @@
 
     private void verifyResultsMinUshortUshortUshort(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         short[] arrayInA = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (short) 42);
         inA.copyTo(arrayInA);
         short[] arrayInB = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (short) 42);
         inB.copyTo(arrayInB);
         short[] arrayOut = new short[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -1150,32 +1563,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinUshortUshortUshort" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinUshortUshortUshort" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinUshort2Ushort2Ushort2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x2743846f878f4ca3l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x2743846f878f4ca4l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x878f4ca3l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 2, 0x878f4ca4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1196,11 +1617,16 @@
 
     private void verifyResultsMinUshort2Ushort2Ushort2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         short[] arrayInA = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (short) 42);
         inA.copyTo(arrayInA);
         short[] arrayInB = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (short) 42);
         inB.copyTo(arrayInB);
         short[] arrayOut = new short[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -1215,32 +1641,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinUshort2Ushort2Ushort2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinUshort2Ushort2Ushort2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinUshort3Ushort3Ushort3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xa7331d68d0743e3al, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xa7331d68d0743e3bl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xd0743e3al, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 3, 0xd0743e3bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1261,11 +1695,16 @@
 
     private void verifyResultsMinUshort3Ushort3Ushort3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         short[] arrayInA = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (short) 42);
         inA.copyTo(arrayInA);
         short[] arrayInB = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (short) 42);
         inB.copyTo(arrayInB);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -1280,32 +1719,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinUshort3Ushort3Ushort3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinUshort3Ushort3Ushort3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinUshort4Ushort4Ushort4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x2722b66219592fd1l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x2722b66219592fd2l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x19592fd1l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_16, 4, 0x19592fd2l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_16, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1326,11 +1773,16 @@
 
     private void verifyResultsMinUshort4Ushort4Ushort4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         short[] arrayInA = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (short) 42);
         inA.copyTo(arrayInA);
         short[] arrayInB = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (short) 42);
         inB.copyTo(arrayInB);
         short[] arrayOut = new short[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (short) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -1345,27 +1797,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinUshort4Ushort4Ushort4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinUshort4Ushort4Ushort4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsIntIntInt {
@@ -1375,8 +1835,8 @@
     }
 
     private void checkMinIntIntInt() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xfb5d72ade703dfd7l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xfb5d72ade703dfd8l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xe703dfd7l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0xe703dfd8l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1397,11 +1857,16 @@
 
     private void verifyResultsMinIntIntInt(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         int[] arrayInA = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (int) 42);
         inA.copyTo(arrayInA);
         int[] arrayInB = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (int) 42);
         inB.copyTo(arrayInB);
         int[] arrayOut = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -1416,32 +1881,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinIntIntInt" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinIntIntInt" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinInt2Int2Int2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x4bc6c69713df0b41l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x4bc6c69713df0b42l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x13df0b41l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x13df0b42l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1462,11 +1935,16 @@
 
     private void verifyResultsMinInt2Int2Int2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         int[] arrayInA = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (int) 42);
         inA.copyTo(arrayInA);
         int[] arrayInB = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (int) 42);
         inB.copyTo(arrayInB);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -1481,32 +1959,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinInt2Int2Int2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinInt2Int2Int2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinInt3Int3Int3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x58ac4a91deb4532al, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x58ac4a91deb4532bl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xdeb4532al, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xdeb4532bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1527,11 +2013,16 @@
 
     private void verifyResultsMinInt3Int3Int3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         int[] arrayInA = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (int) 42);
         inA.copyTo(arrayInA);
         int[] arrayInB = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (int) 42);
         inB.copyTo(arrayInB);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -1546,32 +2037,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinInt3Int3Int3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinInt3Int3Int3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinInt4Int4Int4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x6591ce8ca9899b13l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x6591ce8ca9899b14l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xa9899b13l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xa9899b14l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1592,11 +2091,16 @@
 
     private void verifyResultsMinInt4Int4Int4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         int[] arrayInA = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (int) 42);
         inA.copyTo(arrayInA);
         int[] arrayInB = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (int) 42);
         inB.copyTo(arrayInB);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -1611,27 +2115,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinInt4Int4Int4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinInt4Int4Int4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUintUintUint {
@@ -1641,8 +2153,8 @@
     }
 
     private void checkMinUintUintUint() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xe66a5218de387ca0l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xe66a5218de387ca1l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xde387ca0l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xde387ca1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1663,11 +2175,16 @@
 
     private void verifyResultsMinUintUintUint(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         int[] arrayInA = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (int) 42);
         inA.copyTo(arrayInA);
         int[] arrayInB = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (int) 42);
         inB.copyTo(arrayInB);
         int[] arrayOut = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -1682,32 +2199,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinUintUintUint" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinUintUintUint" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinUint2Uint2Uint2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x51b17a26bd9009a2l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0x51b17a26bd9009a3l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xbd9009a2l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 2, 0xbd9009a3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1728,11 +2253,16 @@
 
     private void verifyResultsMinUint2Uint2Uint2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         int[] arrayInA = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (int) 42);
         inA.copyTo(arrayInA);
         int[] arrayInB = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (int) 42);
         inB.copyTo(arrayInB);
         int[] arrayOut = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -1747,32 +2277,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinUint2Uint2Uint2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinUint2Uint2Uint2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinUint3Uint3Uint3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x7765fa101c2f1a71l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x7765fa101c2f1a72l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x1c2f1a71l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 3, 0x1c2f1a72l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1793,11 +2331,16 @@
 
     private void verifyResultsMinUint3Uint3Uint3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         int[] arrayInA = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (int) 42);
         inA.copyTo(arrayInA);
         int[] arrayInB = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (int) 42);
         inB.copyTo(arrayInB);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -1812,32 +2355,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinUint3Uint3Uint3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinUint3Uint3Uint3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinUint4Uint4Uint4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x9d1a79f97ace2b40l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x9d1a79f97ace2b41l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x7ace2b40l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 4, 0x7ace2b41l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_32, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1858,11 +2409,16 @@
 
     private void verifyResultsMinUint4Uint4Uint4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         int[] arrayInA = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (int) 42);
         inA.copyTo(arrayInA);
         int[] arrayInB = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (int) 42);
         inB.copyTo(arrayInB);
         int[] arrayOut = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (int) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -1877,27 +2433,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinUint4Uint4Uint4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinUint4Uint4Uint4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsLongLongLong {
@@ -1907,8 +2471,8 @@
     }
 
     private void checkMinLongLongLong() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x1e87c507de2e29eel, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0x1e87c507de2e29efl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0xde2e29eel, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 1, 0xde2e29efl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1929,11 +2493,16 @@
 
     private void verifyResultsMinLongLongLong(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         long[] arrayInA = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (long) 42);
         inA.copyTo(arrayInA);
         long[] arrayInB = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (long) 42);
         inB.copyTo(arrayInB);
         long[] arrayOut = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -1948,32 +2517,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinLongLongLong" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinLongLongLong" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinLong2Long2Long2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x5a1aed657154fcb8l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x5a1aed657154fcb9l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x7154fcb8l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 2, 0x7154fcb9l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -1994,11 +2571,16 @@
 
     private void verifyResultsMinLong2Long2Long2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         long[] arrayInA = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (long) 42);
         inA.copyTo(arrayInA);
         long[] arrayInB = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (long) 42);
         inB.copyTo(arrayInB);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -2013,32 +2595,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinLong2Long2Long2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinLong2Long2Long2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinLong3Long3Long3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x7fcf6d4ecff40d87l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0x7fcf6d4ecff40d88l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xcff40d87l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 3, 0xcff40d88l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -2059,11 +2649,16 @@
 
     private void verifyResultsMinLong3Long3Long3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         long[] arrayInA = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (long) 42);
         inA.copyTo(arrayInA);
         long[] arrayInB = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (long) 42);
         inB.copyTo(arrayInB);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -2078,32 +2673,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinLong3Long3Long3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinLong3Long3Long3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinLong4Long4Long4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xa583ed382e931e56l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0xa583ed382e931e57l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x2e931e56l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.SIGNED_64, 4, 0x2e931e57l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_64, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -2124,11 +2727,16 @@
 
     private void verifyResultsMinLong4Long4Long4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         long[] arrayInA = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (long) 42);
         inA.copyTo(arrayInA);
         long[] arrayInB = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (long) 42);
         inB.copyTo(arrayInB);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -2143,27 +2751,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinLong4Long4Long4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinLong4Long4Long4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsUlongUlongUlong {
@@ -2173,8 +2789,8 @@
     }
 
     private void checkMinUlongUlongUlong() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x21750b943e23ed8dl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x21750b943e23ed8el, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x3e23ed8dl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 1, 0x3e23ed8el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -2195,11 +2811,16 @@
 
     private void verifyResultsMinUlongUlongUlong(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         long[] arrayInA = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (long) 42);
         inA.copyTo(arrayInA);
         long[] arrayInB = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (long) 42);
         inB.copyTo(arrayInB);
         long[] arrayOut = new long[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -2214,32 +2835,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (args.out != arrayOut[i * 1 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (args.out != arrayOut[i * 1 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinUlongUlongUlong" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinUlongUlongUlong" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinUlong2Ulong2Ulong2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0xd739efe16c4dc5dfl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0xd739efe16c4dc5e0l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x6c4dc5dfl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 2, 0x6c4dc5e0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -2260,11 +2889,16 @@
 
     private void verifyResultsMinUlong2Ulong2Ulong2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         long[] arrayInA = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (long) 42);
         inA.copyTo(arrayInA);
         long[] arrayInB = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (long) 42);
         inB.copyTo(arrayInB);
         long[] arrayOut = new long[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -2279,32 +2913,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (args.out != arrayOut[i * 2 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (args.out != arrayOut[i * 2 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinUlong2Ulong2Ulong2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinUlong2Ulong2Ulong2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinUlong3Ulong3Ulong3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x2b9ece016e2bc780l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x2b9ece016e2bc781l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x6e2bc780l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 3, 0x6e2bc781l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -2325,11 +2967,16 @@
 
     private void verifyResultsMinUlong3Ulong3Ulong3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         long[] arrayInA = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (long) 42);
         inA.copyTo(arrayInA);
         long[] arrayInB = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (long) 42);
         inB.copyTo(arrayInB);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -2344,32 +2991,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinUlong3Ulong3Ulong3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinUlong3Ulong3Ulong3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMinUlong4Ulong4Ulong4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x8003ac217009c921l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x8003ac217009c922l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x7009c921l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.UNSIGNED_64, 4, 0x7009c922l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.UNSIGNED_64, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -2390,11 +3045,16 @@
 
     private void verifyResultsMinUlong4Ulong4Ulong4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         long[] arrayInA = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (long) 42);
         inA.copyTo(arrayInA);
         long[] arrayInB = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (long) 42);
         inB.copyTo(arrayInB);
         long[] arrayOut = new long[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (long) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -2409,27 +3069,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (args.out != arrayOut[i * 4 + j]) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (args.out != arrayOut[i * 4 + j]) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMinUlong4Ulong4Ulong4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMinUlong4Ulong4Ulong4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testMin() {
@@ -2437,6 +3105,9 @@
         checkMinFloat2Float2Float2();
         checkMinFloat3Float3Float3();
         checkMinFloat4Float4Float4();
+        checkMinFloat2FloatFloat2();
+        checkMinFloat3FloatFloat3();
+        checkMinFloat4FloatFloat4();
         checkMinCharCharChar();
         checkMinChar2Char2Char2();
         checkMinChar3Char3Char3();
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMin.rs b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMin.rs
index eec9fb6..dccff70 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMin.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMin.rs
@@ -41,6 +41,21 @@
     return min(inA, inB);
 }
 
+float2 __attribute__((kernel)) testMinFloat2FloatFloat2(float2 inA, unsigned int x) {
+    float inB = rsGetElementAt_float(gAllocInB, x);
+    return min(inA, inB);
+}
+
+float3 __attribute__((kernel)) testMinFloat3FloatFloat3(float3 inA, unsigned int x) {
+    float inB = rsGetElementAt_float(gAllocInB, x);
+    return min(inA, inB);
+}
+
+float4 __attribute__((kernel)) testMinFloat4FloatFloat4(float4 inA, unsigned int x) {
+    float inB = rsGetElementAt_float(gAllocInB, x);
+    return min(inA, inB);
+}
+
 char __attribute__((kernel)) testMinCharCharChar(char inA, unsigned int x) {
     char inB = rsGetElementAt_char(gAllocInB, x);
     return min(inA, inB);
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMix.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMix.java
index 0b6203f..8adfe99 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMix.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestMix.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestMix extends RSBaseCompute {
 
     private ScriptC_TestMix script;
@@ -42,9 +44,9 @@
     }
 
     private void checkMixFloatFloatFloatFloat() {
-        Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9f4beff6471d6db1l, false);
-        Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x6ede0b88b4422e8fl, false);
-        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x6d2f014ec6a51d9fl, false);
+        Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x471d6db1l, false);
+        Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb4422e8fl, false);
+        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc6a51d9fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInStop(inStop);
@@ -67,13 +69,19 @@
 
     private void verifyResultsMixFloatFloatFloatFloat(Allocation inStart, Allocation inStop, Allocation inFraction, Allocation out, boolean relaxed) {
         float[] arrayInStart = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInStart, (float) 42);
         inStart.copyTo(arrayInStart);
         float[] arrayInStop = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInStop, (float) 42);
         inStop.copyTo(arrayInStop);
         float[] arrayInFraction = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInFraction, (float) 42);
         inFraction.copyTo(arrayInFraction);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -90,36 +98,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inStart: ");
-                    appendVariableToMessage(message, args.inStart);
-                    message.append("\n");
-                    message.append("Input inStop: ");
-                    appendVariableToMessage(message, args.inStop);
-                    message.append("\n");
-                    message.append("Input inFraction: ");
-                    appendVariableToMessage(message, args.inFraction);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inStart: ");
+                        appendVariableToMessage(message, args.inStart);
+                        message.append("\n");
+                        message.append("Input inStop: ");
+                        appendVariableToMessage(message, args.inStop);
+                        message.append("\n");
+                        message.append("Input inFraction: ");
+                        appendVariableToMessage(message, args.inFraction);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMixFloatFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMixFloatFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMixFloat2Float2Float2Float2() {
-        Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x45502e8f0a2d9ce9l, false);
-        Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xba2b8a035395e837l, false);
-        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xe56bef3c621e0ac7l, false);
+        Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xa2d9ce9l, false);
+        Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x5395e837l, false);
+        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x621e0ac7l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInStop(inStop);
@@ -142,13 +158,19 @@
 
     private void verifyResultsMixFloat2Float2Float2Float2(Allocation inStart, Allocation inStop, Allocation inFraction, Allocation out, boolean relaxed) {
         float[] arrayInStart = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInStart, (float) 42);
         inStart.copyTo(arrayInStart);
         float[] arrayInStop = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInStop, (float) 42);
         inStop.copyTo(arrayInStop);
         float[] arrayInFraction = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInFraction, (float) 42);
         inFraction.copyTo(arrayInFraction);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -165,36 +187,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inStart: ");
-                    appendVariableToMessage(message, args.inStart);
-                    message.append("\n");
-                    message.append("Input inStop: ");
-                    appendVariableToMessage(message, args.inStop);
-                    message.append("\n");
-                    message.append("Input inFraction: ");
-                    appendVariableToMessage(message, args.inFraction);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inStart: ");
+                        appendVariableToMessage(message, args.inStart);
+                        message.append("\n");
+                        message.append("Input inStop: ");
+                        appendVariableToMessage(message, args.inStop);
+                        message.append("\n");
+                        message.append("Input inFraction: ");
+                        appendVariableToMessage(message, args.inFraction);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMixFloat2Float2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMixFloat2Float2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMixFloat3Float3Float3Float3() {
-        Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xeb4701726b009c5l, false);
-        Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x9b21f6b3249ee4cbl, false);
-        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf15862eab0d4f51bl, false);
+        Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x26b009c5l, false);
+        Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x249ee4cbl, false);
+        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xb0d4f51bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInStop(inStop);
@@ -217,13 +247,19 @@
 
     private void verifyResultsMixFloat3Float3Float3Float3(Allocation inStart, Allocation inStop, Allocation inFraction, Allocation out, boolean relaxed) {
         float[] arrayInStart = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInStart, (float) 42);
         inStart.copyTo(arrayInStart);
         float[] arrayInStop = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInStop, (float) 42);
         inStop.copyTo(arrayInStop);
         float[] arrayInFraction = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInFraction, (float) 42);
         inFraction.copyTo(arrayInFraction);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -240,36 +276,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inStart: ");
-                    appendVariableToMessage(message, args.inStart);
-                    message.append("\n");
-                    message.append("Input inStop: ");
-                    appendVariableToMessage(message, args.inStop);
-                    message.append("\n");
-                    message.append("Input inFraction: ");
-                    appendVariableToMessage(message, args.inFraction);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inStart: ");
+                        appendVariableToMessage(message, args.inStart);
+                        message.append("\n");
+                        message.append("Input inStop: ");
+                        appendVariableToMessage(message, args.inStop);
+                        message.append("\n");
+                        message.append("Input inFraction: ");
+                        appendVariableToMessage(message, args.inFraction);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMixFloat3Float3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMixFloat3Float3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMixFloat4Float4Float4Float4() {
-        Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd818b19f433276a1l, false);
-        Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x7c186362f5a7e15fl, false);
-        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xfd44d698ff8bdf6fl, false);
+        Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x433276a1l, false);
+        Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf5a7e15fl, false);
+        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xff8bdf6fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInStop(inStop);
@@ -292,13 +336,19 @@
 
     private void verifyResultsMixFloat4Float4Float4Float4(Allocation inStart, Allocation inStop, Allocation inFraction, Allocation out, boolean relaxed) {
         float[] arrayInStart = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInStart, (float) 42);
         inStart.copyTo(arrayInStart);
         float[] arrayInStop = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInStop, (float) 42);
         inStop.copyTo(arrayInStop);
         float[] arrayInFraction = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInFraction, (float) 42);
         inFraction.copyTo(arrayInFraction);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -315,36 +365,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inStart: ");
-                    appendVariableToMessage(message, args.inStart);
-                    message.append("\n");
-                    message.append("Input inStop: ");
-                    appendVariableToMessage(message, args.inStop);
-                    message.append("\n");
-                    message.append("Input inFraction: ");
-                    appendVariableToMessage(message, args.inFraction);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inStart: ");
+                        appendVariableToMessage(message, args.inStart);
+                        message.append("\n");
+                        message.append("Input inStop: ");
+                        appendVariableToMessage(message, args.inStop);
+                        message.append("\n");
+                        message.append("Input inFraction: ");
+                        appendVariableToMessage(message, args.inFraction);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMixFloat4Float4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMixFloat4Float4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMixFloat2Float2FloatFloat2() {
-        Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xf811b2d52bd1d7c3l, false);
-        Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x17a127e13c8dd1c5l, false);
-        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe0b7d03e92afd1f5l, false);
+        Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2bd1d7c3l, false);
+        Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3c8dd1c5l, false);
+        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x92afd1f5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInStop(inStop);
@@ -367,13 +425,19 @@
 
     private void verifyResultsMixFloat2Float2FloatFloat2(Allocation inStart, Allocation inStop, Allocation inFraction, Allocation out, boolean relaxed) {
         float[] arrayInStart = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInStart, (float) 42);
         inStart.copyTo(arrayInStart);
         float[] arrayInStop = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInStop, (float) 42);
         inStop.copyTo(arrayInStop);
         float[] arrayInFraction = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInFraction, (float) 42);
         inFraction.copyTo(arrayInFraction);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -390,36 +454,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inStart: ");
-                    appendVariableToMessage(message, args.inStart);
-                    message.append("\n");
-                    message.append("Input inStop: ");
-                    appendVariableToMessage(message, args.inStop);
-                    message.append("\n");
-                    message.append("Input inFraction: ");
-                    appendVariableToMessage(message, args.inFraction);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inStart: ");
+                        appendVariableToMessage(message, args.inStart);
+                        message.append("\n");
+                        message.append("Input inStop: ");
+                        appendVariableToMessage(message, args.inStop);
+                        message.append("\n");
+                        message.append("Input inFraction: ");
+                        appendVariableToMessage(message, args.inFraction);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMixFloat2Float2FloatFloat2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMixFloat2Float2FloatFloat2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMixFloat3Float3FloatFloat3() {
-        Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xae7aff441b20fa80l, false);
-        Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe64a4d60d6f4de7cl, false);
-        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x21bd09bbd131a27cl, false);
+        Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1b20fa80l, false);
+        Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd6f4de7cl, false);
+        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd131a27cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInStop(inStop);
@@ -442,13 +514,19 @@
 
     private void verifyResultsMixFloat3Float3FloatFloat3(Allocation inStart, Allocation inStop, Allocation inFraction, Allocation out, boolean relaxed) {
         float[] arrayInStart = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInStart, (float) 42);
         inStart.copyTo(arrayInStart);
         float[] arrayInStop = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInStop, (float) 42);
         inStop.copyTo(arrayInStop);
         float[] arrayInFraction = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInFraction, (float) 42);
         inFraction.copyTo(arrayInFraction);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -465,36 +543,44 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inStart: ");
-                    appendVariableToMessage(message, args.inStart);
-                    message.append("\n");
-                    message.append("Input inStop: ");
-                    appendVariableToMessage(message, args.inStop);
-                    message.append("\n");
-                    message.append("Input inFraction: ");
-                    appendVariableToMessage(message, args.inFraction);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inStart: ");
+                        appendVariableToMessage(message, args.inStart);
+                        message.append("\n");
+                        message.append("Input inStop: ");
+                        appendVariableToMessage(message, args.inStop);
+                        message.append("\n");
+                        message.append("Input inFraction: ");
+                        appendVariableToMessage(message, args.inFraction);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMixFloat3Float3FloatFloat3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMixFloat3Float3FloatFloat3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkMixFloat4Float4FloatFloat4() {
-        Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x64e44bb30a701d3dl, false);
-        Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb4f372e0715beb33l, false);
-        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x62c243390fb37303l, false);
+        Allocation inStart = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xa701d3dl, false);
+        Allocation inStop = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x715beb33l, false);
+        Allocation inFraction = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xfb37303l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInStop(inStop);
@@ -517,13 +603,19 @@
 
     private void verifyResultsMixFloat4Float4FloatFloat4(Allocation inStart, Allocation inStop, Allocation inFraction, Allocation out, boolean relaxed) {
         float[] arrayInStart = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInStart, (float) 42);
         inStart.copyTo(arrayInStart);
         float[] arrayInStop = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInStop, (float) 42);
         inStop.copyTo(arrayInStop);
         float[] arrayInFraction = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInFraction, (float) 42);
         inFraction.copyTo(arrayInFraction);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -540,30 +632,38 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inStart: ");
-                    appendVariableToMessage(message, args.inStart);
-                    message.append("\n");
-                    message.append("Input inStop: ");
-                    appendVariableToMessage(message, args.inStop);
-                    message.append("\n");
-                    message.append("Input inFraction: ");
-                    appendVariableToMessage(message, args.inFraction);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inStart: ");
+                        appendVariableToMessage(message, args.inStart);
+                        message.append("\n");
+                        message.append("Input inStop: ");
+                        appendVariableToMessage(message, args.inStop);
+                        message.append("\n");
+                        message.append("Input inFraction: ");
+                        appendVariableToMessage(message, args.inFraction);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkMixFloat4Float4FloatFloat4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkMixFloat4Float4FloatFloat4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testMix() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestModf.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestModf.java
index 26263ce..1848ce6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestModf.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestModf.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestModf extends RSBaseCompute {
 
     private ScriptC_TestModf script;
@@ -41,7 +43,7 @@
     }
 
     private void checkModfFloatFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd655dc05ccaef45l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x5ccaef45l, false);
         try {
             Allocation outIntegralPart = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
@@ -64,11 +66,16 @@
 
     private void verifyResultsModfFloatFloatFloat(Allocation inV, Allocation outIntegralPart, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOutIntegralPart = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOutIntegralPart, (float) 42);
         outIntegralPart.copyTo(arrayOutIntegralPart);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -86,37 +93,45 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outIntegralPart: ");
-                    appendVariableToMessage(message, args.outIntegralPart);
-                    message.append("\n");
-                    message.append("Actual   output outIntegralPart: ");
-                    appendVariableToMessage(message, arrayOutIntegralPart[i * 1 + j]);
-                    if (!args.outIntegralPart.couldBe(arrayOutIntegralPart[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outIntegralPart: ");
+                        appendVariableToMessage(message, args.outIntegralPart);
+                        message.append("\n");
+                        message.append("Actual   output outIntegralPart: ");
+                        appendVariableToMessage(message, arrayOutIntegralPart[i * 1 + j]);
+                        if (!args.outIntegralPart.couldBe(arrayOutIntegralPart[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkModfFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkModfFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkModfFloat2Float2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2a1dc519fa16305fl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xfa16305fl, false);
         try {
             Allocation outIntegralPart = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
@@ -139,11 +154,16 @@
 
     private void verifyResultsModfFloat2Float2Float2(Allocation inV, Allocation outIntegralPart, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOutIntegralPart = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOutIntegralPart, (float) 42);
         outIntegralPart.copyTo(arrayOutIntegralPart);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -161,37 +181,45 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outIntegralPart: ");
-                    appendVariableToMessage(message, args.outIntegralPart);
-                    message.append("\n");
-                    message.append("Actual   output outIntegralPart: ");
-                    appendVariableToMessage(message, arrayOutIntegralPart[i * 2 + j]);
-                    if (!args.outIntegralPart.couldBe(arrayOutIntegralPart[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outIntegralPart: ");
+                        appendVariableToMessage(message, args.outIntegralPart);
+                        message.append("\n");
+                        message.append("Actual   output outIntegralPart: ");
+                        appendVariableToMessage(message, arrayOutIntegralPart[i * 2 + j]);
+                        if (!args.outIntegralPart.couldBe(arrayOutIntegralPart[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkModfFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkModfFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkModfFloat3Float3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x7e82a339fbf43200l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xfbf43200l, false);
         try {
             Allocation outIntegralPart = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
@@ -214,11 +242,16 @@
 
     private void verifyResultsModfFloat3Float3Float3(Allocation inV, Allocation outIntegralPart, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOutIntegralPart = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOutIntegralPart, (float) 42);
         outIntegralPart.copyTo(arrayOutIntegralPart);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -236,37 +269,45 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outIntegralPart: ");
-                    appendVariableToMessage(message, args.outIntegralPart);
-                    message.append("\n");
-                    message.append("Actual   output outIntegralPart: ");
-                    appendVariableToMessage(message, arrayOutIntegralPart[i * 4 + j]);
-                    if (!args.outIntegralPart.couldBe(arrayOutIntegralPart[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outIntegralPart: ");
+                        appendVariableToMessage(message, args.outIntegralPart);
+                        message.append("\n");
+                        message.append("Actual   output outIntegralPart: ");
+                        appendVariableToMessage(message, arrayOutIntegralPart[i * 4 + j]);
+                        if (!args.outIntegralPart.couldBe(arrayOutIntegralPart[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkModfFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkModfFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkModfFloat4Float4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd2e78159fdd233a1l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xfdd233a1l, false);
         try {
             Allocation outIntegralPart = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
@@ -289,11 +330,16 @@
 
     private void verifyResultsModfFloat4Float4Float4(Allocation inV, Allocation outIntegralPart, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOutIntegralPart = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOutIntegralPart, (float) 42);
         outIntegralPart.copyTo(arrayOutIntegralPart);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -311,33 +357,41 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outIntegralPart: ");
-                    appendVariableToMessage(message, args.outIntegralPart);
-                    message.append("\n");
-                    message.append("Actual   output outIntegralPart: ");
-                    appendVariableToMessage(message, arrayOutIntegralPart[i * 4 + j]);
-                    if (!args.outIntegralPart.couldBe(arrayOutIntegralPart[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outIntegralPart: ");
+                        appendVariableToMessage(message, args.outIntegralPart);
+                        message.append("\n");
+                        message.append("Actual   output outIntegralPart: ");
+                        appendVariableToMessage(message, arrayOutIntegralPart[i * 4 + j]);
+                        if (!args.outIntegralPart.couldBe(arrayOutIntegralPart[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkModfFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkModfFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testModf() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNan.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNan.java
index 7c1f89c..e17cd2b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNan.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNan.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNan extends RSBaseCompute {
 
     private ScriptC_TestNan script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNanUintFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0xbc42cb366a8a10d2l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.UNSIGNED_32, 1, 0x6a8a10d2l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNanUintFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNanUintFloat(Allocation inV, Allocation out, boolean relaxed) {
         int[] arrayInV = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (int) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,24 +82,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNanUintFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNanUintFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNan() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcos.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcos.java
index 63307d9..0452cc9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcos.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeAcos extends RSBaseCompute {
 
     private ScriptC_TestNativeAcos script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeAcosFloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7749aa14657f3d94l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x657f3d94l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeAcosFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeAcosFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAcosFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAcosFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAcosFloat2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x92e82297d87e02d8l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd87e02d8l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeAcosFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeAcosFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAcosFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAcosFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAcosFloat3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x92e9ebb2ce9923b6l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xce9923b6l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeAcosFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeAcosFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAcosFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAcosFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAcosFloat4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x92ebb4cdc4b44494l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc4b44494l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeAcosFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeAcosFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAcosFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAcosFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeAcos() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcosh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcosh.java
index ed3ab41..0494901 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcosh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcosh.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeAcosh extends RSBaseCompute {
 
     private ScriptC_TestNativeAcosh script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeAcoshFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x97c6a2f89e417fcal, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9e417fcal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeAcoshFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeAcoshFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAcoshFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAcoshFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAcoshFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3989caf5cb8e3adel, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xcb8e3adel, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeAcoshFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeAcoshFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAcoshFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAcoshFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAcoshFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x398b9410c1a95bbcl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc1a95bbcl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeAcoshFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeAcoshFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAcoshFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAcoshFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAcoshFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x398d5d2bb7c47c9al, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb7c47c9al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeAcoshFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeAcoshFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAcoshFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAcoshFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeAcosh() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcospi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcospi.java
index c2fb6a5..1c84749 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcospi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAcospi.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeAcospi extends RSBaseCompute {
 
     private ScriptC_TestNativeAcospi script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeAcospiFloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xdcf67f5599c7d8ffl, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x99c7d8ffl, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeAcospiFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeAcospiFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAcospiFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAcospiFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAcospiFloat2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xf038668a78e88aabl, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x78e88aabl, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeAcospiFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeAcospiFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAcospiFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAcospiFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAcospiFloat3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf03a2fa56f03ab89l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6f03ab89l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeAcospiFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeAcospiFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAcospiFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAcospiFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAcospiFloat4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf03bf8c0651ecc67l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x651ecc67l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeAcospiFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeAcospiFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAcospiFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAcospiFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeAcospi() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsin.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsin.java
index f86f1d0..252f99b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsin.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeAsin extends RSBaseCompute {
 
     private ScriptC_TestNativeAsin script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeAsinFloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x1167d6d8d3e5bc7l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x8d3e5bc7l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeAsinFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeAsinFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAsinFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAsinFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAsinFloat2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdb4aa187ebdf2133l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xebdf2133l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeAsinFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeAsinFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAsinFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAsinFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAsinFloat3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdb4c6aa2e1fa4211l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe1fa4211l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeAsinFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeAsinFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAsinFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAsinFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAsinFloat4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xdb4e33bdd81562efl, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd81562efl, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeAsinFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeAsinFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAsinFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAsinFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeAsin() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsinh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsinh.java
index 8b642a2..6b72cc9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsinh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsinh.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeAsinh extends RSBaseCompute {
 
     private ScriptC_TestNativeAsinh script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeAsinhFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xbd2e22f24b5b925bl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4b5b925bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeAsinhFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeAsinhFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAsinhFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAsinhFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAsinhFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x62151d490cde5427l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xcde5427l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeAsinhFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeAsinhFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAsinhFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAsinhFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAsinhFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6216e66402f97505l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x2f97505l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeAsinhFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeAsinhFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAsinhFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAsinhFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAsinhFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6218af7ef91495e3l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf91495e3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeAsinhFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeAsinhFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAsinhFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAsinhFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeAsinh() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsinpi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsinpi.java
index 0aaf7f2..84b219a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsinpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAsinpi.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeAsinpi extends RSBaseCompute {
 
     private ScriptC_TestNativeAsinpi script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeAsinpiFloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2558fe45ad28f75al, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xad28f75al, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeAsinpiFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeAsinpiFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAsinpiFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAsinpiFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAsinpiFloat2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xbf9f3a86715cc9eel, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x715cc9eel, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeAsinpiFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeAsinpiFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAsinpiFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAsinpiFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAsinpiFloat3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xbfa103a16777eaccl, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6777eaccl, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeAsinpiFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeAsinpiFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAsinpiFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAsinpiFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAsinpiFloat4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbfa2ccbc5d930baal, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x5d930baal, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeAsinpiFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeAsinpiFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAsinpiFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAsinpiFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeAsinpi() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan.java
index 8271bdb..12430dc 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeAtan extends RSBaseCompute {
 
     private ScriptC_TestNativeAtan script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeAtanFloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xaafbf9b325b34e42l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x25b34e42l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeAtanFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeAtanFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtanFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtanFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAtanFloat2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xf5c93432108a7b96l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x108a7b96l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeAtanFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeAtanFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtanFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtanFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAtanFloat3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf5cafd4d06a59c74l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6a59c74l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeAtanFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeAtanFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtanFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtanFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAtanFloat4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf5ccc667fcc0bd52l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xfcc0bd52l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeAtanFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeAtanFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtanFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtanFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeAtan() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan2.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan2.java
index ac7a974..4cabb28 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan2.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeAtan2 extends RSBaseCompute {
 
     private ScriptC_TestNativeAtan2 script;
@@ -41,8 +43,8 @@
     }
 
     private void checkNativeAtan2FloatFloatFloat() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2139aa61fb6dcb4fl, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf6634dcb634c16d0l, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xfb6dcb4fl, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x634c16d0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -63,11 +65,16 @@
 
     private void verifyResultsNativeAtan2FloatFloatFloat(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtan2FloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtan2FloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAtan2Float2Float2Float2() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x989e0b0cd0059da7l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4a617fa4dfda5468l, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd0059da7l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdfda5468l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -129,11 +144,16 @@
 
     private void verifyResultsNativeAtan2Float2Float2Float2(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtan2Float2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtan2Float2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAtan2Float3Float3Float3() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x742cb44672d189a8l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x13c5c0edb2b5e7a1l, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x72d189a8l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xb2b5e7a1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -195,11 +223,16 @@
 
     private void verifyResultsNativeAtan2Float3Float3Float3(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtan2Float3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtan2Float3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAtan2Float4Float4Float4() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4fbb5d80159d75a9l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xdd2a023685917adal, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x159d75a9l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x85917adal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -261,11 +302,16 @@
 
     private void verifyResultsNativeAtan2Float4Float4Float4(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,27 +327,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtan2Float4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtan2Float4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeAtan2() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan2pi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan2pi.java
index 4c812ce..c42591c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan2pi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtan2pi.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeAtan2pi extends RSBaseCompute {
 
     private ScriptC_TestNativeAtan2pi script;
@@ -41,8 +43,8 @@
     }
 
     private void checkNativeAtan2piFloatFloatFloat() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc2172a04694fc108l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd63229f70853dc01l, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x694fc108l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x853dc01l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -63,11 +65,16 @@
 
     private void verifyResultsNativeAtan2piFloatFloatFloat(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtan2piFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtan2piFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAtan2piFloat2Float2Float2() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x305d06618853bce2l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4cc6c68c0c19e58bl, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8853bce2l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc19e58bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -129,11 +144,16 @@
 
     private void verifyResultsNativeAtan2piFloat2Float2Float2(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtan2piFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtan2piFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAtan2piFloat3Float3Float3() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xbebaf9b2b1fa8e3l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x162b07d4def578c4l, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x2b1fa8e3l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdef578c4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -195,11 +223,16 @@
 
     private void verifyResultsNativeAtan2piFloat3Float3Float3(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtan2piFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtan2piFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAtan2piFloat4Float4Float4() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe77a58d4cdeb94e4l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xdf8f491db1d10bfdl, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xcdeb94e4l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb1d10bfdl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -261,11 +302,16 @@
 
     private void verifyResultsNativeAtan2piFloat4Float4Float4(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,27 +327,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtan2piFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtan2piFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeAtan2pi() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtanh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtanh.java
index 11b8952..c37993b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtanh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtanh.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeAtanh extends RSBaseCompute {
 
     private ScriptC_TestNativeAtanh script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeAtanhFloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x46ba02a2e7004d04l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe7004d04l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeAtanhFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeAtanhFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtanhFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtanhFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAtanhFloat2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd557bfdd35a682c8l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x35a682c8l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeAtanhFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeAtanhFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtanhFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtanhFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAtanhFloat3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd55988f82bc1a3a6l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x2bc1a3a6l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeAtanhFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeAtanhFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtanhFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtanhFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAtanhFloat4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd55b521321dcc484l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x21dcc484l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeAtanhFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeAtanhFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtanhFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtanhFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeAtanh() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtanpi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtanpi.java
index 9e822d2..4089adb 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtanpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeAtanpi.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeAtanpi extends RSBaseCompute {
 
     private ScriptC_TestNativeAtanpi script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeAtanpiFloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3fd790efd1d451bdl, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd1d451bdl, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeAtanpiFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeAtanpiFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtanpiFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtanpiFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAtanpiFloat2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x1bd089694afc9ef9l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4afc9ef9l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeAtanpiFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeAtanpiFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtanpiFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtanpiFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAtanpiFloat3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1bd252844117bfd7l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x4117bfd7l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeAtanpiFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeAtanpiFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtanpiFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtanpiFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeAtanpiFloat4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x1bd41b9f3732e0b5l, -1, 1);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3732e0b5l, -1, 1);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeAtanpiFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeAtanpiFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeAtanpiFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeAtanpiFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeAtanpi() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCbrt.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCbrt.java
index 05eb399..18c76bb 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCbrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCbrt.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeCbrt extends RSBaseCompute {
 
     private ScriptC_TestNativeCbrt script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeCbrtFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa1d3335118086389l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x18086389l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeCbrtFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeCbrtFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeCbrtFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeCbrtFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeCbrtFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xce4859fd59112965l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x59112965l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeCbrtFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeCbrtFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeCbrtFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeCbrtFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeCbrtFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xce4a23184f2c4a43l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x4f2c4a43l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeCbrtFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeCbrtFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeCbrtFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeCbrtFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeCbrtFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xce4bec3345476b21l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x45476b21l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeCbrtFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeCbrtFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeCbrtFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeCbrtFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeCbrt() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCos.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCos.java
index 6b9b803..bd9c6a6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCos.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeCos extends RSBaseCompute {
 
     private ScriptC_TestNativeCos script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeCosFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2f317381777f3495l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x777f3495l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeCosFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeCosFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeCosFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeCosFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeCosFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdc05f75eda3d0911l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xda3d0911l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeCosFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeCosFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeCosFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeCosFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeCosFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdc07c079d05829efl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd05829efl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeCosFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeCosFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeCosFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeCosFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeCosFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xdc098994c6734acdl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc6734acdl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeCosFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeCosFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeCosFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeCosFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeCos() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCosh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCosh.java
index ba20feb..7bdab28 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCosh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCosh.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeCosh extends RSBaseCompute {
 
     private ScriptC_TestNativeCosh script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeCoshFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7bb5784aa43ffcf5l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa43ffcf5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeCoshFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeCoshFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeCoshFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeCoshFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeCoshFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x818c886316a44671l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x16a44671l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeCoshFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeCoshFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeCoshFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeCoshFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeCoshFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x818e517e0cbf674fl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xcbf674fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeCoshFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeCoshFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeCoshFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeCoshFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeCoshFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x81901a9902da882dl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x2da882dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeCoshFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeCoshFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeCoshFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeCoshFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeCosh() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCospi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCospi.java
index 0176177..91b4426 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCospi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeCospi.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeCospi extends RSBaseCompute {
 
     private ScriptC_TestNativeCospi script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeCospiFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2614541c9b86df38l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9b86df38l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeCospiFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeCospiFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeCospiFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeCospiFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeCospiFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8ae37e6159c7c5cl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x159c7c5cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeCospiFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeCospiFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeCospiFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeCospiFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeCospiFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8b001010bb79d3al, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xbb79d3al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeCospiFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeCospiFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeCospiFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeCospiFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeCospiFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8b1ca1c01d2be18l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x1d2be18l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeCospiFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeCospiFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeCospiFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeCospiFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeCospi() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeDistance.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeDistance.java
index 46838d8..8485d16 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeDistance.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeDistance.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeDistance extends RSBaseCompute {
 
     private ScriptC_TestNativeDistance script;
@@ -41,8 +43,8 @@
     }
 
     private void checkNativeDistanceFloatFloatFloat() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb61d5ec530ae2337l, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x98c2c48c9b58b3c2l, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x30ae2337l, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9b58b3c2l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -63,11 +65,16 @@
 
     private void verifyResultsNativeDistanceFloatFloatFloat(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
             // Create the appropriate sized arrays in args
@@ -83,26 +90,32 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                message.append("Input inLeftVector: ");
-                appendVariableToMessage(message, arrayInLeftVector[i]);
-                message.append("\n");
-                message.append("Input inRightVector: ");
-                appendVariableToMessage(message, arrayInRightVector[i]);
-                message.append("\n");
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    message.append("Input inLeftVector: ");
+                    appendVariableToMessage(message, arrayInLeftVector[i]);
+                    message.append("\n");
+                    message.append("Input inRightVector: ");
+                    appendVariableToMessage(message, arrayInRightVector[i]);
+                    message.append("\n");
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
+                    message.append("\n");
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
+                    message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("\n");
-                assertTrue("Incorrect output for checkNativeDistanceFloatFloatFloat" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkNativeDistanceFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatNFloatNFloat {
@@ -112,8 +125,8 @@
     }
 
     private void checkNativeDistanceFloat2Float2Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xef86e1d727286713l, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3d7bc89101e219b6l, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x27286713l, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x1e219b6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -134,11 +147,16 @@
 
     private void verifyResultsNativeDistanceFloat2Float2Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -160,35 +178,41 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inLeftVector: ");
-                    appendVariableToMessage(message, arrayInLeftVector[i * 2 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 2 ; j++) {
+                        message.append("Input inLeftVector: ");
+                        appendVariableToMessage(message, arrayInLeftVector[i * 2 + j]);
+                        message.append("\n");
+                    }
+                    for (int j = 0; j < 2 ; j++) {
+                        message.append("Input inRightVector: ");
+                        appendVariableToMessage(message, arrayInRightVector[i * 2 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
-                }
-                for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inRightVector: ");
-                    appendVariableToMessage(message, arrayInRightVector[i * 2 + j]);
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
                     message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkNativeDistanceFloat2Float2Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkNativeDistanceFloat2Float2Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeDistanceFloat3Float3Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xbe30075548c71b61l, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf3e514c0a78a62d0l, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x48c71b61l, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xa78a62d0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -209,11 +233,16 @@
 
     private void verifyResultsNativeDistanceFloat3Float3Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -235,35 +264,41 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inLeftVector: ");
-                    appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Input inLeftVector: ");
+                        appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Input inRightVector: ");
+                        appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
-                }
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inRightVector: ");
-                    appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
                     message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkNativeDistanceFloat3Float3Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkNativeDistanceFloat3Float3Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeDistanceFloat4Float4Float() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8cd92cd36a65cfafl, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xaa4e60f04d32abeal, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6a65cfafl, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4d32abeal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -284,11 +319,16 @@
 
     private void verifyResultsNativeDistanceFloat4Float4Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -310,30 +350,36 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inLeftVector: ");
-                    appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Input inLeftVector: ");
+                        appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Input inRightVector: ");
+                        appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
-                }
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inRightVector: ");
-                    appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
                     message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkNativeDistanceFloat4Float4Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkNativeDistanceFloat4Float4Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeDistance() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeDivide.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeDivide.java
index b7a630b2..194a4df 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeDivide.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeDivide.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeDivide extends RSBaseCompute {
 
     private ScriptC_TestNativeDivide script;
@@ -41,8 +43,8 @@
     }
 
     private void checkNativeDivideFloatFloatFloat() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x73477387751754efl, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x5ed4412e19040daal, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x751754efl, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x19040daal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -63,11 +65,16 @@
 
     private void verifyResultsNativeDivideFloatFloatFloat(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inLeftVector: ");
-                    appendVariableToMessage(message, args.inLeftVector);
-                    message.append("\n");
-                    message.append("Input inRightVector: ");
-                    appendVariableToMessage(message, args.inRightVector);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inLeftVector: ");
+                        appendVariableToMessage(message, args.inLeftVector);
+                        message.append("\n");
+                        message.append("Input inRightVector: ");
+                        appendVariableToMessage(message, args.inRightVector);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeDivideFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeDivideFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeDivideFloat2Float2Float2() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x752d5a1207785d6dl, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb071fa74af507ad4l, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x7785d6dl, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xaf507ad4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -129,11 +144,16 @@
 
     private void verifyResultsNativeDivideFloat2Float2Float2(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inLeftVector: ");
-                    appendVariableToMessage(message, args.inLeftVector);
-                    message.append("\n");
-                    message.append("Input inRightVector: ");
-                    appendVariableToMessage(message, args.inRightVector);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inLeftVector: ");
+                        appendVariableToMessage(message, args.inLeftVector);
+                        message.append("\n");
+                        message.append("Input inRightVector: ");
+                        appendVariableToMessage(message, args.inRightVector);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeDivideFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeDivideFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeDivideFloat3Float3Float3() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x5623c6c05fb90198l, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x79d63bbd822c0e0dl, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x5fb90198l, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x822c0e0dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -195,11 +223,16 @@
 
     private void verifyResultsNativeDivideFloat3Float3Float3(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inLeftVector: ");
-                    appendVariableToMessage(message, args.inLeftVector);
-                    message.append("\n");
-                    message.append("Input inRightVector: ");
-                    appendVariableToMessage(message, args.inRightVector);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inLeftVector: ");
+                        appendVariableToMessage(message, args.inLeftVector);
+                        message.append("\n");
+                        message.append("Input inRightVector: ");
+                        appendVariableToMessage(message, args.inRightVector);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeDivideFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeDivideFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeDivideFloat4Float4Float4() {
-        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x371a336eb7f9a5c3l, false);
-        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x433a7d065507a146l, false);
+        Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb7f9a5c3l, false);
+        Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x5507a146l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInRightVector(inRightVector);
@@ -261,11 +302,16 @@
 
     private void verifyResultsNativeDivideFloat4Float4Float4(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
         float[] arrayInLeftVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInLeftVector, (float) 42);
         inLeftVector.copyTo(arrayInLeftVector);
         float[] arrayInRightVector = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInRightVector, (float) 42);
         inRightVector.copyTo(arrayInRightVector);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,27 +327,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inLeftVector: ");
-                    appendVariableToMessage(message, args.inLeftVector);
-                    message.append("\n");
-                    message.append("Input inRightVector: ");
-                    appendVariableToMessage(message, args.inRightVector);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inLeftVector: ");
+                        appendVariableToMessage(message, args.inLeftVector);
+                        message.append("\n");
+                        message.append("Input inRightVector: ");
+                        appendVariableToMessage(message, args.inRightVector);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeDivideFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeDivideFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeDivide() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp.java
index 156b154..3643235 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeExp extends RSBaseCompute {
 
     private ScriptC_TestNativeExp script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeExpFloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x66a7898af1f6be9bl, -86, 86);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf1f6be9bl, -86, 86);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeExpFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeExpFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeExpFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeExpFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeExpFloat2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x6feb21d463a0ee67l, -86, 86);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x63a0ee67l, -86, 86);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeExpFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeExpFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeExpFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeExpFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeExpFloat3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6feceaef59bc0f45l, -86, 86);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x59bc0f45l, -86, 86);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeExpFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeExpFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeExpFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeExpFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeExpFloat4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6feeb40a4fd73023l, -86, 86);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4fd73023l, -86, 86);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeExpFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeExpFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeExpFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeExpFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeExp() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp10.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp10.java
index df4dd51..36996f9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp10.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp10.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeExp10 extends RSBaseCompute {
 
     private ScriptC_TestNativeExp10 script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeExp10FloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x562e4ea690352c54l, -37, 37);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x90352c54l, -37, 37);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeExp10FloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeExp10FloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeExp10FloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeExp10FloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeExp10Float2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x7450c64e54876b98l, -37, 37);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x54876b98l, -37, 37);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeExp10Float2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeExp10Float2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeExp10Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeExp10Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeExp10Float3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x74528f694aa28c76l, -37, 37);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x4aa28c76l, -37, 37);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeExp10Float3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeExp10Float3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeExp10Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeExp10Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeExp10Float4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x7454588440bdad54l, -37, 37);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x40bdad54l, -37, 37);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeExp10Float4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeExp10Float4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeExp10Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeExp10Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeExp10() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp2.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp2.java
index 81961c2..3ed45e4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExp2.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeExp2 extends RSBaseCompute {
 
     private ScriptC_TestNativeExp2 script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeExp2FloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd87a6eb24c6a2bc5l, -125, 125);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4c6a2bc5l, -125, 125);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeExp2FloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeExp2FloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeExp2FloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeExp2FloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeExp2Float2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8c243b10af5062c1l, -125, 125);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xaf5062c1l, -125, 125);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeExp2Float2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeExp2Float2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeExp2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeExp2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeExp2Float3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8c26042ba56b839fl, -125, 125);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xa56b839fl, -125, 125);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeExp2Float3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeExp2Float3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeExp2Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeExp2Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeExp2Float4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8c27cd469b86a47dl, -125, 125);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x9b86a47dl, -125, 125);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeExp2Float4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeExp2Float4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeExp2Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeExp2Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeExp2() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExpm1.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExpm1.java
index 84a06fc..bba5aeb 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExpm1.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeExpm1.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeExpm1 extends RSBaseCompute {
 
     private ScriptC_TestNativeExpm1 script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeExpm1FloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7a90bd8a7094f34bl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7094f34bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeExpm1FloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeExpm1FloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeExpm1FloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeExpm1FloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeExpm1Float2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3f43b22de84b7997l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xe84b7997l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeExpm1Float2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeExpm1Float2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeExpm1Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeExpm1Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeExpm1Float3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3f457b48de669a75l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xde669a75l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeExpm1Float3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeExpm1Float3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeExpm1Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeExpm1Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeExpm1Float4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3f474463d481bb53l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd481bb53l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeExpm1Float4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeExpm1Float4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeExpm1Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeExpm1Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeExpm1() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeHypot.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeHypot.java
index b875539..650233b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeHypot.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeHypot.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeHypot extends RSBaseCompute {
 
     private ScriptC_TestNativeHypot script;
@@ -41,8 +43,8 @@
     }
 
     private void checkNativeHypotFloatFloatFloat() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3d61f129bdf66001l, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3d61f129bdf66002l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xbdf66001l, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xbdf66002l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -63,11 +65,16 @@
 
     private void verifyResultsNativeHypotFloatFloatFloat(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeHypotFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeHypotFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeHypotFloat2Float2Float2() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x92a8064760a50e4dl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x92a8064760a50e4el, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x60a50e4dl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x60a50e4el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -129,11 +144,16 @@
 
     private void verifyResultsNativeHypotFloat2Float2Float2(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeHypotFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeHypotFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeHypotFloat3Float3Float3() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe70ce46762830feel, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe70ce46762830fefl, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x62830feel, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x62830fefl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -195,11 +223,16 @@
 
     private void verifyResultsNativeHypotFloat3Float3Float3(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeHypotFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeHypotFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeHypotFloat4Float4Float4() {
-        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3b71c2876461118fl, false);
-        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3b71c28764611190l, false);
+        Allocation inA = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6461118fl, false);
+        Allocation inB = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x64611190l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInB(inB);
@@ -261,11 +302,16 @@
 
     private void verifyResultsNativeHypotFloat4Float4Float4(Allocation inA, Allocation inB, Allocation out, boolean relaxed) {
         float[] arrayInA = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInA, (float) 42);
         inA.copyTo(arrayInA);
         float[] arrayInB = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInB, (float) 42);
         inB.copyTo(arrayInB);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,27 +327,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inA: ");
-                    appendVariableToMessage(message, args.inA);
-                    message.append("\n");
-                    message.append("Input inB: ");
-                    appendVariableToMessage(message, args.inB);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inA: ");
+                        appendVariableToMessage(message, args.inA);
+                        message.append("\n");
+                        message.append("Input inB: ");
+                        appendVariableToMessage(message, args.inB);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeHypotFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeHypotFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeHypot() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLength.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLength.java
index 4a8b86a..176f75b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLength.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLength.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeLength extends RSBaseCompute {
 
     private ScriptC_TestNativeLength script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeLengthFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xbe51f0c4d1df20ecl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd1df20ecl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeLengthFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeLengthFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatFloat args = new ArgumentsFloatFloat();
             // Create the appropriate sized arrays in args
@@ -76,23 +82,29 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                message.append("Input inV: ");
-                appendVariableToMessage(message, arrayInV[i]);
-                message.append("\n");
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    message.append("Input inV: ");
+                    appendVariableToMessage(message, arrayInV[i]);
+                    message.append("\n");
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
+                    message.append("\n");
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
+                    message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("\n");
-                assertTrue("Incorrect output for checkNativeLengthFloatFloat" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkNativeLengthFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatNFloat {
@@ -101,7 +113,7 @@
     }
 
     private void checkNativeLengthFloat2Float() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xf7c2930af1b4824cl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xf1b4824cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeLengthFloat2Float(inV, out);
@@ -120,9 +132,13 @@
 
     private void verifyResultsNativeLengthFloat2Float(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloat args = new ArgumentsFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -140,29 +156,35 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, arrayInV[i * 2 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 2 ; j++) {
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, arrayInV[i * 2 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
+                    message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkNativeLengthFloat2Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkNativeLengthFloat2Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeLengthFloat3Float() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf7c29dac50bb10adl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x50bb10adl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeLengthFloat3Float(inV, out);
@@ -181,9 +203,13 @@
 
     private void verifyResultsNativeLengthFloat3Float(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloat args = new ArgumentsFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -201,29 +227,35 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, arrayInV[i * 4 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, arrayInV[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
+                    message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkNativeLengthFloat3Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkNativeLengthFloat3Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeLengthFloat4Float() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf7c2a84dafc19f0el, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xafc19f0el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeLengthFloat4Float(inV, out);
@@ -242,9 +274,13 @@
 
     private void verifyResultsNativeLengthFloat4Float(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloat args = new ArgumentsFloatNFloat();
             // Create the appropriate sized arrays in args
@@ -262,25 +298,31 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, arrayInV[i * 4 + j]);
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, arrayInV[i * 4 + j]);
+                        message.append("\n");
+                    }
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
                     message.append("\n");
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
+                    message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
-                }
-                message.append("\n");
-                assertTrue("Incorrect output for checkNativeLengthFloat4Float" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkNativeLengthFloat4Float" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeLength() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog.java
index 1f61402..d1d108b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeLog extends RSBaseCompute {
 
     private ScriptC_TestNativeLog script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeLogFloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x6237b14ee6418d2cl, 10e-10, 10e10);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe6418d2cl, 10e-10, 10e10);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeLogFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeLogFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeLogFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeLogFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeLogFloat2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x641a5823d3eee3b0l, 10e-10, 10e10);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd3eee3b0l, 10e-10, 10e10);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeLogFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeLogFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeLogFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeLogFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeLogFloat3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x641c213eca0a048el, 10e-10, 10e10);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xca0a048el, 10e-10, 10e10);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeLogFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeLogFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeLogFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeLogFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeLogFloat4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x641dea59c025256cl, 10e-10, 10e10);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc025256cl, 10e-10, 10e10);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeLogFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeLogFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeLogFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeLogFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeLog() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog10.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog10.java
index 7cadd6b..4d4278b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog10.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog10.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeLog10 extends RSBaseCompute {
 
     private ScriptC_TestNativeLog10 script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeLog10FloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4a5d84f60083219dl, 10e-10, 10e10);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x83219dl, 10e-10, 10e10);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeLog10FloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeLog10FloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeLog10FloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeLog10FloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeLog10Float2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x1d500a10779807d9l, 10e-10, 10e10);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x779807d9l, 10e-10, 10e10);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeLog10Float2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeLog10Float2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeLog10Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeLog10Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeLog10Float3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1d51d32b6db328b7l, 10e-10, 10e10);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6db328b7l, 10e-10, 10e10);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeLog10Float3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeLog10Float3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeLog10Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeLog10Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeLog10Float4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x1d539c4663ce4995l, 10e-10, 10e10);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x63ce4995l, 10e-10, 10e10);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeLog10Float4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeLog10Float4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeLog10Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeLog10Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeLog10() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog1p.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog1p.java
index 2806db3..eaed9c2 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog1p.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog1p.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeLog1p extends RSBaseCompute {
 
     private ScriptC_TestNativeLog1p script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeLog1pFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb77ad6f5e656185dl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe656185dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeLog1pFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeLog1pFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeLog1pFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeLog1pFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeLog1pFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x36154b5368503899l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x68503899l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeLog1pFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeLog1pFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeLog1pFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeLog1pFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeLog1pFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3617146e5e6b5977l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x5e6b5977l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeLog1pFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeLog1pFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeLog1pFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeLog1pFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeLog1pFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3618dd8954867a55l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x54867a55l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeLog1pFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeLog1pFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeLog1pFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeLog1pFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeLog1p() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog2.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog2.java
index 7592524..ba811a8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog2.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeLog2.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeLog2 extends RSBaseCompute {
 
     private ScriptC_TestNativeLog2 script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeLog2FloatFloat() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x19b11c9c54fade20l, 10e-10, 10e10);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x54fade20l, 10e-10, 10e10);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeLog2FloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeLog2FloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeLog2FloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeLog2FloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeLog2Float2Float2() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x90125a688c689604l, 10e-10, 10e10);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8c689604l, 10e-10, 10e10);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeLog2Float2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeLog2Float2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeLog2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeLog2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeLog2Float3Float3() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x901423838283b6e2l, 10e-10, 10e10);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8283b6e2l, 10e-10, 10e10);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeLog2Float3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeLog2Float3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeLog2Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeLog2Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeLog2Float4Float4() {
-        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x9015ec9e789ed7c0l, 10e-10, 10e10);
+        Allocation inV = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x789ed7c0l, 10e-10, 10e10);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeLog2Float4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeLog2Float4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeLog2Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeLog2Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeLog2() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeNormalize.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeNormalize.java
index 401fb73..d3ec54c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeNormalize.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeNormalize.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeNormalize extends RSBaseCompute {
 
     private ScriptC_TestNativeNormalize script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeNormalizeFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x487756167e4aac53l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7e4aac53l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeNormalizeFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeNormalizeFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatFloat args = new ArgumentsFloatFloat();
             // Create the appropriate sized arrays in args
@@ -76,23 +82,29 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                message.append("Input inV: ");
-                appendVariableToMessage(message, arrayInV[i]);
-                message.append("\n");
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    message.append("Input inV: ");
+                    appendVariableToMessage(message, arrayInV[i]);
+                    message.append("\n");
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
+                    message.append("\n");
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
+                    message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("\n");
-                assertTrue("Incorrect output for checkNativeNormalizeFloatFloat" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkNativeNormalizeFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatNFloatN {
@@ -101,7 +113,7 @@
     }
 
     private void checkNativeNormalizeFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x65c77dbcedd0e45fl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xedd0e45fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeNormalizeFloat2Float2(inV, out);
@@ -120,9 +132,13 @@
 
     private void verifyResultsNativeNormalizeFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatN args = new ArgumentsFloatNFloatN();
             // Create the appropriate sized arrays in args
@@ -143,31 +159,37 @@
                 }
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, arrayInV[i * 2 + j]);
-                    message.append("\n");
-                }
-                for (int j = 0; j < 2 ; j++) {
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out[j]);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out[j].couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 2 ; j++) {
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, arrayInV[i * 2 + j]);
+                        message.append("\n");
                     }
-                    message.append("\n");
+                    for (int j = 0; j < 2 ; j++) {
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out[j]);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out[j].couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                    }
+                    message.append("Errors at");
                 }
-                assertTrue("Incorrect output for checkNativeNormalizeFloat2Float2" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkNativeNormalizeFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeNormalizeFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x65c946d7e3ec053dl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe3ec053dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeNormalizeFloat3Float3(inV, out);
@@ -186,9 +208,13 @@
 
     private void verifyResultsNativeNormalizeFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatN args = new ArgumentsFloatNFloatN();
             // Create the appropriate sized arrays in args
@@ -209,31 +235,37 @@
                 }
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, arrayInV[i * 4 + j]);
-                    message.append("\n");
-                }
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out[j]);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out[j].couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, arrayInV[i * 4 + j]);
+                        message.append("\n");
                     }
-                    message.append("\n");
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out[j]);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out[j].couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                    }
+                    message.append("Errors at");
                 }
-                assertTrue("Incorrect output for checkNativeNormalizeFloat3Float3" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkNativeNormalizeFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeNormalizeFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x65cb0ff2da07261bl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xda07261bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeNormalizeFloat4Float4(inV, out);
@@ -252,9 +284,13 @@
 
     private void verifyResultsNativeNormalizeFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatN args = new ArgumentsFloatNFloatN();
             // Create the appropriate sized arrays in args
@@ -275,27 +311,33 @@
                 }
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, arrayInV[i * 4 + j]);
-                    message.append("\n");
-                }
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out[j]);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out[j].couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, arrayInV[i * 4 + j]);
+                        message.append("\n");
                     }
-                    message.append("\n");
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out[j]);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out[j].couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                    }
+                    message.append("Errors at");
                 }
-                assertTrue("Incorrect output for checkNativeNormalizeFloat4Float4" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkNativeNormalizeFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeNormalize() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativePowr.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativePowr.java
index abe6999..930c892 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativePowr.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativePowr.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativePowr extends RSBaseCompute {
 
     private ScriptC_TestNativePowr script;
@@ -41,8 +43,8 @@
     }
 
     private void checkNativePowrFloatFloatFloat() {
-        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x22637077834d1839l, 0, 256);
-        Allocation inExponent = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xef7b0ab4f9181f0fl, -15, 15);
+        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x834d1839l, 0, 256);
+        Allocation inExponent = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf9181f0fl, -15, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -63,11 +65,16 @@
 
     private void verifyResultsNativePowrFloatFloatFloat(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInBase = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInBase, (float) 42);
         inBase.copyTo(arrayInBase);
         float[] arrayInExponent = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInExponent, (float) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
-                    appendVariableToMessage(message, args.inBase);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inBase: ");
+                        appendVariableToMessage(message, args.inBase);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativePowrFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativePowrFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativePowrFloat2Float2Float2() {
-        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x47afceb7283b11a5l, 0, 256);
-        Allocation inExponent = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x65ac261bb67d4abbl, -15, 15);
+        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x283b11a5l, 0, 256);
+        Allocation inExponent = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb67d4abbl, -15, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -129,11 +144,16 @@
 
     private void verifyResultsNativePowrFloat2Float2Float2(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInBase = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInBase, (float) 42);
         inBase.copyTo(arrayInBase);
         float[] arrayInExponent = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInExponent, (float) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
-                    appendVariableToMessage(message, args.inBase);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inBase: ");
+                        appendVariableToMessage(message, args.inBase);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativePowrFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativePowrFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativePowrFloat3Float3Float3() {
-        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe2961d5b10aef718l, 0, 256);
-        Allocation inExponent = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x411aa11d0d9fcd3el, -15, 15);
+        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x10aef718l, 0, 256);
+        Allocation inExponent = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd9fcd3el, -15, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -195,11 +223,16 @@
 
     private void verifyResultsNativePowrFloat3Float3Float3(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInBase = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInBase, (float) 42);
         inBase.copyTo(arrayInBase);
         float[] arrayInExponent = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInExponent, (float) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
-                    appendVariableToMessage(message, args.inBase);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inBase: ");
+                        appendVariableToMessage(message, args.inBase);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativePowrFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativePowrFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativePowrFloat4Float4Float4() {
-        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x7d7c6bfef922dc8bl, 0, 256);
-        Allocation inExponent = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x1c891c1e64c24fc1l, -15, 15);
+        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf922dc8bl, 0, 256);
+        Allocation inExponent = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x64c24fc1l, -15, 15);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -261,11 +302,16 @@
 
     private void verifyResultsNativePowrFloat4Float4Float4(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInBase = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInBase, (float) 42);
         inBase.copyTo(arrayInBase);
         float[] arrayInExponent = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInExponent, (float) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,27 +327,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
-                    appendVariableToMessage(message, args.inBase);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inBase: ");
+                        appendVariableToMessage(message, args.inBase);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativePowrFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativePowrFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativePowr() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRecip.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRecip.java
index 3d4daf7..3793956 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRecip.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRecip.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeRecip extends RSBaseCompute {
 
     private ScriptC_TestNativeRecip script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeRecipFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4ec14a4fcc4ed441l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xcc4ed441l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeRecipFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeRecipFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeRecipFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeRecipFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeRecipFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd1ec6fa169d54a5dl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x69d54a5dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeRecipFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeRecipFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeRecipFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeRecipFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeRecipFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd1ee38bc5ff06b3bl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x5ff06b3bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeRecipFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeRecipFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeRecipFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeRecipFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeRecipFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd1f001d7560b8c19l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x560b8c19l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeRecipFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeRecipFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeRecipFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeRecipFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeRecip() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRootn.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRootn.java
index 989c3f3..09f6c516 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRootn.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRootn.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeRootn extends RSBaseCompute {
 
     private ScriptC_TestNativeRootn script;
@@ -41,8 +43,8 @@
     }
 
     private void checkNativeRootnFloatIntFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x6693fe5c237ac0f1l, false);
-        Allocation inN = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x6693fe5c237ac0e9l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x237ac0f1l, false);
+        Allocation inN = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x237ac0e9l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInN(inN);
@@ -63,11 +65,16 @@
 
     private void verifyResultsNativeRootnFloatIntFloat(Allocation inV, Allocation inN, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayInN = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInN, (int) 42);
         inN.copyTo(arrayInN);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Input inN: ");
-                    appendVariableToMessage(message, args.inN);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Input inN: ");
+                        appendVariableToMessage(message, args.inN);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeRootnFloatIntFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeRootnFloatIntFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeRootnFloat2Int2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x5363e8c04afd5bcdl, false);
-        Allocation inN = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x5363e8c04afd5bc5l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4afd5bcdl, false);
+        Allocation inN = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x4afd5bc5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInN(inN);
@@ -129,11 +144,16 @@
 
     private void verifyResultsNativeRootnFloat2Int2Float2(Allocation inV, Allocation inN, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayInN = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInN, (int) 42);
         inN.copyTo(arrayInN);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Input inN: ");
-                    appendVariableToMessage(message, args.inN);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Input inN: ");
+                        appendVariableToMessage(message, args.inN);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeRootnFloat2Int2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeRootnFloat2Int2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeRootnFloat3Int3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x791a272340afc886l, false);
-        Allocation inN = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x791a272340afc87el, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x40afc886l, false);
+        Allocation inN = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x40afc87el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInN(inN);
@@ -195,11 +223,16 @@
 
     private void verifyResultsNativeRootnFloat3Int3Float3(Allocation inV, Allocation inN, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayInN = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInN, (int) 42);
         inN.copyTo(arrayInN);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Input inN: ");
-                    appendVariableToMessage(message, args.inN);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Input inN: ");
+                        appendVariableToMessage(message, args.inN);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeRootnFloat3Int3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeRootnFloat3Int3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeRootnFloat4Int4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x9ed065863662353fl, false);
-        Allocation inN = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x9ed0658636623537l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3662353fl, false);
+        Allocation inN = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x36623537l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInN(inN);
@@ -261,11 +302,16 @@
 
     private void verifyResultsNativeRootnFloat4Int4Float4(Allocation inV, Allocation inN, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayInN = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInN, (int) 42);
         inN.copyTo(arrayInN);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,27 +327,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Input inN: ");
-                    appendVariableToMessage(message, args.inN);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Input inN: ");
+                        appendVariableToMessage(message, args.inN);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeRootnFloat4Int4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeRootnFloat4Int4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeRootn() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRsqrt.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRsqrt.java
index 14cdc42..fd157b4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRsqrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeRsqrt.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeRsqrt extends RSBaseCompute {
 
     private ScriptC_TestNativeRsqrt script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeRsqrtFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf3caff6b795084f6l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x795084f6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeRsqrtFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeRsqrtFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeRsqrtFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeRsqrtFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeRsqrtFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd5098485fb0a95aal, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xfb0a95aal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeRsqrtFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeRsqrtFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeRsqrtFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeRsqrtFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeRsqrtFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd50b4da0f125b688l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf125b688l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeRsqrtFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeRsqrtFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeRsqrtFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeRsqrtFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeRsqrtFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd50d16bbe740d766l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe740d766l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeRsqrtFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeRsqrtFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeRsqrtFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeRsqrtFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeRsqrt() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSin.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSin.java
index efed35c..a49cd12 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSin.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeSin extends RSBaseCompute {
 
     private ScriptC_TestNativeSin script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeSinFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb8fe46da9f3e52c8l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9f3e52c8l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeSinFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeSinFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSinFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSinFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeSinFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2468764eed9e276cl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xed9e276cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeSinFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeSinFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSinFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSinFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeSinFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x246a3f69e3b9484al, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe3b9484al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeSinFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeSinFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSinFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSinFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeSinFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x246c0884d9d46928l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd9d46928l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeSinFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeSinFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSinFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSinFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeSin() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSincos.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSincos.java
index cc4e42b..60c746b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSincos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSincos.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeSincos extends RSBaseCompute {
 
     private ScriptC_TestNativeSincos script;
@@ -41,7 +43,7 @@
     }
 
     private void checkNativeSincosFloatFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe15df2366436cc13l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x6436cc13l, false);
         try {
             Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
@@ -64,11 +66,16 @@
 
     private void verifyResultsNativeSincosFloatFloatFloat(Allocation inV, Allocation outCos, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOutCos = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOutCos, (float) 42);
         outCos.copyTo(arrayOutCos);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -86,37 +93,45 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outCos: ");
-                    appendVariableToMessage(message, args.outCos);
-                    message.append("\n");
-                    message.append("Actual   output outCos: ");
-                    appendVariableToMessage(message, arrayOutCos[i * 1 + j]);
-                    if (!args.outCos.couldBe(arrayOutCos[i * 1 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outCos: ");
+                        appendVariableToMessage(message, args.outCos);
+                        message.append("\n");
+                        message.append("Actual   output outCos: ");
+                        appendVariableToMessage(message, arrayOutCos[i * 1 + j]);
+                        if (!args.outCos.couldBe(arrayOutCos[i * 1 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j], 0.0005)) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSincosFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSincosFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeSincosFloat2Float2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xe5a1f1dcda676ea9l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xda676ea9l, false);
         try {
             Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
@@ -139,11 +154,16 @@
 
     private void verifyResultsNativeSincosFloat2Float2Float2(Allocation inV, Allocation outCos, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOutCos = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOutCos, (float) 42);
         outCos.copyTo(arrayOutCos);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -161,37 +181,45 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outCos: ");
-                    appendVariableToMessage(message, args.outCos);
-                    message.append("\n");
-                    message.append("Actual   output outCos: ");
-                    appendVariableToMessage(message, arrayOutCos[i * 2 + j]);
-                    if (!args.outCos.couldBe(arrayOutCos[i * 2 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outCos: ");
+                        appendVariableToMessage(message, args.outCos);
+                        message.append("\n");
+                        message.append("Actual   output outCos: ");
+                        appendVariableToMessage(message, arrayOutCos[i * 2 + j]);
+                        if (!args.outCos.couldBe(arrayOutCos[i * 2 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j], 0.0005)) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSincosFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSincosFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeSincosFloat3Float3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3a06cffcdc45704al, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdc45704al, false);
         try {
             Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
@@ -214,11 +242,16 @@
 
     private void verifyResultsNativeSincosFloat3Float3Float3(Allocation inV, Allocation outCos, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOutCos = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOutCos, (float) 42);
         outCos.copyTo(arrayOutCos);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -236,37 +269,45 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outCos: ");
-                    appendVariableToMessage(message, args.outCos);
-                    message.append("\n");
-                    message.append("Actual   output outCos: ");
-                    appendVariableToMessage(message, arrayOutCos[i * 4 + j]);
-                    if (!args.outCos.couldBe(arrayOutCos[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outCos: ");
+                        appendVariableToMessage(message, args.outCos);
+                        message.append("\n");
+                        message.append("Actual   output outCos: ");
+                        appendVariableToMessage(message, arrayOutCos[i * 4 + j]);
+                        if (!args.outCos.couldBe(arrayOutCos[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSincosFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSincosFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeSincosFloat4Float4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8e6bae1cde2371ebl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xde2371ebl, false);
         try {
             Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
@@ -289,11 +330,16 @@
 
     private void verifyResultsNativeSincosFloat4Float4Float4(Allocation inV, Allocation outCos, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOutCos = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOutCos, (float) 42);
         outCos.copyTo(arrayOutCos);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -311,33 +357,41 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outCos: ");
-                    appendVariableToMessage(message, args.outCos);
-                    message.append("\n");
-                    message.append("Actual   output outCos: ");
-                    appendVariableToMessage(message, arrayOutCos[i * 4 + j]);
-                    if (!args.outCos.couldBe(arrayOutCos[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outCos: ");
+                        appendVariableToMessage(message, args.outCos);
+                        message.append("\n");
+                        message.append("Actual   output outCos: ");
+                        appendVariableToMessage(message, arrayOutCos[i * 4 + j]);
+                        if (!args.outCos.couldBe(arrayOutCos[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j], 0.0005)) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSincosFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSincosFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeSincos() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSinh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSinh.java
index 8f03189..28083e9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSinh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSinh.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeSinh extends RSBaseCompute {
 
     private ScriptC_TestNativeSinh script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeSinhFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa11cf844515a0f86l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x515a0f86l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeSinhFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeSinhFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSinhFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSinhFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeSinhFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xaa17dab657f45fbal, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x57f45fbal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeSinhFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeSinhFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSinhFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSinhFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeSinhFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xaa19a3d14e0f8098l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x4e0f8098l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeSinhFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeSinhFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSinhFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSinhFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeSinhFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xaa1b6cec442aa176l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x442aa176l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeSinhFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeSinhFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSinhFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSinhFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeSinh() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSinpi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSinpi.java
index 53ada72..8cd1abf 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSinpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSinpi.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeSinpi extends RSBaseCompute {
 
     private ScriptC_TestNativeSinpi script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeSinpiFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x6e76d30caee7fd93l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xaee7fd93l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeSinpiFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeSinpiFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSinpiFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSinpiFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeSinpiFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd8150be20e10bb9fl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xe10bb9fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeSinpiFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeSinpiFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSinpiFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSinpiFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeSinpiFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd816d4fd042bdc7dl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x42bdc7dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeSinpiFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeSinpiFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSinpiFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSinpiFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeSinpiFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd8189e17fa46fd5bl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xfa46fd5bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeSinpiFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeSinpiFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSinpiFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSinpiFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeSinpi() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSqrt.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSqrt.java
index 7e52f17..75a569f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSqrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeSqrt.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeSqrt extends RSBaseCompute {
 
     private ScriptC_TestNativeSqrt script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeSqrtFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x5de9ec2c642f9b06l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x642f9b06l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeSqrtFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeSqrtFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSqrtFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSqrtFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeSqrtFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x4e6581e66050ef3al, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x6050ef3al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeSqrtFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeSqrtFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSqrtFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSqrtFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeSqrtFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x4e674b01566c1018l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x566c1018l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeSqrtFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeSqrtFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSqrtFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSqrtFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeSqrtFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4e69141c4c8730f6l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4c8730f6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeSqrtFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeSqrtFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeSqrtFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeSqrtFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeSqrt() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTan.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTan.java
index 99aed2d..390538a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTan.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTan.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeTan extends RSBaseCompute {
 
     private ScriptC_TestNativeTan script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeTanFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x62e3c32037b34543l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x37b34543l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeTanFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeTanFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeTanFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeTanFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeTanFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3ee708f9124981cfl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x124981cfl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeTanFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeTanFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeTanFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeTanFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeTanFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3ee8d2140864a2adl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x864a2adl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeTanFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeTanFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeTanFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeTanFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeTanFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3eea9b2efe7fc38bl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xfe7fc38bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeTanFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeTanFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeTanFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeTanFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeTan() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTanh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTanh.java
index c2bb0ca..4b18a96 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTanh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTanh.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeTanh extends RSBaseCompute {
 
     private ScriptC_TestNativeTanh script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeTanhFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2aa8d7f4ecfeca2fl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xecfeca2fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeTanhFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeTanhFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeTanhFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeTanhFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeTanhFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x1d5a7d4a80bc8e5bl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x80bc8e5bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeTanhFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeTanhFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeTanhFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeTanhFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeTanhFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1d5c466576d7af39l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x76d7af39l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeTanhFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeTanhFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeTanhFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeTanhFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeTanhFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x1d5e0f806cf2d017l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6cf2d017l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeTanhFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeTanhFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeTanhFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeTanhFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeTanh() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTanpi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTanpi.java
index c93e6a5..dcf2e608 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTanpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNativeTanpi.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNativeTanpi extends RSBaseCompute {
 
     private ScriptC_TestNativeTanpi script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNativeTanpiFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x88f565b6d39357f6l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd39357f6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNativeTanpiFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNativeTanpiFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeTanpiFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeTanpiFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeTanpiFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x34465ac4e7b090aal, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xe7b090aal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNativeTanpiFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsNativeTanpiFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeTanpiFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeTanpiFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeTanpiFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x344823dfddcbb188l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xddcbb188l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNativeTanpiFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsNativeTanpiFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeTanpiFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeTanpiFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNativeTanpiFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3449ecfad3e6d266l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd3e6d266l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNativeTanpiFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsNativeTanpiFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNativeTanpiFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNativeTanpiFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNativeTanpi() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNextafter.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNextafter.java
index 932f052..57914c8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNextafter.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNextafter.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNextafter extends RSBaseCompute {
 
     private ScriptC_TestNextafter script;
@@ -41,8 +43,8 @@
     }
 
     private void checkNextafterFloatFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa3b02393ad412956l, false);
-        Allocation inTarget = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xde8acce6afd7c03dl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xad412956l, false);
+        Allocation inTarget = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xafd7c03dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInTarget(inTarget);
@@ -63,11 +65,16 @@
 
     private void verifyResultsNextafterFloatFloatFloat(Allocation inV, Allocation inTarget, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayInTarget = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInTarget, (float) 42);
         inTarget.copyTo(arrayInTarget);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Input inTarget: ");
-                    appendVariableToMessage(message, args.inTarget);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Input inTarget: ");
+                        appendVariableToMessage(message, args.inTarget);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNextafterFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNextafterFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNextafterFloat2Float2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x29b40e0584a1e22l, false);
-        Allocation inTarget = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x68f3a41af7e4d541l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x584a1e22l, false);
+        Allocation inTarget = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xf7e4d541l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInTarget(inTarget);
@@ -129,11 +144,16 @@
 
     private void verifyResultsNextafterFloat2Float2Float2(Allocation inV, Allocation inTarget, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayInTarget = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInTarget, (float) 42);
         inTarget.copyTo(arrayInTarget);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Input inTarget: ");
-                    appendVariableToMessage(message, args.inTarget);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Input inTarget: ");
+                        appendVariableToMessage(message, args.inTarget);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNextafterFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNextafterFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNextafterFloat3Float3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x57001f005a281fc3l, false);
-        Allocation inTarget = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3261a1f4e4f910dcl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x5a281fc3l, false);
+        Allocation inTarget = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe4f910dcl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInTarget(inTarget);
@@ -195,11 +223,16 @@
 
     private void verifyResultsNextafterFloat3Float3Float3(Allocation inV, Allocation inTarget, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayInTarget = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInTarget, (float) 42);
         inTarget.copyTo(arrayInTarget);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Input inTarget: ");
-                    appendVariableToMessage(message, args.inTarget);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Input inTarget: ");
+                        appendVariableToMessage(message, args.inTarget);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNextafterFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNextafterFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNextafterFloat4Float4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xab64fd205c062164l, false);
-        Allocation inTarget = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xfbcf9fced20d4c77l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x5c062164l, false);
+        Allocation inTarget = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd20d4c77l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInTarget(inTarget);
@@ -261,11 +302,16 @@
 
     private void verifyResultsNextafterFloat4Float4Float4(Allocation inV, Allocation inTarget, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayInTarget = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInTarget, (float) 42);
         inTarget.copyTo(arrayInTarget);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,27 +327,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Input inTarget: ");
-                    appendVariableToMessage(message, args.inTarget);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Input inTarget: ");
+                        appendVariableToMessage(message, args.inTarget);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkNextafterFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkNextafterFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNextafter() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNormalize.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNormalize.java
index ed233bc..8dd2708 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNormalize.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestNormalize.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestNormalize extends RSBaseCompute {
 
     private ScriptC_TestNormalize script;
@@ -40,7 +42,7 @@
     }
 
     private void checkNormalizeFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x6db01d449460061cl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9460061cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testNormalizeFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsNormalizeFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatFloat args = new ArgumentsFloatFloat();
             // Create the appropriate sized arrays in args
@@ -76,23 +82,29 @@
                 valid = false;
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                message.append("Input inV: ");
-                appendVariableToMessage(message, arrayInV[i]);
-                message.append("\n");
-                message.append("Expected output out: ");
-                appendVariableToMessage(message, args.out);
-                message.append("\n");
-                message.append("Actual   output out: ");
-                appendVariableToMessage(message, arrayOut[i]);
-                if (!args.out.couldBe(arrayOut[i])) {
-                    message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    message.append("Input inV: ");
+                    appendVariableToMessage(message, arrayInV[i]);
+                    message.append("\n");
+                    message.append("Expected output out: ");
+                    appendVariableToMessage(message, args.out);
+                    message.append("\n");
+                    message.append("Actual   output out: ");
+                    appendVariableToMessage(message, arrayOut[i]);
+                    if (!args.out.couldBe(arrayOut[i])) {
+                        message.append(" FAIL");
+                    }
+                    message.append("\n");
+                    message.append("Errors at");
                 }
-                message.append("\n");
-                assertTrue("Incorrect output for checkNormalizeFloatFloat" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkNormalizeFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public class ArgumentsFloatNFloatN {
@@ -101,7 +113,7 @@
     }
 
     private void checkNormalizeFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3cde199a6e066120l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x6e066120l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testNormalizeFloat2Float2(inV, out);
@@ -120,9 +132,13 @@
 
     private void verifyResultsNormalizeFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatN args = new ArgumentsFloatNFloatN();
             // Create the appropriate sized arrays in args
@@ -143,31 +159,37 @@
                 }
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 2 ; j++) {
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, arrayInV[i * 2 + j]);
-                    message.append("\n");
-                }
-                for (int j = 0; j < 2 ; j++) {
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out[j]);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out[j].couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 2 ; j++) {
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, arrayInV[i * 2 + j]);
+                        message.append("\n");
                     }
-                    message.append("\n");
+                    for (int j = 0; j < 2 ; j++) {
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out[j]);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out[j].couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                    }
+                    message.append("Errors at");
                 }
-                assertTrue("Incorrect output for checkNormalizeFloat2Float2" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkNormalizeFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNormalizeFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3cdfe2b5642181fel, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x642181fel, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testNormalizeFloat3Float3(inV, out);
@@ -186,9 +208,13 @@
 
     private void verifyResultsNormalizeFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatN args = new ArgumentsFloatNFloatN();
             // Create the appropriate sized arrays in args
@@ -209,31 +235,37 @@
                 }
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, arrayInV[i * 4 + j]);
-                    message.append("\n");
-                }
-                for (int j = 0; j < 3 ; j++) {
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out[j]);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out[j].couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, arrayInV[i * 4 + j]);
+                        message.append("\n");
                     }
-                    message.append("\n");
+                    for (int j = 0; j < 3 ; j++) {
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out[j]);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out[j].couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                    }
+                    message.append("Errors at");
                 }
-                assertTrue("Incorrect output for checkNormalizeFloat3Float3" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkNormalizeFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkNormalizeFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x3ce1abd05a3ca2dcl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x5a3ca2dcl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testNormalizeFloat4Float4(inV, out);
@@ -252,9 +284,13 @@
 
     private void verifyResultsNormalizeFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             ArgumentsFloatNFloatN args = new ArgumentsFloatNFloatN();
             // Create the appropriate sized arrays in args
@@ -275,27 +311,33 @@
                 }
             }
             if (!valid) {
-                StringBuilder message = new StringBuilder();
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, arrayInV[i * 4 + j]);
-                    message.append("\n");
-                }
-                for (int j = 0; j < 4 ; j++) {
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out[j]);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out[j].couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                if (!errorFound) {
+                    errorFound = true;
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, arrayInV[i * 4 + j]);
+                        message.append("\n");
                     }
-                    message.append("\n");
+                    for (int j = 0; j < 4 ; j++) {
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out[j]);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out[j].couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                    }
+                    message.append("Errors at");
                 }
-                assertTrue("Incorrect output for checkNormalizeFloat4Float4" +
-                        (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                message.append(" [");
+                message.append(Integer.toString(i));
+                message.append("]");
             }
         }
+        assertFalse("Incorrect output for checkNormalizeFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testNormalize() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPow.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPow.java
index 0990141..296927e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPow.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPow.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestPow extends RSBaseCompute {
 
     private ScriptC_TestPow script;
@@ -41,8 +43,8 @@
     }
 
     private void checkPowFloatFloatFloat() {
-        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x377b8a6622b91eel, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x8bdde8de49a5f734l, false);
+        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x622b91eel, false);
+        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x49a5f734l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -63,11 +65,16 @@
 
     private void verifyResultsPowFloatFloatFloat(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInBase = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInBase, (float) 42);
         inBase.copyTo(arrayInBase);
         float[] arrayInExponent = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInExponent, (float) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
-                    appendVariableToMessage(message, args.inBase);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inBase: ");
+                        appendVariableToMessage(message, args.inBase);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkPowFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkPowFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkPowFloat2Float2Float2() {
-        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x15be0382895c2294l, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xeb77bf60bbad35fal, false);
+        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x895c2294l, false);
+        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xbbad35fal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -129,11 +144,16 @@
 
     private void verifyResultsPowFloat2Float2Float2(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInBase = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInBase, (float) 42);
         inBase.copyTo(arrayInBase);
         float[] arrayInExponent = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInExponent, (float) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
-                    appendVariableToMessage(message, args.inBase);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inBase: ");
+                        appendVariableToMessage(message, args.inBase);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkPowFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkPowFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkPowFloat3Float3Float3() {
-        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xb0a4522671d00807l, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc6e63a6212cfb87dl, false);
+        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x71d00807l, false);
+        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x12cfb87dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -195,11 +223,16 @@
 
     private void verifyResultsPowFloat3Float3Float3(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInBase = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInBase, (float) 42);
         inBase.copyTo(arrayInBase);
         float[] arrayInExponent = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInExponent, (float) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
-                    appendVariableToMessage(message, args.inBase);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inBase: ");
+                        appendVariableToMessage(message, args.inBase);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkPowFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkPowFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkPowFloat4Float4Float4() {
-        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4b8aa0ca5a43ed7al, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xa254b56369f23b00l, false);
+        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x5a43ed7al, false);
+        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x69f23b00l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -261,11 +302,16 @@
 
     private void verifyResultsPowFloat4Float4Float4(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInBase = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInBase, (float) 42);
         inBase.copyTo(arrayInBase);
         float[] arrayInExponent = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInExponent, (float) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,27 +327,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
-                    appendVariableToMessage(message, args.inBase);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inBase: ");
+                        appendVariableToMessage(message, args.inBase);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkPowFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkPowFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testPow() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPown.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPown.java
index 28deaa7..5a866f5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPown.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPown.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestPown extends RSBaseCompute {
 
     private ScriptC_TestPown script;
@@ -41,8 +43,8 @@
     }
 
     private void checkPownFloatIntFloat() {
-        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe020952d622f0405l, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x9c3888e9096b9f1bl, false);
+        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x622f0405l, false);
+        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x96b9f1bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -63,11 +65,16 @@
 
     private void verifyResultsPownFloatIntFloat(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInBase = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInBase, (float) 42);
         inBase.copyTo(arrayInBase);
         int[] arrayInExponent = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInExponent, (int) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
-                    appendVariableToMessage(message, args.inBase);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inBase: ");
+                        appendVariableToMessage(message, args.inBase);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkPownFloatIntFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkPownFloatIntFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkPownFloat2Int2Float2() {
-        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x7571c02be438467l, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xe6177b3249076ddl, false);
+        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xbe438467l, false);
+        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x249076ddl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -129,11 +144,16 @@
 
     private void verifyResultsPownFloat2Int2Float2(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInBase = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInBase, (float) 42);
         inBase.copyTo(arrayInBase);
         int[] arrayInExponent = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInExponent, (int) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
-                    appendVariableToMessage(message, args.inBase);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inBase: ");
+                        appendVariableToMessage(message, args.inBase);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkPownFloat2Int2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkPownFloat2Int2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkPownFloat3Int3Float3() {
-        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x5e88c45be35ff8a2l, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xaf710734144a81a8l, false);
+        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe35ff8a2l, false);
+        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x144a81a8l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -195,11 +223,16 @@
 
     private void verifyResultsPownFloat3Int3Float3(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInBase = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInBase, (float) 42);
         inBase.copyTo(arrayInBase);
         int[] arrayInExponent = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInExponent, (int) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
-                    appendVariableToMessage(message, args.inBase);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inBase: ");
+                        appendVariableToMessage(message, args.inBase);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkPownFloat3Int3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkPownFloat3Int3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkPownFloat4Int4Float4() {
-        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb5ba6cb5087c6cddl, false);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x508096b504048c73l, false);
+        Allocation inBase = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x87c6cddl, false);
+        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x4048c73l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -261,11 +302,16 @@
 
     private void verifyResultsPownFloat4Int4Float4(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInBase = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInBase, (float) 42);
         inBase.copyTo(arrayInBase);
         int[] arrayInExponent = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInExponent, (int) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,27 +327,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
-                    appendVariableToMessage(message, args.inBase);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inBase: ");
+                        appendVariableToMessage(message, args.inBase);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkPownFloat4Int4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkPownFloat4Int4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testPown() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPowr.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPowr.java
index a1fd360..710d89b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPowr.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestPowr.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestPowr extends RSBaseCompute {
 
     private ScriptC_TestPowr script;
@@ -41,8 +43,8 @@
     }
 
     private void checkPowrFloatFloatFloat() {
-        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x432f9eac0c490ca4l, 0, 3000);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7ee76eaeab21ab0al, false);
+        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc490ca4l, 0, 3000);
+        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xab21ab0al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -63,11 +65,16 @@
 
     private void verifyResultsPowrFloatFloatFloat(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInBase = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInBase, (float) 42);
         inBase.copyTo(arrayInBase);
         float[] arrayInExponent = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInExponent, (float) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
-                    appendVariableToMessage(message, args.inBase);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inBase: ");
+                        appendVariableToMessage(message, args.inBase);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkPowrFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkPowrFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkPowrFloat2Float2Float2() {
-        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x5ce1f4c2eae1fd16l, 0, 3000);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x1f9ec14817a9ddcl, false);
+        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xeae1fd16l, 0, 3000);
+        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x817a9ddcl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -129,11 +144,16 @@
 
     private void verifyResultsPowrFloat2Float2Float2(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInBase = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInBase, (float) 42);
         inBase.copyTo(arrayInBase);
         float[] arrayInExponent = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInExponent, (float) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
-                    appendVariableToMessage(message, args.inBase);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inBase: ");
+                        appendVariableToMessage(message, args.inBase);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkPowrFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkPowrFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkPowrFloat3Float3Float3() {
-        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf7c84366d355e289l, 0, 3000);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdd686715d89d205fl, false);
+        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd355e289l, 0, 3000);
+        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd89d205fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -195,11 +223,16 @@
 
     private void verifyResultsPowrFloat3Float3Float3(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInBase = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInBase, (float) 42);
         inBase.copyTo(arrayInBase);
         float[] arrayInExponent = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInExponent, (float) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
-                    appendVariableToMessage(message, args.inBase);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inBase: ");
+                        appendVariableToMessage(message, args.inBase);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkPowrFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkPowrFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkPowrFloat4Float4Float4() {
-        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x92ae920abbc9c7fcl, 0, 3000);
-        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb8d6e2172fbfa2e2l, false);
+        Allocation inBase = createRandomFloatAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbbc9c7fcl, 0, 3000);
+        Allocation inExponent = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x2fbfa2e2l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInExponent(inExponent);
@@ -261,11 +302,16 @@
 
     private void verifyResultsPowrFloat4Float4Float4(Allocation inBase, Allocation inExponent, Allocation out, boolean relaxed) {
         float[] arrayInBase = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInBase, (float) 42);
         inBase.copyTo(arrayInBase);
         float[] arrayInExponent = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInExponent, (float) 42);
         inExponent.copyTo(arrayInExponent);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,27 +327,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inBase: ");
-                    appendVariableToMessage(message, args.inBase);
-                    message.append("\n");
-                    message.append("Input inExponent: ");
-                    appendVariableToMessage(message, args.inExponent);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inBase: ");
+                        appendVariableToMessage(message, args.inBase);
+                        message.append("\n");
+                        message.append("Input inExponent: ");
+                        appendVariableToMessage(message, args.inExponent);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkPowrFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkPowrFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testPowr() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRadians.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRadians.java
index cb908be..3dbba71 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRadians.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRadians.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestRadians extends RSBaseCompute {
 
     private ScriptC_TestRadians script;
@@ -40,7 +42,7 @@
     }
 
     private void checkRadiansFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x6e5054c0042adfabl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x42adfabl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testRadiansFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsRadiansFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRadiansFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRadiansFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRadiansFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc20ed424de23baf7l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xde23baf7l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testRadiansFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsRadiansFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRadiansFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRadiansFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRadiansFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc2109d3fd43edbd5l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd43edbd5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testRadiansFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsRadiansFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRadiansFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRadiansFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRadiansFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc212665aca59fcb3l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xca59fcb3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testRadiansFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsRadiansFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRadiansFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRadiansFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testRadians() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRemainder.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRemainder.java
index 2bd73c5..5bbcc3a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRemainder.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRemainder.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestRemainder extends RSBaseCompute {
 
     private ScriptC_TestRemainder script;
@@ -41,8 +43,8 @@
     }
 
     private void checkRemainderFloatFloatFloat() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd47c3f07317ea229l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb246eb0ee2ebe35al, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x317ea229l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe2ebe35al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -63,11 +65,16 @@
 
     private void verifyResultsRemainderFloatFloatFloat(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRemainderFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRemainderFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRemainderFloat2Float2Float2() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x27d975633fdcf8d5l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xce8489f2aa4be3a6l, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3fdcf8d5l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xaa4be3a6l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -129,11 +144,16 @@
 
     private void verifyResultsRemainderFloat2Float2Float2(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRemainderFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRemainderFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRemainderFloat3Float3Float3() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3681e9ce2a8e4d6l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x97e8cb3b7d2776dfl, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe2a8e4d6l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x7d2776dfl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -195,11 +223,16 @@
 
     private void verifyResultsRemainderFloat3Float3Float3(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRemainderFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRemainderFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRemainderFloat4Float4Float4() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xdef6c7d68574d0d7l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x614d0c8450030a18l, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8574d0d7l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x50030a18l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInDenominator(inDenominator);
@@ -261,11 +302,16 @@
 
     private void verifyResultsRemainderFloat4Float4Float4(Allocation inNumerator, Allocation inDenominator, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,27 +327,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRemainderFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRemainderFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testRemainder() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRemquo.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRemquo.java
index 29338d8..d4868a6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRemquo.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRemquo.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestRemquo extends RSBaseCompute {
 
     private ScriptC_TestRemquo script;
@@ -42,8 +44,8 @@
     }
 
     private void checkRemquoFloatFloatIntFloat() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xcd5efc69edd4ff2al, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4ff0c9312eb19f93l, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xedd4ff2al, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x2eb19f93l, false);
         try {
             Allocation outQuotient = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 1), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
@@ -68,13 +70,19 @@
 
     private void verifyResultsRemquoFloatFloatIntFloat(Allocation inNumerator, Allocation inDenominator, Allocation outQuotient, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         int[] arrayOutQuotient = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayOutQuotient, (int) 42);
         outQuotient.copyTo(arrayOutQuotient);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -89,30 +97,38 @@
                 String errorMessage = CoreMathVerifier.verifyRemquo(args, target);
                 boolean valid = errorMessage == null;
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Output outQuotient: ");
-                    appendVariableToMessage(message, args.outQuotient);
-                    message.append("\n");
-                    message.append("Output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append(errorMessage);
-                    assertTrue("Incorrect output for checkRemquoFloatFloatIntFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Output outQuotient: ");
+                        appendVariableToMessage(message, args.outQuotient);
+                        message.append("\n");
+                        message.append("Output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append(errorMessage);
+                        message.append("Errors at");
+                    }
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRemquoFloatFloatIntFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRemquoFloat2Float2Int2Float2() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x28c14abc3a27171al, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x58f8799a6ba08403l, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3a27171al, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x6ba08403l, false);
         try {
             Allocation outQuotient = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 2), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
@@ -137,13 +153,19 @@
 
     private void verifyResultsRemquoFloat2Float2Int2Float2(Allocation inNumerator, Allocation inDenominator, Allocation outQuotient, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         int[] arrayOutQuotient = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayOutQuotient, (int) 42);
         outQuotient.copyTo(arrayOutQuotient);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -158,30 +180,38 @@
                 String errorMessage = CoreMathVerifier.verifyRemquo(args, target);
                 boolean valid = errorMessage == null;
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Output outQuotient: ");
-                    appendVariableToMessage(message, args.outQuotient);
-                    message.append("\n");
-                    message.append("Output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append(errorMessage);
-                    assertTrue("Incorrect output for checkRemquoFloat2Float2Int2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Output outQuotient: ");
+                        appendVariableToMessage(message, args.outQuotient);
+                        message.append("\n");
+                        message.append("Output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append(errorMessage);
+                        message.append("Errors at");
+                    }
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRemquoFloat2Float2Int2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRemquoFloat3Float3Int3Float3() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf60211df96052526l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd1d6c7fcf273f8afl, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x96052526l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf273f8afl, false);
         try {
             Allocation outQuotient = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 3), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
@@ -206,13 +236,19 @@
 
     private void verifyResultsRemquoFloat3Float3Int3Float3(Allocation inNumerator, Allocation inDenominator, Allocation outQuotient, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         int[] arrayOutQuotient = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOutQuotient, (int) 42);
         outQuotient.copyTo(arrayOutQuotient);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -227,30 +263,38 @@
                 String errorMessage = CoreMathVerifier.verifyRemquo(args, target);
                 boolean valid = errorMessage == null;
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Output outQuotient: ");
-                    appendVariableToMessage(message, args.outQuotient);
-                    message.append("\n");
-                    message.append("Output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append(errorMessage);
-                    assertTrue("Incorrect output for checkRemquoFloat3Float3Int3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Output outQuotient: ");
+                        appendVariableToMessage(message, args.outQuotient);
+                        message.append("\n");
+                        message.append("Output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append(errorMessage);
+                        message.append("Errors at");
+                    }
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRemquoFloat3Float3Int3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRemquoFloat4Float4Int4Float4() {
-        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xc342d902f1e33332l, false);
-        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4ab5165f79476d5bl, false);
+        Allocation inNumerator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf1e33332l, false);
+        Allocation inDenominator = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x79476d5bl, false);
         try {
             Allocation outQuotient = Allocation.createSized(mRS, getElement(mRS, Element.DataType.SIGNED_32, 4), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
@@ -275,13 +319,19 @@
 
     private void verifyResultsRemquoFloat4Float4Int4Float4(Allocation inNumerator, Allocation inDenominator, Allocation outQuotient, Allocation out, boolean relaxed) {
         float[] arrayInNumerator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInNumerator, (float) 42);
         inNumerator.copyTo(arrayInNumerator);
         float[] arrayInDenominator = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInDenominator, (float) 42);
         inDenominator.copyTo(arrayInDenominator);
         int[] arrayOutQuotient = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayOutQuotient, (int) 42);
         outQuotient.copyTo(arrayOutQuotient);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -296,25 +346,33 @@
                 String errorMessage = CoreMathVerifier.verifyRemquo(args, target);
                 boolean valid = errorMessage == null;
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inNumerator: ");
-                    appendVariableToMessage(message, args.inNumerator);
-                    message.append("\n");
-                    message.append("Input inDenominator: ");
-                    appendVariableToMessage(message, args.inDenominator);
-                    message.append("\n");
-                    message.append("Output outQuotient: ");
-                    appendVariableToMessage(message, args.outQuotient);
-                    message.append("\n");
-                    message.append("Output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append(errorMessage);
-                    assertTrue("Incorrect output for checkRemquoFloat4Float4Int4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inNumerator: ");
+                        appendVariableToMessage(message, args.inNumerator);
+                        message.append("\n");
+                        message.append("Input inDenominator: ");
+                        appendVariableToMessage(message, args.inDenominator);
+                        message.append("\n");
+                        message.append("Output outQuotient: ");
+                        appendVariableToMessage(message, args.outQuotient);
+                        message.append("\n");
+                        message.append("Output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append(errorMessage);
+                        message.append("Errors at");
+                    }
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRemquoFloat4Float4Int4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testRemquo() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRint.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRint.java
index 975f321..1c22e95 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRint.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRint.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestRint extends RSBaseCompute {
 
     private ScriptC_TestRint script;
@@ -40,7 +42,7 @@
     }
 
     private void checkRintFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb88cd9adbf02db54l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xbf02db54l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testRintFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsRintFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRintFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRintFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRintFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xf12aed2f601c6298l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x601c6298l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testRintFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsRintFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRintFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRintFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRintFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf12cb64a56378376l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x56378376l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testRintFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsRintFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRintFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRintFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRintFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xf12e7f654c52a454l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4c52a454l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testRintFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsRintFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRintFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRintFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testRint() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRootn.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRootn.java
index 1d7a628..5403dda 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRootn.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRootn.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestRootn extends RSBaseCompute {
 
     private ScriptC_TestRootn script;
@@ -41,8 +43,8 @@
     }
 
     private void checkRootnFloatIntFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x37d0d9514daae0ccl, false);
-        Allocation inN = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x37d0d9514daae0c4l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4daae0ccl, false);
+        Allocation inN = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 1, 0x4daae0c4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInN(inN);
@@ -63,11 +65,16 @@
 
     private void verifyResultsRootnFloatIntFloat(Allocation inV, Allocation inN, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayInN = new int[INPUTSIZE * 1];
+        Arrays.fill(arrayInN, (int) 42);
         inN.copyTo(arrayInN);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Input inN: ");
-                    appendVariableToMessage(message, args.inN);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Input inN: ");
+                        appendVariableToMessage(message, args.inN);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRootnFloatIntFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRootnFloatIntFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRootnFloat2Int2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2a7a849dcb32d88el, false);
-        Allocation inN = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0x2a7a849dcb32d886l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xcb32d88el, false);
+        Allocation inN = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 2, 0xcb32d886l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInN(inN);
@@ -129,11 +144,16 @@
 
     private void verifyResultsRootnFloat2Int2Float2(Allocation inV, Allocation inN, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayInN = new int[INPUTSIZE * 2];
+        Arrays.fill(arrayInN, (int) 42);
         inN.copyTo(arrayInN);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Input inN: ");
-                    appendVariableToMessage(message, args.inN);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Input inN: ");
+                        appendVariableToMessage(message, args.inN);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRootnFloat2Int2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRootnFloat2Int2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRootnFloat3Int3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x5030c300c0e54547l, false);
-        Allocation inN = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0x5030c300c0e5453fl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc0e54547l, false);
+        Allocation inN = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 3, 0xc0e5453fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInN(inN);
@@ -195,11 +223,16 @@
 
     private void verifyResultsRootnFloat3Int3Float3(Allocation inV, Allocation inN, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayInN = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInN, (int) 42);
         inN.copyTo(arrayInN);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Input inN: ");
-                    appendVariableToMessage(message, args.inN);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Input inN: ");
+                        appendVariableToMessage(message, args.inN);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRootnFloat3Int3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRootnFloat3Int3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRootnFloat4Int4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x75e70163b697b200l, false);
-        Allocation inN = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0x75e70163b697b1f8l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xb697b200l, false);
+        Allocation inN = createRandomAllocation(mRS, Element.DataType.SIGNED_32, 4, 0xb697b1f8l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInN(inN);
@@ -261,11 +302,16 @@
 
     private void verifyResultsRootnFloat4Int4Float4(Allocation inV, Allocation inN, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         int[] arrayInN = new int[INPUTSIZE * 4];
+        Arrays.fill(arrayInN, (int) 42);
         inN.copyTo(arrayInN);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,27 +327,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Input inN: ");
-                    appendVariableToMessage(message, args.inN);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Input inN: ");
+                        appendVariableToMessage(message, args.inN);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRootnFloat4Int4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRootnFloat4Int4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testRootn() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRound.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRound.java
index 60bf608..3fde559 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRound.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRound.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestRound extends RSBaseCompute {
 
     private ScriptC_TestRound script;
@@ -40,7 +42,7 @@
     }
 
     private void checkRoundFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x51f05c443f4006c3l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x3f4006c3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testRoundFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsRoundFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRoundFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRoundFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRoundFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xd0e51e3399eb174fl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x99eb174fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testRoundFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsRoundFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRoundFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRoundFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRoundFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xd0e6e74e9006382dl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x9006382dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testRoundFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsRoundFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRoundFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRoundFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRoundFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xd0e8b0698621590bl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8621590bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testRoundFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsRoundFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRoundFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRoundFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testRound() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRsqrt.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRsqrt.java
index b44c4e9..b4c3e23 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRsqrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestRsqrt.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestRsqrt extends RSBaseCompute {
 
     private ScriptC_TestRsqrt script;
@@ -40,7 +42,7 @@
     }
 
     private void checkRsqrtFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x637c4873aa3f3b8fl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xaa3f3b8fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testRsqrtFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsRsqrtFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRsqrtFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRsqrtFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRsqrtFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8c8200af672f6cbbl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x672f6cbbl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testRsqrtFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsRsqrtFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRsqrtFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRsqrtFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRsqrtFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8c83c9ca5d4a8d99l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x5d4a8d99l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testRsqrtFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsRsqrtFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRsqrtFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRsqrtFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkRsqrtFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8c8592e55365ae77l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x5365ae77l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testRsqrtFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsRsqrtFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkRsqrtFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkRsqrtFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testRsqrt() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSign.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSign.java
index 7e5d7e6..d3f12fe 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSign.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSign.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestSign extends RSBaseCompute {
 
     private ScriptC_TestSign script;
@@ -40,7 +42,7 @@
     }
 
     private void checkSignFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xadc8bc2f364ea474l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x364ea474l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testSignFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsSignFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSignFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSignFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkSignFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x2eb1e646027c0ab8l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x27c0ab8l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testSignFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsSignFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSignFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSignFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkSignFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x2eb3af60f8972b96l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf8972b96l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testSignFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsSignFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSignFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSignFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkSignFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x2eb5787beeb24c74l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xeeb24c74l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testSignFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsSignFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSignFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSignFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testSign() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSin.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSin.java
index 80318a8..6acf220 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSin.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSin.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestSin extends RSBaseCompute {
 
     private ScriptC_TestSin script;
@@ -40,7 +42,7 @@
     }
 
     private void checkSinFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x983d81dfe3401d29l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe3401d29l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testSinFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsSinFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSinFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSinFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkSinFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x9419bf571e8cde05l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x1e8cde05l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testSinFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsSinFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSinFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSinFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkSinFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x941b887214a7fee3l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x14a7fee3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testSinFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsSinFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSinFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSinFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkSinFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x941d518d0ac31fc1l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xac31fc1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testSinFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsSinFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSinFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSinFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testSin() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSincos.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSincos.java
index f238e8b..64d71d4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSincos.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSincos.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestSincos extends RSBaseCompute {
 
     private ScriptC_TestSincos script;
@@ -41,7 +43,7 @@
     }
 
     private void checkSincosFloatFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb8748e13e46c48d4l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xe46c48d4l, false);
         try {
             Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
@@ -64,11 +66,16 @@
 
     private void verifyResultsSincosFloatFloatFloat(Allocation inV, Allocation outCos, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOutCos = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOutCos, (float) 42);
         outCos.copyTo(arrayOutCos);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -86,37 +93,45 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outCos: ");
-                    appendVariableToMessage(message, args.outCos);
-                    message.append("\n");
-                    message.append("Actual   output outCos: ");
-                    appendVariableToMessage(message, arrayOutCos[i * 1 + j]);
-                    if (!args.outCos.couldBe(arrayOutCos[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outCos: ");
+                        appendVariableToMessage(message, args.outCos);
+                        message.append("\n");
+                        message.append("Actual   output outCos: ");
+                        appendVariableToMessage(message, arrayOutCos[i * 1 + j]);
+                        if (!args.outCos.couldBe(arrayOutCos[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSincosFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSincosFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkSincosFloat2Float2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xc85bab4e3e2fc77cl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3e2fc77cl, false);
         try {
             Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
@@ -139,11 +154,16 @@
 
     private void verifyResultsSincosFloat2Float2Float2(Allocation inV, Allocation outCos, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOutCos = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOutCos, (float) 42);
         outCos.copyTo(arrayOutCos);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -161,37 +181,45 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outCos: ");
-                    appendVariableToMessage(message, args.outCos);
-                    message.append("\n");
-                    message.append("Actual   output outCos: ");
-                    appendVariableToMessage(message, arrayOutCos[i * 2 + j]);
-                    if (!args.outCos.couldBe(arrayOutCos[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outCos: ");
+                        appendVariableToMessage(message, args.outCos);
+                        message.append("\n");
+                        message.append("Actual   output outCos: ");
+                        appendVariableToMessage(message, arrayOutCos[i * 2 + j]);
+                        if (!args.outCos.couldBe(arrayOutCos[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSincosFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSincosFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkSincosFloat3Float3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x1cc0896e400dc91dl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x400dc91dl, false);
         try {
             Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
@@ -214,11 +242,16 @@
 
     private void verifyResultsSincosFloat3Float3Float3(Allocation inV, Allocation outCos, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOutCos = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOutCos, (float) 42);
         outCos.copyTo(arrayOutCos);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -236,37 +269,45 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outCos: ");
-                    appendVariableToMessage(message, args.outCos);
-                    message.append("\n");
-                    message.append("Actual   output outCos: ");
-                    appendVariableToMessage(message, arrayOutCos[i * 4 + j]);
-                    if (!args.outCos.couldBe(arrayOutCos[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outCos: ");
+                        appendVariableToMessage(message, args.outCos);
+                        message.append("\n");
+                        message.append("Actual   output outCos: ");
+                        appendVariableToMessage(message, arrayOutCos[i * 4 + j]);
+                        if (!args.outCos.couldBe(arrayOutCos[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSincosFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSincosFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkSincosFloat4Float4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x7125678e41ebcabel, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x41ebcabel, false);
         try {
             Allocation outCos = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
@@ -289,11 +330,16 @@
 
     private void verifyResultsSincosFloat4Float4Float4(Allocation inV, Allocation outCos, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOutCos = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOutCos, (float) 42);
         outCos.copyTo(arrayOutCos);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -311,33 +357,41 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output outCos: ");
-                    appendVariableToMessage(message, args.outCos);
-                    message.append("\n");
-                    message.append("Actual   output outCos: ");
-                    appendVariableToMessage(message, arrayOutCos[i * 4 + j]);
-                    if (!args.outCos.couldBe(arrayOutCos[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output outCos: ");
+                        appendVariableToMessage(message, args.outCos);
+                        message.append("\n");
+                        message.append("Actual   output outCos: ");
+                        appendVariableToMessage(message, arrayOutCos[i * 4 + j]);
+                        if (!args.outCos.couldBe(arrayOutCos[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
-                    }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSincosFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSincosFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testSincos() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSinh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSinh.java
index 9adf1c8..20148d4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSinh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSinh.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestSinh extends RSBaseCompute {
 
     private ScriptC_TestSinh script;
@@ -40,7 +42,7 @@
     }
 
     private void checkSinhFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x20bbe226bda70dd1l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xbda70dd1l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testSinhFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsSinhFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSinhFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSinhFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkSinhFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x6cdf1f16900d0b6dl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x900d0b6dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testSinhFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsSinhFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSinhFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSinhFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkSinhFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x6ce0e83186282c4bl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x86282c4bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testSinhFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsSinhFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSinhFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSinhFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkSinhFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6ce2b14c7c434d29l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x7c434d29l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testSinhFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsSinhFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSinhFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSinhFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testSinh() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSinpi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSinpi.java
index f00e45f..61c1d24 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSinpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSinpi.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestSinpi extends RSBaseCompute {
 
     private ScriptC_TestSinpi script;
@@ -40,7 +42,7 @@
     }
 
     private void checkSinpiFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xde281c14dfd6b42cl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xdfd6b42cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testSinpiFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsSinpiFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSinpiFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSinpiFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkSinpiFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8f8d880b7a3592b0l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x7a3592b0l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testSinpiFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsSinpiFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSinpiFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSinpiFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkSinpiFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8f8f51267050b38el, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x7050b38el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testSinpiFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsSinpiFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSinpiFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSinpiFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkSinpiFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8f911a41666bd46cl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x666bd46cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testSinpiFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsSinpiFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSinpiFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSinpiFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testSinpi() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSqrt.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSqrt.java
index fbb4e6d..cbb092d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSqrt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestSqrt.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestSqrt extends RSBaseCompute {
 
     private ScriptC_TestSqrt script;
@@ -40,7 +42,7 @@
     }
 
     private void checkSqrtFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xdd88d60ed07c9951l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd07c9951l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testSqrtFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsSqrtFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSqrtFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSqrtFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkSqrtFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x112cc64698699aedl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x98699aedl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testSqrtFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsSqrtFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSqrtFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSqrtFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkSqrtFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x112e8f618e84bbcbl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8e84bbcbl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testSqrtFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsSqrtFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSqrtFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSqrtFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkSqrtFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x1130587c849fdca9l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x849fdca9l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testSqrtFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsSqrtFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkSqrtFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkSqrtFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testSqrt() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestStep.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestStep.java
index ee2b785..097a093 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestStep.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestStep.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestStep extends RSBaseCompute {
 
     private ScriptC_TestStep script;
@@ -41,8 +43,8 @@
     }
 
     private void checkStepFloatFloatFloat() {
-        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x598900c49184fbfel, false);
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9aefccaa832f44e9l, false);
+        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9184fbfel, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x832f44e9l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.set_gAllocInV(inV);
@@ -63,11 +65,16 @@
 
     private void verifyResultsStepFloatFloatFloat(Allocation inEdge, Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInEdge = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInEdge, (float) 42);
         inEdge.copyTo(arrayInEdge);
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -83,32 +90,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inEdge: ");
-                    appendVariableToMessage(message, args.inEdge);
-                    message.append("\n");
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inEdge: ");
+                        appendVariableToMessage(message, args.inEdge);
+                        message.append("\n");
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkStepFloatFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkStepFloatFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkStepFloat2Float2Float2() {
-        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x6efefa297df69504l, false);
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x12eb000b8567f58bl, false);
+        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x7df69504l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8567f58bl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInV(inV);
@@ -129,11 +144,16 @@
 
     private void verifyResultsStepFloat2Float2Float2(Allocation inEdge, Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInEdge = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInEdge, (float) 42);
         inEdge.copyTo(arrayInEdge);
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -149,32 +169,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inEdge: ");
-                    appendVariableToMessage(message, args.inEdge);
-                    message.append("\n");
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inEdge: ");
+                        appendVariableToMessage(message, args.inEdge);
+                        message.append("\n");
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkStepFloat2Float2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkStepFloat2Float2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkStepFloat3Float3Float3() {
-        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x9e548cd666a7a77l, false);
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x674fde2b8745f72cl, false);
+        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x666a7a77l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8745f72cl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInV(inV);
@@ -195,11 +223,16 @@
 
     private void verifyResultsStepFloat3Float3Float3(Allocation inEdge, Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInEdge = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInEdge, (float) 42);
         inEdge.copyTo(arrayInEdge);
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -215,32 +248,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inEdge: ");
-                    appendVariableToMessage(message, args.inEdge);
-                    message.append("\n");
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inEdge: ");
+                        appendVariableToMessage(message, args.inEdge);
+                        message.append("\n");
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkStepFloat3Float3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkStepFloat3Float3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkStepFloat4Float4Float4() {
-        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xa4cb97714ede5feal, false);
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xbbb4bc4b8923f8cdl, false);
+        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x4ede5feal, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8923f8cdl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInV(inV);
@@ -261,11 +302,16 @@
 
     private void verifyResultsStepFloat4Float4Float4(Allocation inEdge, Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInEdge = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInEdge, (float) 42);
         inEdge.copyTo(arrayInEdge);
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -281,32 +327,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inEdge: ");
-                    appendVariableToMessage(message, args.inEdge);
-                    message.append("\n");
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inEdge: ");
+                        appendVariableToMessage(message, args.inEdge);
+                        message.append("\n");
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkStepFloat4Float4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkStepFloat4Float4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkStepFloat2FloatFloat2() {
-        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb0ac06c45b3d8b26l, false);
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xfa7d66f2b6d48a21l, false);
+        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x5b3d8b26l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb6d48a21l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInV(inV);
@@ -327,11 +381,16 @@
 
     private void verifyResultsStepFloat2FloatFloat2(Allocation inEdge, Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInEdge = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInEdge, (float) 42);
         inEdge.copyTo(arrayInEdge);
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -347,32 +406,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inEdge: ");
-                    appendVariableToMessage(message, args.inEdge);
-                    message.append("\n");
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inEdge: ");
+                        appendVariableToMessage(message, args.inEdge);
+                        message.append("\n");
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkStepFloat2FloatFloat2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkStepFloat2FloatFloat2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkStepFloat3FloatFloat3() {
-        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x304ed837c68f43fal, false);
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4fcd1a0aa53f7e7dl, false);
+        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xc68f43fal, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa53f7e7dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInV(inV);
@@ -393,11 +460,16 @@
 
     private void verifyResultsStepFloat3FloatFloat3(Allocation inEdge, Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInEdge = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInEdge, (float) 42);
         inEdge.copyTo(arrayInEdge);
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -413,32 +485,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inEdge: ");
-                    appendVariableToMessage(message, args.inEdge);
-                    message.append("\n");
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inEdge: ");
+                        appendVariableToMessage(message, args.inEdge);
+                        message.append("\n");
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkStepFloat3FloatFloat3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkStepFloat3FloatFloat3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkStepFloat4FloatFloat4() {
-        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xaff1a9ab31e0fccel, false);
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xa51ccd2293aa72d9l, false);
+        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x31e0fccel, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x93aa72d9l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInV(inV);
@@ -459,11 +539,16 @@
 
     private void verifyResultsStepFloat4FloatFloat4(Allocation inEdge, Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInEdge = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInEdge, (float) 42);
         inEdge.copyTo(arrayInEdge);
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -479,32 +564,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inEdge: ");
-                    appendVariableToMessage(message, args.inEdge);
-                    message.append("\n");
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inEdge: ");
+                        appendVariableToMessage(message, args.inEdge);
+                        message.append("\n");
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkStepFloat4FloatFloat4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkStepFloat4FloatFloat4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkStepFloatFloat2Float2() {
-        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x70a0554e664b1852l, false);
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xdd7f0d444e2f7c5l, false);
+        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x664b1852l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x44e2f7c5l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.set_gAllocInV(inV);
@@ -525,11 +618,16 @@
 
     private void verifyResultsStepFloatFloat2Float2(Allocation inEdge, Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInEdge = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInEdge, (float) 42);
         inEdge.copyTo(arrayInEdge);
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -545,32 +643,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inEdge: ");
-                    appendVariableToMessage(message, args.inEdge);
-                    message.append("\n");
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inEdge: ");
+                        appendVariableToMessage(message, args.inEdge);
+                        message.append("\n");
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkStepFloatFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkStepFloatFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkStepFloatFloat3Float3() {
-        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x9b2d75ce91abcbccl, false);
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xdd9b9ef3afe18a3l, false);
+        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x91abcbccl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3afe18a3l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.set_gAllocInV(inV);
@@ -591,11 +697,16 @@
 
     private void verifyResultsStepFloatFloat3Float3(Allocation inEdge, Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInEdge = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInEdge, (float) 42);
         inEdge.copyTo(arrayInEdge);
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -611,32 +722,40 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inEdge: ");
-                    appendVariableToMessage(message, args.inEdge);
-                    message.append("\n");
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inEdge: ");
+                        appendVariableToMessage(message, args.inEdge);
+                        message.append("\n");
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkStepFloatFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkStepFloatFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkStepFloatFloat4Float4() {
-        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xc5ba964ebd0c7f46l, false);
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xddb830a31193981l, false);
+        Allocation inEdge = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xbd0c7f46l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x31193981l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.set_gAllocInV(inV);
@@ -657,11 +776,16 @@
 
     private void verifyResultsStepFloatFloat4Float4(Allocation inEdge, Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInEdge = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInEdge, (float) 42);
         inEdge.copyTo(arrayInEdge);
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -677,27 +801,35 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inEdge: ");
-                    appendVariableToMessage(message, args.inEdge);
-                    message.append("\n");
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inEdge: ");
+                        appendVariableToMessage(message, args.inEdge);
+                        message.append("\n");
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkStepFloatFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkStepFloatFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testStep() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTan.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTan.java
index b69ee28..908ca59 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTan.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTan.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestTan extends RSBaseCompute {
 
     private ScriptC_TestTan script;
@@ -40,7 +42,7 @@
     }
 
     private void checkTanFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4222fe257bb50fa4l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x7bb50fa4l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testTanFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsTanFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTanFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTanFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkTanFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xae98520143383868l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x43383868l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testTanFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsTanFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTanFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTanFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkTanFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xae9a1b1c39535946l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x39535946l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testTanFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsTanFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTanFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTanFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkTanFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xae9be4372f6e7a24l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x2f6e7a24l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testTanFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsTanFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTanFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTanFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testTan() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTanh.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTanh.java
index c4ee08a..842c402 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTanh.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTanh.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestTanh extends RSBaseCompute {
 
     private ScriptC_TestTanh script;
@@ -40,7 +42,7 @@
     }
 
     private void checkTanhFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xaa47c1d7594bc87al, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x594bc87al, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testTanhFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsTanhFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTanhFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTanhFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkTanhFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xe021c1aab8d53a0el, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb8d53a0el, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testTanhFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsTanhFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTanhFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTanhFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkTanhFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xe0238ac5aef05aecl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xaef05aecl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testTanhFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsTanhFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTanhFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTanhFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkTanhFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xe02553e0a50b7bcal, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xa50b7bcal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testTanhFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsTanhFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTanhFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTanhFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testTanh() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTanpi.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTanpi.java
index dd6a383..13be7d9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTanpi.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTanpi.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestTanpi extends RSBaseCompute {
 
     private ScriptC_TestTanpi script;
@@ -40,7 +42,7 @@
     }
 
     private void checkTanpiFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xf8a6aebf04820e8fl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4820e8fl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testTanpiFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsTanpiFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTanpiFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTanpiFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkTanpiFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xebbed6ee53d567bbl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x53d567bbl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testTanpiFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsTanpiFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTanpiFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTanpiFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkTanpiFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xebc0a00949f08899l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x49f08899l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testTanpiFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsTanpiFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTanpiFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTanpiFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkTanpiFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xebc26924400ba977l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x400ba977l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testTanpiFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsTanpiFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTanpiFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTanpiFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testTanpi() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTgamma.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTgamma.java
index ea25ef1..cd11dc9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTgamma.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTgamma.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestTgamma extends RSBaseCompute {
 
     private ScriptC_TestTgamma script;
@@ -40,7 +42,7 @@
     }
 
     private void checkTgammaFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x5c02c6a0eda55486l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xeda55486l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testTgammaFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsTgammaFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTgammaFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTgammaFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkTgammaFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8fe7559b3399bcbal, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3399bcbal, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testTgammaFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsTgammaFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTgammaFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTgammaFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkTgammaFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8fe91eb629b4dd98l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x29b4dd98l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testTgammaFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsTgammaFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTgammaFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTgammaFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkTgammaFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8feae7d11fcffe76l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x1fcffe76l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testTgammaFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsTgammaFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTgammaFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTgammaFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testTgamma() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTrunc.java b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTrunc.java
index ac44fb1..e29de2c 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTrunc.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/generated/TestTrunc.java
@@ -22,6 +22,8 @@
 import android.renderscript.RSRuntimeException;
 import android.renderscript.Element;
 
+import java.util.Arrays;
+
 public class TestTrunc extends RSBaseCompute {
 
     private ScriptC_TestTrunc script;
@@ -40,7 +42,7 @@
     }
 
     private void checkTruncFloatFloat() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb16f216b11eebe01l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x11eebe01l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
             script.forEach_testTruncFloatFloat(inV, out);
@@ -59,9 +61,13 @@
 
     private void verifyResultsTruncFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 1];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 1 ; j++) {
                 // Extract the inputs.
@@ -76,28 +82,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 1 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 1 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 1 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 1 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTruncFloatFloat" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTruncFloatFloat" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkTruncFloat2Float2() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8b83139b49d4961dl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x49d4961dl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
             script.forEach_testTruncFloat2Float2(inV, out);
@@ -116,9 +130,13 @@
 
     private void verifyResultsTruncFloat2Float2(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 2];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 2 ; j++) {
                 // Extract the inputs.
@@ -133,28 +151,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 2 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 2 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 2 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 2 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTruncFloat2Float2" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTruncFloat2Float2" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkTruncFloat3Float3() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8b84dcb63fefb6fbl, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x3fefb6fbl, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
             script.forEach_testTruncFloat3Float3(inV, out);
@@ -173,9 +199,13 @@
 
     private void verifyResultsTruncFloat3Float3(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 3 ; j++) {
                 // Extract the inputs.
@@ -190,28 +220,36 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTruncFloat3Float3" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTruncFloat3Float3" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     private void checkTruncFloat4Float4() {
-        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8b86a5d1360ad7d9l, false);
+        Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x360ad7d9l, false);
         try {
             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
             script.forEach_testTruncFloat4Float4(inV, out);
@@ -230,9 +268,13 @@
 
     private void verifyResultsTruncFloat4Float4(Allocation inV, Allocation out, boolean relaxed) {
         float[] arrayInV = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayInV, (float) 42);
         inV.copyTo(arrayInV);
         float[] arrayOut = new float[INPUTSIZE * 4];
+        Arrays.fill(arrayOut, (float) 42);
         out.copyTo(arrayOut);
+        StringBuilder message = new StringBuilder();
+        boolean errorFound = false;
         for (int i = 0; i < INPUTSIZE; i++) {
             for (int j = 0; j < 4 ; j++) {
                 // Extract the inputs.
@@ -247,24 +289,32 @@
                     valid = false;
                 }
                 if (!valid) {
-                    StringBuilder message = new StringBuilder();
-                    message.append("Input inV: ");
-                    appendVariableToMessage(message, args.inV);
-                    message.append("\n");
-                    message.append("Expected output out: ");
-                    appendVariableToMessage(message, args.out);
-                    message.append("\n");
-                    message.append("Actual   output out: ");
-                    appendVariableToMessage(message, arrayOut[i * 4 + j]);
-                    if (!args.out.couldBe(arrayOut[i * 4 + j])) {
-                        message.append(" FAIL");
+                    if (!errorFound) {
+                        errorFound = true;
+                        message.append("Input inV: ");
+                        appendVariableToMessage(message, args.inV);
+                        message.append("\n");
+                        message.append("Expected output out: ");
+                        appendVariableToMessage(message, args.out);
+                        message.append("\n");
+                        message.append("Actual   output out: ");
+                        appendVariableToMessage(message, arrayOut[i * 4 + j]);
+                        if (!args.out.couldBe(arrayOut[i * 4 + j])) {
+                            message.append(" FAIL");
+                        }
+                        message.append("\n");
+                        message.append("Errors at");
                     }
-                    message.append("\n");
-                    assertTrue("Incorrect output for checkTruncFloat4Float4" +
-                            (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), valid);
+                    message.append(" [");
+                    message.append(Integer.toString(i));
+                    message.append(", ");
+                    message.append(Integer.toString(j));
+                    message.append("]");
                 }
             }
         }
+        assertFalse("Incorrect output for checkTruncFloat4Float4" +
+                (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
     }
 
     public void testTrunc() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/increment.rs b/tests/tests/renderscript/src/android/renderscript/cts/increment.rs
new file mode 100644
index 0000000..babc567
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/increment.rs
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+int4 __attribute__((kernel)) increment(int4 in)
+{
+  return in + 1;
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/intrinsic_blur.rs b/tests/tests/renderscript/src/android/renderscript/cts/intrinsic_blur.rs
index 88f9ca5..aea9745 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/intrinsic_blur.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/intrinsic_blur.rs
@@ -74,7 +74,7 @@
     float4 blurredPixel = 0;
     int gi = 0;
     for (int r = -radius; r <= radius; r ++) {
-        int validH = rsClamp((int)y + r, (int)0, (int)(height - 1));
+        int validH = clamp((int)y + r, (int)0, (int)(height - 1));
         float4 i = rsGetElementAt_float4(ScratchPixel2, x, validH);
         blurredPixel += i * gaussian[gi++];
     }
@@ -86,11 +86,9 @@
     int gi = 0;
     for (int r = -radius; r <= radius; r ++) {
         // Stepping left and right away from the pixel
-        int validX = rsClamp((int)x + r, (int)0, (int)(width - 1));
+        int validX = clamp((int)x + r, (int)0, (int)(width - 1));
         float4 i = rsGetElementAt_float4(ScratchPixel1, validX, y);
         blurredPixel += i * gaussian[gi++];
     }
     return blurredPixel;
 }
-
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/kernel_input.rs b/tests/tests/renderscript/src/android/renderscript/cts/kernel_input.rs
new file mode 100644
index 0000000..2eaca92
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/kernel_input.rs
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+
+#pragma version(1)
+#pragma rs java_package_name(foo)
+
+#include "shared.rsh"
+
+static bool failed = false;
+
+/*
+ * This checks that modifications to input arguments done by a kernel
+ * are never reflected back to the input Allocation. In order to do
+ * this, we create kernels that modify their input arguments (the
+ * clear_input_* kernels).
+ *
+ * When the kernels modify their input arguments, these modifications
+ * should not be visible in the underlying Allocation. The
+ * verify_input_* functions can be passed the same Allocation that was
+ * used as an in input to a clear_input_* kernel. The verify_input_*
+ * functions check their input against a global variable.
+ */
+
+// For clear_input_* kernels, we use a volatile qualified input argument
+// to try to inhibit any optimizations that would result in the write to
+// the input argument being optimized out by the compiler.
+
+#define COMMON_TEST_CODE(type)                           \
+  type initial_value_##type;                             \
+  type RS_KERNEL clear_input_##type(volatile type in) {  \
+    rsDebug(#type, in);                                  \
+    in -= in;                                            \
+    rsDebug(#type, in);                                  \
+    return in;                                           \
+  }
+
+#define SCALAR_TEST(type)                         \
+  COMMON_TEST_CODE(type)                          \
+  void verify_input_##type(rs_allocation alloc) { \
+    type elem = rsGetElementAt_##type(alloc, 0);  \
+    _RS_ASSERT(elem == initial_value_##type);     \
+  }
+
+#define VEC2_TEST(type)                             \
+  COMMON_TEST_CODE(type)                            \
+  void verify_input_##type(rs_allocation alloc) {   \
+    type elem = rsGetElementAt_##type(alloc, 0);    \
+    _RS_ASSERT(elem[0] == initial_value_##type[0]); \
+    _RS_ASSERT(elem[1] == initial_value_##type[1]); \
+  }
+
+#define VEC3_TEST(type)                             \
+  COMMON_TEST_CODE(type)                            \
+  void verify_input_##type(rs_allocation alloc) {   \
+    type elem = rsGetElementAt_##type(alloc, 0);    \
+    _RS_ASSERT(elem[0] == initial_value_##type[0]); \
+    _RS_ASSERT(elem[1] == initial_value_##type[1]); \
+    _RS_ASSERT(elem[2] == initial_value_##type[2]); \
+  }
+
+#define VEC4_TEST(type)                             \
+  COMMON_TEST_CODE(type)                            \
+  void verify_input_##type(rs_allocation alloc) {   \
+    type elem = rsGetElementAt_##type(alloc, 0);    \
+    _RS_ASSERT(elem[0] == initial_value_##type[0]); \
+    _RS_ASSERT(elem[1] == initial_value_##type[1]); \
+    _RS_ASSERT(elem[2] == initial_value_##type[2]); \
+    _RS_ASSERT(elem[3] == initial_value_##type[3]); \
+  }
+
+SCALAR_TEST(char)
+
+VEC2_TEST(char2)
+
+VEC3_TEST(char3)
+
+VEC4_TEST(char4)
+
+SCALAR_TEST(double)
+
+VEC2_TEST(double2)
+
+VEC3_TEST(double3)
+
+VEC4_TEST(double4)
+
+SCALAR_TEST(float)
+
+VEC2_TEST(float2)
+
+VEC3_TEST(float3)
+
+VEC4_TEST(float4)
+
+SCALAR_TEST(int)
+
+VEC2_TEST(int2)
+
+VEC3_TEST(int3)
+
+VEC4_TEST(int4)
+
+SCALAR_TEST(long)
+
+VEC2_TEST(long2)
+
+VEC3_TEST(long3)
+
+VEC4_TEST(long4)
+
+SCALAR_TEST(short)
+
+VEC2_TEST(short2)
+
+VEC3_TEST(short3)
+
+VEC4_TEST(short4)
+
+SCALAR_TEST(uchar)
+
+VEC2_TEST(uchar2)
+
+VEC3_TEST(uchar3)
+
+VEC4_TEST(uchar4)
+
+SCALAR_TEST(uint)
+
+VEC2_TEST(uint2)
+
+VEC3_TEST(uint3)
+
+VEC4_TEST(uint4)
+
+SCALAR_TEST(ulong)
+
+VEC2_TEST(ulong2)
+
+VEC3_TEST(ulong3)
+
+VEC4_TEST(ulong4)
+
+SCALAR_TEST(ushort)
+
+VEC2_TEST(ushort2)
+
+VEC3_TEST(ushort3)
+
+VEC4_TEST(ushort4)
+
+typedef struct small {
+  int x[1];
+} small;
+
+typedef struct big {
+  int x[100];
+} big;
+
+small initial_value_small;
+
+// See comment on volatile above.
+small RS_KERNEL clear_input_small(volatile small in) {
+  rsDebug("in.x", in.x[0]);
+  in.x[0] = 0;
+  rsDebug("in.x", in.x[0]);
+  return in;
+}
+
+void verify_input_small(rs_allocation alloc) {
+  const small *elem = (const small *) rsGetElementAt(alloc, 0);
+  _RS_ASSERT(elem->x[0] == initial_value_small.x[0]);
+}
+
+big initial_value_big;
+
+// See comment on volatile above.
+big RS_KERNEL clear_input_big(volatile big in) {
+  for (size_t i = 0; i < 100; ++i) {
+    rsDebug("in.x", in.x[i]);
+    in.x[i] = 0;
+    rsDebug("in.x", in.x[i]);
+  }
+  return in;
+}
+
+void verify_input_big(rs_allocation alloc) {
+  const big *elem = (const big *) rsGetElementAt(alloc, 0);
+  for (size_t i = 0; i < 100; ++i) {
+    _RS_ASSERT(elem->x[i] == initial_value_big.x[i]);
+  }
+}
+
+void checkError() {
+  if (failed) {
+    rsSendToClientBlocking(RS_MSG_TEST_FAILED);
+  } else {
+    rsSendToClientBlocking(RS_MSG_TEST_PASSED);
+  }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/launchclip.rs b/tests/tests/renderscript/src/android/renderscript/cts/launchclip.rs
new file mode 100644
index 0000000..ca34f4a
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/launchclip.rs
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#include "shared.rsh"
+
+rs_allocation passfail;
+
+int dimX;
+int dimY;
+int dimZ;
+bool hasFaces;
+bool hasLod;
+int dimA0;
+int dimA1;
+int dimA2;
+int dimA3;
+
+int biasX = 0;
+int biasY = 0;
+int biasZ = 0;
+
+
+int RS_KERNEL zero() {
+    return 0;
+}
+
+int RS_KERNEL write1d(uint32_t x) {
+    return 0x80000000 | (x + biasX) | (biasY << 8) | (biasZ << 16);
+}
+
+int RS_KERNEL write2d(uint32_t x, uint32_t y) {
+    return 0x80000000 | (x + biasX) | ((y + biasY) << 8) | (biasZ << 16);
+}
+
+int RS_KERNEL write3d(uint32_t x, uint32_t y, uint32_t z) {
+    return 0x80000000 | (x + biasX) | ((y + biasY) << 8) | ((z + biasZ) << 16);
+}
+
+
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/matrix.rs b/tests/tests/renderscript/src/android/renderscript/cts/matrix.rs
new file mode 100644
index 0000000..8ea7c76
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/matrix.rs
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+rs_matrix4x4 Mat;
+
+void setMatrix(rs_matrix4x4 m) {
+  Mat = m;
+}
+
+float4 __attribute__((kernel)) multiply(float4 in)
+{
+  return rsMatrixMultiply(&Mat, in);
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/oob.rs b/tests/tests/renderscript/src/android/renderscript/cts/oob.rs
index 11b7cef..d27a8ca 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/oob.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/oob.rs
@@ -10,6 +10,3 @@
     rsSetElementAt_int(aInt, 1, 1);
 }
 
-void send_msg() {
-    rsSendToClientBlocking(RS_MSG_TEST_PASSED);
-}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/reduction.rs b/tests/tests/renderscript/src/android/renderscript/cts/reduction.rs
new file mode 100644
index 0000000..19de6fe
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/reduction.rs
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+rs_allocation a;
+int reduction_stride;
+
+int4 __attribute__((kernel)) add(uint x)
+{
+  return rsGetElementAt_int4(a, x) + rsGetElementAt_int4(a, x + reduction_stride);
+}
+
+int4 __attribute__((kernel)) add2(uint x)
+{
+  rsSetElementAt_int4(a,
+                      rsGetElementAt_int4(a, x) +
+                      rsGetElementAt_int4(a, x + reduction_stride),
+                      x);
+  return 0;
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/rsAllocationCopyTest.java b/tests/tests/renderscript/src/android/renderscript/cts/rsAllocationCopyTest.java
new file mode 100644
index 0000000..f74fa38
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/rsAllocationCopyTest.java
@@ -0,0 +1,539 @@
+/*
+ * Copyright (C) 2015 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.renderscript.cts;
+
+import android.renderscript.Allocation;
+import android.renderscript.Element;
+import android.renderscript.Type;
+import java.util.Random;
+import android.util.Log;
+
+public class rsAllocationCopyTest extends RSBaseCompute {
+
+    public void test_rsAllocationCopy1D_Byte() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+        int offset = random.nextInt(arr_len);
+        int count = random.nextInt(arr_len - offset);
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8(mRS));
+        typeBuilder.setX(width);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn1D(aIn);
+        s.set_aOut1D(aOut);
+        s.set_xOff(offset);
+        s.set_xCount(count);
+        s.invoke_test1D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (offset <= i && i < offset + count) {
+                if (inArray[i] != outArray[i]) {
+                    result = false;
+                    break;
+                }
+            } else {
+                if (outArray[i] != 0) {
+                    result = false;
+                    break;
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy1D_Byte failed, output array does not match input",
+                   result);
+    }
+
+    public void test_rsAllocationCopy1D_Short() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+        int offset = random.nextInt(arr_len);
+        int count = random.nextInt(arr_len - offset);
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16(mRS));
+        typeBuilder.setX(width);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn1D(aIn);
+        s.set_aOut1D(aOut);
+        s.set_xOff(offset);
+        s.set_xCount(count);
+        s.invoke_test1D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (offset <= i && i < offset + count) {
+                if (inArray[i] != outArray[i]) {
+                    result = false;
+                    break;
+                }
+            } else {
+                if (outArray[i] != 0) {
+                    result = false;
+                    break;
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy1D_Short failed, output array does not match input",
+                   result);
+    }
+
+    public void test_rsAllocationCopy1D_Int() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+        int offset = random.nextInt(arr_len);
+        int count = random.nextInt(arr_len - offset);
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32(mRS));
+        typeBuilder.setX(width);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn1D(aIn);
+        s.set_aOut1D(aOut);
+        s.set_xOff(offset);
+        s.set_xCount(count);
+        s.invoke_test1D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (offset <= i && i < offset + count) {
+                if (inArray[i] != outArray[i]) {
+                    result = false;
+                    break;
+                }
+            } else {
+                if (outArray[i] != 0) {
+                    result = false;
+                    break;
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy1D_Int failed, output array does not match input",
+                   result);
+    }
+
+    public void test_rsAllocationCopy1D_Float() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+        int offset = random.nextInt(arr_len);
+        int count = random.nextInt(arr_len - offset);
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32(mRS));
+        typeBuilder.setX(width);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn1D(aIn);
+        s.set_aOut1D(aOut);
+        s.set_xOff(offset);
+        s.set_xCount(count);
+        s.invoke_test1D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (offset <= i && i < offset + count) {
+                if (inArray[i] != outArray[i]) {
+                    result = false;
+                    break;
+                }
+            } else {
+                if (outArray[i] != 0) {
+                    result = false;
+                    break;
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy1D_Float failed, output array does not match input",
+                   result);
+    }
+
+    public void test_rsAllocationCopy1D_Long() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(512);
+        int arr_len = width;
+        int offset = random.nextInt(arr_len);
+        int count = random.nextInt(arr_len - offset);
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64(mRS));
+        typeBuilder.setX(width);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn1D(aIn);
+        s.set_aOut1D(aOut);
+        s.set_xOff(offset);
+        s.set_xCount(count);
+        s.invoke_test1D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < arr_len; i++) {
+            if (offset <= i && i < offset + count) {
+                if (inArray[i] != outArray[i]) {
+                    result = false;
+                    break;
+                }
+            } else {
+                if (outArray[i] != 0) {
+                    result = false;
+                    break;
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy1D_Long failed, output array does not match input",
+                   result);
+    }
+
+
+    public void test_rsAllocationCopy2D_Byte() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xOff = random.nextInt(width);
+        int yOff = random.nextInt(height);
+        int xCount = random.nextInt(width - xOff);
+        int yCount = random.nextInt(height - yOff);
+        int arr_len = width * height;
+
+        byte[] inArray = new byte[arr_len];
+        byte[] outArray = new byte[arr_len];
+        random.nextBytes(inArray);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I8(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn2D(aIn);
+        s.set_aOut2D(aOut);
+        s.set_xOff(xOff);
+        s.set_yOff(yOff);
+        s.set_xCount(xCount);
+        s.set_yCount(yCount);
+        s.invoke_test2D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < height; i++) {
+            for (int j = 0; j < width; j++) {
+                int pos = i * width + j;
+                if (yOff <= i && i < yOff + yCount &&
+                    xOff <= j && j < xOff + xCount) {
+                    if (inArray[pos] != outArray[pos]) {
+                        result = false;
+                        break;
+                    }
+                } else {
+                    if (outArray[pos] != 0) {
+                        result = false;
+                        break;
+                    }
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy2D_Byte failed, output array does not match input",
+                   result);
+    }
+
+    public void test_rsAllocationCopy2D_Short() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xOff = random.nextInt(width);
+        int yOff = random.nextInt(height);
+        int xCount = random.nextInt(width - xOff);
+        int yCount = random.nextInt(height - yOff);
+        int arr_len = width * height;
+
+        short[] inArray = new short[arr_len];
+        short[] outArray = new short[arr_len];
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = (short)random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I16(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn2D(aIn);
+        s.set_aOut2D(aOut);
+        s.set_xOff(xOff);
+        s.set_yOff(yOff);
+        s.set_xCount(xCount);
+        s.set_yCount(yCount);
+        s.invoke_test2D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < height; i++) {
+            for (int j = 0; j < width; j++) {
+                int pos = i * width + j;
+                if (yOff <= i && i < yOff + yCount &&
+                    xOff <= j && j < xOff + xCount) {
+                    if (inArray[pos] != outArray[pos]) {
+                        result = false;
+                        break;
+                    }
+                } else {
+                    if (outArray[pos] != 0) {
+                        result = false;
+                        break;
+                    }
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy2D_Short failed, output array does not match input",
+                   result);
+    }
+
+    public void test_rsAllocationCopy2D_Int() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xOff = random.nextInt(width);
+        int yOff = random.nextInt(height);
+        int xCount = random.nextInt(width - xOff);
+        int yCount = random.nextInt(height - yOff);
+        int arr_len = width * height;
+
+        int[] inArray = new int[arr_len];
+        int[] outArray = new int[arr_len];
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextInt();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn2D(aIn);
+        s.set_aOut2D(aOut);
+        s.set_xOff(xOff);
+        s.set_yOff(yOff);
+        s.set_xCount(xCount);
+        s.set_yCount(yCount);
+        s.invoke_test2D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < height; i++) {
+            for (int j = 0; j < width; j++) {
+                int pos = i * width + j;
+                if (yOff <= i && i < yOff + yCount &&
+                    xOff <= j && j < xOff + xCount) {
+                    if (inArray[pos] != outArray[pos]) {
+                        result = false;
+                        break;
+                    }
+                } else {
+                    if (outArray[pos] != 0) {
+                        result = false;
+                        break;
+                    }
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy2D_Int failed, output array does not match input",
+                   result);
+    }
+
+    public void test_rsAllocationCopy2D_Float() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xOff = random.nextInt(width);
+        int yOff = random.nextInt(height);
+        int xCount = random.nextInt(width - xOff);
+        int yCount = random.nextInt(height - yOff);
+        int arr_len = width * height;
+
+        float[] inArray = new float[arr_len];
+        float[] outArray = new float[arr_len];
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextFloat();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.F32(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn2D(aIn);
+        s.set_aOut2D(aOut);
+        s.set_xOff(xOff);
+        s.set_yOff(yOff);
+        s.set_xCount(xCount);
+        s.set_yCount(yCount);
+        s.invoke_test2D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < height; i++) {
+            for (int j = 0; j < width; j++) {
+                int pos = i * width + j;
+                if (yOff <= i && i < yOff + yCount &&
+                    xOff <= j && j < xOff + xCount) {
+                    if (inArray[pos] != outArray[pos]) {
+                        result = false;
+                        break;
+                    }
+                } else {
+                    if (outArray[pos] != 0) {
+                        result = false;
+                        break;
+                    }
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy2D_Float failed, output array does not match input",
+                   result);
+    }
+
+    public void test_rsAllocationCopy2D_Long() {
+        Random random = new Random(0x172d8ab9);
+        int width = random.nextInt(128);
+        int height = random.nextInt(128);
+        int xOff = random.nextInt(width);
+        int yOff = random.nextInt(height);
+        int xCount = random.nextInt(width - xOff);
+        int yCount = random.nextInt(height - yOff);
+        int arr_len = width * height;
+
+        long[] inArray = new long[arr_len];
+        long[] outArray = new long[arr_len];
+        for (int i = 0; i < arr_len; i++) {
+            inArray[i] = random.nextLong();
+        }
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I64(mRS));
+        typeBuilder.setX(width).setY(height);
+        Allocation aIn = Allocation.createTyped(mRS, typeBuilder.create());
+        Allocation aOut = Allocation.createTyped(mRS, typeBuilder.create());
+        aIn.copyFrom(inArray);
+        aOut.copyFrom(outArray);
+
+        ScriptC_rsallocationcopy s = new ScriptC_rsallocationcopy(mRS);
+        s.set_aIn2D(aIn);
+        s.set_aOut2D(aOut);
+        s.set_xOff(xOff);
+        s.set_yOff(yOff);
+        s.set_xCount(xCount);
+        s.set_yCount(yCount);
+        s.invoke_test2D();
+        mRS.finish();
+        aOut.copyTo(outArray);
+
+        boolean result = true;
+        for (int i = 0; i < height; i++) {
+            for (int j = 0; j < width; j++) {
+                int pos = i * width + j;
+                if (yOff <= i && i < yOff + yCount &&
+                    xOff <= j && j < xOff + xCount) {
+                    if (inArray[pos] != outArray[pos]) {
+                        result = false;
+                        break;
+                    }
+                } else {
+                    if (outArray[pos] != 0) {
+                        result = false;
+                        break;
+                    }
+                }
+            }
+        }
+        assertTrue("test_rsAllocationCopy2D_Long failed, output array does not match input",
+                   result);
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/rsallocationcopy.rs b/tests/tests/renderscript/src/android/renderscript/cts/rsallocationcopy.rs
new file mode 100644
index 0000000..4d76493
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/rsallocationcopy.rs
@@ -0,0 +1,19 @@
+#include "shared.rsh"
+
+rs_allocation aIn1D;
+rs_allocation aOut1D;
+rs_allocation aIn2D;
+rs_allocation aOut2D;
+
+int xOff = 0;
+int yOff = 0;
+int xCount = 0;
+int yCount = 0;
+
+void test1D() {
+    rsAllocationCopy1DRange(aOut1D, xOff, 0, xCount, aIn1D, xOff, 0);
+}
+
+void test2D() {
+    rsAllocationCopy2DRange(aOut2D, xOff, yOff, 0, 0, xCount, yCount, aIn2D, xOff, yOff, 0, 0);
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/shared.rsh b/tests/tests/renderscript/src/android/renderscript/cts/shared.rsh
index b91611d..2ad81fc 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/shared.rsh
+++ b/tests/tests/renderscript/src/android/renderscript/cts/shared.rsh
@@ -3,11 +3,11 @@
 
 static int64_t g_time;
 
-static void start(void) {
+static inline void start(void) {
     g_time = rsUptimeMillis();
 }
 
-static float end(void) {
+static inline float end(void) {
     int64_t t = rsUptimeMillis() - g_time;
     return ((float)t) / 1000.f;
 }
@@ -24,4 +24,3 @@
 /* These constants must match those in UnitTest.java */
 static const int RS_MSG_TEST_PASSED = 100;
 static const int RS_MSG_TEST_FAILED = 101;
-
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/verify.rs b/tests/tests/renderscript/src/android/renderscript/cts/verify.rs
index 3563fee..c3ae802 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/verify.rs
+++ b/tests/tests/renderscript/src/android/renderscript/cts/verify.rs
@@ -17,23 +17,24 @@
 #include "shared.rsh"
 
 int gAllowedIntError = 0;
+float gAllowedFloatError = 0.0001f;
+double gAllowedFloatMatError = 0.00000001;
+double gAllowedDoubleMatError = 0.00000000001;
 static bool hadError = false;
 static int2 errorLoc = {0,0};
 
-
 static bool compare_float(float f1, float f2) {
-    if (fabs(f1-f2) > 0.0001f) {
+    if (fabs(f1-f2) > gAllowedFloatError) {
         hadError = true;
         return false;
     }
     return true;
 }
 
-static bool verify_float4(rs_allocation in1, rs_allocation in2)
-{
+static bool verify_float4(rs_allocation in1, rs_allocation in2) {
     uint32_t w = rsAllocationGetDimX(in1);
     uint32_t h = rsAllocationGetDimY(in1);
-    for (uint32_t y=0; y < h; y++) {
+    for (uint32_t y = 0; y < h; y++) {
         for (uint32_t x=0; x < w; x++) {
             float4 pref = rsGetElementAt_float4(in1, x, y);
             float4 ptst = rsGetElementAt_float4(in2, x, y);
@@ -51,11 +52,10 @@
     return true;
 }
 
-static bool verify_float3(rs_allocation in1, rs_allocation in2)
-{
+static bool verify_float3(rs_allocation in1, rs_allocation in2) {
     uint32_t w = rsAllocationGetDimX(in1);
     uint32_t h = rsAllocationGetDimY(in1);
-    for (uint32_t y=0; y < h; y++) {
+    for (uint32_t y = 0; y < h; y++) {
         for (uint32_t x=0; x < w; x++) {
             float3 pref = rsGetElementAt_float3(in1, x, y);
             float3 ptst = rsGetElementAt_float3(in2, x, y);
@@ -72,11 +72,10 @@
     return true;
 }
 
-static bool verify_float2(rs_allocation in1, rs_allocation in2)
-{
+static bool verify_float2(rs_allocation in1, rs_allocation in2) {
     uint32_t w = rsAllocationGetDimX(in1);
     uint32_t h = rsAllocationGetDimY(in1);
-    for (uint32_t y=0; y < h; y++) {
+    for (uint32_t y = 0; y < h; y++) {
         for (uint32_t x=0; x < w; x++) {
             float2 pref = rsGetElementAt_float2(in1, x, y);
             float2 ptst = rsGetElementAt_float2(in2, x, y);
@@ -92,11 +91,10 @@
     return true;
 }
 
-static bool verify_float(rs_allocation in1, rs_allocation in2)
-{
+static bool verify_float(rs_allocation in1, rs_allocation in2) {
     uint32_t w = rsAllocationGetDimX(in1);
     uint32_t h = rsAllocationGetDimY(in1);
-    for (uint32_t y=0; y < h; y++) {
+    for (uint32_t y = 0; y < h; y++) {
         for (uint32_t x=0; x < w; x++) {
             float pref = rsGetElementAt_float(in1, x, y);
             float ptst = rsGetElementAt_float(in2, x, y);
@@ -111,12 +109,11 @@
     return true;
 }
 
-static bool verify_uchar4(rs_allocation in1, rs_allocation in2)
-{
+static bool verify_uchar4(rs_allocation in1, rs_allocation in2) {
     int merr = 0;
     uint32_t w = rsAllocationGetDimX(in1);
     uint32_t h = rsAllocationGetDimY(in1);
-    for (uint32_t y=0; y < h; y++) {
+    for (uint32_t y = 0; y < h; y++) {
         for (uint32_t x=0; x < w; x++) {
             int4 pref = convert_int4(rsGetElementAt_uchar4(in1, x, y));
             int4 ptst = convert_int4(rsGetElementAt_uchar4(in2, x, y));
@@ -138,12 +135,11 @@
     return true;
 }
 
-static bool verify_uchar3(rs_allocation in1, rs_allocation in2)
-{
+static bool verify_uchar3(rs_allocation in1, rs_allocation in2) {
     int merr = 0;
     uint32_t w = rsAllocationGetDimX(in1);
     uint32_t h = rsAllocationGetDimY(in1);
-    for (uint32_t y=0; y < h; y++) {
+    for (uint32_t y = 0; y < h; y++) {
         for (uint32_t x=0; x < w; x++) {
             int3 pref = convert_int3(rsGetElementAt_uchar3(in1, x, y));
             int3 ptst = convert_int3(rsGetElementAt_uchar3(in2, x, y));
@@ -164,12 +160,11 @@
     return true;
 }
 
-static bool verify_uchar2(rs_allocation in1, rs_allocation in2)
-{
+static bool verify_uchar2(rs_allocation in1, rs_allocation in2) {
     int merr = 0;
     uint32_t w = rsAllocationGetDimX(in1);
     uint32_t h = rsAllocationGetDimY(in1);
-    for (uint32_t y=0; y < h; y++) {
+    for (uint32_t y = 0; y < h; y++) {
         for (uint32_t x=0; x < w; x++) {
             int2 pref = convert_int2(rsGetElementAt_uchar2(in1, x, y));
             int2 ptst = convert_int2(rsGetElementAt_uchar2(in2, x, y));
@@ -189,12 +184,11 @@
     return true;
 }
 
-static bool verify_uchar(rs_allocation in1, rs_allocation in2)
-{
+static bool verify_uchar(rs_allocation in1, rs_allocation in2) {
     int merr = 0;
     uint32_t w = rsAllocationGetDimX(in1);
     uint32_t h = rsAllocationGetDimY(in1);
-    for (uint32_t y=0; y < h; y++) {
+    for (uint32_t y = 0; y < h; y++) {
         for (uint32_t x=0; x < w; x++) {
             int pref = rsGetElementAt_uchar(in1, x, y);
             int ptst = rsGetElementAt_uchar(in2, x, y);
@@ -232,7 +226,7 @@
             rsDebug(txt, rsGetElementAt_uchar(a, xy.x, xy.y)); \
             break; \
         } \
-    } else { \
+    } else if (dt == RS_TYPE_FLOAT_32) { \
         switch(vs) { \
         case 4: \
             rsDebug(txt, rsGetElementAt_float4(a, xy.x, xy.y)); \
@@ -247,11 +241,24 @@
             rsDebug(txt, rsGetElementAt_float(a, xy.x, xy.y)); \
             break; \
         } \
+    } else if (dt == RS_TYPE_FLOAT_64) { \
+        switch(vs) { \
+        case 4: \
+            rsDebug(txt, rsGetElementAt_double4(a, xy.x, xy.y)); \
+            break; \
+        case 3: \
+            rsDebug(txt, rsGetElementAt_double3(a, xy.x, xy.y)); \
+            break; \
+        case 2: \
+            rsDebug(txt, rsGetElementAt_double2(a, xy.x, xy.y)); \
+            break; \
+        case 1: \
+            rsDebug(txt, rsGetElementAt_double(a, xy.x, xy.y)); \
+        } \
     } \
 }
 
-void verify(rs_allocation ref_in, rs_allocation tst_in, rs_allocation src_in)
-{
+void verify(rs_allocation ref_in, rs_allocation tst_in, rs_allocation src_in) {
     rs_element e = rsAllocationGetElement(ref_in);
     rs_data_type dt = rsElementGetDataType(e);
     uint32_t vs = rsElementGetVectorSize(e);
@@ -296,6 +303,135 @@
     }
 }
 
+
+static bool verify_CMatrix(rs_allocation in1, rs_allocation in2, double l2Norm, bool isUpperMatrix) {
+    uint32_t w = rsAllocationGetDimX(in1);
+    uint32_t h = rsAllocationGetDimY(in1);
+    for (uint32_t y = 0; y < h; y++) {
+        uint32_t xStart = 0;
+        if (isUpperMatrix) {
+            // Just test the upper matrix for certain BLAS routines
+            xStart = y;
+        }
+        for (uint32_t x = xStart; x < w; x++) {
+            float2 pref = rsGetElementAt_float2(in1, x, y);
+            float2 ptst = rsGetElementAt_float2(in2, x, y);
+            double absErr = (pref.x - ptst.x) * (pref.x - ptst.x) + (pref.y - ptst.y) * (pref.y - ptst.y);
+            if (absErr > l2Norm * gAllowedFloatMatError) {
+                errorLoc.x = x;
+                errorLoc.y = y;
+                hadError = true;
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+static bool verify_SMatrix(rs_allocation in1, rs_allocation in2, double l2Norm, bool isUpperMatrix) {
+    uint32_t w = rsAllocationGetDimX(in1);
+    uint32_t h = rsAllocationGetDimY(in1);
+    for (uint32_t y = 0; y < h; y++) {
+        uint32_t xStart = 0;
+        if (isUpperMatrix) {
+            // Just test the upper matrix for certain BLAS routines
+            xStart = y;
+        }
+        for (uint32_t x = xStart; x < w; x++) {
+            float pref = rsGetElementAt_float(in1, x, y);
+            float ptst = rsGetElementAt_float(in2, x, y);
+            double absErr = (pref - ptst) * (pref - ptst);
+            if (absErr > l2Norm * gAllowedFloatMatError) {
+                errorLoc.x = x;
+                errorLoc.y = y;
+                hadError = true;
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+static bool verify_ZMatrix(rs_allocation in1, rs_allocation in2, double l2Norm, bool isUpperMatrix) {
+    uint32_t w = rsAllocationGetDimX(in1);
+    uint32_t h = rsAllocationGetDimY(in1);
+    for (uint32_t y = 0; y < h; y++) {
+        uint32_t xStart = 0;
+        if (isUpperMatrix) {
+            // Just test the upper matrix for certain BLAS routines
+            xStart = y;
+        }
+        for (uint32_t x = xStart; x < w; x++) {
+            double2 pref = rsGetElementAt_double2(in1, x, y);
+            double2 ptst = rsGetElementAt_double2(in2, x, y);
+            double absErr = (pref.x - ptst.x) * (pref.x - ptst.x) + (pref.y - ptst.y) * (pref.y - ptst.y);
+            if (absErr > l2Norm * gAllowedDoubleMatError) {
+                errorLoc.x = x;
+                errorLoc.y = y;
+                hadError = true;
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+static bool verify_DMatrix(rs_allocation in1, rs_allocation in2, double l2Norm, bool isUpperMatrix) {
+    uint32_t w = rsAllocationGetDimX(in1);
+    uint32_t h = rsAllocationGetDimY(in1);
+    for (uint32_t y = 0; y < h; y++) {
+        uint32_t xStart = 0;
+        if (isUpperMatrix) {
+            // Just test the upper matrix for certain BLAS routines
+            xStart = y;
+        }
+        for (uint32_t x = xStart; x < w; x++) {
+            double pref = rsGetElementAt_double(in1, x, y);
+            double ptst = rsGetElementAt_double(in2, x, y);
+            double absErr = (pref - ptst) * (pref - ptst);
+            if (absErr > l2Norm * gAllowedDoubleMatError) {
+                errorLoc.x = x;
+                errorLoc.y = y;
+                hadError = true;
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+void verifyMatrix(rs_allocation ref_in, rs_allocation tst_in, double l2Norm, bool isUpperMatrix) {
+    rs_element e = rsAllocationGetElement(ref_in);
+    rs_data_type dt = rsElementGetDataType(e);
+    uint32_t vs = rsElementGetVectorSize(e);
+    bool valid = false;
+
+    if (dt == RS_TYPE_FLOAT_32) {
+        switch(vs) {
+        case 2:
+            valid = verify_CMatrix(ref_in, tst_in, l2Norm, isUpperMatrix);
+            break;
+        case 1:
+            valid = verify_SMatrix(ref_in, tst_in, l2Norm, isUpperMatrix);
+            break;
+        }
+    } else if (dt == RS_TYPE_FLOAT_64) {
+        switch(vs) {
+        case 2:
+            valid = verify_ZMatrix(ref_in, tst_in, l2Norm, isUpperMatrix);
+            break;
+        case 1:
+            valid = verify_DMatrix(ref_in, tst_in, l2Norm, isUpperMatrix);
+            break;
+        }
+    }
+    if (!valid) {
+        rsDebug("verify failure at xy", errorLoc);
+        printCell("Expected value ", ref_in, errorLoc);
+        printCell("Actual value   ", tst_in, errorLoc);
+    }
+}
+
 void checkError()
 {
     if (hadError) {
diff --git a/tests/tests/rscpp/librscpptest/Android.mk b/tests/tests/rscpp/librscpptest/Android.mk
index bc2f81e..df8ce29f 100644
--- a/tests/tests/rscpp/librscpptest/Android.mk
+++ b/tests/tests/rscpp/librscpptest/Android.mk
@@ -21,8 +21,25 @@
 LOCAL_CLANG := true
 LOCAL_MODULE := librscpptest_jni
 LOCAL_MODULE_TAGS := optional
-LOCAL_SRC_FILES := rs_jni.cpp rs_jni_allocation.cpp
-LOCAL_SRC_FILES += setelementat.rs
+
+LOCAL_SRC_FILES := \
+    rs_jni.cpp \
+    rs_jni_allocation.cpp \
+    rs_jni_element.cpp \
+    rs_jni_foreach.cpp \
+    rs_jni_script.cpp \
+    rs_jni_type.cpp \
+    rs_jni_object.cpp
+
+LOCAL_SRC_FILES += \
+    setelementat.rs \
+    primitives.rs \
+    instance.rs \
+    clear_object.rs \
+    foreach.rs \
+    fe_all.rs \
+    noroot.rs \
+    vector.rs
 
 LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
 LOCAL_C_INCLUDES += frameworks/rs/cpp
diff --git a/tests/tests/rscpp/librscpptest/clear_object.rs b/tests/tests/rscpp/librscpptest/clear_object.rs
new file mode 100644
index 0000000..70ba42b
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/clear_object.rs
@@ -0,0 +1,42 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.cts.rscpp)
+
+rs_allocation allocation;
+
+void clear_allocation(int *out)
+{
+    rsClearObject( &allocation );
+    *out = ( NULL == allocation.p ? 1 : 0 );
+}
+
+rs_element element;
+
+void clear_element(int *out)
+{
+    rsClearObject( &element );
+    *out = ( NULL == element.p ? 1 : 0 );
+}
+
+rs_sampler sampler;
+
+void clear_sampler(int *out)
+{
+    rsClearObject( &sampler );
+    *out = ( NULL == sampler.p ? 1 : 0 );
+}
+
+rs_script script;
+
+void clear_script(int *out)
+{
+    rsClearObject( &script );
+    *out = ( NULL == script.p ? 1 : 0 );
+}
+
+rs_type type;
+
+void clear_type(int *out)
+{
+    rsClearObject( &type );
+    *out = ( NULL == type.p ? 1 : 0 );
+}
diff --git a/tests/tests/rscpp/librscpptest/fe_all.rs b/tests/tests/rscpp/librscpptest/fe_all.rs
new file mode 100644
index 0000000..dc20ba7
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/fe_all.rs
@@ -0,0 +1,163 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.cts.rscpp)
+
+void test_i8(const char *ain, uchar *aout) {
+    aout[0] = ain[0] + 1;
+    return;
+}
+
+void test_i8_2(const char2 *ain, uchar2 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    return;
+}
+
+void test_i8_3(const char3 *ain, uchar3 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    return;
+}
+
+void test_i8_4(const char4 *ain, uchar4 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    aout[0].w = ain[0].w + 1;
+    return;
+}
+
+void test_i16(const short *ain, ushort *aout) {
+    aout[0] = ain[0] + 1;
+    return;
+}
+
+void test_i16_2(const short2 *ain, ushort2 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    return;
+}
+
+void test_i16_3(const short3 *ain, ushort3 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    return;
+}
+
+void test_i16_4(const short4 *ain, ushort4 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    aout[0].w = ain[0].w + 1;
+    return;
+}
+
+void test_i32(const int *ain, uint *aout) {
+    aout[0] = ain[0] + 1;
+    return;
+}
+
+void test_i32_2(const int2 *ain, uint2 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    return;
+}
+
+void test_i32_3(const int3 *ain, uint3 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    return;
+}
+
+void test_i32_4(const int4 *ain, uint4 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    aout[0].w = ain[0].w + 1;
+    return;
+}
+
+void test_i64(const long *ain, ulong *aout) {
+    aout[0] = ain[0] + 1;
+    return;
+}
+
+void test_i64_2(const long2 *ain, ulong2 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    return;
+}
+
+void test_i64_3(const long3 *ain, ulong3 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    return;
+}
+
+void test_i64_4(const long4 *ain, ulong4 *aout) {
+    aout[0].x = ain[0].x + 1;
+    aout[0].y = ain[0].y + 1;
+    aout[0].z = ain[0].z + 1;
+    aout[0].w = ain[0].w + 1;
+    return;
+}
+
+void test_f32(const float *ain, float *aout) {
+    aout[0] = ain[0] + 1.0f;
+    return;
+}
+
+void test_f32_2(const float2 *ain, float2 *aout) {
+    aout[0].x = ain[0].x + 1.0f;
+    aout[0].y = ain[0].y + 1.0f;
+    return;
+}
+
+void test_f32_3(const float3 *ain, float3 *aout) {
+    aout[0].x = ain[0].x + 1.0f;
+    aout[0].y = ain[0].y + 1.0f;
+    aout[0].z = ain[0].z + 1.0f;
+    return;
+}
+
+void test_f32_4(const float4 *ain, float4 *aout) {
+    aout[0].x = ain[0].x + 1.0f;
+    aout[0].y = ain[0].y + 1.0f;
+    aout[0].z = ain[0].z + 1.0f;
+    aout[0].w = ain[0].w + 1.0f;
+    return;
+}
+
+void test_f64(const double *ain, double *aout) {
+    aout[0] = ain[0] + 1.0;
+    return;
+}
+
+void test_f64_2(const double2 *ain, double2 *aout) {
+    aout[0].x = ain[0].x + 1.0;
+    aout[0].y = ain[0].y + 1.0;
+    return;
+}
+
+void test_f64_3(const double3 *ain, double3 *aout) {
+    aout[0].x = ain[0].x + 1.0;
+    aout[0].y = ain[0].y + 1.0;
+    aout[0].z = ain[0].z + 1.0;
+    return;
+}
+
+void test_f64_4(const double4 *ain, double4 *aout) {
+    aout[0].x = ain[0].x + 1.0;
+    aout[0].y = ain[0].y + 1.0;
+    aout[0].z = ain[0].z + 1.0;
+    aout[0].w = ain[0].w + 1.0;
+    return;
+}
+
+void test_bool(const bool *ain, bool *aout) {
+    aout[0] = !ain[0];
+    return;
+}
diff --git a/tests/tests/rscpp/librscpptest/foreach.rs b/tests/tests/rscpp/librscpptest/foreach.rs
new file mode 100644
index 0000000..08e6bed
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/foreach.rs
@@ -0,0 +1,76 @@
+#include "shared.rsh"
+
+rs_allocation aRaw;
+int dimX;
+int dimY;
+static bool failed = false;
+
+void root(int *out, uint32_t x, uint32_t y) {
+    *out = x + y * dimX;
+}
+
+void foo(const int *in, int *out, uint32_t x, uint32_t y) {
+    _RS_ASSERT(*in == (x + y * dimX));
+    *out = 99 + x + y * dimX;
+    _RS_ASSERT(*out == (99 + x + y * dimX));
+}
+
+static bool test_root_output() {
+    bool failed = false;
+    int i, j;
+
+    for (j = 0; j < dimY; j++) {
+        for (i = 0; i < dimX; i++) {
+            int v = rsGetElementAt_int(aRaw, i, j);
+            _RS_ASSERT(v == (i + j * dimX));
+        }
+    }
+
+    if (failed) {
+        rsDebug("test_root_output FAILED", 0);
+    }
+    else {
+        rsDebug("test_root_output PASSED", 0);
+    }
+
+    return failed;
+}
+
+static bool test_foo_output() {
+    bool failed = false;
+    int i, j;
+
+    for (j = 0; j < dimY; j++) {
+        for (i = 0; i < dimX; i++) {
+            int v = rsGetElementAt_int(aRaw, i, j);
+            _RS_ASSERT(v == (99 + i + j * dimX));
+        }
+    }
+
+    if (failed) {
+        rsDebug("test_foo_output FAILED", 0);
+    }
+    else {
+        rsDebug("test_foo_output PASSED", 0);
+    }
+
+    return failed;
+}
+
+void verify_root() {
+    failed |= test_root_output();
+}
+
+void verify_foo() {
+    failed |= test_foo_output();
+}
+
+void foreach_test() {
+    if (failed) {
+        rsSendToClientBlocking(RS_MSG_TEST_FAILED);
+    }
+    else {
+        rsSendToClientBlocking(RS_MSG_TEST_PASSED);
+    }
+}
+
diff --git a/tests/tests/rscpp/librscpptest/instance.rs b/tests/tests/rscpp/librscpptest/instance.rs
new file mode 100644
index 0000000..097098a
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/instance.rs
@@ -0,0 +1,10 @@
+#include "shared.rsh"
+
+int i;
+rs_allocation ai;
+
+void instance_test() {
+    // Set our allocation based on the global input value.
+    rsSetElementAt(ai, &i, 0);
+}
+
diff --git a/tests/tests/rscpp/librscpptest/noroot.rs b/tests/tests/rscpp/librscpptest/noroot.rs
new file mode 100644
index 0000000..f69effc
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/noroot.rs
@@ -0,0 +1,46 @@
+#include "shared.rsh"
+
+int *a;
+rs_allocation aRaw;
+int dimX;
+int dimY;
+static bool failed = false;
+
+void foo(const int *in, int *out, uint32_t x, uint32_t y) {
+    *out = 99 + x + y * dimX;
+}
+
+static bool test_foo_output() {
+    bool failed = false;
+    int i, j;
+
+    for (j = 0; j < dimY; j++) {
+        for (i = 0; i < dimX; i++) {
+            int v = rsGetElementAt_int(aRaw, i, j);
+            _RS_ASSERT(v == (99 + i + j * dimX));
+        }
+    }
+
+    if (failed) {
+        rsDebug("test_foo_output FAILED", 0);
+    }
+    else {
+        rsDebug("test_foo_output PASSED", 0);
+    }
+
+    return failed;
+}
+
+void verify_foo() {
+    failed |= test_foo_output();
+}
+
+void noroot_test() {
+    if (failed) {
+        rsSendToClientBlocking(RS_MSG_TEST_FAILED);
+    }
+    else {
+        rsSendToClientBlocking(RS_MSG_TEST_PASSED);
+    }
+}
+
diff --git a/tests/tests/rscpp/librscpptest/primitives.rs b/tests/tests/rscpp/librscpptest/primitives.rs
new file mode 100644
index 0000000..8682331
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/primitives.rs
@@ -0,0 +1,53 @@
+#include "shared.rsh"
+
+// Testing primitive types
+float floatTest = 1.99f;
+double doubleTest = 2.05;
+char charTest = -8;
+short shortTest = -16;
+int intTest = -32;
+long longTest = 17179869184l; // 1 << 34
+long long longlongTest = 68719476736l; // 1 << 36
+bool boolTest = false;
+
+rs_allocation allocationTest;
+int *intPtrTest;
+
+uchar ucharTest = 8;
+ushort ushortTest = 16;
+uint uintTest = 32;
+ulong ulongTest = 4611686018427387904L;
+int64_t int64_tTest = -17179869184l; // - 1 << 34
+uint64_t uint64_tTest = 117179869184l;
+
+void test_primitive_types() {
+    bool failed = false;
+    start();
+
+    _RS_ASSERT(floatTest == 2.99f);
+    _RS_ASSERT(doubleTest == 3.05);
+    _RS_ASSERT(charTest == -16);
+    _RS_ASSERT(shortTest == -32);
+    _RS_ASSERT(intTest == -64);
+    _RS_ASSERT(longTest == 17179869185l);
+    _RS_ASSERT(longlongTest == 68719476735l);
+
+    _RS_ASSERT(ucharTest == 8);
+    _RS_ASSERT(ushortTest == 16);
+    _RS_ASSERT(uintTest == 32);
+    _RS_ASSERT(ulongTest == 4611686018427387903L);
+    _RS_ASSERT(int64_tTest == -17179869184l);
+    _RS_ASSERT(uint64_tTest == 117179869185l);
+
+    float time = end();
+
+    if (failed) {
+        rsDebug("test_primitive_types FAILED", time);
+        rsSendToClientBlocking(RS_MSG_TEST_FAILED);
+    }
+    else {
+        rsDebug("test_primitive_types PASSED", time);
+        rsSendToClientBlocking(RS_MSG_TEST_PASSED);
+    }
+
+}
diff --git a/tests/tests/rscpp/librscpptest/rs_jni.cpp b/tests/tests/rscpp/librscpptest/rs_jni.cpp
index f5946f5..4e60f4b 100644
--- a/tests/tests/rscpp/librscpptest/rs_jni.cpp
+++ b/tests/tests/rscpp/librscpptest/rs_jni.cpp
@@ -24,8 +24,7 @@
 #include <RenderScript.h>
 
 #define  LOG_TAG    "rscpptest"
-#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
-#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
+#define  LOGV(...)  __android_log_print(ANDROID_LOG_VERBOSE,LOG_TAG,__VA_ARGS__)
 
 using namespace android::RSC;
 
@@ -51,6 +50,18 @@
     }
 }
 
+sp<const Element> makeElement(sp<RS> rs, RsDataType dt, int vecSize) {
+    if (vecSize > 1) {
+        return Element::createVector(rs, dt, vecSize);
+    } else {
+        if (dt == RS_TYPE_UNSIGNED_8) {
+            return Element::U8(rs);
+        } else {
+            return Element::F32(rs);
+        }
+    }
+}
+
 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSInitTest_initTest(JNIEnv * env,
                                                                                  jclass obj,
                                                                                  jstring pathObj)
@@ -60,7 +71,7 @@
     for (int i = 0; i < 1000; i++) {
         sp<RS> rs = new RS();
         r &= rs->init(path);
-        LOGE("Native iteration %i, returned %i", i, (int)r);
+        LOGV("Native iteration %i, returned %i", i, (int)r);
     }
     env->ReleaseStringUTFChars(pathObj, path);
     return r;
@@ -371,4 +382,114 @@
 
 }
 
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSResizeTest_resizeTest(JNIEnv * env,
+                                                                                     jclass obj,
+                                                                                     jstring pathObj,
+                                                                                     jint X,
+                                                                                     jint Y,
+                                                                                     jfloat scaleX,
+                                                                                     jfloat scaleY,
+                                                                                     jboolean useByte,
+                                                                                     jint vecSize,
+                                                                                     jbyteArray inputByteArray,
+                                                                                     jbyteArray outputByteArray,
+                                                                                     jfloatArray inputFloatArray,
+                                                                                     jfloatArray outputFloatArray
+                                                                                     )
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+
+    sp<RS> rs = new RS();
+    rs->init(path);
+
+    RsDataType dt = RS_TYPE_UNSIGNED_8;
+    if (!useByte) {
+        dt = RS_TYPE_FLOAT_32;
+    }
+    sp<const Element> e = makeElement(rs, dt, vecSize);
+    sp<Allocation> inputAlloc = Allocation::createSized2D(rs, e, X, Y);
+
+    int outX = (int) (X * scaleX);
+    int outY = (int) (Y * scaleY);
+    sp<Allocation> outputAlloc = Allocation::createSized2D(rs, e, outX, outY);
+    sp<ScriptIntrinsicResize> resize = ScriptIntrinsicResize::create(rs);
+
+    if (useByte) {
+        jbyte * input = (jbyte *) env->GetPrimitiveArrayCritical(inputByteArray, 0);
+        inputAlloc->copy2DRangeFrom(0, 0, X, Y, input);
+        env->ReleasePrimitiveArrayCritical(inputByteArray, input, 0);
+    } else {
+        jfloat * input = (jfloat *) env->GetPrimitiveArrayCritical(inputFloatArray, 0);
+        inputAlloc->copy2DRangeFrom(0, 0, X, Y, input);
+        env->ReleasePrimitiveArrayCritical(inputFloatArray, input, 0);
+    }
+
+    resize->setInput(inputAlloc);
+    resize->forEach_bicubic(outputAlloc);
+
+    if (useByte) {
+        jbyte * output = (jbyte *) env->GetPrimitiveArrayCritical(outputByteArray, 0);
+        outputAlloc->copy2DRangeTo(0, 0, outX, outY, output);
+        env->ReleasePrimitiveArrayCritical(outputByteArray, output, 0);
+    } else {
+        jfloat * output = (jfloat *) env->GetPrimitiveArrayCritical(outputFloatArray, 0);
+        outputAlloc->copy2DRangeTo(0, 0, outX, outY, output);
+        env->ReleasePrimitiveArrayCritical(outputFloatArray, output, 0);
+    }
+
+    env->ReleaseStringUTFChars(pathObj, path);
+    return (rs->getError() == RS_SUCCESS);
+
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSYuvTest_yuvTest(JNIEnv * env,
+                                                                               jclass obj,
+                                                                               jstring pathObj,
+                                                                               jint X,
+                                                                               jint Y,
+                                                                               jbyteArray inputByteArray,
+                                                                               jbyteArray outputByteArray,
+                                                                               jint yuvFormat
+                                                                               )
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    jbyte * input = (jbyte *) env->GetPrimitiveArrayCritical(inputByteArray, 0);
+    jbyte * output = (jbyte *) env->GetPrimitiveArrayCritical(outputByteArray, 0);
+
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+
+    RSYuvFormat mYuvFormat = (RSYuvFormat)yuvFormat;
+    sp<ScriptIntrinsicYuvToRGB> syuv = ScriptIntrinsicYuvToRGB::create(mRS, Element::U8_4(mRS));;
+    sp<Allocation> inputAlloc = nullptr;
+
+    if (mYuvFormat != RS_YUV_NONE) {
+        //syuv = ScriptIntrinsicYuvToRGB::create(mRS, Element::YUV(mRS));
+        Type::Builder tb(mRS, Element::YUV(mRS));
+        tb.setX(X);
+        tb.setY(Y);
+        tb.setYuvFormat(mYuvFormat);
+        inputAlloc = Allocation::createTyped(mRS, tb.create());
+        inputAlloc->copy2DRangeFrom(0, 0, X, Y, input);
+    } else {
+        //syuv = ScriptIntrinsicYuvToRGB::create(mRS, Element::U8(mRS));
+        size_t arrLen = X * Y + ((X + 1) / 2) * ((Y + 1) / 2) * 2;
+        inputAlloc = Allocation::createSized(mRS, Element::U8(mRS), arrLen);
+        inputAlloc->copy1DRangeFrom(0, arrLen, input);
+    }
+
+    sp<const Type> tout = Type::create(mRS, Element::RGBA_8888(mRS), X, Y, 0);
+    sp<Allocation> outputAlloc = Allocation::createTyped(mRS, tout);
+
+    syuv->setInput(inputAlloc);
+    syuv->forEach(outputAlloc);
+
+    outputAlloc->copy2DRangeTo(0, 0, X, Y, output);
+
+    env->ReleasePrimitiveArrayCritical(inputByteArray, input, 0);
+    env->ReleasePrimitiveArrayCritical(outputByteArray, output, 0);
+    env->ReleaseStringUTFChars(pathObj, path);
+    return (mRS->getError() == RS_SUCCESS);
+
+}
 
diff --git a/tests/tests/rscpp/librscpptest/rs_jni_allocation.cpp b/tests/tests/rscpp/librscpptest/rs_jni_allocation.cpp
index 4157026..4b8b8a8 100644
--- a/tests/tests/rscpp/librscpptest/rs_jni_allocation.cpp
+++ b/tests/tests/rscpp/librscpptest/rs_jni_allocation.cpp
@@ -31,8 +31,8 @@
 
 using namespace android::RSC;
 
-static void createTypedHelper (sp<RS> mRS, sp<const Element> e) {
-    Type::Builder typeBuilder(mRS, e);
+static void createTypedHelper (sp<RS> rs, sp<const Element> e) {
+    Type::Builder typeBuilder(rs, e);
     for (int mips = 0; mips <= 1; mips ++) {
         bool useMips = (mips == 1);
 
@@ -45,7 +45,7 @@
                     typeBuilder.setFaces(useFaces);
                     typeBuilder.setX(x);
                     typeBuilder.setY(y);
-                    Allocation::createTyped(mRS, typeBuilder.create());
+                    Allocation::createTyped(rs, typeBuilder.create());
                 }
             }
         }
@@ -58,236 +58,147 @@
                                                                                         jstring pathObj)
 {
     const char * path = env->GetStringUTFChars(pathObj, NULL);
-    sp<RS> mRS = new RS();
-    mRS->init(path);
+    sp<RS> rs = new RS();
+    rs->init(path);
     env->ReleaseStringUTFChars(pathObj, path);
 
-    createTypedHelper(mRS, Element::A_8(mRS));
-    createTypedHelper(mRS, Element::RGBA_4444(mRS));
-    createTypedHelper(mRS, Element::RGBA_5551(mRS));
-    createTypedHelper(mRS, Element::RGB_565(mRS));
-    createTypedHelper(mRS, Element::RGB_888(mRS));
-    createTypedHelper(mRS, Element::RGBA_8888(mRS));
-    createTypedHelper(mRS, Element::F32(mRS));
-    createTypedHelper(mRS, Element::F32_2(mRS));
-    createTypedHelper(mRS, Element::F32_3(mRS));
-    createTypedHelper(mRS, Element::F32_4(mRS));
-    createTypedHelper(mRS, Element::F64(mRS));
-    createTypedHelper(mRS, Element::F64_2(mRS));
-    createTypedHelper(mRS, Element::F64_3(mRS));
-    createTypedHelper(mRS, Element::F64_4(mRS));
-    createTypedHelper(mRS, Element::I8(mRS));
-    createTypedHelper(mRS, Element::I8_2(mRS));
-    createTypedHelper(mRS, Element::I8_3(mRS));
-    createTypedHelper(mRS, Element::I8_4(mRS));
-    createTypedHelper(mRS, Element::I16(mRS));
-    createTypedHelper(mRS, Element::I16_2(mRS));
-    createTypedHelper(mRS, Element::I16_3(mRS));
-    createTypedHelper(mRS, Element::I16_4(mRS));
-    createTypedHelper(mRS, Element::I32(mRS));
-    createTypedHelper(mRS, Element::I32_2(mRS));
-    createTypedHelper(mRS, Element::I32_3(mRS));
-    createTypedHelper(mRS, Element::I32_4(mRS));
-    createTypedHelper(mRS, Element::I64(mRS));
-    createTypedHelper(mRS, Element::I64_2(mRS));
-    createTypedHelper(mRS, Element::I64_3(mRS));
-    createTypedHelper(mRS, Element::I64_4(mRS));
-    createTypedHelper(mRS, Element::U8(mRS));
-    createTypedHelper(mRS, Element::U8_2(mRS));
-    createTypedHelper(mRS, Element::U8_3(mRS));
-    createTypedHelper(mRS, Element::U8_4(mRS));
-    createTypedHelper(mRS, Element::U16(mRS));
-    createTypedHelper(mRS, Element::U16_2(mRS));
-    createTypedHelper(mRS, Element::U16_3(mRS));
-    createTypedHelper(mRS, Element::U16_4(mRS));
-    createTypedHelper(mRS, Element::U32(mRS));
-    createTypedHelper(mRS, Element::U32_2(mRS));
-    createTypedHelper(mRS, Element::U32_3(mRS));
-    createTypedHelper(mRS, Element::U32_4(mRS));
-    createTypedHelper(mRS, Element::U64(mRS));
-    createTypedHelper(mRS, Element::U64_2(mRS));
-    createTypedHelper(mRS, Element::U64_3(mRS));
-    createTypedHelper(mRS, Element::U64_4(mRS));
-    createTypedHelper(mRS, Element::MATRIX_2X2(mRS));
-    createTypedHelper(mRS, Element::MATRIX_3X3(mRS));
-    createTypedHelper(mRS, Element::MATRIX_4X4(mRS));
-    createTypedHelper(mRS, Element::SAMPLER(mRS));
-    createTypedHelper(mRS, Element::SCRIPT(mRS));
-    createTypedHelper(mRS, Element::TYPE(mRS));
-    createTypedHelper(mRS, Element::BOOLEAN(mRS));
-    createTypedHelper(mRS, Element::ELEMENT(mRS));
-    createTypedHelper(mRS, Element::ALLOCATION(mRS));
+    createTypedHelper(rs, Element::A_8(rs));
+    createTypedHelper(rs, Element::RGBA_4444(rs));
+    createTypedHelper(rs, Element::RGBA_5551(rs));
+    createTypedHelper(rs, Element::RGB_565(rs));
+    createTypedHelper(rs, Element::RGB_888(rs));
+    createTypedHelper(rs, Element::RGBA_8888(rs));
+    createTypedHelper(rs, Element::F32(rs));
+    createTypedHelper(rs, Element::F32_2(rs));
+    createTypedHelper(rs, Element::F32_3(rs));
+    createTypedHelper(rs, Element::F32_4(rs));
+    createTypedHelper(rs, Element::F64(rs));
+    createTypedHelper(rs, Element::F64_2(rs));
+    createTypedHelper(rs, Element::F64_3(rs));
+    createTypedHelper(rs, Element::F64_4(rs));
+    createTypedHelper(rs, Element::I8(rs));
+    createTypedHelper(rs, Element::I8_2(rs));
+    createTypedHelper(rs, Element::I8_3(rs));
+    createTypedHelper(rs, Element::I8_4(rs));
+    createTypedHelper(rs, Element::I16(rs));
+    createTypedHelper(rs, Element::I16_2(rs));
+    createTypedHelper(rs, Element::I16_3(rs));
+    createTypedHelper(rs, Element::I16_4(rs));
+    createTypedHelper(rs, Element::I32(rs));
+    createTypedHelper(rs, Element::I32_2(rs));
+    createTypedHelper(rs, Element::I32_3(rs));
+    createTypedHelper(rs, Element::I32_4(rs));
+    createTypedHelper(rs, Element::I64(rs));
+    createTypedHelper(rs, Element::I64_2(rs));
+    createTypedHelper(rs, Element::I64_3(rs));
+    createTypedHelper(rs, Element::I64_4(rs));
+    createTypedHelper(rs, Element::U8(rs));
+    createTypedHelper(rs, Element::U8_2(rs));
+    createTypedHelper(rs, Element::U8_3(rs));
+    createTypedHelper(rs, Element::U8_4(rs));
+    createTypedHelper(rs, Element::U16(rs));
+    createTypedHelper(rs, Element::U16_2(rs));
+    createTypedHelper(rs, Element::U16_3(rs));
+    createTypedHelper(rs, Element::U16_4(rs));
+    createTypedHelper(rs, Element::U32(rs));
+    createTypedHelper(rs, Element::U32_2(rs));
+    createTypedHelper(rs, Element::U32_3(rs));
+    createTypedHelper(rs, Element::U32_4(rs));
+    createTypedHelper(rs, Element::U64(rs));
+    createTypedHelper(rs, Element::U64_2(rs));
+    createTypedHelper(rs, Element::U64_3(rs));
+    createTypedHelper(rs, Element::U64_4(rs));
+    createTypedHelper(rs, Element::MATRIX_2X2(rs));
+    createTypedHelper(rs, Element::MATRIX_3X3(rs));
+    createTypedHelper(rs, Element::MATRIX_4X4(rs));
+    createTypedHelper(rs, Element::SAMPLER(rs));
+    createTypedHelper(rs, Element::SCRIPT(rs));
+    createTypedHelper(rs, Element::TYPE(rs));
+    createTypedHelper(rs, Element::BOOLEAN(rs));
+    createTypedHelper(rs, Element::ELEMENT(rs));
+    createTypedHelper(rs, Element::ALLOCATION(rs));
 
-    mRS->finish();
+    rs->finish();
     return true;
 }
 
-static bool helperFloatCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
+static sp<const Element> makeElement(sp<RS> rs, RsDataType dt, int vecSize) {
+    if (vecSize > 1) {
+        return Element::createVector(rs, dt, vecSize);
+    } else {
+        return Element::createUser(rs, dt);
+    }
+}
+
+/**
+ * Test copyTo and copyFrom for all or part of a 1D Allocation.
+ *
+ * @param rs RS Context.
+ * @param cellCount Total number of elements in this Allocation.
+ * @param offset Offset of this Allocation for copy.
+ * @param count Number of elements need to copy.
+ * @param copyRange Copy the entire allocation or part of it (using different API).
+ * @param dt DataType intended to test.
+ * @param autoPadding Enable autoPadding or not. 
+*/
+template <class T>
+static bool helperCopy1D(sp<RS> rs, int cellCount, int offset, int count, bool copyRange,
+                         RsDataType dt, bool autoPadding = false) {
     bool passed = true;
-    sp<Allocation> A = Allocation::createSized(mRS, Element::F32(mRS), nElems);
+    int arrLen = cellCount;
+    int copyCount = count;
+    int iOffset = offset;
+    sp<Allocation> alloc = nullptr;
+
+    if (autoPadding) {
+        arrLen = cellCount * 3;
+        copyCount = count * 3;
+        iOffset = offset * 3;
+        alloc = Allocation::createSized(rs, makeElement(rs, dt, 3), cellCount);
+        alloc->setAutoPadding(autoPadding);
+    } else {
+        alloc = Allocation::createSized(rs, makeElement(rs, dt, 1), cellCount);
+    }
+
+    T* src = new T[arrLen];
+    T* dst = new T[arrLen];
+
+    for (int i = 0; i < copyCount; i++) {
+        src[i] = (T)rand();
+        dst[iOffset + i] = (T)(-1);
+    }
+
+    if (!copyRange) {
+        alloc->copy1DFrom(src);
+    } else {
+        alloc->copy1DRangeFrom(offset, count, src);
+    }
+    alloc->copy1DTo(dst);
+
+    for (int i = 0; i < copyCount; i++) {
+        if (dst[iOffset + i] != src[i]) {
+            passed = false;
+            break;
+        }
+    }
+
+    delete[] src;
+    delete[] dst;
+    return passed;
+}
+
+//Corresponding 1D allocation to allocation copy.
+static bool helperFloatAllocationCopy1D(sp<RS> rs, int cellCount, int offset, int count) {
+
+    bool passed = true;
+    sp<Allocation> srcA = Allocation::createSized(rs, Element::F32(rs), cellCount);
+    sp<Allocation> dstA = Allocation::createSized(rs, Element::F32(rs), cellCount);
 
     float *src, *dst;
-    src = new float[nElems];
-    dst = new float[nElems];
-
-    for (int i = 0; i < count; i++) {
-        src[i] = (float)i;
-        dst[offset + i] = -1.0f;
-    }
-
-    switch (copyMode) {
-    case 0: A->copy1DFrom(src); break;
-    case 1: A->copy1DRangeFrom(offset, count, src); break;
-    }
-    A->copy1DTo(dst);
-
-    for (int i = 0; i < count; i++) {
-        if (dst[offset + i] != src[i]) {
-            passed = false;
-            break;
-        }
-    }
-
-    delete[] src;
-    delete[] dst;
-    return passed;
-}
-
-static bool helperCharCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
-    bool passed = true;
-    sp<Allocation> A = Allocation::createSized(mRS, Element::I8(mRS), nElems);
-
-    char *src, *dst;
-    src = new char[nElems];
-    dst = new char[nElems];
-
-    for (int i = 0; i < count; i++) {
-        src[i] = (char)i;
-        dst[offset + i] = -1;
-    }
-
-    switch (copyMode) {
-    case 0: A->copy1DFrom(src); break;
-    case 1: A->copy1DRangeFrom(offset, count, src); break;
-    }
-    A->copy1DTo(dst);
-
-    for (int i = 0; i < count; i++) {
-        if (dst[offset + i] != src[i]) {
-            passed = false;
-            break;
-        }
-    }
-
-    delete[] src;
-    delete[] dst;
-    return passed;
-}
-
-static bool helperShortCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
-    bool passed = true;
-    sp<Allocation> A = Allocation::createSized(mRS, Element::I16(mRS), nElems);
-
-    short *src, *dst;
-    src = new short[nElems];
-    dst = new short[nElems];
-
-    for (int i = 0; i < count; i++) {
-        src[i] = (short)i;
-        dst[offset + i] = -1;
-    }
-
-    switch (copyMode) {
-    case 0: A->copy1DFrom(src); break;
-    case 1: A->copy1DRangeFrom(offset, count, src); break;
-    }
-    A->copy1DTo(dst);
-
-    for (int i = 0; i < count; i++) {
-        if (dst[offset + i] != src[i]) {
-            passed = false;
-            break;
-        }
-    }
-
-    delete[] src;
-    delete[] dst;
-    return passed;
-}
-
-static bool helperIntCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
-    bool passed = true;
-    sp<Allocation> A = Allocation::createSized(mRS, Element::I32(mRS), nElems);
-
-    int *src, *dst;
-    src = new int[nElems];
-    dst = new int[nElems];
-
-    for (int i = 0; i < count; i++) {
-        src[i] = (int)i;
-        dst[offset + i] = -1;
-    }
-
-    switch (copyMode) {
-    case 0: A->copy1DFrom(src); break;
-    case 1: A->copy1DRangeFrom(offset, count, src); break;
-    }
-    A->copy1DTo(dst);
-
-    for (int i = 0; i < count; i++) {
-        if (dst[offset + i] != src[i]) {
-            passed = false;
-            break;
-        }
-    }
-
-    delete[] src;
-    delete[] dst;
-    return passed;
-}
-
-static bool helperDoubleCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
-    bool passed = true;
-    sp<Allocation> A = Allocation::createSized(mRS, Element::F64(mRS), nElems);
-
-    double *src, *dst;
-    src = new double[nElems];
-    dst = new double[nElems];
-
-    for (int i = 0; i < count; i++) {
-        src[i] = (double)i;
-        dst[offset + i] = -1;
-    }
-
-    switch (copyMode) {
-    case 0: A->copy1DFrom(src); break;
-    case 1: A->copy1DRangeFrom(offset, count, src); break;
-    }
-    A->copy1DTo(dst);
-
-    for (int i = 0; i < count; i++) {
-        if (dst[offset + i] != src[i]) {
-            passed = false;
-            break;
-        }
-    }
-
-    delete[] src;
-    delete[] dst;
-    return passed;
-}
-
-static bool helperFloatAllocationCopy(sp<RS> mRS, int nElems, int offset, int count) {
-
-    bool passed = true;
-    sp<Allocation> srcA = Allocation::createSized(mRS, Element::F32(mRS), nElems);
-    sp<Allocation> dstA = Allocation::createSized(mRS, Element::F32(mRS), nElems);
-
-    float *src, *dst;
-    src = new float[nElems];
-    dst = new float[nElems];
-    for (int i = 0; i < nElems; i++) {
-        src[i] = (float)i;
+    src = new float[cellCount];
+    dst = new float[cellCount];
+    for (int i = 0; i < cellCount; i++) {
+        src[i] = (float)rand();
         dst[i] = -1.0f;
     }
 
@@ -309,6 +220,205 @@
     return passed;
 }
 
+/**
+ * Test copyTo and copyFrom for all or part of a 2D Allocation.
+ *
+ * @param rs RS Context.
+ * @param xElems Number of elements in X dimension in this Allocation.
+ * @param yElems Number of elements in Y dimension in this Allocation.
+ * @param xOffset Offset in X dimension of this Allocation for copy.
+ * @param yOffset Offset in Y dimension of this Allocation for copy.
+ * @param xCount Number of elements in X dimension need to copy.
+ * @param yCount Number of elements in Y dimension need to copy.
+ * @param dt DataType intended to test.
+ * @param autoPadding Enable autoPadding or not. 
+*/
+template <class T>
+static bool helperCopy2D(sp<RS> rs, int xElems, int yElems,
+                         int xOffset, int yOffset, int xCount, int yCount,
+                         RsDataType dt, bool autoPadding = false) {
+    bool passed = true;
+    int arrLen = xElems * yElems;
+    int copyCount = xCount * yCount;
+    sp<Allocation> alloc = nullptr;
+
+    if (autoPadding) {
+        arrLen = arrLen * 3;
+        copyCount = copyCount * 3;
+        alloc = Allocation::createSized2D(rs, makeElement(rs, dt, 3), xElems, yElems);
+        alloc->setAutoPadding(autoPadding);
+    } else {
+        alloc = Allocation::createSized2D(rs, makeElement(rs, dt, 1), xElems, yElems);
+    }
+
+    T* src = new T[arrLen];
+    T* dst = new T[arrLen];
+
+    for (int i = 0; i < copyCount; i++) {
+        src[i] = (T)rand();
+        dst[i] = (T)(-1);
+    }
+
+    alloc->copy2DRangeFrom(xOffset, yOffset, xCount, yCount, src);
+    alloc->copy2DRangeTo(xOffset, yOffset, xCount, yCount, dst);
+
+    for (int i = 0; i < copyCount; i++) {
+        if (dst[i] != src[i]) {
+            passed = false;
+            break;
+        }
+    }
+
+    delete[] src;
+    delete[] dst;
+    return passed;
+}
+
+//Corresponding 2D allocation to allocation copy.
+static bool helperFloatAllocationCopy2D(sp<RS> rs, int xElems, int yElems,
+                                        int xOffset, int yOffset, int xCount, int yCount) {
+
+    bool passed = true;
+    sp<Allocation> srcA = Allocation::createSized2D(rs, Element::F32(rs), xElems, yElems);
+    sp<Allocation> dstA = Allocation::createSized2D(rs, Element::F32(rs), xElems, yElems);
+
+    float *src, *dst;
+    src = new float[xElems * yElems];
+    dst = new float[xElems * yElems];
+    for (int i = 0; i < xCount * yCount; i++) {
+        src[i] = (float)rand();
+        dst[i] = -1.0f;
+    }
+
+    // First populate the source allocation
+    srcA->copy2DRangeFrom(xOffset, yOffset, xCount, yCount, src);
+    // Now test allocation to allocation copy
+    dstA->copy2DRangeFrom(xOffset, yOffset, xCount, yCount, srcA, xOffset, yOffset);
+    dstA->copy2DRangeTo(xOffset, yOffset, xCount, yCount, dst);
+
+    for (int i = 0; i < xCount * yCount; i++) {
+        if (dst[i] != src[i]) {
+            passed = false;
+            break;
+        }
+    }
+
+    delete[] src;
+    delete[] dst;
+    return passed;
+}
+
+/**
+ * Test copyTo and copyFrom for all or part of a 2D Allocation.
+ *
+ * @param rs RS Context.
+ * @param xElems Number of elements in X dimension in this Allocation.
+ * @param yElems Number of elements in Y dimension in this Allocation.
+ * @param zElems Number of elements in Z dimension in this Allocation.
+ * @param xOffset Offset in X dimension of this Allocation for copy.
+ * @param yOffset Offset in Y dimension of this Allocation for copy.
+ * @param zOffset Offset in Z dimension of this Allocation for copy.
+ * @param xCount Number of elements in X dimension need to copy.
+ * @param yCount Number of elements in Y dimension need to copy.
+ * @param zCount Number of elements in Z dimension need to copy.
+ * @param dt DataType intended to test.
+ * @param autoPadding Enable autoPadding or not. 
+*/
+template <class T>
+static bool helperCopy3D(sp<RS> rs, int xElems, int yElems, int zElems,
+                         int xOffset, int yOffset, int zOffset,
+                         int xCount, int yCount, int zCount,
+                         RsDataType dt, bool autoPadding = false) {
+    bool passed = true;
+    int arrLen = xElems * yElems * zElems;
+    int copyCount = xCount * yCount * zCount;
+    sp<Allocation> alloc = nullptr;
+
+    if (autoPadding) {
+        arrLen = arrLen * 3;
+        copyCount = copyCount * 3;
+
+        Type::Builder typeBuilder(rs, makeElement(rs, dt, 3));
+        typeBuilder.setX(xElems);
+        typeBuilder.setY(yElems);
+        typeBuilder.setZ(zElems);
+
+        alloc = Allocation::createTyped(rs, typeBuilder.create());
+        alloc->setAutoPadding(autoPadding);
+    } else {
+        Type::Builder typeBuilder(rs, makeElement(rs, dt, 1));
+        typeBuilder.setX(xElems);
+        typeBuilder.setY(yElems);
+        typeBuilder.setZ(zElems);
+
+        alloc = Allocation::createTyped(rs, typeBuilder.create());
+    }
+
+    T* src = new T[arrLen];
+    T* dst = new T[arrLen];
+
+    for (int i = 0; i < copyCount; i++) {
+        src[i] = (T)rand();
+        dst[i] = (T)(-1);
+    }
+
+    alloc->copy3DRangeFrom(xOffset, yOffset, zOffset, xCount, yCount, zCount, src);
+    alloc->copy3DRangeTo(xOffset, yOffset, zOffset, xCount, yCount, zCount, dst);
+
+    for (int i = 0; i < copyCount; i++) {
+        if (dst[i] != src[i]) {
+            passed = false;
+            break;
+        }
+    }
+
+    delete[] src;
+    delete[] dst;
+    return passed;
+}
+
+//Corresponding 3D allocation to allocation copy.
+static bool helperFloatAllocationCopy3D(sp<RS> rs, int xElems, int yElems, int zElems,
+                                        int xOffset, int yOffset, int zOffset,
+                                        int xCount, int yCount, int zCount) {
+
+    bool passed = true;
+    Type::Builder typeBuilder(rs, Element::F32(rs));
+
+    typeBuilder.setX(xElems);
+    typeBuilder.setY(yElems);
+    typeBuilder.setZ(zElems);
+
+    sp<Allocation> srcA = Allocation::createTyped(rs, typeBuilder.create());
+    sp<Allocation> dstA = Allocation::createTyped(rs, typeBuilder.create());
+
+    float *src, *dst;
+    src = new float[xElems * yElems * zElems];
+    dst = new float[xElems * yElems * zElems];
+    for (int i = 0; i < xCount * yCount * zCount; i++) {
+        src[i] = (float)rand();
+        dst[i] = -1.0f;
+    }
+
+    // First populate the source allocation
+    srcA->copy3DRangeFrom(xOffset, yOffset, zOffset, xCount, yCount, zCount, src);
+    // Now test allocation to allocation copy
+    dstA->copy3DRangeFrom(xOffset, yOffset, zOffset, xCount, yCount, zCount,
+                          srcA, xOffset, yOffset, zOffset);
+    dstA->copy3DRangeTo(xOffset, yOffset, zOffset, xCount, yCount, zCount, dst);
+
+    for (int i = 0; i < xCount * yCount * zCount; i++) {
+        if (dst[i] != src[i]) {
+            passed = false;
+            break;
+        }
+    }
+
+    delete[] src;
+    delete[] dst;
+    return passed;
+}
+
 static int elemsToTest = 20;
 
 extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_test1DCopy(JNIEnv * env,
@@ -316,37 +426,180 @@
                                                                                          jstring pathObj)
 {
     const char * path = env->GetStringUTFChars(pathObj, NULL);
-    sp<RS> mRS = new RS();
-    mRS->init(path);
+    sp<RS> rs = new RS();
+    rs->init(path);
     env->ReleaseStringUTFChars(pathObj, path);
     bool passed = true;
 
     for (int s = 8; s <= elemsToTest; s += 2) {
-        for (int mode = 0; mode < 1; mode ++) {
-            passed &= helperFloatCopy(mRS, s, 0, s, mode);
-            passed &= helperCharCopy(mRS, s, 0, s, mode);
-            passed &= helperShortCopy(mRS, s, 0, s, mode);
-            passed &= helperIntCopy(mRS, s, 0, s, mode);
-            //helperBaseObjCopy(mRS, s, 0, s, mode);
-        }
+        passed &= helperCopy1D<float>(rs, s, 0, s, false, RS_TYPE_FLOAT_32);
+        passed &= helperCopy1D<char>(rs, s, 0, s, false, RS_TYPE_SIGNED_8);
+        passed &= helperCopy1D<short>(rs, s, 0, s, false, RS_TYPE_SIGNED_16);
+        passed &= helperCopy1D<int>(rs, s, 0, s, false, RS_TYPE_SIGNED_32);
+        passed &= helperCopy1D<double>(rs, s, 0, s, false, RS_TYPE_FLOAT_64);
 
         // now test copy range
-        for (int mode = 1; mode < 2; mode ++) {
-            for (int off = 0; off < s; off ++) {
-                for (int count = 1; count <= s - off; count ++) {
-                    passed &= helperFloatCopy(mRS, s, off, count, mode);
-                    passed &= helperCharCopy(mRS, s, off, count, mode);
-                    passed &= helperShortCopy(mRS, s, off, count, mode);
-                    passed &= helperIntCopy(mRS, s, off, count, mode);
-                    //helperBaseObjCopy(mRS, s, off, count, mode);
-                }
+        for (int off = 0; off < s; off ++) {
+            for (int count = 1; count <= s - off; count ++) {
+                passed &= helperCopy1D<float>(rs, s, off, count, true, RS_TYPE_FLOAT_32);
+                passed &= helperCopy1D<char>(rs, s, off, count, true, RS_TYPE_SIGNED_8);
+                passed &= helperCopy1D<short>(rs, s, off, count, true, RS_TYPE_SIGNED_16);
+                passed &= helperCopy1D<int>(rs, s, off, count, true, RS_TYPE_SIGNED_32);
+                passed &= helperCopy1D<double>(rs, s, off, count, true, RS_TYPE_FLOAT_64);
             }
         }
 
         for (int off = 0; off < s; off ++) {
             for (int count = 1; count <= s - off; count ++) {
-                passed &= helperFloatAllocationCopy(mRS, s, off, count);
-                //helperByteAllocationCopy(mRS, s, off, count);
+                passed &= helperFloatAllocationCopy1D(rs, s, off, count);
+            }
+        }
+    }
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_test2DCopy(JNIEnv * env,
+                                                                                         jclass obj,
+                                                                                         jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> rs = new RS();
+    rs->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+    bool passed = true;
+
+    for (int s = 8; s <= elemsToTest; s += 2) {
+        // now test copy range
+        for (int off = 0; off < s; off ++) {
+            for (int count = 1; count <= s - off; count ++) {
+                passed &= helperCopy2D<float>(rs, s, s, off, off, count, count, RS_TYPE_FLOAT_32);
+                passed &= helperCopy2D<char>(rs, s, s, off, off, count, count, RS_TYPE_SIGNED_8);
+                passed &= helperCopy2D<short>(rs, s, s, off, off, count, count, RS_TYPE_SIGNED_16);
+                passed &= helperCopy2D<int>(rs, s, s, off, off, count, count, RS_TYPE_SIGNED_32);
+                passed &= helperCopy2D<double>(rs, s, s, off, off, count, count, RS_TYPE_FLOAT_64);
+            }
+        }
+
+        for (int off = 0; off < s; off ++) {
+            for (int count = 1; count <= s - off; count ++) {
+                passed &= helperFloatAllocationCopy2D(rs, s, s, off, off, count, count);
+            }
+        }
+    }
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_test3DCopy(JNIEnv * env,
+                                                                                         jclass obj,
+                                                                                         jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> rs = new RS();
+    rs->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+    bool passed = true;
+
+    for (int s = 8; s <= elemsToTest; s += 2) {
+        // now test copy range
+        for (int off = 0; off < s; off ++) {
+            for (int count = 1; count <= s - off; count ++) {
+                passed &= helperCopy3D<float>(rs, s, s, s, off, off, off, count, count, count, RS_TYPE_FLOAT_32);
+                passed &= helperCopy3D<char>(rs, s, s, s, off, off, off, count, count, count, RS_TYPE_SIGNED_8);
+                passed &= helperCopy3D<short>(rs, s, s, s, off, off, off, count, count, count, RS_TYPE_SIGNED_16);
+                passed &= helperCopy3D<int>(rs, s, s, s, off, off, off, count, count, count, RS_TYPE_SIGNED_32);
+                passed &= helperCopy3D<double>(rs, s, s, s, off, off, off, count, count, count, RS_TYPE_FLOAT_64);
+            }
+        }
+
+        for (int off = 0; off < s; off ++) {
+            for (int count = 1; count <= s - off; count ++) {
+                passed &= helperFloatAllocationCopy3D(rs, s, s, s, off, off, off, count, count, count);
+            }
+        }
+    }
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_test1DCopyPadded(JNIEnv * env,
+                                                                                               jclass obj,
+                                                                                               jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> rs = new RS();
+    rs->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+    bool passed = true;
+
+    for (int s = 8; s <= elemsToTest; s += 2) {
+        passed &= helperCopy1D<float>(rs, s, 0, s, false, RS_TYPE_FLOAT_32, true);
+        passed &= helperCopy1D<char>(rs, s, 0, s, false, RS_TYPE_SIGNED_8, true);
+        passed &= helperCopy1D<short>(rs, s, 0, s, false, RS_TYPE_SIGNED_16, true);
+        passed &= helperCopy1D<int>(rs, s, 0, s, false, RS_TYPE_SIGNED_32, true);
+        passed &= helperCopy1D<double>(rs, s, 0, s, false, RS_TYPE_FLOAT_64, true);
+
+        // now test copy range
+        for (int off = 0; off < s; off ++) {
+            for (int count = 1; count <= s - off; count ++) {
+                passed &= helperCopy1D<float>(rs, s, off, count, true, RS_TYPE_FLOAT_32, true);
+                passed &= helperCopy1D<char>(rs, s, off, count, true, RS_TYPE_SIGNED_8, true);
+                passed &= helperCopy1D<short>(rs, s, off, count, true, RS_TYPE_SIGNED_16, true);
+                passed &= helperCopy1D<int>(rs, s, off, count, true, RS_TYPE_SIGNED_32, true);
+                passed &= helperCopy1D<double>(rs, s, off, count, true, RS_TYPE_FLOAT_64, true);
+            }
+        }
+    }
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_test2DCopyPadded(JNIEnv * env,
+                                                                                               jclass obj,
+                                                                                               jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> rs = new RS();
+    rs->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+    bool passed = true;
+
+    for (int s = 8; s <= elemsToTest; s += 2) {
+        // now test copy range
+        for (int off = 0; off < s; off ++) {
+            for (int count = 1; count <= s - off; count ++) {
+                passed &= helperCopy2D<float>(rs, s, s, off, off, count, count, RS_TYPE_FLOAT_32, true);
+                passed &= helperCopy2D<char>(rs, s, s, off, off, count, count, RS_TYPE_SIGNED_8, true);
+                passed &= helperCopy2D<short>(rs, s, s, off, off, count, count, RS_TYPE_SIGNED_16, true);
+                passed &= helperCopy2D<int>(rs, s, s, off, off, count, count, RS_TYPE_SIGNED_32, true);
+                passed &= helperCopy2D<double>(rs, s, s, off, off, count, count, RS_TYPE_FLOAT_64, true);
+            }
+        }
+    }
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_test3DCopyPadded(JNIEnv * env,
+                                                                                               jclass obj,
+                                                                                               jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> rs = new RS();
+    rs->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+    bool passed = true;
+
+    for (int s = 8; s <= elemsToTest; s += 2) {
+        // now test copy range
+        for (int off = 0; off < s; off ++) {
+            for (int count = 1; count <= s - off; count ++) {
+                passed &= helperCopy3D<float>(rs, s, s, s, off, off, off, count, count, count,
+                                              RS_TYPE_FLOAT_32, true);
+                passed &= helperCopy3D<char>(rs, s, s, s, off, off, off, count, count, count,
+                                             RS_TYPE_SIGNED_8, true);
+                passed &= helperCopy3D<short>(rs, s, s, s, off, off, off, count, count, count,
+                                              RS_TYPE_SIGNED_16, true);
+                passed &= helperCopy3D<int>(rs, s, s, s, off, off, off, count, count, count,
+                                            RS_TYPE_SIGNED_32, true);
+                passed &= helperCopy3D<double>(rs, s, s, s, off, off, off, count, count, count,
+                                               RS_TYPE_FLOAT_64, true);
             }
         }
     }
@@ -358,19 +611,19 @@
                                                                                                jstring pathObj)
 {
     const char * path = env->GetStringUTFChars(pathObj, NULL);
-    sp<RS> mRS = new RS();
-    mRS->init(path);
+    sp<RS> rs = new RS();
+    rs->init(path);
     env->ReleaseStringUTFChars(pathObj, path);
 
     bool passed = true;
 
-    Type::Builder b(mRS, Element::I32(mRS));
+    Type::Builder b(rs, Element::I32(rs));
     b.setX(48);
-    sp<Allocation> largeArray = Allocation::createTyped(mRS, b.create());
+    sp<Allocation> largeArray = Allocation::createTyped(rs, b.create());
     b.setX(1);
-    sp<Allocation> singleElement = Allocation::createTyped(mRS, b.create());
+    sp<Allocation> singleElement = Allocation::createTyped(rs, b.create());
 
-    sp<ScriptC_setelementat> script = new ScriptC_setelementat(mRS);
+    sp<ScriptC_setelementat> script = new ScriptC_setelementat(rs);
 
     script->set_memset_toValue(1);
     script->forEach_memset(singleElement);
diff --git a/tests/tests/rscpp/librscpptest/rs_jni_element.cpp b/tests/tests/rscpp/librscpptest/rs_jni_element.cpp
new file mode 100644
index 0000000..033932b
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/rs_jni_element.cpp
@@ -0,0 +1,295 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#include <jni.h>
+#include <android/log.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <RenderScript.h>
+
+#define  LOG_TAG    "rscpptest"
+#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
+#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
+
+using namespace android::RSC;
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSElementTest_testCreatePixel(JNIEnv * env,
+                                                                                           jclass obj,
+                                                                                           jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+    passed &= (Element::createPixel(mRS,
+                                    RS_TYPE_UNSIGNED_8,
+                                    RS_KIND_PIXEL_A) != nullptr);
+    passed &= (Element::createPixel(mRS,
+                                    RS_TYPE_UNSIGNED_5_6_5,
+                                    RS_KIND_PIXEL_RGB) != nullptr);
+    passed &= (Element::createPixel(mRS,
+                                    RS_TYPE_UNSIGNED_8,
+                                    RS_KIND_PIXEL_RGB) != nullptr);
+    passed &= (Element::createPixel(mRS,
+                                    RS_TYPE_UNSIGNED_5_5_5_1,
+                                    RS_KIND_PIXEL_RGBA) != nullptr);
+    passed &= (Element::createPixel(mRS,
+                                    RS_TYPE_UNSIGNED_4_4_4_4,
+                                    RS_KIND_PIXEL_RGBA) != nullptr);
+    passed &= (Element::createPixel(mRS,
+                                    RS_TYPE_UNSIGNED_8,
+                                    RS_KIND_PIXEL_RGBA) != nullptr);
+
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSElementTest_testCreateVector(JNIEnv * env,
+                                                                                            jclass obj,
+                                                                                            jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+    for (int len = 2; len <= 4; len ++) {
+        passed &= (Element::createVector(mRS, RS_TYPE_FLOAT_32, len) != nullptr);
+        passed &= (Element::createVector(mRS, RS_TYPE_FLOAT_64, len) != nullptr);
+        passed &= (Element::createVector(mRS, RS_TYPE_SIGNED_8, len) != nullptr);
+        passed &= (Element::createVector(mRS, RS_TYPE_SIGNED_16, len) != nullptr);
+        passed &= (Element::createVector(mRS, RS_TYPE_SIGNED_32, len) != nullptr);
+        passed &= (Element::createVector(mRS, RS_TYPE_SIGNED_64, len) != nullptr);
+        passed &= (Element::createVector(mRS, RS_TYPE_UNSIGNED_8, len) != nullptr);
+        passed &= (Element::createVector(mRS, RS_TYPE_UNSIGNED_16, len) != nullptr);
+        passed &= (Element::createVector(mRS, RS_TYPE_UNSIGNED_32, len) != nullptr);
+        passed &= (Element::createVector(mRS, RS_TYPE_UNSIGNED_64, len) != nullptr);
+    }
+
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSElementTest_testPrebuiltElements(JNIEnv * env,
+                                                                                                jclass obj,
+                                                                                                jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+    passed &= (Element::A_8(mRS) != nullptr);
+    passed &= (Element::RGBA_4444(mRS) != nullptr);
+    passed &= (Element::RGBA_5551(mRS) != nullptr);
+    passed &= (Element::RGB_565(mRS) != nullptr);
+    passed &= (Element::RGB_888(mRS) != nullptr);
+    passed &= (Element::RGBA_8888(mRS) != nullptr);
+    passed &= (Element::F32(mRS) != nullptr);
+    passed &= (Element::F32_2(mRS) != nullptr);
+    passed &= (Element::F32_3(mRS) != nullptr);
+    passed &= (Element::F32_4(mRS) != nullptr);
+    passed &= (Element::F64(mRS) != nullptr);
+    passed &= (Element::F64_2(mRS) != nullptr);
+    passed &= (Element::F64_3(mRS) != nullptr);
+    passed &= (Element::F64_4(mRS) != nullptr);
+    passed &= (Element::I8(mRS) != nullptr);
+    passed &= (Element::I8_2(mRS) != nullptr);
+    passed &= (Element::I8_3(mRS) != nullptr);
+    passed &= (Element::I8_4(mRS) != nullptr);
+    passed &= (Element::I16(mRS) != nullptr);
+    passed &= (Element::I16_2(mRS) != nullptr);
+    passed &= (Element::I16_3(mRS) != nullptr);
+    passed &= (Element::I16_4(mRS) != nullptr);
+    passed &= (Element::I32(mRS) != nullptr);
+    passed &= (Element::I32_2(mRS) != nullptr);
+    passed &= (Element::I32_3(mRS) != nullptr);
+    passed &= (Element::I32_4(mRS) != nullptr);
+    passed &= (Element::I64(mRS) != nullptr);
+    passed &= (Element::I64_2(mRS) != nullptr);
+    passed &= (Element::I64_3(mRS) != nullptr);
+    passed &= (Element::I64_4(mRS) != nullptr);
+    passed &= (Element::U8(mRS) != nullptr);
+    passed &= (Element::U8_2(mRS) != nullptr);
+    passed &= (Element::U8_3(mRS) != nullptr);
+    passed &= (Element::U8_4(mRS) != nullptr);
+    passed &= (Element::U16(mRS) != nullptr);
+    passed &= (Element::U16_2(mRS) != nullptr);
+    passed &= (Element::U16_3(mRS) != nullptr);
+    passed &= (Element::U16_4(mRS) != nullptr);
+    passed &= (Element::U32(mRS) != nullptr);
+    passed &= (Element::U32_2(mRS) != nullptr);
+    passed &= (Element::U32_3(mRS) != nullptr);
+    passed &= (Element::U32_4(mRS) != nullptr);
+    passed &= (Element::U64(mRS) != nullptr);
+    passed &= (Element::U64_2(mRS) != nullptr);
+    passed &= (Element::U64_3(mRS) != nullptr);
+    passed &= (Element::U64_4(mRS) != nullptr);
+    passed &= (Element::MATRIX_2X2(mRS) != nullptr);
+    passed &= (Element::MATRIX_3X3(mRS) != nullptr);
+    passed &= (Element::MATRIX_4X4(mRS) != nullptr);
+    passed &= (Element::ALLOCATION(mRS) != nullptr);
+    passed &= (Element::SAMPLER(mRS) != nullptr);
+    passed &= (Element::SCRIPT(mRS) != nullptr);
+    passed &= (Element::TYPE(mRS) != nullptr);
+    passed &= (Element::BOOLEAN(mRS) != nullptr);
+    passed &= (Element::ELEMENT(mRS) != nullptr);
+
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSElementTest_testIsCompatible(JNIEnv * env,
+                                                                                            jclass obj,
+                                                                                            jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+    sp<const Element> ALLOCATION = Element::ALLOCATION(mRS);
+    // A_8 is in U8
+    sp<const Element> BOOLEAN = Element::BOOLEAN(mRS);
+    sp<const Element> ELEMENT = Element::ELEMENT(mRS);
+    sp<const Element> F32 = Element::F32(mRS);
+    sp<const Element> F32_2 = Element::F32_2(mRS);
+    sp<const Element> F32_3 = Element::F32_3(mRS);
+    sp<const Element> F32_4 = Element::F32_4(mRS);
+    sp<const Element> F64 = Element::F64(mRS);
+    sp<const Element> I16 = Element::I16(mRS);
+    sp<const Element> I32 = Element::I32(mRS);
+    sp<const Element> I64 = Element::I64(mRS);
+    sp<const Element> I8 = Element::I8(mRS);
+    // MATRIX4X4 is in MATRIX_4X4
+    sp<const Element> MATRIX_2X2 = Element::MATRIX_2X2(mRS);
+    sp<const Element> MATRIX_3X3 = Element::MATRIX_3X3(mRS);
+    sp<const Element> MATRIX_4X4 = Element::MATRIX_4X4(mRS);
+
+    sp<const Element> RGBA_4444 = Element::RGBA_4444(mRS);
+    sp<const Element> RGBA_5551 = Element::RGBA_5551(mRS);
+    // RGBA_8888 is in U8_4
+    sp<const Element> RGB_565 = Element::RGB_565(mRS);
+    // RGB_888 is in U8_3
+    sp<const Element> SAMPLER = Element::SAMPLER(mRS);
+    sp<const Element> SCRIPT = Element::SCRIPT(mRS);
+    sp<const Element> TYPE = Element::TYPE(mRS);
+    sp<const Element> U16 = Element::U16(mRS);
+    sp<const Element> U32 = Element::U32(mRS);
+    sp<const Element> U64 = Element::U64(mRS);
+    sp<const Element> U8 = Element::A_8(mRS);
+    sp<const Element> U8_3 = Element::RGB_888(mRS);
+    sp<const Element> U8_4 = Element::U8_4(mRS);
+
+    int numTypes = 27;
+    sp<const Element> ElementArrs[] = { ALLOCATION, BOOLEAN, ELEMENT, F32, F32_2,
+                                      F32_3, F32_4, F64, I16, I32, I64, I8,
+                                      MATRIX_2X2, MATRIX_3X3, MATRIX_4X4, RGBA_4444,
+                                      RGBA_5551, RGB_565, SAMPLER, SCRIPT, TYPE,
+                                      U16, U32, U64, U8, U8_3, U8_4 };
+
+    for (int i = 0; i < numTypes; i++) {
+        for (int j = 0; j < numTypes; j++) {
+            if (i == j) {
+                // Elements within a group are compatible
+                passed &= (ElementArrs[i]->isCompatible(ElementArrs[j]));
+            } else {
+                // Elements from different groups are incompatible
+                passed &= !(ElementArrs[i]->isCompatible(ElementArrs[j]));
+            }
+        }
+    }
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSElementTest_testElementBuilder(JNIEnv * env,
+                                                                                              jclass obj,
+                                                                                              jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+    for (int arraySize = 1; arraySize <= 3; arraySize++) {
+        // Now test array size
+        Element::Builder *eb = new Element::Builder(mRS);
+        eb->add(Element::A_8(mRS), "A_8", arraySize);
+        eb->add(Element::RGBA_4444(mRS), "RGBA_4444", arraySize);
+        eb->add(Element::RGBA_5551(mRS), "RGBA_5551", arraySize);
+        eb->add(Element::RGB_565(mRS), "RGB_565", arraySize);
+        eb->add(Element::RGB_888(mRS), "RGB_888", arraySize);
+        eb->add(Element::RGBA_8888(mRS), "RGBA_8888", arraySize);
+        eb->add(Element::F32(mRS), "F32", arraySize);
+        eb->add(Element::F32_2(mRS), "F32_2", arraySize);
+        eb->add(Element::F32_3(mRS), "F32_3", arraySize);
+        eb->add(Element::F32_4(mRS), "F32_4", arraySize);
+        eb->add(Element::F64(mRS), "F64", arraySize);
+        eb->add(Element::F64_2(mRS), "F64_2", arraySize);
+        eb->add(Element::F64_3(mRS), "F64_3", arraySize);
+        eb->add(Element::F64_4(mRS), "F64_4", arraySize);
+        eb->add(Element::I8(mRS), "I8", arraySize);
+        eb->add(Element::I8_2(mRS), "I8_2", arraySize);
+        eb->add(Element::I8_3(mRS), "I8_3", arraySize);
+        eb->add(Element::I8_4(mRS), "I8_4", arraySize);
+        eb->add(Element::I16(mRS), "I16", arraySize);
+        eb->add(Element::I16_2(mRS), "I16_2", arraySize);
+        eb->add(Element::I16_3(mRS), "I16_3", arraySize);
+        eb->add(Element::I16_4(mRS), "I16_4", arraySize);
+        eb->add(Element::I32(mRS), "I32", arraySize);
+        eb->add(Element::I32_2(mRS), "I32_2", arraySize);
+        eb->add(Element::I32_3(mRS), "I32_3", arraySize);
+        eb->add(Element::I32_4(mRS), "I32_4", arraySize);
+        eb->add(Element::I64(mRS), "I64", arraySize);
+        eb->add(Element::I64_2(mRS), "I64_2", arraySize);
+        eb->add(Element::I64_3(mRS), "I64_3", arraySize);
+        eb->add(Element::I64_4(mRS), "I64_4", arraySize);
+        eb->add(Element::U8(mRS), "U8", arraySize);
+        eb->add(Element::U8_2(mRS), "U8_2", arraySize);
+        eb->add(Element::U8_3(mRS), "U8_3", arraySize);
+        eb->add(Element::U8_4(mRS), "U8_4", arraySize);
+        eb->add(Element::U16(mRS), "U16", arraySize);
+        eb->add(Element::U16_2(mRS), "U16_2", arraySize);
+        eb->add(Element::U16_3(mRS), "U16_3", arraySize);
+        eb->add(Element::U16_4(mRS), "U16_4", arraySize);
+        eb->add(Element::U32(mRS), "U32", arraySize);
+        eb->add(Element::U32_2(mRS), "U32_2", arraySize);
+        eb->add(Element::U32_3(mRS), "U32_3", arraySize);
+        eb->add(Element::U32_4(mRS), "U32_4", arraySize);
+        eb->add(Element::U64(mRS), "U64", arraySize);
+        eb->add(Element::U64_2(mRS), "U64_2", arraySize);
+        eb->add(Element::U64_3(mRS), "U64_3", arraySize);
+        eb->add(Element::U64_4(mRS), "U64_4", arraySize);
+        eb->add(Element::MATRIX_2X2(mRS), "MATRIX_2X2", arraySize);
+        eb->add(Element::MATRIX_3X3(mRS), "MATRIX_3X3", arraySize);
+        eb->add(Element::MATRIX_4X4(mRS), "MATRIX_4X4", arraySize);
+        eb->add(Element::ALLOCATION(mRS), "ALLOCATION", arraySize);
+        eb->add(Element::SAMPLER(mRS), "SAMPLER", arraySize);
+        eb->add(Element::SCRIPT(mRS), "SCRIPT", arraySize);
+        eb->add(Element::TYPE(mRS), "TYPE", arraySize);
+        eb->add(Element::BOOLEAN(mRS), "BOOLEAN", arraySize);
+        eb->add(Element::ELEMENT(mRS), "ELEMENT", arraySize);
+        passed &= (eb->create() != nullptr);
+    }
+    return passed;
+}
+
diff --git a/tests/tests/rscpp/librscpptest/rs_jni_foreach.cpp b/tests/tests/rscpp/librscpptest/rs_jni_foreach.cpp
new file mode 100644
index 0000000..c0c0a13
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/rs_jni_foreach.cpp
@@ -0,0 +1,344 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#include <jni.h>
+#include <android/log.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <RenderScript.h>
+
+#define  LOG_TAG    "rscpptest"
+#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
+#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
+
+#include "ScriptC_foreach.h"
+#include "ScriptC_fe_all.h"
+#include "ScriptC_noroot.h"
+
+using namespace android::RSC;
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSForEachTest_testForEach(JNIEnv * env,
+                                                                                       jclass obj,
+                                                                                       jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+    int x = 7;
+
+    sp<ScriptC_fe_all> fe_all = new ScriptC_fe_all(mRS);
+    sp<const Type> t = Type::create(mRS, Element::I8(mRS), x, 0, 0);
+
+    // I8
+    sp<Allocation> in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U8(mRS), x, 0, 0);
+    sp<Allocation> out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i8(in, out);
+    mRS->finish();
+
+    // I8_2
+    t = Type::create(mRS, Element::I8_2(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U8_2(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i8_2(in, out);
+    mRS->finish();
+
+    // I8_3
+    t = Type::create(mRS, Element::I8_3(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U8_3(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i8_3(in, out);
+    mRS->finish();
+
+    // I8_4
+    t = Type::create(mRS, Element::I8_4(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U8_4(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i8_4(in, out);
+    mRS->finish();
+
+    // I16
+    t = Type::create(mRS, Element::I16(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U16(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i16(in, out);
+    mRS->finish();
+
+    // I16_2
+    t = Type::create(mRS, Element::I16_2(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U16_2(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i16_2(in, out);
+    mRS->finish();
+
+    // I16_3
+    t = Type::create(mRS, Element::I16_3(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U16_3(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i16_3(in, out);
+    mRS->finish();
+
+    // I16_4
+    t = Type::create(mRS, Element::I16_4(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U16_4(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i16_4(in, out);
+    mRS->finish();
+
+    // I32
+    t = Type::create(mRS, Element::I32(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U32(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i32(in, out);
+    mRS->finish();
+
+    // I32_2
+    t = Type::create(mRS, Element::I32_2(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U32_2(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i32_2(in, out);
+    mRS->finish();
+
+    // I32_3
+    t = Type::create(mRS, Element::I32_3(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U32_3(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i32_3(in, out);
+    mRS->finish();
+
+    // I32_4
+    t = Type::create(mRS, Element::I32_4(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U32_4(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i32_4(in, out);
+    mRS->finish();
+
+    // I64
+    t = Type::create(mRS, Element::I64(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U64(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i64(in, out);
+    mRS->finish();
+
+    // I64_2
+    t = Type::create(mRS, Element::I64_2(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U64_2(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i64_2(in, out);
+    mRS->finish();
+
+    // I64_3
+    t = Type::create(mRS, Element::I64_3(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U64_3(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i64_3(in, out);
+    mRS->finish();
+
+    // I64_4
+    t = Type::create(mRS, Element::I64_4(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::U64_4(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i64_4(in, out);
+    mRS->finish();
+
+    // F32
+    t = Type::create(mRS, Element::F32(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_f32(in, out);
+    mRS->finish();
+
+    // F32_2
+    t = Type::create(mRS, Element::F32_2(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::F32_2(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_f32_2(in, out);
+    mRS->finish();
+
+    // F32_3
+    t = Type::create(mRS, Element::F32_3(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_f32_3(in, out);
+    mRS->finish();
+
+    // F32_4
+    t = Type::create(mRS, Element::F32_4(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_f32_4(in, out);
+    mRS->finish();
+
+    // F64
+    t = Type::create(mRS, Element::F64(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_f64(in, out);
+    mRS->finish();
+
+    // F64_2
+    t = Type::create(mRS, Element::F64_2(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_f64_2(in, out);
+    mRS->finish();
+
+    // F64_3
+    t = Type::create(mRS, Element::F64_3(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_f64_3(in, out);
+    mRS->finish();
+
+    // F64_4
+    t = Type::create(mRS, Element::F64_4(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_f64_4(in, out);
+    mRS->finish();
+
+    // BOOLEAN
+    t = Type::create(mRS, Element::BOOLEAN(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_bool(in, out);
+    mRS->finish();
+
+    // A_8
+    t = Type::create(mRS, Element::I8(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::A_8(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i8(in, out);
+    mRS->finish();
+
+    // RGBA_8888
+    t = Type::create(mRS, Element::I8_4(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::RGBA_8888(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i8_4(in, out);
+    mRS->finish();
+
+    // RGB_888
+    t = Type::create(mRS, Element::I8_3(mRS), x, 0, 0);
+    in = Allocation::createTyped(mRS, t);
+    t = Type::create(mRS, Element::RGB_888(mRS), x, 0, 0);
+    out = Allocation::createTyped(mRS, t);
+    fe_all->forEach_test_i8_3(in, out);
+    mRS->finish();
+
+    return passed;
+}
+
+#define RS_MSG_TEST_PASSED 100
+#define RS_MSG_TEST_FAILED 101
+
+static int result = 0;
+static void rsMsgHandler(uint32_t msgNum, const void *msgData, size_t msgLen) {
+    if (result == 0) {
+        result = msgNum;
+    }
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSForEachTest_testMultipleForEach(JNIEnv * env,
+                                                                                               jclass obj,
+                                                                                               jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+    MessageHandlerFunc_t mHandler = rsMsgHandler;
+    mRS->setMessageHandler(mHandler);
+
+    bool passed = true;
+    sp<ScriptC_foreach> s = new ScriptC_foreach(mRS);
+
+    int X = 5;
+    int Y = 7;
+    s->set_dimX(X);
+    s->set_dimY(Y);
+    sp<const Type> t = Type::create(mRS, Element::I32(mRS), X, Y, 0);
+    sp<Allocation> A = Allocation::createTyped(mRS, t);
+    s->set_aRaw(A);
+    s->forEach_root(A);
+    s->invoke_verify_root();
+    s->forEach_foo(A, A);
+    s->invoke_verify_foo();
+    s->invoke_foreach_test();
+    mRS->finish();
+    if (result == RS_MSG_TEST_FAILED) {
+        passed = false;
+    }
+    result = 0;
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSForEachTest_testNoRoot(JNIEnv * env,
+                                                                                      jclass obj,
+                                                                                      jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, NULL);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+    MessageHandlerFunc_t mHandler = rsMsgHandler;
+    mRS->setMessageHandler(mHandler);
+
+    bool passed = true;
+    sp<ScriptC_noroot> s = new ScriptC_noroot(mRS);
+
+    int X = 5;
+    int Y = 7;
+    s->set_dimX(X);
+    s->set_dimY(Y);
+    sp<const Type> t = Type::create(mRS, Element::I32(mRS), X, Y, 0);
+    sp<Allocation> A = Allocation::createTyped(mRS, t);
+    s->set_aRaw(A);
+    s->forEach_foo(A, A);
+    s->invoke_verify_foo();
+    s->invoke_noroot_test();
+    mRS->finish();
+    if (result == RS_MSG_TEST_FAILED) {
+        passed = false;
+    }
+    result = 0;
+    return passed;
+}
+
diff --git a/tests/tests/rscpp/librscpptest/rs_jni_object.cpp b/tests/tests/rscpp/librscpptest/rs_jni_object.cpp
new file mode 100644
index 0000000..a530ef9
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/rs_jni_object.cpp
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#include <jni.h>
+#include <android/log.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <RenderScript.h>
+
+#define  LOG_TAG    "rscpptest"
+#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
+#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
+
+#include <ScriptC_clear_object.h>
+
+using namespace android::RSC;
+
+#define ObjectNum 1
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSObjectTest_testClearObjectElement(JNIEnv * env,
+                                                                                                 jclass obj,
+                                                                                                 jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+
+    sp<ScriptC_clear_object> ms_clear = new ScriptC_clear_object(mRS);
+
+    sp<const Element> element = Element::BOOLEAN(mRS);
+    sp<Allocation> mOut = Allocation::createSized(mRS, Element::I32(mRS), ObjectNum);
+    ms_clear->set_element(element);
+    ms_clear->forEach_clear_element(mOut);
+
+    int tmpArray[ObjectNum];
+    mOut->copy1DTo(tmpArray);
+
+    for(int i = 0; i < ObjectNum; i++) {
+        passed &= (tmpArray[i] == 1);
+    }
+
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSObjectTest_testClearObjectType(JNIEnv * env,
+                                                                                        jclass obj,
+                                                                                        jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+
+    sp<ScriptC_clear_object> ms_clear = new ScriptC_clear_object(mRS);
+
+    sp<const Type> type= Type::create(mRS, Element::I8(mRS), 1, 0, 0);
+    sp<Allocation> mOut = Allocation::createSized(mRS, Element::I32(mRS), ObjectNum);
+    ms_clear->set_type(type);
+    ms_clear->forEach_clear_type(mOut);
+
+    int tmpArray[ObjectNum];
+    mOut->copy1DTo(tmpArray);
+
+    for(int i = 0; i < ObjectNum; i++) {
+        passed &= (tmpArray[i] == 1);
+    }
+
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSObjectTest_testClearObjectAllocation(JNIEnv * env,
+                                                                                        jclass obj,
+                                                                                        jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+
+    sp<ScriptC_clear_object> ms_clear = new ScriptC_clear_object(mRS);
+
+    sp<Allocation> mOut = Allocation::createSized(mRS, Element::I32(mRS), ObjectNum);
+    sp<Allocation> mIn = Allocation::createSized(mRS, Element::I32(mRS), ObjectNum);
+    sp<Allocation> allocation = Allocation::createTyped(mRS, mIn->getType());
+    ms_clear->set_allocation(allocation);
+    ms_clear->forEach_clear_allocation(mOut);
+
+    int tmpArray[ObjectNum];
+    mOut->copy1DTo(tmpArray);
+
+    for(int i = 0; i < ObjectNum; i++) {
+        passed &= (tmpArray[i] == 1);
+    }
+
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSObjectTest_testClearObjectSampler(JNIEnv * env,
+                                                                                        jclass obj,
+                                                                                        jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+
+    sp<ScriptC_clear_object> ms_clear = new ScriptC_clear_object(mRS);
+
+    sp<Sampler> sampler = Sampler::create(mRS, RS_SAMPLER_NEAREST, RS_SAMPLER_NEAREST,
+                                          RS_SAMPLER_WRAP, RS_SAMPLER_WRAP, 1.0f);
+    sp<Allocation> mOut = Allocation::createSized(mRS, Element::I32(mRS), ObjectNum);
+    ms_clear->set_sampler(sampler);
+    ms_clear->forEach_clear_sampler(mOut);
+
+    int tmpArray[ObjectNum];
+    mOut->copy1DTo(tmpArray);
+
+    for(int i = 0; i < ObjectNum; i++) {
+        passed &= (tmpArray[i] == 1);
+    }
+
+
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSObjectTest_testClearObjectScript(JNIEnv * env,
+                                                                                        jclass obj,
+                                                                                        jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+
+    sp<ScriptC_clear_object> ms_clear = new ScriptC_clear_object(mRS);
+
+    sp<Script> script = new ScriptC_clear_object(mRS);
+    sp<Allocation> mOut = Allocation::createSized(mRS, Element::I32(mRS), ObjectNum);
+    ms_clear->set_script(script);
+    ms_clear->forEach_clear_script(mOut);
+
+    int tmpArray[ObjectNum];
+    mOut->copy1DTo(tmpArray);
+
+    for(int i = 0; i < ObjectNum; i++) {
+        passed &= (tmpArray[i] == 1);
+    }
+
+    return passed;
+}
diff --git a/tests/tests/rscpp/librscpptest/rs_jni_script.cpp b/tests/tests/rscpp/librscpptest/rs_jni_script.cpp
new file mode 100644
index 0000000..1888341
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/rs_jni_script.cpp
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#include <jni.h>
+#include <android/log.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <RenderScript.h>
+
+#define  LOG_TAG    "rscpptest"
+#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
+#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
+
+#include <ScriptC_primitives.h>
+#include <ScriptC_instance.h>
+#include <ScriptC_vector.h>
+
+using namespace android::RSC;
+
+#define RS_MSG_TEST_PASSED 100
+#define RS_MSG_TEST_FAILED 101
+
+static int result = 0;
+static void rsMsgHandler(uint32_t msgNum, const void *msgData, size_t msgLen) {
+    if (result == 0) {
+        result = msgNum;
+    }
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSScriptTest_testSet(JNIEnv * env,
+                                                                                  jclass obj,
+                                                                                  jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+    MessageHandlerFunc_t mHandler = rsMsgHandler;
+    mRS->setMessageHandler(mHandler);
+
+    bool passed = true;
+
+    sp<const Type> t = Type::create(mRS, Element::I32(mRS), 8, 0, 0);
+    sp<Allocation> alloc = Allocation::createTyped(mRS, t);
+
+    sp<ScriptC_primitives> script = new ScriptC_primitives(mRS);
+    script->set_floatTest(2.99f);  // floatTest
+    script->set_doubleTest(3.05);  // doubleTest
+    script->set_charTest(-16);  // charTest
+    script->set_shortTest(-32);  // shortTest
+    script->set_intTest(-64);  // intTest
+    script->set_longTest(17179869185l);  // longTest
+    script->set_longlongTest(68719476735L); //longlongTest
+    script->set_ulongTest(4611686018427387903L);  // boolTest
+    script->set_uint64_tTest(117179869185l); //uint64_tTest
+    script->set_allocationTest(alloc);  // allocationTest
+    
+    script->invoke_test_primitive_types();
+    mRS->finish();
+    if (result == RS_MSG_TEST_FAILED) {
+        passed = false;
+    }
+
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSScriptTest_testInstance(JNIEnv * env,
+                                                                                       jclass obj,
+                                                                                       jstring pathObj)
+{
+    /**
+     * Test script instancing.
+     */
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+    MessageHandlerFunc_t mHandler = rsMsgHandler;
+    mRS->setMessageHandler(mHandler);
+
+    bool passed = true;
+
+    sp<const Type> t = Type::create(mRS, Element::I32(mRS), 1, 0, 0);
+    sp<Allocation> ai1 = Allocation::createTyped(mRS, t);
+    sp<Allocation> ai2 = Allocation::createTyped(mRS, t);
+    sp<ScriptC_instance> instance_1 = new ScriptC_instance(mRS);
+    sp<ScriptC_instance> instance_2 = new ScriptC_instance(mRS);
+
+    instance_1->set_i(1);
+    instance_2->set_i(2);
+    instance_1->set_ai(ai1);
+    instance_2->set_ai(ai2);
+
+    // We now check to ensure that the global is not being shared across
+    // our separate script instances. Our invoke here merely sets the
+    // instanced allocation with the instanced global variable's value.
+    // If globals are being shared (i.e. not instancing scripts), then
+    // both instanced allocations will have the same resulting value
+    // (depending on the order in which the invokes complete).
+    instance_1->invoke_instance_test();
+    instance_2->invoke_instance_test();
+
+    int i1[1];
+    int i2[1];
+
+    ai1->copy1DTo(i1);
+    ai2->copy1DTo(i2);
+
+    // 3-step check ensures that a fortunate race condition wouldn't let us
+    // pass accidentally.
+    passed &= (2 == i2[0]);
+    passed &= (1 == i1[0]);
+    passed &= (2 == i2[0]);
+    mRS->finish();
+    if (result == RS_MSG_TEST_FAILED) {
+        passed = false;
+    }
+
+    return passed;
+}
+
+// Define some reasonable types for use with the vector invoke testing.
+typedef unsigned char uchar;
+typedef unsigned short ushort;
+typedef unsigned int uint;
+typedef unsigned long ulong;
+
+#define TEST_VECTOR_INVOKE(L, U) \
+L temp_##L = 0; \
+vector->invoke_vector_test_##L(temp_##L); \
+U##2 temp_##L##2; \
+vector->invoke_vector_test_##L##2(temp_##L##2); \
+U##3 temp_##L##3; \
+vector->invoke_vector_test_##L##3(temp_##L##3); \
+U##4 temp_##L##4; \
+vector->invoke_vector_test_##L##4(temp_##L##4);
+
+
+/*
+ * Test that vector invoke C++ reflection is working/present.
+ */
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSScriptTest_testVector(JNIEnv * env,
+                                                                                     jclass obj,
+                                                                                     jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+    MessageHandlerFunc_t mHandler = rsMsgHandler;
+    mRS->setMessageHandler(mHandler);
+
+    bool passed = true;
+    sp<ScriptC_vector> vector = new ScriptC_vector(mRS);
+
+    TEST_VECTOR_INVOKE(float, Float)
+    TEST_VECTOR_INVOKE(double, Double)
+    TEST_VECTOR_INVOKE(char, Byte)
+    TEST_VECTOR_INVOKE(uchar, UByte)
+    TEST_VECTOR_INVOKE(short, Short)
+    TEST_VECTOR_INVOKE(ushort, UShort)
+    TEST_VECTOR_INVOKE(int, Int)
+    TEST_VECTOR_INVOKE(uint, UInt)
+    TEST_VECTOR_INVOKE(long, Long)
+    TEST_VECTOR_INVOKE(ulong, ULong)
+
+    return passed;
+}
diff --git a/tests/tests/rscpp/librscpptest/rs_jni_type.cpp b/tests/tests/rscpp/librscpptest/rs_jni_type.cpp
new file mode 100644
index 0000000..5458a25
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/rs_jni_type.cpp
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#include <jni.h>
+#include <android/log.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <RenderScript.h>
+
+#define  LOG_TAG    "rscpptest"
+#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
+#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
+
+#include <ScriptC_primitives.h>
+#include <ScriptC_instance.h>
+
+using namespace android::RSC;
+
+static bool testTypeBuilderHelper(sp<RS> mRS, sp<const Element> e) {
+    const int min = 1;
+    const int max = 8;
+
+    Type::Builder b(mRS, e);
+    bool result = true;
+    for (int mips = 0; mips <= 1; mips ++) {
+        bool useMips = (mips == 1);
+        for (int faces = 0; faces <= 1; faces++) {
+            bool useFaces = (faces == 1);
+
+            b.setMipmaps(useMips);
+            b.setFaces(useFaces);
+            for (int x = min; x < max; x ++) {
+                for (int y = min; y < max; y ++) {
+                    b.setX(x);
+                    b.setY(y);
+                    result &= (b.create() != nullptr);
+                }
+            }
+        }
+    }
+    return result;
+}
+
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSTypeTest_testCreate(JNIEnv * env,
+                                                                                   jclass obj,
+                                                                                   jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+
+    passed &= testTypeBuilderHelper(mRS, Element::A_8(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::RGB_565(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::RGB_888(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::RGBA_8888(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::F32(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::F32_2(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::F32_3(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::F32_4(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::BOOLEAN(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::F64(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::I8(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::I16(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::I32(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::I64(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::U8(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::U8_4(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::U16(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::U32(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::U64(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::MATRIX_2X2(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::MATRIX_3X3(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::MATRIX_4X4(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::ALLOCATION(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::SAMPLER(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::SCRIPT(mRS));
+    passed &= testTypeBuilderHelper(mRS, Element::TYPE(mRS));
+
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSTypeTest_testGetCount(JNIEnv * env,
+                                                                                     jclass obj,
+                                                                                     jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+
+    Type::Builder b(mRS, Element::F32(mRS));
+    for (int faces = 0; faces <= 1; faces++) {
+        bool useFaces = (faces == 1);
+        uint32_t faceMultiplier = useFaces ? 6 : 1;
+        for (int x = 1; x < 8; x ++) {
+            for (int y = 1; y < 8; y ++) {
+                b.setFaces(useFaces);
+                b.setX(x);
+                b.setY(y);
+                sp<const Type> t = b.create();
+                passed &= (t->getCount() == x * y * faceMultiplier);
+            }
+        }
+    }
+
+    // Test mipmaps
+    b.setFaces(false);
+    b.setMipmaps(true);
+    b.setX(8);
+    b.setY(1);
+    sp<const Type> t = b.create();
+
+    size_t expectedCount = 8 + 4 + 2 + 1;
+    passed &= (t->getCount() == expectedCount);
+
+    b.setX(8);
+    b.setY(8);
+    t = b.create();
+    expectedCount = 8*8 + 4*4 + 2*2 + 1;
+    passed &= (t->getCount() == expectedCount);
+
+    b.setX(8);
+    b.setY(4);
+    t = b.create();
+    expectedCount = 8*4 + 4*2 + 2*1 + 1;
+    passed &= (t->getCount() == expectedCount);
+
+    b.setX(4);
+    b.setY(8);
+    t = b.create();
+    passed &= (t->getCount() == expectedCount);
+
+    b.setX(7);
+    b.setY(1);
+    t = b.create();
+    expectedCount = 7 + 3 + 1;
+    passed &= (t->getCount() == expectedCount);
+
+    b.setX(7);
+    b.setY(3);
+    t = b.create();
+    expectedCount = 7*3 + 3*1 + 1;
+    passed &= (t->getCount() == expectedCount);
+    return passed;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSTypeTest_testGet(JNIEnv * env,
+                                                                                jclass obj,
+                                                                                jstring pathObj)
+{
+    const char * path = env->GetStringUTFChars(pathObj, nullptr);
+    sp<RS> mRS = new RS();
+    mRS->init(path);
+    env->ReleaseStringUTFChars(pathObj, path);
+
+    bool passed = true;
+
+    sp<const Type> t = Type::create(mRS, Element::F32(mRS), 3, 4, 0);
+    passed &= (t->getElement() == Element::F32(mRS));
+    passed &= (t->getX() == 3);
+    passed &= (t->getY() == 4);
+    passed &= (t->getZ() == 0);
+
+    Type::Builder b(mRS, Element::F32(mRS));
+    b.setX(4);
+    b.setY(4);
+    b.setFaces(true);
+    passed &= (b.create()->hasFaces());
+    b.setFaces(false);
+    passed &= !(b.create()->hasFaces());
+    b.setMipmaps(true);
+    passed &= (b.create()->hasMipmaps());
+    b.setMipmaps(false);
+    passed &= !(b.create()->hasMipmaps());
+
+    return passed;
+}
+
+
+
diff --git a/tests/tests/rscpp/librscpptest/shared.rsh b/tests/tests/rscpp/librscpptest/shared.rsh
new file mode 100644
index 0000000..c5599d7
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/shared.rsh
@@ -0,0 +1,26 @@
+#pragma version(1)
+#pragma rs java_package_name(com.android.cts.rscpp)
+
+static int64_t g_time;
+
+static inline void start(void) {
+    g_time = rsUptimeMillis();
+}
+
+static inline float end(void) {
+    int64_t t = rsUptimeMillis() - g_time;
+    return ((float)t) / 1000.f;
+}
+
+#define _RS_ASSERT(b) \
+do { \
+    if (!(b)) { \
+        failed = true; \
+        rsDebug(#b " FAILED", 0); \
+    } \
+\
+} while (0)
+
+/* These constants must match those in UnitTest.java */
+static const int RS_MSG_TEST_PASSED = 100;
+static const int RS_MSG_TEST_FAILED = 101;
diff --git a/tests/tests/rscpp/librscpptest/vector.rs b/tests/tests/rscpp/librscpptest/vector.rs
new file mode 100644
index 0000000..cdea9b8
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/vector.rs
@@ -0,0 +1,19 @@
+#include "shared.rsh"
+
+#define MAKE_TEST(T) \
+void vector_test_##T(T t) {} \
+void vector_test_##T##2(T##2 t) {} \
+void vector_test_##T##3(T##3 t) {} \
+void vector_test_##T##4(T##4 t) {} \
+
+MAKE_TEST(float)
+MAKE_TEST(double)
+MAKE_TEST(char)
+MAKE_TEST(uchar)
+MAKE_TEST(short)
+MAKE_TEST(ushort)
+MAKE_TEST(int)
+MAKE_TEST(uint)
+MAKE_TEST(long)
+MAKE_TEST(ulong)
+
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java
index 76dbfee..012e731 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java
@@ -33,14 +33,39 @@
     }
 
     native boolean test1DCopy(String path);
-    public void testRSAllocationCopy() {
+    public void testRSAllocationCopy1D() {
         assertTrue(test1DCopy(this.getContext().getCacheDir().toString()));
     }
 
+    native boolean test2DCopy(String path);
+    public void testRSAllocationCopy2D() {
+        assertTrue(test2DCopy(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean test3DCopy(String path);
+    public void testRSAllocationCopy3D() {
+        assertTrue(test3DCopy(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean test1DCopyPadded(String path);
+    public void testRSAllocationCopy1DPadded() {
+        assertTrue(test1DCopyPadded(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean test2DCopyPadded(String path);
+    public void testRSAllocationCopy2DPadded() {
+        assertTrue(test2DCopyPadded(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean test3DCopyPadded(String path);
+    public void testRSAllocationCopy3DPadded() {
+        assertTrue(test3DCopyPadded(this.getContext().getCacheDir().toString()));
+    }
+
     native boolean testSetElementAt(String path);
     public void testRSAllocationSetElementAt() {
         assertTrue(testSetElementAt(this.getContext().getCacheDir().toString()));
     }
 
 
-}
\ No newline at end of file
+}
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSCppTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSCppTest.java
index 9b09cc7..0b308cb 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSCppTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSCppTest.java
@@ -25,6 +25,7 @@
 import android.renderscript.RenderScript;
 import android.renderscript.Allocation;
 import android.renderscript.Element;
+import android.renderscript.Type;
 import android.util.Log;
 
 public class RSCppTest extends AndroidTestCase {
@@ -73,6 +74,29 @@
         }
     };
 
+    protected Element makeElement(Element.DataType dt, int vecSize) {
+        Element e;
+        if (vecSize > 1) {
+            e = Element.createVector(mRS, dt, vecSize);
+        } else {
+            if (dt == Element.DataType.UNSIGNED_8) {
+                e = Element.U8(mRS);
+            } else {
+                e = Element.F32(mRS);
+            }
+        }
+        return e;
+    }
+
+    protected Allocation makeAllocation(int w, int h, Element e) {
+        Type.Builder tb = new Type.Builder(mRS, e);
+        tb.setX(w);
+        tb.setY(h);
+        Type t = tb.create();
+        Allocation a = Allocation.createTyped(mRS, t);
+        return a;
+    }
+
     protected void checkForErrors() {
         mRS.finish();
         mVerify.invoke_checkError();
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSElementTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSElementTest.java
new file mode 100644
index 0000000..edae845
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSElementTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2015 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.cts.rscpp;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+
+public class RSElementTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    native boolean testCreatePixel(String path);
+    public void testRSElementTestCreatePixel() {
+        assertTrue(testCreatePixel(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testCreateVector(String path);
+    public void testRSElementTestCreateVector() {
+        assertTrue(testCreateVector(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testPrebuiltElements(String path);
+    public void testRSElementTestPrebuiltElements() {
+        assertTrue(testPrebuiltElements(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testIsCompatible(String path);
+    public void testRSElementTestIsCompatible() {
+        assertTrue(testIsCompatible(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testElementBuilder(String path);
+    public void testRSElementElementBuilder() {
+        assertTrue(testElementBuilder(this.getContext().getCacheDir().toString()));
+    }
+
+}
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSForEachTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSForEachTest.java
new file mode 100644
index 0000000..3f497bb
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSForEachTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2015 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.cts.rscpp;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+
+public class RSForEachTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    native boolean testForEach(String path);
+    public void testRSForEachTestForEach() {
+        assertTrue(testForEach(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testMultipleForEach(String path);
+    public void testRSForEachTestMultipleForEach() {
+        assertTrue(testMultipleForEach(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testNoRoot(String path);
+    public void testRSForEachTestNoRoot() {
+        assertTrue(testNoRoot(this.getContext().getCacheDir().toString()));
+    }
+}
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSObjectTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSObjectTest.java
new file mode 100644
index 0000000..308ca36
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSObjectTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2015 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.cts.rscpp;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+
+public class RSObjectTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    native boolean testClearObjectElement(String path);
+    public void testRSObjectTestClearObjectElement() {
+        assertTrue(testClearObjectElement(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testClearObjectType(String path);
+    public void testRSObjectTestClearObjectType() {
+        assertTrue(testClearObjectType(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testClearObjectAllocation(String path);
+    public void testRSObjectTestClearObjectAllocation() {
+        assertTrue(testClearObjectAllocation(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testClearObjectSampler(String path);
+    public void testRSObjectTestClearObjectSampler() {
+        assertTrue(testClearObjectSampler(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testClearObjectScript(String path);
+    public void testRSObjectTestClearObjectScript() {
+        assertTrue(testClearObjectScript(this.getContext().getCacheDir().toString()));
+    }
+
+}
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSResizeTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSResizeTest.java
new file mode 100644
index 0000000..6826b59
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSResizeTest.java
@@ -0,0 +1,354 @@
+/*
+ * Copyright (C) 2015 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.cts.rscpp;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+import java.lang.Integer;
+
+public class RSResizeTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    private final int inX = 307;
+    private final int inY = 157;
+
+    native boolean resizeTest(String path, int w, int h, float scaleX, float scaleY,
+                              boolean useByte, int vecSize, byte[] inB, byte[] outB,
+                              float[] inF, float[] outF);
+    private void testResize(int w, int h, Element.DataType dt, int vecSize, float scaleX, float scaleY) {
+
+        boolean useByte = false;
+        if (dt == Element.DataType.UNSIGNED_8) {
+            useByte = true;
+        }
+
+        Element e = makeElement(dt, vecSize);
+        Allocation rsInput = makeAllocation(w, h, e);
+
+        int arrSize = w * h * (vecSize == 3 ? 4 : vecSize);
+        int[] baseAlloc = new int[arrSize];
+        byte[] byteAlloc = null;
+        float[] floatAlloc = null;
+
+        RSUtils.genRandom(0x72727272, 255, 1, -128, baseAlloc);
+        if (useByte) {
+            byteAlloc = new byte[arrSize];
+            for (int i = 0; i < arrSize; i++) {
+                byteAlloc[i] = (byte)baseAlloc[i];
+            }
+            rsInput.copyFromUnchecked(byteAlloc);
+        } else {
+            //Float case
+            floatAlloc = new float[arrSize];
+            for (int i = 0; i < arrSize; i++) {
+                floatAlloc[i] = (float)baseAlloc[i];
+            }
+            rsInput.copyFromUnchecked(floatAlloc);
+        }
+
+        int outW = (int) (w*scaleX);
+        int outH = (int) (h*scaleY);
+
+        Allocation rsOutput = makeAllocation(outW, outH, e);
+        Allocation rsCppOutput = makeAllocation(outW, outH, e);
+
+        ScriptIntrinsicResize resize = ScriptIntrinsicResize.create(mRS);
+        resize.setInput(rsInput);
+        resize.forEach_bicubic(rsOutput);
+
+        int outArrSize = outW * outH * (vecSize == 3 ? 4 : vecSize);
+        byte[] nativeByteAlloc = new byte[outArrSize];
+        float[] nativeFloatAlloc = new float[outArrSize];
+        resizeTest(this.getContext().getCacheDir().toString().toString(), w, h, scaleX, scaleY,
+                   useByte, vecSize, byteAlloc, nativeByteAlloc, floatAlloc, nativeFloatAlloc);
+
+        if (useByte) {
+            rsCppOutput.copyFromUnchecked(nativeByteAlloc);
+        } else {
+            rsCppOutput.copyFromUnchecked(nativeFloatAlloc);
+        }
+        mVerify.set_image_tolerance(0.04f); // Kept loose till a better test designed
+        mVerify.invoke_verify(rsOutput, rsCppOutput, rsInput);
+        checkForErrors();
+    }
+
+    public void test_U8_4_SCALE10_10_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 1.f, 1.f);
+    }
+    public void test_U8_3_SCALE10_10_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 1.f, 1.f);
+    }
+    public void test_U8_2_SCALE10_10_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 1.f, 1.f);
+    }
+    public void test_U8_1_SCALE10_10_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 1.f, 1.f);
+    }
+
+    public void test_U8_4_SCALE20_20_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 2.f, 2.f);
+    }
+    public void test_U8_3_SCALE20_20_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 2.f, 2.f);
+    }
+    public void test_U8_2_SCALE20_20_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 2.f, 2.f);
+    }
+    public void test_U8_1_SCALE20_20_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 2.f, 2.f);
+    }
+
+    public void test_U8_4_SCALE05_20_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 0.5f, 2.f);
+    }
+    public void test_U8_3_SCALE05_20_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 0.5f, 2.f);
+    }
+    public void test_U8_2_SCALE05_20_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 0.5f, 2.f);
+    }
+    public void test_U8_1_SCALE05_20_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 0.5f, 2.f);
+    }
+
+    public void test_U8_4_SCALE20_05_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 2.f, 0.5f);
+    }
+    public void test_U8_3_SCALE20_05_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 2.f, 0.5f);
+    }
+    public void test_U8_2_SCALE20_05_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 2.f, 0.5f);
+    }
+    public void test_U8_1_SCALE20_05_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 2.f, 0.5f);
+    }
+
+    public void test_U8_4_SCALE05_05_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 0.5f, 0.5f);
+    }
+    public void test_U8_3_SCALE05_05_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 0.5f, 0.5f);
+    }
+    public void test_U8_2_SCALE05_05_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 0.5f, 0.5f);
+    }
+    public void test_U8_1_SCALE05_05_inSqure() {
+        testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 0.5f, 0.5f);
+    }
+
+    public void test_U8_4_SCALE10_10_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 1.f, 1.f);
+    }
+    public void test_U8_3_SCALE10_10_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 1.f, 1.f);
+    }
+    public void test_U8_2_SCALE10_10_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 1.f, 1.f);
+    }
+    public void test_U8_1_SCALE10_10_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 1.f, 1.f);
+    }
+
+    public void test_U8_4_SCALE20_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 2.f, 2.f);
+    }
+    public void test_U8_3_SCALE20_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 2.f, 2.f);
+    }
+    public void test_U8_2_SCALE20_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 2.f, 2.f);
+    }
+    public void test_U8_1_SCALE20_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 2.f, 2.f);
+    }
+
+    public void test_U8_4_SCALE05_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 0.5f, 2.f);
+    }
+    public void test_U8_3_SCALE05_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 0.5f, 2.f);
+    }
+    public void test_U8_2_SCALE05_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 0.5f, 2.f);
+    }
+    public void test_U8_1_SCALE05_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 0.5f, 2.f);
+    }
+
+    public void test_U8_4_SCALE20_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 2.f, 0.5f);
+    }
+    public void test_U8_3_SCALE20_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 2.f, 0.5f);
+    }
+    public void test_U8_2_SCALE20_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 2.f, 0.5f);
+    }
+    public void test_U8_1_SCALE20_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 2.f, 0.5f);
+    }
+
+    public void test_U8_4_SCALE05_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 0.5f, 0.5f);
+    }
+    public void test_U8_3_SCALE05_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 0.5f, 0.5f);
+    }
+    public void test_U8_2_SCALE05_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 0.5f, 0.5f);
+    }
+    public void test_U8_1_SCALE05_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 0.5f, 0.5f);
+    }
+
+
+    public void test_F32_4_SCALE10_10_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 1.f, 1.f);
+    }
+    public void test_F32_3_SCALE10_10_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 1.f, 1.f);
+    }
+    public void test_F32_2_SCALE10_10_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 1.f, 1.f);
+    }
+    public void test_F32_1_SCALE10_10_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 1.f, 1.f);
+    }
+
+    public void test_F32_4_SCALE20_20_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 2.f, 2.f);
+    }
+    public void test_F32_3_SCALE20_20_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 2.f, 2.f);
+    }
+    public void test_F32_2_SCALE20_20_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 2.f, 2.f);
+    }
+    public void test_F32_1_SCALE20_20_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 2.f, 2.f);
+    }
+
+    public void test_F32_4_SCALE05_20_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 0.5f, 2.f);
+    }
+    public void test_F32_3_SCALE05_20_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 0.5f, 2.f);
+    }
+    public void test_F32_2_SCALE05_20_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 0.5f, 2.f);
+    }
+    public void test_F32_1_SCALE05_20_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 0.5f, 2.f);
+    }
+
+    public void test_F32_4_SCALE20_05_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 2.f, 0.5f);
+    }
+    public void test_F32_3_SCALE20_05_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 2.f, 0.5f);
+    }
+    public void test_F32_2_SCALE20_05_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 2.f, 0.5f);
+    }
+    public void test_F32_1_SCALE20_05_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 2.f, 0.5f);
+    }
+
+    public void test_F32_4_SCALE05_05_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 4, 0.5f, 0.5f);
+    }
+    public void test_F32_3_SCALE05_05_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 3, 0.5f, 0.5f);
+    }
+    public void test_F32_2_SCALE05_05_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 2, 0.5f, 0.5f);
+    }
+    public void test_F32_1_SCALE05_05_inSqure() {
+        testResize(inX, inX, Element.DataType.FLOAT_32, 1, 0.5f, 0.5f);
+    }
+
+    public void test_F32_4_SCALE10_10_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 1.f, 1.f);
+    }
+    public void test_F32_3_SCALE10_10_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 1.f, 1.f);
+    }
+    public void test_F32_2_SCALE10_10_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 1.f, 1.f);
+    }
+    public void test_F32_1_SCALE10_10_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 1.f, 1.f);
+    }
+
+    public void test_F32_4_SCALE20_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 2.f, 2.f);
+    }
+    public void test_F32_3_SCALE20_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 2.f, 2.f);
+    }
+    public void test_F32_2_SCALE20_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 2.f, 2.f);
+    }
+    public void test_F32_1_SCALE20_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 2.f, 2.f);
+    }
+
+    public void test_F32_4_SCALE05_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 0.5f, 2.f);
+    }
+    public void test_F32_3_SCALE05_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 0.5f, 2.f);
+    }
+    public void test_F32_2_SCALE05_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 0.5f, 2.f);
+    }
+    public void test_F32_1_SCALE05_20_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 0.5f, 2.f);
+    }
+
+    public void test_F32_4_SCALE20_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 2.f, 0.5f);
+    }
+    public void test_F32_3_SCALE20_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 2.f, 0.5f);
+    }
+    public void test_F32_2_SCALE20_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 2.f, 0.5f);
+    }
+    public void test_F32_1_SCALE20_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 2.f, 0.5f);
+    }
+
+    public void test_F32_4_SCALE05_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 4, 0.5f, 0.5f);
+    }
+    public void test_F32_3_SCALE05_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 3, 0.5f, 0.5f);
+    }
+    public void test_F32_2_SCALE05_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 2, 0.5f, 0.5f);
+    }
+    public void test_F32_1_SCALE05_05_inRectangle() {
+        testResize(inX, inY, Element.DataType.FLOAT_32, 1, 0.5f, 0.5f);
+    }
+}
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSScriptTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSScriptTest.java
new file mode 100644
index 0000000..fe45b33
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSScriptTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2015 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.cts.rscpp;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+
+public class RSScriptTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    native boolean testSet(String path);
+    public void testRSScriptTestSet() {
+        assertTrue(testSet(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testInstance(String path);
+    public void testRSScriptTestInstance() {
+        assertTrue(testInstance(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testVector(String path);
+    public void testRSScriptTestVector() {
+        assertTrue(testVector(this.getContext().getCacheDir().toString()));
+    }
+}
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSTypeTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSTypeTest.java
new file mode 100644
index 0000000..4453da1
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSTypeTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2015 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.cts.rscpp;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+
+public class RSTypeTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    native boolean testCreate(String path);
+    public void testRSTypeTestCreate() {
+        assertTrue(testCreate(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testGet(String path);
+    public void testRSTypeTestGet() {
+        assertTrue(testGet(this.getContext().getCacheDir().toString()));
+    }
+
+    native boolean testGetCount(String path);
+    public void testRSTypeTestGetCount() {
+        assertTrue(testGetCount(this.getContext().getCacheDir().toString()));
+    }
+}
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSYuvTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSYuvTest.java
new file mode 100644
index 0000000..8f79a4c
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSYuvTest.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2015 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.cts.rscpp;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+import java.util.Random;
+
+public class RSYuvTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    int width;
+    int height;
+    byte [] by;
+    byte [] bu;
+    byte [] bv;
+    Allocation ay;
+    Allocation au;
+    Allocation av;
+
+    int getCWidth() {
+        return (width + 1) / 2;
+    }
+    int getCHeight() {
+        return (height + 1) / 2;
+    }
+
+    protected void makeYuvBuffer(int w, int h) {
+        Random r = new Random();
+        width = w;
+        height = h;
+
+        by = new byte[w*h];
+        bu = new byte[getCWidth() * getCHeight()];
+        bv = new byte[getCWidth() * getCHeight()];
+
+        for (int i=0; i < by.length; i++) {
+            by[i] = (byte)r.nextInt(256);
+        }
+        for (int i=0; i < bu.length; i++) {
+            bu[i] = (byte)r.nextInt(256);
+        }
+        for (int i=0; i < bv.length; i++) {
+            bv[i] = (byte)r.nextInt(256);
+        }
+
+        ay = Allocation.createTyped(mRS, Type.createXY(mRS, Element.U8(mRS), w, h));
+        final Type tuv = Type.createXY(mRS, Element.U8(mRS), w >> 1, h >> 1);
+        au = Allocation.createTyped(mRS, tuv);
+        av = Allocation.createTyped(mRS, tuv);
+
+        ay.copyFrom(by);
+        au.copyFrom(bu);
+        av.copyFrom(bv);
+    }
+
+    public Allocation makeOutput() {
+        return Allocation.createTyped(mRS, Type.createXY(mRS, Element.RGBA_8888(mRS), width, height));
+    }
+
+    native boolean yuvTest(String path, int X, int Y, byte[] input, byte[] output, int yuvFormat);
+    // Test for the API 17 conversion path
+    // This used a uchar buffer assuming nv21
+    public void testV17() {
+        makeYuvBuffer(120, 96);
+        Allocation aout = makeOutput();
+        Allocation aref = makeOutput();
+
+        byte tmp[] = new byte[(width * height) + (getCWidth() * getCHeight() * 2)];
+        int i = 0;
+        for (int j = 0; j < (width * height); j++) {
+            tmp[i++] = by[j];
+        }
+        for (int j = 0; j < (getCWidth() * getCHeight()); j++) {
+            tmp[i++] = bv[j];
+            tmp[i++] = bu[j];
+        }
+
+        Allocation ta = Allocation.createSized(mRS, Element.U8(mRS), tmp.length);
+        ta.copyFrom(tmp);
+
+        ScriptIntrinsicYuvToRGB syuv = ScriptIntrinsicYuvToRGB.create(mRS, Element.U8(mRS));
+        syuv.setInput(ta);
+        syuv.forEach(aout);
+
+        byte[] nativeByteAlloc = new byte[width * height * 4];
+        yuvTest(this.getContext().getCacheDir().toString(), width, height, tmp, nativeByteAlloc, 0);
+        aref.copyFromUnchecked(nativeByteAlloc);
+
+        mVerify.invoke_verify(aref, aout, ay);
+        checkForErrors();
+    }
+
+    // Test for the API 18 conversion path with yv12
+    public void test_YV12() {
+        ScriptIntrinsicYuvToRGB syuv = ScriptIntrinsicYuvToRGB.create(mRS, Element.YUV(mRS));
+
+        makeYuvBuffer(512, 512);
+        Allocation aout = makeOutput();
+        Allocation aref = makeOutput();
+
+        Type.Builder tb = new Type.Builder(mRS, Element.YUV(mRS));
+        tb.setX(width);
+        tb.setY(height);
+        tb.setYuvFormat(android.graphics.ImageFormat.YV12);
+        Allocation ta = Allocation.createTyped(mRS, tb.create(), Allocation.USAGE_SCRIPT);
+
+        byte tmp[] = new byte[(width * height) + (getCWidth() * getCHeight() * 2)];
+        int i = 0;
+        for (int j = 0; j < (width * height); j++) {
+            tmp[i++] = by[j];
+        }
+        for (int j = 0; j < (getCWidth() * getCHeight()); j++) {
+            tmp[i++] = bu[j];
+        }
+        for (int j = 0; j < (getCWidth() * getCHeight()); j++) {
+            tmp[i++] = bv[j];
+        }
+        ta.copyFrom(tmp);
+
+        syuv.setInput(ta);
+        syuv.forEach(aout);
+
+        byte[] nativeByteAlloc = new byte[width * height * 4];
+        yuvTest(this.getContext().getCacheDir().toString(), width, height, tmp, nativeByteAlloc, 1);
+        aref.copyFromUnchecked(nativeByteAlloc);
+
+        mVerify.invoke_verify(aref, aout, ay);
+        checkForErrors();
+    }
+
+    // Test for the API 18 conversion path with nv21
+    public void test_NV21() {
+        ScriptIntrinsicYuvToRGB syuv = ScriptIntrinsicYuvToRGB.create(mRS, Element.YUV(mRS));
+
+        makeYuvBuffer(512, 512);
+        Allocation aout = makeOutput();
+        Allocation aref = makeOutput();
+
+        Type.Builder tb = new Type.Builder(mRS, Element.YUV(mRS));
+        tb.setX(width);
+        tb.setY(height);
+        tb.setYuvFormat(android.graphics.ImageFormat.NV21);
+        Allocation ta = Allocation.createTyped(mRS, tb.create(), Allocation.USAGE_SCRIPT);
+
+        byte tmp[] = new byte[(width * height) + (getCWidth() * getCHeight() * 2)];
+        int i = 0;
+        for (int j = 0; j < (width * height); j++) {
+            tmp[i++] = by[j];
+        }
+        for (int j = 0; j < (getCWidth() * getCHeight()); j++) {
+            tmp[i++] = bv[j];
+            tmp[i++] = bu[j];
+        }
+        ta.copyFrom(tmp);
+
+        syuv.setInput(ta);
+        syuv.forEach(aout);
+
+        byte[] nativeByteAlloc = new byte[width * height * 4];
+        yuvTest(this.getContext().getCacheDir().toString(), width, height, tmp, nativeByteAlloc, 2);
+        aref.copyFromUnchecked(nativeByteAlloc);
+
+        mVerify.invoke_verify(aref, aout, ay);
+        checkForErrors();
+    }
+}
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/verify.rs b/tests/tests/rscpp/src/android/cts/rscpp/verify.rs
index 7fd44d3..700b9d5 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/verify.rs
+++ b/tests/tests/rscpp/src/android/cts/rscpp/verify.rs
@@ -24,10 +24,10 @@
 int gAllowedIntError = 0;
 static bool hadError = false;
 static int2 errorLoc = {0,0};
-
+float image_tolerance = 0.0001f;
 
 static bool compare_float(float f1, float f2) {
-    if (fabs(f1-f2) > 0.0001f) {
+    if (fabs(f1-f2) > image_tolerance) {
         hadError = true;
         return false;
     }
diff --git a/tests/tests/security/Android.mk b/tests/tests/security/Android.mk
index c41ee58..ec36d6d 100644
--- a/tests/tests/security/Android.mk
+++ b/tests/tests/security/Android.mk
@@ -23,7 +23,7 @@
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctstestserver ctstestrunner ctsdeviceutil guava
 
-LOCAL_JAVA_LIBRARIES := android.test.runner
+LOCAL_JAVA_LIBRARIES := android.test.runner org.apache.http.legacy
 
 LOCAL_JNI_SHARED_LIBRARIES := libctssecurity_jni libcts_jni
 
diff --git a/tests/tests/security/AndroidManifest.xml b/tests/tests/security/AndroidManifest.xml
index 8ed74ba..25bc6ac 100644
--- a/tests/tests/security/AndroidManifest.xml
+++ b/tests/tests/security/AndroidManifest.xml
@@ -25,6 +25,7 @@
 
     <application>
         <uses-library android:name="android.test.runner" />
+        <uses-library android:name="org.apache.http.legacy" android:required="false" />
 
         <service android:name="android.security.cts.SeccompDeathTestService"
                  android:process=":death_test_service"
diff --git a/tests/tests/security/jni/Android.mk b/tests/tests/security/jni/Android.mk
index 46d0868..2d55fb6 100644
--- a/tests/tests/security/jni/Android.mk
+++ b/tests/tests/security/jni/Android.mk
@@ -28,14 +28,16 @@
 		android_security_cts_LinuxRngTest.cpp \
 		android_security_cts_LoadEffectLibraryTest.cpp \
 		android_security_cts_NativeCodeTest.cpp \
-		android_security_cts_SeccompDeathTestService.cpp \
 		android_security_cts_SELinuxTest.cpp \
 		android_security_cts_MMapExecutableTest.cpp \
-		android_security_cts_NetlinkSocket.cpp \
-		android_security_cts_AudioPolicyBinderTest.cpp
+		android_security_cts_AudioPolicyBinderTest.cpp \
+		android_security_cts_EncryptionTest.cpp
 
 LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
 
-LOCAL_SHARED_LIBRARIES := libnativehelper liblog libbinder libutils libmedia libselinux libdl
+LOCAL_SHARED_LIBRARIES := libnativehelper liblog libbinder libutils libmedia libselinux libdl libcutils libcrypto
+
+LOCAL_C_INCLUDES += ndk/sources/cpufeatures
+LOCAL_STATIC_LIBRARIES := cpufeatures
 
 include $(BUILD_SHARED_LIBRARY)
diff --git a/tests/tests/security/jni/CtsSecurityJniOnLoad.cpp b/tests/tests/security/jni/CtsSecurityJniOnLoad.cpp
index ca8e841..c60b866 100644
--- a/tests/tests/security/jni/CtsSecurityJniOnLoad.cpp
+++ b/tests/tests/security/jni/CtsSecurityJniOnLoad.cpp
@@ -16,17 +16,16 @@
 
 #include <jni.h>
 #include <stdio.h>
-#include "android_security_cts_NetlinkSocket.h"
 
 extern int register_android_security_cts_KernelSettingsTest(JNIEnv*);
 extern int register_android_security_cts_CharDeviceTest(JNIEnv*);
 extern int register_android_security_cts_LinuxRngTest(JNIEnv*);
 extern int register_android_security_cts_NativeCodeTest(JNIEnv*);
 extern int register_android_security_cts_LoadEffectLibraryTest(JNIEnv*);
-extern int register_android_security_cts_SeccompDeathTestService(JNIEnv*);
 extern int register_android_security_cts_SELinuxTest(JNIEnv*);
 extern int register_android_security_cts_MMapExecutableTest(JNIEnv* env);
 extern int register_android_security_cts_AudioPolicyBinderTest(JNIEnv* env);
+extern int register_android_security_cts_EncryptionTest(JNIEnv* env);
 
 jint JNI_OnLoad(JavaVM *vm, void *reserved) {
     JNIEnv *env = NULL;
@@ -51,10 +50,6 @@
         return JNI_ERR;
     }
 
-    if (register_android_security_cts_SeccompDeathTestService(env)) {
-        return JNI_ERR;
-    }
-
     if (register_android_security_cts_SELinuxTest(env)) {
         return JNI_ERR;
     }
@@ -67,11 +62,11 @@
         return JNI_ERR;
     }
 
-    if (register_android_security_cts_NetlinkSocket(env)) {
+    if (register_android_security_cts_AudioPolicyBinderTest(env)) {
         return JNI_ERR;
     }
 
-    if (register_android_security_cts_AudioPolicyBinderTest(env)) {
+    if (register_android_security_cts_EncryptionTest(env)) {
         return JNI_ERR;
     }
 
diff --git a/tests/tests/security/jni/android_security_cts_EncryptionTest.cpp b/tests/tests/security/jni/android_security_cts_EncryptionTest.cpp
new file mode 100644
index 0000000..b9e390e
--- /dev/null
+++ b/tests/tests/security/jni/android_security_cts_EncryptionTest.cpp
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#include <cpu-features.h>
+#include <cutils/log.h>
+#include <cutils/properties.h>
+#include <jni.h>
+#include <JNIHelp.h>
+#include <openssl/aes.h>
+#include <openssl/cpu.h>
+#include <openssl/evp.h>
+#include <stdint.h>
+#include <string.h>
+#include <time.h>
+#include <new>
+
+#define TEST_EVP_CIPHER     EVP_aes_256_cbc()
+#define TEST_BUFSIZE        (1 * 1024 * 1024) /* 1 MiB */
+#define TEST_ITERATIONS     100 /* MiB */
+#define TEST_THRESHOLD      2000 /* ms */
+
+/*
+ * Function: deviceIsEncrypted
+ * Purpose: Check the device is encrypted
+ * Parameters: none
+ * Returns: boolean: (true) if encrypted, (false) otherwise
+ * Exceptions: none
+ */
+static jboolean android_security_cts_EncryptionTest_deviceIsEncrypted(JNIEnv *, jobject)
+{
+    char prop_value[PROP_VALUE_MAX];
+    property_get("ro.crypto.state", prop_value, "");
+
+    jboolean rc = !strcmp(prop_value, "encrypted");
+    ALOGE("EncryptionTest::deviceIsEncrypted: %d", rc);
+
+    return rc;
+}
+
+/*
+ * Function: cpuHasAes
+ * Purpose: Check if we have an ARM CPU with AES instruction
+ * Parameters: none
+ * Returns: boolean: (true) if AES is available, (false) otherwise
+ * Exceptions: none
+ */
+static jboolean android_security_cts_EncryptionTest_cpuHasAes(JNIEnv *, jobject)
+{
+    jboolean rc = false;
+    AndroidCpuFamily family = android_getCpuFamily();
+    uint64_t features = android_getCpuFeatures();
+
+    if (family == ANDROID_CPU_FAMILY_ARM) {
+        rc = (features & ANDROID_CPU_ARM_FEATURE_AES) != 0;
+    } else if (family == ANDROID_CPU_FAMILY_ARM64) {
+        rc = (features & ANDROID_CPU_ARM64_FEATURE_AES) != 0;
+    }
+
+    ALOGE("EncryptionTest::cpuHasAes: %d", rc);
+    return rc;
+}
+
+/*
+ * Function: cpuHasNeon
+ * Purpose: Check if we have an ARM CPU with NEON instructions
+ * Parameters: none
+ * Returns: boolean: (true) if NEON is available, (false) otherwise
+ * Exceptions: none
+ */
+static jboolean android_security_cts_EncryptionTest_cpuHasNeon(JNIEnv *, jobject)
+{
+    jboolean rc = false;
+    AndroidCpuFamily family = android_getCpuFamily();
+
+    if (family == ANDROID_CPU_FAMILY_ARM) {
+        rc = (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0;
+    } else {
+        rc = (family == ANDROID_CPU_FAMILY_ARM64);
+    }
+
+    ALOGE("EncryptionTest::cpuHasNeon: %d", rc);
+    return rc;
+}
+
+/*
+ * Function: neonIsEnabled
+ * Purpose: Check if libcrypto is compiled with NEON support
+ * Parameters: none
+ * Returns: boolean: (true) if NEON is available, (false) otherwise
+ * Exceptions: none
+ */
+static jboolean android_security_cts_EncryptionTest_neonIsEnabled(JNIEnv *, jobject)
+{
+#if defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)
+    jboolean rc = CRYPTO_is_NEON_capable();
+#else
+    jboolean rc = false;
+#endif
+
+    ALOGE("EncryptionTest::neonIsEnabled: %d", rc);
+    return rc;
+}
+
+static inline uint64_t ns()
+{
+    struct timespec ts;
+    clock_gettime(CLOCK_MONOTONIC, &ts);
+    return (uint64_t)ts.tv_sec * 1000000000 + ts.tv_nsec;
+}
+
+/*
+ * Function: aesIsFast
+ * Purpose: Test if AES performance is sufficient to require encryption
+ * Parameters: none
+ * Returns: boolean: (true) if AES performance is acceptable, (false) otherwise
+ * Exceptions: InvalidKeyException if EVP_DecryptInit fails, OutOfMemoryError
+ *             if memory allocation fails.
+ */
+static jboolean android_security_cts_EncryptionTest_aesIsFast(JNIEnv *env, jobject)
+{
+    EVP_CIPHER_CTX ctx;
+    uint8_t *buf;
+    uint8_t key[EVP_CIPHER_key_length(TEST_EVP_CIPHER)];
+    uint8_t iv[EVP_CIPHER_iv_length(TEST_EVP_CIPHER)];
+
+    memset(key, 0x42, sizeof(key));
+    memset(iv,  0x11, sizeof(iv));
+
+    EVP_CIPHER_CTX_init(&ctx);
+
+    if (!EVP_DecryptInit(&ctx, TEST_EVP_CIPHER, key, iv)) {
+        jniThrowException(env, "java/security/InvalidKeyException",
+            "EVP_DecryptInit failed");
+        return false;
+    }
+
+    buf = new (std::nothrow) uint8_t[TEST_BUFSIZE +
+                EVP_CIPHER_block_size(TEST_EVP_CIPHER)];
+
+    if (!buf) {
+        jniThrowException(env, "java/lang/OutOfMemoryError",
+            "Failed to allocate test buffer");
+        return false;
+    }
+
+    memset(buf, 0xF0, TEST_BUFSIZE);
+
+    int len;
+    uint64_t t = ns();
+
+    for (int i = 0; i < TEST_ITERATIONS; ++i) {
+        EVP_DecryptUpdate(&ctx, buf, &len, buf, TEST_BUFSIZE);
+    }
+
+    t = ns() - t;
+
+    delete[] buf;
+
+    unsigned long ms = (unsigned long)(t / 1000000);
+    double speed =
+        (double)(TEST_ITERATIONS * TEST_BUFSIZE / (1024 * 1024)) * 1000.0 / ms;
+
+    ALOGE("EncryptionTest::aesIsFast: %u iterations in %lu ms (%.01lf MiB/s) "
+        "(threshold %u ms)", TEST_ITERATIONS, ms, speed, TEST_THRESHOLD);
+
+    return ms < TEST_THRESHOLD;
+}
+
+static JNINativeMethod gMethods[] = {
+    { "deviceIsEncrypted", "()Z",
+            (void *) android_security_cts_EncryptionTest_deviceIsEncrypted },
+    { "cpuHasAes", "()Z",
+            (void *) android_security_cts_EncryptionTest_cpuHasAes },
+    { "cpuHasNeon", "()Z",
+            (void *) android_security_cts_EncryptionTest_cpuHasNeon },
+    { "neonIsEnabled", "()Z",
+            (void *) android_security_cts_EncryptionTest_neonIsEnabled },
+    { "aesIsFast", "()Z",
+            (void *) android_security_cts_EncryptionTest_aesIsFast }
+};
+
+int register_android_security_cts_EncryptionTest(JNIEnv* env)
+{
+    jclass clazz = env->FindClass("android/security/cts/EncryptionTest");
+    return env->RegisterNatives(clazz, gMethods,
+            sizeof(gMethods) / sizeof(JNINativeMethod));
+}
diff --git a/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp b/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp
index 716d66d..350309b 100644
--- a/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp
+++ b/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp
@@ -274,3 +274,4 @@
     return env->RegisterNatives(clazz, gMethods,
             sizeof(gMethods) / sizeof(JNINativeMethod));
 }
+
diff --git a/tests/tests/security/jni/android_security_cts_NetlinkSocket.cpp b/tests/tests/security/jni/android_security_cts_NetlinkSocket.cpp
deleted file mode 100644
index de315ea..0000000
--- a/tests/tests/security/jni/android_security_cts_NetlinkSocket.cpp
+++ /dev/null
@@ -1,73 +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.
- */
-
-#include <jni.h>
-#include <stdio.h>
-#include <cutils/log.h>
-#include <asm/types.h>
-#include <sys/socket.h>
-#include <linux/netlink.h>
-#include <errno.h>
-#include <string.h>
-#include "JNIHelp.h"
-
-#include "android_security_cts_NetlinkSocket.h"
-
-static void android_security_cts_NetlinkSocket_create(JNIEnv* env, jclass,
-    jobject fileDescriptor)
-{
-    int sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
-    if (sock == -1) {
-        ALOGE("Can't create socket %s", strerror(errno));
-        jclass SocketException = env->FindClass("java/net/SocketException");
-        env->ThrowNew(SocketException, "Can't create socket");
-        return;
-    }
-    jniSetFileDescriptorOfFD(env, fileDescriptor, sock);
-}
-
-static int android_security_cts_NetlinkSocket_sendmsg(JNIEnv *e, jclass,
-    jobject fileDescriptor, jint pid, jbyteArray packet)
-{
-    void *bytes = (void *)e->GetByteArrayElements(packet, NULL);
-    uint32_t length = (uint32_t)e->GetArrayLength(packet);
-    struct sockaddr_nl snl;
-    struct iovec iov = {bytes, length};
-    struct msghdr msg = {&snl, sizeof(snl), &iov, 1, NULL, 0, 0};
-
-    memset(&snl, 0, sizeof(snl));
-    snl.nl_family = AF_NETLINK;
-    snl.nl_pid = pid;
-
-    int sock = jniGetFDFromFileDescriptor(e, fileDescriptor);
-    int retval = sendmsg(sock, &msg, 0);
-    e->ReleaseByteArrayElements(packet, (jbyte*)bytes, 0);
-    return retval;
-}
-
-
-static JNINativeMethod gMethods[] = {
-    {  "sendmsg", "(Ljava/io/FileDescriptor;I[B)I", (void *) android_security_cts_NetlinkSocket_sendmsg },
-    {  "create_native", "(Ljava/io/FileDescriptor;)V", (void *) android_security_cts_NetlinkSocket_create },
-};
-
-int register_android_security_cts_NetlinkSocket(JNIEnv* env)
-{
-    jclass clazz = env->FindClass("android/security/cts/NetlinkSocket");
-
-    return env->RegisterNatives(clazz, gMethods,
-            sizeof(gMethods) / sizeof(JNINativeMethod));
-}
diff --git a/tests/tests/security/jni/android_security_cts_NetlinkSocket.h b/tests/tests/security/jni/android_security_cts_NetlinkSocket.h
deleted file mode 100644
index 6e61c75..0000000
--- a/tests/tests/security/jni/android_security_cts_NetlinkSocket.h
+++ /dev/null
@@ -1,22 +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.
- */
-
-#ifndef __ANDROID_SECURITY_CTS_H__
-#define __ANDROID_SECURITY_CTS_H__
-
-int register_android_security_cts_NetlinkSocket(JNIEnv*);
-
-#endif /* __ANDROID_SECURITY_CTS_H__ */
diff --git a/tests/tests/security/jni/android_security_cts_SeccompDeathTestService.cpp b/tests/tests/security/jni/android_security_cts_SeccompDeathTestService.cpp
deleted file mode 100644
index eb32521..0000000
--- a/tests/tests/security/jni/android_security_cts_SeccompDeathTestService.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2014 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.
- */
-
-#include <jni.h>
-#include <signal.h>
-#include <unistd.h>
-
-void android_security_cts_SeccompDeathTestService_testSigSysSelf(JNIEnv* env, jobject thiz)
-{
-    kill(getpid(), SIGSYS);
-}
-
-static JNINativeMethod methods[] = {
-    { "testSigSysSelf", "()V",
-        (void *)android_security_cts_SeccompDeathTestService_testSigSysSelf }
-};
-
-int register_android_security_cts_SeccompDeathTestService(JNIEnv* env) {
-    jclass clazz = env->FindClass("android/security/cts/SeccompDeathTestService");
-    return env->RegisterNatives(clazz, methods, sizeof(methods) / sizeof(JNINativeMethod));
-}
diff --git a/tests/tests/security/src/android/security/cts/CertificateData.java b/tests/tests/security/src/android/security/cts/CertificateData.java
index de7c15e..0c311e0 100644
--- a/tests/tests/security/src/android/security/cts/CertificateData.java
+++ b/tests/tests/security/src/android/security/cts/CertificateData.java
@@ -31,7 +31,7 @@
       "D1:CB:CA:5D:B2:D5:2A:7F:69:3B:67:4D:E5:F0:5A:1D:0C:95:7D:F0",
       "4D:23:78:EC:91:95:39:B5:00:7F:75:8F:03:3B:21:1E:C5:4D:8B:CF",
       "E7:B4:F6:9D:61:EC:90:69:DB:7E:90:A7:40:1A:3C:F4:7D:4F:E8:EE",
-      "DD:E1:D2:A9:01:80:2E:1D:87:5E:84:B3:80:7E:4B:B1:FD:99:41:34",
+      "C4:18:F6:4D:46:D1:DF:00:3D:27:30:13:72:43:A9:12:11:C6:75:FB",
       "69:69:56:2E:40:80:F4:24:A1:E7:19:9F:14:BA:F3:EE:58:AB:6A:BB",
       "92:5A:8F:8D:2C:6D:04:E0:66:5F:59:6A:FF:22:D8:63:E8:25:6F:3F",
       "75:E0:AB:B6:13:85:12:27:1C:04:F8:5F:DD:DE:38:E4:B7:24:2E:FE",
@@ -52,10 +52,8 @@
       "AD:7E:1C:28:B0:64:EF:8F:60:03:40:20:14:C3:D0:E3:37:0E:B5:8A",
       "8D:17:84:D5:37:F3:03:7D:EC:70:FE:57:8B:51:9A:99:E6:10:D7:B0",
       "1F:24:C6:30:CD:A4:18:EF:20:69:FF:AD:4F:DD:5F:46:3A:1B:69:AA",
-      "AE:50:83:ED:7C:F4:5C:BC:8F:61:C6:21:FE:68:5D:79:42:21:15:6E",
       "DA:FA:F7:FA:66:84:EC:06:8F:14:50:BD:C7:C2:81:A5:BC:A9:64:57",
       "74:F8:A3:C3:EF:E7:B3:90:06:4B:83:90:3C:21:64:60:20:E5:DF:CE",
-      "85:B5:FF:67:9B:0C:79:96:1F:C8:6E:44:22:00:46:13:DB:17:92:84",
       "3E:2B:F7:F2:03:1B:96:F3:8C:E6:C4:D8:A8:5D:3E:2D:58:47:6A:0F",
       "A3:F1:33:3F:E2:42:BF:CF:C5:D1:4E:8F:39:42:98:40:68:10:D1:A0",
       "5F:43:E5:B1:BF:F8:78:8C:AC:1C:C7:CA:4A:9A:C6:22:2B:CC:34:C6",
@@ -64,6 +62,7 @@
       "59:22:A1:E1:5A:EA:16:35:21:F8:98:39:6A:46:46:B0:44:1B:0F:A9",
       "D4:DE:20:D0:5E:66:FC:53:FE:1A:50:88:2C:78:DB:28:52:CA:E4:74",
       "02:FA:F3:E2:91:43:54:68:60:78:57:69:4D:F5:E4:5B:68:85:18:68",
+      "76:E2:7E:C1:4F:DB:82:C1:C0:A6:75:B5:05:BE:3D:29:B4:ED:DB:BB",
       "D8:C5:38:8A:B7:30:1B:1B:6E:D4:7A:E6:45:25:3A:6F:9F:1A:27:61",
       "93:05:7A:88:15:C6:4F:CE:88:2F:FA:91:16:52:28:78:BC:53:64:17",
       "59:AF:82:79:91:86:C7:B4:75:07:CB:CF:03:57:46:EB:04:DD:B7:16",
@@ -73,10 +72,10 @@
       "77:47:4F:C6:30:E4:0F:4C:47:64:3F:84:BA:B8:C6:95:4A:8A:41:EC",
       "8C:F4:27:FD:79:0C:3A:D1:66:06:8D:E8:1E:57:EF:BB:93:22:72:D4",
       "2F:78:3D:25:52:18:A7:4A:65:39:71:B5:2C:A2:9C:45:15:6F:E9:19",
+      "BA:29:41:60:77:98:3F:F4:F3:EF:F2:31:05:3B:2E:EA:6D:4D:45:FD",
       "97:81:79:50:D8:1C:96:70:CC:34:D8:09:CF:79:44:31:36:7E:F4:74",
       "85:A4:08:C0:9C:19:3E:5D:51:58:7D:CD:D6:13:30:FD:8C:DE:37:BF",
       "58:11:9F:0E:12:82:87:EA:50:FD:D9:87:45:6F:4F:78:DC:FA:D6:D4",
-      "6B:2F:34:AD:89:58:BE:62:FD:B0:6B:5C:CE:BB:9D:D9:4F:4E:39:F3",
       "9B:AA:E5:9F:56:EE:21:CB:43:5A:BE:25:93:DF:A7:F0:40:D1:1D:CB",
       "36:79:CA:35:66:87:72:30:4D:30:A5:FB:87:3B:0F:A7:7B:B7:0D:54",
       "1B:8E:EA:57:96:29:1A:C9:39:EA:B8:0A:81:1A:73:73:C0:93:79:67",
@@ -84,25 +83,24 @@
       "A9:E9:78:08:14:37:58:88:F2:05:19:B0:6D:2B:0D:2B:60:16:90:7D",
       "60:D6:89:74:B5:C2:65:9E:8A:0F:C1:88:7C:88:D2:46:69:1B:18:2C",
       "D2:32:09:AD:23:D3:14:23:21:74:E4:0D:7F:9D:62:13:97:86:63:3A",
+      "D8:EB:6B:41:51:92:59:E0:F3:E7:85:00:C0:3D:B6:88:97:C9:EE:FC",
       "66:31:BF:9E:F7:4F:9E:B6:C9:D5:A6:0C:BA:6A:BE:D1:F7:BD:EF:7B",
       "DE:3F:40:BD:50:93:D3:9B:6C:60:F6:DA:BC:07:62:01:00:89:76:C9",
       "22:D5:D8:DF:8F:02:31:D1:8D:F7:9D:B7:CF:8A:2D:64:C9:3F:6C:3A",
       "F3:73:B3:87:06:5A:28:84:8A:F2:F3:4A:CE:19:2B:DD:C7:8E:9C:AC",
       "06:08:3F:59:3F:15:A1:04:A0:69:A4:6B:A9:03:D0:06:B7:97:09:91",
       "43:13:BB:96:F1:D5:86:9B:C1:4E:6A:92:F6:CF:F6:34:69:87:82:37",
+      "8A:5C:8C:EE:A5:03:E6:05:56:BA:D8:1B:D4:F6:C9:B0:ED:E5:2F:E0",
       "F1:8B:53:8D:1B:E9:03:B6:A6:F0:56:43:5B:17:15:89:CA:F3:6B:F2",
       "05:63:B8:63:0D:62:D7:5A:BB:C8:AB:1E:4B:DF:B5:A8:99:B2:4D:43",
       "62:52:DC:40:F7:11:43:A2:2F:DE:9E:F7:34:8E:06:42:51:B1:81:18",
       "70:17:9B:86:8C:00:A4:FA:60:91:52:22:3F:9F:3E:32:BD:E0:05:62",
       "A0:A1:AB:90:C9:FC:84:7B:3B:12:61:E8:97:7D:5F:D3:22:61:D3:CC",
-      "85:37:1C:A6:E5:50:14:3D:CE:28:03:47:1B:DE:3A:09:E8:F8:77:0F",
-      "7E:78:4A:10:1C:82:65:CC:2D:E1:F1:6D:47:B4:40:CA:D9:0A:19:45",
       "D1:EB:23:A4:6D:17:D6:8F:D9:25:64:C2:F1:F1:60:17:64:D8:E3:49",
       "A1:DB:63:93:91:6F:17:E4:18:55:09:40:04:15:C7:02:40:B0:AE:6B",
       "B8:01:86:D1:EB:9C:86:A5:41:04:CF:30:54:F3:4C:52:B7:E5:58:C6",
       "2E:14:DA:EC:28:F0:FA:1E:8E:38:9A:4E:AB:EB:26:C0:0A:D3:83:C3",
       "DE:28:F4:A4:FF:E5:B9:2F:A3:C5:03:D1:A3:49:A7:F9:96:2A:82:12",
-      "80:25:EF:F4:6E:70:C8:D4:72:24:65:84:FE:40:3B:8A:8D:6A:DB:F5",
       "CA:3A:FB:CF:12:40:36:4B:44:B2:16:20:88:80:48:39:19:93:7C:F7",
       "69:BD:8C:F4:9C:D3:00:FB:59:2E:17:93:CA:55:6A:F3:EC:AA:35:FB",
       "13:2D:0D:45:53:4B:69:97:CD:B2:D5:C3:39:E2:55:76:60:9B:5C:C6",
@@ -118,6 +116,7 @@
       "9F:74:4E:9F:2B:4D:BA:EC:0F:31:2C:50:B6:56:3B:8E:2D:93:C3:11",
       "A1:4B:48:D9:43:EE:0A:0E:40:90:4F:3C:E0:A4:C0:91:93:51:5D:3F",
       "C9:A8:B9:E7:55:80:5E:58:E3:53:77:A7:25:EB:AF:C3:7B:27:CC:D7",
+      "E2:B8:29:4B:55:84:AB:6B:58:C2:90:46:6C:AC:3F:B8:39:8F:84:83",
       "1F:49:14:F7:D8:74:95:1D:DD:AE:02:C0:BE:FD:3A:2D:82:75:51:85",
       "B5:61:EB:EA:A4:DE:E4:25:4B:69:1A:98:A5:57:47:C2:34:C7:D9:71",
       "07:E0:32:E0:20:B7:2C:3F:19:2F:06:28:A2:59:3A:19:A7:0F:06:9E",
@@ -143,10 +142,8 @@
       "CF:9E:87:6D:D3:EB:FC:42:26:97:A3:B5:A3:7A:A0:76:A9:06:23:48",
       "2B:B1:F5:3E:55:0C:1D:C5:F1:D4:E6:B7:6A:46:4B:55:06:02:AC:21",
       "47:BE:AB:C9:22:EA:E8:0E:78:78:34:62:A7:9F:45:C2:54:FD:E6:8B",
-      "39:21:C1:15:C1:5D:0E:CA:5C:CB:5B:C4:F0:7D:21:D8:05:0B:56:6A",
       "3A:44:73:5A:E5:81:90:1F:24:86:61:46:1E:3B:9C:C4:5F:F5:3A:1B",
       "B3:1E:B1:B7:40:E3:6C:84:02:DA:DC:37:D4:4D:F5:D4:67:49:52:F9",
-      "E0:AB:05:94:20:72:54:93:05:60:62:02:36:70:F7:CD:2E:FC:66:66",
       "D3:C0:63:F2:19:ED:07:3E:34:AD:5D:75:0B:32:76:29:FF:D5:9A:F2",
       "F5:17:A2:4F:9A:48:C6:C9:F8:A2:00:26:9F:DC:0F:48:2C:AB:30:89",
       "3B:C0:38:0B:33:C3:F6:A6:0C:86:15:22:93:D9:DF:F5:4B:81:C0:04",
@@ -159,22 +156,21 @@
       "87:82:C6:C3:04:35:3B:CF:D2:96:92:D2:59:3E:7D:44:D9:34:FF:11",
       "59:0D:2D:7D:88:4F:40:2E:61:7E:A5:62:32:17:65:CF:17:D8:94:E9",
       "AE:C5:FB:3F:C8:E1:BF:C4:E5:4F:03:07:5A:9A:E8:00:B7:F7:B6:FA",
+      "DF:71:7E:AA:4A:D9:4E:C9:55:84:99:60:2D:48:DE:5F:BC:F0:3A:25",
       "AF:E5:D2:44:A8:D1:19:42:30:FF:47:9F:E2:F8:97:BB:CD:7A:8C:B4",
       "5F:3B:8C:F2:F8:10:B3:7D:78:B4:CE:EC:19:19:C3:73:34:B9:C7:74",
       "2A:C8:D5:8B:57:CE:BF:2F:49:AF:F2:FC:76:8F:51:14:62:90:7A:41",
       "F1:7F:6F:B6:31:DC:99:E3:A3:C8:7F:FE:1C:F1:81:10:88:D9:60:33",
+      "9D:70:BB:01:A5:A4:A0:18:11:2E:F7:1C:01:B9:32:C5:34:E7:88:A8",
       "96:C9:1B:0B:95:B4:10:98:42:FA:D0:D8:22:79:FE:60:FA:B9:16:83",
       "D8:A6:33:2C:E0:03:6F:B1:85:F6:63:4F:7D:6A:06:65:26:32:28:27",
-      "9F:AD:91:A6:CE:6A:C6:C5:00:47:C4:4E:C9:D4:A5:0D:92:D8:49:79",
       "CC:AB:0E:A0:4C:23:01:D6:69:7B:DD:37:9F:CD:12:EB:24:E3:94:9D",
       "48:12:BD:92:3C:A8:C4:39:06:E7:30:6D:27:96:E6:A4:CF:22:2E:7D",
       "F9:B5:B6:32:45:5F:9C:BE:EC:57:5F:80:DC:E9:6E:2C:C7:B2:78:B7",
       "5F:3A:FC:0A:8B:64:F6:86:67:34:74:DF:7E:A9:A2:FE:F9:FA:7A:51",
       "E6:21:F3:35:43:79:05:9A:4B:68:30:9D:8A:2F:74:22:15:87:EC:79",
-      "DA:40:18:8B:91:89:A3:ED:EE:AE:DA:97:FE:2F:9D:F5:B7:D1:8A:41",
       "89:DF:74:FE:5C:F4:0F:4A:80:F9:E3:37:7D:54:DA:91:E1:01:31:8E",
       "E0:B4:32:2E:B2:F6:A5:68:B6:54:53:84:48:18:4A:50:36:87:43:84",
-      "61:57:3A:11:DF:0E:D8:7E:D5:92:65:22:EA:D0:56:D7:44:B3:23:71",
       "7E:04:DE:89:6A:3E:66:6D:00:E6:87:D3:3F:FA:D9:3B:E8:3D:34:9E",
       "99:A6:9B:E6:1A:FE:88:6B:4D:2B:82:00:7C:B8:54:FC:31:7E:15:39",
       "6E:3A:55:A4:19:0C:19:5C:93:84:3C:C0:DB:72:2E:31:30:61:F0:B1",
diff --git a/tests/tests/security/src/android/security/cts/ClonedSecureRandomTest.java b/tests/tests/security/src/android/security/cts/ClonedSecureRandomTest.java
index dfefad7..d188aab 100644
--- a/tests/tests/security/src/android/security/cts/ClonedSecureRandomTest.java
+++ b/tests/tests/security/src/android/security/cts/ClonedSecureRandomTest.java
@@ -21,10 +21,12 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
+import android.os.DeadObjectException;
 import android.os.IBinder;
 import android.security.cts.activity.ISecureRandomService;
 import android.security.cts.activity.SecureRandomService;
 import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.LargeTest;
 
 import java.io.BufferedReader;
 import java.io.EOFException;
@@ -35,10 +37,11 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
+@LargeTest
 public class ClonedSecureRandomTest extends AndroidTestCase {
-    private static final int MAX_SHUTDOWN_TRIES = 10;
+    private static final int MAX_SHUTDOWN_TRIES = 50;
 
-    private static final int ANSWER_TIMEOUT_SECONDS = 60;
+    private static final int ANSWER_TIMEOUT_SECONDS = 180;
 
     private static final String SEPARATE_PROCESS_NAME = ":secureRandom";
 
diff --git a/tests/tests/security/src/android/security/cts/EncryptionTest.java b/tests/tests/security/src/android/security/cts/EncryptionTest.java
new file mode 100644
index 0000000..bd9a458
--- /dev/null
+++ b/tests/tests/security/src/android/security/cts/EncryptionTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2015 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.security.cts;
+
+import android.test.AndroidTestCase;
+import junit.framework.TestCase;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.util.Log;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class EncryptionTest extends AndroidTestCase {
+
+    static {
+        System.loadLibrary("ctssecurity_jni");
+    }
+
+    private static final String TAG = "EncryptionTest";
+
+    private static final String crypto = "/proc/crypto";
+
+    private static native boolean deviceIsEncrypted();
+
+    private static native boolean cpuHasAes();
+
+    private static native boolean cpuHasNeon();
+
+    private static native boolean neonIsEnabled();
+
+    private static native boolean aesIsFast();
+
+    private boolean hasKernelCrypto(String driver) throws Exception {
+        BufferedReader br = new BufferedReader(new FileReader(crypto));
+        Pattern p = Pattern.compile("driver\\s*:\\s*" + driver);
+
+        try {
+            String line;
+            while ((line = br.readLine()) != null) {
+                if (p.matcher(line).matches()) {
+                    Log.i(TAG, crypto + " has " + driver + " (" + line + ")");
+                    return true;
+                }
+            }
+       } finally {
+           br.close();
+       }
+
+       return false;
+    }
+
+    private boolean hasLowRAM() {
+        ActivityManager activityManager =
+            (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE);
+
+        return activityManager.isLowRamDevice();
+    }
+
+    public void testConfig() throws Exception {
+        if (cpuHasAes()) {
+            // If CPU has AES CE, it must be enabled in kernel
+            assertTrue(crypto + " is missing xts-aes-ce",
+                hasKernelCrypto("xts-aes-ce"));
+        } else if (cpuHasNeon()) {
+            // Otherwise, if CPU has NEON, it must be enabled
+            assertTrue(crypto + " is missing xts-aes-neon (or xts-aes-neonbs)",
+                hasKernelCrypto("xts-aes-neon") ||
+                hasKernelCrypto("xts-aes-neonbs") ||
+                hasKernelCrypto("aes-asm")); // Not recommended alone
+        }
+
+        if (cpuHasNeon()) {
+            assertTrue("libcrypto must have NEON", neonIsEnabled());
+        }
+    }
+
+    public void testEncryption() throws Exception {
+        if (deviceIsEncrypted()) {
+            return;
+        }
+
+        // Optional for low RAM devices
+        if (hasLowRAM()) {
+            Log.i(TAG, "hasLowRAM: true");
+            return;
+        }
+
+        // Required if performance is sufficient
+        assertFalse("Device encryption is required", aesIsFast());
+    }
+}
diff --git a/tests/tests/security/src/android/security/cts/KernelSettingsTest.java b/tests/tests/security/src/android/security/cts/KernelSettingsTest.java
index e401e41..9925e9d 100644
--- a/tests/tests/security/src/android/security/cts/KernelSettingsTest.java
+++ b/tests/tests/security/src/android/security/cts/KernelSettingsTest.java
@@ -115,6 +115,25 @@
 
     private static native boolean supportsXattr();
 
+    /**
+     * ICMP redirects should be disabled.
+     */
+    public void testNoIcmpRedirects() throws IOException {
+        try {
+            assertEquals("ICMP redirects are enabled for IPv4.",
+                    "0", getFile("/proc/sys/net/ipv4/conf/all/accept_redirects"));
+        } catch (FileNotFoundException e) {
+            // Odd. The file doesn't exist... Assume we're ok.
+        }
+
+        try {
+            assertEquals("ICMP redirects are enabled for IPv6.",
+                    "0", getFile("/proc/sys/net/ipv6/conf/all/accept_redirects"));
+        } catch (FileNotFoundException e) {
+            // Odd. The file doesn't exist... Assume we're ok.
+        }
+    }
+
     static String getFile(String filename) throws IOException {
         BufferedReader in = null;
         try {
diff --git a/tests/tests/security/src/android/security/cts/KeystoreExploitTest.java b/tests/tests/security/src/android/security/cts/KeystoreExploitTest.java
deleted file mode 100644
index 23266c2..0000000
--- a/tests/tests/security/src/android/security/cts/KeystoreExploitTest.java
+++ /dev/null
@@ -1,60 +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.security.cts;
-
-import android.test.AndroidTestCase;
-
-import java.io.File;
-import java.lang.reflect.Method;
-
-public class KeystoreExploitTest extends AndroidTestCase {
-    public void testKeystoreCrash() throws Exception {
-        int pid = Proc.findPidFor("/system/bin/keystore");
-
-        Class<?> keystoreClass = Class.forName("android.security.KeyStore");
-        Method getInstance = keystoreClass.getMethod("getInstance");
-        Method get = keystoreClass.getMethod("get", String.class);
-
-        Object keystore = getInstance.invoke(null);
-        String keyName = "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA";
-        get.invoke(keystore, keyName);
-
-        Thread.sleep(2000); // give keystore some time to crash
-
-        assertTrue("PID=" + pid + " crashed due to a malformed key name.",
-                new File("/proc/" + pid + "/cmdline").exists());
-    }
-}
diff --git a/tests/tests/security/src/android/security/cts/NativeCodeTest.java b/tests/tests/security/src/android/security/cts/NativeCodeTest.java
index 266b27c..ab41b4f 100644
--- a/tests/tests/security/src/android/security/cts/NativeCodeTest.java
+++ b/tests/tests/security/src/android/security/cts/NativeCodeTest.java
@@ -64,7 +64,6 @@
                    + "https://github.com/torvalds/linux/commit/a134f083e79f",
                    doPingPongRootTest());
     }
-
     /**
      * Returns true iff this device is vulnerable to CVE-2013-2094.
      * A patch for CVE-2013-2094 can be found at
@@ -140,4 +139,5 @@
      * http://seclists.org/oss-sec/2015/q2/333
      */
     private static native boolean doPingPongRootTest();
+
 }
diff --git a/tests/tests/security/src/android/security/cts/NetlinkSocket.java b/tests/tests/security/src/android/security/cts/NetlinkSocket.java
deleted file mode 100644
index 5ea80ca..0000000
--- a/tests/tests/security/src/android/security/cts/NetlinkSocket.java
+++ /dev/null
@@ -1,54 +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.security.cts;
-
-import java.io.FileDescriptor;
-import java.io.IOException;
-import java.net.SocketException;
-
-public class NetlinkSocket {
-
-    static {
-        System.loadLibrary("ctssecurity_jni");
-    }
-
-    private static native void create_native(FileDescriptor fd) throws SocketException;
-    private static native int sendmsg(FileDescriptor fd, int pid, byte[] bytes);
-
-    private FileDescriptor fd = new FileDescriptor();
-
-    /** no public constructors */
-    private NetlinkSocket() { }
-
-    public static NetlinkSocket create() throws SocketException {
-        NetlinkSocket retval = new NetlinkSocket();
-        create_native(retval.fd);
-        return retval;
-    }
-
-    public boolean valid() {
-        return fd.valid();
-    }
-
-    public int sendmsg(int pid, byte[] bytes) throws IOException {
-        int retval = sendmsg(fd, pid, bytes);
-        if (retval == -1) {
-            throw new IOException("Unable to send message to PID=" + pid);
-        }
-        return retval;
-    }
-}
diff --git a/tests/tests/security/src/android/security/cts/Proc.java b/tests/tests/security/src/android/security/cts/Proc.java
deleted file mode 100644
index 6fe0706..0000000
--- a/tests/tests/security/src/android/security/cts/Proc.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 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.security.cts;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-
-/**
- * Utilities for accessing /proc filesystem information.
- */
-public class Proc {
-    public static int findPidFor(String executable) throws IOException {
-        File f = new File("/proc");
-        for (File d : f.listFiles()) {
-            String cmdLineString = d.getAbsolutePath() + "/cmdline";
-            File cmdLine = new File(cmdLineString);
-            if (cmdLine.exists()) {
-                BufferedReader in = null;
-                try {
-                    in = new BufferedReader(new FileReader(cmdLine));
-                    String line = in.readLine();
-                    if ((line != null) && line.startsWith(executable)) {
-                        return Integer.decode(d.getName());
-                    }
-                } finally {
-                    if (in != null) {
-                        in.close();
-                    }
-                }
-            }
-        }
-        throw new RuntimeException("should never get here");
-    }
-}
diff --git a/tests/tests/security/src/android/security/cts/SeccompBpfTest.java b/tests/tests/security/src/android/security/cts/SeccompBpfTest.java
deleted file mode 100644
index b7d8f2e..0000000
--- a/tests/tests/security/src/android/security/cts/SeccompBpfTest.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (C) 2014 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.security.cts;
-
-import android.test.AndroidTestCase;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.ConditionVariable;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.Messenger;
-import android.os.RemoteException;
-import android.util.Log;
-
-/**
- * Test for seccomp-bpf sandboxing technology. This makes use of the
- * SeccompDeathTestService to run sandboxing death tests out-of-process.
- */
-public class SeccompBpfTest extends AndroidTestCase implements ServiceConnection,
-       IBinder.DeathRecipient {
-    static final String TAG = "SeccompBpfTest";
-
-    /**
-     * Message sent from the SeccompDeathTestService before it runs a test.
-     */
-    static final int MSG_TEST_STARTED = 1;
-    /**
-     * Message sent from the SeccompDeathTestService after a test exits cleanly.
-     */
-    static final int MSG_TEST_ENDED_CLEAN = 2;
-
-    /**
-     * Dedicated thread used to receive messages from the SeccompDeathTestService.
-     */
-    final private HandlerThread mHandlerThread = new HandlerThread("SeccompBpfTest handler");
-    /**
-     * Messenger that runs on mHandlerThread.
-     */
-    private Messenger mMessenger;
-
-    /**
-     * Condition that blocks the test/instrumentation thread that runs the
-     * test cases, while the SeccompDeathTestService runs the test out-of-process.
-     */
-    final private ConditionVariable mCondition = new ConditionVariable();
-
-    /**
-     * The SeccompDeathTestService number to run.
-     */
-    private int mTestNumber = -1;
-
-    /**
-     * If the test has started.
-     */
-    private boolean mTestStarted = false;
-    /**
-     * If the test ended (either cleanly or with death).
-     */
-    private boolean mTestEnded = false;
-    /**
-     * If the test ended cleanly or died.
-     */
-    private boolean mTestDied = false;
-
-    public void testDeathTest() {
-        runDeathTest(SeccompDeathTestService.TEST_DEATH_TEST);
-        assertTrue(mTestDied);
-    }
-
-    public void testCleanTest() {
-        runDeathTest(SeccompDeathTestService.TEST_CLEAN_TEST);
-        assertFalse(mTestDied);
-    }
-
-    public void testSigSysSelf() {
-        runDeathTest(SeccompDeathTestService.TEST_SIGSYS_SELF);
-        assertTrue(mTestDied);
-    }
-
-    /**
-     * Runs a death test by its test number, which needs to match a value in
-     * SeccompDeathTestService.
-     *
-     * This blocks until the completion of the test, after which the test body
-     * can use mTestEnded/mTestDied to see if the test died.
-     */
-    public void runDeathTest(final int testNumber) {
-        mTestStarted = false;
-        mTestEnded = false;
-        mTestDied = false;
-
-        mTestNumber = testNumber;
-
-        Log.d(TAG, "Starting runDeathTest");
-        launchDeathTestService();
-        mCondition.block();
-
-        assertTrue(mTestStarted);
-        assertTrue(mTestEnded);
-    }
-
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        mHandlerThread.start();
-        mMessenger = new Messenger(new Handler(mHandlerThread.getLooper()) {
-            @Override
-            public void handleMessage(Message msg) {
-                switch (msg.what) {
-                    case MSG_TEST_STARTED:
-                        onTestStarted();
-                        break;
-                    case MSG_TEST_ENDED_CLEAN:
-                        onTestEnded(false);
-                        break;
-                    default:
-                        super.handleMessage(msg);
-                }
-            }
-        });
-    }
-
-    @Override
-    public void tearDown() throws Exception {
-        try {
-            mHandlerThread.quitSafely();
-        } finally {
-            super.tearDown();
-        }
-    }
-
-    private void launchDeathTestService() {
-        Log.d(TAG, "launchDeathTestService");
-        mCondition.close();
-
-        Intent intent = new Intent();
-        intent.setComponent(new ComponentName("com.android.cts.security", "android.security.cts.SeccompDeathTestService"));
-
-        if (!getContext().bindService(intent, this, Context.BIND_AUTO_CREATE)) {
-            mCondition.open();
-            fail("Failed to start DeathTestService");
-        }
-    }
-
-    @Override
-    public void onServiceConnected(ComponentName name, IBinder service) {
-        Log.d(TAG, "onServiceConnected");
-
-        Messenger remoteMessenger = new Messenger(service);
-        Message msg = Message.obtain(null, SeccompDeathTestService.MSG_RUN_TEST);
-        msg.getData().putBinder(SeccompDeathTestService.REPLY_BINDER_NAME, mMessenger.getBinder());
-        msg.getData().putInt(SeccompDeathTestService.RUN_TEST_IDENTIFIER, mTestNumber);
-
-        try {
-            service.linkToDeath(this, 0);
-            remoteMessenger.send(msg);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error setting up SeccompDeathTestService: " + e.getMessage());
-        }
-        Log.d(TAG, "Send MSG_TEST_START");
-    }
-
-    private void onTestStarted() {
-        Log.d(TAG, "onTestStarted");
-        mTestStarted = true;
-    }
-
-    @Override
-    public void onServiceDisconnected(ComponentName name) {
-        Log.d(TAG, "onServiceDisconnected");
-    }
-
-    @Override
-    public void binderDied() {
-        Log.d(TAG, "binderDied");
-        if (mTestEnded)
-            return;
-        onTestEnded(true);
-    }
-
-    private void onTestEnded(boolean died) {
-        Log.d(TAG, "onTestEnded, died=" + died);
-        mTestEnded = true;
-        mTestDied = died;
-        getContext().unbindService(this);
-        mCondition.open();
-    }
-}
diff --git a/tests/tests/security/src/android/security/cts/SeccompDeathTestService.java b/tests/tests/security/src/android/security/cts/SeccompDeathTestService.java
deleted file mode 100644
index c78ea35..0000000
--- a/tests/tests/security/src/android/security/cts/SeccompDeathTestService.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2014 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.security.cts;
-
-import android.app.Service;
-import android.content.Intent;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.Messenger;
-import android.os.RemoteException;
-import android.util.Log;
-
-/**
- * Service used to run tests for seccomp-bpf sandboxing. Since sandbox violations
- * result in process termination, they cannot be run from within the test case
- * itself. The SeccompBpfTest starts this service to run code out-of-process and
- * then observes when the Binder channel dies. If the test does not die, the
- * service reports back to the test that it exited cleanly.
- */
-public class SeccompDeathTestService extends Service {
-    static final String TAG = SeccompBpfTest.TAG;
-
-    static {
-        System.loadLibrary("ctssecurity_jni");
-    }
-
-    /**
-     * Message sent from SeccompBpfTest to run a test.
-     */
-    final static int MSG_RUN_TEST = 100;
-    /**
-     * In MSG_RUN_TEST, the test number to run.
-     */
-    final static String RUN_TEST_IDENTIFIER = "android.security.cts.SeccompDeathTestService.testID";
-    /**
-     * In MSG_RUN_TEST, the Binder on which to report clean death.
-     */
-    static final String REPLY_BINDER_NAME = "android.security.cts.SeccompBpfTest";
-
-    // Test numbers that map to test methods in this service.
-    final static int TEST_DEATH_TEST = 1;
-    final static int TEST_CLEAN_TEST = 2;
-    final static int TEST_SIGSYS_SELF = 3;
-
-    final private Messenger mMessenger = new Messenger(new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_RUN_TEST:
-                    runTest(msg);
-                    break;
-                default:
-                    super.handleMessage(msg);
-            }
-        }
-    });
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        Log.d(TAG, "onBind");
-        return mMessenger.getBinder();
-    }
-
-    private void runTest(Message msg) {
-        Log.d(TAG, "runTest");
-        IBinder harnessBinder = msg.getData().getBinder(REPLY_BINDER_NAME);
-        Messenger harness = new Messenger(harnessBinder);
-
-        try {
-            Log.d(TAG, "Send MSG_TEST_STARTED");
-            harness.send(Message.obtain(null, SeccompBpfTest.MSG_TEST_STARTED));
-        } catch (RemoteException e) {
-            Log.e(TAG, "Failed to MSG_TEST_STARTED: " + e.getMessage());
-        }
-
-        demuxTest(msg.getData().getInt(RUN_TEST_IDENTIFIER));
-
-        try {
-            Log.d(TAG, "Send MSG_TEST_ENDED_CLEAN");
-            harness.send(Message.obtain(null, SeccompBpfTest.MSG_TEST_ENDED_CLEAN));
-        } catch (RemoteException e) {
-            Log.e(TAG, "Failed to MSG_TEST_ENDED_CLEAN: " + e.getMessage());
-        }
-    }
-
-    private void demuxTest(int testNumber) {
-        switch (testNumber) {
-            case TEST_DEATH_TEST:
-                testDeath();
-                break;
-            case TEST_CLEAN_TEST:
-                break;
-            case TEST_SIGSYS_SELF:
-                testSigSysSelf();
-                break;
-            default:
-                throw new RuntimeException("Unknown test number " + testNumber);
-        }
-    }
-
-    public void testDeath() {
-        String s = null;
-        s.hashCode();
-    }
-
-    public native void testSigSysSelf();
-}
diff --git a/tests/tests/security/src/android/security/cts/VoldExploitTest.java b/tests/tests/security/src/android/security/cts/VoldExploitTest.java
index 103158f..248579c 100644
--- a/tests/tests/security/src/android/security/cts/VoldExploitTest.java
+++ b/tests/tests/security/src/android/security/cts/VoldExploitTest.java
@@ -17,23 +17,9 @@
 package android.security.cts;
 
 import android.content.Context;
-import android.content.pm.PackageManager;
 import android.os.storage.StorageManager;
 import android.test.AndroidTestCase;
 
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.SocketException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Scanner;
-import java.util.Set;
-
 public class VoldExploitTest extends AndroidTestCase {
 
     /**
@@ -45,245 +31,4 @@
         String path = sm.getMountedObbPath("/dev/null\0asec list");
         assertNull(path);
     }
-
-    /**
-     * Validate that this device isn't vulnerable to the "ZergRush"
-     * vold vulnerability (CVE-2011-3874).
-     *
-     * https://github.com/revolutionary/zergRush/blob/master/zergRush.c
-     *
-     * Note: If the ZergRush vulnerability is present, the call to
-     * {@link StorageManager#getMountedObbPath(String)} below hangs until CTS
-     * kills the testsuite (10 minutes). A timeout, while not desirable,
-     * is the typical failure for this test.
-     */
-    public void testZergRushCrash() throws Exception {
-        int pid = Proc.findPidFor("/system/bin/vold");
-
-        StorageManager sm = (StorageManager) getContext().getSystemService(Context.STORAGE_SERVICE);
-        sm.getMountedObbPath("AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA "
-                + "AAAA AAAA AAAA AAAA"
-                + "AAAA AAAA AAAA AAAA"
-                + "AAAA AAAA AAAA AAAA"
-                + "AAAA AAAA AAAA AAAA"
-                + "AAAA AAAA AAAA AAAA");
-
-        Thread.sleep(2000);  // give vold some time to crash
-
-        // Check to see if vold is still alive.
-        assertTrue(
-                "PID=" + pid + " crashed due to a malformed mount message."
-                        + " Detected unpatched ZergRush vulnerability (CVE-2011-3874).",
-                new File("/proc/" + pid + "/cmdline").exists());
-    }
-
-    /**
-     * Try to crash the vold program using CVE-2011-1823.
-     *
-     * This test attempts to send an invalid netlink messages to
-     * any process which is listening for the messages.  If we detect
-     * that any process crashed as a result of our message, then
-     * we know that we found a bug.
-     *
-     * If this test fails, it's due to CVE-2011-1823
-     *
-     * http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2011-1823
-     */
-    public void testTryToCrashVold() throws IOException {
-        Set<Integer> pids = getPids();
-        assertTrue(pids.size() > 1);  // at least vold and netd should exist
-
-        Set<String> devices = new HashSet<String>();
-        devices.addAll(getSysFsPath("/etc/vold.fstab"));
-        devices.addAll(getSysFsPath("/system/etc/vold.fstab"));
-        if (devices.isEmpty()) {
-          // This vulnerability is not exploitable if there's
-          // no entry in vold.fstab
-          return;
-        }
-
-        NetlinkSocket ns;
-        try {
-            ns = NetlinkSocket.create();
-        } catch (SocketException e) {
-            // Can't create netlink socket. Not vulnerable.
-            return;
-        }
-        for (int i : pids) {
-            for (String j : devices) {
-                doAttack(ns, i, j);
-            }
-        }
-
-        // Check to see if all the processes are still alive.  If
-        // any of them have died, we found an exploitable bug.
-        for (int i : pids) {
-            assertTrue(
-                    "PID=" + i + " crashed due to a malformed netlink message."
-                    + " Detected unpatched vulnerability CVE-2011-1823.",
-                    new File("/proc/" + i + "/cmdline").exists());
-        }
-    }
-
-    /**
-     * Try to actually crash the program, by first sending a fake
-     * request to add a new disk, followed by a fake request to add
-     * a partition.
-     */
-    private static void doAttack(NetlinkSocket ns, int pid, String path)
-            throws IOException {
-        try {
-            ns.sendmsg(pid, getDiskAddedMessage(path));
-            confirmNetlinkMsgReceived();
-
-            for (int i = -1000; i > -5000; i-=1000) {
-                ns.sendmsg(pid, getPartitionAddedMessage(path, i));
-                confirmNetlinkMsgReceived();
-            }
-        } catch (IOException e) {
-            // Ignore the exception.  The process either:
-            //
-            // 1) Crashed
-            // 2) Closed the netlink socket and refused further messages
-            //
-            // If #1 occurs, our PID check in testTryToCrashVold() will
-            // detect the process crashed and trigger an error.
-            //
-            // #2 is not a security bug.  It's perfectly acceptable to
-            // refuse messages from someone trying to send you
-            // malicious content.
-        }
-    }
-
-    /**
-     * Parse the fstab.vold file, and extract out the "sysfs_path" field.
-     */
-    private static Set<String> getSysFsPath(String file) throws IOException {
-        Set<String> retval = new HashSet<String>();
-        File netlink = new File(file);
-        if (!netlink.canRead()) {
-            return retval;
-        }
-        Scanner scanner = null;
-        try {
-            scanner = new Scanner(netlink);
-            while(scanner.hasNextLine()) {
-                String line = scanner.nextLine().trim();
-                if (!line.startsWith("dev_mount")) {
-                    continue;
-                }
-
-                String[] fields = line.split("\\s+");
-                assertTrue(fields.length >= 5);
-                // Column 5 and beyond is "sysfs_path"
-                retval.addAll(Arrays.asList(fields).subList(4, fields.length));
-            }
-        } finally {
-            if (scanner != null) {
-                scanner.close();
-            }
-        }
-        return retval;
-    }
-
-    /**
-     * Poll /proc/net/netlink until all the "Rmem" fields contain
-     * "0" or approximately 10 seconds have passed.
-     *
-     * This indicates that either the netlink message was received,
-     * or the process took too long to process the incoming netlink
-     * message.
-     *
-     * See http://code.google.com/p/android/issues/detail?id=25099
-     * for information on why the timeout is needed.
-     */
-    private static void confirmNetlinkMsgReceived() {
-        try {
-            for (int ct = 0; ct < 200; ct++) {
-                boolean foundAllZeros = true;
-                for (List<String> i : parseNetlink()) {
-                    // Column 5 is the "Rmem" field, which is the
-                    // amount of kernel memory for received netlink messages.
-                    if (!i.get(4).equals("0")) {
-                        foundAllZeros = false;
-                    }
-                }
-                if (foundAllZeros) {
-                    return;
-                }
-                Thread.sleep(50);
-            }
-        } catch (InterruptedException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
-     * Extract all the PIDs listening for netlink messages.
-     */
-    private static Set<Integer> getPids() {
-        List<List<String>> netlink = parseNetlink();
-        Set<Integer> retval = new HashSet<Integer>();
-        for (List<String> i : netlink) {
-            // The PID is in column 3
-            int pid = Long.decode(i.get(2)).intValue();
-            if (new File("/proc/" + pid + "/cmdline").exists()) {
-                retval.add(pid);
-            }
-        }
-        return retval;
-    }
-
-    /**
-     * Parse /proc/net/netlink and return a List of lines
-     * (excluding the first line)
-     */
-    private static List<List<String>> parseNetlink() {
-        List<List<String>> retval = new ArrayList<List<String>>();
-        File netlink = new File("/proc/net/netlink");
-        Scanner scanner = null;
-        try {
-            scanner = new Scanner(netlink);
-            while(scanner.hasNextLine()) {
-                String line = scanner.nextLine().trim();
-                if (line.startsWith("sk")) {
-                    continue;
-                }
-
-                List<String> lineList = Arrays.asList(line.split("\\s+"));
-                retval.add(lineList);
-            }
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        } finally {
-            if (scanner != null) {
-                scanner.close();
-            }
-        }
-        return retval;
-    }
-
-    private static byte[] getDiskAddedMessage(String path) {
-        try {
-            return ("@/foo\0ACTION=add\0SUBSYSTEM=block\0"
-                    + "DEVPATH=" + path + "\0MAJOR=179\0MINOR=12345"
-                    + "\0DEVTYPE=disk\0").getBytes("ASCII");
-        } catch (UnsupportedEncodingException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private static byte[] getPartitionAddedMessage(
-            String path, int partitionNum) {
-        try {
-            return ("@/foo\0ACTION=add\0SUBSYSTEM=block\0"
-                    + "DEVPATH=" + path + "\0MAJOR=179\0MINOR=12345"
-                    + "\0DEVTYPE=blah\0PARTN=" + partitionNum + "\0")
-                    .getBytes("ASCII");
-        } catch (UnsupportedEncodingException e) {
-            throw new RuntimeException(e);
-        }
-    }
 }
diff --git a/tests/tests/speech/Android.mk b/tests/tests/speech/Android.mk
index 6bec012..3ab78b8 100755
--- a/tests/tests/speech/Android.mk
+++ b/tests/tests/speech/Android.mk
@@ -27,6 +27,7 @@
 
 LOCAL_PACKAGE_NAME := CtsSpeechTestCases
 
-LOCAL_SDK_VERSION := current
+# Needed for testing M API
+#LOCAL_SDK_VERSION := current
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/speech/src/android/speech/tts/cts/StubTextToSpeechService.java b/tests/tests/speech/src/android/speech/tts/cts/StubTextToSpeechService.java
index 5e6bb41..88bdc74 100644
--- a/tests/tests/speech/src/android/speech/tts/cts/StubTextToSpeechService.java
+++ b/tests/tests/speech/src/android/speech/tts/cts/StubTextToSpeechService.java
@@ -20,12 +20,32 @@
 import android.speech.tts.SynthesisRequest;
 import android.speech.tts.TextToSpeech;
 import android.speech.tts.TextToSpeechService;
+import android.speech.tts.TtsEngines;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.Locale;
 
 /**
  * Stub implementation of {@link TextToSpeechService}. Used for testing the
  * TTS engine API.
  */
 public class StubTextToSpeechService extends TextToSpeechService {
+    private static final String LOG_TAG = "StubTextToSpeechService";
+
+    // Object that onSynthesizeText will #wait on, if set to non-null
+    public static volatile Object sSynthesizeTextWait;
+
+    private ArrayList<Locale> supportedLanguages = new ArrayList<Locale>();
+    private ArrayList<Locale> supportedCountries = new ArrayList<Locale>();
+    private ArrayList<Locale> GBFallbacks = new ArrayList<Locale>();
+
+    public StubTextToSpeechService() {
+        supportedLanguages.add(new Locale("eng"));
+        supportedCountries.add(new Locale("eng", "USA"));
+        supportedCountries.add(new Locale("eng", "GBR"));
+        GBFallbacks.add(new Locale("eng", "NZL"));
+    }
 
     @Override
     protected String[] onGetLanguage() {
@@ -34,12 +54,19 @@
 
     @Override
     protected int onIsLanguageAvailable(String lang, String country, String variant) {
-        return TextToSpeech.LANG_AVAILABLE;
+        if (supportedCountries.contains(new Locale(lang, country))) {
+            return TextToSpeech.LANG_COUNTRY_AVAILABLE;
+        }
+        if (supportedLanguages.contains(new Locale(lang))) {
+            return TextToSpeech.LANG_AVAILABLE;
+        }
+ 
+        return TextToSpeech.LANG_NOT_SUPPORTED;
     }
 
     @Override
     protected int onLoadLanguage(String lang, String country, String variant) {
-        return TextToSpeech.LANG_AVAILABLE;
+        return onIsLanguageAvailable(lang, country, variant);
     }
 
     @Override
@@ -51,6 +78,18 @@
         if (callback.start(16000, AudioFormat.ENCODING_PCM_16BIT, 1) != TextToSpeech.SUCCESS) {
             return;
         }
+
+        final Object synthesizeTextWait = sSynthesizeTextWait;
+        if (synthesizeTextWait != null) {
+            synchronized (synthesizeTextWait) {
+                try {
+                    synthesizeTextWait.wait(10000);  // 10s timeout
+                } catch (InterruptedException e) {
+                    Log.e(LOG_TAG, "onSynthesizeText wait interrupted", e);
+                }
+            }
+        }
+
         byte[] data = { 0x01, 0x2 };
         if (callback.audioAvailable(data, 0, data.length) != TextToSpeech.SUCCESS) {
             return;
@@ -60,4 +99,20 @@
         }
     }
 
+    @Override
+    public String onGetDefaultVoiceNameFor(String lang, String country, String variant) {
+        Locale locale = new Locale(lang, country);
+        if (supportedCountries.contains(locale)) {
+          return TtsEngines.normalizeTTSLocale(locale).toLanguageTag();
+        }
+        if (lang.equals("eng")) {
+            if (GBFallbacks.contains(new Locale(lang, country))) {
+                return "en-GB";
+            } else {
+                return "en-US";
+            }
+        }
+        return super.onGetDefaultVoiceNameFor(lang, country, variant);
+    }
+
 }
diff --git a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechServiceTest.java b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechServiceTest.java
index c19f6c0..7425ecf 100644
--- a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechServiceTest.java
+++ b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechServiceTest.java
@@ -37,6 +37,7 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+        StubTextToSpeechService.sSynthesizeTextWait = null;
         mTts = TextToSpeechWrapper.createTextToSpeechMockWrapper(getContext());
         assertNotNull(mTts);
     }
@@ -74,6 +75,31 @@
         assertTrue("speak() completion timeout", waitForUtterance());
     }
 
+    public void testSpeakStop() throws Exception {
+        final Object synthesizeTextWait = new Object();
+        StubTextToSpeechService.sSynthesizeTextWait = synthesizeTextWait;
+
+        getTts().stop();
+        final int iterations = 20;
+        for (int i = 0; i < iterations; i++) {
+            int result = getTts().speak(UTTERANCE, TextToSpeech.QUEUE_ADD, null,
+                    UTTERANCE_ID + Integer.toString(i));
+            assertEquals("speak() failed", TextToSpeech.SUCCESS, result);
+        }
+        getTts().stop();
+
+        // Wake up the Stubs #onSynthesizeSpeech (one that will be stopped in-progress)
+        synchronized (synthesizeTextWait) {
+          synthesizeTextWait.notify();
+        }
+
+        for (int i = 0; i < iterations; i++) {
+            assertTrue("speak() stop callback timeout", mTts.waitForStop(
+                    UTTERANCE_ID + Integer.toString(i)));
+        }
+    }
+
+
     public void testMediaPlayerFails() throws Exception {
         File sampleFile = new File(Environment.getExternalStorageDirectory(), "notsound.wav");
         try {
diff --git a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechTest.java b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechTest.java
index 69acdd0..013a5ea 100644
--- a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechTest.java
+++ b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechTest.java
@@ -94,6 +94,25 @@
         return false;
     }
 
+    private void assertContainsEngine(String engine, List<TextToSpeech.EngineInfo> engines) {
+        for (TextToSpeech.EngineInfo engineInfo : engines) {
+            if (engineInfo.name.equals(engine)) {
+                return;
+            }
+        }
+        fail("Engine " + engine + " not found");
+    }
+
+    private HashMap<String, String> createParams() {
+        HashMap<String, String> params = new HashMap<String,String>();
+        params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UTTERANCE_ID);
+        return params;
+    }
+
+    private boolean waitForUtterance() throws InterruptedException {
+        return mTts.waitForComplete(UTTERANCE_ID);
+    }
+
     public void testSynthesizeToFile() throws Exception {
         if (mTts == null) {
             return;
@@ -124,6 +143,21 @@
         assertTrue("speak() completion timeout", waitForUtterance());
     }
 
+    public void testSpeakStop() throws Exception {
+        getTts().stop();
+        final int iterations = 20;
+        for (int i = 0; i < iterations; i++) {
+            int result = getTts().speak(SAMPLE_TEXT, TextToSpeech.QUEUE_ADD, null,
+                    UTTERANCE_ID + Integer.toString(i));
+            assertEquals("speak() failed", TextToSpeech.SUCCESS, result);
+        }
+        getTts().stop();
+        for (int i = 0; i < iterations; i++) {
+            assertTrue("speak() stop callback timeout", mTts.waitForStop(
+                    UTTERANCE_ID + Integer.toString(i)));
+        }
+    }
+
     public void testGetEnginesIncludesDefault() throws Exception {
         if (mTts == null) {
             return;
@@ -141,24 +175,4 @@
         assertNotNull("getEngines() returned null", engines);
         assertContainsEngine(TextToSpeechWrapper.MOCK_TTS_ENGINE, engines);
     }
-
-    private void assertContainsEngine(String engine, List<TextToSpeech.EngineInfo> engines) {
-        for (TextToSpeech.EngineInfo engineInfo : engines) {
-            if (engineInfo.name.equals(engine)) {
-                return;
-            }
-        }
-        fail("Engine " + engine + " not found");
-    }
-
-    private HashMap<String, String> createParams() {
-        HashMap<String, String> params = new HashMap<String,String>();
-        params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UTTERANCE_ID);
-        return params;
-    }
-
-    private boolean waitForUtterance() throws InterruptedException {
-        return mTts.waitForComplete(UTTERANCE_ID);
-    }
-
 }
diff --git a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechWrapper.java b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechWrapper.java
index f0d55bf..9d460e2 100644
--- a/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechWrapper.java
+++ b/tests/tests/speech/src/android/speech/tts/cts/TextToSpeechWrapper.java
@@ -19,9 +19,10 @@
 import android.media.MediaPlayer;
 import android.speech.tts.TextToSpeech;
 import android.speech.tts.TextToSpeech.OnInitListener;
-import android.speech.tts.TextToSpeech.OnUtteranceCompletedListener;
+import android.speech.tts.UtteranceProgressListener;
 import android.util.Log;
 
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Condition;
@@ -65,7 +66,7 @@
         if (!mInitListener.waitForInit()) {
             return false;
         }
-        mTts.setOnUtteranceCompletedListener(mUtteranceListener);
+        mTts.setOnUtteranceProgressListener(mUtteranceListener);
         return true;
     }
 
@@ -73,6 +74,10 @@
         return mUtteranceListener.waitForComplete(utteranceId);
     }
 
+    public boolean waitForStop(String utteranceId) throws InterruptedException {
+        return mUtteranceListener.waitForStop(utteranceId);
+    }
+
     public TextToSpeech getTts() {
         return mTts;
     }
@@ -139,12 +144,16 @@
     /**
      * Listener for waiting for utterance completion.
      */
-    private static class UtteranceWaitListener implements OnUtteranceCompletedListener {
+    private static class UtteranceWaitListener extends UtteranceProgressListener {
         private final Lock mLock = new ReentrantLock();
         private final Condition mDone  = mLock.newCondition();
+        private final HashSet<String> mStartedUtterances = new HashSet<String>();
+        private final HashSet<String> mStoppedUtterances = new HashSet<String>();
+        private final HashMap<String, Integer> mErredUtterances = new HashMap<String, Integer>();
         private final HashSet<String> mCompletedUtterances = new HashSet<String>();
 
-        public void onUtteranceCompleted(String utteranceId) {
+        @Override
+        public void onDone(String utteranceId) {
             mLock.lock();
             try {
                 mCompletedUtterances.add(utteranceId);
@@ -154,6 +163,49 @@
             }
         }
 
+        @Override
+        public void onError(String utteranceId) {
+            mLock.lock();
+            try {
+                mErredUtterances.put(utteranceId, -1);
+                mDone.signal();
+            } finally {
+                mLock.unlock();
+            }
+        }
+
+        @Override
+        public void onError(String utteranceId, int errorCode) {
+            mLock.lock();
+            try {
+                mErredUtterances.put(utteranceId, errorCode);
+                mDone.signal();
+            } finally {
+                mLock.unlock();
+            }
+        }
+
+        @Override
+        public void onStart(String utteranceId) {
+            mLock.lock();
+            try {
+                mStartedUtterances.add(utteranceId);
+            } finally {
+                mLock.unlock();
+            }
+        }
+
+        @Override
+        public void onStop(String utteranceId, boolean isStarted) {
+            mLock.lock();
+            try {
+                mStoppedUtterances.add(utteranceId);
+                mDone.signal();
+            } finally {
+                mLock.unlock();
+            }
+        }
+
         public boolean waitForComplete(String utteranceId)
                 throws InterruptedException {
             long timeOutNanos = TimeUnit.MILLISECONDS.toNanos(TTS_INIT_MAX_WAIT_TIME);
@@ -170,6 +222,23 @@
                 mLock.unlock();
             }
         }
+
+        public boolean waitForStop(String utteranceId)
+                throws InterruptedException {
+            long timeOutNanos = TimeUnit.MILLISECONDS.toNanos(TTS_INIT_MAX_WAIT_TIME);
+            mLock.lock();
+            try {
+                while (!mStoppedUtterances.remove(utteranceId)) {
+                    if (timeOutNanos <= 0) {
+                        return false;
+                    }
+                    timeOutNanos = mDone.awaitNanos(timeOutNanos);
+                }
+                return true;
+            } finally {
+                mLock.unlock();
+            }
+        }
     }
 
     /**
diff --git a/tests/tests/telecom/Android.mk b/tests/tests/telecom/Android.mk
new file mode 100644
index 0000000..51d97f5
--- /dev/null
+++ b/tests/tests/telecom/Android.mk
@@ -0,0 +1,33 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_PACKAGE_NAME := CtsTelecomTestCases
+
+# Don't include this package in any target.
+LOCAL_MODULE_TAGS := optional
+
+# When built, explicitly put it in the data partition.
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/telecom/AndroidManifest.xml b/tests/tests/telecom/AndroidManifest.xml
new file mode 100644
index 0000000..b57e0b6
--- /dev/null
+++ b/tests/tests/telecom/AndroidManifest.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.telecom">
+    <uses-sdk android:minSdkVersion="21" />
+    <uses-permission android:name="android.permission.CALL_PHONE" />>
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <uses-permission android:name="android.permission.REGISTER_CALL_PROVIDER" />
+    <uses-permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL" />
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+
+        <service android:name="android.telecom.cts.CtsRemoteConnectionService"
+            android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE" >
+            <intent-filter>
+                <action android:name="android.telecom.ConnectionService" />
+            </intent-filter>
+        </service>
+
+        <service android:name="android.telecom.cts.CtsConnectionService"
+            android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE" >
+            <intent-filter>
+                <action android:name="android.telecom.ConnectionService" />
+            </intent-filter>
+        </service>
+
+        <service android:name="android.telecom.cts.MockInCallService"
+            android:permission="android.permission.BIND_INCALL_SERVICE" >
+            <intent-filter>
+                <action android:name="android.telecom.InCallService"/>
+            </intent-filter>
+        </service>
+
+        <activity android:name="android.telecom.cts.MockDialerActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.DIAL" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.BROWSABLE" />
+                <data android:mimeType="vnd.android.cursor.item/phone" />
+                <data android:mimeType="vnd.android.cursor.item/person" />
+            </intent-filter>
+            <intent-filter>
+                <action android:name="android.intent.action.DIAL" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.BROWSABLE" />
+                <data android:scheme="voicemail" />
+            </intent-filter>
+            <intent-filter>
+                <action android:name="android.intent.action.DIAL" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW" />
+                <action android:name="android.intent.action.DIAL" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.BROWSABLE" />
+                <data android:scheme="tel" />
+            </intent-filter>
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="com.android.cts.telecom"
+                     android:label="CTS tests for android.telecom package">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+</manifest>
+
diff --git a/tests/tests/telecom/res/drawable/ic_phone_24dp.png b/tests/tests/telecom/res/drawable/ic_phone_24dp.png
new file mode 100644
index 0000000..b0e0205
--- /dev/null
+++ b/tests/tests/telecom/res/drawable/ic_phone_24dp.png
Binary files differ
diff --git a/tests/tests/telecom/src/android/telecom/cts/BaseRemoteTelecomTest.java b/tests/tests/telecom/src/android/telecom/cts/BaseRemoteTelecomTest.java
new file mode 100644
index 0000000..52c8317
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/BaseRemoteTelecomTest.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import static android.telecom.cts.TestUtils.*;
+
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+
+import android.content.ComponentName;
+import android.telecom.Connection;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.RemoteConference;
+import android.telecom.RemoteConnection;
+import android.text.TextUtils;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Base class for Telecom CTS tests that require a {@link CtsConnectionService} and
+ * {@link CtsRemoteConnectionService} to verify Telecom functionality. This class
+ * extends from the {@link BaseTelecomTestWithMockServices} and should be extended
+ * for all RemoteConnection/RemoteConferencTest.
+ */
+public class BaseRemoteTelecomTest extends BaseTelecomTestWithMockServices {
+
+    public static final PhoneAccountHandle TEST_REMOTE_PHONE_ACCOUNT_HANDLE =
+            new PhoneAccountHandle(new ComponentName(PACKAGE, REMOTE_COMPONENT), REMOTE_ACCOUNT_ID);
+    public static final String TEST_REMOTE_PHONE_ACCOUNT_ADDRESS = "tel:666-TEST";
+
+    MockConnectionService remoteConnectionService = null;
+
+    @Override
+    protected void tearDown() throws Exception {
+        tearDownConnectionServices(TEST_PHONE_ACCOUNT_HANDLE, TEST_REMOTE_PHONE_ACCOUNT_HANDLE);
+        super.tearDown();
+    }
+
+    protected void setupConnectionServices(MockConnectionService connectionService,
+            MockConnectionService remoteConnectionService, int flags)
+            throws Exception {
+        // Setup the primary connection service first
+        setupConnectionService(connectionService, flags);
+
+        if (remoteConnectionService != null) {
+            this.remoteConnectionService = remoteConnectionService;
+        } else {
+            // Generate a vanilla mock connection service, if not provided.
+            this.remoteConnectionService = new MockConnectionService();
+        }
+        CtsRemoteConnectionService.setUp(TEST_REMOTE_PHONE_ACCOUNT_HANDLE,
+                this.remoteConnectionService);
+
+        if ((flags & FLAG_REGISTER) != 0) {
+            // This needs SIM subscription, so register via adb commands to get system permission.
+            TestUtils.registerSimPhoneAccount(getInstrumentation(),
+                    TEST_REMOTE_PHONE_ACCOUNT_HANDLE,
+                    REMOTE_ACCOUNT_LABEL,
+                    TEST_REMOTE_PHONE_ACCOUNT_ADDRESS);
+        }
+        if ((flags & FLAG_ENABLE) != 0) {
+            TestUtils.enablePhoneAccount(getInstrumentation(), TEST_REMOTE_PHONE_ACCOUNT_HANDLE);
+        }
+    }
+
+    protected void tearDownConnectionServices(PhoneAccountHandle accountHandle,
+            PhoneAccountHandle remoteAccountHandle) throws Exception {
+        // Teardown the primary connection service first
+        tearDownConnectionService(accountHandle);
+
+        mTelecomManager.unregisterPhoneAccount(remoteAccountHandle);
+        CtsRemoteConnectionService.tearDown();
+        this.remoteConnectionService = null;
+    }
+
+    MockConnection verifyConnectionForOutgoingCallOnRemoteCS() {
+        // Assuming only 1 connection present
+        return verifyConnectionForOutgoingCallOnRemoteCS(0);
+    }
+
+    MockConnection verifyConnectionForOutgoingCallOnRemoteCS(int connectionIndex) {
+        try {
+            if (!remoteConnectionService.lock.tryAcquire(TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                    TimeUnit.MILLISECONDS)) {
+                fail("No outgoing call connection requested by Telecom");
+            }
+        } catch (InterruptedException e) {
+            Log.i(TAG, "Test interrupted!");
+        }
+
+        assertThat("Telecom should create outgoing connection for remote outgoing call",
+                remoteConnectionService.outgoingConnections.size(), not(equalTo(0)));
+        assertEquals("Telecom should not create incoming connections for remote outgoing calls",
+                0, remoteConnectionService.incomingConnections.size());
+        MockConnection connection = remoteConnectionService.outgoingConnections.get(connectionIndex);
+        return connection;
+    }
+
+    MockConnection verifyConnectionForIncomingCallOnRemoteCS() {
+        // Assuming only 1 connection present
+        return verifyConnectionForIncomingCallOnRemoteCS(0);
+    }
+
+    MockConnection verifyConnectionForIncomingCallOnRemoteCS(int connectionIndex) {
+        try {
+            if (!remoteConnectionService.lock.tryAcquire(TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                    TimeUnit.MILLISECONDS)) {
+                fail("No outgoing call connection requested by Telecom");
+            }
+        } catch (InterruptedException e) {
+            Log.i(TAG, "Test interrupted!");
+        }
+
+        assertThat("Telecom should create incoming connections for remote incoming calls",
+                remoteConnectionService.incomingConnections.size(), not(equalTo(0)));
+        assertEquals("Telecom should not create outgoing connections for remote incoming calls",
+                0, remoteConnectionService.outgoingConnections.size());
+        MockConnection connection = remoteConnectionService.incomingConnections.get(connectionIndex);
+        setAndVerifyConnectionForIncomingCall(connection);
+        return connection;
+    }
+
+    void setAndVerifyConferenceablesForOutgoingConnectionOnRemoteCS(int connectionIndex) {
+        assertEquals("Lock should have no permits!", 0, mInCallCallbacks.lock.availablePermits());
+        /**
+         * Set the conferenceable connections on the given connection and it's remote connection
+         * counterpart.
+         */
+        // Make all other outgoing connections as conferenceable with this remote connection.
+        MockConnection connection = remoteConnectionService.outgoingConnections.get(connectionIndex);
+        List<Connection> confConnections =
+                new ArrayList<>(remoteConnectionService.outgoingConnections.size());
+        for (Connection c : remoteConnectionService.outgoingConnections) {
+            if (c != connection) {
+                confConnections.add(c);
+            }
+        }
+        connection.setConferenceableConnections(confConnections);
+        assertEquals(connection.getConferenceables(), confConnections);
+    }
+
+    MockConference verifyConferenceForOutgoingCallOnRemoteCS() {
+        try {
+            if (!remoteConnectionService.lock.tryAcquire(TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                    TimeUnit.MILLISECONDS)) {
+                fail("No outgoing conference requested by Telecom");
+            }
+        } catch (InterruptedException e) {
+            Log.i(TAG, "Test interrupted!");
+        }
+        // Return the newly created conference object to the caller
+        MockConference conference = remoteConnectionService.conferences.get(0);
+        setAndVerifyConferenceForOutgoingCall(conference);
+        return conference;
+    }
+
+    void assertRemoteConnectionState(final RemoteConnection connection, final int state) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return state;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return connection.getState();
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Remote Connection should be in state " + state
+        );
+    }
+
+    void assertRemoteConferenceState(final RemoteConference conference, final int state) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return state;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return conference.getState();
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Remote Conference should be in state " + state
+        );
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/BaseTelecomTestWithMockServices.java b/tests/tests/telecom/src/android/telecom/cts/BaseTelecomTestWithMockServices.java
new file mode 100644
index 0000000..31ca09b
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/BaseTelecomTestWithMockServices.java
@@ -0,0 +1,841 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import static android.telecom.cts.TestUtils.*;
+
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Color;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.SystemClock;
+import android.telecom.Call;
+import android.telecom.CallAudioState;
+import android.telecom.Conference;
+import android.telecom.Connection;
+import android.telecom.InCallService;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
+import android.telecom.VideoProfile;
+import android.telecom.cts.MockInCallService.InCallServiceCallbacks;
+import android.test.InstrumentationTestCase;
+import android.text.TextUtils;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Base class for Telecom CTS tests that require a {@link CtsConnectionService} and
+ * {@link MockInCallService} to verify Telecom functionality.
+ */
+public class BaseTelecomTestWithMockServices extends InstrumentationTestCase {
+
+    public static final int FLAG_REGISTER = 0x1;
+    public static final int FLAG_ENABLE = 0x2;
+
+    public static final PhoneAccountHandle TEST_PHONE_ACCOUNT_HANDLE =
+            new PhoneAccountHandle(new ComponentName(PACKAGE, COMPONENT), ACCOUNT_ID);
+
+    public static final PhoneAccount TEST_PHONE_ACCOUNT = PhoneAccount.builder(
+            TEST_PHONE_ACCOUNT_HANDLE, ACCOUNT_LABEL)
+            .setAddress(Uri.parse("tel:555-TEST"))
+            .setSubscriptionAddress(Uri.parse("tel:555-TEST"))
+            .setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER |
+                    PhoneAccount.CAPABILITY_VIDEO_CALLING |
+                    PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
+            .setHighlightColor(Color.RED)
+            .setShortDescription(ACCOUNT_LABEL)
+            .addSupportedUriScheme(PhoneAccount.SCHEME_TEL)
+            .addSupportedUriScheme(PhoneAccount.SCHEME_VOICEMAIL)
+            .build();
+
+    private static int sCounter = 9999;
+
+    Context mContext;
+    TelecomManager mTelecomManager;
+
+    InvokeCounter mOnBringToForegroundCounter;
+    InvokeCounter mOnCallAudioStateChangedCounter;
+    InvokeCounter mOnPostDialWaitCounter;
+    InvokeCounter mOnCannedTextResponsesLoadedCounter;
+
+    InCallServiceCallbacks mInCallCallbacks;
+    String mPreviousDefaultDialer = null;
+    MockConnectionService connectionService = null;
+
+    boolean mShouldTestTelecom = true;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mContext = getInstrumentation().getContext();
+        mTelecomManager = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
+
+        mShouldTestTelecom = shouldTestTelecom(mContext);
+        if (mShouldTestTelecom) {
+            mPreviousDefaultDialer = TestUtils.getDefaultDialer(getInstrumentation());
+            TestUtils.setDefaultDialer(getInstrumentation(), PACKAGE);
+            setupCallbacks();
+        }
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mShouldTestTelecom) {
+            cleanupCalls();
+            if (!TextUtils.isEmpty(mPreviousDefaultDialer)) {
+                TestUtils.setDefaultDialer(getInstrumentation(), mPreviousDefaultDialer);
+            }
+            tearDownConnectionService(TEST_PHONE_ACCOUNT_HANDLE);
+        }
+        super.tearDown();
+    }
+
+    protected PhoneAccount setupConnectionService(MockConnectionService connectionService,
+            int flags)
+            throws Exception {
+        if (connectionService != null) {
+            this.connectionService = connectionService;
+        } else {
+            // Generate a vanilla mock connection service, if not provided.
+            this.connectionService = new MockConnectionService();
+        }
+        CtsConnectionService.setUp(TEST_PHONE_ACCOUNT_HANDLE, this.connectionService);
+
+        if ((flags & FLAG_REGISTER) != 0) {
+            mTelecomManager.registerPhoneAccount(TEST_PHONE_ACCOUNT);
+        }
+        if ((flags & FLAG_ENABLE) != 0) {
+            TestUtils.enablePhoneAccount(getInstrumentation(), TEST_PHONE_ACCOUNT_HANDLE);
+        }
+
+        return TEST_PHONE_ACCOUNT;
+    }
+
+    protected void tearDownConnectionService(PhoneAccountHandle accountHandle) throws Exception {
+        mTelecomManager.unregisterPhoneAccount(accountHandle);
+        CtsConnectionService.tearDown();
+        this.connectionService = null;
+    }
+
+    protected void startCallTo(Uri address, PhoneAccountHandle accountHandle) {
+        final Intent intent = new Intent(Intent.ACTION_CALL, address);
+        if (accountHandle != null) {
+            intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, accountHandle);
+        }
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mContext.startActivity(intent);
+    }
+
+    private void sleep(long ms) {
+        try {
+            Thread.sleep(ms);
+        } catch (InterruptedException e) {
+        }
+    }
+
+    private void setupCallbacks() {
+        mInCallCallbacks = new InCallServiceCallbacks() {
+            @Override
+            public void onCallAdded(Call call, int numCalls) {
+                Log.i(TAG, "onCallAdded, Call: " + call + ", Num Calls: " + numCalls);
+                this.lock.release();
+            }
+            @Override
+            public void onCallRemoved(Call call, int numCalls) {
+                Log.i(TAG, "onCallRemoved, Call: " + call + ", Num Calls: " + numCalls);
+            }
+            @Override
+            public void onParentChanged(Call call, Call parent) {
+                Log.i(TAG, "onParentChanged, Call: " + call + ", Parent: " + parent);
+                this.lock.release();
+            }
+            @Override
+            public void onChildrenChanged(Call call, List<Call> children) {
+                Log.i(TAG, "onChildrenChanged, Call: " + call + "Children: " + children);
+                this.lock.release();
+            }
+            @Override
+            public void onConferenceableCallsChanged(Call call, List<Call> conferenceableCalls) {
+                Log.i(TAG, "onConferenceableCallsChanged, Call: " + call + ", Conferenceables: " +
+                        conferenceableCalls);
+            }
+            @Override
+            public void onDetailsChanged(Call call, Call.Details details) {
+                Log.i(TAG, "onDetailsChanged, Call: " + call + ", Details: " + details);
+            }
+            @Override
+            public void onCallDestroyed(Call call) {
+                Log.i(TAG, "onCallDestroyed, Call: " + call);
+            }
+            @Override
+            public void onCallStateChanged(Call call, int newState) {
+                Log.i(TAG, "onCallStateChanged, Call: " + call + ", New State: " + newState);
+            }
+            @Override
+            public void onBringToForeground(boolean showDialpad) {
+                mOnBringToForegroundCounter.invoke(showDialpad);
+            }
+            @Override
+            public void onCallAudioStateChanged(CallAudioState audioState) {
+                Log.i(TAG, "onCallAudioStateChanged, audioState: " + audioState);
+                mOnCallAudioStateChangedCounter.invoke(audioState);
+            }
+            @Override
+            public void onPostDialWait(Call call, String remainingPostDialSequence) {
+                mOnPostDialWaitCounter.invoke(call, remainingPostDialSequence);
+            }
+            @Override
+            public void onCannedTextResponsesLoaded(Call call, List<String> cannedTextResponses) {
+                mOnCannedTextResponsesLoadedCounter.invoke(call, cannedTextResponses);
+            }
+        };
+
+        MockInCallService.setCallbacks(mInCallCallbacks);
+
+        // TODO: If more InvokeCounters are added in the future, consider consolidating them into a
+        // single Collection.
+        mOnBringToForegroundCounter = new InvokeCounter("OnBringToForeground");
+        mOnCallAudioStateChangedCounter = new InvokeCounter("OnCallAudioStateChanged");
+        mOnPostDialWaitCounter = new InvokeCounter("OnPostDialWait");
+        mOnCannedTextResponsesLoadedCounter = new InvokeCounter("OnCannedTextResponsesLoaded");
+    }
+
+    /**
+     * Puts Telecom in a state where there is an incoming call provided by the
+     * {@link CtsConnectionService} which can be tested.
+     */
+    void addAndVerifyNewIncomingCall(Uri incomingHandle, Bundle extras) {
+        assertEquals("Lock should have no permits!", 0, mInCallCallbacks.lock.availablePermits());
+        int currentCallCount = 0;
+        if (mInCallCallbacks.getService() != null) {
+            currentCallCount = mInCallCallbacks.getService().getCallCount();
+        }
+
+        if (extras == null) {
+            extras = new Bundle();
+        }
+        extras.putParcelable(TelecomManager.EXTRA_INCOMING_CALL_ADDRESS, incomingHandle);
+        mTelecomManager.addNewIncomingCall(TEST_PHONE_ACCOUNT_HANDLE, extras);
+
+        try {
+            if (!mInCallCallbacks.lock.tryAcquire(3, TimeUnit.SECONDS)) {
+                fail("No call added to InCallService.");
+            }
+        } catch (InterruptedException e) {
+            Log.i(TAG, "Test interrupted!");
+        }
+
+        assertEquals("InCallService should contain 1 more call after adding a call.",
+                currentCallCount + 1,
+                mInCallCallbacks.getService().getCallCount());
+    }
+
+    /**
+     *  Puts Telecom in a state where there is an active call provided by the
+     *  {@link CtsConnectionService} which can be tested.
+     */
+    void placeAndVerifyCall() {
+        placeAndVerifyCall(null);
+    }
+
+    /**
+     *  Puts Telecom in a state where there is an active call provided by the
+     *  {@link CtsConnectionService} which can be tested.
+     *
+     *  @param videoState the video state of the call.
+     */
+    void placeAndVerifyCall(int videoState) {
+        placeAndVerifyCall(null, videoState);
+    }
+
+    /**
+     *  Puts Telecom in a state where there is an active call provided by the
+     *  {@link CtsConnectionService} which can be tested.
+     */
+    void placeAndVerifyCall(Bundle extras) {
+        placeAndVerifyCall(extras, VideoProfile.STATE_AUDIO_ONLY);
+    }
+
+    /**
+     *  Puts Telecom in a state where there is an active call provided by the
+     *  {@link CtsConnectionService} which can be tested.
+     */
+    void placeAndVerifyCall(Bundle extras, int videoState) {
+        assertEquals("Lock should have no permits!", 0, mInCallCallbacks.lock.availablePermits());
+        int currentCallCount = 0;
+        if (mInCallCallbacks.getService() != null) {
+            currentCallCount = mInCallCallbacks.getService().getCallCount();
+        }
+        placeNewCallWithPhoneAccount(extras, videoState);
+
+        try {
+            if (!mInCallCallbacks.lock.tryAcquire(3, TimeUnit.SECONDS)) {
+                fail("No call added to InCallService.");
+            }
+        } catch (InterruptedException e) {
+            Log.i(TAG, "Test interrupted!");
+        }
+
+        assertEquals("InCallService should contain 1 more call after adding a call.",
+                currentCallCount + 1,
+                mInCallCallbacks.getService().getCallCount());
+    }
+
+    MockConnection verifyConnectionForOutgoingCall() {
+        // Assuming only 1 connection present
+        return verifyConnectionForOutgoingCall(0);
+    }
+
+    MockConnection verifyConnectionForOutgoingCall(int connectionIndex) {
+        try {
+            if (!connectionService.lock.tryAcquire(TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                    TimeUnit.MILLISECONDS)) {
+                fail("No outgoing call connection requested by Telecom");
+            }
+        } catch (InterruptedException e) {
+            Log.i(TAG, "Test interrupted!");
+        }
+
+        assertThat("Telecom should create outgoing connection for outgoing call",
+                connectionService.outgoingConnections.size(), not(equalTo(0)));
+        MockConnection connection = connectionService.outgoingConnections.get(connectionIndex);
+        return connection;
+    }
+
+    MockConnection verifyConnectionForIncomingCall() {
+        // Assuming only 1 connection present
+        return verifyConnectionForIncomingCall(0);
+    }
+
+    MockConnection verifyConnectionForIncomingCall(int connectionIndex) {
+        try {
+            if (!connectionService.lock.tryAcquire(TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                    TimeUnit.MILLISECONDS)) {
+                fail("No outgoing call connection requested by Telecom");
+            }
+        } catch (InterruptedException e) {
+            Log.i(TAG, "Test interrupted!");
+        }
+
+        assertThat("Telecom should create incoming connections for incoming calls",
+                connectionService.incomingConnections.size(), not(equalTo(0)));
+        MockConnection connection = connectionService.incomingConnections.get(connectionIndex);
+        setAndVerifyConnectionForIncomingCall(connection);
+        return connection;
+    }
+
+    void setAndVerifyConnectionForIncomingCall(MockConnection connection) {
+        connection.setRinging();
+        assertConnectionState(connection, Connection.STATE_RINGING);
+    }
+
+    void setAndVerifyConferenceablesForOutgoingConnection(int connectionIndex) {
+        assertEquals("Lock should have no permits!", 0, mInCallCallbacks.lock.availablePermits());
+        // Make all other outgoing connections as conferenceable with this connection.
+        MockConnection connection = connectionService.outgoingConnections.get(connectionIndex);
+        List<Connection> confConnections =
+                new ArrayList<>(connectionService.outgoingConnections.size());
+        for (Connection c : connectionService.outgoingConnections) {
+            if (c != connection) {
+                confConnections.add(c);
+            }
+        }
+        connection.setConferenceableConnections(confConnections);
+        assertEquals(connection.getConferenceables(), confConnections);
+    }
+
+    void addConferenceCall(Call call1, Call call2) {
+        assertEquals("Lock should have no permits!", 0, mInCallCallbacks.lock.availablePermits());
+        int currentConfCallCount = 0;
+        if (mInCallCallbacks.getService() != null) {
+            currentConfCallCount = mInCallCallbacks.getService().getConferenceCallCount();
+        }
+        // Verify that the calls have each other on their conferenceable list before proceeding
+        List<Call> callConfList = new ArrayList<>();
+        callConfList.add(call2);
+        assertCallConferenceableList(call1, callConfList);
+
+        callConfList.clear();
+        callConfList.add(call1);
+        assertCallConferenceableList(call2, callConfList);
+
+        call1.conference(call2);
+
+        /**
+         * We should have 1 onCallAdded, 2 onChildrenChanged and 2 onParentChanged invoked, so
+         * we should have 5 available permits on the incallService lock.
+         */
+        try {
+            if (!mInCallCallbacks.lock.tryAcquire(5, 3, TimeUnit.SECONDS)) {
+                fail("Conference addition failed.");
+            }
+        } catch (InterruptedException e) {
+            Log.i(TAG, "Test interrupted!");
+        }
+
+        assertEquals("InCallService should contain 1 more call after adding a conf call.",
+                currentConfCallCount + 1,
+                mInCallCallbacks.getService().getConferenceCallCount());
+    }
+
+    void splitFromConferenceCall(Call call1) {
+        assertEquals("Lock should have no permits!", 0, mInCallCallbacks.lock.availablePermits());
+
+        call1.splitFromConference();
+        /**
+         * We should have 1 onChildrenChanged and 1 onParentChanged invoked, so
+         * we should have 2 available permits on the incallService lock.
+         */
+        try {
+            if (!mInCallCallbacks.lock.tryAcquire(2, 3, TimeUnit.SECONDS)) {
+                fail("Conference split failed");
+            }
+        } catch (InterruptedException e) {
+            Log.i(TAG, "Test interrupted!");
+        }
+    }
+
+    MockConference verifyConferenceForOutgoingCall() {
+        try {
+            if (!connectionService.lock.tryAcquire(TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                    TimeUnit.MILLISECONDS)) {
+                fail("No outgoing conference requested by Telecom");
+            }
+        } catch (InterruptedException e) {
+            Log.i(TAG, "Test interrupted!");
+        }
+        // Return the newly created conference object to the caller
+        MockConference conference = connectionService.conferences.get(0);
+        setAndVerifyConferenceForOutgoingCall(conference);
+        return conference;
+    }
+
+    void setAndVerifyConferenceForOutgoingCall(MockConference conference) {
+        conference.setActive();
+        assertConferenceState(conference, Connection.STATE_ACTIVE);
+    }
+
+    /**
+     * Disconnect the created test call and verify that Telecom has cleared all calls.
+     */
+    void cleanupCalls() {
+        if (mInCallCallbacks != null && mInCallCallbacks.getService() != null) {
+            mInCallCallbacks.getService().disconnectAllConferenceCalls();
+            mInCallCallbacks.getService().disconnectAllCalls();
+            assertNumConferenceCalls(mInCallCallbacks.getService(), 0);
+            assertNumCalls(mInCallCallbacks.getService(), 0);
+        }
+    }
+
+    /**
+     * Place a new outgoing call via the {@link CtsConnectionService}
+     */
+    private void placeNewCallWithPhoneAccount(Bundle extras, int videoState) {
+        if (extras == null) {
+            extras = new Bundle();
+        }
+        extras.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, TEST_PHONE_ACCOUNT_HANDLE);
+
+        if (!VideoProfile.isAudioOnly(videoState)) {
+            extras.putInt(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE, videoState);
+        }
+
+        mTelecomManager.placeCall(createTestNumber(), extras);
+    }
+
+    /**
+     * Create a new number each time for a new test. Telecom has special logic to reuse certain
+     * calls if multiple calls to the same number are placed within a short period of time which
+     * can cause certain tests to fail.
+     */
+    Uri createTestNumber() {
+        return Uri.fromParts("tel", String.valueOf(++sCounter), null);
+    }
+
+    public static Uri getTestNumber() {
+        return Uri.fromParts("tel", String.valueOf(sCounter), null);
+    }
+
+    void assertNumCalls(final MockInCallService inCallService, final int numCalls) {
+        waitUntilConditionIsTrueOrTimeout(new Condition() {
+            @Override
+            public Object expected() {
+                return numCalls;
+            }
+            @Override
+            public Object actual() {
+                return inCallService.getCallCount();
+            }
+        },
+        WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+        "InCallService should contain " + numCalls + " calls."
+    );
+    }
+
+    void assertNumConferenceCalls(final MockInCallService inCallService, final int numCalls) {
+        waitUntilConditionIsTrueOrTimeout(new Condition() {
+            @Override
+            public Object expected() {
+                return numCalls;
+            }
+            @Override
+            public Object actual() {
+                return inCallService.getConferenceCallCount();
+            }
+        },
+        WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+        "InCallService should contain " + numCalls + " conference calls."
+    );
+    }
+
+
+    void assertMuteState(final InCallService incallService, final boolean isMuted) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return isMuted;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        final CallAudioState state = incallService.getCallAudioState();
+                        return state == null ? null : state.isMuted();
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Phone's mute state should be: " + isMuted
+        );
+    }
+
+    void assertMuteState(final MockConnection connection, final boolean isMuted) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return isMuted;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        final CallAudioState state = connection.getCallAudioState();
+                        return state == null ? null : state.isMuted();
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Connection's mute state should be: " + isMuted
+        );
+    }
+
+    void assertAudioRoute(final InCallService incallService, final int route) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return route;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        final CallAudioState state = incallService.getCallAudioState();
+                        return state == null ? null : state.getRoute();
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Phone's audio route should be: " + route
+        );
+    }
+
+    void assertAudioRoute(final MockConnection connection, final int route) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return route;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        final CallAudioState state = ((Connection) connection).getCallAudioState();
+                        return state == null ? null : state.getRoute();
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Connection's audio route should be: " + route
+        );
+    }
+
+    void assertConnectionState(final Connection connection, final int state) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return state;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return connection.getState();
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Connection should be in state " + state
+        );
+    }
+
+    void assertCallState(final Call call, final int state) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return state;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return call.getState();
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Call should be in state " + state
+        );
+    }
+
+    void assertCallConferenceableList(final Call call, final List<Call> conferenceableList) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return conferenceableList;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return call.getConferenceableCalls();
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Call: " + call + " does not have the correct conferenceable call list."
+        );
+    }
+
+    void assertDtmfString(final MockConnection connection, final String dtmfString) {
+        waitUntilConditionIsTrueOrTimeout(new Condition() {
+                @Override
+                public Object expected() {
+                    return dtmfString;
+                }
+
+                @Override
+                public Object actual() {
+                    return connection.getDtmfString();
+                }
+            },
+            WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+            "DTMF string should be equivalent to entered DTMF characters: " + dtmfString
+        );
+    }
+
+    void assertDtmfString(final MockConference conference, final String dtmfString) {
+        waitUntilConditionIsTrueOrTimeout(new Condition() {
+                @Override
+                public Object expected() {
+                    return dtmfString;
+                }
+
+                @Override
+                public Object actual() {
+                    return conference.getDtmfString();
+                }
+            },
+            WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+            "DTMF string should be equivalent to entered DTMF characters: " + dtmfString
+        );
+    }
+
+    void assertCallDisplayName(final Call call, final String name) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return name;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return call.getDetails().getCallerDisplayName();
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Call should have display name: " + name
+        );
+    }
+
+    void assertConnectionCallDisplayName(final Connection connection, final String name) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return name;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return connection.getCallerDisplayName();
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Connection should have display name: " + name
+        );
+    }
+
+    void assertConferenceState(final Conference conference, final int state) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return state;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return conference.getState();
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Conference should be in state " + state
+        );
+    }
+
+    void waitUntilConditionIsTrueOrTimeout(Condition condition, long timeout,
+            String description) {
+        final long start = System.currentTimeMillis();
+        while (!condition.expected().equals(condition.actual())
+                && System.currentTimeMillis() - start < timeout) {
+            sleep(50);
+        }
+        assertEquals(description, condition.expected(), condition.actual());
+    }
+
+    /**
+     * Performs some work, and waits for the condition to be met.  If the condition is not met in
+     * each step of the loop, the work is performed again.
+     *
+     * @param work The work to perform.
+     * @param condition The condition.
+     * @param timeout The timeout.
+     * @param description Description of the work being performed.
+     */
+    void doWorkAndWaitUntilConditionIsTrueOrTimeout(Work work, Condition condition, long timeout,
+            String description) {
+        final long start = System.currentTimeMillis();
+        work.doWork();
+        while (!condition.expected().equals(condition.actual())
+                && System.currentTimeMillis() - start < timeout) {
+            sleep(50);
+            work.doWork();
+        }
+        assertEquals(description, condition.expected(), condition.actual());
+    }
+
+    protected interface Condition {
+        Object expected();
+        Object actual();
+    }
+
+    protected interface Work {
+        void doWork();
+    }
+
+    /**
+     * Utility class used to track the number of times a callback was invoked, and the arguments it
+     * was invoked with. This class is prefixed Invoke rather than the more typical Call for
+     * disambiguation purposes.
+     */
+    protected static final class InvokeCounter {
+        private final String mName;
+        private final Object mLock = new Object();
+        private final ArrayList<Object[]> mInvokeArgs = new ArrayList<>();
+
+        private int mInvokeCount;
+
+        public InvokeCounter(String callbackName) {
+            mName = callbackName;
+        }
+
+        public void invoke(Object... args) {
+            synchronized (mLock) {
+                mInvokeCount++;
+                mInvokeArgs.add(args);
+                mLock.notifyAll();
+            }
+        }
+
+        public Object[] getArgs(int index) {
+            synchronized (mLock) {
+                return mInvokeArgs.get(index);
+            }
+        }
+
+        public int getInvokeCount() {
+            synchronized (mLock) {
+                return mInvokeCount;
+            }
+        }
+
+        public void waitForCount(int count) {
+            waitForCount(count, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        }
+
+        public void waitForCount(int count, long timeoutMillis) {
+            waitForCount(count, timeoutMillis, null);
+        }
+
+        public void waitForCount(int count, long timeoutMillis, String message) {
+            synchronized (mLock) {
+                final long startTimeMillis = SystemClock.uptimeMillis();
+                while (mInvokeCount < count) {
+                    try {
+                        final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
+                        final long remainingTimeMillis = timeoutMillis - elapsedTimeMillis;
+                        if (remainingTimeMillis <= 0) {
+                            if (message != null) {
+                                fail(message);
+                            } else {
+                                fail(String.format("Expected %s to be called %d times.", mName,
+                                        count));
+                            }
+                        }
+                        mLock.wait(timeoutMillis);
+                    } catch (InterruptedException ie) {
+                        /* ignore */
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/BasicInCallServiceTest.java b/tests/tests/telecom/src/android/telecom/cts/BasicInCallServiceTest.java
new file mode 100644
index 0000000..0b5fe61
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/BasicInCallServiceTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import static android.telecom.cts.TestUtils.shouldTestTelecom;
+
+import android.telecom.cts.MockInCallService.InCallServiceCallbacks;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.telecom.Call;
+import android.telecom.InCallService;
+import android.test.InstrumentationTestCase;
+import android.text.TextUtils;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Sanity test that adding a new call via the CALL intent works correctly.
+ */
+public class BasicInCallServiceTest extends InstrumentationTestCase {
+
+    private static final Uri TEST_NUMBER = Uri.fromParts("tel", "7", null);
+
+    private Context mContext;
+    private String mPreviousDefaultDialer = null;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mContext = getInstrumentation().getContext();
+        mPreviousDefaultDialer = TestUtils.getDefaultDialer(getInstrumentation());
+        TestUtils.setDefaultDialer(getInstrumentation(), TestUtils.PACKAGE);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (!TextUtils.isEmpty(mPreviousDefaultDialer)) {
+            TestUtils.setDefaultDialer(getInstrumentation(), mPreviousDefaultDialer);
+        }
+        super.tearDown();
+    }
+
+    /**
+     * Tests that when sending a CALL intent via the Telecom -> Telephony stack, Telecom
+     * binds to the registered {@link InCallService}s and adds a new call. This test will
+     * actually place a phone call to the number 7. It should still pass even if there is no
+     * SIM card inserted.
+     */
+    public void testTelephonyCall_bindsToInCallServiceAndAddsCall() {
+        if (!shouldTestTelecom(mContext)) {
+            return;
+        }
+
+        final Intent intent = new Intent(Intent.ACTION_CALL, TEST_NUMBER);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+        final InCallServiceCallbacks callbacks = createCallbacks();
+
+        MockInCallService.setCallbacks(callbacks);
+
+        mContext.startActivity(intent);
+
+        try {
+            if (callbacks.lock.tryAcquire(3, TimeUnit.SECONDS)) {
+                return;
+            }
+        } catch (InterruptedException e) {
+        }
+
+        fail("No call added to InCallService.");
+    }
+
+    private MockInCallService.InCallServiceCallbacks createCallbacks() {
+        final InCallServiceCallbacks callbacks = new InCallServiceCallbacks() {
+            @Override
+            public void onCallAdded(Call call, int numCalls) {
+                assertEquals("InCallService should have 1 call after adding call", 1, numCalls);
+                call.disconnect();
+                lock.release();
+            }
+        };
+        return callbacks;
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/CallDetailsTest.java b/tests/tests/telecom/src/android/telecom/cts/CallDetailsTest.java
new file mode 100644
index 0000000..879c995
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/CallDetailsTest.java
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import static android.telecom.cts.TestUtils.*;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import android.graphics.drawable.Icon;
+import android.os.Bundle;
+import android.net.Uri;
+import android.telecom.Call;
+import android.telecom.Connection;
+import android.telecom.ConnectionRequest;
+import android.telecom.DisconnectCause;
+import android.telecom.GatewayInfo;
+import android.telecom.InCallService;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.StatusHints;
+import android.telecom.TelecomManager;
+
+import com.android.cts.telecom.R;
+
+/**
+ * Suites of tests that verifies the various Call details.
+ */
+public class CallDetailsTest extends BaseTelecomTestWithMockServices {
+
+    public static final int CONNECTION_CAPABILITIES =
+            Connection.CAPABILITY_HOLD | Connection.CAPABILITY_MUTE |
+            /**
+             * CAPABILITY_HIGH_DEF_AUDIO & CAPABILITY_WIFI are hidden, so
+             * hardcoding the values for now.
+             */
+            0x00008000 | 0x00010000;
+    public static final int CALL_CAPABILITIES =
+            Call.Details.CAPABILITY_HOLD | Call.Details.CAPABILITY_MUTE;
+    public static final int CALL_PROPERTIES =
+            Call.Details.PROPERTY_HIGH_DEF_AUDIO | Call.Details.PROPERTY_WIFI;
+    public static final String CALLER_DISPLAY_NAME = "CTS test";
+    public static final int CALLER_DISPLAY_NAME_PRESENTATION = TelecomManager.PRESENTATION_ALLOWED;
+
+    private StatusHints mStatusHints;
+    private Bundle mExtras = new Bundle();
+
+    private MockInCallService mInCallService;
+    private Call mCall;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        if (mShouldTestTelecom) {
+            PhoneAccount account = setupConnectionService(
+                    new MockConnectionService() {
+                        @Override
+                        public Connection onCreateOutgoingConnection(
+                                PhoneAccountHandle connectionManagerPhoneAccount,
+                                ConnectionRequest request) {
+                            Connection connection = super.onCreateOutgoingConnection(
+                                    connectionManagerPhoneAccount,
+                                    request);
+                            // Modify the connection object created with local values.
+                            connection.setConnectionCapabilities(CONNECTION_CAPABILITIES);
+                            connection.setCallerDisplayName(
+                                    CALLER_DISPLAY_NAME,
+                                    CALLER_DISPLAY_NAME_PRESENTATION);
+                            connection.setExtras(mExtras);
+                            mStatusHints = new StatusHints(
+                                    "CTS test",
+                                    Icon.createWithResource(
+                                            getInstrumentation().getContext(),
+                                            R.drawable.ic_phone_24dp),
+                                            null);
+                            connection.setStatusHints(mStatusHints);
+                            lock.release();
+                            return connection;
+                        }
+                    }, FLAG_REGISTER | FLAG_ENABLE);
+
+            /** Place a call as a part of the setup before we test the various
+             *  Call details.
+             */
+            placeAndVerifyCall();
+            verifyConnectionForOutgoingCall();
+
+            mInCallService = mInCallCallbacks.getService();
+            mCall = mInCallService.getLastCall();
+
+            assertCallState(mCall, Call.STATE_DIALING);
+        }
+    }
+
+    /**
+     * Tests whether the getAccountHandle() getter returns the correct object.
+     */
+    public void testAccountHandle() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        assertThat(mCall.getDetails().getAccountHandle(), is(PhoneAccountHandle.class));
+        assertEquals(TEST_PHONE_ACCOUNT_HANDLE, mCall.getDetails().getAccountHandle());
+    }
+
+    /**
+     * Tests whether the getCallCapabilities() getter returns the correct object.
+     */
+    public void testCallCapabilities() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        assertThat(mCall.getDetails().getCallCapabilities(), is(Integer.class));
+        assertEquals(CALL_CAPABILITIES, mCall.getDetails().getCallCapabilities());
+        assertTrue(mCall.getDetails().can(Call.Details.CAPABILITY_HOLD));
+        assertTrue(mCall.getDetails().can(Call.Details.CAPABILITY_MUTE));
+        assertFalse(mCall.getDetails().can(Call.Details.CAPABILITY_MANAGE_CONFERENCE));
+        assertFalse(mCall.getDetails().can(Call.Details.CAPABILITY_RESPOND_VIA_TEXT));
+    }
+
+    /**
+     * Tests whether the getCallerDisplayName() getter returns the correct object.
+     */
+    public void testCallerDisplayName() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        assertThat(mCall.getDetails().getCallerDisplayName(), is(String.class));
+        assertEquals(CALLER_DISPLAY_NAME, mCall.getDetails().getCallerDisplayName());
+    }
+
+    /**
+     * Tests whether the getCallerDisplayNamePresentation() getter returns the correct object.
+     */
+    public void testCallerDisplayNamePresentation() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        assertThat(mCall.getDetails().getCallerDisplayNamePresentation(), is(Integer.class));
+        assertEquals(CALLER_DISPLAY_NAME_PRESENTATION, mCall.getDetails().getCallerDisplayNamePresentation());
+    }
+
+    /**
+     * Tests whether the getCallProperties() getter returns the correct object.
+     */
+    public void testCallProperties() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        assertThat(mCall.getDetails().getCallProperties(), is(Integer.class));
+        assertEquals(CALL_PROPERTIES, mCall.getDetails().getCallProperties());
+    }
+
+    /**
+     * Tests whether the getConnectTimeMillis() getter returns the correct object.
+     */
+    public void testConnectTimeMillis() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        assertThat(mCall.getDetails().getConnectTimeMillis(), is(Long.class));
+    }
+
+    /**
+     * Tests whether the getDisconnectCause() getter returns the correct object.
+     */
+    public void testDisconnectCause() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        assertThat(mCall.getDetails().getDisconnectCause(), is(DisconnectCause.class));
+    }
+
+    /**
+     * Tests whether the getExtras() getter returns the correct object.
+     */
+    public void testExtras() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        if (mCall.getDetails().getExtras() != null) {
+            assertThat(mCall.getDetails().getExtras(), is(Bundle.class));
+        }
+    }
+
+    /**
+     * Tests whether the getIntentExtras() getter returns the correct object.
+     */
+    public void testIntentExtras() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        assertThat(mCall.getDetails().getIntentExtras(), is(Bundle.class));
+    }
+
+    /**
+     * Tests whether the getGatewayInfo() getter returns the correct object.
+     */
+    public void testGatewayInfo() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        if (mCall.getDetails().getGatewayInfo() != null) {
+            assertThat(mCall.getDetails().getGatewayInfo(), is(GatewayInfo.class));
+        }
+    }
+
+    /**
+     * Tests whether the getHandle() getter returns the correct object.
+     */
+    public void testHandle() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        assertThat(mCall.getDetails().getHandle(), is(Uri.class));
+        assertEquals(getTestNumber(), mCall.getDetails().getHandle());
+    }
+
+    /**
+     * Tests whether the getHandlePresentation() getter returns the correct object.
+     */
+    public void testHandlePresentation() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        assertThat(mCall.getDetails().getHandlePresentation(), is(Integer.class));
+        assertEquals(MockConnectionService.CONNECTION_PRESENTATION, mCall.getDetails().getHandlePresentation());
+    }
+
+    /**
+     * Tests whether the getStatusHints() getter returns the correct object.
+     */
+    public void testStatusHints() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        assertThat(mCall.getDetails().getStatusHints(), is(StatusHints.class));
+        assertEquals(mStatusHints.getLabel(), mCall.getDetails().getStatusHints().getLabel());
+        assertEquals(
+                mStatusHints.getIcon().toString(),
+                mCall.getDetails().getStatusHints().getIcon().toString());
+        assertEquals(mStatusHints.getExtras(), mCall.getDetails().getStatusHints().getExtras());
+    }
+
+    /**
+     * Tests whether the getVideoState() getter returns the correct object.
+     */
+    public void testVideoState() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        assertThat(mCall.getDetails().getVideoState(), is(Integer.class));
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/CallTest.java b/tests/tests/telecom/src/android/telecom/cts/CallTest.java
new file mode 100644
index 0000000..efbb69f
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/CallTest.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import static android.telecom.Call.Details.*;
+
+import android.telecom.Call;
+import android.test.AndroidTestCase;
+
+public class CallTest extends AndroidTestCase {
+
+    public void testCapabilitiesCan() {
+        assertTrue(Call.Details.can(CAPABILITY_HOLD, CAPABILITY_HOLD));
+        assertTrue(Call.Details.can(CAPABILITY_MUTE, CAPABILITY_MUTE));
+        assertTrue(Call.Details.can(CAPABILITY_HOLD | CAPABILITY_DISCONNECT_FROM_CONFERENCE,
+                CAPABILITY_HOLD));
+        assertTrue(Call.Details.can(CAPABILITY_MERGE_CONFERENCE
+                | CAPABILITY_DISCONNECT_FROM_CONFERENCE | CAPABILITY_MUTE,
+                CAPABILITY_MUTE));
+
+        assertFalse(Call.Details.can(CAPABILITY_MUTE, CAPABILITY_HOLD));
+        assertFalse(Call.Details.can(CAPABILITY_MERGE_CONFERENCE
+                | CAPABILITY_DISCONNECT_FROM_CONFERENCE | CAPABILITY_MUTE,
+                CAPABILITY_HOLD));
+    }
+
+    public void testCapabilitiesToString() {
+        assertEquals("[Capabilities: CAPABILITY_HOLD]",
+                Call.Details.capabilitiesToString(CAPABILITY_HOLD));
+        assertEquals("[Capabilities: CAPABILITY_SUPPORT_HOLD]",
+                Call.Details.capabilitiesToString(CAPABILITY_SUPPORT_HOLD));
+        assertEquals("[Capabilities: CAPABILITY_MERGE_CONFERENCE]",
+                Call.Details.capabilitiesToString(CAPABILITY_MERGE_CONFERENCE));
+        assertEquals("[Capabilities: CAPABILITY_SWAP_CONFERENCE]",
+                Call.Details.capabilitiesToString(CAPABILITY_SWAP_CONFERENCE));
+        assertEquals("[Capabilities: CAPABILITY_RESPOND_VIA_TEXT]",
+                Call.Details.capabilitiesToString(CAPABILITY_RESPOND_VIA_TEXT));
+        assertEquals("[Capabilities: CAPABILITY_MUTE]",
+                Call.Details.capabilitiesToString(CAPABILITY_MUTE));
+        assertEquals("[Capabilities: CAPABILITY_MANAGE_CONFERENCE]",
+                Call.Details.capabilitiesToString(CAPABILITY_MANAGE_CONFERENCE));
+
+        final int capabilities = CAPABILITY_SUPPORTS_VT_LOCAL_RX
+                | CAPABILITY_SUPPORTS_VT_LOCAL_TX
+                | CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL
+                | CAPABILITY_SUPPORTS_VT_REMOTE_RX
+                | CAPABILITY_SUPPORTS_VT_REMOTE_TX
+                | CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL
+                | CAPABILITY_CAN_PAUSE_VIDEO;
+        assertEquals("[Capabilities: "
+                + "CAPABILITY_SUPPORTS_VT_LOCAL_RX "
+                + "CAPABILITY_SUPPORTS_VT_LOCAL_TX "
+                + "CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL "
+                + "CAPABILITY_SUPPORTS_VT_REMOTE_RX "
+                + "CAPABILITY_SUPPORTS_VT_REMOTE_TX "
+                + "CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL "
+                + "CAPABILITY_CAN_PAUSE_VIDEO"
+                + "]",
+                Call.Details.capabilitiesToString(capabilities));
+    }
+
+    public void testHasProperty() {
+        assertTrue(Call.Details.hasProperty(PROPERTY_WIFI, PROPERTY_WIFI));
+        assertTrue(Call.Details.hasProperty(PROPERTY_HIGH_DEF_AUDIO, PROPERTY_HIGH_DEF_AUDIO));
+        assertTrue(Call.Details.hasProperty(PROPERTY_HIGH_DEF_AUDIO | PROPERTY_CONFERENCE
+                | PROPERTY_WIFI, PROPERTY_CONFERENCE));
+
+        assertFalse(Call.Details.hasProperty(PROPERTY_WIFI, PROPERTY_CONFERENCE));
+        assertFalse(Call.Details.hasProperty(PROPERTY_HIGH_DEF_AUDIO | PROPERTY_CONFERENCE
+                | PROPERTY_WIFI, PROPERTY_GENERIC_CONFERENCE));
+    }
+
+    public void testPropertiesToString() {
+        assertEquals("[Properties: PROPERTY_CONFERENCE]",
+                Call.Details.propertiesToString(PROPERTY_CONFERENCE));
+        assertEquals("[Properties: PROPERTY_GENERIC_CONFERENCE]",
+                Call.Details.propertiesToString(PROPERTY_GENERIC_CONFERENCE));
+        assertEquals("[Properties: PROPERTY_EMERGENCY_CALLBACK_MODE]",
+                Call.Details.propertiesToString(PROPERTY_EMERGENCY_CALLBACK_MODE));
+        assertEquals("[Properties: PROPERTY_WIFI]",
+                Call.Details.propertiesToString(PROPERTY_WIFI));
+        assertEquals("[Properties: PROPERTY_HIGH_DEF_AUDIO]",
+                Call.Details.propertiesToString(PROPERTY_HIGH_DEF_AUDIO));
+
+        final int properties = PROPERTY_CONFERENCE
+                | PROPERTY_WIFI
+                | PROPERTY_HIGH_DEF_AUDIO;
+        assertEquals("[Properties: "
+                + "PROPERTY_CONFERENCE "
+                + "PROPERTY_WIFI "
+                + "PROPERTY_HIGH_DEF_AUDIO"
+                + "]",
+                Call.Details.propertiesToString(properties));
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/ConferenceTest.java b/tests/tests/telecom/src/android/telecom/cts/ConferenceTest.java
new file mode 100644
index 0000000..121d559
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/ConferenceTest.java
@@ -0,0 +1,428 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import static android.telecom.cts.TestUtils.*;
+
+import android.os.Bundle;
+import android.telecom.Call;
+import android.telecom.Conference;
+import android.telecom.Connection;
+import android.telecom.ConnectionRequest;
+import android.telecom.DisconnectCause;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.StatusHints;
+import android.telecom.TelecomManager;
+import android.telecom.VideoProfile;
+
+import java.util.ArrayList;
+
+/**
+ * Extended suite of tests that use {@link CtsConnectionService} and {@link MockInCallService} to
+ * verify the functionality of Call Conferencing.
+ */
+public class ConferenceTest extends BaseTelecomTestWithMockServices {
+
+    public static final int CONF_CAPABILITIES = Connection.CAPABILITY_SEPARATE_FROM_CONFERENCE |
+            Connection.CAPABILITY_DISCONNECT_FROM_CONFERENCE | Connection.CAPABILITY_HOLD |
+            Connection.CAPABILITY_MERGE_CONFERENCE | Connection.CAPABILITY_SWAP_CONFERENCE;
+
+    private Call mCall1, mCall2;
+    private MockConnection mConnection1, mConnection2;
+    MockInCallService mInCallService;
+    Conference mConferenceObject;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mContext = getInstrumentation().getContext();
+        if (mShouldTestTelecom) {
+            addOutgoingCalls();
+            addConferenceCall(mCall1, mCall2);
+            // Use vanilla conference object so that the CTS coverage tool detects the useage.
+            mConferenceObject = verifyConferenceForOutgoingCall();
+            verifyConferenceObject(mConferenceObject, mConnection1, mConnection2);
+        }
+    }
+
+    public void testConferenceCreate() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        final Call conf = mInCallService.getLastConferenceCall();
+        assertCallState(conf, Call.STATE_ACTIVE);
+
+        if (mCall1.getParent() != conf || mCall2.getParent() != conf) {
+            fail("The 2 participating calls should contain the conference call as its parent");
+        }
+        if (!(conf.getChildren().contains(mCall1) && conf.getChildren().contains(mCall2))) {
+            fail("The conference call should contain the 2 participating calls as its children");
+        }
+        assertTrue(mConferenceObject.getConnections().contains(mConnection1));
+
+        assertConnectionState(mConferenceObject.getConnections().get(0), Connection.STATE_ACTIVE);
+        assertConnectionState(mConferenceObject.getConnections().get(1), Connection.STATE_ACTIVE);
+        assertConferenceState(mConferenceObject, Connection.STATE_ACTIVE);
+    }
+
+    public void testConferenceSplit() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        final Call conf = mInCallService.getLastConferenceCall();
+        assertCallState(conf, Call.STATE_ACTIVE);
+
+        if (!(mCall1.getParent() == conf) && (conf.getChildren().contains(mCall1))) {
+            fail("Call 1 not conferenced");
+        }
+        assertTrue(mConferenceObject.getConnections().contains(mConnection1));
+
+        splitFromConferenceCall(mCall1);
+
+        if ((mCall1.getParent() == conf) || (conf.getChildren().contains(mCall1))) {
+            fail("Call 1 should not be still conferenced");
+        }
+        assertFalse(mConferenceObject.getConnections().contains(mConnection1));
+    }
+
+    public void testConferenceHoldAndUnhold() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        final Call conf = mInCallService.getLastConferenceCall();
+        assertCallState(conf, Call.STATE_ACTIVE);
+
+        conf.hold();
+        assertCallState(conf, Call.STATE_HOLDING);
+        assertCallState(mCall1, Call.STATE_HOLDING);
+        assertCallState(mCall2, Call.STATE_HOLDING);
+
+        conf.unhold();
+        assertCallState(conf, Call.STATE_ACTIVE);
+        assertCallState(mCall1, Call.STATE_ACTIVE);
+        assertCallState(mCall2, Call.STATE_ACTIVE);
+    }
+
+    public void testConferenceMergeAndSwap() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        final Call conf = mInCallService.getLastConferenceCall();
+        assertCallState(conf, Call.STATE_ACTIVE);
+
+        conf.mergeConference();
+        assertCallDisplayName(mCall1, TestUtils.MERGE_CALLER_NAME);
+        assertCallDisplayName(mCall2, TestUtils.MERGE_CALLER_NAME);
+        assertConnectionCallDisplayName(mConferenceObject.getConnections().get(0),
+                TestUtils.MERGE_CALLER_NAME);
+        assertConnectionCallDisplayName(mConferenceObject.getConnections().get(1),
+                TestUtils.MERGE_CALLER_NAME);
+
+        conf.swapConference();
+        assertCallDisplayName(mCall1, TestUtils.SWAP_CALLER_NAME);
+        assertCallDisplayName(mCall2, TestUtils.SWAP_CALLER_NAME);
+        assertConnectionCallDisplayName(mConferenceObject.getConnections().get(0),
+                TestUtils.SWAP_CALLER_NAME);
+        assertConnectionCallDisplayName(mConferenceObject.getConnections().get(1),
+                TestUtils.SWAP_CALLER_NAME);
+
+    }
+
+    public void testConferenceSetters() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        final Call conf = mInCallService.getLastConferenceCall();
+        assertCallState(conf, Call.STATE_ACTIVE);
+
+        placeAndVerifyCall();
+        MockConnection newConnection = verifyConnectionForOutgoingCall(2);
+        final Call newCall = mInCallService.getLastCall();
+
+        ArrayList<Connection> connectionList = new ArrayList<>();
+        connectionList.add(newConnection);
+        ArrayList<Call> callList = new ArrayList<>();
+        callList.add(newCall);
+
+        assertFalse(conf.getDetails().can(Call.Details.CAPABILITY_MUTE));
+        int capabilities = mConferenceObject.getConnectionCapabilities() |
+                Connection.CAPABILITY_MUTE;
+        mConferenceObject.setConnectionCapabilities(capabilities);
+        assertCallCapability(conf, Call.Details.CAPABILITY_MUTE);
+
+        assertFalse(conf.getConferenceableCalls().contains(newCall));
+        mConferenceObject.setConferenceableConnections(connectionList);
+        assertCallConferenceableList(conf, callList);
+
+        mConferenceObject.setConnectionTime(0);
+
+        Bundle extras = new Bundle();
+        extras.putString(TelecomManager.EXTRA_CALL_DISCONNECT_MESSAGE, "Test");
+        assertNull(conf.getDetails().getExtras());
+        mConferenceObject.setExtras(extras);
+        assertCallExtras(conf, TelecomManager.EXTRA_CALL_DISCONNECT_MESSAGE, "Test");
+
+        StatusHints hints = new StatusHints("Test", null, null);
+        assertNull(conf.getDetails().getStatusHints());
+        mConferenceObject.setStatusHints(hints);
+        assertCallStatusHints(conf, hints);
+
+        assertFalse(conf.getChildren().contains(newCall));
+        mConferenceObject.addConnection(newConnection);
+        assertCallChildrenContains(conf, newCall, true);
+
+        assertTrue(conf.getChildren().contains(newCall));
+        mConferenceObject.removeConnection(newConnection);
+        assertCallChildrenContains(conf, newCall, false);
+
+        assertVideoState(conf, VideoProfile.STATE_AUDIO_ONLY);
+        final MockVideoProvider mockVideoProvider = mConnection1.getMockVideoProvider();
+        mConferenceObject.setVideoProvider(mConnection1, mockVideoProvider);
+        mConferenceObject.setVideoState(mConnection1, VideoProfile.STATE_BIDIRECTIONAL);
+        assertVideoState(conf, VideoProfile.STATE_BIDIRECTIONAL);
+
+        // Dialing state is unsupported for conference calls. so, the state remains active.
+        mConferenceObject.setDialing();
+        assertCallState(conf, Call.STATE_ACTIVE);
+
+        mConferenceObject.setOnHold();
+        assertCallState(conf, Call.STATE_HOLDING);
+
+        mConferenceObject.setActive();
+        assertCallState(conf, Call.STATE_ACTIVE);
+
+        mConferenceObject.setDisconnected(new DisconnectCause(DisconnectCause.LOCAL));
+        assertCallState(conf, Call.STATE_DISCONNECTED);
+
+        // Destroy state is unsupported for conference calls. so, the state remains active.
+        mConferenceObject.destroy();
+        assertCallState(conf, Call.STATE_DISCONNECTED);
+    }
+
+    public void testConferenceAddAndRemoveConnection() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        final Call conf = mInCallService.getLastConferenceCall();
+        assertCallState(conf, Call.STATE_ACTIVE);
+
+        placeAndVerifyCall();
+        MockConnection newConnection = verifyConnectionForOutgoingCall(2);
+        final Call newCall = mInCallService.getLastCall();
+
+        ArrayList<Connection> connectionList = new ArrayList<>();
+        connectionList.add(newConnection);
+        ArrayList<Call> callList = new ArrayList<>();
+        callList.add(newCall);
+
+        assertFalse(conf.getChildren().contains(newCall));
+        mConferenceObject.addConnection(newConnection);
+        assertCallChildrenContains(conf, newCall, true);
+
+        assertTrue(conf.getChildren().contains(newCall));
+        mConferenceObject.removeConnection(newConnection);
+        assertCallChildrenContains(conf, newCall, false);
+    }
+
+    public void testConferenceDTMFTone() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        final Call conf = mInCallService.getLastConferenceCall();
+        assertCallState(conf, Call.STATE_ACTIVE);
+
+        assertTrue(((MockConference)mConferenceObject).getDtmfString().isEmpty());
+        conf.playDtmfTone('1');
+        assertDtmfString((MockConference)mConferenceObject, "1");
+        conf.stopDtmfTone();
+        assertDtmfString((MockConference)mConferenceObject, "1.");
+        conf.playDtmfTone('3');
+        assertDtmfString((MockConference)mConferenceObject, "1.3");
+        conf.stopDtmfTone();
+        assertDtmfString((MockConference)mConferenceObject, "1.3.");
+    }
+
+    private void verifyConferenceObject(Conference mConferenceObject, MockConnection connection1,
+            MockConnection connection2) {
+        assertNull(mConferenceObject.getCallAudioState());
+        assertTrue(mConferenceObject.getConferenceableConnections().isEmpty());
+        assertEquals(connection1.getConnectionCapabilities(),
+                mConferenceObject.getConnectionCapabilities());
+        assertEquals(connection1.getState(), mConferenceObject.getState());
+        assertEquals(connection2.getState(), mConferenceObject.getState());
+        assertTrue(mConferenceObject.getConnections().contains(connection1));
+        assertTrue(mConferenceObject.getConnections().contains(connection2));
+        assertEquals(connection1.getDisconnectCause(), mConferenceObject.getDisconnectCause());
+        assertEquals(connection1.getExtras(), mConferenceObject.getExtras());
+        assertEquals(connection1.getPhoneAccountHandle(), mConferenceObject.getPhoneAccountHandle());
+        assertEquals(connection1.getStatusHints(), mConferenceObject.getStatusHints());
+        assertEquals(VideoProfile.STATE_AUDIO_ONLY, mConferenceObject.getVideoState());
+        assertNull(mConferenceObject.getVideoProvider());
+    }
+
+    private void addOutgoingCalls() {
+        try {
+            PhoneAccount account = setupConnectionService(
+                    new MockConnectionService() {
+                        @Override
+                        public Connection onCreateOutgoingConnection(
+                                PhoneAccountHandle connectionManagerPhoneAccount,
+                                ConnectionRequest request) {
+                            Connection connection = super.onCreateOutgoingConnection(
+                                    connectionManagerPhoneAccount,
+                                    request);
+                            // Modify the connection object created with local values.
+                            int capabilities = connection.getConnectionCapabilities();
+                            connection.setConnectionCapabilities(capabilities | CONF_CAPABILITIES);
+                            return connection;
+                        }
+                    }, FLAG_REGISTER | FLAG_ENABLE);
+        } catch(Exception e) {
+            fail("Error in setting up the connection services");
+        }
+
+        placeAndVerifyCall();
+        mConnection1 = verifyConnectionForOutgoingCall(0);
+        mInCallService = mInCallCallbacks.getService();
+        mCall1 = mInCallService.getLastCall();
+        assertCallState(mCall1, Call.STATE_DIALING);
+        mConnection1.setActive();
+        assertCallState(mCall1, Call.STATE_ACTIVE);
+
+        placeAndVerifyCall();
+        mConnection2 = verifyConnectionForOutgoingCall(1);
+        mCall2 = mInCallService.getLastCall();
+        assertCallState(mCall2, Call.STATE_DIALING);
+        mConnection2.setActive();
+        assertCallState(mCall2, Call.STATE_ACTIVE);
+
+        setAndVerifyConferenceablesForOutgoingConnection(0);
+        setAndVerifyConferenceablesForOutgoingConnection(1);
+    }
+
+    private void assertCallCapability(final Call call, final int capability) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return true;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return call.getDetails().can(capability);
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Call should have capability " + capability
+        );
+    }
+
+    private void assertCallConnectTime(final Call call, final int connectTime) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return connectTime;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return call.getDetails().getConnectTimeMillis();
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Call should have connect time " + connectTime
+        );
+    }
+
+    private void assertCallExtras(final Call call, final String key, final String value) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return value;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return call.getDetails().getExtras() != null ?
+                            call.getDetails().getExtras().getString(key) : null;
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Call should have extra " + key + "=" + value
+        );
+    }
+
+    private void assertCallStatusHints(final Call call, final StatusHints hints) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return hints;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return call.getDetails().getStatusHints();
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Call should have status hints " + hints
+        );
+    }
+
+    private void assertCallChildrenContains(final Call call, final Call childrenCall,
+                                            final boolean expected) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return expected;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return call.getChildren().contains(childrenCall);
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                expected == true ? "Call should have child call " + childrenCall :
+                        "Call should not have child call " + childrenCall
+        );
+    }
+
+    private void assertVideoState(final Call call, final int videoState) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return videoState;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return call.getDetails().getVideoState();
+                    }
+                },
+                TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Call should be in videoState " + videoState
+        );
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/ConnectionServiceTest.java b/tests/tests/telecom/src/android/telecom/cts/ConnectionServiceTest.java
new file mode 100644
index 0000000..afaa3eb
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/ConnectionServiceTest.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import static android.telecom.cts.TestUtils.*;
+
+import android.telecom.Call;
+import android.telecom.Connection;
+import android.telecom.ConnectionService;
+import android.util.Log;
+
+import java.util.Collection;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Test some additional {@link ConnectionService} APIs not already covered by other tests.
+ */
+public class ConnectionServiceTest extends BaseTelecomTestWithMockServices {
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mContext = getInstrumentation().getContext();
+        if (mShouldTestTelecom) {
+            setupConnectionService(null, FLAG_REGISTER | FLAG_ENABLE);
+        }
+    }
+
+    public void testAddExistingConnection() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall();
+        verifyConnectionForOutgoingCall();
+
+        final MockConnection connection = new MockConnection();
+        connection.setOnHold();
+        CtsConnectionService.addExistingConnectionToTelecom(TEST_PHONE_ACCOUNT_HANDLE, connection);
+
+        try {
+            if (!mInCallCallbacks.lock.tryAcquire(3, TimeUnit.SECONDS)) {
+                fail("No call added to InCallService.");
+            }
+        } catch (InterruptedException e) {
+            Log.i(TAG, "Test interrupted!");
+        }
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        final Call call = inCallService.getLastCall();
+        assertCallState(call, Call.STATE_HOLDING);
+    }
+
+    public void testGetAllConnections() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        // Add first connection (outgoing call)
+        placeAndVerifyCall();
+        final Connection connection1 = verifyConnectionForOutgoingCall();
+
+        Collection<Connection> connections = CtsConnectionService.getAllConnectionsFromTelecom();
+        assertEquals(1, connections.size());
+        assertTrue(connections.contains(connection1));
+
+        // Add second connection (add existing connection)
+        final Connection connection2 = new MockConnection();
+        CtsConnectionService.addExistingConnectionToTelecom(TEST_PHONE_ACCOUNT_HANDLE, connection2);
+
+        connections = CtsConnectionService.getAllConnectionsFromTelecom();
+        assertEquals(2, connections.size());
+        assertTrue(connections.contains(connection2));
+
+        // Add third connection (incoming call)
+        addAndVerifyNewIncomingCall(getTestNumber(), null);
+        final Connection connection3 = verifyConnectionForIncomingCall();
+        connections = CtsConnectionService.getAllConnectionsFromTelecom();
+        assertEquals(3, connections.size());
+        assertTrue(connections.contains(connection3));
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/ConnectionTest.java b/tests/tests/telecom/src/android/telecom/cts/ConnectionTest.java
new file mode 100644
index 0000000..b6818c8
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/ConnectionTest.java
@@ -0,0 +1,322 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import static android.telecom.cts.TestUtils.shouldTestTelecom;
+
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.telecom.Connection;
+import android.telecom.DisconnectCause;
+import android.telecom.StatusHints;
+import android.telecom.TelecomManager;
+import android.test.AndroidTestCase;
+
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+public class ConnectionTest extends AndroidTestCase {
+
+    public void testStateCallbacks() {
+        if (!shouldTestTelecom(getContext())) {
+            return;
+        }
+
+        final Semaphore lock = new Semaphore(0);
+        Connection connection = createConnection(lock);
+
+        waitForStateChange(lock);
+        assertEquals(Connection.STATE_NEW, connection.getState());
+
+        connection.setInitializing();
+        waitForStateChange(lock);
+        assertEquals(Connection.STATE_INITIALIZING, connection.getState());
+
+        connection.setInitialized();
+        waitForStateChange(lock);
+        assertEquals(Connection.STATE_NEW, connection.getState());
+
+        connection.setRinging();
+        waitForStateChange(lock);
+        assertEquals(Connection.STATE_RINGING, connection.getState());
+
+        connection.setDialing();
+        waitForStateChange(lock);
+        assertEquals(Connection.STATE_DIALING, connection.getState());
+
+        connection.setActive();
+        waitForStateChange(lock);
+        assertEquals(Connection.STATE_ACTIVE, connection.getState());
+
+        connection.setOnHold();
+        waitForStateChange(lock);
+        assertEquals(Connection.STATE_HOLDING, connection.getState());
+
+        connection.setDisconnected(
+                new DisconnectCause(DisconnectCause.LOCAL, "Test call"));
+        waitForStateChange(lock);
+        assertEquals(Connection.STATE_DISCONNECTED, connection.getState());
+
+        connection.setRinging();
+        waitForStateChange(lock);
+        assertEquals("Connection should not move out of STATE_DISCONNECTED.",
+                Connection.STATE_DISCONNECTED, connection.getState());
+    }
+
+    /**
+     * {@link UnsupportedOperationException} is only thrown in L MR1+.
+     */
+    public void testFailedState() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) {
+            return;
+        }
+        Connection connection = Connection.createFailedConnection(
+                new DisconnectCause(DisconnectCause.LOCAL, "Test call"));
+        assertEquals(Connection.STATE_DISCONNECTED, connection.getState());
+
+        try {
+            connection.setRinging();
+        } catch (UnsupportedOperationException e) {
+            return;
+        }
+        fail("Connection should not move out of STATE_DISCONNECTED");
+    }
+
+    /**
+     * {@link UnsupportedOperationException} is only thrown in L MR1+.
+     */
+    public void testCanceledState() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) {
+            return;
+        }
+        Connection connection = Connection.createCanceledConnection();
+        assertEquals(Connection.STATE_DISCONNECTED, connection.getState());
+
+        try {
+            connection.setDialing();
+        } catch (UnsupportedOperationException e) {
+            return;
+        }
+        fail("Connection should not move out of STATE_DISCONNECTED");
+    }
+
+    public void testSetAndGetCallerDisplayName() {
+        if (!shouldTestTelecom(getContext())) {
+            return;
+        }
+
+        final Semaphore lock = new Semaphore(0);
+        Connection connection = createConnection(lock);
+        waitForStateChange(lock);
+
+        connection.setCallerDisplayName("Test User", TelecomManager.PRESENTATION_ALLOWED);
+        assertEquals("Test User", connection.getCallerDisplayName());
+        assertEquals(TelecomManager.PRESENTATION_ALLOWED,
+                connection.getCallerDisplayNamePresentation());
+    }
+
+    public void testSetAndGetAddress() {
+        if (!shouldTestTelecom(getContext())) {
+            return;
+        }
+
+        final Semaphore lock = new Semaphore(0);
+        Connection connection = createConnection(lock);
+        waitForStateChange(lock);
+
+        final Uri address = Uri.fromParts("tel", "1234567", null);
+        connection.setAddress(address, TelecomManager.PRESENTATION_UNKNOWN);
+        assertEquals(address, connection.getAddress());
+        assertEquals(TelecomManager.PRESENTATION_UNKNOWN, connection.getAddressPresentation());
+    }
+
+    public void testSetAndGetConnectionCapabilities() {
+        if (!shouldTestTelecom(getContext())) {
+            return;
+        }
+
+        final Semaphore lock = new Semaphore(0);
+        Connection connection = createConnection(lock);
+        waitForStateChange(lock);
+
+        final int capabilities = Connection.CAPABILITY_HOLD | Connection.CAPABILITY_CAN_PAUSE_VIDEO
+                | Connection.CAPABILITY_MANAGE_CONFERENCE | Connection.CAPABILITY_RESPOND_VIA_TEXT;
+
+        connection.setConnectionCapabilities(capabilities);
+
+        assertEquals(capabilities, connection.getConnectionCapabilities());
+    }
+
+    public void testSetAndGetDisconnectCause() {
+        if (!shouldTestTelecom(getContext())) {
+            return;
+        }
+
+        final Semaphore lock = new Semaphore(0);
+        Connection connection = createConnection(lock);
+        waitForStateChange(lock);
+        assertEquals(Connection.STATE_NEW, connection.getState());
+
+        final DisconnectCause disconnectCause = new DisconnectCause(DisconnectCause.REJECTED,
+                "No friends", "No friends to talk to", "No friends to talk to");
+
+        connection.setDisconnected(disconnectCause);
+
+        assertEquals(Connection.STATE_DISCONNECTED, connection.getState());
+        assertEquals(disconnectCause, connection.getDisconnectCause());
+    }
+
+    public void testSetAndGetAudioModeIsVoip() {
+        if (!shouldTestTelecom(getContext())) {
+            return;
+        }
+
+        final Semaphore lock = new Semaphore(0);
+        Connection connection = createConnection(lock);
+        waitForStateChange(lock);
+
+        assertFalse(connection.getAudioModeIsVoip());
+        connection.setAudioModeIsVoip(true);
+        assertTrue(connection.getAudioModeIsVoip());
+    }
+
+    public void testSetAndGetExtras() {
+        if (!shouldTestTelecom(getContext())) {
+            return;
+        }
+
+        final Semaphore lock = new Semaphore(0);
+        Connection connection = createConnection(lock);
+        waitForStateChange(lock);
+
+        assertEquals(null, connection.getExtras());
+
+        final Bundle extras = new Bundle();
+        extras.putBoolean("test-extra-key", true);
+        connection.setExtras(extras);
+
+        final Bundle retrieved = connection.getExtras();
+        assertNotNull(retrieved);
+        assertTrue(extras.getBoolean("test-extra-key"));
+    }
+
+    public void testSetAndGetStatusHints() {
+        if (!shouldTestTelecom(getContext())) {
+            return;
+        }
+
+        final Semaphore lock = new Semaphore(0);
+        Connection connection = createConnection(lock);
+        waitForStateChange(lock);
+
+        assertEquals(null, connection.getStatusHints());
+
+        final StatusHints statusHints = new StatusHints("Test", null, null);
+        connection.setStatusHints(statusHints);
+        assertEquals(statusHints, connection.getStatusHints());
+    }
+
+    public void testSetAndGetRingbackRequested() {
+        if (!shouldTestTelecom(getContext())) {
+            return;
+        }
+
+        final Semaphore lock = new Semaphore(0);
+        Connection connection = createConnection(lock);
+        waitForStateChange(lock);
+
+        assertFalse(connection.isRingbackRequested());
+
+        connection.setRingbackRequested(true);
+        assertTrue(connection.isRingbackRequested());
+    }
+
+    public void testSetAndGetVideoProvider() {
+        if (!shouldTestTelecom(getContext())) {
+            return;
+        }
+
+        final Semaphore lock = new Semaphore(0);
+        Connection connection = createConnection(lock);
+        waitForStateChange(lock);
+
+        assertNull(connection.getVideoProvider());
+
+        final Connection.VideoProvider videoProvider = new MockVideoProvider(null);
+        connection.setVideoProvider(videoProvider);
+        assertEquals(videoProvider, connection.getVideoProvider());
+    }
+
+    public void testStateToString() {
+        if (!shouldTestTelecom(getContext())) {
+            return;
+        }
+
+        assertEquals("INITIALIZING", Connection.stateToString(Connection.STATE_INITIALIZING));
+        assertEquals("NEW", Connection.stateToString(Connection.STATE_NEW));
+        assertEquals("RINGING", Connection.stateToString(Connection.STATE_RINGING));
+        assertEquals("DIALING", Connection.stateToString(Connection.STATE_DIALING));
+        assertEquals("ACTIVE", Connection.stateToString(Connection.STATE_ACTIVE));
+        assertEquals("HOLDING", Connection.stateToString(Connection.STATE_HOLDING));
+        assertEquals("DISCONNECTED", Connection.stateToString(Connection.STATE_DISCONNECTED));
+    }
+
+    public void testCapabilitiesToString() {
+        if (!shouldTestTelecom(getContext())) {
+            return;
+        }
+
+        assertEquals("[Capabilities: CAPABILITY_HOLD]",
+                Connection.capabilitiesToString(Connection.CAPABILITY_HOLD));
+        assertEquals("[Capabilities: CAPABILITY_MUTE]",
+                Connection.capabilitiesToString(Connection.CAPABILITY_MUTE));
+        assertEquals("[Capabilities: CAPABILITY_HOLD "
+                + "CAPABILITY_RESPOND_VIA_TEXT "
+                + "CAPABILITY_MANAGE_CONFERENCE]",
+                Connection.capabilitiesToString(Connection.CAPABILITY_HOLD
+                        | Connection.CAPABILITY_RESPOND_VIA_TEXT
+                        | Connection.CAPABILITY_MANAGE_CONFERENCE));
+    }
+
+    private static Connection createConnection(final Semaphore lock) {
+        BasicConnection connection = new BasicConnection();
+        connection.setLock(lock);
+        return connection;
+    }
+
+    private static void waitForStateChange(Semaphore lock) {
+        try {
+            lock.tryAcquire(1000, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException e) {
+            fail("State transition timed out");
+        }
+    }
+
+    private static final class BasicConnection extends Connection {
+        private Semaphore mLock;
+
+        public void setLock(Semaphore lock) {
+            mLock = lock;
+        }
+
+        @Override
+        public void onStateChanged(int state) {
+            mLock.release();
+        }
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/CtsConnectionService.java b/tests/tests/telecom/src/android/telecom/cts/CtsConnectionService.java
new file mode 100644
index 0000000..3c30e6b
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/CtsConnectionService.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import android.telecom.Conference;
+import android.telecom.Connection;
+import android.telecom.ConnectionRequest;
+import android.telecom.ConnectionService;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.RemoteConference;
+import android.telecom.RemoteConnection;
+
+import java.util.Collection;
+
+/**
+ * This is the official ConnectionService for Telecom's CTS App. Since telecom requires that a
+ * CS be registered in the AndroidManifest.xml file, we have to have a single implementation
+ * of a CS and this is it. To test specific CS behavior, tests will implement their own CS and
+ * tell CtsConnectionService to forward any method invocations to that test's implementation.
+ * This is set up using {@link #setUp} and should be cleaned up before the end of the test using
+ * {@link #tearDown}.
+ *
+ * sConnectionService: Contains the connection service object provided by the current test in
+ *                     progress. We use this object to forward any communication received from the
+ *                     Telecom framework to the test connection service.
+ * sTelecomConnectionService: Contains the connection service object registered to the Telecom
+ *                            framework. We use this object to forward any communication from the
+ *                            test connection service to the Telecom framework.
+ *
+ */
+public class CtsConnectionService extends ConnectionService {
+    // This is the connection service implemented by the test
+    private static ConnectionService sConnectionService;
+    // This is the connection service registered with Telecom
+    private static ConnectionService sTelecomConnectionService;
+
+    public CtsConnectionService() throws Exception {
+        super();
+        sTelecomConnectionService = this;
+    }
+
+    // ConnectionService used by default as a fallback if no connection service is specified
+    // during test setup.
+    private static ConnectionService mMockConnectionService = new MockConnectionService();
+
+    /**
+     * Used to control whether the {@link MockVideoProvider} will be created when connections are
+     * created.  Used by {@link VideoCallTest#testVideoCallDelayProvider()} to test scenario where
+     * the {@link MockVideoProvider} is not created immediately when the Connection is created.
+     */
+    private static Object sLock = new Object();
+
+    public static void setUp(PhoneAccountHandle phoneAccountHandle,
+            ConnectionService connectionService)
+            throws Exception {
+        synchronized(sLock) {
+            if (sConnectionService != null) {
+                throw new Exception("Mock ConnectionService exists.  Failed to call tearDown().");
+            }
+            sConnectionService = connectionService;
+        }
+    }
+
+    public static void tearDown() {
+        synchronized(sLock) {
+            sConnectionService = null;
+        }
+    }
+
+    @Override
+    public Connection onCreateOutgoingConnection(PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        synchronized(sLock) {
+            if (sConnectionService != null) {
+                return sConnectionService.onCreateOutgoingConnection(
+                        connectionManagerPhoneAccount, request);
+            } else {
+                return mMockConnectionService.onCreateOutgoingConnection(
+                        connectionManagerPhoneAccount, request);
+            }
+        }
+    }
+
+    @Override
+    public Connection onCreateIncomingConnection(PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        synchronized(sLock) {
+            if (sConnectionService != null) {
+                return sConnectionService.onCreateIncomingConnection(
+                        connectionManagerPhoneAccount, request);
+            } else {
+                return mMockConnectionService.onCreateIncomingConnection(
+                        connectionManagerPhoneAccount, request);
+            }
+        }
+    }
+
+    @Override
+    public void onConference(Connection connection1, Connection connection2) {
+        synchronized(sLock) {
+            if (sConnectionService != null) {
+                sConnectionService.onConference(connection1, connection2);
+            } else {
+                mMockConnectionService.onConference(connection1, connection2);
+            }
+        }
+    }
+
+    @Override
+    public void onRemoteExistingConnectionAdded(RemoteConnection connection) {
+        synchronized(sLock) {
+            if (sConnectionService != null) {
+                sConnectionService.onRemoteExistingConnectionAdded(connection);
+            } else {
+                mMockConnectionService.onRemoteExistingConnectionAdded(connection);
+            }
+        }
+    }
+
+    public static void addConferenceToTelecom(Conference conference) {
+        synchronized(sLock) {
+            sTelecomConnectionService.addConference(conference);
+        }
+    }
+
+    public static void addExistingConnectionToTelecom(
+            PhoneAccountHandle phoneAccountHandle, Connection connection) {
+        synchronized(sLock) {
+            sTelecomConnectionService.addExistingConnection(phoneAccountHandle, connection);
+        }
+    }
+
+    public static Collection<Connection> getAllConnectionsFromTelecom() {
+        synchronized(sLock) {
+            return sTelecomConnectionService.getAllConnections();
+        }
+    }
+
+    public static RemoteConnection createRemoteOutgoingConnectionToTelecom(
+            PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        synchronized(sLock) {
+            return sTelecomConnectionService.createRemoteOutgoingConnection(
+                    connectionManagerPhoneAccount, request);
+        }
+    }
+
+    public static RemoteConnection createRemoteIncomingConnectionToTelecom(
+            PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        synchronized(sLock) {
+            return sTelecomConnectionService.createRemoteIncomingConnection(
+                    connectionManagerPhoneAccount, request);
+        }
+    }
+
+    @Override
+    public void onRemoteConferenceAdded(RemoteConference conference) {
+        synchronized(sLock) {
+            if (sConnectionService != null) {
+                sConnectionService.onRemoteConferenceAdded(conference);
+            } else {
+                mMockConnectionService.onRemoteConferenceAdded(conference);
+            }
+        }
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/CtsRemoteConnectionService.java b/tests/tests/telecom/src/android/telecom/cts/CtsRemoteConnectionService.java
new file mode 100644
index 0000000..3738487
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/CtsRemoteConnectionService.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import android.telecom.Conference;
+import android.telecom.Connection;
+import android.telecom.ConnectionRequest;
+import android.telecom.ConnectionService;
+import android.telecom.PhoneAccountHandle;
+
+/**
+ * This is the Remote ConnectionService for Telecom's CTS App. Since telecom requires that a
+ * CS be registered in the AndroidManifest.xml file, we have to have a single implementation
+ * of a CS and this is it. To test specific CS behavior, tests will implement their own CS and
+ * tell CtsRemoteConnectionService to forward any method invocations to that test's implementation.
+ * This is set up using {@link #setUp} and should be cleaned up before the end of the test using
+ * {@link #tearDown}.
+ *
+ * sConnectionService: Contains the connection service object provided by the current test in
+ *                     progress. We use this object to forward any communication received from the
+ *                     Telecom framework to the test connection service.
+ * sTelecomConnectionService: Contains the connection service object registered to the Telecom
+ *                            framework. We use this object to forward any communication from the
+ *                            test connection service to the Telecom framework.
+ *
+ */
+public class CtsRemoteConnectionService extends ConnectionService {
+    // This is the connection service implemented by the test
+    private static ConnectionService sConnectionService;
+    // This is the connection service registered with Telecom
+    private static ConnectionService sTelecomConnectionService;
+
+    public CtsRemoteConnectionService() throws Exception {
+        super();
+        if (sTelecomConnectionService != null) {
+            throw new Exception("Telecom ConnectionService exists");
+        }
+        sTelecomConnectionService = this;
+    }
+
+    // ConnectionService used by default as a fallback if no connection service is specified
+    // during test setup.
+    private static ConnectionService mMockConnectionService = new MockConnectionService();
+
+    /**
+     * Used to control whether the {@link MockVideoProvider} will be created when connections are
+     * created.  Used by {@link VideoCallTest#testVideoCallDelayProvider()} to test scenario where
+     * the {@link MockVideoProvider} is not created immediately when the Connection is created.
+     */
+    private static Object sLock = new Object();
+
+    public static void setUp(PhoneAccountHandle phoneAccountHandle,
+            ConnectionService connectionService)
+            throws Exception {
+        synchronized(sLock) {
+            if (sConnectionService != null) {
+                throw new Exception("Mock ConnectionService exists.  Failed to call tearDown().");
+            }
+            sConnectionService = connectionService;
+        }
+    }
+
+    public static void tearDown() {
+        synchronized(sLock) {
+            sConnectionService = null;
+        }
+    }
+
+    @Override
+    public Connection onCreateOutgoingConnection(PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        synchronized(sLock) {
+            if (sConnectionService != null) {
+                return sConnectionService.onCreateOutgoingConnection(
+                        connectionManagerPhoneAccount, request);
+            } else {
+                return mMockConnectionService.onCreateOutgoingConnection(
+                        connectionManagerPhoneAccount, request);
+            }
+        }
+    }
+
+    @Override
+    public Connection onCreateIncomingConnection(PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        synchronized(sLock) {
+            if (sConnectionService != null) {
+                return sConnectionService.onCreateIncomingConnection(
+                        connectionManagerPhoneAccount, request);
+            } else {
+                return mMockConnectionService.onCreateIncomingConnection(
+                        connectionManagerPhoneAccount, request);
+            }
+        }
+    }
+
+    @Override
+    public void onConference(Connection connection1, Connection connection2) {
+        synchronized(sLock) {
+            if (sConnectionService != null) {
+                sConnectionService.onConference(connection1, connection2);
+            } else {
+                mMockConnectionService.onConference(connection1, connection2);
+            }
+        }
+    }
+
+    public static void addConferenceToTelecom(Conference conference) {
+        synchronized(sLock) {
+            sTelecomConnectionService.addConference(conference);
+        }
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/DataObjectUnitTests.java b/tests/tests/telecom/src/android/telecom/cts/DataObjectUnitTests.java
new file mode 100644
index 0000000..1fbe0d5
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/DataObjectUnitTests.java
@@ -0,0 +1,321 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import static android.telecom.cts.TestUtils.*;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.drawable.Icon;
+import android.media.ToneGenerator;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Process;
+import android.os.UserHandle;
+import android.telecom.CallAudioState;
+import android.telecom.ConnectionRequest;
+import android.telecom.DisconnectCause;
+import android.telecom.GatewayInfo;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.StatusHints;
+import android.telecom.TelecomManager;
+import android.telecom.VideoProfile;
+import android.test.InstrumentationTestCase;
+
+import com.android.cts.telecom.R;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Verifies that the setter, getter and parcelable interfaces of the Telecom data objects are
+ * working as intended.
+ */
+public class DataObjectUnitTests extends InstrumentationTestCase {
+
+
+    public void testPhoneAccount() throws Exception {
+        Context context = getInstrumentation().getContext();
+        PhoneAccountHandle accountHandle = new PhoneAccountHandle(
+                new ComponentName(PACKAGE, COMPONENT),
+                ACCOUNT_ID);
+        Icon phoneIcon = Icon.createWithResource(context, R.drawable.ic_phone_24dp);
+        Uri tel = Uri.parse("tel:555-TEST");
+        PhoneAccount account = PhoneAccount.builder(
+                accountHandle, ACCOUNT_LABEL)
+                .setAddress(tel)
+                .setSubscriptionAddress(tel)
+                .setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER)
+                .setHighlightColor(Color.RED)
+                .setShortDescription(ACCOUNT_LABEL)
+                .setSupportedUriSchemes(Arrays.asList("tel"))
+                .setIcon(phoneIcon)
+                .build();
+        assertNotNull(account);
+        assertEquals(accountHandle, account.getAccountHandle());
+        assertEquals(tel, account.getAddress());
+        assertEquals(tel, account.getSubscriptionAddress());
+        assertEquals(PhoneAccount.CAPABILITY_CALL_PROVIDER, account.getCapabilities());
+        assertEquals(Color.RED, account.getHighlightColor());
+        assertEquals(ACCOUNT_LABEL, account.getShortDescription());
+        assertEquals(ACCOUNT_LABEL, account.getLabel());
+        assertEquals(Arrays.asList("tel"), account.getSupportedUriSchemes());
+        assertEquals(phoneIcon.toString(), account.getIcon().toString());
+        assertEquals(0, account.describeContents());
+
+        // Create a parcel of the object and recreate the object back
+        // from the parcel.
+        Parcel p = Parcel.obtain();
+        account.writeToParcel(p, 0);
+        p.setDataPosition(0);
+        PhoneAccount parcelAccount = PhoneAccount.CREATOR.createFromParcel(p);
+        assertNotNull(parcelAccount);
+        assertEquals(accountHandle, parcelAccount.getAccountHandle());
+        assertEquals(tel, parcelAccount.getAddress());
+        assertEquals(tel, parcelAccount.getSubscriptionAddress());
+        assertEquals(PhoneAccount.CAPABILITY_CALL_PROVIDER, parcelAccount.getCapabilities());
+        assertEquals(Color.RED, parcelAccount.getHighlightColor());
+        assertEquals(ACCOUNT_LABEL, parcelAccount.getShortDescription());
+        assertEquals(Arrays.asList("tel"), parcelAccount.getSupportedUriSchemes());
+        assertEquals(phoneIcon.toString(), parcelAccount.getIcon().toString());
+        assertEquals(0, parcelAccount.describeContents());
+        p.recycle();
+    }
+
+    public void testPhoneAccountHandle() throws Exception {
+        final ComponentName component = new ComponentName(PACKAGE, COMPONENT);
+        final UserHandle userHandle = Process.myUserHandle();
+        PhoneAccountHandle accountHandle = new PhoneAccountHandle(
+                component,
+                ACCOUNT_ID,
+                userHandle);
+        assertNotNull(accountHandle);
+        assertEquals(component, accountHandle.getComponentName());
+        assertEquals(ACCOUNT_ID, accountHandle.getId());
+        assertEquals(userHandle, accountHandle.getUserHandle());
+        assertEquals(0, accountHandle.describeContents());
+
+        // Create a parcel of the object and recreate the object back
+        // from the parcel.
+        Parcel p = Parcel.obtain();
+        accountHandle.writeToParcel(p, 0);
+        p.setDataPosition(0);
+        PhoneAccountHandle unparcelled = PhoneAccountHandle.CREATOR.createFromParcel(p);
+        assertEquals(accountHandle, unparcelled);
+        assertEquals(accountHandle.getComponentName(), unparcelled.getComponentName());
+        assertEquals(accountHandle.getId(), unparcelled.getId());
+        assertEquals(accountHandle.getUserHandle(), unparcelled.getUserHandle());
+        p.recycle();
+    }
+
+    public void testConnectionRequest() throws Exception {
+        PhoneAccountHandle accountHandle = new PhoneAccountHandle(
+                new ComponentName(PACKAGE, COMPONENT),
+                ACCOUNT_ID);
+        Bundle extras = new Bundle();
+        extras.putString(
+                TelecomManager.GATEWAY_PROVIDER_PACKAGE,
+                PACKAGE);
+        ConnectionRequest request = new ConnectionRequest(
+                accountHandle,
+                Uri.parse("tel:555-TEST"),
+                extras,
+                VideoProfile.STATE_AUDIO_ONLY);
+        assertEquals(accountHandle, request.getAccountHandle());
+        assertEquals(Uri.parse("tel:555-TEST"), request.getAddress());
+        assertEquals(extras.getString(
+                TelecomManager.GATEWAY_PROVIDER_PACKAGE),
+                request.getExtras().getString(TelecomManager.GATEWAY_PROVIDER_PACKAGE));
+        assertEquals(VideoProfile.STATE_AUDIO_ONLY, request.getVideoState());
+        assertEquals(0, request.describeContents());
+
+        // Create a parcel of the object and recreate the object back
+        // from the parcel.
+        Parcel p = Parcel.obtain();
+        request.writeToParcel(p, 0);
+        p.setDataPosition(0);
+        ConnectionRequest parcelRequest = ConnectionRequest.CREATOR.createFromParcel(p);
+        assertEquals(accountHandle, parcelRequest.getAccountHandle());
+        assertEquals(Uri.parse("tel:555-TEST"), parcelRequest.getAddress());
+        assertEquals(
+                extras.getString(TelecomManager.GATEWAY_PROVIDER_PACKAGE),
+                parcelRequest.getExtras().getString(TelecomManager.GATEWAY_PROVIDER_PACKAGE));
+        assertEquals(VideoProfile.STATE_AUDIO_ONLY, parcelRequest.getVideoState());
+        assertEquals(0, parcelRequest.describeContents());
+        p.recycle();
+    }
+
+    public void testDisconnectCause() throws Exception {
+        final CharSequence label = "Out of service area";
+        final CharSequence description = "Mobile network not available";
+        final String reason = "CTS Testing";
+        DisconnectCause cause = new DisconnectCause(
+                DisconnectCause.ERROR,
+                label,
+                description,
+                reason,
+                ToneGenerator.TONE_CDMA_CALLDROP_LITE);
+        assertEquals(DisconnectCause.ERROR, cause.getCode());
+        assertEquals(label, cause.getLabel());
+        assertEquals(description, cause.getDescription());
+        assertEquals(reason, cause.getReason());
+        assertEquals(ToneGenerator.TONE_CDMA_CALLDROP_LITE, cause.getTone());
+        assertEquals(0, cause.describeContents());
+
+        // Create a parcel of the object and recreate the object back
+        // from the parcel.
+        Parcel p = Parcel.obtain();
+        cause.writeToParcel(p, 0);
+        p.setDataPosition(0);
+        DisconnectCause parcelCause = DisconnectCause.CREATOR.createFromParcel(p);
+        assertEquals(DisconnectCause.ERROR, parcelCause.getCode());
+        assertEquals(label, parcelCause.getLabel());
+        assertEquals(description, parcelCause.getDescription());
+        assertEquals(reason, parcelCause.getReason());
+        assertEquals(ToneGenerator.TONE_CDMA_CALLDROP_LITE, parcelCause.getTone());
+        assertEquals(0, parcelCause.describeContents());
+        assertEquals(cause, parcelCause);
+        p.recycle();
+    }
+
+    public void testStatusHints() throws Exception {
+        Context context = getInstrumentation().getContext();
+        final CharSequence label = "Wi-Fi call";
+        Bundle extras = new Bundle();
+        extras.putString(
+                TelecomManager.GATEWAY_PROVIDER_PACKAGE,
+                PACKAGE);
+        Icon icon = Icon.createWithResource(context, R.drawable.ic_phone_24dp);
+        StatusHints hints = new StatusHints(
+                label,
+                icon,
+                extras);
+        assertEquals(label, hints.getLabel());
+        assertEquals(icon.toString(), hints.getIcon().toString());
+        assertEquals(extras.getString(
+                TelecomManager.GATEWAY_PROVIDER_PACKAGE),
+                hints.getExtras().getString(TelecomManager.GATEWAY_PROVIDER_PACKAGE));
+        assertEquals(0, hints.describeContents());
+
+        // Create a parcel of the object and recreate the object back
+        // from the parcel.
+        Parcel p = Parcel.obtain();
+        hints.writeToParcel(p, 0);
+        p.setDataPosition(0);
+        StatusHints parcelHints = StatusHints.CREATOR.createFromParcel(p);
+        assertEquals(label, parcelHints.getLabel());
+        assertEquals(icon.toString(), parcelHints.getIcon().toString());
+        assertEquals(
+                extras.getString(TelecomManager.GATEWAY_PROVIDER_PACKAGE),
+                parcelHints.getExtras().getString(TelecomManager.GATEWAY_PROVIDER_PACKAGE));
+        assertEquals(0, parcelHints.describeContents());
+        // This fails because Bundle does not have a equals implementation.
+        // assertEquals(hints, parcelHints);
+        p.recycle();
+    }
+
+    public void testGatewayInfo() throws Exception {
+        final CharSequence label = "Wi-Fi call";
+        Uri originalAddress = Uri.parse("http://www.google.com");
+        Uri gatewayAddress = Uri.parse("http://www.google.com");
+        GatewayInfo info = new GatewayInfo(
+                PACKAGE,
+                gatewayAddress,
+                originalAddress);
+        assertEquals(PACKAGE, info.getGatewayProviderPackageName());
+        assertEquals(gatewayAddress, info.getGatewayAddress());
+        assertEquals(originalAddress, info.getOriginalAddress());
+        assertEquals(0, info.describeContents());
+        assertFalse(info.isEmpty());
+
+        // Create a parcel of the object and recreate the object back
+        // from the parcel.
+        Parcel p = Parcel.obtain();
+        info.writeToParcel(p, 0);
+        p.setDataPosition(0);
+        GatewayInfo parcelInfo = GatewayInfo.CREATOR.createFromParcel(p);
+        assertEquals(PACKAGE, parcelInfo.getGatewayProviderPackageName());
+        assertEquals(gatewayAddress, parcelInfo.getGatewayAddress());
+        assertEquals(originalAddress, parcelInfo.getOriginalAddress());
+        assertEquals(0, parcelInfo.describeContents());
+        p.recycle();
+    }
+
+    public void testCallAudioState() throws Exception {
+        CallAudioState audioState = new CallAudioState(
+                true,
+                CallAudioState.ROUTE_EARPIECE,
+                CallAudioState.ROUTE_WIRED_OR_EARPIECE);
+        assertEquals(true, audioState.isMuted());
+        assertEquals(CallAudioState.ROUTE_EARPIECE, audioState.getRoute());
+        assertEquals(CallAudioState.ROUTE_WIRED_OR_EARPIECE, audioState.getSupportedRouteMask());
+        assertEquals(0, audioState.describeContents());
+        assertEquals("EARPIECE", CallAudioState.audioRouteToString(audioState.getRoute()));
+
+        // Create a parcel of the object and recreate the object back
+        // from the parcel.
+        Parcel p = Parcel.obtain();
+        audioState.writeToParcel(p, 0);
+        p.setDataPosition(0);
+        CallAudioState parcelAudioState = CallAudioState.CREATOR.createFromParcel(p);
+        assertEquals(true, parcelAudioState.isMuted());
+        assertEquals(CallAudioState.ROUTE_EARPIECE, parcelAudioState.getRoute());
+        assertEquals(CallAudioState.ROUTE_WIRED_OR_EARPIECE, parcelAudioState.getSupportedRouteMask());
+        assertEquals(0, parcelAudioState.describeContents());
+        assertEquals(audioState, parcelAudioState);
+        p.recycle();
+    }
+
+    public void testVideoProfile() throws Exception {
+        VideoProfile videoProfile = new VideoProfile(VideoProfile.STATE_BIDIRECTIONAL,
+                VideoProfile.QUALITY_HIGH);
+        assertEquals(VideoProfile.STATE_BIDIRECTIONAL, videoProfile.getVideoState());
+        assertEquals(VideoProfile.QUALITY_HIGH, videoProfile.getQuality());
+        assertEquals(0, videoProfile.describeContents());
+        assertEquals("Audio Tx Rx", VideoProfile.videoStateToString(videoProfile.getVideoState()));
+
+        // Create a parcel of the object and recreate the object back from the parcel.
+        Parcel p = Parcel.obtain();
+        videoProfile.writeToParcel(p, 0);
+        p.setDataPosition(0);
+        VideoProfile unparcelled = VideoProfile.CREATOR.createFromParcel(p);
+        assertEquals(videoProfile.getQuality(), unparcelled.getQuality());
+        assertEquals(videoProfile.getVideoState(), unparcelled.getVideoState());
+        p.recycle();
+    }
+
+    public void testCameraCapabilities() throws Exception {
+        VideoProfile.CameraCapabilities cameraCapabilities =
+                new VideoProfile.CameraCapabilities(500, 1000);
+        assertEquals(500, cameraCapabilities.getWidth());
+        assertEquals(1000, cameraCapabilities.getHeight());
+        assertEquals(0, cameraCapabilities.describeContents());
+
+        // Create a parcel of the object and recreate the object back from the parcel.
+        Parcel p = Parcel.obtain();
+        cameraCapabilities.writeToParcel(p, 0);
+        p.setDataPosition(0);
+        VideoProfile.CameraCapabilities unparcelled =
+                VideoProfile.CameraCapabilities.CREATOR.createFromParcel(p);
+        assertEquals(cameraCapabilities.getWidth(), unparcelled.getWidth());
+        assertEquals(cameraCapabilities.getHeight(), unparcelled.getHeight());
+        p.recycle();
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/DefaultDialerOperationsTest.java b/tests/tests/telecom/src/android/telecom/cts/DefaultDialerOperationsTest.java
new file mode 100644
index 0000000..b574a96
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/DefaultDialerOperationsTest.java
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import android.content.ComponentName;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.provider.VoicemailContract.Voicemails;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
+import android.test.InstrumentationTestCase;
+import android.text.TextUtils;
+
+import java.util.List;
+
+
+/**
+ * Verifies that certain privileged operations can only be performed by the default dialer.
+ */
+public class DefaultDialerOperationsTest extends InstrumentationTestCase {
+    private Context mContext;
+    private TelecomManager mTelecomManager;
+    private PhoneAccountHandle mPhoneAccountHandle;
+    private String mPreviousDefaultDialer = null;
+    private String mSystemDialer = null;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mContext = getInstrumentation().getContext();
+
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+        mPreviousDefaultDialer = TestUtils.getDefaultDialer(getInstrumentation());
+        // Reset the current dialer to the system dialer, to ensure that we start each test
+        // without being the default dialer.
+        mSystemDialer = TestUtils.getSystemDialer(getInstrumentation());
+        if (!TextUtils.isEmpty(mSystemDialer)) {
+            TestUtils.setDefaultDialer(getInstrumentation(), mSystemDialer);
+        }
+        mTelecomManager = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
+        final List<PhoneAccountHandle> accounts = mTelecomManager.getCallCapablePhoneAccounts();
+        if (accounts != null && !accounts.isEmpty()) {
+            mPhoneAccountHandle = accounts.get(0);
+        }
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (!TextUtils.isEmpty(mPreviousDefaultDialer)) {
+            // Restore the default dialer to whatever the default dialer was before the tests
+            // were started. This may or may not be the system dialer.
+            TestUtils.setDefaultDialer(getInstrumentation(), mPreviousDefaultDialer);
+        }
+        super.tearDown();
+    }
+
+    public void testGetDefaultDialerPackage() throws Exception {
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+        assertEquals(mSystemDialer, mTelecomManager.getDefaultDialerPackage());
+        TestUtils.setDefaultDialer(getInstrumentation(), TestUtils.PACKAGE);
+        assertEquals(TestUtils.PACKAGE, mTelecomManager.getDefaultDialerPackage());
+    }
+
+    public void testVoicemailReadWritePermissions() throws Exception {
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+        try {
+            mContext.getContentResolver().query(Voicemails.CONTENT_URI, null, null, null, null);
+            fail("Reading voicemails should throw SecurityException if not default Dialer");
+        } catch (SecurityException e) {
+        }
+
+        try {
+            mContext.getContentResolver().delete(Voicemails.CONTENT_URI,
+                    Voicemails._ID + "=999 AND 1=2", null);
+            fail("Deleting voicemails should throw SecurityException if not default Dialer");
+        } catch (SecurityException e) {
+        }
+
+        try {
+            mContext.getContentResolver().update(
+                    Voicemails.CONTENT_URI.buildUpon().appendPath("999").build(),
+                    new ContentValues(),
+                    null,
+                    null);
+            fail("Updating voicemails should throw SecurityException if not default Dialer");
+        } catch (SecurityException e) {
+        }
+
+        TestUtils.setDefaultDialer(getInstrumentation(), TestUtils.PACKAGE);
+        // No exception if the calling package is the default dialer.
+        mContext.getContentResolver().query(Voicemails.CONTENT_URI, null, null, null, null);
+        mContext.getContentResolver().delete(Voicemails.CONTENT_URI,
+                Voicemails._ID + "=999 AND 1=2", null);
+    }
+
+    public void testSilenceRingerPermissions() throws Exception {
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+        try {
+            mTelecomManager.silenceRinger();
+            fail("TelecomManager.silenceRinger should throw SecurityException if not default "
+                    + "dialer");
+        } catch (SecurityException e) {
+        }
+
+        TestUtils.setDefaultDialer(getInstrumentation(), TestUtils.PACKAGE);
+        // No exception if the calling package is the default dialer.
+        mTelecomManager.silenceRinger();
+    }
+
+    public void testCancelMissedCallsNotificationPermissions()
+            throws Exception {
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+        try {
+            mTelecomManager.cancelMissedCallsNotification();
+            fail("TelecomManager.cancelMissedCallsNotification should throw SecurityException if "
+                    + "not default dialer");
+        } catch (SecurityException e) {
+        }
+
+        TestUtils.setDefaultDialer(getInstrumentation(), TestUtils.PACKAGE);
+        // No exception if the calling package is the default dialer.
+        mTelecomManager.cancelMissedCallsNotification();
+    }
+
+    public void testHandlePinMmPermissions()
+            throws Exception {
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+        try {
+            mTelecomManager.handleMmi("0");
+            fail("TelecomManager.handleMmi should throw SecurityException if not default dialer");
+        } catch (SecurityException e) {
+        }
+
+        try {
+            mTelecomManager.handleMmi("0", mPhoneAccountHandle);
+            fail("TelecomManager.handleMmi should throw SecurityException if not default dialer");
+        } catch (SecurityException e) {
+        }
+
+        TestUtils.setDefaultDialer(getInstrumentation(), TestUtils.PACKAGE);
+        // No exception if the calling package is the default dialer.
+        mTelecomManager.handleMmi("0");
+        mTelecomManager.handleMmi("0", mPhoneAccountHandle);
+    }
+
+    public void testGetAdnForPhoneAccountPermissions() throws Exception {
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+        try {
+            mTelecomManager.getAdnUriForPhoneAccount(mPhoneAccountHandle);
+            fail("TelecomManager.getAdnUriForPhoneAccount should throw SecurityException if "
+                    + "not default dialer");
+        } catch (SecurityException e) {
+        }
+
+        TestUtils.setDefaultDialer(getInstrumentation(), TestUtils.PACKAGE);
+        // No exception if the calling package is the default dialer.
+        mTelecomManager.getAdnUriForPhoneAccount(mPhoneAccountHandle);
+    }
+
+    public void testSetDefaultDialerNoDialIntent_notSupported() throws Exception {
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+        final PackageManager pm = mContext.getPackageManager();
+        final ComponentName name = new ComponentName(mContext,
+                "android.telecom.cts.MockDialerActivity");
+        try {
+            pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+                    PackageManager.DONT_KILL_APP);
+
+            final String result =
+                    TestUtils.setDefaultDialer(getInstrumentation(), TestUtils.PACKAGE);
+            assertNotSame(result, TestUtils.PACKAGE);
+            assertTrue("Expected failure indicating that this was not an installed dialer app",
+                    result.contains("is not an installed Dialer app"));
+        } finally {
+            pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+                    PackageManager.DONT_KILL_APP);
+        }
+
+        // Now that the activity is present again in the package manager, this should succeed.
+        final String result = TestUtils.setDefaultDialer(getInstrumentation(), TestUtils.PACKAGE);
+        assertTrue("Expected success message indicating that " + TestUtils.PACKAGE + " was set as "
+                + "default dialer.", result.contains("set as default dialer"));
+        assertEquals(TestUtils.PACKAGE, TestUtils.getDefaultDialer(getInstrumentation()));
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/ExtendedInCallServiceTest.java b/tests/tests/telecom/src/android/telecom/cts/ExtendedInCallServiceTest.java
new file mode 100644
index 0000000..19d27af
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/ExtendedInCallServiceTest.java
@@ -0,0 +1,478 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import static android.telecom.cts.TestUtils.*;
+
+import android.content.Context;
+import android.telecom.CallAudioState;
+import android.telecom.Call;
+import android.telecom.Connection;
+import android.telecom.ConnectionService;
+import android.telecom.InCallService;
+import android.telecom.TelecomManager;
+import android.telecom.VideoProfile;
+
+import java.util.List;
+
+/**
+ * Extended suite of tests that use {@link CtsConnectionService} and {@link MockInCallService} to
+ * verify the functionality of the Telecom service.
+ */
+public class ExtendedInCallServiceTest extends BaseTelecomTestWithMockServices {
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        if (mShouldTestTelecom) {
+            setupConnectionService(null, FLAG_REGISTER | FLAG_ENABLE);
+        }
+    }
+
+    public void testAddNewOutgoingCallAndThenDisconnect() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall();
+        verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        inCallService.disconnectLastCall();
+
+        assertNumCalls(inCallService, 0);
+    }
+
+    public void testMuteAndUnmutePhone() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall();
+        final MockConnection connection = verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+
+        final Call call = inCallService.getLastCall();
+
+        assertCallState(call, Call.STATE_DIALING);
+
+        assertMuteState(connection, false);
+
+        // Explicitly call super implementation to enable detection of CTS coverage
+        ((InCallService) inCallService).setMuted(true);
+
+        assertMuteState(connection, true);
+        assertMuteState(inCallService, true);
+
+        inCallService.setMuted(false);
+        assertMuteState(connection, false);
+        assertMuteState(inCallService, false);
+    }
+
+    public void testSwitchAudioRoutes() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall();
+        final MockConnection connection = verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+
+        final Call call = inCallService.getLastCall();
+        assertCallState(call, Call.STATE_DIALING);
+
+        final int currentInvokeCount = mOnCallAudioStateChangedCounter.getInvokeCount();
+
+        // Only test speaker and earpiece modes because the other modes are dependent on having
+        // a bluetooth headset or wired headset connected.
+
+        // Explicitly call super implementation to enable detection of CTS coverage
+        ((InCallService) inCallService).setAudioRoute(CallAudioState.ROUTE_SPEAKER);
+        mOnCallAudioStateChangedCounter.waitForCount(currentInvokeCount + 1,
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertAudioRoute(connection, CallAudioState.ROUTE_SPEAKER);
+        assertAudioRoute(inCallService, CallAudioState.ROUTE_SPEAKER);
+
+        inCallService.setAudioRoute(CallAudioState.ROUTE_EARPIECE);
+        mOnCallAudioStateChangedCounter.waitForCount(currentInvokeCount + 2,
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertAudioRoute(connection, CallAudioState.ROUTE_EARPIECE);
+        assertAudioRoute(inCallService, CallAudioState.ROUTE_EARPIECE);
+    }
+
+    /**
+     * Tests that DTMF Tones are sent from the {@link InCallService} to the
+     * {@link ConnectionService} in the correct sequence.
+     *
+     * @see {@link Call#playDtmfTone(char)}
+     * @see {@link Call#stopDtmfTone()}
+     */
+    public void testPlayAndStopDtmfTones() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall();
+        final MockConnection connection = verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+
+        final Call call = inCallService.getLastCall();
+        assertCallState(call, Call.STATE_DIALING);
+
+        assertDtmfString(connection, "");
+
+        call.playDtmfTone('1');
+        assertDtmfString(connection, "1");
+
+        call.playDtmfTone('2');
+        assertDtmfString(connection, "12");
+
+        call.stopDtmfTone();
+        assertDtmfString(connection, "12.");
+
+        call.playDtmfTone('3');
+        call.playDtmfTone('4');
+        call.playDtmfTone('5');
+        assertDtmfString(connection, "12.345");
+
+        call.stopDtmfTone();
+        assertDtmfString(connection, "12.345.");
+    }
+
+    public void testHoldAndUnholdCall() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall();
+        final MockConnection connection = verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+
+        final Call call = inCallService.getLastCall();
+
+        assertCallState(call, Call.STATE_DIALING);
+
+        connection.setActive();
+
+        assertCallState(call, Call.STATE_ACTIVE);
+
+        call.hold();
+        assertCallState(call, Call.STATE_HOLDING);
+        assertEquals(Connection.STATE_HOLDING, connection.getState());
+
+        call.unhold();
+        assertCallState(call, Call.STATE_ACTIVE);
+        assertEquals(Connection.STATE_ACTIVE, connection.getState());
+    }
+
+    public void testAnswerIncomingCallAudioOnly() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        addAndVerifyNewIncomingCall(getTestNumber(), null);
+        final MockConnection connection = verifyConnectionForIncomingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+
+        final Call call = inCallService.getLastCall();
+
+        assertCallState(call, Call.STATE_RINGING);
+        assertConnectionState(connection, Connection.STATE_RINGING);
+
+        call.answer(VideoProfile.STATE_AUDIO_ONLY);
+
+        assertCallState(call, Call.STATE_ACTIVE);
+        assertConnectionState(connection, Connection.STATE_ACTIVE);
+    }
+
+    public void testAnswerIncomingCallAsVideo_SendsCorrectVideoState() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        addAndVerifyNewIncomingCall(getTestNumber(), null);
+        final MockConnection connection = verifyConnectionForIncomingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+
+        final Call call = inCallService.getLastCall();
+
+        assertCallState(call, Call.STATE_RINGING);
+        assertConnectionState(connection, Connection.STATE_RINGING);
+
+        call.answer(VideoProfile.STATE_BIDIRECTIONAL);
+
+        assertCallState(call, Call.STATE_ACTIVE);
+        assertConnectionState(connection, Connection.STATE_ACTIVE);
+        assertEquals("Connection did not receive VideoState for answered call",
+                VideoProfile.STATE_BIDIRECTIONAL, connection.videoState);
+    }
+
+    public void testRejectIncomingCall() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        addAndVerifyNewIncomingCall(getTestNumber(), null);
+        final MockConnection connection = verifyConnectionForIncomingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+
+        final Call call = inCallService.getLastCall();
+
+        assertCallState(call, Call.STATE_RINGING);
+        assertConnectionState(connection, Connection.STATE_RINGING);
+
+        call.reject(false, null);
+
+        assertCallState(call, Call.STATE_DISCONNECTED);
+        assertConnectionState(connection, Connection.STATE_DISCONNECTED);
+    }
+
+    public void testCanAddCall_CannotAddForExistingDialingCall() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall();
+        verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+
+        final Call call = inCallService.getLastCall();
+        assertCallState(call, Call.STATE_DIALING);
+
+        assertCanAddCall(inCallService, false,
+                "Should not be able to add call with existing dialing call");
+    }
+
+    public void testCanAddCall_CanAddForExistingActiveCall() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall();
+        final MockConnection connection = verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+
+        final Call call = inCallService.getLastCall();
+        assertCallState(call, Call.STATE_DIALING);
+
+        connection.setActive();
+
+        assertCallState(call, Call.STATE_ACTIVE);
+
+        assertCanAddCall(inCallService, true,
+                "Should be able to add call with only one active call");
+    }
+
+    public void testCanAddCall_CannotAddIfTooManyCalls() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall();
+        final MockConnection connection1 = verifyConnectionForOutgoingCall(0);
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        final Call call1 = inCallService.getLastCall();
+        assertCallState(call1, Call.STATE_DIALING);
+
+        connection1.setActive();
+
+        assertCallState(call1, Call.STATE_ACTIVE);
+
+        placeAndVerifyCall();
+        final MockConnection connection2 = verifyConnectionForOutgoingCall(1);
+
+        final Call call2 = inCallService.getLastCall();
+        assertCallState(call2, Call.STATE_DIALING);
+        connection2.setActive();
+        assertCallState(call2, Call.STATE_ACTIVE);
+
+        assertEquals("InCallService should have 2 calls", 2, inCallService.getCallCount());
+
+        assertCanAddCall(inCallService, false,
+                "Should not be able to add call with two calls already present");
+
+        call1.hold();
+        assertCallState(call1, Call.STATE_HOLDING);
+
+        assertCanAddCall(inCallService, false,
+                "Should not be able to add call with two calls already present");
+    }
+
+    public void testOnBringToForeground() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall();
+        verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+
+        final Call call = inCallService.getLastCall();
+
+        assertCallState(call, Call.STATE_DIALING);
+
+        assertEquals(0, mOnBringToForegroundCounter.getInvokeCount());
+
+        final TelecomManager tm =
+            (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
+
+        tm.showInCallScreen(false);
+
+        mOnBringToForegroundCounter.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+
+        assertFalse((Boolean) mOnBringToForegroundCounter.getArgs(0)[0]);
+
+        tm.showInCallScreen(true);
+
+        mOnBringToForegroundCounter.waitForCount(2, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+
+        assertTrue((Boolean) mOnBringToForegroundCounter.getArgs(1)[0]);
+    }
+
+    public void testOnPostDialWaitAndContinue() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall();
+        final MockConnection connection = verifyConnectionForOutgoingCall();
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        final Call call = inCallService.getLastCall();
+        assertCallState(call, Call.STATE_DIALING);
+
+        connection.setActive();
+        assertCallState(call, Call.STATE_ACTIVE);
+
+        final String postDialString = "12345";
+        ((Connection) connection).setPostDialWait(postDialString);
+        mOnPostDialWaitCounter.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+
+        assertEquals(postDialString, mOnPostDialWaitCounter.getArgs(0)[1]);
+        assertEquals(postDialString, call.getRemainingPostDialSequence());
+
+        final InvokeCounter counter = connection.getInvokeCounter(MockConnection.ON_POST_DIAL_WAIT);
+
+        call.postDialContinue(true);
+        counter.waitForCount(1);
+        assertTrue((Boolean) counter.getArgs(0)[0]);
+
+        call.postDialContinue(false);
+        counter.waitForCount(2);
+        assertFalse((Boolean) counter.getArgs(1)[0]);
+    }
+
+    public void testOnCannedTextResponsesLoaded() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        addAndVerifyNewIncomingCall(getTestNumber(), null);
+        verifyConnectionForIncomingCall();
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+
+        final Call call = inCallService.getLastCall();
+
+        assertCallState(call, Call.STATE_RINGING);
+
+        // We can't do much to enforce the number and type of responses that are preloaded on
+        // device, so the best we can do is to make sure that the call back is called and
+        // that the returned list is non-empty.
+
+        // This test should also verify that the callback is called as well, but unfortunately it
+        // is never called right now (b/22952515).
+        // mOnCannedTextResponsesLoadedCounter.waitForCount(1);
+
+        assertGetCannedTextResponsesNotEmpty(call);
+    }
+
+    public void testGetCalls() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall();
+        final MockConnection connection1 = verifyConnectionForOutgoingCall(0);
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        final Call call1 = inCallService.getLastCall();
+        assertCallState(call1, Call.STATE_DIALING);
+
+        connection1.setActive();
+
+        assertCallState(call1, Call.STATE_ACTIVE);
+
+        List<Call> calls = inCallService.getCalls();
+        assertEquals("InCallService.getCalls() should return list with 1 call.", 1, calls.size());
+        assertEquals(call1, calls.get(0));
+
+        addAndVerifyNewIncomingCall(getTestNumber(), null);
+        verifyConnectionForIncomingCall();
+
+        final Call call2 = inCallService.getLastCall();
+        calls = inCallService.getCalls();
+        assertEquals("InCallService.getCalls() should return list with 2 calls.", 2, calls.size());
+        assertEquals(call1, calls.get(0));
+        assertEquals(call2, calls.get(1));
+    }
+
+    private void assertGetCannedTextResponsesNotEmpty(final Call call) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return true;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return call.getCannedTextResponses() != null
+                                && !call.getCannedTextResponses().isEmpty();
+                    }
+
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Call.getCannedTextResponses should not be empty");
+    }
+
+    private void assertCanAddCall(final InCallService inCallService, final boolean canAddCall,
+            String message) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return canAddCall;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return inCallService.canAddCall();
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                message
+        );
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/MockConference.java b/tests/tests/telecom/src/android/telecom/cts/MockConference.java
new file mode 100644
index 0000000..647d039
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/MockConference.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import android.telecom.Conference;
+import android.telecom.Connection;
+import android.telecom.DisconnectCause;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.RemoteConference;
+import android.telecom.TelecomManager;
+
+/**
+ * {@link Conference} subclass that immediately performs any state changes that are a result of
+ * callbacks sent from Telecom.
+ */
+public class MockConference extends Conference {
+
+    private RemoteConference mRemoteConference = null;
+    private String mDtmfString = "";
+
+    public MockConference(PhoneAccountHandle phoneAccount) {
+        super(phoneAccount);
+    }
+
+    public MockConference(MockConnection a, MockConnection b) {
+        super(a.getPhoneAccountHandle());
+        addConnection(a);
+        addConnection(b);
+        // a is the primary connection, so inherit the properties from it.
+        setConnectionCapabilities(a.getConnectionCapabilities());
+        setStatusHints(a.getStatusHints());
+        setExtras(a.getExtras());
+    }
+
+    @Override
+    public void onDisconnect() {
+        super.onDisconnect();
+        for (Connection c : getConnections()) {
+            c.setDisconnected(new DisconnectCause(DisconnectCause.REMOTE));
+            c.destroy();
+        }
+        destroy();
+        if (mRemoteConference != null) {
+            mRemoteConference.disconnect();
+        }
+    }
+
+    @Override
+    public void onSeparate(Connection connection) {
+        super.onSeparate(connection);
+        if (getConnections().contains(connection)) {
+            removeConnection(connection);
+        }
+        if (mRemoteConference != null) {
+            mRemoteConference.separate(((MockConnection)connection).getRemoteConnection());
+        }
+    }
+
+    @Override
+    public void onMerge() {
+        super.onMerge();
+        // Let's just change the connection display name for testing that onMerge was invoked.
+        for (Connection c : getConnections()) {
+            c.setCallerDisplayName(
+                    TestUtils.MERGE_CALLER_NAME, TelecomManager.PRESENTATION_ALLOWED);
+        }
+        if (mRemoteConference != null) {
+            mRemoteConference.merge();
+        }
+    }
+
+    @Override
+    public void onSwap() {
+        super.onSwap();
+        // Let's just change the connection display name for testing that onSwap was invoked.
+        for (Connection c : getConnections()) {
+            c.setCallerDisplayName(
+                    TestUtils.SWAP_CALLER_NAME, TelecomManager.PRESENTATION_ALLOWED);
+        }
+        if (mRemoteConference != null) {
+            mRemoteConference.swap();
+        }
+    }
+
+    @Override
+    public void onHold() {
+        super.onHold();
+        for (Connection c : getConnections()) {
+            c.setOnHold();
+        }
+        setOnHold();
+        if (mRemoteConference != null) {
+            mRemoteConference.hold();
+        }
+    }
+
+    @Override
+    public void onUnhold() {
+        super.onUnhold();
+        for (Connection c : getConnections()) {
+            c.setActive();
+        }
+        setActive();
+        if (mRemoteConference != null) {
+            mRemoteConference.unhold();
+        }
+    }
+
+    @Override
+    public void onPlayDtmfTone(char c) {
+        super.onPlayDtmfTone(c);
+        mDtmfString += c;
+        if (mRemoteConference != null) {
+            mRemoteConference.playDtmfTone(c);
+        }
+    }
+
+    @Override
+    public void onStopDtmfTone() {
+        super.onStopDtmfTone();
+        mDtmfString += ".";
+        if (mRemoteConference != null) {
+            mRemoteConference.stopDtmfTone();
+        }
+    }
+
+    public void setRemoteConference(RemoteConference remoteConference) {
+        mRemoteConference = remoteConference;
+    }
+
+    public RemoteConference getRemoteConference() {
+        return mRemoteConference;
+    }
+
+    public String getDtmfString() {
+        return mDtmfString;
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/MockConnection.java b/tests/tests/telecom/src/android/telecom/cts/MockConnection.java
new file mode 100644
index 0000000..d556baa
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/MockConnection.java
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import static android.telecom.CallAudioState.*;
+import android.telecom.CallAudioState;
+import android.telecom.Connection;
+import android.telecom.DisconnectCause;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.RemoteConnection;
+import android.telecom.VideoProfile;
+import android.telecom.cts.BaseTelecomTestWithMockServices.InvokeCounter;
+import android.util.SparseArray;
+
+/**
+ * {@link Connection} subclass that immediately performs any state changes that are a result of
+ * callbacks sent from Telecom.
+ */
+public class MockConnection extends Connection {
+    public static final int ON_POST_DIAL_WAIT = 1;
+
+    private CallAudioState mCallAudioState =
+            new CallAudioState(false, CallAudioState.ROUTE_EARPIECE, ROUTE_EARPIECE | ROUTE_SPEAKER);
+    private int mState = STATE_NEW;
+    public int videoState = VideoProfile.STATE_AUDIO_ONLY;
+    private String mDtmfString = "";
+    private MockVideoProvider mMockVideoProvider;
+    private PhoneAccountHandle mPhoneAccountHandle;
+    private RemoteConnection mRemoteConnection = null;
+
+    private SparseArray<InvokeCounter> mInvokeCounterMap = new SparseArray<>(10);
+
+    @Override
+    public void onAnswer() {
+        super.onAnswer();
+    }
+
+    @Override
+    public void onAnswer(int videoState) {
+        super.onAnswer(videoState);
+        this.videoState = videoState;
+        setActive();
+        if (mRemoteConnection != null) {
+            mRemoteConnection.answer();
+        }
+    }
+
+    @Override
+    public void onReject() {
+        super.onReject();
+        setDisconnected(new DisconnectCause(DisconnectCause.REJECTED));
+        if (mRemoteConnection != null) {
+            mRemoteConnection.reject();
+        }
+    }
+
+    @Override
+    public void onHold() {
+        super.onHold();
+        setOnHold();
+        if (mRemoteConnection != null) {
+            mRemoteConnection.hold();
+        }
+    }
+
+    @Override
+    public void onUnhold() {
+        super.onUnhold();
+        setActive();
+        if (mRemoteConnection != null) {
+            mRemoteConnection.unhold();
+        }
+    }
+
+    @Override
+    public void onDisconnect() {
+        super.onDisconnect();
+        setDisconnected(new DisconnectCause(DisconnectCause.LOCAL));
+        destroy();
+        if (mRemoteConnection != null) {
+            mRemoteConnection.disconnect();
+        }
+    }
+
+    @Override
+    public void onAbort() {
+        super.onAbort();
+        if (mRemoteConnection != null) {
+            mRemoteConnection.abort();
+        }
+    }
+
+    @Override
+    public void onPlayDtmfTone(char c) {
+        super.onPlayDtmfTone(c);
+        mDtmfString += c;
+        if (mRemoteConnection != null) {
+            mRemoteConnection.playDtmfTone(c);
+        }
+    }
+
+    @Override
+    public void onStopDtmfTone() {
+        super.onStopDtmfTone();
+        mDtmfString += ".";
+        if (mRemoteConnection != null) {
+            mRemoteConnection.stopDtmfTone();
+        }
+    }
+
+    @Override
+    public void onCallAudioStateChanged(CallAudioState state) {
+        super.onCallAudioStateChanged(state);
+        mCallAudioState = state;
+        if (mRemoteConnection != null) {
+            mRemoteConnection.setCallAudioState(state);
+        }
+    }
+
+    @Override
+    public void onStateChanged(int state) {
+        super.onStateChanged(state);
+        mState = state;
+    }
+
+    @Override
+    public void onPostDialContinue(boolean proceed) {
+        super.onPostDialContinue(proceed);
+        if (mInvokeCounterMap.get(ON_POST_DIAL_WAIT) != null) {
+            mInvokeCounterMap.get(ON_POST_DIAL_WAIT).invoke(proceed);
+        }
+    }
+
+    public int getCurrentState()  {
+        return mState;
+    }
+
+    public CallAudioState getCurrentCallAudioState() {
+        return mCallAudioState;
+    }
+
+    public String getDtmfString() {
+        return mDtmfString;
+    }
+
+    public InvokeCounter getInvokeCounter(int counterIndex) {
+        if (mInvokeCounterMap.get(counterIndex) == null) {
+            mInvokeCounterMap.put(counterIndex,
+                    new InvokeCounter(getCounterLabel(counterIndex)));
+        }
+        return mInvokeCounterMap.get(counterIndex);
+    }
+
+    /**
+     * Creates a mock video provider for this connection.
+     */
+    public void createMockVideoProvider() {
+        final MockVideoProvider mockVideoProvider = new MockVideoProvider(this);
+        mMockVideoProvider = mockVideoProvider;
+        setVideoProvider(mockVideoProvider);
+    }
+
+    public void sendMockVideoQuality(int videoQuality) {
+        if (mMockVideoProvider == null) {
+            return;
+        }
+        mMockVideoProvider.sendMockVideoQuality(videoQuality);
+    }
+
+    public void sendMockCallSessionEvent(int event) {
+        if (mMockVideoProvider == null) {
+            return;
+        }
+        mMockVideoProvider.sendMockCallSessionEvent(event);
+    }
+
+    public void sendMockPeerWidth(int width) {
+        if (mMockVideoProvider == null) {
+            return;
+        }
+        mMockVideoProvider.sendMockPeerWidth(width);
+    }
+
+    public void sendMockSessionModifyRequest(VideoProfile request) {
+        if (mMockVideoProvider == null) {
+            return;
+        }
+        mMockVideoProvider.sendMockSessionModifyRequest(request);
+    }
+
+    public MockVideoProvider getMockVideoProvider() {
+        return mMockVideoProvider;
+    }
+
+    public void setPhoneAccountHandle(PhoneAccountHandle handle)  {
+        mPhoneAccountHandle = handle;
+    }
+
+    public PhoneAccountHandle getPhoneAccountHandle()  {
+        return mPhoneAccountHandle;
+    }
+
+    public void setRemoteConnection(RemoteConnection remoteConnection)  {
+        mRemoteConnection = remoteConnection;
+    }
+
+    public RemoteConnection getRemoteConnection()  {
+        return mRemoteConnection;
+    }
+
+    private static String getCounterLabel(int counterIndex) {
+        switch (counterIndex) {
+            case ON_POST_DIAL_WAIT:
+                return "onPostDialWait";
+            default:
+                return "Callback";
+        }
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/MockConnectionService.java b/tests/tests/telecom/src/android/telecom/cts/MockConnectionService.java
new file mode 100644
index 0000000..ad64e5c
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/MockConnectionService.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import android.telecom.Connection;
+import android.telecom.ConnectionRequest;
+import android.telecom.ConnectionService;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.RemoteConference;
+import android.telecom.RemoteConnection;
+import android.telecom.TelecomManager;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Semaphore;
+
+/**
+ * Default implementation of a {@link CtsConnectionService}. This is used for the majority
+ * of Telecom CTS tests that simply require that a outgoing call is placed, or incoming call is
+ * received.
+ */
+public class MockConnectionService extends ConnectionService {
+    public static final int CONNECTION_PRESENTATION =  TelecomManager.PRESENTATION_ALLOWED;
+
+    /**
+     * Used to control whether the {@link MockVideoProvider} will be created when connections are
+     * created.  Used by {@link VideoCallTest#testVideoCallDelayProvider()} to test scenario where
+     * the {@link MockVideoProvider} is not created immediately when the Connection is created.
+     */
+    private boolean mCreateVideoProvider = true;
+
+    public Semaphore lock = new Semaphore(0);
+    public List<MockConnection> outgoingConnections = new ArrayList<MockConnection>();
+    public List<MockConnection> incomingConnections = new ArrayList<MockConnection>();
+    public List<RemoteConnection> remoteConnections = new ArrayList<RemoteConnection>();
+    public List<MockConference> conferences = new ArrayList<MockConference>();
+    public List<RemoteConference> remoteConferences = new ArrayList<RemoteConference>();
+
+    @Override
+    public Connection onCreateOutgoingConnection(PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        final MockConnection connection = new MockConnection();
+        connection.setAddress(request.getAddress(), CONNECTION_PRESENTATION);
+        connection.setPhoneAccountHandle(connectionManagerPhoneAccount);
+        if (mCreateVideoProvider) {
+            connection.createMockVideoProvider();
+        } else {
+            mCreateVideoProvider = true;
+        }
+        connection.setVideoState(request.getVideoState());
+
+        outgoingConnections.add(connection);
+        lock.release();
+        return connection;
+    }
+
+    @Override
+    public Connection onCreateIncomingConnection(PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        final MockConnection connection = new MockConnection();
+        connection.setAddress(request.getAddress(), CONNECTION_PRESENTATION);
+        connection.createMockVideoProvider();
+        ((Connection) connection).setVideoState(request.getVideoState());
+
+        incomingConnections.add(connection);
+        lock.release();
+        return connection;
+    }
+
+    @Override
+    public void onConference(Connection connection1, Connection connection2) {
+        // Make sure that these connections are already not conferenced.
+        if (connection1.getConference() == null && connection2.getConference() == null) {
+            MockConference conference = new MockConference(
+                    (MockConnection)connection1, (MockConnection)connection2);
+            CtsConnectionService.addConferenceToTelecom(conference);
+            conferences.add(conference);
+            lock.release();
+        }
+    }
+
+    @Override
+    public void onRemoteExistingConnectionAdded(RemoteConnection connection) {
+        // Keep track of the remote connections added to the service
+        remoteConnections.add(connection);
+    }
+
+    @Override
+    public void onRemoteConferenceAdded(RemoteConference conference) {
+        // Keep track of the remote connections added to the service
+        remoteConferences.add(conference);
+    }
+
+    public void setCreateVideoProvider(boolean createVideoProvider) {
+        mCreateVideoProvider = createVideoProvider;
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/MockInCallService.java b/tests/tests/telecom/src/android/telecom/cts/MockInCallService.java
new file mode 100644
index 0000000..1856603
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/MockInCallService.java
@@ -0,0 +1,315 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import android.telecom.Call;
+import android.telecom.CallAudioState;
+import android.telecom.InCallService;
+import android.util.ArrayMap;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Semaphore;
+
+public class MockInCallService extends InCallService {
+    private ArrayList<Call> mCalls = new ArrayList<>();
+    private ArrayList<Call> mConferenceCalls = new ArrayList<>();
+    private static InCallServiceCallbacks sCallbacks;
+    private Map<Call, MockVideoCallCallback> mVideoCallCallbacks =
+            new ArrayMap<Call, MockVideoCallCallback>();
+
+    private static final Object sLock = new Object();
+
+    public static abstract class InCallServiceCallbacks {
+        private MockInCallService mService;
+        public Semaphore lock = new Semaphore(0);
+
+        public void onCallAdded(Call call, int numCalls) {};
+        public void onCallRemoved(Call call, int numCalls) {};
+        public void onCallStateChanged(Call call, int state) {};
+        public void onParentChanged(Call call, Call parent) {};
+        public void onChildrenChanged(Call call, List<Call> children) {};
+        public void onConferenceableCallsChanged(Call call, List<Call> conferenceableCalls) {};
+        public void onCallDestroyed(Call call) {};
+        public void onDetailsChanged(Call call, Call.Details details) {};
+        public void onCanAddCallsChanged(boolean canAddCalls) {}
+        public void onBringToForeground(boolean showDialpad) {}
+        public void onCallAudioStateChanged(CallAudioState audioState) {}
+        public void onPostDialWait(Call call, String remainingPostDialSequence) {}
+        public void onCannedTextResponsesLoaded(Call call, List<String> cannedTextResponses) {}
+
+        final public MockInCallService getService() {
+            return mService;
+        }
+
+        final public void setService(MockInCallService service) {
+            mService = service;
+        }
+    }
+
+    /**
+     * Note that the super implementations of the callback methods are all no-ops, but we call
+     * them anyway to make sure that the CTS coverage tool detects that we are testing them.
+     */
+    private Call.Callback mCallCallback = new Call.Callback() {
+        @Override
+        public void onStateChanged(Call call, int state) {
+            super.onStateChanged(call, state);
+            if (getCallbacks() != null) {
+                getCallbacks().onCallStateChanged(call, state);
+            }
+        }
+
+        @Override
+        public void onVideoCallChanged(Call call, InCallService.VideoCall videoCall) {
+            super.onVideoCallChanged(call, videoCall);
+            saveVideoCall(call, videoCall);
+        }
+
+        @Override
+        public void onParentChanged(Call call, Call parent) {
+            super.onParentChanged(call, parent);
+            if (getCallbacks() != null) {
+                getCallbacks().onParentChanged(call, parent);
+            }
+        }
+
+        @Override
+        public void onChildrenChanged(Call call, List<Call> children) {
+            super.onChildrenChanged(call, children);
+            if (getCallbacks() != null) {
+                getCallbacks().onChildrenChanged(call, children);
+            }
+        }
+
+        @Override
+        public void onConferenceableCallsChanged(Call call, List<Call> conferenceableCalls) {
+            super.onConferenceableCallsChanged(call, conferenceableCalls);
+            if (getCallbacks() != null) {
+                getCallbacks().onConferenceableCallsChanged(call, conferenceableCalls);
+            }
+        }
+
+        @Override
+        public void onCallDestroyed(Call call) {
+            super.onCallDestroyed(call);
+            if (getCallbacks() != null) {
+                getCallbacks().onCallDestroyed(call);
+            }
+        }
+
+        @Override
+        public void onDetailsChanged(Call call, Call.Details details) {
+            super.onDetailsChanged(call, details);
+            if (getCallbacks() != null) {
+                getCallbacks().onDetailsChanged(call, details);
+            }
+        }
+
+        @Override
+        public void onPostDialWait(Call call, String remainingPostDialSequence) {
+            super.onPostDialWait(call, remainingPostDialSequence);
+            if (getCallbacks() != null) {
+                getCallbacks().onPostDialWait(call, remainingPostDialSequence);
+            }
+        }
+
+        @Override
+        public void onCannedTextResponsesLoaded(Call call, List<String> cannedTextResponses) {
+            super.onCannedTextResponsesLoaded(call, cannedTextResponses);
+            if (getCallbacks() != null) {
+                getCallbacks().onCannedTextResponsesLoaded(call, cannedTextResponses);
+            }
+        }
+    };
+
+    private void saveVideoCall(Call call, VideoCall videoCall) {
+        if (videoCall != null) {
+            if (!mVideoCallCallbacks.containsKey(call)) {
+                MockVideoCallCallback listener = new MockVideoCallCallback(call);
+                videoCall.registerCallback(listener);
+                mVideoCallCallbacks.put(call, listener);
+            }
+        } else {
+            mVideoCallCallbacks.remove(call);
+        }
+    }
+
+    @Override
+    public android.os.IBinder onBind(android.content.Intent intent) {
+        if (getCallbacks() != null) {
+            getCallbacks().setService(this);
+        }
+        return super.onBind(intent);
+    }
+
+    @Override
+    public void onCallAdded(Call call) {
+        super.onCallAdded(call);
+        if (call.getDetails().hasProperty(Call.Details.PROPERTY_CONFERENCE) == true) {
+            if (!mConferenceCalls.contains(call)) {
+                mConferenceCalls.add(call);
+                call.registerCallback(mCallCallback);
+            }
+        } else {
+            if (!mCalls.contains(call)) {
+                mCalls.add(call);
+                call.registerCallback(mCallCallback);
+                VideoCall videoCall = call.getVideoCall();
+                if (videoCall != null) {
+                    saveVideoCall(call, videoCall);
+                }
+            }
+        }
+        if (getCallbacks() != null) {
+            getCallbacks().onCallAdded(call, mCalls.size() + mConferenceCalls.size());
+        }
+    }
+
+    @Override
+    public void onCallRemoved(Call call) {
+        super.onCallRemoved(call);
+        if (call.getDetails().hasProperty(Call.Details.PROPERTY_CONFERENCE) == true) {
+            mConferenceCalls.remove(call);
+        } else {
+            mCalls.remove(call);
+        }
+        if (getCallbacks() != null) {
+            getCallbacks().onCallRemoved(call, mCalls.size() + mConferenceCalls.size());
+            saveVideoCall(call, null /* remove videoCall */);
+        }
+    }
+
+    @Override
+    public void onCanAddCallChanged(boolean canAddCall) {
+        super.onCanAddCallChanged(canAddCall);
+        if (getCallbacks() != null) {
+            getCallbacks().onCanAddCallsChanged(canAddCall);
+        }
+    }
+
+    @Override
+    public void onBringToForeground(boolean showDialpad) {
+        super.onBringToForeground(showDialpad);
+        if (getCallbacks() != null) {
+            getCallbacks().onBringToForeground(showDialpad);
+        }
+    }
+
+    @Override
+    public void onCallAudioStateChanged(CallAudioState audioState) {
+        super.onCallAudioStateChanged(audioState);
+        if (getCallbacks() != null) {
+            getCallbacks().onCallAudioStateChanged(audioState);
+        }
+    }
+
+    /**
+     * @return the number of calls currently added to the {@code InCallService}.
+     */
+    public int getCallCount() {
+        return mCalls.size();
+    }
+
+    /**
+     * @return the number of conference calls currently added to the {@code InCallService}.
+     */
+    public int getConferenceCallCount() {
+        return mConferenceCalls.size();
+    }
+
+    /**
+     * @return the most recently added call that exists inside the {@code InCallService}
+     */
+    public Call getLastCall() {
+        if (!mCalls.isEmpty()) {
+            return mCalls.get(mCalls.size() - 1);
+        }
+        return null;
+    }
+
+    /**
+     * @return the most recently added conference call that exists inside the {@code InCallService}
+     */
+    public Call getLastConferenceCall() {
+        if (!mConferenceCalls.isEmpty()) {
+            return mConferenceCalls.get(mConferenceCalls.size() - 1);
+        }
+        return null;
+    }
+
+    public void disconnectLastCall() {
+        final Call call = getLastCall();
+        if (call != null) {
+            call.disconnect();
+        }
+    }
+
+    public void disconnectLastConferenceCall() {
+        final Call call = getLastConferenceCall();
+        if (call != null) {
+            call.disconnect();
+        }
+    }
+
+    public void disconnectAllCalls() {
+        for (final Call call: mCalls) {
+            call.disconnect();
+        }
+    }
+
+    public void disconnectAllConferenceCalls() {
+        for (final Call call: mConferenceCalls) {
+            call.disconnect();
+        }
+    }
+
+    public static void setCallbacks(InCallServiceCallbacks callbacks) {
+        synchronized (sLock) {
+            sCallbacks = callbacks;
+        }
+    }
+
+    private InCallServiceCallbacks getCallbacks() {
+        synchronized (sLock) {
+            if (sCallbacks != null) {
+                sCallbacks.setService(this);
+            }
+            return sCallbacks;
+        }
+    }
+
+    /**
+     * Determines if a video callback has been registered for the passed in call.
+     *
+     * @param call The call.
+     * @return {@code true} if a video callback has been registered.
+     */
+    public boolean isVideoCallbackRegistered(Call call) {
+        return mVideoCallCallbacks.containsKey(call);
+    }
+
+    /**
+     * Retrieves the video callbacks associated with a call.
+     * @param call The call.
+     * @return The {@link MockVideoCallCallback} instance associated with the call.
+     */
+    public MockVideoCallCallback getVideoCallCallback(Call call) {
+        return mVideoCallCallbacks.get(call);
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/MockVideoCallCallback.java b/tests/tests/telecom/src/android/telecom/cts/MockVideoCallCallback.java
new file mode 100644
index 0000000..07e159c
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/MockVideoCallCallback.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import android.telecom.Call;
+import android.telecom.InCallService;
+import android.telecom.VideoProfile;
+import android.telecom.VideoProfile.CameraCapabilities;
+
+/**
+ * Mock video call Callback class.
+ */
+public class MockVideoCallCallback extends InCallService.VideoCall.Callback {
+    private Call mCall;
+    private CameraCapabilities mCameraCapabilities;
+    private long mDataUsage = MockVideoProvider.DATA_USAGE_UNDEFINED;
+    private int mVideoQuality = MockVideoProvider.VIDEO_QUALITY_UNDEFINED;
+    private int mCallSessionEvent = MockVideoProvider.SESSION_EVENT_UNDEFINED;
+    private int mPeerWidth = MockVideoProvider.PEER_WIDTH_UNDEFINED;
+    private VideoProfile mResponseProfile = null;
+    private VideoProfile mRequestProfile = null;
+
+    public MockVideoCallCallback(Call call) {
+        mCall = call;
+    }
+
+    /**
+     * Store incoming session modify request so tests can inspect it.
+     *
+     * @param videoProfile The requested video profile.
+     */
+    @Override
+    public void onSessionModifyRequestReceived(VideoProfile videoProfile) {
+        mRequestProfile = videoProfile;
+    }
+
+    /**
+     * Store incoming session modify response so tests can inspect it.
+     *
+     * @param status Status of the session modify request.
+     * @param requestedProfile The original request which was sent to the peer device.
+     * @param responseProfile The actual profile changes made by the peer device.
+     */
+    @Override
+    public void onSessionModifyResponseReceived(int status, VideoProfile requestedProfile,
+            VideoProfile responseProfile) {
+        mResponseProfile = responseProfile;
+    }
+
+    /**
+     * Store incoming session event so tests can inspect it.
+     *
+     * @param event The event.
+     */
+    @Override
+    public void onCallSessionEvent(int event) {
+        mCallSessionEvent = event;
+    }
+
+    /**
+     * Store incoming peer dimensions so tests can inspect them.
+     *
+     * @param width  The updated peer video width.
+     * @param height The updated peer video height.
+     */
+    @Override
+    public void onPeerDimensionsChanged(int width, int height) {
+        mPeerWidth = width;
+    }
+
+    /**
+     * Store incoming video quality so tests can inspect them.
+     *
+     * @param videoQuality  The updated peer video quality.  Valid values:
+     *      {@link VideoProfile#QUALITY_HIGH},
+     *      {@link VideoProfile#QUALITY_MEDIUM},
+     *      {@link VideoProfile#QUALITY_LOW},
+     */
+    @Override
+    public void onVideoQualityChanged(int videoQuality) {
+        mVideoQuality = videoQuality;
+    }
+
+    /**
+     * Store incoming call data usage so tests can inspect it.
+     *
+     * @param dataUsage The updated data usage (in bytes).
+     */
+    @Override
+    public void onCallDataUsageChanged(long dataUsage) {
+        mDataUsage = dataUsage;
+    }
+
+    /**
+     * Store incoming camera capabilities so tests can inspect them.
+     *
+     * @param cameraCapabilities The changed camera capabilities.
+     */
+    @Override
+    public void onCameraCapabilitiesChanged(CameraCapabilities cameraCapabilities) {
+        mCameraCapabilities = cameraCapabilities;
+    }
+
+    /**
+     * Returns the last received {@link CameraCapabilities}.
+     *
+     * @return The {@link CameraCapabilities}.
+     */
+    public CameraCapabilities getCameraCapabilities() {
+        return mCameraCapabilities;
+    }
+
+    /**
+     * Returns the last received data usage.
+     *
+     * @return The data usage.
+     */
+    public long getDataUsage() {
+        return mDataUsage;
+    }
+
+    /**
+     * Returns the last received video quality.
+     *
+     * @return The video quality.
+     */
+    public int getVideoQuality()
+    {
+        return mVideoQuality;
+    }
+
+    /**
+     * Returns the last received call session event.
+     *
+     * @return The call session event.
+     */
+    public int getCallSessionEvent()
+    {
+        return mCallSessionEvent;
+    }
+
+    /**
+     * Returns the last received peer width.
+     *
+     * @return The call session event.
+     */
+    public int getPeerWidth()
+    {
+        return mPeerWidth;
+    }
+
+    /**
+     * Returns the last received response video profile.
+     *
+     * @return The video profile.
+     */
+    public VideoProfile getResponseProfile() {
+        return mResponseProfile;
+    }
+
+    /**
+     * Returns the last requested video profile.
+     *
+     * @return The video profile.
+     */
+    public VideoProfile getRequestProfile() {
+        return mRequestProfile;
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/MockVideoProvider.java b/tests/tests/telecom/src/android/telecom/cts/MockVideoProvider.java
new file mode 100644
index 0000000..a1b6b65
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/MockVideoProvider.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import android.net.Uri;
+import android.telecom.Connection;
+import android.telecom.VideoProfile;
+import android.view.Surface;
+
+import android.telecom.Connection.VideoProvider;
+
+/**
+ * Implements a mock video provider implementation.
+ */
+public class MockVideoProvider extends VideoProvider {
+    public static final String CAMERA_NONE = "none";
+    public static final String CAMERA_FRONT = "front";
+    public static final String CAMERA_BACK = "back";
+    public static final int CAMERA_FRONT_DIMENSIONS = 1024;
+    public static final int CAMERA_BACK_DIMENSIONS = 2048;
+    public static final long DATA_USAGE = 1024;
+    public static final long DATA_USAGE_UNDEFINED = -1;
+    public static final int VIDEO_QUALITY_UNDEFINED = -1;
+    public static final int SESSION_EVENT_UNDEFINED = -1;
+    public static final int PEER_WIDTH_UNDEFINED = -1;
+    public static final int DEVICE_ORIENTATION_UNDEFINED = -1;
+    public static final float ZOOM_UNDEFINED = -1.0f;
+
+    private Uri mPauseImageUri;
+    private String mCameraId = CAMERA_NONE;
+    private MockConnection mMockConnection;
+    private int mDeviceOrientation = DEVICE_ORIENTATION_UNDEFINED;
+    private float mZoom = ZOOM_UNDEFINED;
+    private Surface mPreviewSurface = null;
+    private Surface mDisplaySurface = null;
+    private VideoProfile mSessionModifyResponse = null;
+
+    public MockVideoProvider(MockConnection mockConnection) {
+        mMockConnection = mockConnection;
+    }
+
+    @Override
+    public void onSetCamera(String cameraId) {
+        handleCameraChange(cameraId);
+    }
+
+    @Override
+    public void onSetPreviewSurface(Surface surface) {
+        mPreviewSurface = surface;
+    }
+
+    @Override
+    public void onSetDisplaySurface(Surface surface) {
+        mDisplaySurface = surface;
+    }
+
+    @Override
+    public void onSetDeviceOrientation(int rotation) {
+        mDeviceOrientation = rotation;
+    }
+
+    @Override
+    public void onSetZoom(float value) {
+        mZoom = value;
+    }
+
+    /**
+     * Handles a session modification request from the {@link MockInCallService}. Assumes the peer
+     * has accepted the proposed video profile.
+     *
+     * @param fromProfile The video properties prior to the request.
+     * @param toProfile The video properties with the requested changes made.
+     */
+    @Override
+    public void onSendSessionModifyRequest(VideoProfile fromProfile, VideoProfile toProfile) {
+        super.receiveSessionModifyResponse(Connection.VideoProvider.SESSION_MODIFY_REQUEST_SUCCESS,
+                toProfile, toProfile);
+        mMockConnection.setVideoState(toProfile.getVideoState());
+    }
+
+    @Override
+    public void onSendSessionModifyResponse(VideoProfile responseProfile) {
+        mSessionModifyResponse = responseProfile;
+    }
+
+    /**
+     * Responds with the current camera capabilities.
+     */
+    @Override
+    public void onRequestCameraCapabilities() {
+        handleCameraChange(mCameraId);
+    }
+
+    /**
+     * Handles requests to retrieve the connection data usage by returning a fixed usage amount of
+     * {@code 1024} bytes.
+     */
+    @Override
+    public void onRequestConnectionDataUsage() {
+        super.setCallDataUsage(DATA_USAGE);
+    }
+
+    @Override
+    public void onSetPauseImage(Uri uri) {
+        mPauseImageUri = uri;
+    }
+
+    /**
+     * Handles a change to the current camera selection.  Responds by reporting the capabilities of
+     * the camera.
+     */
+    private void handleCameraChange(String cameraId) {
+        mCameraId = cameraId;
+        if (CAMERA_FRONT.equals(mCameraId)) {
+            super.changeCameraCapabilities(new VideoProfile.CameraCapabilities(
+                    CAMERA_FRONT_DIMENSIONS, CAMERA_FRONT_DIMENSIONS));
+        } else if (CAMERA_BACK.equals(mCameraId)) {
+            super.changeCameraCapabilities(new VideoProfile.CameraCapabilities(
+                    CAMERA_BACK_DIMENSIONS, CAMERA_BACK_DIMENSIONS));
+        }
+    }
+
+    /**
+     * Sends a mock video quality value from the provider.
+     *
+     * @param videoQuality The video quality.
+     */
+    public void sendMockVideoQuality(int videoQuality) {
+        super.changeVideoQuality(videoQuality);
+    }
+
+    /**
+     * Sends a mock call session event from the provider.
+     *
+     * @param event The call session event.
+     */
+    public void sendMockCallSessionEvent(int event) {
+        super.handleCallSessionEvent(event);
+    }
+
+    /**
+     * Sends a mock peer width from the provider.
+     *
+     * @param width The peer width.
+     */
+    public void sendMockPeerWidth(int width) {
+        super.changePeerDimensions(width, width);
+    }
+
+    /**
+     * Sends a mock session modify request from the provider.
+     *
+     * @param request The requested profile.
+     */
+    public void sendMockSessionModifyRequest(VideoProfile request) {
+        super.receiveSessionModifyRequest(request);
+    }
+
+    public int getDeviceOrientation() {
+        return mDeviceOrientation;
+    }
+
+    public float getZoom() {
+        return mZoom;
+    }
+
+    public Surface getPreviewSurface() {
+        return mPreviewSurface;
+    }
+
+    public Surface getDisplaySurface() {
+        return mDisplaySurface;
+    }
+
+    public VideoProfile getSessionModifyResponse() {
+        return mSessionModifyResponse;
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/NumberDialingTest.java b/tests/tests/telecom/src/android/telecom/cts/NumberDialingTest.java
new file mode 100644
index 0000000..8ffcf48
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/NumberDialingTest.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import static android.telecom.cts.TestUtils.shouldTestTelecom;
+
+import android.net.Uri;
+import android.telecom.Connection;
+import android.telecom.ConnectionRequest;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+
+/**
+ * Tests that certain numbers make their way through to the connection service.
+ */
+public class NumberDialingTest extends BaseTelecomTestWithMockServices {
+
+    /**
+     * Amount of time to wait for an asynchronous method invocation to ConnectionService.
+     */
+    private static final int CS_WAIT_MILLIS = 2000;
+
+    public void testEndInPound() throws Exception {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        final Object[] res = new Object[1];
+        Uri address = Uri.fromParts("tel", "*1234#", null);
+
+        PhoneAccount account = setupConnectionService(
+                new MockConnectionService() {
+                    @Override
+                    public Connection onCreateOutgoingConnection(
+                            PhoneAccountHandle connectionManagerPhoneAccount,
+                            ConnectionRequest request) {
+                        res[0] = request.getAddress();
+                        synchronized(res) {
+                            res.notify();
+                        }
+                        return null;  // do not actually place the call.
+                    }
+
+                }, FLAG_REGISTER | FLAG_ENABLE);
+
+        startCallTo(address, account.getAccountHandle());
+        synchronized(res) {
+            res.wait(CS_WAIT_MILLIS);
+        }
+        assertEquals(address, res[0]);
+
+        tearDownConnectionService(account.getAccountHandle());
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/OutgoingCallTest.java b/tests/tests/telecom/src/android/telecom/cts/OutgoingCallTest.java
new file mode 100644
index 0000000..f2422c9
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/OutgoingCallTest.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import static android.telecom.cts.TestUtils.shouldTestTelecom;
+
+import android.os.Bundle;
+import android.telecom.CallAudioState;
+import android.telecom.TelecomManager;
+
+/**
+ * Verifies the behavior of Telecom during various outgoing call flows.
+ */
+public class OutgoingCallTest extends BaseTelecomTestWithMockServices {
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        if (mShouldTestTelecom) {
+            setupConnectionService(null, FLAG_REGISTER | FLAG_ENABLE);
+        }
+    }
+
+    // TODO: Need to send some commands to the UserManager via adb to do setup
+    public void testDisallowOutgoingCallsForSecondaryUser() {
+
+    }
+
+    // TODO: Need to figure out a way to mock emergency calls without adb root
+    public void testOutgoingCallBroadcast_isSentForAllCalls() {
+
+    }
+
+    /**
+     * Verifies that providing the EXTRA_START_CALL_WITH_SPEAKERPHONE extra starts the call with
+     * speakerphone automatically enabled.
+     *
+     * @see {@link TelecomManager#EXTRA_START_CALL_WITH_SPEAKERPHONE}
+     */
+    public void testStartCallWithSpeakerphoneTrue_SpeakerphoneOnInCall() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        final Bundle extras = new Bundle();
+        extras.putBoolean(TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE, true);
+        placeAndVerifyCall(extras);
+        verifyConnectionForOutgoingCall();
+        assertAudioRoute(mInCallCallbacks.getService(), CallAudioState.ROUTE_SPEAKER);
+    }
+
+    public void testStartCallWithSpeakerphoneFalse_SpeakerphoneOffInCall() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        final Bundle extras = new Bundle();
+        extras.putBoolean(TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE, false);
+        placeAndVerifyCall(extras);
+        verifyConnectionForOutgoingCall();
+        assertAudioRoute(mInCallCallbacks.getService(), CallAudioState.ROUTE_EARPIECE);
+    }
+
+    public void testStartCallWithSpeakerphoneNotProvided_SpeakerphoneOffByDefault() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall();
+        verifyConnectionForOutgoingCall();
+        assertAudioRoute(mInCallCallbacks.getService(), CallAudioState.ROUTE_EARPIECE);
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/PhoneAccountOperationsTest.java b/tests/tests/telecom/src/android/telecom/cts/PhoneAccountOperationsTest.java
new file mode 100644
index 0000000..cc03288
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/PhoneAccountOperationsTest.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import static android.telecom.cts.TestUtils.*;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.graphics.Color;
+import android.net.Uri;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
+import android.test.InstrumentationTestCase;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.List;
+
+
+/**
+ * Verifies some of the PhoneAccount registration related operations.
+ */
+public class PhoneAccountOperationsTest extends InstrumentationTestCase {
+    public static final PhoneAccountHandle TEST_PHONE_ACCOUNT_HANDLE =
+            new PhoneAccountHandle(new ComponentName(PACKAGE, COMPONENT), ACCOUNT_ID);
+
+    public static final PhoneAccount TEST_SIM_PHONE_ACCOUNT = PhoneAccount.builder(
+            TEST_PHONE_ACCOUNT_HANDLE, ACCOUNT_LABEL)
+            .setAddress(Uri.parse("tel:555-TEST"))
+            .setSubscriptionAddress(Uri.parse("tel:555-TEST"))
+            .setCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION)
+            .setHighlightColor(Color.RED)
+            .setShortDescription(ACCOUNT_LABEL)
+            .setSupportedUriSchemes(Arrays.asList(PhoneAccount.SCHEME_TEL))
+            .build();
+
+    public static final PhoneAccount TEST_NO_SIM_PHONE_ACCOUNT = PhoneAccount.builder(
+            TEST_PHONE_ACCOUNT_HANDLE, ACCOUNT_LABEL)
+            .setAddress(Uri.parse("tel:555-TEST"))
+            .setSubscriptionAddress(Uri.parse("tel:555-TEST"))
+            .setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER |
+                    PhoneAccount.CAPABILITY_VIDEO_CALLING)
+            .setHighlightColor(Color.RED)
+            .setShortDescription(ACCOUNT_LABEL)
+            .setSupportedUriSchemes(Arrays.asList(
+                    PhoneAccount.SCHEME_TEL, PhoneAccount.SCHEME_VOICEMAIL))
+            .build();
+
+    public static final PhoneAccount TEST_CALL_MANAGER_PHONE_ACCOUNT = PhoneAccount.builder(
+            TEST_PHONE_ACCOUNT_HANDLE, ACCOUNT_LABEL)
+            .setAddress(Uri.parse("tel:555-TEST"))
+            .setSubscriptionAddress(Uri.parse("tel:555-TEST"))
+            .setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER |
+                    PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
+            .setHighlightColor(Color.RED)
+            .setShortDescription(ACCOUNT_LABEL)
+            .setSupportedUriSchemes(Arrays.asList(
+                    PhoneAccount.SCHEME_TEL, PhoneAccount.SCHEME_VOICEMAIL))
+            .build();
+
+    private Context mContext;
+    private TelecomManager mTelecomManager;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mContext = getInstrumentation().getContext();
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+        mTelecomManager = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+        mTelecomManager.unregisterPhoneAccount(TEST_PHONE_ACCOUNT_HANDLE);
+        PhoneAccount retrievedPhoneAccount = mTelecomManager.getPhoneAccount(
+                TEST_PHONE_ACCOUNT_HANDLE);
+        assertNull("Test account not deregistered.", retrievedPhoneAccount);
+        super.tearDown();
+    }
+
+    public void testRegisterPhoneAccount_correctlyThrowsSecurityException() throws Exception {
+        if (!shouldTestTelecom(mContext)) {
+            return;
+        }
+        try {
+            mTelecomManager.registerPhoneAccount(TEST_SIM_PHONE_ACCOUNT);
+            fail("TelecomManager.registerPhoneAccount should throw SecurityException if "
+                    + "not a system app.");
+        } catch (SecurityException e) {
+            assertTrue("Unexpected security exception.", (e.getMessage().indexOf(
+                    "android.permission.REGISTER_SIM_SUBSCRIPTION") >= 0));
+        }
+    }
+
+    public void testRegisterPhoneAccount_NotEnabledAutomatically() throws Exception {
+        if (!shouldTestTelecom(mContext)) {
+            return;
+        }
+        mTelecomManager.registerPhoneAccount(TEST_NO_SIM_PHONE_ACCOUNT);
+        PhoneAccount retrievedPhoneAccount = mTelecomManager.getPhoneAccount(
+                TEST_PHONE_ACCOUNT_HANDLE);
+        assertNotNull("Failed to retrieve test account.", retrievedPhoneAccount);
+        assertFalse("Phone account should not be automatically enabled.",
+                retrievedPhoneAccount.isEnabled());
+    }
+
+    public void testRegisterPhoneAccount_DisallowEnable() throws Exception {
+        if (!shouldTestTelecom(mContext)) {
+            return;
+        }
+        Method setIsEnabled = null;
+        PhoneAccount.Builder phoneAccountBuilder = PhoneAccount.builder(
+                TEST_PHONE_ACCOUNT_HANDLE, ACCOUNT_LABEL)
+                .setAddress(Uri.parse("tel:555-TEST"))
+                .setSubscriptionAddress(Uri.parse("tel:555-TEST"))
+                .setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER)
+                .setHighlightColor(Color.RED)
+                .setShortDescription(ACCOUNT_LABEL)
+                .setSupportedUriSchemes(Arrays.asList("tel"));
+        try {
+            setIsEnabled = PhoneAccount.Builder.class.getDeclaredMethod(
+                    "setIsEnabled", boolean.class);
+        } catch (NoSuchMethodException e) {
+            fail("Failed to find setIsEnabled method.");
+        }
+        setIsEnabled.invoke(phoneAccountBuilder, true);
+        final PhoneAccount phoneAccount  = phoneAccountBuilder.build();
+        mTelecomManager.registerPhoneAccount(phoneAccount);
+        PhoneAccount retrievedPhoneAccount = mTelecomManager.getPhoneAccount(
+                TEST_PHONE_ACCOUNT_HANDLE);
+        assertNotNull("Failed to retrieve test account.", retrievedPhoneAccount);
+        assertFalse("3rd party app cannot enable its own phone account.",
+                retrievedPhoneAccount.isEnabled());
+    }
+
+    public void testRegisterPhoneAccount_ListEnabledAccounts() throws Exception {
+        if (!shouldTestTelecom(mContext)) {
+            return;
+        }
+        mTelecomManager.registerPhoneAccount(TEST_NO_SIM_PHONE_ACCOUNT);
+        final List<PhoneAccountHandle> oldAccounts = mTelecomManager.getCallCapablePhoneAccounts();
+        final int oldAccountsListSize = oldAccounts.size();
+        if (oldAccountsListSize > 0) {
+            assertFalse("Enabled Phone accounts should not contain the test account.",
+                    oldAccounts.contains(TEST_PHONE_ACCOUNT_HANDLE));
+        }
+        TestUtils.enablePhoneAccount(getInstrumentation(), TEST_PHONE_ACCOUNT_HANDLE);
+        final List<PhoneAccountHandle> newAccounts = mTelecomManager.getCallCapablePhoneAccounts();
+        assertNotNull("No enabled Phone account found.", newAccounts);
+        assertEquals("1 new enabled Phone account expected.", newAccounts.size(),
+                oldAccountsListSize + 1);
+        assertTrue("Enabled Phone accounts do not contain the test account.",
+                newAccounts.contains(TEST_PHONE_ACCOUNT_HANDLE));
+    }
+
+    public void testRegisterPhoneAccount_CheckCapabilities() throws Exception {
+        if (!shouldTestTelecom(mContext)) {
+            return;
+        }
+        mTelecomManager.registerPhoneAccount(TEST_NO_SIM_PHONE_ACCOUNT);
+        PhoneAccount retrievedPhoneAccount = mTelecomManager.getPhoneAccount(
+                TEST_PHONE_ACCOUNT_HANDLE);
+        assertTrue("Phone account should have call provider & video calling capability.",
+                retrievedPhoneAccount.hasCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER |
+                        PhoneAccount.CAPABILITY_VIDEO_CALLING));
+    }
+
+    public void testRegisterPhoneAccount_CheckURISchemeSupported() throws Exception {
+        if (!shouldTestTelecom(mContext)) {
+            return;
+        }
+        mTelecomManager.registerPhoneAccount(TEST_NO_SIM_PHONE_ACCOUNT);
+        PhoneAccount retrievedPhoneAccount = mTelecomManager.getPhoneAccount(
+                TEST_PHONE_ACCOUNT_HANDLE);
+        assertTrue("Phone account should support tel URI scheme.",
+                retrievedPhoneAccount.supportsUriScheme(PhoneAccount.SCHEME_TEL));
+        assertTrue("Phone account should support voicemail URI scheme.",
+                retrievedPhoneAccount.supportsUriScheme(PhoneAccount.SCHEME_VOICEMAIL));
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/RemoteConferenceTest.java b/tests/tests/telecom/src/android/telecom/cts/RemoteConferenceTest.java
new file mode 100644
index 0000000..3fc65ea
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/RemoteConferenceTest.java
@@ -0,0 +1,586 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import static android.telecom.cts.TestUtils.*;
+
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.telecom.Call;
+import android.telecom.Connection;
+import android.telecom.ConnectionRequest;
+import android.telecom.DisconnectCause;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.RemoteConference;
+import android.telecom.RemoteConnection;
+import android.telecom.TelecomManager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Extended suite of tests that use {@link CtsConnectionService} and {@link MockInCallService} to
+ * verify the functionality of Remote Conferences.
+ * We make 2 connections on the {@link CtsConnectionService} & we create 2 connections on the
+ * {@link CtsRemoteConnectionService} via the {@link RemoteConnection} object. We store this
+ * corresponding RemoteConnection object on the connections to plumb the modifications on
+ * the connections in {@link CtsConnectionService} to the connections on
+ * {@link CtsRemoteConnectionService}. Then we create a remote conference on the
+ * {@link CtsRemoteConnectionService} and control it via the {@link RemoteConference}
+ * object. The onConference method on the managerConnectionService will initiate a remote conference
+ * creation on the remoteConnectionService and once that is completed, we create a local conference
+ * on the managerConnectionService.
+ */
+public class RemoteConferenceTest extends BaseRemoteTelecomTest {
+
+    public static final int CONF_CAPABILITIES = Connection.CAPABILITY_SEPARATE_FROM_CONFERENCE |
+            Connection.CAPABILITY_DISCONNECT_FROM_CONFERENCE | Connection.CAPABILITY_HOLD |
+            Connection.CAPABILITY_MERGE_CONFERENCE | Connection.CAPABILITY_SWAP_CONFERENCE;
+
+    MockConnection mConnection1, mConnection2;
+    MockConnection mRemoteConnection1, mRemoteConnection2;
+    Call mCall1, mCall2;
+    MockConference mConference, mRemoteConference;
+    RemoteConference mRemoteConferenceObject;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mContext = getInstrumentation().getContext();
+        if (mShouldTestTelecom) {
+            addRemoteConferenceCall();
+            verifyRemoteConferenceObject(mRemoteConferenceObject, mRemoteConference, mConference);
+        }
+    }
+
+    public void testRemoteConferenceCreate() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        final Call confCall = mInCallCallbacks.getService().getLastConferenceCall();
+        assertCallState(confCall, Call.STATE_ACTIVE);
+
+        if (mCall1.getParent() != confCall || mCall2.getParent() != confCall) {
+            fail("The 2 participating calls should contain the conference call as its parent");
+        }
+        if (!(confCall.getChildren().contains(mCall1) && confCall.getChildren().contains(mCall2))) {
+            fail("The conference call should contain the 2 participating calls as its children");
+        }
+
+        assertConnectionState(mConnection1, Connection.STATE_ACTIVE);
+        assertConnectionState(mConnection2, Connection.STATE_ACTIVE);
+        assertConnectionState(mRemoteConnection1, Connection.STATE_ACTIVE);
+        assertConnectionState(mRemoteConnection2, Connection.STATE_ACTIVE);
+        assertConferenceState(mConference, Connection.STATE_ACTIVE);
+        assertConferenceState(mRemoteConference, Connection.STATE_ACTIVE);
+        assertRemoteConferenceState(mRemoteConferenceObject, Connection.STATE_ACTIVE);
+    }
+
+    public void testRemoteConferenceSplit() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        final Call confCall = mInCallCallbacks.getService().getLastConferenceCall();
+        assertCallState(confCall, Call.STATE_ACTIVE);
+
+        if (!(mCall1.getParent() == confCall) && (confCall.getChildren().contains(mCall1))) {
+            fail("Call 1 not conferenced");
+        }
+        assertTrue(mConference.getConnections().contains(mConnection1));
+        assertTrue(mRemoteConference.getConnections().contains(mRemoteConnection1));
+
+        splitFromConferenceCall(mCall1);
+
+        if ((mCall1.getParent() == confCall) || (confCall.getChildren().contains(mCall1))) {
+            fail("Call 1 should not be still conferenced");
+        }
+        assertFalse(mConference.getConnections().contains(mConnection1));
+        assertFalse(mRemoteConference.getConnections().contains(mRemoteConnection1));
+    }
+
+    public void testRemoteConferenceHoldAndUnhold() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        final Call confCall = mInCallCallbacks.getService().getLastConferenceCall();
+        assertCallState(confCall, Call.STATE_ACTIVE);
+
+        confCall.hold();
+        assertCallState(confCall, Call.STATE_HOLDING);
+        assertCallState(mCall1, Call.STATE_HOLDING);
+        assertCallState(mCall2, Call.STATE_HOLDING);
+        assertConnectionState(mConnection1, Connection.STATE_HOLDING);
+        assertConnectionState(mConnection2, Connection.STATE_HOLDING);
+        assertConnectionState(mRemoteConnection1, Connection.STATE_HOLDING);
+        assertConnectionState(mRemoteConnection2, Connection.STATE_HOLDING);
+        assertConferenceState(mConference, Connection.STATE_HOLDING);
+        assertConferenceState(mRemoteConference, Connection.STATE_HOLDING);
+        assertRemoteConferenceState(mRemoteConferenceObject, Connection.STATE_HOLDING);
+
+        confCall.unhold();
+        assertCallState(confCall, Call.STATE_ACTIVE);
+        assertCallState(mCall1, Call.STATE_ACTIVE);
+        assertCallState(mCall2, Call.STATE_ACTIVE);
+        assertConnectionState(mConnection1, Connection.STATE_ACTIVE);
+        assertConnectionState(mConnection2, Connection.STATE_ACTIVE);
+        assertConnectionState(mRemoteConnection1, Connection.STATE_ACTIVE);
+        assertConnectionState(mRemoteConnection2, Connection.STATE_ACTIVE);
+        assertConferenceState(mConference, Connection.STATE_ACTIVE);
+        assertConferenceState(mRemoteConference, Connection.STATE_ACTIVE);
+        assertRemoteConferenceState(mRemoteConferenceObject, Connection.STATE_ACTIVE);
+    }
+
+    public void testRemoteConferenceMergeAndSwap() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        final Call confCall = mInCallCallbacks.getService().getLastConferenceCall();
+        assertCallState(confCall, Call.STATE_ACTIVE);
+
+        confCall.mergeConference();
+        assertCallDisplayName(mCall1, TestUtils.MERGE_CALLER_NAME);
+        assertCallDisplayName(mCall2, TestUtils.MERGE_CALLER_NAME);
+        assertConnectionCallDisplayName(mConnection1,
+                TestUtils.MERGE_CALLER_NAME);
+        assertConnectionCallDisplayName(mConnection2,
+                TestUtils.MERGE_CALLER_NAME);
+        assertConnectionCallDisplayName(mRemoteConnection1,
+                TestUtils.MERGE_CALLER_NAME);
+        assertConnectionCallDisplayName(mRemoteConnection2,
+                TestUtils.MERGE_CALLER_NAME);
+
+        confCall.swapConference();
+        assertCallDisplayName(mCall1, TestUtils.SWAP_CALLER_NAME);
+        assertCallDisplayName(mCall2, TestUtils.SWAP_CALLER_NAME);
+        assertConnectionCallDisplayName(mConnection1,
+                TestUtils.SWAP_CALLER_NAME);
+        assertConnectionCallDisplayName(mConnection2,
+                TestUtils.SWAP_CALLER_NAME);
+        assertConnectionCallDisplayName(mRemoteConnection1,
+                TestUtils.SWAP_CALLER_NAME);
+        assertConnectionCallDisplayName(mRemoteConnection2,
+                TestUtils.SWAP_CALLER_NAME);
+    }
+
+    public void testRemoteConferenceDTMFTone() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        final Call confCall = mInCallCallbacks.getService().getLastConferenceCall();
+        assertCallState(confCall, Call.STATE_ACTIVE);
+
+        assertTrue(mConference.getDtmfString().isEmpty());
+        assertTrue(mRemoteConference.getDtmfString().isEmpty());
+        confCall.playDtmfTone('1');
+        assertDtmfString(mConference, "1");
+        assertDtmfString(mRemoteConference, "1");
+        confCall.stopDtmfTone();
+        assertDtmfString(mConference, "1.");
+        assertDtmfString(mRemoteConference, "1.");
+        confCall.playDtmfTone('3');
+        assertDtmfString(mConference, "1.3");
+        assertDtmfString(mRemoteConference, "1.3");
+        confCall.stopDtmfTone();
+        assertDtmfString(mConference, "1.3.");
+        assertDtmfString(mRemoteConference, "1.3.");
+    }
+
+    public void testRemoteConferenceCallbacks_StateChange() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        Handler handler = setupRemoteConferenceCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConferenceCallbacks_StateChange");
+        RemoteConference.Callback callback;
+
+        callback = new RemoteConference.Callback() {
+            @Override
+            public void onStateChanged(RemoteConference conference, int oldState, int newState) {
+                super.onStateChanged(conference, oldState, newState);
+                callbackInvoker.invoke(conference, oldState, newState);
+            }
+        };
+        mRemoteConferenceObject.registerCallback(callback, handler);
+        mRemoteConference.setOnHold();
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConferenceObject, callbackInvoker.getArgs(0)[0]);
+        assertEquals(Connection.STATE_ACTIVE, callbackInvoker.getArgs(0)[1]);
+        assertEquals(Connection.STATE_HOLDING, callbackInvoker.getArgs(0)[2]);
+        mRemoteConferenceObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConferenceCallbacks_Disconnect() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        Handler handler = setupRemoteConferenceCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConferenceCallbacks_Disconnect");
+        RemoteConference.Callback callback;
+
+        callback = new RemoteConference.Callback() {
+            @Override
+            public void onDisconnected(RemoteConference conference,
+                                       DisconnectCause disconnectCause) {
+                super.onDisconnected(conference, disconnectCause);
+                callbackInvoker.invoke(conference, disconnectCause);
+            }
+        };
+        mRemoteConferenceObject.registerCallback(callback, handler);
+        DisconnectCause cause = new DisconnectCause(DisconnectCause.LOCAL);
+        mRemoteConference.setDisconnected(cause);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConferenceObject, callbackInvoker.getArgs(0)[0]);
+        assertEquals(cause, callbackInvoker.getArgs(0)[1]);
+        mRemoteConferenceObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConferenceCallbacks_ConnectionAdd() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        Handler handler = setupRemoteConferenceCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConferenceCallbacks_ConnectionAdd");
+        RemoteConference.Callback callback;
+
+        callback = new RemoteConference.Callback() {
+            @Override
+            public void onConnectionAdded(RemoteConference conference,
+                                          RemoteConnection connection) {
+                super.onConnectionAdded(conference, connection);
+                callbackInvoker.invoke(conference, connection);
+            }
+        };
+        mRemoteConferenceObject.registerCallback(callback, handler);
+        placeAndVerifyCall();
+        RemoteConnection newRemoteConnectionObject =
+                verifyConnectionForOutgoingCall(1).getRemoteConnection();
+        MockConnection newConnection = verifyConnectionForOutgoingCallOnRemoteCS(2);
+        mRemoteConference.addConnection(newConnection);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConferenceObject, callbackInvoker.getArgs(0)[0]);
+        // No "equals" method in RemoteConnection
+        //assertEquals(newRemoteConnectionObject, callbackInvoker.getArgs(0)[1]);
+        mRemoteConferenceObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConferenceCallbacks_ConnectionRemove() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        Handler handler = setupRemoteConferenceCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConferenceCallbacks_ConnectionRemove");
+        RemoteConference.Callback callback;
+
+        callback = new RemoteConference.Callback() {
+            @Override
+            public void onConnectionRemoved(RemoteConference conference,
+                                            RemoteConnection connection) {
+                super.onConnectionRemoved(conference, connection);
+                callbackInvoker.invoke(conference, connection);
+            }
+        };
+        mRemoteConferenceObject.registerCallback(callback, handler);
+        placeAndVerifyCall();
+        RemoteConnection newRemoteConnectionObject =
+                verifyConnectionForOutgoingCall(1).getRemoteConnection();
+        MockConnection newConnection = verifyConnectionForOutgoingCallOnRemoteCS(2);
+        mRemoteConference.addConnection(newConnection);
+        mRemoteConference.removeConnection(newConnection);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConferenceObject, callbackInvoker.getArgs(0)[0]);
+        //assertEquals(newRemoteConnectionObject, callbackInvoker.getArgs(0)[1]);
+        // No "equals" method in RemoteConnection
+        mRemoteConferenceObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConferenceCallbacks_ConnectionCapabilities() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        Handler handler = setupRemoteConferenceCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConferenceCallbacks_ConnectionCapabilities");
+        RemoteConference.Callback callback;
+
+        callback = new RemoteConference.Callback() {
+            @Override
+            public void onConnectionCapabilitiesChanged(
+                    RemoteConference conference,
+                    int connectionCapabilities) {
+                super.onConnectionCapabilitiesChanged(conference, connectionCapabilities);
+                callbackInvoker.invoke(conference, connectionCapabilities);
+            }
+        };
+        mRemoteConferenceObject.registerCallback(callback, handler);
+        int capabilities = mRemoteConference.getConnectionCapabilities() | Connection.CAPABILITY_MUTE;
+        mRemoteConference.setConnectionCapabilities(capabilities);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConferenceObject, callbackInvoker.getArgs(0)[0]);
+        assertEquals(capabilities, callbackInvoker.getArgs(0)[1]);
+        mRemoteConferenceObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConferenceCallbacks_ConferenceableConnections() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        Handler handler = setupRemoteConferenceCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConferenceCallbacks_ConferenceableConnections");
+        RemoteConference.Callback callback;
+
+        callback = new RemoteConference.Callback() {
+            @Override
+            public void onConferenceableConnectionsChanged(
+                    RemoteConference conference,
+                    List<RemoteConnection> conferenceableConnections) {
+                super.onConferenceableConnectionsChanged(conference, conferenceableConnections);
+                callbackInvoker.invoke(conference, conferenceableConnections);
+            }
+        };
+        mRemoteConferenceObject.registerCallback(callback, handler);
+        placeAndVerifyCall();
+        RemoteConnection newRemoteConnectionObject =
+            verifyConnectionForOutgoingCall(1).getRemoteConnection();
+        MockConnection newConnection = verifyConnectionForOutgoingCallOnRemoteCS(1);
+        ArrayList<Connection> confList = new ArrayList<>();
+        confList.add(newConnection);
+        mRemoteConference.setConferenceableConnections(confList);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConferenceObject, callbackInvoker.getArgs(0)[0]);
+        // No "equals" method in RemoteConnection
+        //assertTrue(((List<RemoteConnection>)callbackInvoker.getArgs(0)[1]).contains(
+                //newRemoteConnectionObject));
+        mRemoteConferenceObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConferenceCallbacks_Destroy() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        Handler handler = setupRemoteConferenceCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConferenceCallbacks_Destroy");
+        RemoteConference.Callback callback;
+
+        callback = new RemoteConference.Callback() {
+            @Override
+            public void onDestroyed(RemoteConference conference) {
+                super.onDestroyed(conference);
+                callbackInvoker.invoke(conference);
+            }
+        };
+        mRemoteConferenceObject.registerCallback(callback, handler);
+        mRemoteConference.destroy();
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConferenceObject, callbackInvoker.getArgs(0)[0]);
+        mRemoteConferenceObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConferenceCallbacks_Extras() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        Handler handler = setupRemoteConferenceCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConferenceCallbacks_Extras");
+        RemoteConference.Callback callback;
+
+        callback = new RemoteConference.Callback() {
+            @Override
+            public void onExtrasChanged(RemoteConference conference, Bundle extras) {
+                super.onExtrasChanged(conference, extras);
+                callbackInvoker.invoke(conference, extras);
+            }
+        };
+        mRemoteConferenceObject.registerCallback(callback, handler);
+        Bundle extras = new Bundle();
+        extras.putString(TelecomManager.EXTRA_CALL_DISCONNECT_MESSAGE, "Test");
+        mRemoteConference.setExtras(extras);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConferenceObject, callbackInvoker.getArgs(0)[0]);
+        assertEquals(extras, callbackInvoker.getArgs(0)[1]);
+        mRemoteConferenceObject.unregisterCallback(callback);
+    }
+
+    private void verifyRemoteConferenceObject(RemoteConference remoteConferenceObject,
+            MockConference remoteConference, MockConference conference) {
+        assertEquals(remoteConference.getConnectionCapabilities(),
+                remoteConferenceObject.getConnectionCapabilities());
+        assertTrue(remoteConferenceObject.getConferenceableConnections().isEmpty());
+        List<RemoteConnection> remoteConnections = new ArrayList<>();
+        for (Connection c: conference.getConnections()) {
+            remoteConnections.add(((MockConnection)c).getRemoteConnection());
+        }
+        assertEquals(remoteConnections, remoteConferenceObject.getConnections());
+        assertEquals(remoteConference.getDisconnectCause(), remoteConferenceObject.getDisconnectCause());
+        assertEquals(remoteConference.getExtras(), remoteConferenceObject.getExtras());
+    }
+
+    private void addRemoteConnectionOutgoingCalls() {
+        try {
+            MockConnectionService managerConnectionService = new MockConnectionService() {
+                @Override
+                public Connection onCreateOutgoingConnection(
+                        PhoneAccountHandle connectionManagerPhoneAccount,
+                        ConnectionRequest request) {
+                    MockConnection connection = (MockConnection)super.onCreateOutgoingConnection(
+                            connectionManagerPhoneAccount, request);
+                    ConnectionRequest remoteRequest = new ConnectionRequest(
+                            TEST_REMOTE_PHONE_ACCOUNT_HANDLE,
+                            request.getAddress(),
+                            request.getExtras());
+                    RemoteConnection remoteConnection =
+                            CtsConnectionService.createRemoteOutgoingConnectionToTelecom(
+                                    TEST_REMOTE_PHONE_ACCOUNT_HANDLE, remoteRequest);
+                    connection.setRemoteConnection(remoteConnection);
+                    // Modify the connection object created with local values.
+                    int capabilities = connection.getConnectionCapabilities();
+                    connection.setConnectionCapabilities(capabilities | CONF_CAPABILITIES);
+                    return connection;
+                }
+                @Override
+                public void onConference(Connection connection1, Connection connection2) {
+                    /**
+                     * Fetch the corresponding remoteConnection objects and instantiate a remote
+                     * conference creation on the remoteConnectionService instead of this
+                     * managerConnectionService.
+                     */
+                    RemoteConnection remoteConnection1 =
+                            ((MockConnection)connection1).getRemoteConnection();
+                    RemoteConnection remoteConnection2 =
+                            ((MockConnection)connection2).getRemoteConnection();
+                    if (remoteConnection1.getConference() == null &&
+                            remoteConnection2.getConference() == null) {
+                        conferenceRemoteConnections(remoteConnection1, remoteConnection2);
+                    }
+                }
+                @Override
+                public void onRemoteConferenceAdded(RemoteConference remoteConference) {
+                    /**
+                     * Now that the remote conference has been created,
+                     * let's create a local conference on this ConnectionService.
+                     */
+                    MockConference conference = new MockConference(mConnection1, mConnection2);
+                    conference.setRemoteConference(remoteConference);
+                    CtsConnectionService.addConferenceToTelecom(conference);
+                    conferences.add(conference);
+                    lock.release();
+                }
+            };
+            /**
+             * We want the conference to be instantiated on the remoteConnectionService registered
+             * with telecom.
+             */
+            MockConnectionService remoteConnectionService= new MockConnectionService() {
+                @Override
+                public Connection onCreateOutgoingConnection(
+                        PhoneAccountHandle connectionManagerPhoneAccount,
+                        ConnectionRequest request) {
+                    Connection connection = super.onCreateOutgoingConnection(
+                            connectionManagerPhoneAccount,
+                            request);
+                    // Modify the connection object created with local values.
+                    int capabilities = connection.getConnectionCapabilities();
+                    connection.setConnectionCapabilities(capabilities | CONF_CAPABILITIES);
+                    return connection;
+                }
+                @Override
+                public void onConference(Connection connection1, Connection connection2) {
+                    // Make sure that these connections are already not conferenced.
+                    if (connection1.getConference() == null &&
+                            connection2.getConference() == null) {
+                        MockConference conference = new MockConference(
+                                (MockConnection)connection1, (MockConnection)connection2);
+                        CtsRemoteConnectionService.addConferenceToTelecom(conference);
+                        conferences.add(conference);
+                        lock.release();
+                    }
+                }
+            };
+            setupConnectionServices(managerConnectionService, remoteConnectionService,
+                    FLAG_REGISTER | FLAG_ENABLE);
+        } catch(Exception e) {
+            fail("Error in setting up the connection services");
+        }
+
+        placeAndVerifyCall();
+        mConnection1 = verifyConnectionForOutgoingCall(0);
+        mRemoteConnection1 = verifyConnectionForOutgoingCallOnRemoteCS(0);
+        mCall1 = mInCallCallbacks.getService().getLastCall();
+        assertCallState(mCall1, Call.STATE_DIALING);
+        mConnection1.setActive();
+        mRemoteConnection1.setActive();
+        assertCallState(mCall1, Call.STATE_ACTIVE);
+
+        placeAndVerifyCall();
+        mConnection2 = verifyConnectionForOutgoingCall(1);
+        mRemoteConnection2 = verifyConnectionForOutgoingCallOnRemoteCS(1);
+        mCall2 = mInCallCallbacks.getService().getLastCall();
+        assertCallState(mCall2, Call.STATE_DIALING);
+        mConnection2.setActive();
+        mRemoteConnection2.setActive();
+        assertCallState(mCall2, Call.STATE_ACTIVE);
+
+        setAndVerifyConferenceablesForOutgoingConnection(0);
+        setAndVerifyConferenceablesForOutgoingConnection(1);
+        setAndVerifyConferenceablesForOutgoingConnectionOnRemoteCS(0);
+        setAndVerifyConferenceablesForOutgoingConnectionOnRemoteCS(1);
+    }
+
+    private void addRemoteConferenceCall() {
+        addRemoteConnectionOutgoingCalls();
+        /**
+         * We've 2 connections on the local connectionService which have 2 corresponding
+         * connections on the remoteConnectionService controlled via 2 RemoteConnection objects
+         * on the connectionService. We now create a conference on the local two connections
+         * which triggers a creation of conference on the remoteConnectionService via the
+         * RemoteConference object.
+         */
+
+        addConferenceCall(mCall1, mCall2);
+        mConference = verifyConferenceForOutgoingCall();
+        mRemoteConference = verifyConferenceForOutgoingCallOnRemoteCS();
+        mRemoteConferenceObject = mConference.getRemoteConference();
+        mRemoteConnection1 = (MockConnection)mRemoteConference.getConnections().get(0);
+        mRemoteConnection2 = (MockConnection)mRemoteConference.getConnections().get(1);
+    }
+
+    private Handler setupRemoteConferenceCallbacksTest() {
+        final Call confCall = mInCallCallbacks.getService().getLastConferenceCall();
+        assertCallState(confCall, Call.STATE_ACTIVE);
+
+        // Create a looper thread for the callbacks.
+        HandlerThread workerThread = new HandlerThread("CallbackThread");
+        workerThread.start();
+        Handler handler = new Handler(workerThread.getLooper());
+        return handler;
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/RemoteConnectionTest.java b/tests/tests/telecom/src/android/telecom/cts/RemoteConnectionTest.java
new file mode 100644
index 0000000..79fb592
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/RemoteConnectionTest.java
@@ -0,0 +1,1247 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import static android.telecom.cts.TestUtils.*;
+
+import android.graphics.SurfaceTexture;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.telecom.Call;
+import android.telecom.Connection;
+import android.telecom.ConnectionRequest;
+import android.telecom.DisconnectCause;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.RemoteConnection;
+import android.telecom.RemoteConnection.VideoProvider;
+import android.telecom.StatusHints;
+import android.telecom.TelecomManager;
+import android.telecom.VideoProfile;
+import android.view.Surface;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Extended suite of tests that use {@link CtsConnectionService} and {@link MockInCallService} to
+ * verify the functionality of Remote Connections.
+ * We make 2 connections on the {@link CtsConnectionService} & we create 2 connections on the
+ * {@link CtsRemoteConnectionService} via the {@link RemoteConnection} object. We store this
+ * corresponding RemoteConnection object on the connections to plumb the modifications on
+ * the connections in {@link CtsConnectionService} to the connections on
+ * {@link CtsRemoteConnectionService}.
+ */
+public class RemoteConnectionTest extends BaseRemoteTelecomTest {
+
+    MockConnection mConnection;
+    MockConnection mRemoteConnection;
+    RemoteConnection mRemoteConnectionObject;
+
+    public void testRemoteConnectionOutgoingCall() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        addRemoteConnectionOutgoingCall();
+        final Call call = mInCallCallbacks.getService().getLastCall();
+        assertCallState(call, Call.STATE_DIALING);
+
+        verifyRemoteConnectionObject(mRemoteConnectionObject, mRemoteConnection);
+
+        mConnection.setActive();
+        mRemoteConnection.setActive();
+
+        assertCallState(call, Call.STATE_ACTIVE);
+        assertConnectionState(mConnection, Connection.STATE_ACTIVE);
+        assertRemoteConnectionState(mRemoteConnectionObject, Connection.STATE_ACTIVE);
+        assertConnectionState(mRemoteConnection, Connection.STATE_ACTIVE);
+
+        call.hold();
+        assertCallState(call, Call.STATE_HOLDING);
+        assertConnectionState(mConnection, Connection.STATE_HOLDING);
+        assertRemoteConnectionState(mRemoteConnectionObject, Connection.STATE_HOLDING);
+        assertConnectionState(mRemoteConnection, Connection.STATE_HOLDING);
+
+        call.unhold();
+        assertCallState(call, Call.STATE_ACTIVE);
+        assertConnectionState(mConnection, Connection.STATE_ACTIVE);
+        assertRemoteConnectionState(mRemoteConnectionObject, Connection.STATE_ACTIVE);
+        assertConnectionState(mRemoteConnection, Connection.STATE_ACTIVE);
+
+        call.disconnect();
+        assertCallState(call, Call.STATE_DISCONNECTED);
+        assertConnectionState(mConnection, Connection.STATE_DISCONNECTED);
+        assertRemoteConnectionState(mRemoteConnectionObject, Connection.STATE_DISCONNECTED);
+        assertConnectionState(mRemoteConnection, Connection.STATE_DISCONNECTED);
+    }
+
+    public void testRemoteConnectionIncomingCallAccept() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        addRemoteConnectionIncomingCall();
+        final Call call = mInCallCallbacks.getService().getLastCall();
+        assertCallState(call, Call.STATE_RINGING);
+
+        verifyRemoteConnectionObject(mRemoteConnectionObject, mRemoteConnection);
+
+        assertConnectionState(mConnection, Connection.STATE_RINGING);
+        assertRemoteConnectionState(mRemoteConnectionObject, Connection.STATE_RINGING);
+        assertConnectionState(mRemoteConnection, Connection.STATE_RINGING);
+
+        call.answer(VideoProfile.STATE_AUDIO_ONLY);
+        assertCallState(call, Call.STATE_ACTIVE);
+        assertConnectionState(mConnection, Connection.STATE_ACTIVE);
+        assertRemoteConnectionState(mRemoteConnectionObject, Connection.STATE_ACTIVE);
+        assertConnectionState(mRemoteConnection, Connection.STATE_ACTIVE);
+    }
+
+    public void testRemoteConnectionIncomingCallReject() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        addRemoteConnectionIncomingCall();
+        final Call call = mInCallCallbacks.getService().getLastCall();
+        assertCallState(call, Call.STATE_RINGING);
+
+        verifyRemoteConnectionObject(mRemoteConnectionObject, mRemoteConnection);
+
+        assertConnectionState(mConnection, Connection.STATE_RINGING);
+        assertRemoteConnectionState(mRemoteConnectionObject, Connection.STATE_RINGING);
+        assertConnectionState(mRemoteConnection, Connection.STATE_RINGING);
+
+        call.reject(false, null);
+        assertCallState(call, Call.STATE_DISCONNECTED);
+        assertConnectionState(mConnection, Connection.STATE_DISCONNECTED);
+        assertRemoteConnectionState(mRemoteConnectionObject, Connection.STATE_DISCONNECTED);
+        assertConnectionState(mRemoteConnection, Connection.STATE_DISCONNECTED);
+    }
+
+    public void testRemoteConnectionDTMFTone() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        addRemoteConnectionIncomingCall();
+        final Call call = mInCallCallbacks.getService().getLastCall();
+        assertCallState(call, Call.STATE_RINGING);
+
+        verifyRemoteConnectionObject(mRemoteConnectionObject, mRemoteConnection);
+
+        assertTrue(mConnection.getDtmfString().isEmpty());
+        assertTrue(mRemoteConnection.getDtmfString().isEmpty());
+        call.playDtmfTone('1');
+        assertDtmfString(mConnection, "1");
+        assertDtmfString(mRemoteConnection, "1");
+        call.stopDtmfTone();
+        assertDtmfString(mConnection, "1.");
+        assertDtmfString(mRemoteConnection, "1.");
+        call.playDtmfTone('3');
+        assertDtmfString(mConnection, "1.3");
+        assertDtmfString(mRemoteConnection, "1.3");
+        call.stopDtmfTone();
+        assertDtmfString(mConnection, "1.3.");
+        assertDtmfString(mRemoteConnection, "1.3.");
+    }
+
+    public void testRemoteConnectionCallbacks_StateChange() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        Handler handler = setupRemoteConnectionCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionCallbacks_StateChange");
+        RemoteConnection.Callback callback;
+
+        callback = new RemoteConnection.Callback() {
+            @Override
+            public void onStateChanged(RemoteConnection connection, int state) {
+                super.onStateChanged(connection, state);
+                callbackInvoker.invoke(connection, state);
+            }
+        };
+        mRemoteConnectionObject.registerCallback(callback, handler);
+        mRemoteConnection.setActive();
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConnectionObject, callbackInvoker.getArgs(0)[0]);
+        assertEquals(Connection.STATE_ACTIVE, callbackInvoker.getArgs(0)[1]);
+        mRemoteConnectionObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConnectionCallbacks_RingbackRequest() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        Handler handler = setupRemoteConnectionCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionCallbacks_RingbackRequest");
+        RemoteConnection.Callback callback;
+
+        callback = new RemoteConnection.Callback() {
+            @Override
+            public void onRingbackRequested(RemoteConnection connection, boolean ringback) {
+                super.onRingbackRequested(connection, ringback);
+                callbackInvoker.invoke(connection, ringback);
+            }
+        };
+        mRemoteConnectionObject.registerCallback(callback, handler);
+        mRemoteConnection.setRingbackRequested(true);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConnectionObject, callbackInvoker.getArgs(0)[0]);
+        assertTrue((boolean) callbackInvoker.getArgs(0)[1]);
+        mRemoteConnectionObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConnectionCallbacks_ConnectionCapabilities() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        Handler handler = setupRemoteConnectionCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionCallbacks_ConnectionCapabilities");
+        RemoteConnection.Callback callback;
+
+        callback = new RemoteConnection.Callback() {
+            @Override
+            public void onConnectionCapabilitiesChanged(
+                    RemoteConnection connection,
+                    int connectionCapabilities) {
+                super.onConnectionCapabilitiesChanged(connection, connectionCapabilities);
+                callbackInvoker.invoke(connection, connectionCapabilities);
+            }
+        };
+        mRemoteConnectionObject.registerCallback(callback, handler);
+        int capabilities = mRemoteConnection.getConnectionCapabilities() | Connection.CAPABILITY_MUTE;
+        mRemoteConnection.setConnectionCapabilities(capabilities);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConnectionObject, callbackInvoker.getArgs(0)[0]);
+        assertEquals(capabilities, callbackInvoker.getArgs(0)[1]);
+        mRemoteConnectionObject.unregisterCallback(callback);
+
+    }
+
+    public void testRemoteConnectionCallbacks_PostDialWait() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        Handler handler = setupRemoteConnectionCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionCallbacks_PostDialWait");
+        RemoteConnection.Callback callback;
+
+        callback = new RemoteConnection.Callback() {
+            @Override
+            public void onPostDialWait(RemoteConnection connection,
+                                       String remainingPostDialSequence) {
+                super.onPostDialWait(connection, remainingPostDialSequence);
+                callbackInvoker.invoke(connection, remainingPostDialSequence);
+            }
+        };
+        mRemoteConnectionObject.registerCallback(callback, handler);
+        String postDialSequence = "test";
+        mRemoteConnection.setPostDialWait(postDialSequence);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConnectionObject, callbackInvoker.getArgs(0)[0]);
+        assertEquals(postDialSequence, callbackInvoker.getArgs(0)[1]);
+        mRemoteConnectionObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConnectionCallbacks_PostDialChar() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        Handler handler = setupRemoteConnectionCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionCallbacks_PostDialChar");
+        RemoteConnection.Callback callback;
+
+        callback = new RemoteConnection.Callback() {
+            @Override
+            public void onPostDialChar(RemoteConnection connection, char nextChar) {
+                super.onPostDialChar(connection, nextChar);
+                callbackInvoker.invoke(connection, nextChar);
+            }
+        };
+        mRemoteConnectionObject.registerCallback(callback, handler);
+        char postDialChar = '3';
+        ((Connection) mRemoteConnection).setNextPostDialChar(postDialChar);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConnectionObject, callbackInvoker.getArgs(0)[0]);
+        assertEquals(postDialChar, callbackInvoker.getArgs(0)[1]);
+        mRemoteConnectionObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConnectionCallbacks_VoipAudio() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        Handler handler = setupRemoteConnectionCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionCallbacks_VoipAudio");
+        RemoteConnection.Callback callback;
+
+        callback = new RemoteConnection.Callback() {
+            @Override
+            public void onVoipAudioChanged(RemoteConnection connection, boolean isVoip) {
+                super.onVoipAudioChanged(connection, isVoip);
+                callbackInvoker.invoke(connection, isVoip);
+            }
+        };
+        mRemoteConnectionObject.registerCallback(callback, handler);
+        mRemoteConnection.setAudioModeIsVoip(true);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConnectionObject, callbackInvoker.getArgs(0)[0]);
+        assertTrue((boolean) callbackInvoker.getArgs(0)[1]);
+        mRemoteConnectionObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConnectionCallbacks_StatusHints() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        Handler handler = setupRemoteConnectionCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionCallbacks_StatusHints");
+        RemoteConnection.Callback callback;
+
+        callback = new RemoteConnection.Callback() {
+            @Override
+            public void onStatusHintsChanged(RemoteConnection connection, StatusHints statusHints) {
+                super.onStatusHintsChanged(connection, statusHints);
+                callbackInvoker.invoke(connection, statusHints);
+            }
+        };
+        mRemoteConnectionObject.registerCallback(callback, handler);
+        StatusHints hints = new StatusHints("test", null, null);
+        mRemoteConnection.setStatusHints(hints);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConnectionObject, callbackInvoker.getArgs(0)[0]);
+        assertEquals(hints, callbackInvoker.getArgs(0)[1]);
+        mRemoteConnectionObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConnectionCallbacks_AddressChange() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        Handler handler = setupRemoteConnectionCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionCallbacks_AddressChange");
+        RemoteConnection.Callback callback;
+
+        callback = new RemoteConnection.Callback() {
+            @Override
+            public void onAddressChanged(RemoteConnection connection, Uri address,
+                                         int presentation) {
+                super.onAddressChanged(connection, address, presentation);
+                callbackInvoker.invoke(connection, address, presentation);
+            }
+        };
+        mRemoteConnectionObject.registerCallback(callback, handler);
+        Uri address = Uri.parse("tel:555");
+        mRemoteConnection.setAddress(address, TelecomManager.PRESENTATION_ALLOWED);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConnectionObject, callbackInvoker.getArgs(0)[0]);
+        assertEquals(address, callbackInvoker.getArgs(0)[1]);
+        assertEquals(TelecomManager.PRESENTATION_ALLOWED, callbackInvoker.getArgs(0)[2]);
+        mRemoteConnectionObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConnectionCallbacks_CallerDisplayName() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        Handler handler = setupRemoteConnectionCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionCallbacks_CallerDisplayName");
+        RemoteConnection.Callback callback;
+
+        callback = new RemoteConnection.Callback() {
+            @Override
+            public void onCallerDisplayNameChanged(
+                    RemoteConnection connection, String callerDisplayName, int presentation) {
+                super.onCallerDisplayNameChanged(connection, callerDisplayName, presentation);
+                callbackInvoker.invoke(connection, callerDisplayName, presentation);
+            }
+        };
+        mRemoteConnectionObject.registerCallback(callback, handler);
+        String callerDisplayName = "test";
+        mRemoteConnection.setCallerDisplayName(callerDisplayName, TelecomManager.PRESENTATION_ALLOWED);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConnectionObject, callbackInvoker.getArgs(0)[0]);
+        assertEquals(callerDisplayName, callbackInvoker.getArgs(0)[1]);
+        assertEquals(TelecomManager.PRESENTATION_ALLOWED, callbackInvoker.getArgs(0)[2]);
+        mRemoteConnectionObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConnectionCallbacks_VideoState() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        Handler handler = setupRemoteConnectionCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionCallbacks_VideoState");
+        RemoteConnection.Callback callback;
+
+        callback = new RemoteConnection.Callback() {
+            @Override
+            public void onVideoStateChanged(RemoteConnection connection, int videoState) {
+                super.onVideoStateChanged(connection, videoState);
+                callbackInvoker.invoke(connection, videoState);
+            }
+        };
+        mRemoteConnectionObject.registerCallback(callback, handler);
+        mRemoteConnection.setVideoState(VideoProfile.STATE_BIDIRECTIONAL);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConnectionObject, callbackInvoker.getArgs(0)[0]);
+        assertEquals(VideoProfile.STATE_BIDIRECTIONAL, callbackInvoker.getArgs(0)[1]);
+        mRemoteConnectionObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConnectionCallbacks_ConferenceableConnections() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        Handler handler = setupRemoteConnectionCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionCallbacks_ConferenceableConnections");
+        RemoteConnection.Callback callback;
+
+        callback = new RemoteConnection.Callback() {
+            @Override
+            public void onConferenceableConnectionsChanged(
+                    RemoteConnection connection,
+                    List<RemoteConnection> conferenceableConnections) {
+                super.onConferenceableConnectionsChanged(connection, conferenceableConnections);
+                callbackInvoker.invoke(connection, conferenceableConnections);
+            }
+        };
+        mRemoteConnectionObject.registerCallback(callback, handler);
+        //Make the existing call active to add a new call
+        final Call call = mInCallCallbacks.getService().getLastCall();
+        mConnection.setActive();
+        mRemoteConnection.setActive();
+        assertCallState(call, Call.STATE_ACTIVE);
+        placeAndVerifyCall();
+        RemoteConnection newRemoteConnectionObject =
+                verifyConnectionForOutgoingCall(1).getRemoteConnection();
+        MockConnection newConnection = verifyConnectionForOutgoingCallOnRemoteCS(1);
+        ArrayList<Connection> confList = new ArrayList<>();
+        confList.add(newConnection);
+        mRemoteConnection.setConferenceableConnections(confList);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConnectionObject, callbackInvoker.getArgs(0)[0]);
+        //assertTrue(((List<RemoteConnection>)callbackInvoker.getArgs(0)[1]).contains(
+                //newRemoteConnectionObject)); No "equals" method in RemoteConnection
+        mRemoteConnectionObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConnectionCallbacks_VideoProvider() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        Handler handler = setupRemoteConnectionCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionCallbacks_VideoProvider");
+        RemoteConnection.Callback callback;
+
+        callback = new RemoteConnection.Callback() {
+            @Override
+            public void onVideoProviderChanged(
+                    RemoteConnection connection, VideoProvider videoProvider) {
+                super.onVideoProviderChanged(connection, videoProvider);
+                callbackInvoker.invoke(connection, videoProvider);
+            }
+        };
+        mRemoteConnectionObject.registerCallback(callback, handler);
+        mRemoteConnection.createMockVideoProvider();
+        MockVideoProvider mockVideoProvider = mRemoteConnection.getMockVideoProvider();
+        mRemoteConnection.setVideoProvider(mockVideoProvider);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConnectionObject, callbackInvoker.getArgs(0)[0]);
+        mRemoteConnectionObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConnectionCallbacks_Extras() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        Handler handler = setupRemoteConnectionCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionCallbacks_Extras");
+        RemoteConnection.Callback callback;
+
+        callback = new RemoteConnection.Callback() {
+            @Override
+            public void onExtrasChanged(RemoteConnection connection, Bundle extras) {
+                super.onExtrasChanged(connection, extras);
+                callbackInvoker.invoke(connection, extras);
+            }
+        };
+        mRemoteConnectionObject.registerCallback(callback, handler);
+        Bundle extras = new Bundle();
+        extras.putString(TelecomManager.EXTRA_CALL_DISCONNECT_MESSAGE, "Test");
+        mRemoteConnection.setExtras(extras);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConnectionObject, callbackInvoker.getArgs(0)[0]);
+        assertEquals(extras, callbackInvoker.getArgs(0)[1]);
+        mRemoteConnectionObject.unregisterCallback(callback);
+
+    }
+
+    public void testRemoteConnectionCallbacks_Disconnect() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        Handler handler = setupRemoteConnectionCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionCallbacks_Disconnect");
+        RemoteConnection.Callback callback;
+
+        callback = new RemoteConnection.Callback() {
+            @Override
+            public void onDisconnected(
+                    RemoteConnection connection,
+                    DisconnectCause disconnectCause) {
+                super.onDisconnected(connection, disconnectCause);
+                callbackInvoker.invoke(connection, disconnectCause);
+            }
+        };
+        mRemoteConnectionObject.registerCallback(callback, handler);
+        DisconnectCause cause = new DisconnectCause(DisconnectCause.LOCAL);
+        mRemoteConnection.setDisconnected(cause);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConnectionObject, callbackInvoker.getArgs(0)[0]);
+        assertEquals(cause, callbackInvoker.getArgs(0)[1]);
+        mRemoteConnectionObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConnectionCallbacks_Destroy() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        Handler handler = setupRemoteConnectionCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionCallbacks_Destroy");
+        RemoteConnection.Callback callback;
+
+        callback = new RemoteConnection.Callback() {
+            @Override
+            public void onDestroyed(RemoteConnection connection) {
+                super.onDestroyed(connection);
+                callbackInvoker.invoke(connection);
+            }
+        };
+        mRemoteConnectionObject.registerCallback(callback, handler);
+        mRemoteConnection.destroy();
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConnectionObject, callbackInvoker.getArgs(0)[0]);
+        mRemoteConnectionObject.unregisterCallback(callback);
+    }
+
+    public void testRemoteConnectionVideoCallbacks_SessionModify() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        setupRemoteConnectionVideoCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionVideoCallbacks_SessionModify");
+        final VideoProvider remoteVideoProvider = mRemoteConnectionObject.getVideoProvider();
+        final MockVideoProvider mockVideoProvider = mRemoteConnection.getMockVideoProvider();
+        RemoteConnection.VideoProvider.Callback videoCallback;
+
+        videoCallback = new RemoteConnection.VideoProvider.Callback() {
+            @Override
+            public void onSessionModifyRequestReceived(
+                    VideoProvider videoProvider,
+                    VideoProfile videoProfile) {
+                super.onSessionModifyRequestReceived(videoProvider, videoProfile);
+                callbackInvoker.invoke(videoProvider, videoProfile);
+            }
+
+            @Override
+            public void onSessionModifyResponseReceived(
+                    VideoProvider videoProvider,
+                    int status,
+                    VideoProfile requestedProfile,
+                    VideoProfile responseProfile) {
+                super.onSessionModifyResponseReceived(videoProvider, status, requestedProfile,
+                        responseProfile);
+                callbackInvoker.invoke(videoProvider, status, requestedProfile, responseProfile);
+            }
+        };
+        remoteVideoProvider.registerCallback(videoCallback);
+        VideoProfile videoProfile = new VideoProfile(VideoProfile.STATE_BIDIRECTIONAL);
+        mockVideoProvider.sendMockSessionModifyRequest(videoProfile);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(remoteVideoProvider, callbackInvoker.getArgs(0)[0]);
+        assertEquals(videoProfile, callbackInvoker.getArgs(0)[1]);
+        remoteVideoProvider.unregisterCallback(videoCallback);
+    }
+
+    public void testRemoteConnectionVideoCallbacks_SessionEvent() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        setupRemoteConnectionVideoCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionVideoCallbacks_SessionEvent");
+        final VideoProvider remoteVideoProvider = mRemoteConnectionObject.getVideoProvider();
+        final MockVideoProvider mockVideoProvider = mRemoteConnection.getMockVideoProvider();
+        RemoteConnection.VideoProvider.Callback videoCallback;
+
+        videoCallback = new RemoteConnection.VideoProvider.Callback() {
+            @Override
+            public void onCallSessionEvent(VideoProvider videoProvider, int event) {
+                super.onCallSessionEvent(videoProvider, event);
+                callbackInvoker.invoke(videoProvider, event);
+            }
+        };
+        remoteVideoProvider.registerCallback(videoCallback);
+        mockVideoProvider.handleCallSessionEvent(Connection.VideoProvider.SESSION_EVENT_RX_PAUSE);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(remoteVideoProvider, callbackInvoker.getArgs(0)[0]);
+        assertEquals(Connection.VideoProvider.SESSION_EVENT_RX_PAUSE, callbackInvoker.getArgs(0)[1]);
+        remoteVideoProvider.unregisterCallback(videoCallback);
+    }
+
+    public void testRemoteConnectionVideoCallbacks_PeerDimensions() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        setupRemoteConnectionVideoCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionVideoCallbacks_PeerDimensions");
+        final VideoProvider remoteVideoProvider = mRemoteConnectionObject.getVideoProvider();
+        final MockVideoProvider mockVideoProvider = mRemoteConnection.getMockVideoProvider();
+        RemoteConnection.VideoProvider.Callback videoCallback;
+
+        videoCallback = new RemoteConnection.VideoProvider.Callback() {
+            @Override
+            public void onPeerDimensionsChanged(VideoProvider videoProvider, int width,
+                                                int height) {
+                super.onPeerDimensionsChanged(videoProvider, width, height);
+                callbackInvoker.invoke(videoProvider, width, height);
+            }
+        };
+        remoteVideoProvider.registerCallback(videoCallback);
+        final int width = 100, heigth = 20;
+        mockVideoProvider.changePeerDimensions(width, heigth);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(remoteVideoProvider, callbackInvoker.getArgs(0)[0]);
+        assertEquals(width, callbackInvoker.getArgs(0)[1]);
+        assertEquals(heigth, callbackInvoker.getArgs(0)[2]);
+        remoteVideoProvider.unregisterCallback(videoCallback);
+    }
+
+    public void testRemoteConnectionVideoCallbacks_CallDataUsage() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        setupRemoteConnectionVideoCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionVideoCallbacks_CallDataUsage");
+        final VideoProvider remoteVideoProvider = mRemoteConnectionObject.getVideoProvider();
+        final MockVideoProvider mockVideoProvider = mRemoteConnection.getMockVideoProvider();
+        RemoteConnection.VideoProvider.Callback videoCallback;
+
+        videoCallback = new RemoteConnection.VideoProvider.Callback() {
+            @Override
+            public void onCallDataUsageChanged(VideoProvider videoProvider, long dataUsage) {
+                super.onCallDataUsageChanged(videoProvider, dataUsage);
+                callbackInvoker.invoke(videoProvider, dataUsage);
+            }
+        };
+        remoteVideoProvider.registerCallback(videoCallback);
+        long callDataUsage = 10000;
+        mockVideoProvider.setCallDataUsage(callDataUsage);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(remoteVideoProvider, callbackInvoker.getArgs(0)[0]);
+        assertEquals(callDataUsage, callbackInvoker.getArgs(0)[1]);
+        remoteVideoProvider.unregisterCallback(videoCallback);
+    }
+
+    public void testRemoteConnectionVideoCallbacks_CameraCapabilities() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        setupRemoteConnectionVideoCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionVideoCallbacks_CameraCapabilities");
+        final VideoProvider remoteVideoProvider = mRemoteConnectionObject.getVideoProvider();
+        final MockVideoProvider mockVideoProvider = mRemoteConnection.getMockVideoProvider();
+        RemoteConnection.VideoProvider.Callback videoCallback;
+
+        videoCallback = new RemoteConnection.VideoProvider.Callback() {
+            @Override
+            public void onCameraCapabilitiesChanged(
+                    VideoProvider videoProvider,
+                    VideoProfile.CameraCapabilities cameraCapabilities) {
+                super.onCameraCapabilitiesChanged(videoProvider, cameraCapabilities);
+                callbackInvoker.invoke(videoProvider, cameraCapabilities);
+            }
+        };
+        remoteVideoProvider.registerCallback(videoCallback);
+        VideoProfile.CameraCapabilities capabilities = new VideoProfile.CameraCapabilities(100, 200);
+        mockVideoProvider.changeCameraCapabilities(capabilities);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(remoteVideoProvider, callbackInvoker.getArgs(0)[0]);
+        assertEquals(capabilities, callbackInvoker.getArgs(0)[1]);
+        remoteVideoProvider.unregisterCallback(videoCallback);
+    }
+
+    public void testRemoteConnectionVideoCallbacks_VideoQuality() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        setupRemoteConnectionVideoCallbacksTest();
+
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionVideoCallbacks_VideoQuality");
+        final VideoProvider remoteVideoProvider = mRemoteConnectionObject.getVideoProvider();
+        final MockVideoProvider mockVideoProvider = mRemoteConnection.getMockVideoProvider();
+        RemoteConnection.VideoProvider.Callback videoCallback;
+
+        videoCallback = new RemoteConnection.VideoProvider.Callback() {
+            @Override
+            public void onVideoQualityChanged(VideoProvider videoProvider, int videoQuality) {
+                super.onVideoQualityChanged(videoProvider, videoQuality);
+                callbackInvoker.invoke(videoProvider, videoQuality);
+            }
+        };
+        remoteVideoProvider.registerCallback(videoCallback);
+        final int videoQuality = 10;
+        mockVideoProvider.changeVideoQuality(videoQuality);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(remoteVideoProvider, callbackInvoker.getArgs(0)[0]);
+        assertEquals(videoQuality, callbackInvoker.getArgs(0)[1]);
+        remoteVideoProvider.unregisterCallback(videoCallback);
+    }
+
+    public void testRemoteConnectionVideo_RequestCallDataUsage() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        final long callDataUsage = 10000;
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionVideo_RequestCallDataUsage");
+        final MockVideoProvider mockVideoProvider = new MockVideoProvider(mRemoteConnection) {
+            @Override
+            public void onRequestConnectionDataUsage() {
+                callbackInvoker.invoke();
+                super.setCallDataUsage(callDataUsage);
+            }
+        };
+        setupRemoteConnectionVideoTest(mockVideoProvider);
+
+        final VideoProvider remoteVideoProvider = mRemoteConnectionObject.getVideoProvider();
+        RemoteConnection.VideoProvider.Callback videoCallback;
+
+        videoCallback = new RemoteConnection.VideoProvider.Callback() {
+            @Override
+            public void onCallDataUsageChanged(VideoProvider videoProvider, long dataUsage) {
+                super.onCallDataUsageChanged(videoProvider, dataUsage);
+                callbackInvoker.invoke(videoProvider, dataUsage);
+            }
+        };
+        remoteVideoProvider.registerCallback(videoCallback);
+        remoteVideoProvider.requestCallDataUsage();
+        callbackInvoker.waitForCount(2, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(remoteVideoProvider, callbackInvoker.getArgs(1)[0]);
+        assertEquals(callDataUsage, callbackInvoker.getArgs(1)[1]);
+        remoteVideoProvider.unregisterCallback(videoCallback);
+    }
+
+    public void testRemoteConnectionVideo_RequestCameraCapabilities() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        final VideoProfile.CameraCapabilities capabilities =
+                new VideoProfile.CameraCapabilities(100, 200);
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionVideo_RequestCameraCapabilities");
+        final MockVideoProvider mockVideoProvider = new MockVideoProvider(mRemoteConnection) {
+            @Override
+            public void onRequestCameraCapabilities() {
+                callbackInvoker.invoke();
+                super.changeCameraCapabilities(capabilities);
+            }
+        };
+        setupRemoteConnectionVideoTest(mockVideoProvider);
+
+        final VideoProvider remoteVideoProvider = mRemoteConnectionObject.getVideoProvider();
+        RemoteConnection.VideoProvider.Callback videoCallback;
+
+        videoCallback = new RemoteConnection.VideoProvider.Callback() {
+            @Override
+            public void onCameraCapabilitiesChanged(
+                    VideoProvider videoProvider,
+                    VideoProfile.CameraCapabilities cameraCapabilities) {
+                super.onCameraCapabilitiesChanged(videoProvider, cameraCapabilities);
+                callbackInvoker.invoke(videoProvider, cameraCapabilities);
+            }
+        };
+        remoteVideoProvider.registerCallback(videoCallback);
+        remoteVideoProvider.requestCameraCapabilities();
+        callbackInvoker.waitForCount(2, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(remoteVideoProvider, callbackInvoker.getArgs(1)[0]);
+        assertEquals(capabilities, callbackInvoker.getArgs(1)[1]);
+        remoteVideoProvider.unregisterCallback(videoCallback);
+    }
+
+    public void testRemoteConnectionVideo_SendSessionModifyRequest() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        VideoProfile fromVideoProfile = new VideoProfile(VideoProfile.STATE_AUDIO_ONLY);
+        VideoProfile toVideoProfile =  new VideoProfile(VideoProfile.STATE_BIDIRECTIONAL);
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionVideo_SendSessionModifyRequest");
+        final MockVideoProvider mockVideoProvider = new MockVideoProvider(mRemoteConnection) {
+            @Override
+            public void onSendSessionModifyRequest(VideoProfile fromProfile,
+                                                   VideoProfile toProfile) {
+                callbackInvoker.invoke(fromProfile, toProfile);
+                super.receiveSessionModifyRequest(toProfile);
+            }
+        };
+        setupRemoteConnectionVideoTest(mockVideoProvider);
+
+        final VideoProvider remoteVideoProvider = mRemoteConnectionObject.getVideoProvider();
+        RemoteConnection.VideoProvider.Callback videoCallback;
+
+        videoCallback = new RemoteConnection.VideoProvider.Callback() {
+            @Override
+            public void onSessionModifyRequestReceived(
+                    VideoProvider videoProvider,
+                    VideoProfile videoProfile) {
+                super.onSessionModifyRequestReceived(videoProvider, videoProfile);
+                callbackInvoker.invoke(videoProvider, videoProfile);
+            }
+        };
+        remoteVideoProvider.registerCallback(videoCallback);
+        remoteVideoProvider.sendSessionModifyRequest(fromVideoProfile, toVideoProfile);
+        callbackInvoker.waitForCount(2, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(fromVideoProfile, callbackInvoker.getArgs(0)[0]);
+        assertEquals(toVideoProfile, callbackInvoker.getArgs(0)[1]);
+        assertEquals(remoteVideoProvider, callbackInvoker.getArgs(1)[0]);
+        assertEquals(toVideoProfile, callbackInvoker.getArgs(1)[1]);
+        remoteVideoProvider.unregisterCallback(videoCallback);
+    }
+
+    public void testRemoteConnectionVideo_SendSessionModifyResponse() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        VideoProfile toVideoProfile =  new VideoProfile(VideoProfile.STATE_BIDIRECTIONAL);
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionVideo_SendSessionModifyResponse");
+        final MockVideoProvider mockVideoProvider = new MockVideoProvider(mRemoteConnection) {
+            @Override
+            public void onSendSessionModifyResponse(VideoProfile responseProfile) {
+                callbackInvoker.invoke(responseProfile);
+                super.receiveSessionModifyResponse(
+                        Connection.VideoProvider.SESSION_MODIFY_REQUEST_SUCCESS,
+                        responseProfile, responseProfile);
+            }
+        };
+        setupRemoteConnectionVideoTest(mockVideoProvider);
+
+        final VideoProvider remoteVideoProvider = mRemoteConnectionObject.getVideoProvider();
+        RemoteConnection.VideoProvider.Callback videoCallback;
+
+        videoCallback = new RemoteConnection.VideoProvider.Callback() {
+            @Override
+            public void onSessionModifyResponseReceived(
+                    VideoProvider videoProvider,
+                    int status,
+                    VideoProfile requestedProfile,
+                    VideoProfile responseProfile) {
+                super.onSessionModifyResponseReceived(videoProvider, status, requestedProfile,
+                        responseProfile);
+                callbackInvoker.invoke(videoProvider, status, requestedProfile, responseProfile);
+            }
+        };
+        remoteVideoProvider.registerCallback(videoCallback);
+        remoteVideoProvider.sendSessionModifyResponse(toVideoProfile);
+        callbackInvoker.waitForCount(2, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(toVideoProfile, callbackInvoker.getArgs(0)[0]);
+        assertEquals(remoteVideoProvider, callbackInvoker.getArgs(1)[0]);
+        assertEquals(toVideoProfile, callbackInvoker.getArgs(1)[2]);
+        assertEquals(Connection.VideoProvider.SESSION_MODIFY_REQUEST_SUCCESS,
+            callbackInvoker.getArgs(1)[1]);
+        assertEquals(toVideoProfile, callbackInvoker.getArgs(1)[3]);
+        remoteVideoProvider.unregisterCallback(videoCallback);
+    }
+
+    public void testRemoteConnectionVideo_SetCamera() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        final String newCameraId = "5";
+        final VideoProfile.CameraCapabilities capabilities =
+            new VideoProfile.CameraCapabilities(100, 200);
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionVideo_SetCamera");
+        final MockVideoProvider mockVideoProvider = new MockVideoProvider(mRemoteConnection) {
+            @Override
+            public void onSetCamera(String cameraId) {
+                callbackInvoker.invoke(cameraId);
+                super.changeCameraCapabilities(capabilities);
+            }
+        };
+        setupRemoteConnectionVideoTest(mockVideoProvider);
+
+        final VideoProvider remoteVideoProvider = mRemoteConnectionObject.getVideoProvider();
+        RemoteConnection.VideoProvider.Callback videoCallback;
+
+        videoCallback = new RemoteConnection.VideoProvider.Callback() {
+            @Override
+            public void onCameraCapabilitiesChanged(
+                    VideoProvider videoProvider,
+                    VideoProfile.CameraCapabilities cameraCapabilities) {
+                super.onCameraCapabilitiesChanged(videoProvider, cameraCapabilities);
+                callbackInvoker.invoke(videoProvider, cameraCapabilities);
+            }
+        };
+        remoteVideoProvider.registerCallback(videoCallback);
+        remoteVideoProvider.setCamera(newCameraId);
+        callbackInvoker.waitForCount(2, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(newCameraId, callbackInvoker.getArgs(0)[0]);
+        assertEquals(remoteVideoProvider, callbackInvoker.getArgs(1)[0]);
+        assertEquals(capabilities, callbackInvoker.getArgs(1)[1]);
+        remoteVideoProvider.unregisterCallback(videoCallback);
+    }
+
+    public void testRemoteConnectionVideo_SetDeviceOrientation() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        final int newRotation = 5;
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionVideo_SetDeviceOrientation");
+        final MockVideoProvider mockVideoProvider = new MockVideoProvider(mRemoteConnection) {
+            @Override
+            public void onSetDeviceOrientation(int rotation) {
+                callbackInvoker.invoke(rotation);
+            }
+        };
+        setupRemoteConnectionVideoTest(mockVideoProvider);
+
+        final VideoProvider remoteVideoProvider = mRemoteConnectionObject.getVideoProvider();
+
+        remoteVideoProvider.setDeviceOrientation(newRotation);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(newRotation, callbackInvoker.getArgs(0)[0]);
+    }
+
+    public void testRemoteConnectionVideo_SetDisplaySurface() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        final Surface newSurface = new Surface(new SurfaceTexture(1));
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionVideo_SetDisplaySurface");
+        final MockVideoProvider mockVideoProvider = new MockVideoProvider(mRemoteConnection) {
+            @Override
+            public void onSetDisplaySurface(Surface surface) {
+                callbackInvoker.invoke(surface);
+            }
+        };
+        setupRemoteConnectionVideoTest(mockVideoProvider);
+
+        final VideoProvider remoteVideoProvider = mRemoteConnectionObject.getVideoProvider();
+
+        remoteVideoProvider.setDisplaySurface(newSurface);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(newSurface, callbackInvoker.getArgs(0)[0]);
+    }
+
+    public void testRemoteConnectionVideo_SetPauseImage() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        final Uri newUri = Uri.parse("content://");
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionVideo_SetPauseImage");
+        final MockVideoProvider mockVideoProvider = new MockVideoProvider(mRemoteConnection) {
+            @Override
+            public void onSetPauseImage(Uri uri) {
+                callbackInvoker.invoke(uri);
+            }
+        };
+        setupRemoteConnectionVideoTest(mockVideoProvider);
+
+        final VideoProvider remoteVideoProvider = mRemoteConnectionObject.getVideoProvider();
+
+        remoteVideoProvider.setPauseImage(newUri);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(newUri, callbackInvoker.getArgs(0)[0]);
+    }
+
+    public void testRemoteConnectionVideo_SetPreviewSurface() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        final Surface newSurface = new Surface(new SurfaceTexture(1));
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionVideo_SetPreviewSurface");
+        final MockVideoProvider mockVideoProvider = new MockVideoProvider(mRemoteConnection) {
+            @Override
+            public void onSetPreviewSurface(Surface surface) {
+                callbackInvoker.invoke(surface);
+            }
+        };
+        setupRemoteConnectionVideoTest(mockVideoProvider);
+
+        final VideoProvider remoteVideoProvider = mRemoteConnectionObject.getVideoProvider();
+
+        remoteVideoProvider.setPreviewSurface(newSurface);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(newSurface, callbackInvoker.getArgs(0)[0]);
+    }
+
+    public void testRemoteConnectionVideo_SetZoom() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        final float newZoom = 1.0f;
+        final InvokeCounter callbackInvoker =
+                new InvokeCounter("testRemoteConnectionVideo_SetPreviewSurface");
+        final MockVideoProvider mockVideoProvider = new MockVideoProvider(mRemoteConnection) {
+            @Override
+            public void onSetZoom(float value) {
+                callbackInvoker.invoke(value);
+            }
+        };
+        setupRemoteConnectionVideoTest(mockVideoProvider);
+
+        final VideoProvider remoteVideoProvider = mRemoteConnectionObject.getVideoProvider();
+
+        remoteVideoProvider.setZoom(newZoom);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(newZoom, callbackInvoker.getArgs(0)[0]);
+    }
+
+    private void verifyRemoteConnectionObject(RemoteConnection remoteConnection,
+            Connection connection) {
+        assertEquals(connection.getAddress(), remoteConnection.getAddress());
+        assertEquals(connection.getAddressPresentation(),
+                remoteConnection.getAddressPresentation());
+        assertEquals(connection.getCallerDisplayName(), remoteConnection.getCallerDisplayName());
+        assertEquals(connection.getCallerDisplayNamePresentation(),
+                remoteConnection.getCallerDisplayNamePresentation());
+        assertEquals(connection.getConnectionCapabilities(),
+                remoteConnection.getConnectionCapabilities());
+        assertEquals(connection.getDisconnectCause(), remoteConnection.getDisconnectCause());
+        assertEquals(connection.getExtras(), remoteConnection.getExtras());
+        assertEquals(connection.getStatusHints(), remoteConnection.getStatusHints());
+        assertEquals(VideoProfile.STATE_AUDIO_ONLY, remoteConnection.getVideoState());
+        assertNull(remoteConnection.getVideoProvider());
+        assertTrue(remoteConnection.getConferenceableConnections().isEmpty());
+    }
+
+    private void addRemoteConnectionOutgoingCall() {
+        try {
+            MockConnectionService managerConnectionService = new MockConnectionService() {
+                @Override
+                public Connection onCreateOutgoingConnection(
+                        PhoneAccountHandle connectionManagerPhoneAccount,
+                        ConnectionRequest request) {
+                    MockConnection connection = (MockConnection)super.onCreateOutgoingConnection(
+                            connectionManagerPhoneAccount, request);
+                    ConnectionRequest remoteRequest = new ConnectionRequest(
+                            TEST_REMOTE_PHONE_ACCOUNT_HANDLE,
+                            request.getAddress(),
+                            request.getExtras());
+                    RemoteConnection remoteConnection =
+                            CtsConnectionService.createRemoteOutgoingConnectionToTelecom(
+                                    TEST_REMOTE_PHONE_ACCOUNT_HANDLE, remoteRequest);
+                    connection.setRemoteConnection(remoteConnection);
+                    return connection;
+                }
+            };
+            setupConnectionServices(managerConnectionService, null, FLAG_REGISTER | FLAG_ENABLE);
+        } catch(Exception e) {
+            fail("Error in setting up the connection services");
+        }
+        placeAndVerifyCall();
+        /**
+         * Retrieve the connection from both the connection services and see if the plumbing via
+         * RemoteConnection object is working.
+         */
+        mConnection = verifyConnectionForOutgoingCall();
+        mRemoteConnection = verifyConnectionForOutgoingCallOnRemoteCS();
+        mRemoteConnectionObject = mConnection.getRemoteConnection();
+    }
+
+    private void addRemoteConnectionIncomingCall() {
+        try {
+            MockConnectionService managerConnectionService = new MockConnectionService() {
+                @Override
+                public Connection onCreateIncomingConnection(
+                        PhoneAccountHandle connectionManagerPhoneAccount,
+                        ConnectionRequest request) {
+                    MockConnection connection = (MockConnection)super.onCreateIncomingConnection(
+                            connectionManagerPhoneAccount, request);
+                    ConnectionRequest remoteRequest = new ConnectionRequest(
+                            TEST_REMOTE_PHONE_ACCOUNT_HANDLE,
+                            request.getAddress(),
+                            request.getExtras());
+                    RemoteConnection remoteConnection =
+                            CtsConnectionService.createRemoteIncomingConnectionToTelecom(
+                                    TEST_REMOTE_PHONE_ACCOUNT_HANDLE, remoteRequest);
+                    connection.setRemoteConnection(remoteConnection);
+                    return connection;
+                }
+            };
+            setupConnectionServices(managerConnectionService, null, FLAG_REGISTER | FLAG_ENABLE);
+        } catch(Exception e) {
+            fail("Error in setting up the connection services");
+        }
+        addAndVerifyNewIncomingCall(createTestNumber(), null);
+        /**
+         * Retrieve the connection from both the connection services and see if the plumbing via
+         * RemoteConnection object is working.
+         */
+        mConnection = verifyConnectionForIncomingCall();
+        mRemoteConnection = verifyConnectionForIncomingCallOnRemoteCS();
+        mRemoteConnectionObject = mConnection.getRemoteConnection();
+    }
+
+    private Handler setupRemoteConnectionCallbacksTest() {
+        addRemoteConnectionOutgoingCall();
+        final Call call = mInCallCallbacks.getService().getLastCall();
+        assertCallState(call, Call.STATE_DIALING);
+        verifyRemoteConnectionObject(mRemoteConnectionObject, mRemoteConnection);
+
+        // Create a looper thread for the callbacks.
+        HandlerThread workerThread = new HandlerThread("CallbackThread");
+        workerThread.start();
+        Handler handler = new Handler(workerThread.getLooper());
+        return handler;
+    }
+
+    private Handler setupRemoteConnectionVideoCallbacksTest() {
+        addRemoteConnectionOutgoingCall();
+        final Call call = mInCallCallbacks.getService().getLastCall();
+        assertCallState(call, Call.STATE_DIALING);
+        verifyRemoteConnectionObject(mRemoteConnectionObject, mRemoteConnection);
+
+        // Create a looper thread for the callbacks.
+        HandlerThread workerThread = new HandlerThread("CallbackThread");
+        workerThread.start();
+        Handler handler = new Handler(workerThread.getLooper());
+
+        final InvokeCounter callbackInvoker = new InvokeCounter("RemoteConnectionCallbacks");
+
+        RemoteConnection.Callback callback = new RemoteConnection.Callback() {
+            @Override
+            public void onVideoProviderChanged(
+                    RemoteConnection connection, VideoProvider videoProvider) {
+                callbackInvoker.invoke(connection, videoProvider);
+            }
+        };
+        mRemoteConnectionObject.registerCallback(callback, handler);
+        mRemoteConnection.createMockVideoProvider();
+        mRemoteConnection.setVideoProvider(mRemoteConnection.getMockVideoProvider());
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConnectionObject, callbackInvoker.getArgs(0)[0]);
+        mRemoteConnectionObject.unregisterCallback(callback);
+        return handler;
+    }
+
+    private Handler setupRemoteConnectionVideoTest(MockVideoProvider mockVideoProvider) {
+        addRemoteConnectionOutgoingCall();
+        final Call call = mInCallCallbacks.getService().getLastCall();
+        assertCallState(call, Call.STATE_DIALING);
+        verifyRemoteConnectionObject(mRemoteConnectionObject, mRemoteConnection);
+
+        // Create a looper thread for the callbacks.
+        HandlerThread workerThread = new HandlerThread("CallbackThread");
+        workerThread.start();
+        Handler handler = new Handler(workerThread.getLooper());
+
+        final InvokeCounter callbackInvoker = new InvokeCounter("RemoteConnectionCallbacks");
+
+        RemoteConnection.Callback callback = new RemoteConnection.Callback() {
+            @Override
+            public void onVideoProviderChanged(
+                    RemoteConnection connection, VideoProvider videoProvider) {
+                callbackInvoker.invoke(connection, videoProvider);
+            }
+        };
+        mRemoteConnectionObject.registerCallback(callback, handler);
+        mRemoteConnection.setVideoProvider(mockVideoProvider);
+        callbackInvoker.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(mRemoteConnectionObject, callbackInvoker.getArgs(0)[0]);
+        mRemoteConnectionObject.unregisterCallback(callback);
+        return handler;
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/SimCallManagerTest.java b/tests/tests/telecom/src/android/telecom/cts/SimCallManagerTest.java
new file mode 100644
index 0000000..a7961c3
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/SimCallManagerTest.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import static android.telecom.cts.TestUtils.ACCOUNT_ID;
+import static android.telecom.cts.TestUtils.ACCOUNT_LABEL;
+import static android.telecom.cts.TestUtils.COMPONENT;
+import static android.telecom.cts.TestUtils.PACKAGE;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.graphics.Color;
+import android.net.Uri;
+import android.os.PersistableBundle;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
+import android.telephony.CarrierConfigManager;
+import android.test.InstrumentationTestCase;
+import android.text.TextUtils;
+
+import java.util.Arrays;
+
+/**
+ * Verifies the behavior of TelecomManager.getSimCallManager() with respect to the default dialer
+ */
+public class SimCallManagerTest extends InstrumentationTestCase {
+    public static final PhoneAccountHandle TEST_PHONE_ACCOUNT_HANDLE =
+            new PhoneAccountHandle(new ComponentName(PACKAGE, COMPONENT), ACCOUNT_ID);
+
+    public static final PhoneAccount TEST_SIM_CALL_MANAGER_ACCOUNT = PhoneAccount.builder(
+            TEST_PHONE_ACCOUNT_HANDLE, ACCOUNT_LABEL)
+            .setAddress(Uri.parse("tel:555-TEST"))
+            .setSubscriptionAddress(Uri.parse("tel:555-TEST"))
+            .setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
+            .setHighlightColor(Color.RED)
+            .setShortDescription(ACCOUNT_LABEL)
+            .setSupportedUriSchemes(Arrays.asList("tel"))
+            .build();
+
+    private Context mContext;
+    private TelecomManager mTelecomManager;
+    private String mPreviousDefaultDialer = null;
+    private String mSystemDialer = null;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mContext = getInstrumentation().getContext();
+
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+        mPreviousDefaultDialer = TestUtils.getDefaultDialer(getInstrumentation());
+        // Reset the current dialer to the system dialer, to ensure that we start each test
+        // without being the default dialer.
+        mSystemDialer = TestUtils.getSystemDialer(getInstrumentation());
+        if (!TextUtils.isEmpty(mSystemDialer)) {
+            TestUtils.setDefaultDialer(getInstrumentation(), mSystemDialer);
+        }
+        mTelecomManager = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (!TextUtils.isEmpty(mPreviousDefaultDialer)) {
+            // Restore the default dialer to whatever the default dialer was before the tests
+            // were started. This may or may not be the system dialer.
+            TestUtils.setDefaultDialer(getInstrumentation(), mPreviousDefaultDialer);
+        }
+        super.tearDown();
+    }
+
+    public void testGetSimCallManager() throws Exception {
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+
+        // By default, getSimCallManager should return either the carrier configured sim call
+        // manager or the system dialer's sim call manager.
+        assertEquals(mSystemDialer, mTelecomManager.getDefaultDialerPackage());
+        assertNotSame(TEST_PHONE_ACCOUNT_HANDLE, mTelecomManager.getSimCallManager());
+
+        ComponentName carrierConfigSimCallManager = null;
+        CarrierConfigManager configManager = (CarrierConfigManager) mContext.getSystemService(
+                Context.CARRIER_CONFIG_SERVICE);
+        PersistableBundle configBundle = configManager.getConfig();
+        if (configBundle != null) {
+            final String componentString = configBundle.getString(
+                    CarrierConfigManager.KEY_DEFAULT_SIM_CALL_MANAGER_STRING);
+            if (!TextUtils.isEmpty(componentString)) {
+                carrierConfigSimCallManager = ComponentName.unflattenFromString(componentString);
+            }
+        }
+
+        // If the default dialer has not registered a sim call manager, getSimCallManager should
+        // return the carrier configured sim call manager (which can be null).
+        PhoneAccountHandle simCallManager = mTelecomManager.getSimCallManager();
+        TestUtils.setDefaultDialer(getInstrumentation(), TestUtils.PACKAGE);
+        assertEquals(TestUtils.PACKAGE, mTelecomManager.getDefaultDialerPackage());
+        assertNotSame(TEST_PHONE_ACCOUNT_HANDLE, mTelecomManager.getSimCallManager());
+        assertEquals("Sim call manager should be the carrier configured value if no default-dialer"
+                + " provided value",
+                carrierConfigSimCallManager,
+                simCallManager == null ? null : simCallManager.getComponentName());
+
+        // Once the default dialer has registered a sim call manager, getSimCallManager should
+        // return the new sim call manager.
+        mTelecomManager.registerPhoneAccount(TEST_SIM_CALL_MANAGER_ACCOUNT);
+        assertEquals("Sim call manager should be default dialer's sim call manager if provided"
+                + " by default dialer",
+                TEST_PHONE_ACCOUNT_HANDLE,
+                mTelecomManager.getSimCallManager());
+
+        // If the dialer is no longer the default dialer, it is no longer the sim call manager.
+        TestUtils.setDefaultDialer(getInstrumentation(), mSystemDialer);
+        assertNotSame(TEST_PHONE_ACCOUNT_HANDLE, mTelecomManager.getSimCallManager());
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/TelecomAvailabilityTest.java b/tests/tests/telecom/src/android/telecom/cts/TelecomAvailabilityTest.java
new file mode 100644
index 0000000..cc0afe4
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/TelecomAvailabilityTest.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import static android.telecom.cts.TestUtils.shouldTestTelecom;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
+import android.test.InstrumentationTestCase;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests for Telecom service. These tests only run on L+ devices because Telecom was
+ * added in L.
+ */
+public class TelecomAvailabilityTest extends InstrumentationTestCase {
+    private static final String TAG = TelecomAvailabilityTest.class.getSimpleName();
+    private static final String TELECOM_PACKAGE_NAME = "com.android.server.telecom";
+    private static final String TELEPHONY_PACKAGE_NAME = "com.android.phone";
+
+    private PackageManager mPackageManager;
+    private Context mContext;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mContext = getInstrumentation().getContext();
+        mPackageManager = getInstrumentation().getTargetContext().getPackageManager();
+    }
+
+    /**
+     * Test that the Telecom APK is pre-installed and a system app (FLAG_SYSTEM).
+     */
+    public void testTelecomIsPreinstalledAndSystem() {
+        if (!shouldTestTelecom(mContext)) {
+            return;
+        }
+
+        PackageInfo packageInfo = findOnlyTelecomPackageInfo(mPackageManager);
+        ApplicationInfo applicationInfo = packageInfo.applicationInfo;
+        assertTrue("Telecom APK must be FLAG_SYSTEM",
+                (applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
+        Log.d(TAG, String.format("Telecom APK is FLAG_SYSTEM %d", applicationInfo.flags));
+    }
+
+    /**
+     * Test that the Telecom APK is registered to handle CALL intents, and that the Telephony APK
+     * is not.
+     */
+    public void testTelecomHandlesCallIntents() {
+        if (!shouldTestTelecom(mContext)) {
+            return;
+        }
+
+        final Intent intent = new Intent(Intent.ACTION_CALL, Uri.fromParts("tel", "1234567", null));
+        final List<ResolveInfo> activities =
+                mPackageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
+
+        boolean telecomMatches = false;
+        boolean telephonyMatches = false;
+        for (ResolveInfo resolveInfo : activities) {
+            if (resolveInfo.activityInfo == null) {
+                continue;
+            }
+            if (!telecomMatches
+                    && TELECOM_PACKAGE_NAME.equals(resolveInfo.activityInfo.packageName)) {
+                telecomMatches = true;
+            } else if (!telephonyMatches
+                    && TELEPHONY_PACKAGE_NAME.equals(resolveInfo.activityInfo.packageName)) {
+                telephonyMatches = true;
+            }
+        }
+
+        assertTrue("Telecom APK must be registered to handle CALL intents", telecomMatches);
+        assertFalse("Telephony APK must NOT be registered to handle CALL intents",
+                telephonyMatches);
+    }
+
+    /**
+     * @return The {@link PackageInfo} of the only app named {@code PACKAGE_NAME}.
+     */
+    private static PackageInfo findOnlyTelecomPackageInfo(PackageManager packageManager) {
+        List<PackageInfo> telecomPackages = findMatchingPackages(packageManager);
+        assertEquals(String.format("There must be only one package named %s", TELECOM_PACKAGE_NAME),
+                1, telecomPackages.size());
+        return telecomPackages.get(0);
+    }
+
+    /**
+     * Finds all packages that have {@code PACKAGE_NAME} name.
+     *
+     * @param pm the android package manager
+     * @return a list of {@link PackageInfo} records
+     */
+    private static List<PackageInfo> findMatchingPackages(PackageManager pm) {
+        List<PackageInfo> packageInfoList = new ArrayList<PackageInfo>();
+        for (PackageInfo info : pm.getInstalledPackages(0)) {
+            if (TELECOM_PACKAGE_NAME.equals(info.packageName)) {
+                packageInfoList.add(info);
+            }
+        }
+        return packageInfoList;
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/TestUtils.java b/tests/tests/telecom/src/android/telecom/cts/TestUtils.java
new file mode 100644
index 0000000..962df59
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/TestUtils.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import android.app.Instrumentation;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Build;
+import android.os.ParcelFileDescriptor;
+import android.telecom.PhoneAccountHandle;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+
+public class TestUtils {
+    static final String TAG = "TelecomCTSTests";
+    static final boolean HAS_TELECOM = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
+    static final long WAIT_FOR_STATE_CHANGE_TIMEOUT_MS = 10000;
+
+    // Non-final to allow modification by tests not in this package (e.g. permission-related
+    // tests in the Telecom2 test package.
+    public static String PACKAGE = "com.android.cts.telecom";
+    public static final String COMPONENT = "android.telecom.cts.CtsConnectionService";
+    public static final String REMOTE_COMPONENT = "android.telecom.cts.CtsRemoteConnectionService";
+    public static final String ACCOUNT_ID = "xtstest_CALL_PROVIDER_ID";
+    public static final String REMOTE_ACCOUNT_ID = "xtstest_REMOTE_CALL_PROVIDER_ID";
+
+    public static final String ACCOUNT_LABEL = "CTSConnectionService";
+    public static final String REMOTE_ACCOUNT_LABEL = "CTSRemoteConnectionService";
+
+    private static final String COMMAND_SET_DEFAULT_DIALER = "telecom set-default-dialer ";
+
+    private static final String COMMAND_GET_DEFAULT_DIALER = "telecom get-default-dialer";
+
+    private static final String COMMAND_GET_SYSTEM_DIALER = "telecom get-system-dialer";
+
+    private static final String COMMAND_ENABLE = "telecom set-phone-account-enabled ";
+
+    private static final String COMMAND_REGISTER_SIM = "telecom register-sim-phone-account ";
+
+    public static final String MERGE_CALLER_NAME = "calls-merged";
+    public static final String SWAP_CALLER_NAME = "calls-swapped";
+
+    public static boolean shouldTestTelecom(Context context) {
+        if (!HAS_TELECOM) {
+            return false;
+        }
+        final PackageManager pm = context.getPackageManager();
+        return pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
+    }
+
+    public static String setDefaultDialer(Instrumentation instrumentation, String packageName)
+            throws Exception {
+        return executeShellCommand(instrumentation, COMMAND_SET_DEFAULT_DIALER + packageName);
+    }
+
+    public static String getDefaultDialer(Instrumentation instrumentation) throws Exception {
+        return executeShellCommand(instrumentation, COMMAND_GET_DEFAULT_DIALER);
+    }
+
+    public static String getSystemDialer(Instrumentation instrumentation) throws Exception {
+        return executeShellCommand(instrumentation, COMMAND_GET_SYSTEM_DIALER);
+    }
+
+    public static void enablePhoneAccount(Instrumentation instrumentation,
+            PhoneAccountHandle handle) throws Exception {
+        final ComponentName component = handle.getComponentName();
+        executeShellCommand(instrumentation, COMMAND_ENABLE
+                + component.getPackageName() + "/" + component.getClassName() + " "
+                + handle.getId());
+    }
+
+    public static void registerSimPhoneAccount(Instrumentation instrumentation,
+            PhoneAccountHandle handle, String label, String address) throws Exception {
+        final ComponentName component = handle.getComponentName();
+        executeShellCommand(instrumentation, COMMAND_REGISTER_SIM
+                + component.getPackageName() + "/" + component.getClassName() + " "
+                + handle.getId() + " " + label + " " + address);
+    }
+
+    /**
+     * Executes the given shell command and returns the output in a string. Note that even
+     * if we don't care about the output, we have to read the stream completely to make the
+     * command execute.
+     */
+    public static String executeShellCommand(Instrumentation instrumentation,
+            String command) throws Exception {
+        final ParcelFileDescriptor pfd =
+                instrumentation.getUiAutomation().executeShellCommand(command);
+        BufferedReader br = null;
+        try (InputStream in = new FileInputStream(pfd.getFileDescriptor())) {
+            br = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
+            String str = null;
+            StringBuilder out = new StringBuilder();
+            while ((str = br.readLine()) != null) {
+                out.append(str);
+            }
+            return out.toString();
+        } finally {
+            if (br != null) {
+                closeQuietly(br);
+            }
+            closeQuietly(pfd);
+        }
+    }
+
+    private static void closeQuietly(AutoCloseable closeable) {
+        if (closeable != null) {
+            try {
+                closeable.close();
+            } catch (RuntimeException rethrown) {
+                throw rethrown;
+            } catch (Exception ignored) {
+            }
+        }
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/VideoCallTest.java b/tests/tests/telecom/src/android/telecom/cts/VideoCallTest.java
new file mode 100644
index 0000000..fbfa998
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/VideoCallTest.java
@@ -0,0 +1,842 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import android.graphics.SurfaceTexture;
+import android.telecom.Call;
+import android.telecom.Connection;
+import android.telecom.InCallService;
+import android.telecom.VideoProfile;
+import android.util.Log;
+import android.view.Surface;
+import android.view.TextureView;
+
+import static android.telecom.cts.TestUtils.shouldTestTelecom;
+
+/**
+ * Suites of tests that use {@link MockVideoProvider} and {@link MockVideoCallCallback} to verify
+ * the functionality of the video APIs.
+ *
+ * Note: You'll notice the use of {@code work}, and
+ * {@code doWorkAndWaitUntilConditionIsTrueOrTimeout} here.  The problem is the
+ * {@link MockVideoProvider} is running using a Handler.  To get it to emit mock data that is
+ * in sync with the setup operations performed on the handler, we'd need access to its handler.
+ * The handler of the {@link Connection.VideoProvider} is, however, not public.  As a workaround
+ * we will call local methods on the MockVideoProvider.  This means there is a chance the
+ * VideoProvider will emit the data we're interested in before the callbacks (on the handler)
+ * are even set up.  Consequently, the callbacks we're depending on in our test may not get
+ * called.  To compensate we will call the test methods on the provider repeatedly until we
+ * hear back via our callback.  Suboptimal, but it works.
+ */
+public class VideoCallTest extends BaseTelecomTestWithMockServices {
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        if (mShouldTestTelecom) {
+            setupConnectionService(null, FLAG_REGISTER | FLAG_ENABLE);
+        }
+    }
+
+    /**
+     * Tests ability to start a 2-way video call and retrieve its video state.
+     */
+    public void testMakeTwoWayVideoCall() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall(VideoProfile.STATE_BIDIRECTIONAL);
+        final MockConnection connection = verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        final Call call = inCallService.getLastCall();
+
+        assertCallState(call, Call.STATE_DIALING);
+        connection.setActive();
+        assertCallState(call, Call.STATE_ACTIVE);
+
+        assertVideoState(call, VideoProfile.STATE_BIDIRECTIONAL);
+        assertVideoCallbackRegistered(inCallService, call, true);
+    }
+
+    /**
+     * Tests ability to start a 1-way video call and retrieve its video state.
+     */
+    public void testMakeOneWayVideoCall() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall(VideoProfile.STATE_TX_ENABLED);
+        verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        final Call call = inCallService.getLastCall();
+
+        assertVideoState(call, VideoProfile.STATE_TX_ENABLED);
+        assertVideoCallbackRegistered(inCallService, call, true);
+    }
+
+    /**
+     * Tests ability to upgrade an audio-only call to a video call.
+     */
+    public void testUpgradeToVideo() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall(VideoProfile.STATE_AUDIO_ONLY);
+        verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        final Call call = inCallService.getLastCall();
+        assertVideoState(call, VideoProfile.STATE_AUDIO_ONLY);
+        assertVideoCallbackRegistered(inCallService, call, true);
+
+        // Send request to upgrade to video.
+        InCallService.VideoCall videoCall = call.getVideoCall();
+        videoCall.sendSessionModifyRequest(new VideoProfile(VideoProfile.STATE_BIDIRECTIONAL));
+        assertVideoState(call, VideoProfile.STATE_BIDIRECTIONAL);
+        assertResponseVideoProfileReceived(inCallService.getVideoCallCallback(call),
+                VideoProfile.STATE_BIDIRECTIONAL);
+    }
+
+    /**
+     * Tests ability to receive a session modification request.
+     */
+    public void testReceiveSessionModifyRequest() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall(VideoProfile.STATE_AUDIO_ONLY);
+        final MockConnection connection = verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        final Call call = inCallService.getLastCall();
+
+        assertVideoState(call, VideoProfile.STATE_AUDIO_ONLY);
+        assertVideoCallbackRegistered(inCallService, call, true);
+
+        // Have the video profile mock reception of a request.
+        assertRequestVideoProfileReceived(inCallService.getVideoCallCallback(call),
+                VideoProfile.STATE_BIDIRECTIONAL,
+                new Work() {
+                    @Override
+                    public void doWork() {
+                        connection.sendMockSessionModifyRequest(
+                                new VideoProfile(VideoProfile.STATE_BIDIRECTIONAL));
+                    }
+                });
+    }
+
+    /**
+     * Tests ability to send a session modification response.
+     */
+    public void testSendSessionModifyResponse() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall(VideoProfile.STATE_AUDIO_ONLY);
+        final MockConnection connection = verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        final Call call = inCallService.getLastCall();
+        final MockVideoProvider mockVideoProvider = connection.getMockVideoProvider();
+        assertVideoState(call, VideoProfile.STATE_AUDIO_ONLY);
+        assertVideoCallbackRegistered(inCallService, call, true);
+
+        InCallService.VideoCall videoCall = call.getVideoCall();
+        videoCall.sendSessionModifyResponse(new VideoProfile(VideoProfile.STATE_BIDIRECTIONAL));
+        assertSessionModifyResponse(mockVideoProvider, VideoProfile.STATE_BIDIRECTIONAL);
+    }
+
+    /**
+     * Tests ability to start a video call, delaying the creation of the provider until after
+     * the call has been initiated (rather than immediately when the call is created).  This more
+     * closely mimics the lifespan of a {@code VideoProvider} instance as it is reasonable to
+     * expect there will be some overhead associated with configuring the camera at the start of
+     * the call.
+     */
+    public void testVideoCallDelayProvider() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        // Don't create video provider when call is created initially; we will do this later.
+        try {
+            connectionService.setCreateVideoProvider(false);
+            placeAndVerifyCall(VideoProfile.STATE_BIDIRECTIONAL);
+            final MockConnection connection = verifyConnectionForOutgoingCall();
+
+            final MockInCallService inCallService = mInCallCallbacks.getService();
+            final Call call = inCallService.getLastCall();
+
+            assertVideoState(call, VideoProfile.STATE_BIDIRECTIONAL);
+            // After initial connection creation there should not be a video provider or callbacks
+            // registered.
+            assertVideoCallbackRegistered(inCallService, call, false);
+
+            // Trigger delayed creation of video provider and registration of callbacks and assert that
+            // it happened.
+            connection.createMockVideoProvider();
+            assertVideoCallbackRegistered(inCallService, call, true);
+
+            // Ensure video providers are created in the future.
+        } finally {
+            connectionService.setCreateVideoProvider(true);
+        }
+    }
+
+
+    /**
+     * Tests ability to change the current camera.  Ensures that the camera capabilities are sent
+     * back in response.
+     */
+    public void testChangeCamera() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall(VideoProfile.STATE_BIDIRECTIONAL);
+        verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        final Call call = inCallService.getLastCall();
+        assertVideoCallbackRegistered(inCallService, call, true);
+        final InCallService.VideoCall videoCall = call.getVideoCall();
+
+        videoCall.setCamera(MockVideoProvider.CAMERA_FRONT);
+        assertCameraCapabilitiesReceived(inCallService.getVideoCallCallback(call),
+                MockVideoProvider.CAMERA_FRONT_DIMENSIONS);
+
+        videoCall.setCamera(MockVideoProvider.CAMERA_BACK);
+        assertCameraCapabilitiesReceived(inCallService.getVideoCallCallback(call),
+                MockVideoProvider.CAMERA_BACK_DIMENSIONS);
+    }
+
+    /**
+     * Tests ability to request the camera capabilities from the video provider.
+     */
+    public void testRequestCameraCapabilities() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall(VideoProfile.STATE_BIDIRECTIONAL);
+        verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        final Call call = inCallService.getLastCall();
+        assertVideoCallbackRegistered(inCallService, call, true);
+        final InCallService.VideoCall videoCall = call.getVideoCall();
+
+        // First, set the camera.
+        videoCall.setCamera(MockVideoProvider.CAMERA_FRONT);
+        // Retrieve the camera capabilities that are automatically send when the camera is set --
+        // ensures the cached value is cleared first.
+        inCallService.getVideoCallCallback(call).getCameraCapabilities();
+
+        // Now, request capabilities.
+        videoCall.requestCameraCapabilities();
+        assertCameraCapabilitiesReceived(inCallService.getVideoCallCallback(call),
+                MockVideoProvider.CAMERA_FRONT_DIMENSIONS);
+    }
+
+    /**
+     * Tests ability to request data usage from the video provider.
+     */
+    public void testRequestDataUsage() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall(VideoProfile.STATE_BIDIRECTIONAL);
+        verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        final Call call = inCallService.getLastCall();
+        assertVideoCallbackRegistered(inCallService, call, true);
+        final InCallService.VideoCall videoCall = call.getVideoCall();
+
+        videoCall.requestCallDataUsage();
+        assertCallDataUsageReceived(inCallService.getVideoCallCallback(call),
+                MockVideoProvider.DATA_USAGE);
+    }
+
+    /**
+     * Tests ability to receive changes to the video quality from the video provider.
+     */
+    public void testReceiveVideoQuality() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall(VideoProfile.STATE_BIDIRECTIONAL);
+        final MockConnection connection = verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        final Call call = inCallService.getLastCall();
+        assertVideoCallbackRegistered(inCallService, call, true);
+
+        assertVideoQualityReceived(inCallService.getVideoCallCallback(call),
+                VideoProfile.QUALITY_HIGH,
+                new Work() {
+                    @Override
+                    public void doWork() {
+                        connection
+                                .sendMockVideoQuality(VideoProfile.QUALITY_HIGH);
+                    }
+                });
+
+        assertVideoQualityReceived(inCallService.getVideoCallCallback(call),
+                VideoProfile.QUALITY_MEDIUM,
+                new Work() {
+                    @Override
+                    public void doWork() {
+                        connection
+                                .sendMockVideoQuality(VideoProfile.QUALITY_MEDIUM);
+                    }
+                });
+    }
+
+    /**
+     * Tests ability to receive call session events from the video provider.
+     */
+    public void testReceiveCallSessionEvent() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall(VideoProfile.STATE_BIDIRECTIONAL);
+        final MockConnection connection = verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        final Call call = inCallService.getLastCall();
+        assertVideoCallbackRegistered(inCallService, call, true);
+
+        assertCallSessionEventReceived(inCallService.getVideoCallCallback(call),
+                Connection.VideoProvider.SESSION_EVENT_CAMERA_READY,
+                new Work() {
+                    @Override
+                    public void doWork() {
+                        connection.sendMockCallSessionEvent(
+                                Connection.VideoProvider.SESSION_EVENT_CAMERA_READY);
+                    }
+                });
+    }
+
+    /**
+     * Tests ability to receive changes to the peer dimensions from the video provider.
+     */
+    public void testReceivePeerDimensionChange() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall(VideoProfile.STATE_BIDIRECTIONAL);
+        final MockConnection connection = verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        final Call call = inCallService.getLastCall();
+        assertVideoCallbackRegistered(inCallService, call, true);
+
+        assertPeerWidthChanged(inCallService.getVideoCallCallback(call),
+                MockVideoProvider.CAMERA_BACK_DIMENSIONS,
+                new Work() {
+                    @Override
+                    public void doWork() {
+                        connection.sendMockPeerWidth(MockVideoProvider.CAMERA_BACK_DIMENSIONS);
+                    }
+                });
+    }
+
+    /**
+     * Tests ability to set the device orientation via the provider.
+     */
+    public void testSetDeviceOrientation() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall(VideoProfile.STATE_BIDIRECTIONAL);
+        final MockConnection connection = verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        final Call call = inCallService.getLastCall();
+        assertVideoCallbackRegistered(inCallService, call, true);
+        final MockVideoProvider mockVideoProvider = connection.getMockVideoProvider();
+        final InCallService.VideoCall videoCall = call.getVideoCall();
+
+        // Set device orientation and ensure provider knows about it.
+        videoCall.setDeviceOrientation(90);
+        assertDeviceOrientationChanged(mockVideoProvider, 90);
+    }
+
+    /**
+     * Tests ability to set the preview surface via the provider.
+     */
+    public void testSetPreviewSurface() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall(VideoProfile.STATE_BIDIRECTIONAL);
+        final MockConnection connection = verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        final Call call = inCallService.getLastCall();
+        assertVideoCallbackRegistered(inCallService, call, true);
+        final MockVideoProvider mockVideoProvider = connection.getMockVideoProvider();
+        final InCallService.VideoCall videoCall = call.getVideoCall();
+
+        Surface surface = new Surface(new SurfaceTexture(1));
+        // Set a surface
+        videoCall.setPreviewSurface(surface);
+        assertPreviewSurfaceChanged(mockVideoProvider, true);
+
+        // Clear the surface
+        videoCall.setPreviewSurface(null);
+        assertPreviewSurfaceChanged(mockVideoProvider, false);
+    }
+
+    /**
+     * Tests ability to set the display surface via the provider.
+     */
+    public void testSetDisplaySurface() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall(VideoProfile.STATE_BIDIRECTIONAL);
+        final MockConnection connection = verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        final Call call = inCallService.getLastCall();
+        assertVideoCallbackRegistered(inCallService, call, true);
+        final MockVideoProvider mockVideoProvider = connection.getMockVideoProvider();
+        final InCallService.VideoCall videoCall = call.getVideoCall();
+
+        // Set a surface
+        Surface surface = new Surface(new SurfaceTexture(1));
+        videoCall.setDisplaySurface(surface);
+        assertDisplaySurfaceChanged(mockVideoProvider, true);
+
+        // Clear the surface
+        videoCall.setDisplaySurface(null);
+        assertDisplaySurfaceChanged(mockVideoProvider, false);
+    }
+
+    /**
+     * Tests ability to set the camera zoom via the provider.
+     */
+    public void testSetZoom() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall(VideoProfile.STATE_BIDIRECTIONAL);
+        final MockConnection connection = verifyConnectionForOutgoingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+        final Call call = inCallService.getLastCall();
+        assertVideoCallbackRegistered(inCallService, call, true);
+        final MockVideoProvider mockVideoProvider = connection.getMockVideoProvider();
+        final InCallService.VideoCall videoCall = call.getVideoCall();
+
+        videoCall.setZoom(0.0f);
+        assertZoomChanged(mockVideoProvider, 0.0f);
+
+        videoCall.setZoom(10.0f);
+        assertZoomChanged(mockVideoProvider, 10.0f);
+
+        call.disconnect();
+    }
+
+    /**
+     * Asserts that a call video state is as expected.
+     *
+     * @param call The call.
+     * @param videoState The expected video state.
+     */
+    private void assertVideoState(final Call call, final int videoState) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return videoState;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return call.getDetails().getVideoState();
+                    }
+                },
+                TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Call should be in videoState " + videoState
+        );
+    }
+
+    /**
+     * Asserts whether the InCallService has registered a video call back (and hence a video call)
+     * for a call.
+     *
+     * @param inCallService The incall service.
+     * @param call The call.
+     * @param isRegistered The expected registration state.
+     */
+    private void assertVideoCallbackRegistered(final MockInCallService inCallService,
+            final Call call, final Boolean isRegistered) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return isRegistered;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return inCallService.isVideoCallbackRegistered(call);
+                    }
+                },
+                TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Video callback registration state should be " + isRegistered
+        );
+    }
+
+    /**
+     * Asserts whether the camera capabilities have changed to an expected value.  Compares the
+     * camera height only (the {@link MockVideoProvider} sets height and width to be the same.
+     *
+     * @param videoCallCallback The video call callback.
+     * @param expectedCameraWidthHeight The expected width and height.
+     */
+    private void assertCameraCapabilitiesReceived(final MockVideoCallCallback videoCallCallback,
+            final int expectedCameraWidthHeight) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return expectedCameraWidthHeight;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        VideoProfile.CameraCapabilities cameraCapabilities =
+                                videoCallCallback.getCameraCapabilities();
+                        return cameraCapabilities == null ? 0 : cameraCapabilities.getHeight();
+                    }
+                },
+                TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Camera width and height should be " + expectedCameraWidthHeight
+        );
+    }
+
+    /**
+     * Asserts whether the call data usage has changed to the expected value.
+     *
+     * @param videoCallCallback The video call callback.
+     * @param expectedDataUsage The expected data usage.
+     */
+    private void assertCallDataUsageReceived(final MockVideoCallCallback videoCallCallback,
+            final long expectedDataUsage) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return expectedDataUsage;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return videoCallCallback.getDataUsage();
+                    }
+                },
+                TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Data usage should be " + expectedDataUsage
+        );
+    }
+
+    /**
+     * Asserts whether the video quality has changed to the expected value.
+     *
+     * @param videoCallCallback The video call callback.
+     * @param expectedVideoQuality The expected video quality.
+     * @param work The work to perform to have the provider emit the video quality.
+     */
+    private void assertVideoQualityReceived(final MockVideoCallCallback videoCallCallback,
+            final int expectedVideoQuality, final Work work) {
+        doWorkAndWaitUntilConditionIsTrueOrTimeout(
+                work,
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return expectedVideoQuality;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return videoCallCallback.getVideoQuality();
+                    }
+                },
+                TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Video quality should be " + expectedVideoQuality
+        );
+    }
+
+    /**
+     * Asserts whether the call session event has changed to the expected value.
+     *
+     * @param videoCallCallback The video call callback.
+     * @param expectedEvent The expected event.
+     * @param work The work to be performed to send the call session event from the provider.
+     */
+    private void assertCallSessionEventReceived(final MockVideoCallCallback videoCallCallback,
+            final int expectedEvent, final Work work) {
+        doWorkAndWaitUntilConditionIsTrueOrTimeout(
+                work,
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return expectedEvent;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return videoCallCallback.getCallSessionEvent();
+                    }
+                },
+                TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Call session event should be " + expectedEvent
+        );
+    }
+
+    /**
+     * Asserts whether the peer width has changed to the expected value.
+     *
+     * @param videoCallCallback The video call callback.
+     * @param expectedWidth The expected width.
+     * @param work The work to be performed to send the peer width from the provider.
+     */
+    private void assertPeerWidthChanged(final MockVideoCallCallback videoCallCallback,
+            final int expectedWidth, final Work work) {
+        doWorkAndWaitUntilConditionIsTrueOrTimeout(
+                work,
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return expectedWidth;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return videoCallCallback.getPeerWidth();
+                    }
+                },
+                TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Peer width should be " + expectedWidth
+        );
+    }
+
+    /**
+     * Asserts whether the device orientation has changed to the expected value.
+     *
+     * @param mockVideoProvider The mock video provider.
+     * @param expected The expected device orientation.
+     */
+    private void assertDeviceOrientationChanged(final MockVideoProvider mockVideoProvider,
+            final int expected) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return expected;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return mockVideoProvider.getDeviceOrientation();
+                    }
+                },
+                TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Orientation should be " + expected
+        );
+    }
+
+    /**
+     * Asserts whether the preview surface has been set or not.
+     *
+     * @param mockVideoProvider The mock video provider.
+     * @param expected {@code true} if it is expected the preview surface is not null, {@code false}
+     *                             if it is expected the preview surface is null.
+     */
+    private void assertPreviewSurfaceChanged(final MockVideoProvider mockVideoProvider,
+            final boolean expected) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return expected;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return mockVideoProvider.getPreviewSurface() != null;
+                    }
+                },
+                TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Preview should be set? " + expected
+        );
+    }
+
+    /**
+     * Asserts whether the display surface has been set or not.
+     *
+     * @param mockVideoProvider The mock video provider.
+     * @param expected {@code true} if it is expected the display surface is not null, {@code false}
+     *                             if it is expected the display surface is null.
+     */
+    private void assertDisplaySurfaceChanged(final MockVideoProvider mockVideoProvider,
+            final boolean expected) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return expected;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return mockVideoProvider.getDisplaySurface() != null;
+                    }
+                },
+                TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Display should be set? " + expected
+        );
+    }
+
+    /**
+     * Asserts whether the zoom has changed to the expected value.  Note: To make comparisons easier
+     * the floats are cast to ints, so ensure only whole values are used.
+     *
+     * @param mockVideoProvider The mock video provider.
+     * @param expected The expected zoom.
+     */
+    private void assertZoomChanged(final MockVideoProvider mockVideoProvider,
+            final float expected) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        // Cast to int so we're not doing float equality
+                        return (int)expected;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        // Cast to int so we're not doing float equality
+                        return (int)mockVideoProvider.getZoom();
+                    }
+                },
+                TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Zoom should be " + expected
+        );
+    }
+
+    /**
+     * Asserts whether a response video profile has been received
+     *
+     * @param videoCallCallback The video call callback.
+     * @param expected The expected video state.
+     */
+    private void assertResponseVideoProfileReceived(final MockVideoCallCallback videoCallCallback,
+            final int expected) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return expected;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        VideoProfile videoProfile = videoCallCallback.getResponseProfile();
+                        return videoProfile == null ? -1 : videoProfile.getVideoState();
+                    }
+                },
+                TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Video state should be " + expected
+        );
+    }
+
+    /**
+     * Asserts whether a session modification request has been received.
+     *
+     * @param videoCallCallback The video call callback.
+     * @param expected The expected video state.
+     * @param work The work to be performed to cause the session modification request to be emit
+     *             from the provider.
+     */
+    private void assertRequestVideoProfileReceived(final MockVideoCallCallback videoCallCallback,
+            final int expected, final Work work) {
+        doWorkAndWaitUntilConditionIsTrueOrTimeout(
+                work,
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return expected;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        VideoProfile videoProfile = videoCallCallback.getRequestProfile();
+                        return videoProfile == null ? -1 : videoProfile.getVideoState();
+                    }
+                },
+                TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Video state should be " + expected
+        );
+    }
+
+    /**
+     * Asserts whether the provider got a session modify response with the expected value.
+     *
+     * @param mockVideoProvider The mock video provider.
+     * @param expected The expected video state of the session modify response.
+     */
+    private void assertSessionModifyResponse(final MockVideoProvider mockVideoProvider,
+            final int expected) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return expected;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        VideoProfile responseProfile = mockVideoProvider.getSessionModifyResponse();
+                        return responseProfile == null ? -1 : responseProfile.getVideoState();
+                    }
+                },
+                TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Session modify response video state should be " + expected
+        );
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/VideoProfileTest.java b/tests/tests/telecom/src/android/telecom/cts/VideoProfileTest.java
new file mode 100644
index 0000000..6c16abb
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/VideoProfileTest.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import android.telecom.VideoProfile;
+import android.test.AndroidTestCase;
+
+/**
+ * Tests helper methods in the {@link VideoProfile} class.
+ */
+public class VideoProfileTest extends AndroidTestCase {
+    public void testIsAudioOnly() {
+        assertTrue(VideoProfile.isAudioOnly(VideoProfile.STATE_AUDIO_ONLY));
+        assertTrue(VideoProfile.isAudioOnly(VideoProfile.STATE_PAUSED));
+
+        assertFalse(VideoProfile.isAudioOnly(VideoProfile.STATE_BIDIRECTIONAL));
+        assertFalse(VideoProfile.isAudioOnly(VideoProfile.STATE_TX_ENABLED));
+        assertFalse(VideoProfile.isAudioOnly(VideoProfile.STATE_RX_ENABLED));
+        assertFalse(VideoProfile
+                .isAudioOnly(VideoProfile.STATE_BIDIRECTIONAL | VideoProfile.STATE_PAUSED));
+        assertFalse(VideoProfile
+                .isAudioOnly(VideoProfile.STATE_TX_ENABLED | VideoProfile.STATE_PAUSED));
+        assertFalse(VideoProfile
+                .isAudioOnly(VideoProfile.STATE_RX_ENABLED | VideoProfile.STATE_PAUSED));
+    }
+
+    public void testIsVideo() {
+        assertTrue(VideoProfile.isVideo(VideoProfile.STATE_BIDIRECTIONAL));
+        assertTrue(VideoProfile.isVideo(VideoProfile.STATE_RX_ENABLED));
+        assertTrue(VideoProfile.isVideo(VideoProfile.STATE_TX_ENABLED));
+        assertTrue(VideoProfile.isVideo(VideoProfile.STATE_BIDIRECTIONAL |
+                VideoProfile.STATE_PAUSED));
+        assertTrue(VideoProfile.isVideo(VideoProfile.STATE_RX_ENABLED | VideoProfile.STATE_PAUSED));
+        assertTrue(VideoProfile.isVideo(VideoProfile.STATE_TX_ENABLED | VideoProfile.STATE_PAUSED));
+
+        assertFalse(VideoProfile.isVideo(VideoProfile.STATE_AUDIO_ONLY));
+        assertFalse(VideoProfile.isVideo(VideoProfile.STATE_PAUSED));
+    }
+
+    public void testIsBidirectional() {
+        assertTrue(VideoProfile.isBidirectional(VideoProfile.STATE_BIDIRECTIONAL));
+        assertTrue(VideoProfile.isBidirectional(VideoProfile.STATE_BIDIRECTIONAL |
+                VideoProfile.STATE_PAUSED));
+
+        assertFalse(VideoProfile.isBidirectional(VideoProfile.STATE_TX_ENABLED));
+        assertFalse(VideoProfile.isBidirectional(VideoProfile.STATE_TX_ENABLED |
+                VideoProfile.STATE_PAUSED));
+        assertFalse(VideoProfile.isBidirectional(VideoProfile.STATE_RX_ENABLED));
+        assertFalse(VideoProfile.isBidirectional(VideoProfile.STATE_RX_ENABLED |
+                VideoProfile.STATE_PAUSED));
+    }
+
+    public void testIsPaused() {
+        assertTrue(VideoProfile.isPaused(VideoProfile.STATE_PAUSED));
+        assertTrue(VideoProfile.isPaused(VideoProfile.STATE_BIDIRECTIONAL |
+                VideoProfile.STATE_PAUSED));
+        assertTrue(VideoProfile.isPaused(VideoProfile.STATE_TX_ENABLED |
+                VideoProfile.STATE_PAUSED));
+        assertTrue(VideoProfile.isPaused(VideoProfile.STATE_RX_ENABLED |
+                VideoProfile.STATE_PAUSED));
+
+        assertFalse(VideoProfile.isPaused(VideoProfile.STATE_AUDIO_ONLY));
+        assertFalse(VideoProfile.isPaused(VideoProfile.STATE_TX_ENABLED));
+        assertFalse(VideoProfile.isPaused(VideoProfile.STATE_RX_ENABLED));
+        assertFalse(VideoProfile.isPaused(VideoProfile.STATE_BIDIRECTIONAL));
+    }
+
+    public void testIsReceptionEnabled() {
+        assertTrue(VideoProfile.isReceptionEnabled(VideoProfile.STATE_RX_ENABLED));
+        assertTrue(VideoProfile.isReceptionEnabled(VideoProfile.STATE_BIDIRECTIONAL));
+        assertTrue(VideoProfile.isReceptionEnabled(VideoProfile.STATE_RX_ENABLED |
+                VideoProfile.STATE_PAUSED));
+        assertTrue(VideoProfile.isReceptionEnabled(VideoProfile.STATE_BIDIRECTIONAL |
+                VideoProfile.STATE_PAUSED));
+
+        assertFalse(VideoProfile.isReceptionEnabled(VideoProfile.STATE_AUDIO_ONLY));
+        assertFalse(VideoProfile.isReceptionEnabled(VideoProfile.STATE_TX_ENABLED));
+        assertFalse(VideoProfile.isReceptionEnabled(VideoProfile.STATE_PAUSED));
+    }
+
+    public void testIsTransmissionEnabled() {
+        assertTrue(VideoProfile.isTransmissionEnabled(VideoProfile.STATE_TX_ENABLED));
+        assertTrue(VideoProfile.isTransmissionEnabled(VideoProfile.STATE_BIDIRECTIONAL));
+        assertTrue(VideoProfile.isTransmissionEnabled(VideoProfile.STATE_TX_ENABLED |
+                VideoProfile.STATE_PAUSED));
+        assertTrue(VideoProfile.isTransmissionEnabled(VideoProfile.STATE_BIDIRECTIONAL |
+                VideoProfile.STATE_PAUSED));
+
+        assertFalse(VideoProfile.isTransmissionEnabled(VideoProfile.STATE_AUDIO_ONLY));
+        assertFalse(VideoProfile.isTransmissionEnabled(VideoProfile.STATE_RX_ENABLED));
+        assertFalse(VideoProfile.isTransmissionEnabled(VideoProfile.STATE_PAUSED));
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/WiredHeadsetTest.java b/tests/tests/telecom/src/android/telecom/cts/WiredHeadsetTest.java
new file mode 100644
index 0000000..466a90b
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/WiredHeadsetTest.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import android.telecom.Call;
+import android.telecom.CallAudioState;
+import android.telecom.Connection;
+
+/**
+ * Verifies Telecom behavior with regards to interactions with a wired headset. These tests
+ * validate behavior that occurs as a result of short pressing or long pressing a wired headset's
+ * media button.
+ */
+public class WiredHeadsetTest extends BaseTelecomTestWithMockServices {
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        if (mShouldTestTelecom) {
+            setupConnectionService(null, FLAG_REGISTER | FLAG_ENABLE);
+        }
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mInCallCallbacks != null && mInCallCallbacks.getService() != null) {
+            mInCallCallbacks.getService().disconnectLastCall();
+            assertNumCalls(mInCallCallbacks.getService(), 0);
+        }
+        super.tearDown();
+    }
+
+    public void testIncomingCallShortPress_acceptsCall() throws Exception {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        addAndVerifyNewIncomingCall(getTestNumber(), null);
+        final MockConnection connection = verifyConnectionForIncomingCall();
+
+        final Call call = mInCallCallbacks.getService().getLastCall();
+        assertCallState(call, Call.STATE_RINGING);
+        assertConnectionState(connection, Connection.STATE_RINGING);
+
+        sendMediaButtonShortPress();
+        assertCallState(call,  Call.STATE_ACTIVE);
+        assertConnectionState(connection, Connection.STATE_ACTIVE);
+    }
+
+    public void testIncomingCallLongPress_rejectsCall() throws Exception {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        addAndVerifyNewIncomingCall(getTestNumber(), null);
+        final MockConnection connection = verifyConnectionForIncomingCall();
+
+        final Call call = mInCallCallbacks.getService().getLastCall();
+        assertCallState(call, Call.STATE_RINGING);
+        assertConnectionState(connection, Connection.STATE_RINGING);
+
+        sendMediaButtonLongPress();
+        assertCallState(call, Call.STATE_DISCONNECTED);
+        assertConnectionState(connection, Connection.STATE_DISCONNECTED);
+    }
+
+    public void testInCallShortPress_togglesMute() throws Exception {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall();
+        final MockConnection connection = verifyConnectionForOutgoingCall();
+        final MockInCallService incallService = mInCallCallbacks.getService();
+
+        // Verify that sending short presses in succession toggles the mute state of the
+        // connection.
+        // Before the audio state is changed for the first time, the connection might not
+        // know about its audio state yet.
+        assertMuteState(incallService, false);
+        sendMediaButtonShortPress();
+        assertMuteState(connection, true);
+        assertMuteState(incallService, true);
+        sendMediaButtonShortPress();
+        assertMuteState(connection, false);
+        assertMuteState(incallService, false);
+    }
+
+    public void testInCallLongPress_hangupCall() throws Exception {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall();
+        final MockConnection connection = verifyConnectionForOutgoingCall();
+
+        final Call call = mInCallCallbacks.getService().getLastCall();
+        assertCallState(call, Call.STATE_DIALING);
+
+        connection.setActive();
+        assertCallState(call, Call.STATE_ACTIVE);
+
+        sendMediaButtonLongPress();
+        assertCallState(call, Call.STATE_DISCONNECTED);
+        assertConnectionState(connection, Connection.STATE_DISCONNECTED);
+    }
+
+    public void testStartCallWithSpeakerphoneNotProvided_SpeakerphoneOffByDefault() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        placeAndVerifyCall();
+        verifyConnectionForOutgoingCall();
+        assertAudioRoute(mInCallCallbacks.getService(), CallAudioState.ROUTE_EARPIECE);
+    }
+
+    private void sendMediaButtonShortPress() throws Exception {
+        sendMediaButtonPress(false /* longPress */);
+    }
+
+    private void sendMediaButtonLongPress() throws Exception {
+        sendMediaButtonPress(true /* longPress */);
+    }
+
+    private void sendMediaButtonPress(boolean longPress) throws Exception {
+        final String command = "input keyevent " + (longPress ? "--longpress" : "--shortpress")
+                + " KEYCODE_HEADSETHOOK";
+        TestUtils.executeShellCommand(getInstrumentation(), command);
+    }
+}
diff --git a/tests/tests/telecom2/Android.mk b/tests/tests/telecom2/Android.mk
new file mode 100644
index 0000000..71edb7b
--- /dev/null
+++ b/tests/tests/telecom2/Android.mk
@@ -0,0 +1,46 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_PACKAGE_NAME := CtsTelecomTestCases2
+
+# Don't include this package in any target.
+LOCAL_MODULE_TAGS := optional
+
+# When built, explicitly put it in the data partition.
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+
+src_dirs := src \
+    ../telecom/src
+
+res_dirs := res \
+    ../telecom/res
+
+LOCAL_SRC_FILES := $(call all-java-files-under, $(src_dirs))
+
+LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dirs))
+
+LOCAL_AAPT_FLAGS := \
+    --auto-add-overlay \
+    --extra-packages com.android.cts.telecom \
+    --rename-manifest-package com.android.cts.telecom2 \
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/telecom2/AndroidManifest.xml b/tests/tests/telecom2/AndroidManifest.xml
new file mode 100644
index 0000000..e618768
--- /dev/null
+++ b/tests/tests/telecom2/AndroidManifest.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.telecom2">
+    <uses-sdk android:minSdkVersion="21" />
+
+    <!--
+        This app contains tests to verify Telecom's behavior when the app is missing certain
+        permissions.
+    -->
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+
+        <service android:name="android.telecom.cts.MockConnectionService"
+            android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE" >
+            <intent-filter>
+                <action android:name="android.telecom.ConnectionService" />
+            </intent-filter>
+        </service>
+
+        <service android:name="android.telecom.cts.MockInCallService"
+            android:permission="android.permission.BIND_INCALL_SERVICE" >
+            <intent-filter>
+                <action android:name="android.telecom.InCallService"/>
+            </intent-filter>
+        </service>
+
+        <activity android:name="android.telecom.cts.MockDialerActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.DIAL" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.BROWSABLE" />
+                <data android:mimeType="vnd.android.cursor.item/phone" />
+                <data android:mimeType="vnd.android.cursor.item/person" />
+            </intent-filter>
+            <intent-filter>
+                <action android:name="android.intent.action.DIAL" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.BROWSABLE" />
+                <data android:scheme="voicemail" />
+            </intent-filter>
+            <intent-filter>
+                <action android:name="android.intent.action.DIAL" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW" />
+                <action android:name="android.intent.action.DIAL" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.BROWSABLE" />
+                <data android:scheme="tel" />
+            </intent-filter>
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="com.android.cts.telecom2"
+                     android:label="CTS tests for android.telecom package">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+</manifest>
+
diff --git a/tests/tests/telecom2/res/.gitignore b/tests/tests/telecom2/res/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/tests/telecom2/res/.gitignore
diff --git a/tests/tests/telecom2/src/android/telecom/cts/DefaultDialerOperationsNoPermissionsTest.java b/tests/tests/telecom2/src/android/telecom/cts/DefaultDialerOperationsNoPermissionsTest.java
new file mode 100644
index 0000000..b3044a2
--- /dev/null
+++ b/tests/tests/telecom2/src/android/telecom/cts/DefaultDialerOperationsNoPermissionsTest.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2015 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.telecom.cts;
+
+import android.content.Context;
+import android.telecom.TelecomManager;
+import android.test.InstrumentationTestCase;
+import android.text.TextUtils;
+
+/**
+ * Verifies that certain privileged operations can only be performed by the default dialer.
+ */
+public class DefaultDialerOperationsNoPermissionsTest extends InstrumentationTestCase {
+    private Context mContext;
+    private TelecomManager mTelecomManager;
+    private String mPreviousDefaultDialer = null;
+    private String mSystemDialer = null;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mContext = getInstrumentation().getContext();
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+        TestUtils.PACKAGE = mContext.getPackageName();
+        mPreviousDefaultDialer = TestUtils.getDefaultDialer(getInstrumentation());
+        // Reset the current dialer to the system dialer, to ensure that we start each test
+        // without being the default dialer.
+        mSystemDialer = TestUtils.getSystemDialer(getInstrumentation());
+        if (!TextUtils.isEmpty(mSystemDialer)) {
+            TestUtils.setDefaultDialer(getInstrumentation(), mSystemDialer);
+        }
+        mTelecomManager = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (!TextUtils.isEmpty(mPreviousDefaultDialer)) {
+            // Restore the default dialer to whatever the default dialer was before the tests
+            // were started. This may or may not be the system dialer.
+            TestUtils.setDefaultDialer(getInstrumentation(), mPreviousDefaultDialer);
+        }
+        super.tearDown();
+    }
+
+    public void testShowInCallScreenPermissions() throws Exception {
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+        verifyForReadPhoneStateOrDefaultDialer(new Runnable() {
+            @Override
+            public void run() {
+                mTelecomManager.showInCallScreen(false);
+            }
+        }, "showInCallScreen");
+    }
+
+    public void testGetCallCapableAccountsPermissions() throws Exception {
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+        verifyForReadPhoneStateOrDefaultDialer(new Runnable() {
+            @Override
+            public void run() {
+                mTelecomManager.getCallCapablePhoneAccounts();
+            }
+        }, "getCallCapableAccounts");
+    }
+
+    public void testGetDefaultOutgoingPhoneAccount() throws Exception {
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+        verifyForReadPhoneStateOrDefaultDialer(new Runnable() {
+            @Override
+            public void run() {
+                mTelecomManager.getDefaultOutgoingPhoneAccount("tel");
+            }
+        }, "getDefaultOutgoingPhoneAccount");
+    }
+
+    public void testGetLine1Number() throws Exception {
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+        verifyForReadPhoneStateOrDefaultDialer(new Runnable() {
+            @Override
+            public void run() {
+                mTelecomManager.getLine1Number(null);
+            }
+        }, "getLine1Number");
+    }
+
+    public void testGetVoicemailNumber() throws Exception {
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+        verifyForReadPhoneStateOrDefaultDialer(new Runnable() {
+            @Override
+            public void run() {
+                mTelecomManager.getVoiceMailNumber(null);
+            }
+        }, "getVoiceMailNumber");
+    }
+
+    public void testIsVoicemailNumber() throws Exception {
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+        verifyForReadPhoneStateOrDefaultDialer(new Runnable() {
+            @Override
+            public void run() {
+                mTelecomManager.isVoiceMailNumber(null, null);
+            }
+        }, "isVoiceMailNumber");
+    }
+
+    public void testIsInCall() throws Exception {
+        if (!TestUtils.shouldTestTelecom(mContext)) {
+            return;
+        }
+        verifyForReadPhoneStateOrDefaultDialer(new Runnable() {
+            @Override
+            public void run() {
+                mTelecomManager.isInCall();
+            }
+        }, "isInCall");
+    }
+
+    private void verifyForReadPhoneStateOrDefaultDialer(Runnable runnable, String methodName)
+            throws Exception{
+        try {
+            runnable.run();
+            fail("TelecomManager." + methodName + " should throw SecurityException if no "
+                    + "READ_PHONE_STATE permission");
+        } catch (SecurityException e) {
+        }
+
+        TestUtils.setDefaultDialer(getInstrumentation(), TestUtils.PACKAGE);
+        runnable.run();
+    }
+}
diff --git a/tests/tests/telephony/AndroidManifest.xml b/tests/tests/telephony/AndroidManifest.xml
index 31abf12..a87a54b 100644
--- a/tests/tests/telephony/AndroidManifest.xml
+++ b/tests/tests/telephony/AndroidManifest.xml
@@ -31,6 +31,9 @@
     <uses-permission android:name="android.permission.BLUETOOTH" />
 
     <application>
+        <provider android:name="android.telephony.cts.MmsPduProvider"
+                  android:authorities="telephonyctstest"
+                  android:grantUriPermissions="true" />
         <uses-library android:name="android.test.runner" />
     </application>
 
diff --git a/tests/tests/telephony/src/android/telephony/cts/CarrierConfigManagerTest.java b/tests/tests/telephony/src/android/telephony/cts/CarrierConfigManagerTest.java
new file mode 100644
index 0000000..4ca35b8
--- /dev/null
+++ b/tests/tests/telephony/src/android/telephony/cts/CarrierConfigManagerTest.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2014 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.telephony.cts;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.test.AndroidTestCase;
+
+public class CarrierConfigManagerTest extends AndroidTestCase {
+    private CarrierConfigManager mConfigManager;
+    private TelephonyManager mTelephonyManager;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mTelephonyManager = (TelephonyManager)
+                getContext().getSystemService(Context.TELEPHONY_SERVICE);
+        mConfigManager = (CarrierConfigManager)
+                getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE);
+    }
+
+    /**
+     * Checks whether the telephony stack should be running on this device.
+     *
+     * Note: "Telephony" means only SMS/MMS and voice calls in some contexts, but we also care if
+     * the device supports cellular data.
+     */
+    private boolean hasTelephony() {
+        ConnectivityManager mgr =
+                (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
+        return mgr.isNetworkSupported(ConnectivityManager.TYPE_MOBILE);
+    }
+
+    private boolean isSimCardPresent() {
+        return mTelephonyManager.getPhoneType() != TelephonyManager.PHONE_TYPE_NONE &&
+                mTelephonyManager.getSimState() != TelephonyManager.SIM_STATE_ABSENT;
+    }
+
+    private void checkConfig(PersistableBundle config) {
+        if (config == null) {
+            assertFalse("Config should only be null when telephony is not running.", hasTelephony());
+            return;
+        }
+        assertNotNull("CarrierConfigManager should not return null config", config);
+        if (!isSimCardPresent()) {
+            // Static default in CarrierConfigManager will be returned when no sim card present.
+            assertEquals("Config doesn't match static default.",
+                    config.getBoolean(CarrierConfigManager.KEY_ADDITIONAL_CALL_SETTING_BOOL), true);
+        }
+    }
+
+    public void testGetConfig() {
+        PersistableBundle config = mConfigManager.getConfig();
+        checkConfig(config);
+    }
+
+    public void testGetConfigForSubId() {
+        PersistableBundle config =
+                mConfigManager.getConfigForSubId(SubscriptionManager.getDefaultSubId());
+        checkConfig(config);
+    }
+
+    /**
+     * Tests the CarrierConfigManager.notifyConfigChangedForSubId() API. This makes a call to
+     * notifyConfigChangedForSubId() API and expects a SecurityException since the test apk is not signed
+     * by certificate on the SIM.
+     */
+    public void testNotifyConfigChangedForSubId() {
+        try {
+            if (isSimCardPresent()) {
+                mConfigManager.notifyConfigChangedForSubId(SubscriptionManager.getDefaultSubId());
+                fail("Expected SecurityException. App doesn't have carrier privileges.");
+            }
+        } catch (SecurityException expected) {
+        }
+    }
+
+}
diff --git a/tests/tests/telephony/src/android/telephony/cts/CarrierServiceTest.java b/tests/tests/telephony/src/android/telephony/cts/CarrierServiceTest.java
new file mode 100644
index 0000000..492f8ff
--- /dev/null
+++ b/tests/tests/telephony/src/android/telephony/cts/CarrierServiceTest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2015 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.telephony.cts;
+
+import android.content.Intent;
+import android.os.PersistableBundle;
+import android.service.carrier.CarrierIdentifier;
+import android.service.carrier.CarrierService;
+import android.test.ServiceTestCase;
+
+public class CarrierServiceTest extends ServiceTestCase<CarrierServiceTest.TestCarrierService> {
+    public CarrierServiceTest() { super(TestCarrierService.class); }
+
+    public void testNotifyCarrierNetworkChange_true() {
+        notifyCarrierNetworkChange(true);
+    }
+
+    public void testNotifyCarrierNetworkChange_false() {
+        notifyCarrierNetworkChange(false);
+    }
+
+    private void notifyCarrierNetworkChange(boolean active) {
+        Intent intent = new Intent(getContext(), TestCarrierService.class);
+        startService(intent);
+
+        try {
+            getService().notifyCarrierNetworkChange(active);
+            fail("Expected SecurityException for notifyCarrierNetworkChange(" + active + ")");
+        } catch (SecurityException e) { /* Expected */ }
+    }
+
+    public static class TestCarrierService extends CarrierService {
+        @Override
+        public PersistableBundle onLoadConfig(CarrierIdentifier id) { return null; }
+    }
+}
diff --git a/tests/tests/telephony/src/android/telephony/cts/CellInfoTest.java b/tests/tests/telephony/src/android/telephony/cts/CellInfoTest.java
new file mode 100644
index 0000000..9a93a60
--- /dev/null
+++ b/tests/tests/telephony/src/android/telephony/cts/CellInfoTest.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2014 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.telephony.cts;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.telephony.CellInfo;
+import android.telephony.CellInfoGsm;
+import android.telephony.CellInfoLte;
+import android.telephony.CellInfoWcdma;
+import android.telephony.TelephonyManager;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+import java.util.List;
+
+/**
+ * Test TelephonyManager.getAllCellInfo()
+ * <p>
+ * TODO(chesnutt): test onCellInfoChanged() once the implementation
+ * of async callbacks is complete (see http://b/13788638)
+ */
+public class CellInfoTest extends AndroidTestCase{
+    private final Object mLock = new Object();
+    private TelephonyManager mTelephonyManager;
+    private static ConnectivityManager mCm;
+    private static final String TAG = "android.telephony.cts.CellInfoTest";
+    // Maximum and minimum possible RSSI values(in dbm).
+    private static final int MAX_RRSI = -10;
+    private static final int MIN_RSSI = -150;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mTelephonyManager =
+                (TelephonyManager)getContext().getSystemService(Context.TELEPHONY_SERVICE);
+        mCm = (ConnectivityManager)getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
+    }
+
+    public void testCellInfo() throws Throwable {
+        if (mCm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) == null) {
+            Log.d(TAG, "Skipping test that requires ConnectivityManager.TYPE_MOBILE");
+            return;
+        }
+
+        // getAllCellInfo should never return null, and there should
+        // be at least one entry.
+        List<CellInfo> allCellInfo = mTelephonyManager.getAllCellInfo();
+        assertNotNull("TelephonyManager.getAllCellInfo() returned NULL!", allCellInfo);
+        assertTrue("TelephonyManager.getAllCellInfo() returned zero-length list!",
+            allCellInfo.size() > 0);
+
+        int numRegisteredCells = 0;
+        for (CellInfo cellInfo : allCellInfo) {
+            if (cellInfo.isRegistered()) {
+                ++numRegisteredCells;
+            }
+            if (cellInfo instanceof CellInfoLte) {
+                verifyLteInfo((CellInfoLte) cellInfo);
+            } else if (cellInfo instanceof CellInfoWcdma) {
+                verifyWcdmaInfo((CellInfoWcdma) cellInfo);
+            } else if (cellInfo instanceof CellInfoGsm) {
+                verifyGsmInfo((CellInfoGsm) cellInfo);
+            }
+        }
+        // At most two cells could be registered.
+        assertTrue("None or too many registered cells : " + numRegisteredCells,
+                numRegisteredCells > 0 && numRegisteredCells <= 2);
+    }
+
+    // Verify lte cell information is within correct range.
+    private void verifyLteInfo(CellInfoLte lte) {
+        verifyRssiDbm(lte.getCellSignalStrength().getDbm());
+        // Verify LTE neighbor information.
+        if (!lte.isRegistered()) {
+            // Only physical cell id is available for LTE neighbor.
+            int pci = lte.getCellIdentity().getPci();
+            // Physical cell id should be within [0, 503].
+            assertTrue("getPci() out of range [0, 503]", pci >= 0 && pci <= 503);
+        }
+    }
+
+    // Verify wcdma cell information is within correct range.
+    private void verifyWcdmaInfo(CellInfoWcdma wcdma) {
+        verifyRssiDbm(wcdma.getCellSignalStrength().getDbm());
+        // Verify wcdma neighbor.
+        if (!wcdma.isRegistered()) {
+            // For wcdma neighbor, only primary scrambling code is available.
+            // Primary scrambling code should be within [0, 511].
+            int psc = wcdma.getCellIdentity().getPsc();
+            assertTrue("getPsc() out of range [0, 511]", psc >= 0 && psc <= 511);
+        }
+    }
+
+    // Verify gsm cell information is within correct range.
+    private void verifyGsmInfo(CellInfoGsm gsm) {
+        verifyRssiDbm(gsm.getCellSignalStrength().getDbm());
+        // Verify gsm neighbor.
+        if (!gsm.isRegistered()) {
+            // lac and cid are available in GSM neighbor information.
+            // Local area code and cellid should be with [0, 65535].
+            int lac = gsm.getCellIdentity().getLac();
+            assertTrue("getLac() out of range [0, 65535]", lac >= 0 && lac <= 65535);
+            int cid = gsm.getCellIdentity().getCid();
+            assertTrue("getCid() out range [0, 65535]", cid >= 0 && cid <= 65535);
+        }
+    }
+
+    // Rssi(in dbm) should be within [MIN_RSSI, MAX_RSSI].
+    private void verifyRssiDbm(int dbm) {
+        assertTrue("getCellSignalStrength().getDbm() out of range",
+                dbm >= MIN_RSSI && dbm <= MAX_RRSI);
+    }
+}
diff --git a/tests/tests/telephony/src/android/telephony/cts/CellLocationTest.java b/tests/tests/telephony/src/android/telephony/cts/CellLocationTest.java
index c1f5757..9205f0e 100644
--- a/tests/tests/telephony/src/android/telephony/cts/CellLocationTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/CellLocationTest.java
@@ -60,6 +60,14 @@
             return;
         }
 
+        // getCellLocation should never return null,
+        // but that is allowed if the cell network type
+        // is LTE (since there is no LteCellLocation class)
+        if (mTelephonyManager.getNetworkType() != TelephonyManager.NETWORK_TYPE_LTE) {
+            assertNotNull("TelephonyManager.getCellLocation() returned null!",
+                mTelephonyManager.getCellLocation());
+        }
+
         CellLocation cl = CellLocation.getEmpty();
         if (cl instanceof GsmCellLocation) {
             GsmCellLocation gcl = (GsmCellLocation) cl;
diff --git a/tests/tests/telephony/src/android/telephony/cts/MmsPduProvider.java b/tests/tests/telephony/src/android/telephony/cts/MmsPduProvider.java
new file mode 100644
index 0000000..08164ee
--- /dev/null
+++ b/tests/tests/telephony/src/android/telephony/cts/MmsPduProvider.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2015 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.telephony.cts;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.ParcelFileDescriptor;
+import android.text.TextUtils;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+
+/**
+ * A simple provider to send MMS PDU to platform MMS service
+ */
+public class MmsPduProvider extends ContentProvider {
+    @Override
+    public boolean onCreate() {
+        return true;
+    }
+
+    @Override
+    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+            String sortOrder) {
+        // Not supported
+        return null;
+    }
+
+    @Override
+    public String getType(Uri uri) {
+        // Not supported
+        return null;
+    }
+
+    @Override
+    public Uri insert(Uri uri, ContentValues values) {
+        // Not supported
+        return null;
+    }
+
+    @Override
+    public int delete(Uri uri, String selection, String[] selectionArgs) {
+        // Not supported
+        return 0;
+    }
+
+    @Override
+    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+        // Not supported
+        return 0;
+    }
+
+    @Override
+    public ParcelFileDescriptor openFile(Uri uri, String fileMode) throws FileNotFoundException {
+        File file = new File(getContext().getCacheDir(), uri.getPath());
+        int mode = (TextUtils.equals(fileMode, "r") ? ParcelFileDescriptor.MODE_READ_ONLY :
+                ParcelFileDescriptor.MODE_WRITE_ONLY
+                        |ParcelFileDescriptor.MODE_TRUNCATE
+                        |ParcelFileDescriptor.MODE_CREATE);
+        return ParcelFileDescriptor.open(file, mode);
+    }
+}
diff --git a/tests/tests/telephony/src/android/telephony/cts/MmsTest.java b/tests/tests/telephony/src/android/telephony/cts/MmsTest.java
new file mode 100644
index 0000000..176c50c
--- /dev/null
+++ b/tests/tests/telephony/src/android/telephony/cts/MmsTest.java
@@ -0,0 +1,306 @@
+/*
+ * Copyright (C) 2015 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.telephony.cts;
+
+import android.app.Activity;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.Uri;
+import android.os.SystemClock;
+import android.telephony.SmsManager;
+import android.telephony.TelephonyManager;
+import android.test.AndroidTestCase;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.google.android.mms.ContentType;
+import com.google.android.mms.InvalidHeaderValueException;
+import com.google.android.mms.pdu.CharacterSets;
+import com.google.android.mms.pdu.EncodedStringValue;
+import com.google.android.mms.pdu.GenericPdu;
+import com.google.android.mms.pdu.PduBody;
+import com.google.android.mms.pdu.PduComposer;
+import com.google.android.mms.pdu.PduHeaders;
+import com.google.android.mms.pdu.PduParser;
+import com.google.android.mms.pdu.PduPart;
+import com.google.android.mms.pdu.SendConf;
+import com.google.android.mms.pdu.SendReq;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Random;
+
+/**
+ * Test sending MMS using {@link android.telephony.SmsManager}.
+ */
+public class MmsTest extends AndroidTestCase {
+    private static final String TAG = "MmsTest";
+
+    private static final String ACTION_MMS_SENT = "CTS_MMS_SENT_ACTION";
+    private static final long DEFAULT_EXPIRY_TIME = 7 * 24 * 60 * 60;
+    private static final int DEFAULT_PRIORITY = PduHeaders.PRIORITY_NORMAL;
+
+    private static final String SUBJECT = "CTS MMS Test";
+    private static final String MESSAGE_BODY = "CTS MMS test message body";
+    private static final String TEXT_PART_FILENAME = "text_0.txt";
+    private static final String sSmilText =
+            "<smil>" +
+                    "<head>" +
+                        "<layout>" +
+                            "<root-layout/>" +
+                            "<region height=\"100%%\" id=\"Text\" left=\"0%%\" top=\"0%%\" width=\"100%%\"/>" +
+                        "</layout>" +
+                    "</head>" +
+                    "<body>" +
+                        "<par dur=\"8000ms\">" +
+                            "<text src=\"%s\" region=\"Text\"/>" +
+                        "</par>" +
+                    "</body>" +
+            "</smil>";
+
+    private static final long SENT_TIMEOUT = 1000 * 60 * 5; // 5 minutes
+
+    private static final String PROVIDER_AUTHORITY = "telephonyctstest";
+
+    private Random mRandom;
+    private SentReceiver mSentReceiver;
+    private TelephonyManager mTelephonyManager;
+
+    private static class SentReceiver extends BroadcastReceiver {
+        private final Object mLock;
+        private boolean mSuccess;
+        private boolean mDone;
+
+        public SentReceiver() {
+            mLock = new Object();
+            mSuccess = false;
+            mDone = false;
+        }
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Log.i(TAG, "Action " + intent.getAction());
+            if (!ACTION_MMS_SENT.equals(intent.getAction())) {
+                return;
+            }
+            final int resultCode = getResultCode();
+            if (resultCode == Activity.RESULT_OK) {
+                final byte[] response = intent.getByteArrayExtra(SmsManager.EXTRA_MMS_DATA);
+                if (response != null) {
+                    final GenericPdu pdu = new PduParser(
+                            response, shouldParseContentDisposition()).parse();
+                    if (pdu != null && pdu instanceof SendConf) {
+                        final SendConf sendConf = (SendConf) pdu;
+                        if (sendConf.getResponseStatus() == PduHeaders.RESPONSE_STATUS_OK) {
+                            mSuccess = true;
+                        } else {
+                            Log.e(TAG, "SendConf response status=" + sendConf.getResponseStatus());
+                        }
+                    } else {
+                        Log.e(TAG, "Not a SendConf: " +
+                                (pdu != null ? pdu.getClass().getCanonicalName() : "NULL"));
+                    }
+                } else {
+                    Log.e(TAG, "Empty response");
+                }
+            } else {
+                Log.e(TAG, "Failure result=" + resultCode);
+                if (resultCode == SmsManager.MMS_ERROR_HTTP_FAILURE) {
+                    final int httpError = intent.getIntExtra(SmsManager.EXTRA_MMS_HTTP_STATUS, 0);
+                    Log.e(TAG, "HTTP failure=" + httpError);
+                }
+            }
+            synchronized (mLock) {
+                mDone = true;
+                mLock.notify();
+            }
+        }
+
+        public boolean waitForSuccess(long timeout) {
+            synchronized(mLock) {
+                final long startTime = SystemClock.elapsedRealtime();
+                long waitTime = timeout;
+                while (waitTime > 0) {
+                    try {
+                        mLock.wait(waitTime);
+                    } catch (InterruptedException e) {
+                        // Ignore
+                    }
+                    if (mDone) {
+                        break;
+                    }
+                    waitTime = timeout - (SystemClock.elapsedRealtime() - startTime);
+                }
+                Log.i(TAG, "Wait for sent: done=" + mDone + ", success=" + mSuccess);
+                return mDone && mSuccess;
+            }
+
+        }
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        mRandom = new Random();
+        mTelephonyManager =
+                (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
+    }
+
+    public void testSendMmsMessage() {
+        if (!mTelephonyManager.isSmsCapable()) {
+            Log.i(TAG, "testSendMmsMessage skipped: not SMS capable");
+            return;
+        }
+
+        Log.i(TAG, "testSendMmsMessage");
+        final Context context = getContext();
+        // Register sent receiver
+        mSentReceiver = new SentReceiver();
+        context.registerReceiver(mSentReceiver, new IntentFilter(ACTION_MMS_SENT));
+        // Create local provider file for sending PDU
+        final String fileName = "send." + String.valueOf(Math.abs(mRandom.nextLong())) + ".dat";
+        final File sendFile = new File(context.getCacheDir(), fileName);
+        final String selfNumber = getSimNumber(context);
+        assertTrue(!TextUtils.isEmpty(selfNumber));
+        final byte[] pdu = buildPdu(context, selfNumber, SUBJECT, MESSAGE_BODY);
+        assertNotNull(pdu);
+        assertTrue(writePdu(sendFile, pdu));
+        final Uri contentUri = (new Uri.Builder())
+                .authority(PROVIDER_AUTHORITY)
+                .path(fileName)
+                .scheme(ContentResolver.SCHEME_CONTENT)
+                .build();
+        // Send
+        final PendingIntent pendingIntent = PendingIntent.getBroadcast(
+                context, 0, new Intent(ACTION_MMS_SENT), 0);
+        SmsManager.getDefault().sendMultimediaMessage(context,
+                contentUri, null/*locationUrl*/, null/*configOverrides*/, pendingIntent);
+        assertTrue(mSentReceiver.waitForSuccess(SENT_TIMEOUT));
+        sendFile.delete();
+    }
+
+    private static boolean writePdu(File file, byte[] pdu) {
+        FileOutputStream writer = null;
+        try {
+            writer = new FileOutputStream(file);
+            writer.write(pdu);
+            return true;
+        } catch (final IOException e) {
+            return false;
+        } finally {
+            if (writer != null) {
+                try {
+                    writer.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+    }
+
+    private byte[] buildPdu(Context context, String selfNumber, String subject, String text) {
+        final SendReq req = new SendReq();
+        // From, per spec
+        req.setFrom(new EncodedStringValue(selfNumber));
+        // To
+        final String[] recipients = new String[1];
+        recipients[0] = selfNumber;
+        final EncodedStringValue[] encodedNumbers = EncodedStringValue.encodeStrings(recipients);
+        if (encodedNumbers != null) {
+            req.setTo(encodedNumbers);
+        }
+        // Subject
+        if (!TextUtils.isEmpty(subject)) {
+            req.setSubject(new EncodedStringValue(subject));
+        }
+        // Date
+        req.setDate(System.currentTimeMillis() / 1000);
+        // Body
+        final PduBody body = new PduBody();
+        // Add text part. Always add a smil part for compatibility, without it there
+        // may be issues on some carriers/client apps
+        final int size = addTextPart(body, text, true/* add text smil */);
+        req.setBody(body);
+        // Message size
+        req.setMessageSize(size);
+        // Message class
+        req.setMessageClass(PduHeaders.MESSAGE_CLASS_PERSONAL_STR.getBytes());
+        // Expiry
+        req.setExpiry(DEFAULT_EXPIRY_TIME);
+        // The following set methods throw InvalidHeaderValueException
+        try {
+            // Priority
+            req.setPriority(DEFAULT_PRIORITY);
+            // Delivery report
+            req.setDeliveryReport(PduHeaders.VALUE_NO);
+            // Read report
+            req.setReadReport(PduHeaders.VALUE_NO);
+        } catch (InvalidHeaderValueException e) {
+            return null;
+        }
+
+        return new PduComposer(context, req).make();
+    }
+
+    private static int addTextPart(PduBody pb, String message, boolean addTextSmil) {
+        final PduPart part = new PduPart();
+        // Set Charset if it's a text media.
+        part.setCharset(CharacterSets.UTF_8);
+        // Set Content-Type.
+        part.setContentType(ContentType.TEXT_PLAIN.getBytes());
+        // Set Content-Location.
+        part.setContentLocation(TEXT_PART_FILENAME.getBytes());
+        int index = TEXT_PART_FILENAME.lastIndexOf(".");
+        String contentId = (index == -1) ? TEXT_PART_FILENAME
+                : TEXT_PART_FILENAME.substring(0, index);
+        part.setContentId(contentId.getBytes());
+        part.setData(message.getBytes());
+        pb.addPart(part);
+        if (addTextSmil) {
+            final String smil = String.format(sSmilText, TEXT_PART_FILENAME);
+            addSmilPart(pb, smil);
+        }
+        return part.getData().length;
+    }
+
+    private static void addSmilPart(PduBody pb, String smil) {
+        final PduPart smilPart = new PduPart();
+        smilPart.setContentId("smil".getBytes());
+        smilPart.setContentLocation("smil.xml".getBytes());
+        smilPart.setContentType(ContentType.APP_SMIL.getBytes());
+        smilPart.setData(smil.getBytes());
+        pb.addPart(0, smilPart);
+    }
+
+    private static String getSimNumber(Context context) {
+        final TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(
+                Context.TELEPHONY_SERVICE);
+        return telephonyManager.getLine1Number();
+    }
+
+    private static boolean shouldParseContentDisposition() {
+        return SmsManager
+                .getDefault()
+                .getCarrierConfigValues()
+                .getBoolean(SmsManager.MMS_CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION, true);
+    }
+}
diff --git a/tests/tests/telephony/src/android/telephony/cts/PhoneNumberUtilsTest.java b/tests/tests/telephony/src/android/telephony/cts/PhoneNumberUtilsTest.java
index d96743c..f49a8204 100644
--- a/tests/tests/telephony/src/android/telephony/cts/PhoneNumberUtilsTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/PhoneNumberUtilsTest.java
@@ -28,7 +28,10 @@
 import android.telephony.TelephonyManager;
 import android.test.AndroidTestCase;
 import android.text.Editable;
+import android.text.Spannable;
+import android.text.SpannableString;
 import android.text.SpannableStringBuilder;
+import android.text.style.TtsSpan;
 
 import java.util.Locale;
 
@@ -326,4 +329,38 @@
         assertEquals("5567861616", PhoneNumberUtils.convertAndStrip("٥‎ ٥‎٦‎ ٧‎ ٨‎ ٦‎ ١‎ ٦‎ ١‎ ٦‎"));
 
     }
+
+    public void testGetPhoneTtsSpan() {
+        // Setup: phone number without a country code. Lets keep coverage minimal to avoid
+        // exercising the underlying PhoneNumberUtil or constraining localization changes.
+        String phoneNumber = "6512223333";
+        // Execute
+        TtsSpan ttsSpan = PhoneNumberUtils.createTtsSpan(phoneNumber);
+        // Verify: the created TtsSpan contains the phone number.
+        assertEquals("6512223333", ttsSpan.getArgs().get(TtsSpan.ARG_NUMBER_PARTS));
+    }
+
+    public void testAddPhoneTtsSpan() {
+        // Setup: phone number without a country code. Lets keep coverage minimal to avoid
+        // exercising the underlying PhoneNumberUtil or constraining localization changes.
+        Spannable spannable = new SpannableString("Hello 6502223333");
+        // Execute
+        PhoneNumberUtils.addTtsSpan(spannable, 5, spannable.length());
+        // Verify: the Spannable is annotated with a TtsSpan in the correct location.
+        TtsSpan[] ttsSpans = spannable.getSpans(5, spannable.length() - 1, TtsSpan.class);
+        assertEquals(1, ttsSpans.length);
+        assertEquals("6502223333", ttsSpans[0].getArgs().get(TtsSpan.ARG_NUMBER_PARTS));
+    }
+
+    public void testGetPhoneTtsSpannable() {
+        // Setup: phone number without a country code. Lets keep coverage minimal to avoid
+        // exercising the underlying PhoneNumberUtil or constraining localization changes.
+        CharSequence phoneNumber = "6512223333";
+        // Execute
+        Spannable spannable = (Spannable) PhoneNumberUtils.createTtsSpannable(phoneNumber);
+        // Verify: returned char sequence contains a TtsSpan with the phone number in it
+        TtsSpan[] ttsSpans = spannable.getSpans(0, spannable.length() - 1, TtsSpan.class);
+        assertEquals(1, ttsSpans.length);
+        assertEquals("6512223333", ttsSpans[0].getArgs().get(TtsSpan.ARG_NUMBER_PARTS));
+    }
 }
diff --git a/tests/tests/telephony/src/android/telephony/cts/PhoneStateListenerTest.java b/tests/tests/telephony/src/android/telephony/cts/PhoneStateListenerTest.java
index f0f977a..18aa23f 100644
--- a/tests/tests/telephony/src/android/telephony/cts/PhoneStateListenerTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/PhoneStateListenerTest.java
@@ -22,6 +22,7 @@
 import android.telephony.CellLocation;
 import android.telephony.PhoneStateListener;
 import android.telephony.ServiceState;
+import android.telephony.SignalStrength;
 import android.telephony.TelephonyManager;
 import android.net.ConnectivityManager;
 import android.test.InstrumentationTestCase;
@@ -40,6 +41,7 @@
     private boolean mOnMessageWaitingIndicatorChangedCalled;
     private boolean mOnServiceStateChangedCalled;
     private boolean mOnSignalStrengthChangedCalled;
+    private SignalStrength mSignalStrength;
     private TelephonyManager mTelephonyManager;
     private PhoneStateListener mListener;
     private final Object mLock = new Object();
@@ -152,6 +154,54 @@
         assertTrue(mOnSignalStrengthChangedCalled);
     }
 
+    public void testOnSignalStrengthsChanged() throws Throwable {
+        if (mCm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) == null) {
+            Log.d(TAG, "Skipping test that requires ConnectivityManager.TYPE_MOBILE");
+            return;
+        }
+
+        TestThread t = new TestThread(new Runnable() {
+            public void run() {
+                Looper.prepare();
+
+                mListener = new PhoneStateListener() {
+                    @Override
+                    public void onSignalStrengthsChanged(SignalStrength signalStrength) {
+                        synchronized(mLock) {
+                            mSignalStrength = signalStrength;
+                            mLock.notify();
+                        }
+                    }
+                };
+                mTelephonyManager.listen(mListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
+
+                Looper.loop();
+            }
+        });
+
+        assertTrue(mSignalStrength == null);
+        t.start();
+
+        synchronized (mLock) {
+            while(mSignalStrength == null) {
+                mLock.wait();
+            }
+        }
+        t.checkException();
+        assertTrue(mSignalStrength != null);
+
+        // Call SignalStrength methods to make sure they do not throw any exceptions
+        mSignalStrength.getCdmaDbm();
+        mSignalStrength.getCdmaEcio();
+        mSignalStrength.getEvdoDbm();
+        mSignalStrength.getEvdoEcio();
+        mSignalStrength.getEvdoSnr();
+        mSignalStrength.getGsmBitErrorRate();
+        mSignalStrength.getGsmSignalStrength();
+        mSignalStrength.isGsm();
+        mSignalStrength.getLevel();
+    }
+
     public void testOnMessageWaitingIndicatorChanged() throws Throwable {
         if (mCm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) == null) {
             Log.d(TAG, "Skipping test that requires ConnectivityManager.TYPE_MOBILE");
diff --git a/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java b/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java
index cb9d96c..20810a8 100644
--- a/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java
@@ -22,8 +22,7 @@
 import android.test.AndroidTestCase;
 
 public class SimRestrictedApisTest extends AndroidTestCase {
-    private static final byte[] TEST_PDU = {
-            0, 0 };
+    private static final byte[] TEST_PDU = { 0, 0 };
     private TelephonyManager mTelephonyManager;
 
     @Override
@@ -221,7 +220,7 @@
     public void testGetPreferredNetworkType() {
         try {
             if (isSimCardPresent()) {
-                TelephonyManager.getDefault().getPreferredNetworkType();
+                TelephonyManager.getDefault().getPreferredNetworkType(0);
                 fail("Expected SecurityException. App doesn't have carrier privileges.");
             }
         } catch (SecurityException expected) {
diff --git a/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java b/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java
index 92f352f..5a80802 100755
--- a/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java
@@ -49,6 +49,10 @@
         "three separate messages.This is a very long text. This text should be broken " +
         "into three separate messages.This is a very long text. This text should be " +
         "broken into three separate messages.";;
+    private static final String LONG_TEXT_WITH_32BIT_CHARS =
+        "Long dkkshsh jdjsusj kbsksbdf jfkhcu hhdiwoqiwyrygrvn?*?*!\";:'/,."
+        + "__?9#9292736&4;\"$+$+((]\\[\\℅©℅™^®°¥°¥=¢£}}£∆~¶~÷|√×."
+        + " 😯😆😉😇😂😀👕🎓😀👙🐕🐀🐶🐰🐩⛪⛲ ";
 
     private static final String SMS_SEND_ACTION = "CTS_SMS_SEND_ACTION";
     private static final String SMS_DELIVERY_ACTION = "CTS_SMS_DELIVERY_ACTION";
@@ -215,17 +219,28 @@
     public void testDivideMessage() {
         ArrayList<String> dividedMessages = divideMessage(LONG_TEXT);
         assertNotNull(dividedMessages);
-        int numParts;
         if (TelephonyUtils.isSkt(mTelephonyManager)) {
-            assertTrue(isComplete(dividedMessages, 5) || isComplete(dividedMessages, 3));
+            assertTrue(isComplete(dividedMessages, 5, LONG_TEXT)
+                    || isComplete(dividedMessages, 3, LONG_TEXT));
         } else if (TelephonyUtils.isKt(mTelephonyManager)) {
-            assertTrue(isComplete(dividedMessages, 4) || isComplete(dividedMessages, 3));
+            assertTrue(isComplete(dividedMessages, 4, LONG_TEXT)
+                    || isComplete(dividedMessages, 3, LONG_TEXT));
         } else {
-            assertTrue(isComplete(dividedMessages, 3));
+            assertTrue(isComplete(dividedMessages, 3, LONG_TEXT));
         }
     }
 
-    private boolean isComplete(List<String> dividedMessages, int numParts) {
+    public void testDivideUnicodeMessage() {
+        ArrayList<String> dividedMessages = divideMessage(LONG_TEXT_WITH_32BIT_CHARS);
+        assertNotNull(dividedMessages);
+        assertTrue(isComplete(dividedMessages, 3, LONG_TEXT_WITH_32BIT_CHARS));
+        for (String messagePiece : dividedMessages) {
+            assertFalse(Character.isHighSurrogate(
+                    messagePiece.charAt(messagePiece.length() - 1)));
+        }
+    }
+
+    private boolean isComplete(List<String> dividedMessages, int numParts, String longText) {
         if (dividedMessages.size() != numParts) {
             return false;
         }
@@ -234,7 +249,7 @@
         for (int i = 0; i < numParts; i++) {
             actualMessage += dividedMessages.get(i);
         }
-        return LONG_TEXT.equals(actualMessage);
+        return longText.equals(actualMessage);
     }
 
     public void testSendMessages() throws InterruptedException {
@@ -375,9 +390,10 @@
                 Bundle bundle = intent.getExtras();
                 if (bundle != null) {
                     Object[] obj = (Object[]) bundle.get("pdus");
+                    String format = bundle.getString("format");
                     SmsMessage[] message = new SmsMessage[obj.length];
                     for (int i = 0; i < obj.length; i++) {
-                        message[i] = SmsMessage.createFromPdu((byte[]) obj[i]);
+                        message[i] = SmsMessage.createFromPdu((byte[]) obj[i], format);
                     }
 
                     for (SmsMessage currentMessage : message) {
diff --git a/tests/tests/telephony/src/android/telephony/cts/SmsMessageTest.java b/tests/tests/telephony/src/android/telephony/cts/SmsMessageTest.java
index ff7b097..d90e394 100644
--- a/tests/tests/telephony/src/android/telephony/cts/SmsMessageTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SmsMessageTest.java
@@ -62,6 +62,10 @@
     private static final long TIMESTAMP_MILLIS = 1149631383000l;
     private static final int SEPTETS_SKT = 80;
     private static final int SEPTETS_KT = 90;
+    private static final String LONG_TEXT_WITH_32BIT_CHARS =
+        "Long dkkshsh jdjsusj kbsksbdf jfkhcu hhdiwoqiwyrygrvn?*?*!\";:'/,."
+        + "__?9#9292736&4;\"$+$+((]\\[\\℅©℅™^®°¥°¥=¢£}}£∆~¶~÷|√×."
+        + " 😯😆😉😇😂😀👕🎓😀👙🐕🐀🐶🐰🐩⛪⛲ ";
 
     @Override
     protected void setUp() throws Exception {
@@ -71,7 +75,6 @@
         mPackageManager = getContext().getPackageManager();
     }
 
-    @SuppressWarnings("deprecation")
     public void testCreateFromPdu() throws Exception {
         if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
                 || mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CDMA)) {
@@ -80,7 +83,8 @@
         }
 
         String pdu = "07916164260220F0040B914151245584F600006060605130308A04D4F29C0E";
-        SmsMessage sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        SmsMessage sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu),
+                SmsMessage.FORMAT_3GPP);
         assertEquals(SCA1, sms.getServiceCenterAddress());
         assertEquals(OA1, sms.getOriginatingAddress());
         assertEquals(MESSAGE_BODY1, sms.getMessageBody());
@@ -88,7 +92,7 @@
         int[] result = SmsMessage.calculateLength(sms.getMessageBody(), true);
         assertEquals(SMS_NUMBER1, result[0]);
         assertEquals(sms.getMessageBody().length(), result[1]);
-        assertRemaining(sms.getMessageBody().length(), result[2]);
+        assertRemaining(sms.getMessageBody().length(), result[2], SmsMessage.MAX_USER_DATA_SEPTETS);
         assertEquals(SmsMessage.ENCODING_7BIT, result[3]);
         assertEquals(pdu, toHexString(sms.getPdu()));
 
@@ -106,13 +110,13 @@
         assertEquals(TIMESTAMP_MILLIS, sms.getTimestampMillis());
 
         // Test create from null Pdu
-        sms = SmsMessage.createFromPdu(null);
+        sms = SmsMessage.createFromPdu(null, SmsMessage.FORMAT_3GPP);
         assertNotNull(sms);
 
-        //Test create from long Pdu
+        // Test create from long Pdu
         pdu = "07912160130310F2040B915121927786F300036060924180008A0DA"
             + "8695DAC2E8FE9296A794E07";
-        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu), SmsMessage.FORMAT_3GPP);
         assertEquals(SCA2, sms.getServiceCenterAddress());
         assertEquals(OA2, sms.getOriginatingAddress());
         assertEquals(MESSAGE_BODY2, sms.getMessageBody());
@@ -120,30 +124,30 @@
         result = SmsMessage.calculateLength(msgBody, false);
         assertEquals(SMS_NUMBER2, result[0]);
         assertEquals(sms.getMessageBody().length(), result[1]);
-        assertRemaining(sms.getMessageBody().length(), result[2]);
+        assertRemaining(sms.getMessageBody().length(), result[2], SmsMessage.MAX_USER_DATA_SEPTETS);
         assertEquals(SmsMessage.ENCODING_7BIT, result[3]);
 
         // Test createFromPdu Ucs to Sms
         pdu = "07912160130300F4040B914151245584"
             + "F600087010807121352B10212200A900AE00680065006C006C006F";
-        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu), SmsMessage.FORMAT_3GPP);
         assertEquals(MESSAGE_BODY3, sms.getMessageBody());
         result = SmsMessage.calculateLength(sms.getMessageBody(), true);
         assertEquals(SMS_NUMBER3, result[0]);
         assertEquals(sms.getMessageBody().length(), result[1]);
-        assertRemaining(sms.getMessageBody().length(), result[2]);
+        assertRemaining(sms.getMessageBody().length(), result[2], SmsMessage.MAX_USER_DATA_SEPTETS);
         assertEquals(SmsMessage.ENCODING_7BIT, result[3]);
     }
 
-    private void assertRemaining(int messageLength, int remaining) {
+    private void assertRemaining(int messageLength, int remaining, int maxChars) {
         if (TelephonyUtils.isSkt(mTelephonyManager)) {
             assertTrue(checkRemaining(SEPTETS_SKT, messageLength, remaining)
-                    || checkRemaining(SmsMessage.MAX_USER_DATA_SEPTETS, messageLength, remaining));
+                    || checkRemaining(maxChars, messageLength, remaining));
         } else if (TelephonyUtils.isKt(mTelephonyManager)) {
             assertTrue(checkRemaining(SEPTETS_KT, messageLength, remaining)
-                    || checkRemaining(SmsMessage.MAX_USER_DATA_SEPTETS, messageLength, remaining));
+                    || checkRemaining(maxChars, messageLength, remaining));
         } else {
-            assertTrue(checkRemaining(SmsMessage.MAX_USER_DATA_SEPTETS, messageLength, remaining));
+            assertTrue(checkRemaining(maxChars, messageLength, remaining));
         }
     }
 
@@ -160,7 +164,8 @@
 
         // "set MWI flag"
         String pdu = "07912160130310F20404D0110041006060627171118A0120";
-        SmsMessage sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        SmsMessage sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu),
+                SmsMessage.FORMAT_3GPP);
         assertTrue(sms.isReplace());
         assertEquals(OA3, sms.getOriginatingAddress());
         assertEquals(MESSAGE_BODY4, sms.getMessageBody());
@@ -168,12 +173,12 @@
 
         // "clear mwi flag"
         pdu = "07912160130310F20404D0100041006021924193352B0120";
-        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu), SmsMessage.FORMAT_3GPP);
         assertTrue(sms.isMWIClearMessage());
 
         // "clear MWI flag"
         pdu = "07912160130310F20404D0100041006060627161058A0120";
-        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu), SmsMessage.FORMAT_3GPP);
         assertTrue(sms.isReplace());
         assertEquals(OA4, sms.getOriginatingAddress());
         assertEquals(MESSAGE_BODY5, sms.getMessageBody());
@@ -181,13 +186,13 @@
 
         // "set MWI flag"
         pdu = "07912180958750F84401800500C87020026195702B06040102000200";
-        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu), SmsMessage.FORMAT_3GPP);
         assertTrue(sms.isMWISetMessage());
         assertTrue(sms.isMwiDontStore());
 
         // "clear mwi flag"
         pdu = "07912180958750F84401800500C07020027160112B06040102000000";
-        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu), SmsMessage.FORMAT_3GPP);
 
         assertTrue(sms.isMWIClearMessage());
         assertTrue(sms.isMwiDontStore());
@@ -206,7 +211,8 @@
             + "66C414141414D7741414236514141414141008D908918802B3135313232393737"
             + "3638332F545950453D504C4D4E008A808E022B918805810306977F83687474703"
             + "A2F2F36";
-        SmsMessage sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        SmsMessage sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu),
+                SmsMessage.FORMAT_3GPP);
         byte[] userData = sms.getUserData();
         assertNotNull(userData);
     }
@@ -265,7 +271,8 @@
         String pdu = "07914151551512f204038105f300007011103164638a28e6f71b50c687db" +
                          "7076d9357eb7412f7a794e07cdeb6275794c07bde8e5391d247e93f3";
 
-        SmsMessage sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        SmsMessage sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu),
+                SmsMessage.FORMAT_3GPP);
         assertEquals(SCA4, sms.getServiceCenterAddress());
         assertTrue(sms.isEmail());
         assertEquals(EMAIL_ADD, sms.getEmailFrom());
@@ -277,7 +284,7 @@
 
         pdu = "07914151551512f204038105f400007011103105458a29e6f71b50c687db" +
                         "7076d9357eb741af0d0a442fcfe9c23739bfe16d289bdee6b5f1813629";
-        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu));
+        sms = SmsMessage.createFromPdu(hexStringToByteArray(pdu), SmsMessage.FORMAT_3GPP);
         assertEquals(SCA3, sms.getServiceCenterAddress());
         assertTrue(sms.isEmail());
         assertEquals(OA, sms.getDisplayOriginatingAddress());
@@ -286,6 +293,22 @@
         assertEquals(MB, sms.getEmailBody());
     }
 
+    public void testCalculateLength() throws Exception {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            return;
+        }
+
+        int[] result = SmsMessage.calculateLength(LONG_TEXT_WITH_32BIT_CHARS, false);
+        assertEquals(3, result[0]);
+        assertEquals(LONG_TEXT_WITH_32BIT_CHARS.length(), result[1]);
+        assertRemaining(LONG_TEXT_WITH_32BIT_CHARS.length(), result[2],
+                // 3 parts, each with (SmsMessage.MAX_USER_DATA_BYTES_WITH_HEADER / 2) 16-bit
+                // characters. We need to subtract one because a 32-bit character crosses the
+                // boundary of 2 parts.
+                3 * SmsMessage.MAX_USER_DATA_BYTES_WITH_HEADER / 2 - 1);
+        assertEquals(SmsMessage.ENCODING_16BIT, result[3]);
+    }
+
     private final static char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
             'A', 'B', 'C', 'D', 'E', 'F' };
 
diff --git a/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java b/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java
index 2be1dcb..41fe996 100644
--- a/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java
@@ -160,7 +160,28 @@
         mTelephonyManager.getNeighboringCellInfo();
         mTelephonyManager.isNetworkRoaming();
         mTelephonyManager.getDeviceId();
+        mTelephonyManager.getDeviceId(mTelephonyManager.getDefaultSim());
         mTelephonyManager.getDeviceSoftwareVersion();
+        mTelephonyManager.getPhoneCount();
+    }
+
+    /**
+     * Tests that the phone count returned is valid.
+     */
+    public void testGetPhoneCount() {
+        int phoneCount = mTelephonyManager.getPhoneCount();
+        int phoneType = mTelephonyManager.getPhoneType();
+        switch (phoneType) {
+            case TelephonyManager.PHONE_TYPE_GSM:
+            case TelephonyManager.PHONE_TYPE_CDMA:
+                assertTrue("Phone count should be > 0", phoneCount > 0);
+                break;
+            case TelephonyManager.PHONE_TYPE_NONE:
+                assertTrue("Phone count should be 0", phoneCount == 0 || phoneCount == 1);
+                break;
+            default:
+                throw new IllegalArgumentException("Did you add a new phone type? " + phoneType);
+        }
     }
 
     /**
@@ -170,6 +191,24 @@
      */
     public void testGetDeviceId() {
         String deviceId = mTelephonyManager.getDeviceId();
+        verifyDeviceId(deviceId);
+    }
+
+    /**
+     * Tests that the device properly reports either a valid IMEI if
+     * GSM, a valid MEID or ESN if CDMA, or a valid MAC address if
+     * only a WiFi device.
+     */
+    public void testGetDeviceIdForSlotId() {
+        String deviceId = mTelephonyManager.getDeviceId(mTelephonyManager.getDefaultSim());
+        verifyDeviceId(deviceId);
+        // Also verify that no exception is thrown for any slot id (including invalid ones)
+        for (int i = -1; i <= mTelephonyManager.getPhoneCount(); i++) {
+            mTelephonyManager.getDeviceId(i);
+        }
+    }
+
+    private void verifyDeviceId(String deviceId) {
         int phoneType = mTelephonyManager.getPhoneType();
         switch (phoneType) {
             case TelephonyManager.PHONE_TYPE_GSM:
diff --git a/tests/tests/telephony2/Android.mk b/tests/tests/telephony2/Android.mk
new file mode 100644
index 0000000..f405210
--- /dev/null
+++ b/tests/tests/telephony2/Android.mk
@@ -0,0 +1,33 @@
+# Copyright (C) 2015 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.
+
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner ctsdeviceutil
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsTelephony2TestCases
+
+LOCAL_JAVA_LIBRARIES += android.test.runner
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/telephony2/AndroidManifest.xml b/tests/tests/telephony2/AndroidManifest.xml
new file mode 100644
index 0000000..369f75e
--- /dev/null
+++ b/tests/tests/telephony2/AndroidManifest.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.telephony2">
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="com.android.cts.telephony2">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+
+</manifest>
+
diff --git a/tests/tests/telephony2/src/android/telephony2/cts/PhoneNumberTest.java b/tests/tests/telephony2/src/android/telephony2/cts/PhoneNumberTest.java
new file mode 100644
index 0000000..65392c4
--- /dev/null
+++ b/tests/tests/telephony2/src/android/telephony2/cts/PhoneNumberTest.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2015 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.telephony2.cts;
+
+import android.os.ParcelFileDescriptor;
+import android.telephony.TelephonyManager;
+import android.test.InstrumentationTestCase;
+import android.util.Log;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class PhoneNumberTest extends InstrumentationTestCase {
+    private static final String TAG = "PhoneNumberTest";
+
+    private void setDefaultSmsApp(boolean setToSmsApp) {
+        StringBuilder command = new StringBuilder();
+        command.append("appops set ");
+        command.append(getInstrumentation().getContext().getPackageName());
+        command.append(" WRITE_SMS ");
+        command.append(setToSmsApp ? "allow" : "default");
+
+        ParcelFileDescriptor pfd = getInstrumentation().getUiAutomation()
+                .executeShellCommand(command.toString());
+
+        InputStream is = new FileInputStream(pfd.getFileDescriptor());
+        try {
+            final byte[] buffer = new byte[8192];
+            while ((is.read(buffer)) != -1);
+        } catch (IOException e) {
+            Log.e(TAG, "Error managing default SMS app", e);
+        }
+    }
+
+    public void testGetLine1Number() {
+        TelephonyManager tm = getInstrumentation().getContext().getSystemService(
+                TelephonyManager.class);
+
+        setDefaultSmsApp(true);
+
+        // This shouldn't crash.
+        tm.getLine1Number();
+
+        setDefaultSmsApp(false);
+
+        // This should throw now.
+        try {
+            tm.getLine1Number();
+            fail("Should throw SecurityException");
+        } catch (SecurityException expected) {
+        }
+    }
+}
diff --git a/tests/tests/text/src/android/text/cts/BidiFormatterTest.java b/tests/tests/text/src/android/text/cts/BidiFormatterTest.java
index 645ab5b..5ace8b2 100644
--- a/tests/tests/text/src/android/text/cts/BidiFormatterTest.java
+++ b/tests/tests/text/src/android/text/cts/BidiFormatterTest.java
@@ -107,6 +107,9 @@
     }
 
     public void testUnicodeWrap() {
+        // Make sure an input of null doesn't crash anything.
+        assertNull(LTR_FMT.unicodeWrap(null));
+
         // Uniform directionality in opposite context.
         assertEquals("uniform dir opposite to LTR context",
                 RLE + "." + HE + "." + PDF + LRM,
diff --git a/tests/tests/text/src/android/text/cts/SpannableStringBuilderTest.java b/tests/tests/text/src/android/text/cts/SpannableStringBuilderTest.java
index 4895ca9..36b081c 100644
--- a/tests/tests/text/src/android/text/cts/SpannableStringBuilderTest.java
+++ b/tests/tests/text/src/android/text/cts/SpannableStringBuilderTest.java
@@ -18,10 +18,12 @@
 
 
 import android.test.AndroidTestCase;
+import android.text.Editable;
 import android.text.InputFilter;
 import android.text.SpannableString;
 import android.text.SpannableStringBuilder;
 import android.text.Spanned;
+import android.text.TextWatcher;
 import android.text.style.StrikethroughSpan;
 import android.text.style.TabStopSpan;
 import android.text.style.UnderlineSpan;
@@ -596,4 +598,46 @@
             // expected exception
         }
     }
+
+    private static class MockTextWatcher implements TextWatcher {
+        private int mDepth = 0;
+
+        @Override
+        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+            SpannableStringBuilder builder = (SpannableStringBuilder)s;
+            mDepth++;
+            assertEquals(mDepth, builder.getTextWatcherDepth());
+            mDepth--;
+        }
+
+        @Override
+        public void onTextChanged(CharSequence s, int start, int before, int count) {
+            SpannableStringBuilder builder = (SpannableStringBuilder)s;
+            mDepth++;
+            assertEquals(mDepth, builder.getTextWatcherDepth());
+            mDepth--;
+        }
+
+        @Override
+        public void afterTextChanged(Editable s) {
+            SpannableStringBuilder builder = (SpannableStringBuilder)s;
+            mDepth++;
+            assertEquals(mDepth, builder.getTextWatcherDepth());
+            if (mDepth <= builder.length()) {
+                // This will recursively call afterTextChanged.
+                builder.replace(mDepth - 1, mDepth, "a");
+            }
+            mDepth--;
+        }
+    }
+
+    public void testGetTextWatcherDepth() {
+        SpannableStringBuilder builder = new SpannableStringBuilder("hello");
+        builder.setSpan(new MockTextWatcher(), 0, builder.length(), 0);
+        assertEquals(0, builder.getTextWatcherDepth());
+        builder.replace(0, 1, "H");
+        assertEquals(0, builder.getTextWatcherDepth());
+        // MockTextWatcher replaces each character with 'a'.
+        assertEquals("aaaaa", builder.toString());
+    }
 }
diff --git a/tests/tests/text/src/android/text/cts/StaticLayoutTest.java b/tests/tests/text/src/android/text/cts/StaticLayoutTest.java
index b4fb8ab..c6f4049 100644
--- a/tests/tests/text/src/android/text/cts/StaticLayoutTest.java
+++ b/tests/tests/text/src/android/text/cts/StaticLayoutTest.java
@@ -18,11 +18,21 @@
 
 import android.test.AndroidTestCase;
 import android.text.Editable;
+import android.text.GetChars;
+import android.text.GraphicsOperations;
+import android.text.Layout.Alignment;
+import android.text.TextUtils.TruncateAt;
+import android.text.SpannableString;
+import android.text.SpannableStringBuilder;
+import android.text.SpannedString;
 import android.text.StaticLayout;
 import android.text.TextDirectionHeuristics;
 import android.text.TextPaint;
 import android.text.TextUtils;
-import android.text.Layout.Alignment;
+
+import java.text.Normalizer;
+import java.util.ArrayList;
+import java.util.List;
 
 public class StaticLayoutTest extends AndroidTestCase {
     private static final float SPACE_MULTI = 1.0f;
@@ -104,6 +114,104 @@
         }
     }
 
+    public void testBuilder() {
+        {
+            // Obtain.
+            StaticLayout.Builder builder = StaticLayout.Builder.obtain(LAYOUT_TEXT, 0,
+                    LAYOUT_TEXT.length(), mDefaultPaint, DEFAULT_OUTER_WIDTH);
+            StaticLayout layout = builder.build();
+            // Check values passed to obtain().
+            assertEquals(LAYOUT_TEXT, layout.getText());
+            assertEquals(mDefaultPaint, layout.getPaint());
+            assertEquals(DEFAULT_OUTER_WIDTH, layout.getWidth());
+            // Check default values.
+            assertEquals(TextDirectionHeuristics.FIRSTSTRONG_LTR,
+                    layout.getTextDirectionHeuristic());
+            assertEquals(Alignment.ALIGN_NORMAL, layout.getAlignment());
+            assertEquals(0.0f, layout.getSpacingAdd());
+            assertEquals(1.0f, layout.getSpacingMultiplier());
+            assertEquals(DEFAULT_OUTER_WIDTH, layout.getEllipsizedWidth());
+        }
+        {
+            // Obtain with null objects.
+            StaticLayout.Builder builder = StaticLayout.Builder.obtain(null, 0, 0, null, 0);
+            try {
+                StaticLayout layout = builder.build();
+                fail("should throw NullPointerException here");
+            } catch (NullPointerException e) {
+            }
+        }
+        {
+            // setText.
+            StaticLayout.Builder builder = StaticLayout.Builder.obtain(LAYOUT_TEXT, 0,
+                    LAYOUT_TEXT.length(), mDefaultPaint, DEFAULT_OUTER_WIDTH);
+            builder.setText(LAYOUT_TEXT_SINGLE_LINE);
+            StaticLayout layout = builder.build();
+            assertEquals(LAYOUT_TEXT_SINGLE_LINE, layout.getText());
+        }
+        {
+            // setAlignment.
+            StaticLayout.Builder builder = StaticLayout.Builder.obtain(LAYOUT_TEXT, 0,
+                    LAYOUT_TEXT.length(), mDefaultPaint, DEFAULT_OUTER_WIDTH);
+            builder.setAlignment(DEFAULT_ALIGN);
+            StaticLayout layout = builder.build();
+            assertEquals(DEFAULT_ALIGN, layout.getAlignment());
+        }
+        {
+            // setTextDirection.
+            StaticLayout.Builder builder = StaticLayout.Builder.obtain(LAYOUT_TEXT, 0,
+                    LAYOUT_TEXT.length(), mDefaultPaint, DEFAULT_OUTER_WIDTH);
+            builder.setTextDirection(TextDirectionHeuristics.RTL);
+            StaticLayout layout = builder.build();
+            // Always returns TextDirectionHeuristics.FIRSTSTRONG_LTR.
+            assertEquals(TextDirectionHeuristics.FIRSTSTRONG_LTR,
+                    layout.getTextDirectionHeuristic());
+        }
+        {
+            // setLineSpacing.
+            StaticLayout.Builder builder = StaticLayout.Builder.obtain(LAYOUT_TEXT, 0,
+                    LAYOUT_TEXT.length(), mDefaultPaint, DEFAULT_OUTER_WIDTH);
+            builder.setLineSpacing(1.0f, 2.0f);
+            StaticLayout layout = builder.build();
+            assertEquals(1.0f, layout.getSpacingAdd());
+            assertEquals(2.0f, layout.getSpacingMultiplier());
+        }
+        {
+            // setEllipsizedWidth and setEllipsize.
+            StaticLayout.Builder builder = StaticLayout.Builder.obtain(LAYOUT_TEXT, 0,
+                    LAYOUT_TEXT.length(), mDefaultPaint, DEFAULT_OUTER_WIDTH);
+            builder.setEllipsize(TruncateAt.END);
+            builder.setEllipsizedWidth(ELLIPSIZE_WIDTH);
+            StaticLayout layout = builder.build();
+            assertEquals(ELLIPSIZE_WIDTH, layout.getEllipsizedWidth());
+            assertEquals(DEFAULT_OUTER_WIDTH, layout.getWidth());
+            assertTrue(layout.getEllipsisCount(0) == 0);
+            assertTrue(layout.getEllipsisCount(5) > 0);
+        }
+        {
+            // setMaxLines.
+            StaticLayout.Builder builder = StaticLayout.Builder.obtain(LAYOUT_TEXT, 0,
+                    LAYOUT_TEXT.length(), mDefaultPaint, DEFAULT_OUTER_WIDTH);
+            builder.setMaxLines(1);
+            builder.setEllipsize(TruncateAt.END);
+            StaticLayout layout = builder.build();
+            assertTrue(layout.getEllipsisCount(0) > 0);
+            assertEquals(1, layout.getLineCount());
+        }
+        {
+            // Setter methods that cannot be directly tested.
+            // setBreakStrategy, setHyphenationFrequency, setIncludePad, and setIndents.
+            StaticLayout.Builder builder = StaticLayout.Builder.obtain(LAYOUT_TEXT, 0,
+                    LAYOUT_TEXT.length(), mDefaultPaint, DEFAULT_OUTER_WIDTH);
+            builder.setBreakStrategy(StaticLayout.BREAK_STRATEGY_HIGH_QUALITY);
+            builder.setHyphenationFrequency(StaticLayout.HYPHENATION_FREQUENCY_FULL);
+            builder.setIncludePad(true);
+            builder.setIndents(null, null);
+            StaticLayout layout = builder.build();
+            assertNotNull(layout);
+        }
+    }
+
     /*
      * Get the line number corresponding to the specified vertical position.
      *  If you ask for a position above 0, you get 0. above 0 means pixel above the fire line
@@ -336,30 +444,6 @@
         assertTrue(mDefaultLayout.getEllipsisCount(3) == 0);
         assertTrue(mDefaultLayout.getEllipsisCount(4) == 0);
         assertTrue(mDefaultLayout.getEllipsisCount(5) > 0);
-
-        // Single line case and TruncateAt.END so that we have some ellipsis
-        mDefaultLayout = createEllipsizeStaticLayout(LAYOUT_TEXT_SINGLE_LINE,
-                TextUtils.TruncateAt.END,
-                1);
-        assertTrue(mDefaultLayout.getEllipsisCount(0) > 0);
-
-        // Single line case and TruncateAt.MIDDLE so that we have some ellipsis
-        mDefaultLayout = createEllipsizeStaticLayout(LAYOUT_TEXT_SINGLE_LINE,
-                TextUtils.TruncateAt.MIDDLE,
-                1);
-        assertTrue(mDefaultLayout.getEllipsisCount(0) > 0);
-
-        // Single line case and TruncateAt.END so that we have some ellipsis
-        mDefaultLayout = createEllipsizeStaticLayout(LAYOUT_TEXT_SINGLE_LINE,
-                TextUtils.TruncateAt.END,
-                1);
-        assertTrue(mDefaultLayout.getEllipsisCount(0) > 0);
-
-        // Single line case and TruncateAt.MARQUEE so that we have NO ellipsis
-        mDefaultLayout = createEllipsizeStaticLayout(LAYOUT_TEXT_SINGLE_LINE,
-                TextUtils.TruncateAt.MARQUEE,
-                1);
-        assertTrue(mDefaultLayout.getEllipsisCount(0) == 0);
     }
 
     /*
@@ -406,6 +490,65 @@
         assertEquals(outerWidth, layout.getEllipsizedWidth());
     }
 
+    public void testEllipsis_singleLine() {
+        {
+            // Single line case and TruncateAt.END so that we have some ellipsis
+            StaticLayout layout = createEllipsizeStaticLayout(LAYOUT_TEXT_SINGLE_LINE,
+                    TextUtils.TruncateAt.END, 1);
+            assertTrue(layout.getEllipsisCount(0) > 0);
+        }
+        {
+            // Single line case and TruncateAt.MIDDLE so that we have some ellipsis
+            StaticLayout layout = createEllipsizeStaticLayout(LAYOUT_TEXT_SINGLE_LINE,
+                    TextUtils.TruncateAt.MIDDLE, 1);
+            assertTrue(layout.getEllipsisCount(0) > 0);
+        }
+        {
+            // Single line case and TruncateAt.END so that we have some ellipsis
+            StaticLayout layout = createEllipsizeStaticLayout(LAYOUT_TEXT_SINGLE_LINE,
+                    TextUtils.TruncateAt.END, 1);
+            assertTrue(layout.getEllipsisCount(0) > 0);
+        }
+        {
+            // Single line case and TruncateAt.MARQUEE so that we have NO ellipsis
+            StaticLayout layout = createEllipsizeStaticLayout(LAYOUT_TEXT_SINGLE_LINE,
+                    TextUtils.TruncateAt.MARQUEE, 1);
+            assertTrue(layout.getEllipsisCount(0) == 0);
+        }
+
+        final String text = "\u3042" // HIRAGANA LETTER A
+                + "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
+        final float textWidth = mDefaultPaint.measureText(text);
+        final int halfWidth = (int)(textWidth / 2.0f);
+        {
+            StaticLayout layout = new StaticLayout(text, 0, text.length(), mDefaultPaint,
+                    halfWidth, DEFAULT_ALIGN, TextDirectionHeuristics.FIRSTSTRONG_LTR,
+                    SPACE_MULTI, SPACE_ADD, false, TextUtils.TruncateAt.END, halfWidth, 1);
+            assertTrue(layout.getEllipsisCount(0) > 0);
+            assertTrue(layout.getEllipsisStart(0) > 0);
+        }
+        {
+            StaticLayout layout = new StaticLayout(text, 0, text.length(), mDefaultPaint,
+                    halfWidth, DEFAULT_ALIGN, TextDirectionHeuristics.FIRSTSTRONG_LTR,
+                    SPACE_MULTI, SPACE_ADD, false, TextUtils.TruncateAt.START, halfWidth, 1);
+            assertTrue(layout.getEllipsisCount(0) > 0);
+            assertEquals(0, mDefaultLayout.getEllipsisStart(0));
+        }
+        {
+            StaticLayout layout = new StaticLayout(text, 0, text.length(), mDefaultPaint,
+                    halfWidth, DEFAULT_ALIGN, TextDirectionHeuristics.FIRSTSTRONG_LTR,
+                    SPACE_MULTI, SPACE_ADD, false, TextUtils.TruncateAt.MIDDLE, halfWidth, 1);
+            assertTrue(layout.getEllipsisCount(0) > 0);
+            assertTrue(layout.getEllipsisStart(0) > 0);
+        }
+        {
+            StaticLayout layout = new StaticLayout(text, 0, text.length(), mDefaultPaint,
+                    halfWidth, DEFAULT_ALIGN, TextDirectionHeuristics.FIRSTSTRONG_LTR,
+                    SPACE_MULTI, SPACE_ADD, false, TextUtils.TruncateAt.MARQUEE, halfWidth, 1);
+            assertEquals(0, layout.getEllipsisCount(0));
+        }
+    }
+
     /**
      * scenario description:
      * 1. set the text.
@@ -427,4 +570,409 @@
         assertTrue(layout.getLineContainsTab(0));
 
     }
+
+    // String wrapper for testing not well known implementation of CharSequence.
+    private class FakeCharSequence implements CharSequence {
+        private String mStr;
+
+        public FakeCharSequence(String str) {
+            mStr = str;
+        }
+
+        @Override
+        public char charAt(int index) {
+            return mStr.charAt(index);
+        }
+
+        @Override
+        public int length() {
+            return mStr.length();
+        }
+
+        @Override
+        public CharSequence subSequence(int start, int end) {
+            return mStr.subSequence(start, end);
+        }
+
+        @Override
+        public String toString() {
+            return mStr;
+        }
+    };
+
+    private List<CharSequence> buildTestCharSequences(String testString, Normalizer.Form[] forms) {
+        List<CharSequence> result = new ArrayList<CharSequence>();
+
+        List<String> normalizedStrings = new ArrayList<String>();
+        for (Normalizer.Form form: forms) {
+            normalizedStrings.add(Normalizer.normalize(testString, form));
+        }
+
+        for (String str: normalizedStrings) {
+            result.add(str);
+            result.add(new SpannedString(str));
+            result.add(new SpannableString(str));
+            result.add(new SpannableStringBuilder(str));  // as a GraphicsOperations implementation.
+            result.add(new FakeCharSequence(str));  // as a not well known implementation.
+        }
+        return result;
+    }
+
+    private String buildTestMessage(CharSequence seq) {
+        String normalized;
+        if (Normalizer.isNormalized(seq, Normalizer.Form.NFC)) {
+            normalized = "NFC";
+        } else if (Normalizer.isNormalized(seq, Normalizer.Form.NFD)) {
+            normalized = "NFD";
+        } else if (Normalizer.isNormalized(seq, Normalizer.Form.NFKC)) {
+            normalized = "NFKC";
+        } else if (Normalizer.isNormalized(seq, Normalizer.Form.NFKD)) {
+            normalized = "NFKD";
+        } else {
+            throw new IllegalStateException("Normalized form is not NFC/NFD/NFKC/NFKD");
+        }
+
+        StringBuilder builder = new StringBuilder();
+        for (int i = 0; i < seq.length(); ++i) {
+            builder.append(String.format("0x%04X ", Integer.valueOf(seq.charAt(i))));
+        }
+
+        return "testString: \"" + seq.toString() + "\"[" + builder.toString() + "]" +
+                ", class: " + seq.getClass().getName() +
+                ", Normalization: " + normalized;
+    }
+
+    public void testGetOffset_ASCII() {
+        String testStrings[] = { "abcde", "ab\ncd", "ab\tcd", "ab\n\nc", "ab\n\tc" };
+
+        for (String testString: testStrings) {
+            for (CharSequence seq: buildTestCharSequences(testString, Normalizer.Form.values())) {
+                StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                        DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+                String testLabel = buildTestMessage(seq);
+
+                assertEquals(testLabel, 0, layout.getOffsetToLeftOf(0));
+                assertEquals(testLabel, 0, layout.getOffsetToLeftOf(1));
+                assertEquals(testLabel, 1, layout.getOffsetToLeftOf(2));
+                assertEquals(testLabel, 2, layout.getOffsetToLeftOf(3));
+                assertEquals(testLabel, 3, layout.getOffsetToLeftOf(4));
+                assertEquals(testLabel, 4, layout.getOffsetToLeftOf(5));
+
+                assertEquals(testLabel, 1, layout.getOffsetToRightOf(0));
+                assertEquals(testLabel, 2, layout.getOffsetToRightOf(1));
+                assertEquals(testLabel, 3, layout.getOffsetToRightOf(2));
+                assertEquals(testLabel, 4, layout.getOffsetToRightOf(3));
+                assertEquals(testLabel, 5, layout.getOffsetToRightOf(4));
+                assertEquals(testLabel, 5, layout.getOffsetToRightOf(5));
+            }
+        }
+
+        String testString = "ab\r\nde";
+        for (CharSequence seq: buildTestCharSequences(testString, Normalizer.Form.values())) {
+            StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                    DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+            String testLabel = buildTestMessage(seq);
+
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(0));
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(1));
+            assertEquals(testLabel, 1, layout.getOffsetToLeftOf(2));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(3));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(4));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(5));
+            assertEquals(testLabel, 5, layout.getOffsetToLeftOf(6));
+
+            assertEquals(testLabel, 1, layout.getOffsetToRightOf(0));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(1));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(2));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(3));
+            assertEquals(testLabel, 5, layout.getOffsetToRightOf(4));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(5));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(6));
+        }
+    }
+
+    public void testGetOffset_UNICODE() {
+        String testStrings[] = new String[] {
+              // Cyrillic alphabets.
+              "\u0410\u0411\u0412\u0413\u0414",
+              // Japanese Hiragana Characters.
+              "\u3042\u3044\u3046\u3048\u304A",
+        };
+
+        for (String testString: testStrings) {
+            for (CharSequence seq: buildTestCharSequences(testString, Normalizer.Form.values())) {
+                StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                        DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+                String testLabel = buildTestMessage(seq);
+
+                assertEquals(testLabel, 0, layout.getOffsetToLeftOf(0));
+                assertEquals(testLabel, 0, layout.getOffsetToLeftOf(1));
+                assertEquals(testLabel, 1, layout.getOffsetToLeftOf(2));
+                assertEquals(testLabel, 2, layout.getOffsetToLeftOf(3));
+                assertEquals(testLabel, 3, layout.getOffsetToLeftOf(4));
+                assertEquals(testLabel, 4, layout.getOffsetToLeftOf(5));
+
+                assertEquals(testLabel, 1, layout.getOffsetToRightOf(0));
+                assertEquals(testLabel, 2, layout.getOffsetToRightOf(1));
+                assertEquals(testLabel, 3, layout.getOffsetToRightOf(2));
+                assertEquals(testLabel, 4, layout.getOffsetToRightOf(3));
+                assertEquals(testLabel, 5, layout.getOffsetToRightOf(4));
+                assertEquals(testLabel, 5, layout.getOffsetToRightOf(5));
+            }
+        }
+    }
+
+    public void testGetOffset_UNICODE_Normalization() {
+        // "A" with acute, circumflex, tilde, diaeresis, ring above.
+        String testString = "\u00C1\u00C2\u00C3\u00C4\u00C5";
+        Normalizer.Form[] oneUnicodeForms = { Normalizer.Form.NFC, Normalizer.Form.NFKC };
+        for (CharSequence seq: buildTestCharSequences(testString, oneUnicodeForms)) {
+            StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                    DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+            String testLabel = buildTestMessage(seq);
+
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(0));
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(1));
+            assertEquals(testLabel, 1, layout.getOffsetToLeftOf(2));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(3));
+            assertEquals(testLabel, 3, layout.getOffsetToLeftOf(4));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(5));
+
+            assertEquals(testLabel, 1, layout.getOffsetToRightOf(0));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(1));
+            assertEquals(testLabel, 3, layout.getOffsetToRightOf(2));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(3));
+            assertEquals(testLabel, 5, layout.getOffsetToRightOf(4));
+            assertEquals(testLabel, 5, layout.getOffsetToRightOf(5));
+        }
+
+        Normalizer.Form[] twoUnicodeForms = { Normalizer.Form.NFD, Normalizer.Form.NFKD };
+        for (CharSequence seq: buildTestCharSequences(testString, twoUnicodeForms)) {
+            StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                    DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+            String testLabel = buildTestMessage(seq);
+
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(0));
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(1));
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(2));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(3));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(4));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(5));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(6));
+            assertEquals(testLabel, 6, layout.getOffsetToLeftOf(7));
+            assertEquals(testLabel, 6, layout.getOffsetToLeftOf(8));
+            assertEquals(testLabel, 8, layout.getOffsetToLeftOf(9));
+            assertEquals(testLabel, 8, layout.getOffsetToLeftOf(10));
+
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(0));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(1));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(2));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(3));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(4));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(5));
+            assertEquals(testLabel, 8, layout.getOffsetToRightOf(6));
+            assertEquals(testLabel, 8, layout.getOffsetToRightOf(7));
+            assertEquals(testLabel, 10, layout.getOffsetToRightOf(8));
+            assertEquals(testLabel, 10, layout.getOffsetToRightOf(9));
+            assertEquals(testLabel, 10, layout.getOffsetToRightOf(10));
+        }
+    }
+
+    public void testGetOffset_UNICODE_SurrogatePairs() {
+        // Emoticons for surrogate pairs tests.
+        String testString =
+                "\uD83D\uDE00\uD83D\uDE01\uD83D\uDE02\uD83D\uDE03\uD83D\uDE04";
+        for (CharSequence seq: buildTestCharSequences(testString, Normalizer.Form.values())) {
+            StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                    DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+            String testLabel = buildTestMessage(seq);
+
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(0));
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(1));
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(2));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(3));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(4));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(5));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(6));
+            assertEquals(testLabel, 6, layout.getOffsetToLeftOf(7));
+            assertEquals(testLabel, 6, layout.getOffsetToLeftOf(8));
+            assertEquals(testLabel, 8, layout.getOffsetToLeftOf(9));
+            assertEquals(testLabel, 8, layout.getOffsetToLeftOf(10));
+
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(0));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(1));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(2));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(3));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(4));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(5));
+            assertEquals(testLabel, 8, layout.getOffsetToRightOf(6));
+            assertEquals(testLabel, 8, layout.getOffsetToRightOf(7));
+            assertEquals(testLabel, 10, layout.getOffsetToRightOf(8));
+            assertEquals(testLabel, 10, layout.getOffsetToRightOf(9));
+            assertEquals(testLabel, 10, layout.getOffsetToRightOf(10));
+        }
+    }
+
+    public void testGetOffset_UNICODE_Thai() {
+        // Thai Characters. The expected cursorable boundary is
+        // | \u0E02 | \u0E2D | \u0E1A | \u0E04\u0E38 | \u0E13 |
+        String testString = "\u0E02\u0E2D\u0E1A\u0E04\u0E38\u0E13";
+        for (CharSequence seq: buildTestCharSequences(testString, Normalizer.Form.values())) {
+            StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                    DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+            String testLabel = buildTestMessage(seq);
+
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(0));
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(1));
+            assertEquals(testLabel, 1, layout.getOffsetToLeftOf(2));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(3));
+            assertEquals(testLabel, 3, layout.getOffsetToLeftOf(4));
+            assertEquals(testLabel, 3, layout.getOffsetToLeftOf(5));
+            assertEquals(testLabel, 5, layout.getOffsetToLeftOf(6));
+
+            assertEquals(testLabel, 1, layout.getOffsetToRightOf(0));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(1));
+            assertEquals(testLabel, 3, layout.getOffsetToRightOf(2));
+            assertEquals(testLabel, 5, layout.getOffsetToRightOf(3));
+            assertEquals(testLabel, 5, layout.getOffsetToRightOf(4));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(5));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(6));
+        }
+    }
+
+    public void testGetOffset_UNICODE_Hebrew() {
+        String testString = "\u05DE\u05E1\u05E2\u05D3\u05D4"; // Hebrew Characters
+        for (CharSequence seq: buildTestCharSequences(testString, Normalizer.Form.values())) {
+            StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                    DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN,
+                    TextDirectionHeuristics.RTL, SPACE_MULTI, SPACE_ADD, true);
+
+            String testLabel = buildTestMessage(seq);
+
+            assertEquals(testLabel, 1, layout.getOffsetToLeftOf(0));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(1));
+            assertEquals(testLabel, 3, layout.getOffsetToLeftOf(2));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(3));
+            assertEquals(testLabel, 5, layout.getOffsetToLeftOf(4));
+            assertEquals(testLabel, 5, layout.getOffsetToLeftOf(5));
+
+            assertEquals(testLabel, 0, layout.getOffsetToRightOf(0));
+            assertEquals(testLabel, 0, layout.getOffsetToRightOf(1));
+            assertEquals(testLabel, 1, layout.getOffsetToRightOf(2));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(3));
+            assertEquals(testLabel, 3, layout.getOffsetToRightOf(4));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(5));
+        }
+    }
+
+    public void testGetOffset_UNICODE_Arabic() {
+        // Arabic Characters. The expected cursorable boundary is
+        // | \u0623 \u064F | \u0633 \u0652 | \u0631 \u064E | \u0629 \u064C |";
+        String testString = "\u0623\u064F\u0633\u0652\u0631\u064E\u0629\u064C";
+
+        Normalizer.Form[] oneUnicodeForms = { Normalizer.Form.NFC, Normalizer.Form.NFKC };
+        for (CharSequence seq: buildTestCharSequences(testString, oneUnicodeForms)) {
+            StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                    DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+            String testLabel = buildTestMessage(seq);
+
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(0));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(1));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(2));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(3));
+            assertEquals(testLabel, 6, layout.getOffsetToLeftOf(4));
+            assertEquals(testLabel, 6, layout.getOffsetToLeftOf(5));
+            assertEquals(testLabel, 8, layout.getOffsetToLeftOf(6));
+            assertEquals(testLabel, 8, layout.getOffsetToLeftOf(7));
+            assertEquals(testLabel, 8, layout.getOffsetToLeftOf(8));
+
+            assertEquals(testLabel, 0, layout.getOffsetToRightOf(0));
+            assertEquals(testLabel, 0, layout.getOffsetToRightOf(1));
+            assertEquals(testLabel, 0, layout.getOffsetToRightOf(2));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(3));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(4));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(5));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(6));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(7));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(8));
+        }
+    }
+
+    public void testGetOffset_UNICODE_Bidi() {
+        // String having RTL characters and LTR characters
+
+        // LTR Context
+        // The first and last two characters are LTR characters.
+        String testString = "\u0061\u0062\u05DE\u05E1\u05E2\u0063\u0064";
+        // Logical order: [L1] [L2] [R1] [R2] [R3] [L3] [L4]
+        //               0    1    2    3    4    5    6    7
+        // Display order: [L1] [L2] [R3] [R2] [R1] [L3] [L4]
+        //               0    1    2    4    3    5    6    7
+        // [L?] means ?th LTR character and [R?] means ?th RTL character.
+        for (CharSequence seq: buildTestCharSequences(testString, Normalizer.Form.values())) {
+            StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                    DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+            String testLabel = buildTestMessage(seq);
+
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(0));
+            assertEquals(testLabel, 0, layout.getOffsetToLeftOf(1));
+            assertEquals(testLabel, 1, layout.getOffsetToLeftOf(2));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(3));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(4));
+            assertEquals(testLabel, 3, layout.getOffsetToLeftOf(5));
+            assertEquals(testLabel, 5, layout.getOffsetToLeftOf(6));
+            assertEquals(testLabel, 6, layout.getOffsetToLeftOf(7));
+
+            assertEquals(testLabel, 1, layout.getOffsetToRightOf(0));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(1));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(2));
+            assertEquals(testLabel, 5, layout.getOffsetToRightOf(3));
+            assertEquals(testLabel, 3, layout.getOffsetToRightOf(4));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(5));
+            assertEquals(testLabel, 7, layout.getOffsetToRightOf(6));
+            assertEquals(testLabel, 7, layout.getOffsetToRightOf(7));
+        }
+
+        // RTL Context
+        // The first and last two characters are RTL characters.
+        String testString2 = "\u05DE\u05E1\u0063\u0064\u0065\u05DE\u05E1";
+        // Logical order: [R1] [R2] [L1] [L2] [L3] [R3] [R4]
+        //               0    1    2    3    4    5    6    7
+        // Display order: [R4] [R3] [L1] [L2] [L3] [R2] [R1]
+        //               7    6    5    3    4    2    1    0
+        // [L?] means ?th LTR character and [R?] means ?th RTL character.
+        for (CharSequence seq: buildTestCharSequences(testString2, Normalizer.Form.values())) {
+            StaticLayout layout = new StaticLayout(seq, mDefaultPaint,
+                    DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
+
+            String testLabel = buildTestMessage(seq);
+
+            assertEquals(testLabel, 1, layout.getOffsetToLeftOf(0));
+            assertEquals(testLabel, 2, layout.getOffsetToLeftOf(1));
+            assertEquals(testLabel, 4, layout.getOffsetToLeftOf(2));
+            assertEquals(testLabel, 5, layout.getOffsetToLeftOf(3));
+            assertEquals(testLabel, 3, layout.getOffsetToLeftOf(4));
+            assertEquals(testLabel, 6, layout.getOffsetToLeftOf(5));
+            assertEquals(testLabel, 7, layout.getOffsetToLeftOf(6));
+            assertEquals(testLabel, 7, layout.getOffsetToLeftOf(7));
+
+            assertEquals(testLabel, 0, layout.getOffsetToRightOf(0));
+            assertEquals(testLabel, 0, layout.getOffsetToRightOf(1));
+            assertEquals(testLabel, 1, layout.getOffsetToRightOf(2));
+            assertEquals(testLabel, 4, layout.getOffsetToRightOf(3));
+            assertEquals(testLabel, 2, layout.getOffsetToRightOf(4));
+            assertEquals(testLabel, 3, layout.getOffsetToRightOf(5));
+            assertEquals(testLabel, 5, layout.getOffsetToRightOf(6));
+            assertEquals(testLabel, 6, layout.getOffsetToRightOf(7));
+        }
+    }
 }
diff --git a/tests/tests/text/src/android/text/format/cts/DateFormatTest.java b/tests/tests/text/src/android/text/format/cts/DateFormatTest.java
index 61fa37d..8ca1fea 100644
--- a/tests/tests/text/src/android/text/format/cts/DateFormatTest.java
+++ b/tests/tests/text/src/android/text/format/cts/DateFormatTest.java
@@ -19,19 +19,23 @@
 
 import android.content.ContentResolver;
 import android.content.Context;
+import android.os.ParcelFileDescriptor;
 import android.provider.Settings;
-import android.test.AndroidTestCase;
+import android.test.InstrumentationTestCase;
 import android.text.format.DateFormat;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.io.FileInputStream;
+import java.io.InputStream;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.GregorianCalendar;
 import java.util.Locale;
+import java.util.Scanner;
 import java.util.TimeZone;
 
-public class DateFormatTest extends AndroidTestCase {
+public class DateFormatTest extends InstrumentationTestCase {
 
     private Context mContext;
     private ContentResolver mContentResolver;
@@ -50,12 +54,41 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mContext = getContext();
+        enableAppOps();
+        mContext = getInstrumentation().getContext();
         mContentResolver = mContext.getContentResolver();
         mIs24HourFormat = DateFormat.is24HourFormat(mContext);
         mDefaultLocale = Locale.getDefault();
     }
 
+    private void enableAppOps() {
+        StringBuilder cmd = new StringBuilder();
+        cmd.append("appops set ");
+        cmd.append(getInstrumentation().getContext().getPackageName());
+        cmd.append(" android:write_settings allow");
+        getInstrumentation().getUiAutomation().executeShellCommand(cmd.toString());
+
+        StringBuilder query = new StringBuilder();
+        query.append("appops get ");
+        query.append(getInstrumentation().getContext().getPackageName());
+        query.append(" android:write_settings");
+        String queryStr = query.toString();
+
+        String result = "No operations.";
+        while (result.contains("No operations")) {
+            ParcelFileDescriptor pfd = getInstrumentation().getUiAutomation().executeShellCommand(
+                                        queryStr);
+            InputStream inputStream = new FileInputStream(pfd.getFileDescriptor());
+            result = convertStreamToString(inputStream);
+        }
+    }
+
+    private String convertStreamToString(InputStream is) {
+        try (Scanner scanner = new Scanner(is).useDelimiter("\\A")) {
+            return scanner.hasNext() ? scanner.next() : "";
+        }
+    }
+
     @Override
     protected void tearDown() throws Exception {
         if (!mIs24HourFormat) {
diff --git a/tests/tests/text/src/android/text/format/cts/FormatterTest.java b/tests/tests/text/src/android/text/format/cts/FormatterTest.java
index bf4a684..9c3c45d 100644
--- a/tests/tests/text/src/android/text/format/cts/FormatterTest.java
+++ b/tests/tests/text/src/android/text/format/cts/FormatterTest.java
@@ -32,24 +32,24 @@
         BigDecimal bd = new BigDecimal((long) 1024, mc);
 
         // test different long values with various length
-        assertEquals("0.00B", Formatter.formatFileSize(mContext, 0));
+        assertEquals("0.00 B", Formatter.formatFileSize(mContext, 0));
 
-        assertEquals("899B", Formatter.formatFileSize(mContext, 899));
+        assertEquals("899 B", Formatter.formatFileSize(mContext, 899));
 
-        assertEquals("1.00KB", Formatter.formatFileSize(mContext, bd.pow(1).longValue()));
+        assertEquals("1.00 KB", Formatter.formatFileSize(mContext, bd.pow(1).longValue()));
 
-        assertEquals("1.00MB", Formatter.formatFileSize(mContext, bd.pow(2).longValue()));
+        assertEquals("1.00 MB", Formatter.formatFileSize(mContext, bd.pow(2).longValue()));
 
-        assertEquals("1.00GB", Formatter.formatFileSize(mContext, bd.pow(3).longValue()));
+        assertEquals("1.00 GB", Formatter.formatFileSize(mContext, bd.pow(3).longValue()));
 
-        assertEquals("1.00TB", Formatter.formatFileSize(mContext, bd.pow(4).longValue()));
+        assertEquals("1.00 TB", Formatter.formatFileSize(mContext, bd.pow(4).longValue()));
 
-        assertEquals("1.00PB", Formatter.formatFileSize(mContext, bd.pow(5).longValue()));
+        assertEquals("1.00 PB", Formatter.formatFileSize(mContext, bd.pow(5).longValue()));
 
-        assertEquals("1024PB", Formatter.formatFileSize(mContext, bd.pow(6).longValue()));
+        assertEquals("1024 PB", Formatter.formatFileSize(mContext, bd.pow(6).longValue()));
 
         // test Negative value
-        assertEquals("-1.00B", Formatter.formatFileSize(mContext, -1));
+        assertEquals("-1.00 B", Formatter.formatFileSize(mContext, -1));
     }
 
     public void testFormatIpAddress() {
diff --git a/tests/tests/text/src/android/text/method/cts/BaseKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/BaseKeyListenerTest.java
index 34ed2dc..ba8bad5 100644
--- a/tests/tests/text/src/android/text/method/cts/BaseKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/BaseKeyListenerTest.java
@@ -35,25 +35,92 @@
     private static final CharSequence TEST_STRING = "123456";
 
     public void testBackspace() {
-        final Editable content = Editable.Factory.getInstance().newEditable(TEST_STRING);
+        testBackspace(0);
+    }
+
+    private void testBackspace(int modifiers) {
         final MockBaseKeyListener mockBaseKeyListener = new MockBaseKeyListener();
+        final KeyEvent event = getKey(KeyEvent.KEYCODE_DEL, modifiers);
+        Editable content = Editable.Factory.getInstance().newEditable(TEST_STRING);
 
         // Nothing to delete when the cursor is at the beginning.
-        final KeyEvent delKeyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL);
         prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
-        mockBaseKeyListener.backspace(mTextView, content, KeyEvent.KEYCODE_DEL, delKeyEvent);
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
         assertEquals("123456", content.toString());
 
         // Delete the first three letters using a selection.
         prepTextViewSync(content, mockBaseKeyListener, false, 0, 3);
-        mockBaseKeyListener.backspace(mTextView, content, KeyEvent.KEYCODE_DEL, delKeyEvent);
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
         assertEquals("456", content.toString());
 
-        // Delete the entire line with ALT + DEL
-        final KeyEvent altDelKeyEvent = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN,
-                KeyEvent.KEYCODE_DEL, 0, KeyEvent.META_ALT_ON);
+        // Delete the character prior to the cursor when there's no selection
+        prepTextViewSync(content, mockBaseKeyListener, false, 2, 2);
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
+        assertEquals("46", content.toString());
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
+        assertEquals("6", content.toString());
+
+        // The deletion works on a Logical direction basis in RTL text..
+        String testText = "\u05E9\u05DC\u05D5\u05DD\u002E";
+        content = Editable.Factory.getInstance().newEditable(testText);
+
         prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
-        mockBaseKeyListener.backspace(mTextView, content, KeyEvent.KEYCODE_DEL, altDelKeyEvent);
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
+        assertEquals(testText, content.toString());
+
+        int end = testText.length();
+        prepTextViewSync(content, mockBaseKeyListener, false, end, end);
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
+        assertEquals("\u05E9\u05DC\u05D5\u05DD", content.toString());
+
+        int middle = testText.length() / 2;
+        prepTextViewSync(content, mockBaseKeyListener, false, middle, middle);
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
+        assertEquals("\u05E9\u05D5\u05DD", content.toString());
+
+        // And in BiDi text
+        testText = "\u05D6\u05D4\u0020Android\u0020\u05E2\u05D5\u05D1\u05D3";
+        content = Editable.Factory.getInstance().newEditable(testText);
+
+        prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
+        assertEquals(content.toString(), content.toString());
+
+        end = testText.length();
+        prepTextViewSync(content, mockBaseKeyListener, false, end, end);
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
+        assertEquals("\u05D6\u05D4\u0020Android\u0020\u05E2\u05D5\u05D1", content.toString());
+
+        prepTextViewSync(content, mockBaseKeyListener, false, 6, 6);
+        mockBaseKeyListener.backspace(mTextView, content, event.getKeyCode(), event);
+        assertEquals("\u05D6\u05D4\u0020Anroid\u0020\u05E2\u05D5\u05D1", content.toString());
+    }
+
+    public void testBackspace_withShift() {
+        testBackspace(KeyEvent.META_SHIFT_ON | KeyEvent.META_SHIFT_LEFT_ON);
+    }
+
+    public void testBackspace_withAlt() {
+        final MockBaseKeyListener mockBaseKeyListener = new MockBaseKeyListener();
+        Editable content = Editable.Factory.getInstance().newEditable(TEST_STRING);
+
+        // Delete the entire line with ALT + DEL, even if we're at the head...
+        prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
+        executeAltBackspace(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+
+        // ...or the tail...
+        content = Editable.Factory.getInstance().newEditable(TEST_STRING);
+        final int end = TEST_STRING.length();
+        prepTextViewSync(content, mockBaseKeyListener, false, end, end);
+        executeAltBackspace(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+
+        // ...or somewhere in the middle.
+        content = Editable.Factory.getInstance().newEditable(TEST_STRING);
+        final int middle = end / 2;
+        prepTextViewSync(content, mockBaseKeyListener, false, middle, middle);
+        executeAltBackspace(content, mockBaseKeyListener);
         assertEquals("", content.toString());
     }
 
@@ -86,6 +153,341 @@
         assertEquals(TEST_STRING, mTextView.getText().toString());
     }
 
+    private void assertCursorPosition(Editable content, int offset) {
+        assertEquals(offset, Selection.getSelectionStart(content));
+        assertEquals(offset, Selection.getSelectionEnd(content));
+    }
+
+    public void testBackspace_withCtrl() {
+        final MockBaseKeyListener mockBaseKeyListener = new MockBaseKeyListener();
+
+        // If the contents only having symbolic characters, delete all characters.
+        String testText = "!#$%&'()`{*}_?+";
+        Editable content = Editable.Factory.getInstance().newEditable(testText);
+        prepTextViewSync(content, mockBaseKeyListener, false, testText.length(), testText.length());
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        // Latin ASCII text
+        testText = "Hello, World. This is Android.";
+        content = Editable.Factory.getInstance().newEditable(testText);
+
+        // If the cursor is head of the text, should do nothing.
+        prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("Hello, World. This is Android.", content.toString());
+        assertCursorPosition(content, 0);
+
+        prepTextViewSync(content, mockBaseKeyListener, false, testText.length(), testText.length());
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("Hello, World. This is ", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("Hello, World. This ", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("Hello, World. ", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("Hello, ", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        // Latin ASCII, cursor is middle of the text.
+        testText = "Hello, World. This is Android.";
+        content = Editable.Factory.getInstance().newEditable(testText);
+        int charsFromTail = 12;  // Cursor location is 12 chars from the tail.(before "is").
+        prepTextViewSync(content, mockBaseKeyListener, false,
+                         testText.length() - charsFromTail, testText.length() - charsFromTail);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("Hello, World.  is Android.", content.toString());
+        assertCursorPosition(content, content.toString().length() - charsFromTail);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("Hello,  is Android.", content.toString());
+        assertCursorPosition(content, content.toString().length() - charsFromTail);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals(" is Android.", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals(" is Android.", content.toString());
+        assertCursorPosition(content, 0);
+
+        // Latin ASCII, cursor is inside word.
+        testText = "Hello, World. This is Android.";
+        content = Editable.Factory.getInstance().newEditable(testText);
+        charsFromTail = 14;  // Cursor location is 12 chars from the tail. (inside "This")
+        prepTextViewSync(content, mockBaseKeyListener, false,
+                         testText.length() - charsFromTail, testText.length() - charsFromTail);
+
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("Hello, World. is is Android.", content.toString());
+        assertCursorPosition(content, content.toString().length() - charsFromTail);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("Hello, is is Android.", content.toString());
+        assertCursorPosition(content, content.toString().length() - charsFromTail);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("is is Android.", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("is is Android.", content.toString());
+        assertCursorPosition(content, 0);
+
+        // Hebrew Text
+        // The deletion works on a Logical direction basis.
+        testText = "\u05E9\u05DC\u05D5\u05DD\u0020\u05D4\u05E2\u05D5\u05DC\u05DD\u002E\u0020" +
+                   "\u05D6\u05D4\u0020\u05D0\u05E0\u05D3\u05E8\u05D5\u05D0\u05D9\u05D3\u002E";
+        content = Editable.Factory.getInstance().newEditable(testText);
+        prepTextViewSync(content, mockBaseKeyListener, false, testText.length(), testText.length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("\u05E9\u05DC\u05D5\u05DD\u0020\u05D4\u05E2\u05D5\u05DC\u05DD\u002E\u0020" +
+                     "\u05D6\u05D4\u0020", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("\u05E9\u05DC\u05D5\u05DD\u0020\u05D4\u05E2\u05D5\u05DC\u05DD\u002E\u0020",
+                     content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("\u05E9\u05DC\u05D5\u05DD\u0020", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        // BiDi Text
+        // The deletion works on a Logical direction basis.
+        testText = "\u05D6\u05D4\u0020\u05DC\u002D\u0020\u0041Android\u0020\u05E2\u05D5\u05D1" +
+                   "\u05D3\u0020\u05D4\u05D9\u05D8\u05D1\u002E";
+        content = Editable.Factory.getInstance().newEditable(testText);
+        prepTextViewSync(content, mockBaseKeyListener, false, testText.length(), testText.length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("\u05D6\u05D4\u0020\u05DC\u002D\u0020\u0041Android\u0020\u05E2\u05D5\u05D1" +
+                     "\u05D3\u0020", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("\u05D6\u05D4\u0020\u05DC\u002D\u0020\u0041Android\u0020", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("\u05D6\u05D4\u0020\u05DC\u002D\u0020", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("\u05D6\u05D4\u0020", content.toString());
+        assertCursorPosition(content, content.toString().length());
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlBackspace(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+    }
+
+    public void testForwardDelete_withCtrl() {
+        final MockBaseKeyListener mockBaseKeyListener = new MockBaseKeyListener();
+
+        // If the contents only having symbolic characters, delete all characters.
+        String testText = "!#$%&'()`{*}_?+";
+        Editable content = Editable.Factory.getInstance().newEditable(testText);
+        prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        // Latin ASCII text
+        testText = "Hello, World. This is Android.";
+        content = Editable.Factory.getInstance().newEditable(testText);
+
+        // If the cursor is tail of the text, should do nothing.
+        prepTextViewSync(content, mockBaseKeyListener, false, testText.length(), testText.length());
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World. This is Android.", content.toString());
+        assertCursorPosition(content, testText.length());
+
+        prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals(", World. This is Android.", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals(". This is Android.", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals(" is Android.", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals(" Android.", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals(".", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        // Latin ASCII, cursor is middle of the text.
+        testText = "Hello, World. This is Android.";
+        content = Editable.Factory.getInstance().newEditable(testText);
+        int charsFromHead = 14;  // Cursor location is 14 chars from the head.(before "This").
+        prepTextViewSync(content, mockBaseKeyListener, false, charsFromHead, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World.  is Android.", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World.  Android.", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World. .", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World. ", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World. ", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        // Latin ASCII, cursor is inside word.
+        testText = "Hello, World. This is Android.";
+        content = Editable.Factory.getInstance().newEditable(testText);
+        charsFromHead = 16;  // Cursor location is 16 chars from the head. (inside "This")
+        prepTextViewSync(content, mockBaseKeyListener, false, charsFromHead, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World. Th is Android.", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World. Th Android.", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World. Th.", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World. Th", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("Hello, World. Th", content.toString());
+        assertCursorPosition(content, charsFromHead);
+
+        // Hebrew Text
+        // The deletion works on a Logical direction basis.
+        testText = "\u05E9\u05DC\u05D5\u05DD\u0020\u05D4\u05E2\u05D5\u05DC\u05DD\u002E\u0020" +
+                   "\u05D6\u05D4\u0020\u05D0\u05E0\u05D3\u05E8\u05D5\u05D0\u05D9\u05D3\u002E";
+        content = Editable.Factory.getInstance().newEditable(testText);
+        prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("\u0020\u05D4\u05E2\u05D5\u05DC\u05DD\u002E\u0020\u05D6\u05D4\u0020\u05D0" +
+                     "\u05E0\u05D3\u05E8\u05D5\u05D0\u05D9\u05D3\u002E", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("\u002E\u0020\u05D6\u05D4\u0020\u05D0\u05E0\u05D3\u05E8\u05D5\u05D0\u05D9" +
+                "\u05D3\u002E", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("\u0020\u05D0\u05E0\u05D3\u05E8\u05D5\u05D0\u05D9\u05D3\u002E",
+                     content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("\u002E", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        // BiDi Text
+        // The deletion works on a Logical direction basis.
+        testText = "\u05D6\u05D4\u0020\u05DC\u002D\u0020\u0041Android\u0020\u05E2\u05D5\u05D1" +
+                   "\u05D3\u0020\u05D4\u05D9\u05D8\u05D1\u002E";
+        content = Editable.Factory.getInstance().newEditable(testText);
+        prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("\u0020\u05DC\u002D\u0020\u0041Android\u0020\u05E2\u05D5\u05D1\u05D3\u0020" +
+                     "\u05D4\u05D9\u05D8\u05D1\u002E", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("\u002D\u0020\u0041Android\u0020\u05E2\u05D5\u05D1\u05D3\u0020\u05D4\u05D9" +
+                     "\u05D8\u05D1\u002E", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("\u0020\u05E2\u05D5\u05D1\u05D3\u0020\u05D4\u05D9\u05D8\u05D1\u002E",
+                     content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("\u0020\u05D4\u05D9\u05D8\u05D1\u002E", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("\u002E", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+
+        executeCtrlForwardDelete(content, mockBaseKeyListener);
+        assertEquals("", content.toString());
+        assertCursorPosition(content, 0);
+    }
+
     /*
      * Check point:
      * 1. Press 0 key, the content of TextView does not changed.
@@ -115,6 +517,35 @@
 //        assertEquals("13abcd456", mTextView.getText().toString());
     }
 
+    private void executeAltBackspace(Editable content, MockBaseKeyListener listener) {
+        final KeyEvent delKeyEvent = getKey(KeyEvent.KEYCODE_DEL,
+                KeyEvent.META_ALT_ON | KeyEvent.META_ALT_LEFT_ON);
+        listener.backspace(mTextView, content, KeyEvent.KEYCODE_DEL, delKeyEvent);
+    }
+
+    private void executeCtrlBackspace(Editable content, MockBaseKeyListener listener) {
+        final KeyEvent delKeyEvent = getKey(KeyEvent.KEYCODE_DEL,
+                KeyEvent.META_CTRL_ON | KeyEvent.META_CTRL_LEFT_ON);
+        listener.backspace(mTextView, content, KeyEvent.KEYCODE_DEL, delKeyEvent);
+    }
+
+    private void executeCtrlForwardDelete(Editable content, MockBaseKeyListener listener) {
+        final KeyEvent delKeyEvent = getKey(KeyEvent.KEYCODE_FORWARD_DEL,
+                KeyEvent.META_CTRL_ON | KeyEvent.META_CTRL_LEFT_ON);
+        listener.forwardDelete(mTextView, content, KeyEvent.KEYCODE_FORWARD_DEL, delKeyEvent);
+    }
+
+    private KeyEvent getKey(int keycode, int metaState) {
+        long currentTime = System.currentTimeMillis();
+        return new KeyEvent(
+                currentTime,
+                currentTime,
+                KeyEvent.ACTION_DOWN,
+                keycode,
+                0 /* repeat */,
+                metaState);
+    }
+
     /**
      * Prepares mTextView state for tests by synchronously setting the content and key listener, on
      * the UI thread.
diff --git a/tests/tests/transition/Android.mk b/tests/tests/transition/Android.mk
new file mode 100644
index 0000000..3b48e25
--- /dev/null
+++ b/tests/tests/transition/Android.mk
@@ -0,0 +1,33 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_PACKAGE_NAME := CtsTransitionTestCases
+
+# Don't include this package in any target.
+LOCAL_MODULE_TAGS := optional
+
+# When built, explicitly put it in the data partition.
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/transition/AndroidManifest.xml b/tests/tests/transition/AndroidManifest.xml
new file mode 100644
index 0000000..0ce1791
--- /dev/null
+++ b/tests/tests/transition/AndroidManifest.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.transition">
+    <uses-sdk android:minSdkVersion="11" />
+    <uses-permission android:name="android.permission.INJECT_EVENTS" />
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <application>
+        <activity android:name="android.transition.cts.TransitionActivity"
+            android:label="TransitionActivity"/>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="com.android.cts.transition"
+                     android:label="CTS tests for android.transition package">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+</manifest>
+
diff --git a/tests/tests/transition/res/layout/scene1.xml b/tests/tests/transition/res/layout/scene1.xml
new file mode 100644
index 0000000..140bb8d
--- /dev/null
+++ b/tests/tests/transition/res/layout/scene1.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:transitionName="holder"
+                android:id="@+id/holder">
+    <View android:layout_width="10dp"
+          android:layout_height="10dp"
+          android:background="#F00"
+          android:transitionName="red"
+          android:id="@+id/redSquare" />
+    <View android:layout_width="10dp"
+          android:layout_height="10dp"
+          android:background="#0F0"
+          android:transitionName="green"
+          android:id="@+id/greenSquare"
+          android:layout_below="@+id/redSquare" />
+    <TextView android:layout_width="wrap_content"
+              android:layout_height="wrap_content"
+              android:transitionName="hello"
+              android:text="@string/hello"
+              android:id="@+id/hello"/>
+</RelativeLayout>
diff --git a/tests/tests/transition/res/layout/scene2.xml b/tests/tests/transition/res/layout/scene2.xml
new file mode 100644
index 0000000..541ec04
--- /dev/null
+++ b/tests/tests/transition/res/layout/scene2.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:transitionName="holder"
+                android:id="@+id/holder">
+    <View android:layout_width="10dp"
+          android:layout_height="10dp"
+          android:background="#0F0"
+          android:transitionName="green"
+          android:id="@+id/greenSquare" />
+    <View android:layout_width="10dp"
+          android:layout_height="10dp"
+          android:background="#F00"
+          android:transitionName="red"
+          android:id="@+id/redSquare"
+          android:layout_below="@+id/greenSquare" />
+    <TextView android:layout_width="wrap_content"
+              android:layout_height="wrap_content"
+              android:text="@string/world"
+              android:id="@+id/world"/>
+</RelativeLayout>
diff --git a/tests/tests/transition/res/layout/scene3.xml b/tests/tests/transition/res/layout/scene3.xml
new file mode 100644
index 0000000..01fb78d
--- /dev/null
+++ b/tests/tests/transition/res/layout/scene3.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:id="@+id/holder">
+    <View android:layout_width="10dp"
+          android:layout_height="10dp"
+          android:background="#0F0"
+          android:id="@+id/greenSquare" />
+    <View android:layout_width="10dp"
+          android:layout_height="10dp"
+          android:background="#F00"
+          android:id="@+id/redSquare"
+          android:layout_toRightOf="@+id/greenSquare" />
+</RelativeLayout>
diff --git a/tests/tests/transition/res/layout/scene4.xml b/tests/tests/transition/res/layout/scene4.xml
new file mode 100644
index 0000000..1f1b7d6
--- /dev/null
+++ b/tests/tests/transition/res/layout/scene4.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:transitionName="holder"
+                android:id="@+id/holder"/>
diff --git a/tests/tests/transition/res/layout/scene5.xml b/tests/tests/transition/res/layout/scene5.xml
new file mode 100644
index 0000000..f7385f8
--- /dev/null
+++ b/tests/tests/transition/res/layout/scene5.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:transitionName="holder"
+                android:id="@+id/holder">
+    <TextView
+            android:id="@+id/text"
+            android:text="@string/longText"
+            android:layout_width="100dp"
+            android:layout_height="100dp"/>
+</RelativeLayout>
diff --git a/tests/tests/transition/res/layout/transition_main.xml b/tests/tests/transition/res/layout/transition_main.xml
new file mode 100644
index 0000000..64de7dd
--- /dev/null
+++ b/tests/tests/transition/res/layout/transition_main.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+             android:layout_width="match_parent"
+             android:layout_height="match_parent"
+             android:id="@+id/container"/>
diff --git a/tests/tests/transition/res/values/strings.xml b/tests/tests/transition/res/values/strings.xml
new file mode 100644
index 0000000..43b92a5
--- /dev/null
+++ b/tests/tests/transition/res/values/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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>
+    <string name="add_button">Add Button</string>
+    <string name="hello">Hello</string>
+    <string name="world">World</string>
+    <string name="longText">Gummi bears sugar plum pudding. Carrot cake chupa chups lollipop brownie candy canes carrot cake. Chocolate cake dragée chocolate danish halvah brownie. Cake jelly-o danish jelly beans carrot cake toffee jelly-o. Danish sesame snaps soufflé chocolate cupcake jujubes pudding pudding candy canes. Sesame snaps sweet chupa chups marzipan tart. Dessert brownie marzipan powder. Biscuit sugar plum soufflé topping cheesecake. Jelly-o ice cream candy canes tart. Brownie ice cream cake. Chocolate bar cake tart powder. Cookie candy canes marzipan donut jelly beans cheesecake marzipan. Carrot cake dragée cupcake liquorice tiramisu chocolate cake powder macaroon. Liquorice sugar plum powder dessert jelly.</string>
+</resources>
diff --git a/tests/tests/transition/src/android/transition/cts/BaseTransitionTest.java b/tests/tests/transition/src/android/transition/cts/BaseTransitionTest.java
new file mode 100644
index 0000000..df1ba19
--- /dev/null
+++ b/tests/tests/transition/src/android/transition/cts/BaseTransitionTest.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2015 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.transition.cts;
+
+import com.android.cts.transition.R;
+
+import android.animation.Animator;
+import android.animation.ObjectAnimator;
+import android.os.SystemClock;
+import android.test.ActivityInstrumentationTestCase2;
+import android.transition.Scene;
+import android.transition.TransitionManager;
+import android.transition.TransitionValues;
+import android.transition.Visibility;
+import android.view.Choreographer;
+import android.view.Choreographer.FrameCallback;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+import java.util.ArrayList;
+
+public class BaseTransitionTest extends ActivityInstrumentationTestCase2<TransitionActivity> {
+    protected TransitionActivity mActivity;
+    protected FrameLayout mSceneRoot;
+    public float mAnimatedValue;
+    protected ArrayList<View> mTargets = new ArrayList<>();
+    protected TestTransition mTransition;
+
+    public BaseTransitionTest() {
+        super(TransitionActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        setActivityInitialTouchMode(false);
+        mActivity = getActivity();
+        mSceneRoot = (FrameLayout) mActivity.findViewById(R.id.container);
+        mTargets.clear();
+        mTransition = new TestTransition();
+    }
+
+    protected void waitForStart() throws InterruptedException {
+        waitForStart(mTransition.listener);
+    }
+
+    protected static void waitForStart(SimpleTransitionListener listener) throws InterruptedException {
+        long endTime = SystemClock.uptimeMillis() + 50;
+        synchronized (listener) {
+            while (!listener.started) {
+                long now = SystemClock.uptimeMillis();
+                long waitTime = endTime - now;
+                if (waitTime <= 0) {
+                    throw new InterruptedException();
+                }
+                listener.wait(waitTime);
+            }
+        }
+    }
+
+    protected void waitForEnd(long waitMillis) throws InterruptedException {
+        waitForEnd(mTransition.listener, waitMillis);
+    }
+
+    protected static void waitForEnd(SimpleTransitionListener listener, long waitMillis)
+            throws InterruptedException {
+        long endTime = SystemClock.uptimeMillis() + waitMillis;
+        synchronized (listener) {
+            while (!listener.ended) {
+                long now = SystemClock.uptimeMillis();
+                long waitTime = endTime - now;
+                if (waitTime <= 0) {
+                    throw new InterruptedException();
+                }
+                listener.wait(waitTime);
+            }
+        }
+    }
+
+    protected void startTransition(final int layoutId) throws Throwable {
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                Scene scene = Scene.getSceneForLayout(mSceneRoot, layoutId, mActivity);
+                TransitionManager.go(scene, mTransition);
+            }
+        });
+        waitForStart();
+    }
+
+    protected void endTransition() throws Throwable {
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                TransitionManager.endTransitions(mSceneRoot);
+            }
+        });
+    }
+
+    protected void enterScene(final int layoutId) throws Throwable {
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                Scene scene = Scene.getSceneForLayout(mSceneRoot, layoutId, mActivity);
+                scene.enter();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+    }
+
+    // Waits at least one frame and it could be more. The animated values should have changed
+    // from the previously recorded values by the end of this method.
+    protected void waitForAnimationFrame() throws Throwable {
+        final boolean[] tripped = new boolean[] { false };
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                Choreographer.getInstance().postFrameCallbackDelayed(new FrameCallback() {
+                    @Override
+                    public void doFrame(long frameTimeNanos) {
+                        synchronized (tripped) {
+                            tripped[0] = true;
+                            tripped.notifyAll();
+                        }
+                    }
+                }, 16); // make sure it is the next animation frame.
+            }
+        });
+        synchronized (tripped) {
+            long endTime = SystemClock.uptimeMillis() + 60;
+            while (!tripped[0]) {
+                long waitTime = endTime - SystemClock.uptimeMillis();
+                if (waitTime <= 0) {
+                    throw new InterruptedException();
+                }
+                tripped.wait(waitTime);
+            }
+        }
+    }
+
+    public class TestTransition extends Visibility {
+        public final SimpleTransitionListener listener = new SimpleTransitionListener();
+
+        public TestTransition() {
+            addListener(listener);
+            setDuration(100);
+        }
+
+        @Override
+        public Animator onAppear(ViewGroup sceneRoot, View view, TransitionValues startValues,
+                TransitionValues endValues) {
+            mTargets.add(endValues.view);
+            return ObjectAnimator.ofFloat(BaseTransitionTest.this, "mAnimatedValue", 0, 1);
+        }
+
+        @Override
+        public Animator onDisappear(ViewGroup sceneRoot, View view, TransitionValues startValues,
+                TransitionValues endValues) {
+            mTargets.add(startValues.view);
+            return ObjectAnimator.ofFloat(BaseTransitionTest.this, "mAnimatedValue", 1, 0);
+        }
+    }
+}
diff --git a/tests/tests/transition/src/android/transition/cts/ChangeScrollTest.java b/tests/tests/transition/src/android/transition/cts/ChangeScrollTest.java
new file mode 100644
index 0000000..f5f076d
--- /dev/null
+++ b/tests/tests/transition/src/android/transition/cts/ChangeScrollTest.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2015 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.transition.cts;
+
+import com.android.cts.transition.R;
+
+import android.transition.ChangeScroll;
+import android.transition.Transition;
+import android.transition.TransitionManager;
+import android.view.View;
+
+public class ChangeScrollTest extends BaseTransitionTest {
+
+    public ChangeScrollTest() {
+    }
+
+    public void testChangeScroll() throws Throwable {
+        enterScene(R.layout.scene5);
+        final Transition transition = new ChangeScroll();
+        transition.setDuration(100);
+        SimpleTransitionListener listener = new SimpleTransitionListener();
+        transition.addListener(listener);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                final View view = mActivity.findViewById(R.id.text);
+                final int scrollX = view.getScrollX();
+                final int scrollY = view.getScrollY();
+                assertEquals(0, scrollX);
+                assertEquals(0, scrollY);
+                TransitionManager.beginDelayedTransition(mSceneRoot, transition);
+                view.scrollTo(150, 300);
+            }
+        });
+        waitForStart(listener);
+        waitForAnimationFrame();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                final View view = mActivity.findViewById(R.id.text);
+                final int scrollX = view.getScrollX();
+                final int scrollY = view.getScrollY();
+                assertTrue(scrollX > 0);
+                assertTrue(scrollX < 150);
+                assertTrue(scrollY > 0);
+                assertTrue(scrollY < 300);
+            }
+        });
+        waitForEnd(listener, 100);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                final View view = mActivity.findViewById(R.id.text);
+                final int scrollX = view.getScrollX();
+                final int scrollY = view.getScrollY();
+                assertEquals(150, scrollX);
+                assertEquals(300, scrollY);
+            }
+        });
+    }
+}
+
diff --git a/tests/tests/transition/src/android/transition/cts/SimpleTransitionListener.java b/tests/tests/transition/src/android/transition/cts/SimpleTransitionListener.java
new file mode 100644
index 0000000..113f5a5
--- /dev/null
+++ b/tests/tests/transition/src/android/transition/cts/SimpleTransitionListener.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2015 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.transition.cts;
+
+import android.transition.Transition;
+import android.transition.Transition.TransitionListener;
+
+/**
+ * Listener captures whether each of the methods is called.
+ */
+class SimpleTransitionListener implements TransitionListener {
+    public Transition transition;
+
+    public boolean started;
+
+    public boolean ended;
+
+    public boolean canceled;
+
+    public boolean paused;
+
+    public boolean resumed;
+
+    @Override
+    public synchronized void onTransitionStart(Transition transition) {
+        started = true;
+        this.transition = transition;
+        notifyAll();
+    }
+
+    @Override
+    public synchronized void onTransitionEnd(Transition transition) {
+        ended = true;
+        notifyAll();
+    }
+
+    @Override
+    public synchronized void onTransitionCancel(Transition transition) {
+        canceled = true;
+        notifyAll();
+    }
+
+    @Override
+    public synchronized void onTransitionPause(Transition transition) {
+        paused = true;
+        notifyAll();
+    }
+
+    @Override
+    public synchronized void onTransitionResume(Transition transition) {
+        resumed = true;
+        notifyAll();
+    }
+}
diff --git a/tests/tests/transition/src/android/transition/cts/TransitionActivity.java b/tests/tests/transition/src/android/transition/cts/TransitionActivity.java
new file mode 100644
index 0000000..8236bd5
--- /dev/null
+++ b/tests/tests/transition/src/android/transition/cts/TransitionActivity.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2015 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.transition.cts;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.RadialGradient;
+import android.graphics.Shader;
+import android.graphics.drawable.ShapeDrawable;
+import android.graphics.drawable.shapes.OvalShape;
+import android.os.Bundle;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import java.util.ArrayList;
+
+import com.android.cts.transition.R;
+
+public class TransitionActivity extends Activity {
+    @Override
+    public void onCreate(Bundle bundle){
+        super.onCreate(bundle);
+        setContentView(R.layout.transition_main);
+    }
+}
+
diff --git a/tests/tests/transition/src/android/transition/cts/TransitionManagerTest.java b/tests/tests/transition/src/android/transition/cts/TransitionManagerTest.java
new file mode 100644
index 0000000..78db908
--- /dev/null
+++ b/tests/tests/transition/src/android/transition/cts/TransitionManagerTest.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2015 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.transition.cts;
+
+import com.android.cts.transition.R;
+
+import android.transition.Scene;
+import android.transition.TransitionManager;
+import android.view.View;
+
+public class TransitionManagerTest extends BaseTransitionTest {
+
+    public TransitionManagerTest() {
+    }
+
+    public void testBeginDelayedTransition() throws Throwable {
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                TransitionManager.beginDelayedTransition(mSceneRoot, mTransition);
+                View view = mActivity.getLayoutInflater().inflate(R.layout.scene1, mSceneRoot,
+                        false);
+                mSceneRoot.addView(view);
+            }
+        });
+
+        waitForStart();
+        waitForEnd(150);
+        assertFalse(mTransition.listener.resumed);
+        assertFalse(mTransition.listener.paused);
+        assertFalse(mTransition.listener.canceled);
+        assertNotNull(mTransition.listener.transition);
+        assertEquals(TestTransition.class, mTransition.listener.transition.getClass());
+        assertTrue(mTransition != mTransition.listener.transition);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                assertNotNull(mActivity.findViewById(R.id.redSquare));
+                assertNotNull(mActivity.findViewById(R.id.greenSquare));
+            }
+        });
+    }
+
+    public void testGo() throws Throwable {
+        startTransition(R.layout.scene1);
+        waitForStart();
+        waitForEnd(150);
+
+        assertFalse(mTransition.listener.resumed);
+        assertFalse(mTransition.listener.paused);
+        assertFalse(mTransition.listener.canceled);
+        assertNotNull(mTransition.listener.transition);
+        assertEquals(TestTransition.class, mTransition.listener.transition.getClass());
+        assertTrue(mTransition != mTransition.listener.transition);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                assertNotNull(mActivity.findViewById(R.id.redSquare));
+                assertNotNull(mActivity.findViewById(R.id.greenSquare));
+            }
+        });
+    }
+
+    public void testSetTransition1() throws Throwable {
+        final TransitionManager transitionManager = new TransitionManager();
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                Scene scene = Scene.getSceneForLayout(mSceneRoot, R.layout.scene1, mActivity);
+                transitionManager.setTransition(scene, mTransition);
+                transitionManager.transitionTo(scene);
+            }
+        });
+
+        waitForStart();
+        waitForEnd(150);
+        assertFalse(mTransition.listener.resumed);
+        assertFalse(mTransition.listener.paused);
+        assertFalse(mTransition.listener.canceled);
+        assertNotNull(mTransition.listener.transition);
+        assertEquals(TestTransition.class, mTransition.listener.transition.getClass());
+        assertTrue(mTransition != mTransition.listener.transition);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                assertNotNull(mActivity.findViewById(R.id.redSquare));
+                assertNotNull(mActivity.findViewById(R.id.greenSquare));
+                mTransition.listener.started = false;
+                mTransition.listener.ended = false;
+                Scene scene = Scene.getSceneForLayout(mSceneRoot, R.layout.scene2, mActivity);
+                transitionManager.transitionTo(scene);
+            }
+        });
+        Thread.sleep(50);
+        assertFalse(mTransition.listener.started);
+        endTransition();
+    }
+
+    public void testSetTransition2() throws Throwable {
+        final TransitionManager transitionManager = new TransitionManager();
+        final Scene[] scenes = new Scene[3];
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                scenes[0] = Scene.getSceneForLayout(mSceneRoot, R.layout.scene1, mActivity);
+                scenes[1] = Scene.getSceneForLayout(mSceneRoot, R.layout.scene2, mActivity);
+                scenes[2] = Scene.getSceneForLayout(mSceneRoot, R.layout.scene3, mActivity);
+                transitionManager.setTransition(scenes[0], scenes[1], mTransition);
+                transitionManager.transitionTo(scenes[0]);
+            }
+        });
+        Thread.sleep(50);
+        assertFalse(mTransition.listener.started);
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                transitionManager.transitionTo(scenes[1]);
+            }
+        });
+
+        waitForStart();
+        waitForEnd(150);
+        assertFalse(mTransition.listener.resumed);
+        assertFalse(mTransition.listener.paused);
+        assertFalse(mTransition.listener.canceled);
+        assertNotNull(mTransition.listener.transition);
+        assertEquals(TestTransition.class, mTransition.listener.transition.getClass());
+        assertTrue(mTransition != mTransition.listener.transition);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mTransition.listener.started = false;
+                mTransition.listener.ended = false;
+                transitionManager.transitionTo(scenes[2]);
+            }
+        });
+        Thread.sleep(50);
+        assertFalse(mTransition.listener.started);
+        endTransition();
+    }
+
+    public void testEndTransitions() throws Throwable {
+        mTransition.setDuration(400);
+
+        startTransition(R.layout.scene1);
+        waitForStart();
+        endTransition();
+        waitForEnd(50);
+    }
+
+    public void testEndTransitionsBeforeStarted() throws Throwable {
+        mTransition.setDuration(400);
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                Scene scene = Scene.getSceneForLayout(mSceneRoot, R.layout.scene1, mActivity);
+                TransitionManager.go(scene, mTransition);
+                TransitionManager.endTransitions(mSceneRoot);
+            }
+        });
+        Thread.sleep(50);
+        assertFalse(mTransition.listener.started);
+        assertFalse(mTransition.listener.ended);
+    }
+}
+
diff --git a/tests/tests/transition/src/android/transition/cts/TransitionTest.java b/tests/tests/transition/src/android/transition/cts/TransitionTest.java
new file mode 100644
index 0000000..8a9f3a3
--- /dev/null
+++ b/tests/tests/transition/src/android/transition/cts/TransitionTest.java
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2015 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.transition.cts;
+
+import com.android.cts.transition.R;
+
+import android.animation.ObjectAnimator;
+import android.transition.AutoTransition;
+import android.transition.Scene;
+import android.transition.TransitionManager;
+import android.transition.TransitionValues;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+public class TransitionTest extends BaseTransitionTest {
+
+    public TransitionTest() {
+    }
+
+    public void testAddListener() throws Throwable {
+        startTransition(R.layout.scene1);
+        waitForStart();
+
+        final SimpleTransitionListener listener2 = new SimpleTransitionListener();
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                AutoTransition autoTransition = new AutoTransition();
+                autoTransition.setDuration(100);
+                autoTransition.addListener(listener2);
+                Scene scene = Scene.getSceneForLayout(mSceneRoot, R.layout.scene2, mActivity);
+                TransitionManager.go(scene, autoTransition);
+            }
+        });
+
+        waitForStart(listener2);
+
+        assertTrue(mTransition.listener.paused);
+        assertTrue(mTransition.listener.resumed);
+        assertFalse(mTransition.listener.canceled);
+        assertFalse(mTransition.listener.ended);
+        assertTrue(mTransition.listener.started);
+
+        assertFalse(listener2.paused);
+        assertFalse(listener2.resumed);
+        assertFalse(listener2.canceled);
+        assertFalse(listener2.ended);
+        assertTrue(listener2.started);
+        endTransition();
+    }
+
+    public void testRemoveListener() throws Throwable {
+        startTransition(R.layout.scene1);
+        waitForStart();
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mTransition.removeListener(mTransition.listener);
+            }
+        });
+
+        Thread.sleep(150);
+        assertFalse(mTransition.listener.ended);
+    }
+
+    public void testAddTargetId() throws Throwable {
+        enterScene(R.layout.scene4);
+        mTransition.addTarget(R.id.holder);
+        mTransition.addTarget(R.id.hello);
+        assertEquals(2, mTransition.getTargetIds().size());
+        startTransition(R.layout.scene1);
+        assertEquals(1, mTargets.size());
+        assertEquals(R.id.hello, mTargets.get(0).getId());
+        endTransition();
+    }
+
+    public void testRemoveTargetId() throws Throwable {
+        enterScene(R.layout.scene4);
+        mTransition.addTarget(R.id.holder);
+        mTransition.addTarget(R.id.hello);
+        mTransition.addTarget(R.id.redSquare);
+        assertEquals(3, mTransition.getTargetIds().size());
+        mTransition.removeTarget(0); // nothing should happen
+        mTransition.removeTarget(R.id.redSquare);
+        assertEquals(2, mTransition.getTargetIds().size());
+
+        startTransition(R.layout.scene1);
+        assertEquals(1, mTargets.size());
+        assertEquals(R.id.hello, mTargets.get(0).getId());
+        endTransition();
+    }
+
+    public void testAddTargetClass() throws Throwable {
+        enterScene(R.layout.scene4);
+        mTransition.addTarget(RelativeLayout.class);
+        mTransition.addTarget(TextView.class);
+        assertEquals(2, mTransition.getTargetTypes().size());
+        startTransition(R.layout.scene1);
+        assertEquals(1, mTargets.size());
+        assertTrue(mTargets.get(0) instanceof TextView);
+        endTransition();
+    }
+
+    public void testRemoveTargetClass() throws Throwable {
+        enterScene(R.layout.scene4);
+        mTransition.addTarget(TextView.class);
+        mTransition.addTarget(View.class);
+        mTransition.addTarget(RelativeLayout.class);
+        assertEquals(3, mTransition.getTargetTypes().size());
+        mTransition.removeTarget(ImageView.class); // should do nothing
+        mTransition.removeTarget(View.class);
+        assertEquals(2, mTransition.getTargetTypes().size());
+        startTransition(R.layout.scene1);
+        assertEquals(1, mTargets.size());
+        assertTrue(mTargets.get(0) instanceof TextView);
+        endTransition();
+    }
+
+    public void testAddTargetView() throws Throwable {
+        enterScene(R.layout.scene1);
+
+        final View[] target = new View[1];
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                target[0] = mActivity.findViewById(R.id.hello);
+            }
+        });
+        mTransition.addTarget(target[0]);
+        assertEquals(1, mTransition.getTargets().size());
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                TransitionManager.beginDelayedTransition(mSceneRoot, mTransition);
+                target[0].setVisibility(View.GONE);
+            }
+        });
+        waitForStart();
+        assertEquals(1, mTargets.size());
+        assertEquals(target[0], mTargets.get(0));
+        endTransition();
+    }
+
+    public void testRemoveTargetView() throws Throwable {
+        enterScene(R.layout.scene1);
+
+        final View[] target = new View[3];
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                target[0] = mActivity.findViewById(R.id.hello);
+                target[1] = mActivity.findViewById(R.id.greenSquare);
+                target[2] = mActivity.findViewById(R.id.redSquare);
+            }
+        });
+
+        mTransition.addTarget(target[0]);
+        mTransition.addTarget(target[1]);
+        assertEquals(2, mTransition.getTargets().size());
+        mTransition.removeTarget(target[2]); // should do nothing
+        mTransition.removeTarget(target[1]);
+        assertEquals(1, mTransition.getTargets().size());
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                TransitionManager.beginDelayedTransition(mSceneRoot, mTransition);
+                target[0].setVisibility(View.GONE);
+            }
+        });
+        waitForStart();
+        assertEquals(1, mTargets.size());
+        assertEquals(target[0], mTargets.get(0));
+        endTransition();
+    }
+
+    public void testAddTargetName() throws Throwable {
+        enterScene(R.layout.scene4);
+        mTransition.addTarget("red");
+        mTransition.addTarget("holder");
+        assertEquals(2, mTransition.getTargetNames().size());
+        assertEquals(0, mTargets.size());
+        startTransition(R.layout.scene2);
+        assertEquals(1, mTargets.size());
+        assertEquals(R.id.redSquare, mTargets.get(0).getId());
+        endTransition();
+    }
+
+    public void testRemoveTargetName() throws Throwable {
+        enterScene(R.layout.scene4);
+        mTransition.addTarget("holder");
+        mTransition.addTarget("red");
+        mTransition.addTarget("green");
+        assertEquals(3, mTransition.getTargetNames().size());
+        mTransition.removeTarget("purple"); // should do nothing
+        // try to force a different String instance
+        String greenName = new StringBuilder("gre").append("en").toString();
+        mTransition.removeTarget(greenName);
+        assertEquals(2, mTransition.getTargetNames().size());
+        startTransition(R.layout.scene1);
+        assertEquals(1, mTargets.size());
+        assertEquals(R.id.redSquare, mTargets.get(0).getId());
+        endTransition();
+    }
+
+    public void testIsTransitionRequired() throws Throwable {
+        enterScene(R.layout.scene1);
+        mTransition = new NotRequiredTransition();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                TransitionManager.beginDelayedTransition(mSceneRoot, mTransition);
+                mActivity.findViewById(R.id.hello).setVisibility(View.GONE);
+            }
+        });
+        waitForStart();
+        assertEquals(0, mTargets.size());
+        endTransition();
+    }
+
+    private class NotRequiredTransition extends TestTransition {
+        @Override
+        public boolean isTransitionRequired(TransitionValues startValues,
+                TransitionValues newValues) {
+            return false;
+        }
+    }
+}
+
diff --git a/tests/tests/tv/AndroidManifest.xml b/tests/tests/tv/AndroidManifest.xml
index d2b3ddf..79406e0 100644
--- a/tests/tests/tv/AndroidManifest.xml
+++ b/tests/tests/tv/AndroidManifest.xml
@@ -20,6 +20,7 @@
         package="com.android.cts.tv">
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.INJECT_EVENTS" />
 
     <uses-permission android:name="com.android.providers.tv.permission.READ_EPG_DATA" />
     <uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />
@@ -66,6 +67,15 @@
                        android:resource="@xml/stub_tv_input_service" />
         </service>
 
+        <service android:name="android.media.tv.cts.TvInputManagerTest$StubTvInputService2"
+                 android:permission="android.permission.BIND_TV_INPUT">
+            <intent-filter>
+                <action android:name="android.media.tv.TvInputService" />
+            </intent-filter>
+            <meta-data android:name="android.media.tv.input"
+                       android:resource="@xml/stub_tv_input_service" />
+        </service>
+
         <service android:name="android.media.tv.cts.TvInputServiceTest$CountingTvInputService"
                  android:permission="android.permission.BIND_TV_INPUT">
             <intent-filter>
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java b/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java
index 6a50b56..b4bc6eb 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java
@@ -409,9 +409,8 @@
             String sortOrder) throws Exception {
         try {
             getContext().getContentResolver().query(uri, projection, null, null, sortOrder);
-            fail("Setting sortOrder should fail without ACCESS_ALL_EPG_DATA permission for " + uri);
         } catch (SecurityException e) {
-            // Expected exception
+            fail("Setting sort order shoud be allowed for " + uri);
         }
     }
 
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvInputManagerTest.java b/tests/tests/tv/src/android/media/tv/cts/TvInputManagerTest.java
index 48f1f44..ff66dc6 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvInputManagerTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvInputManagerTest.java
@@ -16,19 +16,26 @@
 
 package android.media.tv.cts;
 
+import android.content.ComponentName;
 import android.content.Context;
+import android.content.pm.PackageManager;
+import android.cts.util.PollingCheck;
 import android.media.tv.TvContentRating;
 import android.media.tv.TvInputInfo;
 import android.media.tv.TvInputManager;
 import android.os.Handler;
 import android.test.ActivityInstrumentationTestCase2;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
  * Test for {@link android.media.tv.TvInputManager}.
  */
 public class TvInputManagerTest extends ActivityInstrumentationTestCase2<TvViewStubActivity> {
+    /** The maximum time to wait for an operation. */
+    private static final long TIME_OUT_MS = 15000L;
+
     private static final String[] VALID_TV_INPUT_SERVICES = {
         StubTunerTvInputService.class.getName()
     };
@@ -40,7 +47,7 @@
 
     private String mStubId;
     private TvInputManager mManager;
-    private TvInputManager.TvInputCallback mCallabck = new TvInputManager.TvInputCallback() {};
+    private LoggingCallback mCallabck = new LoggingCallback();
 
     private static TvInputInfo getInfoForClassName(List<TvInputInfo> list, String name) {
         for (TvInputInfo info : list) {
@@ -62,7 +69,7 @@
         }
         mManager = (TvInputManager) getActivity().getSystemService(Context.TV_INPUT_SERVICE);
         mStubId = getInfoForClassName(
-                mManager.getTvInputList(), StubTunerTvInputService.class.getName()).getId();
+                mManager.getTvInputList(), StubTvInputService2.class.getName()).getId();
     }
 
     public void testGetInputState() throws Exception {
@@ -77,7 +84,7 @@
             return;
         }
         assertEquals(mManager.getTvInputInfo(mStubId), getInfoForClassName(
-                mManager.getTvInputList(), StubTunerTvInputService.class.getName()));
+                mManager.getTvInputList(), StubTvInputService2.class.getName()));
     }
 
     public void testGetTvInputList() throws Exception {
@@ -134,4 +141,90 @@
         });
         getInstrumentation().waitForIdleSync();
     }
+
+    public void testInputAddedAndRemoved() {
+        if (!Utils.hasTvInputFramework(getActivity())) {
+            return;
+        }
+        getActivity().runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mManager.registerCallback(mCallabck, new Handler());
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+
+        // Test if onInputRemoved() is called.
+        mCallabck.resetLogs();
+        PackageManager pm = getActivity().getPackageManager();
+        ComponentName component = new ComponentName(getActivity(), StubTvInputService2.class);
+        assertTrue(PackageManager.COMPONENT_ENABLED_STATE_DISABLED != pm.getComponentEnabledSetting(
+                component));
+        pm.setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+                PackageManager.DONT_KILL_APP);
+        new PollingCheck(TIME_OUT_MS) {
+            @Override
+            protected boolean check() {
+                return mCallabck.isInputRemoved(mStubId);
+            }
+        }.run();
+
+        // Test if onInputAdded() is called.
+        mCallabck.resetLogs();
+        assertEquals(PackageManager.COMPONENT_ENABLED_STATE_DISABLED, pm.getComponentEnabledSetting(
+                component));
+        pm.setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+                PackageManager.DONT_KILL_APP);
+        new PollingCheck(TIME_OUT_MS) {
+            @Override
+            protected boolean check() {
+                return mCallabck.isInputAdded(mStubId);
+            }
+        }.run();
+
+        getActivity().runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mManager.unregisterCallback(mCallabck);
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+    }
+
+    private static class LoggingCallback extends TvInputManager.TvInputCallback {
+        private final List<String> mAddedInputs = new ArrayList<>();
+        private final List<String> mRemovedInputs = new ArrayList<>();
+
+        @Override
+        public synchronized void onInputAdded(String inputId) {
+            mAddedInputs.add(inputId);
+        }
+
+        @Override
+        public synchronized void onInputRemoved(String inputId) {
+            mRemovedInputs.add(inputId);
+        }
+
+        public synchronized void resetLogs() {
+            mAddedInputs.clear();
+            mRemovedInputs.clear();
+        }
+
+        public synchronized boolean isInputAdded(String inputId) {
+            return mRemovedInputs.isEmpty() && mAddedInputs.size() == 1 && mAddedInputs.contains(
+                    inputId);
+        }
+
+        public synchronized boolean isInputRemoved(String inputId) {
+            return mAddedInputs.isEmpty() && mRemovedInputs.size() == 1 && mRemovedInputs.contains(
+                    inputId);
+        }
+    }
+
+    public static class StubTvInputService2 extends StubTvInputService {
+        @Override
+        public Session onCreateSession(String inputId) {
+            return null;
+        }
+    }
 }
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvInputServiceTest.java b/tests/tests/tv/src/android/media/tv/cts/TvInputServiceTest.java
index 7068035..b4c863a 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvInputServiceTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvInputServiceTest.java
@@ -20,6 +20,7 @@
 import android.app.Instrumentation;
 import android.content.Context;
 import android.cts.util.PollingCheck;
+import android.media.PlaybackParams;
 import android.media.tv.TvContentRating;
 import android.media.tv.TvContract;
 import android.media.tv.TvInputInfo;
@@ -34,7 +35,9 @@
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.Surface;
+import android.view.SurfaceView;
 import android.view.View;
+import android.widget.LinearLayout;
 
 import com.android.cts.tv.R;
 
@@ -59,6 +62,8 @@
     private TvInputManager mManager;
     private TvInputInfo mStubInfo;
     private final StubCallback mCallback = new StubCallback();
+    private final StubTimeShiftPositionCallback mTimeShiftPositionCallback =
+            new StubTimeShiftPositionCallback();
 
     private static class StubCallback extends TvView.TvInputCallback {
         private int mChannelRetunedCount;
@@ -69,6 +74,7 @@
         private int mVideoSizeChanged;
         private int mContentAllowedCount;
         private int mContentBlockedCount;
+        private int mTimeShiftStatusChangedCount;
 
         @Override
         public void onChannelRetuned(String inputId, Uri channelUri) {
@@ -110,6 +116,11 @@
             mContentBlockedCount++;
         }
 
+        @Override
+        public void onTimeShiftStatusChanged(String inputId, int status) {
+            mTimeShiftStatusChangedCount++;
+        }
+
         public void resetCounts() {
             mChannelRetunedCount = 0;
             mVideoAvailableCount = 0;
@@ -118,6 +129,27 @@
             mTrackChangedCount = 0;
             mContentAllowedCount = 0;
             mContentBlockedCount = 0;
+            mTimeShiftStatusChangedCount = 0;
+        }
+    }
+
+    private static class StubTimeShiftPositionCallback extends TvView.TimeShiftPositionCallback {
+        private int mTimeShiftStartPositionChanged;
+        private int mTimeShiftCurrentPositionChanged;
+
+        @Override
+        public void onTimeShiftStartPositionChanged(String inputId, long timeMs) {
+            mTimeShiftStartPositionChanged++;
+        }
+
+        @Override
+        public void onTimeShiftCurrentPositionChanged(String inputId, long timeMs) {
+            mTimeShiftCurrentPositionChanged++;
+        }
+
+        public void resetCounts() {
+            mTimeShiftStartPositionChanged = 0;
+            mTimeShiftCurrentPositionChanged = 0;
         }
     }
 
@@ -161,6 +193,12 @@
         verifyCommandDispatchTouchEvent();
         verifyCommandDispatchTrackballEvent();
         verifyCommandDispatchGenericMotionEvent();
+        verifyCommandTimeShiftPause();
+        verifyCommandTimeShiftResume();
+        verifyCommandTimeShiftSeekTo();
+        verifyCommandTimeShiftSetPlaybackParams();
+        verifyCommandSetTimeShiftPositionCallback();
+        verifyCommandOverlayViewSizeChanged();
         verifyCallbackChannelRetuned();
         verifyCallbackVideoAvailable();
         verifyCallbackVideoUnavailable();
@@ -168,6 +206,8 @@
         verifyCallbackTrackSelected();
         verifyCallbackContentAllowed();
         verifyCallbackContentBlocked();
+        verifyCallbackTimeShiftStatusChanged();
+        verifyCallbackLayoutSurface();
 
         runTestOnUiThread(new Runnable() {
             @Override
@@ -320,6 +360,89 @@
         }.run();
     }
 
+    public void verifyCommandTimeShiftPause() {
+        resetCounts();
+        mTvView.timeShiftPause();
+        mInstrumentation.waitForIdleSync();
+        new PollingCheck(TIME_OUT) {
+            @Override
+            protected boolean check() {
+                CountingSession session = CountingTvInputService.sSession;
+                return session != null && session.mTimeShiftPauseCount > 0;
+            }
+        }.run();
+    }
+
+    public void verifyCommandTimeShiftResume() {
+        resetCounts();
+        mTvView.timeShiftResume();
+        mInstrumentation.waitForIdleSync();
+        new PollingCheck(TIME_OUT) {
+            @Override
+            protected boolean check() {
+                CountingSession session = CountingTvInputService.sSession;
+                return session != null && session.mTimeShiftResumeCount > 0;
+            }
+        }.run();
+    }
+
+    public void verifyCommandTimeShiftSeekTo() {
+        resetCounts();
+        mTvView.timeShiftSeekTo(0);
+        mInstrumentation.waitForIdleSync();
+        new PollingCheck(TIME_OUT) {
+            @Override
+            protected boolean check() {
+                CountingSession session = CountingTvInputService.sSession;
+                return session != null && session.mTimeShiftSeekToCount > 0;
+            }
+        }.run();
+    }
+
+    public void verifyCommandTimeShiftSetPlaybackParams() {
+        resetCounts();
+        mTvView.timeShiftSetPlaybackParams(new PlaybackParams().setSpeed(2.0f)
+                .setAudioFallbackMode(PlaybackParams.AUDIO_FALLBACK_MODE_DEFAULT));
+        mInstrumentation.waitForIdleSync();
+        new PollingCheck(TIME_OUT) {
+            @Override
+            protected boolean check() {
+                CountingSession session = CountingTvInputService.sSession;
+                return session != null && session.mTimeShiftSetPlaybackParamsCount > 0;
+            }
+        }.run();
+    }
+
+    public void verifyCommandSetTimeShiftPositionCallback() {
+        resetCounts();
+        mTvView.setTimeShiftPositionCallback(mTimeShiftPositionCallback);
+        mInstrumentation.waitForIdleSync();
+        new PollingCheck(TIME_OUT) {
+            @Override
+            protected boolean check() {
+                return mTimeShiftPositionCallback.mTimeShiftCurrentPositionChanged > 0
+                        && mTimeShiftPositionCallback.mTimeShiftStartPositionChanged > 0;
+            }
+        }.run();
+    }
+
+    public void verifyCommandOverlayViewSizeChanged() {
+        resetCounts();
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                mTvView.setLayoutParams(new LinearLayout.LayoutParams(10, 20));
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+        new PollingCheck(TIME_OUT) {
+            @Override
+            protected boolean check() {
+                CountingSession session = CountingTvInputService.sSession;
+                return session != null && session.mOverlayViewSizeChangedCount > 0;
+            }
+        }.run();
+    }
+
     public void verifyCallbackChannelRetuned() {
         resetCounts();
         CountingSession session = CountingTvInputService.sSession;
@@ -431,11 +554,50 @@
         }.run();
     }
 
+    public void verifyCallbackTimeShiftStatusChanged() {
+        resetCounts();
+        CountingSession session = CountingTvInputService.sSession;
+        assertNotNull(session);
+        session.notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE);
+        new PollingCheck(TIME_OUT) {
+            @Override
+            protected boolean check() {
+                return mCallback.mTimeShiftStatusChangedCount > 0;
+            }
+        }.run();
+    }
+
+    public void verifyCallbackLayoutSurface() {
+        resetCounts();
+        final int left = 10;
+        final int top = 20;
+        final int right = 30;
+        final int bottom = 40;
+        CountingSession session = CountingTvInputService.sSession;
+        assertNotNull(session);
+        session.layoutSurface(left, top, right, bottom);
+        new PollingCheck(TIME_OUT) {
+            @Override
+            protected boolean check() {
+                int childCount = mTvView.getChildCount();
+                for (int i = 0; i < childCount; ++i) {
+                    View v = mTvView.getChildAt(i);
+                    if (v instanceof SurfaceView) {
+                        return v.getLeft() == left && v.getTop() == top && v.getRight() == right
+                                && v.getBottom() == bottom;
+                    }
+                }
+                return false;
+            }
+        }.run();
+    }
+
     private void resetCounts() {
         if (CountingTvInputService.sSession != null) {
             CountingTvInputService.sSession.resetCounts();
         }
         mCallback.resetCounts();
+        mTimeShiftPositionCallback.resetCounts();
     }
 
     public static class CountingTvInputService extends StubTvInputService {
@@ -461,6 +623,13 @@
             public volatile int mTouchEventCount;
             public volatile int mTrackballEventCount;
             public volatile int mGenricMotionEventCount;
+            public volatile int mOverlayViewSizeChangedCount;
+            public volatile int mTimeShiftPauseCount;
+            public volatile int mTimeShiftResumeCount;
+            public volatile int mTimeShiftSeekToCount;
+            public volatile int mTimeShiftSetPlaybackParamsCount;
+            public volatile long mTimeShiftGetCurrentPositionCount;
+            public volatile long mTimeShiftGetStartPositionCount;
 
             CountingSession(Context context) {
                 super(context);
@@ -479,6 +648,13 @@
                 mTouchEventCount = 0;
                 mTrackballEventCount = 0;
                 mGenricMotionEventCount = 0;
+                mOverlayViewSizeChangedCount = 0;
+                mTimeShiftPauseCount = 0;
+                mTimeShiftResumeCount = 0;
+                mTimeShiftSeekToCount = 0;
+                mTimeShiftSetPlaybackParamsCount = 0;
+                mTimeShiftGetCurrentPositionCount = 0;
+                mTimeShiftGetStartPositionCount = 0;
             }
 
             @Override
@@ -559,6 +735,41 @@
                 mGenricMotionEventCount++;
                 return false;
             }
+
+            @Override
+            public void onTimeShiftPause() {
+                mTimeShiftPauseCount++;
+            }
+
+            @Override
+            public void onTimeShiftResume() {
+                mTimeShiftResumeCount++;
+            }
+
+            @Override
+            public void onTimeShiftSeekTo(long timeMs) {
+                mTimeShiftSeekToCount++;
+            }
+
+            @Override
+            public void onTimeShiftSetPlaybackParams(PlaybackParams param) {
+                mTimeShiftSetPlaybackParamsCount++;
+            }
+
+            @Override
+            public long onTimeShiftGetCurrentPosition() {
+                return ++mTimeShiftGetCurrentPositionCount;
+            }
+
+            @Override
+            public long onTimeShiftGetStartPosition() {
+                return ++mTimeShiftGetStartPositionCount;
+            }
+
+            @Override
+            public void onOverlayViewSizeChanged(int width, int height) {
+                mOverlayViewSizeChangedCount++;
+            }
         }
     }
 }
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvViewTest.java b/tests/tests/tv/src/android/media/tv/cts/TvViewTest.java
index 6232861..1c59462 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvViewTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvViewTest.java
@@ -272,6 +272,8 @@
                 case TvTrackInfo.TYPE_VIDEO:
                     assertEquals(track.getVideoHeight(), selectedTrack.getVideoHeight());
                     assertEquals(track.getVideoWidth(), selectedTrack.getVideoWidth());
+                    assertEquals(track.getVideoPixelAspectRatio(),
+                            selectedTrack.getVideoPixelAspectRatio(), 0.001f);
                     break;
                 case TvTrackInfo.TYPE_AUDIO:
                     assertEquals(track.getAudioChannelCount(),
@@ -281,6 +283,7 @@
                     break;
                 case TvTrackInfo.TYPE_SUBTITLE:
                     assertEquals(track.getLanguage(), selectedTrack.getLanguage());
+                    assertEquals(track.getDescription(), selectedTrack.getDescription());
                     break;
                 default:
                     fail("Unrecognized type: " + track.getType());
@@ -295,7 +298,7 @@
         TvTrackInfo videoTrack1 = new TvTrackInfo.Builder(TvTrackInfo.TYPE_VIDEO, "video-HD")
                 .setVideoHeight(1920).setVideoWidth(1080).build();
         TvTrackInfo videoTrack2 = new TvTrackInfo.Builder(TvTrackInfo.TYPE_VIDEO, "video-SD")
-                .setVideoHeight(640).setVideoWidth(360).build();
+                .setVideoHeight(640).setVideoWidth(360).setVideoPixelAspectRatio(1.09f).build();
         TvTrackInfo audioTrack1 =
                 new TvTrackInfo.Builder(TvTrackInfo.TYPE_AUDIO, "audio-stereo-eng")
                 .setLanguage("eng").setAudioChannelCount(2).setAudioSampleRate(48000).build();
@@ -307,13 +310,16 @@
         TvTrackInfo subtitleTrack2 =
                 new TvTrackInfo.Builder(TvTrackInfo.TYPE_SUBTITLE, "subtitle-esp")
                 .setLanguage("esp").build();
+        TvTrackInfo subtitleTrack3 =
+                new TvTrackInfo.Builder(TvTrackInfo.TYPE_SUBTITLE, "subtitle-eng2")
+                .setLanguage("eng").setDescription("audio commentary").build();
 
         StubTunerTvInputService.injectTrack(videoTrack1, videoTrack2, audioTrack1, audioTrack2,
                 subtitleTrack1, subtitleTrack2);
 
         final List<TvTrackInfo> tracks = new ArrayList<TvTrackInfo>();
         Collections.addAll(tracks, videoTrack1, videoTrack2, audioTrack1, audioTrack2,
-                subtitleTrack1, subtitleTrack2);
+                subtitleTrack1, subtitleTrack2, subtitleTrack3);
         tryTuneAllChannels(new Runnable() {
             @Override
             public void run() {
diff --git a/tests/tests/uidisolation/Android.mk b/tests/tests/uidisolation/Android.mk
index 8529407..c21b6df 100644
--- a/tests/tests/uidisolation/Android.mk
+++ b/tests/tests/uidisolation/Android.mk
@@ -23,6 +23,8 @@
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner ctstestserver
 
+LOCAL_JAVA_LIBRARIES := org.apache.http.legacy
+
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 LOCAL_PACKAGE_NAME := CtsUidIsolationTestCases
diff --git a/tests/tests/uidisolation/AndroidManifest.xml b/tests/tests/uidisolation/AndroidManifest.xml
index a8c6848..86efb6f 100644
--- a/tests/tests/uidisolation/AndroidManifest.xml
+++ b/tests/tests/uidisolation/AndroidManifest.xml
@@ -18,6 +18,8 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.cts.uidisolation">
 
+    <uses-library android:name="org.apache.http.legacy" android:required="false" />
+
     <application android:label="UidIsolationTest">
       <activity android:name="android.uidisolation.cts.ServiceRunnerActivity"
                 android:label="UidIsolationTest"/>
diff --git a/tests/tests/uirendering/AndroidManifest.xml b/tests/tests/uirendering/AndroidManifest.xml
index 413dfba..b8d84a6 100644
--- a/tests/tests/uirendering/AndroidManifest.xml
+++ b/tests/tests/uirendering/AndroidManifest.xml
@@ -26,7 +26,7 @@
         <uses-library android:name="android.test.runner" />
     </application>
 
-    <instrumentation android:name="android.test.InstrumentationTestRunner"
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
                      android:targetPackage="com.android.cts.uirendering">
     </instrumentation>
 
diff --git a/tests/tests/uirendering/res/drawable-nodpi/black1.png b/tests/tests/uirendering/res/drawable-nodpi/black1.png
index 3487ced..bbfc2c1 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/black1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/black1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/blackitalic1.png b/tests/tests/uirendering/res/drawable-nodpi/blackitalic1.png
index 8fd3b50..6a8a830 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/blackitalic1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/blackitalic1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/bold1.png b/tests/tests/uirendering/res/drawable-nodpi/bold1.png
index 199cccc..cd0465b 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/bold1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/bold1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/bolditalic1.png b/tests/tests/uirendering/res/drawable-nodpi/bolditalic1.png
index 985635e..0819c8a 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/bolditalic1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/bolditalic1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/condensed1.png b/tests/tests/uirendering/res/drawable-nodpi/condensed1.png
index 6889a3a..16f03e2 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/condensed1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/condensed1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/condensedbold1.png b/tests/tests/uirendering/res/drawable-nodpi/condensedbold1.png
index 9554dee..98174f0 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/condensedbold1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/condensedbold1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/condensedbolditalic1.png b/tests/tests/uirendering/res/drawable-nodpi/condensedbolditalic1.png
index 0483355..8b017ba 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/condensedbolditalic1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/condensedbolditalic1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/condenseditalic1.png b/tests/tests/uirendering/res/drawable-nodpi/condenseditalic1.png
index 6584147..5fc1f9c 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/condenseditalic1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/condenseditalic1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/condensedlight1.png b/tests/tests/uirendering/res/drawable-nodpi/condensedlight1.png
index 49d01ac..1aca9cf 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/condensedlight1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/condensedlight1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/condensedlightitalic1.png b/tests/tests/uirendering/res/drawable-nodpi/condensedlightitalic1.png
index 6fe4a76..47ecd67 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/condensedlightitalic1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/condensedlightitalic1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/hello1.png b/tests/tests/uirendering/res/drawable-nodpi/hello1.png
index 7a4be5a..6c9cb58 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/hello1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/hello1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/italic1.png b/tests/tests/uirendering/res/drawable-nodpi/italic1.png
index a5f9ef2..0afb3ae 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/italic1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/italic1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/light1.png b/tests/tests/uirendering/res/drawable-nodpi/light1.png
index dfa59da..6822edb 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/light1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/light1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/lightitalic1.png b/tests/tests/uirendering/res/drawable-nodpi/lightitalic1.png
index 283ddc4..b49d2d6 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/lightitalic1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/lightitalic1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/medium1.png b/tests/tests/uirendering/res/drawable-nodpi/medium1.png
index e615186..5b187bc 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/medium1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/medium1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/mediumitalic1.png b/tests/tests/uirendering/res/drawable-nodpi/mediumitalic1.png
index 3e15fc8..057edc0 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/mediumitalic1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/mediumitalic1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/thin1.png b/tests/tests/uirendering/res/drawable-nodpi/thin1.png
index 9637262..a780f16 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/thin1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/thin1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/drawable-nodpi/thinitalic1.png b/tests/tests/uirendering/res/drawable-nodpi/thinitalic1.png
index 0afbb9a..6ddb52b 100644
--- a/tests/tests/uirendering/res/drawable-nodpi/thinitalic1.png
+++ b/tests/tests/uirendering/res/drawable-nodpi/thinitalic1.png
Binary files differ
diff --git a/tests/tests/uirendering/res/layout/circle_clipped_webview.xml b/tests/tests/uirendering/res/layout/circle_clipped_webview.xml
new file mode 100644
index 0000000..44b65be
--- /dev/null
+++ b/tests/tests/uirendering/res/layout/circle_clipped_webview.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+  -->
+<android.uirendering.cts.testclasses.view.CircleClipFrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="@dimen/test_width"
+    android:layout_height="@dimen/test_height">
+    <WebView
+        android:id="@+id/webview"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+</android.uirendering.cts.testclasses.view.CircleClipFrameLayout>
diff --git a/tests/tests/uirendering/res/layout/simple_red_layout.xml b/tests/tests/uirendering/res/layout/simple_red_layout.xml
index 2af8db6..1c551d3 100644
--- a/tests/tests/uirendering/res/layout/simple_red_layout.xml
+++ b/tests/tests/uirendering/res/layout/simple_red_layout.xml
@@ -16,5 +16,4 @@
 <View xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="@dimen/test_width"
     android:layout_height="@dimen/test_height"
-    android:id="@+id/test_root"
-    android:background="#f00" />
+    android:background="#f00"/>
diff --git a/tests/tests/uirendering/res/layout/simple_shadow_layout.xml b/tests/tests/uirendering/res/layout/simple_shadow_layout.xml
new file mode 100644
index 0000000..2f21df0
--- /dev/null
+++ b/tests/tests/uirendering/res/layout/simple_shadow_layout.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="@dimen/test_width"
+    android:layout_height="@dimen/test_height">
+    <View android:layout_width="40px"
+        android:layout_height="40px"
+        android:translationX="25px"
+        android:translationY="25px"
+        android:elevation="10dp"
+        android:background="#fff" />
+</FrameLayout>
\ No newline at end of file
diff --git a/tests/tests/uirendering/res/layout/test_container.xml b/tests/tests/uirendering/res/layout/test_container.xml
index 94a8eab..deff9de 100644
--- a/tests/tests/uirendering/res/layout/test_container.xml
+++ b/tests/tests/uirendering/res/layout/test_container.xml
@@ -13,12 +13,16 @@
        limitations under the License.
   -->
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/test_container"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
-    <ViewStub
-        android:id="@+id/test_content_stub"
+    <FrameLayout
         android:layout_gravity="center"
+        android:id="@+id/test_content_wrapper"
         android:layout_width="@dimen/test_width"
-        android:layout_height="@dimen/test_height"/>
+        android:layout_height="@dimen/test_height">
+        <ViewStub
+            android:id="@+id/test_content_stub"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"/>
+    </FrameLayout>
 </FrameLayout>
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/ColorVerifier.java b/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/ColorVerifier.java
index 7f62b3e..aa91c2e 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/ColorVerifier.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/ColorVerifier.java
@@ -15,27 +15,31 @@
  */
 package android.uirendering.cts.bitmapverifiers;
 
+import android.annotation.ColorInt;
+
 /**
  * Checks to see if a bitmap is entirely a single color
  */
 public class ColorVerifier extends PerPixelBitmapVerifier {
+    @ColorInt
     private int mColor;
 
-    public ColorVerifier(int color) {
+    public ColorVerifier(@ColorInt int color) {
         this(color, DEFAULT_THRESHOLD);
     }
 
-    public ColorVerifier(int color, int colorTolerance) {
+    public ColorVerifier(@ColorInt int color, int colorTolerance) {
         super(colorTolerance);
         mColor = color;
     }
 
-    public ColorVerifier(int color, int colorThreshold, float spatialTolerance) {
+    public ColorVerifier(@ColorInt int color, int colorThreshold, float spatialTolerance) {
         super(colorThreshold, spatialTolerance);
         mColor = color;
     }
 
     @Override
+    @ColorInt
     protected int getExpectedColor(int x, int y) {
         return mColor;
     }
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/GoldenImageVerifier.java b/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/GoldenImageVerifier.java
index d4a63de..42e8960 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/GoldenImageVerifier.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/GoldenImageVerifier.java
@@ -25,8 +25,8 @@
     private int[] mGoldenBitmapArray;
 
     public GoldenImageVerifier(Bitmap goldenBitmap, BitmapComparer bitmapComparer) {
-        mGoldenBitmapArray = new int[goldenBitmap.getWidth() * goldenBitmap.getHeight()];
-        goldenBitmap.getPixels(mGoldenBitmapArray, 0, goldenBitmap.getWidth(), 0, 0,
+        mGoldenBitmapArray = new int[ActivityTestBase.TEST_WIDTH * ActivityTestBase.TEST_HEIGHT];
+        goldenBitmap.getPixels(mGoldenBitmapArray, 0, ActivityTestBase.TEST_WIDTH, 0, 0,
                 ActivityTestBase.TEST_WIDTH, ActivityTestBase.TEST_HEIGHT);
         mBitmapComparer = bitmapComparer;
     }
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/PerPixelBitmapVerifier.java b/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/PerPixelBitmapVerifier.java
index 2d00db5..8fe75ee 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/PerPixelBitmapVerifier.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/bitmapverifiers/PerPixelBitmapVerifier.java
@@ -15,6 +15,7 @@
  */
 package android.uirendering.cts.bitmapverifiers;
 
+import android.annotation.ColorInt;
 import android.graphics.Bitmap;
 import android.graphics.Color;
 import android.uirendering.cts.testinfrastructure.ActivityTestBase;
@@ -47,6 +48,7 @@
         mSpatialTolerance = spatialTolerance;
     }
 
+    @ColorInt
     protected int getExpectedColor(int x, int y) {
         return Color.WHITE;
     }
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/BitmapFilterTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/BitmapFilterTests.java
index 1d5cd16..b324b06 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/BitmapFilterTests.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/BitmapFilterTests.java
@@ -120,6 +120,7 @@
                     canvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.FILTER_BITMAP_FLAG, 0));
                 }
                 canvas.drawBitmap(scaleUp ? mSmallGridBitmap : mBigGridBitmap, 0, 0, paint);
+                canvas.setDrawFilter(null);
             }
         };
         createTest()
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/CanvasStateTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/CanvasStateTests.java
new file mode 100644
index 0000000..becc2f7
--- /dev/null
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/CanvasStateTests.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2015 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.uirendering.cts.testclasses;
+
+import android.graphics.Canvas;
+import android.graphics.Path;
+import android.graphics.RectF;
+import android.graphics.Region;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.uirendering.cts.testinfrastructure.ActivityTestBase;
+import android.uirendering.cts.testinfrastructure.CanvasClient;
+
+/**
+ * Tests of state query-able from canvas at draw time.
+ *
+ * Although these tests don't verify drawing content, they still make use of ActivityTestBase's
+ * capability to test the hardware accelerated Canvas in the way that it is used by Views.
+ */
+public class CanvasStateTests extends ActivityTestBase {
+
+    @SmallTest
+    public void testClipRectReturnValues() {
+        createTest()
+                .addCanvasClient(new CanvasClient() {
+                    @Override
+                    public void draw(Canvas canvas, int width, int height) {
+                        canvas.save();
+                        boolean isNonEmpty = canvas.clipRect(0, 0, 20, 20);
+                        assertTrue("clip state should be non empty", isNonEmpty);
+
+                        isNonEmpty = canvas.clipRect(0, 40, 20, 60);
+                        assertFalse("clip state should be empty", isNonEmpty);
+                        canvas.restore();
+                    }
+                })
+                .runWithoutVerification();
+    }
+
+    @SmallTest
+    public void testClipRegionReturnValues() {
+        createTest()
+                .addCanvasClient(new CanvasClient() {
+                    @Override
+                    public void draw(Canvas canvas, int width, int height) {
+                        canvas.save();
+                        RectF clipRectF = new RectF(0, 0, 20, 20);
+
+                        assertFalse(canvas.quickReject(0, 0, 20, 20, Canvas.EdgeType.BW));
+                        if (!canvas.isHardwareAccelerated()) {
+                            // SW canvas may not be in View space, so we offset the clipping region
+                            // so it will operate within the canvas client's window.
+                            // (Currently, this isn't necessary, since SW layer size == draw area)
+                            canvas.getMatrix().mapRect(clipRectF);
+                        }
+
+                        Region rectRegion = new Region();
+                        rectRegion.set((int) clipRectF.left, (int) clipRectF.top,
+                                (int) clipRectF.right, (int) clipRectF.bottom);
+
+                        boolean isNonEmpty = canvas.clipRegion(rectRegion);
+                        assertTrue("clip state should be non empty", isNonEmpty);
+
+                        // Note: we don't test that non-intersecting clip regions empty the clip,
+                        // For region clipping, the impl is allowed to return true conservatively
+                        // in many cases.
+                        canvas.restore();
+                    }
+                })
+                .runWithoutVerification();
+    }
+
+    @SmallTest
+    public void testClipPathReturnValues() {
+        createTest()
+                .addCanvasClient(new CanvasClient() {
+                    @Override
+                    public void draw(Canvas canvas, int width, int height) {
+                        canvas.save();
+                        Path rectPath = new Path();
+                        rectPath.addRect(0, 0, 20, 20, Path.Direction.CW);
+
+                        boolean isNonEmpty = canvas.clipPath(rectPath);
+                        assertTrue("clip state should be non empty", isNonEmpty);
+
+                        rectPath.offset(0, 40);
+                        isNonEmpty = canvas.clipPath(rectPath);
+                        assertFalse("clip state should be empty", isNonEmpty);
+                        canvas.restore();
+                    }
+                })
+                .runWithoutVerification();
+    }
+    @SmallTest
+    public void testQuickReject() {
+        createTest()
+                .addCanvasClient(new CanvasClient() {
+                    @Override
+                    public void draw(Canvas canvas, int width, int height) {
+                        canvas.save();
+                        canvas.clipRect(0, 0, 20, 20);
+
+                        // not rejected!
+                        assertFalse(canvas.quickReject(0, 0, 20, 20, Canvas.EdgeType.BW));
+
+                        // rejected!
+                        assertTrue(canvas.quickReject(0, 40, 20, 60, Canvas.EdgeType.BW));
+                        canvas.restore();
+                    }
+                })
+                .runWithoutVerification();
+    }
+}
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/FontRenderingTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/FontRenderingTests.java
index e7ed7ac..5833f20 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/FontRenderingTests.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/FontRenderingTests.java
@@ -32,17 +32,24 @@
 import com.android.cts.uirendering.R;
 
 public class FontRenderingTests extends ActivityTestBase {
-    // Threshold is barely loose enough for differences between sw and hw renderers
-    static double MSSIM_THRESHOLD = 0.91;
-
-    private final BitmapComparer mFuzzyComparer = new MSSIMComparer(MSSIM_THRESHOLD);
+    // Thresholds are barely loose enough for differences between sw and hw renderers.
+    private static final double REGULAR_THRESHOLD = 0.92;
+    private static final double THIN_THRESHOLD = 0.87;
 
     // Representative characters including some from Unicode 7
-    private final String mTestString1 = "Hamburg \u20bd";
-    private final String mTestString2 = "\u20b9\u0186\u0254\u1e24\u1e43";
+    private static final String sTestString1 = "Hambu";
+    private static final String sTestString2 = "rg \u20bd";
+    private static final String sTestString3 = "\u20b9\u0186\u0254\u1e24\u1e43";
 
-    private void fontTestBody(final Typeface typeface, int id) {
+    private void fontTestBody(String family, int style, int id) {
         Bitmap goldenBitmap = BitmapFactory.decodeResource(getActivity().getResources(), id);
+
+        // adjust threshold based on thinness - more variance is expected in thin cases
+        boolean thinTestCase = family.endsWith("-thin") && ((style & Typeface.BOLD) == 0);
+        BitmapComparer comparer = new MSSIMComparer(
+                thinTestCase ? THIN_THRESHOLD : REGULAR_THRESHOLD);
+
+        final Typeface typeface = Typeface.create(family, style);
         createTest()
                 .addCanvasClient(new CanvasClient() {
                     @Override
@@ -50,174 +57,201 @@
                         Paint p = new Paint();
                         p.setAntiAlias(true);
                         p.setColor(Color.BLACK);
-                        p.setTextSize(30);
+                        p.setTextSize(26);
                         p.setTypeface(typeface);
-                        canvas.drawText(mTestString1, 10, 60, p);
-                        canvas.drawText(mTestString2, 10, 100, p);
+                        canvas.drawText(sTestString1, 1, 20, p);
+                        canvas.drawText(sTestString2, 1, 50, p);
+                        canvas.drawText(sTestString3, 1, 80, p);
                     }
                 })
-                .runWithVerifier(new GoldenImageVerifier(goldenBitmap, mFuzzyComparer));
+                .runWithVerifier(new GoldenImageVerifier(goldenBitmap, comparer));
     }
 
     @SmallTest
     public void testDefaultFont() {
-        Typeface tf = Typeface.create("sans-serif", Typeface.NORMAL);
-        fontTestBody(tf, R.drawable.hello1);
+        fontTestBody("sans-serif",
+                Typeface.NORMAL,
+                R.drawable.hello1);
     }
 
     @SmallTest
     public void testBoldFont() {
-        Typeface tf = Typeface.create("sans-serif", Typeface.BOLD);
-        fontTestBody(tf, R.drawable.bold1);
+        fontTestBody("sans-serif",
+                Typeface.BOLD,
+                R.drawable.bold1);
     }
 
     @SmallTest
     public void testItalicFont() {
-        Typeface tf = Typeface.create("sans-serif", Typeface.ITALIC);
-        fontTestBody(tf, R.drawable.italic1);
+        fontTestBody("sans-serif",
+                Typeface.ITALIC,
+                R.drawable.italic1);
     }
 
     @SmallTest
     public void testBoldItalicFont() {
-        Typeface tf = Typeface.create("sans-serif", Typeface.BOLD | Typeface.ITALIC);
-        fontTestBody(tf, R.drawable.bolditalic1);
+        fontTestBody("sans-serif",
+                Typeface.BOLD | Typeface.ITALIC,
+                R.drawable.bolditalic1);
     }
 
     @SmallTest
     public void testMediumFont() {
-        Typeface tf = Typeface.create("sans-serif-medium", Typeface.NORMAL);
-        fontTestBody(tf, R.drawable.medium1);
+        fontTestBody("sans-serif-medium",
+                Typeface.NORMAL,
+                R.drawable.medium1);
     }
 
     @SmallTest
     public void testMediumBoldFont() {
         // bold attribute on medium base font = black
-        Typeface tf = Typeface.create("sans-serif-medium", Typeface.BOLD);
-        fontTestBody(tf, R.drawable.black1);
+        fontTestBody("sans-serif-medium",
+                Typeface.BOLD,
+                R.drawable.black1);
     }
 
     @SmallTest
     public void testMediumItalicFont() {
-        Typeface tf = Typeface.create("sans-serif-medium", Typeface.ITALIC);
-        fontTestBody(tf, R.drawable.mediumitalic1);
+        fontTestBody("sans-serif-medium",
+                Typeface.ITALIC,
+                R.drawable.mediumitalic1);
     }
 
     @SmallTest
     public void testMediumBoldItalicFont() {
-        Typeface tf = Typeface.create("sans-serif-medium", Typeface.BOLD | Typeface.ITALIC);
-        fontTestBody(tf, R.drawable.blackitalic1);
+        fontTestBody("sans-serif-medium",
+                Typeface.BOLD | Typeface.ITALIC,
+                R.drawable.blackitalic1);
     }
 
     @SmallTest
     public void testLightFont() {
-        Typeface tf = Typeface.create("sans-serif-light", Typeface.NORMAL);
-        fontTestBody(tf, R.drawable.light1);
+        fontTestBody("sans-serif-light",
+                Typeface.NORMAL,
+                R.drawable.light1);
     }
 
     @SmallTest
     public void testLightBoldFont() {
         // bold attribute on light base font = medium
-        Typeface tf = Typeface.create("sans-serif-light", Typeface.BOLD);
-        fontTestBody(tf, R.drawable.medium1);
+        fontTestBody("sans-serif-light",
+                Typeface.BOLD,
+                R.drawable.medium1);
     }
 
     @SmallTest
     public void testLightItalicFont() {
-        Typeface tf = Typeface.create("sans-serif-light", Typeface.ITALIC);
-        fontTestBody(tf, R.drawable.lightitalic1);
+        fontTestBody("sans-serif-light",
+                Typeface.ITALIC,
+                R.drawable.lightitalic1);
     }
 
     @SmallTest
     public void testLightBoldItalicFont() {
-        Typeface tf = Typeface.create("sans-serif-light", Typeface.BOLD | Typeface.ITALIC);
-        fontTestBody(tf, R.drawable.mediumitalic1);
+        fontTestBody("sans-serif-light",
+                Typeface.BOLD | Typeface.ITALIC,
+                R.drawable.mediumitalic1);
     }
 
     @SmallTest
     public void testThinFont() {
-        Typeface tf = Typeface.create("sans-serif-thin", Typeface.NORMAL);
-        fontTestBody(tf, R.drawable.thin1);
+        fontTestBody("sans-serif-thin",
+                Typeface.NORMAL,
+                R.drawable.thin1);
     }
 
     @SmallTest
     public void testThinBoldFont() {
         // bold attribute on thin base font = normal
-        Typeface tf = Typeface.create("sans-serif-thin", Typeface.BOLD);
-        fontTestBody(tf, R.drawable.hello1);
+        fontTestBody("sans-serif-thin",
+                Typeface.BOLD,
+                R.drawable.hello1);
     }
 
     @SmallTest
     public void testThinItalicFont() {
-        Typeface tf = Typeface.create("sans-serif-thin", Typeface.ITALIC);
-        fontTestBody(tf, R.drawable.thinitalic1);
+        fontTestBody("sans-serif-thin",
+                Typeface.ITALIC,
+                R.drawable.thinitalic1);
     }
 
     @SmallTest
     public void testThinBoldItalicFont() {
-        Typeface tf = Typeface.create("sans-serif-thin", Typeface.BOLD | Typeface.ITALIC);
-        fontTestBody(tf, R.drawable.italic1);
+        fontTestBody("sans-serif-thin",
+                Typeface.BOLD | Typeface.ITALIC,
+                R.drawable.italic1);
     }
 
     @SmallTest
     public void testBlackFont() {
-        Typeface tf = Typeface.create("sans-serif-black", Typeface.NORMAL);
-        fontTestBody(tf, R.drawable.black1);
+        fontTestBody("sans-serif-black",
+                Typeface.NORMAL,
+                R.drawable.black1);
     }
 
     @SmallTest
     public void testBlackBoldFont() {
         // bold attribute on black base font = black
-        Typeface tf = Typeface.create("sans-serif-black", Typeface.BOLD);
-        fontTestBody(tf, R.drawable.black1);
+        fontTestBody("sans-serif-black",
+                Typeface.BOLD,
+                R.drawable.black1);
     }
 
     @SmallTest
     public void testBlackItalicFont() {
-        Typeface tf = Typeface.create("sans-serif-black", Typeface.ITALIC);
-        fontTestBody(tf, R.drawable.blackitalic1);
+        fontTestBody("sans-serif-black",
+                Typeface.ITALIC,
+                R.drawable.blackitalic1);
     }
 
     @SmallTest
     public void testBlackBoldItalicFont() {
-        Typeface tf = Typeface.create("sans-serif-black", Typeface.BOLD | Typeface.ITALIC);
-        fontTestBody(tf, R.drawable.blackitalic1);
+        fontTestBody("sans-serif-black",
+                Typeface.BOLD | Typeface.ITALIC,
+                R.drawable.blackitalic1);
     }
 
     /* condensed fonts */
 
     @SmallTest
     public void testCondensedFont() {
-        Typeface tf = Typeface.create("sans-serif-condensed", Typeface.NORMAL);
-        fontTestBody(tf, R.drawable.condensed1);
+        fontTestBody("sans-serif-condensed",
+                Typeface.NORMAL,
+                R.drawable.condensed1);
     }
 
     @SmallTest
     public void testCondensedBoldFont() {
-        Typeface tf = Typeface.create("sans-serif-condensed", Typeface.BOLD);
-        fontTestBody(tf, R.drawable.condensedbold1);
+        fontTestBody("sans-serif-condensed",
+                Typeface.BOLD,
+                R.drawable.condensedbold1);
     }
 
     @SmallTest
     public void testCondensedItalicFont() {
-        Typeface tf = Typeface.create("sans-serif-condensed", Typeface.ITALIC);
-        fontTestBody(tf, R.drawable.condenseditalic1);
+        fontTestBody("sans-serif-condensed",
+                Typeface.ITALIC,
+                R.drawable.condenseditalic1);
     }
 
     @SmallTest
     public void testCondensedBoldItalicFont() {
-        Typeface tf = Typeface.create("sans-serif-condensed", Typeface.BOLD | Typeface.ITALIC);
-        fontTestBody(tf, R.drawable.condensedbolditalic1);
+        fontTestBody("sans-serif-condensed",
+                Typeface.BOLD | Typeface.ITALIC,
+                R.drawable.condensedbolditalic1);
     }
 
     @SmallTest
     public void testCondensedLightFont() {
-        Typeface tf = Typeface.create("sans-serif-condensed-light", Typeface.NORMAL);
-        fontTestBody(tf, R.drawable.condensedlight1);
+        fontTestBody("sans-serif-condensed-light",
+                Typeface.NORMAL,
+                R.drawable.condensedlight1);
     }
 
     @SmallTest
     public void testCondensedLightItalicFont() {
-        Typeface tf = Typeface.create("sans-serif-condensed-light", Typeface.ITALIC);
-        fontTestBody(tf, R.drawable.condensedlightitalic1);
+        fontTestBody("sans-serif-condensed-light",
+                Typeface.ITALIC,
+                R.drawable.condensedlightitalic1);
     }
 }
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/InfrastructureTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/InfrastructureTests.java
index c86ff76..dfaaaea 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/InfrastructureTests.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/InfrastructureTests.java
@@ -75,7 +75,7 @@
         final Rect clipRect = new Rect(0, 0, 50, 50);
         ViewInitializer viewInitializer = new ViewInitializer() {
             @Override
-            public void intializeView(View view) {
+            public void initializeView(View view) {
                 view.setClipBounds(clipRect);
             }
         };
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/LayerTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/LayerTests.java
new file mode 100644
index 0000000..a5f76dd
--- /dev/null
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/LayerTests.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2015 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.uirendering.cts.testclasses;
+
+import android.annotation.ColorInt;
+import android.graphics.Color;
+import android.graphics.ColorMatrix;
+import android.graphics.ColorMatrixColorFilter;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.uirendering.cts.bitmapverifiers.ColorVerifier;
+import android.uirendering.cts.testinfrastructure.ActivityTestBase;
+import android.uirendering.cts.testinfrastructure.ViewInitializer;
+import android.view.View;
+import com.android.cts.uirendering.R;
+
+public class LayerTests extends ActivityTestBase {
+    @SmallTest
+    public void testLayerPaintAlpha() {
+        // red channel full strength, other channels 75% strength
+        // (since 25% alpha red subtracts from them)
+        @ColorInt
+        final int expectedColor = Color.rgb(255, 191, 191);
+        createTest()
+                .addLayout(R.layout.simple_red_layout, new ViewInitializer() {
+                    @Override
+                    public void initializeView(View view) {
+                        // reduce alpha by 50%
+                        Paint paint = new Paint();
+                        paint.setAlpha(128);
+                        view.setLayerType(View.LAYER_TYPE_HARDWARE, paint);
+
+                        // reduce alpha by another 50% (ensuring two alphas combine correctly)
+                        view.setAlpha(0.5f);
+                    }
+                })
+                .runWithVerifier(new ColorVerifier(expectedColor));
+    }
+
+    @SmallTest
+    public void testLayerPaintColorFilter() {
+        // Red, fully desaturated. Note that it's not 255/3 in each channel.
+        // See ColorMatrix#setSaturation()
+        @ColorInt
+        final int expectedColor = Color.rgb(54, 54, 54);
+        createTest()
+                .addLayout(R.layout.simple_red_layout, new ViewInitializer() {
+                    @Override
+                    public void initializeView(View view) {
+                        Paint paint = new Paint();
+                        ColorMatrix desatMatrix = new ColorMatrix();
+                        desatMatrix.setSaturation(0.0f);
+                        paint.setColorFilter(new ColorMatrixColorFilter(desatMatrix));
+                        view.setLayerType(View.LAYER_TYPE_HARDWARE, paint);
+                    }
+                })
+                .runWithVerifier(new ColorVerifier(expectedColor));
+    }
+
+    @SmallTest
+    public void testLayerPaintBlend() {
+        // Red, drawn underneath opaque white, so output should be white.
+        // TODO: consider doing more interesting blending test here
+        @ColorInt
+        final int expectedColor = Color.WHITE;
+        createTest()
+                .addLayout(R.layout.simple_red_layout, new ViewInitializer() {
+                    @Override
+                    public void initializeView(View view) {
+                        Paint paint = new Paint();
+                        /* Note that when drawing in SW, we're blending within an otherwise empty
+                         * SW layer, as opposed to in the frame buffer (which has a white
+                         * background).
+                         *
+                         * For this reason we use just use DST, which just throws out the SRC
+                         * content, regardless of the DST alpha channel.
+                         */
+                        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST));
+                        view.setLayerType(View.LAYER_TYPE_HARDWARE, paint);
+                    }
+                })
+                .runWithVerifier(new ColorVerifier(expectedColor));
+    }
+}
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/PathClippingTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/PathClippingTests.java
index 6911cf0..2726dac 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/PathClippingTests.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/PathClippingTests.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2015 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.uirendering.cts.testclasses;
 
 import android.graphics.Canvas;
@@ -14,14 +30,15 @@
 import android.uirendering.cts.testinfrastructure.ViewInitializer;
 import android.view.View;
 import android.view.ViewGroup;
+import android.webkit.WebView;
 import com.android.cts.uirendering.R;
 
 public class PathClippingTests extends ActivityTestBase {
     // draw circle with hole in it, with stroked circle
-    static final CanvasClient sCircleDrawCanvasClient = new CanvasClient() {
+    static final CanvasClient sTorusDrawCanvasClient = new CanvasClient() {
         @Override
         public String getDebugString() {
-            return "StrokedCircleDraw";
+            return "TorusDraw";
         }
 
         @Override
@@ -36,10 +53,10 @@
     };
 
     // draw circle with hole in it, by path operations + path clipping
-    static final CanvasClient sCircleClipCanvasClient = new CanvasClient() {
+    static final CanvasClient sTorusClipCanvasClient = new CanvasClient() {
         @Override
         public String getDebugString() {
-            return "CircleClipDraw";
+            return "TorusClipDraw";
         }
 
         @Override
@@ -60,15 +77,15 @@
     @SmallTest
     public void testCircleWithCircle() {
         createTest()
-                .addCanvasClient(sCircleDrawCanvasClient, false)
-                .addCanvasClient(sCircleClipCanvasClient)
+                .addCanvasClient(sTorusDrawCanvasClient, false)
+                .addCanvasClient(sTorusClipCanvasClient)
                 .runWithComparer(new MSSIMComparer(0.90));
     }
 
     @SmallTest
     public void testCircleWithPoints() {
         createTest()
-                .addCanvasClient(sCircleClipCanvasClient)
+                .addCanvasClient(sTorusClipCanvasClient)
                 .runWithVerifier(new SamplePointVerifier(
                         new Point[] {
                                 // inside of circle
@@ -92,7 +109,7 @@
         createTest()
                 .addLayout(R.layout.blue_padded_layout, new ViewInitializer() {
                     @Override
-                    public void intializeView(View view) {
+                    public void initializeView(View view) {
                         ViewGroup rootView = (ViewGroup) view;
                         rootView.setClipChildren(true);
                         View childView = rootView.getChildAt(0);
@@ -143,4 +160,29 @@
                 })
                 .runWithComparer(new MSSIMComparer(0.90));
     }
+
+    @SmallTest
+    public void testWebViewClipWithCircle() {
+        createTest()
+                // golden client - draw a simple non-AA circle
+                .addCanvasClient(new CanvasClient() {
+                    @Override
+                    public void draw(Canvas canvas, int width, int height) {
+                        Paint paint = new Paint();
+                        paint.setAntiAlias(false);
+                        paint.setColor(Color.BLUE);
+                        canvas.drawOval(0, 0, width, height, paint);
+                    }
+                }, false)
+                // verify against solid color webview, clipped to its parent oval
+                .addLayout(R.layout.circle_clipped_webview, new ViewInitializer() {
+                    @Override
+                    public void initializeView(View view) {
+                        WebView webview = (WebView)view.findViewById(R.id.webview);
+                        assertNotNull(webview);
+                        webview.loadData("<body style=\"background-color:blue\">", null, null);
+                    }
+                })
+                .runWithComparer(new MSSIMComparer(0.95));
+    }
 }
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/PictureTest.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/PictureTest.java
new file mode 100644
index 0000000..6619b11
--- /dev/null
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/PictureTest.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2015 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.uirendering.cts.testclasses;
+
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Picture;
+import android.graphics.Rect;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.uirendering.cts.bitmapverifiers.ColorVerifier;
+import android.uirendering.cts.bitmapverifiers.RectVerifier;
+import android.uirendering.cts.testinfrastructure.ActivityTestBase;
+import android.uirendering.cts.testinfrastructure.CanvasClient;
+
+public class PictureTest extends ActivityTestBase {
+
+    private static final Rect sRect = new Rect(0, 0, 40, 40);
+    private static final Rect sOffsetRect = new Rect(40, 0, 80, 40);
+
+    private static final Picture greenSquare() {
+        Paint pt = new Paint();
+        pt.setColor(Color.GREEN);
+        Picture pic = new Picture();
+        Canvas subcanvas = pic.beginRecording(ActivityTestBase.TEST_WIDTH,
+                                              ActivityTestBase.TEST_HEIGHT);
+        subcanvas.drawRect(sRect, pt);
+        pic.endRecording();
+
+        return pic;
+    }
+
+    public void testPictureRespectsClip() throws Exception {
+        createTest()
+            .addCanvasClient(
+                new CanvasClient() {
+                    @Override
+                    public void draw(Canvas canvas, int width, int height) {
+                        Picture pic = greenSquare();
+                        canvas.clipRect(sOffsetRect);
+                        pic.draw(canvas);  // should be clipped out
+                    }
+                }
+            ).runWithVerifier(new ColorVerifier(Color.WHITE));
+    }
+
+    public void testPictureRespectsTranslate() throws Exception {
+        createTest()
+            .addCanvasClient(
+                new CanvasClient() {
+                    @Override
+                    public void draw(Canvas canvas, int width, int height) {
+                        Picture pic = greenSquare();
+                        canvas.translate(40, 0);
+                        pic.draw(canvas);  // should be offset
+                    }
+                }
+            ).runWithVerifier(
+                new RectVerifier(Color.WHITE, Color.GREEN, sOffsetRect));
+    }
+}
+
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ShaderTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ShaderTests.java
new file mode 100644
index 0000000..85764a6
--- /dev/null
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ShaderTests.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2015 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.uirendering.cts.testclasses;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapShader;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ComposeShader;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.RadialGradient;
+import android.graphics.Shader;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.uirendering.cts.bitmapcomparers.MSSIMComparer;
+import android.uirendering.cts.bitmapverifiers.ColorVerifier;
+import android.uirendering.cts.testinfrastructure.ActivityTestBase;
+import android.uirendering.cts.testinfrastructure.CanvasClient;
+import com.android.cts.uirendering.R;
+
+public class ShaderTests extends ActivityTestBase {
+    @SmallTest
+    public void testSinglePixelBitmapShader() {
+        createTest()
+                .addCanvasClient(new CanvasClient() {
+                    Paint mPaint = new Paint();
+                    @Override
+                    public void draw(Canvas canvas, int width, int height) {
+                        if (mPaint.getShader() == null) {
+                            Bitmap shaderBitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
+                            shaderBitmap.eraseColor(Color.BLUE);
+                            mPaint.setShader(new BitmapShader(shaderBitmap,
+                                    Shader.TileMode.REPEAT, Shader.TileMode.REPEAT));
+                        }
+                        canvas.drawRect(0, 0, width, height, mPaint);
+                    }
+                })
+                .runWithVerifier(new ColorVerifier(Color.BLUE));
+    }
+
+    @SmallTest
+    public void testSinglePixelComposeShader() {
+        createTest()
+                .addCanvasClient(new CanvasClient() {
+                    Paint mPaint = new Paint();
+
+                    @Override
+                    public void draw(Canvas canvas, int width, int height) {
+                        if (mPaint.getShader() == null) {
+                            // BLUE as SRC for Compose
+                            Bitmap shaderBitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
+                            shaderBitmap.eraseColor(Color.BLUE);
+                            BitmapShader bitmapShader = new BitmapShader(shaderBitmap,
+                                    Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
+
+                            // Fully opaque gradient mask (via DST_IN).
+                            // In color array, only alpha channel will matter.
+                            RadialGradient gradientShader = new RadialGradient(
+                                    10, 10, 10,
+                                    new int[] { Color.RED, Color.GREEN, Color.BLUE }, null,
+                                    Shader.TileMode.CLAMP);
+
+                            mPaint.setShader(new ComposeShader(
+                                    bitmapShader, gradientShader, PorterDuff.Mode.DST_IN));
+                        }
+                        canvas.drawRect(0, 0, width, height, mPaint);
+                    }
+                })
+                .runWithVerifier(new ColorVerifier(Color.BLUE));
+    }
+
+    @SmallTest
+    public void testComplexShaderUsage() {
+        /*
+         * This test not only builds a very complex drawing operation, but also tests an
+         * implementation detail of HWUI, using the largest number of texture sample sources
+         * possible - 4.
+         *
+         * 1) Bitmap passed to canvas.drawBitmap
+         * 2) gradient color lookup
+         * 3) gradient dither lookup
+         * 4) Bitmap in BitmapShader
+          */
+        createTest()
+                .addCanvasClient(new CanvasClient() {
+                    Paint mPaint = new Paint();
+                    Bitmap mBitmap;
+
+                    @Override
+                    public void draw(Canvas canvas, int width, int height) {
+                        if (mBitmap == null) {
+                            mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8);
+                            // Primary content mask
+                            Canvas bitmapCanvas = new Canvas(mBitmap);
+                            final float radius = width / 2.0f;
+                            bitmapCanvas.drawCircle(width / 2, height / 2, radius, mPaint);
+
+                            // Bitmap shader mask, partially overlapping content
+                            Bitmap shaderBitmap = Bitmap.createBitmap(
+                                    width, height, Bitmap.Config.ALPHA_8);
+                            bitmapCanvas = new Canvas(shaderBitmap);
+                            bitmapCanvas.drawCircle(width / 2, 0, radius, mPaint);
+                            bitmapCanvas.drawCircle(width / 2, height, radius, mPaint);
+                            BitmapShader bitmapShader = new BitmapShader(shaderBitmap,
+                                    Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
+
+                            // Gradient fill
+                            RadialGradient gradientShader = new RadialGradient(
+                                    width / 2, height / 2, radius,
+                                    new int[] { Color.RED, Color.BLUE, Color.GREEN },
+                                    null, Shader.TileMode.CLAMP);
+
+                            mPaint.setShader(new ComposeShader(gradientShader, bitmapShader,
+                                    PorterDuff.Mode.DST_IN));
+                        }
+                        canvas.drawBitmap(mBitmap, 0, 0, mPaint);
+                    }
+                })
+                // expect extremely similar rendering results between SW and HW, since there's no AA
+                .runWithComparer(new MSSIMComparer(0.98f));
+    }
+}
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ShadowTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ShadowTests.java
new file mode 100644
index 0000000..2061023
--- /dev/null
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ShadowTests.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2015 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.uirendering.cts.testclasses;
+
+import android.graphics.Color;
+import android.graphics.Point;
+import android.uirendering.cts.bitmapverifiers.SamplePointVerifier;
+
+import com.android.cts.uirendering.R;
+
+import android.test.suitebuilder.annotation.SmallTest;
+import android.uirendering.cts.testinfrastructure.ActivityTestBase;
+
+public class ShadowTests extends ActivityTestBase {
+    @SmallTest
+    public void testShadowLayout() {
+        int shadowColorValue = 0xDB;
+        // Android TV theme overrides shadow opacity to be darker.
+        if (getActivity().getOnTv()) {
+            shadowColorValue = 0xBB;
+        }
+        SamplePointVerifier verifier = new SamplePointVerifier(
+                new Point[] {
+                        // view area
+                        new Point(25, 64),
+                        new Point(64, 64),
+                        // shadow area
+                        new Point(25, 65),
+                        new Point(64, 65)
+                },
+                new int[] {
+                        Color.WHITE,
+                        Color.WHITE,
+                        Color.rgb(shadowColorValue, shadowColorValue, shadowColorValue),
+                        Color.rgb(shadowColorValue, shadowColorValue, shadowColorValue),
+                });
+        createTest()
+                .addLayout(R.layout.simple_shadow_layout, null, true/* HW only */)
+                .runWithVerifier(verifier);
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/SweepTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/SweepTests.java
index 32ab0e4..71b4f3f 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/SweepTests.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/SweepTests.java
@@ -345,17 +345,6 @@
                 null, bitmapVerifiers);
     }
 
-    /*
-    @SmallTest
-    public void testShaderSweeps() {
-        int mask = DisplayModifier.Accessor.AA_MASK
-                | DisplayModifier.Accessor.SHADER_MASK
-                | DisplayModifier.Accessor.XFERMODE_MASK
-                | DisplayModifier.Accessor.SHAPES_MASK;
-        sweepModifiersForMask(mask, null, DEFAULT_MSSIM_COMPARER, null);
-    }
-    */
-
     protected void sweepModifiersForMask(int mask, final DisplayModifier drawOp,
             BitmapComparer[] bitmapComparers, BitmapVerifier[] bitmapVerifiers) {
         if ((mask & DisplayModifier.Accessor.ALL_OPTIONS_MASK) == 0) {
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ViewClippingTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ViewClippingTests.java
index 343228f..f1f7c99 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ViewClippingTests.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ViewClippingTests.java
@@ -28,13 +28,13 @@
 
     final ViewInitializer BOUNDS_CLIP_INIT = new ViewInitializer() {
         @Override
-        public void intializeView(View rootView) {
+        public void initializeView(View rootView) {
             ((ViewGroup)rootView).setClipChildren(true);
         }
     };
     final ViewInitializer PADDING_CLIP_INIT = new ViewInitializer() {
         @Override
-        public void intializeView(View rootView) {
+        public void initializeView(View rootView) {
             ViewGroup child = (ViewGroup) rootView.findViewById(R.id.child);
             child.setClipToPadding(true);
             child.setWillNotDraw(true);
@@ -43,7 +43,7 @@
     };
     final ViewInitializer OUTLINE_CLIP_INIT = new ViewInitializer() {
         @Override
-        public void intializeView(View rootView) {
+        public void initializeView(View rootView) {
             View child = rootView.findViewById(R.id.child);
             child.setOutlineProvider(new ViewOutlineProvider() {
                 @Override
@@ -56,7 +56,7 @@
     };
     final ViewInitializer CLIP_BOUNDS_CLIP_INIT = new ViewInitializer() {
         @Override
-        public void intializeView(View view) {
+        public void initializeView(View view) {
             view.setClipBounds(CLIP_BOUNDS_RECT);
         }
     };
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/view/CircleClipFrameLayout.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/view/CircleClipFrameLayout.java
new file mode 100644
index 0000000..4329c60
--- /dev/null
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/view/CircleClipFrameLayout.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2015 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.uirendering.cts.testclasses.view;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Path;
+import android.util.AttributeSet;
+import android.widget.FrameLayout;
+
+public class CircleClipFrameLayout extends FrameLayout {
+    final Path mClipPath = new Path();
+    public CircleClipFrameLayout(Context context) {
+        this(context, null);
+    }
+
+    public CircleClipFrameLayout(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public CircleClipFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+        this(context, attrs, defStyleAttr, 0);
+    }
+
+    public CircleClipFrameLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+    }
+
+    @Override
+    protected void dispatchDraw(Canvas canvas) {
+        canvas.save();
+
+        mClipPath.reset();
+        mClipPath.addOval(0, 0, getWidth(), getHeight(), Path.Direction.CW);
+        canvas.clipPath(mClipPath);
+        super.dispatchDraw(canvas);
+
+        canvas.restore();
+    }
+}
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/view/UnclippedBlueView.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/view/UnclippedBlueView.java
index b8935fb..900e14d 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/view/UnclippedBlueView.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/view/UnclippedBlueView.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2015 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.uirendering.cts.testclasses.view;
 
 import android.content.Context;
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java
index e1c09f5..526f4f9 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java
@@ -28,6 +28,8 @@
 import android.uirendering.cts.util.BitmapDumper;
 import android.util.Log;
 
+import android.support.test.InstrumentationRegistry;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -78,6 +80,10 @@
      */
     @Override
     public void setUp() {
+        // As the way to access Instrumentation is changed in the new runner, we need to inject it
+        // manually into ActivityInstrumentationTestCase2. ActivityInstrumentationTestCase2 will
+        // be marked as deprecated and replaced with ActivityTestRule.
+        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
         mDifferenceVisualizer = new PassFailVisualizer();
         if (USE_RS) {
             mRenderScript = RenderScript.create(getActivity().getApplicationContext());
@@ -257,6 +263,20 @@
             }
         }
 
+        /**
+         * Runs a test where each testcase is run without verification. Should only be used
+         * where custom CanvasClients, Views, or ViewInitializers do their own internal
+         * test assertions.
+         */
+        public void runWithoutVerification() {
+            runWithVerifier(new BitmapVerifier() {
+                @Override
+                public boolean verify(int[] bitmap, int offset, int stride, int width, int height) {
+                    return true;
+                }
+            });
+        }
+
         public TestCaseBuilder addWebView(String webViewUrl,
                 @Nullable ViewInitializer viewInitializer) {
             return addWebView(webViewUrl, viewInitializer, false)
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/DisplayModifier.java b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/DisplayModifier.java
index b42ac88..99a9ef6 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/DisplayModifier.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/DisplayModifier.java
@@ -519,14 +519,17 @@
             for (Map.Entry<String, LinkedHashMap<String, DisplayModifier>> entry :
                     mDisplayMap.entrySet()) {
                 int displayModifierIndex = mIndices[mapIndex];
-                mDebugString += "Modification : " + entry.getKey();
+                if (!mDebugString.isEmpty()) {
+                    mDebugString += ", ";
+                }
+                mDebugString += entry.getKey();
                 // Loop until we find the modification we are going to use
                 for (Map.Entry<String, DisplayModifier> modifierEntry :
                         entry.getValue().entrySet()) {
                     // Once we find the modification we want, then we will add it to the list,
                     // and the last applied modifications
                     if (displayModifierIndex == 0) {
-                        mDebugString += " value : " + modifierEntry.getKey() + " ";
+                        mDebugString += ": " + modifierEntry.getKey();
                         modifierArrayList.add(modifierEntry.getValue());
                         break;
                     }
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/DrawActivity.java b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/DrawActivity.java
index 4bd513a..d585f5f 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/DrawActivity.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/DrawActivity.java
@@ -17,6 +17,7 @@
 
 import android.annotation.Nullable;
 import android.app.Activity;
+import android.content.res.Configuration;
 import android.graphics.Point;
 import android.os.Bundle;
 import android.os.Handler;
@@ -38,12 +39,20 @@
 
     private Handler mHandler;
     private View mView;
+    private View mViewWrapper;
+    private boolean mOnTv;
 
     public void onCreate(Bundle bundle){
         super.onCreate(bundle);
         getWindow().getDecorView().setSystemUiVisibility(
                 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN);
         mHandler = new RenderSpecHandler();
+        int uiMode = getResources().getConfiguration().uiMode;
+        mOnTv = (uiMode & Configuration.UI_MODE_TYPE_TELEVISION) == Configuration.UI_MODE_TYPE_TELEVISION;
+    }
+
+    public boolean getOnTv() {
+        return mOnTv;
     }
 
     public Point enqueueRenderSpecAndWait(int layoutId, CanvasClient canvasClient, String webViewUrl,
@@ -85,6 +94,7 @@
             int drawCountDelay = 0;
             setContentView(R.layout.test_container);
             ViewStub stub = (ViewStub) findViewById(R.id.test_content_stub);
+            mViewWrapper = findViewById(R.id.test_content_wrapper);
             switch (message.what) {
                 case LAYOUT_MSG: {
                     stub.setLayoutResource(message.arg1);
@@ -111,9 +121,12 @@
             }
 
             if (mViewInitializer != null) {
-                mViewInitializer.intializeView(mView);
+                mViewInitializer.initializeView(mView);
             }
-            mView.setLayerType(message.arg2, null);
+
+            // set layer on wrapper parent of view, so view initializer
+            // can control layer type of View under test.
+            mViewWrapper.setLayerType(message.arg2, null);
 
             DrawCounterListener onDrawListener = new DrawCounterListener(drawCountDelay);
 
@@ -139,7 +152,7 @@
                 mView.postInvalidate();
             } else {
                 synchronized (mLock) {
-                    mLock.set(mView.getLeft(), mView.getTop());
+                    mLock.set(mViewWrapper.getLeft(), mViewWrapper.getTop());
                     mLock.notify();
                 }
                 mView.getViewTreeObserver().removeOnPreDrawListener(this);
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ViewInitializer.java b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ViewInitializer.java
index 8980df3..9a3cbb1 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ViewInitializer.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ViewInitializer.java
@@ -21,5 +21,5 @@
  * Called after a view is created to set various properties on the view
  */
 public abstract class ViewInitializer {
-    public abstract void intializeView(View view);
+    public abstract void initializeView(View view);
 }
diff --git a/tests/tests/util/src/android/util/cts/ArrayMapTest.java b/tests/tests/util/src/android/util/cts/ArrayMapTest.java
index 7fdd0da..130b354 100644
--- a/tests/tests/util/src/android/util/cts/ArrayMapTest.java
+++ b/tests/tests/util/src/android/util/cts/ArrayMapTest.java
@@ -310,7 +310,7 @@
 
     private static void dump(ArrayMap map1, ArrayMap map2) {
         Log.e("test", "ArrayMap of " + map1.size() + " entries:");
-        for (int i=0; i<map2.size(); i++) {
+        for (int i=0; i<map1.size(); i++) {
             Log.e("test", "    " + map1.keyAt(i) + " -> " + map1.valueAt(i));
         }
         Log.e("test", "ArrayMap of " + map2.size() + " entries:");
diff --git a/tests/tests/util/src/android/util/cts/ArraySetTest.java b/tests/tests/util/src/android/util/cts/ArraySetTest.java
new file mode 100644
index 0000000..112459c
--- /dev/null
+++ b/tests/tests/util/src/android/util/cts/ArraySetTest.java
@@ -0,0 +1,495 @@
+/*
+ * Copyright (C) 2015 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.util.cts;
+
+import android.test.AndroidTestCase;
+import android.util.ArraySet;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+// As is the case with ArraySet itself, ArraySetTest borrows heavily from ArrayMapTest.
+
+public class ArraySetTest extends AndroidTestCase {
+    private static final String TAG = "ArraySetTest";
+
+    private static final boolean DEBUG = false;
+
+    private static final int OP_ADD = 1;
+    private static final int OP_REM = 2;
+
+    private static int[] OPS = new int[] {
+            OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
+            OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
+            OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
+            OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
+
+            OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
+            OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
+
+            OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
+            OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
+
+            OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
+            OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
+
+            OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
+            OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD, OP_ADD,
+            OP_ADD, OP_ADD, OP_ADD,
+            OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
+            OP_REM, OP_REM, OP_REM,
+            OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM, OP_REM,
+    };
+
+    private static int[] KEYS = new int[] {
+            // General adding and removing.
+              -1,   1900,    600,    200,   1200,   1500,   1800,    100,   1900,
+            2100,    300,    800,    600,   1100,   1300,   2000,   1000,   1400,
+             600,     -1,   1900,    600,    300,   2100,    200,    800,    800,
+            1800,   1500,   1300,   1100,   2000,   1400,   1000,   1200,   1900,
+
+            // Shrink when removing item from end.
+             100,    200,    300,    400,    500,    600,    700,    800,    900,
+             900,    800,    700,    600,    500,    400,    300,    200,    100,
+
+            // Shrink when removing item from middle.
+             100,    200,    300,    400,    500,    600,    700,    800,    900,
+             900,    800,    700,    600,    500,    400,    200,    300,    100,
+
+            // Shrink when removing item from front.
+             100,    200,    300,    400,    500,    600,    700,    800,    900,
+             900,    800,    700,    600,    500,    400,    100,    200,    300,
+
+            // Test hash collisions.
+             105,    106,    108,    104,    102,    102,    107,      5,    205,
+               4,    202,    203,      3,      5,    101,    109,    200,    201,
+               0,     -1,    100,
+             106,    108,    104,    102,    103,    105,    107,    101,    109,
+              -1,    100,      0,
+               4,      5,      3,      5,    200,    203,    202,    201,    205,
+    };
+
+    public static class ControlledHash {
+        final int mValue;
+
+        ControlledHash(int value) {
+            mValue = value;
+        }
+
+        @Override
+        public final boolean equals(Object o) {
+            if (o == null) {
+                return false;
+            }
+            return mValue == ((ControlledHash)o).mValue;
+        }
+
+        @Override
+        public final int hashCode() {
+            return mValue/100;
+        }
+
+        @Override
+        public final String toString() {
+            return Integer.toString(mValue);
+        }
+    }
+
+    private static boolean compare(Object v1, Object v2) {
+        if (v1 == null) {
+            return v2 == null;
+        }
+        if (v2 == null) {
+            return false;
+        }
+        return v1.equals(v2);
+    }
+
+    private static <E> void compareSets(HashSet<E> set, ArraySet<E> array) {
+        assertEquals("Bad size", set.size(), array.size());
+
+        // Check that every entry in HashSet is in ArraySet.
+        for (E entry : set) {
+            assertTrue("ArraySet missing value: " + entry, array.contains(entry));
+        }
+
+        // Check that every entry in ArraySet is in HashSet using ArraySet.iterator().
+        for (E entry : array) {
+            assertTrue("ArraySet (via iterator) has unexpected value: " + entry,
+                    set.contains(entry));
+        }
+
+        // Check that every entry in ArraySet is in HashSet using ArraySet.valueAt().
+        for (int i = 0; i < array.size(); ++i) {
+            E entry = array.valueAt(i);
+            assertTrue("ArraySet (via valueAt) has unexpected value: " + entry,
+                    set.contains(entry));
+        }
+
+        if (set.hashCode() != array.hashCode()) {
+            assertEquals("Set hash codes differ", set.hashCode(), array.hashCode());
+        }
+
+        assertTrue("HashSet.equals(ArraySet) failed", set.equals(array));
+        assertTrue("ArraySet.equals(HashSet) failed", array.equals(set));
+
+        assertTrue("HashSet.containsAll(ArraySet) failed", set.containsAll(array));
+        assertTrue("ArraySet.containsAll(HashSet) failed", array.containsAll(set));
+    }
+
+    private static <E> void compareArraySetAndRawArray(ArraySet<E> arraySet, Object[] rawArray) {
+        assertEquals("Bad size", arraySet.size(), rawArray.length);
+        for (int i = 0; i < rawArray.length; ++i) {
+            assertEquals("ArraySet<E> and raw array unequal at index " + i,
+                    arraySet.valueAt(i), rawArray[i]);
+        }
+    }
+
+    private static <E> void validateArraySet(ArraySet<E> array) {
+        int index = 0;
+        Iterator<E> iter = array.iterator();
+        while (iter.hasNext()) {
+            E value = iter.next();
+            E realValue = array.valueAt(index);
+            if (!compare(realValue, value)) {
+                fail("Bad array set entry: expected " + realValue
+                        + ", got " + value + " at index " + index);
+            }
+            index++;
+        }
+
+        assertEquals("Length of iteration was unequal to size()", array.size(), index);
+    }
+
+    private static <E> void dump(HashSet<E> set, ArraySet<E> array) {
+        Log.e(TAG, "HashSet of " + set.size() + " entries:");
+        for (E entry : set) {
+            Log.e(TAG, "    " + entry);
+        }
+        Log.e(TAG, "ArraySet of " + array.size() + " entries:");
+        for (int i = 0; i < array.size(); i++) {
+            Log.e(TAG, "    " + array.valueAt(i));
+        }
+    }
+
+    private static void dump(ArraySet set1, ArraySet set2) {
+        Log.e(TAG, "ArraySet of " + set1.size() + " entries:");
+        for (int i = 0; i < set1.size(); i++) {
+            Log.e(TAG, "    " + set1.valueAt(i));
+        }
+        Log.e(TAG, "ArraySet of " + set2.size() + " entries:");
+        for (int i = 0; i < set2.size(); i++) {
+            Log.e(TAG, "    " + set2.valueAt(i));
+        }
+    }
+
+    public void testTest() {
+        assertEquals("OPS and KEYS must be equal length", OPS.length, KEYS.length);
+    }
+
+    public void testBasicArraySet() {
+        HashSet<ControlledHash> hashSet = new HashSet<ControlledHash>();
+        ArraySet<ControlledHash> arraySet = new ArraySet<ControlledHash>();
+
+        for (int i = 0; i < OPS.length; i++) {
+            ControlledHash key = KEYS[i] < 0 ? null : new ControlledHash(KEYS[i]);
+            String strKey = KEYS[i] < 0 ? null : Integer.toString(KEYS[i]);
+            switch (OPS[i]) {
+                case OP_ADD:
+                    if (DEBUG) Log.i(TAG, "Adding key: " + key);
+                    boolean hashAdded = hashSet.add(key);
+                    boolean arrayAdded = arraySet.add(key);
+                    assertEquals("Adding key " + key + " was not symmetric in HashSet and "
+                            + "ArraySet", hashAdded, arrayAdded);
+                    break;
+                case OP_REM:
+                    if (DEBUG) Log.i(TAG, "Removing key: " + key);
+                    boolean hashRemoved = hashSet.remove(key);
+                    boolean arrayRemoved = arraySet.remove(key);
+                    assertEquals("Removing key " + key + " was not symmetric in HashSet and "
+                            + "ArraySet", hashRemoved, arrayRemoved);
+                    break;
+                default:
+                    fail("Bad operation " + OPS[i] + " @ " + i);
+                    return;
+            }
+            if (DEBUG) dump(hashSet, arraySet);
+
+            try {
+                validateArraySet(arraySet);
+            } catch (Throwable e) {
+                Log.e(TAG, e.getMessage());
+                dump(hashSet, arraySet);
+                throw e;
+            }
+
+            try {
+                compareSets(hashSet, arraySet);
+            } catch (Throwable e) {
+                Log.e(TAG, e.getMessage());
+                dump(hashSet, arraySet);
+                throw e;
+            }
+        }
+
+        // Check to see if HashSet.iterator().remove() works as expected.
+        arraySet.add(new ControlledHash(50000));
+        ControlledHash lookup = new ControlledHash(50000);
+        Iterator<ControlledHash> it = arraySet.iterator();
+        while (it.hasNext()) {
+            if (it.next().equals(lookup)) {
+                it.remove();
+            }
+        }
+        if (arraySet.contains(lookup)) {
+            String msg = "Bad ArraySet iterator: didn't remove test key";
+            Log.e(TAG, msg);
+            dump(hashSet, arraySet);
+            fail(msg);
+        }
+
+        Log.e(TAG, "Test successful; printing final map.");
+        dump(hashSet, arraySet);
+    }
+
+    public void testCopyArraySet() {
+        // set copy constructor test
+        ArraySet newSet = new ArraySet<Integer>();
+        for (int i = 0; i < 10; ++i) {
+            newSet.add(i);
+        }
+
+        ArraySet copySet = new ArraySet(newSet);
+        if (!compare(copySet, newSet)) {
+            String msg = "ArraySet copy constructor failure: expected " +
+                    newSet + ", got " + copySet;
+            Log.e(TAG, msg);
+            dump(newSet, copySet);
+            fail(msg);
+            return;
+        }
+    }
+
+    public void testEqualsArrayMap() {
+        ArraySet<Integer> set1 = new ArraySet<Integer>();
+        ArraySet<Integer> set2 = new ArraySet<Integer>();
+        HashSet<Integer> set3 = new HashSet<Integer>();
+        if (!compare(set1, set2) || !compare(set1, set3) || !compare(set3, set2)) {
+            fail("ArraySet equals failure for empty sets " + set1 + ", " +
+                    set2 + ", " + set3);
+        }
+
+        for (int i = 0; i < 10; ++i) {
+            set1.add(i);
+            set2.add(i);
+            set3.add(i);
+        }
+        if (!compare(set1, set2) || !compare(set1, set3) || !compare(set3, set2)) {
+            fail("ArraySet equals failure for populated sets " + set1 + ", " +
+                    set2 + ", " + set3);
+        }
+
+        set1.remove(0);
+        if (compare(set1, set2) || compare(set1, set3) || compare(set3, set1)) {
+            fail("ArraySet equals failure for set size " + set1 + ", " +
+                    set2 + ", " + set3);
+        }
+    }
+
+    public void testIsEmpty() {
+        ArraySet<Integer> set = new ArraySet<Integer>();
+        assertEquals("New ArraySet should have size==0", 0, set.size());
+        assertTrue("New ArraySet should be isEmptry", set.isEmpty());
+
+        set.add(3);
+        assertEquals("ArraySet has incorrect size", 1, set.size());
+        assertFalse("ArraySet should not be isEmptry", set.isEmpty());
+
+        set.remove(3);
+        assertEquals("ArraySet should have size==0", 0, set.size());
+        assertTrue("ArraySet should be isEmptry", set.isEmpty());
+    }
+
+    public void testRemoveAt() {
+        ArraySet<Integer> set = new ArraySet<Integer>();
+
+        for (int i = 0; i < 10; ++i) {
+            set.add(i * 10);
+        }
+
+        int indexToDelete = 6;
+        assertEquals(10, set.size());
+        assertEquals(indexToDelete * 10, set.valueAt(indexToDelete).intValue());
+        assertEquals(indexToDelete * 10, set.removeAt(indexToDelete).intValue());
+        assertEquals(9, set.size());
+
+        for (int i = 0; i < 9; ++i) {
+            int expectedValue = ((i >= indexToDelete) ? (i + 1) : i) * 10;
+            assertEquals(expectedValue, set.valueAt(i).intValue());
+        }
+
+        for (int i = 9; i > 0; --i) {
+            set.removeAt(0);
+            assertEquals(i - 1, set.size());
+        }
+
+        assertTrue(set.isEmpty());
+
+        try {
+            set.removeAt(0);
+            fail("Expected ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException expected) {
+            // expected
+        }
+    }
+
+    public void testIndexOf() {
+        ArraySet<Integer> set = new ArraySet<Integer>();
+
+        for (int i = 0; i < 10; ++i) {
+            set.add(i * 10);
+        }
+
+        for (int i = 0; i < 10; ++i) {
+            assertEquals("indexOf(" + (i * 10) + ")", i, set.indexOf(i * 10));
+        }
+    }
+
+    public void testAddAll() {
+        ArraySet<Integer> arraySet = new ArraySet<Integer>();
+        ArraySet<Integer> testArraySet = new ArraySet<Integer>();
+        ArrayList<Integer> testArrayList = new ArrayList<Integer>();
+
+        for (int i = 0; i < 10; ++i) {
+            testArraySet.add(i * 10);
+            testArrayList.add(i * 10);
+        }
+
+        assertTrue(arraySet.isEmpty());
+
+        // addAll(ArraySet) has no return value.
+        arraySet.addAll(testArraySet);
+        assertTrue("ArraySet.addAll(ArraySet) failed", arraySet.containsAll(testArraySet));
+
+        arraySet.clear();
+        assertTrue(arraySet.isEmpty());
+
+        // addAll(Collection) returns true if any items were added.
+        assertTrue(arraySet.addAll(testArrayList));
+        assertTrue("ArraySet.addAll(Container) failed", arraySet.containsAll(testArrayList));
+        assertTrue("ArraySet.addAll(Container) failed", arraySet.containsAll(testArraySet));
+        // Adding the same Collection should return false.
+        assertFalse(arraySet.addAll(testArrayList));
+        assertTrue("ArraySet.addAll(Container) failed", arraySet.containsAll(testArrayList));
+    }
+
+    public void testRemoveAll() {
+        ArraySet<Integer> arraySet = new ArraySet<Integer>();
+        ArraySet<Integer> arraySetToRemove = new ArraySet<Integer>();
+        ArrayList<Integer> arrayListToRemove = new ArrayList<Integer>();
+
+        for (int i = 0; i < 10; ++i) {
+            arraySet.add(i * 10);
+        }
+
+        for (int i = 6; i < 15; ++i) {
+            arraySetToRemove.add(i * 10);
+        }
+
+        for (int i = 3; i > -3; --i) {
+            arrayListToRemove.add(i * 10);
+        }
+
+        assertEquals(10, arraySet.size());
+
+        // Remove [6,14] (really [6,9]) via another ArraySet.
+        assertTrue(arraySet.removeAll(arraySetToRemove));
+        assertEquals(6, arraySet.size());
+        assertFalse(arraySet.removeAll(arraySetToRemove));
+        assertEquals(6, arraySet.size());
+
+        // Remove [-2,3] (really [0,3]) via an ArrayList (ie Collection).
+        assertTrue(arraySet.removeAll(arrayListToRemove));
+        assertEquals(2, arraySet.size());
+        assertFalse(arraySet.removeAll(arrayListToRemove));
+        assertEquals(2, arraySet.size());
+
+        // Remove the rest of the items.
+        ArraySet<Integer> copy = new ArraySet<Integer>(arraySet);
+        assertTrue(arraySet.removeAll(copy));
+        assertEquals(0, arraySet.size());
+        assertFalse(arraySet.removeAll(copy));
+        assertEquals(0, arraySet.size());
+    }
+
+    public void testRetainAll() {
+        ArraySet<Integer> arraySet = new ArraySet<Integer>();
+        ArrayList<Integer> arrayListToRetain = new ArrayList<Integer>();
+
+        for (int i = 0; i < 10; ++i) {
+            arraySet.add(i * 10);
+        }
+
+        arrayListToRetain.add(30);
+        arrayListToRetain.add(50);
+        arrayListToRetain.add(51); // bogus value
+
+        assertEquals(10, arraySet.size());
+
+        assertTrue(arraySet.retainAll(arrayListToRetain));
+        assertEquals(2, arraySet.size());
+
+        assertTrue(arraySet.contains(30));
+        assertTrue(arraySet.contains(50));
+        assertFalse(arraySet.contains(51));
+
+        // Nothing should change.
+        assertFalse(arraySet.retainAll(arrayListToRetain));
+        assertEquals(2, arraySet.size());
+    }
+
+    public void testToArray() {
+        ArraySet<Integer> arraySet = new ArraySet<Integer>();
+        for (int i = 0; i < 10; ++i) {
+            arraySet.add(i * 10);
+        }
+
+        // Allocate a new array with the right type given a zero-length ephemeral array.
+        Integer[] copiedArray = arraySet.toArray(new Integer[0]);
+        compareArraySetAndRawArray(arraySet, copiedArray);
+
+        // Allocate a new array with the right type given an undersized array.
+        Integer[] undersizedArray = new Integer[5];
+        copiedArray = arraySet.toArray(undersizedArray);
+        compareArraySetAndRawArray(arraySet, copiedArray);
+        assertNotSame(undersizedArray, copiedArray);
+
+        // Use the passed array that is large enough to hold the ArraySet.
+        Integer[] rightSizedArray = new Integer[10];
+        copiedArray = arraySet.toArray(rightSizedArray);
+        compareArraySetAndRawArray(arraySet, copiedArray);
+        assertSame(rightSizedArray, copiedArray);
+
+        // Create a new Object[] array.
+        Object[] objectArray = arraySet.toArray();
+        compareArraySetAndRawArray(arraySet, objectArray);
+    }
+}
diff --git a/tests/tests/util/src/android/util/cts/EventLogTest.java b/tests/tests/util/src/android/util/cts/EventLogTest.java
index bbff3bc..2d856c4 100644
--- a/tests/tests/util/src/android/util/cts/EventLogTest.java
+++ b/tests/tests/util/src/android/util/cts/EventLogTest.java
@@ -37,21 +37,24 @@
         EventLog.writeEvent(ANSWER_TAG, markerData);
         EventLog.writeEvent(ANSWER_TAG, 12345);
         EventLog.writeEvent(ANSWER_TAG, 23456L);
+        EventLog.writeEvent(ANSWER_TAG, 42.4242f);
         EventLog.writeEvent(ANSWER_TAG, "Test");
-        EventLog.writeEvent(ANSWER_TAG, 12345, 23456L, "Test");
+        EventLog.writeEvent(ANSWER_TAG, 12345, 23456L, 42.4242f, "Test");
 
         List<EventLog.Event> events = getEventsAfterMarker(markerData, ANSWER_TAG);
-        assertEquals(4, events.size());
+        assertEquals(5, events.size());
         assertEquals(ANSWER_TAG, events.get(0).getTag());
         assertEquals(12345, events.get(0).getData());
         assertEquals(23456L, events.get(1).getData());
-        assertEquals("Test", events.get(2).getData());
+        assertEquals(42.4242f, events.get(2).getData());
+        assertEquals("Test", events.get(3).getData());
 
-        Object[] arr = (Object[]) events.get(3).getData();
-        assertEquals(3, arr.length);
+        Object[] arr = (Object[]) events.get(4).getData();
+        assertEquals(4, arr.length);
         assertEquals(12345, arr[0]);
         assertEquals(23456L, arr[1]);
-        assertEquals("Test", arr[2]);
+        assertEquals(42.4242f, arr[2]);
+        assertEquals("Test", arr[3]);
     }
 
     public void testWriteEventWithOversizeValue() throws Exception {
@@ -67,10 +70,11 @@
         EventLog.writeEvent(ANSWER_TAG, "hi", longString.toString());
         EventLog.writeEvent(ANSWER_TAG, 12345, longString.toString());
         EventLog.writeEvent(ANSWER_TAG, 12345L, longString.toString());
+        EventLog.writeEvent(ANSWER_TAG, 42.4242f, longString.toString());
         EventLog.writeEvent(ANSWER_TAG, longString.toString(), longString.toString());
         EventLog.writeEvent(ANSWER_TAG, longArray);
         List<Event> events = getEventsAfterMarker(markerData, ANSWER_TAG);
-        assertEquals(6, events.size());
+        assertEquals(7, events.size());
 
         // subtract: log header, type byte, final newline
         final int max = 4096 - 20 - 4 - 1;
@@ -97,15 +101,21 @@
         assertEquals(12345L, arr3[0]);
         assertEquals(max - 2 - 9 - 5, ((String) arr3[1]).length());
 
-        // subtract: array header, string header (second string is dropped entirely)
+        // subtract: array header, float, string header
         Object[] arr4 = (Object[]) events.get(4).getData();
-        assertEquals(1, arr4.length);
-        assertEquals(max - 2 - 5, ((String) arr4[0]).length());
+        assertEquals(2, arr4.length);
+        assertEquals(42.4242f, arr4[0]);
+        assertEquals(max - 2 - 5 - 5, ((String) arr4[1]).length());
 
+        // subtract: array header, string header (second string is dropped entirely)
         Object[] arr5 = (Object[]) events.get(5).getData();
-        assertEquals(255, arr5.length);
-        assertEquals(12345, arr5[0]);
-        assertEquals(12345, arr5[arr5.length - 1]);
+        assertEquals(1, arr5.length);
+        assertEquals(max - 2 - 5, ((String) arr5[0]).length());
+
+        Object[] arr6 = (Object[]) events.get(6).getData();
+        assertEquals(255, arr6.length);
+        assertEquals(12345, arr6[0]);
+        assertEquals(12345, arr6[arr6.length - 1]);
     }
 
     public void testWriteNullEvent() throws Exception {
diff --git a/tests/tests/util/src/android/util/cts/FloatMathTest.java b/tests/tests/util/src/android/util/cts/FloatMathTest.java
deleted file mode 100644
index 4d0b572..0000000
--- a/tests/tests/util/src/android/util/cts/FloatMathTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2008 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.util.cts;
-
-import junit.framework.TestCase;
-import android.util.FloatMath;
-
-public class FloatMathTest extends TestCase {
-    public void testFloatMathMethods() {
-        // ceil
-        assertEquals(8.0f, FloatMath.ceil(7.2f));
-        assertEquals(-6.0f, FloatMath.ceil(-6.3f));
-
-        // floor
-        assertEquals(7.0f, FloatMath.floor(7.2f));
-        assertEquals(-7.0f, FloatMath.floor(-6.3f));
-
-        // sin
-        assertEquals(-0.26237485f, FloatMath.sin(50));
-        assertEquals(-0.71487643f, FloatMath.sin(150));
-        assertEquals(0.26237485f, FloatMath.sin(-50));
-
-        // cos
-        assertEquals(0.964966f, FloatMath.cos(50));
-        assertEquals(0.69925081f, FloatMath.cos(150));
-        assertEquals(0.964966f, FloatMath.cos(-50));
-
-        // sqrt
-        assertEquals(5.0f, FloatMath.sqrt(25));
-    }
-
-}
diff --git a/tests/tests/view/AndroidManifest.xml b/tests/tests/view/AndroidManifest.xml
index a36e6fd..b7e0076 100644
--- a/tests/tests/view/AndroidManifest.xml
+++ b/tests/tests/view/AndroidManifest.xml
@@ -92,7 +92,7 @@
         </activity>
 
         <activity android:name="android.view.animation.cts.GridLayoutAnimCtsActivity"
-            android:label="GridLayoutAnimCtsActivity">
+            android:label="GridLayoutAnimCtsActivity" android:configChanges="orientation|screenSize">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
@@ -100,7 +100,7 @@
         </activity>
 
         <activity android:name="android.view.animation.cts.LayoutAnimCtsActivity"
-            android:label="LayoutAnimCtsActivity">
+            android:label="LayoutAnimCtsActivity" android:configChanges="orientation|screenSize">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
@@ -150,7 +150,11 @@
         <activity android:name="android.view.cts.GestureDetectorCtsActivity"
             android:label="GestureDetectorCtsActivity"
             android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
-            
+
+        <activity android:name="android.view.cts.ScaleGestureDetectorCtsActivity"
+            android:label="ScaleGestureDetectorCtsActivity"
+            android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
+
         <activity android:name="android.view.cts.GLSurfaceViewCtsActivity"
             android:label="GLSurfaceViewCts"/>
 
@@ -159,6 +163,10 @@
                 android:resource="@xml/merge" />
         </activity>
 
+        <activity android:name="android.view.cts.ActionModeCtsActivity"
+            android:label="ActionModeCtsActivity">
+        </activity>
+
         <activity android:name="android.view.cts.ViewGroupCtsActivity"
             android:label="WidgetViewGroupCtsActivity">
             <intent-filter>
@@ -167,6 +175,14 @@
             </intent-filter>
         </activity>
 
+        <activity android:name="android.view.cts.SearchEventActivity"
+            android:label="SearchEventActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
         <activity android:name="android.view.cts.CtsActivity"
             android:label="CtsActivity">
             <intent-filter>
diff --git a/tests/tests/view/res/layout/inflater_override_theme_layout.xml b/tests/tests/view/res/layout/inflater_override_theme_layout.xml
index 2d2a578..93a765b 100644
--- a/tests/tests/view/res/layout/inflater_override_theme_layout.xml
+++ b/tests/tests/view/res/layout/inflater_override_theme_layout.xml
@@ -43,4 +43,13 @@
             android:theme="?attr/themeOverrideAttr" />
     </LinearLayout>
 
+    <include
+        layout="@layout/single_view_layout"
+        android:id="@+id/view_include"
+        android:theme="@style/Theme_OverrideInclude" />
+
+    <include
+        layout="@layout/single_view_layout"
+        android:id="@+id/view_include_notheme" />
+
 </LinearLayout>
diff --git a/tests/tests/view/res/layout/single_view_layout.xml b/tests/tests/view/res/layout/single_view_layout.xml
new file mode 100644
index 0000000..5f66983
--- /dev/null
+++ b/tests/tests/view/res/layout/single_view_layout.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:theme="@style/Theme_OverrideView" />
diff --git a/tests/tests/view/res/layout/view_layout.xml b/tests/tests/view/res/layout/view_layout.xml
index fa817dc..b501a4d 100644
--- a/tests/tests/view/res/layout/view_layout.xml
+++ b/tests/tests/view/res/layout/view_layout.xml
@@ -21,7 +21,8 @@
     android:id="@+id/viewlayout_root"
     android:orientation="vertical"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    android:scrollIndicators="left|right">
 
     <android.view.cts.MockView
         android:id="@+id/mock_view"
@@ -34,6 +35,7 @@
         android:layout_height="200px"
         android:scrollbars="horizontal|vertical"
         android:fadingEdge="horizontal|vertical"
+        android:scrollIndicators="top|bottom"
         android:fadingEdgeLength="20px"/>
 
     <android.view.cts.MockView
diff --git a/tests/tests/view/res/values/styles.xml b/tests/tests/view/res/values/styles.xml
index 20c80f8..9de4abd 100644
--- a/tests/tests/view/res/values/styles.xml
+++ b/tests/tests/view/res/values/styles.xml
@@ -150,6 +150,14 @@
     <style name="Theme_OverrideAttr">
         <item name="themeType">3</item>
     </style>
+
+    <style name="Theme_OverrideInclude">
+        <item name="themeType">4</item>
+    </style>
+
+    <style name="Theme_OverrideView">
+        <item name="themeType">5</item>
+    </style>
     
     <style name="Theme_ThemedDrawableTest">
         <item name="themeBoolean">true</item>
diff --git a/tests/tests/view/res/xml/keyboard.xml b/tests/tests/view/res/xml/keyboard.xml
new file mode 100644
index 0000000..dd64cc0
--- /dev/null
+++ b/tests/tests/view/res/xml/keyboard.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2015, 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.
+*/
+-->
+
+<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
+    android:keyWidth="10%p"
+    android:horizontalGap="0px"
+    android:verticalGap="0px"
+    android:keyHeight="10px"
+    >
+
+    <Row>
+        <Key android:codes="-1" android:keyLabel="Sticky!"
+                android:isModifier="true" android:isSticky="true" />
+        <Key android:codes="120" android:keyLabel="x" />
+    </Row>
+</Keyboard>
diff --git a/tests/tests/view/src/android/view/cts/ActionModeCallback2Test.java b/tests/tests/view/src/android/view/cts/ActionModeCallback2Test.java
new file mode 100644
index 0000000..e75b7ae
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/ActionModeCallback2Test.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2015 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.view.cts;
+
+import android.graphics.Rect;
+import android.test.AndroidTestCase;
+import android.view.ActionMode;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+
+public class ActionModeCallback2Test extends AndroidTestCase {
+    private static final int VIEW_WIDTH = 123;
+    private static final int VIEW_HEIGHT = 456;
+
+    public void testCallbackOnGetContentRectDefaultWithView() {
+        View view = new View(mContext);
+        view.setLeft(0);
+        view.setRight(VIEW_WIDTH);
+        view.setTop(0);
+        view.setBottom(VIEW_HEIGHT);
+
+        Rect outRect = new Rect();
+        MockActionModeCallback2 callback = new MockActionModeCallback2();
+        callback.onGetContentRect(null, view, outRect);
+
+        assertEquals(0, outRect.top);
+        assertEquals(0, outRect.left);
+        assertEquals(VIEW_HEIGHT, outRect.bottom);
+        assertEquals(VIEW_WIDTH, outRect.right);
+    }
+
+    public void testCallbackOnGetContentRectDefaultWithoutView() {
+        Rect outRect = new Rect();
+        MockActionModeCallback2 callback = new MockActionModeCallback2();
+        callback.onGetContentRect(null, null, outRect);
+
+        assertEquals(0, outRect.top);
+        assertEquals(0, outRect.left);
+        assertEquals(0, outRect.bottom);
+        assertEquals(0, outRect.right);
+    }
+
+    private static class MockActionModeCallback2 extends ActionMode.Callback2 {
+        @Override
+        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+            return false;
+        }
+
+        @Override
+        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+            return false;
+        }
+
+        @Override
+        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+            return false;
+        }
+
+        @Override
+        public void onDestroyActionMode(ActionMode mode) {}
+    }
+
+}
diff --git a/tests/tests/view/src/android/view/cts/ActionModeCtsActivity.java b/tests/tests/view/src/android/view/cts/ActionModeCtsActivity.java
new file mode 100644
index 0000000..c03db59
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/ActionModeCtsActivity.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2015 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.view.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.FrameLayout;
+
+public class ActionModeCtsActivity extends Activity {
+
+    public View contentView;
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+
+        contentView = new FrameLayout(this);
+        setContentView(contentView);
+    }
+}
diff --git a/tests/tests/view/src/android/view/cts/ActionModeTest.java b/tests/tests/view/src/android/view/cts/ActionModeTest.java
new file mode 100644
index 0000000..534db311
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/ActionModeTest.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2015 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.view.cts;
+
+import android.graphics.Rect;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
+import android.view.ActionMode;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+
+public class ActionModeTest extends ActivityInstrumentationTestCase2<ActionModeCtsActivity> {
+
+    public ActionModeTest() {
+        super(ActionModeCtsActivity.class);
+    }
+
+    public void testSetType() {
+        ActionMode actionMode = new MockActionMode();
+        assertEquals(ActionMode.TYPE_PRIMARY, actionMode.getType());
+
+        actionMode.setType(ActionMode.TYPE_FLOATING);
+        assertEquals(ActionMode.TYPE_FLOATING, actionMode.getType());
+
+        actionMode.setType(ActionMode.TYPE_PRIMARY);
+        assertEquals(ActionMode.TYPE_PRIMARY, actionMode.getType());
+    }
+
+    public void testInvalidateContentRectDoesNotInvalidateFull() {
+        MockActionMode actionMode = new MockActionMode();
+
+        actionMode.invalidateContentRect();
+
+        assertFalse(actionMode.mInvalidateWasCalled);
+    }
+
+    public void testInvalidateContentRectOnFloatingCallsCallback() {
+        final View view = getActivity().contentView;
+        final MockActionModeCallback2 callback = new MockActionModeCallback2();
+
+        getActivity().runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                ActionMode mode = view.startActionMode(callback, ActionMode.TYPE_FLOATING);
+                assertNotNull(mode);
+                mode.invalidateContentRect();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+
+        assertTrue(callback.mIsOnGetContentRectCalled);
+    }
+
+    public void testSetAndGetTitleOptionalHint() {
+        MockActionMode actionMode = new MockActionMode();
+
+        // Check default value.
+        assertFalse(actionMode.getTitleOptionalHint());
+        // Test set and get.
+        actionMode.setTitleOptionalHint(true);
+        assertTrue(actionMode.getTitleOptionalHint());
+        actionMode.setTitleOptionalHint(false);
+        assertFalse(actionMode.getTitleOptionalHint());
+    }
+
+    public void testSetAndGetTag() {
+        MockActionMode actionMode = new MockActionMode();
+        Object tag = new Object();
+
+        // Check default value.
+        assertNull(actionMode.getTag());
+
+        actionMode.setTag(tag);
+        assertSame(tag, actionMode.getTag());
+    }
+
+    public void testIsTitleOptional() {
+        MockActionMode actionMode = new MockActionMode();
+
+        // Check default value.
+        assertFalse(actionMode.isTitleOptional());
+    }
+
+    public void testIsUiFocusable() {
+        MockActionMode actionMode = new MockActionMode();
+
+        // Check default value.
+        assertTrue(actionMode.isUiFocusable());
+    }
+
+    public void testHide() {
+        MockActionMode actionMode = new MockActionMode();
+
+        actionMode.hide(0);
+        actionMode.hide(ActionMode.DEFAULT_HIDE_DURATION);
+    }
+
+    public void testOnWindowFocusChanged() {
+        MockActionMode actionMode = new MockActionMode();
+
+        actionMode.onWindowFocusChanged(true);
+        actionMode.onWindowFocusChanged(false);
+    }
+
+    private static class MockActionModeCallback2 extends ActionMode.Callback2 {
+        boolean mIsOnGetContentRectCalled = false;
+
+        @Override
+        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+            return true;
+        }
+
+        @Override
+        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+            return true;
+        }
+
+        @Override
+        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+            return false;
+        }
+
+        @Override
+        public void onDestroyActionMode(ActionMode mode) {}
+
+        @Override
+        public void onGetContentRect(ActionMode mode, View view, Rect outRect) {
+            mIsOnGetContentRectCalled = true;
+            super.onGetContentRect(mode, view, outRect);
+        }
+    }
+
+    private static class MockActionMode extends ActionMode {
+        boolean mInvalidateWasCalled = false;
+
+        @Override
+        public void setTitle(CharSequence title) {}
+
+        @Override
+        public void setTitle(int resId) {}
+
+        @Override
+        public void setSubtitle(CharSequence subtitle) {}
+
+        @Override
+        public void setSubtitle(int resId) {}
+
+        @Override
+        public void setCustomView(View view) {}
+
+        @Override
+        public void invalidate() {
+            mInvalidateWasCalled = true;
+        }
+
+        @Override
+        public void finish() {}
+
+        @Override
+        public Menu getMenu() {
+            return null;
+        }
+
+        @Override
+        public CharSequence getTitle() {
+            return null;
+        }
+
+        @Override
+        public CharSequence getSubtitle() {
+            return null;
+        }
+
+        @Override
+        public View getCustomView() {
+            return null;
+        }
+
+        @Override
+        public MenuInflater getMenuInflater() {
+            return null;
+        }
+    }
+}
diff --git a/tests/tests/view/src/android/view/cts/ContextThemeWrapperTest.java b/tests/tests/view/src/android/view/cts/ContextThemeWrapperTest.java
index c40f095..012a13d 100644
--- a/tests/tests/view/src/android/view/cts/ContextThemeWrapperTest.java
+++ b/tests/tests/view/src/android/view/cts/ContextThemeWrapperTest.java
@@ -43,11 +43,11 @@
     }
 
     public void testConstructor() {
-        // new the ContextThemeWrapper instance
         new ContextThemeWrapper();
 
-        // new the ContextThemeWrapper instance
         new ContextThemeWrapper(getContext(), R.style.TextAppearance);
+
+        new ContextThemeWrapper(getContext(), getContext().getTheme());
     }
 
     public void testAccessTheme() {
diff --git a/tests/tests/view/src/android/view/cts/GestureDetectorCtsActivity.java b/tests/tests/view/src/android/view/cts/GestureDetectorCtsActivity.java
index f02a0d6..1c02a89 100644
--- a/tests/tests/view/src/android/view/cts/GestureDetectorCtsActivity.java
+++ b/tests/tests/view/src/android/view/cts/GestureDetectorCtsActivity.java
@@ -25,6 +25,7 @@
 import android.view.ViewGroup;
 import android.view.GestureDetector.SimpleOnGestureListener;
 import android.view.View.OnTouchListener;
+import android.view.View.OnGenericMotionListener;
 import android.widget.Button;
 
 public class GestureDetectorCtsActivity extends Activity {
@@ -38,6 +39,7 @@
     public boolean onDoubleTap;
     public boolean onDoubleTapEvent;
     public boolean onSingleTapConfirmed;
+    public boolean onContextClick;
 
     private GestureDetector mGestureDetector;
     private MockOnGestureListener mOnGestureListener;
@@ -56,6 +58,7 @@
 
         mGestureDetector = new GestureDetector(this, mOnGestureListener, mHandler);
         mGestureDetector.setOnDoubleTapListener(mOnGestureListener);
+        mGestureDetector.setContextClickListener(mOnGestureListener);
         mView = new View(this);
         mButton = new Button(this);
         mTop = new Button(this);
@@ -86,7 +89,13 @@
         return mGestureDetector;
     }
 
+    public MockOnGestureListener getListener() {
+        return mOnGestureListener;
+    }
+
     public class MockOnGestureListener extends SimpleOnGestureListener {
+        private MotionEvent mPreviousContextClickEvent;
+
         public boolean onDown(MotionEvent e) {
             isDown = true;
             return true;
@@ -129,14 +138,29 @@
             onSingleTapConfirmed = true;
             return false;
         }
+
+        public boolean onContextClick(MotionEvent e) {
+            onContextClick = true;
+            mPreviousContextClickEvent = e;
+            return false;
+        }
+
+        public MotionEvent getPreviousContextClickEvent() {
+            return mPreviousContextClickEvent;
+        }
     }
 
-    class MockOnTouchListener implements OnTouchListener {
+    class MockOnTouchListener implements OnTouchListener, OnGenericMotionListener {
 
         public boolean onTouch(View v, MotionEvent event) {
             mGestureDetector.onTouchEvent(event);
             return true;
         }
+
+        public boolean onGenericMotion(View v, MotionEvent event) {
+            mGestureDetector.onGenericMotionEvent(event);
+            return true;
+        }
     }
 
 }
diff --git a/tests/tests/view/src/android/view/cts/GestureDetectorTest.java b/tests/tests/view/src/android/view/cts/GestureDetectorTest.java
index c568cf1..f06455d 100644
--- a/tests/tests/view/src/android/view/cts/GestureDetectorTest.java
+++ b/tests/tests/view/src/android/view/cts/GestureDetectorTest.java
@@ -19,18 +19,31 @@
 import android.content.Context;
 import android.os.Handler;
 import android.os.Looper;
+import android.os.SystemClock;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.UiThreadTest;
+import android.view.cts.GestureDetectorCtsActivity.MockOnGestureListener;
 import android.view.GestureDetector;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
 import android.view.GestureDetector.SimpleOnGestureListener;
 
 public class GestureDetectorTest extends
         ActivityInstrumentationTestCase2<GestureDetectorCtsActivity> {
 
+    private static final float X_3F = 3.0f;
+    private static final float Y_4F = 4.0f;
+
     private GestureDetector mGestureDetector;
     private GestureDetectorCtsActivity mActivity;
+    private MockOnGestureListener mListener;
     private Context mContext;
 
+    private long mDownTime;
+    private long mEventTime;
+    private MotionEvent mButtonPressPrimaryMotionEvent;
+    private MotionEvent mButtonPressSecondaryMotionEvent;
+
     public GestureDetectorTest() {
         super("com.android.cts.view", GestureDetectorCtsActivity.class);
     }
@@ -40,6 +53,7 @@
         super.setUp();
         mActivity = getActivity();
         mGestureDetector = mActivity.getGestureDetector();
+        mListener = mActivity.getListener();
         mContext = getInstrumentation().getTargetContext();
         mActivity.isDown = false;
         mActivity.isScroll = false;
@@ -50,6 +64,17 @@
         mActivity.onDoubleTap = false;
         mActivity.onDoubleTapEvent = false;
         mActivity.onSingleTapConfirmed = false;
+        mActivity.onContextClick = false;
+
+        mDownTime = SystemClock.uptimeMillis();
+        mEventTime = SystemClock.uptimeMillis();
+        mButtonPressPrimaryMotionEvent = MotionEvent.obtain(mDownTime, mEventTime,
+                MotionEvent.ACTION_BUTTON_PRESS, X_3F, Y_4F, 0);
+        mButtonPressPrimaryMotionEvent.setActionButton(MotionEvent.BUTTON_STYLUS_PRIMARY);
+
+        mButtonPressSecondaryMotionEvent = MotionEvent.obtain(mDownTime, mEventTime,
+                MotionEvent.ACTION_BUTTON_PRESS, X_3F, Y_4F, 0);
+        mButtonPressSecondaryMotionEvent.setActionButton(MotionEvent.BUTTON_SECONDARY);
     }
 
     @UiThreadTest
@@ -75,4 +100,35 @@
         mGestureDetector.setIsLongpressEnabled(false);
         assertFalse(mGestureDetector.isLongpressEnabled());
     }
+
+    public void testOnSetContextClickListener() {
+        mActivity.onContextClick = false;
+        mGestureDetector.setContextClickListener(null);
+        mGestureDetector.onGenericMotionEvent(mButtonPressPrimaryMotionEvent);
+        assertFalse(mActivity.onContextClick);
+
+        mGestureDetector.setContextClickListener(mListener);
+        mGestureDetector.onGenericMotionEvent(mButtonPressPrimaryMotionEvent);
+        assertTrue(mActivity.onContextClick);
+        assertSame(mButtonPressPrimaryMotionEvent, mListener.getPreviousContextClickEvent());
+    }
+
+    public void testOnContextClick() {
+        mActivity.onContextClick = false;
+        mListener.onContextClick(mButtonPressPrimaryMotionEvent);
+        assertTrue(mActivity.onContextClick);
+        assertSame(mButtonPressPrimaryMotionEvent, mListener.getPreviousContextClickEvent());
+
+        mActivity.onContextClick = false;
+        mGestureDetector.onGenericMotionEvent(mButtonPressSecondaryMotionEvent);
+        assertTrue(mActivity.onContextClick);
+        assertSame(mButtonPressSecondaryMotionEvent, mListener.getPreviousContextClickEvent());
+    }
+
+    public void testOnGenericMotionEvent() {
+        mActivity.onContextClick = false;
+        mGestureDetector.onGenericMotionEvent(mButtonPressPrimaryMotionEvent);
+        assertTrue(mActivity.onContextClick);
+        assertSame(mButtonPressPrimaryMotionEvent, mListener.getPreviousContextClickEvent());
+    }
 }
diff --git a/tests/tests/view/src/android/view/cts/LayoutInflaterTest.java b/tests/tests/view/src/android/view/cts/LayoutInflaterTest.java
index bf83086..00b9fe9 100644
--- a/tests/tests/view/src/android/view/cts/LayoutInflaterTest.java
+++ b/tests/tests/view/src/android/view/cts/LayoutInflaterTest.java
@@ -17,7 +17,7 @@
 package android.view.cts;
 
 import com.android.cts.view.R;
-import com.android.internal.util.XmlUtils;
+import android.view.cts.util.XmlUtils;
 
 import org.xmlpull.v1.XmlPullParser;
 
@@ -29,7 +29,6 @@
 import android.content.res.Resources.Theme;
 import android.content.res.XmlResourceParser;
 import android.test.AndroidTestCase;
-import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.util.TypedValue;
 import android.util.Xml;
@@ -370,6 +369,8 @@
         verifyThemeType(container, "view_outer", R.id.view_outer, 1);
         verifyThemeType(container, "view_inner", R.id.view_inner, 2);
         verifyThemeType(container, "view_attr", R.id.view_attr, 3);
+        verifyThemeType(container, "view_include", R.id.view_include, 4);
+        verifyThemeType(container, "view_include_notheme", R.id.view_include_notheme, 5);
     }
 
     private void verifyThemeType(View container, String tag, int id, int type) {
diff --git a/tests/tests/view/src/android/view/cts/MenuInflaterTest.java b/tests/tests/view/src/android/view/cts/MenuInflaterTest.java
index 6007730..7e3517f 100644
--- a/tests/tests/view/src/android/view/cts/MenuInflaterTest.java
+++ b/tests/tests/view/src/android/view/cts/MenuInflaterTest.java
@@ -17,10 +17,8 @@
 package android.view.cts;
 
 import com.android.cts.view.R;
-import com.android.internal.view.menu.MenuBuilder;
 
 import android.app.Activity;
-import android.content.Context;
 import android.content.res.Resources;
 import android.cts.util.WidgetTestUtils;
 import android.graphics.Bitmap;
@@ -31,6 +29,7 @@
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.SubMenu;
+import android.widget.PopupMenu;
 
 /**
  * Test {@link MenuInflater}.
@@ -50,6 +49,10 @@
         mActivity = getActivity();
     }
 
+    private Menu createMenu(Activity context) {
+        return new PopupMenu(context, null).getMenu();
+    }
+
     @UiThreadTest
     public void testConstructor() {
         new MenuInflater(mActivity);
@@ -57,7 +60,7 @@
 
     @UiThreadTest
     public void testInflate() {
-        Menu menu = new MenuBuilder(mActivity);
+        Menu menu = createMenu(mActivity);
         assertEquals(0, menu.size());
 
         if (mMenuInflater == null) {
@@ -89,7 +92,7 @@
         }
 
         // the visibility and shortcut
-        Menu menu = new MenuBuilder(mActivity);
+        Menu menu = createMenu(mActivity);
         mMenuInflater.inflate(R.menu.visible_shortcut, menu);
 
         assertTrue(menu.findItem(R.id.visible_item).isVisible());
@@ -103,7 +106,7 @@
         assertEquals('c', menu.findItem(R.id.hidden_by_group).getAlphabeticShortcut());
 
         // the titles and icons
-        menu = new MenuBuilder(mActivity);
+        menu = createMenu(mActivity);
         mMenuInflater.inflate(com.android.cts.view.R.menu.title_icon, menu);
 
         assertEquals("Start", menu.findItem(R.id.start).getTitle());
@@ -119,7 +122,7 @@
                 R.drawable.failed);
 
         // the orders and categories
-        menu = new MenuBuilder(mActivity);
+        menu = createMenu(mActivity);
         mMenuInflater.inflate(com.android.cts.view.R.menu.category_order, menu);
         // default category
         assertEquals(R.id.most_used_items, menu.findItem(R.id.first_most_item).getGroupId());
@@ -143,7 +146,7 @@
         assertEquals(Menu.CATEGORY_SECONDARY + 4, menu.findItem(R.id.last_least_item).getOrder());
 
         // the checkables
-        menu = new MenuBuilder(mActivity);
+        menu = createMenu(mActivity);
         mMenuInflater.inflate(com.android.cts.view.R.menu.checkable, menu);
         // noncheckables
         assertEquals(R.id.noncheckable_group,
diff --git a/tests/tests/view/src/android/view/cts/MockTextView.java b/tests/tests/view/src/android/view/cts/MockTextView.java
index dc9420d..0c73614 100644
--- a/tests/tests/view/src/android/view/cts/MockTextView.java
+++ b/tests/tests/view/src/android/view/cts/MockTextView.java
@@ -179,19 +179,19 @@
     }
 
     public int getFrameLeft() {
-        return mLeft;
+        return getLeft();
     }
 
     public int getFrameTop() {
-        return mTop;
+        return getTop();
     }
 
     public int getFrameRight() {
-        return mRight;
+        return getRight();
     }
 
     public int getFrameBottom() {
-        return mBottom;
+        return getBottom();
     }
 
     public int getBottomPaddingOffset() {
diff --git a/tests/tests/view/src/android/view/cts/MockView.java b/tests/tests/view/src/android/view/cts/MockView.java
index 9093089..579d4fb 100644
--- a/tests/tests/view/src/android/view/cts/MockView.java
+++ b/tests/tests/view/src/android/view/cts/MockView.java
@@ -29,6 +29,7 @@
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.View;
+import android.view.ViewGroup;
 import android.view.ViewParent;
 import android.view.ContextMenu.ContextMenuInfo;
 
@@ -104,8 +105,8 @@
         return mCalledInvalidate;
     }
 
-    public void setParent(ViewParent parent) {
-        mParent = parent;
+    public void setParent(ViewGroup parent) {
+        parent.addView(this);
     }
 
     public static int[] getEnabledStateSet() {
@@ -162,16 +163,6 @@
     }
 
     @Override
-    protected void initializeFadingEdge(TypedArray a) {
-        super.initializeFadingEdge(a);
-    }
-
-    @Override
-    protected void initializeScrollbars(TypedArray a) {
-        super.initializeScrollbars(a);
-    }
-
-    @Override
     protected int getHorizontalScrollbarHeight() {
         return super.getHorizontalScrollbarHeight();
     }
diff --git a/tests/tests/view/src/android/view/cts/ScaleGestureDetectorCtsActivity.java b/tests/tests/view/src/android/view/cts/ScaleGestureDetectorCtsActivity.java
new file mode 100644
index 0000000..606d536
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/ScaleGestureDetectorCtsActivity.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2015 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.view.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.ScaleGestureDetector;
+import android.view.ScaleGestureDetector.SimpleOnScaleGestureListener;
+
+public class ScaleGestureDetectorCtsActivity extends Activity {
+
+    private ScaleGestureDetector mScaleGestureDetector;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mScaleGestureDetector = new ScaleGestureDetector(this, new SimpleOnScaleGestureListener(),
+                new Handler());
+    }
+
+    public ScaleGestureDetector getScaleGestureDetector() {
+        return mScaleGestureDetector;
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/view/src/android/view/cts/ScaleGestureDetectorTest.java b/tests/tests/view/src/android/view/cts/ScaleGestureDetectorTest.java
new file mode 100644
index 0000000..b8ba200
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/ScaleGestureDetectorTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2015 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.view.cts;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
+import android.view.ScaleGestureDetector;
+import android.view.ScaleGestureDetector.SimpleOnScaleGestureListener;
+
+public class ScaleGestureDetectorTest extends
+        ActivityInstrumentationTestCase2<ScaleGestureDetectorCtsActivity> {
+
+    private ScaleGestureDetector mScaleGestureDetector;
+    private ScaleGestureDetectorCtsActivity mActivity;
+    private Context mContext;
+
+    public ScaleGestureDetectorTest() {
+        super("com.android.cts.view", ScaleGestureDetectorCtsActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+        mScaleGestureDetector = mActivity.getScaleGestureDetector();
+        mContext = getInstrumentation().getTargetContext();
+    }
+
+    @UiThreadTest
+    public void testConstructor() {
+        new ScaleGestureDetector(
+                mContext, new SimpleOnScaleGestureListener(), new Handler(Looper.getMainLooper()));
+        new ScaleGestureDetector(mContext, new SimpleOnScaleGestureListener());
+    }
+
+    public void testAccessStylusScaleEnabled() {
+        assertTrue(mScaleGestureDetector.isStylusScaleEnabled());
+        mScaleGestureDetector.setStylusScaleEnabled(true);
+
+        mScaleGestureDetector.setStylusScaleEnabled(false);
+        assertFalse(mScaleGestureDetector.isStylusScaleEnabled());
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/view/src/android/view/cts/SearchEventActivity.java b/tests/tests/view/src/android/view/cts/SearchEventActivity.java
new file mode 100644
index 0000000..6cc8c85
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/SearchEventActivity.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2015 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.view.cts;
+
+import com.android.cts.view.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.SearchEvent;
+
+public class SearchEventActivity extends Activity {
+
+    private static SearchEvent mSearchEvent;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.windowstub_layout);
+    }
+
+    @Override
+    public boolean onSearchRequested() {
+        mSearchEvent = getSearchEvent();
+        return true;
+    }
+
+    public SearchEvent getTestSearchEvent() {
+        return mSearchEvent;
+    }
+
+    public void reset() {
+        mSearchEvent = null;
+    }
+}
diff --git a/tests/tests/view/src/android/view/cts/SearchEventTest.java b/tests/tests/view/src/android/view/cts/SearchEventTest.java
new file mode 100644
index 0000000..4df52a1
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/SearchEventTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2015 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.view.cts;
+
+import com.android.cts.view.R;
+
+import android.app.Instrumentation;
+import android.test.ActivityInstrumentationTestCase2;
+import android.view.InputDevice;
+import android.view.KeyEvent;
+import android.view.SearchEvent;
+
+public class SearchEventTest extends ActivityInstrumentationTestCase2<SearchEventActivity> {
+
+    private Instrumentation mInstrumentation;
+    private SearchEventActivity mActivity;
+
+    public SearchEventTest() {
+        super(SearchEventActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mInstrumentation = getInstrumentation();
+        mActivity = getActivity();
+    }
+
+    public void testTest() throws Exception {
+        mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_SEARCH);
+        SearchEvent se = mActivity.getTestSearchEvent();
+        assertNotNull(se);
+        InputDevice id = se.getInputDevice();
+        assertNotNull(id);
+        assertEquals(-1, id.getId());
+    }
+}
diff --git a/tests/tests/view/src/android/view/cts/ViewConfigurationTest.java b/tests/tests/view/src/android/view/cts/ViewConfigurationTest.java
index 38e9130..5fe4aea 100644
--- a/tests/tests/view/src/android/view/cts/ViewConfigurationTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewConfigurationTest.java
@@ -42,11 +42,17 @@
         ViewConfiguration.getTouchSlop();
         ViewConfiguration.getWindowTouchSlop();
         ViewConfiguration.getMinimumFlingVelocity();
+        ViewConfiguration.getMaximumFlingVelocity();
         ViewConfiguration.getMaximumDrawingCacheSize();
         ViewConfiguration.getZoomControlsTimeout();
         ViewConfiguration.getGlobalActionKeyTimeout();
         ViewConfiguration.getScrollFriction();
+        ViewConfiguration.getScrollBarFadeDuration();
+        ViewConfiguration.getScrollDefaultDelay();
         ViewConfiguration.getDoubleTapTimeout();
+        ViewConfiguration.getKeyRepeatTimeout();
+        ViewConfiguration.getKeyRepeatDelay();
+        ViewConfiguration.getDefaultActionModeHideDuration();
     }
 
     @SuppressWarnings("deprecation")
@@ -61,9 +67,14 @@
         vc.getScaledEdgeSlop();
         vc.getScaledFadingEdgeLength();
         vc.getScaledMaximumDrawingCacheSize();
+        vc.getScaledMaximumFlingVelocity();
         vc.getScaledMinimumFlingVelocity();
+        vc.getScaledOverflingDistance();
+        vc.getScaledOverscrollDistance();
+        vc.getScaledPagingTouchSlop();
         vc.getScaledScrollBarSize();
         vc.getScaledTouchSlop();
         vc.getScaledWindowTouchSlop();
+        vc.hasPermanentMenuKey();
     }
 }
diff --git a/tests/tests/view/src/android/view/cts/ViewGroupTest.java b/tests/tests/view/src/android/view/cts/ViewGroupTest.java
index f1064a7..7fc5579 100644
--- a/tests/tests/view/src/android/view/cts/ViewGroupTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewGroupTest.java
@@ -16,7 +16,7 @@
 
 package android.view.cts;
 
-import com.android.internal.util.XmlUtils;
+import android.view.cts.util.XmlUtils;
 
 
 import android.content.Context;
@@ -36,8 +36,12 @@
 import android.util.AttributeSet;
 import android.util.DisplayMetrics;
 import android.util.SparseArray;
+import android.view.ActionMode;
 import android.view.Display;
 import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
@@ -454,7 +458,7 @@
         MockTextView textView = new MockTextView(mContext);
         vg.addView(textView);
         vg.requestChildFocus(textView, null);
-        textView.setFrame(1, 1, 100, 100);
+        textView.layout(1, 1, 100, 100);
 
         assertTrue(vg.dispatchKeyEvent(event));
     }
@@ -525,7 +529,7 @@
         d.getMetrics(metrics);
         int screenWidth = metrics.widthPixels;
         int screenHeight = metrics.heightPixels;
-        vg.setFrame(0, 0, screenWidth, screenHeight);
+        vg.layout(0, 0, screenWidth, screenHeight);
         vg.setLayoutParams(new ViewGroup.LayoutParams(screenWidth, screenHeight));
 
         MockTextView textView = new MockTextView(mContext);
@@ -550,7 +554,7 @@
         assertFalse(vg.dispatchTouchEvent(me));
         assertNull(mMotionEvent);
 
-        textView.setFrame(0, 0, screenWidth, screenHeight);
+        textView.layout(0, 0, screenWidth, screenHeight);
         assertTrue(vg.dispatchTouchEvent(me));
         assertSame(me, mMotionEvent);
     }
@@ -564,7 +568,7 @@
 
         MockTextView textView = new MockTextView(mContext);
         vg.addView(textView);
-        textView.setFrame(1, 1, 100, 100);
+        textView.layout(1, 1, 100, 100);
         vg.requestChildFocus(textView, null);
         assertTrue(vg.dispatchTrackballEvent(me));
     }
@@ -575,7 +579,7 @@
         assertFalse(vg.dispatchUnhandledMove(textView, View.FOCUS_DOWN));
 
         vg.addView(textView);
-        textView.setFrame(1, 1, 100, 100);
+        textView.layout(1, 1, 100, 100);
         vg.requestChildFocus(textView, null);
         assertTrue(vg.dispatchUnhandledMove(textView, View.FOCUS_DOWN));
     }
@@ -765,13 +769,13 @@
         MockViewGroup vg = new MockViewGroup(mContext);
         MockTextView textView = new MockTextView(mContext);
 
-        textView.setFrame(1, 1, 100, 100);
+        textView.layout(1, 1, 100, 100);
         Rect rect = new Rect(1, 1, 50, 50);
         Point p = new Point();
         assertFalse(vg.getChildVisibleRect(textView, rect, p));
 
-        textView.setFrame(0, 0, 0, 0);
-        vg.setFrame(20, 20, 60, 60);
+        textView.layout(0, 0, 0, 0);
+        vg.layout(20, 20, 60, 60);
         rect = new Rect(10, 10, 40, 40);
         p = new Point();
         assertTrue(vg.getChildVisibleRect(textView, rect, p));
@@ -994,7 +998,7 @@
             // expected
         }
         vg.addView(textView);
-        textView.setFrame(1, 2, 3, 4);
+        textView.layout(1, 2, 3, 4);
         Rect rect = new Rect();
         vg.offsetDescendantRectToMyCoords(textView, rect);
         assertEquals(2, rect.bottom);
@@ -1005,7 +1009,7 @@
 
     public void testOffsetRectIntoDescendantCoords() {
         MockViewGroup vg = new MockViewGroup(mContext);
-        vg.setFrame(10, 20, 30, 40);
+        vg.layout(10, 20, 30, 40);
         MockTextView textView = new MockTextView(mContext);
 
         try {
@@ -1015,7 +1019,7 @@
         } catch (RuntimeException e) {
             // expected
         }
-        textView.setFrame(1, 2, 3, 4);
+        textView.layout(1, 2, 3, 4);
         vg.addView(textView);
 
         Rect rect = new Rect(5, 6, 7, 8);
@@ -1372,8 +1376,8 @@
 
         MockViewGroup vg = new MockViewGroup(mContext);
         MockTextView textView = new MockTextView(mContext);
-        textView.setFrame(1, 2, 30, 40);
-        vg.setFrame(1, 1, 100, 200);
+        textView.layout(1, 2, 30, 40);
+        vg.layout(1, 1, 100, 200);
         vg.setClipChildren(true);
 
         MockCanvas canvas = new MockCanvas(bitmap);
@@ -1430,7 +1434,7 @@
         final int frameRight = 100;
         final int frameBottom = 200;
         MockViewGroup vg = new MockViewGroup(mContext);
-        vg.setFrame(frameLeft, frameTop, frameRight, frameBottom);
+        vg.layout(frameLeft, frameTop, frameRight, frameBottom);
 
         vg.setClipToPadding(true);
         MockCanvas canvas = new MockCanvas();
@@ -1660,6 +1664,166 @@
         assertFalse(vg.isGetChildStaticTransformationCalled);
     }
 
+    public void testStartActionModeForChildRespectsSubclassModeOnPrimary() {
+        MockViewGroupSubclass vgParent = new MockViewGroupSubclass(mContext);
+        MockViewGroupSubclass vg = new MockViewGroupSubclass(mContext);
+        vg.shouldReturnOwnTypelessActionMode = true;
+        vgParent.addView(vg);
+        MockTextView textView = new MockTextView(mContext);
+        vg.addView(textView);
+
+        textView.startActionMode(NO_OP_ACTION_MODE_CALLBACK, ActionMode.TYPE_PRIMARY);
+
+        assertTrue(vg.isStartActionModeForChildTypedCalled);
+        assertTrue(vg.isStartActionModeForChildTypelessCalled);
+        // Call should not bubble up as we have an intercepting implementation.
+        assertFalse(vgParent.isStartActionModeForChildTypedCalled);
+    }
+
+    public void testStartActionModeForChildIgnoresSubclassModeOnFloating() {
+        MockViewGroupSubclass vgParent = new MockViewGroupSubclass(mContext);
+        MockViewGroupSubclass vg = new MockViewGroupSubclass(mContext);
+        vg.shouldReturnOwnTypelessActionMode = true;
+        vgParent.addView(vg);
+        MockTextView textView = new MockTextView(mContext);
+        vg.addView(textView);
+
+        textView.startActionMode(NO_OP_ACTION_MODE_CALLBACK, ActionMode.TYPE_FLOATING);
+
+        assertTrue(vg.isStartActionModeForChildTypedCalled);
+        assertFalse(vg.isStartActionModeForChildTypelessCalled);
+        // Call should bubble up as we have a floating type.
+        assertTrue(vgParent.isStartActionModeForChildTypedCalled);
+    }
+
+    public void testStartActionModeForChildTypedBubblesUpToParent() {
+        MockViewGroupSubclass vgParent = new MockViewGroupSubclass(mContext);
+        MockViewGroupSubclass vg = new MockViewGroupSubclass(mContext);
+        vgParent.addView(vg);
+        MockTextView textView = new MockTextView(mContext);
+        vg.addView(textView);
+
+        textView.startActionMode(NO_OP_ACTION_MODE_CALLBACK, ActionMode.TYPE_FLOATING);
+
+        assertTrue(vg.isStartActionModeForChildTypedCalled);
+        assertTrue(vgParent.isStartActionModeForChildTypedCalled);
+    }
+
+    public void testStartActionModeForChildTypelessBubblesUpToParent() {
+        MockViewGroupSubclass vgParent = new MockViewGroupSubclass(mContext);
+        MockViewGroupSubclass vg = new MockViewGroupSubclass(mContext);
+        vgParent.addView(vg);
+        MockTextView textView = new MockTextView(mContext);
+        vg.addView(textView);
+
+        textView.startActionMode(NO_OP_ACTION_MODE_CALLBACK);
+
+        assertTrue(vg.isStartActionModeForChildTypedCalled);
+        assertTrue(vg.isStartActionModeForChildTypelessCalled);
+        assertTrue(vgParent.isStartActionModeForChildTypedCalled);
+    }
+
+    private static final ActionMode.Callback NO_OP_ACTION_MODE_CALLBACK =
+            new ActionMode.Callback() {
+                @Override
+                public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+                    return false;
+                }
+
+                @Override
+                public void onDestroyActionMode(ActionMode mode) {}
+
+                @Override
+                public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+                    return false;
+                }
+
+                @Override
+                public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+                    return false;
+                }
+            };
+
+    private static final ActionMode NO_OP_ACTION_MODE =
+            new ActionMode() {
+                @Override
+                public void setTitle(CharSequence title) {}
+
+                @Override
+                public void setTitle(int resId) {}
+
+                @Override
+                public void setSubtitle(CharSequence subtitle) {}
+
+                @Override
+                public void setSubtitle(int resId) {}
+
+                @Override
+                public void setCustomView(View view) {}
+
+                @Override
+                public void invalidate() {}
+
+                @Override
+                public void finish() {}
+
+                @Override
+                public Menu getMenu() {
+                    return null;
+                }
+
+                @Override
+                public CharSequence getTitle() {
+                    return null;
+                }
+
+                @Override
+                public CharSequence getSubtitle() {
+                    return null;
+                }
+
+                @Override
+                public View getCustomView() {
+                    return null;
+                }
+
+                @Override
+                public MenuInflater getMenuInflater() {
+                    return null;
+                }
+            };
+
+    private static class MockViewGroupSubclass extends ViewGroup {
+        boolean isStartActionModeForChildTypedCalled = false;
+        boolean isStartActionModeForChildTypelessCalled = false;
+        boolean shouldReturnOwnTypelessActionMode = false;
+
+        public MockViewGroupSubclass(Context context) {
+            super(context);
+        }
+
+        @Override
+        public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback) {
+            isStartActionModeForChildTypelessCalled = true;
+            if (shouldReturnOwnTypelessActionMode) {
+                return NO_OP_ACTION_MODE;
+            }
+            return super.startActionModeForChild(originalView, callback);
+        }
+
+        @Override
+        public ActionMode startActionModeForChild(
+                View originalView, ActionMode.Callback callback, int type) {
+            isStartActionModeForChildTypedCalled = true;
+            return super.startActionModeForChild(originalView, callback, type);
+        }
+
+        @Override
+        protected void onLayout(boolean changed, int l, int t, int r, int b) {
+            // no-op
+        }
+    }
+
     static public int resetRtlPropertiesCount;
     static public int resetResolvedLayoutDirectionCount;
     static public int resetResolvedTextDirectionCount;
@@ -1747,11 +1911,6 @@
         }
 
         @Override
-        public boolean setFrame(int l, int t, int r, int b) {
-            return super.setFrame(l, t, r, b);
-        }
-
-        @Override
         public void dispatchRestoreInstanceState(
                 SparseArray<Parcelable> container) {
             isDispatchRestoreInstanceStateCalled = true;
@@ -1781,11 +1940,6 @@
         }
 
         @Override
-        public boolean gatherTransparentRegion(Region region) {
-            return false;
-        }
-
-        @Override
         public boolean dispatchTouchEvent(MotionEvent event) {
             super.dispatchTouchEvent(event);
             return true;
@@ -1998,21 +2152,6 @@
         }
 
         @Override
-        public boolean setFrame(int left, int top, int right, int bottom) {
-            return super.setFrame(left, top, right, bottom);
-        }
-
-        @Override
-        public boolean isChildrenDrawnWithCacheEnabled() {
-            return super.isChildrenDrawnWithCacheEnabled();
-        }
-
-        @Override
-        public void setChildrenDrawnWithCacheEnabled(boolean enabled) {
-            super.setChildrenDrawnWithCacheEnabled(enabled);
-        }
-
-        @Override
         public void measureChild(View child, int parentWidthMeasureSpec,
                 int parentHeightMeasureSpec) {
             measureChildCalledTime++;
@@ -2163,6 +2302,21 @@
             super.resetResolvedDrawables();
             resetResolvedDrawablesCount++;
         }
+
+        @Override
+        public boolean setFrame(int left, int top, int right, int bottom) {
+            return super.setFrame(left, top, right, bottom);
+        }
+
+        @Override
+        public void setChildrenDrawnWithCacheEnabled(boolean enabled) {
+            super.setChildrenDrawnWithCacheEnabled(enabled);
+        }
+
+        @Override
+        public boolean isChildrenDrawnWithCacheEnabled() {
+            return super.isChildrenDrawnWithCacheEnabled();
+        }
     }
 
     static class MockView2 extends View {
diff --git a/tests/tests/view/src/android/view/cts/ViewGroup_LayoutParamsTest.java b/tests/tests/view/src/android/view/cts/ViewGroup_LayoutParamsTest.java
index ded715a..5dadffd 100644
--- a/tests/tests/view/src/android/view/cts/ViewGroup_LayoutParamsTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewGroup_LayoutParamsTest.java
@@ -16,7 +16,7 @@
 
 package android.view.cts;
 
-import java.io.IOException;
+import com.android.cts.view.R;
 
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -27,10 +27,9 @@
 import android.util.AttributeSet;
 import android.view.ViewGroup;
 import android.view.ViewGroup.LayoutParams;
+import android.view.cts.util.XmlUtils;
 
-import com.android.cts.view.R;
-import com.android.internal.util.XmlUtils;
-
+import java.io.IOException;
 
 public class ViewGroup_LayoutParamsTest extends AndroidTestCase {
     private ViewGroup.LayoutParams mLayoutParams;
diff --git a/tests/tests/view/src/android/view/cts/ViewGroup_MarginLayoutParamsTest.java b/tests/tests/view/src/android/view/cts/ViewGroup_MarginLayoutParamsTest.java
index d3fed0d..e53cba2 100644
--- a/tests/tests/view/src/android/view/cts/ViewGroup_MarginLayoutParamsTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewGroup_MarginLayoutParamsTest.java
@@ -16,17 +16,16 @@
 
 package android.view.cts;
 
+import com.android.cts.view.R;
+
 import android.content.Context;
 import android.content.res.XmlResourceParser;
 import android.test.InstrumentationTestCase;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewGroup.MarginLayoutParams;
-
+import android.view.cts.util.XmlUtils;
 import android.widget.LinearLayout;
-import com.android.internal.util.XmlUtils;
-import com.android.cts.view.R;
-
 
 public class ViewGroup_MarginLayoutParamsTest extends InstrumentationTestCase {
 
@@ -90,7 +89,9 @@
     public void testSetMarginsRelative() {
         // create a new MarginLayoutParams instance
         mMarginLayoutParams = new ViewGroup.MarginLayoutParams(320, 480);
-        mMarginLayoutParams.setMarginsRelative(20, 30, 120, 140);
+        mMarginLayoutParams.setMargins(0, 30, 0, 140);
+        mMarginLayoutParams.setMarginStart(20);
+        mMarginLayoutParams.setMarginEnd(120);
         assertEquals(20, mMarginLayoutParams.getMarginStart());
         assertEquals(30, mMarginLayoutParams.topMargin);
         assertEquals(120, mMarginLayoutParams.getMarginEnd());
@@ -121,7 +122,9 @@
         assertEquals(false, mMarginLayoutParams.isMarginRelative());
 
         // LTR / relative margin case
-        mMarginLayoutParams.setMarginsRelative(20, 30, 120, 140);
+        mMarginLayoutParams.setMargins(0, 30, 0, 140);
+        mMarginLayoutParams.setMarginStart(20);
+        mMarginLayoutParams.setMarginEnd(120);
         vg.setLayoutParams(mMarginLayoutParams);
 
         assertEquals(20, mMarginLayoutParams.getMarginStart());
@@ -152,7 +155,9 @@
         assertEquals(false, mMarginLayoutParams.isMarginRelative());
 
         // RTL / relative margin case
-        mMarginLayoutParams.setMarginsRelative(20, 30, 120, 140);
+        mMarginLayoutParams.setMargins(0, 30, 0, 140);
+        mMarginLayoutParams.setMarginStart(20);
+        mMarginLayoutParams.setMarginEnd(120);
         vg.setLayoutParams(mMarginLayoutParams);
 
         assertEquals(20, mMarginLayoutParams.getMarginStart());
diff --git a/tests/tests/view/src/android/view/cts/ViewStubTest.java b/tests/tests/view/src/android/view/cts/ViewStubTest.java
index 53e251a..c9cd44b 100644
--- a/tests/tests/view/src/android/view/cts/ViewStubTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewStubTest.java
@@ -18,8 +18,6 @@
 
 import com.android.cts.view.R;
 
-import dalvik.annotation.KnownFailure;
-
 import org.xmlpull.v1.XmlPullParser;
 
 import android.app.Activity;
@@ -157,13 +155,16 @@
 
     public void testAccessInflatedId() {
         ViewStub viewStub = new ViewStub(mContext);
-        assertEquals(0, viewStub.getInflatedId());
+        assertEquals("Default ViewStub inflated ID is View.NO_ID",
+                View.NO_ID, viewStub.getInflatedId());
 
         viewStub.setInflatedId(R.id.inflated_id);
-        assertEquals(R.id.inflated_id, viewStub.getInflatedId());
+        assertEquals("Set ViewStub inflated ID to package resource ID",
+                R.id.inflated_id, viewStub.getInflatedId());
 
-        viewStub.setInflatedId(-1);
-        assertEquals(-1, viewStub.getInflatedId());
+        viewStub.setInflatedId(View.NO_ID);
+        assertEquals("Set ViewStub inflated ID to View.NO_ID",
+                View.NO_ID, viewStub.getInflatedId());
     }
 
     @UiThreadTest
diff --git a/tests/tests/view/src/android/view/cts/ViewTest.java b/tests/tests/view/src/android/view/cts/ViewTest.java
index ffbec1e..2c5b30a 100644
--- a/tests/tests/view/src/android/view/cts/ViewTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewTest.java
@@ -16,28 +16,26 @@
 
 package android.view.cts;
 
-import android.content.res.ColorStateList;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.ColorFilter;
-import android.graphics.PorterDuff;
-
-import android.os.Bundle;
 import com.android.cts.view.R;
 import com.android.internal.view.menu.ContextMenuBuilder;
-import com.google.android.collect.Lists;
 
 import android.content.Context;
+import android.content.res.ColorStateList;
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
 import android.cts.util.PollingCheck;
 import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorFilter;
 import android.graphics.Point;
+import android.graphics.PorterDuff;
 import android.graphics.Rect;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.StateListDrawable;
+import android.os.Bundle;
 import android.os.Parcelable;
 import android.os.SystemClock;
 import android.os.Vibrator;
@@ -56,12 +54,15 @@
 import android.view.HapticFeedbackConstants;
 import android.view.InputDevice;
 import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuInflater;
 import android.view.MotionEvent;
 import android.view.SoundEffectConstants;
 import android.view.TouchDelegate;
 import android.view.View;
 import android.view.View.BaseSavedState;
 import android.view.View.OnClickListener;
+import android.view.View.OnContextClickListener;
 import android.view.View.OnCreateContextMenuListener;
 import android.view.View.OnFocusChangeListener;
 import android.view.View.OnKeyListener;
@@ -248,6 +249,31 @@
         assertSame(parent, view.getParent());
     }
 
+    public void testAccessScrollIndicators() {
+        View view = mActivity.findViewById(R.id.viewlayout_root);
+
+        assertEquals(View.SCROLL_INDICATOR_LEFT | View.SCROLL_INDICATOR_RIGHT,
+                view.getScrollIndicators());
+    }
+
+    public void testSetScrollIndicators() {
+        View view = new View(mActivity);
+
+        view.setScrollIndicators(0);
+        assertEquals(0, view.getScrollIndicators());
+
+        view.setScrollIndicators(View.SCROLL_INDICATOR_LEFT | View.SCROLL_INDICATOR_RIGHT);
+        assertEquals(View.SCROLL_INDICATOR_LEFT | View.SCROLL_INDICATOR_RIGHT,
+                view.getScrollIndicators());
+
+        view.setScrollIndicators(View.SCROLL_INDICATOR_TOP, View.SCROLL_INDICATOR_TOP);
+        assertEquals(View.SCROLL_INDICATOR_LEFT | View.SCROLL_INDICATOR_RIGHT
+                        | View.SCROLL_INDICATOR_TOP, view.getScrollIndicators());
+
+        view.setScrollIndicators(0, view.getScrollIndicators());
+        assertEquals(0, view.getScrollIndicators());
+    }
+
     public void testFindViewById() {
         View parent = mActivity.findViewById(R.id.viewlayout_root);
         assertSame(parent, parent.findViewById(R.id.viewlayout_root));
@@ -398,7 +424,9 @@
         assertTrue(view.isLayoutRequested());
 
         view.setParent(mMockParent);
-        assertFalse(mMockParent.hasRequestLayout());
+        assertTrue(mMockParent.hasRequestLayout());
+
+        mMockParent.reset();
         view.requestLayout();
         assertTrue(view.isLayoutRequested());
         assertTrue(mMockParent.hasRequestLayout());
@@ -856,6 +884,18 @@
         assertFalse(view.isClickable());
     }
 
+    public void testAccessContextClickable() {
+        View view = new View(mActivity);
+
+        assertFalse(view.isContextClickable());
+
+        view.setContextClickable(true);
+        assertTrue(view.isContextClickable());
+
+        view.setContextClickable(false);
+        assertFalse(view.isContextClickable());
+    }
+
     public void testGetContextMenuInfo() {
         MockView view = new MockView(mActivity);
 
@@ -1104,8 +1144,8 @@
         mockView2.setParent(mMockParent);
 
         mMockParent.dispatchSetSelected(true);
-        assertFalse(mockView1.isSelected());
-        assertFalse(mockView2.isSelected());
+        assertTrue(mockView1.isSelected());
+        assertTrue(mockView2.isSelected());
 
         mMockParent.dispatchSetSelected(false);
         assertFalse(mockView1.isSelected());
@@ -1128,8 +1168,8 @@
         mockView2.setParent(mMockParent);
 
         mMockParent.dispatchSetPressed(true);
-        assertFalse(mockView1.isPressed());
-        assertFalse(mockView2.isPressed());
+        assertTrue(mockView1.isPressed());
+        assertTrue(mockView2.isPressed());
 
         mMockParent.dispatchSetPressed(false);
         assertFalse(mockView1.isPressed());
@@ -1216,7 +1256,7 @@
         assertFalse(view.fitSystemWindows(insets));
         assertFalse(view.fitSystemWindows(null));
 
-        view = new MockView(mActivity, attrs, com.android.internal.R.attr.fitsSystemWindows);
+        view = new MockView(mActivity, attrs, android.R.attr.fitsSystemWindows);
         assertFalse(view.fitSystemWindows(insets));
         assertFalse(view.fitSystemWindows(null));
     }
@@ -1290,6 +1330,31 @@
         assertTrue(view.isLongClickable());
     }
 
+    public void testPerformContextClick() {
+        MockView view = new MockView(mActivity);
+        view.setParent(mMockParent);
+        OnContextClickListenerImpl listener = new OnContextClickListenerImpl();
+
+        view.setOnContextClickListener(listener);
+        assertFalse(listener.hasOnContextClick());
+
+        assertTrue(view.performContextClick());
+        assertTrue(listener.hasOnContextClick());
+        assertSame(view, listener.getLastViewContextClicked());
+    }
+
+    public void testSetOnContextClickListener() {
+        MockView view = new MockView(mActivity);
+        view.setParent(mMockParent);
+
+        assertFalse(view.performContextClick());
+        assertFalse(view.isContextClickable());
+
+        view.setOnContextClickListener(new OnContextClickListenerImpl());
+        assertTrue(view.performContextClick());
+        assertTrue(view.isContextClickable());
+    }
+
     public void testAccessOnFocusChangeListener() {
         View view = new View(mActivity);
         OnFocusChangeListener listener = new OnFocusChangeListenerImpl();
@@ -2077,24 +2142,24 @@
         assertEquals(viewId, container.keyAt(0));
 
         container.clear();
-        container.put(viewId, new BaseSavedState(BaseSavedState.EMPTY_STATE));
+        container.put(viewId, new android.graphics.Rect());
         try {
             view.restoreHierarchyState(container);
-            fail("should throw IllegalArgumentException");
+            fail("Parcelable state must be an AbsSaveState, should throw IllegalArgumentException");
         } catch (IllegalArgumentException e) {
             // expected
         }
 
         try {
             view.restoreHierarchyState(null);
-            fail("should throw NullPointerException");
+            fail("Cannot pass null to restoreHierarchyState(), should throw NullPointerException");
         } catch (NullPointerException e) {
             // expected
         }
 
         try {
             view.saveHierarchyState(null);
-            fail("should throw NullPointerException");
+            fail("Cannot pass null to saveHierarchyState(), should throw NullPointerException");
         } catch (NullPointerException e) {
             // expected
         }
@@ -2434,7 +2499,6 @@
         assertFalse(view.hasCalledDrawableStateChanged());
         view.setPressed(true);
         assertTrue(view.hasCalledDrawableStateChanged());
-        assertFalse(view.hasCalledOnCreateDrawableState());
         assertTrue(Arrays.equals(MockView.getPressedEnabledStateSet(), view.getDrawableState()));
         assertTrue(view.hasCalledOnCreateDrawableState());
 
@@ -2445,7 +2509,6 @@
         view.refreshDrawableState();
         assertTrue(view.hasCalledDrawableStateChanged());
         assertTrue(mMockParent.hasChildDrawableStateChanged());
-        assertFalse(view.hasCalledOnCreateDrawableState());
         assertTrue(Arrays.equals(MockView.getPressedEnabledStateSet(), view.getDrawableState()));
         assertTrue(view.hasCalledOnCreateDrawableState());
     }
@@ -2992,16 +3055,13 @@
 
     @UiThreadTest
     public void testScrollbarStyle() {
-        MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
+        MockView view = (MockView) mActivity.findViewById(R.id.scroll_view);
         Bitmap bitmap = Bitmap.createBitmap(200, 300, Bitmap.Config.RGB_565);
         BitmapDrawable d = new BitmapDrawable(bitmap);
         view.setBackgroundDrawable(d);
         view.setHorizontalFadingEdgeEnabled(true);
         view.setVerticalFadingEdgeEnabled(true);
 
-        view.setHorizontalScrollBarEnabled(true);
-        view.setVerticalScrollBarEnabled(true);
-        view.initializeScrollbars(mActivity.obtainStyledAttributes(android.R.styleable.View));
         assertTrue(view.isHorizontalScrollBarEnabled());
         assertTrue(view.isVerticalScrollBarEnabled());
         int verticalScrollBarWidth = view.getVerticalScrollbarWidth();
@@ -3111,9 +3171,30 @@
         assertEquals(fadingEdgeLength, view.getVerticalFadingEdgeLength());
     }
 
+    @UiThreadTest
+    public void testScrollIndicators() {
+        MockView view = (MockView) mActivity.findViewById(R.id.scroll_view);
+
+        assertEquals("Set indicators match those specified in XML",
+                View.SCROLL_INDICATOR_TOP | View.SCROLL_INDICATOR_BOTTOM,
+                view.getScrollIndicators());
+
+        view.setScrollIndicators(0);
+        assertEquals("Cleared indicators", 0, view.getScrollIndicators());
+
+        view.setScrollIndicators(View.SCROLL_INDICATOR_START | View.SCROLL_INDICATOR_RIGHT);
+        assertEquals("Set start and right indicators",
+                View.SCROLL_INDICATOR_START | View.SCROLL_INDICATOR_RIGHT,
+                view.getScrollIndicators());
+
+    }
+
     public void testOnStartAndFinishTemporaryDetach() throws Throwable {
         final MockListView listView = new MockListView(mActivity);
-        List<String> items = Lists.newArrayList("1", "2", "3");
+        List<String> items = new ArrayList<>();
+        items.add("1");
+        items.add("2");
+        items.add("3");
         final Adapter<String> adapter = new Adapter<String>(mActivity, 0, items);
 
         runTestOnUiThread(new Runnable() {
@@ -3367,6 +3448,156 @@
                 bg.hasCalledSetTint());
     }
 
+    public void testStartActionModeWithParent() {
+        View view = new View(mActivity);
+        MockViewGroup parent = new MockViewGroup(mActivity);
+        parent.addView(view);
+
+        ActionMode mode = view.startActionMode(null);
+
+        assertNotNull(mode);
+        assertEquals(NO_OP_ACTION_MODE, mode);
+        assertTrue(parent.isStartActionModeForChildCalled);
+        assertEquals(ActionMode.TYPE_PRIMARY, parent.startActionModeForChildType);
+    }
+
+    public void testStartActionModeWithoutParent() {
+        View view = new View(mActivity);
+
+        ActionMode mode = view.startActionMode(null);
+
+        assertNull(mode);
+    }
+
+    public void testStartActionModeTypedWithParent() {
+        View view = new View(mActivity);
+        MockViewGroup parent = new MockViewGroup(mActivity);
+        parent.addView(view);
+
+        ActionMode mode = view.startActionMode(null, ActionMode.TYPE_FLOATING);
+
+        assertNotNull(mode);
+        assertEquals(NO_OP_ACTION_MODE, mode);
+        assertTrue(parent.isStartActionModeForChildCalled);
+        assertEquals(ActionMode.TYPE_FLOATING, parent.startActionModeForChildType);
+    }
+
+    public void testStartActionModeTypedWithoutParent() {
+        View view = new View(mActivity);
+
+        ActionMode mode = view.startActionMode(null, ActionMode.TYPE_FLOATING);
+
+        assertNull(mode);
+    }
+
+    private static class MockViewGroup extends ViewGroup {
+        boolean isStartActionModeForChildCalled = false;
+        int startActionModeForChildType = ActionMode.TYPE_PRIMARY;
+
+        public MockViewGroup(Context context) {
+            super(context);
+        }
+
+        @Override
+        public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback) {
+            isStartActionModeForChildCalled = true;
+            startActionModeForChildType = ActionMode.TYPE_PRIMARY;
+            return NO_OP_ACTION_MODE;
+        }
+
+        @Override
+        public ActionMode startActionModeForChild(
+                View originalView, ActionMode.Callback callback, int type) {
+            isStartActionModeForChildCalled = true;
+            startActionModeForChildType = type;
+            return NO_OP_ACTION_MODE;
+        }
+
+        @Override
+        protected void onLayout(boolean changed, int l, int t, int r, int b) {
+            // no-op
+        }
+    }
+
+    private static final ActionMode NO_OP_ACTION_MODE =
+            new ActionMode() {
+                @Override
+                public void setTitle(CharSequence title) {}
+
+                @Override
+                public void setTitle(int resId) {}
+
+                @Override
+                public void setSubtitle(CharSequence subtitle) {}
+
+                @Override
+                public void setSubtitle(int resId) {}
+
+                @Override
+                public void setCustomView(View view) {}
+
+                @Override
+                public void invalidate() {}
+
+                @Override
+                public void finish() {}
+
+                @Override
+                public Menu getMenu() {
+                    return null;
+                }
+
+                @Override
+                public CharSequence getTitle() {
+                    return null;
+                }
+
+                @Override
+                public CharSequence getSubtitle() {
+                    return null;
+                }
+
+                @Override
+                public View getCustomView() {
+                    return null;
+                }
+
+                @Override
+                public MenuInflater getMenuInflater() {
+                    return null;
+                }
+            };
+
+    public void testTranslationSetter() {
+        View view = new View(mActivity);
+        float offset = 10.0f;
+        view.setTranslationX(offset);
+        view.setTranslationY(offset);
+        view.setTranslationZ(offset);
+        view.setElevation(offset);
+
+        assertEquals("Incorrect translationX", offset, view.getTranslationX());
+        assertEquals("Incorrect translationY", offset, view.getTranslationY());
+        assertEquals("Incorrect translationZ", offset, view.getTranslationZ());
+        assertEquals("Incorrect elevation", offset, view.getElevation());
+    }
+
+    public void testXYZ() {
+        View view = new View(mActivity);
+        float offset = 10.0f;
+        float start = 15.0f;
+        view.setTranslationX(offset);
+        view.setLeft((int) start);
+        view.setTranslationY(offset);
+        view.setTop((int) start);
+        view.setTranslationZ(offset);
+        view.setElevation(start);
+
+        assertEquals("Incorrect X value", offset + start, view.getX());
+        assertEquals("Incorrect Y value", offset + start, view.getY());
+        assertEquals("Incorrect Z value", offset + start, view.getZ());
+    }
+
     private static class MockDrawable extends Drawable {
         private boolean mCalledSetTint = false;
 
@@ -3445,7 +3676,7 @@
         }
     }
 
-    private final static class MockViewParent extends View implements ViewParent {
+    private final static class MockViewParent extends ViewGroup {
         private boolean mHasClearChildFocus = false;
         private boolean mHasRequestLayout = false;
         private boolean mHasCreateContextMenu = false;
@@ -3485,12 +3716,12 @@
         }
 
         @Override
-        protected void dispatchSetPressed(boolean pressed) {
+        public void dispatchSetPressed(boolean pressed) {
             super.dispatchSetPressed(pressed);
         }
 
         @Override
-        protected void dispatchSetSelected(boolean selected) {
+        public void dispatchSetSelected(boolean selected) {
             super.dispatchSetSelected(selected);
         }
 
@@ -3523,23 +3754,15 @@
             return false;
         }
 
+        @Override
+        protected void onLayout(boolean changed, int l, int t, int r, int b) {
+
+        }
+
         public boolean hasGetChildVisibleRect() {
             return mHasGetChildVisibleRect;
         }
 
-        public void invalidateChild(View child, Rect r) {
-            mTempRect = new Rect(r);
-            mHasInvalidateChild = true;
-        }
-
-        public Rect getTempRect() {
-            return mTempRect;
-        }
-
-        public boolean hasInvalidateChild() {
-            return mHasInvalidateChild;
-        }
-
         public ViewParent invalidateChildInParent(int[] location, Rect r) {
             return null;
         }
@@ -3560,6 +3783,7 @@
 
         }
 
+        @Override
         public void requestLayout() {
             mHasRequestLayout = true;
         }
@@ -3582,6 +3806,11 @@
             return null;
         }
 
+        public ActionMode startActionModeForChild(View originalView,
+                ActionMode.Callback callback, int type) {
+            return null;
+        }
+
         public boolean hasShowContextMenuForChild() {
             return mHasShowContextMenuForChild;
         }
@@ -3757,6 +3986,30 @@
         }
     }
 
+    private static final class OnContextClickListenerImpl implements OnContextClickListener {
+        private boolean mHasContextClick = false;
+        private View mLastViewContextClicked;
+
+        public boolean hasOnContextClick() {
+            return mHasContextClick;
+        }
+
+        public void reset() {
+            mHasContextClick = false;
+            mLastViewContextClicked = null;
+        }
+
+        public boolean onContextClick(View v) {
+            mHasContextClick = true;
+            mLastViewContextClicked = v;
+            return true;
+        }
+
+        public View getLastViewContextClicked() {
+            return mLastViewContextClicked;
+        }
+    }
+
     private static final class OnFocusChangeListenerImpl implements OnFocusChangeListener {
         private boolean mHasOnFocusChange = false;
 
diff --git a/tests/tests/view/src/android/view/cts/ViewTreeObserverTest.java b/tests/tests/view/src/android/view/cts/ViewTreeObserverTest.java
index 1b21dac..7071808 100644
--- a/tests/tests/view/src/android/view/cts/ViewTreeObserverTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewTreeObserverTest.java
@@ -25,8 +25,6 @@
 import android.test.TouchUtils;
 import android.view.View;
 import android.view.ViewTreeObserver;
-import android.view.ViewTreeObserver.InternalInsetsInfo;
-import android.view.ViewTreeObserver.OnComputeInternalInsetsListener;
 import android.view.ViewTreeObserver.OnGlobalFocusChangeListener;
 import android.view.ViewTreeObserver.OnGlobalLayoutListener;
 import android.view.ViewTreeObserver.OnPreDrawListener;
@@ -155,22 +153,6 @@
         }.run();
     }
 
-    public void testAddOnComputeInternalInsetsListener() {
-        final View view1 = mActivity.findViewById(R.id.view1);
-        mViewTreeObserver = view1.getViewTreeObserver();
-
-        MockOnComputeInternalInsetsListener listener = new MockOnComputeInternalInsetsListener();
-        mViewTreeObserver.addOnComputeInternalInsetsListener(listener);
-    }
-
-    public void testRemoveOnComputeInternalInsetsListener() {
-        final View view1 = mActivity.findViewById(R.id.view1);
-        mViewTreeObserver = view1.getViewTreeObserver();
-
-        MockOnComputeInternalInsetsListener listener = new MockOnComputeInternalInsetsListener();
-        mViewTreeObserver.removeOnComputeInternalInsetsListener(listener);
-    }
-
     public void testDispatchOnGlobalLayout() {
         final LinearLayout layout = (LinearLayout) mActivity.findViewById(R.id.linearlayout);
         mViewTreeObserver = layout.getViewTreeObserver();
@@ -434,12 +416,6 @@
         }
     }
 
-    private class MockOnComputeInternalInsetsListener implements OnComputeInternalInsetsListener {
-        @Override
-        public void onComputeInternalInsets(InternalInsetsInfo inoutInfo) {
-        }
-    }
-
     private static class MockOnScrollChangedListener implements OnScrollChangedListener {
         private boolean mCalledOnScrollChanged = false;
 
diff --git a/tests/tests/view/src/android/view/cts/WindowTest.java b/tests/tests/view/src/android/view/cts/WindowTest.java
index 3c5386d..dcfcfb7 100644
--- a/tests/tests/view/src/android/view/cts/WindowTest.java
+++ b/tests/tests/view/src/android/view/cts/WindowTest.java
@@ -49,6 +49,7 @@
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.MotionEvent;
+import android.view.SearchEvent;
 import android.view.Surface;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
@@ -1105,6 +1106,10 @@
             return mIsOnPanelClosedCalled;
         }
 
+        public boolean onSearchRequested(SearchEvent searchEvent) {
+            return onSearchRequested();
+        }
+
         public boolean onSearchRequested() {
             return false;
         }
@@ -1113,6 +1118,11 @@
             return null;
         }
 
+        public ActionMode onWindowStartingActionMode(
+                ActionMode.Callback callback, int type) {
+            return null;
+        }
+
         public void onActionModeStarted(ActionMode mode) {
         }
 
diff --git a/tests/tests/view/src/android/view/cts/util/XmlUtils.java b/tests/tests/view/src/android/view/cts/util/XmlUtils.java
new file mode 100644
index 0000000..f1df4ff
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/util/XmlUtils.java
@@ -0,0 +1,1666 @@
+/*
+ * Copyright (C) 2006 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.view.cts.util;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
+
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.CompressFormat;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.util.ArrayMap;
+import android.util.Base64;
+import android.util.Xml;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.ProtocolException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class XmlUtils {
+
+    public static void skipCurrentTag(XmlPullParser parser)
+            throws XmlPullParserException, IOException {
+        int outerDepth = parser.getDepth();
+        int type;
+        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
+               && (type != XmlPullParser.END_TAG
+                       || parser.getDepth() > outerDepth)) {
+        }
+    }
+
+    public static final int
+    convertValueToList(CharSequence value, String[] options, int defaultValue)
+    {
+        if (null != value) {
+            for (int i = 0; i < options.length; i++) {
+                if (value.equals(options[i]))
+                    return i;
+            }
+        }
+
+        return defaultValue;
+    }
+
+    public static final boolean
+    convertValueToBoolean(CharSequence value, boolean defaultValue)
+    {
+        boolean result = false;
+
+        if (null == value)
+            return defaultValue;
+
+        if (value.equals("1")
+        ||  value.equals("true")
+        ||  value.equals("TRUE"))
+            result = true;
+
+        return result;
+    }
+
+    public static final int
+    convertValueToInt(CharSequence charSeq, int defaultValue)
+    {
+        if (null == charSeq)
+            return defaultValue;
+
+        String nm = charSeq.toString();
+
+        // XXX This code is copied from Integer.decode() so we don't
+        // have to instantiate an Integer!
+
+        int value;
+        int sign = 1;
+        int index = 0;
+        int len = nm.length();
+        int base = 10;
+
+        if ('-' == nm.charAt(0)) {
+            sign = -1;
+            index++;
+        }
+
+        if ('0' == nm.charAt(index)) {
+            //  Quick check for a zero by itself
+            if (index == (len - 1))
+                return 0;
+
+            char    c = nm.charAt(index + 1);
+
+            if ('x' == c || 'X' == c) {
+                index += 2;
+                base = 16;
+            } else {
+                index++;
+                base = 8;
+            }
+        }
+        else if ('#' == nm.charAt(index))
+        {
+            index++;
+            base = 16;
+        }
+
+        return Integer.parseInt(nm.substring(index), base) * sign;
+    }
+
+    public static int convertValueToUnsignedInt(String value, int defaultValue) {
+        if (null == value) {
+            return defaultValue;
+        }
+
+        return parseUnsignedIntAttribute(value);
+    }
+
+    public static int parseUnsignedIntAttribute(CharSequence charSeq) {
+        String  value = charSeq.toString();
+
+        long    bits;
+        int     index = 0;
+        int     len = value.length();
+        int     base = 10;
+
+        if ('0' == value.charAt(index)) {
+            //  Quick check for zero by itself
+            if (index == (len - 1))
+                return 0;
+
+            char    c = value.charAt(index + 1);
+
+            if ('x' == c || 'X' == c) {     //  check for hex
+                index += 2;
+                base = 16;
+            } else {                        //  check for octal
+                index++;
+                base = 8;
+            }
+        } else if ('#' == value.charAt(index)) {
+            index++;
+            base = 16;
+        }
+
+        return (int) Long.parseLong(value.substring(index), base);
+    }
+
+    /**
+     * Flatten a List into an output stream as XML.  The list can later be
+     * read back with readListXml().
+     *
+     * @param val The list to be flattened.
+     * @param out Where to write the XML data.
+     *
+     * @see #writeListXml(List, String, XmlSerializer)
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readListXml
+     */
+    public static final void writeListXml(List val, OutputStream out)
+    throws XmlPullParserException, IOException
+    {
+        XmlSerializer serializer = Xml.newSerializer();
+        serializer.setOutput(out, StandardCharsets.UTF_8.name());
+        serializer.startDocument(null, true);
+        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
+        writeListXml(val, null, serializer);
+        serializer.endDocument();
+    }
+
+    /**
+     * Flatten a Map into an XmlSerializer.  The map can later be read back
+     * with readThisMapXml().
+     *
+     * @param val The map to be flattened.
+     * @param name Name attribute to include with this list's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the map into.
+     *
+     * @see #writeListXml
+     * @see #writeValueXml
+     * @see #readMapXml
+     */
+    public static final void writeMapXml(Map val, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+        writeMapXml(val, name, out, null);
+    }
+
+    /**
+     * Flatten a Map into an XmlSerializer.  The map can later be read back
+     * with readThisMapXml().
+     *
+     * @param val The map to be flattened.
+     * @param name Name attribute to include with this list's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the map into.
+     * @param callback Method to call when an Object type is not recognized.
+     *
+     * @see #writeListXml
+     * @see #writeValueXml
+     * @see #readMapXml
+     *
+     * @hide
+     */
+    public static final void writeMapXml(Map val, String name, XmlSerializer out,
+            WriteMapCallback callback) throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "map");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        writeMapXml(val, out, callback);
+
+        out.endTag(null, "map");
+    }
+
+    /**
+     * Flatten a Map into an XmlSerializer.  The map can later be read back
+     * with readThisMapXml(). This method presumes that the start tag and
+     * name attribute have already been written and does not write an end tag.
+     *
+     * @param val The map to be flattened.
+     * @param out XmlSerializer to write the map into.
+     *
+     * @see #writeListXml
+     * @see #writeValueXml
+     * @see #readMapXml
+     *
+     * @hide
+     */
+    public static final void writeMapXml(Map val, XmlSerializer out,
+            WriteMapCallback callback) throws XmlPullParserException, IOException {
+        if (val == null) {
+            return;
+        }
+
+        Set s = val.entrySet();
+        Iterator i = s.iterator();
+
+        while (i.hasNext()) {
+            Map.Entry e = (Map.Entry)i.next();
+            writeValueXml(e.getValue(), (String)e.getKey(), out, callback);
+        }
+    }
+
+    /**
+     * Flatten a List into an XmlSerializer.  The list can later be read back
+     * with readThisListXml().
+     *
+     * @param val The list to be flattened.
+     * @param name Name attribute to include with this list's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the list into.
+     *
+     * @see #writeListXml(List, OutputStream)
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readListXml
+     */
+    public static final void writeListXml(List val, String name, XmlSerializer out)
+    throws XmlPullParserException, IOException
+    {
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "list");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        int N = val.size();
+        int i=0;
+        while (i < N) {
+            writeValueXml(val.get(i), null, out);
+            i++;
+        }
+
+        out.endTag(null, "list");
+    }
+
+    public static final void writeSetXml(Set val, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "set");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        for (Object v : val) {
+            writeValueXml(v, null, out);
+        }
+
+        out.endTag(null, "set");
+    }
+
+    /**
+     * Flatten a byte[] into an XmlSerializer.  The list can later be read back
+     * with readThisByteArrayXml().
+     *
+     * @param val The byte array to be flattened.
+     * @param name Name attribute to include with this array's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the array into.
+     *
+     * @see #writeMapXml
+     * @see #writeValueXml
+     */
+    public static final void writeByteArrayXml(byte[] val, String name,
+            XmlSerializer out)
+            throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "byte-array");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        final int N = val.length;
+        out.attribute(null, "num", Integer.toString(N));
+
+        StringBuilder sb = new StringBuilder(val.length*2);
+        for (int i=0; i<N; i++) {
+            int b = val[i];
+            int h = b>>4;
+            sb.append(h >= 10 ? ('a'+h-10) : ('0'+h));
+            h = b&0xff;
+            sb.append(h >= 10 ? ('a'+h-10) : ('0'+h));
+        }
+
+        out.text(sb.toString());
+
+        out.endTag(null, "byte-array");
+    }
+
+    /**
+     * Flatten an int[] into an XmlSerializer.  The list can later be read back
+     * with readThisIntArrayXml().
+     *
+     * @param val The int array to be flattened.
+     * @param name Name attribute to include with this array's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the array into.
+     *
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readThisIntArrayXml
+     */
+    public static final void writeIntArrayXml(int[] val, String name,
+            XmlSerializer out)
+            throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "int-array");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        final int N = val.length;
+        out.attribute(null, "num", Integer.toString(N));
+
+        for (int i=0; i<N; i++) {
+            out.startTag(null, "item");
+            out.attribute(null, "value", Integer.toString(val[i]));
+            out.endTag(null, "item");
+        }
+
+        out.endTag(null, "int-array");
+    }
+
+    /**
+     * Flatten a long[] into an XmlSerializer.  The list can later be read back
+     * with readThisLongArrayXml().
+     *
+     * @param val The long array to be flattened.
+     * @param name Name attribute to include with this array's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the array into.
+     *
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readThisIntArrayXml
+     */
+    public static final void writeLongArrayXml(long[] val, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "long-array");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        final int N = val.length;
+        out.attribute(null, "num", Integer.toString(N));
+
+        for (int i=0; i<N; i++) {
+            out.startTag(null, "item");
+            out.attribute(null, "value", Long.toString(val[i]));
+            out.endTag(null, "item");
+        }
+
+        out.endTag(null, "long-array");
+    }
+
+    /**
+     * Flatten a double[] into an XmlSerializer.  The list can later be read back
+     * with readThisDoubleArrayXml().
+     *
+     * @param val The double array to be flattened.
+     * @param name Name attribute to include with this array's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the array into.
+     *
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readThisIntArrayXml
+     */
+    public static final void writeDoubleArrayXml(double[] val, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "double-array");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        final int N = val.length;
+        out.attribute(null, "num", Integer.toString(N));
+
+        for (int i=0; i<N; i++) {
+            out.startTag(null, "item");
+            out.attribute(null, "value", Double.toString(val[i]));
+            out.endTag(null, "item");
+        }
+
+        out.endTag(null, "double-array");
+    }
+
+    /**
+     * Flatten a String[] into an XmlSerializer.  The list can later be read back
+     * with readThisStringArrayXml().
+     *
+     * @param val The String array to be flattened.
+     * @param name Name attribute to include with this array's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the array into.
+     *
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readThisIntArrayXml
+     */
+    public static final void writeStringArrayXml(String[] val, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "string-array");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        final int N = val.length;
+        out.attribute(null, "num", Integer.toString(N));
+
+        for (int i=0; i<N; i++) {
+            out.startTag(null, "item");
+            out.attribute(null, "value", val[i]);
+            out.endTag(null, "item");
+        }
+
+        out.endTag(null, "string-array");
+    }
+
+    /**
+     * Flatten a boolean[] into an XmlSerializer.  The list can later be read back
+     * with readThisBooleanArrayXml().
+     *
+     * @param val The boolean array to be flattened.
+     * @param name Name attribute to include with this array's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the array into.
+     *
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readThisIntArrayXml
+     */
+    public static final void writeBooleanArrayXml(boolean[] val, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "boolean-array");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        final int N = val.length;
+        out.attribute(null, "num", Integer.toString(N));
+
+        for (int i=0; i<N; i++) {
+            out.startTag(null, "item");
+            out.attribute(null, "value", Boolean.toString(val[i]));
+            out.endTag(null, "item");
+        }
+
+        out.endTag(null, "boolean-array");
+    }
+
+    /**
+     * Flatten an object's value into an XmlSerializer.  The value can later
+     * be read back with readThisValueXml().
+     *
+     * Currently supported value types are: null, String, Integer, Long,
+     * Float, Double Boolean, Map, List.
+     *
+     * @param v The object to be flattened.
+     * @param name Name attribute to include with this value's tag, or null
+     *             for none.
+     * @param out XmlSerializer to write the object into.
+     *
+     * @see #writeMapXml
+     * @see #writeListXml
+     * @see #readValueXml
+     */
+    public static final void writeValueXml(Object v, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+        writeValueXml(v, name, out, null);
+    }
+
+    /**
+     * Flatten an object's value into an XmlSerializer.  The value can later
+     * be read back with readThisValueXml().
+     *
+     * Currently supported value types are: null, String, Integer, Long,
+     * Float, Double Boolean, Map, List.
+     *
+     * @param v The object to be flattened.
+     * @param name Name attribute to include with this value's tag, or null
+     *             for none.
+     * @param out XmlSerializer to write the object into.
+     * @param callback Handler for Object types not recognized.
+     *
+     * @see #writeMapXml
+     * @see #writeListXml
+     * @see #readValueXml
+     */
+    private static final void writeValueXml(Object v, String name, XmlSerializer out,
+            WriteMapCallback callback)  throws XmlPullParserException, IOException {
+        String typeStr;
+        if (v == null) {
+            out.startTag(null, "null");
+            if (name != null) {
+                out.attribute(null, "name", name);
+            }
+            out.endTag(null, "null");
+            return;
+        } else if (v instanceof String) {
+            out.startTag(null, "string");
+            if (name != null) {
+                out.attribute(null, "name", name);
+            }
+            out.text(v.toString());
+            out.endTag(null, "string");
+            return;
+        } else if (v instanceof Integer) {
+            typeStr = "int";
+        } else if (v instanceof Long) {
+            typeStr = "long";
+        } else if (v instanceof Float) {
+            typeStr = "float";
+        } else if (v instanceof Double) {
+            typeStr = "double";
+        } else if (v instanceof Boolean) {
+            typeStr = "boolean";
+        } else if (v instanceof byte[]) {
+            writeByteArrayXml((byte[])v, name, out);
+            return;
+        } else if (v instanceof int[]) {
+            writeIntArrayXml((int[])v, name, out);
+            return;
+        } else if (v instanceof long[]) {
+            writeLongArrayXml((long[])v, name, out);
+            return;
+        } else if (v instanceof double[]) {
+            writeDoubleArrayXml((double[])v, name, out);
+            return;
+        } else if (v instanceof String[]) {
+            writeStringArrayXml((String[])v, name, out);
+            return;
+        } else if (v instanceof boolean[]) {
+            writeBooleanArrayXml((boolean[])v, name, out);
+            return;
+        } else if (v instanceof Map) {
+            writeMapXml((Map)v, name, out);
+            return;
+        } else if (v instanceof List) {
+            writeListXml((List) v, name, out);
+            return;
+        } else if (v instanceof Set) {
+            writeSetXml((Set) v, name, out);
+            return;
+        } else if (v instanceof CharSequence) {
+            // XXX This is to allow us to at least write something if
+            // we encounter styled text...  but it means we will drop all
+            // of the styling information. :(
+            out.startTag(null, "string");
+            if (name != null) {
+                out.attribute(null, "name", name);
+            }
+            out.text(v.toString());
+            out.endTag(null, "string");
+            return;
+        } else if (callback != null) {
+            callback.writeUnknownObject(v, name, out);
+            return;
+        } else {
+            throw new RuntimeException("writeValueXml: unable to write value " + v);
+        }
+
+        out.startTag(null, typeStr);
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+        out.attribute(null, "value", v.toString());
+        out.endTag(null, typeStr);
+    }
+
+    /**
+     * Read a HashMap from an InputStream containing XML.  The stream can
+     * previously have been written by writeMapXml().
+     *
+     * @param in The InputStream from which to read.
+     *
+     * @return HashMap The resulting map.
+     *
+     * @see #readListXml
+     * @see #readValueXml
+     * @see #readThisMapXml
+     * #see #writeMapXml
+     */
+    @SuppressWarnings("unchecked")
+    public static final HashMap<String, ?> readMapXml(InputStream in)
+    throws XmlPullParserException, IOException
+    {
+        XmlPullParser   parser = Xml.newPullParser();
+        parser.setInput(in, StandardCharsets.UTF_8.name());
+        return (HashMap<String, ?>) readValueXml(parser, new String[1]);
+    }
+
+    /**
+     * Read an ArrayList from an InputStream containing XML.  The stream can
+     * previously have been written by writeListXml().
+     *
+     * @param in The InputStream from which to read.
+     *
+     * @return ArrayList The resulting list.
+     *
+     * @see #readMapXml
+     * @see #readValueXml
+     * @see #readThisListXml
+     * @see #writeListXml
+     */
+    public static final ArrayList readListXml(InputStream in)
+    throws XmlPullParserException, IOException
+    {
+        XmlPullParser   parser = Xml.newPullParser();
+        parser.setInput(in, StandardCharsets.UTF_8.name());
+        return (ArrayList)readValueXml(parser, new String[1]);
+    }
+
+
+    /**
+     * Read a HashSet from an InputStream containing XML. The stream can
+     * previously have been written by writeSetXml().
+     *
+     * @param in The InputStream from which to read.
+     *
+     * @return HashSet The resulting set.
+     *
+     * @throws XmlPullParserException
+     * @throws IOException
+     *
+     * @see #readValueXml
+     * @see #readThisSetXml
+     * @see #writeSetXml
+     */
+    public static final HashSet readSetXml(InputStream in)
+            throws XmlPullParserException, IOException {
+        XmlPullParser parser = Xml.newPullParser();
+        parser.setInput(in, null);
+        return (HashSet) readValueXml(parser, new String[1]);
+    }
+
+    /**
+     * Read a HashMap object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeMapXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the map.
+     *
+     * @param parser The XmlPullParser from which to read the map data.
+     * @param endTag Name of the tag that will end the map, usually "map".
+     * @param name An array of one string, used to return the name attribute
+     *             of the map's tag.
+     *
+     * @return HashMap The newly generated map.
+     *
+     * @see #readMapXml
+     */
+    public static final HashMap<String, ?> readThisMapXml(XmlPullParser parser, String endTag,
+            String[] name) throws XmlPullParserException, IOException {
+        return readThisMapXml(parser, endTag, name, null);
+    }
+
+    /**
+     * Read a HashMap object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeMapXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the map.
+     *
+     * @param parser The XmlPullParser from which to read the map data.
+     * @param endTag Name of the tag that will end the map, usually "map".
+     * @param name An array of one string, used to return the name attribute
+     *             of the map's tag.
+     *
+     * @return HashMap The newly generated map.
+     *
+     * @see #readMapXml
+     * @hide
+     */
+    public static final HashMap<String, ?> readThisMapXml(XmlPullParser parser, String endTag,
+            String[] name, ReadMapCallback callback)
+            throws XmlPullParserException, IOException
+    {
+        HashMap<String, Object> map = new HashMap<String, Object>();
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                Object val = readThisValueXml(parser, name, callback, false);
+                map.put(name[0], val);
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return map;
+                }
+                throw new XmlPullParserException(
+                    "Expected " + endTag + " end tag at: " + parser.getName());
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException(
+            "Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Like {@link #readThisMapXml}, but returns an ArrayMap instead of HashMap.
+     * @hide
+     */
+    public static final ArrayMap<String, ?> readThisArrayMapXml(XmlPullParser parser, String endTag,
+            String[] name, ReadMapCallback callback)
+            throws XmlPullParserException, IOException
+    {
+        ArrayMap<String, Object> map = new ArrayMap<>();
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                Object val = readThisValueXml(parser, name, callback, true);
+                map.put(name[0], val);
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return map;
+                }
+                throw new XmlPullParserException(
+                    "Expected " + endTag + " end tag at: " + parser.getName());
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException(
+            "Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read an ArrayList object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeListXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "list".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return HashMap The newly generated list.
+     *
+     * @see #readListXml
+     */
+    public static final ArrayList readThisListXml(XmlPullParser parser, String endTag,
+            String[] name) throws XmlPullParserException, IOException {
+        return readThisListXml(parser, endTag, name, null, false);
+    }
+
+    /**
+     * Read an ArrayList object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeListXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "list".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return HashMap The newly generated list.
+     *
+     * @see #readListXml
+     */
+    private static final ArrayList readThisListXml(XmlPullParser parser, String endTag,
+            String[] name, ReadMapCallback callback, boolean arrayMap)
+            throws XmlPullParserException, IOException {
+        ArrayList list = new ArrayList();
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                Object val = readThisValueXml(parser, name, callback, arrayMap);
+                list.add(val);
+                //System.out.println("Adding to list: " + val);
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return list;
+                }
+                throw new XmlPullParserException(
+                    "Expected " + endTag + " end tag at: " + parser.getName());
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException(
+            "Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read a HashSet object from an XmlPullParser. The XML data could previously
+     * have been generated by writeSetXml(). The XmlPullParser must be positioned
+     * <em>after</em> the tag that begins the set.
+     *
+     * @param parser The XmlPullParser from which to read the set data.
+     * @param endTag Name of the tag that will end the set, usually "set".
+     * @param name An array of one string, used to return the name attribute
+     *             of the set's tag.
+     *
+     * @return HashSet The newly generated set.
+     *
+     * @throws XmlPullParserException
+     * @throws IOException
+     *
+     * @see #readSetXml
+     */
+    public static final HashSet readThisSetXml(XmlPullParser parser, String endTag, String[] name)
+            throws XmlPullParserException, IOException {
+        return readThisSetXml(parser, endTag, name, null, false);
+    }
+
+    /**
+     * Read a HashSet object from an XmlPullParser. The XML data could previously
+     * have been generated by writeSetXml(). The XmlPullParser must be positioned
+     * <em>after</em> the tag that begins the set.
+     *
+     * @param parser The XmlPullParser from which to read the set data.
+     * @param endTag Name of the tag that will end the set, usually "set".
+     * @param name An array of one string, used to return the name attribute
+     *             of the set's tag.
+     *
+     * @return HashSet The newly generated set.
+     *
+     * @throws XmlPullParserException
+     * @throws IOException
+     *
+     * @see #readSetXml
+     * @hide
+     */
+    private static final HashSet readThisSetXml(XmlPullParser parser, String endTag, String[] name,
+            ReadMapCallback callback, boolean arrayMap)
+            throws XmlPullParserException, IOException {
+        HashSet set = new HashSet();
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                Object val = readThisValueXml(parser, name, callback, arrayMap);
+                set.add(val);
+                //System.out.println("Adding to set: " + val);
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return set;
+                }
+                throw new XmlPullParserException(
+                        "Expected " + endTag + " end tag at: " + parser.getName());
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException(
+                "Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read an int[] object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeIntArrayXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "list".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return Returns a newly generated int[].
+     *
+     * @see #readListXml
+     */
+    public static final int[] readThisIntArrayXml(XmlPullParser parser,
+            String endTag, String[] name)
+            throws XmlPullParserException, IOException {
+
+        int num;
+        try {
+            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
+        } catch (NullPointerException e) {
+            throw new XmlPullParserException(
+                    "Need num attribute in byte-array");
+        } catch (NumberFormatException e) {
+            throw new XmlPullParserException(
+                    "Not a number in num attribute in byte-array");
+        }
+        parser.next();
+
+        int[] array = new int[num];
+        int i = 0;
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                if (parser.getName().equals("item")) {
+                    try {
+                        array[i] = Integer.parseInt(
+                                parser.getAttributeValue(null, "value"));
+                    } catch (NullPointerException e) {
+                        throw new XmlPullParserException(
+                                "Need value attribute in item");
+                    } catch (NumberFormatException e) {
+                        throw new XmlPullParserException(
+                                "Not a number in value attribute in item");
+                    }
+                } else {
+                    throw new XmlPullParserException(
+                            "Expected item tag at: " + parser.getName());
+                }
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return array;
+                } else if (parser.getName().equals("item")) {
+                    i++;
+                } else {
+                    throw new XmlPullParserException(
+                        "Expected " + endTag + " end tag at: "
+                        + parser.getName());
+                }
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException(
+            "Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read a long[] object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeLongArrayXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "list".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return Returns a newly generated long[].
+     *
+     * @see #readListXml
+     */
+    public static final long[] readThisLongArrayXml(XmlPullParser parser,
+            String endTag, String[] name)
+            throws XmlPullParserException, IOException {
+
+        int num;
+        try {
+            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
+        } catch (NullPointerException e) {
+            throw new XmlPullParserException("Need num attribute in long-array");
+        } catch (NumberFormatException e) {
+            throw new XmlPullParserException("Not a number in num attribute in long-array");
+        }
+        parser.next();
+
+        long[] array = new long[num];
+        int i = 0;
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                if (parser.getName().equals("item")) {
+                    try {
+                        array[i] = Long.parseLong(parser.getAttributeValue(null, "value"));
+                    } catch (NullPointerException e) {
+                        throw new XmlPullParserException("Need value attribute in item");
+                    } catch (NumberFormatException e) {
+                        throw new XmlPullParserException("Not a number in value attribute in item");
+                    }
+                } else {
+                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
+                }
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return array;
+                } else if (parser.getName().equals("item")) {
+                    i++;
+                } else {
+                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
+                            parser.getName());
+                }
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read a double[] object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeDoubleArrayXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "double-array".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return Returns a newly generated double[].
+     *
+     * @see #readListXml
+     */
+    public static final double[] readThisDoubleArrayXml(XmlPullParser parser, String endTag,
+            String[] name) throws XmlPullParserException, IOException {
+
+        int num;
+        try {
+            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
+        } catch (NullPointerException e) {
+            throw new XmlPullParserException("Need num attribute in double-array");
+        } catch (NumberFormatException e) {
+            throw new XmlPullParserException("Not a number in num attribute in double-array");
+        }
+        parser.next();
+
+        double[] array = new double[num];
+        int i = 0;
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                if (parser.getName().equals("item")) {
+                    try {
+                        array[i] = Double.parseDouble(parser.getAttributeValue(null, "value"));
+                    } catch (NullPointerException e) {
+                        throw new XmlPullParserException("Need value attribute in item");
+                    } catch (NumberFormatException e) {
+                        throw new XmlPullParserException("Not a number in value attribute in item");
+                    }
+                } else {
+                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
+                }
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return array;
+                } else if (parser.getName().equals("item")) {
+                    i++;
+                } else {
+                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
+                            parser.getName());
+                }
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read a String[] object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeStringArrayXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "string-array".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return Returns a newly generated String[].
+     *
+     * @see #readListXml
+     */
+    public static final String[] readThisStringArrayXml(XmlPullParser parser, String endTag,
+            String[] name) throws XmlPullParserException, IOException {
+
+        int num;
+        try {
+            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
+        } catch (NullPointerException e) {
+            throw new XmlPullParserException("Need num attribute in string-array");
+        } catch (NumberFormatException e) {
+            throw new XmlPullParserException("Not a number in num attribute in string-array");
+        }
+        parser.next();
+
+        String[] array = new String[num];
+        int i = 0;
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                if (parser.getName().equals("item")) {
+                    try {
+                        array[i] = parser.getAttributeValue(null, "value");
+                    } catch (NullPointerException e) {
+                        throw new XmlPullParserException("Need value attribute in item");
+                    } catch (NumberFormatException e) {
+                        throw new XmlPullParserException("Not a number in value attribute in item");
+                    }
+                } else {
+                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
+                }
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return array;
+                } else if (parser.getName().equals("item")) {
+                    i++;
+                } else {
+                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
+                            parser.getName());
+                }
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read a boolean[] object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeBooleanArrayXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "string-array".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return Returns a newly generated boolean[].
+     *
+     * @see #readListXml
+     */
+    public static final boolean[] readThisBooleanArrayXml(XmlPullParser parser, String endTag,
+            String[] name) throws XmlPullParserException, IOException {
+
+        int num;
+        try {
+            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
+        } catch (NullPointerException e) {
+            throw new XmlPullParserException("Need num attribute in string-array");
+        } catch (NumberFormatException e) {
+            throw new XmlPullParserException("Not a number in num attribute in string-array");
+        }
+        parser.next();
+
+        boolean[] array = new boolean[num];
+        int i = 0;
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                if (parser.getName().equals("item")) {
+                    try {
+                        array[i] = Boolean.valueOf(parser.getAttributeValue(null, "value"));
+                    } catch (NullPointerException e) {
+                        throw new XmlPullParserException("Need value attribute in item");
+                    } catch (NumberFormatException e) {
+                        throw new XmlPullParserException("Not a number in value attribute in item");
+                    }
+                } else {
+                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
+                }
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return array;
+                } else if (parser.getName().equals("item")) {
+                    i++;
+                } else {
+                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
+                            parser.getName());
+                }
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read a flattened object from an XmlPullParser.  The XML data could
+     * previously have been written with writeMapXml(), writeListXml(), or
+     * writeValueXml().  The XmlPullParser must be positioned <em>at</em> the
+     * tag that defines the value.
+     *
+     * @param parser The XmlPullParser from which to read the object.
+     * @param name An array of one string, used to return the name attribute
+     *             of the value's tag.
+     *
+     * @return Object The newly generated value object.
+     *
+     * @see #readMapXml
+     * @see #readListXml
+     * @see #writeValueXml
+     */
+    public static final Object readValueXml(XmlPullParser parser, String[] name)
+    throws XmlPullParserException, IOException
+    {
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                return readThisValueXml(parser, name, null, false);
+            } else if (eventType == parser.END_TAG) {
+                throw new XmlPullParserException(
+                    "Unexpected end tag at: " + parser.getName());
+            } else if (eventType == parser.TEXT) {
+                throw new XmlPullParserException(
+                    "Unexpected text: " + parser.getText());
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException(
+            "Unexpected end of document");
+    }
+
+    private static final Object readThisValueXml(XmlPullParser parser, String[] name,
+            ReadMapCallback callback, boolean arrayMap)
+            throws XmlPullParserException, IOException {
+        final String valueName = parser.getAttributeValue(null, "name");
+        final String tagName = parser.getName();
+
+        //System.out.println("Reading this value tag: " + tagName + ", name=" + valueName);
+
+        Object res;
+
+        if (tagName.equals("null")) {
+            res = null;
+        } else if (tagName.equals("string")) {
+            String value = "";
+            int eventType;
+            while ((eventType = parser.next()) != parser.END_DOCUMENT) {
+                if (eventType == parser.END_TAG) {
+                    if (parser.getName().equals("string")) {
+                        name[0] = valueName;
+                        //System.out.println("Returning value for " + valueName + ": " + value);
+                        return value;
+                    }
+                    throw new XmlPullParserException(
+                        "Unexpected end tag in <string>: " + parser.getName());
+                } else if (eventType == parser.TEXT) {
+                    value += parser.getText();
+                } else if (eventType == parser.START_TAG) {
+                    throw new XmlPullParserException(
+                        "Unexpected start tag in <string>: " + parser.getName());
+                }
+            }
+            throw new XmlPullParserException(
+                "Unexpected end of document in <string>");
+        } else if ((res = readThisPrimitiveValueXml(parser, tagName)) != null) {
+            // all work already done by readThisPrimitiveValueXml
+        } else if (tagName.equals("int-array")) {
+            res = readThisIntArrayXml(parser, "int-array", name);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("long-array")) {
+            res = readThisLongArrayXml(parser, "long-array", name);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("double-array")) {
+            res = readThisDoubleArrayXml(parser, "double-array", name);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("string-array")) {
+            res = readThisStringArrayXml(parser, "string-array", name);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("boolean-array")) {
+            res = readThisBooleanArrayXml(parser, "boolean-array", name);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("map")) {
+            parser.next();
+            res = arrayMap
+                    ? readThisArrayMapXml(parser, "map", name, callback)
+                    : readThisMapXml(parser, "map", name, callback);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("list")) {
+            parser.next();
+            res = readThisListXml(parser, "list", name, callback, arrayMap);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("set")) {
+            parser.next();
+            res = readThisSetXml(parser, "set", name, callback, arrayMap);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (callback != null) {
+            res = callback.readThisUnknownObjectXml(parser, tagName);
+            name[0] = valueName;
+            return res;
+        } else {
+            throw new XmlPullParserException("Unknown tag: " + tagName);
+        }
+
+        // Skip through to end tag.
+        int eventType;
+        while ((eventType = parser.next()) != parser.END_DOCUMENT) {
+            if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(tagName)) {
+                    name[0] = valueName;
+                    //System.out.println("Returning value for " + valueName + ": " + res);
+                    return res;
+                }
+                throw new XmlPullParserException(
+                    "Unexpected end tag in <" + tagName + ">: " + parser.getName());
+            } else if (eventType == parser.TEXT) {
+                throw new XmlPullParserException(
+                "Unexpected text in <" + tagName + ">: " + parser.getName());
+            } else if (eventType == parser.START_TAG) {
+                throw new XmlPullParserException(
+                    "Unexpected start tag in <" + tagName + ">: " + parser.getName());
+            }
+        }
+        throw new XmlPullParserException(
+            "Unexpected end of document in <" + tagName + ">");
+    }
+
+    private static final Object readThisPrimitiveValueXml(XmlPullParser parser, String tagName)
+    throws XmlPullParserException, IOException
+    {
+        try {
+            if (tagName.equals("int")) {
+                return Integer.parseInt(parser.getAttributeValue(null, "value"));
+            } else if (tagName.equals("long")) {
+                return Long.valueOf(parser.getAttributeValue(null, "value"));
+            } else if (tagName.equals("float")) {
+                return new Float(parser.getAttributeValue(null, "value"));
+            } else if (tagName.equals("double")) {
+                return new Double(parser.getAttributeValue(null, "value"));
+            } else if (tagName.equals("boolean")) {
+                return Boolean.valueOf(parser.getAttributeValue(null, "value"));
+            } else {
+                return null;
+            }
+        } catch (NullPointerException e) {
+            throw new XmlPullParserException("Need value attribute in <" + tagName + ">");
+        } catch (NumberFormatException e) {
+            throw new XmlPullParserException(
+                    "Not a number in value attribute in <" + tagName + ">");
+        }
+    }
+
+    public static final void beginDocument(XmlPullParser parser, String firstElementName) throws XmlPullParserException, IOException
+    {
+        int type;
+        while ((type=parser.next()) != parser.START_TAG
+                   && type != parser.END_DOCUMENT) {
+            ;
+        }
+
+        if (type != parser.START_TAG) {
+            throw new XmlPullParserException("No start tag found");
+        }
+
+        if (!parser.getName().equals(firstElementName)) {
+            throw new XmlPullParserException("Unexpected start tag: found " + parser.getName() +
+                    ", expected " + firstElementName);
+        }
+    }
+
+    public static final void nextElement(XmlPullParser parser) throws XmlPullParserException, IOException
+    {
+        int type;
+        while ((type=parser.next()) != parser.START_TAG
+                   && type != parser.END_DOCUMENT) {
+            ;
+        }
+    }
+
+    public static boolean nextElementWithin(XmlPullParser parser, int outerDepth)
+            throws IOException, XmlPullParserException {
+        for (;;) {
+            int type = parser.next();
+            if (type == XmlPullParser.END_DOCUMENT
+                    || (type == XmlPullParser.END_TAG && parser.getDepth() == outerDepth)) {
+                return false;
+            }
+            if (type == XmlPullParser.START_TAG
+                    && parser.getDepth() == outerDepth + 1) {
+                return true;
+            }
+        }
+    }
+
+    public static int readIntAttribute(XmlPullParser in, String name, int defaultValue) {
+        final String value = in.getAttributeValue(null, name);
+        try {
+            return Integer.parseInt(value);
+        } catch (NumberFormatException e) {
+            return defaultValue;
+        }
+    }
+
+    public static int readIntAttribute(XmlPullParser in, String name) throws IOException {
+        final String value = in.getAttributeValue(null, name);
+        try {
+            return Integer.parseInt(value);
+        } catch (NumberFormatException e) {
+            throw new ProtocolException("problem parsing " + name + "=" + value + " as int");
+        }
+    }
+
+    public static void writeIntAttribute(XmlSerializer out, String name, int value)
+            throws IOException {
+        out.attribute(null, name, Integer.toString(value));
+    }
+
+    public static long readLongAttribute(XmlPullParser in, String name, long defaultValue) {
+        final String value = in.getAttributeValue(null, name);
+        try {
+            return Long.parseLong(value);
+        } catch (NumberFormatException e) {
+            return defaultValue;
+        }
+    }
+
+    public static long readLongAttribute(XmlPullParser in, String name) throws IOException {
+        final String value = in.getAttributeValue(null, name);
+        try {
+            return Long.parseLong(value);
+        } catch (NumberFormatException e) {
+            throw new ProtocolException("problem parsing " + name + "=" + value + " as long");
+        }
+    }
+
+    public static void writeLongAttribute(XmlSerializer out, String name, long value)
+            throws IOException {
+        out.attribute(null, name, Long.toString(value));
+    }
+
+    public static float readFloatAttribute(XmlPullParser in, String name) throws IOException {
+        final String value = in.getAttributeValue(null, name);
+        try {
+            return Float.parseFloat(value);
+        } catch (NumberFormatException e) {
+            throw new ProtocolException("problem parsing " + name + "=" + value + " as long");
+        }
+    }
+
+    public static void writeFloatAttribute(XmlSerializer out, String name, float value)
+            throws IOException {
+        out.attribute(null, name, Float.toString(value));
+    }
+
+    public static boolean readBooleanAttribute(XmlPullParser in, String name) {
+        final String value = in.getAttributeValue(null, name);
+        return Boolean.parseBoolean(value);
+    }
+
+    public static boolean readBooleanAttribute(XmlPullParser in, String name,
+            boolean defaultValue) {
+        final String value = in.getAttributeValue(null, name);
+        if (value == null) {
+            return defaultValue;
+        } else {
+            return Boolean.parseBoolean(value);
+        }
+    }
+
+    public static void writeBooleanAttribute(XmlSerializer out, String name, boolean value)
+            throws IOException {
+        out.attribute(null, name, Boolean.toString(value));
+    }
+
+    public static Uri readUriAttribute(XmlPullParser in, String name) {
+        final String value = in.getAttributeValue(null, name);
+        return (value != null) ? Uri.parse(value) : null;
+    }
+
+    public static void writeUriAttribute(XmlSerializer out, String name, Uri value)
+            throws IOException {
+        if (value != null) {
+            out.attribute(null, name, value.toString());
+        }
+    }
+
+    public static String readStringAttribute(XmlPullParser in, String name) {
+        return in.getAttributeValue(null, name);
+    }
+
+    public static void writeStringAttribute(XmlSerializer out, String name, String value)
+            throws IOException {
+        if (value != null) {
+            out.attribute(null, name, value);
+        }
+    }
+
+    public static byte[] readByteArrayAttribute(XmlPullParser in, String name) {
+        final String value = in.getAttributeValue(null, name);
+        if (value != null) {
+            return Base64.decode(value, Base64.DEFAULT);
+        } else {
+            return null;
+        }
+    }
+
+    public static void writeByteArrayAttribute(XmlSerializer out, String name, byte[] value)
+            throws IOException {
+        if (value != null) {
+            out.attribute(null, name, Base64.encodeToString(value, Base64.DEFAULT));
+        }
+    }
+
+    public static Bitmap readBitmapAttribute(XmlPullParser in, String name) {
+        final byte[] value = readByteArrayAttribute(in, name);
+        if (value != null) {
+            return BitmapFactory.decodeByteArray(value, 0, value.length);
+        } else {
+            return null;
+        }
+    }
+
+    @Deprecated
+    public static void writeBitmapAttribute(XmlSerializer out, String name, Bitmap value)
+            throws IOException {
+        if (value != null) {
+            final ByteArrayOutputStream os = new ByteArrayOutputStream();
+            value.compress(CompressFormat.PNG, 90, os);
+            writeByteArrayAttribute(out, name, os.toByteArray());
+        }
+    }
+
+    /** @hide */
+    public interface WriteMapCallback {
+        /**
+         * Called from writeMapXml when an Object type is not recognized. The implementer
+         * must write out the entire element including start and end tags.
+         *
+         * @param v The object to be written out
+         * @param name The mapping key for v. Must be written into the "name" attribute of the
+         *             start tag.
+         * @param out The XML output stream.
+         * @throws XmlPullParserException on unrecognized Object type.
+         * @throws IOException on XmlSerializer serialization errors.
+         * @hide
+         */
+         public void writeUnknownObject(Object v, String name, XmlSerializer out)
+                 throws XmlPullParserException, IOException;
+    }
+
+    /** @hide */
+    public interface ReadMapCallback {
+        /**
+         * Called from readThisMapXml when a START_TAG is not recognized. The input stream
+         * is positioned within the start tag so that attributes can be read using in.getAttribute.
+         *
+         * @param in the XML input stream
+         * @param tag the START_TAG that was not recognized.
+         * @return the Object parsed from the stream which will be put into the map.
+         * @throws XmlPullParserException if the START_TAG is not recognized.
+         * @throws IOException on XmlPullParser serialization errors.
+         * @hide
+         */
+        public Object readThisUnknownObjectXml(XmlPullParser in, String tag)
+                throws XmlPullParserException, IOException;
+    }
+}
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/KeyboardTest.java b/tests/tests/view/src/android/view/inputmethod/cts/KeyboardTest.java
new file mode 100644
index 0000000..ce7f9d7
--- /dev/null
+++ b/tests/tests/view/src/android/view/inputmethod/cts/KeyboardTest.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2015 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.view.inputmethod.cts;
+
+import com.android.cts.view.R;
+
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
+import android.test.AndroidTestCase;
+import android.inputmethodservice.Keyboard;
+import android.inputmethodservice.Keyboard.Key;
+
+import java.util.List;
+
+public class KeyboardTest extends AndroidTestCase {
+
+    public void testKeyOnPressedAndReleased() {
+        Key nonStickyKey = null;
+        Key stickyKey = null;
+        // Indirectly instantiate Keyboard.Key with XML resources.
+        final Keyboard keyboard = new Keyboard(getContext(), R.xml.keyboard);
+        for (final Key key : keyboard.getKeys()) {
+            if (!key.sticky) {
+                nonStickyKey = key;
+                break;
+            }
+        }
+        for (final Key key : keyboard.getModifierKeys()) {
+            if (key.sticky) {
+                stickyKey = key;
+                break;
+            }
+        }
+
+        // Asserting existences of following keys is not the goal of this test, but this should work
+        // anyway.
+        assertNotNull(nonStickyKey);
+        assertNotNull(stickyKey);
+
+        // At first, both "pressed" and "on" must be false.
+        assertFalse(nonStickyKey.pressed);
+        assertFalse(stickyKey.pressed);
+        assertFalse(nonStickyKey.on);
+        assertFalse(stickyKey.on);
+
+        // Pressing the key must flip the "pressed" state only.
+        nonStickyKey.onPressed();
+        stickyKey.onPressed();
+        assertTrue(nonStickyKey.pressed);
+        assertTrue(stickyKey.pressed);
+        assertFalse(nonStickyKey.on);
+        assertFalse(stickyKey.on);
+
+        // Releasing the key inside the key area must flip the "pressed" state and toggle the "on"
+        // state if the key is marked as sticky.
+        nonStickyKey.onReleased(true /* inside */);
+        stickyKey.onReleased(true /* inside */);
+        assertFalse(nonStickyKey.pressed);
+        assertFalse(stickyKey.pressed);
+        assertFalse(nonStickyKey.on);
+        assertTrue(stickyKey.on);   // The key state is toggled.
+
+        // Pressing the key again must flip the "pressed" state only.
+        nonStickyKey.onPressed();
+        stickyKey.onPressed();
+        assertTrue(nonStickyKey.pressed);
+        assertTrue(stickyKey.pressed);
+        assertFalse(nonStickyKey.on);
+        assertTrue(stickyKey.on);
+
+        // Releasing the key inside the key area must flip the "pressed" state and toggle the "on"
+        // state if the key is marked as sticky hence we will be back to the initial state.
+        nonStickyKey.onReleased(true /* inside */);
+        stickyKey.onReleased(true /* inside */);
+        assertFalse(nonStickyKey.pressed);
+        assertFalse(stickyKey.pressed);
+        assertFalse(nonStickyKey.on);
+        assertFalse(stickyKey.on);
+
+        // Pressing then releasing the key outside the key area must not affect the "on" state.
+        nonStickyKey.onPressed();
+        stickyKey.onPressed();
+        nonStickyKey.onReleased(false /* inside */);
+        stickyKey.onReleased(false /* inside */);
+        assertFalse(nonStickyKey.pressed);
+        assertFalse(stickyKey.pressed);
+        assertFalse(nonStickyKey.on);
+        assertFalse(stickyKey.on);
+    }
+}
diff --git a/tests/tests/voiceinteraction/Android.mk b/tests/tests/voiceinteraction/Android.mk
new file mode 100644
index 0000000..b8f95e3
--- /dev/null
+++ b/tests/tests/voiceinteraction/Android.mk
@@ -0,0 +1,33 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := CtsVoiceInteractionCommon ctstestrunner ctsdeviceutil
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsVoiceInteractionTestCases
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/tests/voiceinteraction/AndroidManifest.xml b/tests/tests/voiceinteraction/AndroidManifest.xml
new file mode 100644
index 0000000..4c6989f
--- /dev/null
+++ b/tests/tests/voiceinteraction/AndroidManifest.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.voiceinteraction.cts">
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.BIND_VOICE_INTERACTION" />
+
+    <application>
+      <uses-library android:name="android.test.runner" />
+
+      <activity android:name="TestStartActivity"
+                android:label="Voice Interaction Target">
+          <intent-filter>
+              <action android:name="android.intent.action.TEST_START_ACTIVITY" />
+              <category android:name="android.intent.category.LAUNCHER" />
+              <category android:name="android.intent.category.DEFAULT" />
+          </intent-filter>
+      </activity>
+    </application>
+
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="android.voiceinteraction.cts"
+                     android:label="CTS tests of android.voiceinteraction">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+</manifest>
+
diff --git a/tests/tests/voiceinteraction/AndroidTest.xml b/tests/tests/voiceinteraction/AndroidTest.xml
new file mode 100644
index 0000000..374c216
--- /dev/null
+++ b/tests/tests/voiceinteraction/AndroidTest.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="Test module config for VoiceInteraction">
+    <include name="common-config" />
+    <option name="cts-apk-installer:test-file-name" value="CtsVoiceInteractionService.apk" />
+    <option name="cts-apk-installer:test-file-name" value="CtsVoiceInteractionApp.apk" />
+    <option name="run-command:run-command"
+         value="settings put secure voice_interaction_service android.voiceinteraction.service/.MainInteractionService" />
+    <option name="run-command:teardown-command"
+         value="settings put secure voice_interaction_service com.google.android.googlequicksearchbox/com.google.android.voiceinteraction.GsaVoiceInteractionService" />
+    <option name="cts-apk-installer:test-file-name" value="CtsVoiceInteractionTestCases.apk" />
+</configuration>
diff --git a/tests/tests/voiceinteraction/common/Android.mk b/tests/tests/voiceinteraction/common/Android.mk
new file mode 100644
index 0000000..8b994c9
--- /dev/null
+++ b/tests/tests/voiceinteraction/common/Android.mk
@@ -0,0 +1,30 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_MODULE := CtsVoiceInteractionCommon
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/tests/tests/voiceinteraction/common/src/android/voiceinteraction/common/Utils.java b/tests/tests/voiceinteraction/common/src/android/voiceinteraction/common/Utils.java
new file mode 100644
index 0000000..ff3bcfd
--- /dev/null
+++ b/tests/tests/voiceinteraction/common/src/android/voiceinteraction/common/Utils.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2015 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.voiceinteraction.common;
+
+import android.app.VoiceInteractor;
+import android.app.VoiceInteractor.PickOptionRequest.Option;
+import android.os.Bundle;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+public class Utils {
+    public enum TestCaseType {
+        COMPLETION_REQUEST_TEST,
+        COMPLETION_REQUEST_CANCEL_TEST,
+        CONFIRMATION_REQUEST_TEST,
+        CONFIRMATION_REQUEST_CANCEL_TEST,
+        ABORT_REQUEST_TEST,
+        ABORT_REQUEST_CANCEL_TEST,
+        PICKOPTION_REQUEST_TEST,
+        PICKOPTION_REQUEST_CANCEL_TEST,
+        COMMANDREQUEST_TEST,
+        COMMANDREQUEST_CANCEL_TEST,
+        SUPPORTS_COMMANDS_TEST,
+    }
+    public static final String TESTCASE_TYPE = "testcase_type";
+    public static final String TESTINFO = "testinfo";
+    public static final String BROADCAST_INTENT = "android.intent.action.VOICE_TESTAPP";
+    public static final String TEST_PROMPT = "testprompt";
+    public static final String PICKOPTON_1 = "one";
+    public static final String PICKOPTON_2 = "two";
+    public static final String PICKOPTON_3 = "3";
+    public static final String TEST_COMMAND = "test_command";
+    public static final String TEST_ONCOMMAND_RESULT = "test_oncommand_result";
+    public static final String TEST_ONCOMMAND_RESULT_VALUE = "test_oncommand_result value";
+
+    public static final String CONFIRMATION_REQUEST_SUCCESS = "confirmation ok";
+    public static final String COMPLETION_REQUEST_SUCCESS = "completion ok";
+    public static final String ABORT_REQUEST_SUCCESS = "abort ok";
+    public static final String PICKOPTION_REQUEST_SUCCESS = "pickoption ok";
+    public static final String COMMANDREQUEST_SUCCESS = "commandrequest ok";
+    public static final String SUPPORTS_COMMANDS_SUCCESS = "supportsCommands ok";
+
+    public static final String CONFIRMATION_REQUEST_CANCEL_SUCCESS = "confirm cancel ok";
+    public static final String COMPLETION_REQUEST_CANCEL_SUCCESS = "completion canel ok";
+    public static final String ABORT_REQUEST_CANCEL_SUCCESS = "abort cancel ok";
+    public static final String PICKOPTION_REQUEST_CANCEL_SUCCESS = "pickoption  cancel ok";
+    public static final String COMMANDREQUEST_CANCEL_SUCCESS = "commandrequest cancel ok";
+    public static final String TEST_ERROR = "Error In Test:";
+
+    public static final String toBundleString(Bundle bundle) {
+        if (bundle == null) {
+            return "*** Bundle is null ****";
+        }
+        StringBuffer buf = new StringBuffer("Bundle is: ");
+        String testType = bundle.getString(TESTCASE_TYPE);
+        if (testType != null) {
+            buf.append("testcase type = " + testType);
+        }
+        ArrayList<String> info = bundle.getStringArrayList(TESTINFO);
+        if (info != null) {
+            for (String s : info) {
+                buf.append(s + "\n\t\t");
+            }
+        }
+        return buf.toString();
+    }
+
+    public static final String toOptionsString(Option[] options) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("{");
+        for (int i = 0; i < options.length; i++) {
+            if (i >= 1) {
+                sb.append(", ");
+            }
+            sb.append(options[i].getLabel());
+        }
+        sb.append("}");
+        return sb.toString();
+    }
+
+    public static final void addErrorResult(final Bundle testinfo, final String msg) {
+        testinfo.getStringArrayList(testinfo.getString(Utils.TESTCASE_TYPE))
+            .add(TEST_ERROR + " " + msg);
+    }
+}
diff --git a/tests/tests/voiceinteraction/res/xml/interaction_service.xml b/tests/tests/voiceinteraction/res/xml/interaction_service.xml
new file mode 100644
index 0000000..dd7e7b8
--- /dev/null
+++ b/tests/tests/voiceinteraction/res/xml/interaction_service.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<voice-interaction-service xmlns:android="http://schemas.android.com/apk/res/android"
+    android:sessionService="android.voiceinteraction.service.MainInteractionSessionService"
+    android:recognitionService="android.voiceinteraction.service.MainRecognitionService"
+    android:settingsActivity="android.voiceinteraction.service.SettingsActivity"
+    android:supportsAssist="false" />
diff --git a/tests/tests/voiceinteraction/service/Android.mk b/tests/tests/voiceinteraction/service/Android.mk
new file mode 100644
index 0000000..4338f13
--- /dev/null
+++ b/tests/tests/voiceinteraction/service/Android.mk
@@ -0,0 +1,32 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := CtsVoiceInteractionCommon ctstestrunner ctsdeviceutil
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsVoiceInteractionService
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/tests/voiceinteraction/service/AndroidManifest.xml b/tests/tests/voiceinteraction/service/AndroidManifest.xml
new file mode 100644
index 0000000..faf3d76
--- /dev/null
+++ b/tests/tests/voiceinteraction/service/AndroidManifest.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.voiceinteraction.service">
+
+    <application>
+      <uses-library android:name="android.test.runner" />
+      <service android:name=".MainInteractionService"
+              android:label="CTS test voice interaction service"
+              android:permission="android.permission.BIND_VOICE_INTERACTION"
+              android:process=":interactor"
+              android:exported="true">
+          <meta-data android:name="android.voice_interaction"
+                     android:resource="@xml/interaction_service" />
+          <intent-filter>
+              <action android:name="android.service.voice.VoiceInteractionService" />
+          </intent-filter>
+      </service>
+      <activity android:name=".VoiceInteractionMain" >
+          <intent-filter>
+              <action android:name="android.intent.action.START_TEST" />
+              <category android:name="android.intent.category.DEFAULT" />
+          </intent-filter>
+      </activity>
+      <activity android:name=".SettingsActivity"
+                android:label="Voice Interaction Settings">
+          <intent-filter>
+              <action android:name="android.intent.action.MAIN" />
+              <category android:name="android.intent.category.DEFAULT" />
+          </intent-filter>
+      </activity>
+      <service android:name=".MainInteractionSessionService"
+              android:permission="android.permission.BIND_VOICE_INTERACTION"
+              android:process=":session">
+      </service>
+      <service android:name=".MainRecognitionService"
+              android:label="CTS Voice Recognition Service">
+          <intent-filter>
+              <action android:name="android.speech.RecognitionService" />
+              <category android:name="android.intent.category.DEFAULT" />
+          </intent-filter>
+          <meta-data android:name="android.speech" android:resource="@xml/recognition_service" />
+      </service>
+    </application>
+</manifest>
+
diff --git a/tests/tests/voiceinteraction/service/res/xml/interaction_service.xml b/tests/tests/voiceinteraction/service/res/xml/interaction_service.xml
new file mode 100644
index 0000000..dd7e7b8
--- /dev/null
+++ b/tests/tests/voiceinteraction/service/res/xml/interaction_service.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<voice-interaction-service xmlns:android="http://schemas.android.com/apk/res/android"
+    android:sessionService="android.voiceinteraction.service.MainInteractionSessionService"
+    android:recognitionService="android.voiceinteraction.service.MainRecognitionService"
+    android:settingsActivity="android.voiceinteraction.service.SettingsActivity"
+    android:supportsAssist="false" />
diff --git a/tests/tests/voiceinteraction/service/res/xml/recognition_service.xml b/tests/tests/voiceinteraction/service/res/xml/recognition_service.xml
new file mode 100644
index 0000000..fafed99
--- /dev/null
+++ b/tests/tests/voiceinteraction/service/res/xml/recognition_service.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<recognition-service xmlns:android="http://schemas.android.com/apk/res/android"
+    android:settingsActivity="android.voiceinteraction.service.SettingsActivity" />
diff --git a/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainInteractionService.java b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainInteractionService.java
new file mode 100644
index 0000000..1af7bd5
--- /dev/null
+++ b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainInteractionService.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2015 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.voiceinteraction.service;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.service.voice.VoiceInteractionService;
+import android.util.Log;
+
+public class MainInteractionService extends VoiceInteractionService {
+    static final String TAG = "MainInteractionService";
+    private Intent mIntent;
+    private boolean mReady = false;
+
+    @Override
+    public void onReady() {
+        super.onReady();
+        mReady = true;
+    }
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        Log.i(TAG, "onStartCommand received");
+        mIntent = intent;
+        maybeStart();
+        return START_NOT_STICKY;
+    }
+
+    private void maybeStart() {
+       if (mIntent == null || !mReady) {
+            Log.wtf(TAG, "Can't start session because either intent is null or onReady() "
+                    + "is not called yet. mIntent = " + mIntent + ", mReady = " + mReady);
+        } else {
+            Log.i(TAG, "Yay! about to start session with TestApp");
+            if (isActiveService(this, new ComponentName(this, getClass()))) {
+                Bundle args = new Bundle();
+                Intent intent = new Intent();
+                intent.setComponent(new ComponentName("android.voiceinteraction.testapp",
+                        "android.voiceinteraction.testapp.TestApp"));
+                args.putParcelable("intent", intent);
+                showSession(args, 0);
+            } else {
+                Log.wtf(TAG, "**** Not starting MainInteractionService because" +
+                    " it is not set as the current voice interaction service");
+            }
+        }
+    }
+}
diff --git a/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainInteractionSession.java b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainInteractionSession.java
new file mode 100644
index 0000000..eeb4047
--- /dev/null
+++ b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainInteractionSession.java
@@ -0,0 +1,311 @@
+/*
+ * Copyright (C) 2015 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.voiceinteraction.service;
+
+import android.app.VoiceInteractor;
+import android.app.VoiceInteractor.Prompt;
+import android.content.Context;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.service.voice.VoiceInteractionSession;
+import android.service.voice.VoiceInteractionSession.ConfirmationRequest;
+import android.service.voice.VoiceInteractionSession.PickOptionRequest;
+import android.util.Log;
+import android.voiceinteraction.common.Utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class MainInteractionSession extends VoiceInteractionSession {
+    static final String TAG = "MainInteractionSession";
+
+    Intent mStartIntent;
+    List<MyTask> mUsedTasks = new ArrayList<MyTask>();
+
+    MainInteractionSession(Context context) {
+        super(context);
+    }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+    }
+
+    @Override
+    public void onDestroy() {
+        Log.i(TAG, "Canceling the Asynctask in onDestroy()");
+        for (MyTask t : mUsedTasks) {
+            t.cancel(true);
+        }
+        super.onDestroy();
+    }
+
+    @Override
+    public void onShow(Bundle args, int showFlags) {
+        super.onShow(args, showFlags);
+        mStartIntent = args.getParcelable("intent");
+        startVoiceActivity(mStartIntent);
+    }
+
+    void assertPromptFromTestApp(CharSequence prompt, Bundle extras) {
+        String str = prompt.toString();
+        if (str.equals(Utils.TEST_PROMPT)) {
+            Log.i(TAG, "prompt received ok from TestApp in Session");
+        } else {
+            Utils.addErrorResult(extras, "Invalid prompt received: " + str);
+        }
+    }
+
+    synchronized MyTask newTask() {
+        MyTask t = new MyTask();
+        mUsedTasks.add(t);
+        return t;
+    }
+
+    @Override
+    public boolean[] onGetSupportedCommands(String[] commands) {
+        boolean[] results = new boolean[commands.length];
+        Log.i(TAG, "in onGetSupportedCommands");
+        for (int idx = 0; idx < commands.length; idx++) {
+            results[idx] = Utils.TEST_COMMAND.equals(commands[idx]);
+            Log.i(TAG, "command " + commands[idx] + ", support = " + results[idx]);
+        }
+        return results;
+    }
+
+    @Override
+    public void onRequestConfirmation(ConfirmationRequest request) {
+        Bundle extras = request.getExtras();
+        CharSequence prompt = request.getVoicePrompt().getVoicePromptAt(0);
+        Log.i(TAG, "in Session onRequestConfirmation recvd. prompt=" + prompt +
+                ", extras=" + Utils.toBundleString(extras));
+        assertPromptFromTestApp(prompt, extras);
+        AsyncTaskArg asyncTaskArg = new AsyncTaskArg().setRequest(request).setExtras(extras);
+        if (isTestTypeCancel(extras)) {
+            Log.i(TAG, "Sending Cancel.");
+            newTask().execute(
+                    asyncTaskArg.setTestType(Utils.TestCaseType.CONFIRMATION_REQUEST_CANCEL_TEST));
+        } else {
+            Log.i(TAG, "in Session sending sendConfirmationResult. " +
+                    Utils.toBundleString(extras));
+            newTask().execute(
+                    asyncTaskArg.setTestType(Utils.TestCaseType.CONFIRMATION_REQUEST_TEST));
+        }
+    }
+
+    @Override
+    public void onRequestCompleteVoice(CompleteVoiceRequest request) {
+        Bundle extras = request.getExtras();
+        CharSequence prompt = request.getVoicePrompt().getVoicePromptAt(0);
+        Log.i(TAG, "in Session onRequestCompleteVoice recvd. message=" +
+                prompt + ", extras=" + Utils.toBundleString(extras));
+        assertPromptFromTestApp(prompt, extras);
+        AsyncTaskArg asyncTaskArg = new AsyncTaskArg().setRequest(request).setExtras(extras);
+        if (isTestTypeCancel(extras)) {
+            Log.i(TAG, "Sending Cancel.");
+            newTask().execute(
+                    asyncTaskArg.setTestType(Utils.TestCaseType.COMPLETION_REQUEST_CANCEL_TEST));
+        } else {
+            Log.i(TAG, "in Session sending sendConfirmationResult. " +
+                    Utils.toBundleString(extras));
+            newTask().execute(
+                    asyncTaskArg.setTestType(Utils.TestCaseType.COMPLETION_REQUEST_TEST));
+        }
+    }
+
+    @Override
+    public void onRequestAbortVoice(AbortVoiceRequest request) {
+        Bundle extras = request.getExtras();
+        CharSequence prompt = request.getVoicePrompt().getVoicePromptAt(0);
+        Log.i(TAG, "in Session onRequestAbortVoice recvd. message=" +
+                prompt + ", extras=" + Utils.toBundleString(extras));
+        assertPromptFromTestApp(prompt, extras);
+        AsyncTaskArg asyncTaskArg = new AsyncTaskArg().setRequest(request).setExtras(extras);
+        if (isTestTypeCancel(extras)) {
+            Log.i(TAG, "Sending Cancel.");
+            newTask().execute(
+                    asyncTaskArg.setTestType(Utils.TestCaseType.ABORT_REQUEST_CANCEL_TEST));
+        } else {
+            Log.i(TAG, "in Session sending sendAbortResult. " +
+                Utils.toBundleString(extras));
+            newTask().execute(asyncTaskArg.setTestType(Utils.TestCaseType.ABORT_REQUEST_TEST));
+        }
+    }
+
+    @Override
+    public void onRequestCommand(CommandRequest request) {
+        Bundle extras = request.getExtras();
+        Log.i(TAG, "in Session onRequestCommand recvd. Bundle = " +
+                Utils.toBundleString(extras));
+
+        // Make sure that the input request has Utils.TEST_COMMAND sent by TestApp
+        String command = request.getCommand();
+        if (command.equals(Utils.TEST_COMMAND)) {
+            Log.i(TAG, "command received ok from TestApp in Session");
+        } else {
+            Utils.addErrorResult(extras, "Invalid TEST_COMMAND received: " + command);
+        }
+        // Add a field and value in the bundle to be sent to TestApp.
+        // TestApp will ensure that these are transmitted correctly.
+        extras.putString(Utils.TEST_ONCOMMAND_RESULT, Utils.TEST_ONCOMMAND_RESULT_VALUE);
+        AsyncTaskArg asyncTaskArg = new AsyncTaskArg().setRequest(request).setExtras(extras);
+        if (isTestTypeCancel(extras)) {
+            Log.i(TAG, "Sending Cancel.");
+            newTask().execute(
+                    asyncTaskArg.setTestType(Utils.TestCaseType.COMMANDREQUEST_CANCEL_TEST));
+        } else {
+            Log.i(TAG, "in Session sending sendResult. " +
+                    Utils.toBundleString(extras) + ", string_in_bundle: " +
+                    Utils.TEST_ONCOMMAND_RESULT + " = " + Utils.TEST_ONCOMMAND_RESULT_VALUE);
+            newTask().execute(asyncTaskArg.setTestType(Utils.TestCaseType.COMMANDREQUEST_TEST));
+        }
+    }
+
+    void assertPickOptionsFromTestApp(VoiceInteractor.PickOptionRequest.Option[] options,
+            Bundle extras) {
+        if ((options.length != 2) ||
+            !options[0].getLabel().toString().equals(Utils.PICKOPTON_1) ||
+            !options[1].getLabel().toString().equals(Utils.PICKOPTON_2)) {
+            Utils.addErrorResult(extras, "Pickoptions Not received correctly in Session.");
+        } else {
+            Log.i(TAG, "Pickoptions received ok from TestApp in Session");
+        }
+    }
+
+    @Override
+    public void onRequestPickOption(PickOptionRequest request) {
+        Bundle extras = request.getExtras();
+        CharSequence prompt = request.getVoicePrompt().getVoicePromptAt(0);
+        Log.i(TAG, "in Session onRequestPickOption recvd. message=" +
+                prompt + ", options = " + Utils.toOptionsString(request.getOptions()) +
+                ", extras=" + Utils.toBundleString(extras));
+        VoiceInteractor.PickOptionRequest.Option[] picked
+            = new VoiceInteractor.PickOptionRequest.Option[1];
+        assertPromptFromTestApp(prompt, extras);
+        assertPickOptionsFromTestApp(request.getOptions(), extras);
+        picked[0] = new VoiceInteractor.PickOptionRequest.Option(Utils.PICKOPTON_3, 0);
+        AsyncTaskArg asyncTaskArg = new AsyncTaskArg().setRequest(request)
+                .setExtras(extras)
+                .setPickedOptions(picked);
+        if (isTestTypeCancel(extras)) {
+            Log.i(TAG, "in MainInteractionSession, Sending Cancel.");
+            newTask().execute(
+                    asyncTaskArg.setTestType(Utils.TestCaseType.PICKOPTION_REQUEST_CANCEL_TEST));
+        } else {
+            Log.i(TAG, "in MainInteractionSession sending sendPickOptionResult. " +
+                    Utils.toBundleString(extras));
+            newTask().execute(asyncTaskArg.setTestType(Utils.TestCaseType.PICKOPTION_REQUEST_TEST));
+        }
+    }
+
+    public static final boolean isTestTypeCancel(Bundle extras) {
+        Utils.TestCaseType testCaseType;
+        try {
+            testCaseType = Utils.TestCaseType.valueOf(extras.getString(Utils.TESTCASE_TYPE));
+        } catch (IllegalArgumentException | NullPointerException e) {
+            Log.wtf(TAG, "unexpected testCaseType value in Bundle received", e);
+            return true;
+        }
+        return testCaseType == Utils.TestCaseType.COMPLETION_REQUEST_CANCEL_TEST ||
+                testCaseType == Utils.TestCaseType.COMMANDREQUEST_CANCEL_TEST ||
+                testCaseType == Utils.TestCaseType.CONFIRMATION_REQUEST_CANCEL_TEST ||
+                testCaseType == Utils.TestCaseType.PICKOPTION_REQUEST_CANCEL_TEST ||
+                testCaseType == Utils.TestCaseType.ABORT_REQUEST_CANCEL_TEST;
+    }
+
+    private class AsyncTaskArg {
+        ConfirmationRequest confReq;
+        CommandRequest commandReq;
+        CompleteVoiceRequest compReq;
+        AbortVoiceRequest abortReq;
+        PickOptionRequest pickReq;
+        Bundle extras;
+        VoiceInteractor.PickOptionRequest.Option[] picked;
+        Utils.TestCaseType testType;
+
+        AsyncTaskArg setTestType(Utils.TestCaseType t) {testType = t; return this;}
+        AsyncTaskArg setRequest(CommandRequest r) {commandReq = r; return this;}
+        AsyncTaskArg setRequest(ConfirmationRequest r) {confReq = r; return this;}
+        AsyncTaskArg setRequest(CompleteVoiceRequest r) {compReq = r; return this;}
+        AsyncTaskArg setRequest(AbortVoiceRequest r) {abortReq = r; return this;}
+        AsyncTaskArg setRequest(PickOptionRequest r) {pickReq = r; return this;}
+        AsyncTaskArg setExtras(Bundle e) {extras = e;  return this;}
+        AsyncTaskArg setPickedOptions(VoiceInteractor.PickOptionRequest.Option[] p) {
+            picked = p;
+            return this;
+        }
+    }
+
+    private class MyTask extends AsyncTask<AsyncTaskArg, Void, Void> {
+        @Override
+        protected Void doInBackground(AsyncTaskArg... params) {
+            AsyncTaskArg arg = params[0];
+            Log.i(TAG, "in MyTask - doInBackground: requestType = " +
+                    arg.testType.toString());
+            switch (arg.testType) {
+                case ABORT_REQUEST_CANCEL_TEST:
+                    arg.abortReq.cancel();
+                    break;
+                case ABORT_REQUEST_TEST:
+                    arg.abortReq.sendAbortResult(arg.extras);
+                    break;
+                case COMMANDREQUEST_CANCEL_TEST:
+                    arg.commandReq.cancel();
+                    break;
+                case COMMANDREQUEST_TEST:
+                    Log.i(TAG, "in MyTask sendResult. " +
+                            Utils.toBundleString(arg.extras) + ", string_in_bundle: " +
+                            Utils.TEST_ONCOMMAND_RESULT + " = " +
+                            Utils.TEST_ONCOMMAND_RESULT_VALUE);
+                    arg.commandReq.sendResult(arg.extras);
+                    break;
+                case COMPLETION_REQUEST_CANCEL_TEST:
+                    arg.compReq.cancel();
+                    break;
+                case COMPLETION_REQUEST_TEST:
+                    arg.compReq.sendCompleteResult(arg.extras);
+                    break;
+                case CONFIRMATION_REQUEST_CANCEL_TEST:
+                     arg.confReq.cancel();
+                     break;
+                case CONFIRMATION_REQUEST_TEST:
+                     arg.confReq.sendConfirmationResult(true, arg.extras);
+                     break;
+                case PICKOPTION_REQUEST_CANCEL_TEST:
+                     arg.pickReq.cancel();
+                     break;
+                case PICKOPTION_REQUEST_TEST:
+                     StringBuilder buf = new StringBuilder();
+                     for (VoiceInteractor.PickOptionRequest.Option s : arg.picked) {
+                         buf.append("option: " + s.toString() + ", ");
+                     }
+                     Log.i(TAG, "******** Sending PickoptionResult: " +
+                             "picked: size = " + arg.picked.length +
+                             ", Options = " + buf.toString() +
+                             ", Bundle: " + Utils.toBundleString(arg.extras));
+                     arg.pickReq.sendPickOptionResult(arg.picked, arg.extras);
+                     break;
+               default:
+                   Log.i(TAG, "Doing nothing for the testcase type: " + arg.testType);
+                   break;
+            }
+            return null;
+        }
+    }
+}
diff --git a/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainInteractionSessionService.java b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainInteractionSessionService.java
new file mode 100644
index 0000000..43bfc8d
--- /dev/null
+++ b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainInteractionSessionService.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2015 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.voiceinteraction.service;
+
+import android.os.Bundle;
+import android.service.voice.VoiceInteractionSession;
+import android.service.voice.VoiceInteractionSessionService;
+
+public class MainInteractionSessionService extends VoiceInteractionSessionService {
+    @Override
+    public VoiceInteractionSession onNewSession(Bundle args) {
+        return new MainInteractionSession(this);
+    }
+}
diff --git a/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainRecognitionService.java b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainRecognitionService.java
new file mode 100644
index 0000000..5bf203f
--- /dev/null
+++ b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/MainRecognitionService.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2014 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.voiceinteraction.service;
+
+import android.content.Intent;
+import android.speech.RecognitionService;
+import android.util.Log;
+
+/**
+ * Stub recognition service needed to be a complete voice interactor.
+ */
+public class MainRecognitionService extends RecognitionService {
+    private static final String TAG = "MainRecognitionService";
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        Log.i(TAG, "onCreate");
+    }
+
+    @Override
+    protected void onStartListening(Intent recognizerIntent, Callback listener) {
+        Log.i(TAG, "onStartListening");
+    }
+
+    @Override
+    protected void onCancel(Callback listener) {
+        Log.i(TAG, "onCancel");
+    }
+
+    @Override
+    protected void onStopListening(Callback listener) {
+        Log.i(TAG, "onStopListening");
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        Log.i(TAG, "onDestroy");
+    }
+}
diff --git a/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/SettingsActivity.java b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/SettingsActivity.java
new file mode 100644
index 0000000..97f59f8
--- /dev/null
+++ b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/SettingsActivity.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2014 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.voiceinteraction.service;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * Stub activity to test out settings selection for voice interactor.
+ */
+public class SettingsActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+}
diff --git a/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/VoiceInteractionMain.java b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/VoiceInteractionMain.java
new file mode 100644
index 0000000..388b47f
--- /dev/null
+++ b/tests/tests/voiceinteraction/service/src/android/voiceinteraction/service/VoiceInteractionMain.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2015 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.voiceinteraction.service;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.Bundle;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+public class VoiceInteractionMain extends Activity {
+    static final String TAG = "VoiceInteractionMain";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Intent intent = new Intent();
+        intent.setComponent(new ComponentName(this, MainInteractionService.class));
+        ComponentName serviceName = startService(intent);
+        Log.i(TAG, "Started service: " + serviceName);
+    }
+}
diff --git a/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/TestStartActivity.java b/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/TestStartActivity.java
new file mode 100644
index 0000000..682667f
--- /dev/null
+++ b/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/TestStartActivity.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2015 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.voiceinteraction.cts;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.Bundle;
+import android.util.Log;
+
+import android.voiceinteraction.common.Utils;
+
+public class TestStartActivity extends Activity {
+    static final String TAG = "TestStartActivity";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Log.i(TAG, " in onCreate");
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        Log.i(TAG, " in onResume");
+        Intent intent = new Intent();
+        intent.setAction("android.intent.action.START_TEST");
+        intent.setComponent(new ComponentName("android.voiceinteraction.service",
+                "android.voiceinteraction.service.VoiceInteractionMain"));
+        startActivity(intent);
+    }
+
+    @Override protected void onPause() {
+        Log.i(TAG, " in onPause");
+        super.onPause();
+    }
+
+    @Override protected void onStart() {
+        super.onStart();
+        Log.i(TAG, " in onStart");
+    }
+
+    @Override protected void onRestart() {
+        super.onRestart();
+        Log.i(TAG, " in onRestart");
+    }
+
+    @Override protected void onStop() {
+        Log.i(TAG, " in onStop");
+        super.onStop();
+    }
+
+    @Override
+    protected void onDestroy() {
+        Log.i(TAG, " in onDestroy");
+        super.onDestroy();
+    }
+}
diff --git a/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/VoiceInteractionTest.java b/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/VoiceInteractionTest.java
new file mode 100644
index 0000000..0fa89e1
--- /dev/null
+++ b/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/VoiceInteractionTest.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2015 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.voiceinteraction.cts;
+
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
+
+import junit.framework.Assert;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import android.voiceinteraction.common.Utils;
+
+public class VoiceInteractionTest extends ActivityInstrumentationTestCase2<TestStartActivity> {
+    static final String TAG = "VoiceInteractionTest";
+    private static final int TIMEOUT_MS = 20 * 1000;
+
+    private TestStartActivity mTestActivity;
+    private Context mContext;
+    private TestResultsReceiver mReceiver;
+    private Bundle mResults;
+    private final CountDownLatch mLatch = new CountDownLatch(1);
+
+    public VoiceInteractionTest() {
+        super(TestStartActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        startTestActivity();
+        mContext = getInstrumentation().getTargetContext();
+        mReceiver = new TestResultsReceiver();
+        mContext.registerReceiver(mReceiver, new IntentFilter(Utils.BROADCAST_INTENT));
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mContext.unregisterReceiver(mReceiver);
+        super.tearDown();
+    }
+
+    private void startTestActivity() throws Exception {
+        Intent intent = new Intent();
+        intent.setAction("android.intent.action.TEST_START_ACTIVITY");
+        intent.setComponent(new ComponentName(getInstrumentation().getContext(),
+                TestStartActivity.class));
+        setActivityIntent(intent);
+        mTestActivity = getActivity();
+    }
+
+    public void testAll() throws Exception {
+        if (!mLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+            fail("Failed to receive broadcast in " + TIMEOUT_MS + "msec");
+            return;
+        }
+        if (mResults == null) {
+            fail("no results received at all!");
+            return;
+        }
+        int numFails = 0;
+        for (Utils.TestCaseType t : Utils.TestCaseType.values()) {
+            String singleResult = mResults.getString(t.toString());
+            if (singleResult == null) {
+                numFails++;
+                Log.i(TAG, "No testresults received for " + t);
+            } else {
+                verifySingleTestcaseResult(t, singleResult);
+            }
+        }
+        assertEquals(0, numFails);
+        mTestActivity.finish();
+    }
+
+    private void verifySingleTestcaseResult(Utils.TestCaseType testCaseType, String result) {
+        Log.i(TAG, "Recevied testresult: " + result + " for " + testCaseType);
+        switch (testCaseType) {
+          case ABORT_REQUEST_CANCEL_TEST:
+              assertTrue(result.equals(Utils.ABORT_REQUEST_CANCEL_SUCCESS));
+              break;
+          case ABORT_REQUEST_TEST:
+              assertTrue(result.equals(Utils.ABORT_REQUEST_SUCCESS));
+              break;
+          case COMMANDREQUEST_TEST:
+              assertTrue(result.equals(Utils.COMMANDREQUEST_SUCCESS));
+              break;
+          case COMMANDREQUEST_CANCEL_TEST:
+              assertTrue(result.equals(Utils.COMMANDREQUEST_CANCEL_SUCCESS));
+              break;
+          case COMPLETION_REQUEST_CANCEL_TEST:
+              assertTrue(result.equals(Utils.COMPLETION_REQUEST_CANCEL_SUCCESS));
+              break;
+          case COMPLETION_REQUEST_TEST:
+              assertTrue(result.equals(Utils.COMPLETION_REQUEST_SUCCESS));
+              break;
+          case CONFIRMATION_REQUEST_CANCEL_TEST:
+              assertTrue(result.equals(Utils.CONFIRMATION_REQUEST_CANCEL_SUCCESS));
+              break;
+          case CONFIRMATION_REQUEST_TEST:
+              assertTrue(result.equals(Utils.CONFIRMATION_REQUEST_SUCCESS));
+              break;
+          case PICKOPTION_REQUEST_CANCEL_TEST:
+              assertTrue(result.equals(Utils.PICKOPTION_REQUEST_CANCEL_SUCCESS));
+              break;
+          case PICKOPTION_REQUEST_TEST:
+              assertTrue(result.equals(Utils.PICKOPTION_REQUEST_SUCCESS));
+              break;
+          case SUPPORTS_COMMANDS_TEST:
+              assertTrue(result.equals(Utils.SUPPORTS_COMMANDS_SUCCESS));
+              break;
+          default:
+              Log.wtf(TAG, "not expected");
+              break;
+        }
+        Log.i(TAG, testCaseType + " passed");
+    }
+
+
+    class TestResultsReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (intent.getAction().equalsIgnoreCase(Utils.BROADCAST_INTENT)) {
+                Log.i(TAG, "received broadcast with results ");
+                VoiceInteractionTest.this.mResults = intent.getExtras();
+                mLatch.countDown();
+            }
+        }
+    }
+}
diff --git a/tests/tests/voiceinteraction/testapp/Android.mk b/tests/tests/voiceinteraction/testapp/Android.mk
new file mode 100644
index 0000000..7453880
--- /dev/null
+++ b/tests/tests/voiceinteraction/testapp/Android.mk
@@ -0,0 +1,32 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := CtsVoiceInteractionCommon
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsVoiceInteractionApp
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/tests/voiceinteraction/testapp/AndroidManifest.xml b/tests/tests/voiceinteraction/testapp/AndroidManifest.xml
new file mode 100644
index 0000000..1c9ee71
--- /dev/null
+++ b/tests/tests/voiceinteraction/testapp/AndroidManifest.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.voiceinteraction.testapp">
+
+    <application>
+      <uses-library android:name="android.test.runner" />
+
+      <activity android:name="TestApp"
+                android:label="Voice Interaction Test App"
+                android:theme="@android:style/Theme.Material.Light">
+          <intent-filter>
+              <action android:name="android.intent.action.TEST_APP" />
+              <category android:name="android.intent.category.DEFAULT" />
+              <category android:name="android.intent.category.VOICE" />
+          </intent-filter>
+      </activity>
+    </application>
+</manifest>
diff --git a/tests/tests/voiceinteraction/testapp/src/android/voiceinteraction/testapp/TestApp.java b/tests/tests/voiceinteraction/testapp/src/android/voiceinteraction/testapp/TestApp.java
new file mode 100644
index 0000000..1ef6a5c
--- /dev/null
+++ b/tests/tests/voiceinteraction/testapp/src/android/voiceinteraction/testapp/TestApp.java
@@ -0,0 +1,288 @@
+/*
+ * Copyright (C) 2015 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.voiceinteraction.testapp;
+
+import android.app.Activity;
+import android.app.VoiceInteractor;
+import android.app.VoiceInteractor.AbortVoiceRequest;
+import android.app.VoiceInteractor.CommandRequest;
+import android.app.VoiceInteractor.CompleteVoiceRequest;
+import android.app.VoiceInteractor.ConfirmationRequest;
+import android.app.VoiceInteractor.PickOptionRequest;
+import android.app.VoiceInteractor.PickOptionRequest.Option;
+import android.app.VoiceInteractor.Prompt;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.service.voice.VoiceInteractionService;
+import android.util.Log;
+
+import java.util.ArrayList;
+
+import android.voiceinteraction.common.Utils;
+
+public class TestApp extends Activity {
+    static final String TAG = "TestApp";
+
+    VoiceInteractor mInteractor;
+    Bundle mTestinfo = new Bundle();
+    Bundle mTotalInfo = new Bundle();
+    Utils.TestCaseType mTestInProgress;
+    int mIndex = 0;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Log.i(TAG, "TestApp created");
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        mInteractor = getVoiceInteractor();
+        continueTests();
+    }
+
+    private void continueTests() {
+        if (mIndex == Utils.TestCaseType.values().length) {
+            // all tests done
+            Log.i(TAG, "Ready to broadcast");
+            broadcastResults();
+            finish();
+            return;
+        }
+        mTestInProgress = (Utils.TestCaseType.values())[mIndex++];
+        testSetup();
+        switch (mTestInProgress) {
+          case ABORT_REQUEST_TEST:
+          case ABORT_REQUEST_CANCEL_TEST:
+              abortRequest();
+              break;
+
+          case COMPLETION_REQUEST_TEST:
+          case COMPLETION_REQUEST_CANCEL_TEST:
+              completionRequest();
+              break;
+
+          case CONFIRMATION_REQUEST_TEST:
+          case CONFIRMATION_REQUEST_CANCEL_TEST:
+              confirmationRequest();
+              break;
+
+          case PICKOPTION_REQUEST_TEST:
+          case PICKOPTION_REQUEST_CANCEL_TEST:
+              pickOptionRequest();
+              break;
+
+          case COMMANDREQUEST_TEST:
+          case COMMANDREQUEST_CANCEL_TEST:
+              commandRequest();
+              break;
+
+          case SUPPORTS_COMMANDS_TEST:
+              String[] commands = {Utils.TEST_COMMAND};
+              boolean[] supported = mInteractor.supportsCommands(commands);
+              Log.i(TAG, "from supportsCommands: " + supported);
+              if (supported.length == 1 && supported[0]) {
+                addTestResult(Utils.SUPPORTS_COMMANDS_SUCCESS);
+              } else {
+                addTestResult(Utils.TEST_ERROR + " supported commands failure!");
+              }
+              saveTestResults();
+              continueTests();
+              break;
+        }
+    }
+
+    private void testSetup() {
+        mTestinfo.putStringArrayList(Utils.TESTINFO, new ArrayList<String>());
+        mTestinfo.putString(Utils.TESTCASE_TYPE, mTestInProgress.toString());
+    }
+
+    private void saveTestResults() {
+        ArrayList<String> info = mTestinfo.getStringArrayList(Utils.TESTINFO);
+        if (info != null) {
+            StringBuilder buf = new StringBuilder();
+            int count = 0;
+            for (String s : info) {
+                buf.append(s);
+                if (count++ > 0) {
+                    buf.append(", ");
+                }
+            }
+            mTotalInfo.putString(mTestInProgress.toString(), buf.toString());
+            Log.i(TAG, "results for " + mTestInProgress + " = " +
+                    mTotalInfo.getString(mTestInProgress.toString()));
+        }
+    }
+
+    private void broadcastResults() {
+        Intent intent = new Intent(Utils.BROADCAST_INTENT);
+        intent.putExtras(mTotalInfo);
+        Log.i(TAG, "broadcasting: " + intent.toString() + ", Bundle = " + mTotalInfo.toString());
+        sendOrderedBroadcast(intent, null, new DoneReceiver(),
+                             null, Activity.RESULT_OK, null, null);
+    }
+
+    private void confirmationRequest() {
+        Prompt prompt = new Prompt(Utils.TEST_PROMPT);
+        ConfirmationRequest req = new VoiceInteractor.ConfirmationRequest(prompt, mTestinfo) {
+            @Override
+            public void onCancel() {
+                Log.i(TAG, "confirmation request Canceled!");
+                addTestResult(Utils.CONFIRMATION_REQUEST_CANCEL_SUCCESS);
+                saveTestResults();
+                continueTests();
+            }
+
+            @Override
+            public void onConfirmationResult(boolean confirmed, Bundle result) {
+                mTestinfo = result;
+                Log.i(TAG, "Confirmation result: confirmed=" + confirmed +
+                        ", recvd bundle =" + Utils.toBundleString(result));
+                addTestResult(Utils.CONFIRMATION_REQUEST_SUCCESS);
+                saveTestResults();
+                continueTests();
+            }
+        };
+        mInteractor.submitRequest(req);
+    }
+
+    private void completionRequest() {
+        Prompt prompt = new Prompt(Utils.TEST_PROMPT);
+        CompleteVoiceRequest req = new VoiceInteractor.CompleteVoiceRequest(prompt, mTestinfo) {
+            @Override
+            public void onCancel() {
+                Log.i(TAG, "completionRequest Canceled!");
+                addTestResult(Utils.COMPLETION_REQUEST_CANCEL_SUCCESS);
+                saveTestResults();
+                continueTests();
+            }
+
+            @Override
+            public void onCompleteResult(Bundle result) {
+                mTestinfo = result;
+                Log.i(TAG, "Completion result: recvd bundle =" +
+                        Utils.toBundleString(result));
+                addTestResult(Utils.COMPLETION_REQUEST_SUCCESS);
+                saveTestResults();
+                continueTests();
+            }
+        };
+        mInteractor.submitRequest(req);
+    }
+
+    private void abortRequest() {
+        Prompt prompt = new Prompt(Utils.TEST_PROMPT);
+        AbortVoiceRequest req = new VoiceInteractor.AbortVoiceRequest(prompt, mTestinfo) {
+            @Override
+            public void onCancel() {
+                Log.i(TAG, "abortRequest Canceled!");
+                addTestResult(Utils.ABORT_REQUEST_CANCEL_SUCCESS);
+                saveTestResults();
+                continueTests();
+            }
+
+            @Override
+            public void onAbortResult(Bundle result) {
+                mTestinfo = result;
+                Log.i(TAG, "Abort result: recvd bundle =" + Utils.toBundleString(result));
+                addTestResult(Utils.ABORT_REQUEST_SUCCESS);
+                saveTestResults();
+                continueTests();
+            }
+        };
+        mInteractor.submitRequest(req);
+    }
+
+    private void pickOptionRequest() {
+        Prompt prompt = new Prompt(Utils.TEST_PROMPT);
+        PickOptionRequest.Option[] options = new VoiceInteractor.PickOptionRequest.Option[2];
+        options[0] = new Option(Utils.PICKOPTON_1, -1);
+        options[1] = new Option(Utils.PICKOPTON_2, -1);
+        Log.i(TAG, "pickOptionRequest initiated with Bundle = ");
+        PickOptionRequest req = new VoiceInteractor.PickOptionRequest(prompt, options, mTestinfo) {
+            @Override
+            public void onCancel() {
+                Log.i(TAG, "pickOptionRequest Canceled!");
+                addTestResult(Utils.PICKOPTION_REQUEST_CANCEL_SUCCESS);
+                saveTestResults();
+                continueTests();
+            }
+
+            @Override
+            public void onPickOptionResult(boolean finished, Option[] selections, Bundle result) {
+                mTestinfo = result;
+                Log.i(TAG, "PickOption result: finished = " + finished +
+                        ", selections = " + Utils.toOptionsString(selections) +
+                        ", recvd bundle =" + Utils.toBundleString(result));
+                if ((selections.length != 1) ||
+                    !selections[0].getLabel().toString().equals(Utils.PICKOPTON_3)) {
+                    Utils.addErrorResult(result,
+                            "Pickoption Selections Not received correctly in TestApp.");
+                } else {
+                    addTestResult(Utils.PICKOPTION_REQUEST_SUCCESS);
+                }
+                saveTestResults();
+                continueTests();
+            }
+        };
+        mInteractor.submitRequest(req);
+    }
+
+    private void commandRequest() {
+        CommandRequest req = new VoiceInteractor.CommandRequest(Utils.TEST_COMMAND, mTestinfo) {
+            @Override
+            public void onCancel() {
+                Log.i(TAG, "commandRequest Canceled!");
+                addTestResult(Utils.COMMANDREQUEST_CANCEL_SUCCESS);
+                saveTestResults();
+                continueTests();
+            }
+
+            @Override
+            public void onCommandResult(boolean isCompleted, Bundle result) {
+                mTestinfo = result;
+                Log.i(TAG, "CommandRequest onCommandResult result: isCompleted = " + isCompleted +
+                        ", recvd bundle =" + Utils.toBundleString(result));
+                String received = result.getString(Utils.TEST_ONCOMMAND_RESULT);
+                if (received != null && received.equals(Utils.TEST_ONCOMMAND_RESULT_VALUE)) {
+                    addTestResult(Utils.COMMANDREQUEST_SUCCESS);
+                } else {
+                    Utils.addErrorResult(result,
+                            "Invalid commandrequest result received: " + received);
+                }
+                saveTestResults();
+                continueTests();
+            }
+        };
+        mInteractor.submitRequest(req);
+    }
+
+    private void addTestResult(final String msg) {
+        mTestinfo.getStringArrayList(Utils.TESTINFO).add(msg);
+    }
+
+    class DoneReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Log.i(TAG, "Done_broadcast " + intent.getAction());
+        }
+    }
+}
diff --git a/tests/tests/voicesettings/Android.mk b/tests/tests/voicesettings/Android.mk
new file mode 100644
index 0000000..71fead6
--- /dev/null
+++ b/tests/tests/voicesettings/Android.mk
@@ -0,0 +1,33 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := CtsVoiceSettingsCommon ctstestrunner ctsdeviceutil
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsVoiceSettingsTestCases
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/tests/voicesettings/AndroidManifest.xml b/tests/tests/voicesettings/AndroidManifest.xml
new file mode 100644
index 0000000..bf938f9
--- /dev/null
+++ b/tests/tests/voicesettings/AndroidManifest.xml
@@ -0,0 +1,45 @@
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.voicesettings.cts">
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.BIND_VOICE_INTERACTION" />
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+
+        <activity android:name="TestStartActivity"
+                  android:label="The Target Activity for VoiceSettings CTS Test">
+            <intent-filter>
+                <action android:name="android.intent.action.TEST_START_ACTIVITY_ZEN_MODE" />
+                <action android:name="android.intent.action.TEST_START_ACTIVITY_AIRPLANE_MODE" />
+                <action android:name="android.intent.action.TEST_START_ACTIVITY_BATTERYSAVER_MODE" />
+                <category android:name="android.intent.category.LAUNCHER" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+    </application>
+
+    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="android.voicesettings.cts"
+                     android:label="CTS tests of android.voicesettings">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+</manifest>
+
diff --git a/tests/tests/voicesettings/AndroidTest.xml b/tests/tests/voicesettings/AndroidTest.xml
new file mode 100644
index 0000000..0a3974d
--- /dev/null
+++ b/tests/tests/voicesettings/AndroidTest.xml
@@ -0,0 +1,23 @@
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="Test module config for VoiceInteraction">
+    <include name="common-config" />
+    <option name="cts-apk-installer:test-file-name" value="CtsVoiceSettingsService.apk" />
+    <option name="run-command:run-command"
+         value="settings put secure voice_interaction_service android.voicesettings.service/.MainInteractionService" />
+    <option name="run-command:teardown-command"
+         value="settings put secure voice_interaction_service com.google.android.googlequicksearchbox/com.google.android.voiceinteraction.GsaVoiceInteractionService" />
+    <option name="cts-apk-installer:test-file-name" value="CtsVoiceSettingsTestCases.apk" />
+</configuration>
diff --git a/tests/tests/voicesettings/common/Android.mk b/tests/tests/voicesettings/common/Android.mk
new file mode 100644
index 0000000..1478ef2
--- /dev/null
+++ b/tests/tests/voicesettings/common/Android.mk
@@ -0,0 +1,30 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_MODULE := CtsVoiceSettingsCommon
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/tests/tests/voicesettings/common/src/android/voicesettings/common/Utils.java b/tests/tests/voicesettings/common/src/android/voicesettings/common/Utils.java
new file mode 100644
index 0000000..44514b0
--- /dev/null
+++ b/tests/tests/voicesettings/common/src/android/voicesettings/common/Utils.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2015 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 common.src.android.voicesettings.common;
+
+import android.os.Bundle;
+
+public class Utils {
+    public enum TestcaseType {
+        ZEN_MODE_ON,
+        ZEN_MODE_OFF,
+        AIRPLANE_MODE_ON,
+        AIRPLANE_MODE_OFF,
+        BATTERYSAVER_MODE_ON,
+        BATTERYSAVER_MODE_OFF,
+    }
+    public static final String TESTCASE_TYPE = "Testcase_type";
+    public static final String BROADCAST_INTENT =
+            "android.intent.action.FROM_VOICESETTINGS_CTS_TEST_";
+    public static final int NUM_MINUTES_FOR_ZENMODE = 10;
+
+    public static final String toBundleString(Bundle bundle) {
+        if (bundle == null) {
+            return "*** Bundle is null ****";
+        }
+        StringBuilder buf = new StringBuilder();
+        if (bundle != null) {
+            buf.append("extras: ");
+            for (String s : bundle.keySet()) {
+                buf.append("(" + s + " = " + bundle.get(s) + "), ");
+            }
+        }
+        return buf.toString();
+    }
+}
diff --git a/tests/tests/voicesettings/res/xml/interaction_service.xml b/tests/tests/voicesettings/res/xml/interaction_service.xml
new file mode 100644
index 0000000..bf40892
--- /dev/null
+++ b/tests/tests/voicesettings/res/xml/interaction_service.xml
@@ -0,0 +1,20 @@
+<!-- Copyright (C) 2015 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.
+-->
+
+<voice-interaction-service xmlns:android="http://schemas.android.com/apk/res/android"
+    android:sessionService="android.voicesettings.service.MainInteractionSessionService"
+    android:recognitionService="android.voicesettings.service.MainRecognitionService"
+    android:settingsActivity="android.voicesettings.service.SettingsActivity"
+    android:supportsAssist="false" />
diff --git a/tests/tests/voicesettings/service/Android.mk b/tests/tests/voicesettings/service/Android.mk
new file mode 100644
index 0000000..97866d5
--- /dev/null
+++ b/tests/tests/voicesettings/service/Android.mk
@@ -0,0 +1,32 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_STATIC_JAVA_LIBRARIES := CtsVoiceSettingsCommon ctstestrunner ctsdeviceutil
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsVoiceSettingsService
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/tests/voicesettings/service/AndroidManifest.xml b/tests/tests/voicesettings/service/AndroidManifest.xml
new file mode 100644
index 0000000..13671b6
--- /dev/null
+++ b/tests/tests/voicesettings/service/AndroidManifest.xml
@@ -0,0 +1,65 @@
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.voicesettings.service">
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+        <service android:name=".MainInteractionService"
+                android:label="CTS test voice interaction service"
+                android:permission="android.permission.BIND_VOICE_INTERACTION"
+                android:process=":interactor"
+                android:exported="true">
+            <meta-data android:name="android.voice_interaction"
+                       android:resource="@xml/interaction_service" />
+            <intent-filter>
+                <action android:name="android.service.voice.VoiceInteractionService" />
+            </intent-filter>
+        </service>
+        <activity android:name=".VoiceInteractionMain" >
+            <intent-filter>
+                <action android:name="android.intent.action.VIMAIN_ZEN_MODE_ON" />
+                <action android:name="android.intent.action.VIMAIN_ZEN_MODE_OFF" />
+                <action android:name="android.intent.action.VIMAIN_AIRPLANE_MODE_ON" />
+                <action android:name="android.intent.action.VIMAIN_AIRPLANE_MODE_OFF" />
+                <action android:name="android.intent.action.VIMAIN_BATTERYSAVER_MODE_ON" />
+                <action android:name="android.intent.action.VIMAIN_BATTERYSAVER_MODE_OFF" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".SettingsActivity"
+                  android:label="Voice Interaction Settings">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+        <service android:name=".MainInteractionSessionService"
+                android:permission="android.permission.BIND_VOICE_INTERACTION"
+                android:process=":session">
+        </service>
+        <service android:name=".MainRecognitionService"
+                android:label="CTS Voice Recognition Service">
+            <intent-filter>
+                <action android:name="android.speech.RecognitionService" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <meta-data android:name="android.speech" android:resource="@xml/recognition_service" />
+        </service>
+    </application>
+</manifest>
+
diff --git a/tests/tests/voicesettings/service/res/xml/interaction_service.xml b/tests/tests/voicesettings/service/res/xml/interaction_service.xml
new file mode 100644
index 0000000..bf40892
--- /dev/null
+++ b/tests/tests/voicesettings/service/res/xml/interaction_service.xml
@@ -0,0 +1,20 @@
+<!-- Copyright (C) 2015 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.
+-->
+
+<voice-interaction-service xmlns:android="http://schemas.android.com/apk/res/android"
+    android:sessionService="android.voicesettings.service.MainInteractionSessionService"
+    android:recognitionService="android.voicesettings.service.MainRecognitionService"
+    android:settingsActivity="android.voicesettings.service.SettingsActivity"
+    android:supportsAssist="false" />
diff --git a/tests/tests/voicesettings/service/res/xml/recognition_service.xml b/tests/tests/voicesettings/service/res/xml/recognition_service.xml
new file mode 100644
index 0000000..9d80f24
--- /dev/null
+++ b/tests/tests/voicesettings/service/res/xml/recognition_service.xml
@@ -0,0 +1,17 @@
+<!-- Copyright (C) 2015 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.
+-->
+
+<recognition-service xmlns:android="http://schemas.android.com/apk/res/android"
+    android:settingsActivity="android.voicesettings.service.SettingsActivity" />
diff --git a/tests/tests/voicesettings/service/src/android/voicesettings/service/MainInteractionService.java b/tests/tests/voicesettings/service/src/android/voicesettings/service/MainInteractionService.java
new file mode 100644
index 0000000..6302b78
--- /dev/null
+++ b/tests/tests/voicesettings/service/src/android/voicesettings/service/MainInteractionService.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2015 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.voicesettings.service;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.os.Bundle;
+import android.service.voice.VoiceInteractionService;
+import android.util.Log;
+import common.src.android.voicesettings.common.Utils;
+
+public class MainInteractionService extends VoiceInteractionService {
+    static final String TAG = "MainInteractionService";
+    private Intent mIntent;
+    private boolean mReady = false;
+
+    @Override
+    public void onReady() {
+        super.onReady();
+        mReady = true;
+    }
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        Log.i(TAG, "onStartCommand received");
+        mIntent = intent;
+        Log.i(TAG, "received_testcasetype = " + mIntent.getStringExtra(Utils.TESTCASE_TYPE));
+        maybeStart();
+        return START_NOT_STICKY;
+    }
+
+    private void maybeStart() {
+       if (mIntent == null || !mReady) {
+            Log.wtf(TAG, "Can't start session because either intent is null or onReady() "
+                    + "is not called yet. mIntent = " + mIntent + ", mReady = " + mReady);
+        } else {
+            Log.i(TAG, "Yay! about to start MainInteractionSession");
+            if (isActiveService(this, new ComponentName(this, getClass()))) {
+                Bundle args = new Bundle();
+                args.putString(Utils.TESTCASE_TYPE, mIntent.getStringExtra(Utils.TESTCASE_TYPE));
+                Log.i(TAG, "xferring_testcasetype = " + args.getString(Utils.TESTCASE_TYPE));
+                showSession(args, 0);
+            } else {
+                Log.wtf(TAG, "**** Not starting MainInteractionService because" +
+                    " it is not set as the current voice interaction service");
+            }
+        }
+    }
+}
diff --git a/tests/tests/voicesettings/service/src/android/voicesettings/service/MainInteractionSession.java b/tests/tests/voicesettings/service/src/android/voicesettings/service/MainInteractionSession.java
new file mode 100644
index 0000000..c2b7e18
--- /dev/null
+++ b/tests/tests/voicesettings/service/src/android/voicesettings/service/MainInteractionSession.java
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2015 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.voicesettings.service;
+
+import static android.provider.Settings.ACTION_VOICE_CONTROL_DO_NOT_DISTURB_MODE;
+import static android.provider.Settings.EXTRA_DO_NOT_DISTURB_MODE_ENABLED;
+import static android.provider.Settings.EXTRA_DO_NOT_DISTURB_MODE_MINUTES;
+import static android.provider.Settings.ACTION_VOICE_CONTROL_AIRPLANE_MODE;
+import static android.provider.Settings.EXTRA_AIRPLANE_MODE_ENABLED;
+import static android.provider.Settings.ACTION_VOICE_CONTROL_BATTERY_SAVER_MODE;
+import static android.provider.Settings.EXTRA_BATTERY_SAVER_MODE_ENABLED;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.service.voice.VoiceInteractionSession;
+import android.util.Log;
+
+import common.src.android.voicesettings.common.Utils;
+import common.src.android.voicesettings.common.Utils.TestcaseType;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MainInteractionSession extends VoiceInteractionSession {
+    static final String TAG = "MainInteractionSession";
+
+    List<MyTask> mUsedTasks = new ArrayList<MyTask>();
+    Context mContext;
+    TestcaseType mTestType;
+
+    MainInteractionSession(Context context) {
+        super(context);
+        mContext = context;
+    }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+    }
+
+    @Override
+    public void onDestroy() {
+        Log.i(TAG, "Canceling the Asynctasks in onDestroy()");
+        for (MyTask t : mUsedTasks) {
+            t.cancel(true);
+        }
+        super.onDestroy();
+    }
+
+    @Override
+    public void onShow(Bundle args, int showFlags) {
+        super.onShow(args, showFlags);
+        String testCaseType = args.getString(Utils.TESTCASE_TYPE);
+        Log.i(TAG, "received_testcasetype = " + testCaseType);
+        try {
+            mTestType = TestcaseType.valueOf(testCaseType);
+        } catch (IllegalArgumentException e) {
+            Log.wtf(TAG, e);
+            return;
+        } catch (NullPointerException e) {
+            Log.wtf(TAG, e);
+            return;
+        }
+        Intent intent;
+        switch(mTestType) {
+            case ZEN_MODE_ON:
+                intent = new Intent(ACTION_VOICE_CONTROL_DO_NOT_DISTURB_MODE);
+                intent.putExtra(EXTRA_DO_NOT_DISTURB_MODE_ENABLED, true);
+                intent.putExtra(EXTRA_DO_NOT_DISTURB_MODE_MINUTES, Utils.NUM_MINUTES_FOR_ZENMODE);
+                break;
+            case ZEN_MODE_OFF:
+                intent = new Intent(ACTION_VOICE_CONTROL_DO_NOT_DISTURB_MODE);
+                intent.putExtra(EXTRA_DO_NOT_DISTURB_MODE_ENABLED, false);
+                break;
+            case AIRPLANE_MODE_ON:
+                intent = new Intent(ACTION_VOICE_CONTROL_AIRPLANE_MODE);
+                intent.putExtra(EXTRA_AIRPLANE_MODE_ENABLED, true);
+                break;
+            case AIRPLANE_MODE_OFF:
+                intent = new Intent(ACTION_VOICE_CONTROL_AIRPLANE_MODE);
+                intent.putExtra(EXTRA_AIRPLANE_MODE_ENABLED, false);
+                break;
+            case BATTERYSAVER_MODE_ON:
+                intent = new Intent(ACTION_VOICE_CONTROL_BATTERY_SAVER_MODE);
+                intent.putExtra(EXTRA_BATTERY_SAVER_MODE_ENABLED, true);
+                break;
+            case BATTERYSAVER_MODE_OFF:
+                intent = new Intent(ACTION_VOICE_CONTROL_BATTERY_SAVER_MODE);
+                intent.putExtra(EXTRA_BATTERY_SAVER_MODE_ENABLED, false);
+                break;
+            default:
+                Log.i(TAG, "Not implemented!");
+                return;
+        }
+        Log.i(TAG, "starting_voiceactivity: " + intent.toString());
+        startVoiceActivity(intent);
+    }
+
+    @Override
+    public void onTaskFinished(Intent intent, int taskId) {
+        // extras contain the info on what the activity started above did.
+        // we probably could verify this also.
+        Bundle extras = intent.getExtras();
+        Log.i(TAG, "in onTaskFinished: testcasetype = " + mTestType + ", intent: " +
+                intent.toString() + Utils.toBundleString(extras));
+        Intent broadcastIntent = new Intent(Utils.BROADCAST_INTENT + mTestType.toString());
+        if (extras == null) {
+            extras = new Bundle();
+        }
+        extras.putString(Utils.TESTCASE_TYPE, mTestType.toString());
+        broadcastIntent.putExtras(extras);
+        Log.i(TAG, "sending_broadcast: Bundle = " + Utils.toBundleString(extras) +
+                ", intent = " + broadcastIntent.toString());
+        mContext.sendBroadcast(broadcastIntent);
+    }
+
+    synchronized MyTask newTask() {
+        MyTask t = new MyTask();
+        mUsedTasks.add(t);
+        return t;
+    }
+
+    @Override
+    public void onRequestCompleteVoice(CompleteVoiceRequest request) {
+        CharSequence prompt = request.getVoicePrompt().getVoicePromptAt(0);
+        Log.i(TAG, "in Session testcasetype = " + mTestType +
+                ", onRequestCompleteVoice recvd. message = " + prompt);
+        AsyncTaskArg asyncTaskArg = new AsyncTaskArg().setRequest(request).setCompleteReq(true);
+        newTask().execute(asyncTaskArg);
+    }
+
+    @Override
+    public void onRequestAbortVoice(AbortVoiceRequest request) {
+        AsyncTaskArg asyncTaskArg = new AsyncTaskArg().setRequest(request).setCompleteReq(false);
+        Log.i(TAG, "in Session sending sendAbortResult. ");
+        newTask().execute(asyncTaskArg);
+    }
+
+    private class AsyncTaskArg {
+        CompleteVoiceRequest mCompReq;
+        AbortVoiceRequest mAbortReq;
+        boolean isCompleteRequest = true;
+
+        AsyncTaskArg setRequest(CompleteVoiceRequest r) {
+            mCompReq = r;
+            return this;
+        }
+
+        AsyncTaskArg setRequest(AbortVoiceRequest r) {
+            mAbortReq = r;
+            return this;
+        }
+
+        AsyncTaskArg setCompleteReq(boolean flag) {
+            isCompleteRequest = flag;
+            return this;
+        }
+    }
+
+    private class MyTask extends AsyncTask<AsyncTaskArg, Void, Void> {
+        @Override
+        protected Void doInBackground(AsyncTaskArg... params) {
+            AsyncTaskArg arg = params[0];
+            Log.i(TAG, "in MyTask - doInBackground: testType = " +
+                    MainInteractionSession.this.mTestType);
+            if (arg.isCompleteRequest) {
+                arg.mCompReq.sendCompleteResult(new Bundle());
+            } else {
+                arg.mAbortReq.sendAbortResult(new Bundle());
+            }
+            return null;
+        }
+    }
+}
diff --git a/tests/tests/voicesettings/service/src/android/voicesettings/service/MainInteractionSessionService.java b/tests/tests/voicesettings/service/src/android/voicesettings/service/MainInteractionSessionService.java
new file mode 100644
index 0000000..2b302b8
--- /dev/null
+++ b/tests/tests/voicesettings/service/src/android/voicesettings/service/MainInteractionSessionService.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2015 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.voicesettings.service;
+
+import android.os.Bundle;
+import android.service.voice.VoiceInteractionSession;
+import android.service.voice.VoiceInteractionSessionService;
+
+public class MainInteractionSessionService extends VoiceInteractionSessionService {
+    @Override
+    public VoiceInteractionSession onNewSession(Bundle args) {
+        return new MainInteractionSession(this);
+    }
+}
diff --git a/tests/tests/voicesettings/service/src/android/voicesettings/service/MainRecognitionService.java b/tests/tests/voicesettings/service/src/android/voicesettings/service/MainRecognitionService.java
new file mode 100644
index 0000000..9b0e95d
--- /dev/null
+++ b/tests/tests/voicesettings/service/src/android/voicesettings/service/MainRecognitionService.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2015 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.voicesettings.service;
+
+import android.content.Intent;
+import android.speech.RecognitionService;
+import android.util.Log;
+
+/**
+ * Stub recognition service needed to be a complete voice interactor.
+ */
+public class MainRecognitionService extends RecognitionService {
+    private static final String TAG = "MainRecognitionService";
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        Log.i(TAG, "onCreate");
+    }
+
+    @Override
+    protected void onStartListening(Intent recognizerIntent, Callback listener) {
+        Log.i(TAG, "onStartListening");
+    }
+
+    @Override
+    protected void onCancel(Callback listener) {
+        Log.i(TAG, "onCancel");
+    }
+
+    @Override
+    protected void onStopListening(Callback listener) {
+        Log.i(TAG, "onStopListening");
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        Log.i(TAG, "onDestroy");
+    }
+}
diff --git a/tests/tests/voicesettings/service/src/android/voicesettings/service/SettingsActivity.java b/tests/tests/voicesettings/service/src/android/voicesettings/service/SettingsActivity.java
new file mode 100644
index 0000000..140bca4
--- /dev/null
+++ b/tests/tests/voicesettings/service/src/android/voicesettings/service/SettingsActivity.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2015 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.voicesettings.service;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * Stub activity to test out settings selection for voice interactor.
+ */
+public class SettingsActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+}
diff --git a/tests/tests/voicesettings/service/src/android/voicesettings/service/VoiceInteractionMain.java b/tests/tests/voicesettings/service/src/android/voicesettings/service/VoiceInteractionMain.java
new file mode 100644
index 0000000..adc2980
--- /dev/null
+++ b/tests/tests/voicesettings/service/src/android/voicesettings/service/VoiceInteractionMain.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2015 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.voicesettings.service;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.ComponentName;
+import android.os.Bundle;
+import android.util.Log;
+
+import common.src.android.voicesettings.common.Utils;
+
+public class VoiceInteractionMain extends Activity {
+    static final String TAG = "VoiceInteractionMain";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Intent intent = new Intent();
+        String testCaseType = getIntent().getStringExtra(Utils.TESTCASE_TYPE);
+        Log.i(TAG, "received_testcasetype = " + testCaseType);
+        intent.putExtra(Utils.TESTCASE_TYPE, testCaseType);
+        intent.setComponent(new ComponentName(this, MainInteractionService.class));
+        ComponentName serviceName = startService(intent);
+        Log.i(TAG, "Started service: " + serviceName);
+    }
+}
diff --git a/tests/tests/voicesettings/src/android/voicesettings/cts/AirplaneModeTest.java b/tests/tests/voicesettings/src/android/voicesettings/cts/AirplaneModeTest.java
new file mode 100644
index 0000000..8abe396
--- /dev/null
+++ b/tests/tests/voicesettings/src/android/voicesettings/cts/AirplaneModeTest.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2015 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.voicesettings.cts;
+
+import android.provider.Settings;
+import android.provider.Settings.Global;
+import android.util.Log;
+
+import common.src.android.voicesettings.common.Utils;
+
+public class AirplaneModeTest extends VoiceSettingsTestBase {
+    static final String TAG = "AirplaneModeTest";
+
+    private static final int AIRPLANE_MODE_IS_OFF = 0;
+    private static final int AIRPLANE_MODE_IS_ON = 1;
+
+    public AirplaneModeTest() {
+        super();
+    }
+
+    public void testAll() throws Exception {
+        startTestActivity("AIRPLANE_MODE");
+        int mode = getMode();
+        Log.i(TAG, "Before testing, AIRPLANE_MODE is set to: " + mode);
+        if (mode == AIRPLANE_MODE_IS_OFF) {
+            // mode is currently OFF.
+            // run a test to turn it on.
+            // After successful run of the test, run a test to turn it back off.
+            if (!runTest(Utils.TestcaseType.AIRPLANE_MODE_ON, AIRPLANE_MODE_IS_ON)) {
+                // the test failed. don't test the next one.
+                return;
+            }
+            runTest(Utils.TestcaseType.AIRPLANE_MODE_OFF, AIRPLANE_MODE_IS_OFF);
+        } else {
+            // mode is currently ON.
+            // run a test to turn it off.
+            // After successful run of the test, run a test to turn it back on.
+            if (!runTest(Utils.TestcaseType.AIRPLANE_MODE_OFF, AIRPLANE_MODE_IS_OFF)) {
+                // the test failed. don't test the next one.
+                return;
+            }
+            runTest(Utils.TestcaseType.AIRPLANE_MODE_ON, AIRPLANE_MODE_IS_ON);
+        }
+    }
+
+    private boolean runTest(Utils.TestcaseType test, int expectedMode) throws Exception {
+        if (!startTestAndWaitForBroadcast(test)) {
+            return false;
+        }
+
+        // verify the test results
+        int mode = getMode();
+        Log.i(TAG, "After testing, AIRPLANE_MODE is set to: " + mode);
+        assertEquals(expectedMode, mode);
+        Log.i(TAG, "Successfully Tested: " + test);
+        return true;
+    }
+
+    private int getMode() throws Exception {
+        return Settings.Global.getInt(mContext.getContentResolver(),
+            Settings.Global.AIRPLANE_MODE_ON);
+    }
+}
diff --git a/tests/tests/voicesettings/src/android/voicesettings/cts/BatterySaverModeTest.java b/tests/tests/voicesettings/src/android/voicesettings/cts/BatterySaverModeTest.java
new file mode 100644
index 0000000..3d1357a
--- /dev/null
+++ b/tests/tests/voicesettings/src/android/voicesettings/cts/BatterySaverModeTest.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2015 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.voicesettings.cts;
+
+import android.content.Context;
+import android.os.PowerManager;
+import android.util.Log;
+
+import common.src.android.voicesettings.common.Utils;
+
+public class BatterySaverModeTest extends VoiceSettingsTestBase {
+    static final String TAG = "BatterySaverModeTest";
+
+    public BatterySaverModeTest() {
+        super();
+    }
+
+    public void testAll() throws Exception {
+        startTestActivity("BATTERYSAVER_MODE");
+        boolean modeIsOn = isModeOn();
+        Log.i(TAG, "Before testing, BATTERYSAVER_MODE is set to: " + modeIsOn);
+        if (modeIsOn) {
+            // mode is currently ON.
+            // run a test to turn it off.
+            // After successful run of the test, run a test to turn it back on.
+            if (!runTest(Utils.TestcaseType.BATTERYSAVER_MODE_OFF, false)) {
+                // the test failed. don't test the next one.
+                return;
+            }
+            runTest(Utils.TestcaseType.BATTERYSAVER_MODE_ON, true);
+        } else {
+            // mode is currently OFF.
+            // run a test to turn it on.
+            // After successful run of the test, run a test to turn it back off.
+            if (!runTest(Utils.TestcaseType.BATTERYSAVER_MODE_ON, true)) {
+                // the test failed. don't test the next one.
+                return;
+            }
+            runTest(Utils.TestcaseType.BATTERYSAVER_MODE_OFF, false);
+        }
+    }
+
+    private boolean runTest(Utils.TestcaseType test, boolean expectedMode) throws Exception {
+        if (!startTestAndWaitForBroadcast(test)) {
+            return false;
+        }
+
+        // Verify the test results
+        // Since CTS test needs the device to be connected to the host computer via USB,
+        // Batter Saver mode can't be turned on/off.
+        // The most we can do is that the broadcast frmo MainInteractionSession is received
+        // because that signals the firing and completion of BatterySaverModeVoiceActivity
+        // caused by the intent to set Battery Saver mode.
+        return true;
+    }
+
+    private boolean isModeOn() {
+        PowerManager powerManager = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
+        return powerManager.isPowerSaveMode();
+    }
+}
diff --git a/tests/tests/voicesettings/src/android/voicesettings/cts/TestStartActivity.java b/tests/tests/voicesettings/src/android/voicesettings/cts/TestStartActivity.java
new file mode 100644
index 0000000..cef29b1
--- /dev/null
+++ b/tests/tests/voicesettings/src/android/voicesettings/cts/TestStartActivity.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2015 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.voicesettings.cts;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.ComponentName;
+import android.os.Bundle;
+import android.util.Log;
+
+import common.src.android.voicesettings.common.Utils;
+
+public class TestStartActivity extends Activity {
+    static final String TAG = "TestStartActivity";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Log.i(TAG, " in onCreate");
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        Log.i(TAG, " in onResume");
+    }
+
+    void startTest(String testCaseType) {
+        Intent intent = new Intent();
+        Log.i(TAG, "received_testcasetype = " + testCaseType);
+        intent.putExtra(Utils.TESTCASE_TYPE, testCaseType);
+        intent.setAction("android.intent.action.VIMAIN_" + testCaseType);
+        intent.setComponent(new ComponentName("android.voicesettings.service",
+                "android.voicesettings.service.VoiceInteractionMain"));
+        startActivity(intent);
+    }
+
+    @Override
+    protected void onPause() {
+        Log.i(TAG, " in onPause");
+        super.onPause();
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        Log.i(TAG, " in onStart");
+    }
+
+    @Override
+    protected void onRestart() {
+        super.onRestart();
+        Log.i(TAG, " in onRestart");
+    }
+
+    @Override
+    protected void onStop() {
+        Log.i(TAG, " in onStop");
+        super.onStop();
+    }
+
+    @Override
+    protected void onDestroy() {
+        Log.i(TAG, " in onDestroy");
+        super.onDestroy();
+    }
+}
diff --git a/tests/tests/voicesettings/src/android/voicesettings/cts/VoiceSettingsTestBase.java b/tests/tests/voicesettings/src/android/voicesettings/cts/VoiceSettingsTestBase.java
new file mode 100644
index 0000000..5386497
--- /dev/null
+++ b/tests/tests/voicesettings/src/android/voicesettings/cts/VoiceSettingsTestBase.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2015 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.voicesettings.cts;
+
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
+
+import common.src.android.voicesettings.common.Utils;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+public class VoiceSettingsTestBase extends ActivityInstrumentationTestCase2<TestStartActivity> {
+    static final String TAG = "VoiceSettingsTestBase";
+    protected static final int TIMEOUT_MS = 20 * 1000;
+
+    protected Context mContext;
+    protected Bundle mResultExtras;
+    private CountDownLatch mLatch;
+    private ActivityDoneReceiver mActivityDoneReceiver = null;
+    private TestStartActivity mActivity;
+    private Utils.TestcaseType mTestCaseType;
+
+    public VoiceSettingsTestBase() {
+        super(TestStartActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mContext = getInstrumentation().getTargetContext();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mContext.unregisterReceiver(mActivityDoneReceiver);
+        super.tearDown();
+    }
+
+    protected void startTestActivity(String intentSuffix) {
+        Intent intent = new Intent();
+        intent.setAction("android.intent.action.TEST_START_ACTIVITY_" + intentSuffix);
+        intent.setComponent(new ComponentName(getInstrumentation().getContext(),
+                TestStartActivity.class));
+        setActivityIntent(intent);
+        mActivity = getActivity();
+    }
+
+    protected void registerBroadcastReceiver(Utils.TestcaseType testCaseType) throws Exception {
+        mTestCaseType = testCaseType;
+        mLatch = new CountDownLatch(1);
+        if (mActivityDoneReceiver != null) {
+            mContext.unregisterReceiver(mActivityDoneReceiver);
+        }
+        mActivityDoneReceiver = new ActivityDoneReceiver();
+        mContext.registerReceiver(mActivityDoneReceiver,
+                new IntentFilter(Utils.BROADCAST_INTENT + testCaseType.toString()));
+    }
+
+    protected boolean startTestAndWaitForBroadcast(Utils.TestcaseType testCaseType)
+            throws Exception {
+        Log.i(TAG, "Begin Testing: " + testCaseType);
+        registerBroadcastReceiver(testCaseType);
+        mActivity.startTest(testCaseType.toString());
+        if (!mLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+            fail("Failed to receive broadcast in " + TIMEOUT_MS + "msec");
+            return false;
+        }
+        return true;
+    }
+
+    class ActivityDoneReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (intent.getAction().equals(
+                    Utils.BROADCAST_INTENT +
+                        VoiceSettingsTestBase.this.mTestCaseType.toString())) {
+                Bundle extras = intent.getExtras();
+                Log.i(TAG, "received_broadcast for " + Utils.toBundleString(extras));
+                VoiceSettingsTestBase.this.mResultExtras = extras;
+                mLatch.countDown();
+            }
+        }
+    }
+}
diff --git a/tests/tests/voicesettings/src/android/voicesettings/cts/ZenModeTest.java b/tests/tests/voicesettings/src/android/voicesettings/cts/ZenModeTest.java
new file mode 100644
index 0000000..8c2efbe
--- /dev/null
+++ b/tests/tests/voicesettings/src/android/voicesettings/cts/ZenModeTest.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2015 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.voicesettings.cts;
+
+import static android.provider.Settings.EXTRA_DO_NOT_DISTURB_MODE_ENABLED;
+import static android.provider.Settings.EXTRA_DO_NOT_DISTURB_MODE_MINUTES;
+
+import android.provider.Settings;
+import android.provider.Settings.Global;
+import android.util.Log;
+
+import common.src.android.voicesettings.common.Utils;
+
+public class ZenModeTest extends VoiceSettingsTestBase {
+    static final String TAG = "ZenModeTest";
+
+    // The following are hidden in frameworks/base/core/java/android/provider/Settings.java
+    // If they weren't, we could have used them directly here.
+    private static final String ZEN_MODE = "zen_mode";
+    private static final int ZEN_MODE_IS_OFF = 0;
+    private static final int ZEN_MODE_IS_ALARMS = 3;
+
+    public ZenModeTest() {
+        super();
+    }
+
+    public void testAll() throws Exception {
+        startTestActivity("ZEN_MODE");
+        int mode = getMode();
+        Log.i(TAG, "Before testing, zen-mode is set to: " + mode);
+        if (mode == ZEN_MODE_IS_OFF) {
+            // mode is currently OFF.
+            // run a test to turn it on.
+            // After successful run of the test, run a test to turn it back off.
+            if (!runTest(Utils.TestcaseType.ZEN_MODE_ON, ZEN_MODE_IS_ALARMS)) {
+                // the test failed. don't test the next one.
+                return;
+            }
+            runTest(Utils.TestcaseType.ZEN_MODE_OFF, ZEN_MODE_IS_OFF);
+        } else {
+            // mode is currently ON.
+            // run a test to turn it off.
+            // After successful run of the test, run a test to turn it back on.
+            if (!runTest(Utils.TestcaseType.ZEN_MODE_OFF, ZEN_MODE_IS_OFF)) {
+                // the test failed. don't test the next one.
+                return;
+            }
+            runTest(Utils.TestcaseType.ZEN_MODE_ON, ZEN_MODE_IS_ALARMS);
+        }
+    }
+
+    private boolean runTest(Utils.TestcaseType test, int expectedMode) throws Exception {
+        if (!startTestAndWaitForBroadcast(test)) {
+            return false;
+        }
+
+        // verify the test results
+        int mode = getMode();
+        Log.i(TAG, "After testing, zen-mode is set to: " + mode);
+        assertEquals(expectedMode, mode);
+        Log.i(TAG, "results_received: " + Utils.toBundleString(mResultExtras));
+        assertNotNull(mResultExtras);
+        if (expectedMode == ZEN_MODE_IS_ALARMS) {
+            assertTrue(mResultExtras.getBoolean(EXTRA_DO_NOT_DISTURB_MODE_ENABLED));
+            assertEquals(Utils.NUM_MINUTES_FOR_ZENMODE,
+                    mResultExtras.getInt(EXTRA_DO_NOT_DISTURB_MODE_MINUTES));
+        } else {
+            assertFalse(mResultExtras.getBoolean(EXTRA_DO_NOT_DISTURB_MODE_ENABLED));
+        }
+        Log.i(TAG, "Successfully Tested: " + test);
+        return true;
+    }
+
+    private int getMode() throws Exception {
+        return Settings.Global.getInt(mContext.getContentResolver(), ZEN_MODE);
+    }
+}
diff --git a/tests/tests/webkit/Android.mk b/tests/tests/webkit/Android.mk
index c2d8c3c..17a1f27 100644
--- a/tests/tests/webkit/Android.mk
+++ b/tests/tests/webkit/Android.mk
@@ -21,7 +21,7 @@
 # and when built explicitly put it in the data partition
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
-LOCAL_JAVA_LIBRARIES := android.test.runner
+LOCAL_JAVA_LIBRARIES := android.test.runner org.apache.http.legacy
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctsdeviceutillegacy ctstestserver ctstestrunner
 
diff --git a/tests/tests/webkit/AndroidManifest.xml b/tests/tests/webkit/AndroidManifest.xml
index a5bc2bb..fa25824 100644
--- a/tests/tests/webkit/AndroidManifest.xml
+++ b/tests/tests/webkit/AndroidManifest.xml
@@ -20,7 +20,6 @@
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
     <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
-    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <application android:maxRecents="1">
@@ -28,6 +27,7 @@
                   android:exported="true"
                   android:authorities="android.webkit.cts.MockContentProvider" />
         <uses-library android:name="android.test.runner" />
+        <uses-library android:name="org.apache.http.legacy" android:required="false" />
 
         <activity android:name="android.webkit.cts.CookieSyncManagerCtsActivity"
             android:label="CookieSyncManagerCtsActivity"
diff --git a/tests/tests/webkit/assets/webkit/test_bad_image_url.html b/tests/tests/webkit/assets/webkit/test_bad_image_url.html
new file mode 100644
index 0000000..b9e0054
--- /dev/null
+++ b/tests/tests/webkit/assets/webkit/test_bad_image_url.html
@@ -0,0 +1,20 @@
+<!-- Copyright (C) 2015 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.
+-->
+
+<html>
+  <body>
+    <img src="invalidscheme://some/resource" />
+  </body>
+</html>
diff --git a/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java b/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java
index c612886..856b4aa 100644
--- a/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java
@@ -319,8 +319,6 @@
         assertFalse(anyDeleted.get());
     }
 
-    /*
-    TODO: uncomment when acceptThirdPartyCookies implementation lands
     public void testThirdPartyCookie() throws Throwable {
         if (!NullWebViewUtils.isWebViewAvailable()) {
             return;
@@ -377,7 +375,6 @@
             mOnUiThread.getSettings().setJavaScriptEnabled(false);
         }
     }
-    */
 
     public void testb3167208() throws Exception {
         if (!NullWebViewUtils.isWebViewAvailable()) {
diff --git a/tests/tests/webkit/src/android/webkit/cts/GeolocationTest.java b/tests/tests/webkit/src/android/webkit/cts/GeolocationTest.java
index ba0e0e9..32b6167 100644
--- a/tests/tests/webkit/src/android/webkit/cts/GeolocationTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/GeolocationTest.java
@@ -17,6 +17,7 @@
 package android.webkit.cts;
 
 import android.content.Context;
+import android.cts.util.LocationUtils;
 import android.cts.util.NullWebViewUtils;
 import android.cts.util.PollingCheck;
 import android.graphics.Bitmap;
@@ -136,6 +137,7 @@
     protected void setUp() throws Exception {
         super.setUp();
 
+        LocationUtils.registerMockLocationProvider(getInstrumentation(), true);
         WebView webview = getActivity().getWebView();
 
         if (webview != null) {
@@ -185,6 +187,7 @@
                 } catch (IllegalArgumentException e) {} // Not much to do about this
             }
         }
+        LocationUtils.registerMockLocationProvider(getInstrumentation(), false);
 
         if (mOnUiThread != null) {
             mOnUiThread.cleanUp();
diff --git a/tests/tests/webkit/src/android/webkit/cts/PostMessageTest.java b/tests/tests/webkit/src/android/webkit/cts/PostMessageTest.java
new file mode 100644
index 0000000..2a6af6e
--- /dev/null
+++ b/tests/tests/webkit/src/android/webkit/cts/PostMessageTest.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 2015 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.cts;
+
+import android.cts.util.NullWebViewUtils;
+import android.cts.util.PollingCheck;
+import android.net.Uri;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
+import android.webkit.WebMessage;
+import android.webkit.WebMessagePort;
+import android.webkit.WebView;
+
+import java.util.concurrent.CountDownLatch;
+import junit.framework.Assert;
+
+public class PostMessageTest extends ActivityInstrumentationTestCase2<WebViewCtsActivity> {
+    public static final long TIMEOUT = 20000L;
+
+    private WebView mWebView;
+    private WebViewOnUiThread mOnUiThread;
+
+    private static final String WEBVIEW_MESSAGE = "from_webview";
+    private static final String BASE_URI = "http://www.example.com";
+
+    public PostMessageTest() {
+        super("com.android.cts.webkit", WebViewCtsActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        final WebViewCtsActivity activity = getActivity();
+        mWebView = activity.getWebView();
+        if (mWebView != null) {
+            mOnUiThread = new WebViewOnUiThread(this, mWebView);
+            mOnUiThread.getSettings().setJavaScriptEnabled(true);
+        }
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mOnUiThread != null) {
+            mOnUiThread.cleanUp();
+        }
+        super.tearDown();
+    }
+
+    private static final String TITLE_FROM_POST_MESSAGE =
+            "<!DOCTYPE html><html><body>"
+            + "    <script>"
+            + "        var received = '';"
+            + "        onmessage = function (e) {"
+            + "            received += e.data;"
+            + "            document.title = received; };"
+            + "    </script>"
+            + "</body></html>";
+
+    // Acks each received message from the message channel with a seq number.
+    private static final String CHANNEL_MESSAGE =
+            "<!DOCTYPE html><html><body>"
+            + "    <script>"
+            + "        var counter = 0;"
+            + "        onmessage = function (e) {"
+            + "            var myPort = e.ports[0];"
+            + "            myPort.onmessage = function (f) {"
+            + "                myPort.postMessage(f.data + counter++);"
+            + "            }"
+            + "        }"
+            + "   </script>"
+            + "</body></html>";
+
+    private void loadPage(String data) {
+        mOnUiThread.loadDataWithBaseURLAndWaitForCompletion(BASE_URI, data,
+                "text/html", "UTF-8", null);
+    }
+
+    private void waitForTitle(final String title) {
+        new PollingCheck(TIMEOUT) {
+            @Override
+            protected boolean check() {
+                return mOnUiThread.getTitle().equals(title);
+            }
+        }.run();
+    }
+
+    // Post a string message to main frame and make sure it is received.
+    public void testSimpleMessageToMainFrame() throws Throwable {
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+        loadPage(TITLE_FROM_POST_MESSAGE);
+        WebMessage message = new WebMessage(WEBVIEW_MESSAGE);
+        mOnUiThread.postWebMessage(message, Uri.parse(BASE_URI));
+        waitForTitle(WEBVIEW_MESSAGE);
+    }
+
+    // Post multiple messages to main frame and make sure they are received in
+    // correct order.
+    public void testMultipleMessagesToMainFrame() throws Throwable {
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+        loadPage(TITLE_FROM_POST_MESSAGE);
+        for (int i = 0; i < 10; i++) {
+            mOnUiThread.postWebMessage(new WebMessage(Integer.toString(i)),
+                    Uri.parse(BASE_URI));
+        }
+        waitForTitle("0123456789");
+    }
+
+    // Create a message channel and make sure it can be used for data transfer to/from js.
+    public void testMessageChannel() throws Throwable {
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+        loadPage(CHANNEL_MESSAGE);
+        final WebMessagePort[] channel = mOnUiThread.createWebMessageChannel();
+        WebMessage message = new WebMessage(WEBVIEW_MESSAGE, new WebMessagePort[]{channel[1]});
+        mOnUiThread.postWebMessage(message, Uri.parse(BASE_URI));
+        final int messageCount = 3;
+        final CountDownLatch latch = new CountDownLatch(messageCount);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                for (int i = 0; i < messageCount; i++) {
+                    channel[0].postMessage(new WebMessage(WEBVIEW_MESSAGE + i));
+                }
+                channel[0].setWebMessageCallback(new WebMessagePort.WebMessageCallback() {
+                    @Override
+                    public void onMessage(WebMessagePort port, WebMessage message) {
+                        int i = messageCount - (int)latch.getCount();
+                        assertEquals(WEBVIEW_MESSAGE + i + i, message.getData());
+                        latch.countDown();
+                    }
+                });
+            }
+        });
+        // Wait for all the responses to arrive.
+        boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILLISECONDS);
+    }
+
+    // Test that a message port that is closed cannot used to send a message
+    public void testClose() throws Throwable {
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+        loadPage(CHANNEL_MESSAGE);
+        final WebMessagePort[] channel = mOnUiThread.createWebMessageChannel();
+        WebMessage message = new WebMessage(WEBVIEW_MESSAGE, new WebMessagePort[]{channel[1]});
+        mOnUiThread.postWebMessage(message, Uri.parse(BASE_URI));
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    channel[0].close();
+                    channel[0].postMessage(new WebMessage(WEBVIEW_MESSAGE));
+                } catch (IllegalStateException ex) {
+                    // expect to receive an exception
+                    return;
+                }
+                Assert.fail("A closed port cannot be used to transfer messages");
+            }
+         });
+    }
+
+    // Sends a new message channel from JS to Java.
+    private static final String CHANNEL_FROM_JS =
+            "<!DOCTYPE html><html><body>"
+            + "    <script>"
+            + "        var counter = 0;"
+            + "        var mc = new MessageChannel();"
+            + "        var received = '';"
+            + "        mc.port1.onmessage = function (e) {"
+            + "               received = e.data;"
+            + "               document.title = e.data;"
+            + "        };"
+            + "        onmessage = function (e) {"
+            + "            var myPort = e.ports[0];"
+            + "            myPort.postMessage('', [mc.port2]);"
+            + "        };"
+            + "   </script>"
+            + "</body></html>";
+
+    // Test a message port created in JS can be received and used for message transfer.
+    public void testReceiveMessagePort() throws Throwable {
+        final String hello = "HELLO";
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+        loadPage(CHANNEL_FROM_JS);
+        final WebMessagePort[] channel = mOnUiThread.createWebMessageChannel();
+        WebMessage message = new WebMessage(WEBVIEW_MESSAGE, new WebMessagePort[]{channel[1]});
+        mOnUiThread.postWebMessage(message, Uri.parse(BASE_URI));
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                channel[0].setWebMessageCallback(new WebMessagePort.WebMessageCallback() {
+                    @Override
+                    public void onMessage(WebMessagePort port, WebMessage message) {
+                        message.getPorts()[0].postMessage(new WebMessage(hello));
+                    }
+                });
+            }
+        });
+        waitForTitle(hello);
+    }
+}
diff --git a/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java b/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java
index 30b8210..1ab5e5a 100644
--- a/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java
+++ b/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java
@@ -67,6 +67,9 @@
     public static final String STOP_LOADING_URL = "webkit/test_stop_loading.html";
     public static final String BLANK_TAG_URL = "webkit/blank_tag.html";
     public static final String PAGE_WITH_LINK_URL = "webkit/page_with_link.html";
+    // Not a real page, just triggers a 404 response.
+    public static final String NON_EXISTENT_PAGE_URL = "webkit/generate_404.html";
+    public static final String BAD_IMAGE_PAGE_URL = "webkit/test_bad_image_url.html";
 
     // Must match the title of the page at
     // android/frameworks/base/core/res/res/raw/loaderror.html
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
index e9ff48f..592e308 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
@@ -95,7 +95,7 @@
      * brackets are optional):
      * <p/>
      * Mozilla/5.0 (Linux;[ U;] Android <version>;[ <language>-<country>;]
-     * [<devicemodel>;] Build/<buildID>[; wv]) AppleWebKit/<major>.<minor> (KHTML, like Gecko)
+     * [<devicemodel>;] Build/<buildID>; wv) AppleWebKit/<major>.<minor> (KHTML, like Gecko)
      * Version/<major>.<minor> Chrome/<major>.<minor>.<branch>.<build>[ Mobile]
      * Safari/<major>.<minor>
      */
@@ -107,7 +107,7 @@
         Log.i(LOG_TAG, String.format("Checking user agent string %s", actualUserAgentString));
         final String patternString =
                 "Mozilla/5\\.0 \\(Linux;( U;)? Android ([^;]+);( (\\w+)-(\\w+);)?" +
-                "\\s?(.*)\\sBuild/(.+?)(; wv)?\\) AppleWebKit/(\\d+)\\.(\\d+) " +
+                "\\s?(.*)\\sBuild/(.+); wv\\) AppleWebKit/(\\d+)\\.(\\d+) " +
                 "\\(KHTML, like Gecko\\) " +
                 "Version/\\d+\\.\\d+ Chrome/\\d+\\.\\d+\\.\\d+\\.\\d+( Mobile)? " +
                 "Safari/(\\d+)\\.(\\d+)";
@@ -119,12 +119,11 @@
         //  5   - language
         //  6 - device model (optional)
         //  7 - build ID
-        //  8 - WebView identifier "; wv" (optional)
-        //  9 - AppleWebKit major version number
-        // 10 - AppleWebKit minor version number
-        // 11 - " Mobile" string (optional)
-        // 12 - Safari major version number
-        // 13 - Safari minor version number
+        //  8 - AppleWebKit major version number
+        //  9 - AppleWebKit minor version number
+        // 10 - " Mobile" string (optional)
+        // 11 - Safari major version number
+        // 12 - Safari minor version number
         Log.i(LOG_TAG, String.format("Trying to match pattern %s", patternString));
         final Pattern userAgentExpr = Pattern.compile(patternString);
         Matcher patternMatcher = userAgentExpr.matcher(actualUserAgentString);
@@ -506,6 +505,16 @@
         assertTrue(mSettings.getPluginsEnabled());
     }
 
+    public void testOffscreenPreRaster() {
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+        assertFalse(mSettings.getOffscreenPreRaster());
+
+        mSettings.setOffscreenPreRaster(true);
+        assertTrue(mSettings.getOffscreenPreRaster());
+    }
+
     public void testAccessPluginsPath() {
         if (!NullWebViewUtils.isWebViewAvailable()) {
             return;
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
index 5b906ba..0697429 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
@@ -27,6 +27,7 @@
 import android.webkit.HttpAuthHandler;
 import android.webkit.ValueCallback;
 import android.webkit.WebChromeClient;
+import android.webkit.WebResourceError;
 import android.webkit.WebResourceRequest;
 import android.webkit.WebResourceResponse;
 import android.webkit.WebSettings;
@@ -223,6 +224,37 @@
                 webViewClient.hasOnReceivedErrorCode());
     }
 
+    public void testOnReceivedErrorForSubresource() throws Exception {
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+        final MockWebViewClient webViewClient = new MockWebViewClient();
+        mOnUiThread.setWebViewClient(webViewClient);
+        mWebServer = new CtsTestServer(getActivity());
+
+        assertEquals(null, webViewClient.hasOnReceivedResourceError());
+        String url = mWebServer.getAssetUrl(TestHtmlConstants.BAD_IMAGE_PAGE_URL);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertTrue(webViewClient.hasOnReceivedResourceError() != null);
+        assertEquals(WebViewClient.ERROR_UNSUPPORTED_SCHEME,
+                webViewClient.hasOnReceivedResourceError().getErrorCode());
+    }
+
+    public void testOnReceivedHttpError() throws Exception {
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+        final MockWebViewClient webViewClient = new MockWebViewClient();
+        mOnUiThread.setWebViewClient(webViewClient);
+        mWebServer = new CtsTestServer(getActivity());
+
+        assertEquals(null, webViewClient.hasOnReceivedHttpError());
+        String url = mWebServer.getAssetUrl(TestHtmlConstants.NON_EXISTENT_PAGE_URL);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertTrue(webViewClient.hasOnReceivedHttpError() != null);
+        assertEquals(404, webViewClient.hasOnReceivedHttpError().getStatusCode());
+    }
+
     public void testOnFormResubmission() throws Exception {
         if (!NullWebViewUtils.isWebViewAvailable()) {
             return;
@@ -504,6 +536,8 @@
         private boolean mOnPageFinishedCalled;
         private boolean mOnLoadResourceCalled;
         private int mOnReceivedErrorCode;
+        private WebResourceError mOnReceivedResourceError;
+        private WebResourceResponse mOnReceivedHttpError;
         private boolean mOnFormResubmissionCalled;
         private boolean mDoUpdateVisitedHistoryCalled;
         private boolean mOnReceivedHttpAuthRequestCalled;
@@ -532,6 +566,14 @@
             return mOnReceivedErrorCode;
         }
 
+        public WebResourceError hasOnReceivedResourceError() {
+            return mOnReceivedResourceError;
+        }
+
+        public WebResourceResponse hasOnReceivedHttpError() {
+            return mOnReceivedHttpError;
+        }
+
         public boolean hasOnFormResubmissionCalled() {
             return mOnFormResubmissionCalled;
         }
@@ -589,6 +631,20 @@
         }
 
         @Override
+        public void onReceivedError(WebView view, WebResourceRequest request,
+                WebResourceError error) {
+            super.onReceivedError(view, request, error);
+            mOnReceivedResourceError = error;
+        }
+
+        @Override
+        public void onReceivedHttpError(WebView view,  WebResourceRequest request,
+                WebResourceResponse errorResponse) {
+            super.onReceivedHttpError(view, request, errorResponse);
+            mOnReceivedHttpError = errorResponse;
+        }
+
+        @Override
         public void onFormResubmission(WebView view, Message dontResend, Message resend) {
             mOnFormResubmissionCalled = true;
             dontResend.sendToTarget();
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewSslTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewSslTest.java
index dcdeead..6555731 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewSslTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewSslTest.java
@@ -37,6 +37,7 @@
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.security.KeyFactory;
+import java.security.KeyStore;
 import java.security.PrivateKey;
 import java.security.Principal;
 import java.security.cert.CertificateFactory;
@@ -764,6 +765,36 @@
         assertEquals(callCount + 1, webViewClient.getClientCertRequestCount());
     }
 
+    public void testProceedClientCertRequestKeyWithAndroidKeystoreKey() throws Throwable {
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+        mWebServer = new CtsTestServer(getActivity(), CtsTestServer.SslMode.NEEDS_CLIENT_AUTH);
+        String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
+        final ClientCertWebViewClient webViewClient = new ClientCertWebViewClient(
+                mOnUiThread,
+                true // use an Android Keystore backed private key
+                );
+        mOnUiThread.setWebViewClient(webViewClient);
+        clearClientCertPreferences();
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertTrue(TestHtmlConstants.HELLO_WORLD_TITLE.equals(mOnUiThread.getTitle()));
+
+        // Test that the user's response for this server is kept in cache. Load a different
+        // page from the same server and make sure we don't receive a client cert request callback.
+        int callCount = webViewClient.getClientCertRequestCount();
+        url = mWebServer.getAssetUrl(TestHtmlConstants.HTML_URL1);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertTrue(TestHtmlConstants.HTML_URL1_TITLE.equals(mOnUiThread.getTitle()));
+        assertEquals(callCount, webViewClient.getClientCertRequestCount());
+
+        // Now clear the cache and reload the page. We should receive a new callback.
+        clearClientCertPreferences();
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertTrue(TestHtmlConstants.HTML_URL1_TITLE.equals(mOnUiThread.getTitle()));
+        assertEquals(callCount + 1, webViewClient.getClientCertRequestCount());
+    }
+
     public void testIgnoreClientCertRequest() throws Throwable {
         if (!NullWebViewUtils.isWebViewAvailable()) {
             return;
@@ -925,12 +956,20 @@
         public static final int CANCEL = 2;
         public static final int IGNORE = 3;
 
+        private final boolean mKeyFromAndroidKeystore;
+
         private int mClientCertRequests;
         private int mAction = PROCEED;
         private Principal[] mPrincipals;
 
         public ClientCertWebViewClient(WebViewOnUiThread onUiThread) {
+            this(onUiThread, false);
+        }
+
+        public ClientCertWebViewClient(WebViewOnUiThread onUiThread,
+                boolean keyFromAndroidKeystore) {
             super(onUiThread);
+            mKeyFromAndroidKeystore = keyFromAndroidKeystore;
         }
 
         public int getClientCertRequestCount() {
@@ -973,6 +1012,21 @@
                     KeyFactory keyFactory = KeyFactory.getInstance("RSA");
                     PrivateKey key = keyFactory.generatePrivate(
                         new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
+
+                    if (mKeyFromAndroidKeystore) {
+                        // Key needs to be backed by Android Keystore -- import it there.
+                        KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
+                        keyStore.load(null);
+                        Log.d(LOGTAG, "Importing private key into Android Keystore...");
+                        keyStore.setEntry(
+                                "fake1",
+                                new KeyStore.PrivateKeyEntry(key, certChain),
+                                null);
+
+                        key = (PrivateKey) keyStore.getKey("fake1", null);
+                        Log.i(LOGTAG, "Imported private key into Android Keystore. key: " + key);
+                    }
+
                     request.proceed(key, certChain);
                     return;
                 } catch (Exception e) {
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
index 6572285..4c5b2db 100755
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
@@ -65,6 +65,7 @@
 import android.webkit.WebView;
 import android.webkit.WebView.HitTestResult;
 import android.webkit.WebView.PictureListener;
+import android.webkit.WebView.VisualStateCallback;
 import android.webkit.WebViewClient;
 import android.webkit.WebViewDatabase;
 import android.webkit.cts.WebViewOnUiThread.WaitForLoadedClient;
@@ -122,6 +123,11 @@
      */
     private static final long SCROLL_WAIT_INTERVAL_MS = 200;
 
+    /**
+     * Epsilon used in page scale value comparisons.
+     */
+    private static final float PAGE_SCALE_EPSILON = 0.0001f;
+
     private WebView mWebView;
     private CtsTestServer mWebServer;
     private WebViewOnUiThread mOnUiThread;
@@ -219,6 +225,9 @@
         // full address
         assertEquals("455 LARKSPUR DRIVE CALIFORNIA SPRINGS CALIFORNIA 92826",
                 WebView.findAddress("455 LARKSPUR DRIVE CALIFORNIA SPRINGS CALIFORNIA 92826"));
+        // Zipcode is optional.
+        assertEquals("455 LARKSPUR DRIVE CALIFORNIA SPRINGS CALIFORNIA",
+                WebView.findAddress("455 LARKSPUR DRIVE CALIFORNIA SPRINGS CALIFORNIA"));
         // not an address
         assertNull(WebView.findAddress("This is not an address: no town, no state, no zip."));
     }
@@ -330,7 +339,7 @@
         // that a scale change does *not* happen.
         Thread.sleep(500);
         currScale = mOnUiThread.getScale();
-        assertEquals(currScale, previousScale);
+        assertEquals(currScale, previousScale, PAGE_SCALE_EPSILON);
 
         assertTrue(mOnUiThread.zoomOut());
         previousScale = currScale;
@@ -354,7 +363,7 @@
         // that a scale change does *not* happen.
         Thread.sleep(500);
         currScale = mOnUiThread.getScale();
-        assertEquals(currScale, previousScale);
+        assertEquals(currScale, previousScale, PAGE_SCALE_EPSILON);
 
         mOnUiThread.zoomBy(1.25f);
         previousScale = currScale;
@@ -378,7 +387,7 @@
         // that a scale change does *not* happen.
         Thread.sleep(500);
         currScale = mOnUiThread.getScale();
-        assertEquals(currScale, previousScale);
+        assertEquals(currScale, previousScale, PAGE_SCALE_EPSILON);
 
         mOnUiThread.zoomBy(0.8f);
         previousScale = currScale;
@@ -402,30 +411,7 @@
         // that a scale change does *not* happen.
         Thread.sleep(500);
         currScale = mOnUiThread.getScale();
-        assertEquals(currScale, previousScale);
-    }
-
-    @UiThreadTest
-    public void testSetScrollBarStyle() {
-        if (!NullWebViewUtils.isWebViewAvailable()) {
-            return;
-        }
-
-        mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET);
-        assertFalse(mWebView.overlayHorizontalScrollbar());
-        assertFalse(mWebView.overlayVerticalScrollbar());
-
-        mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
-        assertTrue(mWebView.overlayHorizontalScrollbar());
-        assertTrue(mWebView.overlayVerticalScrollbar());
-
-        mWebView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_INSET);
-        assertFalse(mWebView.overlayHorizontalScrollbar());
-        assertFalse(mWebView.overlayVerticalScrollbar());
-
-        mWebView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
-        assertTrue(mWebView.overlayHorizontalScrollbar());
-        assertTrue(mWebView.overlayVerticalScrollbar());
+        assertEquals(currScale, previousScale, PAGE_SCALE_EPSILON);
     }
 
     @UiThreadTest
@@ -434,15 +420,12 @@
             return;
         }
 
+        // These functions have no effect; just verify they don't crash
         mWebView.setHorizontalScrollbarOverlay(true);
         mWebView.setVerticalScrollbarOverlay(false);
+
         assertTrue(mWebView.overlayHorizontalScrollbar());
         assertFalse(mWebView.overlayVerticalScrollbar());
-
-        mWebView.setHorizontalScrollbarOverlay(false);
-        mWebView.setVerticalScrollbarOverlay(true);
-        assertFalse(mWebView.overlayHorizontalScrollbar());
-        assertTrue(mWebView.overlayVerticalScrollbar());
     }
 
     @UiThreadTest
@@ -2442,6 +2425,47 @@
         }
     }
 
+    public void testVisualStateCallbackCalled() throws Exception {
+        // Check that the visual state callback is called correctly.
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+
+        final CountDownLatch callbackLatch = new CountDownLatch(1);
+        final long kRequest = 100;
+
+        mOnUiThread.loadUrl("about:blank");
+
+        mOnUiThread.postVisualStateCallback(kRequest, new VisualStateCallback() {
+            public void onComplete(long requestId) {
+                assertEquals(kRequest, requestId);
+                callbackLatch.countDown();
+            }
+        });
+
+        assertTrue(callbackLatch.await(TEST_TIMEOUT, TimeUnit.MILLISECONDS));
+    }
+
+    public void testOnPageCommitVisibleCalled() throws Exception {
+        // Check that the onPageCommitVisible callback is called
+        // correctly.
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+
+        final CountDownLatch callbackLatch = new CountDownLatch(1);
+
+        mOnUiThread.setWebViewClient(new WebViewClient() {
+                public void onPageCommitVisible(WebView view, String url) {
+                    assertEquals(url, "about:blank");
+                    callbackLatch.countDown();
+                }
+            });
+
+        mOnUiThread.loadUrl("about:blank");
+        assertTrue(callbackLatch.await(TEST_TIMEOUT, TimeUnit.MILLISECONDS));
+    }
+
     private void savePrintedPage(final PrintDocumentAdapter adapter,
             final ParcelFileDescriptor descriptor, final FutureTask<Boolean> result) {
         adapter.onWrite(new PageRange[] {PageRange.ALL_PAGES}, descriptor,
diff --git a/tests/tests/widget/AndroidManifest.xml b/tests/tests/widget/AndroidManifest.xml
index 4b88c01..bc43106 100644
--- a/tests/tests/widget/AndroidManifest.xml
+++ b/tests/tests/widget/AndroidManifest.xml
@@ -327,6 +327,14 @@
             </intent-filter>
         </activity>
 
+        <activity android:name="android.widget.cts.DatePickerDialogCtsActivity"
+                  android:label="DatePickerDialogCtsActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
         <activity android:name="android.app.ActivityGroup"
             android:label="ActivityGroup" />
 
diff --git a/tests/tests/widget/res/layout/relative_layout_baseline.xml b/tests/tests/widget/res/layout/relative_layout_baseline.xml
new file mode 100644
index 0000000..f4e9174
--- /dev/null
+++ b/tests/tests/widget/res/layout/relative_layout_baseline.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_margin="5dp" >
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" >
+
+        <Button
+            android:id="@+id/button1"
+            android:layout_alignParentTop="true"
+            android:layout_width="150dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp"
+            android:text="@string/relative_view1"
+            android:layout_alignBottom="@+id/button2" />
+        <Button
+            android:id="@+id/button2"
+            android:layout_alignParentTop="true"
+            android:layout_toRightOf="@id/button1"
+            android:layout_width="150dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp"
+            android:text="@string/relative_view2" />
+        <Button
+            android:id="@+id/button3"
+            android:layout_alignTop="@+id/button4"
+            android:layout_width="150dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:layout_alignBaseline="@+id/button4"
+            android:text="@string/relative_view3" />
+        <Button
+            android:id="@+id/button4"
+            android:layout_below="@id/button2"
+            android:layout_toRightOf="@id/button3"
+            android:layout_width="150dp"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:text="@string/relative_view4" />
+
+        <TextView
+            android:id="@+id/textView"
+            android:layout_below="@+id/button3"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+    </RelativeLayout>
+
+</ScrollView>
\ No newline at end of file
diff --git a/tests/tests/widget/res/layout/switch_layout.xml b/tests/tests/widget/res/layout/switch_layout.xml
new file mode 100644
index 0000000..a34845b
--- /dev/null
+++ b/tests/tests/widget/res/layout/switch_layout.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 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
+  -->
+
+<Switch xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:thumbTint="@android:color/white"
+        android:thumbTintMode="src_over"
+        android:trackTint="@android:color/black"
+        android:trackTintMode="src_atop" />
diff --git a/tests/tests/widget/res/layout/textview_layout.xml b/tests/tests/widget/res/layout/textview_layout.xml
index bf7f757..e3144eb 100644
--- a/tests/tests/widget/res/layout/textview_layout.xml
+++ b/tests/tests/widget/res/layout/textview_layout.xml
@@ -53,6 +53,7 @@
 
             <TextView android:id="@+id/textview_text"
                     android:text="@string/text_view_hello"
+                    android:breakStrategy="simple"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"/>
 
diff --git a/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java b/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java
index 9d8c7d2..2b38827 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java
@@ -194,12 +194,53 @@
         assertSame(mListView, onScrollListener.getView());
         assertEquals(mListView.getChildCount(), onScrollListener.getVisibleItemCount());
         assertEquals(mCountryList.length, onScrollListener.getTotalItemCount());
-        assertEquals(OnScrollListener.SCROLL_STATE_IDLE, onScrollListener.getScrollState());
 
         assertTrue(onScrollListener.isOnScrollCalled());
         assertTrue(onScrollListener.isOnScrollStateChangedCalled());
     }
 
+    public void testFling() throws Throwable {
+        MockOnScrollListener onScrollListener = new MockOnScrollListener();
+        mListView.setOnScrollListener(onScrollListener);
+
+        setAdapter();
+
+        // Fling down from top, expect a scroll.
+        fling(10000, onScrollListener);
+        assertTrue(onScrollListener.isOnScrollCalled());
+        assertTrue(0 < onScrollListener.getFirstVisibleItem());
+
+        // Fling up the same amount, expect a scroll to the original position.
+        fling(-10000, onScrollListener);
+        assertTrue(onScrollListener.isOnScrollCalled());
+        assertEquals(0, onScrollListener.getFirstVisibleItem());
+
+        // Fling up again, expect no scroll, as the viewport is already at top.
+        fling(-10000, onScrollListener);
+        assertFalse(onScrollListener.isOnScrollCalled());
+        assertEquals(0, onScrollListener.getFirstVisibleItem());
+
+        // Fling up again with a huge velocity, expect no scroll.
+        fling(-50000, onScrollListener);
+        assertFalse(onScrollListener.isOnScrollCalled());
+        assertEquals(0, onScrollListener.getFirstVisibleItem());
+    }
+
+    private void fling(int velocityY, MockOnScrollListener onScrollListener) throws Throwable {
+        onScrollListener.reset();
+
+        final int v = velocityY;
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mListView.fling(v);
+            }
+        });
+
+        do {
+            mInstrumentation.waitForIdleSync();
+        } while (onScrollListener.getScrollState() != OnScrollListener.SCROLL_STATE_IDLE);
+    }
+
     public void testGetFocusedRect() throws Throwable {
         setAdapter(mAdapter_short);
         setListSelection(0);
diff --git a/tests/tests/widget/src/android/widget/cts/AbsSeekBarTest.java b/tests/tests/widget/src/android/widget/cts/AbsSeekBarTest.java
index 419a1c8..dfad3bbb 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsSeekBarTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsSeekBarTest.java
@@ -60,7 +60,7 @@
 
         new MyAbsSeekBar(mActivity, null);
 
-        new MyAbsSeekBar(mActivity, null, com.android.internal.R.attr.progressBarStyle);
+        new MyAbsSeekBar(mActivity, null, android.R.attr.progressBarStyle);
     }
 
     public void testAccessThumbOffset() {
diff --git a/tests/tests/widget/src/android/widget/cts/AbsSpinnerTest.java b/tests/tests/widget/src/android/widget/cts/AbsSpinnerTest.java
index 10e1658..9669c7c 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsSpinnerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsSpinnerTest.java
@@ -58,7 +58,7 @@
 
         new Spinner(mContext, null);
 
-        new Spinner(mContext, null, com.android.internal.R.attr.spinnerStyle);
+        new Spinner(mContext, null, android.R.attr.spinnerStyle);
 
         new Gallery(mContext);
         new Gallery(mContext, null);
diff --git a/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java b/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java
index 6a2240e..ccbdd56 100644
--- a/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java
@@ -317,13 +317,8 @@
             //expected
         }
 
-        try {
-            assertEquals(AdapterView.INVALID_POSITION,
-                    mAdapterView.getPositionForView(new ImageView(mActivity)));
-            fail("Should throw NullPointerException");
-        } catch (NullPointerException e) {
-            //expected
-        }
+        assertEquals(AdapterView.INVALID_POSITION,
+                mAdapterView.getPositionForView(new ImageView(mActivity)));
     }
 
     public void testChangeFocusable() {
diff --git a/tests/tests/widget/src/android/widget/cts/ArrayAdapterTest.java b/tests/tests/widget/src/android/widget/cts/ArrayAdapterTest.java
index 1e17ea7..fdca64c 100644
--- a/tests/tests/widget/src/android/widget/cts/ArrayAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ArrayAdapterTest.java
@@ -21,6 +21,7 @@
 import java.util.List;
 
 import android.content.Context;
+import android.content.res.Resources.Theme;
 import android.database.DataSetObserver;
 import android.test.InstrumentationTestCase;
 import android.test.UiThreadTest;
@@ -204,6 +205,12 @@
         mArrayAdapter.setDropDownViewResource(INVALD_ID);
     }
 
+    public void testAccessDropDownViewTheme() {
+        Theme theme = mContext.getResources().newTheme();
+        mArrayAdapter.setDropDownViewTheme(theme);
+        assertSame(theme, mArrayAdapter.getDropDownViewTheme());
+    }
+
     /**
      * insert the item to the specific position, notify data changed
      * check -1, normal, > count
diff --git a/tests/tests/widget/src/android/widget/cts/CompoundButtonTest.java b/tests/tests/widget/src/android/widget/cts/CompoundButtonTest.java
index bf5382a..98bf047 100644
--- a/tests/tests/widget/src/android/widget/cts/CompoundButtonTest.java
+++ b/tests/tests/widget/src/android/widget/cts/CompoundButtonTest.java
@@ -188,6 +188,7 @@
         // set null drawable
         compoundButton = new MockCompoundButton(mContext);
         compoundButton.setButtonDrawable(null);
+        assertNull(compoundButton.getButtonDrawable());
 
         // set drawable when checkedTextView is GONE
         compoundButton = new MockCompoundButton(mContext);
@@ -197,6 +198,7 @@
         assertEquals(StateSet.WILD_CARD, firstDrawable.getState());
 
         compoundButton.setButtonDrawable(firstDrawable);
+        assertSame(firstDrawable, compoundButton.getButtonDrawable());
         assertFalse(firstDrawable.isVisible());
 
         // update drawable when checkedTextView is VISIBLE
@@ -206,6 +208,7 @@
         assertEquals(StateSet.WILD_CARD, secondDrawable.getState());
 
         compoundButton.setButtonDrawable(secondDrawable);
+        assertSame(secondDrawable, compoundButton.getButtonDrawable());
         assertTrue(secondDrawable.isVisible());
         // the firstDrawable is not active.
         assertFalse(firstDrawable.isVisible());
@@ -240,7 +243,7 @@
         compoundButton.setChecked(true);
         int[] checkedState = compoundButton.onCreateDrawableState(0);
         assertEquals(state[0], checkedState[0]);
-        assertEquals(com.android.internal.R.attr.state_checked,
+        assertEquals(android.R.attr.state_checked,
                 checkedState[checkedState.length - 1]);
 
         // compoundButton is not checked again.
diff --git a/tests/tests/widget/src/android/widget/cts/CursorAdapterTest.java b/tests/tests/widget/src/android/widget/cts/CursorAdapterTest.java
index 0916e59..730083e 100644
--- a/tests/tests/widget/src/android/widget/cts/CursorAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/CursorAdapterTest.java
@@ -19,8 +19,8 @@
 import java.io.File;
 
 import android.content.Context;
+import android.content.res.Resources.Theme;
 import android.cts.util.PollingCheck;
-import android.cts.util.ReadElf;
 import android.cts.util.TestThread;
 import android.database.ContentObserver;
 import android.database.Cursor;
@@ -39,7 +39,6 @@
 
 import com.android.cts.widget.R;
 
-
 /**
  * Test {@link CursorAdapter}.
  */
@@ -253,6 +252,14 @@
     }
 
     @UiThreadTest
+    public void testAccessDropDownViewTheme() {
+        CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, null);
+        Theme theme = mContext.getResources().newTheme();
+        cursorAdapter.setDropDownViewTheme(theme);
+        assertSame(theme, cursorAdapter.getDropDownViewTheme());
+    }
+
+    @UiThreadTest
     public void testGetFilter() {
         CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, mCursor);
         Filter filter = cursorAdapter.getFilter();
@@ -338,14 +345,23 @@
     }
 
     private final class MockCursorAdapter extends CursorAdapter {
+        private Context mContext;
+        private boolean mAutoRequery;
+
         private boolean mContentChanged = false;
 
         public MockCursorAdapter(Context context, Cursor c) {
             super(context, c);
+
+            mContext = context;
+            mAutoRequery = false;
         }
 
         public MockCursorAdapter(Context context, Cursor c, boolean autoRequery) {
             super(context, c, autoRequery);
+
+            mContext = context;
+            mAutoRequery = autoRequery;
         }
 
         public Context getContext() {
@@ -375,6 +391,9 @@
         @Override
         public void init(Context context, Cursor c, boolean autoRequery) {
             super.init(context, c, autoRequery);
+
+            mContext = context;
+            mAutoRequery = autoRequery;
         }
 
         @Override
diff --git a/tests/tests/widget/src/android/widget/cts/DatePickerDialogCtsActivity.java b/tests/tests/widget/src/android/widget/cts/DatePickerDialogCtsActivity.java
new file mode 100644
index 0000000..ea8c3c4
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/DatePickerDialogCtsActivity.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2015 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.widget.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.View;
+
+/**
+ * A minimal application for DatePickerDialog test.
+ */
+public class DatePickerDialogCtsActivity extends Activity {
+    /**
+     * Called with the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/DatePickerDialogTest.java b/tests/tests/widget/src/android/widget/cts/DatePickerDialogTest.java
new file mode 100644
index 0000000..1477f73
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/DatePickerDialogTest.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2015 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.widget.cts;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.DatePickerDialog;
+import android.content.Context;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
+
+/**
+ * Test {@link DatePickerDialog}.
+ */
+public class DatePickerDialogTest extends
+        ActivityInstrumentationTestCase2<DatePickerDialogCtsActivity> {
+
+    private Activity mActivity;
+
+    public DatePickerDialogTest() {
+        super(DatePickerDialogCtsActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+    }
+
+    @UiThreadTest
+    @SuppressWarnings("deprecation")
+    public void testConstructor() {
+        new DatePickerDialog(mActivity, null, 1970, 1, 1);
+
+        new DatePickerDialog(mActivity, AlertDialog.THEME_TRADITIONAL, null, 1970, 1, 1);
+
+        new DatePickerDialog(mActivity, AlertDialog.THEME_HOLO_DARK, null, 1970, 1, 1);
+
+        new DatePickerDialog(mActivity,
+                android.R.style.Theme_Material_Dialog_Alert, null, 1970, 1, 1);
+
+        try {
+            new DatePickerDialog(null, null, 1970, 1, 1);
+            fail("should throw NullPointerException");
+        } catch (Exception e) {
+        }
+    }
+
+    @UiThreadTest
+    public void testShowDismiss() {
+        DatePickerDialog d = createDatePickerDialog();
+
+        d.show();
+        assertTrue("Showing date picker", d.isShowing());
+
+        d.show();
+        assertTrue("Date picker still showing", d.isShowing());
+
+        d.dismiss();
+        assertFalse("Dismissed date picker", d.isShowing());
+
+        d.dismiss();
+        assertFalse("Date picker still dismissed", d.isShowing());
+    }
+
+    private MockDatePickerDialog createDatePickerDialog() {
+        return new MockDatePickerDialog(mActivity, null, 1970, 1, 1);
+    }
+
+    private class MockDatePickerDialog extends DatePickerDialog {
+        public MockDatePickerDialog(Context context, OnDateSetListener callBack,
+                int year, int monthOfYear, int dayOfMonth) {
+            super(context, callBack, year, monthOfYear, dayOfMonth);
+        }
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/DatePickerTest.java b/tests/tests/widget/src/android/widget/cts/DatePickerTest.java
index fdadc2c..3fa238e 100644
--- a/tests/tests/widget/src/android/widget/cts/DatePickerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/DatePickerTest.java
@@ -17,7 +17,6 @@
 package android.widget.cts;
 
 import com.android.cts.widget.R;
-import com.android.internal.util.XmlUtils;
 
 import android.content.Context;
 import android.content.res.XmlResourceParser;
@@ -29,6 +28,7 @@
 import android.util.Xml;
 import android.view.View;
 import android.widget.DatePicker;
+import android.widget.cts.util.XmlUtils;
 
 /**
  * Test {@link DatePicker}.
diff --git a/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java b/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java
index a8584ae..68a17e7 100644
--- a/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java
@@ -387,9 +387,9 @@
         final MockDialerFilter dialerFilter = new MockDialerFilter(mActivity);
 
         final EditText text1 = new EditText(mActivity);
-        text1.setId(com.android.internal.R.id.hint);
+        text1.setId(android.R.id.hint);
         final EditText text2 = new EditText(mActivity);
-        text2.setId(com.android.internal.R.id.primary);
+        text2.setId(android.R.id.primary);
 
         dialerFilter.addView(text1, new RelativeLayout.LayoutParams(
                 RelativeLayout.LayoutParams.WRAP_CONTENT,
diff --git a/tests/tests/widget/src/android/widget/cts/DigitalClockTest.java b/tests/tests/widget/src/android/widget/cts/DigitalClockTest.java
index 2f2cc1a..86a9672 100644
--- a/tests/tests/widget/src/android/widget/cts/DigitalClockTest.java
+++ b/tests/tests/widget/src/android/widget/cts/DigitalClockTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import java.io.IOException;
+import com.android.cts.widget.R;
 
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -29,9 +29,9 @@
 import android.util.Xml;
 import android.widget.DigitalClock;
 import android.widget.LinearLayout;
+import android.widget.cts.util.XmlUtils;
 
-import com.android.cts.widget.R;
-import com.android.internal.util.XmlUtils;
+import java.io.IOException;
 
 
 /**
diff --git a/tests/tests/widget/src/android/widget/cts/GalleryTest.java b/tests/tests/widget/src/android/widget/cts/GalleryTest.java
index 2813965..581107c 100644
--- a/tests/tests/widget/src/android/widget/cts/GalleryTest.java
+++ b/tests/tests/widget/src/android/widget/cts/GalleryTest.java
@@ -17,16 +17,17 @@
 package android.widget.cts;
 
 import com.android.cts.widget.R;
-import com.android.internal.view.menu.ContextMenuBuilder;
-
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
 import android.app.Activity;
 import android.app.Instrumentation;
+import android.content.ComponentName;
 import android.content.Context;
+import android.content.Intent;
 import android.cts.util.WidgetTestUtils;
+import android.graphics.drawable.Drawable;
 import android.os.SystemClock;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.UiThreadTest;
@@ -36,7 +37,8 @@
 import android.view.ContextMenu;
 import android.view.Gravity;
 import android.view.KeyEvent;
-import android.view.MotionEvent;
+import android.view.MenuItem;
+import android.view.SubMenu;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ContextMenu.ContextMenuInfo;
@@ -305,35 +307,6 @@
         assertEquals(index + 1, gallery.getChildDrawingOrder(childCount, index));
     }
 
-    @UiThreadTest
-    public void testGetContextMenuInfo() {
-        MockOnCreateContextMenuListener listener = new MockOnCreateContextMenuListener();
-        MyGallery gallery = new MyGallery(mContext);
-        gallery.setOnCreateContextMenuListener(listener);
-        assertFalse(listener.hasCreatedContextMenu());
-        gallery.createContextMenu(new ContextMenuBuilder(mContext));
-        assertTrue(listener.hasCreatedContextMenu());
-        assertSame(gallery.getContextMenuInfo(), listener.getContextMenuInfo());
-    }
-
-    private static class MockOnCreateContextMenuListener implements OnCreateContextMenuListener {
-        private boolean hasCreatedContextMenu;
-        private ContextMenuInfo mContextMenuInfo;
-
-        public boolean hasCreatedContextMenu() {
-            return hasCreatedContextMenu;
-        }
-
-        public ContextMenuInfo getContextMenuInfo() {
-            return mContextMenuInfo;
-        }
-
-        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
-            hasCreatedContextMenu = true;
-            mContextMenuInfo = menuInfo;
-        }
-    }
-
     private static class ImageAdapter extends BaseAdapter {
         public ImageAdapter(Context c) {
             mContext = c;
diff --git a/tests/tests/widget/src/android/widget/cts/GridViewTest.java b/tests/tests/widget/src/android/widget/cts/GridViewTest.java
index 042986c..3c615bd 100644
--- a/tests/tests/widget/src/android/widget/cts/GridViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/GridViewTest.java
@@ -83,7 +83,7 @@
 
         new GridView(mActivity, null);
 
-        new GridView(mActivity, null, com.android.internal.R.attr.gridViewStyle);
+        new GridView(mActivity, null, android.R.attr.gridViewStyle);
 
         XmlPullParser parser = mActivity.getResources().getXml(R.layout.gridview_layout);
         AttributeSet attrs = Xml.asAttributeSet(parser);
diff --git a/tests/tests/widget/src/android/widget/cts/ImageViewTest.java b/tests/tests/widget/src/android/widget/cts/ImageViewTest.java
index c93d4a1..aa1df34 100644
--- a/tests/tests/widget/src/android/widget/cts/ImageViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ImageViewTest.java
@@ -38,6 +38,7 @@
 import android.graphics.PorterDuff;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
 import android.graphics.drawable.PaintDrawable;
 import android.net.Uri;
 import android.test.ActivityInstrumentationTestCase;
@@ -173,6 +174,23 @@
     }
 
     @UiThreadTest
+    public void testSetImageIcon() {
+        mImageView = findImageViewById(R.id.imageview);
+        mImageView.setImageIcon(null);
+        assertNull(mImageView.getDrawable());
+
+        Icon icon = Icon.createWithResource(mActivity, R.drawable.testimage);
+        mImageView.setImageIcon(icon);
+        assertTrue(mImageView.isLayoutRequested());
+        assertNotNull(mImageView.getDrawable());
+        Drawable drawable = mActivity.getDrawable(R.drawable.testimage);
+        BitmapDrawable testimageBitmap = (BitmapDrawable) drawable;
+        Drawable imageViewDrawable = mImageView.getDrawable();
+        BitmapDrawable imageViewBitmap = (BitmapDrawable) imageViewDrawable;
+        WidgetTestUtils.assertEquals(testimageBitmap.getBitmap(), imageViewBitmap.getBitmap());
+    }
+
+    @UiThreadTest
     public void testSetImageResource() {
         mImageView = findImageViewById(R.id.imageview);
         mImageView.setImageResource(-1);
@@ -181,7 +199,7 @@
         mImageView.setImageResource(R.drawable.testimage);
         assertTrue(mImageView.isLayoutRequested());
         assertNotNull(mImageView.getDrawable());
-        Drawable drawable = mActivity.getResources().getDrawable(R.drawable.testimage);
+        Drawable drawable = mActivity.getDrawable(R.drawable.testimage);
         BitmapDrawable testimageBitmap = (BitmapDrawable) drawable;
         Drawable imageViewDrawable = mImageView.getDrawable();
         BitmapDrawable imageViewBitmap = (BitmapDrawable) imageViewDrawable;
diff --git a/tests/tests/widget/src/android/widget/cts/LinearLayout_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/LinearLayout_LayoutParamsTest.java
index 8ecca6f..31be765 100644
--- a/tests/tests/widget/src/android/widget/cts/LinearLayout_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/LinearLayout_LayoutParamsTest.java
@@ -17,8 +17,6 @@
 package android.widget.cts;
 
 import com.android.cts.widget.R;
-import com.android.internal.util.XmlUtils;
-
 
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -27,6 +25,7 @@
 import android.view.ViewGroup.LayoutParams;
 import android.view.ViewGroup.MarginLayoutParams;
 import android.widget.LinearLayout;
+import android.widget.cts.util.XmlUtils;
 
 import java.io.IOException;
 
diff --git a/tests/tests/widget/src/android/widget/cts/ListPopupWindowTest.java b/tests/tests/widget/src/android/widget/cts/ListPopupWindowTest.java
new file mode 100644
index 0000000..c4636fc
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/ListPopupWindowTest.java
@@ -0,0 +1,323 @@
+/*
+ * Copyright (C) 2015 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.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.content.Context;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
+import android.view.Display;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.ListPopupWindow;
+import android.widget.PopupWindow;
+import android.widget.PopupWindow.OnDismissListener;
+
+public class ListPopupWindowTest extends
+        ActivityInstrumentationTestCase2<MockPopupWindowCtsActivity> {
+    private Instrumentation mInstrumentation;
+    private Activity mActivity;
+
+    /** The list popup window. */
+    private ListPopupWindow mPopupWindow;
+
+    /**
+     * Instantiates a new popup window test.
+     */
+    public ListPopupWindowTest() {
+        super(MockPopupWindowCtsActivity.class);
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see android.test.ActivityInstrumentationTestCase#setUp()
+     */
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mInstrumentation = getInstrumentation();
+        mActivity = getActivity();
+    }
+
+    public void testConstructor() {
+        new ListPopupWindow(mActivity);
+
+        new ListPopupWindow(mActivity, null);
+
+        new ListPopupWindow(mActivity, null, android.R.attr.popupWindowStyle);
+
+        new ListPopupWindow(mActivity, null, 0, android.R.style.Widget_Material_ListPopupWindow);
+    }
+
+    public void testAccessBackground() {
+        mPopupWindow = new ListPopupWindow(mActivity);
+
+        Drawable drawable = new ColorDrawable();
+        mPopupWindow.setBackgroundDrawable(drawable);
+        assertSame(drawable, mPopupWindow.getBackground());
+
+        mPopupWindow.setBackgroundDrawable(null);
+        assertNull(mPopupWindow.getBackground());
+    }
+
+    public void testAccessAnimationStyle() {
+        mPopupWindow = new ListPopupWindow(mActivity);
+        assertEquals(0, mPopupWindow.getAnimationStyle());
+
+        mPopupWindow.setAnimationStyle(android.R.style.Animation_Toast);
+        assertEquals(android.R.style.Animation_Toast, mPopupWindow.getAnimationStyle());
+
+        // abnormal values
+        mPopupWindow.setAnimationStyle(-100);
+        assertEquals(-100, mPopupWindow.getAnimationStyle());
+    }
+
+    public void testAccessHeight() {
+        mPopupWindow = new ListPopupWindow(mActivity);
+        assertEquals(WindowManager.LayoutParams.WRAP_CONTENT, mPopupWindow.getHeight());
+
+        int height = getDisplay().getHeight() / 2;
+        mPopupWindow.setHeight(height);
+        assertEquals(height, mPopupWindow.getHeight());
+
+        height = getDisplay().getHeight();
+        mPopupWindow.setHeight(height);
+        assertEquals(height, mPopupWindow.getHeight());
+
+        mPopupWindow.setHeight(0);
+        assertEquals(0, mPopupWindow.getHeight());
+
+        height = getDisplay().getHeight() * 2;
+        mPopupWindow.setHeight(height);
+        assertEquals(height, mPopupWindow.getHeight());
+
+        height = -getDisplay().getHeight() / 2;
+        mPopupWindow.setHeight(height);
+        assertEquals(height, mPopupWindow.getHeight());
+    }
+
+    /**
+     * Gets the display.
+     *
+     * @return the display
+     */
+    private Display getDisplay() {
+        WindowManager wm = (WindowManager) mActivity.getSystemService(Context.WINDOW_SERVICE);
+        return wm.getDefaultDisplay();
+    }
+
+    public void testAccessWidth() {
+        mPopupWindow = new ListPopupWindow(mActivity);
+        assertEquals(WindowManager.LayoutParams.WRAP_CONTENT, mPopupWindow.getWidth());
+
+        int width = getDisplay().getWidth() / 2;
+        mPopupWindow.setWidth(width);
+        assertEquals(width, mPopupWindow.getWidth());
+
+        width = getDisplay().getWidth();
+        mPopupWindow.setWidth(width);
+        assertEquals(width, mPopupWindow.getWidth());
+
+        mPopupWindow.setWidth(0);
+        assertEquals(0, mPopupWindow.getWidth());
+
+        width = getDisplay().getWidth() * 2;
+        mPopupWindow.setWidth(width);
+        assertEquals(width, mPopupWindow.getWidth());
+
+        width = - getDisplay().getWidth() / 2;
+        mPopupWindow.setWidth(width);
+        assertEquals(width, mPopupWindow.getWidth());
+    }
+
+    public void testShow() {
+        int[] anchorXY = new int[2];
+        int[] viewOnScreenXY = new int[2];
+        int[] viewInWindowXY = new int[2];
+
+        mPopupWindow = new ListPopupWindow(mActivity);
+
+        final View upperAnchor = mActivity.findViewById(R.id.anchor_upper);
+        mPopupWindow.setAnchorView(upperAnchor);
+
+        mInstrumentation.runOnMainSync(new Runnable() {
+            public void run() {
+                mPopupWindow.show();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        assertTrue(mPopupWindow.isShowing());
+
+        mPopupWindow.getListView().getLocationOnScreen(viewOnScreenXY);
+        upperAnchor.getLocationOnScreen(anchorXY);
+        mPopupWindow.getListView().getLocationInWindow(viewInWindowXY);
+        assertEquals(anchorXY[0] + viewInWindowXY[0], viewOnScreenXY[0]);
+        assertEquals(anchorXY[1] + viewInWindowXY[1] + upperAnchor.getHeight(), viewOnScreenXY[1]);
+
+        dismissPopup();
+    }
+
+    public void testSetWindowLayoutType() {
+        mPopupWindow = new ListPopupWindow(mActivity);
+
+        final View upperAnchor = mActivity.findViewById(R.id.anchor_upper);
+        mPopupWindow.setAnchorView(upperAnchor);
+        mPopupWindow.setWindowLayoutType(
+                WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL);
+
+        mInstrumentation.runOnMainSync(new Runnable() {
+            public void run() {
+                mPopupWindow.show();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        assertTrue(mPopupWindow.isShowing());
+
+        WindowManager.LayoutParams p = (WindowManager.LayoutParams)
+                mPopupWindow.getListView().getRootView().getLayoutParams();
+        assertEquals(WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL, p.type);
+
+        dismissPopup();
+    }
+
+    @UiThreadTest
+    public void testDismiss() {
+        mPopupWindow = new ListPopupWindow(mActivity);
+        assertFalse(mPopupWindow.isShowing());
+        View anchorView = mActivity.findViewById(R.id.anchor_upper);
+        mPopupWindow.setAnchorView(anchorView);
+        mPopupWindow.show();
+
+        mPopupWindow.dismiss();
+        assertFalse(mPopupWindow.isShowing());
+
+        mPopupWindow.dismiss();
+        assertFalse(mPopupWindow.isShowing());
+    }
+
+    public void testSetOnDismissListener() {
+        mPopupWindow = new ListPopupWindow(mActivity);
+        mPopupWindow.setOnDismissListener(null);
+
+        MockOnDismissListener onDismissListener = new MockOnDismissListener();
+        mPopupWindow.setOnDismissListener(onDismissListener);
+        showPopup();
+        dismissPopup();
+        assertEquals(1, onDismissListener.getOnDismissCalledCount());
+
+        showPopup();
+        dismissPopup();
+        assertEquals(2, onDismissListener.getOnDismissCalledCount());
+
+        mPopupWindow.setOnDismissListener(null);
+        showPopup();
+        dismissPopup();
+        assertEquals(2, onDismissListener.getOnDismissCalledCount());
+    }
+
+    public void testAccessInputMethodMode() {
+        mPopupWindow = new ListPopupWindow(mActivity);
+        assertEquals(PopupWindow.INPUT_METHOD_NEEDED, mPopupWindow.getInputMethodMode());
+
+        mPopupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_FROM_FOCUSABLE);
+        assertEquals(PopupWindow.INPUT_METHOD_FROM_FOCUSABLE, mPopupWindow.getInputMethodMode());
+
+        mPopupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
+        assertEquals(PopupWindow.INPUT_METHOD_NEEDED, mPopupWindow.getInputMethodMode());
+
+        mPopupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED);
+        assertEquals(PopupWindow.INPUT_METHOD_NOT_NEEDED, mPopupWindow.getInputMethodMode());
+
+        mPopupWindow.setInputMethodMode(-1);
+        assertEquals(-1, mPopupWindow.getInputMethodMode());
+    }
+
+    /**
+     * The listener interface for receiving OnDismiss events. The class that is
+     * interested in processing a OnDismiss event implements this interface, and
+     * the object created with that class is registered with a component using
+     * the component's <code>setOnDismissListener<code> method. When
+     * the OnDismiss event occurs, that object's appropriate
+     * method is invoked.
+     */
+    private static class MockOnDismissListener implements OnDismissListener {
+
+        /** The Ondismiss called count. */
+        private int mOnDismissCalledCount;
+
+        /**
+         * Gets the onDismiss() called count.
+         *
+         * @return the on dismiss called count
+         */
+        public int getOnDismissCalledCount() {
+            return mOnDismissCalledCount;
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see android.widget.PopupWindow.OnDismissListener#onDismiss()
+         */
+        public void onDismiss() {
+            mOnDismissCalledCount++;
+        }
+
+    }
+
+    /**
+     * Show PopupWindow.
+     */
+    // FIXME: logcat info complains that there is window leakage due to that mPopupWindow is not
+    // clean up. Need to fix it.
+    private void showPopup() {
+        mInstrumentation.runOnMainSync(new Runnable() {
+            public void run() {
+                if (mPopupWindow == null || mPopupWindow.isShowing()) {
+                    return;
+                }
+                View anchor = mActivity.findViewById(R.id.anchor_upper);
+                mPopupWindow.setAnchorView(anchor);
+                mPopupWindow.show();
+                assertTrue(mPopupWindow.isShowing());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    /**
+     * Dismiss PopupWindow.
+     */
+    private void dismissPopup() {
+        mInstrumentation.runOnMainSync(new Runnable() {
+            public void run() {
+                if (mPopupWindow == null || !mPopupWindow.isShowing())
+                    return;
+                mPopupWindow.dismiss();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/ListViewTest.java b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
index 5f0967a..838f7a8 100644
--- a/tests/tests/widget/src/android/widget/cts/ListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
@@ -17,7 +17,6 @@
 package android.widget.cts;
 
 import com.android.cts.widget.R;
-import com.google.android.collect.Lists;
 
 import org.xmlpull.v1.XmlPullParser;
 
@@ -32,12 +31,14 @@
 import android.test.UiThreadTest;
 import android.test.suitebuilder.annotation.MediumTest;
 import android.util.AttributeSet;
+import android.util.Pair;
 import android.util.SparseBooleanArray;
 import android.util.Xml;
 import android.view.KeyEvent;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.animation.LayoutAnimationController;
+import android.widget.AbsListView;
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.ArrayAdapter;
@@ -46,7 +47,6 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 
 import junit.framework.Assert;
@@ -361,6 +361,53 @@
         assertEquals(2, mListView.getHeaderViewsCount());
     }
 
+    public void testHeaderFooterType() throws Throwable {
+        final TextView headerView = new TextView(getActivity());
+        final List<Pair<View, View>> mismatch = new ArrayList<Pair<View, View>>();
+        final ArrayAdapter adapter = new ArrayAdapter<String>(mActivity,
+                android.R.layout.simple_list_item_1, mNameList) {
+            @Override
+            public int getItemViewType(int position) {
+                return position == 0 ? AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER :
+                        super.getItemViewType(position - 1);
+            }
+
+            @Override
+            public View getView(int position, View convertView, ViewGroup parent) {
+                if (position == 0) {
+                    if (convertView != null && convertView != headerView) {
+                        mismatch.add(new Pair<View, View>(headerView, convertView));
+                    }
+                    return headerView;
+                } else {
+                    return super.getView(position - 1, convertView, parent);
+                }
+            }
+
+            @Override
+            public int getCount() {
+                return super.getCount() + 1;
+            }
+        };
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mListView.setAdapter(adapter);
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                adapter.notifyDataSetChanged();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+
+        assertEquals(0, mismatch.size());
+    }
+
     public void testAccessDivider() {
         mInstrumentation.runOnMainSync(new Runnable() {
             public void run() {
@@ -380,7 +427,6 @@
 
         final Drawable d = mActivity.getResources().getDrawable(R.drawable.scenery);
 
-        Rect r2 = d.getBounds();
         mInstrumentation.runOnMainSync(new Runnable() {
             public void run() {
                 mListView.setDivider(d);
@@ -388,7 +434,7 @@
         });
         mInstrumentation.waitForIdleSync();
         assertSame(d, mListView.getDivider());
-        assertEquals(r2.bottom - r2.top, mListView.getDividerHeight());
+        assertEquals(d.getBounds().height(), mListView.getDividerHeight());
 
         mInstrumentation.runOnMainSync(new Runnable() {
             public void run() {
@@ -397,7 +443,7 @@
         });
         mInstrumentation.waitForIdleSync();
         assertEquals(10, mListView.getDividerHeight());
-        assertEquals(10, r2.bottom - r2.top);
+        assertEquals(10, d.getBounds().height());
     }
 
     public void testSetSelection() {
@@ -679,7 +725,8 @@
     @MediumTest
     public void testRequestLayout() throws Exception {
         ListView listView = new ListView(mActivity);
-        List<String> items = Lists.newArrayList("hello");
+        List<String> items = new ArrayList<>();
+        items.add("hello");
         Adapter<String> adapter = new Adapter<String>(mActivity, 0, items);
         listView.setAdapter(adapter);
 
@@ -703,7 +750,8 @@
         ListView listView = new ListView(mActivity);
         // We use a header as the unselectable item to remain after the selectable one is removed.
         listView.addHeaderView(new View(mActivity), null, false);
-        List<String> items = Lists.newArrayList("hello");
+        List<String> items = new ArrayList<>();
+        items.add("hello");
         Adapter<String> adapter = new Adapter<String>(mActivity, 0, items);
         listView.setAdapter(adapter);
 
diff --git a/tests/tests/widget/src/android/widget/cts/MockTextView.java b/tests/tests/widget/src/android/widget/cts/MockTextView.java
index 138338c..977e4b2 100644
--- a/tests/tests/widget/src/android/widget/cts/MockTextView.java
+++ b/tests/tests/widget/src/android/widget/cts/MockTextView.java
@@ -179,19 +179,19 @@
     }
 
     public int getFrameLeft() {
-        return mLeft;
+        return getLeft();
     }
 
     public int getFrameTop() {
-        return mTop;
+        return getTop();
     }
 
     public int getFrameRight() {
-        return mRight;
+        return getRight();
     }
 
     public int getFrameBottom() {
-        return mBottom;
+        return getBottom();
     }
 
     public int getBottomPaddingOffset() {
diff --git a/tests/tests/widget/src/android/widget/cts/MyGallery.java b/tests/tests/widget/src/android/widget/cts/MyGallery.java
index 91665ee..27b5d45 100644
--- a/tests/tests/widget/src/android/widget/cts/MyGallery.java
+++ b/tests/tests/widget/src/android/widget/cts/MyGallery.java
@@ -49,10 +49,6 @@
         return super.getChildStaticTransformation(child, t);
     }
 
-    protected void setParent(ViewParent v) {
-        mParent = v;
-    }
-
     @Override
     protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
         return super.checkLayoutParams(p);
diff --git a/tests/tests/widget/src/android/widget/cts/PopupMenuTest.java b/tests/tests/widget/src/android/widget/cts/PopupMenuTest.java
new file mode 100644
index 0000000..2dff4cb
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/PopupMenuTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2015 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.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.test.ActivityInstrumentationTestCase2;
+import android.view.Gravity;
+import android.widget.PopupMenu;
+
+
+public class PopupMenuTest extends
+        ActivityInstrumentationTestCase2<MockPopupWindowCtsActivity> {
+    private Instrumentation mInstrumentation;
+    private Activity mActivity;
+
+    public PopupMenuTest() {
+        super("com.android.cts.widget", MockPopupWindowCtsActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mInstrumentation = getInstrumentation();
+        mActivity = getActivity();
+    }
+
+    public void testAccessGravity() {
+        PopupMenu popupMenu = new PopupMenu(mActivity,
+                mActivity.findViewById(R.id.anchor_middle_left));
+        assertEquals(Gravity.NO_GRAVITY, popupMenu.getGravity());
+        popupMenu.setGravity(Gravity.TOP);
+        assertEquals(Gravity.TOP, popupMenu.getGravity());
+    }
+
+    public void testOnDismissListener() {
+        final PopupMenu popupMenu = new PopupMenu(mActivity,
+                mActivity.findViewById(R.id.anchor_middle_left));
+        TestPopupDismissListener listener = new TestPopupDismissListener();
+        popupMenu.setOnDismissListener(listener);
+
+        mInstrumentation.runOnMainSync(new Runnable() {
+            public void run() {
+                popupMenu.show();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+        assertEquals(0, listener.getDismissCount());
+
+        mInstrumentation.runOnMainSync(new Runnable() {
+            public void run() {
+                popupMenu.dismiss();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+        assertEquals(1, listener.getDismissCount());
+
+        mInstrumentation.runOnMainSync(new Runnable() {
+            public void run() {
+                popupMenu.dismiss();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+        assertEquals(1, listener.getDismissCount());
+    }
+
+    private class TestPopupDismissListener implements PopupMenu.OnDismissListener {
+        int mDismissCount;
+
+        @Override
+        public void onDismiss(PopupMenu menu) {
+            mDismissCount++;
+        }
+
+        int getDismissCount() {
+            return mDismissCount;
+        }
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
index ae12f9c..bb638e4 100644
--- a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
+++ b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
@@ -29,6 +29,8 @@
 import android.os.SystemClock;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.UiThreadTest;
+import android.transition.Transition;
+import android.transition.TransitionValues;
 import android.view.Display;
 import android.view.Gravity;
 import android.view.MotionEvent;
@@ -73,7 +75,7 @@
 
         new PopupWindow(mActivity, null);
 
-        new PopupWindow(mActivity, null, com.android.internal.R.attr.popupWindowStyle);
+        new PopupWindow(mActivity, null, android.R.attr.popupWindowStyle);
 
         mPopupWindow = new PopupWindow();
         assertEquals(0, mPopupWindow.getWidth());
@@ -141,12 +143,8 @@
         // default is -1
         assertEquals(-1, mPopupWindow.getAnimationStyle());
 
-        mPopupWindow.setAnimationStyle(com.android.internal.R.style.Animation_Toast);
-        assertEquals(com.android.internal.R.style.Animation_Toast,
-                mPopupWindow.getAnimationStyle());
-
-        mPopupWindow.setAnimationStyle(com.android.internal.R.style.Animation_DropDownDown);
-        assertEquals(com.android.internal.R.style.Animation_DropDownDown,
+        mPopupWindow.setAnimationStyle(android.R.style.Animation_Toast);
+        assertEquals(android.R.style.Animation_Toast,
                 mPopupWindow.getAnimationStyle());
 
         // abnormal values
@@ -189,8 +187,7 @@
 
     public void testAccessHeight() {
         mPopupWindow = new PopupWindow(mActivity);
-        // default is 0
-        assertEquals(0, mPopupWindow.getHeight());
+        assertEquals(WindowManager.LayoutParams.WRAP_CONTENT, mPopupWindow.getHeight());
 
         int height = getDisplay().getHeight() / 2;
         mPopupWindow.setHeight(height);
@@ -224,7 +221,7 @@
 
     public void testAccessWidth() {
         mPopupWindow = new PopupWindow(mActivity);
-        assertEquals(0, mPopupWindow.getWidth());
+        assertEquals(WindowManager.LayoutParams.WRAP_CONTENT, mPopupWindow.getWidth());
 
         int width = getDisplay().getWidth() / 2;
         mPopupWindow.setWidth(width);
@@ -335,6 +332,41 @@
         dismissPopup();
     }
 
+    public void testOverlapAnchor() {
+        int[] anchorXY = new int[2];
+        int[] viewOnScreenXY = new int[2];
+        int[] viewInWindowXY = new int[2];
+
+        mPopupWindow = createPopupWindow(createPopupContent());
+        final View upperAnchor = mActivity.findViewById(R.id.anchor_upper);
+        upperAnchor.getLocationOnScreen(anchorXY);
+
+        assertFalse(mPopupWindow.getOverlapAnchor());
+        mPopupWindow.setOverlapAnchor(true);
+        assertTrue(mPopupWindow.getOverlapAnchor());
+
+        mInstrumentation.runOnMainSync(new Runnable() {
+            public void run() {
+                mPopupWindow.showAsDropDown(upperAnchor, 0, 0);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        mPopupWindow.getContentView().getLocationOnScreen(viewOnScreenXY);
+        mPopupWindow.getContentView().getLocationInWindow(viewInWindowXY);
+        assertEquals(anchorXY[0] + viewInWindowXY[0], viewOnScreenXY[0]);
+        assertEquals(anchorXY[1] + viewInWindowXY[1], viewOnScreenXY[1]);
+    }
+
+    public void testAccessWindowLayoutType() {
+        mPopupWindow = createPopupWindow(createPopupContent());
+        assertEquals(WindowManager.LayoutParams.TYPE_APPLICATION_PANEL,
+                mPopupWindow.getWindowLayoutType());
+        mPopupWindow.setWindowLayoutType(WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL);
+        assertEquals(WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL,
+                mPopupWindow.getWindowLayoutType());
+    }
+
     public void testGetMaxAvailableHeight() {
         mPopupWindow = createPopupWindow(createPopupContent());
 
@@ -422,7 +454,7 @@
         mPopupWindow.setOutsideTouchable(true);
 
         WindowManager.LayoutParams p = (WindowManager.LayoutParams)
-                mPopupWindow.getContentView().getLayoutParams();
+                mPopupWindow.getContentView().getRootView().getLayoutParams();
 
         assertEquals(0, WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES & p.flags);
         assertEquals(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
@@ -452,6 +484,36 @@
                 WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM & p.flags);
     }
 
+    public void testEnterExitTransition() {
+        mPopupWindow = createPopupWindow(createPopupContent());
+        final View anchorView = mActivity.findViewById(R.id.anchor_upper);
+
+        final MockTransition enterTransition = new MockTransition();
+        final MockTransition exitTransition = new MockTransition();
+        mPopupWindow.setEnterTransition(enterTransition);
+        mPopupWindow.setExitTransition(exitTransition);
+
+        mInstrumentation.runOnMainSync(new Runnable() {
+            public void run() {
+                mPopupWindow.showAsDropDown(anchorView, 0, 0);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        assertEquals(1, enterTransition.getTransitionCount());
+        assertEquals(0, exitTransition.getTransitionCount());
+
+        mInstrumentation.runOnMainSync(new Runnable() {
+            public void run() {
+                mPopupWindow.dismiss();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        assertEquals(1, enterTransition.getTransitionCount());
+        assertEquals(1, exitTransition.getTransitionCount());
+    }
+
     public void testUpdatePositionAndDimension() {
         int[] fstXY = new int[2];
         int[] sndXY = new int[2];
@@ -752,7 +814,7 @@
         mPopupWindow = new PopupWindow(new TextView(mActivity));
         showPopup();
 
-        ViewGroup.LayoutParams p = mPopupWindow.getContentView().getLayoutParams();
+        ViewGroup.LayoutParams p = mPopupWindow.getContentView().getRootView().getLayoutParams();
         assertEquals(0, p.width);
         assertEquals(0, p.height);
 
@@ -828,6 +890,48 @@
         }
     }
 
+    private static class MockTransition extends Transition {
+        private int mTransitionCount;
+
+        private MockTransition() {
+            addListener(new Transition.TransitionListener() {
+                @Override
+                public void onTransitionStart(Transition transition) {
+
+                }
+
+                public void onTransitionEnd(Transition transition) {
+                    mTransitionCount++;
+                }
+
+                @Override
+                public void onTransitionCancel(Transition transition) {
+
+                }
+
+                @Override
+                public void onTransitionPause(Transition transition) {
+
+                }
+
+                @Override
+                public void onTransitionResume(Transition transition) {
+
+                }
+            });
+        }
+
+        public void captureStartValues(TransitionValues transitionValues) {
+        }
+
+        public void captureEndValues(TransitionValues transitionValues) {
+        }
+
+        int getTransitionCount() {
+            return mTransitionCount;
+        }
+    }
+
     private View createPopupContent() {
         View popupView = new View(mActivity);
         popupView.setLayoutParams(new ViewGroup.LayoutParams(50, 50));
diff --git a/tests/tests/widget/src/android/widget/cts/QuickContactBadgeTest.java b/tests/tests/widget/src/android/widget/cts/QuickContactBadgeTest.java
new file mode 100644
index 0000000..a65bbe9
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/QuickContactBadgeTest.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2015 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.widget.cts;
+
+import android.content.ContentUris;
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.Contacts;
+import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
+import android.widget.QuickContactBadge;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+public class QuickContactBadgeTest extends InstrumentationTestCase {
+
+    @UiThreadTest
+    public void testPrioritizedMimetype() throws InterruptedException {
+        final String plainMimeType = "text/plain";
+        final Uri nonExistentContactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 0);
+        final CountDownLatch latch = new CountDownLatch(1);
+        final Context context = new ContextWrapper(getInstrumentation().getContext()) {
+            @Override
+            public void startActivity(Intent intent) {
+                testCallback(intent);
+            }
+
+            // @Override
+            public void startActivityAsUser(Intent intent, UserHandle user) {
+                testCallback(intent);
+            }
+
+            // @Override
+            public void startActivityAsUser(Intent intent, Bundle options, UserHandle user) {
+                testCallback(intent);
+            }
+
+            private void testCallback(Intent intent) {
+                assertEquals(plainMimeType, intent.getStringExtra(
+                        ContactsContract.QuickContact.EXTRA_PRIORITIZED_MIMETYPE));
+                latch.countDown();
+            }
+        };
+
+        // Execute: create QuickContactBadge with a prioritized mimetype and click on it
+        QuickContactBadge badge = new QuickContactBadge(context);
+        badge.setPrioritizedMimeType(plainMimeType);
+        badge.assignContactUri(nonExistentContactUri);
+        badge.onClick(badge);
+
+        // Verify: the QuickContactBadge attempts to start an activity, and sets the
+        // prioritized mimetype. We don't know which method will be used to start the activity,
+        // so we check all options.
+        assertTrue(latch.await(1, TimeUnit.SECONDS));
+    }
+}
+
diff --git a/tests/tests/widget/src/android/widget/cts/RadioGroup_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/RadioGroup_LayoutParamsTest.java
index 4b1aa5b..b14c0e8 100644
--- a/tests/tests/widget/src/android/widget/cts/RadioGroup_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RadioGroup_LayoutParamsTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.internal.R;
+import android.R;
 
 
 import org.xmlpull.v1.XmlPullParser;
diff --git a/tests/tests/widget/src/android/widget/cts/RatingBarTest.java b/tests/tests/widget/src/android/widget/cts/RatingBarTest.java
index 1bb42e8..211d7fe 100644
--- a/tests/tests/widget/src/android/widget/cts/RatingBarTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RatingBarTest.java
@@ -18,7 +18,6 @@
 
 import com.android.cts.widget.R;
 
-
 import android.content.Context;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.UiThreadTest;
@@ -45,7 +44,7 @@
     }
 
     public void testConstructor() {
-        new RatingBar(mContext, null, com.android.internal.R.attr.ratingBarStyle);
+        new RatingBar(mContext, null, android.R.attr.ratingBarStyle);
 
         new RatingBar(mContext, null);
 
diff --git a/tests/tests/widget/src/android/widget/cts/RelativeLayoutTest.java b/tests/tests/widget/src/android/widget/cts/RelativeLayoutTest.java
index b5ce5c9..b228ca6 100644
--- a/tests/tests/widget/src/android/widget/cts/RelativeLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RelativeLayoutTest.java
@@ -17,8 +17,6 @@
 package android.widget.cts;
 
 import com.android.cts.widget.R;
-import com.android.internal.util.XmlUtils;
-
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -36,6 +34,7 @@
 import android.view.ViewGroup.LayoutParams;
 import android.widget.AbsListView;
 import android.widget.RelativeLayout;
+import android.widget.cts.util.XmlUtils;
 
 import java.io.IOException;
 
@@ -318,6 +317,42 @@
         assertFalse(myRelativeLayout.checkLayoutParams(p3));
     }
 
+    public void testGetRule() {
+        RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(0, 0);
+        p.addRule(RelativeLayout.LEFT_OF, R.id.abslistview_root);
+        p.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
+
+        assertEquals("Get resource ID rule", R.id.abslistview_root,
+                p.getRule(RelativeLayout.LEFT_OF));
+        assertEquals("Get boolean rule", RelativeLayout.TRUE,
+                p.getRule(RelativeLayout.CENTER_IN_PARENT));
+        assertEquals("Get missing rule", 0, p.getRule(RelativeLayout.ABOVE));
+    }
+
+    /**
+     * Tests to prevent regressions in baseline alignment.
+     */
+    public void testBaselineAlignment() {
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                mActivity.setContentView(R.layout.relative_layout_baseline);
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+
+        View button = mActivity.findViewById(R.id.button1);
+        assertTrue(button.getHeight() > 0);
+
+        button = mActivity.findViewById(R.id.button2);
+        assertTrue(button.getHeight() > 0);
+
+        button = mActivity.findViewById(R.id.button3);
+        assertTrue(button.getHeight() > 0);
+
+        button = mActivity.findViewById(R.id.button4);
+        assertTrue(button.getHeight() > 0);
+    }
+
     private class MyRelativeLayout extends RelativeLayout {
         public MyRelativeLayout(Context context) {
             super(context);
diff --git a/tests/tests/widget/src/android/widget/cts/RelativeLayout_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/RelativeLayout_LayoutParamsTest.java
index a3bd95c..07c7b77 100644
--- a/tests/tests/widget/src/android/widget/cts/RelativeLayout_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RelativeLayout_LayoutParamsTest.java
@@ -18,7 +18,6 @@
 
 import com.android.cts.widget.R;
 
-
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.ViewAsserts;
 import android.view.View;
@@ -186,11 +185,13 @@
         assertEquals(0, rules[RelativeLayout.ALIGN_START]);
         assertEquals(R.id.relative_view21, rules[RelativeLayout.ALIGN_LEFT]);
         assertEquals(0, rules[RelativeLayout.ALIGN_RIGHT]);
-        rules = layoutParams.getRules(View.LAYOUT_DIRECTION_RTL);
+        layoutParams.resolveLayoutDirection(View.LAYOUT_DIRECTION_RTL);
+        rules = layoutParams.getRules();
         assertEquals(R.id.relative_view21, rules[RelativeLayout.BELOW]);
         assertEquals(0, rules[RelativeLayout.ALIGN_START]);
         assertEquals(0, rules[RelativeLayout.ALIGN_LEFT]);
         assertEquals(R.id.relative_view21, rules[RelativeLayout.ALIGN_RIGHT]);
+        layoutParams.resolveLayoutDirection(View.LAYOUT_DIRECTION_LTR);
 
         // view3, has same top position with view1 and same bottom position with view2,
         // and on the right of view1.1.
@@ -206,12 +207,14 @@
         assertEquals(0, rules[RelativeLayout.END_OF]);
         assertEquals(0, rules[RelativeLayout.LEFT_OF]);
         assertEquals(R.id.relative_view21, rules[RelativeLayout.RIGHT_OF]);
-        rules = layoutParams.getRules(View.LAYOUT_DIRECTION_RTL);
+        layoutParams.resolveLayoutDirection(View.LAYOUT_DIRECTION_RTL);
+        rules = layoutParams.getRules();
         assertEquals(R.id.relative_view21, rules[RelativeLayout.ALIGN_TOP]);
         assertEquals(R.id.relative_view22, rules[RelativeLayout.ALIGN_BOTTOM]);
         assertEquals(0, rules[RelativeLayout.END_OF]);
         assertEquals(R.id.relative_view21, rules[RelativeLayout.LEFT_OF]);
         assertEquals(0, rules[RelativeLayout.RIGHT_OF]);
+        layoutParams.resolveLayoutDirection(View.LAYOUT_DIRECTION_LTR);
 
         // view4, has same right position with view3 and above view3.
         // TEST: android:layout_alignEnd; android:layout_above
@@ -224,11 +227,13 @@
         assertEquals(0, rules[RelativeLayout.ALIGN_LEFT]);
         assertEquals(R.id.relative_view23, rules[RelativeLayout.ALIGN_RIGHT]);
         assertEquals(R.id.relative_view23, rules[RelativeLayout.ABOVE]);
-        rules = layoutParams.getRules(View.LAYOUT_DIRECTION_RTL);
+        layoutParams.resolveLayoutDirection(View.LAYOUT_DIRECTION_RTL);
+        rules = layoutParams.getRules();
         assertEquals(0, rules[RelativeLayout.ALIGN_END]);
         assertEquals(R.id.relative_view23, rules[RelativeLayout.ALIGN_LEFT]);
         assertEquals(0, rules[RelativeLayout.ALIGN_RIGHT]);
         assertEquals(R.id.relative_view23, rules[RelativeLayout.ABOVE]);
+        layoutParams.resolveLayoutDirection(View.LAYOUT_DIRECTION_LTR);
 
         // view5 goes on the left-bottom.
         // TEST: android:layout_alignParentBottom; android:layout_alignParentStart
@@ -241,11 +246,13 @@
         assertEquals(0, rules[RelativeLayout.ALIGN_PARENT_START]);
         assertEquals(RelativeLayout.TRUE, rules[RelativeLayout.ALIGN_PARENT_LEFT]);
         assertEquals(0, rules[RelativeLayout.ALIGN_PARENT_RIGHT]);
-        rules = layoutParams.getRules(View.LAYOUT_DIRECTION_RTL);
+        layoutParams.resolveLayoutDirection(View.LAYOUT_DIRECTION_RTL);
+        rules = layoutParams.getRules();
         assertEquals(RelativeLayout.TRUE, rules[RelativeLayout.ALIGN_PARENT_BOTTOM]);
         assertEquals(0, rules[RelativeLayout.ALIGN_PARENT_START]);
         assertEquals(0, rules[RelativeLayout.ALIGN_PARENT_LEFT]);
         assertEquals(RelativeLayout.TRUE, rules[RelativeLayout.ALIGN_PARENT_RIGHT]);
+        layoutParams.resolveLayoutDirection(View.LAYOUT_DIRECTION_LTR);
 
         // view6 goes on the top-right.
         // TEST: android:layout_alignParentTop; android:layout_alignParentEnd
@@ -258,11 +265,13 @@
         assertEquals(0, rules[RelativeLayout.ALIGN_PARENT_END]);
         assertEquals(0, rules[RelativeLayout.ALIGN_PARENT_LEFT]);
         assertEquals(RelativeLayout.TRUE, rules[RelativeLayout.ALIGN_PARENT_RIGHT]);
-        rules = layoutParams.getRules(View.LAYOUT_DIRECTION_RTL);
+        layoutParams.resolveLayoutDirection(View.LAYOUT_DIRECTION_RTL);
+        rules = layoutParams.getRules();
         assertEquals(RelativeLayout.TRUE, rules[RelativeLayout.ALIGN_PARENT_TOP]);
         assertEquals(0, rules[RelativeLayout.ALIGN_PARENT_END]);
         assertEquals(RelativeLayout.TRUE, rules[RelativeLayout.ALIGN_PARENT_LEFT]);
         assertEquals(0, rules[RelativeLayout.ALIGN_PARENT_RIGHT]);
+        layoutParams.resolveLayoutDirection(View.LAYOUT_DIRECTION_LTR);
 
         // view7, has same baseline with view6 and centered horizontally within its parent.
         // TEST: android:layout_alignBaseline; android:layout_centerHorizontal
@@ -273,9 +282,11 @@
         rules = layoutParams.getRules();
         assertEquals(R.id.relative_view26, rules[RelativeLayout.ALIGN_BASELINE]);
         assertEquals(RelativeLayout.TRUE, rules[RelativeLayout.CENTER_HORIZONTAL]);
-        rules = layoutParams.getRules(View.LAYOUT_DIRECTION_RTL);
+        layoutParams.resolveLayoutDirection(View.LAYOUT_DIRECTION_RTL);
+        rules = layoutParams.getRules();
         assertEquals(R.id.relative_view26, rules[RelativeLayout.ALIGN_BASELINE]);
         assertEquals(RelativeLayout.TRUE, rules[RelativeLayout.CENTER_HORIZONTAL]);
+        layoutParams.resolveLayoutDirection(View.LAYOUT_DIRECTION_LTR);
 
         // view8, centered vertically within its parent and on the left of view1.
         // TEST: android:layout_toStartOf; android:layout_centerVertical
@@ -288,11 +299,13 @@
         assertEquals(R.id.relative_view21, rules[RelativeLayout.LEFT_OF]);
         assertEquals(0, rules[RelativeLayout.RIGHT_OF]);
         assertEquals(RelativeLayout.TRUE, rules[RelativeLayout.CENTER_VERTICAL]);
-        rules = layoutParams.getRules(View.LAYOUT_DIRECTION_RTL);
+        layoutParams.resolveLayoutDirection(View.LAYOUT_DIRECTION_RTL);
+        rules = layoutParams.getRules();
         assertEquals(0, rules[RelativeLayout.START_OF]);
         assertEquals(0, rules[RelativeLayout.LEFT_OF]);
         assertEquals(R.id.relative_view21, rules[RelativeLayout.RIGHT_OF]);
         assertEquals(RelativeLayout.TRUE, rules[RelativeLayout.CENTER_VERTICAL]);
+        layoutParams.resolveLayoutDirection(View.LAYOUT_DIRECTION_LTR);
 
         // view9, has same top and bottom position with view3 and same left position with its parent
         // TEST: android:layout_alignStart; android:layout_alignTop; android:layout_alignBottom;
@@ -308,12 +321,14 @@
         assertEquals(0, rules[RelativeLayout.ALIGN_RIGHT]);
         assertEquals(R.id.relative_view23, rules[RelativeLayout.ALIGN_TOP]);
         assertEquals(R.id.relative_view23, rules[RelativeLayout.ALIGN_BOTTOM]);
-        rules = layoutParams.getRules(View.LAYOUT_DIRECTION_RTL);
+        layoutParams.resolveLayoutDirection(View.LAYOUT_DIRECTION_RTL);
+        rules = layoutParams.getRules();
         assertEquals(0, rules[RelativeLayout.ALIGN_START]);
         assertEquals(0, rules[RelativeLayout.ALIGN_LEFT]);
         assertEquals(R.id.gravity_bottom, rules[RelativeLayout.ALIGN_RIGHT]);
         assertEquals(R.id.relative_view23, rules[RelativeLayout.ALIGN_TOP]);
         assertEquals(R.id.relative_view23, rules[RelativeLayout.ALIGN_BOTTOM]);
+        layoutParams.resolveLayoutDirection(View.LAYOUT_DIRECTION_LTR);
     }
 
     public void testAccessRule1() {
diff --git a/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java b/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java
index 328f9f3..58738a1 100644
--- a/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java
@@ -16,6 +16,7 @@
 
 package android.widget.cts;
 
+import android.graphics.drawable.Icon;
 import android.test.UiThreadTest;
 import com.android.cts.widget.R;
 
@@ -152,6 +153,33 @@
         }
     }
 
+    public void testSetIcon() {
+        ImageView image = (ImageView) mResult.findViewById(R.id.remoteView_image);
+        assertNull(image.getDrawable());
+
+        Icon iconBlack = Icon.createWithResource(mActivity, R.drawable.icon_black);
+        mRemoteViews.setIcon(R.id.remoteView_image, "setImageIcon", iconBlack);
+        mRemoteViews.reapply(mActivity, mResult);
+        assertNotNull(image.getDrawable());
+        BitmapDrawable dBlack = (BitmapDrawable) mActivity.getDrawable(R.drawable.icon_black);
+        WidgetTestUtils.assertEquals(dBlack.getBitmap(),
+                ((BitmapDrawable) image.getDrawable()).getBitmap());
+    }
+
+    public void testSetImageViewIcon() {
+        ImageView image = (ImageView) mResult.findViewById(R.id.remoteView_image);
+        assertNull(image.getDrawable());
+
+        Icon iconBlue = Icon.createWithResource(mActivity, R.drawable.icon_blue);
+        mRemoteViews.setImageViewIcon(R.id.remoteView_image, iconBlue);
+        mRemoteViews.reapply(mActivity, mResult);
+        assertNotNull(image.getDrawable());
+        BitmapDrawable dBlue = (BitmapDrawable) mActivity.getDrawable(R.drawable.icon_blue);
+        WidgetTestUtils.assertEquals(dBlue.getBitmap(),
+                ((BitmapDrawable) image.getDrawable()).getBitmap());
+
+    }
+
     public void testSetImageViewResource() {
         ImageView image = (ImageView) mResult.findViewById(R.id.remoteView_image);
         assertNull(image.getDrawable());
@@ -159,8 +187,7 @@
         mRemoteViews.setImageViewResource(R.id.remoteView_image, R.drawable.testimage);
         mRemoteViews.reapply(mActivity, mResult);
         assertNotNull(image.getDrawable());
-        BitmapDrawable d = (BitmapDrawable) mActivity
-                .getResources().getDrawable(R.drawable.testimage);
+        BitmapDrawable d = (BitmapDrawable) mActivity.getDrawable(R.drawable.testimage);
         WidgetTestUtils.assertEquals(d.getBitmap(),
                 ((BitmapDrawable) image.getDrawable()).getBitmap());
 
diff --git a/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java b/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java
index 28bfd06..580be27 100644
--- a/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java
@@ -170,13 +170,20 @@
     }
 
     private static class MockResourceCursorAdapter extends ResourceCursorAdapter {
+        private final boolean mAutoRequery;
+
         public MockResourceCursorAdapter(Context context, int layout, Cursor c) {
             super(context, layout, c);
+
+            // Default is true.
+            mAutoRequery = true;
         }
 
         public MockResourceCursorAdapter(Context context, int layout,
                 Cursor c, boolean autoRequery) {
             super(context, layout, c, autoRequery);
+
+            mAutoRequery = autoRequery;
         }
 
         @Override
diff --git a/tests/tests/widget/src/android/widget/cts/SeekBarTest.java b/tests/tests/widget/src/android/widget/cts/SeekBarTest.java
index 54bbedf..43aada2 100644
--- a/tests/tests/widget/src/android/widget/cts/SeekBarTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SeekBarTest.java
@@ -54,7 +54,7 @@
 
         new SeekBar(mActivity, null);
 
-        new SeekBar(mActivity, null, com.android.internal.R.attr.seekBarStyle);
+        new SeekBar(mActivity, null, android.R.attr.seekBarStyle);
     }
 
     public void testSetOnSeekBarChangeListener() {
diff --git a/tests/tests/widget/src/android/widget/cts/SimpleAdapterTest.java b/tests/tests/widget/src/android/widget/cts/SimpleAdapterTest.java
index c530293..28ff15e 100644
--- a/tests/tests/widget/src/android/widget/cts/SimpleAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SimpleAdapterTest.java
@@ -16,10 +16,11 @@
 
 package android.widget.cts;
 
-import com.android.internal.R;
+import android.R;
 
 
 import android.content.Context;
+import android.content.res.Resources.Theme;
 import android.cts.util.WidgetTestUtils;
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
@@ -260,6 +261,12 @@
         }
     }
 
+    public void testAccessDropDownViewTheme() {
+        Theme theme = mContext.getResources().newTheme();
+        mSimpleAdapter.setDropDownViewTheme(theme);
+        assertSame(theme, mSimpleAdapter.getDropDownViewTheme());
+    }
+
     public void testAccessViewBinder() {
         // no binder default
         assertNull(mSimpleAdapter.getViewBinder());
diff --git a/tests/tests/widget/src/android/widget/cts/SimpleExpandableListAdapterTest.java b/tests/tests/widget/src/android/widget/cts/SimpleExpandableListAdapterTest.java
index a7bfc31..d1c63c0 100644
--- a/tests/tests/widget/src/android/widget/cts/SimpleExpandableListAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SimpleExpandableListAdapterTest.java
@@ -16,7 +16,7 @@
 
 package android.widget.cts;
 
-import com.android.internal.R;
+import android.R;
 
 
 import android.content.Context;
diff --git a/tests/tests/widget/src/android/widget/cts/SpinnerTest.java b/tests/tests/widget/src/android/widget/cts/SpinnerTest.java
index 1989626..ea37470 100644
--- a/tests/tests/widget/src/android/widget/cts/SpinnerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SpinnerTest.java
@@ -23,8 +23,10 @@
 import android.app.Dialog;
 import android.content.Context;
 import android.content.res.Resources.NotFoundException;
+import android.content.res.Resources.Theme;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.UiThreadTest;
+import android.view.ContextThemeWrapper;
 import android.widget.ArrayAdapter;
 import android.widget.Spinner;
 
@@ -50,7 +52,18 @@
 
         new Spinner(mTargetContext, null);
 
-        new Spinner(mTargetContext, null, com.android.internal.R.attr.spinnerStyle);
+        new Spinner(mTargetContext, null, android.R.attr.spinnerStyle);
+
+        new Spinner(mTargetContext, Spinner.MODE_DIALOG);
+
+        new Spinner(mTargetContext, null, android.R.attr.spinnerStyle,
+                Spinner.MODE_DIALOG);
+
+        new Spinner(mTargetContext, null, android.R.attr.spinnerStyle, 0,
+                Spinner.MODE_DIALOG);
+
+        new Spinner(mTargetContext, null, android.R.attr.spinnerStyle, 0,
+                Spinner.MODE_DIALOG, mTargetContext.getTheme());
 
         Spinner spinner = (Spinner) getActivity().findViewById(R.id.spinner1);
         assertEquals(mTargetContext.getString(R.string.text_view_hello), spinner.getPrompt());
@@ -156,6 +169,18 @@
         // TODO: find the dialog and get its title to assert whether setPromptId() takes effect?
     }
 
+    @UiThreadTest
+    public void testGetPopupContext() {
+        Theme theme = mTargetContext.getResources().newTheme();
+        Spinner themeSpinner = new Spinner(mTargetContext, null,
+                android.R.attr.spinnerStyle, 0, Spinner.MODE_DIALOG, theme);
+        assertNotSame(mTargetContext, themeSpinner.getPopupContext());
+        assertSame(theme, themeSpinner.getPopupContext().getTheme());
+
+        ContextThemeWrapper context = (ContextThemeWrapper)themeSpinner.getPopupContext();
+        assertSame(mTargetContext, context.getBaseContext());
+    }
+
     public void testOnLayout() {
         // onLayout() is implementation details, do NOT test
     }
diff --git a/tests/tests/widget/src/android/widget/cts/SwitchTest.java b/tests/tests/widget/src/android/widget/cts/SwitchTest.java
new file mode 100644
index 0000000..164e7bf
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/SwitchTest.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2015 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.widget.cts;
+
+import com.android.cts.widget.R;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.content.res.XmlResourceParser;
+import android.cts.util.WidgetTestUtils;
+import android.graphics.Color;
+import android.graphics.PorterDuff.Mode;
+import android.test.AndroidTestCase;
+import android.util.Xml;
+import android.widget.Switch;
+
+import java.io.IOException;
+import org.xmlpull.v1.XmlPullParserException;
+
+/**
+ * Test {@link Switch}.
+ */
+public class SwitchTest extends AndroidTestCase {
+    public void testConstructor() throws XmlPullParserException, IOException {
+        new Switch(mContext);
+
+        XmlResourceParser parser = mContext.getResources().getLayout(R.layout.switch_layout);
+        WidgetTestUtils.beginDocument(parser, "Switch");
+
+        new Switch(mContext, parser);
+
+        new Switch(mContext, parser, 0);
+
+        new Switch(mContext, parser, 0, 0);
+    }
+
+    public void testAccessThumbTint() throws XmlPullParserException, IOException {
+        XmlResourceParser parser = mContext.getResources().getLayout(R.layout.switch_layout);
+        WidgetTestUtils.beginDocument(parser, "Switch");
+        Switch aSwitch = new Switch(mContext, parser);
+        assertEquals(Color.WHITE, aSwitch.getThumbTintList().getDefaultColor());
+        assertEquals(Mode.SRC_OVER, aSwitch.getThumbTintMode());
+
+        ColorStateList colors = ColorStateList.valueOf(Color.RED);
+        aSwitch.setThumbTintList(colors);
+        aSwitch.setThumbTintMode(Mode.XOR);
+
+        assertSame(colors, aSwitch.getThumbTintList());
+        assertEquals(Mode.XOR, aSwitch.getThumbTintMode());
+    }
+
+    public void testAccessTrackTint() throws XmlPullParserException, IOException {
+        XmlResourceParser parser = mContext.getResources().getLayout(R.layout.switch_layout);
+        WidgetTestUtils.beginDocument(parser, "Switch");
+        Switch aSwitch = new Switch(mContext, parser);
+        assertEquals(Color.BLACK, aSwitch.getTrackTintList().getDefaultColor());
+        assertEquals(Mode.SRC_ATOP, aSwitch.getTrackTintMode());
+
+        ColorStateList colors = ColorStateList.valueOf(Color.RED);
+        aSwitch.setTrackTintList(colors);
+        aSwitch.setTrackTintMode(Mode.XOR);
+
+        assertSame(colors, aSwitch.getTrackTintList());
+        assertEquals(Mode.XOR, aSwitch.getTrackTintMode());
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/TabHost_TabSpecTest.java b/tests/tests/widget/src/android/widget/cts/TabHost_TabSpecTest.java
index 1363491..5745808 100644
--- a/tests/tests/widget/src/android/widget/cts/TabHost_TabSpecTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TabHost_TabSpecTest.java
@@ -65,7 +65,7 @@
         mTabHost.addTab(tabSpec);
         mTabHost.setCurrentTab(1);
         View currentTabView = mTabHost.getCurrentTabView();
-        int idTitle = com.android.internal.R.id.title;
+        int idTitle = android.R.id.title;
         TextView tvTitle = (TextView) currentTabView.findViewById(idTitle);
         assertEquals(TAG_TAB2, tvTitle.getText().toString());
 
@@ -90,8 +90,8 @@
         mTabHost.addTab(tabSpec);
         mTabHost.setCurrentTab(1);
         View currentTabView = mTabHost.getCurrentTabView();
-        int idTitle = com.android.internal.R.id.title;
-        int idIcon = com.android.internal.R.id.icon;
+        int idTitle = android.R.id.title;
+        int idIcon = android.R.id.icon;
         TextView tvTitle = (TextView) currentTabView.findViewById(idTitle);
         ImageView ivIcon = ((ImageView) currentTabView.findViewById(idIcon));
         assertEquals("", tvTitle.getText().toString());
diff --git a/tests/tests/widget/src/android/widget/cts/TableLayoutTest.java b/tests/tests/widget/src/android/widget/cts/TableLayoutTest.java
index 5259736..b9f0d1f 100644
--- a/tests/tests/widget/src/android/widget/cts/TableLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TableLayoutTest.java
@@ -18,7 +18,6 @@
 
 import com.android.cts.widget.R;
 
-
 import android.content.Context;
 import android.content.res.XmlResourceParser;
 import android.test.ActivityInstrumentationTestCase2;
diff --git a/tests/tests/widget/src/android/widget/cts/TableLayout_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/TableLayout_LayoutParamsTest.java
index 20a9937..cbc41ce 100644
--- a/tests/tests/widget/src/android/widget/cts/TableLayout_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TableLayout_LayoutParamsTest.java
@@ -16,6 +16,10 @@
 
 package android.widget.cts;
 
+import com.android.cts.widget.R;
+
+import org.xmlpull.v1.XmlPullParser;
+
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.content.res.XmlResourceParser;
@@ -23,12 +27,7 @@
 import android.util.AttributeSet;
 import android.util.Xml;
 import android.widget.TableLayout;
-
-import com.android.internal.R;
-import com.android.internal.util.XmlUtils;
-
-
-import org.xmlpull.v1.XmlPullParser;
+import android.widget.cts.util.XmlUtils;
 
 /**
  * Test {@link TableLayout.LayoutParams}.
@@ -74,56 +73,59 @@
 
         // base_attr_pixel: layout_width = 400px, layout_height = 600px
         AttributeSet attrs = getAttrs("base_attr_pixel");
-        TypedArray a = mTargetContext.obtainStyledAttributes(attrs, R.styleable.ViewGroup_Layout);
+        TypedArray a = mTargetContext.obtainStyledAttributes(attrs,
+                android.R.styleable.ViewGroup_Layout);
 
-        mockLayoutParams.setBaseAttributes(a, R.styleable.ViewGroup_Layout_layout_width,
-                R.styleable.ViewGroup_Layout_layout_height);
+        mockLayoutParams.setBaseAttributes(a, android.R.styleable.ViewGroup_Layout_layout_width,
+                android.R.styleable.ViewGroup_Layout_layout_height);
         assertEquals(TableLayout.LayoutParams.MATCH_PARENT, mockLayoutParams.width);
         assertEquals(600, mockLayoutParams.height);
 
-        mockLayoutParams.setBaseAttributes(a, R.styleable.ViewGroup_Layout_layout_height,
-                R.styleable.ViewGroup_Layout_layout_width);
+        mockLayoutParams.setBaseAttributes(a, android.R.styleable.ViewGroup_Layout_layout_height,
+                android.R.styleable.ViewGroup_Layout_layout_width);
         assertEquals(TableLayout.LayoutParams.MATCH_PARENT, mockLayoutParams.width);
         assertEquals(400, mockLayoutParams.height);
 
         a.recycle();
         // base_attr_fillwrap: layout_width = "match_parent", layout_height = "wrap_content"
         attrs = getAttrs("base_attr_fillwrap");
-        a = mTargetContext.obtainStyledAttributes(attrs, R.styleable.ViewGroup_Layout);
+        a = mTargetContext.obtainStyledAttributes(attrs, android.R.styleable.ViewGroup_Layout);
 
-        mockLayoutParams.setBaseAttributes(a, R.styleable.ViewGroup_Layout_layout_width,
-                R.styleable.ViewGroup_Layout_layout_height);
+        mockLayoutParams.setBaseAttributes(a, android.R.styleable.ViewGroup_Layout_layout_width,
+                android.R.styleable.ViewGroup_Layout_layout_height);
         assertEquals(TableLayout.LayoutParams.MATCH_PARENT, mockLayoutParams.width);
         assertEquals(TableLayout.LayoutParams.WRAP_CONTENT, mockLayoutParams.height);
 
-        mockLayoutParams.setBaseAttributes(a, R.styleable.ViewGroup_Layout_layout_height,
-                R.styleable.ViewGroup_Layout_layout_width);
+        mockLayoutParams.setBaseAttributes(a, android.R.styleable.ViewGroup_Layout_layout_height,
+                android.R.styleable.ViewGroup_Layout_layout_width);
         assertEquals(TableLayout.LayoutParams.MATCH_PARENT, mockLayoutParams.width);
         assertEquals(TableLayout.LayoutParams.MATCH_PARENT, mockLayoutParams.height);
 
         a.recycle();
         // base_attr_noheight: layout_width = 600px, no layout_height.
         attrs = getAttrs("base_attr_noheight");
-        a = mTargetContext.obtainStyledAttributes(attrs, R.styleable.ViewGroup_Layout);
+        a = mTargetContext.obtainStyledAttributes(attrs, android.R.styleable.ViewGroup_Layout);
 
-        mockLayoutParams.setBaseAttributes(a, R.styleable.ViewGroup_Layout_layout_width,
-                R.styleable.ViewGroup_Layout_layout_height);
+        mockLayoutParams.setBaseAttributes(a, android.R.styleable.ViewGroup_Layout_layout_width,
+                android.R.styleable.ViewGroup_Layout_layout_height);
         assertEquals(TableLayout.LayoutParams.MATCH_PARENT, mockLayoutParams.width);
         assertEquals(TableLayout.LayoutParams.WRAP_CONTENT, mockLayoutParams.height);
 
-        mockLayoutParams.setBaseAttributes(a, R.styleable.ViewGroup_Layout_layout_height,
-                R.styleable.ViewGroup_Layout_layout_width);
+        mockLayoutParams.setBaseAttributes(a, android.R.styleable.ViewGroup_Layout_layout_height,
+                android.R.styleable.ViewGroup_Layout_layout_width);
         assertEquals(TableLayout.LayoutParams.MATCH_PARENT, mockLayoutParams.width);
         assertEquals(600, mockLayoutParams.height);
 
         try {
-            mockLayoutParams.setBaseAttributes(null, R.styleable.ViewGroup_Layout_layout_width,
-                    R.styleable.ViewGroup_Layout_layout_height);
+            mockLayoutParams.setBaseAttributes(null,
+                    android.R.styleable.ViewGroup_Layout_layout_width,
+                    android.R.styleable.ViewGroup_Layout_layout_height);
             fail("Should throw NullPointerException");
         } catch (NullPointerException e) {
         }
 
-        mockLayoutParams.setBaseAttributes(a, -1, R.styleable.ViewGroup_Layout_layout_height);
+        mockLayoutParams.setBaseAttributes(a, -1,
+                android.R.styleable.ViewGroup_Layout_layout_height);
         assertEquals(TableLayout.LayoutParams.MATCH_PARENT, mockLayoutParams.width);
         assertEquals(TableLayout.LayoutParams.WRAP_CONTENT, mockLayoutParams.height);
 
@@ -138,8 +140,7 @@
         XmlResourceParser parser = null;
         AttributeSet attrs = null;
         try {
-            parser = mTargetContext.getResources()
-                    .getXml(com.android.cts.widget.R.xml.base_attributes);
+            parser = mTargetContext.getResources().getXml(R.xml.base_attributes);
 
             int type;
             while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
diff --git a/tests/tests/widget/src/android/widget/cts/TableRow_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/TableRow_LayoutParamsTest.java
index cf2603f..8308414 100644
--- a/tests/tests/widget/src/android/widget/cts/TableRow_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TableRow_LayoutParamsTest.java
@@ -16,6 +16,10 @@
 
 package android.widget.cts;
 
+import com.android.cts.widget.R;
+
+import org.xmlpull.v1.XmlPullParser;
+
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.content.res.XmlResourceParser;
@@ -28,12 +32,7 @@
 import android.view.ViewGroup.MarginLayoutParams;
 import android.widget.TableLayout;
 import android.widget.TableRow;
-
-import com.android.internal.R;
-import com.android.internal.util.XmlUtils;
-
-
-import org.xmlpull.v1.XmlPullParser;
+import android.widget.cts.util.XmlUtils;
 
 /**
  * Test {@link TableRow.LayoutParams}.
@@ -92,8 +91,8 @@
         assertEquals(0, layoutParams.span);
 
         TableCtsActivity activity = getActivity();
-        activity.setContentView(com.android.cts.widget.R.layout.table_layout_2);
-        int idTable = com.android.cts.widget.R.id.table2;
+        activity.setContentView(R.layout.table_layout_2);
+        int idTable = R.id.table2;
         TableLayout tableLayout = (TableLayout) activity.findViewById(idTable);
         View vVitural1 = ((TableRow) tableLayout.getChildAt(0)).getVirtualChildAt(1);
         layoutParams = (TableRow.LayoutParams) vVitural1.getLayoutParams();
@@ -117,65 +116,67 @@
 
         // base_attr_pixel: layout_width = 400px, layout_height = 600px
         AttributeSet attrs = getAttrs("base_attr_pixel");
-        TypedArray a = mTargetContext.obtainStyledAttributes(attrs, R.styleable.ViewGroup_Layout);
+        TypedArray a = mTargetContext.obtainStyledAttributes(attrs,
+                android.R.styleable.ViewGroup_Layout);
 
-        mockLayoutParams.setBaseAttributes(a, R.styleable.ViewGroup_Layout_layout_width,
-                R.styleable.ViewGroup_Layout_layout_height);
+        mockLayoutParams.setBaseAttributes(a, android.R.styleable.ViewGroup_Layout_layout_width,
+                android.R.styleable.ViewGroup_Layout_layout_height);
         assertEquals(400, mockLayoutParams.width);
         assertEquals(600, mockLayoutParams.height);
 
-        mockLayoutParams.setBaseAttributes(a, R.styleable.ViewGroup_Layout_layout_height,
-                R.styleable.ViewGroup_Layout_layout_width);
+        mockLayoutParams.setBaseAttributes(a, android.R.styleable.ViewGroup_Layout_layout_height,
+                android.R.styleable.ViewGroup_Layout_layout_width);
         assertEquals(600, mockLayoutParams.width);
         assertEquals(400, mockLayoutParams.height);
 
         a.recycle();
         // base_attr_fillwrap: layout_width = "match_parent", layout_height = "wrap_content"
         attrs = getAttrs("base_attr_fillwrap");
-        a = mTargetContext.obtainStyledAttributes(attrs, R.styleable.ViewGroup_Layout);
+        a = mTargetContext.obtainStyledAttributes(attrs, android.R.styleable.ViewGroup_Layout);
 
-        mockLayoutParams.setBaseAttributes(a, R.styleable.ViewGroup_Layout_layout_width,
-                R.styleable.ViewGroup_Layout_layout_height);
+        mockLayoutParams.setBaseAttributes(a, android.R.styleable.ViewGroup_Layout_layout_width,
+                android.R.styleable.ViewGroup_Layout_layout_height);
         assertEquals(TableLayout.LayoutParams.MATCH_PARENT, mockLayoutParams.width);
         assertEquals(TableLayout.LayoutParams.WRAP_CONTENT, mockLayoutParams.height);
 
-        mockLayoutParams.setBaseAttributes(a, R.styleable.ViewGroup_Layout_layout_height,
-                R.styleable.ViewGroup_Layout_layout_width);
+        mockLayoutParams.setBaseAttributes(a, android.R.styleable.ViewGroup_Layout_layout_height,
+                android.R.styleable.ViewGroup_Layout_layout_width);
         assertEquals(TableLayout.LayoutParams.WRAP_CONTENT, mockLayoutParams.width);
         assertEquals(TableLayout.LayoutParams.MATCH_PARENT, mockLayoutParams.height);
 
         a.recycle();
         // base_attr_noheight: layout_width = 600px, no layout_height.
         attrs = getAttrs("base_attr_noheight");
-        a = mTargetContext.obtainStyledAttributes(attrs, R.styleable.ViewGroup_Layout);
+        a = mTargetContext.obtainStyledAttributes(attrs, android.R.styleable.ViewGroup_Layout);
 
-        mockLayoutParams.setBaseAttributes(a, R.styleable.ViewGroup_Layout_layout_width,
-                R.styleable.ViewGroup_Layout_layout_height);
+        mockLayoutParams.setBaseAttributes(a, android.R.styleable.ViewGroup_Layout_layout_width,
+                android.R.styleable.ViewGroup_Layout_layout_height);
         assertEquals(600, mockLayoutParams.width);
         assertEquals(TableLayout.LayoutParams.WRAP_CONTENT, mockLayoutParams.height);
 
-        mockLayoutParams.setBaseAttributes(a, R.styleable.ViewGroup_Layout_layout_height,
-                R.styleable.ViewGroup_Layout_layout_width);
+        mockLayoutParams.setBaseAttributes(a, android.R.styleable.ViewGroup_Layout_layout_height,
+                android.R.styleable.ViewGroup_Layout_layout_width);
         assertEquals(TableLayout.LayoutParams.MATCH_PARENT, mockLayoutParams.width);
         assertEquals(600, mockLayoutParams.height);
 
         try {
-            mockLayoutParams.setBaseAttributes(null, R.styleable.ViewGroup_Layout_layout_width,
-                    R.styleable.ViewGroup_Layout_layout_height);
+            mockLayoutParams.setBaseAttributes(null,
+                    android.R.styleable.ViewGroup_Layout_layout_width,
+                    android.R.styleable.ViewGroup_Layout_layout_height);
             fail("Should throw NullPointerException");
         } catch (NullPointerException e) {
         }
 
         try {
             mockLayoutParams.setBaseAttributes(a, -1,
-                    R.styleable.ViewGroup_Layout_layout_height);
+                    android.R.styleable.ViewGroup_Layout_layout_height);
             fail("Should throw ArrayIndexOutOfBoundsException");
         } catch (ArrayIndexOutOfBoundsException e) {
         }
 
         try {
             mockLayoutParams.setBaseAttributes(null,
-                    R.styleable.ViewGroup_Layout_layout_width, -1);
+                    android.R.styleable.ViewGroup_Layout_layout_width, -1);
             fail("Should throw ArrayIndexOutOfBoundsException");
         } catch (NullPointerException e) {
         }
@@ -185,8 +186,7 @@
         XmlResourceParser parser = null;
         AttributeSet attrs = null;
         try {
-            parser = mTargetContext.getResources()
-                    .getXml(com.android.cts.widget.R.xml.base_attributes);
+            parser = mTargetContext.getResources().getXml(R.xml.base_attributes);
 
             int type;
             while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
diff --git a/tests/tests/widget/src/android/widget/cts/TextViewTest.java b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
index 480e1a6..3130a26 100644
--- a/tests/tests/widget/src/android/widget/cts/TextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
@@ -17,7 +17,6 @@
 package android.widget.cts;
 
 import com.android.cts.widget.R;
-import com.android.internal.util.FastMath;
 
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -33,6 +32,7 @@
 import android.graphics.Color;
 import android.graphics.Paint;
 import android.graphics.Path;
+import android.graphics.PorterDuff;
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.graphics.Typeface;
@@ -40,7 +40,9 @@
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.Parcelable;
 import android.test.ActivityInstrumentationTestCase2;
+import android.test.MoreAsserts;
 import android.test.TouchUtils;
 import android.test.UiThreadTest;
 import android.text.Editable;
@@ -75,16 +77,21 @@
 import android.util.TypedValue;
 import android.view.ContextMenu;
 import android.view.ContextMenu.ContextMenuInfo;
+import android.view.ActionMode;
 import android.view.Gravity;
 import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnCreateContextMenuListener;
 import android.view.View.OnLongClickListener;
 import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityNodeInfo;
 import android.view.inputmethod.BaseInputConnection;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.ExtractedText;
 import android.view.inputmethod.ExtractedTextRequest;
+import android.view.inputmethod.InputConnection;
 import android.widget.EditText;
 import android.widget.FrameLayout;
 import android.widget.LinearLayout;
@@ -94,6 +101,7 @@
 import android.widget.TextView.OnEditorActionListener;
 
 import java.io.IOException;
+import java.util.Locale;
 
 /**
  * Test {@link TextView}.
@@ -128,6 +136,21 @@
         mInstrumentation = getInstrumentation();
     }
 
+    /**
+     * Promotes the TextView to editable and places focus in it to allow simulated typing.
+     */
+    private void initTextViewForTyping() {
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                mTextView = findTextView(R.id.textview_text);
+                mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE));
+                mTextView.setText("", BufferType.EDITABLE);
+                mTextView.requestFocus();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
     public void testConstructor() {
         new TextView(mActivity);
 
@@ -762,37 +785,38 @@
         float add = 1.2f;
         float mult = 1.4f;
         setLineSpacing(add, mult);
-        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
+        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
         add = 0.0f;
         mult = 1.4f;
         setLineSpacing(add, mult);
-        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
+        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
 
         // abnormal
         add = -1.2f;
         mult = 1.4f;
         setLineSpacing(add, mult);
-        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
+        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
         add = -1.2f;
         mult = -1.4f;
         setLineSpacing(add, mult);
-        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
+        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
         add = 1.2f;
         mult = 0.0f;
         setLineSpacing(add, mult);
-        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
+        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
 
         // edge
         add = Float.MIN_VALUE;
         mult = Float.MIN_VALUE;
         setLineSpacing(add, mult);
-        float expected = originalLineHeight * mult + add;
-        assertEquals(FastMath.round(expected), mTextView.getLineHeight());
+        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
+
+        // edge case where the behavior of Math.round() deviates from
+        // FastMath.round(), requiring us to use an explicit 0 value
         add = Float.MAX_VALUE;
         mult = Float.MAX_VALUE;
         setLineSpacing(add, mult);
-        expected = originalLineHeight * mult + add;
-        assertEquals(FastMath.round(expected), mTextView.getLineHeight());
+        assertEquals(0, mTextView.getLineHeight());
     }
 
     public void testInstanceState() {
@@ -1241,6 +1265,537 @@
         }
     }
 
+    public void testUndo_insert() {
+        initTextViewForTyping();
+
+        // Type some text.
+        mInstrumentation.sendStringSync("abc");
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Precondition: The cursor is at the end of the text.
+                assertEquals(3, mTextView.getSelectionStart());
+
+                // Undo removes the typed string in one step.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+                assertEquals(0, mTextView.getSelectionStart());
+
+                // Redo restores the text and cursor position.
+                mTextView.onTextContextMenuItem(android.R.id.redo);
+                assertEquals("abc", mTextView.getText().toString());
+                assertEquals(3, mTextView.getSelectionStart());
+
+                // Undoing the redo clears the text again.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+
+                // Undo when the undo stack is empty does nothing.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testUndo_delete() {
+        initTextViewForTyping();
+
+        // Simulate deleting text and undoing it.
+        mInstrumentation.sendStringSync("xyz");
+        sendKeys(KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL);
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Precondition: The text was actually deleted.
+                assertEquals("", mTextView.getText().toString());
+                assertEquals(0, mTextView.getSelectionStart());
+
+                // Undo restores the typed string and cursor position in one step.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("xyz", mTextView.getText().toString());
+                assertEquals(3, mTextView.getSelectionStart());
+
+                // Redo removes the text in one step.
+                mTextView.onTextContextMenuItem(android.R.id.redo);
+                assertEquals("", mTextView.getText().toString());
+                assertEquals(0, mTextView.getSelectionStart());
+
+                // Undoing the redo restores the text again.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("xyz", mTextView.getText().toString());
+                assertEquals(3, mTextView.getSelectionStart());
+
+                // Undoing again undoes the original typing.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+                assertEquals(0, mTextView.getSelectionStart());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    // Initialize the text view for simulated IME typing. Must be called on UI thread.
+    private InputConnection initTextViewForSimulatedIme() {
+        mTextView = findTextView(R.id.textview_text);
+        mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE));
+        mTextView.setText("", BufferType.EDITABLE);
+        return mTextView.onCreateInputConnection(new EditorInfo());
+    }
+
+    // Simulates IME composing text behavior.
+    private void setComposingTextInBatch(InputConnection input, CharSequence text) {
+        input.beginBatchEdit();
+        input.setComposingText(text, 1);  // Leave cursor at end.
+        input.endBatchEdit();
+    }
+
+    @UiThreadTest
+    public void testUndo_imeInsertLatin() {
+        InputConnection input = initTextViewForSimulatedIme();
+
+        // Simulate IME text entry behavior. The Latin IME enters text by replacing partial words,
+        // such as "c" -> "ca" -> "cat" -> "cat ".
+        setComposingTextInBatch(input, "c");
+        setComposingTextInBatch(input, "ca");
+
+        // The completion and space are added in the same batch.
+        input.beginBatchEdit();
+        input.commitText("cat", 1);
+        input.commitText(" ", 1);
+        input.endBatchEdit();
+
+        // The repeated replacements undo in a single step.
+        mTextView.onTextContextMenuItem(android.R.id.undo);
+        assertEquals("", mTextView.getText().toString());
+    }
+
+    @UiThreadTest
+    public void testUndo_imeInsertJapanese() {
+        InputConnection input = initTextViewForSimulatedIme();
+
+        // The Japanese IME does repeated replacements of Latin characters to hiragana to kanji.
+        final String HA = "\u306F";  // HIRAGANA LETTER HA
+        final String NA = "\u306A";  // HIRAGANA LETTER NA
+        setComposingTextInBatch(input, "h");
+        setComposingTextInBatch(input, HA);
+        setComposingTextInBatch(input, HA + "n");
+        setComposingTextInBatch(input, HA + NA);
+
+        // The result may be a surrogate pair. The composition ends in the same batch.
+        input.beginBatchEdit();
+        input.commitText("\uD83C\uDF37", 1);  // U+1F337 TULIP
+        input.setComposingText("", 1);
+        input.endBatchEdit();
+
+        // The repeated replacements are a single undo step.
+        mTextView.onTextContextMenuItem(android.R.id.undo);
+        assertEquals("", mTextView.getText().toString());
+    }
+
+    @UiThreadTest
+    public void testUndo_imeCancel() {
+        InputConnection input = initTextViewForSimulatedIme();
+        mTextView.setText("flower");
+
+        // Start typing a composition.
+        final String HA = "\u306F";  // HIRAGANA LETTER HA
+        setComposingTextInBatch(input, "h");
+        setComposingTextInBatch(input, HA);
+        setComposingTextInBatch(input, HA + "n");
+
+        // Cancel the composition.
+        setComposingTextInBatch(input, "");
+
+        // Undo and redo do nothing.
+        mTextView.onTextContextMenuItem(android.R.id.undo);
+        assertEquals("flower", mTextView.getText().toString());
+        mTextView.onTextContextMenuItem(android.R.id.redo);
+        assertEquals("flower", mTextView.getText().toString());
+    }
+
+    @UiThreadTest
+    public void testUndo_imeEmptyBatch() {
+        InputConnection input = initTextViewForSimulatedIme();
+        mTextView.setText("flower");
+
+        // Send an empty batch edit. This happens if the IME is hidden and shown.
+        input.beginBatchEdit();
+        input.endBatchEdit();
+
+        // Undo and redo do nothing.
+        mTextView.onTextContextMenuItem(android.R.id.undo);
+        assertEquals("flower", mTextView.getText().toString());
+        mTextView.onTextContextMenuItem(android.R.id.redo);
+        assertEquals("flower", mTextView.getText().toString());
+    }
+
+    public void testUndo_setText() {
+        initTextViewForTyping();
+
+        // Create two undo operations, an insert and a delete.
+        mInstrumentation.sendStringSync("xyz");
+        sendKeys(KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL);
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Calling setText() clears both undo operations, so undo doesn't happen.
+                mTextView.setText("Hello", BufferType.EDITABLE);
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("Hello", mTextView.getText().toString());
+
+                // Clearing text programmatically does not undo either.
+                mTextView.setText("", BufferType.EDITABLE);
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testRedo_setText() {
+        initTextViewForTyping();
+
+        // Type some text. This creates an undo entry.
+        mInstrumentation.sendStringSync("abc");
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Undo the typing to create a redo entry.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+
+                // Calling setText() clears the redo stack, so redo doesn't happen.
+                mTextView.setText("Hello", BufferType.EDITABLE);
+                mTextView.onTextContextMenuItem(android.R.id.redo);
+                assertEquals("Hello", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testUndo_directAppend() {
+        initTextViewForTyping();
+
+        // Type some text.
+        mInstrumentation.sendStringSync("abc");
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Programmatically append some text.
+                mTextView.append("def");
+                assertEquals("abcdef", mTextView.getText().toString());
+
+                // Undo removes the append as a separate step.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("abc", mTextView.getText().toString());
+
+                // Another undo removes the original typing.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testUndo_directInsert() {
+        initTextViewForTyping();
+
+        // Type some text.
+        mInstrumentation.sendStringSync("abc");
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Directly modify the underlying Editable to insert some text.
+                // NOTE: This is a violation of the API of getText() which specifies that the
+                // returned object should not be modified. However, some apps do this anyway and
+                // the framework needs to handle it.
+                Editable text = (Editable) mTextView.getText();
+                text.insert(0, "def");
+                assertEquals("defabc", mTextView.getText().toString());
+
+                // Undo removes the insert as a separate step.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("abc", mTextView.getText().toString());
+
+                // Another undo removes the original typing.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testUndo_noCursor() {
+        initTextViewForTyping();
+
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Append some text to create an undo operation. There is no cursor present.
+                mTextView.append("cat");
+
+                // Place the cursor at the end of the text so the undo will have to change it.
+                Selection.setSelection((Spannable) mTextView.getText(), 3);
+
+                // Undo the append. This should not crash, despite not having a valid cursor
+                // position in the undo operation.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testUndo_textWatcher() {
+        initTextViewForTyping();
+
+        // Add a TextWatcher that converts the text to spaces on each change.
+        mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher());
+
+        // Type some text.
+        mInstrumentation.sendStringSync("abc");
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // TextWatcher altered the text.
+                assertEquals("   ", mTextView.getText().toString());
+
+                // Undo reverses both changes in one step.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testUndo_textWatcherDirectAppend() {
+        initTextViewForTyping();
+
+        // Add a TextWatcher that converts the text to spaces on each change.
+        mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher());
+
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Programmatically append some text. The TextWatcher changes it to spaces.
+                mTextView.append("abc");
+                assertEquals("   ", mTextView.getText().toString());
+
+                // Undo reverses both changes in one step.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testUndo_shortcuts() {
+        initTextViewForTyping();
+
+        // Type some text.
+        mInstrumentation.sendStringSync("abc");
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Pressing Control-Z triggers undo.
+                KeyEvent control = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z, 0,
+                        KeyEvent.META_CTRL_LEFT_ON);
+                assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, control));
+                assertEquals("", mTextView.getText().toString());
+
+                // Pressing Control-Shift-Z triggers redo.
+                KeyEvent controlShift = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z,
+                        0, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_SHIFT_LEFT_ON);
+                assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, controlShift));
+                assertEquals("abc", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testUndo_saveInstanceState() {
+        initTextViewForTyping();
+
+        // Type some text to create an undo operation.
+        mInstrumentation.sendStringSync("abc");
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Parcel and unparcel the TextView.
+                Parcelable state = mTextView.onSaveInstanceState();
+                mTextView.onRestoreInstanceState(state);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        // Delete a character to create a new undo operation.
+        sendKeys(KeyEvent.KEYCODE_DEL);
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                assertEquals("ab", mTextView.getText().toString());
+
+                // Undo the delete.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("abc", mTextView.getText().toString());
+
+                // Undo the typing, which verifies that the original undo operation was parceled
+                // correctly.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+
+                // Parcel and unparcel the undo stack (which is empty but has been used and may
+                // contain other state).
+                Parcelable state = mTextView.onSaveInstanceState();
+                mTextView.onRestoreInstanceState(state);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testUndo_saveInstanceStateEmpty() {
+        initTextViewForTyping();
+
+        // Type and delete to create two new undo operations.
+        mInstrumentation.sendStringSync("a");
+        sendKeys(KeyEvent.KEYCODE_DEL);
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Empty the undo stack then parcel and unparcel the TextView. While the undo
+                // stack contains no operations it may contain other state.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                Parcelable state = mTextView.onSaveInstanceState();
+                mTextView.onRestoreInstanceState(state);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        // Create two more undo operations.
+        mInstrumentation.sendStringSync("b");
+        sendKeys(KeyEvent.KEYCODE_DEL);
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Verify undo still works.
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("b", mTextView.getText().toString());
+                mTextView.onTextContextMenuItem(android.R.id.undo);
+                assertEquals("", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testCopyAndPaste() {
+        initTextViewForTyping();
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                mTextView.setText("abcd", BufferType.EDITABLE);
+                mTextView.setSelected(true);
+
+                // Copy "bc".
+                Selection.setSelection((Spannable) mTextView.getText(), 1, 3);
+                mTextView.onTextContextMenuItem(android.R.id.copy);
+
+                // Paste "bc" between "b" and "c".
+                Selection.setSelection((Spannable) mTextView.getText(), 2, 2);
+                mTextView.onTextContextMenuItem(android.R.id.paste);
+                assertEquals("abbccd", mTextView.getText().toString());
+
+                // Select entire text and paste "bc".
+                Selection.selectAll((Spannable) mTextView.getText());
+                mTextView.onTextContextMenuItem(android.R.id.paste);
+                assertEquals("bc", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    public void testCutAndPaste() {
+        initTextViewForTyping();
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                mTextView.setText("abcd", BufferType.EDITABLE);
+                mTextView.setSelected(true);
+
+                // Cut "bc".
+                Selection.setSelection((Spannable) mTextView.getText(), 1, 3);
+                mTextView.onTextContextMenuItem(android.R.id.cut);
+                assertEquals("ad", mTextView.getText().toString());
+
+                // Cut "ad".
+                Selection.setSelection((Spannable) mTextView.getText(), 0, 2);
+                mTextView.onTextContextMenuItem(android.R.id.cut);
+                assertEquals("", mTextView.getText().toString());
+
+                // Paste "ad".
+                mTextView.onTextContextMenuItem(android.R.id.paste);
+                assertEquals("ad", mTextView.getText().toString());
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    private static boolean hasSpansAtMiddleOfText(final TextView textView, final Class<?> type) {
+        final Spannable spannable = (Spannable)textView.getText();
+        final int at = spannable.length() / 2;
+        return spannable.getSpans(at, at, type).length > 0;
+    }
+
+    public void testCutAndPaste_withAndWithoutStyle() {
+        initTextViewForTyping();
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                mTextView.setText("example", BufferType.EDITABLE);
+                mTextView.setSelected(true);
+
+                // Set URLSpan.
+                final Spannable spannable = (Spannable) mTextView.getText();
+                spannable.setSpan(new URLSpan("http://example.com"), 0, spannable.length(), 0);
+                assertTrue(hasSpansAtMiddleOfText(mTextView, URLSpan.class));
+
+                // Cut entire text.
+                Selection.selectAll((Spannable) mTextView.getText());
+                mTextView.onTextContextMenuItem(android.R.id.cut);
+                assertEquals("", mTextView.getText().toString());
+
+                // Paste without style.
+                mTextView.onTextContextMenuItem(android.R.id.pasteAsPlainText);
+                assertEquals("example", mTextView.getText().toString());
+                // Check that the text doesn't have URLSpan.
+                assertFalse(hasSpansAtMiddleOfText(mTextView, URLSpan.class));
+
+                // Paste with style.
+                Selection.selectAll((Spannable) mTextView.getText());
+                mTextView.onTextContextMenuItem(android.R.id.paste);
+                assertEquals("example", mTextView.getText().toString());
+                // Check that the text has URLSpan.
+                assertTrue(hasSpansAtMiddleOfText(mTextView, URLSpan.class));
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+
+    @UiThreadTest
+    public void testSaveInstanceState() {
+        TextView originalTextView = new TextView(mActivity);
+        final String text = "This is a string";
+        originalTextView.setText(text);
+        originalTextView.setFreezesText(true);  // needed to actually save state
+        Parcelable state = originalTextView.onSaveInstanceState();
+
+        TextView restoredTextView = new TextView(mActivity);
+        restoredTextView.onRestoreInstanceState(state);
+        assertEquals(text, restoredTextView.getText().toString());
+    }
+
+    @UiThreadTest
+    public void testSaveInstanceStateSelection() {
+        TextView originalTextView = new TextView(mActivity);
+        final String text = "This is a string";
+        final Spannable spannable = new SpannableString(text);
+        originalTextView.setText(spannable);
+        originalTextView.setTextIsSelectable(true);
+        Selection.setSelection((Spannable) originalTextView.getText(), 5, 7);
+        originalTextView.setFreezesText(true);  // needed to actually save state
+        Parcelable state = originalTextView.onSaveInstanceState();
+
+        TextView restoredTextView = new TextView(mActivity);
+        // Setting a selection only has an effect on a TextView when it is selectable.
+        restoredTextView.setTextIsSelectable(true);
+        restoredTextView.onRestoreInstanceState(state);
+        assertEquals(text, restoredTextView.getText().toString());
+        assertEquals(5, restoredTextView.getSelectionStart());
+        assertEquals(7, restoredTextView.getSelectionEnd());
+    }
+
     @UiThreadTest
     public void testSetText() {
         TextView tv = findTextView(R.id.textview_text);
@@ -1583,17 +2138,7 @@
     }
 
     public void testPressKey() {
-        final QwertyKeyListener qwertyKeyListener
-                = QwertyKeyListener.getInstance(false, Capitalize.NONE);
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                mTextView = findTextView(R.id.textview_text);
-                mTextView.setKeyListener(qwertyKeyListener);
-                mTextView.setText("", BufferType.EDITABLE);
-                mTextView.requestFocus();
-            }
-        });
-        mInstrumentation.waitForIdleSync();
+        initTextViewForTyping();
 
         mInstrumentation.sendStringSync("a");
         assertEquals("a", mTextView.getText().toString());
@@ -2107,6 +2652,88 @@
         assertTrue(mTextView.getHeight() <= maxLines * mTextView.getLineHeight());
     }
 
+    public int calculateTextWidth(String text) {
+        mTextView = findTextView(R.id.textview_text);
+
+        // Set the TextView width as the half of the whole text.
+        float[] widths = new float[text.length()];
+        mTextView.getPaint().getTextWidths(text, widths);
+        float textfieldWidth = 0.0f;
+        for (int i = 0; i < text.length(); ++i) {
+            textfieldWidth += widths[i];
+        }
+        return (int)textfieldWidth;
+
+    }
+
+    @UiThreadTest
+    public void testHyphenationNotHappen_frequencyNone() {
+        final int[] BREAK_STRATEGIES = {
+            Layout.BREAK_STRATEGY_SIMPLE, Layout.BREAK_STRATEGY_HIGH_QUALITY,
+            Layout.BREAK_STRATEGY_BALANCED };
+
+        mTextView = findTextView(R.id.textview_text);
+
+        for (int breakStrategy : BREAK_STRATEGIES) {
+            for (int charWidth = 10; charWidth < 120; charWidth += 5) {
+                // Change the text view's width to charWidth width.
+                mTextView.setWidth(calculateTextWidth(LONG_TEXT.substring(0, charWidth)));
+
+                mTextView.setText(LONG_TEXT);
+                mTextView.setBreakStrategy(breakStrategy);
+
+                mTextView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE);
+
+                mTextView.requestLayout();
+                mTextView.onPreDraw();  // For freezing the layout.
+                Layout layout = mTextView.getLayout();
+
+                final int lineCount = layout.getLineCount();
+                for (int line = 0; line < lineCount; ++line) {
+                    final int lineEnd = layout.getLineEnd(line);
+                    // In any width, any break strategy, hyphenation should not happen if
+                    // HYPHENATION_FREQUENCY_NONE is specified.
+                    assertTrue(lineEnd == LONG_TEXT.length() ||
+                            Character.isWhitespace(LONG_TEXT.charAt(lineEnd - 1)));
+                }
+            }
+        }
+    }
+
+    @UiThreadTest
+    public void testHyphenationNotHappen_breakStrategySimple() {
+        final int[] HYPHENATION_FREQUENCIES = {
+            Layout.HYPHENATION_FREQUENCY_NORMAL, Layout.HYPHENATION_FREQUENCY_FULL,
+            Layout.HYPHENATION_FREQUENCY_NONE };
+
+        mTextView = findTextView(R.id.textview_text);
+
+        for (int hyphenationFrequency: HYPHENATION_FREQUENCIES) {
+            for (int charWidth = 10; charWidth < 120; charWidth += 5) {
+                // Change the text view's width to charWidth width.
+                mTextView.setWidth(calculateTextWidth(LONG_TEXT.substring(0, charWidth)));
+
+                mTextView.setText(LONG_TEXT);
+                mTextView.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);
+
+                mTextView.setHyphenationFrequency(hyphenationFrequency);
+
+                mTextView.requestLayout();
+                mTextView.onPreDraw();  // For freezing the layout.
+                Layout layout = mTextView.getLayout();
+
+                final int lineCount = layout.getLineCount();
+                for (int line = 0; line < lineCount; ++line) {
+                    final int lineEnd = layout.getLineEnd(line);
+                    // In any width, any hyphenation frequency, hyphenation should not happen if
+                    // BREAK_STRATEGY_SIMPLE is specified.
+                    assertTrue(lineEnd == LONG_TEXT.length() ||
+                            Character.isWhitespace(LONG_TEXT.charAt(lineEnd - 1)));
+                }
+            }
+        }
+    }
+
     @UiThreadTest
     public void testSetMaxLinesException() {
         mTextView = new TextView(mActivity);
@@ -2324,7 +2951,7 @@
         assertEquals(40, mTextView.getPaddingBottom());
     }
 
-    public void testSetTextAppearance() {
+    public void testDeprecatedSetTextAppearance() {
         mTextView = new TextView(mActivity);
 
         mTextView.setTextAppearance(mActivity, R.style.TextAppearance_All);
@@ -2353,10 +2980,49 @@
         assertEquals(null, mTextView.getTypeface());
     }
 
+    public void testSetTextAppearance() {
+        mTextView = new TextView(mActivity);
+
+        mTextView.setTextAppearance(R.style.TextAppearance_All);
+        assertEquals(mActivity.getResources().getColor(R.drawable.black),
+                mTextView.getCurrentTextColor());
+        assertEquals(20f, mTextView.getTextSize(), 0.01f);
+        assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle());
+        assertEquals(mActivity.getResources().getColor(R.drawable.red),
+                mTextView.getCurrentHintTextColor());
+        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
+                mTextView.getLinkTextColors().getDefaultColor());
+
+        mTextView.setTextAppearance(R.style.TextAppearance_Colors);
+        assertEquals(mActivity.getResources().getColor(R.drawable.black),
+                mTextView.getCurrentTextColor());
+        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
+                mTextView.getCurrentHintTextColor());
+        assertEquals(mActivity.getResources().getColor(R.drawable.yellow),
+                mTextView.getLinkTextColors().getDefaultColor());
+
+        mTextView.setTextAppearance(R.style.TextAppearance_NotColors);
+        assertEquals(17f, mTextView.getTextSize(), 0.01f);
+        assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle());
+
+        mTextView.setTextAppearance(R.style.TextAppearance_Style);
+        assertEquals(null, mTextView.getTypeface());
+    }
+
     public void testOnPreDraw() {
         // Do not test. Implementation details.
     }
 
+    public void testAccessCompoundDrawableTint() {
+        mTextView = new TextView(mActivity);
+
+        ColorStateList colors = ColorStateList.valueOf(Color.RED);
+        mTextView.setCompoundDrawableTintList(colors);
+        mTextView.setCompoundDrawableTintMode(PorterDuff.Mode.XOR);
+        assertSame(colors, mTextView.getCompoundDrawableTintList());
+        assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode());
+    }
+
     public void testSetHorizontallyScrolling() {
         // make the text view has more than one line
         mTextView = findTextView(R.id.textview_text);
@@ -3005,6 +3671,39 @@
         assertTrue(mTextView.didTouchFocusSelect());
     }
 
+    public void testSelectAllJustAfterTap() {
+        // Prepare an EditText with focus.
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                mTextView = new EditText(mActivity);
+                mActivity.setContentView(mTextView);
+
+                assertFalse(mTextView.didTouchFocusSelect());
+                mTextView.setFocusable(true);
+                mTextView.requestFocus();
+                assertTrue(mTextView.didTouchFocusSelect());
+
+                mTextView.setText("Hello, World.", BufferType.SPANNABLE);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        // Tap the view to show InsertPointController.
+        TouchUtils.tapView(this, mTextView);
+
+        // Execute SelectAll context menu.
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                mTextView.onTextContextMenuItem(android.R.id.selectAll);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        // The selection must be whole of the text contents.
+        assertEquals(0, mTextView.getSelectionStart());
+        assertEquals(mTextView.length(), mTextView.getSelectionEnd());
+    }
+
     public void testExtractText() {
         mTextView = new TextView(mActivity);
 
@@ -3022,6 +3721,11 @@
 
         assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
                 outText.text.toString());
+
+        // Tests for invalid arguments.
+        assertFalse(mTextView.extractText(request, null));
+        assertFalse(mTextView.extractText(null, outText));
+        assertFalse(mTextView.extractText(null, null));
     }
 
     @UiThreadTest
@@ -3051,6 +3755,12 @@
 
         tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
         assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getRawTextDirection());
+
+        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
+        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getRawTextDirection());
+
+        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
+        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getRawTextDirection());
     }
 
     @UiThreadTest
@@ -3077,6 +3787,12 @@
 
         tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
         assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
+
+        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
+        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
+
+        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
+        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
     }
 
     @UiThreadTest
@@ -3105,6 +3821,12 @@
 
         tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
         assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
+
+        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
+        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
+
+        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
+        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
     }
 
     @UiThreadTest
@@ -3131,6 +3853,12 @@
 
         tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
         assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
+
+        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
+        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
+
+        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
+        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
     }
 
     @UiThreadTest
@@ -3160,6 +3888,12 @@
         tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
         assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
 
+        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
+        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
+
+        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
+        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
+
         // Force to RTL text direction on the layout
         ll.setTextDirection(View.TEXT_DIRECTION_RTL);
 
@@ -3180,6 +3914,12 @@
 
         tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
         assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
+
+        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
+        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
+
+        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
+        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
     }
 
     @UiThreadTest
@@ -3201,6 +3941,126 @@
     }
 
     @UiThreadTest
+    public void testTextDirectionFirstStrongLtr() {
+        {
+            // The first directional character is LTR, the paragraph direction is LTR.
+            LinearLayout ll = new LinearLayout(mActivity);
+
+            TextView tv = new TextView(mActivity);
+            tv.setText("this is a test");
+            ll.addView(tv);
+
+            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
+            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
+
+            tv.onPreDraw();  // For freezing layout.
+            Layout layout = tv.getLayout();
+            assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0));
+        }
+        {
+            // The first directional character is RTL, the paragraph direction is RTL.
+            LinearLayout ll = new LinearLayout(mActivity);
+
+            TextView tv = new TextView(mActivity);
+            tv.setText("\u05DD\u05DE"); // Hebrew
+            ll.addView(tv);
+
+            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
+            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
+
+            tv.onPreDraw();  // For freezing layout.
+            Layout layout = tv.getLayout();
+            assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0));
+        }
+        {
+            // The first directional character is not a strong directional character, the paragraph
+            // direction is LTR.
+            LinearLayout ll = new LinearLayout(mActivity);
+
+            TextView tv = new TextView(mActivity);
+            tv.setText("\uFFFD");  // REPLACEMENT CHARACTER. Neutral direction.
+            ll.addView(tv);
+
+            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
+            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
+
+            tv.onPreDraw();  // For freezing layout.
+            Layout layout = tv.getLayout();
+            assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0));
+        }
+    }
+
+    @UiThreadTest
+    public void testTextDirectionFirstStrongRtl() {
+        {
+            // The first directional character is LTR, the paragraph direction is LTR.
+            LinearLayout ll = new LinearLayout(mActivity);
+
+            TextView tv = new TextView(mActivity);
+            tv.setText("this is a test");
+            ll.addView(tv);
+
+            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
+            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
+
+            tv.onPreDraw();  // For freezing layout.
+            Layout layout = tv.getLayout();
+            assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0));
+        }
+        {
+            // The first directional character is RTL, the paragraph direction is RTL.
+            LinearLayout ll = new LinearLayout(mActivity);
+
+            TextView tv = new TextView(mActivity);
+            tv.setText("\u05DD\u05DE"); // Hebrew
+            ll.addView(tv);
+
+            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
+            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
+
+            tv.onPreDraw();  // For freezing layout.
+            Layout layout = tv.getLayout();
+            assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0));
+        }
+        {
+            // The first directional character is not a strong directional character, the paragraph
+            // direction is RTL.
+            LinearLayout ll = new LinearLayout(mActivity);
+
+            TextView tv = new TextView(mActivity);
+            tv.setText("\uFFFD");  // REPLACEMENT CHARACTER. Neutral direction.
+            ll.addView(tv);
+
+            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
+            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
+
+            tv.onPreDraw();  // For freezing layout.
+            Layout layout = tv.getLayout();
+            assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0));
+        }
+    }
+
+    public void testAllCapsLocalization() {
+        String testString = "abcdefghijklmnopqrstuvwxyz";
+
+        // The capitalized characters of "i" on Turkish and Azerbaijani are different from English.
+        Locale[] testLocales = {
+            new Locale("az", "AZ"),
+            new Locale("tr", "TR"),
+            new Locale("en", "US"),
+        };
+
+        TextView tv = new TextView(mActivity);
+        tv.setAllCaps(true);
+        for (Locale locale: testLocales) {
+            tv.setTextLocale(locale);
+            assertEquals("Locale: " + locale.getDisplayName(),
+                         testString.toUpperCase(locale),
+                         tv.getTransformationMethod().getTransformation(testString, tv).toString());
+        }
+    }
+
+    @UiThreadTest
     public void testTextAlignmentDefault() {
         TextView tv = new TextView(getActivity());
         assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment());
@@ -3553,6 +4413,182 @@
         assertNull(drawables[BOTTOM]);
     }
 
+    public void testSetGetBreakStrategy() {
+        TextView tv = new TextView(mActivity);
+
+        // The default value is from the theme, here the default is BREAK_STRATEGY_HIGH_QUALITY for
+        // TextView.
+        assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, tv.getBreakStrategy());
+
+        tv.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);
+        assertEquals(Layout.BREAK_STRATEGY_SIMPLE, tv.getBreakStrategy());
+
+        tv.setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY);
+        assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, tv.getBreakStrategy());
+
+        tv.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED);
+        assertEquals(Layout.BREAK_STRATEGY_BALANCED, tv.getBreakStrategy());
+
+        EditText et = new EditText(mActivity);
+
+        // The default value is from the theme, here the default is BREAK_STRATEGY_SIMPLE for
+        // EditText.
+        assertEquals(Layout.BREAK_STRATEGY_SIMPLE, et.getBreakStrategy());
+
+        et.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);
+        assertEquals(Layout.BREAK_STRATEGY_SIMPLE, et.getBreakStrategy());
+
+        et.setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY);
+        assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, et.getBreakStrategy());
+
+        et.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED);
+        assertEquals(Layout.BREAK_STRATEGY_BALANCED, et.getBreakStrategy());
+    }
+
+    public void testSetGetHyphenationFrequency() {
+        TextView tv = new TextView(mActivity);
+
+        assertEquals(Layout.HYPHENATION_FREQUENCY_NORMAL, tv.getHyphenationFrequency());
+
+        tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE);
+        assertEquals(Layout.HYPHENATION_FREQUENCY_NONE, tv.getHyphenationFrequency());
+
+        tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL);
+        assertEquals(Layout.HYPHENATION_FREQUENCY_NORMAL, tv.getHyphenationFrequency());
+
+        tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL);
+        assertEquals(Layout.HYPHENATION_FREQUENCY_FULL, tv.getHyphenationFrequency());
+    }
+
+    public void testSetAndGetCustomSelectionActionModeCallback() {
+        final String text = "abcde";
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                mTextView = new EditText(mActivity);
+                mActivity.setContentView(mTextView);
+                mTextView.setText(text, BufferType.SPANNABLE);
+                mTextView.setTextIsSelectable(true);
+                mTextView.requestFocus();
+                mTextView.setSelected(true);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        // Check default value.
+        assertNull(mTextView.getCustomSelectionActionModeCallback());
+
+        MockActionModeCallback callbackBlockActionMode = new MockActionModeCallback(false);
+        mTextView.setCustomSelectionActionModeCallback(callbackBlockActionMode);
+        assertEquals(callbackBlockActionMode,
+                mTextView.getCustomSelectionActionModeCallback());
+
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Set selection and try to start action mode.
+                final Bundle args = new Bundle();
+                args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0);
+                args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length());
+                mTextView.performAccessibilityAction(
+                        AccessibilityNodeInfo.ACTION_SET_SELECTION, args);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        assertEquals(1, callbackBlockActionMode.getCreateCount());
+
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Remove selection and stop action mode.
+                mTextView.onTextContextMenuItem(android.R.id.copy);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        // Action mode was blocked.
+        assertEquals(0, callbackBlockActionMode.getDestroyCount());
+
+        // Overwrite callback.
+        MockActionModeCallback callbackStartActionMode = new MockActionModeCallback(true);
+        mTextView.setCustomSelectionActionModeCallback(callbackStartActionMode);
+        assertEquals(callbackStartActionMode, mTextView.getCustomSelectionActionModeCallback());
+
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Set selection and try to start action mode.
+                final Bundle args = new Bundle();
+                args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0);
+                args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length());
+                mTextView.performAccessibilityAction(
+                        AccessibilityNodeInfo.ACTION_SET_SELECTION, args);
+
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        assertEquals(1, callbackStartActionMode.getCreateCount());
+
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                // Remove selection and stop action mode.
+                mTextView.onTextContextMenuItem(android.R.id.copy);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        // Action mode was started
+        assertEquals(1, callbackStartActionMode.getDestroyCount());
+    }
+
+    public void testSetAndGetCustomInseltionActionMode() {
+        initTextViewForTyping();
+        // Check default value.
+        assertNull(mTextView.getCustomInsertionActionModeCallback());
+
+        MockActionModeCallback callback = new MockActionModeCallback(false);
+        mTextView.setCustomInsertionActionModeCallback(callback);
+        assertEquals(callback, mTextView.getCustomInsertionActionModeCallback());
+        // TODO(Bug: 22033189): Tests the set callback is actually used.
+    }
+
+    private static class MockActionModeCallback implements ActionMode.Callback {
+        private int mCreateCount = 0;
+        private int mDestroyCount = 0;
+        private final boolean mAllowToStartActionMode;
+
+        public MockActionModeCallback(boolean allowToStartActionMode) {
+            mAllowToStartActionMode = allowToStartActionMode;
+        }
+
+        public int getCreateCount() {
+            return mCreateCount;
+        }
+
+        public int getDestroyCount() {
+            return mDestroyCount;
+        }
+
+        @Override
+        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+            return false;
+        }
+
+        @Override
+        public void onDestroyActionMode(ActionMode mode) {
+            mDestroyCount++;
+        }
+
+        @Override
+        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+            mCreateCount++;
+            return mAllowToStartActionMode;
+        }
+
+        @Override
+        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+            return false;
+        }
+    };
+
     private static class MockOnEditorActionListener implements OnEditorActionListener {
         private boolean isOnEditorActionCalled;
 
@@ -3925,4 +4961,35 @@
             }
         }
     }
+
+    /**
+     * A TextWatcher that converts the text to spaces whenever the text changes.
+     */
+    private static class ConvertToSpacesTextWatcher implements TextWatcher {
+        boolean mChangingText;
+
+        @Override
+        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+        }
+
+        @Override
+        public void onTextChanged(CharSequence s, int start, int before, int count) {
+        }
+
+        @Override
+        public void afterTextChanged(Editable s) {
+            // Avoid infinite recursion.
+            if (mChangingText) {
+                return;
+            }
+            mChangingText = true;
+            // Create a string of s.length() spaces.
+            StringBuilder builder = new StringBuilder(s.length());
+            for (int i = 0; i < s.length(); i++) {
+                builder.append(' ');
+            }
+            s.replace(0, s.length(), builder.toString());
+            mChangingText = false;
+        }
+    }
 }
diff --git a/tests/tests/widget/src/android/widget/cts/TextView_SaveStateTest.java b/tests/tests/widget/src/android/widget/cts/TextView_SaveStateTest.java
deleted file mode 100644
index 801a6fd..0000000
--- a/tests/tests/widget/src/android/widget/cts/TextView_SaveStateTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2008 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.widget.cts;
-
-
-import android.os.Parcel;
-import android.test.InstrumentationTestCase;
-import android.text.TextUtils;
-import android.view.AbsSavedState;
-import android.widget.TextView;
-
-/**
- * Test {@link TextView.SavedState}.
- */
-public class TextView_SaveStateTest extends InstrumentationTestCase {
-    public void testToString() {
-        Parcel source = creatTestParcel(0, 0, true, "This is content");
-        TextView.SavedState state = TextView.SavedState.CREATOR.createFromParcel(source);
-
-        assertNotNull(state.toString());
-
-        source = creatTestParcel(5, 10, false, "This is another content");
-        state = TextView.SavedState.CREATOR.createFromParcel(source);
-
-        assertNotNull(state.toString());
-    }
-
-    public void testWriteToParcel() {
-        Parcel source = creatTestParcel(0, 0, true, "This is content");
-        TextView.SavedState state = TextView.SavedState.CREATOR.createFromParcel(source);
-        assertNotNull(state);
-    }
-
-    /**
-     * Gets the parcel.
-     *
-     * @param start the start
-     * @param end the end
-     * @param frozenWithFocus the frozen with focus
-     * @param text the text
-     * @return the parcel
-     */
-    private Parcel creatTestParcel(int start, int end, boolean frozenWithFocus, String text) {
-        Parcel source = Parcel.obtain();
-
-        source.writeParcelable(AbsSavedState.EMPTY_STATE, 0);
-        source.writeInt(start);
-        source.writeInt(end);
-        source.writeInt(frozenWithFocus ? 1 : 0);
-        TextView textView = new TextView(getInstrumentation().getTargetContext());
-        textView.setText(text);
-        TextUtils.writeToParcel(textView.getText(), source, 0);
-        source.setDataPosition(0);
-        return source;
-    }
-}
diff --git a/tests/tests/widget/src/android/widget/cts/TimePickerTest.java b/tests/tests/widget/src/android/widget/cts/TimePickerTest.java
index fcf787a..1ce2844 100644
--- a/tests/tests/widget/src/android/widget/cts/TimePickerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TimePickerTest.java
@@ -167,6 +167,37 @@
         assertEquals(Integer.valueOf(23), mTimePicker.getCurrentHour());
     }
 
+    public void testAccessHour() {
+        mTimePicker = new TimePicker(mContext);
+
+        // AM/PM mode
+        mTimePicker.setIs24HourView(false);
+
+        mTimePicker.setHour(0);
+        assertEquals(0, mTimePicker.getHour());
+
+        mTimePicker.setHour(12);
+        assertEquals(12, mTimePicker.getHour());
+
+        mTimePicker.setHour(13);
+        assertEquals(13, mTimePicker.getHour());
+
+        mTimePicker.setHour(23);
+        assertEquals(23, mTimePicker.getHour());
+
+        // for 24 hour mode
+        mTimePicker.setIs24HourView(true);
+
+        mTimePicker.setHour(0);
+        assertEquals(0, mTimePicker.getHour());
+
+        mTimePicker.setHour(13);
+        assertEquals(13, mTimePicker.getHour());
+
+        mTimePicker.setHour(23);
+        assertEquals(23, mTimePicker.getHour());
+    }
+
     public void testAccessIs24HourView() {
         mTimePicker = new TimePicker(mContext);
         assertFalse(mTimePicker.is24HourView());
@@ -194,6 +225,22 @@
         assertEquals(Integer.valueOf(59), mTimePicker.getCurrentMinute());
     }
 
+    public void testAccessMinute() {
+        mTimePicker = new TimePicker(mContext);
+
+        mTimePicker.setMinute(0);
+        assertEquals(0, mTimePicker.getMinute());
+
+        mTimePicker.setMinute(12);
+        assertEquals(12, mTimePicker.getMinute());
+
+        mTimePicker.setMinute(33);
+        assertEquals(33, mTimePicker.getMinute());
+
+        mTimePicker.setMinute(59);
+        assertEquals(59, mTimePicker.getMinute());
+    }
+
     public void testGetBaseline() {
         mTimePicker = new TimePicker(mContext);
         assertEquals(-1, mTimePicker.getBaseline());
diff --git a/tests/tests/widget/src/android/widget/cts/TwoLineListItemTest.java b/tests/tests/widget/src/android/widget/cts/TwoLineListItemTest.java
index 0d5807f..18dd407 100644
--- a/tests/tests/widget/src/android/widget/cts/TwoLineListItemTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TwoLineListItemTest.java
@@ -91,9 +91,9 @@
     public void testOnFinishInflate() {
         MockTwoLineListItem twoLineListItem = new MockTwoLineListItem(mActivity);
         TextView text1 = new TextView(mActivity);
-        text1.setId(com.android.internal.R.id.text1);
+        text1.setId(android.R.id.text1);
         TextView text2 = new TextView(mActivity);
-        text2.setId(com.android.internal.R.id.text2);
+        text2.setId(android.R.id.text2);
         LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
                 LayoutParams.WRAP_CONTENT);
         twoLineListItem.addView(text1, params);
diff --git a/tests/tests/widget/src/android/widget/cts/util/ListScenario.java b/tests/tests/widget/src/android/widget/cts/util/ListScenario.java
index 11d670d..b61673c 100644
--- a/tests/tests/widget/src/android/widget/cts/util/ListScenario.java
+++ b/tests/tests/widget/src/android/widget/cts/util/ListScenario.java
@@ -17,6 +17,7 @@
 package android.widget.cts.util;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -35,8 +36,6 @@
 import android.widget.ListView;
 import android.widget.TextView;
 
-import com.google.android.collect.Maps;
-
 /**
  * Utility base class for creating various List scenarios.  Configurable by the number
  * of items, how tall each item should be (in relation to the screen height), and
@@ -52,7 +51,7 @@
 
     private int mStartingSelectionPosition;
     private double mItemScreenSizeFactor;
-    private Map<Integer, Double> mOverrideItemScreenSizeFactors = Maps.newHashMap();
+    private Map<Integer, Double> mOverrideItemScreenSizeFactors = new HashMap<>();
 
     private int mScreenHeight;
 
@@ -102,7 +101,7 @@
         private double mItemScreenSizeFactor = 1 / 5;
         private Double mFadingEdgeScreenSizeFactor = null;
 
-        private Map<Integer, Double> mOverrideItemScreenSizeFactors = Maps.newHashMap();
+        private Map<Integer, Double> mOverrideItemScreenSizeFactors = new HashMap<>();
 
         // separators
         private List<Integer> mUnselectableItems = new ArrayList<Integer>(8);
diff --git a/tests/tests/widget/src/android/widget/cts/util/XmlUtils.java b/tests/tests/widget/src/android/widget/cts/util/XmlUtils.java
new file mode 100644
index 0000000..1ff922f
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/util/XmlUtils.java
@@ -0,0 +1,1667 @@
+/*
+ * Copyright (C) 2006 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.widget.cts.util;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
+
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.CompressFormat;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.util.ArrayMap;
+import android.util.Base64;
+import android.util.Xml;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.ProtocolException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/** {@hide} */
+public class XmlUtils {
+
+    public static void skipCurrentTag(XmlPullParser parser)
+            throws XmlPullParserException, IOException {
+        int outerDepth = parser.getDepth();
+        int type;
+        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
+               && (type != XmlPullParser.END_TAG
+                       || parser.getDepth() > outerDepth)) {
+        }
+    }
+
+    public static final int
+    convertValueToList(CharSequence value, String[] options, int defaultValue)
+    {
+        if (null != value) {
+            for (int i = 0; i < options.length; i++) {
+                if (value.equals(options[i]))
+                    return i;
+            }
+        }
+
+        return defaultValue;
+    }
+
+    public static final boolean
+    convertValueToBoolean(CharSequence value, boolean defaultValue)
+    {
+        boolean result = false;
+
+        if (null == value)
+            return defaultValue;
+
+        if (value.equals("1")
+        ||  value.equals("true")
+        ||  value.equals("TRUE"))
+            result = true;
+
+        return result;
+    }
+
+    public static final int
+    convertValueToInt(CharSequence charSeq, int defaultValue)
+    {
+        if (null == charSeq)
+            return defaultValue;
+
+        String nm = charSeq.toString();
+
+        // XXX This code is copied from Integer.decode() so we don't
+        // have to instantiate an Integer!
+
+        int value;
+        int sign = 1;
+        int index = 0;
+        int len = nm.length();
+        int base = 10;
+
+        if ('-' == nm.charAt(0)) {
+            sign = -1;
+            index++;
+        }
+
+        if ('0' == nm.charAt(index)) {
+            //  Quick check for a zero by itself
+            if (index == (len - 1))
+                return 0;
+
+            char    c = nm.charAt(index + 1);
+
+            if ('x' == c || 'X' == c) {
+                index += 2;
+                base = 16;
+            } else {
+                index++;
+                base = 8;
+            }
+        }
+        else if ('#' == nm.charAt(index))
+        {
+            index++;
+            base = 16;
+        }
+
+        return Integer.parseInt(nm.substring(index), base) * sign;
+    }
+
+    public static int convertValueToUnsignedInt(String value, int defaultValue) {
+        if (null == value) {
+            return defaultValue;
+        }
+
+        return parseUnsignedIntAttribute(value);
+    }
+
+    public static int parseUnsignedIntAttribute(CharSequence charSeq) {
+        String  value = charSeq.toString();
+
+        long    bits;
+        int     index = 0;
+        int     len = value.length();
+        int     base = 10;
+
+        if ('0' == value.charAt(index)) {
+            //  Quick check for zero by itself
+            if (index == (len - 1))
+                return 0;
+
+            char    c = value.charAt(index + 1);
+
+            if ('x' == c || 'X' == c) {     //  check for hex
+                index += 2;
+                base = 16;
+            } else {                        //  check for octal
+                index++;
+                base = 8;
+            }
+        } else if ('#' == value.charAt(index)) {
+            index++;
+            base = 16;
+        }
+
+        return (int) Long.parseLong(value.substring(index), base);
+    }
+
+    /**
+     * Flatten a List into an output stream as XML.  The list can later be
+     * read back with readListXml().
+     *
+     * @param val The list to be flattened.
+     * @param out Where to write the XML data.
+     *
+     * @see #writeListXml(List, String, XmlSerializer)
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readListXml
+     */
+    public static final void writeListXml(List val, OutputStream out)
+    throws XmlPullParserException, IOException
+    {
+        XmlSerializer serializer = Xml.newSerializer();
+        serializer.setOutput(out, StandardCharsets.UTF_8.name());
+        serializer.startDocument(null, true);
+        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
+        writeListXml(val, null, serializer);
+        serializer.endDocument();
+    }
+
+    /**
+     * Flatten a Map into an XmlSerializer.  The map can later be read back
+     * with readThisMapXml().
+     *
+     * @param val The map to be flattened.
+     * @param name Name attribute to include with this list's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the map into.
+     *
+     * @see #writeListXml
+     * @see #writeValueXml
+     * @see #readMapXml
+     */
+    public static final void writeMapXml(Map val, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+        writeMapXml(val, name, out, null);
+    }
+
+    /**
+     * Flatten a Map into an XmlSerializer.  The map can later be read back
+     * with readThisMapXml().
+     *
+     * @param val The map to be flattened.
+     * @param name Name attribute to include with this list's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the map into.
+     * @param callback Method to call when an Object type is not recognized.
+     *
+     * @see #writeListXml
+     * @see #writeValueXml
+     * @see #readMapXml
+     *
+     * @hide
+     */
+    public static final void writeMapXml(Map val, String name, XmlSerializer out,
+            WriteMapCallback callback) throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "map");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        writeMapXml(val, out, callback);
+
+        out.endTag(null, "map");
+    }
+
+    /**
+     * Flatten a Map into an XmlSerializer.  The map can later be read back
+     * with readThisMapXml(). This method presumes that the start tag and
+     * name attribute have already been written and does not write an end tag.
+     *
+     * @param val The map to be flattened.
+     * @param out XmlSerializer to write the map into.
+     *
+     * @see #writeListXml
+     * @see #writeValueXml
+     * @see #readMapXml
+     *
+     * @hide
+     */
+    public static final void writeMapXml(Map val, XmlSerializer out,
+            WriteMapCallback callback) throws XmlPullParserException, IOException {
+        if (val == null) {
+            return;
+        }
+
+        Set s = val.entrySet();
+        Iterator i = s.iterator();
+
+        while (i.hasNext()) {
+            Map.Entry e = (Map.Entry)i.next();
+            writeValueXml(e.getValue(), (String)e.getKey(), out, callback);
+        }
+    }
+
+    /**
+     * Flatten a List into an XmlSerializer.  The list can later be read back
+     * with readThisListXml().
+     *
+     * @param val The list to be flattened.
+     * @param name Name attribute to include with this list's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the list into.
+     *
+     * @see #writeListXml(List, OutputStream)
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readListXml
+     */
+    public static final void writeListXml(List val, String name, XmlSerializer out)
+    throws XmlPullParserException, IOException
+    {
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "list");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        int N = val.size();
+        int i=0;
+        while (i < N) {
+            writeValueXml(val.get(i), null, out);
+            i++;
+        }
+
+        out.endTag(null, "list");
+    }
+
+    public static final void writeSetXml(Set val, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "set");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        for (Object v : val) {
+            writeValueXml(v, null, out);
+        }
+
+        out.endTag(null, "set");
+    }
+
+    /**
+     * Flatten a byte[] into an XmlSerializer.  The list can later be read back
+     * with readThisByteArrayXml().
+     *
+     * @param val The byte array to be flattened.
+     * @param name Name attribute to include with this array's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the array into.
+     *
+     * @see #writeMapXml
+     * @see #writeValueXml
+     */
+    public static final void writeByteArrayXml(byte[] val, String name,
+            XmlSerializer out)
+            throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "byte-array");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        final int N = val.length;
+        out.attribute(null, "num", Integer.toString(N));
+
+        StringBuilder sb = new StringBuilder(val.length*2);
+        for (int i=0; i<N; i++) {
+            int b = val[i];
+            int h = b>>4;
+            sb.append(h >= 10 ? ('a'+h-10) : ('0'+h));
+            h = b&0xff;
+            sb.append(h >= 10 ? ('a'+h-10) : ('0'+h));
+        }
+
+        out.text(sb.toString());
+
+        out.endTag(null, "byte-array");
+    }
+
+    /**
+     * Flatten an int[] into an XmlSerializer.  The list can later be read back
+     * with readThisIntArrayXml().
+     *
+     * @param val The int array to be flattened.
+     * @param name Name attribute to include with this array's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the array into.
+     *
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readThisIntArrayXml
+     */
+    public static final void writeIntArrayXml(int[] val, String name,
+            XmlSerializer out)
+            throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "int-array");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        final int N = val.length;
+        out.attribute(null, "num", Integer.toString(N));
+
+        for (int i=0; i<N; i++) {
+            out.startTag(null, "item");
+            out.attribute(null, "value", Integer.toString(val[i]));
+            out.endTag(null, "item");
+        }
+
+        out.endTag(null, "int-array");
+    }
+
+    /**
+     * Flatten a long[] into an XmlSerializer.  The list can later be read back
+     * with readThisLongArrayXml().
+     *
+     * @param val The long array to be flattened.
+     * @param name Name attribute to include with this array's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the array into.
+     *
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readThisIntArrayXml
+     */
+    public static final void writeLongArrayXml(long[] val, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "long-array");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        final int N = val.length;
+        out.attribute(null, "num", Integer.toString(N));
+
+        for (int i=0; i<N; i++) {
+            out.startTag(null, "item");
+            out.attribute(null, "value", Long.toString(val[i]));
+            out.endTag(null, "item");
+        }
+
+        out.endTag(null, "long-array");
+    }
+
+    /**
+     * Flatten a double[] into an XmlSerializer.  The list can later be read back
+     * with readThisDoubleArrayXml().
+     *
+     * @param val The double array to be flattened.
+     * @param name Name attribute to include with this array's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the array into.
+     *
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readThisIntArrayXml
+     */
+    public static final void writeDoubleArrayXml(double[] val, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "double-array");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        final int N = val.length;
+        out.attribute(null, "num", Integer.toString(N));
+
+        for (int i=0; i<N; i++) {
+            out.startTag(null, "item");
+            out.attribute(null, "value", Double.toString(val[i]));
+            out.endTag(null, "item");
+        }
+
+        out.endTag(null, "double-array");
+    }
+
+    /**
+     * Flatten a String[] into an XmlSerializer.  The list can later be read back
+     * with readThisStringArrayXml().
+     *
+     * @param val The String array to be flattened.
+     * @param name Name attribute to include with this array's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the array into.
+     *
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readThisIntArrayXml
+     */
+    public static final void writeStringArrayXml(String[] val, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "string-array");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        final int N = val.length;
+        out.attribute(null, "num", Integer.toString(N));
+
+        for (int i=0; i<N; i++) {
+            out.startTag(null, "item");
+            out.attribute(null, "value", val[i]);
+            out.endTag(null, "item");
+        }
+
+        out.endTag(null, "string-array");
+    }
+
+    /**
+     * Flatten a boolean[] into an XmlSerializer.  The list can later be read back
+     * with readThisBooleanArrayXml().
+     *
+     * @param val The boolean array to be flattened.
+     * @param name Name attribute to include with this array's tag, or null for
+     *             none.
+     * @param out XmlSerializer to write the array into.
+     *
+     * @see #writeMapXml
+     * @see #writeValueXml
+     * @see #readThisIntArrayXml
+     */
+    public static final void writeBooleanArrayXml(boolean[] val, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+
+        if (val == null) {
+            out.startTag(null, "null");
+            out.endTag(null, "null");
+            return;
+        }
+
+        out.startTag(null, "boolean-array");
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+
+        final int N = val.length;
+        out.attribute(null, "num", Integer.toString(N));
+
+        for (int i=0; i<N; i++) {
+            out.startTag(null, "item");
+            out.attribute(null, "value", Boolean.toString(val[i]));
+            out.endTag(null, "item");
+        }
+
+        out.endTag(null, "boolean-array");
+    }
+
+    /**
+     * Flatten an object's value into an XmlSerializer.  The value can later
+     * be read back with readThisValueXml().
+     *
+     * Currently supported value types are: null, String, Integer, Long,
+     * Float, Double Boolean, Map, List.
+     *
+     * @param v The object to be flattened.
+     * @param name Name attribute to include with this value's tag, or null
+     *             for none.
+     * @param out XmlSerializer to write the object into.
+     *
+     * @see #writeMapXml
+     * @see #writeListXml
+     * @see #readValueXml
+     */
+    public static final void writeValueXml(Object v, String name, XmlSerializer out)
+            throws XmlPullParserException, IOException {
+        writeValueXml(v, name, out, null);
+    }
+
+    /**
+     * Flatten an object's value into an XmlSerializer.  The value can later
+     * be read back with readThisValueXml().
+     *
+     * Currently supported value types are: null, String, Integer, Long,
+     * Float, Double Boolean, Map, List.
+     *
+     * @param v The object to be flattened.
+     * @param name Name attribute to include with this value's tag, or null
+     *             for none.
+     * @param out XmlSerializer to write the object into.
+     * @param callback Handler for Object types not recognized.
+     *
+     * @see #writeMapXml
+     * @see #writeListXml
+     * @see #readValueXml
+     */
+    private static final void writeValueXml(Object v, String name, XmlSerializer out,
+            WriteMapCallback callback)  throws XmlPullParserException, IOException {
+        String typeStr;
+        if (v == null) {
+            out.startTag(null, "null");
+            if (name != null) {
+                out.attribute(null, "name", name);
+            }
+            out.endTag(null, "null");
+            return;
+        } else if (v instanceof String) {
+            out.startTag(null, "string");
+            if (name != null) {
+                out.attribute(null, "name", name);
+            }
+            out.text(v.toString());
+            out.endTag(null, "string");
+            return;
+        } else if (v instanceof Integer) {
+            typeStr = "int";
+        } else if (v instanceof Long) {
+            typeStr = "long";
+        } else if (v instanceof Float) {
+            typeStr = "float";
+        } else if (v instanceof Double) {
+            typeStr = "double";
+        } else if (v instanceof Boolean) {
+            typeStr = "boolean";
+        } else if (v instanceof byte[]) {
+            writeByteArrayXml((byte[])v, name, out);
+            return;
+        } else if (v instanceof int[]) {
+            writeIntArrayXml((int[])v, name, out);
+            return;
+        } else if (v instanceof long[]) {
+            writeLongArrayXml((long[])v, name, out);
+            return;
+        } else if (v instanceof double[]) {
+            writeDoubleArrayXml((double[])v, name, out);
+            return;
+        } else if (v instanceof String[]) {
+            writeStringArrayXml((String[])v, name, out);
+            return;
+        } else if (v instanceof boolean[]) {
+            writeBooleanArrayXml((boolean[])v, name, out);
+            return;
+        } else if (v instanceof Map) {
+            writeMapXml((Map)v, name, out);
+            return;
+        } else if (v instanceof List) {
+            writeListXml((List) v, name, out);
+            return;
+        } else if (v instanceof Set) {
+            writeSetXml((Set) v, name, out);
+            return;
+        } else if (v instanceof CharSequence) {
+            // XXX This is to allow us to at least write something if
+            // we encounter styled text...  but it means we will drop all
+            // of the styling information. :(
+            out.startTag(null, "string");
+            if (name != null) {
+                out.attribute(null, "name", name);
+            }
+            out.text(v.toString());
+            out.endTag(null, "string");
+            return;
+        } else if (callback != null) {
+            callback.writeUnknownObject(v, name, out);
+            return;
+        } else {
+            throw new RuntimeException("writeValueXml: unable to write value " + v);
+        }
+
+        out.startTag(null, typeStr);
+        if (name != null) {
+            out.attribute(null, "name", name);
+        }
+        out.attribute(null, "value", v.toString());
+        out.endTag(null, typeStr);
+    }
+
+    /**
+     * Read a HashMap from an InputStream containing XML.  The stream can
+     * previously have been written by writeMapXml().
+     *
+     * @param in The InputStream from which to read.
+     *
+     * @return HashMap The resulting map.
+     *
+     * @see #readListXml
+     * @see #readValueXml
+     * @see #readThisMapXml
+     * #see #writeMapXml
+     */
+    @SuppressWarnings("unchecked")
+    public static final HashMap<String, ?> readMapXml(InputStream in)
+    throws XmlPullParserException, IOException
+    {
+        XmlPullParser   parser = Xml.newPullParser();
+        parser.setInput(in, StandardCharsets.UTF_8.name());
+        return (HashMap<String, ?>) readValueXml(parser, new String[1]);
+    }
+
+    /**
+     * Read an ArrayList from an InputStream containing XML.  The stream can
+     * previously have been written by writeListXml().
+     *
+     * @param in The InputStream from which to read.
+     *
+     * @return ArrayList The resulting list.
+     *
+     * @see #readMapXml
+     * @see #readValueXml
+     * @see #readThisListXml
+     * @see #writeListXml
+     */
+    public static final ArrayList readListXml(InputStream in)
+    throws XmlPullParserException, IOException
+    {
+        XmlPullParser   parser = Xml.newPullParser();
+        parser.setInput(in, StandardCharsets.UTF_8.name());
+        return (ArrayList)readValueXml(parser, new String[1]);
+    }
+
+
+    /**
+     * Read a HashSet from an InputStream containing XML. The stream can
+     * previously have been written by writeSetXml().
+     *
+     * @param in The InputStream from which to read.
+     *
+     * @return HashSet The resulting set.
+     *
+     * @throws XmlPullParserException
+     * @throws IOException
+     *
+     * @see #readValueXml
+     * @see #readThisSetXml
+     * @see #writeSetXml
+     */
+    public static final HashSet readSetXml(InputStream in)
+            throws XmlPullParserException, IOException {
+        XmlPullParser parser = Xml.newPullParser();
+        parser.setInput(in, null);
+        return (HashSet) readValueXml(parser, new String[1]);
+    }
+
+    /**
+     * Read a HashMap object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeMapXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the map.
+     *
+     * @param parser The XmlPullParser from which to read the map data.
+     * @param endTag Name of the tag that will end the map, usually "map".
+     * @param name An array of one string, used to return the name attribute
+     *             of the map's tag.
+     *
+     * @return HashMap The newly generated map.
+     *
+     * @see #readMapXml
+     */
+    public static final HashMap<String, ?> readThisMapXml(XmlPullParser parser, String endTag,
+            String[] name) throws XmlPullParserException, IOException {
+        return readThisMapXml(parser, endTag, name, null);
+    }
+
+    /**
+     * Read a HashMap object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeMapXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the map.
+     *
+     * @param parser The XmlPullParser from which to read the map data.
+     * @param endTag Name of the tag that will end the map, usually "map".
+     * @param name An array of one string, used to return the name attribute
+     *             of the map's tag.
+     *
+     * @return HashMap The newly generated map.
+     *
+     * @see #readMapXml
+     * @hide
+     */
+    public static final HashMap<String, ?> readThisMapXml(XmlPullParser parser, String endTag,
+            String[] name, ReadMapCallback callback)
+            throws XmlPullParserException, IOException
+    {
+        HashMap<String, Object> map = new HashMap<String, Object>();
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                Object val = readThisValueXml(parser, name, callback, false);
+                map.put(name[0], val);
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return map;
+                }
+                throw new XmlPullParserException(
+                    "Expected " + endTag + " end tag at: " + parser.getName());
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException(
+            "Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Like {@link #readThisMapXml}, but returns an ArrayMap instead of HashMap.
+     * @hide
+     */
+    public static final ArrayMap<String, ?> readThisArrayMapXml(XmlPullParser parser, String endTag,
+            String[] name, ReadMapCallback callback)
+            throws XmlPullParserException, IOException
+    {
+        ArrayMap<String, Object> map = new ArrayMap<>();
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                Object val = readThisValueXml(parser, name, callback, true);
+                map.put(name[0], val);
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return map;
+                }
+                throw new XmlPullParserException(
+                    "Expected " + endTag + " end tag at: " + parser.getName());
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException(
+            "Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read an ArrayList object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeListXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "list".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return HashMap The newly generated list.
+     *
+     * @see #readListXml
+     */
+    public static final ArrayList readThisListXml(XmlPullParser parser, String endTag,
+            String[] name) throws XmlPullParserException, IOException {
+        return readThisListXml(parser, endTag, name, null, false);
+    }
+
+    /**
+     * Read an ArrayList object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeListXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "list".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return HashMap The newly generated list.
+     *
+     * @see #readListXml
+     */
+    private static final ArrayList readThisListXml(XmlPullParser parser, String endTag,
+            String[] name, ReadMapCallback callback, boolean arrayMap)
+            throws XmlPullParserException, IOException {
+        ArrayList list = new ArrayList();
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                Object val = readThisValueXml(parser, name, callback, arrayMap);
+                list.add(val);
+                //System.out.println("Adding to list: " + val);
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return list;
+                }
+                throw new XmlPullParserException(
+                    "Expected " + endTag + " end tag at: " + parser.getName());
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException(
+            "Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read a HashSet object from an XmlPullParser. The XML data could previously
+     * have been generated by writeSetXml(). The XmlPullParser must be positioned
+     * <em>after</em> the tag that begins the set.
+     *
+     * @param parser The XmlPullParser from which to read the set data.
+     * @param endTag Name of the tag that will end the set, usually "set".
+     * @param name An array of one string, used to return the name attribute
+     *             of the set's tag.
+     *
+     * @return HashSet The newly generated set.
+     *
+     * @throws XmlPullParserException
+     * @throws IOException
+     *
+     * @see #readSetXml
+     */
+    public static final HashSet readThisSetXml(XmlPullParser parser, String endTag, String[] name)
+            throws XmlPullParserException, IOException {
+        return readThisSetXml(parser, endTag, name, null, false);
+    }
+
+    /**
+     * Read a HashSet object from an XmlPullParser. The XML data could previously
+     * have been generated by writeSetXml(). The XmlPullParser must be positioned
+     * <em>after</em> the tag that begins the set.
+     *
+     * @param parser The XmlPullParser from which to read the set data.
+     * @param endTag Name of the tag that will end the set, usually "set".
+     * @param name An array of one string, used to return the name attribute
+     *             of the set's tag.
+     *
+     * @return HashSet The newly generated set.
+     *
+     * @throws XmlPullParserException
+     * @throws IOException
+     *
+     * @see #readSetXml
+     * @hide
+     */
+    private static final HashSet readThisSetXml(XmlPullParser parser, String endTag, String[] name,
+            ReadMapCallback callback, boolean arrayMap)
+            throws XmlPullParserException, IOException {
+        HashSet set = new HashSet();
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                Object val = readThisValueXml(parser, name, callback, arrayMap);
+                set.add(val);
+                //System.out.println("Adding to set: " + val);
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return set;
+                }
+                throw new XmlPullParserException(
+                        "Expected " + endTag + " end tag at: " + parser.getName());
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException(
+                "Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read an int[] object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeIntArrayXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "list".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return Returns a newly generated int[].
+     *
+     * @see #readListXml
+     */
+    public static final int[] readThisIntArrayXml(XmlPullParser parser,
+            String endTag, String[] name)
+            throws XmlPullParserException, IOException {
+
+        int num;
+        try {
+            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
+        } catch (NullPointerException e) {
+            throw new XmlPullParserException(
+                    "Need num attribute in byte-array");
+        } catch (NumberFormatException e) {
+            throw new XmlPullParserException(
+                    "Not a number in num attribute in byte-array");
+        }
+        parser.next();
+
+        int[] array = new int[num];
+        int i = 0;
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                if (parser.getName().equals("item")) {
+                    try {
+                        array[i] = Integer.parseInt(
+                                parser.getAttributeValue(null, "value"));
+                    } catch (NullPointerException e) {
+                        throw new XmlPullParserException(
+                                "Need value attribute in item");
+                    } catch (NumberFormatException e) {
+                        throw new XmlPullParserException(
+                                "Not a number in value attribute in item");
+                    }
+                } else {
+                    throw new XmlPullParserException(
+                            "Expected item tag at: " + parser.getName());
+                }
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return array;
+                } else if (parser.getName().equals("item")) {
+                    i++;
+                } else {
+                    throw new XmlPullParserException(
+                        "Expected " + endTag + " end tag at: "
+                        + parser.getName());
+                }
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException(
+            "Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read a long[] object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeLongArrayXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "list".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return Returns a newly generated long[].
+     *
+     * @see #readListXml
+     */
+    public static final long[] readThisLongArrayXml(XmlPullParser parser,
+            String endTag, String[] name)
+            throws XmlPullParserException, IOException {
+
+        int num;
+        try {
+            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
+        } catch (NullPointerException e) {
+            throw new XmlPullParserException("Need num attribute in long-array");
+        } catch (NumberFormatException e) {
+            throw new XmlPullParserException("Not a number in num attribute in long-array");
+        }
+        parser.next();
+
+        long[] array = new long[num];
+        int i = 0;
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                if (parser.getName().equals("item")) {
+                    try {
+                        array[i] = Long.parseLong(parser.getAttributeValue(null, "value"));
+                    } catch (NullPointerException e) {
+                        throw new XmlPullParserException("Need value attribute in item");
+                    } catch (NumberFormatException e) {
+                        throw new XmlPullParserException("Not a number in value attribute in item");
+                    }
+                } else {
+                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
+                }
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return array;
+                } else if (parser.getName().equals("item")) {
+                    i++;
+                } else {
+                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
+                            parser.getName());
+                }
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read a double[] object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeDoubleArrayXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "double-array".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return Returns a newly generated double[].
+     *
+     * @see #readListXml
+     */
+    public static final double[] readThisDoubleArrayXml(XmlPullParser parser, String endTag,
+            String[] name) throws XmlPullParserException, IOException {
+
+        int num;
+        try {
+            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
+        } catch (NullPointerException e) {
+            throw new XmlPullParserException("Need num attribute in double-array");
+        } catch (NumberFormatException e) {
+            throw new XmlPullParserException("Not a number in num attribute in double-array");
+        }
+        parser.next();
+
+        double[] array = new double[num];
+        int i = 0;
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                if (parser.getName().equals("item")) {
+                    try {
+                        array[i] = Double.parseDouble(parser.getAttributeValue(null, "value"));
+                    } catch (NullPointerException e) {
+                        throw new XmlPullParserException("Need value attribute in item");
+                    } catch (NumberFormatException e) {
+                        throw new XmlPullParserException("Not a number in value attribute in item");
+                    }
+                } else {
+                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
+                }
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return array;
+                } else if (parser.getName().equals("item")) {
+                    i++;
+                } else {
+                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
+                            parser.getName());
+                }
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read a String[] object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeStringArrayXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "string-array".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return Returns a newly generated String[].
+     *
+     * @see #readListXml
+     */
+    public static final String[] readThisStringArrayXml(XmlPullParser parser, String endTag,
+            String[] name) throws XmlPullParserException, IOException {
+
+        int num;
+        try {
+            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
+        } catch (NullPointerException e) {
+            throw new XmlPullParserException("Need num attribute in string-array");
+        } catch (NumberFormatException e) {
+            throw new XmlPullParserException("Not a number in num attribute in string-array");
+        }
+        parser.next();
+
+        String[] array = new String[num];
+        int i = 0;
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                if (parser.getName().equals("item")) {
+                    try {
+                        array[i] = parser.getAttributeValue(null, "value");
+                    } catch (NullPointerException e) {
+                        throw new XmlPullParserException("Need value attribute in item");
+                    } catch (NumberFormatException e) {
+                        throw new XmlPullParserException("Not a number in value attribute in item");
+                    }
+                } else {
+                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
+                }
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return array;
+                } else if (parser.getName().equals("item")) {
+                    i++;
+                } else {
+                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
+                            parser.getName());
+                }
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read a boolean[] object from an XmlPullParser.  The XML data could
+     * previously have been generated by writeBooleanArrayXml().  The XmlPullParser
+     * must be positioned <em>after</em> the tag that begins the list.
+     *
+     * @param parser The XmlPullParser from which to read the list data.
+     * @param endTag Name of the tag that will end the list, usually "string-array".
+     * @param name An array of one string, used to return the name attribute
+     *             of the list's tag.
+     *
+     * @return Returns a newly generated boolean[].
+     *
+     * @see #readListXml
+     */
+    public static final boolean[] readThisBooleanArrayXml(XmlPullParser parser, String endTag,
+            String[] name) throws XmlPullParserException, IOException {
+
+        int num;
+        try {
+            num = Integer.parseInt(parser.getAttributeValue(null, "num"));
+        } catch (NullPointerException e) {
+            throw new XmlPullParserException("Need num attribute in string-array");
+        } catch (NumberFormatException e) {
+            throw new XmlPullParserException("Not a number in num attribute in string-array");
+        }
+        parser.next();
+
+        boolean[] array = new boolean[num];
+        int i = 0;
+
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                if (parser.getName().equals("item")) {
+                    try {
+                        array[i] = Boolean.valueOf(parser.getAttributeValue(null, "value"));
+                    } catch (NullPointerException e) {
+                        throw new XmlPullParserException("Need value attribute in item");
+                    } catch (NumberFormatException e) {
+                        throw new XmlPullParserException("Not a number in value attribute in item");
+                    }
+                } else {
+                    throw new XmlPullParserException("Expected item tag at: " + parser.getName());
+                }
+            } else if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(endTag)) {
+                    return array;
+                } else if (parser.getName().equals("item")) {
+                    i++;
+                } else {
+                    throw new XmlPullParserException("Expected " + endTag + " end tag at: " +
+                            parser.getName());
+                }
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException("Document ended before " + endTag + " end tag");
+    }
+
+    /**
+     * Read a flattened object from an XmlPullParser.  The XML data could
+     * previously have been written with writeMapXml(), writeListXml(), or
+     * writeValueXml().  The XmlPullParser must be positioned <em>at</em> the
+     * tag that defines the value.
+     *
+     * @param parser The XmlPullParser from which to read the object.
+     * @param name An array of one string, used to return the name attribute
+     *             of the value's tag.
+     *
+     * @return Object The newly generated value object.
+     *
+     * @see #readMapXml
+     * @see #readListXml
+     * @see #writeValueXml
+     */
+    public static final Object readValueXml(XmlPullParser parser, String[] name)
+    throws XmlPullParserException, IOException
+    {
+        int eventType = parser.getEventType();
+        do {
+            if (eventType == parser.START_TAG) {
+                return readThisValueXml(parser, name, null, false);
+            } else if (eventType == parser.END_TAG) {
+                throw new XmlPullParserException(
+                    "Unexpected end tag at: " + parser.getName());
+            } else if (eventType == parser.TEXT) {
+                throw new XmlPullParserException(
+                    "Unexpected text: " + parser.getText());
+            }
+            eventType = parser.next();
+        } while (eventType != parser.END_DOCUMENT);
+
+        throw new XmlPullParserException(
+            "Unexpected end of document");
+    }
+
+    private static final Object readThisValueXml(XmlPullParser parser, String[] name,
+            ReadMapCallback callback, boolean arrayMap)
+            throws XmlPullParserException, IOException {
+        final String valueName = parser.getAttributeValue(null, "name");
+        final String tagName = parser.getName();
+
+        //System.out.println("Reading this value tag: " + tagName + ", name=" + valueName);
+
+        Object res;
+
+        if (tagName.equals("null")) {
+            res = null;
+        } else if (tagName.equals("string")) {
+            String value = "";
+            int eventType;
+            while ((eventType = parser.next()) != parser.END_DOCUMENT) {
+                if (eventType == parser.END_TAG) {
+                    if (parser.getName().equals("string")) {
+                        name[0] = valueName;
+                        //System.out.println("Returning value for " + valueName + ": " + value);
+                        return value;
+                    }
+                    throw new XmlPullParserException(
+                        "Unexpected end tag in <string>: " + parser.getName());
+                } else if (eventType == parser.TEXT) {
+                    value += parser.getText();
+                } else if (eventType == parser.START_TAG) {
+                    throw new XmlPullParserException(
+                        "Unexpected start tag in <string>: " + parser.getName());
+                }
+            }
+            throw new XmlPullParserException(
+                "Unexpected end of document in <string>");
+        } else if ((res = readThisPrimitiveValueXml(parser, tagName)) != null) {
+            // all work already done by readThisPrimitiveValueXml
+        } else if (tagName.equals("int-array")) {
+            res = readThisIntArrayXml(parser, "int-array", name);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("long-array")) {
+            res = readThisLongArrayXml(parser, "long-array", name);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("double-array")) {
+            res = readThisDoubleArrayXml(parser, "double-array", name);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("string-array")) {
+            res = readThisStringArrayXml(parser, "string-array", name);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("boolean-array")) {
+            res = readThisBooleanArrayXml(parser, "boolean-array", name);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("map")) {
+            parser.next();
+            res = arrayMap
+                    ? readThisArrayMapXml(parser, "map", name, callback)
+                    : readThisMapXml(parser, "map", name, callback);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("list")) {
+            parser.next();
+            res = readThisListXml(parser, "list", name, callback, arrayMap);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (tagName.equals("set")) {
+            parser.next();
+            res = readThisSetXml(parser, "set", name, callback, arrayMap);
+            name[0] = valueName;
+            //System.out.println("Returning value for " + valueName + ": " + res);
+            return res;
+        } else if (callback != null) {
+            res = callback.readThisUnknownObjectXml(parser, tagName);
+            name[0] = valueName;
+            return res;
+        } else {
+            throw new XmlPullParserException("Unknown tag: " + tagName);
+        }
+
+        // Skip through to end tag.
+        int eventType;
+        while ((eventType = parser.next()) != parser.END_DOCUMENT) {
+            if (eventType == parser.END_TAG) {
+                if (parser.getName().equals(tagName)) {
+                    name[0] = valueName;
+                    //System.out.println("Returning value for " + valueName + ": " + res);
+                    return res;
+                }
+                throw new XmlPullParserException(
+                    "Unexpected end tag in <" + tagName + ">: " + parser.getName());
+            } else if (eventType == parser.TEXT) {
+                throw new XmlPullParserException(
+                "Unexpected text in <" + tagName + ">: " + parser.getName());
+            } else if (eventType == parser.START_TAG) {
+                throw new XmlPullParserException(
+                    "Unexpected start tag in <" + tagName + ">: " + parser.getName());
+            }
+        }
+        throw new XmlPullParserException(
+            "Unexpected end of document in <" + tagName + ">");
+    }
+
+    private static final Object readThisPrimitiveValueXml(XmlPullParser parser, String tagName)
+    throws XmlPullParserException, IOException
+    {
+        try {
+            if (tagName.equals("int")) {
+                return Integer.parseInt(parser.getAttributeValue(null, "value"));
+            } else if (tagName.equals("long")) {
+                return Long.valueOf(parser.getAttributeValue(null, "value"));
+            } else if (tagName.equals("float")) {
+                return new Float(parser.getAttributeValue(null, "value"));
+            } else if (tagName.equals("double")) {
+                return new Double(parser.getAttributeValue(null, "value"));
+            } else if (tagName.equals("boolean")) {
+                return Boolean.valueOf(parser.getAttributeValue(null, "value"));
+            } else {
+                return null;
+            }
+        } catch (NullPointerException e) {
+            throw new XmlPullParserException("Need value attribute in <" + tagName + ">");
+        } catch (NumberFormatException e) {
+            throw new XmlPullParserException(
+                    "Not a number in value attribute in <" + tagName + ">");
+        }
+    }
+
+    public static final void beginDocument(XmlPullParser parser, String firstElementName) throws XmlPullParserException, IOException
+    {
+        int type;
+        while ((type=parser.next()) != parser.START_TAG
+                   && type != parser.END_DOCUMENT) {
+            ;
+        }
+
+        if (type != parser.START_TAG) {
+            throw new XmlPullParserException("No start tag found");
+        }
+
+        if (!parser.getName().equals(firstElementName)) {
+            throw new XmlPullParserException("Unexpected start tag: found " + parser.getName() +
+                    ", expected " + firstElementName);
+        }
+    }
+
+    public static final void nextElement(XmlPullParser parser) throws XmlPullParserException, IOException
+    {
+        int type;
+        while ((type=parser.next()) != parser.START_TAG
+                   && type != parser.END_DOCUMENT) {
+            ;
+        }
+    }
+
+    public static boolean nextElementWithin(XmlPullParser parser, int outerDepth)
+            throws IOException, XmlPullParserException {
+        for (;;) {
+            int type = parser.next();
+            if (type == XmlPullParser.END_DOCUMENT
+                    || (type == XmlPullParser.END_TAG && parser.getDepth() == outerDepth)) {
+                return false;
+            }
+            if (type == XmlPullParser.START_TAG
+                    && parser.getDepth() == outerDepth + 1) {
+                return true;
+            }
+        }
+    }
+
+    public static int readIntAttribute(XmlPullParser in, String name, int defaultValue) {
+        final String value = in.getAttributeValue(null, name);
+        try {
+            return Integer.parseInt(value);
+        } catch (NumberFormatException e) {
+            return defaultValue;
+        }
+    }
+
+    public static int readIntAttribute(XmlPullParser in, String name) throws IOException {
+        final String value = in.getAttributeValue(null, name);
+        try {
+            return Integer.parseInt(value);
+        } catch (NumberFormatException e) {
+            throw new ProtocolException("problem parsing " + name + "=" + value + " as int");
+        }
+    }
+
+    public static void writeIntAttribute(XmlSerializer out, String name, int value)
+            throws IOException {
+        out.attribute(null, name, Integer.toString(value));
+    }
+
+    public static long readLongAttribute(XmlPullParser in, String name, long defaultValue) {
+        final String value = in.getAttributeValue(null, name);
+        try {
+            return Long.parseLong(value);
+        } catch (NumberFormatException e) {
+            return defaultValue;
+        }
+    }
+
+    public static long readLongAttribute(XmlPullParser in, String name) throws IOException {
+        final String value = in.getAttributeValue(null, name);
+        try {
+            return Long.parseLong(value);
+        } catch (NumberFormatException e) {
+            throw new ProtocolException("problem parsing " + name + "=" + value + " as long");
+        }
+    }
+
+    public static void writeLongAttribute(XmlSerializer out, String name, long value)
+            throws IOException {
+        out.attribute(null, name, Long.toString(value));
+    }
+
+    public static float readFloatAttribute(XmlPullParser in, String name) throws IOException {
+        final String value = in.getAttributeValue(null, name);
+        try {
+            return Float.parseFloat(value);
+        } catch (NumberFormatException e) {
+            throw new ProtocolException("problem parsing " + name + "=" + value + " as long");
+        }
+    }
+
+    public static void writeFloatAttribute(XmlSerializer out, String name, float value)
+            throws IOException {
+        out.attribute(null, name, Float.toString(value));
+    }
+
+    public static boolean readBooleanAttribute(XmlPullParser in, String name) {
+        final String value = in.getAttributeValue(null, name);
+        return Boolean.parseBoolean(value);
+    }
+
+    public static boolean readBooleanAttribute(XmlPullParser in, String name,
+            boolean defaultValue) {
+        final String value = in.getAttributeValue(null, name);
+        if (value == null) {
+            return defaultValue;
+        } else {
+            return Boolean.parseBoolean(value);
+        }
+    }
+
+    public static void writeBooleanAttribute(XmlSerializer out, String name, boolean value)
+            throws IOException {
+        out.attribute(null, name, Boolean.toString(value));
+    }
+
+    public static Uri readUriAttribute(XmlPullParser in, String name) {
+        final String value = in.getAttributeValue(null, name);
+        return (value != null) ? Uri.parse(value) : null;
+    }
+
+    public static void writeUriAttribute(XmlSerializer out, String name, Uri value)
+            throws IOException {
+        if (value != null) {
+            out.attribute(null, name, value.toString());
+        }
+    }
+
+    public static String readStringAttribute(XmlPullParser in, String name) {
+        return in.getAttributeValue(null, name);
+    }
+
+    public static void writeStringAttribute(XmlSerializer out, String name, String value)
+            throws IOException {
+        if (value != null) {
+            out.attribute(null, name, value);
+        }
+    }
+
+    public static byte[] readByteArrayAttribute(XmlPullParser in, String name) {
+        final String value = in.getAttributeValue(null, name);
+        if (value != null) {
+            return Base64.decode(value, Base64.DEFAULT);
+        } else {
+            return null;
+        }
+    }
+
+    public static void writeByteArrayAttribute(XmlSerializer out, String name, byte[] value)
+            throws IOException {
+        if (value != null) {
+            out.attribute(null, name, Base64.encodeToString(value, Base64.DEFAULT));
+        }
+    }
+
+    public static Bitmap readBitmapAttribute(XmlPullParser in, String name) {
+        final byte[] value = readByteArrayAttribute(in, name);
+        if (value != null) {
+            return BitmapFactory.decodeByteArray(value, 0, value.length);
+        } else {
+            return null;
+        }
+    }
+
+    @Deprecated
+    public static void writeBitmapAttribute(XmlSerializer out, String name, Bitmap value)
+            throws IOException {
+        if (value != null) {
+            final ByteArrayOutputStream os = new ByteArrayOutputStream();
+            value.compress(CompressFormat.PNG, 90, os);
+            writeByteArrayAttribute(out, name, os.toByteArray());
+        }
+    }
+
+    /** @hide */
+    public interface WriteMapCallback {
+        /**
+         * Called from writeMapXml when an Object type is not recognized. The implementer
+         * must write out the entire element including start and end tags.
+         *
+         * @param v The object to be written out
+         * @param name The mapping key for v. Must be written into the "name" attribute of the
+         *             start tag.
+         * @param out The XML output stream.
+         * @throws XmlPullParserException on unrecognized Object type.
+         * @throws IOException on XmlSerializer serialization errors.
+         * @hide
+         */
+         public void writeUnknownObject(Object v, String name, XmlSerializer out)
+                 throws XmlPullParserException, IOException;
+    }
+
+    /** @hide */
+    public interface ReadMapCallback {
+        /**
+         * Called from readThisMapXml when a START_TAG is not recognized. The input stream
+         * is positioned within the start tag so that attributes can be read using in.getAttribute.
+         *
+         * @param in the XML input stream
+         * @param tag the START_TAG that was not recognized.
+         * @return the Object parsed from the stream which will be put into the map.
+         * @throws XmlPullParserException if the START_TAG is not recognized.
+         * @throws IOException on XmlPullParser serialization errors.
+         * @hide
+         */
+        public Object readThisUnknownObjectXml(XmlPullParser in, String tag)
+                throws XmlPullParserException, IOException;
+    }
+}
diff --git a/tests/uiautomator/test-apps/CtsUiAutomatorApp/Android.mk b/tests/uiautomator/test-apps/CtsUiAutomatorApp/Android.mk
index 90bdb61..3827754 100644
--- a/tests/uiautomator/test-apps/CtsUiAutomatorApp/Android.mk
+++ b/tests/uiautomator/test-apps/CtsUiAutomatorApp/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_DEX_PREOPT := false
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
diff --git a/tests/webgl/Android.mk b/tests/webgl/Android.mk
deleted file mode 100755
index ce22dd8..0000000
--- a/tests/webgl/Android.mk
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright (C) 2014 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.
-
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-# Don't include this package in any target.
-LOCAL_MODULE_TAGS := optional
-
-# When built, explicitly put it in the data partition.
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-
-LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-# Must match the package name in CtsTestCaseList.mk
-LOCAL_PACKAGE_NAME := CtsWebGLTestCases
-
-LOCAL_SDK_VERSION := current
-
-include $(BUILD_CTS_PACKAGE)
diff --git a/tests/webgl/AndroidManifest.xml b/tests/webgl/AndroidManifest.xml
deleted file mode 100755
index d648032..0000000
--- a/tests/webgl/AndroidManifest.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2014 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.
- -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.webgl.cts">
-
-    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
-    <uses-permission android:name="android.permission.INTERNET" />
-
-    <application android:maxRecents="1">
-        <uses-library android:name="android.test.runner" />
-        <activity android:name="android.webgl.WebGLActivity" >
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-
-
-    <!--  self-instrumenting test package. -->
-    <instrumentation
-        android:name="android.support.test.runner.AndroidJUnitRunner"
-        android:label="CTS WebGL tests"
-        android:targetPackage="android.webgl.cts" >
-        <meta-data
-            android:name="listener"
-            android:value="com.android.cts.runner.CtsTestRunListener" />
-    </instrumentation>
-</manifest>
-
diff --git a/tests/webgl/res/raw/extract_webgl_tests.py b/tests/webgl/res/raw/extract_webgl_tests.py
deleted file mode 100755
index 1511632..0000000
--- a/tests/webgl/res/raw/extract_webgl_tests.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# Copyright (C) 2014 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.
-
-import sys
-import os
-
-if len(sys.argv) != 3:
-  raise Exception("Usage: extract_webgl_tests.py <webgl_sdk_tests_path> <version>")
-
-top_list = sys.argv[1] + "/00_test_list.txt"
-version = sys.argv[2]
-tests = []
-lists = []
-lists.append(top_list)
-
-def filter_by_version(lines):
-  version_lines = [ line for line in lines if "--min-version" in line ]
-  version_lines.extend([ line for line in lines if "--max-version" in line ])
-  lines = [ line for line in lines if not line in version_lines ]
-  for line in version_lines:
-    assert len(line.split()) == 3
-    min_version = line.split()[1] if line.split()[0] == "--min-version" else "0.0.0"
-    max_version = line.split()[1] if line.split()[0] == "--max-version" else "9.9.9"
-    test = line.split()[2]
-    if (version >= min_version and version <= max_version):
-      lines.append(test)
-  return lines
-
-while not len(lists) == 0:
-  lists2 = lists
-  lists = []
-  for list in lists2:
-    directory = os.path.dirname(os.path.realpath(list))
-    with open(list) as file:
-      # Filter out comments and --min-version
-      lines = [ line.strip() for line in file.readlines()]
-      lines = [ line for line in lines if not "//" in line ]
-      lines = [ line for line in lines if not "#" in line ]
-      lines = [ line.replace("--slow","") for line in lines ]
-      lines = filter_by_version(lines)
-      # Append lists and tests found in this list.
-      lines = [ directory + "/" + line for line in lines ]
-      lists.extend([ line for line in lines if "00_test_list.txt" in line ])
-      tests.extend([ line for line in lines if ".html" in line ])
-
-# Directories for formating test-names/relative-paths.
-name_directory = os.path.dirname(os.path.realpath(top_list))
-path_directory = os.path.realpath(os.path.join(name_directory, os.pardir))
-
-tests = sorted(tests)
-for test in tests:
-  test_path = test.replace(path_directory + "/", "")
-  test_name = test.replace(name_directory + "/", "")
-  test_name = test_name.replace("/","_")
-  test_name = test_name.replace(".","_")
-  test_name = test_name.replace("-","_")
-  print "    public void test_" + test_name + "() throws Exception { doTest(\"" + test_path + "\"); }"
-
diff --git a/tests/webgl/res/raw/harness.html b/tests/webgl/res/raw/harness.html
deleted file mode 100644
index 5ae56ef..0000000
--- a/tests/webgl/res/raw/harness.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE html>
-<!-- saved from url=(0057)http://www.corp.google.com/~vollick/timing-functions.html -->
-<html>
-<head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-
-<script type="text/javascript">
-    // Check for WebGL Support.
-    function supportsWebGL() {
-        var canvas = document.createElement('canvas');
-        gl = canvas.getContext("webgl");
-        return !!gl;
-    }
-
-    // Pass the WebGL harness calls through to the native app.
-    webglTestHarness = {
-        notifyFinished: function() {
-            WebGLCallback.notifyFinished();
-        },
-        reportResults: function(type, success, msg) {
-            WebGLCallback.reportResults(type, success, msg);
-        }
-    }
-    function navigateToTest() {
-        if (supportsWebGL())
-            window.open(WebGLCallback.getUrlToTest(), "TestFrame");
-        else
-            WebGLCallback.notifyFinished();
-    }
-    window.addEventListener('load', navigateToTest, false);
-</script>
-
-<style type="text/css">
-body, html { margin: 0; padding: 0; height: 100%; overflow: hidden; }
-#content { position:absolute; left: 0; right: 0; bottom: 0; top: 0px; }
-</style>
-
-</head>
-
-<body>
-  <div id="content">
-    <iframe name="TestFrame" width="100%" height="100%" frameborder="0"/>
-  </div>
-</body>
-</html>
diff --git a/tests/webgl/res/raw/webgl_sdk_tests.zip b/tests/webgl/res/raw/webgl_sdk_tests.zip
deleted file mode 100644
index a2086b0..0000000
--- a/tests/webgl/res/raw/webgl_sdk_tests.zip
+++ /dev/null
Binary files differ
diff --git a/tests/webgl/src/android/webgl/WebGLActivity.java b/tests/webgl/src/android/webgl/WebGLActivity.java
deleted file mode 100644
index 3f911c4..0000000
--- a/tests/webgl/src/android/webgl/WebGLActivity.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2014 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.webgl;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.res.Resources;
-import android.cts.util.NullWebViewUtils;
-import android.os.Bundle;
-import android.util.Log;
-import android.webgl.cts.R;
-import android.webkit.WebView;
-import android.webkit.JavascriptInterface;
-import android.webkit.WebViewClient;
-import android.widget.Toast;
-import java.lang.Override;
-import java.io.InputStream;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-/**
- * A simple activity for testing WebGL Conformance with WebView.
- */
-public class WebGLActivity extends Activity {
-
-    Semaphore mFinished = new Semaphore(0, false);
-    Semaphore mDestroyed = new Semaphore(0, false);
-    String mWebGlHarnessUrl;
-    WebView mWebView;
-
-    // The following members are synchronized.
-    String mWebGLTestUrl;
-    boolean mPassed = true;
-    StringBuilder mMessage = new StringBuilder("\n");
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-
-        mWebGlHarnessUrl = "file://" + getCacheDir() + "/harness.html";
-        try {
-            mWebView = new WebView(this);
-        } catch (Exception e) {
-            NullWebViewUtils.determineIfWebViewAvailable(this, e);
-        }
-
-        if (mWebView == null) {
-            return;
-        }
-
-        mWebView.getSettings().setJavaScriptEnabled(true);
-        mWebView.getSettings().setAllowFileAccessFromFileURLs(true);
-        mWebView.getSettings().setMediaPlaybackRequiresUserGesture(false);
-        mWebView.setWebViewClient(new WebViewClient() {
-            @Override
-            public boolean shouldOverrideUrlLoading(WebView webView, String url) {
-                return false;
-            }
-        });
-
-        mWebView.addJavascriptInterface(new Object() {
-            @JavascriptInterface
-            public String getUrlToTest() {
-                synchronized(WebGLActivity.this) {
-                    return mWebGLTestUrl;
-                }
-            }
-
-            @JavascriptInterface
-            public void reportResults(String type, boolean success, String message) {
-                synchronized(WebGLActivity.this) {
-                    mMessage.append((success ? "PASS " : "FAIL ") + message + "\n");
-                    mPassed &= success;
-                }
-            }
-
-            @JavascriptInterface
-            public void notifyFinished() {
-                mFinished.release();
-            }
-
-            @JavascriptInterface
-            public void alert(String string) {
-                Log.i(mWebGLTestUrl, string);
-            }
-        }, "WebGLCallback");
-        setContentView(mWebView);
-    }
-
-    public void navigateToTest(String url) throws Exception {
-        if (!NullWebViewUtils.isWebViewAvailable()) {
-            return;
-        }
-
-        synchronized(WebGLActivity.this) {
-            mWebGLTestUrl = url;
-        }
-
-        // Load harness.html, which will load mWebGLTestUrl in an <iframe>.
-        runOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.loadUrl(mWebGlHarnessUrl);
-            }
-        });
-
-        // Wait on test completion.
-        boolean finished = mFinished.tryAcquire(60, TimeUnit.SECONDS);
-        String message;
-        synchronized(WebGLActivity.this) {
-            message = mMessage.toString();
-        }
-
-        // Destroy the webview and wait for it.
-        runOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.destroy();
-                finish();
-                mDestroyed.release();
-            }
-        });
-        mDestroyed.acquire();
-
-        if (!finished)
-            throw new Exception("\n" + url + "\n Test timed-out after 60 seconds: " + message);
-        if(!mPassed)
-            throw new Exception("\n" + url + "\n Test failed: " + message);
-    }
-}
diff --git a/tests/webgl/src/android/webgl/cts/WebGLConformanceSuite.java b/tests/webgl/src/android/webgl/cts/WebGLConformanceSuite.java
deleted file mode 100644
index 60f663a..0000000
--- a/tests/webgl/src/android/webgl/cts/WebGLConformanceSuite.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2014 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.webgl.cts;
-
-import android.util.Log;
-import android.webgl.cts.R;
-import android.webgl.WebGLActivity;
-import java.lang.Override;
-import java.io.File;
-import java.io.InputStream;
-
-/**
- * A Singleton class to wrap the WebGL Conformance Test Suite.
- */
-public class WebGLConformanceSuite {
-    private final String TAG = "WebGLConformanceSuite";
-    private static volatile WebGLConformanceSuite mInstance = null;
-
-    private WebGLConformanceSuite(WebGLActivity activity) throws Exception {
-        Log.i(TAG, "Unzipping WebGL Conformance Suite: "
-                + activity.getCacheDir().getPath());
-        InputStream suite = activity.getResources().openRawResource(R.raw.webgl_sdk_tests);
-        ZipUtil.unzipToPath(suite, activity.getCacheDir());
-        InputStream harness = activity.getResources().openRawResource(R.raw.harness);
-        ZipUtil.streamToPath(harness, activity.getCacheDir(), "harness.html");
-    }
-
-    public static WebGLConformanceSuite init(WebGLActivity activity)
-            throws Exception {
-        if (mInstance == null) {
-            synchronized (WebGLConformanceSuite.class) {
-                mInstance = new WebGLConformanceSuite(activity);
-            }
-        }
-        return mInstance;
-    }
-}
diff --git a/tests/webgl/src/android/webgl/cts/WebGLTest.java b/tests/webgl/src/android/webgl/cts/WebGLTest.java
deleted file mode 100644
index d45c190..0000000
--- a/tests/webgl/src/android/webgl/cts/WebGLTest.java
+++ /dev/null
@@ -1,419 +0,0 @@
-/*
- * Copyright (C) 2014 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.webgl.cts;
-
-import android.webgl.WebGLActivity;
-import android.webgl.cts.R;
-import android.test.ActivityInstrumentationTestCase2;
-import java.io.InputStream;
-
-/**
- * A simple wrapper to load each WebGL conformance test in WebView.
- *
- * This test uses {@link android.test.ActivityInstrumentationTestCase2} to instrument the
- * {@link android.webgl.WebGLActivity}.
- */
-public class WebGLTest extends ActivityInstrumentationTestCase2<WebGLActivity> {
-
-    /**
-     * A reference to the activity whose shared preferences are being tested.
-     */
-    private WebGLActivity mActivity;
-    private WebGLConformanceSuite mWebGL_1_0_1;
-
-    public WebGLTest() {
-        super(WebGLActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        // Start the activity and get a reference to it.
-        mActivity = getActivity();
-        // Wait for the UI Thread to become idle.
-        getInstrumentation().waitForIdleSync();
-        mWebGL_1_0_1 = WebGLConformanceSuite.init(mActivity);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        // Scrub the activity so it can be freed. The next time the setUp will create a new activity
-        // rather than reusing the old one.
-        mActivity = null;
-        super.tearDown();
-    }
-
-    protected void doTest(String testPage) throws Exception {
-        mActivity.navigateToTest(testPage);
-    }
-
-    /**
-     * The remainder of this file is generated using this command:
-     * extract_webgl_tests.py tests 1.0.1
-     */
-    public void test_conformance_attribs_gl_enable_vertex_attrib_html() throws Exception { doTest("tests/conformance/attribs/gl-enable-vertex-attrib.html"); }
-    public void test_conformance_attribs_gl_vertex_attrib_zero_issues_html() throws Exception { doTest("tests/conformance/attribs/gl-vertex-attrib-zero-issues.html"); }
-    public void test_conformance_attribs_gl_vertex_attrib_html() throws Exception { doTest("tests/conformance/attribs/gl-vertex-attrib.html"); }
-    public void test_conformance_attribs_gl_vertexattribpointer_offsets_html() throws Exception { doTest("tests/conformance/attribs/gl-vertexattribpointer-offsets.html"); }
-    public void test_conformance_attribs_gl_vertexattribpointer_html() throws Exception { doTest("tests/conformance/attribs/gl-vertexattribpointer.html"); }
-    public void test_conformance_buffers_buffer_bind_test_html() throws Exception { doTest("tests/conformance/buffers/buffer-bind-test.html"); }
-    public void test_conformance_buffers_buffer_data_array_buffer_html() throws Exception { doTest("tests/conformance/buffers/buffer-data-array-buffer.html"); }
-    public void test_conformance_buffers_index_validation_copies_indices_html() throws Exception { doTest("tests/conformance/buffers/index-validation-copies-indices.html"); }
-    public void test_conformance_buffers_index_validation_crash_with_buffer_sub_data_html() throws Exception { doTest("tests/conformance/buffers/index-validation-crash-with-buffer-sub-data.html"); }
-    public void test_conformance_buffers_index_validation_verifies_too_many_indices_html() throws Exception { doTest("tests/conformance/buffers/index-validation-verifies-too-many-indices.html"); }
-    public void test_conformance_buffers_index_validation_with_resized_buffer_html() throws Exception { doTest("tests/conformance/buffers/index-validation-with-resized-buffer.html"); }
-    public void test_conformance_buffers_index_validation_html() throws Exception { doTest("tests/conformance/buffers/index-validation.html"); }
-    public void test_conformance_canvas_buffer_offscreen_test_html() throws Exception { doTest("tests/conformance/canvas/buffer-offscreen-test.html"); }
-    public void test_conformance_canvas_buffer_preserve_test_html() throws Exception { doTest("tests/conformance/canvas/buffer-preserve-test.html"); }
-    public void test_conformance_canvas_canvas_test_html() throws Exception { doTest("tests/conformance/canvas/canvas-test.html"); }
-    public void test_conformance_canvas_canvas_zero_size_html() throws Exception { doTest("tests/conformance/canvas/canvas-zero-size.html"); }
-    public void test_conformance_canvas_drawingbuffer_static_canvas_test_html() throws Exception { doTest("tests/conformance/canvas/drawingbuffer-static-canvas-test.html"); }
-    public void test_conformance_canvas_drawingbuffer_test_html() throws Exception { doTest("tests/conformance/canvas/drawingbuffer-test.html"); }
-    public void test_conformance_canvas_viewport_unchanged_upon_resize_html() throws Exception { doTest("tests/conformance/canvas/viewport-unchanged-upon-resize.html"); }
-    public void test_conformance_context_constants_and_properties_html() throws Exception { doTest("tests/conformance/context/constants-and-properties.html"); }
-    public void test_conformance_context_context_attributes_alpha_depth_stencil_antialias_html() throws Exception { doTest("tests/conformance/context/context-attributes-alpha-depth-stencil-antialias.html"); }
-    public void test_conformance_context_context_lost_restored_html() throws Exception { doTest("tests/conformance/context/context-lost-restored.html"); }
-    public void test_conformance_context_context_lost_html() throws Exception { doTest("tests/conformance/context/context-lost.html"); }
-    public void test_conformance_context_context_type_test_html() throws Exception { doTest("tests/conformance/context/context-type-test.html"); }
-    public void test_conformance_context_incorrect_context_object_behaviour_html() throws Exception { doTest("tests/conformance/context/incorrect-context-object-behaviour.html"); }
-    public void test_conformance_context_methods_html() throws Exception { doTest("tests/conformance/context/methods.html"); }
-    public void test_conformance_context_premultiplyalpha_test_html() throws Exception { doTest("tests/conformance/context/premultiplyalpha-test.html"); }
-    public void test_conformance_context_resource_sharing_test_html() throws Exception { doTest("tests/conformance/context/resource-sharing-test.html"); }
-    public void test_conformance_extensions_oes_standard_derivatives_html() throws Exception { doTest("tests/conformance/extensions/oes-standard-derivatives.html"); }
-    public void test_conformance_extensions_oes_texture_float_with_canvas_html() throws Exception { doTest("tests/conformance/extensions/oes-texture-float-with-canvas.html"); }
-    public void test_conformance_extensions_oes_texture_float_with_image_data_html() throws Exception { doTest("tests/conformance/extensions/oes-texture-float-with-image-data.html"); }
-    public void test_conformance_extensions_oes_texture_float_with_image_html() throws Exception { doTest("tests/conformance/extensions/oes-texture-float-with-image.html"); }
-    public void test_conformance_extensions_oes_texture_float_with_video_html() throws Exception { doTest("tests/conformance/extensions/oes-texture-float-with-video.html"); }
-    public void test_conformance_extensions_oes_texture_float_html() throws Exception { doTest("tests/conformance/extensions/oes-texture-float.html"); }
-    public void test_conformance_extensions_oes_vertex_array_object_html() throws Exception { doTest("tests/conformance/extensions/oes-vertex-array-object.html"); }
-    public void test_conformance_extensions_webgl_debug_renderer_info_html() throws Exception { doTest("tests/conformance/extensions/webgl-debug-renderer-info.html"); }
-    public void test_conformance_extensions_webgl_debug_shaders_html() throws Exception { doTest("tests/conformance/extensions/webgl-debug-shaders.html"); }
-    public void test_conformance_glsl_functions_glsl_function_abs_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-abs.html"); }
-    public void test_conformance_glsl_functions_glsl_function_acos_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-acos.html"); }
-    public void test_conformance_glsl_functions_glsl_function_asin_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-asin.html"); }
-    public void test_conformance_glsl_functions_glsl_function_atan_xy_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-atan-xy.html"); }
-    public void test_conformance_glsl_functions_glsl_function_atan_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-atan.html"); }
-    public void test_conformance_glsl_functions_glsl_function_ceil_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-ceil.html"); }
-    public void test_conformance_glsl_functions_glsl_function_clamp_float_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-clamp-float.html"); }
-    public void test_conformance_glsl_functions_glsl_function_clamp_gentype_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-clamp-gentype.html"); }
-    public void test_conformance_glsl_functions_glsl_function_cos_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-cos.html"); }
-    public void test_conformance_glsl_functions_glsl_function_cross_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-cross.html"); }
-    public void test_conformance_glsl_functions_glsl_function_distance_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-distance.html"); }
-    public void test_conformance_glsl_functions_glsl_function_dot_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-dot.html"); }
-    public void test_conformance_glsl_functions_glsl_function_faceforward_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-faceforward.html"); }
-    public void test_conformance_glsl_functions_glsl_function_floor_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-floor.html"); }
-    public void test_conformance_glsl_functions_glsl_function_fract_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-fract.html"); }
-    public void test_conformance_glsl_functions_glsl_function_length_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-length.html"); }
-    public void test_conformance_glsl_functions_glsl_function_max_float_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-max-float.html"); }
-    public void test_conformance_glsl_functions_glsl_function_max_gentype_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-max-gentype.html"); }
-    public void test_conformance_glsl_functions_glsl_function_min_float_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-min-float.html"); }
-    public void test_conformance_glsl_functions_glsl_function_min_gentype_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-min-gentype.html"); }
-    public void test_conformance_glsl_functions_glsl_function_mix_float_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-mix-float.html"); }
-    public void test_conformance_glsl_functions_glsl_function_mix_gentype_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-mix-gentype.html"); }
-    public void test_conformance_glsl_functions_glsl_function_mod_float_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-mod-float.html"); }
-    public void test_conformance_glsl_functions_glsl_function_mod_gentype_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-mod-gentype.html"); }
-    public void test_conformance_glsl_functions_glsl_function_normalize_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-normalize.html"); }
-    public void test_conformance_glsl_functions_glsl_function_reflect_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-reflect.html"); }
-    public void test_conformance_glsl_functions_glsl_function_sign_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-sign.html"); }
-    public void test_conformance_glsl_functions_glsl_function_sin_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-sin.html"); }
-    public void test_conformance_glsl_functions_glsl_function_smoothstep_float_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-smoothstep-float.html"); }
-    public void test_conformance_glsl_functions_glsl_function_smoothstep_gentype_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-smoothstep-gentype.html"); }
-    public void test_conformance_glsl_functions_glsl_function_step_float_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-step-float.html"); }
-    public void test_conformance_glsl_functions_glsl_function_step_gentype_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function-step-gentype.html"); }
-    public void test_conformance_glsl_functions_glsl_function_html() throws Exception { doTest("tests/conformance/glsl/functions/glsl-function.html"); }
-    public void test_conformance_glsl_implicit_add_int_float_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_int_float.vert.html"); }
-    public void test_conformance_glsl_implicit_add_int_mat2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_int_mat2.vert.html"); }
-    public void test_conformance_glsl_implicit_add_int_mat3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_int_mat3.vert.html"); }
-    public void test_conformance_glsl_implicit_add_int_mat4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_int_mat4.vert.html"); }
-    public void test_conformance_glsl_implicit_add_int_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_int_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_add_int_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_int_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_add_int_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_int_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_add_ivec2_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_ivec2_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_add_ivec3_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_ivec3_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_add_ivec4_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/add_ivec4_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_assign_int_to_float_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/assign_int_to_float.vert.html"); }
-    public void test_conformance_glsl_implicit_assign_ivec2_to_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/assign_ivec2_to_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_assign_ivec3_to_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/assign_ivec3_to_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_assign_ivec4_to_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/assign_ivec4_to_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_construct_struct_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/construct_struct.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_int_float_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_int_float.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_int_mat2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_int_mat2.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_int_mat3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_int_mat3.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_int_mat4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_int_mat4.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_int_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_int_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_int_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_int_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_int_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_int_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_ivec2_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_ivec2_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_ivec3_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_ivec3_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_divide_ivec4_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/divide_ivec4_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_equal_int_float_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/equal_int_float.vert.html"); }
-    public void test_conformance_glsl_implicit_equal_ivec2_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/equal_ivec2_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_equal_ivec3_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/equal_ivec3_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_equal_ivec4_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/equal_ivec4_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_function_int_float_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/function_int_float.vert.html"); }
-    public void test_conformance_glsl_implicit_function_ivec2_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/function_ivec2_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_function_ivec3_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/function_ivec3_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_function_ivec4_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/function_ivec4_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_greater_than_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/greater_than.vert.html"); }
-    public void test_conformance_glsl_implicit_greater_than_equal_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/greater_than_equal.vert.html"); }
-    public void test_conformance_glsl_implicit_less_than_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/less_than.vert.html"); }
-    public void test_conformance_glsl_implicit_less_than_equal_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/less_than_equal.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_int_float_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_int_float.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_int_mat2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_int_mat2.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_int_mat3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_int_mat3.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_int_mat4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_int_mat4.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_int_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_int_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_int_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_int_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_int_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_int_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_ivec2_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_ivec2_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_ivec3_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_ivec3_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_multiply_ivec4_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/multiply_ivec4_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_not_equal_int_float_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/not_equal_int_float.vert.html"); }
-    public void test_conformance_glsl_implicit_not_equal_ivec2_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/not_equal_ivec2_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_not_equal_ivec3_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/not_equal_ivec3_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_not_equal_ivec4_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/not_equal_ivec4_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_int_float_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_int_float.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_int_mat2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_int_mat2.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_int_mat3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_int_mat3.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_int_mat4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_int_mat4.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_int_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_int_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_int_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_int_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_int_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_int_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_ivec2_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_ivec2_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_ivec3_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_ivec3_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_subtract_ivec4_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/subtract_ivec4_vec4.vert.html"); }
-    public void test_conformance_glsl_implicit_ternary_int_float_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/ternary_int_float.vert.html"); }
-    public void test_conformance_glsl_implicit_ternary_ivec2_vec2_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/ternary_ivec2_vec2.vert.html"); }
-    public void test_conformance_glsl_implicit_ternary_ivec3_vec3_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/ternary_ivec3_vec3.vert.html"); }
-    public void test_conformance_glsl_implicit_ternary_ivec4_vec4_vert_html() throws Exception { doTest("tests/conformance/glsl/implicit/ternary_ivec4_vec4.vert.html"); }
-    public void test_conformance_glsl_misc_attrib_location_length_limits_html() throws Exception { doTest("tests/conformance/glsl/misc/attrib-location-length-limits.html"); }
-    public void test_conformance_glsl_misc_embedded_struct_definitions_forbidden_html() throws Exception { doTest("tests/conformance/glsl/misc/embedded-struct-definitions-forbidden.html"); }
-    public void test_conformance_glsl_misc_empty_main_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/empty_main.vert.html"); }
-    public void test_conformance_glsl_misc_gl_position_unset_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/gl_position_unset.vert.html"); }
-    public void test_conformance_glsl_misc_glsl_function_nodes_html() throws Exception { doTest("tests/conformance/glsl/misc/glsl-function-nodes.html"); }
-    public void test_conformance_glsl_misc_glsl_long_variable_names_html() throws Exception { doTest("tests/conformance/glsl/misc/glsl-long-variable-names.html"); }
-    public void test_conformance_glsl_misc_non_ascii_comments_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/non-ascii-comments.vert.html"); }
-    public void test_conformance_glsl_misc_non_ascii_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/non-ascii.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_256_character_identifier_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-256-character-identifier.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_257_character_identifier_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-257-character-identifier.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with__webgl_identifier_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-_webgl-identifier.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_arbitrary_indexing_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-arbitrary-indexing.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_arbitrary_indexing_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-arbitrary-indexing.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_attrib_array_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-attrib-array.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_attrib_struct_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-attrib-struct.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_clipvertex_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-clipvertex.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_default_precision_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-default-precision.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_default_precision_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-default-precision.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_define_line_continuation_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-define-line-continuation.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_dfdx_no_ext_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-dfdx-no-ext.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_dfdx_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-dfdx.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_error_directive_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-error-directive.html"); }
-    public void test_conformance_glsl_misc_shader_with_explicit_int_cast_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-explicit-int-cast.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_float_return_value_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-float-return-value.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_frag_depth_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-frag-depth.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_function_recursion_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-function-recursion.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_glcolor_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-glcolor.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_gles_1_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-gles-1.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_gles_symbol_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-gles-symbol.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_glprojectionmatrix_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-glprojectionmatrix.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_implicit_vec3_to_vec4_cast_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-implicit-vec3-to-vec4-cast.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_include_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-include.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_int_return_value_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-int-return-value.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_invalid_identifier_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-invalid-identifier.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_ivec2_return_value_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-ivec2-return-value.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_ivec3_return_value_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-ivec3-return-value.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_ivec4_return_value_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-ivec4-return-value.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_limited_indexing_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-limited-indexing.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_long_line_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-long-line.html"); }
-    public void test_conformance_glsl_misc_shader_with_non_ascii_error_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-non-ascii-error.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_precision_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-precision.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_quoted_error_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-quoted-error.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_undefined_preprocessor_symbol_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-undefined-preprocessor-symbol.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_uniform_in_loop_condition_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-uniform-in-loop-condition.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_vec2_return_value_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-vec2-return-value.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_vec3_return_value_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-vec3-return-value.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_vec4_return_value_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-vec4-return-value.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_version_100_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-version-100.frag.html"); }
-    public void test_conformance_glsl_misc_shader_with_version_100_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-version-100.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_version_120_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-version-120.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_version_130_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-version-130.vert.html"); }
-    public void test_conformance_glsl_misc_shader_with_webgl_identifier_vert_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-with-webgl-identifier.vert.html"); }
-    public void test_conformance_glsl_misc_shader_without_precision_frag_html() throws Exception { doTest("tests/conformance/glsl/misc/shader-without-precision.frag.html"); }
-    public void test_conformance_glsl_misc_shared_html() throws Exception { doTest("tests/conformance/glsl/misc/shared.html"); }
-    public void test_conformance_glsl_misc_struct_nesting_exceeds_maximum_html() throws Exception { doTest("tests/conformance/glsl/misc/struct-nesting-exceeds-maximum.html"); }
-    public void test_conformance_glsl_misc_struct_nesting_under_maximum_html() throws Exception { doTest("tests/conformance/glsl/misc/struct-nesting-under-maximum.html"); }
-    public void test_conformance_glsl_misc_uniform_location_length_limits_html() throws Exception { doTest("tests/conformance/glsl/misc/uniform-location-length-limits.html"); }
-    public void test_conformance_glsl_reserved__webgl_field_vert_html() throws Exception { doTest("tests/conformance/glsl/reserved/_webgl_field.vert.html"); }
-    public void test_conformance_glsl_reserved__webgl_function_vert_html() throws Exception { doTest("tests/conformance/glsl/reserved/_webgl_function.vert.html"); }
-    public void test_conformance_glsl_reserved__webgl_struct_vert_html() throws Exception { doTest("tests/conformance/glsl/reserved/_webgl_struct.vert.html"); }
-    public void test_conformance_glsl_reserved__webgl_variable_vert_html() throws Exception { doTest("tests/conformance/glsl/reserved/_webgl_variable.vert.html"); }
-    public void test_conformance_glsl_reserved_webgl_field_vert_html() throws Exception { doTest("tests/conformance/glsl/reserved/webgl_field.vert.html"); }
-    public void test_conformance_glsl_reserved_webgl_function_vert_html() throws Exception { doTest("tests/conformance/glsl/reserved/webgl_function.vert.html"); }
-    public void test_conformance_glsl_reserved_webgl_struct_vert_html() throws Exception { doTest("tests/conformance/glsl/reserved/webgl_struct.vert.html"); }
-    public void test_conformance_glsl_reserved_webgl_variable_vert_html() throws Exception { doTest("tests/conformance/glsl/reserved/webgl_variable.vert.html"); }
-    public void test_conformance_glsl_variables_gl_fragcoord_html() throws Exception { doTest("tests/conformance/glsl/variables/gl-fragcoord.html"); }
-    public void test_conformance_glsl_variables_gl_frontfacing_html() throws Exception { doTest("tests/conformance/glsl/variables/gl-frontfacing.html"); }
-    public void test_conformance_glsl_variables_gl_pointcoord_html() throws Exception { doTest("tests/conformance/glsl/variables/gl-pointcoord.html"); }
-    public void test_conformance_limits_gl_max_texture_dimensions_html() throws Exception { doTest("tests/conformance/limits/gl-max-texture-dimensions.html"); }
-    public void test_conformance_limits_gl_min_attribs_html() throws Exception { doTest("tests/conformance/limits/gl-min-attribs.html"); }
-    public void test_conformance_limits_gl_min_textures_html() throws Exception { doTest("tests/conformance/limits/gl-min-textures.html"); }
-    public void test_conformance_limits_gl_min_uniforms_html() throws Exception { doTest("tests/conformance/limits/gl-min-uniforms.html"); }
-    public void test_conformance_misc_bad_arguments_test_html() throws Exception { doTest("tests/conformance/misc/bad-arguments-test.html"); }
-    public void test_conformance_misc_error_reporting_html() throws Exception { doTest("tests/conformance/misc/error-reporting.html"); }
-    public void test_conformance_misc_functions_returning_strings_html() throws Exception { doTest("tests/conformance/misc/functions-returning-strings.html"); }
-    public void test_conformance_misc_instanceof_test_html() throws Exception { doTest("tests/conformance/misc/instanceof-test.html"); }
-    public void test_conformance_misc_invalid_passed_params_html() throws Exception { doTest("tests/conformance/misc/invalid-passed-params.html"); }
-    public void test_conformance_misc_is_object_html() throws Exception { doTest("tests/conformance/misc/is-object.html"); }
-    public void test_conformance_misc_null_object_behaviour_html() throws Exception { doTest("tests/conformance/misc/null-object-behaviour.html"); }
-    public void test_conformance_misc_object_deletion_behaviour_html() throws Exception { doTest("tests/conformance/misc/object-deletion-behaviour.html"); }
-    public void test_conformance_misc_shader_precision_format_html() throws Exception { doTest("tests/conformance/misc/shader-precision-format.html"); }
-    public void test_conformance_misc_type_conversion_test_html() throws Exception { doTest("tests/conformance/misc/type-conversion-test.html"); }
-    public void test_conformance_misc_uninitialized_test_html() throws Exception { doTest("tests/conformance/misc/uninitialized-test.html"); }
-    public void test_conformance_misc_webgl_specific_html() throws Exception { doTest("tests/conformance/misc/webgl-specific.html"); }
-    public void test_conformance_more_conformance_constants_html() throws Exception { doTest("tests/conformance/more/conformance/constants.html"); }
-    public void test_conformance_more_conformance_getContext_html() throws Exception { doTest("tests/conformance/more/conformance/getContext.html"); }
-    public void test_conformance_more_conformance_methods_html() throws Exception { doTest("tests/conformance/more/conformance/methods.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_A_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-A.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_B1_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-B1.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_B2_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-B2.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_B3_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-B3.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_B4_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-B4.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_C_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-C.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_D_G_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-D_G.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_G_I_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-G_I.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_L_S_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-L_S.html"); }
-    public void test_conformance_more_conformance_quickCheckAPI_S_V_html() throws Exception { doTest("tests/conformance/more/conformance/quickCheckAPI-S_V.html"); }
-    public void test_conformance_more_conformance_webGLArrays_html() throws Exception { doTest("tests/conformance/more/conformance/webGLArrays.html"); }
-    public void test_conformance_more_functions_bindBuffer_html() throws Exception { doTest("tests/conformance/more/functions/bindBuffer.html"); }
-    public void test_conformance_more_functions_bindBufferBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/bindBufferBadArgs.html"); }
-    public void test_conformance_more_functions_bindFramebufferLeaveNonZero_html() throws Exception { doTest("tests/conformance/more/functions/bindFramebufferLeaveNonZero.html"); }
-    public void test_conformance_more_functions_bufferData_html() throws Exception { doTest("tests/conformance/more/functions/bufferData.html"); }
-    public void test_conformance_more_functions_bufferDataBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/bufferDataBadArgs.html"); }
-    public void test_conformance_more_functions_bufferSubData_html() throws Exception { doTest("tests/conformance/more/functions/bufferSubData.html"); }
-    public void test_conformance_more_functions_bufferSubDataBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/bufferSubDataBadArgs.html"); }
-    public void test_conformance_more_functions_copyTexImage2D_html() throws Exception { doTest("tests/conformance/more/functions/copyTexImage2D.html"); }
-    public void test_conformance_more_functions_copyTexImage2DBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/copyTexImage2DBadArgs.html"); }
-    public void test_conformance_more_functions_copyTexSubImage2D_html() throws Exception { doTest("tests/conformance/more/functions/copyTexSubImage2D.html"); }
-    public void test_conformance_more_functions_copyTexSubImage2DBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/copyTexSubImage2DBadArgs.html"); }
-    public void test_conformance_more_functions_deleteBufferBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/deleteBufferBadArgs.html"); }
-    public void test_conformance_more_functions_drawArrays_html() throws Exception { doTest("tests/conformance/more/functions/drawArrays.html"); }
-    public void test_conformance_more_functions_drawArraysOutOfBounds_html() throws Exception { doTest("tests/conformance/more/functions/drawArraysOutOfBounds.html"); }
-    public void test_conformance_more_functions_drawElements_html() throws Exception { doTest("tests/conformance/more/functions/drawElements.html"); }
-    public void test_conformance_more_functions_drawElementsBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/drawElementsBadArgs.html"); }
-    public void test_conformance_more_functions_isTests_html() throws Exception { doTest("tests/conformance/more/functions/isTests.html"); }
-    public void test_conformance_more_functions_readPixels_html() throws Exception { doTest("tests/conformance/more/functions/readPixels.html"); }
-    public void test_conformance_more_functions_readPixelsBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/readPixelsBadArgs.html"); }
-    public void test_conformance_more_functions_texImage2D_html() throws Exception { doTest("tests/conformance/more/functions/texImage2D.html"); }
-    public void test_conformance_more_functions_texImage2DBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/texImage2DBadArgs.html"); }
-    public void test_conformance_more_functions_texImage2DHTML_html() throws Exception { doTest("tests/conformance/more/functions/texImage2DHTML.html"); }
-    public void test_conformance_more_functions_texImage2DHTMLBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/texImage2DHTMLBadArgs.html"); }
-    public void test_conformance_more_functions_texSubImage2D_html() throws Exception { doTest("tests/conformance/more/functions/texSubImage2D.html"); }
-    public void test_conformance_more_functions_texSubImage2DBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/texSubImage2DBadArgs.html"); }
-    public void test_conformance_more_functions_texSubImage2DHTML_html() throws Exception { doTest("tests/conformance/more/functions/texSubImage2DHTML.html"); }
-    public void test_conformance_more_functions_texSubImage2DHTMLBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/texSubImage2DHTMLBadArgs.html"); }
-    public void test_conformance_more_functions_uniformMatrix_html() throws Exception { doTest("tests/conformance/more/functions/uniformMatrix.html"); }
-    public void test_conformance_more_functions_uniformMatrixBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/uniformMatrixBadArgs.html"); }
-    public void test_conformance_more_functions_uniformf_html() throws Exception { doTest("tests/conformance/more/functions/uniformf.html"); }
-    public void test_conformance_more_functions_uniformfArrayLen1_html() throws Exception { doTest("tests/conformance/more/functions/uniformfArrayLen1.html"); }
-    public void test_conformance_more_functions_uniformfBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/uniformfBadArgs.html"); }
-    public void test_conformance_more_functions_uniformi_html() throws Exception { doTest("tests/conformance/more/functions/uniformi.html"); }
-    public void test_conformance_more_functions_uniformiBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/uniformiBadArgs.html"); }
-    public void test_conformance_more_functions_vertexAttrib_html() throws Exception { doTest("tests/conformance/more/functions/vertexAttrib.html"); }
-    public void test_conformance_more_functions_vertexAttribBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/vertexAttribBadArgs.html"); }
-    public void test_conformance_more_functions_vertexAttribPointer_html() throws Exception { doTest("tests/conformance/more/functions/vertexAttribPointer.html"); }
-    public void test_conformance_more_functions_vertexAttribPointerBadArgs_html() throws Exception { doTest("tests/conformance/more/functions/vertexAttribPointerBadArgs.html"); }
-    public void test_conformance_more_glsl_arrayOutOfBounds_html() throws Exception { doTest("tests/conformance/more/glsl/arrayOutOfBounds.html"); }
-    public void test_conformance_more_glsl_uniformOutOfBounds_html() throws Exception { doTest("tests/conformance/more/glsl/uniformOutOfBounds.html"); }
-    public void test_conformance_programs_get_active_test_html() throws Exception { doTest("tests/conformance/programs/get-active-test.html"); }
-    public void test_conformance_programs_gl_bind_attrib_location_test_html() throws Exception { doTest("tests/conformance/programs/gl-bind-attrib-location-test.html"); }
-    public void test_conformance_programs_gl_get_active_attribute_html() throws Exception { doTest("tests/conformance/programs/gl-get-active-attribute.html"); }
-    public void test_conformance_programs_gl_get_active_uniform_html() throws Exception { doTest("tests/conformance/programs/gl-get-active-uniform.html"); }
-    public void test_conformance_programs_gl_getshadersource_html() throws Exception { doTest("tests/conformance/programs/gl-getshadersource.html"); }
-    public void test_conformance_programs_gl_shader_test_html() throws Exception { doTest("tests/conformance/programs/gl-shader-test.html"); }
-    public void test_conformance_programs_invalid_UTF_16_html() throws Exception { doTest("tests/conformance/programs/invalid-UTF-16.html"); }
-    public void test_conformance_programs_program_test_html() throws Exception { doTest("tests/conformance/programs/program-test.html"); }
-    public void test_conformance_reading_read_pixels_pack_alignment_html() throws Exception { doTest("tests/conformance/reading/read-pixels-pack-alignment.html"); }
-    public void test_conformance_reading_read_pixels_test_html() throws Exception { doTest("tests/conformance/reading/read-pixels-test.html"); }
-    public void test_conformance_renderbuffers_framebuffer_object_attachment_html() throws Exception { doTest("tests/conformance/renderbuffers/framebuffer-object-attachment.html"); }
-    public void test_conformance_renderbuffers_framebuffer_test_html() throws Exception { doTest("tests/conformance/renderbuffers/framebuffer-test.html"); }
-    public void test_conformance_renderbuffers_renderbuffer_initialization_html() throws Exception { doTest("tests/conformance/renderbuffers/renderbuffer-initialization.html"); }
-    public void test_conformance_rendering_draw_arrays_out_of_bounds_html() throws Exception { doTest("tests/conformance/rendering/draw-arrays-out-of-bounds.html"); }
-    public void test_conformance_rendering_draw_elements_out_of_bounds_html() throws Exception { doTest("tests/conformance/rendering/draw-elements-out-of-bounds.html"); }
-    public void test_conformance_rendering_gl_clear_html() throws Exception { doTest("tests/conformance/rendering/gl-clear.html"); }
-    public void test_conformance_rendering_gl_drawelements_html() throws Exception { doTest("tests/conformance/rendering/gl-drawelements.html"); }
-    public void test_conformance_rendering_gl_scissor_test_html() throws Exception { doTest("tests/conformance/rendering/gl-scissor-test.html"); }
-    public void test_conformance_rendering_line_loop_tri_fan_html() throws Exception { doTest("tests/conformance/rendering/line-loop-tri-fan.html"); }
-    public void test_conformance_rendering_more_than_65536_indices_html() throws Exception { doTest("tests/conformance/rendering/more-than-65536-indices.html"); }
-    public void test_conformance_rendering_multisample_corruption_html() throws Exception { doTest("tests/conformance/rendering/multisample-corruption.html"); }
-    public void test_conformance_rendering_point_size_html() throws Exception { doTest("tests/conformance/rendering/point-size.html"); }
-    public void test_conformance_rendering_triangle_html() throws Exception { doTest("tests/conformance/rendering/triangle.html"); }
-    public void test_conformance_state_gl_enable_enum_test_html() throws Exception { doTest("tests/conformance/state/gl-enable-enum-test.html"); }
-    public void test_conformance_state_gl_enum_tests_html() throws Exception { doTest("tests/conformance/state/gl-enum-tests.html"); }
-    public void test_conformance_state_gl_get_calls_html() throws Exception { doTest("tests/conformance/state/gl-get-calls.html"); }
-    public void test_conformance_state_gl_geterror_html() throws Exception { doTest("tests/conformance/state/gl-geterror.html"); }
-    public void test_conformance_state_gl_getstring_html() throws Exception { doTest("tests/conformance/state/gl-getstring.html"); }
-    public void test_conformance_state_gl_object_get_calls_html() throws Exception { doTest("tests/conformance/state/gl-object-get-calls.html"); }
-    public void test_conformance_textures_compressed_tex_image_html() throws Exception { doTest("tests/conformance/textures/compressed-tex-image.html"); }
-    public void test_conformance_textures_copy_tex_image_and_sub_image_2d_html() throws Exception { doTest("tests/conformance/textures/copy-tex-image-and-sub-image-2d.html"); }
-    public void test_conformance_textures_gl_pixelstorei_html() throws Exception { doTest("tests/conformance/textures/gl-pixelstorei.html"); }
-    public void test_conformance_textures_gl_teximage_html() throws Exception { doTest("tests/conformance/textures/gl-teximage.html"); }
-    public void test_conformance_textures_origin_clean_conformance_html() throws Exception { doTest("tests/conformance/textures/origin-clean-conformance.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_array_buffer_view_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-array-buffer-view.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_canvas_rgb565_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-canvas-rgb565.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_canvas_rgba4444_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-canvas-rgba4444.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_canvas_rgba5551_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-canvas-rgba5551.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_canvas_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-canvas.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_image_data_rgb565_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-image-data-rgb565.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_image_data_rgba4444_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-image-data-rgba4444.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_image_data_rgba5551_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-image-data-rgba5551.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_image_data_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-image-data.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_image_rgb565_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-image-rgb565.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_image_rgba4444_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-image-rgba4444.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_image_rgba5551_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-image-rgba5551.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_image_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-image.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_video_rgb565_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-video-rgb565.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_video_rgba4444_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-video-rgba4444.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_video_rgba5551_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-video-rgba5551.html"); }
-    public void test_conformance_textures_tex_image_and_sub_image_2d_with_video_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-sub-image-2d-with-video.html"); }
-    public void test_conformance_textures_tex_image_and_uniform_binding_bugs_html() throws Exception { doTest("tests/conformance/textures/tex-image-and-uniform-binding-bugs.html"); }
-    public void test_conformance_textures_tex_image_with_format_and_type_html() throws Exception { doTest("tests/conformance/textures/tex-image-with-format-and-type.html"); }
-    public void test_conformance_textures_tex_image_with_invalid_data_html() throws Exception { doTest("tests/conformance/textures/tex-image-with-invalid-data.html"); }
-    public void test_conformance_textures_tex_input_validation_html() throws Exception { doTest("tests/conformance/textures/tex-input-validation.html"); }
-    public void test_conformance_textures_tex_sub_image_2d_bad_args_html() throws Exception { doTest("tests/conformance/textures/tex-sub-image-2d-bad-args.html"); }
-    public void test_conformance_textures_tex_sub_image_2d_html() throws Exception { doTest("tests/conformance/textures/tex-sub-image-2d.html"); }
-    public void test_conformance_textures_texparameter_test_html() throws Exception { doTest("tests/conformance/textures/texparameter-test.html"); }
-    public void test_conformance_textures_texture_active_bind_2_html() throws Exception { doTest("tests/conformance/textures/texture-active-bind-2.html"); }
-    public void test_conformance_textures_texture_active_bind_html() throws Exception { doTest("tests/conformance/textures/texture-active-bind.html"); }
-    public void test_conformance_textures_texture_complete_html() throws Exception { doTest("tests/conformance/textures/texture-complete.html"); }
-    public void test_conformance_textures_texture_mips_html() throws Exception { doTest("tests/conformance/textures/texture-mips.html"); }
-    public void test_conformance_textures_texture_npot_video_html() throws Exception { doTest("tests/conformance/textures/texture-npot-video.html"); }
-    public void test_conformance_textures_texture_npot_html() throws Exception { doTest("tests/conformance/textures/texture-npot.html"); }
-    public void test_conformance_textures_texture_size_cube_maps_html() throws Exception { doTest("tests/conformance/textures/texture-size-cube-maps.html"); }
-    public void test_conformance_textures_texture_size_html() throws Exception { doTest("tests/conformance/textures/texture-size.html"); }
-    public void test_conformance_textures_texture_transparent_pixels_initialized_html() throws Exception { doTest("tests/conformance/textures/texture-transparent-pixels-initialized.html"); }
-    public void test_conformance_typedarrays_array_buffer_crash_html() throws Exception { doTest("tests/conformance/typedarrays/array-buffer-crash.html"); }
-    public void test_conformance_typedarrays_array_buffer_view_crash_html() throws Exception { doTest("tests/conformance/typedarrays/array-buffer-view-crash.html"); }
-    public void test_conformance_typedarrays_array_unit_tests_html() throws Exception { doTest("tests/conformance/typedarrays/array-unit-tests.html"); }
-    public void test_conformance_typedarrays_data_view_crash_html() throws Exception { doTest("tests/conformance/typedarrays/data-view-crash.html"); }
-    public void test_conformance_typedarrays_data_view_test_html() throws Exception { doTest("tests/conformance/typedarrays/data-view-test.html"); }
-    public void test_conformance_uniforms_gl_uniform_arrays_html() throws Exception { doTest("tests/conformance/uniforms/gl-uniform-arrays.html"); }
-    public void test_conformance_uniforms_gl_uniform_bool_html() throws Exception { doTest("tests/conformance/uniforms/gl-uniform-bool.html"); }
-    public void test_conformance_uniforms_gl_uniformmatrix4fv_html() throws Exception { doTest("tests/conformance/uniforms/gl-uniformmatrix4fv.html"); }
-    public void test_conformance_uniforms_gl_unknown_uniform_html() throws Exception { doTest("tests/conformance/uniforms/gl-unknown-uniform.html"); }
-    public void test_conformance_uniforms_null_uniform_location_html() throws Exception { doTest("tests/conformance/uniforms/null-uniform-location.html"); }
-    public void test_conformance_uniforms_uniform_location_html() throws Exception { doTest("tests/conformance/uniforms/uniform-location.html"); }
-    public void test_conformance_uniforms_uniform_samplers_test_html() throws Exception { doTest("tests/conformance/uniforms/uniform-samplers-test.html"); }
-}
diff --git a/tests/webgl/src/android/webgl/cts/ZipUtil.java b/tests/webgl/src/android/webgl/cts/ZipUtil.java
deleted file mode 100644
index 4b28e63..0000000
--- a/tests/webgl/src/android/webgl/cts/ZipUtil.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2014 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.webgl.cts;
-
-import android.util.Log;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.lang.String;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-
-/**
- * Some boilerplate code to unzip files.
- */
-public class ZipUtil {
-    private final static String TAG = "ZipUtil";
-
-    /**
-     * Stream to a file.
-     */
-    public static void streamToPath(InputStream is,
-                                  File directory,
-                                  String name) throws Exception {
-        File file = new File(directory, name);
-        streamToPath(is, file);
-    }
-
-    public static void streamToPath(InputStream is,
-                                  File file) throws Exception {
-        Log.i(TAG, "Streaming to path " + file.getPath());
-        OutputStream os = null;
-        os = new FileOutputStream(file);
-        int count = -1;
-        byte[] buffer = new byte[10 * 1024];
-        while ((count = is.read(buffer)) != -1) {
-            os.write(buffer, 0, count);
-        }
-        os.close();
-    }
-
-    /**
-     * Unzip to a directory.
-     */
-    public static void unzipToPath(InputStream is,
-                                   File filePath) throws Exception {
-        ZipInputStream zis = new ZipInputStream(is);
-        unzipToPath(zis, filePath.getPath());
-    }
-
-    public static void unzipToPath(ZipInputStream zis,
-                                   String path) throws Exception {
-        Log.i(TAG, "Unzipping to path " + path);
-        byte[] buffer = new byte[10 * 1024];
-        ZipEntry entry;
-        while ((entry = zis.getNextEntry()) != null) {
-            File entryFile = new File(path, entry.getName());
-            if (entry.isDirectory()) {
-                if (!entryFile.exists()) {
-                   entryFile.mkdirs();
-                }
-                continue;
-            }
-            if (entryFile.getParentFile() != null &&
-                    !entryFile.getParentFile().exists()) {
-                entryFile.getParentFile().mkdirs();
-            }
-            if (!entryFile.exists()) {
-                entryFile.createNewFile();
-                entryFile.setReadable(true);
-                entryFile.setExecutable(true);
-            }
-            streamToPath(zis, entryFile);
-        }
-        zis.close();
-    }
-
-    /**
-     * Cleanup a directory.
-     */
-    static public boolean deleteDirectory(String directoryPath) {
-        File path = new File(directoryPath);
-        return deleteDirectory(path);
-    }
-
-    static public boolean deleteDirectory(File path) {
-        if (path.exists()) {
-            File[] files = path.listFiles();
-            for(int i = 0; i < files.length; i++) {
-                if(files[i].isDirectory()) {
-                    deleteDirectory(files[i]);
-                } else {
-                    files[i].delete();
-                }
-            }
-            return path.delete();
-        }
-        return false;
-    }
-}
diff --git a/tools/Android.mk b/tools/Android.mk
index 0a05aed..8377036 100644
--- a/tools/Android.mk
+++ b/tools/Android.mk
@@ -12,4 +12,31 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+# Build the CTS harness
+
+JUNIT_HOST_JAR := $(HOST_OUT_JAVA_LIBRARIES)/junit.jar
+HOSTTESTLIB_JAR := $(HOST_OUT_JAVA_LIBRARIES)/hosttestlib.jar
+TF_JAR := $(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar
+CTS_TF_JAR := $(HOST_OUT_JAVA_LIBRARIES)/cts-tradefed.jar
+CTS_TF_EXEC_PATH ?= $(HOST_OUT_EXECUTABLES)/cts-tradefed
+
+cts_prebuilt_jar := $(HOST_OUT)/cts/android-cts/tools/cts-prebuilt.jar
+$(cts_prebuilt_jar): PRIVATE_TESTS_DIR := $(HOST_OUT)/cts/android-cts/repository/testcases
+$(cts_prebuilt_jar): PRIVATE_PLANS_DIR := $(HOST_OUT)/cts/android-cts/repository/plans
+$(cts_prebuilt_jar): PRIVATE_TOOLS_DIR := $(HOST_OUT)/cts/android-cts/tools
+$(cts_prebuilt_jar): $(JUNIT_HOST_JAR) $(HOSTTESTLIB_JAR) $(TF_JAR) $(CTS_TF_JAR) $(CTS_TF_EXEC_PATH) $(ADDITIONAL_TF_JARS) | $(ACP) $(HOST_OUT_EXECUTABLES)/adb
+	mkdir -p $(PRIVATE_TESTS_DIR)
+	mkdir -p $(PRIVATE_PLANS_DIR)
+	mkdir -p $(PRIVATE_TOOLS_DIR)
+	$(ACP) -fp $(JUNIT_HOST_JAR) $(HOSTTESTLIB_JAR) $(TF_JAR) $(CTS_TF_JAR) $(CTS_TF_EXEC_PATH) $(ADDITIONAL_TF_JARS) $(PRIVATE_TOOLS_DIR)
+
+.PHONY: cts-harness
+cts-harness : $(cts_prebuilt_jar)
+
+# Put the test coverage report in the dist dir if "cts" is among the build goals.
+ifneq ($(filter cts, $(MAKECMDGOALS)),)
+  $(call dist-for-goals,cts,$(CTS_TF_JAR))
+  $(call dist-for-goals,cts,$(HOSTTESTLIB_JAR))
+endif
+
 include $(call all-subdir-makefiles)
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiClass.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiClass.java
index 2a62aa0..73cea67 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiClass.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiClass.java
@@ -24,6 +24,8 @@
 /** Representation of a class in the API with constructors and methods. */
 class ApiClass implements Comparable<ApiClass>, HasCoverage {
 
+    private static final String VOID = "void";
+
     private final String mName;
 
     private final boolean mDeprecated;
@@ -34,10 +36,25 @@
 
     private final List<ApiMethod> mApiMethods = new ArrayList<ApiMethod>();
 
-    ApiClass(String name, boolean deprecated, boolean classAbstract) {
+    private final String mSuperClassName;
+
+    private ApiClass mSuperClass;
+
+    /**
+     * @param name The name of the class
+     * @param deprecated true iff the class is marked as deprecated
+     * @param classAbstract true iff the class is abstract
+     * @param superClassName The fully qualified name of the super class
+     */
+    ApiClass(
+            String name,
+            boolean deprecated,
+            boolean classAbstract,
+            String superClassName) {
         mName = name;
         mDeprecated = deprecated;
         mAbstract = classAbstract;
+        mSuperClassName = superClassName;
     }
 
     @Override
@@ -54,22 +71,20 @@
         return mDeprecated;
     }
 
+    public String getSuperClassName() {
+        return mSuperClassName;
+    }
+
     public boolean isAbstract() {
         return mAbstract;
     }
 
+    public void setSuperClass(ApiClass superClass) { mSuperClass = superClass; }
+
     public void addConstructor(ApiConstructor constructor) {
         mApiConstructors.add(constructor);
     }
 
-    public ApiConstructor getConstructor(List<String> parameterTypes) {
-        for (ApiConstructor constructor : mApiConstructors) {
-            if (parameterTypes.equals(constructor.getParameterTypes())) {
-                return constructor;
-            }
-        }
-        return null;
-    }
 
     public Collection<ApiConstructor> getConstructors() {
         return Collections.unmodifiableList(mApiConstructors);
@@ -79,15 +94,29 @@
         mApiMethods.add(method);
     }
 
-    public ApiMethod getMethod(String name, List<String> parameterTypes, String returnType) {
-        for (ApiMethod method : mApiMethods) {
-            if (name.equals(method.getName())
-                    && parameterTypes.equals(method.getParameterTypes())
-                    && returnType.equals(method.getReturnType())) {
-                return method;
-            }
+    /** Look for a matching constructor and mark it as covered */
+    public void markConstructorCovered(List<String> parameterTypes) {
+        if (mSuperClass != null) {
+            // Mark matching constructors in the superclass
+            mSuperClass.markConstructorCovered(parameterTypes);
         }
-        return null;
+        ApiConstructor apiConstructor = getConstructor(parameterTypes);
+        if (apiConstructor != null) {
+            apiConstructor.setCovered(true);
+        }
+
+    }
+
+    /** Look for a matching method and if found and mark it as covered */
+    public void markMethodCovered(String name, List<String> parameterTypes, String returnType) {
+        if (mSuperClass != null) {
+            // Mark matching methods in the super class
+            mSuperClass.markMethodCovered(name, parameterTypes, returnType);
+        }
+        ApiMethod apiMethod = getMethod(name, parameterTypes, returnType);
+        if (apiMethod != null) {
+            apiMethod.setCovered(true);
+        }
     }
 
     public Collection<ApiMethod> getMethods() {
@@ -121,4 +150,94 @@
             return (float) getNumCoveredMethods() / getTotalMethods() * 100;
         }
     }
+
+    @Override
+    public int getMemberSize() {
+        return getTotalMethods();
+    }
+
+    private ApiMethod getMethod(String name, List<String> parameterTypes, String returnType) {
+        for (ApiMethod method : mApiMethods) {
+            boolean methodNameMatch = name.equals(method.getName());
+            boolean parameterTypeMatch =
+                    compareParameterTypes(method.getParameterTypes(), parameterTypes);
+            boolean returnTypeMatch = compareType(method.getReturnType(), returnType);
+            if (methodNameMatch && parameterTypeMatch && returnTypeMatch) {
+                return method;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * The method compares two lists of parameters. If the {@code apiParameterTypeList} contains
+     * generic types, test parameter types are ignored.
+     *
+     * @param apiParameterTypeList The list of parameter types from the API
+     * @param testParameterTypeList The list of parameter types used in a test
+     * @return true iff the list of types are the same.
+     */
+    private static boolean compareParameterTypes(
+            List<String> apiParameterTypeList, List<String> testParameterTypeList) {
+        if (apiParameterTypeList.equals(testParameterTypeList)) {
+            return true;
+        }
+        if (apiParameterTypeList.size() != testParameterTypeList.size()) {
+            return false;
+        }
+
+        for (int i = 0; i < apiParameterTypeList.size(); i++) {
+            String apiParameterType = apiParameterTypeList.get(i);
+            String testParameterType = testParameterTypeList.get(i);
+            if (!compareType(apiParameterType, testParameterType)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Compare class types.
+     * @param apiType The type as reported by the api
+     * @param testType The type as found used in a test
+     * @return true iff the strings are equal,
+     * or the apiType is generic and the test type is not void
+     */
+    private static boolean compareType(String apiType, String testType) {
+        return apiType.equals(testType) ||
+                isGenericType(apiType) && !testType.equals(VOID) ||
+                isGenericArrayType(apiType) && isArrayType(testType) ;
+    }
+
+    /**
+     * @return true iff the given parameterType is a generic type.
+     */
+    private static boolean isGenericType(String type) {
+        return type.length() == 1 &&
+                type.charAt(0) >= 'A' &&
+                type.charAt(0) <= 'Z';
+    }
+
+    /**
+     * @return true iff {@code type} ends with an [].
+     */
+    private static boolean isArrayType(String type) {
+        return type.endsWith("[]");
+    }
+
+    /**
+     * @return true iff the given parameterType is an array of generic type.
+     */
+    private static boolean isGenericArrayType(String type) {
+        return type.length() == 3 && isGenericType(type.substring(0, 1)) && isArrayType(type);
+    }
+
+    private ApiConstructor getConstructor(List<String> parameterTypes) {
+        for (ApiConstructor constructor : mApiConstructors) {
+            if (compareParameterTypes(constructor.getParameterTypes(), parameterTypes)) {
+                return constructor;
+            }
+        }
+        return null;
+    }
 }
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiCoverage.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiCoverage.java
index adf2ea9..953aab3 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiCoverage.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiCoverage.java
@@ -39,10 +39,11 @@
         return Collections.unmodifiableCollection(mPackages.values());
     }
 
-    public void removeEmptyAbstractClasses() {
+    /** Iterate through all packages and update all classes to include its superclass */
+    public void resolveSuperClasses() {
         for (Map.Entry<String, ApiPackage> entry : mPackages.entrySet()) {
             ApiPackage pkg = entry.getValue();
-            pkg.removeEmptyAbstractClasses();
+            pkg.resolveSuperClasses(mPackages);
         }
     }
 }
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiMethod.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiMethod.java
index 053cd12..582c2b6 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiMethod.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiMethod.java
@@ -29,15 +29,35 @@
 
     private final String mReturnType;
 
-    private boolean mDeprecated;
+    private final boolean mDeprecated;
+
+    private final String mVisibility;
+
+    private final boolean mStaticMethod;
+
+    private final boolean mFinalMethod;
+
+    private final boolean mAbstractMethod;
 
     private boolean mIsCovered;
 
-    ApiMethod(String name, List<String> parameterTypes, String returnType, boolean deprecated) {
+    ApiMethod(
+            String name,
+            List<String> parameterTypes,
+            String returnType,
+            boolean deprecated,
+            String visibility,
+            boolean staticMethod,
+            boolean finalMethod,
+            boolean abstractMethod) {
         mName = name;
         mParameterTypes = new ArrayList<String>(parameterTypes);
         mReturnType = returnType;
         mDeprecated = deprecated;
+        mVisibility = visibility;
+        mStaticMethod = staticMethod;
+        mFinalMethod = finalMethod;
+        mAbstractMethod = abstractMethod;
     }
 
     @Override
@@ -65,6 +85,14 @@
         return mIsCovered;
     }
 
+    public String getVisibility() { return mVisibility; }
+
+    public boolean isAbstractMethod() { return mAbstractMethod; }
+
+    public boolean isStaticMethod() { return mStaticMethod; }
+
+    public boolean isFinalMethod() { return mFinalMethod; }
+
     public void setCovered(boolean covered) {
         mIsCovered = covered;
     }
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiPackage.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiPackage.java
index c83256c..7be7e3c 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiPackage.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiPackage.java
@@ -72,14 +72,31 @@
         return (float) getNumCoveredMethods() / getTotalMethods() * 100;
     }
 
-    public void removeEmptyAbstractClasses() {
+    @Override
+    public int getMemberSize() {
+        return getTotalMethods();
+    }
+
+    /** Iterate through all classes and add superclass. */
+    public void resolveSuperClasses(Map<String, ApiPackage> packageMap) {
         Iterator<Entry<String, ApiClass>> it = mApiClassMap.entrySet().iterator();
         while (it.hasNext()) {
             Map.Entry<String, ApiClass> entry = it.next();
-            ApiClass cls = entry.getValue();
-            if (cls.isAbstract() && (cls.getTotalMethods() == 0)) {
-                // this is essentially interface
-                it.remove();
+            ApiClass apiClass = entry.getValue();
+            if (apiClass.getSuperClassName() != null) {
+                String superClassName = apiClass.getSuperClassName();
+                // Split the fully qualified class name into package and class name.
+                String packageName = superClassName.substring(0, superClassName.lastIndexOf('.'));
+                String className = superClassName.substring(
+                        superClassName.lastIndexOf('.') + 1, superClassName.length());
+                if (packageMap.containsKey(packageName)) {
+                    ApiPackage apiPackage = packageMap.get(packageName);
+                    ApiClass superClass = apiPackage.getClass(className);
+                    if (superClass != null) {
+                        // Add the super class
+                        apiClass.setSuperClass(superClass);
+                    }
+                }
             }
         }
     }
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/CtsApiCoverage.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/CtsApiCoverage.java
index d596cba..3f2f353 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/CtsApiCoverage.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/CtsApiCoverage.java
@@ -71,8 +71,7 @@
         int format = FORMAT_TXT;
         String dexDeps = "dexDeps";
         String apiXmlPath = "";
-        // By default only care about packages starting with "android"
-        String packageFilter = "android";
+        PackageFilter packageFilter = new PackageFilter();
         String reportTitle = "CTS API Coverage";
 
         for (int i = 0; i < args.length; i++) {
@@ -95,7 +94,7 @@
                 } else if ("-a".equals(args[i])) {
                     apiXmlPath = getExpectedArg(args, ++i);
                 } else if ("-p".equals(args[i])) {
-                    packageFilter = getExpectedArg(args, ++i);
+                    packageFilter.addPrefixToFilter(getExpectedArg(args, ++i));
                 } else if ("-t".equals(args[i])) {
                     reportTitle = getExpectedArg(args, ++i);
                 } else {
@@ -118,7 +117,8 @@
          */
 
         ApiCoverage apiCoverage = getEmptyApiCoverage(apiXmlPath);
-        apiCoverage.removeEmptyAbstractClasses();
+        // Add superclass information into api coverage.
+        apiCoverage.resolveSuperClasses();
         for (File testApk : testApks) {
             addApiCoverage(apiCoverage, testApk, dexDeps);
         }
@@ -188,7 +188,7 @@
     }
 
     private static void outputCoverageReport(ApiCoverage apiCoverage, List<File> testApks,
-            File outputFile, int format, String packageFilter, String reportTitle)
+            File outputFile, int format, PackageFilter packageFilter, String reportTitle)
                 throws IOException, TransformerException, InterruptedException {
 
         OutputStream out = outputFile != null
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/CurrentXmlHandler.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/CurrentXmlHandler.java
index b9f9e9c..de9f5d5 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/CurrentXmlHandler.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/CurrentXmlHandler.java
@@ -40,6 +40,12 @@
 
     private boolean mCurrentMethodIsAbstract;
 
+    private String mCurrentMethodVisibility;
+
+    private boolean mCurrentMethodStaticMethod;
+
+    private boolean mCurrentMethodFinalMethod;
+
     private boolean mDeprecated;
 
 
@@ -69,7 +75,9 @@
             mIgnoreCurrentClass = false;
             mCurrentClassName = getValue(attributes, "name");
             mDeprecated = isDeprecated(attributes);
-            ApiClass apiClass = new ApiClass(mCurrentClassName, mDeprecated, isAbstract(attributes));
+            String superClass = attributes.getValue("extends");
+            ApiClass apiClass = new ApiClass(
+                    mCurrentClassName, mDeprecated, is(attributes, "abstract"), superClass);
             ApiPackage apiPackage = mApiCoverage.getPackage(mCurrentPackageName);
             apiPackage.addClass(apiClass);
         } else if ("interface".equalsIgnoreCase(localName)) {
@@ -82,7 +90,10 @@
             mDeprecated = isDeprecated(attributes);
             mCurrentMethodName = getValue(attributes, "name");
             mCurrentMethodReturnType = getValue(attributes, "return");
-            mCurrentMethodIsAbstract = isAbstract(attributes);
+            mCurrentMethodIsAbstract = is(attributes, "abstract");
+            mCurrentMethodVisibility = getValue(attributes, "visibility");
+            mCurrentMethodStaticMethod = is(attributes, "static");
+            mCurrentMethodFinalMethod = is(attributes, "final");
             mCurrentParameterTypes.clear();
         } else if ("parameter".equalsIgnoreCase(localName)) {
             mCurrentParameterTypes.add(getValue(attributes, "type"));
@@ -107,11 +118,15 @@
             ApiClass apiClass = apiPackage.getClass(mCurrentClassName);
             apiClass.addConstructor(apiConstructor);
         }  else if ("method".equalsIgnoreCase(localName)) {
-            if (mCurrentMethodIsAbstract) { // do not add abstract method
-                return;
-            }
-            ApiMethod apiMethod = new ApiMethod(mCurrentMethodName, mCurrentParameterTypes,
-                    mCurrentMethodReturnType, mDeprecated);
+            ApiMethod apiMethod = new ApiMethod(
+                    mCurrentMethodName,
+                    mCurrentParameterTypes,
+                    mCurrentMethodReturnType,
+                    mDeprecated,
+                    mCurrentMethodVisibility,
+                    mCurrentMethodStaticMethod,
+                    mCurrentMethodFinalMethod,
+                    mCurrentMethodIsAbstract);
             ApiPackage apiPackage = mApiCoverage.getPackage(mCurrentPackageName);
             ApiClass apiClass = apiPackage.getClass(mCurrentClassName);
             apiClass.addMethod(apiMethod);
@@ -129,8 +144,8 @@
         return "deprecated".equals(attributes.getValue("deprecated"));
     }
 
-    private boolean isAbstract(Attributes attributes) {
-        return "true".equals(attributes.getValue("abstract"));
+    private static boolean is(Attributes attributes, String valueName) {
+        return "true".equals(attributes.getValue(valueName));
     }
 
     private boolean isEnum(Attributes attributes) {
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/DexDepsXmlHandler.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/DexDepsXmlHandler.java
index 0a90bdd..3df532e 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/DexDepsXmlHandler.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/DexDepsXmlHandler.java
@@ -73,10 +73,7 @@
             if (apiPackage != null) {
                 ApiClass apiClass = apiPackage.getClass(mCurrentClassName);
                 if (apiClass != null) {
-                    ApiConstructor apiConstructor = apiClass.getConstructor(mCurrentParameterTypes);
-                    if (apiConstructor != null) {
-                        apiConstructor.setCovered(true);
-                    }
+                    apiClass.markConstructorCovered(mCurrentParameterTypes);
                 }
             }
         }  else if ("method".equalsIgnoreCase(localName)) {
@@ -84,11 +81,8 @@
             if (apiPackage != null) {
                 ApiClass apiClass = apiPackage.getClass(mCurrentClassName);
                 if (apiClass != null) {
-                    ApiMethod apiMethod = apiClass.getMethod(mCurrentMethodName,
-                            mCurrentParameterTypes, mCurrentMethodReturnType);
-                    if (apiMethod != null) {
-                        apiMethod.setCovered(true);
-                    }
+                    apiClass.markMethodCovered(
+                            mCurrentMethodName, mCurrentParameterTypes, mCurrentMethodReturnType);
                 }
             }
         }
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/HasCoverage.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/HasCoverage.java
index 3b369bb..f8d8054 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/HasCoverage.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/HasCoverage.java
@@ -20,13 +20,33 @@
 
 interface HasCoverage {
     float getCoveragePercentage();
+    int getMemberSize();
     String getName();
 }
 
 class CoverageComparator implements Comparator<HasCoverage> {
     public int compare(HasCoverage entity, HasCoverage otherEntity) {
-        int diff = Math.round(entity.getCoveragePercentage())
-                - Math.round(otherEntity.getCoveragePercentage());
-        return diff != 0 ? diff : entity.getName().compareTo(otherEntity.getName());
+        int lhsPct = Math.round(entity.getCoveragePercentage());
+        int rhsPct = Math.round(otherEntity.getCoveragePercentage());
+        int diff = Integer.compare(getCoveragePercentageSegment(lhsPct),
+                getCoveragePercentageSegment(rhsPct));
+        return diff != 0 ? diff :
+            Integer.compare(otherEntity.getMemberSize(), entity.getMemberSize());
+    }
+
+    /**
+     * Distill coverage percentage down to 3 major segments
+     * @param coveragePercentage
+     * @return
+     */
+    private int getCoveragePercentageSegment(int coveragePercentage) {
+        // note that this segmentation logic is duplicated in api-coverage.xsl
+        if (coveragePercentage <= 50) {
+            return 0;
+        } else if (coveragePercentage <= 80) {
+            return 1;
+        } else {
+            return 2;
+        }
     }
 }
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java
index dfe609d..0e6b54a 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java
@@ -37,7 +37,7 @@
 class HtmlReport {
 
     public static void printHtmlReport(final List<File> testApks, final ApiCoverage apiCoverage,
-            final String packageFilter, final String reportTitle, final OutputStream out)
+            final PackageFilter packageFilter, final String reportTitle, final OutputStream out)
                 throws IOException, TransformerException {
         final PipedOutputStream xmlOut = new PipedOutputStream();
         final PipedInputStream xmlIn = new PipedInputStream(xmlOut);
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/PackageFilter.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/PackageFilter.java
new file mode 100644
index 0000000..b196d8f
--- /dev/null
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/PackageFilter.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.apicoverage;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Util class to support package filtering logic
+ * <p>
+ * A list of package prefixes can be added to the filter, and {{@link #accept(String)} method will
+ * decide if the provided package name matches any of the prefixes.
+ */
+public class PackageFilter {
+
+    private List<String> mFilters = new ArrayList<>();
+
+    /**
+     * Check if a particular package name matches any of the package prefixes configured in filter.
+     * If no filters are configured, any package names will be accepted
+     * @param packageName
+     * @return
+     */
+    public boolean accept(String packageName) {
+        if (mFilters.isEmpty()) {
+            return true;
+        }
+        for (String filter : mFilters) {
+            if (packageName.startsWith(filter)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public void addPrefixToFilter(String prefix) {
+        mFilters.add(prefix);
+    }
+
+    public void clearFilter() {
+        mFilters.clear();
+    }
+}
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/TextReport.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/TextReport.java
index 23b44c3..3adc020 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/TextReport.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/TextReport.java
@@ -27,7 +27,8 @@
  */
 class TextReport {
 
-    public static void printTextReport(ApiCoverage api, String packageFilter, OutputStream outputStream) {
+    public static void printTextReport(ApiCoverage api, PackageFilter packageFilter,
+            OutputStream outputStream) {
         PrintStream out = new PrintStream(outputStream);
 
         CoverageComparator comparator = new CoverageComparator();
@@ -35,8 +36,7 @@
         Collections.sort(packages, comparator);
 
         for (ApiPackage apiPackage : packages) {
-            if (apiPackage.getName().startsWith(packageFilter)
-                    && apiPackage.getTotalMethods() > 0) {
+            if (packageFilter.accept(apiPackage.getName()) && apiPackage.getTotalMethods() > 0) {
                 printPackage(apiPackage, out);
             }
         }
@@ -45,7 +45,7 @@
         out.println();
 
         for (ApiPackage apiPackage : packages) {
-            if (apiPackage.getName().startsWith(packageFilter)) {
+            if (packageFilter.accept(apiPackage.getName())) {
                 printPackage(apiPackage, out);
 
                 List<ApiClass> classes = new ArrayList<ApiClass>(apiPackage.getClasses());
@@ -103,7 +103,18 @@
     private static void printMethod(ApiMethod method, PrintStream out) {
         StringBuilder builder = new StringBuilder("    [")
                 .append(method.isCovered() ? "X" : " ")
-                .append("] ").append(method.getReturnType()).append(" ")
+                .append("] ")
+                .append(method.getVisibility()).append(" ");
+        if (method.isAbstractMethod()) {
+            builder.append("abstract ");
+        }
+        if (method.isStaticMethod()) {
+            builder.append("static ");
+        }
+        if (method.isFinalMethod()) {
+            builder.append("final ");
+        }
+        builder.append(method.getReturnType()).append(" ")
                 .append(method.getName()).append("(");
         List<String> parameterTypes = method.getParameterTypes();
         int numParameterTypes = parameterTypes.size();
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java
index df10fa4..4310d20 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java
@@ -32,7 +32,7 @@
 class XmlReport {
 
     public static void printXmlReport(List<File> testApks, ApiCoverage apiCoverage,
-            String packageFilter, String reportTitle, OutputStream outputStream) {
+            PackageFilter packageFilter, String reportTitle, OutputStream outputStream) {
         PrintStream out = new PrintStream(outputStream);
         out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
         out.println("<?xml-stylesheet type=\"text/xsl\"  href=\"api-coverage.xsl\"?>");
@@ -57,8 +57,7 @@
         int totalMethods = 0;
         int totalCoveredMethods = 0;
         for (ApiPackage pkg : packages) {
-            if (pkg.getName().startsWith(packageFilter)
-                   && pkg.getTotalMethods() > 0) {
+            if (packageFilter.accept(pkg.getName()) && pkg.getTotalMethods() > 0) {
                 int pkgTotal = pkg.getTotalMethods();
                 totalMethods += pkgTotal;
                 int pkgTotalCovered = pkg.getNumCoveredMethods();
@@ -67,7 +66,7 @@
                         + "\" numCovered=\"" + pkgTotalCovered
                         + "\" numTotal=\"" + pkgTotal
                         + "\" coveragePercentage=\""
-                            + Math.round(pkg.getCoveragePercentage())
+                        + Math.round(pkg.getCoveragePercentage())
                         + "\">");
 
                 List<ApiClass> classes = new ArrayList<ApiClass>(pkg.getClasses());
@@ -104,6 +103,10 @@
                             out.println("<method name=\"" + method.getName()
                                     + "\" returnType=\"" + method.getReturnType()
                                     + "\" deprecated=\"" + method.isDeprecated()
+                                    + "\" static=\"" + method.isStaticMethod()
+                                    + "\" final=\"" + method.isFinalMethod()
+                                    + "\" visibility=\"" + method.getVisibility()
+                                    + "\" abstract=\"" + method.isAbstractMethod()
                                     + "\" covered=\"" + method.isCovered() + "\">");
                             if (method.isDeprecated()) {
                                 if (method.isCovered()) {
diff --git a/tools/cts-api-coverage/src/res/api-coverage.xsl b/tools/cts-api-coverage/src/res/api-coverage.xsl
index 1ac3402..1a56eb0 100644
--- a/tools/cts-api-coverage/src/res/api-coverage.xsl
+++ b/tools/cts-api-coverage/src/res/api-coverage.xsl
@@ -21,6 +21,7 @@
     <xsl:template match="/">
         <html>
             <head>
+                <title><xsl:value-of select="api-coverage/@title" /></title>
                 <script type="text/javascript">
                     function toggleVisibility(id) {
                         element = document.getElementById(id); 
@@ -87,7 +88,7 @@
                 &nbsp;(<xsl:value-of select="api-coverage/total/@numCovered" />/<xsl:value-of select="api-coverage/total/@numTotal" />)
                 </div>
                 <div class="apks" onclick="toggleVisibility('sourceApks')">
-                    Source APKs (<xsl:value-of select="count(api-coverage/debug/sources/apk)" />)
+                    Source Modules (<xsl:value-of select="count(api-coverage/debug/sources/apk)" />)
                 </div>
                 <div id="sourceApks" style="display: none">
                     <ul>
@@ -100,14 +101,17 @@
                     <xsl:for-each select="api-coverage/api/package">
                         <xsl:call-template name="packageOrClassListItem">
                             <xsl:with-param name="bulletClass" select="'package'" />
+                            <xsl:with-param name="toggleId" select="@name" />
                         </xsl:call-template>
                         <div class="packageDetails" id="{@name}" style="display: none">
                             <ul>
                                 <xsl:for-each select="class">
+                                    <xsl:variable name="packageClassId" select="concat(../@name, '.', @name)"/>
                                     <xsl:call-template name="packageOrClassListItem">
                                         <xsl:with-param name="bulletClass" select="'class'" />
+                                        <xsl:with-param name="toggleId" select="$packageClassId" />
                                     </xsl:call-template>
-                                    <div class="classDetails" id="{@name}" style="display: none">
+                                    <div class="classDetails" id="{$packageClassId}" style="display: none">
                                         <xsl:for-each select="constructor">
                                             <xsl:call-template name="methodListItem" />
                                         </xsl:for-each>
@@ -123,9 +127,10 @@
             </body>
         </html>
     </xsl:template>
-    
+
     <xsl:template name="packageOrClassListItem">
         <xsl:param name="bulletClass" />
+        <xsl:param name="toggleId"/>
 
         <xsl:variable name="colorClass">
             <xsl:choose>
@@ -134,7 +139,7 @@
                 <xsl:otherwise>green</xsl:otherwise>
             </xsl:choose>
         </xsl:variable>
-        
+
         <xsl:variable name="deprecatedClass">
             <xsl:choose>
                 <xsl:when test="@deprecated = 'true'">deprecated</xsl:when>
@@ -142,15 +147,15 @@
             </xsl:choose>
         </xsl:variable>
 
-        <li class="{$bulletClass}" onclick="toggleVisibility('{@name}')">
+        <li class="{$bulletClass}" onclick="toggleVisibility('{$toggleId}')">
             <span class="{$colorClass} {$deprecatedClass}">
                 <b><xsl:value-of select="@name" /></b>
                 &nbsp;<xsl:value-of select="@coveragePercentage" />%
                 &nbsp;(<xsl:value-of select="@numCovered" />/<xsl:value-of select="@numTotal" />)
             </span>
-        </li>   
+        </li>
     </xsl:template>
-  
+
   <xsl:template name="methodListItem">
 
     <xsl:variable name="deprecatedClass">
@@ -165,6 +170,10 @@
         <xsl:when test="@covered = 'true'">[X]</xsl:when>
         <xsl:otherwise>[ ]</xsl:otherwise>
       </xsl:choose>
+      <xsl:if test="@visibility != ''">&nbsp;<xsl:value-of select="@visibility" /></xsl:if>
+      <xsl:if test="@abstract = 'true'">&nbsp;abstract</xsl:if>
+      <xsl:if test="@static = 'true'">&nbsp;static</xsl:if>
+      <xsl:if test="@final = 'true'">&nbsp;final</xsl:if>
       <xsl:if test="@returnType != ''">&nbsp;<xsl:value-of select="@returnType" /></xsl:if>
       <b>&nbsp;<xsl:value-of select="@name" /></b><xsl:call-template name="formatParameters" />
     </span>
diff --git a/tools/cts-device-info/Android.mk b/tools/cts-device-info/Android.mk
new file mode 100644
index 0000000..5f2b223
--- /dev/null
+++ b/tools/cts-device-info/Android.mk
@@ -0,0 +1,28 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+DEVICE_INFO_PERMISSIONS :=
+
+DEVICE_INFO_ACTIVITIES :=
+
+LOCAL_PACKAGE_NAME := CtsDeviceInfo
+
+include $(BUILD_CTS_DEVICE_INFO_PACKAGE)
+
diff --git a/tools/cts-device-info/src/com/android/cts/deviceinfo/SampleDeviceInfo.java b/tools/cts-device-info/src/com/android/cts/deviceinfo/SampleDeviceInfo.java
new file mode 100644
index 0000000..886193c
--- /dev/null
+++ b/tools/cts-device-info/src/com/android/cts/deviceinfo/SampleDeviceInfo.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.deviceinfo;
+
+import android.os.Bundle;
+
+import com.android.compatibility.common.deviceinfo.DeviceInfoActivity;
+
+/**
+ * Sample device info collector.
+ */
+public class SampleDeviceInfo extends DeviceInfoActivity {
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+
+    @Override
+    protected void collectDeviceInfo() {
+        boolean[] booleans = {Boolean.TRUE, Boolean.FALSE};
+        double[] doubles = {Double.MAX_VALUE, Double.MIN_VALUE};
+        int[] ints = {Integer.MAX_VALUE, Integer.MIN_VALUE};
+        long[] longs = {Long.MAX_VALUE, Long.MIN_VALUE};
+
+        // Group Foo
+        startGroup("foo");
+        addResult("foo_boolean", Boolean.TRUE);
+
+        // Group Bar
+        startGroup("bar");
+        addArray("bar_string", new String[] {
+                "bar-string-1",
+                "bar-string-2",
+                "bar-string-3"});
+
+        addArray("bar_boolean", booleans);
+        addArray("bar_double", doubles);
+        addArray("bar_int", ints);
+        addArray("bar_long", longs);
+        endGroup(); // bar
+
+        addResult("foo_double", Double.MAX_VALUE);
+        addResult("foo_int", Integer.MAX_VALUE);
+        addResult("foo_long", Long.MAX_VALUE);
+        addResult("foo_string", "foo-string");
+        endGroup(); // foo
+    }
+}
+
diff --git a/tools/cts-java-scanner/src/com/android/cts/javascanner/DocletRunner.java b/tools/cts-java-scanner/src/com/android/cts/javascanner/DocletRunner.java
index 94761fb..fb6691d 100644
--- a/tools/cts-java-scanner/src/com/android/cts/javascanner/DocletRunner.java
+++ b/tools/cts-java-scanner/src/com/android/cts/javascanner/DocletRunner.java
@@ -89,6 +89,7 @@
         List<String> classPath = new ArrayList<String>();
         classPath.add("./prebuilts/misc/common/tradefed/tradefed-prebuilt.jar");
         classPath.add("./prebuilts/misc/common/ub-uiautomator/ub-uiautomator.jar");
+        classPath.add("./prebuilts/misc/common/ub-janktesthelper/ub-janktesthelper.jar");
         return join(classPath, ":");
     }
 
diff --git a/tools/cts-media/copy_media.sh b/tools/cts-media/copy_media.sh
new file mode 100755
index 0000000..cf0d099
--- /dev/null
+++ b/tools/cts-media/copy_media.sh
@@ -0,0 +1,68 @@
+#!/bin/sh
+# Copyright (C) 2012 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.
+#
+adb_options=" "
+max_resolution=3
+if [ $# -eq 0 ]; then
+  echo "assuming default resolution"
+elif [ "$1" == "-s" ]; then
+  adb_options=""$1" "$2""
+elif [ "$1" == "720x480" ]; then
+  max_resolution=1
+elif [ "$1" == "1280x720" ]; then
+  max_resolution=2
+elif [ "$1" == "1920x1080" ]; then
+  max_resolution=3
+elif [ "$1" == "all" ]; then
+  max_resolution=3
+else
+  echo "Usage: copy_media.sh [720x480|1280x720|1920x1080] [-s serial]"
+  echo "  for testing up to 1280x720, copy_media.sh 1280x720"
+  echo "  default resolution, when no argument is specified, is 1920x1080"
+  echo "  copy_media.sh all will copy all the files."
+  exit
+fi
+
+if [ $# -gt 2 ]; then
+  echo "adb option exists"
+  adb_options=""$2" "$3""
+fi
+
+echo "max resolution is $1"
+echo "adb options "$adb_options""
+
+if [ $max_resolution -ge 3 ]; then
+  echo "copying 1920x1080"
+  adb $adb_options push bbb_short/1920x1080 /sdcard/test/bbb_short/1920x1080
+  adb $adb_options push bbb_full/1920x1080 /sdcard/test/bbb_full/1920x1080
+fi
+
+if [ $max_resolution -ge 2 ]; then
+  echo "copying 1280x720"
+  adb $adb_options push bbb_short/1280x720 /sdcard/test/bbb_short/1280x720
+  adb $adb_options push bbb_full/1280x720 /sdcard/test/bbb_full/1280x720
+fi
+
+if [ $max_resolution -ge 1 ]; then
+  echo "copying 720x480"
+  adb $adb_options push bbb_short/720x480 /sdcard/test/bbb_short/720x480
+  adb $adb_options push bbb_full/720x480 /sdcard/test/bbb_full/720x480
+fi
+
+echo "copying all others"
+adb $adb_options push bbb_short/176x144 /sdcard/test/bbb_short/176x144
+adb $adb_options push bbb_full/176x144 /sdcard/test/bbb_full/176x144
+adb $adb_options push bbb_short/480x360 /sdcard/test/bbb_short/480x360
+adb $adb_options push bbb_full/480x360 /sdcard/test/bbb_full/480x360
diff --git a/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/XmlGenerator.java b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/XmlGenerator.java
index 833bf69..328b855 100644
--- a/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/XmlGenerator.java
+++ b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/XmlGenerator.java
@@ -20,6 +20,7 @@
 
 import vogar.Expectation;
 import vogar.ExpectationStore;
+import vogar.Result;
 
 import java.io.File;
 import java.io.FileOutputStream;
@@ -228,7 +229,8 @@
     }
 
     public static boolean isKnownFailure(ExpectationStore expectationStore, String testName) {
-        return expectationStore != null && expectationStore.get(testName) != Expectation.SUCCESS;
+        return expectationStore != null
+            && expectationStore.get(testName).getResult() != Result.SUCCESS;
     }
 
     // Returns the list of ABIs supported by this TestCase on this architecture.
diff --git a/tools/device-setup/TestDeviceSetup/Android.mk b/tools/device-setup/TestDeviceSetup/Android.mk
index 44e66bb..02c20d4 100644
--- a/tools/device-setup/TestDeviceSetup/Android.mk
+++ b/tools/device-setup/TestDeviceSetup/Android.mk
@@ -29,7 +29,7 @@
 
 LOCAL_PACKAGE_NAME := TestDeviceSetup
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_SUPPORT_PACKAGE)
 
 # ======================================================
 # also build a static host library for the device info constants
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java
index 8fb61bf..4ba1160d 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java
@@ -50,6 +50,8 @@
     public static final String RESOLUTION = "resolution";
     public static final String VERSION_SDK = "androidPlatformVersion";
     public static final String VERSION_RELEASE = "buildVersion";
+    public static final String VERSION_BASE_OS = "base_os";
+    public static final String VERSION_SECURITY_PATCH = "security_patch";
     public static final String BUILD_ABI = "build_abi";
     public static final String BUILD_ABI2 = "build_abi2";
     public static final String BUILD_ABIS = "build_abis";
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java
index 5828259..51da850 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java
@@ -80,6 +80,8 @@
 
         addResult(VERSION_RELEASE, Build.VERSION.RELEASE);
         addResult(VERSION_SDK, Build.VERSION.SDK);
+        addResult(VERSION_BASE_OS, Build.VERSION.BASE_OS);
+        addResult(VERSION_SECURITY_PATCH, Build.VERSION.SECURITY_PATCH);
 
         DisplayMetrics metrics = new DisplayMetrics();
         WindowManager wm = (WindowManager) getContext().getSystemService(
diff --git a/tools/junit/Android.mk b/tools/junit/Android.mk
index b581149..90e6924 100644
--- a/tools/junit/Android.mk
+++ b/tools/junit/Android.mk
@@ -21,3 +21,7 @@
 LOCAL_STATIC_JAVA_LIBRARIES := junit4-target
 LOCAL_DEX_PREOPT := false
 include $(BUILD_JAVA_LIBRARY)
+
+cts_library_jar := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).jar
+$(cts_library_jar): $(LOCAL_BUILT_MODULE)
+	$(copy-file-to-target)
diff --git a/tools/tradefed-host/Android.mk b/tools/tradefed-host/Android.mk
index bd28575..1f73e95 100644
--- a/tools/tradefed-host/Android.mk
+++ b/tools/tradefed-host/Android.mk
@@ -27,6 +27,8 @@
 LOCAL_JAVA_LIBRARIES := tradefed-prebuilt hosttestlib
 LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceinfolib
 
+LOCAL_JAR_MANIFEST := MANIFEST.mf
+
 LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 
 include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/tools/tradefed-host/MANIFEST.mf b/tools/tradefed-host/MANIFEST.mf
new file mode 100644
index 0000000..5528c06
--- /dev/null
+++ b/tools/tradefed-host/MANIFEST.mf
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: com.android.cts.tradefed.testtype
+Implementation-Version: %BUILD_NUMBER%
diff --git a/tools/tradefed-host/res/config/common-config.xml b/tools/tradefed-host/res/config/common-config.xml
new file mode 100644
index 0000000..e1ac66d
--- /dev/null
+++ b/tools/tradefed-host/res/config/common-config.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="Common base configuration for CTS module">
+    <!--
+      This common base configuration contains some commonly used preparers
+      -->
+    <target_preparer class="com.android.cts.tradefed.targetprep.CtsFilePusher">
+        <option name="cleanup" value="true" />
+    </target_preparer>
+    <target_preparer class="com.android.cts.tradefed.targetprep.CtsApkInstaller">
+        <option name="cleanup-apks" value="true" />
+    </target_preparer>
+    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer" />
+</configuration>
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java b/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java
index 16860d5..fa930df 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java
@@ -31,7 +31,8 @@
     @Option(name="cts-install-path", description="the path to the cts installation to use")
     private String mCtsRootDirPath = System.getProperty("CTS_ROOT");
 
-    public static final String CTS_BUILD_VERSION = "5.1_r1";
+    public static final String CTS_BUILD_VERSION = "6.0_r0";
+    public static final String CTS_PACKAGE = "com.android.cts.tradefed.testtype";
 
     /**
      * {@inheritDoc}
@@ -41,7 +42,9 @@
         if (mCtsRootDirPath == null) {
             throw new IllegalArgumentException("Missing --cts-install-path");
         }
-        IFolderBuildInfo ctsBuild = new FolderBuildInfo(CTS_BUILD_VERSION, "cts", "cts");
+        IFolderBuildInfo ctsBuild = new FolderBuildInfo(
+            Package.getPackage(CTS_PACKAGE).getImplementationVersion(),
+            "cts", "cts");
         ctsBuild.setRootDir(new File(mCtsRootDirPath));
         return ctsBuild;
     }
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java b/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java
index ca4e050..24239e6 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java
@@ -24,6 +24,7 @@
 import com.android.cts.tradefed.testtype.ITestPackageRepo;
 import com.android.cts.tradefed.testtype.TestPackageRepo;
 import com.android.cts.util.AbiUtils;
+import com.android.tradefed.build.IFolderBuildInfo;
 import com.android.tradefed.command.Console;
 import com.android.tradefed.config.ArgsOptionParser;
 import com.android.tradefed.config.ConfigurationException;
@@ -48,7 +49,8 @@
 
     protected static final String ADD_PATTERN = "a(?:dd)?";
 
-    private CtsBuildHelper mCtsBuild = null;
+    private IFolderBuildInfo mBuildInfo = null;
+    private CtsBuildHelper mBuildHelper = null;
 
     CtsConsole() {
         super();
@@ -56,7 +58,8 @@
 
     @Override
     public void run() {
-        printLine(String.format("Android CTS %s", CtsBuildProvider.CTS_BUILD_VERSION));
+        printLine(String.format("Android CTS %s build:%s",
+                CtsBuildProvider.CTS_BUILD_VERSION, getCtsBuildInfo().getBuildId()));
         super.run();
     }
 
@@ -69,7 +72,7 @@
         trie.put(new Runnable() {
             @Override
             public void run() {
-                CtsBuildHelper ctsBuild = getCtsBuild();
+                CtsBuildHelper ctsBuild = getCtsBuildHelper();
                 if (ctsBuild != null) {
                     listPlans(ctsBuild);
                 }
@@ -78,7 +81,7 @@
         trie.put(new Runnable() {
             @Override
             public void run() {
-                CtsBuildHelper ctsBuild = getCtsBuild();
+                CtsBuildHelper ctsBuild = getCtsBuildHelper();
                 if (ctsBuild != null) {
                     listPackages(ctsBuild);
                 }
@@ -87,7 +90,7 @@
         trie.put(new Runnable() {
             @Override
             public void run() {
-                CtsBuildHelper ctsBuild = getCtsBuild();
+                CtsBuildHelper ctsBuild = getCtsBuildHelper();
                 if (ctsBuild != null) {
                     listResults(ctsBuild);
                 }
@@ -114,7 +117,7 @@
                 for (int i = 2; i < args.size(); i++) {
                     flatArgs[i - 2] = args.get(i).get(0);
                 }
-                CtsBuildHelper ctsBuild = getCtsBuild();
+                CtsBuildHelper ctsBuild = getCtsBuildHelper();
                 if (ctsBuild != null) {
                     // FIXME may want to only add certain ABIs
                     addDerivedPlan(ctsBuild, AbiUtils.getAbisSupportedByCts(), flatArgs);
@@ -230,22 +233,28 @@
         }
     }
 
-    private CtsBuildHelper getCtsBuild() {
-        if (mCtsBuild == null) {
-            String ctsInstallPath = System.getProperty("CTS_ROOT");
-            if (ctsInstallPath != null) {
-                mCtsBuild = new CtsBuildHelper(new File(ctsInstallPath));
-                try {
-                    mCtsBuild.validateStructure();
-                } catch (FileNotFoundException e) {
-                    printLine(String.format("Invalid cts install: %s", e.getMessage()));
-                    mCtsBuild = null;
-                }
-            } else {
+    private IFolderBuildInfo getCtsBuildInfo() {
+        if (mBuildInfo == null) {
+            try {
+                mBuildInfo = (IFolderBuildInfo) new CtsBuildProvider().getBuild();
+            } catch (IllegalArgumentException e) {
                 printLine("Could not find CTS install location: CTS_ROOT env variable not set");
             }
         }
-        return mCtsBuild;
+        return mBuildInfo;
+    }
+
+    private CtsBuildHelper getCtsBuildHelper() {
+        if (mBuildHelper == null) {
+            try {
+                mBuildHelper = new CtsBuildHelper(getCtsBuildInfo());
+                mBuildHelper.validateStructure();
+            } catch (FileNotFoundException e) {
+                printLine(String.format("Invalid cts install: %s", e.getMessage()));
+                mBuildHelper = null;
+            }
+        }
+        return mBuildHelper;
     }
 
     public static void main(String[] args) throws InterruptedException, ConfigurationException {
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java b/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java
index 903ac74..b5f0dfc 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/device/DeviceInfoCollector.java
@@ -16,7 +16,10 @@
 package com.android.cts.tradefed.device;
 
 import com.android.cts.util.AbiUtils;
+import com.android.cts.tradefed.result.CtsXmlResultReporter;
 import com.android.ddmlib.Log;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.build.IFolderBuildInfo;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.result.ITestInvocationListener;
@@ -39,10 +42,22 @@
     private static final String APK_NAME = "TestDeviceSetup";
     public static final String APP_PACKAGE_NAME = "android.tests.devicesetup";
     private static final String INSTRUMENTATION_NAME = "android.tests.getinfo.DeviceInfoInstrument";
+
+    private static final String EXTENDED_APK_NAME = "CtsDeviceInfo";
+    public static final String EXTENDED_APP_PACKAGE_NAME =
+            "com.android.compatibility.common.deviceinfo";
+    private static final String EXTENDED_INSTRUMENTATION_NAME =
+            "com.android.compatibility.common.deviceinfo.DeviceInfoInstrument";
+    private static final String DEVICE_INFO_FILES = "device-info-files";
+    private static final String DEVICE_RESULT_DIR = "/sdcard/" + DEVICE_INFO_FILES;
+
     public static final Set<String> IDS = new HashSet<String>();
+    public static final Set<String> EXTENDED_IDS = new HashSet<String>();
+
     static {
         for (String abi : AbiUtils.getAbisSupportedByCts()) {
             IDS.add(AbiUtils.createId(abi, APP_PACKAGE_NAME));
+            EXTENDED_IDS.add(AbiUtils.createId(abi, EXTENDED_APP_PACKAGE_NAME));
         }
     }
 
@@ -56,9 +71,36 @@
      */
     public static void collectDeviceInfo(ITestDevice device, String abi, File testApkDir,
             ITestInvocationListener listener) throws DeviceNotAvailableException {
-        File apkFile = new File(testApkDir, String.format("%s.apk", APK_NAME));
+        runInstrumentation(device, abi, testApkDir, listener, APK_NAME, APP_PACKAGE_NAME,
+            INSTRUMENTATION_NAME);
+    }
+
+    /**
+     * Installs and runs the extended device info collector instrumentation, and forwards results
+     * to the listener.
+     *
+     * @param device
+     * @param listener
+     * @throws DeviceNotAvailableException
+     */
+    public static void collectExtendedDeviceInfo(ITestDevice device, String abi, File testApkDir,
+            ITestInvocationListener listener, IBuildInfo buildInfo)
+            throws DeviceNotAvailableException {
+        // Clear files in device test result directory
+        device.executeShellCommand(String.format("rm -rf %s", DEVICE_RESULT_DIR));
+        runInstrumentation(device, abi, testApkDir, listener, EXTENDED_APK_NAME,
+            EXTENDED_APP_PACKAGE_NAME, EXTENDED_INSTRUMENTATION_NAME);
+        // Copy files in remote result directory to local directory
+        pullExtendedDeviceInfoResults(device, buildInfo);
+    }
+
+    private static void runInstrumentation(ITestDevice device, String abi, File testApkDir,
+            ITestInvocationListener listener, String apkName, String packageName,
+            String instrumentName) throws DeviceNotAvailableException {
+        File apkFile = new File(testApkDir, String.format("%s.apk", apkName));
         if (!apkFile.exists()) {
             Log.e(LOG_TAG, String.format("Could not find %s", apkFile.getAbsolutePath()));
+            return;
         }
         // collect the instrumentation bundle results using instrumentation test
         // should work even though no tests will actually be run
@@ -67,9 +109,43 @@
         instrTest.setInstallFile(apkFile);
         // no need to collect tests and re-run
         instrTest.setRerunMode(false);
-        instrTest.setPackageName(APP_PACKAGE_NAME);
-        instrTest.setRunName(AbiUtils.createId(abi, APP_PACKAGE_NAME));
-        instrTest.setRunnerName(INSTRUMENTATION_NAME);
+        instrTest.setPackageName(packageName);
+        instrTest.setRunName(AbiUtils.createId(abi, packageName));
+        instrTest.setRunnerName(instrumentName);
         instrTest.run(listener);
     }
+
+    private static void pullExtendedDeviceInfoResults(ITestDevice device, IBuildInfo buildInfo)
+            throws DeviceNotAvailableException {
+        if (!(buildInfo instanceof IFolderBuildInfo)) {
+            Log.e(LOG_TAG, "Invalid instance of buildInfo");
+            return;
+        }
+        File localResultDir = new File(buildInfo.getBuildAttributes().get(
+                CtsXmlResultReporter.CTS_RESULT_DIR));
+        if (localResultDir == null || !localResultDir.isDirectory()) {
+            Log.e(LOG_TAG, "Local result directory is null or is not a directory");
+            return;
+        }
+
+        localResultDir = new File(localResultDir, DEVICE_INFO_FILES);
+        localResultDir.mkdirs();
+
+        // Pull files from device result directory to local result directory
+        String command = String.format("adb -s %s pull %s %s", device.getSerialNumber(),
+                DEVICE_RESULT_DIR, localResultDir.getAbsolutePath());
+        if (!execute(command)) {
+            Log.e(LOG_TAG, String.format("Failed to run %s", command));
+        }
+    }
+
+    private static boolean execute(String command) {
+        try {
+            Process p = Runtime.getRuntime().exec(new String[] {"/bin/bash", "-c", command});
+            return (p.waitFor() == 0);
+        } catch (Exception e) {
+            Log.e(LOG_TAG, e);
+            return false;
+        }
+    }
 }
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsTestLogReporter.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsTestLogReporter.java
index 5029dfe..b7f064f 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsTestLogReporter.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsTestLogReporter.java
@@ -43,6 +43,7 @@
     private TestResults mResults = new TestResults();
     private TestPackageResult mCurrentPkgResult = null;
     private boolean mIsDeviceInfoRun = false;
+    private boolean mIsExtendedDeviceInfoRun = false;
 
     @Override
     public void invocationStarted(IBuildInfo buildInfo) {
@@ -63,8 +64,11 @@
             logCompleteRun(mCurrentPkgResult);
         }
         mIsDeviceInfoRun = DeviceInfoCollector.IDS.contains(id);
+        mIsExtendedDeviceInfoRun = DeviceInfoCollector.EXTENDED_IDS.contains(id);
         if (mIsDeviceInfoRun) {
             logResult("Collecting device info");
+        } else if (mIsExtendedDeviceInfoRun) {
+            logResult("Collecting extended device info");
         } else  {
             if (mCurrentPkgResult == null || !id.equals(mCurrentPkgResult.getId())) {
                 logResult("-----------------------------------------");
@@ -132,9 +136,13 @@
     }
 
     private void logCompleteRun(TestPackageResult pkgResult) {
-        if (pkgResult.getAppPackageName().equals(DeviceInfoCollector.APP_PACKAGE_NAME)) {
+        String appPackageName = pkgResult.getAppPackageName();
+        if (appPackageName.equals(DeviceInfoCollector.APP_PACKAGE_NAME)) {
             logResult("Device info collection complete");
             return;
+        } else if (appPackageName.equals(DeviceInfoCollector.EXTENDED_APP_PACKAGE_NAME)) {
+            logResult("Extended device info collection complete");
+            return;
         }
         logResult("%s package complete: Passed %d, Failed %d, Not Executed %d",
                 pkgResult.getId(), pkgResult.countTests(CtsTestStatus.PASS),
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java
index 8cb4072..51b457d 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java
@@ -25,7 +25,6 @@
 import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.build.IFolderBuildInfo;
 import com.android.tradefed.config.Option;
-import com.android.tradefed.config.Option.Importance;
 import com.android.tradefed.log.LogUtil.CLog;
 import com.android.tradefed.result.ILogSaver;
 import com.android.tradefed.result.ILogSaverListener;
@@ -42,6 +41,7 @@
 import org.kxml2.io.KXmlSerializer;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -62,6 +62,7 @@
 
     private static final String LOG_TAG = "CtsXmlResultReporter";
 
+    public static final String CTS_RESULT_DIR = "cts-result-dir";
     static final String TEST_RESULT_FILE_NAME = "testResult.xml";
     static final String CTS_RESULT_FILE_VERSION = "4.4";
     private static final String[] CTS_RESULT_RESOURCES = {"cts_result.xsl", "cts_result.css",
@@ -97,6 +98,9 @@
     @Option(name = "include-test-log-tags", description = "Include test log tags in XML report.")
     private boolean mIncludeTestLogTags = false;
 
+    @Option(name = "use-log-saver", description = "Also saves generated result XML with log saver")
+    private boolean mUseLogSaver = false;
+
     protected IBuildInfo mBuildInfo;
     private String mStartTime;
     private String mDeviceSerial;
@@ -104,10 +108,12 @@
     private TestPackageResult mCurrentPkgResult = null;
     private Test mCurrentTest = null;
     private boolean mIsDeviceInfoRun = false;
+    private boolean mIsExtendedDeviceInfoRun = false;
     private ResultReporter mReporter;
     private File mLogDir;
     private String mSuiteName;
     private String mReferenceUrl;
+    private ILogSaver mLogSaver;
 
     public void setReportDir(File reportDir) {
         mReportDir = reportDir;
@@ -155,6 +161,8 @@
         mSuiteName = ctsBuildHelper.getSuiteName();
         mReporter = new ResultReporter(mResultServer, mSuiteName);
 
+        ctsBuild.addBuildAttribute(CTS_RESULT_DIR, mReportDir.getAbsolutePath());
+
         // TODO: allow customization of log dir
         // create a unique directory for saving logs, with same name as result dir
         File rootLogDir = getBuildHelper(ctsBuild).getLogsDir();
@@ -249,13 +257,14 @@
 
     @Override
     public void setLogSaver(ILogSaver logSaver) {
-      // Don't need to keep a reference to logSaver, because we don't save extra logs in this class.
+        mLogSaver = logSaver;
     }
 
     @Override
     public void testRunStarted(String id, int numTests) {
         mIsDeviceInfoRun = DeviceInfoCollector.IDS.contains(id);
-        if (!mIsDeviceInfoRun) {
+        mIsExtendedDeviceInfoRun = DeviceInfoCollector.EXTENDED_IDS.contains(id);
+        if (!mIsDeviceInfoRun && !mIsExtendedDeviceInfoRun) {
             mCurrentPkgResult = mResults.getOrCreatePackage(id);
             mCurrentPkgResult.setDeviceSerial(mDeviceSerial);
         }
@@ -266,7 +275,7 @@
      */
     @Override
     public void testStarted(TestIdentifier test) {
-        if (!mIsDeviceInfoRun) {
+        if (!mIsDeviceInfoRun && !mIsExtendedDeviceInfoRun) {
             mCurrentTest = mCurrentPkgResult.insertTest(test);
         }
     }
@@ -276,7 +285,7 @@
      */
     @Override
     public void testFailed(TestIdentifier test, String trace) {
-        if (!mIsDeviceInfoRun) {
+        if (!mIsDeviceInfoRun && !mIsExtendedDeviceInfoRun) {
             mCurrentPkgResult.reportTestFailure(test, CtsTestStatus.FAIL, trace);
         }
     }
@@ -287,7 +296,7 @@
     @Override
     public void testAssumptionFailure(TestIdentifier test, String trace) {
         // TODO: do something different here?
-        if (!mIsDeviceInfoRun) {
+        if (!mIsDeviceInfoRun && !mIsExtendedDeviceInfoRun) {
             mCurrentPkgResult.reportTestFailure(test, CtsTestStatus.FAIL, trace);
         }
     }
@@ -305,7 +314,7 @@
      */
     @Override
     public void testEnded(TestIdentifier test, Map<String, String> testMetrics) {
-        if (!mIsDeviceInfoRun) {
+        if (!mIsDeviceInfoRun && !mIsExtendedDeviceInfoRun) {
             mCurrentPkgResult.reportTestEnded(test, testMetrics);
         }
     }
@@ -317,11 +326,22 @@
     public void testRunEnded(long elapsedTime, Map<String, String> runMetrics) {
         if (mIsDeviceInfoRun) {
             mResults.populateDeviceInfoMetrics(runMetrics);
+        } else if (mIsExtendedDeviceInfoRun) {
+            checkExtendedDeviceInfoMetrics(runMetrics);
         } else {
             mCurrentPkgResult.populateMetrics(runMetrics);
         }
     }
 
+    private void checkExtendedDeviceInfoMetrics(Map<String, String> runMetrics) {
+        for (Map.Entry<String, String> metricEntry : runMetrics.entrySet()) {
+            String value = metricEntry.getValue();
+            if (!value.endsWith(".deviceinfo.json")) {
+                CLog.e(String.format("%s failed: %s", metricEntry.getKey(), value));
+            }
+        }
+    }
+
     /**
      * {@inheritDoc}
      */
@@ -335,6 +355,18 @@
 
         File reportFile = getResultFile(mReportDir);
         createXmlResult(reportFile, mStartTime, elapsedTime);
+        if (mUseLogSaver) {
+            FileInputStream fis = null;
+            try {
+                fis = new FileInputStream(reportFile);
+                mLogSaver.saveLogData("cts-result", LogDataType.XML, fis);
+            } catch (IOException ioe) {
+                CLog.e("error saving XML with log saver");
+                CLog.e(ioe);
+            } finally {
+                StreamUtil.close(fis);
+            }
+        }
         copyFormattingFiles(mReportDir);
         zipResults(mReportDir);
 
@@ -400,7 +432,7 @@
         serializer.attribute(ns, "endtime", endTime);
         serializer.attribute(ns, "version", CTS_RESULT_FILE_VERSION);
         serializer.attribute(ns, "suite", mSuiteName);
-        mResults.serialize(serializer);
+        mResults.serialize(serializer, mBuildInfo.getBuildId());
         // TODO: not sure why, but the serializer doesn't like this statement
         //serializer.endTag(ns, RESULT_TAG);
     }
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/TestResults.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/TestResults.java
index 8c1a5bd..9f67f2d 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/TestResults.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/TestResults.java
@@ -104,9 +104,9 @@
      * @param serializer
      * @throws IOException
      */
-    public void serialize(KXmlSerializer serializer) throws IOException {
+    public void serialize(KXmlSerializer serializer, String buildId) throws IOException {
         mDeviceInfo.serialize(serializer);
-        serializeHostInfo(serializer);
+        serializeHostInfo(serializer, buildId);
         serializeTestSummary(serializer);
         // sort before serializing
         List<TestPackageResult> pkgs = new ArrayList<TestPackageResult>(mPackageResults.values());
@@ -121,7 +121,7 @@
      *
      * @param serializer
      */
-    private void serializeHostInfo(KXmlSerializer serializer) throws IOException {
+    private void serializeHostInfo(KXmlSerializer serializer, String buildId) throws IOException {
         serializer.startTag(ns, "HostInfo");
 
         String hostName = "";
@@ -143,6 +143,7 @@
 
         serializer.startTag(ns, "Cts");
         serializer.attribute(ns, "version", CtsBuildProvider.CTS_BUILD_VERSION);
+        serializer.attribute(ns, "build", buildId);
         // TODO: consider outputting other tradefed options here
         serializer.startTag(ns, "IntValue");
         serializer.attribute(ns, "name", "testStatusTimeoutMs");
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/targetprep/CtsApkInstaller.java b/tools/tradefed-host/src/com/android/cts/tradefed/targetprep/CtsApkInstaller.java
new file mode 100644
index 0000000..08061b1
--- /dev/null
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/targetprep/CtsApkInstaller.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.tradefed.targetprep;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.config.OptionClass;
+import com.android.tradefed.targetprep.TargetSetupError;
+import com.android.tradefed.targetprep.TestAppInstallSetup;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+
+/**
+ * Installs specified apks from CTS test case repository
+ */
+@OptionClass(alias="cts-apk-installer")
+public class CtsApkInstaller extends TestAppInstallSetup {
+
+    private CtsBuildHelper mBuildHelper = null;
+
+    protected CtsBuildHelper getCtsBuildHelper(IBuildInfo buildInfo) {
+        if (mBuildHelper == null) {
+            mBuildHelper = CtsBuildHelper.createBuildHelper(buildInfo);
+        }
+        return mBuildHelper;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected File getLocalPathForFilename(IBuildInfo buildInfo, String apkFileName)
+            throws TargetSetupError {
+        try {
+            return getCtsBuildHelper(buildInfo).getTestApp(apkFileName);
+        } catch (FileNotFoundException e) {
+            throw new TargetSetupError(String.format("apk not found: %s", apkFileName), e);
+        }
+    }
+}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/targetprep/CtsFilePusher.java b/tools/tradefed-host/src/com/android/cts/tradefed/targetprep/CtsFilePusher.java
new file mode 100644
index 0000000..c6ae2e1
--- /dev/null
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/targetprep/CtsFilePusher.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.tradefed.targetprep;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.config.OptionClass;
+import com.android.tradefed.targetprep.PushFilePreparer;
+
+import java.io.File;
+
+/**
+ * Pushes specified testing artifacts from CTS test case repository
+ */
+@OptionClass(alias="cts-file-pusher")
+public class CtsFilePusher extends PushFilePreparer {
+
+    private CtsBuildHelper mBuildHelper;
+
+    protected CtsBuildHelper getCtsBuildHelper(IBuildInfo buildInfo) {
+        if (mBuildHelper == null) {
+            mBuildHelper = CtsBuildHelper.createBuildHelper(buildInfo);
+        }
+        return mBuildHelper;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public File resolveRelativeFilePath(IBuildInfo buildInfo, String fileName) {
+        return new File(getCtsBuildHelper(buildInfo).getTestCasesDir(), fileName);
+    }
+}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityServiceTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityServiceTestRunner.java
deleted file mode 100644
index eafd608..0000000
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityServiceTestRunner.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2012 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 com.android.cts.tradefed.testtype;
-
-import com.android.cts.util.AbiUtils;
-import com.android.ddmlib.Log;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.util.FileUtil;
-
-import junit.framework.TestCase;
-
-import java.io.File;
-
-/**
- * Running the accessibility tests requires modification of secure
- * settings. Secure settings cannot be changed from device CTS tests
- * since system signature permission is required. Such settings can
- * be modified by the shell user, so a host side test is used for
- * installing a package with a delegating accessibility service, enabling
- * this service, running these tests, disabling the service, and removing
- * the delegating accessibility service package.
- *
- * @deprecated This class is not required in current CTS builds. Still
- * maintained so cts-tradefed can run against older CTS builds that still
- * require this class.
- */
-@Deprecated
-public class AccessibilityServiceTestRunner extends CtsInstrumentationApkTest {
-
-    private static final String LOG_TAG = AccessibilityServiceTestRunner.class.getSimpleName();
-
-    private static final String DELEGATING_ACCESSIBLITY_SERVICE_PACKAGE_NAME =
-        "android.accessibilityservice.delegate";
-
-    private static final String DELEGATING_ACCESSIBLITY_SERVICE_NAME =
-        "android.accessibilityservice.delegate.DelegatingAccessibilityService";
-
-    private static final String DELEGATING_ACCESSIBLITY_SERVICE_APK =
-        "CtsDelegatingAccessibilityService.apk";
-
-    @Override
-    public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
-        beforeTest();
-        super.run(listener);
-        afterTest();
-    }
-
-    private void beforeTest() throws DeviceNotAvailableException {
-        installApkAndAssert(DELEGATING_ACCESSIBLITY_SERVICE_APK);
-        enableAccessibilityAndDelegatingService();
-    }
-
-    private void afterTest() throws DeviceNotAvailableException {
-        AccessibilityTestRunner.disableAccessibilityAndServices(getDevice());
-        uninstallAndAssert(DELEGATING_ACCESSIBLITY_SERVICE_PACKAGE_NAME);
-    }
-
-    private void installApkAndAssert(String apkName) throws DeviceNotAvailableException {
-        File file = FileUtil.getFileForPath(mCtsBuild.getTestCasesDir(), apkName);
-        String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
-        String errorMessage = getDevice().installPackage(file, true, options);
-        TestCase.assertNull("Error installing: " + apkName, errorMessage);
-    }
-
-    private void uninstallAndAssert(String packageName) throws DeviceNotAvailableException {
-        String errorMessage = getDevice().uninstallPackage(packageName);
-        TestCase.assertNull("Error uninstalling: " + packageName, errorMessage);
-    }
-
-    private void enableAccessibilityAndDelegatingService() throws DeviceNotAvailableException {
-        String componentName = DELEGATING_ACCESSIBLITY_SERVICE_PACKAGE_NAME + "/"
-            + DELEGATING_ACCESSIBLITY_SERVICE_NAME;
-        AccessibilityTestRunner.enableAccessibilityAndServices(getDevice(),
-                componentName);
-    }
-}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityTestRunner.java
deleted file mode 100644
index 9ba4109..0000000
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityTestRunner.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2012 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 com.android.cts.tradefed.testtype;
-
-import com.android.cts.tradefed.targetprep.SettingsToggler;
-import com.android.cts.util.AbiUtils;
-import com.android.ddmlib.Log;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.device.ITestDevice;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.util.FileUtil;
-
-import junit.framework.TestCase;
-
-import java.io.File;
-
-/**
- * Running the accessibility tests requires modification of secure
- * settings. Secure settings cannot be changed from device CTS tests
- * since system signature permission is required. Such settings can
- * be modified by the shell user, so a host side test is used for
- * installing a package with some accessibility services, enabling
- * these services, running the tests, disabling the services, and removing
- * the accessibility services package.
- */
-public class AccessibilityTestRunner extends CtsInstrumentationApkTest {
-
-    private static final String LOG_TAG = AccessibilityTestRunner.class.getSimpleName();
-
-    private static final String SOME_ACCESSIBLITY_SERVICES_PACKAGE_NAME =
-        "android.view.accessibility.services";
-
-    private static final String SPEAKING_ACCESSIBLITY_SERVICE_NAME =
-        "android.view.accessibility.services.SpeakingAccessibilityService";
-
-    private static final String VIBRATING_ACCESSIBLITY_SERVICE_NAME =
-        "android.view.accessibility.services.VibratingAccessibilityService";
-
-    private static final String SOME_ACCESSIBLITY_SERVICES_APK =
-        "CtsSomeAccessibilityServices.apk";
-
-    @Override
-    public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
-        beforeTest();
-        super.run(listener);
-        afterTest();
-    }
-
-    private void beforeTest() throws DeviceNotAvailableException {
-        installApkAndAssert(SOME_ACCESSIBLITY_SERVICES_APK);
-        enableAccessibilityAndServices();
-    }
-
-    private void afterTest() throws DeviceNotAvailableException {
-        disableAccessibilityAndServices(getDevice());
-        uninstallAndAssert(SOME_ACCESSIBLITY_SERVICES_PACKAGE_NAME);
-    }
-
-    private void installApkAndAssert(String apkName) throws DeviceNotAvailableException {
-        File file = FileUtil.getFileForPath(mCtsBuild.getTestCasesDir(), apkName);
-        String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
-        String errorMessage = getDevice().installPackage(file, true, options);
-        TestCase.assertNull("Error installing: " + apkName, errorMessage);
-    }
-
-    private void uninstallAndAssert(String packageName) throws DeviceNotAvailableException {
-        String errorMessage = getDevice().uninstallPackage(packageName);
-        TestCase.assertNull("Error uninstalling: " + packageName, errorMessage);
-    }
-
-    private void enableAccessibilityAndServices() throws DeviceNotAvailableException {
-        String enabledServicesValue =
-              SOME_ACCESSIBLITY_SERVICES_PACKAGE_NAME + "/" + SPEAKING_ACCESSIBLITY_SERVICE_NAME
-            + ":"
-            + SOME_ACCESSIBLITY_SERVICES_PACKAGE_NAME + "/" + VIBRATING_ACCESSIBLITY_SERVICE_NAME;
-        enableAccessibilityAndServices(getDevice(), enabledServicesValue);
-    }
-
-    static void enableAccessibilityAndServices(ITestDevice device, String value)
-            throws DeviceNotAvailableException {
-        SettingsToggler.setSecureString(device, "enabled_accessibility_services", value);
-        SettingsToggler.setSecureString(device,
-                "touch_exploration_granted_accessibility_services", value);
-        SettingsToggler.setSecureInt(device, "accessibility_enabled", 1);
-    }
-
-    static void disableAccessibilityAndServices(ITestDevice device)
-            throws DeviceNotAvailableException {
-        SettingsToggler.updateSecureString(device, "enabled_accessibility_services", "");
-        SettingsToggler.updateSecureString(device,
-                "touch_exploration_granted_accessibility_services", "");
-        SettingsToggler.updateSecureInt(device, "accessibility_enabled", 0);
-    }
-}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
index c2c2a10..d74cce5 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
@@ -37,12 +37,18 @@
 import com.android.tradefed.result.InputStreamSource;
 import com.android.tradefed.result.LogDataType;
 import com.android.tradefed.result.ResultForwarder;
+import com.android.tradefed.targetprep.BuildError;
+import com.android.tradefed.targetprep.ITargetCleaner;
+import com.android.tradefed.targetprep.ITargetPreparer;
+import com.android.tradefed.targetprep.TargetSetupError;
 import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
 import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.testtype.IDeviceTest;
 import com.android.tradefed.testtype.IRemoteTest;
 import com.android.tradefed.testtype.IResumableTest;
 import com.android.tradefed.testtype.IShardableTest;
+import com.android.tradefed.testtype.InstrumentationTest;
 import com.android.tradefed.util.AbiFormatter;
 import com.android.tradefed.util.RunUtil;
 import com.android.tradefed.util.xml.AbstractXmlParser.ParseException;
@@ -63,6 +69,7 @@
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.ListIterator;
 import java.util.Map;
 import java.util.Set;
 
@@ -82,6 +89,8 @@
     private static final String TEST_OPTION = "test";
     public static final String CONTINUE_OPTION = "continue-session";
     public static final String RUN_KNOWN_FAILURES_OPTION = "run-known-failures";
+    private static final String INCLUDE_FILTERS_OPTION = "include";
+    private static final String EXCLUDE_FILTERS_OPTION = "exclude";
 
     public static final String PACKAGE_NAME_METRIC = "packageName";
     public static final String PACKAGE_ABI_METRIC = "packageAbi";
@@ -180,9 +189,14 @@
             "Collect dEQP logs from the device.")
     private boolean mCollectDeqpLogs = false;
 
+    @Option(name = INCLUDE_FILTERS_OPTION, description = "Positive filters to pass to tests.")
+    private List<String> mPositiveFilters = new ArrayList<> ();
+
+    @Option(name = EXCLUDE_FILTERS_OPTION, description = "Negative filters to pass to tests.")
+    private List<String> mNegativeFilters = new ArrayList<> ();
+
     @Option(name = "min-pre-reboot-package-count", description =
             "The minimum number of packages to require a pre test reboot")
-
     private int mMinPreRebootPackageCount = 2;
     private final int mShardAssignment;
     private final int mTotalShards;
@@ -275,9 +289,8 @@
         @Override
         public void testFailed(TestIdentifier test, String trace) {
             super.testFailed(test, trace);
-            // sleep a small amount of time to ensure test failure stack trace makes it into logcat
-            // capture
-            RunUtil.getDefault().sleep(10);
+            // sleep 2s to ensure test failure stack trace makes it into logcat capture
+            RunUtil.getDefault().sleep(2 * 1000);
             InputStreamSource logSource = mDevice.getLogcat(mNumLogcatBytes);
             super.testLog(String.format("logcat-%s_%s", test.getClassName(), test.getTestName()),
                     LogDataType.TEXT, logSource);
@@ -525,9 +538,33 @@
                 if (test instanceof DeqpTestRunner) {
                     ((DeqpTestRunner)test).setCollectLogs(mCollectDeqpLogs);
                 }
+                if (test instanceof GeeTest) {
+                    if (!mPositiveFilters.isEmpty()) {
+                        String positivePatterns = join(mPositiveFilters, ":");
+                        ((GeeTest)test).setPositiveFilters(positivePatterns);
+                    }
+                    if (!mNegativeFilters.isEmpty()) {
+                        String negativePatterns = join(mNegativeFilters, ":");
+                        ((GeeTest)test).setPositiveFilters(negativePatterns);
+                    }
+                }
+                if (test instanceof InstrumentationTest) {
+                    if (!mPositiveFilters.isEmpty()) {
+                        String annotation = join(mPositiveFilters, ",");
+                        ((InstrumentationTest)test).addInstrumentationArg(
+                                "annotation", annotation);
+                    }
+                    if (!mNegativeFilters.isEmpty()) {
+                        String notAnnotation = join(mNegativeFilters, ",");
+                        ((InstrumentationTest)test).addInstrumentationArg(
+                                "notAnnotation", notAnnotation);
+                    }
+                }
 
                 forwardPackageDetails(testPackage.getPackageDef(), listener);
+                performPackagePrepareSetup(testPackage.getPackageDef());
                 test.run(filterMap.get(testPackage.getPackageDef().getId()));
+                performPackagePreparerTearDown(testPackage.getPackageDef());
                 if (i < mTestPackageList.size() - 1) {
                     TestPackage nextPackage = mTestPackageList.get(i + 1);
                     rebootIfNecessary(testPackage, nextPackage);
@@ -562,6 +599,79 @@
     }
 
     /**
+     * Invokes {@link ITargetPreparer}s configured for the test package. {@link TargetSetupError}s
+     * thrown by any preparer will be rethrown as {@link RuntimeException} so that the entire test
+     * package will be skipped for execution. Note that preparers will be invoked in the same order
+     * as they are defined in the module test config.
+     * @param packageDef definition for the test package
+     * @throws DeviceNotAvailableException
+     */
+    private void performPackagePrepareSetup(ITestPackageDef packageDef)
+            throws DeviceNotAvailableException {
+        List<ITargetPreparer> preparers = packageDef.getPackagePreparers();
+        if (preparers != null) {
+            for (ITargetPreparer preparer : preparers) {
+                if (preparer instanceof IAbiReceiver) {
+                    ((IAbiReceiver) preparer).setAbi(packageDef.getAbi());
+                }
+                try {
+                    preparer.setUp(getDevice(), mBuildInfo);
+                } catch (BuildError e) {
+                    // This should only happen for flashing new build
+                    CLog.e("Unexpected BuildError from preparer: %s",
+                        preparer.getClass().getCanonicalName());
+                } catch (TargetSetupError e) {
+                    // log preparer class then rethrow & let caller handle
+                    CLog.e("TargetSetupError in preparer: %s",
+                        preparer.getClass().getCanonicalName());
+                    throw new RuntimeException(e);
+                }
+            }
+        }
+    }
+
+    /**
+     * Invokes clean up step for {@link ITargetCleaner}s configured for the test package. Note that
+     * the cleaners will be invoked in the reverse order as they are defined in module test config.
+     * @param packageDef definition for the test package
+     * @throws DeviceNotAvailableException
+     */
+    private void performPackagePreparerTearDown(ITestPackageDef packageDef)
+            throws DeviceNotAvailableException {
+        List<ITargetPreparer> preparers = packageDef.getPackagePreparers();
+        if (preparers != null) {
+            ListIterator<ITargetPreparer> itr = preparers.listIterator(preparers.size());
+            // do teardown in reverse order
+            while (itr.hasPrevious()) {
+                ITargetPreparer preparer = itr.previous();
+                if (preparer instanceof ITargetCleaner) {
+                    ((ITargetCleaner) preparer).tearDown(getDevice(), mBuildInfo, null);
+                }
+            }
+        }
+    }
+
+    /**
+     * Helper method to join strings. Exposed for unit tests
+     * @param input
+     * @param conjunction
+     * @return string with elements of the input list with interleaved conjunction.
+     */
+    protected static String join(List<String> input, String conjunction) {
+        StringBuilder sb = new StringBuilder();
+        boolean first = true;
+        for (String item : input) {
+            if (first) {
+                first = false;
+            } else {
+                sb.append(conjunction);
+            }
+            sb.append(item);
+        }
+        return sb.toString();
+    }
+
+    /**
      * @param allTestPackageDefList The package list to filter
      * @param deviceAbiSet The ABIs supported by the device being tested
      * @return A {@link List} of {@link ITestPackageDef}s that should be tested
@@ -947,6 +1057,8 @@
         if (!mSkipDeviceInfo) {
             String abi = AbiFormatter.getDefaultAbi(device, "");
             DeviceInfoCollector.collectDeviceInfo(device, abi, ctsBuild.getTestCasesDir(), listener);
+            DeviceInfoCollector.collectExtendedDeviceInfo(
+                device, abi, ctsBuild.getTestCasesDir(), listener, mBuildInfo);
         }
     }
 
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java
index 8eb1621..43aaf98 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DeqpTestRunner.java
@@ -2,7 +2,11 @@
 
 import com.android.cts.tradefed.build.CtsBuildHelper;
 import com.android.cts.util.AbiUtils;
+import com.android.ddmlib.AdbCommandRejectedException;
+import com.android.ddmlib.IShellOutputReceiver;
 import com.android.ddmlib.MultiLineReceiver;
+import com.android.ddmlib.ShellCommandUnresponsiveException;
+import com.android.ddmlib.TimeoutException;
 import com.android.ddmlib.testrunner.TestIdentifier;
 import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.device.DeviceNotAvailableException;
@@ -15,15 +19,28 @@
 import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.testtype.IDeviceTest;
 import com.android.tradefed.testtype.IRemoteTest;
+import com.android.tradefed.util.IRunUtil;
+import com.android.tradefed.util.RunInterruptedException;
+import com.android.tradefed.util.RunUtil;
 
 import java.io.File;
 import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Test runner for dEQP tests
@@ -35,30 +52,45 @@
     private static final String DEQP_ONDEVICE_APK = "com.drawelements.deqp.apk";
     private static final String DEQP_ONDEVICE_PKG = "com.drawelements.deqp";
     private static final String INCOMPLETE_LOG_MESSAGE = "Crash: Incomplete test log";
+    private static final String SKIPPED_INSTANCE_LOG_MESSAGE = "Configuration skipped";
+    private static final String NOT_EXECUTABLE_LOG_MESSAGE = "Abort: Test cannot be executed";
+    private static final String CASE_LIST_FILE_NAME = "/sdcard/dEQP-TestCaseList.txt";
+    private static final String LOG_FILE_NAME = "/sdcard/TestLog.qpa";
+    public static final String FEATURE_LANDSCAPE = "android.hardware.screen.landscape";
+    public static final String FEATURE_PORTRAIT = "android.hardware.screen.portrait";
 
-    private final int TESTCASE_BATCH_LIMIT = 1000;
+    private static final int TESTCASE_BATCH_LIMIT = 1000;
+    private static final BatchRunConfiguration DEFAULT_CONFIG =
+        new BatchRunConfiguration("rgba8888d24s8", "unspecified", "window");
 
-    private boolean mLogData;
-
-    private ITestDevice mDevice;
+    private static final int UNRESPOSIVE_CMD_TIMEOUT_MS = 60000; // one minute
 
     private final String mPackageName;
     private final String mName;
-    private Collection<TestIdentifier> mTests;
+    private final Collection<TestIdentifier> mRemainingTests;
+    private final Map<TestIdentifier, Set<BatchRunConfiguration>> mTestInstances;
+    private final TestInstanceResultListener mInstanceListerner = new TestInstanceResultListener();
+    private final Map<TestIdentifier, Integer> mTestInstabilityRatings;
     private IAbi mAbi;
     private CtsBuildHelper mCtsBuild;
+    private boolean mLogData = false;
+    private ITestDevice mDevice;
+    private Set<String> mDeviceFeatures;
+    private Map<String, Boolean> mConfigQuerySupportCache = new HashMap<>();
+    private IRunUtil mRunUtil = RunUtil.getDefault();
 
-    private TestIdentifier mCurrentTestId;
-    private boolean mGotTestResult;
-    private String mCurrentTestLog;
+    private IRecovery mDeviceRecovery = new Recovery();
+    {
+        mDeviceRecovery.setSleepProvider(new SleepProvider());
+    }
 
-    private ITestInvocationListener mListener;
-
-    public DeqpTestRunner(String packageName, String name, Collection<TestIdentifier> tests) {
+    public DeqpTestRunner(String packageName, String name, Collection<TestIdentifier> tests,
+            Map<TestIdentifier, List<Map<String,String>>> testInstances) {
         mPackageName = packageName;
         mName = name;
-        mTests = tests;
-        mLogData = false;
+        mRemainingTests = new LinkedList<>(tests); // avoid modifying arguments
+        mTestInstances = parseTestInstances(tests, testInstances);
+        mTestInstabilityRatings = new HashMap<>();
     }
 
     /**
@@ -95,18 +127,450 @@
     }
 
     /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setDevice(ITestDevice device) {
+        mDevice = device;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public ITestDevice getDevice() {
+        return mDevice;
+    }
+
+    /**
+     * Set recovery handler.
+     *
+     * Exposed for unit testing.
+     */
+    public void setRecovery(IRecovery deviceRecovery) {
+        mDeviceRecovery = deviceRecovery;
+    }
+
+    /**
+     * Set IRunUtil.
+     *
+     * Exposed for unit testing.
+     */
+    public void setRunUtil(IRunUtil runUtil) {
+        mRunUtil = runUtil;
+    }
+
+    private static final class CapabilityQueryFailureException extends Exception {
+    };
+
+    /**
+     * Test configuration of dEPQ test instance execution.
+     * Exposed for unit testing
+     */
+    public static final class BatchRunConfiguration {
+        public static final String ROTATION_UNSPECIFIED = "unspecified";
+        public static final String ROTATION_PORTRAIT = "0";
+        public static final String ROTATION_LANDSCAPE = "90";
+        public static final String ROTATION_REVERSE_PORTRAIT = "180";
+        public static final String ROTATION_REVERSE_LANDSCAPE = "270";
+
+        private final String mGlConfig;
+        private final String mRotation;
+        private final String mSurfaceType;
+
+        public BatchRunConfiguration(String glConfig, String rotation, String surfaceType) {
+            mGlConfig = glConfig;
+            mRotation = rotation;
+            mSurfaceType = surfaceType;
+        }
+
+        /**
+         * Get string that uniquely identifies this config
+         */
+        public String getId() {
+            return String.format("{glformat=%s,rotation=%s,surfacetype=%s}",
+                    mGlConfig, mRotation, mSurfaceType);
+        }
+
+        /**
+         * Get the GL config used in this configuration.
+         */
+        public String getGlConfig() {
+            return mGlConfig;
+        }
+
+        /**
+         * Get the screen rotation used in this configuration.
+         */
+        public String getRotation() {
+            return mRotation;
+        }
+
+        /**
+         * Get the surface type used in this configuration.
+         */
+        public String getSurfaceType() {
+            return mSurfaceType;
+        }
+
+        @Override
+        public boolean equals(Object other) {
+            if (other == null) {
+                return false;
+            } else if (!(other instanceof BatchRunConfiguration)) {
+                return false;
+            } else {
+                return getId().equals(((BatchRunConfiguration)other).getId());
+            }
+        }
+
+        @Override
+        public int hashCode() {
+            return getId().hashCode();
+        }
+    }
+
+    /**
+     * dEQP test instance listerer and invocation result forwarded
+     */
+    private class TestInstanceResultListener {
+        private ITestInvocationListener mSink;
+        private BatchRunConfiguration mRunConfig;
+
+        private TestIdentifier mCurrentTestId;
+        private boolean mGotTestResult;
+        private String mCurrentTestLog;
+
+        private class PendingResult
+        {
+            boolean allInstancesPassed;
+            Map<BatchRunConfiguration, String> testLogs;
+            Map<BatchRunConfiguration, String> errorMessages;
+            Set<BatchRunConfiguration> remainingConfigs;
+        };
+        private final Map<TestIdentifier, PendingResult> mPendingResults = new HashMap<>();
+
+        public void setSink(ITestInvocationListener sink) {
+            mSink = sink;
+        }
+
+        public void setCurrentConfig(BatchRunConfiguration runConfig) {
+            mRunConfig = runConfig;
+        }
+
+        /**
+         * Get currently processed test id, or null if not currently processing a test case
+         */
+        public TestIdentifier getCurrentTestId() {
+            return mCurrentTestId;
+        }
+
+        /**
+         * Forward result to sink
+         */
+        private void forwardFinalizedPendingResult(TestIdentifier testId) {
+            if (mRemainingTests.contains(testId)) {
+                final PendingResult result = mPendingResults.get(testId);
+
+                mPendingResults.remove(testId);
+                mRemainingTests.remove(testId);
+
+                // Forward results to the sink
+                mSink.testStarted(testId);
+
+                // Test Log
+                if (mLogData) {
+                    for (Map.Entry<BatchRunConfiguration, String> entry :
+                            result.testLogs.entrySet()) {
+                        final ByteArrayInputStreamSource source
+                                = new ByteArrayInputStreamSource(entry.getValue().getBytes());
+
+                        mSink.testLog(testId.getClassName() + "." + testId.getTestName() + "@"
+                                + entry.getKey().getId(), LogDataType.XML, source);
+
+                        source.cancel();
+                    }
+                }
+
+                // Error message
+                if (!result.allInstancesPassed) {
+                    final StringBuilder errorLog = new StringBuilder();
+
+                    for (Map.Entry<BatchRunConfiguration, String> entry :
+                            result.errorMessages.entrySet()) {
+                        if (errorLog.length() > 0) {
+                            errorLog.append('\n');
+                        }
+                        errorLog.append(String.format("=== with config %s ===\n",
+                                entry.getKey().getId()));
+                        errorLog.append(entry.getValue());
+                    }
+
+                    mSink.testFailed(testId, errorLog.toString());
+                }
+
+                final Map<String, String> emptyMap = Collections.emptyMap();
+                mSink.testEnded(testId, emptyMap);
+            }
+        }
+
+        /**
+         * Declare existence of a test and instances
+         */
+        public void setTestInstances(TestIdentifier testId, Set<BatchRunConfiguration> configs) {
+            // Test instances cannot change at runtime, ignore if we have already set this
+            if (!mPendingResults.containsKey(testId)) {
+                final PendingResult pendingResult = new PendingResult();
+                pendingResult.allInstancesPassed = true;
+                pendingResult.testLogs = new LinkedHashMap<>();
+                pendingResult.errorMessages = new LinkedHashMap<>();
+                pendingResult.remainingConfigs = new HashSet<>(configs); // avoid mutating argument
+                mPendingResults.put(testId, pendingResult);
+            }
+        }
+
+        /**
+         * Query if test instance has not yet been executed
+         */
+        public boolean isPendingTestInstance(TestIdentifier testId,
+                BatchRunConfiguration config) {
+            final PendingResult result = mPendingResults.get(testId);
+            if (result == null) {
+                // test is not in the current working batch of the runner, i.e. it cannot be
+                // "partially" completed.
+                if (!mRemainingTests.contains(testId)) {
+                    // The test has been fully executed. Not pending.
+                    return false;
+                } else {
+                    // Test has not yet been executed. Check if such instance exists
+                    return mTestInstances.get(testId).contains(config);
+                }
+            } else {
+                // could be partially completed, check this particular config
+                return result.remainingConfigs.contains(config);
+            }
+        }
+
+        /**
+         * Fake execution of an instance with current config
+         */
+        public void skipTest(TestIdentifier testId) {
+            final PendingResult result = mPendingResults.get(testId);
+
+            result.errorMessages.put(mRunConfig, SKIPPED_INSTANCE_LOG_MESSAGE);
+            result.remainingConfigs.remove(mRunConfig);
+
+            // Pending result finished, report result
+            if (result.remainingConfigs.isEmpty()) {
+                forwardFinalizedPendingResult(testId);
+            }
+        }
+
+        /**
+         * Fake failure of an instance with current config
+         */
+        public void abortTest(TestIdentifier testId, String errorMessage) {
+            final PendingResult result = mPendingResults.get(testId);
+
+            // Mark as executed
+            result.allInstancesPassed = false;
+            result.errorMessages.put(mRunConfig, errorMessage);
+            result.remainingConfigs.remove(mRunConfig);
+
+            // Pending result finished, report result
+            if (result.remainingConfigs.isEmpty()) {
+                forwardFinalizedPendingResult(testId);
+            }
+
+            if (testId.equals(mCurrentTestId)) {
+                mCurrentTestId = null;
+            }
+        }
+
+        /**
+         * Handles beginning of dEQP session.
+         */
+        private void handleBeginSession(Map<String, String> values) {
+            // ignore
+        }
+
+        /**
+         * Handles end of dEQP session.
+         */
+        private void handleEndSession(Map<String, String> values) {
+            // ignore
+        }
+
+        /**
+         * Handles beginning of dEQP testcase.
+         */
+        private void handleBeginTestCase(Map<String, String> values) {
+            mCurrentTestId = pathToIdentifier(values.get("dEQP-BeginTestCase-TestCasePath"));
+            mCurrentTestLog = "";
+            mGotTestResult = false;
+
+            // mark instance as started
+            if (mPendingResults.get(mCurrentTestId) != null) {
+                mPendingResults.get(mCurrentTestId).remainingConfigs.remove(mRunConfig);
+            } else {
+                CLog.w("Got unexpected start of %s", mCurrentTestId);
+            }
+        }
+
+        /**
+         * Handles end of dEQP testcase.
+         */
+        private void handleEndTestCase(Map<String, String> values) {
+            final PendingResult result = mPendingResults.get(mCurrentTestId);
+
+            if (result != null) {
+                if (!mGotTestResult) {
+                    result.allInstancesPassed = false;
+                    result.errorMessages.put(mRunConfig, INCOMPLETE_LOG_MESSAGE);
+                }
+
+                if (mLogData && mCurrentTestLog != null && mCurrentTestLog.length() > 0) {
+                    result.testLogs.put(mRunConfig, mCurrentTestLog);
+                }
+
+                // Pending result finished, report result
+                if (result.remainingConfigs.isEmpty()) {
+                    forwardFinalizedPendingResult(mCurrentTestId);
+                }
+            } else {
+                CLog.w("Got unexpected end of %s", mCurrentTestId);
+            }
+            mCurrentTestId = null;
+        }
+
+        /**
+         * Handles dEQP testcase result.
+         */
+        private void handleTestCaseResult(Map<String, String> values) {
+            String code = values.get("dEQP-TestCaseResult-Code");
+            String details = values.get("dEQP-TestCaseResult-Details");
+
+            if (mPendingResults.get(mCurrentTestId) == null) {
+                CLog.w("Got unexpected result for %s", mCurrentTestId);
+                mGotTestResult = true;
+                return;
+            }
+
+            if (code.compareTo("Pass") == 0) {
+                mGotTestResult = true;
+            } else if (code.compareTo("NotSupported") == 0) {
+                mGotTestResult = true;
+            } else if (code.compareTo("QualityWarning") == 0) {
+                mGotTestResult = true;
+            } else if (code.compareTo("CompatibilityWarning") == 0) {
+                mGotTestResult = true;
+            } else if (code.compareTo("Fail") == 0 || code.compareTo("ResourceError") == 0
+                    || code.compareTo("InternalError") == 0 || code.compareTo("Crash") == 0
+                    || code.compareTo("Timeout") == 0) {
+                mPendingResults.get(mCurrentTestId).allInstancesPassed = false;
+                mPendingResults.get(mCurrentTestId)
+                        .errorMessages.put(mRunConfig, code + ": " + details);
+                mGotTestResult = true;
+            } else {
+                String codeError = "Unknown result code: " + code;
+                mPendingResults.get(mCurrentTestId).allInstancesPassed = false;
+                mPendingResults.get(mCurrentTestId)
+                        .errorMessages.put(mRunConfig, codeError + ": " + details);
+                mGotTestResult = true;
+            }
+        }
+
+        /**
+         * Handles terminated dEQP testcase.
+         */
+        private void handleTestCaseTerminate(Map<String, String> values) {
+            final PendingResult result = mPendingResults.get(mCurrentTestId);
+
+            if (result != null) {
+                String reason = values.get("dEQP-TerminateTestCase-Reason");
+                mPendingResults.get(mCurrentTestId).allInstancesPassed = false;
+                mPendingResults.get(mCurrentTestId)
+                        .errorMessages.put(mRunConfig, "Terminated: " + reason);
+
+                // Pending result finished, report result
+                if (result.remainingConfigs.isEmpty()) {
+                    forwardFinalizedPendingResult(mCurrentTestId);
+                }
+            } else {
+                CLog.w("Got unexpected termination of %s", mCurrentTestId);
+            }
+
+            mCurrentTestId = null;
+            mGotTestResult = true;
+        }
+
+        /**
+         * Handles dEQP testlog data.
+         */
+        private void handleTestLogData(Map<String, String> values) {
+            mCurrentTestLog = mCurrentTestLog + values.get("dEQP-TestLogData-Log");
+        }
+
+        /**
+         * Handles new instrumentation status message.
+         */
+        public void handleStatus(Map<String, String> values) {
+            String eventType = values.get("dEQP-EventType");
+
+            if (eventType == null) {
+                return;
+            }
+
+            if (eventType.compareTo("BeginSession") == 0) {
+                handleBeginSession(values);
+            } else if (eventType.compareTo("EndSession") == 0) {
+                handleEndSession(values);
+            } else if (eventType.compareTo("BeginTestCase") == 0) {
+                handleBeginTestCase(values);
+            } else if (eventType.compareTo("EndTestCase") == 0) {
+                handleEndTestCase(values);
+            } else if (eventType.compareTo("TestCaseResult") == 0) {
+                handleTestCaseResult(values);
+            } else if (eventType.compareTo("TerminateTestCase") == 0) {
+                handleTestCaseTerminate(values);
+            } else if (eventType.compareTo("TestLogData") == 0) {
+                handleTestLogData(values);
+            }
+        }
+
+        /**
+         * Signal listener that batch ended and forget incomplete results.
+         */
+        public void endBatch() {
+            // end open test if when stream ends
+            if (mCurrentTestId != null) {
+                // Current instance was removed from remainingConfigs when case
+                // started. Mark current instance as pending.
+                if (mPendingResults.get(mCurrentTestId) != null) {
+                    mPendingResults.get(mCurrentTestId).remainingConfigs.add(mRunConfig);
+                } else {
+                    CLog.w("Got unexpected internal state of %s", mCurrentTestId);
+                }
+            }
+            mCurrentTestId = null;
+        }
+    }
+
+    /**
      * dEQP instrumentation parser
      */
-    class InstrumentationParser extends MultiLineReceiver {
-        private DeqpTestRunner mDeqpTests;
+    private static class InstrumentationParser extends MultiLineReceiver {
+        private TestInstanceResultListener mListener;
 
         private Map<String, String> mValues;
         private String mCurrentName;
         private String mCurrentValue;
+        private int mResultCode;
+        private boolean mGotExitValue = false;
 
 
-        public InstrumentationParser(DeqpTestRunner tests) {
-            mDeqpTests = tests;
+        public InstrumentationParser(TestInstanceResultListener listener) {
+            mListener = listener;
         }
 
         /**
@@ -125,7 +589,7 @@
                         mCurrentValue = null;
                     }
 
-                    mDeqpTests.handleStatus(mValues);
+                    mListener.handleStatus(mValues);
                     mValues = null;
                 } else if (line.startsWith("INSTRUMENTATION_STATUS: dEQP-")) {
                     if (mCurrentName != null) {
@@ -142,6 +606,13 @@
 
                     mCurrentName = line.substring(nameBegin, nameEnd);
                     mCurrentValue = line.substring(valueBegin);
+                } else if (line.startsWith("INSTRUMENTATION_CODE: ")) {
+                    try {
+                        mResultCode = Integer.parseInt(line.substring(22));
+                        mGotExitValue = true;
+                    } catch (NumberFormatException ex) {
+                        CLog.w("Instrumentation code format unexpected");
+                    }
                 } else if (mCurrentValue != null) {
                     mCurrentValue = mCurrentValue + line;
                 }
@@ -161,7 +632,7 @@
             }
 
             if (mValues != null) {
-                mDeqpTests.handleStatus(mValues);
+                mListener.handleStatus(mValues);
                 mValues = null;
             }
         }
@@ -173,12 +644,411 @@
         public boolean isCancelled() {
             return false;
         }
+
+        /**
+         * Returns whether target instrumentation exited normally.
+         */
+        public boolean wasSuccessful() {
+            return mGotExitValue;
+        }
+
+        /**
+         * Returns Instrumentation return code
+         */
+        public int getResultCode() {
+            return mResultCode;
+        }
+    }
+
+    /**
+     * dEQP platfom query instrumentation parser
+     */
+    private static class PlatformQueryInstrumentationParser extends MultiLineReceiver {
+        private Map<String,String> mResultMap = new LinkedHashMap<>();
+        private int mResultCode;
+        private boolean mGotExitValue = false;
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void processNewLines(String[] lines) {
+            for (String line : lines) {
+                if (line.startsWith("INSTRUMENTATION_RESULT: ")) {
+                    final String parts[] = line.substring(24).split("=",2);
+                    if (parts.length == 2) {
+                        mResultMap.put(parts[0], parts[1]);
+                    } else {
+                        CLog.w("Instrumentation status format unexpected");
+                    }
+                } else if (line.startsWith("INSTRUMENTATION_CODE: ")) {
+                    try {
+                        mResultCode = Integer.parseInt(line.substring(22));
+                        mGotExitValue = true;
+                    } catch (NumberFormatException ex) {
+                        CLog.w("Instrumentation code format unexpected");
+                    }
+                }
+            }
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean isCancelled() {
+            return false;
+        }
+
+        /**
+         * Returns whether target instrumentation exited normally.
+         */
+        public boolean wasSuccessful() {
+            return mGotExitValue;
+        }
+
+        /**
+         * Returns Instrumentation return code
+         */
+        public int getResultCode() {
+            return mResultCode;
+        }
+
+        public Map<String,String> getResultMap() {
+            return mResultMap;
+        }
+    }
+
+    /**
+     * Interface for sleeping.
+     *
+     * Exposed for unit testing
+     */
+    public static interface ISleepProvider {
+        public void sleep(int milliseconds);
+    };
+
+    private static class SleepProvider implements ISleepProvider {
+        public void sleep(int milliseconds) {
+            try {
+                Thread.sleep(milliseconds);
+            } catch (InterruptedException ex) {
+            }
+        }
+    };
+
+    /**
+     * Interface for failure recovery.
+     *
+     * Exposed for unit testing
+     */
+    public static interface IRecovery {
+        /**
+         * Sets the sleep provider IRecovery works on
+         */
+        public void setSleepProvider(ISleepProvider sleepProvider);
+
+        /**
+         * Sets the device IRecovery works on
+         */
+        public void setDevice(ITestDevice device);
+
+        /**
+         * Informs Recovery that test execution has progressed since the last recovery
+         */
+        public void onExecutionProgressed();
+
+        /**
+         * Tries to recover device after failed refused connection.
+         *
+         * @throws DeviceNotAvailableException if recovery did not succeed
+         */
+        public void recoverConnectionRefused() throws DeviceNotAvailableException;
+
+        /**
+         * Tries to recover device after abnormal execution termination or link failure.
+         *
+         * @param progressedSinceLastCall true if test execution has progressed since last call
+         * @throws DeviceNotAvailableException if recovery did not succeed
+         */
+        public void recoverComLinkKilled() throws DeviceNotAvailableException;
+    };
+
+    /**
+     * State machine for execution failure recovery.
+     *
+     * Exposed for unit testing
+     */
+    public static class Recovery implements IRecovery {
+        private int RETRY_COOLDOWN_MS = 6000; // 6 seconds
+        private int PROCESS_KILL_WAIT_MS = 1000; // 1 second
+
+        private static enum MachineState {
+            WAIT, // recover by waiting
+            RECOVER, // recover by calling recover()
+            REBOOT, // recover by rebooting
+            FAIL, // cannot recover
+        };
+
+        private MachineState mState = MachineState.WAIT;
+        private ITestDevice mDevice;
+        private ISleepProvider mSleepProvider;
+
+        private static class ProcessKillFailureException extends Exception {
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        public void setSleepProvider(ISleepProvider sleepProvider) {
+            mSleepProvider = sleepProvider;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void setDevice(ITestDevice device) {
+            mDevice = device;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void onExecutionProgressed() {
+            mState = MachineState.WAIT;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void recoverConnectionRefused() throws DeviceNotAvailableException {
+            switch (mState) {
+                case WAIT: // not a valid stratedy for connection refusal, fallthrough
+                case RECOVER:
+                    // First failure, just try to recover
+                    CLog.w("ADB connection failed, trying to recover");
+                    mState = MachineState.REBOOT; // the next step is to reboot
+
+                    try {
+                        recoverDevice();
+                    } catch (DeviceNotAvailableException ex) {
+                        // chain forward
+                        recoverConnectionRefused();
+                    }
+                    break;
+
+                case REBOOT:
+                    // Second failure in a row, try to reboot
+                    CLog.w("ADB connection failed after recovery, rebooting device");
+                    mState = MachineState.FAIL; // the next step is to fail
+
+                    try {
+                        rebootDevice();
+                    } catch (DeviceNotAvailableException ex) {
+                        // chain forward
+                        recoverConnectionRefused();
+                    }
+                    break;
+
+                case FAIL:
+                    // Third failure in a row, just fail
+                    CLog.w("Cannot recover ADB connection");
+                    throw new DeviceNotAvailableException("failed to connect after reboot");
+            }
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void recoverComLinkKilled() throws DeviceNotAvailableException {
+            switch (mState) {
+                case WAIT:
+                    // First failure, just try to wait and try again
+                    CLog.w("ADB link failed, retrying after a cooldown period");
+                    mState = MachineState.RECOVER; // the next step is to recover the device
+
+                    waitCooldown();
+
+                    // even if the link to deqp on-device process was killed, the process might
+                    // still be alive. Locate and terminate such unwanted processes.
+                    try {
+                        killDeqpProcess();
+                    } catch (DeviceNotAvailableException ex) {
+                        // chain forward
+                        recoverComLinkKilled();
+                    } catch (ProcessKillFailureException ex) {
+                        // chain forward
+                        recoverComLinkKilled();
+                    }
+                    break;
+
+                case RECOVER:
+                    // Second failure, just try to recover
+                    CLog.w("ADB link failed, trying to recover");
+                    mState = MachineState.REBOOT; // the next step is to reboot
+
+                    try {
+                        recoverDevice();
+                        killDeqpProcess();
+                    } catch (DeviceNotAvailableException ex) {
+                        // chain forward
+                        recoverComLinkKilled();
+                    } catch (ProcessKillFailureException ex) {
+                        // chain forward
+                        recoverComLinkKilled();
+                    }
+                    break;
+
+                case REBOOT:
+                    // Third failure in a row, try to reboot
+                    CLog.w("ADB link failed after recovery, rebooting device");
+                    mState = MachineState.FAIL; // the next step is to fail
+
+                    try {
+                        rebootDevice();
+                    } catch (DeviceNotAvailableException ex) {
+                        // chain forward
+                        recoverComLinkKilled();
+                    }
+                    break;
+
+                case FAIL:
+                    // Fourth failure in a row, just fail
+                    CLog.w("Cannot recover ADB connection");
+                    throw new DeviceNotAvailableException("link killed after reboot");
+            }
+        }
+
+        private void waitCooldown() {
+            mSleepProvider.sleep(RETRY_COOLDOWN_MS);
+        }
+
+        private Iterable<Integer> getDeqpProcessPids() throws DeviceNotAvailableException {
+            final List<Integer> pids = new ArrayList<Integer>(2);
+            final String processes = mDevice.executeShellCommand("ps | grep com.drawelements");
+            final String[] lines = processes.split("(\\r|\\n)+");
+            for (String line : lines) {
+                final String[] fields = line.split("\\s+");
+                if (fields.length < 2) {
+                    continue;
+                }
+
+                try {
+                    final int processId = Integer.parseInt(fields[1], 10);
+                    pids.add(processId);
+                } catch (NumberFormatException ex) {
+                    continue;
+                }
+            }
+            return pids;
+        }
+
+        private void killDeqpProcess() throws DeviceNotAvailableException,
+                ProcessKillFailureException {
+            for (Integer processId : getDeqpProcessPids()) {
+                mDevice.executeShellCommand(String.format("kill -9 %d", processId));
+            }
+
+            mSleepProvider.sleep(PROCESS_KILL_WAIT_MS);
+
+            // check that processes actually died
+            if (getDeqpProcessPids().iterator().hasNext()) {
+                // a process is still alive, killing failed
+                throw new ProcessKillFailureException();
+            }
+        }
+
+        public void recoverDevice() throws DeviceNotAvailableException {
+            // Work around the API. We need to call recoverDevice() on the test device and
+            // we know that mDevice is a TestDevice. However even though the recoverDevice()
+            // method is public suggesting it should be publicly accessible, the class itself
+            // and its super-interface (IManagedTestDevice) are package-private.
+            final Method recoverDeviceMethod;
+            try {
+                recoverDeviceMethod = mDevice.getClass().getMethod("recoverDevice");
+                recoverDeviceMethod.setAccessible(true);
+            } catch (NoSuchMethodException ex) {
+                throw new AssertionError("Test device must have recoverDevice()");
+            }
+
+            try {
+                recoverDeviceMethod.invoke(mDevice);
+            } catch (InvocationTargetException ex) {
+                if (ex.getCause() instanceof DeviceNotAvailableException) {
+                    throw (DeviceNotAvailableException)ex.getCause();
+                } else if (ex.getCause() instanceof RuntimeException) {
+                    throw (RuntimeException)ex.getCause();
+                } else {
+                    throw new AssertionError("unexpected throw", ex);
+                }
+            } catch (IllegalAccessException ex) {
+                throw new AssertionError("unexpected throw", ex);
+            }
+        }
+
+        private void rebootDevice() throws DeviceNotAvailableException {
+            mDevice.reboot();
+        }
+    };
+
+    /**
+     * Parse map of instance arguments to map of BatchRunConfigurations
+     */
+    private static Map<TestIdentifier, Set<BatchRunConfiguration>> parseTestInstances(
+            Collection<TestIdentifier> tests,
+            Map<TestIdentifier, List<Map<String,String>>> testInstances) {
+        final Map<TestIdentifier, Set<BatchRunConfiguration>> instances = new HashMap<>();
+        for (final TestIdentifier test : tests) {
+            final Set<BatchRunConfiguration> testInstanceSet = new LinkedHashSet<>();
+            if (testInstances.get(test).isEmpty()) {
+                // no instances defined, use default
+                testInstanceSet.add(DEFAULT_CONFIG);
+            } else {
+                for (Map<String, String> instanceArgs : testInstances.get(test)) {
+                    testInstanceSet.add(parseRunConfig(instanceArgs));
+                }
+            }
+            instances.put(test, testInstanceSet);
+        }
+        return instances;
+    }
+
+    private static BatchRunConfiguration parseRunConfig(Map<String,String> instanceArguments) {
+        final String glConfig;
+        final String rotation;
+        final String surfaceType;
+
+        if (instanceArguments.containsKey("glconfig")) {
+            glConfig = instanceArguments.get("glconfig");
+        } else {
+            glConfig = DEFAULT_CONFIG.getGlConfig();
+        }
+        if (instanceArguments.containsKey("rotation")) {
+            rotation = instanceArguments.get("rotation");
+        } else {
+            rotation = DEFAULT_CONFIG.getRotation();
+        }
+        if (instanceArguments.containsKey("surfaceType")) {
+            surfaceType = instanceArguments.get("surfaceType");
+        } else {
+            surfaceType = DEFAULT_CONFIG.getSurfaceType();
+        }
+
+        return new BatchRunConfiguration(glConfig, rotation, surfaceType);
+    }
+
+    private Set<BatchRunConfiguration> getTestRunConfigs (TestIdentifier testId) {
+        return mTestInstances.get(testId);
     }
 
     /**
      * Converts dEQP testcase path to TestIdentifier.
      */
-    private TestIdentifier pathToIdentifier(String testPath) {
+    private static TestIdentifier pathToIdentifier(String testPath) {
         String[] components = testPath.split("\\.");
         String name = components[components.length - 1];
         String className = null;
@@ -194,150 +1064,14 @@
         return new TestIdentifier(className, name);
     }
 
-    /**
-     * Handles beginning of dEQP session.
-     */
-    private void handleBeginSession(Map<String, String> values) {
-        String id = AbiUtils.createId(mAbi.getName(), mPackageName);
-        mListener.testRunStarted(id, mTests.size());
-    }
-
-    /**
-     * Handles end of dEQP session.
-     */
-    private void handleEndSession(Map<String, String> values) {
-        Map <String, String> emptyMap = Collections.emptyMap();
-        mListener.testRunEnded(0, emptyMap);
-    }
-
-    /**
-     * Handles beginning of dEQP testcase.
-     */
-    private void handleBeginTestCase(Map<String, String> values) {
-        mCurrentTestId = pathToIdentifier(values.get("dEQP-BeginTestCase-TestCasePath"));
-        mCurrentTestLog = "";
-        mGotTestResult = false;
-
-        mListener.testStarted(mCurrentTestId);
-        mTests.remove(mCurrentTestId);
-    }
-
-    /**
-     * Handles end of dEQP testcase.
-     */
-    private void handleEndTestCase(Map<String, String> values) {
-        Map <String, String> emptyMap = Collections.emptyMap();
-
-        if (!mGotTestResult) {
-            mListener.testFailed(mCurrentTestId,
-                    INCOMPLETE_LOG_MESSAGE);
-        }
-
-        if (mLogData && mCurrentTestLog != null && mCurrentTestLog.length() > 0) {
-            ByteArrayInputStreamSource source
-                    = new ByteArrayInputStreamSource(mCurrentTestLog.getBytes());
-
-            mListener.testLog(mCurrentTestId.getClassName() + "."
-                    + mCurrentTestId.getTestName(), LogDataType.XML, source);
-
-            source.cancel();
-        }
-
-        mListener.testEnded(mCurrentTestId, emptyMap);
-        mCurrentTestId = null;
-    }
-
-    /**
-     * Handles dEQP testcase result.
-     */
-    private void handleTestCaseResult(Map<String, String> values) {
-        String code = values.get("dEQP-TestCaseResult-Code");
-        String details = values.get("dEQP-TestCaseResult-Details");
-
-        if (code.compareTo("Pass") == 0) {
-            mGotTestResult = true;
-        } else if (code.compareTo("NotSupported") == 0) {
-            mGotTestResult = true;
-        } else if (code.compareTo("QualityWarning") == 0) {
-            mGotTestResult = true;
-        } else if (code.compareTo("CompatibilityWarning") == 0) {
-            mGotTestResult = true;
-        } else if (code.compareTo("Fail") == 0 || code.compareTo("ResourceError") == 0
-                || code.compareTo("InternalError") == 0 || code.compareTo("Crash") == 0
-                || code.compareTo("Timeout") == 0) {
-            mListener.testFailed(mCurrentTestId,
-                    code + ": " + details);
-            mGotTestResult = true;
-        } else {
-            mListener.testFailed(mCurrentTestId,
-                    "Unknown result code: " + code + ": " + details);
-            mGotTestResult = true;
-        }
-    }
-
-    /**
-     * Handles terminated dEQP testcase.
-     */
-    private void handleTestCaseTerminate(Map<String, String> values) {
-        Map <String, String> emptyMap = Collections.emptyMap();
-
-        String reason = values.get("dEQP-TerminateTestCase-Reason");
-        mListener.testFailed(mCurrentTestId,
-                "Terminated: " + reason);
-        mListener.testEnded(mCurrentTestId, emptyMap);
-
-        if (mLogData && mCurrentTestLog != null && mCurrentTestLog.length() > 0) {
-            ByteArrayInputStreamSource source
-                    = new ByteArrayInputStreamSource(mCurrentTestLog.getBytes());
-
-            mListener.testLog(mCurrentTestId.getClassName() + "."
-                    + mCurrentTestId.getTestName(), LogDataType.XML, source);
-
-            source.cancel();
-        }
-
-        mCurrentTestId = null;
-        mGotTestResult = true;
-    }
-
-    /**
-     * Handles dEQP testlog data.
-     */
-    private void handleTestLogData(Map<String, String> values) {
-        mCurrentTestLog = mCurrentTestLog + values.get("dEQP-TestLogData-Log");
-    }
-
-    /**
-     * Handles new instrumentation status message.
-     */
-    public void handleStatus(Map<String, String> values) {
-        String eventType = values.get("dEQP-EventType");
-
-        if (eventType == null) {
-            return;
-        }
-
-        if (eventType.compareTo("BeginSession") == 0) {
-            handleBeginSession(values);
-        } else if (eventType.compareTo("EndSession") == 0) {
-            handleEndSession(values);
-        } else if (eventType.compareTo("BeginTestCase") == 0) {
-            handleBeginTestCase(values);
-        } else if (eventType.compareTo("EndTestCase") == 0) {
-            handleEndTestCase(values);
-        } else if (eventType.compareTo("TestCaseResult") == 0) {
-            handleTestCaseResult(values);
-        } else if (eventType.compareTo("TerminateTestCase") == 0) {
-            handleTestCaseTerminate(values);
-        } else if (eventType.compareTo("TestLogData") == 0) {
-            handleTestLogData(values);
-        }
+    private String getId() {
+        return AbiUtils.createId(mAbi.getName(), mPackageName);
     }
 
     /**
      * Generates tescase trie from dEQP testcase paths. Used to define which testcases to execute.
      */
-    private String generateTestCaseTrieFromPaths(Collection<String> tests) {
+    private static String generateTestCaseTrieFromPaths(Collection<String> tests) {
         String result = "{";
         boolean first = true;
 
@@ -390,51 +1124,492 @@
     /**
      * Generates testcase trie from TestIdentifiers.
      */
-    private String generateTestCaseTrie(Collection<TestIdentifier> tests) {
+    private static String generateTestCaseTrie(Collection<TestIdentifier> tests) {
         ArrayList<String> testPaths = new ArrayList<String>();
 
         for (TestIdentifier test : tests) {
             testPaths.add(test.getClassName() + "." + test.getTestName());
-
-            // Limit number of testcases for each run
-            if (testPaths.size() > TESTCASE_BATCH_LIMIT)
-                break;
         }
 
         return generateTestCaseTrieFromPaths(testPaths);
     }
 
+    private static class TestBatch {
+        public BatchRunConfiguration config;
+        public List<TestIdentifier> tests;
+    }
+
+    private TestBatch selectRunBatch() {
+        return selectRunBatch(mRemainingTests, null);
+    }
+
     /**
-     * Executes tests on the device.
+     * Creates a TestBatch from the given tests or null if not tests remaining.
+     *
+     *  @param pool List of tests to select from
+     *  @param requiredConfig Select only instances with pending requiredConfig, or null to select
+     *         any run configuration.
      */
-    private void executeTests(ITestInvocationListener listener) throws DeviceNotAvailableException {
-        InstrumentationParser parser = new InstrumentationParser(this);
-        String caseListFileName = "/sdcard/dEQP-TestCaseList.txt";
-        String logFileName = "/sdcard/TestLog.qpa";
-        String testCases = generateTestCaseTrie(mTests);
+    private TestBatch selectRunBatch(Collection<TestIdentifier> pool,
+            BatchRunConfiguration requiredConfig) {
+        // select one test (leading test) that is going to be executed and then pack along as many
+        // other compatible instances as possible.
 
-        mDevice.executeShellCommand("rm " + caseListFileName);
-        mDevice.executeShellCommand("rm " + logFileName);
-        mDevice.pushString(testCases + "\n", caseListFileName);
+        TestIdentifier leadingTest = null;
+        for (TestIdentifier test : pool) {
+            if (!mRemainingTests.contains(test)) {
+                continue;
+            }
+            if (requiredConfig != null &&
+                    !mInstanceListerner.isPendingTestInstance(test, requiredConfig)) {
+                continue;
+            }
+            leadingTest = test;
+            break;
+        }
 
-        String instrumentationName =
+        // no remaining tests?
+        if (leadingTest == null) {
+            return null;
+        }
+
+        BatchRunConfiguration leadingTestConfig = null;
+        if (requiredConfig != null) {
+            leadingTestConfig = requiredConfig;
+        } else {
+            for (BatchRunConfiguration runConfig : getTestRunConfigs(leadingTest)) {
+                if (mInstanceListerner.isPendingTestInstance(leadingTest, runConfig)) {
+                    leadingTestConfig = runConfig;
+                    break;
+                }
+            }
+        }
+
+        // test pending <=> test has a pending config
+        if (leadingTestConfig == null) {
+            throw new AssertionError("search postcondition failed");
+        }
+
+        final int leadingInstability = getTestInstabilityRating(leadingTest);
+
+        final TestBatch runBatch = new TestBatch();
+        runBatch.config = leadingTestConfig;
+        runBatch.tests = new ArrayList<>();
+        runBatch.tests.add(leadingTest);
+
+        for (TestIdentifier test : pool) {
+            if (test == leadingTest) {
+                // do not re-select the leading tests
+                continue;
+            }
+            if (!mInstanceListerner.isPendingTestInstance(test, leadingTestConfig)) {
+                // select only compatible
+                continue;
+            }
+            if (getTestInstabilityRating(test) != leadingInstability) {
+                // pack along only cases in the same stability category. Packing more dangerous
+                // tests along jeopardizes the stability of this run. Packing more stable tests
+                // along jeopardizes their stability rating.
+                continue;
+            }
+            if (runBatch.tests.size() >= getBatchSizeLimitForInstability(leadingInstability)) {
+                // batch size is limited.
+                break;
+            }
+            runBatch.tests.add(test);
+        }
+
+        return runBatch;
+    }
+
+    private int getBatchNumPendingCases(TestBatch batch) {
+        int numPending = 0;
+        for (TestIdentifier test : batch.tests) {
+            if (mInstanceListerner.isPendingTestInstance(test, batch.config)) {
+                ++numPending;
+            }
+        }
+        return numPending;
+    }
+
+    private int getBatchSizeLimitForInstability(int batchInstabilityRating) {
+        // reduce group size exponentially down to one
+        return Math.max(1, TESTCASE_BATCH_LIMIT / (1 << batchInstabilityRating));
+    }
+
+    private int getTestInstabilityRating(TestIdentifier testId) {
+        if (mTestInstabilityRatings.containsKey(testId)) {
+            return mTestInstabilityRatings.get(testId);
+        } else {
+            return 0;
+        }
+    }
+
+    private void recordTestInstability(TestIdentifier testId) {
+        mTestInstabilityRatings.put(testId, getTestInstabilityRating(testId) + 1);
+    }
+
+    private void clearTestInstability(TestIdentifier testId) {
+        mTestInstabilityRatings.put(testId, 0);
+    }
+
+    /**
+     * Executes all tests on the device.
+     */
+    private void runTests() throws DeviceNotAvailableException, CapabilityQueryFailureException {
+        for (;;) {
+            TestBatch batch = selectRunBatch();
+
+            if (batch == null) {
+                break;
+            }
+
+            runTestRunBatch(batch);
+        }
+    }
+
+    /**
+     * Runs a TestBatch by either faking it or executing it on a device.
+     */
+    private void runTestRunBatch(TestBatch batch) throws DeviceNotAvailableException,
+            CapabilityQueryFailureException {
+        // prepare instance listener
+        mInstanceListerner.setCurrentConfig(batch.config);
+        for (TestIdentifier test : batch.tests) {
+            mInstanceListerner.setTestInstances(test, getTestRunConfigs(test));
+        }
+
+        // execute only if config is executable, else fake results
+        if (isSupportedRunConfiguration(batch.config)) {
+            executeTestRunBatch(batch);
+        } else {
+            fakePassTestRunBatch(batch);
+        }
+    }
+
+    private boolean isSupportedRunConfiguration(BatchRunConfiguration runConfig)
+            throws DeviceNotAvailableException, CapabilityQueryFailureException {
+        // orientation support
+        if (!BatchRunConfiguration.ROTATION_UNSPECIFIED.equals(runConfig.getRotation())) {
+            final Set<String> features = getDeviceFeatures(mDevice);
+
+            if (isPortraitClassRotation(runConfig.getRotation()) &&
+                    !features.contains(FEATURE_PORTRAIT)) {
+                return false;
+            }
+            if (isLandscapeClassRotation(runConfig.getRotation()) &&
+                    !features.contains(FEATURE_LANDSCAPE)) {
+                return false;
+            }
+        }
+
+        if (isOpenGlEsPackage()) {
+            // renderability support for OpenGL ES tests
+            return isSupportedGlesRenderConfig(runConfig);
+        } else {
+            return true;
+        }
+    }
+
+    private static final class AdbComLinkOpenError extends Exception {
+        public AdbComLinkOpenError(String description, Throwable inner) {
+            super(description, inner);
+        }
+    };
+    private static final class AdbComLinkKilledError extends Exception {
+        public AdbComLinkKilledError(String description, Throwable inner) {
+            super(description, inner);
+        }
+    };
+
+    /**
+     * Executes a given command in adb shell
+     *
+     * @throws AdbComLinkOpenError if connection cannot be established.
+     * @throws AdbComLinkKilledError if established connection is killed prematurely.
+     */
+    private void executeShellCommandAndReadOutput(final String command,
+            final IShellOutputReceiver receiver)
+            throws AdbComLinkOpenError, AdbComLinkKilledError {
+        try {
+            mDevice.getIDevice().executeShellCommand(command, receiver,
+                    UNRESPOSIVE_CMD_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        } catch (TimeoutException ex) {
+            // Opening connection timed out
+            throw new AdbComLinkOpenError("opening connection timed out", ex);
+        } catch (AdbCommandRejectedException ex) {
+            // Command rejected
+            throw new AdbComLinkOpenError("command rejected", ex);
+        } catch (IOException ex) {
+            // shell command channel killed
+            throw new AdbComLinkKilledError("command link killed", ex);
+        } catch (ShellCommandUnresponsiveException ex) {
+            // shell command halted
+            throw new AdbComLinkKilledError("command link hung", ex);
+        }
+    }
+
+    /**
+     * Executes given test batch on a device
+     */
+    private void executeTestRunBatch(TestBatch batch) throws DeviceNotAvailableException {
+        // attempt full run once
+        executeTestRunBatchRun(batch);
+
+        // split remaining tests to two sub batches and execute both. This will terminate
+        // since executeTestRunBatchRun will always progress for a batch of size 1.
+        final ArrayList<TestIdentifier> pendingTests = new ArrayList<>();
+
+        for (TestIdentifier test : batch.tests) {
+            if (mInstanceListerner.isPendingTestInstance(test, batch.config)) {
+                pendingTests.add(test);
+            }
+        }
+
+        final int divisorNdx = pendingTests.size() / 2;
+        final List<TestIdentifier> headList = pendingTests.subList(0, divisorNdx);
+        final List<TestIdentifier> tailList = pendingTests.subList(divisorNdx, pendingTests.size());
+
+        // head
+        for (;;) {
+            TestBatch subBatch = selectRunBatch(headList, batch.config);
+
+            if (subBatch == null) {
+                break;
+            }
+
+            executeTestRunBatch(subBatch);
+        }
+
+        // tail
+        for (;;) {
+            TestBatch subBatch = selectRunBatch(tailList, batch.config);
+
+            if (subBatch == null) {
+                break;
+            }
+
+            executeTestRunBatch(subBatch);
+        }
+
+        if (getBatchNumPendingCases(batch) != 0) {
+            throw new AssertionError("executeTestRunBatch postcondition failed");
+        }
+    }
+
+    /**
+     * Runs one execution pass over the given batch.
+     *
+     * Tries to run the batch. Always makes progress (executes instances or modifies stability
+     * scores).
+     */
+    private void executeTestRunBatchRun(TestBatch batch) throws DeviceNotAvailableException {
+        if (getBatchNumPendingCases(batch) != batch.tests.size()) {
+            throw new AssertionError("executeTestRunBatchRun precondition failed");
+        }
+
+        checkInterrupted(); // throws if interrupted
+
+        final String testCases = generateTestCaseTrie(batch.tests);
+
+        mDevice.executeShellCommand("rm " + CASE_LIST_FILE_NAME);
+        mDevice.executeShellCommand("rm " + LOG_FILE_NAME);
+        mDevice.pushString(testCases + "\n", CASE_LIST_FILE_NAME);
+
+        final String instrumentationName =
                 "com.drawelements.deqp/com.drawelements.deqp.testercore.DeqpInstrumentation";
 
-        String command = String.format(
-                "am instrument %s -w -e deqpLogFileName \"%s\" -e deqpCmdLine \""
-                    + "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8\""
-                    + " -e deqpLogData \"%s\" %s",
-                AbiUtils.createAbiFlag(mAbi.getName()), logFileName, caseListFileName, mLogData,
-                instrumentationName);
+        final StringBuilder deqpCmdLine = new StringBuilder();
+        deqpCmdLine.append("--deqp-caselist-file=");
+        deqpCmdLine.append(CASE_LIST_FILE_NAME);
+        deqpCmdLine.append(" ");
+        deqpCmdLine.append(getRunConfigDisplayCmdLine(batch.config));
 
-        mDevice.executeShellCommand(command, parser);
-        parser.flush();
+        // If we are not logging data, do not bother outputting the images from the test exe.
+        if (!mLogData) {
+            deqpCmdLine.append(" --deqp-log-images=disable");
+        }
+
+        deqpCmdLine.append(" --deqp-watchdog=enable");
+
+        final String command = String.format(
+                "am instrument %s -w -e deqpLogFileName \"%s\" -e deqpCmdLine \"%s\""
+                    + " -e deqpLogData \"%s\" %s",
+                AbiUtils.createAbiFlag(mAbi.getName()), LOG_FILE_NAME, deqpCmdLine.toString(),
+                mLogData, instrumentationName);
+
+        final int numRemainingInstancesBefore = getNumRemainingInstances();
+        final InstrumentationParser parser = new InstrumentationParser(mInstanceListerner);
+        Throwable interruptingError = null;
+
+        try {
+            executeShellCommandAndReadOutput(command, parser);
+        } catch (Throwable ex) {
+            interruptingError = ex;
+        } finally {
+            parser.flush();
+        }
+
+        final boolean progressedSinceLastCall = mInstanceListerner.getCurrentTestId() != null ||
+                getNumRemainingInstances() < numRemainingInstancesBefore;
+
+        if (progressedSinceLastCall) {
+            mDeviceRecovery.onExecutionProgressed();
+        }
+
+        // interrupted, try to recover
+        if (interruptingError != null) {
+            if (interruptingError instanceof AdbComLinkOpenError) {
+                mDeviceRecovery.recoverConnectionRefused();
+            } else if (interruptingError instanceof AdbComLinkKilledError) {
+                mDeviceRecovery.recoverComLinkKilled();
+            } else if (interruptingError instanceof RunInterruptedException) {
+                // external run interruption request. Terminate immediately.
+                throw (RunInterruptedException)interruptingError;
+            } else {
+                CLog.e(interruptingError);
+                throw new RuntimeException(interruptingError);
+            }
+
+            // recoverXXX did not throw => recovery succeeded
+        } else if (!parser.wasSuccessful()) {
+            mDeviceRecovery.recoverComLinkKilled();
+            // recoverXXX did not throw => recovery succeeded
+        }
+
+        // Progress guarantees.
+        if (batch.tests.size() == 1) {
+            final TestIdentifier onlyTest = batch.tests.iterator().next();
+            final boolean wasTestExecuted =
+                    !mInstanceListerner.isPendingTestInstance(onlyTest, batch.config) &&
+                    mInstanceListerner.getCurrentTestId() == null;
+            final boolean wasLinkFailure = !parser.wasSuccessful() || interruptingError != null;
+
+            // Link failures can be caused by external events, require at least two observations
+            // until bailing.
+            if (!wasTestExecuted && (!wasLinkFailure || getTestInstabilityRating(onlyTest) > 0)) {
+                recordTestInstability(onlyTest);
+                // If we cannot finish the test, mark the case as a crash.
+                //
+                // If we couldn't even start the test, fail the test instance as non-executable.
+                // This is required so that a consistently crashing or non-existent tests will
+                // not cause futile (non-terminating) re-execution attempts.
+                if (mInstanceListerner.getCurrentTestId() != null) {
+                    mInstanceListerner.abortTest(onlyTest, INCOMPLETE_LOG_MESSAGE);
+                } else {
+                    mInstanceListerner.abortTest(onlyTest, NOT_EXECUTABLE_LOG_MESSAGE);
+                }
+            } else if (wasTestExecuted) {
+                clearTestInstability(onlyTest);
+            }
+        }
+        else
+        {
+            // Analyze results to update test stability ratings. If there is no interrupting test
+            // logged, increase instability rating of all remaining tests. If there is a
+            // interrupting test logged, increase only its instability rating.
+            //
+            // A successful run of tests clears instability rating.
+            if (mInstanceListerner.getCurrentTestId() == null) {
+                for (TestIdentifier test : batch.tests) {
+                    if (mInstanceListerner.isPendingTestInstance(test, batch.config)) {
+                        recordTestInstability(test);
+                    } else {
+                        clearTestInstability(test);
+                    }
+                }
+            } else {
+                recordTestInstability(mInstanceListerner.getCurrentTestId());
+                for (TestIdentifier test : batch.tests) {
+                    // \note: isPendingTestInstance is false for getCurrentTestId. Current ID is
+                    // considered 'running' and will be restored to 'pending' in endBatch().
+                    if (!test.equals(mInstanceListerner.getCurrentTestId()) &&
+                            !mInstanceListerner.isPendingTestInstance(test, batch.config)) {
+                        clearTestInstability(test);
+                    }
+                }
+            }
+        }
+
+        mInstanceListerner.endBatch();
+    }
+
+    private static String getRunConfigDisplayCmdLine(BatchRunConfiguration runConfig) {
+        final StringBuilder deqpCmdLine = new StringBuilder();
+        if (!runConfig.getGlConfig().isEmpty()) {
+            deqpCmdLine.append("--deqp-gl-config-name=");
+            deqpCmdLine.append(runConfig.getGlConfig());
+        }
+        if (!runConfig.getRotation().isEmpty()) {
+            if (deqpCmdLine.length() != 0) {
+                deqpCmdLine.append(" ");
+            }
+            deqpCmdLine.append("--deqp-screen-rotation=");
+            deqpCmdLine.append(runConfig.getRotation());
+        }
+        if (!runConfig.getSurfaceType().isEmpty()) {
+            if (deqpCmdLine.length() != 0) {
+                deqpCmdLine.append(" ");
+            }
+            deqpCmdLine.append("--deqp-surface-type=");
+            deqpCmdLine.append(runConfig.getSurfaceType());
+        }
+        return deqpCmdLine.toString();
+    }
+
+    private int getNumRemainingInstances() {
+        int retVal = 0;
+        for (TestIdentifier testId : mRemainingTests) {
+            // If case is in current working set, sum only not yet executed instances.
+            // If case is not in current working set, sum all instances (since they are not yet
+            // executed).
+            if (mInstanceListerner.mPendingResults.containsKey(testId)) {
+                retVal += mInstanceListerner.mPendingResults.get(testId).remainingConfigs.size();
+            } else {
+                retVal += mTestInstances.get(testId).size();
+            }
+        }
+        return retVal;
+    }
+
+    /**
+     * Checks if this execution has been marked as interrupted and throws if it has.
+     */
+    private void checkInterrupted() throws RunInterruptedException {
+        // Work around the API. RunUtil::checkInterrupted is private but we can call it indirectly
+        // by sleeping a value <= 0.
+        mRunUtil.sleep(0);
+    }
+
+    /**
+     * Pass given batch tests without running it
+     */
+    private void fakePassTestRunBatch(TestBatch batch) {
+        for (TestIdentifier test : batch.tests) {
+            CLog.d("Skipping test '%s' invocation in config '%s'", test.toString(),
+                    batch.config.getId());
+            mInstanceListerner.skipTest(test);
+        }
+    }
+
+    /**
+     * Pass all remaining tests without running them
+     */
+    private void fakePassTests(ITestInvocationListener listener) {
+        Map <String, String> emptyMap = Collections.emptyMap();
+        for (TestIdentifier test : mRemainingTests) {
+            CLog.d("Skipping test '%s', Opengl ES version not supported", test.toString());
+            listener.testStarted(test);
+            listener.testEnded(test, emptyMap);
+        }
+        mRemainingTests.clear();
     }
 
     /**
      * Check if device supports OpenGL ES version.
      */
-    static boolean isSupportedGles(ITestDevice device, int requiredMajorVersion, int requiredMinorVersion) throws DeviceNotAvailableException {
+    private static boolean isSupportedGles(ITestDevice device, int requiredMajorVersion,
+            int requiredMinorVersion) throws DeviceNotAvailableException {
         String roOpenglesVersion = device.getProperty("ro.opengles.version");
 
         if (roOpenglesVersion == null)
@@ -450,6 +1625,112 @@
     }
 
     /**
+     * Query if rendertarget is supported
+     */
+    private boolean isSupportedGlesRenderConfig(BatchRunConfiguration runConfig)
+            throws DeviceNotAvailableException, CapabilityQueryFailureException {
+        // query if configuration is supported
+        final StringBuilder configCommandLine =
+                new StringBuilder(getRunConfigDisplayCmdLine(runConfig));
+        if (configCommandLine.length() != 0) {
+            configCommandLine.append(" ");
+        }
+        configCommandLine.append("--deqp-gl-major-version=");
+        configCommandLine.append(getGlesMajorVersion());
+        configCommandLine.append(" --deqp-gl-minor-version=");
+        configCommandLine.append(getGlesMinorVersion());
+
+        final String commandLine = configCommandLine.toString();
+
+        // check for cached result first
+        if (mConfigQuerySupportCache.containsKey(commandLine)) {
+            return mConfigQuerySupportCache.get(commandLine);
+        }
+
+        final boolean supported = queryIsSupportedConfigCommandLine(commandLine);
+        mConfigQuerySupportCache.put(commandLine, supported);
+        return supported;
+    }
+
+    private boolean queryIsSupportedConfigCommandLine(String deqpCommandLine)
+            throws DeviceNotAvailableException, CapabilityQueryFailureException {
+        final String instrumentationName =
+                "com.drawelements.deqp/com.drawelements.deqp.platformutil.DeqpPlatformCapabilityQueryInstrumentation";
+        final String command = String.format(
+                "am instrument %s -w -e deqpQueryType renderConfigSupported -e deqpCmdLine \"%s\""
+                    + " %s",
+                AbiUtils.createAbiFlag(mAbi.getName()), deqpCommandLine, instrumentationName);
+
+        final PlatformQueryInstrumentationParser parser = new PlatformQueryInstrumentationParser();
+        mDevice.executeShellCommand(command, parser);
+        parser.flush();
+
+        if (parser.wasSuccessful() && parser.getResultCode() == 0 &&
+                parser.getResultMap().containsKey("Supported")) {
+            if ("Yes".equals(parser.getResultMap().get("Supported"))) {
+                return true;
+            } else if ("No".equals(parser.getResultMap().get("Supported"))) {
+                return false;
+            } else {
+                CLog.e("Capability query did not return a result");
+                throw new CapabilityQueryFailureException();
+            }
+        } else if (parser.wasSuccessful()) {
+            CLog.e("Failed to run capability query. Code: %d, Result: %s",
+                    parser.getResultCode(), parser.getResultMap().toString());
+            throw new CapabilityQueryFailureException();
+        } else {
+            CLog.e("Failed to run capability query");
+            throw new CapabilityQueryFailureException();
+        }
+    }
+
+    /**
+     * Return feature set supported by the device
+     */
+    private Set<String> getDeviceFeatures(ITestDevice device)
+            throws DeviceNotAvailableException, CapabilityQueryFailureException {
+        if (mDeviceFeatures == null) {
+            mDeviceFeatures = queryDeviceFeatures(device);
+        }
+        return mDeviceFeatures;
+    }
+
+    /**
+     * Query feature set supported by the device
+     */
+    private static Set<String> queryDeviceFeatures(ITestDevice device)
+            throws DeviceNotAvailableException, CapabilityQueryFailureException {
+        // NOTE: Almost identical code in BaseDevicePolicyTest#hasDeviceFeatures
+        // TODO: Move this logic to ITestDevice.
+        String command = "pm list features";
+        String commandOutput = device.executeShellCommand(command);
+
+        // Extract the id of the new user.
+        HashSet<String> availableFeatures = new HashSet<>();
+        for (String feature: commandOutput.split("\\s+")) {
+            // Each line in the output of the command has the format "feature:{FEATURE_VALUE}".
+            String[] tokens = feature.split(":");
+            if (tokens.length < 2 || !"feature".equals(tokens[0])) {
+                CLog.e("Failed parse features. Unexpect format on line \"%s\"", tokens[0]);
+                throw new CapabilityQueryFailureException();
+            }
+            availableFeatures.add(tokens[1]);
+        }
+        return availableFeatures;
+    }
+
+    private boolean isPortraitClassRotation(String rotation) {
+        return BatchRunConfiguration.ROTATION_PORTRAIT.equals(rotation) ||
+                BatchRunConfiguration.ROTATION_REVERSE_PORTRAIT.equals(rotation);
+    }
+
+    private boolean isLandscapeClassRotation(String rotation) {
+        return BatchRunConfiguration.ROTATION_LANDSCAPE.equals(rotation) ||
+                BatchRunConfiguration.ROTATION_REVERSE_LANDSCAPE.equals(rotation);
+    }
+
+    /**
      * Install dEQP OnDevice Package
      */
     private void installTestApk() throws DeviceNotAvailableException {
@@ -473,60 +1754,53 @@
     }
 
     /**
-     * {@inheritDoc}
+     * Parse gl nature from package name
      */
-    @Override
-    public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
-        mListener = listener;
-
-        if ((mName.equals( "dEQP-GLES3") && isSupportedGles(mDevice, 3, 0))
-            || (mName.equals("dEQP-GLES31") && isSupportedGles(mDevice, 3, 1))) {
-
-            // Make sure there is no pre-existing package form earlier interrupted test run.
-            uninstallTestApk();
-            installTestApk();
-
-            while (!mTests.isEmpty()) {
-                executeTests(listener);
-
-                // Set test to failed if it didn't receive test result
-                if (mCurrentTestId != null) {
-                    Map <String, String> emptyMap = Collections.emptyMap();
-
-                    if (mLogData && mCurrentTestLog != null && mCurrentTestLog.length() > 0) {
-                        ByteArrayInputStreamSource source
-                                = new ByteArrayInputStreamSource(mCurrentTestLog.getBytes());
-
-                        mListener.testLog(mCurrentTestId.getClassName() + "."
-                                + mCurrentTestId.getTestName(), LogDataType.XML, source);
-
-                        source.cancel();
-                    }
-                    if (!mGotTestResult) {
-                        mListener.testFailed(mCurrentTestId,
-                            INCOMPLETE_LOG_MESSAGE);
-                    }
-
-                    mListener.testEnded(mCurrentTestId, emptyMap);
-                    mCurrentTestId = null;
-                    mListener.testRunEnded(0, emptyMap);
-                }
-            }
-
-            uninstallTestApk();
+    private boolean isOpenGlEsPackage() {
+        if ("dEQP-GLES2".equals(mName) || "dEQP-GLES3".equals(mName) ||
+                "dEQP-GLES31".equals(mName)) {
+            return true;
+        } else if ("dEQP-EGL".equals(mName)) {
+            return false;
         } else {
-            /* Pass all tests if OpenGL ES version is not supported */
-            Map <String, String> emptyMap = Collections.emptyMap();
-            String id = AbiUtils.createId(mAbi.getName(), mPackageName);
-            mListener.testRunStarted(id, mTests.size());
+            throw new IllegalStateException("dEQP runner was created with illegal name");
+        }
+    }
 
-            for (TestIdentifier test : mTests) {
-                CLog.d("Skipping test '%s', Opengl ES version not supported", test.toString());
-                mListener.testStarted(test);
-                mListener.testEnded(test, emptyMap);
-            }
+    /**
+     * Check GL support (based on package name)
+     */
+    private boolean isSupportedGles() throws DeviceNotAvailableException {
+        return isSupportedGles(mDevice, getGlesMajorVersion(), getGlesMinorVersion());
+    }
 
-            mListener.testRunEnded(0, emptyMap);
+    /**
+     * Get GL major version (based on package name)
+     */
+    private int getGlesMajorVersion() throws DeviceNotAvailableException {
+        if ("dEQP-GLES2".equals(mName)) {
+            return 2;
+        } else if ("dEQP-GLES3".equals(mName)) {
+            return 3;
+        } else if ("dEQP-GLES31".equals(mName)) {
+            return 3;
+        } else {
+            throw new IllegalStateException("getGlesMajorVersion called for non gles pkg");
+        }
+    }
+
+    /**
+     * Get GL minor version (based on package name)
+     */
+    private int getGlesMinorVersion() throws DeviceNotAvailableException {
+        if ("dEQP-GLES2".equals(mName)) {
+            return 0;
+        } else if ("dEQP-GLES3".equals(mName)) {
+            return 0;
+        } else if ("dEQP-GLES31".equals(mName)) {
+            return 1;
+        } else {
+            throw new IllegalStateException("getGlesMinorVersion called for non gles pkg");
         }
     }
 
@@ -534,15 +1808,34 @@
      * {@inheritDoc}
      */
     @Override
-    public void setDevice(ITestDevice device) {
-        mDevice = device;
-    }
+    public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
+        final Map<String, String> emptyMap = Collections.emptyMap();
+        final boolean isSupportedApi = !isOpenGlEsPackage() || isSupportedGles();
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public ITestDevice getDevice() {
-        return mDevice;
+        listener.testRunStarted(getId(), mRemainingTests.size());
+
+        try {
+            if (isSupportedApi) {
+                // Make sure there is no pre-existing package form earlier interrupted test run.
+                uninstallTestApk();
+                installTestApk();
+
+                mInstanceListerner.setSink(listener);
+                mDeviceRecovery.setDevice(mDevice);
+                runTests();
+
+                uninstallTestApk();
+            } else {
+                // Pass all tests if OpenGL ES version is not supported
+                fakePassTests(listener);
+            }
+        } catch (CapabilityQueryFailureException ex) {
+            // Platform is not behaving correctly, for example crashing when trying to create
+            // a window. Instead of silenty failing, signal failure by leaving the rest of the
+            // test cases in "NotExecuted" state
+            uninstallTestApk();
+        }
+
+        listener.testRunEnded(0, emptyMap);
     }
 }
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DisplayTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DisplayTestRunner.java
deleted file mode 100644
index 3dee99e..0000000
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/DisplayTestRunner.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2012 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 com.android.cts.tradefed.testtype;
-
-import com.android.cts.tradefed.targetprep.SettingsToggler;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.result.ITestInvocationListener;
-
-/**
- * Running the display tests requires modification of secure settings to create an overlay display.
- * Secure settings cannot be changed from device CTS tests since system signature permission is
- * required. Such settings can be modified by the shell user, so a host side test is used.
- */
-public class DisplayTestRunner extends CtsInstrumentationApkTest {
-    private static final String OVERLAY_DISPLAY_DEVICES_SETTING_NAME = "overlay_display_devices";
-
-    // Use a non-standard pattern, must match values in tests/tests/display/.../DisplayTest.java
-    private static final String OVERLAY_DISPLAY_DEVICES_SETTING_VALUE = "181x161/214";
-
-    @Override
-    public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
-        // CLog.e("run: About to enable overlay display.");
-        SettingsToggler.setGlobalString(getDevice(), OVERLAY_DISPLAY_DEVICES_SETTING_NAME,
-                OVERLAY_DISPLAY_DEVICES_SETTING_VALUE);
-
-        super.run(listener);
-
-        // Tear down overlay display.
-        // CLog.e("run: About to disable overlay display.");
-        SettingsToggler.setGlobalString(getDevice(), OVERLAY_DISPLAY_DEVICES_SETTING_NAME,
-                "");
-    }
-}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTest.java
index 6c2ed65..2e4420d 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/GeeTest.java
@@ -29,6 +29,8 @@
 import com.android.tradefed.testtype.IRemoteTest;
 
 import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Test runner for native gTests.
@@ -43,6 +45,7 @@
     private static final String NATIVE_TESTS_DIRECTORY = "/data/local/tmp/cts-native-tests";
     private static final String NATIVE_TESTS_DIRECTORY_TMP = "/data/local/tmp";
     private static final String ANDROID_PATH_SEPARATOR = "/";
+    private static final String GTEST_FLAG_FILTER = "--gtest_filter=";
 
     private int mMaxTestTimeMs = 1 * 60 * 1000;
 
@@ -53,11 +56,48 @@
 
     private final String mPackageName;
 
+    private String mPositiveFilters = "";
+    private String mNegativeFilters = "";
+
     public GeeTest(String packageName, String exeName) {
         mPackageName = packageName;
         mExeName = exeName;
     }
 
+    public void setPositiveFilters(String positiveFilters) {
+        mPositiveFilters = positiveFilters;
+    }
+
+    public void setNegativeFilters(String negativeFilters) {
+        mNegativeFilters = negativeFilters;
+    }
+
+    protected String getGTestFilters() {
+        // If both filters are empty or null return empty string.
+        if (mPositiveFilters == null && mNegativeFilters == null) {
+            return "";
+        }
+        if (mPositiveFilters.isEmpty() && mNegativeFilters.isEmpty()) {
+            return "";
+        }
+        // Build filter string.
+        StringBuilder sb = new StringBuilder();
+        sb.append(GTEST_FLAG_FILTER);
+        boolean hasPositiveFilters = false;
+        if (mPositiveFilters != null && !mPositiveFilters.isEmpty()) {
+            sb.append(mPositiveFilters);
+            hasPositiveFilters = true;
+        }
+        if (mNegativeFilters != null && ! mNegativeFilters.isEmpty()) {
+            if (hasPositiveFilters) {
+                sb.append(":");
+            }
+            sb.append("-");
+            sb.append(mNegativeFilters);
+        }
+        return sb.toString();
+    }
+
     /**
      * @param abi The ABI to run the test on
      */
@@ -113,7 +153,7 @@
         resultParser.setFakePackagePrefix(mPackageName + ".");
 
         String fullPath = NATIVE_TESTS_DIRECTORY + ANDROID_PATH_SEPARATOR + mExeName;
-        String flags = "";
+        String flags = getGTestFilters();
         CLog.v("Running gtest %s %s on %s", fullPath, flags, mDevice.getSerialNumber());
         // force file to be executable
         CLog.v("%s", mDevice.executeShellCommand(String.format("chmod 755 %s", fullPath)));
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageDef.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageDef.java
index 8a5c822..13f3572 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageDef.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/ITestPackageDef.java
@@ -17,11 +17,13 @@
 package com.android.cts.tradefed.testtype;
 
 import com.android.ddmlib.testrunner.TestIdentifier;
+import com.android.tradefed.targetprep.ITargetPreparer;
 import com.android.tradefed.testtype.IAbi;
 import com.android.tradefed.testtype.IRemoteTest;
 
 import java.io.File;
 import java.util.Collection;
+import java.util.List;
 
 /**
  * Container for CTS test info.
@@ -98,4 +100,9 @@
      */
     public String getTargetPackageName();
 
+    /**
+     * Return a list of preparers used for setup or teardown of test cases in this package
+     * @return
+     */
+    public List<ITargetPreparer> getPackagePreparers();
 }
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRemoteTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRemoteTestRunner.java
deleted file mode 100644
index 72dccd4..0000000
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRemoteTestRunner.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.android.cts.tradefed.testtype;
-
-import com.android.ddmlib.AdbCommandRejectedException;
-import com.android.ddmlib.IShellEnabledDevice;
-import com.android.ddmlib.Log;
-import com.android.ddmlib.ShellCommandUnresponsiveException;
-import com.android.ddmlib.TimeoutException;
-import com.android.ddmlib.testrunner.IRemoteAndroidTestRunner;
-import com.android.ddmlib.testrunner.ITestRunListener;
-import com.android.ddmlib.testrunner.InstrumentationResultParser;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Hashtable;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.concurrent.TimeUnit;
-
-public class PrintTestRemoteTestRunner implements IRemoteAndroidTestRunner {
-
-    private final String mPackageName;
-    private final String mRunnerName;
-    private IShellEnabledDevice mRemoteDevice;
-    // default to no timeout
-    private long mMaxTimeToOutputResponse = 0;
-    private TimeUnit mMaxTimeUnits = TimeUnit.MILLISECONDS;
-    private String mRunName = null;
-
-    /** map of name-value instrumentation argument pairs */
-    private Map<String, String> mArgMap;
-    private InstrumentationResultParser mParser;
-
-    private static final String LOG_TAG = "RemoteAndroidTest";
-    private static final String DEFAULT_RUNNER_NAME = "android.test.InstrumentationTestRunner";
-
-    private static final char CLASS_SEPARATOR = ',';
-    private static final char METHOD_SEPARATOR = '#';
-    private static final char RUNNER_SEPARATOR = '/';
-
-    // defined instrumentation argument names
-    private static final String CLASS_ARG_NAME = "class";
-    private static final String LOG_ARG_NAME = "log";
-    private static final String DEBUG_ARG_NAME = "debug";
-    private static final String COVERAGE_ARG_NAME = "coverage";
-    private static final String PACKAGE_ARG_NAME = "package";
-    private static final String SIZE_ARG_NAME = "size";
-
-    // This command starts a shell Java program (installed by this class)
-    // in the folder owned by the shell user. This app creates a proxy
-    // which does privileged operations such as wiping a package's user
-    // data and then starts the tests passing the proxy. This enables
-    // the tests to clear the print spooler data.
-    private static final String INSTRUMENTATION_COMMAND =
-            "chmod 755 /data/local/tmp/print-instrument && "
-            + "/data/local/tmp/print-instrument instrument -w -r %1$s %2$s";
-
-    /**
-     * Creates a remote Android test runner.
-     *
-     * @param packageName the Android application package that contains the
-     *            tests to run
-     * @param runnerName the instrumentation test runner to execute. If null,
-     *            will use default runner
-     * @param remoteDevice the Android device to execute tests on
-     */
-    public PrintTestRemoteTestRunner(String packageName, String runnerName,
-            IShellEnabledDevice remoteDevice) {
-
-        mPackageName = packageName;
-        mRunnerName = runnerName;
-        mRemoteDevice = remoteDevice;
-        mArgMap = new Hashtable<String, String>();
-    }
-
-    /**
-     * Alternate constructor. Uses default instrumentation runner.
-     *
-     * @param packageName the Android application package that contains the
-     *            tests to run
-     * @param remoteDevice the Android device to execute tests on
-     */
-    public PrintTestRemoteTestRunner(String packageName, IShellEnabledDevice remoteDevice) {
-        this(packageName, null, remoteDevice);
-    }
-
-    @Override
-    public String getPackageName() {
-        return mPackageName;
-    }
-
-    @Override
-    public String getRunnerName() {
-        if (mRunnerName == null) {
-            return DEFAULT_RUNNER_NAME;
-        }
-        return mRunnerName;
-    }
-
-    /**
-     * Returns the complete instrumentation component path.
-     */
-    private String getRunnerPath() {
-        return getPackageName() + RUNNER_SEPARATOR + getRunnerName();
-    }
-
-    @Override
-    public void setClassName(String className) {
-        addInstrumentationArg(CLASS_ARG_NAME, className);
-    }
-
-    @Override
-    public void setClassNames(String[] classNames) {
-        StringBuilder classArgBuilder = new StringBuilder();
-
-        for (int i = 0; i < classNames.length; i++) {
-            if (i != 0) {
-                classArgBuilder.append(CLASS_SEPARATOR);
-            }
-            classArgBuilder.append(classNames[i]);
-        }
-        setClassName(classArgBuilder.toString());
-    }
-
-    @Override
-    public void setMethodName(String className, String testName) {
-        setClassName(className + METHOD_SEPARATOR + testName);
-    }
-
-    @Override
-    public void setTestPackageName(String packageName) {
-        addInstrumentationArg(PACKAGE_ARG_NAME, packageName);
-    }
-
-    @Override
-    public void addInstrumentationArg(String name, String value) {
-        if (name == null || value == null) {
-            throw new IllegalArgumentException("name or value arguments cannot be null");
-        }
-        mArgMap.put(name, value);
-    }
-
-    @Override
-    public void removeInstrumentationArg(String name) {
-        if (name == null) {
-            throw new IllegalArgumentException("name argument cannot be null");
-        }
-        mArgMap.remove(name);
-    }
-
-    @Override
-    public void addBooleanArg(String name, boolean value) {
-        addInstrumentationArg(name, Boolean.toString(value));
-    }
-
-    @Override
-    public void setLogOnly(boolean logOnly) {
-        addBooleanArg(LOG_ARG_NAME, logOnly);
-    }
-
-    @Override
-    public void setDebug(boolean debug) {
-        addBooleanArg(DEBUG_ARG_NAME, debug);
-    }
-
-    @Override
-    public void setCoverage(boolean coverage) {
-        addBooleanArg(COVERAGE_ARG_NAME, coverage);
-    }
-
-    @Override
-    public void setTestCollection(boolean b) {
-        throw new UnsupportedOperationException("Test Collection mode is not supported");
-    }
-
-    @Override
-    public void setTestSize(TestSize size) {
-        addInstrumentationArg(SIZE_ARG_NAME, ""/*size.getRunnerValue()*/);
-    }
-
-    @Override
-    public void setMaxtimeToOutputResponse(int maxTimeToOutputResponse) {
-        setMaxTimeToOutputResponse(maxTimeToOutputResponse, TimeUnit.MILLISECONDS);
-    }
-
-    @Override
-    public void setMaxTimeToOutputResponse(long maxTimeToOutputResponse, TimeUnit maxTimeUnits) {
-        mMaxTimeToOutputResponse = maxTimeToOutputResponse;
-        mMaxTimeUnits = maxTimeUnits;
-    }
-
-    @Override
-    public void setRunName(String runName) {
-        mRunName = runName;
-    }
-
-    @Override
-    public void run(ITestRunListener... listeners) throws TimeoutException,
-            AdbCommandRejectedException, ShellCommandUnresponsiveException, IOException {
-        run(Arrays.asList(listeners));
-    }
-
-    @Override
-    public void run(Collection<ITestRunListener> listeners) throws TimeoutException,
-            AdbCommandRejectedException, ShellCommandUnresponsiveException, IOException {
-        final String runCaseCommandStr = String.format(INSTRUMENTATION_COMMAND,
-              getArgsCommand(), getRunnerPath());
-        Log.i(LOG_TAG,
-                String.format("Running %1$s on %2$s", runCaseCommandStr, mRemoteDevice.getName()));
-        String runName = mRunName == null ? mPackageName : mRunName;
-        mParser = new InstrumentationResultParser(runName, listeners);
-
-        try {
-            mRemoteDevice.executeShellCommand(runCaseCommandStr, mParser, mMaxTimeToOutputResponse,
-                    mMaxTimeUnits);
-        } catch (IOException e) {
-            Log.w(LOG_TAG, String.format("IOException %1$s when running tests %2$s on %3$s",
-                    e.toString(), getPackageName(), mRemoteDevice.getName()));
-            // rely on parser to communicate results to listeners
-            mParser.handleTestRunFailed(e.toString());
-            throw e;
-        } catch (ShellCommandUnresponsiveException e) {
-            Log.w(LOG_TAG, String.format(
-                    "ShellCommandUnresponsiveException %1$s when running tests %2$s on %3$s",
-                    e.toString(), getPackageName(), mRemoteDevice.getName()));
-            mParser.handleTestRunFailed(String
-                    .format("Failed to receive adb shell test output within %1$d ms. "
-                            + "Test may have timed out, or adb connection to device became"
-                            + "unresponsive", mMaxTimeToOutputResponse));
-            throw e;
-        } catch (TimeoutException e) {
-            Log.w(LOG_TAG, String.format("TimeoutException when running tests %1$s on %2$s",
-                    getPackageName(), mRemoteDevice.getName()));
-            mParser.handleTestRunFailed(e.toString());
-            throw e;
-        } catch (AdbCommandRejectedException e) {
-            Log.w(LOG_TAG, String.format(
-                    "AdbCommandRejectedException %1$s when running tests %2$s on %3$s",
-                    e.toString(), getPackageName(), mRemoteDevice.getName()));
-            mParser.handleTestRunFailed(e.toString());
-            throw e;
-        }
-    }
-
-    @Override
-    public void cancel() {
-        if (mParser != null) {
-            mParser.cancel();
-        }
-    }
-
-    /**
-     * Returns the full instrumentation command line syntax for the provided
-     * instrumentation arguments. Returns an empty string if no arguments were
-     * specified.
-     */
-    private String getArgsCommand() {
-        StringBuilder commandBuilder = new StringBuilder();
-        for (Entry<String, String> argPair : mArgMap.entrySet()) {
-            final String argCmd = String.format(" -e %1$s %2$s", argPair.getKey(),
-                    argPair.getValue());
-            commandBuilder.append(argCmd);
-        }
-        return commandBuilder.toString();
-    }
-}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRunner.java
deleted file mode 100644
index 44d2d3a..0000000
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/PrintTestRunner.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.android.cts.tradefed.testtype;
-
-import com.android.cts.tradefed.build.CtsBuildHelper;
-import com.android.cts.tradefed.targetprep.SettingsToggler;
-import com.android.cts.util.AbiUtils;
-import com.android.ddmlib.testrunner.IRemoteAndroidTestRunner;
-import com.android.ddmlib.testrunner.IRemoteAndroidTestRunner.TestSize;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.device.ITestDevice;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.testtype.IAbi;
-import com.android.tradefed.testtype.IBuildReceiver;
-import com.android.tradefed.testtype.IDeviceTest;
-import com.android.tradefed.testtype.IRemoteTest;
-import com.android.tradefed.util.StringEscapeUtils;
-
-import java.io.FileNotFoundException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Running the print tests requires modification of secure settings. Secure
- * settings cannot be changed from device CTS tests since system signature
- * permission is required. Such settings can be modified by the shell user,
- * so a host side test driver is used for enabling these services, running
- * the tests, and disabling the services.
- */
-public class PrintTestRunner implements IBuildReceiver, IRemoteTest, IDeviceTest  {
-
-    private static final String PRINT_TEST_AND_SERVICES_APP_NAME =
-            "CtsPrintTestCases.apk";
-
-    private static final String PRINT_TESTS_PACKAGE_NAME =
-            "com.android.cts.print";
-
-    private static final String FIRST_PRINT_SERVICE_NAME =
-            "android.print.cts.services.FirstPrintService";
-
-    private static final String SECOND_PRINT_SERVICE_NAME =
-            "android.print.cts.services.SecondPrintService";
-
-    private static final String SHELL_USER_FOLDER = "data/local/tmp";
-
-    private static final String PRINT_INSTRUMENT_JAR = "CtsPrintInstrument.jar";
-
-    private static final String PRINT_INSTRUMENT_SCRIPT = "print-instrument";
-
-    private ITestDevice mDevice;
-
-    private CtsBuildHelper mCtsBuild;
-
-    private IAbi mAbi;
-    private String mPackageName;
-    private String mRunnerName = "android.test.InstrumentationTestRunner";
-    private String mTestClassName;
-    private String mTestMethodName;
-    private String mTestPackageName;
-    private int mTestTimeout = 10 * 60 * 1000;  // 10 minutes
-    private String mTestSize;
-    private String mRunName = null;
-    private Map<String, String> mInstrArgMap = new HashMap<String, String>();
-
-    /**
-     * @param abi The ABI to run the test on
-     */
-    public void setAbi(IAbi abi) {
-        mAbi = abi;
-    }
-
-    @Override
-    public void setBuild(IBuildInfo buildInfo) {
-        mCtsBuild = CtsBuildHelper.createBuildHelper(buildInfo);
-    }
-
-    @Override
-    public void setDevice(ITestDevice device) {
-        mDevice = device;
-    }
-
-    @Override
-    public ITestDevice getDevice() {
-        return mDevice;
-    }
-
-    public void setPackageName(String packageName) {
-        mPackageName = packageName;
-    }
-
-    public void setRunnerName(String runnerName) {
-        mRunnerName = runnerName;
-    }
-
-    public void setClassName(String testClassName) {
-        mTestClassName = testClassName;
-    }
-
-    public void setMethodName(String testMethodName) {
-        mTestMethodName = StringEscapeUtils.escapeShell(testMethodName);
-    }
-
-    public void setTestPackageName(String testPackageName) {
-        mTestPackageName = testPackageName;
-    }
-
-    public void setTestSize(String size) {
-        mTestSize = size;
-    }
-
-    public void setRunName(String runName) {
-        mRunName = runName;
-    }
-
-    @Override
-    public void run(final ITestInvocationListener listener) throws DeviceNotAvailableException {
-        installShellProgramAndScriptFiles();
-        installTestsAndServicesApk();
-        enablePrintServices();
-        doRunTests(listener);
-        disablePrintServices();
-        uninstallTestsAndServicesApk();
-        uninstallShellProgramAndScriptFiles();
-    }
-
-    private void doRunTests(ITestInvocationListener listener)
-            throws DeviceNotAvailableException {
-        if (mPackageName == null) {
-            throw new IllegalArgumentException("package name has not been set");
-        }
-        if (mDevice == null) {
-            throw new IllegalArgumentException("Device has not been set");
-        }
-
-        IRemoteAndroidTestRunner runner =  new PrintTestRemoteTestRunner(mPackageName,
-                mRunnerName, mDevice.getIDevice());
-
-        if (mTestClassName != null) {
-            if (mTestMethodName != null) {
-                runner.setMethodName(mTestClassName, mTestMethodName);
-            } else {
-                runner.setClassName(mTestClassName);
-            }
-        } else if (mTestPackageName != null) {
-            runner.setTestPackageName(mTestPackageName);
-        }
-        if (mTestSize != null) {
-            runner.setTestSize(TestSize.getTestSize(mTestSize));
-        }
-        runner.setMaxTimeToOutputResponse(mTestTimeout, TimeUnit.MILLISECONDS);
-        if (mRunName != null) {
-            runner.setRunName(mRunName);
-        }
-        for (Map.Entry<String, String> argEntry : mInstrArgMap.entrySet()) {
-            runner.addInstrumentationArg(argEntry.getKey(), argEntry.getValue());
-        }
-
-        mDevice.runInstrumentationTests(runner, listener);
-    }
-
-    private void installShellProgramAndScriptFiles() throws DeviceNotAvailableException {
-        installFile(PRINT_INSTRUMENT_JAR);
-        installFile(PRINT_INSTRUMENT_SCRIPT);
-    }
-
-    private void installFile(String fileName) throws DeviceNotAvailableException {
-        try {
-            final boolean success = getDevice().pushFile(mCtsBuild.getTestApp(
-                    fileName), SHELL_USER_FOLDER + "/" + fileName);
-            if (!success) {
-                throw new IllegalArgumentException("Failed to install "
-                        + fileName + " on " + getDevice().getSerialNumber());
-           }
-        } catch (FileNotFoundException fnfe) {
-            throw new IllegalArgumentException("Cannot find file: " + fileName);
-        }
-    }
-
-    private void uninstallShellProgramAndScriptFiles() throws DeviceNotAvailableException {
-        getDevice().executeShellCommand("rm " + SHELL_USER_FOLDER + "/"
-                + PRINT_INSTRUMENT_JAR);
-        getDevice().executeShellCommand("rm " + SHELL_USER_FOLDER + "/"
-                + PRINT_INSTRUMENT_SCRIPT);
-    }
-
-    private void installTestsAndServicesApk() throws DeviceNotAvailableException {
-        try {
-            String[] options = {AbiUtils.createAbiFlag(mAbi.getName())};
-            String installCode = getDevice().installPackage(mCtsBuild.getTestApp(
-                    PRINT_TEST_AND_SERVICES_APP_NAME), true, options);
-            if (installCode != null) {
-                throw new IllegalArgumentException("Failed to install "
-                        + PRINT_TEST_AND_SERVICES_APP_NAME + " on " + getDevice().getSerialNumber()
-                        + ". Reason: " + installCode);
-           }
-        } catch (FileNotFoundException fnfe) {
-            throw new IllegalArgumentException("Cannot find file: "
-                    + PRINT_TEST_AND_SERVICES_APP_NAME);
-        }
-    }
-
-    private void uninstallTestsAndServicesApk() throws DeviceNotAvailableException {
-        getDevice().uninstallPackage(PRINT_TESTS_PACKAGE_NAME);
-    }
-
-    private void enablePrintServices() throws DeviceNotAvailableException {
-        String enabledServicesValue = PRINT_TESTS_PACKAGE_NAME + "/" + FIRST_PRINT_SERVICE_NAME
-                + ":" + PRINT_TESTS_PACKAGE_NAME + "/" + SECOND_PRINT_SERVICE_NAME;
-        SettingsToggler.setSecureString(getDevice(), "enabled_print_services",
-                enabledServicesValue);
-    }
-
-    private void disablePrintServices() throws DeviceNotAvailableException {
-        SettingsToggler.setSecureString(getDevice(), "enabled_print_services", "");
-    }
-}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
index 9ef6257..12c3ddd 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
@@ -20,6 +20,7 @@
 import com.android.ddmlib.Log.LogLevel;
 import com.android.ddmlib.testrunner.TestIdentifier;
 import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.targetprep.ITargetPreparer;
 import com.android.tradefed.testtype.IAbi;
 import com.android.tradefed.testtype.IRemoteTest;
 import com.android.tradefed.testtype.InstrumentationTest;
@@ -35,7 +36,11 @@
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.Collection;
+import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 
 /**
  * Container for CTS test info.
@@ -49,14 +54,6 @@
     public static final String WRAPPED_NATIVE_TEST = "wrappednative";
     public static final String VM_HOST_TEST = "vmHostTest";
     public static final String DEQP_TEST = "deqpTest";
-    public static final String ACCESSIBILITY_TEST =
-            "com.android.cts.tradefed.testtype.AccessibilityTestRunner";
-    public static final String ACCESSIBILITY_SERVICE_TEST =
-            "com.android.cts.tradefed.testtype.AccessibilityServiceTestRunner";
-    public static final String PRINT_TEST =
-            "com.android.cts.tradefed.testtype.PrintTestRunner";
-    public static final String DISPLAY_TEST =
-            "com.android.cts.tradefed.testtype.DisplayTestRunner";
     public static final String UIAUTOMATOR_TEST = "uiAutomator";
     public static final String JUNIT_DEVICE_TEST = "jUnitDeviceTest";
 
@@ -70,12 +67,16 @@
     private String mTestPackageName = null;
     private String mDigest = null;
     private IAbi mAbi = null;
+    private List<ITargetPreparer> mPreparers = null;
 
     // use a LinkedHashSet for predictable iteration insertion-order, and fast
     // lookups
     private Collection<TestIdentifier> mTests = new LinkedHashSet<TestIdentifier>();
     // also maintain an index of known test classes
     private Collection<String> mTestClasses = new LinkedHashSet<String>();
+    // store instance arguments in order too for consistency
+    private Map<TestIdentifier, List<Map<String, String>>> mTestInstanceArguments =
+            new LinkedHashMap<>();
 
     // dynamic options, not parsed from package xml
     private String mClassName;
@@ -210,6 +211,22 @@
     }
 
     /**
+     * Setter for injecting a list of {@link ITargetPreparer}s as configured in module test config.
+     * @param preparers
+     */
+    void setPackagePreparers(List<ITargetPreparer> preparers) {
+        mPreparers = preparers;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public List<ITargetPreparer> getPackagePreparers() {
+        return mPreparers;
+    }
+
+    /**
      * {@inheritDoc}
      */
     @Override
@@ -240,7 +257,8 @@
             mDigest = generateDigest(testCaseDir, mJarPath);
             return vmHostTest;
         } else if (DEQP_TEST.equals(mTestType)) {
-            DeqpTestRunner deqpTest = new DeqpTestRunner(mAppPackageName, mName, mTests);
+            DeqpTestRunner deqpTest =
+                    new DeqpTestRunner(mAppPackageName, mName, mTests, mTestInstanceArguments);
             deqpTest.setAbi(mAbi);
             return deqpTest;
         } else if (NATIVE_TEST.equals(mTestType)) {
@@ -252,19 +270,6 @@
             WrappedGTest wrappedGeeTest = new WrappedGTest(mAppNameSpace, mAppPackageName, mName, mRunner);
             wrappedGeeTest.setAbi(mAbi);
             return wrappedGeeTest;
-        } else if (ACCESSIBILITY_TEST.equals(mTestType)) {
-            AccessibilityTestRunner test = new AccessibilityTestRunner();
-            return setInstrumentationTest(test, testCaseDir);
-        } else if (PRINT_TEST.equals(mTestType)) {
-            PrintTestRunner test = new PrintTestRunner();
-            return setPrintTest(test, testCaseDir);
-        } else if (ACCESSIBILITY_SERVICE_TEST.equals(mTestType)) {
-            @SuppressWarnings("deprecation")
-            AccessibilityServiceTestRunner test = new AccessibilityServiceTestRunner();
-            return setInstrumentationTest(test, testCaseDir);
-        } else if (DISPLAY_TEST.equals(mTestType)) {
-            DisplayTestRunner test = new DisplayTestRunner();
-            return setInstrumentationTest(test, testCaseDir);
         } else if (UIAUTOMATOR_TEST.equals(mTestType)) {
             UiAutomatorJarTest uiautomatorTest = new UiAutomatorJarTest();
             return setUiAutomatorTest(uiautomatorTest);
@@ -291,19 +296,6 @@
         }
     }
 
-    private PrintTestRunner setPrintTest(PrintTestRunner printTest,
-            File testCaseDir) {
-        printTest.setRunName(mAppPackageName);
-        printTest.setPackageName(mAppNameSpace);
-        printTest.setRunnerName(mRunner);
-        printTest.setTestPackageName(mTestPackageName);
-        printTest.setClassName(mClassName);
-        printTest.setMethodName(mMethodName);
-        printTest.setAbi(mAbi);
-        mDigest = generateDigest(testCaseDir, String.format("%s.apk", mName));
-        return printTest;
-    }
-
     /**
      * Populates given {@link CtsInstrumentationApkTest} with data from the package xml.
      *
@@ -316,9 +308,6 @@
         instrTest.setRunName(mAppPackageName);
         instrTest.setPackageName(mAppNameSpace);
         instrTest.setRunnerName(mRunner);
-        instrTest.setTestPackageName(mTestPackageName);
-        instrTest.setClassName(mClassName);
-        instrTest.setMethodName(mMethodName);
         instrTest.setAbi(mAbi);
         instrTest.setTestsToRun(mTests, false
             /* force batch mode off to always run using testFile */);
@@ -379,6 +368,7 @@
     void addTest(TestIdentifier testDef, int timeout) {
         mTests.add(testDef);
         mTestClasses.add(testDef.getClassName());
+        mTestInstanceArguments.put(testDef, new LinkedList<Map<String, String>>());
         // 0 means no timeout, so keep 0 if already is.
         if ((timeout > mTimeoutInMins) && (mTimeoutInMins != 0)) {
             mTimeoutInMins = timeout;
@@ -386,6 +376,16 @@
     }
 
     /**
+     * Add a test instance to an existing {@link TestIdentifier}.
+     */
+    void addTestInstance(TestIdentifier testDef, Map<String, String> instanceArguments) {
+        if (!mTestInstanceArguments.containsKey(testDef)) {
+            throw new IllegalStateException("test id does not name an existing test");
+        }
+        mTestInstanceArguments.get(testDef).add(instanceArguments);
+    }
+
+    /**
      * {@inheritDoc}
      */
     @Override
@@ -394,6 +394,15 @@
     }
 
     /**
+     * Get the instance argument map for tests.
+     * <p/>
+     * Exposed for unit testing.
+     */
+    public Map<TestIdentifier, List<Map<String, String>>> getTestInstanceArguments() {
+        return mTestInstanceArguments;
+    }
+
+    /**
      * {@inheritDoc}
      */
     @Override
@@ -427,8 +436,8 @@
         } catch (IOException e) {
             CLog.e(e);
         } finally {
-            StreamUtil.closeStream(d);
-            StreamUtil.closeStream(fileStream);
+            StreamUtil.close(d);
+            StreamUtil.close(fileStream);
         }
         return "failed to generate digest";
     }
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageRepo.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageRepo.java
index aea6613..7e16170 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageRepo.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageRepo.java
@@ -17,6 +17,9 @@
 
 import com.android.cts.util.AbiUtils;
 import com.android.ddmlib.Log;
+import com.android.tradefed.config.ConfigurationException;
+import com.android.tradefed.config.ConfigurationFactory;
+import com.android.tradefed.config.IConfiguration;
 import com.android.tradefed.util.xml.AbstractXmlParser.ParseException;
 
 import java.io.BufferedInputStream;
@@ -27,8 +30,8 @@
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -63,22 +66,68 @@
     private void parse(File dir) {
         File[] xmlFiles = dir.listFiles(new XmlFilter());
         for (File xmlFile : xmlFiles) {
-            parseTestFromXml(xmlFile);
+            parseModuleTestConfigs(xmlFile);
         }
     }
 
-    private void parseTestFromXml(File xmlFile)  {
+    /**
+     * Infer package preparer config from package XML definition file and return if exists
+     * @param pkgXml {@link File} instance referencing the package XML definition
+     * @return the matching package preparer if exists, <code>null</code> otherwise
+     */
+    private File getPreparerDefForPackage(File pkgXml) {
+        String fullPath = pkgXml.getAbsolutePath();
+        int lastDot = fullPath.lastIndexOf('.');
+        if (lastDot == -1) {
+            // huh?
+            return null;
+        }
+        File preparer = new File(fullPath.substring(0, lastDot) + ".config");
+        if (preparer.exists()) {
+            return preparer;
+        }
+        return null;
+    }
+
+    /**
+     * Processes test module definition XML file, and stores parsed data structure in class member
+     * variable. Parsed config objects will be associated with each applicable ABI type so multiple
+     * {@link TestPackageDef}s will be generated accordingly. In addition, based on
+     * &lt;module name&gt;.config file naming convention, this method also looks for the optional
+     * module test config, and attaches defined configuration objects to the {@link TestPackageDef}
+     * representing the module accordingly.
+     * @param xmlFile the module definition XML
+     */
+    private void parseModuleTestConfigs(File xmlFile)  {
         TestPackageXmlParser parser = new TestPackageXmlParser(mIncludeKnownFailures);
         try {
             parser.parse(createStreamFromFile(xmlFile));
+            // based on test module XML file path, and the <module name>.config naming convention,
+            // infers the module test config file, and parses it
+            File preparer = getPreparerDefForPackage(xmlFile);
+            IConfiguration config = null;
+            if (preparer != null) {
+                try {
+                    // invokes parser to process the test module config file
+                    config = ConfigurationFactory.getInstance().createConfigurationFromArgs(
+                            new String[]{preparer.getAbsolutePath()});
+                } catch (ConfigurationException e) {
+                    throw new RuntimeException(
+                            String.format("error parsing config file: %s", xmlFile.getName()), e);
+                }
+            }
             Set<TestPackageDef> defs = parser.getTestPackageDefs();
             if (defs.isEmpty()) {
                 Log.w(LOG_TAG, String.format("Could not find test package info in xml file %s",
                         xmlFile.getAbsolutePath()));
             }
+            // loops over multiple package defs defined for each ABI type
             for (TestPackageDef def : defs) {
                 String name = def.getAppPackageName();
                 String abi = def.getAbi().getName();
+                if (config != null) {
+                    def.setPackagePreparers(config.getTargetPreparers());
+                }
                 if (!mTestMap.containsKey(abi)) {
                     mTestMap.put(abi, new HashMap<String, TestPackageDef>());
                 }
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java
index baceb8b..649dd9e 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java
@@ -59,6 +59,7 @@
      *     <TestSuite ...>
      *        <TestCase>
      *           <Test>
+     *             <TestInstance> (optional)
      */
     private class TestPackageHandler extends DefaultHandler {
 
@@ -66,9 +67,11 @@
         private static final String TEST_SUITE_TAG = "TestSuite";
         private static final String TEST_CASE_TAG = "TestCase";
         private static final String TEST_TAG = "Test";
+        private static final String TEST_INSTANCE_TAG = "TestInstance";
 
         // holds current class name segments
         private Stack<String> mClassNameStack = new Stack<String>();
+        private TestIdentifier mTestId;
 
         @Override
         public void startElement(String uri, String localName, String name, Attributes attributes) {
@@ -139,6 +142,7 @@
                             classNameBuilder.append(".");
                         }
                     }
+                    mTestId = new TestIdentifier(classNameBuilder.toString(), methodName);
                     int timeout = -1;
                     String timeoutStr = attributes.getValue("timeout");
                     if (timeoutStr != null) {
@@ -158,14 +162,24 @@
                             }
                         }
                         for (String abi : abis) {
-                            TestIdentifier testId = new TestIdentifier(
-                                    classNameBuilder.toString(), methodName);
-                            mPackageDefs.get(abi).addTest(testId, timeout);
+                            mPackageDefs.get(abi).addTest(mTestId, timeout);
                         }
                     }
                 }
+            } else if (TEST_INSTANCE_TAG.equals(localName)) {
+                if (mTestId != null) {
+                    final Map<String, String> instanceArguments = genAttributeMap(attributes);
+                    for (TestPackageDef packageDef : mPackageDefs.values()) {
+                        if (packageDef.getTests().contains(mTestId)) {
+                            packageDef.addTestInstance(mTestId, instanceArguments);
+                        }
+                    }
+                } else {
+                    Log.e(LOG_TAG, String.format(
+                            "Invalid XML: encountered a '%s' tag not enclosed within a '%s' tag",
+                            TEST_INSTANCE_TAG, TEST_TAG));
+                }
             }
-
         }
 
         private String getTestType(Attributes attributes) {
@@ -182,6 +196,8 @@
         public void endElement (String uri, String localName, String qName) {
             if (TEST_SUITE_TAG.equals(localName) || TEST_CASE_TAG.equals(localName)) {
                 mClassNameStack.pop();
+            } else if (TEST_TAG.equals(localName)) {
+                mTestId = null;
             }
         }
 
@@ -192,6 +208,19 @@
             return stringValue != null &&
                     Boolean.parseBoolean(stringValue);
         }
+
+        private Map<String, String> genAttributeMap(Attributes attributes) {
+            final Map<String, String> attribMap = new HashMap<String, String>();
+            for (int i = 0; i < attributes.getLength(); ++i) {
+                final String localName = attributes.getLocalName(i);
+                final String namespace = attributes.getURI(i);
+                final String fullyQualifiedName =
+                        (namespace.isEmpty()) ? (localName) : (namespace + ":" + localName);
+
+                attribMap.put(fullyQualifiedName, attributes.getValue(i));
+            }
+            return attribMap;
+        }
     }
 
     @Override
diff --git a/tools/tradefed-host/tests/run_unit_func_tests.sh b/tools/tradefed-host/tests/run_unit_func_tests.sh
new file mode 100755
index 0000000..461a80d
--- /dev/null
+++ b/tools/tradefed-host/tests/run_unit_func_tests.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+
+# Copyright (C) 2015 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.
+
+# helper script for running the cts-tradefed unit tests
+
+checkFile() {
+    if [ ! -f "$1" ]; then
+        echo "Unable to locate $1"
+        exit
+    fi;
+}
+
+# check if in Android build env
+if [ ! -z ${ANDROID_BUILD_TOP} ]; then
+    HOST=`uname`
+    if [ "$HOST" == "Linux" ]; then
+        OS="linux-x86"
+    elif [ "$HOST" == "Darwin" ]; then
+        OS="darwin-x86"
+    else
+        echo "Unrecognized OS"
+        exit
+    fi;
+fi;
+
+JAR_DIR=${ANDROID_BUILD_TOP}/out/host/$OS/framework
+JARS="tradefed-prebuilt.jar hosttestlib.jar cts-tradefed.jar cts-tradefed-tests.jar"
+
+for JAR in $JARS; do
+    checkFile ${JAR_DIR}/${JAR}
+    JAR_PATH=${JAR_PATH}:${JAR_DIR}/${JAR}
+done
+
+java $RDBG_FLAG \
+  -cp ${JAR_PATH} com.android.tradefed.command.Console run singleCommand host --class com.android.cts.tradefed.FuncTests "$@"
diff --git a/tools/tradefed-host/tests/run_unit_tests.sh b/tools/tradefed-host/tests/run_unit_tests.sh
index 771dc75..d089c05 100755
--- a/tools/tradefed-host/tests/run_unit_tests.sh
+++ b/tools/tradefed-host/tests/run_unit_tests.sh
@@ -46,4 +46,3 @@
 
 java $RDBG_FLAG \
   -cp ${JAR_PATH} com.android.tradefed.command.Console run singleCommand host -n --class com.android.cts.tradefed.UnitTests "$@"
-
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/FuncTests.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/FuncTests.java
new file mode 100644
index 0000000..a9420d2
--- /dev/null
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/FuncTests.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.tradefed;
+
+import com.android.cts.tradefed.device.DeviceInfoCollectorFuncTest;
+import com.android.tradefed.testtype.DeviceTestSuite;
+
+import junit.framework.Test;
+
+/**
+ * A test suite for all cts-tradefed functional tests.
+ * <p/>
+ * Tests listed here should require a device.
+ */
+public class FuncTests extends DeviceTestSuite {
+
+    public FuncTests() {
+        super();
+
+        // device package
+        addTestSuite(DeviceInfoCollectorFuncTest.class);
+    }
+
+    public static Test suite() {
+        return new FuncTests();
+    }
+}
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/UnitTests.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/UnitTests.java
index ad1430e..29c1324 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/UnitTests.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/UnitTests.java
@@ -25,6 +25,7 @@
 import com.android.cts.tradefed.testtype.Abi;
 import com.android.cts.tradefed.testtype.CtsTestTest;
 import com.android.cts.tradefed.testtype.DeqpTestRunnerTest;
+import com.android.cts.tradefed.testtype.GeeTestTest;
 import com.android.cts.tradefed.testtype.JarHostTestTest;
 import com.android.cts.tradefed.testtype.TestFilterTest;
 import com.android.cts.tradefed.testtype.TestPackageDefTest;
@@ -60,13 +61,14 @@
 
         // testtype package
         addTestSuite(CtsTestTest.class);
+        addTestSuite(DeqpTestRunnerTest.class);
+        addTestSuite(GeeTestTest.class);
         addTestSuite(JarHostTestTest.class);
         addTestSuite(TestFilterTest.class);
         addTestSuite(TestPackageDefTest.class);
         addTestSuite(TestPackageXmlParserTest.class);
         addTestSuite(TestPlanTest.class);
         addTestSuite(WrappedGTestResultParserTest.class);
-        addTestSuite(DeqpTestRunnerTest.class);
     }
 
     public static Test suite() {
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/device/DeviceInfoCollectorFuncTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/device/DeviceInfoCollectorFuncTest.java
index 52a205b..60e30cc 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/device/DeviceInfoCollectorFuncTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/device/DeviceInfoCollectorFuncTest.java
@@ -15,33 +15,77 @@
  */
 package com.android.cts.tradefed.device;
 
+import com.android.ddmlib.Log.LogLevel;
 import com.android.cts.tradefed.UnitTests;
+import com.android.cts.tradefed.result.CtsXmlResultReporter;
 import com.android.tradefed.build.BuildInfo;
+import com.android.tradefed.build.IFolderBuildInfo;
 import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.log.LogUtil.CLog;
 import com.android.tradefed.result.CollectingTestListener;
 import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.util.FileUtil;
 
 import java.io.File;
+import java.util.HashMap;
 import java.util.Map;
 
+import org.easymock.EasyMock;
+
 /**
  * Functional test for {@link DeviceInfoCollector}.
  * <p/>
- * TODO: this test assumes the TestDeviceSetup apk is located in the "java.io.tmpdir"
+ * TODO: this test assumes the TestDeviceSetup and DeviceInfoCollector apks are located in the
+ * "java.io.tmpdir"
  */
 public class DeviceInfoCollectorFuncTest extends DeviceTestCase {
 
-    public void testCollectDeviceInfo() throws DeviceNotAvailableException {
-        CollectingTestListener testListener = new CollectingTestListener();
+    private CollectingTestListener testListener;
+    private File mResultDir;
+    private IFolderBuildInfo mMockBuildInfo;
 
-        testListener.invocationStarted(new BuildInfo());
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        testListener = new CollectingTestListener();
+        mResultDir = FileUtil.createTempDir("cts-result-dir");
+        mMockBuildInfo = EasyMock.createMock(IFolderBuildInfo.class);
+        Map<String, String> attributes = new HashMap<>();
+        attributes.put(CtsXmlResultReporter.CTS_RESULT_DIR, mResultDir.getAbsolutePath());
+        EasyMock.expect(mMockBuildInfo.getBuildAttributes()).andStubReturn(attributes);
+        EasyMock.replay(mMockBuildInfo);
+
+        assertNotNull(getDevice().getSerialNumber());
+    }
+
+    public void testCollectDeviceInfo() throws DeviceNotAvailableException {
+        testListener.invocationStarted(mMockBuildInfo);
         DeviceInfoCollector.collectDeviceInfo(getDevice(), UnitTests.ABI.getName(), new File(
                 System.getProperty("java.io.tmpdir")), testListener);
         assertNotNull(testListener.getCurrentRunResults());
-        assertTrue(testListener.getCurrentRunResults().getRunMetrics().size() > 0);
-        for (Map.Entry<String, String> metricEntry : testListener.getCurrentRunResults().getRunMetrics().entrySet()) {
-            System.out.println(String.format("%s=%s", metricEntry.getKey(), metricEntry.getValue()));
-        }
+
+        Map<String, String> runMetrics = testListener.getCurrentRunResults().getRunMetrics();
+        assertTrue(runMetrics.size() > 0);
+        displayMetrics(runMetrics);
         testListener.invocationEnded(0);
     }
+
+    public void testExtendedDeviceInfo() throws DeviceNotAvailableException {
+        testListener.invocationStarted(mMockBuildInfo);
+        DeviceInfoCollector.collectExtendedDeviceInfo(getDevice(), UnitTests.ABI.getName(),
+                new File(System.getProperty("java.io.tmpdir")), testListener, mMockBuildInfo);
+        assertNotNull(testListener.getCurrentRunResults());
+
+        Map<String, String> runMetrics = testListener.getCurrentRunResults().getRunMetrics();
+        assertTrue(runMetrics.size() > 0);
+        displayMetrics(runMetrics);
+        testListener.invocationEnded(0);
+    }
+
+    private void displayMetrics(Map<String, String> runMetrics) {
+        for (Map.Entry<String, String> metricEntry : runMetrics.entrySet()) {
+            CLog.logAndDisplay(LogLevel.INFO,
+                    String.format("%s=%s", metricEntry.getKey(), metricEntry.getValue()));
+        }
+    }
 }
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/CtsXmlResultReporterTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/CtsXmlResultReporterTest.java
index ae4a41e..51a6153 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/CtsXmlResultReporterTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/CtsXmlResultReporterTest.java
@@ -39,6 +39,7 @@
 import java.util.Arrays;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -84,10 +85,16 @@
         File plansDir = new File(repoDir, "plans");
         assertTrue(casesDir.mkdirs());
         assertTrue(plansDir.mkdirs());
-        mMockBuild = EasyMock.createNiceMock(IFolderBuildInfo.class);
+        mMockBuild = EasyMock.createMock(IFolderBuildInfo.class);
         EasyMock.expect(mMockBuild.getDeviceSerial()).andStubReturn(null);
         EasyMock.expect(mMockBuild.getRootDir()).andStubReturn(mBuildDir);
-        EasyMock.replay(mMockBuild);
+        mMockBuild.addBuildAttribute(EasyMock.cmpEq(CtsXmlResultReporter.CTS_RESULT_DIR),
+                (String) EasyMock.anyObject());
+        EasyMock.expectLastCall();
+        Map<String, String> attributes = new HashMap<>();
+        attributes.put(CtsXmlResultReporter.CTS_RESULT_DIR, "");
+        EasyMock.expect(mMockBuild.getBuildAttributes()).andStubReturn(attributes);
+        EasyMock.expect(mMockBuild.getBuildId()).andStubReturn("");
     }
 
     @Override
@@ -113,6 +120,7 @@
         final String expectedSummaryOutput =
             "<Summary failed=\"0\" notExecuted=\"0\" timeout=\"0\" pass=\"0\" />";
         final String expectedEndTag = "</TestResult>";
+        EasyMock.replay(mMockBuild);
         mResultReporter.invocationStarted(mMockBuild);
         mResultReporter.invocationEnded(1);
         String actualOutput = getOutput();
@@ -123,6 +131,7 @@
                 expectedTestOutput, actualOutput), actualOutput.contains(expectedSummaryOutput));
         assertTrue(String.format("test output did not contain expected TestResult end tag. Got %s",
                 actualOutput), actualOutput.endsWith(expectedEndTag));
+        EasyMock.verify(mMockBuild);
     }
 
     /**
@@ -131,6 +140,7 @@
     public void testSinglePass() {
         Map<String, String> emptyMap = Collections.emptyMap();
         final TestIdentifier testId = new TestIdentifier("com.foo.FooTest", "testFoo");
+        EasyMock.replay(mMockBuild);
         mResultReporter.invocationStarted(mMockBuild);
         mResultReporter.testRunStarted(AbiUtils.createId(UnitTests.ABI.getName(), "run"), 1);
         mResultReporter.testStarted(testId);
@@ -149,6 +159,7 @@
         final String testCaseTag = String.format(
                 "<Test name=\"%s\" result=\"pass\"", testId.getTestName());
         assertTrue(output.contains(testCaseTag));
+        EasyMock.verify(mMockBuild);
     }
 
     /**
@@ -158,6 +169,7 @@
         Map<String, String> emptyMap = Collections.emptyMap();
         final TestIdentifier testId = new TestIdentifier("FooTest", "testFoo");
         final String trace = "this is a trace\nmore trace\nyet more trace";
+        EasyMock.replay(mMockBuild);
         mResultReporter.invocationStarted(mMockBuild);
         mResultReporter.testRunStarted(AbiUtils.createId(UnitTests.ABI.getName(), "run"), 1);
         mResultReporter.testStarted(testId);
@@ -179,6 +191,7 @@
         // Check that no TestLog tags were added, because the flag wasn't enabled.
         final String testLogTag = String.format("<TestLog type=\"logcat\" url=\"url\" />");
         assertFalse(output, output.contains(testLogTag));
+        EasyMock.verify(mMockBuild);
     }
 
     /**
@@ -192,6 +205,7 @@
         // Include TestLogTags in the XML.
         mResultReporter.setIncludeTestLogTags(true);
 
+        EasyMock.replay(mMockBuild);
         mResultReporter.invocationStarted(mMockBuild);
         mResultReporter.testRunStarted(AbiUtils.createId(UnitTests.ABI.getName(), "run"), 1);
         mResultReporter.testStarted(testId);
@@ -206,11 +220,13 @@
         final String output = getOutput();
         final String testLogTag = String.format("<TestLog type=\"logcat\" url=\"url\" />");
         assertTrue(output, output.contains(testLogTag));
+        EasyMock.verify(mMockBuild);
     }
 
     public void testDeviceSetup() {
         Map<String, String> emptyMap = Collections.emptyMap();
         final TestIdentifier testId = new TestIdentifier("android.tests.devicesetup", "TestDeviceSetup");
+        EasyMock.replay(mMockBuild);
         mResultReporter.invocationStarted(mMockBuild);
         mResultReporter.testRunStarted(AbiUtils.createId(UnitTests.ABI.getName(), testId.getClassName()), 1);
         mResultReporter.testStarted(testId);
@@ -221,6 +237,7 @@
         // TODO: consider doing xml based compare
         final String deviceSetupTag = "appPackageName=\"android.tests.devicesetup\"";
         assertFalse(output, output.contains(deviceSetupTag));
+        EasyMock.verify(mMockBuild);
     }
 
     /**
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/CtsTestTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/CtsTestTest.java
index 30e2ba8..98caad1 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/CtsTestTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/CtsTestTest.java
@@ -23,6 +23,7 @@
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.targetprep.ITargetPreparer;
 import com.android.tradefed.testtype.IRemoteTest;
 import com.android.tradefed.util.xml.AbstractXmlParser.ParseException;
 
@@ -34,6 +35,7 @@
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.InputStream;
+import java.util.Arrays;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -285,6 +287,8 @@
         EasyMock.expect(mMockPackageDef.getAbi()).andReturn(UnitTests.ABI).atLeastOnce();
         EasyMock.expect(mMockPackageDef.getId()).andReturn(ID).atLeastOnce();
         EasyMock.expect(mMockPackageDef.getDigest()).andReturn("digest").atLeastOnce();
+        EasyMock.expect(mMockPackageDef.getPackagePreparers()).andReturn(
+                    new ArrayList<ITargetPreparer>()).atLeastOnce();
         mMockTest.run((ITestInvocationListener) EasyMock.anyObject());
     }
 
@@ -293,6 +297,7 @@
      * been specified
      */
     public void testRun_nothingToRun() throws DeviceNotAvailableException {
+        replayMocks();
         try {
             mCtsTest.run(mMockListener);
             fail("IllegalArgumentException not thrown");
@@ -308,6 +313,7 @@
     public void testRun_packagePlan() throws DeviceNotAvailableException {
         mCtsTest.setPlanName(PLAN_NAME);
         mCtsTest.addPackageName(PACKAGE_NAME);
+        replayMocks();
         try {
             mCtsTest.run(mMockListener);
             fail("IllegalArgumentException not thrown");
@@ -323,6 +329,7 @@
     public void testRun_planClass() throws DeviceNotAvailableException {
         mCtsTest.setPlanName(PLAN_NAME);
         mCtsTest.setClassName("class");
+        replayMocks();
         try {
             mCtsTest.run(mMockListener);
             fail("IllegalArgumentException not thrown");
@@ -338,6 +345,7 @@
     public void testRun_packageClass() throws DeviceNotAvailableException {
         mCtsTest.addPackageName(PACKAGE_NAME);
         mCtsTest.setClassName("class");
+        replayMocks();
         try {
             mCtsTest.run(mMockListener);
             fail("IllegalArgumentException not thrown");
@@ -354,6 +362,7 @@
         mCtsTest.setPlanName(PLAN_NAME);
         mCtsTest.addPackageName(PACKAGE_NAME);
         mCtsTest.setClassName("class");
+        replayMocks();
         try {
             mCtsTest.run(mMockListener);
             fail("IllegalArgumentException not thrown");
@@ -369,6 +378,7 @@
     public void testRun_planContinue() throws DeviceNotAvailableException {
         mCtsTest.setPlanName(PLAN_NAME);
         mCtsTest.setContinueSessionId(1);
+        replayMocks();
         try {
             mCtsTest.run(mMockListener);
             fail("IllegalArgumentException not thrown");
@@ -377,6 +387,34 @@
         }
     }
 
+    /**
+     * Test {@link CtsTestTest#join} works.
+     * @throws DeviceNotAvailableException
+     */
+    public void testJoin() throws DeviceNotAvailableException {
+        String expected = "a@b@c";
+        String actual = mCtsTest.join(new ArrayList<String>(Arrays.asList("a", "b", "c")), "@");
+        assertEquals(expected, actual);
+    }
+
+    /**
+     * Test {@link CtsTestTest#join} for a single element list.
+     * @throws DeviceNotAvailableException
+     */
+    public void testSingleJoin() throws DeviceNotAvailableException {
+        String actual = mCtsTest.join(new ArrayList<String>(Arrays.asList("foo")), "@");
+        assertEquals("foo", actual);
+    }
+
+    /**
+     * Test {@link CtsTestTest#join} for an empty list.
+     * @throws DeviceNotAvailableException
+     */
+    public void testEmptyJoin() throws DeviceNotAvailableException {
+        String actual = mCtsTest.join(new ArrayList<String>(), "@");
+        assertEquals("", actual);
+    }
+
     private void replayMocks(Object... mocks) {
         EasyMock.replay(mMockRepo, mMockPlan, mMockDevice, mMockPackageDef, mMockListener, mMockTest);
         EasyMock.replay(mocks);
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestRunnerTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestRunnerTest.java
index c41793f..7ec09c9 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestRunnerTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/DeqpTestRunnerTest.java
@@ -18,22 +18,32 @@
 import com.android.cts.tradefed.build.StubCtsBuildHelper;
 import com.android.cts.tradefed.UnitTests;
 import com.android.cts.util.AbiUtils;
+import com.android.ddmlib.IDevice;
 import com.android.ddmlib.IShellOutputReceiver;
+import com.android.ddmlib.ShellCommandUnresponsiveException;
 import com.android.ddmlib.testrunner.ITestRunListener;
 import com.android.ddmlib.testrunner.TestIdentifier;
+import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.result.ITestInvocationListener;
 import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.util.IRunUtil;
+import com.android.tradefed.util.RunInterruptedException;
 
 import junit.framework.TestCase;
 
 import org.easymock.EasyMock;
 import org.easymock.IAnswer;
+import org.easymock.IMocksControl;
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Unit tests for {@link DeqpTestRunner}.
@@ -45,8 +55,60 @@
     private static final String LOG_FILE_NAME = "/sdcard/TestLog.qpa";
     private static final String INSTRUMENTATION_NAME =
             "com.drawelements.deqp/com.drawelements.deqp.testercore.DeqpInstrumentation";
+    private static final String QUERY_INSTRUMENTATION_NAME =
+            "com.drawelements.deqp/com.drawelements.deqp.platformutil.DeqpPlatformCapabilityQueryInstrumentation";
     private static final String DEQP_ONDEVICE_APK = "com.drawelements.deqp.apk";
     private static final String DEQP_ONDEVICE_PKG = "com.drawelements.deqp";
+    private static final String ONLY_LANDSCAPE_FEATURES =
+            "feature:"+DeqpTestRunner.FEATURE_LANDSCAPE;
+    private static final String ALL_FEATURES =
+            ONLY_LANDSCAPE_FEATURES + "\nfeature:"+DeqpTestRunner.FEATURE_PORTRAIT;
+    private static List<Map<String,String>> DEFAULT_INSTANCE_ARGS;
+
+    static {
+        DEFAULT_INSTANCE_ARGS = new ArrayList<>(1);
+        DEFAULT_INSTANCE_ARGS.add(new HashMap<String,String>());
+        DEFAULT_INSTANCE_ARGS.iterator().next().put("glconfig", "rgba8888d24s8");
+        DEFAULT_INSTANCE_ARGS.iterator().next().put("rotation", "unspecified");
+        DEFAULT_INSTANCE_ARGS.iterator().next().put("surfacetype", "window");
+    }
+
+    private static class StubRecovery implements DeqpTestRunner.IRecovery {
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void setSleepProvider(DeqpTestRunner.ISleepProvider sleepProvider) {
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void setDevice(ITestDevice device) {
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void onExecutionProgressed() {
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void recoverConnectionRefused() throws DeviceNotAvailableException {
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void recoverComLinkKilled() throws DeviceNotAvailableException {
+        }
+    };
 
     /**
      * {@inheritDoc}
@@ -105,14 +167,17 @@
         ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
         ITestInvocationListener mockListener
                 = EasyMock.createStrictMock(ITestInvocationListener.class);
+        IDevice mockIDevice = EasyMock.createMock(IDevice.class);
         Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
-
         tests.add(testId);
 
+        Map<TestIdentifier, List<Map<String, String>>> instance = new HashMap<>();
+        instance.put(testId, DEFAULT_INSTANCE_ARGS);
+
         DeqpTestRunner deqpTest = new DeqpTestRunner(NAME,
                 "dEQP-GLES" + Integer.toString(requiredMajorVersion)
                 + (requiredMinorVersion > 0 ? Integer.toString(requiredMinorVersion) : ""),
-                tests);
+                tests, instance);
         deqpTest.setAbi(UnitTests.ABI);
 
         int version = (majorVersion << 16) | minorVersion;
@@ -129,37 +194,19 @@
                     EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName()))))
                     .andReturn(null).once();
 
-            EasyMock.expect(mockDevice.executeShellCommand(
-                    EasyMock.eq("rm " + CASE_LIST_FILE_NAME))).andReturn("").once();
+            expectRenderConfigQuery(mockDevice, requiredMajorVersion,
+                    requiredMinorVersion);
 
-            EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + LOG_FILE_NAME)))
-                    .andReturn("").once();
+            String commandLine = String.format(
+                    "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8 "
+                    + "--deqp-screen-rotation=unspecified "
+                    + "--deqp-surface-type=window "
+                    + "--deqp-log-images=disable "
+                    + "--deqp-watchdog=enable",
+                    CASE_LIST_FILE_NAME);
 
-            EasyMock.expect(mockDevice.pushString(testTrie + "\n", CASE_LIST_FILE_NAME))
-                    .andReturn(true).once();
-
-            String command = String.format(
-                    "am instrument %s -w -e deqpLogFileName \"%s\" -e deqpCmdLine \""
-                        + "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8\" "
-                        + "-e deqpLogData \"%s\" %s",
-                    AbiUtils.createAbiFlag(UnitTests.ABI.getName()), LOG_FILE_NAME,
-                    CASE_LIST_FILE_NAME, false, INSTRUMENTATION_NAME);
-
-            mockDevice.executeShellCommand(EasyMock.eq(command),
-                    EasyMock.<IShellOutputReceiver>notNull());
-
-            EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
-                @Override
-                public Object answer() {
-                    IShellOutputReceiver receiver
-                            = (IShellOutputReceiver)EasyMock.getCurrentArguments()[1];
-
-                    receiver.addOutput(output.getBytes(), 0, output.length());
-                    receiver.flush();
-
-                    return null;
-                }
-            });
+            runInstrumentationLineAndAnswer(mockDevice, mockIDevice, testTrie, commandLine,
+                    output);
 
             EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG)))
                     .andReturn("").once();
@@ -177,7 +224,7 @@
         mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
         EasyMock.expectLastCall().once();
 
-        EasyMock.replay(mockDevice);
+        EasyMock.replay(mockDevice, mockIDevice);
         EasyMock.replay(mockListener);
 
         deqpTest.setDevice(mockDevice);
@@ -185,7 +232,49 @@
         deqpTest.run(mockListener);
 
         EasyMock.verify(mockListener);
-        EasyMock.verify(mockDevice);
+        EasyMock.verify(mockDevice, mockIDevice);
+    }
+
+    private void expectRenderConfigQuery(ITestDevice mockDevice, int majorVersion,
+            int minorVersion) throws Exception {
+        expectRenderConfigQuery(mockDevice,
+                String.format("--deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-gl-major-version=%d "
+                + "--deqp-gl-minor-version=%d", majorVersion, minorVersion));
+    }
+
+    private void expectRenderConfigQuery(ITestDevice mockDevice, String commandLine)
+            throws Exception {
+        expectRenderConfigQueryAndReturn(mockDevice, commandLine, "Yes");
+    }
+
+    private void expectRenderConfigQueryAndReturn(ITestDevice mockDevice, String commandLine,
+            String output) throws Exception {
+        final String queryOutput = "INSTRUMENTATION_RESULT: Supported=" + output + "\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+        final String command = String.format(
+                "am instrument %s -w -e deqpQueryType renderConfigSupported -e deqpCmdLine "
+                    + "\"%s\" %s",
+                AbiUtils.createAbiFlag(UnitTests.ABI.getName()), commandLine,
+                QUERY_INSTRUMENTATION_NAME);
+
+        mockDevice.executeShellCommand(EasyMock.eq(command),
+                EasyMock.<IShellOutputReceiver>notNull());
+
+        EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
+            @Override
+            public Object answer() {
+                IShellOutputReceiver receiver
+                        = (IShellOutputReceiver)EasyMock.getCurrentArguments()[1];
+
+                receiver.addOutput(queryOutput.getBytes(), 0, queryOutput.length());
+                receiver.flush();
+
+                return null;
+            }
+        });
     }
 
     /**
@@ -227,11 +316,15 @@
         ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
         ITestInvocationListener mockListener
                 = EasyMock.createStrictMock(ITestInvocationListener.class);
-        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        IDevice mockIDevice = EasyMock.createMock(IDevice.class);
 
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
         tests.add(testId);
 
-        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests);
+        Map<TestIdentifier, List<Map<String, String>>> instance = new HashMap<>();
+        instance.put(testId, DEFAULT_INSTANCE_ARGS);
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instance);
         deqpTest.setAbi(UnitTests.ABI);
 
         int version = 3 << 16;
@@ -245,37 +338,17 @@
                 EasyMock.eq(true), EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName()))))
                 .andReturn(null).once();
 
-        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + CASE_LIST_FILE_NAME)))
-                .andReturn("").once();
+        expectRenderConfigQuery(mockDevice, 3, 0);
 
-        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + LOG_FILE_NAME)))
-                .andReturn("").once();
+        String commandLine = String.format(
+                "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable",
+                CASE_LIST_FILE_NAME);
 
-        EasyMock.expect(mockDevice.pushString(testTrie + "\n", CASE_LIST_FILE_NAME)).andReturn(true)
-                .once();
-
-        String command = String.format(
-                "am instrument %s -w -e deqpLogFileName \"%s\" -e deqpCmdLine \""
-                    + "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8\" "
-                    + "-e deqpLogData \"%s\" %s",
-                AbiUtils.createAbiFlag(UnitTests.ABI.getName()), LOG_FILE_NAME,
-                CASE_LIST_FILE_NAME, false, INSTRUMENTATION_NAME);
-
-        mockDevice.executeShellCommand(EasyMock.eq(command),
-                EasyMock.<IShellOutputReceiver>notNull());
-
-        EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
-            @Override
-            public Object answer() {
-                IShellOutputReceiver receiver
-                        = (IShellOutputReceiver)EasyMock.getCurrentArguments()[1];
-
-                receiver.addOutput(output.getBytes(), 0, output.length());
-                receiver.flush();
-
-                return null;
-            }
-        });
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice, testTrie, commandLine, output);
 
         mockListener.testRunStarted(ID, 1);
         EasyMock.expectLastCall().once();
@@ -285,7 +358,8 @@
 
         if (!pass) {
             mockListener.testFailed(testId,
-                    resultCode + ": Detail" + resultCode);
+                    "=== with config {glformat=rgba8888d24s8,rotation=unspecified,surfacetype=window} ===\n"
+                    + resultCode + ": Detail" + resultCode);
 
             EasyMock.expectLastCall().once();
         }
@@ -299,7 +373,7 @@
         EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).andReturn("")
                 .once();
 
-        EasyMock.replay(mockDevice);
+        EasyMock.replay(mockDevice, mockIDevice);
         EasyMock.replay(mockListener);
 
         deqpTest.setDevice(mockDevice);
@@ -307,7 +381,7 @@
         deqpTest.run(mockListener);
 
         EasyMock.verify(mockListener);
-        EasyMock.verify(mockDevice);
+        EasyMock.verify(mockDevice, mockIDevice);
     }
 
     /**
@@ -411,13 +485,17 @@
         ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
         ITestInvocationListener mockListener
                 = EasyMock.createStrictMock(ITestInvocationListener.class);
+        IDevice mockIDevice = EasyMock.createMock(IDevice.class);
+
         Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        Map<TestIdentifier, List<Map<String, String>>> instances = new HashMap<>();
 
         for (TestIdentifier id : testIds) {
             tests.add(id);
+            instances.put(id, DEFAULT_INSTANCE_ARGS);
         }
 
-        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests);
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instances);
         deqpTest.setAbi(UnitTests.ABI);
 
         int version = 3 << 16;
@@ -430,37 +508,17 @@
                 EasyMock.eq(true), EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName()))))
                 .andReturn(null).once();
 
-        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + CASE_LIST_FILE_NAME)))
-                .andReturn("").once();
+        expectRenderConfigQuery(mockDevice, 3, 0);
 
-        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + LOG_FILE_NAME)))
-                .andReturn("").once();
+        String commandLine = String.format(
+                "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable",
+                CASE_LIST_FILE_NAME);
 
-        EasyMock.expect(mockDevice.pushString(testTrie + "\n", CASE_LIST_FILE_NAME))
-                .andReturn(true).once();
-
-        String command = String.format(
-                "am instrument %s -w -e deqpLogFileName \"%s\" -e deqpCmdLine \""
-                    + "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8\" "
-                    + "-e deqpLogData \"%s\" %s",
-                AbiUtils.createAbiFlag(UnitTests.ABI.getName()), LOG_FILE_NAME,
-                CASE_LIST_FILE_NAME, false, INSTRUMENTATION_NAME);
-
-        mockDevice.executeShellCommand(EasyMock.eq(command),
-                EasyMock.<IShellOutputReceiver>notNull());
-
-        EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
-            @Override
-            public Object answer() {
-                IShellOutputReceiver receiver
-                        = (IShellOutputReceiver)EasyMock.getCurrentArguments()[1];
-
-                receiver.addOutput(output.getBytes(), 0, output.length());
-                receiver.flush();
-
-                return null;
-            }
-        });
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice, testTrie, commandLine, output);
 
         mockListener.testRunStarted(ID, testPaths.length);
         EasyMock.expectLastCall().once();
@@ -481,7 +539,7 @@
         EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).andReturn("")
                 .once();
 
-        EasyMock.replay(mockDevice);
+        EasyMock.replay(mockDevice, mockIDevice);
         EasyMock.replay(mockListener);
 
         deqpTest.setDevice(mockDevice);
@@ -489,10 +547,371 @@
         deqpTest.run(mockListener);
 
         EasyMock.verify(mockListener);
+        EasyMock.verify(mockDevice, mockIDevice);
+    }
+
+    /**
+     * Test running a unexecutable test.
+     */
+    public void testRun_unexecutableTests() throws Exception {
+        final String instrumentationAnswerNoExecs =
+                "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+
+        final TestIdentifier[] testIds = {
+                new TestIdentifier("dEQP-GLES3.missing", "no"),
+                new TestIdentifier("dEQP-GLES3.missing", "nope"),
+                new TestIdentifier("dEQP-GLES3.missing", "donotwant"),
+        };
+
+        final String[] testPaths = {
+                "dEQP-GLES3.missing.no",
+                "dEQP-GLES3.missing.nope",
+                "dEQP-GLES3.missing.donotwant",
+        };
+
+        ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
+        IDevice mockIDevice = EasyMock.createMock(IDevice.class);
+
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        Map<TestIdentifier, List<Map<String, String>>> instances = new HashMap<>();
+
+        for (TestIdentifier id : testIds) {
+            tests.add(id);
+            instances.put(id, DEFAULT_INSTANCE_ARGS);
+        }
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instances);
+        deqpTest.setAbi(UnitTests.ABI);
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+                .andReturn(Integer.toString(version)).atLeastOnce();
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).andReturn("")
+                .once();
+        EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+                EasyMock.eq(true), EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName()))))
+                .andReturn(null).once();
+
+        expectRenderConfigQuery(mockDevice, 3, 0);
+
+        String commandLine = String.format(
+                "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable",
+                CASE_LIST_FILE_NAME);
+
+        // first try
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{missing{no,nope,donotwant}}}", commandLine, instrumentationAnswerNoExecs);
+
+        // splitting begins
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{missing{no}}}", commandLine, instrumentationAnswerNoExecs);
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{missing{nope,donotwant}}}", commandLine, instrumentationAnswerNoExecs);
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{missing{nope}}}", commandLine, instrumentationAnswerNoExecs);
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{missing{donotwant}}}", commandLine, instrumentationAnswerNoExecs);
+
+        mockListener.testRunStarted(ID, testPaths.length);
+        EasyMock.expectLastCall().once();
+
+        for (int i = 0; i < testPaths.length; i++) {
+            mockListener.testStarted(EasyMock.eq(testIds[i]));
+            EasyMock.expectLastCall().once();
+
+            mockListener.testFailed(EasyMock.eq(testIds[i]),
+                    EasyMock.eq("=== with config {glformat=rgba8888d24s8,rotation=unspecified,surfacetype=window} ===\n"
+                    + "Abort: Test cannot be executed"));
+            EasyMock.expectLastCall().once();
+
+            mockListener.testEnded(EasyMock.eq(testIds[i]),
+                    EasyMock.<Map<String, String>>notNull());
+            EasyMock.expectLastCall().once();
+        }
+
+        mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).andReturn("")
+                .once();
+
+        EasyMock.replay(mockDevice, mockIDevice);
+        EasyMock.replay(mockListener);
+
+        deqpTest.setDevice(mockDevice);
+        deqpTest.setBuildHelper(new StubCtsBuildHelper());
+        deqpTest.run(mockListener);
+
+        EasyMock.verify(mockListener);
+        EasyMock.verify(mockDevice, mockIDevice);
+    }
+
+    /**
+     * Test that test are left unexecuted if pm list query fails
+     */
+    public void testRun_queryPmListFailure()
+            throws Exception {
+        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.orientation", "test");
+
+        ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        tests.add(testId);
+
+        Map<TestIdentifier, List<Map<String, String>>> instance = new HashMap<>();
+        instance.put(testId, new ArrayList<Map<String,String>>(1));
+        instance.get(testId).add(new HashMap<String,String>());
+        instance.get(testId).iterator().next().put("glconfig", "rgba8888d24s8");
+        instance.get(testId).iterator().next().put("rotation", "90");
+        instance.get(testId).iterator().next().put("surfacetype", "window");
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instance);
+        deqpTest.setAbi(UnitTests.ABI);
+        deqpTest.setDevice(mockDevice);
+        deqpTest.setBuildHelper(new StubCtsBuildHelper());
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+                .andReturn(Integer.toString(version)).atLeastOnce();
+
+        EasyMock.expect(mockDevice.executeShellCommand("pm list features"))
+                .andReturn("not a valid format");
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+            andReturn("").once();
+
+        EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+                EasyMock.eq(true),
+                EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+                .once();
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG)))
+                .andReturn("").once();
+
+        mockListener.testRunStarted(ID, 1);
+        EasyMock.expectLastCall().once();
+
+        mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        EasyMock.replay(mockDevice);
+        EasyMock.replay(mockListener);
+        deqpTest.run(mockListener);
+        EasyMock.verify(mockListener);
         EasyMock.verify(mockDevice);
     }
 
     /**
+     * Test that test are left unexecuted if renderablity query fails
+     */
+    public void testRun_queryRenderabilityFailure()
+            throws Exception {
+        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.orientation", "test");
+
+        ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
+
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        tests.add(testId);
+
+        Map<TestIdentifier, List<Map<String, String>>> instance = new HashMap<>();
+        instance.put(testId, new ArrayList<Map<String,String>>(1));
+        instance.get(testId).add(new HashMap<String,String>());
+        instance.get(testId).iterator().next().put("glconfig", "rgba8888d24s8");
+        instance.get(testId).iterator().next().put("rotation", "unspecified");
+        instance.get(testId).iterator().next().put("surfacetype", "window");
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instance);
+        deqpTest.setAbi(UnitTests.ABI);
+        deqpTest.setDevice(mockDevice);
+        deqpTest.setBuildHelper(new StubCtsBuildHelper());
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+                .andReturn(Integer.toString(version)).atLeastOnce();
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+            andReturn("").once();
+
+        EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+                EasyMock.eq(true),
+                EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+                .once();
+
+        expectRenderConfigQueryAndReturn(mockDevice,
+                "--deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0", "Maybe?");
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG)))
+                .andReturn("").once();
+
+        mockListener.testRunStarted(ID, 1);
+        EasyMock.expectLastCall().once();
+
+        mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        EasyMock.replay(mockDevice);
+        EasyMock.replay(mockListener);
+        deqpTest.run(mockListener);
+        EasyMock.verify(mockListener);
+        EasyMock.verify(mockDevice);
+    }
+
+    /**
+     * Test that orientation is supplied to runner correctly
+     */
+    private void testOrientation(final String rotation, final String featureString)
+            throws Exception {
+        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.orientation", "test");
+        final String testPath = "dEQP-GLES3.orientation.test";
+        final String testTrie = "{dEQP-GLES3{orientation{test}}}";
+        final String output = "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=" + testPath + "\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+
+        ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
+        IDevice mockIDevice = EasyMock.createMock(IDevice.class);
+
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        tests.add(testId);
+
+        Map<TestIdentifier, List<Map<String, String>>> instance = new HashMap<>();
+        instance.put(testId, new ArrayList<Map<String,String>>(1));
+        instance.get(testId).add(new HashMap<String,String>());
+        instance.get(testId).iterator().next().put("glconfig", "rgba8888d24s8");
+        instance.get(testId).iterator().next().put("rotation", rotation);
+        instance.get(testId).iterator().next().put("surfacetype", "window");
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instance);
+        deqpTest.setAbi(UnitTests.ABI);
+        deqpTest.setDevice(mockDevice);
+        deqpTest.setBuildHelper(new StubCtsBuildHelper());
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+                .andReturn(Integer.toString(version)).atLeastOnce();
+
+        if (!rotation.equals(DeqpTestRunner.BatchRunConfiguration.ROTATION_UNSPECIFIED)) {
+            EasyMock.expect(mockDevice.executeShellCommand("pm list features"))
+                    .andReturn(featureString);
+        }
+
+        final boolean isPortraitOrientation =
+                rotation.equals(DeqpTestRunner.BatchRunConfiguration.ROTATION_PORTRAIT) ||
+                rotation.equals(DeqpTestRunner.BatchRunConfiguration.ROTATION_REVERSE_PORTRAIT);
+        final boolean isLandscapeOrientation =
+                rotation.equals(DeqpTestRunner.BatchRunConfiguration.ROTATION_LANDSCAPE) ||
+                rotation.equals(DeqpTestRunner.BatchRunConfiguration.ROTATION_REVERSE_LANDSCAPE);
+        final boolean executable =
+                rotation.equals(DeqpTestRunner.BatchRunConfiguration.ROTATION_UNSPECIFIED) ||
+                (isPortraitOrientation &&
+                featureString.contains(DeqpTestRunner.FEATURE_PORTRAIT)) ||
+                (isLandscapeOrientation &&
+                featureString.contains(DeqpTestRunner.FEATURE_LANDSCAPE));
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+            andReturn("").once();
+
+        EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+                EasyMock.eq(true),
+                EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+                .once();
+
+        if (executable) {
+            expectRenderConfigQuery(mockDevice, String.format(
+                    "--deqp-gl-config-name=rgba8888d24s8 --deqp-screen-rotation=%s "
+                    + "--deqp-surface-type=window --deqp-gl-major-version=3 "
+                    + "--deqp-gl-minor-version=0", rotation));
+
+            String commandLine = String.format(
+                    "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8 "
+                    + "--deqp-screen-rotation=%s "
+                    + "--deqp-surface-type=window "
+                    + "--deqp-log-images=disable "
+                    + "--deqp-watchdog=enable",
+                    CASE_LIST_FILE_NAME, rotation);
+
+            runInstrumentationLineAndAnswer(mockDevice, mockIDevice, testTrie, commandLine,
+                    output);
+        }
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG)))
+                .andReturn("").once();
+
+        mockListener.testRunStarted(ID, 1);
+        EasyMock.expectLastCall().once();
+
+        mockListener.testStarted(EasyMock.eq(testId));
+        EasyMock.expectLastCall().once();
+
+        mockListener.testEnded(EasyMock.eq(testId), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        EasyMock.replay(mockDevice, mockIDevice);
+        EasyMock.replay(mockListener);
+        deqpTest.run(mockListener);
+        EasyMock.verify(mockListener);
+        EasyMock.verify(mockDevice, mockIDevice);
+    }
+
+    /**
      * Test OpeGL ES3 tests on device with OpenGL ES2.
      */
     public void testRun_require30DeviceVersion20() throws Exception {
@@ -596,4 +1015,1336 @@
     public void testRun_resultTimeout() throws Exception {
         testResultCode("Timeout", false);
     }
+    /**
+     * Test dEQP Orientation
+     */
+    public void testRun_orientationLandscape() throws Exception {
+        testOrientation("90", ALL_FEATURES);
+    }
+
+    /**
+     * Test dEQP Orientation
+     */
+    public void testRun_orientationPortrait() throws Exception {
+        testOrientation("0", ALL_FEATURES);
+    }
+
+    /**
+     * Test dEQP Orientation
+     */
+    public void testRun_orientationReverseLandscape() throws Exception {
+        testOrientation("270", ALL_FEATURES);
+    }
+
+    /**
+     * Test dEQP Orientation
+     */
+    public void testRun_orientationReversePortrait() throws Exception {
+        testOrientation("180", ALL_FEATURES);
+    }
+
+    /**
+     * Test dEQP Orientation
+     */
+    public void testRun_orientationUnspecified() throws Exception {
+        testOrientation("unspecified", ALL_FEATURES);
+    }
+
+    /**
+     * Test dEQP Orientation with limited features
+     */
+    public void testRun_orientationUnspecifiedLimitedFeatures() throws Exception {
+        testOrientation("unspecified", ONLY_LANDSCAPE_FEATURES);
+    }
+
+    /**
+     * Test dEQP Orientation with limited features
+     */
+    public void testRun_orientationLandscapeLimitedFeatures() throws Exception {
+        testOrientation("90", ONLY_LANDSCAPE_FEATURES);
+    }
+
+    /**
+     * Test dEQP Orientation with limited features
+     */
+    public void testRun_orientationPortraitLimitedFeatures() throws Exception {
+        testOrientation("0", ONLY_LANDSCAPE_FEATURES);
+    }
+
+    /**
+     * Test dEQP unsupported pixel format
+     */
+    public void testRun_unsupportedPixelFormat() throws Exception {
+        final String pixelFormat = "rgba5658d16m4";
+        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.pixelformat", "test");
+        final String testPath = "dEQP-GLES3.pixelformat.test";
+        final String testTrie = "{dEQP-GLES3{pixelformat{test}}}";
+        final String output = "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=" + testPath + "\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+
+        ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
+
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        tests.add(testId);
+
+        Map<TestIdentifier, List<Map<String, String>>> instance = new HashMap<>();
+        instance.put(testId, new ArrayList<Map<String,String>>(1));
+        instance.get(testId).add(new HashMap<String,String>());
+        instance.get(testId).iterator().next().put("glconfig", pixelFormat);
+        instance.get(testId).iterator().next().put("rotation", "unspecified");
+        instance.get(testId).iterator().next().put("surfacetype", "window");
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instance);
+        deqpTest.setAbi(UnitTests.ABI);
+        deqpTest.setDevice(mockDevice);
+        deqpTest.setBuildHelper(new StubCtsBuildHelper());
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+                .andReturn(Integer.toString(version)).atLeastOnce();
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+            andReturn("").once();
+
+        EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+                EasyMock.eq(true),
+                EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+                .once();
+
+        expectRenderConfigQueryAndReturn(mockDevice, String.format(
+                "--deqp-gl-config-name=%s --deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0", pixelFormat), "No");
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG)))
+                .andReturn("").once();
+
+        mockListener.testRunStarted(ID, 1);
+        EasyMock.expectLastCall().once();
+
+        mockListener.testStarted(EasyMock.eq(testId));
+        EasyMock.expectLastCall().once();
+
+        mockListener.testEnded(EasyMock.eq(testId), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        EasyMock.replay(mockDevice);
+        EasyMock.replay(mockListener);
+        deqpTest.run(mockListener);
+        EasyMock.verify(mockListener);
+        EasyMock.verify(mockDevice);
+    }
+
+    /**
+     * Test dEQP with multiple instances
+     */
+    public void testRun_multipleInstances() throws Exception {
+        final String instrumentationAnswerConfigAPass1 =
+                "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.instances.passall\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.instances.failone\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.instances.crashtwo\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"; // early eof
+        final String instrumentationAnswerConfigAPass2 =
+                "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.instances.crashtwo\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"; // early eof
+        final String instrumentationAnswerConfigBPass1 =
+                "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.instances.passall\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.instances.skipone\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+        final String instrumentationAnswerConfigBPass2 =
+                "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.instances.crashtwo\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TerminateTestCase-Reason=Magic\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TerminateTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+        final String instrumentationAnswerConfigCPass1 =
+                "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.instances.failone\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Fail\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Fail\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+        final String instrumentationAnswerConfigCPass2 =
+                "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.instances.crashtwo\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+
+        final TestIdentifier[] testIds = {
+                new TestIdentifier("dEQP-GLES3.instances", "passall"),
+                new TestIdentifier("dEQP-GLES3.instances", "failone"),
+                new TestIdentifier("dEQP-GLES3.instances", "crashtwo"),
+                new TestIdentifier("dEQP-GLES3.instances", "skipone"),
+        };
+
+        final String[] testPaths = {
+                "dEQP-GLES3.instances.passall",
+                "dEQP-GLES3.instances.failone",
+                "dEQP-GLES3.instances.crashtwo",
+                "dEQP-GLES3.instances.skipone",
+        };
+
+        Map<String,String> supportedConfigA = new HashMap<>();
+        supportedConfigA.put("glconfig", "rgba8888d24s8");
+        supportedConfigA.put("rotation", "unspecified");
+        supportedConfigA.put("surfacetype", "window");
+
+        Map<String,String> supportedConfigB = new HashMap<>();
+        supportedConfigB.put("glconfig", "rgba8888d24s8");
+        supportedConfigB.put("rotation", "90");
+        supportedConfigB.put("surfacetype", "window");
+
+        Map<String,String> supportedConfigC = new HashMap<>();
+        supportedConfigC.put("glconfig", "rgba8888d24s8");
+        supportedConfigC.put("rotation", "180");
+        supportedConfigC.put("surfacetype", "window");
+
+        Map<String,String> unsupportedConfig = new HashMap<>();
+        unsupportedConfig.put("glconfig", "rgb565d16s0");
+        unsupportedConfig.put("rotation", "unspecified");
+        unsupportedConfig.put("surfacetype", "window");
+
+        Map<TestIdentifier, List<Map<String, String>>> instances = new HashMap<>();
+
+        // pass all
+        instances.put(testIds[0], new ArrayList<Map<String,String>>());
+        instances.get(testIds[0]).add(supportedConfigA);
+        instances.get(testIds[0]).add(supportedConfigB);
+
+        // fail one
+        instances.put(testIds[1], new ArrayList<Map<String,String>>());
+        instances.get(testIds[1]).add(supportedConfigA);
+        instances.get(testIds[1]).add(supportedConfigC);
+
+        // crash two
+        instances.put(testIds[2], new ArrayList<Map<String,String>>());
+        instances.get(testIds[2]).add(supportedConfigA);
+        instances.get(testIds[2]).add(supportedConfigC);
+        instances.get(testIds[2]).add(supportedConfigB);
+
+        // skip one
+        instances.put(testIds[3], new ArrayList<Map<String,String>>());
+        instances.get(testIds[3]).add(supportedConfigB);
+        instances.get(testIds[3]).add(unsupportedConfig);
+
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        for (TestIdentifier id : testIds) {
+            tests.add(id);
+        }
+
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
+        IMocksControl orderedControl = EasyMock.createStrictControl();
+        ITestDevice mockDevice = orderedControl.createMock(ITestDevice.class);
+        IDevice mockIDevice = orderedControl.createMock(IDevice.class);
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instances);
+        deqpTest.setAbi(UnitTests.ABI);
+        deqpTest.setDevice(mockDevice);
+        deqpTest.setBuildHelper(new StubCtsBuildHelper());
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+                .andReturn(Integer.toString(version)).atLeastOnce();
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+            andReturn("").once();
+
+        EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+                EasyMock.eq(true),
+                EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+                .once();
+
+        // query config A
+        expectRenderConfigQueryAndReturn(mockDevice,
+                "--deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0", "Yes");
+
+        // run config A - first pass
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{instances{passall,failone,crashtwo}}}",
+                "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+                + " --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable", instrumentationAnswerConfigAPass1);
+
+        // run config A - second pass
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{instances{crashtwo}}}",
+                "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+                + " --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable", instrumentationAnswerConfigAPass2);
+
+        // query for config B
+
+        EasyMock.expect(mockDevice.executeShellCommand("pm list features")).andReturn(ALL_FEATURES)
+                .once();
+
+        expectRenderConfigQueryAndReturn(mockDevice,
+                "--deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=90 "
+                + "--deqp-surface-type=window "
+                + "--deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0", "Yes");
+
+        // run for config B - first pass
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{instances{passall,skipone}}}",
+                "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+                + " --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=90 "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable", instrumentationAnswerConfigBPass1);
+
+        // query for config C
+        expectRenderConfigQueryAndReturn(mockDevice,
+                "--deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=180 "
+                + "--deqp-surface-type=window "
+                + "--deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0", "Yes");
+
+        // run for config C - first pass
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{instances{failone}}}",
+                "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+                + " --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=180 "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable", instrumentationAnswerConfigCPass1);
+
+        // run for config C - second pass
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{instances{crashtwo}}}",
+                "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+                + " --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=180 "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable", instrumentationAnswerConfigCPass2);
+
+        // run for config B - second pass (crashtwo has been deferred due to its instability)
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{instances{crashtwo}}}",
+                "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+                + " --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=90 "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable", instrumentationAnswerConfigBPass2);
+
+        // query for unsupported config
+        expectRenderConfigQueryAndReturn(mockDevice,
+                "--deqp-gl-config-name=rgb565d16s0 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0", "No");
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG)))
+                .andReturn("").once();
+
+        mockListener.testRunStarted(ID, 4);
+        EasyMock.expectLastCall().once();
+
+        // pass all
+        mockListener.testStarted(EasyMock.eq(testIds[0]));
+        EasyMock.expectLastCall().once();
+
+        mockListener.testEnded(EasyMock.eq(testIds[0]), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        // fail one
+        mockListener.testStarted(EasyMock.eq(testIds[1]));
+        EasyMock.expectLastCall().once();
+
+        mockListener.testFailed(testIds[1],
+                "=== with config {glformat=rgba8888d24s8,rotation=180,surfacetype=window} ===\n"
+                + "Fail: Fail");
+        EasyMock.expectLastCall().once();
+
+        mockListener.testEnded(EasyMock.eq(testIds[1]), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        // crash two
+        mockListener.testStarted(EasyMock.eq(testIds[2]));
+        EasyMock.expectLastCall().once();
+
+        mockListener.testFailed(testIds[2],
+                "=== with config {glformat=rgba8888d24s8,rotation=unspecified,surfacetype=window} ===\n"
+                + "Crash: Incomplete test log\n"
+                + "=== with config {glformat=rgba8888d24s8,rotation=90,surfacetype=window} ===\n"
+                + "Terminated: Magic");
+        EasyMock.expectLastCall().once();
+
+        mockListener.testEnded(EasyMock.eq(testIds[2]), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        // skip one
+        mockListener.testStarted(EasyMock.eq(testIds[3]));
+        EasyMock.expectLastCall().once();
+
+        mockListener.testEnded(EasyMock.eq(testIds[3]), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+        EasyMock.expectLastCall().once();
+
+        orderedControl.replay();
+        EasyMock.replay(mockListener);
+        deqpTest.setRecovery(new StubRecovery());
+        deqpTest.run(mockListener);
+        EasyMock.verify(mockListener);
+        orderedControl.verify();
+    }
+
+    private void testMultipleInstancesLossOfDeviceMidInstance(final boolean recoverySuccessful)
+            throws Exception {
+        final String instrumentationAnswerFine =
+                "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.loss.instance\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Pass\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+        final String instrumentationAnswerCrash =
+                "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=dEQP-GLES3.loss.instance\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"; // early <EOF>
+
+        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.loss", "instance");
+
+        Map<String,String> supportedConfigA = new HashMap<>();
+        supportedConfigA.put("glconfig", "rgba8888d24s8");
+        supportedConfigA.put("rotation", "unspecified");
+        supportedConfigA.put("surfacetype", "window");
+
+        Map<String,String> supportedConfigB = new HashMap<>();
+        supportedConfigB.put("glconfig", "rgba8888d24s8");
+        supportedConfigB.put("rotation", "90");
+        supportedConfigB.put("surfacetype", "window");
+
+        Map<String,String> supportedConfigC = new HashMap<>();
+        supportedConfigC.put("glconfig", "rgba8888d24s8");
+        supportedConfigC.put("rotation", "180");
+        supportedConfigC.put("surfacetype", "window");
+
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        tests.add(testId);
+
+        Map<TestIdentifier, List<Map<String, String>>> instance = new HashMap<>();
+        instance.put(testId, new ArrayList<Map<String,String>>());
+        instance.get(testId).add(supportedConfigA);
+        instance.get(testId).add(supportedConfigB);
+        instance.get(testId).add(supportedConfigC);
+
+        ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
+        IDevice mockIDevice = EasyMock.createMock(IDevice.class);
+        DeqpTestRunner.IRecovery mockRecovery = EasyMock.createMock(DeqpTestRunner.IRecovery.class);
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instance);
+        deqpTest.setAbi(UnitTests.ABI);
+        deqpTest.setDevice(mockDevice);
+        deqpTest.setBuildHelper(new StubCtsBuildHelper());
+        deqpTest.setRecovery(mockRecovery);
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+                .andReturn(Integer.toString(version)).atLeastOnce();
+        EasyMock.expect(mockDevice.executeShellCommand("pm list features")).andReturn(ALL_FEATURES)
+                .anyTimes();
+
+        mockRecovery.onExecutionProgressed();
+        EasyMock.expectLastCall().atLeastOnce();
+
+        mockRecovery.setDevice(mockDevice);
+        EasyMock.expectLastCall().atLeastOnce();
+
+        if (!recoverySuccessful) {
+            EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+                andReturn("").once();
+        } else {
+            EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+                andReturn("").times(2);
+        }
+
+        EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+                EasyMock.eq(true),
+                EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+                .once();
+
+        // query config A
+        expectRenderConfigQueryAndReturn(mockDevice,
+                "--deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0", "Yes");
+
+        // run config A
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                "{dEQP-GLES3{loss{instance}}}",
+                "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+                + " --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable", instrumentationAnswerFine);
+
+        // query config B
+        expectRenderConfigQueryAndReturn(mockDevice,
+                "--deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=90 "
+                + "--deqp-surface-type=window "
+                + "--deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0", "Yes");
+
+        // run config B
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + CASE_LIST_FILE_NAME)))
+                .andReturn("").once();
+
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + LOG_FILE_NAME)))
+                .andReturn("").once();
+
+        EasyMock.expect(mockDevice.pushString("{dEQP-GLES3{loss{instance}}}\n", CASE_LIST_FILE_NAME))
+                .andReturn(true).once();
+
+        String command = String.format(
+                "am instrument %s -w -e deqpLogFileName \"%s\" -e deqpCmdLine \""
+                + "--deqp-caselist-file=%s"
+                + " --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=90 "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable\" "
+                + "-e deqpLogData \"%s\" %s",
+                AbiUtils.createAbiFlag(UnitTests.ABI.getName()), LOG_FILE_NAME,
+                CASE_LIST_FILE_NAME, false, INSTRUMENTATION_NAME);
+
+        EasyMock.expect(mockDevice.getIDevice()).andReturn(mockIDevice);
+        mockIDevice.executeShellCommand(EasyMock.eq(command),
+                EasyMock.<IShellOutputReceiver>notNull(), EasyMock.anyLong(),
+                EasyMock.isA(TimeUnit.class));
+
+        EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
+            @Override
+            public Object answer() throws ShellCommandUnresponsiveException {
+                IShellOutputReceiver receiver
+                        = (IShellOutputReceiver)EasyMock.getCurrentArguments()[1];
+
+                receiver.addOutput(instrumentationAnswerCrash.getBytes(), 0,
+                        instrumentationAnswerCrash.length());
+                throw new ShellCommandUnresponsiveException();
+            }
+        });
+
+        if (!recoverySuccessful) {
+            mockRecovery.recoverComLinkKilled();
+            EasyMock.expectLastCall().andThrow(new DeviceNotAvailableException()).once();
+        } else {
+            mockRecovery.recoverComLinkKilled();
+            EasyMock.expectLastCall().once();
+
+            // retry running config B
+            runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                    "{dEQP-GLES3{loss{instance}}}",
+                    "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+                    + " --deqp-gl-config-name=rgba8888d24s8 "
+                    + "--deqp-screen-rotation=90 "
+                    + "--deqp-surface-type=window "
+                    + "--deqp-log-images=disable "
+                    + "--deqp-watchdog=enable", instrumentationAnswerFine);
+
+            // query config C
+            expectRenderConfigQueryAndReturn(mockDevice,
+                    "--deqp-gl-config-name=rgba8888d24s8 "
+                    + "--deqp-screen-rotation=180 "
+                    + "--deqp-surface-type=window "
+                    + "--deqp-gl-major-version=3 "
+                    + "--deqp-gl-minor-version=0", "Yes");
+
+            // run config C
+            runInstrumentationLineAndAnswer(mockDevice, mockIDevice,
+                    "{dEQP-GLES3{loss{instance}}}",
+                    "--deqp-caselist-file=" + CASE_LIST_FILE_NAME
+                    + " --deqp-gl-config-name=rgba8888d24s8 "
+                    + "--deqp-screen-rotation=180 "
+                    + "--deqp-surface-type=window "
+                    + "--deqp-log-images=disable "
+                    + "--deqp-watchdog=enable", instrumentationAnswerFine);
+        }
+
+        mockListener.testRunStarted(ID, 1);
+        EasyMock.expectLastCall().once();
+
+        // result is reported only if device is available
+        if (recoverySuccessful) {
+            mockListener.testStarted(EasyMock.eq(testId));
+            EasyMock.expectLastCall().once();
+
+            mockListener.testEnded(EasyMock.eq(testId), EasyMock.<Map<String, String>>notNull());
+            EasyMock.expectLastCall().once();
+
+            mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.<Map<String, String>>notNull());
+            EasyMock.expectLastCall().once();
+        }
+
+        EasyMock.replay(mockDevice, mockIDevice);
+        EasyMock.replay(mockListener);
+        EasyMock.replay(mockRecovery);
+
+        try {
+            deqpTest.run(mockListener);
+
+            if (!recoverySuccessful) {
+                fail("did not get DeviceNotAvailableException");
+            }
+        } catch (DeviceNotAvailableException ex) {
+            if (recoverySuccessful) {
+                fail("got DeviceNotAvailableException");
+            }
+        }
+
+        EasyMock.verify(mockRecovery);
+        EasyMock.verify(mockListener);
+        EasyMock.verify(mockDevice, mockIDevice);
+    }
+
+    /**
+     * Test dEQP with runner if device is lost during one of multiple instances.
+     */
+    public void testRun_multipleInstancesLossOfDeviceMidInstance() throws Exception {
+        testMultipleInstancesLossOfDeviceMidInstance(false);
+    }
+
+    /**
+     * Test dEQP with runner if device is lost during one of multiple instances but recovery
+     * is successful.
+     */
+    public void testRun_multipleInstancesLossOfDeviceMidInstanceAndRecovery() throws Exception {
+        testMultipleInstancesLossOfDeviceMidInstance(true);
+    }
+
+    public static interface RecoverableTestDevice extends ITestDevice {
+        public void recoverDevice() throws DeviceNotAvailableException;
+    }
+
+    private static enum RecoveryEvent {
+        PROGRESS,
+        FAIL_CONNECTION_REFUSED,
+        FAIL_LINK_KILLED,
+    };
+
+    private void runRecoveryWithPattern(DeqpTestRunner.Recovery recovery, RecoveryEvent[] events)
+            throws DeviceNotAvailableException {
+        for (RecoveryEvent event : events) {
+            switch (event) {
+                case PROGRESS:
+                    recovery.onExecutionProgressed();
+                    break;
+                case FAIL_CONNECTION_REFUSED:
+                    recovery.recoverConnectionRefused();
+                    break;
+                case FAIL_LINK_KILLED:
+                    recovery.recoverComLinkKilled();
+                    break;
+            }
+        }
+    }
+
+    private void setRecoveryExpectationWait(DeqpTestRunner.ISleepProvider mockSleepProvider) {
+        mockSleepProvider.sleep(EasyMock.gt(0));
+        EasyMock.expectLastCall().once();
+    }
+
+    private void setRecoveryExpectationKillProcess(RecoverableTestDevice mockDevice,
+            DeqpTestRunner.ISleepProvider mockSleepProvider) throws DeviceNotAvailableException {
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.contains("ps"))).
+                andReturn("root 1234 com.drawelement.deqp").once();
+
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("kill -9 1234"))).
+                andReturn("").once();
+
+        // Recovery checks if kill failed
+        mockSleepProvider.sleep(EasyMock.gt(0));
+        EasyMock.expectLastCall().once();
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.contains("ps"))).
+                andReturn("").once();
+    }
+
+    private void setRecoveryExpectationRecovery(RecoverableTestDevice mockDevice)
+            throws DeviceNotAvailableException {
+        mockDevice.recoverDevice();
+        EasyMock.expectLastCall().once();
+    }
+
+    private void setRecoveryExpectationReboot(RecoverableTestDevice mockDevice)
+            throws DeviceNotAvailableException {
+        mockDevice.reboot();
+        EasyMock.expectLastCall().once();
+    }
+
+    private int setRecoveryExpectationOfAConnFailure(RecoverableTestDevice mockDevice,
+            DeqpTestRunner.ISleepProvider mockSleepProvider, int numConsecutiveErrors)
+            throws DeviceNotAvailableException {
+        switch (numConsecutiveErrors) {
+            case 0:
+            case 1:
+                setRecoveryExpectationRecovery(mockDevice);
+                return 2;
+            case 2:
+                setRecoveryExpectationReboot(mockDevice);
+                return 3;
+            default:
+                return 4;
+        }
+    }
+
+    private int setRecoveryExpectationOfAComKilled(RecoverableTestDevice mockDevice,
+            DeqpTestRunner.ISleepProvider mockSleepProvider, int numConsecutiveErrors)
+            throws DeviceNotAvailableException {
+        switch (numConsecutiveErrors) {
+            case 0:
+                setRecoveryExpectationWait(mockSleepProvider);
+                setRecoveryExpectationKillProcess(mockDevice, mockSleepProvider);
+                return 1;
+            case 1:
+                setRecoveryExpectationRecovery(mockDevice);
+                setRecoveryExpectationKillProcess(mockDevice, mockSleepProvider);
+                return 2;
+            case 2:
+                setRecoveryExpectationReboot(mockDevice);
+                return 3;
+            default:
+                return 4;
+        }
+    }
+
+    private void setRecoveryExpectationsOfAPattern(RecoverableTestDevice mockDevice,
+            DeqpTestRunner.ISleepProvider mockSleepProvider, RecoveryEvent[] events)
+            throws DeviceNotAvailableException {
+        int numConsecutiveErrors = 0;
+        for (RecoveryEvent event : events) {
+            switch (event) {
+                case PROGRESS:
+                    numConsecutiveErrors = 0;
+                    break;
+                case FAIL_CONNECTION_REFUSED:
+                    numConsecutiveErrors = setRecoveryExpectationOfAConnFailure(mockDevice,
+                            mockSleepProvider, numConsecutiveErrors);
+                    break;
+                case FAIL_LINK_KILLED:
+                    numConsecutiveErrors = setRecoveryExpectationOfAComKilled(mockDevice,
+                            mockSleepProvider, numConsecutiveErrors);
+                    break;
+            }
+        }
+    }
+
+    /**
+     * Test dEQP runner recovery state machine.
+     */
+    private void testRecoveryWithPattern(boolean expectSuccess, RecoveryEvent...pattern)
+            throws Exception {
+        DeqpTestRunner.Recovery recovery = new DeqpTestRunner.Recovery();
+        IMocksControl orderedControl = EasyMock.createStrictControl();
+        RecoverableTestDevice mockDevice = orderedControl.createMock(RecoverableTestDevice.class);
+        DeqpTestRunner.ISleepProvider mockSleepProvider =
+                orderedControl.createMock(DeqpTestRunner.ISleepProvider.class);
+
+        setRecoveryExpectationsOfAPattern(mockDevice, mockSleepProvider, pattern);
+
+        orderedControl.replay();
+
+        recovery.setDevice(mockDevice);
+        recovery.setSleepProvider(mockSleepProvider);
+        try {
+            runRecoveryWithPattern(recovery, pattern);
+            if (!expectSuccess) {
+                fail("Expected DeviceNotAvailableException");
+            }
+        } catch (DeviceNotAvailableException ex) {
+            if (expectSuccess) {
+                fail("Did not expect DeviceNotAvailableException");
+            }
+        }
+
+        orderedControl.verify();
+    }
+
+    // basic patterns
+
+    public void testRecovery_NoEvents() throws Exception {
+        testRecoveryWithPattern(true);
+    }
+
+    public void testRecovery_AllOk() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.PROGRESS, RecoveryEvent.PROGRESS);
+    }
+
+    // conn fail patterns
+
+    public void testRecovery_OneConnectionFailureBegin() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.FAIL_CONNECTION_REFUSED,
+                RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_TwoConnectionFailuresBegin() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.FAIL_CONNECTION_REFUSED,
+                RecoveryEvent.FAIL_CONNECTION_REFUSED, RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_ThreeConnectionFailuresBegin() throws Exception {
+        testRecoveryWithPattern(false, RecoveryEvent.FAIL_CONNECTION_REFUSED,
+                RecoveryEvent.FAIL_CONNECTION_REFUSED, RecoveryEvent.FAIL_CONNECTION_REFUSED);
+    }
+
+    public void testRecovery_OneConnectionFailureMid() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.PROGRESS,
+                RecoveryEvent.FAIL_CONNECTION_REFUSED, RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_TwoConnectionFailuresMid() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.PROGRESS,
+                RecoveryEvent.FAIL_CONNECTION_REFUSED, RecoveryEvent.FAIL_CONNECTION_REFUSED,
+                RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_ThreeConnectionFailuresMid() throws Exception {
+        testRecoveryWithPattern(false, RecoveryEvent.PROGRESS,
+                RecoveryEvent.FAIL_CONNECTION_REFUSED, RecoveryEvent.FAIL_CONNECTION_REFUSED,
+                RecoveryEvent.FAIL_CONNECTION_REFUSED);
+    }
+
+    // link fail patterns
+
+    public void testRecovery_OneLinkFailureBegin() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_TwoLinkFailuresBegin() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.FAIL_LINK_KILLED, RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_ThreeLinkFailuresBegin() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.FAIL_LINK_KILLED, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_FourLinkFailuresBegin() throws Exception {
+        testRecoveryWithPattern(false, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.FAIL_LINK_KILLED, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.FAIL_LINK_KILLED);
+    }
+
+    public void testRecovery_OneLinkFailureMid() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.PROGRESS,
+                RecoveryEvent.FAIL_LINK_KILLED, RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_TwoLinkFailuresMid() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.PROGRESS,
+                RecoveryEvent.FAIL_LINK_KILLED, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_ThreeLinkFailuresMid() throws Exception {
+        testRecoveryWithPattern(true, RecoveryEvent.PROGRESS,
+                RecoveryEvent.FAIL_LINK_KILLED, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.FAIL_LINK_KILLED, RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_FourLinkFailuresMid() throws Exception {
+        testRecoveryWithPattern(false, RecoveryEvent.PROGRESS, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.FAIL_LINK_KILLED, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.FAIL_LINK_KILLED);
+    }
+
+    // mixed patterns
+
+    public void testRecovery_MixedFailuresProgressBetween() throws Exception {
+        testRecoveryWithPattern(true,
+                RecoveryEvent.PROGRESS, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.PROGRESS, RecoveryEvent.FAIL_CONNECTION_REFUSED,
+                RecoveryEvent.PROGRESS, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.PROGRESS, RecoveryEvent.FAIL_CONNECTION_REFUSED,
+                RecoveryEvent.PROGRESS);
+    }
+
+    public void testRecovery_MixedFailuresNoProgressBetween() throws Exception {
+        testRecoveryWithPattern(true,
+                RecoveryEvent.PROGRESS, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.FAIL_CONNECTION_REFUSED, RecoveryEvent.FAIL_LINK_KILLED,
+                RecoveryEvent.PROGRESS);
+    }
+
+    /**
+     * Test recovery if process cannot be killed
+     */
+    public void testRecovery_unkillableProcess () throws Exception {
+        DeqpTestRunner.Recovery recovery = new DeqpTestRunner.Recovery();
+        IMocksControl orderedControl = EasyMock.createStrictControl();
+        RecoverableTestDevice mockDevice = orderedControl.createMock(RecoverableTestDevice.class);
+        DeqpTestRunner.ISleepProvider mockSleepProvider =
+                orderedControl.createMock(DeqpTestRunner.ISleepProvider.class);
+
+        // recovery attempts to kill the process after a timeout
+        mockSleepProvider.sleep(EasyMock.gt(0));
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.contains("ps"))).
+                andReturn("root 1234 com.drawelement.deqp").once();
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("kill -9 1234"))).
+                andReturn("").once();
+
+        // Recovery checks if kill failed
+        mockSleepProvider.sleep(EasyMock.gt(0));
+        EasyMock.expectLastCall().once();
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.contains("ps"))).
+                andReturn("root 1234 com.drawelement.deqp").once();
+
+        // Recovery resets the connection
+        mockDevice.recoverDevice();
+        EasyMock.expectLastCall().once();
+
+        // and attempts to kill the process again
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.contains("ps"))).
+                andReturn("root 1234 com.drawelement.deqp").once();
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("kill -9 1234"))).
+                andReturn("").once();
+
+        // Recovery checks if kill failed
+        mockSleepProvider.sleep(EasyMock.gt(0));
+        EasyMock.expectLastCall().once();
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.contains("ps"))).
+                andReturn("root 1234 com.drawelement.deqp").once();
+
+        // recovery reboots the device
+        mockDevice.reboot();
+        EasyMock.expectLastCall().once();
+
+        orderedControl.replay();
+        recovery.setDevice(mockDevice);
+        recovery.setSleepProvider(mockSleepProvider);
+        recovery.recoverComLinkKilled();
+        orderedControl.verify();
+    }
+
+    /**
+     * Test external interruption before batch run.
+     */
+    public void testInterrupt_killBeforeBatch() throws Exception {
+        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.interrupt", "test");
+
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        tests.add(testId);
+
+        Map<TestIdentifier, List<Map<String, String>>> instance = new HashMap<>();
+        instance.put(testId, DEFAULT_INSTANCE_ARGS);
+
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
+        ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
+        IDevice mockIDevice = EasyMock.createMock(IDevice.class);
+        IRunUtil mockRunUtil = EasyMock.createMock(IRunUtil.class);
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instance);
+        deqpTest.setAbi(UnitTests.ABI);
+        deqpTest.setDevice(mockDevice);
+        deqpTest.setBuildHelper(new StubCtsBuildHelper());
+        deqpTest.setRunUtil(mockRunUtil);
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+                .andReturn(Integer.toString(version)).atLeastOnce();
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+            andReturn("").once();
+
+        EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+                EasyMock.eq(true),
+                EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+                .once();
+
+        expectRenderConfigQuery(mockDevice,
+                "--deqp-gl-config-name=rgba8888d24s8 --deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window --deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0");
+
+        mockRunUtil.sleep(0);
+        EasyMock.expectLastCall().andThrow(new RunInterruptedException());
+
+        mockListener.testRunStarted(ID, 1);
+        EasyMock.expectLastCall().once();
+
+        EasyMock.replay(mockDevice, mockIDevice);
+        EasyMock.replay(mockListener);
+        EasyMock.replay(mockRunUtil);
+        try {
+            deqpTest.run(mockListener);
+            fail("expected RunInterruptedException");
+        } catch (RunInterruptedException ex) {
+            // expected
+        }
+        EasyMock.verify(mockRunUtil);
+        EasyMock.verify(mockListener);
+        EasyMock.verify(mockDevice, mockIDevice);
+    }
+
+    /**
+     * Test external interruption in testFailed().
+     */
+    public void testInterrupt_killReportTestFailed() throws Exception {
+        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.interrupt", "test");
+        final String testPath = "dEQP-GLES3.interrupt.test";
+        final String testTrie = "{dEQP-GLES3{interrupt{test}}}";
+        final String output = "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=2014.x\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseId\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=0xcafebabe\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=targetName\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Value=android\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=" + testPath + "\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Code=Fail\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-TestCaseResult-Details=Fail\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=TestCaseResult\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndTestCase\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_STATUS: dEQP-EventType=EndSession\r\n"
+                + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
+                + "INSTRUMENTATION_CODE: 0\r\n";
+
+        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        tests.add(testId);
+
+        Map<TestIdentifier, List<Map<String, String>>> instance = new HashMap<>();
+        instance.put(testId, DEFAULT_INSTANCE_ARGS);
+
+        ITestInvocationListener mockListener
+                = EasyMock.createStrictMock(ITestInvocationListener.class);
+        ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
+        IDevice mockIDevice = EasyMock.createMock(IDevice.class);
+        IRunUtil mockRunUtil = EasyMock.createMock(IRunUtil.class);
+
+        DeqpTestRunner deqpTest = new DeqpTestRunner(NAME, NAME, tests, instance);
+        deqpTest.setAbi(UnitTests.ABI);
+        deqpTest.setDevice(mockDevice);
+        deqpTest.setBuildHelper(new StubCtsBuildHelper());
+        deqpTest.setRunUtil(mockRunUtil);
+
+        int version = 3 << 16;
+        EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
+                .andReturn(Integer.toString(version)).atLeastOnce();
+
+        EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).
+            andReturn("").once();
+
+        EasyMock.expect(mockDevice.installPackage(EasyMock.<File>anyObject(),
+                EasyMock.eq(true),
+                EasyMock.eq(AbiUtils.createAbiFlag(UnitTests.ABI.getName())))).andReturn(null)
+                .once();
+
+        expectRenderConfigQuery(mockDevice,
+                "--deqp-gl-config-name=rgba8888d24s8 --deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window --deqp-gl-major-version=3 "
+                + "--deqp-gl-minor-version=0");
+
+        mockRunUtil.sleep(0);
+        EasyMock.expectLastCall().once();
+
+        String commandLine = String.format(
+                "--deqp-caselist-file=%s --deqp-gl-config-name=rgba8888d24s8 "
+                + "--deqp-screen-rotation=unspecified "
+                + "--deqp-surface-type=window "
+                + "--deqp-log-images=disable "
+                + "--deqp-watchdog=enable",
+                CASE_LIST_FILE_NAME);
+
+        runInstrumentationLineAndAnswer(mockDevice, mockIDevice, testTrie, commandLine,
+                output);
+
+        mockListener.testRunStarted(ID, 1);
+        EasyMock.expectLastCall().once();
+
+        mockListener.testStarted(EasyMock.eq(testId));
+        EasyMock.expectLastCall().once();
+
+        mockListener.testFailed(EasyMock.eq(testId), EasyMock.<String>notNull());
+        EasyMock.expectLastCall().andThrow(new RunInterruptedException());
+
+        EasyMock.replay(mockDevice, mockIDevice);
+        EasyMock.replay(mockListener);
+        EasyMock.replay(mockRunUtil);
+        try {
+            deqpTest.run(mockListener);
+            fail("expected RunInterruptedException");
+        } catch (RunInterruptedException ex) {
+            // expected
+        }
+        EasyMock.verify(mockRunUtil);
+        EasyMock.verify(mockListener);
+        EasyMock.verify(mockDevice, mockIDevice);
+    }
+
+    private void runInstrumentationLineAndAnswer(ITestDevice mockDevice, IDevice mockIDevice,
+            final String testTrie, final String cmd, final String output) throws Exception {
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + CASE_LIST_FILE_NAME)))
+                .andReturn("").once();
+
+        EasyMock.expect(mockDevice.executeShellCommand(EasyMock.eq("rm " + LOG_FILE_NAME)))
+                .andReturn("").once();
+
+        EasyMock.expect(mockDevice.pushString(testTrie + "\n", CASE_LIST_FILE_NAME))
+                .andReturn(true).once();
+
+        String command = String.format(
+                "am instrument %s -w -e deqpLogFileName \"%s\" -e deqpCmdLine \"%s\" "
+                    + "-e deqpLogData \"%s\" %s",
+                AbiUtils.createAbiFlag(UnitTests.ABI.getName()), LOG_FILE_NAME, cmd, false,
+                INSTRUMENTATION_NAME);
+
+        EasyMock.expect(mockDevice.getIDevice()).andReturn(mockIDevice);
+        mockIDevice.executeShellCommand(EasyMock.eq(command),
+                EasyMock.<IShellOutputReceiver>notNull(), EasyMock.anyLong(),
+                EasyMock.isA(TimeUnit.class));
+
+        EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
+            @Override
+            public Object answer() {
+                IShellOutputReceiver receiver
+                        = (IShellOutputReceiver)EasyMock.getCurrentArguments()[1];
+
+                receiver.addOutput(output.getBytes(), 0, output.length());
+                receiver.flush();
+
+                return null;
+            }
+        });
+    }
 }
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/GeeTestTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/GeeTestTest.java
new file mode 100644
index 0000000..93272be
--- /dev/null
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/GeeTestTest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2015 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 com.android.cts.tradefed.testtype;
+
+import com.android.cts.tradefed.UnitTests;
+
+import junit.framework.TestCase;
+
+/**
+ * Unit tests for {@link GeeTest}.
+ */
+public class GeeTestTest extends TestCase {
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+     /**
+     * Test {@link GeeTestTest#getGTestFilters}
+     * @throws DeviceNotAvailableException
+     */
+    public void testGetGTestFilters() {
+        GeeTest test = new GeeTest("package_foo", "exe_foo");
+        test.setPositiveFilters("a");
+        test.setNegativeFilters("b");
+        String actual = test.getGTestFilters();
+        assertEquals("--gtest_filter=a:-b", actual);
+    }
+
+    /**
+     * Test {@link GeeTestTest#getGTestFilters} with only positive filters
+     * @throws DeviceNotAvailableException
+     */
+    public void testGetGTestFiltersPositiveOnly() {
+        GeeTest test = new GeeTest("package_foo", "exe_foo");
+        test.setPositiveFilters("a");
+        String actual = test.getGTestFilters();
+        assertEquals("--gtest_filter=a", actual);
+    }
+
+    /**
+     * Test {@link GeeTestTest#getGTestFilters} with only negative filters
+     * @throws DeviceNotAvailableException
+     */
+    public void testGetGTestFiltersNegativeOnly() {
+        GeeTest test = new GeeTest("package_foo", "exe_foo");
+        test.setNegativeFilters("b");
+        String actual = test.getGTestFilters();
+        assertEquals("--gtest_filter=-b", actual);
+    }
+
+    /**
+     * Test {@link GeeTestTest#getGTestFilters} with empty filters
+     * @throws DeviceNotAvailableException
+     */
+    public void testGetGTestFiltersWithNoFilters() {
+        GeeTest test = new GeeTest("package_foo", "exe_foo");
+        String actual = test.getGTestFilters();
+        assertEquals("", actual);
+    }
+}
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPackageXmlParserTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPackageXmlParserTest.java
index 6d87a61..bd48c51 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPackageXmlParserTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPackageXmlParserTest.java
@@ -25,6 +25,8 @@
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 
 /**
  * Unit tests for {@link TestPackageXmlParser}.
@@ -65,6 +67,29 @@
 
     private static final String NO_TEST_DATA = "<invalid />";
 
+    private static final String INSTANCED_TEST_DATA =
+        "<TestPackage>\n" +
+        "    <TestSuite name=\"com\" >\n" +
+        "        <TestSuite name=\"example\" >\n" +
+        "            <TestCase name=\"ExampleTest\" >\n" +
+        "                <Test name=\"testMultiInstanced\" >\n" +
+        "                    <TestInstance foo=\"bar\" />\n" +
+        "                    <TestInstance foo=\"baz\" foo2=\"baz2\"/>\n" +
+        "                </Test>\n" +
+        "                <Test name=\"testSingleInstanced\" >\n" +
+        "                    <TestInstance foo=\"bar\" />\n" +
+        "                </Test>\n" +
+        "                <Test name=\"testEmptyInstances\" >\n" +
+        "                    <TestInstance />\n" +
+        "                    <TestInstance />\n" +
+        "                </Test>\n" +
+        "                <Test name=\"testNotInstanced\" >\n" +
+        "                </Test>\n" +
+        "            </TestCase>\n" +
+        "        </TestSuite>\n" +
+        "    </TestSuite>\n" +
+        "</TestPackage>";
+
     /**
      * Test parsing test case xml containing an instrumentation test definition.
      */
@@ -162,6 +187,90 @@
         assertTrue(parser.getTestPackageDefs().isEmpty());
     }
 
+    /**
+     * Test parsing a test case xml with multiple test instances
+     */
+    public void testParse_instancedMultiple() throws ParseException  {
+        TestPackageXmlParser parser = new TestPackageXmlParser(true);
+        parser.parse(getStringAsStream(INSTANCED_TEST_DATA));
+        for (TestPackageDef def : parser.getTestPackageDefs()) {
+            final TestIdentifier testId =
+                    new TestIdentifier("com.example.ExampleTest", "testMultiInstanced");
+            final List<Map<String, String>> targetInstances =
+                    def.getTestInstanceArguments().get(testId);
+            assertNotNull(targetInstances);
+            assertEquals(2, targetInstances.size());
+
+            final Iterator<Map<String, String>> iterator = targetInstances.iterator();
+            final Map<String, String> firstInstance = iterator.next();
+            final Map<String, String> secondInstance = iterator.next();
+
+            assertEquals("bar", firstInstance.get("foo"));
+            assertEquals("baz", secondInstance.get("foo"));
+            assertEquals("baz2", secondInstance.get("foo2"));
+        }
+    }
+
+    /**
+     * Test parsing a test case xml with single test instance
+     */
+    public void testParse_instancedSingle() throws ParseException  {
+        TestPackageXmlParser parser = new TestPackageXmlParser(true);
+        parser.parse(getStringAsStream(INSTANCED_TEST_DATA));
+        for (TestPackageDef def : parser.getTestPackageDefs()) {
+            final TestIdentifier testId =
+                    new TestIdentifier("com.example.ExampleTest", "testSingleInstanced");
+            final List<Map<String, String>> targetInstances =
+                    def.getTestInstanceArguments().get(testId);
+            assertNotNull(targetInstances);
+            assertEquals(1, targetInstances.size());
+
+            final Iterator<Map<String, String>> iterator = targetInstances.iterator();
+            final Map<String, String> firstInstance = iterator.next();
+
+            assertEquals("bar", firstInstance.get("foo"));
+        }
+    }
+
+    /**
+     * Test parsing a test case xml with multiple test instances with no data
+     */
+    public void testParse_instancedEmptys() throws ParseException  {
+        TestPackageXmlParser parser = new TestPackageXmlParser(true);
+        parser.parse(getStringAsStream(INSTANCED_TEST_DATA));
+        for (TestPackageDef def : parser.getTestPackageDefs()) {
+            final TestIdentifier testId =
+                    new TestIdentifier("com.example.ExampleTest", "testEmptyInstances");
+            final List<Map<String, String>> targetInstances =
+                    def.getTestInstanceArguments().get(testId);
+            assertNotNull(targetInstances);
+            assertEquals(2, targetInstances.size());
+
+            final Iterator<Map<String, String>> iterator = targetInstances.iterator();
+            final Map<String, String> firstInstance = iterator.next();
+            final Map<String, String> secondInstance = iterator.next();
+
+            assertTrue(firstInstance.isEmpty());
+            assertTrue(secondInstance.isEmpty());
+        }
+    }
+
+    /**
+     * Test parsing a test case xml with no test instances
+     */
+    public void testParse_instancedNoInstances() throws ParseException  {
+        TestPackageXmlParser parser = new TestPackageXmlParser(true);
+        parser.parse(getStringAsStream(INSTANCED_TEST_DATA));
+        for (TestPackageDef def : parser.getTestPackageDefs()) {
+            final TestIdentifier testId =
+                    new TestIdentifier("com.example.ExampleTest", "testNotInstanced");
+            final List<Map<String, String>> targetInstances =
+                    def.getTestInstanceArguments().get(testId);
+            assertNotNull(targetInstances);
+            assertTrue(targetInstances.isEmpty());
+        }
+    }
+
     private InputStream getStringAsStream(String input) {
         return new ByteArrayInputStream(input.getBytes());
     }
diff --git a/tools/utils/CollectAllTests.java b/tools/utils/CollectAllTests.java
index 95b77f2..83c451e 100644
--- a/tools/utils/CollectAllTests.java
+++ b/tools/utils/CollectAllTests.java
@@ -447,6 +447,9 @@
                                                                     expectations,
                                                                     testClassName,
                                                                     testName);
+        int timeoutInMinutes = VogarUtils.timeoutInMinutes(expectations,
+                                                           testClassName,
+                                                           testName);
         TestClass testClass;
         if (testCases.containsKey(testClassName)) {
             testClass = testCases.get(testClassName);
@@ -456,7 +459,7 @@
         }
 
         testClass.mCases.add(new TestMethod(testName, "", "", supportedAbis,
-              knownFailure, false, false));
+              knownFailure, false, false, timeoutInMinutes));
     }
 
     private static boolean isJunit3Test(Class<?> klass) {
diff --git a/tools/utils/DescriptionGenerator.java b/tools/utils/DescriptionGenerator.java
index 09e1118..1e2542f 100644
--- a/tools/utils/DescriptionGenerator.java
+++ b/tools/utils/DescriptionGenerator.java
@@ -86,6 +86,7 @@
     static final String ATTRIBUTE_NAME = "name";
     static final String ATTRIBUTE_ABIS = "abis";
     static final String ATTRIBUTE_HOST_CONTROLLER = "HostController";
+    static final String ATTRIBUTE_TIMEOUT = "timeout";
 
     static final String XML_OUTPUT_PATH = "./description.xml";
 
@@ -438,6 +439,10 @@
                     if ((caze.mController != null) && (caze.mController.length() != 0)) {
                         setAttribute(caseNode, ATTRIBUTE_HOST_CONTROLLER, caze.mController);
                     }
+                    if (caze.mTimeoutInMinutes != 0) {
+                        setAttribute(caseNode, ATTRIBUTE_TIMEOUT,
+                                     Integer.toString(caze.mTimeoutInMinutes));
+                    }
 
                     if (caze.mDescription != null && !caze.mDescription.equals("")) {
                         caseNode.appendChild(mDoc.createElement(TAG_DESCRIPTION))
@@ -573,9 +578,10 @@
                             VogarUtils.buildFullTestName(clazz.toString(), name));
                     Set<String> supportedAbis =
                             VogarUtils.extractSupportedAbis(architecture, expectation);
+                    int timeoutInMinutes = VogarUtils.timeoutInMinutes(expectation);
                     cases.add(new TestMethod(
                             name, method.commentText(), controller, supportedAbis,
-                                    knownFailure, isBroken, isSuppressed));
+                                    knownFailure, isBroken, isSuppressed, timeoutInMinutes));
                 }
             }
 
@@ -635,6 +641,7 @@
         String mKnownFailure;
         boolean mIsBroken;
         boolean mIsSuppressed;
+        int mTimeoutInMinutes;  // zero to use default timeout.
 
         /**
          * Construct an test case object.
@@ -644,7 +651,10 @@
          * @param knownFailure The reason of known failure.
          */
         TestMethod(String name, String description, String controller, Set<String> abis,
-                String knownFailure, boolean isBroken, boolean isSuppressed) {
+                String knownFailure, boolean isBroken, boolean isSuppressed, int timeoutInMinutes) {
+            if (timeoutInMinutes < 0) {
+                throw new IllegalArgumentException("timeoutInMinutes < 0: " + timeoutInMinutes);
+            }
             mName = name;
             mDescription = description;
             mController = controller;
@@ -652,6 +662,7 @@
             mKnownFailure = knownFailure;
             mIsBroken = isBroken;
             mIsSuppressed = isSuppressed;
+            mTimeoutInMinutes = timeoutInMinutes;
         }
     }
 }
diff --git a/tools/utils/VogarUtils.java b/tools/utils/VogarUtils.java
index 5e8b944..8e77e7c 100644
--- a/tools/utils/VogarUtils.java
+++ b/tools/utils/VogarUtils.java
@@ -19,6 +19,7 @@
 import vogar.Expectation;
 import vogar.ExpectationStore;
 import vogar.ModeId;
+import vogar.Result;
 
 import java.io.File;
 import java.io.FilenameFilter;
@@ -52,14 +53,14 @@
         }
         String fullTestName = buildFullTestName(testClassName, testMethodName);
         Expectation expectation = expectationStore.get(fullTestName);
-        if (expectation == Expectation.SUCCESS) {
+        if (expectation.getResult() == Result.SUCCESS) {
             return false;
         }
 
         String description = expectation.getDescription();
         boolean foundAbi = AbiUtils.parseAbiList(description).size() > 0;
 
-        return expectation != Expectation.SUCCESS && !foundAbi;
+        return expectation.getResult() != Result.SUCCESS && !foundAbi;
     }
 
     public static ExpectationStore provideExpectationStore(String dir) throws IOException {
@@ -119,7 +120,7 @@
                                                    String className,
                                                    String testName) {
 
-        String fullTestName = VogarUtils.buildFullTestName(className, testName);
+        String fullTestName = buildFullTestName(className, testName);
         Set<String> supportedAbiSet = AbiUtils.getAbisForArch(architecture);
         for (ExpectationStore expectationStore : expectationStores) {
             Expectation expectation = expectationStore.get(fullTestName);
@@ -128,4 +129,44 @@
 
         return supportedAbiSet;
     }
+
+    /**
+     * Returns the greatest timeout in minutes for the test in all
+     * expectation stores, or 0 if no timeout was found.
+     */
+    public static int timeoutInMinutes(ExpectationStore[] expectationStores,
+            final String testClassName,
+            final String testMethodName) {
+        int timeoutInMinutes = 0;
+        for (ExpectationStore expectationStore : expectationStores) {
+            timeoutInMinutes = Math.max(timeoutInMinutes,
+                                        timeoutInMinutes(expectationStore,
+                                                         testClassName,
+                                                         testMethodName));
+        }
+        return timeoutInMinutes;
+    }
+
+    /**
+     * Returns the timeout in minutes for the test in the expectation
+     * stores, or 0 if no timeout was found.
+     */
+    public static int timeoutInMinutes(ExpectationStore expectationStore,
+            final String testClassName,
+            final String testMethodName) {
+        if (expectationStore == null) {
+            return 0;
+        }
+        String fullTestName = buildFullTestName(testClassName, testMethodName);
+        return timeoutInMinutes(expectationStore.get(fullTestName));
+    }
+
+    /**
+     * Returns the timeout in minutes for the expectation. Currently a
+     * tag of large results in a 60 minute timeout, otherwise 0 is
+     * returned to indicate a default timeout should be used.
+     */
+    public static int timeoutInMinutes(Expectation expectation) {
+        return expectation.getTags().contains("large") ? 60 : 0;
+    }
 }
diff --git a/tools/utils/buildCts.py b/tools/utils/buildCts.py
index 4d04e1a..2b7e093 100755
--- a/tools/utils/buildCts.py
+++ b/tools/utils/buildCts.py
@@ -30,6 +30,12 @@
   """Return all directories under the given root directory."""
   return [x for x in os.listdir(root) if os.path.isdir(os.path.join(root, x))]
 
+def ReadFileLines(filePath):
+  """Reads a file and returns its contents as a line list."""
+  f = open(filePath, 'r');
+  lines = [line.strip() for line in f.readlines()]
+  f.close()
+  return lines
 
 def GetMakeFileVars(makefile_path):
   """Extracts variable definitions from the given make file.
@@ -153,13 +159,17 @@
     plan.Include('com\.android\.cts\..*')#TODO(stuartscott): Should PDK have all these?
     self.__WritePlan(plan, 'PDK')
 
+    temporarily_known_failure_tests = BuildCtsTemporarilyKnownFailureList();
     flaky_tests = BuildCtsFlakyTestList()
+    releasekey_tests = BuildListForReleaseBuildTest()
 
     # CTS Stable plan
     plan = tools.TestPlan(packages)
     plan.Exclude(r'com\.android\.cts\.browserbench')
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
+    for package, test_list in releasekey_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
     self.__WritePlan(plan, 'CTS-stable')
 
     # CTS Flaky plan - list of tests known to be flaky in lab environment
@@ -181,9 +191,14 @@
     for package, test_list in small_tests.iteritems():
       plan.Include(package+'$')
     plan.Exclude(r'com\.android\.cts\.browserbench')
+    for package, test_list in temporarily_known_failure_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
+    for package, test_list in releasekey_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
     self.__WritePlan(plan, 'CTS-kitkat-small')
+    self.__WritePlan(plan, 'CTS-public-small')
 
     # CTS - sub plan for public, medium size tests
     plan = tools.TestPlan(packages)
@@ -193,7 +208,10 @@
     plan.Exclude(r'com\.android\.cts\.browserbench')
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
+    for package, test_list in releasekey_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
     self.__WritePlan(plan, 'CTS-kitkat-medium')
+    self.__WritePlan(plan, 'CTS-public-medium')
 
     # CTS - sub plan for hardware tests which is public, large
     plan = tools.TestPlan(packages)
@@ -202,6 +220,8 @@
     plan.Exclude(r'com\.android\.cts\.browserbench')
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
+    for package, test_list in releasekey_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
     self.__WritePlan(plan, 'CTS-hardware')
 
     # CTS - sub plan for media tests which is public, large
@@ -212,6 +232,8 @@
     plan.Exclude(r'com\.android\.cts\.browserbench')
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
+    for package, test_list in releasekey_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
     self.__WritePlan(plan, 'CTS-media')
 
     # CTS - sub plan for mediastress tests which is public, large
@@ -221,6 +243,8 @@
     plan.Exclude(r'com\.android\.cts\.browserbench')
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
+    for package, test_list in releasekey_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
     self.__WritePlan(plan, 'CTS-mediastress')
 
     # CTS - sub plan for new tests that is vetted for L launch
@@ -231,9 +255,17 @@
     plan.Exclude(r'com\.android\.cts\.browserbench')
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
+    for package, test_list in releasekey_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
     self.__WritePlan(plan, 'CTS-l-tests')
 
-    #CTS - sub plan for new test packages added for staging
+    # CTS - sub plan for tests in drawelement packages
+    plan = tools.TestPlan(packages)
+    plan.Exclude('.*')
+    plan.Include(r'com\.drawelements\.')
+    self.__WritePlan(plan, 'CTS-DEQP')
+
+    # CTS - sub plan for new test packages added for staging
     plan = tools.TestPlan(packages)
     for package, test_list in small_tests.iteritems():
       plan.Exclude(package+'$')
@@ -241,6 +273,10 @@
       plan.Exclude(package+'$')
     for package, tests_list in new_test_packages.iteritems():
       plan.Exclude(package+'$')
+    for package, test_list in temporarily_known_failure_tests.iteritems():
+      plan.Include(package+'$')
+      plan.IncludeTests(package, test_list)
+    plan.Exclude(r'com\.drawelements\.')
     plan.Exclude(r'android\.hardware$')
     plan.Exclude(r'android\.media$')
     plan.Exclude(r'android\.view$')
@@ -248,16 +284,12 @@
     plan.Exclude(r'com\.android\.cts\.browserbench')
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
+    for package, test_list in releasekey_tests.iteritems():
+      plan.ExcludeTests(package, test_list)
     self.__WritePlan(plan, 'CTS-staging')
 
     plan = tools.TestPlan(packages)
     plan.Exclude('.*')
-    plan.Include(r'com\.drawelements\.')
-    self.__WritePlan(plan, 'CTS-DEQP')
-
-    plan = tools.TestPlan(packages)
-    plan.Exclude('.*')
-    plan.Include(r'android\.webgl')
     self.__WritePlan(plan, 'CTS-webview')
 
 
@@ -281,7 +313,7 @@
       'com.android.cts.browserbench' : []}
 
 def BuildAospSmallSizeTestList():
-  """ Construct a defaultdict that lists packages names of small tests
+  """ Construct a default dict that lists packages names of small tests
       already published to aosp. """
   return {
       'android.aadb' : [],
@@ -335,6 +367,7 @@
       'com.android.cts.dram' : [],
       'com.android.cts.filesystemperf' : [],
       'com.android.cts.jank' : [],
+      'com.android.cts.jank2' : [],
       'com.android.cts.opengl' : [],
       'com.android.cts.simplecpu' : [],
       'com.android.cts.ui' : [],
@@ -370,52 +403,69 @@
       'android.signature' : [],
       'android.tv' : [],
       'android.uiautomation' : [],
-      'android.uirendering' : [],
-      'android.webgl' : [],
-      'com.drawelements.deqp.gles3' : [],
-      'com.drawelements.deqp.gles31' : []}
+      'android.uirendering' : []}
+
+def BuildListForReleaseBuildTest():
+  """ Construct a defaultdict that maps package name to a list of tests
+      that are expected to pass only when running against a user/release-key build. """
+  return {
+      'android.app' : [
+          'android.app.cts.ActivityManagerTest#testIsRunningInTestHarness',],
+      'android.dpi' : [
+          'android.dpi.cts.DefaultManifestAttributesSdkTest#testPackageHasExpectedSdkVersion',],
+      'android.host.security' : [
+          'android.cts.security.SELinuxHostTest#testAllEnforcing',
+          'android.cts.security.SELinuxHostTest#testSuDomain',],
+      'android.os' : [
+          'android.os.cts.BuildVersionTest#testReleaseVersion',
+          'android.os.cts.BuildTest#testIsSecureUserBuild',],
+      'android.security' : [
+          'android.security.cts.BannedFilesTest#testNoSu',
+          'android.security.cts.BannedFilesTest#testNoSuInPath',
+          'android.security.cts.PackageSignatureTest#testPackageSignatures',
+          'android.security.cts.SELinuxDomainTest#testSuDomain',],
+      '' : []}
 
 def BuildCtsFlakyTestList():
   """ Construct a defaultdict that maps package name to a list of tests
-      that are known to be flaky in the lab or not passing on userdebug builds. """
+      that flaky during dev cycle and cause other subsequent tests to fail. """
   return {
-      'android.app' : [
-          'cts.ActivityManagerTest#testIsRunningInTestHarness',],
-      'android.dpi' : [
-          'cts.DefaultManifestAttributesSdkTest#testPackageHasExpectedSdkVersion',],
       'android.hardware' : [
-          'cts.CameraTest#testVideoSnapshot',
-          'cts.CameraGLTest#testCameraToSurfaceTextureMetadata',
-          'cts.CameraGLTest#testSetPreviewTextureBothCallbacks',
-          'cts.CameraGLTest#testSetPreviewTexturePreviewCallback',],
+          'android.hardware.cts.CameraTest#testVideoSnapshot',
+          'android.hardware.cts.CameraGLTest#testCameraToSurfaceTextureMetadata',
+          'android.hardware.cts.CameraGLTest#testSetPreviewTextureBothCallbacks',
+          'android.hardware.cts.CameraGLTest#testSetPreviewTexturePreviewCallback',],
       'android.media' : [
-          'cts.DecoderTest#testCodecResetsH264WithSurface',
-          'cts.StreamingMediaPlayerTest#testHLS',],
+          'android.media.cts.DecoderTest#testCodecResetsH264WithSurface',
+          'android.media.cts.StreamingMediaPlayerTest#testHLS',],
       'android.net' : [
-          'cts.ConnectivityManagerTest#testStartUsingNetworkFeature_enableHipri',
-          'cts.DnsTest#testDnsWorks',
-          'cts.SSLCertificateSocketFactoryTest#testCreateSocket',
-          'cts.SSLCertificateSocketFactoryTest#test_createSocket_bind',
-          'cts.SSLCertificateSocketFactoryTest#test_createSocket_simple',
-          'cts.SSLCertificateSocketFactoryTest#test_createSocket_wrapping',
-          'cts.TrafficStatsTest#testTrafficStatsForLocalhost',
-          'wifi.cts.NsdManagerTest#testAndroidTestCaseSetupProperly',],
-      'android.os' : [
-          'cts.BuildVersionTest#testReleaseVersion',
-          'cts.BuildTest#testIsSecureUserBuild',],
+          'android.net.cts.ConnectivityManagerTest#testStartUsingNetworkFeature_enableHipri',
+          'android.net.cts.DnsTest#testDnsWorks',
+          'android.net.cts.SSLCertificateSocketFactoryTest#testCreateSocket',
+          'android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_bind',
+          'android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_simple',
+          'android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_wrapping',
+          'android.net.cts.TrafficStatsTest#testTrafficStatsForLocalhost',
+          'android.net.wifi.cts.NsdManagerTest#testAndroidTestCaseSetupProperly',],
       'android.security' : [
-          'cts.BannedFilesTest#testNoSu',
-          'cts.BannedFilesTest#testNoSuInPath',
-          'cts.ListeningPortsTest#testNoRemotelyAccessibleListeningUdp6Ports',
-          'cts.ListeningPortsTest#testNoRemotelyAccessibleListeningUdpPorts',
-          'cts.PackageSignatureTest#testPackageSignatures',
-          'cts.SELinuxDomainTest#testSuDomain',
-          'cts.SELinuxHostTest#testAllEnforcing',],
+          'android.security.cts.ListeningPortsTest#testNoRemotelyAccessibleListeningUdp6Ports',
+          'android.security.cts.ListeningPortsTest#testNoRemotelyAccessibleListeningUdpPorts',],
       'android.webkit' : [
-          'cts.WebViewClientTest#testOnUnhandledKeyEvent',],
+          'android.webkit.cts.WebViewClientTest#testOnUnhandledKeyEvent',],
       'com.android.cts.filesystemperf' : [
-          'RandomRWTest#testRandomRead',
-          'RandomRWTest#testRandomUpdate',],
+          'com.android.cts.filesystemperf.RandomRWTest#testRandomRead',
+          'com.android.cts.filesystemperf.RandomRWTest#testRandomUpdate',],
+      '' : []}
+
+def BuildCtsTemporarilyKnownFailureList():
+  """ Construct a defaultdict that maps package name to a list of tests
+      that are known failures during dev cycle but expected to be fixed before launch """
+  return {
+      'android.bluetooth' : [
+          'android.bluetooth.cts.BluetoothLeScanTest#testBasicBleScan',
+          'android.bluetooth.cts.BluetoothLeScanTest#testBatchScan',
+          'android.bluetooth.cts.BluetoothLeScanTest#testOpportunisticScan',
+          'android.bluetooth.cts.BluetoothLeScanTest#testScanFilter',],
       '' : []}
 
 def LogGenerateDescription(name):
diff --git a/tools/utils/cts/tools.py b/tools/utils/cts/tools.py
index 649e4d7..832e1f2 100644
--- a/tools/utils/cts/tools.py
+++ b/tools/utils/cts/tools.py
@@ -134,7 +134,7 @@
     """
     packaged_test_list = []
     for test in test_list:
-      packaged_test_list.append(package + '.' + test)
+      packaged_test_list.append(test)
 
     if package in self.includedTestsMap:
       self.includedTestsMap[package] += packaged_test_list
@@ -152,7 +152,7 @@
     """
     packaged_test_list = []
     for test in test_list:
-      packaged_test_list.append(package + '.' + test)
+      packaged_test_list.append(test)
     if package in self.excludedTestsMap:
       self.excludedTestsMap[package] += packaged_test_list
     else:
diff --git a/tools/vm-tests-tf/Android.mk b/tools/vm-tests-tf/Android.mk
index 88f2a53..b1cbe37 100644
--- a/tools/vm-tests-tf/Android.mk
+++ b/tools/vm-tests-tf/Android.mk
@@ -14,6 +14,28 @@
 
 LOCAL_PATH := $(call my-dir)
 
+# test dex library
+# ============================================================
+include $(CLEAR_VARS)
+
+# custom variables used to generate test description. do not touch!
+LOCAL_SRC_FILES := $(call all-java-files-under, src/dot)
+
+LOCAL_MODULE := cts-tf-dalvik-lib
+LOCAL_MODULE_CLASS := JAVA_LIBRARIES
+LOCAL_MODULE_TAGS := optional
+LOCAL_JAVA_LIBRARIES := junit-targetdex
+
+include $(BUILD_JAVA_LIBRARY)
+
+cts-tf-dalvik-lib.jack := $(full_classes_jack)
+
+private_jill_jarjar_asm := $(addprefix $(HOST_OUT_JAVA_LIBRARIES)/,jill-jarjar-asm.jar)
+$(private_jill_jarjar_asm) : PRIVATE_JARJAR_RULES := $(LOCAL_PATH)/jill-jarjar-rules.txt
+$(private_jill_jarjar_asm) : $(addprefix $(HOST_OUT_JAVA_LIBRARIES)/,jill.jar) | $(JARJAR)
+	@echo JarJar: $@
+	$(hide) java -jar $(JARJAR) process $(PRIVATE_JARJAR_RULES) $< $@
+
 # buildutil java library
 # ============================================================
 include $(CLEAR_VARS)
@@ -29,31 +51,46 @@
 LOCAL_MODULE_TAGS := optional
 
 LOCAL_JAVA_LIBRARIES := dx dasm cfassembler junit
-LOCAL_CLASSPATH := $(HOST_JDK_TOOLS_JAR)
+LOCAL_JAVA_LIBRARIES += jack
+
+LOCAL_CLASSPATH := $(HOST_JDK_TOOLS_JAR) $(private_jill_jarjar_asm)
 
 include $(BUILD_HOST_JAVA_LIBRARY)
 
 # Buid android.core.vm-tests-tf.jar
 # ============================================================
 #
+include $(CLEAR_VARS)
+
+LOCAL_JACK_ENABLED := $(strip $(LOCAL_JACK_ENABLED))
 intermediates := $(call intermediates-dir-for,JAVA_LIBRARIES,vm-tests-tf,HOST)
 vmteststf_jar := $(intermediates)/android.core.vm-tests-tf.jar
 vmteststf_dep_jars := $(addprefix $(HOST_OUT_JAVA_LIBRARIES)/, cts-tf-dalvik-buildutil.jar dasm.jar dx.jar cfassembler.jar junit.jar)
+vmteststf_dep_jars += $(addprefix $(HOST_OUT_JAVA_LIBRARIES)/, jack.jar)
+vmteststf_dep_jars += $(private_jill_jarjar_asm)
+
+$(vmteststf_jar): PRIVATE_JACK_VM_ARGS := $(LOCAL_JACK_VM_ARGS)
+$(vmteststf_jar): PRIVATE_JACK_EXTRA_ARGS := $(LOCAL_JACK_EXTRA_ARGS)
+
+ifdef LOCAL_JACK_ENABLED
+    vmteststf_dep_jars += $(cts-tf-dalvik-lib.jack)
+endif
+
 $(vmteststf_jar): PRIVATE_SRC_FOLDER := $(LOCAL_PATH)/src
-$(vmteststf_jar): PRIVATE_LIB_FOLDER := $(LOCAL_PATH)/lib
 $(vmteststf_jar): PRIVATE_INTERMEDIATES_CLASSES := $(call intermediates-dir-for,JAVA_LIBRARIES,cts-tf-dalvik-buildutil,HOST)/classes
 $(vmteststf_jar): PRIVATE_INTERMEDIATES := $(intermediates)/tests
 $(vmteststf_jar): PRIVATE_INTERMEDIATES_DEXCORE_JAR := $(intermediates)/tests/dot/junit/dexcore.jar
 $(vmteststf_jar): PRIVATE_INTERMEDIATES_MAIN_FILES := $(intermediates)/main_files
 $(vmteststf_jar): PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES := $(intermediates)/hostjunit_files
 $(vmteststf_jar): PRIVATE_CLASS_PATH := $(subst $(space),:,$(vmteststf_dep_jars)):$(HOST_JDK_TOOLS_JAR)
-$(vmteststf_jar) : $(vmteststf_dep_jars) $(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar
+ifndef LOCAL_JACK_ENABLED
+$(vmteststf_jar) : $(vmteststf_dep_jars) $(JACK_JAR) $(JILL_JAR) $(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar
 	$(hide) rm -rf $(dir $@) && mkdir -p $(dir $@)
 	$(hide) mkdir -p $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES)/dot/junit $(dir $(PRIVATE_INTERMEDIATES_DEXCORE_JAR))
 	# generated and compile the host side junit tests
 	@echo "Write generated Main_*.java files to $(PRIVATE_INTERMEDIATES_MAIN_FILES)"
 	$(hide) java -cp $(PRIVATE_CLASS_PATH) util.build.BuildDalvikSuite $(PRIVATE_SRC_FOLDER) $(PRIVATE_INTERMEDIATES) \
-		$(HOST_OUT_JAVA_LIBRARIES)/cts-tf-dalvik-buildutil.jar:$(PRIVATE_LIB_FOLDER)/junit.jar:$(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar \
+		$(HOST_OUT_JAVA_LIBRARIES)/cts-tf-dalvik-buildutil.jar:$(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar \
 		$(PRIVATE_INTERMEDIATES_MAIN_FILES) $(PRIVATE_INTERMEDIATES_CLASSES) $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES) $$RUN_VM_TESTS_RTO
 	@echo "Generate $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)"
 	$(hide) jar -cf $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jar \
@@ -62,6 +99,26 @@
 		$(if $(NO_OPTIMIZE_DX), --no-optimize) $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jar && rm -f $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jar
 	$(hide) cd $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES)/classes && zip -q -r ../../android.core.vm-tests-tf.jar .
 	$(hide) cd $(dir $@) && zip -q -r android.core.vm-tests-tf.jar tests
+else # LOCAL_JACK_ENABLED
+$(vmteststf_jar) : $(vmteststf_dep_jars) $(JACK_JAR) $(JILL_JAR) $(call intermediates-dir-for,JAVA_LIBRARIES,core-libart,,COMMON)/classes.jack $(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar
+	$(hide) rm -rf $(dir $@) && mkdir -p $(dir $@)
+	$(hide) mkdir -p $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES)/dot/junit $(dir $(PRIVATE_INTERMEDIATES_DEXCORE_JAR))
+	# generated and compile the host side junit tests
+	@echo "Write generated Main_*.java files to $(PRIVATE_INTERMEDIATES_MAIN_FILES)"
+	$(hide) java -cp $(PRIVATE_CLASS_PATH) util.build.JackBuildDalvikSuite $(PRIVATE_SRC_FOLDER) $(PRIVATE_INTERMEDIATES) \
+		$(call intermediates-dir-for,JAVA_LIBRARIES,core-libart,,COMMON)/classes.jack:$(cts-tf-dalvik-lib.jack):$(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar \
+		$(PRIVATE_INTERMEDIATES_MAIN_FILES) $(PRIVATE_INTERMEDIATES_CLASSES) $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES) $$RUN_VM_TESTS_RTO
+	@echo "Generate $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)"
+	$(hide) jar -cf $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)-class.jar \
+		$(addprefix -C $(PRIVATE_INTERMEDIATES_CLASSES) , dot/junit/DxUtil.class dot/junit/DxAbstractMain.class)
+	$(hide) $(JILL) --output $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jack $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)-class.jar
+	$(hide) mkdir -p $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).tmp
+	$(hide) $(call call-jack,$(PRIVATE_JACK_VM_ARGS),$(PRIVATE_JACK_EXTRA_ARGS)) --output-dex $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).tmp \
+		$(if $(NO_OPTIMIZE_DX), -D jack.dex.optimize "false") --import $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jack && rm -f $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).jack
+	$(hide) cd $(PRIVATE_INTERMEDIATES_DEXCORE_JAR).tmp && zip -q -r $(abspath $(PRIVATE_INTERMEDIATES_DEXCORE_JAR)) .
+	$(hide) cd $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES)/classes && zip -q -r ../../android.core.vm-tests-tf.jar .
+	$(hide) cd $(dir $@) && zip -q -r android.core.vm-tests-tf.jar tests
+endif # LOCAL_JACK_ENABLED
 
 # Clean up temp vars
 intermediates :=
diff --git a/tools/vm-tests-tf/jill-jarjar-rules.txt b/tools/vm-tests-tf/jill-jarjar-rules.txt
new file mode 100644
index 0000000..ee6f403
--- /dev/null
+++ b/tools/vm-tests-tf/jill-jarjar-rules.txt
@@ -0,0 +1 @@
+rule org.objectweb.** com.android.jill.@0
\ No newline at end of file
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_11.d b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_11.d
index 75fb804..0506be0 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_11.d
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/new_instance/d/T_new_instance_11.d
@@ -28,13 +28,16 @@
 .limit regs 6
 
        const v4, 5
-       move-object v1, v5
-Label0:
-       move-object v0, v1
+       goto LabelEntry
+
+LabelBwd:
+       invoke-virtual {v1}, java/lang/Object/hashCode()I
+
+LabelEntry:
        new-instance v1, java/lang/Integer
-       
+
        add-int/lit8 v4, v4, -1
-       if-nez v4, Label0
+       if-nez v4, LabelBwd
 
        invoke-direct {v1, v4}, java/lang/Integer/<init>(I)V
        return-void
diff --git a/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java b/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java
index 63794df..0e31884 100644
--- a/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java
+++ b/tools/vm-tests-tf/src/util/build/BuildDalvikSuite.java
@@ -78,6 +78,7 @@
 
     private int testClassCnt = 0;
     private int testMethodsCnt = 0;
+    private boolean useJack;
 
     /*
      * using a linked hashmap to keep the insertion order for iterators.
@@ -101,39 +102,47 @@
      */
     public static void main(String[] args) throws IOException {
 
-        if (args.length > 5) {
-            JAVASRC_FOLDER = args[0];
-            OUTPUT_FOLDER = args[1];
-            CLASS_PATH = args[2];
-            MAIN_SRC_OUTPUT_FOLDER = args[3];
-            CLASSES_OUTPUT_FOLDER = MAIN_SRC_OUTPUT_FOLDER + "/classes";
-
-            COMPILED_CLASSES_FOLDER = args[4];
-
-            HOSTJUNIT_SRC_OUTPUT_FOLDER = args[5];
-            HOSTJUNIT_CLASSES_OUTPUT_FOLDER = HOSTJUNIT_SRC_OUTPUT_FOLDER + "/classes";
-
-            if (args.length > 6) {
-                // optional: restrict to e.g. "opcodes.add_double"
-                restrictTo = args[6];
-                System.out.println("restricting build to: " + restrictTo);
-            }
-
-        } else {
-            System.out.println("usage: java-src-folder output-folder classpath " +
-                    "generated-main-files compiled_output generated-main-files " +
-            "[restrict-to-opcode]");
-            System.exit(-1);
-        }
+        parseArgs(args);
 
         long start = System.currentTimeMillis();
-        BuildDalvikSuite cat = new BuildDalvikSuite();
+        BuildDalvikSuite cat = new BuildDalvikSuite(false);
         cat.compose();
         long end = System.currentTimeMillis();
 
         System.out.println("elapsed seconds: " + (end - start) / 1000);
     }
 
+    public static void parseArgs(String[] args) {
+      if (args.length > 5) {
+          JAVASRC_FOLDER = args[0];
+          OUTPUT_FOLDER = args[1];
+          CLASS_PATH = args[2];
+          MAIN_SRC_OUTPUT_FOLDER = args[3];
+          CLASSES_OUTPUT_FOLDER = MAIN_SRC_OUTPUT_FOLDER + "/classes";
+
+          COMPILED_CLASSES_FOLDER = args[4];
+
+          HOSTJUNIT_SRC_OUTPUT_FOLDER = args[5];
+          HOSTJUNIT_CLASSES_OUTPUT_FOLDER = HOSTJUNIT_SRC_OUTPUT_FOLDER + "/classes";
+
+          if (args.length > 6) {
+              // optional: restrict to e.g. "opcodes.add_double"
+              restrictTo = args[6];
+              System.out.println("restricting build to: " + restrictTo);
+          }
+
+      } else {
+          System.out.println("usage: java-src-folder output-folder classpath " +
+                  "generated-main-files compiled_output generated-main-files " +
+          "[restrict-to-opcode]");
+          System.exit(-1);
+      }
+    }
+
+    public BuildDalvikSuite(boolean useJack) {
+      this.useJack = useJack;
+    }
+
     public void compose() throws IOException {
         System.out.println("Collecting all junit tests...");
         new TestRunner() {
@@ -182,19 +191,21 @@
         li.add(method);
     }
     private String curJunitFileName = null;
+    private String curJunitName = null;
     private String curJunitFileData = "";
 
-    private JavacBuildStep javacHostJunitBuildStep;
+    private SourceBuildStep hostJunitBuildStep;
 
     private void flushHostJunitFile() {
         if (curJunitFileName != null) {
             File toWrite = new File(curJunitFileName);
             String absPath = toWrite.getAbsolutePath();
             // add to java source files for later compilation
-            javacHostJunitBuildStep.addSourceFile(absPath);
+            hostJunitBuildStep.addSourceFile(absPath);
             // write file
             curJunitFileData += "\n}\n";
             writeToFileMkdir(toWrite, curJunitFileData);
+
             curJunitFileName = null;
             curJunitFileData = "";
         }
@@ -274,11 +285,11 @@
         String datafileContent = "";
         Set<BuildStep> targets = new TreeSet<BuildStep>();
 
-        javacHostJunitBuildStep = new JavacBuildStep(HOSTJUNIT_CLASSES_OUTPUT_FOLDER, CLASS_PATH);
+        SourceBuildStep srcBuildStep;
+        hostJunitBuildStep = new JavacBuildStep(
+            HOSTJUNIT_CLASSES_OUTPUT_FOLDER, CLASS_PATH);
 
-
-        JavacBuildStep javacBuildStep = new JavacBuildStep(
-                CLASSES_OUTPUT_FOLDER, CLASS_PATH);
+        srcBuildStep = new JavacBuildStep(CLASSES_OUTPUT_FOLDER, CLASS_PATH);
 
         for (Entry<String, List<String>> entry : map.entrySet()) {
 
@@ -341,19 +352,25 @@
                 "    public static void main(String[] args) throws Exception {" +
                 methodContent + "\n}\n";
 
-                String fileName = getFileName(pName, method, ".java");
                 File sourceFile = getFileFromPackage(pName, method);
 
-                File classFile = new File(CLASSES_OUTPUT_FOLDER + "/" +
-                        getFileName(pName, method, ".class"));
-                // if (sourceFile.lastModified() > classFile.lastModified()) {
                 writeToFile(sourceFile, content);
-                javacBuildStep.addSourceFile(sourceFile.getAbsolutePath());
+                if (useJack) {
+                    File jackFile = new File(CLASSES_OUTPUT_FOLDER + "/" +
+                            getFileName(pName, method, ".jack"));
+                    JackBuildStep step = new JackBuildStep(jackFile.getAbsolutePath(), CLASS_PATH);
+                    step.addSourceFile(sourceFile.getAbsolutePath());
+                    if (!step.build()) {
+                        System.out.println("main src dalvik-cts-buildutil build step failed");
+                        System.exit(1);
+                    }
+                } else {
+                    srcBuildStep.addSourceFile(sourceFile.getAbsolutePath());
+                }
 
                 BuildStep dexBuildStep = generateDexBuildStep(
-                        CLASSES_OUTPUT_FOLDER, getFileName(pName, method, ""));
+                        CLASSES_OUTPUT_FOLDER, getFileName(pName, method, ""), null);
                 targets.add(dexBuildStep);
-                // }
 
 
                 // prepare the entry in the data file for the bash script.
@@ -449,22 +466,23 @@
         scriptDataDir.mkdirs();
         writeToFile(new File(scriptDataDir, "scriptdata"), datafileContent);
 
-        if (!javacHostJunitBuildStep.build()) {
+        if (!hostJunitBuildStep.build()) {
             System.out.println("main javac cts-host-hostjunit-classes build step failed");
             System.exit(1);
         }
 
-        if (javacBuildStep.build()) {
-            for (BuildStep buildStep : targets) {
-                if (!buildStep.build()) {
-                    System.out.println("building failed. buildStep: " +
-                            buildStep.getClass().getName() + ", " + buildStep);
-                    System.exit(1);
-                }
+        if (!useJack) {
+            if (!srcBuildStep.build()) {
+                System.out.println("main src dalvik-cts-buildutil build step failed");
+                System.exit(1);
             }
-        } else {
-            System.out.println("main javac dalvik-cts-buildutil build step failed");
-            System.exit(1);
+        }
+        for (BuildStep buildStep : targets) {
+            if (!buildStep.build()) {
+                System.out.println("building failed. buildStep: " +
+                        buildStep.getClass().getName() + ", " + buildStep);
+                System.exit(1);
+            }
         }
     }
 
@@ -521,19 +539,37 @@
             return;
         }
 
-        if (new File(sourceFolder, fileName + ".java").exists()) {
-
+        File srcFile = new File(sourceFolder, fileName + ".java");
+        if (srcFile.exists()) {
+            JackBuildStep jackBuildStep = null;
+            if (useJack) {
+                jackBuildStep = new JackBuildStep(
+                        COMPILED_CLASSES_FOLDER + File.separator + fileName + ".jack",
+                        CLASS_PATH);
+                jackBuildStep.addSourceFile(srcFile.getAbsolutePath());
+            }
             BuildStep dexBuildStep = generateDexBuildStep(
-                    COMPILED_CLASSES_FOLDER, fileName);
+                COMPILED_CLASSES_FOLDER, fileName, jackBuildStep);
             targets.add(dexBuildStep);
             return;
         }
 
         try {
             if (Class.forName(dependentTestClassName) != null) {
+                JillBuildStep jillBuildStep = null;
+                if (useJack) {
+                    BuildStep.BuildFile classFile = new BuildStep.BuildFile(
+                        COMPILED_CLASSES_FOLDER, fileName + ".class");
 
+                    BuildStep.BuildFile jackFile = new BuildStep.BuildFile(
+                        COMPILED_CLASSES_FOLDER,
+                        fileName + ".jack");
+
+                    jillBuildStep = new JillBuildStep(classFile,
+                        jackFile);
+                }
                 BuildStep dexBuildStep = generateDexBuildStep(
-                        COMPILED_CLASSES_FOLDER, fileName);
+                    COMPILED_CLASSES_FOLDER, fileName, jillBuildStep);
                 targets.add(dexBuildStep);
                 return;
             }
@@ -546,24 +582,50 @@
     }
 
     private BuildStep generateDexBuildStep(String classFileFolder,
-            String classFileName) {
-        BuildStep.BuildFile classFile = new BuildStep.BuildFile(
-                classFileFolder, classFileName + ".class");
+            String classFileName, BuildStep dependency) {
+        if (!useJack) {
+            BuildStep.BuildFile classFile = new BuildStep.BuildFile(
+                    classFileFolder, classFileName + ".class");
 
-        BuildStep.BuildFile tmpJarFile = new BuildStep.BuildFile(OUTPUT_FOLDER,
-                classFileName + "_tmp.jar");
+            BuildStep.BuildFile tmpJarFile = new BuildStep.BuildFile(
+                    OUTPUT_FOLDER,
+                    classFileName + "_tmp.jar");
 
-        JarBuildStep jarBuildStep = new JarBuildStep(classFile, classFileName +
-                ".class", tmpJarFile, false);
+            JarBuildStep jarBuildStep = new JarBuildStep(classFile,
+                    classFileName + ".class", tmpJarFile, false);
 
-        BuildStep.BuildFile outputFile = new BuildStep.BuildFile(OUTPUT_FOLDER,
-                classFileName + ".jar");
+            if (dependency != null) {
+                jarBuildStep.addChild(dependency);
+            }
 
-        DexBuildStep dexBuildStep = new DexBuildStep(tmpJarFile, outputFile,
-                true);
+            BuildStep.BuildFile outputFile = new BuildStep.BuildFile(
+                    OUTPUT_FOLDER,
+                    classFileName + ".jar");
 
-        dexBuildStep.addChild(jarBuildStep);
-        return dexBuildStep;
+            DxBuildStep dexBuildStep = new DxBuildStep(tmpJarFile,
+                    outputFile,
+                    true);
+
+            dexBuildStep.addChild(jarBuildStep);
+            return dexBuildStep;
+        } else {
+          BuildStep.BuildFile jackFile = new BuildStep.BuildFile(
+              classFileFolder, classFileName + ".jack");
+
+          BuildStep.BuildFile outputFile = new BuildStep.BuildFile(
+                  OUTPUT_FOLDER,
+                  classFileName + ".jar");
+
+          JackDexBuildStep dexBuildStep = new JackDexBuildStep(jackFile,
+                  outputFile,
+                  true);
+
+          if (dependency != null) {
+              dexBuildStep.addChild(dependency);
+          }
+          return dexBuildStep;
+
+        }
 
     }
 
@@ -754,7 +816,7 @@
 
     private void writeToFile(File file, String content) {
         try {
-            if (file.length() == content.length()) {
+            if (file.exists() && file.length() == content.length()) {
                 FileReader reader = new FileReader(file);
                 char[] charContents = new char[(int) file.length()];
                 reader.read(charContents);
diff --git a/tools/vm-tests-tf/src/util/build/DexBuildStep.java b/tools/vm-tests-tf/src/util/build/DexBuildStep.java
deleted file mode 100644
index 6aba51c..0000000
--- a/tools/vm-tests-tf/src/util/build/DexBuildStep.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2008 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 util.build;
-
-import com.android.dx.command.dexer.Main;
-import java.io.IOException;
-
-public class DexBuildStep extends BuildStep {
-
-    private final boolean deleteInputFileAfterBuild;
-
-    DexBuildStep(BuildFile inputFile, BuildFile outputFile,
-            boolean deleteInputFileAfterBuild) {
-        super(inputFile, outputFile);
-        this.deleteInputFileAfterBuild = deleteInputFileAfterBuild;
-    }
-
-    @Override
-    boolean build() {
-
-        if (super.build()) {
-            Main.Arguments args = new Main.Arguments();
-
-            args.jarOutput = true;
-            args.fileNames = new String[] {inputFile.fileName.getAbsolutePath()};
-
-            args.outName = outputFile.fileName.getAbsolutePath();
-
-            int result = 0;
-            try {
-                result = Main.run(args);
-            } catch (IOException e) {
-                e.printStackTrace();
-                return false;
-            }
-
-            if (result == 0) {
-                if (deleteInputFileAfterBuild) {
-                    inputFile.fileName.delete();
-                }
-                return true;
-            } else {
-                System.err.println("exception while dexing "
-                        + inputFile.fileName.getAbsolutePath() + " to "
-                        + args.outName);
-                return false;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return inputFile.hashCode() ^ outputFile.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (super.equals(obj)) {
-            DexBuildStep other = (DexBuildStep) obj;
-
-            return inputFile.equals(other.inputFile)
-                    && outputFile.equals(other.outputFile);
-        }
-        return false;
-    }
-
-
-}
diff --git a/tools/vm-tests-tf/src/util/build/DxBuildStep.java b/tools/vm-tests-tf/src/util/build/DxBuildStep.java
new file mode 100644
index 0000000..6e347b2
--- /dev/null
+++ b/tools/vm-tests-tf/src/util/build/DxBuildStep.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2008 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 util.build;
+
+import com.android.dx.command.dexer.Main;
+import java.io.IOException;
+
+public class DxBuildStep extends BuildStep {
+
+    private final boolean deleteInputFileAfterBuild;
+
+    DxBuildStep(BuildFile inputFile, BuildFile outputFile,
+            boolean deleteInputFileAfterBuild) {
+        super(inputFile, outputFile);
+        this.deleteInputFileAfterBuild = deleteInputFileAfterBuild;
+    }
+
+    @Override
+    boolean build() {
+
+        if (super.build()) {
+            Main.Arguments args = new Main.Arguments();
+
+            args.jarOutput = true;
+            args.fileNames = new String[] {inputFile.fileName.getAbsolutePath()};
+
+            args.outName = outputFile.fileName.getAbsolutePath();
+
+            int result = 0;
+            try {
+                result = Main.run(args);
+            } catch (IOException e) {
+                e.printStackTrace();
+                return false;
+            }
+
+            if (result == 0) {
+                if (deleteInputFileAfterBuild) {
+                    inputFile.fileName.delete();
+                }
+                return true;
+            } else {
+                System.err.println("exception while dexing "
+                        + inputFile.fileName.getAbsolutePath() + " to "
+                        + args.outName);
+                return false;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return inputFile.hashCode() ^ outputFile.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (super.equals(obj)) {
+            DxBuildStep other = (DxBuildStep) obj;
+
+            return inputFile.equals(other.inputFile)
+                    && outputFile.equals(other.outputFile);
+        }
+        return false;
+    }
+
+
+}
diff --git a/tools/vm-tests-tf/src/util/build/JackBuildDalvikSuite.java b/tools/vm-tests-tf/src/util/build/JackBuildDalvikSuite.java
new file mode 100644
index 0000000..a508e5b
--- /dev/null
+++ b/tools/vm-tests-tf/src/util/build/JackBuildDalvikSuite.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2014 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 util.build;
+
+import java.io.IOException;
+
+public class JackBuildDalvikSuite {
+
+    public static void main(String[] args) throws IOException {
+
+        BuildDalvikSuite.parseArgs(args);
+
+        long start = System.currentTimeMillis();
+        BuildDalvikSuite cat = new BuildDalvikSuite(true);
+        cat.compose();
+        long end = System.currentTimeMillis();
+
+        System.out.println("elapsed seconds: " + (end - start) / 1000);
+    }
+}
diff --git a/tools/vm-tests-tf/src/util/build/JackBuildStep.java b/tools/vm-tests-tf/src/util/build/JackBuildStep.java
new file mode 100644
index 0000000..1e1ede6
--- /dev/null
+++ b/tools/vm-tests-tf/src/util/build/JackBuildStep.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2013 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 util.build;
+
+import com.android.jack.Jack;
+import com.android.jack.Main;
+import com.android.jack.Options;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class JackBuildStep extends SourceBuildStep {
+
+    private final String destPath;
+    private final String classPath;
+    private final Set<String> sourceFiles = new HashSet<String>();
+
+    public JackBuildStep(String destPath, String classPath) {
+        this.destPath = destPath;
+        this.classPath = classPath;
+    }
+
+    @Override
+    public void addSourceFile(String sourceFile) {
+        sourceFiles.add(sourceFile);
+    }
+
+    @Override
+    boolean build() {
+        if (super.build()) {
+            if (sourceFiles.isEmpty()) {
+                return true;
+            }
+
+            File outDir = new File(destPath).getParentFile();
+            if (!outDir.exists() && !outDir.mkdirs()) {
+                System.err.println("failed to create output dir: "
+                        + outDir.getAbsolutePath());
+                return false;
+            }
+            List<String> commandLine = new ArrayList(4 + sourceFiles.size());
+            commandLine.add("--verbose");
+            commandLine.add("error");
+            commandLine.add("--classpath");
+            commandLine.add(classPath);
+            commandLine.add("--output-jack");
+            commandLine.add(destPath);
+            commandLine.addAll(sourceFiles);
+
+            try {
+                Options options = Main.parseCommandLine(commandLine);
+                Jack.checkAndRun(options);
+            } catch (Throwable ex) {
+                ex.printStackTrace();
+                return false;
+            }
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (super.equals(obj)) {
+            JackBuildStep other = (JackBuildStep) obj;
+            return destPath.equals(other.destPath) && classPath.equals(other.classPath)
+                    && sourceFiles.equals(other.sourceFiles);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return destPath.hashCode() ^ classPath.hashCode() ^ sourceFiles.hashCode();
+    }
+}
diff --git a/tools/vm-tests-tf/src/util/build/JackDexBuildStep.java b/tools/vm-tests-tf/src/util/build/JackDexBuildStep.java
new file mode 100644
index 0000000..304eaa0
--- /dev/null
+++ b/tools/vm-tests-tf/src/util/build/JackDexBuildStep.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2008 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 util.build;
+
+import com.android.jack.Jack;
+import com.android.jack.Main;
+import com.android.jack.Options;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+public class JackDexBuildStep extends BuildStep {
+
+    private final boolean deleteInputFileAfterBuild;
+
+    JackDexBuildStep(BuildFile inputFile, BuildFile outputFile,
+            boolean deleteInputFileAfterBuild) {
+        super(inputFile, outputFile);
+        this.deleteInputFileAfterBuild = deleteInputFileAfterBuild;
+    }
+
+    @Override
+    boolean build() {
+
+        if (super.build()) {
+            String outputFilePath = outputFile.fileName.getAbsolutePath();
+            if (outputFilePath.endsWith(".dex")) {
+              throw new AssertionError(
+                  "DexBuildStep does not support dex output outside of an archive");
+            }
+
+            File outDir = outputFile.fileName.getParentFile();
+            if (!outDir.exists() && !outDir.mkdirs()) {
+                System.err.println("failed to create output dir: "
+                        + outDir.getAbsolutePath());
+                return false;
+            }
+
+            List<String> commandLine = new ArrayList<String>(4);
+            commandLine.add("--verbose");
+            commandLine.add("error");
+            commandLine.add("--output-dex-zip");
+            commandLine.add(outputFilePath);
+            commandLine.add("--import");
+            commandLine.add(inputFile.fileName.getAbsolutePath());
+
+            try {
+               Options options = Main.parseCommandLine(commandLine);
+               Jack.checkAndRun(options);
+                if (deleteInputFileAfterBuild) {
+                    inputFile.fileName.delete();
+                }
+                return true;
+            } catch (Throwable ex) {
+                System.err.println("exception while dexing "
+                        + inputFile.fileName.getAbsolutePath() + " to "
+                        + outputFile.fileName.getAbsolutePath());
+                ex.printStackTrace();
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return inputFile.hashCode() ^ outputFile.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (super.equals(obj)) {
+            JackDexBuildStep other = (JackDexBuildStep) obj;
+
+            return inputFile.equals(other.inputFile)
+                    && outputFile.equals(other.outputFile);
+        }
+        return false;
+    }
+
+
+}
diff --git a/tools/vm-tests-tf/src/util/build/JavacBuildStep.java b/tools/vm-tests-tf/src/util/build/JavacBuildStep.java
index 7d7033f..d08a2c6 100644
--- a/tools/vm-tests-tf/src/util/build/JavacBuildStep.java
+++ b/tools/vm-tests-tf/src/util/build/JavacBuildStep.java
@@ -23,7 +23,7 @@
 import java.util.HashSet;
 import java.util.Set;
 
-public class JavacBuildStep extends BuildStep {
+public class JavacBuildStep extends SourceBuildStep {
 
     private final String destPath;
     private final String classPath;
@@ -32,12 +32,13 @@
         this.destPath = destPath;
         this.classPath = classPath;
     }
-    
+
+    @Override
     public void addSourceFile(String sourceFile)
     {
         sourceFiles.add(sourceFile);
     }
-    
+
     @Override
     boolean build() {
         if (super.build())
@@ -46,7 +47,7 @@
             {
                 return true;
             }
-            
+
             File destFile = new File(destPath);
             if (!destFile.exists() && !destFile.mkdirs())
             {
@@ -59,13 +60,12 @@
             commandLine[1] = classPath;
             commandLine[2] = "-d";
             commandLine[3] = destPath;
-             
+
             String[] files = new String[sourceFiles.size()];
             sourceFiles.toArray(files);
-            
+
             System.arraycopy(files, 0, commandLine, args, files.length);
-            
-            
+
             return Main.compile(commandLine, new PrintWriter(System.err)) == 0;
         }
         return false;
@@ -73,17 +73,16 @@
 
     @Override
     public boolean equals(Object obj) {
-        // TODO Auto-generated method stub
         if (super.equals(obj))
         {
             JavacBuildStep other = (JavacBuildStep) obj;
-            return destPath.equals(other.destPath) 
+            return destPath.equals(other.destPath)
                 && classPath.equals(other.classPath)
                 && sourceFiles.equals(other.sourceFiles);
         }
         return false;
     }
-    
+
     @Override
     public int hashCode() {
         return destPath.hashCode() ^ classPath.hashCode() ^ sourceFiles.hashCode();
diff --git a/tools/vm-tests-tf/src/util/build/JillBuildStep.java b/tools/vm-tests-tf/src/util/build/JillBuildStep.java
new file mode 100644
index 0000000..d2e435e
--- /dev/null
+++ b/tools/vm-tests-tf/src/util/build/JillBuildStep.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2013 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 util.build;
+
+import com.android.jill.Jill;
+import com.android.jill.Main;
+import com.android.jill.Options;
+
+import java.io.File;
+
+public class JillBuildStep extends BuildStep {
+
+    JillBuildStep(BuildFile inputFile, BuildFile outputFile) {
+        super(inputFile, outputFile);
+    }
+
+    @Override
+    boolean build() {
+        if (super.build()) {
+
+            File outDir = outputFile.fileName.getParentFile();
+            if (!outDir.exists() && !outDir.mkdirs()) {
+                System.err.println("failed to create output dir: "
+                        + outDir.getAbsolutePath());
+                return false;
+            }
+
+            int args = 3;
+            String[] commandLine = new String[args];
+            commandLine[0] = "--output";
+            commandLine[1] = outputFile.fileName.getAbsolutePath();
+            commandLine[2] = inputFile.fileName.getAbsolutePath();
+
+            try {
+                Options options = Main.getOptions(commandLine);
+                Jill.process(options);
+            } catch (Throwable ex) {
+                ex.printStackTrace();
+                return false;
+            }
+
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (super.equals(obj)) {
+            JillBuildStep other = (JillBuildStep) obj;
+
+            return inputFile.equals(other.inputFile) && outputFile.equals(other.outputFile);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return inputFile.hashCode() ^ outputFile.hashCode();
+    }
+}
diff --git a/tools/vm-tests-tf/src/util/build/SourceBuildStep.java b/tools/vm-tests-tf/src/util/build/SourceBuildStep.java
new file mode 100644
index 0000000..4a68a05
--- /dev/null
+++ b/tools/vm-tests-tf/src/util/build/SourceBuildStep.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 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 util.build;
+
+public abstract class SourceBuildStep extends BuildStep {
+
+  public abstract void addSourceFile(String sourceFile);
+
+}